freefem++-3.38-1/000755 000767 000024 00000000000 12544247071 013612 5ustar00hechtstaff000000 000000 freefem++-3.38-1/0ldUserReadMe.txt000644 000767 000024 00000003103 12167254041 016740 0ustar00hechtstaff000000 000000 /////////////////////////////// New 3D features of freefem++ /////////////////////////////// Version 3.0 is the first version capable of 3D computations. The price to pay is more difficult mesh generations and difficulties to display the results. More details can be found in the documentation 1. Mesh generation ============== There is an interface with the mesh generator tetgen (http://tetgen.berlios.de/) see: examples++-3d/Poisson3d.edp ( mesh of a sphere) There is a small 3D mesh generator for cylindrical meshes by extrusion of a 2D mesh see example: examples++-3d/Lac.edp for a mesh of a lac examples++-3d/Stokes.edp for a mesh a cube. There is a mesh reader from files in format .mesh of medit (http://www.ann.jussieu.fr/~frey/software.html) see example: examples++-3d/dodecaedre01.mesh 2. Graphics ======== 2D Graphics ------------- The standard graphic windows now use a client/server architecture based on openGL GLUT, so the commands have changed: - to go to the next graphic type "enter key" - to close the graphic window type escape - to find out about other commands type the ? key Warning: you must have "ffglut" in your path; this is done for you by the install program on windows system if you do not uncheck the click box. 3D Graphics ------------- Real 3D graphics can be obtained with medit, built in freefem andit can be launched independently of freefem by the command shell "ffmedit". Freefem can also launch medit by the keywork medit. Two calls to medit will launch two instances of medit. To close these windows use escape.freefem++-3.38-1/aclocal.m4000644 000767 000024 00000126516 12543260335 015462 0ustar00hechtstaff000000 000000 # generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Copyright (C) 1998-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_LEX # ----------- # Autoconf leaves LEX=: if lex or flex can't be found. Change that to a # "missing" invocation, for better error output. AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR freefem++-3.38-1/acmacros.m4000644 000767 000024 00000001571 12464626703 015654 0ustar00hechtstaff000000 000000 # Checks whether a compiler accepts a given flag # ---------------------------------------------- # $1 = compiler name # $2 = flag # $3 = make macro containing flags for that compiler # $4 = exec is true .. # Note: changes AC_LANG() AC_DEFUN([CHECK_COMPILE_FLAG], [AC_MSG_CHECKING(whether the $1 compiler accepts $2) check_save_flags="$$3" AC_LANG_PUSH($1) $3="$$3 $2" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. AC_LINK_IFELSE([ifelse($1,Fortran 77, [ program x end], [AC_LANG_PROGRAM])], check_flag_ok=yes, check_flag_ok=no) AC_MSG_RESULT($check_flag_ok) if test "$check_flag_ok" = no; then $3="$check_save_flags" fi if test -n "$4" ; then $4="$check_flag_ok" fi AC_LANG_POP($1) ]) freefem++-3.38-1/acmpi.m4000666 000767 000024 00000026455 12500366033 015155 0ustar00hechtstaff000000 000000 # Checking wether we can produce a parallel version # ------------------------------------------------- dnl m4_include(ax_mpi.m4) ff_save_path="$PATH" # We need to choose between mpich, openmpi and lam for the Debian package AC_ARG_WITH(mpipath,[ --with-mpipath= the path of mpich under windows (no command mpic++, ... )]) AC_ARG_WITH(mpilibs,[ --with-mpilibs= the libs to add to c++,fc, ... (to link with c++ - ex: -L/usr/local/lib -lmpi_f90 -lmpi_cxx -lmpi -lopen-rte -lopen-pal -lutil) ]) AC_ARG_WITH(mpilibsc,[ --with-mpilibsc= the libs to add to c ... (to link with cc (for pastix lib) ex: -L/usr/local/lib -lmpi -lopen-rte -lopen-pal -lutil) ]) AC_ARG_WITH(mpiinc,[ --with-mpiinc= the include directory directive and preprocess directive (no mpicc++, just use the compiler)) ]) AC_ARG_WITH(mpi,[ --with-mpi=[yes|no|mpic++|lam|mpich|openmpi|/usr/local/bin/mpic++|... ] or --without-mpi Choose MPI implementation (default is mpic++)]) if test "$with_mpi" != no ; then #if test "$with_mpi" != no ; then #AX_MPI(with_mpi=yes, with_mpi=no) #fi # Default is mpic++ ff_mpi_suffix=""; if test "$with_mpi" = yes -o -z "$with_mpi" then ff_mpicxx=mpic++ else case "$with_mpi" in lam|mpich|openmpi) ff_mpi_suffix=.$with_mpi;ff_mpicxx=mpic++.$with_mpi;; *) ff_mpicxx="$with_mpi" ;; esac fi dnl AC_MSG_NOTICE([ xxxxxxxxxxxxxxxxxxxx --$with_mpilibs--]); if test -n "$with_mpiinc" -a "$with_mpiinc" != no ; then if test "$with_mpi" = 'no' ; then with_mpi='yes'; fi ff_MPI_INCLUDE="$with_mpiinc" fi if test -n "$with_mpilibs" -a "$with_mpilibs" != no ; then ff_MPI_LIB="$with_mpilibs" ff_MPI_LIBC="$with_mpilibs" ff_MPI_LIBFC="$with_mpilibs" MPICXX="$CXX $ff_MPI_INCLUDE" MPIF77="$F77 $ff_MPI_INCLUDE" MPIFC="$FC $ff_MPI_INCLUDE" MPICC="$CC $ff_MPI_INCLUDE" AC_MSG_NOTICE([ --- set all MPI compile to compiler: $MPICC , $MPIF77, $MPIFC, $MPICC ]) fi if test -n "$with_mpilibsc" -a "$with_mpilibsc" != no ; then ff_MPI_LIBC="$with_mpilibsc" fi AC_ARG_VAR(MPIRUN,[MPI run command ]) AC_MSG_CHECKING(for MPIRUN) if test -z "$MPIRUN" ; then AC_PATH_PROGS(MPIRUN,mpirun mpiexec mpiexec.exe,no) if test "$MPIRUN" = no then ff_mpi=no fi fi AC_MSG_RESULT($MPIRUN) AC_MSG_CHECKING(for mpipath ) if test "$with_mpi" != no -a ! -d "$with_mpipath" -a "$MPIRUN" != no ; then # if "$MPIRUN" != no ; tehn with_mpipath=`AS_DIRNAME(["$MPIRUN"])` with_mpipath=`AS_DIRNAME(["$with_mpipath"])` # echo " ***** with_mpipath $with_mpipath \n" # else # for i in '/c/Program Files (x86)/MPICH2' '/c/Program Files/MPICH2' 'c:\Program Files (x86)\MPICH2' 'c:\Program Files\MPICH2' ; do # test -d "$i" && with_mpipath="$i" && break # done # fi fi #echo "**** with_mpipath '$with_mpipath' $MPIRUN *****" dnl if test "$with_mpilibs" != "no" ; then dnl fi case "$MPIRUN" in */sgi/mpt/*) ff_MPI_INCLUDE_DIR= ff_MPI_LIB_DIR= test -f "$with_mpipath/include/mpif.h" && ff_MPI_INCLUDE_DIR="$with_mpipath/include" test -f "$with_mpipath/lib/libmpi.so" && ff_MPI_LIB_DIR="$with_mpipath/lib" if test -n "$ff_MPI_INCLUDE_DIR" -a -n "$ff_MPI_LIB_DIR" ; then ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' " with_mpiinc="$ff_MPI_INCLUDE" ff_MPI_LIBC="-L'$ff_MPI_LIB_DIR' -lmpi" ff_MPI_LIB="-L'$ff_MPI_LIB_DIR' -lmpi++ -lmpi" ff_MPI_LIBFC="-L'$ff_MPI_LIB_DIR' -lmpi" ff_mpitype=sgi test -z "$MPICXX" && MPICXX="$CXX $ff_MPI_INCLUDE" test -z "$MPIF77" && MPIF77="$F77 $ff_MPI_INCLUDE" test -z "$MPIFC" && MPIFC="$FC $ff_MPI_INCLUDE" test -z "$MPICC" && MPICC="$CC $ff_MPI_INCLUDE" # echo " *** MPI sgi ..... " fi ;; esac if test -d "$with_mpipath" -a "$ff_win32" = yes ; then # sed -e "s?@MPIDIR@?$with_mpipath?" -e "s?@F77@?$F77?" -e "s?@CC@?$CC?" -e "s?@CXX@?$CXX?" -e "s?@FC@?$FC?" mpic++ # chmod a+rx mpic++ # for i in mpicc mpif90 mpifc mpif77 ; do cp mpic++ $i; done # ff_pwd=`pwd` # with_mpi="$ff_pwd"/mpic++ # MPICXX="$ff_pwd/mpic++" # MPIF77="$ff_pwd/mpif77" # MPIFC="$ff_pwd/mpif90" # MPICC="$ff_pwd/mpicc" zzzzzzzzzzz if with_mpilibs=`which msmpi.dll` then case "$ff_size_ptr" in 4) with_mpipathlib="$with_mpipath/Lib/i386";; 8) with_mpipathlib="$with_mpipath/Lib/amd64";; *) with_mpipath=no;; esac test -d "$with_mpipath/Inc" && ff_MPI_INCLUDE_DIR="$with_mpipath/Inc" test -d "$with_mpipath/Include" && ff_MPI_INCLUDE_DIR="$with_mpipath/Include" # Remove for scotch and parmetis # ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' '-D_MSC_VER' '-D__int64=long long'" ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' '-D__int64=long long'" with_mpiinc="$ff_MPI_INCLUDE" test -z "$MPIRUN" && MPIRUN="$with_mpipath/bin/mpiexe.exe" ff_MPI_LIBC="$with_mpilibs" ff_MPI_LIB="$with_mpilibs" ff_MPI_LIBFC="$with_mpilibs" test -z "$MPICXX" && MPICXX="$CXX $ff_MPI_INCLUDE" test -z "$MPIF77" && MPIF77="$F77 $ff_MPI_INCLUDE" test -z "$MPIFC" && MPIFC="$FC $ff_MPI_INCLUDE" test -z "$MPICC" && MPICC="$CC $ff_MPI_INCLUDE" else echo " #### no msmpi.dll => no mpi under windows .... (FH) " >&AS_MESSAGE_LOG_FD echo " #### no msmpi.dll => no mpi under windows .... (FH) " >&AS_MESSAGE_FD with_mpipath=no with_mpi=no fi else with_mpipath=no fi AC_MSG_RESULT($ff_mpi_path) dnl correct ff_mpi_path august 2010 -- FH ... ff_save_cxx="$CXX" ff_save_libs="$LIBS" if test "$with_mpi" != no then ff_mpi_path=`AS_DIRNAME(["$MPIRUN"])` dnl echo "ff_mpi_path '$ff_mpi_path' .............." case "$ff_mpi_path" in .|"") ff_mpi_path="$PATH";ff_defmpicxx="$ff_mpicxx";; *) ff_mpi_path="$ff_mpi_path";ff_defmpicxx=`expr "//$ff_mpicxx" : '.*/\(.*\)'`;; dnl if also add $PATH they could be missing some different mpi version... esac AC_ARG_VAR(MPICXX,[MPI C++ compiler command]) if test -z "$MPICXX" ; then AC_PATH_PROGS(MPICXX,$ff_defmpicxx mpic++$ff_mpi_suffix mpicxx$ff_mpi_suffix mpiCC$ff_mpi_suffix mpCC hcp mpxlC mpxlC_r cmpic++,no,$ff_mpi_path) AC_MSG_CHECKING(for MPICXX) fi ff_mpicxx="eval $MPICXX" CXX=$ff_mpicxx LIBS="$LIBS $ff_MPI_LIB" test -z "$ff_mpi" && ff_mpi=yes AC_LINK_IFELSE( [AC_LANG_SOURCE([ #include #include int main(int argc,char **argv){ char name[[BUFSIZ]]; int length; MPI_Init(&argc, &argv); MPI_Get_processor_name(name, &length); printf("%s: hello world\n", name); MPI_Finalize(); return 0; }])],ff_mpi=yes,ff_mpi=no) AC_MSG_RESULT($ff_mpi) # Also check that mpirun is there. If it isn't, then MPI is # not fully installed. if test "$ff_mpi" = yes; then AC_MSG_CHECKING( MPI_DOUBLE_COMPLEX) AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ #include MPI_Datatype xxxx=MPI_DOUBLE_COMPLEX; ])], ff_mpi_double_complex=yes, ff_mpi_double_complex=no) AC_MSG_RESULT($ff_mpi_double_complex) if test "$ff_mpi_double_complex" = yes ; then AC_DEFINE(HAVE_MPI_DOUBLE_COMPLEX,1, mpi_double_complex) fi echo "MPI CC $ff_mpi" >config_LIB_INFO # We do not AC_DEFINE any special flag for parallel # computation here, because it must only be set when the # parallel program is compiled (see src/mpi/Makfile.am) ff_mpiprog="FreeFem++-mpi${EXEEXT}" AC_SUBST(MPIPROG,"$ff_mpiprog") AC_SUBST(MPISCRIPT,"ff-mpirun") AC_SUBST(MPIRUN,$MPIRUN) AC_SUBST(MPICXX,$MPICXX) else AC_SUBST(MPICXX,$ff_save_cxx) fi if test "$ff_mpi" = yes; then if test "$enable_fortran" != no then AC_ARG_VAR(MPIF77,[MPI Fortran 77 compiler command]) if test -z "$MPIF77" ; then AC_PATH_PROGS(MPIF77, mpif90$ff_mpi_suffix mpif77$ff_mpi_suffix hf77 mpxlf mpf77 mpif90 mpf90 mpxlf90 mpxlf95 mpxlf_r cmpifc cmpif90c, "",$ff_mpi_path) fi AC_SUBST(MPIF77) AC_ARG_VAR(MPIFC,[MPI Fortran 90 compiler command]) if test -z "$MPIFC" ; then AC_PATH_PROGS(MPIFC, mpif90$ff_mpi_suffix mpxlf95_r mpxlf90_r mpxlf95 mpxlf90 mpf90 cmpif90c, "",$ff_mpi_path) fi AC_SUBST(MPIFC) fi echo " ********************ffmpi= '$ff_mpi' ************* " ff_MPI_INCLUDE="$with_mpiinc" if test -z "$ff_mpitype" ; then ff_mpishow=`$MPICXX -show` 2>/dev/null ff_mpicshow=`$MPICC -show` 2>/dev/null ff_mpifcshow=`$MPIFC -show` 2>/dev/null if test "$with_mpilibs" = no -o -z "$with_mpilibs" ; then [ff_MPI_INCLUDE=`echo $ff_mpishow|tr ' ' '\n'| grep -E '^-[^WLlOgp]|^-Wp,'|tr '\n' ' '`] ff_MPI_LIB_DIRS="" [ff_MPI_LIB=`echo $ff_mpishow|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|tr '\n' ' '`] [ff_MPI_LIBC=`echo $ff_mpicshow|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|tr '\n' ' '`] [ff_MPI_LIBFC=`echo $ff_mpifcshow|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|grep -v 'commons,use_dylibs' |tr '\n' ' '`] [ff_mpi_idir=`echo $ff_mpishow|tr ' ' '\n'| grep -E '^-I'|sed s/^-I//|tr '\n' ' '`' /usr/include'] fi [ff_mpi_idir=`echo $ff_MPI_INCLUDE|tr ' ' '\n'| grep -E '^-I'|sed s/^-I//|tr '\n' ' '`' /usr/include'] [ff_mpi_ldir=`echo $ff_MPI_LIB|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|sed -e 's/^-[Llp]//' -e 's/^-Wl,]//' |tr '\n' ' '`' /usr/lib'] if test -z "$ff_MPI_INCLUDE_DIR" ; then for i in $ff_mpi_idir; do if test -f "$i/mpi.h" -a -z "$ff_MPI_INCLUDE_DIR" ;then ff_MPI_INCLUDE_DIR=$i fi done fi for i in $ff_mpi_ldir; do ff_tmp=`ls $i/libmpi.*|head -1` if test -f "$ff_tmp" -a -z "$ff_MPI_LIB_DIRS" ;then ff_MPI_LIB_DIRS=$i fi done fi AC_SUBST(MPICXX,$MPICXX) AC_ARG_VAR(MPICC,[MPI C compiler command in $ff_mpi_path]) if test -z "$MPICC" ; then AC_PATH_PROGS(MPICC,mpicc$ff_mpi_suffix hcc mpcc mpcc_r mpxlc cmpicc, "",$ff_mpi_path) fi AC_SUBST(MPICC,$MPICC) AC_SUBST(PASTIX_HOSTARCH,$ff_HOSTARCH_pastix) if test ! -f "$ff_MPI_INCLUDE_DIR/mpif.h" ; then AC_MSG_NOTICE([ MPI without fortran no file "$ff_MPI_INCLUDE_DIR/mpif.h" ]) else if test -n "$MPIFC" ; then AC_FF_ADDWHERELIB(mpifc,$ff_MPI_LIBFC,$ff_MPI_INCLUDE) AC_FF_ADDWHERELIB(mpif77,$ff_MPI_LIBFC,$ff_MPI_INCLUDE) dnl [echo mpifc LD "'$ff_MPI_LIBFC'" >>$ff_where_lib_conf ] dnl [echo mpifc INCLUDE "'$ff_MPI_INCLUDE'" >>$ff_where_lib_conf ] dnl [echo mpif77 LD "'$ff_MPI_LIBFC'" >>$ff_where_lib_conf ] dnl [echo mpif77 INCLUDE "'$ff_MPI_INCLUDE'" >>$ff_where_lib_conf ] fi fi if test -n "$MPICXX" ; then AC_FF_ADDWHERELIB(mpi,$ff_MPI_LIB,$ff_MPI_INCLUDE) dnl [echo mpi LD "'$ff_MPI_LIB'" >>$ff_where_lib_conf ] dnl [echo mpi INCLUDE "'$ff_MPI_INCLUDE'" >>$ff_where_lib_conf ] fi AC_SUBST(MPI_INC_DIR,$ff_MPI_INCLUDE_DIR) AC_SUBST(MPI_INCLUDE,$ff_MPI_INCLUDE) AC_SUBST(MPI_LIB_DIRS,$ff_MPI_LIB_DIRS) AC_SUBST(MPI_LIB,$ff_MPI_LIB) AC_SUBST(MPI_LIBC,$ff_MPI_LIBC) AC_SUBST(MPI_LIBFC,$ff_MPI_LIBFC) AC_SUBST(SKIP_TESTS_MPI,"no") fi CXX="$ff_save_cxx" LIBS="$ff_save_libs" fi fi ## clean on MPI variable if not MPI ... if test "$ff_mpi" != yes ; then AC_SUBST(MPIRUN,"") AC_SUBST(MPICC,"") AC_SUBST(MPICXX,"") AC_SUBST(MPIF77,"") AC_SUBST(MPIFC,"") AC_SUBST(MPI_INCLUDE,"") AC_SUBST(MPI_LIB_DIRS,"") AC_SUBST(MPI_LIB,"") AC_SUBST(MPI_LIBC,"") AC_SUBST(MPI_LIBFC,"") AC_SUBST(SKIP_TESTS_MPI,"yes") ff_mpi=no fi # Local Variables: # mode:shell-script # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/acoptim.m4000644 000767 000024 00000016640 12470675412 015521 0ustar00hechtstaff000000 000000 # Choosing debugging and/or optimization flags for compilation # ------------------------------------------------------------ AC_ARG_ENABLE(profiling,[ --enable-profiling Turn on profiling]) if test "$enable_profiling" = yes then CXXFLAGS="$CXXFLAGS -pg" LDFLAGS="$LDFLAGS -pg" fi if test "$enable_m64" = yes -a "$enable_m32" then AC_MSG_ERROR([ Choose 32 or 64 architecture not the both ],1); fi AC_ARG_ENABLE(m64,[ --enable-m64 Turn on 64 bits architecture]) if test "$enable_m64" = yes then ff_m64=-m64 ff_ok=no CHECK_COMPILE_FLAG(C,$ff_m64,CFLAGS,ff_ok) if test "$ff_ok" = yes ;then CNOFLAGS="$CFLAGS $ff_m64";fi CHECK_COMPILE_FLAG(C++,$ff_m64,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,$ff_m64,FFLAGS) # add -fPIC on on 64 architecture if test "$ff_ok" = yes ;then CHECK_COMPILE_FLAG(C,-fPIC,CFLAGS,ff_ok) CHECK_COMPILE_FLAG(C++,-fPIC,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-fPIC,FFLAGS) fi fi AC_ARG_ENABLE(m32,[ --enable-m32 Turn on 32 bits architecture]) if test "$enable_m32" = yes then ff_m32=-m32 ff_ok=no CHECK_COMPILE_FLAG(C,$ff_m32,CFLAGS,ff_ok) if test "$ff_ok" = yes ;then CNOFLAGS="$CFLAGS $ff_m32";fi CHECK_COMPILE_FLAG(C,$ff_m32,CNOFLAGS) CHECK_COMPILE_FLAG(C++,$ff_m32,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,$ff_m32,FFLAGS) # add -fPIC on on 64 architecture # CHECK_COMPILE_FLAG(C,-fPIC,CFLAGS) # CHECK_COMPILE_FLAG(C++,-fPIC,CXXFLAGS) # CHECK_COMPILE_FLAG(Fortran 77,-fPIC,FFLAGS) fi # Debug mode (no optimisation) # ---------------------------- AC_MSG_CHECKING(whether to generate debugging information) AC_ARG_ENABLE(debug,[ --enable-debug Turn on debug versions of FreeFem++]) AC_ARG_ENABLE(optim,[ --enable-optim Turn on compiler optimization]) if test "$enable_debug" = yes; then AC_MSG_RESULT(yes) CFLAGS="`echo $CFLAGS | sed 's/-O2//g'`" FFLAGS="`echo $FFLAGS | sed 's/-O2//g'`" CXXFLAGS="`echo $CXXFLAGS | sed 's/-O2//g'`" CHECK_COMPILE_FLAG(C,-g,CFLAGS) CHECK_COMPILE_FLAG(C++,-g,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-g,FFLAGS) else AC_MSG_RESULT(no) # No debugging information in optimized code CFLAGS="$CFLAGS -DNDEBUG" FFLAGS="$FFLAGS -DNDEBUG" CXXFLAGS="$CXXFLAGS -DNDEBUG" fi # Hardware-independant optimization # --------------------------------- if test "$enable_debug" != yes -a "$enable_optim" != no; then CHECK_COMPILE_FLAG(C,-O3,CFLAGS) CHECK_COMPILE_FLAG(C++,-O3,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-O3,FFLAGS) fi AC_ARG_ENABLE(generic, [ --enable-generic Turn off hardware-dependant optimization options]) # FFCS: remove "-mcpu=common" to allow other hardware-dependant values of cpu for PowerPC - thank you Fred (20/02/11) if test $enable_ffcs = yes then # Generic code if test "$enable_debug" != yes \ -a "$enable_optim" != no \ -a "$enable_generic" = yes then CHECK_COMPILE_FLAG(C,-mcpu=common,CFLAGS) CHECK_COMPILE_FLAG(C++,-mcpu=common,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-mcpu=common,FFLAGS) fi fi # Hardware-dependant optimization # ------------------------------- if test "$enable_debug" != yes \ -a "$enable_optim" != no \ -a "$enable_generic" != yes then # Autoconf always chooses -O2. -O2 in gcc makes some functions # disappear. This is not ideal for debugging. And when we optimize, we # do not use -O2 anyway. CFLAGS="`echo $CFLAGS | sed 's/-O2//g'`" FFLAGS="`echo $FFLAGS | sed 's/-O2//g'`" CXXFLAGS="`echo $CXXFLAGS | sed 's/-O2//g'`" # MacOS X Darwin if test -x /usr/bin/hostinfo then # If we are on MacOS X to choise the optimisaztion AC_MSG_CHECKING(GCC version) ff_gcc4=`$CC --version |awk ' NR==1 {print $3}'|sed -e 's/\..*$//'` ff_clang=`$CC --version |awk '/clang/ {print $4}'` if test -n "$ff_clang" ; then ff_gcc4="llvm"; fi AC_MSG_RESULT($ff_gcc4) # At the moment, we do not know how to produce correct # optimizated code on G5. AC_MSG_CHECKING(PowerPC architecture) ff_machine=`/usr/bin/machine` ff_fast="-O3" if test -n "$ff_clang" ; then ff_fast='-O3 -fPIC' elif test `uname` = Darwin then # Optimization flags: -fast option do not work because the # -malign-natural flags create wrong IO code if test "$ff_gcc4" -eq 4 then ff_fast='-fast -fPIC' else ff_fast='-fPIC -O3 -funroll-loops -fstrict-aliasing -fsched-interblock -falign-loops=16 -falign-jumps=16 -falign-functions=16 -falign-jumps-max-skip=15 -falign-loops-max-skip=15 -ffast-math -mpowerpc-gpopt -force_cpusubtype_ALL -fstrict-aliasing -mpowerpc64 ' fi fi # CPU detection case $ff_machine in ppc7450) # G4 ff_fast="$ff_fast -mtune=G4 -mcpu=G4";; ppc970) # G5 # remove -fstrict-aliasing on G5 to much optim the # code cash in GC ff_fast="`echo $ff_fast -mtune=G5 -mcpu=G5| sed 's/-fstrict-aliasing //g'`";; ppc*) # G3 ???? ff_fast="-O3";; i486) ff_fast="-O3 $ff_fast";; x86_64*) ff_fast="-O3 $ff_fast";; *) AC_MSG_ERROR(cannot determine apple cpu type ) ff_fast="-O3";; esac AC_MSG_RESULT($ff_fast) CHECK_COMPILE_FLAG(C,$ff_fast,CFLAGS) CHECK_COMPILE_FLAG(C++,$ff_fast,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,$ff_fast,FFLAGS) # Linux elif test -f /proc/cpuinfo then # Specific processors proc_type=unknown ff_optim_type= if test `grep 'Pentium III (Coppermine)' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium3 ff_optim_type=-P3 elif test `grep 'Intel(R) Pentium(R) III ' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium3 ff_optim_type=-P3 elif test `grep 'Intel(R) Pentium(R) 4 ' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium4 ff_optim_type=-P4 elif test `grep 'Intel(R) Xeon(TM) CPU' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium4 ff_optim_type=-P4 elif test `grep 'AMD Athlon(tm) Processor' /proc/cpuinfo|wc -l` -gt 0 then proc_type=athlon ff_optim_type=-Athlon elif test `grep 'AMD Athlon(tm) XP' /proc/cpuinfo|wc -l` -gt 0 then proc_type=athlon-xp ff_optim_type=-AthlonXP fi if test "$proc_type" != unknown then CHECK_COMPILE_FLAG(C,-march=$proc_type,CFLAGS) CHECK_COMPILE_FLAG(C++,-march=$proc_type,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-march=$proc_type,FFLAGS) fi # If we did not find a processor type (this happens with # cygwin), try and select separate capabilities instead. if test "$proc_type" = unknown then if test `grep -e '^flags.*mmx' /proc/cpuinfo|wc -l` -gt 0 then CHECK_COMPILE_FLAG(C,-mmmx,CFLAGS) CHECK_COMPILE_FLAG(C++,-mmmx,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-mmmx,FFLAGS) fi if test `grep -e '^flags.*sse ' /proc/cpuinfo|wc -l` -gt 0 then CHECK_COMPILE_FLAG(C,-msse,CFLAGS) CHECK_COMPILE_FLAG(C++,-msse,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-msse,FFLAGS) fi if test `grep -e '^flags.*sse2' /proc/cpuinfo|wc -l` -gt 0 then CHECK_COMPILE_FLAG(C,-msse2,CFLAGS) CHECK_COMPILE_FLAG(C++,-msse2,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-msse2,FFLAGS) fi if test `grep -e '^flags.*3dnow' /proc/cpuinfo|wc -l` -gt 0 then CHECK_COMPILE_FLAG(C,-m3dnow,CFLAGS) CHECK_COMPILE_FLAG(C++,-m3dnow,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,-m3dnow,FFLAGS) fi fi fi fi # Defines a variable containing the optimization type, to be used in # binary archive names. It may be empty if only generic optimization # is used. AC_SUBST(OPTIM_TYPE,$ff_optim_type) freefem++-3.38-1/AUTHORS000644 000767 000024 00000000234 11406142250 014646 0ustar00hechtstaff000000 000000 Frdric Hecht Olivier Pironneau Antoine Le Hyaric Albert Ly freefem++-3.38-1/ax_lib_gsl.m4000644 000767 000024 00000011743 12455245554 016172 0ustar00hechtstaff000000 000000 # Configure path for the GNU Scientific Library # Christopher R. Gabriel , April 2000 AC_DEFUN([AX_PATH_GSL], [ AC_ARG_WITH(gsl-prefix,[ --with-gsl-prefix=PFX Prefix where GSL is installed (optional)], gsl_prefix="$withval", gsl_prefix="") AC_ARG_WITH(gsl-exec-prefix,[ --with-gsl-exec-prefix=PFX Exec prefix where GSL is installed (optional)], gsl_exec_prefix="$withval", gsl_exec_prefix="") AC_ARG_ENABLE(gsltest, [ --disable-gsltest Do not try to compile and run a test GSL program], , enable_gsltest=yes) if test "x${GSL_CONFIG+set}" != xset ; then if test "x$gsl_prefix" != x ; then GSL_CONFIG="$gsl_prefix/bin/gsl-config" fi if test "x$gsl_exec_prefix" != x ; then GSL_CONFIG="$gsl_exec_prefix/bin/gsl-config" fi fi AC_PATH_PROG(GSL_CONFIG, gsl-config, no) min_gsl_version=ifelse([$1], ,0.2.5,$1) AC_MSG_CHECKING(for GSL - version >= $min_gsl_version) no_gsl="" if test "$GSL_CONFIG" = "no" ; then no_gsl=yes else GSL_CFLAGS=`$GSL_CONFIG --cflags` GSL_LIBS=`$GSL_CONFIG --libs` gsl_major_version=`$GSL_CONFIG --version | \ sed 's/^\([[0-9]]*\).*/\1/'` if test "x${gsl_major_version}" = "x" ; then gsl_major_version=0 fi gsl_minor_version=`$GSL_CONFIG --version | \ sed 's/^\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\).*/\2/'` if test "x${gsl_minor_version}" = "x" ; then gsl_minor_version=0 fi gsl_micro_version=`$GSL_CONFIG --version | \ sed 's/^\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\).*/\3/'` if test "x${gsl_micro_version}" = "x" ; then gsl_micro_version=0 fi if test "x$enable_gsltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" rm -f conf.gsltest AC_TRY_RUN([ #include #include #include char* my_strdup (const char *str); char* my_strdup (const char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (void) { int major = 0, minor = 0, micro = 0; int n; char *tmp_version; system ("touch conf.gsltest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_gsl_version"); n = sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) ; if (n != 2 && n != 3) { printf("%s, bad version string\n", "$min_gsl_version"); exit(1); } if (($gsl_major_version > major) || (($gsl_major_version == major) && ($gsl_minor_version > minor)) || (($gsl_major_version == major) && ($gsl_minor_version == minor) && ($gsl_micro_version >= micro))) { exit(0); } else { exit(1); } } ],, no_gsl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gsl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$GSL_CONFIG" = "no" ; then echo "*** The gsl-config script installed by GSL could not be found" echo "*** If GSL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GSL_CONFIG environment variable to the" echo "*** full path to gsl-config." else if test -f conf.gsltest ; then : else echo "*** Could not run GSL test program, checking why..." CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" AC_TRY_LINK([ #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GSL or finding the wrong" echo "*** version of GSL. If it is not finding GSL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GSL was incorrectly installed" echo "*** or that you have moved GSL since it was installed. In the latter case, you" echo "*** may want to edit the gsl-config script: $GSL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi # GSL_CFLAGS="" # GSL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GSL_CFLAGS) AC_SUBST(GSL_LIBS) rm -f conf.gsltest ]) AU_ALIAS([AM_PATH_GSL], [AX_PATH_GSL]) freefem++-3.38-1/ax_lib_hdf5.m4000644 000767 000024 00000025034 12455164030 016216 0ustar00hechtstaff000000 000000 # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_lib_hdf5.html # =========================================================================== # # SYNOPSIS # # AX_LIB_HDF5([serial/parallel]) # # DESCRIPTION # # This macro provides tests of the availability of HDF5 library. # # The optional macro argument should be either 'serial' or 'parallel'. The # former only looks for serial HDF5 installations via h5cc. The latter # only looks for parallel HDF5 installations via h5pcc. If the optional # argument is omitted, serial installations will be preferred over # parallel ones. # # The macro adds a --with-hdf5 option accepting one of three values: # # no - do not check for the HDF5 library. # yes - do check for HDF5 library in standard locations. # path - complete path to the HDF5 helper script h5cc or h5pcc. # # If HDF5 is successfully found, this macro calls # # AC_SUBST(HDF5_VERSION) # AC_SUBST(HDF5_CC) # AC_SUBST(HDF5_CFLAGS) # AC_SUBST(HDF5_CPPFLAGS) # AC_SUBST(HDF5_LDFLAGS) # AC_SUBST(HDF5_LIBS) # AC_SUBST(HDF5_FC) # AC_SUBST(HDF5_FFLAGS) # AC_SUBST(HDF5_FLIBS) # AC_DEFINE(HAVE_HDF5) # # and sets with_hdf5="yes". Additionally, the macro sets # with_hdf5_fortran="yes" if a matching Fortran wrapper script is found. # Note that Autconf's Fortran support is not used to perform this check. # H5CC and H5FC will contain the appropriate serial or parallel HDF5 # wrapper script locations. # # If HDF5 is disabled or not found, this macros sets with_hdf5="no" and # with_hdf5_fortran="no". # # Your configuration script can test $with_hdf to take any further # actions. HDF5_{C,CPP,LD}FLAGS may be used when building with C or C++. # HDF5_F{FLAGS,LIBS} should be used when building Fortran applications. # # To use the macro, one would code one of the following in "configure.ac" # before AC_OUTPUT: # # 1) dnl Check for HDF5 support # AX_LIB_HDF5() # # 2) dnl Check for serial HDF5 support # AX_LIB_HDF5([serial]) # # 3) dnl Check for parallel HDF5 support # AX_LIB_HDF5([parallel]) # # One could test $with_hdf5 for the outcome or display it as follows # # echo "HDF5 support: $with_hdf5" # # You could also for example, override the default CC in "configure.ac" to # enforce compilation with the compiler that HDF5 uses: # # AX_LIB_HDF5([parallel]) # if test "$with_hdf5" = "yes"; then # CC="$HDF5_CC" # else # AC_MSG_ERROR([Unable to find HDF5, we need parallel HDF5.]) # fi # # LICENSE # # Copyright (c) 2009 Timothy Brown # Copyright (c) 2010 Rhys Ulerich # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 AC_DEFUN([AX_LIB_HDF5], [ AC_REQUIRE([AC_PROG_SED]) AC_REQUIRE([AC_PROG_AWK]) AC_REQUIRE([AC_PROG_GREP]) dnl Check first argument is one of the recognized values. dnl Fail eagerly if is incorrect as this simplifies case statements below. if test "m4_normalize(m4_default([$1],[]))" = "" ; then : # Recognized value elif test "m4_normalize(m4_default([$1],[]))" = "serial" ; then : # Recognized value elif test "m4_normalize(m4_default([$1],[]))" = "parallel"; then : # Recognized value else AC_MSG_ERROR([ Unrecognized value for AX[]_LIB_HDF5 within configure.ac. If supplied, argument 1 must be either 'serial' or 'parallel'. ]) fi dnl Add a default --with-hdf5 configuration option. AC_ARG_WITH([hdf5], AS_HELP_STRING( [--with-hdf5=[yes/no/PATH]], m4_case(m4_normalize([$1]), [serial], [location of h5cc for serial HDF5 configuration], [parallel], [location of h5pcc for parallel HDF5 configuration], [location of h5cc or h5pcc for HDF5 configuration]) ), [if test "$withval" = "no"; then with_hdf5="no" elif test "$withval" = "yes"; then with_hdf5="yes" else with_hdf5="yes" H5CC="$withval" fi], [with_hdf5="yes"] ) dnl Set defaults to blank HDF5_CC="" HDF5_VERSION="" HDF5_CFLAGS="" HDF5_CPPFLAGS="" HDF5_LDFLAGS="" HDF5_LIBS="" HDF5_FC="" HDF5_FFLAGS="" HDF5_FLIBS="" dnl Try and find hdf5 compiler tools and options. if test "$with_hdf5" = "yes"; then if test -z "$H5CC"; then dnl Check to see if H5CC is in the path. AC_PATH_PROGS( [H5CC], m4_case(m4_normalize([$1]), [serial], [h5cc], [parallel], [h5pcc], [h5cc h5pcc]), []) else AC_MSG_CHECKING([Using provided HDF5 C wrapper]) AC_MSG_RESULT([$H5CC]) fi AC_MSG_CHECKING([for HDF5 libraries]) if test ! -f "$H5CC" || test ! -x "$H5CC"; then AC_MSG_RESULT([no]) AC_MSG_WARN(m4_case(m4_normalize([$1]), [serial], [ Unable to locate serial HDF5 compilation helper script 'h5cc'. Please specify --with-hdf5= as the full path to h5cc. HDF5 support is being disabled (equivalent to --with-hdf5=no). ], [parallel],[ Unable to locate parallel HDF5 compilation helper script 'h5pcc'. Please specify --with-hdf5= as the full path to h5pcc. HDF5 support is being disabled (equivalent to --with-hdf5=no). ], [ Unable to locate HDF5 compilation helper scripts 'h5cc' or 'h5pcc'. Please specify --with-hdf5= as the full path to h5cc or h5pcc. HDF5 support is being disabled (equivalent to --with-hdf5=no). ])) with_hdf5="no" with_hdf5_fortran="no" else dnl Get the h5cc output HDF5_SHOW=$(eval $H5CC -show) dnl Get the actual compiler used HDF5_CC=$(eval $H5CC -show | $AWK '{print $[]1}') if test "$HDF5_CC" = "ccache"; then HDF5_CC=$(eval $H5CC -show | $AWK '{print $[]2}') fi dnl h5cc provides both AM_ and non-AM_ options dnl depending on how it was compiled either one of dnl these are empty. Lets roll them both into one. dnl Look for "HDF5 Version: X.Y.Z" HDF5_VERSION=$(eval $H5CC -showconfig | $GREP 'HDF5 Version:' \ | $AWK '{print $[]3}') dnl A ideal situation would be where everything we needed was dnl in the AM_* variables. However most systems are not like this dnl and seem to have the values in the non-AM variables. dnl dnl We try the following to find the flags: dnl (1) Look for "NAME:" tags dnl (2) Look for "H5_NAME:" tags dnl (3) Look for "AM_NAME:" tags dnl HDF5_tmp_flags=$(eval $H5CC -showconfig \ | $GREP 'FLAGS\|Extra libraries:' \ | $AWK -F: '{printf("%s "), $[]2}' ) dnl Find the installation directory and append include/ HDF5_tmp_inst=$(eval $H5CC -showconfig \ | $GREP 'Installation point:' \ | $AWK '{print $[]NF}' ) dnl Add this to the CPPFLAGS HDF5_CPPFLAGS="-I${HDF5_tmp_inst}/include" dnl Now sort the flags out based upon their prefixes for arg in $HDF5_SHOW $HDF5_tmp_flags ; do case "$arg" in -I*) echo $HDF5_CPPFLAGS | $GREP -e "$arg" 2>&1 >/dev/null \ || HDF5_CPPFLAGS="$arg $HDF5_CPPFLAGS" ;; -L*) echo $HDF5_LDFLAGS | $GREP -e "$arg" 2>&1 >/dev/null \ || HDF5_LDFLAGS="$arg $HDF5_LDFLAGS" ;; -l*) echo $HDF5_LIBS | $GREP -e "$arg" 2>&1 >/dev/null \ || HDF5_LIBS="$arg $HDF5_LIBS" ;; esac done HDF5_LIBS="$HDF5_LIBS -lhdf5" AC_MSG_RESULT([yes (version $[HDF5_VERSION])]) dnl See if we can compile ax_lib_hdf5_save_CC=$CC ax_lib_hdf5_save_CPPFLAGS=$CPPFLAGS ax_lib_hdf5_save_LIBS=$LIBS ax_lib_hdf5_save_LDFLAGS=$LDFLAGS CC=$HDF5_CC CPPFLAGS=$HDF5_CPPFLAGS LIBS=$HDF5_LIBS LDFLAGS=$HDF5_LDFLAGS AC_CHECK_HEADER([hdf5.h], [ac_cv_hadf5_h=yes], [ac_cv_hadf5_h=no]) AC_CHECK_LIB([hdf5], [H5Fcreate], [ac_cv_libhdf5=yes], [ac_cv_libhdf5=no]) if test "$ac_cv_hadf5_h" = "no" && test "$ac_cv_libhdf5" = "no" ; then AC_MSG_WARN([Unable to compile HDF5 test program]) fi dnl Look for HDF5's high level library AC_HAVE_LIBRARY([hdf5_hl], [HDF5_LIBS="$HDF5_LIBS -lhdf5_hl"], [], []) CC=$ax_lib_hdf5_save_CC CPPFLAGS=$ax_lib_hdf5_save_CPPFLAGS LIBS=$ax_lib_hdf5_save_LIBS LDFLAGS=$ax_lib_hdf5_save_LDFLAGS AC_MSG_CHECKING([for matching HDF5 Fortran wrapper]) dnl Presume HDF5 Fortran wrapper is just a name variant from H5CC H5FC=$(eval echo -n $H5CC | $SED -n 's/cc$/fc/p') if test -x "$H5FC"; then AC_MSG_RESULT([$H5FC]) with_hdf5_fortran="yes" AC_SUBST([H5FC]) dnl Again, pry any remaining -Idir/-Ldir from compiler wrapper for arg in `$H5FC -show` do case "$arg" in #( -I*) echo $HDF5_FFLAGS | $GREP -e "$arg" >/dev/null \ || HDF5_FFLAGS="$arg $HDF5_FFLAGS" ;;#( -L*) echo $HDF5_FFLAGS | $GREP -e "$arg" >/dev/null \ || HDF5_FFLAGS="$arg $HDF5_FFLAGS" dnl HDF5 installs .mod files in with libraries, dnl but some compilers need to find them with -I echo $HDF5_FFLAGS | $GREP -e "-I${arg#-L}" >/dev/null \ || HDF5_FFLAGS="-I${arg#-L} $HDF5_FFLAGS" ;; esac done dnl Make Fortran link line by inserting Fortran libraries for arg in $HDF5_LIBS do case "$arg" in #( -lhdf5_hl) HDF5_FLIBS="$HDF5_FLIBS -lhdf5hl_fortran $arg" ;; #( -lhdf5) HDF5_FLIBS="$HDF5_FLIBS -lhdf5_fortran $arg" ;; #( *) HDF5_FLIBS="$HDF5_FLIBS $arg" ;; esac done else AC_MSG_RESULT([no]) with_hdf5_fortran="no" fi AC_SUBST([HDF5_VERSION]) AC_SUBST([HDF5_CC]) AC_SUBST([HDF5_CFLAGS]) AC_SUBST([HDF5_CPPFLAGS]) AC_SUBST([HDF5_LDFLAGS]) AC_SUBST([HDF5_LIBS]) AC_SUBST([HDF5_FC]) AC_SUBST([HDF5_FFLAGS]) AC_SUBST([HDF5_FLIBS]) AC_DEFINE([HAVE_HDF5], [1], [Defined if you have HDF5 support]) fi fi ]) freefem++-3.38-1/BUGS000644 000767 000024 00000004350 12326160360 014270 0ustar00hechtstaff000000 000000 -- bug in examples++-3d/TruncLac.edp april 2014 assertion under windows system versiuon 3.30 () -- bug in clean variable (delete) after a break , continue or return. example : while(1) { .... if ( ...) break; matrix M= ... } // here we delete the data associated to objet M but the variable M is un set, so some time freefem trap when we free unset pointer. -- bug une fonction with string parameter hard to correct func bool write(string fn,real[int] & u) { cout << fn << endl; // delete 2 times return true; } Now, problem: (correct in version 1.14) adpation and periodic boundary condition are incompatible. no way to inforce periodic adpated mesh today. -- before version 1.28: bug when passing a parameter of funct to a parameter parameter like: func int fi(real a) { int i=a*a/0; return i; }; func real myfunction(real a,real b) { real z =fi(a)+b/0; // bug loop in E_F0para::operator()(void*) const () return z; }; -- before version 1.21, bug in interpolation on non connexe domain, (some pieces of code are lose) on(1,u=N.x); the normal is not set (correct in version 1.20) -- bug in version 1.18 and before The no symetric matrix set form a variationnal form is make with 2 transpositions one on the space and one at the level of the bilineair form fespace Ph(Th,P1),Vh(Th,P2); varf a(p,v)=int2d(Th)(p*dx(v)); matrix A=a(Ph,Vh); // is n m matrix n (resp. m) is the number of DF of Ph (resp. Vh), so the construct matrix is Aij= int2d(Th)(v_j*dx(p_i)); bug in version 1.16 and after: The mixing of fespace with differents periodic boundary condition is not implemented in no-scalar problem. So all the finite element space use for test or unknow functions in a problem, must have the same type of periodic boundary condition or no periodic boundary condition. No clean message is give and the result is impredictible, Sorry. bug in version 1.15 and before: bug know bug: example-bug/aaa.edp Do not make copy mesh and fespace Mesh Thh; { Mesh Th=readmesh( ..); // OK Th=Thh; // BUG the mesh is delete twice. } plot(Thh); // trap because the mesh is delete the same probleme occure with fespace freefem++-3.38-1/build/000755 000767 000024 00000000000 12544247066 014715 5ustar00hechtstaff000000 000000 freefem++-3.38-1/ChangeLog000644 000767 000024 00000035057 11406142250 015363 0ustar00hechtstaff000000 000000 2005-05-03 16:25 hecht * remove pascal in "\p " macos version 2005-05-03 15:12 hecht * try to compile with de idm compiler xlc++ work in progress remove 10^10 an 10.^10 (FH) 2005-05-02 10:57 hecht * do correction for g++-4.0 remove const in Expression type 2005-04-27 14:23 hecht * do correction for g++ version 4.0 (new apple compiler on Tiger) small change in RNM and cadna (FH) 2005-04-22 11:58 lehyaric * Debug checks are ok on Debian Testing 2005-04-17 18:44 hecht * add page to explain how to bluid weak form with Robin / Neumann coundary condition 2005-04-16 21:36 hecht * add tool to solve variationnal inequality add change version to 1.46-1 2005-04-15 22:48 hecht * the 2 new example have probleme with testhighlight.sh we disable the test in chech (FH) 2005-04-15 22:06 hecht * add tools to solve variationnal inequality let d en array and A a square matrix (in .edp) d=A.diag; // get the diagonal of the matrix A.diag = d; //set the diagonal set(A,solver=CG); // important to change precondiconning before solving 2005-04-13 11:58 lehyaric * IDE compiles again under MingW (an include file was missing) 2005-04-12 18:37 hecht * add Modification Kohji Ohtsuka in a manual try too correct problem in eigen value in no symetric cas (??) 2005-04-12 12:07 hecht * add flags to build unionkjack mesh on square example: mesh Th=square(nn,mm,[x/ddx,y/ddy] ,flags=1); 2005-04-05 15:08 lehyaric * FreeFem+-ide compiles on MacOS X 2005-04-05 14:33 lehyaric * First version of FreeFem++-ide without sockets compiles under Linux 2005-03-30 11:38 hecht * correct name of example blakschol.edp in BlackSchole.edp add file in distribution archive (logo2.ico) 2005-03-30 11:05 hecht * add src/ide/testhighlight.sh in distributed file (src/ide/Makefile.am) FH 2005-03-30 11:02 lehyaric * Not regenerating HISTORY if not in a CVS working area 2005-03-30 10:42 hecht * correct some mistake in Makefile.am (in: examples++-load/, src/ide/) 2005-03-30 09:31 hecht * adding 2 new files for allocation (forgot in previous commit) 2005-03-29 23:13 hecht * Big change in code generation alloc (work in progress) to remove all undelete pointer. May be correct trap in arpack++ (alloction problem not sure, very strange thing) Put 1-46-0 version number Inforce compile in example-load remark, all test work on my Mac, FH. 2005-03-25 17:59 hecht * correct bug in trunc function: The bug is the mesh have hole the we get a mesh with triangle in the hole: border a(t=0,2*pi){ x=cos(t); y=sin(t);label=1;} border b(t=0,2*pi){ x=0.3+0.3*cos(t); y=0.3*sin(t);label=2;} mesh Thwithhole = buildmesh(a(50)+b(-30)); mesh Th2=trunc(Thwithhole,1,split=2,label=2); 2005-03-25 14:54 lehyaric * Compiling ok on Linux 2005-03-25 12:37 lehyaric * Client and server merged into one unique executable to make sure that the client can find its server program, even through symbolic links. 2005-03-17 14:15 lehyaric * Included src/lglib/lg.tab.?pp in cleanregen.sh 2005-03-17 14:13 lehyaric * Replaced sem_getvalue() with a separate counter on MacOSX. 2005-03-16 22:28 hecht * add tool to get number of mesh triangle contening a point (x,y) or to get the region number example: int it00 = Th(0.55,0.6).nuTriangle; // get the number of Th's triangle contening (0.55,0.6) int nr00 = Th(0.55,0.6).region;; // get the region number of Th's triangle contening (0.55,0.6) 2005-03-16 15:37 hecht * correct prototype of StrVersionNumber in macrgraf 2005-03-16 15:05 lehyaric * Updates to the no-F77 no-C configuration 2005-03-16 14:41 lehyaric * Fortran and C compilers are now optional (if they are missing, we just don't compile the libraries that need them). 2005-03-16 12:08 hecht * correct error in prototype of StrVersionNumber and add precision to show the correct version number 2005-03-13 16:32 hecht * correct compilation problem in RNM (resize) with g++3.4 (add this->) 2005-03-02 11:50 lehyaric * Correcting compilation problem on RedHat 2005-03-02 11:29 lehyaric * New packaging including FreeFem++-cs features: fast graphics, grammar highlighting, error-line display 2005-03-02 11:22 lehyaric * FreeFem++-cs MinGW bug corrected: does not crash anymore when reading a file name from the command line 2005-03-01 16:06 lehyaric * Removed unnecessary #includes 2005-03-01 15:33 lehyaric * Simplified startup code. Hopefully, this will stop the MinGW segmentation fault bug (at startup when a filename is specified on the command line), but this is not proven yet. 2005-03-01 14:21 lehyaric * Segmentation violation error while loading a file from the command line in FreeFem++-cs. Debugging in progress. 2005-02-28 18:06 lehyaric * Now compiling fine under Cygwin 2005-02-28 11:40 lehyaric * Now compiling fine on MinGW 2005-02-28 11:27 lehyaric * Removed use of regex.h since it is not available under MinGW. 2005-02-25 16:28 lehyaric * Corrected a small compilation error. 2005-02-25 16:14 lehyaric * FreeFem++-cs: compile-time or runtime errors are now highlighted in the editor (the corresponding line number is extracted from all the server messages thanks to a regex). 2005-02-25 13:10 lehyaric * More coherency checks in configure.ac for a correct MPI installation. 2005-02-25 10:50 lehyaric * Added new "resize" reserved word into the highlighting grammar. 2005-02-24 21:27 hecht * correct the documentation 2005-02-24 20:44 hecht * correct mistake in return type in complex mean and jump new function (FH) 2005-02-24 15:33 hecht * resize of array and matrices, continuing 2005-02-24 15:32 hecht * add resize of int,real and complex array or matrices, exemple: real [int] tab2=[1,2,3,3.14]; tab2.resize(10); // to set the new siez of array to 10 2005-02-24 15:08 lehyaric * Grammar-driven highlighting works. Regression tests for it are included in "make check". Include file and macros are not scanned during highlighting. 2005-02-24 09:44 hecht * correct bug in array of complex FE function like Vh[int] Wh(10); // where Vh is a fespace 2005-02-23 15:51 lehyaric * Highlighting test procedure not ready for regression tests yet: disabled from "make check". 2005-02-23 15:40 lehyaric * Renamed some FreeFem++ tokens to avoid collisions with system-dependant defines. 2005-02-23 15:37 lehyaric * Properly compiled lex and yacc source, for machines that do not have working versions of lex or yacc. 2005-02-23 15:35 lehyaric * No CVS keyword in lex and yacc source files to avoid recompiling them after a "cvs commit" on machines that do not have proper versions of this software. 2005-02-23 15:22 lehyaric * "testhighlight" regression tests now work up to (but not including) array.edp 2005-02-23 14:50 lehyaric * Added highlighting grammar files into CVS, in case the compiling environment does not include a working version of bison or lex. 2005-02-23 13:44 lehyaric * The HISTORY file is now created from CVS logs thanks to "cvs2cl". Previous HISTORY items are saved as HISTORY_BEFORE_2005. 2005-02-23 12:45 lehyaric * FreeFem++-cs: grammar-driven syntax highlighting works on (examples++-tutorial/...) Laplace.edp, adapt.edp and adaptindicatorP1.edp (ALH) 2005-02-23 10:49 hecht * add jump and mean of complex function. 2005-02-22 17:37 lehyaric * FreeFem++-cs: grammar-driven highlighting procedure works on (examples++-tutorial/) Laplace.edp and adapt.edp. 2005-02-18 20:13 lehyaric * FreeFem++-cs syntax highlighting is now highlights keywords based on their location in the input buffer, which removes any need for backtracking in the bison grammar. The grammar is now much simpler thanks to this. 2005-02-18 18:00 hecht * ajoute d'un test d'erreur 2005-02-17 16:54 lehyaric * Progressive updates to the highlighting grammar. 2005-02-17 16:02 lehyaric * Added new developments 2005-02-17 15:05 lehyaric * Compiles on MacOS X. 2005-02-17 15:05 lehyaric * Grammar-driven highlighting now includes macros (but it stops highlighting a macro at the first "/"). 2005-02-17 14:27 lehyaric * First working version of syntax highlighting through grammar file in FreeFem++-cs editor. 2005-02-16 18:13 hecht * 3D continuing + truc 2005-02-16 13:44 lehyaric * Socket buffering is now limited to avoid random communication errors. 2005-02-16 12:29 lehyaric * Buffered socket writes implemented in FreeFem++-cs 2005-02-15 14:30 lehyaric * Corrected comments 2005-02-15 14:19 lehyaric * FreeFem++-cs binary TCP flux optimized. 2005-02-14 17:22 lehyaric * Socket communication between client and server in FreeFem++-cs has been translated into binary format for speed. 2005-02-14 11:50 lehyaric * Small spelling mistake 2005-02-11 22:20 hecht * complet DOC 2005-02-11 18:00 hecht * add 2 new quadrature formular qf7pT and qf9pT with respectively 15 and 21 points add P2b a new finite element : P2 + bubble 2005-02-11 15:57 lehyaric * Now drag'n'drop and copy/paste work concurrently in the FreeFem++-cs editor window. 2005-02-08 17:26 hecht * add 3D stuff in quadtree 2005-02-08 16:52 lehyaric * Updated TODO list for FreeFem++-cs 2005-02-08 16:18 lehyaric * Dynamic loading is now disabled if dlopen() does not link properly (bug reported by Haiko Etzel) 2005-02-08 15:18 hecht * add buildmesh example with nbvx= named parameter 2005-02-08 14:23 lehyaric * New Debian package 2005-02-04 16:47 lehyaric * Now checks that FLTK is compiled with threads before accepting it. 2005-02-04 16:24 lehyaric * Patchs de configuration proposs par Thierry Thomas pour FreeBSD intgrs. 2005-02-04 15:30 hecht * beginning of 3D version 2005-02-01 17:17 lehyaric * Compiles on MacOS X 2005-02-01 16:49 lehyaric * New script to remove generated files (in order to prevent CVS conflicts) 2005-02-01 16:04 lehyaric * FreeFem++-cs compiling and running on Windows with fully blocking sockets 2005-02-01 15:01 lehyaric * Cosmetic change 2005-02-01 14:38 lehyaric * FreeFem++-cs works with fully-blocking sockets on Linux. src/fflib/strversionnumber.m4 added to distribution list. 2005-02-01 12:40 lehyaric * Still problems with blocking communication. But FreeFem++-cs compiles 2005-02-01 12:20 lehyaric * Reverting FreeFem++-cs to blocking IO because of Microsoft Windows problems 2005-01-31 15:21 lehyaric * New version number in makefiles. 2005-01-31 15:17 lehyaric * Default version number now includes package number. Build date changes at each build. 2005-01-31 14:07 lehyaric * Problem with busy waiting under Windows solved. Change in version numbering variables (see configure.ac). 2005-01-29 10:15 hecht * end g++3.4 correction on hydre CV: ---------------------------------------------------------------------- 2005-01-29 09:56 hecht * correct some compile error with g++ 3.4 CV ---------------------------------------------------------------------- 2005-01-28 14:52 lehyaric * Corrected "cannot open '-psn_xxx' document" error on MacOS. 2005-01-28 14:00 lehyaric * FreeFem++-cs compiles+runs ok on MacOS X 2005-01-28 13:27 lehyaric * Windows packaging for new improved socket implementation 2005-01-28 12:01 lehyaric * ecompiling ok on Windows. 2005-01-28 11:28 lehyaric * Still trying to resolve discrepancies between Linux and Windows sockets. 2005-01-27 19:01 hecht * correct ; placement in if ... 2005-01-27 18:30 hecht * pour mettre les makefile.in ok 2005-01-27 18:14 hecht * mac install continuing 2005-01-27 18:07 hecht * continuing coorect of macos application installation 2005-01-27 17:16 lehyaric * Reorganising socket communication in FreeFem++-cs because of instabilities on Windows. 2005-01-27 10:59 lehyaric * Drag'n'drop works with Mozilla Firefox for Windows. FreeFem++-cs documentation updated. 2005-01-26 23:34 hecht * add .app.tgz of macos application 2005-01-26 23:31 hecht * correct pb dvi pdf in manual.tex 2005-01-26 23:25 hecht * correct stuff in dist generation correct trouble in configure.ac and tar.gz file 2005-01-26 23:22 hecht * correct problem dvi and pdf chose make lot of small change in configure.ac ... 2005-01-26 17:50 hecht * coorect macos X application) 2005-01-26 17:35 lehyaric * Drag'n'drop works with mozilla-firefox under X11. 2005-01-26 13:58 lehyaric * In configure.ac, PACKAGE_VERSION is already used by autoconf, so we create 'FREEFEM_PACKAGING' instead. 2005-01-26 12:11 lehyaric * Drag'n'drop is now working in FreeFem++-cs. 2005-01-26 11:30 lehyaric * Drag'n'drop being implemented. 2005-01-24 11:28 hecht * add named parameter nbtx=.. in buildmesh function to change the default maximal number of vertex in the build mesh. 2005-01-20 20:10 hecht * Correct a segfault if second derivative of test function exist in problem definition. The Change in problem.cpp: resize : KN buf(Vh.MaximalNbOfDF()*3*Vh.N); to : KN buf(Vh.MaximalNbOfDF()*last_operatortype*Vh.N); 2005-01-20 10:39 hecht * correct parameter passing () in macro argument correct linear combination of sparce matrix. 2005-01-11 13:38 lehyaric * FreeFem++-cs compiles with cygwin. It is not tested yet. File paths may be a problem. 2005-01-10 22:19 hecht * change c i C in speedtest.sh to get Cholesky cpu time 2005-01-10 14:03 hecht * add forgotten file .pdf 2005-01-10 12:07 hecht * window problem continue 2005-01-10 10:41 hecht * correct ???? configure.ac under window 2005-01-07 17:05 hecht * correct expand string in macro 2005-01-07 15:55 hecht * add config.h.in 2005-01-07 12:25 lehyaric * Cosmetic change 2005-01-07 11:50 hecht * correct initialisation in solve in case of un set variable 2005-01-06 21:58 hecht * rewrite the macro generation tool to be more to suppress some bug in argument subtition correct error in line numbering in case of newline in string cosmetic change in output 2005-01-05 23:10 hecht * update HISTORY file 2005-01-05 21:50 hecht * correct segmentation violation error if some FE variable is un set before solving problem because we use this variable to initialise data. 2005-01-04 16:58 hecht * continuing int1d(Th,3,qfe=qf1pElump)( 2005-01-04 16:45 hecht * add qf1pElump new quadrature formular in int1d() ... freefem++-3.38-1/CheckAll000755 000767 000024 00000001203 12144236272 015177 0ustar00hechtstaff000000 000000 ff=../src/nw/FreeFem++-nw ffmpi="" if [ -x ./src/bin/FreeFem++-nw.exe ] ; then ff=../src/bin/FreeFem++-nw.exe; fi if [ -x ./src/bin-win32/FreeFem++-nw.exe ] ; then ff=../src/bin-win32/FreeFem++-nw.exe; fi if [ -x ./src/mpi/ff-mpirun ] ; then ffmpi=../src/mpi/ff-mpirun; fi rm CheckAll-out for i in examples++*/.; do echo ---- $i --- cd $i; case $i in *mpi/.) echo " skip $i do test a end " ;; *) ../CheckAllEdp "$ff -nw" *.edp | tee -a ../CheckAll-out ;; esac; cd ..; done if [ -n "$ffmpi" ] ; then cd examples++-mpi/ ../CheckAllEdp "$ffmpi -np 4" *.edp | tee -a ../CheckAll-out else echo " **no mpi " | tee -a CheckAll-out fifreefem++-3.38-1/CheckAllEdp000755 000767 000024 00000003132 12211563370 015630 0ustar00hechtstaff000000 000000 #!/bin/bash red='' # Red. grn='' # Green. lgn='' # Light green. blu='' # Blue. mgn='' # Magenta. std='' # No color. NL=0 NA=0 NX=0 NN=0 NO=0 NC=0 NF=0 cmm=$1;shift; if [ $# -eq 0 ]; then list=*.edp elif [ $# -gt 0 ]; then list="$@" fi for i in $list do case $i in all.edp|regtests.edp) echo pass $i;; *) ((NN++)) ( $cmm "$i" )2>&1 1>$i-out; RES=$? ((SIG=$RES%128)); ## error Compile error : Error load # 1 ## error Compile error : ## Exec error : exec assert ## Exec error : errl=`grep 'error Compile error : Error load' $i-out` errC=`grep 'error Compile error :' $i-out` errX=`grep 'Exec error :' $i-out` errA=`grep 'Exec error : exec assert' $i-out` # echo "$RES,$SIG,$errC,$errA." if [ -n "$errl" ] ; then ((NL++)) MSG="${mgn} FAIL(load) ${std}" elif [ -n "$errC" ] ; then ((NC++)) MSG="${lgn} FAIL(Compile) ${std}" elif [ -n "$errA" ] ; then ((NA++)) MSG="${blu} FAIL(Assert) ${std}" elif [ -n "$errX" ] ; then ((NX++)) MSG="${mgn} FAIL(Exec) ${std}" elif [ $SIG -eq 0 ] ; then ((NO++)) MSG="${grn} OK (Exec) ${std}" else MSG="${red} FAIL(signal)=$SIG ${std}" ((NF++)) fi echo $MSG $cmm $i >>$i-out echo $MSG $cmm $i "( see $i-out )"; # echo $MSG $cmm $i "(see $i-out )" >>/tmp/list-ff-$$ ;; esac done echo "Nb Case $NN / ${grn}OK $NO / ${red} FAIL $NF / ${blu} Assert Error $NA/ ${lgn} Compile Error $NC / ${mgn} load Error $NL / Exec Error $NX${std}" freefem++-3.38-1/compile000755 000767 000024 00000007072 11406142255 015170 0ustar00hechtstaff000000 000000 #! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2003-11-09.00 # Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit 0 ;; -v | --v*) echo "compile $scriptversion" exit 0 ;; esac prog=$1 shift ofile= cfile= args= while test $# -gt 0; do case "$1" in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we do something ugly here. ofile=$2 shift case "$ofile" in *.o | *.obj) ;; *) args="$args -o $ofile" ofile= ;; esac ;; *.c) cfile=$1 args="$args $1" ;; *) args="$args $1" ;; esac shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$prog" $args fi # Name of file we expect compiler to create. cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir $lockdir > /dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir $lockdir; exit 1" 1 2 15 # Run the compile. "$prog" $args status=$? if test -f "$cofile"; then mv "$cofile" "$ofile" fi rmdir $lockdir exit $status # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: freefem++-3.38-1/config-wrapper.h000755 000767 000024 00000000543 12167254041 016707 0ustar00hechtstaff000000 000000 // Include a platform-specific configuration file // ---------------------------------------------- // $Id$ // This wrapper is necessary for platforms where the configure script // does not run. #ifndef CONFIG_WRAPPER_H #define CONFIG_WRAPPER_H #ifdef __MWERKS__ #include "config-macos9.h" #else #include #endif #endif // CONFIG_WRAPPER_H freefem++-3.38-1/config.guess000755 000767 000024 00000130361 12274717221 016135 0ustar00hechtstaff000000 000000 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: freefem++-3.38-1/config.h.in000644 000767 000024 00000012760 12543260477 015647 0ustar00hechtstaff000000 000000 /* config.h.in. Generated from configure.ac by autoheader. */ /* build FreeFem++ for use by FreeFem++-cs */ #undef ENABLE_FFCS /* Define to dummy `main' function (if any) required to link to the Fortran libraries. */ #undef F77_DUMMY_MAIN /* Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran. */ #undef F77_FUNC /* As F77_FUNC, but for C identifiers containing underscores. */ #undef F77_FUNC_ /* Define if F77 and FC dummy `main' functions are identical. */ #undef FC_DUMMY_MAIN_EQ_F77 /* FreeFem prefix dir */ #undef FF_PREFIX_DIR /* FreeFem prefix dir */ #undef FF_PREFIX_DIR_APPLE /* Define to 1 if you have the header file. */ #undef HAVE_ACCELERATE_CBLAS_H /* Define to 1 if you have the `acosh' function. */ #undef HAVE_ACOSH /* Define to 1 if you have the `asinh' function. */ #undef HAVE_ASINH /* Define to 1 if you have the `atanh' function. */ #undef HAVE_ATANH /* Define to 1 if you have the header file. */ #undef HAVE_ATLAS_CBLAS_H /* If umfpack.h is located in UMFPACK subdir */ #undef HAVE_BIG_UMFPACK_UMFPACK_H /* freecadna is use to evalute the round-off error propagation */ #undef HAVE_CADNA /* Define to 1 if you have the header file. */ #undef HAVE_CBLAS_H /* Dynamic loading - not mandatory */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `erfc' function. */ #undef HAVE_ERFC /* Define to 1 if you have the header file. */ #undef HAVE_FFTW3_H /* Define to 1 if you have the `getenv' function. */ #undef HAVE_GETENV /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_GLUT_GLUT_H /* Define to 1 if you have the header file. */ #undef HAVE_GL_GLUT_H /* Define to 1 if you have the header file. */ #undef HAVE_GL_GL_H /* Defined if you have HDF5 support */ #undef HAVE_HDF5 /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `jn' function. */ #undef HAVE_JN /* Arpack is used for eigenvalue computation */ #undef HAVE_LIBARPACK /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* UMFPACK */ #undef HAVE_LIBUMFPACK /* Define to 1 if you have the `mallinfo' function. */ #undef HAVE_MALLINFO /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* the MKL intel lib is present for BLAS and LAPACK */ #undef HAVE_MKL /* mpi_double_complex */ #undef HAVE_MPI_DOUBLE_COMPLEX /* Define to 1 if you have the `mstats' function. */ #undef HAVE_MSTATS /* Define to 1 if you have the header file. */ #undef HAVE_OPENGL_GL_H /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the `second_' function. */ #undef HAVE_SECOND_ /* Define to 1 if you have the `srandomdev' function. */ #undef HAVE_SRANDOMDEV /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SUITESPARSE_UMFPACK_H /* Define to 1 if you have the `sysconf' function. */ #undef HAVE_SYSCONF /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* tetgen is compute tetrahedralize volume of an enclosed surface */ #undef HAVE_TETGEN /* Define to 1 if you have the header file. */ #undef HAVE_TETGEN_H /* Define to 1 if you have the `tgamma' function. */ #undef HAVE_TGAMMA /* Define to 1 if you have the `times' function. */ #undef HAVE_TIMES /* Define to 1 if you have the header file. */ #undef HAVE_UFSPARSE_UMFPACK_H /* Define to 1 if you have the header file. */ #undef HAVE_UMFPACK_H /* Define to 1 if you have the header file. */ #undef HAVE_UMFPACK_UMFPACK_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* the ffglut application for the new graphics */ #undef PROG_FFGLUT /* A pure windows applications no cygwin dll */ #undef PURE_WIN32 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Version number of package */ #undef VERSION /* FreeFem++ build date */ #undef VersionFreeFemDate /* FreeFem++ version as a float */ #undef VersionFreeFempp /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER freefem++-3.38-1/config.sub000755 000767 000024 00000074315 11406142255 015601 0ustar00hechtstaff000000 000000 #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-01-05' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: freefem++-3.38-1/configure000755 000767 000024 00002224371 12543260336 015532 0ustar00hechtstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for FreeFem++ 3.38-1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: hecht@ann.jussieu.fr about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='FreeFem++' PACKAGE_TARNAME='freefem++' PACKAGE_VERSION='3.38-1' PACKAGE_STRING='FreeFem++ 3.38-1' PACKAGE_BUGREPORT='hecht@ann.jussieu.fr' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS TOOL_DYLIB_schwarz TOOL_COMPILE_schwarz TOOL_DYLIB_pardiso TOOL_COMPILE_pardiso TOOL_DYLIB_NewSolver TOOL_COMPILE_NewSolver TOOL_DYLIB_gsl TOOL_COMPILE_gsl FFCS_WINDOWS_FALSE FFCS_WINDOWS_TRUE TOOL_DYLIB_iohdf5 TOOL_COMPILE_iohdf5 HDF5_FLIBS HDF5_FFLAGS HDF5_FC HDF5_LIBS HDF5_LDFLAGS HDF5_CPPFLAGS HDF5_CFLAGS HDF5_CC HDF5_VERSION H5FC H5CC SED TEST_FFPPMPI TEST_FFPP_MPI TEST_FFPP STDPROG BAMGPROG FFGLUTPROG MEDITPROG FNOFLAGS CNOFLAGS LIBC_VERSION KERNEL_VERSION SCOTCH_INCLUDE NO_RANGE_CHECK TOOL_DYLIB_yams TOOL_COMPILE_yams TOOL_DYLIB_umfpack TOOL_COMPILE_umfpack TOOL_DYLIB_superludist TOOL_COMPILE_superludist TOOL_DYLIB_superlu TOOL_COMPILE_superlu TOOL_DYLIB_scotch TOOL_COMPILE_scotch TOOL_DYLIB_pipe TOOL_COMPILE_pipe TOOL_DYLIB_pastix TOOL_COMPILE_pastix TOOL_DYLIB_parms TOOL_COMPILE_parms TOOL_DYLIB_nlopt TOOL_COMPILE_nlopt TOOL_DYLIB_mumps_seq TOOL_COMPILE_mumps_seq TOOL_DYLIB_mumps TOOL_COMPILE_mumps TOOL_DYLIB_gmm TOOL_COMPILE_gmm TOOL_DYLIB_mshmet TOOL_COMPILE_mshmet TOOL_DYLIB_mmg3d TOOL_COMPILE_mmg3d TOOL_DYLIB_parmetis TOOL_COMPILE_parmetis TOOL_DYLIB_lapack TOOL_COMPILE_lapack TOOL_DYLIB_ipopt TOOL_COMPILE_ipopt TOOL_DYLIB_hips TOOL_COMPILE_hips TOOL_DYLIB_fflapack TOOL_COMPILE_fflapack GSL_LIBS GSL_CFLAGS GSL_CONFIG STD_LIBS STD_LDFLAGS STD_GRAPH_OBJ HISTORY ff_history DOCPDF ff_pdflatex DOCPSGZ ff_gzip DOCPS ff_convert EPSTOPDF ff_pdf2ps ff_dvips ff_makeindex ff_latex DYLIB_SUFFIX LOAD_COMPILE LOAD_TESTS RANLIN ARFLAGS AR STATICTOOL ff_libtool FF_SECOND FF_MALLOC_H FF_HAVE_REGEX_H UMFPACKLIBS FF_UMFPACK_CONFIG DOWNLOAD_UMFPACK EIGENOBJ SKIP_TESTS_EIGEN ARPACKLIBS LAPACK_arpack_LIB ARPACKLIB FF_LAPACKdir DOWNLOAD_ARPACK LAPACKLIBS G2CLIB BLASINC BLASLIBS DOWNLOADED_BLAS_BUILT_SOURCES ff_unzip COMPILE_OPENBLAS DOWNLOADED_BLAS ff_git DOWNLOAD_FFTW DOWNLOADCOMPILE WGET ff_curl ff_wget FFCS_MPIOK_FALSE FFCS_MPIOK_TRUE SKIP_TESTS_MPI MPI_LIBFC MPI_LIBC MPI_LIB MPI_LIB_DIRS MPI_INCLUDE MPI_INC_DIR PASTIX_HOSTARCH MPICC MPIFC MPIF77 MPISCRIPT MPIPROG MPICXX MPIRUN LIBSGLUT LIBSPTHREAD EGREP GREP CXXCPP ADD_PACKAGE_NAME CXX11FLAGS WITH_CXX11 OPTIM_TYPE ff_prefix_dir WIN32DLLTARGET LIBSNOCONSOLE WINDRESOBJ FFGLUTNAME GCCNOCYGWIN YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX CFLAGSF77 FLIBS host_os host_vendor host_cpu host build_os build_vendor build_cpu build ac_ct_F77 FFLAGS F77 ac_ct_FC FCFLAGS FC ENABLE_FFCS_FALSE ENABLE_FFCS_TRUE ENABLE_FFCS SIZEOF_PTRINBIT SIZEOF_PTR SIZEOF_INT SIZEOF_LONG ff_patch ff_flex ff_bison ff_m4 am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE RANLIB AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_ffcs enable_fortran with_flib enable_c enable_cygwindll enable_profiling enable_m64 enable_m32 enable_debug enable_optim enable_generic with_suffix enable_opengl with_mpipath with_mpilibs with_mpilibsc with_mpiinc with_mpi enable_download with_petsc with_wget with_mkl with_cadna enable_system_fftw enable_system_blas enable_mkl_mlt with_blas enable_openblas with_lapack with_arpack enable_system_umfpack with_amd with_umfpack enable_static enable_pdf with_gsl_prefix with_gsl_exec_prefix enable_gsltest enable_fflapack with_fflapack_include with_fflapack_ldflags enable_hips with_hips_include with_hips_ldflags enable_ipopt with_ipopt_include with_ipopt_ldflags enable_lapack with_lapack_include with_lapack_ldflags enable_parmetis with_parmetis_include with_parmetis_ldflags enable_mmg3d with_mmg3d_include with_mmg3d_ldflags enable_mshmet with_mshmet_include with_mshmet_ldflags enable_gmm with_gmm_include with_gmm_ldflags enable_mumps with_mumps_include with_mumps_ldflags enable_mumps_seq with_mumps_seq_include with_mumps_seq_ldflags enable_nlopt with_nlopt_include with_nlopt_ldflags enable_parms with_parms_include with_parms_ldflags enable_pastix with_pastix_include with_pastix_ldflags enable_pipe with_pipe_include with_pipe_ldflags enable_scotch with_scotch_include with_scotch_ldflags enable_superlu with_superlu_include with_superlu_ldflags enable_superludist with_superludist_include with_superludist_ldflags enable_umfpack with_umfpack_include with_umfpack_ldflags enable_yams with_yams_include with_yams_ldflags with_hdf5 enable_iohdf5 with_iohdf5_include with_iohdf5_ldflags enable_gsl with_gsl_include with_gsl_ldflags enable_NewSolver with_NewSolver_include with_NewSolver_ldflags enable_pardiso with_pardiso_include with_pardiso_ldflags enable_schwarz with_schwarz_include with_schwarz_ldflags ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC FC FCFLAGS F77 FFLAGS YACC YFLAGS CXXCPP MPIRUN MPICXX MPIF77 MPIFC MPICC' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures FreeFem++ 3.38-1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/freefem++] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of FreeFem++ 3.38-1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-ffcs build FreeFem++ for use by FreeFem++-cs --disable-fortran No Fortran compiler available ( ARPACK need it) --disable-c No C compiler available (C BLAS need it) --enable-cygwindll Forces the use of the Cygwin DLL (not recommended) --enable-profiling Turn on profiling --enable-m64 Turn on 64 bits architecture --enable-m32 Turn on 32 bits architecture --enable-debug Turn on debug versions of FreeFem++ --enable-optim Turn on compiler optimization --enable-generic Turn off hardware-dependant optimization options --enable-opengl Enable/disable support for OpenGL --enable-download Download missing libraries (BLAS,ARPACK,UMFPACK,...) --disable-system-fftw Disable the automatic detection of FFTW --disable-system-blas Disable the search for a system-wide BLAS library --enable-mkl-mlt Link with the multithreaded instead of the monothreaded version of the MKL --disable-openblas Disable the automatic download of OpenBLAS --disable-system-umfpack Disable the automatic detection of umfpack, colmod, amd, .... --enable-static Build binaries with no shared library dependencies --disable-pdf Disable PDF documentation building --disable-gsltest Do not try to compile and run a test GSL program --disable-fflapack Do not use fflapack --disable-hips Do not use hips --disable-ipopt Do not use ipopt --disable-lapack Do not use lapack --disable-parmetis Do not use parmetis --disable-mmg3d Do not use mmg3d --disable-mshmet Do not use mshmet --disable-gmm Do not use gmm --disable-mumps Do not use mumps --disable-mumps_seq Do not use mumps_seq --disable-nlopt Do not use nlopt --disable-parms Do not use parms --disable-pastix Do not use pastix --disable-pipe Do not use pipe --disable-scotch Do not use scotch --disable-superlu Do not use superlu --disable-superludist Do not use superludist --disable-umfpack Do not use umfpack --disable-yams Do not use yams --disable-iohdf5 Do not use iohdf5 --disable-gsl Do not use gsl --disable-NewSolver Do not use NewSolver --disable-pardiso Do not use pardiso --disable-schwarz Do not use schwarz Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-flib= the fortran library --with-suffix=G3/G4/G4,P4,.. or --without-suffix (default no suffix to package name) --with-suffix=G3/G4/G4,P4,.. or --without-suffix (default no suffix package name) --with-mpipath= the path of mpich under windows (no command mpic++, ... ) --with-mpilibs= the libs to add to c++,fc, ... (to link with c++ - ex: -L/usr/local/lib -lmpi_f90 -lmpi_cxx -lmpi -lopen-rte -lopen-pal -lutil) --with-mpilibsc= the libs to add to c ... (to link with cc (for pastix lib) ex: -L/usr/local/lib -lmpi -lopen-rte -lopen-pal -lutil) --with-mpiinc= the include directory directive and preprocess directive (no mpicc++, just use the compiler)) --with-mpi=yes|no|mpic++|lam|mpich|openmpi|/usr/local/bin/mpic++|... or --without-mpi Choose MPI implementation (default is mpic++) --with-petsc= /usr/local/petsc --without-petsc --with-wget=command Replace "wget" with another command. Implies --enable-download --with-mkl= the MKL LIBPATH : (ie. /opt/intel/mkl/RR.r.y.xxx/lib/) --with-cadna= cadna library --without-cadna --with-blas=library Use a specific version of the Blas --with-lapack=library Use a specific version of Lapack --with-arpack=library Use a specific version of Arpack --with-amd=library Use a specific version of AMD --with-umfpack=library Use a specific version of Umfpack --with-gsl-prefix=PFX Prefix where GSL is installed (optional) --with-gsl-exec-prefix=PFX Exec prefix where GSL is installed (optional) --with-fflapack-include= Include directives for fflapack instead of automatic download --with-fflapack-ldflags= Link-time directives for fflapack instead of automatic download --with-hips-include= Include directives for hips instead of automatic download --with-hips-ldflags= Link-time directives for hips instead of automatic download --with-ipopt-include= Include directives for ipopt instead of automatic download --with-ipopt-ldflags= Link-time directives for ipopt instead of automatic download --with-lapack-include= Include directives for lapack instead of automatic download --with-lapack-ldflags= Link-time directives for lapack instead of automatic download --with-parmetis-include= Include directives for parmetis instead of automatic download --with-parmetis-ldflags= Link-time directives for parmetis instead of automatic download --with-mmg3d-include= Include directives for mmg3d instead of automatic download --with-mmg3d-ldflags= Link-time directives for mmg3d instead of automatic download --with-mshmet-include= Include directives for mshmet instead of automatic download --with-mshmet-ldflags= Link-time directives for mshmet instead of automatic download --with-gmm-include= Include directives for gmm instead of automatic download --with-gmm-ldflags= Link-time directives for gmm instead of automatic download --with-mumps-include= Include directives for mumps instead of automatic download --with-mumps-ldflags= Link-time directives for mumps instead of automatic download --with-mumps_seq-include= Include directives for mumps_seq instead of automatic download --with-mumps_seq-ldflags= Link-time directives for mumps_seq instead of automatic download --with-nlopt-include= Include directives for nlopt instead of automatic download --with-nlopt-ldflags= Link-time directives for nlopt instead of automatic download --with-parms-include= Include directives for parms instead of automatic download --with-parms-ldflags= Link-time directives for parms instead of automatic download --with-pastix-include= Include directives for pastix instead of automatic download --with-pastix-ldflags= Link-time directives for pastix instead of automatic download --with-pipe-include= Include directives for pipe instead of automatic download --with-pipe-ldflags= Link-time directives for pipe instead of automatic download --with-scotch-include= Include directives for scotch instead of automatic download --with-scotch-ldflags= Link-time directives for scotch instead of automatic download --with-superlu-include= Include directives for superlu instead of automatic download --with-superlu-ldflags= Link-time directives for superlu instead of automatic download --with-superludist-include= Include directives for superludist instead of automatic download --with-superludist-ldflags= Link-time directives for superludist instead of automatic download --with-umfpack-include= Include directives for umfpack instead of automatic download --with-umfpack-ldflags= Link-time directives for umfpack instead of automatic download --with-yams-include= Include directives for yams instead of automatic download --with-yams-ldflags= Link-time directives for yams instead of automatic download --with-hdf5=yes/no/PATH location of h5cc or h5pcc for HDF5 configuration --with-iohdf5-include= Include directives for iohdf5 instead of automatic download --with-iohdf5-ldflags= Link-time directives for iohdf5 instead of automatic download --with-gsl-include= Include directives for gsl instead of automatic download --with-gsl-ldflags= Link-time directives for gsl instead of automatic download --with-NewSolver-include= Include directives for NewSolver instead of automatic download --with-NewSolver-ldflags= Link-time directives for NewSolver instead of automatic download --with-pardiso-include= Include directives for pardiso instead of automatic download --with-pardiso-ldflags= Link-time directives for pardiso instead of automatic download --with-schwarz-include= Include directives for schwarz instead of automatic download --with-schwarz-ldflags= Link-time directives for schwarz instead of automatic download Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CXXCPP C++ preprocessor MPIRUN MPI run command MPICXX MPI C++ compiler command MPIF77 MPI Fortran 77 compiler command MPIFC MPI Fortran 90 compiler command MPICC MPI C compiler command in $ff_mpi_path Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF FreeFem++ configure 3.38-1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES # ---------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_cxx_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_compile # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_f77_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_f77_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_f77_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_link # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------- ## ## Report this to hecht@ann.jussieu.fr ## ## ----------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_fc_try_link LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by FreeFem++ $as_me 3.38-1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # progg test expact under windows ff_TEST_FFPP="../src/nw/FreeFem++" ff_TEST_FFPP_MPI="../src/mpi/FreeFem++-mpi" # Automake 1.11 is too old for check ... # ALH - 10/9/13 - FFCS needs to skip this automake version requirement when compiling on older platforms (eg cygwin or # last Ubuntu LTS). So we fix a low hardcoded requirement and test for higher versions when not in FFCS. am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='freefem++' VERSION='3.38-1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi if test "$enable_ffcs" != yes then if test `echo $am__api_version|awk '{if($1>1.13)print "ok";}'` != ok then as_fn_error $? "Automake version needs to be 1.13 or later to enable \"make check\"" "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ff_where_lib_conf=examples++-load/WHERE_LIBRARY-config ff_HOSTARCH_pastix= echo "# Build with freefem++ with ./configure " `date` >$ff_where_lib_conf # To allow anonymous CVS version to contain a "./configure" and # Makefiles { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE echo >config_LIB_INFO # Necessary compilers ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test `uname` != Darwin; then ff_ldeg="-Wl,--end-group" ff_ldbg="-Wl,--start-group" fi # Extract the first word of "m4", so it can be a program name with args. set dummy m4; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_m4+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_m4"; then ac_cv_prog_ff_m4="$ff_m4" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_m4="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_m4" && ac_cv_prog_ff_m4="no" fi fi ff_m4=$ac_cv_prog_ff_m4 if test -n "$ff_m4"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_m4" >&5 $as_echo "$ff_m4" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "bison", so it can be a program name with args. set dummy bison; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_bison+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_bison"; then ac_cv_prog_ff_bison="$ff_bison" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_bison="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_bison" && ac_cv_prog_ff_bison="no" fi fi ff_bison=$ac_cv_prog_ff_bison if test -n "$ff_bison"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_bison" >&5 $as_echo "$ff_bison" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "flex", so it can be a program name with args. set dummy flex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_flex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_flex"; then ac_cv_prog_ff_flex="$ff_flex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_flex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_flex" && ac_cv_prog_ff_flex="no" fi fi ff_flex=$ac_cv_prog_ff_flex if test -n "$ff_flex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_flex" >&5 $as_echo "$ff_flex" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "patch", so it can be a program name with args. set dummy patch; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_patch+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_patch"; then ac_cv_prog_ff_patch="$ff_patch" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_patch="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_patch" && ac_cv_prog_ff_patch="no" fi fi ff_patch=$ac_cv_prog_ff_patch if test -n "$ff_patch"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_patch" >&5 $as_echo "$ff_patch" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case "$ff_m4 $ff_bison $ff_patch $ff_flex" in *no*) { $as_echo "$as_me:${as_lineno-$LINENO}: to install missing package under debian or ubuntu, try " >&5 $as_echo "$as_me: to install missing package under debian or ubuntu, try " >&6;} test "$ff_m4" = no && { $as_echo "$as_me:${as_lineno-$LINENO}: sudo apt-get install m4" >&5 $as_echo "$as_me: sudo apt-get install m4" >&6;} test "$ff_bison" = no && { $as_echo "$as_me:${as_lineno-$LINENO}: sudo apt-get install bison" >&5 $as_echo "$as_me: sudo apt-get install bison" >&6;} test "$ff_flex" = no && { $as_echo "$as_me:${as_lineno-$LINENO}: sudo apt-get install flex" >&5 $as_echo "$as_me: sudo apt-get install flex" >&6;} test "$ff_patch" = no && { $as_echo "$as_me:${as_lineno-$LINENO}: sudo apt-get install patch" >&5 $as_echo "$as_me: sudo apt-get install patch" >&6;} as_fn_error $? " Sorry missing m4,bison,flex,patch command !" "$LINENO" 5;; esac if test -z "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: fatal error : c++ compiler ! " >&5 $as_echo "$as_me: fatal error : c++ compiler ! " >&6;}; as_fn_error $? " Sorry no c++ compiler !" "$LINENO" 5 fi if ac_fn_cxx_compute_int "$LINENO" "sizeof(long)" "ff_size_long" ""; then : fi if ac_fn_cxx_compute_int "$LINENO" "sizeof(int)" "ff_size_int" ""; then : fi if ac_fn_cxx_compute_int "$LINENO" "sizeof(int*)" "ff_size_ptr" ""; then : fi SIZEOF_LONG=$ff_size_long SIZEOF_INT=$ff_size_int SIZEOF_PTR=$ff_size_ptr if test "$ff_size_ptr" -eq 4 ;then SIZEOF_PTRINBIT=32 elif test "$ff_size_ptr" -eq 8 ;then SIZEOF_PTRINBIT=64 else { $as_echo "$as_me:${as_lineno-$LINENO}: fatal error : sizeof pointer $ff_size_ptr ! or no c++ compiler: $CXX " >&5 $as_echo "$as_me: fatal error : sizeof pointer $ff_size_ptr ! or no c++ compiler: $CXX " >&6;}; as_fn_error $? " Sorry sizeof c++ pointer $ff_size_ptr are not 4 or 8 " "$LINENO" 5 fi # FFCS - build the code for FreeFem++-cs # Check whether --enable-ffcs was given. if test "${enable_ffcs+set}" = set; then : enableval=$enable_ffcs; fi if test "$enable_ffcs" = yes then cat >>confdefs.h <<_ACEOF #define ENABLE_FFCS $enable_ffcs _ACEOF else enable_ffcs=no fi ENABLE_FFCS="$enable_ffcs" if test $enable_ffcs = yes; then ENABLE_FFCS_TRUE= ENABLE_FFCS_FALSE='#' else ENABLE_FFCS_TRUE='#' ENABLE_FFCS_FALSE= fi # dur dur car sous MacOsX le fortran n'est pas standard. ff_AR="ar" ff_ARFLAGS="rv" ff_RANLIB="ranlib" # Check whether --enable-fortran was given. if test "${enable_fortran+set}" = set; then : enableval=$enable_fortran; fi ff_g2c_lib=""; if test "$enable_fortran" != no then # ALH-FFCS-2/3/10: add gfortran-mp-4.4 for MacPorts on MacOS 10.6 # FH add iforr ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran f90 xlf90 g95 ifort gfortran-mp-4.4 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done fi if test -z "$FC"; then ac_ct_FC=$FC for ac_prog in gfortran f90 xlf90 g95 ifort gfortran-mp-4.4 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_FC"; then ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_FC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FC=$ac_cv_prog_ac_ct_FC if test -n "$ac_ct_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 $as_echo "$ac_ct_FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_FC" && break done if test "x$ac_ct_FC" = x; then FC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FC=$ac_ct_FC fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } if ${ac_cv_fc_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_fc_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 $as_echo "$ac_cv_fc_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+set} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 $as_echo_n "checking whether $FC accepts -g... " >&6; } if ${ac_cv_prog_fc_g+:} false; then : $as_echo_n "(cached) " >&6 else FCFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_prog_fc_g=yes else ac_cv_prog_fc_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 $as_echo "$ac_cv_prog_fc_g" >&6; } if test "$ac_test_FCFLAGS" = set; then FCFLAGS=$ac_save_FCFLAGS elif test $ac_cv_prog_fc_g = yes; then if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-g -O2" else FCFLAGS="-g" fi else if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-O2" else FCFLAGS= fi fi if test $ac_compiler_gnu = yes; then GFC=yes else GFC= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran f90 xlf xlf90 g95 f77 fort77 "$FC" ifort gfortran-mp-4.4 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 $as_echo "$F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in gfortran f90 xlf xlf90 g95 f77 fort77 "$FC" ifort gfortran-mp-4.4 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 $as_echo "$ac_ct_F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } if ${ac_cv_f77_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 $as_echo "$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 $as_echo_n "checking whether $F77 accepts -g... " >&6; } if ${ac_cv_prog_f77_g+:} false; then : $as_echo_n "(cached) " >&6 else FFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_g=yes else ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 $as_echo "$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi if test $ac_compiler_gnu = yes; then G77=yes else G77= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # if test -n "$F77" # then ff_flibs="" # modif FH # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $F77" >&5 $as_echo_n "checking how to get verbose linking output from $F77... " >&6; } if ${ac_cv_prog_f77_v+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_v= # Try some options frequently used verbose output for ac_verb in -v -verbose --verbose -V -\#\#\#; do cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS $ac_verb" eval "set x $ac_link" shift $as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` $as_echo "$ac_f77_v_output" >&5 FFLAGS=$ac_save_FFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_f77_v_output="`echo $ac_f77_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_f77_v_output in # With xlf replace commas with spaces, # and remove "-link" and closing parenthesis. *xlfentry*) ac_f77_v_output=`echo $ac_f77_v_output | sed ' s/,/ /g s/ -link / /g s/) *$// ' ` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_f77_v_output=`echo $ac_f77_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. *fort77*f2c*gcc*) ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' /:[ ]\+Running[ ]\{1,\}"gcc"/{ /"-c"/d /[.]c"*/d s/^.*"gcc"/"gcc"/ s/"//gp }'` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; esac # look for -l* and *.a constructs in the output for ac_arg in $ac_f77_v_output; do case $ac_arg in [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) ac_cv_prog_f77_v=$ac_verb break 2 ;; esac done done if test -z "$ac_cv_prog_f77_v"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $F77" >&5 $as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $F77" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 $as_echo "$as_me: WARNING: compilation failed" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_v" >&5 $as_echo "$ac_cv_prog_f77_v" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 libraries of $F77" >&5 $as_echo_n "checking for Fortran 77 libraries of $F77... " >&6; } if ${ac_cv_f77_libs+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$FLIBS" != "x"; then ac_cv_f77_libs="$FLIBS" # Let the user override the test. else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS $ac_cv_prog_f77_v" eval "set x $ac_link" shift $as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` $as_echo "$ac_f77_v_output" >&5 FFLAGS=$ac_save_FFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_f77_v_output="`echo $ac_f77_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_f77_v_output in # With xlf replace commas with spaces, # and remove "-link" and closing parenthesis. *xlfentry*) ac_f77_v_output=`echo $ac_f77_v_output | sed ' s/,/ /g s/ -link / /g s/) *$// ' ` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_f77_v_output=`echo $ac_f77_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. *fort77*f2c*gcc*) ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' /:[ ]\+Running[ ]\{1,\}"gcc"/{ /"-c"/d /[.]c"*/d s/^.*"gcc"/"gcc"/ s/"//gp }'` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; esac ac_cv_f77_libs= # Save positional arguments (if any) ac_save_positional="$@" set X $ac_f77_v_output while test $# != 1; do shift ac_arg=$1 case $ac_arg in [\\/]*.a | ?:[\\/]*.a) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi ;; -bI:*) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_arg; do ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" done else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi fi ;; # Ignore these flags. -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ |-LANG:=* | -LIST:* | -LNO:* | -link) ;; -lkernel32) case $host_os in *cygwin*) ;; *) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; esac ;; -[LRuYz]) # These flags, when seen by themselves, take an argument. # We remove the space between option and argument and re-iterate # unless we find an empty arg or a new option (starting with -) case $2 in "" | -*);; *) ac_arg="$ac_arg$2" shift; shift set X $ac_arg "$@" ;; esac ;; -YP,*) for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_j" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_arg="$ac_arg $ac_j" ac_cv_f77_libs="$ac_cv_f77_libs $ac_j" fi done ;; -[lLR]*) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi ;; -zallextract*| -zdefaultextract) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; # Ignore everything else. esac done # restore positional arguments set X $ac_save_positional; shift # We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, # then we insist that the "run path" must be an absolute path (i.e. it # must begin with a "/"). case `(uname -sr) 2>/dev/null` in "SunOS 5"*) ac_ld_run_path=`$as_echo "$ac_f77_v_output" | sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` test "x$ac_ld_run_path" != x && if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_ld_run_path; do ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" done else ac_cv_f77_libs="$ac_cv_f77_libs $ac_ld_run_path" fi ;; esac fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_libs" >&5 $as_echo "$ac_cv_f77_libs" >&6; } FLIBS="$ac_cv_f77_libs" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # correct pb of double def under macos case $F77 in *fort77) if test -z "$FLIBS" ; then # FLIBS=`fort77 -v a.out 2>&1|awk '/a.out/ && /fort77/ { print $(NF-2),$(NF-1)}'` # FH to remove " " FLIBS=`fort77 -v a.out 2>&1|awk '/a.out/ && /fort77/ { print "echo",$(NF-2),$(NF-1)}'|sh` { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: fort77 FLIBS : $FLIBS " >&5 $as_echo "$as_me: WARNING: fort77 FLIBS : $FLIBS " >&2;} fi ;; *g77) for i in $FLIBS; do case $i in # save last directory of the list -L*) d=`expr $i : '-L\(.*\)'`; echo " try $d " if test -e "$d/libg2c.so" ; then ff_flibs="$d/libg2c.so" elif test -e "$d/libg2c.dylib" ; then ff_flibs="$d/libg2c.dylib" elif test -e "$d/libg2c.a" ; then ff_flibs="$d/libg2c.a" elif test -e $d/libg2c.so -o -e $d/libg2c.a ; then ff_flibs="$i" fi;; esac done if test -e "$ff_flibs" ;then FLIBS="$ff_flibs" else FLIBS="$ff_flibs -lg2c" fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: get dir of -lg2c FLIBS : $FLIBS " >&5 $as_echo "$as_me: WARNING: get dir of -lg2c FLIBS : $FLIBS " >&2;} ;; # add FH sep 2006 / modif 2009 *gfortran) for i in $FLIBS; do case $i in -L*) d=`expr $i : '-L\(.*\)'`; if test -e "$d/libgfortran.so" ; then ff_flibs="$d/libgfortran.so" elif test -e "$d/libgfortran.dylib" ; then ff_flibs="$d/libgfortran.dylib" elif test -e "$d/libgfortran.a" ; then ff_flibs="$d/libgfortran.a" elif test -e $d/libgfortran.so -o -e $d/libgfortran.a -o -e $d/libgfortran.dylib ; then ff_flibs="$i" fi;; esac done if test -e "$ff_flibs" ;then FLIBS="$ff_flibs" else FLIBS="$ff_flibs -lgfortran" fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: get dir of -lgfortran FLIBS : $FLIBS " >&5 $as_echo "$as_me: WARNING: get dir of -lgfortran FLIBS : $FLIBS " >&2;} ;; esac # Check whether --with-flib was given. if test "${with_flib+set}" = set; then : withval=$with_flib; fi # correct FH sep 2006 -o -> -a if test "$with_flib" != no -a -n "$with_flib" then ff_g2c_lib="$with_flib" FLIBS="$with_flib" fi # add FH oct 2007 for download f2c if test -z "$F77" ; then ff_f77=`pwd`/download/bin/fort77 ff_flibs=`pwd`/download/lib/libf2c.a if test -x $ff_f77 -a -f $ff_flibs ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no fortran, but find download f2c/fort" >&5 $as_echo "$as_me: WARNING: no fortran, but find download f2c/fort" >&2;}; F77=$ff_f77 FLIBS=$ff_flibs else { $as_echo "$as_me:${as_lineno-$LINENO}: fatal error : no fortran " >&5 $as_echo "$as_me: fatal error : no fortran " >&6;}; { $as_echo "$as_me:${as_lineno-$LINENO}: add --disable-fortran " >&5 $as_echo "$as_me: add --disable-fortran " >&6;}; { $as_echo "$as_me:${as_lineno-$LINENO}: or try to compile f2c in directory download/f2c " >&5 $as_echo "$as_me: or try to compile f2c in directory download/f2c " >&6;}; { $as_echo "$as_me:${as_lineno-$LINENO}: just do: make install " >&5 $as_echo "$as_me: just do: make install " >&6;}; as_fn_error 1 " Fatal error No Fortran compiler . " "$LINENO" 5; fi fi # check if the FLIBS is correct ff_libs="$LIBS" LIBS="$ff_libs $FLIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_err= else ff_err=ok fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext; if test "$ff_err" = "ok" ; then as_fn_error 1 " Fatal FLIBS: $FLIBS is incorrect. " "$LINENO" 5; fi LIBS="$ff_libs" echo "F77 LD $ff_libs" >config_LIB_INFO { $as_echo "$as_me:${as_lineno-$LINENO}: checking Size of fortran 77 integer " >&5 $as_echo_n "checking Size of fortran 77 integer ... " >&6; } ## AC_LANG(fortran); ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$cross_compiling" = yes; then : ff_f77intsize=4 else cat > conftest.$ac_ext <<_ACEOF program test integer p,i p=1024*1024 i= p*p open(7,file="conftest.out") if (i>0) then write(7,*) 8 else write(7,*) 4 endif close(7) end _ACEOF if ac_fn_f77_try_run "$LINENO"; then : ff_f77intsize=`cat conftest.out` else ff_f77intsize=4 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ## AC_LANG(C++) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_f77intsize" >&5 $as_echo "$ff_f77intsize" >&6; } ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran 77 libraries" >&5 $as_echo_n "checking for dummy main to link with Fortran 77 libraries... " >&6; } if ${ac_cv_f77_dummy_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_f77_dm_save_LIBS=$LIBS LIBS="$LIBS $FLIBS" ac_fortran_dm_var=F77_DUMMY_MAIN ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # First, try linking without a dummy main: cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=none else ac_cv_fortran_dummy_main=unknown fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_cv_fortran_dummy_main = unknown; then for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define $ac_fortran_dm_var $ac_func #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=$ac_func; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu ac_cv_f77_dummy_main=$ac_cv_fortran_dummy_main rm -rf conftest* LIBS=$ac_f77_dm_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_dummy_main" >&5 $as_echo "$ac_cv_f77_dummy_main" >&6; } F77_DUMMY_MAIN=$ac_cv_f77_dummy_main if test "$F77_DUMMY_MAIN" != unknown; then : if test $F77_DUMMY_MAIN != none; then cat >>confdefs.h <<_ACEOF #define F77_DUMMY_MAIN $F77_DUMMY_MAIN _ACEOF if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then $as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h fi fi else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "linking to Fortran libraries from C fails See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 name-mangling scheme" >&5 $as_echo_n "checking for Fortran 77 name-mangling scheme... " >&6; } if ${ac_cv_f77_mangling+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF subroutine foobar() return end subroutine foo_bar() return end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : mv conftest.$ac_objext cfortran_test.$ac_objext ac_save_LIBS=$LIBS LIBS="cfortran_test.$ac_objext $LIBS $FLIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success=no for ac_foobar in foobar FOOBAR; do for ac_underscore in "" "_"; do ac_func="$ac_foobar$ac_underscore" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_success=yes; break 2 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done done ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$ac_success" = "yes"; then case $ac_foobar in foobar) ac_case=lower ac_foo_bar=foo_bar ;; FOOBAR) ac_case=upper ac_foo_bar=FOO_BAR ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success_extra=no for ac_extra in "" "_"; do ac_func="$ac_foo_bar$ac_underscore$ac_extra" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_success_extra=yes; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$ac_success_extra" = "yes"; then ac_cv_f77_mangling="$ac_case case" if test -z "$ac_underscore"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" fi if test -z "$ac_extra"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" fi else ac_cv_f77_mangling="unknown" fi else ac_cv_f77_mangling="unknown" fi LIBS=$ac_save_LIBS rm -rf conftest* rm -f cfortran_test* else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compile a simple Fortran program See \`config.log' for more details" "$LINENO" 5; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_mangling" >&5 $as_echo "$ac_cv_f77_mangling" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu case $ac_cv_f77_mangling in "lower case, no underscore, no extra underscore") $as_echo "#define F77_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") $as_echo "#define F77_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") $as_echo "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") $as_echo "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") $as_echo "#define F77_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") $as_echo "#define F77_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") $as_echo "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") $as_echo "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define F77_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 $as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} ;; esac ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ff_cfagsf77="" case $ac_cv_f77_mangling in # "lower case, no underscore, no extra underscore") # "lower case, no underscore, extra underscore") # ;; "lower case, underscore, no extra underscore") ff_cfagsf77="-DAdd_";; "lower case, underscore, extra underscore") ff_cfagsf77="-DAdd__ -Df77IsF2C";; "upper case, no underscore, no extra underscore") ff_cfagsf77="-DUPPER";; "upper case, no underscore, extra underscore") ff_cfagsf77="-DUPPER -DAdd__";; "upper case, underscore, no extra underscore") ff_cfagsf77="-DUPPER -DAdd_";; "upper case, underscore, extra underscore") ff_cfagsf77="-DUPPER -DAdd__";; *) ;; esac CFLAGSF77=$ff_cfagsf77 if test $ff_f77intsize -ne 4 then as_fn_error 1 " Fatal Error: Your fortran 77 compiler have by not 4 bytes integer ( $ff_f77intsize bytes) " "$LINENO" 5; fi test -f /mingw/bin/libpthread-2.dll && ff_pthread_dll=/mingw/bin/libpthread-2.dll ; \ if test -z "$ff_where_lib_conf_f77" ; then echo "f77 LD $FLIBS" >>$ff_where_lib_conf test -n "$ff_cfagsf77 $ff_pthread_dll" && echo "f77 INCLUDE $ff_cfagsf77 $ff_pthread_dll " >>$ff_where_lib_conf ff_where_lib_conf_f77=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add f77 : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add f77 : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add f77 : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add f77 : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_fc" ; then echo "fc LD $FLIBS" >>$ff_where_lib_conf test -n "$ff_cfagsf77 $ff_pthread_dll" && echo "fc INCLUDE $ff_cfagsf77 $ff_pthread_dll " >>$ff_where_lib_conf ff_where_lib_conf_fc=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add fc : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add fc : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add fc : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add fc : $FLIBS $ff_cfagsf77 $ff_pthread_dll in $ff_where_lib_conf \"" >&6;} fi fi # fin test FORTRAN .......... # ---------------------------- # Check whether --enable-c was given. if test "${enable_c+set}" = set; then : enableval=$enable_c; fi if test "$enable_c" != no then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi else # We need to define this otherwise ./configure crashes with # the message "configure: error: conditional "am__fastdepCC" # was never defined". am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Some useful libraries { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : ff_pthread="-lpthread" else ff_pthread="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for omp_get_wtime in -liomp5" >&5 $as_echo_n "checking for omp_get_wtime in -liomp5... " >&6; } if ${ac_cv_lib_iomp5_omp_get_wtime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liomp5 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char omp_get_wtime (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return omp_get_wtime (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_iomp5_omp_get_wtime=yes else ac_cv_lib_iomp5_omp_get_wtime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iomp5_omp_get_wtime" >&5 $as_echo "$ac_cv_lib_iomp5_omp_get_wtime" >&6; } if test "x$ac_cv_lib_iomp5_omp_get_wtime" = xyes; then : ff_iomp5="-liomp5" else ff_iomp5="" fi if test -n "$ff_pthread" ; then if test -z "$ff_where_lib_conf_pthread" ; then echo "pthread LD $ff_pthread" >>$ff_where_lib_conf test -n "" && echo "pthread INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_pthread=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add pthread : $ff_pthread in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add pthread : $ff_pthread in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add pthread : $ff_pthread in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add pthread : $ff_pthread in $ff_where_lib_conf \"" >&6;} fi fi # Necessary absolute pathname for local directory when some libraries # are used from several different locations (for instance locally in # configure.ac and in a subdir). curdir=`pwd` # Configure options # ----------------- echo $ac_configure_args > configure.param # by default the suffix of the .so lib file is .so # it is .dll under windows # it is .dylib under macos X ff_suffix_dylib="so"; # Checking wether we can produce a MacIntosh-specific version # ----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking wether we are on a MacIntosh" >&5 $as_echo_n "checking wether we are on a MacIntosh... " >&6; } ff_mac=no if test `uname` = Darwin; then ff_HOSTARCH_pastix=i686_mac ff_suffix_dylib="dylib" ff_mac=yes cat >>confdefs.h <<_ACEOF #define FF_PREFIX_DIR_APPLE "/Applications/FreeFem++.app/Contents/" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_mac" >&5 $as_echo "$ff_mac" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking wether we are on SunOS" >&5 $as_echo_n "checking wether we are on SunOS... " >&6; } ff_sunos=no if test `uname -s` = SunOS; then ff_sunos=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_sunos" >&5 $as_echo "$ff_sunos" >&6; } # Checking wether we can produce a Microsoft Windows-specific version # ------------------------------------------------------------------- # Check whether --enable-cygwindll was given. if test "${enable_cygwindll+set}" = set; then : enableval=$enable_cygwindll; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking wether we are on Microsoft Windows" >&5 $as_echo_n "checking wether we are on Microsoft Windows... " >&6; } ff_uname=`uname` # flag to build window 32 version ff_mingw = yes ff_mingw=no case $ff_uname in CYGWIN*) # FFCS - 17/1/12 - -mno-cygwin is not recognised by the latest version of mingw32 if test $enable_ffcs = no then ff_nocygwin=-mno-cygwin fi GCCNOCYGWIN=$ff_nocygwin ;; MINGW*) enable_cygwindll=no;; esac case $ff_uname in CYGWIN*|MINGW*) ff_suffix_dylib="dll"; ff_win32=yes; # FFCS - 8/3/12 - remove -D_MSC_VER under MinGW64 because it forces system calls to be compiled into any object # (which creates thousands of duplicate definitions for sytem calls like time()). # We need Mingw to avoid Cygwin's extra DLLs if test "$enable_cygwindll" != yes then # CHECK_COMPILE_FLAG(C++,-mwindows,CXXFLAGS) ff_glut_ok=yes # FFCS: on Windows, FF crashes when compiling GL/glut.h and the option "--disable-opengl" is not # operational because ff_glut_ok is forced to yes here. if test $enable_ffcs = yes then ff_glut_ok=no enable_opengl=no fi ff_mingw=yes enable_cygwindll=no; ff_pthread="-mthreads" # FFCS does not use the Cygwin MinGW compilers any more if test $enable_ffcs = no then CXXFLAGS="$CXXFLAGS $ff_nocygwin -I/usr/include/mingw" FFLAGS="$FFLAGS $ff_nocygwin" CFLAGS="$CFLAGS $ff_nocygwin -I/usr/include/mingw" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int a; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ff_nocygwin=""; { $as_echo "$as_me:${as_lineno-$LINENO}: Sorry $ff_nocygwin optio is wrong try whitout , but try with gcc-3.3" >&5 $as_echo "$as_me: Sorry $ff_nocygwin optio is wrong try whitout , but try with gcc-3.3" >&6;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$CXXFLAGS $ff_nocygwin -I/usr/include/mingw" FFLAGS="$FFLAGS $ff_nocygwin" CFLAGS="$CFLAGS $ff_nocygwin -I/usr/include/mingw" CNOFLAGS="$CNOFLAGS $ff_nocygwin -I/usr/include/mingw" fi LIBS="$LIBS $ff_nocygwin -mthreads -lws2_32 -lcomdlg32" LIBSNOCONSOLE="-mwindows" # FFCS uses a specific compiler, so we specify its libraries explicitely if test $enable_ffcs = no then test -z "$MPIRUN" && MPIRUN=`which mpiexe.exe` if test "$enable_fortran" != no -o "$with_flib" != no ; then case "$F77" in *gfortran) FLIBS="$ff_nocygwin -lgfortran";; *g77) FLIBS="$ff_nocygwin -lg2c";; *) as_fn_error $? " Sorry no known FLIBS with this $F77 !" "$LINENO" 5 ;; esac fi fi ff_glutname="glut32" # check abort a existing function just to find in glut32.dll exist in the path # because glutInit is not the real symbol on win32 dur dur FH !!!!!!!!! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for abort in -lglut32" >&5 $as_echo_n "checking for abort in -lglut32... " >&6; } if ${ac_cv_lib_glut32_abort+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lglut32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char abort (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return abort (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_glut32_abort=yes else ac_cv_lib_glut32_abort=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_glut32_abort" >&5 $as_echo "$ac_cv_lib_glut32_abort" >&6; } if test "x$ac_cv_lib_glut32_abort" = xyes; then : ff_glut="-l$ff_glutname -mthreads -lglu32 -lopengl32" else ff_glut="" fi if test -z "$ff_glut" ; then ff_glutname="freeglut" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for abort in -lfreeglut" >&5 $as_echo_n "checking for abort in -lfreeglut... " >&6; } if ${ac_cv_lib_freeglut_abort+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreeglut $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char abort (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return abort (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_freeglut_abort=yes else ac_cv_lib_freeglut_abort=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freeglut_abort" >&5 $as_echo "$ac_cv_lib_freeglut_abort" >&6; } if test "x$ac_cv_lib_freeglut_abort" = xyes; then : ff_glut="-l$ff_glutname -mthreads -lglu32 -lopengl32" else ff_glut_ok=no fi fi # Resources for FreeFem++-cs in Microsoft Windows format FFGLUTNAME=$ff_glutname WINDRESOBJ=windres.o LIBSNOCONSOLE=$LIBSNOCONSOLE WIN32DLLTARGET=win32-dll-target ff_TEST_FFPP="../src/bin-win32/FreeFem++.exe" ff_TEST_FFPP_MPI="../src/bin-win32/FreeFem++-mpi.exe" $as_echo "#define PURE_WIN32 1" >>confdefs.h ff_dynload=yes fi ;; *)ff_win32=no;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_win32" >&5 $as_echo "$ff_win32" >&6; } if test "$ff_win32" = no then enable_cygwindll=no fi # FreeFem++-specific version information # -------------------------------------- # Version numbering, converted to a floating point value ff_numver="`echo $VERSION|sed 's/-\(.*\)/+\1.0*0.000001/'`" cat >>confdefs.h <<_ACEOF #define VersionFreeFempp $ff_numver _ACEOF # Since src/fflib/strversionnumber.cpp is recreated at each build, this # date is only useful for config-version.h test "$prefix" = NONE && prefix="$ac_default_prefix" ff_prefix_dir="${prefix}/lib/ff++/$VERSION" { $as_echo "$as_me:${as_lineno-$LINENO}: checking prefix dir freefem++ " >&5 $as_echo_n "checking prefix dir freefem++ ... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_prefix_dir" >&5 $as_echo "$ff_prefix_dir" >&6; } FF_DATE=`date` cat >>confdefs.h <<_ACEOF #define VersionFreeFemDate "$FF_DATE" _ACEOF cat >>confdefs.h <<_ACEOF #define FF_PREFIX_DIR "${ff_prefix_dir}" _ACEOF ff_prefix_dir=$ff_prefix_dir # Separate configuration header file for version information, included # in config-macos9.h cat << EOF > config-version.h /* FreeFem++ version information for MacOS 9 configuration */ /* File generated by configure.ac */ /* Define to the full name and version of this package. */ #define PACKAGE_STRING "$PACKAGE_STRING" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "$PACKAGE_TARNAME" /* Define to the version of this package. */ #define PACKAGE_VERSION "$PACKAGE_VERSION" /* Version number of package */ #define VERSION "$VERSION" /* FreeFem++ build date */ #define VersionFreeFemDate "$FF_DATE" /* FreeFem++ version as a float */ #define VersionFreeFempp ($ff_numver) EOF # Checking wether to produce a debug version # ------------------------------------------ # Generic or hardware-dependant optimization # Checks whether a compiler accepts a given flag # ---------------------------------------------- # $1 = compiler name # $2 = flag # $3 = make macro containing flags for that compiler # $4 = exec is true .. # Note: changes AC_LANG() # Choosing debugging and/or optimization flags for compilation # ------------------------------------------------------------ # Check whether --enable-profiling was given. if test "${enable_profiling+set}" = set; then : enableval=$enable_profiling; fi if test "$enable_profiling" = yes then CXXFLAGS="$CXXFLAGS -pg" LDFLAGS="$LDFLAGS -pg" fi if test "$enable_m64" = yes -a "$enable_m32" then as_fn_error 1 " Choose 32 or 64 architecture not the both " "$LINENO" 5; fi # Check whether --enable-m64 was given. if test "${enable_m64+set}" = set; then : enableval=$enable_m64; fi if test "$enable_m64" = yes then ff_m64=-m64 ff_ok=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $ff_m64" >&5 $as_echo_n "checking whether the C compiler accepts $ff_m64... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS $ff_m64" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "ff_ok" ; then ff_ok="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$ff_ok" = yes ;then CNOFLAGS="$CFLAGS $ff_m64";fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts $ff_m64" >&5 $as_echo_n "checking whether the C++ compiler accepts $ff_m64... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS $ff_m64" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts $ff_m64" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts $ff_m64... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS $ff_m64" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # add -fPIC on on 64 architecture if test "$ff_ok" = yes ;then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -fPIC" >&5 $as_echo_n "checking whether the C compiler accepts -fPIC... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "ff_ok" ; then ff_ok="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -fPIC" >&5 $as_echo_n "checking whether the C++ compiler accepts -fPIC... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -fPIC" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -fPIC... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi # Check whether --enable-m32 was given. if test "${enable_m32+set}" = set; then : enableval=$enable_m32; fi if test "$enable_m32" = yes then ff_m32=-m32 ff_ok=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $ff_m32" >&5 $as_echo_n "checking whether the C compiler accepts $ff_m32... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS $ff_m32" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "ff_ok" ; then ff_ok="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$ff_ok" = yes ;then CNOFLAGS="$CFLAGS $ff_m32";fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $ff_m32" >&5 $as_echo_n "checking whether the C compiler accepts $ff_m32... " >&6; } check_save_flags="$CNOFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CNOFLAGS="$CNOFLAGS $ff_m32" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CNOFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts $ff_m32" >&5 $as_echo_n "checking whether the C++ compiler accepts $ff_m32... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS $ff_m32" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts $ff_m32" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts $ff_m32... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS $ff_m32" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # add -fPIC on on 64 architecture # CHECK_COMPILE_FLAG(C,-fPIC,CFLAGS) # CHECK_COMPILE_FLAG(C++,-fPIC,CXXFLAGS) # CHECK_COMPILE_FLAG(Fortran 77,-fPIC,FFLAGS) fi # Debug mode (no optimisation) # ---------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to generate debugging information" >&5 $as_echo_n "checking whether to generate debugging information... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi # Check whether --enable-optim was given. if test "${enable_optim+set}" = set; then : enableval=$enable_optim; fi if test "$enable_debug" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="`echo $CFLAGS | sed 's/-O2//g'`" FFLAGS="`echo $FFLAGS | sed 's/-O2//g'`" CXXFLAGS="`echo $CXXFLAGS | sed 's/-O2//g'`" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -g" >&5 $as_echo_n "checking whether the C compiler accepts -g... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -g" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -g" >&5 $as_echo_n "checking whether the C++ compiler accepts -g... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -g" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -g" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -g... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -g" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } # No debugging information in optimized code CFLAGS="$CFLAGS -DNDEBUG" FFLAGS="$FFLAGS -DNDEBUG" CXXFLAGS="$CXXFLAGS -DNDEBUG" fi # Hardware-independant optimization # --------------------------------- if test "$enable_debug" != yes -a "$enable_optim" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -O3" >&5 $as_echo_n "checking whether the C compiler accepts -O3... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -O3" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -O3" >&5 $as_echo_n "checking whether the C++ compiler accepts -O3... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -O3" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -O3" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -O3... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -O3" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Check whether --enable-generic was given. if test "${enable_generic+set}" = set; then : enableval=$enable_generic; fi # FFCS: remove "-mcpu=common" to allow other hardware-dependant values of cpu for PowerPC - thank you Fred (20/02/11) if test $enable_ffcs = yes then # Generic code if test "$enable_debug" != yes \ -a "$enable_optim" != no \ -a "$enable_generic" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -mcpu=common" >&5 $as_echo_n "checking whether the C compiler accepts -mcpu=common... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -mcpu=common" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -mcpu=common" >&5 $as_echo_n "checking whether the C++ compiler accepts -mcpu=common... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -mcpu=common" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -mcpu=common" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -mcpu=common... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -mcpu=common" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi # Hardware-dependant optimization # ------------------------------- if test "$enable_debug" != yes \ -a "$enable_optim" != no \ -a "$enable_generic" != yes then # Autoconf always chooses -O2. -O2 in gcc makes some functions # disappear. This is not ideal for debugging. And when we optimize, we # do not use -O2 anyway. CFLAGS="`echo $CFLAGS | sed 's/-O2//g'`" FFLAGS="`echo $FFLAGS | sed 's/-O2//g'`" CXXFLAGS="`echo $CXXFLAGS | sed 's/-O2//g'`" # MacOS X Darwin if test -x /usr/bin/hostinfo then # If we are on MacOS X to choise the optimisaztion { $as_echo "$as_me:${as_lineno-$LINENO}: checking GCC version" >&5 $as_echo_n "checking GCC version... " >&6; } ff_gcc4=`$CC --version |awk ' NR==1 {print $3}'|sed -e 's/\..*$//'` ff_clang=`$CC --version |awk '/clang/ {print $4}'` if test -n "$ff_clang" ; then ff_gcc4="llvm"; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_gcc4" >&5 $as_echo "$ff_gcc4" >&6; } # At the moment, we do not know how to produce correct # optimizated code on G5. { $as_echo "$as_me:${as_lineno-$LINENO}: checking PowerPC architecture" >&5 $as_echo_n "checking PowerPC architecture... " >&6; } ff_machine=`/usr/bin/machine` ff_fast="-O3" if test -n "$ff_clang" ; then ff_fast='-O3 -fPIC' elif test `uname` = Darwin then # Optimization flags: -fast option do not work because the # -malign-natural flags create wrong IO code if test "$ff_gcc4" -eq 4 then ff_fast='-fast -fPIC' else ff_fast='-fPIC -O3 -funroll-loops -fstrict-aliasing -fsched-interblock -falign-loops=16 -falign-jumps=16 -falign-functions=16 -falign-jumps-max-skip=15 -falign-loops-max-skip=15 -ffast-math -mpowerpc-gpopt -force_cpusubtype_ALL -fstrict-aliasing -mpowerpc64 ' fi fi # CPU detection case $ff_machine in ppc7450) # G4 ff_fast="$ff_fast -mtune=G4 -mcpu=G4";; ppc970) # G5 # remove -fstrict-aliasing on G5 to much optim the # code cash in GC ff_fast="`echo $ff_fast -mtune=G5 -mcpu=G5| sed 's/-fstrict-aliasing //g'`";; ppc*) # G3 ???? ff_fast="-O3";; i486) ff_fast="-O3 $ff_fast";; x86_64*) ff_fast="-O3 $ff_fast";; *) as_fn_error $? "cannot determine apple cpu type " "$LINENO" 5 ff_fast="-O3";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_fast" >&5 $as_echo "$ff_fast" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $ff_fast" >&5 $as_echo_n "checking whether the C compiler accepts $ff_fast... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS $ff_fast" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts $ff_fast" >&5 $as_echo_n "checking whether the C++ compiler accepts $ff_fast... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS $ff_fast" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts $ff_fast" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts $ff_fast... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS $ff_fast" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Linux elif test -f /proc/cpuinfo then # Specific processors proc_type=unknown ff_optim_type= if test `grep 'Pentium III (Coppermine)' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium3 ff_optim_type=-P3 elif test `grep 'Intel(R) Pentium(R) III ' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium3 ff_optim_type=-P3 elif test `grep 'Intel(R) Pentium(R) 4 ' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium4 ff_optim_type=-P4 elif test `grep 'Intel(R) Xeon(TM) CPU' /proc/cpuinfo|wc -l` -gt 0 then proc_type=pentium4 ff_optim_type=-P4 elif test `grep 'AMD Athlon(tm) Processor' /proc/cpuinfo|wc -l` -gt 0 then proc_type=athlon ff_optim_type=-Athlon elif test `grep 'AMD Athlon(tm) XP' /proc/cpuinfo|wc -l` -gt 0 then proc_type=athlon-xp ff_optim_type=-AthlonXP fi if test "$proc_type" != unknown then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -march=$proc_type" >&5 $as_echo_n "checking whether the C compiler accepts -march=$proc_type... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -march=$proc_type" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -march=$proc_type" >&5 $as_echo_n "checking whether the C++ compiler accepts -march=$proc_type... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -march=$proc_type" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -march=$proc_type" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -march=$proc_type... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -march=$proc_type" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # If we did not find a processor type (this happens with # cygwin), try and select separate capabilities instead. if test "$proc_type" = unknown then if test `grep -e '^flags.*mmx' /proc/cpuinfo|wc -l` -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -mmmx" >&5 $as_echo_n "checking whether the C compiler accepts -mmmx... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -mmmx" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -mmmx" >&5 $as_echo_n "checking whether the C++ compiler accepts -mmmx... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -mmmx" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -mmmx" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -mmmx... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -mmmx" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test `grep -e '^flags.*sse ' /proc/cpuinfo|wc -l` -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -msse" >&5 $as_echo_n "checking whether the C compiler accepts -msse... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -msse" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -msse" >&5 $as_echo_n "checking whether the C++ compiler accepts -msse... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -msse" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -msse" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -msse... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -msse" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test `grep -e '^flags.*sse2' /proc/cpuinfo|wc -l` -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -msse2" >&5 $as_echo_n "checking whether the C compiler accepts -msse2... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -msse2" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -msse2" >&5 $as_echo_n "checking whether the C++ compiler accepts -msse2... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -msse2" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -msse2" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -msse2... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -msse2" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test `grep -e '^flags.*3dnow' /proc/cpuinfo|wc -l` -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -m3dnow" >&5 $as_echo_n "checking whether the C compiler accepts -m3dnow... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -m3dnow" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -m3dnow" >&5 $as_echo_n "checking whether the C++ compiler accepts -m3dnow... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -m3dnow" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler accepts -m3dnow" >&5 $as_echo_n "checking whether the Fortran 77 compiler accepts -m3dnow... " >&6; } check_save_flags="$FFLAGS" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu FFLAGS="$FFLAGS -m3dnow" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program x end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi fi fi # Defines a variable containing the optimization type, to be used in # binary archive names. It may be empty if only generic optimization # is used. OPTIM_TYPE=$ff_optim_type # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_lib_hdf5.html # =========================================================================== # # SYNOPSIS # # AX_LIB_HDF5([serial/parallel]) # # DESCRIPTION # # This macro provides tests of the availability of HDF5 library. # # The optional macro argument should be either 'serial' or 'parallel'. The # former only looks for serial HDF5 installations via h5cc. The latter # only looks for parallel HDF5 installations via h5pcc. If the optional # argument is omitted, serial installations will be preferred over # parallel ones. # # The macro adds a --with-hdf5 option accepting one of three values: # # no - do not check for the HDF5 library. # yes - do check for HDF5 library in standard locations. # path - complete path to the HDF5 helper script h5cc or h5pcc. # # If HDF5 is successfully found, this macro calls # # AC_SUBST(HDF5_VERSION) # AC_SUBST(HDF5_CC) # AC_SUBST(HDF5_CFLAGS) # AC_SUBST(HDF5_CPPFLAGS) # AC_SUBST(HDF5_LDFLAGS) # AC_SUBST(HDF5_LIBS) # AC_SUBST(HDF5_FC) # AC_SUBST(HDF5_FFLAGS) # AC_SUBST(HDF5_FLIBS) # AC_DEFINE(HAVE_HDF5) # # and sets with_hdf5="yes". Additionally, the macro sets # with_hdf5_fortran="yes" if a matching Fortran wrapper script is found. # Note that Autconf's Fortran support is not used to perform this check. # H5CC and H5FC will contain the appropriate serial or parallel HDF5 # wrapper script locations. # # If HDF5 is disabled or not found, this macros sets with_hdf5="no" and # with_hdf5_fortran="no". # # Your configuration script can test $with_hdf to take any further # actions. HDF5_{C,CPP,LD}FLAGS may be used when building with C or C++. # HDF5_F{FLAGS,LIBS} should be used when building Fortran applications. # # To use the macro, one would code one of the following in "configure.ac" # before AC_OUTPUT: # # 1) dnl Check for HDF5 support # AX_LIB_HDF5() # # 2) dnl Check for serial HDF5 support # AX_LIB_HDF5([serial]) # # 3) dnl Check for parallel HDF5 support # AX_LIB_HDF5([parallel]) # # One could test $with_hdf5 for the outcome or display it as follows # # echo "HDF5 support: $with_hdf5" # # You could also for example, override the default CC in "configure.ac" to # enforce compilation with the compiler that HDF5 uses: # # AX_LIB_HDF5([parallel]) # if test "$with_hdf5" = "yes"; then # CC="$HDF5_CC" # else # AC_MSG_ERROR([Unable to find HDF5, we need parallel HDF5.]) # fi # # LICENSE # # Copyright (c) 2009 Timothy Brown # Copyright (c) 2010 Rhys Ulerich # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 # Configure path for the GNU Scientific Library # Christopher R. Gabriel , April 2000 # This is what autoupdate's m4 run will expand. It fires # the warning (with _au_warn_XXX), outputs it into the # updated configure.ac (with AC_DIAGNOSE), and then outputs # the replacement expansion. # This is an auxiliary macro that is also run when # autoupdate runs m4. It simply calls m4_warning, but # we need a wrapper so that each warning is emitted only # once. We break the quoting in m4_warning's argument in # order to expand this macro's arguments, not AU_DEFUN's. # Finally, this is the expansion that is picked up by # autoconf. It tells the user to run autoupdate, and # then outputs the replacement expansion. We do not care # about autoupdate's warning because that contains # information on what to do *after* running autoupdate. # Checking c++11 for schwarz interface of P. Jolivet ... # F.Hecht: # do not compile all with c++11 version to much # probleme to day (frev 2015) with g++ 4.8.1 ff_cxx_save=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -std=c++11" >&5 $as_echo_n "checking whether the C++ compiler accepts -std=c++11... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -std=c++11" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "ff_cxx11" ; then ff_cxx11="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$ff_cxx11" = yes ; then CXX11FLAGS="-std=c++11"; if test -z "$ff_where_lib_conf_cxx11" ; then echo "cxx11 LD $CXX11FLAGS" >>$ff_where_lib_conf test -n "$CXX11FLAGS" && echo "cxx11 INCLUDE $CXX11FLAGS " >>$ff_where_lib_conf ff_where_lib_conf_cxx11=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add cxx11 : $CXX11FLAGS $CXX11FLAGS in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add cxx11 : $CXX11FLAGS $CXX11FLAGS in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add cxx11 : $CXX11FLAGS $CXX11FLAGS in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add cxx11 : $CXX11FLAGS $CXX11FLAGS in $ff_where_lib_conf \"" >&6;} fi fi CXXFLAGS="$ff_cxx_save" WITH_CXX11=$ff_cxx11 CXX11FLAGS=$CXX11FLAGS #end Checking c++11 # ------------------------------ # compilation flags of FreeFem++ # ------------------------------ # -DDRAWING bamg active some drawing facility in bamg (inquire mesh) # -DBAMG_LONG_LONG active the use of long long in bamg # -DDEBUG active the checking in bamg # -DNCHECKPTR remove check pointer facility # -DCHECK_KN active subscripting of some array # -DWITHCHECK of the dynamic type ckecking of the langague (very slow) # -DEIGENVALUE to compile the eigen value part # ------------------------------------------------ # FreeFrem++-specific optimizations -fpascal-strings if test "$enable_debug" = yes; then CXXFLAGS="$CXXFLAGS -DBAMG_LONG_LONG -DCHECK_KN" if test "$ff_mac" = yes; then CXXFLAGS="$CXXFLAGS -fno-inline -fexceptions" fi else CXXFLAGS="$CXXFLAGS -DBAMG_LONG_LONG -DNCHECKPTR" if test "$ff_mac" = yes; then CXXFLAGS="$CXXFLAGS " fi fi #whether or not to add a suffix to the package name #-------------------------------------------------- # Check whether --with-suffix was given. if test "${with_suffix+set}" = set; then : withval=$with_suffix; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking suffix to add to package name" >&5 $as_echo_n "checking suffix to add to package name... " >&6; } ff_suffix= if test "$with_suffix" = yes -o "$with_suffix" = no -o "$with_suffix" = "" then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else ff_suffix="-$with_suffix" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_suffix" >&5 $as_echo "$ff_suffix" >&6; } fi ADD_PACKAGE_NAME=$ff_suffix # Checking that OpenGL is accessible # ---------------------------------- ff_gl_ok=no ff_glx_ok=no ff_libs="$LIBS" # Check whether --with-flib was given. if test "${with_flib+set}" = set; then : withval=$with_flib; fi # Check whether --enable-opengl was given. if test "${enable_opengl+set}" = set; then : enableval=$enable_opengl; fi # echo " .... LIBS = $LIBS .... " if test x$enable_opengl != xno; then # GL libraries seem to depend on some dlopen capabilities if test "$enable_static" != yes -a "$ff_glut_ok" != yes then # If we cannot find gl.h, no OpenGL version can be produced ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in OpenGL/gl.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default" if test "x$ac_cv_header_OpenGL_gl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENGL_GL_H 1 _ACEOF ff_gl_ok=yes else ff_gl_ok=no fi done if test "$ff_gl_ok" = no then for ac_header in GL/gl.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" if test "x$ac_cv_header_GL_gl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GL_H 1 _ACEOF ff_gl_ok=yes else ff_gl_ok=no fi done fi for ac_header in GLUT/glut.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "GLUT/glut.h" "ac_cv_header_GLUT_glut_h" "$ac_includes_default" if test "x$ac_cv_header_GLUT_glut_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GLUT_GLUT_H 1 _ACEOF ff_glut_ok=yes else ff_glut_ok=no fi done if test "$ff_glut_ok" = no then for ac_header in GL/glut.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glut.h" "ac_cv_header_GL_glut_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glut_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GLUT_H 1 _ACEOF ff_glut_ok=yes else ff_glut_ok=no fi done fi # GLUT ..... if test "$ff_glut_ok" = yes then for glut in \ "-framework GLUT -framework OpenGL -framework Cocoa" \ "-lglut -lGLU -lGL" do ff_glut="$glut" ff_libs1="$LIBS" LIBS="$LIBS $ff_glut" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glutInit (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return glutInit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_glut_ok=yes LIBS="$ff_libs1" break else ff_glut_ok=next fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext; LIBS="$ff_libs1" done fi fi fi LIBSPTHREAD=$ff_pthread # ALH - 16/9/13 - at the moment the requirements for medit (glut) are not compatible with FFCS so medit is # only compiled with FF. if test $enable_ffcs = no then if test "$ff_glut_ok" = yes then LIBSGLUT=$ff_glut if test -n "$ff_pthread" ; then ff_ffglutprog="ffglut${EXEEXT}" cat >>confdefs.h <<_ACEOF #define PROG_FFGLUT "$ff_ffglutprog" _ACEOF fi ff_meditprog="ffmedit${EXEEXT}" fi fi # Check whether --with-suffix was given. if test "${with_suffix+set}" = set; then : withval=$with_suffix; fi if test "$with_suffix" = yes then with_suffix="" elif test "$with_suffix" = no -o -z "$with_suffix" then with_suffix="" else with_suffix="-$with_suffix" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking add suffix $with_suffix " >&5 $as_echo_n "checking add suffix $with_suffix ... " >&6; } ADD_PACKAGE_NAME=$with_suffix { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # Checking wether we can produce a parallel version # ------------------------------------------------- if test $enable_ffcs = no then # FF case # Checking wether we can produce a parallel version # ------------------------------------------------- ff_save_path="$PATH" # We need to choose between mpich, openmpi and lam for the Debian package # Check whether --with-mpipath was given. if test "${with_mpipath+set}" = set; then : withval=$with_mpipath; fi # Check whether --with-mpilibs was given. if test "${with_mpilibs+set}" = set; then : withval=$with_mpilibs; fi # Check whether --with-mpilibsc was given. if test "${with_mpilibsc+set}" = set; then : withval=$with_mpilibsc; fi # Check whether --with-mpiinc was given. if test "${with_mpiinc+set}" = set; then : withval=$with_mpiinc; fi # Check whether --with-mpi was given. if test "${with_mpi+set}" = set; then : withval=$with_mpi; fi if test "$with_mpi" != no ; then #if test "$with_mpi" != no ; then #AX_MPI(with_mpi=yes, with_mpi=no) #fi # Default is mpic++ ff_mpi_suffix=""; if test "$with_mpi" = yes -o -z "$with_mpi" then ff_mpicxx=mpic++ else case "$with_mpi" in lam|mpich|openmpi) ff_mpi_suffix=.$with_mpi;ff_mpicxx=mpic++.$with_mpi;; *) ff_mpicxx="$with_mpi" ;; esac fi if test -n "$with_mpiinc" -a "$with_mpiinc" != no ; then if test "$with_mpi" = 'no' ; then with_mpi='yes'; fi ff_MPI_INCLUDE="$with_mpiinc" fi if test -n "$with_mpilibs" -a "$with_mpilibs" != no ; then ff_MPI_LIB="$with_mpilibs" ff_MPI_LIBC="$with_mpilibs" ff_MPI_LIBFC="$with_mpilibs" MPICXX="$CXX $ff_MPI_INCLUDE" MPIF77="$F77 $ff_MPI_INCLUDE" MPIFC="$FC $ff_MPI_INCLUDE" MPICC="$CC $ff_MPI_INCLUDE" { $as_echo "$as_me:${as_lineno-$LINENO}: --- set all MPI compile to compiler: $MPICC , $MPIF77, $MPIFC, $MPICC " >&5 $as_echo "$as_me: --- set all MPI compile to compiler: $MPICC , $MPIF77, $MPIFC, $MPICC " >&6;} fi if test -n "$with_mpilibsc" -a "$with_mpilibsc" != no ; then ff_MPI_LIBC="$with_mpilibsc" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPIRUN" >&5 $as_echo_n "checking for MPIRUN... " >&6; } if test -z "$MPIRUN" ; then for ac_prog in mpirun mpiexec mpiexec.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MPIRUN+:} false; then : $as_echo_n "(cached) " >&6 else case $MPIRUN in [\\/]* | ?:[\\/]*) ac_cv_path_MPIRUN="$MPIRUN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MPIRUN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MPIRUN=$ac_cv_path_MPIRUN if test -n "$MPIRUN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPIRUN" >&5 $as_echo "$MPIRUN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MPIRUN" && break done test -n "$MPIRUN" || MPIRUN="no" if test "$MPIRUN" = no then ff_mpi=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPIRUN" >&5 $as_echo "$MPIRUN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpipath " >&5 $as_echo_n "checking for mpipath ... " >&6; } if test "$with_mpi" != no -a ! -d "$with_mpipath" -a "$MPIRUN" != no ; then # if "$MPIRUN" != no ; tehn with_mpipath=`$as_dirname -- "$MPIRUN" || $as_expr X"$MPIRUN" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$MPIRUN" : 'X\(//\)[^/]' \| \ X"$MPIRUN" : 'X\(//\)$' \| \ X"$MPIRUN" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$MPIRUN" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` with_mpipath=`$as_dirname -- "$with_mpipath" || $as_expr X"$with_mpipath" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$with_mpipath" : 'X\(//\)[^/]' \| \ X"$with_mpipath" : 'X\(//\)$' \| \ X"$with_mpipath" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$with_mpipath" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` # echo " ***** with_mpipath $with_mpipath \n" # else # for i in '/c/Program Files (x86)/MPICH2' '/c/Program Files/MPICH2' 'c:\Program Files (x86)\MPICH2' 'c:\Program Files\MPICH2' ; do # test -d "$i" && with_mpipath="$i" && break # done # fi fi #echo "**** with_mpipath '$with_mpipath' $MPIRUN *****" case "$MPIRUN" in */sgi/mpt/*) ff_MPI_INCLUDE_DIR= ff_MPI_LIB_DIR= test -f "$with_mpipath/include/mpif.h" && ff_MPI_INCLUDE_DIR="$with_mpipath/include" test -f "$with_mpipath/lib/libmpi.so" && ff_MPI_LIB_DIR="$with_mpipath/lib" if test -n "$ff_MPI_INCLUDE_DIR" -a -n "$ff_MPI_LIB_DIR" ; then ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' " with_mpiinc="$ff_MPI_INCLUDE" ff_MPI_LIBC="-L'$ff_MPI_LIB_DIR' -lmpi" ff_MPI_LIB="-L'$ff_MPI_LIB_DIR' -lmpi++ -lmpi" ff_MPI_LIBFC="-L'$ff_MPI_LIB_DIR' -lmpi" ff_mpitype=sgi test -z "$MPICXX" && MPICXX="$CXX $ff_MPI_INCLUDE" test -z "$MPIF77" && MPIF77="$F77 $ff_MPI_INCLUDE" test -z "$MPIFC" && MPIFC="$FC $ff_MPI_INCLUDE" test -z "$MPICC" && MPICC="$CC $ff_MPI_INCLUDE" # echo " *** MPI sgi ..... " fi ;; esac if test -d "$with_mpipath" -a "$ff_win32" = yes ; then # sed -e "s?@MPIDIR@?$with_mpipath?" -e "s?@F77@?$F77?" -e "s?@CC@?$CC?" -e "s?@CXX@?$CXX?" -e "s?@FC@?$FC?" mpic++ # chmod a+rx mpic++ # for i in mpicc mpif90 mpifc mpif77 ; do cp mpic++ $i; done # ff_pwd=`pwd` # with_mpi="$ff_pwd"/mpic++ # MPICXX="$ff_pwd/mpic++" # MPIF77="$ff_pwd/mpif77" # MPIFC="$ff_pwd/mpif90" # MPICC="$ff_pwd/mpicc" zzzzzzzzzzz if with_mpilibs=`which msmpi.dll` then case "$ff_size_ptr" in 4) with_mpipathlib="$with_mpipath/Lib/i386";; 8) with_mpipathlib="$with_mpipath/Lib/amd64";; *) with_mpipath=no;; esac test -d "$with_mpipath/Inc" && ff_MPI_INCLUDE_DIR="$with_mpipath/Inc" test -d "$with_mpipath/Include" && ff_MPI_INCLUDE_DIR="$with_mpipath/Include" # Remove for scotch and parmetis # ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' '-D_MSC_VER' '-D__int64=long long'" ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' '-D__int64=long long'" with_mpiinc="$ff_MPI_INCLUDE" test -z "$MPIRUN" && MPIRUN="$with_mpipath/bin/mpiexe.exe" ff_MPI_LIBC="$with_mpilibs" ff_MPI_LIB="$with_mpilibs" ff_MPI_LIBFC="$with_mpilibs" test -z "$MPICXX" && MPICXX="$CXX $ff_MPI_INCLUDE" test -z "$MPIF77" && MPIF77="$F77 $ff_MPI_INCLUDE" test -z "$MPIFC" && MPIFC="$FC $ff_MPI_INCLUDE" test -z "$MPICC" && MPICC="$CC $ff_MPI_INCLUDE" else echo " #### no msmpi.dll => no mpi under windows .... (FH) " >&AS_MESSAGE_LOG_FD echo " #### no msmpi.dll => no mpi under windows .... (FH) " >&AS_MESSAGE_FD with_mpipath=no with_mpi=no fi else with_mpipath=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_mpi_path" >&5 $as_echo "$ff_mpi_path" >&6; } ff_save_cxx="$CXX" ff_save_libs="$LIBS" if test "$with_mpi" != no then ff_mpi_path=`$as_dirname -- "$MPIRUN" || $as_expr X"$MPIRUN" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$MPIRUN" : 'X\(//\)[^/]' \| \ X"$MPIRUN" : 'X\(//\)$' \| \ X"$MPIRUN" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$MPIRUN" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_mpi_path" in .|"") ff_mpi_path="$PATH";ff_defmpicxx="$ff_mpicxx";; *) ff_mpi_path="$ff_mpi_path";ff_defmpicxx=`expr "//$ff_mpicxx" : '.*/\(.*\)'`;; esac if test -z "$MPICXX" ; then for ac_prog in $ff_defmpicxx mpic++$ff_mpi_suffix mpicxx$ff_mpi_suffix mpiCC$ff_mpi_suffix mpCC hcp mpxlC mpxlC_r cmpic++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MPICXX+:} false; then : $as_echo_n "(cached) " >&6 else case $MPICXX in [\\/]* | ?:[\\/]*) ac_cv_path_MPICXX="$MPICXX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ff_mpi_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MPICXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MPICXX=$ac_cv_path_MPICXX if test -n "$MPICXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPICXX" >&5 $as_echo "$MPICXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MPICXX" && break done test -n "$MPICXX" || MPICXX="no" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPICXX" >&5 $as_echo_n "checking for MPICXX... " >&6; } fi ff_mpicxx="eval $MPICXX" CXX=$ff_mpicxx LIBS="$LIBS $ff_MPI_LIB" test -z "$ff_mpi" && ff_mpi=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main(int argc,char **argv){ char name[BUFSIZ]; int length; MPI_Init(&argc, &argv); MPI_Get_processor_name(name, &length); printf("%s: hello world\n", name); MPI_Finalize(); return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_mpi=yes else ff_mpi=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_mpi" >&5 $as_echo "$ff_mpi" >&6; } # Also check that mpirun is there. If it isn't, then MPI is # not fully installed. if test "$ff_mpi" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking MPI_DOUBLE_COMPLEX" >&5 $as_echo_n "checking MPI_DOUBLE_COMPLEX... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include MPI_Datatype xxxx=MPI_DOUBLE_COMPLEX; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ff_mpi_double_complex=yes else ff_mpi_double_complex=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_mpi_double_complex" >&5 $as_echo "$ff_mpi_double_complex" >&6; } if test "$ff_mpi_double_complex" = yes ; then $as_echo "#define HAVE_MPI_DOUBLE_COMPLEX 1" >>confdefs.h fi echo "MPI CC $ff_mpi" >config_LIB_INFO # We do not AC_DEFINE any special flag for parallel # computation here, because it must only be set when the # parallel program is compiled (see src/mpi/Makfile.am) ff_mpiprog="FreeFem++-mpi${EXEEXT}" MPIPROG="$ff_mpiprog" MPISCRIPT="ff-mpirun" MPIRUN=$MPIRUN MPICXX=$MPICXX else MPICXX=$ff_save_cxx fi if test "$ff_mpi" = yes; then if test "$enable_fortran" != no then if test -z "$MPIF77" ; then for ac_prog in mpif90$ff_mpi_suffix mpif77$ff_mpi_suffix hf77 mpxlf mpf77 mpif90 mpf90 mpxlf90 mpxlf95 mpxlf_r cmpifc cmpif90c do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MPIF77+:} false; then : $as_echo_n "(cached) " >&6 else case $MPIF77 in [\\/]* | ?:[\\/]*) ac_cv_path_MPIF77="$MPIF77" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ff_mpi_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MPIF77="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MPIF77=$ac_cv_path_MPIF77 if test -n "$MPIF77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPIF77" >&5 $as_echo "$MPIF77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MPIF77" && break done test -n "$MPIF77" || MPIF77="""" fi if test -z "$MPIFC" ; then for ac_prog in mpif90$ff_mpi_suffix mpxlf95_r mpxlf90_r mpxlf95 mpxlf90 mpf90 cmpif90c do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MPIFC+:} false; then : $as_echo_n "(cached) " >&6 else case $MPIFC in [\\/]* | ?:[\\/]*) ac_cv_path_MPIFC="$MPIFC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ff_mpi_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MPIFC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MPIFC=$ac_cv_path_MPIFC if test -n "$MPIFC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPIFC" >&5 $as_echo "$MPIFC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MPIFC" && break done test -n "$MPIFC" || MPIFC="""" fi fi echo " ********************ffmpi= '$ff_mpi' ************* " ff_MPI_INCLUDE="$with_mpiinc" if test -z "$ff_mpitype" ; then ff_mpishow=`$MPICXX -show` 2>/dev/null ff_mpicshow=`$MPICC -show` 2>/dev/null ff_mpifcshow=`$MPIFC -show` 2>/dev/null if test "$with_mpilibs" = no -o -z "$with_mpilibs" ; then ff_MPI_INCLUDE=`echo $ff_mpishow|tr ' ' '\n'| grep -E '^-[^WLlOgp]|^-Wp,'|tr '\n' ' '` ff_MPI_LIB_DIRS="" ff_MPI_LIB=`echo $ff_mpishow|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|tr '\n' ' '` ff_MPI_LIBC=`echo $ff_mpicshow|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|tr '\n' ' '` ff_MPI_LIBFC=`echo $ff_mpifcshow|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|grep -v 'commons,use_dylibs' |tr '\n' ' '` ff_mpi_idir=`echo $ff_mpishow|tr ' ' '\n'| grep -E '^-I'|sed s/^-I//|tr '\n' ' '`' /usr/include' fi ff_mpi_idir=`echo $ff_MPI_INCLUDE|tr ' ' '\n'| grep -E '^-I'|sed s/^-I//|tr '\n' ' '`' /usr/include' ff_mpi_ldir=`echo $ff_MPI_LIB|tr ' ' '\n'| grep -E '^-[Llp]|^-Wl,'|sed -e 's/^-[Llp]//' -e 's/^-Wl,//' |tr '\n' ' '`' /usr/lib'] if test -z "$ff_MPI_INCLUDE_DIR" ; then for i in $ff_mpi_idir; do if test -f "$i/mpi.h" -a -z "$ff_MPI_INCLUDE_DIR" ;then ff_MPI_INCLUDE_DIR=$i fi done fi for i in $ff_mpi_ldir; do ff_tmp=`ls $i/libmpi.*|head -1` if test -f "$ff_tmp" -a -z "$ff_MPI_LIB_DIRS" ;then ff_MPI_LIB_DIRS=$i fi done fi MPICXX=$MPICXX if test -z "$MPICC" ; then for ac_prog in mpicc$ff_mpi_suffix hcc mpcc mpcc_r mpxlc cmpicc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MPICC+:} false; then : $as_echo_n "(cached) " >&6 else case $MPICC in [\\/]* | ?:[\\/]*) ac_cv_path_MPICC="$MPICC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ff_mpi_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MPICC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MPICC=$ac_cv_path_MPICC if test -n "$MPICC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPICC" >&5 $as_echo "$MPICC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MPICC" && break done test -n "$MPICC" || MPICC="""" fi MPICC=$MPICC PASTIX_HOSTARCH=$ff_HOSTARCH_pastix if test ! -f "$ff_MPI_INCLUDE_DIR/mpif.h" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: MPI without fortran no file \"$ff_MPI_INCLUDE_DIR/mpif.h\" " >&5 $as_echo "$as_me: MPI without fortran no file \"$ff_MPI_INCLUDE_DIR/mpif.h\" " >&6;} else if test -n "$MPIFC" ; then if test -z "$ff_where_lib_conf_mpifc" ; then echo "mpifc LD $ff_MPI_LIBFC" >>$ff_where_lib_conf test -n "$ff_MPI_INCLUDE" && echo "mpifc INCLUDE $ff_MPI_INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpifc=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpifc : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpifc : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpifc : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpifc : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_mpif77" ; then echo "mpif77 LD $ff_MPI_LIBFC" >>$ff_where_lib_conf test -n "$ff_MPI_INCLUDE" && echo "mpif77 INCLUDE $ff_MPI_INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpif77=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpif77 : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpif77 : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpif77 : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpif77 : $ff_MPI_LIBFC $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&6;} fi fi fi if test -n "$MPICXX" ; then if test -z "$ff_where_lib_conf_mpi" ; then echo "mpi LD $ff_MPI_LIB" >>$ff_where_lib_conf test -n "$ff_MPI_INCLUDE" && echo "mpi INCLUDE $ff_MPI_INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpi=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpi : $ff_MPI_LIB $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpi : $ff_MPI_LIB $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpi : $ff_MPI_LIB $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpi : $ff_MPI_LIB $ff_MPI_INCLUDE in $ff_where_lib_conf \"" >&6;} fi fi MPI_INC_DIR=$ff_MPI_INCLUDE_DIR MPI_INCLUDE=$ff_MPI_INCLUDE MPI_LIB_DIRS=$ff_MPI_LIB_DIRS MPI_LIB=$ff_MPI_LIB MPI_LIBC=$ff_MPI_LIBC MPI_LIBFC=$ff_MPI_LIBFC SKIP_TESTS_MPI="no" fi CXX="$ff_save_cxx" LIBS="$ff_save_libs" fi fi ## clean on MPI variable if not MPI ... if test "$ff_mpi" != yes ; then MPIRUN="" MPICC="" MPICXX="" MPIF77="" MPIFC="" MPI_INCLUDE="" MPI_LIB_DIRS="" MPI_LIB="" MPI_LIBC="" MPI_LIBFC="" SKIP_TESTS_MPI="yes" ff_mpi=no fi # Local Variables: # mode:shell-script # ispell-local-dictionary:"british" # coding:utf-8 # End: else # FFCS - use the same MPI configuration choices as FFCS ff_mpi=yes MPICXX=$MPICXX MPICC=$MPICC MPIF77=$MPIF77 MPIFC=$MPIFC MPIPROG="FreeFem++-mpi${EXEEXT}" MPI_INCLUDE="-I $MPI_INC_DIR" MPI_INC_DIR=$MPI_INC_DIR MPI_LIB_DIRS="" MPI_LIB=$MPI_LIB MPI_LIBC="" MPI_LIBFC="" # Extra MPI-dependant configuration options that are set by FF during MPI configuration. FFCS - 25/2/13 - Fred # noticed that if PASTIX_HOSTARCH stays blank, pastix compilation breaks. At least i686_pc_linux and i686_mac are # required by pastix on the corresponding platforms. if test"$ff_HOSTARCH_pastix" = "" then ff_HOSTARCH_pastix=i686_pc_linux fi PASTIX_HOSTARCH=$ff_HOSTARCH_pastix # these values should not be empty otherwise examples++-load/ff-get-dep will think that they are not defined if test -z "$ff_where_lib_conf_mpi" ; then echo "mpi LD -DDUMMY" >>$ff_where_lib_conf test -n "-I$MPI_INC_DIR" && echo "mpi INCLUDE -I$MPI_INC_DIR " >>$ff_where_lib_conf ff_where_lib_conf_mpi=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpi : -DDUMMY -I$MPI_INC_DIR in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpi : -DDUMMY -I$MPI_INC_DIR in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpi : -DDUMMY -I$MPI_INC_DIR in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpi : -DDUMMY -I$MPI_INC_DIR in $ff_where_lib_conf \"" >&6;} fi # mpifc and mpif77 libraries should always be specified because FF never calls the Fortran MPI compiler. It always # uses mpicxx in [[file:examples++-load/ff-c++]]. The resulting Fortran libraries (eg Mumps) would compile even # without the proper Fortran libs, but they would not load properly. # under Win32, libmpi_f77.a is not the right name and FFCS mingw/mpicxx adds the right libraries by itself # With mpich2 Debian wheezy 32 bits, libmpi_f77.a is not available (request from Cico, 14/10/13) if test -f /usr/lib/openmpi/lib/libmpi_f77.a then if test -z "$ff_where_lib_conf_mpifc" ; then echo "mpifc LD -lmpi_f77" >>$ff_where_lib_conf test -n "" && echo "mpifc INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpifc=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpifc : -lmpi_f77 in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpifc : -lmpi_f77 in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpifc : -lmpi_f77 in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpifc : -lmpi_f77 in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_mpif77" ; then echo "mpif77 LD -lmpi_f77" >>$ff_where_lib_conf test -n "" && echo "mpif77 INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpif77=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpif77 : -lmpi_f77 in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpif77 : -lmpi_f77 in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpif77 : -lmpi_f77 in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpif77 : -lmpi_f77 in $ff_where_lib_conf \"" >&6;} fi else if test -z "$ff_where_lib_conf_mpifc" ; then echo "mpifc LD -DDUMMY" >>$ff_where_lib_conf test -n "" && echo "mpifc INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpifc=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpifc : -DDUMMY in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpifc : -DDUMMY in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpifc : -DDUMMY in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpifc : -DDUMMY in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_mpif77" ; then echo "mpif77 LD -DDUMMY" >>$ff_where_lib_conf test -n "" && echo "mpif77 INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_mpif77=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mpif77 : -DDUMMY in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mpif77 : -DDUMMY in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mpif77 : -DDUMMY in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mpif77 : -DDUMMY in $ff_where_lib_conf \"" >&6;} fi fi # FFCS - MPI_DOUBLE_COMPLEX kept from original FF configure script { $as_echo "$as_me:${as_lineno-$LINENO}: checking MPI_DOUBLE_COMPLEX" >&5 $as_echo_n "checking MPI_DOUBLE_COMPLEX... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include MPI_Datatype xxxx=MPI_DOUBLE_COMPLEX; _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ff_mpi_double_complex=yes else ff_mpi_double_complex=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_mpi_double_complex" >&5 $as_echo "$ff_mpi_double_complex" >&6; } if test "$ff_mpi_double_complex" = yes ; then $as_echo "#define HAVE_MPI_DOUBLE_COMPLEX 1" >>confdefs.h fi fi # FFCS needs to change some of the FF makefiles to compile without MPI on MacOS if test $ff_mpi = yes; then FFCS_MPIOK_TRUE= FFCS_MPIOK_FALSE='#' else FFCS_MPIOK_TRUE='#' FFCS_MPIOK_FALSE= fi # Looking for useful configuration utilities # ------------------------------------------ # Check whether --enable-download was given. if test "${enable_download+set}" = set; then : enableval=$enable_download; fi ## PETSc # Check whether --with-petsc was given. if test "${with_petsc+set}" = set; then : withval=$with_petsc; fi # /usr/local/petsc/conf/petscvariables ff_petsc_ok=no ## echo --$with_petsc-- if test "$with_petsc" != no -a $ff_mpi = yes; then for d in "$with_petsc" /usr /usr/local /opt/usr /opt/local ;do for dd in "" "/petsc/conf/petscvariables" "/lib/petsc-conf/petscvariables" ; do ffconfpetsc="$d$dd" if test -f "$ffconfpetsc" ; then if test "$ff_petsc_ok" = no ; then PETSC_MPIRUN=`awk -F' *= *' '"MPIEXEC"==$1 {print $2}' "$ffconfpetsc"` cmp -s "$PETSC_MPIRUN" "$MPIRUN" if test "$?" -eq 0 ; then PETSC_WITH_EXTERNAL_LIB=`awk -F'=' '"PETSC_WITH_EXTERNAL_LIB "==$1 {print $2}' $ffconfpetsc` PETSC_CC_INCLUDES=`awk -F'=' '"PETSC_CC_INCLUDES "==$1 {print $2}' $ffconfpetsc` if test -n "$PETSC_WITH_EXTERNAL_LIB"; then ff_petsc_ok=yes; if test -z "$ff_where_lib_conf_petsc" ; then echo "petsc LD $PETSC_WITH_EXTERNAL_LIB" >>$ff_where_lib_conf test -n "$PETSC_CC_INCLUDES" && echo "petsc INCLUDE $PETSC_CC_INCLUDES " >>$ff_where_lib_conf ff_where_lib_conf_petsc=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add petsc : $PETSC_WITH_EXTERNAL_LIB $PETSC_CC_INCLUDES in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add petsc : $PETSC_WITH_EXTERNAL_LIB $PETSC_CC_INCLUDES in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add petsc : $PETSC_WITH_EXTERNAL_LIB $PETSC_CC_INCLUDES in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add petsc : $PETSC_WITH_EXTERNAL_LIB $PETSC_CC_INCLUDES in $ff_where_lib_conf \"" >&6;} fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: \" Warning PETSC MPI and FF++ MPI not the same: $PETSC_MPIRUN != $MPIRUN.\" " >&5 $as_echo "$as_me: \" Warning PETSC MPI and FF++ MPI not the same: $PETSC_MPIRUN != $MPIRUN.\" " >&6;}; fi fi else test "$ff_petsc_ok" = no && echo " *** try $ffconfpetsc" ffconfpetsc=""; fi done done fi if test "$ff_petsc_ok" != no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: with petsc $ff_petsc_ok" >&5 $as_echo "$as_me: with petsc $ff_petsc_ok" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: without petsc ***** " >&5 $as_echo "$as_me: without petsc ***** " >&6;} fi #replacing wget with another command ff_wget_command="wget --no-check-certificate" ff_wget=no # Check whether --with-wget was given. if test "${with_wget+set}" = set; then : withval=$with_wget; enable_download=yes ff_wget=yes ff_wget_command="${withval}" fi ff_mkl_libpath=yes # Check whether --with-mkl was given. if test "${with_mkl+set}" = set; then : withval=$with_mkl; ff_mkl_libpath="${withval}" fi # if enabling downloads find wget or curl to do download # ------------------------------------------------------ if test "$ff_wget" = no then ff_wget="" # Extract the first word of "wget --no-check-certificate", so it can be a program name with args. set dummy wget --no-check-certificate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_wget+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_wget"; then ac_cv_prog_ff_wget="$ff_wget" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_wget="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_wget" && ac_cv_prog_ff_wget="no" fi fi ff_wget=$ac_cv_prog_ff_wget if test -n "$ff_wget"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_wget" >&5 $as_echo "$ff_wget" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$ff_wget" = no then ff_wget_command="curl --fail -O " ff_curl="" # Extract the first word of "curl -O", so it can be a program name with args. set dummy curl -O; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_curl+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_curl"; then ac_cv_prog_ff_curl="$ff_curl" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_curl="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_curl" && ac_cv_prog_ff_curl="no" fi fi ff_curl=$ac_cv_prog_ff_curl if test -n "$ff_curl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_curl" >&5 $as_echo "$ff_curl" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ff_wget="$ff_curl" fi # for automatique compilation of # lib in download if test "$ff_wget" != yes -a "$enable_download" = "yes" ; then enable_download=no as_fn_error 1 " enable-download and no wget or curl. " "$LINENO" 5; fi if test "$enable_download" = "yes" ; then DOWNLOADCOMPILE="compile-pkg install-other" else DOWNLOADCOMPILE= fi WGET=$ff_wget_command DOWNLOADCOMPILE=$DOWNLOADCOMPILE # modif FH ----- # -- looking for cadna # the round-off error propagation # the web site http://www-anp.lip6.fr/cadna/ # -------------------- # Check whether --with-cadna was given. if test "${with_cadna+set}" = set; then : withval=$with_cadna; fi if test "$with_cadna" != no -o -n "$with_cadna" then ff_cadna="$with_cadna" fi ff_cadna_ok=no if test "$with_cadna" != no then ff_libs_old="$LIBS" ff_ldflags_old="$LDFLAGS" ff_cadna_dir="${curdir}/download/cadna" LDFLAGS="$LDFLAGS -L$ff_cadna_dir" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arit_zero in -lcadnafree" >&5 $as_echo_n "checking for arit_zero in -lcadnafree... " >&6; } if ${ac_cv_lib_cadnafree_arit_zero+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcadnafree $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char arit_zero (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return arit_zero (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_cadnafree_arit_zero=yes else ac_cv_lib_cadnafree_arit_zero=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cadnafree_arit_zero" >&5 $as_echo "$ac_cv_lib_cadnafree_arit_zero" >&6; } if test "x$ac_cv_lib_cadnafree_arit_zero" = xyes; then : ff_cadna_ok=yes fi for ac_header in ${ff_cadna_dir}/cadnafree.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF ff_cadna_h=yes else ff_cadna_h=no fi done LIBS="$ff_libs_old" LDFLAGS="$ff_ldflags_old" if test "$ff_cadna_ok" = yes -a "$ff_cadna_h" = yes then $as_echo "#define HAVE_CADNA 1" >>confdefs.h CPPFLAGS="$CPPFLAGS -I$ff_cadna_dir" LIBS=" -L$ff_cadna_dir -lcadnafree $ff_libs_old" else { $as_echo "$as_me:${as_lineno-$LINENO}: without cadna ***** " >&5 $as_echo "$as_me: without cadna ***** " >&6;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: without cadna ***** " >&5 $as_echo "$as_me: without cadna ***** " >&6;} fi # Looking for FFTW # ---------------- # ALH - 18/9/13 - deactivates FFTW detection for testing purposes # Check whether --enable-system_fftw was given. if test "${enable_system_fftw+set}" = set; then : enableval=$enable_system_fftw; fi if test "$enable_system_fftw" != no then # ALH - 4/9/13 - avoid recompiling FFTW if a copy was found on the system (request from Helmut Jarausch, 1/8/13) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw_execute in -lfftw3" >&5 $as_echo_n "checking for fftw_execute in -lfftw3... " >&6; } if ${ac_cv_lib_fftw3_fftw_execute+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfftw3 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fftw_execute (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return fftw_execute (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_fftw3_fftw_execute=yes else ac_cv_lib_fftw3_fftw_execute=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fftw3_fftw_execute" >&5 $as_echo "$ac_cv_lib_fftw3_fftw_execute" >&6; } if test "x$ac_cv_lib_fftw3_fftw_execute" = xyes; then : ff_fftw_ok=yes fi for ac_header in fftw3.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "fftw3.h" "ac_cv_header_fftw3_h" "$ac_includes_default" if test "x$ac_cv_header_fftw3_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FFTW3_H 1 _ACEOF ff_fftw_h=yes else ff_fftw_h=no fi done fi if test "$ff_fftw_ok" = yes -a "$ff_fftw_h" = yes then if test -z "$ff_where_lib_conf_fftw3" ; then echo "fftw3 LD -lfftw3" >>$ff_where_lib_conf test -n "" && echo "fftw3 INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_fftw3=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add fftw3 : -lfftw3 in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add fftw3 : -lfftw3 in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add fftw3 : -lfftw3 in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add fftw3 : -lfftw3 in $ff_where_lib_conf \"" >&6;} fi fftw_download= else if test "$enable_download" = yes then ff_DOWNLOAD_FFTW=fftw fi fi # used in [[file:download/fftw/Makefile.am::DOWNLOAD_FFTW]] DOWNLOAD_FFTW=$ff_DOWNLOAD_FFTW { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tetrahedralize in -ltet" >&5 $as_echo_n "checking for tetrahedralize in -ltet... " >&6; } if ${ac_cv_lib_tet_tetrahedralize+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tetrahedralize (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return tetrahedralize (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_tet_tetrahedralize=yes else ac_cv_lib_tet_tetrahedralize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tet_tetrahedralize" >&5 $as_echo "$ac_cv_lib_tet_tetrahedralize" >&6; } if test "x$ac_cv_lib_tet_tetrahedralize" = xyes; then : ff_fftet_ok=yes fi for ac_header in tetgen.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "tetgen.h" "ac_cv_header_tetgen_h" "$ac_includes_default" if test "x$ac_cv_header_tetgen_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TETGEN_H 1 _ACEOF ff_tet_h=yes else ff_tet_h=no fi done if test "$ff_tet_ok" = yes -a "$ff_tet_h" = yes then if test -z "$ff_where_lib_conf_tetgen" ; then echo "tetgen LD -ltet" >>$ff_where_lib_conf test -n "" && echo "tetgen INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_tetgen=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add tetgen : -ltet in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add tetgen : -ltet in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add tetgen : -ltet in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add tetgen : -ltet in $ff_where_lib_conf \"" >&6;} fi $as_echo "#define HAVE_TETGEN 1" >>confdefs.h fi # Looking for the BLAS # -------------------- ff_blas_ok=no ff_blas_inc="" # ALH - 18/9/13 - give the option to deactivate system blas for testing purposes # Check whether --enable-system-blas was given. if test "${enable_system_blas+set}" = set; then : enableval=$enable_system_blas; fi if test "$enable_system_blas" != no then # User-specified location # add MKL seach dec 2010 FH .... ff_mkl_flags="" if test "$ff_mkl_libpath" != "not" ; then ff_CFLAGS="$CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -mkl" >&5 $as_echo_n "checking whether the C compiler accepts -mkl... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -mkl" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$ff_CFLAGS" != "$CFLAGS" ; then ff_ff_mkl_flags="-mkl" fi CFLAGS="$ff_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MKL" >&5 $as_echo_n "checking for MKL... " >&6; } ff_mkl_root="" if test "$ff_mkl_libpath" != "not" -a -z "$ff_mkl_flags" ; then if test "$ff_mkl_libpath" = "yes" ; then ff_IFS="$IFS" IFS=":" for i in $LD_LIBRARY_PATH:$LIBRARY_PATH ; do case $i in */mkl/*) ff_mkl_libpath=$i;; esac ; done; IFS="$ff_IFS" # else # ff_mkl_libpath=no fi if test "$ff_mkl_libpath" != "no" -a -d "$ff_mkl_libpath" ; then ff_mkl_root=`expr "//$ff_mkl_libpath" : '//\(.*\)/lib.*'` ff_mkl_arch=`expr "//$ff_mkl_libpath" : '//.*/lib/\(.*\)'` ff_mkl_lp=_lp64 case "$ff_mkl_arch" in *64*) ff_mkl_lp=_lp64 esac case $F77 in *ifort*) ff_mkl_cc=intel;; *) ff_mkl_cc=gf;; esac # bof bof .... case "$MPIRUN" in */sgi/*) ff_mkl_mpi=_sgimpt;; */intel/*) ff_mkl_mpi=_intelmpi;; *) ff_mkl_mpi=_openmpi;; esac # echo ................ ff_mkl_root = $ff_mkl_root .. $ff_mkl_arch if test ! -d "$ff_mkl_libpath" ; then ff_mkl_libpath="$ff_mkl_root/lib/$ff_mkl_arch" fi if test -f "$ff_mkl_libpath/libmkl_rt.$ff_suffix_dylib" ; then mkl_blas=rt mkl_lapack=rt ff_mkl_mlt="-L$ff_mkl_libpath -lmkl_rt -lmkl_intel_thread -lmkl_core $ff_iomp5 $ff_pthread" ff_mkl_blas="-L$ff_mkl_libpath -lmkl_rt -lmkl_sequential -lmkl_core $ff_iomp5 $ff_pthread" ff_mkl_lapack="$ff_mkl_blas" elif test -f "$ff_mkl_libpath/libmkl_lapack.$ff_suffix_dylib" ; then ff_mkl_mlt="-L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_lapack -lmkl_intel${ff_mkl_lp} -lmkl_intel_thread -lmkl_core -lguide -lm -lpthread" ff_mkl_blas="-L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_lapack -lmkl_intel${ff_mkl_lp} -lmkl_sequential -lmkl_core -lguide -lm -lpthread" ff_mkl_lapack="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_lapack" else ff_mkl_mlt="$ff_ldbg -L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_intel_thread -lmkl_core -lmkl_intel_thread $ff_iomp5 $ff_ldeg -lm $ff_pthread" ff_mkl_blas="$ff_ldbg -L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_sequential -lmkl_core -lmkl_sequential $ff_ldeg -lm $ff_pthread" ff_mkl_lapack="$ff_mkl_blas" fi if test -f "-L$ff_mkl_libpathmkl_scalapack${ff_mkl_lp}" ; then ff_mkl_scalapack="-L$ff_mkl_libpath -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp} " ff_mkl_blacs="-L$ff_mkl_libpath -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp}" fi ff_blas_ok=yes ff_lapack_ok=yes # <> ALH - 6/11/13 - request from Atsushi Suzuki - the default MKL library must be able to # handle threads when FF is connected to AS' solver. So we need an option to configure FF with the # multithreaded MKL by default. # Check whether --enable-mkl_mlt was given. if test "${enable_mkl_mlt+set}" = set; then : enableval=$enable_mkl_mlt; fi if test "$enable_mkl_mlt" = yes then ff_blas_libs="$ff_mkl_mlt" else ff_blas_libs="$ff_mkl_blas" fi ff_blas_inc="-I$ff_mkl_root/include" if test "$ff_mkl_mpi" != "_sgimpt" ; then if test -z "$ff_where_lib_conf_scalapack" ; then echo "scalapack LD $ff_mkl_scalapack" >>$ff_where_lib_conf test -n "$ff_blas_inc" && echo "scalapack INCLUDE $ff_blas_inc " >>$ff_where_lib_conf ff_where_lib_conf_scalapack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add scalapack : $ff_mkl_scalapack $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add scalapack : $ff_mkl_scalapack $ff_blas_inc in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add scalapack : $ff_mkl_scalapack $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add scalapack : $ff_mkl_scalapack $ff_blas_inc in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_blacs" ; then echo "blacs LD $ff_mkl_blacs" >>$ff_where_lib_conf test -n "$ff_blas_inc" && echo "blacs INCLUDE $ff_blas_inc " >>$ff_where_lib_conf ff_where_lib_conf_blacs=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add blacs : $ff_mkl_blacs $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add blacs : $ff_mkl_blacs $ff_blas_inc in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add blacs : $ff_mkl_blacs $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add blacs : $ff_mkl_blacs $ff_blas_inc in $ff_where_lib_conf \"" >&6;} fi else ff_warm=" (We do not use MKL scalapack and blacs with sgi MPI), " fi if test -z "$ff_where_lib_conf_lapack" ; then echo "lapack LD $ff_mkl_lapack" >>$ff_where_lib_conf test -n "$ff_blas_inc" && echo "lapack INCLUDE $ff_blas_inc " >>$ff_where_lib_conf ff_where_lib_conf_lapack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add lapack : $ff_mkl_lapack $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add lapack : $ff_mkl_lapack $ff_blas_inc in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add lapack : $ff_mkl_lapack $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add lapack : $ff_mkl_lapack $ff_blas_inc in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_mkl" ; then echo "mkl LD $ff_mkl_mlt" >>$ff_where_lib_conf test -n "$ff_blas_inc" && echo "mkl INCLUDE $ff_blas_inc " >>$ff_where_lib_conf ff_where_lib_conf_mkl=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mkl : $ff_mkl_mlt $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mkl : $ff_mkl_mlt $ff_blas_inc in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mkl : $ff_mkl_mlt $ff_blas_inc in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mkl : $ff_mkl_mlt $ff_blas_inc in $ff_where_lib_conf \"" >&6;} fi $as_echo "#define HAVE_MKL 1" >>confdefs.h else ff_mkl_libpath=no # FH - pardiso is there as soon as mkl is enable_pardiso=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_warm root: $ff_mkl_root , arch: $ff_mkl_arch , $ff_mkl_lp ... " >&5 $as_echo " $ff_warm root: $ff_mkl_root , arch: $ff_mkl_arch , $ff_mkl_lp ... " >&6; } # Check whether --with-blas was given. if test "${with_blas+set}" = set; then : withval=$with_blas; ff_blas_ok=yes ff_blas_libs="${withval}" fi # Specific BLAS library location for FreeBSD ff_freebsd_blas="-lf2c -lf77blas -latlas -lgslcblas" # zmach is in lapack # Trying blas library # echo "LIBS = $LIBS blas --- $ff_blas_ok" for iblas in \ "-framework Accelerate" "$ff_mkl_blas" "-lblas" "-L/usr/lib/atlas -lblas" \ $ff_freebsd_blas do if test "$ff_blas_ok" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for daxpy_ in $iblas" >&5 $as_echo_n "checking for daxpy_ in $iblas... " >&6; } ff_save_libs="$LIBS" LIBS="$LIBS $iblas" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char daxpy_ (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return daxpy_ (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_blas_ok=yes ff_blas_libs="$iblas" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ff_save_libs" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_blas_ok" >&5 $as_echo "$ff_blas_ok" >&6; } fi done #cblas_zdotu_sub #echo "LIBS = " $LIBS ff_cblas_libs=no if test "$ff_blas_ok" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for blas_zdotu_sub in $ff_blas_libs" >&5 $as_echo_n "checking for blas_zdotu_sub in $ff_blas_libs... " >&6; } ff_save_libs="$LIBS" LIBS="$LIBS $ff_blas_libs $FLIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cblas_zdotu_sub (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return cblas_zdotu_sub (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_cblas_libs=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_cblas_libs" >&5 $as_echo "$ff_cblas_libs" >&6; } LIBS="$ff_save_libs" fi fi # <> ALH - 18/9/13 - option to compile the OpenBLAS moved from the FFCS tree to FF tree # Check whether --enable-openblas was given. if test "${enable_openblas+set}" = set; then : enableval=$enable_openblas; fi if test "$ff_blas_ok" = no && test "$enable_openblas" != no && test "$enable_download" = yes then # Extract the first word of "git", so it can be a program name with args. set dummy git; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_git+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_git"; then ac_cv_prog_ff_git="$ff_git" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_git="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_git" && ac_cv_prog_ff_git="no" fi fi ff_git=$ac_cv_prog_ff_git if test -n "$ff_git"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_git" >&5 $as_echo "$ff_git" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking Activating the OpenBLAS (deactivate with --disable-openblas)" >&5 $as_echo_n "checking Activating the OpenBLAS (deactivate with --disable-openblas)... " >&6; } if test $ff_git = no then { $as_echo "$as_me:${as_lineno-$LINENO}: result: git not found" >&5 $as_echo "git not found" >&6; } else ff_download_blas=openblas # it is necessary to split the library path into -L and -l otherwise ff/upstream/examples+++-load/ff-c++ will # place -lgfortran in LIBS, .../libgoto___.lib in OTHER, and call the compiler with $LIBS before $OTHER, which # will fail. ff_blas_libs="-L${curdir}/download/blas/OpenBLAS -lopenblas -lgfortran $ff_pthread" ff_blas_inc="-I${curdir}/download/blas/CBLAS/src" # skip generic blas compilation and activate OpenBLAS (see [[file:download/blas/Makefile.am::OpenBLAS]]) DOWNLOADED_BLAS="" COMPILE_OPENBLAS=openblas ff_blas_ok=yes ff_cblas_h=yes ff_cblas_libs=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi fi # If all else fails, download a generic version if test "$ff_blas_ok" = no -a "$enable_download" = yes -a "$enable_fortran" != no -a "$enable_c" != no then # Extract the first word of "unzip", so it can be a program name with args. set dummy unzip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_unzip+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_unzip"; then ac_cv_prog_ff_unzip="$ff_unzip" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_unzip="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_unzip" && ac_cv_prog_ff_unzip="no" fi fi ff_unzip=$ac_cv_prog_ff_unzip if test -n "$ff_unzip"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_unzip" >&5 $as_echo "$ff_unzip" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BLAS version to download" >&5 $as_echo_n "checking for BLAS version to download... " >&6; } # Do not update $LIBS, but create an extra LIB variable, because this lib does not exist yet, and this could make # the following tests fail. # When compiling a generic version, we do not need an optimized version of the BLAS. ff_download_blas=generic ff_blas_libs="-L${curdir}/download/blas -lcblas -lf77blas" ff_blas_inc="-I${curdir}/download/blas/CBLAS/src" DOWNLOADED_BLAS="libf77blas.a libcblas.a" DOWNLOADED_BLAS_BUILT_SOURCES='BLAS CBLAS $(F77BLAS_SOURCES) $(CBLAS_SOURCES)' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_download_blas" >&5 $as_echo "$ff_download_blas" >&6; } ff_blas_ok=yes ff_cblas_h=yes ff_cblas_libs=yes fi BLASLIBS=$ff_blas_libs BLASINC=$ff_blas_inc #looking for cblas.h FH if test "$ff_blas_ok" = yes -a "$ff_cblas_libs" = yes ; then for ac_header in cblas.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "cblas.h" "ac_cv_header_cblas_h" "$ac_includes_default" if test "x$ac_cv_header_cblas_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CBLAS_H 1 _ACEOF ff_cblas_h=yes else ff_cblas_h=no fi done for ac_header in Accelerate/cblas.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "Accelerate/cblas.h" "ac_cv_header_Accelerate_cblas_h" "$ac_includes_default" if test "x$ac_cv_header_Accelerate_cblas_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ACCELERATE_CBLAS_H 1 _ACEOF ff_cblas_h=yes ff_cblas_h=no fi done for ac_header in atlas/cblas.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "atlas/cblas.h" "ac_cv_header_atlas_cblas_h" "$ac_includes_default" if test "x$ac_cv_header_atlas_cblas_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ATLAS_CBLAS_H 1 _ACEOF ff_cblas_h=yes ff_cblas_h=no fi done fi # ALH - 18/9/13 - [[file:download/blas/Makefile.am]] does not update the WHERE mechanism so it always needs to be set up # here even in the case of a downloaded blas library. if test -z "$ff_where_lib_conf_blas" ; then echo "blas LD $ff_blas_libs" >>$ff_where_lib_conf test -n "" && echo "blas INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_blas=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add blas : $ff_blas_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add blas : $ff_blas_libs in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add blas : $ff_blas_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add blas : $ff_blas_libs in $ff_where_lib_conf \"" >&6;} fi # end of BLAS ------------------- # Looking for ARPACK # ------------------ # We need the following g77 libraries to connect to the Fortran 77 # Arpack. if test "$ff_blas_ok" = yes; then ff_g2c_lib="$FLIBS" if test -n "$ff_g2c_lib" then LIBS="$LIBS $ff_g2c_lib" else ff_g2c_ok=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for G77_second_0 in -lg2c" >&5 $as_echo_n "checking for G77_second_0 in -lg2c... " >&6; } if ${ac_cv_lib_g2c_G77_second_0+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lg2c $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char G77_second_0 (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return G77_second_0 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_g2c_G77_second_0=yes else ac_cv_lib_g2c_G77_second_0=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_g2c_G77_second_0" >&5 $as_echo "$ac_cv_lib_g2c_G77_second_0" >&6; } if test "x$ac_cv_lib_g2c_G77_second_0" = xyes; then : LIBS="$LIBS -lg2c" ff_g2c_lib="-lg2c" ff_g2c_ok=yes fi if test "$ff_g2c_ok" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for G77_second_0 in /sw/lib/libg2c.a" >&5 $as_echo_n "checking for G77_second_0 in /sw/lib/libg2c.a... " >&6; } ff_save_libs="$LIBS" LIBS="$LIBS -L/sw/lib -lg2c" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char G77_second_0 (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return G77_second_0 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_g2c_lib="-L/sw/lib -lg2c" ff_g2c_ok=yes else LIBS="$ff_save_libs" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_g2c_ok" >&5 $as_echo "$ff_g2c_ok" >&6; } fi fi fi # Copy the result of g2c investigations into a separate variable # because BLAS compilation will need it. G2CLIB=$ff_g2c_lib #looking of lapack if no compile the arpack lapack # warning $$ because the make eat one ff_lapack_ok=no; ff_lapack_lib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lapack in $LIBS, $ff_blas_libs and -llapack " >&5 $as_echo_n "checking for lapack in $LIBS, $ff_blas_libs and -llapack ... " >&6; } if test "$ff_blas_ok" = yes ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgeqr2_ (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return dgeqr2_ (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_lapack_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_lapack_ok" = no ; then ff_save_libs=$LIBS LIBS="$ff_save_libs $ff_blas_libs" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgeqr2_ (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return dgeqr2_ (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_lapack_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_lapack_ok" = no ; then LIBS="$ff_save_libs -llapack $ff_blas_libs" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgeqr2_ (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return dgeqr2_ (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_lapack_ok=yes ff_lapack_lib="-llapack" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi LIBS="$ff_save_libs" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_lapack_ok" >&5 $as_echo "$ff_lapack_ok" >&6; } if test "$ff_lapack_ok" != no ; then LAPACKLIBS=$ff_lapack_lib fi if test "$ff_lapack_ok" = no; then # Check whether --with-lapack was given. if test "${with_lapack+set}" = set; then : withval=$with_lapack; ff_lapack_ok=yes ff_lapack_lib="${withval}" LIBS="$ff_lapack_lib $LIBS" fi fi # Lapack configuration for Arpack ff_lapackdir='$$(LAPACKdir)' if test "$ff_lapack_ok" = yes then # no compilation of lapack in arpack ff_lapackdir= else ff_lapack_lib="-L${curdir}/download/lib -llapack" fi # Arpack itself ff_arpack_ok=no ff_save_libs="$LIBS" ff_arpack_libs= if test "$ff_blas_ok" = yes; then # User-specified location # Check whether --with-arpack was given. if test "${with_arpack+set}" = set; then : withval=$with_arpack; ff_arpack_ok=yes ff_arpack_libs="${withval}" fi # Default locations if test "$ff_arpack_ok" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dsaupd_ in -larpack" >&5 $as_echo_n "checking for dsaupd_ in -larpack... " >&6; } if ${ac_cv_lib_arpack_dsaupd_+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-larpack -llapack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dsaupd_ (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return dsaupd_ (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_arpack_dsaupd_=yes else ac_cv_lib_arpack_dsaupd_=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_arpack_dsaupd_" >&5 $as_echo "$ac_cv_lib_arpack_dsaupd_" >&6; } if test "x$ac_cv_lib_arpack_dsaupd_" = xyes; then : ff_arpack_libs="-larpack -llapack" ff_arpack_ok=yes fi fi # Trying to "locate" Arpack if test "$ff_arpack_ok" = no -a "$enable_download" != yes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libarpack with locate" >&5 $as_echo_n "checking for libarpack with locate... " >&6; } ff_lib_arpack=`locate libarpack|grep 'libarpack.*.a$'|head -1` LIBS="$ff_lib_arpack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dsaupd_ (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return dsaupd_ (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_arpack_ok=yes ff_arpack_libs="$ff_lib_arpack" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_arpack_ok" >&5 $as_echo "$ff_arpack_ok" >&6; } fi if test "$ff_arpack_ok" = yes then if test -z "$ff_where_lib_conf_arpack" ; then echo "arpack LD $ff_arpack_libs" >>$ff_where_lib_conf test -n "" && echo "arpack INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_arpack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add arpack : $ff_arpack_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add arpack : $ff_arpack_libs in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add arpack : $ff_arpack_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add arpack : $ff_arpack_libs in $ff_where_lib_conf \"" >&6;} fi echo arpack LD "'$ff_arpack_libs'" >>$ff_where_lib_conf fi # If all else fails, download! if test "$ff_arpack_ok" = no -a "$enable_download" = yes \ -a "$enable_fortran" != no then ff_arpack_download=yes { $as_echo "$as_me:${as_lineno-$LINENO}: using downloaded Arpack" >&5 $as_echo "$as_me: using downloaded Arpack" >&6;} # ALH - 6/11/13 - this install goal is the standard goal for all downloaded packages in # [[file:download/common.mak::install]] DOWNLOAD_ARPACK=install FF_LAPACKdir=$ff_lapackdir ARPACKLIB=${curdir}/download/lib/libarpack.a LAPACK_arpack_LIB=${curdir}/download/lib/liblapack.a # Do not update $LIBS, but create an extra LIB variable, because this lib does not exist yet, and this # could make the following tests fail. # ALH - 30/9/13 - do not use the "-L ${curdir}/download/lib" directive because it would allow other # following -l directives (eg -lumfpack) to pick an old locally compiled library instead of the system # ones. ff_arpack_libs="${curdir}/download/lib/libarpack.a $ff_lapack_lib" ff_arpack_ok=yes fi fi if test "$ff_arpack_ok" != yes then { $as_echo "$as_me:${as_lineno-$LINENO}: -- NO ARPACK -- enable_download : $enable_download , wget: $ff_wget " >&5 $as_echo "$as_me: -- NO ARPACK -- enable_download : $enable_download , wget: $ff_wget " >&6;} fi # Do not insert ARPACK libs in $LIBS yet, because they may not exist # yet, and this could make the following tests fail. LIBS="$ff_save_libs" if test "$ff_arpack_ok" = yes; then ARPACKLIBS=$ff_arpack_libs EIGENOBJ='eigenvalue.$(OBJEXT)' $as_echo "#define HAVE_LIBARPACK 1" >>confdefs.h # Determines whether to run the eigenvalue tests else # all eigen test fails SKIP_TESTS_EIGEN=yes fi # ALH - 25/9/13 - <> always run the WHERE LD statement for lapack because some libraries in # examples++-load require it (eg [[file:examples++-load/Element_Mixte.cpp::lapack]]). Request from Fred. if test -z "$ff_where_lib_conf_lapack" ; then echo "lapack LD $ff_lapack_lib" >>$ff_where_lib_conf test -n "" && echo "lapack INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_lapack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add lapack : $ff_lapack_lib in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add lapack : $ff_lapack_lib in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add lapack : $ff_lapack_lib in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add lapack : $ff_lapack_lib in $ff_where_lib_conf \"" >&6;} fi # Looking for UMFPACK # ------------------- ff_amd_ok=no ff_umfpack_ok=no ff_save_libs="$LIBS" # Check whether --enable-system_umfpack was given. if test "${enable_system_umfpack+set}" = set; then : enableval=$enable_system_umfpack; fi if test "$enable_system_umfpack" != no -a "$ff_blas_ok" = yes; then # User-specified location # Check whether --with-amd was given. if test "${with_amd+set}" = set; then : withval=$with_amd; ff_amd_ok=yes ff_umfpack_libs="${withval}" fi # Check whether --with-umfpack was given. if test "${with_umfpack+set}" = set; then : withval=$with_umfpack; ff_umfpack_ok=yes ff_umfpack_libs="${withval} $ff_umfpack_libs" fi # Trying default locations for the headers for ac_header in umfpack.h umfpack/umfpack.h ufsparse/umfpack.h suitesparse/umfpack.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF ff_umfpack_header=yes ff_umfpack_dir=`dirname $ac_header` fi done # Somes systems like FreeBSD hide umfpack.h in a directory called UMFPACK (all capitals). This breaks the # standard #define produced by autoconf in config.h.in. LIBS="$ff_blas_libs $LIBS" if test "$ff_umfpack_header" != yes; then ac_fn_cxx_check_header_mongrel "$LINENO" "UMFPACK/umfpack.h" "ac_cv_header_UMFPACK_umfpack_h" "$ac_includes_default" if test "x$ac_cv_header_UMFPACK_umfpack_h" = xyes; then : ff_umfpack_header=yes ff_umfpack_dir=UMFPACK $as_echo "#define HAVE_BIG_UMFPACK_UMFPACK_H 1" >>confdefs.h fi fi if test "$ff_amd_ok" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for amd_info in -lamd" >&5 $as_echo_n "checking for amd_info in -lamd... " >&6; } if ${ac_cv_lib_amd_amd_info+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lamd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char amd_info (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return amd_info (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_amd_amd_info=yes else ac_cv_lib_amd_amd_info=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_amd_amd_info" >&5 $as_echo "$ac_cv_lib_amd_amd_info" >&6; } if test "x$ac_cv_lib_amd_amd_info" = xyes; then : ff_umfpack_libs="$ff_umfpack_libs -lamd" ff_amd_ok=yes fi fi if test "$ff_umfpack_ok" = no -a "$ff_amd_ok" = yes; then # ALH - 30/9/13 - other libraries required by Umfpack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cholmod_add in -lcholmod" >&5 $as_echo_n "checking for cholmod_add in -lcholmod... " >&6; } if ${ac_cv_lib_cholmod_cholmod_add+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcholmod $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cholmod_add (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return cholmod_add (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_cholmod_cholmod_add=yes else ac_cv_lib_cholmod_cholmod_add=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cholmod_cholmod_add" >&5 $as_echo "$ac_cv_lib_cholmod_cholmod_add" >&6; } if test "x$ac_cv_lib_cholmod_cholmod_add" = xyes; then : ff_umfpack_libs="$ff_umfpack_libs -lcholmod" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for colamd_set_defaults in -lcolamd" >&5 $as_echo_n "checking for colamd_set_defaults in -lcolamd... " >&6; } if ${ac_cv_lib_colamd_colamd_set_defaults+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcolamd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char colamd_set_defaults (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return colamd_set_defaults (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_colamd_colamd_set_defaults=yes else ac_cv_lib_colamd_colamd_set_defaults=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_colamd_colamd_set_defaults" >&5 $as_echo "$ac_cv_lib_colamd_colamd_set_defaults" >&6; } if test "x$ac_cv_lib_colamd_colamd_set_defaults" = xyes; then : ff_umfpack_libs="$ff_umfpack_libs -lcolamd" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for umf_i_malloc in -lumfpack" >&5 $as_echo_n "checking for umf_i_malloc in -lumfpack... " >&6; } if ${ac_cv_lib_umfpack_umf_i_malloc+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lumfpack $ff_umfpack_libs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char umf_i_malloc (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return umf_i_malloc (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_umfpack_umf_i_malloc=yes else ac_cv_lib_umfpack_umf_i_malloc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_umfpack_umf_i_malloc" >&5 $as_echo "$ac_cv_lib_umfpack_umf_i_malloc" >&6; } if test "x$ac_cv_lib_umfpack_umf_i_malloc" = xyes; then : ff_umfpack_libs="-lumfpack $ff_umfpack_libs" ff_umfpack_ok=yes fi fi if test "$ff_umfpack_header" != yes -o "$ff_umfpack_ok" != yes; then ff_umfpack_ok=no { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Sorry, we could not find the UMFPACK lib or the UMFPACK headers" >&5 $as_echo "$as_me: WARNING: Sorry, we could not find the UMFPACK lib or the UMFPACK headers" >&2;} fi if test "$ff_umfpack_ok" = yes -a "$ff_amd_ok" = yes; then $as_echo "#define HAVE_LIBUMFPACK 1" >>confdefs.h fi fi LIBS="$ff_save_libs" # If all else fails, download! if test "$ff_umfpack_ok" = no -a "$enable_download" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: using downloaded UMFPACK" >&5 $as_echo "$as_me: using downloaded UMFPACK" >&6;} DOWNLOAD_UMFPACK="umfpack" ff_umfpack_download=yes # Do not update $LIBS, but create an extra LIB variable, because this lib does not exist yet, and this could make # the following tests fail. ff_umfpack_libs="-L${curdir}/download/lib -lumfpack -lcholmod -lcolamd -lamd -lsuitesparseconfig" $as_echo "#define HAVE_LIBUMFPACK 1" >>confdefs.h if test "$ff_win32" = yes; then FF_UMFPACK_CONFIG=-DCBLAS fi ff_umfpack_ok=yes fi # ALH - 17/9/13 - moved UMFPACK configuration settings in wherelib to _after_ configuring the download version because # [[file:download/umfpack/Makefile.am]] does not set the WHERE mechanism. Also removed -I/usr/include/$ff_umfpack_dir # from include options for FFCS because it breaks the MingW64 compilation process. if test "$ff_umfpack_ok" = yes then if test $enable_ffcs = no then if test -z "$ff_where_lib_conf_amd" ; then echo "amd LD $ff_umfpack_libs" >>$ff_where_lib_conf test -n "-I/usr/include/$ff_umfpack_dir" && echo "amd INCLUDE -I/usr/include/$ff_umfpack_dir " >>$ff_where_lib_conf ff_where_lib_conf_amd=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add amd : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add amd : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add amd : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add amd : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_umfpack" ; then echo "umfpack LD $ff_umfpack_libs" >>$ff_where_lib_conf test -n "-I/usr/include/$ff_umfpack_dir" && echo "umfpack INCLUDE -I/usr/include/$ff_umfpack_dir " >>$ff_where_lib_conf ff_where_lib_conf_umfpack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add umfpack : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add umfpack : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add umfpack : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add umfpack : $ff_umfpack_libs -I/usr/include/$ff_umfpack_dir in $ff_where_lib_conf \"" >&6;} fi else if test -z "$ff_where_lib_conf_amd" ; then echo "amd LD $ff_umfpack_libs" >>$ff_where_lib_conf test -n "" && echo "amd INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_amd=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add amd : $ff_umfpack_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add amd : $ff_umfpack_libs in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add amd : $ff_umfpack_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add amd : $ff_umfpack_libs in $ff_where_lib_conf \"" >&6;} fi if test -z "$ff_where_lib_conf_umfpack" ; then echo "umfpack LD $ff_umfpack_libs" >>$ff_where_lib_conf test -n "" && echo "umfpack INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_umfpack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add umfpack : $ff_umfpack_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add umfpack : $ff_umfpack_libs in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add umfpack : $ff_umfpack_libs in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add umfpack : $ff_umfpack_libs in $ff_where_lib_conf \"" >&6;} fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: -- NO UMFPACK (ff_wget = $ff_wget)" >&5 $as_echo "$as_me: -- NO UMFPACK (ff_wget = $ff_wget)" >&6;} fi UMFPACKLIBS=$ff_umfpack_libs # If times() and sysconf() are not here, UMFPACK should know if test "$ff_umfpack_ok" = yes then for ac_func in times sysconf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF ff_umfpack_posix_ok=yes else ff_umfpack_posix_ok=no fi done if test "$ff_umfpack_posix_ok" = no then FF_UMFPACK_CONFIG="-DCBLAS -DNPOSIX" fi fi # Checking for some functions that may not appear everywhere # ---------------------------------------------------------- for ac_header in regex.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "regex.h" "ac_cv_header_regex_h" "$ac_includes_default" if test "x$ac_cv_header_regex_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_REGEX_H 1 _ACEOF ff_regex_h=1 else ff_regex_h=0 fi done FF_HAVE_REGEX_H=$ff_regex_h for ac_header in unistd.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNISTD_H 1 _ACEOF fi done # asinh acosh atanh are not in Mingw yet gettimeofday ff_malloc_h="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi for ac_header in malloc.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_H 1 _ACEOF ff_malloc_h=1 fi done FF_MALLOC_H=$ff_malloc_h for ac_func in asinh acosh atanh getenv jn erfc tgamma gettimeofday mallinfo mstats do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in srandomdev do : ac_fn_cxx_check_func "$LINENO" "srandomdev" "ac_cv_func_srandomdev" if test "x$ac_cv_func_srandomdev" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SRANDOMDEV 1 _ACEOF fi done for ac_func in second_ do : ac_fn_cxx_check_func "$LINENO" "second_" "ac_cv_func_second_" if test "x$ac_cv_func_second_" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SECOND_ 1 _ACEOF ff_second="" else ff_second=second.o fi done FF_SECOND="$ff_second" # Enable static linking (no shared libraries) # ------------------------------------------- # Extract the first word of "libtool", so it can be a program name with args. set dummy libtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_libtool+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_libtool"; then ac_cv_prog_ff_libtool="$ff_libtool" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_libtool="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_libtool" && ac_cv_prog_ff_libtool="no" fi fi ff_libtool=$ac_cv_prog_ff_libtool if test -n "$ff_libtool"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_libtool" >&5 $as_echo "$ff_libtool" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ff_mac" = "yes" -a "$ff_libtool" = yes ; then ff_AR="libtool" ff_ARFLAGS="-static -o" ff_RANLIB="echo" fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; fi if test "$enable_static" = yes then # Extract the first word of "libtool", so it can be a program name with args. set dummy libtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_libtool+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_libtool"; then ac_cv_prog_ff_libtool="$ff_libtool" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_libtool="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_libtool" && ac_cv_prog_ff_libtool="no" fi fi ff_libtool=$ac_cv_prog_ff_libtool if test -n "$ff_libtool"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_libtool" >&5 $as_echo "$ff_libtool" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ff_libtool" = yes then LDFLAGS="$LDFLAGS -all-static" STATICTOOL=libtool else as_fn_error $? "libtool not found" "$LINENO" 5 fi fi # for compiation of arpack use libtool to bluid universal library on MacOs. AR=$ff_AR ARFLAGS=$ff_ARFLAGS RANLIN=$ff_RANLIB # Dynamic loading of compiled functions # ------------------------------------- # Not if we don't want shared libraries (non FH modif FH juin 2005) ff_dynload=no if test "$enable_static" != yes then # Availability of dlopen(). Use AC_COMPILE rather than # AC_CHECK_HEADERS because the latter has problems seeing it (in # Cygwin) when it does not compile (in Mingw). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlfcn.h" >&5 $as_echo_n "checking for dlfcn.h... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ff_dynload=yes else ff_dynload=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_dynload" >&5 $as_echo "$ff_dynload" >&6; } fi # FFCS - -lm missing for ffmedit link stage on Debian Testing { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 $as_echo_n "checking for sin in -lm... " >&6; } if ${ac_cv_lib_m_sin+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sin (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return sin (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_m_sin=yes else ac_cv_lib_m_sin=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 $as_echo "$ac_cv_lib_m_sin" >&6; } if test "x$ac_cv_lib_m_sin" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi # Checks that we also have the corresponding library if test "$ff_dynload" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlinfo in -ldl" >&5 $as_echo_n "checking for dlinfo in -ldl... " >&6; } if ${ac_cv_lib_dl_dlinfo+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlinfo (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return dlinfo (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dl_dlinfo=yes else ac_cv_lib_dl_dlinfo=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlinfo" >&5 $as_echo "$ac_cv_lib_dl_dlinfo" >&6; } if test "x$ac_cv_lib_dl_dlinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi # Checks that everythings works ok { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dlopen links ok" >&5 $as_echo_n "checking whether dlopen links ok... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv){ dlopen("",RTLD_LAZY); return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_dynload=yes else ff_dynload=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_dynload" >&5 $as_echo "$ff_dynload" >&6; } fi # the -rdynamic don't exist on macos and sunOS if test "$ff_dynload" = yes then $as_echo "#define HAVE_DLFCN_H 1" >>confdefs.h # Activate dynamic loading tests (see examples++-load/Makefile.am) LOAD_TESTS=../regtests.sh LOAD_COMPILE=load_compile # gcc on MacOS does not produce an error with "-rdynamic" but # still complains about it. if test "$ff_mac" = "no" -a "$ff_win32" = "no" -a "$ff_sunos" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -rdynamic" >&5 $as_echo_n "checking whether the C++ compiler accepts -rdynamic... " >&6; } check_save_flags="$LDFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu LDFLAGS="$LDFLAGS -rdynamic" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then LDFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler accepts -fPIC" >&5 $as_echo_n "checking whether the C++ compiler accepts -fPIC... " >&6; } check_save_flags="$CXXFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CXXFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -fPIC" >&5 $as_echo_n "checking whether the C compiler accepts -fPIC... " >&6; } check_save_flags="$CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts -fPIC" >&5 $as_echo_n "checking whether the C compiler accepts -fPIC... " >&6; } check_save_flags="$CNOFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CNOFLAGS="$CNOFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then CNOFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$enable_fortran" != no then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler accepts -fPIC" >&5 $as_echo_n "checking whether the Fortran compiler accepts -fPIC... " >&6; } check_save_flags="$FFLAGS" ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu FFLAGS="$FFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler accepts -fPIC" >&5 $as_echo_n "checking whether the Fortran compiler accepts -fPIC... " >&6; } check_save_flags="$FNOFLAGS" ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu FNOFLAGS="$FNOFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FNOFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler accepts -fPIC" >&5 $as_echo_n "checking whether the Fortran compiler accepts -fPIC... " >&6; } check_save_flags="$FCFLAGS" ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu FCFLAGS="$FCFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FCFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler accepts -fPIC" >&5 $as_echo_n "checking whether the Fortran compiler accepts -fPIC... " >&6; } check_save_flags="$FCNOFLAGS" ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu FCNOFLAGS="$FCNOFLAGS -fPIC" # The program needs to contain something for the test source # file to be created by autoconf. # Some options really need to be linked (not only compiled) to # check whether they work. cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : check_flag_ok=yes else check_flag_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_flag_ok" >&5 $as_echo "$check_flag_ok" >&6; } if test "$check_flag_ok" = no; then FCNOFLAGS="$check_save_flags" fi if test -n "" ; then ="$check_flag_ok" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi DYLIB_SUFFIX=$ff_suffix_dylib # Checking wether we can generate some documentation # -------------------------------------------------- # Extract the first word of "latex", so it can be a program name with args. set dummy latex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_latex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_latex"; then ac_cv_prog_ff_latex="$ff_latex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_latex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_latex" && ac_cv_prog_ff_latex="no" fi fi ff_latex=$ac_cv_prog_ff_latex if test -n "$ff_latex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_latex" >&5 $as_echo "$ff_latex" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "makeindex", so it can be a program name with args. set dummy makeindex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_makeindex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_makeindex"; then ac_cv_prog_ff_makeindex="$ff_makeindex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_makeindex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_makeindex" && ac_cv_prog_ff_makeindex="no" fi fi ff_makeindex=$ac_cv_prog_ff_makeindex if test -n "$ff_makeindex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_makeindex" >&5 $as_echo "$ff_makeindex" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "dvips", so it can be a program name with args. set dummy dvips; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_dvips+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_dvips"; then ac_cv_prog_ff_dvips="$ff_dvips" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_dvips="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_dvips" && ac_cv_prog_ff_dvips="no" fi fi ff_dvips=$ac_cv_prog_ff_dvips if test -n "$ff_dvips"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_dvips" >&5 $as_echo "$ff_dvips" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # to translate the figure # Extract the first word of "pdf2ps", so it can be a program name with args. set dummy pdf2ps; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_pdf2ps+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_pdf2ps"; then ac_cv_prog_ff_pdf2ps="$ff_pdf2ps" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_pdf2ps="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_pdf2ps" && ac_cv_prog_ff_pdf2ps="no" fi fi ff_pdf2ps=$ac_cv_prog_ff_pdf2ps if test -n "$ff_pdf2ps"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_pdf2ps" >&5 $as_echo "$ff_pdf2ps" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in epstopdf pstopdf do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_EPSTOPDF+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$EPSTOPDF"; then ac_cv_prog_EPSTOPDF="$EPSTOPDF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_EPSTOPDF="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi EPSTOPDF=$ac_cv_prog_EPSTOPDF if test -n "$EPSTOPDF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EPSTOPDF" >&5 $as_echo "$EPSTOPDF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$EPSTOPDF" && break done test -n "$EPSTOPDF" || EPSTOPDF="false" # Extract the first word of "convert", so it can be a program name with args. set dummy convert; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_convert+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_convert"; then ac_cv_prog_ff_convert="$ff_convert" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_convert="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_convert" && ac_cv_prog_ff_convert="no" fi fi ff_convert=$ac_cv_prog_ff_convert if test -n "$ff_convert"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_convert" >&5 $as_echo "$ff_convert" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ff_latex" = yes -a "$ff_makeindex" = yes -a "$ff_dvips" = yes -a $ff_pdf2ps = yes -a $ff_convert = yes; then DOCPS="freefem++doc.ps" # Extract the first word of "gzip", so it can be a program name with args. set dummy gzip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_gzip+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_gzip"; then ac_cv_prog_ff_gzip="$ff_gzip" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_gzip="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_gzip" && ac_cv_prog_ff_gzip="no" fi fi ff_gzip=$ac_cv_prog_ff_gzip if test -n "$ff_gzip"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_gzip" >&5 $as_echo "$ff_gzip" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ff_gzip" = yes; then DOCPSGZ="freefem++doc.ps.gz" fi fi # PDF documentation building sometimes poses problems because of # pdfsync.sty. So we need to be able to disable it. enable_pdf=yes # Check whether --enable-pdf was given. if test "${enable_pdf+set}" = set; then : enableval=$enable_pdf; fi if test "$enable_pdf" != no then # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_pdflatex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_pdflatex"; then ac_cv_prog_ff_pdflatex="$ff_pdflatex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_pdflatex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_pdflatex" && ac_cv_prog_ff_pdflatex="no" fi fi ff_pdflatex=$ac_cv_prog_ff_pdflatex if test -n "$ff_pdflatex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_pdflatex" >&5 $as_echo "$ff_pdflatex" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ff_pdflatex" = yes -a $EPSTOPDF != false -a $ff_convert = yes; then DOCPDF="freefem++doc.pdf" fi fi # HISTORY logging through CVS, but only if we are in a CVS working area if test -d CVS then # Extract the first word of "cvs2cl", so it can be a program name with args. set dummy cvs2cl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ff_history+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ff_history"; then ac_cv_prog_ff_history="$ff_history" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ff_history="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ff_history" && ac_cv_prog_ff_history="no" fi fi ff_history=$ac_cv_prog_ff_history if test -n "$ff_history"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_history" >&5 $as_echo "$ff_history" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ff_history" = yes then HISTORY=history fi fi # Choosing compilation options for the standard version (in src/std) # ------------------------------------------------------------------ # The "standard" configured version can use win32 (mingw) if test "$ff_mingw" = yes then # FFCS does not use FreeFem++-std, and Pcrgraph.cpp does not compile under mingwin64 if test $enable_ffcs = no then ff_stdprog="FreeFem++-std${EXEEXT}" ff_std_graph_obj=Pcrgraph.$OBJEXT fi # ALH - FFCS - 30/11/8 - I need to get the output from FF for FFCS regression tests if test $enable_ffcs = yes then ff_std_ldflags="-mconsole -mwindows" else ff_std_ldflags=-mwindows fi ff_std_libs= fi STD_GRAPH_OBJ=$ff_std_graph_obj STD_LDFLAGS=$ff_std_ldflags STD_LIBS=$ff_std_libs # Allow some downloaded tools not to be compiled # ---------------------------------------------- # ALH - this is required by FFCS that needs to deactivate some tools that do not work on all platforms. Some FF users # may also find interesting to specify a local version of a tool instead of downloading it. # m4 macro parameters: $1 = tool name, $2 = dynamic library name, $3 = download directory name if different from $1 ## try to see pakage is hon computer if the FH ZZZZ ## FH to find gsl ... # Check whether --with-gsl-prefix was given. if test "${with_gsl_prefix+set}" = set; then : withval=$with_gsl_prefix; gsl_prefix="$withval" else gsl_prefix="" fi # Check whether --with-gsl-exec-prefix was given. if test "${with_gsl_exec_prefix+set}" = set; then : withval=$with_gsl_exec_prefix; gsl_exec_prefix="$withval" else gsl_exec_prefix="" fi # Check whether --enable-gsltest was given. if test "${enable_gsltest+set}" = set; then : enableval=$enable_gsltest; else enable_gsltest=yes fi if test "x${GSL_CONFIG+set}" != xset ; then if test "x$gsl_prefix" != x ; then GSL_CONFIG="$gsl_prefix/bin/gsl-config" fi if test "x$gsl_exec_prefix" != x ; then GSL_CONFIG="$gsl_exec_prefix/bin/gsl-config" fi fi # Extract the first word of "gsl-config", so it can be a program name with args. set dummy gsl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GSL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GSL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GSL_CONFIG="$GSL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GSL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GSL_CONFIG" && ac_cv_path_GSL_CONFIG="no" ;; esac fi GSL_CONFIG=$ac_cv_path_GSL_CONFIG if test -n "$GSL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSL_CONFIG" >&5 $as_echo "$GSL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_gsl_version=1.15 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSL - version >= $min_gsl_version" >&5 $as_echo_n "checking for GSL - version >= $min_gsl_version... " >&6; } no_gsl="" if test "$GSL_CONFIG" = "no" ; then no_gsl=yes else GSL_CFLAGS=`$GSL_CONFIG --cflags` GSL_LIBS=`$GSL_CONFIG --libs` gsl_major_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\).*/\1/'` if test "x${gsl_major_version}" = "x" ; then gsl_major_version=0 fi gsl_minor_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\)\.\{0,1\}\([0-9]*\).*/\2/'` if test "x${gsl_minor_version}" = "x" ; then gsl_minor_version=0 fi gsl_micro_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\)\.\{0,1\}\([0-9]*\)\.\{0,1\}\([0-9]*\).*/\3/'` if test "x${gsl_micro_version}" = "x" ; then gsl_micro_version=0 fi if test "x$enable_gsltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" rm -f conf.gsltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include char* my_strdup (const char *str); char* my_strdup (const char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (void) { int major = 0, minor = 0, micro = 0; int n; char *tmp_version; system ("touch conf.gsltest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_gsl_version"); n = sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) ; if (n != 2 && n != 3) { printf("%s, bad version string\n", "$min_gsl_version"); exit(1); } if (($gsl_major_version > major) || (($gsl_major_version == major) && ($gsl_minor_version > minor)) || (($gsl_major_version == major) && ($gsl_minor_version == minor) && ($gsl_micro_version >= micro))) { exit(0); } else { exit(1); } } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else no_gsl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gsl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ff_with_gsl=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$GSL_CONFIG" = "no" ; then echo "*** The gsl-config script installed by GSL could not be found" echo "*** If GSL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GSL_CONFIG environment variable to the" echo "*** full path to gsl-config." else if test -f conf.gsltest ; then : else echo "*** Could not run GSL test program, checking why..." CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GSL or finding the wrong" echo "*** version of GSL. If it is not finding GSL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GSL was incorrectly installed" echo "*** or that you have moved GSL since it was installed. In the latter case, you" echo "*** may want to edit the gsl-config script: $GSL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi # GSL_CFLAGS="" # GSL_LIBS="" ff_with_gsl=no fi rm -f conf.gsltest if test "$ff_with_gsl" = "yes"; then if test -z "$ff_where_lib_conf_gsl" ; then echo "gsl LD $GSL_LIBS" >>$ff_where_lib_conf test -n "$GSL_CFLAGS" && echo "gsl INCLUDE $GSL_CFLAGS " >>$ff_where_lib_conf ff_where_lib_conf_gsl=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add gsl : $GSL_LIBS $GSL_CFLAGS in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add gsl : $GSL_LIBS $GSL_CFLAGS in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add gsl : $GSL_LIBS $GSL_CFLAGS in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add gsl : $GSL_LIBS $GSL_CFLAGS in $ff_where_lib_conf \"" >&6;} fi fi ## if test -z "$ff_where_lib_conf_mumps" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check mumps" >&5 $as_echo_n "checking check mumps... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -ldmumps -lzmumps -lmumps_common -lpord " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "mumps LD -ldmumps -lzmumps -lmumps_common -lpord" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "dmumps_c.h" || $as_expr X"dmumps_c.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"dmumps_c.h" : 'X\(//\)[^/]' \| \ X"dmumps_c.h" : 'X\(//\)$' \| \ X"dmumps_c.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"dmumps_c.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "mumps INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_mumps=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_mumps_ptscotch" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check mumps_ptscotch" >&5 $as_echo_n "checking check mumps_ptscotch... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lpord_ptscotch -lmumps_common_ptscotch -ldmumps_ptscotch -lzmumps_ptscotch -lpord_ptscotch " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "mumps_ptscotch LD -lpord_ptscotch -lmumps_common_ptscotch -ldmumps_ptscotch -lzmumps_ptscotch -lpord_ptscotch" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "dmumps_c.h" || $as_expr X"dmumps_c.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"dmumps_c.h" : 'X\(//\)[^/]' \| \ X"dmumps_c.h" : 'X\(//\)$' \| \ X"dmumps_c.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"dmumps_c.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "mumps_ptscotch INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_mumps_ptscotch=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_mumps_scotch" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check mumps_scotch" >&5 $as_echo_n "checking check mumps_scotch... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lpord_scotch -lmumps_common_scotch -ldmumps_scotch -lzmumps_scotch -lpord_scotch " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "mumps_scotch LD -lpord_scotch -lmumps_common_scotch -ldmumps_scotch -lzmumps_scotch -lpord_scotch" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "dmumps_c.h" || $as_expr X"dmumps_c.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"dmumps_c.h" : 'X\(//\)[^/]' \| \ X"dmumps_c.h" : 'X\(//\)$' \| \ X"dmumps_c.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"dmumps_c.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "mumps_scotch INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_mumps_scotch=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_hypre" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check hypre" >&5 $as_echo_n "checking check hypre... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lHYPRE " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "hypre LD -lHYPRE" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "" || $as_expr X"" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"" : 'X\(//\)[^/]' \| \ X"" : 'X\(//\)$' \| \ X"" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "hypre INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_hypre=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_fftw3" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check fftw3" >&5 $as_echo_n "checking check fftw3... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lfftw3 " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "fftw3 LD -lfftw3" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "/usr/include/fftw3.h" || $as_expr X"/usr/include/fftw3.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"/usr/include/fftw3.h" : 'X\(//\)[^/]' \| \ X"/usr/include/fftw3.h" : 'X\(//\)$' \| \ X"/usr/include/fftw3.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"/usr/include/fftw3.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "fftw3 INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_fftw3=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_superlu_dist" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check superlu_dist" >&5 $as_echo_n "checking check superlu_dist... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lsuperlu-dist " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "superlu_dist LD -lsuperlu-dist" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "/usr/include/superlu-dist/superlu_defs.h" || $as_expr X"/usr/include/superlu-dist/superlu_defs.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"/usr/include/superlu-dist/superlu_defs.h" : 'X\(//\)[^/]' \| \ X"/usr/include/superlu-dist/superlu_defs.h" : 'X\(//\)$' \| \ X"/usr/include/superlu-dist/superlu_defs.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"/usr/include/superlu-dist/superlu_defs.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "superlu_dist INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_superlu_dist=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_superlu" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check superlu" >&5 $as_echo_n "checking check superlu... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lsuperlu " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "superlu LD -lsuperlu" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "/usr/include/superlu/superlu_enum_consts.h" || $as_expr X"/usr/include/superlu/superlu_enum_consts.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"/usr/include/superlu/superlu_enum_consts.h" : 'X\(//\)[^/]' \| \ X"/usr/include/superlu/superlu_enum_consts.h" : 'X\(//\)$' \| \ X"/usr/include/superlu/superlu_enum_consts.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"/usr/include/superlu/superlu_enum_consts.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "superlu INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_superlu=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_Superlu4" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check Superlu4" >&5 $as_echo_n "checking check Superlu4... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lsuperlu4 " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "Superlu4 LD -lsuperlu4" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "/usr/include/superlu4/superlu_enum_consts.h" || $as_expr X"/usr/include/superlu4/superlu_enum_consts.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"/usr/include/superlu4/superlu_enum_consts.h" : 'X\(//\)[^/]' \| \ X"/usr/include/superlu4/superlu_enum_consts.h" : 'X\(//\)$' \| \ X"/usr/include/superlu4/superlu_enum_consts.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"/usr/include/superlu4/superlu_enum_consts.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "Superlu4 INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_Superlu4=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_blacs" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check blacs" >&5 $as_echo_n "checking check blacs... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lblacsCinit$ff_with_mpi -lblacsF77init$ff_with_mpi -lblacs$ff_with_mpi " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "blacs LD -lblacsCinit$ff_with_mpi -lblacsF77init$ff_with_mpi -lblacs$ff_with_mpi" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "" || $as_expr X"" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"" : 'X\(//\)[^/]' \| \ X"" : 'X\(//\)$' \| \ X"" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "blacs INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_blacs=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_scalapack" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check scalapack" >&5 $as_echo_n "checking check scalapack... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lscalapack$ff_with_mpi " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "scalapack LD -lscalapack$ff_with_mpi" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "" || $as_expr X"" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"" : 'X\(//\)[^/]' \| \ X"" : 'X\(//\)$' \| \ X"" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "scalapack INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_scalapack=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_scotch" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check scotch" >&5 $as_echo_n "checking check scotch... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lscotch -lscotcherr " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "scotch LD -lscotch -lscotcherr" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "scotch.h" || $as_expr X"scotch.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"scotch.h" : 'X\(//\)[^/]' \| \ X"scotch.h" : 'X\(//\)$' \| \ X"scotch.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"scotch.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "scotch INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_scotch=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_ptscotch" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check ptscotch" >&5 $as_echo_n "checking check ptscotch... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lptscotch -lptscotcherr " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "ptscotch LD -lptscotch -lptscotcherr" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "ptscotch.h" || $as_expr X"ptscotch.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"ptscotch.h" : 'X\(//\)[^/]' \| \ X"ptscotch.h" : 'X\(//\)$' \| \ X"ptscotch.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"ptscotch.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "ptscotch INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_ptscotch=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_metis" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check metis" >&5 $as_echo_n "checking check metis... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lscotch -lmetis " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "metis LD -lscotch -lmetis" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "/usr/include/metis/metis.h" || $as_expr X"/usr/include/metis/metis.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"/usr/include/metis/metis.h" : 'X\(//\)[^/]' \| \ X"/usr/include/metis/metis.h" : 'X\(//\)$' \| \ X"/usr/include/metis/metis.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"/usr/include/metis/metis.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "metis INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_metis=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_metis" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check metis" >&5 $as_echo_n "checking check metis... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lscotch -lmetis " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "metis LD -lscotch -lmetis" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "metis.h" || $as_expr X"metis.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"metis.h" : 'X\(//\)[^/]' \| \ X"metis.h" : 'X\(//\)$' \| \ X"metis.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"metis.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "metis INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_metis=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_parmetis" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check parmetis" >&5 $as_echo_n "checking check parmetis... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lptscotch -lparmetis " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "parmetis LD -lptscotch -lparmetis" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "" || $as_expr X"" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"" : 'X\(//\)[^/]' \| \ X"" : 'X\(//\)$' \| \ X"" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "parmetis INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_parmetis=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_freeyams" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check freeyams" >&5 $as_echo_n "checking check freeyams... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lfreeyams " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "freeyams LD -lfreeyams" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "freeyamslib.h" || $as_expr X"freeyamslib.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"freeyamslib.h" : 'X\(//\)[^/]' \| \ X"freeyamslib.h" : 'X\(//\)$' \| \ X"freeyamslib.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"freeyamslib.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "freeyams INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_freeyams=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_mmg3d" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check mmg3d" >&5 $as_echo_n "checking check mmg3d... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lmmg3d " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "mmg3d LD -lmmg3d" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "libmmg3d.h" || $as_expr X"libmmg3d.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"libmmg3d.h" : 'X\(//\)[^/]' \| \ X"libmmg3d.h" : 'X\(//\)$' \| \ X"libmmg3d.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"libmmg3d.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "mmg3d INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_mmg3d=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_mshmet" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check mshmet" >&5 $as_echo_n "checking check mshmet... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lmshmet " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "mshmet LD -lmshmet" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "" || $as_expr X"" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"" : 'X\(//\)[^/]' \| \ X"" : 'X\(//\)$' \| \ X"" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "mshmet INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_mshmet=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_parms" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check parms" >&5 $as_echo_n "checking check parms... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lparms -litsol -llapack -lblas -lm " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "parms LD -lparms -litsol -llapack -lblas -lm" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "" || $as_expr X"" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"" : 'X\(//\)[^/]' \| \ X"" : 'X\(//\)$' \| \ X"" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "parms INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_parms=1 LIBS=$ff_save_libs fi if test -z "$ff_where_lib_conf_tetgen" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check tetgen" >&5 $as_echo_n "checking check tetgen... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -ltet " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ff_WHERE=yes else ff_WHERE=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$ff_WHERE" = "yes" ; then echo "tetgen LD -ltet" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "tetgen.h" || $as_expr X"tetgen.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"tetgen.h" : 'X\(//\)[^/]' \| \ X"tetgen.h" : 'X\(//\)$' \| \ X"tetgen.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"tetgen.h" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` case "$ff_WHERE_INC" in /*) echo "tetgen INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_WHERE" >&5 $as_echo "$ff_WHERE" >&6; } ff_where_lib_conf_tetgen=1 LIBS=$ff_save_libs fi ## before try # Check whether --enable-fflapack was given. if test "${enable_fflapack+set}" = set; then : enableval=$enable_fflapack; fi if test "$enable_fflapack" = "no" then TOOL_COMPILE_fflapack="" TOOL_DYLIB_fflapack="" else TOOL_COMPILE_fflapack=fflapack TOOL_DYLIB_fflapack=fflapack.$DYLIB_SUFFIX enable_fflapack_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-fflapack_include was given. if test "${with_fflapack_include+set}" = set; then : withval=$with_fflapack_include; fi # Check whether --with-fflapack_ldflags was given. if test "${with_fflapack_ldflags+set}" = set; then : withval=$with_fflapack_ldflags; fi if test "$with_fflapack_include" != "" || test "$with_fflapack_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_fflapack" ; then echo "fflapack LD $with_fflapack_ldflags" >>$ff_where_lib_conf test -n "$with_fflapack_include" && echo "fflapack INCLUDE $with_fflapack_include " >>$ff_where_lib_conf ff_where_lib_conf_fflapack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add fflapack : $with_fflapack_ldflags $with_fflapack_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add fflapack : $with_fflapack_ldflags $with_fflapack_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add fflapack : $with_fflapack_ldflags $with_fflapack_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add fflapack : $with_fflapack_ldflags $with_fflapack_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_fflapack="" enable_fflapack_download=no fi # Check whether --enable-hips was given. if test "${enable_hips+set}" = set; then : enableval=$enable_hips; fi if test "$enable_hips" = "no" then TOOL_COMPILE_hips="" TOOL_DYLIB_hips="" else TOOL_COMPILE_hips=hips TOOL_DYLIB_hips=hips_FreeFem.$DYLIB_SUFFIX enable_hips_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-hips_include was given. if test "${with_hips_include+set}" = set; then : withval=$with_hips_include; fi # Check whether --with-hips_ldflags was given. if test "${with_hips_ldflags+set}" = set; then : withval=$with_hips_ldflags; fi if test "$with_hips_include" != "" || test "$with_hips_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_hips" ; then echo "hips LD $with_hips_ldflags" >>$ff_where_lib_conf test -n "$with_hips_include" && echo "hips INCLUDE $with_hips_include " >>$ff_where_lib_conf ff_where_lib_conf_hips=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add hips : $with_hips_ldflags $with_hips_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add hips : $with_hips_ldflags $with_hips_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add hips : $with_hips_ldflags $with_hips_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add hips : $with_hips_ldflags $with_hips_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_hips="" enable_hips_download=no fi # Check whether --enable-ipopt was given. if test "${enable_ipopt+set}" = set; then : enableval=$enable_ipopt; fi if test "$enable_ipopt" = "no" then TOOL_COMPILE_ipopt="" TOOL_DYLIB_ipopt="" else TOOL_COMPILE_ipopt=ipopt TOOL_DYLIB_ipopt=ff-Ipopt.$DYLIB_SUFFIX enable_ipopt_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-ipopt_include was given. if test "${with_ipopt_include+set}" = set; then : withval=$with_ipopt_include; fi # Check whether --with-ipopt_ldflags was given. if test "${with_ipopt_ldflags+set}" = set; then : withval=$with_ipopt_ldflags; fi if test "$with_ipopt_include" != "" || test "$with_ipopt_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_ipopt" ; then echo "ipopt LD $with_ipopt_ldflags" >>$ff_where_lib_conf test -n "$with_ipopt_include" && echo "ipopt INCLUDE $with_ipopt_include " >>$ff_where_lib_conf ff_where_lib_conf_ipopt=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add ipopt : $with_ipopt_ldflags $with_ipopt_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add ipopt : $with_ipopt_ldflags $with_ipopt_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add ipopt : $with_ipopt_ldflags $with_ipopt_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add ipopt : $with_ipopt_ldflags $with_ipopt_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_ipopt="" enable_ipopt_download=no fi # Check whether --enable-lapack was given. if test "${enable_lapack+set}" = set; then : enableval=$enable_lapack; fi if test "$enable_lapack" = "no" then TOOL_COMPILE_lapack="" TOOL_DYLIB_lapack="" else TOOL_COMPILE_lapack=lapack TOOL_DYLIB_lapack=lapack.$DYLIB_SUFFIX enable_lapack_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-lapack_include was given. if test "${with_lapack_include+set}" = set; then : withval=$with_lapack_include; fi # Check whether --with-lapack_ldflags was given. if test "${with_lapack_ldflags+set}" = set; then : withval=$with_lapack_ldflags; fi if test "$with_lapack_include" != "" || test "$with_lapack_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_lapack" ; then echo "lapack LD $with_lapack_ldflags" >>$ff_where_lib_conf test -n "$with_lapack_include" && echo "lapack INCLUDE $with_lapack_include " >>$ff_where_lib_conf ff_where_lib_conf_lapack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add lapack : $with_lapack_ldflags $with_lapack_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add lapack : $with_lapack_ldflags $with_lapack_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add lapack : $with_lapack_ldflags $with_lapack_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add lapack : $with_lapack_ldflags $with_lapack_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_lapack="" enable_lapack_download=no fi # Check whether --enable-parmetis was given. if test "${enable_parmetis+set}" = set; then : enableval=$enable_parmetis; fi if test "$enable_parmetis" = "no" then TOOL_COMPILE_parmetis="" TOOL_DYLIB_parmetis="" else TOOL_COMPILE_parmetis=parmetis TOOL_DYLIB_parmetis=metis.$DYLIB_SUFFIX enable_parmetis_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-parmetis_include was given. if test "${with_parmetis_include+set}" = set; then : withval=$with_parmetis_include; fi # Check whether --with-parmetis_ldflags was given. if test "${with_parmetis_ldflags+set}" = set; then : withval=$with_parmetis_ldflags; fi if test "$with_parmetis_include" != "" || test "$with_parmetis_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_parmetis" ; then echo "parmetis LD $with_parmetis_ldflags" >>$ff_where_lib_conf test -n "$with_parmetis_include" && echo "parmetis INCLUDE $with_parmetis_include " >>$ff_where_lib_conf ff_where_lib_conf_parmetis=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add parmetis : $with_parmetis_ldflags $with_parmetis_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add parmetis : $with_parmetis_ldflags $with_parmetis_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add parmetis : $with_parmetis_ldflags $with_parmetis_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add parmetis : $with_parmetis_ldflags $with_parmetis_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_parmetis="" enable_parmetis_download=no fi # Check whether --enable-mmg3d was given. if test "${enable_mmg3d+set}" = set; then : enableval=$enable_mmg3d; fi if test "$enable_mmg3d" = "no" then TOOL_COMPILE_mmg3d="" TOOL_DYLIB_mmg3d="" else TOOL_COMPILE_mmg3d=mmg3d TOOL_DYLIB_mmg3d=mmg3d-v4.0.$DYLIB_SUFFIX enable_mmg3d_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-mmg3d_include was given. if test "${with_mmg3d_include+set}" = set; then : withval=$with_mmg3d_include; fi # Check whether --with-mmg3d_ldflags was given. if test "${with_mmg3d_ldflags+set}" = set; then : withval=$with_mmg3d_ldflags; fi if test "$with_mmg3d_include" != "" || test "$with_mmg3d_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_mmg3d" ; then echo "mmg3d LD $with_mmg3d_ldflags" >>$ff_where_lib_conf test -n "$with_mmg3d_include" && echo "mmg3d INCLUDE $with_mmg3d_include " >>$ff_where_lib_conf ff_where_lib_conf_mmg3d=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mmg3d : $with_mmg3d_ldflags $with_mmg3d_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mmg3d : $with_mmg3d_ldflags $with_mmg3d_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mmg3d : $with_mmg3d_ldflags $with_mmg3d_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mmg3d : $with_mmg3d_ldflags $with_mmg3d_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_mmg3d="" enable_mmg3d_download=no fi # Check whether --enable-mshmet was given. if test "${enable_mshmet+set}" = set; then : enableval=$enable_mshmet; fi if test "$enable_mshmet" = "no" then TOOL_COMPILE_mshmet="" TOOL_DYLIB_mshmet="" else TOOL_COMPILE_mshmet=mshmet TOOL_DYLIB_mshmet=mshmet.$DYLIB_SUFFIX enable_mshmet_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-mshmet_include was given. if test "${with_mshmet_include+set}" = set; then : withval=$with_mshmet_include; fi # Check whether --with-mshmet_ldflags was given. if test "${with_mshmet_ldflags+set}" = set; then : withval=$with_mshmet_ldflags; fi if test "$with_mshmet_include" != "" || test "$with_mshmet_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_mshmet" ; then echo "mshmet LD $with_mshmet_ldflags" >>$ff_where_lib_conf test -n "$with_mshmet_include" && echo "mshmet INCLUDE $with_mshmet_include " >>$ff_where_lib_conf ff_where_lib_conf_mshmet=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mshmet : $with_mshmet_ldflags $with_mshmet_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mshmet : $with_mshmet_ldflags $with_mshmet_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mshmet : $with_mshmet_ldflags $with_mshmet_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mshmet : $with_mshmet_ldflags $with_mshmet_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_mshmet="" enable_mshmet_download=no fi # Check whether --enable-gmm was given. if test "${enable_gmm+set}" = set; then : enableval=$enable_gmm; fi if test "$enable_gmm" = "no" then TOOL_COMPILE_gmm="" TOOL_DYLIB_gmm="" else TOOL_COMPILE_gmm=gmm TOOL_DYLIB_gmm=ilut.$DYLIB_SUFFIX enable_gmm_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-gmm_include was given. if test "${with_gmm_include+set}" = set; then : withval=$with_gmm_include; fi # Check whether --with-gmm_ldflags was given. if test "${with_gmm_ldflags+set}" = set; then : withval=$with_gmm_ldflags; fi if test "$with_gmm_include" != "" || test "$with_gmm_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_gmm" ; then echo "gmm LD $with_gmm_ldflags" >>$ff_where_lib_conf test -n "$with_gmm_include" && echo "gmm INCLUDE $with_gmm_include " >>$ff_where_lib_conf ff_where_lib_conf_gmm=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add gmm : $with_gmm_ldflags $with_gmm_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add gmm : $with_gmm_ldflags $with_gmm_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add gmm : $with_gmm_ldflags $with_gmm_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add gmm : $with_gmm_ldflags $with_gmm_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_gmm="" enable_gmm_download=no fi # Check whether --enable-mumps was given. if test "${enable_mumps+set}" = set; then : enableval=$enable_mumps; fi if test "$enable_mumps" = "no" then TOOL_COMPILE_mumps="" TOOL_DYLIB_mumps="" else TOOL_COMPILE_mumps=mumps TOOL_DYLIB_mumps="MUMPS_FreeFem.$DYLIB_SUFFIX MUMPS.$DYLIB_SUFFIX" enable_mumps_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-mumps_include was given. if test "${with_mumps_include+set}" = set; then : withval=$with_mumps_include; fi # Check whether --with-mumps_ldflags was given. if test "${with_mumps_ldflags+set}" = set; then : withval=$with_mumps_ldflags; fi if test "$with_mumps_include" != "" || test "$with_mumps_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_mumps" ; then echo "mumps LD $with_mumps_ldflags" >>$ff_where_lib_conf test -n "$with_mumps_include" && echo "mumps INCLUDE $with_mumps_include " >>$ff_where_lib_conf ff_where_lib_conf_mumps=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mumps : $with_mumps_ldflags $with_mumps_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mumps : $with_mumps_ldflags $with_mumps_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mumps : $with_mumps_ldflags $with_mumps_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mumps : $with_mumps_ldflags $with_mumps_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_mumps="" enable_mumps_download=no fi # Check whether --enable-mumps_seq was given. if test "${enable_mumps_seq+set}" = set; then : enableval=$enable_mumps_seq; fi if test "$enable_mumps_seq" = "no" then TOOL_COMPILE_mumps_seq="" TOOL_DYLIB_mumps_seq="" else TOOL_COMPILE_mumps_seq=mumps-seq TOOL_DYLIB_mumps_seq="MUMPS_seq.$DYLIB_SUFFIX MUMPS.$DYLIB_SUFFIX" enable_mumps_seq_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-mumps_seq_include was given. if test "${with_mumps_seq_include+set}" = set; then : withval=$with_mumps_seq_include; fi # Check whether --with-mumps_seq_ldflags was given. if test "${with_mumps_seq_ldflags+set}" = set; then : withval=$with_mumps_seq_ldflags; fi if test "$with_mumps_seq_include" != "" || test "$with_mumps_seq_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_mumps_seq" ; then echo "mumps_seq LD $with_mumps_seq_ldflags" >>$ff_where_lib_conf test -n "$with_mumps_seq_include" && echo "mumps_seq INCLUDE $with_mumps_seq_include " >>$ff_where_lib_conf ff_where_lib_conf_mumps_seq=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add mumps_seq : $with_mumps_seq_ldflags $with_mumps_seq_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add mumps_seq : $with_mumps_seq_ldflags $with_mumps_seq_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add mumps_seq : $with_mumps_seq_ldflags $with_mumps_seq_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add mumps_seq : $with_mumps_seq_ldflags $with_mumps_seq_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_mumps_seq="" enable_mumps_seq_download=no fi # Check whether --enable-nlopt was given. if test "${enable_nlopt+set}" = set; then : enableval=$enable_nlopt; fi if test "$enable_nlopt" = "no" then TOOL_COMPILE_nlopt="" TOOL_DYLIB_nlopt="" else TOOL_COMPILE_nlopt=nlopt TOOL_DYLIB_nlopt=ff-NLopt.$DYLIB_SUFFIX enable_nlopt_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-nlopt_include was given. if test "${with_nlopt_include+set}" = set; then : withval=$with_nlopt_include; fi # Check whether --with-nlopt_ldflags was given. if test "${with_nlopt_ldflags+set}" = set; then : withval=$with_nlopt_ldflags; fi if test "$with_nlopt_include" != "" || test "$with_nlopt_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_nlopt" ; then echo "nlopt LD $with_nlopt_ldflags" >>$ff_where_lib_conf test -n "$with_nlopt_include" && echo "nlopt INCLUDE $with_nlopt_include " >>$ff_where_lib_conf ff_where_lib_conf_nlopt=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add nlopt : $with_nlopt_ldflags $with_nlopt_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add nlopt : $with_nlopt_ldflags $with_nlopt_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add nlopt : $with_nlopt_ldflags $with_nlopt_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add nlopt : $with_nlopt_ldflags $with_nlopt_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_nlopt="" enable_nlopt_download=no fi # Check whether --enable-parms was given. if test "${enable_parms+set}" = set; then : enableval=$enable_parms; fi if test "$enable_parms" = "no" then TOOL_COMPILE_parms="" TOOL_DYLIB_parms="" else TOOL_COMPILE_parms=parms TOOL_DYLIB_parms=parms_FreeFem.$DYLIB_SUFFIX enable_parms_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-parms_include was given. if test "${with_parms_include+set}" = set; then : withval=$with_parms_include; fi # Check whether --with-parms_ldflags was given. if test "${with_parms_ldflags+set}" = set; then : withval=$with_parms_ldflags; fi if test "$with_parms_include" != "" || test "$with_parms_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_parms" ; then echo "parms LD $with_parms_ldflags" >>$ff_where_lib_conf test -n "$with_parms_include" && echo "parms INCLUDE $with_parms_include " >>$ff_where_lib_conf ff_where_lib_conf_parms=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add parms : $with_parms_ldflags $with_parms_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add parms : $with_parms_ldflags $with_parms_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add parms : $with_parms_ldflags $with_parms_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add parms : $with_parms_ldflags $with_parms_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_parms="" enable_parms_download=no fi # Check whether --enable-pastix was given. if test "${enable_pastix+set}" = set; then : enableval=$enable_pastix; fi if test "$enable_pastix" = "no" then TOOL_COMPILE_pastix="" TOOL_DYLIB_pastix="" else TOOL_COMPILE_pastix=pastix TOOL_DYLIB_pastix="interfacepastix.$DYLIB_SUFFIX complex_pastix_FreeFem.$DYLIB_SUFFIX real_pastix_FreeFem.$DYLIB_SUFFIX" enable_pastix_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-pastix_include was given. if test "${with_pastix_include+set}" = set; then : withval=$with_pastix_include; fi # Check whether --with-pastix_ldflags was given. if test "${with_pastix_ldflags+set}" = set; then : withval=$with_pastix_ldflags; fi if test "$with_pastix_include" != "" || test "$with_pastix_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_pastix" ; then echo "pastix LD $with_pastix_ldflags" >>$ff_where_lib_conf test -n "$with_pastix_include" && echo "pastix INCLUDE $with_pastix_include " >>$ff_where_lib_conf ff_where_lib_conf_pastix=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add pastix : $with_pastix_ldflags $with_pastix_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add pastix : $with_pastix_ldflags $with_pastix_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add pastix : $with_pastix_ldflags $with_pastix_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add pastix : $with_pastix_ldflags $with_pastix_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_pastix="" enable_pastix_download=no fi # Check whether --enable-pipe was given. if test "${enable_pipe+set}" = set; then : enableval=$enable_pipe; fi if test "$enable_pipe" = "no" then TOOL_COMPILE_pipe="" TOOL_DYLIB_pipe="" else TOOL_COMPILE_pipe=pipe TOOL_DYLIB_pipe=pipe.$DYLIB_SUFFIX enable_pipe_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-pipe_include was given. if test "${with_pipe_include+set}" = set; then : withval=$with_pipe_include; fi # Check whether --with-pipe_ldflags was given. if test "${with_pipe_ldflags+set}" = set; then : withval=$with_pipe_ldflags; fi if test "$with_pipe_include" != "" || test "$with_pipe_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_pipe" ; then echo "pipe LD $with_pipe_ldflags" >>$ff_where_lib_conf test -n "$with_pipe_include" && echo "pipe INCLUDE $with_pipe_include " >>$ff_where_lib_conf ff_where_lib_conf_pipe=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_pipe="" enable_pipe_download=no fi # Check whether --enable-scotch was given. if test "${enable_scotch+set}" = set; then : enableval=$enable_scotch; fi if test "$enable_scotch" = "no" then TOOL_COMPILE_scotch="" TOOL_DYLIB_scotch="" else TOOL_COMPILE_scotch=scotch TOOL_DYLIB_scotch=scotch.$DYLIB_SUFFIX enable_scotch_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-scotch_include was given. if test "${with_scotch_include+set}" = set; then : withval=$with_scotch_include; fi # Check whether --with-scotch_ldflags was given. if test "${with_scotch_ldflags+set}" = set; then : withval=$with_scotch_ldflags; fi if test "$with_scotch_include" != "" || test "$with_scotch_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_scotch" ; then echo "scotch LD $with_scotch_ldflags" >>$ff_where_lib_conf test -n "$with_scotch_include" && echo "scotch INCLUDE $with_scotch_include " >>$ff_where_lib_conf ff_where_lib_conf_scotch=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add scotch : $with_scotch_ldflags $with_scotch_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add scotch : $with_scotch_ldflags $with_scotch_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add scotch : $with_scotch_ldflags $with_scotch_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add scotch : $with_scotch_ldflags $with_scotch_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_scotch="" enable_scotch_download=no fi # Check whether --enable-superlu was given. if test "${enable_superlu+set}" = set; then : enableval=$enable_superlu; fi if test "$enable_superlu" = "no" then TOOL_COMPILE_superlu="" TOOL_DYLIB_superlu="" else TOOL_COMPILE_superlu=superlu TOOL_DYLIB_superlu=SuperLu.$DYLIB_SUFFIX enable_superlu_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-superlu_include was given. if test "${with_superlu_include+set}" = set; then : withval=$with_superlu_include; fi # Check whether --with-superlu_ldflags was given. if test "${with_superlu_ldflags+set}" = set; then : withval=$with_superlu_ldflags; fi if test "$with_superlu_include" != "" || test "$with_superlu_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_superlu" ; then echo "superlu LD $with_superlu_ldflags" >>$ff_where_lib_conf test -n "$with_superlu_include" && echo "superlu INCLUDE $with_superlu_include " >>$ff_where_lib_conf ff_where_lib_conf_superlu=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add superlu : $with_superlu_ldflags $with_superlu_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add superlu : $with_superlu_ldflags $with_superlu_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add superlu : $with_superlu_ldflags $with_superlu_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add superlu : $with_superlu_ldflags $with_superlu_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_superlu="" enable_superlu_download=no fi # Check whether --enable-superludist was given. if test "${enable_superludist+set}" = set; then : enableval=$enable_superludist; fi if test "$enable_superludist" = "no" then TOOL_COMPILE_superludist="" TOOL_DYLIB_superludist="" else TOOL_COMPILE_superludist=superludist TOOL_DYLIB_superludist="complex_SuperLU_DIST_FreeFem.$DYLIB_SUFFIX real_SuperLU_DIST_FreeFem.$DYLIB_SUFFIX dSuperLU_DIST.$DYLIB_SUFFIX" enable_superludist_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-superludist_include was given. if test "${with_superludist_include+set}" = set; then : withval=$with_superludist_include; fi # Check whether --with-superludist_ldflags was given. if test "${with_superludist_ldflags+set}" = set; then : withval=$with_superludist_ldflags; fi if test "$with_superludist_include" != "" || test "$with_superludist_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_superludist" ; then echo "superludist LD $with_superludist_ldflags" >>$ff_where_lib_conf test -n "$with_superludist_include" && echo "superludist INCLUDE $with_superludist_include " >>$ff_where_lib_conf ff_where_lib_conf_superludist=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add superludist : $with_superludist_ldflags $with_superludist_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add superludist : $with_superludist_ldflags $with_superludist_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add superludist : $with_superludist_ldflags $with_superludist_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add superludist : $with_superludist_ldflags $with_superludist_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_superludist="" enable_superludist_download=no fi # Check whether --enable-umfpack was given. if test "${enable_umfpack+set}" = set; then : enableval=$enable_umfpack; fi if test "$enable_umfpack" = "no" then TOOL_COMPILE_umfpack="" TOOL_DYLIB_umfpack="" else TOOL_COMPILE_umfpack=umfpack TOOL_DYLIB_umfpack=UMFPACK64.$DYLIB_SUFFIX enable_umfpack_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-umfpack_include was given. if test "${with_umfpack_include+set}" = set; then : withval=$with_umfpack_include; fi # Check whether --with-umfpack_ldflags was given. if test "${with_umfpack_ldflags+set}" = set; then : withval=$with_umfpack_ldflags; fi if test "$with_umfpack_include" != "" || test "$with_umfpack_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_umfpack" ; then echo "umfpack LD $with_umfpack_ldflags" >>$ff_where_lib_conf test -n "$with_umfpack_include" && echo "umfpack INCLUDE $with_umfpack_include " >>$ff_where_lib_conf ff_where_lib_conf_umfpack=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add umfpack : $with_umfpack_ldflags $with_umfpack_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add umfpack : $with_umfpack_ldflags $with_umfpack_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add umfpack : $with_umfpack_ldflags $with_umfpack_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add umfpack : $with_umfpack_ldflags $with_umfpack_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_umfpack="" enable_umfpack_download=no fi # Check whether --enable-yams was given. if test "${enable_yams+set}" = set; then : enableval=$enable_yams; fi if test "$enable_yams" = "no" then TOOL_COMPILE_yams="" TOOL_DYLIB_yams="" else TOOL_COMPILE_yams=yams TOOL_DYLIB_yams=freeyams.$DYLIB_SUFFIX enable_yams_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-yams_include was given. if test "${with_yams_include+set}" = set; then : withval=$with_yams_include; fi # Check whether --with-yams_ldflags was given. if test "${with_yams_ldflags+set}" = set; then : withval=$with_yams_ldflags; fi if test "$with_yams_include" != "" || test "$with_yams_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_yams" ; then echo "yams LD $with_yams_ldflags" >>$ff_where_lib_conf test -n "$with_yams_include" && echo "yams INCLUDE $with_yams_include " >>$ff_where_lib_conf ff_where_lib_conf_yams=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add yams : $with_yams_ldflags $with_yams_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add yams : $with_yams_ldflags $with_yams_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add yams : $with_yams_ldflags $with_yams_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add yams : $with_yams_ldflags $with_yams_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_yams="" enable_yams_download=no fi # Check whether --enable-pipe was given. if test "${enable_pipe+set}" = set; then : enableval=$enable_pipe; fi if test "$enable_pipe" = "no" then TOOL_COMPILE_pipe="" TOOL_DYLIB_pipe="" else TOOL_COMPILE_pipe=pipe TOOL_DYLIB_pipe=pipe.$DYLIB_SUFFIX enable_pipe_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-pipe_include was given. if test "${with_pipe_include+set}" = set; then : withval=$with_pipe_include; fi # Check whether --with-pipe_ldflags was given. if test "${with_pipe_ldflags+set}" = set; then : withval=$with_pipe_ldflags; fi if test "$with_pipe_include" != "" || test "$with_pipe_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_pipe" ; then echo "pipe LD $with_pipe_ldflags" >>$ff_where_lib_conf test -n "$with_pipe_include" && echo "pipe INCLUDE $with_pipe_include " >>$ff_where_lib_conf ff_where_lib_conf_pipe=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add pipe : $with_pipe_ldflags $with_pipe_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_pipe="" enable_pipe_download=no fi # FFCS - MUMPS_seq has a different Win32 compiler setup from FFCS, so we need to add some extra parameters if test "$OS" = Windows_NT then CFLAGS="$CFLAGS -DWITHOUT_PTHREAD -DAdd_" # we also need to satisfy ff-c++ that the pthread are not a blocking point if test -n "$ff_pthread" ; then if test -z "$ff_where_lib_conf_pthread" ; then echo "pthread LD """ >>$ff_where_lib_conf test -n "" && echo "pthread INCLUDE " >>$ff_where_lib_conf ff_where_lib_conf_pthread=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add pthread : \"\" in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add pthread : \"\" in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add pthread : \"\" in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add pthread : \"\" in $ff_where_lib_conf \"" >&6;} fi fi fi # ALH - pARMS needs "-fno-range-check" on Windows, but this options fails on MacOS 10.8. Add no-range-check for Windows # for hexadecimal parameter constants like: # # [[file:c:/cygwin/home/alh/ffcs/rel/mingw/mpif.h::PARAMETER MPI_SHORT_INT z 8c000003]] # # Such constants are rejected without [[file:download/parms/makefile-parms.in::NO_RANGE_CHECK]] if test "$OS" = Windows_NT then NO_RANGE_CHECK=-fno-range-check fi # ALH - 4/9/13 - request from Helmut Jarausch - allow to change Scotch include path if test "$with_scotch_include" = "" then with_scotch_include=$ac_pwd/download/include/scotch fi SCOTCH_INCLUDE=$with_scotch_include # Find out kernel and libc versions # --------------------------------- if test "$ff_win32" != yes -a "$ff_mac" != yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel version" >&5 $as_echo_n "checking kernel version... " >&6; } ff_kernel_version=`cat /proc/version|perl -e '=~/(\d+\.\d+\.\d+)/;print $1;'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_kernel_version" >&5 $as_echo "$ff_kernel_version" >&6; } KERNEL_VERSION=$ff_kernel_version { $as_echo "$as_me:${as_lineno-$LINENO}: checking libc version" >&5 $as_echo_n "checking libc version... " >&6; } ff_libc_version=`ldd /bin/sh | awk '/libc/{print $3}' | xargs readlink | sed -e 's/\.so$//'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ff_libc_version" >&5 $as_echo "$ff_libc_version" >&6; } LIBC_VERSION=$ff_libc_version fi # def variable pour les makefiles # creating all makefiles # ---------------------- ff_bamgprog="bamg${EXEEXT} cvmsh2${EXEEXT}" CNOFLAGS=$CNOFLAGS FNOFLAGS=$FNOFLAGS # The final list of executable programs MEDITPROG=$ff_meditprog FFGLUTPROG=$ff_ffglutprog BAMGPROG=$ff_bamgprog STDPROG=$ff_stdprog ff_progs="FreeFem++-nw $ff_bamgprog $ff_mpiprog $ff_meditprog $ff_ffglutprog" TEST_FFPP=$ff_TEST_FFPP TEST_FFPP_MPI=$ff_TEST_FFPP_MPI TEST_FFPPMPI="../src/mpi/ff-mpirun" ff_with_mpi=-openmpi; ff_blacs="-lblacsCinit$ff_with_mpi -lblacsF77init$ff_with_mpi -lblacs$ff_with_mpi" ff_scalapack=-lscalapack # change MKL interface ... test -n "$ff_mkl_blacs" && ff_blacs="$ff_mkl_blacs" test -n "$ff_mkl_scalapack" && ff_scalapack="$ff_mkl_scalapack" test -n "$ff_mkl_root" && ff_winc="$ff_mkl_root/include/mkl_blas.h" # FFCS - 27/10/11 - Some extra conditionals for things that do not work on certain systems (eg MPI libraries under # Windows) ## search of HDF5 .... { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed if test "" = "" ; then : # Recognized value elif test "" = "serial" ; then : # Recognized value elif test "" = "parallel"; then : # Recognized value else as_fn_error $? " Unrecognized value for AX_LIB_HDF5 within configure.ac. If supplied, argument 1 must be either 'serial' or 'parallel'. " "$LINENO" 5 fi # Check whether --with-hdf5 was given. if test "${with_hdf5+set}" = set; then : withval=$with_hdf5; if test "$withval" = "no"; then with_hdf5="no" elif test "$withval" = "yes"; then with_hdf5="yes" else with_hdf5="yes" H5CC="$withval" fi else with_hdf5="yes" fi HDF5_CC="" HDF5_VERSION="" HDF5_CFLAGS="" HDF5_CPPFLAGS="" HDF5_LDFLAGS="" HDF5_LIBS="" HDF5_FC="" HDF5_FFLAGS="" HDF5_FLIBS="" if test "$with_hdf5" = "yes"; then if test -z "$H5CC"; then for ac_prog in h5cc h5pcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_H5CC+:} false; then : $as_echo_n "(cached) " >&6 else case $H5CC in [\\/]* | ?:[\\/]*) ac_cv_path_H5CC="$H5CC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_H5CC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi H5CC=$ac_cv_path_H5CC if test -n "$H5CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $H5CC" >&5 $as_echo "$H5CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$H5CC" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: checking Using provided HDF5 C wrapper" >&5 $as_echo_n "checking Using provided HDF5 C wrapper... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $H5CC" >&5 $as_echo "$H5CC" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HDF5 libraries" >&5 $as_echo_n "checking for HDF5 libraries... " >&6; } if test ! -f "$H5CC" || test ! -x "$H5CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate HDF5 compilation helper scripts 'h5cc' or 'h5pcc'. Please specify --with-hdf5= as the full path to h5cc or h5pcc. HDF5 support is being disabled (equivalent to --with-hdf5=no). " >&5 $as_echo "$as_me: WARNING: Unable to locate HDF5 compilation helper scripts 'h5cc' or 'h5pcc'. Please specify --with-hdf5= as the full path to h5cc or h5pcc. HDF5 support is being disabled (equivalent to --with-hdf5=no). " >&2;} with_hdf5="no" with_hdf5_fortran="no" else HDF5_SHOW=$(eval $H5CC -show) HDF5_CC=$(eval $H5CC -show | $AWK '{print $1}') if test "$HDF5_CC" = "ccache"; then HDF5_CC=$(eval $H5CC -show | $AWK '{print $2}') fi HDF5_VERSION=$(eval $H5CC -showconfig | $GREP 'HDF5 Version:' \ | $AWK '{print $3}') HDF5_tmp_flags=$(eval $H5CC -showconfig \ | $GREP 'FLAGS\|Extra libraries:' \ | $AWK -F: '{printf("%s "), $2}' ) HDF5_tmp_inst=$(eval $H5CC -showconfig \ | $GREP 'Installation point:' \ | $AWK '{print $NF}' ) HDF5_CPPFLAGS="-I${HDF5_tmp_inst}/include" for arg in $HDF5_SHOW $HDF5_tmp_flags ; do case "$arg" in -I*) echo $HDF5_CPPFLAGS | $GREP -e "$arg" 2>&1 >/dev/null \ || HDF5_CPPFLAGS="$arg $HDF5_CPPFLAGS" ;; -L*) echo $HDF5_LDFLAGS | $GREP -e "$arg" 2>&1 >/dev/null \ || HDF5_LDFLAGS="$arg $HDF5_LDFLAGS" ;; -l*) echo $HDF5_LIBS | $GREP -e "$arg" 2>&1 >/dev/null \ || HDF5_LIBS="$arg $HDF5_LIBS" ;; esac done HDF5_LIBS="$HDF5_LIBS -lhdf5" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $HDF5_VERSION)" >&5 $as_echo "yes (version $HDF5_VERSION)" >&6; } ax_lib_hdf5_save_CC=$CC ax_lib_hdf5_save_CPPFLAGS=$CPPFLAGS ax_lib_hdf5_save_LIBS=$LIBS ax_lib_hdf5_save_LDFLAGS=$LDFLAGS CC=$HDF5_CC CPPFLAGS=$HDF5_CPPFLAGS LIBS=$HDF5_LIBS LDFLAGS=$HDF5_LDFLAGS ac_fn_cxx_check_header_mongrel "$LINENO" "hdf5.h" "ac_cv_header_hdf5_h" "$ac_includes_default" if test "x$ac_cv_header_hdf5_h" = xyes; then : ac_cv_hadf5_h=yes else ac_cv_hadf5_h=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for H5Fcreate in -lhdf5" >&5 $as_echo_n "checking for H5Fcreate in -lhdf5... " >&6; } if ${ac_cv_lib_hdf5_H5Fcreate+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhdf5 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char H5Fcreate (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return H5Fcreate (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_hdf5_H5Fcreate=yes else ac_cv_lib_hdf5_H5Fcreate=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_hdf5_H5Fcreate" >&5 $as_echo "$ac_cv_lib_hdf5_H5Fcreate" >&6; } if test "x$ac_cv_lib_hdf5_H5Fcreate" = xyes; then : ac_cv_libhdf5=yes else ac_cv_libhdf5=no fi if test "$ac_cv_hadf5_h" = "no" && test "$ac_cv_libhdf5" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to compile HDF5 test program" >&5 $as_echo "$as_me: WARNING: Unable to compile HDF5 test program" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lhdf5_hl" >&5 $as_echo_n "checking for main in -lhdf5_hl... " >&6; } if ${ac_cv_lib_hdf5_hl_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhdf5_hl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_hdf5_hl_main=yes else ac_cv_lib_hdf5_hl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_hdf5_hl_main" >&5 $as_echo "$ac_cv_lib_hdf5_hl_main" >&6; } if test "x$ac_cv_lib_hdf5_hl_main" = xyes; then : HDF5_LIBS="$HDF5_LIBS -lhdf5_hl" fi ac_cv_lib_hdf5_hl=ac_cv_lib_hdf5_hl_main CC=$ax_lib_hdf5_save_CC CPPFLAGS=$ax_lib_hdf5_save_CPPFLAGS LIBS=$ax_lib_hdf5_save_LIBS LDFLAGS=$ax_lib_hdf5_save_LDFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for matching HDF5 Fortran wrapper" >&5 $as_echo_n "checking for matching HDF5 Fortran wrapper... " >&6; } H5FC=$(eval echo -n $H5CC | $SED -n 's/cc$/fc/p') if test -x "$H5FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $H5FC" >&5 $as_echo "$H5FC" >&6; } with_hdf5_fortran="yes" for arg in `$H5FC -show` do case "$arg" in #( -I*) echo $HDF5_FFLAGS | $GREP -e "$arg" >/dev/null \ || HDF5_FFLAGS="$arg $HDF5_FFLAGS" ;;#( -L*) echo $HDF5_FFLAGS | $GREP -e "$arg" >/dev/null \ || HDF5_FFLAGS="$arg $HDF5_FFLAGS" echo $HDF5_FFLAGS | $GREP -e "-I${arg#-L}" >/dev/null \ || HDF5_FFLAGS="-I${arg#-L} $HDF5_FFLAGS" ;; esac done for arg in $HDF5_LIBS do case "$arg" in #( -lhdf5_hl) HDF5_FLIBS="$HDF5_FLIBS -lhdf5hl_fortran $arg" ;; #( -lhdf5) HDF5_FLIBS="$HDF5_FLIBS -lhdf5_fortran $arg" ;; #( *) HDF5_FLIBS="$HDF5_FLIBS $arg" ;; esac done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } with_hdf5_fortran="no" fi $as_echo "#define HAVE_HDF5 1" >>confdefs.h fi fi if test "$with_hdf5" = "yes"; then if test -z "$ff_where_lib_conf_hdf5" ; then echo "hdf5 LD $HDF5_LDFLAGS $HDF5_LIBS" >>$ff_where_lib_conf test -n "$HDF5_CPPFLAGS" && echo "hdf5 INCLUDE $HDF5_CPPFLAGS " >>$ff_where_lib_conf ff_where_lib_conf_hdf5=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add hdf5 : $HDF5_LDFLAGS $HDF5_LIBS $HDF5_CPPFLAGS in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add hdf5 : $HDF5_LDFLAGS $HDF5_LIBS $HDF5_CPPFLAGS in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add hdf5 : $HDF5_LDFLAGS $HDF5_LIBS $HDF5_CPPFLAGS in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add hdf5 : $HDF5_LDFLAGS $HDF5_LIBS $HDF5_CPPFLAGS in $ff_where_lib_conf \"" >&6;} fi LIBS="$LIBS $HDF5_LDFLAGS $HDF5_LIBS" else enable_iohdf5=no fi # Check whether --enable-iohdf5 was given. if test "${enable_iohdf5+set}" = set; then : enableval=$enable_iohdf5; fi if test "$enable_iohdf5" = "no" then TOOL_COMPILE_iohdf5="" TOOL_DYLIB_iohdf5="" else TOOL_COMPILE_iohdf5=iohdf5 TOOL_DYLIB_iohdf5=iohdf5.$DYLIB_SUFFIX enable_iohdf5_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-iohdf5_include was given. if test "${with_iohdf5_include+set}" = set; then : withval=$with_iohdf5_include; fi # Check whether --with-iohdf5_ldflags was given. if test "${with_iohdf5_ldflags+set}" = set; then : withval=$with_iohdf5_ldflags; fi if test "$with_iohdf5_include" != "" || test "$with_iohdf5_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_iohdf5" ; then echo "iohdf5 LD $with_iohdf5_ldflags" >>$ff_where_lib_conf test -n "$with_iohdf5_include" && echo "iohdf5 INCLUDE $with_iohdf5_include " >>$ff_where_lib_conf ff_where_lib_conf_iohdf5=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add iohdf5 : $with_iohdf5_ldflags $with_iohdf5_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add iohdf5 : $with_iohdf5_ldflags $with_iohdf5_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add iohdf5 : $with_iohdf5_ldflags $with_iohdf5_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add iohdf5 : $with_iohdf5_ldflags $with_iohdf5_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_iohdf5="" enable_iohdf5_download=no fi if test "$OS" = Windows_NT; then FFCS_WINDOWS_TRUE= FFCS_WINDOWS_FALSE='#' else FFCS_WINDOWS_TRUE='#' FFCS_WINDOWS_FALSE= fi # remove gsl if not find ... FH # correction FH .. 18/12/2013. # ALH - 7/1/14 - not able to compile gsl or pardiso with FFCS on Windows if test "$enable_ffcs" != yes then if test "$ff_where_lib_conf_gsl" == 1 -a "$enable_gsl"!="no" ; then enable_gsl=yes; fi; if test "$ff_where_lib_conf_mkl" == 1 -a "$enable_mkl"!=no ; then enable_pardiso=yes; fi; fi # Check whether --enable-gsl was given. if test "${enable_gsl+set}" = set; then : enableval=$enable_gsl; fi if test "$enable_gsl" = "no" then TOOL_COMPILE_gsl="" TOOL_DYLIB_gsl="" else TOOL_COMPILE_gsl=gsl TOOL_DYLIB_gsl="gsl.$DYLIB_SUFFIX" enable_gsl_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-gsl_include was given. if test "${with_gsl_include+set}" = set; then : withval=$with_gsl_include; fi # Check whether --with-gsl_ldflags was given. if test "${with_gsl_ldflags+set}" = set; then : withval=$with_gsl_ldflags; fi if test "$with_gsl_include" != "" || test "$with_gsl_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_gsl" ; then echo "gsl LD $with_gsl_ldflags" >>$ff_where_lib_conf test -n "$with_gsl_include" && echo "gsl INCLUDE $with_gsl_include " >>$ff_where_lib_conf ff_where_lib_conf_gsl=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add gsl : $with_gsl_ldflags $with_gsl_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add gsl : $with_gsl_ldflags $with_gsl_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add gsl : $with_gsl_ldflags $with_gsl_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add gsl : $with_gsl_ldflags $with_gsl_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_gsl="" enable_gsl_download=no fi # Check whether --enable-NewSolver was given. if test "${enable_NewSolver+set}" = set; then : enableval=$enable_NewSolver; fi if test "$enable_NewSolver" = "no" then TOOL_COMPILE_NewSolver="" TOOL_DYLIB_NewSolver="" else TOOL_COMPILE_NewSolver=NewSolver TOOL_DYLIB_NewSolver="NewSolver.$DYLIB_SUFFIX" enable_NewSolver_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-NewSolver_include was given. if test "${with_NewSolver_include+set}" = set; then : withval=$with_NewSolver_include; fi # Check whether --with-NewSolver_ldflags was given. if test "${with_NewSolver_ldflags+set}" = set; then : withval=$with_NewSolver_ldflags; fi if test "$with_NewSolver_include" != "" || test "$with_NewSolver_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_NewSolver" ; then echo "NewSolver LD $with_NewSolver_ldflags" >>$ff_where_lib_conf test -n "$with_NewSolver_include" && echo "NewSolver INCLUDE $with_NewSolver_include " >>$ff_where_lib_conf ff_where_lib_conf_NewSolver=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add NewSolver : $with_NewSolver_ldflags $with_NewSolver_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add NewSolver : $with_NewSolver_ldflags $with_NewSolver_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add NewSolver : $with_NewSolver_ldflags $with_NewSolver_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add NewSolver : $with_NewSolver_ldflags $with_NewSolver_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_NewSolver="" enable_NewSolver_download=no fi # Check whether --enable-pardiso was given. if test "${enable_pardiso+set}" = set; then : enableval=$enable_pardiso; fi if test "$enable_pardiso" = "no" then TOOL_COMPILE_pardiso="" TOOL_DYLIB_pardiso="" else TOOL_COMPILE_pardiso=pardiso TOOL_DYLIB_pardiso="PARDISO.$DYLIB_SUFFIX" enable_pardiso_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-pardiso_include was given. if test "${with_pardiso_include+set}" = set; then : withval=$with_pardiso_include; fi # Check whether --with-pardiso_ldflags was given. if test "${with_pardiso_ldflags+set}" = set; then : withval=$with_pardiso_ldflags; fi if test "$with_pardiso_include" != "" || test "$with_pardiso_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_pardiso" ; then echo "pardiso LD $with_pardiso_ldflags" >>$ff_where_lib_conf test -n "$with_pardiso_include" && echo "pardiso INCLUDE $with_pardiso_include " >>$ff_where_lib_conf ff_where_lib_conf_pardiso=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add pardiso : $with_pardiso_ldflags $with_pardiso_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add pardiso : $with_pardiso_ldflags $with_pardiso_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add pardiso : $with_pardiso_ldflags $with_pardiso_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add pardiso : $with_pardiso_ldflags $with_pardiso_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_pardiso="" enable_pardiso_download=no fi # echo "debug cxxx11: $ff_cxx11 mpi: $ff_mpi petsc: $ff_petsc_ok " test "$ff_cxx11" != yes -o "$ff_mpi" != yes -o "$enable_download" != "yes" && enable_schwarz=no # Check whether --enable-schwarz was given. if test "${enable_schwarz+set}" = set; then : enableval=$enable_schwarz; fi if test "$enable_schwarz" = "no" then TOOL_COMPILE_schwarz="" TOOL_DYLIB_schwarz="" else TOOL_COMPILE_schwarz=schwarz TOOL_DYLIB_schwarz="schwarz.$DYLIB_SUFFIX removeDOF.$DYLIB_SUFFIX utility.$DYLIB_SUFFIX" enable_schwarz_download=yes fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-schwarz_include was given. if test "${with_schwarz_include+set}" = set; then : withval=$with_schwarz_include; fi # Check whether --with-schwarz_ldflags was given. if test "${with_schwarz_ldflags+set}" = set; then : withval=$with_schwarz_ldflags; fi if test "$with_schwarz_include" != "" || test "$with_schwarz_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_schwarz" ; then echo "schwarz LD $with_schwarz_ldflags" >>$ff_where_lib_conf test -n "$with_schwarz_include" && echo "schwarz INCLUDE $with_schwarz_include " >>$ff_where_lib_conf ff_where_lib_conf_schwarz=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add schwarz : $with_schwarz_ldflags $with_schwarz_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add schwarz : $with_schwarz_ldflags $with_schwarz_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add schwarz : $with_schwarz_ldflags $with_schwarz_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add schwarz : $with_schwarz_ldflags $with_schwarz_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_schwarz="" enable_schwarz_download=no fi # All makefiles ac_config_files="$ac_config_files Makefile download/Makefile download/blas/Makefile download/arpack/Makefile download/umfpack/Makefile download/fftw/Makefile src/Makefile src/bamglib/Makefile src/Graphics/Makefile src/femlib/Makefile src/Algo/Makefile src/lglib/Makefile src/fflib/Makefile src/nw/Makefile src/mpi/Makefile src/bamg/Makefile src/libMesh/Makefile src/medit/Makefile src/bin-win32/Makefile examples++/Makefile examples++-eigen/Makefile examples++-tutorial/Makefile examples++-mpi/Makefile examples++-load/Makefile examples++-chapt3/Makefile examples++-bug/Makefile examples++-other/Makefile examples++-3d/Makefile DOC/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FFCS_TRUE}" && test -z "${ENABLE_FFCS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FFCS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FFCS_MPIOK_TRUE}" && test -z "${FFCS_MPIOK_FALSE}"; then as_fn_error $? "conditional \"FFCS_MPIOK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FFCS_WINDOWS_TRUE}" && test -z "${FFCS_WINDOWS_FALSE}"; then as_fn_error $? "conditional \"FFCS_WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by FreeFem++ $as_me 3.38-1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ FreeFem++ config.status 3.38-1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "download/Makefile") CONFIG_FILES="$CONFIG_FILES download/Makefile" ;; "download/blas/Makefile") CONFIG_FILES="$CONFIG_FILES download/blas/Makefile" ;; "download/arpack/Makefile") CONFIG_FILES="$CONFIG_FILES download/arpack/Makefile" ;; "download/umfpack/Makefile") CONFIG_FILES="$CONFIG_FILES download/umfpack/Makefile" ;; "download/fftw/Makefile") CONFIG_FILES="$CONFIG_FILES download/fftw/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/bamglib/Makefile") CONFIG_FILES="$CONFIG_FILES src/bamglib/Makefile" ;; "src/Graphics/Makefile") CONFIG_FILES="$CONFIG_FILES src/Graphics/Makefile" ;; "src/femlib/Makefile") CONFIG_FILES="$CONFIG_FILES src/femlib/Makefile" ;; "src/Algo/Makefile") CONFIG_FILES="$CONFIG_FILES src/Algo/Makefile" ;; "src/lglib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lglib/Makefile" ;; "src/fflib/Makefile") CONFIG_FILES="$CONFIG_FILES src/fflib/Makefile" ;; "src/nw/Makefile") CONFIG_FILES="$CONFIG_FILES src/nw/Makefile" ;; "src/mpi/Makefile") CONFIG_FILES="$CONFIG_FILES src/mpi/Makefile" ;; "src/bamg/Makefile") CONFIG_FILES="$CONFIG_FILES src/bamg/Makefile" ;; "src/libMesh/Makefile") CONFIG_FILES="$CONFIG_FILES src/libMesh/Makefile" ;; "src/medit/Makefile") CONFIG_FILES="$CONFIG_FILES src/medit/Makefile" ;; "src/bin-win32/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin-win32/Makefile" ;; "examples++/Makefile") CONFIG_FILES="$CONFIG_FILES examples++/Makefile" ;; "examples++-eigen/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-eigen/Makefile" ;; "examples++-tutorial/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-tutorial/Makefile" ;; "examples++-mpi/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-mpi/Makefile" ;; "examples++-load/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-load/Makefile" ;; "examples++-chapt3/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-chapt3/Makefile" ;; "examples++-bug/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-bug/Makefile" ;; "examples++-other/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-other/Makefile" ;; "examples++-3d/Makefile") CONFIG_FILES="$CONFIG_FILES examples++-3d/Makefile" ;; "DOC/Makefile") CONFIG_FILES="$CONFIG_FILES DOC/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: freefem++ used download : $enable_download " >&5 $as_echo "$as_me: freefem++ used download : $enable_download " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: -- Dynamic load facility: $ff_dynload " >&5 $as_echo "$as_me: -- Dynamic load facility: $ff_dynload " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: -- ARPACK (eigen value): $ff_arpack_ok " >&5 $as_echo "$as_me: -- ARPACK (eigen value): $ff_arpack_ok " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: -- UMFPACK (sparse solver) $ff_umfpack_ok " >&5 $as_echo "$as_me: -- UMFPACK (sparse solver) $ff_umfpack_ok " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: -- BLAS $ff_blas_ok " >&5 $as_echo "$as_me: -- BLAS $ff_blas_ok " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: -- with MPI $ff_mpi" >&5 $as_echo "$as_me: -- with MPI $ff_mpi" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: -- with PETSC $ff_petsc_ok " >&5 $as_echo "$as_me: -- with PETSC $ff_petsc_ok " >&6;}; { $as_echo "$as_me:${as_lineno-$LINENO}: -- with schwarz (HPDDM) $enable_schwarz (need MPI & c++11 : $ff_cxx11 ) " >&5 $as_echo "$as_me: -- with schwarz (HPDDM) $enable_schwarz (need MPI & c++11 : $ff_cxx11 ) " >&6;}; { $as_echo "$as_me:${as_lineno-$LINENO}: progs: $ff_progs " >&5 $as_echo "$as_me: progs: $ff_progs " >&6;} if test "$ff_umfpack_download" = yes ;then { $as_echo "$as_me:${as_lineno-$LINENO}: use of download UMFPACK see download/umfpack/SuiteSparse/UMFPACK/README.txt for the License" >&5 $as_echo "$as_me: use of download UMFPACK see download/umfpack/SuiteSparse/UMFPACK/README.txt for the License" >&6;} fi if test "$ff_arpack_download" = yes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: use of download ARPACK see download/arpack/ARPACK/README no License " >&5 $as_echo "$as_me: use of download ARPACK see download/arpack/ARPACK/README no License " >&6;} fi if test "$enable_download" = yes ;then { $as_echo "$as_me:${as_lineno-$LINENO}: use of download fftw see download/fftw/fftw-3.2/COPYRIGHT " >&5 $as_echo "$as_me: use of download fftw see download/fftw/fftw-3.2/COPYRIGHT " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: use of download tetgen see download/tetgen/tetgen1.4.3/LICENSE " >&5 $as_echo "$as_me: use of download tetgen see download/tetgen/tetgen1.4.3/LICENSE " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: use of download freeyams see download/yams/freeyams.2011.02.22 (suface mesh adaptation) " >&5 $as_echo "$as_me: use of download freeyams see download/yams/freeyams.2011.02.22 (suface mesh adaptation) " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: use of download mmg3d (v4) see download/mmg3d/mmg3d4/LICENCE.txt " >&5 $as_echo "$as_me: use of download mmg3d (v4) see download/mmg3d/mmg3d4/LICENCE.txt " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: use of download metis" >&5 $as_echo "$as_me: use of download metis" >&6;} # ALH - some tools may be activated but not downloaded if a local version is specified (see # [[TOOL_PARAMETERS]]) if test "$enable_superlu_download" = yes then { $as_echo "$as_me:${as_lineno-$LINENO}: use of download superlu" >&5 $as_echo "$as_me: use of download superlu" >&6;} fi if test -n "$MPICC" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: try to download: blacs parmetis scalapack scotch superludist pastix hypre hips library" >&5 $as_echo "$as_me: try to download: blacs parmetis scalapack scotch superludist pastix hypre hips library" >&6;} fi if test "$ff_download_blas" = "generic" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: use of download generic blas and cblas freefem may be slow " >&5 $as_echo "$as_me: use of download generic blas and cblas freefem may be slow " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: you can try to use the Kazushige Goto s BLAS at http://www.cs.utexas.edu/users/flame/goto/ " >&5 $as_echo "$as_me: you can try to use the Kazushige Goto s BLAS at http://www.cs.utexas.edu/users/flame/goto/ " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: or at http://www.tacc.utexas.edu/~kgoto/ for the best BLAS ." >&5 $as_echo "$as_me: or at http://www.tacc.utexas.edu/~kgoto/ for the best BLAS ." >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: or try to download/compile the altas blas ." >&5 $as_echo "$as_me: or try to download/compile the altas blas ." >&6;} fi # ALH - 30/10/13 - (request from FH) all downloads are now part of a separate script ([[file:download/getall]]) # which needs to be run before make for the user to specify whether he is ok with each of the package licences. { $as_echo "$as_me:${as_lineno-$LINENO}: Please run \"download/getall\" to download all necessary packages before running make" >&5 $as_echo "$as_me: Please run \"download/getall\" to download all necessary packages before running make" >&6;} fi # FFCS does not use glut, so remove this message because it could make the user think that something is broken if test $enable_ffcs = no then if test "$ff_glut_ok" != yes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: *********************************************** " >&5 $as_echo "$as_me: *********************************************** " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: you do not have the new grachics tools " >&5 $as_echo "$as_me: WARNING: you do not have the new grachics tools " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: because the configure do not find OpenGL, GLUT or pthread developer stuff " >&5 $as_echo "$as_me: because the configure do not find OpenGL, GLUT or pthread developer stuff " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: read the README to find missing package " >&5 $as_echo "$as_me: read the README to find missing package " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: F. Hecht " >&5 $as_echo "$as_me: F. Hecht " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: to install missing package under debian or ubuntu, try: sudo apt-get install freeglut3-dev " >&5 $as_echo "$as_me: to install missing package under debian or ubuntu, try: sudo apt-get install freeglut3-dev " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: *********************************************** " >&5 $as_echo "$as_me: *********************************************** " >&6;} fi fi # Local Variables: # mode:shell-script # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/configure.ac000644 000767 000024 00000173030 12543260317 016101 0ustar00hechtstaff000000 000000 # ------------------------------------------------------------ # Antoine Le Hyaric - LJLL Paris 6 - lehyaric@ann.jussieu.fr - 13/5/04 # $Id: configure.ac,v 1.338 2010/05/10 21:35:07 hecht Exp $ # Version numbering: x.xx-pp where "pp" is the package version (when # the same FreeFem++ version is packaged several times). For # coherency, this should have the same value as the top-most package # number in debian/changelog. AC_INIT(FreeFem++,3.38-1,hecht@ann.jussieu.fr,freefem++) dnl : ${CFLAGS=""} dnl : ${CXXFLAGS=""} dnl : ${FCFLAGS=""} dnl : ${FFLAGS=""} # progg test expact under windows ff_TEST_FFPP="../src/nw/FreeFem++" ff_TEST_FFPP_MPI="../src/mpi/FreeFem++-mpi" AC_PREREQ(2.69) dnl for AC_LANG_CASE and check stuff dnl AC_CONFIG_SRCDIR(src/FreeFem++-CoCoa) # Automake 1.11 is too old for check ... # ALH - 10/9/13 - FFCS needs to skip this automake version requirement when compiling on older platforms (eg cygwin or # last Ubuntu LTS). So we fix a low hardcoded requirement and test for higher versions when not in FFCS. AM_INIT_AUTOMAKE(1.11 dist-zip) if test "$enable_ffcs" != yes then if test `echo $am__api_version|awk '{if($1>1.13)print "ok";}'` != ok then AC_MSG_ERROR([Automake version needs to be 1.13 or later to enable "make check"]) fi fi AC_CONFIG_HEADERS(config.h) AC_PROG_MAKE_SET dnl AM_COLOR_TESTS=always AC_PROG_RANLIB ff_where_lib_conf=examples++-load/WHERE_LIBRARY-config dnl search of associad software m4_define([AC_FF_ADDWHERELIB], [ if test -z "$ff_where_lib_conf_$1" ; then echo "$1 LD $2" >>$ff_where_lib_conf test -n "$3" && echo "$1 INCLUDE $3 " >>$ff_where_lib_conf ff_where_lib_conf_$1=1 AC_MSG_NOTICE([ ++ add $1 : $2 $3 in $ff_where_lib_conf "]) else AC_MSG_NOTICE([ -- do not add $1 : $2 $3 in $ff_where_lib_conf "]) fi ]) dnl m4_define([AC_FF_WHERELIB], [ if test -z "$ff_where_lib_conf_$1" ; then AC_MSG_CHECKING(check $1) ff_save_libs=$LIBS LIBS="$LIBS $2 $4" AC_LINK_IFELSE([AC_LANG_PROGRAM([m4_if($3,,,[#include <$3>])],[])], [ff_WHERE=yes],[ff_WHERE=no]) if test "$ff_WHERE" = "yes" ; then echo "$1 LD $2" >>$ff_where_lib_conf ff_WHERE_INC=`AS_DIRNAME(["$3"])` case "$ff_WHERE_INC" in /*) echo "$1 INCLUDE -I$ff_WHERE_INC" >>$ff_where_lib_conf ;; esac fi AC_MSG_RESULT($ff_WHERE) ff_where_lib_conf_$1=1 LIBS=$ff_save_libs fi ])dnl end m4_define AC_FF_WHERELIB ff_HOSTARCH_pastix= echo "# Build with freefem++ with ./configure " `date` >$ff_where_lib_conf # To allow anonymous CVS version to contain a "./configure" and # Makefiles AM_MAINTAINER_MODE echo >config_LIB_INFO # Necessary compilers AC_PROG_CC AC_PROG_CXX AC_LANG(C++) if test `uname` != Darwin; then ff_ldeg="-Wl,--end-group" ff_ldbg="-Wl,--start-group" fi AC_CHECK_PROG(ff_m4,m4,yes,no) AC_CHECK_PROG(ff_bison,bison,yes,no) AC_CHECK_PROG(ff_flex,flex,yes,no) dnl AC_CHECK_PROG(ff_cmake,cmake,yes,no) AC_CHECK_PROG(ff_patch,patch,yes,no) case "$ff_m4 $ff_bison $ff_patch $ff_flex" in *no*) AC_MSG_NOTICE([ to install missing package under debian or ubuntu, try ]) test "$ff_m4" = no && AC_MSG_NOTICE([ sudo apt-get install m4]) test "$ff_bison" = no && AC_MSG_NOTICE([ sudo apt-get install bison]) test "$ff_flex" = no && AC_MSG_NOTICE([ sudo apt-get install flex]) test "$ff_patch" = no && AC_MSG_NOTICE([ sudo apt-get install patch]) AC_MSG_ERROR([ Sorry missing m4,bison,flex,patch command !]);; esac if test -z "$CXX"; then AC_MSG_NOTICE( [ fatal error : c++ compiler ! ] ); AC_MSG_ERROR([ Sorry no c++ compiler !]) fi AC_COMPUTE_INT(ff_size_long,[sizeof(long)]) AC_COMPUTE_INT(ff_size_int,[sizeof(int)]) AC_COMPUTE_INT(ff_size_ptr,[sizeof(int*)]) AC_SUBST(SIZEOF_LONG,$ff_size_long) AC_SUBST(SIZEOF_INT,$ff_size_int) AC_SUBST(SIZEOF_PTR,$ff_size_ptr) if test "$ff_size_ptr" -eq 4 ;then AC_SUBST(SIZEOF_PTRINBIT,32) elif test "$ff_size_ptr" -eq 8 ;then AC_SUBST(SIZEOF_PTRINBIT,64) else AC_MSG_NOTICE( [ fatal error : sizeof pointer $ff_size_ptr ! or no c++ compiler: $CXX] ); AC_MSG_ERROR([ Sorry sizeof c++ pointer $ff_size_ptr are not 4 or 8 ]) fi # FFCS - build the code for FreeFem++-cs AC_ARG_ENABLE(ffcs,AC_HELP_STRING([--enable-ffcs],[build FreeFem++ for use by FreeFem++-cs])) if test "$enable_ffcs" = yes then AC_DEFINE_UNQUOTED(ENABLE_FFCS,$enable_ffcs,[build FreeFem++ for use by FreeFem++-cs]) else enable_ffcs=no fi AC_SUBST(ENABLE_FFCS,"$enable_ffcs") AM_CONDITIONAL([ENABLE_FFCS],[test $enable_ffcs = yes]) # dur dur car sous MacOsX le fortran n'est pas standard. ff_AR="ar" ff_ARFLAGS="rv" ff_RANLIB="ranlib" AC_ARG_ENABLE(fortran,AC_HELP_STRING([--disable-fortran],[No Fortran compiler available ( ARPACK need it)])) ff_g2c_lib=""; if test "$enable_fortran" != no then # ALH-FFCS-2/3/10: add gfortran-mp-4.4 for MacPorts on MacOS 10.6 # FH add iforr AC_PROG_FC(gfortran f90 xlf90 g95 ifort gfortran-mp-4.4) AC_PROG_F77(gfortran f90 xlf xlf90 g95 f77 fort77 "$FC" ifort gfortran-mp-4.4) # if test -n "$F77" # then ff_flibs="" # modif FH AC_F77_LIBRARY_LDFLAGS dnl AC_F77_WRAPPERS # correct pb of double def under macos case $F77 in *fort77) if test -z "$FLIBS" ; then # FLIBS=`fort77 -v a.out 2>&1|awk '/a.out/ && /fort77/ { print $(NF-2),$(NF-1)}'` # FH to remove " " FLIBS=`fort77 -v a.out 2>&1|awk '/a.out/ && /fort77/ { print "echo",$(NF-2),$(NF-1)}'|sh` AC_MSG_WARN([ fort77 FLIBS : $FLIBS ]) fi ;; *g77) for i in $FLIBS; do case $i in # save last directory of the list -L*) d=`expr $i : '-L\(.*\)'`; echo " try $d " if test -e "$d/libg2c.so" ; then ff_flibs="$d/libg2c.so" elif test -e "$d/libg2c.dylib" ; then ff_flibs="$d/libg2c.dylib" elif test -e "$d/libg2c.a" ; then ff_flibs="$d/libg2c.a" elif test -e $d/libg2c.so -o -e $d/libg2c.a ; then ff_flibs="$i" fi;; esac done if test -e "$ff_flibs" ;then FLIBS="$ff_flibs" else FLIBS="$ff_flibs -lg2c" fi AC_MSG_WARN([ get dir of -lg2c FLIBS : $FLIBS ]) ;; # add FH sep 2006 / modif 2009 *gfortran) for i in $FLIBS; do case $i in -L*) d=`expr $i : '-L\(.*\)'`; if test -e "$d/libgfortran.so" ; then ff_flibs="$d/libgfortran.so" elif test -e "$d/libgfortran.dylib" ; then ff_flibs="$d/libgfortran.dylib" elif test -e "$d/libgfortran.a" ; then ff_flibs="$d/libgfortran.a" elif test -e $d/libgfortran.so -o -e $d/libgfortran.a -o -e $d/libgfortran.dylib ; then ff_flibs="$i" fi;; esac done if test -e "$ff_flibs" ;then FLIBS="$ff_flibs" else FLIBS="$ff_flibs -lgfortran" fi AC_MSG_WARN([ get dir of -lgfortran FLIBS : $FLIBS ]) ;; esac AC_ARG_WITH(flib,[ --with-flib= the fortran library ]) # correct FH sep 2006 -o -> -a if test "$with_flib" != no -a -n "$with_flib" then ff_g2c_lib="$with_flib" FLIBS="$with_flib" fi # add FH oct 2007 for download f2c if test -z "$F77" ; then ff_f77=`pwd`/download/bin/fort77 ff_flibs=`pwd`/download/lib/libf2c.a if test -x $ff_f77 -a -f $ff_flibs ; then AC_MSG_WARN([ no fortran, but find download f2c/fort]); F77=$ff_f77 FLIBS=$ff_flibs else AC_MSG_NOTICE( [ fatal error : no fortran ] ); AC_MSG_NOTICE( [add --disable-fortran ] ); AC_MSG_NOTICE( [or try to compile f2c in directory download/f2c ] ); AC_MSG_NOTICE( [ just do: make install ] ); AC_MSG_ERROR([ Fatal error No Fortran compiler . ],1); fi fi # check if the FLIBS is correct ff_libs="$LIBS" LIBS="$ff_libs $FLIBS" AC_TRY_LINK_FUNC(exit,ff_err=,ff_err=ok); if test "$ff_err" = "ok" ; then AC_MSG_ERROR([ Fatal FLIBS: $FLIBS is incorrect. ],1); fi LIBS="$ff_libs" echo "F77 LD $ff_libs" >config_LIB_INFO AC_MSG_CHECKING([ Size of fortran 77 integer ]) ## AC_LANG(fortran); AC_LANG_PUSH([Fortran 77]) AC_RUN_IFELSE([AC_LANG_SOURCE([[ program test integer p,i p=1024*1024 i= p*p open(7,file="conftest.out") if (i>0) then write(7,*) 8 else write(7,*) 4 endif close(7) end ]])] ,ff_f77intsize=`cat conftest.out`,ff_f77intsize=4,ff_f77intsize=4) ## AC_LANG(C++) AC_LANG_POP([Fortran 77]) AC_MSG_RESULT($ff_f77intsize) AC_F77_WRAPPERS ff_cfagsf77="" case $ac_cv_f77_mangling in # "lower case, no underscore, no extra underscore") # "lower case, no underscore, extra underscore") # ;; "lower case, underscore, no extra underscore") ff_cfagsf77="-DAdd_";; "lower case, underscore, extra underscore") ff_cfagsf77="-DAdd__ -Df77IsF2C";; "upper case, no underscore, no extra underscore") ff_cfagsf77="-DUPPER";; "upper case, no underscore, extra underscore") ff_cfagsf77="-DUPPER -DAdd__";; "upper case, underscore, no extra underscore") ff_cfagsf77="-DUPPER -DAdd_";; "upper case, underscore, extra underscore") ff_cfagsf77="-DUPPER -DAdd__";; *) ;; esac AC_SUBST(CFLAGSF77,$ff_cfagsf77) if test $ff_f77intsize -ne 4 then AC_MSG_ERROR([ Fatal Error: Your fortran 77 compiler have by not 4 bytes integer ( $ff_f77intsize bytes) ],1); fi test -f /mingw/bin/libpthread-2.dll && ff_pthread_dll=/mingw/bin/libpthread-2.dll ; \ AC_FF_ADDWHERELIB(f77,$FLIBS,$ff_cfagsf77 $ff_pthread_dll) AC_FF_ADDWHERELIB(fc,$FLIBS,$ff_cfagsf77 $ff_pthread_dll) fi # fin test FORTRAN .......... # ---------------------------- AC_ARG_ENABLE(c,AC_HELP_STRING([--disable-c],[No C compiler available (C BLAS need it)])) if test "$enable_c" != no then AC_PROG_CC AM_PROG_CC_C_O else # We need to define this otherwise ./configure crashes with # the message "configure: error: conditional "am__fastdepCC" # was never defined". am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' fi AM_PROG_LEX AC_PROG_YACC AC_LANG(C++) # Some useful libraries AC_CHECK_LIB(pthread,pthread_create,ff_pthread="-lpthread",ff_pthread="") AC_CHECK_LIB(iomp5,omp_get_wtime,ff_iomp5="-liomp5",ff_iomp5="") if test -n "$ff_pthread" ; then AC_FF_ADDWHERELIB(pthread,$ff_pthread,) fi # Necessary absolute pathname for local directory when some libraries # are used from several different locations (for instance locally in # configure.ac and in a subdir). curdir=`pwd` # Configure options # ----------------- echo $ac_configure_args > configure.param # by default the suffix of the .so lib file is .so # it is .dll under windows # it is .dylib under macos X ff_suffix_dylib="so"; # Checking wether we can produce a MacIntosh-specific version # ----------------------------------------------------------- AC_MSG_CHECKING(wether we are on a MacIntosh) ff_mac=no if test `uname` = Darwin; then ff_HOSTARCH_pastix=i686_mac ff_suffix_dylib="dylib" ff_mac=yes AC_DEFINE_UNQUOTED(FF_PREFIX_DIR_APPLE,"/Applications/FreeFem++.app/Contents/",FreeFem prefix dir) fi AC_MSG_RESULT($ff_mac) AC_MSG_CHECKING(wether we are on SunOS) ff_sunos=no if test `uname -s` = SunOS; then ff_sunos=yes fi AC_MSG_RESULT($ff_sunos) # Checking wether we can produce a Microsoft Windows-specific version # ------------------------------------------------------------------- AC_ARG_ENABLE(cygwindll, [ --enable-cygwindll Forces the use of the Cygwin DLL (not recommended)]) AC_MSG_CHECKING(wether we are on Microsoft Windows) ff_uname=`uname` # flag to build window 32 version ff_mingw = yes ff_mingw=no case $ff_uname in CYGWIN*) # FFCS - 17/1/12 - -mno-cygwin is not recognised by the latest version of mingw32 if test $enable_ffcs = no then ff_nocygwin=-mno-cygwin fi AC_SUBST(GCCNOCYGWIN,$ff_nocygwin);; MINGW*) enable_cygwindll=no;; esac case $ff_uname in CYGWIN*|MINGW*) ff_suffix_dylib="dll"; ff_win32=yes; # FFCS - 8/3/12 - remove -D_MSC_VER under MinGW64 because it forces system calls to be compiled into any object # (which creates thousands of duplicate definitions for sytem calls like time()). # We need Mingw to avoid Cygwin's extra DLLs if test "$enable_cygwindll" != yes then # CHECK_COMPILE_FLAG(C++,-mwindows,CXXFLAGS) ff_glut_ok=yes # FFCS: on Windows, FF crashes when compiling GL/glut.h and the option "--disable-opengl" is not # operational because ff_glut_ok is forced to yes here. if test $enable_ffcs = yes then ff_glut_ok=no enable_opengl=no fi ff_mingw=yes enable_cygwindll=no; ff_pthread="-mthreads" # FFCS does not use the Cygwin MinGW compilers any more if test $enable_ffcs = no then CXXFLAGS="$CXXFLAGS $ff_nocygwin -I/usr/include/mingw" FFLAGS="$FFLAGS $ff_nocygwin" CFLAGS="$CFLAGS $ff_nocygwin -I/usr/include/mingw" AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a;])],[], [ff_nocygwin=""; AC_MSG_NOTICE([Sorry $ff_nocygwin optio is wrong try whitout , but try with gcc-3.3]) ]) CXXFLAGS="$CXXFLAGS $ff_nocygwin -I/usr/include/mingw" FFLAGS="$FFLAGS $ff_nocygwin" CFLAGS="$CFLAGS $ff_nocygwin -I/usr/include/mingw" CNOFLAGS="$CNOFLAGS $ff_nocygwin -I/usr/include/mingw" fi LIBS="$LIBS $ff_nocygwin -mthreads -lws2_32 -lcomdlg32" LIBSNOCONSOLE="-mwindows" # FFCS uses a specific compiler, so we specify its libraries explicitely if test $enable_ffcs = no then test -z "$MPIRUN" && MPIRUN=`which mpiexe.exe` if test "$enable_fortran" != no -o "$with_flib" != no ; then case "$F77" in *gfortran) FLIBS="$ff_nocygwin -lgfortran";; *g77) FLIBS="$ff_nocygwin -lg2c";; *) AC_MSG_ERROR([ Sorry no known FLIBS with this $F77 !]) ;; esac fi fi ff_glutname="glut32" # check abort a existing function just to find in glut32.dll exist in the path # because glutInit is not the real symbol on win32 dur dur FH !!!!!!!!! AC_CHECK_LIB(glut32,abort,ff_glut="-l$ff_glutname -mthreads -lglu32 -lopengl32",ff_glut="") if test -z "$ff_glut" ; then ff_glutname="freeglut" AC_CHECK_LIB(freeglut,abort,ff_glut="-l$ff_glutname -mthreads -lglu32 -lopengl32",ff_glut_ok=no) fi # Resources for FreeFem++-cs in Microsoft Windows format AC_SUBST(FFGLUTNAME,$ff_glutname) AC_SUBST(WINDRESOBJ,windres.o) AC_SUBST(LIBSNOCONSOLE,$LIBSNOCONSOLE) AC_SUBST(WIN32DLLTARGET,win32-dll-target) ff_TEST_FFPP="../src/bin-win32/FreeFem++.exe" ff_TEST_FFPP_MPI="../src/bin-win32/FreeFem++-mpi.exe" AC_DEFINE(PURE_WIN32,1,A pure windows applications no cygwin dll) ff_dynload=yes fi ;; *)ff_win32=no;; esac AC_MSG_RESULT($ff_win32) if test "$ff_win32" = no then enable_cygwindll=no fi # FreeFem++-specific version information # -------------------------------------- # Version numbering, converted to a floating point value ff_numver="`echo $VERSION|sed 's/-\(.*\)/+\1.0*0.000001/'`" AC_DEFINE_UNQUOTED(VersionFreeFempp,$ff_numver,FreeFem++ version as a float) # Since src/fflib/strversionnumber.cpp is recreated at each build, this # date is only useful for config-version.h test "$prefix" = NONE && prefix="$ac_default_prefix" ff_prefix_dir="${prefix}/lib/ff++/$VERSION" AC_MSG_CHECKING(prefix dir freefem++ ) AC_MSG_RESULT($ff_prefix_dir) FF_DATE=`date` AC_DEFINE_UNQUOTED(VersionFreeFemDate,"$FF_DATE",FreeFem++ build date) AC_DEFINE_UNQUOTED(FF_PREFIX_DIR,"${ff_prefix_dir}",FreeFem prefix dir) AC_SUBST(ff_prefix_dir,$ff_prefix_dir) # Separate configuration header file for version information, included # in config-macos9.h cat << EOF > config-version.h /* FreeFem++ version information for MacOS 9 configuration */ /* File generated by configure.ac */ /* Define to the full name and version of this package. */ #define PACKAGE_STRING "$PACKAGE_STRING" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "$PACKAGE_TARNAME" /* Define to the version of this package. */ #define PACKAGE_VERSION "$PACKAGE_VERSION" /* Version number of package */ #define VERSION "$VERSION" /* FreeFem++ build date */ #define VersionFreeFemDate "$FF_DATE" /* FreeFem++ version as a float */ #define VersionFreeFempp ($ff_numver) EOF # Checking wether to produce a debug version # ------------------------------------------ # Generic or hardware-dependant optimization m4_include(acmacros.m4) m4_include(acoptim.m4) m4_include(ax_lib_hdf5.m4) m4_include(ax_lib_gsl.m4) # Checking c++11 for schwarz interface of P. Jolivet ... # F.Hecht: # do not compile all with c++11 version to much # probleme to day (frev 2015) with g++ 4.8.1 ff_cxx_save=$CXXFLAGS CHECK_COMPILE_FLAG(C++,[-std=c++11],CXXFLAGS,ff_cxx11) dnl CXXFLAGS="$CXX11FLAGS $CXXFLAGS" dnl ff_cxx11="no" dnl if test -n "$CXX11FLAGS" ; then ff_cxx11="yes" ; fi if test "$ff_cxx11" = yes ; then CXX11FLAGS="-std=c++11"; AC_FF_ADDWHERELIB(cxx11,$CXX11FLAGS,$CXX11FLAGS) fi CXXFLAGS="$ff_cxx_save" AC_SUBST(WITH_CXX11,$ff_cxx11) AC_SUBST(CXX11FLAGS,$CXX11FLAGS) #end Checking c++11 # ------------------------------ # compilation flags of FreeFem++ # ------------------------------ # -DDRAWING bamg active some drawing facility in bamg (inquire mesh) # -DBAMG_LONG_LONG active the use of long long in bamg # -DDEBUG active the checking in bamg # -DNCHECKPTR remove check pointer facility # -DCHECK_KN active subscripting of some array # -DWITHCHECK of the dynamic type ckecking of the langague (very slow) # -DEIGENVALUE to compile the eigen value part # ------------------------------------------------ # FreeFrem++-specific optimizations -fpascal-strings if test "$enable_debug" = yes; then CXXFLAGS="$CXXFLAGS -DBAMG_LONG_LONG -DCHECK_KN" if test "$ff_mac" = yes; then CXXFLAGS="$CXXFLAGS -fno-inline -fexceptions" fi else CXXFLAGS="$CXXFLAGS -DBAMG_LONG_LONG -DNCHECKPTR" if test "$ff_mac" = yes; then CXXFLAGS="$CXXFLAGS " fi fi #whether or not to add a suffix to the package name #-------------------------------------------------- AC_ARG_WITH(suffix,[ --with-suffix=[G3/G4/G4,P4,..] or --without-suffix (default no suffix to package name)]) AC_MSG_CHECKING(suffix to add to package name) ff_suffix= if test "$with_suffix" = yes -o "$with_suffix" = no -o "$with_suffix" = "" then AC_MSG_RESULT(none) else ff_suffix="-$with_suffix" AC_MSG_RESULT($ff_suffix) fi AC_SUBST(ADD_PACKAGE_NAME,$ff_suffix) # Checking that OpenGL is accessible # ---------------------------------- ff_gl_ok=no ff_glx_ok=no ff_libs="$LIBS" AC_ARG_WITH(flib,[ --with-flib= the fortran library ]) AC_ARG_ENABLE([opengl],AS_HELP_STRING([--enable-opengl], [Enable/disable support for OpenGL])) # echo " .... LIBS = $LIBS .... " if test x$enable_opengl != xno; then # GL libraries seem to depend on some dlopen capabilities if test "$enable_static" != yes -a "$ff_glut_ok" != yes then # If we cannot find gl.h, no OpenGL version can be produced AC_CHECK_HEADERS(OpenGL/gl.h, ff_gl_ok=yes , ff_gl_ok=no ) if test "$ff_gl_ok" = no then AC_CHECK_HEADERS(GL/gl.h, ff_gl_ok=yes , ff_gl_ok=no ) fi AC_CHECK_HEADERS(GLUT/glut.h, ff_glut_ok=yes, ff_glut_ok=no) if test "$ff_glut_ok" = no then AC_CHECK_HEADERS(GL/glut.h, ff_glut_ok=yes, ff_glut_ok=no) fi # GLUT ..... if test "$ff_glut_ok" = yes then for glut in \ "-framework GLUT -framework OpenGL -framework Cocoa" \ "-lglut -lGLU -lGL" do ff_glut="$glut" ff_libs1="$LIBS" LIBS="$LIBS $ff_glut" AC_TRY_LINK_FUNC(glutInit, ff_glut_ok=yes LIBS="$ff_libs1" break, ff_glut_ok=next); LIBS="$ff_libs1" done fi fi fi AC_SUBST(LIBSPTHREAD,$ff_pthread) # ALH - 16/9/13 - at the moment the requirements for medit (glut) are not compatible with FFCS so medit is # only compiled with FF. if test $enable_ffcs = no then if test "$ff_glut_ok" = yes then AC_SUBST(LIBSGLUT,$ff_glut) if test -n "$ff_pthread" ; then ff_ffglutprog="ffglut${EXEEXT}" AC_DEFINE_UNQUOTED(PROG_FFGLUT,"$ff_ffglutprog", the ffglut application for the new graphics ) fi ff_meditprog="ffmedit${EXEEXT}" fi fi AC_ARG_WITH(suffix,[ --with-suffix=[G3/G4/G4,P4,..] or --without-suffix (default no suffix package name)]) if test "$with_suffix" = yes then with_suffix="" elif test "$with_suffix" = no -o -z "$with_suffix" then with_suffix="" else with_suffix="-$with_suffix" fi AC_MSG_CHECKING(add suffix $with_suffix ) AC_SUBST(ADD_PACKAGE_NAME,$with_suffix) AC_MSG_RESULT(yes) # Checking wether we can produce a parallel version # ------------------------------------------------- if test $enable_ffcs = no then # FF case m4_include(acmpi.m4) else # FFCS - use the same MPI configuration choices as FFCS ff_mpi=yes AC_SUBST(MPICXX,$MPICXX) AC_SUBST(MPICC,$MPICC) AC_SUBST(MPIF77,$MPIF77) AC_SUBST(MPIFC,$MPIFC) AC_SUBST(MPIPROG,"FreeFem++-mpi${EXEEXT}") AC_SUBST(MPI_INCLUDE,"-I $MPI_INC_DIR") AC_SUBST(MPI_INC_DIR,$MPI_INC_DIR) AC_SUBST(MPI_LIB_DIRS,"") AC_SUBST(MPI_LIB,$MPI_LIB) AC_SUBST(MPI_LIBC,"") AC_SUBST(MPI_LIBFC,"") # Extra MPI-dependant configuration options that are set by FF during MPI configuration. FFCS - 25/2/13 - Fred # noticed that if PASTIX_HOSTARCH stays blank, pastix compilation breaks. At least i686_pc_linux and i686_mac are # required by pastix on the corresponding platforms. if test"$ff_HOSTARCH_pastix" = "" then ff_HOSTARCH_pastix=i686_pc_linux fi AC_SUBST(PASTIX_HOSTARCH,$ff_HOSTARCH_pastix) # these values should not be empty otherwise examples++-load/ff-get-dep will think that they are not defined AC_FF_ADDWHERELIB(mpi,-DDUMMY,-I$MPI_INC_DIR) # mpifc and mpif77 libraries should always be specified because FF never calls the Fortran MPI compiler. It always # uses mpicxx in [[file:examples++-load/ff-c++]]. The resulting Fortran libraries (eg Mumps) would compile even # without the proper Fortran libs, but they would not load properly. # under Win32, libmpi_f77.a is not the right name and FFCS mingw/mpicxx adds the right libraries by itself # With mpich2 Debian wheezy 32 bits, libmpi_f77.a is not available (request from Cico, 14/10/13) if test -f /usr/lib/openmpi/lib/libmpi_f77.a then AC_FF_ADDWHERELIB(mpifc,-lmpi_f77,) AC_FF_ADDWHERELIB(mpif77,-lmpi_f77,) else AC_FF_ADDWHERELIB(mpifc,-DDUMMY,) AC_FF_ADDWHERELIB(mpif77,-DDUMMY,) fi # FFCS - MPI_DOUBLE_COMPLEX kept from original FF configure script AC_MSG_CHECKING( MPI_DOUBLE_COMPLEX) AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ #include MPI_Datatype xxxx=MPI_DOUBLE_COMPLEX; ])], ff_mpi_double_complex=yes, ff_mpi_double_complex=no) AC_MSG_RESULT($ff_mpi_double_complex) if test "$ff_mpi_double_complex" = yes ; then AC_DEFINE(HAVE_MPI_DOUBLE_COMPLEX,1, mpi_double_complex) fi fi # FFCS needs to change some of the FF makefiles to compile without MPI on MacOS AM_CONDITIONAL([FFCS_MPIOK],[test $ff_mpi = yes]) # Looking for useful configuration utilities # ------------------------------------------ AC_ARG_ENABLE(download,AC_HELP_STRING([--enable-download],[Download missing libraries (BLAS,ARPACK,UMFPACK,...)])) ## PETSc AC_ARG_WITH(petsc,[ --with-petsc= /usr/local/petsc --without-petsc ]) # /usr/local/petsc/conf/petscvariables ff_petsc_ok=no ## echo --$with_petsc-- if test "$with_petsc" != no -a $ff_mpi = yes; then for d in "$with_petsc" /usr /usr/local /opt/usr /opt/local ;do for dd in "" "/petsc/conf/petscvariables" "/lib/petsc-conf/petscvariables" ; do ffconfpetsc="$d$dd" if test -f "$ffconfpetsc" ; then if test "$ff_petsc_ok" = no ; then PETSC_MPIRUN=`awk -F' *= *' '"MPIEXEC"==$1 {print $2}' "$ffconfpetsc"` cmp -s "$PETSC_MPIRUN" "$MPIRUN" if test "$?" -eq 0 ; then PETSC_WITH_EXTERNAL_LIB=`awk -F'=' '"PETSC_WITH_EXTERNAL_LIB "==$1 {print $2}' $ffconfpetsc` PETSC_CC_INCLUDES=`awk -F'=' '"PETSC_CC_INCLUDES "==$1 {print $2}' $ffconfpetsc` if test -n "$PETSC_WITH_EXTERNAL_LIB"; then ff_petsc_ok=yes; AC_FF_ADDWHERELIB(petsc,$PETSC_WITH_EXTERNAL_LIB,$PETSC_CC_INCLUDES) fi else AC_MSG_NOTICE([" Warning PETSC MPI and FF++ MPI not the same: $PETSC_MPIRUN != $MPIRUN." ]); fi fi else test "$ff_petsc_ok" = no && echo " *** try $ffconfpetsc" ffconfpetsc=""; fi done done fi if test "$ff_petsc_ok" != no ; then AC_MSG_NOTICE([ with petsc $ff_petsc_ok]) else AC_MSG_NOTICE([ without petsc ***** ]) fi #replacing wget with another command ff_wget_command="wget --no-check-certificate" ff_wget=no AC_ARG_WITH(wget, [ --with-wget=command Replace "wget" with another command. Implies --enable-download], enable_download=yes ff_wget=yes ff_wget_command="${withval}") ff_mkl_libpath=yes AC_ARG_WITH(mkl, [ --with-mkl= the MKL LIBPATH : (ie. /opt/intel/mkl/RR.r.y.xxx/lib/)], ff_mkl_libpath="${withval}") # if enabling downloads find wget or curl to do download # ------------------------------------------------------ if test "$ff_wget" = no then ff_wget="" AC_CHECK_PROG(ff_wget,wget --no-check-certificate,yes,no) fi if test "$ff_wget" = no then ff_wget_command="curl --fail -O " ff_curl="" AC_CHECK_PROG(ff_curl,curl -O,yes,no) ff_wget="$ff_curl" fi # for automatique compilation of # lib in download if test "$ff_wget" != yes -a "$enable_download" = "yes" ; then enable_download=no AC_MSG_ERROR([ enable-download and no wget or curl. ],1); fi if test "$enable_download" = "yes" ; then DOWNLOADCOMPILE="compile-pkg install-other" else DOWNLOADCOMPILE= fi AC_SUBST(WGET,$ff_wget_command) AC_SUBST(DOWNLOADCOMPILE,$DOWNLOADCOMPILE) # modif FH ----- # -- looking for cadna # the round-off error propagation # the web site http://www-anp.lip6.fr/cadna/ # -------------------- AC_ARG_WITH(cadna,[ --with-cadna= cadna library --without-cadna ]) if test "$with_cadna" != no -o -n "$with_cadna" then ff_cadna="$with_cadna" fi ff_cadna_ok=no if test "$with_cadna" != no then ff_libs_old="$LIBS" ff_ldflags_old="$LDFLAGS" ff_cadna_dir="${curdir}/download/cadna" LDFLAGS="$LDFLAGS -L$ff_cadna_dir" AC_CHECK_LIB(cadnafree,arit_zero, ff_cadna_ok=yes) AC_CHECK_HEADERS(${ff_cadna_dir}/cadnafree.h, ff_cadna_h=yes, ff_cadna_h=no) LIBS="$ff_libs_old" LDFLAGS="$ff_ldflags_old" if test "$ff_cadna_ok" = yes -a "$ff_cadna_h" = yes then AC_DEFINE(HAVE_CADNA,1, freecadna is use to evalute the round-off error propagation ) CPPFLAGS="$CPPFLAGS -I$ff_cadna_dir" LIBS=" -L$ff_cadna_dir -lcadnafree $ff_libs_old" else AC_MSG_NOTICE([ without cadna ***** ]) fi else AC_MSG_NOTICE([ without cadna ***** ]) fi # Looking for FFTW # ---------------- # ALH - 18/9/13 - deactivates FFTW detection for testing purposes AC_ARG_ENABLE(system_fftw,AC_HELP_STRING([--disable-system-fftw],[Disable the automatic detection of FFTW])) if test "$enable_system_fftw" != no then # ALH - 4/9/13 - avoid recompiling FFTW if a copy was found on the system (request from Helmut Jarausch, 1/8/13) AC_CHECK_LIB(fftw3,fftw_execute,ff_fftw_ok=yes) AC_CHECK_HEADERS(fftw3.h,ff_fftw_h=yes, ff_fftw_h=no) fi if test "$ff_fftw_ok" = yes -a "$ff_fftw_h" = yes then AC_FF_ADDWHERELIB(fftw3,-lfftw3,) fftw_download= else if test "$enable_download" = yes then ff_DOWNLOAD_FFTW=fftw fi fi # used in [[file:download/fftw/Makefile.am::DOWNLOAD_FFTW]] AC_SUBST(DOWNLOAD_FFTW,$ff_DOWNLOAD_FFTW) dnl --------------------------- dnl Looking for the tetgen dnl -------------------------- AC_CHECK_LIB(tet,tetrahedralize,ff_fftet_ok=yes) AC_CHECK_HEADERS(tetgen.h,ff_tet_h=yes, ff_tet_h=no) if test "$ff_tet_ok" = yes -a "$ff_tet_h" = yes then AC_FF_ADDWHERELIB(tetgen,-ltet,) AC_DEFINE(HAVE_TETGEN,1, tetgen is compute tetrahedralize volume of an enclosed surface) fi # Looking for the BLAS # -------------------- ff_blas_ok=no ff_blas_inc="" # ALH - 18/9/13 - give the option to deactivate system blas for testing purposes AC_ARG_ENABLE(system-blas,AC_HELP_STRING([--disable-system-blas],[Disable the search for a system-wide BLAS library])) if test "$enable_system_blas" != no then # User-specified location # add MKL seach dec 2010 FH .... ff_mkl_flags="" if test "$ff_mkl_libpath" != "not" ; then ff_CFLAGS="$CFLAGS" CHECK_COMPILE_FLAG(C,-mkl,CFLAGS) if test "$ff_CFLAGS" != "$CFLAGS" ; then ff_ff_mkl_flags="-mkl" fi CFLAGS="$ff_CFLAGS" fi AC_MSG_CHECKING(for MKL) ff_mkl_root="" if test "$ff_mkl_libpath" != "not" -a -z "$ff_mkl_flags" ; then if test "$ff_mkl_libpath" = "yes" ; then ff_IFS="$IFS" IFS=":" for i in $LD_LIBRARY_PATH:$LIBRARY_PATH ; do case $i in */mkl/*) ff_mkl_libpath=$i;; esac ; done; IFS="$ff_IFS" # else # ff_mkl_libpath=no fi if test "$ff_mkl_libpath" != "no" -a -d "$ff_mkl_libpath" ; then ff_mkl_root=`expr "//$ff_mkl_libpath" : '//\(.*\)/lib.*'` ff_mkl_arch=`expr "//$ff_mkl_libpath" : '//.*/lib/\(.*\)'` ff_mkl_lp=_lp64 case "$ff_mkl_arch" in *64*) ff_mkl_lp=_lp64 esac case $F77 in *ifort*) ff_mkl_cc=intel;; *) ff_mkl_cc=gf;; esac # bof bof .... case "$MPIRUN" in */sgi/*) ff_mkl_mpi=_sgimpt;; */intel/*) ff_mkl_mpi=_intelmpi;; *) ff_mkl_mpi=_openmpi;; esac # echo ................ ff_mkl_root = $ff_mkl_root .. $ff_mkl_arch if test ! -d "$ff_mkl_libpath" ; then ff_mkl_libpath="$ff_mkl_root/lib/$ff_mkl_arch" fi if test -f "$ff_mkl_libpath/libmkl_rt.$ff_suffix_dylib" ; then mkl_blas=rt mkl_lapack=rt ff_mkl_mlt="-L$ff_mkl_libpath -lmkl_rt -lmkl_intel_thread -lmkl_core $ff_iomp5 $ff_pthread" ff_mkl_blas="-L$ff_mkl_libpath -lmkl_rt -lmkl_sequential -lmkl_core $ff_iomp5 $ff_pthread" ff_mkl_lapack="$ff_mkl_blas" elif test -f "$ff_mkl_libpath/libmkl_lapack.$ff_suffix_dylib" ; then ff_mkl_mlt="-L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_lapack -lmkl_intel${ff_mkl_lp} -lmkl_intel_thread -lmkl_core -lguide -lm -lpthread" ff_mkl_blas="-L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_lapack -lmkl_intel${ff_mkl_lp} -lmkl_sequential -lmkl_core -lguide -lm -lpthread" ff_mkl_lapack="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_lapack" else ff_mkl_mlt="$ff_ldbg -L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_intel_thread -lmkl_core -lmkl_intel_thread $ff_iomp5 $ff_ldeg -lm $ff_pthread" ff_mkl_blas="$ff_ldbg -L$ff_mkl_libpath -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_sequential -lmkl_core -lmkl_sequential $ff_ldeg -lm $ff_pthread" ff_mkl_lapack="$ff_mkl_blas" fi if test -f "-L$ff_mkl_libpathmkl_scalapack${ff_mkl_lp}" ; then ff_mkl_scalapack="-L$ff_mkl_libpath -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp} " ff_mkl_blacs="-L$ff_mkl_libpath -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp}" fi ff_blas_ok=yes ff_lapack_ok=yes # <> ALH - 6/11/13 - request from Atsushi Suzuki - the default MKL library must be able to # handle threads when FF is connected to AS' solver. So we need an option to configure FF with the # multithreaded MKL by default. AC_ARG_ENABLE(mkl_mlt,AC_HELP_STRING([--enable-mkl-mlt],[Link with the multithreaded instead of the monothreaded version of the MKL])) if test "$enable_mkl_mlt" = yes then ff_blas_libs="$ff_mkl_mlt" else ff_blas_libs="$ff_mkl_blas" fi ff_blas_inc="-I$ff_mkl_root/include" dnl scalapack, and blacs don not work with mlk and sgi if test "$ff_mkl_mpi" != "_sgimpt" ; then AC_FF_ADDWHERELIB(scalapack,$ff_mkl_scalapack,$ff_blas_inc) AC_FF_ADDWHERELIB(blacs,$ff_mkl_blacs,$ff_blas_inc) else ff_warm=" (We do not use MKL scalapack and blacs with sgi MPI), " fi AC_FF_ADDWHERELIB(lapack,$ff_mkl_lapack,$ff_blas_inc) AC_FF_ADDWHERELIB(mkl,$ff_mkl_mlt,$ff_blas_inc) AC_DEFINE(HAVE_MKL,1, the MKL intel lib is present for BLAS and LAPACK ) else ff_mkl_libpath=no # FH - pardiso is there as soon as mkl is enable_pardiso=no fi fi AC_MSG_RESULT( [ $ff_warm root: $ff_mkl_root , arch: $ff_mkl_arch , $ff_mkl_lp ... ]) AC_ARG_WITH(blas, AC_HELP_STRING([--with-blas=library],[Use a specific version of the Blas]), ff_blas_ok=yes ff_blas_libs="${withval}") # Specific BLAS library location for FreeBSD ff_freebsd_blas="-lf2c -lf77blas -latlas -lgslcblas" # zmach is in lapack # Trying blas library # echo "LIBS = $LIBS blas --- $ff_blas_ok" for iblas in \ "-framework Accelerate" "$ff_mkl_blas" "-lblas" "-L/usr/lib/atlas -lblas" \ $ff_freebsd_blas do if test "$ff_blas_ok" = no; then AC_MSG_CHECKING(for daxpy_ in $iblas) ff_save_libs="$LIBS" LIBS="$LIBS $iblas" AC_LINK_IFELSE( [AC_LANG_CALL(,daxpy_)], ff_blas_ok=yes ff_blas_libs="$iblas",) LIBS="$ff_save_libs" AC_MSG_RESULT($ff_blas_ok) fi done #cblas_zdotu_sub #echo "LIBS = " $LIBS ff_cblas_libs=no if test "$ff_blas_ok" = yes then AC_MSG_CHECKING(for blas_zdotu_sub in $ff_blas_libs) ff_save_libs="$LIBS" LIBS="$LIBS $ff_blas_libs $FLIBS" AC_LINK_IFELSE( [AC_LANG_CALL(,cblas_zdotu_sub)], ff_cblas_libs=yes) AC_MSG_RESULT($ff_cblas_libs) LIBS="$ff_save_libs" fi fi # <> ALH - 18/9/13 - option to compile the OpenBLAS moved from the FFCS tree to FF tree AC_ARG_ENABLE(openblas,AC_HELP_STRING([--disable-openblas],[Disable the automatic download of OpenBLAS])) if test "$ff_blas_ok" = no && test "$enable_openblas" != no && test "$enable_download" = yes then AC_CHECK_PROG(ff_git,git,yes,no) AC_MSG_CHECKING([Activating the OpenBLAS (deactivate with --disable-openblas)]) if test $ff_git = no then AC_MSG_RESULT([git not found]) else ff_download_blas=openblas # it is necessary to split the library path into -L and -l otherwise ff/upstream/examples+++-load/ff-c++ will # place -lgfortran in LIBS, .../libgoto___.lib in OTHER, and call the compiler with $LIBS before $OTHER, which # will fail. ff_blas_libs="-L${curdir}/download/blas/OpenBLAS -lopenblas -lgfortran $ff_pthread" ff_blas_inc="-I${curdir}/download/blas/CBLAS/src" # skip generic blas compilation and activate OpenBLAS (see [[file:download/blas/Makefile.am::OpenBLAS]]) AC_SUBST(DOWNLOADED_BLAS,"") AC_SUBST(COMPILE_OPENBLAS,openblas) ff_blas_ok=yes ff_cblas_h=yes ff_cblas_libs=yes AC_MSG_RESULT([ok]) fi fi # If all else fails, download a generic version if test "$ff_blas_ok" = no -a "$enable_download" = yes -a "$enable_fortran" != no -a "$enable_c" != no then AC_CHECK_PROG(ff_unzip,unzip,yes,no) AC_MSG_CHECKING(for BLAS version to download) # Do not update $LIBS, but create an extra LIB variable, because this lib does not exist yet, and this could make # the following tests fail. # When compiling a generic version, we do not need an optimized version of the BLAS. ff_download_blas=generic ff_blas_libs="-L${curdir}/download/blas -lcblas -lf77blas" ff_blas_inc="-I${curdir}/download/blas/CBLAS/src" AC_SUBST(DOWNLOADED_BLAS,"libf77blas.a libcblas.a") AC_SUBST(DOWNLOADED_BLAS_BUILT_SOURCES,'BLAS CBLAS $(F77BLAS_SOURCES) $(CBLAS_SOURCES)') AC_MSG_RESULT($ff_download_blas) ff_blas_ok=yes ff_cblas_h=yes ff_cblas_libs=yes fi AC_SUBST(BLASLIBS,$ff_blas_libs) AC_SUBST(BLASINC,$ff_blas_inc) #looking for cblas.h FH if test "$ff_blas_ok" = yes -a "$ff_cblas_libs" = yes ; then AC_CHECK_HEADERS(cblas.h, ff_cblas_h=yes, ff_cblas_h=no) AC_CHECK_HEADERS(Accelerate/cblas.h, ff_cblas_h=yes ff_cblas_h=no) AC_CHECK_HEADERS(atlas/cblas.h, ff_cblas_h=yes ff_cblas_h=no) fi # ALH - 18/9/13 - [[file:download/blas/Makefile.am]] does not update the WHERE mechanism so it always needs to be set up # here even in the case of a downloaded blas library. AC_FF_ADDWHERELIB(blas,$ff_blas_libs,) # end of BLAS ------------------- # Looking for ARPACK # ------------------ # We need the following g77 libraries to connect to the Fortran 77 # Arpack. if test "$ff_blas_ok" = yes; then ff_g2c_lib="$FLIBS" if test -n "$ff_g2c_lib" then LIBS="$LIBS $ff_g2c_lib" else ff_g2c_ok=no AC_CHECK_LIB(g2c,G77_second_0, LIBS="$LIBS -lg2c" ff_g2c_lib="-lg2c" ff_g2c_ok=yes) if test "$ff_g2c_ok" = no; then AC_MSG_CHECKING(for G77_second_0 in /sw/lib/libg2c.a) ff_save_libs="$LIBS" LIBS="$LIBS -L/sw/lib -lg2c" AC_LINK_IFELSE( [AC_LANG_CALL(,G77_second_0)], ff_g2c_lib="-L/sw/lib -lg2c" ff_g2c_ok=yes, LIBS="$ff_save_libs") AC_MSG_RESULT($ff_g2c_ok) fi fi fi # Copy the result of g2c investigations into a separate variable # because BLAS compilation will need it. AC_SUBST(G2CLIB,$ff_g2c_lib) #looking of lapack if no compile the arpack lapack # warning $$ because the make eat one ff_lapack_ok=no; ff_lapack_lib= AC_MSG_CHECKING([for lapack in $LIBS, $ff_blas_libs and -llapack] ) if test "$ff_blas_ok" = yes ; then AC_LINK_IFELSE( [AC_LANG_CALL(,dgeqr2_)], ff_lapack_ok=yes) if test "$ff_lapack_ok" = no ; then ff_save_libs=$LIBS LIBS="$ff_save_libs $ff_blas_libs" AC_LINK_IFELSE( [AC_LANG_CALL(,dgeqr2_)], ff_lapack_ok=yes) if test "$ff_lapack_ok" = no ; then LIBS="$ff_save_libs -llapack $ff_blas_libs" AC_LINK_IFELSE( [AC_LANG_CALL(,dgeqr2_)], [ff_lapack_ok=yes ff_lapack_lib="-llapack"] ) fi LIBS="$ff_save_libs" fi fi AC_MSG_RESULT($ff_lapack_ok) if test "$ff_lapack_ok" != no ; then AC_SUBST(LAPACKLIBS,$ff_lapack_lib) fi if test "$ff_lapack_ok" = no; then AC_ARG_WITH(lapack, AC_HELP_STRING([--with-lapack=library],[Use a specific version of Lapack]), ff_lapack_ok=yes ff_lapack_lib="${withval}" LIBS="$ff_lapack_lib $LIBS") fi # Lapack configuration for Arpack ff_lapackdir='$$(LAPACKdir)' if test "$ff_lapack_ok" = yes then # no compilation of lapack in arpack ff_lapackdir= else ff_lapack_lib="-L${curdir}/download/lib -llapack" fi # Arpack itself ff_arpack_ok=no ff_save_libs="$LIBS" ff_arpack_libs= if test "$ff_blas_ok" = yes; then # User-specified location AC_ARG_WITH(arpack, [ --with-arpack=library Use a specific version of Arpack], ff_arpack_ok=yes ff_arpack_libs="${withval}") # Default locations if test "$ff_arpack_ok" = no; then AC_CHECK_LIB(arpack,dsaupd_, ff_arpack_libs="-larpack -llapack" ff_arpack_ok=yes,, -llapack) fi # Trying to "locate" Arpack if test "$ff_arpack_ok" = no -a "$enable_download" != yes ; then AC_MSG_CHECKING(for libarpack with locate) ff_lib_arpack=`locate libarpack|grep 'libarpack.*.a$'|head -1` LIBS="$ff_lib_arpack $LIBS" AC_LINK_IFELSE( [AC_LANG_CALL(,dsaupd_)], ff_arpack_ok=yes ff_arpack_libs="$ff_lib_arpack") AC_MSG_RESULT($ff_arpack_ok) fi if test "$ff_arpack_ok" = yes then AC_FF_ADDWHERELIB(arpack,$ff_arpack_libs,) echo arpack LD "'$ff_arpack_libs'" >>$ff_where_lib_conf fi # If all else fails, download! if test "$ff_arpack_ok" = no -a "$enable_download" = yes \ -a "$enable_fortran" != no then ff_arpack_download=yes AC_MSG_NOTICE(using downloaded Arpack) # ALH - 6/11/13 - this install goal is the standard goal for all downloaded packages in # [[file:download/common.mak::install]] AC_SUBST(DOWNLOAD_ARPACK,install) AC_SUBST(FF_LAPACKdir,$ff_lapackdir) AC_SUBST(ARPACKLIB,${curdir}/download/lib/libarpack.a) AC_SUBST(LAPACK_arpack_LIB,${curdir}/download/lib/liblapack.a) # Do not update $LIBS, but create an extra LIB variable, because this lib does not exist yet, and this # could make the following tests fail. # ALH - 30/9/13 - do not use the "-L ${curdir}/download/lib" directive because it would allow other # following -l directives (eg -lumfpack) to pick an old locally compiled library instead of the system # ones. ff_arpack_libs="${curdir}/download/lib/libarpack.a $ff_lapack_lib" ff_arpack_ok=yes fi fi if test "$ff_arpack_ok" != yes then AC_MSG_NOTICE([-- NO ARPACK -- enable_download : $enable_download , wget: $ff_wget ]) fi # Do not insert ARPACK libs in $LIBS yet, because they may not exist # yet, and this could make the following tests fail. LIBS="$ff_save_libs" if test "$ff_arpack_ok" = yes; then AC_SUBST(ARPACKLIBS,$ff_arpack_libs) EIGENOBJ='eigenvalue.$(OBJEXT)' AC_DEFINE(HAVE_LIBARPACK,1,Arpack is used for eigenvalue computation) # Determines whether to run the eigenvalue tests else # all eigen test fails AC_SUBST([SKIP_TESTS_EIGEN],[yes]) fi AC_SUBST([EIGENOBJ]) # ALH - 25/9/13 - <> always run the WHERE LD statement for lapack because some libraries in # examples++-load require it (eg [[file:examples++-load/Element_Mixte.cpp::lapack]]). Request from Fred. AC_FF_ADDWHERELIB(lapack,$ff_lapack_lib,) # Looking for UMFPACK # ------------------- ff_amd_ok=no ff_umfpack_ok=no ff_save_libs="$LIBS" AC_ARG_ENABLE(system_umfpack,AC_HELP_STRING([--disable-system-umfpack],[Disable the automatic detection of umfpack, colmod, amd, ....])) if test "$enable_system_umfpack" != no -a "$ff_blas_ok" = yes; then # User-specified location AC_ARG_WITH(amd, AC_HELP_STRING([--with-amd=library],[Use a specific version of AMD]), ff_amd_ok=yes ff_umfpack_libs="${withval}") AC_ARG_WITH(umfpack, AC_HELP_STRING([--with-umfpack=library],[Use a specific version of Umfpack]), ff_umfpack_ok=yes ff_umfpack_libs="${withval} $ff_umfpack_libs") # Trying default locations for the headers AC_CHECK_HEADERS(umfpack.h umfpack/umfpack.h ufsparse/umfpack.h suitesparse/umfpack.h, ff_umfpack_header=yes ff_umfpack_dir=`dirname $ac_header`) # Somes systems like FreeBSD hide umfpack.h in a directory called UMFPACK (all capitals). This breaks the # standard #define produced by autoconf in config.h.in. LIBS="$ff_blas_libs $LIBS" if test "$ff_umfpack_header" != yes; then AC_CHECK_HEADER(UMFPACK/umfpack.h, ff_umfpack_header=yes ff_umfpack_dir=UMFPACK AC_DEFINE(HAVE_BIG_UMFPACK_UMFPACK_H,1,If umfpack.h is located in UMFPACK subdir)) fi if test "$ff_amd_ok" = no; then AC_CHECK_LIB(amd,amd_info, ff_umfpack_libs="$ff_umfpack_libs -lamd" ff_amd_ok=yes) fi if test "$ff_umfpack_ok" = no -a "$ff_amd_ok" = yes; then # ALH - 30/9/13 - other libraries required by Umfpack AC_CHECK_LIB(cholmod,cholmod_add,ff_umfpack_libs="$ff_umfpack_libs -lcholmod") AC_CHECK_LIB(colamd,colamd_set_defaults,ff_umfpack_libs="$ff_umfpack_libs -lcolamd") AC_CHECK_LIB(umfpack,umf_i_malloc, ff_umfpack_libs="-lumfpack $ff_umfpack_libs" ff_umfpack_ok=yes,,$ff_umfpack_libs) fi if test "$ff_umfpack_header" != yes -o "$ff_umfpack_ok" != yes; then ff_umfpack_ok=no AC_MSG_WARN([Sorry, we could not find the UMFPACK lib or the UMFPACK headers]) fi if test "$ff_umfpack_ok" = yes -a "$ff_amd_ok" = yes; then AC_DEFINE(HAVE_LIBUMFPACK,1,Umfpack is used for sparse matrices computations) fi fi LIBS="$ff_save_libs" # If all else fails, download! if test "$ff_umfpack_ok" = no -a "$enable_download" = yes then AC_MSG_NOTICE(using downloaded UMFPACK) AC_SUBST(DOWNLOAD_UMFPACK,"umfpack") ff_umfpack_download=yes # Do not update $LIBS, but create an extra LIB variable, because this lib does not exist yet, and this could make # the following tests fail. ff_umfpack_libs="-L${curdir}/download/lib -lumfpack -lcholmod -lcolamd -lamd -lsuitesparseconfig" AC_DEFINE(HAVE_LIBUMFPACK,1,UMFPACK) if test "$ff_win32" = yes; then AC_SUBST(FF_UMFPACK_CONFIG,-DCBLAS) fi ff_umfpack_ok=yes fi # ALH - 17/9/13 - moved UMFPACK configuration settings in wherelib to _after_ configuring the download version because # [[file:download/umfpack/Makefile.am]] does not set the WHERE mechanism. Also removed -I/usr/include/$ff_umfpack_dir # from include options for FFCS because it breaks the MingW64 compilation process. if test "$ff_umfpack_ok" = yes then if test $enable_ffcs = no then AC_FF_ADDWHERELIB(amd,$ff_umfpack_libs,-I/usr/include/$ff_umfpack_dir) AC_FF_ADDWHERELIB(umfpack,$ff_umfpack_libs,-I/usr/include/$ff_umfpack_dir) else AC_FF_ADDWHERELIB(amd,$ff_umfpack_libs,) AC_FF_ADDWHERELIB(umfpack,$ff_umfpack_libs,) fi else AC_MSG_NOTICE([ -- NO UMFPACK (ff_wget = $ff_wget)]) fi AC_SUBST(UMFPACKLIBS,$ff_umfpack_libs) # If times() and sysconf() are not here, UMFPACK should know if test "$ff_umfpack_ok" = yes then AC_CHECK_FUNCS(times sysconf, ff_umfpack_posix_ok=yes, ff_umfpack_posix_ok=no) if test "$ff_umfpack_posix_ok" = no then AC_SUBST(FF_UMFPACK_CONFIG,"-DCBLAS -DNPOSIX") fi fi # Checking for some functions that may not appear everywhere # ---------------------------------------------------------- AC_CHECK_HEADERS(regex.h,ff_regex_h=1, ff_regex_h=0) AC_SUBST(FF_HAVE_REGEX_H,$ff_regex_h) AC_CHECK_HEADERS([unistd.h]) # asinh acosh atanh are not in Mingw yet gettimeofday ff_malloc_h="" AC_HEADER_TIME AC_CHECK_HEADERS(malloc.h,ff_malloc_h=1) AC_SUBST(FF_MALLOC_H,$ff_malloc_h) AC_CHECK_FUNCS(asinh acosh atanh getenv jn erfc tgamma gettimeofday mallinfo mstats) AC_CHECK_FUNCS(srandomdev) AC_CHECK_FUNCS(second_,ff_second="",ff_second=second.o) AC_SUBST(FF_SECOND,"$ff_second") # Enable static linking (no shared libraries) # ------------------------------------------- AC_CHECK_PROG(ff_libtool,libtool,yes,no) if test "$ff_mac" = "yes" -a "$ff_libtool" = yes ; then ff_AR="libtool" ff_ARFLAGS="-static -o" ff_RANLIB="echo" fi AC_ARG_ENABLE(static, [ --enable-static Build binaries with no shared library dependencies]) if test "$enable_static" = yes then AC_CHECK_PROG(ff_libtool,libtool,yes,no) if test "$ff_libtool" = yes then LDFLAGS="$LDFLAGS -all-static" AC_SUBST(STATICTOOL,libtool) else AC_MSG_ERROR(libtool not found) fi fi # for compiation of arpack use libtool to bluid universal library on MacOs. AC_SUBST(AR,$ff_AR) AC_SUBST(ARFLAGS,$ff_ARFLAGS) AC_SUBST(RANLIN,$ff_RANLIB) # Dynamic loading of compiled functions # ------------------------------------- # Not if we don't want shared libraries (non FH modif FH juin 2005) ff_dynload=no if test "$enable_static" != yes then # Availability of dlopen(). Use AC_COMPILE rather than # AC_CHECK_HEADERS because the latter has problems seeing it (in # Cygwin) when it does not compile (in Mingw). AC_MSG_CHECKING(for dlfcn.h) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include ]])], ff_dynload=yes, ff_dynload=no) AC_MSG_RESULT($ff_dynload) fi # FFCS - -lm missing for ffmedit link stage on Debian Testing AC_CHECK_LIB(m,sin) # Checks that we also have the corresponding library if test "$ff_dynload" = yes then AC_CHECK_LIB(dl,dlinfo) # Checks that everythings works ok AC_MSG_CHECKING(whether dlopen links ok) AC_LINK_IFELSE( [AC_LANG_SOURCE([[#include int main(int argc,char **argv){ dlopen("",RTLD_LAZY); return 0; }]])], ff_dynload=yes, ff_dynload=no) AC_MSG_RESULT($ff_dynload) fi # the -rdynamic don't exist on macos and sunOS if test "$ff_dynload" = yes then AC_DEFINE(HAVE_DLFCN_H,1,Dynamic loading - not mandatory) # Activate dynamic loading tests (see examples++-load/Makefile.am) AC_SUBST(LOAD_TESTS,../regtests.sh) AC_SUBST(LOAD_COMPILE,load_compile) # gcc on MacOS does not produce an error with "-rdynamic" but # still complains about it. if test "$ff_mac" = "no" -a "$ff_win32" = "no" -a "$ff_sunos" = "no" ; then CHECK_COMPILE_FLAG(C++,-rdynamic,LDFLAGS) dnl CHECK_COMPILE_FLAG(C,-rdynamic,CNOFLAGS) dnl CHECK_COMPILE_FLAG(C,-rdynamic,CFLAGS) fi CHECK_COMPILE_FLAG(C++,-fPIC,CXXFLAGS) CHECK_COMPILE_FLAG(C,-fPIC,CFLAGS) CHECK_COMPILE_FLAG(C,-fPIC,CNOFLAGS) if test "$enable_fortran" != no then CHECK_COMPILE_FLAG(Fortran,-fPIC,FFLAGS) CHECK_COMPILE_FLAG(Fortran,-fPIC,FNOFLAGS) CHECK_COMPILE_FLAG(Fortran,-fPIC,FCFLAGS) CHECK_COMPILE_FLAG(Fortran,-fPIC,FCNOFLAGS) dnl CHECK_COMPILE_FLAG(Fortran,-rdynamic,FNOFLAGS) dnl CHECK_COMPILE_FLAG(Fortran,-rdynamic,FFLAGS) fi fi AC_SUBST(DYLIB_SUFFIX,$ff_suffix_dylib) # Checking wether we can generate some documentation # -------------------------------------------------- AC_CHECK_PROG(ff_latex,latex,yes,no) AC_CHECK_PROG(ff_makeindex,makeindex,yes,no) AC_CHECK_PROG(ff_dvips,dvips,yes,no) # to translate the figure AC_CHECK_PROG(ff_pdf2ps,pdf2ps,yes,no) AC_CHECK_PROGS(EPSTOPDF,[epstopdf pstopdf],[false]) AC_CHECK_PROG(ff_convert,convert,yes,no) if test "$ff_latex" = yes -a "$ff_makeindex" = yes -a "$ff_dvips" = yes -a $ff_pdf2ps = yes -a $ff_convert = yes; then AC_SUBST(DOCPS,"freefem++doc.ps") AC_CHECK_PROG(ff_gzip,gzip,yes,no) if test "$ff_gzip" = yes; then AC_SUBST(DOCPSGZ,"freefem++doc.ps.gz") fi fi # PDF documentation building sometimes poses problems because of # pdfsync.sty. So we need to be able to disable it. enable_pdf=yes AC_ARG_ENABLE(pdf,[ --disable-pdf Disable PDF documentation building]) if test "$enable_pdf" != no then AC_CHECK_PROG(ff_pdflatex,pdflatex,yes,no) if test "$ff_pdflatex" = yes -a $EPSTOPDF != false -a $ff_convert = yes; then AC_SUBST(DOCPDF,"freefem++doc.pdf") fi fi # HISTORY logging through CVS, but only if we are in a CVS working area if test -d CVS then AC_CHECK_PROG(ff_history,cvs2cl,yes,no) if test "$ff_history" = yes then AC_SUBST(HISTORY,history) fi fi # Choosing compilation options for the standard version (in src/std) # ------------------------------------------------------------------ # The "standard" configured version can use win32 (mingw) if test "$ff_mingw" = yes then # FFCS does not use FreeFem++-std, and Pcrgraph.cpp does not compile under mingwin64 if test $enable_ffcs = no then ff_stdprog="FreeFem++-std${EXEEXT}" ff_std_graph_obj=Pcrgraph.$OBJEXT fi # ALH - FFCS - 30/11/8 - I need to get the output from FF for FFCS regression tests if test $enable_ffcs = yes then ff_std_ldflags="-mconsole -mwindows" else ff_std_ldflags=-mwindows fi ff_std_libs= fi AC_SUBST(STD_GRAPH_OBJ,$ff_std_graph_obj) AC_SUBST(STD_LDFLAGS,$ff_std_ldflags) AC_SUBST(STD_LIBS,$ff_std_libs) # Allow some downloaded tools not to be compiled # ---------------------------------------------- # ALH - this is required by FFCS that needs to deactivate some tools that do not work on all platforms. Some FF users # may also find interesting to specify a local version of a tool instead of downloading it. # m4 macro parameters: $1 = tool name, $2 = dynamic library name, $3 = download directory name if different from $1 m4_define([TOOL_PARAMETERS], [AC_ARG_WITH($1_include,AC_HELP_STRING([--with-$1-include=],[Include directives for $1 instead of automatic download])) AC_ARG_WITH($1_ldflags,AC_HELP_STRING([--with-$1-ldflags=],[Link-time directives for $1 instead of automatic download])) if test "$with_$1_include" != "" || test "$with_$1_ldflags" != "" then # some directives have been specified, use them instead of downloading AC_FF_ADDWHERELIB($1,$with_$1_ldflags,$with_$1_include) AC_SUBST([TOOL_COMPILE_$1],"") enable_$1_download=no fi ]) m4_define([TOOL_DISABLE], [AC_ARG_ENABLE($1,AC_HELP_STRING([--disable-$1],[Do not use $1])) if test "$enable_$1" = "no" then AC_SUBST([TOOL_COMPILE_$1],"") AC_SUBST([TOOL_DYLIB_$1],"") else AC_SUBST([TOOL_COMPILE_$1],ifelse($3,,$1,$3)) AC_SUBST([TOOL_DYLIB_$1],$2) enable_$1_download=yes fi # Also allow to disable the download of one tool if it is already locally installed TOOL_PARAMETERS($1,$2,$3) ]) ## try to see pakage is hon computer if the FH ZZZZ ## FH to find gsl ... AX_PATH_GSL(1.15, ff_with_gsl=yes, ff_with_gsl=no) if test "$ff_with_gsl" = "yes"; then AC_FF_ADDWHERELIB(gsl,$GSL_LIBS,$GSL_CFLAGS) fi ## m4_map([AC_FF_WHERELIB],[ [[mumps],[-ldmumps -lzmumps -lmumps_common -lpord],[dmumps_c.h],[]], [[mumps_ptscotch],[-lpord_ptscotch -lmumps_common_ptscotch -ldmumps_ptscotch -lzmumps_ptscotch -lpord_ptscotch],[dmumps_c.h]], [[mumps_scotch],[-lpord_scotch -lmumps_common_scotch -ldmumps_scotch -lzmumps_scotch -lpord_scotch],[dmumps_c.h]], [[hypre],[-lHYPRE]], [[fftw3],[-lfftw3],[/usr/include/fftw3.h],[]], [[superlu_dist],[-lsuperlu-dist],[/usr/include/superlu-dist/superlu_defs.h],[]], [[superlu],[-lsuperlu],[/usr/include/superlu/superlu_enum_consts.h],[]], [[Superlu4],[-lsuperlu4],[/usr/include/superlu4/superlu_enum_consts.h],[]], [[blacs],[ -lblacsCinit$ff_with_mpi -lblacsF77init$ff_with_mpi -lblacs$ff_with_mpi],[]], [[scalapack],[-lscalapack$ff_with_mpi],[]], [[scotch],[-lscotch -lscotcherr],[scotch.h]], [[ptscotch],[-lptscotch -lptscotcherr],[ptscotch.h]], [[metis],[-lscotch -lmetis],[/usr/include/metis/metis.h],[]], [[metis],[-lscotch -lmetis],[metis.h],[]], [[parmetis],[-lptscotch -lparmetis],[],[]], [[freeyams],[-lfreeyams],[freeyamslib.h],[]], [[mmg3d],[-lmmg3d],[libmmg3d.h],[]], [[mshmet],[-lmshmet],[],[]], dnl [[gsl],[-lgsl -lgslcblas -lm],[gsl/gsl_sf.h],[]], [[parms],[-lparms -litsol -llapack -lblas -lm],[],[]], [[tetgen],[-ltet],[tetgen.h],[]], ] ) ## before try TOOL_DISABLE(fflapack,fflapack.$DYLIB_SUFFIX) TOOL_DISABLE(hips,hips_FreeFem.$DYLIB_SUFFIX) TOOL_DISABLE(ipopt,ff-Ipopt.$DYLIB_SUFFIX) TOOL_DISABLE(lapack,lapack.$DYLIB_SUFFIX) TOOL_DISABLE(parmetis,metis.$DYLIB_SUFFIX) TOOL_DISABLE(mmg3d,mmg3d-v4.0.$DYLIB_SUFFIX) TOOL_DISABLE(mshmet,mshmet.$DYLIB_SUFFIX) TOOL_DISABLE(gmm,ilut.$DYLIB_SUFFIX) TOOL_DISABLE(mumps,"MUMPS_FreeFem.$DYLIB_SUFFIX MUMPS.$DYLIB_SUFFIX") TOOL_DISABLE(mumps_seq,"MUMPS_seq.$DYLIB_SUFFIX MUMPS.$DYLIB_SUFFIX",mumps-seq) TOOL_DISABLE(nlopt,ff-NLopt.$DYLIB_SUFFIX) dnl TOOL_DISABLE(parmetis) TOOL_DISABLE(parms,parms_FreeFem.$DYLIB_SUFFIX) TOOL_DISABLE(pastix,"interfacepastix.$DYLIB_SUFFIX complex_pastix_FreeFem.$DYLIB_SUFFIX real_pastix_FreeFem.$DYLIB_SUFFIX") TOOL_DISABLE(pipe,pipe.$DYLIB_SUFFIX) TOOL_DISABLE(scotch,scotch.$DYLIB_SUFFIX) TOOL_DISABLE(superlu,SuperLu.$DYLIB_SUFFIX) TOOL_DISABLE(superludist,"complex_SuperLU_DIST_FreeFem.$DYLIB_SUFFIX real_SuperLU_DIST_FreeFem.$DYLIB_SUFFIX dSuperLU_DIST.$DYLIB_SUFFIX") TOOL_DISABLE(umfpack,UMFPACK64.$DYLIB_SUFFIX) TOOL_DISABLE(yams,freeyams.$DYLIB_SUFFIX) TOOL_DISABLE(pipe,pipe.$DYLIB_SUFFIX) # FFCS - MUMPS_seq has a different Win32 compiler setup from FFCS, so we need to add some extra parameters if test "$OS" = Windows_NT then CFLAGS="$CFLAGS -DWITHOUT_PTHREAD -DAdd_" # we also need to satisfy ff-c++ that the pthread are not a blocking point if test -n "$ff_pthread" ; then AC_FF_ADDWHERELIB(pthread,"",) fi fi # ALH - pARMS needs "-fno-range-check" on Windows, but this options fails on MacOS 10.8. Add no-range-check for Windows # for hexadecimal parameter constants like: # # [[file:c:/cygwin/home/alh/ffcs/rel/mingw/mpif.h::PARAMETER MPI_SHORT_INT z 8c000003]] # # Such constants are rejected without [[file:download/parms/makefile-parms.in::NO_RANGE_CHECK]] if test "$OS" = Windows_NT then AC_SUBST(NO_RANGE_CHECK,-fno-range-check) fi # ALH - 4/9/13 - request from Helmut Jarausch - allow to change Scotch include path if test "$with_scotch_include" = "" then with_scotch_include=$ac_pwd/download/include/scotch fi AC_SUBST(SCOTCH_INCLUDE,$with_scotch_include) # Find out kernel and libc versions # --------------------------------- if test "$ff_win32" != yes -a "$ff_mac" != yes then AC_MSG_CHECKING(kernel version) ff_kernel_version=`cat /proc/version|perl -e '=~/(\d+\.\d+\.\d+)/;print $1;'` AC_MSG_RESULT($ff_kernel_version) AC_SUBST(KERNEL_VERSION,$ff_kernel_version) AC_MSG_CHECKING(libc version) ff_libc_version=`ldd /bin/sh | awk '/libc/{print $3}' | xargs readlink | sed -e 's/\.so$//'` AC_MSG_RESULT($ff_libc_version) AC_SUBST(LIBC_VERSION,$ff_libc_version) fi # def variable pour les makefiles # creating all makefiles # ---------------------- ff_bamgprog="bamg${EXEEXT} cvmsh2${EXEEXT}" AC_SUBST(CNOFLAGS,$CNOFLAGS) dnl for superludist CFLAGS without optim ... AC_SUBST(FNOFLAGS,$FNOFLAGS) dnl for blacs CFLAGS without optim ... # The final list of executable programs AC_SUBST(MEDITPROG,$ff_meditprog) AC_SUBST(FFGLUTPROG,$ff_ffglutprog) AC_SUBST(BAMGPROG,$ff_bamgprog) AC_SUBST(STDPROG,$ff_stdprog) ff_progs="FreeFem++-nw $ff_bamgprog $ff_mpiprog $ff_meditprog $ff_ffglutprog" AC_SUBST(TEST_FFPP,$ff_TEST_FFPP) AC_SUBST(TEST_FFPP_MPI,$ff_TEST_FFPP_MPI) AC_SUBST(TEST_FFPPMPI,"../src/mpi/ff-mpirun") ff_with_mpi=-openmpi; ff_blacs="-lblacsCinit$ff_with_mpi -lblacsF77init$ff_with_mpi -lblacs$ff_with_mpi" ff_scalapack=-lscalapack # change MKL interface ... test -n "$ff_mkl_blacs" && ff_blacs="$ff_mkl_blacs" test -n "$ff_mkl_scalapack" && ff_scalapack="$ff_mkl_scalapack" test -n "$ff_mkl_root" && ff_winc="$ff_mkl_root/include/mkl_blas.h" # FFCS - 27/10/11 - Some extra conditionals for things that do not work on certain systems (eg MPI libraries under # Windows) ## search of HDF5 .... AX_LIB_HDF5() if test "$with_hdf5" = "yes"; then AC_FF_ADDWHERELIB(hdf5,$HDF5_LDFLAGS $HDF5_LIBS,$HDF5_CPPFLAGS) LIBS="$LIBS $HDF5_LDFLAGS $HDF5_LIBS" else enable_iohdf5=no fi TOOL_DISABLE(iohdf5,iohdf5.$DYLIB_SUFFIX) AM_CONDITIONAL([FFCS_WINDOWS],[test "$OS" = Windows_NT]) # remove gsl if not find ... FH # correction FH .. 18/12/2013. # ALH - 7/1/14 - not able to compile gsl or pardiso with FFCS on Windows if test "$enable_ffcs" != yes then if test "$ff_where_lib_conf_gsl" == 1 -a "$enable_gsl"!="no" ; then enable_gsl=yes; fi; if test "$ff_where_lib_conf_mkl" == 1 -a "$enable_mkl"!=no ; then enable_pardiso=yes; fi; fi TOOL_DISABLE(gsl,"gsl.$DYLIB_SUFFIX") TOOL_DISABLE(NewSolver,"NewSolver.$DYLIB_SUFFIX") TOOL_DISABLE(pardiso,"PARDISO.$DYLIB_SUFFIX") # echo "debug cxxx11: $ff_cxx11 mpi: $ff_mpi petsc: $ff_petsc_ok " test "$ff_cxx11" != yes -o "$ff_mpi" != yes -o "$enable_download" != "yes" && enable_schwarz=no TOOL_DISABLE(schwarz,"schwarz.$DYLIB_SUFFIX removeDOF.$DYLIB_SUFFIX utility.$DYLIB_SUFFIX") # All makefiles AC_OUTPUT(Makefile download/Makefile download/blas/Makefile download/arpack/Makefile download/umfpack/Makefile download/fftw/Makefile src/Makefile src/bamglib/Makefile src/Graphics/Makefile src/femlib/Makefile src/Algo/Makefile src/lglib/Makefile src/fflib/Makefile src/nw/Makefile src/mpi/Makefile src/bamg/Makefile src/libMesh/Makefile src/medit/Makefile src/bin-win32/Makefile examples++/Makefile examples++-eigen/Makefile examples++-tutorial/Makefile examples++-mpi/Makefile examples++-load/Makefile examples++-chapt3/Makefile examples++-bug/Makefile examples++-other/Makefile examples++-3d/Makefile DOC/Makefile) AC_MSG_NOTICE([ freefem++ used download : $enable_download ]) AC_MSG_NOTICE([ -- Dynamic load facility: $ff_dynload ]) AC_MSG_NOTICE([ -- ARPACK (eigen value): $ff_arpack_ok ]) AC_MSG_NOTICE([ -- UMFPACK (sparse solver) $ff_umfpack_ok ]) AC_MSG_NOTICE([ -- BLAS $ff_blas_ok ]) AC_MSG_NOTICE([ -- with MPI $ff_mpi]) AC_MSG_NOTICE([ -- with PETSC $ff_petsc_ok ]); AC_MSG_NOTICE([ -- with schwarz (HPDDM) $enable_schwarz (need MPI & c++11 : $ff_cxx11 ) ]); AC_MSG_NOTICE([ progs: $ff_progs ]) if test "$ff_umfpack_download" = yes ;then AC_MSG_NOTICE([ use of download UMFPACK see download/umfpack/SuiteSparse/UMFPACK/README.txt for the License]) fi if test "$ff_arpack_download" = yes ; then AC_MSG_NOTICE([ use of download ARPACK see download/arpack/ARPACK/README no License ]) fi if test "$enable_download" = yes ;then AC_MSG_NOTICE([ use of download fftw see download/fftw/fftw-3.2/COPYRIGHT ]) AC_MSG_NOTICE([ use of download tetgen see download/tetgen/tetgen1.4.3/LICENSE ]) AC_MSG_NOTICE([ use of download freeyams see download/yams/freeyams.2011.02.22 (suface mesh adaptation) ]) AC_MSG_NOTICE([ use of download mmg3d (v4) see download/mmg3d/mmg3d4/LICENCE.txt ]) AC_MSG_NOTICE([ use of download metis]) # ALH - some tools may be activated but not downloaded if a local version is specified (see # [[TOOL_PARAMETERS]]) if test "$enable_superlu_download" = yes then AC_MSG_NOTICE([ use of download superlu]) fi if test -n "$MPICC" ; then AC_MSG_NOTICE([ try to download: blacs parmetis scalapack scotch superludist pastix hypre hips library]) fi if test "$ff_download_blas" = "generic" ; then AC_MSG_NOTICE([ use of download generic blas and cblas freefem may be slow ]) AC_MSG_NOTICE([ you can try to use the Kazushige Goto s BLAS at http://www.cs.utexas.edu/users/flame/goto/ ]) AC_MSG_NOTICE([ or at http://www.tacc.utexas.edu/~kgoto/ for the best BLAS .]) AC_MSG_NOTICE([ or try to download/compile the altas blas .]) fi # ALH - 30/10/13 - (request from FH) all downloads are now part of a separate script ([[file:download/getall]]) # which needs to be run before make for the user to specify whether he is ok with each of the package licences. AC_MSG_NOTICE([ Please run "download/getall" to download all necessary packages before running make]) fi # FFCS does not use glut, so remove this message because it could make the user think that something is broken if test $enable_ffcs = no then if test "$ff_glut_ok" != yes ; then AC_MSG_NOTICE([ *********************************************** ]) AC_MSG_NOTICE([ WARNING: you do not have the new grachics tools ]) AC_MSG_NOTICE([ because the configure do not find OpenGL, GLUT or pthread developer stuff ]) AC_MSG_NOTICE([ read the README to find missing package ]) AC_MSG_NOTICE([ F. Hecht ]) AC_MSG_NOTICE([ to install missing package under debian or ubuntu, try: sudo apt-get install freeglut3-dev ]) AC_MSG_NOTICE([ *********************************************** ]) fi fi # Local Variables: # mode:shell-script # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/COPYING000644 000767 000024 00000001751 11406142250 014636 0ustar00hechtstaff000000 000000 // // SUMMARY: FreeFem++ // RELEASE: 2 // USAGE : // AUTHOR: F. Hecht, O. Pironneau // ORG : Universit Pierre et Marie Curie, Paris, France // E-MAIL : Hecht@ann.jussieu.fr // // ORIG-DATE: November 2001 /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */freefem++-3.38-1/COPYRIGHT000644 000767 000024 00000045071 12167254041 015110 0ustar00hechtstaff000000 000000 This is The FreeFem++ software. Programs in it were maintained by Frederic hecht and by Olivier Pironneau and by Antoine Le Hyaric All its programs which may be redistributed under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Except files : Comming form COOOL sofware (all files in directory src/Algo, mailto:coool@coool.mines.edu), no license. and the file mt19937ar.cpp ( mailto:m-mat@math.sci.hiroshima-u.ac.jp ) with they own like license. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS freefem++-3.38-1/copysharedlibs.sh000755 000767 000024 00000000715 11406142255 017161 0ustar00hechtstaff000000 000000 #!/bin/sh # Find out which shared libs an executable needs and copy them # Antoine Le Hyaric - LJLL Paris 6 - lehyaric@ann.jussieu.fr - 22/11/04 # $Id$ # $1=executable to analyze if test ! -x $1 then echo $1 is not an executable exit 1 fi # $2= where to copy shared libs if test ! -d $2 then echo $2 is not a directory fi # List all shared libs libs=`ldd $1|awk '{print $3}'` if test "$libs" != "dynamic" -a "$libs" != "" then cp $libs $2 fi freefem++-3.38-1/crimson-freefem++.zip000644 000767 000024 00000004006 11406142255 017537 0ustar00hechtstaff000000 000000 PK L45crimon-freefem++/UT EEUxPK L45crimon-freefem++/link/UT EEUxPKJ45(0#crimon-freefem++/link/extension.edpUT {EEUxqspur ruus  pv r F rPK L45crimon-freefem++/spec/UT EEUxPKK45j`#crimon-freefem++/spec/freefempp.keyUT EEUxmRMo0GǪ,vnB*Юj&BZNm36iXgތ7~~e\n/*H&aG}'f`H`f4[,*fMё"[ol͂``4oјj~&M"YSAx{]7)MkfTu mdU {93GT5C@S( ہnXNb]+r߫v~5"xK:5hJ~6JnÐ5%?`D{f;:{(C\F8 TY%R+x7t j4b^?(Jzh<zAXgV`I8?ogOI"267YF$3W6wU- dP٪B LK.?L]^!l-%?>TO`;7а PK L45crimon-freefem++/tools/UT EEUxPK L45 Acrimon-freefem++/UTEUxPK L45 ADcrimon-freefem++/link/UTEUxPKJ45(0# crimon-freefem++/link/extension.edpUT{EUxPK L45 A crimon-freefem++/spec/UTEUxPKK45j`# Tcrimon-freefem++/spec/freefempp.keyUTEUxPKA45U#  crimon-freefem++/spec/freefempp.spcUTHEUxPK L45 ALcrimon-freefem++/tools/UTEUxPKZfreefem++-3.38-1/depcomp000755 000767 000024 00000033052 11406142255 015164 0ustar00hechtstaff000000 000000 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 freefem++-3.38-1/DOC/000755 000767 000024 00000000000 12544247071 014217 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/000755 000767 000024 00000000000 12544247066 015425 5ustar00hechtstaff000000 000000 freefem++-3.38-1/edp.nedit000644 000767 000024 00000004247 11406142255 015410 0ustar00hechtstaff000000 000000 nedit.highlightPatterns: edp:1:0{\n\ comment:"/\\*":"\\*/"::Comment::\n\ cplus comment:"//":"$"::Comment::\n\ string:"L?""":"""":"\\n":String::\n\ preprocessor line:"macro":"//"::Preprocessor::\n\ string escape chars:"\\\\(.|\\n)":::String1:string:\n\ preprocessor esc chars:"\\\\(.|\\n)":::Preprocessor1:preprocessor line:\n\ preprocessor comment:"/\\*":"\\*/"::Comment:preprocessor line:\n\ preproc cplus comment:"//":"$"::Comment:preprocessor line:\n\ preprocessor numeric constant:"<((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?>":::Numeric Const:preprocessor line:D\n\ numeric constant:"<((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?>":::Numeric Const::D\n\ storage keyword:"<(func|real|int|double|mesh|fespace|varf|matrix|problem|solve|ifstream|ofstream|bool)>":::Storage Type::D\n\ keyword:"<(Cmatrix|R3|border|break|complex|continue|element|else|end|fespace|for|if|ifstream|include|load|mesh|problem|real|return|solve|string|varf|vertex|while)>":::Keyword::D\n\ functionff:"<(BFGS|EigenValue|LinearCG|LinearGMRES|NLCG|Newtow|abs|acos|acosh|adaptmesh|arg|asin|asinh|assert|atan|atan2|atanh|average|buildmesh|buildmeshborder|checkmovemesh|clock|conj|convect|cos|cosh|dumptable|dx|dxx|dxy|dy|dyx|dyy|emptymesh|exec|exit|exp|imag|int1d|int2d|intalledges|interplotematrix|interpolate|jump|log|log10|max|mean|min|movemesh|norm|on|otherside|plot|polar|pow|readmesh|savemesh|set|sin|sinh|splitmesh|sqrt|square|tan|tanh|triangulate|trunc)>":::Identifier1::D\n\ constantff:"<(CG|CPUTime|Cholesky|Crout|GMRES|HaveUMFPACK|LU|N|NoUseOfWait|P|P0|P0edge|P1|P1b|P1dc|P1nc|P2|P2b|P2dc|P2h|P2b|RT0|RT0Ortho|RTmodif|UMFPACK|append|area|cin|cout|endl|false|hTriangle|inside|label|lenEdge|nTonEdge|nuEdge|nuTriangle|pi|qf1pE|qf1pElump|qf1pT|qf1pTlump|qf2pE|qf2pT|qf2pT4P1|qf3pE|qf5pT|qf7pT|qf9pT|region|true|verbosity|version|wait|x|y|z)>":::Identifier::D\n\ braces:"[{}]":::Keyword::D\n\ } nedit.languageModes: edp:.edp::::::".,/\\`'!|@#%^&*()-=+{}[]"":;<>?~" nedit.styles: Numeric Const:darkGreen:Plain\n\ Preprocessor:RoyalBlue4:Plain\n\ Preprocessor1:blue:Plain\n\ freefem++-3.38-1/examples++/000755 000767 000024 00000000000 12544247070 015555 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-3d/000755 000767 000024 00000000000 12544247071 016062 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-bug/000755 000767 000024 00000000000 12544247071 016331 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-chapt3/000755 000767 000024 00000000000 12544247071 016736 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-eigen/000755 000767 000024 00000000000 12544247070 016642 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-load/000755 000767 000024 00000000000 12544247070 016472 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-mpi/000755 000767 000024 00000000000 12544247071 016341 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-other/000755 000767 000024 00000000000 12544247071 016675 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples++-tutorial/000755 000767 000024 00000000000 12544247070 017416 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples-bamg/000755 000767 000024 00000000000 12544247065 016337 5ustar00hechtstaff000000 000000 freefem++-3.38-1/FreeFem++-CoCoa000755 000767 000024 00000002603 12243646130 016155 0ustar00hechtstaff000000 000000 #!/bin/sh # # EXTENSIONS : ".edp" # Accepted file extentions # OSTYPES : "****" # Accepted file types # ROLE : None # Role (Editor, Viewer, None) # SERVICEMENU : FreeFem++ # Name of Service menu item # dir=`dirname $0`; ff="/usr/local/bin/FreeFem++" fa="-glut ffglut " q="'" end="exit;" begin="cd $PWD;" # begin the cmd generation ---------- cmd="" # ----------------- for i in "$@"; do d=`dirname "$i"`; f=`basename "$i"`; if [ -f "$i" ] ; then np=`awk -v npo=$np '$1=="//" && $2=="NBPROC" { if( vv == ""){ print $3;}; vv=1}' "$i"` npa=`awk -v npo=$np '$1=="//" && $2=="PARAM" { if( vv == ""){ for(i=3;i<=NF;++i)print $i;}; vv=1}' "$i"` # echo --- $np -- $npa -------- if [ "0$np" -gt 0 ] ; then test -x /usr/local/bin/ff-mpirun && ff="/usr/local/bin/ff-mpirun -np $np" fi if [ -n "$npa" ] ; then fa="$fa $npa"; fi cmd="$cmd cd $q$d$q; $ff $q$f$q $fa ;" fi done # ------------------ if [ -z "$cmd" ]; then cmd="$ff;" fi # ------------------ cmd="$cmd" # ---- end of cmd generation ---- echo 'do script "'$cmd'"' # # # send the command $cmd to the apple terminal via osascript # # (echo $0;echo $*;echo "--$TERM--";printenv;set) >/tmp/tutu if [ -z "$TERM_PROGRAM" ] ; then echo ' tell application "Terminal" activate try do script "'$begin$cmd$end'" end try end tell ' | osascript else set -e eval $cmd fi; freefem++-3.38-1/FreeFem++.mcp000755 000767 000024 00000474631 11406142255 015766 0ustar00hechtstaff000000 000000 cool(ikCodeWarrior Project$Gm) M t   4W} 0Z}8` !"#$8%J&t'()*+7,c-./01203G4b5|6789:; <"=;>T?i@}ABCDEF G 1H HI aJ wK L M N O P Q R 5S KT fU V W X Y Z [ !\ =] W^ q_ ` a b c d e f 4g Jh di }j k l m n o p *q Ar [s wt u v w x yz){H|]}y~5Ts/Xv?^|9Tw 'Ef*Pl3Qp-So1Sq4Rn /  0%&' !"#()*+,-.29;6<=:375>?@ABCDEFGH\]XIYJKLZ[MNO8P14QRSTUVW_fchig`dbjkmnopqrstuvlwxyz{|}~e^a$ '`&*yrPp] <Ka(:bc+Ode0oqNm1~2})349vwu_L5^,Q-Y;l.zM {ft/6=>?@ABCDE7X 8ghij[\F !"#$WnGsHI %STUVkJZ|xRE6  !"#$%&'()*+,-./012345789:;<=>@?ABCDFGH_j    5(*+,-./01234678:;<=>BCDEFGHIJKLMNOPQTUVWXZ[\]^`abcdeghij p _h: main :`H_iF_gJavaClasses.jarZIP MWZP /work/freefem++/src  !"#$ %o&CC@CCXAAhdskn '(CPCJavaClasses.jar0ZIP MWZP@`C ( @  \] !"#$ %o&KLMNOPQTUVWXZ[\]^`abcdegh   MacOS PPC LinkerFreeFem-g:config_freefem_v3_g.hppconfig_freefem_v3_g.hpp__startstartstart:w'o`xbQ)*+,-./012345789:;<=>@?ABCDMSIEhttp://java.sun.com/products/jdk/1.1/docs/api/    5(*+,-./01234678:;<=>BCDEFGHIJKLMNOPQRTUVWYZ[\]_`abcdfg#1:K`jl  *8EUet !"#$%& '"(-)9*D+R,_-g.p/z0123456789: ;<"=+>5?B@OA]BhCuDEFGHIJKLMNOP)Q5R=SLTTU_VkWwXYZ[\]^_`a bc d'e3f<gKh]iejpkzlmnopqrstuv w2xFyMz\{f|}~+:Mbs  6I^r  # > R ` q }   ' < S q  4 H ] q E6  !"#$%&'()*+,-./012345789:;<=>@?ABCDFG (cFILEdFILEeFILEFILE[FILEaFILE7FILE FILE]FILE6FILEQFILE^FILEDFILEgFILE FILE8FILEBFILEFILE FILE\FILE4FILEXFILEbFILE>FILECPPC Projec.8 8`|h`(  ,  X0,(0@`8pp@ H 8  @@ 8 pp  ,@ JavaClasses.jarZIP MWZP    5(*+,-./01234678:;<=>BCDEFGHIJKLMNOPQRTUVWYZ[\]_`abcdfghino connections avaiableeH:O,/K`$o\,oX Gv6YO//l/N(/Ho/NAPX&HHP/ B'p@rƒ/N;II/Ho/Npg 0Rgpƀpg/*g*J*fpƀ g/*pg0/jgpƀpgUO/ HjHxNDfpƀ@ :MSL:@:MacOS Support:startLib Import PPCMPLFLib Import PPCMWCDTEXT.ccMW C/C++ PPCC/C++TEXT.cpMW C/C++ PPCC/C++TEXT.expTEXT.pchMW C/C++ PPCC/C++TEXT.pch++MW C/C++ PPCC/C+MacHeaders.cMacOS_Carbon_C++_Macros.hTEconfig_freefem_v3.hppconfig_freefem_v3.hpp@  a.out????APPLX????r( @ __start|@}@~    (*+,-./0123456P78:;<=>BCDEFGHIJKLMNOPQTUVs@WXZ@[\]^`abcdeghq@ ijP'CODE' 'DATA' 'PICT'CC@CCXAAhdskn '(CPCJavaClasses.jar0ZIP MWZP@`C __start 1starta.out????MBND@ ROOT GRUPAlgo FILEEFILEFFILEGFILEHFILEIFILEPFILEJFILEKFILELFILEMFILENFILEOFILEVFILEhGRUPbamg FILE*FILE+FILE,FILE-FILE.FILE/FILE0FILE1FILE2FILE3GRUP eigenFILETFILEZGRUPfemFILE(FILEFILEUFILE5FILEFILEFILEFILEFILEFILEWFILE:FILE;FILEFILEC-./0123456P78:;<=>BCDEFGHIJKLMNOPQRTUsVWY@Z[\]_`abcdfgq@ Carbon Std C++ Console:Remote DebugCarbon Std C++ Console:Auto-targetCarbon Std C++ Console:Packager PanelCarbon Std C++ Console:Source TreesCarbon Std C++ Console:Access PathsCarbon Std C++ Console:Debugger RuntimeCarbon Std C++ Console:Target SettingsCarbon Std C++ Console:File MappingsCarbon Std C++ Console:Build ExtrasCarbon Std C++ Console:Debugger TargetCarbon Std C++ Console:Custom KeywordsCarbon Std C++ Console:68K CodeGenCarbon Std C++ Console:68K DisassemblerCarbon Std C++ Console:68K Global OptimizerCarbon Std C++ Console:68K LinkerCarbon Std C++ Console:68K ProjectCarbon Std C++ Console:C/C++ CompilerCarbon Std C++ Console:C/C++ WarningsCarbon Std C++ Console:CFM68KCarbon Std C++ Console:FTP PanelCarbon Std C++ Console:Java Command LineCarbon Std C++ Console:Java LanguageCarbon Std C++ Console:Java MRJAppBuilderCarbon Std C++ Console:Java OutputCarbon Std C++ Console:Java ProjectCarbon Std C++ Console:JavaDoc ProjectCarbon Std C++ Console:MacOS Merge PanelCarbon Std C++ Console:Output FlagsCarbon Std C++ Console:PPC CodeGenCarbon Std C++ Console:PPC DisassemblerCarbon Std C++ Console:PPC Global OptimizerCarbon Std C++ Console:PPC LinkerCarbon Std C++ Console:PPC PEFCarbon Std C++ Console:PPC ProjectCarbon Std C++ Console:PPCAsm PanelCarbon Std C++ Console:Rez CompilerProject File ListCarbon Std C++ Console:PPC CodeGen Mach-OCarbon Std C++ Console:PPC Mach-O LinkerCarbon Std C++ Console:PPC Mach-O TargetCarbon Std C++ Console:WinRC CompilerCarbon Std C++ Console:x86 CodeGenCarbon Std C++ Console:x86 DisassemblerCarbon Std C++ Console:x86 Exceptions PanelCarbon Std C++ Console:x86 Global OptimizerCarbon Std C++ Console:x86 LinkerCarbon Std C++ Console:x86 ProjectCarbon Std C++ Console:Bison PanelCarbon Std C++ Console:Flex PanelFreeFem++:Source TreesFreeFem++:Access PathsFreeFem++:Debugger RuntimeFreeFem++:Target SettingsFreeFem++:File MappingsFreeFem++:Build ExtrasFreeFem++:Debugger TargetFreeFem++:Remote DebugFreeFem++:Auto-targetFreeFem++:Custom KeywordsFreeFem++:Bison PanelFreeFem++:C/C++ CompilerFreeFem++:C/C++ WarningsFreeFem++:Flex PanelFreeFem++:FTP PanelFreeFem++:Java Command LineFreeFem++:Java LanguageFreeFem++:Java MRJAppBuilderFreeFem++:Java OutputFreeFem++:Java ProjectFreeFem++:JavaDoc ProjectFreeFem++:MacOS Merge PanelFreeFem++:Output FlagsFreeFem++:Packager PanelFreeFem++:PPC CodeGenFreeFem++:PPC DisassemblerFreeFem++:PPC Global OptimizerFreeFem++:PPC LinkerFreeFem++:PPC PEFFreeFem++:PPC ProjectFreeFem++:PPCAsm PanelFreeFem++:Rez CompilerFreeFem++:WinRC CompilerFreeFem++:x86 CodeGenFreeFem++:x86 DisassemblerFreeFem++:x86 Exceptions PanelFreeFem++:x86 Global OptimizerFreeFem++:x86 LinkerFreeFem++:x86 ProjectFreeFem++:PJavaDebuggingFreeFem++:PPC CodeGen Mach-OFreeFem++:PPC Mach-O LinkerFreeFem++:PPC Mach-O TargetFreeFem++:Pascal CompilerFreeFem++:Pascal WarningsFreeFem-g:Source TreesFreeFem-g:Access PathsFreeFem-g:Debugger RuntimeFreeFem-g:Target SettingsFreeFem-g:File MappingsFreeFem-g:Build ExtrasFreeFem-g:Debugger TargetFreeFem-g:Remote DebugFreeFem-g:Auto-targetFreeFem-g:Custom KeywordsFreeFem-g:C/C++ CompilerFreeFem-g:C/C++ WarningsFreeFem-g:FTP PanelFreeFem-g:Java Command LineFreeFem-g:PJavaDebuggingFreeFem-g:Java LanguageFreeFem-g:Java MRJAppBuilderFreeFem-g:Java OutputFreeFem-g:Java ProjectFreeFem-g:JavaDoc ProjectFreeFem-g:MacOS Merge PanelFreeFem-g:Output FlagsFreeFem-g:Packager PanelFreeFem-g:Pascal CompilerFreeFem-g:Pascal WarningsFreeFem-g:PPC CodeGenFreeFem-g:PPC CodeGen Mach-OFreeFem-g:PPC DisassemblerFreeFem-g:PPC Global OptimizerFreeFem-g:PPC LinkerFreeFem-g:PPC Mach-O LinkerFreeFem-g:PPC Mach-O TargetFreeFem-g:PPC PEFFreeFem-g:PPC ProjectFreeFem-g:PPCAsm PanelFreeFem-g:Rez CompilerFreeFem-g:WinRC CompilerFreeFem-g:x86 CodeGenFreeFem-g:x86 DisassemblerFreeFem-g:x86 Exceptions PanelFreeFem-g:x86 Global OptimizerFreeFem-g:x86 LinkerFreeFem-g:x86 ProjectFreeFem++:Java Manifest-JAD Setting InfoFreeFem++:PPC Mac OS X LinkerFreeFem++:PPC Mac OS X ProjectFreeFem++:Property ListFreeFem++:x86 COFFFreeFem-g:Java Manifest-JAD Setting InfoFreeFem-g:PPC Mac OS X LinkerFreeFem-g:PPC Mac OS X ProjectFreeFem-g:Property ListFreeFem-g:x86 COFFFreeFem++.Carbon:Source TreesFreeFem++.Carbon:Access PathsFreeFem++.Carbon:Debugger RuntimeFreeFem++.Carbon:Target SettingsFreeFem++.Carbon:File MappingsFreeFem++.Carbon:Build ExtrasFreeFem++.Carbon:Debugger TargetFreeFem++.Carbon:Remote DebugFreeFem++.Carbon:Auto-targetFreeFem++.Carbon:Custom KeywordsFreeFem++.Carbon:C/C++ CompilerFreeFem++.Carbon:C/C++ WarningsFreeFem++.Carbon:FTP PanelFreeFem++.Carbon:Java Command LineFreeFem++.Carbon:PJavaDebuggingFreeFem++.Carbon:Java LanguageFreeFem++.Carbon:Java Manifest-JAD Setting InfoFreeFem++.Carbon:Java MRJAppBuilderFreeFem++.Carbon:Java OutputFreeFem++.Carbon:Java ProjectFreeFem++.Carbon:JavaDoc ProjectFreeFem++.Carbon:MacOS Merge PanelFreeFem++.Carbon:Output FlagsFreeFem++.Carbon:Packager PanelFreeFem++.Carbon:PPC CodeGenFreeFem++.Carbon:PPC CodeGen Mach-OFreeFem++.Carbon:PPC DisassemblerFreeFem++.Carbon:PPC Global OptimizerFreeFem++.Carbon:PPC LinkerFreeFem++.Carbon:PPC Mac OS X LinkerFreeFem++.Carbon:PPC Mac OS X ProjectFreeFem++.Carbon:PPC Mach-O LinkerFreeFem++.Carbon:PPC Mach-O TargetFreeFem++.Carbon:PPC PEFFreeFem++.Carbon:PPC ProjectFreeFem++.Carbon:PPCAsm PanelFreeFem++.Carbon:Property ListFreeFem++.Carbon:Rez CompilerFreeFem++.Carbon:WinRC CompilerFreeFem++.Carbon:x86 CodeGenFreeFem++.Carbon:x86 COFFFreeFem++.Carbon:x86 DisassemblerFreeFem++.Carbon:x86 Exceptions PanelFreeFem++.Carbon:x86 Global OptimizerFreeFem++.Carbon:x86 LinkerFreeFem++.Carbon:x86 ProjectFreeFem++:GNU Code GenerationFreeFem++:GNU WarningsFreeFem++:GNU OptimizationsFreeFem++:GNU Pascal LanguageFreeFem++:GNU Pascal MacrosFreeFem++:GNU Pascal MoreFreeFem++:GNU Pascal Read & WriteFreeFem++:GNU Pascal WarningsFreeFem++:GNU PowerPC ProcessorFreeFem++:LD Mach-O ExtrasFreeFem++:LD Mach-O OptionsFreeFem++:LD Mach-O TargetFreeFem-g:GNU Code GenerationFreeFem-g:GNU WarningsFreeFem-g:GNU OptimizationsFreeFem-g:GNU Pascal LanguageFreeFem-g:GNU Pascal MacrosFreeFem-g:GNU Pascal MoreFreeFem-g:GNU Pascal Read & WriteFreeFem-g:GNU Pascal WarningsFreeFem-g:GNU PowerPC ProcessorFreeFem-g:LD Mach-O ExtrasFreeFem-g:LD Mach-O OptionsFreeFem-g:LD Mach-O Target@ :srcbamg../LinearSolver/UMFPACKv4.1/UMFPACK/Include../LinearSolver/UMFPACKv4.1../LinearSolver/UMFPACKv4.1/AMD/Include../../ARPACK/arpack-f2c@ :MSL:@:MacOS Support:@arpack/arpack++/include@/System/Library/Frameworks/vecLib.framework/Versions/A/Headers@  MacOS PPC Linker"APPL`Appl`MMLBLib Import PPCMPLFLib Import PPCMWCD`RSRC`TEXT.arrTEXT.bhBalloon HelpTEXT.cMW C/C++ PPCC/C++TEXT.c++MW C/C++ PPCC/C++TEXT.ccMW C/C++ PPCC/C++TEXT.cpMW C/C++ PPCC/C++TEXT.cppLݱPc4 MW C/C++ PPCC/C++%. p$Sp(TEXT.expTEXT.pchMW C/C++ PPCC/C++TEXT.pch++MW C/C++ PPCC/C++TEXT.rRezRezTEXT.sPPCAsmXCOFXCOFF Import PPCdocu`rsrc`shlbPEF Import PPCstubPEF Import PPC.c++L)\n@ MW C/C++ PPCC/C++t p$O p(.cppL)\n@ MW C/C++ PPCC/C++t p$O p(.cppMW C/C++ PPC.cppMW C/C++ PPC.docP.hppMW C/C++ PPC.hppMW C/C++ PPC.oXCOFF Import PPC.ppob`.rsrc`.yL)\+xE` $O @p$O:`ӧh p$O p(NoneMMPr@Java Linker RSRCTEXT.htmlJavaTEXT.javaMW JavaJavaTEXT.mfJavarsrc.auJAR Importer@.classMW Java.gifJAR Importer@.jarMW Java.zipMW JavaMacOS 68K LinkerAPPL`Appl`MMLBLib Import 68KMPLFLib Import 68KMWCD`OBJ MPW Import 68KPLob`RSRC`TEXT.cMW C/C++ 68KTEXT.c++MW C/C++ 68KTEXT.ccMW C/C++ 68KTEXT.cpMW C/C++ 68KTEXT.cppMW C/C++ 68KTEXT.expTEXT.hMW C/C++ 68KTEXT.pchMW C/C++ 68KTEXT.pch++MW C/C++ 68KTEXT.rRezRezTEXT.segdocu`rsrc`shlbPEF Import 68KstubPEF Import 68K.docP.oMPW Import 68K.ppob`.rsrc`MacOS MergeAPPL`Appl`RSRC`TEXT.rRezRezappe`rsrc`shlbMach-O PPC LinkerAPPL`Appl`MLIBLib Import Mach-OMMLBLib Import Mach-OMPLFLib Import Mach-OMWCD`RSRC`TEXT.cMW C/C++ MachPPCC/C++TEXT.c++MW C/C++ MachPPCC/C++TEXT.ccMW C/C++ MachPPCC/C++TEXT.cpMW C/C++ MachPPCC/C++TEXT.cppMW C/C++ MachPPCC/C++TEXT.expTEXT.hMW C/C++ MachPPCC/C++TEXT.pchMW C/C++ MachPPCC/C++TEXT.pch++MW C/C++ MachPPCC/C++TEXT.rRezRezdocu`rsrc`.docPWin32 x86 LinkerTEXT.cMW C/C++ x86C/C++TEXT.c++MW C/C++ x86C/C++TEXT.ccMW C/C++ x86C/C++TEXT.cpMW C/C++ x86C/C++TEXT.cppMW C/C++ x86C/C++TEXT.defTEXT.hMW C/C++ x86C/C++TEXT.h++MW C/C++ x86C/C++TEXT.hppMW C/C++ x86C/C++TEXT.ordTEXT.pchMW C/C++ x86C/C++TEXT.pch++MW C/C++ x86C/C++TEXT.rcMW WinRCiLIBLib Import x86iOBJObj Import x86.aLib Import x86.docP.libLib Import x86.oObj Import x86.objObj Import x86.resWinRes ImportMacOS X PPC Linker0APPL`Appl`MDYLMachO ImporterC/C++MLIBMachO ImporterC/C++MMLBMachO ImporterC/C++MPLFMachO ImporterC/C++MWCD`RSRC`TEXT.arrTEXT.axpTEXT.cMW C/C++ PPC Mac OS XC/C++TEXT.c++MW C/C++ PPC Mac OS XC/C++TEXT.ccMW C/C++ PPC Mac OS XC/C++TEXT.cpMW C/C++ PPC Mac OS XC/C++TEXT.cppMW C/C++ PPC Mac OS XC/C++TEXT.expTEXT.hMW C/C++ PPC Mac OS XC/C++TEXT.h++MW C/C++ PPC Mac OS XC/C++TEXT.hppMW C/C++ PPC Mac OS XC/C++TEXT.lcfTEXT.mMW C/C++ PPC Mac OS XC/C++TEXT.mmMW C/C++ PPC Mac OS XC/C++TEXT.pchMW C/C++ PPC Mac OS XC/C++TEXT.pch++MW C/C++ PPC Mac OS XC/C++TEXT.pchmMW C/C++ PPC Mac OS XC/C++TEXT.pchmmMW C/C++ PPC Mac OS XC/C++TEXT.plcProperty List CompilerProperty ListTEXT.plocProperty List CompilerProperty ListTEXT.rRezRezTEXT.wkedocu`rsrc`.aMachO ImporterC/C++.docP.dylibMachO ImporterC/C++.gifCopy To PackageP.icnsCopy To PackageP.jpgCopy To PackageP.libMachO ImporterC/C++.nibCopy To PackageP.plPerl ToolPerl.plistCopy To Package.ppob`.pshShell Tool.rsrc`.shShell Tool.stringsCopy To Package.tiffCopy To PackagePLD Mach-O Linker*MDYL.dylibLD Mach-O ImporterDisassemblyMLIB.aLD Mach-O ImporterDisassemblyMLIB.oLD Mach-O ImporterDisassemblyMPLF.aLD Mach-O ImporterDisassemblyMPLF.oLD Mach-O ImporterDisassemblyRSRCNone`TEXT.cGNU Pascal Mach-O CompilerC/C++TEXT.dprGNU Pascal Mach-O CompilerPascalTEXT.dumpNoneTEXT.hGNU Pascal Mach-O CompilerC/C++TEXT.incGNU Pascal Mach-O CompilerPascalTEXT.pGNU Pascal Mach-O CompilerPascalTEXT.pasGNU Pascal Mach-O CompilerPascalTEXT.ppGNU Pascal Mach-O CompilerPascalTEXT.symtabNonersrcNone`.aLD Mach-O ImporterDisassembly.cGNU Pascal Mach-O CompilerC/C++.dprGNU Pascal Mach-O CompilerPascal.dylibLD Mach-O ImporterDisassembly.hGNU Pascal Mach-O CompilerC/C++.htmNone`.htmlNone`.icnsNone`.incGNU Pascal Mach-O CompilerPascal.jpegNone`.jpgNone`.nibNone`.oLD Mach-O ImporterDisassembly.pGNU Pascal Mach-O CompilerPascal.paletteNone`.pasGNU Pascal Mach-O CompilerPascal.pictNone`.plPerl ToolPerl.plistXML`.pngNone`.ppGNU Pascal Mach-O CompilerPascal.pshShell Tool.rsrcNone`.rtfNone`.shShell Tool.stringsNone`MRJApplicationWARZmacosxmacosx Merge Out????APPLa.rsrc????APPLa.rsrc::DLGXckidProjWSPC????APPLqqq+ e!L#CshPf0 AddPinRaPoiMIte tRes' MenuI tConk Cont oseCillCShowHideMove$GetCGetCRjzeColiteGetCtCTitlVainCt%Ctl Elue gl SeTestragTrac Dra!"nded5#istT$r%&'()  **+B,d$`-}./shP001 Add2PinR3aPoi64MIteX5tRest6Menu7tCon8Cont9oseC:illC;Show#GetC}?etCR@zeCoABGetCCtCTiDtlVa8EinCtTFCtl qGlue Hl SeITestJDragKTrac L Dra "M ;N ^O P Q R S T U 1V OW mXKeys Y ZImpo [PW I \KBa ]lpM "^a.exe????MEXE@a.rsrc:./a.exea.rsrc FreeFem++-g(Carbon)????APPL@X:????FreeFem++-g(Carbon)@ noname.exeMain-ClassAuto-GeneratedstrictFileNamesMWJava_Language_strictFileHierarchyNoNativeHeadersJNINativeHeadersSunVMNativeHeadersMWJava_Language_emitHeadersMWJava_Language_packageFilterMWJava_Language_genCommentsMWJava_Language_genHeadersMWJava_Language_headerTypeMWJava_Language_1_1_CompatibleMWJava_Language_enableAssertsMWJava_Language_targetVM1.11.21.31.4Java LanguageBXXXXXXXXXXQQQQQQQQQQQ Executable????APPL@Executable.rsrc:./A FreeFem++-gQQQQQQQQQQQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqqqqqqqqqqqInfo.plist  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijkqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNO:RSTUVWXYZ{|}~C\TCCCC `C@PBXXXXXXXXXXQQQplstQQQQQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqqqqqqqqqqq @ :srcbamgarpack/arpack++/include arpack/arpack-f2c ../LinearSolver/UMFPACKv4.1@../../ARPACK/arpack-f2c@ :MSL:@:MacOS Support:@arpack/arpack++/include   MacOS PPC LinkerFreeFem++: MacOS PPC Linker!APPL`Appl`MMLBLib Import PPCMPLFLib Import PPCMWCD`RSRC`TEXT.arrTEXT.bhBalloon HelpTEXT.cMW C/C++ PPCC/C++TEXT.c++MW C/C++ PPCC/C++TEXT.ccMW C/C++ PPCC/C++TEXT.cpMW C/C++ PPCC/C++TEXT.expTEXT.pchMW C/C++ PPCC/C++TEXT.pch++MW C/C++ PPCC/C++TEXT.rRezRezTEXT.sPPCAsmXCOFXCOFF Import PPCdocu`rsrc`shlbPEF Import PPCstubPEF Import PPC.c++L)\n@ MW C/C++ PPCC/C++t p$O p(.cppL)\n@ MW C/C++ PPCC/C++t p$O p(.cppMW C/C++ PPC.cppMW C/C++ PPC.docP.hppMW C/C++ PPC.hppMW C/C++ PPC.oXCOFF Import PPC.ppob`.rsrc`.yL)\+xE` $O @p$O:`ӧh p$O p(NoneMMPr@Java Linker RSRCTEXT.htmlJavaTEXT.javaMW JavaJavaTEXT.mfJavarsrc.auJAR Importer@.classMW Java.gifJAR Importer@.jarMW Java.zipMW JavaMacOS 68K LinkerAPPL`Appl`MMLBLib Import 68KMPLFLib Import 68KMWCD`OBJ MPW Import 68KPLob`RSRC`TEXT.cMW C/C++ 68KTEXT.c++MW C/C++ 68KTEXT.ccMW C/C++ 68KTEXT.cpMW C/C++ 68KTEXT.cppMW C/C++ 68KTEXT.expTEXT.hMW C/C++ 68KTEXT.pchMW C/C++ 68KTEXT.pch++MW C/C++ 68KTEXT.rRezRezTEXT.segdocu`rsrc`shlbPEF Import 68KstubPEF Import 68K.docP.oMPW Import 68K.ppob`.rsrc`MacOS MergeAPPL`Appl`RSRC`TEXT.rRezRezappe`rsrc`shlbMach-O PPC LinkerAPPL`Appl`MLIBLib Import Mach-OMMLBLib Import Mach-OMPLFLib Import Mach-OMWCD`RSRC`TEXT.cMW C/C++ MachPPCC/C++TEXT.c++MW C/C++ MachPPCC/C++TEXT.ccMW C/C++ MachPPCC/C++TEXT.cpMW C/C++ MachPPCC/C++TEXT.cppMW C/C++ MachPPCC/C++TEXT.expTEXT.hMW C/C++ MachPPCC/C++TEXT.pchMW C/C++ MachPPCC/C++TEXT.pch++MW C/C++ MachPPCC/C++TEXT.rRezRezdocu`rsrc`.docPWin32 x86 LinkerTEXT.cMW C/C++ x86C/C++TEXT.c++MW C/C++ x86C/C++TEXT.ccMW C/C++ x86C/C++TEXT.cpMW C/C++ x86C/C++TEXT.cppMW C/C++ x86C/C++TEXT.defTEXT.hMW C/C++ x86C/C++TEXT.h++MW C/C++ x86C/C++TEXT.hppMW C/C++ x86C/C++TEXT.ordTEXT.pchMW C/C++ x86C/C++TEXT.pch++MW C/C++ x86C/C++TEXT.rcMW WinRCiLIBLib Import x86iOBJObj Import x86.aLib Import x86.docP.libLib Import x86.oObj Import x86.objObj Import x86.resWinRes ImportMacOS X PPC Linker0APPL`Appl`MDYLMachO ImporterC/C++MLIBMachO ImporterC/C++MMLBMachO ImporterC/C++MPLFMachO ImporterC/C++MWCD`RSRC`TEXT.arrTEXT.axpTEXT.cMW C/C++ PPC Mac OS XC/C++TEXT.c++MW C/C++ PPC Mac OS XC/C++TEXT.ccMW C/C++ PPC Mac OS XC/C++TEXT.cpMW C/C++ PPC Mac OS XC/C++TEXT.cppMW C/C++ PPC Mac OS XC/C++TEXT.expTEXT.hMW C/C++ PPC Mac OS XC/C++TEXT.h++MW C/C++ PPC Mac OS XC/C++TEXT.hppMW C/C++ PPC Mac OS XC/C++TEXT.lcfTEXT.mMW C/C++ PPC Mac OS XC/C++TEXT.mmMW C/C++ PPC Mac OS XC/C++TEXT.pchMW C/C++ PPC Mac OS XC/C++TEXT.pch++MW C/C++ PPC Mac OS XC/C++TEXT.pchmMW C/C++ PPC Mac OS XC/C++TEXT.pchmmMW C/C++ PPC Mac OS XC/C++TEXT.plcProperty List CompilerProperty ListTEXT.plocProperty List CompilerProperty ListTEXT.rRezRezTEXT.wkedocu`rsrc`.aMachO ImporterC/C++.docP.dylibMachO ImporterC/C++.gifCopy To PackageP.icnsCopy To PackageP.jpgCopy To PackageP.libMachO ImporterC/C++.nibCopy To PackageP.plPerl ToolPerl.plistCopy To Package.ppob`.pshShell Tool.rsrc`.shShell Tool.stringsCopy To Package.tiffCopy To PackagePLD Mach-O Linker*MDYL.dylibLD Mach-O ImporterDisassemblyMLIB.aLD Mach-O ImporterDisassemblyMLIB.oLD Mach-O ImporterDisassemblyMPLF.aLD Mach-O ImporterDisassemblyMPLF.oLD Mach-O ImporterDisassemblyRSRCNone`TEXT.cGNU Pascal Mach-O CompilerC/C++TEXT.dprGNU Pascal Mach-O CompilerPascalTEXT.dumpNoneTEXT.hGNU Pascal Mach-O CompilerC/C++TEXT.incGNU Pascal Mach-O CompilerPascalTEXT.pGNU Pascal Mach-O CompilerPascalTEXT.pasGNU Pascal Mach-O CompilerPascalTEXT.ppGNU Pascal Mach-O CompilerPascalTEXT.symtabNonersrcNone`.aLD Mach-O ImporterDisassembly.cGNU Pascal Mach-O CompilerC/C++.dprGNU Pascal Mach-O CompilerPascal.dylibLD Mach-O ImporterDisassembly.hGNU Pascal Mach-O CompilerC/C++.htmNone`.htmlNone`.icnsNone`.incGNU Pascal Mach-O CompilerPascal.jpegNone`.jpgNone`.nibNone`.oLD Mach-O ImporterDisassembly.pGNU Pascal Mach-O CompilerPascal.paletteNone`.pasGNU Pascal Mach-O CompilerPascal.pictNone`.plPerl ToolPerl.plistXML`.pngNone`.ppGNU Pascal Mach-O CompilerPascal.pshShell Tool.rsrcNone`.rtfNone`.shShell Tool.stringsNone`Lib Import PPCMPLFLib Import PPCMWCDTEXT.ccMW C/C++ PPCC/C++TEXT.cpMW C/C++ PPCC/C++TEXT.expTEXT.pchMW C/C++ PPCC/C++TEXT.pch++MW C/C++ PPCC/C+MacHeaders.cMacOS_Carbon_C++_Macros.hTEmainno connections availableeH:O,/K`$o\,oX Gv6YO//l/N(/Ho/NAPX&HHP/ B'p@rƒ/N;II/Ho/Npg 0Rgpƀpg/*g*J*fpƀ g/*pg0/jgpƀpgUO/ HjHxNDfpƀ@Main-ClassAuto-GeneratedTEXT.expdocu`rsrc`@!5{END 5{5{7EXT5{4 @MRJApplicationWARZmacosxmacosxMSIEhttp://java.sun.com/products/jdk/1.1/docs/api/ Merge Out????APPLa.rsrc????APPLa.rsrc::DLGXckidProjWSPCstart.6@6ߠ6@66ހ6 66`66ܠ6@6606ڠ66066P66װ6`66֐66p6P'CODE' 'DATA' 'PICT'3{Compiler}MacOS X Support/GNU Pascal/GPCPInterfaces[APPL????9#1:K`jl  *8EUet !"#$%& '"(-)9*D+R,_-g.p/z0123456789: ;<"=+>5?B@OA]BhCuDEFGHIJKLMNOP)Q5R=SLTTU_VkWwXYZ[\]^_`a bc d'e3f<gKh]iejpkzlmnopqrstuv w2xFyMz\{f|}~+:Mbs  6I^r  # > R ` q }   ' < S q  4 H ] q ????APPLqqq+ e!L#CshPf0 AddPinRaPoiMIte tRes' MenuI tConk Cont oseCillCShowHideMove$GetCGetCRjzeColiteGetCtCTitlVainCt%Ctl Elue gl SeTestragTrac Dra!"nded5#istT$r%&'()  **+B,d$`-}./shP001 Add2PinR3aPoi64MIteX5tRest6Menu7tCon8Cont9oseC:illC;Show#GetC}?etCR@zeCoABGetCCtCTiDtlVa8EinCtTFCtl qGlue Hl SeITestJDragKTrac L Dra "M ;N ^O P Q R S T U 1V OW mXKeys Y ZImpo [PW I \KBa ]lpM "^ Executable????APPL@Executable.rsrc:./A FreeFem++a.exe????MEXE@a.rsrc:./a.exea.rsrc FreeFem++(Carbon)????APPLu0@X:????FreeFem++(Carbon)  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Info.plist  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~/21486/ /CCCC `C334444H:BXXXXXXXXXXQQQQQQQQQQQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqqqqqqqqqqq plst !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ noname.exe3{Compiler}MacOS X Support/GNU Pascal/GPCPInterfaces r9APPL????9tMSL C++.PPC.LibMSL RuntimePPC.LibHelloWorld.cpCarbon.rMSL C.Carbon.LibMSL SIOUX.Carbon.LibCarbonLibxCarbon Std C++ Console:a.outLib Import PPCBalloon HelpMW C/C++ PPCRezPPCAsmXCOFF Import PPCPEF Import PPCMacOS PPC LinkerSource TreesAccess PathsDebugger RuntimeTarget SettingsFile MappingsBuild ExtrasDebugger TargetCustom KeywordsC/C++ CompilerC/C++ WarningsOutput FlagsPackager PanelPPC CodeGenPPC DisassemblerPPC Global OptimizerPPC LinkerPPC PEFPPC ProjectPPCAsm PanelRez Compiler:Std C++ Console Carbon:FreeFem++Bison PanelFlex PanelAFunction.cppCheckPtr.cpplex.cpplg.tab.clgfem.cppmacrgraf.cppDrawing.cppfem.cppFESpace.cppFormuleIntegration.cppFQuadTree.cppgibbs.cppMatriceCreuse_tpl.hmshptg.cppmyassert.hFreeFem++Bison Preprocessorlg.ybamg.cppMesh2.cppMeshDraw.cppMeshGeom.cppMeshgibbs.cppMeshio.cppMeshQuad.cppMeshRead.cppMeshWrite.cppMetric.cpppcrgraph.cpppsgraph.cppQuadTree.cppR2.cppSetOfE4.cppBamgFreeFem.cppGeomIntersection.cpplgmesh.cppElement_RT.cppconfig_freefem_v3.hppAnyType.hpplex.hppVidergraph.cppRNM.hppRNM_op.hppRNM_opc.hppRNM_tpl.hppproblem.cppMSL_All_Carbon.Liblg.tab.cppstrversionnumber.cppPascal CompilerPascal WarningsArrayOfFunc.cppInitFunct.cppFreeFem-g:FreeFem++-gBFGS.hppBrentLS.hppCG.hppCubicLS.hppdefs.hppLineSearch.hppNewtonRaphson.hppNRJ.hppOptima.hppParam.hppRosenBrock.hpplgalgo.cpperror.hppProperty Listeigenvalue.cpparpackLibCarbonElement_P2h.cppamdumfpackLibCarbonQuadratureFormular.cppload.cppFreeFem++.CarbonFreeFem++(Carbon)FreeFem++-g(Carbon)vecLibAFunction2.cpplgmat.cppLibraries/Runtime/Libs/MSL_All_Carbon.LibUniversal/Libraries/StubLibraries/CarbonLibfflib/AFunction.cppfemlib/CheckPtr.cppfflib/lex.cppfflib/lgfem.cppGraphics/macrgraf.cppfemlib/Drawing.cppfemlib/fem.cppfemlib/FESpace.cppfemlib/FQuadTree.cppfemlib/gibbs.cppfemlib/mshptg.cpplglib/lg.yfemlib/BamgFreeFem.cppbamglib/Mesh2.cppbamglib/MeshDraw.cppbamglib/MeshGeom.cppbamglib/Meshio.cppbamglib/MeshQuad.cppbamglib/MeshRead.cppbamglib/MeshWrite.cppbamglib/Metric.cppbamglib/QuadTree.cppbamglib/SetOfE4.cppfflib/lgmesh.cppfemlib/Element_RT.cppfflib/AnyType.hppfflib/lex.hppfemlib/RNM.hppfemlib/RNM_op.hppfemlib/RNM_opc.hppfemlib/RNM_tpl.hppfflib/problem.cpplglib/lg.tab.cppfflib/strversionnumber.cppfflib/InitFunct.cppAlgo/BFGS.hppAlgo/BrentLS.hppAlgo/CG.hppAlgo/CubicLS.hppAlgo/defs.hppAlgo/LineSearch.hppAlgo/NewtonRaphson.hppAlgo/NRJ.hppAlgo/Optima.hppAlgo/Param.hppAlgo/RosenBrock.hppAlgo/lgalgo.cppfflib/error.hppEigen/eigenvalue.cppfemlib/Element_P2h.cppfemlib/QuadratureFormular.cppfflib/load.cppUniversal/Libraries/StubLibraries/vecLibfflib/AFunction2.cppfflib/lgmat.cppfflib/CodeAlloc.cppfflib/global.cppGraphics/SetColor.cppGraphics/DefColor.cppfflib/AFunction3.cppfflib/mt19937ar.cppfflib/AFunction3.hppfflib/array_tlp.hppfflib/array_real.cppfflib/array_complex.cppfflib/array_long.cpplglib/environment.cppfflib/environment.cppfflib/string_def.cpplglib/mymain.cpp|@}@~    (*+,-./0123456P78:;<=>BCDEFGHIJKLMNOPQRTUsVWY@Z[\]_`abcdfgq@ hiPmstr( mstl mstnL9mstr7 mstl(mstnPprefؚ Q pref Q prefQprefxZprefUrb=prefdmtpl|mtps$mtpi4 mtlob mtsl,4mtgl(moti~xPLstD%C,mpsiT(msti(msti\Mmallmapl\UprefH>&}v^prefHi'}prefI(*pref{< pref ?[8pref]\! pref,Z^ mtsl\9mtplBY|mtps6mtpiH mtloprefk_Ppref`prefa#pref$bTVprefXcQ%"prefd pref8eJcprefIfpref9tgprefh)@prefiprefjrprefk\kpreflprefmKprefnpref;oV6prefp$ pref*q1prefr.L&pref} spreft3rprefua8prefc4v> pref*w"pref;x"prefX1y prefz pref{*prefn|+lprefU}9prefr~4pref`Atpref`Fpref x} prefR"pref_pref1,-preftK,Epreft pref7#prefHDpref=~Lpref(D,_\pref(tPpref(ûXpref'7G2pref(7prefL12^pref3qprefD4vpref?5|(V0pref6X"pref7z prefי8ݚpref29"pref:,pref;YG@pref=0pref>pref@8pref&|AHpref\YzprefiB@prefmHprefCH!6prefhD$ prefE prefF&pref{G{prefH$hprefIHW"prefJHy"prefZ} prefZOK7 prefwL|upref0MPs\pref;*~preflpref[2jpref,\Npref ?N:VprefhOfprefU@PA&preft prefAQH"prefRHprefSZ2prefPpref#TZprefU7 prefVpref}WG6pref=X\.pref'uaspref(5v6pref(.<apref'H pref'Mpref'ïZpref'apref'xapref'}?4pref'U8kpref'R*@pref'bpref'#pref'\Dpref'MLKpref'zK pref'(K&Mpref'UKspref'Kpref'uKpref'dK4pref'Kpref( K@pref($freefem++-3.38-1/freefem++.spec000644 000767 000024 00000004563 12167254041 016231 0ustar00hechtstaff000000 000000 Summary: FreeFem++ Name: freefem++ Version: 2.8 Release: 0 Source: %{name}-%{version}.tar.gz Patch: %{name}-config.patch Patch1: %{name}-gcc4.patch %if %{?_with_cadna:1}%{!?_with_cadna:0} Source2: CadnaC_gcc-3.2_Linux_i386.tar.gz Patch2: cadna-gcc4.patch %endif License: GPL Group: Applications/Engineering URL: http://www.freefem.org/ff++/ Packager: Christophe Trophime Prereq: /sbin/install-info Buildroot: %{_tmppath}/%{name}-buildroot Requires: arpack, ufsparse BuildRequires: arpack-devel, ufsparse-devel BuildRequires: fltk >= 1.1 BuildRequires: fltk >= 1.1 BuildRequires: gsl >= 1.2 BuildRequires: rpm >= 4.1 %if %{?_with_mpi:1}%{!?_with_mpi:0} BuildRequires: lam %endif %{!?_without_freedesktop:BuildRequires: desktop-file-utils} Requires: mesa-libGL >= 6.7.0-9 Requires: mesa-libGLU >= 6.7.0-9 Requires: gsl >= 1.2 Requires: fltk >= 1.1 Prefix: /usr %description FreeFem++ is an implementation of a language dedicated to the finite element method. It enables you to solve Partial Differential Equations (PDE) easily. Problems involving PDE from several branches of physics such as fluid-structure interactions require interpolations of data on several meshes and their manipulation within one program. FreeFem++ includes a fast quadtree-based interpolation algorithm and a language for the manipulation of data on multiple meshes (generated with bamg). %prep %setup -q -n %{name}-%{version} %patch -p1 -b .umfpack %patch1 -p1 -b .gcc4 %if %{?_with_cadna:1}%{!?_with_cadna:0} mkdir -p cadna mkdir -p download/cadna tar zxvf %{SOURCE2} -C cadna mv cadna/include/cadnafree.h download/cadna mv cadna/lib/libcadnafreeC.a download/cadna pushd download/cadna/ ln -sf libcadnafreeC.a libcadnafree.a popd %patch2 -p1 -b .cadna-gcc4.patch %endif autoreconf -f -i %build %if %{?_with_mpi:1}%{!?_with_mpi:0} %configure --with-mpi=lam %else %configure --without-mpi --with-blas="-L/usr/lib/atlas -lf77blas -lcblas" %endif make %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %{_bindir}/FreeFem++ %{_bindir}/FreeFem++-cs %{_bindir}/FreeFem++-nw %{_bindir}/FreeFem++-glx %{_bindir}/FreeFem++-ide %{_bindir}/FreeFem++-server %{_bindir}/FreeFem++-client %{_bindir}/bamg %{_bindir}/cvmsh2 %{_bindir}/drawbdmesh %if %{?_with_mpi:1}%{!?_with_mpi:0} %{_bindir}/FreeFem++-mpi %endif freefem++-3.38-1/HISTORY000644 000767 000024 00002434171 12543220337 014705 0ustar00hechtstaff000000 000000 @ changeset: 3343:af6b74e90d77 | tag: tip | user: Frederic Hecht | date: Fri Jun 26 11:52:09 2015 +0200 | summary: coorect removedof | o changeset: 3342:3b00ac19273e | user: Frederic Hecht | date: Thu Jun 25 10:15:55 2015 +0200 | summary: update doc | o changeset: 3341:41d392438ca1 | user: Frederic Hecht | date: Wed Jun 24 20:52:26 2015 +0200 | summary: add INNOVATION word. | o changeset: 3340:346282589d1d | user: Frederic Hecht | date: Wed Jun 24 20:50:13 2015 +0200 | summary: add tool to remove test of optimize in | o changeset: 3339:2fcfaef31265 | user: Frederic Hecht | date: Wed Jun 24 14:35:37 2015 +0200 | summary: coorect convect 3d , | o changeset: 3338:eb61b55cb4f9 | user: Frederic Hecht | date: Fri Jun 19 16:11:01 2015 +0200 | summary: add P-H Tournier trich in renumbering | o changeset: 3337:86dd8e46a7f9 | user: Frederic Hecht | date: Tue Jun 09 10:53:28 2015 +0200 | summary: limit number of try in wget | o changeset: 3336:a7a9fa953a11 | user: Frederic Hecht | date: Tue Jun 09 10:18:37 2015 +0200 | summary: correct getall in case of pb of downlaod | o changeset: 3335:7f0643919ce4 | user: Frederic Hecht | date: Tue Jun 09 09:33:14 2015 +0200 | summary: pass to version 3.28 | o changeset: 3334:573b49707eea | user: Frederic Hecht | date: Tue Jun 09 08:41:45 2015 +0200 | summary: coorect SUPERLU dist witgh gcc 4.9 | o changeset: 3333:5d6778c2d80d | user: Frederic Hecht | date: Thu Jun 04 18:59:17 2015 +0200 | summary: coorect makefile in case of not mpi | o changeset: 3332:04dfe36ed186 | user: Frederic Hecht | date: Wed Jun 03 17:46:03 2015 +0200 | summary: rebuold missing file | o changeset: 3331:662ca0c6fd0c | user: Frederic Hecht | date: Wed Jun 03 17:45:18 2015 +0200 | summary: correct pb in installation process without mpi | o changeset: 3330:e0724f43b898 | user: Frederic Hecht | date: Wed Jun 03 12:17:58 2015 +0200 | summary: update AutoGeneratedFile for umfpack | o changeset: 3329:069f92feb589 | user: Frederic Hecht | date: Wed Jun 03 12:15:18 2015 +0200 | summary: correct pb for launch under windows | o changeset: 3328:d1f7963e8e88 | user: Frederic Hecht | date: Fri May 22 14:14:43 2015 +0200 | summary: add missing file for schwartz.cpp | o changeset: 3327:b218c242f40c | user: Frederic Hecht | date: Fri May 22 14:09:17 2015 +0200 | summary: add missing file in dist . | o changeset: 3326:c67d55808526 | user: Frederic Hecht | date: Fri May 22 13:54:52 2015 +0200 | summary: version 3.37 | o changeset: 3325:843c94e79d6b | user: Frederic Hecht | date: Fri May 22 13:41:55 2015 +0200 | summary: correct pb with new version of hpddm | o changeset: 3324:e9c275d64007 | user: Frederic Hecht | date: Thu May 21 14:40:51 2015 +0200 | summary: put less point on ClosePoints.edp | o changeset: 3323:d398f3adab01 | user: Frederic Hecht | date: Thu May 21 14:36:35 2015 +0200 | summary: coorect pb with new hpddm version | o changeset: 3322:46681e344d5a | user: Frederic Hecht | date: Wed May 20 08:50:47 2015 +0200 | summary: add read on real[int,int] data type | o changeset: 3321:39fdc8831e11 | user: Frederic Hecht | date: Tue May 12 17:20:41 2015 +0200 | summary: correct precon CG | o changeset: 3320:e8ea8202d9af | user: Frederic Hecht | date: Thu Apr 30 17:55:18 2015 +0200 | summary: version 3.37 | o changeset: 3319:8657e0526391 | user: Frederic Hecht | date: Thu Apr 30 17:44:30 2015 +0200 | summary: remove debut cout | o changeset: 3318:7113fd6d9cba | user: Frederic Hecht | date: Thu Apr 30 16:27:53 2015 +0200 | summary: add missing plugin aniso | o changeset: 3317:09260ac5f6a3 | user: Frederic Hecht | date: Thu Apr 30 16:05:14 2015 +0200 | summary: add -wait in case of no parameter in launchff++ under win32 | o changeset: 3316:a8743bcf97cd | user: Frederic Hecht | date: Thu Apr 30 16:03:11 2015 +0200 | summary: correct wait under windows by default only withvia launchff++ | o changeset: 3315:faaa3bc0050c | user: Frederic Hecht | date: Thu Apr 30 14:44:10 2015 +0200 | summary: pass to version 3.37 | o changeset: 3314:7c816b2243e8 | user: Frederic Hecht | date: Wed Apr 29 23:35:08 2015 +0200 | summary: correct be mistake in DG formulation with jump/mean on test function | o changeset: 3313:dc3c17483f8e | user: Frederic Hecht | date: Wed Apr 29 20:59:54 2015 +0200 | summary: correct bug in debugshack | o changeset: 3312:13fbf0663dff | user: Frederic Hecht | date: Wed Apr 22 12:26:20 2015 +0200 | summary: Pierre Jolivet correction. | o changeset: 3311:67e1fedbe5bf | user: Frederic Hecht | date: Fri Apr 17 21:57:54 2015 +0200 | summary: add ClosePoints tools et exemples | o changeset: 3310:16f2b8a6a9fa | user: Frederic Hecht | date: Fri Apr 17 19:29:57 2015 +0200 | summary: rebuild AutoGeneratedFile.tar.gz | o changeset: 3309:46581ff2135d | user: Frederic Hecht | date: Fri Apr 17 19:29:09 2015 +0200 | summary: correct for new apple compiler pb on null ref. | o changeset: 3308:4fc51ad7ea1a | user: Frederic Hecht | date: Fri Apr 17 18:13:34 2015 +0200 | summary: try to remove null ref. | o changeset: 3307:c06b5ae10a38 | user: Frederic Hecht | date: Fri Apr 17 17:16:54 2015 +0200 | summary: correct problem due to null ref | o changeset: 3306:cb40b21b4fbe | user: Frederic Hecht | date: Fri Apr 17 16:33:39 2015 +0200 | summary: contine remoev ref on null | o changeset: 3305:358680b9a4d1 | user: Frederic Hecht | date: Fri Apr 17 16:03:10 2015 +0200 | summary: replace ref to point in bamg | o changeset: 3304:90a668f13fc7 | user: Frederic Hecht | date: Fri Apr 17 15:06:27 2015 +0200 | summary: correct pb of optimisation of null ref in bamg | o changeset: 3303:bdc269a66962 | user: Frederic Hecht | date: Fri Apr 17 12:02:40 2015 +0200 | summary: correct pb in small allocation (in test) | o changeset: 3302:5e03e66f18b1 | user: Frederic Hecht | date: Fri Apr 10 11:14:19 2015 +0200 | summary: coorect type | o changeset: 3301:38b9115787ef | user: Frederic Hecht | date: Fri Apr 10 10:53:07 2015 +0200 | summary: add BADCERT in hpddm | o changeset: 3300:3e2860ea680d | user: Frederic Hecht | date: Thu Apr 09 18:02:14 2015 +0200 | summary: add new exmaple and rebuild AutoGeneratedFile.tar.gz | o changeset: 3299:280ddd056f47 | user: Frederic Hecht | date: Thu Apr 09 17:57:27 2015 +0200 | summary: add trick to remove round off error in computation of the partition | o changeset: 3298:ba77ec033847 | user: Frederic Hecht | date: Thu Apr 09 14:28:08 2015 +0200 | summary: correct problem of check of negatif volunme in case of no vbolume | o changeset: 3297:77ef94e25fbb | user: Frederic Hecht | date: Thu Apr 09 14:22:32 2015 +0200 | summary: add tools to build mesh a set on interal point add points=P | o changeset: 3296:85dbc875ef1a | user: Frederic Hecht | date: Sun Apr 05 10:07:11 2015 +0200 | summary: corect pb in Mesh::Find is case of brute forces. | o changeset: 3295:40ed8b7c1b43 | user: Frederic Hecht | date: Fri Apr 03 15:51:45 2015 +0200 | summary: correct type rank => mpirank | o changeset: 3294:528e3ce0b4e2 | user: Frederic Hecht | date: Fri Apr 03 15:43:07 2015 +0200 | summary: add Pierre Jolivet patch [Freefempp] Regarding the use of FreeFEM++ with PETSC. | o changeset: 3293:9ec6aea79b48 | user: Frederic Hecht | date: Fri Apr 03 15:25:47 2015 +0200 | summary: correct old bug in find on triangular mesh | o changeset: 3292:600ca0b5f8f6 | user: Frederic Hecht | date: Tue Mar 31 18:04:15 2015 +0200 | summary: correct but in evaluation of (aaa')[0] | o changeset: 3291:1a62057e90df | user: Frederic Hecht | date: Tue Mar 31 10:06:14 2015 +0200 | summary: coorect un set mesh in Period-Poisson-cube-ballon.edp | o changeset: 3290:80a5375efef5 | user: Frederic Hecht | date: Fri Mar 27 23:52:19 2015 +0100 | summary: add tools to bound aniso in metrix | o changeset: 3289:e6ce11b08c23 | user: Frederic Hecht | date: Fri Mar 27 16:23:00 2015 +0100 | summary: correct header of ps file ???? | o changeset: 3288:6b8ea09dc209 | user: Frederic Hecht | date: Fri Mar 27 16:06:29 2015 +0100 | summary: correct the remove of FreeFem++-api.dll in load link | o changeset: 3287:5cfe4ff2e8d4 | user: Frederic Hecht | date: Fri Mar 27 15:36:12 2015 +0100 | summary: remove of AddLayer3 same as AddLayer in msh3 | o changeset: 3286:36dfcdecc14b | user: Frederic Hecht | date: Fri Mar 27 15:28:51 2015 +0100 | summary: pass patch of P. Jolivet. | o changeset: 3285:2f1d340947f0 | user: Frederic Hecht | date: Fri Mar 27 10:17:44 2015 +0100 | summary: coreect INNOVATIOn file | o changeset: 3284:fafdd461d2e5 | user: Frederic Hecht | date: Fri Mar 27 10:16:40 2015 +0100 | summary: try to pub messag in makefile if generate file are out of date. | o changeset: 3283:40eba7d447e3 | user: Frederic Hecht | date: Thu Mar 26 23:03:32 2015 +0100 | summary: coorect pb of space in variable under windows | o changeset: 3282:ea76e2181c40 | user: Frederic Hecht | date: Thu Mar 26 22:40:28 2015 +0100 | summary: correct missing patch | o changeset: 3281:c240a3389925 | user: Frederic Hecht | date: Thu Mar 26 22:26:36 2015 +0100 | summary: correct scotch makefile for windows | o changeset: 3280:cabe12859b7f | user: Frederic Hecht | date: Thu Mar 26 21:45:10 2015 +0100 | summary: re buid AutoGeneratedFile.tar.gz and include.tar.gz | o changeset: 3279:452b5a691a95 | user: Frederic Hecht | date: Thu Mar 26 21:35:35 2015 +0100 | summary: coorect makefile for windows | o changeset: 3278:4224cd4c21ce | user: Frederic Hecht | date: Thu Mar 26 19:09:26 2015 +0100 | summary: correct makefile for windows compile process | o changeset: 3277:a76f9483f95d | user: Frederic Hecht | date: Thu Mar 26 09:51:08 2015 +0100 | summary: coorect type in innovation file | o changeset: 3276:a727de1e2428 | user: Frederic Hecht | date: Wed Mar 25 23:30:28 2015 +0100 | summary: remove fast for schwarz-add-macro.idp | o changeset: 3275:5feb67cd7a68 | user: Frederic Hecht | date: Wed Mar 25 23:03:39 2015 +0100 | summary: update HISTORY | o changeset: 3274:d4e74adfc0d7 |\ parent: 3273:6459276e1200 | | parent: 3272:820477f35cd3 | | user: Frederic Hecht | | date: Wed Mar 25 16:36:57 2015 +0100 | | summary: merge and correct pastix | | | o changeset: 3273:6459276e1200 | | parent: 3269:26eb6fa44041 | | user: Frederic Hecht | | date: Wed Mar 25 16:33:34 2015 +0100 | | summary: coreect pastix compile | | o | changeset: 3272:820477f35cd3 |\| parent: 3271:a53f2ef3fd89 | | parent: 3269:26eb6fa44041 | | user: Frederic Hecht | | date: Wed Mar 25 15:26:58 2015 +0100 | | summary: remerge version | | o | changeset: 3271:a53f2ef3fd89 | | user: Frederic Hecht | | date: Wed Mar 25 15:23:55 2015 +0100 | | summary: past to version 3.36 | | o | changeset: 3270:b71bf2084a83 | | parent: 3268:08df56079406 | | user: Frederic Hecht | | date: Wed Mar 25 15:11:13 2015 +0100 | | summary: coorect metsi | | | o changeset: 3269:26eb6fa44041 |/ user: Frederic Hecht | date: Wed Mar 25 15:07:24 2015 +0100 | summary: clean a little schwartz.edp | o changeset: 3268:08df56079406 | user: Frederic Hecht | date: Wed Mar 25 14:40:27 2015 +0100 | summary: coorect lround and f(aarry) function | o changeset: 3267:4de61f34d228 | user: Frederic Hecht | date: Wed Mar 25 14:04:16 2015 +0100 | summary: add lround off arral double to long | o changeset: 3266:35e78b977f8a |\ parent: 3264:1f4d1bebde82 | | parent: 3265:3f85ec5c3666 | | user: Frederic Hecht | | date: Wed Mar 25 13:51:24 2015 +0100 | | summary: correct update pb. | | | o changeset: 3265:3f85ec5c3666 | | parent: 3262:0c9c60f5f386 | | user: Frederic Hecht | | date: Wed Mar 25 13:20:01 2015 +0100 | | summary: correct type | | o | changeset: 3264:1f4d1bebde82 | | user: Frederic Hecht | | date: Wed Mar 25 13:22:04 2015 +0100 | | summary: update schwarz.edp | | o | changeset: 3263:77a50d63e43a |/ user: Frederic Hecht | date: Wed Mar 25 12:04:27 2015 +0100 | summary: correct typo | o changeset: 3262:0c9c60f5f386 | user: Frederic Hecht | date: Wed Mar 25 11:54:37 2015 +0100 | summary: correct pb of optimisation FLAGS in c++ | o changeset: 3261:abc1e0fd147e | user: Frederic Hecht | date: Tue Mar 24 16:58:08 2015 +0100 | summary: correct pb compile new aprmetsi and metes in hpc2 | o changeset: 3260:0c94785a41f3 | user: Frederic Hecht | date: Tue Mar 24 16:49:26 2015 +0100 | summary: coorect for new hppdm interface | o changeset: 3259:1128571182a0 | user: Frederic Hecht | date: Tue Mar 24 16:02:21 2015 +0100 | summary: add new schwarz interface | o changeset: 3258:7a49cad8ab08 | user: Frederic Hecht | date: Fri Mar 20 16:00:51 2015 +0100 | summary: add coorect for windows compilation | o changeset: 3257:5c3838c8aa06 | user: Frederic Hecht | date: Thu Mar 12 21:10:42 2015 +0100 | summary: correct Makefile for windows | o changeset: 3256:a84450bc3708 | user: Frederic Hecht | date: Thu Mar 12 14:14:53 2015 +0100 | summary: rebuild AutoGeneratedFile.tar.gz | o changeset: 3255:240ee8600025 | user: Frederic Hecht | date: Thu Mar 12 14:12:18 2015 +0100 | summary: correct type in examples++-mpi/Makefile.am | o changeset: 3254:3a9e87cabd2f | user: Frederic Hecht | date: Thu Mar 12 11:49:28 2015 +0100 | summary: add P. Jolivet as Author of Freefem++ | o changeset: 3253:42d52f6b1dfa | user: Frederic Hecht | date: Thu Mar 12 11:32:44 2015 +0100 | summary: add new geno example | o changeset: 3252:aed9af812d45 | user: Frederic Hecht | date: Thu Mar 12 11:08:21 2015 +0100 | summary: remove compile of iluyt if no gmm | o changeset: 3251:ca607de2351f | user: Frederic Hecht | date: Thu Mar 12 10:59:11 2015 +0100 | summary: add disabel gmm flag | o changeset: 3250:563707de24cc | user: Frederic Hecht | date: Thu Mar 12 10:45:32 2015 +0100 | summary: add new example | o changeset: 3249:68f0ba17d291 | user: Frederic Hecht | date: Thu Mar 12 10:37:05 2015 +0100 | summary: add new exemple | o changeset: 3248:856b7093507b | user: Frederic Hecht | date: Thu Mar 12 10:06:30 2015 +0100 | summary: Added tag 3.35-dist for changeset c863693513fc | o changeset: 3247:c863693513fc | tag: 3.35-dist | user: Frederic Hecht | date: Thu Mar 12 10:06:11 2015 +0100 | summary: up INNOVATIOn | o changeset: 3246:664a6473d705 | user: Frederic Hecht | date: Thu Mar 12 10:00:56 2015 +0100 | summary: correct optiann NO_RANGE_CHECK | o changeset: 3245:b28c0548e00b | user: Frederic Hecht | date: Thu Mar 12 09:48:43 2015 +0100 | summary: coorect pb on install form dist version | o changeset: 3244:42053542982c | user: Frederic Hecht | date: Thu Mar 12 08:50:07 2015 +0100 | summary: remove delete of download file | o changeset: 3243:8e76ed03c608 |\ parent: 3241:6c1e633f852c | | parent: 3242:31d3d0d12ff2 | | user: Frederic Hecht | | date: Wed Mar 11 23:14:27 2015 +0100 | | summary: change mesh size | | | o changeset: 3242:31d3d0d12ff2 | | parent: 3239:bfb95df218ef | | user: Frederic Hecht | | date: Wed Mar 11 23:12:38 2015 +0100 | | summary: change mesh in examples++-mpi/Stokes-v1-matrix-superludist.edp | | o | changeset: 3241:6c1e633f852c |\ \ parent: 3240:f9f7c2faee0f | | | parent: 3238:2bd2b0cde187 | | | user: Frederic Hecht | | | date: Wed Mar 11 23:09:02 2015 +0100 | | | summary: merge and put pastix coorect | | | | o | changeset: 3240:f9f7c2faee0f | |/ user: Frederic Hecht | | date: Wed Mar 11 22:45:38 2015 +0100 | | summary: correct pastix | | | o changeset: 3239:bfb95df218ef | | parent: 3223:43045f950575 | | user: Frederic Hecht | | date: Wed Mar 11 22:42:57 2015 +0100 | | summary: correct pastix downlaod | | o | changeset: 3238:2bd2b0cde187 |\ \ parent: 3237:3648e033aa3b | | | parent: 3235:b822cc691498 | | | user: Frederic Hecht | | | date: Thu Feb 12 13:37:49 2015 +0100 | | | summary: mergeing bad branch .. | | | | o | changeset: 3237:3648e033aa3b | |\ \ parent: 3157:83f4a2ab0c5f | | | | parent: 3236:d5322f50a8c0 | | | | user: Frederic Hecht | | | | date: Thu Feb 12 13:34:51 2015 +0100 | | | | summary: merge | | | | | | o | changeset: 3236:d5322f50a8c0 | | | | parent: 3155:bff13b38aba2 | | | | user: Frederic Hecht | | | | date: Thu Feb 12 10:10:38 2015 +0100 | | | | summary: correct somme topy after big change in all plugins. | | | | o | | | changeset: 3235:b822cc691498 |\ \ \ \ parent: 3234:dcde651217f4 | | | | | parent: 3072:d4af5fcecb25 | | | | | user: Frederic Hecht | | | | | date: Thu Oct 16 18:48:15 2014 +0200 | | | | | summary: revome bad change | | | | | | o | | | changeset: 3234:dcde651217f4 | |\ \ \ \ parent: 3233:db79df9e0557 | | | | | | parent: 3228:3fadb0cb20c5 | | | | | | user: Frederic Hecht | | | | | | date: Thu Oct 16 18:32:49 2014 +0200 | | | | | | summary: coorect merge | | | | | | | | o | | | changeset: 3233:db79df9e0557 | | |\ \ \ \ parent: 3232:9df5a9d4e8f0 | | | | | | | parent: 3225:e733a0ef41cf | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Oct 16 16:48:24 2014 +0200 | | | | | | | summary: correct makefile | | | | | | | | | | o | | | changeset: 3232:9df5a9d4e8f0 | | | |\ \ \ \ parent: 3231:992d5c7cbf58 | | | | | | | | parent: 3229:9078790125d6 | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Oct 16 16:37:57 2014 +0200 | | | | | | | | summary: merge | | | | | | | | | | | | o | | | changeset: 3231:992d5c7cbf58 | | | | |\ \ \ \ parent: 3071:d324bac28890 | | | | | | | | | parent: 3230:26be9be047b2 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Oct 16 16:37:13 2014 +0200 | | | | | | | | | summary: merge | | | | | | | | | | | | | | o | | | changeset: 3230:26be9be047b2 | | | | | | | | | parent: 3068:8d8432eea0df | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Sep 16 17:21:27 2014 +0200 | | | | | | | | | summary: correct typo in parm interface (not check) | | | | | | | | | | | | o | | | | | changeset: 3229:9078790125d6 | | | | | | | | | parent: 3061:5f22bdd00e0e | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Sep 16 13:55:57 2014 +0200 | | | | | | | | | summary: coorect retrun value of clean_all_installed_ffpp.sh of install on mac; | | | | | | | | | | o | | | | | | | changeset: 3228:3fadb0cb20c5 | |\| | | | | | | parent: 3227:368ebd92dae9 | | | | | | | | | parent: 3225:e733a0ef41cf | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Mar 14 10:41:21 2014 +0100 | | | | | | | | | summary: correct Makefile | | | | | | | | | | o | | | | | | | changeset: 3227:368ebd92dae9 | |\ \ \ \ \ \ \ \ parent: 3226:b36df697bb2f | | | | | | | | | | parent: 2984:9afbc88823c8 | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | date: Fri Mar 14 10:38:28 2014 +0100 | | | | | | | | | | summary: merge | | | | | | | | | | | | o | | | | | | | changeset: 3226:b36df697bb2f | | | | | | | | | | parent: 2983:2e43d499a8b3 | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | date: Fri Mar 14 10:24:49 2014 +0100 | | | | | | | | | | summary: coorect pb in MUMPS and add tool to find undef un plugin | | | | | | | | | | | | | o | | | | | | changeset: 3225:e733a0ef41cf | | | |\ \ \ \ \ \ \ parent: 3224:7000a79389d6 | | | | | | | | | | | parent: 2853:a9464311ddea | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Nov 28 08:39:52 2013 +0100 | | | | | | | | | | | summary: merge ... | | | | | | | | | | | | | | | o | | | | | | changeset: 3224:7000a79389d6 | | | | | | | | | | | parent: 2848:4743da3cb7d6 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Nov 21 21:36:23 2013 +0100 | | | | | | | | | | | summary: coorect DOC/gnu.mak to build .pdf .eps | | | | | | | | | | | | | | | | | | | | | o changeset: 3223:43045f950575 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 17:15:54 2015 +0100 | | | | | | | | | | | summary: coorect lib in superludist | | | | | | | | | | | | | | | | | | | | | o changeset: 3222:47a97a9ee26d | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 15:42:54 2015 +0100 | | | | | | | | | | | summary: continuation of new mpi version | | | | | | | | | | | | | | | | | | | | | o changeset: 3221:e9b533a7e3d6 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 14:03:52 2015 +0100 | | | | | | | | | | | summary: add test lib in schwarz.cpp | | | | | | | | | | | | | | | | | | | | | o changeset: 3220:b622795acf81 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 14:01:01 2015 +0100 | | | | | | | | | | | summary: add test lib seach in WHERE-LIBRARY tools | | | | | | | | | | | | | | | | | | | | | o changeset: 3219:bc1579e193df | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 11:18:14 2015 +0100 | | | | | | | | | | | summary: coorect tupe in makefile parmetis | | | | | | | | | | | | | | | | | | | | | o changeset: 3218:56eb3226e613 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 11:14:47 2015 +0100 | | | | | | | | | | | summary: coorect missing CFLAGS in metis and parmetis Makefile | | | | | | | | | | | | | | | | | | | | | o changeset: 3217:5abfb17115f4 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 10:56:17 2015 +0100 | | | | | | | | | | | summary: change metis to scocth metis interface in parms | | | | | | | | | | | | | | | | | | | | | o changeset: 3216:8d26188ebf7e | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 09:05:14 2015 +0100 | | | | | | | | | | | summary: remove metis of hips make file | | | | | | | | | | | | | | | | | | | | | o changeset: 3215:a2d249fd9802 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Wed Mar 11 09:02:54 2015 +0100 | | | | | | | | | | | summary: coorect hips with new version repalce metis by scoth | | | | | | | | | | | | | | | | | | | | | o changeset: 3214:041b6609580b | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Mar 10 17:41:09 2015 +0100 | | | | | | | | | | | summary: change version of download solftware metis, partis, scotch mumps mumps-seq | | | | | | | | | | | | | | | | | | | | | o changeset: 3213:5e15333e280b | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Mar 10 14:54:22 2015 +0100 | | | | | | | | | | | summary: add miss file | | | | | | | | | | | | | | | | | | | | | o changeset: 3212:b8e8d5cbef7e | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Mar 10 14:47:12 2015 +0100 | | | | | | | | | | | summary: try to change MUMPS , scocth metsi parmets version . | | | | | | | | | | | | | | | | | | | | | o changeset: 3211:57866c303247 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Mar 10 14:46:27 2015 +0100 | | | | | | | | | | | summary: Added tag 3.35 for changeset b45b55da9433 | | | | | | | | | | | | | | | | | | | | | o changeset: 3210:b45b55da9433 | | | | | | | | | | | tag: 3.35 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Mar 06 14:37:56 2015 +0100 | | | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | | | | | o changeset: 3209:4f3ee6a45630 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Mar 06 14:37:10 2015 +0100 | | | | | | | | | | | summary: add chech in confiure if autoconf is too old | | | | | | | | | | | | | | | | | | | | | o changeset: 3208:3fdbcdbcec08 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Mar 06 11:53:16 2015 +0100 | | | | | | | | | | | summary: take un coorect PETSC makefile (i progress under ubunutu) | | | | | | | | | | | | | | | | | | | | | o changeset: 3207:e2a1dfd6c657 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Mar 05 14:46:08 2015 +0100 | | | | | | | | | | | summary: add forget fi in src/mpi/ff-mpirun.in | | | | | | | | | | | | | | | | | | | | | o changeset: 3206:f147b4c7e640 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Mar 05 14:19:55 2015 +0100 | | | | | | | | | | | summary: just put rev in INNOVATION | | | | | | | | | | | | | | | | | | | | | o changeset: 3205:255fe77c041d | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Mar 05 14:18:12 2015 +0100 | | | | | | | | | | | summary: pass to version 3.35 | | | | | | | | | | | | | | | | | | | | | o changeset: 3204:24487fc19570 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Mar 03 16:30:03 2015 +0100 | | | | | | | | | | | summary: correct of non static function in LOADINIT plugin function. | | | | | | | | | | | | | | | | | | | | | o changeset: 3203:113b5d72a002 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 24 22:29:53 2015 +0100 | | | | | | | | | | | summary: correct pb of install under windows use of launchff++.exe | | | | | | | | | | | | | | | | | | | | | o changeset: 3202:f8b54b5a5eb0 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 23 18:28:47 2015 +0100 | | | | | | | | | | | summary: add dcl of | | | | | | | | | | | | | | | | | | | | | o changeset: 3201:e7823efd942c | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 22:44:15 2015 +0100 | | | | | | | | | | | summary: add Airy and Biry specail function | | | | | | | | | | | | | | | | | | | | | o changeset: 3200:c2364f723231 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 22:38:11 2015 +0100 | | | | | | | | | | | summary: no waint at end if parallele cas | | | | | | | | | | | | | | | | | | | | | o changeset: 3199:65548c9cdab0 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 22:21:14 2015 +0100 | | | | | | | | | | | summary: coorect init pointer for ffglut | | | | | | | | | | | | | | | | | | | | | o changeset: 3198:9a29fdbc00b7 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 21:49:27 2015 +0100 | | | | | | | | | | | summary: add comment in innovation | | | | | | | | | | | | | | | | | | | | | o changeset: 3197:874cf273aa63 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 21:42:03 2015 +0100 | | | | | | | | | | | summary: finist coorect of compilation under windows | | | | | | | | | | | | | | | | | | | | | o changeset: 3196:4dc276d269c1 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 21:32:06 2015 +0100 | | | | | | | | | | | summary: correct the WHERE-mumps LIBSPTHREAD | | | | | | | | | | | | | | | | | | | | | o changeset: 3195:2e4300ca79e4 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 21:28:33 2015 +0100 | | | | | | | | | | | summary: correct phtread lib in WHERE file for mumps | | | | | | | | | | | | | | | | | | | | | o changeset: 3194:5762e43f1bc1 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 19:45:34 2015 +0100 | | | | | | | | | | | summary: put ffapt::init in mymain | | | | | | | | | | | | | | | | | | | | | o changeset: 3193:5db386d2de17 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 19:17:39 2015 +0100 | | | | | | | | | | | summary: correct ffapi interface | | | | | | | | | | | | | | | | | | | | | o changeset: 3192:3171c844e904 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 19:01:50 2015 +0100 | | | | | | | | | | | summary: put the def of ffapi in Global.cpp and gggg.cpp | | | | | | | | | | | | | | | | | | | | | o changeset: 3191:44a966c66463 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 17:43:45 2015 +0100 | | | | | | | | | | | summary: change all ffapi interface for window en mpi to have one ff++ dll with and without mpi .. | | | | | | | | | | | | | | | | | | | | | o changeset: 3190:00bb92561961 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 16:08:38 2015 +0100 | | | | | | | | | | | summary: add namescape under _WIN32 for isnan isinf function | | | | | | | | | | | | | | | | | | | | | o changeset: 3189:b79b84a0b907 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 16:01:55 2015 +0100 | | | | | | | | | | | summary: add -std= flags in ff-c++ | | | | | | | | | | | | | | | | | | | | | o changeset: 3188:13a97db817b9 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 15:11:31 2015 +0100 | | | | | | | | | | | summary: correct typo sdt -> std | | | | | | | | | | | | | | | | | | | | | o changeset: 3187:34f72766e54c | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 14:53:21 2015 +0100 | | | | | | | | | | | summary: remplace c++11 by cxx11 for pattern porblem in shell | | | | | | | | | | | | | | | | | | | | | o changeset: 3186:2d6cd9537846 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 20 14:39:50 2015 +0100 | | | | | | | | | | | summary: remove default c++11 compile if possible too much probleme under windows with g++ 4.9.1 | | | | | | | | | | | | | | | | | | | | | o changeset: 3185:829ba25b59a7 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 19 23:54:43 2015 +0100 | | | | | | | | | | | summary: change WIN32 in _WIN32 (better ??) | | | | | | | | | | | | | | | | | | | | | o changeset: 3184:f4a756b0dfd9 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 19 23:47:35 2015 +0100 | | | | | | | | | | | summary: do correction for wondows | | | | | | | | | | | | | | | | | | | | | o changeset: 3183:e699cda4d954 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 19 11:27:28 2015 +0100 | | | | | | | | | | | summary: correct compile pb of compile under mingw | | | | | | | | | | | | | | | | | | | | | o changeset: 3182:92b599abe5a0 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 19 09:47:10 2015 +0100 | | | | | | | | | | | summary: correct pb of MPI_Include dir with white space | | | | | | | | | | | | | | | | | | | | | o changeset: 3181:e256198220af | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 18:36:27 2015 +0100 | | | | | | | | | | | summary: coorect pb of -m64 on m32 machine in CNOFLAGS variable | | | | | | | | | | | | | | | | | | | | | o changeset: 3180:f6cdea4cee29 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 17:32:51 2015 +0100 | | | | | | | | | | | summary: coorect pb of libpath in freeyam under windows | | | | | | | | | | | | | | | | | | | | | o changeset: 3179:5d6eb0d3199c | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 16:01:22 2015 +0100 | | | | | | | | | | | summary: coorect missing ; the reisntall hpddm | | | | | | | | | | | | | | | | | | | | | o changeset: 3178:51c21225d5d5 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 15:53:52 2015 +0100 | | | | | | | | | | | summary: coorect pb in reinstall hpddm | | | | | | | | | | | | | | | | | | | | | o changeset: 3177:9d22f6cd1e8f | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 15:34:26 2015 +0100 | | | | | | | | | | | summary: correct typo WITH_PETSC -> WITH_petsc | | | | | | | | | | | | | | | | | | | | | o changeset: 3176:540554a177a1 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 14:58:27 2015 +0100 | | | | | | | | | | | summary: add comment in INNOVATION | | | | | | | | | | | | | | | | | | | | | o changeset: 3175:774b294aa38c | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 14:56:23 2015 +0100 | | | | | | | | | | | summary: coorect pb in case of no hpddm | | | | | | | | | | | | | | | | | | | | | o changeset: 3174:794d0cf537dd | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Tue Feb 17 09:14:52 2015 +0100 | | | | | | | | | | | summary: add airy function of gsl | | | | | | | | | | | | | | | | | | | | | o changeset: 3173:3b5e870dffc3 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 16 17:05:10 2015 +0100 | | | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | | | | | o changeset: 3172:c899a1b95884 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 16 16:49:52 2015 +0100 | | | | | | | | | | | summary: coorect pb of space in mpiexec petc varaible ... | | | | | | | | | | | | | | | | | | | | | o changeset: 3171:6db8bdd3997c | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 16 16:20:19 2015 +0100 | | | | | | | | | | | summary: rebuid AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | | | | | o changeset: 3170:5351790608b3 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 16 16:19:53 2015 +0100 | | | | | | | | | | | summary: correct configure remoev ff_petsc variable | | | | | | | | | | | | | | | | | | | | | o changeset: 3169:dead21419baf | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 16 15:59:37 2015 +0100 | | | | | | | | | | | summary: correct typo in configure of petsc ... | | | | | | | | | | | | | | | | | | | | | o changeset: 3168:841250c6ecc4 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Mon Feb 16 12:51:05 2015 +0100 | | | | | | | | | | | summary: correct find petsc | | | | | | | | | | | | | | | | | | | | | o changeset: 3167:cd84708881af | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 13 19:04:29 2015 +0100 | | | | | | | | | | | summary: correction in caes of no compilion of hpddm | | | | | | | | | | | | | | | | | | | | | o changeset: 3166:2ace2a1eda0b | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 13 15:53:04 2015 +0100 | | | | | | | | | | | summary: correct typo in configure output | | | | | | | | | | | | | | | | | | | | | o changeset: 3165:45280aa09820 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 13 15:43:25 2015 +0100 | | | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | | | | | o changeset: 3164:0d87a638d273 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 13 15:41:24 2015 +0100 | | | | | | | | | | | summary: put change for hpdmm mlk old. Thank P. Jolivet. | | | | | | | | | | | | | | | | | | | | | o changeset: 3163:6510f36c0063 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Fri Feb 13 10:14:01 2015 +0100 | | | | | | | | | | | summary: add reinstall-hpddm targed in downlaod/Makefile | | | | | | | | | | | | | | | | | | | | | o changeset: 3162:cd09add72c31 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 12 18:03:19 2015 +0100 | | | | | | | | | | | summary: correct typo in find petsc | | | | | | | | | | | | | | | | | | | | | o changeset: 3161:2d75c3267da7 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 12 15:41:22 2015 +0100 | | | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | | | | | o changeset: 3160:07a30279fade | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 12 15:11:48 2015 +0100 | | | | | | | | | | | summary: add notify of petsc | | | | | | | | | | | | | | | | | | | | | o changeset: 3159:d71a3cc91c39 | | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | | date: Thu Feb 12 15:04:19 2015 +0100 | | | | | | | | | | | summary: update INNOVATION file | | | | | | | | | | | | | | | | | | | +---o changeset: 3158:7ffe24b7a08d | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | date: Thu Feb 12 15:02:49 2015 +0100 | | | | | | | | | | summary: pass to version 3.34-1 for PETSc interface ans schwarz plugins | | | | | | | | | | | | | | | | | | o | changeset: 3157:83f4a2ab0c5f | | | | | | | | | | user: Frederic Hecht | | | | | | | | | | date: Thu Feb 12 11:20:52 2015 +0100 | | | | | | | | | | summary: coorect problem on version in PETSc interface and MKL for schawtz.cpp | | | | | | | | | | | | | | | | | | o | changeset: 3156:651407885920 | | | | | | | | |/ user: Frederic Hecht | | | | | | | | | date: Thu Feb 12 10:11:33 2015 +0100 | | | | | | | | | summary: correct typo after big change in plugin (now all test works) | | | | | | | | | | | | | | | | | o changeset: 3155:bff13b38aba2 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Feb 12 09:43:26 2015 +0100 | | | | | | | | | summary: Change all int of plugins due to bug on somme allpe version | | | | | | | | | | | | | | | | | o changeset: 3154:e8aa9ceccd60 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 21:34:10 2015 +0100 | | | | | | | | | summary: try of compile schwarz.cpp on all case | | | | | | | | | | | | | | | | | o changeset: 3153:f693d6250f91 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 17:23:21 2015 +0100 | | | | | | | | | summary: remove plot in MPI | | | | | | | | | | | | | | | | | o changeset: 3152:9cbe00fe0e23 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 15:43:46 2015 +0100 | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3151:e6be9d714829 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 15:33:31 2015 +0100 | | | | | | | | | summary: remove libiomp5 if non openmp | | | | | | | | | | | | | | | | | o changeset: 3150:fdef3857f8bf | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 14:45:06 2015 +0100 | | | | | | | | | summary: updet missing file for hpddm | | | | | | | | | | | | | | | | | o changeset: 3149:7a351cbaa77d | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 14:43:09 2015 +0100 | | | | | | | | | summary: coorect pb of compilation of schwarz.cpp plugins in progress. | | | | | | | | | | | | | | | | | o changeset: 3148:f85a44d0ab6d | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 10:28:55 2015 +0100 | | | | | | | | | summary: correct ff-get-dep.in ff-get-dep.awk (pb of new line in awk ) | | | | | | | | | | | | | | | | | o changeset: 3147:bb139ebb5e41 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Feb 10 09:28:35 2015 +0100 | | | | | | | | | summary: rewrite all automatic search of library in awk ad add no mandatory lib like PETSc | | | | | | | | | | | | | | | | | o changeset: 3146:d23e38b06cd6 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Feb 09 18:06:20 2015 +0100 | | | | | | | | | summary: correct missing include seach in ff-get-dep.in for no mandatori libs | | | | | | | | | | | | | | | | | o changeset: 3145:3516b5ecac75 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Feb 06 18:18:00 2015 +0100 | | | | | | | | | summary: update download/Makefile.am | | | | | | | | | | | | | | | | | o changeset: 3144:b6ce652f34d1 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Feb 06 18:10:17 2015 +0100 | | | | | | | | | summary: add install de hpddm ... | | | | | | | | | | | | | | | | | o changeset: 3143:54b79f51069b | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Feb 06 14:43:16 2015 +0100 | | | | | | | | | summary: correct bad LIB_MPI in scotch | | | | | | | | | | | | | | | | | o changeset: 3142:1faabfce37d3 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Feb 06 14:07:59 2015 +0100 | | | | | | | | | summary: add no mandatoring lib in automatic lib search (WHERE-LIb search) | | | | | | | | | | | | | | | | | o changeset: 3141:d7420bb1718d | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Feb 06 11:50:52 2015 +0100 | | | | | | | | | summary: do lot of correction for new install version 3.24 | | | | | | | | | | | | | | | | | o changeset: 3140:ad567d1f75ac | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Feb 05 21:40:31 2015 +0100 | | | | | | | | | summary: correct acmpi for pb sgi mpicc | | | | | | | | | | | | | | | | | o changeset: 3139:d2144a73ee94 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Feb 05 09:47:20 2015 +0100 | | | | | | | | | summary: correct problem when find c++11 version in configure | | | | | | | | | | | | | | | | | o changeset: 3138:d777e1cc38d4 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 16:02:54 2015 +0100 | | | | | | | | | summary: remove a madatory 3d test | | | | | | | | | | | | | | | | | o changeset: 3137:ae6b05ca1182 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 15:49:33 2015 +0100 | | | | | | | | | summary: continue coorect double free | | | | | | | | | | | | | | | | | o changeset: 3136:d52565e53a04 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 15:01:45 2015 +0100 | | | | | | | | | summary: correct pb 2 free in bamg | | | | | | | | | | | | | | | | | o changeset: 3135:e2d7867ffd31 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 14:51:08 2015 +0100 | | | | | | | | | summary: correct typo | | | | | | | | | | | | | | | | | o changeset: 3134:e59974780d33 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 14:45:46 2015 +0100 | | | | | | | | | summary: remove of pb of 2 free un bamg in case of crossing boundary | | | | | | | | | | | | | | | | | o changeset: 3133:dfe9ee56d630 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 14:12:53 2015 +0100 | | | | | | | | | summary: change for c++-11 and hdf5 with g++-4.9.1 | | | | | | | | | | | | | | | | | o changeset: 3132:d7e83d234408 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 09:59:26 2015 +0100 | | | | | | | | | summary: correct jn call for c++11 | | | | | | | | | | | | | | | | | o changeset: 3131:c1663877ad52 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 30 09:57:04 2015 +0100 | | | | | | | | | summary: coorect pow of c++-11 compiler | | | | | | | | | | | | | | | | | o changeset: 3130:e1174bba7a16 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 29 10:31:52 2015 +0100 | | | | | | | | | summary: coorect pb with pclose call | | | | | | | | | | | | | | | | | o changeset: 3129:1af654663cff | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 29 10:01:11 2015 +0100 | | | | | | | | | summary: add correct of pb compilation undec g++ 4.8.1 c++-11 | | | | | | | | | | | | | | | | | o changeset: 3128:084f6138edba | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 16 21:10:43 2015 +0100 | | | | | | | | | summary: add schwarz.edp and add AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3127:4edf8d6dd064 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 16 21:05:34 2015 +0100 | | | | | | | | | summary: cadd schwarz.edp test | | | | | | | | | | | | | | | | | o changeset: 3126:40891f8e170d | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 16 20:39:09 2015 +0100 | | | | | | | | | summary: correct configure.ac to compile plugin schwarz with PETSc | | | | | | | | | | | | | | | | | o changeset: 3125:397a0e0b089f | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Jan 16 17:16:29 2015 +0100 | | | | | | | | | summary: add petsc in configure (first test) | | | | | | | | | | | | | | | | | o changeset: 3124:695d108081da | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 16:54:43 2015 +0100 | | | | | | | | | summary: correct pb compile e new schwarz pluging | | | | | | | | | | | | | | | | | o changeset: 3123:84eadda9ec1e | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 15:55:21 2015 +0100 | | | | | | | | | summary: add schwarz interface | | | | | | | | | | | | | | | | | o changeset: 3122:fb3f97e0b7ad | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 15:25:14 2015 +0100 | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3121:4e9df821cdd8 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 15:24:15 2015 +0100 | | | | | | | | | summary: add new cpu type on apple | | | | | | | | | | | | | | | | | o changeset: 3120:18f455b5dd91 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 15:14:33 2015 +0100 | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3119:f2a508d27a6d | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 15:12:02 2015 +0100 | | | | | | | | | summary: add cxx11 chech | | | | | | | | | | | | | | | | | o changeset: 3118:89604c8d20bb | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 11:04:51 2015 +0100 | | | | | | | | | summary: correct build/download to follow link in case of curl usage.. | | | | | | | | | | | | | | | | | o changeset: 3117:1356c66b9164 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Jan 15 08:22:32 2015 +0100 | | | | | | | | | summary: correct pb on depot | | | | | | | | | | | | | | | | | o changeset: 3116:ed9ccb5032ff | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 22:49:44 2015 +0100 | | | | | | | | | summary: coorect examples++-load/include dir construction | | | | | | | | | | | | | | | | | o changeset: 3115:034691a4deff | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 22:34:43 2015 +0100 | | | | | | | | | summary: correct reconstrion for examples++-load/include | | | | | | | | | | | | | | | | | o changeset: 3114:c180b6d013fd | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 22:01:23 2015 +0100 | | | | | | | | | summary: add missing file | | | | | | | | | | | | | | | | | o changeset: 3113:ae32ce3d21c3 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 21:31:46 2015 +0100 | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3112:3201f396e00c | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 21:30:17 2015 +0100 | | | | | | | | | summary: correct src/bamg/Makefile.am for hdf5 tools | | | | | | | | | | | | | | | | | o changeset: 3111:3cdca031639a | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 21:19:27 2015 +0100 | | | | | | | | | summary: add missing file | | | | | | | | | | | | | | | | | o changeset: 3110:cf15bbc40e87 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Jan 13 21:08:20 2015 +0100 | | | | | | | | | summary: add hd5 and xml stuff. | | | | | | | | | | | | | | | | | o changeset: 3109:be503a9f1ff3 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Dec 15 14:52:58 2014 +0100 | | | | | | | | | summary: put modif un lg.ypp not in lg.tab.cpp | | | | | | | | | | | | | | | | | o changeset: 3108:1f630ba53655 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Dec 15 14:17:33 2014 +0100 | | | | | | | | | summary: add missing option in plot | | | | | | | | | | | | | | | | | o changeset: 3107:77a71b1b2901 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Sat Dec 13 21:14:08 2014 +0100 | | | | | | | | | summary: correct memory leak | | | | | | | | | | | | | | | | | o changeset: 3106:e18aa16a8edf | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Sat Dec 13 14:53:47 2014 +0100 | | | | | | | | | summary: correct typo for c++11 >> | | | | | | | | | | | | | | | | | o changeset: 3105:0094d2a7433d | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Dec 12 20:53:16 2014 +0100 | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz and a P. Patch for | | | | | | | | | | | | | | | | | o changeset: 3104:5d5d0f7cbcfc | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Dec 12 10:40:06 2014 +0100 | | | | | | | | | summary: correct lot of memory leak in case of | | | | | | | | | | | | | | | | | o changeset: 3103:e7c44e31bf18 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Dec 11 20:48:28 2014 +0100 | | | | | | | | | summary: correct memory leack | | | | | | | | | | | | | | | | | o changeset: 3102:768c07a126f7 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Dec 08 09:37:21 2014 +0100 | | | | | | | | | summary: add file fore hpddm interface | | | | | | | | | | | | | | | | | o changeset: 3101:fb9b853f36b3 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Nov 28 13:43:55 2014 +0100 | | | | | | | | | summary: correct ff_finalmize | | | | | | | | | | | | | | | | | o changeset: 3100:b47f510056e4 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Nov 28 12:06:48 2014 +0100 | | | | | | | | | summary: add function ff_finalize | | | | | | | | | | | | | | | | | o changeset: 3099:913a0e471dca | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Nov 26 08:18:43 2014 +0100 | | | | | | | | | summary: add missing files | | | | | | | | | | | | | | | | | o changeset: 3098:78b5f9947030 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Nov 26 08:13:09 2014 +0100 | | | | | | | | | summary: pass to version 3.33 | | | | | | | | | | | | | | | | | o changeset: 3097:492928d72946 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Nov 26 08:10:21 2014 +0100 | | | | | | | | | summary: begin of PETSc integration | | | | | | | | | | | | | | | | | o changeset: 3096:e5f2eccb8503 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Nov 14 23:03:05 2014 +0100 | | | | | | | | | summary: correct bug in periodic B.C ( some time loop) | | | | | | | | | | | | | | | | | o changeset: 3095:3ed7375fbf91 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Nov 14 09:12:19 2014 +0100 | | | | | | | | | summary: remove debug call xxxx() | | | | | | | | | | | | | | | | | o changeset: 3094:82be1c76fe42 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Nov 14 09:11:12 2014 +0100 | | | | | | | | | summary: correct bug array growing behaves differently on Linux and Mac | | | | | | | | | | | | | | | | | o changeset: 3093:eecf0e60f9f5 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Nov 12 16:28:08 2014 +0100 | | | | | | | | | summary: add check on vol tet in readmesh3 | | | | | | | | | | | | | | | | | o changeset: 3092:fa4384bf86b4 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Nov 07 14:30:36 2014 +0100 | | | | | | | | | summary: correct pb under window in load.cpp (no dlerror) | | | | | | | | | | | | | | | | | o changeset: 3091:0a4c31444a80 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Tue Nov 04 10:58:24 2014 +0100 | | | | | | | | | summary: correct md5 code of OpenBlas.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3090:5da39542e29b | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Nov 03 21:46:43 2014 +0100 | | | | | | | | | summary: Added tag 3.28 for changeset af4fbbef4ecd | | | | | | | | | | | | | | | | | o changeset: 3089:02abe57a6937 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Nov 03 21:46:28 2014 +0100 | | | | | | | | | summary: Added tag 3.27 for changeset 4c7506b5ac6c | | | | | | | | | | | | | | | | | o changeset: 3088:641a8e0bee7c | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Nov 03 21:44:16 2014 +0100 | | | | | | | | | summary: Added tag 3.29 for changeset d7efc421b561 | | | | | | | | | | | | | | | | | o changeset: 3087:acd6c3b0c193 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Nov 03 21:42:37 2014 +0100 | | | | | | | | | summary: Added tag 3.32 for changeset d324bac28890 | | | | | | | | | | | | | | | | | o changeset: 3086:edda4017be2b | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Nov 03 21:40:19 2014 +0100 | | | | | | | | | summary: Added tag 3.31-2 for changeset a7eb0c2116df | | | | | | | | | | | | | | | | | o changeset: 3085:94b8a1970489 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Nov 03 21:39:58 2014 +0100 | | | | | | | | | summary: Added tag 3.31-3 for changeset 4e164226411d | | | | | | | | | | | | | | | | | o changeset: 3084:248ae9751459 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Oct 30 08:43:56 2014 +0100 | | | | | | | | | summary: thanck to V. Huber to take care of the verbosity level. | | | | | | | | | | | | | | | | | o changeset: 3083:4ad6b556e1cb | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Oct 29 19:10:00 2014 +0100 | | | | | | | | | summary: passversion to 3.32-1 | | | | | | | | | | | | | | | | | o changeset: 3082:2047e74a7fd2 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Oct 29 19:05:50 2014 +0100 | | | | | | | | | summary: a compuation of dx,dy in Element_PkEdge | | | | | | | | | | | | | | | | | o changeset: 3081:39d9338aa60a | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Oct 29 17:10:40 2014 +0100 | | | | | | | | | summary: coorect plugin | | | | | | | | | | | | | | | | | o changeset: 3080:ab0bad526b7a | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Oct 22 11:47:55 2014 +0200 | | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | | | | | | | o changeset: 3079:adf7ec4e0148 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Wed Oct 22 11:47:16 2014 +0200 | | | | | | | | | summary: add correction of P. Jolivet. | | | | | | | | | | | | | | | | | o changeset: 3078:d29757759e08 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Mon Oct 20 21:30:08 2014 +0200 | | | | | | | | | summary: add correct launchff++ add ++d parameter for debuggin | | | | | | | | | | | | | | | | | o changeset: 3077:df774c8536bf | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Oct 17 10:54:18 2014 +0200 | | | | | | | | | summary: update INNOVATION | | | | | | | | | | | | | | | | | o changeset: 3076:9ad9343d75d5 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Oct 17 10:53:01 2014 +0200 | | | | | | | | | summary: correct big big in memory manageemnt of sparse matrix Matrice_Creuse | | | | | | | | | | | | | | | | | o changeset: 3075:7e28b3a59725 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Oct 16 22:42:59 2014 +0200 | | | | | | | | | summary: correct pb of factorisation | | | | | | | | | | | | | | | | | o changeset: 3074:a216bad8d511 | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Thu Oct 16 22:39:31 2014 +0200 | | | | | | | | | summary: correct type add remove file | | | | | | | | | +---------------o changeset: 3073:89d2902eadca | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Oct 16 22:36:24 2014 +0200 | | | | | | | | summary: correct typo and remove test .. | | | | | | | | o-----------+ | changeset: 3072:d4af5fcecb25 | | | | | | | user: Frederic Hecht / / / / / / / date: Thu Oct 16 18:30:25 2014 +0200 | | | | | | | summary: add check \ escape on string "\z" -> z "\\" -> \ "\"" -> " | | | | | | | | | | | | o | changeset: 3071:d324bac28890 | | | | | | | tag: 3.32 | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Oct 16 16:33:01 2014 +0200 | | | | | | | summary: coorect size on arrow in plot .. | | | | | | | | | | | | o | changeset: 3070:50157156eec4 | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Oct 01 16:14:50 2014 +0200 | | | | | | | summary: correct PARDISO / omp interface un uv100 | | | | | | | | | | | | o | changeset: 3069:828f65161d32 | | | | | |/ user: Frederic Hecht | | | | | | date: Tue Sep 16 17:23:35 2014 +0200 | | | | | | summary: coorect type in parms interface | | | | | | | | | | | o changeset: 3068:8d8432eea0df | | | | | | user: Frederic Hecht | | | | | | date: Tue Sep 16 17:01:19 2014 +0200 | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | o changeset: 3067:0bffd0452ab7 | | | | | | user: Frederic Hecht | | | | | | date: Tue Sep 16 16:58:05 2014 +0200 | | | | | | summary: add MUMPS plugin as MUMPS_seq plug without mpi | | | | | | | | | | | o changeset: 3066:defe4e954307 | | | | | | user: Frederic Hecht | | | | | | date: Tue Sep 16 16:50:45 2014 +0200 | | | | | | summary: update getall for davis web site change | | | | | | | | | | | o changeset: 3065:15f28ab62c85 | | | | | | user: Frederic Hecht | | | | | | date: Tue Sep 16 16:00:57 2014 +0200 | | | | | | summary: update getall ofr change SuiteSparse change web site. | | | | | | | | | | | o changeset: 3064:ec7869984007 | | | | | | user: Frederic Hecht | | | | | | date: Tue Sep 16 15:16:41 2014 +0200 | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | | | o changeset: 3063:3086bae92306 | | | | | | user: Frederic Hecht | | | | | | date: Tue Sep 16 15:15:30 2014 +0200 | | | | | | summary: correct environment.cpp and Makefile.am to find and put plugin for mpi | | | | | | | | | | | o changeset: 3062:1dfbc3cec7ed | | | | |/ user: Frederic Hecht | | | | | date: Tue Sep 16 13:57:17 2014 +0200 | | | | | summary: clean return value of /clean_all_installed_ffpp.sh for mac installer | | | | | | | | | o changeset: 3061:5f22bdd00e0e | | | | | user: Frederic Hecht | | | | | date: Tue Sep 16 13:51:01 2014 +0200 | | | | | summary: add missing chaneg | | | | | | | | | o changeset: 3060:3e57363e9da8 | | | | | user: Frederic Hecht | | | | | date: Tue Sep 16 13:49:36 2014 +0200 | | | | | summary: next step for mpi plugin | | | | | | | | | o changeset: 3059:8a87f28ed7f5 | | | | | user: Frederic Hecht | | | | | date: Tue Sep 16 11:22:47 2014 +0200 | | | | | summary: correct MUMPS plugin complex version | | | | | | | | | o changeset: 3058:2d9d48374ec8 | | | | | user: Frederic Hecht | | | | | date: Mon Sep 01 14:48:27 2014 +0200 | | | | | summary: add vectoral operator line v/a (resp. a/v- == v_i/a (resp. a/v_i) | | | | | | | | | o changeset: 3057:e471d8a2ae32 | | | | | user: Frederic Hecht | | | | | date: Tue Aug 26 11:45:47 2014 +0200 | | | | | summary: missing file in distribution. | | | | | | | | | o changeset: 3056:d9e53bbab3af | | | | | user: Frederic Hecht | | | | | date: Mon Aug 25 17:23:15 2014 +0200 | | | | | summary: crrect pb in chech un window | | | | | | | | | o changeset: 3055:f302c03c8ae7 | | | | | user: Frederic Hecht | | | | | date: Mon Aug 25 16:36:06 2014 +0200 | | | | | summary: coorect a bug in buildlayer in case of 0 edge on border... | | | | | | | | | o changeset: 3054:d23ac6140622 | | | | | user: Frederic Hecht | | | | | date: Sat Aug 23 08:08:30 2014 +0200 | | | | | summary: pass to ersion 3.31-3 | | | | | | | | | o changeset: 3053:4e164226411d | | | | | tag: 3.31-3 | | | | | user: Frederic Hecht | | | | | date: Tue Aug 12 23:19:52 2014 +0200 | | | | | summary: coorect of array size in plot | | | | | | | | | o changeset: 3052:a7eb0c2116df | | | | | tag: 3.31-2 | | | | | user: Frederic Hecht | | | | | date: Fri Jul 11 21:17:26 2014 +0200 | | | | | summary: correct iter in stop function in CG | | | | | | | | | o changeset: 3051:d267356f183c | | | | | user: Frederic Hecht | | | | | date: Fri Jul 11 14:57:05 2014 +0200 | | | | | summary: add script for installation | | | | | | | | | o changeset: 3050:e63d8e10315a | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 22:32:46 2014 +0200 | | | | | summary: chech !! | | | | | | | | | o changeset: 3049:3a79062ffe5c | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 22:25:07 2014 +0200 | | | | | summary: coorect typo | | | | | | | | | o changeset: 3048:402527913245 | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 22:23:35 2014 +0200 | | | | | summary: add missing file | | | | | | | | | o changeset: 3047:4b5c501566f6 | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 22:00:44 2014 +0200 | | | | | summary: update INNOVATION | | | | | | | | | o changeset: 3046:5705d48950bd | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 21:45:46 2014 +0200 | | | | | summary: correct pb ConjuguedGradient introduct this afternoon (kprint==0) | | | | | | | | | o changeset: 3045:d3f01b55f65d | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 21:23:36 2014 +0200 | | | | | summary: correct bug put in DG formulation (rev 3044) | | | | | | | | | o changeset: 3044:010dd06d2876 | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 16:59:09 2014 +0200 | | | | | summary: remove template initialisation of stopgc .. | | | | | | | | | o changeset: 3043:27a77d0f60c9 | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 10:45:24 2014 +0200 | | | | | summary: pass to version 3.31-1 | | | | | | | | | o changeset: 3042:00d0f665141f | | | | | user: Frederic Hecht | | | | | date: Thu Jul 10 10:41:50 2014 +0200 | | | | | summary: add stop function for adapted test ... si doc and iNNVATION file | | | | | | | | | o changeset: 3041:074b99969ce5 | | | | | user: Frederic Hecht | | | | | date: Wed Jul 09 16:31:08 2014 +0200 | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | o changeset: 3040:5a06d3054622 | | | | | user: Frederic Hecht | | | | | date: Wed Jul 09 16:30:03 2014 +0200 | | | | | summary: correct problem whitc zdotc on MacOS | | | | | | | | | o changeset: 3039:ae09f5411c83 | | | | | user: Frederic Hecht | | | | | date: Wed Jul 09 09:10:01 2014 +0200 | | | | | summary: update INNOVATION | | | | | | | | | o changeset: 3038:3eab3ae21140 | | | | | user: Frederic Hecht | | | | | date: Wed Jul 09 08:22:07 2014 +0200 | | | | | summary: add function matricx for eigein value | | | | | | | | | o changeset: 3037:794839c2a7cd | | | | | user: Frederic Hecht | | | | | date: Thu Jul 03 18:57:21 2014 +0200 | | | | | summary: end of corecttion of LinearGMRES and AffineGMREs | | | | | | | | | o changeset: 3036:371512bac93d | | | | | user: Frederic Hecht | | | | | date: Thu Jul 03 13:00:34 2014 +0200 | | | | | summary: correct a big big in LinearGMRES (thank to franco@us.es) | | | | | | | | | o changeset: 3035:b412d75b60bd | | | | | user: Frederic Hecht | | | | | date: Wed Jul 02 10:39:35 2014 +0200 | | | | | summary: add missing plugin in MeshSurface.idp | | | | | | | | | o changeset: 3034:0888dfd0dc61 | | | | | user: Frederic Hecht | | | | | date: Wed Jul 02 10:31:04 2014 +0200 | | | | | summary: correct typo | | | | | | | | | o changeset: 3033:bb189e3f0ea3 | | | | | user: Frederic Hecht | | | | | date: Wed Jul 02 10:29:53 2014 +0200 | | | | | summary: correct misstake in examples++-3d/MeshSurface.idp | | | | | | | | | o changeset: 3032:1e34d36052ec | | | | | user: Frederic Hecht | | | | | date: Tue Jul 01 19:19:48 2014 +0200 | | | | | summary: add '=' for pickinhg on macos on medit.. | | | | | | | | | o changeset: 3031:aadbdf882d72 | | | | | user: Frederic Hecht | | | | | date: Tue Jul 01 18:30:28 2014 +0200 | | | | | summary: correct getall add -h parameter ... | | | | | | | | | o changeset: 3030:dbde96404949 | | | | | user: Frederic Hecht | | | | | date: Tue Jul 01 15:23:05 2014 +0200 | | | | | summary: add '=' in medit for picking on mac.. | | | | | | | | | o changeset: 3029:ff74fea8d8e7 | | | | | user: Frederic Hecht | | | | | date: Mon Jun 30 10:03:47 2014 +0200 | | | | | summary: correct bug in jump in case 1d problem | | | | | | | | | o changeset: 3028:96d648cf5661 | | | | | user: Frederic Hecht | | | | | date: Sun Jun 29 22:39:20 2014 +0200 | | | | | summary: coorect bug in change in DG matrice construction in case periodic | | | | | | | | | o changeset: 3027:28131940d86b | | | | | user: Frederic Hecht | | | | | date: Thu Jun 26 11:48:52 2014 +0200 | | | | | summary: add new example of C1 approximation witn HCT ... | | | | | | | | | o changeset: 3026:b468fda53b82 | | | | | user: Frederic Hecht | | | | | date: Wed Jun 25 18:42:56 2014 +0200 | | | | | summary: correct pb with freefem++-nw know no graphic). | | | | | | | | | o changeset: 3025:c9f9ed1fd403 | | | | | user: Frederic Hecht | | | | | date: Wed Jun 18 22:01:26 2014 +0200 | | | | | summary: correct PARDISO.cpp to compile on Mac. | | | | | | | | | o changeset: 3024:c9ebcf863ae0 | | | | | user: Frederic Hecht | | | | | date: Wed Jun 18 21:48:29 2014 +0200 | | | | | summary: correct error in gsl.edp | | | | | | | | | o changeset: 3023:fe129f0a04a7 | | | | | user: Frederic Hecht | | | | | date: Wed Jun 18 21:19:06 2014 +0200 | | | | | summary: correct Makefine.am | | | | | | | | | o changeset: 3022:fe328b42b0bf | | | | | user: Frederic Hecht | | | | | date: Wed Jun 18 21:13:42 2014 +0200 | | | | | summary: correct typo (missing ; ) | | | | | | | | | o changeset: 3021:796a520a31f6 | | | | | user: Frederic Hecht | | | | | date: Wed Jun 18 21:09:55 2014 +0200 | | | | | summary: correct INNOVATION. | | | | | | | | | o changeset: 3020:09dd923712b9 | | | | | user: Frederic Hecht | | | | | date: Wed Jun 18 21:07:28 2014 +0200 | | | | | summary: add new plugin to make some binary io, will be | | | | | | | | | o changeset: 3019:ff55bb4a608f | | | | | user: Frederic Hecht | | | | | date: Fri May 16 13:53:06 2014 +0200 | | | | | summary: try correct comile pb on UV100 | | | | | | | | | o changeset: 3018:9c600978774d | | | | | user: Frederic Hecht | | | | | date: Fri May 16 13:37:51 2014 +0200 | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | o changeset: 3017:2952e5f96558 | | | | | user: Frederic Hecht | | | | | date: Fri May 16 12:46:05 2014 +0200 | | | | | summary: add levelset integral and pass to version 3.30-1 in 3d | | | | | | | | | o changeset: 3016:07b402a63c90 | | | | | user: Frederic Hecht | | | | | date: Wed May 07 21:21:05 2014 +0200 | | | | | summary: correct pb in BEC plugin ( function denpendint of x,y,z point .. | | | | | | | | | o changeset: 3015:1aea517bacce | | | | | user: Frederic Hecht | | | | | date: Wed May 07 16:14:10 2014 +0200 | | | | | summary: add new plugins for BEC | | | | | | | | | o changeset: 3014:ba2508484995 | | | | | user: Frederic Hecht | | | | | date: Mon Apr 28 14:50:11 2014 +0200 | | | | | summary: remove spurioux cout in ffglut (00) | | | | | | | | | o changeset: 3013:bdf2b6da5050 | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 10:29:07 2014 +0200 | | | | | summary: add binary mode file type | | | | | | | | | o changeset: 3012:525001ac8cfc | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 09:30:04 2014 +0200 | | | | | summary: add rev in innovation | | | | | | | | | o changeset: 3011:59412345af2f | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 09:28:09 2014 +0200 | | | | | summary: remove DEBUG print to find a bug in examples++-tutorial/periodic4.edp | | | | | | | | | o changeset: 3010:0aef24b50bbc | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 01:41:01 2014 +0200 | | | | | summary: correct typo | | | | | | | | | o changeset: 3009:127d0bf1147d | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 01:35:04 2014 +0200 | | | | | summary: add dump | | | | | | | | | o changeset: 3008:dd22333aaf2a | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 01:25:38 2014 +0200 | | | | | summary: next | | | | | | | | | o changeset: 3007:f0183dc26132 | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 01:13:09 2014 +0200 | | | | | summary: correct type in dump | | | | | | | | | o changeset: 3006:178ac8a66957 | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 01:11:06 2014 +0200 | | | | | summary: add dump | | | | | | | | | o changeset: 3005:2d95c7cc3a39 | | | | | user: Frederic Hecht | | | | | date: Thu Apr 24 01:02:10 2014 +0200 | | | | | summary: add bug in Builmesh. | | | | | | | | | o changeset: 3004:f445e1459c72 | | | | | user: Frederic Hecht | | | | | date: Wed Apr 23 17:30:18 2014 +0200 | | | | | summary: version of the distribution 3.30 | | | | | | | | | o changeset: 3003:ed040aa51a0a | | | | | user: Frederic Hecht | | | | | date: Wed Apr 23 16:56:47 2014 +0200 | | | | | summary: coorect type in doc zero -> two in def of nTonEdge | | | | | | | | | o changeset: 3002:d3e4511ca0d7 | | | | | user: Frederic Hecht | | | | | date: Wed Apr 23 16:33:00 2014 +0200 | | | | | summary: correct DOC version | | | | | | | | | o changeset: 3001:10f137760625 | | | | | user: Frederic Hecht | | | | | date: Wed Apr 23 16:29:23 2014 +0200 | | | | | summary: update the doc for multy border ... | | | | | | | | | o changeset: 3000:c9a1eac26e35 | | | | | user: Frederic Hecht | | | | | date: Wed Apr 23 14:34:58 2014 +0200 | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | o changeset: 2999:ab3683b70e74 | | | | | user: Frederic Hecht | | | | | date: Wed Apr 23 14:33:22 2014 +0200 | | | | | summary: add multy border , past to version 3.30 .. | | | | | | | | | o changeset: 2998:b7cb347b18f3 | | | | | user: Frederic Hecht | | | | | date: Tue Apr 22 23:11:38 2014 +0200 | | | | | summary: avant un multy border and comment the test .. in mesh.edp | | | | | | | | | o changeset: 2997:03fb3a6a9894 | | | | | user: Frederic Hecht | | | | | date: Tue Apr 22 16:53:26 2014 +0200 | | | | | summary: coorect pb of free not alloc pionter in mmg3d4-0 | | | | | | | | | o changeset: 2996:6958d44d16e8 | | | | | user: Frederic Hecht | | | | | date: Fri Apr 11 15:15:07 2014 +0200 | | | | | summary: remove cout in RT1 2d Finite elemnt | | | | | | | | | o changeset: 2995:57603195ad5d | | | | | user: Frederic Hecht | | | | | date: Wed Apr 09 08:50:57 2014 +0100 | | | | | summary: add tools for Quadrature formular. | | | | | | | | | o changeset: 2994:281a9fa7e47e | | | | | user: Frederic Hecht | | | | | date: Wed Mar 26 09:00:43 2014 +0100 | | | | | summary: remove crazy output in lapack.cpp and fflapack.cpp | | | | | | | | | o changeset: 2993:46fd913b30cf | | | | | user: Frederic Hecht | | | | | date: Mon Mar 24 15:08:45 2014 +0100 | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | o changeset: 2992:2036c6a948fd | | | | | user: Frederic Hecht | | | | | date: Fri Mar 21 18:39:08 2014 +0100 | | | | | summary: add tools for integrale with levelset (under ) in 2d .. | | | | | | | | | o changeset: 2991:7ded401a2b84 | | | | | user: Frederic Hecht | | | | | date: Thu Mar 20 15:12:23 2014 +0100 | | | | | summary: remve double def of R in P1IsoValue.cpp | | | | | | | | | o changeset: 2990:555bf81333d6 | | | | | user: Frederic Hecht | | | | | date: Mon Mar 17 09:27:01 2014 +0100 | | | | | summary: add tool to compute volume under levelset arealevelset , volumelevelset | | | | | | | | | o changeset: 2989:935cf6997964 | | | | | user: Frederic Hecht | | | | | date: Mon Mar 17 09:21:26 2014 +0100 | | | | | summary: add tools of mesure doamine def by levelset | | | | | | | | | o changeset: 2988:e898b08ccf2f | | | | | user: Frederic Hecht | | | | | date: Fri Mar 14 17:36:59 2014 +0100 | | | | | summary: correct mistake in include P1IsoValue.hpp | | | | | | | | | o changeset: 2987:a7813b0a1b9b | | | | | user: Frederic Hecht | | | | | date: Fri Mar 14 17:23:34 2014 +0100 | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | o changeset: 2986:69fe85e411a0 | | | | | user: Frederic Hecht | | | | | date: Fri Mar 14 11:19:22 2014 +0100 | | | | | summary: try empty matrix in MUMPS => dono works .. | | | | | +-------o changeset: 2985:03b6d8003a47 | | | | user: Frederic Hecht | | | | date: Fri Mar 14 11:09:15 2014 +0100 | | | | summary: put empty matrix in set if need | | | | o | | | changeset: 2984:9afbc88823c8 |/ / / user: Frederic Hecht | | | date: Fri Mar 14 10:33:44 2014 +0100 | | | summary: correct mistake in MUMPS.cpp (plugin) | | | o | | changeset: 2983:2e43d499a8b3 | | | user: Frederic Hecht | | | date: Wed Mar 12 15:45:02 2014 +0100 | | | summary: update rev innovatiop | | | o | | changeset: 2982:5433ef595dd2 | | | user: Frederic Hecht | | | date: Wed Mar 12 15:43:56 2014 +0100 | | | summary: coorect type and memory mistake in fftime function | | | o | | changeset: 2981:5cc256ed2a1b | | | user: Frederic Hecht | | | date: Wed Mar 12 15:12:16 2014 +0100 | | | summary: add rev in INNOVATIOn | | | o | | changeset: 2980:25666438652f | | | user: Frederic Hecht | | | date: Wed Mar 12 15:10:46 2014 +0100 | | | summary: add macro generation stuff like Stringification,FILE, LINE si INNIVATION, | | | o | | changeset: 2979:35727886f469 | | | user: Frederic Hecht | | | date: Wed Mar 12 08:50:41 2014 +0100 | | | summary: add int on levelset for sym matrix, | | | o | | changeset: 2978:057aed9a37d3 | | | user: Frederic Hecht | | | date: Tue Mar 11 21:16:20 2014 +0100 | | | summary: rebuild include.tar.gz | | | o | | changeset: 2977:f68fc8801d7c | | | user: Frederic Hecht | | | date: Tue Mar 11 21:06:37 2014 +0100 | | | summary: add tools to compute int on levelset | | | o | | changeset: 2976:f6777db44f02 | | | user: Frederic Hecht | | | date: Tue Mar 11 21:04:37 2014 +0100 | | | summary: add tool to compute int on levelset | | | o | | changeset: 2975:2384ccefae8e | | | user: Frederic Hecht | | | date: Fri Mar 07 13:40:31 2014 +0100 | | | summary: add bace cube function . | | | o | | changeset: 2974:9b8b469c4f18 | | | user: Frederic Hecht | | | date: Fri Mar 07 11:52:08 2014 +0100 | | | summary: update INNIVATION | | | o | | changeset: 2973:d7efc421b561 | | | tag: 3.29 | | | user: Frederic Hecht | | | date: Thu Mar 06 17:01:11 2014 +0100 | | | summary: rebuild AutoGeneratedFile.tar.gz | | | o | | changeset: 2972:566f7ef75969 | | | user: Frederic Hecht | | | date: Thu Mar 06 16:54:04 2014 +0100 | | | summary: coorect type compilepkg in arpack makefile | | | o | | changeset: 2971:51d803f66704 | | | user: Frederic Hecht | | | date: Thu Mar 06 16:07:42 2014 +0100 | | | summary: coorect problem we getall script | | | o | | changeset: 2970:be94e3caaa45 | | | user: Frederic Hecht | | | date: Thu Mar 06 12:11:29 2014 +0100 | | | summary: coorect install pb in linux for next distribution | | | o | | changeset: 2969:605daf8c95fd | | | user: Frederic Hecht | | | date: Thu Mar 06 11:00:15 2014 +0100 | | | summary: missing file in dist lgmesh.hpp | | | o | | changeset: 2968:846a6a5f1192 | | | user: Frederic Hecht | | | date: Thu Mar 06 09:54:54 2014 +0100 | | | summary: rebuild AutoGeneratedFile.tar.gz | | | o | | changeset: 2967:d95584630180 | | | user: Frederic Hecht | | | date: Thu Mar 06 09:53:23 2014 +0100 | | | summary: correct make dist target in blas ... | | | o | | changeset: 2966:094e01f7c642 | | | user: Frederic Hecht | | | date: Wed Mar 05 19:26:11 2014 +0100 | | | summary: coorect pb of recomple mmg3d if the patch change | | | o | | changeset: 2965:a209379da038 | | | user: Frederic Hecht | | | date: Wed Mar 05 18:45:23 2014 +0100 | | | summary: leak mmg3d next step | | | o | | changeset: 2964:e6f8ef801100 | | | user: Frederic Hecht | | | date: Wed Mar 05 18:19:57 2014 +0100 | | | summary: try memory leal mmg3d v4 | | | o | | changeset: 2963:e342d40ce4dd | | | user: Frederic Hecht | | | date: Wed Mar 05 15:40:39 2014 +0100 | | | summary: coorect mshmet leak memory problem | | | o | | changeset: 2962:6d042cb544d6 | | | user: Frederic Hecht | | | date: Wed Mar 05 13:29:09 2014 +0100 | | | summary: correct typo | | | o | | changeset: 2961:52a5fe2df2b2 | | | user: Frederic Hecht | | | date: Wed Mar 05 13:17:57 2014 +0100 | | | summary: build AutoGeneratedFile.tar.gz | | | o | | changeset: 2960:66c20b1178c9 | | | user: Frederic Hecht | | | date: Wed Mar 05 13:17:25 2014 +0100 | | | summary: add stuff of get memory storage info on mac and linux | | | o | | changeset: 2959:c3e4ab8a0afa | | | user: Frederic Hecht | | | date: Wed Mar 05 11:13:33 2014 +0100 | | | summary: correct mshmet dependec | | | o | | changeset: 2958:cab0cb8d1f99 | | | user: Frederic Hecht | | | date: Wed Mar 05 11:10:13 2014 +0100 | | | summary: correct typo error | | | o | | changeset: 2957:82ad0bd4632f | | | user: Frederic Hecht | | | date: Wed Mar 05 11:06:15 2014 +0100 | | | summary: add tool to find memery leak storageused function .. | | | o | | changeset: 2956:a39fe4a9f5b6 | | | user: Frederic Hecht | | | date: Mon Mar 03 23:44:35 2014 +0100 | | | summary: correct memory leak in mshmet inferface | | | o | | changeset: 2955:5628f1212fad | | | user: Frederic Hecht | | | date: Sun Mar 02 21:45:36 2014 +0100 | | | summary: rebuild AutoGeneratedFile.tar.gz | | | o | | changeset: 2954:a778070d5256 | | | user: Frederic Hecht | | | date: Sun Mar 02 21:36:21 2014 +0100 | | | summary: add uninstall-ff++ script freefem++ | | | o | | changeset: 2953:6f5b01300095 | | | user: Frederic Hecht | | | date: Sun Mar 02 21:16:32 2014 +0100 | | | summary: rebuild AutoGeneratedFile.tar.gz | | | o | | changeset: 2952:2f5eebee8e67 | | | user: Frederic Hecht | | | date: Sun Mar 02 21:12:13 2014 +0100 | | | summary: correct pb in evalution jump of region number | | | o | | changeset: 2951:f1064e46586e | | | user: Frederic Hecht | | | date: Tue Feb 18 14:35:10 2014 +0100 | | | summary: change error in warning in message error if missing library. | | | o | | changeset: 2950:cba75b251d6d | | | user: Frederic Hecht | | | date: Thu Feb 13 10:55:31 2014 +0100 | | | summary: correct in 2d integral on levelset of bilinear form | | | o | | changeset: 2949:8762a49602b5 | | | user: Frederic Hecht | | | date: Wed Feb 12 18:45:43 2014 +0100 | | | summary: coorect type in getall | | | o | | changeset: 2948:10d76bbc862e | | | user: Frederic Hecht | | | date: Wed Feb 12 18:39:26 2014 +0100 | | | summary: make getall with or without thread depending of pearl install | | | o | | changeset: 2947:934199f05868 | | | user: Frederic Hecht | | | date: Wed Feb 12 11:26:56 2014 +0100 | | | summary: rebuild AutoGeneratedFile.tar.gz | | | o | | changeset: 2946:e0c1f8669ab4 | | | user: Frederic Hecht | | | date: Fri Feb 07 13:33:03 2014 +0100 | | | summary: update configure param to compile | | | o | | changeset: 2945:6f9c41b5a9b1 | | | user: Frederic Hecht | | | date: Thu Feb 06 22:38:38 2014 +0100 | | | summary: coorecct readme | | | o | | changeset: 2944:af4fbbef4ecd | | | tag: 3.28 | | | parent: 2937:4c7506b5ac6c | | | user: Frederic Hecht | | | date: Thu Feb 06 22:30:35 2014 +0100 | | | summary: correct small bug in | | | | | | o changeset: 2943:0aa8d880b527 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Thu Feb 06 14:42:15 2014 +0100 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2942:6ff7e589dcaa | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Wed Feb 05 18:01:38 2014 +0100 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2941:93032418cfc8 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Tue Feb 04 18:56:55 2014 +0100 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2940:872c489a2867 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Tue Feb 04 15:53:20 2014 +0100 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2939:1bc50b3ba773 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Wed Jan 29 18:17:45 2014 +0100 | | | | summary: > - New script build/orgindex and file index.org to list all hyperlinks in the FF source in Emacs org-mode format | | | | | | | o changeset: 2938:e78417933ae1 | | | | branch: alh-dev | | | | parent: 2935:72d03e2de866 | | | | user: Antoine Le Hyaric | | | | date: Wed Jan 29 17:25:13 2014 +0100 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | o | | | changeset: 2937:4c7506b5ac6c |\ \ \ \ tag: 3.27 | | | | | parent: 2936:37691b670f5a | | | | | parent: 2885:d58dea64f3a0 | | | | | user: Antoine Le Hyaric | | | | | date: Thu Feb 06 14:41:59 2014 +0100 | | | | | summary: Synchronizing FH and ALH trees | | | | | | o | | | changeset: 2936:37691b670f5a | |\ \ \ \ parent: 2934:2cc59dc4712c | | | | | | parent: 2875:338cb00eff86 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Jan 28 16:26:27 2014 +0100 | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | o changeset: 2935:72d03e2de866 | | | | | | branch: alh-dev | | | | | | parent: 2932:6dc37a6b1b61 | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jan 23 12:21:33 2014 +0100 | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | o | | | changeset: 2934:2cc59dc4712c | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Jan 21 16:53:17 2014 +0100 | | | | | | summary: partial commit on MacOS108 (athena) | | | | | | | | o | | | changeset: 2933:d0779fbd3270 | | | | | | parent: 2927:05728123cfdd | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Jan 21 16:26:29 2014 +0100 | | | | | | summary: partial commit on MacOS108 (athena) | | | | | | | | | | | o changeset: 2932:6dc37a6b1b61 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jan 09 14:17:02 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | | o changeset: 2931:3f84037c3f82 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jan 09 10:45:30 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | | o changeset: 2930:aef9c00fa974 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jan 09 10:42:48 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | +-----o changeset: 2929:109fbfe6ae46 | | | | | | branch: alh-dev | | | | | | parent: 2928:5ff83fb295b9 | | | | | | parent: 2927:05728123cfdd | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jan 09 10:37:20 2014 +0100 | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | o changeset: 2928:5ff83fb295b9 | | | | | |\ branch: alh-dev | | | | | | | parent: 2902:9f9543a57c4a | | | | | | | parent: 2903:e7454fa79801 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Mon Jan 06 17:18:43 2014 +0100 | | | | | | | summary: New FFCS version 14.1 using FF 3.26-3 | | | | | | | | | o | | | | changeset: 2927:05728123cfdd | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jan 08 11:49:43 2014 +0100 | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | o | | | | changeset: 2926:6e8b8dee3c7d | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jan 08 11:47:45 2014 +0100 | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | o | | | | changeset: 2925:991bc3308e91 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jan 08 11:42:40 2014 +0100 | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | o | | | | changeset: 2924:731c6e6f7f12 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jan 08 11:30:20 2014 +0100 | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | o | | | | changeset: 2923:b87e6117d8e4 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jan 08 11:28:37 2014 +0100 | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | o | | | | changeset: 2922:d108089c7f41 | | |\ \ \ \ \ parent: 2921:12aa8decef61 | | | | | | | | parent: 2920:b025c2cf1fc0 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 11:09:37 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2921:12aa8decef61 | | | | | | | | parent: 2917:e54ad4c7dbb5 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 11:09:36 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | o | | | | | changeset: 2920:b025c2cf1fc0 | | |\ \ \ \ \ \ parent: 2918:44aca5b00458 | | | | | | | | | parent: 2919:ad120e12b53c | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Wed Jan 08 11:08:00 2014 +0100 | | | | | | | | | summary: partial commit on DebianTesting32 (buis) | | | | | | | | | | | | o | | | | | changeset: 2919:ad120e12b53c | | | | | | | | | parent: 2908:ecd21a3c9519 | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Tue Jan 07 16:41:24 2014 +0100 | | | | | | | | | summary: Compiling FFCS on Windows 64 | | | | | | | | | | | o---+ | | | | changeset: 2918:44aca5b00458 | | | | | | | | user: Antoine Le Hyaric | | / / / / / / date: Wed Jan 08 11:07:57 2014 +0100 | | | | | | | | summary: partial commit on DebianTesting32 (buis) | | | | | | | | | | | o | | | | changeset: 2917:e54ad4c7dbb5 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 11:02:32 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2916:9a46b1c26db3 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 11:00:32 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2915:7561672695dd | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 10:59:10 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2914:098107cd6199 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 10:56:56 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2913:2e4fcaf138a5 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 10:52:19 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2912:6916680747a7 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 10:47:23 2014 +0100 | | | | | | | | summary: partial commit on Ubuntu1310-64 (ubu64) | | | | | | | | | | | o | | | | changeset: 2911:866837b2af36 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 10:36:45 2014 +0100 | | | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | o | | | | changeset: 2910:ef54830cf6ca | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jan 08 10:20:13 2014 +0100 | | | | | | | | summary: Small updates for FFCS release | | | | | | | | | | | o | | | | changeset: 2909:56d37abf1f91 | | |/ / / / / user: Antoine Le Hyaric | | | | | | | date: Wed Jan 08 10:00:39 2014 +0100 | | | | | | | summary: Small changing for FFCS compilation on Windows | | | | | | | | | o | | | | changeset: 2908:ecd21a3c9519 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jan 07 15:05:11 2014 +0100 | | | | | | | summary: Compiling FFCS on Windows 64 | | | | | | | | | o | | | | changeset: 2907:1ffe24c32b72 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jan 07 12:42:39 2014 +0100 | | | | | | | summary: Compiling FFCS on Windows 64 | | | | | | | | | o | | | | changeset: 2906:39530b797474 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jan 07 12:34:17 2014 +0100 | | | | | | | summary: Compiling FFCS on Windows 64 | | | | | | | | | o | | | | changeset: 2905:f800a6ab9788 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jan 07 09:03:23 2014 +0100 | | | | | | | summary: Making FF compile with FFCS on Win32 | | | | | | | | | o-------+ changeset: 2904:fcdbf0cf5077 | | | | | | user: Antoine Le Hyaric | | / / / / date: Mon Jan 06 17:21:07 2014 +0100 | | | | | | summary: New FFCS version 14.1 using FF 3.26-3 | | | | | | | | | | | o changeset: 2903:e7454fa79801 | | | | |/| parent: 2873:5ea92a62899b | | | | | | parent: 2902:9f9543a57c4a | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 17:17:08 2014 +0100 | | | | | | summary: New FFCS version 14.1 using FF 3.26-3 | | | | | | | | | | o | changeset: 2902:9f9543a57c4a | | | | |\| branch: alh-dev | | | | | | parent: 2901:b2c810edffc4 | | | | | | parent: 2873:5ea92a62899b | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 17:00:36 2014 +0100 | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | o | changeset: 2901:b2c810edffc4 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 16:59:33 2014 +0100 | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | o | changeset: 2900:d174317ebdb4 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 16:52:56 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2899:fd9ac165cadb | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 15:38:04 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2898:37cc9b9aa118 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 15:28:15 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2897:7c15fa116135 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 14:53:49 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2896:138744674c16 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 14:21:11 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2895:a3105d01c462 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 12:35:35 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2894:d5934c1a6b78 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Mon Jan 06 12:11:05 2014 +0100 | | | | | | summary: partial commit on Windows (telemos) | | | | | | | | | | o | changeset: 2893:3d92537460f0 | | | | |\ \ branch: alh-dev | | | | | | | parent: 2892:80c7cc90e5ed | | | | | | | parent: 2890:741de2d14d63 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Dec 19 16:04:58 2013 +0100 | | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | | o | changeset: 2892:80c7cc90e5ed | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Dec 19 12:03:48 2013 +0100 | | | | | | | summary: Incorporating changes from FH (default branch) into ALH developments (alh-dev branch) | | | | | | | | | | | | o | changeset: 2891:707584572e06 | | | | | |\ \ branch: alh-dev | | | | | | | | parent: 2888:9c4bf400b221 | | | | | | | | parent: 2864:b110654707d1 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Thu Dec 19 12:00:24 2013 +0100 | | | | | | | | summary: Incorporating changes from FH (default branch) into ALH developments (alh-dev branch) | | | | | | | | | | | | o---+ | changeset: 2890:741de2d14d63 | | | | | | | | branch: alh-dev | | | | | | | | parent: 2889:098e8bb04f23 | | | | | | | | parent: 2888:9c4bf400b221 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Dec 18 17:16:03 2013 +0100 | | | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | | o | | | changeset: 2889:098e8bb04f23 | | | | | | | | branch: alh-dev | | | | | | | | parent: 2887:54388cb94ac9 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Dec 04 17:53:19 2013 +0100 | | | | | | | | summary: partial commit on DebianTesting64 (caen) | | | | | | | | | | | | +---o | changeset: 2888:9c4bf400b221 | | | | | | / branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Dec 18 16:18:08 2013 +0100 | | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | o | | changeset: 2887:54388cb94ac9 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Nov 28 16:29:19 2013 +0100 | | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | | | | | o | | changeset: 2886:248f4bd285d0 | | | | | | | branch: alh-dev | | | | | | | parent: 2829:4ab97def6ad1 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Nov 27 15:14:05 2013 +0100 | | | | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o | | | | | | changeset: 2885:d58dea64f3a0 | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Feb 05 22:18:08 2014 +0100 | | | | | | | summary: add AddLayers in 3d | | | | | | | o | | | | | | changeset: 2884:5d1fa9c3c817 | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Feb 05 22:01:56 2014 +0100 | | | | | | | summary: correct AddLayers | | | | | | | o | | | | | | changeset: 2883:2cf6464d0761 | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Feb 05 09:35:50 2014 +0100 | | | | | | | summary: at init of full matrix this inverse matrix. | | | | | | | o | | | | | | changeset: 2882:d0965d6036fc | | | | | | | user: Frederic Hecht | | | | | | | date: Sun Feb 02 20:46:22 2014 +0100 | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | o | | | | | | changeset: 2881:4b6af956b8f8 | | | | | | | user: Frederic Hecht | | | | | | | date: Sun Feb 02 20:36:02 2014 +0100 | | | | | | | summary: correct SplitMesh function in case of P1b3d display. | | | | | | | o | | | | | | changeset: 2880:11edbb125bdc | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Jan 29 11:37:27 2014 +0100 | | | | | | | summary: up AutoGeneratedFile.tar.gz | | | | | | | o | | | | | | changeset: 2879:961332cb7ed2 | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Jan 29 11:36:20 2014 +0100 | | | | | | | summary: correct but in splitsimplex.cpp of P1b 3d case | | | | | | | o | | | | | | changeset: 2878:87a9a56664ef | | | | | | | user: Frederic Hecht | | | | | | | date: Sun Jan 26 21:41:07 2014 +0100 | | | | | | | summary: add BuildLayer function i C++ | | | | | | | o | | | | | | changeset: 2877:398ffc82c686 | | | | | | | user: Frederic Hecht | | | | | | | date: Fri Jan 24 17:38:34 2014 +0100 | | | | | | | summary: ajout pour P. jolivet de | | | | | | | o | | | | | | changeset: 2876:798588c5e951 |/ / / / / / user: Frederic Hecht | | | | | | date: Thu Jan 16 14:46:52 2014 +0100 | | | | | | summary: add hypot c function | | | | | | o | | | | | changeset: 2875:338cb00eff86 | | | | | | user: Frederic Hecht | | | | | | date: Thu Jan 09 10:45:56 2014 +0100 | | | | | | summary: add remark in innovation file | | | | | | o---------+ changeset: 2874:7b9c53ac2372 | | | | | user: Frederic Hecht / / / / / date: Thu Jan 09 10:44:01 2014 +0100 | | | | | summary: add missing function in gsl | | | | | | | | | o changeset: 2873:5ea92a62899b | | | | | user: Frederic Hecht | | | | | date: Mon Dec 30 22:16:52 2013 +0100 | | | | | summary: carrect install windows missing files | | | | | | | | | o changeset: 2872:60ef1773b8b2 | | | | | user: Frederic Hecht | | | | | date: Mon Dec 30 22:01:47 2013 +0100 | | | | | summary: correct WindowsPackage.m4 | | | | | | | | | o changeset: 2871:27002ba88a46 | | | | | user: Frederic Hecht | | | | | date: Mon Dec 30 17:06:52 2013 +0100 | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | | o changeset: 2870:897793e4a7f6 | | | | | user: Frederic Hecht | | | | | date: Mon Dec 30 17:05:54 2013 +0100 | | | | | summary: correct typo | | | | | | | | | o changeset: 2869:0b17a2cf1ea6 | | | | | user: Frederic Hecht | | | | | date: Mon Dec 30 17:01:27 2013 +0100 | | | | | summary: coorect typo | | | | | | | | | o changeset: 2868:324f120c84cf | | | | | user: Frederic Hecht | | | | | date: Mon Dec 30 16:56:38 2013 +0100 | | | | | summary: update gsl interface with random generator | | | | | | | | | o changeset: 2867:ccccd77442c2 | | | | | user: Frederic Hecht | | | | | date: Sun Dec 29 23:21:04 2013 +0100 | | | | | summary: add random gsl generator | | | | | | | | | o changeset: 2866:5fc3f1298263 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 28 18:20:31 2013 +0100 | | | | | summary: correct doc and pthread on window version | | | | | | | | | o changeset: 2865:adf0cca701c2 | | | |/ user: Frederic Hecht | | | | date: Mon Dec 23 13:41:04 2013 +0100 | | | | summary: correct mshmesh under window (no phthread lib) | | | | | | | o changeset: 2864:b110654707d1 | | | | user: Frederic Hecht | | | | date: Mon Dec 09 21:34:15 2013 +0100 | | | | summary: correct pthread with openblas | | | | | | | o changeset: 2863:3464dead1c8e | | | | user: Frederic Hecht | | | | date: Mon Dec 09 21:32:58 2013 +0100 | | | | summary: pass to version 3.26-3 | | | | | | | o changeset: 2862:067eda36460c | | | | user: Frederic Hecht | | | | date: Mon Dec 09 21:08:43 2013 +0100 | | | | summary: correct link problem of ipopt and blas missing thread libray. | | | | | | | o changeset: 2861:9818994f3093 | | | | user: Frederic Hecht | | | | date: Fri Dec 06 09:43:42 2013 +0100 | | | | summary: correct lapack interface and simplify the test. | | | | | | | o changeset: 2860:00a25dfebd01 | | | | user: Frederic Hecht | | | | date: Wed Dec 04 10:14:50 2013 +0100 | | | | summary: add new logo in the doc. | | | | | | | o changeset: 2859:d1e3f4891a08 | | | | user: Frederic Hecht | | | | date: Wed Dec 04 09:56:44 2013 +0100 | | | | summary: add warning= flags adaptmesh know if the max numbre of vertiex is reach | | | | | | | o changeset: 2858:7abc92ebe5ba | | | | user: Frederic Hecht | | | | date: Fri Nov 29 08:49:54 2013 +0100 | | | | summary: correct examples++-mpi/Laplace3d-hips.edp | | | | | | | o changeset: 2857:50d15c3910b7 | | | | user: Frederic Hecht | | | | date: Thu Nov 28 15:32:42 2013 +0100 | | | | summary: remove blas and lapack from WHERE-lIBRAY-download | | | | | | | o changeset: 2856:60a5720c24d4 | | | | user: Frederic Hecht | | | | date: Thu Nov 28 13:11:50 2013 +0100 | | | | summary: correct pb with norm | | | | | | | o changeset: 2855:b50b5a5a2336 | | | | user: Frederic Hecht | | | | date: Thu Nov 28 11:15:05 2013 +0100 | | | | summary: new version | | | | +-----o changeset: 2854:2b5ed56c8b59 | | | user: Frederic Hecht | | | date: Thu Nov 28 10:59:51 2013 +0100 | | | summary: correct bug in script ff-get-dep | | | o | | changeset: 2853:a9464311ddea | | | user: Frederic Hecht | | | date: Fri Nov 22 11:03:29 2013 +0100 | | | summary: correct ff-get-dep.in | | | o | | changeset: 2852:0592cece2ae9 | | | user: Frederic Hecht | | | date: Fri Nov 22 10:03:12 2013 +0100 | | | summary: coorect typo | | | o | | changeset: 2851:58552a27b112 | | | user: Frederic Hecht | | | date: Fri Nov 22 09:57:01 2013 +0100 | | | summary: next correctioon | | | o | | changeset: 2850:f1f45a267a78 | | | user: Frederic Hecht | | | date: Fri Nov 22 09:54:21 2013 +0100 | | | summary: coorect ff-get-dep.in of simple bash shell | | | o | | changeset: 2849:b13a07b5a6b5 |/ / user: Frederic Hecht | | date: Thu Nov 21 21:31:19 2013 +0100 | | summary: correct gnu.mak to rebuild pdf figure. | | o | changeset: 2848:4743da3cb7d6 | | user: Frederic Hecht | | date: Wed Nov 20 21:52:07 2013 +0100 | | summary: correct typo | | o | changeset: 2847:2fdfe47a6f56 | | user: Frederic Hecht | | date: Wed Nov 20 21:29:22 2013 +0100 | | summary: correct for install | | o | changeset: 2846:30a72fb6ca8e | | user: Frederic Hecht | | date: Wed Nov 20 20:44:56 2013 +0100 | | summary: correct ff-c++ install | | o | changeset: 2845:12a1482c206f | | user: Frederic Hecht | | date: Wed Nov 20 20:38:01 2013 +0100 | | summary: correct ff-c++ and install version | | o | changeset: 2844:67fa6ca3d5dd | | user: Frederic Hecht | | date: Wed Nov 20 18:22:02 2013 +0100 | | summary: add EXTRA_DIST= path openbals | | o | changeset: 2843:07cefac0627d | | user: Frederic Hecht | | date: Wed Nov 20 16:21:30 2013 +0100 | | summary: update INNOVATIO | | o | changeset: 2842:18d0a28bc820 | | user: Frederic Hecht | | date: Wed Nov 20 16:19:19 2013 +0100 | | summary: reome all relative path in WHERE_LIBRARY-config | | o | changeset: 2841:de838ce6aed7 | | user: Frederic Hecht | | date: Wed Nov 20 15:58:13 2013 +0100 | | summary: cooret PB SuperLU | | o | changeset: 2840:89928d1720be | | user: Frederic Hecht | | date: Wed Nov 20 15:24:11 2013 +0100 | | summary: coorect pb with superlu | | o | changeset: 2839:7ed38d0c562b | | user: Frederic Hecht | | date: Thu Nov 14 07:22:12 2013 +0100 | | summary: correct typo | | o | changeset: 2838:49fb2b403572 | | user: Frederic Hecht | | date: Thu Nov 14 07:08:12 2013 +0100 | | summary: correct pb in complex number in MPICG.cpp | | o | changeset: 2837:d705f85f99a8 | | user: Frederic Hecht | | date: Thu Nov 14 06:56:09 2013 +0100 | | summary: coorect after test on MacOS 10.9 | | o | changeset: 2836:12ab7a082206 | | user: Frederic Hecht | | date: Thu Nov 14 00:11:18 2013 +0100 | | summary: coorect Makefile fr dist | | o | changeset: 2835:128efccbdbbe | | user: Frederic Hecht | | date: Wed Nov 13 23:39:13 2013 +0100 | | summary: restored examples++-tutorial/Laplace.cpp | | o | changeset: 2834:12fd7a715267 | | user: Frederic Hecht | | date: Wed Nov 13 23:22:25 2013 +0100 | | summary: update AutoGeneratedFile.tar.gz | | o | changeset: 2833:3a5004ce04b1 | | user: Frederic Hecht | | date: Wed Nov 13 23:15:38 2013 +0100 | | summary: correct clean Makefile not remove pakage source. | | o | changeset: 2832:3f8bd0dc0696 | | user: Frederic Hecht | | date: Wed Nov 13 19:26:39 2013 +0100 | | summary: correct some example ??? | | o | changeset: 2831:79ffacff401c | | user: Frederic Hecht | | date: Wed Nov 13 17:41:08 2013 +0100 | | summary: pass to version 3.26 | | o | changeset: 2830:769140b8b4b5 |\ \ parent: 2822:f0cf8e4172bc | | | parent: 2779:cf1946212db2 | | | user: Frederic Hecht | | | date: Wed Nov 13 17:39:07 2013 +0100 | | | summary: merge with ALH version, and FH version | | | | | o changeset: 2829:4ab97def6ad1 | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Thu Nov 07 14:13:31 2013 +0100 | | | summary: > - Separate download script for all third-party software [[file:download/getall]] (request from FH) | | | | | o changeset: 2828:12dd3edd272b | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Thu Oct 31 17:20:51 2013 +0100 | | | summary: > - Separate download script for all third-party software [[file:download/getall]], request from FH | | | | | o changeset: 2827:f9e5c9cdde3c | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Tue Oct 29 09:16:31 2013 +0100 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2826:7a9fc9218ecc | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Wed Oct 23 17:29:44 2013 +0200 | | | summary: > - Set all hyperlinks to relative paths to make sure that they work from any location | | | | | o changeset: 2825:c213ac3c5ddd | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Wed Oct 23 15:30:46 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2824:80b91b59d758 | |/| branch: alh-dev | | | parent: 2823:ac72f4fd3cdf | | | parent: 2822:f0cf8e4172bc | | | user: Antoine Le Hyaric | | | date: Tue Oct 22 17:47:33 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2823:ac72f4fd3cdf | | | branch: alh-dev | | | parent: 2821:304b9771c959 | | | user: Antoine Le Hyaric | | | date: Mon Oct 21 12:14:40 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | o | changeset: 2822:f0cf8e4172bc | |\| parent: 2814:b788f2283f0a | | | parent: 2821:304b9771c959 | | | user: Antoine Le Hyaric | | | date: Mon Oct 21 10:54:43 2013 +0200 | | | summary: Keeping ALH and FH trees in sync | | | | | o changeset: 2821:304b9771c959 | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Mon Oct 21 10:46:00 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2820:f2d70674e0cf | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Thu Oct 17 11:39:56 2013 +0200 | | | summary: > - split DOC makefiles into Makefile.am and figs.mak to suppress automake warnings about portability | | | | | o changeset: 2819:690015709315 | |/| branch: alh-dev | | | parent: 2818:fd43eb5d72fd | | | parent: 2814:b788f2283f0a | | | user: Antoine Le Hyaric | | | date: Tue Oct 15 15:16:49 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2818:fd43eb5d72fd | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Tue Oct 15 14:57:20 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2817:7231ea317c6b | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Tue Oct 15 09:38:31 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2816:c82bafbc80ed | | | branch: alh-dev | | | user: Antoine Le Hyaric | | | date: Mon Oct 14 15:48:32 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | o changeset: 2815:8ee90b830900 | | | branch: alh-dev | | | parent: 2811:9fe8b47f26fe | | | user: Antoine Le Hyaric | | | date: Tue Oct 08 16:50:41 2013 +0200 | | | summary: partial commit on DebianTesting64 (odyssee) | | | | o | changeset: 2814:b788f2283f0a | | | user: Antoine Le Hyaric | | | date: Mon Oct 14 10:33:16 2013 +0200 | | | summary: changed FFCS Fortran MPI configuration for MPICH2 | | | | o | changeset: 2813:91392dc99aa0 | |\ \ parent: 2812:e39696d2e66f | | | | parent: 2775:da720285cc20 | | | | user: Antoine Le Hyaric | | | | date: Tue Oct 08 10:50:59 2013 +0200 | | | | summary: Keeping ALH and FH trees in sync | | | | | | o | changeset: 2812:e39696d2e66f | | |\| parent: 2782:eb4999ba4ff4 | | | | parent: 2811:9fe8b47f26fe | | | | user: Antoine Le Hyaric | | | | date: Tue Oct 08 10:31:31 2013 +0200 | | | | summary: FFCS version number increased to 13.15 | | | | | | | o changeset: 2811:9fe8b47f26fe | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Wed Oct 02 16:59:53 2013 +0200 | | | | summary: partial commit on MacOS108 (athena) | | | | | | | o changeset: 2810:1b93d130a6f3 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Wed Oct 02 16:21:37 2013 +0200 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2809:0a1b9e514197 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Mon Sep 30 18:09:43 2013 +0200 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2808:92b03c315566 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Wed Sep 25 12:01:34 2013 +0200 | | | | summary: partial commit on Ubuntu1204-64 (ubults64) | | | | | | | o changeset: 2807:c15cd2f03b68 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Wed Sep 25 11:11:44 2013 +0200 | | | | summary: > | | | | | | | o changeset: 2806:9c3a101331c6 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Mon Sep 23 09:59:26 2013 +0200 | | | | summary: partial commit on DebianTesting64 (odyssee) | | | | | | | o changeset: 2805:f364768a91ad | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Thu Sep 19 11:16:44 2013 +0200 | | | | summary: partial commit on DebianTesting64 (iliade) | | | | | | | o changeset: 2804:762acbe43ae9 | | | | branch: alh-dev | | | | user: Antoine Le Hyaric | | | | date: Thu Sep 19 11:10:58 2013 +0200 | | | | summary: partial commit on MacOS108 (athena) | | | | | | | o changeset: 2803:384865ca600b | | | |\ branch: alh-dev | | | | | parent: 2802:180cf95c3043 | | | | | parent: 2801:b4f662e97b98 | | | | | user: Antoine Le Hyaric | | | | | date: Thu Sep 19 11:00:21 2013 +0200 | | | | | summary: partial commit on MacOS108 (athena) | | | | | | | | | o changeset: 2802:180cf95c3043 | | | | | branch: alh-dev | | | | | parent: 2800:79c467416c58 | | | | | user: Antoine Le Hyaric | | | | | date: Thu Sep 19 11:00:19 2013 +0200 | | | | | summary: partial commit on MacOS108 (athena) | | | | | | | | o | changeset: 2801:b4f662e97b98 | | | |\| branch: alh-dev | | | | | parent: 2794:20715307bd51 | | | | | parent: 2800:79c467416c58 | | | | | user: Antoine Le Hyaric | | | | | date: Thu Sep 19 10:59:32 2013 +0200 | | | | | summary: partial commit on DebianTesting64 (iliade) | | | | | | | | | o changeset: 2800:79c467416c58 | | | | |\ branch: alh-dev | | | | | | parent: 2799:880bc2986524 | | | | | | parent: 2793:da28c0b1be77 | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Sep 19 10:51:05 2013 +0200 | | | | | | summary: partial commit on MacOS108 | | | | | | | | | | | o changeset: 2799:880bc2986524 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jul 25 14:44:53 2013 +0200 | | | | | | summary: Small fixes for MacOS 10.8 compilation | | | | | | | | | | | o changeset: 2798:318fde8763e3 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jul 25 14:31:41 2013 +0200 | | | | | | summary: Small fixes for pastix compilation on MacOS | | | | | | | | | | | o changeset: 2797:c3e6d188dd64 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jul 25 14:22:34 2013 +0200 | | | | | | summary: Small fixes for pastix compilation on MacOS | | | | | | | | | | | o changeset: 2796:72f90df8325c | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jul 25 14:15:58 2013 +0200 | | | | | | summary: Small fixes for pastix compilation on MacOS | | | | | | | | | | | o changeset: 2795:b3a31b5e5e66 | | | | | | branch: alh-dev | | | | | | parent: 2732:2a814f7c0f1f | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Jul 25 14:06:15 2013 +0200 | | | | | | summary: Small fixes for MacOS 10.8 compilation | | | | | | | | | o | | changeset: 2794:20715307bd51 | | | |/ / branch: alh-dev | | | | | user: Antoine Le Hyaric | | | | | date: Thu Sep 19 10:59:30 2013 +0200 | | | | | summary: partial commit on DebianTesting64 (iliade) | | | | | | | | o | changeset: 2793:da28c0b1be77 | | | | | branch: alh-dev | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 18 17:10:19 2013 +0200 | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | changeset: 2792:7847a84effee | | | | | branch: alh-dev | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 18 14:38:49 2013 +0200 | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | changeset: 2791:99ff5d7f8b98 | | | | | branch: alh-dev | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 18 14:00:35 2013 +0200 | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | changeset: 2790:3a3125233c7a | | | | | branch: alh-dev | | | | | user: Antoine Le Hyaric | | | | | date: Tue Sep 17 18:24:30 2013 +0200 | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | changeset: 2789:b4393a12fe7f | | | |\ \ branch: alh-dev | | | | | | parent: 2788:d9bb255ca068 | | | | | | parent: 2781:a0a0a2c0d990 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 17 12:33:26 2013 +0200 | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | o | changeset: 2788:d9bb255ca068 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 17 11:52:02 2013 +0200 | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | o | changeset: 2787:52cfe7abccc8 | | | | |\ \ branch: alh-dev | | | | | | | parent: 2784:f3d219682017 | | | | | | | parent: 2786:de558ef9e916 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Mon Sep 16 15:50:13 2013 +0200 | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | | | o | changeset: 2786:de558ef9e916 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Mon Sep 16 15:37:42 2013 +0200 | | | | | | | summary: partial commit on Ubuntu1304 | | | | | | | | | | | | o | changeset: 2785:e60e1b072fb5 | | | | | |\ \ branch: alh-dev | | | | | | | | parent: 2783:af7c913fea2f | | | | | | | | parent: 2780:3aec73ae92a6 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Mon Sep 16 14:27:46 2013 +0200 | | | | | | | | summary: Merged FF default branch into alh-dev branch | | | | | | | | | | | | o | | | changeset: 2784:f3d219682017 | | | | | | | | branch: alh-dev | | | | | | | | parent: 2763:f103190738d6 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Mon Sep 16 15:50:11 2013 +0200 | | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | | | +---o | changeset: 2783:af7c913fea2f | | | | | | / branch: alh-dev | | | | | | | parent: 2763:f103190738d6 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Mon Sep 16 12:07:05 2013 +0200 | | | | | | | summary: partial commit on DebianTesting32 | | | | | | | | | o | | | | changeset: 2782:eb4999ba4ff4 | | |/ / / / user: Antoine Le Hyaric | | | | | | date: Tue Sep 17 18:24:22 2013 +0200 | | | | | | summary: Small updates for FFCS | | | | | | | | o---+ | changeset: 2781:a0a0a2c0d990 | | | | | | parent: 2780:3aec73ae92a6 | | | | | | parent: 2769:27971516538c | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 17 11:51:05 2013 +0200 | | | | | | summary: Synchronizing FH and ALH source trees | | | | | | | | | | o | changeset: 2780:3aec73ae92a6 | | | | | | parent: 2768:9f9d303a3b9d | | | | | | user: Antoine Le Hyaric | | | | | | date: Thu Sep 12 12:30:48 2013 +0200 | | | | | | summary: Ignoring .htaccess to go through the web server | | | | | | o | | | | | changeset: 2779:cf1946212db2 | | | | | | user: Frederic Hecht | | | | | | date: Wed Nov 13 14:37:02 2013 +0100 | | | | | | summary: pass to version 2.55-1 | | | | | | o | | | | | changeset: 2778:58380ba26f11 | | | | | | user: Frederic Hecht | | | | | | date: Sat Nov 02 10:25:48 2013 +0100 | | | | | | summary: coorect pb in norm and real with new version complex in c++-11 | | | | | | o | | | | | changeset: 2777:737a1002ab0a | | | | | | user: Frederic Hecht | | | | | | date: Thu Oct 31 21:35:57 2013 +0100 | | | | | | summary: coorect mistake in download/ipopt/Makefile for blas | | | | | | o | | | | | changeset: 2776:a34eb2d6108b |/ / / / / user: Frederic Hecht | | | | | date: Thu Oct 31 18:41:00 2013 +0100 | | | | | summary: do correct of MacOS 10.9 , new compiler. | | | | | o | | | | changeset: 2775:da720285cc20 | | | | | user: Frederic Hecht | | | | | date: Sat Oct 05 08:29:54 2013 +0200 | | | | | summary: correct mistike in the problme of matrix block | | | | | o | | | | changeset: 2774:ade6693ffaf4 | | | | | user: Frederic Hecht | | | | | date: Thu Oct 03 18:18:20 2013 +0300 | | | | | summary: correct problem in block matrix with 0 column or 0 row. | | | | | o | | | | changeset: 2773:fd3772142d0a | | | | | user: Frederic Hecht | | | | | date: Thu Sep 26 18:59:58 2013 +0200 | | | | | summary: add missing test | | | | | o | | | | changeset: 2772:a8cc2014376f | | | | | user: Frederic Hecht | | | | | date: Thu Sep 26 18:48:45 2013 +0200 | | | | | summary: correct typo and add new autofiles | | | | | o | | | | changeset: 2771:a5ad7a4f543a | | | | | user: Frederic Hecht | | | | | date: Thu Sep 26 18:38:03 2013 +0200 | | | | | summary: correct doc and fftw3 downlaod compilation | | | | | o | | | | changeset: 2770:166bd70dce7c |/ / / / user: Frederic Hecht | | | | date: Thu Sep 26 17:59:26 2013 +0200 | | | | summary: correct fftw MAkefile.am | | | | o---+ | changeset: 2769:27971516538c | | | | parent: 2719:7ae83b320fea | | | | parent: 2768:9f9d303a3b9d | | | | user: Frederic Hecht | | | | date: Tue Sep 17 11:42:42 2013 +0200 | | | | summary: update ffc version and ff++ version | | | | | | o | changeset: 2768:9f9d303a3b9d | | | | user: Antoine Le Hyaric | | | | date: Wed Sep 11 17:45:42 2013 +0200 | | | | summary: Updates for FFCS compilation on Windows | | | | | | o | changeset: 2767:e9ae0c3079fb | | |\ \ parent: 2762:98437b4ebf50 | | | | | parent: 2766:2fbbc949c081 | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 11 17:40:38 2013 +0200 | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | changeset: 2766:2fbbc949c081 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Sep 10 15:57:17 2013 +0200 | | | | | summary: Updates for compiling FFCS on Ubuntu | | | | | | | | o | changeset: 2765:71a8394c29e5 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Sep 10 15:40:07 2013 +0200 | | | | | summary: Update for compiling FFCS on Ubuntu | | | | | | | | o | changeset: 2764:55c008ede4ae | | | | | parent: 2759:05059715e454 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Sep 10 15:08:11 2013 +0200 | | | | | summary: Small corrections for FFCS compilation | | | | | | o | | | changeset: 2763:f103190738d6 | |\| | | branch: alh-dev | | | | | parent: 2752:df47e2e6eed5 | | | | | parent: 2762:98437b4ebf50 | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 11 16:41:06 2013 +0200 | | | | | summary: partial commit on DebianTesting64 | | | | | | | o | | changeset: 2762:98437b4ebf50 | | |\ \ \ parent: 2761:16d91a730b0c | | | | | | parent: 2760:6abf65bf289f | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 11 10:42:57 2013 +0200 | | | | | | summary: Updates for FFCS compilation | | | | | | | | | o | | changeset: 2761:16d91a730b0c | | | | | | parent: 2750:c63825bee6e0 | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 11 10:42:01 2013 +0200 | | | | | | summary: Updates for FFCS compilation | | | | | | | | o---+ | changeset: 2760:6abf65bf289f | | | | | user: Antoine Le Hyaric | | / / / date: Tue Sep 10 14:19:02 2013 +0200 | | | | | summary: Small corrections for FFCS compilation | | | | | | | | o | changeset: 2759:05059715e454 | | | |\ \ parent: 2758:e3af440f1eb5 | | | | | | parent: 2757:094eb2bf1ed5 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 10 14:14:04 2013 +0200 | | | | | | summary: partial commit on Windows | | | | | | | | | | o | changeset: 2758:e3af440f1eb5 | | | | | | parent: 2755:66c84a59ec08 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 10 14:12:50 2013 +0200 | | | | | | summary: Small corrections for cygwin compilation | | | | | | | | | o | | changeset: 2757:094eb2bf1ed5 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 10 13:55:23 2013 +0200 | | | | | | summary: Corrections for MacOS 10.6 compilation | | | | | | | | | o | | changeset: 2756:f6a45d5192d4 | | | |/ / user: Antoine Le Hyaric | | | | | date: Tue Sep 10 13:44:49 2013 +0200 | | | | | summary: Corrections for scotch compilation | | | | | | | | o | changeset: 2755:66c84a59ec08 | | | |\ \ parent: 2754:9c42ed65ca44 | | | | | | parent: 2717:c64826dc8c81 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 10 11:39:04 2013 +0200 | | | | | | summary: Keeping ALH and FH trees in sync | | | | | | | | | | o | changeset: 2754:9c42ed65ca44 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Sep 10 11:16:50 2013 +0200 | | | | | | summary: Corrected pastix compilation for FFCS on MacOS 10.6 | | | | | | | | +---o | changeset: 2753:da3780f311e8 | | | | / parent: 2750:c63825bee6e0 | | | | | user: Antoine Le Hyaric | | | | | date: Thu Sep 05 11:39:29 2013 +0200 | | | | | summary: Corrected mumps-seq makefile | | | | | | o | | | changeset: 2752:df47e2e6eed5 | | | | | branch: alh-dev | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 11 10:44:26 2013 +0200 | | | | | summary: partial commit on DebianTesting32 | | | | | | o | | | changeset: 2751:40f8b19d30da | |\| | | branch: alh-dev | | | | | parent: 2749:d1afac8f61a9 | | | | | parent: 2750:c63825bee6e0 | | | | | user: Antoine Le Hyaric | | | | | date: Wed Sep 04 16:48:42 2013 +0200 | | | | | summary: Merged modifs from FH into alh-dev branch | | | | | | | o | | changeset: 2750:c63825bee6e0 | | |\ \ \ parent: 2745:e7875904c41e | | | | | | parent: 2710:4341df7bae13 | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 04 16:18:14 2013 +0200 | | | | | | summary: Synchronizing FF and FFCS updates to the Mumps and Umfpack makefiles | | | | | | | o | | | | changeset: 2749:d1afac8f61a9 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 04 15:22:24 2013 +0200 | | | | | | summary: partial commit on DebianTesting64 | | | | | | | o | | | | changeset: 2748:ef562c7d8fb7 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 04 15:16:32 2013 +0200 | | | | | | summary: partial commit on DebianTesting64 | | | | | | | o | | | | changeset: 2747:698f90a62961 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 04 14:48:43 2013 +0200 | | | | | | summary: partial commit on DebianTesting64 | | | | | | | o---+ | | changeset: 2746:05a30144950f | | | | | | branch: alh-dev | | | | | | parent: 2743:2e0fd3c00f4f | | | | | | parent: 2745:e7875904c41e | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Sep 04 14:20:02 2013 +0200 | | | | | | summary: merged default branch back into alh-dev | | | | | | | | | o | | changeset: 2745:e7875904c41e | | | |\ \ \ parent: 2744:495eae88dc63 | | | | | | | parent: 2742:36b98a7a6e7a | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Sep 04 12:22:28 2013 +0200 | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | | o | | changeset: 2744:495eae88dc63 | | | | | | | parent: 2708:e50fd5f8a141 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Sep 04 12:19:28 2013 +0200 | | | | | | | summary: Corrections for FFCS compilation | | | | | | | | o | | | | | changeset: 2743:2e0fd3c00f4f | | | | | | | branch: alh-dev | | | | | | | parent: 2741:64de98e105f6 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Aug 01 15:17:00 2013 +0200 | | | | | | | summary: partial commit on DebianTesting32 | | | | | | | | +---o | | | changeset: 2742:36b98a7a6e7a | | | | | | | parent: 2729:e2707ecfe7b7 | | | | | | | parent: 2741:64de98e105f6 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Aug 01 12:34:02 2013 +0200 | | | | | | | summary: Committing all changes for FFCS 13.14 back into FF | | | | | | | | o | | | | | changeset: 2741:64de98e105f6 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jul 31 14:13:59 2013 +0200 | | | | | | | summary: Added configuration option --enable-hypre | | | | | | | | o | | | | | changeset: 2740:2bf0f2c8f9db | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jul 31 11:32:39 2013 +0200 | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | | | | | changeset: 2739:33ed198a1694 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jul 30 15:26:10 2013 +0200 | | | | | | | summary: Added extra configuration options for metis, parmetis and nlopt | | | | | | | | o | | | | | changeset: 2738:a8c44e294d36 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jul 30 14:30:43 2013 +0200 | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | o | | | | | changeset: 2737:685af844956b | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jul 30 14:26:21 2013 +0200 | | | | | | | summary: Parallelized download/mumps-seq compilation | | | | | | | | o | | | | | changeset: 2736:1f2cb6cd91e8 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jul 30 14:04:52 2013 +0200 | | | | | | | summary: Parallelized MUMPS compilation | | | | | | | | o | | | | | changeset: 2735:82c740a1f338 | |\ \ \ \ \ \ branch: alh-dev | | | | | | | | parent: 2733:e3d8549335c2 | | | | | | | | parent: 2734:9e79463c9e48 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Mon Jul 29 18:18:26 2013 +0200 | | | | | | | | summary: partial commit on DebianTesting32 | | | | | | | | | | o---------+ changeset: 2734:9e79463c9e48 | | | | | | | branch: alh-dev | | / / / / / parent: 2732:2a814f7c0f1f | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Mon Jul 29 18:15:22 2013 +0200 | | | | | | | summary: Fixes for Win32 compilation | | | | | | | | o---------+ changeset: 2733:e3d8549335c2 | | | | | | branch: alh-dev | / / / / / user: Antoine Le Hyaric | | | | | | date: Mon Jul 29 15:13:01 2013 +0200 | | | | | | summary: Added configure options --with-[package]-include= and --with-[package]-ldflags= | | | | | | | | | | | o changeset: 2732:2a814f7c0f1f | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Jul 24 16:08:34 2013 +0200 | | | | | | summary: Fixed DLL compilation on Windows for MUMPS and pARMS | | | | | | | | | | | o changeset: 2731:36e1cd88de75 | | | | | | branch: alh-dev | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Jul 24 13:41:16 2013 +0200 | | | | | | summary: Compilation fixes for Windows | | | | | | | | | | | o changeset: 2730:dca84350a248 | | | | | | branch: alh-dev | | | | | | parent: 2728:577fe9901c85 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Jul 23 16:13:06 2013 +0200 | | | | | | summary: Small fixes for FFCS release version | | | | | | | | o | | | changeset: 2729:e2707ecfe7b7 | | |\ \ \ \ parent: 2724:54b6485a68f0 | | | | | | | parent: 2706:4cc59f9e5863 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Jul 11 14:37:27 2013 +0200 | | | | | | | summary: Keeping FH and ALH trees in sync | | | | | | | | | | | | | o changeset: 2728:577fe9901c85 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Tue Jul 23 13:17:36 2013 +0200 | | | | | | | summary: partial commit on Windows | | | | | | | | | | | | | o changeset: 2727:d36610b57655 | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Jul 11 17:22:39 2013 +0200 | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | | | | o changeset: 2726:edcf91fc280c | | | | | | | branch: alh-dev | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Thu Jul 11 15:09:44 2013 +0200 | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | +-----o changeset: 2725:6e0e54be960e | | | | | | | branch: alh-dev | | | | | | | parent: 2723:dc28f7873452 | | | | | | | parent: 2724:54b6485a68f0 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jul 10 15:17:16 2013 +0200 | | | | | | | summary: Copied updates from the default branch to the alh-dev branch | | | | | | | | | | o | | | changeset: 2724:54b6485a68f0 | | | |\ \ \ \ parent: 2702:888a6c206637 | | | | | | | | parent: 2675:ec7d549934f0 | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jul 10 15:10:10 2013 +0200 | | | | | | | | summary: Technical commit: synchronizing all HG heads from the default branch | | | | | | | | | | | | | | | o changeset: 2723:dc28f7873452 | | | | | | | |\ branch: alh-dev | | | | | | | | | parent: 2699:8fc2e7e016aa | | | | | | | | | parent: 2722:ed19cfc9dc4a | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Wed Jul 10 15:06:06 2013 +0200 | | | | | | | | | summary: technical commit: synchronizing draft ALH developments | | | | | | | | | | | | | | | | | o changeset: 2722:ed19cfc9dc4a | | | | | | | | | branch: alh-dev | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Mon Jul 01 09:43:47 2013 +0200 | | | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | | | | | | | | o changeset: 2721:8a5543705d99 | | | | | | | | | branch: alh-dev | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Thu Jun 27 12:36:58 2013 +0200 | | | | | | | | | summary: partial commit on DebianTesting64 | | | | | | | | | | | | | | | | | o changeset: 2720:734e4213f762 | | | | | | | | | branch: alh-dev | | | | | | | | | parent: 2700:4682570a0e2f | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Wed Jun 26 15:41:34 2013 +0200 | | | | | | | | | summary: Created branch alh-dev for draft ALH developments | | | | | | | | | o | | | | | | | | changeset: 2719:7ae83b320fea | | | | | | | | | user: Frederic Hecht | | | | | | | | | date: Fri Sep 06 15:34:49 2013 +0200 | | | | | | | | | summary: coorect mistake in parmetis install files . | | | | | | | | | o-----------+ | | changeset: 2718:35d438d9bcb2 | | | | | | | | user: Frederic Hecht / / / / / / / / date: Fri Sep 06 10:59:36 2013 +0200 | | | | | | | | summary: coorect for compilation with OpenBlas and a Window versio of sleep. | | | | | | | | | | | | | o | | changeset: 2717:c64826dc8c81 | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Sep 05 15:26:31 2013 +0200 | | | | | | | | summary: add cote in -T MPIDIR | | | | | | | | | | | | | o | | changeset: 2716:2597949bf544 | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Sep 05 14:57:31 2013 +0200 | | | | | | | | summary: correct wget problme in pastis and superludist Makefile | | | | | | | | | | | | | o | | changeset: 2715:306e42af8aca | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Sep 05 10:58:44 2013 +0200 | | | | | | | | summary: correct typo | | | | | | | | | | | | | o | | changeset: 2714:2dca3a0b91a8 | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Sep 05 10:23:15 2013 +0200 | | | | | | | | summary: correct pb of make stop if no arpack.. | | | | | | | | | | | | | o | | changeset: 2713:8b9576d7d540 | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Sep 05 09:55:51 2013 +0200 | | | | | | | | summary: correct problem on skip mpi example in some case | | | | | | | | | | | | | o | | changeset: 2712:524802dba437 | | | | | | | | user: Frederic Hecht | | | | | | | | date: Thu Sep 05 06:28:03 2013 +0200 | | | | | | | | summary: rebuild AutoGeneratedFile.tar.gz | | | | | | | | +---------o | | changeset: 2711:71a6c203d688 | | | | | / / user: Frederic Hecht | | | | | | | date: Thu Sep 05 06:27:19 2013 +0200 | | | | | | | summary: correct problem of stop compilation of load example | | | | | | | o | | | | | | changeset: 2710:4341df7bae13 | | | | | | | user: Frederic Hecht | | | | | | | date: Wed Sep 04 15:35:34 2013 +0200 | | | | | | | summary: correct pb in mpi test remove graphic | | | | | | | o-------+ | | changeset: 2709:45813df0888a | | | | | | user: Frederic Hecht / / / / / / date: Wed Sep 04 13:31:56 2013 +0200 | | | | | | summary: add tools to build le list of AutoGeneratedFile.tar.gz | | | | | | | | | o | | changeset: 2708:e50fd5f8a141 | | | | | | user: Frederic Hecht | | | | | | date: Tue Aug 27 14:28:25 2013 +0200 | | | | | | summary: summer correction. | | | | | | +-----o | | changeset: 2707:17f80351763f | | | / / user: Frederic Hecht | | | | | date: Sat Aug 17 22:39:03 2013 +0200 | | | | | summary: add patch of holiday scotch dolaod with curl; an pb in a*[b,c,d,..]' with complex value | | | | | o | | | | changeset: 2706:4cc59f9e5863 | | | | | user: Frederic Hecht | | | | | date: Thu Jul 11 12:51:07 2013 +0200 | | | | | summary: add comment for compile | | | | | o | | | | changeset: 2705:c435a4165181 | | | | | user: Frederic Hecht | | | | | date: Thu Jul 11 11:58:27 2013 +0200 | | | | | summary: correct mmg3d | | | | | o | | | | changeset: 2704:3bcad8cbbcbe | | | | | user: Frederic Hecht | | | | | date: Wed Jul 10 22:20:05 2013 +0200 | | | | | summary: correct pb in save make the point is not in tet | | | | | o---+ | | changeset: 2703:8a3547f7290a | | | | | parent: 2702:888a6c206637 |/ / / / parent: 2675:ec7d549934f0 | | | | user: Frederic Hecht | | | | date: Wed Jul 10 15:17:49 2013 +0200 | | | | summary: restore skipcommet example | | | | | o | | changeset: 2702:888a6c206637 | | | | user: Frederic Hecht | | | | date: Wed Jul 10 14:44:03 2013 +0200 | | | | summary: pass to version 3.25 merge ff++ of ALH and FH | | | | | o---+ changeset: 2701:dd21194cb9f6 | | | | parent: 2700:4682570a0e2f | | | | parent: 2674:7bb139d17bea | | | | user: Antoine Le Hyaric | | | | date: Wed Jul 10 10:04:05 2013 +0200 | | | | summary: Keeping FH and ALH trees in sync | | | | | | | o changeset: 2700:4682570a0e2f | | | |\ parent: 2697:da86b515293e | | | | | parent: 2698:62df716c1320 | | | | | user: Antoine Le Hyaric | | | | | date: Wed Jun 26 15:37:52 2013 +0200 | | | | | summary: Transferred all FreeFem++ patches from the FreeFem++-cs source tree to the FreeFem++ source tree | | | | | | | o---+ changeset: 2699:8fc2e7e016aa | | | | branch: alh-dev | | / / user: Antoine Le Hyaric | | | | date: Wed Jun 26 14:52:09 2013 +0200 | | | | summary: Created branch alh-dev for draft ALH developments | | | | | | | o changeset: 2698:62df716c1320 | | | | parent: 2696:791401576c4d | | | | user: Antoine Le Hyaric | | | | date: Wed Jun 26 12:08:39 2013 +0200 | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | o | changeset: 2697:da86b515293e | | |\ \ parent: 2688:3eab88cf4024 | | | | | parent: 2663:e0d9c72558a1 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 25 15:39:07 2013 +0200 | | | | | summary: Keeping FH and ALH trees in sync | | | | | | | | | o changeset: 2696:791401576c4d | | | | | user: Antoine Le Hyaric | | | | | date: Wed Jun 26 11:44:47 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | o changeset: 2695:3151480a64b7 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 25 15:50:08 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | +---o changeset: 2694:87b46e1b6393 | | | | | parent: 2693:86ea3e4a8851 | | | | | parent: 2663:e0d9c72558a1 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 25 15:46:25 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | o changeset: 2693:86ea3e4a8851 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 25 14:49:33 2013 +0200 | | | | | summary: transferred all patches from the FFCS development tree | | | | | | | | | o changeset: 2692:97a9606a653d | | | | | user: Antoine Le Hyaric | | | | | date: Wed Jun 12 17:50:17 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | o changeset: 2691:419cee6966bc | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 11 18:00:21 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | o changeset: 2690:8abb5d66e20f | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 11 13:43:22 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | o changeset: 2689:3e931c8973b9 | | | |/| parent: 2687:aa013525fb7e | | | | | parent: 2688:3eab88cf4024 | | | | | user: Antoine Le Hyaric | | | | | date: Tue Jun 11 11:20:43 2013 +0200 | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | o | changeset: 2688:3eab88cf4024 | | | |\ \ parent: 2686:4fc31e72cdd0 | | | | | | parent: 2662:71cafe9dab38 | | | | | | user: Antoine Le Hyaric | | | | | | date: Tue Jun 11 10:36:23 2013 +0200 | | | | | | summary: Keeping FH and ALH trees in sync | | | | | | | | | | | o changeset: 2687:aa013525fb7e | | | | |/| parent: 2681:46dd9851ed4d | | | | | | parent: 2686:4fc31e72cdd0 | | | | | | user: Antoine Le Hyaric | | | | | | date: Wed Jun 05 16:43:59 2013 +0200 | | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | | o | changeset: 2686:4fc31e72cdd0 | | | | |\ \ parent: 2685:767efda6e451 | | | | | | | parent: 2308:f01c1ce34eb3 | | | | | | | user: Antoine Le Hyaric | | | | | | | date: Wed Jun 05 11:19:30 2013 +0200 | | | | | | | summary: Discarded obsolete head f01c1ce34eb3 (but kept that version in the repository) | | | | | | | | | | | | o | changeset: 2685:767efda6e451 | | | | | |\ \ parent: 2684:6b6c8aad96ac | | | | | | | | parent: 2101:31c99c85707b | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Wed Jun 05 11:18:45 2013 +0200 | | | | | | | | summary: Discarded obsolete head 31c99c85707b (but kept that version in the repository) | | | | | | | | | | | | | | o | changeset: 2684:6b6c8aad96ac | | | | | | |\ \ parent: 2683:cb8d4ecbfa92 | | | | | | | | | parent: 2054:f3cbf7394995 | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Wed Jun 05 11:18:16 2013 +0200 | | | | | | | | | summary: Discarded obsolete head f3cbf7394995 (but kept that version in the repository) | | | | | | | | | | | | | | | | o | changeset: 2683:cb8d4ecbfa92 | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Tue Jun 04 14:36:00 2013 +0200 | | | | | | | | | summary: Created Doxygen main page and started to document the C++ classes | | | | | | | | | | | | | | | | o | changeset: 2682:fcd1643fef04 | | | | | | | | | parent: 2656:77e6f87bfdbf | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Tue Jun 04 14:34:07 2013 +0200 | | | | | | | | | summary: Created Doxygen main page and started to document the C++ classes | | | | | | | | | | | | | | | | | o changeset: 2681:46dd9851ed4d | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Wed Jun 05 16:30:09 2013 +0200 | | | | | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | | | | | | | | | o changeset: 2680:2c62f82b7cf1 | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Wed Jun 05 08:55:53 2013 +0200 | | | | | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | | | | | | | | | o changeset: 2679:7efba1855838 | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Tue Jun 04 18:02:11 2013 +0200 | | | | | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | | | | | | | | | o changeset: 2678:684ae36c47ca | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Tue Jun 04 14:34:01 2013 +0200 | | | | | | | | | summary: commit for fflibexport | | | | | | | | | | | | | | | | | o changeset: 2677:be137189177e | | | | | | | | | user: Antoine Le Hyaric | | | | | | | | | date: Mon Jun 03 17:29:56 2013 +0200 | | | | | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | | | | | | | | | | o changeset: 2676:056116d8b9a9 | | | | | | | |/ parent: 2656:77e6f87bfdbf | | | | | | | | user: Antoine Le Hyaric | | | | | | | | date: Mon Jun 03 16:53:15 2013 +0200 | | | | | | | | summary: Modified by Antoine Le Hyaric on DebianTesting64 (machine odyssee) | | | | | | | | o | | | | | | | changeset: 2675:ec7d549934f0 |/ / / / / / / user: Frederic Hecht | | | | | | | date: Wed Jul 10 10:23:15 2013 +0200 | | | | | | | summary: add skipcomment in readmesh.edp example | | | | | | | o | | | | | | changeset: 2674:7bb139d17bea | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Jul 04 18:04:37 2013 +0200 | | | | | | | summary: put code of index and rindex missing in win32 | | | | | | | o | | | | | | changeset: 2673:93b7627f23fd | | | | | | | user: Frederic Hecht | | | | | | | date: Tue Jul 02 22:44:56 2013 +0300 | | | | | | | summary: missing xfial Poisson3d.edp | | | | | | | o | | | | | | changeset: 2672:ad18e7b807c6 | | | | | | | user: Frederic Hecht | | | | | | | date: Tue Jul 02 22:43:32 2013 +0300 | | | | | | | summary: autoreconf | | | | | | | o | | | | | | changeset: 2671:67a063a1a524 | | | | | | | user: Frederic Hecht | | | | | | | date: Tue Jul 02 22:42:53 2013 +0300 | | | | | | | summary: add xfail test in not tetgen | | | | | | | o | | | | | | changeset: 2670:bc88752878d2 | | | | | | | user: Frederic Hecht | | | | | | | date: Tue Jul 02 22:39:08 2013 +0300 | | | | | | | summary: autoreconf | | | | | | | o | | | | | | changeset: 2669:e7e5b1846361 | | | | | | | user: Frederic Hecht | | | | | | | date: Tue Jul 02 22:38:23 2013 +0300 | | | | | | | summary: update list of xfail example | | | | | | | o | | | | | | changeset: 2668:11b43f1fdbfc | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Jun 27 20:40:53 2013 +0200 | | | | | | | summary: correct test-driver-ff to set XFAIL (to can fail no sure fail) | | | | | | | o | | | | | | changeset: 2667:2cdabbc53b17 | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Jun 27 20:11:08 2013 +0200 | | | | | | | summary: correct typo in XFAIL_TESTS automake variable | | | | | | | o | | | | | | changeset: 2666:d11989c6ff07 | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Jun 27 19:55:11 2013 +0200 | | | | | | | summary: add in pref missing include dir | | | | | | | o | | | | | | changeset: 2665:b4b2ddd8100f | | | | | | | user: Frederic Hecht | | | | | | | date: Thu Jun 27 19:37:44 2013 +0200 | | | | | | | summary: add the creation of freefem++.pref file in all directory example | | | | | | | o | | | | | | changeset: 2664:4575cdbc939c |/ / / / / / user: Frederic Hecht | | | | | | date: Thu Jun 27 13:17:13 2013 +0200 | | | | | | summary: coorect missing creation of freefem++.pref file | | | | | | o | | | | | changeset: 2663:e0d9c72558a1 |/ / / / / user: Frederic Hecht | | | | | date: Tue Jun 11 21:40:05 2013 +0200 | | | | | summary: add parameter in ffglut program like -g 1000x500+100+100 -t toto | | | | | o | | | | changeset: 2662:71cafe9dab38 | | | | | user: Frederic Hecht | | | | | date: Mon Jun 10 20:48:03 2013 +0200 | | | | | summary: correct pb of auto size of 3d plot | | | | | o | | | | changeset: 2661:49e7d0ef36a7 | | | | | user: Frederic Hecht | | | | | date: Mon Jun 10 14:15:44 2013 +0200 | | | | | summary: add -wait "0.1" of ffglut (=> no manuel wait) | | | | | o | | | | changeset: 2660:4c22c41a9f85 | | | | | user: Frederic Hecht | | | | | date: Sun Jun 09 18:21:51 2013 +0200 | | | | | summary: correct typo llevelset.edp ->intlevelset.edp | | | | | o | | | | changeset: 2659:6e4d9f511a3c | | | | | user: Frederic Hecht | | | | | date: Sun Jun 09 17:16:41 2013 +0200 | | | | | summary: put correction of Lorenzo. | | | | | o | | | | changeset: 2658:5f7becf9dbd3 | | | | | user: Frederic Hecht | | | | | date: Fri Jun 07 16:11:08 2013 +0200 | | | | | summary: add test of pb ?: operator with div / 0. | | | | | o-------+ changeset: 2657:9641b54129e2 | | | | user: Frederic Hecht / / / / date: Thu Jun 06 20:57:44 2013 +0200 | | | | summary: change default solver in bilap.edo example | | | | | | | o changeset: 2656:77e6f87bfdbf | | | | user: Frederic Hecht | | | | date: Sat Jun 01 10:11:30 2013 +0200 | | | | summary: correct test test "${SKIP:-no}" | | | | | | | o changeset: 2655:3b374e87a5a7 | | | | user: Frederic Hecht | | | | date: Sat Jun 01 09:52:31 2013 +0200 | | | | summary: correct TESTing of freefem++ | | | | | | | o changeset: 2654:d9460e4552e0 | | | | user: Frederic Hecht | | | | date: Fri May 31 22:44:45 2013 +0200 | | | | summary: update automake test of freefem++ | | | | | | | o changeset: 2653:e65c6ce6f363 | | | | user: Frederic Hecht | | | | date: Wed May 29 12:18:37 2013 +0200 | | | | summary: remove \r in patch file | | | | | | | o changeset: 2652:379e79e6761b | | | | user: Frederic Hecht | | | | date: Wed May 29 11:48:45 2013 +0200 | | | | summary: add ff-mpirun on windows distrib. | | | | | | | o changeset: 2651:a33d824b6777 | | | | user: Frederic Hecht | | | | date: Wed May 29 10:03:44 2013 +0200 | | | | summary: add quote for windows | | | | | | | o changeset: 2650:fdbc1f7fc3c6 | | | | user: Frederic Hecht | | | | date: Tue May 28 18:59:32 2013 +0200 | | | | summary: correct typo in doc on operator .*+ and ./= | | | | | | | o changeset: 2649:9ef12351b744 | | | | user: Frederic Hecht | | | | date: Mon May 13 21:20:19 2013 +0200 | | | | summary: correct CheckAll | | | | | | | o changeset: 2648:e1207c606f45 | | | | user: Frederic Hecht | | | | date: Mon May 13 21:05:18 2013 +0200 | | | | summary: correct CheckAll | | | | | | | o changeset: 2647:1e153d9d7218 | | | | user: Frederic Hecht | | | | date: Mon May 13 20:55:40 2013 +0200 | | | | summary: correct getline or \r\n files | | | | | | | o changeset: 2646:ccdea38daf14 | | | | user: Frederic Hecht | | | | date: Mon May 06 22:03:44 2013 +0200 | | | | summary: correct configure.ac for umfpack downlad | | | | | | | o changeset: 2645:13f113c861c0 | | | | user: Frederic Hecht | | | | date: Mon May 06 20:42:41 2013 +0200 | | | | summary: correct pb of compile umfpack if no --enable-download flags | | | | | | | o changeset: 2644:d68cb17545dc | | | | user: Frederic Hecht | | | | date: Mon May 06 20:28:13 2013 +0200 | | | | summary: correct typo in CheckAll to store result | | | | | | | o changeset: 2643:f7669c7a10ee | | | | user: Frederic Hecht | | | | date: Fri May 03 15:10:42 2013 +0200 | | | | summary: remove dir in Makefile.am glx, std, x11 | | | | | | | o changeset: 2642:134644b820a8 | | | | user: Frederic Hecht | | | | date: Fri May 03 12:49:02 2013 +0200 | | | | summary: version 3.23 | | | | | | | o changeset: 2641:36132ac7c1c1 | | | | user: Frederic Hecht | | | | date: Sat Apr 27 11:36:36 2013 +0200 | | | | summary: reomve x11, glx, ... off the compilation prosess | | | | | | | o changeset: 2640:4628a7908b73 | | | | user: Frederic Hecht | | | | date: Fri Apr 19 15:38:16 2013 +0200 | | | | summary: coorect type in isoline functio,n Area to compute the area of | | | | | | | o changeset: 2639:d459cc808f30 | | | | user: Frederic Hecht | | | | date: Thu Apr 18 20:45:09 2013 +0200 | | | | summary: change area to Area because area is not a function. | | | | | | | o changeset: 2638:f70cee1b6a7b | | | | user: Frederic Hecht | | | | date: Thu Apr 18 19:02:42 2013 +0200 | | | | summary: add area of isoline domaine | | | | | | | o changeset: 2637:af2fae66daf5 | | | | user: Frederic Hecht | | | | date: Thu Apr 18 18:43:09 2013 +0200 | | | | summary: coorect bug in close isoline plugin | | | | | | | o changeset: 2636:ef891424f88b | | | | user: Frederic Hecht | | | | date: Thu Apr 18 16:47:38 2013 +0200 | | | | summary: add Sylvain dans le auteur de FreeFem++ | | | | | | | o changeset: 2635:ca6bcf9490a4 | | | | user: Frederic Hecht | | | | date: Fri Apr 12 10:18:57 2013 +0200 | | | | summary: remove graphics in case of -nw flags for batch test | | | | | | | o changeset: 2634:895803f79633 | | | | user: Frederic Hecht | | | | date: Fri Apr 12 09:42:12 2013 +0200 | | | | summary: correct typo | | | | | | | o changeset: 2633:9f74073f0c38 | | | | user: Frederic Hecht | | | | date: Fri Apr 12 09:39:02 2013 +0200 | | | | summary: up ./CheckAll of win32 | | | | | | | o changeset: 2632:35d4982c7d87 | | | | user: Frederic Hecht | | | | date: Thu Apr 11 10:14:24 2013 +0200 | | | | summary: add patch of freebsd on mshmet | | | | | | | o changeset: 2631:88e6ad0b5eae | | | | user: Frederic Hecht | | | | date: Tue Apr 09 08:14:58 2013 +0200 | | | | summary: cadd message is case of no compile in configure | | | | | | | o changeset: 2630:b7c3c4a72d2d | | | | user: Frederic Hecht | | | | date: Mon Apr 08 23:20:18 2013 +0200 | | | | summary: try to put error when mesh is un set . | | | | | | | o changeset: 2629:42e29538cbf1 | | | | user: Frederic Hecht | | | | date: Mon Apr 08 22:05:45 2013 +0200 | | | | summary: do gestion on non mesh (0 pointeur) | | | | | | | o changeset: 2628:bc0e94fb0c28 | | | | user: Frederic Hecht | | | | date: Mon Apr 08 20:54:46 2013 +0200 | | | | summary: add tools to remove interla faces | | | | | | | o changeset: 2627:19af33493619 | | | | user: Frederic Hecht | | | | date: Mon Apr 08 18:01:17 2013 +0200 | | | | summary: coormit glumesh in 2d of no mesh (ok) | | | | | | | o changeset: 2626:865b4afb98eb | | | | user: Frederic Hecht | | | | date: Wed Apr 03 21:50:43 2013 +0200 | | | | summary: update ffglut | | | | | | | o changeset: 2625:21078f2bcf45 | | | | user: Frederic Hecht | | | | date: Wed Apr 03 09:16:57 2013 +0200 | | | | summary: reput esc in ffglut to stop | | | | | | | o changeset: 2624:6ee46703380b | | | | user: Frederic Hecht | | | | date: Tue Apr 02 11:28:02 2013 +0200 | | | | summary: coorect stop ffglut in case of bug | | | | | | | o changeset: 2623:6b417f8e333b | | | | user: Frederic Hecht | | | | date: Fri Mar 29 08:59:00 2013 +0100 | | | | summary: coorect the doc for new graphic option | | | | | | | o changeset: 2622:d7215ddbcf5a | | | | user: Frederic Hecht | | | | date: Thu Mar 28 23:46:05 2013 +0100 | | | | summary: add new graphic event and multy windows | | | | | | | o changeset: 2621:8e54a67d70fe | | | | user: Frederic Hecht | | | | date: Thu Mar 28 22:09:35 2013 +0100 | | | | summary: pass to v 3.22 | | | | | | | o changeset: 2620:7a4a75730418 | | | | user: Frederic Hecht | | | | date: Thu Mar 28 21:26:08 2013 +0100 | | | | summary: update plot for multy windows | | | | | | | o changeset: 2619:eb24ff98d1d1 | | | | user: Frederic Hecht | | | | date: Tue Mar 26 23:41:03 2013 +0100 | | | | summary: solve b off int overflow in gibbs renumbering | | | | | | | o changeset: 2618:c2fce2359ce2 | | | | user: Frederic Hecht | | | | date: Mon Mar 25 16:21:52 2013 +0100 | | | | summary: add type of real , int , complex in doc | | | | | | | o changeset: 2617:915914787d79 | | | | user: Frederic Hecht | | | | date: Fri Mar 22 23:24:47 2013 +0100 | | | | summary: correct sheel plug for windows | | | | | | | o changeset: 2616:2bc25eab7305 | | | | user: Frederic Hecht | | | | date: Fri Mar 22 22:25:49 2013 +0100 | | | | summary: cooret shell for windows | | | | | | | o changeset: 2615:e4965faa0d98 | | | | user: Frederic Hecht | | | | date: Fri Mar 22 21:55:43 2013 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2614:eb0e30cf59c6 | | | | user: Frederic Hecht | | | | date: Fri Mar 22 21:27:43 2013 +0100 | | | | summary: correct Makefile for cleanning | | | | | | | o changeset: 2613:ff917977e3ac | | | | user: Frederic Hecht | | | | date: Fri Mar 22 10:23:58 2013 +0100 | | | | summary: add getenv in shell plugin | | | | | | | o changeset: 2612:2411bba1d923 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 16:37:31 2013 +0100 | | | | summary: end for pardiso on hpc1 | | | | | | | o changeset: 2611:a33781429270 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 16:12:29 2013 +0100 | | | | summary: next PARDISO mkl hpc1 | | | | | | | o changeset: 2610:e2b27fa668bd | | | | user: Frederic Hecht | | | | date: Thu Mar 21 15:55:35 2013 +0100 | | | | summary: blas / mlk hpc1 pb .. | | | | | | | o changeset: 2609:ddb3de28b4b9 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 15:41:14 2013 +0100 | | | | summary: next step mkl | | | | | | | o changeset: 2608:b4a043b50359 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 15:31:14 2013 +0100 | | | | summary: mkl next step .. | | | | | | | o changeset: 2607:988959bff8b8 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 14:21:30 2013 +0100 | | | | summary: MAJ mlk | | | | | | | o changeset: 2606:38b95806d70a | | | | user: Frederic Hecht | | | | date: Thu Mar 21 12:02:32 2013 +0100 | | | | summary: correct mkl seach in autoconf ... | | | | | | | o changeset: 2605:f742f2600c99 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 10:37:50 2013 +0100 | | | | summary: add depend mkl to paridiso | | | | | | | o changeset: 2604:8100a6d971e7 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 10:31:34 2013 +0100 | | | | summary: REMOVE Mpi from PARDISO | | | | | | | o changeset: 2603:31e73a49d8f3 | | | | user: Frederic Hecht | | | | date: Thu Mar 21 09:21:12 2013 +0100 | | | | summary: correct 3d trunc . and type in CheckPtr | | | | | | | o changeset: 2602:b0783e4cb2d3 | | | | user: Frederic Hecht | | | | date: Tue Mar 19 09:02:13 2013 +0100 | | | | summary: correct pb in gestion of outside flag in case of brute force search of tet contening a point | | | | | | | o changeset: 2601:090c847ad8c8 | | | | user: Frederic Hecht | | | | date: Fri Mar 15 18:37:05 2013 +0100 | | | | summary: coorect typo | | | | | | | o changeset: 2600:3c995bdf4b50 | | | | user: Frederic Hecht | | | | date: Fri Mar 15 16:51:31 2013 +0100 | | | | summary: v 3.21-1 autoreconf. | | | | | | | o changeset: 2599:71cd2d5a350f | | | | user: Frederic Hecht | | | | date: Fri Mar 15 16:50:34 2013 +0100 | | | | summary: passe to versioon 3.21-1 | | | | | | | o changeset: 2598:3f9a6c79377a | | | | user: Frederic Hecht | | | | date: Tue Mar 05 21:03:03 2013 +0100 | | | | summary: correct timer for umfpack | | | | | | | o changeset: 2597:206af6393108 | | | | user: Frederic Hecht | | | | date: Wed Feb 20 22:02:06 2013 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2596:8a575742fc6f | | | | user: Frederic Hecht | | | | date: Wed Feb 20 21:57:57 2013 +0100 | | | | summary: change umpack to no version | | | | | | | o changeset: 2595:9af00b7818c1 | | | | user: Frederic Hecht | | | | date: Thu Feb 14 08:11:01 2013 -0600 | | | | summary: coorect ref value of fluidstruct examples | | | | | | | o changeset: 2594:43b25e32651f | | | | user: Frederic Hecht | | | | date: Wed Feb 13 23:13:04 2013 -0600 | | | | summary: add n, resize of arry of finite element function ... | | | | | | | o changeset: 2593:54f4ad3d3362 | | | | user: Frederic Hecht | | | | date: Tue Feb 12 18:14:19 2013 -0600 | | | | summary: correct doc for NSUzawaCahouetChabart.edp | | | | | | | o changeset: 2592:aac1b5aec871 | | | | user: Frederic Hecht | | | | date: Mon Feb 04 08:19:25 2013 -0600 | | | | summary: up. INNOCATION | | | | | | | o changeset: 2591:f14702ce2e6d | | | | user: Frederic Hecht | | | | date: Mon Feb 04 08:18:36 2013 -0600 | | | | summary: correct typo | | | | | | | o changeset: 2590:7a3472e50c69 | | | | user: Frederic Hecht | | | | date: Mon Jan 28 14:20:28 2013 +0100 | | | | summary: remove export MACOSX_DEPLOYMENT_TARGET=10.4 on macos (too old stuff) | | | | | | | o changeset: 2589:a959a31a2912 | | | | user: Frederic Hecht | | | | date: Mon Jan 28 09:39:30 2013 +0100 | | | | summary: coorect in change function the flabel tools. | | | | | | | o changeset: 2588:f53ea48bdac4 | | | | user: Frederic Hecht | | | | date: Thu Jan 24 18:23:48 2013 +0100 | | | | summary: rm bad file | | | | | | | o changeset: 2587:b1b23c7916a3 | | | | user: Frederic Hecht | | | | date: Wed Jan 23 16:25:01 2013 +0100 | | | | summary: coorect missing build of quadtree in gmesh 2d case | | | | | | | o changeset: 2586:dbd8bda95c9c | | | | user: Frederic Hecht | | | | date: Mon Jan 21 18:28:55 2013 +0100 | | | | summary: correct ff-mpirun to make local launch in some cas | | | | | | | o changeset: 2585:232b71bc7c24 | | | | user: Frederic Hecht | | | | date: Sun Jan 20 20:55:49 2013 +0100 | | | | summary: pass to version 3.20-3 | | | | | | | o changeset: 2584:36c600f16fc4 | | | | user: Frederic Hecht | | | | date: Fri Jan 18 21:57:09 2013 +0100 | | | | summary: correct the new mmg3d4 | | | | | | | o changeset: 2583:fc1d1f80a3de | | | | user: Frederic Hecht | | | | date: Tue Jan 15 10:09:22 2013 +0100 | | | | summary: clean scalapack makefile | | | | | | | o changeset: 2582:b1d5e28701fc | | | | user: Frederic Hecht | | | | date: Tue Jan 15 09:38:04 2013 +0100 | | | | summary: coorect scalapack lib without extern blacs add .oo file in lib | | | | | | | o changeset: 2581:f7c9c3f0e753 | | | | user: Frederic Hecht | | | | date: Thu Jan 10 11:26:13 2013 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2580:ff72eeaffa02 | | | | user: Frederic Hecht | | | | date: Thu Jan 10 10:59:53 2013 +0100 | | | | summary: reomve blacs lib now include in scalapack. | | | | | | | o changeset: 2579:8f891641d4e6 | | | | user: Frederic Hecht | | | | date: Thu Jan 10 10:50:52 2013 +0100 | | | | summary: add blacs in scalapack lib . | | | | | | | o changeset: 2578:3e68b323cae8 | | | | user: Frederic Hecht | | | | date: Thu Jan 10 10:45:12 2013 +0100 | | | | summary: correct type in scalapack | | | | | | | o changeset: 2577:2ebfff8d40ea | | | | user: Frederic Hecht | | | | date: Thu Jan 10 10:41:32 2013 +0100 | | | | summary: coorect -FPIC compile falgs in scalapack 2.02 | | | | | | | o changeset: 2576:1e1b16af7ef3 | | | | user: Frederic Hecht | | | | date: Tue Jan 08 15:32:18 2013 +0100 | | | | summary: correct DOC freefem++ notepad++ launch freefem++ with lauchff++ | | | | | | | o changeset: 2575:45ef0341b9de | | | | user: Frederic Hecht | | | | date: Fri Dec 21 17:04:13 2012 +0100 | | | | summary: correct def on WGET in scalapack MAKEFILE | | | | | | | o changeset: 2574:43e587d524f2 | | | | user: Frederic Hecht | | | | date: Fri Dec 21 10:05:53 2012 +0100 | | | | summary: coorect typo | | | | | | | o changeset: 2573:706b1fb04002 | | | | user: Frederic Hecht | | | | date: Thu Dec 06 22:50:24 2012 +0100 | | | | summary: update pipe.cpp interface add | | | | | | | o changeset: 2572:75958d95b25a | | | | user: Frederic Hecht | | | | date: Thu Nov 29 17:50:38 2012 +0100 | | | | summary: move PARDISO to example++-load ( not MPI program) | | | | | | | o changeset: 2571:22c5533569ad | | | | user: Frederic Hecht | | | | date: Thu Nov 29 17:38:03 2012 +0100 | | | | summary: remove old version ... | | | | | | | o changeset: 2570:a3e882fd71c3 | | | | user: Frederic Hecht | | | | date: Thu Nov 29 14:45:38 2012 +0100 | | | | summary: PASS PARDISO to complex (not test ..) | | | | | | | o changeset: 2569:e916e4a8e005 | | | | user: Frederic Hecht | | | | date: Thu Nov 29 11:51:21 2012 +0100 | | | | summary: Coorect SetDefaultSolver in all case (now in main) | | | | | | | o changeset: 2568:73fcad054f91 | | | | user: Frederic Hecht | | | | date: Thu Nov 29 10:29:35 2012 +0100 | | | | summary: update MUMPS mpi complex version | | | | | | | o changeset: 2567:85a427c2f918 | | | | user: Frederic Hecht | | | | date: Wed Nov 28 23:20:46 2012 +0100 | | | | summary: put compex in MUMPS in progress | | | | | | | o changeset: 2566:1beb3cf38e1d | | | | user: Frederic Hecht | | | | date: Wed Nov 28 22:19:39 2012 +0100 | | | | summary: add compile MUMPS and PARDISO | | | | | | | o changeset: 2565:ade7d8e2fd80 | | | | user: Frederic Hecht | | | | date: Wed Nov 28 22:16:47 2012 +0100 | | | | summary: coorect MUMPS.cpp | | | | | | | o changeset: 2564:820d39a3c8cf | | | | user: Frederic Hecht | | | | date: Wed Nov 28 22:11:16 2012 +0100 | | | | summary: correct metis Makefile | | | | | | | o changeset: 2563:284eaf041a4b | | | | user: Frederic Hecht | | | | date: Wed Nov 28 21:28:36 2012 +0100 | | | | summary: type erreur missing Makefile code for camd | | | | | | | o changeset: 2562:b54f279c8c97 | | | | user: Frederic Hecht | | | | date: Wed Nov 28 21:22:21 2012 +0100 | | | | summary: add new matrix solver interface (see P. Jolivet) | | | | | | | o changeset: 2561:c9eae98ad5dc | | | | user: Frederic Hecht | | | | date: Fri Nov 02 22:59:13 2012 +0100 | | | | summary: coorect missing setting nuTriangle | | | | | | | o changeset: 2560:2eaedd8688ce | | | | user: Frederic Hecht | | | | date: Fri Nov 02 22:36:18 2012 +0100 | | | | summary: coorect missing of set nuTriangle some time | | | | | | | o changeset: 2559:ee9c67a82a1d | | | | user: Frederic Hecht | | | | date: Tue Oct 30 18:25:43 2012 +0100 | | | | summary: correct mistak in mmg3d Makefile | | | | | | | o changeset: 2558:e0792728a848 | | | | user: Frederic Hecht | | | | date: Fri Oct 26 16:10:48 2012 +0200 | | | | summary: coorect change of intallfaces integral | | | | | | | o changeset: 2557:a134cc81aaf2 | | | | user: Frederic Hecht | | | | date: Thu Oct 25 10:03:41 2012 +0200 | | | | summary: remove const in cblas interface sdot mistake in openblas | | | | | | | o changeset: 2556:dc973b75b634 | | | | user: Frederic Hecht | | | | date: Thu Oct 25 08:04:52 2012 +0200 | | | | summary: coorect PB with OpenBlas cblas include without const in parameter | | | | | | | o changeset: 2555:6fa9b9c59829 | | | | user: Frederic Hecht | | | | date: Tue Oct 16 17:31:25 2012 +0200 | | | | summary: add missing compile files | | | | | | | o changeset: 2554:43560825cafe | | | | user: Frederic Hecht | | | | date: Wed Oct 10 15:21:51 2012 +0200 | | | | summary: correct pipe.edp example to run under windows. | | | | | | | o changeset: 2553:395f577c1a69 | | | | user: Frederic Hecht | | | | date: Mon Oct 08 11:53:33 2012 +0900 | | | | summary: add pipe plugin to link with other soft | | | | | | | o changeset: 2552:db4af2db147e | | | | user: Frederic Hecht | | | | date: Sun Oct 07 14:11:44 2012 +0900 | | | | summary: do small coorection of windows | | | | | | | o changeset: 2551:d32ffb11bec9 | | | | user: Frederic Hecht | | | | date: Sun Oct 07 11:18:26 2012 +0900 | | | | summary: coorect pb to set C io under winder | | | | | | | o changeset: 2550:f3986a910f80 | | | | user: Frederic Hecht | | | | date: Sat Oct 06 22:34:10 2012 +0900 | | | | summary: type | | | | | | | o changeset: 2549:f6229d0989bb | | | | user: Frederic Hecht | | | | date: Sat Oct 06 22:30:02 2012 +0900 | | | | summary: correct mumps compilation | | | | | | | o changeset: 2548:a1910dbcf7f9 | | | | user: Frederic Hecht | | | | date: Sat Oct 06 11:50:54 2012 +0900 | | | | summary: correct pb of segflaut on window atexit when creating the log file | | | | | | | o changeset: 2547:1626cbdfe5d6 | | | | user: Frederic Hecht | | | | date: Sat Oct 06 10:51:50 2012 +0900 | | | | summary: coorect typo | | | | | | | o changeset: 2546:7a7fba157b77 | | | | user: Frederic Hecht | | | | date: Sat Oct 06 10:50:08 2012 +0900 | | | | summary: add option to remove console output on windows | | | | | | | o changeset: 2545:b192e8d7cbd3 | | | | user: Frederic Hecht | | | | date: Sat Oct 06 10:29:16 2012 +0900 | | | | summary: correct thing of windows porting | | | | | | | o changeset: 2544:1b485471f601 | | | | user: Frederic Hecht | | | | date: Thu Oct 04 16:13:47 2012 +0200 | | | | summary: coorect pb compile windows | | | | | | | o changeset: 2543:b0e5ed55fcb8 | | | | user: Frederic Hecht | | | | date: Wed Oct 03 18:34:29 2012 +0200 | | | | summary: correct mmg3d with new version | | | | | | | o changeset: 2542:a2661dc3cf87 | | | | user: Frederic Hecht | | | | date: Wed Oct 03 15:01:12 2012 +0200 | | | | summary: correct pb with drawbdmesh ( not compile now), | | | | | | | o changeset: 2541:5540ca108c29 | | | | user: Frederic Hecht | | | | date: Wed Oct 03 14:38:28 2012 +0200 | | | | summary: add find root of real poly in gsl plugin | | | | | | | o changeset: 2540:7fcb20950af8 | | | | user: Frederic Hecht | | | | date: Wed Sep 26 15:31:46 2012 +0200 | | | | summary: remove drawbdmesh on windows | | | | | | | o changeset: 2539:3646196ba7b4 | | | | user: Frederic Hecht | | | | date: Tue Sep 25 13:16:23 2012 +0200 | | | | summary: A left scalar mul with formal arry. | | | | | | | o changeset: 2538:004c3ce519db | | | | user: Frederic Hecht | | | | date: Fri Sep 21 14:52:11 2012 +0200 | | | | summary: try a build 3.20 version | | | | | | | o changeset: 2537:4ea423174745 | | | | user: Frederic Hecht | | | | date: Fri Sep 21 11:37:23 2012 +0200 | | | | summary: add levelset integral in 2d.. | | | | | | | o changeset: 2536:3df0231f5788 | | | | user: Frederic Hecht | | | | date: Wed Sep 19 15:55:46 2012 +0200 | | | | summary: coorect cout | | | | | | | o changeset: 2535:1813e516c73c | | | | user: Frederic Hecht | | | | date: Wed Sep 19 15:49:51 2012 +0200 | | | | summary: correct isoline.cpp hard ... | | | | | | | o changeset: 2534:d63f9b0d6a90 | | | | user: Frederic Hecht | | | | date: Tue Sep 18 21:17:21 2012 +0200 | | | | summary: correct isoline.cpp bug some time .... | | | | | | | o changeset: 2533:9a0f4ba5bc83 | | | | user: Frederic Hecht | | | | date: Wed Sep 05 22:33:04 2012 +0200 | | | | summary: do coorect off clang++ compiler | | | | | | | o changeset: 2532:7268da0a32dd | | | | user: Frederic Hecht | | | | date: Wed Sep 05 21:59:44 2012 +0200 | | | | summary: correct big problem with clang++ compiler ... | | | | | | | o changeset: 2531:bf616e104e58 | | | | user: Frederic Hecht | | | | date: Wed Sep 05 21:56:56 2012 +0200 | | | | summary: coorect pb with clang compile, verif strange.. | | | | | | | o changeset: 2530:10fbabb7ca26 | | | | user: Frederic Hecht | | | | date: Wed Sep 05 14:55:29 2012 +0200 | | | | summary: add formal tools Cofact, det 3x3, : on formal array. | | | | | | | o changeset: 2529:4603f7ce0737 | | | | user: Frederic Hecht | | | | date: Tue Sep 04 16:41:21 2012 +0200 | | | | summary: clang next step. | | | | | | | o changeset: 2528:18d5c72b3f8b | | | | user: Frederic Hecht | | | | date: Tue Sep 04 10:32:46 2012 +0200 | | | | summary: do correct for clang compiler | | | | | | | o changeset: 2527:061c058bf92d | | | | user: Frederic Hecht | | | | date: Mon Sep 03 16:18:48 2012 +0200 | | | | summary: correct for c++11 | | | | | | | o changeset: 2526:47944725e009 | | | | user: Frederic Hecht | | | | date: Tue Aug 28 14:21:56 2012 +0200 | | | | summary: update README macos | | | | | | | o changeset: 2525:d54e7f17997b | | | | user: Frederic Hecht | | | | date: Tue Aug 28 12:53:41 2012 +0200 | | | | summary: add CheckMPIMacLib.sh and CheckMacLib.sh taget in makefile for mac pkg install | | | | | | | o changeset: 2524:8fde78f05ac0 | | | | user: Frederic Hecht | | | | date: Mon Aug 27 16:03:36 2012 +0200 | | | | summary: remove print in sparse solver | | | | | | | o changeset: 2523:d6c07fd2ec36 | | | | user: Frederic Hecht | | | | date: Sun Aug 26 21:27:19 2012 +0200 | | | | summary: add missing operator ?: of bool | | | | | | | o changeset: 2522:e5a90f5a7283 | | | | user: Frederic Hecht | | | | date: Thu Aug 16 09:47:15 2012 +0200 | | | | summary: revome print ... | | | | | | | o changeset: 2521:91006696c311 | | | | user: Frederic Hecht | | | | date: Tue Aug 14 21:17:02 2012 +0200 | | | | summary: correct mistake find by P. Jolivet. | | | | | | | o changeset: 2520:ef81308ec4f1 | | | | user: Frederic Hecht | | | | date: Sun Aug 12 22:07:52 2012 +0200 | | | | summary: cooorect automatic seach in configire (P Jolivet). | | | | | | | o changeset: 2519:4422559d360a | | | | user: Frederic Hecht | | | | date: Mon Aug 06 23:12:27 2012 +0200 | | | | summary: add comment of my installation | | | | | | | o changeset: 2518:27d04b01bb9d | | | | user: Frederic Hecht | | | | date: Mon Aug 06 00:14:04 2012 +0200 | | | | summary: correct Superludist with g++ v 4.8 | | | | | | | o changeset: 2517:08658feae475 | | | | user: Frederic Hecht | | | | date: Sun Aug 05 23:37:08 2012 +0200 | | | | summary: forget files | | | | | | | o changeset: 2516:c2d91d216c32 | | | | user: Frederic Hecht | | | | date: Sun Aug 05 23:31:52 2012 +0200 | | | | summary: coerect Superlu.cpp of g++ v 4.8 add missong this-> | | | | | | | o changeset: 2515:68577323c46d | | | | user: Frederic Hecht | | | | date: Sun Aug 05 15:17:51 2012 +0200 | | | | summary: change mac compiler gcc version 4.8.0 | | | | | | | o changeset: 2514:ce08661de7d5 | | | | user: Frederic Hecht | | | | date: Thu Jul 12 14:27:34 2012 +0200 | | | | summary: add example | | | | | | | o changeset: 2513:efd3db094bcf | | | | user: Frederic Hecht | | | | date: Thu Jul 12 14:00:47 2012 +0200 | | | | summary: add imax, imam, correct sctoch interface not // | | | | | | | o changeset: 2512:cd465304bca9 | | | | user: Frederic Hecht | | | | date: Wed Jun 13 20:04:15 2012 +0200 | | | | summary: add compile of shell | | | | | | | o changeset: 2511:250772fdd061 | | | | user: Frederic Hecht | | | | date: Wed Jun 13 20:00:36 2012 +0200 | | | | summary: add shell/unix interface | | | | | | | o changeset: 2510:bfac9dec081e | | | | user: Frederic Hecht | | | | date: Wed Jun 13 10:38:55 2012 +0200 | | | | summary: correct PB of cleanning memory of array real[int][int] ... | | | | | | | o changeset: 2509:4628b688eeaf | | | | user: Frederic Hecht | | | | date: Thu Jun 07 15:12:35 2012 +0200 | | | | summary: add missing include in some computer unistd.h | | | | | | | o changeset: 2508:031e9c676174 | | | | user: Frederic Hecht | | | | date: Thu Jun 07 08:16:38 2012 +0200 | | | | summary: correct mshmet makefile to force the recompilation | | | | | | | o changeset: 2507:1839c38ea7dc | | | | user: Frederic Hecht | | | | date: Thu Jun 07 08:06:55 2012 +0200 | | | | summary: chnge version to 3.19-2 | | | | | | | o changeset: 2506:80ae2baf5a8d | | | | user: Frederic Hecht | | | | date: Thu Jun 07 07:50:29 2012 +0200 | | | | summary: correct mshmet problem in case of 2 eigen value in Hessian. | | | | | | | o changeset: 2505:95e33e458008 | | | | user: Frederic Hecht | | | | date: Wed May 30 14:13:26 2012 +0200 | | | | summary: correct typo in font size in postcript interface | | | | | | | o changeset: 2504:f2cdbadf6faf | | | | user: Frederic Hecht | | | | date: Tue May 22 21:15:30 2012 +0200 | | | | summary: correct clean part of mshmet makefile + add | | | | | | | o changeset: 2503:bee48e40935e | | | | user: Frederic Hecht | | | | date: Tue May 15 11:48:05 2012 +0200 | | | | summary: correct missing const in qf11to25.cpp | | | | | | | o changeset: 2502:0232fb9d45b7 | | | | user: Frederic Hecht | | | | date: Tue May 15 11:39:15 2012 +0200 | | | | summary: add build of Quadratur formular in qf11to25.cpp plugins | | | | | | | o changeset: 2501:f20a2f3c7bd6 | | | | user: Frederic Hecht | | | | date: Mon May 14 21:04:26 2012 +0200 | | | | summary: set fftw to version 3.3.2 | | | | | | | o changeset: 2500:f5c0851c058c | | | | user: Frederic Hecht | | | | date: Wed May 09 22:26:21 2012 +0200 | | | | summary: update modif of Ernesto Aranda for new version of mmg3d | | | | | | | o changeset: 2499:de4c315dad33 | | | | user: Frederic Hecht | | | | date: Wed May 09 21:11:04 2012 +0200 | | | | summary: pass to version 3.19-1 | | | | | | | o changeset: 2498:7ecf46eb253d | | | | user: Frederic Hecht | | | | date: Wed May 09 21:06:07 2012 +0200 | | | | summary: add Ernesto Aranda change ... | | | | | | | o changeset: 2497:49f99f157b3c | | | | user: Frederic Hecht | | | | date: Mon May 07 10:27:41 2012 +0200 | | | | summary: coorect typo = -> != in configure (mkl sgi) | | | | | | | o changeset: 2496:f5814395a638 | | | | user: Frederic Hecht | | | | date: Mon May 07 10:14:08 2012 +0200 | | | | summary: remove of use of MKL scalapack and blacs with sgi MPI | | | | | | | o changeset: 2495:c3b18fa8f700 | | | | user: Frederic Hecht | | | | date: Thu May 03 19:07:10 2012 +0200 | | | | summary: remove MKLROOT form configure ( disaper in new mkl configure) | | | | | | | o changeset: 2494:d7658c0f681b | | | | user: Frederic Hecht | | | | date: Thu May 03 18:28:44 2012 +0200 | | | | summary: add correct in MUMPS mpi solver | | | | | | | o changeset: 2493:c5124bde5bc5 | | | | user: Frederic Hecht | | | | date: Thu May 03 11:01:00 2012 +0200 | | | | summary: remove cmake de configure | | | | | | | o changeset: 2492:83094b26702f | | | | user: Frederic Hecht | | | | date: Thu May 03 11:00:01 2012 +0200 | | | | summary: add count pour ptr in CheckPtr.cpp | | | | | | | o changeset: 2491:463c4c448187 | | | | user: Frederic Hecht | | | | date: Tue Apr 24 13:25:56 2012 +0200 | | | | summary: try to count memery pointeur | | | | | | | o changeset: 2490:66be2ba0ba65 | | | | user: Frederic Hecht | | | | date: Mon Apr 23 23:08:13 2012 +0200 | | | | summary: change version of superlu. | | | | | | | o changeset: 2489:d2bee8f1b140 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 17:09:00 2012 +0200 | | | | summary: update mmg3d swapar.o is also compile without optim. | | | | | | | o changeset: 2488:76e28b509475 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 16:51:03 2012 +0200 | | | | summary: correct atexit problem in mmg3 v4 .. | | | | | | | o changeset: 2487:cb2752aee207 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 15:40:23 2012 +0200 | | | | summary: correct Interface of Ipopt (ff-Ipopt) | | | | | | | o changeset: 2486:04bbadc57f58 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 14:16:51 2012 +0200 | | | | summary: carrect un set varable in mmage3d-v4 | | | | | | | o changeset: 2485:e83aa5d378f9 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 12:03:38 2012 +0200 | | | | summary: coorect ff-Ipopt version | | | | | | | o changeset: 2484:90cf49c9fbb5 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 11:33:36 2012 +0200 | | | | summary: coorect typo in innovation file | | | | | | | o changeset: 2483:baebf141d983 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 09:27:57 2012 +0200 | | | | summary: update INNOVATION file | | | | | | | o changeset: 2482:5ede79cd270b | | | | user: Frederic Hecht | | | | date: Fri Apr 20 09:21:18 2012 +0200 | | | | summary: correct typo | | | | | | | o changeset: 2481:0c075c537334 | | | | user: Frederic Hecht | | | | date: Fri Apr 20 08:48:58 2012 +0200 | | | | summary: add isNaN,IsInf,IsNormal FP fonction and | | | | | | | o changeset: 2480:290972213b56 | | | | user: Frederic Hecht | | | | date: Thu Apr 19 22:58:51 2012 +0200 | | | | summary: add a true scotch example | | | | | | | o changeset: 2479:c0c3c75dd20a | | | | user: Frederic Hecht | | | | date: Thu Apr 19 18:46:00 2012 +0200 | | | | summary: add sort of integer array | | | | | | | o changeset: 2478:08b71cf34320 | | | | user: Frederic Hecht | | | | date: Thu Apr 19 17:17:10 2012 +0200 | | | | summary: add missing file | | | | | | | o changeset: 2477:551aa5767d7f | | | | user: Frederic Hecht | | | | date: Thu Apr 19 17:12:43 2012 +0200 | | | | summary: coorect header of plugin | | | | | | | o changeset: 2476:a6258a786803 | | | | user: Frederic Hecht | | | | date: Thu Apr 19 16:46:43 2012 +0200 | | | | summary: add scotch interface thanks to P. Jolivet | | | | | | | o changeset: 2475:b7f9353707c0 | | | | user: Frederic Hecht | | | | date: Thu Apr 19 16:34:39 2012 +0200 | | | | summary: Pour P. Jolivet, | | | | | | | o changeset: 2474:e507d135fbf4 | | | | user: Frederic Hecht | | | | date: Thu Apr 19 16:28:28 2012 +0200 | | | | summary: correct bug in macro with operator .*= and ./= | | | | | | | o changeset: 2473:28d82b742e4e | | | | user: Frederic Hecht | | | | date: Mon Apr 16 13:54:02 2012 +0200 | | | | summary: comment in stable script examples++-3d/Laplace-Adapt-aniso-3d.edp | | | | | | | o changeset: 2472:f7c9fbfee29e | | | | user: Frederic Hecht | | | | date: Sun Apr 15 22:27:49 2012 +0200 | | | | summary: correct mmg3d new interface. | | | | | | | o changeset: 2471:67ac6a176e89 | | | | user: Frederic Hecht | | | | date: Sun Apr 15 10:36:30 2012 +0200 | | | | summary: correct build fo missing file during test in ttestio | | | | | | | o changeset: 2470:be230cbc9bb1 | | | | user: Frederic Hecht | | | | date: Wed Apr 11 22:46:11 2012 +0200 | | | | summary: update doc with isoline example | | | | | | | o changeset: 2469:7b55a13f44bf | | | | user: Frederic Hecht | | | | date: Wed Apr 11 18:15:57 2012 +0200 | | | | summary: correct type in edp files | | | | | | | o changeset: 2468:cb455028d3bc | | | | user: Frederic Hecht | | | | date: Thu Apr 05 17:59:05 2012 +0200 | | | | summary: correct pb plot in 3d-lemen;edp example | | | | | | | o changeset: 2467:a4495a14cc6f | | | | user: Frederic Hecht | | | | date: Thu Apr 05 17:41:19 2012 +0200 | | | | summary: correct Makefile for dist | | | | | | | o changeset: 2466:c1c7515b599d | | | | user: Frederic Hecht | | | | date: Thu Apr 05 17:38:21 2012 +0200 | | | | summary: remove assert of generate surface mesh ??? | | | | | | | o changeset: 2465:adf7a32dec37 | | | | user: Frederic Hecht | | | | date: Thu Apr 05 17:36:08 2012 +0200 | | | | summary: add new Ipopt example | | | | | | | o changeset: 2464:420d59368939 | | | | user: Frederic Hecht | | | | date: Thu Apr 05 17:17:53 2012 +0200 | | | | summary: pass to version 3.19 , and add Ipopt documentation | | | | | | | o changeset: 2463:684b603bce0f | | | | user: Frederic Hecht | | | | date: Tue Apr 03 15:35:04 2012 +0200 | | | | summary: change the return value of inv in lapack , reture info value | | | | | | | o changeset: 2462:43d891de7b5c | | | | user: Frederic Hecht | | | | date: Fri Mar 30 13:52:21 2012 +0200 | | | | summary: update IPOPT interface | | | | | | | o changeset: 2461:ff9197c7215e | | | | user: Frederic Hecht | | | | date: Thu Mar 22 19:02:18 2012 +0100 | | | | summary: forget all.edp (automatical rebuild) | | | | | | | o changeset: 2460:5f0193ae54c8 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 18:59:23 2012 +0100 | | | | summary: coorect install plugin | | | | | | | o changeset: 2459:33407ff589c1 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 18:52:47 2012 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2458:da832a4533ec | | | | user: Frederic Hecht | | | | date: Thu Mar 22 18:51:32 2012 +0100 | | | | summary: romve use file | | | | | | | o changeset: 2457:a70d6470d341 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 18:18:18 2012 +0100 | | | | summary: correct typo | | | | | | | o changeset: 2456:660e36d76368 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 18:14:56 2012 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2455:d1c7eb0f6226 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 17:48:02 2012 +0100 | | | | summary: coorect FFLAGS in ippot | | | | | | | o changeset: 2454:c7e70cac0ced | | | | user: Frederic Hecht | | | | date: Thu Mar 22 17:45:23 2012 +0100 | | | | summary: correct ipopt fortran flags | | | | | | | o changeset: 2453:fa1d39ecf8c5 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 17:00:18 2012 +0100 | | | | summary: correct chanhe of ff-IpOpt in ff-Ipopt | | | | | | | o changeset: 2452:603891d1341f | | | | user: Frederic Hecht | | | | date: Thu Mar 22 16:58:37 2012 +0100 | | | | summary: correcrt Ipot name | | | | | | | o changeset: 2451:abcfed2f161a | | | | user: Frederic Hecht | | | | date: Thu Mar 22 15:24:19 2012 +0100 | | | | summary: remove build file | | | | | | | o changeset: 2450:fd47a9cb93e6 | | | | user: Frederic Hecht | | | | date: Thu Mar 22 14:01:53 2012 +0100 | | | | summary: correct missing CFLAGS compile flige in ipopt | | | | | | | o changeset: 2449:9c4f3a731d8f | | | | user: Frederic Hecht | | | | date: Thu Mar 15 17:03:46 2012 +0100 | | | | summary: update freeyams versio | | | | | | | o changeset: 2448:57268fd78d95 | | | | user: Frederic Hecht | | | | date: Thu Mar 15 16:22:26 2012 +0100 | | | | summary: correct ipopt | | | | | | | o changeset: 2447:648085c768e2 | | | | user: Frederic Hecht | | | | date: Thu Mar 15 15:41:31 2012 +0100 | | | | summary: carrection iptop interface | | | | | | | o changeset: 2446:db7e1719d41d | | | | user: Frederic Hecht | | | | date: Wed Mar 14 10:03:06 2012 +0100 | | | | summary: coorect typo the WHERE file building | | | | | | | o changeset: 2445:9652b407c4d4 | | | | user: Frederic Hecht | | | | date: Wed Mar 14 09:40:38 2012 +0100 | | | | summary: correct msh3.cpp see INNOVATION | | | | | | | o changeset: 2444:0912ecf5b7b6 | | | | user: Frederic Hecht | | | | date: Tue Mar 13 19:22:46 2012 +0100 | | | | summary: correct type error | | | | | | | o changeset: 2443:f73f7abb9628 | | | | user: Frederic Hecht | | | | date: Mon Mar 12 20:42:20 2012 +0100 | | | | summary: add Ipopt interface, seems workinging | | | | | | | o changeset: 2442:18c51dd3fae0 | | | | user: Frederic Hecht | | | | date: Fri Mar 09 22:15:39 2012 +0100 | | | | summary: add nex example | | | | | | | o changeset: 2441:d857f8111e76 | | | | user: Frederic Hecht | | | | date: Fri Mar 09 22:12:33 2012 +0100 | | | | summary: add IpOpt interface | | | | | | | o changeset: 2440:9811138f1bc7 | | | | user: Frederic Hecht | | | | date: Fri Mar 09 22:02:20 2012 +0100 | | | | summary: add Ipopt interface | | | | | | | o changeset: 2439:939ad2584480 | | | | user: Frederic Hecht | | | | date: Wed Mar 07 21:58:28 2012 +0100 | | | | summary: correct pb of name in lapack in arpack configire variable | | | | | | | o changeset: 2438:cc334b6ba942 | | | | user: Frederic Hecht | | | | date: Wed Mar 07 20:31:44 2012 +0100 | | | | summary: add -mkl flgs in configure in test .. | | | | | | | o changeset: 2437:8f1418723ac1 | | | | user: Frederic Hecht | | | | date: Wed Mar 07 12:53:22 2012 +0100 | | | | summary: add missing operator A(1:3,3:4) on full matrix | | | | | | | o changeset: 2436:d8c7a95bab01 | | | | user: Frederic Hecht | | | | date: Tue Mar 06 23:13:13 2012 +0100 | | | | summary: add new example | | | | | | | o changeset: 2435:e9f77853f86a | | | | user: Frederic Hecht | | | | date: Tue Mar 06 22:57:22 2012 +0100 | | | | summary: add subarrey of full matrix. | | | | | | | o changeset: 2434:44e45a467771 | | | | user: Frederic Hecht | | | | date: Tue Mar 06 22:06:47 2012 +0100 | | | | summary: add new type of array , array of array. | | | | | | | o changeset: 2433:ff330cc9ed2a | | | | user: Frederic Hecht | | | | date: Fri Feb 24 17:43:14 2012 +0100 | | | | summary: add ipopt download | | | | | | | o changeset: 2432:6dd56733d650 | | | | user: Frederic Hecht | | | | date: Thu Feb 23 13:07:28 2012 +0100 | | | | summary: add install of libphread-2.dd or win32 | | | | | | | o changeset: 2431:2fbea8d0c565 | | | | user: Frederic Hecht | | | | date: Thu Feb 23 12:07:08 2012 +0100 | | | | summary: add pthread in mpi mumps | | | | | | | o changeset: 2430:96c02671ec5c | | | | user: Frederic Hecht | | | | date: Thu Feb 23 12:05:52 2012 +0100 | | | | summary: add pthread in WHERE-LIBARY-config for mumps-seq | | | | | | | o changeset: 2429:b83672d4b4f9 | | | | user: Frederic Hecht | | | | date: Wed Feb 22 23:18:22 2012 +0100 | | | | summary: correct typo in libseq path for mumps-seq compile | | | | | | | o changeset: 2428:9c218b0575fc | | | | user: Frederic Hecht | | | | date: Wed Feb 22 22:16:57 2012 +0100 | | | | summary: add MUMPS seq pluging | | | | | | | o changeset: 2427:e714f05e8c68 | | | | user: Frederic Hecht | | | | date: Mon Feb 20 10:02:23 2012 +0100 | | | | summary: add tag + correct missing file in windows distributiuon | | | | | | | o changeset: 2426:16116189f9fc | | | | user: Frederic Hecht | | | | date: Mon Feb 20 10:01:42 2012 +0100 | | | | summary: Added tag 3.18-1 for changeset 7a11ffa1f26e | | | | | | | o changeset: 2425:7a11ffa1f26e | | | | tag: 3.18-1 | | | | user: Frederic Hecht | | | | date: Fri Feb 17 16:14:54 2012 +0100 | | | | summary: correct edp .. | | | | | | | o changeset: 2424:ff06d18097d3 | | | | user: Frederic Hecht | | | | date: Fri Feb 17 15:21:24 2012 +0100 | | | | summary: coorect install windows | | | | | | | o changeset: 2423:5dc5d4a44a0f | | | | user: Frederic Hecht | | | | date: Fri Feb 17 15:16:38 2012 +0100 | | | | summary: correct missing file in makefiles | | | | | | | o changeset: 2422:297b8d9f6034 | | | | user: Frederic Hecht | | | | date: Wed Feb 15 22:00:56 2012 +0100 | | | | summary: update doc | | | | | | | o changeset: 2421:fc00fdf10fc8 | | | | user: Frederic Hecht | | | | date: Wed Feb 15 21:32:56 2012 +0100 | | | | summary: continuing update | | | | | | | o changeset: 2420:6cf5db8c5b72 | | | | user: Frederic Hecht | | | | date: Wed Feb 15 21:29:17 2012 +0100 | | | | summary: add .im, .re of array..compile test | | | | | | | o changeset: 2419:56dc83bd98f5 | | | | user: Frederic Hecht | | | | date: Wed Feb 15 21:01:22 2012 +0100 | | | | summary: add re , operator in complex sparce matrix | | | | | | | o changeset: 2418:04e97610e592 | | | | user: Frederic Hecht | | | | date: Tue Feb 14 21:46:23 2012 +0100 | | | | summary: add convert of im and re parl of complex sparse matrix | | | | | | | o changeset: 2417:c9503b6ad05c | | | | user: Frederic Hecht | | | | date: Tue Feb 14 15:30:45 2012 +0100 | | | | summary: correct norme lp in RNM thank yo a student. | | | | | | | o changeset: 2416:17002f8ac1e6 | | | | user: Frederic Hecht | | | | date: Mon Feb 13 17:12:46 2012 +0100 | | | | summary: add comment in INNOVATION file | | | | | | | o changeset: 2415:99a84a69a476 | | | | user: Frederic Hecht | | | | date: Mon Feb 13 16:49:40 2012 +0100 | | | | summary: add error in case of probleme ith periodic | | | | | | | o changeset: 2414:7e01a75cf0a2 | | | | user: Frederic Hecht | | | | date: Wed Feb 08 18:02:06 2012 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2413:7e1ce5867819 | | | | user: Frederic Hecht | | | | date: Wed Feb 08 18:01:07 2012 +0100 | | | | summary: add missing files | | | | | | | o changeset: 2412:1a9d248b0abe | | | | user: Frederic Hecht | | | | date: Wed Feb 08 17:57:12 2012 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2411:313f2537e2f6 | | | | user: Frederic Hecht | | | | date: Wed Feb 08 17:52:21 2012 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2410:f809aa7e43f9 | | | | user: Frederic Hecht | | | | date: Wed Feb 08 17:42:51 2012 +0100 | | | | summary: add missing files | | | | | | | o changeset: 2409:124a413008ed | | | | user: Frederic Hecht | | | | date: Wed Feb 08 16:34:17 2012 +0100 | | | | summary: correct Makefiles | | | | | | | o changeset: 2408:cbb20473adea | | | | user: Frederic Hecht | | | | date: Wed Feb 08 16:33:04 2012 +0100 | | | | summary: remove example without new adaptation schema | | | | | | | o changeset: 2407:9c7b8c0c8096 | | | | user: Frederic Hecht | | | | date: Wed Feb 08 16:24:20 2012 +0100 | | | | summary: add adpt tool for PK aniso adation in 2d | | | | | | | o changeset: 2406:40df8192a994 | | | | user: Frederic Hecht | | | | date: Fri Jan 20 15:36:57 2012 +0100 | | | | summary: coorect scriot | | | | | | | o changeset: 2405:9f521b6ad9e9 | | | | user: Frederic Hecht | | | | date: Thu Jan 19 13:37:05 2012 +0100 | | | | summary: correct DOC | | | | | | | o changeset: 2404:5c0462ce1574 | | | | user: Frederic Hecht | | | | date: Thu Jan 19 09:54:05 2012 +0100 | | | | summary: add New example in Chap 3. | | | | | | | o changeset: 2403:4bee3958de18 | | | |\ parent: 2401:64149fc11869 | | | | | parent: 2402:6d506087c6af | | | | | user: Frederic Hecht | | | | | date: Wed Jan 18 21:57:45 2012 +0100 | | | | | summary: merging with 3.18 (error FH) | | | | | | | | | o changeset: 2402:6d506087c6af | | | | | parent: 2400:9506aca1ea28 | | | | | user: Frederic Hecht | | | | | date: Wed Jan 18 21:36:47 2012 +0100 | | | | | summary: Added tag v3.18 for changeset 9506aca1ea28 | | | | | | | | o | changeset: 2401:64149fc11869 | | | |/ user: Frederic Hecht | | | | date: Wed Jan 18 21:34:52 2012 +0100 | | | | summary: correct file to compile with xcode 4.2 | | | | | | | o changeset: 2400:9506aca1ea28 | | | | tag: v3.18 | | | | user: Frederic Hecht | | | | date: Mon Jan 16 13:08:11 2012 +0100 | | | | summary: add line ininnovation | | | | | | | o changeset: 2399:153d0a5015bb | | | | user: Frederic Hecht | | | | date: Mon Jan 16 13:04:13 2012 +0100 | | | | summary: Correct NSprojection example | | | | | | | o changeset: 2398:2d9a79b70d5b | | | | user: Frederic Hecht | | | | date: Mon Jan 16 11:27:49 2012 +0100 | | | | summary: add redownload off mmg34 tar gz | | | | | | | o changeset: 2397:1fd0801dc393 | | | | user: Frederic Hecht | | | | date: Mon Jan 16 11:10:33 2012 +0100 | | | | summary: correct compile of mmg3d v4 | | | | | | | o changeset: 2396:f03a6f977499 | | | | user: Frederic Hecht | | | | date: Wed Jan 11 21:35:51 2012 +0100 | | | | summary: add missing file on windows | | | | | | | o changeset: 2395:5fcad65c5ece | | | | user: Frederic Hecht | | | | date: Wed Jan 11 21:04:00 2012 +0100 | | | | summary: passe to version 3.18 | | | | | | | o changeset: 2394:a8118bf9d0a5 | | | | user: Frederic Hecht | | | | date: Wed Jan 11 12:11:19 2012 +0100 | | | | summary: update isoline dll. | | | | | | | o changeset: 2393:d925ce8d8dd6 | | | | user: Frederic Hecht | | | | date: Tue Jan 10 21:08:06 2012 +0100 | | | | summary: correct mpigather | | | | | | | o changeset: 2392:03d927f3dda3 | | | | user: Frederic Hecht | | | | date: Tue Jan 10 20:50:00 2012 +0100 | | | | summary: correct parallelempi.cpp mpigather assert | | | | | | | o changeset: 2391:8898fcd7acce | | | | user: Frederic Hecht | | | | date: Tue Jan 10 18:40:58 2012 +0100 | | | | summary: change the isolineP1 load file by a isoline file | | | | | | | o changeset: 2390:b778cdbf73c1 | | | | user: Frederic Hecht | | | | date: Thu Dec 15 16:05:51 2011 +0100 | | | | summary: correct pb of offset in readmesh in ffglut | | | | | | | o changeset: 2389:cf6f4a7feea8 | | | | user: Frederic Hecht | | | | date: Thu Dec 15 11:41:53 2011 +0100 | | | | summary: coorect PB de shift of 1 in read .msh in 3d | | | | | | | o changeset: 2388:8cab02860a3c | | | | user: Frederic Hecht | | | | date: Wed Nov 30 15:02:31 2011 +0100 | | | | summary: correct mistake in mpi interface (wrong assert and correct essai.edp) | | | | | | | o changeset: 2387:d3f7e78540eb | | | | user: Frederic Hecht | | | | date: Wed Nov 30 14:42:47 2011 +0100 | | | | summary: corret MPI problem | | | | | | | o changeset: 2386:1a638fa49fbe | | | | user: Frederic Hecht | | | | date: Thu Nov 17 15:12:11 2011 +0100 | | | | summary: correct BLACS interface ( mkl and debain case) | | | | | | | o changeset: 2385:111b11d41665 | | | | user: Frederic Hecht | | | | date: Thu Nov 17 13:39:47 2011 +0100 | | | | summary: coorect pb in blacs lib order in WHERE_LIB | | | | | | | o changeset: 2384:02fd8c5643f3 | | | | user: Frederic Hecht | | | | date: Wed Nov 16 22:10:38 2011 +0100 | | | | summary: correct mshmet | | | | | | | o changeset: 2383:c7dc28fb1321 | | | | user: Frederic Hecht | | | | date: Wed Nov 16 18:30:17 2011 +0100 | | | | summary: correct configure.ac (remove trick on odl mmg3 version (not use at all) | | | | | | | o changeset: 2382:f661f9f8e47b | | | | user: Frederic Hecht | | | | date: Wed Nov 16 17:56:03 2011 +0100 | | | | summary: remove double symbloe in freeyam with meshlib | | | | | | | o changeset: 2381:5732efc58a03 | | | | user: Frederic Hecht | | | | date: Wed Nov 16 16:02:42 2011 +0100 | | | | summary: remove compress tools in scotch by default | | | | | | | o changeset: 2380:1f7181ed77e3 | | | | user: Frederic Hecht | | | | date: Wed Nov 16 11:39:39 2011 +0100 | | | | summary: correct mistake in ymas interface | | | | | | | o changeset: 2379:f671d72ac333 | | | | user: Frederic Hecht | | | | date: Wed Nov 16 11:09:26 2011 +0100 | | | | summary: uodate to last freeymas version | | | | | | | o changeset: 2378:b5cf0e99fbc4 | | | | user: Frederic Hecht | | | | date: Tue Nov 15 17:42:08 2011 +0100 | | | | summary: correct aprmetis and mmg3d opt version | | | | | | | o changeset: 2377:c9f68542a064 | | | | user: Frederic Hecht | | | | date: Tue Nov 15 16:19:23 2011 +0100 | | | | summary: add small correct of fratran stuff in ff-c++ et find mpirun in configure | | | | | | | o changeset: 2376:e475dc98bc5b | | | | user: Frederic Hecht | | | | date: Tue Nov 08 22:30:16 2011 +0100 | | | | summary: add new ffapi.o in src/bin-win32/Makefile | | | | | | | o changeset: 2375:0f35b35f0203 | | | | user: Frederic Hecht | | | | date: Tue Nov 08 22:26:08 2011 +0100 | | | | summary: add missing file | | | | | | | o changeset: 2374:00b37e15d8b8 | | | | user: Frederic Hecht | | | | date: Tue Nov 08 22:12:36 2011 +0100 | | | | summary: make hack for true random number on window (use of mersen randow) | | | | | | | o changeset: 2373:81725e52c648 | | | | user: Frederic Hecht | | | | date: Tue Nov 08 21:33:42 2011 +0100 | | | | summary: correct typo error and pdate the doc. | | | | | | | o changeset: 2372:729356646c52 | | | | user: Frederic Hecht | | | | date: Tue Nov 08 21:02:28 2011 +0100 | | | | summary: correct the new auto laod interface ... | | | | | | | o changeset: 2371:97802e3f5d5e | | | | user: Frederic Hecht | | | | date: Sun Nov 06 20:59:48 2011 +0100 | | | | summary: passe to versio 3.17 | | | | | | | o changeset: 2370:07ee613471d9 | | | | user: Frederic Hecht | | | | date: Sun Nov 06 15:46:21 2011 +0100 | | | | summary: coorect PB off pluging ( ok may be) | | | | | | | o changeset: 2369:3a017668777d | | | | user: Frederic Hecht | | | | date: Fri Nov 04 18:45:51 2011 +0100 | | | | summary: correct Typo error in multiple include defence .. | | | | | | | o changeset: 2368:72f8424630ee | | | | user: Frederic Hecht | | | | date: Fri Nov 04 16:54:48 2011 +0100 | | | | summary: up innovation | | | | | | | o changeset: 2367:e0d1eed7452a | | | | user: Frederic Hecht | | | | date: Fri Nov 04 16:28:33 2011 +0100 | | | | summary: update plugin to by compatible with new load schema | | | | | | | o changeset: 2366:045f330b4eba | | | | user: Frederic Hecht | | | | date: Wed Nov 02 21:43:35 2011 +0100 | | | | summary: build a work version of mpi on window base of sdk windows hpc | | | | | | | o changeset: 2365:896119ddcba9 | | | | user: Frederic Hecht | | | | date: Wed Oct 26 21:50:31 2011 +0200 | | | | summary: correct missing | | | | | | | o changeset: 2364:6162056c2706 | | | | user: Frederic Hecht | | | | date: Wed Oct 26 13:27:13 2011 +0200 | | | | summary: pass to v 3.16-1 | | | | | | | o changeset: 2363:bf3e6531f554 | | | | user: Frederic Hecht | | | | date: Wed Oct 26 13:12:33 2011 +0200 | | | | summary: add missing file | | | | | | | o changeset: 2362:f38424524a39 | | | | user: Frederic Hecht | | | | date: Wed Oct 26 13:10:05 2011 +0200 | | | | summary: add patch of Marco Atzeri for cygwin | | | | | | | o changeset: 2361:392218d17485 | | | | user: Frederic Hecht | | | | date: Fri Oct 21 14:47:43 2011 +0200 | | | | summary: doc is 3.16-1 | | | | | | | o changeset: 2360:174539a666e8 | | | | user: Frederic Hecht | | | | date: Fri Oct 21 14:44:44 2011 +0200 | | | | summary: update doc S. Auliac (optim) | | | | | | | o changeset: 2359:e2bd8b52269f | | | | user: Frederic Hecht | | | | date: Fri Oct 21 14:17:20 2011 +0200 | | | | summary: MAJ INNOVATION | | | | | | | o changeset: 2358:539aa3bc4a1b | | | | user: Frederic Hecht | | | | date: Fri Oct 21 14:13:58 2011 +0200 | | | | summary: add mpi_cmaes lib and examples | | | | | | | o changeset: 2357:38c7f4d3ea7b | | | | user: Frederic Hecht | | | | date: Thu Oct 20 19:53:57 2011 +0200 | | | | summary: add NLopt interface and cmaes interce (thank to S. Auliac) | | | | | | | o changeset: 2356:2edd97964eeb | | | | user: Frederic Hecht | | | | date: Fri Oct 14 14:35:20 2011 +0200 | | | | summary: add truc to remove 2 init | | | | | | | o changeset: 2355:408618fc2d14 | | | | user: Frederic Hecht | | | | date: Thu Oct 13 23:09:39 2011 +0200 | | | | summary: correct auto load of mumps | | | | | | | o changeset: 2354:233a5a7f55c1 | | | | user: Frederic Hecht | | | | date: Thu Oct 13 23:07:31 2011 +0200 | | | | summary: correct pb of autoinitsfunct | | | | | | | o changeset: 2353:09b0580dda3a | | | | user: Frederic Hecht | | | | date: Wed Oct 12 15:01:36 2011 +0200 | | | | summary: add tool to automatique load | | | | | | | o changeset: 2352:4bf39e36e2aa | | | | user: Frederic Hecht | | | | date: Fri Oct 07 22:10:24 2011 +0200 | | | | summary: coorect pb of alloaction | | | | | | | o changeset: 2351:383e5c0deedb | | | | user: Frederic Hecht | | | | date: Fri Oct 07 21:17:54 2011 +0200 | | | | summary: change testio.edp ttestio.edp | | | | | | | o changeset: 2350:70f9874ad0e4 | | | | user: Frederic Hecht | | | | date: Fri Oct 07 17:42:22 2011 +0200 | | | | summary: coorect example | | | | | | | o changeset: 2349:b3c7905f858b | | | | user: Frederic Hecht | | | | date: Thu Oct 06 17:30:42 2011 +0200 | | | | summary: coorect type in mmg3v4 | | | | | | | o changeset: 2348:cade5380b91e | | | | user: Frederic Hecht | | | | date: Thu Oct 06 17:24:50 2011 +0200 | | | | summary: correct CFALGS | | | | | | | o changeset: 2347:70b2d6267d97 | | | | user: Frederic Hecht | | | | date: Thu Oct 06 16:55:39 2011 +0200 | | | | summary: correct typo error | | | | | | | o changeset: 2346:d48570028111 | | | | user: Frederic Hecht | | | | date: Thu Oct 06 13:19:02 2011 +0200 | | | | summary: correct typo error and warning | | | | | | | o changeset: 2345:ccd64b80d57f | | | | user: Frederic Hecht | | | | date: Thu Oct 06 12:52:17 2011 +0200 | | | | summary: try to bluid v 3.15 | | | | | | | o changeset: 2344:d47b9dda863c | | | | user: Frederic Hecht | | | | date: Thu Oct 06 11:41:48 2011 +0200 | | | | summary: coorect pb in real[int,int] A, B; B=A' , etc.. | | | | | | | o changeset: 2343:c3dee854061e | | | | user: Frederic Hecht | | | | date: Wed Oct 05 18:29:37 2011 +0200 | | | | summary: come back to metis 4.0 for compatibilite reason | | | | | | | o changeset: 2342:55e2323587af | | | | user: Frederic Hecht | | | | date: Wed Oct 05 14:44:47 2011 +0200 | | | | summary: correct pastix patch include (remove .. in patch file) | | | | | | | o changeset: 2341:50b762415bd3 | | | | user: Frederic Hecht | | | | date: Wed Oct 05 14:27:57 2011 +0200 | | | | summary: correct A=A' for array real[int,int] or complex[int,int] | | | | | | | o changeset: 2340:70404bc0a76f | | | | user: Frederic Hecht | | | | date: Thu Sep 29 21:48:05 2011 +0200 | | | | summary: correct Paul Cazeaux diff | | | | | | | o changeset: 2339:e9d61b12fae9 | | | | user: Frederic Hecht | | | | date: Thu Sep 29 19:25:21 2011 +0200 | | | | summary: correct install MacOSX | | | | | | | o changeset: 2338:6a620fc389e1 | | | | user: Frederic Hecht | | | | date: Thu Sep 29 13:55:16 2011 +0200 | | | | summary: add freefem++ laucher | | | | | | | o changeset: 2337:b6eca8cec8e8 | | | | user: Frederic Hecht | | | | date: Wed Sep 28 20:29:53 2011 +0200 | | | | summary: correc configure cmaek typo error | | | | | | | o changeset: 2336:f98beda3b2a9 | | | | user: Frederic Hecht | | | | date: Wed Sep 28 20:26:15 2011 +0200 | | | | summary: try to redo Freefem++.app | | | | | | | o changeset: 2335:d03364e04423 | | | | user: Frederic Hecht | | | | date: Tue Sep 27 18:23:44 2011 +0200 | | | | summary: correct metis makefile | | | | | | | o changeset: 2334:fe046f72fb0a | | | | user: Frederic Hecht | | | | date: Tue Sep 27 18:07:55 2011 +0200 | | | | summary: Added tag 3.14-1 for changeset 3d5d2f056b09 | | | | | | | o changeset: 2333:3d5d2f056b09 | | | | tag: 3.14-1 | | | | user: Frederic Hecht | | | | date: Tue Sep 27 18:07:22 2011 +0200 | | | | summary: pass to versiuon 3.14-1 | | | | | | | o changeset: 2332:ee6c761a1250 | | | | user: Frederic Hecht | | | | date: Tue Sep 27 17:24:22 2011 +0200 | | | | summary: correct emtis interface to v. 5.0.1 ( version 4.0 diseaper). | | | | | | | o changeset: 2331:37137749da6e | | | | user: Frederic Hecht | | | | date: Tue Sep 27 15:24:10 2011 +0200 | | | | summary: correct metis download (version 5.0.1) | | | | | | | o changeset: 2330:a8aac61cf98b | | | | user: Frederic Hecht | | | | date: Thu Sep 22 09:26:49 2011 +0200 | | | | summary: coorect FreeFem++-CoCoa line 26: [: : integer expression expected | | | | | | | o changeset: 2329:43229386f981 | | | | user: Frederic Hecht | | | | date: Fri Sep 02 09:05:52 2011 +0200 | | | | summary: correct Missing WHERE buils | | | | | | | o changeset: 2328:9dc607125215 | | | | user: Frederic Hecht | | | | date: Fri Sep 02 08:57:54 2011 +0200 | | | | summary: add missing file | | | | | | | o changeset: 2327:6e2de6f927d5 | | | | user: Frederic Hecht | | | | date: Fri Sep 02 08:53:46 2011 +0200 | | | | summary: update innovation | | | | | | | o changeset: 2326:3ea8a0183313 | | | | user: Frederic Hecht | | | | date: Thu Sep 01 22:43:12 2011 +0200 | | | | summary: coorect interface with mmg3d verson 4 | | | | | | | o changeset: 2325:878e5c556d1e | | | | user: Frederic Hecht | | | | date: Thu Sep 01 22:40:33 2011 +0200 | | | | summary: coorect inferface with mmg3d version 4 | | | | | | | o changeset: 2324:6fdc0e5ff2d7 | | | | parent: 2321:e34f8a052707 | | | | user: Frederic Hecht | | | | date: Mon Aug 29 15:11:31 2011 +0200 | | | | summary: Added tag 3.14-0 for changeset e34f8a052707 | | | | | | | | o changeset: 2323:a2284c53ea2c | | | | | branch: alh-autoconf | | | | | parent: 2005:815102f120b1 | | | | | user: Frederic Hecht | | | | | date: Mon Aug 29 11:27:42 2011 +0200 | | | | | summary: close branch incompreansible, plus utiliser | | | | | | | | | | o changeset: 2322:234fd78ad3c5 | | | | | | branch: graphical-user-interface-branch | | | | | | parent: 1970:44a4659127b5 | | | | | | user: Frederic Hecht | | | | | | date: Mon Aug 29 11:26:37 2011 +0200 | | | | | | summary: close branch incompreansible, plus utiliser | | | | | | | | | o | | changeset: 2321:e34f8a052707 | | | | | | tag: 3.14-0 | | | | | | user: Frederic Hecht | | | | | | date: Mon Aug 29 10:21:12 2011 +0200 | | | | | | summary: correct bug in 3d P1 interpolation | | | | | | | | | o | | changeset: 2320:8901cfb2463f | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 22:00:34 2011 +0200 | | | | | | summary: correct mpi exemple | | | | | | | | | o | | changeset: 2319:117a01a44f20 | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 21:38:55 2011 +0200 | | | | | | summary: correct allGather check | | | | | | | | | o | | changeset: 2318:e100f2b57094 | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 21:15:48 2011 +0200 | | | | | | summary: correct pb of allignement in sub array send/recv with MPI | | | | | | | | | o | | changeset: 2317:be0d2368a0f4 | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 21:08:19 2011 +0200 | | | | | | summary: correct missing return in WSEND | | | | | | | | | o | | changeset: 2316:8f502dfff22e | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 15:05:09 2011 +0200 | | | | | | summary: recorrect tetger clan makeifle | | | | | | | | | o | | changeset: 2315:cff15f3375e6 | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 15:01:16 2011 +0200 | | | | | | summary: do autoreconf | | | | | | | | | o | | changeset: 2314:dfe298c27b76 | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 14:57:05 2011 +0200 | | | | | | summary: restart of 3.14 version (big mistake yesterday) | | | | | | | | | o | | changeset: 2313:fda9929d138d | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 13:53:31 2011 +0200 | | | | | | summary: remobe -march=native (bug on allpe) | | | | | | | | | o | | changeset: 2312:3d541b3d75d1 | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 11:46:26 2011 +0200 | | | | | | summary: correct optim compile flags | | | | | | | | | o | | changeset: 2311:9a74f723f0ac | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 11:33:30 2011 +0200 | | | | | | summary: redo second problem | | | | | | | | | o | | changeset: 2310:bf083bb860bc | | | | | | user: Frederic Hecht | | | | | | date: Fri Aug 26 11:18:55 2011 +0200 | | | | | | summary: correct debug config flags | | | | | | | | | o | | changeset: 2309:11f8b8770f48 | | | | | | parent: 2275:76e1708404c5 | | | | | | user: Frederic Hecht | | | | | | date: Tue May 31 14:03:37 2011 +0200 | | | | | | summary: coorect msssing lib in freeyam pluging | | | | | | o | | | | | changeset: 2308:f01c1ce34eb3 | | | | | | user: Frederic Hecht | | | | | | date: Thu Aug 25 17:54:08 2011 +0200 | | | | | | summary: coorect defaul compile flags | | | | | | o | | | | | changeset: 2307:48f6f2dda6f9 | | | | | | user: Frederic Hecht | | | | | | date: Thu Aug 25 16:04:43 2011 +0200 | | | | | | summary: coorect intrinc second to secnd2 in arpach (missing function). | | | | | | o | | | | | changeset: 2306:f1321b98b61b | | | | | | user: Frederic Hecht | | | | | | date: Thu Aug 25 11:20:20 2011 +0200 | | | | | | summary: correct clean taget in Makefile | | | | | | o | | | | | changeset: 2305:4b313e53fd00 | | | | | | user: Frederic Hecht | | | | | | date: Thu Aug 25 09:31:50 2011 +0200 | | | | | | summary: Added tag 3.14 for changeset fbc48e130737 | | | | | | o | | | | | changeset: 2304:fbc48e130737 | | | | | | user: Frederic Hecht | | | | | | date: Thu Aug 25 09:30:45 2011 +0200 | | | | | | summary: and add -g in case of --enable-debug | | | | | | o | | | | | changeset: 2303:572e5649ecf2 | | | | | | user: Frederic Hecht | | | | | | date: Wed Aug 03 15:55:49 2011 +0200 | | | | | | summary: correct of lion os. | | | | | | o | | | | | changeset: 2302:0183fdbeab37 | | | | | | user: Frederic Hecht | | | | | | date: Wed Jul 06 11:36:12 2011 +0200 | | | | | | summary: see innovation | | | | | | o | | | | | changeset: 2301:5aeeb62cc314 | | | | | | user: Frederic Hecht | | | | | | date: Mon Jul 04 21:37:38 2011 +0200 | | | | | | summary: correct makefile | | | | | | o | | | | | changeset: 2300:5c0487b0b207 | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 23:12:35 2011 +0200 | | | | | | summary: correct typo | | | | | | o | | | | | changeset: 2299:b1bfdb1c8d4c | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 16:48:53 2011 +0200 | | | | | | summary: correct INNOVATION | | | | | | o | | | | | changeset: 2298:e8247822dc8f | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 16:21:48 2011 +0200 | | | | | | summary: correct hips solver typo arror in destructor | | | | | | o | | | | | changeset: 2297:8d0d89f8408a | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 11:17:09 2011 +0200 | | | | | | summary: pass to version 3.13-3 | | | | | | o | | | | | changeset: 2296:4088be2bb5b0 | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 11:12:40 2011 +0200 | | | | | | summary: add WGET in download/mumps/Makefile-mumps-4.10.0.inc | | | | | | o | | | | | changeset: 2295:344cbb3584d8 | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 11:05:02 2011 +0200 | | | | | | summary: add missing file | | | | | | o | | | | | changeset: 2294:21c29dd8cb63 | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 11:00:03 2011 +0200 | | | | | | summary: coorect innovation file | | | | | | o | | | | | changeset: 2293:2a0706ac5c1b | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 10:57:28 2011 +0200 | | | | | | summary: coorect hips solver | | | | | | o | | | | | changeset: 2292:673e2af79b3b | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 30 09:32:00 2011 +0200 | | | | | | summary: correct HIPS solver | | | | | | o | | | | | changeset: 2291:d839c2fd8874 | | | | | | user: Frederic Hecht | | | | | | date: Wed Jun 29 09:30:24 2011 +0200 | | | | | | summary: upgrade INNOVATION file | | | | | | o | | | | | changeset: 2290:2809d03f67ce | | | | | | user: Frederic Hecht | | | | | | date: Wed Jun 29 09:21:52 2011 +0200 | | | | | | summary: add interface of New MUMPS version 4.10.0 | | | | | | o | | | | | changeset: 2289:3ed2fe0ff5bf | | | | | | user: Frederic Hecht | | | | | | date: Tue Jun 28 09:18:23 2011 +0200 | | | | | | summary: pass to version 3.13-2 | | | | | | o | | | | | changeset: 2288:70da8688792b | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 27 23:29:05 2011 +0200 | | | | | | summary: correct gibbs may be algo | | | | | | o | | | | | changeset: 2287:97bf00ff569f | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 27 22:54:04 2011 +0200 | | | | | | summary: fing a bug un gibbs algo dur dur | | | | | | o | | | | | changeset: 2286:447235cc1f35 | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 27 21:17:36 2011 +0200 | | | | | | summary: correct interpolation problem with periodic BC. | | | | | | o | | | | | changeset: 2285:fab78e8b1f74 | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 27 19:20:06 2011 +0200 | | | | | | summary: correct typo | | | | | | o | | | | | changeset: 2284:0f2ff71f4833 | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 27 19:14:22 2011 +0200 | | | | | | summary: add mem usage in UMFPACK solver output | | | | | | o | | | | | changeset: 2283:540832a7ce66 | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 27 10:31:44 2011 +0200 | | | | | | summary: add exemples examples++-tutorial/Laplace-RHS-Dirac.edp | | | | | | o | | | | | changeset: 2282:49c1c93356a0 | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 09 17:48:18 2011 +0200 | | | | | | summary: correct ambiguity in square func. | | | | | | o | | | | | changeset: 2281:a92f428fff7f | | | | | | user: Frederic Hecht | | | | | | date: Thu Jun 09 12:26:16 2011 +0200 | | | | | | summary: correct choix of mpimkl | | | | | | o | | | | | changeset: 2280:5aa51837cdb7 | | | | | | user: Frederic Hecht | | | | | | date: Tue Jun 07 20:32:50 2011 +0200 | | | | | | summary: correct install yams | | | | | | o | | | | | changeset: 2279:214e7ba93af3 | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 06 21:51:56 2011 +0200 | | | | | | summary: correct freeyams | | | | | | o | | | | | changeset: 2278:41c904b8660c | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 06 20:42:03 2011 +0200 | | | | | | summary: correct spuriou print | | | | | | o | | | | | changeset: 2277:fcaee41a91cb | | | | | | user: Frederic Hecht | | | | | | date: Mon Jun 06 19:07:24 2011 +0200 | | | | | | summary: correct freeyams.cpp LD process. | | | | | | o-----+ | | changeset: 2276:1a6949ae0965 | | | | | user: Frederic Hecht / / / / / date: Mon May 30 15:16:17 2011 +0200 | | | | | summary: add new example | | | | | | | o | | changeset: 2275:76e1708404c5 | | | | | user: Frederic Hecht | | | | | date: Fri May 27 14:40:04 2011 +0200 | | | | | summary: correct typo in int blas type | | | | | | | o | | changeset: 2274:beae57ef5319 | | | | | user: Frederic Hecht | | | | | date: Fri May 27 14:36:03 2011 +0200 | | | | | summary: correct int for blas variable .. | | | | | | | o | | changeset: 2273:3f2e931fffc3 | | | | | user: Frederic Hecht | | | | | date: Thu May 26 15:42:47 2011 +0200 | | | | | summary: correct typo in doc. | | | | | | | o | | changeset: 2272:6ba83092a50b | | | | | user: Frederic Hecht | | | | | date: Thu May 26 15:15:01 2011 +0200 | | | | | summary: go v 3.13 | | | | | | | o | | changeset: 2271:27fb12aa07ae | | | | | user: Frederic Hecht | | | | | date: Thu May 26 15:13:55 2011 +0200 | | | | | summary: autoreconf | | | | | | | o | | changeset: 2270:93499395509f | | | | | user: Frederic Hecht | | | | | date: Thu May 26 15:11:13 2011 +0200 | | | | | summary: update doc | | | | | | | o | | changeset: 2269:55460f8c273e | | | | | user: Frederic Hecht | | | | | date: Wed May 25 21:07:04 2011 +0200 | | | | | summary: add final comment on Element_miaxte.cpp file | | | | | | | o | | changeset: 2268:ab20518693c9 | | | | | user: Frederic Hecht | | | | | date: Tue May 24 18:21:42 2011 +0200 | | | | | summary: add RT1, RT1Ortho, DBM1, DBM1Ortho Finite element in Element_Mixte.cpp dynamics libs | | | | | | | o | | changeset: 2267:b1efdda0703b | | | | | user: Frederic Hecht | | | | | date: Tue May 24 17:16:27 2011 +0200 | | | | | summary: add BDM1 and BDM1Ortho Finite element | | | | | | | o | | changeset: 2266:b73e6b532325 | | | | | user: Frederic Hecht | | | | | date: Fri May 20 16:47:08 2011 +0200 | | | | | summary: in progress TD-NND 1 element | | | | | | | o | | changeset: 2265:696e7299da62 | | | | | user: Frederic Hecht | | | | | date: Fri May 20 09:46:32 2011 +0200 | | | | | summary: end of validation for RT1 | | | | | | | o | | changeset: 2264:0512b6bb56db | | | | | user: Frederic Hecht | | | | | date: Fri May 20 09:09:16 2011 +0200 | | | | | summary: correct RT1 and add RT1Ortho F.E. | | | | | | | o | | changeset: 2263:b5d879cb17c2 | | | | | user: Frederic Hecht | | | | | date: Thu May 19 15:12:24 2011 +0200 | | | | | summary: correct Elm_TD-NNS.cpp for RT1 F.E. | | | | | | | o | | changeset: 2262:13906a499616 | | | | | user: Frederic Hecht | | | | | date: Mon May 09 08:53:30 2011 +0200 | | | | | summary: correct lapack | | | | | | | o | | changeset: 2261:3d579277e4ce | | | | | user: Frederic Hecht | | | | | date: Mon May 09 08:02:42 2011 +0200 | | | | | summary: coorect lapack.cpp add full matrice multiplication | | | | | | | o | | changeset: 2260:39fb84c4949b | | | | | user: Frederic Hecht | | | | | date: Fri May 06 14:56:04 2011 +0200 | | | | | summary: coorct lapack and New FE element | | | | | | | o | | changeset: 2259:a02b7f1a9c02 | | | | | user: Frederic Hecht | | | | | date: Thu May 05 15:47:08 2011 +0200 | | | | | summary: add New finite in construction | | | | | | | o | | changeset: 2258:bcfcf356bb8c | | | | | user: Frederic Hecht | | | | | date: Thu Apr 28 18:30:09 2011 +0200 | | | | | summary: add splitedges tools of Mghazli Zoubida | | | | | | | o | | changeset: 2257:294a37023d46 | | | | | user: Frederic Hecht | | | | | date: Mon Apr 18 11:57:40 2011 +0200 | | | | | summary: coorect load load under win32 | | | | | | | o | | changeset: 2256:4d0308f12e72 | | | | | user: Frederic Hecht | | | | | date: Mon Apr 18 09:57:50 2011 +0200 | | | | | summary: correct load link pk of " and ' in var | | | | | | | o | | changeset: 2255:da55768a880d | | | | | user: Frederic Hecht | | | | | date: Fri Apr 15 22:31:24 2011 +0200 | | | | | summary: correct configure.Ac | | | | | | | o | | changeset: 2254:83972e23732a | | | | | user: Frederic Hecht | | | | | date: Fri Apr 15 21:04:34 2011 +0200 | | | | | summary: correct configure.ac for mpi under win32 | | | | | | | o | | changeset: 2253:2aca6f1b5497 | | | | | user: Frederic Hecht | | | | | date: Fri Apr 15 20:35:45 2011 +0200 | | | | | summary: MPI for win32 | | | | | | | o | | changeset: 2252:e145e24f6aa0 | | |\ \ \ parent: 2251:3d2ff16fa1e5 | | | | | | parent: 2250:88c8347babf4 | | | | | | user: Frederic Hecht | | | | | | date: Fri Apr 15 18:28:28 2011 +0200 | | | | | | summary: coorect Makefile | | | | | | | | | o | | changeset: 2251:3d2ff16fa1e5 | | | | | | parent: 2247:246a6ffbd1f1 | | | | | | user: Frederic Hecht | | | | | | date: Fri Apr 15 18:13:05 2011 +0200 | | | | | | summary: coorect mpi configure for win32 | | | | | | | | o | | | changeset: 2250:88c8347babf4 | | | | | | user: Frederic Hecht | | | | | | date: Wed Apr 13 14:14:51 2011 +0200 | | | | | | summary: updaet Heat3d.idp | | | | | | | | o | | | changeset: 2249:3c31e2572e2f | | | | | | user: Frederic Hecht | | | | | | date: Wed Apr 13 14:10:00 2011 +0200 | | | | | | summary: correct typ in Heat3d.idp filename | | | | | | | | o | | | changeset: 2248:6bcbc93c5bca | | |/ / / user: Frederic Hecht | | | | | date: Wed Apr 13 14:07:57 2011 +0200 | | | | | summary: change Heat3D.idp | | | | | | | o | | changeset: 2247:246a6ffbd1f1 | | | | | user: Frederic Hecht | | | | | date: Tue Apr 12 22:18:31 2011 +0200 | | | | | summary: coorect Problem in WHERE quote | | | | | | | o | | changeset: 2246:bfcbef551c2e | | | | | user: Frederic Hecht | | | | | date: Fri Apr 08 21:47:10 2011 +0200 | | | | | summary: correct Chaleur | | | | | | | o | | changeset: 2245:32829734574c | | | | | user: Frederic Hecht | | | | | date: Fri Apr 08 17:37:22 2011 +0200 | | | | | summary: correct INNOVATION file | | | | | | | o | | changeset: 2244:726002c6f090 | | | | | user: Frederic Hecht | | | | | date: Fri Apr 08 17:33:38 2011 +0200 | | | | | summary: remove suprious dump in superlu dist. | | | | | | | o | | changeset: 2243:48f3b1e4a098 | | | | | user: Frederic Hecht | | | | | date: Thu Apr 07 12:05:18 2011 +0200 | | | | | summary: correct change for // computing | | | | | | | o | | changeset: 2242:a48b9b504aba | | | | | user: Frederic Hecht | | | | | date: Wed Apr 06 14:50:49 2011 +0200 | | | | | summary: correct configure to build file | | | | | | | o | | changeset: 2241:18630017f8c9 | | | | | user: Frederic Hecht | | | | | date: Wed Apr 06 14:49:07 2011 +0200 | | | | | summary: Added tag 3.12-1 for changeset cd142ee7324d | | | | | | | o | | changeset: 2240:cd142ee7324d | | | | | tag: 3.12-1 | | | | | user: Frederic Hecht | | | | | date: Tue Apr 05 10:21:23 2011 +0200 | | | | | summary: correct 3d period BC. | | | | | | | o | | changeset: 2239:a43c08688b7e | | | | | user: Frederic Hecht | | | | | date: Wed Mar 30 13:14:22 2011 +0200 | | | | | summary: procon gmres remove tgv ???? | | | | | | | o | | changeset: 2238:fff6c5feb7b6 | | | | | user: Frederic Hecht | | | | | date: Tue Mar 29 21:54:33 2011 +0200 | | | | | summary: gmres precon same | | | | | | | o | | changeset: 2237:e04f738a5db2 | | | | | user: Frederic Hecht | | | | | date: Tue Mar 29 21:39:31 2011 +0200 | | | | | summary: change precon gmres | | | | | | | o | | changeset: 2236:c3258922889e | | | | | user: Frederic Hecht | | | | | date: Tue Mar 29 21:13:11 2011 +0200 | | | | | summary: correct precon gmres | | | | | | | o | | changeset: 2235:6e138ea49c63 | | | | | user: Frederic Hecht | | | | | date: Thu Mar 24 16:56:02 2011 +0100 | | | | | summary: correct PB compiel for hypre with blas. | | | | | | | o | | changeset: 2234:bfe9184061ce | | | | | user: Frederic Hecht | | | | | date: Wed Mar 23 17:30:48 2011 +0100 | | | | | summary: cooret typo | | | | | | | o | | changeset: 2233:ed0bb81df53d | | | | | user: Frederic Hecht | | | | | date: Wed Mar 23 17:24:34 2011 +0100 | | | | | summary: add missing MPI_LIB | | | | | | | o | | changeset: 2232:d23847ce53f2 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 23 15:14:33 2011 +0100 | | | | | summary: add cast of TypeSparseSlve on int for stokes type of solver . | | | | | | | o | | changeset: 2231:f31959eb8d1f | | | | | user: Frederic Hecht | | | | | date: Tue Mar 22 00:59:18 2011 +0100 | | | | | summary: correcd DDM examples; tyop error | | | | | | | o | | changeset: 2230:2c44e0a52112 | | | | | user: Frederic Hecht | | | | | date: Mon Mar 21 21:22:49 2011 +0100 | | | | | summary: coorect missing lin in mkl whith _rf.so .. | | | | | | | o | | changeset: 2229:6fc339f2ceff | | | | | user: Frederic Hecht | | | | | date: Wed Mar 16 14:55:23 2011 +0100 | | | | | summary: coorect ref test in tutorial | | | | | | | o | | changeset: 2228:7c7128939c45 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 16 14:21:49 2011 +0100 | | | | | summary: corect configure for mpi | | | | | | | o | | changeset: 2227:977b3193fe08 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 16 12:59:13 2011 +0100 | | | | | summary: correct bug in intersection of metric in adaptmesh in case of given metrix | | | | | | | o | | changeset: 2226:49d4be4bdab9 | | | | | user: Frederic Hecht | | | | | date: Tue Mar 15 14:55:54 2011 +0100 | | | | | summary: coorect pb on configure of mpi (hard jos) | | | | | | | o | | changeset: 2225:b9875e93b847 | | | | | user: Frederic Hecht | | | | | date: Tue Mar 15 14:40:24 2011 +0100 | | | | | summary: add test for m4 and bison command in configure | | | | | | | o | | changeset: 2224:7e9e01c6e550 | | | | | user: Frederic Hecht | | | | | date: Tue Mar 15 14:23:06 2011 +0100 | | | | | summary: update mshmet to version 3.0 | | | | | | | o | | changeset: 2223:417a4450e6f8 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 22:22:41 2011 +0100 | | | | | summary: correct mpi correct of sgi | | | | | | | o | | changeset: 2222:85735d18b198 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 21:51:21 2011 +0100 | | | | | summary: compile with sgi MPI | | | | | | | o | | changeset: 2221:7d3bf33d6031 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 21:35:02 2011 +0100 | | | | | summary: add check MPI_DOUBLE_COMPLEX in configure | | | | | | | o | | changeset: 2220:1d2cb842acb2 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 11:56:22 2011 +0100 | | | | | summary: cooret mpi / cpp DOUBLE_COMPLEX | | | | | | | o | | changeset: 2219:d0223be2ab7b | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 10:06:50 2011 +0100 | | | | | summary: correct missing cflags in generic blas compilation | | | | | | | o | | changeset: 2218:ed71122c4649 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 08:54:14 2011 +0100 | | | | | summary: corrrect loop in makefile when cleanning | | | | | | | o | | changeset: 2217:f3f99d1f9f92 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 08:39:35 2011 +0100 | | | | | summary: correct loop in clean target makefiles | | | | | | | o | | changeset: 2216:8b03d97bb490 | | | | | user: Frederic Hecht | | | | | date: Wed Mar 09 08:36:34 2011 +0100 | | | | | summary: correct clean in freeyam makefile | | | | | | | o | | changeset: 2215:5d1babde36d7 | | | | | user: Frederic Hecht | | | | | date: Tue Mar 08 17:57:47 2011 +0100 | | | | | summary: correct mpi compile flags for sgi computer. | | | | | | | o | | changeset: 2214:b04fdc8dbf99 | | | | | user: Frederic Hecht | | | | | date: Wed Feb 09 21:03:19 2011 +0100 | | | | | summary: correct missing in install examples++-load/fig.pgm examples++-load/lg.pgm | | | | | | | o | | changeset: 2213:0a53c3f15e2e | | | | | user: Frederic Hecht | | | | | date: Wed Feb 09 19:27:59 2011 +0100 | | | | | summary: add missing file in Makefile dist tag. | | | | | | | o | | changeset: 2212:bdae2c1318cc | | | | | user: Frederic Hecht | | | | | date: Wed Feb 09 19:23:36 2011 +0100 | | | | | summary: coorect MPI_DOUBLE_COMPLEX problem in mpi ... | | | | | | | o | | changeset: 2211:a16c149daeb4 | | | | | user: Frederic Hecht | | | | | date: Wed Feb 09 18:11:31 2011 +0100 | | | | | summary: correct mpiReduce complex case .. | | | | | | | o | | changeset: 2210:94365074e706 | | | | | user: Frederic Hecht | | | | | date: Mon Feb 07 20:58:18 2011 +0100 | | | | | summary: correct some mistake. | | | | | | | o | | changeset: 2209:a076fd1237b7 | | | | | user: Frederic Hecht | | | | | date: Tue Jan 25 22:11:03 2011 +0100 | | | | | summary: reomve spuriou dump | | | | | | | o | | changeset: 2208:f3ce89f615f8 | | | | | user: Frederic Hecht | | | | | date: Tue Jan 25 21:48:48 2011 +0100 | | | | | summary: add mpiAllReduce(umax,dmaxg,comm,mpiMAX); where for real umax,dmaxg; | | | | | | | o | | changeset: 2207:3a8495a5387a | | | | | user: Frederic Hecht | | | | | date: Tue Jan 25 11:40:33 2011 +0100 | | | | | summary: add mpiAllReduce on real , long , complex data type | | | | | | | o | | changeset: 2206:08fcb4d98a99 | | | | | user: Frederic Hecht | | | | | date: Sun Jan 23 14:34:11 2011 +0100 | | | | | summary: Added tag 3.12-win32 for changeset bea855340647 | | | | | | | o | | changeset: 2205:bea855340647 | | | | | tag: 3.12-win32 | | | | | user: Frederic Hecht | | | | | date: Sun Jan 23 14:33:52 2011 +0100 | | | | | summary: update INNOVATION | | | | | | | o | | changeset: 2204:f6a959c7600c | | | | | user: Frederic Hecht | | | | | date: Sat Jan 22 21:44:24 2011 +0100 | | | | | summary: correct configure for win32 | | | | | | | o | | changeset: 2203:e84ba8234183 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 13:59:58 2011 +0100 | | | | | summary: correct typo | | | | | | | o | | changeset: 2202:09ee2c12edb8 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 13:57:40 2011 +0100 | | | | | summary: correct typo | | | | | | | o | | changeset: 2201:fb724f3e09a2 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 13:55:11 2011 +0100 | | | | | summary: correct install idp file in mpi examples | | | | | | | o | | changeset: 2200:dd0ca033a004 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 13:34:00 2011 +0100 | | | | | summary: add tag for version 3.12 | | | | | | | o | | changeset: 2199:672e0042f083 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 13:29:52 2011 +0100 | | | | | summary: Added tag 3.12 for changeset 270198a4a293 | | | | | | | o | | changeset: 2198:270198a4a293 | | | | | tag: 3.12 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 13:23:35 2011 +0100 | | | | | summary: correct HISTORY | | | | | | | o | | changeset: 2197:e983b6801336 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 20 08:32:41 2011 +0100 | | | | | summary: coorect type in top Makefile | | | | | | | o | | changeset: 2196:673a610cc96e | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 23:26:38 2011 +0100 | | | | | summary: correct mpi sover files | | | | | | | o | | changeset: 2195:daea22ad31ee | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 19:43:33 2011 +0100 | | | | | summary: correct examples++-mpi/Makefile.am | | | | | | | o | | changeset: 2194:b5f8a0106cc0 | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 19:30:02 2011 +0100 | | | | | summary: add missing file | | | | | | | o | | changeset: 2193:06476f221b1e | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 18:19:58 2011 +0100 | | | | | summary: correct medit makefile | | | | | | | o | | changeset: 2192:9d6b4e63eb04 | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 17:28:44 2011 +0100 | | | | | summary: coorect make for install FreeFem++-CoCoa on MAcOS | | | | | | | o | | changeset: 2191:60616abdc65f | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 17:15:42 2011 +0100 | | | | | summary: coorect MPI example ... | | | | | | | o | | changeset: 2190:daa42faa6092 | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 16:55:25 2011 +0100 | | | | | summary: correct MPI example and // solver | | | | | | | o | | changeset: 2189:0a5cc096d146 | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 16:42:28 2011 +0100 | | | | | summary: correct lot of MPI example | | | | | | | o | | changeset: 2188:65e69cb8fa59 | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 15:19:20 2011 +0100 | | | | | summary: add missing files | | | | | | | o | | changeset: 2187:41b69f3e4ffc | | | | | user: Frederic Hecht | | | | | date: Wed Jan 19 14:00:15 2011 +0100 | | | | | summary: - correct link proble in hips and hypre under linux | | | | | | | o | | changeset: 2186:38874c1f5f5f | | | | | user: Frederic Hecht | | | | | date: Tue Jan 18 23:39:31 2011 +0100 | | | | | summary: add new MPI example DDM-Schwarz method | | | | | | | o | | changeset: 2185:b8dc0377392a | | | | | user: Frederic Hecht | | | | | date: Tue Jan 18 18:59:26 2011 +0100 | | | | | summary: correct mistake in doc | | | | | | | o | | changeset: 2184:fb8651ab5956 | | | | | user: Frederic Hecht | | | | | date: Tue Jan 18 18:45:59 2011 +0100 | | | | | summary: see INNOVATION file for all modid | | | | | | | o | | changeset: 2183:05d86033bc94 | | | | | user: Frederic Hecht | | | | | date: Tue Jan 18 13:13:23 2011 +0100 | | | | | summary: add README_MAC | | | | | | | o | | changeset: 2182:309f9d972d67 | | | | | user: Frederic Hecht | | | | | date: Mon Jan 17 23:43:41 2011 +0100 | | | | | summary: correct isolineP1 | | | | | | | o | | changeset: 2181:f8e9984c708d | | | | | user: Frederic Hecht | | | | | date: Mon Jan 17 23:22:06 2011 +0100 | | | | | summary: ass isolineP1 dynamic lib to build border form isoline | | | | | | | o | | changeset: 2180:7d53be5311f3 | | | | | user: Frederic Hecht | | | | | date: Mon Jan 17 08:11:50 2011 +0100 | | | | | summary: coorect spurious endl | | | | | | | o | | changeset: 2179:3414092a9ef9 | | | | | user: Frederic Hecht | | | | | date: Mon Jan 17 08:07:34 2011 +0100 | | | | | summary: remove spurio endl | | | | | | | o | | changeset: 2178:1d166fa13593 | | | | | user: Frederic Hecht | | | | | date: Mon Jan 17 08:00:50 2011 +0100 | | | | | summary: remove spurious cout | | | | | | | o | | changeset: 2177:e413924e153f | | | | | user: Frederic Hecht | | | | | date: Mon Jan 17 00:04:56 2011 +0100 | | | | | summary: add macro def; | | | | | | | o | | changeset: 2176:e218c243ce05 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 13 22:18:17 2011 +0100 | | | | | summary: correct for MINGW load.link | | | | | | | o | | changeset: 2175:272b85192249 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 13 21:04:05 2011 +0100 | | | | | summary: correct FLIBS on win32 case | | | | | | | o | | changeset: 2174:e3f2a110bb91 | | | | | user: Frederic Hecht | | | | | date: Thu Jan 13 17:19:04 2011 +0100 | | | | | summary: add gsl interface | | | | | | | o | | changeset: 2173:a06e9ccb53fd | | | | | user: Frederic Hecht | | | | | date: Tue Jan 04 17:50:50 2011 +0100 | | | | | summary: add mesure for area of 2d mesh to by compatible this 3d mesh | | | | | | | o | | changeset: 2172:6e8a3de60010 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 25 09:23:14 2010 +0100 | | | | | summary: update te doc | | | | | | | o | | changeset: 2171:d4cbf3a97506 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 25 08:22:35 2010 +0100 | | | | | summary: see innovation | | | | | | | o | | changeset: 2170:f2016b3dac72 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 25 07:26:48 2010 +0100 | | | | | summary: crrect configure.ac to be compatible with new version | | | | | | | o | | changeset: 2169:65a4886d5bc8 | | | | | user: Frederic Hecht | | | | | date: Thu Dec 23 11:10:04 2010 +0100 | | | | | summary: Add brute force for seach of poit to be sure | | | | | | | o | | changeset: 2168:9ccdb108f833 | | | | | user: Frederic Hecht | | | | | date: Tue Dec 21 12:38:05 2010 +0100 | | | | | summary: add tgv < 0 => no tgv = so we put 0 on line except 1 on dig term on matrix probleme. | | | | | | | o | | changeset: 2167:42f714837f49 | | | | | user: Frederic Hecht | | | | | date: Sun Dec 12 00:15:38 2010 +0100 | | | | | summary: mpi win32 suire ... | | | | | | | o | | changeset: 2166:ba43bd5ae9c2 | | | | | user: Frederic Hecht | | | | | date: Sun Dec 12 00:11:57 2010 +0100 | | | | | summary: mpi win32 suite | | | | | | | o | | changeset: 2165:18e9fd7513ef | | | | | user: Frederic Hecht | | | | | date: Sun Dec 12 00:05:38 2010 +0100 | | | | | summary: mpi coorect on win32 | | | | | | | o | | changeset: 2164:4a2a7e6595ab | | | | | user: Frederic Hecht | | | | | date: Sat Dec 11 23:41:02 2010 +0100 | | | | | summary: correct parallele version for win32 | | | | | | | o | | changeset: 2163:3956acc41dd1 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 11 21:10:00 2010 +0100 | | | | | summary: change mpi ef trouth pointer | | | | | | | o | | changeset: 2162:4aacb445efc2 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 11 14:27:23 2010 +0100 | | | | | summary: correct pb CNOFLAGS (no opt CFLAGS for medir) under windows | | | | | | | o | | changeset: 2161:34a9d49cc35e | | | | | user: Frederic Hecht | | | | | date: Sat Dec 11 14:11:57 2010 +0100 | | | | | summary: next step | | | | | | | o | | changeset: 2160:745e4814c1e2 | | | | | user: Frederic Hecht | | | | | date: Sat Dec 11 13:49:26 2010 +0100 | | | | | summary: correct pb parallele-empty.cpp | | | | | | | o | | changeset: 2159:a9e710fd658e | | | | | user: Frederic Hecht | | | | | date: Fri Dec 10 23:51:33 2010 +0100 | | | | | summary: add src/mpi/parallelempi-empty.cpp | | | | | | | o | | changeset: 2158:ff130a08ed27 | | | | | user: Frederic Hecht | | | | | date: Fri Dec 10 10:14:09 2010 +0100 | | | | | summary: change default parameter in examples++-mpi/MPIGMRES3D.edp | | | | | | | o | | changeset: 2157:00ba78e75b34 | | | | | user: Frederic Hecht | | | | | date: Thu Dec 09 19:41:01 2010 +0100 | | | | | summary: last modif for v 3.11 (may be) | | | | | | | o | | changeset: 2156:522db0c6b622 | | | | | user: Frederic Hecht | | | | | date: Thu Dec 09 18:16:14 2010 +0100 | | | | | summary: updeta doc an exp | | | | | | | o | | changeset: 2155:4932c2907ee9 | | | | | user: Frederic Hecht | | | | | date: Thu Dec 09 17:04:13 2010 +0100 | | | | | summary: add macro quting | | | | | | | o | | changeset: 2154:df881e2db1cd | | | | | user: Frederic Hecht | | | | | date: Thu Dec 09 14:34:07 2010 +0100 | | | | | summary: coorect type in getany (all int are long in freefem++) | | | | | | | o | | changeset: 2153:5545e58c84ba | | | | | user: Frederic Hecht | | | | | date: Thu Dec 09 10:59:03 2010 +0100 | | | | | summary: correct tetgen set coorect defauft valeu in nbregion, nbhole, ... | | | | | | | o | | changeset: 2152:143e4c285e2e | | | | | user: Frederic Hecht | | | | | date: Thu Dec 09 10:34:14 2010 +0100 | | | | | summary: correct doc and mmg3-d interface | | | | | | | o | | changeset: 2151:ffed0beed0f2 | | | | | user: Frederic Hecht | | | | | date: Wed Dec 08 23:54:37 2010 +0100 | | | | | summary: correct pb picking ffmedit remove -O flags | | | | | | | o | | changeset: 2150:ee5ac6c2b487 | | | | | user: Frederic Hecht | | | | | date: Wed Dec 08 18:10:50 2010 +0100 | | | | | summary: update makefie | | | | | | | o | | changeset: 2149:a01cfcb5089f | | | | | user: Frederic Hecht | | | | | date: Wed Dec 08 17:33:38 2010 +0100 | | | | | summary: coorect freeeyam mshmet to a-have more clean option | | | | | | | o | | changeset: 2148:8016ff3a5430 | | | | | user: Frederic Hecht | | | | | date: Tue Dec 07 18:02:17 2010 +0100 | | | | | summary: update mmg3d interface | | | | | | | o | | changeset: 2147:54b806e85c3e | | | | | user: Frederic Hecht | | | | | date: Tue Dec 07 16:32:06 2010 +0100 | | | | | summary: coorect mshmet .. | | | | | | | o | | changeset: 2146:00ebac7181ed | | | | | user: Frederic Hecht | | | | | date: Tue Dec 07 14:57:59 2010 +0100 | | | | | summary: coorect configure.ac pb this blascoorectr freeyam interface with metric | | | | | | | o | | changeset: 2145:444b58f89a98 | | | | | user: Frederic Hecht | | | | | date: Tue Dec 07 13:36:42 2010 +0100 | | | | | summary: coorect freeyams aniso | | | | | | | o | | changeset: 2144:de793b3e90c2 | | | | | user: Frederic Hecht | | | | | date: Fri Dec 03 17:44:00 2010 +0100 | | | | | summary: add seach of MKL lib in configure (hard job) | | | | | | | o | | changeset: 2143:baa57509c9cd | | | | | user: Frederic Hecht | | | | | date: Thu Dec 02 23:17:52 2010 +0100 | | | | | summary: see INNOVATION correct MPIGMREs[23]d.edp example | | | | | | | o | | changeset: 2142:c01832c2d91e | | |\ \ \ parent: 2141:1ca02db51865 | | | | | | parent: 2140:bae26bfb0b8c | | | | | | user: Frederic Hecht | | | | | | date: Wed Dec 01 16:24:20 2010 +0100 | | | | | | summary: merge ??? | | | | | | | | | o | | changeset: 2141:1ca02db51865 | | | | | | parent: 2139:d87b27635075 | | | | | | user: Frederic Hecht | | | | | | date: Wed Dec 01 15:06:40 2010 +0100 | | | | | | summary: remove file | | | | | | | | o | | | changeset: 2140:bae26bfb0b8c | | |/ / / user: Frederic Hecht | | | | | date: Wed Dec 01 10:44:59 2010 +0100 | | | | | summary: correct typo | | | | | | | o | | changeset: 2139:d87b27635075 | | | | | user: Frederic Hecht | | | | | date: Wed Dec 01 10:38:32 2010 +0100 | | | | | summary: correct the documenation | | | | | | | o | | changeset: 2138:9b4cf63d9799 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 30 22:07:42 2010 +0100 | | | | | summary: add file for mlk lib . | | | | | | | o | | changeset: 2137:6ebd89576da6 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 30 21:05:05 2010 +0100 | | | | | summary: correct WHERE_LIBRARY-downlaod creation | | | | | | | o | | changeset: 2136:9f7e115581d0 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 30 19:17:18 2010 +0100 | | | | | summary: correct mistake in construction of WHERE.gmm file | | | | | | | o | | changeset: 2135:d0ec37b43744 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 30 17:50:39 2010 +0100 | | | | | summary: go version 3.10-3 | | | | | | | o | | changeset: 2134:c00bebf2d35f | | | | | user: Frederic Hecht | | | | | date: Tue Nov 30 15:47:39 2010 +0100 | | | | | summary: do coorect of periodic boundary condition + MUMPS link order | | | | | | | o | | changeset: 2133:0ce681a3f66e | | | | | user: Frederic Hecht | | | | | date: Thu Nov 25 22:06:41 2010 +0100 | | | | | summary: add missing file | | | | | | | o | | changeset: 2132:c0a45d4c82a9 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 25 21:50:27 2010 +0100 | | | | | summary: correct spurious print with verbosity !=0 | | | | | | | o | | changeset: 2131:d0756d2ae8ed | | | | | user: Frederic Hecht | | | | | date: Thu Nov 25 21:37:14 2010 +0100 | | | | | summary: remove spurio print | | | | | | | o | | changeset: 2130:9c81e54436fb | | | | | user: Frederic Hecht | | | | | date: Thu Nov 25 14:16:34 2010 +0100 | | | | | summary: correct Laplace-Adapt-3d.edp | | | | | | | o | | changeset: 2129:d0f9a7e3ce91 | | | | | user: Frederic Hecht | | | | | date: Wed Nov 24 21:20:18 2010 +0100 | | | | | summary: correct Laplace-Adapt-3d.edp | | | | | | | o | | changeset: 2128:9628d985d017 | | | | | user: Frederic Hecht | | | | | date: Wed Nov 24 08:55:48 2010 +0100 | | | | | summary: coorect pb compiel on gnome | | | | | | | o | | changeset: 2127:934ff69faf4a | | | | | user: Frederic Hecht | | | | | date: Wed Nov 24 08:39:29 2010 +0100 | | | | | summary: add err comment in case of mesh with isolated vertex | | | | | | | o | | changeset: 2126:e05ac461f21d | | | | | user: Frederic Hecht | | | | | date: Tue Nov 23 13:54:07 2010 +0100 | | | | | summary: update INNOVATION | | | | | | | o | | changeset: 2125:5633591673ba | | | | | user: Frederic Hecht | | | | | date: Tue Nov 23 08:14:13 2010 +0100 | | | | | summary: correct 3d adaptation , try to build a first true example | | | | | | | o | | changeset: 2124:76dc4c8a0cbb | | | | | user: Frederic Hecht | | | | | date: Tue Nov 23 07:17:26 2010 +0100 | | | | | summary: add function to cast formal array into array [] toZarray,toRarray , toCarray | | | | | | | o | | changeset: 2123:ecb2452ebe90 | | | | | user: Frederic Hecht | | | | | date: Fri Nov 19 11:37:52 2010 +0100 | | | | | summary: add getARGV tools | | | | | | | o | | changeset: 2122:9297b462cd46 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 18 16:31:52 2010 +0100 | | | | | summary: next step for ff-mpirun install (dur dur) | | | | | | | o | | changeset: 2121:80914a8bb776 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 18 16:11:24 2010 +0100 | | | | | summary: coorect makefile for ff-mpirun and add srandomdev by read /dev/random + time | | | | | | | o | | changeset: 2120:27361d73a03b | | | | | user: Frederic Hecht | | | | | date: Wed Nov 17 22:04:05 2010 +0100 | | | | | summary: continung tyoo error ff-mpirun | | | | | | | o | | changeset: 2119:a4a681882e69 | | | | | user: Frederic Hecht | | | | | date: Wed Nov 17 21:54:25 2010 +0100 | | | | | summary: correct typo of ff-mpirun in configure.ac | | | | | | | o | | changeset: 2118:967660b728d5 | | | | | user: Frederic Hecht | | | | | date: Wed Nov 17 21:46:20 2010 +0100 | | | | | summary: coorect the previous add ff-run | | | | | | | o | | changeset: 2117:43b0bed1bd5b | | | | | user: Frederic Hecht | | | | | date: Wed Nov 17 21:13:52 2010 +0100 | | | | | summary: coorect INNOVATION | | | | | | | o | | changeset: 2116:993567388442 | | | | | user: Frederic Hecht | | | | | date: Wed Nov 17 21:11:58 2010 +0100 | | | | | summary: add ff-mpirun to launch freefem++-mpi simply | | | | | | | o | | changeset: 2115:94e4e901b405 | | | | | user: Frederic Hecht | | | | | date: Wed Nov 17 08:03:01 2010 +0100 | | | | | summary: correct mistake | | | | | | | o | | changeset: 2114:d684b3efa24f | | | | | user: Frederic Hecht | | | | | date: Tue Nov 16 22:37:26 2010 +0100 | | | | | summary: correct typo error in fftw3 in WHERE_LIBRARY-config | | | | | | | o | | changeset: 2113:79e95c94d4a5 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 16 20:09:36 2010 +0100 | | | | | summary: correct mistyping in metis.cpp | | | | | | | o | | changeset: 2112:09b6d06266af | | | | | user: Frederic Hecht | | | | | date: Tue Nov 16 19:53:30 2010 +0100 | | | | | summary: romve cout in metis.cpp | | | | | | | o | | changeset: 2111:ac951e2d8008 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 16 19:51:00 2010 +0100 | | | | | summary: remove strange dump | | | | | | | o | | changeset: 2110:0addf52a6596 | | | | | user: Frederic Hecht | | | | | date: Tue Nov 16 07:34:31 2010 +0100 | | | | | summary: correct MPI version from gmone machine | | | | | | | o | | changeset: 2109:18a79ce6b201 | | | | | user: Frederic Hecht | | | | | date: Mon Nov 15 20:36:31 2010 +0100 | | | | | summary: coorect pb of comute of area of mesh some time | | | | | | | o | | changeset: 2108:6e7efdc6c4cd | | | | | user: Frederic Hecht | | | | | date: Mon Nov 15 10:22:02 2010 +0100 | | | | | summary: crrect atof, blas WHERE_LIBRARY | | | | | | | o | | changeset: 2107:16dedee619b5 | | | | | user: Frederic Hecht | | | | | date: Fri Nov 05 09:52:22 2010 +0100 | | | | | summary: add nex example | | | | | | | o | | changeset: 2106:5e33715c5809 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 04 19:23:41 2010 +0100 | | | | | summary: correct output stream | | | | | | | o | | changeset: 2105:ad9c5a3700f3 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 04 18:25:58 2010 +0100 | | | | | summary: reove test in MPIGRES2D | | | | | | | o | | changeset: 2104:27f8c8458b71 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 04 18:19:33 2010 +0100 | | | | | summary: add missing file | | | | | | | o | | changeset: 2103:3b3bdf3ac0c5 | | | | | user: Frederic Hecht | | | | | date: Thu Nov 04 18:10:55 2010 +0100 | | | | | summary: clean | | | | | | | o | | changeset: 2102:b2b101c4208d | | | | | parent: 2099:f9822a5aea7a | | | | | user: Frederic Hecht | | | | | date: Thu Nov 04 18:01:07 2010 +0100 | | | | | summary: remove pb file | | | | | o | | | | changeset: 2101:31c99c85707b | | | | | user: Frederic Hecht | | | | | date: Thu Nov 04 17:48:49 2010 +0100 | | | | | summary: add missing idp files | | | | | o---+ | | changeset: 2100:79615779ae45 | | | | user: Frederic Hecht / / / / date: Thu Nov 04 17:48:14 2010 +0100 | | | | summary: add new MPI example | | | | | o | | changeset: 2099:f9822a5aea7a | | | | user: Frederic Hecht | | | | date: Thu Nov 04 16:50:40 2010 +0100 | | | | summary: add BinaryIO dynamic lib in example++-load | | | | | o | | changeset: 2098:530dbd02d812 | | | | user: Frederic Hecht | | | | date: Wed Oct 27 14:54:30 2010 +0200 | | | | summary: change the default size of MPI buf to 1Mo | | | | | o | | changeset: 2097:74a69bae2f83 | | | | user: Frederic Hecht | | | | date: Mon Oct 25 14:10:59 2010 +0200 | | | | summary: correct MPIGMRES examples | | | | | o | | changeset: 2096:65da29614162 | | | | user: Frederic Hecht | | | | date: Fri Oct 22 21:26:27 2010 +0200 | | | | summary: correct if (1) ; // trap | | | | | o | | changeset: 2095:1388d0f67de2 | | | | user: Frederic Hecht | | | | date: Fri Oct 22 15:20:08 2010 +0200 | | | | summary: change configure.ac protect MPICMD flags Tanks to P. gostaff | | | | | o | | changeset: 2094:d732b07cba51 | | | | user: Frederic Hecht | | | | date: Fri Oct 22 15:16:58 2010 +0200 | | | | summary: reomve peace of cade for AutoDiff not use | | | | | o | | changeset: 2093:06b5aeacde3c | | | | user: Frederic Hecht | | | | date: Fri Oct 22 14:08:30 2010 +0200 | | | | summary: Add MPI CG/GMRES function for // computing | | | | | o | | changeset: 2092:ff22b8c7a500 | | | | user: Frederic Hecht | | | | date: Fri Oct 08 15:39:32 2010 +0200 | | | | summary: update INNOVATION | | | | | o | | changeset: 2091:2d8b5240b671 | | | | user: Frederic Hecht | | | | date: Fri Oct 08 14:12:54 2010 +0200 | | | | summary: correct the bug fing by O. Pantz in expression like ; a(2:)=A^-1*b(1,:) | | | | | o | | changeset: 2090:0ab0cc381341 | | | | user: Frederic Hecht | | | | date: Wed Oct 06 17:02:11 2010 +0200 | | | | summary: correct make check in 3d examples dir | | | | | o | | changeset: 2089:3d4959d4b6e1 | | | | user: Frederic Hecht | | | | date: Tue Oct 05 18:34:02 2010 +0200 | | | | summary: add missing file | | | | | o | | changeset: 2088:3748aed79d1c | | | | user: Frederic Hecht | | | | date: Tue Oct 05 16:34:40 2010 +0200 | | | | summary: Added tag release_3_10 for changeset f96e7099dbed | | | | | o | | changeset: 2087:f96e7099dbed | | | | tag: release_3_10 | | | | user: Frederic Hecht | | | | date: Tue Oct 05 16:32:09 2010 +0200 | | | | summary: coorect INNOVATION | | | | | o | | changeset: 2086:a0a40e1e3132 | | | | user: Frederic Hecht | | | | date: Tue Oct 05 16:02:04 2010 +0200 | | | | summary: add missing install files | | | | | o | | changeset: 2085:caf345bbc560 | | | | user: Frederic Hecht | | | | date: Tue Oct 05 15:22:43 2010 +0200 | | | | summary: correct install mpi dymanics libs | | | | | o | | changeset: 2084:03ddaceddb3e | | | | user: Frederic Hecht | | | | date: Tue Oct 05 14:50:46 2010 +0200 | | | | summary: add install of dynamic lin in mpi | | | | | o | | changeset: 2083:b689c5e0ebb4 | | | | user: Frederic Hecht | | | | date: Tue Oct 05 14:06:32 2010 +0200 | | | | summary: add "-cd" argument to change current directory to edp script directory | | | | | o | | changeset: 2082:c0c0d05d486c | | | | user: Frederic Hecht | | | | date: Tue Oct 05 11:30:08 2010 +0200 | | | | summary: coorect missing compile parameter in pARMS libs | | | | | o | | changeset: 2081:8626f17af8a6 | | | | user: Frederic Hecht | | | | date: Tue Oct 05 10:49:26 2010 +0200 | | | | summary: correct configure.ac for automatic download of mmg3d lib. | | | | | o | | changeset: 2080:672655247fbf | | | | user: Frederic Hecht | | | | date: Tue Oct 05 00:42:30 2010 +0200 | | | | summary: do modif of g++-4.6 | | | | | o | | changeset: 2079:5b727e03ff94 | | | | user: Frederic Hecht | | | | date: Fri Oct 01 16:36:38 2010 +0200 | | | | summary: mistake in parm makefile | | | | | o | | changeset: 2078:e0137efef48d | | | | user: Frederic Hecht | | | | date: Fri Oct 01 16:10:58 2010 +0200 | | | | summary: version ok for ubuntu 64 | | | | | o | | changeset: 2077:f43ece160238 | | | | user: Frederic Hecht | | | | date: Fri Oct 01 15:47:06 2010 +0200 | | | | summary: correctr for version 2.10xs | | | | | o | | changeset: 2076:f0b9786353ec | | | | user: Frederic Hecht | | | | date: Fri Oct 01 15:13:40 2010 +0200 | | | | summary: coorection fort 3.10 version | | | | | o | | changeset: 2075:bc78bc18d0b1 | | | | user: Frederic Hecht | | | | date: Fri Oct 01 12:46:55 2010 +0200 | | | | summary: try to close version 3.10 | | | | | o | | changeset: 2074:e2b8cf20c61b | | | | user: Frederic Hecht | | | | date: Wed Sep 29 16:33:21 2010 +0200 | | | | summary: correct IntallWHERE in gmm makefiel | | | | | o | | changeset: 2073:10b7a602f98f | | | | user: Frederic Hecht | | | | date: Wed Sep 29 15:38:54 2010 +0200 | | | | summary: correct parms Makefile | | | | | o | | changeset: 2072:9440ff46f0ea | | | | user: Frederic Hecht | | | | date: Wed Sep 29 14:19:58 2010 +0200 | | | | summary: Add missing exemple | | | | | o | | changeset: 2071:e843df1be44d | | | | user: Frederic Hecht | | | | date: Tue Sep 21 22:05:42 2010 +0200 | | | | summary: correct -fPIC flags un blacs compilation | | | | | o | | changeset: 2070:39392778a85e | | | | user: Frederic Hecht | | | | date: Tue Sep 21 21:24:17 2010 +0200 | | | | summary: update INNOVATION | | | | | o | | changeset: 2069:22cc87fe9e3d | | | | user: Frederic Hecht | | | | date: Tue Sep 21 19:14:38 2010 +0200 | | | | summary: corecct MUMPS Makefile (missing CC,FC compile flags -fPIC ) | | | | | o | | changeset: 2068:596ef1aa8971 | | | | user: Frederic Hecht | | | | date: Tue Sep 21 15:12:33 2010 +0200 | | | | summary: do autorecconf for add HAVE_SYS_TIME_H | | | | | o | | changeset: 2067:ea3d2e60219d | | | | user: Frederic Hecht | | | | date: Tue Sep 21 15:10:08 2010 +0200 | | | | summary: coorect gmm Makefile for WHERE ... | | | | | o | | changeset: 2066:e17ed9466e08 | | | | user: Frederic Hecht | | | | date: Tue Sep 21 14:13:01 2010 +0200 | | | | summary: correct pb on download/bin creation (so time it a file not a dir) | | | | | o | | changeset: 2065:a1c8c12f1363 | | | | user: Frederic Hecht | | | | date: Tue Sep 21 12:19:21 2010 +0200 | | | | summary: correct gmm compile and WHERE def. | | | | | o | | changeset: 2064:1bed39d421c9 | | | | user: Frederic Hecht | | | | date: Tue Sep 21 07:55:41 2010 +0200 | | | | summary: correct PB with echo_edp | | | | | o | | changeset: 2063:14e807f30896 | | | | user: Frederic Hecht | | | | date: Mon Sep 20 22:49:04 2010 +0200 | | | | summary: coorect Makefile of mmglib download .. | | | | | o | | changeset: 2062:2005c8d27803 | | | | user: Frederic Hecht | | | | date: Mon Sep 20 21:34:12 2010 +0200 | | | | summary: correct mmg3lib precompile | | | | | o | | changeset: 2061:77b950c53405 | | | | user: Frederic Hecht | | | | date: Mon Sep 20 20:36:40 2010 +0200 | | | | summary: add new parameter -ne to remove script output | | | | | o | | changeset: 2060:90c7c0e87652 | | | | user: Frederic Hecht | | | | date: Thu Sep 09 15:43:29 2010 +0200 | | | | summary: add gmm and corretc load.link.in for windows | | | | | o | | changeset: 2059:04ef78a06b11 | | | | user: Frederic Hecht | | | | date: Tue Aug 31 13:18:25 2010 +0200 | | | | summary: update README | | | | | o | | changeset: 2058:9f3f911348ff | | | | user: Frederic Hecht | | | | date: Tue Aug 31 13:11:27 2010 +0200 | | | | summary: corect innovation | | | | | o | | changeset: 2057:87b6d7922730 | | | | user: Frederic Hecht | | | | date: Tue Aug 31 13:10:35 2010 +0200 | | | | summary: add missing compila of mshmet dynamc lib | | | | | o | | changeset: 2056:5b51781d6c92 | | | | user: Frederic Hecht | | | | date: Tue Aug 31 13:02:05 2010 +0200 | | | | summary: upate INNOVATION | | | | | o | | changeset: 2055:1235170c0a9e | | | | parent: 2053:0b6fd3c42d32 | | | | user: Frederic Hecht | | | | date: Tue Aug 31 12:56:55 2010 +0200 | | | | summary: correct examples++-load/Makefile.am to recreate examples++-load/WHERE_LIBRARY-download | | | | o | | | changeset: 2054:f3cbf7394995 |/ / / user: Frederic Hecht | | | date: Tue Aug 31 12:42:00 2010 +0200 | | | summary: coorect typo in asssert mmg3d.cpp | | | o | | changeset: 2053:0b6fd3c42d32 | | | user: Frederic Hecht | | | date: Tue Aug 31 12:30:33 2010 +0200 | | | summary: coorech WHERE of mshlib | | | o | | changeset: 2052:b3e9a365ee44 | | | user: Frederic Hecht | | | date: Tue Aug 31 12:22:40 2010 +0200 | | | summary: add build WHERE | | | o | | changeset: 2051:ac3551adc8c2 | | | user: Frederic Hecht | | | date: Tue Aug 31 11:31:55 2010 +0200 | | | summary: coorect mshmet download compile / makefile | | | o | | changeset: 2050:4d081c4fdc8b | | | user: Frederic Hecht | | | date: Tue Aug 31 10:00:33 2010 +0200 | | | summary: correct problem of -fPIC compile option in NOOPT C ompile setup in superludist | | | o | | changeset: 2049:b31ed80c5418 | | | user: Frederic Hecht | | | date: Mon Aug 30 22:52:10 2010 +0200 | | | summary: coorect INNOVATION and auto compile fftw under win32 | | | o | | changeset: 2048:650bf83f02fc | | | user: Frederic Hecht | | | date: Mon Aug 30 22:46:35 2010 +0200 | | | summary: correct problem of creation download/bin as a file not a dir. | | | o | | changeset: 2047:f08673def206 |\ \ \ parent: 2046:d4c390fea2f5 | | | | parent: 2043:3e424de88d66 | | | | user: Frederic Hecht | | | | date: Mon Aug 30 17:30:19 2010 +0200 | | | | summary: pass to version 3.9-2 | | | | | o | | changeset: 2046:d4c390fea2f5 | | | | user: Frederic Hecht | | | | date: Mon Aug 30 17:27:51 2010 +0200 | | | | summary: correct compile of freeyams and mmg3d under win32 | | | | | o | | changeset: 2045:008b77f57a47 | | | | user: Frederic Hecht | | | | date: Mon Aug 30 16:39:06 2010 +0200 | | | | summary: add missing file | | | | | o | | changeset: 2044:226800ecaa6d | | | | parent: 2041:76820d79834a | | | | user: Frederic Hecht | | | | date: Mon Aug 30 16:26:41 2010 +0200 | | | | summary: put c++ maning in eigen.h | | | | o | | | changeset: 2043:3e424de88d66 | | | | user: Frederic Hecht | | | | date: Mon Aug 30 13:56:19 2010 +0200 | | | | summary: correc mmg3d interface (j. Morice) ) | | | | o | | | changeset: 2042:e6a1f7c85239 |/ / / user: Frederic Hecht | | | date: Mon Aug 30 13:43:47 2010 +0200 | | | summary: coorect mmg3d interface | | | o | | changeset: 2041:76820d79834a | | | user: Frederic Hecht | | | date: Mon Aug 30 10:31:52 2010 +0200 | | | summary: correct DOC and add dep in ilut.cpp | | | o | | changeset: 2040:6e07fc2d42f8 | | | user: Frederic Hecht | | | date: Fri Aug 27 17:53:53 2010 +0200 | | | summary: update INNOVATION remove warning on pastix | | | o | | changeset: 2039:7cf7e1a0a897 | | | user: Frederic Hecht | | | date: Fri Aug 27 17:51:18 2010 +0200 | | | summary: correct problem to compile pastix, scotch undex ubuntu linux. | | | o | | changeset: 2038:f6214647e5ab | | | user: Frederic Hecht | | | date: Fri Aug 27 16:32:55 2010 +0200 | | | summary: coorect -fPIC option on Fortrn | | | o | | changeset: 2037:e79df603fcab | | | user: Frederic Hecht | | | date: Fri Aug 27 11:17:59 2010 +0200 | | | summary: coorect fftw Makefie | | | o | | changeset: 2036:99c51676b313 | | | user: Frederic Hecht | | | date: Fri Aug 27 11:00:33 2010 +0200 | | | summary: coorect mpi examples essa.edp an add wiat=1 in all medit call (bug on mac ???) | | | o | | changeset: 2035:7b14eaf9f3ed | | | user: Frederic Hecht | | | date: Fri Aug 27 09:32:47 2010 +0200 | | | summary: update INNOVATION | | | o | | changeset: 2034:0692ff74ab24 | | | user: Frederic Hecht | | | date: Fri Aug 27 09:28:57 2010 +0200 | | | summary: correct problem of dynamic lib with or without mpi | | | o | | changeset: 2033:c91026108711 | | | user: Frederic Hecht | | | date: Thu Aug 26 20:39:46 2010 +0200 | | | summary: add missing file DOC/plots/multiendmesh.eps | | | o | | changeset: 2032:e6b7488922a9 | | | user: Frederic Hecht | | | date: Thu Aug 26 20:37:52 2010 +0200 | | | summary: add missing file | | | o | | changeset: 2031:704b3d3af23d | | | user: Frederic Hecht | | | date: Thu Aug 26 18:55:46 2010 +0200 | | | summary: See INNOVATION file for explaination of this change | | | o | | changeset: 2030:e773af6b91a7 | | | user: Frederic Hecht | | | date: Fri Aug 06 11:26:27 2010 +0200 | | | summary: correct configure mpi search when no full path are given (FH). | | | o | | changeset: 2029:922d59d4af75 | | | user: Frederic Hecht | | | date: Sat Jul 10 22:06:05 2010 +0200 | | | summary: correct mistake in download/pastix/Makefile | | | o | | changeset: 2028:a2bd2ad4e78a | | | user: Frederic Hecht | | | date: Fri Jul 09 21:06:22 2010 +0200 | | | summary: update REDME and INNOVATION | | | o | | changeset: 2027:14f495eec0bd |\ \ \ parent: 2025:6bc312b89041 | | | | parent: 2026:3b1e208730b0 | | | | user: Frederic Hecht | | | | date: Fri Jul 09 19:16:41 2010 +0200 | | | | summary: coorect MUMPS link liste. | | | | | o | | changeset: 2026:3b1e208730b0 | | | | parent: 2015:d14d5fe73ed9 | | | | user: Frederic Hecht | | | | date: Fri Jul 09 18:57:24 2010 +0200 | | | | summary: do change un MUMPS_FreeFem.cpp | | | | o | | | changeset: 2025:6bc312b89041 | | | | user: Frederic Hecht | | | | date: Fri Jul 09 18:51:13 2010 +0200 | | | | summary: correct a mistake in set metric in adapt mesh, thank to J-F Remarcle. | | | | o | | | changeset: 2024:e08ce8c8a5d2 | | | | user: Frederic Hecht | | | | date: Wed Jun 30 22:39:42 2010 +0200 | | | | summary: correct missing mpi_include flges in superlu-dist makefile | | | | o | | | changeset: 2023:121ef5fadbf5 | | | | user: Frederic Hecht | | | | date: Wed Jun 30 18:38:41 2010 +0200 | | | | summary: update | | | | o | | | changeset: 2022:e38e2dcabc3c | | | | user: Frederic Hecht | | | | date: Wed Jun 30 17:06:08 2010 +0200 | | | | summary: add missing file and correct download/Makefile.am to remove | | | | o | | | changeset: 2021:22b443fb5915 | | | | user: Frederic Hecht | | | | date: Wed Jun 30 15:19:30 2010 +0200 | | | | summary: correct pastix complex interface | | | | o | | | changeset: 2020:b469944f3b63 | | | | user: Frederic Hecht | | | | date: Tue Jun 29 13:59:08 2010 +0200 | | | | summary: corret ff-get-dep.in | | | | o | | | changeset: 2019:7613e18949b0 | | | | user: Frederic Hecht | | | | date: Mon Jun 28 10:49:33 2010 +0200 | | | | summary: remove stupid assert (matrix sym is CG) | | | | o | | | changeset: 2018:6be89be787cc | | | | user: Frederic Hecht | | | | date: Sat Jun 26 22:02:09 2010 +0200 | | | | summary: correct hips and pastix interface | | | | o | | | changeset: 2017:e95f7c430680 | | | | user: Frederic Hecht | | | | date: Sat Jun 26 21:59:25 2010 +0200 | | | | summary: coorect stupid bug (due to remove static). | | | | o | | | changeset: 2016:4b93ae958d23 |/ / / user: Frederic Hecht | | | date: Sat Jun 26 21:46:05 2010 +0200 | | | summary: Correct pastix | | | o | | changeset: 2015:d14d5fe73ed9 |\ \ \ parent: 2010:3bcb7b38c34a | | | | parent: 2014:7a83a063e59e | | | | user: Frederic Hecht | | | | date: Thu Jun 17 10:57:12 2010 +0200 | | | | summary: update README_HG | | | | | o | | changeset: 2014:7a83a063e59e | | | | user: Antoine Le Hyaric | | | | date: Thu Jun 17 09:00:54 2010 +0200 | | | | summary: Modified by Antoine Le Hyaric on iris.ann.jussieu.fr | | | | | o | | changeset: 2013:b72032208ab2 | | | | user: Antoine Le Hyaric | | | | date: Wed Jun 16 17:13:41 2010 +0200 | | | | summary: Modified by Antoine Le Hyaric on iris.ann.jussieu.fr | | | | | o | | changeset: 2012:85e200ee9012 | | | | user: Antoine Le Hyaric | | | | date: Wed Jun 16 15:10:12 2010 +0200 | | | | summary: Modified by Antoine Le Hyaric on iris.ann.jussieu.fr | | | | | o | | changeset: 2011:8bf4c30f32bf | | | | parent: 2007:b47cd9ba79ca | | | | user: Antoine Le Hyaric | | | | date: Wed Jun 16 10:44:29 2010 +0200 | | | | summary: converting from CVS to Mercurial | | | | o | | | changeset: 2010:3bcb7b38c34a | | | | user: Frederic Hecht | | | | date: Thu Jun 17 10:44:16 2010 +0200 | | | | summary: correct download makefile | | | | o | | | changeset: 2009:1ba4e27c2764 | | | | user: Frederic Hecht | | | | date: Wed Jun 16 21:16:16 2010 +0200 | | | | summary: add build .hgrc comment | | | | o | | | changeset: 2008:7344a2077883 |/ / / user: Frederic Hecht | | | date: Wed Jun 16 18:53:05 2010 +0200 | | | summary: try | | | o | | changeset: 2007:b47cd9ba79ca | | | user: Antoine Le Hyaric | | | date: Wed Jun 16 10:31:22 2010 +0200 | | | summary: converting from CVS to Mercurial | | | o | | changeset: 2006:3bb8e4bb93b7 | | | parent: 1962:f5cdd2662eb6 | | | user: convert-repo | | | date: Wed Jun 16 07:27:03 2010 +0000 | | | summary: update tags | | | | o | changeset: 2005:815102f120b1 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Fri Jun 04 15:26:59 2004 +0200 | | | summary: Compilation ok sur Hydre. | | | | o | changeset: 2004:6eb70bcaac52 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Fri Jun 04 12:06:26 2004 +0200 | | | summary: Compilation ok sur idared | | | | o | changeset: 2003:ff717298a121 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Thu Jun 03 16:02:58 2004 +0200 | | | summary: Les bibliothèques BLAS, ARPACK et UMFPACK sont automatiquement téléchargées | | | | o | changeset: 2002:edf4f99d7e54 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed Jun 02 12:39:56 2004 +0200 | | | summary: Configuration des telechargements en cours | | | | o | changeset: 2001:06b2ccabec8d | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed Jun 02 12:30:30 2004 +0200 | | | summary: Configuration des telechargements en cours | | | | o | changeset: 2000:092b0b13310c | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed Jun 02 11:34:04 2004 +0200 | | | summary: Ajout des libs Blas, Arpack et Umfpack en cours sous Windows | | | | o | changeset: 1999:3fd33de0d94b | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue Jun 01 17:11:53 2004 +0200 | | | summary: Premiere installation Windows | | | | o | changeset: 1998:0def60c97d19 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Fri May 28 14:13:19 2004 +0200 | | | summary: Le rpertoir src/std contient maintenant non plus une version x11 mais | | | | o | changeset: 1997:2eaf38b528a1 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Thu May 27 17:00:47 2004 +0200 | | | summary: Toute première version de FreeFem++ compilable sur Windows avec Cygwin, | | | | o | changeset: 1996:931a8adc93ae | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed May 26 11:21:29 2004 +0200 | | | summary: Clarification de quelques commentaires. | | | | o | changeset: 1995:6bc565381b22 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 25 16:14:21 2004 +0200 | | | summary: Trois options de configuration manuelle ajoutées: | | | | o | changeset: 1994:f40848886dac | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 25 15:05:32 2004 +0200 | | | summary: - Modification de la procédure de test pour exécuter les scripts all.edp | | | | o | changeset: 1993:70dc0e4a4a0a | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 25 10:50:09 2004 +0200 | | | summary: Automake ok pour X11 sur MacOS X. | | | | o | changeset: 1992:b140ece42b7e | | | branch: alh-autoconf | | | user: lehyaric | | | date: Mon May 24 19:12:19 2004 +0200 | | | summary: Ajoute l'extension "-g" à la version debug des programmes en vue | | | | o | changeset: 1991:eed90ccfb2f9 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Mon May 24 18:19:41 2004 +0200 | | | summary: Automake ok sur Debian/Testing. | | | | o | changeset: 1990:75cdc2370b75 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Mon May 24 17:31:34 2004 +0200 | | | summary: Test de la configuration Automake sur macserv2+X11: compilation ok. | | | | o | changeset: 1989:746910bc7d39 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Mon May 24 14:57:10 2004 +0200 | | | summary: Début de configuration de FreeFem++ sur Windows/Cygwin. | | | | o | changeset: 1988:9e62c7a49ce5 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Mon May 24 11:19:18 2004 +0200 | | | summary: Intégration de la bibliothèque Umfpack dans la configuration et | | | | o | changeset: 1987:e413f1a2441f | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed May 19 15:46:55 2004 +0200 | | | summary: Ajoute src/Eigen/eigenvalue.cpp dans la bibliothèque src/fflib/libff.a | | | | o | changeset: 1986:7c581dff37a2 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed May 19 15:06:18 2004 +0200 | | | summary: Première version de la procédure de test de non-regression. | | | | o | changeset: 1985:dadd01f5b506 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed May 19 13:52:55 2004 +0200 | | | summary: Amélioration de la gestion des numéros de version. | | | | o | changeset: 1984:aa87846f7d99 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Wed May 19 11:05:24 2004 +0200 | | | summary: Automake configuré sur macserv2 | | | | o | changeset: 1983:2f557c31cc18 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 18 18:10:17 2004 +0200 | | | summary: Configuration de la compilation sur MacOSX toujours en cours. | | | | o | changeset: 1982:f749df09dd6a | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 18 18:00:00 2004 +0200 | | | summary: Configuration de la procédure de compilation sur MacOSX en cours. | | | | o | changeset: 1981:82ad80a2167a | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 18 17:35:36 2004 +0200 | | | summary: Compilation ok sur Debian/Testing et Debian/Unstable | | | | o | changeset: 1980:fcd66b328bfb | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 18 17:08:36 2004 +0200 | | | summary: Modification de l'arborescence des répertoires dans src/ afin de placer | | | | o | changeset: 1979:775f666ab880 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Tue May 18 12:02:34 2004 +0200 | | | summary: Transformation de la compilation de programmes multiples (-g, -nw, -x11, ...) | | | | o | changeset: 1978:f8525919fd4c | | | branch: alh-autoconf | | | user: lehyaric | | | date: Mon May 17 11:46:26 2004 +0200 | | | summary: Intégration de Arpack et Umfpack en cours sur plusieurs architectures | | | | o | changeset: 1977:c78650dfe24a | | | branch: alh-autoconf | | | user: hecht | | | date: Mon May 17 11:23:06 2004 +0200 | | | summary: *** empty log message *** | | | | o | changeset: 1976:1e1d2a42cfb1 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Fri May 14 11:48:00 2004 +0200 | | | summary: Test de la présence de mpiCC ajouté (s'il est absent, la version | | | | o | changeset: 1975:a25dd9092df7 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Fri May 14 10:08:22 2004 +0200 | | | summary: Extension de la recherche de la bibliothèque BLAS. | | | | o | changeset: 1974:74d24eef730c | | | branch: alh-autoconf | | | user: lehyaric | | | date: Thu May 13 14:54:09 2004 +0200 | | | summary: Quelques nouveaux fichiers installés par la procédure standard Autoreconf -i. | | | | o | changeset: 1973:dfa4239b5f28 | | | branch: alh-autoconf | | | user: lehyaric | | | date: Thu May 13 14:45:32 2004 +0200 | | | summary: La procédure Automake + Autoconf a été testée sur Hydre (Debian Testing). | | | | o | changeset: 1972:a00adb8d7dee | | | branch: alh-autoconf | | | user: lehyaric | | | date: Thu May 13 14:08:11 2004 +0200 | | | summary: Essai de configuration de autoconf en cours. | | | | o | changeset: 1971:44cb3e95ebcc | | | branch: alh-autoconf | | | parent: 0:6d28b8993874 | | | user: lehyaric | | | date: Thu May 13 14:00:37 2004 +0200 | | | summary: Intégration de Autoconf et Automake dans la procédure de build en cours. | | | | | o changeset: 1970:44a4659127b5 | | | branch: graphical-user-interface-branch | | | tag: merged_from_gui_branch_to_trunk | | | user: lehyaric | | | date: Thu Nov 04 17:26:54 2004 +0100 | | | summary: The zoom facility is operational. | | | | | o changeset: 1969:5c2f1f4412eb | | | branch: graphical-user-interface-branch | | | user: lehyaric | | | date: Thu Oct 28 18:18:46 2004 +0200 | | | summary: IDE client currently being debugged. IDE server not connected yet. | | | | | o changeset: 1968:0b0a37bf6daa | | | branch: graphical-user-interface-branch | | | user: lehyaric | | | date: Wed Oct 27 16:16:51 2004 +0200 | | | summary: Client/server IDE compiles, but the server process does not run yet. | | | | | o changeset: 1967:c8afa28839f5 | | | branch: graphical-user-interface-branch | | | user: lehyaric | | | date: Mon Oct 25 17:29:43 2004 +0200 | | | summary: client/server framework done. But the program is still far from compiling. | | | | | o changeset: 1966:f97ec9365063 | | | branch: graphical-user-interface-branch | | | user: lehyaric | | | date: Thu Oct 21 17:19:57 2004 +0200 | | | summary: Client/server version of FreeFEM++ IDE currently being implemented. | | | | | o changeset: 1965:958059001887 | | | branch: graphical-user-interface-branch | | | user: lehyaric | | | date: Thu Oct 21 10:39:01 2004 +0200 | | | summary: Reverts object "Global" back to static storage temporarily, while Frederic | | | | | o changeset: 1964:82cbca1c015f | | | branch: graphical-user-interface-branch | | | user: lehyaric | | | date: Fri Oct 15 16:57:02 2004 +0200 | | | summary: The IDE is programmed and compiled, but not running yet. | | | | | o changeset: 1963:510c87bb28bb | |/ branch: graphical-user-interface-branch | | parent: 0:6d28b8993874 | | user: lehyaric | | date: Fri Oct 08 12:21:58 2004 +0200 | | summary: First model of an Integrated Development Environment for FreeFem++. | | o | changeset: 1962:f5cdd2662eb6 | | user: hecht | | date: Fri Jun 04 16:26:08 2010 +0200 | | summary: coorect sunstring tools | | o | changeset: 1961:85ef460011b5 | | user: hecht | | date: Fri Jun 04 13:27:24 2010 +0200 | | summary: add missing cast operator from SubString to string | | o | changeset: 1960:9d02a34af84e | | user: morice | | date: Thu Jun 03 11:54:37 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1959:60960c8ea65f | | user: morice | | date: Wed Jun 02 18:28:54 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1958:7c18ab4a9896 | | user: hecht | | date: Tue May 11 15:27:37 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1957:a54b6ce6a7e3 | | user: hecht | | date: Mon May 10 23:35:08 2010 +0200 | | summary: continue WHERE configure.ac | | o | changeset: 1956:1d450f2bff65 | | user: hecht | | date: Mon May 10 22:34:17 2010 +0200 | | summary: add where seach | | o | changeset: 1955:7b465c06c9d2 | | user: hecht | | date: Mon May 10 13:41:42 2010 +0200 | | summary: essai find where for downlaod | | o | changeset: 1954:395d818be60c | | user: hecht | | date: Mon May 10 13:37:11 2010 +0200 | | summary: correct essai | | o | changeset: 1953:140dcce8e72d | | user: hecht | | date: Mon May 10 13:35:14 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1952:427b025b4dc9 | | user: hecht | | date: Mon May 10 11:54:05 2010 +0200 | | summary: essai de generation de WHERE-LIB | | o | changeset: 1951:6e7c71e22ab1 | | user: hecht | | date: Sat May 08 20:44:14 2010 +0200 | | summary: change MPI parameter | | o | changeset: 1950:b924356b1e5b | | user: hecht | | date: Thu May 06 23:20:39 2010 +0200 | | summary: try to find mpi with better way | | o | changeset: 1949:908a3c5af9ad | | user: hecht | | date: Thu May 06 16:04:20 2010 +0200 | | summary: update OP | | o | changeset: 1948:745ef197dbca | | user: hecht | | date: Thu May 06 16:04:07 2010 +0200 | | summary: update OP. | | o | changeset: 1947:96c42270bc55 | | user: hecht | | date: Thu May 06 15:03:39 2010 +0200 | | summary: correct win32 trick | | o | changeset: 1946:f7b235f1755a | | user: hecht | | date: Thu May 06 14:34:18 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1945:9c1e8dcd9100 | | user: hecht | | date: Thu May 06 14:33:58 2010 +0200 | | summary: co | | o | changeset: 1944:f081711c3135 | | user: hecht | | date: Fri Apr 30 17:45:19 2010 +0200 | | summary: change to freeyam | | o | changeset: 1943:9fadf6558ab1 | | user: hecht | | date: Fri Apr 30 08:25:05 2010 +0200 | | summary: upat configire.ac | | o | changeset: 1942:ffa7bb4d488a | | user: hecht | | date: Thu Apr 29 23:14:40 2010 +0200 | | summary: add freeyams interface | | o | changeset: 1941:18f1981049b6 | | user: hecht | | date: Thu Apr 29 23:13:49 2010 +0200 | | summary: update configure.ac for add MPIRUN | | o | changeset: 1940:a4a4f315dc9c | | user: hecht | | date: Wed Apr 28 13:22:09 2010 +0200 | | summary: a not to bad download directory | | o | changeset: 1939:9d8173ab1050 | | user: hecht | | date: Tue Apr 27 22:06:49 2010 +0200 | | summary: mise a jour | | o | changeset: 1938:23e898259fef | | user: hecht | | date: Tue Apr 27 14:30:52 2010 +0200 | | summary: correct mistake in download dir | | o | changeset: 1937:828fe5ca6699 | | user: hecht | | date: Fri Apr 23 18:34:16 2010 +0200 | | summary: add new file | | o | changeset: 1936:55b9e8dbc3ff | | user: hecht | | date: Fri Apr 23 18:32:39 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1935:49eca60e042b | | user: hecht | | date: Fri Apr 23 11:24:01 2010 +0200 | | summary: try to build automaticaly all parallele solver (huge work) | | o | changeset: 1934:e5293a9cdc8a | | user: hecht | | date: Thu Apr 22 11:28:45 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1933:fc1f6516d8f0 | | user: morice | | date: Thu Apr 15 16:46:45 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1932:d7e0beb48e5e | | user: morice | | date: Thu Apr 15 11:22:43 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1931:629f1fe03042 | | user: morice | | date: Thu Apr 15 10:59:20 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1930:0c7899097de2 | | user: morice | | date: Mon Apr 12 15:45:36 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1929:a2b19da7465a | | user: morice | | date: Mon Apr 12 15:36:54 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1928:86be041b52dd | | user: morice | | date: Mon Apr 12 15:19:21 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1927:937c2afd093f | | user: morice | | date: Thu Apr 08 16:43:25 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1926:923abf222ca2 | | user: hecht | | date: Thu Apr 01 21:46:42 2010 +0200 | | summary: pass to version 3.8-2 | | o | changeset: 1925:aacaad3df8f6 | | user: morice | | date: Thu Apr 01 14:41:54 2010 +0200 | | summary: orientation for element in movemesh3 | | o | changeset: 1924:11023f67b884 | | user: hecht | | date: Thu Apr 01 10:47:43 2010 +0200 | | summary: add sphere6.edp | | o | changeset: 1923:83a1575669f0 | | user: hecht | | date: Wed Mar 31 15:13:12 2010 +0200 | | summary: correct | | o | changeset: 1922:04a73c54e6ee | | user: hecht | | date: Wed Mar 31 14:55:09 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1921:08a259f0ce22 | | user: morice | | date: Wed Mar 31 10:54:59 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1920:e36d5fe8cd03 | | user: hecht | | date: Wed Mar 31 10:50:56 2010 +0200 | | summary: coorect makefile | | o | changeset: 1919:55571ba570f9 | | user: hecht | | date: Wed Mar 31 10:31:56 2010 +0200 | | summary: add new makefile | | o | changeset: 1918:e781b347a370 | | user: hecht | | date: Tue Mar 30 13:45:47 2010 +0200 | | summary: update parmetis files | | o | changeset: 1917:d90c1e2a30f9 | | user: morice | | date: Mon Mar 29 11:58:30 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1916:c4bcfced6f13 | | user: morice | | date: Mon Mar 29 11:19:45 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1915:b80817aa7ee7 | | user: morice | | date: Mon Mar 29 11:07:16 2010 +0200 | | summary: *** empty log message *** | | o | changeset: 1914:65fdb04766e3 | | user: morice | | date: Fri Mar 26 17:38:56 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1913:f4000b122243 | | user: morice | | date: Fri Mar 26 16:18:32 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1912:a33e7018c5a9 | | user: morice | | date: Fri Mar 26 15:15:29 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1911:39e22b59029d | | user: hecht | | date: Mon Mar 22 17:18:27 2010 +0100 | | summary: correct configure.ac mpicxx whta unset before | | o | changeset: 1910:2c1683ac514a | | user: morice | | date: Mon Mar 22 12:24:25 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1909:8740c5457454 | | user: morice | | date: Mon Mar 22 12:19:55 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1908:a3f4d18feef7 | | user: morice | | date: Mon Mar 22 12:13:11 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1907:98cf6430a6d4 | | user: morice | | date: Mon Mar 22 12:09:59 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1906:379861275764 | | user: morice | | date: Fri Mar 19 15:37:02 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1905:b763fb4d6610 | | user: morice | | date: Fri Mar 19 15:27:54 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1904:c86ddaec83d9 | | user: morice | | date: Fri Mar 19 15:05:39 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1903:cd1703be1487 | | user: morice | | date: Fri Mar 19 14:55:59 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1902:296133abf0d2 | | user: morice | | date: Fri Mar 19 14:52:59 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1901:090d8fd21d56 | | user: morice | | date: Fri Mar 19 14:43:48 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1900:8f61eac2a513 | | user: morice | | date: Fri Mar 19 14:41:13 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1899:6747aaf6981a | | user: morice | | date: Fri Mar 19 14:40:11 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1898:fe5c75d39268 | | user: morice | | date: Fri Mar 19 14:38:29 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1897:67532e425d3c | | user: morice | | date: Fri Mar 19 14:33:01 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1896:53e8bdd5722a | | user: morice | | date: Fri Mar 19 14:26:45 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1895:dad309f83d1a | | user: morice | | date: Fri Mar 19 14:22:24 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1894:42de76dbd6f2 | | user: morice | | date: Fri Mar 19 14:18:40 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1893:6f2006878f1f | | user: morice | | date: Fri Mar 19 14:16:44 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1892:6aadc8bba606 | | user: morice | | date: Fri Mar 19 13:41:21 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1891:4dc3e10452dd | | user: hecht | | date: Tue Mar 09 11:08:40 2010 +0100 | | summary: correct type ilu.cpp -> ilut.cpp in makefile | | o | changeset: 1890:6f245ceae4ce | | user: hecht | | date: Sun Mar 07 18:53:45 2010 +0100 | | summary: add missing file | | o | changeset: 1889:827ddd73fd36 | | user: hecht | | date: Sun Mar 07 18:27:41 2010 +0100 | | summary: pass to versio 3.8-1 | | o | changeset: 1888:216ef2fd580b | | user: hecht | | date: Sun Mar 07 18:16:30 2010 +0100 | | summary: correct bug in return real[int,int] func | | o | changeset: 1887:7f1fa00f6f88 | | user: hecht | | date: Thu Feb 25 14:52:51 2010 +0100 | | summary: add flag in freefem++ command -ffg 'ffg command path' with a traitement of space path. | | o | changeset: 1886:eb7357e5511a | | user: hecht | | date: Wed Feb 10 16:30:50 2010 +0100 | | summary: corct innovation | | o | changeset: 1885:2542e1d811e8 | | user: hecht | | date: Wed Feb 10 16:21:35 2010 +0100 | | summary: correct change renum triangle | | o | changeset: 1884:2436e52254e4 | | user: hecht | | date: Wed Feb 10 13:04:32 2010 +0100 | | summary: add renumbering of vertex in 2d mesh. | | o | changeset: 1883:931d93f9ac39 | | user: hecht | | date: Tue Feb 09 15:53:51 2010 +0100 | | summary: add tellp tellg seekp seekg | | o | changeset: 1882:4fc2a406c26d | | user: hecht | | date: Tue Feb 09 11:57:23 2010 +0100 | | summary: add seekg and teelg | | o | changeset: 1881:3d1237b0e08f | | user: hecht | | date: Tue Feb 09 10:00:13 2010 +0100 | | summary: change all.edp build rule | | o | changeset: 1880:10c734721deb | | user: hecht | | date: Mon Feb 08 19:58:31 2010 +0100 | | summary: correct makefile | | o | changeset: 1879:e3df8d40fb1c | | user: hecht | | date: Mon Feb 08 19:23:24 2010 +0100 | | summary: add missing file | | o | changeset: 1878:8a8a0b9efed9 | | user: hecht | | date: Mon Feb 08 19:15:35 2010 +0100 | | summary: correct ' operator in lot of case | | o | changeset: 1877:29d816db94eb | | user: hecht | | date: Thu Feb 04 20:30:07 2010 +0100 | | summary: update INNOVATION | | o | changeset: 1876:4ecd608b125d | | user: hecht | | date: Thu Feb 04 20:10:15 2010 +0100 | | summary: unify lapack and fflapack load interface. | | o | changeset: 1875:91c414a420a3 | | user: morice | | date: Thu Feb 04 15:20:38 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1874:7af250db5757 | | user: hecht | | date: Thu Feb 04 14:48:24 2010 +0100 | | summary: correct lapack seack lib. | | o | changeset: 1873:bf8ac5ac2f55 | | user: hecht | | date: Thu Feb 04 11:15:07 2010 +0100 | | summary: correct problem of include search path | | o | changeset: 1872:fb13ee753e57 | | user: hecht | | date: Wed Feb 03 09:22:35 2010 +0100 | | summary: add 3d schwarz 3d | | o | changeset: 1871:a422afbf9671 | | user: hecht | | date: Tue Feb 02 20:51:19 2010 +0100 | | summary: commeit tipo error | | o | changeset: 1870:fc69c1fef879 | | user: hecht | | date: Tue Feb 02 20:34:51 2010 +0100 | | summary: add volume | | o | changeset: 1869:c71bd076f2ec | | user: hecht | | date: Mon Feb 01 13:45:14 2010 +0100 | | summary: add tools to get fort wrapper name | | o | changeset: 1868:f66e3f760562 | | user: hecht | | date: Mon Feb 01 10:50:12 2010 +0100 | | summary: Update co,figure.ac of MPIF77 , ..., sizeof it, long | | o | changeset: 1867:0d16ed2eac32 | | user: hecht | | date: Sun Jan 31 17:24:57 2010 +0100 | | summary: add MPI fortran and CC interface | | o | changeset: 1866:238d2e7a177d | | user: hecht | | date: Thu Jan 28 20:38:21 2010 +0100 | | summary: correct edp to idp dir of search .idp files | | o | changeset: 1865:769324bb4d73 | | user: hecht | | date: Thu Jan 28 17:44:36 2010 +0100 | | summary: change refface= en label= | | o | changeset: 1864:e7899c82f054 | | user: hecht | | date: Mon Jan 25 09:10:25 2010 +0100 | | summary: correct plot of array of FE with new version | | o | changeset: 1863:f298bac1900c | | user: hecht | | date: Mon Jan 25 07:17:34 2010 +0100 | | summary: a littte improvante in ffglut (visu of 3d mesh) | | o | changeset: 1862:2b1dc85030ca | | user: hecht | | date: Mon Jan 25 06:47:11 2010 +0100 | | summary: ad seekp of ostream file ... | | o | changeset: 1861:c1e242006cc8 | | user: hecht | | date: Mon Jan 25 06:40:08 2010 +0100 | | summary: correct topy in 3d plot | | o | changeset: 1860:bf0657d69e94 | | user: hecht | | date: Mon Jan 25 05:57:40 2010 +0100 | | summary: remove F77_WRAPPER form configure trap on my mac with fort77 | | o | changeset: 1859:fe7b9cd0f709 | | user: hecht | | date: Mon Jan 25 05:47:31 2010 +0100 | | summary: pass to version 3.8 | | o | changeset: 1858:a9c19984fadd | | user: hecht | | date: Thu Jan 14 16:18:03 2010 +0100 | | summary: coorect computation of eigen value on complex full matrix | | o | changeset: 1857:f51530740c5c | | user: hecht | | date: Wed Jan 13 22:41:46 2010 +0100 | | summary: add possibility to put array in int1d,int2d,int3d,on key word to set | | o | changeset: 1856:e6130f5019ba | | user: hecht | | date: Wed Jan 13 18:06:46 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1855:52a7add0311b | | user: hecht | | date: Wed Jan 13 18:03:59 2010 +0100 | | summary: for mingw freeglut version .... | | o | changeset: 1854:b7177e4145d5 | | user: hecht | | date: Wed Jan 13 17:28:33 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1853:6d8ecc9202f5 | | user: hecht | | date: Wed Jan 13 17:24:39 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1852:9bed1f5c517e | | user: hecht | | date: Wed Jan 13 17:16:01 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1851:5cc23ea21a59 | | user: hecht | | date: Wed Jan 13 16:06:17 2010 +0100 | | summary: correct typo in configure.ac under win32 | | o | changeset: 1850:2ba47239afb6 | | user: hecht | | date: Wed Jan 13 15:14:59 2010 +0100 | | summary: correct to must cou | | o | changeset: 1849:421529d5cb67 | | user: hecht | | date: Wed Jan 13 11:02:08 2010 +0100 | | summary: correction in bamg for 2d ring shaped sub domaines | | o | changeset: 1848:795d2400a80a | | user: hecht | | date: Tue Jan 12 23:38:00 2010 +0100 | | summary: patch gmsh Christophe Trophime | | o | changeset: 1847:03c7f9f5f133 | | user: hecht | | date: Tue Jan 12 21:17:48 2010 +0100 | | summary: try to build configure for mingw ... | | o | changeset: 1846:48b1cd3c2e4b | | user: morice | | date: Tue Jan 12 16:15:59 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1845:f7b3d045a617 | | user: hecht | | date: Tue Jan 12 13:53:05 2010 +0100 | | summary: add exemple | | o | changeset: 1844:c603be120d2d | | user: atenekeng | | date: Mon Jan 11 23:19:32 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1843:07d39562f84d | | user: hecht | | date: Mon Jan 11 21:02:55 2010 +0100 | | summary: ass Superlu to version 4.0 | | o | changeset: 1842:9652d9a1931e | | user: hecht | | date: Mon Jan 11 17:52:18 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1841:735fdff39099 | | user: hecht | | date: Sun Jan 10 22:47:14 2010 +0100 | | summary: correct spuriou cout | | o | changeset: 1840:6c1591ad5660 | | user: morice | | date: Tue Jan 05 15:46:48 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1839:3b36b0cdd71f | | user: morice | | date: Tue Jan 05 14:10:13 2010 +0100 | | summary: *** empty log message *** | | o | changeset: 1838:6453b34c9217 | | user: hecht | | date: Sun Dec 27 19:17:04 2009 +0100 | | summary: correct fortran link edition in case of incompatible g7è/gfortran and g++ | | o | changeset: 1837:5110dfd736f3 | | user: hecht | | date: Sun Dec 27 19:01:36 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1836:6b80ef98c41c | | user: hecht | | date: Sun Dec 27 18:55:46 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1835:bc55abed1921 | | user: hecht | | date: Sun Dec 27 18:51:04 2009 +0100 | | summary: coorect gfrotran / lib pb | | o | changeset: 1834:02bcb3362a47 | | user: hecht | | date: Sun Dec 27 18:43:44 2009 +0100 | | summary: correct configure un case of gfortran with not same version than gcc. | | o | changeset: 1833:8ae1bbb6b9e1 | | user: hecht | | date: Sun Dec 27 18:24:51 2009 +0100 | | summary: correct iovtk.cpp (add tekplot case) | | o | changeset: 1832:6e3050d3aacf | | user: hecht | | date: Sun Dec 27 12:09:54 2009 +0100 | | summary: add build interpolation interpolation matrix in 3d | | o | changeset: 1831:d117aa62e8d2 | | user: hecht | | date: Fri Dec 18 10:00:30 2009 +0100 | | summary: pass in version 3.7-1 and correct compilation CFLAGS under 64 architecture. | | o | changeset: 1830:749462a2fc20 | | user: hecht | | date: Fri Dec 11 14:23:48 2009 +0100 | | summary: trunc3d.cpp is now in mesh3.cpp | | o | changeset: 1829:925d3a721e3f | | user: hecht | | date: Thu Dec 10 21:38:32 2009 +0100 | | summary: add wait | | o | changeset: 1828:a2e92cb3e6e3 | | user: hecht | | date: Thu Dec 10 21:34:40 2009 +0100 | | summary: remove this supite file in cvs | | o | changeset: 1827:58d02edf2d0e | | user: hecht | | date: Thu Dec 10 21:33:19 2009 +0100 | | summary: add trunc mesh in 3d. | | o | changeset: 1826:dc4d33da9a55 | | user: morice | | date: Thu Dec 10 16:35:06 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1825:6630293ece4e | | user: morice | | date: Thu Dec 10 16:25:01 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1824:e421852ce6a5 | | user: morice | | date: Thu Dec 10 11:17:49 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1823:fff1817b0b36 | | user: hecht | | date: Thu Dec 10 10:18:37 2009 +0100 | | summary: change lg.y -> lg.ypp | | o | changeset: 1822:40b7d100c5d8 | | user: hecht | | date: Tue Dec 08 11:37:48 2009 +0100 | | summary: suite | | o | changeset: 1821:56eb1768a904 | | user: hecht | | date: Tue Dec 08 11:36:21 2009 +0100 | | summary: add info in INNOVATION | | o | changeset: 1820:f7d8b4e0ae1d | | user: hecht | | date: Mon Dec 07 22:22:27 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1819:c1c8a95285bb | | user: hecht | | date: Mon Dec 07 18:17:16 2009 +0100 | | summary: add example | | o | changeset: 1818:fed850c6eb0f | | user: hecht | | date: Mon Dec 07 16:23:19 2009 +0100 | | summary: do best plt of 3d meshes | | o | changeset: 1817:c057f46814b0 | | user: hecht | | date: Mon Dec 07 09:01:34 2009 +0100 | | summary: coorect cube.idp and change 3d plot of mesh | | o | changeset: 1816:72020a794a9e | | user: hecht | | date: Sat Dec 05 18:16:25 2009 +0100 | | summary: remove imtempestive cout. | | o | changeset: 1815:47a39d936529 | | user: hecht | | date: Fri Dec 04 15:53:33 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1814:db02f8bf3214 | | user: hecht | | date: Fri Dec 04 15:43:18 2009 +0100 | | summary: correct FFLIGS flags of windows | | o | changeset: 1813:137e79954fe7 | | user: hecht | | date: Fri Dec 04 15:36:17 2009 +0100 | | summary: remove copy of header file form download directory | | o | changeset: 1812:b4e4adbe84a3 | | user: hecht | | date: Fri Dec 04 15:13:50 2009 +0100 | | summary: add missing file | | o | changeset: 1811:180008496671 | | user: hecht | | date: Fri Dec 04 15:11:20 2009 +0100 | | summary: add missing file | | o | changeset: 1810:d8f3474d197b | | user: hecht | | date: Fri Dec 04 14:59:43 2009 +0100 | | summary: correct fortran flag in ff-c++ command | | o | changeset: 1809:d52e91d99886 | | user: hecht | | date: Fri Dec 04 14:37:58 2009 +0100 | | summary: add new files for newuao optimiserx | | o | changeset: 1808:625009875e58 | | user: hecht | | date: Fri Dec 04 13:44:30 2009 +0100 | | summary: change in innovation | | o | changeset: 1807:10390fccf8b9 | | user: hecht | | date: Thu Dec 03 10:49:42 2009 +0100 | | summary: correct problem of free mesh to early in case off gluing | | o | changeset: 1806:fc93d1454f21 | | user: hecht | | date: Fri Nov 27 11:17:05 2009 +0100 | | summary: add matrix[int] type in grammar | | o | changeset: 1805:bb43bba84bdf | | user: hecht | | date: Fri Nov 20 09:38:23 2009 +0100 | | summary: remove warning | | o | changeset: 1804:bff4956d8430 | | user: hecht | | date: Fri Nov 20 09:35:47 2009 +0100 | | summary: remove some warning | | o | changeset: 1803:08437a27c2a6 | | user: hecht | | date: Thu Nov 19 22:14:40 2009 +0100 | | summary: add example | | o | changeset: 1802:24c6e35d1bda | | user: hecht | | date: Thu Nov 19 20:41:26 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1801:b22f5fecc9fa | | user: hecht | | date: Thu Nov 19 20:38:51 2009 +0100 | | summary: add two examples | | o | changeset: 1800:ea3546059a3b | | user: morice | | date: Thu Nov 19 16:49:22 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1799:6828802fdc80 | | user: hecht | | date: Sat Nov 14 22:51:05 2009 +0100 | | summary: in ffglut remove seg to small ??? | | o | changeset: 1798:416458502277 | | user: hecht | | date: Fri Nov 13 22:32:37 2009 +0100 | | summary: pass to version 3.7 | | o | changeset: 1797:5009b00a38ce | | user: hecht | | date: Fri Nov 13 12:19:41 2009 +0100 | | summary: correct spouriou print | | o | changeset: 1796:b1f05929d2d8 | | user: hecht | | date: Wed Nov 11 22:46:19 2009 +0100 | | summary: change | | o | changeset: 1795:9543c5eca7b7 | | user: hecht | | date: Wed Nov 11 22:45:29 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1794:a736d190fc78 | | user: hecht | | date: Tue Nov 10 20:51:54 2009 +0100 | | summary: correct install stuff | | o | changeset: 1793:33efbea32b77 | | user: hecht | | date: Tue Nov 10 20:28:07 2009 +0100 | | summary: build WHERE_LIBRARY-config file for ff-c++ tools | | o | changeset: 1792:1564d9e47726 | | user: hecht | | date: Tue Nov 10 15:36:29 2009 +0100 | | summary: add clapack.h interface | | o | changeset: 1791:5df6bba70026 | | user: hecht | | date: Tue Nov 10 14:33:50 2009 +0100 | | summary: correct vtk files | | o | changeset: 1790:9b3614fade98 | | user: hecht | | date: Mon Nov 09 16:24:48 2009 +0100 | | summary: passe to version 3.6-1 | | o | changeset: 1789:d4ba4d32c211 | | user: hecht | | date: Mon Nov 09 15:22:29 2009 +0100 | | summary: add PICHON stuff (for brute force seaching tet ) | | o | changeset: 1788:9066a9a4c83a | | user: hecht | | date: Mon Nov 09 11:59:11 2009 +0100 | | summary: correct problem of missing to 2 functions with g++-4.4 | | o | changeset: 1787:c8afce8d6282 | | user: hecht | | date: Mon Nov 09 11:56:46 2009 +0100 | | summary: correct mistake this g+= 4.4 compiler | | o | changeset: 1786:c7940961398f | | user: morice | | date: Fri Nov 06 11:46:05 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1785:5b9105ef4314 | | user: morice | | date: Fri Nov 06 11:44:44 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1784:e8f258f9446a | | user: morice | | date: Fri Nov 06 11:41:40 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1783:3f117c9abc8d | | user: morice | | date: Fri Nov 06 10:50:32 2009 +0100 | | summary: add new tetgen and medit edp file CVS: ---------------------------------------------------------------------- | | o | changeset: 1782:c6eda2a03844 | | user: hecht | | date: Thu Nov 05 11:49:07 2009 +0100 | | summary: add missing file. | | o | changeset: 1781:0a6031f38b29 | | user: hecht | | date: Wed Nov 04 12:56:48 2009 +0100 | | summary: change innovation | | o | changeset: 1780:8b10917a60ef | | user: hecht | | date: Tue Nov 03 21:38:30 2009 +0100 | | summary: add auto stuff | | o | changeset: 1779:8938281ebc2e | | user: hecht | | date: Tue Nov 03 21:29:32 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1778:2d9b15732841 | | user: hecht | | date: Tue Nov 03 20:54:39 2009 +0100 | | summary: passe to version 1.4.3 of tetgen. | | o | changeset: 1777:d7ff001547be | | user: hecht | | date: Tue Oct 27 17:22:13 2009 +0100 | | summary: add eigen value full | | o | changeset: 1776:c8de02c7971f | | user: hecht | | date: Sun Oct 25 18:18:58 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1775:abb3258333e5 | | user: hecht | | date: Sun Oct 25 18:03:03 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1774:ad90f689e762 | | user: hecht | | date: Wed Oct 21 22:19:30 2009 +0200 | | summary: update INNOVATION file | | o | changeset: 1773:0fca1c94a0b5 | | user: hecht | | date: Wed Oct 21 22:16:24 2009 +0200 | | summary: passe to version 3.6 | | o | changeset: 1772:961bccd81738 | | user: hecht | | date: Wed Oct 21 22:00:51 2009 +0200 | | summary: coorect .cpp and simlify | | o | changeset: 1771:1595300c7f81 | | user: hecht | | date: Wed Oct 21 20:35:47 2009 +0200 | | summary: New version of funcTemplate.cpp with function with stack + 1 2 et 3 argument | | o | changeset: 1770:12f4eb1a979a | | user: hecht | | date: Tue Oct 20 13:32:54 2009 +0200 | | summary: add tools to read .pcm files for optic-flow computation | | o | changeset: 1769:d449b7c05ec5 | | user: hecht | | date: Mon Oct 19 22:46:57 2009 +0200 | | summary: add tools to read pcm opticflow | | o | changeset: 1768:41a11cfe6bd1 | | user: hecht | | date: Thu Oct 15 23:23:01 2009 +0200 | | summary: coorect assert error in gmres without preconditionner. | | o | changeset: 1767:037d651d0a6b | | user: hecht | | date: Wed Oct 14 23:54:33 2009 +0200 | | summary: You find a very hard bug to correct s ( a small miss tapping) | | o | changeset: 1766:3e99aae2de38 | | user: morice | | date: Wed Oct 14 15:25:40 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1765:5adb0c1b49f2 | | user: morice | | date: Tue Oct 13 16:48:58 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1764:66936e3bfe84 | | user: hecht | | date: Tue Oct 13 15:41:03 2009 +0200 | | summary: correct a very old bug in bamg in case of mesh with internal | | o | changeset: 1763:0d06bacf7d81 | | user: morice | | date: Fri Oct 09 22:15:38 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1762:2a7535cf3b0c | | user: hecht | | date: Wed Oct 07 13:06:47 2009 +0200 | | summary: correct print error | | o | changeset: 1761:e90b49294374 | | user: hecht | | date: Wed Oct 07 04:54:55 2009 +0200 | | summary: add chech of size of fr-ortran integer, force fortran integer to by 4 bytes with f2c | | o | changeset: 1760:a1266eb439fe | | user: hecht | | date: Tue Oct 06 23:01:26 2009 +0200 | | summary: correct msitake in complex eigenvalue problem. | | o | changeset: 1759:8af62e433f06 | | user: hecht | | date: Mon Sep 28 22:53:48 2009 +0200 | | summary: coorect install problem undex windows and Macos. | | o | changeset: 1758:2d14d6567664 | | user: hecht | | date: Mon Sep 28 21:24:24 2009 +0200 | | summary: add __VC__ under windows (cygwin) | | o | changeset: 1757:b34002c2d4ff | | user: hecht | | date: Mon Sep 28 18:43:06 2009 +0200 | | summary: correct miss tapping in fflaunch++exe | | o | changeset: 1756:4c4dc2c8f823 | | user: hecht | | date: Mon Sep 28 18:02:18 2009 +0200 | | summary: coorect miss take in launchff++.cpp filename | | o | changeset: 1755:79cc99cce5ab | | user: hecht | | date: Mon Sep 28 18:01:21 2009 +0200 | | summary: corect misstake in filename | | o | changeset: 1754:ff040fb58b23 | | user: morice | | date: Mon Sep 28 15:46:22 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1753:0b20838e0191 | | user: hecht | | date: Thu Sep 24 16:51:20 2009 +0200 | | summary: coorect d-Leman.edp deep is under 0... (before all tet a < 0) | | o | changeset: 1752:f93cbf193dc5 | | user: hecht | | date: Thu Sep 24 16:32:45 2009 +0200 | | summary: coorect plot of 3d meshes | | o | changeset: 1751:9b61149decbb | | user: hecht | | date: Thu Sep 24 14:38:15 2009 +0200 | | summary: corect a stop test | | o | changeset: 1750:18c376484a0b | | user: hecht | | date: Thu Sep 24 14:00:06 2009 +0200 | | summary: correct big bug in case of 3D fepace with constante number of df / node. | | o | changeset: 1749:13568ef94d25 | | user: hecht | | date: Wed Sep 23 23:28:35 2009 +0200 | | summary: continuning array of vect FE func 3d | | o | changeset: 1748:9ca65f60265e | | user: hecht | | date: Wed Sep 23 21:53:47 2009 +0200 | | summary: correct makefile build WHERE-LIB -download | | o | changeset: 1747:9ad5a70d9da5 | | user: hecht | | date: Wed Sep 23 21:44:43 2009 +0200 | | summary: add two examples | | o | changeset: 1746:636e0dacf420 | | user: hecht | | date: Wed Sep 23 21:28:34 2009 +0200 | | summary: correct set array of vectorail finite element functions | | o | changeset: 1745:fd499d9e6f28 | | user: hecht | | date: Tue Sep 22 22:59:17 2009 +0200 | | summary: rebuild makefile | | o | changeset: 1744:c0f785566dae | | user: hecht | | date: Tue Sep 22 18:22:10 2009 +0200 | | summary: add patch filexs | | o | changeset: 1743:25480c53626d | | user: hecht | | date: Tue Sep 22 11:09:39 2009 +0200 | | summary: corct make fo intall | | o | changeset: 1742:5af770aaac29 | | user: hecht | | date: Tue Sep 22 11:01:06 2009 +0200 | | summary: correct makefile for metis | | o | changeset: 1741:e06fc8bfa3e5 | | user: hecht | | date: Tue Sep 22 10:54:59 2009 +0200 | | summary: remove file from data base | | o | changeset: 1740:4142e57dd0e6 | | user: hecht | | date: Tue Sep 22 10:54:00 2009 +0200 | | summary: coorect install makes | | o | changeset: 1739:76b29386160e | | user: hecht | | date: Tue Sep 22 10:43:36 2009 +0200 | | summary: continius ff-c++ auto | | o | changeset: 1738:0695dbc17cb0 | | user: hecht | | date: Tue Sep 22 10:25:01 2009 +0200 | | summary: add missing file | | o | changeset: 1737:a6f7a118aff7 | | user: hecht | | date: Tue Sep 22 10:18:56 2009 +0200 | | summary: rebuild makefiles | | o | changeset: 1736:879121c3ec58 | | user: hecht | | date: Tue Sep 22 10:18:19 2009 +0200 | | summary: change ff-c++ off auto dep. find | | o | changeset: 1735:7a7c7c8057db | | user: hecht | | date: Mon Sep 21 22:44:01 2009 +0200 | | summary: addfile for ff-pkg-download.in | | o | changeset: 1734:15ae6f084ad1 | | user: hecht | | date: Mon Sep 21 22:43:01 2009 +0200 | | summary: change movemesh3d to movemesh3 | | o | changeset: 1733:5e49222d0c4d | | user: hecht | | date: Mon Sep 21 22:38:53 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1732:878dac9dd908 | | user: morice | | date: Wed Sep 16 11:54:52 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1731:4f2fa344dc0b | | user: hecht | | date: Wed Sep 09 18:17:15 2009 +0200 | | summary: add missing resize of sparse complex matrix | | o | changeset: 1730:9d61b8cae5c5 | | user: hecht | | date: Mon Sep 07 09:50:52 2009 +0200 | | summary: add metis | | o | changeset: 1729:90e9c94f2793 | | user: morice | | date: Fri Sep 04 11:41:30 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1728:c5dbee61cf58 | | user: morice | | date: Fri Sep 04 11:40:09 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1727:607657f6d2b8 | | user: hecht | | date: Thu Sep 03 09:51:01 2009 +0200 | | summary: add tools of automatics find libs and include | | o | changeset: 1726:1ba4ebcbf0d5 | | user: morice | | date: Thu Sep 03 08:26:47 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1725:3de000c981b5 | | user: hecht | | date: Wed Sep 02 21:45:38 2009 +0200 | | summary: add metis link | | o | changeset: 1724:260e3f9628d2 | | user: hecht | | date: Wed Sep 02 09:58:04 2009 +0200 | | summary: add MPI_com in solver prameter | | o | changeset: 1723:5399bf49daa4 | | user: morice | | date: Tue Sep 01 12:41:02 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1722:a04f554f152e | | user: morice | | date: Tue Sep 01 12:30:05 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1721:3edc358fb626 | | user: morice | | date: Tue Sep 01 10:28:55 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1720:f7df348e0c24 | | user: hecht | | date: Mon Aug 31 10:59:34 2009 +0200 | | summary: CORRECT IN CASE OF mpich | | o | changeset: 1719:4a7c39d7edfb | | user: hecht | | date: Fri Aug 28 18:11:42 2009 +0200 | | summary: add missing file to coorect trap tst on ubuntu | | o | changeset: 1718:2d6aa202da95 | | user: hecht | | date: Fri Aug 28 17:52:20 2009 +0200 | | summary: coorect README | | o | changeset: 1717:a9cc7f75566d | | user: hecht | | date: Fri Aug 28 17:27:12 2009 +0200 | | summary: add file to remove trap in check of eigen exampel | | o | changeset: 1716:b33bbe62d06f | | user: hecht | | date: Fri Aug 28 15:08:18 2009 +0200 | | summary: coorect INNOVATION | | o | changeset: 1715:780e891f2505 | | user: hecht | | date: Thu Aug 27 22:00:32 2009 +0200 | | summary: coorect mistake in parallelempi.cpp | | o | changeset: 1714:ee657855b460 | | user: hecht | | date: Thu Aug 27 21:55:33 2009 +0200 | | summary: commit version 3.5 see innvovation for all change | | o | changeset: 1713:d10318b35b4d | | user: hecht | | date: Thu Aug 27 16:03:16 2009 +0200 | | summary: passe to versio 3.5 with a real mpi interface. | | o | changeset: 1712:f2ac13edc9e2 | | user: hecht | | date: Wed Aug 26 23:02:52 2009 +0200 | | summary: do a not to bad mpi version | | o | changeset: 1711:9dcb3988b48a | | user: hecht | | date: Tue Aug 25 16:06:27 2009 +0200 | | summary: add mpiBarrier + const of mpiGroup and mpiComm (boggus ???) | | o | changeset: 1710:728541dd2b77 | | user: hecht | | date: Tue Aug 25 10:06:23 2009 +0200 | | summary: add Scatter, Gather, etc in mpi | | o | changeset: 1709:a15319a40921 | | user: hecht | | date: Mon Aug 24 23:40:24 2009 +0200 | | summary: correct mpi version see innovation for detail | | o | changeset: 1708:3dc151cd6a93 | | user: hecht | | date: Sat Aug 08 21:23:53 2009 +0200 | | summary: bmo is boggus and correct mistapping in convect_dervieux | | o | changeset: 1707:54225cd7c163 | | user: hecht | | date: Sat Aug 08 21:12:14 2009 +0200 | | summary: correct convect files | | o | changeset: 1706:ea9ea9efff60 | | user: hecht | | date: Sat Aug 08 20:57:06 2009 +0200 | | summary: change a little, correct a stop test and do a fast version | | o | changeset: 1705:5feb310149d3 | | user: hecht | | date: Sat Aug 08 20:08:41 2009 +0200 | | summary: change INNOVATION | | o | changeset: 1704:8bdb3c81f330 | | user: hecht | | date: Sat Aug 08 19:11:18 2009 +0200 | | summary: build version 3.4-2 | | o | changeset: 1703:4b463c647ff0 | | user: hecht | | date: Sat Aug 08 18:25:06 2009 +0200 | | summary: do new mesh inquire also in 3d | | o | changeset: 1702:e91332ff3a6a | | user: hecht | | date: Sat Aug 08 10:53:20 2009 +0200 | | summary: correct mesh.edp example for new mesh inquiring | | o | changeset: 1701:eeab886b46aa | | user: hecht | | date: Fri Aug 07 22:40:17 2009 +0200 | | summary: add tools to inquire boudnary directly in freefem++ | | o | changeset: 1700:24983130c3d7 | | user: morice | | date: Sun Aug 02 14:50:37 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1699:2a03691fde42 | | user: morice | | date: Thu Jul 30 12:55:18 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1698:77cc1c512479 | | user: morice | | date: Thu Jul 30 07:42:48 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1697:6f77234eaec3 | | user: morice | | date: Tue Jul 28 14:42:14 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1696:2682e3a39f4d | | user: morice | | date: Tue Jul 28 14:40:47 2009 +0200 | | summary: :q | | o | changeset: 1695:80772719f92e | | user: hecht | | date: Thu Jul 23 12:29:10 2009 +0200 | | summary: add un first example .. | | o | changeset: 1694:439fb84bb0eb | | user: hecht | | date: Thu Jul 23 12:17:04 2009 +0200 | | summary: rewrite of mpi version ... | | o | changeset: 1693:a7a22582cfb4 | | user: hecht | | date: Wed Jul 22 22:41:32 2009 +0200 | | summary: retore good version | | o | changeset: 1692:b15405b6bd05 | | user: hecht | | date: Wed Jul 22 11:30:29 2009 +0200 | | summary: correct INNOTION | | o | changeset: 1691:82f9057773f4 | | user: hecht | | date: Wed Jul 22 11:28:16 2009 +0200 | | summary: add plot of array of meshes and array of finite element function. | | o | changeset: 1690:8acf1467c8c9 | | user: hecht | | date: Mon Jul 20 22:30:52 2009 +0200 | | summary: go to version 3.4-1 | | o | changeset: 1689:6fcd68db92d1 | | user: hecht | | date: Mon Jul 20 18:23:45 2009 +0200 | | summary: cosmetic in ffglut | | o | changeset: 1688:d3b315513ffe | | user: hecht | | date: Mon Jul 20 18:12:06 2009 +0200 | | summary: update ffglut | | o | changeset: 1687:5505e8ebf028 | | user: hecht | | date: Fri Jul 10 11:02:37 2009 +0200 | | summary: correct load.link.in or un test | | o | changeset: 1686:ae67b591599d | | user: hecht | | date: Fri Jul 10 10:53:56 2009 +0200 | | summary: coorect ff-c++ on win3é | | o | changeset: 1685:f384c5351ff5 | | user: hecht | | date: Fri Jul 10 10:19:05 2009 +0200 | | summary: correct ff-c++ of windows case and cygwin | | o | changeset: 1684:321b323db9a5 | | user: hecht | | date: Fri Jul 10 09:36:21 2009 +0200 | | summary: add BEM.epd and launchff.cpp ( a wrapper for windows) | | o | changeset: 1683:d2dee6881044 | | user: hecht | | date: Thu Jul 09 18:31:39 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1682:b4e586ac5a72 | | user: hecht | | date: Thu Jul 09 17:50:43 2009 +0200 | | summary: add -wait parameter for window launchff++ wrapper | | o | changeset: 1681:38744c349358 | | user: hecht | | date: Thu Jul 09 17:49:50 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1680:c75e3e2fa17e | | user: morice | | date: Wed Jul 08 17:58:43 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1679:807c14a16f98 | | user: morice | | date: Wed Jul 08 17:22:08 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1678:05f5547c5d1d | | user: morice | | date: Wed Jul 08 16:55:41 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1677:1e5e278eedaa | | user: morice | | date: Wed Jul 08 14:36:26 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1676:8d2f6a01f018 | | user: hecht | | date: Tue Jul 07 09:07:24 2009 +0200 | | summary: correct mpi version | | o | changeset: 1675:df7b6dab61b1 | | user: hecht | | date: Mon Jul 06 16:33:34 2009 +0200 | | summary: add mpi tools (in test) and correct buyild matrix interplation | | o | changeset: 1674:63f2ef1d3223 | | user: morice | | date: Thu Jul 02 18:11:49 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1673:d0503b06c6db | | user: hecht | | date: Tue Jun 30 21:06:38 2009 +0200 | | summary: correct PlotStream io in case of array with check. | | o | changeset: 1672:9a2c7fd9711d | | user: hecht | | date: Mon Jun 29 18:45:51 2009 +0200 | | summary: change crimon-freefem++.zip in crimson-freefem++.zip | | o | changeset: 1671:68133db4e985 | | user: hecht | | date: Mon Jun 29 16:01:42 2009 +0200 | | summary: p ss to version 3.4 | | o | changeset: 1670:eda4376bbd73 | | user: hecht | | date: Tue Jun 23 18:13:40 2009 +0200 | | summary: change ffglut to bee more safe (version) | | o | changeset: 1669:2c7d0aa50098 | | user: hecht | | date: Thu Jun 18 09:45:06 2009 +0200 | | summary: correct include hpd -> idp | | o | changeset: 1668:1e5e630dddd5 | | user: hecht | | date: Tue Jun 16 14:42:59 2009 +0200 | | summary: coorect bug on window | | o | changeset: 1667:9a28c7cf6052 | | user: morice | | date: Tue Jun 16 11:57:25 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1666:d17316a654b9 | | user: hecht | | date: Tue Jun 16 11:08:06 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1665:e2de216ad22c | | user: hecht | | date: Tue Jun 16 11:07:49 2009 +0200 | | summary: add examples++-3d/lac-leman-v4.msh in the distrib | | o | changeset: 1664:2e25f004c497 | | user: hecht | | date: Tue Jun 16 10:36:46 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1663:c047ea6fb673 | | user: hecht | | date: Tue Jun 16 10:30:42 2009 +0200 | | summary: before the next version | | o | changeset: 1662:2932f81e8687 | | user: hecht | | date: Tue Jun 16 10:25:33 2009 +0200 | | summary: coorect idp file in mortar exemple | | o | changeset: 1661:822b5c8b04a1 | | user: hecht | | date: Mon Jun 15 22:36:55 2009 +0200 | | summary: correct bug in makefile | | o | changeset: 1660:51a37d2faf4a | | user: morice | | date: Mon Jun 15 18:16:49 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1659:bcb8a1242d1b | | user: hecht | | date: Fri Jun 12 23:09:42 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1658:83e491da131a | | user: hecht | | date: Mon Jun 08 13:42:52 2009 +0200 | | summary: do small correct in 2 member: | | o | changeset: 1657:2caaa85b26e3 | | user: morice | | date: Mon Jun 08 12:48:34 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1656:19a76fdcdba5 | | user: morice | | date: Mon Jun 08 12:45:41 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1655:9805b179ac69 | | user: morice | | date: Mon Jun 08 12:35:10 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1654:b33eb490c839 | | user: morice | | date: Mon Jun 08 12:03:12 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1653:45466a37654f | | user: hecht | | date: Mon Jun 08 11:16:23 2009 +0200 | | summary: add Egde03d and RT03d finite element , correct mistake in | | o | changeset: 1652:a3e88f63360c | | user: morice | | date: Fri Jun 05 14:27:05 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1651:e0a2e8d5cfd2 | | user: hecht | | date: Thu Jun 04 12:56:41 2009 +0200 | | summary: to avec good makefiel | | o | changeset: 1650:7c00e01ad51b | | user: hecht | | date: Thu Jun 04 09:58:56 2009 +0200 | | summary: correct Dxwriter tools | | o | changeset: 1649:0ad3748de454 | | user: hecht | | date: Thu Jun 04 09:37:14 2009 +0200 | | summary: add file | | o | changeset: 1648:a1494782af5b | | user: hecht | | date: Thu Jun 04 08:35:49 2009 +0200 | | summary: add RT0 in 3D . 5 first test) | | o | changeset: 1647:88a17753d10d | | user: hecht | | date: Wed Jun 03 23:23:51 2009 +0200 | | summary: try to put RT03d> => correct lot of bug in the finite element (vectoriql) | | o | changeset: 1646:229d1df51b18 | | user: atenekeng | | date: Tue Jun 02 23:40:49 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1645:442c0aac83f2 | | user: atenekeng | | date: Tue Jun 02 23:33:38 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1644:b6bbb2eb44d0 | | user: atenekeng | | date: Tue Jun 02 23:27:30 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1643:0831c6a1027f | | user: atenekeng | | date: Tue Jun 02 23:22:36 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1642:a459d624d2f7 | | user: atenekeng | | date: Tue Jun 02 23:12:44 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1641:fc0bd0023280 | | user: hecht | | date: Tue Jun 02 15:40:01 2009 +0200 | | summary: begin of RT0 in 3D. | | o | changeset: 1640:00f642dd30c1 | | user: hecht | | date: Mon Jun 01 18:29:48 2009 +0200 | | summary: add tool to build surfqce mesh. | | o | changeset: 1639:43b260ee40b7 | | user: hecht | | date: Mon Jun 01 18:28:16 2009 +0200 | | summary: V 3.3-1 1 juin 2009 | | o | changeset: 1638:dbd423d4d000 | | user: hecht | | date: Fri May 29 13:35:03 2009 +0200 | | summary: reove unused files | | o | changeset: 1637:f7079ea8eb23 | | user: hecht | | date: Fri May 29 13:32:54 2009 +0200 | | summary: add change solver problem on return arry and meshes in function. | | o | changeset: 1636:9d7dbf3295c1 | | user: hecht | | date: Thu May 28 18:33:25 2009 +0200 | | summary: begin of clean real array in function. | | o | changeset: 1635:cf621a076ad3 | | user: hecht | | date: Wed May 27 13:56:54 2009 +0200 | | summary: correct convect 3d.. | | o | changeset: 1634:a56bc9158f09 | | user: hecht | | date: Tue May 26 18:05:27 2009 +0200 | | summary: correct -o in find | | o | changeset: 1633:81f69e584dfb | | user: hecht | | date: Tue May 26 15:52:04 2009 +0200 | | summary: correct msh3.hpp and SuperLU.cpp mesh3 volume is 0 some time | | o | changeset: 1632:3c7db6033cce | | user: hecht | | date: Tue May 26 15:17:40 2009 +0200 | | summary: add 3d mas lump quadrature furmula (qfV1, qfV2,qfV5 qfV1lump) | | o | changeset: 1631:7e03dc459f0e | | user: hecht | | date: Mon May 25 11:42:53 2009 +0200 | | summary: version 3.3 | | o | changeset: 1630:ae1868421420 | | user: atenekeng | | date: Mon May 18 02:44:56 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1629:69b580f397be | | user: hecht | | date: Sun May 17 21:02:40 2009 +0200 | | summary: add -fPIC flags on 64 achitecture | | o | changeset: 1628:8ddd25c5ca25 | | user: hecht | | date: Fri May 15 21:02:32 2009 +0200 | | summary: add 3d eigen value tools | | o | changeset: 1627:022e89f77648 | | user: hecht | | date: Wed May 13 16:11:46 2009 +0200 | | summary: correct configure.ac and makefile on window for lapack lib in | | o | changeset: 1626:a97da324c99e | | user: hecht | | date: Wed May 13 13:20:28 2009 +0200 | | summary: put coorect for new sparse matrix intercale | | o | changeset: 1625:c6cb0b28b7bb | | user: hecht | | date: Wed May 13 13:19:09 2009 +0200 | | summary: remove to change in SuperLU.cpp | | o | changeset: 1624:0c1099452f82 | | user: hecht | | date: Wed May 13 13:10:20 2009 +0200 | | summary: put correct | | o | changeset: 1623:70718c5b4084 | | user: hecht | | date: Wed May 13 10:25:44 2009 +0200 | | summary: add oone output | | o | changeset: 1622:eb450d4e51f3 | | user: hecht | | date: Wed May 13 09:46:23 2009 +0200 | | summary: correct the doc (in progress) , coorect the size of text in postscrip driver. | | o | changeset: 1621:8d5c2e7a6033 | | user: hecht | | date: Wed May 13 09:12:05 2009 +0200 | | summary: add fig in doc. | | o | changeset: 1620:8f797289de2b | | user: hecht | | date: Mon May 11 09:05:58 2009 +0200 | | summary: add pgm figure exemple file | | o | changeset: 1619:18f8c66246c7 | | user: hecht | | date: Mon May 11 09:05:29 2009 +0200 | | summary: add tool to read ppm and pgm image file see ppm2rnm.edp example | | o | changeset: 1618:08c9e444113a | | user: hecht | | date: Mon May 11 09:03:08 2009 +0200 | | summary: add tool to set array like in matlab and scilab | | o | changeset: 1617:9a32089d27c6 | | user: hecht | | date: Thu Apr 30 10:07:55 2009 +0200 | | summary: comment change in dump in RNM.hpp | | o | changeset: 1616:af2b47c9eec9 | | user: hecht | | date: Thu Apr 30 09:52:57 2009 +0200 | | summary: add sort of array and in parallel int array | | o | changeset: 1615:d9457f8f8a82 | | user: morice | | date: Wed Apr 29 18:40:30 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1614:d93e87702112 | | user: morice | | date: Wed Apr 29 18:37:15 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1613:58344eff0231 | | user: hecht | | date: Wed Apr 29 09:12:46 2009 +0200 | | summary: add missing file to inv full matrix. | | o | changeset: 1612:492aae1c8104 | | user: hecht | | date: Mon Apr 27 23:30:00 2009 +0200 | | summary: add missing delete | | o | changeset: 1611:22b1da7215e8 | | user: hecht | | date: Mon Apr 27 23:05:26 2009 +0200 | | summary: update iNNOVATIO | | o | changeset: 1610:a0cba860253b | | user: hecht | | date: Mon Apr 27 23:02:34 2009 +0200 | | summary: update innovation | | o | changeset: 1609:4d114f69dcc6 | | user: hecht | | date: Mon Apr 27 21:56:45 2009 +0200 | | summary: add missing files | | o | changeset: 1608:65650e9ec1b0 | | user: hecht | | date: Mon Apr 27 21:55:44 2009 +0200 | | summary: correct example | | o | changeset: 1607:88667b360b31 | | user: hecht | | date: Mon Apr 27 21:24:59 2009 +0200 | | summary: add perodic FESpace in 3d | | o | changeset: 1606:3ef7b85f0698 | | user: morice | | date: Wed Apr 22 18:06:47 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1605:ee777f6df0eb | | user: morice | | date: Wed Apr 22 17:51:29 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1604:2bd5f0930f42 | | user: morice | | date: Wed Apr 22 11:12:30 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1603:edf35a172e75 | | user: morice | | date: Tue Apr 21 16:16:10 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1602:95da9106cc83 | | user: morice | | date: Tue Apr 21 15:33:13 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1601:998fb4969917 | | user: morice | | date: Tue Apr 21 15:29:16 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1600:87657798c2cb | | user: morice | | date: Tue Apr 21 15:09:00 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1599:44156c3a14df | | user: morice | | date: Tue Apr 21 13:51:17 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1598:8e33508e3599 | | user: morice | | date: Tue Apr 21 13:41:11 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1597:664a71a6bf78 | | user: morice | | date: Mon Apr 20 14:07:04 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1596:b875c74a428e | | user: morice | | date: Mon Apr 20 13:17:47 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1595:04341a068ff7 | | user: morice | | date: Mon Apr 20 13:15:51 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1594:d57fa2584133 | | user: morice | | date: Mon Apr 20 13:13:39 2009 +0200 | | summary: *** empty log message *** | | o | changeset: 1593:1bfe35d03d32 | | user: hecht | | date: Fri Apr 17 09:29:40 2009 +0200 | | summary: to be sur | | o | changeset: 1592:10c357445573 | | user: hecht | | date: Fri Apr 17 00:50:42 2009 +0200 | | summary: add dump | | o | changeset: 1591:915380e22bf9 | | user: hecht | | date: Fri Apr 17 00:30:10 2009 +0200 | | summary: gros modif dans la gestion des parameters pour le | | o | changeset: 1590:465673ac5e9d | | user: hecht | | date: Wed Apr 15 19:17:15 2009 +0200 | | summary: correct search of lapack lib | | o | changeset: 1589:9e4275fb2706 | | user: hecht | | date: Wed Apr 15 18:43:46 2009 +0200 | | summary: correct complie of lapack lib with arpack (buildin in macos) | | o | changeset: 1588:f2650d954b5e | | user: hecht | | date: Wed Apr 15 18:21:38 2009 +0200 | | summary: do autoreconf | | o | changeset: 1587:9ee6ee15818c | | user: hecht | | date: Wed Apr 15 18:18:22 2009 +0200 | | summary: coorect --enable-m64 flags compile | | o | changeset: 1586:9c12b436f339 | | user: hecht | | date: Wed Apr 15 18:12:04 2009 +0200 | | summary: correct Makefile-MacOs | | o | changeset: 1585:df486d895352 | | user: hecht | | date: Wed Apr 15 11:15:40 2009 +0200 | | summary: passe to version 3.2 | | o | changeset: 1584:d0e8b898a63e | | user: hecht | | date: Wed Apr 15 11:11:58 2009 +0200 | | summary: do change for 64 bits on macos. | | o | changeset: 1583:b43d23573147 | | user: hecht | | date: Tue Mar 31 13:38:09 2009 +0200 | | summary: add P1b3d | | o | changeset: 1582:79f9321ebe42 | | user: morice | | date: Fri Mar 20 12:18:43 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1581:89bbe7fed648 | | user: morice | | date: Fri Mar 20 11:25:41 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1580:03b88bc9b368 | | user: morice | | date: Tue Mar 17 11:16:44 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1579:5b219bb5581f | | user: morice | | date: Mon Mar 16 18:16:41 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1578:3bd564aa3f9f | | user: hecht | | date: Sat Mar 14 17:27:32 2009 +0100 | | summary: version 3.1-0 | | o | changeset: 1577:76c7acba2b50 | | user: hecht | | date: Sat Mar 14 17:12:15 2009 +0100 | | summary: coorect load.link.in for f77 compile. | | o | changeset: 1576:d1c3f8fd5e7a | | user: morice | | date: Thu Mar 12 14:32:53 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1575:8b3b4532b68d | | user: morice | | date: Thu Mar 12 13:43:36 2009 +0100 | | summary: bug trouver dans Find: | | o | changeset: 1574:142b82fe9837 | | user: morice | | date: Thu Mar 12 13:39:12 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1573:68e386efcdfa | | user: hecht | | date: Mon Mar 09 15:00:18 2009 +0100 | | summary: version 3.1 fist step | | o | changeset: 1572:41dfdbb8dfa0 | | user: hecht | | date: Thu Mar 05 11:17:23 2009 +0100 | | summary: correct INNOVATION and remove print | | o | changeset: 1571:5e26bd093206 | | user: hecht | | date: Wed Mar 04 11:45:32 2009 +0100 | | summary: correct int2d in 3d. (error on transformation face to Tet) | | o | changeset: 1570:ae36727a4ce3 | | user: hecht | | date: Mon Mar 02 14:52:15 2009 +0100 | | summary: make version 3.0-6 | | o | changeset: 1569:758a2e0f2057 | | user: hecht | | date: Thu Feb 12 16:19:41 2009 +0100 | | summary: correct bmo and extra dump | | o | changeset: 1568:13d77a1f83c3 | | user: hecht | | date: Thu Feb 12 09:04:47 2009 +0100 | | summary: version 3.0-6 | | o | changeset: 1567:3537e6e5bd56 | | user: hecht | | date: Thu Feb 12 08:47:20 2009 +0100 | | summary: add required edges in adaptmesh tools. | | o | changeset: 1566:0a7a4da722d6 | | user: hecht | | date: Wed Feb 11 16:12:09 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1565:06a842864cd3 | | user: hecht | | date: Wed Feb 11 16:11:22 2009 +0100 | | summary: add code for lock boundary mesh in adapt process. for JYU ... | | o | changeset: 1564:ef831f851c3e | | user: hecht | | date: Wed Feb 11 13:36:20 2009 +0100 | | summary: add option -nowait for windows. | | o | changeset: 1563:8e8c47f158db | | user: hecht | | date: Mon Feb 09 09:41:57 2009 +0100 | | summary: add 3d color .... | | o | changeset: 1562:9ef4b48c94e5 | | user: hecht | | date: Fri Feb 06 11:15:24 2009 +0100 | | summary: correct missing tapping | | o | changeset: 1561:b1047bd598d2 | | user: hecht | | date: Fri Feb 06 10:50:16 2009 +0100 | | summary: add a first plot of 3d data witj plot tools. | | o | changeset: 1560:ff43f245e2f3 | | user: hecht | | date: Thu Feb 05 16:29:09 2009 +0100 | | summary: add new file for tet siplit. | | o | changeset: 1559:1498e333f6d9 | | user: morice | | date: Tue Feb 03 17:45:55 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1558:b70b991cd78c | | user: morice | | date: Tue Feb 03 15:09:59 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1557:b6672aa52178 | | user: morice | | date: Tue Feb 03 15:03:02 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1556:e3dd766cd68b | | user: hecht | | date: Tue Jan 27 16:11:43 2009 +0100 | | summary: remove last change (bogus) | | o | changeset: 1555:4c5377a65671 | | user: hecht | | date: Tue Jan 27 16:09:04 2009 +0100 | | summary: correct dy(uh) when uh is P13d. (always 0) | | o | changeset: 1554:ca9caabbe3bc | | user: morice | | date: Fri Jan 23 16:14:30 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1553:018249cdee99 | | user: morice | | date: Fri Jan 23 16:13:24 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1552:3db53e497a18 | | user: hecht | | date: Wed Jan 21 11:04:10 2009 +0100 | | summary: correct bin-win32 install exe | | o | changeset: 1551:7a0f31302d16 | | user: hecht | | date: Wed Jan 21 10:56:45 2009 +0100 | | summary: correct install bin-win32 | | o | changeset: 1550:91eefe9e3612 | | user: hecht | | date: Wed Jan 21 10:13:06 2009 +0100 | | summary: remove crazy file | | o | changeset: 1549:b6835240f938 | | user: hecht | | date: Tue Jan 20 20:56:59 2009 +0100 | | summary: correct the install on under windows / cygwin | | o | changeset: 1548:ae5d95f70891 | | user: hecht | | date: Sun Jan 18 19:25:03 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1547:c5083029fcff | | user: hecht | | date: Sun Jan 18 17:21:33 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1546:9dc587c45dff | | user: hecht | | date: Fri Jan 16 23:02:59 2009 +0100 | | summary: correct ffglut.cpp | | o | changeset: 1545:a0e928ee7675 | | user: morice | | date: Fri Jan 16 11:38:05 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1544:2ccf8785babb | | user: morice | | date: Fri Jan 16 10:54:55 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1543:6d0a2e03c885 | | user: morice | | date: Fri Jan 16 10:53:39 2009 +0100 | | summary: ajout de savesurfacemesh | | o | changeset: 1542:dfed132f264e | | user: hecht | | date: Thu Jan 15 12:45:37 2009 +0100 | | summary: pass to version 3.0-5, correct array of 3d finite element function | | o | changeset: 1541:bb42989cee29 | | user: hecht | | date: Mon Jan 12 00:12:58 2009 +0100 | | summary: add dx witer and test salalo80@gmail.com | | o | changeset: 1540:350a96823dc1 | | user: hecht | | date: Sat Jan 10 22:26:33 2009 +0100 | | summary: pass to version 3.0-5 | | o | changeset: 1539:0bac5193dd77 | | user: morice | | date: Thu Jan 08 10:41:21 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1538:bb5d8553df2c | | user: hecht | | date: Wed Jan 07 17:21:59 2009 +0100 | | summary: add new comment file | | o | changeset: 1537:e6bc0b8eb690 | | user: morice | | date: Wed Jan 07 12:00:25 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1536:bbe299dedeb9 | | user: hecht | | date: Wed Jan 07 09:55:41 2009 +0100 | | summary: correct window message in ffglut | | o | changeset: 1535:df5a030a7a05 | | user: hecht | | date: Wed Jan 07 08:48:03 2009 +0100 | | summary: correct 3d view setting | | o | changeset: 1534:172df02611b6 | | user: hecht | | date: Tue Jan 06 23:22:29 2009 +0100 | | summary: coorect Pvue3 | | o | changeset: 1533:76f34874cc73 | | user: hecht | | date: Tue Jan 06 23:15:13 2009 +0100 | | summary: add 3d plot | | o | changeset: 1532:0f8e1829074d | | user: hecht | | date: Tue Jan 06 20:30:40 2009 +0100 | | summary: correct | | o | changeset: 1531:5f9834701ea2 | | user: morice | | date: Tue Jan 06 14:14:35 2009 +0100 | | summary: *** empty log message *** | | o | changeset: 1530:2a6f1aec0d48 | | user: hecht | | date: Mon Jan 05 18:20:15 2009 +0100 | | summary: correct download/tetgen/Makefile more portable | | o | changeset: 1529:52ee5604e8c2 | | user: hecht | | date: Mon Jan 05 13:26:47 2009 +0100 | | summary: correct int2d in 3d, makefiles fo tetgen and pb with $(DESTDIR) | | o | changeset: 1528:7356da4183b8 | | user: hecht | | date: Mon Jan 05 11:26:43 2009 +0100 | | summary: add test | | o | changeset: 1527:2251f3d08b88 | | user: hecht | | date: Mon Jan 05 11:25:30 2009 +0100 | | summary: correct in2d in 3d (missing factor 0.5) | | o | changeset: 1526:2d4a22506f73 | | user: hecht | | date: Mon Dec 29 17:34:56 2008 +0100 | | summary: coorect the seach of the include dir | | o | changeset: 1525:c67a5f5b9730 | | user: hecht | | date: Mon Dec 29 17:18:03 2008 +0100 | | summary: remove the clean routine variable after return, to much trouble. | | o | changeset: 1524:a52a4003e09e | | user: hecht | | date: Sat Dec 27 18:27:41 2008 +0100 | | summary: coorect Laplace3d.edp plot with medit | | o | changeset: 1523:f0769f2c0b6a | | user: hecht | | date: Sat Dec 27 18:27:18 2008 +0100 | | summary: correct medit.cpp | | o | changeset: 1522:5b65b33be28d | | user: hecht | | date: Sat Dec 27 17:19:34 2008 +0100 | | summary: update INNOVATION | | o | changeset: 1521:0863f21fe19f | | user: hecht | | date: Sat Dec 27 17:15:45 2008 +0100 | | summary: do pretty print correction | | o | changeset: 1520:9730a238b680 | | user: hecht | | date: Sat Dec 27 16:48:58 2008 +0100 | | summary: coorect old bug when return of arry | | o | changeset: 1519:35ab771c1a8b | | user: hecht | | date: Fri Dec 26 22:50:23 2008 +0100 | | summary: correct makefile for dist install (change install-sh script) | | o | changeset: 1518:ec10c2fe4fe9 | | user: hecht | | date: Fri Dec 26 20:31:46 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1517:6896f3fcf127 | | user: hecht | | date: Fri Dec 26 17:38:24 2008 +0100 | | summary: correct serialeze mesh in 64 mode | | o | changeset: 1516:7d5c2a818d42 | | user: hecht | | date: Fri Dec 26 17:32:10 2008 +0100 | | summary: correct serial in 64 bits mode | | o | changeset: 1515:5d564e4fe7c2 | | user: hecht | | date: Fri Dec 26 17:23:18 2008 +0100 | | summary: try to correct | | o | changeset: 1514:2d379f3e299d | | user: hecht | | date: Fri Dec 26 17:07:27 2008 +0100 | | summary: correct write string | | o | changeset: 1513:ae9e13d7244a | | user: hecht | | date: Fri Dec 26 17:06:12 2008 +0100 | | summary: correct write / read string | | o | changeset: 1512:86738eb65d94 | | user: hecht | | date: Fri Dec 26 16:51:33 2008 +0100 | | summary: correct Serialize Mesh chang long in long long | | o | changeset: 1511:09a0e9e181ef | | user: hecht | | date: Fri Dec 26 16:23:31 2008 +0100 | | summary: correct build of ff-c++ in src/bin-win32/Makefile.am | | o | changeset: 1510:736a461db53e | | user: hecht | | date: Fri Dec 26 16:06:40 2008 +0100 | | summary: now load.lik is bliud from Makefile and load.link.in | | o | changeset: 1509:28dbac93aec5 | | user: hecht | | date: Fri Dec 26 16:01:48 2008 +0100 | | summary: correct graphics of curve | | o | changeset: 1508:cb901fc6fca0 | | user: hecht | | date: Thu Dec 18 10:01:05 2008 +0100 | | summary: correct Makefile and graphoc stuff | | o | changeset: 1507:0407685463a7 | | user: hecht | | date: Wed Dec 17 23:52:44 2008 +0100 | | summary: correct ffglut for zooming y -> y-height ???? | | o | changeset: 1506:503c8ccb098a | | user: hecht | | date: Tue Dec 16 23:04:47 2008 +0100 | | summary: coorect makefile for install | | o | changeset: 1505:10afda2c8acd | | user: hecht | | date: Tue Dec 16 20:26:47 2008 +0100 | | summary: add UMPAck solver | | o | changeset: 1504:20c5e5ffc8c4 | | user: hecht | | date: Tue Dec 16 20:24:46 2008 +0100 | | summary: change the umpack matrice solver | | o | changeset: 1503:26bc830cccc5 | | user: hecht | | date: Tue Dec 16 17:48:59 2008 +0100 | | summary: correct makefiles | | o | changeset: 1502:9a693aa2371a | | user: morice | | date: Tue Dec 16 12:07:56 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1501:93ed40d6a6e6 | | user: hecht | | date: Fri Dec 12 15:30:04 2008 +0100 | | summary: change ../statu.... in.statu (for install on macos) | | o | changeset: 1500:aca91a335b08 | | user: hecht | | date: Fri Dec 12 15:18:03 2008 +0100 | | summary: correct configure?ac of ubutu build package | | o | changeset: 1499:27e5aef742b2 | | user: hecht | | date: Fri Dec 12 15:16:22 2008 +0100 | | summary: correct missunderstanding of usage of strchr ( return 0 if the search fail). | | o | changeset: 1498:7299590b0a3c | | user: hecht | | date: Fri Dec 12 13:42:50 2008 +0100 | | summary: correct the arpach driver , (pas mal.. FH) | | o | changeset: 1497:84171470d151 | | user: hecht | | date: Fri Dec 12 00:30:14 2008 +0100 | | summary: add the mode in eignevalue like in arpack | | o | changeset: 1496:7d7daf75c3ac | | user: hecht | | date: Wed Dec 10 10:31:24 2008 +0100 | | summary: last chnage before version 3.0-2 | | o | changeset: 1495:fe9d0abe1c54 | | user: hecht | | date: Wed Dec 10 10:21:01 2008 +0100 | | summary: coorect for win32 | | o | changeset: 1494:4d73b3a20b0c | | user: hecht | | date: Wed Dec 10 09:47:46 2008 +0100 | | summary: correct conflict with basename (-> baseName) | | o | changeset: 1493:0f58bb952ae8 | | user: hecht | | date: Wed Dec 10 08:45:20 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1492:ca8c350f70e4 | | user: hecht | | date: Wed Dec 10 08:37:56 2008 +0100 | | summary: add ff++.hpp include file to simplify life. | | o | changeset: 1491:5101e82dafe6 | | user: hecht | | date: Wed Dec 10 00:22:58 2008 +0100 | | summary: correct miss * in pointer | | o | changeset: 1490:a673c97e0d53 | | user: hecht | | date: Tue Dec 09 23:56:09 2008 +0100 | | summary: coorect stuff for loadpath on macos. | | o | changeset: 1489:8ec039547530 | | user: hecht | | date: Tue Dec 09 18:09:20 2008 +0100 | | summary: coorect install on macos | | o | changeset: 1488:a7374bf14c69 | | user: hecht | | date: Tue Dec 09 17:03:50 2008 +0100 | | summary: change == in = miss tapping | | o | changeset: 1487:e45dff48bbd8 | | user: hecht | | date: Tue Dec 09 16:59:37 2008 +0100 | | summary: coorect include dir for install | | o | changeset: 1486:3402eeb91b14 | | user: hecht | | date: Tue Dec 09 16:43:38 2008 +0100 | | summary: stablization of install process | | o | changeset: 1485:357c63d481f1 | | user: hecht | | date: Tue Dec 09 16:24:58 2008 +0100 | | summary: correct on windows to build file in local dir | | o | changeset: 1484:1d6688c93330 | | user: morice | | date: Tue Dec 09 16:06:48 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1483:beb24a04490c | | user: hecht | | date: Tue Dec 09 15:05:48 2008 +0100 | | summary: next | | o | changeset: 1482:77eb855e58a3 | | user: hecht | | date: Tue Dec 09 15:03:46 2008 +0100 | | summary: correct binary read on stdin with medit. | | o | changeset: 1481:d7db611022fb | | user: hecht | | date: Mon Dec 08 22:55:47 2008 +0100 | | summary: coorect makefile remove dependance with ff-c++ | | o | changeset: 1480:be591602d2fe | | user: hecht | | date: Mon Dec 08 22:17:14 2008 +0100 | | summary: corect pb when plot of const function | | o | changeset: 1479:51ae281c82c2 | | user: hecht | | date: Mon Dec 08 22:02:19 2008 +0100 | | summary: corret freefem++ args -fglut trap du to mistake in getprog-unix.hpp | | o | changeset: 1478:5adb19ceadd5 | | user: hecht | | date: Mon Dec 08 16:23:50 2008 +0100 | | summary: correct install dir of freefem++ include, load file. | | o | changeset: 1477:7cc876365ccc | | user: hecht | | date: Sun Dec 07 23:54:44 2008 +0100 | | summary: pass tversion 3.0-2 | | o | changeset: 1476:8f0c0241434e | | user: hecht | | date: Sun Dec 07 23:52:08 2008 +0100 | | summary: coorect win32 end of prog add a wiat et save the logs | | o | changeset: 1475:deeabce583a3 | | user: hecht | | date: Sun Dec 07 23:04:26 2008 +0100 | | summary: cooret of save window console??? | | o | changeset: 1474:7a964fb9cc9f | | user: hecht | | date: Sun Dec 07 22:51:31 2008 +0100 | | summary: coorect end freefem, try to save consle text | | o | changeset: 1473:94e5bfadd2e9 | | user: hecht | | date: Sat Dec 06 23:24:37 2008 +0100 | | summary: coorect window version add save console at end job | | o | changeset: 1472:b072e947c473 | | user: hecht | | date: Thu Dec 04 23:31:41 2008 +0100 | | summary: coorect 3d exampel | | o | changeset: 1471:cfe19aab6e91 | | user: hecht | | date: Thu Dec 04 23:07:04 2008 +0100 | | summary: change medit in ffmedit (the freefem++ version of medit) | | o | changeset: 1470:e3003c8118ec | | user: hecht | | date: Thu Dec 04 22:08:28 2008 +0100 | | summary: correct .. | | o | changeset: 1469:94c6f5128de0 | | user: hecht | | date: Thu Dec 04 21:55:00 2008 +0100 | | summary: add BLASLIB on SuperLu link | | o | changeset: 1468:8296e5850e9b | | user: hecht | | date: Thu Dec 04 21:28:48 2008 +0100 | | summary: add no compile on pure win32 | | o | changeset: 1467:2ba1cc1df0ce | | user: hecht | | date: Thu Dec 04 18:13:09 2008 +0100 | | summary: coorect Makefile | | o | changeset: 1466:beadf0e06de0 | | user: hecht | | date: Thu Dec 04 18:07:41 2008 +0100 | | summary: correct Makefile | | o | changeset: 1465:338221666d53 | | user: hecht | | date: Thu Dec 04 17:49:24 2008 +0100 | | summary: coorect makefile | | o | changeset: 1464:7b0eb03791c7 | | user: hecht | | date: Thu Dec 04 17:35:58 2008 +0100 | | summary: correct pb unzip | | o | changeset: 1463:604e870e1a68 | | user: hecht | | date: Thu Dec 04 17:31:14 2008 +0100 | | summary: coorect Makefile for window | | o | changeset: 1462:e78f4ba9d558 | | user: hecht | | date: Thu Dec 04 16:19:27 2008 +0100 | | summary: correct Install-MacOS v3 | | o | changeset: 1461:16b7e168e0af | | user: hecht | | date: Thu Dec 04 16:14:18 2008 +0100 | | summary: correct of v3 | | o | changeset: 1460:719b338b6647 | | user: hecht | | date: Wed Dec 03 23:39:47 2008 +0100 | | summary: correct makefile for load compilation | | o | changeset: 1459:1078ad4956af | | user: hecht | | date: Tue Dec 02 11:19:25 2008 +0100 | | summary: correct build medit (compit.date) | | o | changeset: 1458:5ff7097a0422 | | user: hecht | | date: Mon Dec 01 22:14:26 2008 +0100 | | summary: correct ffglut.cpp | | o | changeset: 1457:275696a1143d | | user: hecht | | date: Sun Nov 30 22:01:37 2008 +0100 | | summary: change SuperLU.cpp -> SuperLu.cpp | | o | changeset: 1456:60ee6e9fa734 | | user: hecht | | date: Sun Nov 30 22:00:31 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1455:4638f02095af | | user: hecht | | date: Sun Nov 30 21:43:24 2008 +0100 | | summary: correct bmo.cpp on cygwin | | o | changeset: 1454:5680cb4fc599 | | user: hecht | | date: Sun Nov 30 21:26:42 2008 +0100 | | summary: correct bmo rand generator for win32 | | o | changeset: 1453:b813c4de5ff9 | | user: hecht | | date: Sat Nov 29 22:38:28 2008 +0100 | | summary: change rindex -> strrchr under win32 | | o | changeset: 1452:62b7a73e0883 | | user: hecht | | date: Sat Nov 29 21:49:18 2008 +0100 | | summary: correct the doc | | o | changeset: 1451:3cedfc02647b | | user: hecht | | date: Sat Nov 29 21:45:16 2008 +0100 | | summary: Upgrade the doc | | o | changeset: 1450:0f2d69e72651 | | user: hecht | | date: Sat Nov 29 19:20:30 2008 +0100 | | summary: add | | o | changeset: 1449:f9d27572c59e | | user: hecht | | date: Sat Nov 29 19:14:43 2008 +0100 | | summary: add configure --disable-dependency-tracking for universal build (macos) | | o | changeset: 1448:5972ee9487be | | user: hecht | | date: Sat Nov 29 19:02:26 2008 +0100 | | summary: ok a not to bad version | | o | changeset: 1447:feed975f6576 | | user: hecht | | date: Sat Nov 29 18:24:07 2008 +0100 | | summary: correct load facily (test if multy load, and load only one time) | | o | changeset: 1446:3880a683b418 | | user: hecht | | date: Sat Nov 29 18:17:37 2008 +0100 | | summary: correct load example | | o | changeset: 1445:c4c1e3ee80a3 | | user: hecht | | date: Sat Nov 29 17:39:46 2008 +0100 | | summary: change bmo.cpp -> lgbmo.cpp | | o | changeset: 1444:ae1862b180e5 | | user: hecht | | date: Sat Nov 29 17:34:17 2008 +0100 | | summary: add bmo stuff) | | o | changeset: 1443:2607ddbf9df2 | | user: hecht | | date: Sat Nov 29 16:47:49 2008 +0100 | | summary: remove medit lauching when no graphic | | o | changeset: 1442:7ff31fce3f84 | | user: hecht | | date: Sat Nov 29 16:36:48 2008 +0100 | | summary: recorrect | | o | changeset: 1441:bb346316ad4a | | user: hecht | | date: Sat Nov 29 16:32:00 2008 +0100 | | summary: rebuld regtests.edp | | o | changeset: 1440:c10cf4df8949 | | user: hecht | | date: Sat Nov 29 16:25:31 2008 +0100 | | summary: remove glumesh.edp form regtest | | o | changeset: 1439:d0f1c7e9c376 | | user: hecht | | date: Sat Nov 29 16:05:24 2008 +0100 | | summary: do graphic only on mpirank==0 | | o | changeset: 1438:eee4429533f7 | | user: hecht | | date: Sat Nov 29 15:58:42 2008 +0100 | | summary: correct bug in eigenvalue part. | | o | changeset: 1437:0a0f8d8930f9 | | user: morice | | date: Fri Nov 28 12:12:32 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1436:e4c7ffca9ab1 | | user: morice | | date: Fri Nov 28 12:11:03 2008 +0100 | | summary: Transformation Matrice Morse (stockage ligne) en CCS(compressed column storage) | | o | changeset: 1435:45be17df8622 | | user: morice | | date: Fri Nov 28 11:43:19 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1434:fd52925b5f2a | | user: hecht | | date: Fri Nov 28 10:17:32 2008 +0100 | | summary: miss tappin SuperLU.cpp -> SuperLu.cpp | | o | changeset: 1433:acf7ea000d8a | | user: hecht | | date: Fri Nov 28 08:09:14 2008 +0100 | | summary: correct 3d exemples | | o | changeset: 1432:b0289a360bb3 | | user: hecht | | date: Wed Nov 26 20:17:04 2008 +0100 | | summary: correct tetgen | | o | changeset: 1431:ba4c8e8b1a47 | | user: hecht | | date: Wed Nov 26 19:51:10 2008 +0100 | | summary: correct missing link pb (tetgen.cpp include msh3.cpp with out int. | | o | changeset: 1430:d973280bc7af | | user: morice | | date: Wed Nov 26 16:26:31 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1429:5f00f74d83cd | | user: hecht | | date: Tue Nov 25 23:03:41 2008 +0100 | | summary: a last touch before the version... | | o | changeset: 1428:198f6558aa4d | | user: hecht | | date: Tue Nov 25 21:41:51 2008 +0100 | | summary: correct auto compilation of ffw3, superlu, tetgen in cas au enable-download | | o | changeset: 1427:f0e86c3e6d85 | | user: hecht | | date: Tue Nov 25 18:38:00 2008 +0100 | | summary: coorect script for freefem++ app | | o | changeset: 1426:9b1df463725b | | user: hecht | | date: Tue Nov 25 18:22:54 2008 +0100 | | summary: coorect install macos | | o | changeset: 1425:3c52c2253fb7 | | user: hecht | | date: Tue Nov 25 17:27:14 2008 +0100 | | summary: try to finalise version 3.0-1 | | o | changeset: 1424:6d9de1c4a05d | | user: hecht | | date: Tue Nov 25 17:09:49 2008 +0100 | | summary: next | | o | changeset: 1423:42713d97f36f | | user: hecht | | date: Tue Nov 25 16:49:48 2008 +0100 | | summary: correct load examples change popoe.cpp in medit.cpp | | o | changeset: 1422:779acd0cfbe2 | | user: hecht | | date: Tue Nov 25 14:16:39 2008 +0100 | | summary: add missing file | | o | changeset: 1421:e70b14304b98 | | user: hecht | | date: Tue Nov 25 01:05:08 2008 +0100 | | summary: coorect mistake in use of ffglut (remove if FreeFem++-xxx ) | | o | changeset: 1420:0d19f82c7039 | | user: hecht | | date: Mon Nov 24 23:18:25 2008 +0100 | | summary: add stuff to save window buff. | | o | changeset: 1419:f9ae484334fc | | user: hecht | | date: Mon Nov 24 22:46:20 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1418:9650773d46e0 | | user: hecht | | date: Mon Nov 24 21:31:56 2008 +0100 | | summary: correct layer.edp | | o | changeset: 1417:ec0d0e8459b0 | | user: hecht | | date: Mon Nov 24 20:49:58 2008 +0100 | | summary: coorect glumesh2d load (now in freefem++) | | o | changeset: 1416:d4c3c0aa5fd8 | | user: hecht | | date: Mon Nov 24 20:20:15 2008 +0100 | | summary: update to 3.0_1 testing | | o | changeset: 1415:a29e50390efd | | user: hecht | | date: Mon Nov 24 20:10:17 2008 +0100 | | summary: past to version 3.0-1 | | o | changeset: 1414:8ffccb723fd7 | | user: hecht | | date: Mon Nov 24 17:22:44 2008 +0100 | | summary: correct FreeFem++ | | o | changeset: 1413:cb84d704cd68 | | user: hecht | | date: Mon Nov 24 17:08:38 2008 +0100 | | summary: correct of missing io | | o | changeset: 1412:ca6fdf19f43a | | user: hecht | | date: Mon Nov 24 14:47:12 2008 +0100 | | summary: coorec tmiss tapping | | o | changeset: 1411:bf601c202065 | | user: hecht | | date: Mon Nov 24 14:45:02 2008 +0100 | | summary: add window stuff | | o | changeset: 1410:069a9f4b35f8 | | user: hecht | | date: Mon Nov 24 14:22:26 2008 +0100 | | summary: correct sing flags with PCrgraph.cpp | | o | changeset: 1409:2eff1dc91fa8 | | user: hecht | | date: Mon Nov 24 13:58:45 2008 +0100 | | summary: correct miss tapping | | o | changeset: 1408:567bb820c141 | | user: hecht | | date: Mon Nov 24 13:44:40 2008 +0100 | | summary: add @LIBSNOCONSOLE@ to link freefem++ on windows | | o | changeset: 1407:a592c340fa42 | | user: hecht | | date: Mon Nov 24 10:15:57 2008 +0100 | | summary: yntaxe err. )) -> ) line 51 | | o | changeset: 1406:9456f62f1675 | | user: hecht | | date: Mon Nov 24 10:09:54 2008 +0100 | | summary: do the final (may be ) on no graphics | | o | changeset: 1405:d33cd9480a19 | | user: hecht | | date: Sun Nov 23 23:24:42 2008 +0100 | | summary: remove -mwindows flag | | o | changeset: 1404:92d820fc3689 | | user: hecht | | date: Sun Nov 23 22:56:24 2008 +0100 | | summary: try to have good version of ffglut | | o | changeset: 1403:fd3446efd662 | | user: hecht | | date: Sun Nov 23 22:23:51 2008 +0100 | | summary: correct for win32 api | | o | changeset: 1402:cd1e9c3a65f2 | | user: hecht | | date: Sun Nov 23 16:40:45 2008 +0100 | | summary: crrech ff_glut lib under win32 | | o | changeset: 1401:eaf758e3a489 | | user: hecht | | date: Sun Nov 23 16:32:33 2008 +0100 | | summary: change glut libs under win32 (no cygwin) | | o | changeset: 1400:854085e2d35f | | user: hecht | | date: Sun Nov 23 16:21:00 2008 +0100 | | summary: add new file for win32 comile | | o | changeset: 1399:95336c8e2c44 | | user: hecht | | date: Sun Nov 23 15:36:58 2008 +0100 | | summary: update for ffglu and windows | | o | changeset: 1398:f9100b0bb790 | | user: hecht | | date: Sun Nov 23 14:54:49 2008 +0100 | | summary: correct of win32 | | o | changeset: 1397:7d704bab6a59 | | user: hecht | | date: Sun Nov 23 14:53:06 2008 +0100 | | summary: correct PlotStream.hpp for win32 | | o | changeset: 1396:d4bab58e76b7 | | user: hecht | | date: Sun Nov 23 10:11:42 2008 +0100 | | summary: reomve exeption | | o | changeset: 1395:7746ed4b6e53 | | user: hecht | | date: Sat Nov 22 20:29:26 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1394:76b21f8a6f07 | | user: hecht | | date: Sat Nov 22 18:16:09 2008 +0100 | | summary: correct Makefile.am | | o | changeset: 1393:28088ce8937e | | user: hecht | | date: Sat Nov 22 18:15:41 2008 +0100 | | summary: add threads interface of windows | | o | changeset: 1392:302846277f78 | | user: hecht | | date: Thu Nov 20 14:05:20 2008 +0100 | | summary: correct configure.ac fo ffglut compie with pthread | | o | changeset: 1391:04a9b160e8c4 | | user: hecht | | date: Thu Nov 20 13:28:38 2008 +0100 | | summary: correct int -> GLint in wiewport array type | | o | changeset: 1390:5b0dea51e3ac | | user: hecht | | date: Wed Nov 19 14:40:29 2008 +0100 | | summary: crrect build pkg dir | | o | changeset: 1389:0e6bc0a93bdd | | user: hecht | | date: Wed Nov 19 14:38:27 2008 +0100 | | summary: add super bluid lib | | o | changeset: 1388:f4ea619db3e9 | | user: hecht | | date: Wed Nov 19 11:55:19 2008 +0100 | | summary: correct of the download/tetgen/Makefile makefile. | | o | changeset: 1387:3b6ce28f34f8 | | user: hecht | | date: Tue Nov 18 17:38:31 2008 +0100 | | summary: add missig file | | o | changeset: 1386:08adb5c34633 | | user: hecht | | date: Sun Nov 16 16:40:00 2008 +0100 | | summary: try to put all download in same directory download/pkg | | o | changeset: 1385:0f9c81225b28 | | user: hecht | | date: Sun Nov 16 12:39:46 2008 +0100 | | summary: add package you ubuntu | | o | changeset: 1384:2f8474dc4698 | | user: hecht | | date: Sun Nov 16 11:51:10 2008 +0100 | | summary: correct the sieze of array to store eigen item (add +1) | | o | changeset: 1383:b7546bc2390c | | user: hecht | | date: Sun Nov 16 11:09:58 2008 +0100 | | summary: remove uninitialiez assert. | | o | changeset: 1382:ff78c27246d0 | | user: hecht | | date: Sun Nov 16 10:48:56 2008 +0100 | | summary: coorect libmesh -> libmesh | | o | changeset: 1381:552ace2fcfc7 | | user: hecht | | date: Sun Nov 16 10:23:09 2008 +0100 | | summary: coorect Makefile.am dependence to bluid compil.date | | o | changeset: 1380:0caf8178753d | | user: hecht | | date: Sun Nov 16 10:02:05 2008 +0100 | | summary: correct ffmedit Makefile.am missing bluid of ompil.date file | | o | changeset: 1379:4e8f7f89556a | | user: hecht | | date: Sun Nov 16 09:43:24 2008 +0100 | | summary: correct srv/nw/Makefile.am | | o | changeset: 1378:9516426752a3 | | user: hecht | | date: Sun Nov 16 09:33:36 2008 +0100 | | summary: add missing file | | o | changeset: 1377:93b754159849 | | user: hecht | | date: Sun Nov 16 01:06:32 2008 +0100 | | summary: Huge change in the graphic part. | | o | changeset: 1376:9f86824cee2c | | user: morice | | date: Thu Nov 13 16:43:39 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1375:1589ecf1c4b7 | | user: morice | | date: Thu Nov 13 16:40:04 2008 +0100 | | summary: Removed file | | o | changeset: 1374:32d14aaa8bc1 | | user: morice | | date: Wed Nov 05 11:15:23 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1373:0781509f872e | | user: morice | | date: Tue Nov 04 17:18:35 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1372:1faebc041661 | | user: morice | | date: Tue Nov 04 17:16:50 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1371:cf940b88989d | | user: morice | | date: Thu Oct 30 11:38:03 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1370:472ebd5510b3 | | user: morice | | date: Thu Oct 30 11:29:15 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1369:884b6e24b73b | | user: morice | | date: Wed Oct 29 16:29:20 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1368:71743a70f477 | | user: morice | | date: Wed Oct 29 15:10:15 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1367:5f666b631f8b | | user: morice | | date: Wed Oct 29 14:12:46 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1366:5ac0c0b60644 | | user: morice | | date: Wed Oct 29 11:24:56 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1365:d236083ebc43 | | user: morice | | date: Wed Oct 29 11:21:03 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1364:85909104f0c6 | | user: morice | | date: Wed Oct 29 11:09:45 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1363:5cb1c4d257fd | | user: morice | | date: Mon Oct 27 10:09:44 2008 +0100 | | summary: *** empty log message *** | | o | changeset: 1362:cf7b0f1fb9da | | user: hecht | | date: Mon Oct 20 22:24:33 2008 +0200 | | summary: add medit to freefem++ | | o | changeset: 1361:41bd8613d841 | | user: hecht | | date: Mon Oct 20 16:11:57 2008 +0200 | | summary: add medit in ff++ | | o | changeset: 1360:6e76013fe786 | | user: hecht | | date: Sun Oct 19 21:59:21 2008 +0200 | | summary: -- correct none sym eigen arpack call | | o | changeset: 1359:97fc195ae7e3 | | user: hecht | | date: Fri Oct 17 10:44:44 2008 +0200 | | summary: coorect memory misstake in profile matrix. | | o | changeset: 1358:182ef0dd29d7 | | user: hecht | | date: Thu Oct 16 23:10:19 2008 +0200 | | summary: correct memory problem with valgrind. | | o | changeset: 1357:fceafcd3c68a | | user: hecht | | date: Mon Oct 13 15:58:25 2008 +0200 | | summary: correct low of precision of geom | | o | changeset: 1356:a98d4ac7e0c7 | | user: hecht | | date: Mon Oct 06 16:59:07 2008 +0200 | | summary: load in correct .edp | | o | changeset: 1355:4de09c7ef69d | | user: hecht | | date: Mon Oct 06 10:04:30 2008 +0200 | | summary: correct 3d. convert | | o | changeset: 1354:6fb475c41e45 | | user: hecht | | date: Mon Oct 06 09:28:36 2008 +0200 | | summary: correct convect 3D | | o | changeset: 1353:a31edb97daea | | user: hecht | | date: Mon Oct 06 09:26:17 2008 +0200 | | summary: correct convect in 3D. | | o | changeset: 1352:c17f71265f73 | | user: morice | | date: Thu Sep 25 15:00:32 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1351:e2d0255aa3b7 | | user: morice | | date: Thu Sep 25 14:55:41 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1350:6bad008adbfd | | user: morice | | date: Thu Sep 18 11:31:12 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1349:fcdbf4222941 | | user: morice | | date: Thu Sep 18 11:24:59 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1348:f577647a6ef8 | | user: hecht | | date: Wed Sep 17 18:25:19 2008 +0200 | | summary: correct PB on win32 version with P102_1.o (bogus) so remve because not used. | | o | changeset: 1347:e94555467e80 | | user: hecht | | date: Thu Sep 04 13:18:21 2008 +0200 | | summary: add NSI3d-carac.edp | | o | changeset: 1346:fd5ed1df556b | | user: hecht | | date: Wed Aug 27 17:07:31 2008 +0200 | | summary: a fist beta version with 3d convect | | o | changeset: 1345:0e28f1046f82 | | user: hecht | | date: Wed Aug 27 16:13:16 2008 +0200 | | summary: correct in case of more than 2 proc. | | o | changeset: 1344:bc6b22ce6c7d | | user: hecht | | date: Wed Aug 27 15:28:02 2008 +0200 | | summary: cleanning mpi output | | o | changeset: 1343:14964c74521c | | user: hecht | | date: Wed Aug 27 15:18:46 2008 +0200 | | summary: same | | o | changeset: 1342:3101fb2fa5a9 | | user: hecht | | date: Wed Aug 27 15:16:55 2008 +0200 | | summary: improve output of end mpi | | o | changeset: 1341:c9b452184dc3 | | user: hecht | | date: Wed Aug 27 14:50:58 2008 +0200 | | summary: output clening | | o | changeset: 1340:5d9c08ee5b5a | | user: hecht | | date: Wed Aug 27 14:30:24 2008 +0200 | | summary: correct MPI dump | | o | changeset: 1339:761f96cc8fa4 | | user: hecht | | date: Mon Aug 25 16:18:28 2008 +0200 | | summary: add new test | | o | changeset: 1338:96837b9d8490 | | user: hecht | | date: Mon Aug 25 16:01:19 2008 +0200 | | summary: add meditsol.edp test (bugus) | | o | changeset: 1337:631ca7f3b833 | | user: hecht | | date: Mon Aug 25 15:23:45 2008 +0200 | | summary: correct popen.cpp | | o | changeset: 1336:3fae4ab680d1 | | user: hecht | | date: Mon Aug 25 15:00:35 2008 +0200 | | summary: add popen.cpp of medit link | | o | changeset: 1335:9a3735113e93 | | user: hecht | | date: Mon Aug 25 10:57:43 2008 +0200 | | summary: add convect 3D | | o | changeset: 1334:4fd6a0503885 | | user: hecht | | date: Wed Jul 23 23:00:00 2008 +0200 | | summary: a beta version of 3d version | | o | changeset: 1333:634631a624d7 | | user: hecht | | date: Wed Jul 23 22:11:51 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1332:dd46501bfe35 | | user: hecht | | date: Wed Jul 23 22:09:31 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1331:5cadbb291dff | | user: hecht | | date: Wed Jul 23 14:51:56 2008 +0200 | | summary: correct CXXFLAGS for load.link | | o | changeset: 1330:9acc92fffb15 | | user: hecht | | date: Wed Jul 23 14:07:36 2008 +0200 | | summary: coorect algo.edp | | o | changeset: 1329:4f3864fced7f | | user: hecht | | date: Wed Jul 23 14:05:48 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1328:593795622f68 | | user: hecht | | date: Wed Jul 23 13:47:08 2008 +0200 | | summary: add new 3d exemple | | o | changeset: 1327:e396a7e86ddf | | user: hecht | | date: Wed Jul 23 13:03:58 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1326:4101a19ce39b | | user: morice | | date: Wed Jul 23 12:15:13 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1325:8511165a8c1a | | user: morice | | date: Wed Jul 23 12:10:59 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1324:a7fbfb69aff9 | | user: hecht | | date: Mon Jul 07 22:39:14 2008 +0200 | | summary: add big change in pointer cleanning of mesh. | | o | changeset: 1323:c1c144d0c93e | | user: morice | | date: Fri Jun 27 10:45:42 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1322:72d5d48de380 | | user: hecht | | date: Fri Jun 27 10:07:39 2008 +0200 | | summary: remove const char warning | | o | changeset: 1321:0350e3b8531b | | user: hecht | | date: Fri Jun 27 10:00:34 2008 +0200 | | summary: remove tetgen part | | o | changeset: 1320:ae68e0e4759d | | user: hecht | | date: Fri Jun 27 09:51:03 2008 +0200 | | summary: correct FQuadTree construction | | o | changeset: 1319:dacab2664d74 | | user: hecht | | date: Fri Jun 27 09:50:21 2008 +0200 | | summary: add constructeur dans FQuadTree | | o | changeset: 1318:47569a10b553 | | user: hecht | | date: Thu Jun 26 17:46:28 2008 +0200 | | summary: correct RdtoZd fonction | | o | changeset: 1317:b286cadc4463 | | user: morice | | date: Thu Jun 26 16:12:33 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1316:bd0a4bc55b82 | | user: morice | | date: Thu Jun 26 14:18:52 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1315:353f0557aeeb | | user: hecht | | date: Tue Jun 24 13:36:56 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1314:b48bf88426b8 | | user: hecht | | date: Tue Jun 24 11:48:58 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1313:db5f17893fd7 | | user: hecht | | date: Sun Jun 22 20:45:48 2008 +0200 | | summary: remove of cout | | o | changeset: 1312:d807bb0388ff | | user: hecht | | date: Sat Jun 21 14:18:56 2008 +0200 | | summary: add missing logo | | o | changeset: 1311:0f16fe410b58 | | user: hecht | | date: Sat Jun 21 14:17:09 2008 +0200 | | summary: the alpha version. 3.00 | | o | changeset: 1310:f6455cf8648e | | user: hecht | | date: Sat Jun 21 14:05:00 2008 +0200 | | summary: add missing files | | o | changeset: 1309:07e1db73daf0 | | user: morice | | date: Fri Jun 20 16:58:55 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1308:7b7733d0e797 | | user: hecht | | date: Thu Jun 19 23:37:37 2008 +0200 | | summary: add missing files | | o | changeset: 1307:3302a94264c3 | | user: hecht | | date: Thu Jun 19 23:22:54 2008 +0200 | | summary: correct examples++-load/Makefile.am to add dependence to compile glumesh.cpp | | o | changeset: 1306:6edc84e14d53 | | user: hecht | | date: Thu Jun 19 14:21:08 2008 +0200 | | summary: un version pas mal | | o | changeset: 1305:173c659a2f6f | | user: hecht | | date: Wed Jun 18 13:55:36 2008 +0200 | | summary: add true random function | | o | changeset: 1304:3c554295e169 | | user: hecht | | date: Wed Jun 18 11:17:57 2008 +0200 | | summary: coorect error between R2 and R3 stuff. | | o | changeset: 1303:8345c9dcffd8 | | user: hecht | | date: Fri Jun 13 12:01:42 2008 +0200 | | summary: coorect missing patch-lapack in arpack | | o | changeset: 1302:a8e47b3a6ead | | user: hecht | | date: Thu Jun 12 23:30:25 2008 +0200 | | summary: add missing file | | o | changeset: 1301:8419ef4b5ea6 | | user: hecht | | date: Tue Jun 10 22:19:20 2008 +0200 | | summary: remove arpack++ from freefem++ | | o | changeset: 1300:5f7e9ae6121c | | user: hecht | | date: Tue Jun 10 22:17:25 2008 +0200 | | summary: remove arpack++ | | o | changeset: 1299:47c0d89ac233 | | user: hecht | | date: Tue Jun 10 22:15:11 2008 +0200 | | summary: remove arpack++ | | o | changeset: 1298:e2fed9f3b434 | | user: hecht | | date: Mon Jun 09 18:36:48 2008 +0200 | | summary: correction g++ 4.2 | | o | changeset: 1297:cde6b903a078 | | user: hecht | | date: Mon Jun 09 18:36:08 2008 +0200 | | summary: correction of g++ 4.2 | | o | changeset: 1296:dba2f88087e1 | | user: morice | | date: Mon Jun 09 14:32:52 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1295:a38a0a05c591 | | user: morice | | date: Mon Jun 09 14:15:13 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1294:62223cb51036 | | user: hecht | | date: Wed May 28 21:44:49 2008 +0200 | | summary: a correct in FEproduct | | o | changeset: 1293:5725424057d0 | | user: hecht | | date: Wed May 28 17:18:14 2008 +0200 | | summary: remove dump | | o | changeset: 1292:8b52cc829a1e | | user: hecht | | date: Wed May 28 17:16:34 2008 +0200 | | summary: the first 3d version running all test | | o | changeset: 1291:6677a3cb311b | | user: hecht | | date: Mon May 26 17:12:44 2008 +0200 | | summary: add explicit instenciation E_set_fev3 | | o | changeset: 1290:384cb8fc29ec | | user: hecht | | date: Mon May 26 16:59:08 2008 +0200 | | summary: Stokes is working now. | | o | changeset: 1289:44bcfe697314 | | user: hecht | | date: Mon May 26 09:07:56 2008 +0200 | | summary: add STokes in 3d | | o | changeset: 1288:e1870d7093b2 | | user: hecht | | date: Sat May 24 17:05:38 2008 +0200 | | summary: the first Laplace Operator in 3d work in P13d,P23d finite element. | | o | changeset: 1287:0601417c00f0 | | user: hecht | | date: Thu May 22 16:05:13 2008 +0200 | | summary: correct pb in mesure of tet. | | o | changeset: 1286:13797127fc40 | | user: hecht | | date: Wed May 21 12:41:42 2008 +0200 | | summary: correct GTree Case methode | | o | changeset: 1285:25a3f156a803 | | user: morice | | date: Wed May 21 11:05:22 2008 +0200 | | summary: *** empty log message *** | | o | changeset: 1284:12639b380533 | | user: hecht | | date: Tue May 20 22:05:36 2008 +0200 | | summary: pb case sensitive in include | | o | changeset: 1283:264ad3e9df15 | | user: hecht | | date: Tue May 20 16:44:49 2008 +0200 | | summary: modif for layer meshes. | | o | changeset: 1282:eede6e45ca29 | | user: hecht | | date: Tue May 20 12:12:16 2008 +0200 | | summary: correct layer | | o | changeset: 1281:9e5802e9e6f2 | | user: hecht | | date: Tue May 20 11:08:56 2008 +0200 | | summary: add 3 files | | o | changeset: 1280:25be52991a76 | | user: hecht | | date: Fri May 16 10:07:35 2008 +0200 | | summary: add int2d on border off 3d mesh | | o | changeset: 1279:271a0c10b941 | | user: hecht | | date: Fri May 16 00:26:03 2008 +0200 | | summary: add PBord methode to compute genericaly integrale on border element. | | o | changeset: 1278:bcf7733f66cf | | user: hecht | | date: Thu May 15 23:39:14 2008 +0200 | | summary: correct class Z3 + Save 3d mesh. | | o | changeset: 1277:7f3efc97d905 | | user: hecht | | date: Thu May 15 23:11:21 2008 +0200 | | summary: remove strversionnumber.cpp (build by the makefiel) | | o | changeset: 1276:6846c158476b | | user: hecht | | date: Thu May 15 23:03:50 2008 +0200 | | summary: correct win32 mistake double def + PB GQTree R1 | | o | changeset: 1275:9b461360cca1 | | user: hecht | | date: Thu May 15 14:52:25 2008 +0200 | | summary: correct missing assert def in src/femlib/QuadratureFormular.cpp | | o | changeset: 1274:59f70178b6a3 | | user: hecht | | date: Thu May 15 14:13:05 2008 +0200 | | summary: correct | | o | changeset: 1273:4e1c1f21abc0 | | user: hecht | | date: Thu May 15 13:31:00 2008 +0200 | | summary: add missing file | | o | changeset: 1272:1e7c8947e560 | | user: hecht | | date: Thu May 15 13:28:57 2008 +0200 | | summary: correct include dir | | o | changeset: 1271:20d19853a704 | | user: hecht | | date: Thu May 15 12:48:33 2008 +0200 | | summary: add missing file | | o | changeset: 1270:6375ea25c494 | | user: hecht | | date: Thu May 15 12:05:19 2008 +0200 | | summary: a fist 3d version, with PB on boundaru contion. | | o | changeset: 1269:93f976abeabc | | user: hecht | | date: Thu May 15 00:47:02 2008 +0200 | | summary: 3d next step | | o | changeset: 1268:60d306545870 | | user: hecht | | date: Wed May 14 14:48:25 2008 +0200 | | summary: 3d continuing | | o | changeset: 1267:051a2b0b8339 | | user: hecht | | date: Wed May 07 16:12:02 2008 +0200 | | summary: a first 3d version .. | | o | changeset: 1266:a11672848900 | | user: hecht | | date: Tue Apr 29 22:19:00 2008 +0200 | | summary: add file | | o | changeset: 1265:259dcc851d31 | | user: hecht | | date: Tue Apr 29 22:01:24 2008 +0200 | | summary: correct examples++-load | | o | changeset: 1264:53db1907af65 | | user: hecht | | date: Tue Apr 29 21:05:36 2008 +0200 | | summary: pass to version 2.25 (last version before 3.0) | | o | changeset: 1263:ec6a9046af52 | | tag: release_2_24_4 | | user: hecht | | date: Wed Apr 23 12:18:12 2008 +0200 | | summary: correct missing code in DG of term in linear form | | o | changeset: 1262:e6648830647f | | user: hecht | | date: Fri Apr 18 08:26:34 2008 +0200 | | summary: see innovation + correzction in doc | | o | changeset: 1261:59b6014ebe00 | | user: hecht | | date: Fri Apr 11 16:52:51 2008 +0200 | | summary: add formal operator .* and ./ on array [] | | o | changeset: 1260:ef82bf406677 | | user: hecht | | date: Fri Apr 11 16:14:11 2008 +0200 | | summary: correct lex.cpp for parameter macro comma between []. | | o | changeset: 1259:94fb8bee70ab | | user: hecht | | date: Wed Apr 09 15:46:19 2008 +0200 | | summary: correct eigenvalue, (undo remove 1 line) | | o | changeset: 1258:05b9c0c843e5 | | user: hecht | | date: Wed Apr 09 14:20:41 2008 +0200 | | summary: ad resid= vector in eigen value (see arpack doc) | | o | changeset: 1257:d32b839daca5 | | user: hecht | | date: Wed Apr 09 10:03:09 2008 +0200 | | summary: correct err 21 trp in mshptg (pile trop petit) | | o | changeset: 1256:3cdb4d96732c | | user: hecht | | date: Wed Apr 09 09:24:39 2008 +0200 | | summary: coorect missing trap in case of errror in msgtpg | | o | changeset: 1255:40aba1424fd5 | | user: hecht | | date: Tue Apr 01 12:05:59 2008 +0200 | | summary: add Bob Gustafson coorect in the doc. | | o | changeset: 1254:99c4f39ceb54 | | user: hecht | | date: Thu Mar 27 14:17:50 2008 +0100 | | summary: correct confire.ac build FLIBS (suite) | | o | changeset: 1253:7952d7e59157 | | user: hecht | | date: Thu Mar 27 12:17:40 2008 +0100 | | summary: misa a jour INNOVATION | | o | changeset: 1252:686b9984089a | | user: hecht | | date: Thu Mar 27 12:14:26 2008 +0100 | | summary: correct configre.ac to check FLIBS and test the value of FLIBS and X11_LIBS | | o | changeset: 1251:7a218e8eb4e4 | | user: hecht | | date: Fri Feb 22 18:10:51 2008 +0100 | | summary: add missing file | | o | changeset: 1250:3f6f96956582 | | user: hecht | | date: Fri Feb 22 17:49:19 2008 +0100 | | summary: pass to 2.24.1 and correct buildmesh trap in case of degenerated border. | | o | changeset: 1249:466c6cf70d4e | | user: hecht | | date: Tue Feb 19 21:00:35 2008 +0100 | | summary: correct periodic condition limite to 1 edge. | | o | changeset: 1248:292de6acfd0c | | user: hecht | | date: Fri Feb 15 11:16:44 2008 +0100 | | summary: correct include.tar.gz | | o | changeset: 1247:f1ac94ae30f0 | | user: hecht | | date: Thu Feb 14 23:08:44 2008 +0100 | | summary: add missing file R[123].hpp in Makefile.am for dist | | o | changeset: 1246:5db85e01658c | | user: hecht | | date: Thu Feb 14 14:44:20 2008 +0100 | | summary: rebuild include.tar.gz | | o | changeset: 1245:6f7beaf98f55 | | user: hecht | | date: Thu Feb 14 14:33:59 2008 +0100 | | summary: v 2.24 | | o | changeset: 1244:71fc0f351404 | | user: hecht | | date: Thu Feb 07 15:15:32 2008 +0100 | | summary: add script to download medit on windows | | o | changeset: 1243:37f9085ca0af | | user: hecht | | date: Mon Feb 04 15:07:38 2008 +0100 | | summary: add lazst modification in the doc. | | o | changeset: 1242:1d53bd6f9e96 | | user: hecht | | date: Fri Feb 01 22:09:10 2008 +0100 | | summary: add Th=triangule(xx,yy); | | o | changeset: 1241:c1f45746fb19 | | user: hecht | | date: Tue Jan 29 23:29:12 2008 +0100 | | summary: add info INNOVATION file | | o | changeset: 1240:e1d2110881df | | user: hecht | | date: Tue Jan 29 23:20:52 2008 +0100 | | summary: correct rare bug in bamg (missing initialisation variable edges[].adj | | o | changeset: 1239:2d981f5a74aa | | user: hecht | | date: Thu Jan 24 09:26:32 2008 +0100 | | summary: correct assert fail in case of no UMFPACK in make check | | o | changeset: 1238:355795395a28 | | user: hecht | | date: Wed Jan 23 11:04:16 2008 +0100 | | summary: add mortar (Neuman to Dirichlet ) example in scalar and parallel version | | o | changeset: 1237:7132e4a552e2 | | user: hecht | | date: Tue Jan 22 17:23:05 2008 +0100 | | summary: add vectorial operator ( a ? b : c) on array where b and c can be scalar | | o | changeset: 1236:35c531d0eda6 | | user: hecht | | date: Wed Jan 16 12:37:04 2008 +0100 | | summary: correct mpi (receive is now synchrone and send is asychrone) | | o | changeset: 1235:ccbffa0edbc1 | | user: hecht | | date: Fri Jan 11 10:59:18 2008 +0100 | | summary: nothing | | o | changeset: 1234:4a5c97ce6af0 | | user: hecht | | date: Wed Jan 09 22:33:15 2008 +0100 | | summary: correct README of debian and cnfigure.ac of checking umfpack lib. | | o | changeset: 1233:6dc9e9cff6b7 | | user: hecht | | date: Sat Jan 05 16:50:32 2008 +0100 | | summary: correct Makefile to build universal executable file on MacOS | | o | changeset: 1232:5e33a386cfea | | user: hecht | | date: Wed Dec 26 17:30:04 2007 +0100 | | summary: cvs ranlib and ar in umfpack compilation process of universal file on apple. | | o | changeset: 1231:67239ae99bc8 | | user: hecht | | date: Wed Dec 26 16:44:28 2007 +0100 | | summary: Make big change un configure.ac and makefiel.am to build universal binarie file on apple (ppc and i386) | | o | changeset: 1230:42ff4f594013 | | user: hecht | | date: Thu Dec 20 13:11:42 2007 +0100 | | summary: correct freefem++-doc | | o | changeset: 1229:46601bd22684 | | user: hecht | | date: Tue Dec 18 18:35:55 2007 +0100 | | summary: missing file | | o | changeset: 1228:c55ffbf8c297 | | user: hecht | | date: Tue Dec 18 18:19:04 2007 +0100 | | summary: change ref value correct elastycity. | | o | changeset: 1227:4264a1078ace | | user: hecht | | date: Tue Dec 18 18:04:09 2007 +0100 | | summary: just change in UFconfig_mk.m4 for freebsd for comment | | o | changeset: 1226:82ca7c0795f4 | | user: hecht | | date: Tue Dec 18 16:43:55 2007 +0100 | | summary: see innovation correct bug in function with string argument | | o | changeset: 1225:30b829eb80a6 | | user: hecht | | date: Tue Dec 11 21:18:52 2007 +0100 | | summary: type correct Pcrgraph | | o | changeset: 1224:f93b6dc20752 | | user: hecht | | date: Fri Nov 30 13:54:29 2007 +0100 | | summary: correct error on mpi version | | o | changeset: 1223:6b813cebfc7e | | user: hecht | | date: Thu Nov 29 12:20:33 2007 +0100 | | summary: suite | | o | changeset: 1222:b31f36430d73 | | user: hecht | | date: Thu Nov 29 12:18:20 2007 +0100 | | summary: *** empty log message *** | | o | changeset: 1221:5a4cf32a8ce0 | | user: hecht | | date: Thu Nov 29 12:15:25 2007 +0100 | | summary: next | | o | changeset: 1220:013e64381c12 | | user: hecht | | date: Thu Nov 29 12:11:42 2007 +0100 | | summary: correct missing preprocessing variable | | o | changeset: 1219:16f1a0466850 | | user: hecht | | date: Thu Nov 29 07:42:05 2007 +0100 | | summary: correct configure.ac for umfpack (sometime missng a library) | | o | changeset: 1218:8c9df5beb3a7 | | user: hecht | | date: Tue Nov 20 16:49:01 2007 +0100 | | summary: correct missing tapping error in test build drawbdmesh on windows. | | o | changeset: 1217:8855b0228166 | | user: hecht | | date: Tue Nov 20 16:13:38 2007 +0100 | | summary: correct bamg on windows missing drawbdmesh.exe | | o | changeset: 1216:d6d35bd4d912 | | user: hecht | | date: Tue Nov 20 15:38:21 2007 +0100 | | summary: coorect missing exe extension on bamg program in confure.ac | | o | changeset: 1215:5140ecde974b | | user: hecht | | date: Mon Nov 19 21:40:06 2007 +0100 | | summary: correct mpi for macos leopard, | | o | changeset: 1214:c958ea8751f6 | | user: hecht | | date: Mon Nov 19 18:13:44 2007 +0100 | | summary: correct MPI configure.ac | | o | changeset: 1213:5971ef36e8b0 | | user: hecht | | date: Mon Nov 19 14:41:30 2007 +0100 | | summary: continuing | | o | changeset: 1212:1d04be51cbd3 | | user: hecht | | date: Mon Nov 19 14:40:00 2007 +0100 | | summary: missing mpiprog | | o | changeset: 1211:87b998a26081 | | user: hecht | | date: Mon Nov 19 14:25:04 2007 +0100 | | summary: correct configure.ac missing FreeFem++ with X11 | | o | changeset: 1210:8b75110cb5a3 | | user: hecht | | date: Mon Nov 19 14:17:36 2007 +0100 | | summary: correct configure.ac without x11 | | o | changeset: 1209:311d084c2046 | | user: hecht | | date: Sun Nov 18 13:20:22 2007 +0100 | | summary: correct documentation for new edition | | o | changeset: 1208:24706bfcaeff | | user: hecht | | date: Tue Nov 13 16:40:14 2007 +0100 | | summary: correct doc, | | o | changeset: 1207:3d6e666c6d16 | | user: hecht | | date: Wed Oct 24 22:17:06 2007 +0200 | | summary: see INNOVATION file | | o | changeset: 1206:7165e6427c0e | | user: hecht | | date: Mon Oct 22 18:17:22 2007 +0200 | | summary: add format + - , trace and det of array | | o | changeset: 1205:4389ca545f46 | | user: hecht | | date: Tue Oct 02 17:55:05 2007 +0200 | | summary: correct missing parameter SolveGCPrecon and SolveGCDiag | | o | changeset: 1204:7c01e8973cec | | user: hecht | | date: Tue Oct 02 16:49:37 2007 +0200 | | summary: correct miss-spelling | | o | changeset: 1203:78037197ef80 | | user: hecht | | date: Tue Oct 02 16:07:26 2007 +0200 | | summary: - add in download automatic generation of f2c and fort77 to get a free fortran compiler | | o | changeset: 1202:45e43ae71094 | | user: hecht | | date: Sun Sep 30 17:45:11 2007 +0200 | | summary: Add sparse solver in documentation | | o | changeset: 1201:05897868c18c | | user: hecht | | date: Thu Sep 20 21:53:50 2007 +0200 | | summary: add SuperSolevr | | o | changeset: 1200:9f9f13a8f113 | | user: hecht | | date: Sun Sep 09 21:17:01 2007 +0200 | | summary: add f2d in case of no fortran | | o | changeset: 1199:61b84c52d78d | | user: hecht | | date: Fri Sep 07 17:09:59 2007 +0200 | | summary: add f2c download | | o | changeset: 1198:04efc3f5f54b | | user: hecht | | date: Fri Sep 07 00:13:17 2007 +0200 | | summary: recorrect operator += Virtual matrix operator (introduction in august) | | o | changeset: 1197:ff3f4337d5e3 | | user: hecht | | date: Thu Sep 06 16:23:51 2007 +0200 | | summary: correct SuperLU and UMFPACK driver + add comparaison | | o | changeset: 1196:8ae57860389a | | user: hecht | | date: Thu Sep 06 16:02:24 2007 +0200 | | summary: add missing files | | o | changeset: 1195:647ecb3eea6f | | user: hecht | | date: Thu Sep 06 15:58:49 2007 +0200 | | summary: correct 2 def defaulttoGMRES | | o | changeset: 1194:18a530f69d84 | | user: hecht | | date: Thu Sep 06 15:14:13 2007 +0200 | | summary: correct tool to add other sparse (morse) linear solver with dynamic load | | o | changeset: 1193:b90d965d48fd | | user: hecht | | date: Wed Sep 05 23:27:44 2007 +0200 | | summary: add set sparce solver (morse) | | o | changeset: 1192:4ce83180909c | | user: hecht | | date: Wed Sep 05 20:15:55 2007 +0200 | | summary: correct complex part of superLU | | o | changeset: 1191:041538d4cb5e | | user: hecht | | date: Wed Sep 05 18:03:29 2007 +0200 | | summary: Add tools to change Sparce Linear Solver | | o | changeset: 1190:6f6d00a9fca5 | | user: hecht | | date: Tue Aug 28 21:57:58 2007 +0200 | | summary: add N,M in class VirtualMatrix, to correct probleme in RNM class | | o | changeset: 1189:a5a12103ca64 | | user: hecht | | date: Tue Aug 28 17:16:21 2007 +0200 | | summary: add missing oiperator in array: | | o | changeset: 1188:92165ee42a24 | | user: hecht | | date: Fri Aug 24 09:12:38 2007 +0200 | | summary: update doc comtinuing | | o | changeset: 1187:da3adb2cfcd8 | | user: hecht | | date: Fri Aug 24 08:27:32 2007 +0200 | | summary: update the doc. | | o | changeset: 1186:c5b4f3e3c65d | | user: hecht | | date: Mon Aug 20 21:29:52 2007 +0200 | | summary: add missing file | | o | changeset: 1185:866ce6820edc | | user: hecht | | date: Mon Aug 20 21:28:18 2007 +0200 | | summary: correct mean and jump operator in interpolation | | o | changeset: 1184:ed49097a6267 | | user: hecht | | date: Mon Aug 20 20:07:51 2007 +0200 | | summary: upgrade INNOVATION | | o | changeset: 1183:341e9039538a | | user: hecht | | date: Mon Aug 20 18:07:07 2007 +0200 | | summary: correct, problem of automatic ptr managenemt in plot::operator() | | o | changeset: 1182:d10dd6069cd6 | | user: hecht | | date: Sun Aug 19 22:05:05 2007 +0200 | | summary: pass to version 2.19. | | o | changeset: 1181:df0e5e08baf6 | | user: hecht | | date: Tue Aug 07 22:05:59 2007 +0200 | | summary: correct cin on windows and and type on bogus buildmesh. | | o | changeset: 1180:72d9b455a3a7 | | user: hecht | | date: Thu Jul 19 19:22:48 2007 +0200 | | summary: correct AdaptResidualErrorIndicator and download/Makefile.am to | | o | changeset: 1179:a0266c67c331 | | user: hecht | | date: Thu Jul 19 13:19:01 2007 +0200 | | summary: add missing compile file in example++-load | | o | changeset: 1178:82f8d3d94641 | | user: hecht | | date: Thu Jul 19 11:41:48 2007 +0200 | | summary: see INNOVATION file, past version 2.18 | | o | changeset: 1177:df947a9d2fbc | | user: hecht | | date: Mon Jul 16 14:47:18 2007 +0200 | | summary: add quantile | | o | changeset: 1176:eb553aa35dea | | user: hecht | | date: Fri Jul 13 17:33:23 2007 +0200 | | summary: add code to sort array | | o | changeset: 1175:35694b19dc26 | | user: hecht | | date: Fri Jun 29 22:21:50 2007 +0200 | | summary: xcode projet | | o | changeset: 1174:7ad52446d9f9 | | user: hecht | | date: Thu Jun 28 22:12:20 2007 +0200 | | summary: correct compile error with gcc 3.2.2 lgmat.cpp | | o | changeset: 1173:868c291e09df | | user: hecht | | date: Thu Jun 21 07:58:39 2007 +0200 | | summary: correct ../fflib/environment.hpp:41:24: warning: no newline at end of file | | o | changeset: 1172:542424ec6260 | | user: hecht | | date: Wed Jun 20 22:42:21 2007 +0200 | | summary: correct bilapMorley.edp add missing term in var. formulation. | | o | changeset: 1171:3b9e9a1daea3 | | user: hecht | | date: Mon Jun 18 22:58:10 2007 +0200 | | summary: set 2.17-2 | | o | changeset: 1170:0ea82558902f | | user: hecht | | date: Mon Jun 18 22:42:38 2007 +0200 | | summary: add mesh example | | o | changeset: 1169:17bd8f713142 | | user: hecht | | date: Mon Jun 18 22:20:25 2007 +0200 | | summary: correct old bug in bamg, in case of bogus boundary (auto crossing) | | o | changeset: 1168:33fc210a3294 | | user: hecht | | date: Fri Jun 15 13:39:12 2007 +0200 | | summary: clean the example | | o | changeset: 1167:d1c701a50c9b | | user: hecht | | date: Fri Jun 15 11:02:46 2007 +0200 | | summary: correct FreeFem++-Cocoa to add option -v 0 | | o | changeset: 1166:730dc114f01f | | user: hecht | | date: Fri Jun 15 10:01:07 2007 +0200 | | summary: add missing files | | o | changeset: 1165:ed08ef696a78 | | user: hecht | | date: Fri Jun 15 09:33:06 2007 +0200 | | summary: end of 2.17-1 modif | | o | changeset: 1164:2b725188838d | | user: hecht | | date: Thu Jun 14 23:03:54 2007 +0200 | | summary: *** empty log message *** | | o | changeset: 1163:26214451b1ab | | user: hecht | | date: Thu Jun 14 22:35:37 2007 +0200 | | summary: next | | o | changeset: 1162:fcc2dbd3a9ce | | user: hecht | | date: Thu Jun 14 21:49:13 2007 +0200 | | summary: add -v xx on pc version | | o | changeset: 1161:463a69ad8896 | | user: hecht | | date: Thu Jun 14 11:54:03 2007 +0200 | | summary: suite | | o | changeset: 1160:5484bd790c1e | | user: hecht | | date: Thu Jun 14 10:27:06 2007 +0200 | | summary: *** empty log message *** | | o | changeset: 1159:9e4f6868ccd9 | | user: hecht | | date: Thu Jun 14 09:51:10 2007 +0200 | | summary: clear output when verbosity = 0 | | o | changeset: 1158:1584e449a412 | | user: hecht | | date: Mon Jun 11 15:37:51 2007 +0200 | | summary: correct automatique choose of color in plot of arrow | | o | changeset: 1157:45091926fd64 | | user: hecht | | date: Sat Jun 09 12:15:24 2007 +0200 | | summary: add boundary= ... flag in plot fonction. | | o | changeset: 1156:233789981ccc | | user: hecht | | date: Thu Jun 07 12:16:52 2007 +0200 | | summary: *** empty log message *** | | o | changeset: 1155:fc6ca727714b | | user: hecht | | date: Thu Jun 07 12:15:23 2007 +0200 | | summary: *** empty log message *** | | o | changeset: 1154:730ea632f37b | | user: hecht | | date: Thu Jun 07 11:52:53 2007 +0200 | | summary: *** empty log message *** | | o | changeset: 1153:b2e2ef7ef138 | | user: hecht | | date: Thu Jun 07 10:53:13 2007 +0200 | | summary: correct mistake in tgamma call | | o | changeset: 1152:aee96893dd95 | | user: hecht | | date: Thu Jun 07 10:37:29 2007 +0200 | | summary: correct missing update | | o | changeset: 1151:22b1fb44a1fd | | user: hecht | | date: Thu Jun 07 08:17:18 2007 +0200 | | summary: add bessel function j0, j1, jn, y0, y1, yn -- bessel functions of first and second kind | | o | changeset: 1150:c506c2721bc1 | | user: hecht | | date: Tue Jun 05 18:02:43 2007 +0200 | | summary: same for complex eigen value | | o | changeset: 1149:0f0ac1c8239d | | user: hecht | | date: Tue Jun 05 17:44:32 2007 +0200 | | summary: add rawvector= in eigenvector | | o | changeset: 1148:4bc4aa832c8e | | user: hecht | | date: Mon Jun 04 23:03:52 2007 +0200 | | summary: correct qforder= automatic choose in quadature formular in computation of integrale | | o | changeset: 1147:f83647e00352 | | user: hecht | | date: Wed May 16 00:21:37 2007 +0200 | | summary: just add missing files | | o | changeset: 1146:d26722df3ff7 | | user: hecht | | date: Wed May 16 00:09:46 2007 +0200 | | summary: correct Makefile.am for examples++-load/include missing file | | o | changeset: 1145:816c2b7c8609 | | user: hecht | | date: Tue May 15 23:48:22 2007 +0200 | | summary: do autoreconf | | o | changeset: 1144:ec60d212a134 | | user: hecht | | date: Tue May 15 22:01:55 2007 +0200 | | summary: coorect mistake with libcblas | | o | changeset: 1143:d110d5bbf588 | | user: hecht | | date: Thu May 10 12:05:39 2007 +0200 | | summary: correct very old bug in meshptg in case aligne point | | o | changeset: 1142:be336c51a337 | | user: hecht | | date: Thu May 03 10:36:34 2007 +0200 | | summary: correct Makefile.am dans examples++-load | | o | changeset: 1141:c00cb936f998 | | user: hecht | | date: Wed May 02 17:29:06 2007 +0200 | | summary: - Add read sparce matrix form a file | | o | changeset: 1140:f4d3b4252673 | | user: hecht | | date: Wed Apr 25 09:28:12 2007 +0200 | | summary: coorect splitmesh next step | | o | changeset: 1139:650460b31c24 | | user: hecht | | date: Tue Apr 24 22:20:08 2007 +0200 | | summary: coorect meshsplit function | | o | changeset: 1138:d4553b50a958 | | user: hecht | | date: Tue Apr 24 17:18:50 2007 +0200 | | summary: correct the variable ff_testideprog="testhighlight${EXEEXT}" | | o | changeset: 1137:2a10ec7ebf4a | | user: hecht | | date: Mon Apr 23 17:28:50 2007 +0200 | | summary: remove dump for debbuging in fem.cpp ( mesh() constructor call splitmesh function) | | o | changeset: 1136:db9bb253016b | | user: hecht | | date: Sat Apr 21 11:31:01 2007 +0200 | | summary: correct miss speeling and fig ref/label | | o | changeset: 1135:ba3a8c4bb929 | | user: hecht | | date: Fri Apr 20 17:18:59 2007 +0200 | | summary: remove all compilation in ide dir if --without-fltk configure flags is set. | | o | changeset: 1134:627db69ed2c1 | | user: hecht | | date: Fri Apr 20 16:01:30 2007 +0200 | | summary: correct error when writing mesh, in case of different region (sub-domain) | | o | changeset: 1133:b53c912f5521 | | user: hecht | | date: Fri Apr 20 14:56:06 2007 +0200 | | summary: do autoreconf | | o | changeset: 1132:f7b143c68235 | | user: hecht | | date: Fri Apr 20 14:54:29 2007 +0200 | | summary: - correct mshptg.cpp (add swap) , this is used in case of | | o | changeset: 1131:8e5261645b5c | | user: hecht | | date: Wed Apr 18 12:01:45 2007 +0200 | | summary: correct ligne pof Sun SS -S vss in fem.cpp | | o | changeset: 1130:0b47aaa265ed | | user: hecht | | date: Tue Apr 17 22:34:58 2007 +0200 | | summary: same next | | o | changeset: 1129:8abeb822514a | | user: hecht | | date: Tue Apr 17 22:27:49 2007 +0200 | | summary: same continuing | | o | changeset: 1128:b06140d1d045 | | user: hecht | | date: Tue Apr 17 22:12:49 2007 +0200 | | summary: correct fltk configure process on windows | | o | changeset: 1127:bad3e707f5df | | user: hecht | | date: Tue Apr 17 21:47:31 2007 +0200 | | summary: coorect mistake on window akefile+ change fltk dowload install dir | | o | changeset: 1126:84e2eb1e36b5 | | user: hecht | | date: Tue Apr 17 12:52:28 2007 +0200 | | summary: *** empty log message *** | | o | changeset: 1125:e25d8911cc1e | | user: hecht | | date: Tue Apr 17 12:51:00 2007 +0200 | | summary: add file | | o | changeset: 1124:8cf70de5de34 | | user: hecht | | date: Tue Apr 17 12:08:26 2007 +0200 | | summary: remove umfpack directory form src | | o | changeset: 1123:86e4e6640342 | | user: hecht | | date: Fri Apr 06 17:42:55 2007 +0200 | | summary: correct regularity, suite. | | o | changeset: 1122:27f01e4f3b4e | | user: hecht | | date: Fri Apr 06 14:53:20 2007 +0200 | | summary: regularity mistake, suite. | | o | changeset: 1121:ad34308e20bc | | user: hecht | | date: Fri Apr 06 13:18:37 2007 +0200 | | summary: correct impressin of mesh regularity | | o | changeset: 1120:f1de13b4c5b0 | | user: hecht | | date: Wed Apr 04 21:20:31 2007 +0200 | | summary: go to version 2.15-1, see innovation file | | o | changeset: 1119:436c75d9b870 | | user: hecht | | date: Mon Apr 02 11:45:11 2007 +0200 | | summary: correct examples++-tutorial/sparse-matrix.edp | | o | changeset: 1118:3619a30b94c4 | | user: hecht | | date: Mon Apr 02 11:36:31 2007 +0200 | | summary: correct splitmesh with intenals bourdary | | o | changeset: 1117:30af445f8cdb | | user: hecht | | date: Sun Mar 25 11:41:56 2007 +0200 | | summary: correct bug in vectorial operation (a+3.14*b) | | o | changeset: 1116:89cb2da6046d | | user: hecht | | date: Thu Mar 22 12:01:50 2007 +0100 | | summary: Correct integration problem in varf of int1d(Th) .. u_Th1 .. v_Th2 .. | | o | changeset: 1115:7f0e033977ed | | user: hecht | | date: Sun Mar 11 21:22:17 2007 +0100 | | summary: correct licence hearder. | | o | changeset: 1114:70758153bd21 | | user: hecht | | date: Fri Mar 09 23:10:39 2007 +0100 | | summary: correct missing speeling in configure.ac mpi++.h -> mpi++.h for mpich.1.2 | | o | changeset: 1113:fc8765cc14d9 | | user: hecht | | date: Wed Mar 07 13:51:33 2007 +0100 | | summary: see INNOVATION for detail. | | o | changeset: 1112:52b479bdedc2 | | user: hecht | | date: Wed Feb 14 21:00:18 2007 +0100 | | summary: correct mistake in bluid matrice from varf with 3 meshes | | o | changeset: 1111:724be807f3f5 | | user: hecht | | date: Sun Feb 04 12:19:57 2007 +0100 | | summary: add scalar term in block matrix as 1x1 sub matrix. | | o | changeset: 1110:c84d01a8cf8c | | user: hecht | | date: Sat Feb 03 15:17:19 2007 +0100 | | summary: do autoreconf | | o | changeset: 1109:1e4907ffb59e | | user: hecht | | date: Sat Feb 03 14:25:28 2007 +0100 | | summary: pass to version 2.13 and | | o | changeset: 1108:421db81aaa4c | | user: hecht | | date: Wed Jan 24 14:01:39 2007 +0100 | | summary: correct mistake in function | | o | changeset: 1107:78da8acfecb9 | | user: hecht | | date: Mon Jan 15 14:13:11 2007 +0100 | | summary: correct when return a local new pointeur in freefem++ function | | o | changeset: 1106:0a1b0afe3ade | | user: hecht | | date: Wed Jan 10 13:12:16 2007 +0100 | | summary: add comment | | o | changeset: 1105:07b62b54ccf4 | | user: hecht | | date: Wed Jan 10 11:59:48 2007 +0100 | | summary: pass to 2-12 et correct mistake in no square block matrix | | o | changeset: 1104:6c1fa2e746bc | | user: hecht | | date: Fri Dec 22 13:33:09 2006 +0100 | | summary: coorect missing spell in configure.ac (ff_libs => ff_flibs) (fortran libs) | | o | changeset: 1103:561eab096a22 | | user: hecht | | date: Sun Dec 17 09:36:46 2006 +0100 | | summary: change PPC in PP_C in problem.cpp, because PPC macro is defined | | o | changeset: 1102:f87ec3ed5e67 | | user: hecht | | date: Fri Dec 01 21:03:37 2006 +0100 | | summary: coorect LaplaceRT.edp | | o | changeset: 1101:e7de74fdbf14 | | user: hecht | | date: Thu Nov 30 14:48:47 2006 +0100 | | summary: correct dependance in examples++-load/Makefile.am | | o | changeset: 1100:ec4fde559d08 | | user: hecht | | date: Thu Nov 30 14:45:17 2006 +0100 | | summary: correct build matrices from varf with different mesh in case for mortar mesh. | | o | changeset: 1099:77648a46d003 | | user: hecht | | date: Tue Nov 28 13:53:02 2006 +0100 | | summary: correct bug in interpolation fespace Wf(Th,[RT0,P0]) function | | o | changeset: 1098:7d480ffab837 | | user: hecht | | date: Fri Nov 10 22:09:21 2006 +0100 | | summary: I correct the problem in arpack (computation of eigen value) under i383 processor. | | o | changeset: 1097:593603d24fae | | user: hecht | | date: Mon Nov 06 13:55:03 2006 +0100 | | summary: correct -Wall continuing | | o | changeset: 1096:07cd72f527a2 | | user: hecht | | date: Mon Nov 06 09:55:57 2006 +0100 | | summary: correct all -Wall warning, to try to solve probleme in eigen value computation | | o | changeset: 1095:be438995d8e4 | | tag: release_2_10_2_before_Wall | | user: hecht | | date: Thu Oct 26 15:36:16 2006 +0200 | | summary: remove debug dump | | o | changeset: 1094:b591f599d49c | | user: hecht | | date: Thu Oct 26 14:17:41 2006 +0200 | | summary: correct mistake in configure | | o | changeset: 1093:d6b64e445a74 | | user: hecht | | date: Thu Oct 26 14:09:30 2006 +0200 | | summary: correct error in lapack of arpack (remove div by 0) | | o | changeset: 1092:3e64d9ef3137 | | user: hecht | | date: Tue Oct 24 21:22:19 2006 +0200 | | summary: add flags -with-lapack in configure | | o | changeset: 1091:3b882c3a5cbc | | user: hecht | | date: Fri Oct 20 11:26:41 2006 +0200 | | summary: add HIDDEN PARAMETER to fortran route with character parameters | | o | changeset: 1090:15d919e17d54 | | user: hecht | | date: Thu Oct 19 15:53:21 2006 +0200 | | summary: coorect 70 in 70. | | o | changeset: 1089:72ba19f26d06 | | user: hecht | | date: Thu Oct 19 15:13:18 2006 +0200 | | summary: misa a jour de README_CVS | | o | changeset: 1088:7c13736478ae | | user: hecht | | date: Wed Oct 18 21:39:17 2006 +0200 | | summary: ATTENTION le serveur CVS a change | | o | changeset: 1087:69aece617a96 | | user: hecht | | date: Wed Oct 18 21:28:11 2006 +0200 | | summary: correct configure.ac for MacOs compile | | o | changeset: 1086:c0904d3ddd12 | | user: hecht | | date: Wed Oct 11 18:23:32 2006 +0200 | | summary: change version 2.10-1 | | o | changeset: 1085:bfc0a8074e1e | | user: hecht | | date: Tue Oct 10 20:48:02 2006 +0200 | | summary: add modif in the doc | | o | changeset: 1084:388005cc5029 | | user: hecht | | date: Tue Oct 10 17:42:15 2006 +0200 | | summary: QF continuing | | o | changeset: 1083:7276e657cb50 | | user: hecht | | date: Tue Oct 10 17:35:27 2006 +0200 | | summary: add QF gauss Legendre 4 and 5 points | | o | changeset: 1082:b23f3adc267f | | user: hecht | | date: Fri Sep 29 22:30:15 2006 +0200 | | summary: change in all source file the LGPL flags. (FH) | | o | changeset: 1081:f945df94b59a | | user: hecht | | date: Wed Sep 20 10:23:07 2006 +0200 | | summary: correct tool with crimson editor under Windows | | o | changeset: 1080:586e679e834b | | user: hecht | | date: Wed Sep 20 10:19:13 2006 +0200 | | summary: coorect comment on crimson editor | | o | changeset: 1079:ee0cfa566d11 | | user: hecht | | date: Tue Sep 19 22:08:51 2006 +0200 | | summary: bluid HISTORY files | | o | changeset: 1078:b224a55c4a5c | | user: hecht | | date: Tue Sep 19 21:36:43 2006 +0200 | | summary: correct openmpi trouble (async communication) | | o | changeset: 1077:11c495eb71a5 | | user: hecht | | date: Tue Sep 19 17:07:07 2006 +0200 | | summary: update INNIVATION | | o | changeset: 1076:a03f49afc8f3 | | user: hecht | | date: Tue Sep 19 16:24:13 2006 +0200 | | summary: change include.tar.gz file | | o | changeset: 1075:0c543fd2904e | | user: hecht | | date: Tue Sep 19 16:02:29 2006 +0200 | | summary: add format output routine | | o | changeset: 1074:5f55497120c9 | | user: hecht | | date: Tue Sep 19 11:47:20 2006 +0200 | | summary: correct configure.ac | | o | changeset: 1073:e174a3df647c | | user: hecht | | date: Mon Sep 18 17:41:24 2006 +0200 | | summary: change under windows OS the installed files | | o | changeset: 1072:3c866007d12c | | user: hecht | | date: Fri Jul 21 18:35:12 2006 +0200 | | summary: passe to version 2.8-2 | | o | changeset: 1071:11a7f799060e | | user: hecht | | date: Fri Jul 21 17:02:18 2006 +0200 | | summary: correct bug with mpi (MPICH-2) | | o | changeset: 1070:67582bf9db8d | | user: hecht | | date: Fri Jun 30 11:16:30 2006 +0200 | | summary: add print in arpack error | | o | changeset: 1069:9d5182230173 | | user: hecht | | date: Wed Jun 28 18:01:28 2006 +0200 | | summary: add missing file in make dist process | | o | changeset: 1068:7ac9ef62d6ea | | user: hecht | | date: Wed Jun 28 17:50:29 2006 +0200 | | summary: *** empty log message *** | | o | changeset: 1067:7a7da3aac6d0 | | user: hecht | | date: Wed Jun 28 17:49:40 2006 +0200 | | summary: add missing file | | o | changeset: 1066:e8c85aa01607 | | user: hecht | | date: Wed Jun 28 17:46:39 2006 +0200 | | summary: add tool to remove cadna in ./configure -without-cadna | | o | changeset: 1065:1cdc9b656cbd | | user: hecht | | date: Tue Jun 27 23:24:41 2006 +0200 | | summary: do correction for openmpi but the | | o | changeset: 1064:2a1df2d56b69 | | user: hecht | | date: Tue Jun 27 23:14:28 2006 +0200 | | summary: version 2.6-1 | | o | changeset: 1063:83aaaf11d8e4 | | user: hecht | | date: Fri Jun 16 16:04:45 2006 +0200 | | summary: correct doc netx step. | | o | changeset: 1062:c9d7a4cbb447 | | user: hecht | | date: Fri Jun 16 13:49:56 2006 +0200 | | summary: coorect lame.edp in chap 3 of the doc. | | o | changeset: 1061:63490a1bc9e2 | | user: hecht | | date: Mon Jun 12 21:15:22 2006 +0200 | | summary: add correction from christophe.trophime@grenoble.cnrs.fr | | o | changeset: 1060:56035a847644 | | user: hecht | | date: Thu Jun 01 09:28:29 2006 +0200 | | summary: add h flag to: Don't write symlinks as symlinks; write the data of the files | | o | changeset: 1059:c34152d230f8 | | user: hecht | | date: Tue May 30 15:37:52 2006 +0200 | | summary: correct OpenGL flag under MacOS configure.ac | | o | changeset: 1058:fa234b7279ba | | user: hecht | | date: Fri May 26 16:57:12 2006 +0200 | | summary: correct FLIBS in configure.ac | | o | changeset: 1057:9f5e47d47b0b | | user: hecht | | date: Wed May 24 22:25:02 2006 +0200 | | summary: correct configure.ac | | o | changeset: 1056:ee44b7d37064 | | user: hecht | | date: Fri May 19 19:53:09 2006 +0200 | | summary: cleanning FLIBS configure variable in case of g77 | | o | changeset: 1055:7d8c1d27e6a5 | | user: hecht | | date: Thu May 18 16:48:17 2006 +0200 | | summary: correct small error for New macOS install | | o | changeset: 1054:d3077251497e | | user: hecht | | date: Thu May 18 14:04:09 2006 +0200 | | summary: correct for lam mpi | | o | changeset: 1053:a5ae3f5ad14a | | user: hecht | | date: Thu May 18 13:59:15 2006 +0200 | | summary: add missing file | | o | changeset: 1052:271e5d7d4887 | | user: hecht | | date: Thu May 18 13:57:25 2006 +0200 | | summary: correct INNOVATION | | o | changeset: 1051:689c1b6bc221 | | user: hecht | | date: Thu May 18 13:51:17 2006 +0200 | | summary: Correct bug in case of vectorial problem with same FE space. | | o | changeset: 1050:2d93d1eb482c | | user: hecht | | date: Wed May 17 15:35:19 2006 +0200 | | summary: add missing file in distribution | | o | changeset: 1049:a35c824f162c | | user: hecht | | date: Tue May 16 15:09:18 2006 +0200 | | summary: remove missing speel in configure.ac | | o | changeset: 1048:31194b511eee | | user: hecht | | date: Tue May 16 15:00:12 2006 +0200 | | summary: try to correct X11 link problem on Linux 64bits architecture | | o | changeset: 1047:669f743b8424 | | user: hecht | | date: Mon May 15 20:01:01 2006 +0200 | | summary: correct pb on 64bits achitecture in file src/fflib/AnyType.hpp | | o | changeset: 1046:5c045c7b0278 | | user: hecht | | date: Fri May 05 22:55:05 2006 +0200 | | summary: do correction geometric data base with RequiredEdge. | | o | changeset: 1045:240f50061d02 | | user: hecht | | date: Wed Apr 26 14:15:13 2006 +0200 | | summary: correct configure.ac : | | o | changeset: 1044:68823e1bad2c | | user: hecht | | date: Sat Apr 15 18:05:11 2006 +0200 | | summary: correct missing spellibg line 920 | | o | changeset: 1043:a57bd667419c | | user: hecht | | date: Sat Apr 15 12:00:58 2006 +0200 | | summary: correct probele when compioling with g++ 3.2 | | o | changeset: 1042:6d6e6646b914 | | user: hecht | | date: Thu Apr 13 18:36:42 2006 +0200 | | summary: correct the mpi version for macos lam mpi | | o | changeset: 1041:4c5e3347dc7a | | user: hecht | | date: Thu Apr 13 13:39:58 2006 +0200 | | summary: pass to version 2.7 and correct missing file in mpi Makefile.am | | o | changeset: 1040:b08ffa6fe703 | | user: hecht | | date: Thu Apr 13 10:27:20 2006 +0200 | | summary: coorect misstake in rc/femlib/FESpace.cpp | | o | changeset: 1039:2cad75a9fee1 | | user: hecht | | date: Thu Apr 13 08:37:40 2006 +0200 | | summary: correct trouble in Boundary condition when we mixte some | | o | changeset: 1038:9c495e402881 | | user: hecht | | date: Wed Apr 12 14:03:02 2006 +0200 | | summary: remove check suffix .edp to be compatible with drawbdmesh.exe | | o | changeset: 1037:e763b1a14153 | | user: hecht | | date: Wed Apr 12 12:59:38 2006 +0200 | | summary: add line un INNOTAVION | | o | changeset: 1036:56eae42c7434 | | user: hecht | | date: Wed Apr 12 11:31:03 2006 +0200 | | summary: add bamg example an correct problem beetween bamg and freefem graphic | | o | changeset: 1035:5a7b04e99f63 | | user: hecht | | date: Wed Apr 12 07:38:59 2006 +0200 | | summary: correct load.link under windows with new list of .dll files. | | o | changeset: 1034:9b67a868ae97 | | user: hecht | | date: Tue Apr 11 23:26:57 2006 +0200 | | summary: correct load.link script (change list of ff++ dll) | | o | changeset: 1033:705dfea6c6f4 | | user: hecht | | date: Tue Apr 11 22:06:44 2006 +0200 | | summary: Now the all.edp of tutorial run under winder (very hard word). FH | | o | changeset: 1032:2baa47074ee1 | | user: hecht | | date: Tue Apr 11 21:57:50 2006 +0200 | | summary: correct bug under window in Mesh:Find (very rare) | | o | changeset: 1031:6c3bf2dfe726 | | user: hecht | | date: Tue Apr 11 13:52:41 2006 +0200 | | summary: change for window free/delete pair | | o | changeset: 1030:3c1196a7980c | | user: hecht | | date: Tue Apr 11 10:46:39 2006 +0200 | | summary: the new version of the dll file begin to work on windows (no trap in alloction) | | o | changeset: 1029:4e24126f9014 | | user: hecht | | date: Mon Apr 10 22:53:34 2006 +0200 | | summary: next. | | o | changeset: 1028:a15790716999 | | user: hecht | | date: Mon Apr 10 22:51:52 2006 +0200 | | summary: dur dur Windows,  | | o | changeset: 1027:254d30ab0f69 | | user: hecht | | date: Mon Apr 10 06:59:46 2006 +0200 | | summary: continuing malloc/free for window | | o | changeset: 1026:a5c82bb112b0 | | user: hecht | | date: Sun Apr 09 22:19:13 2006 +0200 | | summary: suite?? | | o | changeset: 1025:5a8765108bc6 | | user: hecht | | date: Sun Apr 09 21:50:04 2006 +0200 | | summary: suite, .. | | o | changeset: 1024:ef63561dbb98 | | user: hecht | | date: Sun Apr 09 20:56:27 2006 +0200 | | summary: in progress malloc/free ?? | | o | changeset: 1023:7c8d3752a8c5 | | user: hecht | | date: Sun Apr 09 20:38:50 2006 +0200 | | summary: try find pair of malloc /free for windows .dll | | o | changeset: 1022:d0b18f8d6670 | | user: hecht | | date: Sun Apr 09 18:13:49 2006 +0200 | | summary: make change for windows dll because the pair malloc and free | | o | changeset: 1021:d76874c0f85f | | user: hecht | | date: Fri Apr 07 08:38:09 2006 +0200 | | summary: correct missing delete pointeur in a=vmass(0,Vh); where vmass in a varf | | o | changeset: 1020:02ee34e0fedd | | user: hecht | | date: Fri Apr 07 08:35:18 2006 +0200 | | summary: CheckPtr add flag when deleting after cleanning | | o | changeset: 1019:f22016768b22 | | user: hecht | | date: Thu Apr 06 18:19:09 2006 +0200 | | summary: remove impression | | o | changeset: 1018:eea8603b5314 | | user: hecht | | date: Thu Apr 06 16:59:16 2006 +0200 | | summary: add cfloat include | | o | changeset: 1017:c31a741e4f51 | | user: hecht | | date: Thu Apr 06 16:53:29 2006 +0200 | | summary: add missing include climits in src/femlib/fem.cpp | | o | changeset: 1016:c8c3fd920434 | | user: hecht | | date: Thu Apr 06 16:49:04 2006 +0200 | | summary: correct mistake in interpolation procedure, (in Mesh::Find methode) | | o | changeset: 1015:20172ab21d1e | | user: hecht | | date: Tue Apr 04 23:31:14 2006 +0200 | | summary: correct bug in freeboundary;edp (trap on windows some time ) | | o | changeset: 1014:d2487f969c54 | | user: hecht | | date: Tue Apr 04 11:25:56 2006 +0200 | | summary: coorect consistance beetween movmesh and checkmovemesh | | o | changeset: 1013:a8b6b14521b4 | | user: hecht | | date: Tue Apr 04 09:11:39 2006 +0200 | | summary: add CR at end of file src/fflib/ffstack.hpp | | o | changeset: 1012:4f0626a95678 | | user: hecht | | date: Mon Apr 03 22:39:59 2006 +0200 | | summary: correct misspelling | | o | changeset: 1011:a4f1420b9b02 | | user: hecht | | date: Mon Apr 03 22:11:53 2006 +0200 | | summary: pass to 2.5-1 | | o | changeset: 1010:dd65ef6ffe6a | | user: hecht | | date: Mon Apr 03 22:09:30 2006 +0200 | | summary: correct randon error on window | | o | changeset: 1009:17557d78d867 | | user: hecht | | date: Sun Apr 02 21:59:22 2006 +0200 | | summary: add bamg.exe, cvmsh2.exe and drawbdmesh.exe in Inno setup package | | o | changeset: 1008:3c9f1d10e3fa | | user: hecht | | date: Sun Apr 02 21:53:41 2006 +0200 | | summary: and bamg and string_def.o files | | o | changeset: 1007:41d7de398a7a | | user: hecht | | date: Sat Apr 01 17:41:34 2006 +0200 | | summary: add new example AdaptResidualErrorIndicator in the doc | | o | changeset: 1006:33c7dcaed492 | | user: hecht | | date: Fri Mar 31 23:15:22 2006 +0200 | | summary: add ResidualErrorIndicor example | | o | changeset: 1005:c50260b490c6 | | user: hecht | | date: Fri Mar 31 20:41:41 2006 +0200 | | summary: add 2 files | | o | changeset: 1004:0a924b0705c0 | | user: hecht | | date: Fri Mar 31 18:26:21 2006 +0200 | | summary: add string method and correct bug une string parameter. | | o | changeset: 1003:6d7e5f19e5d2 | | user: hecht | | date: Thu Mar 30 08:50:11 2006 +0200 | | summary: some optimization on new auto free ptr. | | o | changeset: 1002:ccabf7cb7fc8 | | user: hecht | | date: Wed Mar 29 19:29:33 2006 +0200 | | summary: add missing clear language ptr in while and for loops. | | o | changeset: 1001:b6f1f5a20727 | | user: hecht | | date: Wed Mar 29 14:49:33 2006 +0200 | | summary: pass to version 2.5-0 | | o | changeset: 1000:05c49f7d003b | | user: hecht | | date: Wed Mar 29 14:47:52 2006 +0200 | | summary: * add automatic gestion of free language pointeur to correct | | o | changeset: 999:fc85bf0ec864 | | tag: release_2_4_3 | | user: hecht | | date: Mon Mar 27 23:21:48 2006 +0200 | | summary: add mode for mo text editor on MacOs see the freefem++-doc.pdf for full detail | | o | changeset: 998:2fc2e01af985 | | user: hecht | | date: Mon Mar 27 22:34:13 2006 +0200 | | summary: add freefem++ mode for mi editor on macos http://www.mimikaki.net/en/ | | o | changeset: 997:a7c4994c838c | | user: hecht | | date: Mon Mar 27 21:25:40 2006 +0200 | | summary: * add lot missing vectorial operation with sub array | | o | changeset: 996:2a1d5b8a2972 | | user: hecht | | date: Mon Mar 20 18:10:38 2006 +0100 | | summary: add init of array with a linear form. | | o | changeset: 995:8286c03feec4 | | user: hecht | | date: Fri Mar 17 23:18:34 2006 +0100 | | summary: add missing operator on sub array (type KN_) | | o | changeset: 994:4d77a303b202 | | user: hecht | | date: Fri Mar 17 10:45:16 2006 +0100 | | summary: add new operator on complex array to get real or imag part | | o | changeset: 993:a10bc8411406 | | user: hecht | | date: Fri Mar 17 07:36:20 2006 +0100 | | summary: add x=exp(y); when x,y are array for exp;log,sin,tan , .... | | o | changeset: 992:2900e40c201d | | user: hecht | | date: Thu Mar 16 11:40:10 2006 +0100 | | summary: add new kind on interplate matrix | | o | changeset: 991:45069205c1fe | | user: hecht | | date: Mon Mar 13 14:40:55 2006 +0100 | | summary: correct freefem-doc.tex until page 29 example 6. | | o | changeset: 990:83997a02688c | | user: hecht | | date: Sun Mar 12 12:10:39 2006 +0100 | | summary: do autoreconf | | o | changeset: 989:29e852c9228c | | user: hecht | | date: Sun Mar 12 10:47:07 2006 +0100 | | summary: change version number | | o | changeset: 988:248eeefa3fb8 | | user: hecht | | date: Sat Mar 11 18:47:41 2006 +0100 | | summary: array of matrix work now. | | o | changeset: 987:88eabcc9bac4 | | user: hecht | | date: Sat Mar 11 09:45:02 2006 +0100 | | summary: correct error in build array of sparce matrix. | | o | changeset: 986:28000cfb291d | | user: hecht | | date: Fri Mar 10 18:35:23 2006 +0100 | | summary: pl with matrix arry -> remove | | o | changeset: 985:c4d7606f1b7c | | user: hecht | | date: Fri Mar 10 17:46:28 2006 +0100 | | summary: make big change in the DOC with O. Kavian | | o | changeset: 984:0c0790f9714e | | user: hecht | | date: Tue Mar 07 20:10:30 2006 +0100 | | summary: tag release_2_4 | | o | changeset: 983:260fea6042e2 | | tag: release_2_4 | | user: hecht | | date: Tue Mar 07 20:05:46 2006 +0100 | | summary: pass to to version 2.4.0 | | o | changeset: 982:1063ba890e3c | | user: hecht | | date: Tue Mar 07 17:49:56 2006 +0100 | | summary: same as previous commit (just on the top dir) | | o | changeset: 981:14a915d04752 | | user: hecht | | date: Tue Mar 07 17:48:47 2006 +0100 | | summary: add new operator outer product, change the doc, .... | | o | changeset: 980:796f9d95bf8a | | user: hecht | | date: Fri Mar 03 23:29:06 2006 +0100 | | summary: add matric operator like in matlab mat(I,J) where I,J are | | o | changeset: 979:06e185f16d44 | | user: hecht | | date: Fri Mar 03 13:21:39 2006 +0100 | | summary: *** empty log message *** | | o | changeset: 978:c3cf679cbfe9 | | user: hecht | | date: Fri Mar 03 13:15:15 2006 +0100 | | summary: add an exemple with 1D lagrange multiplier. | | o | changeset: 977:bbe075e51532 | | user: hecht | | date: Wed Mar 01 23:15:55 2006 +0100 | | summary: add out product of 2 vectors to build full matrix | | o | changeset: 976:049d52a39d27 | | user: lehyaric | | date: Tue Feb 28 10:18:03 2006 +0100 | | summary: Debian packaging for version 2.3-2 | | o | changeset: 975:b0579ae35da0 | | user: hecht | | date: Wed Feb 22 18:12:33 2006 +0100 | | summary: correct exec on PC | | o | changeset: 974:1a6c2c83fa7a | | user: hecht | | date: Tue Feb 21 15:08:22 2006 +0100 | | summary: tag release_2_3_2 | | o | changeset: 973:5036f8596f19 | | tag: release_2_3_2 | | user: hecht | | date: Mon Feb 20 18:15:56 2006 +0100 | | summary: Correct missing sub domain problem when | | o | changeset: 972:2d1acc85e77e | | user: lehyaric | | date: Fri Feb 10 10:41:17 2006 +0100 | | summary: Improved "make clean", which did not seem to be cleaning correctly anymore. | | o | changeset: 971:4a048322f1ac | | user: hecht | | date: Thu Feb 09 16:32:06 2006 +0100 | | summary: add configure examples un README files | | o | changeset: 970:8853516f2694 | | user: hecht | | date: Thu Feb 09 15:11:50 2006 +0100 | | summary: correct miss spelling, and error in configure.ac | | o | changeset: 969:d3384dd2cf15 | | user: hecht | | date: Tue Feb 07 21:32:36 2006 +0100 | | summary: reglage in the doc, | | o | changeset: 968:5512562ea7e2 | | user: hecht | | date: Tue Feb 07 20:25:58 2006 +0100 | | summary: add new example | | o | changeset: 967:87d1748924cd | | user: hecht | | date: Tue Feb 07 20:25:25 2006 +0100 | | summary: Correct missing free memory in case of exception in problem. | | o | changeset: 966:d72debe05e74 | | user: hecht | | date: Fri Feb 03 16:18:46 2006 +0100 | | summary: add exception in freefem++ language, the first test is working | | o | changeset: 965:646090715f8a | | user: hecht | | date: Fri Jan 27 22:47:48 2006 +0100 | | summary: add conf flag in README_WINDOWS | | o | changeset: 964:c396c1d7a8ff | | user: hecht | | date: Fri Jan 27 22:33:41 2006 +0100 | | summary: correct missing bluid of lapack in ARPACK if no lapack | | o | changeset: 963:09bf146e6970 | | user: hecht | | date: Fri Jan 27 21:07:55 2006 +0100 | | summary: correct missing include and link order under pure win32 architecture. | | o | changeset: 962:8167e2ba058c | | user: hecht | | date: Fri Jan 27 18:24:30 2006 +0100 | | summary: correct PB optim on G4 | | o | changeset: 961:10303c0ceeac | | user: hecht | | date: Fri Jan 27 16:43:49 2006 +0100 | | summary: correct PB optim on G5 | | o | changeset: 960:f0af0d499a0e | | user: hecht | | date: Fri Jan 27 15:59:08 2006 +0100 | | summary: correct pb in configure to find wget or curl for download | | o | changeset: 959:27b51c168d7d | | user: hecht | | date: Fri Jan 27 13:57:18 2006 +0100 | | summary: remove highlight test is no ide | | o | changeset: 958:7a51becb5c7c | | user: hecht | | date: Fri Jan 27 11:33:28 2006 +0100 | | summary: correct pb in installing apple version (zcat -> gunzip -c) | | o | changeset: 957:f8c6b851cd72 | | user: hecht | | date: Fri Jan 27 10:58:21 2006 +0100 | | summary: take account of mac intel | | o | changeset: 956:a3ac2888e73b | | user: hecht | | date: Thu Jan 26 10:16:47 2006 +0100 | | summary: add comment in configure.ac | | o | changeset: 955:5b4eee4361a3 | | user: hecht | | date: Mon Jan 23 22:13:34 2006 +0100 | | summary: correct small problem in configure.ac to build freefem on mac intel | | o | changeset: 954:2b768b55bef2 | | user: hecht | | date: Wed Jan 11 22:22:32 2006 +0100 | | summary: correct xcode projet + warning | | o | changeset: 953:892542425842 | | user: hecht | | date: Wed Jan 11 21:13:09 2006 +0100 | | summary: add xcode 2.2 build project for macos (see README_XCODE) | | o | changeset: 952:a3feaa34b941 | | user: hecht | | date: Mon Jan 09 15:42:41 2006 +0100 | | summary: small correct to use xcode of macos and to build bamg shell command | | o | changeset: 951:a4bcb6afa861 | | user: lehyaric | | date: Fri Jan 06 11:28:38 2006 +0100 | | summary: Changed ARPACK library reference for static compiling | | o | changeset: 950:f4a233463d32 | | user: lehyaric | | date: Fri Jan 06 10:51:44 2006 +0100 | | summary: Changed Debian packages documentation format from PS to PDF to reflect | | o | changeset: 949:1ae1db6e007a | | user: hecht | | date: Fri Jan 06 10:00:32 2006 +0100 | | summary: add building of bamg and cvsmsh2 command | | o | changeset: 948:2203e08d58df | | user: hecht | | date: Thu Jan 05 15:43:34 2006 +0100 | | summary: merging the source of bamg and the the bamg freefem++ part | | o | changeset: 947:a9d0713b4381 | | user: hecht | | date: Wed Jan 04 11:37:34 2006 +0100 | | summary: add read bamg geometry file with buildmesh function. | | o | changeset: 946:51f2fa717070 | | user: hecht | | date: Wed Jan 04 11:27:06 2006 +0100 | | summary: add build mesh from bamg geometry | | o | changeset: 945:71e91a1c79b1 | | user: lehyaric | | date: Wed Jan 04 10:18:26 2006 +0100 | | summary: New Debian package. | | o | changeset: 944:24ff5d45228e | | user: hecht | | date: Fri Dec 30 21:13:41 2005 +0100 | | summary: add forget file distribution | | o | changeset: 943:23e9c0f0a896 | | user: hecht | | date: Fri Dec 30 15:37:14 2005 +0100 | | summary: correct pb under Windows change environment to ffenvironment (Global variable) | | o | changeset: 942:d3e15f0496c5 | | user: hecht | | date: Fri Dec 30 12:23:06 2005 +0100 | | summary: pb global.cpp | | o | changeset: 941:893de561be72 | | user: hecht | | date: Fri Dec 30 12:02:47 2005 +0100 | | summary: correct compile error | | o | changeset: 940:8e45bd25850f | | user: hecht | | date: Fri Dec 30 11:53:15 2005 +0100 | | summary: correct pb uneder Windows with environment, put the def in Global.cpp | | o | changeset: 939:fe79bc21aee6 | | user: hecht | | date: Fri Dec 30 10:57:24 2005 +0100 | | summary: The search directory of load and include seems ok. | | o | changeset: 938:dd01c3dcc4cf | | user: hecht | | date: Fri Dec 30 08:34:34 2005 +0100 | | summary: correct environment.cpp under Windows (Pure) and add to bin-win32/Makefile | | o | changeset: 937:6eaa175ac89e | | user: hecht | | date: Thu Dec 29 17:30:49 2005 +0100 | | summary: add 3 environments varialbe FF_VERBOSITY, FF_INCLUDEPATH, FF_LOADPATH | | o | changeset: 936:ab89a4c85ef9 | | user: hecht | | date: Thu Dec 29 08:00:51 2005 +0100 | | summary: reman NSP1BR.edp in NSP2BRP0.edp | | o | changeset: 935:a0a4be528978 | | user: hecht | | date: Thu Dec 29 07:59:09 2005 +0100 | | summary: correct load.link (return compile compile error). | | o | changeset: 934:299e4f9ebabb | | user: hecht | | date: Thu Dec 29 07:46:23 2005 +0100 | | summary: add missing files | | o | changeset: 933:f07b38bd1772 | | user: hecht | | date: Wed Dec 28 15:00:04 2005 +0100 | | summary: *** empty log message *** | | o | changeset: 932:ae8b837389cf | | user: hecht | | date: Wed Dec 28 14:49:11 2005 +0100 | | summary: I make a huge cleanning in the figure of the DOC | | o | changeset: 931:8f09f074b924 | | user: hecht | | date: Tue Dec 27 22:26:40 2005 +0100 | | summary: correct the example++-load test | | o | changeset: 930:6406dda79272 | | user: hecht | | date: Tue Dec 27 17:32:25 2005 +0100 | | summary: Add two new finite element in examples++-load and change the doc | | o | changeset: 929:52e7e6fc6a98 | | user: hecht | | date: Tue Dec 27 07:54:01 2005 +0100 | | summary: add new Finite Element Bernardi-Raugel for Stokes or Navier-Stokes | | o | changeset: 928:4668e8f2bf42 | | user: hecht | | date: Mon Dec 26 17:28:50 2005 +0100 | | summary: Correct problem in boundary edge (lossing label numbers) in adapated mesh, savemesh, | | o | changeset: 927:b64cea081b9c | | user: lehyaric | | date: Tue Dec 13 13:44:58 2005 +0100 | | summary: Added first support for Doxygen documentation. Inline comments still need | | o | changeset: 926:16d64c61d6ed | | user: lehyaric | | date: Mon Dec 12 16:46:01 2005 +0100 | | summary: Changed --with-suffix configuration in configure.ac to avoid adding | | o | changeset: 925:6b38eb0bdbfb | | user: hecht | | date: Fri Dec 09 15:09:43 2005 +0100 | | summary: do autoreconf | | o | changeset: 924:93ba5ee1504b | | user: hecht | | date: Fri Dec 09 15:08:02 2005 +0100 | | summary: correct CCFLAGS in umfpack for test | | o | changeset: 923:7b3b757e62c9 | | user: hecht | | date: Fri Dec 09 11:34:49 2005 +0100 | | summary: add number of parameter in OneOperator class to 10 | | o | changeset: 922:aebb631a6aa3 | | user: lehyaric | | date: Fri Dec 09 10:20:36 2005 +0100 | | summary: symbols still showed in the Cygwin (not Mingw) version. This is now | | o | changeset: 921:db9963c894a5 | | user: hecht | | date: Fri Dec 09 09:36:19 2005 +0100 | | summary: add missing files in DOPC dist | | o | changeset: 920:16437453406f | | user: lehyaric | | date: Thu Dec 08 16:56:36 2005 +0100 | | summary: New Debian package version 2.1-1. | | o | changeset: 919:c838c9300480 | | user: lehyaric | | date: Thu Dec 08 10:01:47 2005 +0100 | | summary: Removed option --disable-tagging from configure.ac since @TAGGINGDEPEND@ | | o | changeset: 918:13204148cc8d | | user: hecht | | date: Thu Dec 08 07:59:02 2005 +0100 | | summary: correct LIBRARY problem for umfpack Demo | | o | changeset: 917:302b77b19c5c | | user: hecht | | date: Wed Dec 07 21:40:02 2005 +0100 | | summary: * correct mistake in quadarture formule in integral computation (nota | | o | changeset: 916:1280844b35e8 | | user: hecht | | date: Wed Dec 07 17:43:37 2005 +0100 | | summary: correct problem in umfpack with cblas | | o | changeset: 915:e89bd0a8d2d1 | | user: hecht | | date: Tue Dec 06 22:10:33 2005 +0100 | | summary: correct mistake in cblas on configure.ac | | o | changeset: 914:3383a8fb2e59 | | user: hecht | | date: Tue Dec 06 16:56:31 2005 +0100 | | summary: add new file | | o | changeset: 913:34d33d0493a1 | | user: hecht | | date: Tue Dec 06 16:55:19 2005 +0100 | | summary: Use umfpack 4.4, and correct some mistake in configure.ac | | o | changeset: 912:834165e44b24 | | user: lehyaric | | date: Tue Dec 06 12:18:56 2005 +0100 | | summary: Now compiles with gcc (GCC) 4.0.3 20051201 (prerelease) (Debian 4.0.2-5) | | o | changeset: 911:239106833256 | | user: hecht | | date: Fri Dec 02 11:02:00 2005 +0100 | | summary: Add the generation of an error if you try to set a solver on none square matrix, | | o | changeset: 910:589d0d1b27de | | user: hecht | | date: Wed Nov 30 13:18:19 2005 +0100 | | summary: /tmp/cvsBIs12d | | o | changeset: 909:8ea662ae978c | | user: lehyaric | | date: Tue Nov 29 11:45:03 2005 +0100 | | summary: Now dlopen() works even when ARPACK is downloaded | | o | changeset: 908:4e7335506261 | | user: hecht | | date: Mon Nov 28 16:28:25 2005 +0100 | | summary: add optimization of a*b expression if a ou b is zero. | | o | changeset: 907:88031075ba05 | | user: hecht | | date: Wed Nov 23 22:02:27 2005 +0100 | | summary: add roland correction in the doc. | | o | changeset: 906:c8d1e446dddd | | user: lehyaric | | date: Wed Nov 23 10:40:26 2005 +0100 | | summary: Added examples++-chapt3/all.edp into cleanregen.sh | | o | changeset: 905:3db52fd808f9 | | user: hecht | | date: Tue Nov 22 16:34:11 2005 +0100 | | summary: correct problem in algo and Newtow exemple (forgot 1/2 and 2) coef | | o | changeset: 904:788c50b38101 | | user: lehyaric | | date: Tue Nov 22 10:10:30 2005 +0100 | | summary: Arbitrary "wget" commands and parameters can be defined through the | | o | changeset: 903:ff51ba4da75e | | user: hecht | | date: Sat Nov 19 21:53:41 2005 +0100 | | summary: I just try autoreconf on my new mac. | | o | changeset: 902:4a6864be0e52 | | user: hecht | | date: Sat Nov 19 21:46:32 2005 +0100 | | summary: remove the wrong BlackShocle.edp example | | o | changeset: 901:aafe6f18031a | | user: hecht | | date: Wed Nov 16 11:56:55 2005 +0100 | | summary: correct the following trouble | | o | changeset: 900:2998977bc121 | | user: hecht | | date: Mon Nov 14 22:00:41 2005 +0100 | | summary: correct probleme when resize of full matrix, before the coef of the matrix | | o | changeset: 899:79398b5c2b4c | | user: lehyaric | | date: Wed Nov 09 15:13:15 2005 +0100 | | summary: New Debian packaging | | o | changeset: 898:af9a5fae5106 | | user: lehyaric | | date: Wed Nov 09 15:11:45 2005 +0100 | | summary: Changed Debian dependency from libfltk1.1c102 to libfltk1.1 | | o | changeset: 897:a87ee751e538 | | user: hecht | | date: Tue Nov 08 11:26:28 2005 +0100 | | summary: change in grammar lg.y misplaced ternary operator | | o | changeset: 896:6c6798e0e726 | | user: hecht | | date: Sun Nov 06 20:36:35 2005 +0100 | | summary: uodate INNOVATION file | | o | changeset: 895:e0176cafeeca | | user: hecht | | date: Sun Nov 06 20:26:24 2005 +0100 | | summary: change the tolerance value un mshptg form 2^-15 to 2^-30 if the computation in long long | | o | changeset: 894:76b1f65a3b90 | | user: hecht | | date: Wed Nov 02 22:29:12 2005 +0100 | | summary: add files | | o | changeset: 893:04dd48fbf3d6 | | user: hecht | | date: Wed Nov 02 22:06:12 2005 +0100 | | summary: addinf missing files | | o | changeset: 892:b32338c130bd | | user: hecht | | date: Wed Nov 02 22:04:13 2005 +0100 | | summary: correct small mistake in the doc | | o | changeset: 891:af006f72e7b8 | | user: lehyaric | | date: Wed Nov 02 10:46:14 2005 +0100 | | summary: New Debian packages | | o | changeset: 890:a3a685d549f6 | | user: hecht | | date: Tue Nov 01 17:52:59 2005 +0100 | | summary: correct windows install file and load.link under windows | | o | changeset: 889:991fc4be5f2b | | user: hecht | | date: Tue Nov 01 17:08:57 2005 +0100 | | summary: correct problem in array operator /= | | o | changeset: 888:c32a725f21b6 | | user: hecht | | date: Tue Nov 01 16:55:32 2005 +0100 | | summary: correct src/bin-win32 Makefile.am | | o | changeset: 887:3ef99e3bd6ae | | user: hecht | | date: Tue Nov 01 14:14:07 2005 +0100 | | summary: split AFunction3.cpp in 3 files array_{long,real,double}.cpp | | o | changeset: 886:92f491c4331f | | user: hecht | | date: Mon Oct 31 22:34:02 2005 +0100 | | summary: *** empty log message *** | | o | changeset: 885:d8267da311f1 | | user: hecht | | date: Mon Oct 31 17:45:53 2005 +0100 | | summary: - Correction de bug UMFPACK resolution complex problem | | o | changeset: 884:6c4e84a1a8ac | | user: hecht | | date: Sun Oct 30 17:26:35 2005 +0100 | | summary: *** empty log message *** | | o | changeset: 883:0028bacc3e62 | | user: hecht | | date: Sun Oct 30 17:06:33 2005 +0100 | | summary: correct problem in eigen value computation | | o | changeset: 882:706ef465f936 | | user: lehyaric | | date: Thu Oct 27 19:09:00 2005 +0200 | | summary: Change MPI package name to keep up with Debian Unstable | | o | changeset: 881:72a8fd466c6f | | user: lehyaric | | date: Thu Oct 27 18:22:43 2005 +0200 | | summary: Places examples++-other last because it contains speed tests which | | o | changeset: 880:0dde809ed55f | | user: lehyaric | | date: Thu Oct 27 17:51:19 2005 +0200 | | summary: - Improved the way configure finds libXxf86vm.a | | o | changeset: 879:c085ef504236 | | user: hecht | | date: Fri Oct 21 18:18:09 2005 +0200 | | summary: Try to correct problem in win32 version | | o | changeset: 878:aa56fd6dc7ba | | user: hecht | | date: Fri Oct 21 17:27:42 2005 +0200 | | summary: add .edp file in example++-eigen dir | | o | changeset: 877:d45005b94b3d | | user: lehyaric | | date: Thu Oct 20 16:22:05 2005 +0200 | | summary: Compiling with the Cygwin DLL is now OK again | | o | changeset: 876:6f055a07e3c3 | | user: lehyaric | | date: Thu Oct 20 15:46:22 2005 +0200 | | summary: configure.ac now dynamically checks for libXxf86vm.a | | o | changeset: 875:32d5c81f8e05 | | user: lehyaric | | date: Thu Oct 20 11:56:16 2005 +0200 | | summary: New manual included in Debian packages | | o | changeset: 874:c4f11df6192f | | user: hecht | | date: Wed Oct 19 16:05:20 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 873:ba8e3a039026 | | user: hecht | | date: Wed Oct 19 16:01:24 2005 +0200 | | summary: correct doc file in Mac vercion | | o | changeset: 872:97c5169b06d6 | | user: hecht | | date: Wed Oct 19 15:27:56 2005 +0200 | | summary: add link on Desktop to example | | o | changeset: 871:ee0c20283445 | | user: lehyaric | | date: Wed Oct 19 15:23:03 2005 +0200 | | summary: HISTORY update | | o | changeset: 870:87b7436af068 | | user: lehyaric | | date: Wed Oct 19 15:22:56 2005 +0200 | | summary: Packaging version 2. | | o | changeset: 869:3663c2fee3a6 | | user: hecht | | date: Wed Oct 19 14:31:19 2005 +0200 | | summary: correct misspelling in previous modif | | o | changeset: 868:0bd5255c4bd5 | | user: hecht | | date: Wed Oct 19 14:20:39 2005 +0200 | | summary: coorect PB LogoUMPC | | o | changeset: 867:2e63a3e9ca9e | | user: hecht | | date: Wed Oct 19 14:14:17 2005 +0200 | | summary: correct overflow in elem mat when assembling skyline matrix | | o | changeset: 866:adc2ee0d01fe | | user: hecht | | date: Tue Oct 18 17:27:16 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 865:5373ad791840 | | user: hecht | | date: Tue Oct 18 13:41:20 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 864:d801079ba411 | | user: hecht | | date: Tue Oct 18 13:29:44 2005 +0200 | | summary: add .cpp in load.link command in example++-load/Makefile.am | | o | changeset: 863:0bb65f785e1f | | user: hecht | | date: Tue Oct 18 13:14:21 2005 +0200 | | summary: correct return type probleme LinearCG | | o | changeset: 862:af063a43f41d | | user: hecht | | date: Tue Oct 18 11:56:38 2005 +0200 | | summary: correct same problem when passing array as argument. | | o | changeset: 861:15a2ea7f7e31 | | user: pironnea | | date: Mon Oct 17 09:54:27 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 860:c484b5dfde1d | | user: hecht | | date: Mon Oct 17 07:26:43 2005 +0200 | | summary: DOC upgrading | | o | changeset: 859:c0e097480736 | | user: hecht | | date: Sun Oct 16 19:48:40 2005 +0200 | | summary: correct small listake in window version | | o | changeset: 858:053d6a1895bd | | user: hecht | | date: Sat Oct 15 16:28:49 2005 +0200 | | summary: in configure in case off --enable_download don't locat to find an arpack library | | o | changeset: 857:46f7d68bc496 | | user: hecht | | date: Fri Oct 14 11:52:34 2005 +0200 | | summary: doc book continuing | | o | changeset: 856:12c305f56de6 | | user: hecht | | date: Thu Oct 13 16:23:46 2005 +0200 | | summary: change the title page of the doc for publishing | | o | changeset: 855:d3e62fa2a587 | | user: pironnea | | date: Thu Oct 13 11:48:28 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 854:5313bf2fd39a | | user: pironnea | | date: Thu Oct 13 11:34:36 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 853:128f45f7d2c2 | | user: hecht | | date: Wed Oct 12 22:22:47 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 852:221e441ef33a | | user: hecht | | date: Wed Oct 12 21:20:57 2005 +0200 | | summary: add forgotten files | | o | changeset: 851:47f4d245d855 | | user: hecht | | date: Wed Oct 12 21:09:23 2005 +0200 | | summary: update HISTORY | | o | changeset: 850:0a5d2156274e | | user: hecht | | date: Wed Oct 12 21:08:29 2005 +0200 | | summary: Add makefile to build automaticaly the FreeFem++ version with dll | | o | changeset: 849:09368a95147b | | user: pironnea | | date: Wed Oct 12 18:20:27 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 848:9b451b2bff88 | | user: hecht | | date: Wed Oct 12 17:50:50 2005 +0200 | | summary: coorect freefem++doc.tex | | o | changeset: 847:60473c6ec0a3 | | user: hecht | | date: Wed Oct 12 16:09:25 2005 +0200 | | summary: just add mising eps file | | o | changeset: 846:7053f50276e4 | | user: hecht | | date: Wed Oct 12 15:42:06 2005 +0200 | | summary: do correct in the manual, make big change in the dynamic load, see the maunal | | o | changeset: 845:3cb796a22b5d | | user: hecht | | date: Tue Oct 04 20:31:41 2005 +0200 | | summary: correct small mistake in load.cpp i -> j | | o | changeset: 844:2a1740f12cd1 | | user: hecht | | date: Tue Oct 04 18:17:48 2005 +0200 | | summary: change the version number to build new window version. | | o | changeset: 843:1d5169284e4c | | user: hecht | | date: Tue Oct 04 17:26:58 2005 +0200 | | summary: correct overflow integer array in elementary martix | | o | changeset: 842:cd2ddded3fe8 | | user: hecht | | date: Tue Oct 04 11:44:01 2005 +0200 | | summary: correct small proble in load.cpp | | o | changeset: 841:83c6f67e8571 | | user: hecht | | date: Tue Sep 27 22:35:41 2005 +0200 | | summary: correct load.cpp to change suffix and prefix | | o | changeset: 840:86a63de90bd6 | | user: hecht | | date: Mon Sep 26 18:03:57 2005 +0200 | | summary: small correction for buildng the Window version | | o | changeset: 839:8d1d0e79e8f2 | | user: hecht | | date: Mon Sep 26 14:42:40 2005 +0200 | | summary: add bin-win32 dir to bluid win32 executable with .dll files | | o | changeset: 838:478cefc531be | | user: hecht | | date: Fri Sep 23 17:11:31 2005 +0200 | | summary: version 1.48-1 | | o | changeset: 837:00683068609c | | user: lehyaric | | date: Thu Sep 22 12:01:49 2005 +0200 | | summary: FreeFem++ works on Linux (Debian Testing) thanks to the following | | o | changeset: 836:3c745b9c0391 | | user: hecht | | date: Wed Sep 21 21:04:58 2005 +0200 | | summary: correct bug in set array of array to array of reverse | | o | changeset: 835:d08a7fe8d64b | | user: lehyaric | | date: Wed Sep 21 14:52:28 2005 +0200 | | summary: Added new examples++-chapt3 directory to Windows distribution | | o | changeset: 834:37968b5d3aa4 | | user: hecht | | date: Fri Sep 09 15:27:40 2005 +0200 | | summary: change the reconstruction of strversionnumber.cpp | | o | changeset: 833:5ed4006dc572 | | user: hecht | | date: Fri Sep 09 15:19:14 2005 +0200 | | summary: create ref.edp file (empty today) | | o | changeset: 832:541c3f59571d | | user: hecht | | date: Fri Sep 09 15:17:10 2005 +0200 | | summary: add examples++-chapt3 stuff | | o | changeset: 831:d0b4babe44bc | | user: hecht | | date: Fri Sep 09 14:30:50 2005 +0200 | | summary: add new include file | | o | changeset: 830:ec7cf2a5bb56 | | user: hecht | | date: Fri Sep 09 13:45:37 2005 +0200 | | summary: correct missing .esp file in Makefile.am | | o | changeset: 829:385fa7cb90cf | | user: hecht | | date: Fri Sep 09 13:27:16 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 828:17e148260e7d | | user: hecht | | date: Fri Sep 09 13:25:55 2005 +0200 | | summary: add threehsv.eps file | | o | changeset: 827:561442bc79b4 | | user: hecht | | date: Wed Aug 31 15:53:14 2005 +0200 | | summary: add new arithmetic if expression ( (a ? b : c) like in c++ | | o | changeset: 826:908ddb527637 | | user: hecht | | date: Tue Aug 30 16:56:27 2005 +0200 | | summary: correct unmissing print in case of verbosity = 0 . | | o | changeset: 825:0a55e1d02298 | | user: hecht | | date: Tue Aug 30 14:58:44 2005 +0200 | | summary: correct color in window version | | o | changeset: 824:f54ced8e4821 | | user: hecht | | date: Tue Aug 30 13:36:53 2005 +0200 | | summary: Add tool to change the color table of plot: | | o | changeset: 823:95d85c693298 | | user: hecht | | date: Thu Aug 25 14:23:19 2005 +0200 | | summary: add new freefem++ documentation freefem++doc.pdf ( from O. Pironneau) | | o | changeset: 822:6ac1c6bfc617 | | user: lehyaric | | date: Fri Jul 15 14:11:49 2005 +0200 | | summary: Removed "restricted" option from FreeFem++-cs (the Web service does | | o | changeset: 821:8508a9315ab1 | | user: lehyaric | | date: Wed Jul 13 13:40:51 2005 +0200 | | summary: Removed references to undefined class "TheSubFMortars" | | o | changeset: 820:546ff9fb4445 | | user: hecht | | date: Wed Jul 13 12:10:21 2005 +0200 | | summary: OK, we can make dll under window. first test | | o | changeset: 819:4f9e6ba028ac | | user: hecht | | date: Tue Jul 12 11:22:20 2005 +0200 | | summary: Big modif to buil .dll under window ( it's hard) | | o | changeset: 818:5e1096ec1eb9 | | user: hecht | | date: Thu Jul 07 09:50:47 2005 +0200 | | summary: find a new bug in cas if we declare new variable after a break, continue or a return | | o | changeset: 817:e03e5f78e5fe | | user: hecht | | date: Tue Jul 05 16:24:31 2005 +0200 | | summary: correct problem in meshsplit function in case of final mesh with hole and | | o | changeset: 816:5fc7ff0dcbe0 | | user: hecht | | date: Tue Jul 05 13:11:24 2005 +0200 | | summary: change version to 1.47-3 | | o | changeset: 815:f62d00cabf0e | | user: lehyaric | | date: Tue Jul 05 11:48:44 2005 +0200 | | summary: Tuning scripts for Debian amd64 packaging | | o | changeset: 814:e74d584065c5 | | user: lehyaric | | date: Mon Jul 04 17:29:41 2005 +0200 | | summary: Re-enables PDF and PS documentation in Windows packaging after finding the | | o | changeset: 813:e9430e4f4bac | | user: lehyaric | | date: Mon Jul 04 16:42:49 2005 +0200 | | summary: Removed wrong dynamic linking option bug from configure.ac | | o | changeset: 812:edd3b1cd9f6d | | user: lehyaric | | date: Mon Jul 04 16:26:14 2005 +0200 | | summary: Added "-fPIC" in compilation options for 64 bit Linux | | o | changeset: 811:e5e1da1b1bfe | | user: hecht | | date: Mon Jul 04 15:55:23 2005 +0200 | | summary: correct problem in antype castting under window | | o | changeset: 810:1cb5cd176bfb | | user: lehyaric | | date: Mon Jul 04 14:57:26 2005 +0200 | | summary: Removed documentation from Windows executable package because PDF and PS | | o | changeset: 809:b91b4cb1848d | | user: lehyaric | | date: Mon Jul 04 13:59:34 2005 +0200 | | summary: Changed Debian package dependency from "arpack++" to "libarpack++2-dev" | | o | changeset: 808:152b0171eb45 | | user: lehyaric | | date: Mon Jul 04 13:30:16 2005 +0200 | | summary: Changing packaging procedure to include new FreeFem++-cs binaries | | o | changeset: 807:e18fc97ba94a | | user: lehyaric | | date: Mon Jul 04 13:28:59 2005 +0200 | | summary: Changing packaging procedure to include FreeFem++-cs binaries. | | o | changeset: 806:6e6d817fee3d | | user: lehyaric | | date: Fri Jul 01 17:04:59 2005 +0200 | | summary: Added 64bit debian package (amd64) | | o | changeset: 805:bf4bd6f52606 | | user: lehyaric | | date: Fri Jul 01 15:21:40 2005 +0200 | | summary: Changed makefile to be able to run the Debian packaging procedure. | | o | changeset: 804:13a708e99d11 | | user: lehyaric | | date: Fri Jul 01 14:23:32 2005 +0200 | | summary: Minor modifications in 'clean' goal. | | o | changeset: 803:3973b9916156 | | user: lehyaric | | date: Fri Jul 01 12:08:40 2005 +0200 | | summary: New package (1.47-2) currently being built | | o | changeset: 802:93740702390d | | user: lehyaric | | date: Fri Jul 01 11:59:51 2005 +0200 | | summary: Building a new package | | o | changeset: 801:507bab956933 | | user: hecht | | date: Fri Jul 01 11:43:15 2005 +0200 | | summary: correct problem with splitmesh with internal boundary | | o | changeset: 800:d450da38d40c | | user: lehyaric | | date: Fri Jul 01 10:57:28 2005 +0200 | | summary: Test examples++-tutorial/freeboundary-weak also disabled from regression | | o | changeset: 799:447f53a0dbac | | user: lehyaric | | date: Fri Jul 01 10:34:10 2005 +0200 | | summary: Disabling example examples++-tutorial/freeboundary.edp from regression tests | | o | changeset: 798:5b0c1d07bccd | | user: lehyaric | | date: Thu Jun 30 12:22:20 2005 +0200 | | summary: Configuration procedure updated with new Cygin/Mingw parameters | | o | changeset: 797:93549d7d0176 | | user: lehyaric | | date: Thu Jun 30 12:08:30 2005 +0200 | | summary: Standard libraries locations have changed under Cygwin/Mingw | | o | changeset: 796:8a5fb70aa981 | | user: hecht | | date: Thu Jun 30 08:10:30 2005 +0200 | | summary: add FE-medit.edp example to show plot of FE a basis function (FH) | | o | changeset: 795:bfa6725fe254 | | user: hecht | | date: Wed Jun 29 21:40:48 2005 +0200 | | summary: Add a new finite element P0edge to build new error indicator | | o | changeset: 794:907fe04bf4f0 | | user: lehyaric | | date: Wed Jun 29 15:00:05 2005 +0200 | | summary: configure.ac now checks whether flex is compatible with bison. Otherwise | | o | changeset: 793:4058e691fedf | | user: lehyaric | | date: Wed Jun 29 13:59:35 2005 +0200 | | summary: Added some comments inside lex files about producing bison-compatible lexers | | o | changeset: 792:62d20e3691fe | | user: lehyaric | | date: Wed Jun 29 11:57:36 2005 +0200 | | summary: Options bison-bridge and bison-locations are not recognized undef cygwin | | o | changeset: 791:ca53d6b490fb | | user: lehyaric | | date: Wed Jun 29 11:52:45 2005 +0200 | | summary: At the moment, FreeFem++ does not compile under Cygwin because of problems | | o | changeset: 790:a78f87e4a2f0 | | user: lehyaric | | date: Wed Jun 29 10:10:33 2005 +0200 | | summary: Added a new configure option "--disable-tagging" to speed up | | o | changeset: 789:f4101f1de341 | | user: hecht | | date: Tue Jun 28 11:44:33 2005 +0200 | | summary: add instruction to copy sub array in array | | o | changeset: 788:a0c72c4364df | | user: lehyaric | | date: Tue Jun 28 11:27:01 2005 +0200 | | summary: Color-coding in FreeFem++-cs now colors multi-line comments (/* | | o | changeset: 787:d9dae2e4a837 | | user: lehyaric | | date: Tue Jun 28 11:07:36 2005 +0200 | | summary: FreeFem++-cs no longer crashes under Windows when loading a second EDP program | | o | changeset: 786:07e403bc9c4d | | user: hecht | | date: Tue Jun 28 10:23:24 2005 +0200 | | summary: correct trouble in block matrix with transpiose sub matrix | | o | changeset: 785:77dc6490a932 | | user: hecht | | date: Mon Jun 27 16:23:51 2005 +0200 | | summary: add tools to build bock matrices like | | o | changeset: 784:a8b2df79833e | | user: hecht | | date: Thu Jun 23 13:27:55 2005 +0200 | | summary: to add Highlighting Patterns for nedit editor of .edp file., do | | o | changeset: 783:8801d1801347 | | user: hecht | | date: Sun Jun 19 21:09:11 2005 +0200 | | summary: Add way to bluid matrix with varf on different meshes. | | o | changeset: 782:96d9ef496911 | | user: hecht | | date: Fri Jun 10 16:33:43 2005 +0200 | | summary: coorect error in add | | o | changeset: 781:bbebd79e4d3d | | user: hecht | | date: Fri Jun 10 16:23:11 2005 +0200 | | summary: correct some spelling error | | o | changeset: 780:51598cdf173d | | user: hecht | | date: Thu Jun 09 15:48:48 2005 +0200 | | summary: add computation of eigen value for complex matrix | | o | changeset: 779:5a11859ad82a | | user: hecht | | date: Thu Jun 02 15:56:06 2005 +0200 | | summary: correct une function name in Pcrgraph.cpp | | o | changeset: 778:60033de30615 | | user: hecht | | date: Thu Jun 02 15:02:09 2005 +0200 | | summary: try to build a dll file continuing. | | o | changeset: 777:3a9aa1ef97c4 | | user: hecht | | date: Thu Jun 02 13:58:02 2005 +0200 | | summary: *** empty log message *** | | o | changeset: 776:ed24b0f0f4df | | user: hecht | | date: Thu Jun 02 13:56:57 2005 +0200 | | summary: correct doible name (CodeAlloc.cpp) in fflib/Makefile.am | | o | changeset: 775:615a4b420050 | | user: hecht | | date: Thu Jun 02 13:54:33 2005 +0200 | | summary: continuing solve problem to make a dll file of freefem | | o | changeset: 774:4cca7ee6dfc1 | | user: hecht | | date: Wed Jun 01 22:52:42 2005 +0200 | | summary: Do big modification in rgraph.hpp: | | o | changeset: 773:200f008bc381 | | user: hecht | | date: Thu May 12 11:16:59 2005 +0200 | | summary: correct problem of CFMessagePort: bootstrap_register() | | o | changeset: 772:6f30a07c0403 | | user: hecht | | date: Wed May 11 15:17:06 2005 +0200 | | summary: cosmetic change in PC version | | o | changeset: 771:12b8179f350f | | user: hecht | | date: Wed May 11 11:21:00 2005 +0200 | | summary: correct problem in acoptim.m4 (g++-4 and -fast optim flags) | | o | changeset: 770:5864a10636d1 | | user: hecht | | date: Wed May 11 10:09:40 2005 +0200 | | summary: add CXX and CC setting in fltk configure parameters | | o | changeset: 769:d9d6bd29c106 | | user: hecht | | date: Tue May 10 21:19:18 2005 +0200 | | summary: add include in some ide files (FH) | | o | changeset: 768:de52b6df4ea1 | | user: hecht | | date: Wed May 04 22:29:42 2005 +0200 | | summary: add examples++tutorial/xyf file in window distribution | | o | changeset: 767:ec5efeca8fb4 | | user: hecht | | date: Wed May 04 22:04:25 2005 +0200 | | summary: add aile.msh in window distribution | | o | changeset: 766:b753e46694a8 | | user: hecht | | date: Wed May 04 21:59:52 2005 +0200 | | summary: correct line endding in aile.msh file (make as unix file) | | o | changeset: 765:054a01ff942d | | user: hecht | | date: Wed May 04 21:13:44 2005 +0200 | | summary: correct DOC/Makefile.am | | o | changeset: 764:62ed86008444 | | user: hecht | | date: Wed May 04 21:01:05 2005 +0200 | | summary: correct the DOC directory and do autoreconf | | o | changeset: 763:00dacf8de9d8 | | user: hecht | | date: Wed May 04 19:56:36 2005 +0200 | | summary: clean the DOC directory to build manual-full and | | o | changeset: 762:4d0d7644df80 | | user: hecht | | date: Wed May 04 14:26:02 2005 +0200 | | summary: rebuil all.edp in examples++-tutorial (to remove ref to bug.edp) | | o | changeset: 761:810491481429 | | user: hecht | | date: Wed May 04 13:09:15 2005 +0200 | | summary: do autoreconf to rebuild Makefile.in files | | o | changeset: 760:8aca6e010f53 | | user: hecht | | date: Wed May 04 13:06:48 2005 +0200 | | summary: add 10^10 and 10.^10 operator (due to error in sphere .edp) | | o | changeset: 759:70c5c7c03926 | | user: hecht | | date: Tue May 03 16:25:39 2005 +0200 | | summary: remove pascal in "\p " macos version | | o | changeset: 758:ec2b000b022c | | user: hecht | | date: Tue May 03 15:12:06 2005 +0200 | | summary: try to compile with de idm compiler xlc++ | | o | changeset: 757:379de2f9fa7d | | user: hecht | | date: Mon May 02 10:57:59 2005 +0200 | | summary: do correction for g++-4.0 | | o | changeset: 756:fdaaafdd2726 | | user: hecht | | date: Wed Apr 27 14:23:44 2005 +0200 | | summary: do correction for g++ version 4.0 (new apple compiler on Tiger) | | o | changeset: 755:f90afd98be49 | | user: lehyaric | | date: Fri Apr 22 11:58:39 2005 +0200 | | summary: Debug checks are ok on Debian Testing | | o | changeset: 754:25358d1c2fac | | user: hecht | | date: Sun Apr 17 18:44:03 2005 +0200 | | summary: add page to explain how to bluid weak form with Robin / Neumann coundary condition | | o | changeset: 753:5dec2ffefbd4 | | user: hecht | | date: Sat Apr 16 21:36:09 2005 +0200 | | summary: add tool to solve variationnal inequality | | o | changeset: 752:95a33493c392 | | user: hecht | | date: Fri Apr 15 22:06:03 2005 +0200 | | summary: add tools to solve variationnal inequality | | o | changeset: 751:b9a7054a3c47 | | user: lehyaric | | date: Wed Apr 13 11:58:49 2005 +0200 | | summary: IDE compiles again under MingW (an include file was missing) | | o | changeset: 750:3cba4b225729 | | user: hecht | | date: Tue Apr 12 18:37:37 2005 +0200 | | summary: add Modification Kohji Ohtsuka in a manual | | o | changeset: 749:1097a5ea6a9b | | user: hecht | | date: Tue Apr 12 12:07:29 2005 +0200 | | summary: add flags to build unionkjack mesh on square | | o | changeset: 748:80ebe655fe59 | | user: lehyaric | | date: Tue Apr 05 15:08:18 2005 +0200 | | summary: FreeFem+-ide compiles on MacOS X | | o | changeset: 747:dd5a71e36e2b | | user: lehyaric | | date: Tue Apr 05 14:33:49 2005 +0200 | | summary: First version of FreeFem++-ide without sockets compiles under Linux | | o | changeset: 746:74899325800e | | user: hecht | | date: Wed Mar 30 11:38:14 2005 +0200 | | summary: correct name of example blakschol.edp in BlackSchole.edp | | o | changeset: 745:d4ef47df5261 | | user: lehyaric | | date: Wed Mar 30 11:02:34 2005 +0200 | | summary: Not regenerating HISTORY if not in a CVS working area | | o | changeset: 744:8f628e467da3 | | user: hecht | | date: Wed Mar 30 10:42:49 2005 +0200 | | summary: correct some mistake in Makefile.am (in: examples++-load/, src/ide/) | | o | changeset: 743:9ead41b56331 | | user: hecht | | date: Wed Mar 30 09:31:27 2005 +0200 | | summary: adding 2 new files for allocation (forgot in previous commit) | | o | changeset: 742:5bed47d8b18c | | user: hecht | | date: Tue Mar 29 23:13:16 2005 +0200 | | summary: Big change in code generation alloc (work in progress) | | o | changeset: 741:24711fe2923e | | user: hecht | | date: Fri Mar 25 17:59:22 2005 +0100 | | summary: correct bug in trunc function: | | o | changeset: 740:73864219f12e | | user: lehyaric | | date: Fri Mar 25 14:54:25 2005 +0100 | | summary: Compiling ok on Linux | | o | changeset: 739:a76f21b1ab1e | | user: lehyaric | | date: Fri Mar 25 12:37:07 2005 +0100 | | summary: Client and server merged into one unique executable to make sure that the client can find its server program, even through symbolic links. | | o | changeset: 738:1bbb4cafbb9b | | user: lehyaric | | date: Thu Mar 17 14:15:31 2005 +0100 | | summary: Included src/lglib/lg.tab.?pp in cleanregen.sh | | o | changeset: 737:8d7e1b3ebe28 | | user: lehyaric | | date: Thu Mar 17 14:13:42 2005 +0100 | | summary: Replaced sem_getvalue() with a separate counter on MacOSX. | | o | changeset: 736:a92e3f968ecc | | user: hecht | | date: Wed Mar 16 22:28:55 2005 +0100 | | summary: add tool to get number of mesh triangle contening a point (x,y) | | o | changeset: 735:31983afb5ba0 | | user: hecht | | date: Wed Mar 16 15:37:32 2005 +0100 | | summary: correct prototype of StrVersionNumber in macrgraf | | o | changeset: 734:f1c10c96352d | | user: lehyaric | | date: Wed Mar 16 15:05:14 2005 +0100 | | summary: Updates to the no-F77 no-C configuration | | o | changeset: 733:c6b1f76c3c5f | | user: lehyaric | | date: Wed Mar 16 14:41:57 2005 +0100 | | summary: Fortran and C compilers are now optional (if they are missing, | | o | changeset: 732:e6c08627d1d6 | | user: hecht | | date: Wed Mar 16 12:08:00 2005 +0100 | | summary: correct error in prototype of StrVersionNumber and | | o | changeset: 731:8f0890d47a88 | | user: hecht | | date: Sun Mar 13 16:32:09 2005 +0100 | | summary: correct compilation problem in RNM (resize) with g++3.4 (add this->) | | o | changeset: 730:52c5da835984 | | user: lehyaric | | date: Wed Mar 02 11:50:19 2005 +0100 | | summary: Correcting compilation problem on RedHat | | o | changeset: 729:d2dfa98a26fd | | user: lehyaric | | date: Wed Mar 02 11:29:12 2005 +0100 | | summary: New packaging including FreeFem++-cs features: fast graphics, grammar highlighting, error-line display | | o | changeset: 728:4125f650c69b | | user: lehyaric | | date: Wed Mar 02 11:22:00 2005 +0100 | | summary: FreeFem++-cs MinGW bug corrected: does not crash anymore when reading a file name from the command line | | o | changeset: 727:59c2e9b5f8a2 | | user: lehyaric | | date: Tue Mar 01 16:06:32 2005 +0100 | | summary: Removed unnecessary #includes | | o | changeset: 726:b476e6a9aa5a | | user: lehyaric | | date: Tue Mar 01 14:21:52 2005 +0100 | | summary: Segmentation violation error while loading a file from the command line in FreeFem++-cs. Debugging in progress. | | o | changeset: 725:73070a97038f | | user: lehyaric | | date: Mon Feb 28 11:40:10 2005 +0100 | | summary: Now compiling fine on MinGW | | o | changeset: 724:9ad116514e1c | | user: lehyaric | | date: Fri Feb 25 16:14:13 2005 +0100 | | summary: FreeFem++-cs: compile-time or runtime errors are now highlighted in the | | o | changeset: 723:a963794aad0d | | user: lehyaric | | date: Fri Feb 25 13:10:25 2005 +0100 | | summary: More coherency checks in configure.ac for a correct MPI installation. | | o | changeset: 722:5b390b867211 | | user: lehyaric | | date: Fri Feb 25 10:50:26 2005 +0100 | | summary: Added new "resize" reserved word into the highlighting grammar. | | o | changeset: 721:fb36b11fd57c | | user: hecht | | date: Thu Feb 24 21:27:23 2005 +0100 | | summary: correct the documentation | | o | changeset: 720:b8fb25f14bbb | | user: hecht | | date: Thu Feb 24 20:44:20 2005 +0100 | | summary: correct mistake in return type in complex mean and jump new function (FH) | | o | changeset: 719:347d7fdaf605 | | user: hecht | | date: Thu Feb 24 15:33:21 2005 +0100 | | summary: resize of array and matrices, continuing | | o | changeset: 718:05352247ee60 | | user: hecht | | date: Thu Feb 24 15:32:36 2005 +0100 | | summary: add resize of int,real and complex array or matrices, exemple: | | o | changeset: 717:237af51c2d16 | | user: hecht | | date: Thu Feb 24 09:44:21 2005 +0100 | | summary: correct bug in array of complex FE function like | | o | changeset: 716:0b0233d67ebb | | user: lehyaric | | date: Wed Feb 23 15:51:03 2005 +0100 | | summary: Highlighting test procedure not ready for regression tests yet: disabled | | o | changeset: 715:d6cd82cad75c | | user: lehyaric | | date: Wed Feb 23 15:22:05 2005 +0100 | | summary: "testhighlight" regression tests now work up to (but not including) array.edp | | o | changeset: 714:fb6575626cdc | | user: lehyaric | | date: Wed Feb 23 14:50:49 2005 +0100 | | summary: Added highlighting grammar files into CVS, in case the compiling environment | | o | changeset: 713:81e3198dfed6 | | user: lehyaric | | date: Wed Feb 23 13:44:31 2005 +0100 | | summary: The HISTORY file is now created from CVS logs thanks to "cvs2cl". | | o | changeset: 712:349dc15fb839 | | user: lehyaric | | date: Wed Feb 23 12:45:15 2005 +0100 | | summary: FreeFem++-cs: grammar-driven syntax highlighting works on | | o | changeset: 711:8871b1b4c0bb | | user: hecht | | date: Wed Feb 23 10:49:35 2005 +0100 | | summary: add jump and mean of complex function. | | o | changeset: 710:c7e0c39689ca | | user: lehyaric | | date: Fri Feb 18 20:13:24 2005 +0100 | | summary: FreeFem++-cs syntax highlighting is now highlights keywords based on their | | o | changeset: 709:6b9cc14429a3 | | user: hecht | | date: Fri Feb 18 18:00:08 2005 +0100 | | summary: ajoute d'un test d'erreur | | o | changeset: 708:c442c6ae9737 | | user: lehyaric | | date: Thu Feb 17 16:02:34 2005 +0100 | | summary: Added new developments | | o | changeset: 707:051b3deb6ac4 | | user: lehyaric | | date: Thu Feb 17 15:05:22 2005 +0100 | | summary: Compiles on MacOS X. | | o | changeset: 706:b93878dc57dd | | user: lehyaric | | date: Thu Feb 17 14:27:03 2005 +0100 | | summary: First working version of syntax highlighting through grammar file in | | o | changeset: 705:ed842e9da7aa | | user: hecht | | date: Wed Feb 16 18:13:38 2005 +0100 | | summary: 3D continuing + truc | | o | changeset: 704:9b85196f1bca | | user: lehyaric | | date: Wed Feb 16 13:44:24 2005 +0100 | | summary: Socket buffering is now limited to avoid random communication errors. | | o | changeset: 703:ca5e14fc546c | | user: lehyaric | | date: Mon Feb 14 17:22:24 2005 +0100 | | summary: Socket communication between client and server in FreeFem++-cs has been | | o | changeset: 702:caeeecdd92b9 | | user: hecht | | date: Fri Feb 11 22:20:32 2005 +0100 | | summary: complet DOC | | o | changeset: 701:10f42008bce2 | | user: hecht | | date: Fri Feb 11 18:00:16 2005 +0100 | | summary: add 2 new quadrature formular qf7pT and qf9pT with respectively 15 and 21 points | | o | changeset: 700:c2f60527abb5 | | user: hecht | | date: Tue Feb 08 17:26:15 2005 +0100 | | summary: add 3D stuff in quadtree | | o | changeset: 699:42115bed3c70 | | user: lehyaric | | date: Tue Feb 08 16:52:02 2005 +0100 | | summary: Updated TODO list for FreeFem++-cs | | o | changeset: 698:1cbe06a20efc | | user: lehyaric | | date: Tue Feb 08 16:18:08 2005 +0100 | | summary: Dynamic loading is now disabled if dlopen() does not link properly | | o | changeset: 697:b17a41e40e1b | | user: hecht | | date: Tue Feb 08 15:18:51 2005 +0100 | | summary: add buildmesh example with nbvx= named parameter | | o | changeset: 696:662cf549f14b | | user: lehyaric | | date: Tue Feb 08 14:23:24 2005 +0100 | | summary: New Debian package | | o | changeset: 695:ef360bad2ed9 | | user: lehyaric | | date: Fri Feb 04 16:47:21 2005 +0100 | | summary: Now checks that FLTK is compiled with threads before accepting it. | | o | changeset: 694:3b58d5c49afb | | user: lehyaric | | date: Fri Feb 04 16:24:44 2005 +0100 | | summary: Patchs de configuration proposés par Thierry Thomas pour FreeBSD intégrés. | | o | changeset: 693:9af00658c499 | | user: hecht | | date: Fri Feb 04 15:30:49 2005 +0100 | | summary: beginning of 3D version | | o | changeset: 692:3dd198f1df06 | | user: lehyaric | | date: Tue Feb 01 16:49:04 2005 +0100 | | summary: New script to remove generated files (in order to prevent CVS conflicts) | | o | changeset: 691:7a29cfe029e6 | | user: lehyaric | | date: Tue Feb 01 16:04:54 2005 +0100 | | summary: FreeFem++-cs compiling and running on Windows with fully blocking sockets | | o | changeset: 690:2fabec51e87c | | user: lehyaric | | date: Tue Feb 01 14:38:02 2005 +0100 | | summary: FreeFem++-cs works with fully-blocking sockets on Linux. | | o | changeset: 689:f0ac462be8a7 | | user: lehyaric | | date: Tue Feb 01 12:20:38 2005 +0100 | | summary: Reverting FreeFem++-cs to blocking IO because of Microsoft Windows problems | | o | changeset: 688:010fbaa0c385 | | user: lehyaric | | date: Mon Jan 31 15:21:05 2005 +0100 | | summary: New version number in makefiles. | | o | changeset: 687:f06a10e19b98 | | user: lehyaric | | date: Mon Jan 31 15:17:51 2005 +0100 | | summary: Default version number now includes package number. | | o | changeset: 686:c9b8132a2529 | | user: lehyaric | | date: Mon Jan 31 14:07:13 2005 +0100 | | summary: Problem with busy waiting under Windows solved. | | o | changeset: 685:da3d8c2394e2 | | user: hecht | | date: Sat Jan 29 09:56:58 2005 +0100 | | summary: correct some compile error with g++ 3.4 | | o | changeset: 684:4082bdc8cf45 | | user: lehyaric | | date: Fri Jan 28 13:27:49 2005 +0100 | | summary: Windows packaging for new improved socket implementation | | o | changeset: 683:b94d16aa1620 | | user: lehyaric | | date: Fri Jan 28 11:28:07 2005 +0100 | | summary: Still trying to resolve discrepancies between Linux and Windows sockets. | | o | changeset: 682:d572b516a5ff | | user: hecht | | date: Thu Jan 27 19:01:24 2005 +0100 | | summary: correct ; placement in if ... | | o | changeset: 681:e67edeab0092 | | user: hecht | | date: Thu Jan 27 18:30:17 2005 +0100 | | summary: pour mettre les makefile.in ok | | o | changeset: 680:e48d92cee32c | | user: hecht | | date: Thu Jan 27 18:15:48 2005 +0100 | | summary: mac install continuing | | o | changeset: 679:6a216a159e0c | | user: hecht | | date: Thu Jan 27 18:14:20 2005 +0100 | | summary: mac install continuing | | o | changeset: 678:915751728e29 | | user: hecht | | date: Thu Jan 27 18:07:16 2005 +0100 | | summary: continuing coorect of macos application installation | | o | changeset: 677:69466588b4f3 | | user: lehyaric | | date: Thu Jan 27 17:16:54 2005 +0100 | | summary: Reorganising socket communication in FreeFem++-cs because of instabilities | | o | changeset: 676:132579c00f77 | | user: lehyaric | | date: Thu Jan 27 10:59:01 2005 +0100 | | summary: Drag'n'drop works with Mozilla Firefox for Windows. | | o | changeset: 675:f7b2a8606369 | | user: hecht | | date: Wed Jan 26 23:34:28 2005 +0100 | | summary: add .app.tgz of macos application | | o | changeset: 674:25c49da9166e | | user: hecht | | date: Wed Jan 26 23:31:21 2005 +0100 | | summary: correct pb dvi pdf in manual.tex | | o | changeset: 673:d0c77c71561b | | user: hecht | | date: Wed Jan 26 23:25:09 2005 +0100 | | summary: correct stuff in dist generation | | o | changeset: 672:7df608534c4b | | user: hecht | | date: Wed Jan 26 23:22:59 2005 +0100 | | summary: correct problem dvi and pdf chose | | o | changeset: 671:29bf3dda976d | | user: hecht | | date: Wed Jan 26 17:50:13 2005 +0100 | | summary: coorect macos X application) | | o | changeset: 670:0e3142ee3a33 | | user: lehyaric | | date: Wed Jan 26 13:58:41 2005 +0100 | | summary: In configure.ac, PACKAGE_VERSION is already used by autoconf, so we | | o | changeset: 669:9cc276a2e325 | | user: hecht | | date: Mon Jan 24 11:28:11 2005 +0100 | | summary: add named parameter nbtx=.. in buildmesh function to change the default | | o | changeset: 668:537fe1f99bce | | user: hecht | | date: Thu Jan 20 20:10:32 2005 +0100 | | summary: Correct a segfault if second derivative of test function exist in | | o | changeset: 667:28c10d87f954 | | user: hecht | | date: Thu Jan 20 10:39:37 2005 +0100 | | summary: correct parameter passing () in macro argument | | o | changeset: 666:1fe91a34d57d | | user: hecht | | date: Mon Jan 10 22:19:58 2005 +0100 | | summary: change c i C in speedtest.sh to get Cholesky cpu time | | o | changeset: 665:83ad7c4f24b2 | | user: hecht | | date: Mon Jan 10 14:03:31 2005 +0100 | | summary: add forgotten file .pdf | | o | changeset: 664:7e72fe09da35 | | user: hecht | | date: Mon Jan 10 12:07:32 2005 +0100 | | summary: window problem continue | | o | changeset: 663:b54ebd871dac | | user: hecht | | date: Mon Jan 10 10:41:17 2005 +0100 | | summary: correct ???? configure.ac under window | | o | changeset: 662:f9abd9543d11 | | user: hecht | | date: Fri Jan 07 17:05:48 2005 +0100 | | summary: correct expand string in macro | | o | changeset: 661:cb5b6ce9fa18 | | user: hecht | | date: Fri Jan 07 15:55:01 2005 +0100 | | summary: add config.h.in | | o | changeset: 660:71ef61f93962 | | user: lehyaric | | date: Fri Jan 07 12:25:23 2005 +0100 | | summary: Cosmetic change | | o | changeset: 659:1454bcfaa242 | | user: hecht | | date: Fri Jan 07 11:50:08 2005 +0100 | | summary: correct initialisation in solve in case of un set variable | | o | changeset: 658:944f60fe0af4 | | user: hecht | | date: Thu Jan 06 21:58:33 2005 +0100 | | summary: rewrite the macro generation tool to be more to suppress some bug | | o | changeset: 657:27abad54b320 | | user: hecht | | date: Wed Jan 05 23:10:20 2005 +0100 | | summary: update HISTORY file | | o | changeset: 656:4de99db8c363 | | user: hecht | | date: Wed Jan 05 21:50:59 2005 +0100 | | summary: correct segmentation violation error if | | o | changeset: 655:6a65a4351cc6 | | user: hecht | | date: Tue Jan 04 16:58:02 2005 +0100 | | summary: continuing int1d(Th,3,qfe=qf1pElump)( | | o | changeset: 654:bb8f41ed79bf | | user: hecht | | date: Tue Jan 04 16:45:19 2005 +0100 | | summary: add qf1pElump new quadrature formular in int1d() ... | | o | changeset: 653:75e427064019 | | user: hecht | | date: Wed Dec 29 11:16:11 2004 +0100 | | summary: add concat operator in macro generation # | | o | changeset: 652:8dfd9dc97215 | | user: hecht | | date: Tue Dec 21 18:24:43 2004 +0100 | | summary: add mkff-html.pl file to update the web page. | | o | changeset: 651:be477b2a559c | | user: lehyaric | | date: Fri Dec 17 17:22:52 2004 +0100 | | summary: Windows package including correction for Mingw -mthreads bug | | o | changeset: 650:eb12e1fe86d0 | | user: lehyaric | | date: Fri Dec 17 15:40:30 2004 +0100 | | summary: Bug solved: Random crashes in Windows GUI | | o | changeset: 649:8b2c0dc489c5 | | user: lehyaric | | date: Fri Dec 17 11:17:27 2004 +0100 | | summary: Change naming conventions in package numbering | | o | changeset: 648:2e4307b2394c | | user: lehyaric | | date: Thu Dec 16 10:30:07 2004 +0100 | | summary: Added files to "clean-gen" goal | | o | changeset: 647:aeba339ce574 | | user: lehyaric | | date: Thu Dec 16 10:21:45 2004 +0100 | | summary: Added goal "clean-gen" to clean generated files which are included in the | | o | changeset: 646:59b4aded663b | | user: lehyaric | | date: Wed Dec 15 17:42:56 2004 +0100 | | summary: Postscript output in FreeFem++-cs corrected. | | o | changeset: 645:576d59fb636f | | tag: release_1_44 | | user: hecht | | date: Sat Dec 11 15:25:14 2004 +0100 | | summary: add one examples and load ide/makefile.in file | | o | changeset: 644:587836032d0c | | user: hecht | | date: Tue Dec 07 17:26:16 2004 +0100 | | summary: put manual-full.pdf and remove manual-full.ps.gz in dist files | | o | changeset: 643:5915ca34cea8 | | user: hecht | | date: Tue Dec 07 17:19:47 2004 +0100 | | summary: adding change | | o | changeset: 642:272bdb376315 | | user: hecht | | date: Tue Dec 07 16:47:49 2004 +0100 | | summary: correct missing file in dist target in ide/Makefile.am | | o | changeset: 641:943560ba14cb | | user: hecht | | date: Tue Dec 07 15:46:54 2004 +0100 | | summary: add pdfsync.sty | | o | changeset: 640:574e16fa4580 | | user: hecht | | date: Tue Dec 07 15:46:54 2004 +0100 | | summary: add pdfsync.sty | | o | changeset: 639:40a0aa5074d2 | | user: hecht | | date: Tue Dec 07 14:40:55 2004 +0100 | | summary: correct bug in LinearGC | | o | changeset: 638:ce9d4f35ccbe | | user: hecht | | date: Tue Dec 07 14:40:55 2004 +0100 | | summary: correct bug in LinearGC | | o | changeset: 637:5e92e098a84c | | user: hecht | | date: Tue Dec 07 14:40:55 2004 +0100 | | summary: correct bug in LinearGC | | o | changeset: 636:c503ab82d448 | | user: hecht | | date: Tue Dec 07 14:40:55 2004 +0100 | | summary: correct bug in LinearGC | | o | changeset: 635:df1fe243e312 | | user: hecht | | date: Tue Dec 07 14:40:55 2004 +0100 | | summary: correct bug in LinearGC | | o | changeset: 634:5992289e53d9 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 633:bac8aeda8d02 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 632:16ec15ff429e | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 631:5b20a0a70ed3 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 630:6d565e845748 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 629:8c4834a72c8d | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 628:3a567543a457 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 627:1e538d357736 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 626:14c9bd5aa671 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 625:d3e8ab784f54 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 624:078931338411 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 623:6989fe9dcf00 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 622:5850f2541f28 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 621:c1b6502dda0e | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 620:d42824334848 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 619:e3fb8b67aedd | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 618:5231ac489b29 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 617:1ffe14f7e205 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 616:e0e061f7cc0f | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 615:b02e93ab648f | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 614:3826ba342268 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 613:bfe77a690f22 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 612:8a623501ed79 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 611:5eb3d7779ba5 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 610:47890a9320f0 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 609:09fa91db7015 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 608:958a113e64f8 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 607:2550dc877a9e | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 606:0a9e0d2f235a | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 605:5a1f44c2fed5 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 604:fc0a897c0231 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 603:5270118bb4b3 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 602:b8f75296d692 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 601:6405ed03c906 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 600:66d5401897b2 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 599:646706f655fb | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 598:209e45a646c0 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 597:90fd37db4500 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 596:ea886dc74445 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 595:f30855db023a | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 594:01cbb9cc6471 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 593:db32e3dcb9e6 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 592:d2c95b00caa9 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 591:5dd5a8b892c5 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 590:b530f0e60945 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 589:aace165d8a5b | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 588:e7c461ccdd5e | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 587:c43a94efd8d0 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 586:04ca3feeb78f | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 585:0ff5c636ce04 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 584:301f2066aa9e | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 583:5a12dc4f399c | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 582:b7adf373f4fc | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 581:504550d55b8a | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 580:891870d5e48e | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 579:f7ba38e32a59 | | user: lehyaric | | date: Mon Dec 06 16:17:29 2004 +0100 | | summary: "make dist" does not try and include BLAS source files any more | | o | changeset: 578:131067ca69b4 | | user: lehyaric | | date: Fri Dec 03 15:27:32 2004 +0100 | | summary: Include kernel and libc versions in linux static package name | | o | changeset: 577:950a1b1dc850 | | user: lehyaric | | date: Fri Dec 03 15:27:32 2004 +0100 | | summary: Include kernel and libc versions in linux static package name | | o | changeset: 576:dd814ba4d987 | | user: lehyaric | | date: Fri Dec 03 11:48:53 2004 +0100 | | summary: Wording change | | o | changeset: 575:698d11505ca5 | | user: lehyaric | | date: Thu Dec 02 13:51:32 2004 +0100 | | summary: New package for Windows done | | o | changeset: 574:eda5ab893d90 | | user: lehyaric | | date: Thu Dec 02 13:51:32 2004 +0100 | | summary: New package for Windows done | | o | changeset: 573:655782a256ca | | user: lehyaric | | date: Thu Dec 02 13:51:32 2004 +0100 | | summary: New package for Windows done | | o | changeset: 572:7fe59ebb535e | | user: lehyaric | | date: Thu Dec 02 13:26:30 2004 +0100 | | summary: Changed reference value for regression tests | | o | changeset: 571:1e0b5bb8a88a | | user: lehyaric | | date: Thu Dec 02 13:26:30 2004 +0100 | | summary: Changed reference value for regression tests | | o | changeset: 570:28917d41479d | | user: lehyaric | | date: Thu Dec 02 13:26:30 2004 +0100 | | summary: Changed reference value for regression tests | | o | changeset: 569:f4933536ffc4 | | user: lehyaric | | date: Thu Dec 02 12:34:13 2004 +0100 | | summary: Regression tests suite was not running. Corrected. | | o | changeset: 568:e9f9444f4eec | | user: lehyaric | | date: Thu Dec 02 12:34:13 2004 +0100 | | summary: Regression tests suite was not running. Corrected. | | o | changeset: 567:5c4ed3b5dd9d | | user: lehyaric | | date: Thu Dec 02 12:34:13 2004 +0100 | | summary: Regression tests suite was not running. Corrected. | | o | changeset: 566:d8c0ddc9c049 | | user: lehyaric | | date: Thu Dec 02 12:24:17 2004 +0100 | | summary: FreeFem++-cs works on MacOSX (uses named semaphores) | | o | changeset: 565:9ab9aa52b004 | | user: lehyaric | | date: Thu Dec 02 11:40:45 2004 +0100 | | summary: X11 shared libraries dependencies removed on Mac OS X | | o | changeset: 564:a878e8d06b91 | | user: lehyaric | | date: Thu Dec 02 11:40:45 2004 +0100 | | summary: X11 shared libraries dependencies removed on Mac OS X | | o | changeset: 563:fcce285846eb | | user: lehyaric | | date: Thu Dec 02 10:12:21 2004 +0100 | | summary: Added FreeFem++-cs to visual regression tests | | o | changeset: 562:d740179bde14 | | user: lehyaric | | date: Thu Dec 02 10:12:21 2004 +0100 | | summary: Added FreeFem++-cs to visual regression tests | | o | changeset: 561:26808676972f | | user: lehyaric | | date: Wed Dec 01 18:10:45 2004 +0100 | | summary: - Tuned regression tests in examples++-tutorial (convect-apt.edp case) | | o | changeset: 560:83c213085ce7 | | user: lehyaric | | date: Wed Dec 01 18:10:45 2004 +0100 | | summary: - Tuned regression tests in examples++-tutorial (convect-apt.edp case) | | o | changeset: 559:053dbd4ba446 | | user: lehyaric | | date: Wed Dec 01 18:10:45 2004 +0100 | | summary: - Tuned regression tests in examples++-tutorial (convect-apt.edp case) | | o | changeset: 558:8139a67a3970 | | user: lehyaric | | date: Wed Dec 01 18:10:45 2004 +0100 | | summary: - Tuned regression tests in examples++-tutorial (convect-apt.edp case) | | o | changeset: 557:9f492b691c47 | | user: lehyaric | | date: Wed Dec 01 18:10:45 2004 +0100 | | summary: - Tuned regression tests in examples++-tutorial (convect-apt.edp case) | | o | changeset: 556:2ab99a6f771a | | user: hecht | | date: Tue Nov 30 22:00:45 2004 +0100 | | summary: remove operation g - A*x -b ; => bug in opt version | | o | changeset: 555:b9e70adbbe36 | | user: lehyaric | | date: Tue Nov 30 17:18:15 2004 +0100 | | summary: Application icons now work on Windows | | o | changeset: 554:8fc116e186d6 | | user: hecht | | date: Tue Nov 30 17:08:59 2004 +0100 | | summary: change 1 un 1. du to complex varf (ambiguity) | | o | changeset: 553:8838777e7a31 | | user: hecht | | date: Tue Nov 30 17:00:57 2004 +0100 | | summary: correct small compile error | | o | changeset: 552:c187b5186fe1 | | user: lehyaric | | date: Tue Nov 30 13:43:12 2004 +0100 | | summary: Added X-Windows icon to FreeFem++-cs | | o | changeset: 551:b157b8570234 | | user: hecht | | date: Mon Nov 29 22:23:28 2004 +0100 | | summary: Correction dans matrixinterpole | | o | changeset: 550:cb5e794dd229 | | user: hecht | | date: Mon Nov 29 22:23:28 2004 +0100 | | summary: Correction dans matrixinterpole | | o | changeset: 549:f3c219716b61 | | user: hecht | | date: Mon Nov 29 22:23:28 2004 +0100 | | summary: Correction dans matrixinterpole | | o | changeset: 548:38b6ad03bc0a | | user: hecht | | date: Mon Nov 29 22:23:28 2004 +0100 | | summary: Correction dans matrixinterpole | | o | changeset: 547:aaa46419f2f2 | | user: hecht | | date: Mon Nov 29 22:23:28 2004 +0100 | | summary: Correction dans matrixinterpole | | o | changeset: 546:a1b12d942392 | | user: lehyaric | | date: Fri Nov 26 16:54:09 2004 +0100 | | summary: New debian package (1.44-8) | | o | changeset: 545:5afcd79492c7 | | user: lehyaric | | date: Fri Nov 26 16:52:47 2004 +0100 | | summary: Remove -mpich version from Debian packages since mpich Debian unstable | | o | changeset: 544:decd403ecbfc | | user: lehyaric | | date: Fri Nov 26 15:18:49 2004 +0100 | | summary: Windows packaging modified to improve icons management | | o | changeset: 543:2bd172a33dc9 | | user: lehyaric | | date: Fri Nov 26 15:18:49 2004 +0100 | | summary: Windows packaging modified to improve icons management | | o | changeset: 542:a204e168b37a | | user: lehyaric | | date: Fri Nov 26 11:15:21 2004 +0100 | | summary: Including FreeFem++-cs in the Windows packaging | | o | changeset: 541:4392d747f871 | | user: lehyaric | | date: Thu Nov 25 16:25:05 2004 +0100 | | summary: FreeFem++-cs compiles on Windows _without_ Cygwin | | o | changeset: 540:16055790185c | | user: lehyaric | | date: Thu Nov 25 10:35:48 2004 +0100 | | summary: Recompiled on Linux (Debian unstable). | | o | changeset: 539:c9b0bf01408e | | user: lehyaric | | date: Wed Nov 24 14:46:42 2004 +0100 | | summary: FreeFem++-cs currently being compiled without Cygwin (because of license problems) | | o | changeset: 538:434fa9c44e79 | | user: lehyaric | | date: Wed Nov 24 14:46:42 2004 +0100 | | summary: FreeFem++-cs currently being compiled without Cygwin (because of license problems) | | o | changeset: 537:052a46e28339 | | user: lehyaric | | date: Tue Nov 23 16:51:22 2004 +0100 | | summary: We need cygwin1.dll for FreeFem++-cs | | o | changeset: 536:e51479949d96 | | user: lehyaric | | date: Tue Nov 23 16:39:56 2004 +0100 | | summary: FreeFem++-cs works on Windows | | o | changeset: 535:c842a897de0b | | user: lehyaric | | date: Tue Nov 23 11:06:29 2004 +0100 | | summary: Cosmetic changes | | o | changeset: 534:e1be96666c98 | | user: lehyaric | | date: Mon Nov 22 17:00:15 2004 +0100 | | summary: New binary package for Linux, containing static executables (configure option | | o | changeset: 533:c5565ad73ac7 | | user: lehyaric | | date: Mon Nov 22 17:00:15 2004 +0100 | | summary: New binary package for Linux, containing static executables (configure option | | o | changeset: 532:2366c7044750 | | user: lehyaric | | date: Mon Nov 22 17:00:15 2004 +0100 | | summary: New binary package for Linux, containing static executables (configure option | | o | changeset: 531:c4392eca0236 | | user: lehyaric | | date: Mon Nov 22 15:09:18 2004 +0100 | | summary: New Linux binary package | | o | changeset: 530:537a21528272 | | user: lehyaric | | date: Mon Nov 22 14:11:11 2004 +0100 | | summary: Added new configure option --enable-static to have no shared library | | o | changeset: 529:13717f3277b3 | | user: lehyaric | | date: Mon Nov 22 14:11:11 2004 +0100 | | summary: Added new configure option --enable-static to have no shared library | | o | changeset: 528:7960aa03c7c8 | | user: lehyaric | | date: Mon Nov 22 14:11:11 2004 +0100 | | summary: Added new configure option --enable-static to have no shared library | | o | changeset: 527:84887e26fa7d | | user: lehyaric | | date: Fri Nov 19 15:41:21 2004 +0100 | | summary: Renamed MPI Debian package from -mpi to -mpich to reflect the fact that | | o | changeset: 526:271f7c1e38d5 | | user: lehyaric | | date: Fri Nov 19 15:41:21 2004 +0100 | | summary: Renamed MPI Debian package from -mpi to -mpich to reflect the fact that | | o | changeset: 525:48e68d852cb9 | | user: lehyaric | | date: Fri Nov 19 12:29:07 2004 +0100 | | summary: Added rules to create a Debian package with mpich | | o | changeset: 524:824d648c04a3 | | user: lehyaric | | date: Fri Nov 19 12:29:07 2004 +0100 | | summary: Added rules to create a Debian package with mpich | | o | changeset: 523:a5edb3078853 | | user: lehyaric | | date: Fri Nov 19 10:57:49 2004 +0100 | | summary: More precise build dependencies for Debian package | | o | changeset: 522:59f57df9fae0 | | user: lehyaric | | date: Thu Nov 18 11:05:11 2004 +0100 | | summary: Added profiling option for configure.ac | | o | changeset: 521:316f11a303d2 | | user: lehyaric | | date: Thu Nov 18 11:03:39 2004 +0100 | | summary: Added possibility to create separate packages for Debian testing and unstable. | | o | changeset: 520:f0095131b64f | | user: lehyaric | | date: Thu Nov 18 11:03:39 2004 +0100 | | summary: Added possibility to create separate packages for Debian testing and unstable. | | o | changeset: 519:718ca74c8d16 | | user: lehyaric | | date: Thu Nov 18 11:03:39 2004 +0100 | | summary: Added possibility to create separate packages for Debian testing and unstable. | | o | changeset: 518:9d89d076190d | | user: lehyaric | | date: Wed Nov 17 15:37:02 2004 +0100 | | summary: Default Debian package set to -x11 | | o | changeset: 517:bdf44e6aba20 | | user: lehyaric | | date: Wed Nov 17 14:28:50 2004 +0100 | | summary: Updated IDE TODO list | | o | changeset: 516:517c1471cf2e | | user: lehyaric | | date: Wed Nov 17 12:13:22 2004 +0100 | | summary: Debian package (unstable) for FreeFem++ is ready | | o | changeset: 515:eaeb26d2dac2 | | user: lehyaric | | date: Wed Nov 17 12:13:22 2004 +0100 | | summary: Debian package (unstable) for FreeFem++ is ready | | o | changeset: 514:721ef4ae9791 | | user: lehyaric | | date: Tue Nov 16 17:18:16 2004 +0100 | | summary: Debian packages curently being built. Not fully operational yet. | | o | changeset: 513:48d1d0bda2c4 | | user: lehyaric | | date: Tue Nov 16 15:39:50 2004 +0100 | | summary: Makes doc up-to-date with IDE. | | o | changeset: 512:8ab392a78e7a | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 511:37b96d6a550d | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 510:e9b15663d36a | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 509:210bc8bca680 | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 508:580ba532e342 | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 507:edb464296e7d | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 506:ada7b140218e | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 505:fafcb50f4e5b | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 504:bcc41dd3fa8d | | user: lehyaric | | date: Tue Nov 16 15:21:14 2004 +0100 | | summary: Changed macro LONG_LONG to BAMG_LONG_LONG to avoid any interference with MPI. | | o | changeset: 503:afbb5a9e4183 | | user: hecht | | date: Tue Nov 16 09:25:12 2004 +0100 | | summary: correct problem in integration of complex valued function | | o | changeset: 502:2b8521a98d74 | | user: lehyaric | | date: Mon Nov 15 15:50:42 2004 +0100 | | summary: A paragraph about FreeFem++-cs has been added in the documentation. | | o | changeset: 501:12cd26fb848f | | user: lehyaric | | date: Mon Nov 15 15:50:42 2004 +0100 | | summary: A paragraph about FreeFem++-cs has been added in the documentation. | | o | changeset: 500:892e3010d175 | | user: lehyaric | | date: Mon Nov 15 15:50:42 2004 +0100 | | summary: A paragraph about FreeFem++-cs has been added in the documentation. | | o | changeset: 499:e32593c3ce18 | | user: lehyaric | | date: Mon Nov 15 13:56:11 2004 +0100 | | summary: FreeFem++-cs compiles on Cedre (Red-Hat Enterprise) | | o | changeset: 498:928f4a1766a4 | | user: lehyaric | | date: Mon Nov 15 10:27:44 2004 +0100 | | summary: Added TODO list for client/server IDE. | | o | changeset: 497:ea21be00cbe5 | | user: hecht | | date: Mon Nov 15 09:56:56 2004 +0100 | | summary: orthographe in manual-full | | o | changeset: 496:74b4301aac83 | | user: hecht | | date: Fri Nov 12 08:31:27 2004 +0100 | | summary: cadna intergration continuing. | | o | changeset: 495:0be17e76a91f | | user: hecht | | date: Fri Nov 12 08:31:26 2004 +0100 | | summary: cadna intergration continuing. | | o | changeset: 494:a3d87f2b073c | | user: hecht | | date: Fri Nov 12 08:31:26 2004 +0100 | | summary: cadna intergration continuing. | | o | changeset: 493:e43f5465f202 | | user: hecht | | date: Fri Nov 12 08:31:26 2004 +0100 | | summary: cadna intergration continuing. | | o | changeset: 492:30be56d8661d | | user: lehyaric | | date: Thu Nov 11 19:45:49 2004 +0100 | | summary: Progressively debugging the IDE and making it usable. | | o | changeset: 491:e2c6e9ede5d9 | | user: lehyaric | | date: Wed Nov 10 20:12:16 2004 +0100 | | summary: Some corrections for Cygwin configuration of the IDE. | | o | changeset: 490:eb18a25a60ea | | user: lehyaric | | date: Wed Nov 10 12:38:16 2004 +0100 | | summary: Integrating Windows+Cygwin changes back into Linux. | | o | changeset: 489:11ff79651895 | | user: lehyaric | | date: Wed Nov 10 10:48:49 2004 +0100 | | summary: *** empty log message *** | | o | changeset: 488:62a7ee053207 | | user: lehyaric | | date: Tue Nov 09 16:54:04 2004 +0100 | | summary: There was a problem with downloaded BLAS source: it was included in | | o | changeset: 487:5d76a60fb602 | | user: hecht | | date: Tue Nov 09 16:23:12 2004 +0100 | | summary: add interface with cadna | | o | changeset: 486:17496d99e45f | | user: lehyaric | | date: Tue Nov 09 15:47:10 2004 +0100 | | summary: Windows version of FreeFem++ client/server IDE currently being | | o | changeset: 485:6290d8ecd8c1 | | user: lehyaric | | date: Tue Nov 09 15:47:10 2004 +0100 | | summary: Windows version of FreeFem++ client/server IDE currently being | | o | changeset: 484:f926e0479ac8 | | user: lehyaric | | date: Tue Nov 09 15:47:10 2004 +0100 | | summary: Windows version of FreeFem++ client/server IDE currently being | | o | changeset: 483:6d4dfaef560c | | user: lehyaric | | date: Mon Nov 08 17:21:45 2004 +0100 | | summary: FreeFem++ compiles on MacOSX. But it has not been tested yet. | | o | changeset: 482:a7750c9f311e | | user: lehyaric | | date: Mon Nov 08 17:21:45 2004 +0100 | | summary: FreeFem++ compiles on MacOSX. But it has not been tested yet. | | o | changeset: 481:fb4eebbf4886 | | user: lehyaric | | date: Mon Nov 08 15:02:28 2004 +0100 | | summary: First stable version for the Integrated Development Environment | | o | changeset: 480:3c1e6d4bc2a2 | | user: lehyaric | | date: Mon Nov 08 15:02:28 2004 +0100 | | summary: First stable version for the Integrated Development Environment | | o | changeset: 479:6a6dfeccf617 | | user: lehyaric | | date: Mon Nov 08 15:02:28 2004 +0100 | | summary: First stable version for the Integrated Development Environment | | o | changeset: 478:fca74d661274 | | user: lehyaric | | date: Mon Nov 08 15:02:28 2004 +0100 | | summary: First stable version for the Integrated Development Environment | | o | changeset: 477:6f5f852316f2 | | user: lehyaric | | date: Mon Nov 08 15:02:28 2004 +0100 | | summary: First stable version for the Integrated Development Environment | | o | changeset: 476:2a9e2f6e8da4 | | user: hecht | | date: Fri Nov 05 20:58:24 2004 +0100 | | summary: coorect bug in FreeFem++.app the plist file was wrong.x | | o | changeset: 475:2130890a279c | | user: hecht | | date: Fri Nov 05 20:58:24 2004 +0100 | | summary: coorect bug in FreeFem++.app the plist file was wrong.x | | o | changeset: 474:15a22358864b | | user: hecht | | date: Fri Nov 05 17:22:45 2004 +0100 | | summary: rm ./FreeFem++.app/Contents/Resources/Contents/Info.plist | | o | changeset: 473:78d50e8ca9b3 | | user: hecht | | date: Fri Nov 05 15:01:51 2004 +0100 | | summary: add install www files | | o | changeset: 472:deb301bad9ed | | user: hecht | | date: Fri Nov 05 15:01:51 2004 +0100 | | summary: add install www files | | o | changeset: 471:d329085d2ad9 | | user: hecht | | date: Fri Nov 05 15:01:51 2004 +0100 | | summary: add install www files | | o | changeset: 470:b469c835a383 | | user: hecht | | date: Thu Nov 04 11:05:46 2004 +0100 | | summary: small modif for the look | | o | changeset: 469:ab1f51259bd0 | | user: hecht | | date: Thu Nov 04 10:38:27 2004 +0100 | | summary: corret small problem in LinearCG LinearGMRES | | o | changeset: 468:1acbc778abf2 | | user: hecht | | date: Thu Nov 04 10:38:27 2004 +0100 | | summary: corret small problem in LinearCG LinearGMRES | | o | changeset: 467:0ab12962b0fd | | user: hecht | | date: Thu Nov 04 10:38:27 2004 +0100 | | summary: corret small problem in LinearCG LinearGMRES | | o | changeset: 466:f7e922b5c47b | | user: hecht | | date: Thu Nov 04 10:38:27 2004 +0100 | | summary: corret small problem in LinearCG LinearGMRES | | o | changeset: 465:7538f84816f9 | | user: hecht | | date: Thu Nov 04 10:38:27 2004 +0100 | | summary: corret small problem in LinearCG LinearGMRES | | o | changeset: 464:c7ebd094ec65 | | user: hecht | | date: Mon Nov 01 17:05:20 2004 +0100 | | summary: continuing regtest | | o | changeset: 463:11e517877eef | | user: hecht | | date: Mon Nov 01 17:00:51 2004 +0100 | | summary: correct stability of regtest | | o | changeset: 462:dd06f300568d | | user: hecht | | date: Mon Nov 01 16:29:42 2004 +0100 | | summary: correct regtest in examples++ | | o | changeset: 461:1683f7035054 | | user: hecht | | date: Mon Nov 01 15:22:16 2004 +0100 | | summary: correct sensibility problem in regtest value | | o | changeset: 460:390f8dccddda | | user: hecht | | date: Mon Nov 01 15:22:16 2004 +0100 | | summary: correct sensibility problem in regtest value | | o | changeset: 459:3267ae14952a | | user: hecht | | date: Mon Nov 01 14:34:06 2004 +0100 | | summary: beginning of 1.44 version | | o | changeset: 458:2e4939dc785d | | tag: release_1_43 | | user: hecht | | date: Sun Oct 31 21:45:57 2004 +0100 | | summary: correct probleme in periodic adapted mesh. | | o | changeset: 457:207421f2a7e8 | | user: hecht | | date: Sun Oct 31 21:45:57 2004 +0100 | | summary: correct probleme in periodic adapted mesh. | | o | changeset: 456:200a55791940 | | user: hecht | | date: Fri Oct 22 22:53:17 2004 +0200 | | summary: correct the sparce-cmatrix.edp problem (bug in copy construct of | | o | changeset: 455:7e279b9438e3 | | user: hecht | | date: Fri Oct 22 22:53:17 2004 +0200 | | summary: correct the sparce-cmatrix.edp problem (bug in copy construct of | | o | changeset: 454:d6da0ddeb280 | | user: hecht | | date: Fri Oct 22 22:13:10 2004 +0200 | | summary: correct plus in copy of real matrix to complex Z | | o | changeset: 453:b8318a5e063d | | user: hecht | | date: Fri Oct 22 20:55:10 2004 +0200 | | summary: try correct probleme with sparce_cmatrix.edp on hydre | | o | changeset: 452:ee654e2bf51f | | user: hecht | | date: Fri Oct 22 17:40:01 2004 +0200 | | summary: track a bug in complex matrix | | o | changeset: 451:1ec19015b7a7 | | user: hecht | | date: Fri Oct 22 13:17:13 2004 +0200 | | summary: correct spelling in Makefile.am | | o | changeset: 450:81af913867db | | user: hecht | | date: Fri Oct 22 13:13:57 2004 +0200 | | summary: correct missing file in dist TARGET | | o | changeset: 449:4ebc66387841 | | user: hecht | | date: Thu Oct 21 23:30:26 2004 +0200 | | summary: correct LD_LIBRARY_PATH in regtests.sh | | o | changeset: 448:ae67b79318c9 | | user: hecht | | date: Thu Oct 21 19:53:59 2004 +0200 | | summary: correct compilation probleme with g++-3.4 | | o | changeset: 447:210d3e06f92d | | user: hecht | | date: Thu Oct 21 11:04:46 2004 +0200 | | summary: olve pb of case in filename if figure dir | | o | changeset: 446:b5fa749a5bc9 | | user: hecht | | date: Thu Oct 21 11:04:46 2004 +0200 | | summary: olve pb of case in filename if figure dir | | o | changeset: 445:76207b73fd90 | | user: hecht | | date: Thu Oct 21 11:04:46 2004 +0200 | | summary: olve pb of case in filename if figure dir | | o | changeset: 444:bd6dac9e9094 | | user: hecht | | date: Thu Oct 21 10:51:25 2004 +0200 | | summary: add info in README_CVS update -d | | o | changeset: 443:3454b8d74eb1 | | user: hecht | | date: Thu Oct 21 10:47:18 2004 +0200 | | summary: full manual continuing | | o | changeset: 442:425302deea0d | | user: hecht | | date: Thu Oct 21 10:37:25 2004 +0200 | | summary: change default manual to manual-full | | o | changeset: 441:930731f1e671 | | user: hecht | | date: Thu Oct 21 09:56:57 2004 +0200 | | summary: add forgetted file | | o | changeset: 440:90b421243e49 | | user: hecht | | date: Thu Oct 21 09:55:46 2004 +0200 | | summary: correct ps generation n tag | | o | changeset: 439:054a6408443f | | user: hecht | | date: Thu Oct 21 08:26:40 2004 +0200 | | summary: correct problem AssembleVarForm compile with -O3 in hydre | | o | changeset: 438:10d97062e606 | | user: lehyaric | | date: Wed Oct 20 17:26:48 2004 +0200 | | summary: Updates for building debian packages. | | o | changeset: 437:6b4d454f052c | | user: hecht | | date: Wed Oct 20 13:52:12 2004 +0200 | | summary: correct print in UMFPack driver | | o | changeset: 436:5d7b015d6b6a | | user: hecht | | date: Wed Oct 20 12:01:16 2004 +0200 | | summary: add inquire of FE space connectivite (see HISTRY file) | | o | changeset: 435:77ee9f17989a | | user: hecht | | date: Wed Oct 20 12:01:16 2004 +0200 | | summary: add inquire of FE space connectivite (see HISTRY file) | | o | changeset: 434:645fa4d8d41e | | user: hecht | | date: Wed Oct 20 12:01:16 2004 +0200 | | summary: add inquire of FE space connectivite (see HISTRY file) | | o | changeset: 433:fe1cf8c01674 | | user: hecht | | date: Tue Oct 19 23:31:24 2004 +0200 | | summary: correct bug in UMFPACK driver | | o | changeset: 432:db150de11f10 | | user: hecht | | date: Tue Oct 19 23:31:24 2004 +0200 | | summary: correct bug in UMFPACK driver | | o | changeset: 431:086194a0bc97 | | user: hecht | | date: Tue Oct 19 23:31:24 2004 +0200 | | summary: correct bug in UMFPACK driver | | o | changeset: 430:143a3895671e | | user: hecht | | date: Tue Oct 19 23:31:24 2004 +0200 | | summary: correct bug in UMFPACK driver | | o | changeset: 429:68b5cd5a87d4 | | user: hecht | | date: Tue Oct 19 23:31:24 2004 +0200 | | summary: correct bug in UMFPACK driver | | o | changeset: 428:8e95b761bae5 | | user: hecht | | date: Wed Oct 13 21:49:56 2004 +0200 | | summary: correct line numbering probleme (lose the first line) | | o | changeset: 427:25a98f711d0b | | user: hecht | | date: Wed Oct 13 21:49:56 2004 +0200 | | summary: correct line numbering probleme (lose the first line) | | o | changeset: 426:144820ccdbd5 | | user: hecht | | date: Wed Oct 13 18:12:27 2004 +0200 | | summary: remove accent in GC routine | | o | changeset: 425:1732ce8c01d8 | | user: hecht | | date: Wed Oct 13 18:12:27 2004 +0200 | | summary: remove accent in GC routine | | o | changeset: 424:1b5098389948 | | user: hecht | | date: Tue Oct 12 21:38:18 2004 +0200 | | summary: reput previous version (wrong test) | | o | changeset: 423:5638a3f80a88 | | user: hecht | | date: Tue Oct 12 20:59:32 2004 +0200 | | summary: correct probleme in A*x for full matrix | | o | changeset: 422:94c1cfab9672 | | user: hecht | | date: Tue Oct 12 07:28:35 2004 +0200 | | summary: add file src/fflib/lgmat.cpp | | o | changeset: 421:e63cf99645a9 | | user: hecht | | date: Mon Oct 11 21:31:47 2004 +0200 | | summary: complex pde , FE complex function, add complex matrix , first test is | | o | changeset: 420:9cab4d0aa69c | | user: hecht | | date: Mon Oct 11 21:31:47 2004 +0200 | | summary: complex pde , FE complex function, add complex matrix , first test is | | o | changeset: 419:515fd7b96b9f | | user: hecht | | date: Mon Oct 11 21:31:47 2004 +0200 | | summary: complex pde , FE complex function, add complex matrix , first test is | | o | changeset: 418:79b744606bae | | user: hecht | | date: Mon Oct 11 21:31:47 2004 +0200 | | summary: complex pde , FE complex function, add complex matrix , first test is | | o | changeset: 417:5bd8386dcd01 | | user: hecht | | date: Mon Oct 11 21:31:47 2004 +0200 | | summary: complex pde , FE complex function, add complex matrix , first test is | | o | changeset: 416:97e71f66af70 | | user: hecht | | date: Fri Oct 08 18:39:13 2004 +0200 | | summary: complex matrix continuing | | o | changeset: 415:f137b9a8fc5c | | user: hecht | | date: Fri Oct 08 18:39:13 2004 +0200 | | summary: complex matrix continuing | | o | changeset: 414:ebfebb1ac5fc | | user: hecht | | date: Fri Oct 08 18:39:13 2004 +0200 | | summary: complex matrix continuing | | o | changeset: 413:04eb8a6f2984 | | user: hecht | | date: Fri Oct 08 18:39:13 2004 +0200 | | summary: complex matrix continuing | | o | changeset: 412:a22c9b627343 | | user: hecht | | date: Wed Oct 06 22:24:56 2004 +0200 | | summary: add a pde complex example | | o | changeset: 411:a4b5781ae40c | | user: hecht | | date: Wed Oct 06 22:22:05 2004 +0200 | | summary: pde complex , continuing: first test is now working | | o | changeset: 410:bcac253cb61b | | user: hecht | | date: Wed Oct 06 22:22:05 2004 +0200 | | summary: pde complex , continuing: first test is now working | | o | changeset: 409:8979601bdc85 | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 408:256c59f10590 | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 407:7d2cf3182e76 | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 406:e95d0ba6b7e3 | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 405:70e5cbe6ea2d | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 404:44a92d96dedf | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 403:d6f723e155cb | | user: hecht | | date: Tue Oct 05 21:29:04 2004 +0200 | | summary: complex pde probleme ( first test) no validation | | o | changeset: 402:3c4ce746b967 | | user: lehyaric | | date: Tue Oct 05 15:30:13 2004 +0200 | | summary: Added reduced compilation goal "quick" for development purposes. | | o | changeset: 401:b2003bc088ca | | user: hecht | | date: Mon Oct 04 10:22:29 2004 +0200 | | summary: add complex edp (continued) | | o | changeset: 400:397c36b4b309 | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 399:887c12889698 | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 398:2f52a8427674 | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 397:e83e3edd173f | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 396:a5d848d61a8c | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 395:54aee94d12a5 | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 394:82ccf1be8da9 | | user: hecht | | date: Thu Sep 30 14:50:25 2004 +0200 | | summary: add complex FE function | | o | changeset: 393:8057e10dedca | | user: hecht | | date: Tue Sep 28 10:58:41 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 392:6af43ced4bae | | user: hecht | | date: Tue Sep 28 10:58:41 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 391:567799ab94cb | | user: hecht | | date: Tue Sep 28 10:58:41 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 390:abb85c03c031 | | user: hecht | | date: Tue Sep 28 10:58:41 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 389:fe223eb326cd | | user: hecht | | date: Tue Sep 28 10:58:40 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 388:4ca7990a291d | | user: hecht | | date: Tue Sep 28 10:58:40 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 387:933bb1d0a477 | | user: hecht | | date: Tue Sep 28 10:58:40 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 386:5a2434bfc31b | | user: hecht | | date: Tue Sep 28 10:58:40 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 385:72b317a18586 | | user: hecht | | date: Tue Sep 28 10:58:40 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 384:01a48ef68149 | | user: hecht | | date: Tue Sep 28 10:58:40 2004 +0200 | | summary: add new manual call manual-full | | o | changeset: 383:dc00fa274e76 | | user: lehyaric | | date: Fri Sep 17 17:29:29 2004 +0200 | | summary: More information about CVS commands. | | o | changeset: 382:3d5b35158b27 | | user: lehyaric | | date: Fri Sep 17 16:55:03 2004 +0200 | | summary: Regression tests pass with reduced optimization options on PowerPC G5, fast | | o | changeset: 381:fc7c2126f5c4 | | user: lehyaric | | date: Fri Sep 17 16:13:25 2004 +0200 | | summary: Regression tests pass again on Macintosh PPC (generic mode). | | o | changeset: 380:6735dad5752c | | user: lehyaric | | date: Fri Sep 17 15:14:21 2004 +0200 | | summary: Make regression tests work again on Macintosh PowerPC (debug mode). | | o | changeset: 379:1f9b0349c49d | | user: lehyaric | | date: Fri Sep 17 15:14:21 2004 +0200 | | summary: Make regression tests work again on Macintosh PowerPC (debug mode). | | o | changeset: 378:ff90d81ab89d | | user: lehyaric | | date: Fri Sep 17 15:14:21 2004 +0200 | | summary: Make regression tests work again on Macintosh PowerPC (debug mode). | | o | changeset: 377:f7482dd869e3 | | user: lehyaric | | date: Fri Sep 17 15:14:21 2004 +0200 | | summary: Make regression tests work again on Macintosh PowerPC (debug mode). | | o | changeset: 376:bfab63278f19 | | user: lehyaric | | date: Thu Sep 16 17:24:11 2004 +0200 | | summary: Still trying to find appropriate optimization options for PowerPC G5 | | o | changeset: 375:0507c2ba4f1e | | user: lehyaric | | date: Thu Sep 16 10:43:46 2004 +0200 | | summary: G5 optimization options reverted to G4 because of segmentation fault | | o | changeset: 374:cd70efe472da | | user: hecht | | date: Wed Sep 15 21:50:30 2004 +0200 | | summary: split AFunction.cpp in 2 files and remove optim option on ppc G5 | | o | changeset: 373:5da1312b3ef9 | | user: hecht | | date: Wed Sep 15 21:50:30 2004 +0200 | | summary: split AFunction.cpp in 2 files and remove optim option on ppc G5 | | o | changeset: 372:72e9cd4aa1b8 | | user: hecht | | date: Wed Sep 15 21:50:30 2004 +0200 | | summary: split AFunction.cpp in 2 files and remove optim option on ppc G5 | | o | changeset: 371:1ad31634c74e | | user: hecht | | date: Tue Sep 14 14:28:57 2004 +0200 | | summary: correct pb set var CXX in load.sh call in exampelle++-Makefile.am | | o | changeset: 370:8483d008a226 | | user: lehyaric | | date: Tue Sep 14 13:51:23 2004 +0200 | | summary: Enables load.link work even when $CXX is not defined. | | o | changeset: 369:3b19cf768802 | | user: lehyaric | | date: Tue Sep 14 11:39:15 2004 +0200 | | summary: Corrected bug preventing examples++-tutorial/regtests.m4 from being | | o | changeset: 368:fe3f3906e950 | | user: lehyaric | | date: Tue Sep 14 11:20:40 2004 +0200 | | summary: More updates for FreeBSD compilation | | o | changeset: 367:c4a119ca5c9a | | user: lehyaric | | date: Mon Sep 13 16:05:19 2004 +0200 | | summary: Modification proposée par Thierry Thomas pour FreeBSD | | o | changeset: 366:8493ed2b0f1e | | user: hecht | | date: Mon Sep 13 15:33:27 2004 +0200 | | summary: correct plist version | | o | changeset: 365:18b4482e75b8 | | user: hecht | | date: Mon Sep 13 15:33:27 2004 +0200 | | summary: correct plist version | | o | changeset: 364:afb03f91b7e1 | | user: hecht | | date: Mon Sep 13 15:27:09 2004 +0200 | | summary: C++ encapsulte cblas.h in src/femlib/MatriceCreuse_tpl.hpp for freebsd OS | | o | changeset: 363:613c6ccc0c5f | | user: hecht | | date: Tue Sep 07 17:43:34 2004 +0200 | | summary: corret of window install | | o | changeset: 362:8540f099b3ce | | user: hecht | | date: Tue Sep 07 16:47:58 2004 +0200 | | summary: add file for MacOS application | | o | changeset: 361:7dae94479be9 | | user: lehyaric | | date: Tue Sep 07 10:37:27 2004 +0200 | | summary: Regression tests in examples++ directory re-implemented using regtests.m4 | | o | changeset: 360:2d87ce153e15 | | user: lehyaric | | date: Tue Sep 07 10:37:27 2004 +0200 | | summary: Regression tests in examples++ directory re-implemented using regtests.m4 | | o | changeset: 359:2784c4a0bd47 | | user: hecht | | date: Tue Sep 07 09:45:39 2004 +0200 | | summary: correct with-blas=.... tags | | o | changeset: 358:cf165daa0d0f | | user: hecht | | date: Tue Sep 07 09:36:07 2004 +0200 | | summary: add if previous download of blas reuse it | | o | changeset: 357:3eb4c46dcfe9 | | user: hecht | | date: Tue Sep 07 09:36:07 2004 +0200 | | summary: add if previous download of blas reuse it | | o | changeset: 356:76b709dff400 | | user: hecht | | date: Tue Sep 07 09:36:07 2004 +0200 | | summary: add if previous download of blas reuse it | | o | changeset: 355:5e3635850187 | | user: hecht | | date: Tue Sep 07 09:36:07 2004 +0200 | | summary: add if previous download of blas reuse it | | o | changeset: 354:31bc7672aa7c | | user: hecht | | date: Tue Sep 07 09:36:07 2004 +0200 | | summary: add if previous download of blas reuse it | | o | changeset: 353:bd84364412fe | | user: hecht | | date: Mon Sep 06 16:03:02 2004 +0200 | | summary: add missing file regtest.m4 in dist make target in examples++-tutorial | | o | changeset: 352:fca5bc988b28 | | user: hecht | | date: Mon Sep 06 14:00:11 2004 +0200 | | summary: Add -enable-generic_blas Download generic blas (implie --enable-download) | | o | changeset: 351:44f079ca1e54 | | user: hecht | | date: Fri Sep 03 10:45:06 2004 +0200 | | summary: empty SOURCESS variable in download/blas/Makefile.am because | | o | changeset: 350:1e46b370a8e8 | | user: hecht | | date: Thu Sep 02 16:04:15 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 349:aa868ed8a653 | | user: hecht | | date: Thu Sep 02 16:04:15 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 348:ea558c405714 | | user: hecht | | date: Thu Sep 02 16:04:15 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 347:e93fad9806ee | | user: hecht | | date: Thu Sep 02 16:04:15 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 346:699d36073a62 | | user: hecht | | date: Wed Sep 01 13:51:05 2004 +0200 | | summary: correct string[string] undelete pointer | | o | changeset: 345:3630bf06e805 | | user: hecht | | date: Wed Sep 01 13:51:05 2004 +0200 | | summary: correct string[string] undelete pointer | | o | changeset: 344:1f080b312de7 | | user: hecht | | date: Wed Sep 01 13:51:05 2004 +0200 | | summary: correct string[string] undelete pointer | | o | changeset: 343:2207149cc212 | | user: hecht | | date: Wed Sep 01 09:33:21 2004 +0200 | | summary: expand macro problem , suite (et fin?) | | o | changeset: 342:7f3e2e94c5dd | | user: hecht | | date: Wed Sep 01 09:33:21 2004 +0200 | | summary: expand macro problem , suite (et fin?) | | o | changeset: 341:5155e427a87d | | user: hecht | | date: Wed Sep 01 07:41:07 2004 +0200 | | summary: correct pb in macro generation (not finish) | | o | changeset: 340:c43b8c2be26a | | user: hecht | | date: Tue Aug 31 17:35:35 2004 +0200 | | summary: correct bug in macro expansion | | o | changeset: 339:ffcff5636f12 | | user: hecht | | date: Mon Aug 30 17:10:10 2004 +0200 | | summary: remove blas call on MacOS 9 | | o | changeset: 338:531a39f19f63 | | user: hecht | | date: Mon Aug 30 15:56:07 2004 +0200 | | summary: add blas call in choleski and LU solver | | o | changeset: 337:4fbef75b9c75 | | user: hecht | | date: Mon Aug 30 15:56:07 2004 +0200 | | summary: add blas call in choleski and LU solver | | o | changeset: 336:411e79c1f3d1 | | user: hecht | | date: Mon Aug 30 15:56:07 2004 +0200 | | summary: add blas call in choleski and LU solver | | o | changeset: 335:db4ae64b21ff | | user: hecht | | date: Mon Aug 30 14:13:24 2004 +0200 | | summary: add blas in choleski | | o | changeset: 334:a2136058155e | | user: hecht | | date: Mon Aug 30 14:13:24 2004 +0200 | | summary: add blas in choleski | | o | changeset: 333:3026860a14e7 | | user: hecht | | date: Mon Aug 30 14:13:24 2004 +0200 | | summary: add blas in choleski | | o | changeset: 332:adae49e68467 | | user: hecht | | date: Mon Aug 30 14:03:27 2004 +0200 | | summary: correct mpi/Makefile.am for compilation with g++-3.4 | | o | changeset: 331:d25cf7233e27 | | user: hecht | | date: Mon Aug 30 13:40:48 2004 +0200 | | summary: correction to by compatible wiath g++-3.4 | | o | changeset: 330:2053e59afe11 | | user: hecht | | date: Mon Aug 30 13:40:48 2004 +0200 | | summary: correction to by compatible wiath g++-3.4 | | o | changeset: 329:de5ee8de0427 | | user: hecht | | date: Fri Aug 27 17:42:26 2004 +0200 | | summary: correct g++-3.4 compilation probleme | | o | changeset: 328:5a1f1387f099 | | user: hecht | | date: Thu Aug 26 16:51:56 2004 +0200 | | summary: optimize cpu times on choleski and crout | | o | changeset: 327:c28bfd60ba97 | | user: hecht | | date: Thu Aug 26 15:04:49 2004 +0200 | | summary: correct divide by zero in plot | | o | changeset: 326:82e0b4315486 | | user: hecht | | date: Thu Aug 26 15:04:49 2004 +0200 | | summary: correct divide by zero in plot | | o | changeset: 325:cf3cb8ac4aff | | user: hecht | | date: Thu Aug 26 15:04:49 2004 +0200 | | summary: correct divide by zero in plot | | o | changeset: 324:03ff6dc560d5 | | user: hecht | | date: Thu Aug 26 15:04:49 2004 +0200 | | summary: correct divide by zero in plot | | o | changeset: 323:1a52cee5c2df | | user: hecht | | date: Thu Aug 26 15:04:49 2004 +0200 | | summary: correct divide by zero in plot | | o | changeset: 322:0aa1b06eb0ef | | user: lehyaric | | date: Fri Jul 16 14:40:18 2004 +0200 | | summary: Windows package for Version 1.41 complete. | | o | changeset: 321:1fe712bb592c | | user: lehyaric | | date: Fri Jul 16 14:40:18 2004 +0200 | | summary: Windows package for Version 1.41 complete. | | o | changeset: 320:def90fb6ed3d | | user: lehyaric | | date: Fri Jul 16 14:40:18 2004 +0200 | | summary: Windows package for Version 1.41 complete. | | o | changeset: 319:bf9d235a46b3 | | user: lehyaric | | date: Fri Jul 16 14:40:18 2004 +0200 | | summary: Windows package for Version 1.41 complete. | | o | changeset: 318:85f578ad260e | | user: lehyaric | | date: Fri Jul 16 14:40:18 2004 +0200 | | summary: Windows package for Version 1.41 complete. | | o | changeset: 317:6628af52db2b | | user: lehyaric | | date: Thu Jul 15 10:32:08 2004 +0200 | | summary: Regression tests ok on an Athlon 1.2 GHz. | | o | changeset: 316:53712bc8f199 | | user: lehyaric | | date: Tue Jul 13 14:20:36 2004 +0200 | | summary: Regression tests pass on cygwin. | | o | changeset: 315:8ea214d54ae7 | | user: lehyaric | | date: Tue Jul 13 11:13:06 2004 +0200 | | summary: Small comment change. | | o | changeset: 314:64a1e1e70dac | | user: lehyaric | | date: Tue Jul 13 11:12:29 2004 +0200 | | summary: Downloaded generic BLAS now work on cedre (redhat, pentium 4). | | o | changeset: 313:1faecf8849ea | | user: lehyaric | | date: Tue Jul 13 11:12:29 2004 +0200 | | summary: Downloaded generic BLAS now work on cedre (redhat, pentium 4). | | o | changeset: 312:d2475c116bac | | user: lehyaric | | date: Tue Jul 13 11:01:50 2004 +0200 | | summary: Optimized BLAS replaced with generic BLAS for generic compilation. | | o | changeset: 311:9d99b39cf9d4 | | user: lehyaric | | date: Tue Jul 13 10:29:57 2004 +0200 | | summary: Duplicates xerbla.f when downloading generic blas. | | o | changeset: 310:71ed69bf1371 | | user: lehyaric | | date: Mon Jul 12 17:38:15 2004 +0200 | | summary: Uses generic BLAS for generic compilation, because it is faster to compile | | o | changeset: 309:4223a25835b8 | | user: lehyaric | | date: Mon Jul 12 17:38:15 2004 +0200 | | summary: Uses generic BLAS for generic compilation, because it is faster to compile | | o | changeset: 308:b9a134a6f6e2 | | user: lehyaric | | date: Fri Jul 09 18:10:16 2004 +0200 | | summary: New script to upload Debian packages. | | o | changeset: 307:db4e0b9fb8e6 | | user: lehyaric | | date: Fri Jul 09 18:10:16 2004 +0200 | | summary: New script to upload Debian packages. | | o | changeset: 306:fcea44571ff4 | | user: darrasse | | date: Fri Jul 09 16:52:17 2004 +0200 | | summary: Mise à jour de la liste des auteurs | | o | changeset: 305:a518d55630cf | | user: lehyaric | | date: Fri Jul 09 10:04:55 2004 +0200 | | summary: Binary ATLAS download disabled for the moment. | | o | changeset: 304:e8c7b5754d95 | | user: hecht | | date: Thu Jul 08 15:31:42 2004 +0200 | | summary: install-www in progress | | o | changeset: 303:7af6fdba37a9 | | user: lehyaric | | date: Thu Jul 08 15:22:13 2004 +0200 | | summary: The precompiled ATLAS library is now correctly downloaded and uncompressed, | | o | changeset: 302:193850ffeebf | | user: lehyaric | | date: Thu Jul 08 15:22:13 2004 +0200 | | summary: The precompiled ATLAS library is now correctly downloaded and uncompressed, | | o | changeset: 301:1a7ea2e9e383 | | user: lehyaric | | date: Thu Jul 08 15:22:13 2004 +0200 | | summary: The precompiled ATLAS library is now correctly downloaded and uncompressed, | | o | changeset: 300:470d4053c3da | | user: hecht | | date: Thu Jul 08 15:21:08 2004 +0200 | | summary: correct install-www | | o | changeset: 299:7cd6515116e5 | | user: lehyaric | | date: Thu Jul 08 13:15:48 2004 +0200 | | summary: Reference values for regression tests with and without UMFPACK merged. | | o | changeset: 298:fcf594999fd7 | | user: lehyaric | | date: Thu Jul 08 13:15:48 2004 +0200 | | summary: Reference values for regression tests with and without UMFPACK merged. | | o | changeset: 297:3dce3e57c22a | | user: lehyaric | | date: Thu Jul 08 13:15:48 2004 +0200 | | summary: Reference values for regression tests with and without UMFPACK merged. | | o | changeset: 296:b5573d38d3fd | | user: lehyaric | | date: Thu Jul 08 12:02:10 2004 +0200 | | summary: Option to download a precompiled version of ATLAS programmed in, but not | | o | changeset: 295:fefc602af266 | | user: lehyaric | | date: Thu Jul 08 10:44:43 2004 +0200 | | summary: Debian binary packages created, but not tested yet. | | o | changeset: 294:2269542083d4 | | user: lehyaric | | date: Wed Jul 07 17:42:54 2004 +0200 | | summary: Debian packaging in progress. | | o | changeset: 293:5fa437bd58d9 | | user: lehyaric | | date: Wed Jul 07 17:42:54 2004 +0200 | | summary: Debian packaging in progress. | | o | changeset: 292:3c887a990870 | | user: hecht | | date: Wed Jul 07 16:25:04 2004 +0200 | | summary: correction on macosX version | | o | changeset: 291:a2af1c655832 | | user: hecht | | date: Wed Jul 07 16:25:04 2004 +0200 | | summary: correction on macosX version | | o | changeset: 290:e6ecf315812d | | user: hecht | | date: Wed Jul 07 16:25:04 2004 +0200 | | summary: correction on macosX version | | o | changeset: 289:c51cd2b05332 | | user: hecht | | date: Wed Jul 07 15:56:15 2004 +0200 | | summary: correct pb in freefem++.app on macosX | | o | changeset: 288:e142da063d15 | | user: hecht | | date: Wed Jul 07 15:13:27 2004 +0200 | | summary: correct install-www script | | o | changeset: 287:ab379a17cf2e | | user: hecht | | date: Wed Jul 07 14:40:01 2004 +0200 | | summary: add native9 make target for Mac9 version | | o | changeset: 286:6aaa1a3f395f | | user: hecht | | date: Wed Jul 07 14:29:05 2004 +0200 | | summary: correct pb in MACOSX version and instal-www file | | o | changeset: 285:28ea7398dafd | | user: hecht | | date: Wed Jul 07 14:24:10 2004 +0200 | | summary: correct path of FreeFem++-CoCoa file in install | | o | changeset: 284:8609cad81843 | | user: hecht | | date: Wed Jul 07 14:05:51 2004 +0200 | | summary: Add COPYRIGHT file | | o | changeset: 283:1525c53ec559 | | user: hecht | | date: Wed Jul 07 13:58:17 2004 +0200 | | summary: Add INSTALL-MacOS file | | o | changeset: 282:94e900430e00 | | user: lehyaric | | date: Wed Jul 07 12:51:55 2004 +0200 | | summary: Debian packaging in progress. | | o | changeset: 281:f5220090d815 | | user: lehyaric | | date: Wed Jul 07 12:51:55 2004 +0200 | | summary: Debian packaging in progress. | | o | changeset: 280:421a0c5540ec | | user: hecht | | date: Wed Jul 07 12:41:05 2004 +0200 | | summary: mal change in epsilon for regtest (on idared) | | o | changeset: 279:0f1c9dc9f21f | | user: hecht | | date: Wed Jul 07 12:09:31 2004 +0200 | | summary: correct pb in m4 parameter for building regtests.edp | | o | changeset: 278:669fb7802b66 | | user: hecht | | date: Wed Jul 07 11:32:55 2004 +0200 | | summary: add install-www to set web server | | o | changeset: 277:ce3021db6c88 | | tag: release_1_41_before_packaging | | user: lehyaric | | date: Mon Jul 05 14:38:47 2004 +0200 | | summary: Remove debugging information | | o | changeset: 276:7a4a883326b9 | | user: lehyaric | | date: Thu Jul 01 16:13:29 2004 +0200 | | summary: Improvements on regression tests on Idared, but still a segmentation fault | | o | changeset: 275:82325608c7fa | | user: lehyaric | | date: Thu Jul 01 16:04:09 2004 +0200 | | summary: All regression tests ok on Cedre. | | o | changeset: 274:9f94970bb44b | | user: lehyaric | | date: Thu Jul 01 16:04:09 2004 +0200 | | summary: All regression tests ok on Cedre. | | o | changeset: 273:2d7625db8ce9 | | user: lehyaric | | date: Thu Jul 01 16:04:09 2004 +0200 | | summary: All regression tests ok on Cedre. | | o | changeset: 272:7be0ae88c080 | | user: lehyaric | | date: Thu Jul 01 15:33:45 2004 +0200 | | summary: All regression tests ok on Hydre. | | o | changeset: 271:df58e4bd4eda | | user: lehyaric | | date: Thu Jul 01 15:33:45 2004 +0200 | | summary: All regression tests ok on Hydre. | | o | changeset: 270:0757f6282056 | | user: lehyaric | | date: Thu Jul 01 15:33:45 2004 +0200 | | summary: All regression tests ok on Hydre. | | o | changeset: 269:bd99d82ae56e | | user: lehyaric | | date: Thu Jul 01 15:33:45 2004 +0200 | | summary: All regression tests ok on Hydre. | | o | changeset: 268:2e6c9c4611a5 | | user: lehyaric | | date: Thu Jul 01 14:26:01 2004 +0200 | | summary: More updates to make parallel regression tests work. | | o | changeset: 267:43dffe189376 | | user: lehyaric | | date: Thu Jul 01 14:26:01 2004 +0200 | | summary: More updates to make parallel regression tests work. | | o | changeset: 266:2934f663b1f6 | | user: lehyaric | | date: Thu Jul 01 14:26:01 2004 +0200 | | summary: More updates to make parallel regression tests work. | | o | changeset: 265:03a2012d998f | | user: lehyaric | | date: Thu Jul 01 14:18:33 2004 +0200 | | summary: Correcting some problems with parallel regressions tests. | | o | changeset: 264:5659084d9b60 | | user: lehyaric | | date: Thu Jul 01 14:15:43 2004 +0200 | | summary: Separate set of reference values when UMFPACK is not available. | | o | changeset: 263:be8728bf6836 | | user: lehyaric | | date: Thu Jul 01 13:21:41 2004 +0200 | | summary: More tests on the parallel version (FreeFem++-mpi) | | o | changeset: 262:d6eeb2d1500d | | user: lehyaric | | date: Wed Jun 30 15:47:51 2004 +0200 | | summary: Regression tests installed in examples++-tutorial, with a separate file | | o | changeset: 261:2b2296d0b03d | | user: lehyaric | | date: Wed Jun 30 14:29:48 2004 +0200 | | summary: New file configure.param containing configure parameters. | | o | changeset: 260:74d8cc71c4ba | | user: lehyaric | | date: Wed Jun 30 10:47:20 2004 +0200 | | summary: Describes how to compile FreeFem++ on Windows. | | o | changeset: 259:f5b3a2abcf03 | | user: lehyaric | | date: Wed Jun 30 10:45:28 2004 +0200 | | summary: Because of the way return codes are handled inside shell pipe "|" commands, | | o | changeset: 258:dc3cf3b8e5f1 | | user: lehyaric | | date: Tue Jun 29 18:41:14 2004 +0200 | | summary: More upgrades to make the source tar file compilable on most architectures. | | o | changeset: 257:93336381edc4 | | user: lehyaric | | date: Tue Jun 29 18:41:14 2004 +0200 | | summary: More upgrades to make the source tar file compilable on most architectures. | | o | changeset: 256:e511f057ffa7 | | user: lehyaric | | date: Tue Jun 29 18:41:14 2004 +0200 | | summary: More upgrades to make the source tar file compilable on most architectures. | | o | changeset: 255:3be4e4e86327 | | user: lehyaric | | date: Tue Jun 29 18:41:14 2004 +0200 | | summary: More upgrades to make the source tar file compilable on most architectures. | | o | changeset: 254:3a93a6f5e3fb | | user: lehyaric | | date: Tue Jun 29 18:41:14 2004 +0200 | | summary: More upgrades to make the source tar file compilable on most architectures. | | o | changeset: 253:413fa728d595 | | user: lehyaric | | date: Tue Jun 29 18:41:14 2004 +0200 | | summary: More upgrades to make the source tar file compilable on most architectures. | | o | changeset: 252:95739d9cec9c | | user: hecht | | date: Mon Jun 28 22:02:09 2004 +0200 | | summary: correct double echo in macro expansion | | o | changeset: 251:c787dfc0af48 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 250:fbad8a94c9fe | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 249:23513d2a05c2 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 248:b46fb2019dd4 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 247:cceac60d1b66 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 246:bbba443f4309 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 245:33d98ebd3407 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 244:7ebb82020029 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 243:cb7d05e66ca1 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 242:ce4ed3033dda | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 241:ccf83b55c405 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 240:c880a524e281 | | user: lehyaric | | date: Mon Jun 28 19:26:56 2004 +0200 | | summary: .tar.gz packages currently being tested and improved. Testing architectures | | o | changeset: 239:491d91e180a6 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 238:1a92d214e4e9 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 237:18d9f46d6956 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 236:6dbd1f92fe78 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 235:9f6dc3d57397 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 234:c4b6d34b9c58 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 233:15448ffdb476 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 232:ad9b66078f50 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 231:244e10acad9f | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 230:a061edaca896 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 229:5f042d9e08c1 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 228:51b52fdc0699 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 227:9cf12e9fcc6a | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 226:b39368025dc3 | | user: lehyaric | | date: Mon Jun 28 12:36:53 2004 +0200 | | summary: Gathering all regression check in one location (regtests.edp) to let | | o | changeset: 225:8be6dcc104ac | | user: lehyaric | | date: Mon Jun 28 11:07:54 2004 +0200 | | summary: Cleaning and improving the MacOS version. | | o | changeset: 224:e98a86d4e84a | | user: lehyaric | | date: Mon Jun 28 11:07:54 2004 +0200 | | summary: Cleaning and improving the MacOS version. | | o | changeset: 223:4fe29fbcb591 | | user: lehyaric | | date: Mon Jun 28 11:07:53 2004 +0200 | | summary: Cleaning and improving the MacOS version. | | o | changeset: 222:11ea2dc80fda | | user: hecht | | date: Mon Jun 28 09:41:41 2004 +0200 | | summary: small correct | | o | changeset: 221:803825852848 | | user: hecht | | date: Mon Jun 28 09:33:07 2004 +0200 | | summary: FH correct pb in file name | | o | changeset: 220:49f933c9d7c5 | | user: hecht | | date: Mon Jun 28 09:29:04 2004 +0200 | | summary: Correct small thing in DOC and add losed figure | | o | changeset: 219:b0b3f7597046 | | user: hecht | | date: Mon Jun 28 09:29:04 2004 +0200 | | summary: Correct small thing in DOC and add losed figure | | o | changeset: 218:260856bae4be | | user: hecht | | date: Mon Jun 28 09:29:04 2004 +0200 | | summary: Correct small thing in DOC and add losed figure | | o | changeset: 217:d8ebe140a004 | | user: hecht | | date: Sun Jun 27 17:18:35 2004 +0200 | | summary: FH modif .plist file for MacOS application | | o | changeset: 216:274201b08277 | | user: hecht | | date: Sun Jun 27 17:18:35 2004 +0200 | | summary: FH modif .plist file for MacOS application | | o | changeset: 215:b34523490134 | | user: hecht | | date: Sun Jun 27 17:18:35 2004 +0200 | | summary: FH modif .plist file for MacOS application | | o | changeset: 214:1abaf5e80c5b | | user: lehyaric | | date: Fri Jun 25 18:39:04 2004 +0200 | | summary: Added a new scheme for checking numerical results in each example | | o | changeset: 213:d345132caf0d | | user: hecht | | date: Fri Jun 25 18:31:20 2004 +0200 | | summary: FH: add bug example | | o | changeset: 212:ed255a0ab2b9 | | user: hecht | | date: Fri Jun 25 18:30:14 2004 +0200 | | summary: FH: compile FLAG optimization on MACOS | | o | changeset: 211:952ea771ea45 | | user: hecht | | date: Fri Jun 25 17:54:02 2004 +0200 | | summary: FH: correct the -fast compilation flag on MACOS (remove -malign-natural) | | o | changeset: 210:ee742b18566c | | user: hecht | | date: Fri Jun 25 17:54:02 2004 +0200 | | summary: FH: correct the -fast compilation flag on MACOS (remove -malign-natural) | | o | changeset: 209:566f15d34ead | | user: lehyaric | | date: Fri Jun 25 17:30:51 2004 +0200 | | summary: Making "make visualcheck" work. | | o | changeset: 208:830668a369ab | | user: lehyaric | | date: Fri Jun 25 15:46:10 2004 +0200 | | summary: POSIX system calls times() and sysconf() are not defined in Mingw system | | o | changeset: 207:5f265a041999 | | user: lehyaric | | date: Fri Jun 25 14:18:35 2004 +0200 | | summary: Displays test output as well as recording it during regression tests. | | o | changeset: 206:2a8140e574cd | | user: hecht | | date: Fri Jun 25 14:13:56 2004 +0200 | | summary: add a forgottent & in toString Complex) | | o | changeset: 205:1a8af1b6cc4e | | user: hecht | | date: Fri Jun 25 14:04:48 2004 +0200 | | summary: change toString to remove problem of optimisation flag -fast on MacOS | | o | changeset: 204:cdda0f23627e | | user: lehyaric | | date: Fri Jun 25 13:53:20 2004 +0200 | | summary: Avoids the gcc option "-rdynamic" (used for dlopen()) on MacOS. | | o | changeset: 203:50b0a79472d0 | | user: lehyaric | | date: Fri Jun 25 13:42:27 2004 +0200 | | summary: Still more corrections to make regtests.sh work. | | o | changeset: 202:7350e7f03cb7 | | user: lehyaric | | date: Fri Jun 25 12:21:00 2004 +0200 | | summary: Corrected bug where FreeFem++ command was not correctly constructed | | o | changeset: 201:1a97c5f8dae3 | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 200:bf6116bf6e14 | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 199:f9a372018d4d | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 198:173890d6cffd | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 197:1ea692423a96 | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 196:eafde84d3182 | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 195:36fad8e658ca | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 194:84be95355842 | | user: hecht | | date: Fri Jun 25 12:17:20 2004 +0200 | | summary: add periodic adaptmesh stuff | | o | changeset: 193:cc913a248488 | | user: lehyaric | | date: Fri Jun 25 12:12:19 2004 +0200 | | summary: Corrected bug where file examples++-other/speedtest.out was not updated | | o | changeset: 192:5eb924283df1 | | user: lehyaric | | date: Fri Jun 25 11:55:15 2004 +0200 | | summary: Replaced all occurrences of regtests.pl with regtests.sh | | o | changeset: 191:5f334f30cf3d | | user: lehyaric | | date: Fri Jun 25 11:05:41 2004 +0200 | | summary: Correcting the definition of VersionFreeFemDate and VersionFreeFempp | | o | changeset: 190:46b1668643d5 | | user: lehyaric | | date: Fri Jun 25 10:59:16 2004 +0200 | | summary: More documentation for config-version.h generation. | | o | changeset: 189:63d0c3f29db0 | | user: lehyaric | | date: Fri Jun 25 10:55:37 2004 +0200 | | summary: - Restructuring the regression tests suite to run all non windowed tests | | o | changeset: 188:05d5f79cdebc | | user: lehyaric | | date: Fri Jun 25 10:55:37 2004 +0200 | | summary: - Restructuring the regression tests suite to run all non windowed tests | | o | changeset: 187:dd9823784d74 | | user: lehyaric | | date: Fri Jun 25 10:55:37 2004 +0200 | | summary: - Restructuring the regression tests suite to run all non windowed tests | | o | changeset: 186:28349aab8571 | | user: lehyaric | | date: Fri Jun 25 10:55:37 2004 +0200 | | summary: - Restructuring the regression tests suite to run all non windowed tests | | o | changeset: 185:18a8cf3b1821 | | user: lehyaric | | date: Fri Jun 25 10:55:37 2004 +0200 | | summary: - Restructuring the regression tests suite to run all non windowed tests | | o | changeset: 184:4f7f186b636b | | user: darrasse | | date: Thu Jun 24 18:09:06 2004 +0200 | | summary: Ajout du packet freefem++-doc contenant la documentation | | o | changeset: 183:e7ca62ae4d11 | | user: darrasse | | date: Thu Jun 24 18:09:06 2004 +0200 | | summary: Ajout du packet freefem++-doc contenant la documentation | | o | changeset: 182:0e82b2a232ce | | user: darrasse | | date: Thu Jun 24 18:09:06 2004 +0200 | | summary: Ajout du packet freefem++-doc contenant la documentation | | o | changeset: 181:66f445bf7317 | | user: lehyaric | | date: Thu Jun 24 17:08:22 2004 +0200 | | summary: Some commands (like make speedtest and doc) are more thoroughly documented. | | o | changeset: 180:c2c2f1bc0b5d | | user: lehyaric | | date: Thu Jun 24 16:49:17 2004 +0200 | | summary: Give a value to LD_LIBRARY_PATH for the examples++-load regression tests. | | o | changeset: 179:b4d6436c35bf | | user: lehyaric | | date: Thu Jun 24 16:05:39 2004 +0200 | | summary: Regression tests for the parallel version are ok. | | o | changeset: 178:089de7eb3548 | | user: darrasse | | date: Thu Jun 24 14:44:46 2004 +0200 | | summary: Changement de priorité des alternatives. x11 est prioritaire à glx. | | o | changeset: 177:6b4f77f9d655 | | user: lehyaric | | date: Thu Jun 24 13:50:15 2004 +0200 | | summary: examples++-load now works on Cedre (Red Hat), with debug options. | | o | changeset: 176:13a795a47cb0 | | user: lehyaric | | date: Thu Jun 24 13:50:15 2004 +0200 | | summary: examples++-load now works on Cedre (Red Hat), with debug options. | | o | changeset: 175:fe0ca2334cad | | user: lehyaric | | date: Thu Jun 24 12:27:06 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 174:50971f3da918 | | user: lehyaric | | date: Thu Jun 24 12:27:06 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 173:e5c1f7c7ce17 | | user: lehyaric | | date: Thu Jun 24 11:52:52 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 172:1d1b041dabfc | | user: darrasse | | date: Thu Jun 24 11:48:27 2004 +0200 | | summary: Ajout de plusieurs this-> pour la compilation avec g++-3.4 | | o | changeset: 171:04867a5d5213 | | user: lehyaric | | date: Thu Jun 24 10:44:31 2004 +0200 | | summary: GLX version was not compiled on MacOS X. Corrected. | | o | changeset: 170:7e35f0a71ca8 | | user: lehyaric | | date: Thu Jun 24 09:46:04 2004 +0200 | | summary: examples++-load is being worked on. It still poses problems. | | o | changeset: 169:9ac236b0dd89 | | user: lehyaric | | date: Thu Jun 24 09:46:04 2004 +0200 | | summary: examples++-load is being worked on. It still poses problems. | | o | changeset: 168:579a83fef807 | | user: hecht | | date: Thu Jun 24 08:09:48 2004 +0200 | | summary: modif to bee compatible with g++ 3.4 | | o | changeset: 167:530be6b2021c | | user: darrasse | | date: Thu Jun 24 04:12:48 2004 +0200 | | summary: Nouvel ajout de this-> pour la compilation avec g++-3.4 | | o | changeset: 166:91dcaa97dd82 | | user: darrasse | | date: Thu Jun 24 03:37:52 2004 +0200 | | summary: Ajout de quelques this-> pour la compilation avec g++ 3.4 | | o | changeset: 165:f80016364270 | | user: darrasse | | date: Thu Jun 24 02:16:48 2004 +0200 | | summary: Ajout d'une page man générique, obligatoire pour Debian. | | o | changeset: 164:8861a5960357 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 163:c6f04faebb32 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 162:2eae0e0f0869 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 161:34d7f2a2a9f1 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 160:a94d47551f62 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 159:704f142ac8a6 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 158:462a19c6fd35 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 157:14490711226c | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 156:ecd8d9f031c5 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 155:39009c82f388 | | user: darrasse | | date: Thu Jun 24 02:12:43 2004 +0200 | | summary: Insertion du dossier debian contenant les fichiers nécessaires pour la | | o | changeset: 154:4c9e9eaee438 | | user: lehyaric | | date: Wed Jun 23 17:05:33 2004 +0200 | | summary: The regression tests have been checked up to examples++-load not included | | o | changeset: 153:cd34c9818fdd | | user: lehyaric | | date: Wed Jun 23 15:47:48 2004 +0200 | | summary: Problem with AGL on MasOSX solved: it was not selected for compilation | | o | changeset: 152:56ce98e3dd00 | | user: lehyaric | | date: Wed Jun 23 14:04:06 2004 +0200 | | summary: Regression tests are currently being checked. | | o | changeset: 151:0629efd36bdf | | user: lehyaric | | date: Wed Jun 23 14:04:06 2004 +0200 | | summary: Regression tests are currently being checked. | | o | changeset: 150:d74e4f965d34 | | user: lehyaric | | date: Wed Jun 23 14:04:06 2004 +0200 | | summary: Regression tests are currently being checked. | | o | changeset: 149:ef13ddf7a19d | | user: lehyaric | | date: Wed Jun 23 11:36:17 2004 +0200 | | summary: Mise à jour de la configuration de UMFPACK | | o | changeset: 148:8c35b9bd5a21 | | user: lehyaric | | date: Tue Jun 22 18:44:09 2004 +0200 | | summary: Bug preventing the separate compilation of src/fflib/lex.cpp corrected. | | o | changeset: 147:b83c3d850f19 | | user: lehyaric | | date: Tue Jun 22 18:25:26 2004 +0200 | | summary: New 'speedtest' goal to run FreeFem++-nw on examples++-other/lap3-cpu.edp | | o | changeset: 146:b4100d9e3db7 | | user: lehyaric | | date: Tue Jun 22 17:12:59 2004 +0200 | | summary: Optimization ok on PowerPC G5 (Idared) | | o | changeset: 145:9f310e0c592f | | user: lehyaric | | date: Tue Jun 22 15:38:05 2004 +0200 | | summary: Optimized version ok on cedre (Intel Xeon + gcc + Red Hat Linux) | | o | changeset: 144:5835fb842952 | | user: lehyaric | | date: Tue Jun 22 15:38:05 2004 +0200 | | summary: Optimized version ok on cedre (Intel Xeon + gcc + Red Hat Linux) | | o | changeset: 143:3228d62729ed | | user: lehyaric | | date: Tue Jun 22 15:38:05 2004 +0200 | | summary: Optimized version ok on cedre (Intel Xeon + gcc + Red Hat Linux) | | o | changeset: 142:5a7bc526e492 | | user: darrasse | | date: Tue Jun 22 15:32:22 2004 +0200 | | summary: correction de la détection de UMFPACK | | o | changeset: 141:668587ef4273 | | user: lehyaric | | date: Tue Jun 22 12:05:59 2004 +0200 | | summary: Correction minime de l'explication de --enable-debug. | | o | changeset: 140:76886e6c7a58 | | user: lehyaric | | date: Mon Jun 21 17:06:16 2004 +0200 | | summary: Optimization ok on Debian/Testing. | | o | changeset: 139:06ec58be4aa1 | | user: hecht | | date: Mon Jun 21 16:56:55 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 138:93b07446f4c5 | | user: hecht | | date: Mon Jun 21 16:49:06 2004 +0200 | | summary: le fichier fflib/lg.tab.hpp est dans de dir lglib et genere par bison | | o | changeset: 137:ba2a49602ec0 | | user: lehyaric | | date: Mon Jun 21 16:24:54 2004 +0200 | | summary: Parallel version modified to use downloaded UMFPACK if available. | | o | changeset: 136:7dd82d676d0d | | user: lehyaric | | date: Mon Jun 21 15:53:15 2004 +0200 | | summary: Some corrections for the "generic" optimization mode. | | o | changeset: 135:154e95f0efb4 | | user: lehyaric | | date: Mon Jun 21 15:31:16 2004 +0200 | | summary: Hardware-dependant optimization options currently being selected. | | o | changeset: 134:2fc65e06c099 | | user: hecht | | date: Mon Jun 21 11:08:16 2004 +0200 | | summary: add example of test the optimised version | | o | changeset: 133:41b3e409ce8d | | user: hecht | | date: Mon Jun 21 11:08:16 2004 +0200 | | summary: add example of test the optimised version | | o | changeset: 132:aa3b6d5dea5a | | user: hecht | | date: Mon Jun 21 11:08:16 2004 +0200 | | summary: add example of test the optimised version | | o | changeset: 131:ee15f9879bb0 | | user: lehyaric | | date: Sun Jun 20 19:58:38 2004 +0200 | | summary: Optimiztion for Pentium III added. | | o | changeset: 130:07ffea2fef49 | | user: lehyaric | | date: Sun Jun 20 19:30:28 2004 +0200 | | summary: Configuration of compiler optimization flags still being developed. | | o | changeset: 129:5e6217c43c12 | | user: lehyaric | | date: Sun Jun 20 13:26:50 2004 +0200 | | summary: acmacros.m4 and acoptim.m4 will centralize all the necessary treatments | | o | changeset: 128:49ecc5ec76f1 | | user: hecht | | date: Sat Jun 19 14:23:20 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 127:27909cc2efe4 | | user: hecht | | date: Fri Jun 18 17:50:43 2004 +0200 | | summary: add modif compilation avec gcc 3.4 | | o | changeset: 126:eb38cdcad258 | | user: lehyaric | | date: Fri Jun 18 10:31:16 2004 +0200 | | summary: Documentation proofreading ok up to §3.6 included | | o | changeset: 125:eebea7c8bada | | user: lehyaric | | date: Thu Jun 17 14:34:49 2004 +0200 | | summary: - Documentation proofreading ok up to §3.6 included | | o | changeset: 124:de5ab079f924 | | user: lehyaric | | date: Wed Jun 16 14:47:48 2004 +0200 | | summary: - Removing emacs backup files | | o | changeset: 123:f8b658a60f71 | | user: hecht | | date: Wed Jun 16 14:36:50 2004 +0200 | | summary: add projet codewarrior dans la base CVS en mode Binaire | | o | changeset: 122:4365bece55ed | | user: hecht | | date: Wed Jun 16 14:35:38 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 121:b1c8e1f1fbfa | | user: hecht | | date: Wed Jun 16 14:32:24 2004 +0200 | | summary: correction of string argument in macro processing | | o | changeset: 120:e8a577e435c5 | | user: hecht | | date: Wed Jun 16 14:32:24 2004 +0200 | | summary: correction of string argument in macro processing | | o | changeset: 119:2b3e676ae747 | | user: hecht | | date: Wed Jun 16 14:32:24 2004 +0200 | | summary: correction of string argument in macro processing | | o | changeset: 118:3c790a15669c | | user: hecht | | date: Wed Jun 16 14:32:24 2004 +0200 | | summary: correction of string argument in macro processing | | o | changeset: 117:4223b571b7a2 | | user: hecht | | date: Wed Jun 16 14:32:24 2004 +0200 | | summary: correction of string argument in macro processing | | o | changeset: 116:6d4f0efd7290 | | user: hecht | | date: Wed Jun 16 14:32:24 2004 +0200 | | summary: correction of string argument in macro processing | | o | changeset: 115:8830c3e6a420 | | user: hecht | | date: Wed Jun 16 14:25:41 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 114:15154662ef97 | | user: lehyaric | | date: Tue Jun 15 12:08:37 2004 +0200 | | summary: Proofreading ok up to §2.3 included. | | o | changeset: 113:f3859d20ff80 | | user: lehyaric | | date: Thu Jun 10 10:16:17 2004 +0200 | | summary: - Relecture Anglais documentation: chapitre I ok. | | o | changeset: 112:5dfaf78878eb | | user: lehyaric | | date: Thu Jun 10 10:16:17 2004 +0200 | | summary: - Relecture Anglais documentation: chapitre I ok. | | o | changeset: 111:d602db40f9df | | user: lehyaric | | date: Thu Jun 10 10:16:17 2004 +0200 | | summary: - Relecture Anglais documentation: chapitre I ok. | | o | changeset: 110:85d80f2e6265 | | user: lehyaric | | date: Wed Jun 09 10:09:10 2004 +0200 | | summary: More help on CVS and automake. | | o | changeset: 109:66de63c37bce | | user: lehyaric | | date: Tue Jun 08 16:10:19 2004 +0200 | | summary: Relecture anglais doc arrivé au § 1.3 | | o | changeset: 108:93fa37e6dc7e | | user: lehyaric | | date: Mon Jun 07 16:34:17 2004 +0200 | | summary: Première relecture des fichiers README et associés. | | o | changeset: 107:828ba65d9130 | | user: lehyaric | | date: Mon Jun 07 16:34:17 2004 +0200 | | summary: Première relecture des fichiers README et associés. | | o | changeset: 106:d76a5467a2c6 | | user: lehyaric | | date: Mon Jun 07 16:34:17 2004 +0200 | | summary: Première relecture des fichiers README et associés. | | o | changeset: 105:b58a786980f6 | | user: lehyaric | | date: Mon Jun 07 16:34:17 2004 +0200 | | summary: Première relecture des fichiers README et associés. | | o | changeset: 104:83b96ae3f863 | | user: lehyaric | | date: Mon Jun 07 16:34:17 2004 +0200 | | summary: Première relecture des fichiers README et associés. | | o | changeset: 103:23de4ddd9d39 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 102:99d43ca61439 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 101:ab16a232f526 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 100:c59fb66f9425 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 99:0bfd80be1c8c | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 98:a12e2d2e0631 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 97:3874c0fba853 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 96:502d1784ed2e | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 95:4dcb9aa0c74e | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 94:37cfd09bf134 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 93:e648a1bfdd58 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 92:dae695622eac | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 91:27cd79875601 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 90:c8bda48c4105 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 89:eb18bcf09a34 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 88:a820a6c27662 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 87:2658627dd95d | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 86:2eb5adcc8f3b | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 85:5c4c5a9817fa | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 84:d7c50a038a79 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 83:e0934bf79429 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 82:60ee4abf02ca | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 81:2bfb83f8a44d | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 80:1b42fd3b13ff | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 79:dfbcaf6116ec | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 78:c990f2f011b2 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 77:2522953f44a9 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 76:d6250e981cf3 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 75:b1d17073cf16 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 74:d524e9ab1f96 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 73:c34a8b43dbb8 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 72:266eeb6a5ad6 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 71:3039d27ef299 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 70:425fc26308ae | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 69:958cf52ec0ae | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 68:7f82309eca0d | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 67:5056a0adbdc9 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 66:db1bcf6b5777 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 65:bb600795df63 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 64:f81592709735 | | user: lehyaric | | date: Fri Jun 04 16:06:25 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 63:2a6417d3e573 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 62:f25428415d3c | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 61:49f2a29fb46e | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 60:c69b6f268006 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 59:9e03261e3434 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 58:1ec7cc14da21 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 57:19c0a9c331c9 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 56:13019879f42e | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 55:c9fab124321e | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 54:a0ae934447f2 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 53:2c37fdc607e9 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 52:fbd4411abda7 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 51:0f97c8037b88 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 50:104bb1f450ad | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 49:23d20c1baebb | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 48:62334abc40ee | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 47:d8836d2bd9f6 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 46:c42f18e39eb4 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 45:5343bcf3d526 | | user: lehyaric | | date: Fri Jun 04 16:06:24 2004 +0200 | | summary: Les modifications faites dans la branche "alh-autoconf" sont réintégrées | | o | changeset: 44:3572cd801d80 | | user: hecht | | date: Fri Jun 04 15:22:02 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 43:7baa4c3c41ef | | user: hecht | | date: Fri Jun 04 15:22:02 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 42:68e784364499 | | user: hecht | | date: Wed May 26 22:22:36 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 41:db5375fde77a | | user: hecht | | date: Wed May 26 22:00:26 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 40:399fdf624955 | | user: hecht | | date: Wed May 26 21:58:43 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 39:00b51a05f198 | | user: lehyaric | | date: Wed May 26 11:10:01 2004 +0200 | | summary: manual.tex est réinitialisé à sa version 1.6, car les modifications | | o | changeset: 38:4f307cbfc41a | | user: hecht | | date: Tue May 25 13:51:07 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 37:9c04976869b2 | | user: ly | | date: Tue May 25 12:31:17 2004 +0200 | | summary: Chaque exemple a ete reecrit dans un fichier tex separe, et inclus dans le | | o | changeset: 36:00d12a962282 | | user: ly | | date: Tue May 25 12:31:17 2004 +0200 | | summary: Chaque exemple a ete reecrit dans un fichier tex separe, et inclus dans le | | o | changeset: 35:e67f5d108cb8 | | user: ly | | date: Tue May 25 12:31:17 2004 +0200 | | summary: Chaque exemple a ete reecrit dans un fichier tex separe, et inclus dans le | | o | changeset: 34:fcaf81e18093 | | user: ly | | date: Tue May 25 12:31:17 2004 +0200 | | summary: Chaque exemple a ete reecrit dans un fichier tex separe, et inclus dans le | | o | changeset: 33:6e952764275e | | user: ly | | date: Tue May 25 12:31:17 2004 +0200 | | summary: Chaque exemple a ete reecrit dans un fichier tex separe, et inclus dans le | | o | changeset: 32:7d38e62303a8 | | user: lehyaric | | date: Fri May 14 15:46:33 2004 +0200 | | summary: Début de la relecture de l'anglais de la doc. | | o | changeset: 31:25279b0696ab | | user: lehyaric | | date: Fri May 14 10:58:43 2004 +0200 | | summary: manual.pdf and manual.ps.gz are automaticalle regenerated, so they should | | o | changeset: 30:86ccde355d34 | | user: lehyaric | | date: Fri May 14 10:43:34 2004 +0200 | | summary: Récupération des Makefiles (depuis l'archive de la version 1.40) qui | | o | changeset: 29:63564e1a54d8 | | user: lehyaric | | date: Thu May 13 14:07:13 2004 +0200 | | summary: Séparation d'une branche spéciale pour les essais de autoconf. | | o | changeset: 28:0e192a3be805 | | user: lehyaric | | date: Thu May 13 14:00:37 2004 +0200 | | summary: Intégration de Autoconf et Automake dans la procédure de build en cours. | | o | changeset: 27:33eb5379f1b1 | | user: lehyaric | | date: Thu May 13 09:54:49 2004 +0200 | | summary: Ajout progressif de tous les fichiers à ignorer. | | o | changeset: 26:c5f6979dfddd | | user: hecht | | date: Wed May 12 21:32:42 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 25:4bf5a81958af | | user: lehyaric | | date: Wed May 12 14:34:39 2004 +0200 | | summary: Fichier regénéré à la compilation | | o | changeset: 24:343d50721685 | | user: ly | | date: Wed May 12 13:21:45 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 23:86eda52226a7 | | user: ly | | date: Wed May 12 13:21:44 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 22:4aa14c3200dc | | user: hecht | | date: Wed May 12 12:10:56 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 21:52c723e3b5d2 | | user: hecht | | date: Wed May 12 12:10:56 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 20:df833d6233c6 | | user: hecht | | date: Wed May 12 12:10:56 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 19:a4fb91c7bf52 | | user: hecht | | date: Wed May 12 12:06:10 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 18:67575fb8c75b | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 17:416a46105dbb | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 16:857518acb793 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 15:ab21c2321e56 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 14:861633b13870 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 13:e92228f45751 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 12:e311b6dcae4a | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 11:7485d6e98966 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 10:c54fd00d722d | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 9:aed0c05275f3 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 8:e322689b6e92 | | user: hecht | | date: Wed May 12 11:35:31 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 7:ef03e67b3e10 | | user: hecht | | date: Wed May 12 11:35:30 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 6:d46f9d0308fb | | user: hecht | | date: Wed May 12 11:35:30 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 5:cf149a2e8fec | | user: hecht | | date: Wed May 12 11:35:30 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 4:f449141657dd | | user: hecht | | date: Wed May 12 11:35:30 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 3:f22e3359ec26 | | user: ly | | date: Tue May 11 17:37:36 2004 +0200 | | summary: *** empty log message *** | | o | changeset: 2:fa41e8fddceb | | user: lehyaric | | date: Mon Apr 26 12:08:47 2004 +0200 | | summary: Mise à jour de la documentation enregistrée dans CVS à partir de la | | o | changeset: 1:1fcb4737d85b |/ user: lehyaric | date: Mon Apr 26 12:08:46 2004 +0200 | summary: Mise à jour de la documentation enregistrée dans CVS à partir de la | o changeset: 0:6d28b8993874 tag: FREEFEM_1_38 user: lehyaric date: Mon Apr 26 11:58:47 2004 +0200 summary: Initial revision freefem++-3.38-1/HISTORY_BEFORE_2005000644 000767 000024 00000054104 11406142255 016364 0ustar00hechtstaff000000 000000 beginning: november 21, 2001: version 1.08. ---------------------------------------------- 2001/11/22: correction of operator == and != 2001/11/23 , version: 1.09: correction (with g++) template struct SameType, type of OK must be int and not bool 2001/11/24 add fonctionality in plot, bb=[[x1,y1],[x2,y2]] add loop if enter character +,-,=,c,C,r in graphic window. 2001/11/28 correction bug initialization of QuadTree if less than 4 points in the quadtree files QuadTree.cpp and FQuadTree.hpp add exec("xxx..."); //to execute on system command. "xxx ... " add dumptable(cout); //to show all internal table 2001/11/29: Version ans graphique + ajout d'option dans plot (cf. doc) correction ajoute renum() des maillage crees. 2001/12/10 Correct missing check in plot ex: plot(1); trap before now, genere a compile error Correct in the interpolation is full not conforme FE, do not prolonged by continuity. change add after line 479 in file lgfem.cpp if (outside && !KK.tfe->NbDfOnVertex && !KK.tfe->NbDfOnEdge) return SetAny(0.0); 2001/12/12 correction in gibbs (mesh renum) reconstruct the array of triangle for each vertex (PB. of interpolation in non convexe domain) Big bug. Make version 1.14 ----------------- 2001/12/14 correction in trunc mesh, bug if empty mesh is created, and move a little the test point in a triangle is not exactly the barycenter. 2002/01/14 correction in probem.cpp line 1309 bug when we write qft= ... , in int2d if (nargs[0]) return *GetAny((*nargs[1])... becomes: if (nargs[0]) return *GetAny((*nargs[0])... 2002/01/15 in lgfem.cpp remove line 522 reffecran();//bug if not graphique some time in file MeshGeom.cpp line 108 bug if name == 0 ; add test before the cout like if(name) cout << " ... " << name << .... correct the name of the exec file (FreeFee++ -> FreeFem++) in Makefile 2002/02/03 in Mesh2.cpp in preinit() add call to srand(), to get the same mesh with the same data. correct mesh tth=th; Make version 1.15 ----------------- 2002/02/20 Add periodic boundary condition see the manual //\index{periodic} Make version 1.16 ----------------- Add Parallele Mpi correct bug in SegmentationFault.edp missing placing of delete[] operator put declaration in for wait =xx change the default value of wait ofstream f("foo.txt",append) open a file in append mode add NoUseOfWait=true; never wait for run test easly\index{NoUseOfWait} Make version 1.17 2002/03/20 ---------------------------- Make default iso value changing with zoom option. Add GMRES solver dimKrylov= , tgv= //\index{GMRES}\index{problem!dimKrylov=}\index{solve!tgv=}\index{problem!tgv=} april 2002 Make the current version without CheckPtr, and correct some bug in string allocation (forgetting +1 in some length) Improving the speed of the software add CPUTime global bool variable to print the CPU time of each instruction. correct some printing without verbosity adding some checking in array management Add option in the Makefile (gnumake) Make version 1.18 the 2002/04/08 -------------------------------- Big correction in automatic cast see bugv1.18.edp correction in interpolation of label see also bugv1.18.edp Big correction in construction of non-symetrix matrix (see BUG) Make version 1.19 2002/04/18 ---------------------------- Correction in Quadtree integer overflow when interpolate solution of from one big domain to a very small one. Correction in embedded function (return problem) Correction in return type of function (right value an note left value) Correction cast bool to int, so lots of bug in expression like (region==2)*5 given alway 0, invisibl before 1.18 (because bug in automatics cast) Make version 1.20 2002/04/25 ---------------------------- Correction of bug in interpolation on non convexe domain. correction of bug in periodic boundary condition (pb of sens(in french)) correction some compilation bug under g++ v3.0 in RNM file correction find common point buildmesh (change threshold value) Make version 1.21 2002/04/29 ---------------------------- Add Non linear Conjugued Gradient (CGNL) routine. correct bug in linearGC with non zero right and size. Make version 1.22 2002/05/02 ---------------------------- all optimisation tool from //\url{http://coool.mines.edu/} Add BFGS optimisation tools form cool //\index{BFGS} correct bug in CGNL, correct tgv=, in linear form //\index{CGNL} make algo.edp example Make version 1.23 2002/05/13 ---------------------------- correct bug of the symetric matrix are independ of x,y,.. add line at 285, in file problem.cpp: MeshPointStack(stack)->set(T(pi),pi,Ku); correct bug in sign of int1d in linearform, so change in exemple fluidstructure, schwarz-no-overlap, LaplaceP1, aalapacien, lapacienprecon correct some bug in -= operator with result of *. */ add some operator: -square(u) = u^2 //\index{square} -intalledges(Th)(...) to compute integrale on all edges of all triangle //\index{intalledges} for error indicator add global : -lenEdge the len of the current edge //\index{lenEdge} -hTriangle the size of the current triangle //\index{hTriangle} -area the area of the current triangle //\index{area} Make version 1.24 ----------------- add in BamgFreeFem.cpp after line 211 to set name Tn->name= new char[strlen("msh2bamg")+1]; strcpy(Tn->name,"msh2bamg"); add - of linearform and bilinearform see LaplaceP1bis.edp correct: July 8, 2002 Vh u1,u2,v1,v2; bug in problem(u1,u2,v1,v2,.... ) = in file: FESSpace.hpp line 193: { throwassert(dim_which_sub_fem[N-1]>=0 && dim_which_sub_fem[N-1]< nb_sub_fem); for(int i=0,n0=0,l=0,i0=0; i delete [] (example testFE.edp) 26 septembre 2002 add New Finite element RTortho (a conforme //\index{RTortho} FE in $H(curl)$ like RT conforme FE in $H(div)$. see exemple aaRT.epd correct the computation of dx(v) and dy(u) in [u,v] RT finite element function. compile on hpux 11 with gcc 3.2 see Makefile-hp9000s700 correct argument passing in GMRES routine Make version 1.26 le 26 septembre 2002 -------------------------------------- 05 nov. 2002 Correct very small mistake in bamglib part. 19 nov 2002: add: -tanh function //\index{tanh} -qf2pT4P1 a triangular QuadratureFormular (4P1 the qf2pT QuadratureFormular) //\index{qf2pT4P1} small change une meshadapt to just compute the metrix see exemple convectapt.edp make interpolation matrix between to FEspace (not wet finish) 3/12/2002 make correction to get a not to bad linenumber in error. add add test is used of unset x,y to make a error. add checkmovemesh(Th,[x+u,y+v]) function to return the //\index{checkmovemesh} value of the area of the minimal triangle of the movemesh. see mesh.edp example. 23/12/2002: add eigen value solver //\index{eigenvalue} see eigen README_ARPACK to compile see examples++-eigen to test. Make version 1.28 2/1/2003 --------------------- 09/1/2003: add sub array option in array: //\index{array!sub} real[int] tab(100); tab(:) = array from 0 to 99=tab.n-1 tab(2:10) sub array from 2 to 10 tab(2:10:2) sub array from 2 to 10 by step 2 tab(2:10:2)[0] = 5 ; => modificaton of tab[2] = 5; tab(2:10:2)[1] = 6 ; => modificaton of tab[2+2] = 6; 16/01/2003 add macro generation like cpp preprosseur://\index{macro} this is usefull to make automatic diff exemple: real cc=2; macro f(u) (cc*(exp(u)-1)) // macro df(f) (cc*(exp(f))) // real u=1; cout << (cc*(exp(u)-1)) << endl; cout << f(u) << endl; cout << df(f(u)) << endl; see macro.edp for more detail: 22/01/2003 in file lex.cpp add .c_str() for compilation problem on g++ 2.95 15/04/2003 add new finite element: P1b P1 + Bubble //\index{P1b} P1dc P1 discontinious //\index{P1dc} P2dc P2 discontinious //\index{P2dc} correct bug periodic BC with vectorial FESpace, add the code. Make version 1.31 ----------------- 23/04/2003 small correction to compile with g++ 2.95.2 in eigen value tools 26/04/2003 add function triangulate(filename) to build the //\index{triangulate} Delaunay Triangulation of a set of points in R^2. to build a function form a set of : x y f(x,y) see exemple mesh.edp make version 1.32 (29/04/2003) ----------------- -add optimization in automatique interpolation CPU of all tutoral exemples 172 s( mon my Mac) new version 1.33 (with graphics) CPU of all tutoral exemples 167 s( mon my Mac) new version 1.33 (without graphics) CPU of all tutoral exemples 169 s( mon my Mac) new version 1.32 (without graphics) bofbof. -correct bug in macro generation, a macro existe just in a block {..}. // lex.cpp if ( ret =='{') { /*cout << " listMacroDef->push_back"<< endl; */ listMacroDef->push_back( MapMacroDef() );} else if (ret == '}') {/*cout << " listMacroDef->pop_back"<< endl; */ listMacroDef->pop_back( );} -small correction to be compatible with g++ version 3.3 Make version 1.33 01/07/2003 ----------------------------- - small correction in parallelempi.cpp add a ; line 159 - comment line 519 in file AFunction.hpp (pb with g++ 3.3.1) // operator Expression() const {return f;} (double definition)see line 527 operator const E_F0 * () const {return f;} - correct Makefile for mpi version 21/08/2003: - Bug in optmization in case on non constant robin boundary condition correct - add grey=1 ion plot command to make grey plot, and //\index{grey=}\index{plot!grey=} correct small mistake ( on mac and X11 , ...) Make version 1.34 (22/08/2003) ------------------------------ 16/09/2003 - bug in local variable stack if the size is larger the 8 ( complex) complex a;real b; a=0;b=1; // here a is 0+i; correction is: voila la correction dans AFunction.hpp vers la ligne 1486: template inline Type_Expr NewVariable(aType t,size_t &off) { size_t o= align8(off);// align // off += t->un\_ptr\_type->size; // bug off += t->size; off += t->un_ptr_type->size; // correction return Type_Expr(t,new T(o,t)); } 02/11/2003 -correct probleme of renumbering the traingles of a mesh when reading in the bamg software (with readmesh command). This implies error when we restore mesh and non P1 finite element solution, see example saveandrestore.edp. 28/11/2003 -correction of bug in window version add the umfpack sparce linear solver (this solver have some problem in some case), so I do'nt put this one in default linearsolver. remark, I think is due to the way of taking Dirichlet boundary condition Huge value on diagonal (tgv=1e30) and Stokes matrice.//\index{problem!tgv=}\index{solve!tgv=} -put this file on the web -put on the web -the codewarroir projet to build arpack ands umfpack lib. Make version 1.36 ------------------- - Change the graphic window in Window xx version 8/12/2003 - repare in mpi version get mesh via mpi - forget build quadtree soo the interpolation bugs - add 4 line in file parallelempi.cpp in mesh serialization (recivied // add 3 line FH 08/12/2003 forget build quadtree sorry Fem2D::R2 Pn,Px; a->BoundingBox(Pn,Px); a->quadtree=new FQuadTree(m,Pn,Px,m->nv); 18/12/2003 - add in mpi version://\index{broadcast} broadcast(processor(1),th); // broadcast th from proc 1 to all other. see the mpi exemple change the precision to 6 to 12 is savemesh. - add tool to change the default precision on ostream or ofstream with the C++ syntaxe see saverestore.edp example. cout.precision(12); //\index{precision} - add UMFPACK linear solver ( not well test) //\index{UMFPACK} http://www.cise.ufl.edu/research/sparse/umfpack - add full matrix with few operator //\index{matrix!full} real [int,int] A(10,10); A= 2; A(5,5) = 2; cout << A << endl; -add array of mesh //\index{array!mesh} 08/01/2004 - merge all mesh example in one file call mesh.edp - add discontinuous Galerkin method (see LapDG2.edp example) - add syntaxe to get mesh information (see end of mesh.edp exemple) - add meshsplit function to make conformal recusive locat mesh spliting //\index{meshsplit} (see mesh.edp example) - add dynamic load via dlopen see load.edp in example++-load //\index{dynamic load} Make version 1.37 ----------------- 15/01/2004 - change metrix= in metric= the in adapted mesh metric=[m11,m12,m22]// \index{meshadapt!metric=} (change the ordre to compatible with the fonction order with IsMetric=1) 02/02/2004 - change printing in gmres algorithme - print the size of matrix 06/02/2004 - change intalledges in change of discontinuous Galerkin loop also boundary edge//\index{intalledges} jump(u) is external - internal value of u with normal go to internal to external jump(u) on boundary is -internal value of u //\index{jump} average(u) on boundary is internal value of u //\index{average} - add nTonEdge to get the number of Triangles which see the current edge//\index{nTonEdge} so see the new LapDG2.edp example for full detail 07/02/2004 - correct bug in real[string] map; // map array \index{array!string} change in get_element and operator < of String - add int array Make Version 1.38 ---------------- - remove (void) line 14 of throwassert.hpp file (erreur compile g++3.3.5 ) make change in macro expansion of shell (no perfect to day) 16/04/2004 - add matrix tools bluid interpolation interpolation matric from a FEspace VH to an other FEspace Vh matrix Ih=matrix B= interplotematrix(VH,Vh); // where Vh correspond to line and Vh to column the named parameters can be t= true or false (to bluid the transpose or not matrix) op=0 ,1 or 2 (to build the interpolation of value, dx,dy ) inside=true or false (to remove or not all ouside interpolation quadrature point) build diagonal sparce matrix (type is morse) do the matrice product of to sparce matrix (type is morse) add build a sparce matrix from a full matrix so if you have install UMFPACK solver it is possible to solve systeme with full matrix. add set function to change the solver see exemple sparce-matrix.edp - correct bug flag ouside of mesh add line in file fem.cpp line 864 outside=true; so some time the P0 interpolatation is no zero add new king of mesh of multiplicator data : mesh emptyTh=emptymesh(Th); // to build a mesh with no internal point see mesh.edp example Make Version 1.40 ----------------- - add les linear combination of sparce matrice - set a sparce solver to a sparce matrice (to day just UMFPACK) - transforme a full matrix in sparce matrix - add istream f("toto"); f.good() or f.EOF to test state the file remark: the state is set after the read so the previous value is wrong 02/06/2004 ---------- - correction in call macro with string "..." parameter 24/06/2004 ---------- add tools to bluid periodic adapmesh see sphere.edp of exemple add HaveUMFPACK global variable see sparse-matrix.edp exemple Change all the structure of the software Use ./configure to build all the make file see (README) you can build the Window version with g++ under cygwin ( http: cygwin.... ) Make Version 1.41 ----------------- 07/07/2004 ---------- an anonymous CVS server is avialable to get FreeFem++ source cvs -d :pserver:anonymous@idared.ann.jussieu.fr:/Users/pubcvs/cvs login (password = freefem++) cvs -d :pserver:anonymous@idared.ann.jussieu.fr:/Users/pubcvs/cvs freefem++ co the TAG release_1_41_before_packaging is created 30/08/04 -------- Correct divide by 0 in plot instruction when the bounding box is flat. Set default solver to LU because UMFPACK sometime by bad result. Correct all g++-3.4 error Optimize Choleski and Crout solver (divide cpu time by two on pentium) Add stuff for adding new finite element due to the new software achitecture. 31/08/04 -------- Add string[string] array correct bug in macro expansion macro parameter will be not expanded example of bug: macro a(i) i // macro b a(x) // bug here b = 1 ; // we get "i=1" or we want "x =1" Make Version 1.42 ----------------- 11/10/04 -------- Add Finite element with complex value, and matrix see sparse-cmatrix.edp and FEComplex.edp files for a full examples Vh ur; varf av(u,v)=int(Th)(u*v*(1i+1)); Matrix A = vav(Vh,Vh); // warning don't mixte Matrix and Matrix in a expression 19/10/04 -------- correct UMFPACK driver problem, ands set this solver as a default solver. add finite element connectivite inquire ice FE.epd exemple fespace Wh(Th,P2); Wh.nt // given the number of element Wh.ndof // given the number of degree of freedom Wh.ndofK // given the number of degree of freedom on one element Wh(k,i) // given the number of i degree of freedom of element k. // with $0 <= i < Wh.ndofK $ and $0 <= k < Wh.nt $ } build the source and compile version 1.43 01/11/04 -------- correct problem on period adapted mesh if orientation are reverse. add cvs tag release_1_43 Now the current version is 1.44 (CVS) 04/11/004 --------- correct problem in LinearGMRES and LinearGC in LinearCG algorithme for solving A*x = b0+b the matrix function can compute A*x or A*x-b0 , and the other part b of the right end side can exist or not. But in LinearGMRES must the function must compute A*x and b0 can't exist. see algo.edp exist for a full example 06/12/2004 __________ change function name interplotematrix to interpolate correct bug introduce in 04/12 change a new graphic FreeFem++-cs: integrated development environment (located in src/ide) see REAME and maunal-full.pdf add new examples++-tutorial mat_interpol.edp # to test interpolate function shur-comp.edp # a shur complement domaine decomposition 11/12/2004 TAG release_1_44 now the current version is 1.45 29/12/2004 add concat operator # in macro generator. 04/01/2005 add new quadrature formular on edge (a,b) :qf1pElump : 1/2(f(a)+f(b))*length(ab) 05/01/2005 correction bug unset FE variable dans le .edp => use a null pointeur (in sol) to set the *X array in problem.cpp (*X)[K(df)]= (*sol[kfe])[SK(kdf)] ; make some time make a seg trap error. 06/01/2005 rewrite the macro generation tool to be more to suppress some bug in argument subtition correct error in line numbering in case of newline in string cosmetic change in output 20/01/2005 count () in macro parameter to handle couple of () in macro parameter. macro sum(a,b) (a+b); sum((1),2) // now works and given (1)+2 sum(atan2(2,1),2) // now works and given atan2(2,1)+2 correct bug in linear combination of sparce matrix: the correction is: change line 1069, in file MatriceCreuse_tpl.hpp mij[make_pair(i,j)] = coef*a[k]; to mij[make_pair(i,j)] += coef*a[k]; Correct a segfault if second derivative of test function exist in problem definition. The Change in problem.cpp: resize : KN buf(Vh.MaximalNbOfDF()*3*Vh.N); to : KN buf(Vh.MaximalNbOfDF()*last_operatortype*Vh.N); 24/01/2005 add named parameter nbtx=.. in buildmesh function to change the default maximal number of vertex in the build mesh. 26/01/2005 correct pb with --disable-pdf in configure.ac correct pdflatex and latex compilation correct FreeFem++.app problem when usind in a shell script FreeFem++-CoCoa correct web site and distrib file freefem++-1.45-2.tar.gz 02/02/2005 correct problem with socket in FLTK in freefem++-cs (not wet finish) ALH add nbvx= named parameter to change the default maximum number vertices in creted mesh in builmesh (see mesh.edp exemple) 10/02/2005 add 2 new quadrature formular qf7pT and qf9pT with respectively 15 and 21 points add P2b a new finite element : P2 + bubble make drag and drop on ide version + copy paste 14/02/2005 create a error when you do uh = .. when uh is a componant of a vectorial fe element function (for exemple fespace Vh(Th,TR), Vh [uh,vh]; uh = 1 (error here ;) because it's impossible to build uh and vh independantly. 17/02/2005 FreeFem++-cs: Communication speed between client and server has been increased ten-fold (ALH) 23/02/2005 add jump and mean of complex function (FH) 23/02/2005 FreeFem++-cs: grammar-driven syntax highlighting works on (examples++-tutorial/...) Laplace.edp, adapt.edp and adaptindicatorP1.edp (ALH) freefem++-3.38-1/INNOVATION000644 000767 000024 00000166146 12544233612 015233 0ustar00hechtstaff000000 000000 version 3.38-1 - add finite element Edge13d (Finite Element of degrees 1) Thanks to marcella@bonazzoli.it and exemples of wave guide in waveguide.edp - correct renumbering function in case of rhs - correct new type of optimisation in integral, (version 3.38 25june 2015) optimized=2 => do optimisation without check can be usefull in case of random problem. - correct convect operator in 3d (remove randow part, to remove problem of optimisation in varf. version 3.38 - add parameter in renumbering function. version 3.37-1 (22 mai 2015) - clean examples-mpi, remove of all usage to RemoveDOF, bb2d bb3d, findDiff (see version 3.36) - update schwarz.cpp for new hpddm versio n - add read of real[int,int], int[int,int], complex[int,int] .. version 30 april 2015 (3319:8657e0526391) - correct freefem++ launch in windows (remove wait when launch vai freefem++) add wait in case of launch throught launchff++.exe - in DG linear form with jump or mean in test fonction was wrong like varf a(u,v)=intalledges(Th)(jump(v)*u) ; - correct problem of try/catch in freefem++ func version 3.36-2 - correct problem some null ref with compile Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) xcode 6.3 some warning exist but all test pass. - correct problem of cleanning tmp memory for small array - correct configure and makefile for windows compilation process version 3.36 - add tools to remove (now build in) utility.dylib removeDOF.dylib symmetrizeCSR.dylib bb2d bb3d -> boundingbox fast -> ltab=lround(dtab) Unique to get all unique value of a array (findDiff) - after version 3.33 the some compilation flags a lose, correct configure.ac Please do not use version from [3.33 .. 3.35] included. - add disable-gmm configure flags version 3.35 dist (12/3/15) (rev 3246:664a6473d705) (warning slow version) - optional lib seach [toto|tyty] in WHERE-LIBRARY seach lib - change the metis to scotch-metis interface in hips and parms .. - change the current version of scotch metis mumps parmetis - remark: .dll , .so, .dylib are incompatible with previous version. - ff-run.in under windows (use src/bin-win32/FreeFem++-mpi and not src/mpi/FreeFem++-mpi for dll problem). - correction init plugin missing static in int DoLoadInit() ; version 3.34-2 (20/2/2015) (warning slow version) - do correction do compilation for mpi version under window big change in ffapi.cpp rules ( use now call back) end init in mymain. schwarz plugin run under windows without petsc lob. - add some function to then gsl interface (airy, biry, ...) version 3.34-1 - correct lot of mistake for simple compilation of hpddm interface .. - add no mandatory lib for petsc write the WHERE-LIBRARY search lib in awk (more simple ) version 3.24 (warning slow version) - configure : 6/02/ 2015 correct mpi for sgi uv computer find gsl lib add find petsc (in progress) add missing file in distribution - correct for compilation with g++-4.9.1 -std=c++11 ( without downlaod) BUG in configure => slow veriosn after until version 3.36 , 25 mars 2015 ... (dur Dur) no optimisation flags in compilation - add hd5 interface (13/01/2015) Thank to Mathieu Cloirec CINES - http://www.cines.fr voir example iohd5-beam-2d.edp iohd5-beam-3d.edp - add find of libgsl in configure script - correct pb of memory leak in case matrix A = ...; in loop ( this occur in lot of case, tanks to P. Jolivet ) correct small memory leak in use of routine due to debugstack. - correct bug in periodic condition in case common dof with periodic. - correct big bug in memory management of sparse matrix version 3.32 - correct of problem of plugin and mpi, build all dynamics lib with and without mpi, the mpi version is install dir lib/mpi - correct of plugin MUMPS.cpp for complex value. - add vectorial operator a/v and v/a where a is scalar and v vector like real[int], ... version 3.31-3 (rev 3053:4e164226411d 12 Aug 2014) - correct the problem of size of arrow in 2d plot version 3.31-2 (rev 3052, 11 July 2014) - correct stop test function in LinearGC (for zuqi.tang@inria.fr) build tar.gz distribution (rev 3050) build version MacOs 3.31-1 - correct bug put in DG formulation (rev 3044) jump, mean , was wrong from Sun Jun 29 22:39:20 2014 +0200 rev 3028 version 3.31-1 (rev 3042, 10 july 2014) - function to put your stop test in LinearGC and NLGC the prototype is func bool stop(int iter,real[int] u,real[int] g) ; { return g.linfty < 1e-5 || iter > 15;} LinearCG(DJ,u,eps=1.e-15,nbiter=20,precon=matId,verbosity=50,stop=stop); - add functionnal interface to arpack (Eigen Value) func real[int] FA(real[int] & u) { real[int] Au=A^-1*u;return Au;} func real[int] FB(real[int] & u) { real[int] Au=B*u;return Au;} int k=EigenValue(n,FA,FB,sym=true,sigma=sigma,value=ev,vector=eV,tol=1e-10,maxit=0,ncv=0); see examples++-eigen/LapEigenValueFunc.edp for a true example version 3.31 (rev 3037, 1 july 2014) - re-add tan function for complex number - correct a big mistake in LinearGMRES , the result are completely wrong, correct also the algo.edp - add sqr functon of O. Pironneau - correct update of mercurial depot (rev 3034, 1 july 2014) - correct misstake in examples++-3d/MeshSurface.idp about computation metric in function build surface Sphere mesh and add a function to build Ellipsoide surface mesh func mesh3 Ellipsoide (real RX,real RY, real RZ,real h,int L,int orientation) - correct a bug the DG with periodic boundary condition with only one layer of element. - add pluging "bfstream" to write and read in binary file (long, double, complex and array) see bfstream.edp for an example. version 3.30-1 may/2014 ( hg rev: 3017) - add levelset integral on 3d case ( on levelset and under level set) - correct problem with Ipopt / lapack configure ... - add BEC plugin of Bose-Enstein Optimisation - standardisation movemesh3 -> movemesh ( same parameter of 2d version ) - correct jump in basic integrale to be compatible with varf definition jump is not zero on boundary, it is - boundary value .. fespace Ph(Th,P0);u= 1;int1d(Th)( jump(u) ) = - length border . version 3.30. ( for windows hg rev : 3013) - add binary ios:mode constant, to open file in binary mode under window to solve pb of seekg under windows - add multi border april 23 2014 , (hg rev : 3004) syntaxe example: // i is the index of the the multi index // the number of sub border is given by teh size if the array to set the number of seg on the border .. // so for multi border the number of seg of the border , must be in int[int] array real[int] RC=[ 0.1, 0.05, 0.05, 0.1], XC= [0.2,0.8,0.2,0.8], YC= [0.2,0.8,0.8,0.2]; int[int] NC=[-10,-11,-12,13]; border bb(t=0,1;i) { // cout << " i = " << i << endl; int ii = (i+1)%4; real t1 = 1-t; x = xx[i]*t1 + xx[ii]*t; y = yy[i]*t1 + yy[ii]*t; label = 0; ; } border cc(t=0,2*pi;i) { x = RC[i]*cos(t)+XC[i]; y = RC[i]*sin(t)+YC[i]; label = i+1; } int[int] nn=[4,4,5,7]; plot(bb(nn),cc(NC),wait=1); mesh th= buildmesh(bb(nn)+cc(NC)) ; plot(th,wait=1); - add ltime() (rev 2982) function returns the value of time in seconds since 0 hours, 0 minutes, 0 seconds, January 1, 1970, (int) - add new macro tool like in C (rev 2980) FILE,LINE,Stringification() to get line number and edp filename, add quote to a parameter after macro generation … Like in cout << "in " << FILE << " line " << LINE << " -- '" << Stringification( "zzz" aa () {} + /* */ bb cc) << "'" << endl; add new int2d on levelset in 3d (int test) add basic func mesh3 Cube(int nx,int ny,int nz) in cube.idp file. version 3.29 (hg rev 2973) - add int storagetotal(); and int storageused(); function to get static of malloc ( memory storage usage) - correct problem of region evalution in jump and mean function version 3.28 ( merge with freefem++-cs tool) - add download/getall perl script to download all related soft - add int1d on isoline for matrix ... version 3.27 - correct bug in display of P1b finite element in 3d error in SplitMesh function (Thank to O. Pironneau) - add AddLayers(Th,suppi[],sizeoverlaps,unssd[]); - add tool to trunc to get element numbering for Thn to Tho int[int] In2o(1),Io2n(1); Tho = trunc(Tho, x<0, new2old=In2o, old2new=Io2n); - add restrict function for get dof numbering old to new fespace Vnh(Thn,Pk), Voh(Tho,Pk); int[int] n2o=restrict(Vnh,Voh,n2ok); - correct mistake in gsl interface random number (9/1/14) missing all random distribution .. - add interface with gsl random number generation in test .. - correct pb of compilation under window (mingw32/msys) 6/1/14 (ALH) - Creating documentation hyperlinks (in emacs orgtime and in Doxygen format) - New script build/orgindex and file index.org list all hyperlinks in the FF source in Emacs org-mode format - Set all hyperlinks to relative paths to make sure that they work from any location - Separate download script for all third-party software [[file:download/getall]] (request from FH) - created common makefile goals in [[file:download/common.mak]] for all downloaded packages (request from FH) - changed [[file:download/arpack/Makefile.am]] to make use of [[file:download/common.mak]] - done for [[file:download/blas/Makefile.am]] as well - added option --enable-mkl-mlt in [[file:configure.ac::enable_mkl_mlt]] to allow FF to be linked with the multithreaded MKL when an external library requires it (request from Atsushi Suzuki) version 3.26-3 09/12/2013 correct problem with openblas need pthread lib 01/12/13 install dowload lib update lapack interface in examples. add WHERE_LIBRARY-file in install change the order of seach lib with WHERE_LIBRARY-download WHERE_LIBRARY-config WHERE_LIBRARY remove all relative in WHERE_LIBRARY-config correct of superlu compile problem 13/11/203 Pass to version 3.26 ... - correct pb of ambiguity with new complex lib 31/10/2013 compilation on MacOS 10.9 with compile of xcode 5.0.1 - correct the pipe.cpp to compile with clang-500.2.79 - remove of warning message genrate by clang++ -std=c++11 (version clang-500.2.79) - correct also compilation problem - correct error in case of block matrix with block of 0 row or 0 column. 21/10/2013 (ALH) - umfpack configuration cleanup (request from Fred) - blas configuration cleanup (request from Cico) - configuration option --enable-generic-blas has no effect anymore, removed - Atlas compilation directives have no effect anymore, removed - Moved OpenBLAS compilation from FFCS source tree to FF source tree - Added configure option --disable-system-fftw to skip any default FFTW library installed on the system - Changed location of lapack WHERE-library setup in [[file:configure.ac::WHERE_lapack]] to insure that it is always defined (request from Fred) - changed FFCS Fortran MPI configuration for MPICH2 - split DOC makefiles into Makefile.am and figs.mak to suppress automake warnings about portability - moved build/download script from FFCS to FF before reorganizing FF downloads (request from FH) 10/9/2013 (ALH) - Corrected pastix compilation for FFCS on MacOS 10.6 - Removed dependency from lg.ypp to lg.tab.?pp in [[file:src/lglib/Makefile.am::lg.tab.?pp]] to avoid automatically generated conflicts 05/09/2013 put version .tar.gz on the web - correct makefile wget in pastis and superludist - correct compile of load example : paradiso, gsl automaticaly - add AutoGeneratedFile.tar.gz a file contening all file build by autoreconf in case of non automake tools (1.13) - add missing file in dist or in mercurial distribution - correct download of scotch un curl - correct problem in a*[b,c, ... ]' in case of complex value 5/9/2013 (ALH) - force Umfpack build to run sequentially (parallel make crashes with "pipe from processes is a directory"?) - pARMS download URL changed to http://www-users.cs.umn.edu/~saad/software/pARMS/pARMS_2.2.php (thanks Fred) - corrected download/mumps parallel compilation (WHERE was not built properly) - Removed all Mercurial-tracked files from .hgignore - added options --with-[package]-include= and --with-[package]-ldflags= to avoid downloading existing packages - Parallelized MUMPS compilation in download/mumps (and mumps-seq) - Applied a patch from Fred for compiling SuiteSparse on Slackware64-14.0 - Added configuration option --enable-hypre (disabled by default, contrary to other tools) - Deactivate FFTW download when a local version is found (request from Helmut Jarausch) 10/7/2013 (version 3.25) - remove of Makefile.in configure for the hg distrubion use : autoreconf -i # too build Makefile.in before to configure need automake version 1.13 ... - merge FFCS (ALH) version and ff++ version (FH) of freefem++ programs - remove all automake file form the hg data base - add new parameter to ffglut for demo of freefem++ ffglut [-nv|-v|-vv|-vvv] [-wait 0.5] [-g 512x300+10+10] [-t title] [file] all number can be change the wait is in second 0 is default value nowait bewteew plot -g 512x300+10+10 is the geometry of the graphic window -t the title of the windows 26/6/2013 (ALH) - created a build/ subdirectory for build tools - enabled parallel make ("make -j") - created a separate file (acmpi.m4) for complex MPI configuration options - added configuration option --enable-ffcs to make the FF source compatible with FFCS - backported all current FreeFem++ patches for FreeFem++-cs into the FreeFem++ - started main doxygen page mainpage.dox 9/06/2013 - correct extract function of mesh Lo Sala - correct int2d on levelset see example intlevelset.edp - correct automake TESTING part (in progress) - correct typo on the doc with .*= ./= operator - correct bug in RT0 3d , code in the construction of the DOF. the bug is all dof on border face of same element have same dof number. thank to Laurent Bernard version 3.23 - do cleanning in version remove x11, glx, std : freefem++ clean compile option for clang and clang++ compiler - add flags to remove internal boundary in 2d,3d in function change rmInternalEdges=1 - correct glumesh in case of no mesh in 2d version 3.22 - add multi windows graphics ; WindowIndex=0 in plot function add new event in graphic windows * to set/unset default graphics stat to previous plot - add getenv, setenv , unsetenv function in shell plugins for gestion of environnemnt variable for openmp. - correct pb un trunc for 3d mesh with too flat element (sliver) , and cleaning code . - correct bug in gestion off outsite flag is 3d in case of brute force (searchMethod>0) version 3.21-1 - correct bug a=b' ; of full matrix - bug in assert on 3d mesh of huge dimension with periodic condition. - correct build Delaunay 3d mesh of set of point. see examples++-load/convexehull3d.edp version 3.21 frev 2013 - n, resize in array of finite element function ... see edp array.edp file - correct pb of compilation of Ipopt with clang++ -std=c++11 - correct une NSCahouetChabart.epd examples , and correct un doc. this is a complete rewritting. FH. 12/02/2013. - correct in change function the "flabel=" parameter in 2d and 3d version 3.20-3 - add master= in solver of MUMPS interface to set the master mpirank <0 => distributed matrix. - correct problem in label generation in freeyams (18/01/2013) all label border was set on 1 before. version 3.20-2 - add MUMPS parallel version (in test) - add paradiso seq solver .. version 3.20 - correct isoline plug in case of sadlle point - change the compilation tools under windows gcc 4/7 + freeglut / ...) - change the compile tools on mac pass to clang++ - compile ok of c++11 compiler - add formal tools on array [] or matrix [[],[],] for elastic problem. let A a formal array if A is matrix 2x2 or 3x3 : trace(A) , det(A) , Cofactor(A) ; A:A = sum_ij A_ij * A_ij 2*A, A*2 // muliplication by a scalar -add integration on levelset line (in test) version 3.19-2 - correct pb of C in/output in pluging (in test) - correct bugs mshmet pluging in case of double Eigen value - correct typo problem (string size) when a change the default window size in postscript in version 3.19-1 to have more precise postscript plot version 3.19-1 - add tool to create Quadrature formular 1d,2d,3d with plugind: load "qf11to25" real[int,int] tab1(np,2),tab2(np,3),tab3(np,4); QF1 qfe1(norder,tab1);// 1d QF2 qfe1(norder,tab2);// 2D QF3 qfe1(norder,tab3);// 3D where tab(0,i) = weigth , tab(j,i) = j coord, norder order of the quadrature see examples++-load/LaplaceP4.edp for example - correct download auto compile of mmg3d, mshmet, scotch, ... version 3.19 (20 april 2012) - scotch partitionner interface see scotch.edp in examples++-load - add isNaN(x), isInf(x), IsNormal(x) function to check floating point of real value x, see ISO C99. - add function : NaN() and NaN("") to build NaN real number (double in C) . - correct error in macro with operator ./= and .*= - add Ipopt doc (thanks to Sylvain Auliac) - add Ipopt interface (thanks to Sylvain Auliac) - correct 3d trunc bug in case of internal boundary thank to Yoshihiro Tomita . - add new type of array , array of array see taboftab:edp in examples++-tuturial real[int] a; real[int,int][int] m(10); real[int][int] v(10); not well tested. version 3.18-2 - add plugins with sequentiel mumps without mpi - add conversion of re and im part of complex sparse matrix A = C.im; A = C.re; version 3.18-1 - correct Typo error in example - add generation of error in case of periodic boundary condition non scalar problem. - add tools for adaptation of P2 and P3 finite elements with metrics see APk-AdaptEpsDeltaPk.edp APk-FreeFemQA.edp APk-MetricPk.edp APk-ExplicitPkTest.edp APk-LaplaceDirac.edp - New example in in Chapter 3 Navier Stokes Newton NSNewton.edp - add cod to build matrix and vector form varf in 3d in case of different meshes (in test ) - correct NSprojection.edp chap3 example (PB in out flow BC.) - correct compile of mmg3d v4 plugins (small change un distrib archive) v 3.18 (11/01/2012) - rewrite the isoline-P1 plugins (new name isoline.{dll,so,dylib} ) see example Leman-mesh.edp and isoline.edp in examples++-load directory - correct bug in cas of resize of array with 2 index (full matrix) - correct assert in MPI in gather and scatter - correct bug in case of return in loop for or while. - correct a=int2d(Th,l)(1) in case simple expression when l is a array. - build a pkg under macos for distribution . v 3.17 (17/11/2011) - correct PB of pugins: MUMPS, parmetis, metis, mmg34, mshmet - the new load interface (for more safe IO) - build mpi for windows with msmpi ( begin) memory error after end .. - remove add by default $LIB_MPI in ff-c++ - change the way add thing in freefem++ in case of dynamics load to be compatible plugin with freefem++cs ( solve pb with cin,cout, cerr in dll may be..). LOADINIT(Init); // where init is a class or do addingInitFunct FFinit(100,ffinit,"MUMPS_FreeFem"); // where ffinit the init function ... v 3.16-1 - cmaes interface in scalar and MPI case (thank to S. Auliac) see doc and examples : cmaes-mpi-VarIneq.edp , cmaes--VarIneq.edp - add NLopt interface (thank to S. Auliac) v 3.16 technical stuff: - correct auto load of mumps - add tool to do automatic load or static load (for testing) see MUMPS_*cpp example v 3.15 - correct all examples++ load and 3d rebuilde the all.edp and test this examples. - correct version old bug when full matrix (arry) A=A;' is now correct (set and initialization ) and add A+=A'; A-=A'; - reput metis 4.0 form netlib ... (pb of compatibilite with other // soft hips) v 3.14-1 - change interface with metis 5.0.1 - Complete writing of mmg3d interface with version 4 of mmg3d le plugin is "mmg3d-v4.0", the parametre are the same have command line mmg3d , execpt the file name are not given. - remove old bug 3D in interpolation P1 operator correct bug 29/08/2011 (thanks to rychet@fzu.cz) remove wrong bulid of KHat (memory out of bound) v 3.14 - correct in configure remove the default -O2 -g autoconf value and add -g in case of --enable-debug - a very old error in the on() functionnal the bug is with a vectorial finite element like RT0, .. the name of vectorial must be in lexicographic order so u1,u2 is ok but v,u is wrong is correct in version 3.14 the 24/08/2011 - correct trap in check convect-apt.edp example - add the existance of patch in configure v 3.13-3 ( 30 june 2011 Seville) - correct the Hips interface (not to bad , in test) load "hips_FreeFem" int[int] iparm(1);real[int] dparm(1); HipsDefaults(iparm,dparm);) // set def option ( limit to 100 Hips active linear system ). - add interface with MUMPS_4.10.0 version (with automatic download ) - add P1dc3d finite element in pluging "Element_P1dc1" - correct bug in gibbs renumbering in 1 case veru sample mesh) - correct bug in interpolation operator with periodic BC mesh Th1=square(2,1), Th2=square(2,2); fespace Vh2(Th2, P1),Ph2(Th&,P1,periodic=[[1,x],[3,x]]);// une couche matrix Jh=interpolate(Vh2,Ph2,op=0,inside=0); Ph2 w=1.;Vh2 wi; wi[]= Jh*w; // wi must be 1, now this ok. v 3.13-1 - correct compilation problem on fedora 13 WITH MPI v 3.13 (25 may 2011) - update the finite element list in documentation - add (load "Element-Mixte") NEW FINITE ELEMENT 2D TDNSS1 sym matrix 2x2 conforme in $\{H(div div) / div(div s)) \in H^{-1} \}$ RT1 and BDM1 conforme in H(div) Raviert Thomas of Degre 1 and Bezzi, Douglas, Marini RT1 and BDM1ortho conforme in H(curl) 2 Nedelec Finite Element v 3.12-3 - new finite element in 2d for elasticity in test. TD-NSS0 (see these of Astrid Sabine Sinwel) A New Family of Mixed Finite Elements for Elasticity - add matrice matrix multiply in lapack interface - add tool to change the region and label number change(Th,fregion= integer function to set the region number ) - nuTriangle now given the tet number in 3D. - add mpireduce of matrix to build parallel matrix v 3.12-1 april/2011 see remove examples++-mpi/chaleur3D-superludist.edp - correct the precond of gmres algo in A^-1 : (29 mars 2011) to build a correct Navier-Stokes - add cast TypeOfSolver on int to parametrize the choice of linear solver. - correct intersection of given metrix in adaptmesh (bug introduc in 07/10 verion 3.9 in case of convect-apt example v 3.12-1 10 10 fevr 2011 - add VTK write for paraview, examples++-load/VTK_writer.cpp examples++-load/VTK_writer_3d.cpp (see source for moe details) - put comment in the documentation about negative tgv - correct pb blacs mkl (unde with mumps) - correct mpiReduce for complex and real data. - add mpiAllReduce(umax,dmaxg,comm,mpiMAX); where for real umax,dmaxg; - add tag verson 3.12-win32 - add inferface for mpi in win32 architecture (form 32 version) v 3.12 17 jan 2011 - correct probleme of comm world on SuperLuDist (complex version) - correct medit Makefile.am in case of no compilation of medit .. - correct a lot of MPI parallel solver example a bug pastix interface ??? MUMPS, superludist, hypre , hips works - correct link problem in hips and hypre under linux - Add thresholdings.cpp thresholdings.edp in examples++-load to remove to small coef in a matrix . - Add lots of DDM Schwarz GMRES precondionned with a coarse grid solver por overlapping : DDM-Schwarz-Lame-2d.edp DDM-Schwarz-Lap-2dd.edp DDM-Schwarz-Stokes-2d.edp DDM-funcs-v2.idp DDM-Schwarz-Lame-3d.edp DDM-Schwarz-Lap-3d.edp DDM-Schwarz-macro.idp I will add the explanation in the doc in the future; - Add a true exemple to buld mesh form a image (lg.pgm) , Leman-mesh.edp - Add New syntaxe in macro generation NewMacro a(i) EndMacro with // comment and macro definition, first trik - Add interface with special function of gls http://www.gnu.org/software/gsl/ the full list is in the example examples++-loal/gsl.edp v 3.11-1 25 dec 2010 - Add coarse preconditioner in MPIGMRES[23]d.edp (to be optimal) now the number of iteration is close to 10. - Show ff++ line number in case of assertion in RNM class. - add Coarse Preconditionner for MPIGMRES[23]d.edp (Good) - solve bug For MPIGMRES2D.edp due to interpolation bug in rare case by Add brute force for seach of point in 2d like in 3d in the search in find ouside set global variable : searchMethod=1; // more safe search algo (can be expensive in case of lot of outside point) - add hack of ILU precond, if tgv is < 0 then we remove all the line and put 1 on the diag term .. v 3.11 9 dec 2010 - update the documentation of 3d adaption process and / correct freeyams,mshmet, mmg3d interface and associaded example - configure is compatible with MKL lib (on gnome) - add quoting argument in macro argument with { } for mpi plot .. v 3.10-2 - try to compile with MKL libs. - correct MPIGMRES[23]d.edp example add doc on this example. v 3.10-2 - add operator to inverse permutation to set or initial int[int] array I=J^-1; if J is a permuation of 0:n-1 then we have : I[j[i]]=i - correct comment problem of periodic boundary condition in 3D see examples++-3d/periodic-3d.edp - correct configure to scotch compilation (phtread) v 3.10-1 - at convection function form formal array to int,real,complex array (resp. toZarray, toRarray, toCarray) - correct ffrandom.cpp to read /dev/random to get a true random seed srandomdev - add ff-mpirun script to simplify the launch of FreeFem++-mpi version - correct MPI for MPI icc on gnome - correct pb of computation of area, lenbord in mesh type in some case . - correct WHERE_LIBRARY-config for blas find in configure - correct atof v 3.10 - add true Domain Decomposition example in 2d and 3d. see MPIGMRES2D.edp MPIGMRES3D.edp in MPI examples - add mpi Isend/Irevd for complex struct like matrix, meshes for send/recv Huge objet - add named parameter verbosity= in add GMRES and GC function for show algo evolution . - add MPIGC dynamic LIB for // GC and GMRES , add fully // scharwz RAS in MPIGMRES2d.edp - correct problem of a=A^-1*b when a, or b is not consecutive array ie. expression like M(2,:) - correct problem of Makefile in download clean,install,WHERE target v 3.10 ( 5 oct 2010) - add install of missing MPI dynamics lib. add argument "-cd" to FreeFem++ command to change current directory to edp script directory - clean configure.ac - do correction for g++-4.6 compiler (lambda expressions , and trap ..) - add MPICG for Parallel Conjugate Gradient for full split matrix see MPICG - correct Makefiles in download ( add WHERE interface) - remove wait option in medit because the code is wrong , always waiting now - correct bug renumbering of matrix : B= A(I,J), the last term N,M was force to zero =+ -> += (line 1885 of file lgmat.cpp) where N= I.max, M=J.max v 3.9-3 - correct compilation of gmm, mumps on linux - add parameter -ne in FreeFem++ commands to remove edp script print - correct mistake in --enable-m64 or --enable-m32 (suppress the configure warning) - correct of ff-c++ script if whith space in path (for windows) - add compilation of gmm library v 3.9-2 - correct compilation of mshmet dynamic library - correct pb of compile of superludist ( add CNOFLAGS no optimize CFLAGS) - correction of lib on win32 for freeyams and mmg3d - correction download/Makefile.am to be sure than bin is a directory. - add fftw of win32 v 3.9-1 - correction mmg3d interface (J Morice) - correct of mmg3d and freeyams under wind32 (ld problem) v 3.9-1 August 2009 (For FreeFem++ days ) - correct configure (find lapack lib change $ll_lapack_libs in $ll_lapack_lib) - correct mistake in mpi add: gatherv, allgatherv, scatterv, alltoallv and complex data type in: allgather, gather, scatter, alltoall, .. correction bug : gather, scatter correct essai.edp mpi example - correct problem of compatibility of dynamic lib with and without MPI change ff-cc++ to add all MPI libs if MPI version exist. - correct default region number in square build mesh function now 0 , (2 between v3.8 -- 3.9) - change in all example reffacexx= in labelxx= ..., etc to be correct with v 3.8 change. - correct a mistake of type region= parameter in tetgen all functions. - correct the mpi configure search tool miss when no full path are given ( only change in configure.ac) v 3.9 July 2009. - add lots of automatic compilation of download soffware, tetgen superlu fftw metis yams mshmet blacs parmetis scalapack scotch superludist MUMPS pastix hypre hips For the link with mmg3d software put the tar.gz archive in .../dowload/pgk directory. add interface with freeyams, mmg3d, mshmet (3d mesh adatation) software, add automatique compilation of // solver with flags -auto in ff-c++ commands v 3.8-2 - add cast operator from SubString to String - correct the SubString tools v 3.8 - add in change mesh2 tool to make a renumbering of vertex for periodic 3d mesh. Th= change(Th,renumv=old2new); - correct ' operator do alway in complex case the conj and trans (Hermitian stuff) in formal array with [ ]' in linear comb of complex matrix now A + (-1)*A' is zero is A is hermitian . in varf term (a*dx(u)*dy(v) )' <=> a' dx(u)*dy(v) now you can [a*dx(v),dy(v)] ' *[a*dx(u),dy(u)] in complex case.. - plot of complex field and 3d vector .. - upgrade the documentation in 3d mesh example - change configure.ac for mpifc, mpif77, mpicc, ... - correct include seach path - uniformize named parameter in change, movemesh, in load "msh" , glumesh, ... add synonyme: refface= -> label= reftet= -> region= in buildlayer: labebup= labebdown= labelmib= - writing schwarz-nm-3d.edp examples - add array of 3d mesh - add word volume to get the volume of the current tet element - correct metis.cpp in 3d case - correct in fflapack.cpp (example++-load, computation of eigenvalue of complex matrix) -llapack search in configure.ac and unify fflapack.cpp lapack.cpp are the same file. - add seekp, tellp method on ostream type seekg, teeg method on istream type see examples++-tutorial/readmesh.edp examples v 3.7-1 13 jan 2010.. - EqPoisson.edp (Solve Poison equation in 3d fish) - add possibility to put array (int[int] ) to set a set of label/region in in integral (int1d,int2d,int3d) or "on" key word example : int[int] l=[1,2,3] , ... on(l,u=1); - add tool to compile under mingw/msys under windows 32 (freefem++-nw works, - add bug (random trap) in bamg in sub domain computation in case of internal edge in same region (fist time in 15 years). - add bug in varf interpretation in complex case (miss some convertion) - add build interpolation matrix in 3d (see examples++-3d/mat_interpole.edp) - correct CFLAGS (add -fFIP) in superlu , umfpack under 64 architecture. v 3.7 8 december 2009 add 3d beam examples examples++-3d/beam.edp correct install problem due to metis directory add dynamic load interface with newuoa fortran optimizer without derivative see ffnewuoa.edp example ins examples++-load correct problem of free of mesh in case of gluing meshes Th= Tha+Thb; // now just the ref counter on Th is decrease // and before Th is delete add .im, .real method on complex [int,int] matrix array add missing matrix[int] type in grammar. correct mistake in generation of file WHERE_LIBRARY-config add initialization of scalar variable at zero add warning in case of use of variable with hide freefem++ name add missing file in download version v 3.6.1 correct font problem in documentation lot of mistake in examples++-load add tool to compile all examples add PICHON stuff for brute force search point add umpack long interface to by pass the 32bit limits see UMFPACK64.cpp and LapUmfpack64.edp in examples++-load. add some interface with lapack (inverse of full matrix, eigenvalue of full matrix) correct ::Draw undef ref. ubuntu 10. (gcc 4.4) correct typo error image tools see UMPACK64 (code and example in examples++-load) v 3.6 (4 nov 2009) change the version of tetgen to 1.4.3 download correct in ffglut max value of arrow add examples of function with stack parameter in examples++-load/funcTemplate.cpp load facility and examples++-load/funcTemplate.edp add tools to read .pcm files for optic-flow computation (pcm2rnm.cpp) see http://www.cs.otago.ac.nz/research/vision/Research/OpticalFlow/pcm.html correct bug in GMRES without preconditionner assert error. correct a rare and ramdomly bug in the interpolation 2d process when the the element 0 touch the boundary correct on versy old bug in bamg in case of internal boundary edge with two extremity in true boundary (symptoms FillHoleInMesh trap). correct operator subsript a:b:c operator (in some case the last value was miss) correct the ?: operator in case of constant array - add -enable-m32 flag to build 32bits freefem++ on 64 architecture computer - correct eigenvalue.cpp in case of complex finite element v 3.5-2 (28 sept. 2009) - correct install problem under windows (metis.dll do not compile) - correct MacOS install missing /usr/local/lib/ff++/3.xx-yy link v 3.5-1 (24 sept. 2009) not to bad ... - add interface to metis - correct display of 3d mesh (with light today) - add trap in case of mesh with negative volume - correct bug in case 3d finite element with constant number of df / node example fespace Vh(Th2,[P1,P1]); or fespace Wh(Th3,[P0,P0,P0 ]) - correct problem with tetgen under windows and ubuntu (remove optimization during compilation of the library) - correct setting array of vectorial finite element Wh Wh[int] [u,v](10); // array of 10 value u[1] or v[1] 2 componante function for indice 1. [u[2],v[2]] = [1,2]; // set the function for indices 2. - correct in matrix size of matrix B=A(I,J) to I.n x I.m where I, J are array of int - add resize of complex sparse matrix - Add inferface with metis in examples++-load (metis.cpp, metis.edp) v 3.5 (27 aug. 2009) Complet writing to MPI interface, tested with Open MPI 1.2.3 and mpich 2.1 see chapter 10, page 229, of the freefem++doc.pdf and see example++-mpi/essai.edp. correct operator a(:)= 1:4; // before change a copy of a and so do nothing string[string] s; s[i]; // before trap (two delete) v 3.4-2 add boundary mesh inquire in 2d and 3d Th.nbe ; // return the number of boundary element Th.be(k); // return the boundary element k $\in \{0,...,Th.nbe-1\}$ Th.be(k)[l]; // return the vertices l $\in \{0,1\}$ of boundary elmt k Th.be(k).Element ; // return the triangle containing the boundary elmt k Th.be(k).whoinElement ; // return the edge/face number of element containing the boundary elmt k Th[k].adj(e) ; // return adjacent element to k by edge/face e, and change // the value of e to the corresponding edge in the adjacent element Th[k] == Th[k].adj(e) // non adjacent element Th[k] != Th[k].adj(e) // true adjacent element do small change in msh3.cpp file v 3.4-1 rewrite of the mpi interface in vue of use group and communicator now we only use mpi.h and not mpi++.h add plot of array of mesh and array of finite element functions add new command in ffglut graphic interface n,N,i,I to change the number of iso-value and to set the min,max value to the graphic add left button motion to zoom , and + alt to translate V 3.4 add in parallel version mpi send, receive and broadcast of 3d mesh and matrix ( sparse matrix). build a 3d mpi schwarz example (see example++-mpi/schwarz-3.edp) make a wrapper (launchff++.exe) to launch freefem++ under windows/OS in the edp file directory. correct in interpolation matrix ( unset variable in case of same mesh => missing some term in the matrix) V 3.3-3 add missing file in distribution examples++-load/DxWriter.cpp V 3.3-2 8 June 2009 add 2 new finite element: Edge03d : the Nedelec 3d Edge finite elements. RT03d : the Raviart-Thomas 3d finite elements correct the size of anytype for 64 bits architecture. install the new .idp file (include of edp file) in directory idp V 3.3-1 1 June 2009 to correct the problem of the destruction of parameter in case: func real[int] a2(real[int] a) {a[0]=2; return a;} so now the parameter cast to KN_ so the array is not duplicate like in C++, and the value of the parameter is change. - simplify the internal (C++) definition of array now of 2 type KN<> * of variable (left expression) and KN_<> of right expression - correct UnRef where B ~ A* v 3.3 29 may 2009 - correct some problem in return in function : the following function prototype now work without memory fault. func real[int] a1(int n) {real[int] a(n);return a;} func real[int] a2(real[int] &a) { return a;} real[int] G=[7,8,9]; func real[int] a3(real[int] &a) { return G;} func mesh carre(int n) { mesh th=square(n,n); return th;} (lot of change, warning: now KN is not a freefem++ internal type). warning : - in int3d flag qfV= a 3d quadrature formula the 3d quadrature formula are qfV1 , qfV1lump, qfV2 , qfV5 (where the number is the order of the quadrature) - correct sign of the normal in 3d (now the normal is exterior) ------------------------------------------------------------- - correct in adapted mesh the flag splitin2= (no tested) - correct the convect operator in 3d - add EigenValue tool for 3d case May 15, 2009. v 3.2 - add tools to set array like in matlab/scilab real[int] a(1:2:10), def a to 1,3,.. 10. int[int] I(0:n-1) , set array of size n to 0, .., n-1 real[int] b(0.1:0.5:9.99) , set 0.1, 0.6, 1.1,..., 9.6 add : b.n == (9.99-0.1)/0.5 +1 - sort(a,p); // sort a is and array and p in parallel where is a integer array same size of a. - add interface with MUMPS parallel solver (in progress) http://graal.ens-lyon.fr/MUMPS/ - rename movemesh2D3Dsurf in movemesh23 and change named parameter normal= in orientation= - add periodic boundary in condition like in 2d example for a cube with label face numbering 1 : ( x == xmin) 2 : ( x == xmax) 3 : ( y == ymin) 4 : ( y == ymax) 5 : ( z == zmin) 6 : ( z == zmax) fespace Vh(Th,P2,periodic=[[1,y,z],[2,y,z],[3,x,z],[4,x,z],[5,x,y],[6,x,y]]); - automatic: Finite element name conversion beetween 2d and 3d old : fespace(Th3,P13d); new : fespace(Th3,P1); - add complete rewrite of the way to set parameter of the sparse solver for parallel solver ( no progress) - add --enable-m64 for 64 bit compilation flags - correct f2c of take the -m64 flags - build the universal f2c library with 4 architecture ppc i386 ppc64 x86_64 v 3.1-1 - add resize of sparse matrix ( only morse matrix) - add new 3d finite element P1b3d (P1 bulle 3d) - add new option in int1d function in case for build matrix with different meshes mortar=1 ( do not remove integration point if the point is outside of the domain) to make no to bad integration on same curve with different meshes. v 3.1 -correct compile order missing libMesh - add lighting in ffglut (key l) for 3d isovalue v 3.0-6 - correct int2d in 3d. bug in Face -> tet mapping (PBord method) March 5 2009 change the postscript plot dimension to be in A4 paper. nuTriangle given the tet number in 3d case (5 march 2009) area given the area of the triangle on 3d border integral. - add tool to required edge in adaptmesh with label of edges. - correct dy(uh) (always 0) for P13d finite element (27 jan 2009) op==op_dy => op==op_dy line 97 P012_3D.cpp v 3.0-5 (20 jan 2009) - correct array 3D FE function + missing function in 3D (not finish) - correct the install on under windows / cygwin add src/Graphics/ff-win32.cpp missing file in tar.gz under windows correct ff-c++ under cygwin compile (fist test) - automatic compilation of BLAS, suppress the automatic compilation of BLAS atlas (to long) - ffglut improvement - now save 10 graphic states and use "p" key to show previous graphic - do automatic z rescale on Z direction the 3d plot v 3.0-4 (05 jan 2009) - correct int2d in 3d case: all this integral was multiply by 2. - add 3d viewing in plot (in test) v 3.0-3 (27 dec 2008) - build a not to bad version - remove so crazy print - change the ffglut io with freefem++ ( to be more universal independent of the architecture an more universal) - correct ffglut in case of plot of array and when the plot is empty. remark ffglut is not compatible with previous version (sorry) the filename create with option w is ffglut_xxxx.ppm (window dump) correct int2d on 3d mesh3d for Neumann Boundary condition v 3.0-2 ( 9 dec 2008) - ff-c++ to dynamic load program (add ff++.hpp file with all include, may be) - correct the Makefiles et load-link, - correct ffmedit (binary read /win32) - cosmetic change in ffglut + stabilization v 3.0-1 (4 dec 2008) - complete change of the graphic (freefem++ is now the old freefem++-nw ) - add medit (a visualisator software by P. Frey) inside freefem++ with a name ffmedit - suppress the ide version see page: http://www.ann.jussieu.fr/~lehyaric/ffcs - We put a client-server architecture (freefem++,freefem++-nw) <-> ffglut - freefem++-nw and freefem++ is now the same file - ffglut is the visualisator in glut library (run on linux, mac, win32) how to use now: freefem++ file.dp # by default load ffglut (so ffglut must be in the PATH). freefem++ -glut ffglut-path file.edp # change ffglut command freefem++ -fglut saveglutfile file.edp # save data plot ffglut saveglutfile # plot a data file freefem++ -nw file.edp # freefem++ with graphics ffmedit # used medit in freefem - now glumesh2D dynamics tool is in freefem++ add operator + beetween meshes with glu examples++-tutorial/glumesh.edp - add 3 meshing tools in msh3.{so,dll,dylib} operator + between mesh3 add freefem++ function: movemesh2D3Dsurf movemesh3D buildlayers see: examples++-load/buildlayermesh.edp examples++-load/glumesh3D.edp examples++-load/refinesphere.edp examples++-load/tetgenholeregion.edp - add interface with tetgen 3d mesh generator (tetgen.{so,dll,dylib}) add freefem++ function: tetgconvexhull tetgtransfo tetg tetgreconstruction see: examples++-load/buildlayermesh.edp examples++-load/refinesphere.edp examples++-load/tetgencube.edp examples++-load/tetgenholeregion.edp - add interface with medit (medit is now in freefem++ this call ffmedit in medit.{so,dll,dylib} add freefem++ function medit savesol (2d , 3d medit plot) - correct ?: operator with array and real. - correct memory error with valgrind tool (19 oct 2008) In ~ConstructDataFElement() change counter after free nosym eigen call to neupp missing +1 in size of array - correct gestion of the counter of ConstructDataFElement class (09/2008) in Valladolid spain. - add 3D FINITE ELEMENT P0,P1,P2 mesh3 Th("toto.mesh") int3d(Th) , int2d(Th) see examples++-3d/first.edp example v 2.25 - add tool to change lab in mesh see glumesh.edp examples++-load v 2.24-4 - add missing code in case of DG (jump or average) of test function in linear form - add tools to glu meshes (not well test) see glumesh.edp in load examples. - change definition pour interpolation point for P1dc and P2dc (P-G)*c+G now all interpolation point are fully inside the triangle v 2.24-3 - add option resid= in eigenvalue function (see arpack doc) - add formal operator ./ .* between two [ a , b , c ] array v 2.24-2 - correct convect explain in documentation. - correct configure.ac build FLIBS and add check of FLIBS, X11_LIBS value - correct buildmesh trap when degenerate border is create by error. v 2.24-1 - correct periodic condition in case of one edge - correct doc file v 2.24 - bug with border and func this kind of code now works func abc= a(6) + b(4) + c(4) ; func def = d(4) + e(4) + f(6); func bbb= abc + def; plot(bbb); mesh Th=buildmesh(bbb); whare : a,c,b,c,d,e,d are border. - correct bug in periodic Boundary Condition( find by Alexandre Masserey ) mistake in abscise choose. sometime assert fail (loop). add option to the buildmesh that the boundary is fixe (fixeborder=true) see : examples++-tutorial/periodic4bis.edp - and R1.hpp, R2.hpp, R3.hpp files for the 3d version. v 2.23-2 - correct trap in adapdmesh (in mortar-DN-4.edp) in very rare case du to initialized adj of edges on geometry (very old bug) in case of multi points. with verbosity=10; you get this message: -- Begin of insertion process bug 2 Bug double points in .... Fatal error in the meshgenerator 5 .... v 2.23-1 - correct assert fail in check in case of no UMFPACK v 2.23 - add new edge finite element (P1 to P5) in examples++-load/Element_PkEdge.cpp examples++-load/testFE-PkEdge.edp - preconditionned mortar example Neuman -> Dirichet in scalar and parallele see examples++-mpi/mortar-DN-4-mpi.edp examples++-tutorial/mortar-DN-4.edp - add vectorial operator d= a ? b : c where d,a is a array, and b,c can be array or scalar usefull for boundary condition - correct problem in mpi recieve message - correct load dynamic on MacOs (bug in fortran find library) in configure.ac v 2.22-2 - small change in configure.ac of find libumfpack on debian system - correct checking code in problem to same the mesh must be unique in problem of solve definition. v 2.22-1 - make change in Makefile to build universal binary on MacOS - change the README file for compilation on ubuntu Linux. v 2.22 (december, 18, 2007) - correct problem of string argument in function - correct all elasticity problem (missing sqrt(2) ) - correct save of log file under Windows XP, .. v 2.21 (november, 18, 2007) - correct documentation for new edition - correct configure for no X11 and UMFPACK in sparsesuite v 2.20-1 (october, 24, 2007) - correct compilation problem without umfpack - add formal operator for vectorial operator in variational form +, - on [ ] array trace operator matrix like [ [ ... ], .., [... ] ] take element of an array [ ...][2] v 2.20 (october, 2, 2007) - add in download automatic generation of f2c and fort77 to get a free fortran compiler just go in (download/f2d;make install) - add automatic find of libf2c in case of F77=fort77 (driver of f2c) in configure - add tools to change the sparse linear solver with load dynamic, see doc and SuperLu example in examples++-load v 2.19 (august, 19 2007) - correct buildmesh from geometry file and add nbvx= named parameter to infore the maximal number of vertex in a mesh. - add Th[k].area to get the area of the k-th triangle of Th. - add Th[k].region to get the region number (label) of the k-th triangle of Th. - correct string delete in plot of border (mesh.edp) - correct mean and jump in interpolation operator. v 2.18-1 (august, 2007) - correct old bug under Windows: the std input stream now works (cin) v 2.18 (july, 19, 2007) - add sort of real array or int array, syntax: a.sort, and we have : a[i-1] <= a[i] for i =0 to a.n-1 - add v=a.quantile(p) ; statistical function and commute v such than #{ i / a[i] < v } = r*a.n <=> v = a[r*n] when the array is sorted. - correct P4nc, P4 finite element v 2.17-2 (19 june 2007) - correct double $(BLASLIB) in configure.ac (one more) - correct old bug in bamg, in case of bogus boundary (auto crossing)and add code to handle this error correctly with exception (see "test to catch bogus boundary" of example++-tutorial/mesh.edp). v 2.17-1 - add the command line parameter [-v nn] in all freefem++ program to set the level of verbosity to nn before all, and if nn == 0 then theoretically no more spurious output. - correct automatique choose of color in plot of arrow. v 2.17 - add bessel function j0, j1, jn, y0, y1, yn -- Bessel functions of first and second kind - add erf, erfc -- error function operators - add tgamma, lgamma -- gamma and log of gamma - add tool set and get line,column and value of a sparse matrix [I,J,C]=A; // resizing array I,J,C A=[I,J,C] ; where int[int] I(k),J(k); real[int] C(k); - add in tools to get eigen vector of None FE problem like: int nev=5; // number of computed eigen value close to sigma real[int] ev(nev); // to store nev eigein value real[int,int] eV(AA.n,nev); // to store nev eigen vector int k=EigenValue(AA,BB,sym=true,11value=ev,rawvector=eV); - correct the quadrature formula automatic choose with the qforder= field by default the order is correct until order 10 (so exact for P9 polynomials) to add new Quadrature formalur up two order 26 add dynamic load qf11to25 v 2.16-2 correct configure.ac for windows ide compile correct meshsplit, trunc function v 2.16 april 17 2007 Change umfpack download version to the last one add string input from file or cin add Compressible Neo-Hookean Materials exemple v 2.15-1 Correct mistake in cas of splitmesh with internal boundary (assert) Add dump of the mesh regulary (personal work, FH) v 2.15 (27 mars 2007) The blas.tgz file change on http://www.netlib.org/blas/blas.tgz correct the makefile (remove BLAS dir) v 2.14-3 (24 mars 2007) Correct bug in vectorial operation of type (b - 3.14*d) (Thanks to F. Dortu) v 2.14-2 (22 mars 2007) correct integration problem on none classical mesh (mesh of curve of mortar technique) the mesh::Find methode is boggus of the kind on meshes, i make an optimization to remove this call in case build matrix with varf int1d(Th)( u*v) , in case of Th, u or v is def. on same meshes. v 2.14-1 (0 mars 2007) correct missing speeling in configure.ac mpi++.h -> mpi++.h for mpich.1.2 add computing linear form of 2 meshes (ex. v on mesh Th1, and compute int2d(Th1)(v) ) v 2.14 (7 mars 2007) make correction for solaris bluid add P3,P4 and new quadrature formula on triangle up degree 25 with dynamics load. See examples++-load/*P[43]*.edp correct mistake when we build matrix from varf with 3 meshes (FH). v 2.13 Add formal operator * and ' (to day just transpose) on vector [ .. ] and matrix [ [],..., []] so we can write macro grad(u) [ dx(u),dy(u)] // EOM int2d(Th)( grad(u)'*grad(v) ) add scalar term in block matrix as 1x1 matrix. v 2.12-2 correct problem in splitmesh and trunc trunc build always a part of a subdivision mesh splitmesh given more pretty mesh, before if we split 2 adjacent triangle resp in 3 and 4, before we put 2+3 points on the common edge now the put 3 points. v 2.12-1 (jan 15,2007) correct early delete of return pointer in freefem++ function (trap in string.edp under windows ) v 2.12 ( jan 10,2007) correct mistake in none square block matrix v 2.11-2 (nov 29,2006) correct integration problem on none classical mesh (mesh of curve of mortar technique) the mesh::Find method is bogus of the kind on meshes, i make an optimization to remove this call in case build matrix with varf int..(Th)( u*v) , in case of Th, u or v is def. on same meshes. v 2.11-1 (nov 28,2006) Correct bug in interpolation, we building fespace Wf(Th,[RT0,P0]); v 2.11 (nov 10,2006) Correction of the problem in arpack (eigenvalue computation) under i383 processor. After 2 week of hard work, a found the bug. In new version of LAPACK second is a real function and in ARPACK second is a subroutine (Thank the fortran). So I change the Makefile to change the name of function second into secnd2. How to find the bug, in this case the stack of the floating register (info float under gdb) are growing. So after any real function can return a NaN (one time) due to stack float register overflow. A big Thank to D. Bernardi of the help (Merci au fortran et Merci au i383). v 2.10 (oct 26, 2006) correct problem with Eigen value on window and some linux distrubition (Fedora) add a patch of two functions in lapack see arpack/arpack-patch-lapack.tar.gz v 2.9 (sept 19, 2006 FH) change Send and Recv in mpi to Isend and Irecv to make async communication so now freefem++-mpi work with openmpi. V 2.8-3 correct freefem++-cs trap under windows (install the static version) add tools to format ostream ( file or cout) V 2.8-2 (july) use f2c as a fortran compiler on MacIntel architecture, correct mistake in mpi. (june 2006) add nint, and correct mistake in ceil function add configure flag to remove cadna --without-cadna V2.8 Correct mistake in OtherMacOsLib.tgz store file and not link (after 1 june) * Correct bug in vectorial problem with same approximation, some time we do a renumbering of the previous approximation space (a pointer mistake). V2.7-1 * change size of data in 64 bits architecture (in file AnyType.hpp) V2.7 * correct mpi Makefile * correct bug in construction of recursive composite finite element (see HISTORY) remark: the finite element struct, so all dynamic library must be recompile. V2.6-1 * add the examples-bamg directory in freefem++ and correct bamg graphic V2.6 * Huge work (more than a full week) to improve the windows version change all the .dll construction remove lots of trap. All example run without graphics V2.5.1 * change nbve= to nev= in EigenValue function (to be compatible with the doc) * newtow to newton (to correct misspelling) * change in AnyType to remove da random bug on windows. * vim color syntax from Richard MICHEL (vim_highlighting_for_FF++.tar.gz) V2.5-0 * add C++ string operator : int i; string s = "...."; i=s.length ; i=s.size; i=s.find("qsdqs");i=s.rfind("sqs"); i=s.find("qsq",2); s(3:4)="sdfffsf"; // replace from char 3 to 4 by // s[3] not alloued to day (char type is not well type in freefem++). getline(cin,s); * Correct bug when passing parameter string in function * add freefem++ mode for mi editor on macos http://www.mimikaki.net/en/ store in mode-mi-edp.zip archive (unzip and put in the Folder opened with the mi "Option->Open Mode Folder" menu and set "mi" is the Default application for all the .edp file). V2.4-2 * add lot missing vectorial operation with sub array * if u is a complex array (i.e. complex[int u] ..;) then u.re (resp u.im) are the real array of the real (resp. imag ) part of the vector u * in block matrix add utilization of array to build the block matrix see new Laplace-lagrange-mult.edp file to have an example V2.3-3 * add outer product to set matrix or full real or complex 2D array A = 2*a*b'; // where A is a "real[int,int]", b and c a "real[int]". A += 2*a*b'; or A = 2*a*b'; add matrix and array renumbering (see sec. 4.8 of freefem++.doc for all details) V2.3-0 * add three key word for future use try,catch throw a exception handling (no memory management.) try { code ; } catch (...) { code ; } * use tolpivot= to set the pivottol in LU, crout, cholesky factorization V2.2-1 * Add init file to set verbosity, includepath , loadpath and add preload (dynamic link file) the file are under unix and MacOs /etc/freefem++.pref /Users/hecht/.freefem++.pref freefem++.pref under windows freefem++.pref and the syntaxe of the files is verbosity= 5 loadpath += "/Library/FreeFem++/lib" loadpath += "/Users/hecht/Library/FreeFem++/lib" includepath += "/Library/FreeFem++/edp" includepath += "/Users/hecht/Library/FreeFem++/edp" # comment load += "funcTemplate" load += "myfunction" * Add search directory for include, and load under Unix and Windows Just on the shell sh set environment variable export FF_VERBOSITY=50 export FF_INCLUDEPATH="dir;;dir2" export FF_LOADPATH="dir;;dir3"" remark the separator of directory is ";" and not ":" because ":" is use under Windows. * Examples of Add new Finite element with dynamic link/load, Morley and Bernardi Raugel see examples++-load V2.1-2 * add more example of dynamic load example (thank to F. Dortu) * correct mistake in simple integral computation (not in variational form) before we alway use a quadrature formula of order 3, now we can change the quadrature formula and the default is of order 5. V2.0-4 * change in mshptg the size of the small possible edge from 1/32000 to 1/1 000 000 000, this mesher is use in trunc, splitmesh, and triangulate functions. V2.0-3 * correct operator x =/, it does nothing before. (v2.0-3) see end examples++-tutorial/array.edp for all array operator = + - * / .* ./ += -= /= *= : .l1 .l2 .linfty .sum .max .min ' * correct bug when solving complex linear system with UMFPACK before we solve the system when the conjugate matrix Major Change previous version ----------------------------- * add ternary C expression Symbol Example Explanation ?: a?b:c ternary operation * add sparse matrix computation, block matrix construction interpolation construction see examples++-tutorial/sparse-cmatrix.edp examples++-tutorial/sparse-matrix.edp examples++-tutorial/mat_interpol.edp not so well tested, but could be worse. * add example to solve variational inequation. VI.edp * add possibility to build matrix where the 3 meshes the integrale mesh, unknown FE mesh, test FE function can be different. You must use varf to build the matrix is not a standard problem. * Improvement of dynamic loading facility under the 3 systems add a fast Fourier transform with dynamic loading see examples++-load/dfft.edp freefem++-3.38-1/INSTALL000644 000767 000024 00000022030 11406142255 014632 0ustar00hechtstaff000000 000000 Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. freefem++-3.38-1/Install-MacOS.command.in000644 000767 000024 00000003055 11406142255 020122 0ustar00hechtstaff000000 000000 #!/bin/sh appl=/Applications cd `dirname $0` echo "Installtion of Freefem++ " if [ -f OtherMacOsLib.tgz ]; then for i in `tar ztf OtherMacOsLib.tgz`; do if [ ! -f "/$i" ]; then echo " the Libary '/$i' don't exist => install (need of admin password)" sudo tar zxvf OtherMacOsLib.tgz -C / $i else echo " the Libary '/$i' exist " fi done # verif .... for i in `tar ztf OtherMacOsLib.tgz`; do if [ ! -f "/$i" ]; then echo " the Libary '/$i' don't exist FreeFEM cannot run (call you adminisator sorry)" echo "Sorry" exit 1; fi done fi echo " copy FreeFem++.app in "$appl" " if [ -d FreeFem++.app ] ; then rsync -avHE --delete FreeFem++.app/ "$appl"/FreeFem++.app fi lbin=`cd "$appl"/FreeFem++.app/Contents/bin/; echo *` echo " install $lbin commands in /usr/local/bin (need of admin password)" sudo mkdir -p /usr/local/bin sudo mkdir -p `dirname @ff_prefix_dir@` sudo ln -s "$appl"/FreeFem++.app/Contents/bin/* /usr/local/bin sudo rm /usr/local/bin/ff-c++ sudo sed <"$appl"/FreeFem++.app/Contents/bin/ff-c++ >/usr/local/bin/ff-c++ \ -e 's;FFAPPLI_INC;$app/FreeFem++.app/Contents/include;' chmod a+rx /usr/local/bin/ff-c++ if [ -d "@ff_prefix_dir@" ] ; then echo Warning "@ff_prefix_dir@" is a dirctory keep this. else sudo rm -f "@ff_prefix_dir@" sudo ln -s "$appl/FreeFem++.app/Contents" "@ff_prefix_dir@" echo link "@ff_prefix_dir@ -> $appl/FreeFem++.app/Contents/ " fi echo "++ FreeFem++ is correctly install in $appl directory." echo " install in /usr/local/bin: $lbin " echo " Thanks for using FreeFem++ v3 "freefem++-3.38-1/INSTALL-MacOSX000644 000767 000024 00000003065 11515302043 015723 0ustar00hechtstaff000000 000000 To install FreeFem++ on your mac you need to run (double click on) the shell script Install-MacOS.command (you will need to type your password and you must be "administrator" of your machine). This script installs FreeFem++, ffglut, ffmedit in /usr/local/bin , as well as some possibly missing libraries and the FreeFem.app in /Applications. This version can be used in 3 modes - Like a Mac application with drap and drop, etc; then it opens a terminal window for the console IO and (when needed) a graphic window which accepts keyboard commands when in wait mode (listed by typing a "?"). - In terminal mode: (only when FreeFem++.app has not been moved out of the/ Applications directory). In the terminal window one must type "FreeFem++ " where is the name of your xxx.edp file. - With the latest version of the smultron.app (http://tuppis.com/smultron/) text editor directly from inside the editor by typing "cmd+r". Smultron recognizes xx.edp files and activates a color highlight of the keywords (don't forget a "cmd+s" before the "cmd+r"). Technical Note: ------------- This will not work on MacOs systems less than 10.3. This version uses OpenGL/GLUT graphics. The installer command puts in /usr/local/bin the following binaries: ff-c++ tools to compile dynamic libray with freefem++ FreeFem++ the freefem++ command ffglut the graphic visalisator ffmedit the medit sofware Some external library are in the archive file OtherMacOsLib.tgz; you may need to install these READ le READ_MAC to buil freefem++ on your mac. freefem++-3.38-1/install-sh000755 000767 000024 00000031600 11406142256 015611 0ustar00hechtstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2006-10-14.15 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" posix_glob= posix_mkdir= # Desired mode of installed file. mode=0755 chmodcmd=$chmodprog chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) mode=$2 shift shift case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac done if test $# -ne 0 && test -z "$dir_arg$dstarg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix=/ ;; -*) prefix=./ ;; *) prefix= ;; esac case $posix_glob in '') if (set -f) 2>/dev/null; then posix_glob=true else posix_glob=false fi ;; esac oIFS=$IFS IFS=/ $posix_glob && set -f set fnord $dstdir shift $posix_glob && set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dst"; then $doit $rmcmd -f "$dst" 2>/dev/null \ || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } } || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: freefem++-3.38-1/logo.ico000644 000767 000024 00000006066 11406142256 015251 0ustar00hechtstaff000000 000000 BM6 6(  %%ѰӺƣm>%W ˱i*ٻÖSvm_q޿ȭxy: t &͑lYw2 ]̾p] lpnfs ?ݪ^ef 2 |a ` B_w X 1IHISTORY ;\ fi documentation: cd DOC && $(MAKE) $(AM_MAKEFLAGS) documentation DOC/freefem++doc.pdf: cd $(@D) && $(MAKE) $(AM_MAKEFLAGS) $(@F) clean-local:: -find . \( -name '*~' -or -name ListOfUnAllocPtr.bin \) |xargs rm -rm examples*/*.eps # "dist" targets clean-local:: -rm freefem++-*.tar.gz freefem++-*.zip -rm Output/FreeFem++-*.exe # Reduced compilation # ------------------- quick: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/std && $(MAKE) $(AM_MAKEFLAGS) nw: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/nw && $(MAKE) $(AM_MAKEFLAGS) bamg: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/bamg && $(MAKE) $(AM_MAKEFLAGS) ide: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd download && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/ide && $(MAKE) $(AM_MAKEFLAGS) FreeFem++-cs$(EXEEXT) # Cleaning generated files which are stored in the CVS repository, to # avoid technical CVS conflicts. clean-gen: ./cleanregen.sh # Testing # ------- # The standard automake goal "make check" is also valid. It just does # not run any test that could prevent the user from working on its # machine (because of unexpected windows opening right in the middle # of the workspace). visualcheck: all $(MAKE) $(AM_MAKEFLAGS) check VISUALCHECK=yes speedtest: all cd examples++-other && $(MAKE) $(AM_MAKEFLAGS) check # Windows package # --------------- # Windows package script (for Inno Setup). We extract version # information from the Debian Changelog to get the package release # number as well. win32:WindowsPackage.iss cd examples++-load;tar zxvf include.tar.gz;mkdir include-tmp;cp -Lr *.h include/* include-tmp WindowsPackage.iss: WindowsPackage.m4 configure.ac Makefile.am m4 -DVERSION='$(VERSION)$(ADD_PACKAGE_NAME)' \ -DMPIPROG='$(MPIPROG)' WindowsPackage.m4 > WindowsPackage.iss # Debian package # -------------- deb: dpkg-buildpackage -rfakeroot @echo Now run CopyToServer.sh in debian subdirectory # Build all versions # ------------------ nativeX: $(FF_MAC_PREFIX)_MacOsX.tgz echo "done" MacOsX: -rm -rf OsXxx mkdir -p OsXxx/Applications/ make install DESTDIR="`pwd`/OsXxx" tar zxvf FreeFem++.app.tgz -C OsXxx/Applications/ cd OsXxx;tar cvfz ../$(FF_MAC_PREFIX)_MacOsX.tgz . rm -rf OsXxx clean-local:: -rm freefem++-$(VERSION).tar.gz -rm -rf FreeFem++v*_MacOS # Native MacOS packaging # ---------------------- install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(pkgdatadir)/$(VERSION) tar cvf - $(FF_EXAMPLES_FILES)| (cd $(DESTDIR)$(pkgdatadir)/$(VERSION); tar xvf -) $(mkinstalldirs) -m 755 $(DESTDIR)${bindir} -test `uname` = Darwin && $(INSTALL_SCRIPT) FreeFem++-CoCoa $(DESTDIR)${bindir} ListFiles-natives: .FORCE echo $(FF_EXAMPLES_FILES) >$@ echo ./download/fftw/Makefile ./download/fftw/Makefile.am >>$@ find . -name '*.[ei]dp' -o -name '*.h*' -o -name '*.cpp' -o -name '*.pgm' |egrep '[.]/examples++' >>$@ find . -name '*.h*' -o -name '*.cpp' |egrep '[.]/examples++' >>$@ List-agl-dylib: src/nw/FreeFem++ otool -L src/nw/FreeFem++|egrep -v '/System/Library/|/usr/lib/'|awk '/.dylib/ {print $$1}' >$@ CheckMacLib.sh: src/nw/FreeFem++ echo "for i in `otool -L src/nw/FreeFem++|egrep -v '/System/Library/|/usr/lib/'|awk '/.dylib/ {printf($$1.OFS) }'` ; do test ! -f $$i && exit 1; done; exit 0" >$@ chmod a+x $@ CheckMPIMacLib.sh: src/mpi/FreeFem++-mpi echo "for i in `otool -L src/mpi/FreeFem++-mpi|egrep -v '/System/Library/|/usr/lib/'|awk '/.dylib/ {printf($$1.OFS) }'` ; do test ! -f $$i && exit 1; done; exit 0" >$@ chmod a+x $@ .FORCE: $(FF_MAC_PREFIX)_Macos:documentation ListFiles-natives -mkdir $@ cat ListFiles-natives|xargs tar chf - | (cd $@ ; tar xf - ) /Developer/Tools/CpMac "FreeFem++(Carbon)" $@/FreeFem++ cp DOC/freefem++-doc.pdf $@ $(FF_MAC_PREFIX)_MacOsX: all documentation ListFiles-natives List-agl-dylib -mkdir $@ cp DOC/freefem++doc.pdf $@ cat ListFiles-natives|xargs tar chf - | (cd $@ ; tar xf - ) cd $@ ; tar zxf ../src/agl/FreeFem++.app.tgz sed $@/FreeFem++.app/Contents/Info.plist \ -e "s/@VVERSION@/$(VERSION)$(ADD_PACKAGE_NAME)/g" \ -e "s/@DATE@/`date`/g" cp src/nw/FreeFem++ $@/FreeFem++.app/Contents/bin cp src/nw/ffglut $@/FreeFem++.app/Contents/bin cp src/medit/ffmedit $@/FreeFem++.app/Contents/bin cp examples++-load/ff-get-dep $@/FreeFem++.app/Contents/bin cp examples++-load/ff-pkg-download $@/FreeFem++.app/Contents/bin sed $@/FreeFem++.app/Contents/bin/ff-c++ -e 's;FFAPPLI_INC;$@/FreeFem++.app/Contents/include;' chmod a+x $@/FreeFem++.app/Contents/bin/ff-c++ -mkdir $@/FreeFem++.app/Contents/include -mkdir $@/FreeFem++.app/Contents/idp cp examples++-load/include/* $@/FreeFem++.app/Contents/include cp examples++-load/*.dylib $@/FreeFem++.app/Contents/lib cp examples++-*/*.idp $@/FreeFem++.app/Contents/idp -if [ -s List-agl-dylib ]; then tar zchvf $@/OtherMacOsLib.tgz `cat List-agl-dylib`; fi; ./config.status --file=$@/Install-MacOS.command:Install-MacOS.command.in chmod a+rx $@/Install-MacOS.command -mkdir $@/FreeFem++.app/Contents/etc echo loadpath += \"./\" >$@/FreeFem++.app/Contents/etc/freefem++.pref echo loadpath += \"$(ff_prefix_dir)/lib\" >>$@/FreeFem++.app/Contents/etc/freefem++.pref echo includepath += \"$(ff_prefix_dir)/edp\" >>$@/FreeFem++.app/Contents/etc/freefem++.pref echo includepath += \"$(ff_prefix_dir)/idp\" >>$@/FreeFem++.app/Contents/etc/freefem++.pref $(FF_MAC_PREFIX)_MacOsX.tgz: $(FF_MAC_PREFIX)_MacOsX tar zcvf $(FF_MAC_PREFIX)_MacOsX.tgz $(FF_MAC_PREFIX)_MacOsX # Linux binary-only package # ------------------------- # Include kernel and libc version in static package name PACKAGE_NAME=FreeFem++v$(VERSION)_linux-$(KERNEL_VERSION)_$(LIBC_VERSION)$(OPTIM_TYPE) linux-package: $(PACKAGE_NAME).tgz # No direct dependency to "all" to be able to debug the packaging # procedure on its own. $(PACKAGE_NAME): ListFiles-natives cat ListFiles-natives|xargs tar cfh - | (cd $@ ; tar xf - ) -mkdir $@ cp src/std/FreeFem++ $@ ./copysharedlibs.sh src/std/FreeFem++ $@ cp src/nw/FreeFem++-nw $@ ./copysharedlibs.sh src/nw/FreeFem++-nw $@ cp src/ide/FreeFem++-cs $@ ./copysharedlibs.sh src/ide/FreeFem++-cs $@ cp src/ide/FreeFem++-server $@ ./copysharedlibs.sh src/ide/FreeFem++-server $@ cp src/ide/FreeFem++-client $@ ./copysharedlibs.sh src/ide/FreeFem++-client $@ -cp src/glx/FreeFem++-glx $@ -./copysharedlibs.sh src/glx/FreeFem++-glx $@ -cp src/mpi/FreeFem++-mpi $@ -./copysharedlibs.sh src/mpi/FreeFem++-mpi $@ $(PACKAGE_NAME).tgz: $(PACKAGE_NAME) tar cvzf $@ $< clean-local:: -rm -r $(PACKAGE_NAME) $(PACKAGE_NAME).tgz autofiles:AutoGeneratedFile.tar.gz LIST_GENERATE_FILE= \ DOC/Makefile.in download/umfpack/Makefile.in examples++-tutorial/Makefile.in src/femlib/Makefile.in \ Makefile.in examples++-3d/Makefile.in examples++/Makefile.in src/fflib/Makefile.in \ config.h.in examples++-bug/Makefile.in src/Algo/Makefile.in src/lglib/Makefile.in \ configure examples++-chapt3/Makefile.in src/Graphics/Makefile.in src/libMesh/Makefile.in \ download/Makefile.in examples++-eigen/Makefile.in src/Makefile.in src/medit/Makefile.in \ download/arpack/Makefile.in examples++-load/Makefile.in src/bamg/Makefile.in src/mpi/Makefile.in \ download/blas/Makefile.in examples++-mpi/Makefile.in src/bamglib/Makefile.in src/nw/Makefile.in \ download/fftw/Makefile.in examples++-other/Makefile.in src/bin-win32/Makefile.in LIST_GENERATE_FILE_AM= \ DOC/Makefile.am download/umfpack/Makefile.am examples++-tutorial/Makefile.am src/femlib/Makefile.am \ Makefile.am examples++-3d/Makefile.am examples++/Makefile.am src/fflib/Makefile.am \ examples++-bug/Makefile.am src/Algo/Makefile.am src/lglib/Makefile.am \ configure.ac examples++-chapt3/Makefile.am src/Graphics/Makefile.am src/libMesh/Makefile.am \ download/Makefile.am examples++-eigen/Makefile.am src/Makefile.am src/medit/Makefile.am \ download/arpack/Makefile.am examples++-load/Makefile.am src/bamg/Makefile.am src/mpi/Makefile.am \ download/blas/Makefile.am examples++-mpi/Makefile.am src/bamglib/Makefile.am src/nw/Makefile.am \ download/fftw/Makefile.am examples++-other/Makefile.am src/bin-win32/Makefile.am #$(LIST_GENERATE_FILE):$(LIST_GENERATE_FILE_AM) # @echo "WARNING the configure file is older than configure build flies" # @echo "Rebuild configure: do one the three case" # @echo " if you have autoconf # make conf" # @echo " or without # make conf-without-autoconf" # @echo " or by pass this problem # make conf-touch" conf: autoreconf ./config.status --recheck conf-without-autoconf: tar zxvf AutoGeneratedFile.tar.gz ./config.status --recheck conf-touch: touch $(LIST_GENERATE_FILE) AutoGeneratedFile.tar.gz:$(LIST_GENERATE_FILE) configure.ac tar cvfz $@ $(LIST_GENERATE_FILE) freefem++-3.38-1/Makefile.in000644 000767 000024 00000121152 12543260336 015657 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for FreeFem++, adapted to Automake # ------------------------------------------- # Adaptation to Automake: Antoine Le Hyaric - LJLL Paris 6 - # lehyaric@ann.jussieu.fr - 13/5/04 # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README TODO compile \ config.guess config.sub depcomp install-sh missing \ mkinstalldirs ylwrap DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip GZIP_ENV = --best DIST_TARGETS = dist-gzip dist-zip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ # Linux binary-only package # ------------------------- # Include kernel and libc version in static package name PACKAGE_NAME = FreeFem++v$(VERSION)_linux-$(KERNEL_VERSION)_$(LIBC_VERSION)$(OPTIM_TYPE) PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = download src examples++-tutorial examples++ \ examples++-eigen examples++-load examples++-mpi \ examples++-bug examples++-chapt3 examples++-other \ examples++-3d DOC EXTRA_DIST = test-driver-ff regtests.sh config-wrapper.h \ FreeFem++.mcp HISTORY HISTORY_BEFORE_2005 BUGS TODO regtests.m4 \ INSTALL INSTALL-MacOSX INNOVATION \ WindowsPackage.m4 README README_ARPACK README_WINDOWS README_MAC \ logo.ico copysharedlibs.sh COPYRIGHT edp.nedit reconfigure \ mode-mi-edp.zip aclocal.m4 acmacros.m4 acoptim.m4 ax_lib_hdf5.m4 \ freefem++.spec crimson-freefem++.zip \ Install-MacOS.command.in \ examples-bamg/NACA012/naca.awk examples-bamg/quadloop/dotest.pl \ examples-bamg/square/*_g.* examples-bamg/square/do* examples-bamg/NACA012/[adp]* \ examples-bamg/test/dotest*.pl 0ldUserReadMe.txt CheckAllEdp CheckAll \ WHERE_LIBRARY-mkl FreeFem++-CoCoa \ uninstall-ff++ \ ./build/cleancrlf ./build/download ./build/links2files \ ./build/orgindex ./build/ff-md5 FF_MAC_PREFIX = FreeFem++v$(VERSION)$(ADD_PACKAGE_NAME) FF_EXAMPLES_FILES = COPYRIGHT HISTORY HISTORY_BEFORE_2005 README README_WINDOWS README_MAC BUGS TODO INSTALL INSTALL-MacOSX INNOVATION \ mode-mi-edp.zip \ examples++-tutorial/aile.msh examples++-tutorial/xyf \ examples++-3d/dodecaedre01.mesh \ examples++-3d/lac-leman-v4.msh \ examples++-load/load.link \ examples++-load/fig.pgm examples++-load/lg.pgm \ ./examples++-mpi/regtests.sh ./examples++-other/speedtest.sh \ ./download/fftw/Makefile ./download/fftw/Makefile.am \ examples++*/*.[ie]dp CheckAllEdp LIST_GENERATE_FILE = \ DOC/Makefile.in download/umfpack/Makefile.in examples++-tutorial/Makefile.in src/femlib/Makefile.in \ Makefile.in examples++-3d/Makefile.in examples++/Makefile.in src/fflib/Makefile.in \ config.h.in examples++-bug/Makefile.in src/Algo/Makefile.in src/lglib/Makefile.in \ configure examples++-chapt3/Makefile.in src/Graphics/Makefile.in src/libMesh/Makefile.in \ download/Makefile.in examples++-eigen/Makefile.in src/Makefile.in src/medit/Makefile.in \ download/arpack/Makefile.in examples++-load/Makefile.in src/bamg/Makefile.in src/mpi/Makefile.in \ download/blas/Makefile.in examples++-mpi/Makefile.in src/bamglib/Makefile.in src/nw/Makefile.in \ download/fftw/Makefile.in examples++-other/Makefile.in src/bin-win32/Makefile.in LIST_GENERATE_FILE_AM = \ DOC/Makefile.am download/umfpack/Makefile.am examples++-tutorial/Makefile.am src/femlib/Makefile.am \ Makefile.am examples++-3d/Makefile.am examples++/Makefile.am src/fflib/Makefile.am \ examples++-bug/Makefile.am src/Algo/Makefile.am src/lglib/Makefile.am \ configure.ac examples++-chapt3/Makefile.am src/Graphics/Makefile.am src/libMesh/Makefile.am \ download/Makefile.am examples++-eigen/Makefile.am src/Makefile.am src/medit/Makefile.am \ download/arpack/Makefile.am examples++-load/Makefile.am src/bamg/Makefile.am src/mpi/Makefile.am \ download/blas/Makefile.am examples++-mpi/Makefile.am src/bamglib/Makefile.am src/nw/Makefile.am \ download/fftw/Makefile.am examples++-other/Makefile.am src/bin-win32/Makefile.am all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h all-local installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ am--refresh check check-am clean clean-cscope clean-generic \ clean-local cscope cscopelist-am ctags ctags-am dist dist-all \ dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am .PRECIOUS: Makefile # Creates a file named "ChangeLog" containing the chronology of all # modifications to the source files. Needs "cvs2cl" to be installed. changelog: cvs2cl # History before 2005 is stored in the file "HISTORY_BEFORE_2005" all-local:: @HISTORY@ # try and avoid running this under fakeroot (otherwise we may face # problems trying to connect to CVS as pseudo-root). Debian packaging # uses fakeroot. history: if test "$$FAKED_MODE" = ""; then\ hg log >HISTORY ;\ fi documentation: cd DOC && $(MAKE) $(AM_MAKEFLAGS) documentation DOC/freefem++doc.pdf: cd $(@D) && $(MAKE) $(AM_MAKEFLAGS) $(@F) clean-local:: -find . \( -name '*~' -or -name ListOfUnAllocPtr.bin \) |xargs rm -rm examples*/*.eps # "dist" targets clean-local:: -rm freefem++-*.tar.gz freefem++-*.zip -rm Output/FreeFem++-*.exe # Reduced compilation # ------------------- quick: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/std && $(MAKE) $(AM_MAKEFLAGS) nw: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/nw && $(MAKE) $(AM_MAKEFLAGS) bamg: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/bamg && $(MAKE) $(AM_MAKEFLAGS) ide: cd src/libMesh && $(MAKE) $(AM_MAKEFLAGS) cd download && $(MAKE) $(AM_MAKEFLAGS) cd src/lglib && $(MAKE) $(AM_MAKEFLAGS) cd src/fflib && $(MAKE) $(AM_MAKEFLAGS) cd src/ide && $(MAKE) $(AM_MAKEFLAGS) FreeFem++-cs$(EXEEXT) # Cleaning generated files which are stored in the CVS repository, to # avoid technical CVS conflicts. clean-gen: ./cleanregen.sh # Testing # ------- # The standard automake goal "make check" is also valid. It just does # not run any test that could prevent the user from working on its # machine (because of unexpected windows opening right in the middle # of the workspace). visualcheck: all $(MAKE) $(AM_MAKEFLAGS) check VISUALCHECK=yes speedtest: all cd examples++-other && $(MAKE) $(AM_MAKEFLAGS) check # Windows package # --------------- # Windows package script (for Inno Setup). We extract version # information from the Debian Changelog to get the package release # number as well. win32:WindowsPackage.iss cd examples++-load;tar zxvf include.tar.gz;mkdir include-tmp;cp -Lr *.h include/* include-tmp WindowsPackage.iss: WindowsPackage.m4 configure.ac Makefile.am m4 -DVERSION='$(VERSION)$(ADD_PACKAGE_NAME)' \ -DMPIPROG='$(MPIPROG)' WindowsPackage.m4 > WindowsPackage.iss # Debian package # -------------- deb: dpkg-buildpackage -rfakeroot @echo Now run CopyToServer.sh in debian subdirectory # Build all versions # ------------------ nativeX: $(FF_MAC_PREFIX)_MacOsX.tgz echo "done" MacOsX: -rm -rf OsXxx mkdir -p OsXxx/Applications/ make install DESTDIR="`pwd`/OsXxx" tar zxvf FreeFem++.app.tgz -C OsXxx/Applications/ cd OsXxx;tar cvfz ../$(FF_MAC_PREFIX)_MacOsX.tgz . rm -rf OsXxx clean-local:: -rm freefem++-$(VERSION).tar.gz -rm -rf FreeFem++v*_MacOS # Native MacOS packaging # ---------------------- install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(pkgdatadir)/$(VERSION) tar cvf - $(FF_EXAMPLES_FILES)| (cd $(DESTDIR)$(pkgdatadir)/$(VERSION); tar xvf -) $(mkinstalldirs) -m 755 $(DESTDIR)${bindir} -test `uname` = Darwin && $(INSTALL_SCRIPT) FreeFem++-CoCoa $(DESTDIR)${bindir} ListFiles-natives: .FORCE echo $(FF_EXAMPLES_FILES) >$@ echo ./download/fftw/Makefile ./download/fftw/Makefile.am >>$@ find . -name '*.[ei]dp' -o -name '*.h*' -o -name '*.cpp' -o -name '*.pgm' |egrep '[.]/examples++' >>$@ find . -name '*.h*' -o -name '*.cpp' |egrep '[.]/examples++' >>$@ List-agl-dylib: src/nw/FreeFem++ otool -L src/nw/FreeFem++|egrep -v '/System/Library/|/usr/lib/'|awk '/.dylib/ {print $$1}' >$@ CheckMacLib.sh: src/nw/FreeFem++ echo "for i in `otool -L src/nw/FreeFem++|egrep -v '/System/Library/|/usr/lib/'|awk '/.dylib/ {printf($$1.OFS) }'` ; do test ! -f $$i && exit 1; done; exit 0" >$@ chmod a+x $@ CheckMPIMacLib.sh: src/mpi/FreeFem++-mpi echo "for i in `otool -L src/mpi/FreeFem++-mpi|egrep -v '/System/Library/|/usr/lib/'|awk '/.dylib/ {printf($$1.OFS) }'` ; do test ! -f $$i && exit 1; done; exit 0" >$@ chmod a+x $@ .FORCE: $(FF_MAC_PREFIX)_Macos:documentation ListFiles-natives -mkdir $@ cat ListFiles-natives|xargs tar chf - | (cd $@ ; tar xf - ) /Developer/Tools/CpMac "FreeFem++(Carbon)" $@/FreeFem++ cp DOC/freefem++-doc.pdf $@ $(FF_MAC_PREFIX)_MacOsX: all documentation ListFiles-natives List-agl-dylib -mkdir $@ cp DOC/freefem++doc.pdf $@ cat ListFiles-natives|xargs tar chf - | (cd $@ ; tar xf - ) cd $@ ; tar zxf ../src/agl/FreeFem++.app.tgz sed $@/FreeFem++.app/Contents/Info.plist \ -e "s/@VVERSION@/$(VERSION)$(ADD_PACKAGE_NAME)/g" \ -e "s/@DATE@/`date`/g" cp src/nw/FreeFem++ $@/FreeFem++.app/Contents/bin cp src/nw/ffglut $@/FreeFem++.app/Contents/bin cp src/medit/ffmedit $@/FreeFem++.app/Contents/bin cp examples++-load/ff-get-dep $@/FreeFem++.app/Contents/bin cp examples++-load/ff-pkg-download $@/FreeFem++.app/Contents/bin sed $@/FreeFem++.app/Contents/bin/ff-c++ -e 's;FFAPPLI_INC;$@/FreeFem++.app/Contents/include;' chmod a+x $@/FreeFem++.app/Contents/bin/ff-c++ -mkdir $@/FreeFem++.app/Contents/include -mkdir $@/FreeFem++.app/Contents/idp cp examples++-load/include/* $@/FreeFem++.app/Contents/include cp examples++-load/*.dylib $@/FreeFem++.app/Contents/lib cp examples++-*/*.idp $@/FreeFem++.app/Contents/idp -if [ -s List-agl-dylib ]; then tar zchvf $@/OtherMacOsLib.tgz `cat List-agl-dylib`; fi; ./config.status --file=$@/Install-MacOS.command:Install-MacOS.command.in chmod a+rx $@/Install-MacOS.command -mkdir $@/FreeFem++.app/Contents/etc echo loadpath += \"./\" >$@/FreeFem++.app/Contents/etc/freefem++.pref echo loadpath += \"$(ff_prefix_dir)/lib\" >>$@/FreeFem++.app/Contents/etc/freefem++.pref echo includepath += \"$(ff_prefix_dir)/edp\" >>$@/FreeFem++.app/Contents/etc/freefem++.pref echo includepath += \"$(ff_prefix_dir)/idp\" >>$@/FreeFem++.app/Contents/etc/freefem++.pref $(FF_MAC_PREFIX)_MacOsX.tgz: $(FF_MAC_PREFIX)_MacOsX tar zcvf $(FF_MAC_PREFIX)_MacOsX.tgz $(FF_MAC_PREFIX)_MacOsX linux-package: $(PACKAGE_NAME).tgz # No direct dependency to "all" to be able to debug the packaging # procedure on its own. $(PACKAGE_NAME): ListFiles-natives cat ListFiles-natives|xargs tar cfh - | (cd $@ ; tar xf - ) -mkdir $@ cp src/std/FreeFem++ $@ ./copysharedlibs.sh src/std/FreeFem++ $@ cp src/nw/FreeFem++-nw $@ ./copysharedlibs.sh src/nw/FreeFem++-nw $@ cp src/ide/FreeFem++-cs $@ ./copysharedlibs.sh src/ide/FreeFem++-cs $@ cp src/ide/FreeFem++-server $@ ./copysharedlibs.sh src/ide/FreeFem++-server $@ cp src/ide/FreeFem++-client $@ ./copysharedlibs.sh src/ide/FreeFem++-client $@ -cp src/glx/FreeFem++-glx $@ -./copysharedlibs.sh src/glx/FreeFem++-glx $@ -cp src/mpi/FreeFem++-mpi $@ -./copysharedlibs.sh src/mpi/FreeFem++-mpi $@ $(PACKAGE_NAME).tgz: $(PACKAGE_NAME) tar cvzf $@ $< clean-local:: -rm -r $(PACKAGE_NAME) $(PACKAGE_NAME).tgz autofiles:AutoGeneratedFile.tar.gz #$(LIST_GENERATE_FILE):$(LIST_GENERATE_FILE_AM) # @echo "WARNING the configure file is older than configure build flies" # @echo "Rebuild configure: do one the three case" # @echo " if you have autoconf # make conf" # @echo " or without # make conf-without-autoconf" # @echo " or by pass this problem # make conf-touch" conf: autoreconf ./config.status --recheck conf-without-autoconf: tar zxvf AutoGeneratedFile.tar.gz ./config.status --recheck conf-touch: touch $(LIST_GENERATE_FILE) AutoGeneratedFile.tar.gz:$(LIST_GENERATE_FILE) configure.ac tar cvfz $@ $(LIST_GENERATE_FILE) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/missing000755 000767 000024 00000024032 11406142256 015205 0ustar00hechtstaff000000 000000 #! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 freefem++-3.38-1/mkinstalldirs000755 000767 000024 00000003704 11406142256 016417 0ustar00hechtstaff000000 000000 #! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here freefem++-3.38-1/mode-mi-edp.zip000644 000767 000024 00000047403 11406142256 016436 0ustar00hechtstaff000000 000000 PK czx4edp/UX $D#DPKl|4 edp/.DS_StoreUX P)Dx )D;N0EX"MJJ/v` @@AD7 Evj PPsOdȟG@J jH'stK#M˘|<$/ƋE:}iBf*ǟB?b`B>kc_Άi%xot;.BWPKH4}PK |4 __MACOSX/UX P)DP)DPK |4 __MACOSX/edp/UX P)DP)DPKl|4__MACOSX/edp/._.DS_StoreUX P)Dx )Dc`cg`b 1N 6b(?YM PK #wRPKx4edp/edpUX P)DF0$DERa GSnqN]g0&3uS tvD0v"!K-$-:mB@bO4SxiGgK&M!R1}"{C3~:=a8ݵqnFtHc>deh&:€h*jFyqte2sKqjRY7yF N(q2` ,JkiucqU꓅8` gq>):u!Qa󙼮y[=@]@n"/[ZTu ,Tk:m^2Wst #PK˻*PKx4__MACOSX/edp/._edpUX P)DF0$DY pT>mv7 ፈlJl%Yp P(fلm qmBQ;'QgB b ڎHT?LԎ|}$Q{ι s6!~.Uk|R8\h$^l` CX䆜KIutsppa5!DS13Y_y`UC/z'[~= VZ}IĊ&HYj+f4RW2f]V;=ξWrV?+`/2EͦHTk Up@Uj6 \R ;Xdx0?^ A? O`՞EO|%ŸZgxʗ&.>ng'Hm_Cg˂<[ٱPlW`h.x&p% a8LTi[ Tm}=S.G2뚣D8={ɺ˂#sĪ%i۾CKc MMS6[2RKҧN]Jŗyy_=p\V}s,ܤ '2Mڑ}50S/6mS:c,r߭s濽j?kCuK?jhDcMwDһ,/(xCэ&OB}4z?by՗d&|F4jwWu=V]savw@'Os_}j׏洿5{'*W=փzP2vñ~ܺ7m{9 7e,b5䘗`{gЌPdܸ@Sg|FdDng+ǀQuwonx혹~/67c -qg&Xt{/s5 Wc,htՄ@"logE$c1X^>N}YCsh9Y6~3 nKh4AkIw~ʳAђSGWNҨ6-],l)A,ctQ-9A6#p0Z\s8ryKE0ZEbP4Aw *9+ 6::j;v\Z-[ALǜׅCS]['La~јB:y]ɪP:d5աP:iUbUuvܟ9ZeyPk$}HЙmVRV5j1\I?G%wwabBs &ˏaJ\;Y%z7ew7CEM(j*K}cZUjU)"ڪcI7'q8o.,:瞙;s~,UC++u|HƳ*kM~Ed$DU({j/k?φN;gzgμnkw^ゝG6'>Y'ut_8ƣkJJO>%(yGvOQ*P~i/+9Eŗ딜y!A?UQo)=Ugx%Sѐ%lm5IU=m4 @ѓ$cgr2H#ERdz=f{[{XRFvWttkց\:LLjFVۯ>G>'Okh5-R--2u=T *R5*.]'_) )kO@`ʺjCeVN;@қR_:Ac[ y$IY/d~.-UP8rRL~}֎~Ug:F>}NZ TߴNK֑" o{6iݯŸ)IŝT&'*Bxjg- ~ 0OU: TFzb[ZaBPm 0LDA6%n&ȑNzRߎAP-O4+jlgbvpPm̲ ]k(Jq'bN:Z5g-µEzozu.RYzhko 5!JE$݆|G%#HH%KNsvz2UPY$ EL_I/9#rȁڥkCeI_=&mMLI- Y2H}T00U&?|CQ&);'r eJLn|!-m5>[I u.jP#&6p &}@-*)jf91af]0,~'mP_z2gM^:RA[U bBLq~F/nKRP&|䙘[A!oPUz |?Lߤ,oK)-7ED#@;$.Aׯ"W VmsWĈ?h윻PI|֔u˂q)K/x3M,=HdlD.W) _X/JvYw(o<:J6Xcʳ}++ດ楎nxr  XNʞ'ej,A= 2cЃ'J͆{ 줝-fn\GP˪(ke}J$.NVǨe9\ڤnN=L>O)=^` "EzO{Χ\zWP͡PC|R|A>h|B\uRJ;m~/c棨֝stvf[ۃo8u>? YV:l>,}hB%U7{V孑߮n]|SS7p!r6veߡ1+FcPWSGc摝n_*z:Hht@^қ6^de?M[' G+LlP U6/| :gπil'l1㹸9vLk*g9H^ӱ㕃5a9d2,:e SXj^PKPQ PK x4 edp/toolbar/UX (D-0$DPK@x4edp/toolbar/Comment OutUX P)Dw#Dײ vququPKfɄfPK |4__MACOSX/edp/toolbar/UX P)DP)DPK@x4"__MACOSX/edp/toolbar/._Comment OutUX P)Dw#Dc`cg`b 1N 6b(?#:5"(`b{ l@P[p@d =bP1 O400(s00Oe`hfb`di@sP ~D=H0``{ws2hr ,N0222052@r< iYI-Y0E0EdL& [=;P2\ j@ 258?0#4Ai*F% ,@٘xR3 $Ff㾠O>VpI,.NUNͬLM4``jHZSW u o v ;$[`~@? Sfgl<<@0rN ('nGO P H5@ Q-g/HK,́@" _L~i ƽ {@@Wmzr`8umM91v07Y2 i Ləy@}@`,AUh;@L I fbzzz;z{*'(PKdwPK@x4 edp/toolbar/Find Selected StringUX P)Dx#DqsutwPKJ^IPK@x4+__MACOSX/edp/toolbar/._Find Selected StringUX P)Dx#DV=hSQ>' nX)&Tjl-4XZ!1Ƀ^OJ7YCD I(:8ܟ6]|{w=n d+tEџLsH{@Cvȋ4Cq)uiFs9F<01\8ʯ{K{ۊ߃13 /rX_1#o3;5^{f*-vs|I(<}uC !%34;&(x뒄 [rrk[-V|Y-Dg`?=8pQ'=Y}~YU{zl}rгy]bf\:y;X7+5?Tߓ]~^*Yџ0*GyA!e=oV;CO-|Ikk#PՙF&?V}݂oe}ΥoCՁ~Zt8u ]>8 fƂx3|ϝqk˴mc[wF~ |[In6PK[ć= PK@x4'edp/toolbar/Find Selected String - NextUX P)Dx#Dqs vququsPKWr~PK@x42__MACOSX/edp/toolbar/._Find Selected String - NextUX P)Dx#DVMLA~3rM@" Ƃ4I@PjxiJ#bF#Ab"hD=Q= 5DĐ-!FoVDW |6˩ <ވqa0[+qvIY]!8|`y6vp v:4+)hm|Dq9 0"V߉Q>М4|}:4F4!ʱ@g1P)_cs} SYp_hhB 2 q.`yψf3m*;c;\iC]9S35qBʭK3َzʭenYoʧ4{bT K P)(Z-렞tO?YXj^{7FX+8ـn!R\Ϣ8];PKn7DzPK@x4+edp/toolbar/Find Selected String - PreviousUX P)Dx#Dqs vququ r PK3JPK@x46__MACOSX/edp/toolbar/._Find Selected String - PreviousUX P)Dx#DVKQD;ԺJP&$h낉Bu]WFKu[7bC.32 rеZ?jꃸugd( GCjPqe a>5)*=$RHlvWP@ך][hEfk^eJr2WoE^F[X^(mX>W߫{3 e`< O+$vxDs蒢YV $F+%IBR=vIWtS;x(\49s0.Ჰq `t:ShbݮV&nM [ԅGT8n]6v5;8\hIr0@|/rP皋NMSIe=]͑Kۙsp|zv"‰p"сPMV̸}FɂK%gbp,MĴG6L{"ąۯ-W7A{^G"`6]i>!@;B9?E/Ɇ#[Gw24W̧!/svgMZoP|U_CM]t(<5jD̸aUe{n98HsސFG8oc4C|;:|+dnOUp]s}@:&SwPK_UjE PK@x4edp/toolbar/IndentUX P)Dw#Dsq PKd< PK@x4__MACOSX/edp/toolbar/._IndentUX P)Dw#DMHQhNfR^j3qE|>ev4cC]+xSu s7{?cdo7o|5~W`2'w_= Mko&S[۫ g^' !Mi]/Y i ,RaQ-8է r?q`Z }#6 zꚧn[|8K\d=]U&(Il:dD̨R'_]Y]QNS#0k$ϗPY:\I}hr][<k\= cvTJP&vΰ2XC_C#;>yl jǦ1MJyvQ#\' PYFUq#]A P9߃槟N-2a7v}nPT^OϮ)yS&3I&H2¶ӌ+: 5 aۺ%<-S<>b8CZ\X! 6`riN#X!ØGN/0qh~5Xcyg4KPܲџ@#ͣTZ ]lNc-}&ygՔ&> q40LsWr-uZ&0$(5~v3T=i ѓ?9{qrm;G(W δ!> h<;9 y-n0Wp^fo5ZTۣ(iC&[Q&?PKe.(= PK@x4edp/toolbar/Line Comment OutUX P)Dw#D vqu q p rtr Pr qtv ruwЅruPKw57PK@x4'__MACOSX/edp/toolbar/._Line Comment OutUX P)Dw#DVMhA~;IBMmb[t02uD"$䪷pugܿJ MPMQy$Qʹco% #[M 1 DL?ǚ inn'1Yw,xqx"IݷwJzNNSq3!qk˩"b}[Qqakͩg;s(1v$JH_b4>֡tߞ>k.}+,~D2Pנ}BL7f0FJ bn|M~Px쨢erLkr[E|tG&o6C_X+E;ׂ)1 l܄:=C^qW/ w>^Bq;iC8 pނ([a0v9UH|<ޗ|ڐ%bxf <PK;r!PK@x4+edp/toolbar/Multi-File Find Selected StringUX P)Dx#D tqus vququPKyPK@x46__MACOSX/edp/toolbar/._Multi-File Find Selected StringUX P)Dx#DVMlUNǵZ+RWJƉP^ǭq"A#Y4veGA@Gq ^9Uz*N@TPBrBvf}fgͼְ: ubS@̤ɻ$_} Kĝ,"i $6>aA8Ffaظn\Dž.^r!#dЮ1cs &Wߚy_33CB:3ZƞI3=нpsP%9040ځN59-VO/T}qI`?ز谌lqECTU-Mtȋ"j_2iE1%8*#y?1> &vdv?[`BT^qYLF)JbRøV#àU`CM&9 9h^<*KCtjB[cy4\gZ}9ZLn6wII?,*sYH](sq{Aj\?NJڱ1ؼ9$EJIy$|Jk}WS6*_i23NRh;Z `\% u68xٸ$Bl}z m+T?1m-C vwo˥? [ |FDX\#")kk7 KR+cAށ;Q[onֶ9VxԂoln_,o3.+7 7ݿHbziXf+ePK[6*l-?F¤4":kk} wKyߘc̱ҺO M|Y;T(tPKnoU PKx4edp/toolbar/orderUX P)DF0$D N,K K Jny) 9%@FIQf^:VA]Ԋ\rEeż9%n9 XvM+Q/-K2y}2RC2sSs xPKfPKx4__MACOSX/edp/toolbar/._orderUX P)DF0$Dc`cg`b 1N 6b(?$EPK #RPK@x4edp/toolbar/RedoUX P)Dx#D ruPK PK@x4__MACOSX/edp/toolbar/._RedoUX P)Dx#Dc`cg`b 1N 6b(?qkD+=Pi @P[pLE Qx@1(4: Td=?@ -| y&g/)BHk ` b"yCCt="0bNF70M.q FF`kdl(VpZMf5&c`rl`fb~R2d::?P #>a ZǰA8HL op`Gi*$T : KX1 $02g)&I^d}AN}Y\Yhhii$zɇՐ<5U -?$--14_ /,PwI_,Ab/\e<&5pyyOV30ꔀ`ފ"!{Ƌ Pyd`ـ^4/f{ ,2` K!)939ȖS(5Ȃ/V02@A$bƀbގޞ )ɥy% EiPK$(\5 PK@x4edp/toolbar/SaveUX P)Dx#D v sPKq PK@x4__MACOSX/edp/toolbar/._SaveUX P)Dx#DVMhA~3b6-C!UښFXmKͮ f VڋֿzWќD{(RAlk+-^޾y U@W0"Ŵ}Ʈ8 = `GsL;9 !R7f!n.;~A:&f!v 2PcQ# yd[mO(hDY[]EՃ|+ P3';gҗʚ Ɨ 0 2vt-ET-ŧ4EA-6c혯-lF6;]6zk3}+npz kjJB:jn5gF[oꉽ>'ڣLp,k'bS2%7P@#l=ӯagn XOfe s Zx3D=^1?/3˟;\Ir~~7r~|9P~I?Bp)"Mr"̄8mtk> Koue':{Y6 @^rB  pp+8̥_^Z^:9j2mK=.[ϔgaW|p Y%@ՐDv՝[|kJ~jMƷMx[<}-Z$-PKܳU PK@x4edp/toolbar/Time StampUX P)Dw#DRqq q  SPKwVPK@x4!__MACOSX/edp/toolbar/._Time StampUX P)Dw#DVMLA~? xъ6Xict;-fT07D&LsE‘=鑄x%/Ll-C|yg. ^bQ Php4 $D (+I3ݳ_b$۞@[UD5Vik>HbE?uxmVn6y~TKN sXL$:;s :pvvRPxZ[[6WVǷ;)]TijP[yX] @+3^wUj[RKE.8̬/#T]F(y-tfC.:Duѳ6tOn>TDW#($N7ui%}M:x ֬/e\4Y<ꡖKS{‹u,LsЌvL滒0 a֧qj` N1KJ c zpF1p*kQ˚Ud-(, E,6+DsdO0$1,$yD?IANt˖?83e$YwzU~A00Sń yMCCc;P<\őEȒ< r@*PK&[DPK czx4 @Aedp/UX$D#DPKl|4H4} @2edp/.DS_StoreUXP)Dx )DPK |4 @A__MACOSX/UXP)DP)DPK |4 @A__MACOSX/edp/UXP)DP)DPKl|4 #wR @__MACOSX/edp/._.DS_StoreUXP)Dx )DPKx4˻* @dedp/edpUXP)DF0$DPKx4Ҥ @__MACOSX/edp/._edpUXP)DF0$DPK mx4 @A edp/tool/UX)D#DPK8v|4 @ edp/tool/orderUXP)D0)DPK |4 @AP __MACOSX/edp/tool/UXP)DP)DPK8v|4 #R @ __MACOSX/edp/tool/._orderUXP)D0)DPKm|4R @ edp/tool/RunUXP)D ")DPKm|4PQ  @T__MACOSX/edp/tool/._RunUXP)D ")DPK x4 @Aedp/toolbar/UX(D-0$DPK@x4fɄf @4edp/toolbar/Comment OutUXP)Dw#DPK |4 @A__MACOSX/edp/toolbar/UXP)DP)DPK@x4dw" @__MACOSX/edp/toolbar/._Comment OutUXP)Dw#DPK@x4J^I @edp/toolbar/Find Selected StringUXP)Dx#DPK@x4[ć= + @&__MACOSX/edp/toolbar/._Find Selected StringUXP)Dx#DPK@x4Wr~' @B edp/toolbar/Find Selected String - NextUXP)Dx#DPK@x4n7Dz2 @ __MACOSX/edp/toolbar/._Find Selected String - NextUXP)Dx#DPK@x43J+ @s$edp/toolbar/Find Selected String - PreviousUXP)Dx#DPK@x4_UjE 6 @$__MACOSX/edp/toolbar/._Find Selected String - PreviousUXP)Dx#DPK@x4d<  @R(edp/toolbar/IndentUXP)Dw#DPK@x4e.(=  @(__MACOSX/edp/toolbar/._IndentUXP)Dw#DPK@x4w57 @,edp/toolbar/Line Comment OutUXP)Dw#DPK@x4;r!' @,__MACOSX/edp/toolbar/._Line Comment OutUXP)Dw#DPK@x4y+ @/edp/toolbar/Multi-File Find Selected StringUXP)Dx#DPK@x4noU 6 @V0__MACOSX/edp/toolbar/._Multi-File Find Selected StringUXP)Dx#DPKx4f @4edp/toolbar/orderUXP)DF0$DPKx4 #R @T5__MACOSX/edp/toolbar/._orderUXP)DF0$DPK@x4  @5edp/toolbar/RedoUXP)Dx#DPK@x4$(\5  @(6__MACOSX/edp/toolbar/._RedoUXP)Dx#DPK@x4q  @9edp/toolbar/SaveUXP)Dx#DPK@x4ܳU  @v9__MACOSX/edp/toolbar/._SaveUXP)Dx#DPK@x4wV @<edp/toolbar/Time StampUXP)Dw#DPK@x4Ѐk E ! @P=__MACOSX/edp/toolbar/._Time StampUXP)Dw#DPK@x4S g  @@edp/toolbar/UndoUXP)Dx#DPK@x4&[D @&A__MACOSX/edp/toolbar/._UndoUXP)Dx#DPK'' CBfreefem++-3.38-1/NEWS000644 000767 000024 00000000000 11406142255 014271 0ustar00hechtstaff000000 000000 freefem++-3.38-1/README000644 000767 000024 00000034612 12535507042 014475 0ustar00hechtstaff000000 000000 Compilation of FreeFem++ under unix, MacOs X or mingw (Windows) and bamg (mesh generator) ---------------------------------------------------------------- REMARK: after 4/09/2013, in hg version all construct by autoreconf are not on the directly in distribution. -- to rebuild with automake version >= 1.13 autoconf : # autoreconf -i or take the file form the file AutoGeneratedFile.tar.gz # tar zxvf AutoGeneratedFile.tar.gz -- to build a complete version do # ./configure --enable-download -- to get all source downlaod package # download/getall -a -- to test make check -- to install sudo make install New: Test version 3.9 F. Hecht & J. Morice July 2010. Try to downlaod and compile (add --enable-download flags to configure) lot of related sofware, (Please read the licence of all with software, if you use freefee++ for commercial purpose) tetgen superlu fftw metis yams mshmet MUMPS blacs parmetis scalapack scotch superludist MUMPS pastix hypre hips For the link with mmg3d software put the tar.gz archive in .../dowload/pgk directory. Remark, you can alsy copy all the donwload file in ../dowload/pgk if you have not internet connection. Brochet-2:download hecht$ ls -1 pkg/* MBA-de-FH:download hecht$ ls -1 pkg/* pkg/Ipopt-3.10.2.tgz pkg/MUMPS_4.10.0.tar.gz pkg/ParMetis-3.1.1.tar.gz pkg/SuiteSparse-2.4.0.tar.gz pkg/arpack96.tar.gz pkg/blacstester.tgz pkg/fftw-3.2.1.tar.gz pkg/freeyams.2012.02.05.tgz pkg/gmm-4.1.tar.gz pkg/hips-1.2b-rc4.tar.gz pkg/metis-4.0.tar.gz pkg/mmg3d4.0.tgz pkg/mpiblacs-patch03.tgz pkg/mpiblacs.tgz pkg/mshmet.2011.03.06.tgz pkg/nlopt-2.2.4.tar.gz pkg/pARMS_2.2.tar.gz pkg/pastix_release_2200.tar.bz2 pkg/patch.tar.gz pkg/scalapack-1.8.0.tgz pkg/scotch_5.1.6_esmumps.tar.gz pkg/superlu_4.0.tar.gz pkg/superlu_dist_2.3.tar.gz pkg/tetgen1.4.3.tar.gz MBA-de-FH:download hecht$ TO simplify the link and compilation part, I have add 3 files examples++-load/WHERE_LIBRARY examples++-load/WHERE_LIBRARY-download examples++-load/WHERE_LIBRARY-config On my mac I have install gsl with MacPorts MBA-de-FH:~ hecht$ more work/ff++/examples++-load/WHERE_LIBRARY gsl LD -L/opt/local/lib/ -lgsl gsl INCLUDE -I/opt/local/include/ MBA-de-FH:~ hecht$ the files examples++-load/WHERE_LIBRARY-config examples++-load/WHERE_LIBRARY-download are restectively created with ./configure commande , the compilation of all downlaod software. and the examples++-load/Makefile. The use of commande compile with search of include and lib. ../exemples++-load/ff-cc++ -auto MUMPS_FreeFem.cpp compile a do all the link edition for MUMPS freefem++ interface. Brochet-2:examples++-mpi hecht$ make MUMPS_FreeFem.dylib ../examples++-load//ff-c++ -auto MUMPS_FreeFem.cpp .. we just add the 2 lines in MUMPS_FreeFem.cpp //ff-c++-LIBRARY-dep: mumps parmetis ptscotch scalapack blacs blas mpifc fc pthread //ff-c++-cpp-dep: * to today the ide version is currently available you can get from http://www.ann.jussieu.fr/~lehyaric/ffcs/index.htm Old Remark (May be obsolete) * the graphique is now base of Open/Glut lib. * IN CASE of problem under UBUNTU/GLUT (no graphics window tilte: (march 2009) they are a know bug with compiz package so try To disable/enable it graphically, install the compiz-swith package with synatic. Or try this in command line: killall compiz.real && killall compiz && metacity --replace --display :0 & F. Hecht. - For debian, ubuntu, MacOS, Windows see the the prerequisite installed packages before configuration and compilatation. This file details specific configuration details for FreeFem++. For a standard installation, please refer to the file named "INSTALL". annd see the end of this file to have some configure example: Full version 3d need automatic download option ---------------------------------- For a Full 3d version , some external piece of software can by usefull, the simplest wait is to add "--enable-download" to the "./configure" (need of "wget" or "curl" unix command). The download archive are store in : download/pkg/SuiteSparse-2.4.0.tar.gz # umpack download/pkg/arpack96.tar.gz # arpack download/pkg/f2c.tar # f2c if no fortran 77 download/pkg/fftw-3.2.1.tar.gz # fft download/pkg/patch.tar.gz # arpack download/pkg/superlu_3.1.tar.gz # superlu download/pkg/tetgen1.4.2.tar.gz # tetgen download/blas/cblas.tgz # blas if you have not internet access juste copie this files at the same place. Debugging and optimization -------------------------- Without any option, "./configure" selects the best optimization options for the local machine. To produce optimized binaries that can be ported to other machines, add the option "--enable-generic". To produce FreeFem++ programs containing debugging symbols and no optimization, use "--enable-debug". If you need to add specific flags to the ones that ./configure chooses, just define the corresponding automake variable before running configure. For instance, to add flag "-x" to C++ compilations, say: > CXXFLAGS=-x ./configure Other useful configuration variables include: - CFLAGS for C compilation - FFLAGS for Fortran compilation - LIBS libraries for the linking stage - LDFLAGS linking flags - LDADD extra options for the linking stage - F77 the fortran compile (if not fortran is installed see section NOFORTRAN) - FC the fortran 90 compiler - CC the cc compiler - CXX the c++ compiler Linear algebra libraries and eigen value problem ----------------------------------------------- By default, "./configure" looks for the X11, BLAS, ARPACK and UMFPACK, OpenGL, GLUT libraries on the local system. ARPACK is use to compute eigenvalue. and UMFPACK is a new fast sparse linear solver. If configure cannot find the libraries by itself, you can specify the full path to a library file (ending with ".a") or the options use by the linker (ex: "-L/usr/local/lib -lblas") with the following options: --with-blas="blas linker options" --with-arpack="arpack linker options" --with-amd="amd linker options" --with-umfpack="umfpack linker options" Or, if the configuration flag "--enable-download" is specified, the compilation step ("make") will try to download the missing libraries (from their official websites) and compile them. Remark, under linux or window the simplest way to get a not to bad version is ./configure --enable-download Here are the different versions of FreeFem++ produced by one compilation (some versions may be missing if your system does not support them): * FreeFem++: standard version (using X11 graphics on Linux and MacOS 10, Win32 on Windows and MacOS X) (located in src/std) * FreeFem++-nw: without graphics (located in src/nw) * FreeFem++: graphics based on OpenGL (located in src/nw) * ffglut: the graphic tools * FreeFem++-mpi: parallel version, without graphics (located in src/mpi) The compilation procedure (produced with automake) builds all the libraries and executables sequentially. Running "make" in a subdirectory does not rebuild dependencies in other directories. The compilation has been tested under linux and MacOs/Darwin with g++ version 3.3. 4.0 4.4 It take 30 mn to compile all on my PowerBook G4 1Mhz 1024MB. Rebuilding "configure" ------------------------ Developers of FreeFem++ can rebuild the configuration system using Automake and Autoconf with the command: > autoreconf # to reconfigure with the same parameter > ./reconfigure Extra utilities --------------- To run an interactive test of FreeFem++: > make visualcheck To run a speed test: > make speedtest To create the documentation in .ps and .pdf format (in the "DOC" directory): > make documentation Examples -------- All the Examples are in the two directories examples++ and examples++-tutorial. The suffix is .edp ("equations aux derivees partielles" in French) To test all the examples under unix: > cd examples++; ../src/std/FreeFem++ all.edp > cd examples++-tutorial; ../src/std/FreeFem++ all.edp To try the dynamic linking loader example: remark: some adaptation must be done with the suffix probleme (.dll, .so, .dylib ) and directory to seach dynamic lib (shell variable LD_LIBRARY_PATH) warning under Window XP, first install the cygwin environnent (see http://www.cygwin.com) > cd example++-load build a dll file with the following shell script: > ./ff-c++ myfunction.cpp to execute the examples try under window xp FreeFem++-nw load.edp or otherwise ../src/nw/FreeFem++-nw load.edp -- FreeFem++ v1.38 (date Tue Feb 10 12:04:30 CET 2004) file : load.edp Load: lg_fem -- no UMFPACK => replace UMFPACK by LU lg_mesh eigenvalue load "myfunction" lood: myfunction load: dlopen(./myfunction.so) = 0x84be700 1 : mesh Th=square(5,5); 2 : fespace Vh(Th,P1); 3 : Vh uh=myfunction(); // warning do not forget () 4 : cout << uh[].min << " " << uh[].max << endl; 5 : 6 : 7 : sizestack + 1024 =1224 ( 200 ) ----------CheckPtr:-----init execution ------ NbUndelPtr 996 Alloc: 79131 NbPtr 1011 Nb of edges on Mortars = 0 Nb of edges on Boundary = 20, neb = 20 Nb Of Nodes = 36 Nb of DF = 36 0 0.841471 times: compile 0.01s, execution -2.0837e-19s ----------CheckPtr:-----end execution -- ------ NbUndelPtr 996 Alloc: 79131 NbPtr 1048 Bien: On a fini Normalement CheckPtr:Nb of undelete pointer is 995 last 101 CheckPtr:Max Memory used 93.672 kbytes Memory undelete 78619 Note 1: if this does not work, please check the manual page of dlopen for your system. Note 2. Fast fourier exemple ( FFT ) is in dfft.edp file need of fftw3 Some configure flags use to build the current version ----------------------------------------------------- * Under Debian: ( 2008) ---------------- the installed packages + dependance are: gcc g++ g77 libsuitesparse-dev libarpack2-dev libx11-dev libxt-dev libxext-dev patch wget freeglut3-dev - bluid the parallel version openmpi-dev openmpi - to rebuild de documentation: imagemagick tetex-base tetex-bin tetex-extra ./configure make make check (to test de version) make install (under root) * Under Ubuntu (2008) --------------- the installed packages + dependance are: gcc g++ g77 wget m4 bison flex patch libzip-dev libx11-dev libxt-dev libxext-dev libxpm4 libxpm4-dbg libsuitesparse-dev libarpack2-devlibarpack2 libarpack2-dev libfltk1.1 libfltk1.1-dbg libfltk1.1-dev libopenmpi1 libopenmpi-dev libopenmpi-dbg libxpm-dev freeglut3 freeglut3-dev libx11-dev libxt-dev libxext-dev libglut3-dev - bluid the parallel version openmpi-dev openmpi - to rebuild de documentation: imagemagick tetex-base tetex-bin tetex-extra ./configure --enable-download --with-mpi=mpic++ # utility of parameter: # --enable-download : for fft and tetgen ... # --with-mpi=mpic++ : for mpi version make make check (to test de version) make install (under root) * Under Red Hat Enterprise Linux AS release 3: ---------------------------------------------- the following rpm: blas-3.0-20 gcc-3.2.3-53 tetex-1.0.7-67.9 lapack-3.0-20 ImageMagick-5.5.6-15 wget-1.10.2-0.30E curl-7.10.6-7.rhel3 are install ./configure '--enable-download' '--with-blas=-lblas -llapack' * Under MacOs: (2010) snow leopard ------------- 1) intall Apple's Developer Tools from de Apple DVD Warning the default compile is now 64 bits, 2) install g95 fortron (to have a fortran 64 bits by default) install macport from http://www.macports.org/ sudo port install g95 or add flags -m64 to the fortran command (not tested). cd download/f2c make install-10.6 3) recompile openmpi with the use of g95 './configure' 'FC=/opt/local/bin/g95' 'F77=/opt/local/bin/g95' make sudo make install 4) TeXLive-teTeX Current Release in http://www.ctan.org/tex-archive/systems/mac/mactex/ ./configure '-with-suffix=snow-leopard' '--enable-download' 'build_alias=snow-leopard' 'host_alias=snow-leopard' 'target_alias=snow-leopard' 'F77=/opt/local/bin/g95' '-with-mpi=/usr/local/bin/mpic++' '--enable-m64' 'FLIBS=/opt/local/lib/g95/x86_64-apple-darwin10/4.2.4/libf95.a' 'MPIF77=/usr/local/bin/mpif77' 'MPICC=/usr/local/bin/mpicc' 'MPIFC=/usr/local/bin/mpif90' * Under MacOC macIntel ---------------------- 1) install Apple's Developer Tools 2) install do the NOFORTRAN section. 3) install the TexMac for the documentation: http://ctan.org/get/systems/mac/mactex/MacTeX-20071201.dmg # to build a full freefem++ for your Mac: first install g95, and recompile openmpi (little tricky) ./configure '-with-suffix=snow-leopard' '-without-fltk' '--enable-download' 'F77=/opt/local/bin/g95' '-with-mpi=/usr/local/bin/mpic++' '--enable-m64' 'FLIBS=/opt/local/lib/g95/x86_64-apple-darwin10/4.2.4/libf95.a' 'MPIF77=/usr/local/bin/mpif77' 'MPICC=/usr/local/bin/mpicc' 'MPIFC=/usr/local/bin/mpif90' ./configure -without-fltk' '--enable-download' '-with-mpi=mpic++' 'F77=fort77' '--with-flib=-L/usr/local/lib -lf2c' or if you have compile the download/f2c with : (cd download/f2c;make install) ./configure '-with-suffix' 'MacIntel' '--enable-download' '-with-mpi=mpic++' '-enable-download' # to build universal FreeFem++ of 10.4 macOS (ppc , i386): ( cd download/f2c; make -n compile-10.4 install) ./configure '-with-suffix=Universal' '-without-fltk' '--enable-download' 'F77=/Users/hecht/ff/ff-univ/download/bin/fort77' '--with-flib=/Users/hecht/ff/ff-univ/download/lib/libf2c.a' 'CXX=g++-4.0 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -mmacosx-version-min=10.4' 'CC=gcc-4.0 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -mmacosx-version-min=10.4' 'FFLAGS=-Wc,-isysroot,/Developer/SDKs/MacOSX10.4u.sdk,-arch,ppc,-arch,i386,-mmacosx-version-min=10.4' 'CXXCPP=g++ -E' '--disable-dependency-tracking' '--x-libraries=/usr/X11R6/lib/' * Under Windows: ---------------- see the end of README_WINDOW files * NOFORTRAN: ------------ You have not fortran compiler use f2c and the use the script fort77 by the way just do: cd download/f2c # to build and install fort77, linf2c.a in download/bin download/lib make install # to install in /usr/local/ make install-sudo # to build and universal f2c library on MacOS 10.4 and install in /usr/local/bin /usr/local/lib # and in download/bin download/lib download/bin download/include # 32/ 64 bits architecture on intel and ppc make -n install-10.4 for the 64 on intel version 10.6 (SDK) make -n install-10.6 freefem++-3.38-1/README_ARPACK000644 000767 000024 00000001102 11406142255 015477 0ustar00hechtstaff000000 000000 How to adapt ARPACK for compilation with FreeFem++ -------------------------------------------------- the simplest way is just configure --enable-download -------------------------------------------------- Or to compile arpack no problem Remark, in arpack++ a lot of incoherance this moderne c++ (g++3 or better) so I write the driver by hand (from version 3.) no arpack++ in include in freefem++ now. The last one is in lapack lib second.f in an function not a procedure like in arpack. Two weeks work to find this mistake. Frederic Hecht ------------- freefem++-3.38-1/README_MAC000644 000767 000024 00000011425 12500635447 015155 0ustar00hechtstaff000000 000000 To compile a full version of FreeFem++ under MacOS --------------------------------------------------- Under Yosemite (10.10.2) 2015 ( xcode 6.2 form scratch) 1) install xcode do clang to install command line 2) with brew install 499 brew install wget 500 brew install autoconf 501 brew install automake 504 brew install cmake 505 brew install gfortran 506 brew install gcc 540 brew install m4 585 brew install pkg-config 588 brew install gobject-introspection 3) install brew Under Mavericks (10.9) 2012 ( xcode 5.0.2 form scratch) ------------------------------------------------- remark: All line beginning by # are shell command in terminal. 1) install xcode 5.0.2 , and the xcode command line tools xcode install Auxiliary Tools for Xcode (for PackageMaker) 2) install xcode command line (xcode 5.0.2 bug ???? ) # xcode-select --install 2) install gcc-4.9 form http://hpc.sourceforge.net # curl -O http://prdownloads.sourceforge.net/hpc/gfortran-4.9-bin.tar.gz?download # sudo tar zxvf gfortran-4.9-bin.tar.gz -C / 3) autoconf and automake now not in xcode I use the macport distribution form http://www.macports.org # sudo port install autoconfo # sudo port install automake Or with brew tool ... 4) install tex from ctan http://mirrors.ctan.org/systems/mac/mactex/MacTeX.pkg 5) install openmpi form the source http://www.open-mpi.org/software/ompi/v1.6/downloads/openmpi-1.6.5.tar.bz2 # ./configure 'CC=clang' 'CXX=clang++' 'FC=gfortran' 'F77=gfortran' --enable-ltdl-convenience # make # sudo make install 6) install gsl # curl -O http://ftp.gnu.org/gnu/gsl/gsl-1.15.tar.gz # tar zxvf gsl-1.15.tar.gz # cd gsl-1.15. #./configure CC=clang # make # sudo make install 7) install mecurial from the web http://mercurial.selenic.com 8) download # hg clone http://www.freefem.org/ff++/ff++ 9) compilation of freefem++ # cd ff++ # ./configure '-with-suffix=macos-10.9' '-without-fltk' '--enable-download' '--enable-optim' 'MPIRUN=/usr/local/bin/mpirun' '--enable-m64' '--without-x' 'CC=clang' 'CXXFLAGS=-std=c++11' 'CXX=clang++' 'F77=/usr/local/bin/gfortran' 'FC=/usr/local/bin/gfortran' 'MPICXX=/usr/local/bin/mpic++' 'MPICC=/usr/local/bin/mpicc' 'MPIFC=/usr/local/bin/mpif90' 'MPIF77=/usr/local/bin/mpif90' '--enable-maintainer-mode' # make # make # make # sudo make install to bluid the version of 10.8 the version compilation (fev. 2014) ./configure '-with-suffix=macos-10.8' '-without-fltk' '--enable-download' '--enable-optim' 'MPIRUN=/usr/local/bin/mpirun' '--enable-m64' '--without-x' 'CC=clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk' 'CXXFLAGS=-mmacosx-version-min=10.8' 'CXX=clang++ -std=c++11 -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk' 'CFLAGS=-mmacosx-version-min=10.8' 'F77=/usr/local/bin/gfortran' 'FC=/usr/local/bin/gfortran' 'MPICXX=/usr/local/bin/mpic++' 'MPICC=/usr/local/bin/mpicc' 'MPIFC=/usr/local/bin/mpif90' 'MPIF77=/usr/local/bin/mpif90' '--enable-maintainer-mode' ------------ Under Snow Leopard. Jan 2011 The major problem is take a good f90 to compile new // solver like MUMPS. Do the follow instalation process: 0) Install the developper tools form the apple DVD's. 1) get macport for http://www.macports.org/ and installation: sudo port selfupdate sudo port install g95 sudo port install wget 2) get and install mercurial form http://mercurial.selenic.com/ 3) to compile openmpi with fortran interface and install do : wget http://www.open-mpi.org/software/ompi/v1.4/downloads/openmpi-1.4.3.tar.bz2 remark, I have test with version 1.4.1 , but I thing no problem acure with this new version tar zxvf openmpi-1.4.3.tar.bz2 cd openmpi-1.4.3 ./configure FC=/opt/local/bin/g95 F77=/opt/local/bin/g95 sudo make install 4) get Tex/laTex for the documention build form http://www.tug.org/mactex/ and install 5) to get download the last freefem++ version , do hg clone http://www.freefem.org/ff++/ff++ cd ff++ ./configure '-with-suffix=snow-leopard' '--enable-download' 'F77=/opt/local/bin/g95' '-with-mpi=/usr/local/bin/mpic++' '--enable-m64' 'FLIBS=/opt/local/lib/g95/x86_64-apple-darwin10/4.2.4/libf95.a' 'MPIF77=/usr/local/bin/mpif77' 'MPICC=/usr/local/bin/mpicc' 'MPIFC=/usr/local/bin/mpif90' 'MPI_INC_DIR=/usr/local/include' 'MPICXX=/usr/local/bin/mpic++' make make install Good Luck, and if I miss something sorry, try to add missing tools with sudo port install missing-tool like for exemple: sudo port install gnuplot sudo install_name_tool -change /Users/hecht/ff/ff-MacOS-10.9/download/PETSc/petsc-3.5.2/arch-darwin-c-debug/lib/libparmetis.dylib /usr/local/petsc/lib/libparmetis.dylib libpetsc.3.5.dylibfreefem++-3.38-1/README_WINDOWS000644 000767 000024 00000011257 11654251014 015703 0ustar00hechtstaff000000 000000 How to compile FreeFem++ on Microsoft Windows --------------------------------------------- WARNING NOW the window is compile under MINGW (from version 3.11 14/01/2011 FH) So the old dll are incompatible with the new version. ----------------------------------------------------- NEW version with MINGW 32 to have a not to bad FC compiler. ---------------------------------------------------------- 1) Download and install MINGW32 from: http://sunet.dl.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20101030/mingw-get-inst-20101030.exe ` 2) Download un insatll wget for --enable-download in configure http://puzzle.dl.sourceforge.net/project/mingw/mingwPORT/Current%20Releases/wget-1.9.1-mingwPORT.tar.bz2 3) the glut of win32 http://web.cs.wpi.edu/~gogo/courses/mingw/winglut.zip install in .h file in c:\mingw\bin\../lib/gcc/mingw32/4.5.0/../../../../include/GL/glut.h c:\mingw\bin\../lib/gcc/mingw32/4.5.0/../../../../include/GL/gl.h c:\mingw\bin\../lib/gcc/mingw32/4.5.0/../../../../include/GL/glu.h add the glut32.dll in you directory in the 2 directories: $ find /c/MinGW -name glut /c/MinGW/bin/glut32.dll /c/MinGW/lib/glut32.dll 3) the good blas http://www.tacc.utexas.edu/index.php?eID=tx_nawsecuredl&u=0&file=fileadmin/images/GotoBLAS2-1.13_bsd.tar.gz&t=1294842550&hash=638c44fa086136fc2b661b98b52e0ee4 try to compile 4) MPI for // version use HPC Pack 2008 SDK with Service Pack 2 (SP2) 5) inno setup to build instraller: http://www.xs4all.nl/~mlaan2/ispack/isetup-5.4.0.exe 6) GSL for gsl interface the configure argument are: ./configure '--enable-download' 'FC=mingw32-gfortran' 'F77=mingw32-gfortran' 'CC=mingw32-gcc' 'CXX=mingw32-g++' '-with-blas=/home/hecht/blas-x86/libgoto2.dll' 'CXXFLAGS=-I/home/hecht/blas-x86' '--enable-generic' '--with-wget=wget' 'MPIRUN=/c/Program Files/Microsoft HPC Pack 2008 R2/Bin/mpiexec.exe' $ cat examples++-load/WHERE_LIBRARY gsl LD -L'"/c/Program Files (x86)/GSL-1.13"'/lib -lgsl gsl INCLUDE -I'/c/Program Files (x86)/GSL-1.13/include' OLD Version with cygwin: (obsolete comment) -------------------------------------------- 1) Download and install Cygwin from http://www.cygwin.com. Make sure that the development tools Automake, Autoconf and GNU C++ , C , g77, OPENGL, GLUT are installed. 2) Download and extract the FreeFem++ source archive from http://www.freefem.org 3) Open a Cygwin bash shell and follow the instructions from the FreeFem++ INSTALL and README files. Precompiled BLAS libraries -------------------------- Precompiled ATLAS libraries are available at http://www.netlib.org/atlas/archives/windows/. There are several processor type dependant libraries to choose from. If FreeFem++ is configured with the options "--enable-generic" and "--enable-download", it will download the most generic version. Or you can download a more optimized version and specify it to "./configure" with the option "--with-blas=..." (see README). Creating a Windows package -------------------------- To create a Microsoft Windows self-installable package containing FreeFem++ executables, examples and documentation, you need to install "Inno Setup" (http://www.jrsoftware.org/isinfo.php) on your machine first. Then run "make WindowsPackage.iss" and load the file "WindowsPackage.iss" into Inno Setup once you have configured and compiled FreeFem++ (see INSTALL). Inno Setup places the resulting archive in subdirectory "Output". TROUBLE: -------- Infortunatly, all the .exe version without cygwin under mingw do not run under cygwin shell, they run under under the command window NT shell if the mingwm10.dll is in the right place: .exe directory or in 'C:\WINDOW\system32. In version 2.0 BUG in LAPACK with -O optim flag the file ARPACK/LAPACK/dlamch.f symptome: the code loop. correct the Makefile.m4 to inforce the compilation flag REMARK: All the exe and .dll are in src/bin-win32 To build the install program you must get inno Setup 5 sofware http://www.jrsoftware.org/isinfo.php and the the cygwin package tex, pdflatex, ImageMagick , ghostscript make win32 make documentation to build the setup file, use inno setup on file WindowsPackage.iss the setup file is in output directory The configure flag use to build the version ------------------------------------------- for the P4 version, we compile on pentium-m vaio VGN-S2XP with cygwin install http://www.cygwin.com/ with the following package gcc,g++, tetex, wget , f77 , imagemagick ./configure '--enable-optim' '--enable-download' '--with-suffix=P4' for the generic i383 we use ./configure '--enable-download' '--enable-generic' '--enable-optim' '--with-blas=/home/UNIVERSITE/blas/generic-no-cygwin-blas.dll' 'CPPFLAGS=-I/home/UNIVERSITE/blas/' freefem++-3.38-1/reconfigure000755 000767 000024 00000000311 11406142256 016036 0ustar00hechtstaff000000 000000 #!/bin/sh if [ -f ./configure.param ]; then echo ./configure `cat ./configure.param` "$@" echo ./configure `cat ./configure.param` "$@"|sh else echo " sorry not previouly configurate, sorry " fifreefem++-3.38-1/regtests.m4000644 000767 000024 00000002674 11406142256 015720 0ustar00hechtstaff000000 000000 // Regression tests // ---------------- // The tests are checked against reference values by "make check" in // each examples subdirectory // "ref.edp" contains all reference values and may be rebuilt with // "make Ref" // $Id$ // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. NoUseOfWait=true; int verbosityy=verbosity; dnl May write or read a reference file changequote([[,]]) define(REFFILE,"ref.edp") ifdef([[ASSERT]], include REFFILE;, ofstream ref(REFFILE);) dnl $1=file name dnl $2=reference value (if there is one) dnl $3=precision of reference value (if there is one) dnl or minimum absolute variation if $4 is defined dnl $4=maximum absolute variation (if defined) define(ONETEST, [[cout << "--------- file : $1.edp -----------------" << endl; verbosity=verbosityy; { dnl Place the dash first to avoid any confusion with things like "a-z" define([[TESTVAR]],TEST[[]]translit($1,-_,XX)) define([[REFVAR]],REF[[]]translit($1,-_,XX)) include "$1.edp"; ifelse($2,,, [[real TESTVAR=$2; ifdef([[ASSERT]], cout<<"$1 reference value = "<&1 |grep mpich |wc -l` host=`hostname` echo $host>machinefile echo $host>>machinefile if [ $mpich -ne 0 ] ; then dotest "${MPIRUN} -np $nprocs -machinefile machinefile ${PROGLOC}/mpi/FreeFem++-mpi${EXEEXT}" mpi $script else [[ -f "$(which lamboot 2>/dev/null)" ]] && lamboot dotest "${MPIRUN} -np $nprocs ${PROGLOC}/mpi/FreeFem++-mpi${EXEEXT}" mpi $script fi fi if test "${IDEPROG}" != "" -a "${VISUALCHECK}" = "yes" then dotest ${PROGLOC}/ide/FreeFem++-cs${EXEEXT} ide $script fi freefem++-3.38-1/src/000755 000767 000024 00000000000 12544247070 014400 5ustar00hechtstaff000000 000000 freefem++-3.38-1/test-driver000755 000767 000024 00000010277 12426117526 016017 0ustar00hechtstaff000000 000000 #! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: freefem++-3.38-1/test-driver-ff000755 000767 000024 00000010104 12163103142 016360 0ustar00hechtstaff000000 000000 #!/bin/sh # test-driver-ff from test-driver - basic testsuite driver script. # modif F. Hecht UPMC. scriptversion=2013-06-27.18; # UTC # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=77 else do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' trap "st=129; $do_exit" 1 trap "st=130; $do_exit" 2 trap "st=141; $do_exit" 13 trap "st=143; $do_exit" 15 # Test script is run here. ${TEST_FFPP} ${FLAGS_FFPP} "$@" >$log_file 2>&1 estatus=$? fi if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$grn res=PASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: freefem++-3.38-1/TODO000644 000767 000024 00000001257 12263472400 014301 0ustar00hechtstaff000000 000000 add doc: gsl interface imax of tableau Short time: build a true aniso 3d adaptation example to day bug in interface of mmg3d with metric and in tetgen ... long time: Add Finite Volume interface. Track: add the sup of a function on a mesh real uinfty=sup(Th,abs(f)); real uhinfty=sup(uh); Newton algorithm. automatique scheme for time depend problem: dt(u) or u_t implicite: problem a(u,v, sheme=Euler , dt = 0.1, tinit = 0, tfinal = 10 , previous=[u1]) = int2d( u_t*v + dx(u)*dx(v)+dy(u)*dy(v) ) ; explicit: problem a(u,v, sheme=thetaScheme(0.5) , dt = 0.1 , tinit = 0 , tfinal = 10 , previous=[u1]) = int2d( u_t*v) + int(dx(u1)*dx(v)+dy(u1)*dy(v)) ; freefem++-3.38-1/uninstall-ff++000755 000767 000024 00000001715 12304712565 016273 0ustar00hechtstaff000000 000000 echo rm /usr/local/bin/FreeFem++ /usr/local/bin/bamg /usr/local/bin/ff-mpirun echo rm /usr/local/bin/FreeFem++-CoCoa /usr/local/bin/cvmsh2 /usr/local/bin/ff-pkg-download echo rm /usr/local/bin/FreeFem++-mpi /usr/local/bin/ff-c++ /usr/local/bin/ffglut echo rm /usr/local/bin/FreeFem++-nw /usr/local/bin/ff-get-dep /usr/local/bin/ffmedit echo rm -rf /usr/local/share/freefem++ echo rm -rf /usr/local/lib/ff++/ if [ -d /Applications/FreeFem++.app ]; then echo rm -rf /Applications/FreeFem++.app fi rm /usr/local/bin/FreeFem++ /usr/local/bin/bamg /usr/local/bin/ff-mpirun rm /usr/local/bin/FreeFem++-CoCoa /usr/local/bin/cvmsh2 /usr/local/bin/ff-pkg-download rm /usr/local/bin/FreeFem++-mpi /usr/local/bin/ff-c++ /usr/local/bin/ffglut rm /usr/local/bin/FreeFem++-nw /usr/local/bin/ff-get-dep /usr/local/bin/ffmedit rm -rf /usr/local/share/freefem++ rm -rf /usr/local/lib/ff++/ if [ -d /Applications/FreeFem++.app ]; then rm -rf /Applications/FreeFem++.app fi freefem++-3.38-1/WHERE_LIBRARY-mkl000644 000767 000024 00000000645 11475255160 016361 0ustar00hechtstaff000000 000000 blas LD '-L@MKLDIR@/lib/@MKL_ARCH@ -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lm -lpthread ' blas INCLUDE '-I@MKLDIR@/include' lapack LD '-L@MKLDIR@/lib/@MKL_ARCH@ -llibmkl_lapack' lapack INCLUDE '-I@MKLDIR@/include' scalapack LD '-L@MKLDIR@/lib/@MKL_ARCH@ -lmkl_scalapack_lp64' scalapack INCLUDE '-I@MKLDIR@/include' blacs LD '-L@MKLDIR@/lib/@MKL_ARCH@ -lmkl_blacs_lp64' blacs INCLUDE '-I@MKLDIR@/include' freefem++-3.38-1/WindowsPackage.m4000644 000767 000024 00000015465 12473166322 016775 0ustar00hechtstaff000000 000000 ; Creating a FreeFem++ package for Microsoft Windows with Inno Setup ; $Id$ ; The Inno Setup configuration file WindowsPackage.iss is built from ; WindowsPackage.m4 with the command "make WindowsPackage.iss". ; No source file here. They are in the source tar ball. ; suppress -cs version no fltk to day , wait the next version ; FH version 3.0-1 [Setup] AppName=FreeFem++-VERSION AppVerName=FreeFem++ version VERSION DefaultDirName={pf}\FreeFem++ DefaultGroupName=FreeFem++ Compression=lzma SolidCompression=yes ChangesAssociations=yes OutputBaseFilename=FreeFem++-VERSION ChangesEnvironment=yes [Files] ; README Source: "README"; DestDir: "{app}" Source: "README_WINDOWS"; DestDir: "{app}" Source: "INNOVATION"; DestDir: "{app}" Source: "AUTHORS"; DestDir: "{app}" Source: "BUGS"; DestDir: "{app}" Source: "COPYRIGHT"; DestDir: "{app}" Source: "COPYING"; DestDir: "{app}" Source: "README"; DestDir: "{app}" Source: "crimson-freefem++.zip"; DestDir: "{app}" Source: "0ldUserReadMe.txt"; DestDir: "{app}" ; Programs Source: "src\bin-win32\FreeFem++.exe"; DestDir: "{app}" ifelse(len(MPIPROG),0,; ,)Source: "src\bin-win32\FreeFem++-mpi.exe"; DestDir: "{app}" ifelse(len(MPIPROG),0,; ,)Source: "src\mpi\ff-mpirun"; DestDir: "{app}" Source: "src\bin-win32\launchff++.exe"; DestDir: "{app}" ; to day the dll version do not works so we use the static one (FH) ;Source: "src\bin-win32\FreeFem++-cs.exe"; DestDir: "{app}" ;Source: "src\ide\FreeFem++-cs.exe"; DestDir: "{app}" Source: "src\nw\ffglut.exe"; DestDir: "{app}" Source: "src\medit\ffmedit.exe"; DestDir: "{app}" Source: "src\bin-win32\FreeFem++-nw.exe"; DestDir: "{app}" Source: "src\bin-win32\bamg.exe"; DestDir: "{app}" Source: "src\bin-win32\cvmsh2.exe"; DestDir: "{app}" ; Source: "src\bin-win32\drawbdmesh.exe"; DestDir: "{app}" Source: "src\bin-win32\*.dll"; DestDir: "{app}" Source: "examples++-load\ff-c++"; DestDir: "{app}" ; mingwm10.dll is necessary when "-mthreads" is used as a compilation ; flag. Source: "C:\MinGW\bin\mingwm10.dll"; DestDir: "{app}" ; Source: "C:\Cygwin\bin\glut32.dll"; DestDir: "{app}" Source: "C:\MinGW\msys\1.0\bin\freeglut.dll"; DestDir: "{app}" Source: "C:\MinGW\bin\pthreadGC2.dll"; DestDir: "{app}" Source: "C:\MinGW\bin\libgcc_s_dw2-1.dll"; DestDir: "{app}" Source: "C:\MinGW\bin\libstdc++-6.dll"; DestDir: "{app}" Source: "C:\MinGW\bin\libgfortran-3.dll"; DestDir: "{app}" Source: "C:\MinGW\bin\libquadmath-0.dll"; DestDir: "{app}" ; Does not include FreeFem++-x11 which would need the Cygwin X-Server ; Does not include FreeFem++-glx which would need the Cygwin X-Server ; Examples Source: "examples++\*.edp"; DestDir: "{app}\examples++" Source: "examples++-eigen\*.edp"; DestDir: "{app}\examples++-eigen" Source: "examples++-tutorial\*.edp"; DestDir: "{app}\examples++-tutorial" Source: "examples++-tutorial\*.idp"; DestDir: "{app}\examples++-tutorial" Source: "examples++-tutorial\aile.msh"; DestDir: "{app}\examples++-tutorial" Source: "examples++-tutorial\xyf"; DestDir: "{app}\examples++-tutorial" Source: "examples++-chapt3\*.edp"; DestDir: "{app}\examples++-chapt3" Source: "examples++-other\*.edp"; DestDir: "{app}\examples++-other" Source: "examples++-load\*.edp"; DestDir: "{app}\examples++-load" Source: "examples++-load\*.idp"; DestDir: "{app}\examples++-load" Source: "examples++-load\*.cpp"; DestDir: "{app}\examples++-load" Source: "examples++-load\*.pgm"; DestDir: "{app}\examples++-load" Source: "examples++-load\*.pts"; DestDir: "{app}\examples++-load" Source: "examples++-load\cube.msh"; DestDir: "{app}\examples++-load" Source: "examples++-load\load.link"; DestDir: "{app}\examples++-load" Source: "examples++-load\include-tmp\*"; DestDir: "{app}\examples++-load\include" Source: "examples++-3d\*.edp"; DestDir: "{app}\examples++-3d" Source: "examples++-3d\dodecaedre01.mesh"; DestDir: "{app}\examples++-3d" Source: "examples++-3d\lac-leman-v4.msh"; DestDir: "{app}\examples++-3d" Source: "examples++-3d\*.idp"; DestDir: "{app}\examples++-3d" ifelse(len(MPIPROG),0,; ,)Source: "examples++-mpi\*.idp"; DestDir: "{app}\examples++-mpi" ifelse(len(MPIPROG),0,; ,)Source: "examples++-mpi\ff*.txt"; DestDir: "{app}\examples++-mpi" ifelse(len(MPIPROG),0,; ,)Source: "examples++-mpi\*.edp"; DestDir: "{app}\examples++-mpi" Source: "0ldUserReadMe.txt"; DestDir: "{app}\examples++-load" Source: "0ldUserReadMe.txt"; DestDir: "{app}\examples++-tutorial" Source: "0ldUserReadMe.txt"; DestDir: "{app}\examples++-chapt3" Source: "0ldUserReadMe.txt"; DestDir: "{app}\examples++" Source: "0ldUserReadMe.txt"; DestDir: "{app}\examples++-eigen" ; Documentation files may need to be copied from another machine if ; Cygwin refuses to build them. Source: "DOC\freefem++doc.pdf"; DestDir: "{app}" ; Icons for Windows can be created from a 32x32 image with icotool ; (Linux Debian unstable), or IrfanView (Windows, not very good ; results) or paint (Windows, save in .bmp then rename to .ico). Source: "logo.ico"; DestDir: "{app}" [Icons] ; Menu Name: "{group}\FreeFem++"; Filename: "{app}\launchff++.exe"; IconFilename: "{app}\logo.ico" ;Name: "{group}\FreeFem++ GUI"; Filename: "{app}\FreeFem++-cs.exe" Name: "{group}\PDF manual"; Filename: "{app}\freefem++doc.pdf" Name: "{group}\Examples\Tutorial"; Filename: "{app}\examples++-tutorial" Name: "{group}\Examples\chapt3"; Filename: "{app}\examples++-chapt3" Name: "{group}\Examples\load"; Filename: "{app}\examples++-load" Name: "{group}\Examples\Main"; Filename: "{app}\examples++" Name: "{group}\Examples\Eigenvalues"; Filename: "{app}\examples++-eigen" Name: "{group}\Examples\3d"; Filename: "{app}\examples++-3d" ifelse(len(MPIPROG),0,; ,)Name: "{group}\Examples\mpi"; Filename: "{app}\examples++-mpi" Name: "{group}\Uninstall FreeFem++ VERSION"; Filename: "{uninstallexe}" ; Desktop Name: "{userdesktop}\FreeFem++ VERSION"; Filename: "{app}\launchff++.exe"; IconFilename: "{app}\logo.ico" ;Name: "{userdesktop}\FreeFem++ VERSION GUI"; Filename: "{app}\FreeFem++-cs.exe" Name: "{userdesktop}\FreeFem++ VERSION Examples"; Filename: "{group}\Examples" [Registry] ; Link .edp file extension to FreeFem++ Root: HKCR; Subkey: ".edp"; ValueType: string; ValueName: ""; ValueData: "FreeFemVERSIONScript"; Flags: uninsdeletevalue Root: HKCR; Subkey: "FreeFemVERSIONScript"; ValueType: string; ValueName: ""; ValueData: "FreeFem++ Script"; Flags: uninsdeletekey Root: HKCR; Subkey: "FreeFemVERSIONScript\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\logo.ico" Root: HKCR; Subkey: "FreeFemVERSIONScript\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\launchff++.exe"" ""%1""" [Tasks] Name: modifypath; Description: &Add application directory to your system path (if missing you can have trouble with on-the-fly graphic ) ; Flags: checkedonce ; unchecked [Code] function ModPathDir(): TArrayOfString; var Dir: TArrayOfString; begin setArrayLength(Dir, 1) Dir[0] := ExpandConstant('{app}'); Result := Dir; end; #include "modpath.iss" freefem++-3.38-1/ylwrap000755 000767 000024 00000007644 11406142256 015064 0ustar00hechtstaff000000 000000 #! /bin/sh # ylwrap - wrapper for lex/yacc invocations. # Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Usage: # ylwrap INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... # * INPUT is the input file # * OUTPUT is file PROG generates # * DESIRED is file we actually want # * PROGRAM is program to run # * ARGS are passed to PROG # Any number of OUTPUT,DESIRED pairs may be used. # The input. input="$1" shift case "$input" in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input="`pwd`/$input" ;; esac # The directory holding the input. input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` # Quote $INPUT_DIR so we can use it in a regexp. # FIXME: really we should care about more than `.' and `\'. input_rx=`echo "$input_dir" | sed -e 's,\\\\,\\\\\\\\,g' -e 's,\\.,\\\\.,g'` echo "got $input_rx" pairlist= while test "$#" -ne 0; do if test "$1" = "--"; then shift break fi pairlist="$pairlist $1" shift done # The program to run. prog="$1" shift # Make any relative path in $prog absolute. case "$prog" in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog="`pwd`/$prog" ;; esac # FIXME: add hostname here for parallel makes that run commands on # other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 mkdir $dirname || exit 1 cd $dirname $prog ${1+"$@"} "$input" status=$? if test $status -eq 0; then set X $pairlist shift first=yes # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot="no" if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot="yes" fi while test "$#" -ne 0; do from="$1" # Handle y_tab.c and y_tab.h output by DOS if test $y_tab_nodot = "yes"; then if test $from = "y.tab.c"; then from="y_tab.c" else if test $from = "y.tab.h"; then from="y_tab.h" fi fi fi if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend `../'. case "$2" in [\\/]* | ?:[\\/]*) target="$2";; *) target="../$2";; esac # Edit out `#line' or `#' directives. We don't want the # resulting debug information to point at an absolute srcdir; # it is better for it to just mention the .y file with no # path. sed -e "/^#/ s,$input_rx,," "$from" > "$target" || status=$? else # A missing file is only an error for the first file. This # is a blatant hack to let us support using "yacc -d". If -d # is not specified, we don't want an error when the header # file is "missing". if test $first = yes; then status=1 fi fi shift shift first=no done else status=$? fi # Remove the directory. cd .. rm -rf $dirname exit $status freefem++-3.38-1/src/Algo/000755 000767 000024 00000000000 12544247067 015270 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/bamg/000755 000767 000024 00000000000 12544247067 015314 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/bamglib/000755 000767 000024 00000000000 12544247066 016002 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/bin-win32/000755 000767 000024 00000000000 12544247070 016110 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/Carbon.r000755 000767 000024 00000000541 11406142256 015766 0ustar00hechtstaff000000 000000 /* * Permit this Carbon application to launch on OS X * * 1997-2000 Metrowerks Corp. * * Questions and comments to: * * */ /*----------------------------carb Carbon on OS X launch information --------------------------*/ type 'carb' { }; resource 'carb'(0) { };freefem++-3.38-1/src/depcomp000755 000767 000024 00000033052 11406142256 015754 0ustar00hechtstaff000000 000000 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 freefem++-3.38-1/src/Eigen/000755 000767 000024 00000000000 12544247067 015435 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/femlib/000755 000767 000024 00000000000 12544247067 015644 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/fflib/000755 000767 000024 00000000000 12544247067 015470 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/FreeFem++-CoCoa000755 000767 000024 00000001655 11406142256 016752 0ustar00hechtstaff000000 000000 #!/bin/sh # # EXTENSIONS : ".edp" # Accepted file extentions # OSTYPES : "****" # Accepted file types # ROLE : None # Role (Editor, Viewer, None) # SERVICEMENU : FreeFem++ # Name of Service menu item # dir=`dirname $0`; ff="/usr/local/bin/FreeFem++" q="'" end="exit;" begin="cd $PWD;" # begin the cmd generation ---------- cmd="" # ----------------- for i in "$@"; do d=`dirname "$i"`; f=`basename "$i"`; cmd="$cmd cd $q$d$q; $ff $q$f$q;" done # ------------------ if [ -z "$cmd" ]; then cmd="$ff;" fi # ------------------ cmd="$cmd" # ---- end of cmd generation ---- echo 'do script "'$cmd'"' # # # send the command $cmd to the apple terminal via osascript # # (echo $0;echo $*;echo "--$TERM--";printenv;set) >/tmp/tutu if [ -z "$TERM_PROGRAM" ] ; then echo ' tell application "Terminal" activate try do script "'$begin$cmd$end'" end try end tell ' | osascript else set -e eval $cmd fi; freefem++-3.38-1/src/Graphics/000755 000767 000024 00000000000 12544247067 016146 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/lglib/000755 000767 000024 00000000000 12544247067 015477 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/libMesh/000755 000767 000024 00000000000 12544247066 015770 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/Makefile.am000644 000767 000024 00000001321 12140717645 016433 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ SUBDIRS=libMesh bamglib femlib Graphics Algo lglib fflib \ nw mpi bamg medit bin-win32 EXTRA_DIST=FreeFem++-CoCoa Carbon.r \ solver/MUMPS_FreeFem.cpp \ solver/README_COMPILE \ solver/complex_SuperLU_DIST_FreeFem.cpp \ solver/complex_pastix_FreeFem.cpp \ solver/ffsuperludistoption.hpp \ solver/hips_FreeFem.cpp \ solver/hypre_FreeFem.cpp \ solver/makefile \ solver/makefile-common.inc \ solver/makefile-sparsesolver.inc \ solver/parms_FreeFem.cpp \ solver/real_SuperLU_DIST_FreeFem.cpp \ solver/real_pastix_FreeFem.cpp \ solver/wrapper_dotblas.c \ solver/wrapper_dotblas.f \ solver/wrapper_dotblas1.c \ solver/wrapper_dotblas1.f freefem++-3.38-1/src/Makefile.in000644 000767 000024 00000056550 12543260337 016460 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = libMesh bamglib femlib Graphics Algo lglib fflib \ nw mpi bamg medit bin-win32 EXTRA_DIST = FreeFem++-CoCoa Carbon.r \ solver/MUMPS_FreeFem.cpp \ solver/README_COMPILE \ solver/complex_SuperLU_DIST_FreeFem.cpp \ solver/complex_pastix_FreeFem.cpp \ solver/ffsuperludistoption.hpp \ solver/hips_FreeFem.cpp \ solver/hypre_FreeFem.cpp \ solver/makefile \ solver/makefile-common.inc \ solver/makefile-sparsesolver.inc \ solver/parms_FreeFem.cpp \ solver/real_SuperLU_DIST_FreeFem.cpp \ solver/real_pastix_FreeFem.cpp \ solver/wrapper_dotblas.c \ solver/wrapper_dotblas.f \ solver/wrapper_dotblas1.c \ solver/wrapper_dotblas1.f all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/medit/000755 000767 000024 00000000000 12544247070 015502 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/mpi/000755 000767 000024 00000000000 12544247067 015173 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/nw/000755 000767 000024 00000000000 12544247067 015032 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/solver/000755 000767 000024 00000000000 12544247066 015717 5ustar00hechtstaff000000 000000 freefem++-3.38-1/src/solver/complex_pastix_FreeFem.cpp000644 000767 000024 00000052121 11406226636 023050 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* Interface entre freefem++ et pastix */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include #include #include #include #include #include #include #include #include // #include // #include // #include // #include // //#include // #include // #include // #include // #include "mpi.h" // #include // #include "pastix.h" // #include "cscd_utils.h" // #include "read_matrix.h" #include #ifdef __cplusplus extern "C" { #endif #include "pastix.h" #include "cscd_utils.h" #ifdef __cplusplus } #endif //#include "read_matrix.h" #undef memFree_null #define memFree_null(x) {if (x ==NULL) {fprintf(stdout,"%s:%d freeing NULL\n",__FILE__,__LINE__);} free(x); x=NULL;} #define STR_SIZE 256 static pastix_int_t * pastixint(int * ii){ return (pastix_int_t*) (void *) ii;} static pastix_float_t * pastixfloat(Complex * ii){ return (pastix_float_t*) (void *) ii;} typedef struct pastix_param { pastix_data_t *pastix_data; /*Pointer used by PaStiX to keep information alive between calls */ MPI_Comm comm; /* Communicator used by PaStiX */ pastix_int_t Ncol; /* Size of the Matrix */ pastix_int_t *ia; /* Index of first element of each column in ja and avals */ pastix_int_t *ja; /* Rows of the unknows of the matrix */ pastix_float_t *avals; /* Values of the matrix */ pastix_int_t *perm; /* Permutation used for re-numbering of the unknowns */ pastix_int_t *invp; /* Inverse permutation */ pastix_float_t *rhs; /* Right hand side */ pastix_int_t *iparm; /* Integer parameters */ double *dparm; /* Floating parameters */ } pastix_param_t; void Morse_to_CSC(int m, int n, int nnz, Complex *a, int *colind, int *rowptr, pastix_float_t **at, pastix_int_t **rowind, pastix_int_t **colptr) { register int i, j, col, relpos; pastix_int_t *marker; /* Allocate storage for another copy of the matrix. */ *at = (pastix_float_t *) malloc(sizeof(pastix_float_t)*nnz); *rowind = (pastix_int_t *) malloc(sizeof(pastix_int_t)*nnz); *colptr = (pastix_int_t *) malloc(sizeof(pastix_int_t)*(n+1)); marker = (pastix_int_t *) malloc(sizeof(pastix_int_t)*n); for (i = 0; i < n; ++i) marker[i] = 0; /* Get counts of each column of A, and set up column pointers */ for (i = 0; i < m; ++i) for (j = rowptr[i]; j < rowptr[i+1]; ++j) ++marker[colind[j]]; (*colptr)[0] = 0; for (j = 0; j < n; ++j) { (*colptr)[j+1] = (*colptr)[j] + marker[j]; marker[j] = (*colptr)[j]; } /* Transfer the matrix into the compressed column storage. */ for (i = 0; i < m; ++i) { for (j = rowptr[i]; j < rowptr[i+1]; ++j) { col = colind[j]; relpos = marker[col]; (*rowind)[relpos] = i; (*at)[relpos] = a[j]; ++marker[col]; } } free(marker); } static const int MAX_CHAR_PER_LINE=256; //void read_datafile_pastixff(const string &datafile, pastix_int_t *iparmtab, double *dparmtab){ void read_datafile_pastixff(const string &datafile, int &mpi_flag, pastix_int_t *iparmtab, double *dparmtab){ FILE* m_File; int i = 0; char szbuff[MAX_CHAR_PER_LINE]; char* token; char filename[datafile.size()+1]; strcpy( filename, datafile.c_str()); m_File = fopen(filename,"rt"); if(!m_File) { printf("error in reading filename %s\n",&filename); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"matrix") == 0) ){ printf("freefem++: error in reading matrix parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading matrix parameter for pastix \n"); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if(strcmp(token,"assembled") == 0) mpi_flag = 0; else if(strcmp(token,"distributedglobal") == 0) mpi_flag = 1; else if(strcmp(token,"distributed") == 0) mpi_flag = 2; else{ printf("value of parameter matrix is not correct %s \n", token ); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"iparm") == 0) ){ printf("freefem++: error in reading iparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading iparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); iparmtab[i] = (pastix_int_t)atol(token); i++; } i=0; fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"dparm") == 0) ){ printf("freefem++: error in reading dparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading dparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); dparmtab[i] = atof(token); i++; } fclose(m_File); #ifdef OOC /* if (iparmtab[IPARM_OOC_THREAD] > 1) */ iparmtab[IPARM_OOC_THREAD] = 1; #endif /* On empeche le 2d avec NUMA_ALLOC */ #ifdef NUMA_ALLOC if (iparmtab[IPARM_DISTRIBUTION_LEVEL] != 0) { errorPrint("2D not available with NUMA allocation\n"); exit(-1); } #endif } // ATTENTION :: pastix_float_t // peut tre soit un complex ou un reel cela depend de la maniere dont on a compiler pastix // CAS COMPLEX SEULEMENT class zSolvepastixmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 int paraoption; int myid, mpi_size; int Nrow; int mpi_flag; int init_raff; int thrd_flag; int SYM; string data_option; mutable pastix_int_t iparm[64]; mutable double dparm[64]; mutable pastix_int_t Ncol; mutable pastix_int_t *ia; mutable pastix_int_t *ja; mutable pastix_float_t *avals; mutable pastix_int_t *loc2glob; //char *Type = NULL; //char *RhsType = NULL; mutable pastix_float_t *rhs; mutable pastix_int_t *perm; mutable pastix_int_t *invp; mutable pastix_data_t *pastix_data; public: zSolvepastixmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN &pperm_c) : eps(epsilon),epsr(0), tgv(ttgv),tol_pivot_sym(pivot_sym),tol_pivot(pivot), data_option(datafile) { //KN_ param_int(pparam_int); //KN_ param_double(pparam_double); //int m; //int ierr; struct timeval tv1, tv2; int nnz; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); ia = NULL; ja = NULL; avals = NULL; loc2glob = NULL; rhs = NULL; pastix_data = NULL; // matrix assembled on host MPI_Comm_rank(MPI_COMM_WORLD, &myid); printf("- Rang MPI : %d\n", myid); MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); // SYMETRIQUE // MPI_flag need to unselect for non distributed matrix mpi_flag = 0; thrd_flag = 0; // ###################### //pastix_int_t init_raff; fprintf(stdout,"-- INIT PARAMETERS --\n"); // reading iparm from array if(!data_option.empty()){ read_datafile_pastixff(data_option,mpi_flag,iparm,dparm); if(mpi_flag != 0) cerr << "ERROR :: GLOBAT INPUT MATRIX FOR ALL PROCS matrix=assembled" << endl; } else if( !(param_int==NULL) || !(param_double==NULL)){ if( ! (param_int==NULL) ) { cout << "internal param_int" << endl; assert(param_int.N() == 64); for(int ii=0; ii<64; ii++) iparm[ii] = param_int[ii]; iparm[IPARM_MODIFY_PARAMETER] = API_YES; } if( !(param_double==NULL) ) { cout << "internal param_double" << endl; assert(param_double.N() == 64); for(int ii=0; ii<64; ii++) dparm[ii] = param_double[ii]; } } else{ iparm[IPARM_MODIFY_PARAMETER] = API_NO; cout << "initialize default parameter" << endl; } //################################ if(myid == 0){ Ncol = AA.m; Nrow = AA.n; nnz = AA.nbcoef; // Avant : on ecrit la transpose // AA.cl : indices des colonnes // AA.lg : pointeurs des lignes Morse_to_CSC( AA.n , AA.m, AA.nbcoef, AA.a, AA.cl, AA.lg, &avals, &ja, &ia); // ia : pointeurs des colonnes // ja : indices des lignes cout << "AA.n= "<< AA.n << " AA.m=" << AA.m << " AA.nbcoef=" << AA.nbcoef << endl; for(int ii=0; ii < Ncol+1; ii++){ ia[ii] = ia[ii]+1; } assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++){ ja[ii] = ja[ii]+1; } MPI_Bcast( &Ncol, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &Nrow, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &nnz, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, MPI_COMM_WORLD ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); } else{ MPI_Bcast( &Ncol, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &Nrow, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &nnz, 1, MPI_INT, 0, MPI_COMM_WORLD ); avals = (pastix_float_t *) malloc( nnz*sizeof(pastix_float_t) ); ia = (pastix_int_t *) malloc( (Ncol+1)*sizeof(pastix_int_t) ); ja = (pastix_int_t *) malloc( nnz*sizeof(pastix_int_t) ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, MPI_COMM_WORLD ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); } perm = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); invp = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); rhs = (pastix_float_t *) malloc(Ncol*sizeof(pastix_float_t)); // reading permutation given by the user if(pperm_r) for(int ii=0; ii < Ncol; ii++) perm[ii] = pperm_r[ii]; if(pperm_c) for(int ii=0; ii < Ncol; ii++) invp[ii] = pperm_c[ii]; iparm[IPARM_START_TASK] = API_TASK_INIT; iparm[IPARM_END_TASK] = API_TASK_INIT; iparm[IPARM_SYM] = API_SYM_NO; // Matrix is considered nonsymetric if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; fprintf(stdout,"-- FIN INIT PARAMETERS --\n"); init_raff = iparm[IPARM_ITERMAX]; cout << "init_raff=" << init_raff << endl; fflush(stdout); /* Passage en mode verbose */ iparm[IPARM_RHS_MAKING] = API_RHS_B; if( (param_int==NULL) && data_option.empty() ){ iparm[IPARM_MATRIX_VERIFICATION] = API_YES; iparm[IPARM_REFINEMENT] = API_RAF_GMRES; iparm[IPARM_INCOMPLETE] = API_NO; } if( (param_double==NULL) && data_option.empty()){ dparm[DPARM_EPSILON_REFINEMENT] = 1e-12; dparm[DPARM_EPSILON_MAGN_CTRL] = 1e-32; } // cscd_checksym(Ncol, ia, ja, loc2glob, MPI_COMM_WORLD); // if (iparm[IPARM_SYM]==API_SYM_YES) // { // /* Symetric problem */ // /* Build non oriented graph */ // /* build non symmetric csc from symmetric csc */ // /*maillage global*/ // INT *tmpia; // INT *tmpja; // INT tmpn; // cscd_symgraph_int(*n2, *col2, *row2 , NULL, // &tmpn, &tmpia, &tmpja, NULL, // *loc2glob2, pastix_comm, API_YES); // memFree_null(*col2); // *col2 = tmpia; // memFree_null(*row2); // *row2 = tmpja; // *n2 = tmpn; // } SYM = AA.symetrique; cout << "SYM = "<< SYM << endl; // SYMETRIQUE if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } /* Scotch */ fprintf(stdout,"-- Scotch --\n"); fflush(stdout); iparm[IPARM_START_TASK] = API_TASK_ORDERING; iparm[IPARM_END_TASK] = API_TASK_ORDERING; if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; iparm[IPARM_SYM] = API_SYM_NO; /* Fax */ fprintf(stdout,"-- Fax --\n"); iparm[IPARM_START_TASK] = API_TASK_SYMBFACT; iparm[IPARM_END_TASK] = API_TASK_SYMBFACT; if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Blend */ fprintf(stdout,"-- Blend --\n"); iparm[IPARM_START_TASK] = API_TASK_ANALYSE; iparm[IPARM_END_TASK] = API_TASK_ANALYSE; if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Factorisation */ iparm[IPARM_START_TASK] = API_TASK_NUMFACT; iparm[IPARM_END_TASK] = API_TASK_NUMFACT; gettimeofday(&tv1, NULL); fprintf(stdout,"-- SOPALIN --\n"); if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call factorization : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; //for(int ii=0; ii < ia[Ncol]-1; ii++) // ja[ii] = ja[ii]-1; if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " pastix : time factorization :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { struct timeval tv1, tv2; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); // index for pastix for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]+1; for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]+1; // give value of the second member for(int ii=0; ii < Ncol; ii++){ rhs[ii] = b[ii]; } //fprintf(stdout,"SOLVE STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* updo */ iparm[IPARM_START_TASK] = API_TASK_SOLVE; iparm[IPARM_END_TASK] = API_TASK_SOLVE; iparm[IPARM_RHS_MAKING] = API_RHS_B; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call updown : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); if(verbosity > 1) for(int jj=0; jj < Ncol; jj++) cout << "rhs["<< jj << "]=" << rhs[jj] << endl; //fprintf(stdout,"RAFF STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* raff */ iparm[IPARM_START_TASK] = API_TASK_REFINE; iparm[IPARM_END_TASK] = API_TASK_REFINE; iparm[IPARM_RHS_MAKING] = API_RHS_B; iparm[IPARM_ITERMAX] = init_raff; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call refinement : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < Ncol; ii++) x[ii] = rhs[ii]; // index for freefem for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; //for(int ii=0; ii < ia[Ncol]-1; ii++) // ja[ii] = ja[ii]-1; if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " pastix : time solve :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverpastix_complex_mpi(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverpastix_complex_mpi" << endl; return new zSolvepastixmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c); } class Init { public: Init(); }; // the 2 default sparse solver double and complex //DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; //DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; } bool Setpastixmpi() { if(verbosity) cout << " SetDefault sparse solver to pastixmpi" << endl; //DefSparseSolver::solver =BuildSolverpastix_complex_mpi; DefSparseSolver::solver =BuildSolverpastix_complex_mpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; } Init init; Init::Init() { //SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pastix, defaultsolver defaultsolverpastix" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; //DefSparseSolver::solver =BuildSolverpastix_complex_mpi; DefSparseSolver::solver =BuildSolverpastix_complex_mpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("complexdefaulttopastix","(",new OneOperator0(Setpastixmpi)); } freefem++-3.38-1/src/solver/complex_SuperLU_DIST_FreeFem.cpp000644 000767 000024 00000056760 11406226636 023737 0ustar00hechtstaff000000 000000 // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: superlu_dist parmetis metis blas //ff-c++-cpp-dep: // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* Interface freefem++ et SuperLU_DIST_2.3 /bin/sh ff-mpic++ zSuperLU_DIST.cpp -I/Users/morice/librairie/SuperLU_DIST_2.3/SRC/ -L/Users/morice/librairie/openmpi/lib/ -lmpi -lopen-pal -lopen-rte -L/Users/morice/librairie/PATCHVECLIB/ -lwrapperdotblas -framework veclib -L/Users/morice/librairie/ParMetis-3.1/ -lparmetis -lmetis -L/Users/morice/librairie/SuperLU_DIST_2.3/lib/ -lsuperlu_dist_2.3 */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "mpi.h" #include "superlu_zdefs.h" #include "ffsuperludistoption.hpp" template struct SuperLUmpiDISTDriver { }; template <> struct SuperLUmpiDISTDriver { /* Driver routines */ /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_Z;} static doublecomplex *dc(Complex *p) { return (doublecomplex *) (void *) p;} static doublecomplex **dc(Complex **p) { return (doublecomplex **) (void *) p;} // Remplacement doublecomplex par Complex static void pgssvx(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, Complex *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, SOLVEstruct_t *p9, double *p10, SuperLUStat_t *p11, int *p12) { pzgssvx( p1,p2,p3, dc(p4),p5,p6,p7,p8,p9,p10,p11,p12 ); } static void pgssvx_ABglobal(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, Complex *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, double *p9, SuperLUStat_t *p10, int *p11) { pzgssvx_ABglobal( p1,p2,p3, dc(p4),p5,p6,p7,p8,p9,p10,p11 ); } static void Create_CompCol_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, Complex *p5, int_t *p6, int_t *p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { zCreate_CompCol_Matrix_dist( p1,p2,p3, p4,dc(p5),p6,p7,p8,p9,p10 ); } static void Create_CompRowLoc_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, int_t p5, int_t p6, Complex *p7, int_t *p8, int_t *p9, Stype_t p10, Dtype_t p11, Mtype_t p12) { zCreate_CompRowLoc_Matrix_dist( p1,p2,p3, p4,p5,p6,dc(p7),p8,p9,p10,p11,p12 ); } static void CompRow_to_CompCol_dist(int_t p1, int_t p2, int_t p3, Complex *p4, int_t *p5, int_t *p6, Complex **p7, int_t **p8, int_t **p9) { zCompRow_to_CompCol_dist( p1,p2,p3, dc(p4),p5,p6,dc(p7),p8,p9 ); } static void Create_Dense_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, Complex *p4, int_t p5, Stype_t p6, Dtype_t p7,Mtype_t p8) { zCreate_Dense_Matrix_dist( p1,p2,p3, dc(p4),p5,p6,p7,p8 ); } static void Create_SuperNode_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, Complex *p5, int_t *p6, int_t *p7, int_t *p8, int_t *p9, int_t *p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { zCreate_SuperNode_Matrix_dist( p1,p2,p3, p4,dc(p5),p6,p7,p8,p9,p10,p11,p12,p13 ); } static void Print_CompRowLoc_Matrix_dist(SuperMatrix *p1) { zPrint_CompRowLoc_Matrix_dist(p1); } }; template class ZSolveSuperLUmpi : public MatriceMorse::VirtualSolver, public SuperLUmpiDISTDriver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 //mutable char equed[1]; //yes_no_t equil; mutable SuperMatrix A; NCformat *Astore; //NCformat *Ustore; //SCformat *Lstore; mutable superlu_options_t options; mutable mem_usage_t mem_usage; mutable ScalePermstruct_t ScalePermstruct; mutable LUstruct_t LUstruct; mutable SOLVEstruct_t SOLVEstruct; mutable gridinfo_t grid; string string_option; string data_option; R *a; int *asub, *xa; int_t m, n, nnz; // rajout pour // int_t nprow,npcol; /* process rows and process columns*/ int matrixdist; // type of distributed matrix MPI_Comm commworld ; static const int assembled =0; static const int distributedglobal =1; static const int distributed =2; public: ZSolveSuperLUmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string datafile, string param_char, KN &pperm_r, KN &pperm_c, void * ccommworld=0 ) : eps(epsilon),epsr(0), tgv(ttgv),string_option(param_char),data_option(datafile), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { commworld = ccommworld ? *static_cast( ccommworld) : MPI_COMM_WORLD; R* B; //R* X; SuperLUStat_t stat; int info, ldb, nrhs=0; int i; double* berr; int iam; // Add for distributed matrix int_t m_loc, m_loc_fst, fst_row, nnz_loc, fst_nnz; R *aloc; int *asubloc, *xaloc; // End Add for distributed matrix // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); A.Store=0; /* Defaults */ nrhs = 0; /* lecture de nprow and npcol */ // Cas max deux procs nprow = 1; npcol = 1; matrixdist=0; /* set the default options */ set_default_options_dist(&options); DiagScale_t optionDiagScale; //if(verbosity > 10) print_options_dist(&options); if(!string_option.empty()) read_nprow_npcol_freefem( &string_option, &nprow, &npcol, &matrixdist); if(!string_option.empty()) read_options_freefem(&string_option,&options,&optionDiagScale); if(!data_option.empty()) read_options_superlu_datafile(&data_option,&options,&nprow, &npcol, &matrixdist,&optionDiagScale); //if(verbosity > 10) print_options_dist(&options); /* ------------------------------------------------------------ INITIALIZE THE SUPERLU PROCESS GRID. ------------------------------------------------------------*/ cout << "Complex superlu_gridinit " << commworld << " "<< ccommworld << " : " << nprow << "X" << npcol <= nprow * npcol ){ //superlu_gridexit(&grid); printf("this process is not used in superlu %d \n",iam); } else { // matrix to procs and vectors if( matrixdist == assembled ){ if(!iam){ cout << "iam=" << iam << endl; printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; assert( AA.lg[n] == nnz ); printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* transform Row to Col */ // cela coute cher comme fonction // // dallocateA_dist(n, nnz, &a, &asub, &xa); // dCompRow_to_CompCol_dist(m,n,nnz,arow,asubrow,xarow,&a,&asub,&xa); CompRow_to_CompCol_dist(m,n,nnz,AA.a,AA.cl,AA.lg,&a,&asub,&xa); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } else{ /* printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ zallocateA_dist(n, nnz, dc(&a), &asub, &xa); MPI_Bcast( a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); cout << "Debut: Create_CompCol_Matrix_dist" <::pgssvx_ABglobal(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } //########################################################## // // matrix distributed with matrix global given // //########################################################## else if( matrixdist == distributedglobal) { if(!iam){ printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; a=AA.a; asub=AA.cl; xa=AA.lg; xa[n] = nnz; printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( AA.cl, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.lg, n+1, mpi_int_t, 0, grid.comm ); } else { printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ zallocateA_dist(n, nnz, dc(&a), &asub, &xa); MPI_Bcast( a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } /* Compute the number of rows to be distributed to local process */ m_loc = m / (grid.nprow * grid.npcol); m_loc_fst = m_loc; /* When m / procs is not an integer */ if ((m_loc * grid.nprow * grid.npcol) != m) { /*m_loc = m_loc+1; m_loc_fst = m_loc;*/ if (iam == (grid.nprow * grid.npcol - 1)) /* last proc. gets all*/ m_loc = m - m_loc * (grid.nprow * grid.npcol - 1); } fst_row = iam * m_loc_fst; nnz_loc = xa[fst_row+m_loc]-xa[fst_row]; zallocateA_dist(m_loc, nnz_loc, dc(&aloc), &asubloc, &xaloc); //xaloc = (int_t*) intMalloc_dist(m_loc+1); for(int ii=0; ii < m_loc; ii++){ xaloc[ii] = xa[fst_row+ii]-xa[fst_row]; } xaloc[m_loc]=nnz_loc; fst_nnz = xa[fst_row]; //aloc = new R[nnz_loc]; //aloc = (Complex*) doubleMalloc_dist(nnz_loc); //asubloc = (int_t*) intMalloc_dist(nnz_loc); for(int ii=0; ii < nnz_loc; ii++){ aloc[ii] = a[fst_nnz+ii]; asubloc[ii] = asub[fst_nnz+ii]; } if( iam ){ SUPERLU_FREE( a ); SUPERLU_FREE( asub ); SUPERLU_FREE( xa ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); if(verbosity) cout << "Debut: Create_CompRowCol_Matrix_dist" <::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } else if( matrixdist == distributed) { printf("in construction\n"); exit(1); } else{ printf("matrix choice for SuperLU_DIST is assembled, distributedglobal and distributed \n"); exit(1); } delete [] B; options.Fact = FACTORED; /* Indicate the factored form of A is supplied. */ nrhs=1; SUPERLU_FREE(berr); if(iam==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "SuperLU_DIST : time factorisation :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { R* B; SuperLUStat_t stat; int iam; int info=0, ldb=m, nrhs=1; int i; double* berr; double ferr; double rpg, rcond; int_t m_loc,m_loc_fst,fst_row; // time variables long int starttime,finishtime; long int timeused; iam = grid.iam; if( iam < nprow*npcol){ if(verbosity) starttime = clock(); if(n != m) exit(1); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); nrhs= 1; /* Initialize the statistics variables. */ PStatInit(&stat); /* cas matrix assembled */ if( matrixdist == assembled ){ if( !(B = new R[m*nrhs] ) ){ printf("probleme d allocation\n"); exit(1); } for(int ii=0; ii::pgssvx_ABglobal (&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if(verbosity) PStatPrint(&options, &stat, &grid); for(int ii=0; ii::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if ( !(xtemp = new R[AA.n]) ){ printf("probleme d allocation de xtemp\n"); exit(1); } int disp[nprow*npcol]; MPI_Allgather(&fst_row, 1, MPI_INT, disp, 1, MPI_INT, grid.comm); int recv[nprow*npcol]; MPI_Allgather(&m_loc, 1, MPI_INT, recv, 1, MPI_INT, grid.comm); MPI_Allgatherv(B, m_loc, SuperLU_MPI_DOUBLE_COMPLEX, xtemp, recv, disp, SuperLU_MPI_DOUBLE_COMPLEX, grid.comm); for(int ii= 0; ii< AA.n ; ii++) x[ii] = xtemp[ii]; if(verbosity) cout << " x min max " << x.min() << " " < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverSuperLUmpi(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverSuperLUmpi" << endl; return new ZSolveSuperLUmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.sparams, ds.perm_r, ds.perm_c); } class Init { public: Init(); }; // the 2 default sparse solver double and complex //DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; //DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; } bool SetSuperLUmpi() { if(verbosity) cout << " SetDefault sparse solver to SuperLUmpi double" << endl; //DefSparseSolver::solver =BuildSolverSuperLUmpi; DefSparseSolver::solver =BuildSolverSuperLUmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; } Init init; Init::Init() { //SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Complex SuperLU_DIST, defaultsolver defaultsolverSuperLUdist" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; //DefSparseSolver::solver =BuildSolverSuperLUmpi; DefSparseSolver::solver =BuildSolverSuperLUmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("complexdefaulttoSuperLUdist","(",new OneOperator0(SetSuperLUmpi)); } freefem++-3.38-1/src/solver/ffsuperludistoption.hpp000644 000767 000024 00000042511 11406226636 022557 0ustar00hechtstaff000000 000000 // read options for superlu in freefem++ int s_(char* str, const char* cmp[]) { int i = 0; while( cmp[i] != 0){ if( strcmp(str, cmp[i]) == 0){ //cout << *str << " return" << i << endl; return i+1 ; } i++; } //cout << *str << " return 0" << endl; return 0; } void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol){ static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2 = tictac; tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 13: // nprow *nprow = atoi(tictac); break; case 14: // npcol *npcol = atoi(tictac); break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2 ); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol, int *matrixdist){ static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol","matrix",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2 = tictac; tictac = strtok(NULL," =,\t\n"); int val_options; printf("param %s = value %s , id_option %d\n",tictac2,tictac,id_option); switch (id_option) { case 13: // nprow *nprow = atoi(tictac); break; case 14: // npcol *npcol = atoi(tictac); break; case 15: // matrix printf("parameter matrix \n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("value of parameter matrix is not correct %s \n", tictac ); } break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2 ); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } void read_options_freefem(string *string_option, superlu_options_t *options, DiagScale_t *diag){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[6] = {NATURAL, MMD_AT_PLUS_A, MMD_ATA, METIS_AT_PLUS_A,PARMETIS, MY_PERMC}; static const rowperm_t enumrowperm_t[3] = {NOROWPERM, LargeDiag, MY_PERMR}; static const DiagScale_t enumDiagScale_t[4] = {NOEQUIL, ROW, COL, BOTH}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SINGLE, DOUBLE, EXTRA}; //static const MemType enumMemType_t[4] = {LUSUP, UCOL, LSUB, USUB}; //static const stack_end_t enumstack_end_t[2] = {HEAD, TAIL}; //static const LU_space_t enumLU_space_t[2] = {SYSTEM, USER}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* comprowperm_t[] = {"NOROWPERM", "LargeDiag", "MY_PERMR",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_AT_PLUS_A", "MMD_ATA", "METIS_AT_PLUS_A", "PARMETIS", "MY_PERMC",0}; static const char* compDiagScale_t[] = {"NOEQUIL", "ROW", "COL", "BOTH",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; //static const char* compMemType_t[] = {"LUSUP", "UCOL", "LSUB", "USUB",0}; //static const char* compstack_end_t[] = {"HEAD", "TAIL",0}; //static const char* compLU_space_t[] = {"SYSTEM", "USER",0}; static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol","DiagScale","matrix",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); cout << "data=" << data << endl; char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2=tictac; tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ParSymbFact //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ParSymbFact = enumyes_no_t[val_options-1]; break; case 4: // ColPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 5: // RowPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,comprowperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->RowPerm = enumrowperm_t[val_options-1]; break; case 6: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 7: // IterRefine val_options= s_(tictac,compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 8: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 9: // ReplaceTinyPivot //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->ReplaceTinyPivot= enumyes_no_t[val_options-1]; break; case 10: // SolveInitialized //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->SolveInitialized = enumyes_no_t[val_options-1]; break; case 11: // RefineInitialized //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->RefineInitialized = enumyes_no_t[val_options-1]; break; case 12: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; // case 13 nprow // case 14 npcol case 15: // DiagScale_t val_options= s_(tictac, compDiagScale_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } *diag = enumDiagScale_t[val_options-1]; break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } // void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol, int *matrixdist){ // static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", // "DiagPivotThresh","IterRefine","Trans", // "ReplaceTinyPivot","SolveInitialized", // "RefineInitialized","PrintStat","nprow","npcol","matrix",0}; // char data[string_option->size()+1]; // strcpy( data, string_option->c_str()); // char *tictac; // char *tictac2; // tictac = strtok(data," =,\t\n"); // while(tictac != NULL){ // int id_option = s_(tictac, comp); // tictac2 = tictac; // tictac = strtok(NULL," =,\t\n"); // int val_options; // printf("param %s = value %s , id_option %d\n",tictac2,tictac,id_option); // switch (id_option) // { // case 13: // nprow // *nprow = atoi(tictac); // break; // case 14: // npcol // *npcol = atoi(tictac); // break; // case 15: // matrix // printf("parameter matrix \n"); // if(strcmp(tictac,"assembled") == 0) // *matrixdist = 0; // else if(strcmp(tictac,"distributedglobal") == 0) // *matrixdist = 1; // else if(strcmp(tictac,"distributed") == 0) // *matrixdist = 2; // else{ // printf("value of parameter matrix is not correct %s \n", tictac ); // } // break; // default: // Equivalent of case default // if(id_option == 0) // { // printf("parameter is not valid for superlu_dist %s \n", tictac2 ); // exit(1); // } // break; // } // tictac = strtok(NULL," =,\t\n"); // } // } void read_nprow_npcol_matrixdist_superlu_datafile(string *data_option, int_t *nprow, int_t *npcol, int *matrixdist){ char datafile[data_option->size()+1]; strcpy( datafile, data_option->c_str()); FILE* pfile= fopen( datafile,"rt"); char data[256]; char *tictac; fgets(data,256,pfile); cout << "data=" << data << endl; tictac = strtok(data," /!#\t\n"); *nprow = (int) atol(tictac); if(verbosity) printf("nprow=%d\n",*nprow); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); *npcol = (int) atol(tictac); if(verbosity) printf("npcol=%d\n",*npcol); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("matrix input %s for superlu_dist is not correct\n", tictac ); exit(1); } fclose(pfile); } void read_options_superlu_datafile(string *data_option, superlu_options_t *options, int_t *nprow, int_t *npcol, int *matrixdist, DiagScale_t *diag){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[6] = {NATURAL, MMD_AT_PLUS_A, MMD_ATA, METIS_AT_PLUS_A,PARMETIS, MY_PERMC}; static const rowperm_t enumrowperm_t[3] = {NOROWPERM, LargeDiag, MY_PERMR}; static const DiagScale_t enumDiagScale_t[4] = {NOEQUIL, ROW, COL, BOTH}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SINGLE, DOUBLE, EXTRA}; //static const MemType enumMemType_t[4] = {LUSUP, UCOL, LSUB, USUB}; //static const stack_end_t enumstack_end_t[2] = {HEAD, TAIL}; //static const LU_space_t enumLU_space_t[2] = {SYSTEM, USER}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* comprowperm_t[] = {"NOROWPERM", "LargeDiag", "MY_PERMR",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_AT_PLUS_A", "MMD_ATA", "METIS_AT_PLUS_A", "PARMETIS", "MY_PERMC",0}; static const char* compDiagScale_t[] = {"NOEQUIL", "ROW", "COL", "BOTH",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; //int_t ffnprow,ffnpcol; //int matrixdist; char datafile[data_option->size()+1]; strcpy( datafile, data_option->c_str()); FILE* pfile= fopen( datafile,"rt"); char data[256]; char *tictac; fgets(data,256,pfile); cout << "data=" << data << endl; tictac = strtok(data," /!#\t\n"); *nprow = (int) atol(tictac); if(verbosity) printf("nprow=%d\n",*nprow); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); *npcol = (int) atol(tictac); if(verbosity) printf("npcol=%d\n",*npcol); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("matrix input %s for superlu_dist is not correct\n", tictac ); exit(1); } int id_option=0; while( !feof(pfile) && id_option<12){ fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); id_option++; int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ParSymbFact //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ParSymbFact = enumyes_no_t[val_options-1]; break; case 4: // ColPerm val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 5: // RowPerm val_options= s_(tictac,comprowperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->RowPerm = enumrowperm_t[val_options-1]; break; case 6: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 7: // IterRefine val_options= s_(tictac,compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 8: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 9: // ReplaceTinyPivot //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->ReplaceTinyPivot= enumyes_no_t[val_options-1]; break; case 10: // SolveInitialized //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->SolveInitialized = enumyes_no_t[val_options-1]; break; case 11: // RefineInitialized //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->RefineInitialized = enumyes_no_t[val_options-1]; break; case 12: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; case 13: // DiagScale_t val_options= s_(tictac, compDiagScale_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } *diag = enumDiagScale_t[val_options-1]; break; default: // Equivalent of case default if(id_option == 0 && id_option > 13) { printf("Error in reading data file for superlu_dist %s\n",datafile); exit(1); } break; } } fclose(pfile); } freefem++-3.38-1/src/solver/hips_FreeFem.cpp000755 000767 000024 00000046025 11406226636 020765 0ustar00hechtstaff000000 000000 // ORIG-DATE: 04/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : INRIA FUTUR // AUTHOR : Guy Atenekeng // E-MAIL : Guy_Antoine_Atenekeng_Kahou@lri.fr // //ff-c++-LIBRARY-dep: metis hips blas //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" #include "MatriceCreuse_tpl.hpp" #include "mpi.h" extern "C" { #include "hips.h" // #include "io.h" #include "metis.h" } #include #include #include #define BUFLEN 200 #define MCW MPI_COMM_WORLD //roscal(&n,&job,&tmp,AAv,p,pr,scaletmpr,AAv,p,pr,&ierr); int roscal(int n, int job,int nrm, double *AAv, int *p, int *pr, double * scaletmpr , int *ierr) { /*--------------------------------------------------------------------- | | This routine scales each row of mata so that the norm is 1. | |---------------------------------------------------------------------- | on entry: | mata = the matrix (in SparRow form) | nrm = type of norm | 0 (\infty), 1 or 2 | | on return | diag = diag[j] = 1/norm(row[j]) | | 0 --> normal return | j --> row j is a zero row |--------------------------------------------------------------------*/ /* local variables */ int i, k; double scal; for (i=0; i scal) scal = fabs(AAv[k]); } else if (nrm == 1) { for (k=pr[i]; k normal return | j --> column j is a zero column |--------------------------------------------------------------------*/ /* local variables */ int i, j, k; double *kr; int *ki; for (i=0; i scaletmpc[p[k]]) scaletmpc[p[k]] = fabs(AAv[k]); } } else if (nrm == 1) { for (k=pr[i]; k param_int,KN param_double) { char buf[BUFLEN]; int num,in_val; double val; FILE *fp; char * filename=new char[datafile.length()+1]; strcpy(filename,datafile.c_str()); int i; for(i=0;i<16;i++) param_int[i]=-1; for(i=0;i<9;i++) param_double[i]=-1.0; /* read parameters for preconditioner and iteration from file 'filename' */ /* ---- start modification by MS */ if( (fp = fopen(filename, "r")) == NULL ){ fprintf(stderr, "Cannot open file inputs\n"); exit(1); } num = 0; while(fgets(buf, BUFLEN, fp) != NULL) { if(num<=15) {sscanf(buf, "%d", &in_val); param_int[num]=in_val;} else {sscanf(buf, "%lf", &val); param_double[num]=val;} num++; } fclose(fp); } class HipsSolver : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 string data_option; MPI_Comm comm; mutable INTS id, idnbr, i, j; mutable INTS *unknownlist; mutable double *x; mutable INTS ln; mutable INTS ierr; mutable INTS n,nnz; mutable double * a; mutable INTS *ia, *ja; mutable int *pp; int loc_size,pbegin, pend; INTS domsize, nproc,proc_id; mutable int sym_pattern, sym_matrix; KN param_int; KN param_double; mutable double *scaletmpr, *scaletmpc; mutable int *mapptr,*maptmp,*iwork,*riord,*iwork1,scale; mutable int *pr, *p; mutable double * AAv; public: HipsSolver(const MatriceMorse &AA,string datafile, const KN ¶m_int1, const KN ¶m_double1, MPI_Comm * mpicommw ) : data_option(datafile) { int argc,sym,symm; argc=1; param_int=param_int1; param_double=param_double1; if(mpicommw==0){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; MPI_Comm_rank(comm, &proc_id); MPI_Comm_size(comm, &nproc); id = 0; /** id of the linear system **/ /***************************************/ /* Initialize HIPS for one problem */ /***************************************/ idnbr = 1; /* total */ ierr = HIPS_Initialize(idnbr); HIPS_ExitOnError(ierr); id = 0; /** id of the linear system **/ int ic; if((!data_option.empty())&&((param_int==NULL)||(param_double==NULL))) parm_param(datafile,param_int,param_double); else{ if((param_double.N()>0)||(param_int.N()>0)){ if(proc_id==0) cout << " WE SET PARAMETER FROM VECTORS " << endl;} else if(proc_id==0) cout << " WE SET DEFAULT PARAMETERS " << endl; } if(param_int.N()>0) { if((param_int[0]==HIPS_ITERATIVE)||(param_int[0]==HIPS_HYBRID)) // Using strategy. Input is ok { HIPS_SetDefaultOptions(id,param_int[0]); ic=param_int[0];} else { HIPS_SetDefaultOptions(id,HIPS_ITERATIVE );ic=HIPS_ITERATIVE; } // Strategy is not they existing one }else {HIPS_SetDefaultOptions(id,HIPS_ITERATIVE);ic=HIPS_ITERATIVE;} //Default strategy is ITERATIVE if(param_double.N()>0) {if(param_double[0]>0) HIPS_SetOptionREAL(id,HIPS_PREC,param_double[0]); else HIPS_SetOptionREAL(id,HIPS_PREC,1e-09);} else HIPS_SetOptionREAL(id,HIPS_PREC,1e-09); if((param_int.N()>1)&&(ic==HIPS_ITERATIVE)) {if((param_int[1]==1)||(param_int[1]==0)) HIPS_SetOptionINT(id,HIPS_KRYLOV_METHOD,param_int[1]); else HIPS_SetOptionINT(id,HIPS_KRYLOV_METHOD,0);}else {if(ic==HIPS_ITERATIVE) HIPS_SetOptionINT(id,HIPS_KRYLOV_METHOD,0);} if(param_int.N()>2) { if(param_int[2]>0) HIPS_SetOptionINT(id,HIPS_ITMAX,param_int[2]); else HIPS_SetOptionINT(id,HIPS_ITMAX,1000);} else HIPS_SetOptionINT(id,HIPS_ITMAX,1000); if(param_int.N()>3) { if(param_int[3]>0) HIPS_SetOptionINT(id,HIPS_KRYLOV_RESTART,param_int[3]); else HIPS_SetOptionINT(id,HIPS_KRYLOV_RESTART,40);} else HIPS_SetOptionINT(id,HIPS_KRYLOV_RESTART,40); if(param_int.N()>4) {if(param_int[4]>0) {HIPS_SetOptionINT(id,HIPS_SYMMETRIC,param_int[4]); symm=param_int[4];}} else {HIPS_SetOptionINT(id,HIPS_SYMMETRIC,1);symm=1;} if(param_int.N()>5) {if((param_int[5]==0)||(param_int[5]==1)) {HIPS_SetOptionINT(id,HIPS_GRAPH_SYM,param_int[5]);sym=param_int[5];} else {HIPS_SetOptionINT(id,HIPS_GRAPH_SYM,1);sym=1;}} else {HIPS_SetOptionINT(id,HIPS_GRAPH_SYM,1);sym=1;} if(param_int.N()>6) { if(param_int[6]>0) HIPS_SetOptionINT(id,HIPS_PARTITION_TYPE,param_int[6]); else HIPS_SetOptionINT(id,HIPS_PARTITION_TYPE,0);}else HIPS_SetOptionINT(id,HIPS_PARTITION_TYPE,0); if(param_int.N()>7) {if(param_int[7]>0) HIPS_SetOptionINT(id,HIPS_LOCALLY,param_int[7]); else HIPS_SetOptionINT(id,HIPS_LOCALLY,2);}else HIPS_SetOptionINT(id,HIPS_LOCALLY,2); if(param_int.N()>8) {if(param_int[8]>0) HIPS_SetOptionINT(id,HIPS_FORTRAN_NUMBERING,param_int[8]); else HIPS_SetOptionINT(id,HIPS_FORTRAN_NUMBERING,0);} else HIPS_SetOptionINT(id,HIPS_FORTRAN_NUMBERING,0); if(param_int.N()>9) {if(param_int[9]>0) HIPS_SetOptionINT(id,HIPS_SCALE,param_int[9]); else { HIPS_SetOptionINT(id,HIPS_SCALE,1); scale=1;}} else {HIPS_SetOptionINT(id,HIPS_SCALE,1); scale=1;} if(param_int.N()>10) {if(param_int[10]>0) HIPS_SetOptionINT(id,HIPS_REORDER,param_int[10]); else HIPS_SetOptionINT(id,HIPS_REORDER,1);} else HIPS_SetOptionINT(id,HIPS_REORDER,1); if(param_int.N()>11) {if(param_int[11]>0) HIPS_SetOptionINT(id,HIPS_DOF,param_int[11]); else HIPS_SetOptionINT(id,HIPS_DOF,1);} else HIPS_SetOptionINT(id,HIPS_DOF,1); if(param_int.N()>12) {if(param_int[12]>0) HIPS_SetOptionINT(id,HIPS_SCALENBR,param_int[12]); else HIPS_SetOptionINT(id,HIPS_SCALENBR,2);} else HIPS_SetOptionINT(id,HIPS_SCALENBR,2); if(param_int.N()>13) {if(param_int[13]>0) HIPS_SetOptionINT(id,HIPS_VERBOSE,param_int[13]); else HIPS_SetOptionINT(id,HIPS_VERBOSE,5);} else HIPS_SetOptionINT(id,HIPS_VERBOSE,5); if(param_int.N()>14) {if(param_int[14]>0) HIPS_SetOptionINT(id,HIPS_DOMSIZE,param_int[14]); else HIPS_SetOptionINT(id,HIPS_DOMSIZE,2);} else HIPS_SetOptionINT(id,HIPS_DOMSIZE,2); // if(param_int.N()>15) {if(param_int[15]>0) HIPS_SetOptionINT(id,HIPS_SCHUR_METHOD,param_int[15]); //else HIPS_SetOptionINT(id,HIPS_SCHUR_METHOD,2);} else HIPS_SetOptionINT(id,HIPS_SCHUR_METHOD,2); // if(param_int.N()>16) {if(param_int[16]>0) HIPS_SetOptionINT(id,HIPS_ITMAX_SCHUR,param_int[16]); // else HIPS_SetOptionINT(id,HIPS_ITMAX_SCHUR,2);} else HIPS_SetOptionINT(id,HIPS_ITMAX_SCHUR,2); if(param_double.N()>1){if(param_double[1]>0.0) HIPS_SetOptionREAL(id,HIPS_DROPTOL0,param_double[1]); else HIPS_SetOptionREAL(id,HIPS_DROPTOL0,0.005);} else HIPS_SetOptionREAL(id,HIPS_DROPTOL0,0.005); if(param_double.N()>2) {if(param_double[2]>0.0) HIPS_SetOptionREAL(id,HIPS_DROPTOL1,param_double[2]); else HIPS_SetOptionREAL(id,HIPS_DROPTOL1,0.005);} else HIPS_SetOptionREAL(id,HIPS_DROPTOL1,0.005); if(param_double.N()>3){if(param_double[3]>0.0) HIPS_SetOptionREAL(id,HIPS_DROPTOLE,param_double[3]); else HIPS_SetOptionREAL(id,HIPS_DROPTOLE,0.005);} HIPS_SetOptionREAL(id,HIPS_DROPTOLE,0.005); if(param_double.N()>4){if(param_double[4]>0.0) HIPS_SetOptionREAL(id,HIPS_AMALG,param_double[4]); else HIPS_SetOptionREAL(id,HIPS_AMALG,0.005);} HIPS_SetOptionREAL(id,HIPS_AMALG,0.005); /*if(param_double.N()>5){if(param_double[5]>0.0) HIPS_SetOptionREAL(id,HIPS_DROPTOLSCHUR ,param_double[5]); else HIPS_SetOptionREAL(id,HIPS_DROPTOLSCHUR ,0.005);} HIPS_SetOptionREAL(id,HIPS_DROPTOLSCHUR ,0.005);*/ HIPS_SetCommunicator(id,comm); n=AA.n; nnz=AA.nbcoef; int ierr; pr= new int[n+1]; p= new int[nnz]; AAv=new double[nnz]; for(i=0;i1){ METIS_PartGraphKway(&n, AA.lg, AA.cl, NULL, NULL, &wgtflag, &numflag,&nproc, option, &volume, riord); } else if(nproc==1){ for (i=0; i &AA,KN_ &x,const KN_ &b) const { /***************************************************/ /* */ /* ENTER THE RIGHT-HAND-SIDE */ /* */ /***************************************************/ int i,nloc; nloc=0; int nnsize; MPI_Comm_size(comm,&nnsize); COEF * rhsloc = (COEF *)malloc(sizeof(COEF)*iwork1[proc_id]); COEF * xx = (COEF *)malloc(sizeof(COEF)*iwork1[proc_id]); int * unknownlist = (INTS *)malloc(sizeof(INTS)*iwork1[proc_id]); COEF * xz = (COEF *)malloc(sizeof(COEF)*n); nloc=0; if(scale){ for(i=0;i3) cout << "~Hips_Solver S:" << endl; free(iwork1); free(mapptr); free(iwork); free(maptmp); HIPS_SetOptionINT(id,HIPS_DISABLE_PRECOND,0);HIPS_ExitOnError(ierr); ierr = HIPS_Clean(id); HIPS_ExitOnError(ierr); } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; //BuildSolverIUMFPack(DCL_ARG_SPARSE_SOLVER(double,A)) inline MatriceMorse::VirtualSolver * BuildSolverHipsSolvermpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverSuperLU" << endl; return new HipsSolver(*A,ds.data_filename, ds.lparams, ds.dparams,(MPI_Comm *)ds.commworld); } class Init { public: Init(); }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return 1; } bool SetHipsSolver() { if(verbosity>1) cout << " SetDefault sparse solver to Hips" << endl; DefSparseSolver::solver =BuildSolverHipsSolvermpi; //DefSparseSolver::solver =BuildSolverHipsSolvermpi; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; return 1; } Init init; Init::Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Hips, defaultsolver defaultsolverHips" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverHipsSolvermpi; // DefSparseSolver::solver =BuildSolverHipsSolver; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoHips","(",new OneOperator0(SetHipsSolver)); } freefem++-3.38-1/src/solver/hypre_FreeFem.cpp000644 000767 000024 00000160445 12471464470 021154 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : INRIA Saclay // AUTHOR : Guy Atenekeng // E-MAIL : Guy_Antoine_Atenekeng_Kahou@lri.fr // //ff-c++-LIBRARY-dep: metis hypre blas //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #ifdef __cplusplus extern "C" { #include "metis.h" #endif #ifdef __cplusplus } #endif #include #include #include #include "mpi.h" #ifdef MPI_WTIME_IS_GLOBAL #undef MPI_WTIME_IS_GLOBAL #endif #define MPI_WTIME_IS_GLOBAL 1 #define STATS #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_krylov.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.h" #include "HYPRE_parcsr_int.h" #define CHECK_ZERO #define MCW MPI_COMM_WORLD #define BUFLEN 100 #define SCALE 0 #ifdef SUN /* * It uses the system call gethrtime(3C), which is accurate to * nanoseconds. */ #include double dwalltime() { return ( (double)gethrtime() / 1e9 ); } #else #ifndef NO_TIMER #include #include #include #include #endif #ifndef CLK_TCK #define CLK_TCK 60 #endif double dwalltime() { #ifdef NO_TIMER /* no sys/times.h on _WIN32 */ double tmp; tmp = 0.0; #else struct tms use; double tmp; times(&use); tmp = use.tms_utime; tmp += use.tms_stime; #endif return (double)(tmp) / CLK_TCK; } #endif int roscal(int n, int job,int nrm, double *AAv, int *p, int *pr, double * scaletmpr , int *ierr) { /*--------------------------------------------------------------------- | | This routine scales each row of mata so that the norm is 1. | |---------------------------------------------------------------------- | on entry: | mata = the matrix (in SparRow form) | nrm = type of norm | 0 (\infty), 1 or 2 | | on return | diag = diag[j] = 1/norm(row[j]) | | 0 --> normal return | j --> row j is a zero row |--------------------------------------------------------------------*/ /* local variables */ int i, k; double scal; for (i=0; i scal) scal = fabs(AAv[k]); } else if (nrm == 1) { for (k=pr[i]; k normal return | j --> column j is a zero column |--------------------------------------------------------------------*/ /* local variables */ int i, j, k; double *kr; int *ki; for (i=0; i scaletmpc[p[k]]) scaletmpc[p[k]] = fabs(AAv[k]); } } else if (nrm == 1) { for (k=pr[i]; kilower=rk*(n/size); ilower=(A_loc)->ilower; (A_loc)->iupper=(rk+1)*(n/size)-1; if(rk==size-1) (A_loc)->iupper=(A_loc)->iupper+n%size; iupper=(A_loc)->iupper; (A_loc)->n_loc=n_loc; if( !((A_loc)->ptr=(int *)malloc((n_loc+1)*sizeof(int))) ) {printf("%s","Malloc fails for ptr \n"); exit(1);} if( !((A_loc)->rows=(int *)malloc((n_loc)*sizeof(int))) ) {printf("%s","Malloc fails for rows \n");exit(1);} if( !((A_loc)->ncols=(int *)malloc((n_loc)*sizeof(int))) ) {printf("%s","Malloc fails for ncols \n");exit(1);} //Change global Input matrix (A) to local (A_loc) on each process if(type==0){ //Matrix A is in CSR format //Gets local nnz i1=(A_loc)->ilower; i2=(A_loc)->iupper; (A_loc)->ilower=i1; (A_loc)->iupper=i2; nnz_loc=0; for(i=i1;i<=i2;i++){ nnz_loc+=ptr[i+1]-ptr[i]; } //Allocate memory for local matrix if( !((A_loc)->id_cols=(int *)malloc(nnz_loc*sizeof(int))) ) {printf("%s","Malloc fails for id_cols \n");exit(1);} if( !((A_loc)->vals=(double *)malloc(nnz_loc*sizeof(double))) ) {printf("%s","Malloc fails for vals"); exit(1);} //Transfer the corresponding values from global to local relpos=0; //int ncols; //count number of elements in each row for(i=i1;i<=i2;i++){ (A_loc)->rows[i-i1]=i; (A_loc)->ptr[i-i1]=relpos; ncols=relpos; for(j=ptr[i];jid_cols[relpos]=id_rows[j]; (A_loc)->vals[relpos]=vals[j]; relpos++; } (A_loc)->ncols[i-i1]=relpos-ncols; } //cout << "taille des sous domaines" << nnz_loc << endl; } else{ //matrix A is in CSC format marker= (int *)calloc(n, sizeof(int)); //count number of elements in each row for(i=0; iptr[0]=0; //set up the beginning of each row for(i=0; iptr[i+1] = (A_loc)->ptr[i] + marker[i+ilower]; (A_loc)->id_cols[relpos]=id_rows[j]; (A_loc)->vals[relpos]=vals[j]; relpos++; } (A_loc)->ncols[i-ilower]=relpos-ncols; } return 0; } class hypreParam { //Solveur and preconditionner public: char solver[BUFLEN]; char precon[BUFLEN]; //BoomerAMG parameter int amg_coarsentype ; /* Falgout coarsening */ int amg_relaxtype; /* hybrid Gauss-Seidel or SOR */ int amg_interptype; /* default*/ int amg_maxlevels; int amg_numsweeps; /*default*/ double amg_strongthreshold;/*suitable for 3D Laplace Operator*/ double amg_truncfactor; int amg_prntlevel; /* print setup info */ double amg_tol; //BoomerAMG Tolerance int amg_maxiter; int scale; int gsmg_sample, measure_type,cycle_type; int solv_stopcrit ; double trunc_factor; //More complex smoothers (Schwarz methods, Pilut, Parasails, Euclid) int smooth_type; int smooth_numlevels; int smooth_numsweeps; double pilut_droptol; double pilut_maxnz; int schwarz_overlap; int schwarz_variant; int schwarz_domaintype; //parasails parameter int sai_max_levels ; double sai_threshold ; double sai_filter ; int sai_sym ; int sai_log ; int VERBOSE; /***************************HYPRE_BOOMERAMG***********************/ double strong_threshold; int * num_grid_sweeps; int * grid_relax_type; int * grid_relax_points; double * relax_weight; double * omega; //Solver parameter (used for GMRES , PCG or BiCGStab) double solv_tol ; int solv_maxiter; int solv_kdim; int solv_log; int solv_prntlevel; int precond_id, solver_id,matrix_id,solver_type; int smooth_num_levels,smooth_num_sweeps,max_levels,Two_Norm; int domain_type, num_functions,variant,overlap,nonzeros_to_keep; double max_row_sum,drop_tol; int *dof_func; int pcg_max_its,rrow_size,Rel_change; int dscg_max_its,coarsen_type,hybrid,k_dim,num_sweep; int pmax_iter; double cf_tol,tol,pc_tol; double schwarz_rlx_weight; /*For timing*/ int timing; public : hypreParam(const KN ¶m_int, const KN ¶m_double) { amg_coarsentype =6; /* Falgout coarsening */ amg_relaxtype =3; /* hybrid Gauss-Seidel or SOR */ amg_interptype=0; /* default*/ amg_maxlevels=25; amg_numsweeps=1; /*default*/ amg_strongthreshold = 0.25;/*suitable for 3D Laplace Operator*/ amg_truncfactor=0.3; amg_prntlevel =1; /* print setup info */ amg_tol=0.0; //BoomerAMG Tolerance amg_maxiter=20; gsmg_sample=1; //More complex smoothers (Schwarz methods, Pilut, Parasails, Euclid) smooth_type=6; smooth_numlevels=3; smooth_numsweeps=1; pilut_droptol=1.0e-4; pilut_maxnz=100; schwarz_overlap=10; schwarz_variant=2; schwarz_domaintype=2; //parasails parameter sai_max_levels = 1; sai_threshold = 0.1; sai_filter = 0.1; sai_sym =0; sai_log = 1; int i; //Solver parameter (used for GMRES or BiCGStab) solv_tol = 1.0e-11; solv_maxiter = 1000; solv_kdim =40; solv_log = 0; solv_prntlevel = 2; precond_id=0;//BOOMER AMG solver_id=1; //GMRES as solver VERBOSE=0; scale=1; pmax_iter=30; rrow_size=1000; solv_stopcrit=1; amg_interptype =6; gsmg_sample =5; amg_coarsentype =6; measure_type =1;amg_strongthreshold=0.25; trunc_factor=1e-2; amg_maxiter=20; cycle_type=1; smooth_num_levels=3; smooth_num_sweeps=1; max_levels=25; hybrid=1; k_dim = 5; smooth_type = 6; num_functions = 1; smooth_num_levels = 3; smooth_num_sweeps = 2; num_sweep = 1; variant = 0; overlap = 10; domain_type = 2; nonzeros_to_keep = 1000; tol = 1.e-8; pc_tol = 0.; drop_tol = -1.; max_row_sum = 0.9; schwarz_rlx_weight = 1.; sai_threshold = 0.1; sai_filter = 0.1; relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } max_row_sum=0.9; schwarz_rlx_weight=1.; variant=0; num_functions=1; overlap=10; domain_type= 2; if(param_int.N()>0) {if((param_int[0]>=0)&&(param_int[0]<=9)) solver_id=param_int[0]; else solver_id=1;} //GMRES as solver if((solver_id!=4)&&(solver_id!=5)){ if(param_int.N()>1) {if((param_int[1]>=0)&&(param_int[1]<=9)) precond_id=param_int[1]; else precond_id=0;}//BOOMER AMG } if(param_int.N()>2) {if(param_int[2]>0) solv_maxiter = param_int[2];else solv_maxiter=1000;} if(param_int.N()>3) {if(param_int[3]>0) solv_kdim =param_int[3];else solv_kdim=40;} if(param_int.N()>4) {if(param_int[4]>=0) solv_prntlevel = param_int[4];} if(param_int.N()>5) {if(param_int[5]>=0) solv_log = param_int[5];} if(param_int.N()>6) {if(param_int[6]>=0) solv_stopcrit = param_int[6];} if(param_double.N()>0) {if(param_double[0]>0) solv_tol = param_double[0];} switch(precond_id) { case 0 : //Preconditionner AMG if(param_int.N()>7) {if(param_int[7]>=0) amg_interptype =param_int[7];} if(param_int.N()>8) {if(param_int[8]>=0) gsmg_sample =param_int[8];} if(param_int.N()>9) {if(param_int[9]>=0) amg_coarsentype =param_int[9];} if(param_int.N()>10) {if(param_int[10]>=0) measure_type =param_int[10];} if(param_double.N()>1) {if(param_double[1]>0) amg_strongthreshold = param_double[1];} if(param_double.N()>2) {if(param_double[2]>0) trunc_factor = param_double[2];} //if(param_int.N()>11) {if(param_int[11]>0) amg_maxiter=param_int[11];} if(param_int.N()>11) {if(param_int[11]>0) cycle_type=param_int[11];} if(param_int.N()>12) {if(param_int[12]>0) smooth_type=param_int[12];} if(param_int.N()>13) {if(param_int[13]>0) smooth_num_levels=param_int[13];} if(param_int.N()>14) {if(param_int[14]>0) smooth_num_sweeps=param_int[14];} if(param_int.N()>15) {if(param_int[15]>0) max_levels = param_int[15];} relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } if(param_double.N()>3) {if(param_double[3]>0) max_row_sum = param_double[3];else max_row_sum=0.9;} else max_row_sum=0.9; if(param_double.N()>4) {if(param_double[4]>0) schwarz_rlx_weight = param_double[4];else schwarz_rlx_weight=1.;} else schwarz_rlx_weight=1.; if(param_int.N()>16) {if(param_int[16]>0) variant = param_int[16];else variant=3;} else variant=3; if(param_int.N()>17) {if(param_int[17]>0) num_functions = param_int[17];else num_functions=1;} else num_functions=1; if(param_int.N()>18) {if(param_int[18]>0) overlap = param_int[18];else overlap=10;} else overlap=10; if(param_int.N()>19) {if(param_int[19]>0) domain_type = param_int[19]; else domain_type= 2;} else domain_type= 2; break; case 1: //Preconditionner PILUT if(param_double.N()>1) {if(param_double[1]>0) drop_tol = param_double[1]; else drop_tol=1e-5;} else drop_tol=1e-5; if(param_int.N()>7) {if(param_int[7]>0) nonzeros_to_keep = param_int[7]; else nonzeros_to_keep=1000;} else nonzeros_to_keep=1000; if(param_int.N()>8) {if(param_int[8]>0) pmax_iter = param_int[8];} if(param_int.N()>9) {if(param_int[9]>0) rrow_size = param_int[9];} break; case 2://Preconditionner ParaSails if(param_double.N()>1) {if(param_double[1]>0) sai_filter = param_double[1];else sai_filter=0.1;} else sai_filter=0.1; if(param_double.N()>2) {if(param_double[2]>0) sai_threshold = param_double[2];else sai_threshold=0.1;} else sai_threshold=0.1; if(param_int.N()>7) {if(param_int[7]>0) max_levels = param_int[7];else max_levels=1;} else max_levels=1; if(param_int.N()>8) {if(param_int[8]>0) sai_sym =param_int[8];else sai_sym=0;} else sai_sym=0; break; case 3: //Preconditionner Schwarz if(param_double.N()>1) {if(param_double[1]>0) schwarz_rlx_weight = param_double[1];schwarz_rlx_weight=1;} else schwarz_rlx_weight=1.; if(param_int.N()>7) {if(param_int[7]>0) variant = param_int[7];else variant=1;} else variant=1; if(param_int.N()>8) {if(param_int[8]>0) overlap = param_int[8];else overlap=1;} else overlap=1; if(param_int.N()>9) {if(param_int[9]>0) domain_type = param_int[9];else domain_type=3;} else domain_type=3; break; default: break; } } if(solver_id==4) // Solver AMG_HYBRID { if(param_double.N()>1) {if(param_double[1]>=0) amg_tol =param_double[1];else amg_tol=1e-9;} else amg_tol=1e-9; if(param_double.N()>2) {if(param_double[2]>=0) cf_tol =param_double[2];else cf_tol= 1e-3;} else cf_tol= 1e-3; if(param_int.N()>1) {if(param_int[1]>=0) solver_type =param_int[1];else solver_type=1;} else solver_type=1; if(param_int.N()>2) {if(param_int[2]>0) dscg_max_its=param_int[2];else dscg_max_its=1000;} else dscg_max_its=1000; if(param_int.N()>3) {if(param_int[3]>0) pcg_max_its=param_int[3];else pcg_max_its=200;} else pcg_max_its=200; if(param_int.N()>4) {if(param_int[4]>0) coarsen_type=param_int[4]; else coarsen_type=6;} else coarsen_type=6; if(param_double.N()>3) {if(param_double[3]>0) strong_threshold = param_double[3]; else strong_threshold=1e-3;} else strong_threshold=1e-3; if(param_double.N()>4) {if(param_double[4]>0) trunc_factor = param_double[4]; else trunc_factor=1e-2;} else trunc_factor=1e-2; if(param_int.N()>5) {if(param_int[5]>0) max_levels = param_int[5]; else max_levels=25;} else max_levels=25; if(param_double.N()>5) {if(param_double[5]>0) max_row_sum = param_double[5];else max_row_sum=0.9;} else max_row_sum=0.9; relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } } if(solver_id==3) { if(param_int.N()>7) {if(param_int[7]>=0) Two_Norm =param_int[7];else Two_Norm=2;} else Two_Norm=2; if(param_int.N()>8) {if(param_int[8]>=0) Rel_change =param_int[8];else Rel_change=1;} else Rel_change=1; } if(solver_id==5) //Solver AMG { if(param_int.N()>7) {if(param_int[7]>=0) amg_interptype =param_int[7];} if(param_int.N()>8) {if(param_int[8]>=0) gsmg_sample =param_int[8];} if(param_int.N()>9) {if(param_int[9]>=0) amg_coarsentype =param_int[9];} if(param_int.N()>10) {if(param_int[10]>=0) measure_type =param_int[10];} if(param_double.N()>2) {if(param_double[2]>0) amg_strongthreshold = param_double[2];} if(param_double.N()>3) {if(param_double[3]>0) trunc_factor = param_double[3];} if(param_int.N()>11) {if(param_int[11]>0) amg_maxiter=param_int[11];} if(param_int.N()>12) {if(param_int[12]>0) cycle_type=param_int[12];} if(param_int.N()>13) {if(param_int[13]>0) smooth_type=param_int[13];} if(param_int.N()>14) {if(param_int[14]>0) smooth_num_levels=param_int[14];} if(param_int.N()>15) {if(param_int[15]>0) smooth_num_sweeps=param_int[15];} if(param_int.N()>16) {if(param_int[16]>0) max_levels = param_int[16];} relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } if(param_double.N()>4) {if(param_double[4]>0) max_row_sum = param_double[4];else max_row_sum=1e-1;} else max_row_sum=1e-1; if(param_double.N()>5) {if(param_double[5]>0) schwarz_rlx_weight = param_double[5];else schwarz_rlx_weight=1.;} else schwarz_rlx_weight=1.; if(param_int.N()>17) {if(param_int[17]>0) variant = param_int[17];else variant=1;} else variant=1; if(param_int.N()>19) {if(param_int[18]>0) num_functions = param_int[18];else num_functions=5;} else num_functions=5; if(param_int.N()>20) {if(param_int[19]>0) overlap = param_int[19];else overlap=1;} else overlap=1; if(param_int.N()>21) {if(param_int[20]>0) domain_type = param_int[20];else domain_type= 1;} else domain_type= 1; } if(param_int.N()>22) {if(param_int[22]>0) VERBOSE = param_int[22];} if(param_int.N()>23) {if(param_int[23]>0) scale = param_int[23]; else scale=1;} else scale=1; if(param_int.N()>24) {if(param_int[24]>0) timing = param_int[24]; else timing=1;} else timing=1; } public : hypreParam() { int i; amg_coarsentype =6; /* Falgout coarsening */ amg_relaxtype =3; /* hybrid Gauss-Seidel or SOR */ amg_interptype=0; /* default*/ amg_maxlevels=25; amg_numsweeps=1; /*default*/ amg_strongthreshold = 0.25;/*suitable for 3D Laplace Operator*/ amg_truncfactor=0.3; amg_prntlevel =1; /* print setup info */ amg_tol=1e-7; //BoomerAMG Tolerance amg_maxiter=1; gsmg_sample=1; //Solver parameter (used for GMRES or BiCGStab) solv_tol = 1.0e-11; solv_maxiter = 1000; solv_kdim =40; solv_log = 0; solv_prntlevel = 2; precond_id=0;//BOOMER AMG solver_id=1; //GMRES as solver VERBOSE=0; scale=1; pmax_iter=30; rrow_size=1000; amg_interptype =0; gsmg_sample =1; amg_coarsentype =6; measure_type =1;amg_strongthreshold=0.25; trunc_factor=1e-2; amg_maxiter=20; cycle_type=1; smooth_type=6; smooth_num_levels=0; smooth_num_sweeps=2; max_levels=25; relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } max_row_sum=0.9; schwarz_rlx_weight=1.; variant=0; num_functions=1; overlap=10; domain_type= 0; } public : hypreParam(char * fileparameter, MPI_Comm comm) { FILE *f; char buf[BUFLEN]; int num; int rk, size; MPI_Comm_rank(comm,&rk); MPI_Comm_size(comm, &size); amg_coarsentype =6; /* Falgout coarsening */ amg_relaxtype =3; /* hybrid Gauss-Seidel or SOR */ amg_interptype=0; /* default*/ amg_maxlevels=25; amg_numsweeps=1; /*default*/ amg_strongthreshold = 0.25;/*suitable for 3D Laplace Operator*/ amg_truncfactor=0.3; amg_prntlevel =1; /* print setup info */ amg_tol=0.0; //BoomerAMG Tolerance amg_maxiter=20; //More complex smoothers (Schwarz methods, Pilut, Parasails, Euclid) smooth_type=6; smooth_numlevels=3; smooth_numsweeps=1; pilut_droptol=1.0e-4; pilut_maxnz=100; schwarz_overlap=10; schwarz_variant=2; schwarz_domaintype=2; //parasails parameter sai_max_levels = 1; sai_threshold = 0.1; sai_filter = 0.05; sai_sym =0; sai_log = 1; //Solver parameter (used for GMRES or BiCGStab) solv_tol = 1.0e-30; solv_maxiter = 80; solv_kdim =40; // int solv_stopcrit = 1; //only for BiCGSTAB solv_log = 0; solv_prntlevel = 0; precond_id=0;//BOOMER AMG solver_id=1; //GMRES as solver VERBOSE=0; scale=1; if(fileparameter==NULL) { if(rk==0) printf("%s","Set default parameter because you not precise the parameter file \n \n"); solver_id=1; //GMRES as solver precond_id=0;//BOOMER AMG } else if( (f=fopen(fileparameter,"r") )==NULL) { if(rk==0)printf("%s","Set default parameter because your parameter file not exist \n \n"); solver_id=1; //GMRES as solver precond_id=0;//BOOMER AMG } else { if(rk==0) printf("%s%s%s","Read parameter from file ", fileparameter, "\n \n"); num =0; while(fgets(buf, BUFLEN, f) != NULL) { switch(num) { case 0: sscanf(buf, "%s", solver); break; case 1: sscanf(buf, "%d", &solver_id); break; case 2: sscanf(buf, "%lf", &solv_tol); break; case 3: sscanf(buf, "%d", &solv_maxiter); break; case 4: sscanf(buf, "%d", &solv_prntlevel); break; case 5: sscanf(buf, "%d", &solv_log); if(solver_id!=1) {fgets(buf, BUFLEN, f);num++;} break; case 6: sscanf(buf, "%d", &solv_kdim); break; case 7: sscanf(buf, "%s", precon); break; case 8: sscanf(buf, "%d", &precond_id); if(precond_id==2) //The parameter of preconditionner is inside file { fclose(f); exit(1); } break; case 9: if(precond_id==0) sscanf(buf, "%d", &amg_coarsentype); if(precond_id==1) sscanf(buf, "%lf", &sai_threshold); break; case 10: if(precond_id==0) sscanf(buf, "%d", &amg_prntlevel); if(precond_id==1) sscanf(buf, "%d", &sai_max_levels); break; case 11: if(precond_id==0) sscanf(buf, "%d", &amg_interptype); if(precond_id==1) sscanf(buf, "%lf", &sai_filter); break; case 12: if(precond_id==0) sscanf(buf, "%d", &amg_maxlevels); if(precond_id==1) case 17: sscanf(buf, "%d", &amg_prntlevel); break; case 18: sscanf(buf, "%lf", &amg_tol); break; case 19: sscanf(buf, "%d", &amg_maxiter); break; case 20: sscanf(buf, "%d", &scale); break; default: break; } num++; } if(fclose(f)==EOF) printf("%s","Error while closing the file \n"); else printf("%s","File is well close \n"); } } }; class HypreSolver : public MatriceMorse::VirtualSolver { mutable HYPRE_IJMatrix ij_A; mutable HYPRE_IJVector ij_B; mutable HYPRE_IJVector ij_X; mutable HYPRE_ParCSRMatrix par_A; mutable HYPRE_ParVector par_B; mutable HYPRE_ParVector par_X; void *object; HYPRE_ParCSRMatrix parcsr_A; string data_option; mutable int time_index,time_index1; mutable HYPRE_Solver solver; mutable HYPRE_Solver precond; mutable hypreParam *param; mutable double *scaletmpr, *scaletmpc; mutable int rk,size; int jlower, jupper; int ilower, iupper; mutable int num_iter; mutable double final_res_norm; mutable double tgv,eps,tol_pivot,tol_pivot_sym,epsr; sparse_mat_loc A_loc; mutable int *iwork, *maptmp, *mapptr, *iwork1,*riord; mutable int n_loc,n,VERBOSE; mutable MPI_Comm comm; mutable int pcg_num_its,dscg_num_its; public: HypreSolver(const MatriceMorse &AA,string datafile, KN ¶m_int, KN ¶m_double, MPI_Comm * mpicommw ) { int i,j,ierrr; if(mpicommw==NULL){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; /*****INITIALIZE MPI ENVIRONMENT*****/ ierrr = MPI_Comm_rank(comm, &rk); ierrr = MPI_Comm_size(comm, &size); if(((param_double!=NULL)||(param_int!=NULL))&&(datafile.empty())) { if(rk==0) cout << "#########PARAMETERS ARE SET INSIDE A VECTOR###"<< endl; param=new hypreParam(param_int,param_double); } if((datafile.empty())&&((param_int==NULL)&&(param_double==NULL))) { if(rk==0) cout << "###########DEFAULT PARAMETERS WILL BE SET#######"<< endl; param= new hypreParam(); } if((!datafile.empty())&&((param_int==NULL)&&(param_double==NULL))) { if(rk==0) cout << "#########PARAMETERS ARE INSIDE A FILE#########"<< endl; char *p; p=new char[datafile.length()+1]; strcpy(p,datafile.c_str()); param= new hypreParam(p,comm); } /*################################################### USING HYPRE ####################################################*/ int n,nnz, *pr, *p,ierr; double * AAv; n=AA.n; nnz=AA.nbcoef; /*################################################## COPY ENTRY MATRIX ##################################################*/ if(param->timing){ time_index = hypre_InitializeTiming("MATRIX DISTRIBUTION"); hypre_BeginTiming(time_index); } pr= new int[n+1];p= new int[nnz]; AAv=new double[nnz]; for(i=0;iscale) { job = 1; /*-- compute 1-norm */ tmp = 2; /*-- compute 2-norm */ scaletmpr=new double[n]; scaletmpc=new double[n]; roscal(n,job,tmp,AAv,p,pr,scaletmpr,&ierr); if (ierr) fprintf(stderr, "ERROR: IN ROSCAL, IERR = %d\n", ierr); /*------- scale the RHS according to row scaling coefficients */ coscal(n,job,tmp,AAv,p,pr,scaletmpc,&ierr); if (ierr) fprintf(stderr, "ERROR : IN COSCAL, IERR = %d\n", ierr); } /*--- end of branch on scaling */ /************************************************************* Distribute input matrix into local structures *************************************************************/ int type=0,wgtflag=0, numflag=0, volume; //0=CSR; 1=CSC int option[5]; option[0]=0; riord=(int *)malloc(sizeof(int)*n); if(riord==NULL){if(rk==0) printf("%s","IN PARTITION , MEMORY ALLOCATION FAILED \n");exit(1);} /************************USE METIS FOR DATA DISTRIBUTION**************************/ if(size>1) METIS_PartGraphKway(&n, pr, p, NULL, NULL, &wgtflag, &numflag,&size, option, &volume, riord); else if(size==1){ for (i=0; itiming){ hypre_EndTiming(time_index); hypre_PrintTiming("IJ Matrix Setup", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } /************************************************************* Create preconditioner Setup and Use solver **************************************************************/ param->timing=1; switch(param->solver_id){ case 0 : //BiCGStab solver HYPRE_ParCSRBiCGSTABCreate(comm, &solver); HYPRE_ParCSRBiCGSTABSetTol(solver, param->solv_tol); HYPRE_ParCSRBiCGSTABSetMaxIter(solver, param->solv_maxiter); //HYPRE_ParCSRBiCGSTABSetStopCrit(solver, solv_stopcrit); HYPRE_ParCSRBiCGSTABSetPrintLevel(solver, param->solv_prntlevel); HYPRE_ParCSRBiCGSTABSetLogging(solver, param->solv_log); //Set Preconditioner switch (param->precond_id){ case 0 : //set BoomerAMG as preconditioner if(rk==0) printf("SOLVER: BOOMERAMG-BiCGSTAB\n"); HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetInterpType(precond, param->amg_interptype); HYPRE_BoomerAMGSetTol(precond, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(precond, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(precond,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(precond,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(precond, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(precond,param->cycle_type); HYPRE_BoomerAMGSetSmoothType(precond,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(precond,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond,param->max_row_sum); HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type); HYPRE_BiCGSTABSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); break; case 4: /*use diagonal scaling as preconditioner*/ if(rk==0) printf("SOLVER: DS-BiCGSTAB\n"); precond=NULL; HYPRE_ParCSRBiCGSTABSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScaleSetup, precond); break; case 1: /*Use PILUT as preconditioner*/ if(rk==0) printf("SOLVER: PILUT-BiCGSTAB\n"); ierr=HYPRE_ParCSRPilutCreate(comm,&precond); if(ierr) printf("ERROR: PILUT-BiCGSTAB\n"); if(param->drop_tol>=0) HYPRE_ParCSRPilutSetDropTolerance(precond,param->drop_tol); if(param->nonzeros_to_keep>=0) HYPRE_ParCSRPilutSetFactorRowSize(precond,param->nonzeros_to_keep); HYPRE_ParCSRBiCGSTABSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSetup, precond); break; case 2: if(rk==0) printf("SOLVER: ParaSails-BicGSTAB\n"); ierr=HYPRE_ParaSailsCreate(comm,&precond); if(ierr) printf("ERROR: ParaSails-BicGSTAB\n"); HYPRE_ParaSailsSetParams(precond,param->sai_threshold,param->max_levels); HYPRE_ParaSailsSetFilter(precond,param->sai_filter); HYPRE_ParaSailsSetSym(precond,param->sai_sym); HYPRE_ParCSRBiCGSTABSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSetup, precond); break; case 3: if(rk==0) printf("SOLVER: Schwarz-PCG \n"); HYPRE_SchwarzCreate(&precond); HYPRE_SchwarzSetVariant(precond,param->variant); HYPRE_SchwarzSetOverlap(precond,param->overlap); HYPRE_SchwarzSetDomainType(precond,param->domain_type); //HYPRE_SchwarzSetRelaxWeight(precond,param->schwarz_rlx_weight); /*HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type);*/ HYPRE_BiCGSTABSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, precond); break; default: break; } break; case 2:/*USE PCG AS SOLVER*/ HYPRE_ParCSRPCGCreate(comm, &solver); HYPRE_ParCSRPCGSetTol(solver, param->solv_tol); HYPRE_PCGSetMaxIter(solver, param->solv_maxiter); HYPRE_PCGSetPrintLevel(solver, param->solv_prntlevel); HYPRE_PCGSetTwoNorm(solver, param->Two_Norm); HYPRE_PCGSetRelChange(solver,param->Rel_change); HYPRE_PCGGetPrecond(solver,&precond); switch (param->precond_id){ case 0 : //set BoomerAMG as preconditioner in PCG if(rk==0) printf("SOLVER: AMG-PCG\n"); HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetInterpType(precond, param->amg_interptype); HYPRE_BoomerAMGSetTol(precond, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(precond, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(precond,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(precond,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(precond, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(precond,param->cycle_type); HYPRE_BoomerAMGSetSmoothType(precond,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(precond,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond,param->max_row_sum); HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type); HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); break; case 2: if(rk==0) printf("SOLVER: ParaSails-PCG\n"); ierr=HYPRE_ParaSailsCreate(comm,&precond); if(ierr) printf("ERROR: ParaSails-PCG\n"); HYPRE_ParaSailsSetParams(precond,param->sai_threshold,param->max_levels); HYPRE_ParaSailsSetFilter(precond,param->sai_filter); HYPRE_ParaSailsSetSym(precond,param->sai_sym); HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, precond); break; case 3: if(rk==0) printf("SOLVER: Schwarz-PCG \n"); HYPRE_SchwarzCreate(&precond); HYPRE_SchwarzSetVariant(precond,param->variant); HYPRE_SchwarzSetOverlap(precond,param->overlap); HYPRE_SchwarzSetDomainType(precond,param->domain_type); //HYPRE_SchwarzSetRelaxWeight(precond,param->schwarz_rlx_weight); /*HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type);*/ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, precond); break; default: break; } break; case 5: if(rk==0) printf("SOLVER: AMG \n"); HYPRE_BoomerAMGCreate(&solver); HYPRE_BoomerAMGSetInterpType(solver, param->amg_interptype); HYPRE_BoomerAMGSetNumSamples(solver, param->gsmg_sample); HYPRE_BoomerAMGSetTol(solver, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(solver, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(solver,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(solver, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(solver,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(solver, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(solver,param->cycle_type); HYPRE_BoomerAMGSetRelaxWeight(solver,param->relax_weight); HYPRE_BoomerAMGSetOmega(solver,param->omega); HYPRE_BoomerAMGSetSmoothType(solver,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(solver,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(solver,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(solver,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(solver,param->max_row_sum); HYPRE_BoomerAMGSetVariant(solver, param->variant); // HYPRE_BoomerAMGSetNumFunctions(solver, param->num_functions); //HYPRE_BoomerAMGSetSchwarzRlxWeight(solver,param->schwarz_rlx_weight); HYPRE_BoomerAMGSetOverlap(solver, param->overlap); HYPRE_BoomerAMGSetVariant(solver, param->domain_type); /* if(param->num_functions>1) HYPRE_BoomerAMGSetDofFunc(solver,param->dof_func);*/ break; case 4: if(rk==0) printf("SOLVER: AMG_HYBRID \n"); HYPRE_ParCSRHybridCreate(&solver); HYPRE_ParCSRHybridSetTol(solver, param->amg_tol); HYPRE_ParCSRHybridSetCoarsenType(solver,param->coarsen_type); HYPRE_ParCSRHybridSetStrongThreshold(solver, param->strong_threshold); HYPRE_ParCSRHybridSetTruncFactor(solver,param->trunc_factor); HYPRE_ParCSRHybridSetDSCGMaxIter(solver,param->dscg_max_its); HYPRE_ParCSRHybridSetPCGMaxIter(solver,param->pcg_max_its); HYPRE_ParCSRHybridSetConvergenceTol(solver, param->cf_tol); HYPRE_ParCSRHybridSetSolverType(solver, param->solver_type); HYPRE_ParCSRHybridSetRelaxWeight(solver,param->relax_weight); HYPRE_ParCSRHybridSetOmega(solver,param->omega); HYPRE_ParCSRHybridSetMaxLevels(solver,param->max_levels); HYPRE_ParCSRHybridSetMaxRowSum(solver,param->max_row_sum); break; case 1:/*GMRES AS SOLVER*/ HYPRE_ParCSRFlexGMRESCreate (comm, &solver); HYPRE_ParCSRFlexGMRESSetPrintLevel(solver,VERBOSE); HYPRE_ParCSRFlexGMRESSetKDim(solver,param->solv_kdim); HYPRE_ParCSRFlexGMRESSetMaxIter(solver, param->solv_maxiter ); HYPRE_ParCSRFlexGMRESSetTol(solver,param->solv_tol ); HYPRE_FlexGMRESSetLogging(solver, param->solv_log); HYPRE_ParCSRGMRESSetPrintLevel(solver,param->solv_prntlevel); //Set Preconditioner switch (param->precond_id){ case 0 : //set BoomerAMG as preconditioner if(rk==0) printf("SOLVER: AMG-GMRES\n"); HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetInterpType(precond, param->amg_interptype); // HYPRE_BoomerAMGSetTol(precond, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(precond, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(precond,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(precond,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(precond, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(precond,param->cycle_type); HYPRE_BoomerAMGSetSmoothType(precond,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(precond,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond,param->max_row_sum); HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type); HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSetup, precond); break; case 4: /*use diagonal scaling as preconditioner*/ if(rk==0) printf("SOLVER: DS-GMRES\n"); precond = NULL; HYPRE_ParCSRFlexGMRESSetPrecond (solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScaleSetup, precond); break; case 1: /*Use PILUT as preconditioner*/ if(rk==0) printf("SOLVER: PILUT-GMRES\n"); ierr=HYPRE_ParCSRPilutCreate(comm,&precond); HYPRE_ParCSRPilutSetMaxIter(precond,param->pmax_iter); if(param->drop_tol>=0) HYPRE_ParCSRPilutSetDropTolerance(precond,param->drop_tol); if(param->nonzeros_to_keep>=0) HYPRE_ParCSRPilutSetFactorRowSize(precond,param->nonzeros_to_keep); if(ierr) printf("ERROR: PILUT-GMRES \n"); HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSetup, precond); break; case 3: if(rk==0) printf("SOLVER: Schwarz-GMRES \n"); HYPRE_SchwarzCreate(&precond); HYPRE_SchwarzSetVariant(precond,param->variant); HYPRE_SchwarzSetOverlap(precond,param->overlap); HYPRE_SchwarzSetDomainType(precond,param->domain_type); //HYPRE_SchwarzSetRelaxWeight(precond,param->schwarz_rlx_weight); /*HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type);*/ HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToParSolverFcn) HYPRE_SchwarzSetup, precond); break; case 2: if(rk==0) printf("SOLVER: ParaSails-GMRES\n"); ierr=HYPRE_ParaSailsCreate(comm,&precond); if(ierr) printf("ERROR: ParaSails-GMRES\n"); HYPRE_ParaSailsSetParams(precond,param->sai_threshold,param->max_levels); HYPRE_ParaSailsSetFilter(precond,param->sai_filter); HYPRE_ParaSailsSetSym(precond,param->sai_sym); HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSetup, precond); break; } default: break; } } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; int i, i1,i2; int *row,*row1; double * b_loc,*X_loc,*rhs,*xx; n=AA.n; rhs= (double *)malloc(sizeof(double)*n); xx= (double *)malloc(sizeof(double)*n); x= (double *)malloc(sizeof(double)*n); i1=ilower; i2=iupper; double t2,t1; for(i=0;iscale) for(i = 0; i < n; i++) rhs[i] *= scaletmpr[i]; b_loc=(double *)malloc(n_loc*sizeof(double)); X_loc=(double *)malloc(n_loc*sizeof(double)); row=(int *)malloc(n_loc*sizeof(int)); row1=(int *)malloc(n_loc*sizeof(int)); for(i=i1;i <=i2; i++){ // node = maptmp[i]; b_loc[i-i1]=rhs[i]; X_loc[i-i1]=0.0; //Initial Guest row[i-i1]=i; //used to get results later row1[i-i1]=i; } int ierr=0; HYPRE_IJVectorCreate(comm, ilower, iupper, &ij_B); HYPRE_IJVectorCreate(comm, ilower, iupper, &ij_X); HYPRE_IJVectorSetObjectType(ij_B, HYPRE_PARCSR); HYPRE_IJVectorSetObjectType(ij_X, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_B); HYPRE_IJVectorInitialize(ij_X); HYPRE_IJVectorSetValues(ij_B, n_loc, row, b_loc); HYPRE_IJVectorSetValues(ij_X, n_loc, row, X_loc); HYPRE_IJVectorAssemble(ij_B); HYPRE_IJVectorAssemble(ij_X); ierr=HYPRE_IJVectorGetObject(ij_B, (void **) &par_B); ierr=HYPRE_IJVectorGetObject(ij_X, (void **) &par_X); switch (param->solver_id){ case 0 : //BICGSTAB solver if(param->timing){ time_index1 = hypre_InitializeTiming("BiCGSTAB SETUP"); hypre_BeginTiming(time_index1); } HYPRE_ParCSRBiCGSTABSetup (solver, par_A, par_B, par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("BiCGSTAB SETUP TIME", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR BICGSTAB Solver"); hypre_BeginTiming(time_index1);} HYPRE_ParCSRBiCGSTABSolve (solver, par_A, par_B, par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("SOLVE PHASE TIMES", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_ParCSRBiCGSTABGetNumIterations(solver, &num_iter); HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm(solver, &final_res_norm); //HYPRE_ParCSRBiCGSTABDestroy(solver); break; case 1 : //GMRES Solver if(param->timing){ time_index1 = hypre_InitializeTiming("GMRES SETUP"); hypre_BeginTiming(time_index1); } HYPRE_FlexGMRESSetup(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index); hypre_PrintTiming("SETUP PHASE TIME", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR GMRES Solver"); hypre_BeginTiming(time_index1); } HYPRE_FlexGMRESSolve(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_GMRESGetNumIterations(solver, &num_iter); HYPRE_GMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); //HYPRE_ParCSRGMRESDestroy(solver); break; case 2 : //PCG if(param->timing){ time_index1 = hypre_InitializeTiming("PCG SETUP"); hypre_BeginTiming(time_index1); } HYPRE_PCGSetup(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index); hypre_PrintTiming("SETUP PHASE TIME", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR PCG Solve"); hypre_BeginTiming(time_index1);} HYPRE_PCGSolve(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_ParCSRPCGGetNumIterations(solver,&dscg_num_its); HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(solver,&final_res_norm); break; case 4: if(param->timing){ time_index1 = hypre_InitializeTiming("HYBRID SETUP"); hypre_BeginTiming(time_index1); } HYPRE_ParCSRHybridSetup(solver,par_A,par_B,par_X); if(param->timing){ hypre_EndTiming(time_index); hypre_PrintTiming("SETUP PHASE TIME", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR Hybrid Solve"); hypre_BeginTiming(time_index1);} HYPRE_ParCSRHybridSolve(solver,par_A,par_B,par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_ParCSRHybridGetNumIterations(solver,&num_iter); HYPRE_ParCSRHybridGetPCGNumIterations(solver,&pcg_num_its); HYPRE_ParCSRHybridGetDSCGNumIterations(solver,&dscg_num_its); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(solver,&final_res_norm); if(rk==0){ printf("\n"); printf("Iterations = %d\n", num_iter); printf("PCG_Iterations = %d\n", pcg_num_its); printf("DSCG_Iterations = %d\n", dscg_num_its); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } break; case 5: if(param->timing){ time_index1 = hypre_InitializeTiming("BoomerAMG SETUP"); hypre_BeginTiming(time_index1); } HYPRE_BoomerAMGSetup(solver,par_A, par_B,par_X); if(param->timing){ time_index1 = hypre_InitializeTiming("BoomerAMG SETUP Solve"); hypre_BeginTiming(time_index1);} HYPRE_BoomerAMGSolve(solver,par_A,par_B,par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} break; default : break; } /*Reconstruction of vector*/ delete [] iwork1; delete []mapptr; iwork1=new int[size+1]; mapptr=new int[size+1]; int disp=0; for(i=0;iscale) x[i]=x[i]*scaletmpc[i];} if(verbosity==0) { MPI_Barrier(comm); t2 = dwalltime(); t2=t2-t1; MPI_Reduce(&t2, &t1, 1, MPI_DOUBLE, MPI_MAX, 0,comm); MPI_Bcast(&t1, 1, MPI_DOUBLE,0,comm); if(rk==0){printf("%s%18.6g%s","TIME FOR SOLVING ", fabs(t1) ,"\n \n"); printf("%s%18.6g%s","RELATIVE RESIDU ", final_res_norm ,"\n \n"); printf("%s%d%s","NUMBER OF ITERATION ", num_iter ," \n \n"); } } if(X_loc!=NULL) free(X_loc); if(rhs!=NULL) free(rhs); if(xx!=NULL) free(xx); if(b_loc!=NULL) free(b_loc); if(row!=NULL) free(row); if(iwork1!=NULL) delete [] iwork1; if(mapptr!=NULL) delete [] mapptr; } ~HypreSolver() { if(verbosity){ cout << "~HypreSolver():" << endl; HYPRE_IJMatrixDestroy(ij_A); HYPRE_IJVectorDestroy(ij_B); HYPRE_IJVectorDestroy(ij_X); switch (param->solver_id){ case 0 : //BICGSTAB solver HYPRE_ParCSRBiCGSTABDestroy(solver); switch(param->precond_id){ case 0: HYPRE_BoomerAMGDestroy(precond); break; case 5: HYPRE_ParaSailsDestroy(precond); break; case 6: HYPRE_SchwarzDestroy(precond); break; case 4: HYPRE_ParCSRPilutDestroy(precond); break; default: break; } break; case 1 : //GMRES Solver HYPRE_ParCSRFlexGMRESDestroy(solver); switch(param->precond_id){ case 0: HYPRE_BoomerAMGDestroy(precond); break; case 5: HYPRE_ParaSailsDestroy(precond); break; case 6: HYPRE_SchwarzDestroy(precond); break; case 4: HYPRE_ParCSRPilutDestroy(precond); break; default: break; } break; case 3 : //PCG HYPRE_ParCSRPCGDestroy(solver); switch(param->precond_id){ case 0: HYPRE_BoomerAMGDestroy(precond); break; case 5: HYPRE_ParaSailsDestroy(precond); break; case 6: HYPRE_SchwarzDestroy(precond); break; default: break; } break; case 4: //AMG-Hybrid HYPRE_ParCSRHybridDestroy(solver); break; case 5: //AMG HYPRE_BoomerAMGDestroy(solver); break; default : break; } } } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; inline MatriceMorse::VirtualSolver * BuildHypreSolver(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverHypre>" << endl; return new HypreSolver(*A,ds.data_filename, ds.lparams, ds.dparams,(MPI_Comm *)ds.commworld); } class Init { public: Init(); }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return 1; } bool SetHypreSolver() { if(verbosity>1) cout << " SetDefault sparse solver to Hyprempi" << endl; DefSparseSolver::solver =BuildHypreSolver; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return 1; } Init init; Init::Init() { SparseMatSolver_R= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Hyprempi, defaultsolver defaultsolverHyprempi" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildHypreSolver; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoHyprempi","(",new OneOperator0(SetHypreSolver)); } freefem++-3.38-1/src/solver/makefile000644 000767 000024 00000007235 11406142256 017415 0ustar00hechtstaff000000 000000 include makefile-sparsesolver.inc #Creation of Hips dynamic librairy hips : $(MPICC) -c $(CFLAGS) $(CFLAGS_HIPS) $(FREEFEM_INCLUDE) $(HIPS_INCLUDE) $(METIS_INCLUDE) $(HIPS_OTHER_INCLUDE) hips_FreeFem.cpp $(MPIFC)$ $(FFLAGS) hips_FreeFem.o -o hips_FreeFem.$(SUF) $(HIPS_ALL_LIBS) $(BLAS_LIB) $(METIS_LIB) $(HIPS_OTHER_LIB) parms : $(MPICC) -c $(CFLAGS) $(CFLAGS_PARMS) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(PARMS_INCLUDE) $(METIS_INCLUDE) $(PARMS_OTHER_INCLUDE) parms_FreeFem.cpp $(MPIFC)$ $(FFLAGS) parms_FreeFem.o -o parms_FreeFem.$(SUF) $(PARMS_LIB) $(BLAS_LIB) $(METIS_LIB) $(PARMS_OTHER_LIB) hypre : $(MPICC) -c $(CFLAGS) $(CFLAGS_HYPRE) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(HYPRE_INCLUDE) $(METIS_INCLUDE) $(HYPRE_OTHER_INCLUDE) hypre_FreeFem.cpp $(MPIFC)$ $(FFLAGS) hypre_FreeFem.o -o hypre_FreeFem.$(SUF) $(HYPRE_LIB) $(BLAS_LIB) $(METIS_LIB) $(HYPRE_OTHER_LIB) mumps : $(MPICC) -c $(CFLAGS) $(CFLAGS_MUMPS) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(MUMPS_OTHER_INCLUDE) $(MUMPS_INCLUDE) $(SCOTCH_INCLUDE) MUMPS_FreeFem.cpp $(MPIFC) $(FFLAGS) $(MPI_INCLUDE) $(MUMPS_OTHER_INCLUDE) $(MUMPS_INCLUDE) MUMPS_FreeFem.o -o MUMPS_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(BLACS_LIB) $(SCALAPACK_LIB) $(METIS_LIB) $(PORD_LIB) $(SCOTCH_LIB) $(MUMPS_LIB) $(MUMPS_OTHER_LIB) # rpastix_dist: $(MPICC) -c $(CFLAGS) $(CFLAGS_PASTIX) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(PTSCOTCH_INCLUDE) $(REAL_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) real_dpastix_FreeFem.cpp $(MPIFC) $(FFLAGS) $(PTSCOTCH_INCLUDE) $(REAL_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) real_dpastix_FreeFem.o -o real_dpastix_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(PTSCOTCH_LIB) $(METIS_LIB) $(REAL_PASTIX_LIB) $(PASTIX_OTHER_LIB) rpastix: $(MPICC) -c $(CFLAGS) $(CFLAGS_PASTIX) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(SCOTCH_INCLUDE) $(REAL_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) real_pastix_FreeFem.cpp $(MPIFC) $(FFLAGS) $(SCOTCH_INCLUDE) $(REAL_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) real_pastix_FreeFem.o -o real_pastix_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(SCOTCH_LIB) $(METIS_LIB) $(REAL_PASTIX_LIB) $(PASTIX_OTHER_LIB) cpastix_dist: $(MPICC) -c $(CFLAGS) $(CFLAGS_PASTIX) -Wno-deprecated $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(SCOTCH_INCLUDE) $(COMPLEX_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) complex_dpastix_FreeFem.cpp $(MPIFC) $(FFLAGS) $(PTSCOTCH_INCLUDE) $(COMPLEX_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) complex_dpastix_FreeFem.o -o complex_dpastix_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(PTSCOTCH_LIB) $(METIS_LIB) $(COMPLEX_PASTIX_LIB) $(PASTIX_OTHER_LIB) cpastix: $(MPICXX) -c $(CFLAGS) $(CFLAGS_PASTIX) -Wno-deprecated $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(SCOTCH_INCLUDE) $(COMPLEX_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) complex_pastix_FreeFem.cpp $(MPIFC) $(FFLAGS) $(SCOTCH_INCLUDE) $(COMPLEX_PASTIX_INCLUDE) $(PASTIX_OTHER_INCLUDE) complex_pastix_FreeFem.o -o complex_pastix_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(SCOTCH_LIB) $(METIS_LIB) $(COMPLEX_PASTIX_LIB) $(PASTIX_OTHER_LIB) rsludist: $(MPICC) -c $(CFLAGS) $(CFLAGS_SLUDIST) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(SLUDIST_INCLUDE) $(SLUDIST_OTHER_INCLUDE) real_SuperLU_DIST_FreeFem.cpp $(MPIFC) $(FFLAGS) $(SLUDIST_INCLUDE) $(SLUDIST_OTHER_INCLUDE) real_SuperLU_DIST_FreeFem.o -o real_SuperLU_DIST_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(PARMETIS_LIB) $(METIS_LIB) $(SLUDIST_LIB) $(SLUDIST_OTHER_LIB) csludist: $(MPICC) -c $(CFLAGS) $(CFLAGS_SLUDIST) $(MPI_INCLUDE) $(FREEFEM_INCLUDE) $(SLUDIST_INCLUDE) $(SLUDIST_OTHER_INCLUDE) complex_SuperLU_DIST_FreeFem.cpp $(MPIFC) $(FFLAGS) $(SLUDIST_INCLUDE) $(SLUDIST_OTHER_INCLUDE) complex_SuperLU_DIST_FreeFem.o -o complex_SuperLU_DIST_FreeFem.$(SUF) $(MPI_LIB) $(BLAS_LIB) $(PARMETIS_LIB) $(METIS_LIB) $(SLUDIST_LIB) $(SLUDIST_OTHER_LIB) freefem++-3.38-1/src/solver/makefile-common.inc000644 000767 000024 00000003540 11641125340 021442 0ustar00hechtstaff000000 000000 ########################################################## # # common variable for the different parallel sparse solver # ######################################################### # frefem++ variables FREEFEM_DIR = /Volumes/Ike/cazeaux/ff++/ FREEFEM_INCLUDE = -I$(FREEFEM_DIR)examples++-load/include/ # directory of the different package SOFT_DIR = $(FREEFEM_DIR)download/ #========== # BLAS #========== BLAS_INCLUDE = BLAS_LIB = -L$(SOFT_DIR)BLAS/blas_LINUX.a #============ # BLACS : this library is need by MUMPS #============ BLACS_DIR = $(SOFT_DIR)/BLACS/ BLACS_INCLUDE = BLACS_LIB = -L$(BLACS_DIR)LIB/ -lblacsCinit_MPI-BROCHET-0 -lblacs_MPI-BROCHET-0 -lblacsF77init_MPI-BROCHET-0 #============= # SCALAPACK : this library is need by MUMPS #============= SCALAPACK_DIR = $(SOFT_DIR)/scalapack-1.8.0/ SCALAPACK_INCLUDE = -I$(SCALAPACK_DIR)SRC/ SCALAPACK_LIB = -L$(SCALAPACK_DIR) -lscalapack #============================================== # ordering : metis, parmetis, scotch #=============================================== # pord : this ordering is given in the mumps package # and it is only need by MUMPS #PORD_DIR = $(SOFT_DIR)MUMPS_4.8.3/PORD/ #PORD_INCLUDE = -I$(PORD_DIR)include #PORD_LIB = -L$(PORD_DIR)lib/ -lpord # scotch SCOTCH_DIR = $(SOFT_DIR)/scotch_5.1_esmumps/ SCOTCH_INCLUDE = -I$(SCOTCH_DIR)include/ SCOTCH_LIB = -L$(SCOTCH_DIR)lib/ -lesmumps -lscotch -lscotcherr -lscotcherrexit -lm # ptscotch PTSCOTCH_INCLUDE = -I$(SCOTCH_DIR)include/ PTSCOTCH_LIB = -L$(SCOTCH_DIR)lib/ -lptscotch -lptscotcherrexit -lm # metis METIS_DIR = $(SOFT_DIR)metis-4.0/ METIS_INCLUDE = -I$(METIS_DIR)Lib/ METIS_LIB = -L$(METIS_DIR) -lmetis # parmetis PARMETIS_DIR = $(SOFT_DIR)ParMetis-3.1.1/ PARMETIS_INCLUDE = -I$(PARMETIS_DIR) PARMETIS_LIB = -L$(PARMETIS_DIR) -lparmetis -lmetis freefem++-3.38-1/src/solver/makefile-sparsesolver.inc000644 000767 000024 00000025673 11641125340 022715 0ustar00hechtstaff000000 000000 #// ORIG-DATE: 02/2009 #// -*- Mode : c++ -*- #// #// SUMMARY : #// USAGE : LGPL #// ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE #// AUTHOR : Jacques Morice #// E-MAIL : jacques.morice@ann.jussieu.fr #// #/* # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # Thank to the ARN () FF2A3 grant # ref:ANR-07-CIS7-002-01 # */ ##################################################### # SECTION 1: # General variables to compile sparse solver ##################################################### # Note :: A remplir automatique avec automake # Regarder notation de FreeFem++ ################### # Compiler ################### # C compiler CC = gcc MPICC = /usr/local/bin/mpicc # C++ compiler CXX = g++ MPICXX = /usr/local/bin/mpicxx # Fortran compiler FC = fort77 MPIFC = /usr/local/bin/mpif77 #mpifort77 #/Users/morice/librairie/openmpi/bin/mpif90 --prefix /Users/morice/librairie/openmpi/ FC_LIB = -L/usr/local/lib -lmpi_f77 # Linker MPILD = # directory of include file for mpi MPI_INCLUDE = /I/usr/local/include #-I/Users/morice/librairie/openmpi/include/ MPI_LIB = -L/usr/local/lib -lmpi -lmpi_cxx -lmpi_f77 -lmpi_f90 -lopen-rte -lopen-pal ############### # FLAGS ############### # LDFLAGS_FREEFEM = -bundle -undefined dynamic_lookup -DNDEBUG -g -DDRAWING -DBAMG_LONG_LONG -DCHECK_KN -fno-inline -fexceptions -I/usr/X11/include/ CFLAGS_FREEFEM = -DNDEBUG -g -DDRAWING -DBAMG_LONG_LONG -DCHECK_KN -fno-inline -fexceptions -I/usr/X11/include/ # CFLAGS = $(CFLAGS_FREEFEM) # Additional C compiler flags FFLAGS = $(LDFLAGS_FREEFEM) # Additional Fortran compiler flags LDFLAGS = $(LDFLAGS_FREEFEM) # linker flags COPTFLAGS = -O3 # Optimization flags FOPTFLAGS = -O3 # LDOPTFLAGS = -O3 # # SUFFIX OF DYNAMIC LIBRARY # linux SUF = so # windows SUF = dll # mac osx SUF = dylib SUF = dylib ########################################################## # SECTION 2: # common variable for the different parallel sparse solver # ######################################################### # frefem++ variables FREEFEM_DIR = /Volumes/Ike/cazeaux/ff++/ FREEFEM_INCLUDE = -I$(FREEFEM_DIR)examples++-load/include/ FREEFEM_INCLUDE = -I$(FREEFEM_DIR)examples++-load/include/ # directory of the different package #SOFT_DIR = /Users/morice/librairie/ SOFT_DIR = $(FREEFEM_DIR)/download/ #========== # BLAS #========== BLAS_INCLUDE = BLAS_LIB = -L$(FREEFEM_DIR)ff++/src/solver/PATCHVECLIB/libwrapperdostblas.a -framework veclib #============ # BLACS : this library is need by MUMPS #============ BLACS_DIR = $(SOFT_DIR) BLACS_INCLUDE = BLACS_LIB = -L$(BLACS_DIR)lib/ -lblacsCinit_MPI-FREEFEM-0 -lblacs_MPI-FREEFEM-0 -lblacsF77init_MPI-FREEFEM-0 #============= # SCALAPACK : this library is need by MUMPS #============= SCALAPACK_DIR = $(SOFT_DIR) SCALAPACK_INCLUDE = -I$(SCALAPACK_DIR)include/ SCALAPACK_LIB = -L$(SCALAPACK_DIR)lib/ -lscalapack #============================================== # ordering : metis, parmetis, scotch #=============================================== # scotch SCOTCH_DIR = $(SOFT_DIR) SCOTCH_INCLUDE = -I$(SCOTCH_DIR)include/ SCOTCH_LIB = -L$(SCOTCH_DIR)lib/ -lesmumps -lscotch -lscotcherr -lscotcherrexit -lm # ptscotch PTSCOTCH_INCLUDE = -I$(SCOTCH_DIR)include/ PTSCOTCH_LIB = -L$(SCOTCH_DIR)lib/ -lptscotch -lptscotcherrexit -lm # metis METIS_DIR = $(SOFT_DIR) METIS_INCLUDE = -I$(METIS_DIR)include/metis/ METIS_LIB = -L$(METIS_DIR)lib -lmetis # parmetis PARMETIS_DIR = $(SOFT_DIR) PARMETIS_INCLUDE = -I$(PARMETIS_DIR)include/ PARMETIS_LIB = -L$(PARMETIS_DIR)lib/ -lparmetis -lmetis ########################################### # SECTION 3: # ITERATIVE/PRECONDITIONNER SPARSE SOLVER # ########################################### # HIPS ########################################### # To compile HIPS, we need the following librairies # -- ordering Metis or Scotch # comment lines corresponding to Metis or Scotch in SECTION 2 # -- BLAS # comment lines corresponding to BLAS in SECTION 2 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Variables needs by HIPS #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # directory of HIPS HIPS_DIR = $(SOFT_DIR) # include file of HIPS HIPS_INCLUDE = -I$(HIPS_DIR)include/hips/ # library of package hips HIPS_ALL_LIBS = -L$(HIPS_DIR)lib/hips -lio -lhipssequential -lhips #-lspkit IO_LIB = $(HIPS_DIR)lib/hips/libio.a HIPSSEQUENTIAL_LIB = $(HIPS_DIR)lib/hips/libhipssequential.a HIPS_LIB = $(HIPS_DIR)lib/hips/libhips.a #SPKIT_LIB = $(HIPS_DIR)LIB/libspkit.a # other compiler option for HIPS (see value of CFLAGS in SECTION 1) CFLAGS_HIPS = # other include file and library file for interfacing HIPS_OTHER_INCLUDE = HIPS_OTHER_LIB = ########################################### # HYPRE ########################################### # To compile HYPRE, we need the following librairies # -- ordering Metis # comment lines corresponding to Metis in SECTION 2 # -- BLAS # comment lines corresponding to BLAS in SECTION 2 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Variables needs by HYPRE #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # directory of HYPRE HYPRE_DIR = $(SOFT_DIR) # include file of HYPRE HYPRE_INCLUDE = -I$(HYPRE_DIR)include/hypre # library of HYPRE HYPRE_LIB = -L$(HYPRE_DIR)lib/hypre/ -lHYPRE # other compiler option for HYPRE (see value of CFLAGS in SECTION 1) CFLAGS_HYPRE = -Wall -DHAVE_CONFIG_H -DHYPRE_TIMING -Wno-deprecated -DLINUX -DSPKIT_F -DMPICH_SKIP_MPICXX # other directory of header file and library file for interfacing HYPRE_OTHER_INCLUDE = HYPRE_OTHER_LIB = -lm -lstdc++ ########################################### # pARMS ########################################### # To compile pARMS, we need the following librairies # -- ordering Metis # comment lines corresponding to Metis in SECTION 2 # -- BLAS # comment lines corresponding to BLAS in SECTION 2 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # variable needs by pARMS #!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # directory of pARMS PARMS_DIR = $(SOFT_DIR) # include file of pARMS PARMS_INCLUDE = -I$(PARMS_DIR)include/parms # library of HYPRE PARMS_LIB = -L$(PARMS_DIR)lib/ -lparms-O3 # other compiler option for HIPS (see value of CFLAGS in ) # PARMS NEED THE ARCHITECTURE (see generaldefs.h). For Mac Osx defined the architecture as -DLINUX CFLAGS_PARMS = -DLINUX -DSPKIT_F # other include file and library file for interfacing PARMS_OTHER_INCLUDE = PARMS_OTHER_LIB = ########################################### # SECTION 4: # DIRECT SPARSE SOLVER # ########################################### # MUMPS ########################################### # To compile MUMPS, we need the following librairies # -- ordering metis, scotch # comment lines corresponding to Metis and Scotch in SECTION 2 # -- BLAS, BLACS, SCALAPACK # comment lines corresponding to BLAS, BLACS and SCALAPACK in SECTION 2 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Variables needs by MUMPS #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MUMPS_HOST = BROCHET # directory of MUMPS MUMPS_DIR = $(SOFT_DIR)mumps/MUMPS_4.9.2/ # directory of Header File for MUMPS MUMPS_INCLUDE = -I$(MUMPS_DIR)include/ # library of MUMPS MUMPS_LIB = -L$(MUMPS_DIR)lib/ -lmumps_common_$(MUMPS_HOST) -ldmumps_$(MUMPS_HOST) -lzmumps_$(MUMPS_HOST) # pord : ordering include in MUMPS package PORD_DIR = $(MUMPS_DIR)PORD/ PORD_INCLUDE = -I$(PORD_DIR)include PORD_LIB = -L$(MUMPS_DIR)lib/ -lpord_$(MUMPS_HOST) # other compiler option for MUMPS (see value of CFLAGS in SECTION 1) CFLAGS_MUMPS = # other include file and library file for interfacing MUMPS_OTHER_INCLUDE = -I/usr/X11/include MUMPS_OTHER_LIB = -L/usr/lib/gcc/i686-apple-darwin9/4.2.1/ -lgfortran ########################################### # SuperLU_DIST ########################################### # To compile SuperLU_DIST, we need the following librairies # -- ordering Metis and ParMetis # comment lines corresponding to Metis and ParMetis in SECTION 2 # -- BLAS # comment lines corresponding to BLAS in SECTION 2 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Variables needs by SuperLU_DIST #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # directory of superlu_dist SLUDIST_DIR = $(SOFT_DIR) # include file of superlu_dist SLUDIST_INCLUDE = -I$(SLUDIST_DIR)include # librairie of superlu_dist SLUDIST_LIB = -L$(SLUDIST_DIR)lib/ -lsuperlu_dist_2.3 # other compiler option for SuperLU (see value of CFLAGS in SECTION 1) SLUDIST_CFLAGS = # other include file and library file for interfacing SLUDIST_OTHER_INCLUDE = SLUDIST_OTHER_LIB = ########################################### # Pastix ########################################### # To compile pastix, we need the following librairies # -- ordering scotch, ptscotch, metis # comment lines corresponding to metis, scotch and ptsccoth in SECTION 2 # -- BLAS # comment lines corresponding to BLAS in SECTION 2 #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Variables needs by pastix #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # To obtain real and complex arithmetics, we need to install for real and for complex separately. # Hence we need to have two differents pastix directory #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # real pastix # directory of pastix REAL_PASTIX_DIR = $(SOFT_DIR)/ # include directory of pastix REAL_PASTIX_INCLUDE = -I$(REAL_PASTIX_DIR)include/pastix/double/ # library REAL_PASTIX_LIB = -L$(REAL_PASTIX_DIR)lib/pastix/double -lpastix #-lmatrix_driver # complex pastix # directory of pstix COMPLEX_PASTIX_DIR = $(SOFT_DIR) # include directory of pastix COMPLEX_PASTIX_INCLUDE = -I$(COMPLEX_PASTIX_DIR)include/pastix/complex/ # library COMPLEX_PASTIX_LIB = -L$(COMPLEX_PASTIX_DIR)lib/pastix/complex/ -lpastix #-lmatrix_driver # other compiler option for PASTIX (see value of CFLAGS in SECTION 1) CFLAGS_FLAGS = -DFORCE_LONG -DNUMA_ALLOC -DX_ARCHi686_mac -DDOF_CONSTANT -DCOMMON_DEBUG -DSYMBOL_DEBUG -DDOF_DEBUG -DSOLVER_DEBUG -DORDER_DEBUG -DFAX_DEBUG -DSCOTCH_DEBUG -DDEBUG_BLEND -DBUBBLE_DEBUG -DPASTIX_DEBUG -Wno-depreciated # other directory of header file and library file for interfacing PASTIX_OTHER_INCLUDE = PASTIX_OTHER_LIB = -lm -lsupc++ -lpthreadfreefem++-3.38-1/src/solver/MUMPS_FreeFem.cpp000644 000767 000024 00000207446 11406226636 020726 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // //ff-c++-LIBRARY-dep: metis mumps blas //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include #include #include #include "mpi.h" #include "dmumps_c.h" #include "zmumps_c.h" // read options for MUMPS in freefem++ int s_(char* str, const char* cmp[]) { int i = 0; while( cmp[i] != 0){ if( strcmp(str, cmp[i]) == 0){ //cout << *str << " return" << i << endl; return i+1 ; } i++; } //cout << *str << " return 0" << endl; return 0; } void read_options_freefem(string *string_option, int *SYM, int *PAR){ static const char* comp[] = {"SYM", "PAR", 0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); cout << "data=" << data << endl; char * tictac; tictac = strtok(data," =,\t\n"); cout << "tictac=" << data << endl; while(tictac != NULL){ int id_option = s_(tictac, comp); tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 1 : // SYM *SYM = atoi(tictac); // strtol ??? if(*SYM != 0 && *SYM !=1) cout << "SYM must be equal to 1 or 0 for MUMPS" << endl; break; case 2: // PAR *PAR = atoi(tictac); if(*PAR != 0 && *PAR !=1) cout << "PAR must be equal to 1 or 0" << endl; //strtol ??? break; case 0: // Equivalent of case default break; } tictac = strtok(NULL," =,\t\n"); } } class dSolveMUMPSmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 mutable MPI_Comm comm; double *a; int *irn, *jcn; int n, m, nz; // parameter MUMPS KN_ perm_r; /* row permutations from partial pivoting */ KN_ perm_c; KN_ scale_r; KN_ scale_c; string string_option; string data_option; int SYM; int PAR; int myid; // distribuer int nz_loc; int *jcn_loc, *irn_loc; double *a_loc; static const int JOB_INIT=-1; static const int JOB_END=-2; static const int USE_COMM_WORLD= -987654; // variable reel mutable DMUMPS_STRUC_C id; #define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */ #define CNTL(I) cntl[(I)-1] /* macro s.t. indices match documentation */ #define RINFOG(I) rinfog[(I)-1] /* macro s.t. indices match documentation */ #define INFOG(I) infog[(I)-1] /* macro s.t. indices match documentation */ public: dSolveMUMPSmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string param_string, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN &pperm_c, KN &pscale_r,KN &pscale_c, MPI_Comm * mpicommw ) : eps(epsilon),epsr(0), tgv(ttgv), string_option(param_string), data_option(datafile), perm_r(pperm_r), perm_c(pperm_c), tol_pivot_sym(pivot_sym),tol_pivot(pivot), scale_r(pscale_r), scale_c(pscale_c) { long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); int dataint[40]; double datadouble[15]; int ierr; if(mpicommw==0){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; /* ------------------------------------------------------------ INITIALIZE THE MUMPS PROCESS GRID. ------------------------------------------------------------*/ ierr = MPI_Comm_rank(comm, &myid); if( myid ==0){ n = AA.n; m = AA.m; nz = AA.nbcoef; MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } else{ MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } if( !(param_int==NULL) ) assert( param_int.N() == 42); if( !(param_double==NULL) ) assert( param_double.N() == 15); if(perm_r) assert( perm_r.N() == n); if(perm_c) assert( perm_c.N() == m); if(scale_r) assert( scale_r.N() == n); if(scale_c) assert( scale_c.N() == m); if( n != m ) cerr << "only square matrix are supported by MUMPS" << endl; // initialisation par defaut SYM=0; PAR=1; /* if(!string_option.empty()) { if(myid==0){ cout << "read string option" < double definition of parameters.",data_option.c_str()); exit(1); } if( !(param_int == NULL) ){ cout << "internal parameter" << endl; for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = param_int[ii+2]; } else{ // parameter by default id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; } if( !(param_double == NULL) ){ cout << "internal parameter" << endl; for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = param_double[ii]; } } else if(!data_option.empty()){ for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = dataint[ii]; for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = datadouble[ii]; } else{ // parameter by default cout << "default parameter" << endl; id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; } // uniquement donner au host if(myid==0){ if( !(perm_r==NULL) && id.ICNTL(7)==1){ for(int ii=0; ii id.ICNTL(5) = 0; \n"); id.ICNTL(5) = 0; exit(1); } if (myid == 0) { id.n = n; id.nz =nz; //id.irn=irn; id.jcn=jcn; //id.a = a; //id.rhs = rhs; } if( id.ICNTL(18) == 0) { // CASE:: NON DISTRIBUTED MATRIX if (myid == 0) { // nouveau a=AA.a; // ATTENTION // AA.cl :: indice des colonnes (exacte) et AA.lg :: indice des lignes // index of row and colummn by 1 jcn = AA.cl; for(int ii=0; ii 1) cout <<"id.ICNTL(18) = 1 || id.ICNTL(18) == 2 "<< endl; // ATTENTION // AA.cl :: indice des colonnes (exacte) et AA.lg :: indice des lignes // index of row and column by 1 if (myid == 0) { // new host process jcn = AA.cl; for(int ii=0; ii 0){ id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = a_loc; } if( myid == 0){ //free( irn_loc ); //free( jcn_loc ); //free( a_loc ); free( nz_loc_procs ); free( fst_nz_procs ); free( irn_g ); free( jcn_g ); free( a_g ); } } if( PAR == 1 ){ int *nz_loc_procs; int *fst_nz_procs; int *irn_g; int *jcn_g; double *a_g; int commSize; MPI_Comm_size(comm,&commSize); if(myid==0){ // allocation des differents tableaux nz_loc_procs = (int*) malloc ( commSize*sizeof(int) ); for(int ii=0; ii pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = a_loc; } } if(PAR == 1){ //============================== // besoin de irn, jcn, AA.a //============================== int commSize; ierr=MPI_Comm_size(comm,&commSize); int m_loc_fst = m/commSize; int m_loc; if( myid == commSize-1 && ( m_loc_fst*commSize != m ) ) m_loc = m-m_loc_fst*( commSize-1 ); else m_loc = m_loc_fst; int fst_row= myid*m_loc_fst; nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // allocation des tableaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (double*) malloc(sizeof(double)*nz_loc); int fst_nnz = AA.lg[fst_row]; for(int ii=0; ii < nz_loc; ii++){ a_loc[ii] = AA.a[fst_nnz+ii]; jcn_loc[ii] = AA.cl[fst_nnz+ii]; // jcn=AA.cl a ete augmenter de 1 avant => pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = a_loc; } /* Call the MUMPS package. */ // Factorisation id.job=2; dmumps_c(&id); } } if( id.ICNTL(18) == 3 ) { // indices et colonnes de la matrice // // Cas Matrice parallele :: // // ======================== // // // Cas stockage Morse parallele // m_loc = AA.m_loc; // Nombre de lignes prise en compte // nz_loc = AA.nbcoef_loc; // Nombre de coefficients non nulles // // indice des colonnes // jcn_loc = AA.cl_loc; // indices des colonnes dans la matrice locale // // if( !(irn_loc = (int*) malloc(sizeof(int)*nz_loc)) ){ // printf("problem allocation jcn "); // exit(1); // } // assert(AA.lg_loc[nrow_loc] == nz_loc); // for(int ii=0; ii< nrow_loc; ii++) // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1] = ii+1; // // a_loc=AA.a_loc; // // Pas de matrice parallele ==> utilisation astuce de SuperLU // Matrice :: distribution bloc continue de lignes :: voir SuperLU // Attention :: performance ??? // //================== // // pour un proc : // // a: AA.a[fstow] , ..., AA.a[fstrow+nz_loc-1] // // jcn: AA.cl[fstrow] , ..., AA.cl[fstrow+nz_loc-1] // // irn: AA.lg[fstrow] , ..., AA.lg[fstrow+m_loc] // //================== // // apres reception : // // irn_reel: // // int jj=0, // // do ii=0,m_loc-1 // // do ii1=irn_donnee[ii],irn_donnee[ii+1]-1 // // irn_reel[jj] = fst_row+ii+1; // // jj++ // // end do // // end do // //================= cout <<"id.ICNTL(18) = 3, PAR="<< PAR << endl; if(PAR == 0){ // if(myid != 0) { // int commSize; // ierr=MPI_Comm_size(comm,&commSize); // commSize=commSize-1; // int myidpar=myid-1; // int m_loc_fst; // m_loc_fst= m/commSize; // int m_loc; // if( myidpar == commSize-1 && ( m_loc_fst*commSize != m ) ) // m_loc = m-m_loc_fst*( commSize-1 ); // else // m_loc = m_loc_fst; // int fst_row; // fst_row= myidpar*m_loc_fst; // nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // // allocation des tableaux // irn_loc = (int*) malloc(sizeof(int)*nz_loc); // jcn_loc = (int*) malloc(sizeof(int)*nz_loc); // a_loc = (double*) malloc(sizeof(double)* nz_loc); // int fst_nnz; // fst_nnz = AA.lg[fst_row]; // for(int ii=0; ii < nz_loc; ii++){ // a_loc[ii] = AA.a[fst_nnz+ii]; // jcn_loc[ii] = AA.cl[fst_nnz+ii]+1; // } // for(int ii=fst_row; ii< fst_row+m_loc; ii++){ // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1-fst_nnz] = ii+1; // } // id.nz_loc = nz_loc; // id.irn_loc = irn_loc; // id.jcn_loc = jcn_loc; // id.a_loc = a_loc; // } // definition de variables int commSize; int m_loc_fst; int m_loc; int fst_row; int *nz_loc_procs; int *fst_nz_procs; int *m_loc_procs; int *fst_row_procs; double *tab_a; int *tab_cl; int *tab_lg; int *tab_lg_loc; MPI_Comm_size(comm,&commSize); if( myid !=0){ int commSizemm; int myidpar=myid-1; commSizemm = commSize-1; m_loc_fst= m/commSizemm; if( myidpar == commSizemm-1 && ( m_loc_fst*commSizemm != m ) ) m_loc = m-m_loc_fst*( commSizemm-1 ); else m_loc = m_loc_fst; if(verbosity > 5){ fst_row = myidpar*m_loc_fst; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } } if( myid ==0){ int commSizemm; commSizemm = commSize-1; m_loc_fst= m/commSizemm; fst_row_procs = (int* ) malloc( commSize*sizeof(int) ); m_loc_procs = (int* ) malloc( commSize*sizeof(int) ); fst_nz_procs = (int* ) malloc( commSize*sizeof(int) ); nz_loc_procs = (int* ) malloc ( commSize*sizeof(int) ); fst_row_procs [0] = 0; m_loc_procs [0] = 0; for( int ii= 1; ii 5){ cout << "after scatter " << myid << endl; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } // allocation des tableaux locaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (double*) malloc(sizeof(double)*nz_loc); tab_lg_loc = (int*) malloc(sizeof(int)*(m_loc) ); MPI_Scatterv( tab_a, nz_loc_procs, fst_nz_procs, MPI_DOUBLE, a_loc, nz_loc, MPI_DOUBLE, 0, comm); MPI_Scatterv( tab_cl, nz_loc_procs, fst_nz_procs, MPI_INT, jcn_loc, nz_loc, MPI_INT, 0, comm); MPI_Scatterv( tab_lg, m_loc_procs, fst_row_procs, MPI_INT, tab_lg_loc, m_loc, MPI_INT, 0, comm); int jj=0; for(int ii=0; ii &AA,KN_ &x,const KN_ &b) const { long int starttime,finishtime; long int timeused; ///////////////////////////// double *rhs; int job; if(verbosity) starttime = clock(); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // indices des colonnes commence par 1 avec mumps // et 0 dans freefem ==> renumerotation if(jcn != NULL) for(int ii=0; ii renumerotation if(jcn != NULL) for(int ii=0; ii1){ /* information given by mumps*/ int Rinfo=20; int Sinfo=40; // in Freefem++ we give only global information if(myid == 0){ printf("Global Output Information of MUMPS: RINFOG and INFOG \n"); printf("============= After Solving ==================\n"); for(int ii=0; ii< Rinfo; ii++) printf( "RINFOG[%d]= %f \n", ii, id.RINFOG(ii+1) ); printf("=====================================================\n"); for(int ii=0; ii< Sinfo; ii++) printf( "INFOG[%d]= %d \n", ii, id.INFOG(ii+1) ); printf("=====================================================\n"); } } if( verbosity ){ if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "MUMPS : time solve step :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; static mumps_double_complex *mumps_dc(Complex *p) { return (mumps_double_complex *) (void *) p;} static Complex *inv_mumps_dc(mumps_double_complex *p) { return (Complex *) (void *) p;} class zSolveMUMPSmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 mutable MPI_Comm comm; Complex *a; int *irn, *jcn; int n, m, nz; // parameter MUMPS KN perm_r; /* row permutations from partial pivoting */ KN perm_c; KN scale_r; KN scale_c; string string_option; string data_option; int SYM; int PAR; int myid; // distribuer int nz_loc; int *jcn_loc, *irn_loc; Complex *a_loc; static const int JOB_INIT=-1; static const int JOB_END=-2; static const int USE_COMM_WORLD= -987654; // variable complex mutable ZMUMPS_STRUC_C id; /* variable d'informations */ #define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */ #define CNTL(I) cntl[(I)-1] /* macro s.t. indices match documentation */ #define RINFOG(I) rinfog[(I)-1] /* macro s.t. indices match documentation */ #define INFOG(I) infog[(I)-1] /* macro s.t. indices match documentation */ public: zSolveMUMPSmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string param_string, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN_ &pperm_c, KN &pscale_r,KN &pscale_c, MPI_Comm * mpicommw) : eps(epsilon),epsr(0), tgv(ttgv), string_option(param_string), data_option(datafile), perm_r(pperm_r), perm_c(pperm_c), tol_pivot_sym(pivot_sym),tol_pivot(pivot), scale_r(pscale_r), scale_c(pscale_c) { long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); int dataint[40]; double datadouble[15]; int ierr; if(mpicommw==0){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; /* ------------------------------------------------------------ INITIALIZE THE MUMPS PROCESS GRID. ------------------------------------------------------------*/ ierr = MPI_Comm_rank(comm, &myid); if( myid ==0){ n = AA.n; m = AA.m; nz = AA.nbcoef; MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } else{ MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } if( !(param_int==NULL) ) assert( param_int.N() == 42); if( !(param_double==NULL) ) assert( param_double.N() == 15); if(pperm_r) assert( perm_r.N() == n); if(pscale_r) assert( scale_r.N() == n+m ); if(pscale_c) assert( scale_c.N() == n+m ); if( n != m ) cerr << "only square matrix are supported by MUMPS" << endl; /* ------------------------------------------------------------ INITIALIZE THE MUMPS PROCESS GRID. ------------------------------------------------------------*/ // initialisation par defaut SYM=0; PAR=1; // if(!string_option.empty()) // { // read_options_freefem(&string_option,&SYM,&PAR); // } if( !(param_int==NULL) ){ SYM = param_int[0]; PAR = param_int[1]; } else if(!data_option.empty()) { if(myid==0){ char * retfile= new char[data_option.size()+1]; strcpy(retfile, (&data_option)->c_str()); printf("read data from file %s\n", retfile); FILE *pFile=fopen(retfile,"rt"); int i_data=0; int d_data=0.; char data[256]; char *tictac; fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); SYM = atoi(tictac); fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); PAR = atoi(tictac); while( !feof(pFile) && i_data < 40){ fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); dataint[i_data] = (int)atol(tictac); i_data++; } assert(i_data == 40); while( !feof(pFile) && d_data < 15){ fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); datadouble[d_data] = (double)atof(tictac); d_data++; } assert(d_data == 15); fclose(pFile); delete [] retfile; MPI_Bcast( &SYM, 1, MPI_INT, 0, comm ); MPI_Bcast( &PAR, 1, MPI_INT, 0, comm ); MPI_Bcast( dataint, 40, MPI_INT, 0, comm ); MPI_Bcast( datadouble, 15, MPI_DOUBLE, 0, comm ); fclose(pFile); delete [] retfile; } else{ MPI_Bcast( &SYM, 1, MPI_INT, 0, comm ); MPI_Bcast( &PAR, 1, MPI_INT, 0, comm ); MPI_Bcast( dataint, 40, MPI_INT, 0, comm ); MPI_Bcast( datadouble, 15, MPI_DOUBLE, 0, comm ); } } /* Initialize a MUMPS instance. Use comm */ id.job=JOB_INIT; id.par=PAR; id.sym=SYM; id.comm_fortran=(MUMPS_INT) MPI_Comm_c2f(comm); zmumps_c(&id); /* set parameter of mumps */ if( !(param_int==NULL) || !(param_double==NULL) ){ if(!data_option.empty()){ printf("read option before with the file %s\n",data_option.c_str()); exit(1); } if( !(param_int==NULL) ){ for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = param_int[ii+2]; } else // parameter by default id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; if( !(param_double==NULL) ) for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = param_double[ii]; } else if(!data_option.empty()){ for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = dataint[ii]; for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = datadouble[ii]; } else{ // parameter by default id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; } // uniquement donner au host if(myid==0){ if( !(perm_r==NULL) && id.ICNTL(7)==1){ for(int ii=0; ii pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = mumps_dc(a_loc); } } if(PAR == 1){ int commSize; ierr=MPI_Comm_size(comm,&commSize); int m_loc_fst = m/commSize; int m_loc; if( myid == commSize-1 && ( m_loc_fst*commSize != m ) ) m_loc = m-m_loc_fst*( commSize-1 ); else m_loc = m_loc_fst; int fst_row= myid*m_loc_fst; nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // allocation des tableaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (Complex*) malloc(sizeof(Complex)*nz_loc); int fst_nnz = AA.lg[fst_row]; for(int ii=0; ii < nz_loc; ii++){ a_loc[ii] = AA.a[fst_nnz+ii]; jcn_loc[ii] = AA.cl[fst_nnz+ii]; // jcn=AA.cl a ete augmenter de 1 avant => pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = mumps_dc(a_loc); } /* Call the MUMPS package. */ // Factorisation id.job=2; zmumps_c(&id); } } if( id.ICNTL(18) == 3 ) { // indices et colonnes de la matrice // // Cas Matrice parallele :: // // ======================== // // // Cas stockage Morse parallele // m_loc = AA.m_loc; // Nombre de lignes prise en compte // nz_loc = AA.nbcoef_loc; // Nombre de coefficients non nulles // // indice des colonnes // jcn_loc = AA.cl_loc; // indices des colonnes dans la matrice locale // // if( !(irn_loc = (int*) malloc(sizeof(int)*nz_loc)) ){ // printf("problem allocation jcn "); // exit(1); // } // assert(AA.lg_loc[nrow_loc] == nz_loc); // for(int ii=0; ii< nrow_loc; ii++) // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1] = ii+1; // // a_loc=AA.a_loc; // // Pas de matrice parallele ==> utilisation astuce de SuperLU // Matrice :: distribution bloc continue de lignes :: voir SuperLU // Attention :: performance ??? cout <<"id.ICNTL(18) = 3, PAR="<< PAR << endl; if(PAR == 0){ // if(myid !=0) { // int commSize; // ierr=MPI_Comm_size(comm,&commSize); // commSize=commSize-1; // int myidpar=myid-1; // int m_loc_fst; // m_loc_fst= m/commSize; // int m_loc; // if( myidpar == commSize-1 && ( m_loc_fst*commSize != m ) ) // m_loc = m-m_loc_fst*( commSize-1 ); // else // m_loc = m_loc_fst; // // int fst_row; // fst_row= myidpar*m_loc_fst; // nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // // // allocation des tableaux // irn_loc = (int*) malloc(sizeof(int)*nz_loc); // jcn_loc = (int*) malloc(sizeof(int)*nz_loc); // a_loc = (Complex*) malloc(sizeof(Complex)* nz_loc); // // int fst_nnz; // fst_nnz = AA.lg[fst_row]; // for(int ii=0; ii < nz_loc; ii++){ // a_loc[ii] = AA.a[fst_nnz+ii]; // jcn_loc[ii] = AA.cl[fst_nnz+ii]+1; // } // for(int ii=fst_row; ii< fst_row+m_loc; ii++){ // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1-fst_nnz] = ii+1; // } // id.nz_loc = nz_loc; // id.irn_loc = irn_loc; // id.jcn_loc = jcn_loc; // id.a_loc = mumps_dc(a_loc); // } // definition de variables int commSize; int m_loc_fst; int m_loc; int fst_row; int *nz_loc_procs; int *fst_nz_procs; int *m_loc_procs; int *fst_row_procs; Complex *tab_a; int *tab_cl; int *tab_lg; int *tab_lg_loc; MPI_Comm_size(comm,&commSize); if( myid !=0){ int commSizemm; int myidpar=myid-1; commSizemm = commSize-1; m_loc_fst= m/commSizemm; if( myidpar == commSizemm-1 && ( m_loc_fst*commSizemm != m ) ) m_loc = m-m_loc_fst*( commSizemm-1 ); else m_loc = m_loc_fst; if(verbosity > 5){ fst_row = myidpar*m_loc_fst; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } } if( myid ==0){ int commSizemm; commSizemm = commSize-1; m_loc_fst= m/commSizemm; fst_row_procs = (int* ) malloc( commSize*sizeof(int) ); m_loc_procs = (int* ) malloc( commSize*sizeof(int) ); fst_nz_procs = (int* ) malloc( commSize*sizeof(int) ); nz_loc_procs = (int* ) malloc ( commSize*sizeof(int) ); fst_row_procs [0] = 0; m_loc_procs [0] = 0; for( int ii= 1; ii 5){ cout << "after scatter " << myid << endl; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } // allocation des tableaux locaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (Complex*) malloc(2*sizeof(double)*nz_loc); tab_lg_loc = (int*) malloc(sizeof(int)*(m_loc) ); MPI_Scatterv( tab_a, nz_loc_procs, fst_nz_procs, MPI_DOUBLE_COMPLEX, a_loc, nz_loc, MPI_DOUBLE_COMPLEX, 0, comm); MPI_Scatterv( tab_cl, nz_loc_procs, fst_nz_procs, MPI_INT, jcn_loc, nz_loc, MPI_INT, 0, comm); MPI_Scatterv( tab_lg, m_loc_procs, fst_row_procs, MPI_INT, tab_lg_loc, m_loc, MPI_INT, 0, comm); int jj=0; for(int ii=0; ii renumerotation if( jcn != NULL ) for(int ii=0; ii1){ /* information given by mumps*/ int Rinfo=20; int Sinfo=40; // in Freefem++ we give only global information if(myid == 0){ printf("Global Output Information of MUMPS: RINFOG and INFOG \n"); printf("============= After Factorisation ==================\n"); for(int ii=0; ii< Rinfo; ii++) printf( "RINFOG[%d]= %f \n", ii, id.RINFOG(ii+1) ); printf("=====================================================\n"); for(int ii=0; ii< Sinfo; ii++) printf( "INFOG[%d]= %d \n", ii, id.INFOG(ii+1) ); printf("=====================================================\n"); } } if( verbosity){ if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "MUMPS : time factorisation :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { long int starttime,finishtime; long int timeused; //*******************************************************************// // depend pas de la forme de la matrice: distribuer ou assembler Complex *rhs; int job; if(verbosity) starttime = clock(); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // indices des colonnes commence par 1 avec mumps // et 0 dans freefem ==> renumerotation if(jcn != NULL) for(int ii=0; ii renumerotation if(jcn != NULL) for(int ii=0; ii 1){ /* information given by mumps*/ int Rinfo=20; int Sinfo=40; // in Freefem++ we give only global information if(myid == 0){ printf("Global Output Information of MUMPS: RINFOG and INFOG \n"); printf("============= After Solving ==================\n"); for(int ii=0; ii< Rinfo; ii++) printf( "RINFOG[%d]= %f \n", ii, id.RINFOG(ii+1) ); printf("=====================================================\n"); for(int ii=0; ii< Sinfo; ii++) printf( "INFOG[%d]= %d \n", ii, id.INFOG(ii+1) ); printf("=====================================================\n"); } } if(verbosity) if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " MUMPS : time solve :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverMUMPSmpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverMUMPS" << endl; return new dSolveMUMPSmpi(*A,ds.strategy, ds.tgv, ds.epsilon, ds.tol_pivot, ds.tol_pivot_sym, ds.sparams, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c, ds.scale_r, ds.scale_c,(MPI_Comm *)ds.commworld); } MatriceMorse::VirtualSolver * BuildSolverMUMPSmpi(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverMUMPS" << endl; return new zSolveMUMPSmpi(*A,ds.strategy, ds.tgv, ds.epsilon, ds.tol_pivot, ds.tol_pivot_sym, ds.sparams, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c, ds.scale_r, ds.scale_c,(MPI_Comm *)ds.commworld); } class Init { public: Init(); }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; } bool SetMUMPSmpi() { if(verbosity) cout << " SetDefault sparse solver to MUMPSmpi" << endl; DefSparseSolver::solver =BuildSolverMUMPSmpi; DefSparseSolver::solver =BuildSolverMUMPSmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; } Init init; Init::Init() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: MUMPS , defaultsolver defaultsolverMUMPS " << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverMUMPSmpi; DefSparseSolver::solver =BuildSolverMUMPSmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoMUMPS","(",new OneOperator0(SetMUMPSmpi)); } freefem++-3.38-1/src/solver/parms_FreeFem.cpp000755 000767 000024 00000101470 12167254041 021134 0ustar00hechtstaff000000 000000 // ORIG-DATE: 04/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : INRIA FUTUR // AUTHOR : Guy Atenekeng // E-MAIL : Guy_Antoine_Atenekeng_Kahou@lri.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include using namespace std; #define MCW MPI_COMM_WORLD #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "mpi.h" /* Explain here what foobar does */ #ifdef __cplusplus extern "C" { #endif #include "psparslib.h" #include "generaldefs.h" #ifdef __cplusplus } #endif extern "C" { #include "metis.h" } #include #include #include #define BUFLEN 100 #define NORHS 0 #define BUFLEN 100 //This functions come from pARMS package and consist to scale matrix class parm_param { public: mutable PrePar prepar; mutable IterPar ipar; mutable int sol_type; mutable int iov,scale, unsymm,method; mutable int solver; mutable int VERBOSE; public: parm_param(){ PARMS_malloc(prepar,1,_PrePar); PARMS_malloc(ipar,1,_IterPar); /*---------------------------------------------------------------------- * * This function sets some default parameters just to get started with * * pARMS. There are two arrays which define the parameters in pARMS. * * Because ther\ e are so many methods, the number of parameters may seem * * overwhelming.. However\ , not all are used. For example when add_ilut * * is used only two parameters are r\ equired which are the drop * * tolerance and the max fill per row.. This function s\ ets everything * * so that all the methods can be safely tested. YS - * * * *------------------------------------------------------------------------*/ int i; /*------------------------------------------------------------------------*/ for (i=1; i<18; i++) ipar->ipar[i] = 0; /* parameters to be set for the solver -- not all of these are used -- depending on the method selected - */ /* parameters associated with various accelerators (inner/outer) */ ipar->ipar[0] = 3; /* nlev in arms when used */ ipar->ipar[1] = 20; /* block size in arms when used */ ipar->ipar[5] = 30; /* Outer iteration Krylov subs. dimension */ ipar->ipar[6] = 200; /* Max. outer iterations */ ipar->ipar[3] = 3; /* Inner iteration Krylov subs. dimension */ ipar->ipar[4] = 3; /* Max. inner iterations */ ipar->pgfpar[0] = 0.01; /* tolerance for inner iteration when used */ ipar->pgfpar[1] = 1.e-10;/* tolerance for outer iteration */ /* preconditioning parameters */ prepar->tolind = 0.1; /* tolerance used for diag dom. filtration alg.*/ prepar->lfil[0] = 20; /* lfil0 (ilut, iluk, and arms) */ prepar->lfil[4] = 20; /* lfil for Schur complement const. */ prepar->lfil[5] = 20; /* lfil for Schur complement const. */ prepar->droptol[0]=.001; /* droptol0 (ilut, iluk, and arms) */ prepar->droptol[4]=.001; /* droptol for Schur complement const. */ prepar->droptol[5]=.001; /* droptol for Schur complement const. */ prepar->mc = 1; /* multicoloring or not in ILU when used */ //Integer parameter iov=0; scale=1; unsymm=1; method= 2; VERBOSE=0; /*no statistic infos has print*/ /*VERBOSE=1 Only informations on convergence will be print*/ /*VERBOSE=2 Only informations on time will be print*/ solver=0; memcpy(prepar->ipar, ipar->ipar, sizeof(int)*18); for (i=1; i<4; i++) { prepar->droptol[i] = prepar->droptol[0]; prepar->lfil[i] = prepar->lfil[0]; } prepar->lfil[6] = prepar->lfil[5]; ipar->in_iters = 0; /*-------------------- done */ } public: parm_param(const KN ¶m_int, const KN ¶m_double) { int i; PARMS_malloc(prepar,1,_PrePar); PARMS_malloc(ipar,1,_IterPar); for (i=1; i<18; i++) ipar->ipar[i] = 0; if(param_int.N()>0){if((param_int[0]<0)||(param_int[0]>2)) {printf("%s","WRONG SOLVER INDEX WE SET DEFAULT ONE \n"); solver=0; } else solver=param_int[0];}else solver=0; if(param_int.N()>1){if((param_int[1]<0)||(param_int[1]>13)) {printf("%s","WRONG INDEX FOR PRECONDITIONER, WE SET DEFAULT ONE \n"); method=2; } else if((param_int[1]>=0)||(param_int[1]<=13)) method=param_int[1];}else method=2; if(param_int.N()>2){if(param_int[2]>0) ipar->ipar[5]=param_int[2]; else ipar->ipar[5]=30;} else ipar->ipar[5]=30; /* Outer iteration Krylov subs. dimension */ if(param_int.N()>3){if(param_int[3]>0) ipar->ipar[6]=param_int[3]; else ipar->ipar[6]=1000;} else ipar->ipar[6]=1000; /* Max. outer iterations */ if((method==3)||(method==7)||(method==11)) {if(param_int.N()>4) {if(param_int[4]>0) ipar->ipar[0]=param_int[4]; else ipar->ipar[0]=3;} else ipar->ipar[0]=3; } /* nlev in arms when used */ if(param_int.N()>5){ if(param_int[5]>0) ipar->ipar[3]=param_int[5]; else ipar->ipar[3]=3;} else ipar->ipar[3]=3; /* Inner iteration Krylov subs. dimension */ if(param_int.N()>6){if(param_int[6]>0) ipar->ipar[4]=param_int[6]; else ipar->ipar[4]=3;} else ipar->ipar[4]=3; /* Max. inner iterations */ if(param_int.N()>7){if(param_int[7]>=0) unsymm=param_int[7]; else unsymm=0;} else unsymm=0; if(param_int.N()>8) {if(param_int[8]>=0) iov=param_int[8]; else iov=0;} else iov=0; if(param_int.N()>9) {if(param_int[9]>0) scale=param_int[9]; else scale=1;}else scale=1; if(param_int.N()>10){if(param_int[10]>0) ipar->ipar[1]=param_int[10]; else ipar->ipar[1]=20; }else ipar->ipar[1]=20; if(param_int.N()>11){if(param_int[11]>0) prepar->lfil[0]=param_int[11]; else prepar->lfil[0]=20;} else prepar->lfil[0]=20; /* lfil0(ilut, iluk, and arms) */ if(param_int.N()>12){if(param_int[12]>0) prepar->lfil[4]=param_int[12]; else prepar->lfil[4]=20;} else prepar->lfil[4]=20; /* lfil for Schur complement const. */ if(param_int.N()>13){if(param_int[13]>0) prepar->lfil[5]=param_int[13]; else prepar->lfil[13]=20;} else prepar->lfil[5]=20; /* lfil for Schur complement const. */ if(param_int.N()>14){if(param_int[14]>0) prepar->mc=param_int[14]; else prepar->mc=1; } else prepar->mc=1; if(param_int.N()>15){if(param_int[15]>0) ipar->in_iters=param_int[15]; else ipar->in_iters=0; } else ipar->in_iters=0; if(param_int.N()>16){if(param_int[16]>0) VERBOSE=param_int[16]; else VERBOSE=0; }else VERBOSE=0; if(param_double.N()>0){if(param_double[0]>0) ipar->pgfpar[1]=param_double[0]; else ipar->pgfpar[1]=1.e-08;} ipar->pgfpar[1]=1.e-08; /* tolerance for outer iteration */ if(param_double.N()>1){if(param_double[1]>0) ipar->pgfpar[0]=param_double[1]; else ipar->pgfpar[0]=0.01;} else ipar->pgfpar[0]=0.01; /* tolerance for inner iteration when used */ if(param_double.N()>2) {if(param_double[2]>0) prepar->tolind = param_double[2]; else prepar->tolind=0.1;} else prepar->tolind=0.1; /* tolerance used for diag dom. filtration alg.*/ if(param_double.N()>3){if(param_double[3]>0) prepar->droptol[0]=param_double[3]; else prepar->droptol[0]=.001;} else prepar->droptol[0]=.001; /* droptol0 (ilut, iluk, and arms) */ if(param_double.N()>4) {if(param_double[4]>0) prepar->droptol[4]=param_double[4]; else prepar->droptol[4]=.001;} else prepar->droptol[4]=.001; /* droptol for Schur complement const. */ if(param_double.N()>5){if(param_double[5]>0) prepar->droptol[5]=param_double[5]; else prepar->droptol[5]=.001;} else prepar->droptol[5]=.001; /* droptol for Schur complement const. */ memcpy(prepar->ipar, ipar->ipar, sizeof(int)*18); for (i=1; i<4; i++) { prepar->droptol[i] = prepar->droptol[0]; prepar->lfil[i] = prepar->lfil[0]; } prepar->lfil[6] = prepar->lfil[5]; } public: parm_param(string datafile,DistMatrix dm) { FILE *fp; char buf[BUFLEN], meth_buf[BUFLEN]; int num; PARMS_malloc(prepar,1,_PrePar); PARMS_malloc(ipar,1,_IterPar); parm_param(); char * filename=new char[datafile.length()+1]; strcpy(filename,datafile.c_str()); /* read parameters for preconditioner and iteration from file 'filename' */ /* ---- start modification by MS */ if( (fp = fopen(filename, "r")) == NULL ){ fprintf(stderr, "Cannot open file inputs\n"); PARMS_Final();exit(1); } for (num=0; num< 18; num++) ipar->ipar[num] = 0; num = 1; while(fgets(buf, BUFLEN, fp) != NULL) { switch(num) { case 1: /* solver */ sscanf(buf, "%d", &solver); if((solver!=0)&&(solver!=1)&&(solver!=2)) {printf("%s","WRONG SOLVER INDEX, WE SET DEFAULT ONE \n"); solver=0;} break; case 2: /* preconditionner */ sscanf(buf,"%s",meth_buf); method = assignprecon(meth_buf, dm); if((method<0)||(method>13)) {printf("%s","WRONG INDEX FOR PRECONDITIONER, WE SET DEFAULT ONE \n"); method=2; } break; case 3: /* im (Outer Krylov subs dim) */ sscanf(buf,"%d",&ipar->ipar[5]); break; case 4: /* im (Outer Krylov subs dim) */ sscanf(buf,"%d",&ipar->ipar[6]); break; case 5: /* outer tol */ sscanf(buf,"%lf",&ipar->pgfpar[1]); break; case 6: /* inner tol */ sscanf(buf,"%lf",&ipar->pgfpar[0]); break; case 7: /* unsym */ sscanf(buf, "%d", &unsymm); break; case 8: /* inim (inned Krylov subs dim) */ sscanf(buf, "%d", &ipar->ipar[3]); break; case 9: /* Max. inner iterations */ sscanf(buf,"%d",&ipar->ipar[4]); break; case 10: /* nlev */ sscanf(buf, "%d", &iov); break; case 11: /* scale */ sscanf(buf,"%d",&scale); break; case 12: /* For printing result */ sscanf(buf, "%d", &VERBOSE); break; case 13: /* lfil0 (ilut, iluk, and arms) */ sscanf(buf, "%d", &prepar->lfil[0]); break; case 14: /* lfil 4 (schur construction) */ sscanf(buf, "%d", &prepar->lfil[4]); break; case 15: /* lfil 5 (ILUT for Schur) */ sscanf(buf, "%d", &prepar->lfil[5]); break; case 16: /* bsize */ sscanf(buf,"%d",&ipar->ipar[1]); break; case 17: /* tolerance used for diag dom. filtration alg.*/ sscanf(buf,"%lf",&prepar->tolind); break; case 18: /*droptol (0) -- simliar to lfil0*/ sscanf(buf, "%lf", &prepar->droptol[0]); break; case 19: /*droptol (4) -- simliar to lfil4*/ sscanf(buf, "%lf", &prepar->droptol[4]); break; case 20: /*droptol (5) -- simliar to lfil5*/ sscanf(buf, "%lf", &prepar->droptol[5]); break; case 21: /* multicoloring or not */ sscanf(buf, "%d", &prepar->mc); break; default: break; } num++; } fclose(fp); memcpy(prepar->ipar, ipar->ipar, sizeof(int)*18); prepar->droptol[1] = prepar->droptol[2] = prepar->droptol[3] = prepar->droptol[0]; prepar->droptol[6] = prepar->droptol[5]; prepar->lfil[1] = prepar->lfil[2] = prepar->lfil[3] = prepar->lfil[0]; prepar->lfil[6] = prepar->lfil[5]; ipar->in_iters = 0; free(filename); } ~parm_param(){ free(prepar); free(ipar); } }; int assignprecon( char *precon_str, DistMatrix dm) { /*------------------------------------------------------------------ create preconditioner handler * precon -- preconditioning handler * add_ilu0 -- additive schwarz preconditioner with ilu0 as local preconditioner * add_ilut -- additive schwarz preconditioner with ilut as local preconditioner * add_iluk -- additive schwarz preconditioner with iluk as local preconditioner * add_arms -- additive schwarz preconditioner with arms as local preconditioner * lsch_ilu0 -- schur complement preconditioner with ilu0 as local preconditioner * lsch_ilut -- schur complement preconditioner with ilut as local preconditioner * lsch_iluk -- schur complement preconditioner with iluk as local preconditioner * lsch_arms -- schur complement preconditioner with arms as local preconditioner * sch_gilu0 -- parallel ilu0 preconditioner * sch_sgs -- Schur-Symmetric GS preconditioner *------------------------------------------------------------------*/ /* set the method label for preconditioning and parameter for inner iteration -- actual labels (int) are defined in SRC/ARMS/data.h */ int ierr, method; ierr = 0; method=0; if(!strcmp(precon_str, "add_ilu0")) method = add_ilu0; else if(!strcmp(precon_str, "add_ilut")) method = add_ilut; else if(!strcmp(precon_str, "add_iluk")) method = add_iluk; else if(!strcmp(precon_str, "add_arms")) method = add_arms; else if(!strcmp(precon_str, "lsch_ilu0")) method = lsch_ilu0; else if(!strcmp(precon_str, "lsch_ilut")) method = lsch_ilut; else if(!strcmp(precon_str, "lsch_iluk")) method = lsch_iluk; else if(!strcmp(precon_str, "lsch_arms")) method = lsch_arms; else if(!strcmp(precon_str, "rsch_ilu0")) method = rsch_ilu0; else if(!strcmp(precon_str, "rsch_ilut")) method = rsch_ilut; else if(!strcmp(precon_str, "rsch_iluk")) method = rsch_iluk; else if(!strcmp(precon_str, "rsch_arms")) method = rsch_arms; else if(!strcmp(precon_str, "sch_sgs")) method = sch_sgs; else if(!strcmp(precon_str, "sch_gilu0")) method = sch_gilu0; else ierr = 1; char pcrM[40]; strcpy(pcrM,"invalid choice for the preconditioner \n"); if (ErrHand(ierr, dm, pcrM)) exit(1) ; return method;cout << "Cette resolution semble prendre du temps" << endl; } #define minint(a, b) ( (a) < (b) ? (a) : (b) ) #define maxint(a, b) ( (a) > (b) ? (a) : (b) ) #define max(a, b) ( (a) > (b) ? (a) : (b) ) #define min(a, b) ( a < b ? (a) : (b) ) #define fabsmin(a, b) ( fabs(a) < fabs(b) ? (a) : (b) ) #define fabsmax(a, b) ( fabs(a) > fabs(b) ? (a) : (b) ) class dSolvePARMS : public MatriceMorse::VirtualSolver { char mat_domain[BUFLEN]; int *riord; mutable int n, nnz, nloc; int iov, scale, unsymm, method,solver,VERBOSE; string data_option; int rk, size; mutable double *rhs1, res; //double t1, t2, t3, t4; double *u, *v; int job,i1,i2; mutable DistMatrix dm; //distributed matrix object mutable PrePar prepar; mutable PreCon precon; //structure for preconditioner mutable IterPar ipar; //structure for iteration mutable int * maptmp1, *mapptr1; double eps, tol_pivot_sym,tgv, tol_pivot,epsr; mutable double t1,t2,t3,t4; mutable char * meth[14]; mutable int *maptmp, *mapptr,*iwork1,*iwork; mutable double *scaletmpr, *scaletmpc; mutable MPI_Comm comm; char *p; //Constructor construct the distribute matrix and also preconditionner public: dSolvePARMS(const MatriceMorse &AA,string datafile, KN ¶m_int, KN ¶m_double, MPI_Comm * mpicommw) { int n,i,job,nnz,ierr,tmp; int *ptr2,*id_rows2; double *vals2; double *AAv; int *p, *pr; int j, node; /* Initialize PARMSARSLIB environment */ if(mpicommw==NULL){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; // comm=MPI_COMM_WORLD; ierr = MPI_Comm_rank(comm, &rk); ierr = MPI_Comm_size(comm, &size); parm_param * pp; /*Differents preconditionners use*/ meth[0]=(char *)malloc(sizeof(char)*9); strcpy(meth[0],"add_ilu0"); meth[1]=(char *)malloc(sizeof(char)*9); strcpy(meth[1],"add_ilut"); meth[2]=(char *)malloc(sizeof(char)*9); strcpy(meth[2],"add_iluk"); meth[3]=(char *)malloc(sizeof(char)*9); strcpy(meth[3],"add_arms"); // FFCS - fixed "buffer overflow" warning by JHunt meth[4]=(char *)malloc(sizeof(char)*10); strcpy(meth[4],"lsch_ilu0"); meth[5]=(char *)malloc(sizeof(char)*10); strcpy(meth[5],"lsch_ilut"); meth[6]=(char *)malloc(sizeof(char)*10); strcpy(meth[6],"lsch_iluk"); meth[7]=(char *)malloc(sizeof(char)*10); strcpy(meth[7],"lsch_arms"); meth[8]=(char *)malloc(sizeof(char)*10); strcpy(meth[8],"rsch_ilu0"); meth[9]=(char *)malloc(sizeof(char)*10); strcpy(meth[9],"rsch_ilut"); meth[10]=(char *)malloc(sizeof(char)*10); strcpy(meth[10],"rsch_iluk"); meth[11]=(char *)malloc(sizeof(char)*10); strcpy(meth[11],"rsch_arms"); meth[12]=(char *)malloc(sizeof(char)*10); strcpy(meth[12],"sch_gilu0"); meth[13]=(char *)malloc(sizeof(char)*8); strcpy(meth[13],"sch_sgs"); /*storage format of the matrix*/ char pcrM[4]; strcpy(pcrM,"csr"); /*- Create Distributed Matrix dm in CSR format */ CreateMat(&dm, pcrM); dm->comm->mpi_comm=comm;dm->comm->myproc=rk; dm->comm->npro=size; /*------ Create PrePar /iterPar pointer */ /*---- parameters for preconditioning and iteration*/ if((datafile.empty())&&(param_double==NULL)&&(param_int==NULL)){ if(dm->comm->myproc==0) printf("%s","We are going to set default parameters because user did not specify any one \n \n "); parm_param * pp= new parm_param(); iov=pp->iov; scale=pp->scale; unsymm=pp->unsymm; method= assignprecon(meth[pp->method], dm); prepar=pp->prepar; ipar=pp->ipar; VERBOSE=pp->VERBOSE; solver=pp->solver; } if(((param_double!=NULL)||(param_int!=NULL))&&(datafile.empty())) { if(dm->comm->myproc==0) printf("%s","User have set parameter inside vector of parameter \n"); parm_param * pp= new parm_param(param_int, param_double); iov=pp->iov; scale=pp->scale; unsymm=pp->unsymm; method= assignprecon(meth[pp->method], dm); prepar=pp->prepar; ipar=pp->ipar; VERBOSE=pp->VERBOSE; solver=pp->solver; } if((!datafile.empty())&&((param_double==NULL)&&(param_int==NULL))) { if(dm->comm->myproc==0) printf("%s","User have set parameter inside file of parameter \n"); parm_param * pp= new parm_param(datafile, dm); iov=pp->iov; scale=pp->scale; unsymm=pp->unsymm; method=pp->method; prepar=pp->prepar; ipar=pp->ipar; VERBOSE=pp->VERBOSE; solver=pp->solver; } if(((solver==1)||(solver==2))&&((method!=0)||(method!=4))) { if(dm->comm->myproc==0) printf("%s%s%s", "WE NOT GARANTI THE PRECONDITIONNER WILL WORK BECAUSE ACCELARATOR ", meth[method] ," NO NEED INNER ITERATION \n"); //MPI_Finalize(); } if((dm->comm->myproc==0)&&(VERBOSE>=0)){ printf("###########################################\n"); printf("######### CALLING PARMS PACKAGE ###########\n"); if(solver==0) printf("########### SOLVER : FGMRES #######\n"); if(solver==1) printf("########### SOLVER : BiCGStab #######\n"); if(solver==2) printf("########### SOLVER : DGMRES #######\n"); printf("%s%s%s","########### PRECONDITIONNER : ", meth[method], "\n" ); printf("###########################################\n"); } /*----from zero-based to 1-based before calling pARMS routine----*/ n=AA.n; nnz=AA.nbcoef; PARMS_malloc(pr,n+1,int) ; PARMS_malloc(p,nnz,int) ; PARMS_malloc(AAv,nnz,double) ; for(i=0;i1){ METIS_PartGraphVKway(&n, pr, p, NULL, NULL, &wgtflag, &numflag,&size, option, &volume, riord); } else if(size==1){ for (i=0; ipgfpar[0] == 0.0){ if (rk == 0) fprintf(stderr, "Error: Tolerance for inner solver\n"); ierr = 1; } if (ipar->ipar[3] == 0){ if (rk == 0) fprintf(stderr, "Error: Krylov subspace size for inner solver\n"); ierr = 1; } if (ipar->ipar[4] == 0){ if (rk == 0) fprintf(stderr, "Error: Maximum number of inner iterations\n"); ierr = 1; } if (ierr == 1){ if (rk == 0) fprintf(stderr,"should be nonzero to invoke the Schur Complement iteration\n "); PARMS_Final(); exit(1); } } /*----- create preconditioner */ if(VERBOSE==3){ MPI_Barrier(dm->comm->mpi_comm); t1 = dwalltime();} ierr = CreatePrec(dm,&precon,method,prepar,ipar); if(VERBOSE==3) { MPI_Barrier(dm->comm->mpi_comm); t2 = dwalltime(); t2 = fabs(t2-t1); double tmax=0.0; MPI_Reduce(&t2, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0,dm->comm->mpi_comm); MPI_Bcast(&tmax, 1, MPI_INT,0,dm->comm->mpi_comm); t2=tmax; } /*----- check for errors in preconditioning construction, quit if any */ if (ierr != 0) fprintf(stderr, "Fatal Error (ierr = %d) in preconditioner construction on processor %d\nExiting...\n", ierr, rk); ierr = ierr*ierr; int tmp_ierr=0; MPI_Allreduce(&ierr, &tmp_ierr, 1, MPI_INT, MPI_SUM, dm->comm->mpi_comm); if ( tmp_ierr > 0 ){ /* delete distributed local matrix */ DeleteMat(&dm); /* delete distributed local vector */ free(prepar); free(ipar); free(pp); /* exit PARMS and MPI environment */ PARMS_Final(); exit(1); } } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { /* Vec structure rhs -- right hand side, sol -- solution, xsol -- exact solution */ Vec sol, rhs; int i,comt,node; int * poloc; double res1; double dnnz_pre, dgprec_nnz; nnz=AA.nbcoef; CreateVec(&rhs); CreateVec(&sol); n=AA.n; double * rhsb=(double *)malloc(sizeof(double)*n); for(i=0;ivec, nloc, double); PARMS_malloc(poloc, nloc, int); comt=0; if(scale) { for(i = 0; i < n; i++) rhsb[i] *= scaletmpr[i]; } for(i=i1;i<=i2;i++) { node = maptmp1[i-1];poloc[comt]=node-1; rhs->vec[comt]=rhsb[node-1];comt++; } /*----Iteration count-------------------------------------*/ ipar->in_iters=0; ipar->iters=0; /*--- Permute RHS according to result of setup routine ---*/ setuprhs(rhs); /*------- populate the initial guess with values */ VecSetVal(sol,0.0); /*------- calculate the norm of the residual on input */ res1 = ResiNorm2(dm, sol, rhs); if(VERBOSE==3){ MPI_Barrier(dm->comm->mpi_comm); t3 = dwalltime(); } double dgnnz; if(VERBOSE==3){ dnnz_pre = precon->nnz_pre; dgnnz = (double)nnz; dgprec_nnz=0; MPI_Reduce(&dgprec_nnz, &dnnz_pre, 1, MPI_DOUBLE, MPI_SUM, 0, dm->comm->mpi_comm); } if(rk == 0) { printf("Total NNZ(PreCon) / (NNZ*npro) = %6.2f\n",dgprec_nnz/dgnnz); } if(solver==0) fgmresd(dm,precon,ipar,rhs,sol); if(solver==1) dgmresd(dm,precon,ipar,rhs,sol); if(solver==2) bcgstabd(dm,precon,ipar,rhs,sol); res = ResiNorm2(dm, sol, rhs); if(VERBOSE==3){ MPI_Barrier(dm->comm->mpi_comm); t4 = dwalltime(); t4 = fabs(t4-t3); double tmax=0; MPI_Reduce(&t4, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0,dm->comm->mpi_comm); MPI_Bcast(&tmax, 1, MPI_DOUBLE,0,dm->comm->mpi_comm); t4=tmax; } /*----find the norm of the solution error */ i=1; t3 = -1.0; int j; for (i=0; inode[i]-1; /* get the global node corresponding to node i*/ poloc[i]=j; } if (scale){ /*--------- apply permutations to scaletmp */ for (i=0; inode[i]-1; /* get the global node corresponding to node i*/ sol->vec[i] = sol->vec[i]*scaletmpc[j]; /*---- find the residual of the computed solution */ } } /*----- compute the relative error of computed solution */ if((dm->comm->myproc == 0)&&(VERBOSE==3)) { fprintf(stdout,"################ SOLVER STATISTICS ####################\n"); fprintf(stdout, "OUTER ITERATIONS COUNT IS %d\n", ipar->iters); fprintf(stdout, "INNER ITERATION COUNT IS %d\n", ipar->in_iters); fprintf(stdout, "THE TOTAL TIME IS %16.8f\n", t2+t4); fprintf(stdout, "THE TIME FOR CREATING PRECONDITIONER IS %16.8f\n", t2); fprintf(stdout, "THE TIME FOR SOLVING PROCESS is %16.8f\n", t4); fprintf(stdout, "The 2-NORM OF THE RELATIVE RESIDUAL IS %16.8g\n", res/res1); } if((dm->comm->myproc == 0)&&(VERBOSE==2)) { fprintf(stdout, "THE TOTAL TIME IS %16.8f\n", t2+t4); fprintf(stdout, "THE TIME FOR CREATING PRECONDITIONER IS %16.8f\n", t2); fprintf(stdout, "THE TIME FOR SOLVING PROCESS is %16.8f\n", t4); } if((dm->comm->myproc == 0)&&(VERBOSE==1)) { fprintf(stdout, "OUTER ITERATIONS COUNT IS %d\n", ipar->iters); fprintf(stdout, "INNER ITERATION COUNT IS %d\n", ipar->in_iters); fprintf(stdout, "The 2-NORM OF THE RELATIVE RESIDUAL IS %16.8g\n", res/res1); } double * xx= (double *)malloc(sizeof(double)*n); comt=0; for(i=0;icomm->npro;i++) mapptr[i]--; int *displs, *perm; PARMS_malloc(displs, nloc, int);PARMS_malloc(perm, n, int); MPI_Gatherv(&(sol->vec[0]), nloc, MPI_DOUBLE, &(xx[0]), iwork, mapptr , MPI_DOUBLE, 0,comm ); MPI_Gatherv(&(poloc[0]), nloc, MPI_INT, &(perm[0]), iwork, mapptr , MPI_INT, 0,comm ); MPI_Bcast(perm,AA.n,MPI_INT,0, comm); int *invp=(int *)malloc(sizeof(int)*n); for(i=0;icomm->myproc==0){for(i=0;icomm->npro;i++) mapptr[i]++; /*Delete use vectors*/ DeleteVec(&sol); DeleteVec(&rhs); free(xx); //This should be in Destructor free(perm); free(invp); } ~dSolvePARMS() { if(VERBOSE==3){ cout << "~SolvePARMS:" << endl; free(mapptr); DeletePrec(precon); free(scaletmpc); free(scaletmpr); /*---- Delete distributed local matrix */ DeleteMat(&dm); /*---- Delete distributed local vector */ free(prepar); free(ipar); /*Delete matrix and right hand side*/ } //PARMS_Final(); } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; inline MatriceMorse::VirtualSolver * BuilddSolvePARMS(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverMUMPSmpi" << endl; return new dSolvePARMS(*A,ds.data_filename, ds.lparams, ds.dparams,(MPI_Comm *)ds.commworld); } class Init { public: Init(); }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return TRUE; } bool SetdSolvePARMS() { if(verbosity>1) cout << " SetDefault sparse solver to PARMS" << endl; DefSparseSolver::solver =BuilddSolvePARMS; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return TRUE; } Init init; Init::Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pARMSmpi, defaultsolver defaultsolverpARMSmpi" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuilddSolvePARMS; //DefSparseSolver::solver =BuildSolverMUMPSmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttopARMSmpi","(",new OneOperator0(SetdSolvePARMS)); } freefem++-3.38-1/src/solver/README_COMPILE000644 000767 000024 00000025161 11406142256 017743 0ustar00hechtstaff000000 000000 ############################################# # README_COMPILE: # # HELP TO COMPILE THE DIFFERENT SPARSE SOLVER # ############################################# General pre-requirements : - C, C++ and Fortran (f77, f90) compilers - MPI library - BLAS library These different elements are defined in the configure step of the compilation FreeFem++. Therefore, it must be same for the following solver. For computation, it is important to have an optimized BLAS. Among optimized BLAS can be cited ATLAS (Automatically Tuned Linear Algebra Software) http://math-atlas.sourceforge.net/ (BSD licence), GotoBLAS http://www.tacc.utexas.edu/resources/software/ (UT TACC Research license). These library can be used free under their license limitation. For GotoBLAS, the software and documentation can be used without any charge for academic, research, experimental or personal use. For commercial use, it is required to purchase a license. For more details, please see the UT TACC Research license http://svn.pardus.org.tr/uludag/trunk/pisi/licenses/tacc. Remark: In Mac OSX, a problem occur in calling the Blas function CDOTC, CDOTU, ZDOTC, ZDOTU with veclib in Fortran (see http://developper.apple.com/hardwaredrivers/ve/errata.html). A patch for the library veclib is given in the directory PATCHVECLIB. A) Sparse Direct Solver We have interfaced freefem++ with the following parallel sparse direct solver: SuperLU_DIST, MUMPS and pastix. These solver used different ordering library: Metis, ParMetis and scotch and pt-scotch. 1. SuperLU_DIST The interface of SuperLU_DIST with freefem++ was tested with the version 3.2 of SuperLU_DIST. This solver use the external ordering libraries: Metis and ParMetis. To used these ordering or parallel symbolic factorization (which depend on ParMetis) in SuperLU_DIST, we need to install them. In the section ordering library, a description of installation of Metis and ParMetis is given. pre-requirement: - Metis and ParMetis ordering libraries installation procedure: - install Metis and ParMetis (see section ordering library for more details) - donwload the SuperLU_DIST 3.2 package on the web site http://crd.lbl.gov/~xiaoye/SuperLU - untar and decompress the tar.gz file tar xvfz superlu_dist_2.3.tar.gz - go to the directory SuperLU_DIST_3.2 - edit the make.inc to yours system (see the README file in this directory for more details) - compilation can be done by simply typing "make" on this directory. compilation of freefem++ load file of SuperLU_DIST (interface): - go to the directory /src/solver/ on the tree of the source code of Freefem++ - edit the makefile-sparsesolver.inc - type in this directory "make rslu_dist"(resp."make cslu_dist") to obtain dynamic library of the interface for real (resp. complex) arithmetic. References on SuperLU_DIST: [1] SuperLU_DIST: A Scalable Distributed-Memory Sparse Direct Solver for Unsymmetric Linear Systems. Xiaoye S. Li and James W. Demmel. ACM Trans. on Math. Software, Vol. 29, No. 2, pp.110-140, 2003. [2] Parallel Symbolic Factorization for Sparse LU with Static Pivoting. L. Grigori, J. Demmel and X.S. Li. SIAM J. Sci. Comp, Vol. 29, Issue 3, pp 1289--1314, 2007. 2. MUMPS MUMPS is a package writing in fortran 90. So we need a fortran compiler. The interface of MUMPS with freefem++ was tested with the version 4.8.3 and 4.8.4 of MUMPS. This solver use the external libraries: BLAS, BLACS, LAPACK, ScaLAPACK, Metis, ParMetis and Scotch. BLAS and LAPACK are installed in most of system now. Therefore, we only describe BLACS and ScaLAPACK installations. BLAS, BLACS and LAPACK are libraries need by ScaLAPACK. Hence, we need to compile BLACS before. A ScaLAPACK installer allow to download, compile and install automatically all the following librairies BLAS, LAPACK, BLACS and ScaLAPACK. This installer is based on Python and it can download at http://www.netlib.org/scalapack/. Here, we describe only the installation procedure by hand of BLACS and ScaLAPACK. Pre-requirement: - Fortran 90 compiler - BLACS (http://www.netlib.org/blacs/) - LAPACK (http://www.netlib.org/lapack/) - SCALAPACK (http://www.netlib.org/scalapack/) - Metis and Scotch ordering (optional). It is recommended by the MUMPS team to have full possibility to ordering automatically. Installation procedure for BLACS and ScaLAPACK: a) installation of BLACS - download on the website http://www.netlib.org/blacs/ : mpiblacs.tgz, mpiblacs-patch03.tgz and blacstester.tgz - decompress all these file tar -xvzf mpiblacs.tgz tar -xvzf mpiblacs-patch03.tgz tar -xvzf blacstester.tgz - go to the directory BLACS. - edit the Bmake.inc for yours system (some example of Bmake.inc is given in the directory BMAKES). Please refer to blacs_install.ps on the web site of BLACS for more information about this file. - the installation can be done by typing "make mpi" in this directory. b) installation of ScaLAPACK - download the file "scalapack.tgz" on the website http://www.netlib.org/scalapack/. - decompress this file tar -xvzf scalapack.tgz - go to the directory's created scalapack-1.8.0 - edit the SLmake.inc for your system (some example of SLmake.inc is given in the directory INSTALL). Please refer to scalapack_install.ps on the web site of ScaLAPACK for more information about this file. - the installation can be done by typing "make" in this directory. Installation procedure for MUMPS: - install BLACS, SCALAPACK, Metis ordering(optional) and Scotch ordering (optional). Please see section ordering library for Metis and Scotch. - go to website http://mumps.enseeiht.fr/ to fill the download request submission. - decompress the tar.gz file. tar -xvfz MUMPS_4.8.4.tar.gz - go to the directory MUMPS_4.8.4. - edit the Makefile.inc to yours system (see README file in this directory and example of Makefile.inc in the directory Make.inc). - compilation can be done by simply "make" in this directory. Compilation of freefem++ load file of MUMPS(interface) - go to the directory /src/solver/ on the tree of the source code of Freefem++. - edit the makefile-sparsesolver.inc. - type in this directory "make mumps" to obtain dynamic library of the interface. References on MUMPS: [1] P. R. Amestoy, I. S. Duff and J.-Y. L'Excellent. Multifrontal parallel ditributed symmetric and unsymmetric solvers, in Comput. Methods in Appl. Mech. Eng., 184, pp 501-520, 2000. [2] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent. A fully asynchronous multifrontal solver using distributed dynamic scheduling, SIAM J. Math. Anal. and Appl., Vol. 23(1), pp 15-41, 2001. [3] P. R. Amestoy, A. Guermouche, J.-Y.L'Excellent and S. Pralet. Hybrid scheduling for the parallel solution of linear systems. Parallel Computing, Vol. 32(2), pp 136-156, 2006. 3. Pastix The interface of pastix with freefem++ was tested with the package pastix_release_2200.tar.bz2. The distributed matrix version of pastix is under developpement and some bug are not fixed in this release. The interface with distributed matrix version of pastix in Freefem++ is not given yet for this reason. Pre-requirement : - Fortran 90 compiler - Scotch or Metis ordering Procedure installation: - install Scotch or Metis ordering - download on the website http://gforge.inria.fr/frs/?group_id=248 the pastix package. - decompress the package pastix_releas_***. - go to the pastix directory's created. For package pastix_release_2200.tar.bz2, this directory is pastix_release_2200. - go to the directory src. Installation instruction are given in the file INSTALL.txt. - select the config file corresponding to your machine (these files are located in the directory config) and copy this file in the main src directory of pastix. For Mac, just type cp config/Mac.in config.in (if there is not a config file corresponding copy one of them). - adapt the config.in to yours system. For freefem++ interface, the double precision support must be selected. - compile the Pastix library make expor - install the Pastix library make install The header file and Pastix library are located in the directory pastix_release_2200/install for the package pastix_release_2200.tar.bz2. We have constructed interface for real and complex support. The header file and Pastix library are compile for one of these arithmetics (see the file config.in). A simple method to obtain these two arithmetics is to compile and install pastix in two different directory. Compilation of freefem++ load file of pastix(interface) - go to the directory src/solver/ on the tree of the source code of Freefem++. - edit the makefile makefile-sparsesolver.inc. - type in this directory make rpastix (real dynamic library) make cpastix (complex dynamic library) References on Pastix: [1] P. Hnon, P.Ramet and J. Roman. PaStiX: A High-Performance Parallel Direct Solver for Sparse Symmetric Definite Systems. Parallel Computing, Vol. 28(2), pp. 301-321, 2002. B) Sparse Iterative Solver under construction C) Ordering 1. Metis and ParMetis The Metis Library is include in ParMetis package. Hence, we only need to build ParMetis. To install ParMetis, download on the web site http://glaros.dtc.umn.edu/gkhome/metis/parmetis/download the file ParMetis-3.1.1. After this, read installation instuction on this web page to obtain ParMetis's library. References on Metis and ParMetis: [1] G. Karypis and V. Kumar. A fast and Highly Quality Multilevel Scheme for Partitioning Irregular Graphs. SIAM J. Sci. Comp., Vol. 20(1), pp. 359 - 392, 1999. [2] G. Karypis and V. Kumar. A Parallel Algorithm for Multilevel Graph Partitioning and Sparse Matrix Ordering. Journal of Parallel and Distributed Computing. Vol. 48, pp. 71-85, 1998. 2. Scotch and Pt-Scotch Scotch and Pt-Scotch are include in the same package. This file can be download on http://www.labri.fr/perso/pelegrin/scotch/. We must take the version of Scotch with interface for mumps. This file is named scotch_*.*.*_esmumps.tar.gz where *.*.* is the number of version of scotch. After decompress this file tar -xvfz scotch_*.*.*_esmumps.tar.gz. Go to the new directory named scotch_*.*_esmumps. Go to the src directory and edit makefile.inc to your system. The instruction for fill this file is given in scotch_*.*_esmumps/INSTALL.txt. To compile these libraries, just type "make" and "make ptscotch". References on Scotch and Pt-Scotch: [1] C. Chevalier and F. Pellegrini, PT-SCOTCH: a tool for efficient parallel graph ordering. Parallel Computing, 34(6-8), pp. 318-331, 2008. [2] F. Pellegrini and J. Roman, SCOTCH: a software package for static mapping by dual recursive bipartitioning of process and architecture graphs. In: Proc. HPCN'96, Brussels. LNCS, Vol 1067, pp 493-498, 1996. freefem++-3.38-1/src/solver/real_pastix_FreeFem.cpp000644 000767 000024 00000052111 11406226636 022323 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* Interface entre freefem++ et pastix */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include #include #include #include #include #include #include #include #include // #include // #include // #include // #include // //#include // #include // #include // #include // #include "mpi.h" // #include // #include "pastix.h" // #include "cscd_utils.h" // #include "read_matrix.h" #include #ifdef __cplusplus extern "C" { #endif #include "pastix.h" //#include "cscd_utils.h" #ifdef __cplusplus } #endif //#include "read_matrix.h" #undef memFree_null #define memFree_null(x) {if (x ==NULL) {fprintf(stdout,"%s:%d freeing NULL\n",__FILE__,__LINE__);} free(x); x=NULL;} #define STR_SIZE 256 static pastix_int_t * pastixint(int * ii){ return (pastix_int_t*) (void *) ii;} static pastix_float_t * pastixfloat(double * ii){ return (pastix_float_t*) (void *) ii;} typedef struct pastix_param { pastix_data_t *pastix_data; /*Pointer used by PaStiX to keep information alive between calls */ MPI_Comm comm; /* Communicator used by PaStiX */ pastix_int_t Ncol; /* Size of the Matrix */ pastix_int_t *ia; /* Index of first element of each column in ja and avals */ pastix_int_t *ja; /* Rows of the unknows of the matrix */ pastix_float_t *avals; /* Values of the matrix */ pastix_int_t *perm; /* Permutation used for re-numbering of the unknowns */ pastix_int_t *invp; /* Inverse permutation */ pastix_float_t *rhs; /* Right hand side */ pastix_int_t *iparm; /* Integer parameters */ double *dparm; /* Floating parameters */ } pastix_param_t; void Morse_to_CSC(int m, int n, int nnz, double *a, int *colind, int *rowptr, pastix_float_t **at, pastix_int_t **rowind, pastix_int_t **colptr) { register int i, j, col, relpos; pastix_int_t *marker; /* Allocate storage for another copy of the matrix. */ *at = (pastix_float_t *) malloc(sizeof(pastix_float_t)*nnz); *rowind = (pastix_int_t *) malloc(sizeof(pastix_int_t)*nnz); *colptr = (pastix_int_t *) malloc(sizeof(pastix_int_t)*(n+1)); marker = (pastix_int_t *) malloc(sizeof(pastix_int_t)*n); for (i = 0; i < n; ++i) marker[i] = 0; /* Get counts of each column of A, and set up column pointers */ for (i = 0; i < m; ++i) for (j = rowptr[i]; j < rowptr[i+1]; ++j) ++marker[colind[j]]; (*colptr)[0] = 0; for (j = 0; j < n; ++j) { (*colptr)[j+1] = (*colptr)[j] + marker[j]; marker[j] = (*colptr)[j]; } /* Transfer the matrix into the compressed column storage. */ for (i = 0; i < m; ++i) { for (j = rowptr[i]; j < rowptr[i+1]; ++j) { col = colind[j]; relpos = marker[col]; (*rowind)[relpos] = i; (*at)[relpos] = a[j]; ++marker[col]; } } free(marker); } static const int MAX_CHAR_PER_LINE=256; //void read_datafile_pastixff(const string &datafile, pastix_int_t *iparmtab, double *dparmtab){ void read_datafile_pastixff(const string &datafile, int &mpi_flag, pastix_int_t *iparmtab, double *dparmtab){ FILE* m_File; int i = 0; char szbuff[MAX_CHAR_PER_LINE]; char* token; char filename[datafile.size()+1]; strcpy( filename, datafile.c_str()); m_File = fopen(filename,"rt"); if(!m_File) { printf("error in reading filename %s\n",&filename); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"matrix") == 0) ){ printf("freefem++: error in reading matrix parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading matrix parameter for pastix \n"); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if(strcmp(token,"assembled") == 0) mpi_flag = 0; else if(strcmp(token,"distributedglobal") == 0) mpi_flag = 1; else if(strcmp(token,"distributed") == 0) mpi_flag = 2; else{ printf("value of parameter matrix is not correct %s \n", token ); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"iparm") == 0) ){ printf("freefem++: error in reading iparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading iparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); iparmtab[i] = (pastix_int_t)atol(token); i++; } i=0; fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"dparm") == 0) ){ printf("freefem++: error in reading dparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading dparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); dparmtab[i] = atof(token); i++; } fclose(m_File); #ifdef OOC /* if (iparmtab[IPARM_OOC_THREAD] > 1) */ iparmtab[IPARM_OOC_THREAD] = 1; #endif /* On empeche le 2d avec NUMA_ALLOC */ #ifdef NUMA_ALLOC if (iparmtab[IPARM_DISTRIBUTION_LEVEL] != 0) { errorPrint("2D not available with NUMA allocation\n"); exit(-1); } #endif } // ATTENTION :: pastix_float_t // peut tre soit un complex ou un reel cela depend de la maniere dont on a compiler pastix // CAS DOUBLE SEULEMENT class dSolvepastixmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 int paraoption; int myid, mpi_size; int Nrow; int mpi_flag; int init_raff; int thrd_flag; int SYM; string data_option; mutable pastix_int_t iparm[64]; mutable double dparm[64]; mutable pastix_int_t Ncol; mutable pastix_int_t *ia; mutable pastix_int_t *ja; mutable pastix_float_t *avals; mutable pastix_int_t *loc2glob; //char *Type = NULL; //char *RhsType = NULL; mutable pastix_float_t *rhs; mutable pastix_int_t *perm; mutable pastix_int_t *invp; mutable pastix_data_t *pastix_data; public: dSolvepastixmpi(const MatriceMorse &AA, int strategy, double ttgv, double epsilon, double pivot, double pivot_sym, string datafile, KN &pparam_int, KN &pparam_double, KN &pperm_r, KN &pperm_c) : eps(epsilon),epsr(0), tgv(ttgv),tol_pivot_sym(pivot_sym),tol_pivot(pivot), data_option(datafile) { KN_ param_int(pparam_int); KN_ param_double(pparam_double); //int m; //int ierr; struct timeval tv1, tv2; int nnz; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); ia = NULL; ja = NULL; avals = NULL; loc2glob = NULL; rhs = NULL; pastix_data = NULL; // matrix assembled on host MPI_Comm_rank(MPI_COMM_WORLD, &myid); printf("- Rang MPI : %d\n", myid); MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); // SYMETRIQUE // MPI_flag need to unselect for non distributed matrix mpi_flag = 0; thrd_flag = 0; // ###################### //pastix_int_t init_raff; fprintf(stdout,"-- INIT PARAMETERS --\n"); // reading iparm from array if(!data_option.empty()){ read_datafile_pastixff(data_option,mpi_flag,iparm,dparm); if(mpi_flag != 0) cerr << "ERROR :: GLOBAT INPUT MATRIX FOR ALL PROCS matrix=assembled" << endl; } else if( !(param_int==NULL) || !(param_double==NULL) ){ if( !(param_int==NULL) ) { cout << "read param_int" << endl; assert(param_int.N() == 64); for(int ii=0; ii<64; ii++) iparm[ii] = param_int[ii]; iparm[IPARM_MODIFY_PARAMETER] = API_YES; } if( !(param_double==NULL) ) { cout << "read param_double" << endl; assert(param_double.N() == 64); for(int ii=0; ii<64; ii++) dparm[ii] = param_double[ii]; } } else{ iparm[IPARM_MODIFY_PARAMETER] = API_NO; cout << "initialize parameter" << endl; } //################################ if( myid==0 ){ Ncol = AA.m; Nrow = AA.n; nnz = AA.nbcoef; // Avant : on ecrit la transpose // AA.cl : indices des colonnes // AA.lg : pointeurs des lignes Morse_to_CSC( AA.n , AA.m, AA.nbcoef, AA.a, AA.cl, AA.lg, &avals, &ja, &ia); // ia : pointeurs des colonnes // ja : indices des lignes cout << "AA.n= "<< AA.n << " AA.m=" << AA.m << " AA.nbcoef=" << AA.nbcoef << endl; for(int ii=0; ii < Ncol+1; ii++){ ia[ii] = ia[ii]+1; } assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++){ ja[ii] = ja[ii]+1; } MPI_Bcast( &Ncol, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &Nrow, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &nnz, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, MPI_COMM_WORLD ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); } else{ MPI_Bcast( &Ncol, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &Nrow, 1, MPI_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( &nnz, 1, MPI_INT, 0, MPI_COMM_WORLD ); avals = (pastix_float_t *) malloc( nnz*sizeof(pastix_float_t) ); ia = (pastix_int_t *) malloc( (Ncol+1)*sizeof(pastix_int_t) ); ja = (pastix_int_t *) malloc( nnz*sizeof(pastix_int_t) ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, MPI_COMM_WORLD ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, MPI_COMM_WORLD ); } perm = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); invp = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); rhs = (pastix_float_t *) malloc(Ncol*sizeof(pastix_float_t)); // reading permutation given by the user if(pperm_r) for(int ii=0; ii < Ncol; ii++) perm[ii] = pperm_r[ii]; if(pperm_c) for(int ii=0; ii < Ncol; ii++) invp[ii] = pperm_c[ii]; iparm[IPARM_START_TASK] = API_TASK_INIT; iparm[IPARM_END_TASK] = API_TASK_INIT; iparm[IPARM_SYM] = API_SYM_NO; // Matrix is considered nonsymetric if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; fprintf(stdout,"-- FIN INIT PARAMETERS --\n"); init_raff = iparm[IPARM_ITERMAX]; fflush(stdout); /* Passage en mode verbose */ iparm[IPARM_RHS_MAKING] = API_RHS_B; if( (param_int==NULL) && data_option.empty() ){ iparm[IPARM_MATRIX_VERIFICATION] = API_YES; iparm[IPARM_REFINEMENT] = API_RAF_GMRES; iparm[IPARM_INCOMPLETE] = API_NO; } if( (param_double==NULL) && data_option.empty()){ dparm[DPARM_EPSILON_REFINEMENT] = 1e-12; dparm[DPARM_EPSILON_MAGN_CTRL] = 1e-32; } // cscd_checksym(Ncol, ia, ja, loc2glob, MPI_COMM_WORLD); // if (iparm[IPARM_SYM]==API_SYM_YES) // { // /* Symetric problem */ // /* Build non oriented graph */ // /* build non symmetric csc from symmetric csc */ // /*maillage global*/ // INT *tmpia; // INT *tmpja; // INT tmpn; // cscd_symgraph_int(*n2, *col2, *row2 , NULL, // &tmpn, &tmpia, &tmpja, NULL, // *loc2glob2, pastix_comm, API_YES); // memFree_null(*col2); // *col2 = tmpia; // memFree_null(*row2); // *row2 = tmpja; // *n2 = tmpn; // } SYM = AA.symetrique; cout << "SYM = "<< SYM << endl; // SYMETRIQUE if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } /* Scotch */ fprintf(stdout,"-- Scotch --\n"); fflush(stdout); iparm[IPARM_START_TASK] = API_TASK_ORDERING; iparm[IPARM_END_TASK] = API_TASK_ORDERING; if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; iparm[IPARM_SYM] = API_SYM_NO; /* Fax */ fprintf(stdout,"-- Fax --\n"); iparm[IPARM_START_TASK] = API_TASK_SYMBFACT; iparm[IPARM_END_TASK] = API_TASK_SYMBFACT; if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Blend */ fprintf(stdout,"-- Blend --\n"); iparm[IPARM_START_TASK] = API_TASK_ANALYSE; iparm[IPARM_END_TASK] = API_TASK_ANALYSE; if( SYM == 1 ){ //iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ //iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Factorisation */ iparm[IPARM_START_TASK] = API_TASK_NUMFACT; iparm[IPARM_END_TASK] = API_TASK_NUMFACT; gettimeofday(&tv1, NULL); fprintf(stdout,"-- SOPALIN --\n"); if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call factorization : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; if(verbosity) if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000); printf("=====================================================\n"); cout << " pastix : time factorization :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { struct timeval tv1, tv2; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); // index for pastix for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]+1; assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]+1; // give value of the second member for(int ii=0; ii < Ncol; ii++){ rhs[ii] = b[ii]; } //fprintf(stdout,"SOLVE STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* updo */ iparm[IPARM_START_TASK] = API_TASK_SOLVE; iparm[IPARM_END_TASK] = API_TASK_SOLVE; iparm[IPARM_RHS_MAKING] = API_RHS_B; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call updown : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); //if(verbosity > 1) // for(int jj=0; jj < Ncol; jj++) //cout << "rhs["<< jj << "]=" << rhs[jj] << endl; //fprintf(stdout,"RAFF STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* raff */ iparm[IPARM_START_TASK] = API_TASK_REFINE; iparm[IPARM_END_TASK] = API_TASK_REFINE; iparm[IPARM_RHS_MAKING] = API_RHS_B; iparm[IPARM_ITERMAX] = init_raff; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call refinement : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < Ncol; ii++) x[ii] = rhs[ii]; // index for freefem assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; if(verbosity) if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " pastix : time solve :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverpastix_real_mpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverpastix_real_mpi" << endl; return new dSolvepastixmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c); } class Init { public: Init(); }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; } bool Setpastixmpi() { if(verbosity) cout << " SetDefault sparse solver to pastixmpi" << endl; DefSparseSolver::solver =BuildSolverpastix_real_mpi; //DefSparseSolver::solver =BuildSolverpastix_real_mpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; } Init init; Init::Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pastix, defaultsolver defaultsolverpastix" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverpastix_real_mpi; //DefSparseSolver::solver =BuildSolverpastix_real_mpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("realdefaulttopastix","(",new OneOperator0(Setpastixmpi)); } freefem++-3.38-1/src/solver/real_SuperLU_DIST_FreeFem.cpp000644 000767 000024 00000054642 11406226636 023210 0ustar00hechtstaff000000 000000 // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: superlu_dist parmetis metis blas //ff-c++-cpp-dep: // // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "mpi.h" #include "superlu_ddefs.h" #include "ffsuperludistoption.hpp" template struct SuperLUmpiDISTDriver { }; template <> struct SuperLUmpiDISTDriver { /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_D;} static void pgssvx(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, double *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, SOLVEstruct_t *p9, double *p10, SuperLUStat_t *p11, int *p12) { pdgssvx( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 ); } static void pgssvx_ABglobal(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, double *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, double *p9, SuperLUStat_t *p10, int *p11) { pdgssvx_ABglobal( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11); } static void Print_CompRowLoc_Matrix_dist(SuperMatrix *p1) { dPrint_CompRowLoc_Matrix_dist(p1); } static void Create_CompCol_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, double *p5, int_t *p6, int_t *p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { dCreate_CompCol_Matrix_dist(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); } static void Create_CompRowLoc_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, int_t p5, int_t p6, double *p7, int_t *p8, int_t *p9, Stype_t p10, Dtype_t p11, Mtype_t p12) { dCreate_CompRowLoc_Matrix_dist( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12); } static void CompRow_to_CompCol_dist(int_t p1, int_t p2, int_t p3, double *p4, int_t *p5, int_t *p6, double **p7, int_t **p8, int_t **p9) { dCompRow_to_CompCol_dist( p1,p2,p3,p4,p5,p6,p7,p8,p9 ); } static void Create_Dense_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, double *p4, int_t p5, Stype_t p6, Dtype_t p7, Mtype_t p8) { dCreate_Dense_Matrix_dist( p1,p2,p3,p4,p5,p6,p7,p8 ); } static void Create_SuperNode_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, double *p5, int_t *p6, int_t *p7, int_t *p8, int_t *p9, int_t *p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { dCreate_SuperNode_Matrix_dist(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13); } }; template class SolveSuperLUmpi : public MatriceMorse::VirtualSolver, public SuperLUmpiDISTDriver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 //mutable char equed[1]; //yes_no_t equil; mutable SuperMatrix A; NCformat *Astore; //NCformat *Ustore; //SCformat *Lstore; mutable superlu_options_t options; mutable mem_usage_t mem_usage; mutable ScalePermstruct_t ScalePermstruct; mutable LUstruct_t LUstruct; mutable SOLVEstruct_t SOLVEstruct; mutable gridinfo_t grid; string string_option; string data_option; R *a; int *asub, *xa; int_t m, n, nnz; // rajout pour // int_t nprow,npcol; /* process rows and process columns*/ int matrixdist; // type of distributed matrix MPI_Comm commworld ; static const int assembled =0; static const int distributedglobal =1; static const int distributed =2; int iam; public: SolveSuperLUmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string datafile, string param_char, KN &pperm_r, KN &pperm_c,void * ccommworld=0) : eps(epsilon),epsr(0), tgv(ttgv),string_option(param_char),data_option(datafile), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { commworld = ccommworld ? *static_cast( ccommworld) : MPI_COMM_WORLD; R* B; //R* X; SuperLUStat_t stat; int info, ldb, nrhs=0; int i; double* berr; //int iam; // Add for distributed matrix int_t m_loc, m_loc_fst, fst_row, nnz_loc, fst_nnz; R *aloc; int *asubloc, *xaloc; // End Add for distributed matrix A.Store=0; int status; // time variables long int starttime,finishtime; long int timeused; // rajout debug int myid; if(verbosity) starttime = clock(); /* Defaults */ nrhs = 0; /* lecture de nprow and npcol */ // Cas max deux procs nprow = 1; npcol = 1; matrixdist=0; if(!data_option.empty()) read_nprow_npcol_matrixdist_superlu_datafile(&data_option, &nprow, &npcol, &matrixdist); if(!string_option.empty()) read_nprow_npcol_freefem( &string_option, &nprow, &npcol, &matrixdist); /* ------------------------------------------------------------ INITIALIZE THE SUPERLU PROCESS GRID. ------------------------------------------------------------*/ cout << "Real superlu_gridinit" << " " << commworld << " " << ccommworld <= nprow * npcol ){ printf("this process is not used in superlu %d \n",iam); } else { /* set the default options */ set_default_options_dist(&options); DiagScale_t optionDiagScale; if(!string_option.empty()) read_options_freefem(&string_option,&options,&optionDiagScale); if(!data_option.empty()) read_options_superlu_datafile(&data_option,&options,&nprow, &npcol, &matrixdist,&optionDiagScale); // matrix to procs and vectors if( matrixdist == assembled ){ if(!iam){ cout << "iam=" << iam << endl; printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; assert( AA.lg[n] == nnz ); printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* transform Row to Col */ // cela coute cher comme fonction // //dallocateA_dist(n, nnz, &a, &asub, &xa); //dCompRow_to_CompCol_dist(m,n,nnz,arow,asubrow,xarow,&a,&asub,&xa); dCompRow_to_CompCol_dist(m,n,nnz,AA.a,AA.cl,AA.lg,&a,&asub,&xa); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); int infobcast=MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } else{ /* printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ dallocateA_dist(n, nnz, &a, &asub, &xa); int infobcast=MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); cout << "Debut: Create_CompCol_Matrix_dist" <::pgssvx_ABglobal(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } //########################################################## // // matrix distributed with matrix global given // //########################################################## else if( matrixdist == distributedglobal) { if(!iam){ printf("\tProcess grid\t%d X %d iam=%d \n", grid.nprow, grid.npcol,iam); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; a=AA.a; asub=AA.cl; xa=AA.lg; xa[n] = nnz; printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( AA.cl, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.lg, n+1, mpi_int_t, 0, grid.comm ); } else{ printf("\tProcess grid\t%d X %d iam=%d \n", grid.nprow, grid.npcol,iam); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ dallocateA_dist(n, nnz, &a, &asub, &xa); MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } /* Compute the number of rows to be distributed to local process */ m_loc = m / (grid.nprow * grid.npcol); m_loc_fst = m_loc; /* When m / procs is not an integer */ if ((m_loc * grid.nprow * grid.npcol) != m) { /*m_loc = m_loc+1; m_loc_fst = m_loc;*/ if (iam == (grid.nprow * grid.npcol - 1)) /* last proc. gets all*/ m_loc = m - m_loc * (grid.nprow * grid.npcol - 1); } fst_row = iam * m_loc_fst; nnz_loc = xa[fst_row+m_loc]-xa[fst_row]; xaloc = (int_t*) intMalloc_dist(m_loc+1); for(int ii=0; ii < m_loc; ii++){ xaloc[ii] = xa[fst_row+ii]-xa[fst_row]; } xaloc[m_loc]=nnz_loc; fst_nnz = xa[fst_row]; aloc = (double*) doubleMalloc_dist(nnz_loc); asubloc = (int_t*) intMalloc_dist(nnz_loc); for(int ii=0; ii < nnz_loc; ii++){ aloc[ii] = a[fst_nnz+ii]; asubloc[ii] = asub[fst_nnz+ii]; } if( iam ){ SUPERLU_FREE( a ); SUPERLU_FREE( asub ); SUPERLU_FREE( xa ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); cout << "Debut: Create_CompRowCol_Matrix_dist" <::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } else if( matrixdist == distributed) { printf("in construction\n"); exit(1); } else{ printf("matrix choice for SuperLU_DIST is assembled, distributedglobal and distributed \n"); exit(1); } SUPERLU_FREE( B ); options.Fact = FACTORED; /* Indicate the factored form of A is supplied. */ nrhs=1; SUPERLU_FREE(berr); if(iam==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "SuperLU_DIST : time factorisation :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { R* B; SuperLUStat_t stat; //int iam; int info=0, ldb=m, nrhs=1; int i; double* berr; double ferr; double rpg, rcond; int_t m_loc,m_loc_fst,fst_row; // time variable long int starttime,finishtime; long int timeused; if( iam < nprow*npcol){ if(verbosity) starttime = clock(); if(n != m) exit(1); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); nrhs= 1; //iam = grid.iam; //if( iam < nprow*npcol){ /* Initialize the statistics variables. */ PStatInit(&stat); /* cas matrix assembled */ if( matrixdist == assembled ){ if( !(B = doubleMalloc_dist(m*nrhs)) ){ printf("probleme d allocation\n"); exit(1); } for(int ii=0; ii::pgssvx_ABglobal (&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if(verbosity) PStatPrint(&options, &stat, &grid); for(int ii=0; ii::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if ( !(xtemp = doubleMalloc_dist(AA.n)) ){ printf("probleme d allocation de xtemp\n"); exit(1); } int disp[nprow*npcol]; MPI_Allgather(&fst_row, 1, MPI_INT, disp, 1, MPI_INT, grid.comm); int recv[nprow*npcol]; MPI_Allgather(&m_loc, 1, MPI_INT, recv, 1, MPI_INT, grid.comm); MPI_Allgatherv(B, m_loc, MPI_DOUBLE, xtemp, recv, disp, MPI_DOUBLE, grid.comm); for(int ii= 0; ii< AA.n ; ii++) x[ii] = xtemp[ii]; if(verbosity) cout << " x min max " << x.min() << " " < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverSuperLUmpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverSuperLUmpi" << endl; return new SolveSuperLUmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.sparams, ds.perm_r, ds.perm_c, ds.commworld); } class Init { public: Init(); }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; } bool SetSuperLUmpi() { if(verbosity) cout << " SetDefault sparse solver to SuperLUmpi double" << endl; DefSparseSolver::solver =BuildSolverSuperLUmpi; //DefSparseSolver::solver =BuildSolverSuperLUmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; } Init init; Init::Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Real SuperLUdist, defaultsolver defaultsolverSuperLUdist" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverSuperLUmpi; //DefSparseSolver::solver =BuildSolverSuperLUmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("realdefaulttoSuperLUdist","(",new OneOperator0(SetSuperLUmpi)); } freefem++-3.38-1/src/solver/wrapper_dotblas.c000644 000767 000024 00000001625 11406142256 021246 0ustar00hechtstaff000000 000000 typedef void doublecomplex; typedef void complex; typedef int integer; #include /* Double Complex */ void zdotc_(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { cblas_zdotc_sub(*n, zx, *incx, zy, *incx , ret_val); } /* Double Complex */ void zdotu_(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { cblas_zdotu_sub(*n, zx, *incx, zy, *incx , ret_val); return ; } /* zdotu___ */ /* Complex */ void cdotc_(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy) { cblas_cdotc_sub (*n, cx, *incx, cy, *incx , ret_val); } /* cdotc___ */ /* Complex */ void cdotu_(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy) { cblas_cdotu_sub(*n, cx, *incx, cy, *incx , ret_val); } /* cdotu___ */ freefem++-3.38-1/src/solver/wrapper_dotblas.f000644 000767 000024 00000002423 11406142256 021246 0ustar00hechtstaff000000 000000 c a compile sans underscore -fno-underscoring c gfortran -fno-underscoring -O3 -c wrapper_dotblas.f c ------- double complex function zdotc_(n, zx, incx, zy, incy) double complex zx(*), zy(*), z integer n, incx, incy call cblas_zdotc_sub(%val(n), zx, %val(incx), zy, %val(incy), z) c print*,'cblas_zdotc_sub' zdotc_ = z return end double complex function zdotu_(n, zx, incx, zy, incy) double complex zx(*), zy(*), z integer n, incx, incy call cblas_zdotu_sub(%val(n), zx, %val(incx), zy, %val(incy), z) c print*,'cblas_zdotu_sub' zdotu_ = z return end complex function cdotc_(n, cx, incx, cy, incy) complex cx(*), cy(*), c integer n, incx, incy call cblas_cdotc_sub(%val(n), cx, %val(incx), cy, %val(incy), c) c print*,'cblas_cdotc_sub' cdotc_ = c return end complex function cdotu_(n, cx, incx, cy, incy) complex cx(*), cy(*), c integer n, incx, incy call cblas_cdotu_sub(%val(n), cx, %val(incx), cy, %val(incy), c) c print*,'cblas_cdotu_sub' cdotu_ = c return end freefem++-3.38-1/src/solver/wrapper_dotblas1.c000644 000767 000024 00000006470 11406142256 021332 0ustar00hechtstaff000000 000000 /* wrapper_dotblas1.f -- translated by f2c (version 20061008). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ #include "f2c.h" /* a compile sans underscore -fno-underscoring */ /* gfortran -fno-underscoring -O3 -c wrapper_dotblas.f */ /* ------- */ /* Double Complex */ VOID zdotc___(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static doublecomplex z__; extern /* Subroutine */ int cblas_zdotc_sub__(integer *, doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *); /* Parameter adjustments */ --zy; --zx; /* Function Body */ i__1 = *n; i__2 = *incx; i__3 = *incy; cblas_zdotc_sub__(&i__1, &zx[1], &i__2, &zy[1], &i__3, &z__); /* print*,'cblas_zdotc_sub' */ ret_val->r = z__.r, ret_val->i = z__.i; return ; } /* zdotc___ */ /* Double Complex */ VOID zdotu___(doublecomplex * ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static doublecomplex z__; extern /* Subroutine */ int cblas_zdotu_sub__(integer *, doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *); /* Parameter adjustments */ --zy; --zx; /* Function Body */ i__1 = *n; i__2 = *incx; i__3 = *incy; cblas_zdotu_sub__(&i__1, &zx[1], &i__2, &zy[1], &i__3, &z__); /* print*,'cblas_zdotu_sub' */ ret_val->r = z__.r, ret_val->i = z__.i; return ; } /* zdotu___ */ /* Complex */ VOID cdotc___(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static complex c__; extern /* Subroutine */ int cblas_cdotc_sub__(integer *, complex *, integer *, complex *, integer *, complex *); /* Parameter adjustments */ --cy; --cx; /* Function Body */ i__1 = *n; i__2 = *incx; i__3 = *incy; cblas_cdotc_sub__(&i__1, &cx[1], &i__2, &cy[1], &i__3, &c__); /* print*,'cblas_cdotc_sub' */ ret_val->r = c__.r, ret_val->i = c__.i; return ; } /* cdotc___ */ /* Complex */ VOID cdotu___(complex * ret_val, integer *n, complex *cx, integer *incx, complex *cy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static complex c__; extern /* Subroutine */ int cblas_cdotu_sub__(integer *, complex *, integer *, complex *, integer *, complex *); /* Parameter adjustments */ --cy; --cx; /* Function Body */ i__1 = *n; i__2 = *incx; i__3 = *incy; cblas_cdotu_sub__(&i__1, &cx[1], &i__2, &cy[1], &i__3, &c__); /* print*,'cblas_cdotu_sub' */ ret_val->r = c__.r, ret_val->i = c__.i; return ; } /* cdotu___ */ freefem++-3.38-1/src/solver/wrapper_dotblas1.f000644 000767 000024 00000002343 11406142256 021330 0ustar00hechtstaff000000 000000 c a compile sans underscore -fno-underscoring c gfortran -fno-underscoring -O3 -c wrapper_dotblas.f c ------- double complex function zdotc_(n, zx, incx, zy, incy) double complex zx(*), zy(*), z integer n, incx, incy call cblas_zdotc_sub((n), zx, (incx), zy, (incy), z) c print*,'cblas_zdotc_sub' zdotc_ = z return end double complex function zdotu_(n, zx, incx, zy, incy) double complex zx(*), zy(*), z integer n, incx, incy call cblas_zdotu_sub((n), zx, (incx), zy, (incy), z) c print*,'cblas_zdotu_sub' zdotu_ = z return end complex function cdotc_(n, cx, incx, cy, incy) complex cx(*), cy(*), c integer n, incx, incy call cblas_cdotc_sub((n), cx, (incx), cy, (incy), c) c print*,'cblas_cdotc_sub' cdotc_ = c return end complex function cdotu_(n, cx, incx, cy, incy) complex cx(*), cy(*), c integer n, incx, incy call cblas_cdotu_sub((n), cx, (incx), cy, (incy), c) c print*,'cblas_cdotu_sub' cdotu_ = c return end freefem++-3.38-1/src/nw/Makefile.am000644 000767 000024 00000002242 12167254041 017055 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # To create statically linked executables (see configure.ac) CXXLD=$(STATICTOOL) $(CXX) bin_PROGRAMS=FreeFem++ FreeFem++-nw @FFGLUTPROG@ EXTRA_PROGRAMS=ffglut # FFCS:visualization stream redirection ffglut_SOURCES=../Graphics/ffglut.cpp ../Graphics/gggg.cpp ../Graphics/ffthreads.cpp \ ../Graphics/ffthreads.hpp \ ../femlib/fem.cpp ../femlib/Mesh3dn.cpp ../femlib/Mesh2dn.cpp ../femlib/Mesh1dn.cpp ../femlib/GQuadTree.cpp ../femlib/FQuadTree.cpp \ ../femlib/Drawing.cpp ../femlib/mshptg.cpp ../fflib/ffapi.cpp ffglut_DEPENDENCIES= ../libMesh/libMesh.a ffglut_LDADD= ../libMesh/libMesh.a @LIBSGLUT@ @LIBSPTHREAD@ FreeFem___nw_SOURCES=../Graphics/sansrgraph.cpp ../mpi/parallelempi-empty.cpp ../fflib/ffapi.cpp FreeFem___SOURCES=../Graphics/sansrgraph.cpp ../mpi/parallelempi-empty.cpp ../fflib/ffapi.cpp FreeFem___nw_DEPENDENCIES=../fflib/libff.a ../lglib/liblg.a FreeFem___DEPENDENCIES=../fflib/libff.a ../lglib/liblg.a LDADD=../lglib/liblg.a ../fflib/libff.a @UMFPACKLIBS@ @ARPACKLIBS@ @BLASLIBS@ AM_CPPFLAGS=-I$(srcdir)/../fflib -I$(srcdir)/../Graphics -I$(srcdir)/../.. -I$(srcdir)/../femlib freefem++-3.38-1/src/nw/Makefile.in000644 000767 000024 00000146601 12543260340 017073 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = FreeFem++$(EXEEXT) FreeFem++-nw$(EXEEXT) @FFGLUTPROG@ EXTRA_PROGRAMS = ffglut$(EXEEXT) subdir = src/nw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_FreeFem___OBJECTS = sansrgraph.$(OBJEXT) \ parallelempi-empty.$(OBJEXT) ffapi.$(OBJEXT) FreeFem___OBJECTS = $(am_FreeFem___OBJECTS) FreeFem___LDADD = $(LDADD) am_FreeFem___nw_OBJECTS = sansrgraph.$(OBJEXT) \ parallelempi-empty.$(OBJEXT) ffapi.$(OBJEXT) FreeFem___nw_OBJECTS = $(am_FreeFem___nw_OBJECTS) FreeFem___nw_LDADD = $(LDADD) am_ffglut_OBJECTS = ffglut.$(OBJEXT) gggg.$(OBJEXT) \ ffthreads.$(OBJEXT) fem.$(OBJEXT) Mesh3dn.$(OBJEXT) \ Mesh2dn.$(OBJEXT) Mesh1dn.$(OBJEXT) GQuadTree.$(OBJEXT) \ FQuadTree.$(OBJEXT) Drawing.$(OBJEXT) mshptg.$(OBJEXT) \ ffapi.$(OBJEXT) ffglut_OBJECTS = $(am_ffglut_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(FreeFem___SOURCES) $(FreeFem___nw_SOURCES) \ $(ffglut_SOURCES) DIST_SOURCES = $(FreeFem___SOURCES) $(FreeFem___nw_SOURCES) \ $(ffglut_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # To create statically linked executables (see configure.ac) CXXLD = $(STATICTOOL) $(CXX) # FFCS:visualization stream redirection ffglut_SOURCES = ../Graphics/ffglut.cpp ../Graphics/gggg.cpp ../Graphics/ffthreads.cpp \ ../Graphics/ffthreads.hpp \ ../femlib/fem.cpp ../femlib/Mesh3dn.cpp ../femlib/Mesh2dn.cpp ../femlib/Mesh1dn.cpp ../femlib/GQuadTree.cpp ../femlib/FQuadTree.cpp \ ../femlib/Drawing.cpp ../femlib/mshptg.cpp ../fflib/ffapi.cpp ffglut_DEPENDENCIES = ../libMesh/libMesh.a ffglut_LDADD = ../libMesh/libMesh.a @LIBSGLUT@ @LIBSPTHREAD@ FreeFem___nw_SOURCES = ../Graphics/sansrgraph.cpp ../mpi/parallelempi-empty.cpp ../fflib/ffapi.cpp FreeFem___SOURCES = ../Graphics/sansrgraph.cpp ../mpi/parallelempi-empty.cpp ../fflib/ffapi.cpp FreeFem___nw_DEPENDENCIES = ../fflib/libff.a ../lglib/liblg.a FreeFem___DEPENDENCIES = ../fflib/libff.a ../lglib/liblg.a LDADD = ../lglib/liblg.a ../fflib/libff.a @UMFPACKLIBS@ @ARPACKLIBS@ @BLASLIBS@ AM_CPPFLAGS = -I$(srcdir)/../fflib -I$(srcdir)/../Graphics -I$(srcdir)/../.. -I$(srcdir)/../femlib all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/nw/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/nw/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) FreeFem++$(EXEEXT): $(FreeFem___OBJECTS) $(FreeFem___DEPENDENCIES) $(EXTRA_FreeFem___DEPENDENCIES) @rm -f FreeFem++$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FreeFem___OBJECTS) $(FreeFem___LDADD) $(LIBS) FreeFem++-nw$(EXEEXT): $(FreeFem___nw_OBJECTS) $(FreeFem___nw_DEPENDENCIES) $(EXTRA_FreeFem___nw_DEPENDENCIES) @rm -f FreeFem++-nw$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FreeFem___nw_OBJECTS) $(FreeFem___nw_LDADD) $(LIBS) ffglut$(EXEEXT): $(ffglut_OBJECTS) $(ffglut_DEPENDENCIES) $(EXTRA_ffglut_DEPENDENCIES) @rm -f ffglut$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ffglut_OBJECTS) $(ffglut_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Drawing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FQuadTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GQuadTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh1dn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh2dn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh3dn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffglut.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffthreads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gggg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mshptg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallelempi-empty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sansrgraph.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` sansrgraph.o: ../Graphics/sansrgraph.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sansrgraph.o -MD -MP -MF $(DEPDIR)/sansrgraph.Tpo -c -o sansrgraph.o `test -f '../Graphics/sansrgraph.cpp' || echo '$(srcdir)/'`../Graphics/sansrgraph.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sansrgraph.Tpo $(DEPDIR)/sansrgraph.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/sansrgraph.cpp' object='sansrgraph.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sansrgraph.o `test -f '../Graphics/sansrgraph.cpp' || echo '$(srcdir)/'`../Graphics/sansrgraph.cpp sansrgraph.obj: ../Graphics/sansrgraph.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sansrgraph.obj -MD -MP -MF $(DEPDIR)/sansrgraph.Tpo -c -o sansrgraph.obj `if test -f '../Graphics/sansrgraph.cpp'; then $(CYGPATH_W) '../Graphics/sansrgraph.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/sansrgraph.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sansrgraph.Tpo $(DEPDIR)/sansrgraph.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/sansrgraph.cpp' object='sansrgraph.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sansrgraph.obj `if test -f '../Graphics/sansrgraph.cpp'; then $(CYGPATH_W) '../Graphics/sansrgraph.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/sansrgraph.cpp'; fi` parallelempi-empty.o: ../mpi/parallelempi-empty.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parallelempi-empty.o -MD -MP -MF $(DEPDIR)/parallelempi-empty.Tpo -c -o parallelempi-empty.o `test -f '../mpi/parallelempi-empty.cpp' || echo '$(srcdir)/'`../mpi/parallelempi-empty.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallelempi-empty.Tpo $(DEPDIR)/parallelempi-empty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../mpi/parallelempi-empty.cpp' object='parallelempi-empty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parallelempi-empty.o `test -f '../mpi/parallelempi-empty.cpp' || echo '$(srcdir)/'`../mpi/parallelempi-empty.cpp parallelempi-empty.obj: ../mpi/parallelempi-empty.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT parallelempi-empty.obj -MD -MP -MF $(DEPDIR)/parallelempi-empty.Tpo -c -o parallelempi-empty.obj `if test -f '../mpi/parallelempi-empty.cpp'; then $(CYGPATH_W) '../mpi/parallelempi-empty.cpp'; else $(CYGPATH_W) '$(srcdir)/../mpi/parallelempi-empty.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallelempi-empty.Tpo $(DEPDIR)/parallelempi-empty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../mpi/parallelempi-empty.cpp' object='parallelempi-empty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o parallelempi-empty.obj `if test -f '../mpi/parallelempi-empty.cpp'; then $(CYGPATH_W) '../mpi/parallelempi-empty.cpp'; else $(CYGPATH_W) '$(srcdir)/../mpi/parallelempi-empty.cpp'; fi` ffapi.o: ../fflib/ffapi.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffapi.o -MD -MP -MF $(DEPDIR)/ffapi.Tpo -c -o ffapi.o `test -f '../fflib/ffapi.cpp' || echo '$(srcdir)/'`../fflib/ffapi.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffapi.Tpo $(DEPDIR)/ffapi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../fflib/ffapi.cpp' object='ffapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffapi.o `test -f '../fflib/ffapi.cpp' || echo '$(srcdir)/'`../fflib/ffapi.cpp ffapi.obj: ../fflib/ffapi.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffapi.obj -MD -MP -MF $(DEPDIR)/ffapi.Tpo -c -o ffapi.obj `if test -f '../fflib/ffapi.cpp'; then $(CYGPATH_W) '../fflib/ffapi.cpp'; else $(CYGPATH_W) '$(srcdir)/../fflib/ffapi.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffapi.Tpo $(DEPDIR)/ffapi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../fflib/ffapi.cpp' object='ffapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffapi.obj `if test -f '../fflib/ffapi.cpp'; then $(CYGPATH_W) '../fflib/ffapi.cpp'; else $(CYGPATH_W) '$(srcdir)/../fflib/ffapi.cpp'; fi` ffglut.o: ../Graphics/ffglut.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffglut.o -MD -MP -MF $(DEPDIR)/ffglut.Tpo -c -o ffglut.o `test -f '../Graphics/ffglut.cpp' || echo '$(srcdir)/'`../Graphics/ffglut.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffglut.Tpo $(DEPDIR)/ffglut.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/ffglut.cpp' object='ffglut.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffglut.o `test -f '../Graphics/ffglut.cpp' || echo '$(srcdir)/'`../Graphics/ffglut.cpp ffglut.obj: ../Graphics/ffglut.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffglut.obj -MD -MP -MF $(DEPDIR)/ffglut.Tpo -c -o ffglut.obj `if test -f '../Graphics/ffglut.cpp'; then $(CYGPATH_W) '../Graphics/ffglut.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/ffglut.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffglut.Tpo $(DEPDIR)/ffglut.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/ffglut.cpp' object='ffglut.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffglut.obj `if test -f '../Graphics/ffglut.cpp'; then $(CYGPATH_W) '../Graphics/ffglut.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/ffglut.cpp'; fi` gggg.o: ../Graphics/gggg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gggg.o -MD -MP -MF $(DEPDIR)/gggg.Tpo -c -o gggg.o `test -f '../Graphics/gggg.cpp' || echo '$(srcdir)/'`../Graphics/gggg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gggg.Tpo $(DEPDIR)/gggg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/gggg.cpp' object='gggg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gggg.o `test -f '../Graphics/gggg.cpp' || echo '$(srcdir)/'`../Graphics/gggg.cpp gggg.obj: ../Graphics/gggg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gggg.obj -MD -MP -MF $(DEPDIR)/gggg.Tpo -c -o gggg.obj `if test -f '../Graphics/gggg.cpp'; then $(CYGPATH_W) '../Graphics/gggg.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/gggg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gggg.Tpo $(DEPDIR)/gggg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/gggg.cpp' object='gggg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gggg.obj `if test -f '../Graphics/gggg.cpp'; then $(CYGPATH_W) '../Graphics/gggg.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/gggg.cpp'; fi` ffthreads.o: ../Graphics/ffthreads.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffthreads.o -MD -MP -MF $(DEPDIR)/ffthreads.Tpo -c -o ffthreads.o `test -f '../Graphics/ffthreads.cpp' || echo '$(srcdir)/'`../Graphics/ffthreads.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffthreads.Tpo $(DEPDIR)/ffthreads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/ffthreads.cpp' object='ffthreads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffthreads.o `test -f '../Graphics/ffthreads.cpp' || echo '$(srcdir)/'`../Graphics/ffthreads.cpp ffthreads.obj: ../Graphics/ffthreads.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffthreads.obj -MD -MP -MF $(DEPDIR)/ffthreads.Tpo -c -o ffthreads.obj `if test -f '../Graphics/ffthreads.cpp'; then $(CYGPATH_W) '../Graphics/ffthreads.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/ffthreads.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffthreads.Tpo $(DEPDIR)/ffthreads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/ffthreads.cpp' object='ffthreads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffthreads.obj `if test -f '../Graphics/ffthreads.cpp'; then $(CYGPATH_W) '../Graphics/ffthreads.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/ffthreads.cpp'; fi` fem.o: ../femlib/fem.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fem.o -MD -MP -MF $(DEPDIR)/fem.Tpo -c -o fem.o `test -f '../femlib/fem.cpp' || echo '$(srcdir)/'`../femlib/fem.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fem.Tpo $(DEPDIR)/fem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/fem.cpp' object='fem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fem.o `test -f '../femlib/fem.cpp' || echo '$(srcdir)/'`../femlib/fem.cpp fem.obj: ../femlib/fem.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fem.obj -MD -MP -MF $(DEPDIR)/fem.Tpo -c -o fem.obj `if test -f '../femlib/fem.cpp'; then $(CYGPATH_W) '../femlib/fem.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/fem.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fem.Tpo $(DEPDIR)/fem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/fem.cpp' object='fem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fem.obj `if test -f '../femlib/fem.cpp'; then $(CYGPATH_W) '../femlib/fem.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/fem.cpp'; fi` Mesh3dn.o: ../femlib/Mesh3dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh3dn.o -MD -MP -MF $(DEPDIR)/Mesh3dn.Tpo -c -o Mesh3dn.o `test -f '../femlib/Mesh3dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh3dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh3dn.Tpo $(DEPDIR)/Mesh3dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh3dn.cpp' object='Mesh3dn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh3dn.o `test -f '../femlib/Mesh3dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh3dn.cpp Mesh3dn.obj: ../femlib/Mesh3dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh3dn.obj -MD -MP -MF $(DEPDIR)/Mesh3dn.Tpo -c -o Mesh3dn.obj `if test -f '../femlib/Mesh3dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh3dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh3dn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh3dn.Tpo $(DEPDIR)/Mesh3dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh3dn.cpp' object='Mesh3dn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh3dn.obj `if test -f '../femlib/Mesh3dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh3dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh3dn.cpp'; fi` Mesh2dn.o: ../femlib/Mesh2dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh2dn.o -MD -MP -MF $(DEPDIR)/Mesh2dn.Tpo -c -o Mesh2dn.o `test -f '../femlib/Mesh2dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh2dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh2dn.Tpo $(DEPDIR)/Mesh2dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh2dn.cpp' object='Mesh2dn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh2dn.o `test -f '../femlib/Mesh2dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh2dn.cpp Mesh2dn.obj: ../femlib/Mesh2dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh2dn.obj -MD -MP -MF $(DEPDIR)/Mesh2dn.Tpo -c -o Mesh2dn.obj `if test -f '../femlib/Mesh2dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh2dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh2dn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh2dn.Tpo $(DEPDIR)/Mesh2dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh2dn.cpp' object='Mesh2dn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh2dn.obj `if test -f '../femlib/Mesh2dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh2dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh2dn.cpp'; fi` Mesh1dn.o: ../femlib/Mesh1dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh1dn.o -MD -MP -MF $(DEPDIR)/Mesh1dn.Tpo -c -o Mesh1dn.o `test -f '../femlib/Mesh1dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh1dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh1dn.Tpo $(DEPDIR)/Mesh1dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh1dn.cpp' object='Mesh1dn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh1dn.o `test -f '../femlib/Mesh1dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh1dn.cpp Mesh1dn.obj: ../femlib/Mesh1dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh1dn.obj -MD -MP -MF $(DEPDIR)/Mesh1dn.Tpo -c -o Mesh1dn.obj `if test -f '../femlib/Mesh1dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh1dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh1dn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh1dn.Tpo $(DEPDIR)/Mesh1dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh1dn.cpp' object='Mesh1dn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh1dn.obj `if test -f '../femlib/Mesh1dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh1dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh1dn.cpp'; fi` GQuadTree.o: ../femlib/GQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GQuadTree.o -MD -MP -MF $(DEPDIR)/GQuadTree.Tpo -c -o GQuadTree.o `test -f '../femlib/GQuadTree.cpp' || echo '$(srcdir)/'`../femlib/GQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GQuadTree.Tpo $(DEPDIR)/GQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/GQuadTree.cpp' object='GQuadTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GQuadTree.o `test -f '../femlib/GQuadTree.cpp' || echo '$(srcdir)/'`../femlib/GQuadTree.cpp GQuadTree.obj: ../femlib/GQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GQuadTree.obj -MD -MP -MF $(DEPDIR)/GQuadTree.Tpo -c -o GQuadTree.obj `if test -f '../femlib/GQuadTree.cpp'; then $(CYGPATH_W) '../femlib/GQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/GQuadTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GQuadTree.Tpo $(DEPDIR)/GQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/GQuadTree.cpp' object='GQuadTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GQuadTree.obj `if test -f '../femlib/GQuadTree.cpp'; then $(CYGPATH_W) '../femlib/GQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/GQuadTree.cpp'; fi` FQuadTree.o: ../femlib/FQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FQuadTree.o -MD -MP -MF $(DEPDIR)/FQuadTree.Tpo -c -o FQuadTree.o `test -f '../femlib/FQuadTree.cpp' || echo '$(srcdir)/'`../femlib/FQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FQuadTree.Tpo $(DEPDIR)/FQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FQuadTree.cpp' object='FQuadTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FQuadTree.o `test -f '../femlib/FQuadTree.cpp' || echo '$(srcdir)/'`../femlib/FQuadTree.cpp FQuadTree.obj: ../femlib/FQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FQuadTree.obj -MD -MP -MF $(DEPDIR)/FQuadTree.Tpo -c -o FQuadTree.obj `if test -f '../femlib/FQuadTree.cpp'; then $(CYGPATH_W) '../femlib/FQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FQuadTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FQuadTree.Tpo $(DEPDIR)/FQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FQuadTree.cpp' object='FQuadTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FQuadTree.obj `if test -f '../femlib/FQuadTree.cpp'; then $(CYGPATH_W) '../femlib/FQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FQuadTree.cpp'; fi` Drawing.o: ../femlib/Drawing.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Drawing.o -MD -MP -MF $(DEPDIR)/Drawing.Tpo -c -o Drawing.o `test -f '../femlib/Drawing.cpp' || echo '$(srcdir)/'`../femlib/Drawing.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Drawing.Tpo $(DEPDIR)/Drawing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Drawing.cpp' object='Drawing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Drawing.o `test -f '../femlib/Drawing.cpp' || echo '$(srcdir)/'`../femlib/Drawing.cpp Drawing.obj: ../femlib/Drawing.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Drawing.obj -MD -MP -MF $(DEPDIR)/Drawing.Tpo -c -o Drawing.obj `if test -f '../femlib/Drawing.cpp'; then $(CYGPATH_W) '../femlib/Drawing.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Drawing.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Drawing.Tpo $(DEPDIR)/Drawing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Drawing.cpp' object='Drawing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Drawing.obj `if test -f '../femlib/Drawing.cpp'; then $(CYGPATH_W) '../femlib/Drawing.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Drawing.cpp'; fi` mshptg.o: ../femlib/mshptg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mshptg.o -MD -MP -MF $(DEPDIR)/mshptg.Tpo -c -o mshptg.o `test -f '../femlib/mshptg.cpp' || echo '$(srcdir)/'`../femlib/mshptg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mshptg.Tpo $(DEPDIR)/mshptg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/mshptg.cpp' object='mshptg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mshptg.o `test -f '../femlib/mshptg.cpp' || echo '$(srcdir)/'`../femlib/mshptg.cpp mshptg.obj: ../femlib/mshptg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mshptg.obj -MD -MP -MF $(DEPDIR)/mshptg.Tpo -c -o mshptg.obj `if test -f '../femlib/mshptg.cpp'; then $(CYGPATH_W) '../femlib/mshptg.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/mshptg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mshptg.Tpo $(DEPDIR)/mshptg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/mshptg.cpp' object='mshptg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mshptg.obj `if test -f '../femlib/mshptg.cpp'; then $(CYGPATH_W) '../femlib/mshptg.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/mshptg.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/mpi/ff-mpirun.in000755 000767 000024 00000001730 12476057000 017420 0ustar00hechtstaff000000 000000 #!/bin/bash # ./config.status --file=ff-mpirun:ff-mpirun.in mpirun=mpirun dir=`dirname $0` prefix="@prefix@" exec_prefix="@exec_prefix@" bindir="@bindir@" nw=1 if [ -n "@MPIRUN@" ] ;then mpirun="@MPIRUN@" ; fi ffmpi=FreeFem++-mpi if [ -x "$0" -a -x "$dir/$ffmpi" ]; then if [ -n "@WIN32DLLTARGET@" -a -x "$dir/../bin-win32/$ffmpi.exe" ] ; then ffmpi="$dir/../bin-win32/$ffmpi.exe"; else ffmpi="$dir/$ffmpi"; fi fi if [ -d "$bindir" ] ;then export PATH="@bindir@:$PATH" ; fi a[0]="'$mpirun'" j=1; #echo $1 --- while test -n "$1" ; do ((j=$j+1)) #((j1=$j+1)) #echo --- $1 -- $j1 $j case "$1" in "-nw") nw=1;; "-win") nw=0;; *.edp) a[$j]="${ffmpi}"; if [ "$nw" -eq 1 ]; then ((j=$j+1));a[$j]="-nw"; fi ((j=$j+1));a[$j]="$1";; #if[ ! -f "$1" ]; then echo error file no found "$1"; dry=2; fi;; -dry) dry=1;; *) a[$j]="$1";; esac shift done echo "${a[*]}" if [ -n "$dry" ]; then echo which $ffmpi : `which "$ffmpi"`; fi if [ -z "$dry" ]; then eval "${a[*]}"; fi freefem++-3.38-1/src/mpi/Makefile.am000644 000767 000024 00000002025 12325553271 017220 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # change FH mars 2010 for sgi mpiu .... # FFCS - we need to call MPICXX directly because Windows options are too different to be detailed to the FF configuration script. CXX=@MPICXX@ # To create statically linked executables (see configure.ac) CXXLD=$(STATICTOOL) $(CXX) # MPI may not be installed. Checked in configure.ac bin_PROGRAMS=$(MPIPROG) bin_SCRIPTS=$(MPISCRIPT) EXTRA_PROGRAMS=FreeFem++-mpi EXTRA_SCRIPTS=ff-mpirun EXTRA_DIST=ff-mpirun.in # FFCS: visualization stream redirection FreeFem___mpi_SOURCES=../Graphics/sansrgraph.cpp ../lglib/mymain.cpp parallelempi.cpp ../lglib/lg.tab.cpp \ ../fflib/ffapi.cpp FreeFem___mpi_DEPENDENCIES=../fflib/libff.a LDADD=../fflib/libff.a @UMFPACKLIBS@ @ARPACKLIBS@ @BLASLIBS@ @MPI_LIB@ AM_CXXFLAGS=-DPARALLELE AM_CPPFLAGS=-I$(srcdir)/../fflib -I$(srcdir)/../Graphics -I$(srcdir)/../femlib @MPI_INCLUDE@ ff-mpirun:ff-mpirun.in Makefile ../../config.status --file=ff-mpirun:ff-mpirun.in chmod a+x ff-mpirun freefem++-3.38-1/src/mpi/Makefile.in000644 000767 000024 00000103456 12543260340 017235 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # change FH mars 2010 for sgi mpiu .... # FFCS - we need to call MPICXX directly because Windows options are too different to be detailed to the FF configuration script. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ EXTRA_PROGRAMS = FreeFem++-mpi$(EXEEXT) subdir = src/mpi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_FreeFem___mpi_OBJECTS = sansrgraph.$(OBJEXT) mymain.$(OBJEXT) \ parallelempi.$(OBJEXT) lg.tab.$(OBJEXT) ffapi.$(OBJEXT) FreeFem___mpi_OBJECTS = $(am_FreeFem___mpi_OBJECTS) FreeFem___mpi_LDADD = $(LDADD) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(FreeFem___mpi_SOURCES) DIST_SOURCES = $(FreeFem___mpi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @MPICXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # To create statically linked executables (see configure.ac) CXXLD = $(STATICTOOL) $(CXX) # MPI may not be installed. Checked in configure.ac bin_PROGRAMS = $(MPIPROG) bin_SCRIPTS = $(MPISCRIPT) EXTRA_SCRIPTS = ff-mpirun EXTRA_DIST = ff-mpirun.in # FFCS: visualization stream redirection FreeFem___mpi_SOURCES = ../Graphics/sansrgraph.cpp ../lglib/mymain.cpp parallelempi.cpp ../lglib/lg.tab.cpp \ ../fflib/ffapi.cpp FreeFem___mpi_DEPENDENCIES = ../fflib/libff.a LDADD = ../fflib/libff.a @UMFPACKLIBS@ @ARPACKLIBS@ @BLASLIBS@ @MPI_LIB@ AM_CXXFLAGS = -DPARALLELE AM_CPPFLAGS = -I$(srcdir)/../fflib -I$(srcdir)/../Graphics -I$(srcdir)/../femlib @MPI_INCLUDE@ all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/mpi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/mpi/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) FreeFem++-mpi$(EXEEXT): $(FreeFem___mpi_OBJECTS) $(FreeFem___mpi_DEPENDENCIES) $(EXTRA_FreeFem___mpi_DEPENDENCIES) @rm -f FreeFem++-mpi$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FreeFem___mpi_OBJECTS) $(FreeFem___mpi_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lg.tab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mymain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallelempi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sansrgraph.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` sansrgraph.o: ../Graphics/sansrgraph.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sansrgraph.o -MD -MP -MF $(DEPDIR)/sansrgraph.Tpo -c -o sansrgraph.o `test -f '../Graphics/sansrgraph.cpp' || echo '$(srcdir)/'`../Graphics/sansrgraph.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sansrgraph.Tpo $(DEPDIR)/sansrgraph.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/sansrgraph.cpp' object='sansrgraph.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sansrgraph.o `test -f '../Graphics/sansrgraph.cpp' || echo '$(srcdir)/'`../Graphics/sansrgraph.cpp sansrgraph.obj: ../Graphics/sansrgraph.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sansrgraph.obj -MD -MP -MF $(DEPDIR)/sansrgraph.Tpo -c -o sansrgraph.obj `if test -f '../Graphics/sansrgraph.cpp'; then $(CYGPATH_W) '../Graphics/sansrgraph.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/sansrgraph.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sansrgraph.Tpo $(DEPDIR)/sansrgraph.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/sansrgraph.cpp' object='sansrgraph.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sansrgraph.obj `if test -f '../Graphics/sansrgraph.cpp'; then $(CYGPATH_W) '../Graphics/sansrgraph.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/sansrgraph.cpp'; fi` mymain.o: ../lglib/mymain.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mymain.o -MD -MP -MF $(DEPDIR)/mymain.Tpo -c -o mymain.o `test -f '../lglib/mymain.cpp' || echo '$(srcdir)/'`../lglib/mymain.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mymain.Tpo $(DEPDIR)/mymain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../lglib/mymain.cpp' object='mymain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mymain.o `test -f '../lglib/mymain.cpp' || echo '$(srcdir)/'`../lglib/mymain.cpp mymain.obj: ../lglib/mymain.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mymain.obj -MD -MP -MF $(DEPDIR)/mymain.Tpo -c -o mymain.obj `if test -f '../lglib/mymain.cpp'; then $(CYGPATH_W) '../lglib/mymain.cpp'; else $(CYGPATH_W) '$(srcdir)/../lglib/mymain.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mymain.Tpo $(DEPDIR)/mymain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../lglib/mymain.cpp' object='mymain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mymain.obj `if test -f '../lglib/mymain.cpp'; then $(CYGPATH_W) '../lglib/mymain.cpp'; else $(CYGPATH_W) '$(srcdir)/../lglib/mymain.cpp'; fi` lg.tab.o: ../lglib/lg.tab.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lg.tab.o -MD -MP -MF $(DEPDIR)/lg.tab.Tpo -c -o lg.tab.o `test -f '../lglib/lg.tab.cpp' || echo '$(srcdir)/'`../lglib/lg.tab.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lg.tab.Tpo $(DEPDIR)/lg.tab.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../lglib/lg.tab.cpp' object='lg.tab.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lg.tab.o `test -f '../lglib/lg.tab.cpp' || echo '$(srcdir)/'`../lglib/lg.tab.cpp lg.tab.obj: ../lglib/lg.tab.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lg.tab.obj -MD -MP -MF $(DEPDIR)/lg.tab.Tpo -c -o lg.tab.obj `if test -f '../lglib/lg.tab.cpp'; then $(CYGPATH_W) '../lglib/lg.tab.cpp'; else $(CYGPATH_W) '$(srcdir)/../lglib/lg.tab.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lg.tab.Tpo $(DEPDIR)/lg.tab.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../lglib/lg.tab.cpp' object='lg.tab.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lg.tab.obj `if test -f '../lglib/lg.tab.cpp'; then $(CYGPATH_W) '../lglib/lg.tab.cpp'; else $(CYGPATH_W) '$(srcdir)/../lglib/lg.tab.cpp'; fi` ffapi.o: ../fflib/ffapi.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffapi.o -MD -MP -MF $(DEPDIR)/ffapi.Tpo -c -o ffapi.o `test -f '../fflib/ffapi.cpp' || echo '$(srcdir)/'`../fflib/ffapi.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffapi.Tpo $(DEPDIR)/ffapi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../fflib/ffapi.cpp' object='ffapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffapi.o `test -f '../fflib/ffapi.cpp' || echo '$(srcdir)/'`../fflib/ffapi.cpp ffapi.obj: ../fflib/ffapi.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ffapi.obj -MD -MP -MF $(DEPDIR)/ffapi.Tpo -c -o ffapi.obj `if test -f '../fflib/ffapi.cpp'; then $(CYGPATH_W) '../fflib/ffapi.cpp'; else $(CYGPATH_W) '$(srcdir)/../fflib/ffapi.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ffapi.Tpo $(DEPDIR)/ffapi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../fflib/ffapi.cpp' object='ffapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ffapi.obj `if test -f '../fflib/ffapi.cpp'; then $(CYGPATH_W) '../fflib/ffapi.cpp'; else $(CYGPATH_W) '$(srcdir)/../fflib/ffapi.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-binSCRIPTS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS .PRECIOUS: Makefile ff-mpirun:ff-mpirun.in Makefile ../../config.status --file=ff-mpirun:ff-mpirun.in chmod a+x ff-mpirun # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/mpi/parallelempi-empty.cpp000644 000767 000024 00000000452 11500777105 021473 0ustar00hechtstaff000000 000000 // empty parallele interface if no MPI to build dll // with or without mpi.. //#include "parallelepmi.hpp" extern void (*initparallele)(int &argc, char **& argv) ; extern void (*init_lgparallele)(); extern void (*end_parallele)(); void init_ptr_parallelepmi(); void init_ptr_parallelepmi(){}; freefem++-3.38-1/src/mpi/parallelempi.cpp000644 000767 000024 00000262513 12471674506 020360 0ustar00hechtstaff000000 000000 #include #include #include #include #include #include #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" // FH: I have move AFunction_ext.hpp to fflib dir. #include "AFunction_ext.hpp" // Add J. Morice for AFunction_ext.hpp #include "ufunction.hpp" using namespace std; #include "rgraph.hpp" #include "RNM.hpp" // after RNM otherwise // trouble with index in RNM (I do no understander FH) #include #include #include #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include "Mesh2dn.hpp" #include "Mesh3dn.hpp" #include "Operator.hpp" #include "lex.hpp" #include "libmesh5.h" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" //FFCS redirection #include "../fflib/ffapi.hpp" void ff_atend( void (*atendff)()); #undef MPICH_SKIP_MPICXX #define MPICH_SKIP_MPICXX #undef MPICH_IGNORE_CXX_SEEK #define MPICH_IGNORE_CXX_SEEK #include // Remark on mipich MPI_Comm, MPI_Resquest, MPI_Group, MPI_Op are int // => encapsulation //static long verbosity=1000; template struct fMPI { MPI_type v; operator MPI_type &() {return v;} operator MPI_type *() {return &v;} operator MPI_type () const {return v;} // MPI_type * operator &() {return &v;} void operator=(const MPI_type vv) { v=vv;} fMPI(const MPI_type vv=0) : v(vv){} bool operator!=(MPI_type vv) const {return vv !=v;} bool operator==(MPI_type vv) const {return vv ==v;} }; // the encapsulation for the for MPI type (int on mpich ) typedef fMPI fMPI_Comm; typedef fMPI fMPI_Group; typedef fMPI fMPI_Request; typedef fMPI fMPI_Op; // end of encapsulation .. // to send a sparse matrix we send header, line array ,colmun array, value array. // end afer the fist resquest we need to do allocation. // so in this cas the communacatio is done in // 2 step // 1 the header, // alloc time // 2 the message // a couple request, pointer. // Not use of IPROBE because probelem of wait. class MPIrank; class DoOnWaitMPI_Request ; map ToDoOnWaitMPI_Request; void GetPendingWait() ; template struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_BYTE;}};; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_LONG;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_INT;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_DOUBLE;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_BYTE;}}; #ifdef HAVE_MPI_DOUBLE_COMPLEX template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_DOUBLE_COMPLEX;}}; #endif template struct MPI_WHAT {}; template<> struct MPI_WHAT {static const int WHAT=101;}; template<> struct MPI_WHAT {static const int WHAT=102;}; template<> struct MPI_WHAT {static const int WHAT=103;}; template<> struct MPI_WHAT *> {static const int WHAT=104;}; template<> struct MPI_WHAT* > {static const int WHAT=105;}; template<> struct MPI_WHAT* > {static const int WHAT=106;}; template struct MPI_TAG {}; template<> struct MPI_TAG {static const int TAG=5;}; template<> struct MPI_TAG {static const int TAG=4;}; template<> struct MPI_TAG {static const int TAG=6;}; template<> struct MPI_TAG* > {static const int TAG=11;}; template<> struct MPI_TAG* > {static const int TAG=12;}; template<> struct MPI_TAG* > {static const int TAG=13;}; template<> struct MPI_TAG {static const int TAG=1000;}; template<> struct MPI_TAG {static const int TAG=1010;}; template<> struct MPI_TAG *> {static const int TAG=1020;}; template<> struct MPI_TAG *> {static const int TAG=1030;}; void f_initparallele(int &, char **&); void f_init_lgparallele(); extern long mpirank ; extern long mpisize ; // for syncro communication MPI_Request * Syncro_block = reinterpret_cast (1); const size_t sizempibuf = 1024*320; template long WSend( R * v,int l,int who,int tag,MPI_Comm comm,MPI_Request *rq) { long ret=0; MPI_Request rq0,*request=&rq0; if(verbosity>100) cout << mpirank<< " send to " << who << " tag " << tag << " " << rq << " " << comm << " syncro "<< (rq == Syncro_block) <::TYPE() , who, tag,comm); else { ret=MPI_Isend((void *) v,l, MPI_TYPE::TYPE() , who, tag,comm,request); if(rq) *rq=*request; else MPI_Request_free(request); } return ret; } template void CheckContigueKN(const KN_ &t) { if( t.step != 1 && t.N()>1) { cout<< " step= "<< t.step << " size " << t.N() << " " << & t[0] << " " << & t[1] << endl; ExecError("Sorry the array is not contigue (step != 1) "); } } template<> long WSend ( Complex * v,int n,int who,int tag,MPI_Comm comm,MPI_Request *rq) { long ret=0; MPI_Request rq0,*request=&rq0; if(verbosity>100) cout << mpirank<< " send to " << who << " tag " << tag << " " << rq << " " << comm << " syncro "<< (rq == Syncro_block) << endl; if(rq == Syncro_block) { #ifdef HAVE_MPI_DOUBLE_COMPLEX ret=MPI_Send(reinterpret_cast (v) , n, MPI_DOUBLE_COMPLEX, who, tag,comm); #else n *=2; ret= MPI_Send(reinterpret_cast (v), n, MPI_DOUBLE, who, tag,comm); #endif } else { #ifdef HAVE_MPI_DOUBLE_COMPLEX ret=MPI_Isend(reinterpret_cast (v) , n, MPI_DOUBLE_COMPLEX, who, tag,comm,request); #else n *=2; ret=MPI_Isend(reinterpret_cast (v), n, MPI_DOUBLE, who, tag,comm,request); n /= 2; #endif if(rq) *rq=*request; else MPI_Request_free(request); } return ret; } template long WRecv(R * v,int n,int who,int tag,MPI_Comm comm,MPI_Request *rq) { MPI_Status status; if(rq && (rq != Syncro_block)) return MPI_Irecv(reinterpret_cast (v),n, MPI_TYPE::TYPE() , who, tag,comm,rq); else return MPI_Recv(reinterpret_cast (v),n, MPI_TYPE::TYPE() , who, tag,comm,&status); } template<> long WRecv (Complex * v,int n,int who,int tag,MPI_Comm comm,MPI_Request *rq) { MPI_Status status; #ifdef HAVE_MPI_DOUBLE_COMPLEX if(rq && (rq != Syncro_block)) return MPI_Irecv(reinterpret_cast (v), n, MPI_DOUBLE_COMPLEX, who, tag,comm,rq); else return MPI_Recv(reinterpret_cast (v), n, MPI_DOUBLE_COMPLEX, who, tag,comm,&status); #else n *=2; if(rq && (rq != Syncro_block)) return MPI_Irecv(reinterpret_cast (v), n, MPI_DOUBLE, who, tag,comm,rq); else return MPI_Recv(reinterpret_cast (v), n, MPI_DOUBLE, who, tag,comm,&status); #endif } template void WBcast(R * v,int n,int who,MPI_Comm comm) { assert(v && n>0); MPI_Bcast(reinterpret_cast (v), n, MPI_TYPE::TYPE(), who,comm); } template<> void WBcast(Complex * v,int n,int who,MPI_Comm comm) { assert(v && n>0); #ifdef HAVE_MPI_DOUBLE_COMPLEX MPI_Bcast(reinterpret_cast (v), n, MPI_DOUBLE_COMPLEX /*MPI_TYPE::TYPE()*/, who,comm); #else n *=2; MPI_Bcast(reinterpret_cast (v), n, MPI_DOUBLE, who,comm); #endif } struct MPIrank { int who; MPI_Comm comm; MPI_Request *rq; // mutable bool block; MPIrank(int i=0,MPI_Comm com=MPI_COMM_WORLD, MPI_Request *rqq=0) : who(i) , comm(com),rq(rqq) { int n; MPI_Comm_size(comm, &n); // cout <<" who = " << who << " ******** " << n << " "<< ((-2 < who) && (who < n)) << endl; // ffassert( (-2 < who) && (who < n) ); // plant sans raison ... } long Send(double a)const {return WSend(&a, 1, who, MPI_TAG< double >::TAG,comm,rq); } long Send(long a)const {return WSend(&a, 1, who, MPI_TAG< long >::TAG,comm,rq); } long Send(Complex a)const {return WSend(&a, 1, who, MPI_TAG< Complex >::TAG,comm,rq); } long Recv(double & a) const { return WRecv(&a, 1, who, MPI_TAG< double >::TAG ,comm,rq);} long Recv(long & a) const { return WRecv(&a, 1, who, MPI_TAG< long >::TAG ,comm,rq);} long Recv(Complex & a) const { return WRecv(&a, 1, who, MPI_TAG< Complex >::TAG ,comm,rq);} const MPIrank & Bcast(double & a) const {WBcast(&a, 1, who,comm); return *this; } const MPIrank & Bcast(long & a) const {WBcast(&a, 1, who,comm); return *this; } const MPIrank & Bcast(Complex & a) const {WBcast(&a, 1, who,comm); return *this; } template long Recv(KN & a) const { assert(&a); CheckContigueKN(a); if(verbosity>99) cout << " ---- " << who << " >> " << & a << " " << a.N() << " " << a.step << " " << MPI_TAG* >::TAG <<" from " << mpirank << " "<< (R *) a << endl; int n= a.N(); long ll=WRecv((R *) a, n, who, MPI_TAG* >::TAG ,comm,rq); if(verbosity>99) cout << " ++++ " << who << " >> " << & a << " " << a.N() << " " << MPI_TAG* >::TAG <<" from " << mpirank << " "<< (R *) a << endl; ffassert(a.N()==n); return ll; } template long Send(const KN *aa)const { const KN & a=*aa; ffassert(&a); int n= a.N(); CheckContigueKN(*aa); if(verbosity>99) cout << " .... " << who << " >> " << & a << " " << a.N() << " " << a.step<< " " << MPI_TAG* >::TAG <<" from " << mpirank << " "<< (R *) a << endl; return WSend((R *) a,n,who,MPI_TAG* >::TAG,comm,rq); } template const MPIrank & Bcast(const KN &a) const { //const KN & a=*aa; assert(&a); int n= a.N(); CheckContigueKN(a); WBcast((R *) a, n, who,comm); ffassert(a.N()==n); return *this; } const MPIrank & Bcast(Fem2D::Mesh *& a) const { if(verbosity>1) cout << " MPI Bcast (mesh *) " << a << endl; Serialize *buf=0; long nbsize=0; if( who == mpirank) { buf =new Serialize((*a).serialize()); nbsize = buf->size(); } WBcast( &nbsize, 1, who,comm); if (who != mpirank) buf= new Serialize(nbsize,Fem2D::Mesh::magicmesh); assert(nbsize); if(verbosity>2) cout << " size to bcast : " << nbsize << " mpirank : " << mpirank << endl; WBcast( (char *)(*buf),nbsize, who,comm); if(who != mpirank) { if (a) (*a).decrement(); a= new Fem2D::Mesh(*buf); Fem2D::R2 Pn,Px; a->BoundingBox(Pn,Px); a->quadtree=new Fem2D::FQuadTree(a,Pn,Px,a->nv); } delete buf; return *this; } const MPIrank & Bcast(Fem2D::Mesh3 *& a) const { if(verbosity>1) cout << " MPI Bcast (mesh3 *) " << a << endl; Serialize *buf=0; long nbsize=0; if( who == mpirank) { buf =new Serialize((*a).serialize()); nbsize = buf->size(); } WBcast( &nbsize, 1, who,comm); if (who != mpirank) buf= new Serialize(nbsize,Fem2D::GenericMesh_magicmesh); assert(nbsize); if(verbosity>2) cout << " size to bcast : " << nbsize << " mpirank : " << mpirank << endl; WBcast( (char *)(*buf),nbsize, who,comm); if(who != mpirank) { if (a) (*a).decrement(); a= new Fem2D::Mesh3(*buf); a->BuildGTree(); } delete buf; return *this; } template const MPIrank & Bcast(Matrice_Creuse & a) const { if(verbosity>1) cout << mpirank << ": MPI Bcast " << who << " (Matrice_Creuse &) " << &a << " " << a.A << endl; MatriceMorse *mA=0; int ldata[4]={0,0,0,0}; if( who == mpirank) { if(a.A) { mA= a.A->toMatriceMorse(); ldata[0]=mA->n; ldata[1]=mA->m; ldata[2]=mA->nbcoef; ldata[3]=mA->symetrique; // cout << mpirank << " ldata " << ldata[0] << " " << ldata[1] <<" " << ldata[2] << " " <(ldata[0],ldata[1],ldata[2],ldata[3]); if(ldata[0]) { // cout << mpirank << " " << who << " lg " << mA->lg << " " << n1 << endl; WBcast( mA->lg,n1, who,comm); //cout << mpirank << " " << who << " cl " << mA->cl << " " << mA->nbcoef << endl; WBcast( mA->cl,mA->nbcoef, who,comm); //cout << mpirank << " " << who << " a " << mA->a << " " << mA->nbcoef << endl; WBcast( mA->a,mA->nbcoef , who,comm); } if( who != mpirank) a.A.master(mA); else delete mA; return *this; } // version asyncrone or syncrone Now 2010 ... template long Send(Matrice_Creuse * const & a) const ; template long Recv(Matrice_Creuse & a) const ; long Send(Fem2D::Mesh * a) const ; long Send (Fem2D::Mesh3 * a) const ; long Recv(Fem2D::Mesh *& a) const; long Recv(Fem2D::Mesh3 *& a) const; operator int () const { return who;} }; // for MPI_WAIT_resquets (complex MPI asyncrone MPI recv request ) .. class DoOnWaitMPI_Request :public MPIrank { public: bool sync; DoOnWaitMPI_Request( MPIrank mpr) : MPIrank(mpr),sync((rq==0 || rq == Syncro_block)) {} virtual bool Do(MPI_Request *rrq) =0; // false -> end bool DoSR() { // do the Send/Recv Op. bool ret=false; if(verbosity>100) cout << mpirank << " --- Do Send/Recv : " << " " << rq << " " << sync << endl; if(sync) // wait ... { bool c=1; if(verbosity>100) cout << mpirank << " --- Do way : " << c << " " << rq << endl; while (c) { c=Do(rq); if(verbosity>100) cout << mpirank << " --- Do return : " << c << " " << rq << endl; } ret=true;// clean } else ToDoOnWaitMPI_Request[rq]=this; // add request for WAIT .. return ret; } virtual ~DoOnWaitMPI_Request(){} private: DoOnWaitMPI_Request(const DoOnWaitMPI_Request & ); DoOnWaitMPI_Request & operator=( DoOnWaitMPI_Request & ); }; void DoOnWaitMPIRequest(MPI_Request *rq) { if( rq ) { map:: iterator drd = ToDoOnWaitMPI_Request.find(rq) ; if(drd != ToDoOnWaitMPI_Request.end()) { if(verbosity>100) cout << " Do on DoOnWaitMPIRequest " << rq << " " << endl; if( !drd->second->Do(rq) ) { delete drd->second; ToDoOnWaitMPI_Request.erase(drd); // finish ... } } } } void DeSerialize(Serialize * sTh,Fem2D::Mesh ** ppTh) { if ( *ppTh ) (**ppTh).decrement(); // cout << " ####"<< sTh << endl; Fem2D::Mesh * pTh= new Fem2D::Mesh(*sTh); // cout << " ####\n"; *ppTh=pTh; Fem2D::R2 Pn,Px; pTh->BoundingBox(Pn,Px); pTh->quadtree=new Fem2D::FQuadTree(pTh,Pn,Px,pTh->nv); } void DeSerialize(Serialize * sTh,Fem2D::Mesh3 ** ppTh) { if ( *ppTh ) (**ppTh).decrement(); Fem2D::Mesh3 * pTh= new Fem2D::Mesh3(*sTh); pTh->BuildGTree(); *ppTh=pTh; } template class RevcWMatd : public DoOnWaitMPI_Request { public: typedef Matrice_Creuse Mat; Matrice_Creuse * pmat; MatriceMorse *mA; int state; int ldata[4]; RevcWMatd(const MPIrank *mpirank,Mat * pm) : DoOnWaitMPI_Request(*mpirank), pmat(pm),mA(0),state(0) { int tag = MPI_TAG* >::TAG; int ll=WRecv( ldata,4, who, tag,comm,rq); ffassert(ll == MPI_SUCCESS); } bool Do(MPI_Request *rrq) { state++; int tag=MPI_TAG::TAG; if(verbosity>100) cout << mpirank << " ---R: ldata " << ldata[0] << " " << ldata[1] <<" " << ldata[2] << " " <(ldata[0],ldata[1],ldata[2],ldata[3]); ll=WRecv( mA->lg,mA->n+1, who, tag+1,comm,rq); break; case 2: ll=WRecv( mA->cl,mA->nbcoef, who, tag+2,comm,rq); break; case 3: ll=WRecv( mA->a,mA->nbcoef, who, tag+3,comm,rq); break; default: pmat->A.master(mA); mA=0; return false; break; } ffassert(ll == MPI_SUCCESS); return true; // OK } ~RevcWMatd() { if(mA) delete mA; } }; template class SendWMatd : public DoOnWaitMPI_Request { public: typedef Matrice_Creuse Mat; Matrice_Creuse * pmat; MatriceMorse *mA; int state; int ldata[4]; SendWMatd(const MPIrank *mpirank,Mat * pm) : DoOnWaitMPI_Request(*mpirank), pmat(pm),mA(0),state(0) { mA=pmat->A->toMatriceMorse(); ldata[0]=mA->n; ldata[1]=mA->m; ldata[2]=mA->nbcoef; ldata[3]=mA->symetrique; int tag = MPI_TAG* >::TAG; int ll=WSend( ldata,4, who, tag,comm,rq); ffassert(ll == MPI_SUCCESS) ; } bool Do(MPI_Request *rrq) { state++; int tag=MPI_TAG::TAG; if(verbosity>100) cout << mpirank << " ---S ldata " << ldata[0] << " " << ldata[1] <<" " << ldata[2] << " " <lg,mA->n+1, who, tag+1,comm,rq); break; case 2: ll=WSend( mA->cl,mA->nbcoef, who, tag+2,comm,rq); break; case 3: ll=WSend( mA->a,mA->nbcoef, who, tag+3,comm,rq); break; default: delete mA; mA=0; return false; break; } ffassert(ll == MPI_SUCCESS); return true; // OK } ~SendWMatd() { if(mA) delete mA; } }; template class RevcWMeshd : public DoOnWaitMPI_Request,Serialize { public: Mesh ** ppTh; int state; RevcWMeshd(const MPIrank *mpirank,Mesh ** ppThh) : DoOnWaitMPI_Request(*mpirank),Serialize(sizempibuf,Fem2D::Mesh::magicmesh), ppTh(ppThh),state(0) { int tag=MPI_TAG::TAG; if(verbosity>100) cout << " -- RevcWMeshd " << rq << " " << comm << " " << p << endl; char * pp = p-sizeof(long); int ll=WRecv(pp, sizempibuf, who, tag,comm,rq); // wait first part .. // cout << mpirank << " ++ ll= " << ll << " pp= " << pp << endl; } bool Do(MPI_Request *rrq) { int tag=MPI_TAG::TAG; ffassert(rq == rrq); long l = * (long *) (void *) p ; long l1 = l -( sizempibuf-sizeof(long)); if(verbosity>100) cout << mpirank << " Do RevcWMeshd " << l <<" " << state << " cont : " << (l1 >0) << " " << rq << " " << comm << endl; if(0==state++ && l1>0 ) // recv first part .. { if(verbosity>100) cout << mpirank << " + Do RevcWMeshd " << l <<" " << state << " cont : " << ( l > sizempibuf) << " " << rq << " " << l-sizempibuf << " p = " << (void *) p << endl; resize(l); int ll=WRecv(p-sizeof(long)+sizempibuf,l1, who, tag+state,comm,rq); return true;// continue .. } else resize(l); // we have the all buffer => DeSerialize DeSerialize(this,ppTh); count()=0; if(verbosity>100) cout << " " << mpirank << " recived from " << who << " serialized " << what << ", l=" << l << ", tag=" << tag << " rq = " << rq << " " << *ppTh << endl; return false; // OK } ~RevcWMeshd() {count()=0;} }; template class SendWMeshd : public DoOnWaitMPI_Request,Serialize { public: Mesh ** ppTh; int state; SendWMeshd(const MPIrank *mpirank,Mesh ** ppThh) : DoOnWaitMPI_Request(*mpirank),Serialize((**ppThh).serialize()), ppTh(ppThh),state(0) { int tag=MPI_TAG::TAG; if(verbosity>100) cout << " -- SendWMeshd " << rq << " " << comm << " " << p << endl; char * pp = p-sizeof(long); count()=lg; // store length in count size_t ls=lg+sizeof(long); if (ls<=sizempibuf) WSend(pp,ls, who, tag,comm,rq); else WSend(pp,sizempibuf,who, tag,comm,rq); } bool Do(MPI_Request *rrq) { int tag=MPI_TAG::TAG; char * pp = p-sizeof(long); long l1 = lg -(sizempibuf- sizeof(long)); if(verbosity>100) cout << mpirank << " Do SendWMeshd " << lg <<" " << state << " cont : " << (l1 >0) << " " << rq << " " << comm << endl; if(0==state++ && l1>0 ) // send the second part { int ll=WSend(pp+sizempibuf,l1, who, tag+state,comm,rq); return true;// Fini } return false; // OK } ~SendWMeshd() {count()=0;} }; template long MPIrank::Send(Matrice_Creuse * const & a) const { if(0) { if(verbosity>100) cout << " MPI << (Matrice_Creuse *) " << a << endl; ffassert(rq==0 || rq == Syncro_block) ; // int tag = MPI_TAG* >::TAG; MatriceMorse *mA=a->A->toMatriceMorse(); int ldata[4]; ldata[0]=mA->n; ldata[1]=mA->m; ldata[2]=mA->nbcoef; ldata[3]=mA->symetrique; if(verbosity>100) cout << " ldata " << ldata[0] << " " << ldata[1] <<" " << ldata[2] << " " <lg,mA->n+1, who, tag+1,comm,rq); if(ll == MPI_SUCCESS) ll=WSend( mA->cl,mA->nbcoef, who, tag+2,comm,rq); if(ll == MPI_SUCCESS) ll=WSend( mA->a,mA->nbcoef, who, tag+3,comm,rq); delete mA; return ll; } else { SendWMatd *rwm= new SendWMatd(this,a); if( rwm->DoSR() ) delete rwm; return MPI_SUCCESS; } } template long MPIrank::Recv(Matrice_Creuse & a) const { if(0) { if(verbosity>100) cout << " MPI << (Matrice_Creuse ) " << a << endl; ffassert(rq==0 || rq == Syncro_block) ; // int tag = MPI_TAG* >::TAG; int ldata[4]; int ll=0; ll=WRecv( ldata,4, who, tag,comm,rq); MatriceMorse *mA= new MatriceMorse(ldata[0],ldata[1],ldata[2],ldata[3]); if(ll == MPI_SUCCESS) ll=WRecv( mA->lg,mA->n+1, who, tag+1,comm,rq); if(ll == MPI_SUCCESS) ll=WRecv( mA->cl,mA->nbcoef, who, tag+2,comm,rq); if(ll == MPI_SUCCESS) ll=WRecv( mA->a,mA->nbcoef, who, tag+3,comm,rq); a.A.master(mA); return ll; } else { RevcWMatd *rwm= new RevcWMatd(this,&a); if( rwm->DoSR() ) delete rwm; return MPI_SUCCESS; } } long MPIrank::Send(Fem2D::Mesh * a) const { if(verbosity>100) cout << " MPI << (mesh *) " << a << endl; ffassert(a); SendWMeshd *rwm= new SendWMeshd(this,&a); //cout << " ... "<< endl; if( rwm->DoSR() ) delete rwm; return MPI_SUCCESS; } long MPIrank::Send (Fem2D::Mesh3 * a) const { if(verbosity>100) cout << " MPI << (mesh3 *) " << a << endl; ffassert(a); SendWMeshd *rwm= new SendWMeshd(this,&a); if( rwm->DoSR() ) delete rwm; return MPI_SUCCESS; } /* long MPIrank::Send(Fem2D::Mesh * a) const { if(verbosity>100) cout << " MPI << (mesh *) " << a << endl; ffassert(a); Serialize buf=(*a).serialize(); buf.mpisend(*this,MPI_TAG::TAG,static_cast(this)); return MPI_SUCCESS; } long MPIrank::Send (Fem2D::Mesh3 * a) const { if(verbosity>100) cout << " MPI << (mesh3 *) " << a << endl; ffassert(a); Serialize buf=(*a).serialize(); buf.mpisend(*this,MPI_TAG::TAG,static_cast(this)); return MPI_SUCCESS; } */ // new version asyncrone ... Now 2010 ... long MPIrank::Recv(Fem2D::Mesh *& a) const { if(verbosity>100) cout << " MPI >> (mesh *) &" << a << " " << &a << endl; RevcWMeshd *rwm= new RevcWMeshd(this,&a); if( rwm->DoSR() ) delete rwm; if((rq==0 || rq == Syncro_block)) ffassert( a ); return MPI_SUCCESS; } long MPIrank::Recv(Fem2D::Mesh3 *& a) const { if(verbosity>100) cout << " MPI >> (mesh3 *) &" << a << " " << &a << endl; RevcWMeshd *rwm= new RevcWMeshd(this,&a); if( rwm->DoSR() ) delete rwm; if((rq==0 || rq == Syncro_block)) ffassert( a ); return MPI_SUCCESS; } void Serialize::mpisend(const MPIrank & rank,long tag,const void * vmpirank) { const MPIrank * mpirank=static_cast (vmpirank); MPI_Comm comm=mpirank->comm; MPI_Request *rq=mpirank->rq; ffassert(rq==0 || rq == Syncro_block); char * pp = p-sizeof(long); long countsave=count(); // save count count()=lg; // store length in count int l=lg+sizeof(long); if(verbosity>100) cout << " -- send from " << mpirank << " to " << rank << " serialized " << what << ", l=" << l << ", tag=" << tag << " " << (l < sizempibuf) << endl; if (l <=sizempibuf) WSend(pp,l, rank, tag,comm,rq); else { WSend(pp,sizempibuf, rank, tag,comm,rq); WSend(pp+sizempibuf,l-sizempibuf, rank, tag+1,comm,rq); } if(verbosity>100) cout << " ok send is arrived " << endl; count()=countsave; // restore count } Serialize::Serialize(const MPIrank & rank,const char * wht,long tag,const void * vmpirank) :what(wht) { const MPIrank * mpirank=static_cast (vmpirank); MPI_Comm comm=mpirank->comm; MPI_Request *rq=mpirank->rq; if(verbosity>100) cout << " -- waiting " << mpirank << " from " << rank << " serialized " << what << " tag = " << tag << endl; if(!(rq==0 || rq == Syncro_block)) { ExecError("Not async recv of complex objet! Sorry to hard to code (FH!)."); ffassert(rq==0 || rq == Syncro_block); } char * buf= new char [sizempibuf]; WRecv(buf, sizempibuf, rank, tag,comm,rq); lg = * (long *) (void *) buf; int l=lg+sizeof(long); char * pp= new char[l] ; if ( l <= sizempibuf) memcpy(pp,buf,l); else { memcpy(pp,buf,sizempibuf); WRecv(pp+sizempibuf,l-sizempibuf, rank, tag+1,comm,rq) ; } if(verbosity>100) cout << " " << mpirank << " recived from " << rank << " serialized " << what << ", l=" << l << ", tag=" << tag << endl; delete [] buf; p=pp+sizeof(long); count()=0; } template struct Op_Readmpi : public binary_function { static MPIrank f(MPIrank const & f,A * const & a) { f.Recv(*a); return f; } }; template struct Op_Recvmpi : public binary_function { static MPIrank f(MPIrank const & f,A * const & a) { ffassert(f.rq ==0 || f.rq == Syncro_block); // Block return f.Recv(*a); } }; template struct Op_IRecvmpi : public binary_function { static MPIrank f(MPIrank const & f,A * const & a) { ffassert(f.rq !=0 || f.rq != Syncro_block); // no Block return f.Recv(*a); } }; template struct Op_Writempi : public binary_function { static MPIrank f(MPIrank const & f,A const & a) { f.Send(a); return f; } }; template struct Op_Bcastmpi : public binary_function { static MPIrank f(MPIrank const & f,A * const & a) { f.Bcast(*a); return f; } }; template struct Op_ISendmpi : public binary_function { static MPIrank f(MPIrank const & f,A const & a) { ffassert(f.rq != Syncro_block); return f.Send(a); } }; template struct Op_Sendmpi : public binary_function { static MPIrank f(MPIrank const & f,A const & a) { MPIrank ff(f.who,f.comm,Syncro_block); return ff.Send(a); } }; template struct Op_All2All : public binary_function,KN_,long> { static long f( KN_ const & s, KN_ const &r) { CheckContigueKN(s); CheckContigueKN(r); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = s.N()/mpisizew; ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); return MPI_Alltoall( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(), comm); } }; template struct Op_Allgather1 : public binary_function,long> { static long f( R* const & s, KN_ const &r) { MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; CheckContigueKN(r); MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = 1; ffassert(r.N()==mpisizew); return MPI_Allgather( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(), comm); } }; template struct Op_Allgather : public binary_function,KN_,long> { static long f( KN_ const & s, KN_ const &r) { CheckContigueKN(s); CheckContigueKN(r); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = r.N()/mpisizew; ffassert(r.N()==mpisizew*chunk && chunk == s.N()); return MPI_Allgather( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(), comm); } }; template struct Op_All2All3 : public ternary_function,KN_,fMPI_Comm,long> { static long f(Stack, KN_ const & s, KN_ const &r,fMPI_Comm const & cmm ) { CheckContigueKN(s); CheckContigueKN(r); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = s.N()/mpisizew; ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); return MPI_Alltoall( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(), comm); } }; template struct Op_Allgather3 : public ternary_function,KN_,fMPI_Comm,long> { static long f(Stack, KN_ const & s, KN_ const &r,fMPI_Comm const & cmm) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = r.N()/mpisizew; // bug corrected by J. Morice //ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); ffassert(s.N()==chunk && r.N()==s.N()*mpisizew); return MPI_Allgather( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(), comm); } }; template struct Op_Allgather13 : public ternary_function,fMPI_Comm,long> { static long f(Stack, R* const & s, KN_ const &r,fMPI_Comm const & cmm) { CheckContigueKN(r); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = 1; // bug corrected by J. Morice //ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); ffassert( r.N()==mpisizew); return MPI_Allgather( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(), comm); } }; // Add J. Morice template long Op_All2Allv( KN_ const & s, KN_ const &r, KN_ const &sendcnts, KN_ const &sdispls, KN_ const &recvcnts, KN_ const &rdispls) { CheckContigueKN(s); CheckContigueKN(r); MPI_Comm comm=MPI_COMM_WORLD; int mpirankv=MPI_UNDEFINED; MPI_Comm_rank(comm, &mpirankv); int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ ffassert( sendcnts.N() == sdispls.N() && sendcnts.N() == recvcnts.N() && sendcnts.N() == rdispls.N() && sendcnts.N() == mpisizew ); KN INTsendcnts(sendcnts.N()); KN INTsdispls(sdispls.N()); KN INTrecvcnts(recvcnts.N()); KN INTrdispls(rdispls.N()); for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii] = sendcnts[ii]; INTsdispls[ii] = sdispls[ii]; INTrecvcnts[ii] = recvcnts[ii]; INTrdispls[ii] = rdispls[ii]; } return MPI_Alltoallv( (void *) (R*) s, INTsendcnts, INTsdispls, MPI_TYPE::TYPE(), (void *) (R*) r, INTrecvcnts, INTrdispls, MPI_TYPE::TYPE(), comm); } template struct Op_Allgatherv : public quad_function,KN_,KN_,KN_,long> { static long f( Stack ,KN_ const & s, KN_ const &r, KN_ const & recvcount, KN_ const & displs) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); ffassert( recvcount.N() == displs.N() && recvcount.N() == mpisizew); long sum=0; for(int ii=0; ii< recvcount.N(); ii++) sum+=recvcount[ii]; ffassert( sum == r.N() ); KN INTrecvcount(recvcount.N()); KN INTdispls(displs.N()); for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= recvcount[ii]; INTdispls[ii]= displs[ii]; } return MPI_Allgatherv( (void *) (R*) s, s.N(), MPI_TYPE::TYPE(), (void *) (R*) r, INTrecvcount, INTdispls,MPI_TYPE::TYPE(), comm); } }; template long Op_All2All3v(KN_ const & s, KN_ const &r,fMPI_Comm const & cmm, KN_ const &sendcnts, KN_ const &sdispls, KN_ const &recvcnts, KN_ const &rdispls ) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpirankv=MPI_UNDEFINED; MPI_Comm_rank(comm, &mpirankv); int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ ffassert( sendcnts.N() == sdispls.N() && sendcnts.N() == recvcnts.N() && sendcnts.N() == rdispls.N() && sendcnts.N() == mpisizew ); //ffassert(s.N()==sendcnts[mpirankv] && r.N()==recvbuf[mpirankv]); KN INTsendcnts(sendcnts.N()); KN INTsdispls(sdispls.N()); KN INTrecvcnts(recvcnts.N()); KN INTrdispls(rdispls.N()); for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii] = sendcnts[ii]; INTsdispls[ii] = sdispls[ii]; INTrecvcnts[ii] = recvcnts[ii]; INTrdispls[ii] = rdispls[ii]; } return MPI_Alltoallv( (void *) (R*) s, INTsendcnts, INTsdispls, MPI_TYPE::TYPE(), (void *) (R*) r, INTrecvcnts, INTrdispls, MPI_TYPE::TYPE(), comm); } template long Op_Allgatherv3(KN_ const & s, KN_ const &r,fMPI_Comm const & cmm, KN_ const & recvcount, KN_ const & displs) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); ffassert( recvcount.N() == displs.N() && recvcount.N() == mpisizew); long sum=0; for(int ii=0; ii< recvcount.N(); ii++) sum+=recvcount[ii]; ffassert( sum == r.N() ); KN INTrecvcount(recvcount.N()); KN INTdispls(displs.N()); for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= recvcount[ii]; INTdispls[ii]= displs[ii]; } return MPI_Allgatherv( (void *) (R*) s, s.N(), MPI_TYPE::TYPE(), (void *) (R*) r, INTrecvcount, INTdispls,MPI_TYPE::TYPE(), comm); } template struct Op_Scatter1 : public ternary_function, R* ,MPIrank,long> { static long f(Stack, KN_ const & s, R* const &r, MPIrank const & root) { CheckContigueKN(s); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); int chunk = 1; // ffassert(s.N()==mpisizew*chunk); return MPI_Scatter( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(),root.who,root.comm); } }; // Fin add J. Morice template struct Op_Scatter3 : public ternary_function,KN_,MPIrank,long> { static long f(Stack, KN_ const & s, KN_ const &r, MPIrank const & root) { CheckContigueKN(r); CheckContigueKN(s); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); int chunk = r.N(); // FH correct jan 2012 ... // ffassert(s.N()==mpisizew*chunk && r.N()==chunk); return MPI_Scatter( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(),root.who,root.comm); } }; // Add J. Morice template //struct Op_Scatterv3 : public penta_function< KN_, KN_, MPIrank, KN_, KN_, long> { long Op_Scatterv3( KN_ const & s, KN_ const &r, MPIrank const & root, KN_ const &sendcnts, KN_ const &displs) { CheckContigueKN(r); CheckContigueKN(s); int mpirankv=MPI_UNDEFINED; if(root.comm != MPI_COMM_NULL) MPI_Comm_rank(root.comm, &mpirankv); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); /* local */ KN INTsendcnts(mpirankv == root.who ? sendcnts.N() : 0); KN INTdispls(mpirankv == root.who ? sendcnts.N() : 0); for(int ii=0; ii< INTsendcnts.N(); ii++){ INTsendcnts[ii]= sendcnts[ii]; INTdispls[ii]= displs[ii]; } return MPI_Scatterv( (void *) (R*) s, INTsendcnts, INTdispls, MPI_TYPE::TYPE(), (void *) (R*) r, r.N(), MPI_TYPE::TYPE(),root.who,root.comm); } // fin J. Morice template struct Op_ReduceMat : public quad_function*,Matrice_Creuse *,MPIrank,fMPI_Op,long> { static long f(Stack, Matrice_Creuse* const & s,Matrice_Creuse* const &r, MPIrank const & root, fMPI_Op const &op) { ffassert( r && s); MatriceCreuse * sA=s->A; MatriceCreuse * rA=r->A; ffassert( sA && rA); MatriceMorse & sM = *dynamic_cast* > (sA); MatriceMorse & rM = *dynamic_cast* > (rA); ffassert( &sM && &rM); int chunk = sM.nbcoef; ffassert(chunk==rM.nbcoef); return MPI_Reduce( (void *) sM.a,(void *) rM.a, chunk , MPI_TYPE::TYPE(),op,root.who,root.comm); } }; template struct Op_AllReduceMat : public quad_function*,Matrice_Creuse *,fMPI_Comm,fMPI_Op,long> { static long f(Stack, Matrice_Creuse* const & s,Matrice_Creuse* const &r, fMPI_Comm const & comm, fMPI_Op const &op) { ffassert( r && s); MatriceCreuse * sA=s->A; MatriceCreuse * rA=r->A; ffassert( &sA ); MatriceMorse & sM = *dynamic_cast* > (sA); ffassert( &sM ); if( ! rA ) { // build a zero matric copy of sM MatriceMorse *rm=new MatriceMorse(sM.n,sM.m,sM.nbcoef,sM.symetrique,0,sM.lg,sM.cl); *rm=R(); // set the matrix to Zero .. r->A.master(rm); rA=r->A; } ffassert( sA && rA); MatriceMorse & rM = *dynamic_cast* > (rA); ffassert( &sM && &rM); int chunk = sM.nbcoef; ffassert(chunk==rM.nbcoef); return MPI_Allreduce( (void *) sM.a,(void *) rM.a, chunk , MPI_TYPE::TYPE(),op,comm); } }; template struct Op_Reduce : public quad_function,KN_,MPIrank,fMPI_Op,long> { static long f(Stack, KN_ const & s, KN_ const &r, MPIrank const & root, fMPI_Op const &op) { CheckContigueKN(r); CheckContigueKN(s); int chunk = s.N(); ffassert(chunk==r.N()); return MPI_Reduce( (void *) (R*) s,(void *) (R*) r, chunk , MPI_TYPE::TYPE(),op,root.who,root.comm); } }; template struct Op_AllReduce : public quad_function,KN_,fMPI_Comm,fMPI_Op,long> { static long f(Stack, KN_ const & s, KN_ const &r, fMPI_Comm const & comm,fMPI_Op const &op) { CheckContigueKN(r); CheckContigueKN(s); int chunk = s.N(); ffassert(chunk==r.N()); return MPI_Allreduce( (void *) (R*) s,(void *) (R*) r, chunk , MPI_TYPE::TYPE(),op,comm); } }; template struct Op_AllReduce1 : public quad_function { static long f(Stack, R * const & s, R * const &r, fMPI_Comm const & comm,fMPI_Op const &op) { int chunk = 1; return MPI_Allreduce( (void *) (R*) s,(void *) (R*) r, 1 , MPI_TYPE::TYPE(),op,comm); } }; /* template struct Op_Reducescatter : public quad_function,KN_,fMPI_Comm,fMPI_Op,long> { static long f(Stack, KN_ const & s, KN_ const &r, fMPI_Comm const & comm,fMPI_Op const &op) { int chunk = s.N(); ffassert(chunk==r.N()); // chunk est un tableau ???? MPI_Op oop = reinterpret_cast (op); return MPI_Reduce_scatter( (void *) (R*) s,(void *) (R*) r, chunk , MPI_TYPE::TYPE(),op,comm); } };*/ template struct Op_Reduce1 : public quad_function { static long f(Stack, R* const & s, R* const &r, MPIrank const & root, fMPI_Op const &op) { int chunk = 1; return MPI_Reduce( (void *) (R*) s,(void *) (R*) r, chunk , MPI_TYPE::TYPE(),op,root.who,root.comm); } }; // Add J. Morice template struct Op_Gather1 : public ternary_function,MPIrank,long> { static long f(Stack, R* const & s, KN_ const &r, MPIrank const & root) { int mpisizew,myrank; MPI_Comm_size(root.comm, &mpisizew); MPI_Comm_rank( root.comm, &myrank) ; int chunk = 1; // ffassert( (myrank != root.who) || (r.N()>=mpisizew*chunk) ); return MPI_Gather( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(),root.who,root.comm); } }; // Fin Add J. Morice template struct Op_Gather3 : public ternary_function,KN_,MPIrank,long> { static long f(Stack, KN_ const & s, KN_ const &r, MPIrank const & root) { CheckContigueKN(r); CheckContigueKN(s); int mpisizew,myrank; MPI_Comm_size(root.comm, &mpisizew); MPI_Comm_rank(root.comm, &myrank) ; int chunk = s.N(); // cout << myrank << " " << root.who << " " << r.N() << " "<< s.N() << " " << chunk << " " << mpisizew << endl; //ffassert( (myrank != root.who) || (r.N()==mpisizew*chunk) ); return MPI_Gather( (void *) (R*) s, chunk, MPI_TYPE::TYPE(), (void *) (R*) r, chunk, MPI_TYPE::TYPE(),root.who,root.comm); } }; // Add by J. Morice template //struct Op_Gatherv3 : public penta_function,KN_, MPIrank, KN_, KN_, long> { long Op_Gatherv3(KN_ const & s, KN_ const &r, MPIrank const & root, KN_ const & recvcount, KN_ const & displs) { CheckContigueKN(r); CheckContigueKN(s); int mpirankw; MPI_Comm_rank(root.comm, &mpirankw); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); KN INTrecvcount(mpirankw == root.who ? recvcount.N() : 0); KN INTdispls(mpirankw == root.who ? recvcount.N() : 0); for(int ii=0; ii< INTrecvcount.N(); ii++){ INTrecvcount[ii]= recvcount[ii]; INTdispls[ii]= displs[ii]; } return MPI_Gatherv( (void *) (R*) s, s.N(), MPI_TYPE::TYPE(), (void *) (R*) r, INTrecvcount, INTdispls,MPI_TYPE::TYPE(),root.who,root.comm); } // Fin Add J. Morice // Add J. Morice communications entre processeurs complex template<> struct Op_All2All : public binary_function,KN_,long> { static long f( KN_ const & s, KN_ const &r) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = s.N()/mpisizew; ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Alltoall( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, comm); #else chunk*=2; return MPI_Alltoall( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE, comm); #endif } }; template<> struct Op_Allgather1 : public binary_function,long> { static long f( Complex * const & s, KN_ const &r) { CheckContigueKN(r); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = 1; ffassert( r.N()== mpisizew); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Allgather( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, comm); #else chunk*=2; return MPI_Allgather( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE, comm); #endif } }; template<> struct Op_Allgather : public binary_function,KN_,long> { static long f( KN_ const & s, KN_ const &r) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = r.N()/mpisizew; ffassert( r.N()==chunk*mpisizew && chunk==s.N() ); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Allgather( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, comm); #else chunk*=2; return MPI_Allgather( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE, comm); #endif } }; template<> struct Op_All2All3 : public ternary_function,KN_,fMPI_Comm,long> { static long f(Stack, KN_ const & s, KN_ const &r,fMPI_Comm const & cmm ) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = s.N()/mpisizew; ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Alltoall( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, comm); #else chunk*=2; return MPI_Alltoall( (void *) (Complex*) s, chunk, MPI_DOUBLE, (void *) (Complex*) (r), chunk, MPI_DOUBLE, comm); #endif } }; template<> struct Op_Allgather3 : public ternary_function,KN_,fMPI_Comm,long> { static long f(Stack, KN_ const & s, KN_ const &r,fMPI_Comm const & cmm) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = r.N()/mpisizew; // bug corrected by J. Morice //ffassert(s.N()==mpisizew*chunk && r.N()==s.N()); ffassert(s.N()==chunk && r.N()==s.N()*mpisizew); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Allgather( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, comm); #else chunk*=2; return MPI_Allgather( (void *) (Complex*) (s), chunk, MPI_DOUBLE, (void *) (Complex*) (r), chunk, MPI_DOUBLE, comm); #endif } }; template<> struct Op_Allgather13 : public ternary_function,fMPI_Comm,long> { static long f(Stack, Complex * const & s, KN_ const &r,fMPI_Comm const & cmm) { CheckContigueKN(r); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ int chunk = 1; ffassert( r.N()==mpisizew); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Allgather( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, comm); #else chunk*=2; return MPI_Allgather((void *) (Complex*)(s), chunk, MPI_DOUBLE, (void *) (Complex*) (r), chunk, MPI_DOUBLE, comm); #endif } }; template<> long Op_All2Allv( KN_ const & s, KN_ const &r, KN_ const &sendcnts, KN_ const &sdispls, KN_ const &recvcnts, KN_ const &rdispls) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=MPI_COMM_WORLD; int mpirankv=MPI_UNDEFINED; MPI_Comm_rank(comm, &mpirankv); int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ ffassert( sendcnts.N() == sdispls.N() && sendcnts.N() == recvcnts.N() && sendcnts.N() == rdispls.N() && sendcnts.N() == mpisizew ); KN INTsendcnts(sendcnts.N()); KN INTsdispls(sdispls.N()); KN INTrecvcnts(recvcnts.N()); KN INTrdispls(rdispls.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii] = sendcnts[ii]; INTsdispls[ii] = sdispls[ii]; INTrecvcnts[ii] = recvcnts[ii]; INTrdispls[ii] = rdispls[ii]; } return MPI_Alltoallv( (void *) (Complex*) s, INTsendcnts, INTsdispls, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, INTrecvcnts, INTrdispls, MPI_DOUBLE_COMPLEX, comm); #else for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii] = 2*sendcnts[ii]; INTsdispls[ii] = 2*sdispls[ii]; INTrecvcnts[ii] = 2*recvcnts[ii]; INTrdispls[ii] = 2*rdispls[ii]; } return MPI_Alltoallv( reinterpret_cast ( (Complex*) s), INTsendcnts, INTsdispls, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), INTrecvcnts, INTrdispls, MPI_DOUBLE, comm); #endif } template<> struct Op_Allgatherv : public quad_function,KN_,KN_,KN_,long> { static long f( Stack ,KN_ const & s, KN_ const &r, KN_ const & recvcount, KN_ const & displs) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=MPI_COMM_WORLD; int mpisizew; MPI_Comm_size(comm, &mpisizew); ffassert( recvcount.N() == displs.N() && recvcount.N() == mpisizew); long sum=0; for(int ii=0; ii< recvcount.N(); ii++) sum+=recvcount[ii]; ffassert( sum == r.N() ); KN INTrecvcount(recvcount.N()); KN INTdispls(displs.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= recvcount[ii]; INTdispls[ii]= displs[ii]; } return MPI_Allgatherv( (void *) (Complex*)s, s.N(), MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, INTrecvcount, INTdispls,MPI_DOUBLE_COMPLEX, comm); #else for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= 2*recvcount[ii]; INTdispls[ii]= 2*displs[ii]; } return MPI_Allgatherv( reinterpret_cast ( (Complex*) s), 2*s.N(), MPI_DOUBLE, reinterpret_cast ( (Complex*) r), INTrecvcount, INTdispls,MPI_DOUBLE, comm); #endif } }; template<> long Op_All2All3v(KN_ const & s, KN_ const &r,fMPI_Comm const & cmm, KN_ const &sendcnts, KN_ const &sdispls, KN_ const &recvcnts, KN_ const &rdispls ) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpirankv=MPI_UNDEFINED; MPI_Comm_rank(comm, &mpirankv); int mpisizew; MPI_Comm_size(comm, &mpisizew); /* local */ ffassert( sendcnts.N() == sdispls.N() && sendcnts.N() == recvcnts.N() && sendcnts.N() == rdispls.N() && sendcnts.N() == mpisizew ); //ffassert(s.N()==sendcnts[mpirankv] && r.N()==recvbuf[mpirankv]); KN INTsendcnts(sendcnts.N()); KN INTsdispls(sdispls.N()); KN INTrecvcnts(recvcnts.N()); KN INTrdispls(rdispls.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii] = sendcnts[ii]; INTsdispls[ii] = sdispls[ii]; INTrecvcnts[ii] = recvcnts[ii]; INTrdispls[ii] = rdispls[ii]; } return MPI_Alltoallv( (void *) (Complex*)s, INTsendcnts, INTsdispls, MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, INTrecvcnts, INTrdispls, MPI_DOUBLE_COMPLEX, comm); #else for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii] = 2*sendcnts[ii]; INTsdispls[ii] = 2*sdispls[ii]; INTrecvcnts[ii] = 2*recvcnts[ii]; INTrdispls[ii] = 2*rdispls[ii]; } return MPI_Alltoallv( reinterpret_cast ( (Complex*) s), INTsendcnts, INTsdispls, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), INTrecvcnts, INTrdispls, MPI_DOUBLE, comm); #endif } template<> long Op_Allgatherv3(KN_ const & s, KN_ const &r,fMPI_Comm const & cmm, KN_ const & recvcount, KN_ const & displs) { CheckContigueKN(r); CheckContigueKN(s); MPI_Comm comm=cmm; int mpisizew; MPI_Comm_size(comm, &mpisizew); ffassert( recvcount.N() == displs.N() && recvcount.N() == mpisizew); long sum=0; for(int ii=0; ii< recvcount.N(); ii++) sum+=recvcount[ii]; ffassert( sum == r.N() ); KN INTrecvcount(recvcount.N()); KN INTdispls(displs.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= recvcount[ii]; INTdispls[ii]= displs[ii]; } return MPI_Allgatherv( (void *) (Complex*)s, s.N(), MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, INTrecvcount, INTdispls,MPI_DOUBLE_COMPLEX, comm); #else for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= 2*recvcount[ii]; INTdispls[ii]= 2*displs[ii]; } return MPI_Allgatherv( reinterpret_cast ( (Complex*) s), 2*s.N(), MPI_DOUBLE, reinterpret_cast ( (Complex*) r), INTrecvcount, INTdispls,MPI_DOUBLE, comm); #endif } template<> struct Op_Scatter1 : public ternary_function,Complex *,MPIrank,long> { static long f(Stack, KN_ const & s, Complex * const &r, MPIrank const & root) { CheckContigueKN(s); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); int chunk = 1; // ffassert(s.N()==mpisizew*chunk ); fait dans mpi #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Scatter( (void *) (Complex*)s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, chunk, MPI_DOUBLE_COMPLEX,root.who,root.comm); #else chunk*=2; return MPI_Scatter( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE,root.who,root.comm); #endif } }; template<> struct Op_Scatter3 : public ternary_function,KN_,MPIrank,long> { static long f(Stack, KN_ const & s, KN_ const &r, MPIrank const & root) { CheckContigueKN(r); CheckContigueKN(s); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); int chunk = r.N();// correct 2012 FH // ffassert(s.N()==mpisizew*chunk && r.N()==chunk); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Scatter( (void *) (Complex*)s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, chunk, MPI_DOUBLE_COMPLEX,root.who,root.comm); #else chunk*=2; return MPI_Scatter( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE,root.who,root.comm); #endif } }; template<> long Op_Scatterv3( KN_ const & s, KN_ const &r, MPIrank const & root, KN_ const &sendcnts, KN_ const &displs) { CheckContigueKN(r); CheckContigueKN(s); int mpirankv=MPI_UNDEFINED; if(root.comm != MPI_COMM_NULL) MPI_Comm_rank(root.comm, &mpirankv); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); /* local */ // ffassert( sendcnts.N() == displs.N() && sendcnts.N() == mpisizew ); // size control // ffassert( r.N() == sendcnts[mpirankv] ); long sumsize=0; for(int ii=0; ii INTsendcnts(sendcnts.N()); KN INTdispls(displs.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii]= sendcnts[ii]; INTdispls[ii]= displs[ii]; } return MPI_Scatterv( (void *) (Complex*)s, INTsendcnts, INTdispls, MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, r.N(), MPI_DOUBLE_COMPLEX,root.who,root.comm); #else for(int ii=0; ii< sendcnts.N(); ii++){ INTsendcnts[ii]= 2*sendcnts[ii]; INTdispls[ii]= 2*displs[ii]; } return MPI_Scatterv( reinterpret_cast ( (Complex*) s), INTsendcnts, INTdispls, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), 2*r.N(), MPI_DOUBLE,root.who,root.comm); #endif } template<> struct Op_Reduce : public quad_function,KN_,MPIrank,fMPI_Op,long> { static long f(Stack, KN_ const & s, KN_ const &r, MPIrank const & root, fMPI_Op const &op) { CheckContigueKN(r); CheckContigueKN(s); int chunk = s.N(); ffassert(chunk==r.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Reduce( (void *) (Complex*)s,(void *) (Complex*)r, chunk , MPI_DOUBLE_COMPLEX,op,root.who,root.comm); #else chunk*=2; return MPI_Reduce( reinterpret_cast ( (Complex*) s), reinterpret_cast ( (Complex*) r), chunk , MPI_DOUBLE,op,root.who,root.comm); #endif } }; template<> struct Op_AllReduce : public quad_function,KN_,fMPI_Comm,fMPI_Op,long> { static long f(Stack, KN_ const & s, KN_ const &r, fMPI_Comm const & comm,fMPI_Op const &op) { CheckContigueKN(r); CheckContigueKN(s); int chunk = s.N(); ffassert(chunk==r.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Allreduce( (void *) (Complex*)s,(void *) (Complex*)r, chunk , MPI_DOUBLE_COMPLEX,op,comm); #else chunk *=2; return MPI_Allreduce( reinterpret_cast ( (Complex*) s), reinterpret_cast ( (Complex*) r), chunk , MPI_DOUBLE,op,comm); #endif } }; // /* // template<> // struct Op_Reducescatter : public quad_function,KN_,fMPI_Comm,fMPI_Op,long> { // static long f(Stack, KN_ const & s, KN_ const &r, fMPI_Comm const & comm,fMPI_Op const &op) // { // int chunk = s.N(); // ffassert(chunk==r.N()); // // chunk est un tableau ???? // MPI_Op oop = reinterpret_cast (op); // return MPI_Reduce_scatter( (void *) (Complex*)s,(void *) (Complex*)r, chunk , MPI_DOUBLE_COMPLEX,op,comm); // } // };*/ template<> struct Op_Reduce1 : public quad_function { static long f(Stack, Complex* const & s, Complex* const &r, MPIrank const & root, fMPI_Op const &op) { #ifdef HAVE_MPI_DOUBLE_COMPLEX int chunk = 1; return MPI_Reduce( (void *) s, (void *) r, chunk , MPI_DOUBLE_COMPLEX,op,root.who,root.comm); #else int chunk = 2; return MPI_Reduce( reinterpret_cast ( (Complex*) s), reinterpret_cast ( (Complex*) r), chunk , MPI_DOUBLE,op,root.who,root.comm); #endif } }; // Add J. Morice template<> struct Op_Gather1 : public ternary_function,MPIrank,long> { static long f(Stack, Complex * const & s, KN_ const &r, MPIrank const & root) { CheckContigueKN(r); int mpisizew,myrank; MPI_Comm_size(root.comm, &mpisizew); MPI_Comm_rank( root.comm, &myrank) ; int chunk = 1; // ffassert( (myrank != root.who) || (r.N()>=mpisizew*chunk) ); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Gather( (void *) (Complex*) s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*) r, chunk, MPI_DOUBLE_COMPLEX, root.who, root.comm); #else chunk = 2; return MPI_Gather( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE, root.who, root.comm); #endif } }; // Fin Add J. Morice template<> struct Op_Gather3 : public ternary_function,KN_,MPIrank,long> { static long f(Stack, KN_ const & s, KN_ const &r, MPIrank const & root) { CheckContigueKN(r); CheckContigueKN(s); int mpisizew,myrank; MPI_Comm_size(root.comm, &mpisizew); MPI_Comm_rank( root.comm, &myrank) ; int chunk = s.N(); // ffassert( (myrank != root.who) || (r.N()>=mpisizew*chunk) ); #ifdef HAVE_MPI_DOUBLE_COMPLEX return MPI_Gather( (void *) (Complex*)s, chunk, MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, chunk, MPI_DOUBLE_COMPLEX,root.who,root.comm); #else chunk *= 2; return MPI_Gather( reinterpret_cast ( (Complex*) s), chunk, MPI_DOUBLE, reinterpret_cast ( (Complex*) r), chunk, MPI_DOUBLE,root.who,root.comm); #endif } }; template<> //struct Op_Gatherv3 : public penta_function,KN_, MPIrank, KN_, KN_, long> { long Op_Gatherv3(KN_ const & s, KN_ const &r, MPIrank const & root, KN_ const & recvcount, KN_ const & displs) { CheckContigueKN(r); CheckContigueKN(s); int mpirankw; MPI_Comm_rank(root.comm, &mpirankw); int mpisizew; MPI_Comm_size(root.comm, &mpisizew); //ffassert((mpirankw != root.who) || ( recvcount.N() == displs.N() && recvcount.N() == mpisizew)); if( mpirankw == root.who){ long sum=0; for(int ii=0; ii< recvcount.N(); ii++) sum+=recvcount[ii]; ffassert( sum == r.N() ); } KN INTrecvcount(recvcount.N()); KN INTdispls(displs.N()); #ifdef HAVE_MPI_DOUBLE_COMPLEX for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= recvcount[ii]; INTdispls[ii]= displs[ii]; } return MPI_Gatherv( (void *) (Complex*)s, s.N(), MPI_DOUBLE_COMPLEX, (void *) (Complex*)r, INTrecvcount, INTdispls,MPI_DOUBLE_COMPLEX,root.who,root.comm); #else for(int ii=0; ii< recvcount.N(); ii++){ INTrecvcount[ii]= 2*recvcount[ii]; INTdispls[ii]= 2*displs[ii]; } return MPI_Gatherv( reinterpret_cast ( (Complex*) s), 2*s.N(), MPI_DOUBLE, reinterpret_cast ( (Complex*) r), INTrecvcount, INTdispls,MPI_DOUBLE,root.who,root.comm); #endif } // Fin Add J. Morice communication entre complexe MPIrank mpiwho(long i) { return MPIrank(i);} MPIrank mpiwho(long i,fMPI_Comm comm) { return MPIrank(i,comm,Syncro_block);} MPIrank mpiwho(fMPI_Comm comm,long i) { return MPIrank(i,comm,Syncro_block);} MPIrank mpiwhob(long i) { return MPIrank(i);} MPIrank mpiwhob(long i,fMPI_Comm comm) { return MPIrank(i,comm,Syncro_block);} MPIrank mpiwho_(const long &i,const fMPI_Comm &comm,fMPI_Request * const &rq) { return MPIrank(i,comm,*rq);} MPIrank mpiwho_(const long &i,fMPI_Request * const &rq) { return MPIrank(i, MPI_COMM_WORLD ,*rq);} long mpiWait(fMPI_Request * frq) { MPI_Request * rq= *frq; MPI_Status status; long res=MPI_SUCCESS; while(rq && *rq!=MPI_REQUEST_NULL) { res = MPI_Wait(rq,&status); DoOnWaitMPIRequest(rq); } return res; } long mpiBarrier(fMPI_Comm * comm) { return MPI_Barrier(*comm); } long mpiWaitAny(KN* rq) { MPI_Status status; int index; //cout << "mpiWaitAny " <N() << " in " << endl ; do { MPI_Waitany(rq->N(),*rq,&index,&status); DoOnWaitMPIRequest(&(*rq)[index]); } while( (MPI_UNDEFINED!= index) && ((*rq)[index]!=MPI_REQUEST_NULL)); //cout << "mpiWaitAny " <N() << " out " << index << endl ; return index; } MPIrank * set_copympi( MPIrank* const & a,const MPIrank & b){ *a=b;return a;} long mpiSize(fMPI_Comm cmm) { int s=0; // fMPI_Comm_rank(MPI_COMM_WORLD, &s); /* local */ if(cmm != (MPI_Comm) MPI_COMM_NULL) MPI_Comm_size(cmm, &s); /* local */ return s; } long mpiRank(fMPI_Comm cmm) { int s=MPI_UNDEFINED; if(cmm != (MPI_Comm)MPI_COMM_NULL) MPI_Comm_rank(cmm, &s); /* local */ // MPI_Comm_size(MPI_COMM_WORLD, &s); /* local */ return s; } AnyType InitializeGroup(Stack stack,const AnyType &x){ MPI_Group *g=*PGetAny(x); *g=MPI_GROUP_NULL; MPI_Comm_group(MPI_COMM_WORLD, g); return g; } AnyType DeleteGroup(Stack stack,const AnyType &x){ MPI_Group *g=*PGetAny(x); if(g && (*g != MPI_GROUP_NULL))MPI_Group_free(g); return Nothing; } AnyType InitializeComm(Stack stack,const AnyType &x){ MPI_Comm *comm= *PGetAny(x); *comm=MPI_COMM_NULL; MPI_Comm_dup(MPI_COMM_WORLD, comm); return comm; } AnyType DeleteComm(Stack stack,const AnyType &x){ MPI_Comm *comm= *PGetAny(x); if(comm && (*comm != MPI_COMM_NULL && *comm != MPI_COMM_WORLD))// add MPI_COMM_WORLD FH 11/2010 FH MPI_Comm_free(comm); return Nothing; } AnyType InitializeRequest(Stack stack,const AnyType &x){ MPI_Request *comm=*PGetAny(x); *comm=MPI_REQUEST_NULL; return comm; } AnyType DeleteRequest(Stack stack,const AnyType &x){ MPI_Request *comm=*PGetAny(x); if(comm && ( *comm!=MPI_REQUEST_NULL )) MPI_Request_free(comm); return Nothing; } // Hack to Bypass a bug in freefem FH ... template<> class ForEachType: public basicForEachType{public:// correction july 2009..... FH Hoooo.... (Il y a un bug DUR DUR FH ...) ForEachType(Function1 iv=0,Function1 id=0,Function1 OOnReturn=0):basicForEachType(typeid(MPI_Group),sizeof(MPI_Group),0,0,iv,id,OOnReturn) { } }; template<> class ForEachType: public basicForEachType{public:// coorection july 2009..... FH Hoooo.... (Il y a un bug DUR DUR FH ...) ForEachType(Function1 iv=0,Function1 id=0,Function1 OOnReturn=0):basicForEachType(typeid(fMPI_Comm),sizeof(fMPI_Comm),0,0,iv,id,OOnReturn) {} }; template<> class ForEachType: public basicForEachType{public:// correction july 2009..... FH Hoooo.... (Il y a un bug DUR DUR FH ...) ForEachType(Function1 iv=0,Function1 id=0,Function1 OOnReturn=0):basicForEachType(typeid(fMPI_Request),sizeof(fMPI_Request),0,0,iv,id,OOnReturn) {} }; // end Hack ... fMPI_Group* def_group( fMPI_Group* const & a,fMPI_Comm * const &comm, KN_ const & b) { MPI_Group group; MPI_Comm_group(*comm,& group); KN ranks(b); MPI_Group_incl(group, ranks.N(),(int *) ranks, *a); MPI_Group_free(&group) ; // ici def a .. // ffassert(0); // A AFAIRE // pour arete le programm return a;} fMPI_Group* def_group( fMPI_Group* const & a, KN_ const & b) { MPI_Group group; MPI_Comm comm=MPI_COMM_WORLD; MPI_Comm_group(comm,& group); KN ranks(b); MPI_Group_incl(group, ranks.N(),(int *) ranks, *a); MPI_Group_free(&group) ; // ici def a .. // ffassert(0); // A AFAIRE // pour arete le programm return a;} fMPI_Group* def_group( fMPI_Group* const & a,fMPI_Comm * const &comm) { MPI_Comm_group(*comm,*a); return a;} fMPI_Comm* def_comm( fMPI_Comm* const & a,fMPI_Group* const & g) { int ok=MPI_Comm_create(MPI_COMM_WORLD,*g,*a); return a; } fMPI_Comm* def_comm( fMPI_Comm* const & a,fMPI_Comm* const & b,fMPI_Group* const & g) { MPI_Comm_create(*b,*g,*a); return a; } fMPI_Group* def_group( fMPI_Group* const & a,fMPI_Group * const & group,KN_ const & b) { KN ranks(b); MPI_Group_incl(*group, ranks.N(), (int *) ranks, *a); // ici def a .. // ffassert(0); // A AFAIRE // pour arete le programm return a; } struct Def_def_Commsplit : public quad_function { static fMPI_Comm * f(Stack,fMPI_Comm* const & a,fMPI_Comm* const & comm,const long &color ,const long &key ) { MPI_Comm_split(*comm,color, key, *a); return a; } }; fMPI_Comm * mpiCommsplit(fMPI_Comm* const & a,const MPIrank &p1,const long &key ) { MPI_Comm_split(p1.comm, p1.who, key, *a); return a; } struct Def_def_Intercommcreate : public quad_function { static fMPI_Comm * f(Stack,fMPI_Comm* const & a, MPIrank const & p1, MPIrank const & p2, long const & tag ) { int err; err=MPI_Intercomm_create(p1.comm, p1.who, p2.comm,p2.who,tag, *a); return a; } }; fMPI_Comm * def_intercommmerge(fMPI_Comm* const & a,fMPI_Comm* const & b, const long & high) { MPI_Intercomm_merge(*b, high, *a); return a; } template AnyType ClearReturnpKK(Stack stack, const AnyType & a) { // a ne faire que pour les variables local au return... // pour l'instant on copie pour fqire mqrche // a repense FH mqi 2009.... KK * m = GetAny(a); // KN *cm=new KN(true, *m); bug quant KN est une variable global // KN *cm=new KN( *m); // on duplique le tableau comme en C++ (dur dur ?????? FH) m->increment(); Add2StackOfPtr2FreeRC(stack,m); if(verbosity>400) cout << "ClearReturnpKK:: increment + Add2StackOfPtr2FreeRC nb ref " << -m->next << endl; return m; } template AnyType ClearReturnpKK_(Stack stack, const AnyType & a) { // il faut faire un copie du tableau KK_ * m = GetAny(a); KK *cm=new KK(*m); Add2StackOfPtr2Free(stack,cm);// detruire la copie if(verbosity>400) cout << "ClearReturnpKK_:: copie Add2StackOfPtr2Free " << endl; return (KK_ *) cm; } template AnyType ClearReturnKK_(Stack stack, const AnyType & a) { // il faut faire un copie du tableau KK_ m = GetAny(a); KK *cm=new KK(m); Add2StackOfPtr2Free(stack,cm);// detruire la copie if(verbosity>400) cout << "ClearReturnKK_:: copie Add2StackOfPtr2Free " << endl; return SetAny(*cm); } //template fMPI_Request*,KN*,long fMPI_Request * get_elementp_( KN * const & a,const long & b){ if( a==0 || b<0 || a->N() <= b) { cerr << " Out of bound 0 <=" << b << " < " << a->N() << " KN * " << endl; ExecError("Out of bound in operator []");} return reinterpret_cast (&((*a)[b]));}// bofBof ... KN * set_init0( KN * const & a,const long & b) { a->init(b); for(int i=0;i class Quad_Op : public E_F0 { typedef typename T::result_type R; typedef typename T::first_argument_type A; typedef typename T::second_argument_type B; typedef typename T::third_argument_type C; typedef typename T::fourth_argument_type D; typedef typename T::result_type Result; Expression a,b,c,d; public: AnyType operator()(Stack s) const {return SetAny(static_cast(T::f(s, GetAny((*a)(s)) , GetAny((*b)(s)) , GetAny((*c)(s)), GetAny((*d)(s)) )));} Quad_Op(Expression aa,Expression bb,Expression cc,Expression dd) : a(aa),b(bb),c(cc),d(dd) {} bool MeshIndependent() const { return a->MeshIndependent() && b->MeshIndependent() && c->MeshIndependent() && d->MeshIndependent();} }; // Fin add J. Morice void f_end_parallele() { /// FFCS: MPI_Finalize() needs to be called later than this (in /// ffcs/src/server.cpp) ffapi::mpi_finalize(); if(mpirank==0 || verbosity>2) cout << "FreeFem++-mpi finalize correctly .\n" << flush ; else if(verbosity>5) cout << '.' << endl ; } void f_initparallele(int &argc, char **& argv) { /// FFCS: MPI_Init() needs to be called earlier (in ffcs/src/server.cpp) ffapi::mpi_init(argc,argv); int mpirank1,mpisize1; MPI_Comm_rank(MPI_COMM_WORLD, &mpirank1); /* local */ MPI_Comm_size(MPI_COMM_WORLD, &mpisize1); /* local */ mpirank = mpirank1;//MPI::COMM_WORLD.Get_rank(); mpisize =mpisize1;// MPI::COMM_WORLD.Get_size(); if(verbosity> 2 || (mpirank ==0)) cout << "initparallele rank " << mpirank << " on " << mpisize << endl; ff_atend(f_end_parallele); // set end MPI // } double ffMPI_Wtime() {return MPI_Wtime();} double ffMPI_Wtick() {return MPI_Wtick();} void f_init_lgparallele() { if(verbosity && mpirank == 0) cout << "parallelempi "; using namespace Fem2D; Dcl_TypeandPtr(0); Dcl_TypeandPtr(0,0,InitializeGroup,DeleteGroup); Dcl_TypeandPtr(0,0,InitializeComm,DeleteComm); Dcl_Type(); Dcl_TypeandPtr(0,0,InitializeRequest,DeleteRequest); // bof bof ... Dcl_TypeandPtr_ ,KN* > (0,0,0,::Destroy >, ::ClearReturnKK_,KN_ >, ::ClearReturnpKK >); zzzfff->Add("mpiGroup",atype()); zzzfff->Add("mpiComm",atype()); zzzfff->Add("mpiRequest",atype()); map_type_of_map[make_pair(atype(),atype())]=atype*>(); // vector map_type[typeid(MPIrank).name()]->AddCast(new E_F1_funcT(UnRef)); map_type[typeid(fMPI_Group).name()]->AddCast(new E_F1_funcT(UnRef)); map_type[typeid(fMPI_Comm).name()]->AddCast(new E_F1_funcT(UnRef)); map_type[typeid(bool).name()]->AddCast(new OneOperator1(toBool)); map_type[typeid(void*).name()]->AddCast(new OneOperator1(topVoid)); TheOperators->Add("<-", new OneOperator2_(&set_copympi)); // constructor example ... TheOperators->Add("<-", new OneOperator2_ >(&def_group), new OneOperator3_ >(&def_group), new OneOperator3_ >(&def_group), new OneOperator2_(&def_group)); /* fMPI_Comm * mpiCommsplit(fMPI_Comm* const & a,const MPIrank &p1,const long &rk ) fMPI_Comm * def_intercommmerge(fMPI_Comm* const & a,fMPI_Comm* const & b, const long & high) fMPI_Comm * def_Intercommcreate(fMPI_Comm* const & a, MPIrank const & p1, MPIrank const & p2, long const & tag ) quad_function */ TheOperators->Add("<-", new OneOperator2_(&def_comm), new OneOperator3_(&def_comm), new OneOperator3_(&mpiCommsplit), new OneOperator3_(&def_intercommmerge), new OneQuadOperator< Def_def_Intercommcreate, Quad_Op >, new OneQuadOperator< Def_def_Commsplit, Quad_Op > ); /* code edp int[int] procs=[1,2,3]; mpiGroup toto(procs); mpiComm comm(toto); */ Global.Add("processor","(",new OneOperator1(mpiwho)); Global.Add("processor","(",new OneOperator2(mpiwho)); Global.Add("processor","(",new OneOperator2(mpiwho)); Global.Add("processorblock","(",new OneOperator1(mpiwhob)); Global.Add("processorblock","(",new OneOperator2(mpiwhob)); TheOperators->Add(">>", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > , new OneBinaryOperator > > , new OneBinaryOperator > > , new OneBinaryOperator > > , new OneBinaryOperator > , new OneBinaryOperator > , new OneBinaryOperator > > , new OneBinaryOperator > > ); TheOperators->Add("<<", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > , new OneBinaryOperator * > > , new OneBinaryOperator * > > , new OneBinaryOperator * > > , new OneBinaryOperator > , new OneBinaryOperator > , new OneBinaryOperator * > > , new OneBinaryOperator* > > ); Global.Add("Send","(", new OneBinaryOperator >); Global.Add("Send","(", new OneBinaryOperator >); Global.Add("Send","(", new OneBinaryOperator >); Global.Add("Send","(", new OneBinaryOperator *> >); Global.Add("Send","(", new OneBinaryOperator *> >); Global.Add("Send","(", new OneBinaryOperator *> >); Global.Add("Send","(", new OneBinaryOperator >); Global.Add("Send","(", new OneBinaryOperator >); Global.Add("Send","(", new OneBinaryOperator *> >); Global.Add("Send","(", new OneBinaryOperator *> >); Global.Add("Isend","(", new OneBinaryOperator >); Global.Add("Isend","(", new OneBinaryOperator >); Global.Add("Isend","(", new OneBinaryOperator >); Global.Add("Isend","(", new OneBinaryOperator *> >); Global.Add("Isend","(", new OneBinaryOperator *> >); Global.Add("Isend","(", new OneBinaryOperator *> >); Global.Add("Isend","(", new OneBinaryOperator >); Global.Add("Isend","(", new OneBinaryOperator >); Global.Add("Isend","(", new OneBinaryOperator *> >); Global.Add("Isend","(", new OneBinaryOperator *> >); Global.Add("Recv","(", new OneBinaryOperator >); Global.Add("Recv","(", new OneBinaryOperator >); Global.Add("Recv","(", new OneBinaryOperator >); Global.Add("Recv","(", new OneBinaryOperator > >); Global.Add("Recv","(", new OneBinaryOperator > >); Global.Add("Recv","(", new OneBinaryOperator > >); Global.Add("Recv","(", new OneBinaryOperator >); Global.Add("Recv","(", new OneBinaryOperator >); Global.Add("Recv","(", new OneBinaryOperator > >); Global.Add("Recv","(", new OneBinaryOperator > >); Global.Add("Irecv","(", new OneBinaryOperator >); Global.Add("Irecv","(", new OneBinaryOperator >); Global.Add("Irecv","(", new OneBinaryOperator >); Global.Add("Irecv","(", new OneBinaryOperator > >); Global.Add("Irecv","(", new OneBinaryOperator > >); Global.Add("Irecv","(", new OneBinaryOperator > >); Global.Add("Irecv","(", new OneBinaryOperator >); Global.Add("Irecv","(", new OneBinaryOperator >); Global.Add("Irecv","(", new OneBinaryOperator > >); Global.Add("Irecv","(", new OneBinaryOperator > >); Global.Add("broadcast","(",new OneBinaryOperator >); Global.Add("broadcast","(",new OneBinaryOperator >); Global.Add("broadcast","(",new OneBinaryOperator >); Global.Add("broadcast","(",new OneBinaryOperator > >); Global.Add("broadcast","(",new OneBinaryOperator > >); Global.Add("broadcast","(",new OneBinaryOperator > >); Global.Add("broadcast","(",new OneBinaryOperator >); Global.Add("broadcast","(",new OneBinaryOperator >); Global.Add("broadcast","(",new OneBinaryOperator > >); Global.Add("broadcast","(",new OneBinaryOperator > >); Global.Add("mpiAlltoall","(",new OneBinaryOperator >); Global.Add("mpiAlltoall","(",new OneBinaryOperator >); Global.Add("mpiAllgather","(",new OneBinaryOperator >); Global.Add("mpiAllgather","(",new OneBinaryOperator >); Global.Add("mpiAlltoall","(",new OneTernaryOperator3 >); Global.Add("mpiAlltoall","(",new OneTernaryOperator3 >); Global.Add("mpiAllgather","(",new OneTernaryOperator3 >); Global.Add("mpiAllgather","(",new OneTernaryOperator3 >); Global.Add("mpiAllgather","(",new OneBinaryOperator >); // Add J. Morice Global.Add("mpiAllgather","(",new OneBinaryOperator >); // Add J. Morice Global.Add("mpiAllgather","(",new OneTernaryOperator3 >); // Add J. Morice Global.Add("mpiAllgather","(",new OneTernaryOperator3 >);// Add J. Morice Global.Add("mpiScatter","(",new OneTernaryOperator3 >); // Add J. Morice Global.Add("mpiScatter","(",new OneTernaryOperator3 >); // Add J. Morice Global.Add("mpiScatter","(",new OneTernaryOperator3 >); Global.Add("mpiScatter","(",new OneTernaryOperator3 >); Global.Add("mpiGather","(",new OneTernaryOperator3 >); // Add J. Morice Global.Add("mpiGather","(",new OneTernaryOperator3 >); // Add J. Morice Global.Add("mpiGather","(",new OneTernaryOperator3 >); // correction J. Morice Scatter --> Gather Global.Add("mpiGather","(",new OneTernaryOperator3 >); // Add J. Morice communication with vector of different size Global.Add("mpiAlltoallv","(",new OneOperator6_, KN_, KN_, KN_, KN_, KN_ >( Op_All2Allv ) ); Global.Add("mpiAlltoallv","(",new OneOperator6_, KN_, KN_, KN_, KN_, KN_ >( Op_All2Allv ) ); Global.Add("mpiAlltoallv","(",new OneOperator7_, KN_, fMPI_Comm, KN_, KN_, KN_, KN_ >( Op_All2All3v ) ); Global.Add("mpiAlltoallv","(",new OneOperator7_, KN_, fMPI_Comm, KN_, KN_, KN_, KN_ >( Op_All2All3v ) ); Global.Add("mpiAllgatherv","(",new OneQuadOperator, Quad_Op > > ); Global.Add("mpiAllgatherv","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllgatherv","(",new OneOperator5_, KN_, fMPI_Comm, KN_, KN_ >(Op_Allgatherv3< long >) ); Global.Add("mpiAllgatherv","(",new OneOperator5_, KN_, fMPI_Comm, KN_, KN_ >(Op_Allgatherv3< double >) ); Global.Add("mpiScatterv","(",new OneOperator5_, KN_, MPIrank, KN_, KN_ >(Op_Scatterv3< long >) ); Global.Add("mpiScatterv","(",new OneOperator5_, KN_, MPIrank, KN_, KN_ >(Op_Scatterv3< double >) ); Global.Add("mpiGatherv","(",new OneOperator5_, KN_, MPIrank, KN_, KN_ >( Op_Gatherv3< long > ) ); Global.Add("mpiGatherv","(",new OneOperator5_, KN_, MPIrank, KN_, KN_ >( Op_Gatherv3< double > ) ); // Fin Add J. Morice Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >); // add FH jan 2011 // Global.Add("mpiReduceScatter","(",new OneQuadOperator, Quad_Op > >); // Add J. Morice Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >); // add FH jan 2011 // Global.Add("mpiReduceScatter","(",new OneQuadOperator, Quad_Op > >); // fin Add J. Morice // Add J. Morice :: complex communication between processor Global.Add("mpiAlltoall","(",new OneBinaryOperator >); Global.Add("mpiAllgather","(",new OneBinaryOperator >); Global.Add("mpiAlltoall","(",new OneTernaryOperator3 >); Global.Add("mpiAllgather","(",new OneTernaryOperator3 >); Global.Add("mpiAllgather","(",new OneBinaryOperator >); Global.Add("mpiAllgather","(",new OneTernaryOperator3 >); Global.Add("mpiScatter","(",new OneTernaryOperator3 >); Global.Add("mpiGather","(",new OneTernaryOperator3 >); Global.Add("mpiScatter","(",new OneTernaryOperator3 >); Global.Add("mpiGather","(",new OneTernaryOperator3 >); // Add J. Morice communication with vector of different size Global.Add("mpiAlltoallv","(",new OneOperator6_, KN_, KN_, KN_, KN_, KN_ >( Op_All2Allv ) ); Global.Add("mpiAlltoallv","(",new OneOperator7_, KN_, fMPI_Comm, KN_, KN_, KN_, KN_ >( Op_All2All3v ) ); Global.Add("mpiAllgatherv","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllgatherv","(",new OneOperator5_, KN_, fMPI_Comm, KN_, KN_ >(Op_Allgatherv3< Complex >) ); Global.Add("mpiScatterv","(",new OneOperator5_, KN_, MPIrank, KN_, KN_ >(Op_Scatterv3< Complex >) ); Global.Add("mpiGatherv","(",new OneOperator5_, KN_, MPIrank, KN_, KN_ >( Op_Gatherv3< Complex > ) ); Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >);// add FH april 2011 Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >);// add FH april 2011 Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >);// add FH april 2011 Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >);// add FH april 2011 Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiReduce","(",new OneQuadOperator, Quad_Op > >); Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >); #ifdef HAVE_MPI_DOUBLE_COMPLEX Global.Add("mpiAllReduce","(",new OneQuadOperator, Quad_Op > >);// add FH jan 2011 #endif // Fin Add J. Morice :: complex communication between processor Global.New("mpirank",CConstant(mpirank)); Global.New("mpisize",CConstant(mpisize)); static long mpiUndefined=MPI_UNDEFINED, mpiAnySource = MPI_ANY_SOURCE,mpiAnyTag=MPI_ANY_TAG ; static fMPI_Comm fmpiWorld=MPI_COMM_WORLD; Global.New("mpiUndefined",CConstant(mpiUndefined)); Global.New("mpiAnySource",CConstant(mpiAnySource)); Global.New("mpiAnyTag",CConstant(mpiAnyTag)); Global.New("mpiCommWorld",CConstant(&fmpiWorld)); // add FH Global.Add("mpiWtime","(",new OneOperator0(ffMPI_Wtime)); Global.Add("mpiWtick","(",new OneOperator0(ffMPI_Wtick)); Global.Add("processor","(",new OneOperator3_(mpiwho_)); Global.Add("processor","(",new OneOperator2_(mpiwho_)); Global.Add("mpiWait","(",new OneOperator1(mpiWait)); Global.Add("mpiWaitAny","(",new OneOperator1*>(mpiWaitAny)); Global.Add("mpiSize","(",new OneOperator1(mpiSize)); Global.Add("mpiRank","(",new OneOperator1(mpiRank)); Global.Add("mpiBarrier","(",new OneOperator1(mpiBarrier)); static fMPI_Op op_max(MPI_MAX); static fMPI_Op op_min(MPI_MIN); static fMPI_Op op_sum(MPI_SUM); static fMPI_Op op_prod(MPI_PROD); static fMPI_Op op_land(MPI_LAND); static fMPI_Op op_lor(MPI_LOR); static fMPI_Op op_lxor(MPI_LXOR); static fMPI_Op op_band(MPI_BAND); static fMPI_Op op_bor(MPI_BOR); static fMPI_Op op_bxor(MPI_BXOR); static fMPI_Op op_maxloc(MPI_MAXLOC); static fMPI_Op op_minloc(MPI_MINLOC); Global.New("mpiMAX",CConstant(op_max)); Global.New("mpiMIN",CConstant(op_min)); Global.New("mpiSUM",CConstant(op_sum)); Global.New("mpiPROD",CConstant(op_prod)); Global.New("mpiLAND",CConstant(op_land)); Global.New("mpiLOR",CConstant(op_lor)); Global.New("mpiLXOR",CConstant(op_lxor)); Global.New("mpiBAND",CConstant(op_band)); Global.New("mpiBXOR",CConstant(op_bxor)); // sur des pair bof bof ... Global.New("mpiMAXLOC",CConstant(op_maxloc)); Global.New("mpiMINLOC",CConstant(op_minloc)); TheOperators->Add("<-", new OneOperator2_ *,KN *,long>(&set_init0) ); atype* >()->Add("[","",new OneOperator2_*,long >(get_elementp_)); } // set the 3 ptr extern void (*initparallele)(int &argc, char **& argv) ; extern void (*init_lgparallele)(); //extern void (*end_parallele)(); void init_ptr_parallelepmi(); void init_ptr_parallelepmi(){ initparallele=&f_initparallele ; init_lgparallele=&f_init_lgparallele; //end_parallele=&f_end_parallele; }; freefem++-3.38-1/src/medit/animat.c000644 000767 000024 00000013552 11406142256 017121 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" extern void resetLists(pScene ,pMesh ); static int getmesh(pMesh mesh,int range) { int k,ret; char *ptr,data[256]; static char base[256]; /* allocate mesh structure */ if ( ddebug ) fprintf(stdout,"getmesh: create mesh %d\n",range); if ( mesh->tria ) M_free(mesh->tria); if ( mesh->quad ) M_free(mesh->quad); if ( mesh->edge ) M_free(mesh->edge); if ( mesh->tetra ) M_free(mesh->tetra); if ( mesh->hexa ) M_free(mesh->hexa); if ( mesh->adja ) M_free(mesh->adja); if ( mesh->voy ) M_free(mesh->voy); if ( mesh->point ) M_free(mesh->point); if ( mesh->extra ) { if ( mesh->extra->iv ) M_free(mesh->extra->nv); if ( mesh->extra->it ) M_free(mesh->extra->nt); if ( mesh->extra->iq ) M_free(mesh->extra->nq); if ( mesh->extra->n ) M_free(mesh->extra->n); M_free(mesh->extra); mesh->extra = (void*)0; } if ( mesh->sol && mesh->nbb ) { if ( (mesh->dim==2 && mesh->nfield==3) || (mesh->dim==3 && mesh->nfield==6) ) for (k=1; k<=mesh->nbb; k++) free(mesh->sol[k].m); M_free(mesh->sol); mesh->sol = (void*)0; } mesh->point = (void*)0; mesh->tria = (void*)0; mesh->quad = (void*)0; mesh->edge = (void*)0; mesh->tetra = (void*)0; mesh->hexa = (void*)0; mesh->adja = (void*)0; mesh->voy = (void*)0; mesh->np = mesh->nt = mesh->nq = mesh->ne = 0; mesh->ntet = mesh->nhex = mesh->nbb = 0; if ( animdep == range ) { sprintf(data,".%d",range); ptr = (char *)strstr(mesh->name,data); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); } /* adjust file name */ sprintf(mesh->name,"%s.%d",base,range); if ( ddebug ) fprintf(stdout,"load %s\n",mesh->name); /* read mesh */ if ( quiet ) { fprintf(stdout," Loading %s \r",mesh->name); fflush(stdout); } mesh->typ = 0; ret = loadMesh(mesh); if ( ret < 1 ) { mesh->typ = 1; ret = inmsh2(mesh); if ( !ret ) { mesh->typ = 2; ret = loadGIS(mesh); if ( !ret ) return(0); } } if ( (mesh->ntet && !mesh->nt) || (mesh->nhex && !mesh->nq) ) meshSurf(mesh); meshBox(mesh,animdep==range); if ( !quiet ) meshInfo(mesh); /* read metric */ if ( !loadSol(mesh,mesh->name,1) ) bbfile(mesh); if ( !quiet && mesh->nbb ) fprintf(stdout," Solutions %8d\n",mesh->nbb); return(1); } int loadNextMesh(pMesh mesh,int k,int parse) { pScene sc; int is; if ( !getmesh(mesh,k) ) return(0); if ( ddebug ) printf("loadNextMesh: create %d window(s)\n",cv.nbs); /* compute mesh box */ is = currentScene(); if ( !cv.scene[is] ) { cv.scene[is] = (pScene)M_calloc(1,sizeof(Scene),"loadNextMesh.scene"); if ( !cv.scene[is] ) return(0); } sc = cv.scene[is]; if ( parse ) { parsop(sc,mesh); } setupPalette(sc,mesh); meshRef(sc,mesh); matSort(sc); return(1); } int playAnim(pScene sc,pMesh mesh,int deb,int fin) { int k; char *ptr,data[256],base[256]; /* get basename */ sprintf(data,".%d",deb); ptr = (char *)strstr(mesh->name,data); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); if ( saveimg ) { glDrawBuffer(GL_BACK_LEFT); } /* start animation */ for (k=deb; k<=fin; k++) { strcpy(mesh->name,base); resetLists(sc,mesh); if ( !loadNextMesh(mesh,k,0) ) return(0); doLists(sc,mesh); sc->glist = geomList(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,1); if ( !saveimg ) { sprintf(data,"Medit - [%s] #%d",mesh->name,sc->idwin); glutSetWindowTitle(data); } glClearColor(sc->par.back[0],sc->par.back[1],sc->par.back[2],sc->par.back[3]); if ( sc->type & S_SCISSOR ) scissorScene(); else redrawScene(); } fprintf(stdout,"\n Done.\n"); strcpy(mesh->name,base); if ( saveimg ) { glDrawBuffer(GL_FRONT | GL_BACK); if ( saveimg ) { sprintf(data,"Medit - [%s] #%d",mesh->name,sc->idwin); glutSetWindowTitle(data); } glutPostRedisplay(); saveimg = 0; } return(1); } int animParticle(pScene sc,pMesh mesh) { int cur; char *ptr,data[256],base[256]; /* get basename */ strcpy(base,mesh->name); ptr = (char *)strstr(base,"."); sscanf(ptr,".%d",&cur); cur++; if ( cur > animfin ) return(0); if ( ptr ) ptr[0] = '\0'; sprintf(data,"%s.%.3d",base,cur); strcpy(mesh->name,base); resetLists(sc,mesh); if ( !loadNextMesh(mesh,cur,1) ) return(0); doLists(sc,mesh); sc->glist = geomList(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,2); if ( !advectParticle(sc,mesh) ) return(0); return(1); } int animat() { pMesh mesh; pScene sc; char data[128],*name; /* default */ if ( ddebug ) printf("animat: read file(s)\n"); /* enter basename */ if ( !cv.nbm ) { fprintf(stdout," File name(s) missing. Please enter : "); fflush(stdout); fflush(stdin); fgets(data,120,stdin); if ( !strlen(data) ) { fprintf(stdout," ## Error\n"); return(0); } fprintf(stdout," Enter range [start,end] :"); fflush(stdout); fflush(stdin); fscanf(stdin,"%d %d",&animdep,&animfin); /* parse file name(s) */ name = strtok(data," \n"); while( name ) { if ( !cv.mesh[cv.nbm] ) { cv.mesh[cv.nbm] = (pMesh)M_calloc(1,sizeof(Mesh),"animat.mesh"); if ( !cv.mesh[cv.nbm] ) return(0); } /*(cv.mesh[cv.nbm])->name = calloc(strlen(name)+15,sizeof(char));*/ strcpy(cv.mesh[cv.nbm]->name,name); break; } if ( !cv.nbm ) return(0); } cv.nbs = cv.nbm; /* read initial mesh */ mesh = cv.mesh[0]; if ( !loadNextMesh(mesh,animdep,1) ) return(0); /* create grafix */ sc = cv.scene[0]; if ( !createScene(sc,0) ) { fprintf(stderr," ## Unable to create scene\n"); return(0); } quiet = 1; return(1); } freefem++-3.38-1/src/medit/bbfile.c000644 000767 000024 00000013746 11406142256 017100 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" int EatLine(FILE *in) { int k,c; k = 0; while ( (c=fgetc(in)) != EOF ) { k++; if ( c==10 || c== 13) return(1); } return(0); } int EatSpace(FILE *in) { int k,c,ret=0; k=0; while (isspace(c=fgetc(in)) ) { k++; if ( c==10 || c== 13 ) ret=1; } if ( c==EOF) return -1; /* fprintf(stdout,"EatSpace %d %d last char=%d\n",ret,k,c); */ ungetc(c,in); return ret; } int bbfile(pMesh mesh) { FILE *in; pSolution ps; double a,b,c,lambda[3],eigv[3][3],m[6],vp[2][2]; float dummy; int j,k,l,dim,np,nfield,nf,i1,i2,i3,i4,err,iord; char *ptr,data[128],tmp[128]; ubyte bigbb; /* default */ strcpy(tmp,mesh->name); ptr = (char *)strstr(tmp,".mesh"); if ( ptr ) *ptr = '\0'; sprintf(data,"%s.bb",tmp); in = fopen(data,"r"); bigbb = 0; if ( !in ) { sprintf(data,"%s.pbb",tmp); in = fopen(data,"r"); } if ( !in ) { bigbb = 1; sprintf(data,"%s.BB",tmp); in = fopen(data,"r"); if ( !in ) { /* hack FH pour le mac */ sprintf(data,"%s.gbb",tmp); in = fopen(data,"r"); } } if ( !in ) return(0); /* if ( !quiet ) fprintf(stdout," Reading %s\n",data); */ i1=i2=i3=i4=-1; /* read file format */ err=0; fscanf(in,"%d",&dim); if(EatSpace(in)) err++; fscanf(in,"%d",&i1); if(EatSpace(in)) err++; fscanf(in,"%d",&i2); if(EatSpace(in)) err++; fscanf(in,"%d",&i3); bigbb= (EatSpace(in)==0); /* not nl after the 4 integer => BB */ if ( !quiet ) if(bigbb) fprintf(stdout," Reading BB file %s\n",data); else fprintf(stdout," Reading bb file %s\n",data); if ( dim < 2 || dim > 3 || err ) { fprintf(stderr," %%%% Wrong file (dim=%d) (err=%d). Ignored\n",dim,err); return(0); } /* read number of field(s) */ nf = 0; if ( bigbb ) { /* get only 1st field */ /* fscanf(in,"%d",&nfield);*/ nfield=i1; /*fscanf(in,"%d",&mesh->nfield);*/ mesh->nfield = i2; if (nfield>1) { nf += i3; for (k=1; ktypage); printf(" np= %d, type= %d\n",np,mesh->typage); } else { /* fscanf(in,"%d",&mesh->nfield); fscanf(in,"%d",&np);*/ /* read file type */ /* fscanf(in,"%d",&mesh->typage);*/ mesh->nfield=i1; np=i2; mesh->typage=i3; } if ( mesh->typage == 2 ) { if ( np < mesh->np ) { fprintf(stderr," %%%% Wrong solution number (%d , %d). Ignored\n",np,mesh->np); fclose(in); return(0); } mesh->nbb = mesh->np; } else if ( mesh->typage == 1 ) { if ( np < mesh->ne ) { fprintf(stderr," %%%% Wrong solution number (%d , %d). Ignored\n",np,mesh->ne); fclose(in); return(0); } mesh->nbb = mesh->ne; } else { fprintf(stderr," %%%% Wrong typage (%d). Ignored\n",mesh->typage); fclose(in); return(0); } /* read solutions */ mesh->bbmin = 1.e10; mesh->bbmax = -1.e10; /* allocate memory */ if ( !zaldy2(mesh) ) { mesh->nbb = 0; fclose(in); return(0); } /* scalar field */ if ( mesh->nfield == 1 ) { if ( ddebug ) printf(" scalar (isotropic) field\n"); for (k=1; k<=mesh->nbb; k++) { ps = &mesh->sol[k]; ps->bb = 0.0; if ( fscanf(in,"%s",data) != 1 ) continue; if ( ptr = strpbrk(data,"dD") ) *ptr = 'E'; sscanf(data,"%f",&ps->bb); if ( ps->bb < mesh->bbmin ) mesh->bbmin = ps->bb; if ( ps->bb > mesh->bbmax ) mesh->bbmax = ps->bb; for (j=1; j<=nf; j++) fscanf(in,"%f",&dummy); } } /* vector field */ else if ( mesh->nfield == mesh->dim ) { if ( ddebug ) fprintf(stdout," vector field \n"); for (k=1; k<=mesh->nbb; k++) { ps = &mesh->sol[k]; ps->bb = 0.0; for (l=0; ldim; l++) { if ( fscanf(in,"%s",data) != 1 ) continue; if ( ptr = strpbrk(data,"dD") ) *ptr = 'E'; sscanf(data,"%f",&ps->m[l]); ps->bb += ps->m[l]*ps->m[l]; } ps->bb = sqrt(ps->bb); if ( ps->bb < mesh->bbmin ) mesh->bbmin = ps->bb; if ( ps->bb > mesh->bbmax ) mesh->bbmax = ps->bb; for (j=1; jnfield == 3 ) { if ( ddebug ) fprintf(stdout," 2D metric field\n"); for (k=1; k<=mesh->np; k++) { ps = &mesh->sol[k]; fscanf(in,"%lf %lf %lf",&a,&b,&c); ps->m[0] = a; ps->m[1] = b; ps->m[2] = c; m[0] = a; m[1] = b; m[2] = c; eigen2(m,lambda,vp); ps->bb = min(lambda[0],lambda[1]); if ( ps->bb < mesh->bbmin ) mesh->bbmin = ps->bb; if ( ps->bb > mesh->bbmax ) mesh->bbmax = ps->bb; for (j=1; jnfield == 6 ) { if ( ddebug ) fprintf(stdout," 3D metric field\n"); for (k=1; k<=mesh->np; k++) { ps = &mesh->sol[k]; ps->bb = 0.0f; for (l=0; l<6; l++) { if ( fscanf(in,"%s",data) != 1 ) continue; if ( ptr = strpbrk(data,"dD") ) *ptr = 'E'; sscanf(data,"%f",&dummy); m[l] = dummy; } ps->m[0] = m[0]; ps->m[1] = m[1]; ps->m[2] = m[3]; ps->m[3] = m[2]; ps->m[4] = m[4]; ps->m[5] = m[5]; m[2] = ps->m[2]; m[3] = ps->m[3]; iord = eigenv(1,m,lambda,eigv); if ( iord ) { ps->bb = lambda[0]; ps->bb = max(ps->bb,lambda[1]); ps->bb = max(ps->bb,lambda[2]); if ( ps->bb < mesh->bbmin ) mesh->bbmin = ps->bb; if ( ps->bb > mesh->bbmax ) mesh->bbmax = ps->bb; } else { fprintf(stdout," ## Eigenvalue problem.\n"); } for (j=1; jnbb = 0; } fclose(in); return(np); } freefem++-3.38-1/src/medit/camera.c000644 000767 000024 00000006532 11406142256 017100 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include "medit.h" #include "extern.h" #include "sproto.h" double Azimuth(pCamera c) { double dd,azim,cosazim,sinazim; dd = sqrt((double)c->speed[0]*c->speed[0]+(double)c->speed[2]*c->speed[2]); cosazim = c->speed[2] / dd; sinazim = c->speed[0] / dd; azim = atan2(sinazim,cosazim) * RTOD; return(azim); } double Elevation(pCamera c) { double elev; elev = sqrt((double)c->speed[0]*c->speed[0]+(double)c->speed[2]*c->speed[2]); elev = atan2(c->speed[1],elev) * RTOD; return(elev); } /* compute new sun position */ void updateSun(pScene sc,pCamera c) { double dd; GLfloat axe[3],sunf[4]; GLdouble speed[3],sunp[4],matrix[16]; axe[0] = c->speed[2]; axe[1] = 0.0f; axe[2] = -c->speed[0]; dd = sqrt(axe[0]*axe[0] + axe[2]*axe[2]); if ( dd != 0.0f ) { axe[0] /= dd; axe[2] /= dd; } speed[0] = c->speed[0]; speed[1] = c->speed[1]; speed[2] = c->speed[2]; glPushMatrix(); glLoadIdentity(); glRotatef(-30.0f,axe[0],axe[1],axe[2]); glGetDoublev(GL_MODELVIEW_MATRIX,matrix); glPopMatrix(); transformPointd(sunp,speed,matrix); sunf[0] = -sc->dmax*sunp[0]; sunf[1] = -sc->dmax*sunp[1]; sunf[2] = -sc->dmax*sunp[2]; sunf[3] = 0.0; glLightfv(GL_LIGHT0,GL_POSITION,sunf); if ( ddebug ) { printf(" speed %g %g %g\n",c->speed[0],c->speed[1],c->speed[2]); printf(" axe %g %g %g\n",axe[0],axe[1],axe[2]); printf(" sunpos %g %g %g\n",sunp[0],sunp[1],sunp[2]); } } void updateCamera(pScene sc,pCamera c,double azim,double elev) { double d,lazim,lelev; /* compute speed vector */ if ( elev > 89.0f ) elev = 89.0; else if ( elev < -89.0f ) elev = -89.0; lazim = azim * DTOR; lelev = elev * DTOR; c->speed[0] = sin(lazim)*cos(lelev); c->speed[1] = sin(lelev); c->speed[2] = cos(lazim)*cos(lelev); d = (double)c->speed[0]*sc->par.sunpos[0] + c->speed[1]*sc->par.sunpos[1] + c->speed[2]*sc->par.sunpos[2]; d = d / sqrt((double)sc->par.sunpos[0]*sc->par.sunpos[0]+ sc->par.sunpos[1]*sc->par.sunpos[1]+ sc->par.sunpos[2]*sc->par.sunpos[2]); d = acos(d); if ( fabs(d) > 0.10*sc->persp->fovy*DTOR ) updateSun(sc,c); } pCamera initCamera(pScene sc,int up) { pCamera c; pMesh mesh; double dd; double look[3]; if ( ddebug ) printf(" initCamera dmax %g\n",sc->dmax); if ( sc->camera ) c = sc->camera; else { c = (pCamera)M_calloc(1,sizeof(struct camera),"camera"); if ( !c ) { printf(" ## unable to allocate memory / camera\n"); exit(1); } } /* adjust coeffs */ mesh = cv.mesh[sc->idmesh]; c->eye[0] = c->eye[1] = 0.0; c->eye[2] = sc->dmax; c->vecup = up; c->speed[0] = 0.0; c->speed[1] = 0.0; c->speed[2] = c->eye[2]; dd = -1.0 / sqrt(c->speed[2]*c->speed[2]); c->speed[2] *= dd; c->spmod = 0.01*sc->dmax; c->altinc = 0.01*(mesh->ymax-mesh->ymin); /* set sun position */ updateSun(sc,c); if ( ddebug ) { look[0] = c->eye[0] + sc->dmax*c->speed[0]; look[1] = c->eye[1] + sc->dmax*c->speed[1]; look[2] = c->eye[2] + sc->dmax*c->speed[2]; printf(" eye %g %g %g\n",c->eye[0],c->eye[1],c->eye[2]); printf(" speed %g %g %g\n",c->speed[0],c->speed[1],c->speed[2]); printf(" look %g %g %g\n",look[0],look[1],look[2]); } return(c); } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/cenrad.c000644 000767 000024 00000004122 11406142256 017075 0ustar00hechtstaff000000 000000 #include #include #include #include "medit.h" #include "extern.h" #include "sproto.h" /* compute circumradius and center */ int cenrad(pMesh mesh,int iel,double *c,double *rad) { pTetra pt; pPoint p1,p2,p3,p4; double dd,ux,uy,uz,n1[3],n2[3],n3[3],c1,c2,c3,pl1,pl2,pl3; pt = &mesh->tetra[iel]; if ( !pt->v[0] ) return(0); p1 = &mesh->point[pt->v[0]]; p2 = &mesh->point[pt->v[1]]; p3 = &mesh->point[pt->v[2]]; p4 = &mesh->point[pt->v[3]]; ux = p4->c[0] - p1->c[0]; uy = p4->c[1] - p1->c[1]; uz = p4->c[2] - p1->c[2]; dd = 1.0 / sqrt(ux*ux + uy*uy + uz*uz); n1[0] = ux*dd; n1[1] = uy*dd; n1[2] = uz*dd; /* plan: vecteur directeur passant par milieu(1,4) */ pl1 = n1[0]*(p4->c[0]+p1->c[0]) \ + n1[1]*(p4->c[1]+p1->c[1]) + n1[2]*(p4->c[2]+p1->c[2]); ux = p4->c[0] - p2->c[0]; uy = p4->c[1] - p2->c[1]; uz = p4->c[2] - p2->c[2]; dd = 1.0 / sqrt(ux*ux + uy*uy + uz*uz); n2[0] = ux*dd; n2[1] = uy*dd; n2[2] = uz*dd; pl2 = n2[0]*(p4->c[0]+p2->c[0]) \ + n2[1]*(p4->c[1]+p2->c[1]) + n2[2]*(p4->c[2]+p2->c[2]); ux = p4->c[0] - p3->c[0]; uy = p4->c[1] - p3->c[1]; uz = p4->c[2] - p3->c[2]; dd = 1.0 / sqrt(ux*ux + uy*uy + uz*uz); n3[0] = ux*dd; n3[1] = uy*dd; n3[2] = uz*dd; pl3 = n3[0]*(p4->c[0]+p3->c[0]) \ + n3[1]*(p4->c[1]+p3->c[1]) + n3[2]*(p4->c[2]+p3->c[2]); /* center = intersection of 3 planes */ ux = n2[1]*n3[2] - n2[2]*n3[1]; uy = n1[2]*n3[1] - n1[1]*n3[2]; uz = n1[1]*n2[2] - n1[2]*n2[1]; dd = n1[0]*ux + n2[0]*uy + n3[0]*uz; dd = 0.5 / dd; c1 = ux*pl1 + uy*pl2 + uz*pl3; c2 = pl1 * (n2[2]*n3[0] - n2[0]*n3[2]) \ + pl2 * (n1[0]*n3[2] - n3[0]*n1[2]) \ + pl3 * (n2[0]*n1[2] - n2[2]*n1[0]); c3 = pl1 * (n2[0]*n3[1] - n2[1]*n3[0]) \ + pl2 * (n3[0]*n1[1] - n3[1]*n1[0]) \ + pl3 * (n1[0]*n2[1] - n2[0]*n1[1]); c[0] = dd * c1; c[1] = dd * c2; c[2] = dd * c3; /* radius (squared) */ *rad = (c[0] - p4->c[0]) * (c[0] - p4->c[0]) \ + (c[1] - p4->c[1]) * (c[1] - p4->c[1]) \ + (c[2] - p4->c[2]) * (c[2] - p4->c[2]); return(1); } freefem++-3.38-1/src/medit/chrono.h000644 000767 000024 00000000713 11406142256 017140 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include #ifndef ON #define RESET 0 #define ON 1 #define OFF 2 #endif #define TIMEMAX 16 #define MAXCLK ( 1073741823. / (double)CLOCKS_PER_SEC ) typedef struct mytime { double ctim,dtim; time_t ptim; short call; } mytime; /* prototypes */ void chrono(int cmode,mytime *ptt); double gttime(mytime t); void tminit(mytime *t,int maxtim); #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/clip.c000644 000767 000024 00000022175 11406142256 016600 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" static pClip cclip = 0; static ubyte curclip = 0; static GLfloat plane[4] = {-1.0, 0.0, 0.0, 0.0}; static void drawCap(pScene sc,pClip clip,GLboolean docap) { if ( !docap ) { if ( clip->active & C_EDIT ) glColor3f(1.0,0.0,1.0); else if ( clip->active & C_FREEZE ) glColor3f(0.0,0.6,0.9); else glColor3f(0.0,1.0,0.0); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(3.); glBegin(GL_QUADS); glVertex3f(0.,-1.,-1.); glVertex3f(0., 1.,-1.); glVertex3f(0., 1.,1.); glVertex3f(0.,-1.,1.); glEnd(); glLineWidth(1.); glColor3f(1.,0.7,0.); glBegin(GL_LINES); glVertex3f(0.,0.,-1.); glVertex3f(0.,0.,1.); glColor3f(1.,0.7,0.); glVertex3f(0.,-1.,0.); glVertex3f(0.,1.,0.); glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); } else { glDisable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glColor4fv(sc->material[DEFAULT_MAT].dif); glRecti(-100,-100,100,100); } } /* display clipping plane */ void updateClip(pClip clip,pMesh mesh) { pScene sc; pTransform cliptr,view; GLfloat dd,dmax,inv[16],axis[4],trans[4],matrix[16]; int idw; /* default */ if ( ddebug ) printf("updateClip\n"); /* retrieve context */ idw = currentScene(); sc = cv.scene[idw]; view = sc->view; cliptr = clip->cliptr; /* compute clip transform */ if ( clip->active & C_EDIT ) { invertMatrix(view->matrix,inv); inv[3] = inv[7] = inv[11] = 0.0; inv[15] = 1.0; /* rotation cumulative */ if ( cliptr->angle != 0.0 ) { transformVector(trans,cliptr->axis,inv); glPushMatrix(); glLoadIdentity(); glRotatef(cliptr->angle,trans[0],trans[1],trans[2]); glMultMatrixf(cliptr->rot); glGetFloatv(GL_MODELVIEW_MATRIX,cliptr->rot); glPopMatrix(); } /* translation cumulative */ axis[0] = cliptr->panx; axis[1] = cliptr->pany; axis[2] = 0.0; axis[3] = 1.0; if ( cliptr->manim == GL_FALSE ) cliptr->panx = cliptr->pany = 0.0; transformVector(trans,axis,inv); dd = trans[0]*clip->eqn[0]+trans[1]*clip->eqn[1]+trans[2]*clip->eqn[2]; trans[0] = dd*clip->eqn[0]; trans[1] = dd*clip->eqn[1]; trans[2] = dd*clip->eqn[2]; cliptr->tra[12] += trans[0]; cliptr->tra[13] += trans[1]; cliptr->tra[14] += trans[2]; /* truncation */ dmax = mesh->xmax - mesh->xmin; dmax = max(dmax,mesh->ymax - mesh->ymin); dmax = max(dmax,mesh->zmax - mesh->zmin) / 1.8; if ( fabs(cliptr->tra[12]) > dmax || fabs(cliptr->tra[13]) > dmax || fabs(cliptr->tra[14]) > dmax ) { if ( cliptr->manim == GL_TRUE ) { cliptr->panx = -cliptr->panx; cliptr->pany = -cliptr->pany; } else { cliptr->tra[12] = max(-dmax,min(dmax,cliptr->tra[12])); cliptr->tra[13] = max(-dmax,min(dmax,cliptr->tra[13])); cliptr->tra[14] = max(-dmax,min(dmax,cliptr->tra[14])); } } /* final transformation */ glPushMatrix(); glLoadIdentity(); glMultMatrixf(cliptr->tra); glMultMatrixf(cliptr->rot); glGetFloatv(GL_MODELVIEW_MATRIX,cliptr->matrix); glPopMatrix(); /* compute plane equation */ invertMatrix(cliptr->matrix,inv); transformPoint(clip->eqn,plane,inv); if ( clip->active & C_REDO ) clipVertices(mesh,sc,clip); /* clip->active |= C_REDO;*/ } else if ( clip->active & C_FREEZE ) { glPushMatrix(); glLoadMatrixf(view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); glGetFloatv(GL_MODELVIEW_MATRIX,matrix); glPopMatrix(); invertMatrix(matrix,inv); inv[3] = inv[7] = inv[11] = 0.0; inv[15] = 1.0; glPushMatrix(); glLoadMatrixf(inv); glMultMatrixf(view->oldmat); glTranslatef(sc->cx,sc->cy,sc->cz); glMultMatrixf(cliptr->matrix); glGetFloatv(GL_MODELVIEW_MATRIX,cliptr->matrix); glPopMatrix(); /* compute plane equation */ invertMatrix(cliptr->matrix,inv); transformPoint(clip->eqn,plane,inv); clip->active |= C_REDO; } if ( !cliptr->manim ) { cliptr->angle = 0.0; clip->active ^= C_UPDATE; } } void clipVertices(pMesh mesh,pScene sc,pClip clip) { pTetra pt; pHexa ph; pPoint p0; double dd1,zero; int k,l,nbpos,nbneg,nbnul; /* check points in plane */ zero = sc->dmax*1.e-13; for (k=1; k<=mesh->np; k++) { p0 = &mesh->point[k]; if ( p0->tag & M_UNUSED ) continue; dd1 = p0->c[0]*clip->eqn[0] + p0->c[1]*clip->eqn[1] \ + p0->c[2]*clip->eqn[2] + clip->eqn[3]; if ( dd1 > zero ) p0->clip = 2; else if ( dd1 < zero ) p0->clip = 1; else p0->clip = 0; } /* update tetrahedra */ for (k=1; k<=mesh->ntet; k++) { pt = &mesh->tetra[k]; pt->clip = 0; nbpos = nbneg = nbnul = 0; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; if ( p0->clip == 2 ) nbpos++; else if ( p0->clip == 1 ) nbneg++; else nbnul++; } if ( nbpos && nbpos+nbnul < 4 ) pt->clip = 1; } /* update hexahedra */ for (k=1; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; ph->clip = 0; nbpos = nbneg = nbnul = 0; for (l=0; l<8; l++) { p0 = &mesh->point[ph->v[l]]; if ( p0->clip == 2 ) nbpos++; else if ( p0->clip == 1 ) nbneg++; else nbnul++; } if ( nbpos && nbpos+nbnul < 8 ) ph->clip = 1; } } void drawClip(pScene sc,pClip clip,pMesh mesh,GLboolean docap) { pTransform cliptr,view; GLfloat scale; /* default */ if ( ddebug ) printf("drawClip\n"); view = sc->view; cliptr = clip->cliptr; if ( clip->active & C_UPDATE ) updateClip(clip,mesh); if ( clip->active & C_REDO ) { if ( !animate ) glutSetCursor(GLUT_CURSOR_WAIT); /* update clip plane */ clipVertices(mesh,sc,clip); /* build display lists */ if ( clip->active & C_VOL ) { if ( sc->clist[LTets] ) glDeleteLists(sc->clist[LTets],1); if ( sc->clist[LHexa] ) glDeleteLists(sc->clist[LHexa],1); if ( sc->cmlist[LTets] ) glDeleteLists(sc->cmlist[LTets],1); if ( sc->cmlist[LHexa] ) glDeleteLists(sc->cmlist[LHexa],1); sc->clist[LTets] = sc->cmlist[LTets] = (GLuint)0; sc->clist[LHexa] = sc->cmlist[LHexa] = (GLuint)0; if ( clip->active & C_CAP ) { sc->clist[LTets] = capTetra(mesh); if ( sc->mode & S_MAP ) sc->cmlist[LTets] = capTetraMap(mesh); else if ( sc->isotyp & S_ISOLINE ) sc->ilist[LTets] = capTetraIso(mesh); } else { sc->clist[LTets] = listTetra(sc,mesh,1); sc->clist[LHexa] = listHexa(sc,mesh,1); if ( sc->mode & S_MAP ) { sc->cmlist[LTets] = listTetraMap(sc,mesh,1); sc->cmlist[LHexa] = listHexaMap(sc,mesh,1); } } if ( !animate ) clip->active ^= C_REDO; } else clip->active ^= C_REDO; if ( sc->isotyp & S_VECTOR ) { if ( sc->vlist[LTets] ) glDeleteLists(sc->vlist[LTets],1); sc->vlist[LTets] = listClipTetraVector(mesh); if ( sc->vlist[LHexa] ) glDeleteLists(sc->vlist[LHexa],1); sc->vlist[LHexa] = listClipHexaVector(mesh); } if ( !animate ) glutSetCursor(GLUT_CURSOR_INHERIT); } /* display plane frame */ if ( clip->active & C_HIDE ) return; glPushMatrix(); glMultMatrixf(cliptr->matrix); scale = 0.3*(sc->dmax+sc->dmin); glScalef(scale,scale,scale); drawCap(sc,clip,docap); glPopMatrix(); } void copyClip(pClip clip) { if ( !cclip ) { cclip = (pClip)M_calloc(1,sizeof(struct clip),"clip"); if ( !clip ) exit(2); } cclip = (pClip)memcpy(cclip,clip,sizeof(struct clip)); if ( !cclip ) exit(2); curclip = 1; } int pasteClip(pClip clip) { if ( !curclip ) return(0); clip = (pClip)memcpy(clip,cclip,sizeof(struct clip)); if ( !clip ) exit(2); clip->active = 0; curclip = 0; return(1); } void tiltClip(pScene sc,pClip clip) { float axis[4]; axis[0] = clip->cliptr->axis[0]; axis[1] = clip->cliptr->axis[1]; axis[2] = clip->cliptr->axis[2]; transformVector(clip->cliptr->axis,axis,sc->view->matrix); /*clip->cliptr->angle = 90.0;*/ clip->active |= C_REDO; } /* change clip orientation */ void invertClip(pScene sc,pClip clip) { clip->eqn[0] = -clip->eqn[0]; clip->eqn[1] = -clip->eqn[1]; clip->eqn[2] = -clip->eqn[2]; clip->eqn[3] = -clip->eqn[3]; plane[0] = -plane[0]; } void resetClip(pScene sc,pClip clip,pMesh mesh) { double dd; resetTransform(clip->cliptr); dd = sc->par.clip[0]*sc->par.clip[3] + sc->par.clip[1]*sc->par.clip[4] \ + sc->par.clip[2]*sc->par.clip[5]; clip->active |= C_REDO; clip->eqn[0] = sc->par.clip[3]; clip->eqn[1] = sc->par.clip[4]; clip->eqn[2] = sc->par.clip[5]; clip->eqn[3] = -dd; /*clip->active = C_ON + C_VOL;*/ } /* create a clipping plane */ pClip createClip(pScene sc,pMesh mesh) { pClip clip; /* default */ clip = (pClip)M_calloc(1,sizeof(struct clip),"clip"); assert(clip); clip->cliptr = (pTransform)M_calloc(1,sizeof(struct transform),"clip"); assert(clip->cliptr); resetClip(sc,clip,mesh); return(clip); } freefem++-3.38-1/src/medit/clipvol.c000644 000767 000024 00000035410 11406142256 017315 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define NBCOL 9 /* build list for capping */ GLuint capTetra(pMesh mesh) { pScene sc; pClip clip; GLuint dlist = 0; pTetra pt; pPoint p0,p1; pMaterial pm; double dd1[6],d,ax,ay,az,bx,by,bz; double cx[4],cy[4],cz[4],cc; float n[3]; int m,k,k1,k2,l,transp,pos[6],neg[6],nbpos,nbneg,nbnul; static int tn[4] = {0,0,1,1}; static int tp[4] = {0,1,1,0}; /* default */ if (!mesh->ntet ) return(0); if ( ddebug ) printf("create capping list / TETRA\n"); /* build display list */ sc = cv.scene[currentScene()]; clip = sc->clip; dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; transp = 0; if ( !(sc->mode & S_MATERIAL) ) pm = &sc->material[DEFAULT_MAT+1]; /* check transparency */ transp = pm->amb[3] < 0.999 || pm->dif[3] < 0.999 || pm->spe[3] < 0.999; if ( transp ) { glDepthMask(GL_FALSE); glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); } glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pm->dif); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pm->amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pm->spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pm->emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&pm->shininess); while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] || !pt->clip ) { k = pt->nxt; continue; } nbpos = nbneg = nbnul = 0; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; if ( p0->clip == 2 ) pos[nbpos++] = l; else if (p0->clip == 1 ) neg[nbneg++] = l; else nbnul++; dd1[l] = p0->c[0]*clip->eqn[0] + p0->c[1]*clip->eqn[1] \ + p0->c[2]*clip->eqn[2] + clip->eqn[3]; } if ( nbneg == 2 && nbpos == 2 ) { /* display quadrilateral */ for (l=0; l<4; l++) { k1 = neg[tn[l]]; k2 = pos[tp[l]]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; cc = 1.0f; if ( dd1[k2]-dd1[k1] != 0.0f ) cc = fabs(dd1[k1] / (dd1[k2]-dd1[k1])); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); } /* compute face normal */ ax = cx[1]-cx[0]; ay = cy[1]-cy[0]; az = cz[1]-cz[0]; bx = cx[2]-cx[0]; by = cy[2]-cy[0]; bz = cz[2]-cz[0]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glBegin(GL_QUADS); glNormal3fv(n); glVertex3f(cx[0],cy[0],cz[0]); glVertex3f(cx[1],cy[1],cz[1]); glVertex3f(cx[2],cy[2],cz[2]); glVertex3f(cx[3],cy[3],cz[3]); glEnd(); } else { /* display triangle */ for (l=0; l<3; l++) { k1 = nbneg == 3 ? neg[l] : pos[l]; k2 = nbneg == 3 ? pos[0] : neg[0]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; cc = fabs(dd1[k1] / (dd1[k2]-dd1[k1])); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); } /* compute face normal */ ax = cx[1]-cx[0]; ay = cy[1]-cy[0]; az = cz[1]-cz[0]; bx = cx[2]-cx[0]; by = cy[2]-cy[0]; bz = cz[2]-cz[0]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glBegin(GL_TRIANGLES); glNormal3fv(n); glVertex3f(cx[0],cy[0],cz[0]); glVertex3f(cx[1],cy[1],cz[1]); glVertex3f(cx[2],cy[2],cz[2]); glEnd(); } k = pt->nxt; } if ( transp ) { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } } glEndList(); return(dlist); } /* build list for capping map */ GLuint capTetraMap(pMesh mesh) { pScene sc; pClip clip; GLuint dlist = 0; pTetra pt; pPoint p0,p1; pMaterial pm; pSolution ps0,ps1; double dd1[6],d,ax,ay,az,bx,by,bz; double cx[4],cy[4],cz[4],cc; float n[3],sol[4]; int m,k,k1,k2,l,pos[6],neg[6],nbpos,nbneg,nbnul; static int tn[4] = {0,0,1,1}; static int tp[4] = {0,1,1,0}; triangle t1,t2; /* default */ if ( !mesh->ntet || !mesh->nbb ) return(0); if ( ddebug ) printf("create capping map list / TETRA\n"); sc = cv.scene[currentScene()]; if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ clip = sc->clip; dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ glBegin(GL_TRIANGLES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] || !pt->clip ) { k = pt->nxt; continue; } nbpos = nbneg = nbnul = 0; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; if ( p0->clip == 2 ) pos[nbpos++] = l; else if (p0->clip == 1 ) neg[nbneg++] = l; else nbnul++; dd1[l] = p0->c[0]*clip->eqn[0] + p0->c[1]*clip->eqn[1] \ + p0->c[2]*clip->eqn[2] + clip->eqn[3]; } if ( nbneg == 2 && nbpos == 2 ) { /* display quadrilateral */ for (l=0; l<4; l++) { k1 = neg[tn[l]]; k2 = pos[tp[l]]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; cc = 1.0f; if ( dd1[k2]-dd1[k1] != 0.0f ) cc = fabs(dd1[k1] / (dd1[k2]-dd1[k1])); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); if ( mesh->typage == 2 ) { ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; sol[l] = ps0->bb+cc*(ps1->bb-ps0->bb); } else { ps0 = &mesh->sol[k]; sol[l] = ps0->bb; } } /* compute face normal */ ax = cx[1]-cx[0]; ay = cy[1]-cy[0]; az = cz[1]-cz[0]; bx = cx[2]-cx[0]; by = cy[2]-cy[0]; bz = cz[2]-cz[0]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } /* store triangles */ t1.a[0] = t2.a[0] = cx[0]; t1.a[1] = t2.a[1] = cy[0]; t1.a[2] = t2.a[2] = cz[0]; t1.b[0] = cx[1]; t1.b[1] = cy[1]; t1.b[2] = cz[1]; t1.c[0] = t2.b[0] = cx[2]; t1.c[1] = t2.b[1] = cy[2]; t1.c[2] = t2.b[2] = cz[2]; t2.c[0] = cx[3]; t2.c[1] = cy[3]; t2.c[2] = cz[3]; /* store normals */ memcpy(t1.na,n,3*sizeof(float)); memcpy(t1.nb,n,3*sizeof(float)); memcpy(t1.nc,n,3*sizeof(float)); memcpy(t2.na,n,3*sizeof(float)); memcpy(t2.nb,n,3*sizeof(float)); memcpy(t2.nc,n,3*sizeof(float)); /* store solutions */ t1.va = t2.va = sol[0]; t1.vb = sol[1]; t1.vc = t2.vb = sol[2]; t2.vc = sol[3]; /* color interpolation */ cutTriangle(sc,t1); cutTriangle(sc,t2); } else { /* display triangle */ for (l=0; l<3; l++) { k1 = nbneg == 3 ? neg[l] : pos[l]; k2 = nbneg == 3 ? pos[0] : neg[0]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; cc = fabs(dd1[k1] / (dd1[k2]-dd1[k1])); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); if ( mesh->typage == 2 ) { ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; sol[l] = ps0->bb+cc*(ps1->bb-ps0->bb); } else { ps0 = &mesh->sol[k]; sol[l] = ps0->bb; } } /* compute face normal */ ax = cx[1]-cx[0]; ay = cy[1]-cy[0]; az = cz[1]-cz[0]; bx = cx[2]-cx[0]; by = cy[2]-cy[0]; bz = cz[2]-cz[0]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } /* store triangle */ t1.a[0] = cx[0]; t1.a[1] = cy[0]; t1.a[2] = cz[0]; t1.b[0] = cx[1]; t1.b[1] = cy[1]; t1.b[2] = cz[1]; t1.c[0] = cx[2]; t1.c[1] = cy[2]; t1.c[2] = cz[2]; /* store normal */ memcpy(t1.na,n,3*sizeof(float)); memcpy(t1.nb,n,3*sizeof(float)); memcpy(t1.nc,n,3*sizeof(float)); /* store solutions */ t1.va = sol[0]; t1.vb = sol[1]; t1.vc = sol[2]; /* color interpolation */ cutTriangle(sc,t1); } k = pt->nxt; } } glEnd(); glEndList(); return(dlist); } /* build list for capping isolines */ GLuint capTetraIso(pMesh mesh) { pScene sc; pClip clip; GLuint dlist = 0; pTetra pt; pPoint p0,p1; pMaterial pm; pSolution ps0,ps1; double dd1[6]; double rgb[3],cx[4],cy[4],cz[4],ccx,ccy,ccz,cc; float iso,kc,sol[4]; int i,m,k,k1,k2,l,l1,nc,pos[6],neg[6],nbpos,nbneg,nbnul,ncol; static int tn[4] = {0,0,1,1}; static int tp[4] = {0,1,1,0}; static double hsv[3] = { 0.0f, 1.0f, 0.20f }; static int idirt[5] = {0,1,2,0,1}; static int idirq[6] = {0,1,2,3,0,1}; /* default */ if ( !mesh->ntet || !mesh->nbb || mesh->typage == 1 ) return(0); if ( ddebug ) printf("create capping iso list / TETRA\n"); sc = cv.scene[currentScene()]; if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ clip = sc->clip; if ( !(clip->active & C_ON) ) return(0); dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ glBegin(GL_LINES); ncol = NBCOL; for (i=0; i<=ncol*(MAXISO-1); i++) { if ( i < ncol*(MAXISO-1) ) { l = i / ncol; kc = (i % ncol) / (float)ncol; iso = sc->iso.val[l]*(1.0-kc)+sc->iso.val[l+1]*kc; hsv[0] = sc->iso.col[l]*(1.0-kc)+sc->iso.col[l+1]*kc; } else { iso = sc->iso.val[MAXISO-1]; hsv[0] = sc->iso.col[MAXISO-1]; } hsvrgb(hsv,rgb); glColor3dv(rgb); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] || !pt->clip ) { k = pt->nxt; continue; } nbpos = nbneg = nbnul = 0; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; if ( p0->clip == 2 ) pos[nbpos++] = l; else if (p0->clip == 1 ) neg[nbneg++] = l; else nbnul++; dd1[l] = p0->c[0]*clip->eqn[0] + p0->c[1]*clip->eqn[1] \ + p0->c[2]*clip->eqn[2] + clip->eqn[3]; } if ( nbneg == 2 && nbpos == 2 ) { /* analyze quadrilateral */ for (l=0; l<4; l++) { k1 = neg[tn[l]]; k2 = pos[tp[l]]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; cc = 1.0f; if ( dd1[k2]-dd1[k1] != 0.0f ) cc = fabs(dd1[k1] / (dd1[k2]-dd1[k1])); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; sol[l] = ps0->bb+cc*(ps1->bb-ps0->bb); } for (l=0; l<4; l++) { l1 = idirq[l+1]; if ( (sol[l] > iso && sol[l1] <= iso) || (sol[l] < iso && sol[l1] >= iso) ) { cc = 0.0f; if ( fabs(sol[l1]-sol[l]) > 0.0f ) cc = (iso-sol[l]) / (sol[l1]-sol[l]); if ( cc == 0.0f || cc == 1.0f ) continue; ccx = cx[l]+cc*(cx[l1]-cx[l]); ccy = cy[l]+cc*(cy[l1]-cy[l]); ccz = cz[l]+cc*(cz[l1]-cz[l]); glVertex3f(ccx,ccy,ccz); nc++; } else if ( sol[l] == iso && sol[l1] == iso ) { nc = 2; glVertex3f(cx[l],cy[l],cz[l]); glVertex3f(cx[l1],cy[l1],cz[l1]); break; } } } else { /* analyze triangle */ for (l=0; l<3; l++) { k1 = nbneg == 3 ? neg[l] : pos[l]; k2 = nbneg == 3 ? pos[0] : neg[0]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; cc = fabs(dd1[k1] / (dd1[k2]-dd1[k1])); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; sol[l] = ps0->bb+cc*(ps1->bb-ps0->bb); } nc = 0; ccx = ccy = ccz = 0.0f; for (l=0; l<3; l++) { l1 = idirt[l+1]; if ( (sol[l] > iso && sol[l1] <= iso) || (sol[l] < iso && sol[l1] >= iso) ) { cc = 0.0f; if ( fabs(sol[l1]-sol[l]) > 0.0f ) cc = (iso-sol[l]) / (sol[l1]-sol[l]); if ( cc == 0.0f || cc == 1.0f ) continue; ccx = cx[l]+cc*(cx[l1]-cx[l]); ccy = cy[l]+cc*(cy[l1]-cy[l]); ccz = cz[l]+cc*(cz[l1]-cz[l]); glVertex3f(ccx,ccy,ccz); nc++; } else if ( sol[l] == iso && sol[l1] == iso ) { nc = 2; glVertex3f(cx[l],cy[l],cz[l]); glVertex3f(cx[l1],cy[l1],cz[l1]); break; } } if ( nc > 0 && nc != 2 ) glVertex3f(ccx,ccy,ccz); } k = pt->nxt; } } } glEnd(); glEndList(); return(dlist); } freefem++-3.38-1/src/medit/critip.c000644 000767 000024 00000017476 11406142256 017153 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" typedef struct saddle { double r1,r2; float pt[3]; float vp1[2],vp2[2]; int k; } Saddle; #define EPSD 1.e-14 #define EPS3 1.e-03 #define MAXPS 100 #define HSIZ 0.001 static int idir[5] = {0,1,2,0,1}; int closedBall(pMesh mesh,int depart,ubyte i) { pTriangle pt; int adj,iadr; ubyte voy; pt = &mesh->tria[depart]; voy = idir[i+1]; iadr = 3*(depart-1)+1; adj = mesh->adja[iadr+voy]; /* search triangles in ball */ while ( adj && adj != depart ) { voy = mesh->voy[iadr+voy]; iadr = 3*(adj-1)+1; voy = idir[voy+2]; adj = mesh->adja[iadr+voy]; } return( adj == depart ); } GLuint listCritPoint(pScene sc,pMesh mesh) { pTriangle pt; pPoint p0,p1,p2; pSolution s0,s1,s2; pMaterial pm; Saddle sad[MAXPS]; GLuint dlist; double aire,ux,uy,vx,vy,dd,cb0[3],cb1[3],cb2[3],vv[3][2],bc[3]; double rgb[3],a0,a1,delta,rr1,rr2,aa,dmin; float p[3]; int *adj,iadr,i,i1,i2,k,m,ncp,ps,ifilt; ubyte typ,tag; static double hsv[3] = {0.0f, 1.0f, 0.80f}; time_t t; if ( !mesh->nbb || mesh->nfield != mesh->dim ) return(0); if ( mesh->nt && !hashTria(mesh) ) return(0); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("find critical points\n"); /* build list */ typ = 0; ncp = 0; ps = 0; dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); glPointSize(4.0); dmin = sc->dmax * EPS; dmin *= dmin; ifilt = 0; hsv[0] = sc->iso.col[0]; hsvrgb(hsv,rgb); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; s0 = &mesh->sol[pt->v[0]]; s1 = &mesh->sol[pt->v[1]]; s2 = &mesh->sol[pt->v[2]]; ux = p1->c[0] - p0->c[0]; uy = p1->c[1] - p0->c[1]; vx = p2->c[0] - p0->c[0]; vy = p2->c[1] - p0->c[1]; aire = ux*vy - uy*vx; if ( aire == 0.0 ) { k = pt->nxt; continue; } else if ( aire < 0.0 ) { p1 = &mesh->point[pt->v[2]]; p2 = &mesh->point[pt->v[1]]; s1 = &mesh->sol[pt->v[2]]; s2 = &mesh->sol[pt->v[1]]; aire = -aire; } /* coef des barycentriques */ aire = 1.0 / aire; cb0[0] = p1->c[1] - p2->c[1]; cb0[1] = -(p1->c[0] - p2->c[0]); cb0[2] = p1->c[0]*p2->c[1] - p1->c[1]*p2->c[0]; cb1[0] = p2->c[1] - p0->c[1]; cb1[1] = -(p2->c[0] - p0->c[0]); cb1[2] = p2->c[0]*p0->c[1] - p2->c[1]*p0->c[0]; cb2[0] = p0->c[1] - p1->c[1]; cb2[1] = -(p0->c[0] - p1->c[0]); cb2[2] = p0->c[0]*p1->c[1] - p0->c[1]*p1->c[0]; for (i=0; i<3; i++) { vv[i][0] = aire * (cb0[i]*s0->m[0] + cb1[i]*s1->m[0] + cb2[i]*s2->m[0]); vv[i][1] = aire * (cb0[i]*s0->m[1] + cb1[i]*s1->m[1] + cb2[i]*s2->m[1]); } dd = vv[0][0]*vv[1][1] - vv[0][1]*vv[1][0]; if ( fabs(dd) < EPSD ) { k = pt->nxt; continue; } dd = 1.0 / dd; p[0] = dd * (vv[1][0]*vv[2][1] - vv[2][0]*vv[1][1]); p[1] = dd * (vv[0][1]*vv[2][0] - vv[0][0]*vv[2][1]); p[2] = 0.0; if ( p[0] < mesh->xmin-mesh->xtra || p[0] > mesh->xmax-mesh->xtra || p[1] < mesh->ymin-mesh->ytra || p[1] > mesh->ymax-mesh->ytra ) { k = pt->nxt; continue; } else if ( !inTria(mesh,k,p,bc) ) { k = pt->nxt; continue; } /* filtering boundary points */ tag = 0; for (i=0; i<3; i++) tag |= (bc[i] < EPS3) << i; if ( tag ) { iadr = 3*(k-1)+1; adj = &mesh->adja[iadr]; ifilt ++; switch (tag) { case 1: if ( !adj[0] ) { k = pt->nxt; continue; } break; case 2: if ( !adj[1] ) { k = pt->nxt; continue; } break; case 4: if ( !adj[2] ) { k = pt->nxt; continue; } break; case 3: if ( !closedBall(mesh,k,2) ) { k = pt->nxt; continue; } break; case 5: if ( !closedBall(mesh,k,1) ) { k = pt->nxt; continue; } break; case 6: if ( !closedBall(mesh,k,0) ) { k = pt->nxt; continue; } break; } } /* eigenvalues of jacobian */ a1 = -(vv[0][0] + vv[1][1]); a0 = vv[0][0] *vv[1][1] - vv[0][1]*vv[1][0]; delta = a1*a1 - 4*a0; i1 = i2 = 0; if ( delta >= 0.0 ) { delta = sqrt(delta); rr1 = 0.5 * (-a1+delta); rr2 = 0.5 * (-a1-delta); } else { delta = sqrt(fabs(delta)); rr1 = rr2 = -0.5 * a1; i1 = i2 = 0.5 * delta; } /* classification */ if ( i1 && i2 ) { glColor3f(0.0,1.0,0.5); if ( rr1 == 0.0f && rr2 == 0.0f ) output2(p[0],p[1],"Cp"); /* center */ else if ( rr1 > 0.0f && rr2 > 0.0f ) output2(p[0],p[1],"Rf"); /* repelling focus */ else if ( rr1 < 0.0f && rr2 < 0.0f ) output2(p[0],p[1],"Af"); /* attracting focus */ } else if ( !i1 && !i2 ) { glColor3f(1.0,0.5,0.0); if ( rr1 > 0.0f && rr2 > 0.0f ) output2(p[0],p[1],"Rn"); /* repelling node */ else if ( rr1 < 0.0f && rr2 < 0.0f ) output2(p[0],p[1],"An"); /* attracting node */ else if ( rr1*rr2 < 0.0f ) { output2(p[0],p[1],"Sp"); /* Saddle point */ if ( ddebug ) printf(" saddle point %f %f\n",p[0]+mesh->xtra,p[1]+mesh->ytra); if ( ps < MAXPS-5 ) { ++ps; sad[ps].pt[0] = p[0]; sad[ps].pt[1] = p[1]; sad[ps].pt[2] = 0.0f; /* eigenvalues */ sad[ps].r1 = rr1; sad[ps].r2 = rr2; /* eigenvectors */ aa = vv[0][0]*vv[0][0]; dd = vv[1][1]*vv[1][1]; delta = sqrt(aa-2.0*vv[0][0]*vv[1][1]+dd+4.0*vv[0][1]*vv[1][0]); sad[ps].vp1[0] = -0.5*(-vv[0][0]+vv[1][1]-delta); sad[ps].vp1[1] = vv[0][1]; sad[ps].vp2[0] = -0.5*(-vv[0][0]+vv[1][1]+delta); sad[ps].vp2[1] = vv[0][1]; sad[ps].k = k; } } } /* point color */ glBegin(GL_POINTS); glColor3dv(rgb); glVertex2fv(p); glEnd(); pt->cpt--; ++ncp; k = pt->nxt; } } glPointSize(1.0); glEndList(); if ( ncp ) fprintf(stdout," %d critical points identified (%d filtered)\n",ncp,ifilt); return(dlist); if ( ps ) { fprintf(stdout," Building streamline(s)"); fflush(stdout); t = clock(); if ( !sc->slist ) { sc->stream = createStream(sc,mesh); if ( !sc->stream ) return(dlist); } for (k=1; k<=ps; k++) { if ( ddebug ) printf(" eigenv1 %f %f\n",sad[k].vp1[0],sad[k].vp1[1]); listSaddleStream(sc,mesh,sad[k].k,sad[k].pt,sad[k].vp1,sad[k].r1); sad[k].vp1[0] = -sad[k].vp1[0]; sad[k].vp1[1] = -sad[k].vp1[1]; listSaddleStream(sc,mesh,sad[k].k,sad[k].pt,sad[k].vp1,sad[k].r1); if ( ddebug ) printf(" eigenv2 %f %f\n",sad[k].vp2[0],sad[k].vp2[1]); listSaddleStream(sc,mesh,sad[k].k,sad[k].pt,sad[k].vp2,sad[k].r2); sad[k].vp2[0] = -sad[k].vp2[0]; sad[k].vp2[1] = -sad[k].vp2[1]; listSaddleStream(sc,mesh,sad[k].k,sad[k].pt,sad[k].vp2,sad[k].r2); } sc->isotyp |= S_STREAML; fprintf(stdout,": %d lines",ps); t = clock() - t; fprintf(stdout," %6.2f sec.\n",t/(float)CLOCKS_PER_SEC); } return(dlist); } freefem++-3.38-1/src/medit/cube.c000644 000767 000024 00000006127 11406142256 016566 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" /* display cube */ void updateCube(pCube cube,pMesh mesh) { pScene sc; pTransform cubetr,view; GLfloat inv[16],axis[4],trans[4]; int idw; /* default */ if ( ddebug ) printf("updateCube\n"); /* retrieve context */ idw = currentScene(); sc = cv.scene[idw]; view = sc->view; cubetr = cube->cubetr; /* compute cube transform */ if ( cube->active & C_EDIT ) { invertMatrix(view->matrix,inv); inv[3] = inv[7] = inv[11] = 0.0f; inv[15] = 1.0; /* rotation cumulative */ if ( cubetr->angle != 0.0 ) { transformVector(trans,cubetr->axis,inv); glPushMatrix(); glLoadIdentity(); glRotatef(cubetr->angle,trans[0],trans[1],trans[2]); glMultMatrixf(cubetr->rot); glGetFloatv(GL_MODELVIEW_MATRIX,cubetr->rot); glPopMatrix(); } /* translation cumulative */ axis[0] = cubetr->panx; axis[1] = cubetr->pany; axis[2] = 0.0; axis[3] = 1.0; transformVector(trans,axis,inv); cubetr->tra[12] = trans[0]; cubetr->tra[13] = trans[1]; cubetr->tra[14] = trans[2]; /* final transformation */ glPushMatrix(); glLoadIdentity(); glMultMatrixf(cubetr->tra); glMultMatrixf(cubetr->rot); glGetFloatv(GL_MODELVIEW_MATRIX,cubetr->matrix); glPopMatrix(); } if ( !cubetr->manim ) { cubetr->angle = 0.0; cube->active ^= C_UPDATE; } } void dumpCube(pScene sc,pMesh mesh,pCube cube) { float *tr,u[4]; double v[4]; int i; FILE *out; tr = cube->cubetr->matrix; out = fopen("tr.data","w"); for (i=0; i<4; i++) fprintf(out,"%f %f %f %f\n",tr[i],tr[4+i],tr[8+i],tr[12+i]); u[0] = cube->cmi[0] - mesh->xtra; u[1] = cube->cmi[1] - mesh->ytra; u[2] = cube->cmi[2] - mesh->ztra; u[3] = 1.0; /*printf("avant %f %f %f %f\n",u[0],u[1],u[2],u[3]);*/ transformPoint2(v,u,tr); fprintf(out,"\n%f %f %f %f\n", v[0]+mesh->xtra,v[1]+mesh->ytra,v[2]+mesh->ztra,v[3]); u[0] = cube->cma[0] - mesh->xtra; u[1] = cube->cma[1] - mesh->ytra; u[2] = cube->cma[2] - mesh->ztra; /*printf("avant %f %f %f %f\n",u[0],u[1],u[2],u[3]);*/ transformPoint2(v,u,tr); fprintf(out,"%f %f %f %f\n", v[0]+mesh->xtra,v[1]+mesh->ytra,v[2]+mesh->ztra,v[3]); fprintf(out,"\n%f %f %f\n", cube->cubetr->tra[12],cube->cubetr->tra[13],cube->cubetr->tra[14]); fprintf(out,"%f %f %f %f\n", cube->cubetr->angle,cube->cubetr->axis[0],cube->cubetr->axis[1], cube->cubetr->axis[2]); fclose(out); } void resetCube(pScene sc,pCube cube,pMesh mesh) { resetTransform(cube->cubetr); cube->active |= C_REDO; cube->cmi[0] = mesh->xmin; cube->cmi[1] = mesh->ymin; cube->cmi[2] = mesh->zmin; cube->cma[0] = mesh->xmax; cube->cma[1] = mesh->ymax; cube->cma[2] = mesh->zmax; } pCube createCube(pScene sc,pMesh mesh) { pCube cube; cube = (pCube)M_calloc(1,sizeof(struct cube),"cube"); assert(cube); cube->cubetr = (pTransform)M_calloc(1,sizeof(struct transform),"cube"); if ( !cube->cubetr ) return(0); resetCube(sc,cube,mesh); return(cube); } freefem++-3.38-1/src/medit/dlists.c000644 000767 000024 00000047165 11406142256 017161 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" /* list of element faces */ static int ct[4][3] = { {0,1,2}, {0,3,1}, {1,3,2}, {0,2,3} }; static int ch[6][4] = { {0,1,2,3}, {4,5,6,7}, {0,1,5,4}, {1,2,6,5}, {2,3,7,6}, {0,3,7,4} }; static float redcol[4] = {1.0, 0.0, 0.0, 1.0}; static float greencol[4] = {0.0, 0.6, 0.0, 1.0}; /* build list of triangles */ GLuint listTria(pScene sc,pMesh mesh) { pMaterial pm; pTriangle pt; pPoint p0,p1,p2; GLuint dlist; double dd,ax,ay,az,bx,by,bz; float cx,cy,cz,n[3],pp0[3],pp1[3],pp2[3]; int k,m,mm,is0,is1,is2,transp; /* default */ if ( !mesh->nt ) return(0); if ( ddebug ) printf("create display list / TRIA\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { mm = sc->matsort[m]; pm = &sc->material[mm]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; transp = 0; if ( !(sc->mode & S_MATERIAL) ) pm = &sc->material[DEFAULT_MAT]; transp = pm->amb[3] < 0.999 || pm->dif[3] < 0.999 || pm->spe[3] < 0.999; if ( transp ) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDepthMask(GL_FALSE); } glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pm->amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pm->spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pm->emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&pm->shininess); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pm->dif); glBegin(GL_TRIANGLES); if ( sc->type & S_FLAT ) { while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0 ) { dd = 1.0 / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } if ( sc->shrink < 1.0 ) { cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.0; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.0; cz = (p0->c[2] + p1->c[2] + p2->c[2]) / 3.0; pp0[0] = sc->shrink*(p0->c[0]-cx)+cx; pp0[1] = sc->shrink*(p0->c[1]-cy)+cy; pp0[2] = sc->shrink*(p0->c[2]-cz)+cz; pp1[0] = sc->shrink*(p1->c[0]-cx)+cx; pp1[1] = sc->shrink*(p1->c[1]-cy)+cy; pp1[2] = sc->shrink*(p1->c[2]-cz)+cz; pp2[0] = sc->shrink*(p2->c[0]-cx)+cx; pp2[1] = sc->shrink*(p2->c[1]-cy)+cy; pp2[2] = sc->shrink*(p2->c[2]-cz)+cz; glNormal3fv(n); glVertex3fv(pp0); glNormal3fv(n); glVertex3fv(pp1); glNormal3fv(n); glVertex3fv(pp2); } else { glNormal3fv(n); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); glNormal3fv(n); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); glNormal3fv(n); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); } k = pt->nxt; } } else { while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0 ) { dd = 1.0 / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } is0 = is1 = is2 = 0; if ( mesh->extra->iv ) { if ( pt->v[0] <= mesh->nvn ) is0 = mesh->extra->nv[pt->v[0]]; if ( pt->v[1] <= mesh->nvn ) is1 = mesh->extra->nv[pt->v[1]]; if ( pt->v[2] <= mesh->nvn ) is2 = mesh->extra->nv[pt->v[2]]; } if ( !is0 && pt->v[0] <= mesh->extra->it ) is0 = mesh->extra->nt[3*(k-1)+1]; if ( !is1 && pt->v[1] <= mesh->extra->it ) is1 = mesh->extra->nt[3*(k-1)+2]; if ( !is2 && pt->v[2] <= mesh->extra->it ) is2 = mesh->extra->nt[3*(k-1)+3]; if ( sc->shrink < 1.0 ) { cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.; cz = (p0->c[2] + p1->c[2] + p2->c[2]) / 3.; pp0[0] = sc->shrink*(p0->c[0]-cx)+cx; pp0[1] = sc->shrink*(p0->c[1]-cy)+cy; pp0[2] = sc->shrink*(p0->c[2]-cz)+cz; pp1[0] = sc->shrink*(p1->c[0]-cx)+cx; pp1[1] = sc->shrink*(p1->c[1]-cy)+cy; pp1[2] = sc->shrink*(p1->c[2]-cz)+cz; pp2[0] = sc->shrink*(p2->c[0]-cx)+cx; pp2[1] = sc->shrink*(p2->c[1]-cy)+cy; pp2[2] = sc->shrink*(p2->c[2]-cz)+cz; if ( !is0 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is0-1)+1]); glVertex3fv(pp0); if ( !is1 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is1-1)+1]); glVertex3fv(pp1); if ( !is2 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is2-1)+1]); glVertex3fv(pp2); } else { if ( !is0 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is0-1)+1]); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); if ( !is1 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is1-1)+1]); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); if ( !is2 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is2-1)+1]); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); } k = pt->nxt; } } glEnd(); if ( transp ) { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } } glEndList(); return(dlist); } /* build list of quadrilaterals */ GLuint listQuad(pScene sc,pMesh mesh) { pMaterial pm; pQuad pq; pPoint p0,p1,p2,p3; GLuint dlist = 0; double ax,ay,az,bx,by,bz,dd; float cx,cy,cz,n[3],pp0[3],pp1[3],pp2[3],pp3[3]; int k,m,mm,is0,is1,is2,is3,transp; /* default */ if ( !mesh->nq ) return(0); if ( ddebug ) printf("create display list / QUADS\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { mm = sc->matsort[m]; pm = &sc->material[mm]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; transp = 0; if ( !(sc->mode & S_MATERIAL) ) pm = &sc->material[DEFAULT_MAT]; transp = pm->amb[3] < 0.999 || pm->dif[3] < 0.999 || pm->spe[3] < 0.999; if ( transp ) { glEnable(GL_BLEND); glDepthMask(GL_FALSE); glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pm->amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pm->spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pm->emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&pm->shininess); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pm->dif); glBegin(GL_QUADS); if ( sc->type & S_FLAT ) { while ( k != 0 ) { pq = &mesh->quad[k]; if ( pq->v[0] == 0 ) { k = pq->nxt; continue; } p0 = &mesh->point[pq->v[0]]; p1 = &mesh->point[pq->v[1]]; p2 = &mesh->point[pq->v[2]]; p3 = &mesh->point[pq->v[3]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0 ) { dd = 1.0 / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } if ( sc->shrink < 1.0 ) { cx = (p0->c[0] + p1->c[0] + p2->c[0] + p3->c[0]) / 4.; cy = (p0->c[1] + p1->c[1] + p2->c[1] + p3->c[1]) / 4.; cz = (p0->c[2] + p1->c[2] + p2->c[2] + p3->c[2]) / 4.; pp0[0] = sc->shrink*(p0->c[0]-cx)+cx; pp0[1] = sc->shrink*(p0->c[1]-cy)+cy; pp0[2] = sc->shrink*(p0->c[2]-cz)+cz; pp1[0] = sc->shrink*(p1->c[0]-cx)+cx; pp1[1] = sc->shrink*(p1->c[1]-cy)+cy; pp1[2] = sc->shrink*(p1->c[2]-cz)+cz; pp2[0] = sc->shrink*(p2->c[0]-cx)+cx; pp2[1] = sc->shrink*(p2->c[1]-cy)+cy; pp2[2] = sc->shrink*(p2->c[2]-cz)+cz; pp3[0] = sc->shrink*(p3->c[0]-cx)+cx; pp3[1] = sc->shrink*(p3->c[1]-cy)+cy; pp3[2] = sc->shrink*(p3->c[2]-cz)+cz; glNormal3fv(n); glVertex3fv(pp0); glNormal3fv(n); glVertex3fv(pp1); glNormal3fv(n); glVertex3fv(pp2); glNormal3fv(n); glVertex3fv(pp3); } else { glNormal3fv(n); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); glNormal3fv(n); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); glNormal3fv(n); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); glNormal3fv(n); glVertex3f(p3->c[0],p3->c[1],p3->c[2]); } k = pq->nxt; } } else { while ( k != 0 ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) { k = pq->nxt; continue; } p0 = &mesh->point[pq->v[0]]; p1 = &mesh->point[pq->v[1]]; p2 = &mesh->point[pq->v[2]]; p3 = &mesh->point[pq->v[3]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0 ) { dd = 1.0 / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } is0 = is1 = is2 = is3 = 0; if ( mesh->extra->iv ) { if ( pq->v[0] <= mesh->nvn ) is0 = mesh->extra->nv[pq->v[0]]; if ( pq->v[1] <= mesh->nvn ) is1 = mesh->extra->nv[pq->v[1]]; if ( pq->v[2] <= mesh->nvn ) is2 = mesh->extra->nv[pq->v[2]]; if ( pq->v[3] <= mesh->nvn ) is3 = mesh->extra->nv[pq->v[3]]; } if ( !is0 && pq->v[0] <= mesh->extra->iq ) is0 = mesh->extra->nq[4*(k-1)+1]; if ( !is1 && pq->v[1] <= mesh->extra->iq ) is1 = mesh->extra->nq[4*(k-1)+2]; if ( !is2 && pq->v[2] <= mesh->extra->iq ) is2 = mesh->extra->nq[4*(k-1)+3]; if ( !is3 && pq->v[3] <= mesh->extra->iq ) is3 = mesh->extra->nq[4*(k-1)+4]; if ( sc->shrink < 1.0 ) { cx = (p0->c[0] + p1->c[0] + p2->c[0] + p3->c[0]) / 4.; cy = (p0->c[1] + p1->c[1] + p2->c[1] + p3->c[1]) / 4.; cz = (p0->c[2] + p1->c[2] + p2->c[2] + p3->c[2]) / 4.; pp0[0] = sc->shrink*(p0->c[0]-cx)+cx; pp0[1] = sc->shrink*(p0->c[1]-cy)+cy; pp0[2] = sc->shrink*(p0->c[2]-cz)+cz; pp1[0] = sc->shrink*(p1->c[0]-cx)+cx; pp1[1] = sc->shrink*(p1->c[1]-cy)+cy; pp1[2] = sc->shrink*(p1->c[2]-cz)+cz; pp2[0] = sc->shrink*(p2->c[0]-cx)+cx; pp2[1] = sc->shrink*(p2->c[1]-cy)+cy; pp2[2] = sc->shrink*(p2->c[2]-cz)+cz; pp3[0] = sc->shrink*(p3->c[0]-cx)+cx; pp3[1] = sc->shrink*(p3->c[1]-cy)+cy; pp3[2] = sc->shrink*(p3->c[2]-cz)+cz; if ( !is0 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is0-1)+1]); glVertex3fv(pp0); if ( !is1 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is1-1)+1]); glVertex3fv(pp1); if ( !is2 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is2-1)+1]); glVertex3fv(pp2); if ( !is3 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is3-1)+1]); glVertex3fv(pp3); } else { if ( !is0 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is0-1)+1]); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); if ( !is1 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is1-1)+1]); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); if ( !is2 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is2-1)+1]); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); if ( !is3 ) glNormal3fv(n); else glNormal3fv(&mesh->extra->n[3*(is3-1)+1]); glVertex3f(p3->c[0],p3->c[1],p3->c[2]); } k = pq->nxt; } } glEnd(); if ( transp ) { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } } glEndList(); return(dlist); } /* build list of tetrahedra */ GLuint listTetra(pScene sc,pMesh mesh,ubyte clip) { pMaterial pm; pTetra pt; pPoint p0,p1,p2; GLuint dlist; double ax,ay,az,bx,by,bz,d; float n[3],shrink,cx,cy,cz; int k,l,m,mm; if ( !mesh->ntet ) return(0); if ( ddebug ) printf("create 3d display list w. materials\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); shrink = min(sc->shrink,0.995); /* scan tetra */ for (m=0; mpar.nbmat; m++) { mm = sc->matsort[m]; pm = &sc->material[mm]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; if ( sc->mode & S_MATERIAL ) { if ( pm->dif[3] < 0.999 ) { glDepthMask(GL_FALSE); glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); } glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pm->dif); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pm->amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pm->spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pm->emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&pm->shininess); } else glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,redcol); /* display triangular faces */ glBegin(GL_TRIANGLES); while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] || (clip && !pt->clip) ) { k = pt->nxt; continue; } /* build 4 faces */ cx = cy = cz = 0.; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; cx += p0->c[0]; cy += p0->c[1]; cz += p0->c[2]; } cx *= 0.25; cy *= 0.25; cz *= 0.25; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[ct[l][0]]]; p1 = &mesh->point[pt->v[ct[l][1]]]; p2 = &mesh->point[pt->v[ct[l][2]]]; /* compute face normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glNormal3fv(n); glVertex3f(shrink*(p0->c[0]-cx)+cx, shrink*(p0->c[1]-cy)+cy, shrink*(p0->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p1->c[0]-cx)+cx, shrink*(p1->c[1]-cy)+cy, shrink*(p1->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p2->c[0]-cx)+cx, shrink*(p2->c[1]-cy)+cy, shrink*(p2->c[2]-cz)+cz); } k = pt->nxt; } glEnd(); if ( sc->mode & S_MATERIAL && pm->dif[3] < 0.999 ) { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } } glEndList(); return(dlist); } /* build list of hexahedra */ GLuint listHexa(pScene sc,pMesh mesh,ubyte clip) { pMaterial pm; pHexa ph; pPoint p0,p1,p2,p3; GLuint dlist; double ax,ay,az,bx,by,bz,d; float n[3],cx,cy,cz,shrink; int k,l,m,mm; if ( !mesh->nhex ) return(0); if ( ddebug ) printf("create 3d display list w. materials\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); shrink = min(sc->shrink,0.995); /* scan hexa */ for (m=0; mpar.nbmat; m++) { mm = sc->matsort[m]; pm = &sc->material[mm]; k = pm->depmat[LHexa]; if ( !k || pm->flag ) continue; if ( sc->mode & S_MATERIAL ) { if ( pm->dif[3] < 0.999) { glDepthMask(GL_FALSE); glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); } glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pm->dif); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pm->amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pm->spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pm->emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&pm->shininess); } else glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,greencol); /* display quadrilateral faces */ glBegin(GL_QUADS); while ( k != 0 ) { ph = &mesh->hexa[k]; if ( !ph->v[0] || (clip && !ph->clip) ) { k = ph->nxt; continue; } /* build 6 faces */ cx = cy = cz = 0.; for (l=0; l<8; l++) { p0 = &mesh->point[ph->v[l]]; cx += p0->c[0]; cy += p0->c[1]; cz += p0->c[2]; } cx /= 8.; cy /= 8.; cz /= 8.; for (l=0; l<6; l++) { p0 = &mesh->point[ph->v[ch[l][0]]]; p1 = &mesh->point[ph->v[ch[l][1]]]; p2 = &mesh->point[ph->v[ch[l][2]]]; p3 = &mesh->point[ph->v[ch[l][3]]]; /* compute face normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glNormal3fv(n); glVertex3f(shrink*(p0->c[0]-cx)+cx, shrink*(p0->c[1]-cy)+cy, shrink*(p0->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p1->c[0]-cx)+cx, shrink*(p1->c[1]-cy)+cy, shrink*(p1->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p2->c[0]-cx)+cx, shrink*(p2->c[1]-cy)+cy, shrink*(p2->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p3->c[0]-cx)+cx, shrink*(p3->c[1]-cy)+cy, shrink*(p3->c[2]-cz)+cz); } k = ph->nxt; } glEnd(); if ( sc->mode & S_MATERIAL && pm->dif[3] < 0.999 ) { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } } glEndList(); return(dlist); } freefem++-3.38-1/src/medit/eigenv.h000644 000767 000024 00000000173 11406142256 017125 0ustar00hechtstaff000000 000000 int eigenv(int symmat,double *mat,double lambda[3],double v[3][3]); int eigen2(double *mm,double *lambda,double vp[2][2]); freefem++-3.38-1/src/medit/ellipse.c000644 000767 000024 00000021140 12021372061 017266 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #include "eigenv.h" #ifndef M_PI2 #define M_PI2 (2.0*M_PI) #endif extern int refmat; extern int eigen2(double m[3],double lambda[2],double vp[2][2]); static GLfloat IdMatrix[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; void drawEllipsoid(pScene sc,pMesh mesh,int typel,int k) { pMaterial pm; pSolution ps; pTriangle pt; pTetra pt1; pPoint p0; GLfloat mat[16],cx,cy,cz; double m[6],lambda[3],v[3][3]; int i,j,l,iord; /* compute average size */ if ( mesh->nfield != 6 || !mesh->nbb ) return; /* draw average ellipse at element */ if ( typel == LPoint ) { p0 = &mesh->point[k]; /*pm = &sc->material[refmat];*/ pm = &sc->material[p0->ref]; ps = &mesh->sol[k]; for (j=0; j<6; j++) m[j] = ps->m[j]; iord = eigenv(1,m,lambda,v); if ( !iord ) return; if ( mesh->ne ) { fprintf(stdout," Eigenvectors :\n vp1 : %f %f %f\n", v[0][0],v[0][1],v[0][2]); fprintf(stdout," vp2 : %f %f %f\n",v[1][0],v[1][1],v[1][2]); fprintf(stdout," vp3 : %f %f %f\n",v[2][0],v[2][1],v[2][2]); fprintf(stdout," Eigenvalues : %f %f %f %d\n", lambda[0],lambda[1],lambda[2],iord); if ( lambda[0] <= 0.0 || lambda[1] <= 0.0 || lambda[2] <= 0.0) return; fprintf(stdout," Sizes : %f %f %f\n", 1.0/sqrt(lambda[0]),1.0/sqrt(lambda[1]),1.0/sqrt(lambda[2])); } else if ( lambda[0] <= 0.0 || lambda[1] <= 0.0 || lambda[2] <= 0.0) return; lambda[0] = max(EPS,0.5/sqrt(lambda[0])); lambda[1] = max(EPS,0.5/sqrt(lambda[1])); lambda[2] = max(EPS,0.5/sqrt(lambda[2])); memcpy(mat,IdMatrix,16*sizeof(GLfloat)); for (j=0; j<3; j++) for (l=0; l<3; l++) mat[j*4+l] = v[j][l]; glDisable(GL_LIGHTING); glPushMatrix(); glColor4fv(pm->dif); glTranslatef(p0->c[0],p0->c[1],p0->c[2]); glMultMatrixf(mat); glScalef(lambda[0],lambda[1],lambda[2]); glutWireSphere(1.,30,30); glPopMatrix(); glEnable(GL_LIGHTING); } else if ( typel == LTria ) { pt = &mesh->tria[k]; if ( mesh->nbb == mesh->np ) pm = &sc->material[refmat]; else if ( mesh->nbb == mesh->nt ) pm = &sc->material[k]; else return; glColor4fv(pm->dif); for (j=0; j<6; j++) m[j] = 0.; cx = cy = cz = 0.0; for (i=0; i<3; i++) { ps = &mesh->sol[pt->v[i]]; p0 = &mesh->point[pt->v[i]]; cx += p0->c[0]; cy += p0->c[1]; cz += p0->c[2]; for (j=0; j<6; j++) m[j] += ps->m[j]; } cx /= 3.; cy /= 3.; cz /= 3.; for (j=0; j<6; j++) m[j] /= 6.; if ( !eigenv(1,m,lambda,v) ) return; lambda[0] = max(EPS,0.5/sqrt(lambda[0])); lambda[1] = max(EPS,0.5/sqrt(lambda[1])); lambda[2] = max(EPS,0.5/sqrt(lambda[2])); memcpy(mat,IdMatrix,16*sizeof(GLfloat)); for (j=0; j<3; j++) for (l=0; l<3; l++) mat[j*4+l] = v[j][l]; glDisable(GL_LIGHTING); glPushMatrix(); glColor4fv(pm->dif); glTranslatef(cx,cy,cz); glMultMatrixf(mat); glScalef(lambda[0],lambda[1],lambda[2]); glutWireSphere(1.,30,30); glPopMatrix(); glEnable(GL_LIGHTING); } else if ( typel == LTets ) { pt1 = &mesh->tetra[k]; pm = &sc->material[refmat]; glColor4fv(pm->dif); for (j=0; j<6; j++) m[j] = 0.; cx = cy = cz = 0.0; for (i=0; i<4; i++) { if ( mesh->nbb == mesh->np ) ps = &mesh->sol[pt1->v[i]]; else if ( mesh->nbb == mesh->ntet ) ps = &mesh->sol[k]; else return; p0 = &mesh->point[pt1->v[i]]; cx += p0->c[0]; cy += p0->c[1]; cz += p0->c[2]; for (j=0; j<6; j++) m[j] += ps->m[j]; } cx /= 4.; cy /= 4.; cz /= 4.; for (j=0; j<6; j++) m[j] /= 6.; if ( !eigenv(1,m,lambda,v) ) return; lambda[0] = max(EPS,0.5/sqrt(lambda[0])); lambda[1] = max(EPS,0.5/sqrt(lambda[1])); lambda[2] = max(EPS,0.5/sqrt(lambda[2])); memcpy(mat,IdMatrix,16*sizeof(GLfloat)); for (j=0; j<3; j++) for (l=0; l<3; l++) mat[j*4+l] = v[j][l]; glDisable(GL_LIGHTING); glPushMatrix(); glColor4fv(pm->dif); glTranslatef(cx,cy,cz); glMultMatrixf(mat); glScalef(lambda[0],lambda[1],lambda[2]); glutWireSphere(1.,30,30); glPopMatrix(); glEnable(GL_LIGHTING); } else return; } void glCircle(float radius) { float ang,ux,uy; ux = 0.0f; uy = radius; glBegin(GL_LINE_STRIP); for (ang=0.0f; ang<=2*M_PI+0.2; ang+=0.2) { ux = radius*(float)sin((double)ang); uy = radius*(float)cos((double)ang); glVertex2f(ux,uy); } glEnd(); } void drawEllipse(pScene sc,pMesh mesh,int typel,int k) { pMaterial pm; pSolution ps; pPoint p0; double m[3],vp[2][2],lambda[2],dd1,dd2; float theta; /* draw ellipse at vertex */ if ( typel == LPoint ) { ps = &mesh->sol[k]; p0 = &mesh->point[k]; pm = &sc->material[refmat]; m[0] = ps->m[0]; m[1] = ps->m[1]; m[2] = ps->m[2]; if ( !eigen2(m,lambda,vp) ) return; /* consider eigenvalues as sizes */ dd1 = 1.0 / sqrt(fabs(lambda[0])); dd2 = 1.0 / sqrt(fabs(lambda[1])); glDisable(GL_LIGHTING); glPushMatrix(); glLineWidth(1.0); glBegin(GL_LINES); glColor3fv(pm->dif); glVertex3f(p0->c[0],p0->c[1],0.0); glColor3fv(pm->dif); glVertex3f(p0->c[0]+dd1*vp[0][0],p0->c[1]+dd1*vp[0][1],0.0); glColor3fv(pm->dif); glVertex3f(p0->c[0],p0->c[1],0.0); glColor3fv(pm->dif); glVertex3f(p0->c[0]+dd2*vp[1][0],p0->c[1]+dd2*vp[1][1],0.0); glEnd(); theta = atan2(vp[0][1],vp[0][0])*RTOD; glTranslatef(p0->c[0],p0->c[1],0.0); glRotatef(theta,0.0,0.0,1.0); glScaled(dd1,dd2,0.0); glColor3fv(pm->dif); glCircle(1.0); glLineWidth(1.0); glPopMatrix(); glEnable(GL_LIGHTING); /* print out info */ fprintf(stdout," Eigenvectors :\n"); fprintf(stdout," vp1 : %f %f\n",vp[0][0],vp[0][1]); fprintf(stdout," vp2 : %f %f\n",vp[1][0],vp[1][1]); fprintf(stdout," Eigenvalues : %f %f\n",lambda[0],lambda[1]); fprintf(stdout," Sizes : %f %f\n",dd1,dd2); } } GLuint drawAllEllipse(pScene sc,pMesh mesh) { GLuint dlist; pSolution ps; pMaterial pm; pTriangle pt; pPoint p0; double m[3],vp[2][2],lambda[2],dd1,dd2; float theta,cx,cy; int k,i,ref; dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* draw ellipse at vertex */ glDisable(GL_LIGHTING); glLineWidth(1.0); if ( mesh->typage == 1 ) { for (k=1; k<=mesh->ne; k++) { ps = &mesh->sol[k]; pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; ref = matRef(sc,pt->ref); pm = &sc->material[ref]; if ( pm->flag ) continue; cx = cy = 0.0; for (i=0; i<3; i++) { p0 = &mesh->point[pt->v[i]]; cx += p0->c[0]; cy += p0->c[1]; } cx *= 1. / 3.; cy *= 1. / 3.; m[0] = ps->m[0]; m[1] = ps->m[1]; m[2] = ps->m[2]; if ( !eigen2(m,lambda,vp) ) return (0) ; /* consider eigenvalues as sizes */ dd1 = 1.0 / sqrt(fabs(lambda[0])); dd2 = 1.0 / sqrt(fabs(lambda[1])); glPushMatrix(); theta = atan2(vp[0][1],vp[0][0])*RTOD; glTranslatef(cx,cy,0.0); glRotatef(theta,0.0,0.0,1.0); glScaled(dd1,dd2,0.0); glColor3fv(pm->dif); glCircle(1.0); glPopMatrix(); } } else { for (k=1; k<=mesh->np; k++) { ps = &mesh->sol[k]; p0 = &mesh->point[k]; ref = matRef(sc,p0->ref); pm = &sc->material[ref]; if ( pm->flag ) continue; m[0] = ps->m[0]; m[1] = ps->m[1]; m[2] = ps->m[2]; if ( !eigen2(m,lambda,vp) ) return (0) ; /* consider eigenvalues as sizes */ dd1 = 1.0 / sqrt(fabs(lambda[0])); dd2 = 1.0 / sqrt(fabs(lambda[1])); glPushMatrix(); theta = atan2(vp[0][1],vp[0][0])*RTOD; glTranslatef(p0->c[0],p0->c[1],0.0); glRotatef(theta,0.0,0.0,1.0); glScaled(dd1,dd2,0.0); glColor3fv(pm->dif); glCircle(1.0); glPopMatrix(); } } glEnable(GL_LIGHTING); glEndList(); return(dlist); } void circumSphere(pScene sc,pMesh mesh,int typel,int k) { pMaterial pm; double c[3],rad; cenrad(mesh,k,c,&rad); rad = sqrt(rad); pm = &sc->material[refmat]; glDisable(GL_LIGHTING); glPushMatrix(); glColor4fv(pm->dif); glTranslated(c[0],c[1],c[2]); glScalef(rad,rad,rad); glutWireSphere(1.,30,30); glPopMatrix(); glEnable(GL_LIGHTING); } freefem++-3.38-1/src/medit/extern.h000644 000767 000024 00000000273 11406142256 017156 0ustar00hechtstaff000000 000000 #ifndef __MEDIT extern Canvas cv; extern ubyte ddebug,quiet,imprim,option,morphing,animate,saveimg,imgtype; extern int animdep,animfin; extern char *imgtyp[]; #endif freefem++-3.38-1/src/medit/geometry.c000644 000767 000024 00000005737 11406142256 017511 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" GLuint geomList(pScene sc,pMesh mesh) { GLuint list = 0; pMaterial pm; pEdge pr; pPoint ppt,pp0,pp1; double dd; float n[3]; int k,it = 0,nm; static float green[4] = {0.0, 1.0, 0.0, 1.0}; static float rouge[4] = {1.0, 0.0, 0.0, 1.0}; static float jaune[4] = {1.0, 1.0, 0.0, 1.0}; /* default */ if ( mesh->na+mesh->nc+mesh->np == 0 ) return(0); /* create display list */ list = glGenLists(1); if ( !list ) return(0); glNewList(list,GL_COMPILE); if ( glGetError() ) return(0); /* draw corners, ridges and required items */ if ( ddebug ) printf("construct point list\n"); if ( mesh->ne ) { /*glPointSize(3);*/ glPointSize(sc->par.pointsize); /* pour Herve LeDret */ glBegin(GL_POINTS); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag & M_UNUSED && !ppt->ref ) continue; if ( ppt->tag == M_CORNER ) glColor3fv(rouge); else if ( ppt->tag == M_REQUIRED ) glColor3fv(green); else continue; it++; if ( sc->par.linc == 1 ) glColor3fv(sc->par.edge); glVertex3f(ppt->c[0],ppt->c[1],ppt->c[2]); } glEnd(); glPointSize(1); } else { pm = &sc->material[DEFAULT_MAT]; glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pm->dif); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pm->amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pm->spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pm->emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&pm->shininess); glBegin(GL_POINTS); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; n[0] = ppt->c[0] - sc->cx; n[1] = ppt->c[1] - sc->cy; n[2] = ppt->c[2] - sc->cz; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0 / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } glNormal3fv(n); glVertex3f(ppt->c[0],ppt->c[1],ppt->c[2]); } glEnd(); it = mesh->np; } /* draw edges */ if ( ddebug ) printf("construct edge list\n"); glLineWidth(sc->par.linewidth); glBegin(GL_LINES); for (k=1; k<=mesh->na; k++) { pr = &mesh->edge[k]; if ( pr->v[0] > mesh->np || pr->v[1] > mesh->np ) continue; if ( pr->tag & M_RIDGE ) { if ( pr->tag & M_TAG ) glColor3fv(jaune); /* ridge + ref en jaune */ else glColor3fv(rouge); /* ridges en rouge */ } else if ( !pr->ref ) { glColor3fv(sc->par.edge); } else { nm = matRef(sc,pr->ref); pm = &sc->material[nm]; glColor3fv(pm->dif); } if ( sc->par.linc == 1 ) glColor3fv(sc->par.edge); pp0 = &mesh->point[pr->v[0]]; pp1 = &mesh->point[pr->v[1]]; glVertex3f(pp0->c[0],pp0->c[1],pp0->c[2]); glVertex3f(pp1->c[0],pp1->c[1],pp1->c[2]); it++; } glEnd(); glLineWidth(1.0); glEndList(); if ( it == 0 ) { glDeleteLists(list,1); return(0); } else return(list); } freefem++-3.38-1/src/medit/gisfil.c000644 000767 000024 00000010633 11406142256 017122 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define FLOAT_MAX 1.e20 int loadGIS(pMesh mesh) { pQuad pq; pPoint ppt; pSolution ps; FILE *fp; double xxm,yym,ggx,ggy,hhz; float *te,cx,cy,cz,gu,hu,xmi,ymi; int i,j,k,sx,sy,ni,ret,bitsize,pos,ref; char *ptr,c,buf[256],data[256]; ubyte ityp; /* default */ strcpy(data,mesh->name); ptr = strstr(data,".gis"); if ( !ptr ) strcat(data,".gis"); fp = fopen(data,"rb"); if ( !fp ) return(0); fprintf(stdout," Reading %s\n",data); if ( !fgets(buf,sizeof(buf),fp) ) { fprintf(stderr," ## Invalid header.\n"); return(0); } /* remove leading spaces */ pos = 0; while ( (buf[0] == ' ') && (buf[0] != 0x0d) && (buf[0] != 0x0a) ) memmove(&buf[0],&buf[1],strlen(buf)); /* check header file */ if ( buf[0] != 'G' ) { fprintf(stderr," ## Invalid format.\n"); return(0); } if ( buf[1] == '1' ) ityp = 1; else if ( buf[1] == '2' ) ityp = 2; else { fprintf(stderr," ## Invalid format ('G?' expected).\n"); return(0); } /* check and strip comments */ do { ret = fscanf(fp,"%s",buf); if ( ret == EOF ) break; if ( buf[0] == '#' ) do c = getc(fp); while ( c != '\n' ); else break; } while (1); /* header */ ret = sscanf(buf,"%d",&sx); ret += fscanf(fp,"%d",&sy); ret += fscanf(fp,"%f %f %f",&cx,&cy,&cz); ret += fscanf(fp,"%f",&gu); ret += fscanf(fp,"%f",&hu); ret += fscanf(fp,"%f %f",&xmi,&ymi); if ( ret != 9 ) { fprintf(stderr," ## Error loading terrain.\n"); free(mesh); return(0); } bitsize = mesh->np*sizeof(float); if ( ddebug ) { fprintf(stdout," header: sx %7d sy %7d\n",sx,sy); fprintf(stdout," cx %7.2f cy %7.2f cz %7.2f\n",cx,cy,cz); fprintf(stdout," units: %7.2f %7.2f\n",gu,hu); fprintf(stdout," min: %7.3e %7.3e\n",xmi,ymi); fprintf(stdout," terrain size: %dx%d %ld bytes\n",sx,sy,(long)bitsize); } mesh->np = sx*sy; mesh->nt = 0; mesh->nq = (sx-1)*(sy-1); mesh->ne = mesh->nq; /* memory allocation for mesh */ if ( !zaldy1(mesh) ) { fclose(fp); return(0); } /* read data */ if ( ityp == 1 ) { xxm = xmi / cx; yym = ymi / cy; ggx = gu * cx; ggy = gu * cy; hhz = hu * cz; for (j=1; j<=sy; j++) for (i=1; i<=sx; i++) { k = (j-1)*sx + i; ppt = &mesh->point[k]; fscanf(fp,"%f",&ppt->c[2]); ppt->c[0] = (float)(ggx*(xxm + i-1)); ppt->c[1] = (float)(ggy*(yym + j-1)); ppt->c[2] = (float)(hhz*ppt->c[2]); } } else { te = (float*)malloc(sx*sizeof(float)); if ( !te ) exit(1); ni = 0; xxm = xmi / cx; yym = ymi / cy; ggx = gu / cx; ggy = gu / cy; hhz = hu / cz; for (j=1; j<=sy; j++) { ret = fread(te,sizeof(int),sx,fp); if ( ret != sx ) { fprintf(stderr," ## Error loading terrain.\n"); free(mesh->point); free(mesh); return(0); } for (i=1; i<=sx; i++) { k = (j-1)*sx + i; ppt = &mesh->point[k]; ppt->c[2] = te[ni++]; ppt->c[0] = ggx*(xxm + i-1); ppt->c[1] = ggy*(yym + j-1); ppt->c[2] = hhz*ppt->c[2]; } } free(te); } /* construct topology */ mesh->dim = 3; for (j=1; jquad[k]; pq->v[0] = (j-1)*sx+i; pq->v[1] = pq->v[0]+1; pq->v[2] = j*sx+i+1; pq->v[3] = pq->v[2]-1; pq->ref = 0; } /* read references, if any */ if ( ityp == 1 ) { pos = ftell(fp); ret = fscanf(fp,"%d",&i); if ( ret != EOF ) { fseek(fp,pos,SEEK_SET); for (j=1; jquad[k]; fscanf(fp,"%d",&ref); pq->ref = ref; } } } /* solution = elevations */ mesh->nbb = mesh->np; mesh->bbmin = FLOAT_MAX; mesh->bbmax = -FLOAT_MAX; mesh->typage = 2; mesh->nfield = 1; /* allocate memory */ if ( !zaldy2(mesh) ) { mesh->nbb = 0; fclose(fp); return(1); } for (j=1; j<=mesh->np; j++) { ps = &mesh->sol[j]; ppt = &mesh->point[j]; ps->bb = ppt->c[2]; if ( ps->bb < mesh->bbmin ) mesh->bbmin = ps->bb; if ( ps->bb > mesh->bbmax ) mesh->bbmax = ps->bb; } fclose(fp); return(1); } freefem++-3.38-1/src/medit/grafic.h000644 000767 000024 00000012173 11406142256 017106 0ustar00hechtstaff000000 000000 #ifndef _GRAFIC_H #define _GRAFIC_H #define MAX_LIST 4 #define MAXISO 5 #define C_ON (1 << 0) #define C_EDIT (1 << 1) #define C_VOL (1 << 2) #define C_UPDATE (1 << 3) #define C_FREEZE (1 << 4) #define C_CAP (1 << 5) #define C_REDO (1 << 6) #define C_HIDE (1 << 7) /* view modes */ #define S_BDRY (1<<0) #define S_FILL (1<<1) #define S_COLOR (1<<2) #define S_MAP (1<<3) #define S_MATERIAL (1<<4) #define S_ALTITUDE (1<<5) #define S_DISPL (1<<6) #define MONO 0 #define LEFT 1 #define RIGHT 2 enum {WIRE = S_BDRY, HIDDEN = S_BDRY + S_FILL, DEPTH = S_BDRY + S_COLOR, FILL = S_FILL + S_COLOR, SHADED = S_BDRY + S_FILL + S_COLOR, SIZEMAP= S_BDRY + S_FILL + S_MAP }; enum {LTria, LQuad, LTets, LHexa, LEdges, LPoint}; enum {PERSPECTIVE, CAMERA, ORTHO}; enum {X_AXIS=0, Y_AXIS, Z_AXIS}; enum {VECTOR,CONE}; /* items */ #define S_AXIS (1<<0) #define S_BOX (1<<1) #define S_GRID (1<<2) #define S_GEOM (1<<3) #define S_ISO (1<<4) #define S_PALETTE (1<<5) #define S_NUMP (1<<6) #define S_NUMF (1<<7) /* type */ #define S_FLAT (1<<0) /* render with facet normals */ #define S_SCISSOR (1<<1) /* scissoring mode */ #define S_FOLLOW (1<<2) /* picking mode */ #define S_NORMAL (1<<3) #define S_OPPOS (1<<4) #define S_DECO (1<<5) #define S_PATH (1<<6) #define S_RESET (1<<7) /* iso-values */ #define MAX_ISO 5 #define S_ISOLINE (1<<1) #define S_ISOSURF (1<<2) #define S_STREAML (1<<3) #define S_STREAMR (1<<4) #define S_VECTOR (1<<5) #define S_CRITP (1<<6) #define S_PARTICLE (1<<7) typedef struct sperspective { float fovy,depth; float matrix[16],alpha,gamma; int rubix,rubfx,rubiy,rubfy; ubyte pmode,rubber; } Persp; typedef Persp * pPersp; typedef struct triangle { float a[3],b[3],c[3]; float va,vb,vc; float na[3],nb[3],nc[3]; } triangle; typedef struct material { float amb[4],emi[4],dif[4],spe[4],shininess; float ext[6]; GLint list; int depmat[MAX_LIST]; int ref,sort; char name[128]; ubyte flag; } Material ; typedef Material * pMaterial; typedef struct _cell { int id; int x,y; float min,max; float value; float step; char* info; char* format; } cell; typedef struct transform { float pos[3]; /* current mouse position */ float angle,axis[3]; /* rotation angle + axis */ float panx,pany,opanx,opany; /* screen translation */ float matrix[16],oldmat[16]; /* transformation matrix */ float rot[16],tra[16]; int mstate,mbutton,manim; } Transform; typedef Transform * pTransform; typedef struct cube { pTransform cubetr; float cmi[3],cma[3]; ubyte active; } Cube; typedef Cube *pCube; typedef struct clip { pTransform cliptr; double eqn[4]; ubyte active; } Clip; typedef Clip *pClip; typedef struct camera { GLfloat eye[3]; /* Position of the camera */ GLfloat speed[3],spmod,altinc; int vecup; } Camera; typedef Camera * pCamera; /* scene parameters */ typedef struct sparam { float back[4],line[4],edge[4],sunpos[4],clip[6]; float cm,dpi,coeff,cumtim,cumpertime,maxtime,pertime,dt; float eyesep,linewidth,pointsize; short xi,yi,xs,ys; int nbmat; char pscolor[10]; ubyte sunp,linc,advtim,nbpart; } Param; /* trajectoire */ typedef struct straj { int np; float *pt; float *tg; float sec; GLuint tlist; } Trajet; /* streamlines */ typedef struct sstream { double size,norm; float xmin,xmax,ymin,ymax,zmin,zmax; float *listp; float stpt[4][3],stcol[4]; int stnp,stiso[4]; short nbstl; ubyte typtrack; } Stream; typedef Stream * pStream; typedef struct strgrd { pTransform strtr; GLuint grid; ubyte active; } Strgrd; typedef Strgrd * pStrgrd; typedef struct siso { float val[MAXISO+2]; float col[MAXISO+2]; ubyte palette,ptyp; } Iso; typedef struct scene { pTransform view; pClip clip; pCube cube; pPersp persp; pCamera camera; pMaterial material; pStream stream; /*pStrgrd stg;*/ Param par; Trajet path; Iso iso; float dmin,dmax; /* scene size */ float shrink; /* shrink value */ float cx,cy,cz; /* center of scene */ GLuint dlist[MAX_LIST]; /* display lists */ GLuint mlist[MAX_LIST]; /* metric lists */ GLuint ilist[MAX_LIST]; /* iso-surfaces */ GLuint clist[MAX_LIST]; GLuint cmlist[MAX_LIST]; /* clipped elts */ GLuint vlist[MAX_LIST]; /* vector list */ GLuint *slist,cplist; /* streamlines */ GLuint glist,nlist; /* geometry lists */ GLuint grid; GLuint picklist; int *matsort; short idwin,idmesh; /* window, mesh id */ short master,slave; ubyte item; /* display items */ ubyte mode; /* render mode */ ubyte type; ubyte isotyp; ubyte picked; } Scene; typedef Scene * pScene; #endif freefem++-3.38-1/src/medit/hash.c000644 000767 000024 00000020546 11406142256 016574 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #include #define NC 32 #define NC2 (NC*NC) #define NC3 (NC2*NC) #define KA 31 #define KB 57 #define KC 79 static int ch[6][4] = { {0,1,2,3}, {4,5,6,7}, {0,1,5,4}, {1,2,6,5}, {2,3,7,6}, {0,3,7,4} }; static int idir[5] = {0,1,2,0,1}; static int idirt[7] = {0,1,2,3,0,1,2}; /* very sioux! (09/2002) */ int hashTetra(pMesh mesh) { pTetra pt,pt1; int k,kk,pp,l,ll,mins,mins1,maxs,maxs1,sum,sum1,iadr; int *hcode,*link,inival,hsize; char *hvoy; ubyte i,ii,i1,i2,i3; unsigned int key; /* avoid building */ if ( mesh->adja ) return(1); if ( 4*sizeof(char) != sizeof(int) ) exit(1); /* default */ if ( ddebug) { fprintf(stdout," Setting topology."); fflush(stdout); } /* memory alloc */ hcode = (int*)M_calloc(max(100,mesh->ntet+1),sizeof(int),"hash.tetra"); link = (int*)M_calloc(4*max(100,mesh->ntet+1),sizeof(int),"hash.tetra"); hsize = max(100,mesh->ntet); assert(hcode); assert(link); hvoy = (char*)hcode; /* init */ inival = 2<<30; for (k=0; k<=mesh->ntet; k++) hcode[k] = -inival; /* build hash table */ for (k=1; k<=mesh->ntet; k++) { pt = &mesh->tetra[k]; if ( !pt->v[0] ) continue; for (i=0; i<4; i++) { i1 = idirt[i+1]; i2 = idirt[i+2]; i3 = idirt[i+3]; mins = min(pt->v[i1],pt->v[i2]); mins = min(mins,pt->v[i3]); maxs = max(pt->v[i1],pt->v[i2]); maxs = max(maxs,pt->v[i3]); /* compute key */ sum = pt->v[i1] + pt->v[i2] + pt->v[i3]; key = KA*mins + KB*maxs + KC*sum; key = key % hsize + 1; /* insert */ iadr = 4*(k-1) + i+1; link[iadr] = hcode[key]; hcode[key] = -iadr; } } if ( ddebug ) { fprintf(stdout,"."); fflush(stdout); } /* set adjacency */ for (l=4*mesh->ntet; l>0; l--) { if ( link[l] >= 0 ) continue; k = (l-1) / 4 + 1; i = (l-1) % 4; i1 = idirt[i+1]; i2 = idirt[i+2]; i3 = idirt[i+3]; pt = &mesh->tetra[k]; sum = pt->v[i1] + pt->v[i2] + pt->v[i3]; mins = min(pt->v[i1],pt->v[i2]); mins = min(mins,pt->v[i3]); maxs = max(pt->v[i1],pt->v[i2]); maxs = max(maxs,pt->v[i3]); /* accross link */ ll = -link[l]; pp = 0; link[l] = 0; hvoy[l] = 0; while ( ll != inival ) { kk = (ll-1) / 4 + 1; ii = (ll-1) % 4; i1 = idirt[ii+1]; i2 = idirt[ii+2]; i3 = idirt[ii+3]; pt1 = &mesh->tetra[kk]; sum1 = pt1->v[i1] + pt1->v[i2] + pt1->v[i3]; if ( sum1 == sum ) { mins1 = min(pt1->v[i1],pt1->v[i2]); mins1 = min(mins1,pt1->v[i3]); if ( mins1 == mins ) { maxs1 = max(pt1->v[i1],pt1->v[i2]); maxs1 = max(maxs1,pt1->v[i3]); if ( maxs1 == maxs ) { /* adjacent found */ if ( pp != 0 ) link[pp] = link[ll]; link[l] = kk; hvoy[l] = ii; link[ll]= k; hvoy[ll]= i; break; } } } pp = ll; ll = -link[ll]; } } mesh->adja = (int*)link; mesh->voy = (ubyte*)hcode; if ( ddebug ) fprintf(stdout,"..\n"); return(1); } /* very sioux! (09/2002) */ int hashHexa(pMesh mesh) { pHexa ph,ph1; int k,kk,iadr,pp,l,ll,v; int imin,mins,mins1,opps,opps1; int *hcode,*link,inival,hsize; char *hvoy; ubyte i,i1,ii; unsigned int key; /* avoid building again! */ if ( mesh->adja ) return(1); if ( 4*sizeof(char) != sizeof(int) ) exit(1); /* default */ if ( ddebug ) { fprintf(stdout," Setting topology."); fflush(stdout); } /* memory alloc */ /* bug fixe: 17/04/2007 hcode = (int*)M_calloc(max(11,mesh->nhex+1),sizeof(int),"hash.hexa"); link = (int*)M_calloc(6*max(11,mesh->nhex+1),sizeof(int),"hash.hexa"); hsize = max(10,mesh->nhex); if ( !hcode || !link ) { myerror.coderr = 1000; return(0); } hvoy = (char*)hcode; */ hcode = (int*)M_calloc(max(10,6*mesh->nhex/4+1),sizeof(int),"hash.hexa"); assert(hcode); link = (int*)M_calloc(max(10,6*mesh->nhex+1),sizeof(int),"hash.hexa"); assert(link); hsize = max(2,mesh->nhex); hvoy = (char*)hcode; /* init */ inival = 2 << 30; for (k=0; k<=6*mesh->nhex/4; k++) hcode[k] = -inival; /* build hash table */ for (k=1; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; if ( !ph->v[0] ) continue; for (i=0; i<6; i++) { mins = ph->v[ch[i][0]]; imin = 0; for (v=1; v<4; v++) if ( ph->v[ch[i][v]] < mins ) { mins = ph->v[ch[i][v]]; imin = v; } i1 = (imin+2) % 4; opps = ph->v[ch[i][i1]]; /* compute key */ key = KA*mins + KB*opps; key = key % hsize + 1; /* insert */ iadr = 6*(k-1) + i+1; link[iadr] = hcode[key]; hcode[key] = -iadr; } } if ( ddebug ) { fprintf(stdout,"."); fflush(stdout); } /* set adjacency */ for (l=6*mesh->nhex; l>0; l--) { if ( link[l] >= 0 ) continue; k = (l-1) / 6 + 1; i = (l-1) % 6; ph = &mesh->hexa[k]; mins = ph->v[ch[i][0]]; imin = 0; for (v=1; v<4; v++) if ( ph->v[ch[i][v]] < mins ) { mins = ph->v[ch[i][v]]; imin = v; } i1 = (imin+2) % 4; opps = ph->v[ch[i][i1]]; /* accross link */ ll = -link[l]; pp = 0; link[l] = 0; hvoy[l] = 0; while ( ll != inival ) { kk = (ll-1) / 6 +1; ii = (ll-1) % 6; ph1 = &mesh->hexa[kk]; mins1 = ph1->v[ch[ii][0]]; imin = 0; for (v=1; v<4; v++) if ( ph1->v[ch[ii][v]] < mins1 ) { mins1 = ph1->v[ch[ii][v]]; imin = v; } i1 = (imin+2) % 4; opps1 = ph1->v[ch[ii][i1]]; /* adjacent found */ if ( mins1 == mins && opps1 == opps ) { if ( pp != 0 ) link[pp] = link[ll]; link[l] = kk; hvoy[l] = ii; link[ll]= k; hvoy[ll]= i; break; } pp = ll; ll = -link[ll]; } } mesh->adja = (int*)link; mesh->voy = (ubyte*)hcode; if ( ddebug ) fprintf(stdout,"..\n"); return(1); } /* very sioux! (09/2002) */ int hashTria(pMesh mesh) { pTriangle pt,pt1; int k,kk,l,ll,mins,maxs,mins1,maxs1,hsize; int *hcode,*link,inival,iadr,pp; char *hvoy; ubyte i,i1,i2,ii; unsigned int key; /* avoid building again! */ if ( mesh->adja ) return(1); if ( 4*sizeof(char) != sizeof(int) ) exit(1); /* default */ if ( ddebug) { fprintf(stdout," Setting topology."); fflush(stdout); } /* memory alloc */ hcode = (int*)M_calloc(max(1,3*mesh->nt/4)+1,sizeof(int),"hash.tria"); link = (int*)M_calloc(3*mesh->nt+1,sizeof(int),"hash.tria"); hsize = max(2,3*mesh->nt/4-1); assert(hcode); assert(link); hvoy = (char*)hcode; /* init */ inival = 2 << 30; for (k=0; k<=3*mesh->nt/4; k++) hcode[k] = -inival; /* build hash table */ for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; for (i=0; i<3; i++) { i1 = idir[i+1]; i2 = idir[i+2]; mins = min(pt->v[i1],pt->v[i2]); maxs = max(pt->v[i1],pt->v[i2]); /* compute key */ key = KA*mins + KB*maxs; key = key % hsize + 1; /* insert */ iadr = 3*(k-1) + i+1; link[iadr] = hcode[key]; hcode[key] = -iadr; } } if ( ddebug ) { fprintf(stdout,"."); fflush(stdout); } /* set adjacency */ for (l=3*mesh->nt; l>0; l--) { if ( link[l] >= 0 ) continue; k = (l-1) / 3 + 1; i = (l-1) % 3; i1 = idir[i+1]; i2 = idir[i+2]; pt = &mesh->tria[k]; mins = min(pt->v[i1],pt->v[i2]); maxs = max(pt->v[i1],pt->v[i2]); /* accross link */ ll = -link[l]; pp = 0; link[l] = 0; hvoy[l] = 0; while ( ll != inival ) { kk = (ll-1) / 3 + 1; ii = (ll-1) % 3; i1 = idir[ii+1]; i2 = idir[ii+2]; pt1 = &mesh->tria[kk]; mins1 = min(pt1->v[i1],pt1->v[i2]); maxs1 = max(pt1->v[i1],pt1->v[i2]); /* adjacent found */ if ( mins1 == mins && maxs1 == maxs ) { if ( pp != 0 ) link[pp] = link[ll]; link[l] = kk; hvoy[l] = ii; link[ll]= k; hvoy[ll]= i; break; } pp = ll; ll = -link[ll]; } } mesh->adja = (int*)link; mesh->voy = (ubyte*)hcode; if ( ddebug ) fprintf(stdout,".\n"); return(1); } freefem++-3.38-1/src/medit/ilists.c000644 000767 000024 00000036436 11406142256 017165 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define BASETR 0.2 #define NBCOL 9 /* build lists for iso-surfaces */ GLuint listTriaIso(pScene sc,pMesh mesh) { GLuint dlist = 0; pTriangle pt; pPoint p0,p1; pMaterial pm; pSolution ps0,ps1; double rgb[3]; float iso,cx,cy,cz,cc,kc; int m,k,i,l,l1,nc,ncol; static double hsv[3] = { 0.0, 1.0, 0.9 }; static int idir[5] = {0,1,2,0,1}; /* default */ if ( !mesh->nt || !mesh->nbb || mesh->typage == 1 ) return(0); if ( ddebug ) printf("create iso-values map list / TRIA\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* create display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ glBegin(GL_LINES); ncol = NBCOL; for (i=0; i<=ncol*(MAXISO-1); i++) { if ( i < ncol*(MAXISO-1) ) { l = i / ncol; kc = (i % ncol) / (float)ncol; iso = sc->iso.val[l]*(1.0-kc)+sc->iso.val[l+1]*kc; hsv[0] = sc->iso.col[l]*(1.0-kc)+sc->iso.col[l+1]*kc; } else { iso = sc->iso.val[MAXISO-1]; hsv[0] = sc->iso.col[MAXISO-1]; } hsvrgb(hsv,rgb); glColor3dv(rgb); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } /* analyze edges */ nc = 0; cx = cy = cz = 0.0; for (l=0; l<3; l++) { l1 = idir[l+1]; p0 = &mesh->point[pt->v[l]]; p1 = &mesh->point[pt->v[l1]]; ps0 = &mesh->sol[pt->v[l]]; ps1 = &mesh->sol[pt->v[l1]]; if ( (ps0->bb > iso && ps1->bb <= iso) || (ps0->bb < iso && ps1->bb >= iso) ) { cc = 0.0; if ( fabs(ps1->bb-ps0->bb) > 0.0 ) cc = (iso-ps0->bb) / (ps1->bb-ps0->bb); if ( cc == 0.0 || cc == 1.0 ) continue; cx = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy = p0->c[1]+cc*(p1->c[1]-p0->c[1]); nc++; if ( mesh->dim == 2 ) glVertex2f(cx,cy); else { cz = p0->c[2]+cc*(p1->c[2]-p0->c[2]); glVertex3f(cx,cy,cz); } } else if ( ps0->bb == iso && ps1->bb == iso ) { nc = 2; if ( mesh->dim == 2 ) { glVertex2f(p0->c[0],p0->c[1]); glVertex2f(p1->c[0],p1->c[1]); break; } else { glVertex3f(p0->c[0],p0->c[1],p0->c[2]); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); break; } } } if ( nc > 0 && nc != 2 ) { if ( mesh->dim ==2 ) glVertex2f(cx,cy); else glVertex3f(cx,cy,cz); } k = pt->nxt; } } } glEnd(); glEndList(); return(dlist); } /* build lists for iso-surfaces */ GLuint listQuadIso(pScene sc,pMesh mesh) { GLuint dlist = 0; pQuad pq; pPoint p0,p1; pMaterial pm; pSolution ps0,ps1; double rgb[3]; float iso,cx,cy,cz,cc,kc; int m,k,i,l,l1,ncol; static double hsv[3] = { 0.0f, 1.0f, 0.8f }; static int idir[6] = {0,1,2,3,0,1}; /* default */ if ( !mesh->nq || !mesh->nbb || mesh->typage == 1 ) return(0); if ( ddebug ) printf("create iso-values map list / QUAD\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ glBegin(GL_LINES); ncol = NBCOL; for (i=0; i<=ncol*(MAXISO-1); i++) { if ( i < ncol*(MAXISO-1) ) { l = i / ncol; kc = (i % ncol) / (float)ncol; iso = sc->iso.val[l]*(1.0-kc)+sc->iso.val[l+1]*kc; hsv[0] = sc->iso.col[l]*(1.0-kc)+sc->iso.col[l+1]*kc; } else { iso = sc->iso.val[MAXISO-1]; hsv[0] = sc->iso.col[MAXISO-1]; } hsvrgb(hsv,rgb); glColor3dv(rgb); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) { k = pq->nxt; continue; } /* analyze edges */ for (l=0; l<4; l++) { p0 = &mesh->point[pq->v[l]]; ps0 = &mesh->sol[pq->v[l]]; l1 = idir[l+1]; p1 = &mesh->point[pq->v[l1]]; ps1 = &mesh->sol[pq->v[l1]]; if ( (ps0->bb > iso && ps1->bb <= iso) || (ps0->bb < iso && ps1->bb >= iso) ) { cc = 0.0f; if ( fabs(ps1->bb-ps0->bb) > 0.0f ) cc = (iso-ps0->bb) / (ps1->bb-ps0->bb); if ( cc == 0.0f || cc == 1.0f ) continue; cx = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy = p0->c[1]+cc*(p1->c[1]-p0->c[1]); if ( mesh->dim == 2 ) glVertex2f(cx,cy); else { cz = p0->c[2]+cc*(p1->c[2]-p0->c[2]); glVertex3f(cx,cy,cz); } } } k = pq->nxt; } } } glEnd(); glEndList(); return(dlist); } /* build lists for iso-surfaces */ GLuint listTetraIso(pScene sc,pMesh mesh) { FILE *outv,*outf; GLuint dlist = 0; pTetra pt; pPoint p0,p1; pMaterial pm; pSolution ps0,ps1; double delta,rgb[4],d,ax,ay,az,bx,by,bz; float iso,n[3],cx[4],cy[4],cz[4],cc; int m,k,k1,k2,i,l,pos[4],neg[4],nbpos,nbneg,nbnul,nv,nf; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; static int tn[4] = {0,0,1,1}; static int tp[4] = {0,1,1,0}; /* default */ if ( !mesh->ntet || !mesh->nbb || mesh->typage == 1 ) return(0); if ( ddebug ) printf("create iso-values map list / TETRA\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); delta = sc->iso.val[MAXISO-1] - sc->iso.val[0]; /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDepthMask(GL_FALSE); if (ddebug) { outv = fopen("vertex.mesh","w"); fprintf(outv,"MeshVersionFormatted 1\n Dimension\n 3\n\nVertices\n \n"); outf = fopen("faces.mesh2","w"); fprintf(outv,"Triangles\n \n"); } nv = nf = 0; glBegin(GL_TRIANGLES); for (i=MAXISO-1; i>=0; i--) { iso = sc->iso.val[i]; /* base color */ /*hsv[0] = 240.0f*(1.0f - (iso-sc->iso.val[0])/delta);*/ hsv[0] = sc->iso.col[i]; hsvrgb(hsv,rgb); rgb[0] = min(1.0,rgb[0]+BASETR); rgb[1] = min(1.0,rgb[1]+BASETR); rgb[2] = min(1.0,rgb[2]+BASETR); rgb[3] = BASETR + (float)(i-1)/(float)MAXISO*(1.0-BASETR); /*rgb[3] = 0.5; */ glColor4dv(rgb); if ( i == MAXISO-1 ) iso -= 0.001*fabs(iso)/delta; else if ( i == 0 ) iso += 0.001*fabs(iso)/delta; for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } /* analyze vertices */ nbpos = nbneg = nbnul = 0; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; ps0 = &mesh->sol[pt->v[l]]; /*if ( ps0->bb < sc->iso.val[0] ) ps0->bb = sc->iso.val[0];*/ if ( ps0->bb > iso ) pos[nbpos++] = l; else if ( ps0->bb < iso ) neg[nbneg++] = l; else nbnul++; } if ( nbneg == 4 || nbpos == 4 ) { k = pt->nxt; continue; } if ( nbneg == 2 && nbpos == 2 ) { for (l=0; l<4; l++) { k1 = neg[tn[l]]; k2 = pos[tp[l]]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; cc = 0.0f; if ( fabs(ps1->bb-ps0->bb) > 0.0f ) cc = (iso-ps0->bb) / (ps1->bb-ps0->bb); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); } /* compute face normal */ ax = cx[1]-cx[0]; ay = cy[1]-cy[0]; az = cz[1]-cz[0]; bx = cx[2]-cx[0]; by = cy[2]-cy[0]; bz = cz[2]-cz[0]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glNormal3fv(n); glVertex3f(cx[0],cy[0],cz[0]); glVertex3f(cx[1],cy[1],cz[1]); glVertex3f(cx[2],cy[2],cz[2]); glNormal3fv(n); glVertex3f(cx[0],cy[0],cz[0]); glVertex3f(cx[2],cy[2],cz[2]); glVertex3f(cx[3],cy[3],cz[3]); if ( ddebug ) { fprintf(outv,"%f %f %f 0\n",cx[0],cy[0],cz[0]); fprintf(outv,"%f %f %f 0\n",cx[1],cy[1],cz[1]); fprintf(outv,"%f %f %f 0\n",cx[2],cy[2],cz[2]); fprintf(outv,"%f %f %f 0\n",cx[3],cy[3],cz[3]); fprintf(outf,"%d %d %d 0\n",nv+1,nv+2,nv+3); fprintf(outf,"%d %d %d 0\n",nv+1,nv+3,nv+4); } nv+= 4; nf+= 2; } else if ( !nbnul ) { for (l=0; l<3; l++) { k1 = nbneg == 3 ? neg[l] : pos[l]; k2 = nbneg == 3 ? pos[0] : neg[0]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; cc = 0.0f; if ( fabs(ps1->bb-ps0->bb) > 0.0f ) cc = (iso-ps0->bb) / (ps1->bb-ps0->bb); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); } /* compute face normal */ ax = cx[1]-cx[0]; ay = cy[1]-cy[0]; az = cz[1]-cz[0]; bx = cx[2]-cx[0]; by = cy[2]-cy[0]; bz = cz[2]-cz[0]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glNormal3fv(n); glVertex3f(cx[0],cy[0],cz[0]); glVertex3f(cx[1],cy[1],cz[1]); glVertex3f(cx[2],cy[2],cz[2]); if ( ddebug ) { fprintf(outv,"%f %f %f 0\n",cx[0],cy[0],cz[0]); fprintf(outv,"%f %f %f 0\n",cx[1],cy[1],cz[1]); fprintf(outv,"%f %f %f 0\n",cx[2],cy[2],cz[2]); fprintf(outf,"%d %d %d 0\n",nv+1,nv+2,nv+3); } nv += 3; nf += 1; } k = pt->nxt; } } } glEnd(); glDepthMask(GL_TRUE); glDisable(GL_BLEND); if ( ddebug ) { fclose(outv); fclose(outf); } printf(" Vertices %d Triangles %d\n",nv,nf); glEndList(); return(dlist); } int tetraIsoPOVray(pScene sc,pMesh mesh) { FILE *isofil; pTetra pt; pPoint p0,p1; pMaterial pm; pSolution ps0,ps1; double delta; float iso,cx[4],cy[4],cz[4],cc; int m,k,k1,k2,i,l,pos[4],neg[4],nbpos,nbneg,nbnul; char *ptr,data[128]; static int tn[4] = {0,0,1,1}; static int tp[4] = {0,1,1,0}; /* default */ if ( !mesh->ntet || !mesh->nbb || mesh->typage == 1 ) return(0); if ( ddebug ) printf("create isosurfaces POVray\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); delta = sc->iso.val[MAXISO-1] - sc->iso.val[0]; strcpy(data,mesh->name); ptr = strstr(data,".mesh"); if ( ptr ) ptr = '\0'; strcat(data,".pov"); if ( ddebug ) fprintf(stdout," Writing POVRay file %s\n",data); isofil = fopen(data,"w"); if ( !isofil ) return(0); for (i=MAXISO-1; i>=0; i--) { iso = sc->iso.val[i]; if ( i == MAXISO-1 ) iso -= 0.001*fabs(iso)/delta; else if ( i == 0 ) iso += 0.001*fabs(iso)/delta; fprintf(isofil,"\n#declare isosurf%d = mesh {\n",i); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } /* analyze vertices */ nbpos = nbneg = nbnul = 0; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; ps0 = &mesh->sol[pt->v[l]]; if ( ps0->bb > iso ) pos[nbpos++] = l; else if ( ps0->bb < iso ) neg[nbneg++] = l; else nbnul++; } if ( nbneg == 4 || nbpos == 4 ) { k = pt->nxt; continue; } if ( nbneg == 2 && nbpos == 2 ) { for (l=0; l<4; l++) { k1 = neg[tn[l]]; k2 = pos[tp[l]]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; cc = 0.0f; if ( fabs(ps1->bb-ps0->bb) > 0.0f ) cc = (iso-ps0->bb) / (ps1->bb-ps0->bb); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); } fprintf(isofil,"triangle {\n"); fprintf(isofil," <%f,%f,%f>,\n", cx[0]+mesh->xtra,cy[0]+mesh->ytra,cz[0]+mesh->ztra); fprintf(isofil," <%f,%f,%f>,\n", cx[1]+mesh->xtra,cy[1]+mesh->ytra,cz[1]+mesh->ztra); fprintf(isofil," <%f,%f,%f>\n" , cx[2]+mesh->xtra,cy[2]+mesh->ytra,cz[2]+mesh->ztra); fprintf(isofil,"}\n"); fprintf(isofil,"triangle {\n"); fprintf(isofil," <%f,%f,%f>,\n", cx[0]+mesh->xtra,cy[0]+mesh->ytra,cz[0]+mesh->ztra); fprintf(isofil," <%f,%f,%f>,\n", cx[2]+mesh->xtra,cy[2]+mesh->ytra,cz[2]+mesh->ztra); fprintf(isofil," <%f,%f,%f>\n" , cx[3]+mesh->xtra,cy[3]+mesh->ytra,cz[3]+mesh->ztra); fprintf(isofil,"}\n"); } else if ( !nbnul ) { for (l=0; l<3; l++) { k1 = nbneg == 3 ? neg[l] : pos[l]; k2 = nbneg == 3 ? pos[0] : neg[0]; p0 = &mesh->point[pt->v[k1]]; p1 = &mesh->point[pt->v[k2]]; ps0 = &mesh->sol[pt->v[k1]]; ps1 = &mesh->sol[pt->v[k2]]; cc = 0.0f; if ( fabs(ps1->bb-ps0->bb) > 0.0f ) cc = (iso-ps0->bb) / (ps1->bb-ps0->bb); cx[l] = p0->c[0]+cc*(p1->c[0]-p0->c[0]); cy[l] = p0->c[1]+cc*(p1->c[1]-p0->c[1]); cz[l] = p0->c[2]+cc*(p1->c[2]-p0->c[2]); } fprintf(isofil,"triangle {\n"); fprintf(isofil," <%f,%f,%f>,\n", cx[0]+mesh->xtra,cy[0]+mesh->ytra,cz[0]+mesh->ztra); fprintf(isofil," <%f,%f,%f>,\n", cx[1]+mesh->xtra,cy[1]+mesh->ytra,cz[1]+mesh->ztra); fprintf(isofil," <%f,%f,%f>\n", cx[2]+mesh->xtra,cy[2]+mesh->ytra,cz[2]+mesh->ztra); fprintf(isofil,"}\n"); } k = pt->nxt; } } fprintf(isofil,"}\n"); } fclose(isofil); return(1); } freefem++-3.38-1/src/medit/image.c000644 000767 000024 00000017361 11406142256 016734 0ustar00hechtstaff000000 000000 #include "medit.h" #include "sproto.h" #include "extern.h" PPMimage *loadPPM(const char *imgname,int *type) { pPPMimage result; FILE *fp; int i,k,typimg,ret,r,g,b,s,maxval,bitsize; char *ptr,c,buff[1024],data[256]; /* search for image */ ptr = strstr(imgname,".ppm"); if ( !ptr ) { strcpy(data,imgname); strcat(data,".ppm"); fp = fopen(data,"rb"); } else fp = fopen(imgname,"rb"); if ( !fp ) { fprintf(stderr," ## Unable to open file %s.\n",imgname); return(0); } if ( !fgets(buff,sizeof(buff),fp) ) { fprintf(stderr," ## Invalid file header.\n"); return(0); } /* check header file */ if ( buff[0] != 'P' ) { fprintf(stderr," ## Invalid image format.\n"); return(0); } switch(buff[1]) { case '2': typimg = P2; break; case '3': typimg = P3; break; case '5': typimg = P5; break; case '6': typimg = P6; break; default: fprintf(stderr," ## Invalid image format.\n"); return(0); } /* allocate memory to store imagee */ result = malloc(sizeof(PPMimage)); if ( !result ) { fprintf(stderr," ## Unable to load image.\n"); return(0); } do { ret = fscanf(fp,"%s",buff); if ( ret == EOF ) break; /* check and strip comments */ if ( buff[0] == '#' ) do c = getc(fp); while ( c != '\n' ); else break; } while (1); /* read columns + lines */ ret = sscanf(buff,"%d",&s); result->sizeX = (short)s; ret += fscanf(fp,"%d",&s); result->sizeY = (short)s; if ( ret != 2 ) { fprintf(stderr," ## Error loading image.\n"); free(result); return(0); } if ( !quiet ) fprintf(stdout," image size: %d x %d\n",result->sizeX,result->sizeY); if ( fscanf(fp,"%d",&maxval) != 1 ) { fprintf(stderr," ## Invalid image size.\n"); free(result); return(0); } /* strip line */ while ( fgetc(fp) != '\n' ) ; /* size based on type */ if ( typimg == P2 || typimg == P5 ) bitsize = result->sizeX*result->sizeY; else bitsize = 3*result->sizeX*result->sizeY; result->data = (ubyte*)malloc(bitsize*sizeof(ubyte)); if ( !result ) { fprintf(stderr," ## Unable to load image.\n"); free(result); return(0); } /* read data file */ switch( typimg ) { case P2: /* ascii file (grey) */ case P3: /* ascii file (color) */ for (i=0; idata[i] = (ubyte)r; } break; case P5: /* binary file (grey) */ case P6: /* binary file (color) */ ret = fread(result->data,sizeof(ubyte),bitsize,fp); if ( ret != bitsize ) { fprintf(stderr," ## Error loading image.\n"); free(result->data); free(result); return(0); } break; } fclose(fp); if ( *type == DEFAULT ) switch( typimg ) { case P2: case P5: *type = GREY; break; case P3: case P6: *type = RGB; break; } /* convert to grey levels */ else if ( *type == GREY && (typimg == P3 || typimg == P6) ) { fprintf(stdout," converting to grey levels\n"); for (i=0,k=0; idata[i]; g = (int)result->data[i+1]; b = (int)result->data[i+2]; result->data[k] = (ubyte)(0.3*r+0.59*g+0.11*b); } result->data = (ubyte*)realloc(result->data,sizeof(ubyte)*bitsize/3); } return(result); } int savePPM(const char *imgname,pPPMimage img,int typimg) { FILE *out; int i,c,bitsize; char *ptr,data[512]; strcpy(data,imgname); ptr = (char*)strstr(data,".ppm"); if ( !ptr ) strcat(data,".ppm"); out = fopen(data,"w"); if ( !out ) { fprintf(stderr," ## Unable to open file %s.\n",data); exit(1); } bitsize = img->sizeX*img->sizeY; switch(typimg) { case P2: fprintf(out,"P2\n"); fprintf(out,"# Created using medit %s %s, (c) INRIA\n",ME_VER,ME_REL); fprintf(out,"%d %d\n",img->sizeX,img->sizeY); fprintf(out,"255\n"); c = 0; for (i=0; isizeX*img->sizeY; i++) { fprintf(out,"%3d ",(int)img->data[i]); if ( ++c == 17 ) { c = 0; fprintf(out,"\n"); } } fprintf(out,"\n"); break; case P5: fprintf(out,"P5\n"); fprintf(out,"# Created using medit %s %s, (c) INRIA\n",ME_VER,ME_REL); fprintf(out,"%d %d\n",img->sizeX,img->sizeY); fprintf(out,"255\n"); fwrite(img->data,sizeof(ubyte),bitsize,out); break; case P6: fprintf(out,"P6\n"); fprintf(out,"# Created using medit %s %s, (c) INRIA\n",ME_VER,ME_REL); fprintf(out,"%d %d\n",img->sizeX,img->sizeY); fprintf(out,"255\n"); bitsize = (img->sizeX*24+7)/8*img->sizeY; if ( fwrite(img->data,sizeof(ubyte),bitsize,out) < bitsize ) fprintf(stderr," ## Data file corrupted.\n"); break; } fclose(out); return(1); } int saveTGA(const char *imgname,GLubyte *img,int w,int h) { TGAheader tga; int i; char *ptr,data[256]; FILE *out; strcpy(data,imgname); ptr = (char*)strstr(data,".tga"); if ( !ptr ) strcat(data,".tga"); out = fopen(data,"wb"); if ( !out ) { fprintf(stderr," ## UNABLE TO OPEN FILE %s.\n",data); exit(1); } tga.idfield_len = 0; tga.cmap_type = 0; tga.image_type = 2; for (i=0; i<5; i++) tga.cmap_spec[i] = 0; for (i=0; i<2; i++) { tga.x_orig[i] = 0; tga.y_orig[i] = 0; } /* Lo bits */ tga.width[0] = w & 0xFF; /* Hi bits */ tga.width[1] = (w >> 8) & 0xFF; tga.height[0] = h & 0xFF; tga.height[1] = (h >> 8) & 0xFF; tga.pixel_size = 24; tga.image_desc = 0; /* Output header */ fwrite(&tga,sizeof(TGAheader),1,out); /* Output image */ fwrite(img, sizeof(unsigned char),w*h*3,out); return(1); } void swapPixels(PPMimage *pixels) { GLubyte *row; int i,k,ck,bits; bits = 3*pixels->sizeX; row = (GLubyte*)malloc(bits*sizeof(GLubyte)); if ( !row ) return; /* exchange rows */ for (i=0; isizeY/2; i++) { k = 3*i*pixels->sizeX; ck = 3*(pixels->sizeY-i-1)*pixels->sizeX; memcpy(row,&pixels->data[k],bits); memcpy(&pixels->data[k],&pixels->data[ck],bits); memcpy(&pixels->data[ck],row,bits); } free(row); } int imgHard(pScene sc,char *data,char key) { PPMimage *pixels; GLint viewport[4]; pPersp p; int xx0,yy0,ww,hh; pixels = (PPMimage*)M_malloc(sizeof(PPMimage),"imgHard"); if ( !pixels ) { fprintf(stderr," ## UNABLE TO ALLOCATE MEMORY FOR IMAGE.\n"); return(0); } p = sc->persp; if ( abs(p->rubfx-p->rubix) > 0 ) { ww = abs(p->rubfx-p->rubix)-2; hh = abs(p->rubfy-p->rubiy)-2; xx0 = min(p->rubix,p->rubfx)+1; yy0 = min(p->rubiy,p->rubfy)+1; } else { glGetIntegerv(GL_VIEWPORT,viewport); ww = viewport[2]; hh = viewport[3]; xx0 = 0; yy0 = 0; } /* align to 8 bytes */ ww = ww & ~7; hh = hh & ~7; pixels->sizeX = (short)ww; pixels->sizeY = (short)hh; pixels->data = (ubyte*)M_calloc(3*ww*hh,sizeof(ubyte),"imgHard.data"); if ( !pixels->data ) { fprintf(stderr," ## Not enough memory to save image.\n"); M_free(pixels); return(0); } if ( ddebug ) fprintf(stdout,"size %d x %d\n",ww,hh); glFinish(); if ( saveimg ) glReadBuffer(GL_BACK_LEFT); else glReadBuffer(GL_FRONT); glPixelStorei(GL_PACK_ALIGNMENT,4); glPixelStorei(GL_PACK_ROW_LENGTH,0); glPixelStorei(GL_PACK_SKIP_ROWS,0); glPixelStorei(GL_PACK_SKIP_PIXELS,0); glReadPixels(xx0,yy0,ww,hh,GL_RGB,GL_UNSIGNED_BYTE,pixels->data); if ( glGetError() != GL_NO_ERROR ) { fprintf(stderr," ## Unable to save image\n"); M_free(pixels->data); M_free(pixels); return(0); } if ( key == 'H' ) { swapPixels(pixels); savePPM(data,pixels,P6); } else if ( key == 'T' ) saveTGA(data,pixels->data,ww,hh); M_free(pixels->data); M_free(pixels); return(1); } freefem++-3.38-1/src/medit/image.h000644 000767 000024 00000001067 11406142256 016735 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif enum imgtyp {DEFAULT=0, P2,P3,P5,P6, PS, GREY,RGB,RED,GREEN,BLUE,COLOR}; typedef struct { int sizeX,sizeY; GLubyte *data; } PPMimage; typedef PPMimage *pPPMimage; typedef struct { unsigned char idfield_len; unsigned char cmap_type; unsigned char image_type; unsigned char cmap_spec[5]; unsigned char x_orig[2]; unsigned char y_orig[2]; unsigned char width[2]; unsigned char height[2]; unsigned char pixel_size; unsigned char image_desc; } TGAheader; #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/inmsh2.c000644 000767 000024 00000011445 11406142256 017047 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" int inmsh2(pMesh mesh) { FILE *inp,*inf; pPoint ppt,pp0,pp1,pp2,pp3; pTriangle pt1; pQuad pq1; pEdge pr; int k,disc,ret,degree,dum,ref,tag; char *ptr,data[256],sx[128],sy[128],sz[128]; /* check for .points */ strcpy(data,mesh->name); strcat(data,".points"); inp = fopen(data,"r"); if ( !inp ) return(0); /* check for .faces */ strcpy(data,mesh->name); strcat(data,".faces"); inf = fopen(data,"r"); if ( !inf ) return(0); if ( !quiet ) fprintf(stdout," Reading %s.{points,.faces}\n",mesh->name); /* get number of elements */ /*fgets(data,255,inp); sscanf(data,"%d",&mesh->np);*/ fscanf(inp,"%d",&mesh->np); EatLine(inp); /*fgets(data,255,inf); sscanf(data,"%d",&mesh->ne);*/ fscanf(inf,"%d",&mesh->ne); EatLine(inf); if ( !mesh->np ) { /*|| (mesh->dim == 3 && !mesh->ne) ) {*/ fprintf(stdout," ## No vertex.\n"); fclose(inp); return(-1); } mesh->dim = 3; mesh->nt = mesh->nq = mesh->ntet = mesh->nhex = mesh->nvn = 0; /* first pass get number of faces */ for (k=1; k<=mesh->ne; k++) { fscanf(inf,"%d",°ree); if ( degree < 2 || degree > 4 ) { fprintf(stdout," ## Wrong degree\n"); fclose(inp); fclose(inf); return(0); } else if ( degree == 2 ) mesh->na++; else if ( degree == 3 ) mesh->nt++; else if ( degree == 4 ) mesh->nq++; /*fgets(data,80,inf);*/ EatLine(inf); } /* check if vertices and elements found */ if ( !mesh->np ) { /*|| mesh->ne == 0 ) {*/ fclose(inp); fclose(inf); return(0); } /* memory allocation for mesh */ if ( zaldy1(mesh) != TRUE ) { fclose(inp); fclose(inf); return(0); } /* read mesh vertices */ for(k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; /* parse coordinates into strings */ ret = fscanf(inp,"%s %s %s %d",sx,sy,sz,&ref); if ( ret != 4 ) { fclose(inp); fclose(inf); return(0); } if ( ptr = strpbrk(sx,"dD") ) *ptr = 'E'; if ( ptr = strpbrk(sy,"dD") ) *ptr = 'E'; if ( ptr = strpbrk(sz,"dD") ) *ptr = 'E'; /* sscanf(sx,"%f",&ppt->c[0]); sscanf(sy,"%f",&ppt->c[1]); sscanf(sz,"%f",&ppt->c[2]); */ ppt->c[0] = atof(sx); ppt->c[1] = atof(sy); ppt->c[2] = atof(sz); ppt->ref = ref; ppt->tag = M_UNUSED; } fclose(inp); /* allocate memory for mesh edges */ if ( mesh->na > 0 ) { mesh->edge = (pEdge)M_calloc(mesh->na+1,sizeof(Edge),"inmsh2.edge"); if ( !mesh->edge ) { fprintf(stderr," ## WARN 0004, INMESH, %d\n",mesh->na); fclose(inf); return(1); } } /* read mesh faces */ rewind(inf); /*fgets(data,255,inf); sscanf(data,"%d",&mesh->ne);*/ fscanf(inf,"%d",&mesh->ne); EatLine(inf); mesh->nt = 0; mesh->nq = 0; mesh->na = 0; disc = 0; for (k=1; k<=mesh->ne; k++) { fscanf(inf,"%d",°ree); if ( degree == 2 ) { pr = &mesh->edge[++mesh->na]; fscanf(inf,"%d %d %d %d %d\n",&pr->v[0],&pr->v[1],&tag,&dum,&dum); pr->tag = tag == 0 ? M_NOTAG : M_TAG; pp0 = &mesh->point[pr->v[0]]; pp1 = &mesh->point[pr->v[1]]; pp0->tag = M_NOTAG; pp1->tag = M_NOTAG; } else if ( degree == 3 ) { pt1 = &mesh->tria[++mesh->nt]; fscanf(inf,"%d %d %d %d %d %d %d\n",&pt1->v[0],&pt1->v[1],&pt1->v[2], &ref,&dum,&dum,&dum); if ( pt1->v[0] <= 0 || pt1->v[0] > mesh->np || pt1->v[1] <= 0 || pt1->v[1] > mesh->np || pt1->v[2] <= 0 || pt1->v[2] > mesh->np ) { fprintf(stdout," ## Wrong index\n"); disc++; pt1->v[0] = 0; continue; } pt1->ref = fabs(ref); pp0 = &mesh->point[pt1->v[0]]; pp1 = &mesh->point[pt1->v[1]]; pp2 = &mesh->point[pt1->v[2]]; pp0->tag = M_NOTAG; pp1->tag = M_NOTAG; pp2->tag = M_NOTAG; } else if ( degree == 4 ) { pq1 = &mesh->quad[++mesh->nq]; fscanf(inf,"%d %d %d %d",&pq1->v[0],&pq1->v[1],&pq1->v[2],&pq1->v[3]); fscanf(inf,"%d %d %d %d %d",&ref,&dum,&dum,&dum,&dum); if ( pq1->v[0] <= 0 || pq1->v[0] > mesh->np || pq1->v[1] <= 0 || pq1->v[1] > mesh->np || pq1->v[2] <= 0 || pq1->v[2] > mesh->np || pq1->v[3] <= 0 || pq1->v[3] > mesh->np ) { fprintf(stdout," ## Wrong index\n"); disc++; pq1->v[0] = 0; continue; } pq1->ref = fabs(ref); pp0 = &mesh->point[ pq1->v[0] ]; pp1 = &mesh->point[ pq1->v[1] ]; pp2 = &mesh->point[ pq1->v[2] ]; pp3 = &mesh->point[ pq1->v[3] ]; pp0->tag = M_NOTAG; pp1->tag = M_NOTAG; pp2->tag = M_NOTAG; pp3->tag = M_NOTAG; } } fclose(inf); if ( disc > 0 ) { fprintf(stdout," ## %d entities discarded\n",disc); } return(1); } freefem++-3.38-1/src/medit/inout.c000755 000767 000024 00000050531 11406142256 017007 0ustar00hechtstaff000000 000000 #include "medit.h" #include "libmesh5.h" #include "extern.h" int loadMesh(pMesh mesh) { pPoint ppt; pEdge pr; pTriangle pt; pQuad pq; pTetra ptet; pHexa ph; double d,dp1,dp2,dp3,dn[3]; float *n,fp1,fp2,fp3; int i,ia,ib,inm,ref,is,k,disc,nn,nt,nq; char *ptr,data[256]; printf("use loadMesh\n"); /* default */ strcpy(data,mesh->name); ptr = strstr(data,".mesh"); if ( !ptr ) { strcat(data,".meshb"); if ( !(inm = GmfOpenMesh(data,GmfRead,&mesh->ver,&mesh->dim)) ) { ptr = strstr(data,".mesh"); *ptr = '\0'; strcat(data,".mesh"); if ( !(inm = GmfOpenMesh(data,GmfRead,&mesh->ver,&mesh->dim)) ) { fprintf(stderr," ** %s NOT FOUND.\n",data); return(-1); } } } else if (!(inm = GmfOpenMesh(data,GmfRead,&mesh->ver,&mesh->dim)) ) { fprintf(stderr," ** %s NOT FOUND.\n",data); return(-1); } if ( !quiet ) fprintf(stdout," Reading %s\n",data); /* parse keywords */ mesh->np = GmfStatKwd(inm,GmfVertices); printf("mesh->np=%i\n",mesh->np); mesh->nt = GmfStatKwd(inm,GmfTriangles); printf("mesh->np=%i\n",mesh->nt); mesh->nq = GmfStatKwd(inm,GmfQuadrilaterals); mesh->ntet = GmfStatKwd(inm,GmfTetrahedra); mesh->nhex = GmfStatKwd(inm,GmfHexahedra); mesh->nc = GmfStatKwd(inm,GmfCorners); mesh->nr = GmfStatKwd(inm,GmfRequiredVertices); mesh->na = GmfStatKwd(inm,GmfEdges); mesh->nri = GmfStatKwd(inm,GmfRidges); mesh->nre = GmfStatKwd(inm,GmfRequiredEdges); mesh->nvn = GmfStatKwd(inm,GmfNormals); mesh->ntg = GmfStatKwd(inm,GmfTangents); mesh->ne = mesh->nt + mesh->nq + mesh->ntet + mesh->nhex; /* check space dimension */ if ( mesh->dim < 2 || mesh->dim > 3 ) { fprintf(stdout," ## Wrong dim\n"); GmfCloseMesh(inm); return(-1); } /* check if vertices and elements found */ if ( !mesh->np ) { fprintf(stdout," ## No vertex\n"); GmfCloseMesh(inm); return(-1); } /* memory allocation for mesh */ if ( !zaldy1(mesh) ) { GmfCloseMesh(inm); return(-1); } /* read mesh vertices */ GmfGotoKwd(inm,GmfVertices); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( mesh->ver == GmfFloat ) { if ( mesh->dim == 2 ) { GmfGetLin(inm,GmfVertices,&fp1,&fp2,&ref); ppt->c[0] = fp1; ppt->c[1] = fp2; printf("vertices %f %f %i\n",fp1,fp2,ref); } else { GmfGetLin(inm,GmfVertices,&fp1,&fp2,&fp3,&ref); ppt->c[0] = fp1; ppt->c[1] = fp2; ppt->c[2] = fp3; } } else { if ( mesh->dim == 2 ) { GmfGetLin(inm,GmfVertices,&dp1,&dp2,&ref); ppt->c[0] = dp1; ppt->c[1] = dp2; } else { GmfGetLin(inm,GmfVertices,&dp1,&dp2,&dp3,&ref); ppt->c[0] = dp1; ppt->c[1] = dp2; ppt->c[2] = dp3; } } ppt->ref = ref & 0x7fff; ppt->tag = M_UNUSED; } /* read mesh triangles */ disc = 0 ; GmfGotoKwd(inm,GmfTriangles); for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; GmfGetLin(inm,GmfTriangles,&pt->v[0],&pt->v[1],&pt->v[2],&ref); pt->ref = ref & 0x7fff; for (i=0; i<3; i++) { if ( pt->v[i] < 1 || pt->v[i] > mesh->np ) { disc++; pt->v[0] = 0; break; } else { ppt = &mesh->point[pt->v[i]]; ppt->tag &= ~M_UNUSED; } } } /* mesh quadrilaterals */ GmfGotoKwd(inm,GmfQuadrilaterals); for (k=1; k<=mesh->nq; k++) { pq = &mesh->quad[k]; GmfGetLin(inm,GmfQuadrilaterals,&pq->v[0],&pq->v[1],&pq->v[2],&pq->v[3],&ref); pq->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( pq->v[i] < 1 || pq->v[i] > mesh->np ) { disc++; pq->v[0] = 0; break; } else { ppt = &mesh->point[pq->v[i]]; ppt->tag &= ~M_UNUSED; } } } /* mesh tetrahedra */ GmfGotoKwd(inm,GmfTetrahedra); for (k=1; k<=mesh->ntet; k++) { ptet = &mesh->tetra[k]; GmfGetLin(inm,GmfTetrahedra,&ptet->v[0],&ptet->v[1],&ptet->v[2],&ptet->v[3],&ref); ptet->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( ptet->v[i] < 1 || ptet->v[i] > mesh->np ) { disc++; ptet->v[0] = 0; break; } else { ppt = &mesh->point[ptet->v[i]]; ppt->tag &= ~M_UNUSED; } } } /* mesh hexahedra */ GmfGotoKwd(inm,GmfHexahedra); for (k=1; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; GmfGetLin(inm,GmfHexahedra,&ph->v[0],&ph->v[1],&ph->v[2],&ph->v[3], &ph->v[4],&ph->v[5],&ph->v[6],&ph->v[7],&ref); ph->ref = ref & 0x7fff; for (i=0; i<8; i++) { if ( ph->v[i] < 1 || ph->v[i] > mesh->np ) { disc++; ph->v[0] = 0; break; } else { ppt = &mesh->point[ph->v[i]]; ppt->tag &= ~M_UNUSED; } } } /* mesh corners */ GmfGotoKwd(inm,GmfCorners); for (k=1; k<=mesh->nc; k++) { GmfGetLin(inm,GmfCorners,&is); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_CORNER; ppt->tag &= ~M_UNUSED; } } /* required vertices */ GmfGotoKwd(inm,GmfRequiredVertices); for (k=1; k<=mesh->nr; k++) { GmfGetLin(inm,GmfRequiredVertices,&is); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_REQUIRED; ppt->tag &= ~M_UNUSED; } } /*mesh edges */ GmfGotoKwd(inm,GmfEdges); for (k=1; k<=mesh->na; k++) { GmfGetLin(inm,GmfEdges,&ia,&ib,&ref); if ( ia < 1 || ia > mesh->np || ib < 1 || ib > mesh->np ) disc++; else { pr = &mesh->edge[k]; pr->v[0] = ia; pr->v[1] = ib; pr->ref = ref & 0x7fff; pr->tag = !pr->ref ? M_NOTAG : M_TAG; ppt = &mesh->point[ia]; ppt->tag &= ~M_UNUSED; ppt = &mesh->point[ib]; ppt->tag &= ~M_UNUSED; } } /* mesh ridges */ GmfGotoKwd(inm,GmfRidges); for (k=1; k<=mesh->nri; k++) { GmfGetLin(inm,GmfRidges,&is); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_RIDGE; } } /* required edges */ GmfGotoKwd(inm,GmfRequiredEdges); for (k=1; k<=mesh->nre; k++) { GmfGetLin(inm,GmfRequiredEdges,&is); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_REQUIRED; } } /* mesh normals */ GmfGotoKwd(inm,GmfNormals); for (k=1; k<=mesh->nvn; k++) { n = &mesh->extra->n[3*(k-1)+1]; if ( mesh->ver == GmfFloat ) GmfGetLin(inm,GmfNormals,&n[0],&n[1],&n[2]); else { GmfGetLin(inm,GmfNormals,&dn[0],&dn[1],&dn[2]); n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; } d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } } if ( mesh->nvn ) { /* normals at vertices */ mesh->extra->iv = GmfStatKwd(inm,GmfNormalAtVertices); mesh->extra->nv = (int*)M_calloc(mesh->np+1,sizeof(int),"inmesh"); assert(mesh->extra->nv); GmfGotoKwd(inm,GmfNormalAtVertices); for (k=1; k<=mesh->extra->iv; k++) { GmfGetLin(inm,GmfNormalAtVertices,&nn,&is); if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->nv[nn] = is; } /* normals at triangle vertices */ mesh->extra->it = GmfStatKwd(inm,GmfNormalAtTriangleVertices); mesh->extra->nt = (int*)M_calloc(3*mesh->nt+1,sizeof(int),"inmesh"); assert(mesh->extra->nt); GmfGotoKwd(inm,GmfNormalAtTriangleVertices); for (k=1; k<=mesh->extra->it; k++) { GmfGetLin(inm,GmfNormalAtTriangleVertices,&nt,&is,&nn); if ( nt < 1 || nt > mesh->nt || is < 1 || is > 3 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nt[3*(nt-1)+is] = nn; } /*normals at quadrilateral vertices */ mesh->extra->iq = GmfStatKwd(inm,GmfNormalAtQuadrilateralVertices); mesh->extra->nq = (int*)M_calloc(4*mesh->nq+1,sizeof(int),"inmesh"); assert(mesh->extra->nq); GmfGotoKwd(inm,GmfNormalAtQuadrilateralVertices); for (k=1; k<=mesh->extra->iq; k++) { GmfGetLin(inm,GmfNormalAtQuadrilateralVertices,&nq,&is,&nn); if ( nq < 1 || nq > mesh->nq || is < 1 || is > 4 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nq[3*(nq-1)+is] = nn; } } /*mesh tangents */ GmfGotoKwd(inm,GmfTangents); for (k=1; k<=mesh->ntg; k++) { n = &mesh->extra->t[3*(k-1)+1]; if ( mesh->ver == GmfFloat ) GmfGetLin(inm,GmfTangents,&n[0],&n[1],&n[2]); else { GmfGetLin(inm,GmfTangents,&dn[0],&dn[1],&dn[2]); n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; } d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } } if (mesh->ntg ) { /*tangents at vertices */ mesh->extra->jv = GmfStatKwd(inm,GmfTangentAtVertices); mesh->extra->tv = (int*)M_calloc(mesh->np+1,sizeof(int),"inmesh"); assert(mesh->extra->tv); GmfGotoKwd(inm,GmfTangentAtVertices); for (k=1; k<=mesh->extra->jv; k++) { GmfGetLin(inm,GmfTangentAtVertices,&nn,&is); if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->tv[nn] = is; } /* tangent at edge vertices */ mesh->extra->je = GmfStatKwd(inm,GmfTangentAtEdgeVertices); mesh->extra->te = (int*)M_calloc(2*mesh->na+1,sizeof(int),"inmesh"); assert(mesh->extra->te); GmfGotoKwd(inm,GmfTangentAtEdgeVertices); for (k=1; k<=mesh->extra->je; k++) { GmfGetLin(inm,GmfTangentAtEdgeVertices,&nt,&is,&nn); if ( nt < 1 || nt > mesh->np || is < 1 || is > 2 || nn < 1 || nn > mesh->ntg ) disc++; else mesh->extra->te[3*(nt-1)+is] = is; } } GmfCloseMesh(inm); if ( disc > 0 ) { fprintf(stdout," ## %d entities discarded\n",disc); } return(1); } /*mark clipped elements */ static int markPt(pMesh mesh) { pTriangle pt; pQuad pq; pPoint ppt; int i,k,pos,neg,nul; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag & M_UNUSED ) continue; ppt->tmp = 0; } for (k=1; k<=mesh->nt; k++ ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; pos = neg = nul = 0; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; if ( ppt->clip == 2 ) pos++; else if ( ppt->clip == 1 ) neg++; else nul++; } if ( pos && pos+nul < 4 ) { for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; ppt->tmp = 1; } } } for (k=1; k<=mesh->nq; k++ ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) continue; pos = neg = nul = 0; for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; if ( ppt->clip == 2 ) pos++; else if ( ppt->clip == 1 ) neg++; else nul++; } if ( pos && pos+nul < 5 ) { for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; ppt->tmp = 1; } } } return(1); } /* save (part of) mesh to disk */ int saveMesh(pScene sc,pMesh mesh,char *fileout,ubyte clipon) { pPoint ppt; pTriangle pt; pQuad pq; pTetra ptt; pMaterial pm; float fp1,fp2,fp3; int outm,i,k,m,ver,np,nt,nq,ref; ver = GmfFloat; if ( !(outm = GmfOpenMesh(fileout,GmfWrite,ver,mesh->dim)) ) { fprintf(stderr," ** UNABLE TO OPEN %s.\n",fileout); return(0); } fprintf(stdout," %%%% %s OPENED\n",fileout); /*compact vertices */ if ( clipon ) markPt(mesh); np = 0; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag & M_UNUSED ) continue; ppt->tmp = ++np; } GmfSetKwd(outm,GmfVertices,np); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag & M_UNUSED ) continue; ref = ppt->ref; if ( mesh->dim == 2 ) { fp1 = ppt->c[0] + mesh->xtra; fp2 = ppt->c[1] + mesh->ytra; ref = ppt->ref; GmfSetLin(outm,GmfVertices,fp1,fp2,ref); } else { fp1 = ppt->c[0] + mesh->xtra; fp2 = ppt->c[1] + mesh->ytra; fp3 = ppt->c[2] + mesh->ztra; ref = ppt->ref; GmfSetLin(outm,GmfVertices,fp1,fp2,fp3,ref); } } /* write triangles */ nt = 0; for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; m = matRef(sc,pt->ref); pm = &sc->material[m]; if ( pm->flag ) continue; for (i=0; i<3; i++) if ( !mesh->point[pt->v[i]].tmp ) break; if ( i == 3 ) nt++; } GmfSetKwd(outm,GmfTriangles,nt); for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; m = matRef(sc,pt->ref); pm = &sc->material[m]; if ( pm->flag ) continue; for (i=0; i<3; i++) if ( !mesh->point[pt->v[i]].tmp ) break; if ( i < 3 ) continue; ref = pt->ref; GmfSetLin(outm,GmfTriangles,mesh->point[pt->v[0]].tmp,mesh->point[pt->v[1]].tmp, mesh->point[pt->v[2]].tmp,ref); } /* write quads */ nq = 0; for (k=1; k<=mesh->nq; k++) { pq = &mesh->quad[k]; if ( !pq->v[0] ) continue; m = matRef(sc,pq->ref); pm = &sc->material[m]; if ( pm->flag ) continue; for (i=0; i<4; i++) if ( !mesh->point[pq->v[i]].tmp ) break; if ( i == 4 ) nq++; } GmfSetKwd(outm,GmfQuadrilaterals,nq); for (k=1; k<=mesh->nq; k++) { pq = &mesh->quad[k]; if ( !pq->v[0] ) continue; m = matRef(sc,pq->ref); pm = &sc->material[m]; if ( pm->flag ) continue; for (i=0; i<4; i++) if ( !mesh->point[pq->v[i]].tmp ) break; if ( i < 4 ) continue; ref = pq->ref; GmfSetLin(outm,GmfQuadrilaterals,mesh->point[pq->v[0]].tmp,mesh->point[pq->v[1]].tmp, mesh->point[pq->v[2]].tmp,mesh->point[pq->v[3]].tmp,ref); } /* write tetrahedra */ GmfSetKwd(outm,GmfTetrahedra,mesh->ntet); for (k=1; k<=mesh->ntet; k++) { ptt = &mesh->tetra[k]; if ( !ptt->v[0] ) continue; m = matRef(sc,ptt->ref); pm = &sc->material[m]; if ( pm->flag ) continue; for (i=0; i<4; i++) if ( !mesh->point[ptt->v[i]].tmp ) break; if ( i < 4 ) continue; ref = ptt->ref; GmfSetLin(outm,GmfTetrahedra,mesh->point[ptt->v[0]].tmp,mesh->point[ptt->v[1]].tmp, mesh->point[ptt->v[2]].tmp,mesh->point[ptt->v[3]].tmp,ref); } /* write hexahedra */ if ( !quiet ) { fprintf(stdout," TOTAL NUMBER OF VERTICES %8d\n",np); fprintf(stdout," TOTAL NUMBER OF TRIANGLES %8d\n",nt); fprintf(stdout," TOTAL NUMBER OF QUADS %8d\n",nq); fprintf(stdout," TOTAL NUMBER OF TETRA %8d\n",mesh->ntet); } GmfCloseMesh(outm); return(1); } /* load solution (metric) */ int loadSol(pMesh mesh,char *filename,int numsol) { pSolution sol; double dbuf[ GmfMaxTyp ]; float fbuf[ GmfMaxTyp ]; double m[6],lambda[3],eigv[3][3],vp[2][2]; int inm,k,i,key,nel,size,type,iord,off,typtab[GmfMaxTyp],ver,dim; char *ptr,data[128]; strcpy(data,filename); ptr = strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; strcat(data,".solb"); if (!(inm = GmfOpenMesh(data,GmfRead,&ver,&dim)) ) { ptr = strstr(data,".sol"); *ptr = '\0'; strcat(data,".sol"); if (!(inm = GmfOpenMesh(data,GmfRead,&ver,&dim)) ) return(0); } if ( !quiet ) fprintf(stdout," Reading %s\n",data); if ( dim != mesh->dim ) { fprintf(stderr," %%%% Wrong dimension %d.\n",dim); GmfCloseMesh(inm); return(0); } nel = GmfStatKwd(inm,GmfSolAtVertices,&type,&size,typtab); if ( nel ) { if ( nel > mesh->np ) { fprintf(stderr," %%%% Wrong number: %d Solutions discarded\n",nel-mesh->np); } mesh->typage = 2; key = GmfSolAtVertices; } else { mesh->typage = 1; if ( mesh->dim == 2 && mesh->nt ) { //if( mesh->nt){ nel = GmfStatKwd(inm,GmfSolAtTriangles,&type,&size,typtab); if ( nel && nel != mesh->nt ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); GmfCloseMesh(inm); return(0); } key = GmfSolAtTriangles; } else if ( mesh->dim == 2 && mesh->nq ) { nel = GmfStatKwd(inm,GmfSolAtQuadrilaterals,&type,&size,typtab); if ( nel && nel != mesh->nq ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); GmfCloseMesh(inm); return(0); } key = GmfSolAtQuadrilaterals; } else if ( mesh->ntet ) { nel = GmfStatKwd(inm,GmfSolAtTetrahedra,&type,&size,typtab); if ( nel && nel != mesh->ntet ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); GmfCloseMesh(inm); return(0); } key = GmfSolAtTetrahedra; } else if ( mesh->nhex ) { nel = GmfStatKwd(inm,GmfSolAtHexahedra,&type,&size,typtab); if ( nel && nel != mesh->nhex ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); GmfCloseMesh(inm); return(0); } key = GmfSolAtHexahedra; } } if ( !nel ) return(1); if(ddebug) printf("numsol=%i, type=%i, size=%i\n",numsol,type,size); if ( numsol > type ) numsol = 1; numsol--; mesh->nbb = nel; mesh->bbmin = 1.0e20; mesh->bbmax = -1.0e20; if ( !zaldy2(mesh) ) { GmfCloseMesh(inm); return(0); } sol = mesh->sol; sol->dim = dim; sol->ver = ver; off = 0; for (i=0; idim; break; case GmfSymMat: off += sol->dim*(sol->dim+1)/2; break; } } if(ddebug) printf("typtab[%i]=%i, off%i",i,typtab[i],off); GmfGotoKwd(inm,key); if(ddebug) printf("numsol=%i,typtab[i]=%i\n",numsol,typtab[i]); switch(typtab[numsol]) { case GmfSca: if ( ddebug ) printf(" scalar field\n"); mesh->nfield = 1; for (k=1; k<=nel; k++) { if ( sol->ver == GmfFloat ) GmfGetLin(inm,key,fbuf); else { GmfGetLin(inm,key,dbuf); for (i=0; isol[k].bb = fbuf[off]; if(ddebug) printf("valeur donneer %i %f\n",k,fbuf[off]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } break; case GmfVec: if ( ddebug ) printf(" vector field\n"); mesh->nfield = sol->dim; for (k=1; k<=nel; k++) { mesh->sol[k].bb = 0.0; if ( sol->ver == GmfFloat ) GmfGetLin(inm,key,fbuf); else { GmfGetLin(inm,key,dbuf); for (i=0; idim; i++) { mesh->sol[k].m[i] = fbuf[off+i]; if(ddebug) printf("valeur donner %i composante %i %f\n",k,i,fbuf[off+i]); mesh->sol[k].bb += fbuf[off+i]*fbuf[off+i]; } mesh->sol[k].bb = sqrt(mesh->sol[k].bb); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } break; case GmfSymMat: if ( ddebug ) printf(" metric field\n"); mesh->nfield = sol->dim*(sol->dim+1) / 2; for (k=1; k<=nel; k++) { if ( sol->ver == GmfFloat ) GmfGetLin(inm,key,fbuf); else { GmfGetLin(inm,key,dbuf); for (i=0; idim == 2 ) { for (i=0; i<3; i++) mesh->sol[k].m[i] = m[i] = fbuf[off+i]; iord = eigen2(m,lambda,vp); mesh->sol[k].bb = min(lambda[0],lambda[1]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } else { for (i=0; i<6; i++) mesh->sol[k].m[i] = fbuf[off+i]; mesh->sol[k].m[2] = fbuf[off+3]; mesh->sol[k].m[3] = fbuf[off+2]; for (i=0; i<6; i++) m[i] = mesh->sol[k].m[i]; iord = eigenv(1,m,lambda,eigv); if ( iord ) { mesh->sol[k].bb = lambda[0]; mesh->sol[k].bb = max(mesh->sol[k].bb,lambda[1]); mesh->sol[k].bb = max(mesh->sol[k].bb,lambda[2]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } } } break; } GmfCloseMesh(inm); return(1); } freefem++-3.38-1/src/medit/inout_morice.c000755 000767 000024 00000106730 11500006113 020332 0ustar00hechtstaff000000 000000 #include "medit.h" #include "libmesh5.h" #include "extern.h" #include "string.h" static int debug=0; void getline_number(char *nature, int *nb){ char data[256]; char *tictac; fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of %s\n",nature); exit(1); } else{ //printf("tictac=%s\n",tictac); *nb = atoi(tictac); if(debug) fprintf(stdout,"Number of %s %i \n",nature,*nb); } } void getline_1int(char *nature, int *nbint){ char data[256]; char *tictac; fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the %s",nature); exit(1); } *nbint = atoi(tictac); } void getline_1intfirst(char *nature, int *nbint){ char data[256]; char *tictac; fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ fgets(data,256,stdin); tictac = strtok(data," \n"); } if(tictac == NULL){ printf("problem in reading the first %s",nature); exit(1); } *nbint = atoi(tictac); } void getline_popen_vertex(int ddim, double *c, int *ref){ char data[256]; char *tictac; int i; int lench; char keyseE[]="eE"; char keyse[]="e"; float res; fgets(data,256,stdin); c[0]= strtod(data,&tictac); //printf("valeur strtod c[0] %f c%sc \n",c[0], tictac); for(i=1; inp = 0; mesh->nt = 0; mesh->nq = 0; mesh->ntet = 0; mesh->nhex = 0; mesh->nc = 0; mesh->nr = 0; mesh->na = 0; mesh->nri = 0; mesh->nre = 0; mesh->nvn = 0; mesh->ntg = 0; mesh->ne = mesh->nt + mesh->nq + mesh->ntet + mesh->nhex; //int tablecture[5]; //tablecture = loopdebug = -1; while( !feof(stdin) ){ fgets(data,256,stdin); tictac = strtok(data," \n"); loopdebug=loopdebug+1; //fprintf(stdout,"%i: data %s \n",loopdebug,data); //fprintf(stdout,"%i: tictac %s \n",loopdebug,tictac); //fprintf(stdout,"%i: capture vertex %i\n",loopdebug,strcmp(tictac,"Vertices")); //fprintf(stdout,"%s\n",tictac); if(tictac == NULL) continue; if( !strncmp(tictac,"MeshVersionFormatted",20) ){ /* read mesh format */ natureread="MeshVersionFormatted"; getline_number( natureread, &(mesh->ver) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); //fprintf(stdout,"tictac= %s\n",tictac); if(tictac == NULL){ printf("problem in reading the %s\n",natureread); exit(1); } else{ mesh->ver = atoi(tictac); } fprintf(stdout,"reading format %s %i \n",natureread,mesh->ver); */ } else if( !strncmp(tictac,"Dimension",9) ){ /* read mesh dimension */ natureread="Dimension"; getline_number( natureread, &(mesh->dim) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); //fprintf(stdout,"tictac= %s\n",tictac); if(tictac == NULL){ printf("problem in reading the %s\n",natureread); exit(1); } else{ mesh->dim = atoi(tictac); if(debug) printf("%s %i\n",natureread,mesh->dim); } */ /*control of the dimension*/ if( (mesh->dim != 2) && (mesh->dim != 3) ){ printf("the dimension is not correct"); } } else if( !strncmp(tictac,"Vertices",8) ){ /* read mesh vetices */ natureread="Vertices"; getline_number( natureread, &(mesh->np) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of %s\n",natureread); exit(1); } else{ mesh->np = atoi(tictac); if(debug) fprintf(stdout,"Number of %s %i\n",natureread,mesh->np); } */ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* Allocation of array of vertices */ if ( ddebug ) printf("allocate %d points\n",mesh->np); mesh->point = (pPoint)M_calloc(mesh->np+1,sizeof(Point),"zaldy1.point"); assert(mesh->point); /* read the first vertex */ k=1; ppt = &mesh->point[k]; getline_popen_firstvertex(mesh->dim, ppt->c, &ref); ppt->ref = ref & 0x7fff; ppt->tag = M_UNUSED; /* read the other vertices */ for (k=2; k<=mesh->np; k++) { ppt = &mesh->point[k]; getline_popen_vertex(mesh->dim, ppt->c, &ref); //fprintf(stdout,"sortie vertex:= %i %i \n", k, ref); ppt->ref = ref & 0x7fff; ppt->tag = M_UNUSED; } } else if( !strncmp(tictac,"Triangles",9) ){ natureread="Triangles"; getline_number( natureread, &(mesh->nt) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of triangles"); exit(1); } else{ mesh->nt = atoi(tictac); } */ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* Allocation of array of triangles */ if ( ddebug ) printf("allocate %d tria\n",mesh->nt); mesh->tria = (pTriangle)M_calloc(mesh->nt+1,sizeof(Triangle),"zaldy1.tria"); assert(mesh->tria); /* read the first triangle */ k=1; disc = 0; pt = &mesh->tria[k]; getline_popen_firstelem( 3, pt->v, &ref); pt->ref = ref & 0x7fff; for (i=0; i<3; i++) { if ( pt->v[i] < 1 || pt->v[i] > mesh->np ) { disc++; pt->v[0] = 0; break; } else { ppt = &mesh->point[pt->v[i]]; ppt->tag &= ~M_UNUSED; } } /* read mesh triangles */ for (k=2; k<=mesh->nt; k++) { pt = &mesh->tria[k]; getline_popen_elem( 3, pt->v, &ref); pt->ref = ref & 0x7fff; for (i=0; i<3; i++) { if ( pt->v[i] < 1 || pt->v[i] > mesh->np ) { disc++; pt->v[0] = 0; break; } else { ppt = &mesh->point[pt->v[i]]; ppt->tag &= ~M_UNUSED; } } } } else if( !strncmp(tictac,"Quadrilaterals",14) ){ natureread="Quadrilaterals"; getline_number( natureread, &(mesh->nq) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of Quadrilaterals"); exit(1); } else{ mesh->nq = atoi(tictac); } */ /****************/ /* allocation */ if ( ddebug ) printf("allocate %d quad\n",mesh->nq); if ( mesh->nq ) { mesh->quad = (pQuad)M_calloc(mesh->nq+1,sizeof(Quad),"zaldy1.quad"); assert(mesh->quad); } k=1; pq = &mesh->quad[k]; getline_popen_firstelem( 4, pq->v, &ref); pq->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( pq->v[i] < 1 || pq->v[i] > mesh->np ) { disc++; pq->v[0] = 0; break; } else { ppt = &mesh->point[pq->v[i]]; ppt->tag &= ~M_UNUSED; } } for (k=2; k<=mesh->nq; k++) { pq = &mesh->quad[k]; getline_popen_elem( 4, pq->v, &ref); pq->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( pq->v[i] < 1 || pq->v[i] > mesh->np ) { disc++; pq->v[0] = 0; break; } else { ppt = &mesh->point[pq->v[i]]; ppt->tag &= ~M_UNUSED; } } } } else if( !strncmp(tictac,"Tetrahedra",10) ){ natureread="Tetrahedra"; getline_number( natureread, &(mesh->ntet) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of Tetrahedrons"); exit(1); } else{ mesh->ntet = atoi(tictac); } */ /******************************/ /* allocation de la memoire */ if ( mesh->ntet ) { if ( ddebug ) printf("allocate %d tetra\n",mesh->ntet); mesh->tetra = (pTetra)M_calloc(mesh->ntet+1,sizeof(Tetra),"zaldy1.tetra"); assert(mesh->tetra); } k=1; //printf("valeur de k%i",k); ptet = &mesh->tetra[k]; getline_popen_elem( 4, ptet->v, &ref); //printf("valeur de k%i",k); ptet->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( ptet->v[i] < 1 || ptet->v[i] > mesh->np ) { disc++; ptet->v[0] = 0; break; } else { ppt = &mesh->point[ptet->v[i]]; ppt->tag &= ~M_UNUSED; } } for (k=2; k<=mesh->ntet; k++) { //printf("valeur de k%i",k); ptet = &mesh->tetra[k]; getline_popen_elem( 4, ptet->v, &ref); //printf("valeur de k%i",k); ptet->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( ptet->v[i] < 1 || ptet->v[i] > mesh->np ) { disc++; ptet->v[0] = 0; break; } else { ppt = &mesh->point[ptet->v[i]]; ppt->tag &= ~M_UNUSED; } } } } /* mesh hexahedra */ else if( !strncmp(tictac,"Hexahedra",9) ){ natureread="Hexahedra"; getline_number( natureread, &(mesh->nhex) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of Hexahedrons"); exit(1); } else{ mesh->nhex = atoi(tictac); //fprintf(stdout,"mesh->nbex %i \n",mesh->nbex); } */ /******************************/ /* allocation de la memoire */ if ( ddebug ) printf("allocate %d hexa\n",mesh->nhex); mesh->hexa = (pHexa)M_calloc(mesh->nhex+1,sizeof(Hexa),"zaldy1.hexa"); assert(mesh->hexa); k=1; ph = &mesh->hexa[k]; getline_popen_firstelem( 8, ph->v, &ref); ph->ref = ref & 0x7fff; for (i=0; i<8; i++) { if ( ph->v[i] < 1 || ph->v[i] > mesh->np ) { disc++; ph->v[0] = 0; break; } else { ppt = &mesh->point[ph->v[i]]; ppt->tag &= ~M_UNUSED; } } for (k=2; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; getline_popen_elem( 8, ph->v, &ref); ph->ref = ref & 0x7fff; for (i=0; i<8; i++) { if ( ph->v[i] < 1 || ph->v[i] > mesh->np ) { disc++; ph->v[0] = 0; break; } else { ppt = &mesh->point[ph->v[i]]; ppt->tag &= ~M_UNUSED; } } } } /* mesh corners */ else if( !strncmp(tictac,"Corners",7) ){ natureread="Corners"; getline_number( natureread, &(mesh->nc) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of Corners"); exit(1); } else{ mesh->nc = atoi(tictac); fprintf(stdout,"Number of corners %i \n",mesh->nc); } */ fgets(data,256,stdin); if(tictac == NULL){ fgets(data,256,stdin); tictac = strtok(data," \n"); } if(tictac == NULL) printf("problem in reading the first corner"); tictac = strtok(data," \n"); is = atoi(tictac); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_CORNER; ppt->tag &= ~M_UNUSED; } for (k=2; k<=mesh->nc; k++) { fgets(data,256,stdin); tictac = strtok(data," \n"); is = atoi(tictac); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_CORNER; ppt->tag &= ~M_UNUSED; } } } /* required vertices */ else if( !strncmp(tictac,"RequiredVertices",12) ){ natureread="RequiredVertices"; getline_number( natureread, &(mesh->nr) ); /* fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL){ printf("problem in reading the number of RequiredVertices"); exit(1); } else{ mesh->nr = atoi(tictac); fprintf(stdout,"Number of RequiredVertices %i \n",mesh->nr); } */ fgets(data,256,stdin); if(tictac == NULL){ fgets(data,256,stdin); tictac = strtok(data," \n"); } if(tictac == NULL) printf("problem in reading the first RequiredVertex"); tictac = strtok(data," \n"); is = atoi(tictac); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_REQUIRED; ppt->tag &= ~M_UNUSED; } for (k=2; k<=mesh->nr; k++) { fgets(data,256,stdin); tictac = strtok(data," \n"); is = atoi(tictac); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_REQUIRED; ppt->tag &= ~M_UNUSED; } } } /* mesh edges */ else if( !strncmp(tictac,"Edges",5) ){ natureread = "Edges"; getline_number( natureread, &( mesh->na )); fprintf(stdout,"Number of %s %i \n",natureread,mesh->na); /************************/ /* allocation memoire */ if ( ddebug ) printf("allocate %d edges\n",mesh->na); mesh->edge = (pEdge)M_calloc(mesh->na+1,sizeof(Edge),"zaldy1.edge"); assert(mesh->edge); k=1; getline_popen_firstedge( &ia, &ib, &ref); if ( ia < 1 || ia > mesh->np || ib < 1 || ib > mesh->np ) disc++; else { pr = &mesh->edge[k]; pr->v[0] = ia; pr->v[1] = ib; pr->ref = ref & 0x7fff; pr->tag = !pr->ref ? M_NOTAG : M_TAG; ppt = &mesh->point[ia]; ppt->tag &= ~M_UNUSED; ppt = &mesh->point[ib]; ppt->tag &= ~M_UNUSED; } for (k=2; k<=mesh->na; k++) { getline_popen_edge( &ia, &ib, &ref); if ( ia < 1 || ia > mesh->np || ib < 1 || ib > mesh->np ) disc++; else { pr = &mesh->edge[k]; pr->v[0] = ia; pr->v[1] = ib; pr->ref = ref & 0x7fff; pr->tag = !pr->ref ? M_NOTAG : M_TAG; ppt = &mesh->point[ia]; ppt->tag &= ~M_UNUSED; ppt = &mesh->point[ib]; ppt->tag &= ~M_UNUSED; } } } /* mesh ridges */ else if( !strcmp(tictac,"Ridges") ){ natureread = "Ridges"; getline_number( natureread, &(mesh->nri) ); getline_1intfirst( natureread, &is); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_RIDGE; } for (k=2; k<=mesh->nri; k++) { getline_1int( natureread, &is); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_RIDGE; } } } /* required edges */ else if( !strncmp(tictac,"RequiredEdges",13) ){ natureread = "RequiredEdges"; getline_number( natureread, &(mesh->nre) ); getline_1intfirst( natureread, &is); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_REQUIRED; } for (k=2; k<=mesh->nre; k++) { getline_1int( natureread, &is); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_REQUIRED; } } } /* mesh normals */ else if(!strncmp(tictac,"Normals",7)){ natureread = "Normals"; getline_number( natureread, &(mesh->nvn) ); /*****************/ /* allocation */ if ( !mesh->ntg ) { mesh->extra = (pExtra)M_calloc(1,sizeof(Extra),"zaldy1.extra"); assert(mesh->extra); } mesh->extra->n = (float*)M_calloc(3*mesh->nvn+1,sizeof(float),"inmesh"); assert(mesh->extra->n); k=1; n = &mesh->extra->n[3*(k-1)+1]; getline_popen_firstdouble(natureread, 3, dn); n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } for (k=2; k<=mesh->nvn; k++) { n = &mesh->extra->n[3*(k-1)+1]; getline_popen_double(natureread, 3, dn); // modif FH n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } } } else if( !strncmp(tictac,"NormalAtVertices",16) ){ natureread ="NormalAtVertices"; if( !mesh->nvn ){ printf("The field Normal need to be reading before %s",natureread); exit(1); } /* normals at vertices */ getline_number( natureread, &( mesh->extra->iv ) ); mesh->extra->nv = (int*)M_calloc(mesh->np+1,sizeof(int),"inmesh"); assert(mesh->extra->nv); k=1; getline_popen_firstelemnoref(natureread, 2, vatn); nn=vatn[0]; is=vatn[1]; if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->nv[nn] = is; for (k=2; k<=mesh->extra->iv; k++) { //GmfGetLin(inm,GmfNormalAtVertices,&nn,&is); getline_popen_elemnoref(natureread, 2, vatn); nn=vatn[0]; is=vatn[1]; if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->nv[nn] = is; } } else if( !strncmp(tictac,"NormalAtTriangleVertices",24) ){ natureread ="NormalAtTriangleVertices"; if( !mesh->nvn ){ printf("The field Normal need to be reading before %s",natureread); exit(1); } /* normals at triangle vertices */ getline_number( natureread, &( mesh->extra->it ) ); mesh->extra->nt = (int*)M_calloc(3*mesh->nt+1,sizeof(int),"inmesh"); assert(mesh->extra->nt); k=1; getline_popen_elemnoref(natureread, 3, tvatn); //GmfGetLin(inm,GmfNormalAtTriangleVertices,&nt,&is,&nn); tvatn[0] = nt; tvatn[1] = is; tvatn[2] = nn; if ( nt < 1 || nt > mesh->nt || is < 1 || is > 3 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nt[3*(nt-1)+is] = nn; for (k=2; k<=mesh->extra->it; k++) { getline_popen_elemnoref(natureread, 3, tvatn); //GmfGetLin(inm,GmfNormalAtTriangleVertices,&nt,&is,&nn); tvatn[0] = nt; tvatn[1] = is; tvatn[2] = nn; if ( nt < 1 || nt > mesh->nt || is < 1 || is > 3 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nt[3*(nt-1)+is] = nn; } } /*normals at quadrilateral vertices */ else if( !strncmp(tictac,"NormalAtQuadrilateralVertices",19) ){ natureread ="NormalAtQuadrilateralVertices"; if( !mesh->nvn ){ printf("The field Normal need to be reading before %s",natureread); exit(1); } getline_number( natureread, &( mesh->extra->iq ) ); mesh->extra->nq = (int*)M_calloc(4*mesh->nq+1,sizeof(int),"inmesh"); assert(mesh->extra->nq); k=1; getline_popen_firstelemnoref(natureread, 3, tvatn); tvatn[0] = nq; tvatn[1] = is; tvatn[2] = nn; if ( nq < 1 || nq > mesh->nq || is < 1 || is > 4 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nq[3*(nq-1)+is] = nn; for (k=2; k<=mesh->extra->iq; k++) { //GmfGetLin(inm,GmfNormalAtQuadrilateralVertices,&nq,&is,&nn); getline_popen_elemnoref(natureread, 3, tvatn); tvatn[0] = nq; tvatn[1] = is; tvatn[2] = nn; if ( nq < 1 || nq > mesh->nq || is < 1 || is > 4 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nq[3*(nq-1)+is] = nn; } } /*mesh tangents */ else if( !strncmp(tictac,"Tangents",8) ){ natureread = "Tangents"; getline_number( natureread, &(mesh->ntg) ); /*****************/ /* allocation */ if ( !mesh->nvn ) { mesh->extra = (pExtra)M_calloc(1,sizeof(Extra),"zaldy1.extra"); assert(mesh->extra); } mesh->extra->t = (float*)M_calloc(3*mesh->ntg+1,sizeof(float),"inmesh"); assert(mesh->extra->t); k=1; for (k=1; k<=mesh->ntg; k++) { n = &mesh->extra->t[3*(k-1)+1]; getline_popen_double(natureread, 3, dn);// modif FH n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } } } /* tangent at vertices */ else if( !strncmp(tictac,"TangentAtVertices",17) ){ natureread = "TangentAtVertices"; if( !mesh->ntg ){ printf("The field Tangent need to be reading before %s",natureread); exit(1); } getline_number( natureread, &( mesh->extra->jv ) ); //mesh->extra->jv = GmfStatKwd(inm,GmfTangentAtVertices); mesh->extra->tv = (int*)M_calloc(mesh->np+1,sizeof(int),"inmesh"); assert(mesh->extra->tv); k=1; getline_popen_firstelemnoref(natureread, 2, vatn); nn=vatn[0]; is=vatn[1]; if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->tv[nn] = is; for (k=2; k<=mesh->extra->jv; k++) { getline_popen_elemnoref(natureread, 2, vatn); nn=vatn[0]; is=vatn[1]; //GmfGetLin(inm,GmfTangentAtVertices,&nn,&is); if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->tv[nn] = is; } } /* tangent at edge vertices */ else if( !strncmp(tictac,"TangentAtEdgeVertices",21) ){ natureread = "TangentAtEdgeVertices"; if( !mesh->ntg ){ printf("The field Tangent need to be reading before %s",natureread); exit(1); } getline_number( natureread, &( mesh->extra->je ) ); mesh->extra->te = (int*)M_calloc(2*mesh->na+1,sizeof(int),"inmesh"); assert(mesh->extra->te); k=1; getline_popen_firstelemnoref(natureread, 3, tvatn); nt=tvatn[0]; is=tvatn[1]; nn=tvatn[2]; if ( nt < 1 || nt > mesh->np || is < 1 || is > 2 || nn < 1 || nn > mesh->ntg ) disc++; else mesh->extra->te[3*(nt-1)+is] = is; for (k=2; k<=mesh->extra->je; k++) { getline_popen_elemnoref(natureread, 3, tvatn); nt=tvatn[0]; is=tvatn[1]; nn=tvatn[2]; //GmfGetLin(inm,GmfTangentAtEdgeVertices,&nt,&is,&nn); if ( nt < 1 || nt > mesh->np || is < 1 || is > 2 || nn < 1 || nn > mesh->ntg ) disc++; else mesh->extra->te[3*(nt-1)+is] = is; } } else if( !strncmp(tictac,"End",3) || !strncmp(tictac,"END",3) ){ if( ddebug ) printf("Reading of mesh file is finished"); break; } } /* check if vertices and elements found */ if ( !mesh->np ) { fprintf(stdout," ## No vertex\n"); return(-1); } mesh->ne = mesh->nt + mesh->nq + mesh->ntet + mesh->nhex; if ( disc > 0 ) { fprintf(stdout," ## %d entities discarded\n",disc); } return(1); } /* function of lecture */ int loadScaVecTen(pMesh mesh, int numsol, int dim, int ver, int nel, int type, int size, int * typtab, int key, char* natureread) { pSolution sol; double dbuf[ GmfMaxTyp ]; float fbuf[ GmfMaxTyp ]; double m[6],lambda[3],eigv[3][3],vp[2][2]; int inm,k,i,iord,off; char *ptr,data[128]; double ScaSol[1],VecSol[3],TenSol[9]; if ( numsol > type ) numsol = 1; numsol--; mesh->nbb = nel; mesh->bbmin = 1.0e20; mesh->bbmax = -1.0e20; if ( !zaldy2(mesh) ) { return(0); } sol = mesh->sol; sol->dim = dim; sol->ver = ver; off = 0; for (i=0; idim; break; case GmfSymMat: off += sol->dim*(sol->dim+1)/2; break; } } //printf("min= %f, max= %f\n",mesh->bbmin,mesh->bbmax); switch(typtab[numsol]) { case GmfSca: mesh->nfield = 1; for (k=1; k<=nel; k++) { /* if ( sol->ver == GmfFloat ) GmfGetLin(inm,key,fbuf); else { GmfGetLin(inm,key,dbuf); for (i=0; isol[k].bb = ScaSol[0]; if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } break; case GmfVec: if ( ddebug ) printf(" vector field\n"); mesh->nfield = sol->dim; for (k=1; k<=nel; k++) { mesh->sol[k].bb = 0.0; /* if ( sol->ver == GmfFloat ) GmfGetLin(inm,key,fbuf); else { GmfGetLin(inm,key,dbuf); for (i=0; idim, VecSol); for (i=0; idim; i++) { fbuf[off+i] = VecSol[i]; //printf("solution vectorielle %i composante %i %f\n",k,i,VecSol[i]); } for (i=0; idim; i++) { mesh->sol[k].m[i] = fbuf[off+i]; mesh->sol[k].bb += fbuf[off+i]*fbuf[off+i]; } mesh->sol[k].bb = sqrt(mesh->sol[k].bb); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } //printf("max= %f, min= %f",mesh->bbmin,mesh->bbmax); break; case GmfSymMat: if ( ddebug ) printf(" metric field\n"); mesh->nfield = sol->dim*(sol->dim+1) / 2; for (k=1; k<=nel; k++) { /* if ( sol->ver == GmfFloat ) GmfGetLin(inm,key,fbuf); else { GmfGetLin(inm,key,dbuf); for (i=0; idim*(sol->dim+1)/2, TenSol); for (i=0; idim*(sol->dim+1)/2; i++) { fbuf[off+i] = TenSol[i]; } if ( sol->dim == 2 ) { for (i=0; i<3; i++) mesh->sol[k].m[i] = m[i] = fbuf[off+i]; iord = eigen2(m,lambda,vp); mesh->sol[k].bb = min(lambda[0],lambda[1]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } else { for (i=0; i<6; i++) mesh->sol[k].m[i] = fbuf[off+i]; mesh->sol[k].m[2] = fbuf[off+3]; mesh->sol[k].m[3] = fbuf[off+2]; for (i=0; i<6; i++) m[i] = mesh->sol[k].m[i]; iord = eigenv(1,m,lambda,eigv); if ( iord ) { mesh->sol[k].bb = lambda[0]; mesh->sol[k].bb = max(mesh->sol[k].bb,lambda[1]); mesh->sol[k].bb = max(mesh->sol[k].bb,lambda[2]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } } } break; } return(1); } /*load solution (metric) */ int loadSol_popen(pMesh mesh,char *filename,int numsol) { pSolution sol; double dbuf[ GmfMaxTyp ]; float fbuf[ GmfMaxTyp ]; double m[6],lambda[3],eigv[3][3],vp[2][2]; int inm,k,i,key,nel,size,type,iord,off,typtab[GmfMaxTyp],ver,dim; char *ptr,data[128]; // rajout pour popen int NumberofSolAT; char* tictac; char *natureread; NumberofSolAT=0; while( !feof(stdin) ){ //fprintf(stdout,"data= %s\n",data); fgets(data,256,stdin); tictac = strtok(data," \n"); if(tictac == NULL) continue; //fprintf(stdout,"data= %s, tictac= %s\n",data,tictac); if( !strncmp(tictac,"MeshVersionFormatted",20) ){ /* read mesh format */ natureread="MeshVersionFormatted"; tictac = strtok(NULL," \n"); printf("data= %s\n",data); if(tictac == NULL){ printf(".sol: problem in reading the %s\n",natureread); exit(1); } else{ ver = atoi(tictac); } if(debug) fprintf(stdout,".sol: reading format %s %i \n",natureread,ver); } if( !strncmp(tictac,"Dimension",9) ){ /* read mesh dimension */ natureread="Dimension"; tictac = strtok(NULL," \n"); printf("data= %s\n",data); if(tictac == NULL){ printf("problem in reading the %s\n",natureread); exit(1); } else{ dim = atoi(tictac); //if(debug) printf(".sol: %s %i (mesh)%i (lecture)%s \n",natureread,dim,mesh->dim,tictac); } /*control of the dimension*/ if ( dim != mesh->dim ) { fprintf(stderr," %%%% Wrong dimension %d.\n",dim); GmfCloseMesh(inm); return(0); } } if( !strncmp(tictac,"SolAtVertices",13) ){ NumberofSolAT=NumberofSolAT+10; natureread = "SolAtVertices"; fprintf(stdout,"data= %s\n",data); getline_number( natureread, &(nel) ); fprintf(stdout,"nel %d, mesh->np %d \n",nel,mesh->np); if ( nel != mesh->np ) { fprintf(stderr," %%%% Wrong number: %d Solutions discarded\n",nel-mesh->np); return(0); } mesh->typage = 2; key = GmfSolAtVertices; /* type,size,typetab */ read_TypeSizeTyptab( natureread, &type, &size, typtab); printf("sol: %s; type %i; size%i;\n",natureread, type, size); /* Reading solutions*/ loadScaVecTen( mesh, 1, dim, ver, nel, type, size, typtab, key, natureread); } if( mesh->dim == 2 && mesh->nt ){ if( !strncmp(tictac,"SolAtTriangles",14) ){ NumberofSolAT=NumberofSolAT+1; natureread = "SolAtTriangles"; fprintf(stdout,"data= %s\n",data); getline_number( natureread, &(nel) ); if ( nel && nel != mesh->nt ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); return(0); } mesh->typage = 1; key = GmfSolAtTriangles; /* type,size,typetab */ read_TypeSizeTyptab( natureread, &type, &size, typtab); printf("sol: %s; type %i; size%i;\n",natureread, type, size); /* Reading solutions*/ loadScaVecTen( mesh, 1, dim, ver, nel, type, size, typtab, key, natureread); } } if( mesh->dim == 2 && mesh->nq ){ if( !strncmp(tictac,"SolAtQuadrilaterals",19) ){ NumberofSolAT=NumberofSolAT+1; natureread = "SolAtQuadrilaterals"; fprintf(stdout,"data= %s\n",data); getline_number( natureread, &(nel) ); if ( nel && nel != mesh->nq ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); return(0); } mesh->typage = 1; key = GmfSolAtQuadrilaterals; /* type,size,typetab */ read_TypeSizeTyptab( natureread, &type, &size, typtab); /* Reading solutions*/ loadScaVecTen( mesh, 1, dim, ver, nel, type, size, typtab, key, natureread); } } if( mesh->dim == 3 && mesh->ntet ){ if( !strncmp(tictac,"SolAtTetrahedra",15) ){ fprintf(stdout,"data= %s\n",data); NumberofSolAT=NumberofSolAT+1; natureread = "SolAtTetrahedra"; getline_number( natureread, &(nel) ); if ( nel && nel != mesh->ntet ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); return(0); } mesh->typage = 1; key = GmfSolAtTetrahedra; /* type,size,typetab */ read_TypeSizeTyptab( natureread, &type, &size, typtab); /* Reading solutions*/ loadScaVecTen( mesh, 1, dim, ver, nel, type, size, typtab, key, natureread); } } if( mesh->dim == 3 && mesh->nhex ){ if( !strncmp(tictac,"SolAtHexahedra",14) ){ fprintf(stdout,"data= %s\n",data); NumberofSolAT=NumberofSolAT+1; natureread = "SolAtHexahedra"; getline_number( natureread, &(nel) ); if ( nel && nel != mesh->nhex ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); GmfCloseMesh(inm); return(0); } mesh->typage = 1; key = GmfSolAtHexahedra; /* type,size,typetab */ read_TypeSizeTyptab( natureread, &type, &size, typtab); /* Reading solutions*/ loadScaVecTen( mesh, 1, dim, ver, nel, type, size, typtab, key, natureread); } } if( !strncmp(tictac,"End",3) || !strncmp(tictac,"END",3) ){ if( ddebug ) printf("Reading of mesh file is finished"); break; } } printf("NumberofSolAT %i\n",NumberofSolAT); return(1); } freefem++-3.38-1/src/medit/inout_popenbinaire.c000644 000767 000024 00000063252 11500003456 021534 0ustar00hechtstaff000000 000000 #include "medit.h" #include "libmesh5.h" #include "extern.h" #include "string.h" #ifdef WIN32 #include #endif #define WrdSiz 4 static int debug =0; void getline_bin_float_vertex(int ddim, double *c, int *ref){ int i; float ff; for(i=0; inp = 0; mesh->nt = 0; mesh->nq = 0; mesh->ntet = 0; mesh->nhex = 0; mesh->nc = 0; mesh->nr = 0; mesh->na = 0; mesh->nri = 0; mesh->nre = 0; mesh->nvn = 0; mesh->ntg = 0; mesh->ne = mesh->nt + mesh->nq + mesh->ntet + mesh->nhex; loopdebug = -1; // read code fread( (unsigned char *)&cod ,WrdSiz, 1, stdin); if(cod != 1 ){ printf("error in reading the binary file .meshb with popen\n"); exit(1); } fread( (unsigned char *)&(mesh->ver) ,WrdSiz, 1, stdin); fread( (unsigned char *)&KwdCod ,WrdSiz, 1, stdin); if(KwdCod != GmfDimension ){ printf("error in reading the binary file .meshb with popen\n"); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->dim) ,WrdSiz, 1, stdin); /*control of the dimension*/ if( (mesh->dim != 2) && (mesh->dim != 3) ){ printf("the dimension is not correct"); } if(debug) printf("reading dimension %i \n",mesh->dim); while( !feof(stdin) ){ loopdebug=loopdebug+1; fread( (unsigned char *)&KwdCod ,WrdSiz, 1, stdin); /* determination of KwdCod */ if(debug) printf("reading KwdCod %i %i\n",KwdCod,loopdebug); switch (KwdCod){ case GmfVertices : natureread="Vertices"; if(debug) printf("reading %s",natureread); fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->np) ,WrdSiz, 1, stdin); if(debug) printf(": number of vertices %i\n",mesh->np); if ( !mesh->np ) { if(debug) fprintf(stdout," ## No vertex\n"); retcode=-1; goto Lret; } if ( ddebug ) printf("allocate %d points\n",mesh->np); mesh->point = (pPoint)M_calloc(mesh->np+1,sizeof(Point),"zaldy1.point"); assert(mesh->point); for (k=1; k<=mesh->np; k++) { //if(0) printf("lecture point du maillage k=%i np=%i ver=%i \n",k,mesh->np,mesh->ver); ppt = &mesh->point[k]; if(mesh->ver==GmfFloat) getline_bin_float_vertex(mesh->dim, ppt->c, &ref); else getline_bin_double_vertex(mesh->dim, ppt->c, &ref); ppt->ref = ref & 0x7fff; ppt->tag = M_UNUSED; } ppt = &mesh->point[k]; break; case GmfTriangles : natureread = "Triangles"; if(debug) printf("reading %s",natureread); fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nt) ,WrdSiz, 1, stdin); if(debug) printf(": number of triangles %i\n",mesh->nt); if ( ddebug ) printf("allocate %d tria\n",mesh->nt); mesh->tria = (pTriangle)M_calloc(mesh->nt+1,sizeof(Triangle),"zaldy1.tria"); assert(mesh->tria); disc = 0; for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; getline_bin_elem( 3, pt->v, &ref); pt->ref = ref & 0x7fff; for (i=0; i<3; i++) { if ( pt->v[i] < 1 || pt->v[i] > mesh->np ) { disc++; pt->v[0] = 0; break; } else { ppt = &mesh->point[pt->v[i]]; ppt->tag &= ~M_UNUSED; } } } break; case GmfQuadrilaterals : natureread = "Quadrilateral"; if(debug) printf("reading %s",natureread); fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nq) ,WrdSiz, 1, stdin); if(debug) printf(": number of hexahedrons %i\n",mesh->nq); if ( ddebug ) printf("allocate %d quad\n",mesh->nq); if ( mesh->nq ) { mesh->quad = (pQuad)M_calloc(mesh->nq+1,sizeof(Quad),"zaldy1.quad"); assert(mesh->quad); } for (k=1; k<=mesh->nq; k++) { pq = &mesh->quad[k]; getline_bin_elem( 4, pq->v, &ref); pq->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( pq->v[i] < 1 || pq->v[i] > mesh->np ) { disc++; pq->v[0] = 0; break; } else { ppt = &mesh->point[pq->v[i]]; ppt->tag &= ~M_UNUSED; } } } break; case GmfTetrahedra : natureread = "Tetrahedra"; if(debug) printf("reading %s",natureread); fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->ntet) ,WrdSiz, 1, stdin); if(debug) printf(": number of tetrahedrons %i\n",mesh->ntet); if ( mesh->ntet ) { if ( ddebug ) printf("allocate %d tetra\n",mesh->ntet); mesh->tetra = (pTetra)M_calloc(mesh->ntet+1,sizeof(Tetra),"zaldy1.tetra"); assert(mesh->tetra); } for (k=1; k<=mesh->ntet; k++) { ptet = &mesh->tetra[k]; getline_bin_elem( 4, ptet->v, &ref); ptet->ref = ref & 0x7fff; for (i=0; i<4; i++) { if ( ptet->v[i] < 1 || ptet->v[i] > mesh->np ) { disc++; ptet->v[0] = 0; break; } else { ppt = &mesh->point[ptet->v[i]]; ppt->tag &= ~M_UNUSED; } } } break; case GmfHexahedra : natureread = "Hexahedra"; if(debug) printf("reading %s",natureread); fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nhex) ,WrdSiz, 1, stdin); if(debug) printf(": number of hexahedrons %i\n",mesh->nhex); if ( ddebug ) printf("allocate %d hexa\n",mesh->nhex); mesh->hexa = (pHexa)M_calloc(mesh->nhex+1,sizeof(Hexa),"zaldy1.hexa"); assert(mesh->hexa); for (k=1; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; getline_bin_elem( 8, ph->v, &ref); ph->ref = ref & 0x7fff; for (i=0; i<8; i++) { if ( ph->v[i] < 1 || ph->v[i] > mesh->np ) { disc++; ph->v[0] = 0; break; } else { ppt = &mesh->point[ph->v[i]]; ppt->tag &= ~M_UNUSED; } } } break; case GmfCorners : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nc) ,WrdSiz, 1, stdin); for (k=1; k<=mesh->nc; k++) { fread( (unsigned char *)&is ,WrdSiz, 1, stdin); //fgets(data,256,stdin); tictac = strtok(data," \n"); is = atoi(tictac); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_CORNER; ppt->tag &= ~M_UNUSED; } } break; case GmfRequiredVertices : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nr) ,WrdSiz, 1, stdin); for (k=1; k<=mesh->nr; k++) { //fgets(data,256,stdin); tictac = strtok(data," \n"); is = atoi(tictac); fread( (unsigned char *)&is ,WrdSiz, 1, stdin); if ( is < 1 || is > mesh->np ) disc++; else { ppt = &mesh->point[is]; ppt->tag |= M_REQUIRED; ppt->tag &= ~M_UNUSED; } } break; case GmfEdges : natureread="Edges"; if(debug) printf("reading %s",natureread); fread( (unsigned char *)&NulPos, WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->na), WrdSiz, 1, stdin); if(debug) printf(": number of edges %i\n",mesh->na); if ( ddebug ) printf("allocate %d edges\n",mesh->na); mesh->edge = (pEdge)M_calloc(mesh->na+1,sizeof(Edge),"zaldy1.edge"); assert(mesh->edge); for (k=1; k<=mesh->na; k++) { getline_bin_edge( &ia, &ib, &ref); if ( ia < 1 || ia > mesh->np || ib < 1 || ib > mesh->np ) disc++; else { pr = &mesh->edge[k]; pr->v[0] = ia; pr->v[1] = ib; pr->ref = ref & 0x7fff; pr->tag = !pr->ref ? M_NOTAG : M_TAG; ppt = &mesh->point[ia]; ppt->tag &= ~M_UNUSED; ppt = &mesh->point[ib]; ppt->tag &= ~M_UNUSED; } } break; case GmfRidges : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nri) ,WrdSiz, 1, stdin); for (k=1; k<=mesh->nri; k++) { //getline_1int( natureread, &is); fread( (unsigned char *)&is, WrdSiz, 1, stdin); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_RIDGE; } } break; case GmfRequiredEdges : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nre) ,WrdSiz, 1, stdin); for (k=2; k<=mesh->nre; k++) { //getline_1int( natureread, &is); fread( (unsigned char *)&is, WrdSiz, 1, stdin); if ( is < 1 || is > mesh->na ) disc++; else { pr = &mesh->edge[is]; pr->tag |= M_REQUIRED; } } break; case GmfNormals : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->nvn) ,WrdSiz, 1, stdin); /* allocation */ if ( !mesh->ntg ) { mesh->extra = (pExtra)M_calloc(1,sizeof(Extra),"zaldy1.extra"); assert(mesh->extra); } mesh->extra->n = (float*)M_calloc(3*mesh->nvn+1,sizeof(float),"inmesh"); assert(mesh->extra->n); for (k=1; k<=mesh->nvn; k++) { n = &mesh->extra->n[3*(k-1)+1]; if(mesh->ver == GmfFloat) getline_bin_float_noref( 3, dn); else getline_bin_double_noref( 3, dn); n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } } break; case GmfNormalAtVertices : if(!mesh->nvn){ printf("The field Normal need to be reading before %s",natureread); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->extra->iv) ,WrdSiz, 1, stdin); mesh->extra->nv = (int*)M_calloc(mesh->np+1,sizeof(int),"inmesh"); assert(mesh->extra->nv); for (k=1; k<=mesh->extra->iv; k++) { //GmfGetLin(inm,GmfNormalAtVertices,&nn,&is); getline_bin_int_noref( 2, vatn); nn=vatn[0]; is=vatn[1]; if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->nv[nn] = is; } break; case GmfNormalAtTriangleVertices : if(!mesh->nvn){ printf("The field Normal need to be reading before %s",natureread); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->extra->it) ,WrdSiz, 1, stdin); mesh->extra->nt = (int*)M_calloc(3*mesh->nt+1,sizeof(int),"inmesh"); assert(mesh->extra->nt); for (k=1; k<=mesh->extra->it; k++) { //GmfGetLin(inm,GmfNormalAtTriangleVertices,&nt,&is,&nn); getline_bin_int_noref( 3, tvatn); tvatn[0] = nt; tvatn[1] = is; tvatn[2] = nn; if ( nt < 1 || nt > mesh->nt || is < 1 || is > 3 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nt[3*(nt-1)+is] = nn; } break; case GmfNormalAtQuadrilateralVertices : if(!mesh->nvn){ printf("The field Normal need to be reading before %s",natureread); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->extra->iq) ,WrdSiz, 1, stdin); mesh->extra->nq = (int*)M_calloc(4*mesh->nq+1,sizeof(int),"inmesh"); assert(mesh->extra->nq); for (k=1; k<=mesh->extra->iq; k++) { //GmfGetLin(inm,GmfNormalAtQuadrilateralVertices,&nq,&is,&nn); getline_bin_int_noref( 3, tvatn); tvatn[0] = nq; tvatn[1] = is; tvatn[2] = nn; if ( nq < 1 || nq > mesh->nq || is < 1 || is > 4 || nn < 1 || nn > mesh->nvn ) disc++; else mesh->extra->nq[3*(nq-1)+is] = nn; } break; case GmfTangents : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->ntg) ,WrdSiz, 1, stdin); if ( !mesh->nvn ) { mesh->extra = (pExtra)M_calloc(1,sizeof(Extra),"zaldy1.extra"); assert(mesh->extra); } mesh->extra->t = (float*)M_calloc(3*mesh->ntg+1,sizeof(float),"inmesh"); assert(mesh->extra->t); for (k=1; k<=mesh->ntg; k++) { n = &mesh->extra->t[3*(k-1)+1]; if(mesh->ver == GmfFloat) getline_bin_float_noref( 3, dn); else getline_bin_double_noref( 3, dn); n[0] = dn[0]; n[1] = dn[1]; n[2] = dn[2]; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0 ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } } break; case GmfTangentAtVertices : if( !mesh->ntg ){ printf("The field Tangent need to be reading before %s",natureread); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->extra->tv) ,WrdSiz, 1, stdin); mesh->extra->tv = (int*)M_calloc(mesh->np+1,sizeof(int),"inmesh"); assert(mesh->extra->tv); for (k=1; k<=mesh->extra->jv; k++) { getline_bin_int_noref( 2, vatn); nn=vatn[0]; is=vatn[1]; if ( nn < 1 || nn > mesh->np ) disc++; else mesh->extra->tv[nn] = is; } break; case GmfTangentAtEdgeVertices : if( !mesh->ntg ){ printf("The field Tangent need to be reading before %s",natureread); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&(mesh->extra->je) ,WrdSiz, 1, stdin); mesh->extra->te = (int*)M_calloc(2*mesh->na+1,sizeof(int),"inmesh"); assert(mesh->extra->te); for (k=1; k<=mesh->extra->je; k++) { getline_bin_int_noref( 3, tvatn); nt=tvatn[0]; is=tvatn[1]; nn=tvatn[2]; if ( nt < 1 || nt > mesh->np || is < 1 || is > 2 || nn < 1 || nn > mesh->ntg ) disc++; else mesh->extra->te[3*(nt-1)+is] = is; } break; case GmfEnd : fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); printf("End of mesh\n"); break; default : printf("This data KwdCod it is not taken in this version\n"); exit(1); break; } if(KwdCod == GmfEnd){ break; } /* if( KwdCod == GmfVertices ){ } else if(KwdCod == GmfTriangles){ } else if(KwdCod == GmfQuadrilaterals){ } else if(KwdCod == GmfTetrahedra){ } else if(KwdCod == GmfHexahedra){ } else if(KwdCod == GmfCorners){ } else if(KwdCod == GmfRequiredVertices){ } else if(KwdCod == GmfEdges){ } else if(KwdCod == GmfRidges){ } else if(KwdCod == GmfRequiredEdges){ } else if(KwdCod == GmfNormals){ } else if(KwdCod == GmfTangents){ } else if(KwdCod == GmfEnd){ } else{ printf("This data KwdCod it is not taken in this version\n"); exit(1); } */ } /* check if vertices and elements found */ if ( !mesh->np ) { fprintf(stdout," ## No vertex\n"); retcode=-1; goto Lret; } mesh->ne = mesh->nt + mesh->nq + mesh->ntet + mesh->nhex; if ( disc > 0 ) { fprintf(stdout," ## %d entities discarded\n",disc); } retcode=1; Lret: #ifdef WIN32 _setmode(fileno(stdin),O_TEXT); #endif return retcode; } /* function of lecture */ int loadScaVecTen_bin(pMesh mesh, int numsol, int dim, int ver, int nel, int type, int size, int * typtab, int key) { pSolution sol; double dbuf[ GmfMaxTyp ]; float fbuf[ GmfMaxTyp ]; double m[6],lambda[3],eigv[3][3],vp[2][2]; int inm,k,i,iord,off; char *ptr,data[128]; double ScaSol[1],VecSol[3],TenSol[9]; float fScaSol[1],fVecSol[3],fTenSol[9]; int retcode=0; if(ddebug) printf("numsol=%i, type=%i, size=%i\n",numsol,type,size); if ( numsol > type ) numsol = 1; numsol--; mesh->nbb = nel; mesh->bbmin = 1.0e20; mesh->bbmax = -1.0e20; if ( !zaldy2(mesh) ) { retcode=0; } sol = mesh->sol; sol->dim = dim; sol->ver = ver; off = 0; for (i=0; idim; break; case GmfSymMat: off += sol->dim*(sol->dim+1)/2; break; } } if(ddebug) printf("typtab[%i]=%i, off%i",i,typtab[i],off); //printf("min= %f, max= %f\n",mesh->bbmin,mesh->bbmax); if(ddebug) printf("numsol=%i,typtab[i]=%i\n",numsol,typtab[i]); fflush(stdout); switch(typtab[numsol]) { case GmfSca: mesh->nfield = 1; for (k=1; k<=nel; k++) { // reading data must be a double ! getline_bin_double_noref(1, ScaSol); mesh->sol[k].bb = ScaSol[0]; if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } break; case GmfVec: if ( ddebug ) printf(" vector field\n"); mesh->nfield = sol->dim; for (k=1; k<=nel; k++) { // reading data must be a double ! mesh->sol[k].bb = 0.0; getline_bin_double_noref( sol->dim, VecSol); for (i=0; idim; i++) { fbuf[off+i] = VecSol[i]; //printf("solution vectorielle %i composante %i %f\n",k,i,VecSol[i]); } for (i=0; idim; i++) { mesh->sol[k].m[i] = fbuf[off+i]; mesh->sol[k].bb += fbuf[off+i]*fbuf[off+i]; } mesh->sol[k].bb = sqrt(mesh->sol[k].bb); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } //printf("max= %f, min= %f",mesh->bbmin,mesh->bbmax); break; case GmfSymMat: if ( ddebug ) printf(" metric field\n"); mesh->nfield = sol->dim*(sol->dim+1) / 2; for (k=1; k<=nel; k++) { // reading data must be double !!! getline_bin_double_noref(sol->dim*(sol->dim+1)/2, TenSol); for (i=0; idim*(sol->dim+1)/2; i++) { fbuf[off+i] = TenSol[i]; } if ( sol->dim == 2 ) { for (i=0; i<3; i++) mesh->sol[k].m[i] = m[i] = fbuf[off+i]; iord = eigen2(m,lambda,vp); mesh->sol[k].bb = min(lambda[0],lambda[1]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } else { for (i=0; i<6; i++) mesh->sol[k].m[i] = fbuf[off+i]; mesh->sol[k].m[2] = fbuf[off+3]; mesh->sol[k].m[3] = fbuf[off+2]; for (i=0; i<6; i++) m[i] = mesh->sol[k].m[i]; iord = eigenv(1,m,lambda,eigv); if ( iord ) { mesh->sol[k].bb = lambda[0]; mesh->sol[k].bb = max(mesh->sol[k].bb,lambda[1]); mesh->sol[k].bb = max(mesh->sol[k].bb,lambda[2]); if ( mesh->sol[k].bb < mesh->bbmin ) mesh->bbmin = mesh->sol[k].bb; if ( mesh->sol[k].bb > mesh->bbmax ) mesh->bbmax = mesh->sol[k].bb; } } } break; } retcode=1; return retcode; } /*load solution (metric) */ int loadSol_popen_bin(pMesh mesh,char *filename,int numsol) { pSolution sol; double dbuf[ GmfMaxTyp ]; float fbuf[ GmfMaxTyp ]; double m[6],lambda[3],eigv[3][3],vp[2][2]; int inm,k,i,key,nel,size,type,iord,off,typtab[GmfMaxTyp],ver,dim; char *ptr,data[128]; // rajout pour popen int NumberofSolAT; char *natureread; // rajout binaire int KwdCod; int cod; int NulPos; int retcode=0; NumberofSolAT=0; #ifdef WIN32 _setmode(fileno(stdin),O_BINARY); #endif // read code fread( (unsigned char *)&cod ,WrdSiz, 1, stdin); if(cod != 1 ){ printf("error in reading the binary file .meshb with popen\n"); exit(1); } fread( (unsigned char *)&ver ,WrdSiz, 1, stdin); fread( (unsigned char *)&KwdCod ,WrdSiz, 1, stdin); if(KwdCod != GmfDimension ){ printf("error in reading the binary file .meshb with popen\n"); exit(1); } fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&dim ,WrdSiz, 1, stdin); natureread="Dimension"; printf(".sol: %s %i (mesh)%i (lecture)%i \n",natureread,dim,mesh->dim,ver); /*control of the dimension*/ if( dim != mesh->dim ){ fprintf(stderr," %%%% Wrong dimension %d.\n",dim); retcode=0; goto Lret; // return(0); } while( !feof(stdin) ){ fread( (unsigned char *)&KwdCod ,WrdSiz, 1, stdin); if(KwdCod == GmfSolAtVertices){ fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&nel ,WrdSiz, 1, stdin); natureread = "SolAtVertices"; if(debug) fprintf(stdout,"SolAtVertices : nel %i, mesh->np %i \n",nel,mesh->np); if ( nel != mesh->np ) { fprintf(stderr," %%%% Wrong number: %d Solutions discarded\n",nel-mesh->np); retcode=0; goto Lret; // return(0); } mesh->typage = 2; key = GmfSolAtVertices; /* type,size,typetab */ read_TypeSizeTyptab_bin( &type, &size, typtab); if(debug) printf("sol: %s; type %i; size%i;\n",natureread, type, size); fflush(stdout); /* Reading solutions*/ loadScaVecTen_bin( mesh, 1, dim, ver, nel, type, size, typtab, key); } if( mesh->dim == 2 && mesh->nt ){ if(KwdCod == GmfSolAtTriangles){ natureread = "SolAtTriangles"; fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&nel ,WrdSiz, 1, stdin); if(debug) printf(stdout,"SolAtTriangles : nel %d, mesh->nt %d \n",nel,mesh->nt); if ( nel && nel != mesh->nt ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); retcode=0; goto Lret; // return(0); } mesh->typage = 1; key = GmfSolAtTriangles; /* type,size,typetab */ read_TypeSizeTyptab_bin( &type, &size, typtab); printf("sol: %s; type %i; size%i;\n",natureread, type, size); /* Reading solutions*/ loadScaVecTen_bin( mesh, 1, dim, ver, nel, type, size, typtab, key); } } if( mesh->dim == 2 && mesh->nq ){ if( KwdCod == GmfSolAtQuadrilaterals ){ natureread = "SolAtQuadrilaterals"; fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&nel ,WrdSiz, 1, stdin); if(debug) fprintf(stdout,"SolAtQuadrilaterals : nel %i, mesh->nq %i \n",nel,mesh->nq); if ( nel && nel != mesh->nq ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); retcode=0; goto Lret; //return(0); } mesh->typage = 1; key = GmfSolAtQuadrilaterals; /* type,size,typetab */ read_TypeSizeTyptab_bin( &type, &size, typtab); /* Reading solutions*/ loadScaVecTen_bin( mesh, 1, dim, ver, nel, type, size, typtab, key); } } if( mesh->dim == 3 && mesh->ntet ){ if( KwdCod == GmfSolAtTetrahedra ){ natureread = "SolAtTetrahedra"; fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&nel ,WrdSiz, 1, stdin); if(debug) fprintf(stdout,"SolAtTetrahedra : nel %i, mesh->ntet %i \n",nel,mesh->ntet); if ( nel && nel != mesh->ntet ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); retcode=0; goto Lret; //return(0); } mesh->typage = 1; key = GmfSolAtTetrahedra; /* type,size,typetab */ read_TypeSizeTyptab_bin( &type, &size, typtab); /* Reading solutions */ loadScaVecTen_bin( mesh, 1, dim, ver, nel, type, size, typtab, key); } } if( mesh->dim == 3 && mesh->nhex ){ if( KwdCod == GmfSolAtHexahedra ){ natureread = "SolAtHexahedra"; fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); fread( (unsigned char *)&nel ,WrdSiz, 1, stdin); if(debug) fprintf(stdout,"SolAtHexahedra : nel %d, mesh->nhex %d \n",nel,mesh->nhex); if ( nel && nel != mesh->nhex ) { fprintf(stderr," %%%% Wrong number %d.\n",nel); GmfCloseMesh(inm); retcode=0; goto Lret; //return(0); } mesh->typage = 1; key = GmfSolAtHexahedra; /* type,size,typetab */ read_TypeSizeTyptab_bin( &type, &size, typtab); /* Reading solutions*/ loadScaVecTen_bin( mesh, 1, dim, ver, nel, type, size, typtab, key); } } if( KwdCod == GmfEnd ){ fread( (unsigned char *)&NulPos ,WrdSiz, 1, stdin); if(debug) printf("End of solution\n"); if( ddebug ) printf("Reading of mesh file is finished"); break; } } retcode=1; Lret: #ifdef WIN32 _setmode(fileno(stdin),O_BINARY); #endif return(retcode); } freefem++-3.38-1/src/medit/items.c000644 000767 000024 00000030153 11406142256 016765 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" void drawRulers(pScene sc) { pMesh mesh = cv.mesh[sc->idmesh]; if ( ddebug ) printf("draw rulers\n"); glPushMatrix(); glTranslatef(-mesh->xtra,-mesh->ytra,-mesh->ztra); glColor3fv(sc->par.line); glEnable(GL_LINE_STIPPLE); glLineStipple(1,0x0444); glLineWidth(2.); glBegin(GL_LINES); glVertex3f(mesh->xmin,mesh->ymin,mesh->zmin); glVertex3f(mesh->xmax,mesh->ymin,mesh->zmin); glVertex3f(mesh->xmin,mesh->ymax,mesh->zmin); glVertex3f(mesh->xmax,mesh->ymax,mesh->zmin); glVertex3f(mesh->xmin,mesh->ymin,mesh->zmin); glVertex3f(mesh->xmin,mesh->ymax,mesh->zmin); glVertex3f(mesh->xmax,mesh->ymin,mesh->zmin); glVertex3f(mesh->xmax,mesh->ymax,mesh->zmin); glVertex3f(mesh->xmin,mesh->ymin,mesh->zmax); glVertex3f(mesh->xmax,mesh->ymin,mesh->zmax); glVertex3f(mesh->xmin,mesh->ymax,mesh->zmax); glVertex3f(mesh->xmax,mesh->ymax,mesh->zmax); glVertex3f(mesh->xmin,mesh->ymin,mesh->zmax); glVertex3f(mesh->xmin,mesh->ymax,mesh->zmax); glVertex3f(mesh->xmax,mesh->ymin,mesh->zmax); glVertex3f(mesh->xmax,mesh->ymax,mesh->zmax); glVertex3f(mesh->xmin,mesh->ymin,mesh->zmin); glVertex3f(mesh->xmin,mesh->ymin,mesh->zmax); glVertex3f(mesh->xmin,mesh->ymax,mesh->zmin); glVertex3f(mesh->xmin,mesh->ymax,mesh->zmax); glVertex3f(mesh->xmax,mesh->ymin,mesh->zmin); glVertex3f(mesh->xmax,mesh->ymin,mesh->zmax); glVertex3f(mesh->xmax,mesh->ymax,mesh->zmin); glVertex3f(mesh->xmax,mesh->ymax,mesh->zmax); glEnd(); glLineWidth(1.); glDisable(GL_LINE_STIPPLE); glPopMatrix(); } void drawAxis(pScene sc,int dim) { pMesh mesh; /* default */ if ( ddebug ) printf("draw axis\n"); mesh = cv.mesh[sc->idmesh]; glPushMatrix(); glTranslatef(1.01*(mesh->xmin-mesh->xtra), 1.01*(mesh->ymin-mesh->ytra), 1.01*(mesh->zmin-mesh->ztra)); glScalef(0.6*sc->dmin,0.6*sc->dmin,0.6*sc->dmin); glLineWidth(max(2,sc->par.linewidth)); glColor3f(1.0,0.,0.); if ( mesh->dim == 2 ) { glBegin(GL_LINE_STRIP); glVertex2f(0.0, 0.0); glVertex2f(1.0, 0.0); glVertex2f(0.95, 0.01); glVertex2f(0.95, -0.01); glVertex2f(1.0, 0.0); glEnd(); glBegin(GL_LINE_STRIP); glVertex2f(0.0, 0.0); glVertex2f(0.0, 1.0); glVertex2f(-0.01, 0.95); glVertex2f(0.01, 0.95); glVertex2f(0.0, 1.0); glEnd(); /*glColor3f(0.0f,1.0f,0.0f);*/ glColor3f(1.-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); glRasterPos3f(1.02, 0.0, 0.0); glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'x'); glRasterPos3f(0.0, 1.02, 0.0); glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'y'); } else { glBegin(GL_LINE_STRIP); glVertex3f(0.0, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); glVertex3f(0.95, 0.01, 0.0); glVertex3f(0.95, -0.01, 0.0); glVertex3f(1.0, 0.0, 0.0); glVertex3f(0.95, 0.0, 0.01); glVertex3f(0.95, 0.0, -0.01); glVertex3f(1.0, 0.0, 0.0); glEnd(); glBegin(GL_LINE_STRIP); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 1.0, 0.0); glVertex3f(0.0, 0.95, 0.01); glVertex3f(0.0, 0.95, -0.01); glVertex3f(0.0, 1.0, 0.0); glVertex3f(0.01, 0.95, 0.0); glVertex3f(-0.01, 0.95, 0.0); glVertex3f(0.0, 1.0, 0.0); glEnd(); glBegin(GL_LINE_STRIP); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 1.0); glVertex3f(0.01, 0.0, 0.95); glVertex3f(-0.01, 0.0, 0.95); glVertex3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.01, 0.95); glVertex3f(0.0, -0.01, 0.95); glVertex3f(0.0, 0.0, 1.0); glEnd(); /*glColor3f(0.0f,1.0f,0.0f);*/ glColor3f(1.-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); glRasterPos3f(1.02, 0.0, 0.0); glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'x'); glRasterPos3f(0.0, 1.02, 0.0); glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'y'); glRasterPos3f(0.0, 0.0, 1.02); glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'z'); } glLineWidth(1.0); glPopMatrix(); } void drawBox(pScene sc,pMesh mesh,int mode) { pMaterial pm; float cx,cy,cz; int i,k,m; glDisable(GL_LIGHTING); glPushMatrix(); glScalef(1.01 * fabs(mesh->xmax-mesh->xmin), 1.01 * fabs(mesh->ymax-mesh->ymin), 1.01 * fabs(mesh->zmax-mesh->zmin)); glColor3f(1.0,0.0,0.5); glutWireCube(1.0); glPopMatrix(); /* one box per sub-domain */ if ( mode ) { for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; for (i=0; idepmat[i]; if ( !k || pm->flag ) continue; cx = 0.5 * (pm->ext[3]+pm->ext[0]); cy = 0.5 * (pm->ext[4]+pm->ext[1]); cz = 0.5 * (pm->ext[5]+pm->ext[2]); glPushMatrix(); glColor3fv(pm->dif); glTranslatef(cx,cy,cz); glScalef(pm->ext[3]-pm->ext[0],pm->ext[4]-pm->ext[1], pm->ext[5]-pm->ext[2]); glutWireCube(1.0); glPopMatrix(); } } } } void drawCube(pScene sc,pMesh mesh) { pTransform cubetr; pCube cube; float x1,y1,z1,x2,y2,z2,xd,yd,zd; cube = sc->cube; cubetr = cube->cubetr; if ( cube->active & C_UPDATE ) updateCube(cube,mesh); glDisable(GL_LIGHTING); glPushMatrix(); glMultMatrixf(cubetr->matrix); glLineWidth(3.0); if ( cube->active & C_EDIT ) glColor3f(1.0,0.0,1.0); else if ( cube->active & C_FREEZE ) glColor3f(0.0,0.6,0.9); else glColor3f(0.0,1.0,0.0); x1 = cube->cmi[0] - mesh->xtra; y1 = cube->cmi[1] - mesh->ytra; z1 = cube->cmi[2] - mesh->ztra; x2 = cube->cma[0] - mesh->xtra; y2 = cube->cma[1] - mesh->ytra; z2 = cube->cma[2] - mesh->ztra; xd = cube->cma[0] - cube->cmi[0]; yd = cube->cma[1] - cube->cmi[1]; zd = cube->cma[2] - cube->cmi[2]; glBegin(GL_QUADS); glVertex3f(x1,y1,z1); glVertex3f(x1+xd,y1,z1); glVertex3f(x1+xd,y1+yd,z1); glVertex3f(x1,y1+yd,z1); glVertex3f(x1,y1,z2); glVertex3f(x1+xd,y1,z2); glVertex3f(x1+xd,y1+yd,z2); glVertex3f(x1,y1+yd,z2); glEnd(); glBegin(GL_LINES); glVertex3f(x1,y1,z1); glVertex3f(x1,y1,z2); glVertex3f(x1+xd,y1,z1); glVertex3f(x1+xd,y1,z2); glVertex3f(x1+xd,y1+yd,z1); glVertex3f(x1+xd,y1+yd,z2); glVertex3f(x1,y1+yd,z1); glVertex3f(x1,y1+yd,z2); glEnd(); glLineWidth(1.0); glPopMatrix(); } void drawGrid(pScene sc,pMesh mesh) { int k; /* default */ if ( ddebug ) printf("draw grid + graduation\n"); if ( !sc->grid ) { sc->grid = glGenLists(1); glNewList(sc->grid,GL_COMPILE); glBegin(GL_LINES); for (k=0; k<5; k++) { glVertex3f(k*0.25,0.,0.); glVertex3f(k*0.25,1.,0.); glVertex3f(0.,k*0.25,0.); glVertex3f(1.,k*0.25,0.); glVertex3f(0.,k*0.25,0.); glVertex3f(0.,k*0.25,1.); glVertex3f(0.,0.,k*0.25); glVertex3f(0.,1.,k*0.25); glVertex3f(k*0.25,0.,0.); glVertex3f(k*0.25,0.,1.); glVertex3f(0.,0.,k*0.25); glVertex3f(1.,0.,k*0.25); } glEnd(); glEndList(); } /* call display list */ glPushMatrix(); glTranslatef(-0.3*fabs(sc->dmax),0.,-4.7*sc->dmax); glRotatef(-60.,1.,0.,0.); glRotatef(-120.,0.,0.,1.); glScalef(2.5*sc->dmax,2.5*sc->dmax,2.5*sc->dmax); glDisable(GL_LIGHTING); glColor3f(0.4,0.4,0.4); glCallList(sc->grid); glColor3fv(sc->par.line); output3(0.0,0.0,0.0,"%.2f",mesh->xmin); output3(1.1,0.0,0.0,"%.2f",mesh->xmax); output3(0.0,1.01,0.0,"%.2f",mesh->ymax); output3(0.0,0.0,1.01,"%.2f",mesh->zmax); glEnable(GL_LIGHTING); glPopMatrix(); } void drawBase(pScene sc,pMesh mesh) { int k; /* default */ if ( ddebug ) printf("draw base\n"); if ( !sc->grid ) { sc->grid = glGenLists(1); glNewList(sc->grid,GL_COMPILE); if ( glGetError() ) return; glColor3f(0.5,0.5,0.5); glLineWidth(2.0); glBegin(GL_LINES); for (k=0; k<21; k+=5) { glVertex3f(k*0.05,0.,0.); glVertex3f(k*0.05,1.,0.); glVertex3f(0.,k*0.05,0.); glVertex3f(1.,k*0.05,0.); } glEnd(); glColor3f(0.6,0.6,0.6); glLineWidth(1.0); glBegin(GL_LINES); for (k=0; k<21; k++) { if ( k%5 == 0 ) continue; glVertex3f(k*0.05,0.,0.); glVertex3f(k*0.05,1.,0.); glVertex3f(0.,k*0.05,0.); glVertex3f(1.,k*0.05,0.); } glEnd(); glEndList(); } glPushMatrix(); glTranslatef(-1.5*sc->dmax,-1.5*sc->dmax,-0.5*(mesh->zmax-mesh->zmin)); glScalef(3*sc->dmax,3*sc->dmax,3*sc->dmax); glDisable(GL_LIGHTING); glCallList(sc->grid); glPopMatrix(); } /* draw HUD system for flight */ void drawHUD(pScene sc) { pCamera c; pMesh mesh; GLfloat xm,ym,x,y,dx,dy,alt; double azim,elev; int i,j; if ( ddebug ) fprintf(stdout,"drawHUD\n"); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(-0.5,639.5,-0.5,479.5); c = sc->camera; mesh = cv.mesh[sc->idmesh]; glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3f(0.0,0.5,0.0); glLineWidth(1.0f); xm = sc->par.xs / 2.0f; ym = sc->par.ys / 2.0f; glRecti(200,160,440,320); /* altitude */ glColor3f(1.0,0.5,0.0); output2(230,330,"speed: %6.1f",1000.0f*c->spmod/sc->dmax); switch(c->vecup) { case X_AXIS: alt = (c->eye[1]+mesh->xtra)/(mesh->xmax-mesh->xmin); break; case Y_AXIS: alt = (c->eye[1]+mesh->ytra)/(mesh->ymax-mesh->ymin); break; case Z_AXIS: alt = (c->eye[1]+mesh->ztra)/(mesh->zmax-mesh->zmin); break; default: alt = 0.0; break; } glColor3f(1.0,0.5,0.0); output2(350,330,"alt: %9.1f",1000.0f*alt); /* horiz rulers */ output2(310,139.0f,"azim"); glColor3f(0.0,1.0,0.0); output2(197,150,"-180"); output2(257,150," -90"); output2(317,150,"0"); output2(377,150," 90"); output2(437,150,"180"); x = 200.0f; glBegin(GL_LINES); for (i=1; i<8; i++) { x += 240.0 / 8.0; glVertex2f(x,158.0); glVertex2f(x,162.0); } glEnd(); /* vert rulers */ glColor3f(0.0,1.0,0.0); output2(185,160,"-90"); output2(185,200,"-45"); output2(185,240,"0"); output2(185,280,"45"); output2(185,320,"90"); y = 160.0f; glBegin(GL_LINES); for (i=1; i<8; i++) { y += 160.0 / 8.0; glVertex2f(198,y); glVertex2f(202,y); } glEnd(); /* azimuth */ azim = Azimuth(c); if ( azim > 0.0f ) azim = 180.0f - azim; else if ( azim < 0.0f ) azim = -180.0f - azim; x = 2.0/3.0*azim + 320.0f; glColor3f(1.0,0.0,0.0); glLineWidth(1.0); output2(x,143.0,"%d",azim>0 ? (int)(azim+0.5) : (int)(azim-0.5)); glBegin(GL_LINES); glVertex2f(x,166.0); glVertex2f(x,318.0); glEnd(); y = 160.0f; dy = 160.0 / 8.0; glBegin(GL_LINES); for (i=0; i<8; i++) { glVertex2f(x-4,y); glVertex2f(x+4,y); for (j=0; j<5; j++) { glVertex2f(x-2,y+j*dy/5.0); glVertex2f(x+2,y+j*dy/5.0); } y += dy; } glEnd(); /* elevation */ elev = Elevation(c); if ( elev > 90.0f ) y = 320.0f; else if ( elev < -90.0f ) y = 160.0f; else y = 8.0/9.0 * elev + 240.0; glColor3f(1.0,0.0,0.0); output2(175.0,y,"%5.1f",elev); glBegin(GL_LINES); glVertex2f(206.0,y); glVertex2f(438.0,y); glEnd(); x = 200.0f; dx = 240.0f / 8.0f; glBegin(GL_LINES); for (i=1; i<=8; i++) { glVertex2f(x,y-4); glVertex2f(x,y+4); for (j=0; j<5; j++) { glVertex2f(x+j*dx/5.0,y-2); glVertex2f(x+j*dx/5.0,y+2); } x += dx; } glEnd(); /* horizon */ glLineWidth(2.0f); glColor3f(0.0,0.0,1.0); glBegin(GL_LINES); glVertex2f(200.0,240.0); glVertex2f(440.0,240.0); glEnd(); glLineWidth(1.0f); /* HUD */ glColor3f(1.0,0.0,0.0); glBegin(GL_LINES); glVertex2f(310,230); glVertex2f(330,230); glVertex2f(310,250); glVertex2f(330,250); glVertex2f(310,230); glVertex2f(310,234); glVertex2f(330,230); glVertex2f(330,234); glVertex2f(310,246); glVertex2f(310,250); glVertex2f(330,246); glVertex2f(330,250); glEnd(); /*glRecti(318,238,322,242);*/ glColor3f(0.0,1.0,0.0); glLineWidth(3.0f); glBegin(GL_LINES); glVertex2f(320.,235.); glVertex2f(320.,245.); glVertex2f(315.,240.); glVertex2f(325.,240.); glEnd(); glLineWidth(1.0f); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); } freefem++-3.38-1/src/medit/keyboard.c000644 000767 000024 00000052243 12354566553 017465 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" extern int refmat,reftype,refitem; int *pilmat,ipilmat; int refpick = -1; GLfloat dazim = 1.0; GLfloat delev = 1.0; extern void mouseCamera(int button,int state,int x,int y); extern void motionCamera(int x,int y); extern GLboolean picking ; static void usage() { fprintf(stdout,"\n"); fprintf(stdout,"-- Medit: OnLine Help --\n"); fprintf(stdout,"** Rendering options (toggle):\n"); fprintf(stdout,"f - facets l - lines g - const. entities\n"); fprintf(stdout,"c - obj. color e - material b - back color\n"); fprintf(stdout,"A - axis B - box G - grid\n"); fprintf(stdout,"C - capping r(R) - hide (show) refs.\n"); fprintf(stdout,"n - smooth/flat shading\n"); fprintf(stdout,"\n** Controls options:\n"); fprintf(stdout,"i - reset view a - animate I - interactive\n"); fprintf(stdout,"h - online help q - quit X - close window\n"); fprintf(stdout,"\n** View controls (ALT + key):\n"); fprintf(stdout,"c - copy d - duplicate p - paste l - link u - unlink\n"); fprintf(stdout,"J - toggle flight y - change axis\n"); fprintf(stdout,"\n** Misc. features\n"); fprintf(stdout,"L - load prefs W - save prefs\n"); fprintf(stdout,"H - hardcopy PPM\n"); fprintf(stdout,"F - face nums P - point nums # - select entity\n"); fprintf(stdout,"N - normals O - oppos. normals ! - select plane\n"); fprintf(stdout,"m - data o - iso-lines w - tensor/vector\n"); fprintf(stdout,"v - streamlines k - toggle elev. K - elev. coeff.\n"); fprintf(stdout,"j - toggle deco p - palette S - play animation\n"); fprintf(stdout,"+/- scale object z/Z scale view\n"); fprintf(stdout,"F1,F2,F3 - clipping: On/Off, Edit, Freeze\n"); } /* special keys CAMERA mode */ void specCamera(pScene sc,int key) { pCamera c; double dd,azim,elev; GLfloat axe[3]; int keyact; c = sc->camera; keyact = glutGetModifiers(); axe[0] = c->speed[2]; axe[1] = 0.0; axe[2] = -c->speed[0]; dd = sqrt(axe[0]*axe[0] + axe[2]*axe[2]); if ( dd != 0.0f ) { axe[0] /= dd; axe[2] /= dd; } switch (key) { case GLUT_KEY_LEFT: if ( keyact & GLUT_ACTIVE_SHIFT ) { c->eye[0] += axe[0]*c->altinc; c->eye[2] += axe[2]*c->altinc; reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); return; } else { azim = Azimuth(c); elev = Elevation(c); azim += dazim; } break; case GLUT_KEY_RIGHT: if ( keyact & GLUT_ACTIVE_SHIFT ) { c->eye[0] -= axe[0]*c->altinc; c->eye[2] -= axe[2]*c->altinc; reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); return; } else { azim = Azimuth(c); elev = Elevation(c); azim -= dazim; } break; case GLUT_KEY_UP: if ( keyact & GLUT_ACTIVE_SHIFT ) { c->eye[1] += c->altinc; reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); return; } else { azim = Azimuth(c); elev = Elevation(c); elev -= delev; } break; case GLUT_KEY_DOWN: if ( keyact & GLUT_ACTIVE_SHIFT ) { c->eye[1] -= c->altinc; reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); return; } else { azim = Azimuth(c); elev = Elevation(c); elev += delev; } break; default: return; } updateCamera(sc,c,azim,elev); /* refresh scene */ reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); } /* change center of scene */ static void changeCenter(pScene sc,pMesh mesh) { pPoint p0; pTriangle pt; pQuad pq; pTetra ptt; pHexa ph; float cx,cy,cz; int i; if ( !refitem ) return; cx = cy = cz = 0.0; switch(reftype) { case LPoint: p0 = &mesh->point[refitem]; cx = p0->c[0]; cy = p0->c[1]; cz = p0->c[2]; break; case LTria: pt = &mesh->tria[refitem]; for (i=0; i<3; i++) { p0 = &mesh->point[pt->v[i]]; cx += 0.33 * p0->c[0]; cy += 0.33 * p0->c[1]; cz += 0.33 * p0->c[2]; } break; case LQuad: pq = &mesh->quad[refitem]; for (i=0; i<4; i++) { p0 = &mesh->point[pq->v[i]]; cx += 0.25 * p0->c[0]; cy += 0.25 * p0->c[1]; cz += 0.25 * p0->c[2]; } break; case LTets: ptt = &mesh->tetra[refitem]; for (i=0; i<4; i++) { p0 = &mesh->point[ptt->v[i]]; cx += 0.25 * p0->c[0]; cy += 0.25 * p0->c[1]; cz += 0.25 * p0->c[2]; } break; case LHexa: ph = &mesh->hexa[refitem]; for (i=0; i<8; i++) { p0 = &mesh->point[ph->v[i]]; cx += 0.125 * p0->c[0]; cy += 0.125 * p0->c[1]; cz += 0.125 * p0->c[2]; } break; } /* reset translation and move to center */ sc->view->panx = sc->view->pany = 0.0; sc->cx = -cx; sc->cy = -cy; sc->cz = -cz; } /* special keys PERSPECTIVE mode */ void special(int key,int x,int y) { pTransform view; pScene sc; pMesh mesh; pClip clip; pCube cube; float pancoeff = 0.1f; int keyact,idw = currentScene(); ubyte post = TRUE; /* default */ if ( ddebug ) printf("special key %d\n",key); sc = cv.scene[idw]; /* special mode camera */ if ( sc->persp->pmode == CAMERA ) { specCamera(sc,key); return; } view = sc->view; mesh = cv.mesh[sc->idmesh]; clip = sc->clip; cube = sc->cube; keyact = glutGetModifiers(); if ( keyact & GLUT_ACTIVE_SHIFT ) pancoeff = 0.01; switch(key) { case GLUT_KEY_F1: /* toggle clipping plane */ if ( mesh->dim == 3 ) { if ( cube->active & C_ON) keyCube('C',0,0); else keyClip('C',0,0); } post = FALSE; break; case GLUT_KEY_F2: /* edit clipping plane */ if ( mesh->dim == 3 ) { if ( cube->active & C_ON) keyCube('E',0,0); else if ( clip->active & C_ON ) keyClip('E',0,0); } post = FALSE; break; case GLUT_KEY_F3: /* freeze clipping plane */ if ( cube->active & C_ON ) keyCube('F',0,0); else if ( clip->active & C_ON ) keyClip('F',0,0); post = FALSE; break; case GLUT_KEY_F4: /* toggle Vclip */ if ( mesh->dim == 3 ) keyClip('Z',0,0); post = FALSE; break; case GLUT_KEY_F5: /* Toggle Shrink */ if ( mesh->ntet+mesh->nhex > 0 ) keyFeature('V',0,0); else keyFeature('S',0,0); break; case GLUT_KEY_F6: /* Increase Shrink */ keyFeature('I',0,0); break; case GLUT_KEY_F7: /* Decrease Shrink */ keyFeature('i',0,0); break; case GLUT_KEY_LEFT: /* translate eyes or object */ if ( clip->active & C_EDIT ) { clip->cliptr->panx -= 0.02 * sc->dmax; clip->cliptr->angle = 0.0; clip->active |= C_UPDATE + C_REDO; } else if ( keyact & GLUT_ACTIVE_CTRL ) { sc->par.eyesep *= 0.9; printf("eyesep %f\n",sc->par.eyesep); } else view->panx -= pancoeff * sc->dmax; break; case GLUT_KEY_RIGHT: if ( clip->active & C_EDIT ) { clip->cliptr->panx += 0.02 * sc->dmax; clip->cliptr->angle = 0.0; clip->active |= C_UPDATE + C_REDO; } else if ( keyact & GLUT_ACTIVE_CTRL ) { sc->par.eyesep *= 1.1; printf("eyesep %f\n",sc->par.eyesep); } else view->panx += pancoeff * sc->dmax; break; case GLUT_KEY_UP: if ( clip->active & C_EDIT ) { clip->cliptr->pany += 0.02 * sc->dmax; clip->cliptr->angle = 0.0; clip->active |= C_UPDATE + C_REDO; } else view->pany += pancoeff * sc->dmax; break; case GLUT_KEY_DOWN: if ( clip->active & C_EDIT ) { clip->cliptr->pany -= 0.02 * sc->dmax; clip->cliptr->angle = 0.0; clip->active |= C_UPDATE + C_REDO; } else view->pany -= pancoeff * sc->dmax; break; default: return; } if ( post ) glutPostRedisplay(); } void keyScene(unsigned char key,int x,int y) { pMaterial pm; pTetra ptt; pHexa ph; pTriangle pt; pQuad pq; pScene sc,sc1; pMesh mesh; pClip clip; pCube cube; pPersp p; pCamera cam; double dd; float a,b,c,d; int k,keyact,numit,idw = currentScene(); ubyte post = FALSE,dolist = FALSE; if ( idw < 0 ) exit(0); /* ESC = end medit */ if ( key == 'q' || key == 27 ) exit(0); else if ( key == 'h' || key == '?' ) usage(); /* default */ sc = cv.scene[idw]; mesh = cv.mesh[sc->idmesh]; clip = sc->clip; cube = sc->cube; p = sc->persp; keyact = glutGetModifiers(); if ( key == ' ' ) { if ( option == MORPHING ) morphMesh(sc,mesh); else if ( sc->isotyp & S_PARTICLE ) { glutIdleFunc(0); } else { cam = sc->camera; cam->eye[0] += cam->spmod*cam->speed[0]; cam->eye[1] += cam->spmod*cam->speed[1]; cam->eye[2] += cam->spmod*cam->speed[2]; reshapeScene(sc->par.xs,sc->par.ys); } post = TRUE; } else if ( islower(key) ) { switch(key) { case 'a': /* toggle animate */ keyAnim('A',0,0); break; case 'b': /* backcolor */ keyColor('b',0,0); break; case 'c': if ( keyact & GLUT_ACTIVE_ALT ) keyView('C',0,0); else { sc->mode ^= S_COLOR; post = TRUE; } break; case 'd': if ( keyact & GLUT_ACTIVE_ALT ) keyView('D',0,0); break; case 'e': keyColor('e',0,0); break; case 'f': sc->mode ^= S_FILL; post=TRUE; break; case 'g': keyItem('g',0,0); break; case 'h': usage(); break; case 'i': keyView('R',0,0); if ( clip->active & C_ON ) resetClip(sc,clip,mesh); if ( cube->active & C_ON ) resetCube(sc,cube,mesh); sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; glutSetWindow(sc1->idwin); keyScene('i',0,0); } glutSetWindow(sc->idwin); break; case 'j': sc->type ^= S_DECO; post = TRUE; break; case 'k': keyMetric('k',0,0); break; case 'l': if ( keyact & GLUT_ACTIVE_ALT ) keyView('L',0,0); else sc->mode ^= S_BDRY; post = TRUE; break; case 'm': /* toggle metric */ if ( mesh->nbb ) keyMetric('m',0,0); keyMode('n',0,0); break; case 'o': /* iso-lines */ if ( mesh->nbb ) keyMetric('l',0,0); break; case 'p': if ( keyact & GLUT_ACTIVE_ALT ) keyView('P',0,0); else keyMetric('p',0,0); break; case 'r': if ( refmat<0 || ipilmat == sc->par.nbmat ) return; pilmat[++ipilmat] = refmat; pm = &sc->material[refmat]; pm->flag = 1; updatePoints(sc,mesh,refmat); if ( sc->picklist ) glDeleteLists(sc->picklist,1); sc->picklist = 0; refmat = -1; dolist = TRUE; post = TRUE; break; case 's': if ( !refitem ) return; switch(reftype) { case LTria: pt = &mesh->tria[refitem]; pt->v[0] = 0; break; case LQuad: pq = &mesh->quad[refitem]; pq->v[0] = 0; break; case LTets: ptt = &mesh->tetra[refitem]; ptt->v[0] = 0; break; case LHexa: ph = &mesh->hexa[refitem]; ph->v[0] = 0; break; } sc->picklist = 0; dolist = TRUE; post = TRUE; break; case 't': /* toggle texture */ /*keyColor('t',0,0);*/ break; case 'u': if ( keyact & GLUT_ACTIVE_ALT ) keyView('U',0,0); break; case 'v': keyMetric('v',0,0); break; case 'w': keyMetric('w',0,0); break; case 'x': if ( cube->active & C_EDIT ) { cube->cma[0] += 0.1*sc->dmax; post = TRUE; break; } case 'y': if ( cube->active & C_EDIT ) { cube->cma[1] += 0.1*sc->dmax; post = TRUE; break; } if ( p->pmode & CAMERA ) { cam = sc->camera; cam->vecup = (cam->vecup+1) % 3; switch(cam->vecup) { case X_AXIS: cam->altinc = (mesh->xmax-mesh->xmin); break; case Y_AXIS: cam->altinc = (mesh->ymax-mesh->ymin); break; case Z_AXIS: cam->altinc = (mesh->zmax-mesh->zmin); break; } cam->altinc *= 0.005f; sc->type |= S_RESET; reshapeScene(sc->par.xs,sc->par.ys); } /* tilt cut plane */ else if ( clip->active & C_EDIT ) tiltClip(sc,clip); else return; post = TRUE; break; case 'z': /* zoom in */ if ( cube->active & C_EDIT ) { cube->cma[2] += 0.1*sc->dmax; post = TRUE; break; } else { if ( p->rubber == 2 ) setPersp(sc,p,1); else p->fovy = max(0.9*p->fovy,1e-05); farclip(1); } post = TRUE; /* get linked view */ sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; memcpy(sc1->view,sc->view,sizeof(struct transform)); memcpy(sc1->persp,sc->persp,sizeof(struct sperspective)); glutSetWindow(sc1->idwin); reshapeScene(sc1->par.xs,sc1->par.ys); } glutSetWindow(sc->idwin); break; } } else if ( isupper(key) ) { switch(key) { case 'A': /* toggle axis */ keyItem('A',0,0); break; case 'B': /* toggle box */ keyItem('B',0,0); break; case 'C': /* toggle capping */ keyClip('K',0,0); break; case 'D': /* selection cube */ if (mesh->dim == 3 ) keyItem('D',0,0); break; case 'E': keyColor('E',0,0); glutSetWindow(sc->idwin); break; case 'F': /* toggle face nums */ keyItem('F',0,0); break; case 'G': /* toggle grid */ keyItem('G',0,0); break; case 'H': /* hardcopy PPM */ keyFile('H',0,0); break; case 'I': /* follows mouse */ sc->type ^= S_FOLLOW; sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; sc1->type = sc->type; } break; case 'J': if ( mesh->dim == 2 && !(sc->mode & S_ALTITUDE) ) break; if ( p->pmode == PERSPECTIVE ) { p->pmode = CAMERA; glutMouseFunc(mouseCamera); glutMotionFunc(motionCamera); } else { p->pmode = PERSPECTIVE; glutMouseFunc(mouse); glutMotionFunc(motion); } sc->type = S_RESET; reshapeScene(sc->par.xs,sc->par.ys); post = TRUE; break; case 'K': keyMetric('K',0,0); break; case 'L': keyFile('L',0,0); break; case 'M': morphing = 1-morphing; post = TRUE; break; case 'N': /* draw normals */ case 'O': if ( mesh->nvn ) keyItem(key,0,0); break; case 'P': /* toggle point nums */ keyItem('P',0,0); break; case 'Q': /*keyMetric('q',0,0);*/ break; case 'R': if ( ipilmat < 1 ) return; refmat = pilmat[ipilmat--]; pm = &sc->material[refmat]; pm->flag = 0; updatePoints(sc,mesh,refmat); dolist = TRUE; post = TRUE; break; case 'S': /* softcopy */ /*keyFile('S',0,0);*/ keyAnim('S',0,0); break; case 'V': /* change center of scene */ if ( !refitem ) return; changeCenter(sc,mesh); reshapeScene(sc->par.xs,sc->par.ys); post = TRUE; /* linked view */ sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; sc1->cx = sc->cx; sc1->cy = sc->cy; sc1->cz = sc->cz; memcpy(sc1->view,sc->view,sizeof(struct transform)); memcpy(sc1->persp,sc->persp,sizeof(struct sperspective)); glutSetWindow(sc1->idwin); reshapeScene(sc1->par.xs,sc1->par.ys); } glutSetWindow(sc->idwin); break; case 'W': keyFile('W',0,0); break; case 'X': /* close window */ if ( cube->active & C_EDIT ) { cube->cma[0] -= 0.1*sc->dmax; post = TRUE; break; } if ( idw != cv.nbs ) { deleteScene(sc); for (k=idw+1; kactive & C_EDIT ) { cube->cma[1] -= 0.1*sc->dmax; post = TRUE; break; } case 'Z': /* zoom out */ if ( cube->active & C_EDIT ) { cube->cma[2] -= 0.1*sc->dmax; post = TRUE; break; } else { if ( p->rubber == 2 ) setPersp(sc,p,0); else p->fovy = min(1.1*p->fovy,179.0); farclip(1); } post = TRUE; /* get linked view */ sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; memcpy(sc1->view,sc->view,sizeof(struct transform)); memcpy(sc1->persp,sc->persp,sizeof(struct sperspective)); glutSetWindow(sc1->idwin); reshapeScene(sc1->par.xs,sc1->par.ys); } glutSetWindow(sc->idwin); break; } } else { switch (key) { case '-': if (keyact & GLUT_ACTIVE_ALT ) { keyAnim('p',0,0); break; } if ( cube->active & C_EDIT ) { cube->cma[0] *= 0.95; cube->cma[1] *= 0.95; cube->cma[2] *= 0.95; post = TRUE; break; } if ( sc->persp->pmode == CAMERA ) { cam = sc->camera; cam->spmod -= 1.e-04 * sc->dmax; post = TRUE; break; } if ( p->depth < -20.0*sc->dmax ) break; p->depth -= 0.1*sc->dmax; farclip(1); post = TRUE; /* if ( p->rubber == 2 ) setPersp(sc,p,0); else p->fovy = min(1.1*p->fovy,179.0); farclip(1); post = TRUE; */ /* get linked view */ sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; memcpy(sc1->view,sc->view,sizeof(struct transform)); memcpy(sc1->persp,sc->persp,sizeof(struct sperspective)); glutSetWindow(sc1->idwin); reshapeScene(sc1->par.xs,sc1->par.ys); } glutSetWindow(sc->idwin); break; case '+': if (keyact & GLUT_ACTIVE_ALT ) { keyAnim('n',0,0); break; } if ( cube->active & C_EDIT ) { cube->cma[0] *= 1.05; cube->cma[1] *= 1.05; cube->cma[2] *= 1.05; post = TRUE; break; } if ( sc->persp->pmode == CAMERA ) { cam = sc->camera; cam->spmod += 1.e-04 * sc->dmax; post = TRUE; break; } if ( p->depth > 0.0 ) break; p->depth += 0.1*sc->dmax; farclip(1); post = TRUE; /* if ( p->rubber == 2 ) setPersp(sc,p,1); else p->fovy = max(0.9*p->fovy,1e-05); farclip(1); post = TRUE; */ /* update linked view */ sc1 = sc; while ( sc1->slave > -1 ) { sc1 = cv.scene[sc1->slave]; memcpy(sc1->view,sc->view,sizeof(struct transform)); memcpy(sc1->camera,sc->camera,sizeof(struct camera)); memcpy(sc1->persp,sc->persp,sizeof(struct sperspective)); glutSetWindow(sc1->idwin); reshapeScene(sc1->par.xs,sc1->par.ys); } glutSetWindow(sc->idwin); break; case '#': /* select entity */ fprintf(stdout,"ENTITY NUMBER: "); fflush(stdout); fflush(stdin); fscanf(stdin,"%d",&numit); if ( sc->picklist ) glDeleteLists(sc->picklist,1); if ( numit > 0 ) sc->picklist = pickItem(mesh,sc,numit); post = TRUE; break; case '=': picking = GL_TRUE; if ( sc->picklist ) glDeleteLists(sc->picklist,1); sc->picklist = pickingScene(sc,x,y,0); break; case '!': /* clip plane */ return; if ( !(clip->active & C_ON) ) return; dd = clip->eqn[3]-clip->eqn[0]*mesh->xtra \ - clip->eqn[1]*mesh->ytra-clip->eqn[2]*mesh->ztra; fprintf(stdout,"\nCurrent plane: %gx %+gy %+gz %+g = 0\n", clip->eqn[0],clip->eqn[1],clip->eqn[2],dd); fprintf(stdout,"Plane coeffs : "); fflush(stdout); fflush(stdin); fscanf(stdin,"%f %f %f %f",&a,&b,&c,&d); resetClip(sc,clip,mesh); clip->eqn[0] = a; clip->eqn[1] = b; clip->eqn[2] = c; clip->eqn[3] = d; fprintf(stdout,"New plane eq.: "); if ( clip->eqn[0] ) fprintf(stdout,"%+gx",clip->eqn[0]); if ( clip->eqn[1] ) fprintf(stdout," %+gy",clip->eqn[1]); if ( clip->eqn[2] ) fprintf(stdout," %+gz",clip->eqn[2]); if ( clip->eqn[3] ) fprintf(stdout," %+g",clip->eqn[3]); fprintf(stdout," = 0\n"); clip->eqn[3] += (a*mesh->xtra+b*mesh->ytra+c*mesh->ztra); post = TRUE; dolist = TRUE; break; case '@': /* add trajectoire point */ if ( p->pmode == CAMERA ) pathAdd(sc,x,y); break; case '%': fprintf(stdout,"reference (%d): ",refpick); fflush(stdout); fflush(stdin); fscanf(stdin,"%d",&refpick); break; case '&': puts("ADJUST"); parEdit(sc); break; } } if ( dolist ) { doLists(sc,mesh); doMapLists(sc,mesh,1); doIsoLists(sc,mesh,1); } if ( post ) glutPostRedisplay(); } freefem++-3.38-1/src/medit/listnum.c000644 000767 000024 00000006216 11406142256 017342 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" void updatePoints(pScene sc,pMesh mesh,int refmat) { pPoint ppt; pTriangle pt; pQuad pq; pTetra ptet; pHexa ph; pMaterial pm; int i,k,m; /* mark all points */ for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ppt->tag = M_UNUSED; } /* unmark points */ for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; if ( pm->flag ) continue; /*triangles */ k = pm->depmat[LTria]; while ( k > 0 ) { pt = &mesh->tria[k]; if ( pt->v[0] ) { for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; ppt->tag &= ~M_UNUSED; } } k = pt->nxt; } /* quads */ k = pm->depmat[LQuad]; while ( k > 0 ) { pq = &mesh->quad[k]; if ( pq->v[0] ) { for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; ppt->tag &= ~M_UNUSED; } } k = pq->nxt; } /* tetras */ k = pm->depmat[LTets]; while ( k > 0 ) { ptet = &mesh->tetra[k]; if ( ptet->v[0] ) { for (i=0; i<4; i++) { ppt = &mesh->point[ptet->v[i]]; ppt->tag &= ~M_UNUSED; } } k = ptet->nxt; } /* hexas */ k = pm->depmat[LHexa]; while ( k > 0 ) { ph = &mesh->hexa[k]; if ( ph->v[0] ) { for ( i=0; i<8; i++) { ppt = &mesh->point[ph->v[i]]; ppt->tag &= ~M_UNUSED; } } k = ph->nxt; } } } void listNum(pScene sc,pMesh mesh) { pMaterial pm; pPoint ppt; pTriangle pt; pQuad pq; double cx,cy,cz; int k,i,m; glDisable(GL_LIGHTING); /* point numbers */ if ( sc->item & S_NUMP ) { for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag == M_UNUSED ) continue; if ( ppt->ref ) { m = matRef(sc,ppt->ref); pm = &sc->material[m]; glColor3f(pm->dif[0],pm->dif[1],pm->dif[2]); } else glColor3fv(sc->par.line); output3(ppt->c[0],ppt->c[1],ppt->c[2],"%d",k); } } /* facets numbers */ if ( sc->item & S_NUMF ) { glColor4fv(sc->par.line); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; if ( pm->flag ) continue; /*triangles */ k = pm->depmat[LTria]; while ( k > 0 ) { pt = &mesh->tria[k]; if ( pt->v[0] ) { cx = cy = cz = 0.0f; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; cx += 0.333 * ppt->c[0]; cy += 0.333 * ppt->c[1]; cz += 0.333 * ppt->c[2]; } output3(cx,cy,cz,"%d",k); } k = pt->nxt; } /* quads */ k = pm->depmat[LQuad]; while ( k > 0 ) { pq = &mesh->quad[k]; if ( pq->v[0] ) { cx = cy = cz = 0.0f; for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; cx += 0.25 * ppt->c[0]; cy += 0.25 * ppt->c[1]; cz += 0.25 * ppt->c[2]; } output3(cx,cy,cz,"%d",k); } k = pq->nxt; } } } } freefem++-3.38-1/src/medit/Makefile.am000644 000767 000024 00000003065 12214307167 017540 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- CXXLD=$(STATICTOOL) $(CXX) bin_PROGRAMS=$(MEDITPROG) EXTRA_DIST=picking.c EXTRA_PROGRAMS=ffmedit ffmedit_SOURCES= animat.c cube.c image.c listnum.c mouse.c persp.c stream.c zaldy2.c bbfile.c dlists.c inmsh2.c \ material.c normal.c tiles.c camera.c ellipse.c inout.c medit.c param.c psfile.c transform.c cenrad.c geometry.c \ inout_morice.c menus.c parsar.c scene.c util.c clip.c gisfil.c inout_popenbinaire.c mesh.c parsop.c scissor.c vector.c \ clipvol.c hash.c items.c mlists.c particle.c sftcpy.c view.c critip.c ilists.c keyboard.c morphing.c path.c status.c \ zaldy1.c chrono.h extern.h image.h mesh.h eigenv.h grafic.h medit.h sproto.h LDADD=picking.$(OBJEXT) ../libMesh/libMesh.a $(LIBSGLUT) -lm AM_CPPFLAGS=-I$(srcdir)/../libMesh BUILT_SOURCES=compil.date compil.date: $(ffmedit_SOURCES) echo "#define COMPIL " '"' `date` '(with ff++ $(VERSION))''"' > compil.date #.PHONY: compil.date # ALH - during a parallel make, we should make sure that picking.o is not used before being made by a different # thread. If I understand things correctly, picking.c should not be compiled with the regular CFLAGS options. ffmedit_DEPENDENCIES=picking.$(OBJEXT) picking.$(OBJEXT):picking.c ${CC} -c $< $(CNOFLAGS) -o $@ ###pinking.no-optffmedit$(EXEEXT):picking.c ### rm picking.$(OBJEXT) ### $(MAKE) picking.o $(MEDITPROG) CFLAGS="$(CNOFLAGS)" ### touch pinking.no-optffmedit$(EXEEXT) ###pinking.no-opt:picking.c ### touch pinking.no-opt ###clean-local: ### -rm pinking.no-opt pinking.no-optffmedit$(EXEEXT) freefem++-3.38-1/src/medit/Makefile.in000644 000767 000024 00000070433 12543260340 017550 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ EXTRA_PROGRAMS = ffmedit$(EXEEXT) subdir = src/medit ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_ffmedit_OBJECTS = animat.$(OBJEXT) cube.$(OBJEXT) image.$(OBJEXT) \ listnum.$(OBJEXT) mouse.$(OBJEXT) persp.$(OBJEXT) \ stream.$(OBJEXT) zaldy2.$(OBJEXT) bbfile.$(OBJEXT) \ dlists.$(OBJEXT) inmsh2.$(OBJEXT) material.$(OBJEXT) \ normal.$(OBJEXT) tiles.$(OBJEXT) camera.$(OBJEXT) \ ellipse.$(OBJEXT) inout.$(OBJEXT) medit.$(OBJEXT) \ param.$(OBJEXT) psfile.$(OBJEXT) transform.$(OBJEXT) \ cenrad.$(OBJEXT) geometry.$(OBJEXT) inout_morice.$(OBJEXT) \ menus.$(OBJEXT) parsar.$(OBJEXT) scene.$(OBJEXT) \ util.$(OBJEXT) clip.$(OBJEXT) gisfil.$(OBJEXT) \ inout_popenbinaire.$(OBJEXT) mesh.$(OBJEXT) parsop.$(OBJEXT) \ scissor.$(OBJEXT) vector.$(OBJEXT) clipvol.$(OBJEXT) \ hash.$(OBJEXT) items.$(OBJEXT) mlists.$(OBJEXT) \ particle.$(OBJEXT) sftcpy.$(OBJEXT) view.$(OBJEXT) \ critip.$(OBJEXT) ilists.$(OBJEXT) keyboard.$(OBJEXT) \ morphing.$(OBJEXT) path.$(OBJEXT) status.$(OBJEXT) \ zaldy1.$(OBJEXT) ffmedit_OBJECTS = $(am_ffmedit_OBJECTS) ffmedit_LDADD = $(LDADD) am__DEPENDENCIES_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ffmedit_SOURCES) DIST_SOURCES = $(ffmedit_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ CXXLD = $(STATICTOOL) $(CXX) bin_PROGRAMS = $(MEDITPROG) EXTRA_DIST = picking.c ffmedit_SOURCES = animat.c cube.c image.c listnum.c mouse.c persp.c stream.c zaldy2.c bbfile.c dlists.c inmsh2.c \ material.c normal.c tiles.c camera.c ellipse.c inout.c medit.c param.c psfile.c transform.c cenrad.c geometry.c \ inout_morice.c menus.c parsar.c scene.c util.c clip.c gisfil.c inout_popenbinaire.c mesh.c parsop.c scissor.c vector.c \ clipvol.c hash.c items.c mlists.c particle.c sftcpy.c view.c critip.c ilists.c keyboard.c morphing.c path.c status.c \ zaldy1.c chrono.h extern.h image.h mesh.h eigenv.h grafic.h medit.h sproto.h LDADD = picking.$(OBJEXT) ../libMesh/libMesh.a $(LIBSGLUT) -lm AM_CPPFLAGS = -I$(srcdir)/../libMesh BUILT_SOURCES = compil.date #.PHONY: compil.date # ALH - during a parallel make, we should make sure that picking.o is not used before being made by a different # thread. If I understand things correctly, picking.c should not be compiled with the regular CFLAGS options. ffmedit_DEPENDENCIES = picking.$(OBJEXT) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/medit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/medit/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) ffmedit$(EXEEXT): $(ffmedit_OBJECTS) $(ffmedit_DEPENDENCIES) $(EXTRA_ffmedit_DEPENDENCIES) @rm -f ffmedit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ffmedit_OBJECTS) $(ffmedit_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/animat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bbfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cenrad.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipvol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/critip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cube.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ellipse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gisfil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ilists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inmsh2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inout_morice.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inout_popenbinaire.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/items.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listnum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/medit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mesh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mlists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/morphing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mouse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/param.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parsar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parsop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/particle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scene.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scissor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftcpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/status.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaldy1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaldy2.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile compil.date: $(ffmedit_SOURCES) echo "#define COMPIL " '"' `date` '(with ff++ $(VERSION))''"' > compil.date picking.$(OBJEXT):picking.c ${CC} -c $< $(CNOFLAGS) -o $@ ###pinking.no-optffmedit$(EXEEXT):picking.c ### rm picking.$(OBJEXT) ### $(MAKE) picking.o $(MEDITPROG) CFLAGS="$(CNOFLAGS)" ### touch pinking.no-optffmedit$(EXEEXT) ###pinking.no-opt:picking.c ### touch pinking.no-opt ###clean-local: ### -rm pinking.no-opt pinking.no-optffmedit$(EXEEXT) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/medit/material.c000644 000767 000024 00000033500 11406142256 017441 0ustar00hechtstaff000000 000000 #include #include "medit.h" #include "extern.h" #include "sproto.h" #define Width 630 #define Height 250 #define MAX_MAT 32 extern int refmat,reftype; /* globals */ pScene main_scene; GLint matwin=0,m_subwin; GLint selection; static float colors[MAX_MAT+1][3] = { {0.1, 0.4, 0.9}, /* blue */ {1.0, 0.0, 0.0}, /* red */ {0.0, 1.0, 0.0}, /* green */ {1.0, 1.0, 0.0}, /* yellow */ {0.0, 1.0, 1.0}, /* cyan */ {1.0, 0.5, 0.0}, /* orange */ {0.5, 0.0, 1.0}, /* violet */ {0.0, 0.0, 0.4}, /* dark blue */ {0.0, 0.4, 0.0}, /* dark green */ {0.4, 0.0, 0.0}, /* dark red */ {1.0, 1.0, 0.5}, {1.0, 0.5, 1.0}, {1.0, 0.5, 0.5}, {1.0, 0.5, 0.0}, /* orange */ {1.0, 0.0, 1.0}, {1.0, 0.0, 0.5}, {0.5, 1.0, 1.0}, {0.5, 1.0, 0.5}, {0.5, 1.0, 0.0}, {0.5, 0.5, 1.0}, {0.5, 0.5, 0.5}, {0.5, 0.5, 0.0}, {0.5, 0.0, 0.5}, {0.5, 0.0, 0.0}, {0.0, 1.0, 0.5}, {0.0, 0.5, 1.0}, {0.0, 0.5, 0.5}, {0.0, 0.5, 0.0}, {0.0, 0.0, 0.5}, {0.4, 0.4, 0.0}, /* dark yellow */ {0.0, 0.4, 0.4}, /* dark cyan */ {0.3, 0.7, 0.9}, /* default blue */ {0.3, 0.7, 0.9} /* default blue */ }; cell ambient[4] = { { 1, 120, 60, 0.0, 1.0, 0.0, 0.01, "Specifies R coordinate of ambient vector.", "%.2f" }, { 2, 180, 60, 0.0, 1.0, 0.0, 0.01, "Specifies G coordinate of ambient vector.", "%.2f" }, { 3, 240, 60, 0.0, 1.0, 0.0, 0.01, "Specifies B coordinate of ambient vector.", "%.2f" }, { 4, 300, 60, 0.0, 1.0, 0.0, 0.01, "Specifies A coordinate of ambient vector.", "%.2f" }, }; cell diffuse[4] = { { 5, 120, 90, 0.0, 1.0, 0.0, 0.01, "Specifies R coordinate of diffuse vector.", "%.2f" }, { 6, 180, 90, 0.0, 1.0, 0.0, 0.01, "Specifies G coordinate of diffuse vector.", "%.2f" }, { 7, 240, 90, 0.0, 1.0, 0.0, 0.01, "Specifies B coordinate of diffuse vector.", "%.2f" }, { 8, 300, 90, 0.0, 1.0, 0.0, 0.01, "Specifies A coordinate of diffuse vector.", "%.2f" }, }; cell specular[4] = { { 9, 120, 120, 0.0, 1.0, 0.0, 0.01, "Specifies R coordinate of specular vector.", "%.2f" }, { 10, 180, 120, 0.0, 1.0, 0.0, 0.01, "Specifies G coordinate of specular vector.", "%.2f" }, { 11, 240, 120, 0.0, 1.0, 0.0, 0.01, "Specifies B coordinate of specular vector.", "%.2f" }, { 12, 300, 120, 0.0, 1.0, 0.0, 0.01, "Specifies A coordinate of specular vector.", "%.2f" }, }; cell emission[4] = { { 13, 120, 150, 0.0, 1.0, 0.0, 0.01, "Specifies R coordinate of emission vector.", "%.2f" }, { 14, 180, 150, 0.0, 1.0, 0.0, 0.01, "Specifies G coordinate of emission vector.", "%.2f" }, { 15, 240, 150, 0.0, 1.0, 0.0, 0.01, "Specifies B coordinate of emission vector.", "%.2f" }, { 16, 300, 150, 0.0, 1.0, 0.0, 0.01, "Specifies A coordinate of emission vector.", "%.2f" }, }; cell shininess[1] = { { 17, 120, 180, 3.0, 128.0, 0.0, 0.5, "Specifies value of shininess.", "%.2f" }, }; void matInit(pScene sc) { pMaterial pm; int m,mm; /* default */ if ( !sc->material ) { sc->material = (pMaterial)M_calloc(2+sc->par.nbmat,sizeof(Material),"matinit"); assert(sc->material); sc->matsort = (int*)M_calloc(2+sc->par.nbmat,sizeof(int),"matinit"); assert(sc->matsort); } /* store color in table */ for (m=0; m<=sc->par.nbmat; m++) { pm = &sc->material[m]; /* diffuse : primary color */ mm = m % MAX_MAT; memcpy(pm->dif,colors[mm],3*sizeof(float)); pm->dif[3] = 1.0; /* ambient : grey level */ pm->amb[0] = pm->amb[1] = pm->amb[2] = 0.2; pm->amb[3] = 1.0; /* emission: null (pas un neon!) */ pm->emi[0] = pm->emi[1] = pm->emi[2] = 0.0; pm->emi[3] = 1.0; /* specular: soleil blanc */ pm->spe[0] = pm->spe[1] = pm->spe[2] = 0.4; pm->spe[3] = 1.0; /* shininess: etalement des reflections spec. */ pm->shininess = 80.0; if ( m != DEFAULT_MAT ) sprintf(pm->name,"%s%.2d","MAT",m); else strcpy(pm->name,"DEFAULT_MAT"); pm->flag = 0; if ( !pm->ref ) pm->ref = m; pm->sort = m; } } void matSort(pScene sc) { pMaterial pm,pm1; int m,mm,transp; /* sort materials */ if ( !quiet ) fprintf(stdout," Sorting %d materials\n",sc->par.nbmat); transp = 0; for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; pm->sort = m; sc->matsort[m] = m; if ( pm->dif[3] < 0.999 ) transp++; } if ( !transp ) return; /* sorting */ if ( ddebug ) fprintf(stdout," %d translucent\n",transp); mm = sc->par.nbmat - 1; for (m=0; mpar.nbmat-transp-1; m++) { pm = &sc->material[m]; if ( pm->dif[3] < 0.995 ) { pm1 = &sc->material[mm]; sc->matsort[mm] = m; sc->matsort[m] = mm; pm->sort = mm; pm1->sort = m; mm--; } } } int matRef(pScene sc,int ref) { pMaterial pm; int m; if ( !ref ) return(ref); for (m=1; mpar.nbmat; m++) { pm = &sc->material[m]; if ( pm->ref == ref ) return(m); } if ( sc->par.nbmat < 2 ) return(0); m = 1+(ref-1) % (sc->par.nbmat-1); return(m); } /* reshape material window */ void matReshape(int width,int height) { glutSetWindow(matwin); glViewport(0,0,Width,Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,Width,Height,0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutReshapeWindow(Width,Height); } static void cellInit(int mat) { pMaterial pm; int i; pm = &main_scene->material[mat]; for (i=0; i<4; i++) { ambient[i].value = pm->amb[i]; diffuse[i].value = pm->dif[i]; specular[i].value = pm->spe[i]; emission[i].value = pm->emi[i]; } shininess[0].value = pm->shininess; glutPostRedisplay(); } static int cellCopy(int mat) { pMaterial pm; int i,dosort; pm = &main_scene->material[mat]; dosort = pm->dif[3] != diffuse[3].value; for (i=0; i<4; i++) { pm->amb[i] = ambient[i].value; pm->dif[i] = diffuse[i].value; pm->spe[i] = specular[i].value; pm->emi[i] = emission[i].value; } pm->shininess = shininess[0].value; return(dosort); } static void cellDraw(cell* cel) { if ( selection == cel->id ) { glColor3ub(255,255,0); drwstr(10, 240,cel->info); glColor3ub(255,0,0); } else glColor3ub(0,255,128); drwstr(cel->x,cel->y,cel->format,cel->value); } static int cellHit(cell* cel,int x,int y) { if ( x > cel->x && x < cel->x + 60 && y > cel->y-30 && y < cel->y+10 ) return cel->id; else return 0; } static void cellUpdate(cell* cel,int update) { if ( selection != cel->id ) return; cel->value += update * cel->step; if (cel->value < cel->min) cel->value = cel->min; else if (cel->value > cel->max) cel->value = cel->max; } void matsubReshape(int x,int y) { GLfloat sunpos[4] = {5.,2.,10.0,0.}; glutSetWindow(m_subwin); glViewport(0,0,200,200); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(50.0,1.0,0.01f,100.0f); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE); glLightfv(GL_LIGHT0,GL_POSITION,sunpos); glEnable(GL_LIGHT0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0,0.0,-5.0); glutSetWindow(matwin); } void matsubDisplay() { GLfloat amb[4],dif[4],emi[4],spe[4]; int i,transp; glutSetWindow(m_subwin); glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glClearColor(0.0f,0.0f,0.0f,1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_QUADS); glColor3f(0.8,0.,0.); glVertex3f(-2.0,-1.5,-2.0); glVertex3f( 0.0,-1.5,-2.0); glVertex3f( 0.0,-1.5,5.0); glVertex3f(-2.0,-1.5,5.0); glColor3f(0.,0.8,0.); glVertex3f( 0.0,-1.5,-2.0); glVertex3f( 2.0,-1.5,-2.0); glVertex3f( 2.0,-1.5,5.0); glVertex3f( 0.0,-1.5,5.0); glColor3f(0.,0.,0.8); glVertex3f( 0.0,-1.5,-5.0); glVertex3f( 2.0,-1.5,-5.0); glVertex3f( 2.0,-1.5,-2.0); glVertex3f( 0.0,-1.5,-2.0); glColor3f(0.4,0.4,0.4); glVertex3f(-2.0,-1.5,-5.0); glVertex3f( 0.0,-1.5,-5.0); glVertex3f( 0.0,-1.5,-2.0); glVertex3f(-2.0,-1.5,-2.0); glEnd(); glEnable(GL_LIGHTING); transp = ambient[3].value < 0.999 || diffuse[3].value < 0.999 || specular[3].value < 0.999; if ( transp ) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDepthMask(GL_FALSE); } for (i=0; i<4; i++) { amb[i] = ambient[i].value; dif[i] = diffuse[i].value; spe[i] = specular[i].value; emi[i] = emission[i].value; } glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,dif); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,amb); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,spe); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emi); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&shininess[0].value); glutSolidSphere(1.5,20,10); if ( transp ) { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } glutSwapBuffers(); glutSetWindow(matwin); } /* display mat properties */ void matDisplay() { pMaterial pm; glutSetWindow(matwin); glClearColor(0.1,0.1,0.1,1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); pm = &main_scene->material[refmat]; glColor3ub(255,255,0); setFont("helvetica", 18); drwstr(10,20,pm->name); glColor3ub(255,255,255); setFont("helvetica", 18); drwstr(30,ambient[0].y,"Ambient("); drwstr(170,ambient[0].y,","); drwstr(230,ambient[1].y,","); drwstr(290,ambient[2].y,","); drwstr(350,ambient[3].y,");"); cellDraw(&ambient[0]); cellDraw(&ambient[1]); cellDraw(&ambient[2]); cellDraw(&ambient[3]); glColor3ub(255,255,255); drwstr(40,diffuse[0].y,"Diffuse("); drwstr(170,diffuse[0].y,","); drwstr(230,diffuse[1].y,","); drwstr(290,diffuse[2].y,","); drwstr(350,diffuse[3].y,");"); cellDraw(&diffuse[0]); cellDraw(&diffuse[1]); cellDraw(&diffuse[2]); cellDraw(&diffuse[3]); glColor3ub(255,255,255); drwstr(25,specular[0].y,"Specular("); drwstr(170,specular[0].y,","); drwstr(230,specular[1].y,","); drwstr(290,specular[2].y,","); drwstr(350,specular[3].y,");"); cellDraw(&specular[0]); cellDraw(&specular[1]); cellDraw(&specular[2]); cellDraw(&specular[3]); glColor3ub(255,255,255); drwstr(25,emission[0].y,"Emission("); drwstr(170,emission[0].y,","); drwstr(230,emission[1].y,","); drwstr(290,emission[2].y,","); drwstr(350,emission[3].y,");"); cellDraw(&emission[0]); cellDraw(&emission[1]); cellDraw(&emission[2]); cellDraw(&emission[3]); glColor3ub(255,255,255); drwstr(20,shininess[0].y,"Shininess("); drwstr(350,shininess[0].y,");"); cellDraw(&shininess[0]); if ( !selection ) { glColor3ub(255,255,0); setFont("helvetica",18); drwstr(10,240,"Click and move the mouse to modify values ('A' to apply)."); } glutSwapBuffers(); } static int old_y = 0; void matMouse(int button,int state,int x,int y) { glutSetWindow(matwin); selection = 0; if ( button != GLUT_LEFT_BUTTON ) return; if ( state == GLUT_DOWN ) { /* mouse should only hit _one_ of the cells, so adding up all the hits just propagates a single hit. */ selection += cellHit(&ambient[0],x,y); selection += cellHit(&ambient[1],x,y); selection += cellHit(&ambient[2],x,y); selection += cellHit(&ambient[3],x,y); selection += cellHit(&diffuse[0],x,y); selection += cellHit(&diffuse[1],x,y); selection += cellHit(&diffuse[2],x,y); selection += cellHit(&diffuse[3],x,y); selection += cellHit(&specular[0],x,y); selection += cellHit(&specular[1],x,y); selection += cellHit(&specular[2],x,y); selection += cellHit(&specular[3],x,y); selection += cellHit(&emission[0],x,y); selection += cellHit(&emission[1],x,y); selection += cellHit(&emission[2],x,y); selection += cellHit(&emission[3],x,y); selection += cellHit(&shininess[0],x,y); } else { /* update material */ glutSetWindow(m_subwin); } old_y = y; glutPostRedisplay(); } static void matMotion(int x,int y) { cellUpdate(&ambient[0],old_y-y); cellUpdate(&ambient[1],old_y-y); cellUpdate(&ambient[2],old_y-y); cellUpdate(&ambient[3],old_y-y); cellUpdate(&diffuse[0],old_y-y); cellUpdate(&diffuse[1],old_y-y); cellUpdate(&diffuse[2],old_y-y); cellUpdate(&diffuse[3],old_y-y); cellUpdate(&specular[0],old_y-y); cellUpdate(&specular[1],old_y-y); cellUpdate(&specular[2],old_y-y); cellUpdate(&specular[3],old_y-y); cellUpdate(&emission[0],old_y-y); cellUpdate(&emission[1],old_y-y); cellUpdate(&emission[2],old_y-y); cellUpdate(&emission[3],old_y-y); cellUpdate(&shininess[0],old_y-y); old_y = y; glutPostRedisplay(); glutSetWindow(m_subwin); glutPostRedisplay(); } void matKeyboard(unsigned char key,int x,int y) { if ( isdigit(key) ) return; glutSetWindow(matwin); switch(key) { case 'a': case 'A': if ( cellCopy(refmat) ) matSort(main_scene); matwin = 0; glutHideWindow(); /*glutPostRedisplay();*/ glutSetWindow(main_scene->idwin); doLists(main_scene,cv.mesh[main_scene->idmesh]); glutPostRedisplay(); break; case 'q': case 27: matwin = 0; glutHideWindow(); glutPostRedisplay(); break; } } void matEdit(pScene sc) { /* init window */ if ( matwin || refmat < 0 ) return; matwin = m_subwin = 0; /* create 2d window */ glutInitWindowSize(Width,Height); matwin = glutCreateWindow("Material Properties"); if ( !matwin ) return; main_scene = sc; /* set callbacks */ glutSetIconTitle("MatProp"); glutReshapeFunc(matReshape); glutDisplayFunc(matDisplay); glutKeyboardFunc(matKeyboard); glutMouseFunc(matMouse); glutMotionFunc(matMotion); /* create 3d sub-window */ glutSetWindow(matwin); m_subwin = glutCreateSubWindow(matwin,400,20,200,200); if ( ddebug) printf("window %d\n",(int)matwin); glutDisplayFunc(matsubDisplay); glutReshapeFunc(matsubReshape); glutSetWindow(matwin); cellInit(refmat); } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/medit.c000644 000767 000024 00000024562 11500004024 016736 0ustar00hechtstaff000000 000000 /* medit.c mesh visualization tool * * Written by Pascal Frey, LJLL * Copyright (c) Inria, 1999-2007. All rights reserved. */ #include "medit.h" #include "compil.date" #ifdef ppc #include #endif /* global variables (see extern.h) */ GLboolean hasStereo = 1; Canvas cv; mytime ctim[TIMEMAX]; ubyte ddebug,animate,saveimg,imgtype,infogl,fullscreen; ubyte quiet,option,morphing,stereoMode; int menu,amenu,fmenu,femenu,vmenu,mmenu,smenu; int clmenu,cmenu,vwmenu,txmenu,trmenu; int animdep,animfin; /**********************/ /* Rajout pour popen */ ubyte dpopen,dpopensol,dpopenbin; static void excfun(int sigid) { fprintf(stdout,"\n Unexpected error:"); fflush(stdout); switch(sigid) { case SIGABRT: fprintf(stdout," Abnormal stop\n"); break; case SIGFPE: fprintf(stdout," Floating-point exception\n"); break; case SIGILL: fprintf(stdout," Illegal instruction\n"); break; case SIGSEGV: fprintf(stdout," Segmentation fault\n"); break; case SIGTERM: case SIGINT: fprintf(stdout," Program killed\n"); break; } exit(1); } static void endcod() { chrono(OFF,&ctim[0]); fprintf(stdout,"\n Total running seconds: %.2f\n",gttime(ctim[0])); fprintf(stdout," Thank you for using Medit.\n"); } static void grInfo(void) { GLboolean b; GLint i,win; win = glutCreateWindow("Info"); fprintf(stdout,"Graphic info:\n"); fprintf(stdout," GL Vendor:\t%s\n",glGetString(GL_VENDOR)); fprintf(stdout," GL Version:\t%s\n",glGetString(GL_VERSION)); fprintf(stdout," GL Renderer:\t%s\n\n",glGetString(GL_RENDERER)); glGetBooleanv(GL_RGBA_MODE,&b); if ( b ) fprintf(stdout," RGBA Mode\n"); glGetBooleanv(GL_DOUBLEBUFFER,&b); if ( b ) fprintf(stdout," Double Buffer\n"); glGetBooleanv(GL_STEREO,&b); if ( b ) fprintf(stdout," Stereo\n"); glGetIntegerv(GL_AUX_BUFFERS,&i); if ( i ) fprintf(stdout," Auxilary Buffers\t%2d\n",(int)i); glGetIntegerv(GL_INDEX_BITS,&i); if ( i ) fprintf(stdout," Index Bits\t\t%2d\n",(int)i); glGetIntegerv(GL_RED_BITS,&i); fprintf(stdout," RGBA Bits\t\t%2d",(int)i); glGetIntegerv(GL_GREEN_BITS,&i); fprintf(stdout,"\t%2d",(int)i); glGetIntegerv(GL_BLUE_BITS,&i); fprintf(stdout,"\t%2d",(int)i); glGetIntegerv(GL_ALPHA_BITS,&i); fprintf(stdout,"\t%2d\n",(int)i); glGetIntegerv(GL_ACCUM_RED_BITS,&i); fprintf(stdout," Accum RGBA Bits\t%2d",(int)i); glGetIntegerv(GL_ACCUM_GREEN_BITS,&i); fprintf(stdout,"\t%2d",(int)i); glGetIntegerv(GL_ACCUM_BLUE_BITS,&i); fprintf(stdout,"\t%2d",(int)i); glGetIntegerv(GL_ACCUM_ALPHA_BITS,&i); fprintf(stdout,"\t%2d\n",(int)i); glGetIntegerv(GL_DEPTH_BITS,&i); fprintf(stdout," Depth Bits\t\t%2d\n",(int)i); glGetIntegerv(GL_STENCIL_BITS,&i); fprintf(stdout," Stencil Bits\t\t%2d\n",(int)i); exit(1); } int medit0() { pMesh mesh; char data[128],*name; int k,l,ret; clock_t ct; /* default */ // fprintf(stdout," \n medit0() \n"); fprintf(stdout," Loading data file(s)\n"); ct = clock(); /* enter name */ if ( !cv.nbm ) { fprintf(stdout," File name(s) missing. Please enter : "); fflush(stdout); fflush(stdin); fgets(data,120,stdin); if ( !strlen(data) ) { fprintf(stdout," ## No data\n"); return(0); } /* parse file name(s) */ name = strtok(data," \n"); while( name ) { if ( !cv.mesh[cv.nbm] ) { cv.mesh[cv.nbm] = (pMesh)M_calloc(1,sizeof(Mesh),"medit0.mesh"); if ( !cv.mesh[cv.nbm] ) return(0); } /*(cv.mesh[cv.nbm])->name = calloc(strlen(name)+1,sizeof(char));*/ strcpy(cv.mesh[cv.nbm]->name,name); name = strtok(NULL," \n\0"); if ( ++cv.nbm == MAX_MESH ) break; } if ( !cv.nbm ) return(0); } if ( !cv.nbm ) { fprintf(stdout," Number of mesh missing:. Please enter : "); fflush(stdout); fflush(stdin); fgets(data,120,stdin); cv.nbm = atoi(data); } /* read mesh(es) */ k = 0; do { if ( !cv.mesh[k] ) { cv.mesh[k] = M_calloc(1,sizeof(Mesh),"medit0.mesh"); if ( !cv.mesh[k] ) return(0); } mesh = cv.mesh[k]; mesh->typ = 0; ret = loadMesh(mesh); if ( ret < 0 ) { mesh->typ = 1; ret = inmsh2(mesh); if ( !ret ) { mesh->typ = 2; ret = loadGIS(mesh); } } if ( ret <= 0 ) { for (l=k+1; lntet && !mesh->nt) || (mesh->nhex && !mesh->nq) ) meshSurf(mesh); meshBox(mesh,1); if ( !quiet ) meshInfo(mesh); /* read metric */ if ( !loadSol(mesh,mesh->name,1) ) bbfile(mesh); if ( !quiet && mesh->nbb ) fprintf(stdout," Solutions %8d\n",mesh->nbb); } while ( ++k < cv.nbm ); cv.nbs = cv.nbm; ct = difftime(clock(),ct); fprintf(stdout," Input seconds: %.2f\n", (double)ct/(double)CLOCKS_PER_SEC); return(cv.nbm); } int medit0_popen() { pMesh mesh; char data[128],*name; int k,l,ret; clock_t ct; /* default */ /*fprintf(stdout," \n medit0() \n");*/ fprintf(stdout," Loading data file(s)\n"); ct = clock(); /* enter number of mesh */ if ( !cv.nbm ) { fprintf(stdout," Number of mesh missing:. Please enter : "); fflush(stdout); fflush(stdin); fgets(data,128,stdin); cv.nbm = atoi(data); } /* read mesh(es) */ k = 0; do { // printf("mesh number %i\n",k+1); if ( !cv.mesh[k] ) { cv.mesh[k] = M_calloc(1,sizeof(Mesh),"medit0.mesh"); if ( !cv.mesh[k] ) return(0); } mesh = cv.mesh[k]; mesh->typ = 0; //fgets(data,128,stdin); //name = data; //printf("data=%s\n",data); //name = "toto.dat"; //strcpy(cv.mesh[k]->name,name); if(dpopenbin) ret = loadMesh_popen_bin(mesh); else ret = loadMesh_popen(mesh); /* compute mesh box */ if ( (mesh->ntet && !mesh->nt) || (mesh->nhex && !mesh->nq) ) meshSurf(mesh); meshBox(mesh,1); if ( !quiet ) meshInfo(mesh); /* /\* read metric *\/ // a changer lecture .sol et .bb */ /* if ( !loadSol_popen(mesh,mesh->name,1) ) */ /* bbfile_popen(mesh); */ /* if ( !quiet && mesh->nbb ) */ /* fprintf(stdout," Solutions %8d\n",mesh->nbb); */ if( dpopensol ){ if(dpopenbin) loadSol_popen_bin(mesh,mesh->name,1); else loadSol_popen(mesh,mesh->name,1); } if ( !quiet && mesh->nbb ) fprintf(stdout," Solutions %8d\n",mesh->nbb); } while ( ++k < cv.nbm ); cv.nbs = cv.nbm; ct = difftime(clock(),ct); fprintf(stdout," Input seconds: %.2f\n", (double)ct/(double)CLOCKS_PER_SEC); return(cv.nbm); } int medit1() { pScene scene; pMesh mesh; int k; clock_t ct; /* create grafix */ fprintf(stdout,"\n medit1() \n"); fprintf(stdout,"\n Building scene(s)\n"); ct = clock(); for (k=0; knbb ) return(0); setupPalette(scene,mesh); tetraIsoPOVray(scene,mesh); } else if ( !createScene(scene,k) ) { fprintf(stderr," ## Unable to create scene\n"); return(0); } } ct = difftime(clock(),ct); fprintf(stdout," Scene seconds: %.2f\n",(double)ct/(double)CLOCKS_PER_SEC); return(1); } int main(int argc,char *argv[]) { int type; char pwd[1024]; #ifdef ppc if ( !getwd(pwd) ) exit(2); #endif fprintf(stdout," -- Medit, Release %s (%s)\n",ME_VER,ME_REL); fprintf(stdout," %s.\n",ME_CPY); fprintf(stdout," compiled: %s.\n\n",COMPIL); /* trap exceptions */ signal(SIGABRT,excfun); signal(SIGFPE,excfun); signal(SIGILL,excfun); signal(SIGSEGV,excfun); signal(SIGTERM,excfun); signal(SIGINT,excfun); atexit(endcod); tminit(ctim,TIMEMAX); chrono(ON,&ctim[0]); /* default values */ option = STANDARD; saveimg = GL_FALSE; imgtype = P6; animate = FALSE; morphing = FALSE; fullscreen = FALSE; animdep = 0; animfin = 0; ddebug = FALSE; quiet = TRUE;//FALSE; stereoMode = 0; cv.nbm = cv.nbs = 0; /* default value for popen */ dpopen = FALSE; dpopenbin = FALSE; dpopensol = FALSE; /* init grafix */ parsar(argc,argv); //printf("fin de parsar"); if ( option == ISOSURF ) { fprintf(stdout,"ISOSURF"); if ( !medit0() ) exit(1); if ( !medit1() ) exit(1); return(0); } glutInit(&argc,argv); //printf("fin de glutInit"); #ifdef ppc chdir(pwd); #endif chrono(ON,&ctim[0]); if ( stereoMode == MONO ) type = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH; else type = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STEREO; glutInitDisplayMode(type); if ( infogl ) grInfo(); /* call animate or normal mode */ if( dpopen == FALSE ){ switch (option) { case STANDARD: case SCHNAUZER: if ( !medit0() ) exit(1); if ( !medit1() ) exit(1); break; case SEQUENCE: if ( !animat() ) exit(1); break; case SEQUENCE+PARTICLE: if ( !animat() ) exit(1); break; case MORPHING: if ( !medit0() ) exit(1); if ( !modeMorphing() ) exit(1); morphing = GL_FALSE; break; default: fprintf(stderr," ## Unrecognized option %d\n",option); exit(1); break; } } else{ switch (option) { case STANDARD: case SCHNAUZER: if ( !medit0_popen() ) exit(1); if ( !medit1() ) exit(1); break; case SEQUENCE: if ( !animat() ) exit(1); break; case SEQUENCE+PARTICLE: if ( !animat() ) exit(1); break; case MORPHING: if ( !medit0_popen() ) exit(1); if ( !modeMorphing() ) exit(1); morphing = GL_FALSE; break; default: fprintf(stderr," ## Unrecognized option %d\n",option); exit(1); break; } } /* main grafix loop */ fprintf(stdout,"\n Rendering scene(s)\n"); glGetBooleanv(GL_STEREO,&hasStereo); glutMainLoop(); return(0); } freefem++-3.38-1/src/medit/medit.h000644 000767 000024 00000003513 11406142256 016753 0ustar00hechtstaff000000 000000 #ifndef _MEDIT_H #define _MEDIT_H #include #include #include #include #include #include #include #include #include #include #ifdef WIN32 #include #endif #ifdef __APPLE__ #include #include #include #else #include #include #include #endif #include "chrono.h" #include "memory.h" #include "mesh.h" #include "grafic.h" #include "image.h" #include "sproto.h" #define ME_VER "3.0a" #define ME_REL "Nov. 30, 2007" #define ME_CPY "Copyright (c) LJLL, 1999-2007" #define ME_STR "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" #define DEFAULT_FILE "DEFAULT.medit" #define MAX_MESH 32 #define MAX_SCENE 32 #define MAX_OBJ 32 #define MAX_MATERIAL 128 #define DEFAULT_MAT 0 #define DTOR 0.0174532925 #define RTOD 57.29577951308232 #define EPS 1.e-06 #define EPS2 2.e-10 #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifdef M_PI #undef M_PI #undef M_PI_2 #endif #define M_PI 3.14159265358979323846 /* pi */ #define M_PI_2 1.57079632679489661923 /* pi/2 */ #ifdef min #undef min #undef max #endif #define min(a,b) ( ((a) < (b)) ? (a) : (b) ) #define max(a,b) ( ((b) > (a)) ? (b) : (a) ) /* check if numbers are equal */ #define egal(x,y) ( \ ( ((x) == 0.0f) ? (fabs(y) < EPS) : \ ( ((y) == 0.0f) ? (fabs(x) < EPS) : \ (fabs((x)-(y)) / (fabs(x) + fabs(y)) < EPS2) ) ) ) /* options */ enum { STANDARD=1, SEQUENCE, VERYBIG, MORPHING, SCHNAUZER, ISOSURF, PARTICLE}; /* structure canvas */ typedef struct canvas { pMesh mesh[MAX_MESH]; pScene scene[MAX_SCENE]; int nbm,nbs; } Canvas; typedef Canvas * pCanvas; #endif freefem++-3.38-1/src/medit/menus.c000644 000767 000024 00000074704 11406142256 017005 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" GLfloat altcoef=0.0; static int nbimg; extern int refitem,refmat,reftype,imstep,imreverse; extern int *pilmat,ipilmat; #define MAX_LST 128 /* rebuild display lists */ void doLists(pScene sc,pMesh mesh) { int k; /*default */ if ( ddebug ) printf("build display lists\n"); if ( !morphing ) glutSetCursor(GLUT_CURSOR_WAIT); for (k=0; kdlist[k] ) glDeleteLists(sc->dlist[k],1); if ( sc->clist[k] ) glDeleteLists(sc->clist[k],1); sc->dlist[k] = sc->clist[k] = (GLuint)0; } /* poly lists */ sc->dlist[LTria] = listTria(sc,mesh); sc->dlist[LQuad] = listQuad(sc,mesh); if ( !mesh->nt && !mesh->nq ) { sc->dlist[LTets] = listTetra(sc,mesh,0); sc->dlist[LHexa] = listHexa(sc,mesh,0); } if ( sc->clip->active & C_VOL ) sc->clip->active |= C_REDO; glutSetCursor(GLUT_CURSOR_INHERIT); checkErrors(); } /* build metric list */ void doMapLists(pScene sc,pMesh mesh,int reset) { int k; /*default */ if ( !mesh->sol ) return; if ( ddebug ) printf("build map lists\n"); glutSetCursor(GLUT_CURSOR_WAIT); /* delete old lists */ if ( reset ) { for (k=0; kmlist[k] ) glDeleteLists(sc->mlist[k],1); sc->mlist[k] = (GLuint)0; } } /* create map list */ if ( sc->mode & S_ALTITUDE ) { sc->mlist[LTria] = alt2dList(sc,mesh,LTria,sc->shrink,altcoef); sc->mlist[LQuad] = alt2dList(sc,mesh,LQuad,sc->shrink,altcoef); } else if ( sc->mode & S_MAP ) { if ( mesh->nt && !sc->mlist[LTria] ) sc->mlist[LTria] = listTriaMap(sc,mesh); if ( mesh->nq && !sc->mlist[LQuad] ) sc->mlist[LQuad] = listQuadMap(sc,mesh); if ( !mesh->nt && mesh->ntet && !sc->mlist[LTets] ) sc->mlist[LTets] = listTetraMap(sc,mesh,0); if ( !mesh->nq && mesh->nhex && !sc->mlist[LHexa] ) sc->mlist[LHexa] = listHexaMap(sc,mesh,0); } glutSetCursor(GLUT_CURSOR_INHERIT); checkErrors(); } /* rebuild iso-values lists */ void doIsoLists(pScene sc,pMesh mesh,int reset) { pPoint ppt; int k,kk,ret; /*default */ if ( ddebug ) printf("build iso lists\n"); glutSetCursor(GLUT_CURSOR_WAIT); /* delete old lists */ if ( reset ) { for (k=0; kilist[k] ) glDeleteLists(sc->ilist[k],1); if ( sc->vlist[k] ) glDeleteLists(sc->vlist[k],1); if ( sc->cplist ) glDeleteLists(sc->cplist,1); sc->ilist[k] = sc->vlist[k] = (GLuint)0; sc->cplist = (GLuint)0; } if ( sc->stream && sc->stream->nbstl ) { for (kk=0; kkstream->nbstl; kk++) { if ( sc->slist[kk] ) glDeleteLists(sc->slist[kk],1); sc->slist[kk] = (GLuint)0; } sc->slist = (GLuint)0; if ( reset < 2 ) sc->stream->nbstl = 0; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ppt->flag = 0; } } } /* iso-lines */ if ( sc->isotyp & S_ISOLINE ) { if ( mesh->nt && !sc->ilist[LTria] ) sc->ilist[LTria] = listTriaIso(sc,mesh); if ( mesh->nq && !sc->ilist[LQuad] ) sc->ilist[LQuad] = listQuadIso(sc,mesh); } /* iso-surfaces */ if ( sc->isotyp & S_ISOSURF ) { if ( mesh->ntet && !sc->ilist[LTets] ) sc->ilist[LTets] = listTetraIso(sc,mesh); } /* vector */ if ( sc->isotyp & S_VECTOR ) { if ( mesh->dim == 2 ) { if ( mesh->nt && !sc->vlist[LTria] ) sc->vlist[LTria] = listTria2dVector(mesh); if ( mesh->nq && !sc->vlist[LQuad] ) sc->vlist[LQuad] = listQuad2dVector(mesh); } else { if ( mesh->ntet+mesh->nhex == 0 ) { sc->vlist[LTria] = listTria3dVector(mesh); } else { if ( mesh->ntet && !sc->vlist[LTets] ) sc->vlist[LTets] = listClipTetraVector(mesh); else if ( mesh->nhex && !sc->vlist[LHexa] ) sc->vlist[LHexa] = listClipHexaVector(mesh); } } } /* streamlines */ if ( sc->isotyp & S_STREAML ) { if ( !mesh->adja || !sc->slist ) { sc->stream = createStream(sc,mesh); if ( !sc->stream ) sc->isotyp &= ~S_STREAML; } if ( sc->stream ) { if ( reftype == LPoint ) ret = streamRefPoint(sc,mesh); else if ( mesh->dim == 3 ) { if ( reftype == LTria ) ret = streamRefTria(sc,mesh); else if ( reftype == LQuad ) ret = streamRefQuad(sc,mesh); if ( sc->picklist ) glDeleteLists(sc->picklist,1); sc->picklist = 0; } } } /* critical points */ if ( sc->isotyp & S_CRITP ) { if ( mesh->dim == 2 ) if ( mesh->nt && !sc->cplist ) sc->cplist = listCritPoint(sc,mesh); } glutSetCursor(GLUT_CURSOR_INHERIT); checkErrors(); } void resetLists(pScene sc,pMesh mesh) { int kk; for (kk=0; kkdlist[kk] ) glDeleteLists(sc->dlist[kk],1); if ( sc->mlist[kk] ) glDeleteLists(sc->mlist[kk],1); if ( sc->ilist[kk] ) glDeleteLists(sc->ilist[kk],1); if ( sc->clist[kk] ) glDeleteLists(sc->clist[kk],1); if ( sc->cmlist[kk] ) glDeleteLists(sc->cmlist[kk],1); if ( sc->vlist[kk] ) glDeleteLists(sc->vlist[kk],1); if ( sc->cplist ) glDeleteLists(sc->cplist,1); sc->dlist[kk] = sc->clist[kk] = sc->mlist[kk] = (GLuint)0; sc->ilist[kk] = sc->vlist[kk] = sc->cplist = (GLuint)0; } if ( sc->glist ) glDeleteLists(sc->glist,1); if ( sc->nlist ) glDeleteLists(sc->nlist,1); sc->glist = sc->nlist = (GLuint)0; } void keyFile(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pTransform view; char *ptr,data[128]; ubyte post = FALSE,clipon; static int nfree = 0; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; view = sc->view; switch(key) { case 'L': /* load prefs */ if ( parsop(sc,mesh) ) { refitem = reftype = 0; setupPalette(sc,mesh); initGrafix(sc,mesh); doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,1); glClearColor(sc->par.back[0],sc->par.back[1],sc->par.back[2],sc->par.back[3]); post = GL_TRUE; } break; case 'W': /* save prefs */ saveMeditFile(mesh->name,sc); break; case 'R': /* reload mesh */ refitem = reftype = 0; if ( !meshUpdate(sc,mesh) ) exit(1); meshRef(sc,mesh); matSort(sc); setupPalette(sc,mesh); doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,1); glClearColor(sc->par.back[0],sc->par.back[1],sc->par.back[2],sc->par.back[3]); post = GL_TRUE; break; case 'S': /* save mesh */ strcpy(data,mesh->name); ptr = (char*)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; sprintf(data,"%s.d.mesh",data); clipon = sc->clip->active & C_ON; if ( clipon ) clipVertices(mesh,sc,sc->clip); saveMesh(sc,mesh,data,clipon); break; case 'B': case 'C': case 'G': case 'H': /* hardcopy */ case 'T': strcpy(data,mesh->name); ptr = (char*)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; ptr = (char*)strstr(data,".gis"); if ( ptr ) *ptr = '\0'; if ( option != SEQUENCE ) { if ( key == 'H' ) nfree = filnum(data,nfree,"ppm"); else nfree = filnum(data,nfree,"ps"); if ( nfree == -1 ) break; sprintf(data,"%s.%.3d",data,nfree); } else sprintf(data,"%s.ppm",data); if (!saveimg ) glutSetCursor(GLUT_CURSOR_WAIT); if ( key == 'B' || key == 'C' || key == 'G' ) imgTiling(sc,data,key); else imgHard(sc,data,key); if ( animate && !(sc->persp->pmode & CAMERA) && ++nbimg > 179 ) { view->angle = 0.0; nbimg = 0; keyAnim('A',0,0); } if (!saveimg ) glutSetCursor(GLUT_CURSOR_INHERIT); break; case 's': /* softcopy */ sftcpy(sc,mesh); post = FALSE; break; } if ( post ) glutPostRedisplay(); } void menuFile(int item) { keyFile((unsigned char)item,0,0); } void keyItem(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pCube cube; ubyte post = TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; cube = sc->cube; switch(key) { case 'A': /* draw axis */ sc->item ^= S_AXIS; break; case 'B': /* draw bounding box */ sc->item ^= S_BOX; break; case 'D': /*draw selection cube */ if ( cube->active & C_ON ) { cube->active &= ~(C_ON+C_EDIT); dumpCube(sc,mesh,cube); } else { cube->active |= C_ON; } break; case 'G': /* draw grid */ sc->item ^= S_GRID; break; case 'j': /* toggle info */ sc->type ^= S_DECO; break; case 'P': /* toggle point nums */ sc->item ^= S_NUMP; break; case 'F': /* toggle face nums */ sc->item ^= S_NUMF; break; case 'g': /* const. items */ if ( !sc->glist ) post = FALSE; sc->item ^= S_GEOM; break; case 'N': if ( mesh->nvn ) sc->type ^= S_NORMAL; else post = FALSE; break; case 'O': if ( mesh->nvn ) { sc->type ^= S_OPPOS; if ( sc->nlist ) { glDeleteLists(sc->nlist,1); sc->nlist = 0; } else post = FALSE; } else post = FALSE; break; } if ( post ) glutPostRedisplay(); } void menuItem(int item) { keyItem((unsigned char)item,0,0); } void keyAnim(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pClip clip; ubyte post = TRUE; char *ptr,base[256]; static int depart = -1; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; clip = sc->clip; if ( depart == -1 ) depart = animdep; switch(key) { case 'A': /* switch animation */ if ( animate ) { sc->view->manim = GL_FALSE; clip->cliptr->manim = GL_FALSE; sc->view->angle = 0.0f; glutIdleFunc(NULL); } else { sc->view->manim = GL_TRUE; clip->cliptr->manim = GL_TRUE; if ( sc->persp->pmode == CAMERA ) glutIdleFunc(glutIdle); } animate = 1-animate; post = FALSE; break; case 'I': /* save image */ saveimg = 1 - saveimg; nbimg = 0; post = GL_FALSE; break; case 'M': /* morphing */ if ( morphing ) glutIdleFunc(NULL); else glutIdleFunc(glutIdle); morphing = 1-morphing; post = FALSE; break; case 'R': /* next morph */ imreverse = 1-imreverse; break; case 'S': /* start animation */ if ( ddebug ) fprintf(stdout,"debut sequence %d a %d\n",animdep,animfin); glutSetWindow(sc->idwin); if ( option == SEQUENCE ) playAnim(sc,mesh,animdep,animfin); if ( !saveimg ) post = FALSE; break; case 'f': /* first mesh */ /* get basename */ ptr = (char *)strrchr(mesh->name,'.'); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); resetLists(sc,mesh); if ( !loadNextMesh(mesh,animdep,0) ) break; doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,0); if ( sc->isotyp ) doIsoLists(sc,mesh,0); strcpy(mesh->name,base); break; case 'l': /* get basename */ ptr = (char *)strrchr(mesh->name,'.'); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); resetLists(sc,mesh); if ( !loadNextMesh(mesh,animfin,0) ) break; doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,0); if ( sc->isotyp ) doIsoLists(sc,mesh,0); strcpy(mesh->name,base); break; case 'n': /* get basename */ if ( ++depart > animfin ) depart = animdep; ptr = (char *)strrchr(mesh->name,'.'); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); resetLists(sc,mesh); if ( !loadNextMesh(mesh,depart,0) ) break; doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,0); if ( sc->isotyp ) doIsoLists(sc,mesh,0); strcpy(mesh->name,base); break; case 'p': /* get basename */ if ( --depart < animdep ) depart = animfin; ptr = (char *)strrchr(mesh->name,'.'); if ( ptr ) *ptr = '\0'; strcpy(base,mesh->name); resetLists(sc,mesh); if ( !loadNextMesh(mesh,depart,0) ) break; doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,0); if ( sc->isotyp ) doIsoLists(sc,mesh,0); strcpy(mesh->name,base); break; } if ( post == TRUE ) glutPostRedisplay(); } void menuAnim(int item) { keyAnim((unsigned char)item,0,0); } void keyTrajet(unsigned char key,int x,int y) { pScene sc; pMesh mesh; sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; switch(key) { case 'C': /* add control point */ pathAdd(sc,x,y); break; case 'S': /* show all points */ sc->type ^= S_PATH; /*if ( sc->path.tlist ) glDeleteLists(sc->path.tlist,1);*/ if ( sc->type & S_PATH && !sc->path.tlist ) sc->path.tlist = pathList(sc); break; case 'F': /* follow path */ break; case 'L': /* load path */ pathLoad(mesh->name,sc); break; case 'W': /* save path */ pathSave(mesh->name,sc); break; } glutPostRedisplay(); } void menuTrajet(int item) { keyTrajet((unsigned char)item,0,0); } void keyMode(unsigned char key,int x,int y) { pScene sc; pMesh mesh; ubyte post = TRUE,dolist = FALSE,material; sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; material = sc->mode & S_MATERIAL; switch(key) { case 'D': /* depth lines */ if ( sc->mode == DEPTH ) break; sc->mode = DEPTH; break; case 'S': /* toggle smooth shading */ if ( sc->mode == FILL ) break; sc->mode = FILL; if ( material ) sc->mode |= S_MATERIAL; break; case 'P': /* toggle smooth shaded polys */ if ( sc->mode == SHADED ) break; sc->mode = SHADED; if ( material ) sc->mode |= S_MATERIAL; break; case 'H': /* hidden lines */ if ( sc->mode == HIDDEN ) break; sc->mode = HIDDEN; if ( material ) sc->mode |= S_MATERIAL; break; case 'W': /* wireframe */ if ( sc->mode == WIRE ) break; sc->mode = WIRE; if ( material ) sc->mode |= S_MATERIAL; break; case 'n': /* toggle normals */ if ( mesh->nvn == 0 ) { post = FALSE; break; } sc->type ^= S_FLAT; dolist = TRUE; break; default: post = FALSE; break; } if ( dolist == TRUE ) doLists(sc,mesh); if ( post == TRUE ) glutPostRedisplay(); } void menuMode(int item) { keyMode((unsigned char)item,0,0); } void menuScene(int item) { keyScene((unsigned char)item,0,0); } void keyView(unsigned char key,int x,int y) { pScene sc,sc1; pMesh mesh; float dmax; ubyte post = FALSE; sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; /*glutSetMenu(vmenu);*/ switch(key) { case 'R': sc->type |= S_RESET; dmax = mesh->xmax - mesh->xmin; dmax = max(dmax,mesh->ymax - mesh->ymin); dmax = max(dmax,mesh->zmax - mesh->zmin); sc->cx = sc->cy = sc->cz = 0.0f; sc->dmax = fabs(dmax); if ( sc->persp->pmode == PERSPECTIVE ) { resetTransform(sc->view); initPersp(sc->persp,sc->dmax); } else if ( sc->persp->pmode == CAMERA ) { initPersp(sc->persp,sc->dmax); initCamera(sc,sc->camera->vecup); sc->persp->pmode = CAMERA; } reshapeScene(sc->par.xs,sc->par.ys); post = TRUE; break; case 'C': copyView(sc->view,sc->camera,sc->persp); copyClip(sc->clip); break; case 'L': /* link view */ if ( !linkView(sc) ) return; reshapeScene(sc->par.xs,sc->par.ys); post = TRUE; break; case 'P': if ( pasteView(sc->view,sc->camera,sc->persp) && pasteClip(sc->clip) ) { reshapeScene(sc->par.xs,sc->par.ys); post = TRUE; } break; case 'U': unlinkView(sc); break; case 'D': /* duplicate view */ if ( cv.nbs == MAX_SCENE ) break; if ( !cv.scene[++cv.nbs] ) { cv.scene[cv.nbs] = (pScene)M_calloc(1,sizeof(Scene),"menus.scene"); if ( !cv.scene[cv.nbs] ) break; sc1 = cv.scene[cv.nbs]; sc1->material = (pMaterial)calloc(2+sc->par.nbmat,sizeof(Material)); assert(sc1->material); } sc1 = cv.scene[cv.nbs]; memcpy(sc1,sc,sizeof(Scene)); memcpy(sc1->material,sc->material,sc->par.nbmat*sizeof(Material)); memcpy(&sc1->par,&sc->par,sizeof(Param)); if ( !createScene(sc1,sc1->idmesh) ) { fprintf(stdout," ## Unable to create\n"); return; } copyView(sc->view,sc->camera,sc->persp); copyClip(sc->clip); pasteView(sc1->view,sc1->camera,sc1->persp); pasteClip(sc1->clip); break; } if ( post ) glutPostRedisplay(); } void menuView(int item) { keyView((unsigned char)item,0,0); } void keyColor(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pMaterial pm; int i,k; ubyte post = TRUE,dolist = FALSE; sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; switch(key) { case 'b': /* reverse backcolor */ sc->par.back[0] = 1.0f - sc->par.back[0]; sc->par.back[1] = 1.0f - sc->par.back[1]; sc->par.back[2] = 1.0f - sc->par.back[2]; glClearColor(sc->par.back[0],sc->par.back[1],sc->par.back[2],sc->par.back[3]); if ( !sc->par.linc ) { sc->par.line[0] = 1.0f - sc->par.line[0]; sc->par.line[1] = 1.0f - sc->par.line[1]; sc->par.line[2] = 1.0f - sc->par.line[2]; } break; case 'e': /* toggle matcolors */ sc->mode ^= S_MATERIAL; dolist = TRUE; break; case 'E': /* edit matcolors */ post = FALSE; matEdit(sc); break; case 'r': if ( refmat<0 || ipilmat == sc->par.nbmat ) break; pilmat[++ipilmat] = refmat; pm = &sc->material[refmat]; pm->flag = 1; updatePoints(sc,mesh,refmat); if ( sc->picklist ) glDeleteLists(sc->picklist,1); sc->picklist = 0; refmat = -1; dolist = TRUE; post = TRUE; break; case 'R': /* reset materials */ for (k=0; kpar.nbmat; k++) { pm = &sc->material[k]; for (i=LTria; i<=LHexa; i++) pm->depmat[i] = abs(pm->depmat[i]); } dolist = TRUE; break; default: post = FALSE; } if ( dolist ) doLists(sc,mesh); if ( post ) glutPostRedisplay(); } void menuColor(int item) { keyColor((unsigned char)item,0,0); } void keyClip(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pClip clip; ubyte post = TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; clip = sc->clip; switch(key) { case 'C': /* toggle clipping */ if ( clip->active & C_ON ) clip->active &= ~(C_ON+C_EDIT); else { clip->active |= C_ON; if ( mesh->ntet+mesh->nhex ) clip->active |= C_VOL; } break; case 'E': /* edit clip plane */ if ( !(clip->active & C_ON) ) return; if ( clip->active & C_FREEZE ) clip->active ^= C_FREEZE; clip->active ^= C_EDIT; break; case 'F': /* freeze clip */ if ( !(clip->active & C_ON) ) return; if ( clip->active & C_EDIT ) clip->active ^= C_EDIT; clip->active ^= C_FREEZE; break; case 'H': /* toggle draw plane */ clip->active ^= C_HIDE; break; case 'I': /* inverse orientation */ invertClip(sc,clip); clip->active |= C_REDO; break; case 'K': /* toggle capping */ clip->active ^= C_CAP; clip->active |= C_REDO; break; case 'R': /* reset clip */ if ( !(clip->active & C_ON) ) break; resetClip(sc,clip,mesh); break; case 'Z': /* toggle volclip */ clip->active ^= C_VOL; if ( clip->active & C_VOL ) clip->active |= C_REDO; break; } if ( post ) glutPostRedisplay(); } void menuClip(int item) { keyClip((unsigned char)item,0,0); } void keyCube(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pCube cube; ubyte post = TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; cube = sc->cube; switch(key) { case 'C': /* toggle clipping */ if ( cube->active & C_ON ) cube->active &= ~(C_ON+C_EDIT); else cube->active |= C_ON; break; case 'E': /* edit clip plane */ if ( !(cube->active & C_ON) ) return; if ( cube->active & C_FREEZE ) cube->active ^= C_FREEZE; cube->active ^= C_EDIT; break; case 'F': /* freeze cube */ if ( !(cube->active & C_ON) ) return; if ( cube->active & C_EDIT ) cube->active ^= C_EDIT; cube->active ^= C_FREEZE; break; case 'R': /* reset cube */ if ( !(cube->active & C_ON) ) break; resetCube(sc,cube,mesh); break; } if ( post ) glutPostRedisplay(); } void keyFeature(unsigned char key,int x,int y) { pScene sc; pMesh mesh; ubyte post=TRUE,dolist=TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; switch(key) { case 'S': /* shrink mode */ case 'V': /* volumic shrink */ if ( sc->shrink < 0.99 ) sc->shrink = 1.0f; else sc->shrink = 0.95; dolist = TRUE; break; case 'I': /* increase shrink value */ if ( sc->shrink > 0.99 ) break; sc->shrink -= .05; if ( sc->shrink < 0.1 ) sc->shrink = 0.1; dolist = TRUE; break; case 'i': /* decrease shrink value */ if ( sc->shrink > 0.99 ) break; sc->shrink += .05; if ( sc->shrink > 0.95 ) sc->shrink = 0.95; dolist = TRUE; break; case 's': /* scissor mode */ if ( mesh->dim == 2 ) break; sc->type ^= S_SCISSOR; if ( sc->type & S_SCISSOR ) glutDisplayFunc(scissorScene); else { glutDisplayFunc(redrawScene); reshapeScene(sc->par.xs,sc->par.ys); } break; } if ( dolist == TRUE ) { doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); /*if ( sc->isotyp ) doIsoLists(sc,mesh,1);*/ } if ( post == TRUE ) glutPostRedisplay(); } void menuFeature(int item) { keyFeature((unsigned char)item,0,0); } void menuImage(int item) { imgtype = item; } void keyMetric(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pPoint ppt; float maxd; int k,kk; ubyte post=TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; switch(key) { case 'c': /* critical points */ if ( !mesh->nbb ) return; sc->isotyp ^= S_CRITP; doIsoLists(sc,mesh,0); break; case 'f': /* flush streamlines */ if ( sc->stream->nbstl ) { for (kk=0; kkstream->nbstl; kk++) { if ( sc->slist[kk] ) glDeleteLists(sc->slist[kk],1); sc->slist[kk] = (GLuint)0; } sc->stream->nbstl = 0; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ppt->flag = 0; } } break; case 'l': /* iso-lines */ if ( !mesh->nbb ) return; sc->isotyp ^= S_ISOLINE; doIsoLists(sc,mesh,0); break; case 's': /* iso-surfaces */ if ( !mesh->nbb ) return; sc->isotyp ^= S_ISOSURF; doIsoLists(sc,mesh,0); break; case 'u': /* field lines animation */ if ( !mesh->nbb || mesh->nfield != mesh->dim ) return; if ( refitem ) { sc->isotyp |= S_PARTICLE; createParticle(sc,mesh); } glutIdleFunc(streamIdle); break; case 'd': /* displacement */ if ( !mesh->nbb || mesh->nfield != mesh->dim ) return; sc->mode ^= S_DISPL; meshCoord(mesh,(sc->mode & S_DISPL) ? 1 : 0); meshBox(mesh,1); doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,1); break; case 'v': /* streamlines */ if ( !mesh->nbb || mesh->nfield != mesh->dim ) return; if ( refitem ) { sc->isotyp |= S_STREAML; doIsoLists(sc,mesh,0); } else { if ( !streamIsoPoint(sc,mesh) ) { post = FALSE; sc->isotyp &= ~S_STREAML; } } break; case 'w': /*vector/tensor */ if ( mesh->nfield != mesh->dim ) { if ( mesh->dim==2 && mesh->nfield == 3 ) { if ( sc->picklist ) { glDeleteLists(sc->picklist,1); sc->picklist = 0; break; } else sc->picklist = drawAllEllipse(sc,mesh); break; } return; } sc->isotyp ^= S_VECTOR; if ( mesh->dim == 3 ) if ( mesh->ntet+mesh->nhex && !(sc->clip->active & C_ON) ) return; doIsoLists(sc,mesh,0); break; case 'k': /* toggle elevation */ if ( mesh->dim != 2 ) return; sc->mode ^= S_ALTITUDE; if ( altcoef == 0.0 ) { maxd = max(mesh->xmax-mesh->xmin,mesh->ymax-mesh->ymin); altcoef = 0.3*maxd / mesh->bbmax; } if ( !(sc->mode & S_ALTITUDE) ) sc->type |= S_RESET; doMapLists(sc,mesh,1); break; case 'K': /* elevation coeff */ fprintf(stdout,"elevation coeff (%.2f): ",altcoef); fflush(stdout); fflush(stdin); fscanf(stdin,"%f",&altcoef); if ( altcoef == 0.0 ) sc->mode |= ~S_ALTITUDE; sc->type |= S_RESET; doMapLists(sc,mesh,1); doIsoLists(sc,mesh,1); break; case 'm': /* display metric */ if ( !mesh->nbb ) return; sc->mode ^= S_MAP; doMapLists(sc,mesh,1); if ( sc->mode & S_MAP ) { if ( sc->clip->active & C_ON ) sc->clip->active |= C_REDO; if ( !(sc->item & S_PALETTE) ) sc->item ^= S_PALETTE; } else if ( sc->item & S_PALETTE ) sc->item ^= S_PALETTE; break; case 'p': /* toggle palette */ if ( !mesh->nbb ) return; sc->item ^= S_PALETTE; break; default: post = FALSE; break; } if ( post ) glutPostRedisplay(); } void menuMetric(int item) { keyMetric((unsigned char)item,0,0); } int createMenus(pScene sc,pMesh mesh) { int menu,amenu,fmenu,femenu,vmenu,mmenu,smenu; int clmenu,cmenu,vwmenu,trmenu; /* default */ if ( ddebug ) printf("create menus\n"); smenu = 0; /* File management menu */ fmenu = glutCreateMenu(menuFile); glutAddMenuEntry("[L] Load prefs",'L'); glutAddMenuEntry("[W] Save prefs",'W'); glutAddMenuEntry(" Update mesh",'R'); glutAddMenuEntry(" Save mesh",'S'); glutAddMenuEntry("[H] Hardcopy PPM",'H'); glutAddMenuEntry(" Hardcopy EPS (Color)",'C'); glutAddMenuEntry(" Hardcopy EPS (Grey)",'G'); glutAddMenuEntry(" Hardcopy EPS (B/W)",'B'); glutAddMenuEntry(" Softcopy EPS",'s'); /* rendering mode selector */ mmenu = glutCreateMenu(menuMode); glutAddMenuEntry("Wireframe",'W'); glutAddMenuEntry("Depth lines",'D'); glutAddMenuEntry("Hidden lines",'H'); glutAddMenuEntry("Shading",'S'); glutAddMenuEntry("Shading+lines",'P'); if ( mesh->nvn > 0 ) glutAddMenuEntry("[n] Toggle Normals",'n'); /* color & material menu */ cmenu = glutCreateMenu(menuColor); glutAddMenuEntry("[b] Toggle backcolor",'b'); glutAddMenuEntry("[e] Toggle matcolors",'e'); glutAddMenuEntry("[E] Edit matcolors",'E'); glutAddMenuEntry("[r] Hide material",'r'); glutAddMenuEntry("[R] Reset materials",'R'); /* metric */ if ( mesh->nbb > 0 ) { smenu = glutCreateMenu(menuMetric); glutAddMenuEntry("[m] Toggle metric",'m'); glutAddMenuEntry("[p] Toggle palette",'p'); if ( mesh->typage == 2 ) glutAddMenuEntry("[o] Toggle iso-lines",'l'); if ( mesh->ntet+mesh->nhex > 0 && mesh->nfield == 1 ) glutAddMenuEntry(" Toggle iso-surfaces",'s'); if ( mesh->nfield == mesh->dim ) { glutAddMenuEntry("[w] Toggle vector/tensor",'w'); glutAddMenuEntry(" Toggle displacement",'d'); glutAddMenuEntry("[v] Toggle streamlines",'v'); glutAddMenuEntry(" Flush streamlines",'f'); glutAddMenuEntry(" Particle advection",'u'); if ( mesh->dim == 2 ) glutAddMenuEntry(" Critical points",'c'); } if ( mesh->dim == 2 ) { glutAddMenuEntry("[k] Toggle elevation",'k'); glutAddMenuEntry("[K] Elevation coeff",'K'); } } /* Show misc. items */ vmenu = glutCreateMenu(menuItem); glutAddMenuEntry("[A] Axis",'A'); glutAddMenuEntry("[B] Bounding box",'B'); glutAddMenuEntry("[G] Grid ",'G'); if ( sc->glist ) glutAddMenuEntry("[g] Geometric items",'g'); glutAddMenuEntry("[j] Toggle Info",'j'); glutAddMenuEntry("[P] Toggle Point num",'P'); glutAddMenuEntry("[F] Toggle Face num",'F'); if ( mesh->nvn ) { glutAddMenuEntry("[N] Toggle normals",'N'); glutAddMenuEntry("[O] Revert normals",'O'); } /* clipping menu */ clmenu = glutCreateMenu(menuClip); glutAddMenuEntry("[F1] Toggle clip",'C'); glutAddMenuEntry("[F2] Edit clip",'E'); glutAddMenuEntry("[F3] Freeze clip",'F'); glutAddMenuEntry(" Inverse orient",'I'); if ( mesh->ntet+mesh->nhex > 0 ) glutAddMenuEntry(" Toggle capping",'K'); glutAddMenuEntry(" Toggle plane",'H'); glutAddMenuEntry(" -- Reset clip",'R'); if ( mesh->ntet+mesh->nhex > 0 ) { sc->clip->active |= C_VOL; glutAddMenuEntry("[F4] Toggle Vclip",'Z'); } /* feature menu */ femenu = glutCreateMenu(menuFeature); if ( mesh->ntet+mesh->nhex > 0 ) glutAddMenuEntry("[F5] Toggle Vshrink",'V'); else glutAddMenuEntry("[F5] Toggle shrink",'S'); glutAddMenuEntry("[F6] Increase shrink",'I'); glutAddMenuEntry("[F7] Decrease shrink",'i'); if ( mesh->dim == 3 ) glutAddMenuEntry("Toggle splitview",'s'); /* view handler menu */ vwmenu = glutCreateMenu(menuView); glutAddMenuEntry("[i] Reset",'R'); glutAddMenuEntry("[Alt-c] Copy",'C'); glutAddMenuEntry("[Alt-p] Paste",'P'); glutAddMenuEntry("[Alt+l] Link",'L'); glutAddMenuEntry("[Alt+u] Unlink",'U'); /*glutAddMenuEntry("[Alt+d] Duplicate",'D');*/ /* animation menu */ amenu = glutCreateMenu(menuAnim); glutAddMenuEntry("[a] Toggle Anim",'A'); glutAddMenuEntry("Toggle ImgSave",'I'); if ( option == SEQUENCE || option == SEQUENCE + PARTICLE ) { glutAddMenuEntry("Play sequence",'S'); glutAddMenuEntry("First mesh",'f'); glutAddMenuEntry("Last mesh",'l'); glutAddMenuEntry("Next mesh",'n'); glutAddMenuEntry("Prev mesh",'p'); } else if ( option == MORPHING ) { glutAddMenuEntry("Start/Stop morph.",'M'); glutAddMenuEntry("Toggle AutoReverse",'R'); } /* trajectoire menu */ if ( mesh->dim == 3 || mesh->nbb ) { trmenu = glutCreateMenu(menuTrajet); glutAddMenuEntry("New Ctrl point",'C'); glutAddMenuEntry("Toggle path",'S'); glutAddMenuEntry("Follow path",'F'); glutAddMenuEntry("Load path",'L'); glutAddMenuEntry("Save path",'W'); } else trmenu = 0; /* main scene menu */ menu = glutCreateMenu(menuScene); glutAddSubMenu("File",fmenu); glutAddSubMenu("Render mode",mmenu); glutAddSubMenu("Colors, Materials",cmenu); if ( mesh->nbb ) glutAddSubMenu("Data",smenu); glutAddSubMenu("Items",vmenu); if ( mesh->dim == 3 ) glutAddSubMenu("Clipping",clmenu); glutAddSubMenu("Features",femenu); glutAddSubMenu("View",vwmenu); glutAddSubMenu("Animation",amenu); /*if ( trmenu ) glutAddSubMenu("Trajectory",trmenu); */ glutAddMenuEntry("",'\0'); glutAddMenuEntry("Close window",'X'); glutAddMenuEntry("Quit",'q'); return(1); } freefem++-3.38-1/src/medit/mesh.c000644 000767 000024 00000032146 11406142256 016604 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define FLOAT_MAX 1.e20 ubyte dosurf; double volTet(double *c1,double *c2,double *c3,double *c4) { double ax,ay,az,bx,by,bz,vol; ax = c3[0] - c1[0]; ay = c3[1] - c1[1]; az = c3[2] - c1[2]; bx = c4[0] - c1[0]; by = c4[1] - c1[1]; bz = c4[2] - c1[2]; vol = (c2[0]-c1[0]) * (ay*bz - az*by) \ + (c2[1]-c1[1]) * (az*bx - ax*bz) \ + (c2[2]-c1[2]) * (ax*by - ay*bx); return(vol / 6.0); } /* dump mesh info */ void meshInfo(pMesh mesh) { fprintf(stdout," Vertices %8d",mesh->np); if ( mesh->nc ) fprintf(stdout," Corners %d",mesh->nc); if ( mesh->nr ) fprintf(stdout," Required %d",mesh->nr); fprintf(stdout,"\n"); if ( mesh->nt ) fprintf(stdout," Triangles %8d\n",mesh->nt); if ( mesh->nq ) fprintf(stdout," Quads %8d\n",mesh->nq); if ( mesh->ntet ) fprintf(stdout," Tetrahedra %8d\n",mesh->ntet); if ( mesh->nhex ) fprintf(stdout," Hexahedra %8d\n",mesh->nhex); if ( mesh->na ) { fprintf(stdout," Edges %8d",mesh->na); if ( mesh->nri ) fprintf(stdout," Ridges %d",mesh->nri); if ( mesh->nre ) fprintf(stdout," Required %d",mesh->nre); fprintf(stdout,"\n"); } if ( mesh->nvn || mesh->ntg) { fprintf(stdout," Normals %8d",mesh->nvn); fprintf(stdout," Tangents %d\n",mesh->ntg); } fprintf(stdout," Bounding box: x:[%g %g] y:[%g %g] z:[%g %g]\n", mesh->xmin,mesh->xmax,mesh->ymin,mesh->ymax,mesh->zmin,mesh->zmax); } void meshCoord(pMesh mesh,int displ) { pTetra pt1; pPoint ppt; pSolution ps; double *c1,*c2,*c3,*c4,mul,vold,volf; int k; /* default */ if ( ddebug ) printf("change mesh coord\n"); mul = 2.0*displ - 1.; if ( mesh->dim == 2 ) { for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ps = &mesh->sol[k]; ppt->c[0] = ppt->c[0] + mul*ps->m[0]; ppt->c[1] = ppt->c[1] + mul*ps->m[1]; } } else { vold = 0.0; for (k=1; k<=mesh->ntet; k++) { pt1 = &mesh->tetra[k]; if ( !pt1->v[0] ) continue; c1 = &mesh->point[pt1->v[0]].c[0]; c2 = &mesh->point[pt1->v[1]].c[0]; c3 = &mesh->point[pt1->v[2]].c[0]; c4 = &mesh->point[pt1->v[3]].c[0]; vold += volTet(c1,c2,c3,c4); } for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ps = &mesh->sol[k]; ppt->c[0] = mesh->xtra + ppt->c[0] + mul*ps->m[0]; ppt->c[1] = mesh->ytra + ppt->c[1] + mul*ps->m[1]; ppt->c[2] = mesh->ztra + ppt->c[2] + mul*ps->m[2]; } volf = 0.0; for (k=1; k<=mesh->ntet; k++) { pt1 = &mesh->tetra[k]; if ( !pt1->v[0] ) continue; c1 = &mesh->point[pt1->v[0]].c[0]; c2 = &mesh->point[pt1->v[1]].c[0]; c3 = &mesh->point[pt1->v[2]].c[0]; c4 = &mesh->point[pt1->v[3]].c[0]; volf += volTet(c1,c2,c3,c4); } fprintf(stdout," Volume: initial %E final %E\n",vold,volf); } } void meshBox(pMesh mesh,int bb) { pPoint ppt; int k; /* default */ if ( ddebug ) printf("compute mesh box\n"); if ( bb ) { mesh->xmin = mesh->ymin = mesh->zmin = FLOAT_MAX; mesh->xmax = mesh->ymax = mesh->zmax = -FLOAT_MAX; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag == M_UNUSED && mesh->ne ) continue; if ( ppt->c[0] < mesh->xmin ) mesh->xmin = ppt->c[0]; if ( ppt->c[0] > mesh->xmax ) mesh->xmax = ppt->c[0]; if ( ppt->c[1] < mesh->ymin ) mesh->ymin = ppt->c[1]; if ( ppt->c[1] > mesh->ymax ) mesh->ymax = ppt->c[1]; if ( ppt->c[2] < mesh->zmin ) mesh->zmin = ppt->c[2]; if ( ppt->c[2] > mesh->zmax ) mesh->zmax = ppt->c[2]; } } /* translate mesh at center */ mesh->xtra = 0.5 * (mesh->xmin+mesh->xmax); mesh->ytra = 0.5 * (mesh->ymin+mesh->ymax); mesh->ztra = 0.5 * (mesh->zmin+mesh->zmax); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; /*if ( ppt->tag == M_UNUSED && mesh->ne ) continue;*/ ppt->c[0] -= mesh->xtra; ppt->c[1] -= mesh->ytra; ppt->c[2] -= mesh->ztra; } } int meshSurf(pMesh mesh) { pTetra ptt,pt2; pHexa ph; pTriangle pt; pQuad pq; int *adj,i,k,iadr; ubyte i1,i2,i3; static int idirt[7] = {0,1,2,3,0,1,2}; static int ch[6][4] = { {0,1,2,3}, {4,5,6,7}, {0,1,5,4}, {1,2,6,5}, {2,3,7,6}, {0,3,7,4} }; if ( !dosurf ) return(1); /* extract surface */ if ( mesh->ntet > 0 && !mesh->nt ) { if ( !hashTetra(mesh) ) return(0); for (k=1; k<=mesh->ntet; k++) { ptt = &mesh->tetra[k]; if ( !ptt->v[0] ) continue; iadr = 4*(k-1)+1; adj = &mesh->adja[iadr]; for (i=0; i<4; i++) if ( !adj[i] ) ++mesh->nt; else { pt2 = &mesh->tetra[adj[i]]; if ( ptt->ref != pt2->ref && k < adj[i] ) ++mesh->nt; } } /* memory alloc */ if ( ddebug ) printf("allocate %d tria\n",mesh->nt); mesh->tria = (pTriangle)calloc(mesh->nt+1,sizeof(struct striangle)); if ( !mesh->tria ) { fprintf(stdout," ## No triangle\n"); return(0); } /* find triangles */ mesh->nt = 0; for (k=1; k<=mesh->ntet; k++) { ptt = &mesh->tetra[k]; if ( !ptt->v[0] ) continue; iadr = 4*(k-1)+1; adj = &mesh->adja[iadr]; for (i=0; i<4; i++) { if ( !adj[i] ) { pt = &mesh->tria[++mesh->nt]; i1 = idirt[i+1]; i2 = idirt[i+2]; i3 = idirt[i+3]; pt->v[0] = ptt->v[i1]; pt->v[1] = ptt->v[i2]; pt->v[2] = ptt->v[i3]; pt->ref = 0; } else { pt2 = &mesh->tetra[adj[i]]; if ( (ptt->ref != pt2->ref) && (k < adj[i]) ) { pt = &mesh->tria[++mesh->nt]; i1 = idirt[i+1]; i2 = idirt[i+2]; i3 = idirt[i+3]; pt->v[0] = ptt->v[i1]; pt->v[1] = ptt->v[i2]; pt->v[2] = ptt->v[i3]; pt->ref = max(ptt->ref,pt2->ref); } } } } } if ( mesh->nhex > 0 && !mesh->nq ) { if ( mesh->adja ) { free(mesh->adja); free(mesh->voy); mesh->adja = 0; mesh->voy = 0; } if ( !hashHexa(mesh) ) return(0); for (k=1; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; if ( !ph->v[0] ) continue; iadr = 6*(k-1)+1; adj = &mesh->adja[iadr]; for (i=0; i<6; i++) if ( !adj[i] ) ++mesh->nq; } /* memory alloc */ if ( ddebug ) printf("allocate %d quads\n",mesh->nq); mesh->quad = (pQuad)calloc(mesh->nq+1,sizeof(struct squad)); if ( !mesh->quad ) { fprintf(stdout," ## No quad\n"); return(0); } /* find quadrilaterals */ mesh->nq = 0; for (k=1; k<=mesh->nhex; k++) { ph = &mesh->hexa[k]; if ( !ph->v[0] ) continue; iadr = 6*(k-1)+1; adj = &mesh->adja[iadr]; for (i=0; i<6; i++) if ( !adj[i] ) { pq = &mesh->quad[++mesh->nq]; pq->v[0] = ph->v[ch[i][0]]; pq->v[1] = ph->v[ch[i][1]]; pq->v[2] = ph->v[ch[i][2]]; pq->v[3] = ph->v[ch[i][3]]; } } } return(1); } void meshRef(pScene sc,pMesh mesh) { pMaterial pm; pTriangle pt; pQuad pq; pTetra pte; pHexa ph; pPoint ppt; int *old,i,k,m,nmat; /* default */ if ( ddebug ) printf(" assign %d references\n",sc->par.nbmat-1); /* sort elements by references */ if ( !quiet ) fprintf(stdout," Identifying sub-domains\n"); old = (int*)calloc(sc->par.nbmat+1,sizeof(int)); if ( !old ) exit(2); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; pm->ext[0] = mesh->xmax-mesh->xtra; pm->ext[1] = mesh->ymax-mesh->ytra; pm->ext[2] = mesh->zmax-mesh->ztra; pm->ext[3] = mesh->xmin-mesh->xtra; pm->ext[4] = mesh->ymin-mesh->ytra; pm->ext[5] = mesh->zmin-mesh->ztra; } for (k=mesh->nt; k>0; k--) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; nmat = matRef(sc,pt->ref); /*nmat = !pt->ref ? DEFAULT_MAT : 1+(pt->ref-1)%(sc->par.nbmat-1);*/ pt->nxt = old[nmat]; old[nmat] = k; pm = &sc->material[nmat]; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; pm->ext[0] = min(pm->ext[0],ppt->c[0]); pm->ext[1] = min(pm->ext[1],ppt->c[1]); pm->ext[2] = min(pm->ext[2],ppt->c[2]); pm->ext[3] = max(pm->ext[3],ppt->c[0]); pm->ext[4] = max(pm->ext[4],ppt->c[1]); pm->ext[5] = max(pm->ext[5],ppt->c[2]); } } for (m=0;mpar.nbmat; m++) { pm = &sc->material[m]; pm->depmat[LTria] = old[m]; old[m] = 0; } for (k=mesh->nq; k>0; k--) { pq = &mesh->quad[k]; if ( !pq->v[0] ) continue; nmat = matRef(sc,pq->ref); /*nmat = !pq->ref ? DEFAULT_MAT : 1+(pq->ref-1)%(sc->par.nbmat-1);*/ pq->nxt = old[nmat]; old[nmat] = k; pm = &sc->material[nmat]; for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; pm->ext[0] = min(pm->ext[0],ppt->c[0]); pm->ext[1] = min(pm->ext[1],ppt->c[1]); pm->ext[2] = min(pm->ext[2],ppt->c[2]); pm->ext[3] = max(pm->ext[3],ppt->c[0]); pm->ext[4] = max(pm->ext[4],ppt->c[1]); pm->ext[5] = max(pm->ext[5],ppt->c[2]); } } for (m=0;mpar.nbmat; m++) { pm = &sc->material[m]; pm->depmat[LQuad] = old[m]; old[m] = 0; } for (k=mesh->ntet; k>0; k--) { pte = &mesh->tetra[k]; if ( !pte->v[0] ) continue; nmat = matRef(sc,pte->ref); /*nmat = !pte->ref ? DEFAULT_MAT : 1+(pte->ref-1)%(sc->par.nbmat-1);*/ pte->nxt = old[nmat]; old[nmat] = k; pm = &sc->material[nmat]; for (i=0; i<4; i++) { ppt = &mesh->point[pte->v[i]]; pm->ext[0] = min(pm->ext[0],ppt->c[0]); pm->ext[1] = min(pm->ext[1],ppt->c[1]); pm->ext[2] = min(pm->ext[2],ppt->c[2]); pm->ext[3] = max(pm->ext[3],ppt->c[0]); pm->ext[4] = max(pm->ext[4],ppt->c[1]); pm->ext[5] = max(pm->ext[5],ppt->c[2]); } } for (m=0;mpar.nbmat; m++) { pm = &sc->material[m]; pm->depmat[LTets] = old[m]; old[m] = 0; } for (k=mesh->nhex; k>0; k--) { ph = &mesh->hexa[k]; nmat = matRef(sc,ph->ref); /*nmat = !ph->ref ? DEFAULT_MAT : 1+(ph->ref-1)%(sc->par.nbmat-1);*/ ph->nxt = old[nmat]; old[nmat] = k; pm = &sc->material[nmat]; for (i=0; i<8; i++) { ppt = &mesh->point[ph->v[i]]; pm->ext[0] = min(pm->ext[0],ppt->c[0]); pm->ext[1] = min(pm->ext[1],ppt->c[1]); pm->ext[2] = min(pm->ext[2],ppt->c[2]); pm->ext[3] = max(pm->ext[3],ppt->c[0]); pm->ext[4] = max(pm->ext[4],ppt->c[1]); pm->ext[5] = max(pm->ext[5],ppt->c[2]); } } for (m=0;mpar.nbmat; m++) { pm = &sc->material[m]; pm->depmat[LHexa] = old[m]; old[m] = 0; } free(old); /* remove unused materials */ /* for (m=1; mpar.nbmat; m++) { pm = &sc->material[m]; if ( !pm->depmat[LTria] && !pm->depmat[LQuad] && !pm->depmat[LTets] && !pm->depmat[LHexa] ) { pm1 = &sc->material[sc->par.nbmat-1]; memcpy(pm,pm1,sizeof(struct material)); sc->par.nbmat--; m--; } } */ if ( ddebug ) for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; if ( pm->depmat[LTria] || pm->depmat[LQuad] || pm->depmat[LTets] || pm->depmat[LHexa] ) fprintf(stdout," depart[%d], ref %d = %d %d %d %d\n", m,pm->ref,pm->depmat[LTria],pm->depmat[LQuad], pm->depmat[LTets],pm->depmat[LHexa]); } } int meshUpdate(pScene sc,pMesh mesh) { int k,ret; clock_t ct; /* release mesh structure */ if ( ddebug ) fprintf(stdout,"loadMesh: update mesh\n"); if ( mesh->tria ) { M_free(mesh->tria); mesh->tria = 0; } if ( mesh->quad ) { M_free(mesh->quad); mesh->quad = 0; } if ( mesh->edge ) { M_free(mesh->edge); mesh->edge = 0; } if ( mesh->tetra ) { M_free(mesh->tetra); mesh->tetra = 0; } if ( mesh->hexa ) { M_free(mesh->hexa); mesh->hexa = 0; } if ( mesh->adja ) { M_free(mesh->adja); mesh->adja = 0; } if ( mesh->voy ) { M_free(mesh->voy); mesh->voy = 0; } if ( mesh->point ) { M_free(mesh->point); mesh->point = 0; } if ( mesh->extra ) { if ( mesh->extra->iv ) M_free(mesh->extra->nv); if ( mesh->extra->it ) M_free(mesh->extra->nt); if ( mesh->extra->iq ) M_free(mesh->extra->nq); if ( mesh->extra->n ) M_free(mesh->extra->n); M_free(mesh->extra); mesh->extra = 0; } if ( mesh->nbb && mesh->sol ) { if ( (mesh->dim==2 && mesh->nfield==3) || (mesh->dim==3 && mesh->nfield==6) ) for (k=1; k<=mesh->nbb; k++) free(mesh->sol[k].m); M_free(mesh->sol); mesh->sol = 0; } /* read mesh */ fprintf(stdout," Loading data file(s)\n"); ct = clock(); ret = 0; switch ( mesh->typ ) { case 0: ret = loadMesh(mesh); break; case 1: ret = inmsh2(mesh); break; case 2: ret = loadGIS(mesh); break; } if ( !ret ) return(0); /* compute mesh box */ if ( (mesh->ntet && !mesh->nt) || (mesh->nhex && !mesh->nq) ) meshSurf(mesh); meshBox(mesh,1); /*parsop(sc,mesh);*/ if ( !quiet ) meshInfo(mesh); /* read metric */ if ( !loadSol(mesh,mesh->name,1) ) bbfile(mesh); if ( !quiet && mesh->nbb ) fprintf(stdout," Solutions %8d\n",mesh->nbb); ct = difftime(clock(),ct); fprintf(stdout," Input seconds: %.2f\n", (double)ct/(double)CLOCKS_PER_SEC); return(1); } freefem++-3.38-1/src/medit/mesh.h000644 000767 000024 00000003621 11406142256 016605 0ustar00hechtstaff000000 000000 #ifndef _MESH_H #define _MESH_H #define M_NOTAG 0 #define M_CORNER (1 << 0) #define M_RIDGE (1 << 1) #define M_REQUIRED (1 << 2) #define M_TAG (1 << 3) #define M_UNUSED (1 << 5) #ifndef ubyte typedef unsigned char ubyte; #endif #ifndef ushort typedef unsigned short uShort; #endif typedef struct spoint { double c[3]; int tmp; short ref; uShort mark; char tag,clip,flag; } Point; typedef Point * pPoint; typedef struct striangle { int v[3],nxt; short ref; /* reference */ uShort mark,cpt; char clip; } Triangle; typedef Triangle * pTriangle; typedef struct squad { int v[4],nxt; short ref; char clip; } Quad; typedef Quad * pQuad; typedef struct edge { int v[2]; short ref; char tag; } Edge; typedef Edge * pEdge; typedef struct stetra { int v[4],nxt,mark; short ref; uShort cpt; char clip; } Tetra; typedef Tetra * pTetra; typedef struct shexa { int v[8],nxt,mark; short ref; uShort cpt; char clip; } Hexa; typedef Hexa * pHexa; typedef struct extra { float *n,*t; int *nv,*nt,*nq,*tv,*te; int iv,it,iq,jv,je; } Extra; typedef Extra * pExtra; typedef struct solu { float bb; float *m; int ver,dim; } Solution; typedef Solution * pSolution; /* Mesh: mesh data structure */ typedef struct mesh { double xmin,ymin,zmin,xmax,ymax,zmax; double xtra,ytra,ztra; float bbmin,bbmax; int ne,nt,nq,ntet,nhex; int np,nc,nr,na,nre,nri; int nvn,ntg,dim,ver,nbb,typage,nfield; uShort mark; char name[256],typ; pPoint point; pTriangle tria; pQuad quad; pEdge edge; pTetra tetra; pHexa hexa; int *adja; int *grid; ubyte *voy; pExtra extra; pSolution sol; } Mesh; typedef Mesh * pMesh; #endif freefem++-3.38-1/src/medit/mlists.c000644 000767 000024 00000112065 11406142256 017162 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" static int ct[4][3] = { {0,1,2}, {0,3,1}, {1,3,2}, {0,2,3} }; static int ch[6][4] = { {0,1,2,3}, {4,5,6,7}, {0,1,5,4}, {1,2,6,5}, {2,3,7,6}, {0,3,7,4} }; /* recursively subdivide a triangle */ void cutTriangle(pScene sc,triangle t) { triangle t1,t2; double kc,x,dd,rgb[4],maxe; int i,ia,ib,ic,iedge; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* analyze triangle edges */ if ( t.va < sc->iso.val[0] ) t.va = sc->iso.val[0]; else if ( t.va > sc->iso.val[MAXISO-1] ) t.va = sc->iso.val[MAXISO-1]; if ( t.vb < sc->iso.val[0] ) t.vb = sc->iso.val[0]; else if ( t.vb > sc->iso.val[MAXISO-1] ) t.vb = sc->iso.val[MAXISO-1]; if ( t.vc < sc->iso.val[0] ) t.vc = sc->iso.val[0]; else if ( t.vc > sc->iso.val[MAXISO-1] ) t.vc = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; for (ib=0; ibiso.val[ib] ) break; for (ic=0; iciso.val[ic] ) break; /* search longest edge */ maxe = fabs(t.va-t.vb); iedge = 1; if ( maxe < fabs(t.vb-t.vc) ) { maxe = fabs(t.vb-t.vc); iedge = 2; } if ( maxe < fabs(t.va-t.vc) ) { maxe = fabs(t.va-t.vc); iedge = 3; } /* split longest edge */ if ( maxe > 0.0 ) { switch( iedge ) { case 1: /* edge a-b */ x = ia < ib ? sc->iso.val[ia] : sc->iso.val[ib]; dd = (x-t.va) / (t.vb-t.va); if ( dd > 0.001 && dd < 0.999 ) { memcpy(&t1,&t,sizeof(struct triangle)); memcpy(&t2,&t,sizeof(struct triangle)); for (i=0; i<3; i++) { t1.b[i] = t2.a[i] = t.a[i] + dd*(t.b[i] -t.a[i]); t1.nb[i] = t2.na[i] = t.na[i] + dd*(t.nb[i]-t.na[i]); } t1.vb = t2.va = x; cutTriangle(sc,t1); cutTriangle(sc,t2); return; } break; case 2: /* edge b-c */ x = ib < ic ? sc->iso.val[ib] : sc->iso.val[ic]; dd = (x-t.vb) / (t.vc-t.vb); if ( dd > 0.001f && dd < 0.999f ) { memcpy(&t1,&t,sizeof(struct triangle)); memcpy(&t2,&t,sizeof(struct triangle)); for (i=0; i<3; i++) { t1.c[i] = t2.b[i] = t.b[i] + dd*(t.c[i] -t.b[i]); t1.nc[i] = t2.nb[i] = t.nb[i] + dd*(t.nc[i]-t.nb[i]); } t1.vc = t2.vb = x; cutTriangle(sc,t1); cutTriangle(sc,t2); return; } break; case 3: /* edge c-a */ x = ia < ic ? sc->iso.val[ia] : sc->iso.val[ic]; dd = (x-t.va) / (t.vc-t.va); if ( dd > 0.001f && dd < 0.999f ) { memcpy(&t1,&t,sizeof(struct triangle)); memcpy(&t2,&t,sizeof(struct triangle)); for (i=0; i<3; i++) { t1.c[i] = t2.a[i] = t.a[i] + dd*(t.c[i] -t.a[i]); t1.nc[i] = t2.na[i] = t.na[i] + dd*(t.nc[i]-t.na[i]); } t1.vc = t2.va = x; cutTriangle(sc,t1); cutTriangle(sc,t2); return; } break; } } /* draw triangle */ if ( t.va < sc->iso.val[0] ) t.va = sc->iso.val[0]; else if ( t.va > sc->iso.val[MAXISO-1] ) t.va = sc->iso.val[MAXISO-1]; kc = (t.va-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor4dv(rgb); glNormal3fv(t.na); glVertex3fv(t.a); if ( t.vb < sc->iso.val[0] ) t.vb = sc->iso.val[0]; else if ( t.vb > sc->iso.val[MAXISO-1] ) t.vb = sc->iso.val[MAXISO-1]; kc = (t.vb-sc->iso.val[ib-1]) / (sc->iso.val[ib] - sc->iso.val[ib-1]); hsv[0] = sc->iso.col[ib-1]*(1.0-kc)+sc->iso.col[ib]*kc; hsvrgb(hsv,rgb); glColor4dv(rgb); glNormal3fv(t.nb); glVertex3fv(t.b); if ( t.vc < sc->iso.val[0] ) t.vc = sc->iso.val[0]; else if ( t.vc > sc->iso.val[MAXISO-1] ) t.vc = sc->iso.val[MAXISO-1]; kc = (t.vc-sc->iso.val[ic-1]) / (sc->iso.val[ic] - sc->iso.val[ic-1]); hsv[0] = sc->iso.col[ic-1]*(1.0-kc)+sc->iso.col[ic]*kc; hsvrgb(hsv,rgb); glColor4dv(rgb); glNormal3fv(t.nc); glVertex3fv(t.c); } /* metric map: use linear interpolation on values rather than color interpolation ! */ GLuint listTriaMap(pScene sc,pMesh mesh) { pMaterial pm; pTriangle pt; pPoint p0,p1,p2; pSolution ps0,ps1,ps2; GLint dlist; double ax,ay,az,bx,by,bz,dd; float cx,cy,cz,n[3]; int k,m,is0,is1,is2; triangle t; /* default */ if ( !mesh->nt ) return(0); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("create display list map / TRIA\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; if ( sc->type & S_FLAT ) { glBegin(GL_TRIANGLES); while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0f / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } memcpy(t.na,n,3*sizeof(float)); memcpy(t.nb,n,3*sizeof(float)); memcpy(t.nc,n,3*sizeof(float)); if ( sc->shrink < 1.0 ) { cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.0; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.0; cz = (p0->c[2] + p1->c[2] + p2->c[2]) / 3.0; t.a[0] = sc->shrink*(p0->c[0]-cx)+cx; t.a[1] = sc->shrink*(p0->c[1]-cy)+cy; t.a[2] = sc->shrink*(p0->c[2]-cz)+cz; t.b[0] = sc->shrink*(p1->c[0]-cx)+cx; t.b[1] = sc->shrink*(p1->c[1]-cy)+cy; t.b[2] = sc->shrink*(p1->c[2]-cz)+cz; t.c[0] = sc->shrink*(p2->c[0]-cx)+cx; t.c[1] = sc->shrink*(p2->c[1]-cy)+cy; t.c[2] = sc->shrink*(p2->c[2]-cz)+cz; } else { t.a[0] = p0->c[0]; t.a[1] = p0->c[1]; t.a[2] = p0->c[2]; t.b[0] = p1->c[0]; t.b[1] = p1->c[1]; t.b[2] = p1->c[2]; t.c[0] = p2->c[0]; t.c[1] = p2->c[1]; t.c[2] = p2->c[2]; } if ( mesh->typage == 2 ) { ps0 = &mesh->sol[pt->v[0]]; ps1 = &mesh->sol[pt->v[1]]; ps2 = &mesh->sol[pt->v[2]]; t.va = ps0->bb; t.vb = ps1->bb; t.vc = ps2->bb; } else { ps0 = &mesh->sol[k]; t.va = t.vb = t.vc = ps0->bb; } cutTriangle(sc,t); k = pt->nxt; } glEnd(); } else { glBegin(GL_TRIANGLES); while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0f / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } is0 = is1 = is2 = 0; if ( mesh->extra->iv ) { if ( pt->v[0] <= mesh->nvn ) is0 = mesh->extra->nv[pt->v[0]]; if ( pt->v[1] <= mesh->nvn ) is1 = mesh->extra->nv[pt->v[1]]; if ( pt->v[2] <= mesh->nvn ) is2 = mesh->extra->nv[pt->v[2]]; } if ( !is0 && pt->v[0] <= mesh->extra->it ) is0 = mesh->extra->nt[3*(k-1)+1]; if ( !is1 && pt->v[1] <= mesh->extra->it ) is1 = mesh->extra->nt[3*(k-1)+2]; if ( !is2 && pt->v[2] <= mesh->extra->it ) is2 = mesh->extra->nt[3*(k-1)+3]; if ( sc->shrink < 1.0 ) { cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.; cz = (p0->c[2] + p1->c[2] + p2->c[2]) / 3.; t.a[0] = sc->shrink*(p0->c[0]-cx)+cx; t.a[1] = sc->shrink*(p0->c[1]-cy)+cy; t.a[2] = sc->shrink*(p0->c[2]-cz)+cz; t.b[0] = sc->shrink*(p1->c[0]-cx)+cx; t.b[1] = sc->shrink*(p1->c[1]-cy)+cy; t.b[2] = sc->shrink*(p1->c[2]-cz)+cz; t.c[0] = sc->shrink*(p2->c[0]-cx)+cx; t.c[1] = sc->shrink*(p2->c[1]-cy)+cy; t.c[2] = sc->shrink*(p2->c[2]-cz)+cz; } else { t.a[0] = p0->c[0]; t.a[1] = p0->c[1]; t.a[2] = p0->c[2]; t.b[0] = p1->c[0]; t.b[1] = p1->c[1]; t.b[2] = p1->c[2]; t.c[0] = p2->c[0]; t.c[1] = p2->c[1]; t.c[2] = p2->c[2]; } if ( !is0 ) memcpy(t.na,n,3*sizeof(float)); else { t.na[0] = mesh->extra->n[3*(is0-1)+1]; t.na[1] = mesh->extra->n[3*(is0-1)+2]; t.na[2] = mesh->extra->n[3*(is0-1)+3]; } if ( !is1 ) memcpy(t.nb,n,3*sizeof(float)); else { t.nb[0] = mesh->extra->n[3*(is1-1)+1]; t.nb[1] = mesh->extra->n[3*(is1-1)+2]; t.nb[2] = mesh->extra->n[3*(is1-1)+3]; } if ( !is2 ) memcpy(t.nc,n,3*sizeof(float)); else { t.nc[0] = mesh->extra->n[3*(is2-1)+1]; t.nc[1] = mesh->extra->n[3*(is2-1)+2]; t.nc[2] = mesh->extra->n[3*(is2-1)+3]; } if ( mesh->typage == 2 ) { ps0 = &mesh->sol[pt->v[0]]; ps1 = &mesh->sol[pt->v[1]]; ps2 = &mesh->sol[pt->v[2]]; t.va = ps0->bb; t.vb = ps1->bb; t.vc = ps2->bb; } else { ps0 = &mesh->sol[k]; t.va = t.vb = t.vc = ps0->bb; } cutTriangle(sc,t); k = pt->nxt; } glEnd(); } } glEndList(); return(dlist); } /* build list of quadrilaterals */ GLuint listQuadMap(pScene sc,pMesh mesh) { pMaterial pm; pQuad pq; pPoint p0,p1,p2,p3; pSolution ps0,ps1,ps2,ps3; GLint dlist = 0; double ax,ay,az,bx,by,bz,dd; float cx,cy,cz,n[3]; int k,m,is0,is1,is2,is3; triangle t1,t2; /* default */ if ( !mesh->nq ) return(0); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("create display list map / QUADS\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; glBegin(GL_TRIANGLES); while ( k != 0 ) { pq = &mesh->quad[k]; if ( pq->v[0] == 0 ) { k = pq->nxt; continue; } p0 = &mesh->point[pq->v[0]]; p1 = &mesh->point[pq->v[1]]; p2 = &mesh->point[pq->v[2]]; p3 = &mesh->point[pq->v[3]]; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0f / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } if ( sc->shrink < 1.0 ) { cx = 0.25 * (p0->c[0] + p1->c[0] + p2->c[0] + p3->c[0]); cy = 0.25 * (p0->c[1] + p1->c[1] + p2->c[1] + p3->c[1]); cz = 0.25 * (p0->c[2] + p1->c[2] + p2->c[2] + p3->c[2]); t1.a[0] = t2.a[0] = sc->shrink*(p0->c[0]-cx)+cx; t1.a[1] = t2.a[1] = sc->shrink*(p0->c[1]-cy)+cy; t1.a[2] = t2.a[2] = sc->shrink*(p0->c[2]-cz)+cz; t1.b[0] = sc->shrink*(p1->c[0]-cx)+cx; t1.b[1] = sc->shrink*(p1->c[1]-cy)+cy; t1.b[2] = sc->shrink*(p1->c[2]-cz)+cz; t1.c[0] = t2.b[0] = sc->shrink*(p2->c[0]-cx)+cx; t1.c[1] = t2.b[1] = sc->shrink*(p2->c[1]-cy)+cy; t1.c[2] = t2.b[2] = sc->shrink*(p2->c[2]-cz)+cz; t2.c[0] = sc->shrink*(p3->c[0]-cx)+cx; t2.c[1] = sc->shrink*(p3->c[1]-cy)+cy; t2.c[2] = sc->shrink*(p3->c[2]-cz)+cz; } else { t1.a[0] = t2.a[0] = p0->c[0]; t1.a[1] = t2.a[1] = p0->c[1]; t1.a[2] = t2.a[2] = p0->c[2]; t1.b[0] = p1->c[0]; t1.b[1] = p1->c[1]; t1.b[2] = p1->c[2]; t1.c[0] = t2.b[0] = p2->c[0]; t1.c[1] = t2.b[1] = p2->c[1]; t1.c[2] = t2.b[2] = p2->c[2]; t2.c[0] = p3->c[0]; t2.c[1] = p3->c[1]; t2.c[2] = p3->c[2]; } if ( sc->type & S_FLAT ) { memcpy(t1.na,n,3*sizeof(float)); memcpy(t1.nb,n,3*sizeof(float)); memcpy(t1.nc,n,3*sizeof(float)); memcpy(t2.na,n,3*sizeof(float)); memcpy(t2.nb,n,3*sizeof(float)); memcpy(t2.nc,n,3*sizeof(float)); } else { is0 = is1 = is2 = is3 = 0; if ( mesh->extra->iv ) { if ( pq->v[0] <= mesh->nvn ) is0 = mesh->extra->nv[pq->v[0]]; if ( pq->v[1] <= mesh->nvn ) is1 = mesh->extra->nv[pq->v[1]]; if ( pq->v[2] <= mesh->nvn ) is2 = mesh->extra->nv[pq->v[2]]; if ( pq->v[3] <= mesh->nvn ) is3 = mesh->extra->nv[pq->v[3]]; } if ( !is0 && pq->v[0] <= mesh->extra->iq ) is0 = mesh->extra->nq[4*(k-1)+1]; if ( !is1 && pq->v[1] <= mesh->extra->iq ) is1 = mesh->extra->nq[4*(k-1)+2]; if ( !is2 && pq->v[2] <= mesh->extra->iq ) is2 = mesh->extra->nq[4*(k-1)+3]; if ( !is3 && pq->v[3] <= mesh->extra->iq ) is3 = mesh->extra->nq[4*(k-1)+4]; if ( !is0 ) memcpy(t1.na,n,3*sizeof(float)); else { t1.na[0] = t2.na[0] = mesh->extra->n[3*(is0-1)+1]; t1.na[1] = t2.na[1] = mesh->extra->n[3*(is0-1)+2]; t1.na[2] = t2.na[2] = mesh->extra->n[3*(is0-1)+3]; } if ( !is1 ) memcpy(t1.nb,n,3*sizeof(float)); else { t1.nb[0] = mesh->extra->n[3*(is1-1)+1]; t1.nb[1] = mesh->extra->n[3*(is1-1)+2]; t1.nb[2] = mesh->extra->n[3*(is1-1)+3]; } if ( !is2 ) memcpy(t1.nc,n,3*sizeof(float)); else { t1.nc[0] = t2.nb[0] = mesh->extra->n[3*(is2-1)+1]; t1.nc[1] = t2.nb[1] = mesh->extra->n[3*(is2-1)+2]; t1.nc[2] = t2.nb[2] = mesh->extra->n[3*(is2-1)+3]; } if ( !is3 ) memcpy(t1.nc,n,3*sizeof(float)); else { t2.nc[0] = mesh->extra->n[3*(is3-1)+1]; t2.nc[1] = mesh->extra->n[3*(is3-1)+2]; t2.nc[2] = mesh->extra->n[3*(is3-1)+3]; } } if ( mesh->typage == 2 ) { /* solutions at vertices */ ps0 = &mesh->sol[pq->v[0]]; ps1 = &mesh->sol[pq->v[1]]; ps2 = &mesh->sol[pq->v[2]]; ps3 = &mesh->sol[pq->v[3]]; t1.va = t2.va = ps0->bb; t1.vb = ps1->bb; t1.vc = t2.vb = ps2->bb; t2.vc = ps3->bb; } else { /* solution at element */ ps0 = &mesh->sol[k]; t1.va = t1.vb = t1.vc = ps0->bb; t2.va = t2.vb = t2.vc = ps0->bb; } /* color interpolation */ cutTriangle(sc,t1); cutTriangle(sc,t2); k = pq->nxt; } glEnd(); } glEndList(); return(dlist); } /* build list of tetrahedra */ GLuint listTetraMap(pScene sc,pMesh mesh,ubyte clip) { pMaterial pm; pTetra pt; pPoint p0,p1,p2; pSolution ps0,ps1,ps2; GLint dlist = 0; float cx,cy,cz,ax,ay,az,bx,by,bz,d,n[3]; int k,l,m; triangle t; /* default */ if ( !mesh->ntet ) return(0); if ( ddebug ) printf("create display list map / TETRA\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; glBegin(GL_TRIANGLES); while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] || (clip && !pt->clip) ) { k = pt->nxt; continue; } /* build 4 faces */ cx = cy = cz = 0.0f; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[l]]; cx += p0->c[0]; cy += p0->c[1]; cz += p0->c[2]; } cx /= 4.; cy /= 4.; cz /= 4.; for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[ct[l][0]]]; p1 = &mesh->point[pt->v[ct[l][1]]]; p2 = &mesh->point[pt->v[ct[l][2]]]; /* compute face normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } /* store triangle */ t.a[0] = sc->shrink*(p0->c[0]-cx)+cx; t.a[1] = sc->shrink*(p0->c[1]-cy)+cy; t.a[2] = sc->shrink*(p0->c[2]-cz)+cz; t.b[0] = sc->shrink*(p1->c[0]-cx)+cx; t.b[1] = sc->shrink*(p1->c[1]-cy)+cy; t.b[2] = sc->shrink*(p1->c[2]-cz)+cz; t.c[0] = sc->shrink*(p2->c[0]-cx)+cx; t.c[1] = sc->shrink*(p2->c[1]-cy)+cy; t.c[2] = sc->shrink*(p2->c[2]-cz)+cz; /* store normals */ memcpy(t.na,n,3*sizeof(float)); memcpy(t.nb,n,3*sizeof(float)); memcpy(t.nc,n,3*sizeof(float)); if ( mesh->typage == 2 ) { /* solutions at vertices */ ps0 = &mesh->sol[pt->v[ct[l][0]]]; ps1 = &mesh->sol[pt->v[ct[l][1]]]; ps2 = &mesh->sol[pt->v[ct[l][2]]]; t.va = ps0->bb; t.vb = ps1->bb; t.vc = ps2->bb; } else { /* solution at element */ ps0 = &mesh->sol[k]; t.va = t.vb = t.vc = ps0->bb; } /* color interpolation */ cutTriangle(sc,t); } k = pt->nxt; } glEnd(); } glEndList(); return(dlist); } /* build list of hexahedra */ GLuint listHexaMap(pScene sc,pMesh mesh,ubyte clip) { pMaterial pm; pHexa ph; pPoint p0,p1,p2,p3; pSolution ps0,ps1,ps2,ps3; GLint dlist = 0; double ax,ay,az,bx,by,bz,d; float n[3],cx,cy,cz; int k,l,m; triangle t1,t2; if ( !mesh->nhex ) return(0); if ( ddebug ) printf("create display list map / HEXA\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LHexa]; if ( !k || pm->flag ) continue; glBegin(GL_TRIANGLES); while ( k != 0 ) { ph = &mesh->hexa[k]; if ( !ph->v[0] || (clip && !ph->clip) ) { k = ph->nxt; continue; } cx = cy = cz = 0.0f; for (l=0; l<8; l++) { p0 = &mesh->point[ph->v[l]]; cx += p0->c[0]; cy += p0->c[1]; cz += p0->c[2]; } cx /= 8.; cy /= 8.; cz /= 8.; for (l=0; l<6; l++) { p0 = &mesh->point[ph->v[ch[l][0]]]; p1 = &mesh->point[ph->v[ch[l][1]]]; p2 = &mesh->point[ph->v[ch[l][2]]]; p3 = &mesh->point[ph->v[ch[l][3]]]; /* compute face normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0f / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } /* store triangles */ t1.a[0] = t2.a[0] = sc->shrink*(p0->c[0]-cx)+cx; t1.a[1] = t2.a[1] = sc->shrink*(p0->c[1]-cy)+cy; t1.a[2] = t2.a[2] = sc->shrink*(p0->c[2]-cz)+cz; t1.b[0] = sc->shrink*(p1->c[0]-cx)+cx; t1.b[1] = sc->shrink*(p1->c[1]-cy)+cy; t1.b[2] = sc->shrink*(p1->c[2]-cz)+cz; t1.c[0] = t2.b[0] = sc->shrink*(p2->c[0]-cx)+cx; t1.c[1] = t2.b[1] = sc->shrink*(p2->c[1]-cy)+cy; t1.c[2] = t2.b[2] = sc->shrink*(p2->c[2]-cz)+cz; t2.c[0] = sc->shrink*(p3->c[0]-cx)+cx; t2.c[1] = sc->shrink*(p3->c[1]-cy)+cy; t2.c[2] = sc->shrink*(p3->c[2]-cz)+cz; /* store normals */ memcpy(t1.na,n,3*sizeof(float)); memcpy(t1.nb,n,3*sizeof(float)); memcpy(t1.nc,n,3*sizeof(float)); memcpy(t2.na,n,3*sizeof(float)); memcpy(t2.nb,n,3*sizeof(float)); memcpy(t2.nc,n,3*sizeof(float)); if ( mesh->typage == 2 ) { /* solutions at vertices */ ps0 = &mesh->sol[ph->v[ch[l][0]]]; ps1 = &mesh->sol[ph->v[ch[l][1]]]; ps2 = &mesh->sol[ph->v[ch[l][2]]]; ps3 = &mesh->sol[ph->v[ch[l][3]]]; t1.va = t2.va = ps0->bb; t1.vb = ps1->bb; t1.vc = t2.vb = ps2->bb; t2.vc = ps3->bb; } else { /* solution at element */ ps0 = &mesh->sol[k]; t1.va = t1.vb = t1.vc = ps0->bb; t2.va = t2.vb = t2.vc = ps0->bb; } /* color interpolation */ cutTriangle(sc,t1); cutTriangle(sc,t2); } k = ph->nxt; } glEnd(); } glEndList(); return(dlist); } GLuint alt2dList(pScene sc,pMesh mesh,int geomtype,float shrink,float altcoef) { pTriangle pt,pt1; pMaterial pm; pQuad pq; pPoint p0,p1,p2,p3; pSolution ps0,ps1,ps2,ps3; GLuint dlist; double ax,ay,az,bx,by,bz,dd,kc,rgb[4]; float cx,cy,cz,n[3]; int *adj,k,m,ia,iadr; ubyte *voy; triangle t,t1,t2; static double hsv[3] = { 0.0, 1.0, 0.80 }; static float nn[3] = {1.0, 0.0, 0.0 }; /* default */ if ( ddebug ) printf("create 2d elevation map list\n"); if ( geomtype == LTria && !mesh->nt ) return(0); if ( geomtype == LQuad && !mesh->nq ) return(0); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); mesh->zmin = altcoef*mesh->bbmin; mesh->zmax = altcoef*mesh->bbmax; if ( mesh->bbmin*mesh->bbmax < 0.0 ) { mesh->ztra = mesh->zmin; } else { mesh->ztra = 0.95 * mesh->zmin; } switch (geomtype) { case LTria: if ( ddebug ) printf("create triangle list %d\n",mesh->nt); if ( mesh->typage == 1 ) { if ( mesh->nt && !hashTria(mesh) ) return(0); } glBegin(GL_TRIANGLES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; if ( mesh->typage == 1 ) ps0 = ps1 = ps2 = &mesh->sol[k]; else { ps0 = &mesh->sol[pt->v[0]]; ps1 = &mesh->sol[pt->v[1]]; ps2 = &mesh->sol[pt->v[2]]; } cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.0; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.0; cz = (ps0->bb + ps1->bb + ps2->bb) / 3.0; t.a[0] = shrink*(p0->c[0]-cx) + cx; t.a[1] = shrink*(p0->c[1]-cy) + cy; t.a[2] = shrink*(altcoef*ps0->bb-cz) + cz - 0.25*mesh->ztra; t.b[0] = shrink*(p1->c[0]-cx) + cx; t.b[1] = shrink*(p1->c[1]-cy) + cy; t.b[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t.c[0] = shrink*(p2->c[0]-cx) + cx; t.c[1] = shrink*(p2->c[1]-cy) + cy; t.c[2] = shrink*(altcoef*ps2->bb-cz) + cz - 0.25*mesh->ztra; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0 ) { dd = 1.0 / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } memcpy(t.na,n,3*sizeof(float)); memcpy(t.nb,n,3*sizeof(float)); memcpy(t.nc,n,3*sizeof(float)); t.va = ps0->bb; t.vb = ps1->bb; t.vc = ps2->bb; if ( mesh->typage == 2 ) cutTriangle(sc,t); else { if ( t.va < sc->iso.val[0] ) t.va = sc->iso.val[0]; else if ( t.va > sc->iso.val[MAXISO-1] ) t.va = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (t.va-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor4dv(rgb); glNormal3fv(t.na); glVertex3fv(t.a); glVertex3fv(t.b); glVertex3fv(t.c); /* add quads to sides (thanks to F. Lagoutiere) */ iadr = 3*(k-1)+1; adj = &mesh->adja[iadr]; voy = &mesh->voy[iadr]; if ( adj[0] && adj[0] < k ) { pt1 = &mesh->tria[ adj[0] ]; p3 = &mesh->point[ pt1->v[voy[0]] ]; ps1 = &mesh->sol[ adj[0] ]; cx = (p1->c[0] + p2->c[0] + p3->c[0]) / 3.0; cy = (p1->c[1] + p2->c[1] + p3->c[1]) / 3.0; cz = ps1->bb; memcpy(t1.a,t.b,3*sizeof(float)); memcpy(t1.b,t.c,3*sizeof(float)); memcpy(t1.c,t.b,3*sizeof(float)); t1.c[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.va = ps0->bb; t1.vb = ps0->bb; t1.vc = ps1->bb; memcpy(t1.na,nn,3*sizeof(float)); memcpy(t1.nb,nn,3*sizeof(float)); memcpy(t1.nc,nn,3*sizeof(float)); cutTriangle(sc,t1); memcpy(t1.a,t.c,3*sizeof(float)); memcpy(t1.b,t.c,3*sizeof(float)); memcpy(t1.c,t.b,3*sizeof(float)); t1.b[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.c[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.va = ps0->bb; t1.vb = ps1->bb; t1.vc = ps1->bb; memcpy(t1.na,nn,3*sizeof(float)); memcpy(t1.nb,nn,3*sizeof(float)); memcpy(t1.nc,nn,3*sizeof(float)); cutTriangle(sc,t1); } if ( adj[1] && adj[1] < k ) { pt1 = &mesh->tria[ adj[1] ]; p3 = &mesh->point[ pt1->v[voy[1]] ]; ps1 = &mesh->sol[ adj[1] ]; cx = (p0->c[0] + p2->c[0] + p3->c[0]) / 3.0; cy = (p0->c[1] + p2->c[1] + p3->c[1]) / 3.0; cz = ps1->bb; memcpy(t1.a,t.a,3*sizeof(float)); memcpy(t1.b,t.c,3*sizeof(float)); memcpy(t1.c,t.a,3*sizeof(float)); t1.c[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.va = ps0->bb; t1.vb = ps0->bb; t1.vc = ps1->bb; memcpy(t1.na,nn,3*sizeof(float)); memcpy(t1.nb,nn,3*sizeof(float)); memcpy(t1.nc,nn,3*sizeof(float)); cutTriangle(sc,t1); memcpy(t1.a,t.c,3*sizeof(float)); memcpy(t1.b,t.c,3*sizeof(float)); memcpy(t1.c,t.a,3*sizeof(float)); t1.b[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.c[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.va = ps0->bb; t1.vb = ps1->bb; t1.vc = ps1->bb; memcpy(t1.na,nn,3*sizeof(float)); memcpy(t1.nb,nn,3*sizeof(float)); memcpy(t1.nc,nn,3*sizeof(float)); cutTriangle(sc,t1); } if ( adj[2] && adj[2] < k ) { pt1 = &mesh->tria[ adj[2] ]; p3 = &mesh->point[ pt1->v[voy[2]] ]; ps1 = &mesh->sol[ adj[2] ]; cx = (p0->c[0] + p1->c[0] + p3->c[0]) / 3.0; cy = (p0->c[1] + p1->c[1] + p3->c[1]) / 3.0; cz = ps1->bb; memcpy(t1.a,t.a,3*sizeof(float)); memcpy(t1.b,t.b,3*sizeof(float)); memcpy(t1.c,t.a,3*sizeof(float)); t1.c[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.va = ps0->bb; t1.vb = ps0->bb; t1.vc = ps1->bb; memcpy(t1.na,nn,3*sizeof(float)); memcpy(t1.nb,nn,3*sizeof(float)); memcpy(t1.nc,nn,3*sizeof(float)); cutTriangle(sc,t1); memcpy(t1.a,t.b,3*sizeof(float)); memcpy(t1.b,t.b,3*sizeof(float)); memcpy(t1.c,t.a,3*sizeof(float)); t1.b[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.c[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t1.va = ps0->bb; t1.vb = ps1->bb; t1.vc = ps1->bb; memcpy(t1.na,nn,3*sizeof(float)); memcpy(t1.nb,nn,3*sizeof(float)); memcpy(t1.nc,nn,3*sizeof(float)); cutTriangle(sc,t1); } } k = pt->nxt; } } glEnd(); break; case LQuad: if ( ddebug ) printf("create quadrilateral list %d\n",mesh->nq); glBegin(GL_TRIANGLES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) { k = pq->nxt; continue; } p0 = &mesh->point[pq->v[0]]; p1 = &mesh->point[pq->v[1]]; p2 = &mesh->point[pq->v[2]]; p3 = &mesh->point[pq->v[3]]; if ( mesh->typage == 1 ) ps0 = ps1 = ps2 = ps3 = &mesh->sol[k]; else { ps0 = &mesh->sol[pq->v[0]]; ps1 = &mesh->sol[pq->v[1]]; ps2 = &mesh->sol[pq->v[2]]; ps3 = &mesh->sol[pq->v[3]]; } cx = 0.25 * (p0->c[0] + p1->c[0] + p2->c[0] + p3->c[0]); cy = 0.25 * (p0->c[1] + p1->c[1] + p2->c[1] + p3->c[1]); cz = 0.25 * (ps0->bb + ps1->bb + ps2->bb + ps3->bb); t.a[0] = t2.a[0] = shrink*(p0->c[0]-cx) + cx; t.a[1] = t2.a[1] = shrink*(p0->c[1]-cy) + cy; t.a[2] = t2.a[2] = shrink*(altcoef*ps0->bb-cz) + cz - 0.25*mesh->ztra; t.b[0] = shrink*(p1->c[0]-cx) + cx; t.b[1] = shrink*(p1->c[1]-cy) + cy; t.b[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra; t.c[0] = t2.b[0] = shrink*(p2->c[0]-cx) + cx; t.c[1] = t2.b[1] = shrink*(p2->c[1]-cy) + cy; t.c[2] = t2.b[2] = shrink*(altcoef*ps2->bb-cz) + cz - 0.25*mesh->ztra; t2.c[0] = shrink*(p3->c[0]-cx) + cx; t2.c[1] = shrink*(p3->c[1]-cy) + cy; t2.c[2] = shrink*(altcoef*ps3->bb-cz) + cz - 0.25*mesh->ztra; /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0f / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } memcpy(t.na,n,3*sizeof(float)); memcpy(t.nb,n,3*sizeof(float)); memcpy(t.nc,n,3*sizeof(float)); memcpy(t2.na,n,3*sizeof(float)); memcpy(t2.nb,n,3*sizeof(float)); memcpy(t2.nc,n,3*sizeof(float)); t.va = t2.va = ps0->bb; t.vb = ps1->bb; t.vc = t2.vb = ps2->bb; t2.vc = ps3->bb; cutTriangle(sc,t); cutTriangle(sc,t2); k = pq->nxt; } } glEnd(); break; } glEndList(); return(dlist); } /* setup color table */ void setupPalette(pScene sc,pMesh mesh) { double delta; int i; if ( ddebug ) printf("create palette %f %f\n",mesh->bbmin,mesh->bbmax); if ( !sc->iso.palette ) { delta = mesh->bbmax - mesh->bbmin; for (i=0; iiso.col[i] = 240.0 *(1.0 - (float)i/(MAXISO-1)); sc->iso.val[i] = mesh->bbmin + i * delta/(MAXISO-1); } sc->iso.palette = 1; } else { for (i=0; iiso.col[i] = 240.0 *(1.0 - (float)i/(MAXISO-1)); } } /* build color palette */ GLuint drawPalette(pScene sc) { double rgb[3]; float xpos,ypos,inc,top,bottom,left,right; int i; static double hsv[3] = {1.0, 1.0, 0.80}; if ( sc->iso.palette < 3 ) { if ( sc->iso.palette <= 2 ) { top = sc->par.ys - 20; bottom = top - 10; left = sc->par.xs / 10; right = sc->par.xs - left; } else if ( sc->iso.palette == 2 ) { top = 40; bottom = top - 10; left = sc->par.xs / 10; right = sc->par.xs - left; } inc = (sc->par.xs-2*left) / (MAXISO-1); xpos = left; glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_QUADS); for (i=1; iiso.col[i-1]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex2f(xpos,bottom); glVertex2f(xpos,top); hsv[0] = sc->iso.col[i]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex2f(xpos+inc,top); glVertex2f(xpos+inc,bottom); xpos += inc; } glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(1.0); glColor3fv(sc->par.line); glRectf(left,bottom,xpos,top); /* graduate */ xpos = left / 2; bottom -= 10; top += 5; output2(xpos,bottom,"%.4E",sc->iso.val[0]); xpos = left; for (i=1; iiso.val[i]); glBegin(GL_LINES); glVertex2f(xpos,bottom+15); glVertex2f(xpos,bottom+10); glEnd(); } else { output2(xpos-25.0,top,"%.4E",sc->iso.val[i]); glBegin(GL_LINES); glVertex2f(xpos,top-10); glVertex2f(xpos,top-5); glEnd(); } } output2(right-left/2,bottom,"%.4E",sc->iso.val[MAXISO-1]); } else if ( sc->iso.palette == 3 ) { bottom = sc->par.ys / 10; top = sc->par.ys - bottom; left = 10; right = left + 15; inc = (sc->par.ys-2*bottom) / (MAXISO-1); ypos = bottom; glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_QUADS); for (i=1; iiso.col[i-1]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex2f(left,ypos); glVertex2f(right,ypos); hsv[0] = sc->iso.col[i]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex2f(right,ypos+inc); glVertex2f(left,ypos+inc); ypos += inc; } glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(1.0); glColor3fv(sc->par.line); glRectf(left,bottom,right,top); /* graduate */ ypos = bottom; right += 5; output2(right,bottom,"%.4E",sc->iso.val[0]); for (i=1; iiso.val[i]); glBegin(GL_LINES); glVertex2f(right-5,ypos); glVertex2f(right-13,ypos); glEnd(); } output2(right,top,"%.4E",sc->iso.val[MAXISO-1]); } else { bottom = sc->par.ys / 10; top = sc->par.ys - bottom; right = sc->par.xs - 10; left = right - 15; inc = (sc->par.ys-2*bottom) / (MAXISO-1); ypos = bottom; glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBegin(GL_QUADS); for (i=1; iiso.col[i-1]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex2f(left,ypos); glVertex2f(right,ypos); hsv[0] = sc->iso.col[i]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex2f(right,ypos+inc); glVertex2f(left,ypos+inc); ypos += inc; } glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(1.0); glColor3fv(sc->par.line); glRectf(left,bottom,right,top); /* graduate */ ypos = bottom; left -= 65; output2(left,bottom,"%.4E",sc->iso.val[0]); for (i=1; iiso.val[i]); glBegin(GL_LINES); glVertex2f(left+65,ypos); glVertex2f(left+75,ypos); glEnd(); } output2(left,top,"%.4E",sc->iso.val[MAXISO-1]); } return(1); } freefem++-3.38-1/src/medit/morphing.c000644 000767 000024 00000003412 11406142256 017465 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define MAX_MORPH 100 int imstep,imreverse; int modeMorphing() { pScene scene; pMesh mesh1,mesh2; pPoint ppt1,ppt2; int k; clock_t ct; /* default */ cv.nbs = 1; imstep = 1; imreverse = 1; if ( ddebug ) printf("morphing: create window\n"); fprintf(stdout,"\n Building scene\n"); ct = clock(); /* create grafix */ scene = cv.scene[0]; mesh1 = cv.mesh[0]; iniopt(scene,mesh1); parsop(scene,mesh1); meshRef(scene,mesh1); matSort(scene); mesh2 = cv.mesh[1]; parsop(scene,mesh2); meshRef(scene,mesh2); for (k=1; k<=mesh2->np; k++) { ppt1 = &mesh1->point[k]; ppt2 = &mesh2->point[k]; ppt2->c[0] -= ppt1->c[0]; ppt2->c[1] -= ppt1->c[1]; ppt2->c[2] -= ppt1->c[2]; } if ( !createScene(scene,0) ) { fprintf(stderr," ## Unable to create scene\n"); return(0); } ct = difftime(clock(),ct); fprintf(stdout," Scene seconds: %.2f\n", (double)ct/(double)CLOCKS_PER_SEC); return(1); } int morphMesh(pScene sc,pMesh mesh1) { pMesh mesh2; pPoint ppt1,ppt2; int k; static float dt = 1.0 / MAX_MORPH; imstep++; if ( imstep == 0 ) { imstep = 2; dt = -dt; if ( !imreverse ) { glutIdleFunc(NULL); morphing = 0; return(0); } } else if ( imstep == MAX_MORPH+1 ) { imstep = -MAX_MORPH+1; dt = -dt; if ( !imreverse ) { glutIdleFunc(NULL); morphing = 0; return(0); } } mesh2 = cv.mesh[1]; for (k=1; k<=mesh1->np; k++) { ppt1 = &mesh1->point[k]; ppt2 = &mesh2->point[k]; ppt1->c[0] += dt*ppt2->c[0]; ppt1->c[1] += dt*ppt2->c[1]; ppt1->c[2] += dt*ppt2->c[2]; } doLists(sc,mesh1); return(1); } freefem++-3.38-1/src/medit/mouse.c000644 000767 000024 00000023771 12354566047 017017 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #ifndef ON #define ON 1 #define OFF 0 #endif GLuint lasttime; GLboolean tracking = GL_FALSE,ctracking = GL_FALSE; GLboolean picking = GL_FALSE; int cbutton = 0; int startx,starty,curx,cury; int rxi,ryi,rx1,rx2,ry1,ry2; #define MinWH 0.1 #define MaxWH 0.9 #ifndef GLUT_BUTTON_3 #define GLUT_BUTTON_3 2 #define GLUT_BUTTON_4 3 #endif /* project x,y, onto a hemi-sphere */ static void point2Vect(int x,int y,int w,int h,float *v) { double d,a,areax,areay; areax = (w-startx) / w; areay = (h-starty) / h; if ( areax > MinWH && areax < MaxWH && areay > MinWH && areay < MaxWH ) { v[0] = (2.0 * x - w) / w; v[1] = (h - 2.0 * y) / h; v[2] = 1.0f; } else { v[0] = 2.0f*(x-startx) / w; v[1] = -2.0f*(y-starty) / h; v[2] = 1.0f; } d = v[0]*v[0]+v[1]*v[1]; if ( d == 0.0f ) return; d = sqrt(d); v[2] = cos(M_PI_2 * ((d < 1.0) ? d : 1.0)); d = v[0]*v[0]+v[1]*v[1]+v[2]*v[2]; a = 1.0f / sqrt(d); v[0] *= a; v[1] *= a; v[2] *= a; } void ortho2D(pScene sc,ubyte mode) { if ( mode == ON ) { glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0,sc->par.xs,0.,sc->par.ys); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); } else if ( mode == OFF ) { glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); glLineWidth(1.); } } static void drawRubberBand(int xa,int ya,int xb,int yb) { glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(2.0); glColor3f(0.5,0.5,0.5); glRecti(xa,ya,xb,yb); } static void rubberMotion(int x,int y) { pScene sc; pPersp p; sc = cv.scene[currentScene()]; p = sc->persp; glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_XOR); /* draw frame */ drawRubberBand(rxi,ryi,rx1,ry1); rx2 = x; ry2 = sc->par.ys-y; drawRubberBand(rxi,ryi,rx2,ry2); glFlush(); glLogicOp(GL_COPY); glDisable(GL_COLOR_LOGIC_OP); /* keep old coords */ rx1 = rx2; ry1 = ry2; } void zoomMotion(int x,int y) { pScene sc; pPersp p; int dy; sc = cv.scene[currentScene()]; p = sc->persp; dy = starty - y; if ( dy > 0 ) if ( p->fovy < 1.0e-02 ) return; else p->fovy = max(0.95*p->fovy,1e-05); else if ( p->fovy > 160.0 ) return; else p->fovy = min(1.1*p->fovy,179.0); farclip(1); starty = y; glutPostRedisplay(); } void mouse(int button,int state,int x,int y) { pScene sc; pTransform tr; pPersp p; int keyact,idw = currentScene(); static int olds = -1; picking=GL_FALSE; /* default */ if ( ddebug ) printf("control mouse %d\n",state); sc = cv.scene[idw]; p = sc->persp; if ( sc->cube->active & C_EDIT ) tr = sc->cube->cubetr; else if ( sc->clip->active & C_EDIT ) tr = sc->clip->cliptr; else tr = sc->view; tr->mstate = state; tr->mbutton = button; /* check if ctrl-shift-alt pressed */ keyact = glutGetModifiers(); if ( state == GLUT_DOWN ) { tracking = GL_TRUE; lasttime = glutGet(GLUT_ELAPSED_TIME); if ( button == GLUT_LEFT_BUTTON ) { if ( keyact == GLUT_ACTIVE_SHIFT ) { /* entity designation */ picking = GL_TRUE; if ( sc->picklist ) glDeleteLists(sc->picklist,1); sc->picklist = pickingScene(sc,x,y,0); return; } else if ( keyact == GLUT_ACTIVE_ALT ) { /* zoom */ starty = y; glutMotionFunc(zoomMotion); return; } else if ( keyact == GLUT_ACTIVE_CTRL ) { /* rubberband selection */ glutSetCursor(GLUT_CURSOR_CROSSHAIR); p->rubix = p->rubfx = x; p->rubiy = p->rubfy = sc->par.ys-y; rxi = rx1 = x; ryi = ry1 = sc->par.ys-y; p->rubber = 1; glDrawBuffer(GL_BACK_LEFT); ortho2D(sc,ON); glutMotionFunc(rubberMotion); return; } } else if ( button == GLUT_MIDDLE_BUTTON && keyact & GLUT_ACTIVE_SHIFT ) { picking = GL_TRUE; if ( sc->picklist ) glDeleteLists(sc->picklist,1); sc->picklist = pickingScene(sc,x,y,LPoint); return; } /* transformation */ startx = x; starty = y; point2Vect(x,y,sc->par.xs,sc->par.ys,tr->pos); glutSetCursor(GLUT_CURSOR_INFO); } else if ( state == GLUT_UP ) { if ( button == GLUT_LEFT_BUTTON ) { if ( keyact == GLUT_ACTIVE_CTRL ) { /* rubberband selection */ p->rubfx = x; p->rubfy = sc->par.ys-y; p->rubber = 2; glDrawBuffer(GL_BACK_LEFT); ortho2D(sc,OFF); glutMotionFunc(motion); return; } else if ( keyact == GLUT_ACTIVE_ALT ) { glutMotionFunc(motion); return; } else if ( picking == GL_TRUE ) { picking = GL_FALSE; reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); } } glutMotionFunc(motion); if ( sc->clip->active & C_EDIT ) sc->clip->active |= C_REDO; /* transformation */ glutSetCursor(GLUT_CURSOR_INHERIT); tracking = GL_FALSE; if ( glutGet(GLUT_ELAPSED_TIME) >= lasttime ) { if ( tr->manim == GL_TRUE ) glutIdleFunc(glutIdle); else tr->angle = 0.0; /*if ( abs(startx-x) + abs(starty-y) > 0 )*/ glutPostRedisplay(); } else if ( tr->manim == GL_TRUE && olds == idw ) glutIdleFunc(NULL); } olds = idw; } void motion(int x,int y) { pScene sc; pTransform tr; pPersp p; GLuint gtime; double deltax,deltay; float coeff,pos[3],dx,dy,dz; int idw = currentScene(); /* default */ if ( picking ) return; if ( ddebug ) fprintf(stdout,"motion\n"); if ( tracking == GL_FALSE ) return; sc = cv.scene[idw]; p = sc->persp; if ( p->rubber == 1 ) return; /* what is transformed ? */ if ( sc->cube->active & C_EDIT ) tr = sc->cube->cubetr; else if ( sc->clip->active & C_EDIT ) tr = sc->clip->cliptr; else tr = sc->view; if ( tr->mstate != GLUT_DOWN ) return; if ( picking ) tr->angle = 0.0f; gtime = glutGet(GLUT_ELAPSED_TIME); if ( (animate || sc->type & S_FOLLOW) && gtime < lasttime+40 ) return; if ( tr->mbutton == GLUT_LEFT_BUTTON ) { /* calculate axis of rotation: cross product */ point2Vect(x,y,sc->par.xs,sc->par.ys,pos); tr->axis[0] = tr->pos[1]*pos[2] - tr->pos[2]*pos[1]; tr->axis[1] = tr->pos[2]*pos[0] - tr->pos[0]*pos[2]; tr->axis[2] = tr->pos[0]*pos[1] - tr->pos[1]*pos[0]; /* calculate angle to rotate by */ if ( animate && saveimg ) tr->angle = 2.0f; else { dx = pos[0] - tr->pos[0]; dy = pos[1] - tr->pos[1]; dz = pos[2] - tr->pos[2]; tr->angle = 180.0*sqrt(dx*dx+dy*dy+dz*dz); } /* reset for next time */ tr->pos[0] = pos[0]; tr->pos[1] = pos[1]; tr->pos[2] = pos[2]; lasttime = gtime; if ( sc->cube->active & C_ON && sc->cube->active & C_EDIT ) sc->cube->active |= C_UPDATE; else if ( sc->clip->active & C_ON && (sc->clip->active & C_EDIT || sc->clip->active & C_FREEZE) ) sc->clip->active |= C_UPDATE; glutPostRedisplay(); } else if ( tr->mbutton == GLUT_MIDDLE_BUTTON ) { coeff = tr->manim == GL_TRUE ? 0.2 : 2.0; deltax = coeff * (x-startx) / (float)sc->par.xs; deltay = coeff * (starty-y) / (float)sc->par.ys; if ( deltax != 0.0 ) tr->panx += -deltax * p->depth * tan(p->fovy/360.*M_PI); if ( deltay != 0.0 ) tr->pany += -deltay * p->depth * tan(p->fovy/360.*M_PI); tr->angle = 0.0; startx = x; starty = y; lasttime = gtime; if ( sc->cube->active & C_ON && sc->cube->active & C_EDIT ) sc->cube->active |= C_UPDATE; else if ( sc->clip->active & C_ON && (sc->clip->active & C_EDIT || sc->clip->active & C_FREEZE) ) sc->clip->active |= C_UPDATE; glutPostRedisplay(); } } void mouseCamera(int button,int state,int x,int y) { /* default */ if ( ddebug ) printf("control mouse camera %d button %d\n",state,button); cbutton = button; if ( state == GLUT_DOWN ) { ctracking = GL_TRUE; startx = x; starty = y; curx = x; cury = y; } else { startx = x; starty = y; ctracking = GL_FALSE; } } void motionCamera(int x,int y) { pScene sc; pCamera c; double dazim,delev,azim,elev; float cfelev,cfazim; /* keep current pos */ curx = x; cury = y; if ( animate ) return; sc = cv.scene[currentScene()]; c = sc->camera; azim = Azimuth(c); elev = Elevation(c); switch (cbutton) { case GLUT_LEFT_BUTTON: cfelev = 50.0; cfazim = 50.0; delev = cfelev * (y-starty)/(float)sc->par.ys; dazim = cfazim * (x-startx)/(float)sc->par.xs; startx = x; starty = y; elev += delev; azim -= dazim; break; case GLUT_MIDDLE_BUTTON: break; case GLUT_BUTTON_3: puts("button3"); break; case GLUT_BUTTON_4: puts("button4"); break; } updateCamera(sc,c,azim,elev); reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); } void animateCamera() { pScene sc; pCamera c; double dazim,delev,azim,elev; float cfelev,cfazim; if ( !animate || !ctracking ) return; sc = cv.scene[currentScene()]; c = sc->camera; azim = Azimuth(c); elev = Elevation(c); switch (cbutton) { case GLUT_LEFT_BUTTON: cfelev = 3.0; cfazim = 3.0; delev = 2.0*(cury-starty)/(float)sc->par.ys; dazim = 2.0*(curx-startx)/(float)sc->par.xs; if ( delev >= 0.0 ) delev *= delev; else delev = -delev*delev; if ( dazim >= 0.0 ) dazim *= dazim; else dazim = -dazim*dazim; elev += cfelev * delev; azim -= cfazim * dazim; break; case GLUT_MIDDLE_BUTTON: break; case GLUT_BUTTON_3: puts("button3"); break; case GLUT_BUTTON_4: puts("button4"); break; } updateCamera(sc,c,azim,elev); reshapeScene(sc->par.xs,sc->par.ys); glutPostRedisplay(); } freefem++-3.38-1/src/medit/normal.c000644 000767 000024 00000006617 11406142256 017144 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" GLuint drawNormals(pMesh mesh,pScene sc) { pTriangle pt; pQuad pq; pEdge pr; pPoint ppt; GLuint dlist = 0; double nn[3]; float *n,p[3],scal; int i,k,kk,ki,iadr; /* default */ if ( !mesh->nvn ) return(0); if ( ddebug ) printf("display normals, tangents\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); if ( sc->type & S_OPPOS ) scal = -0.025; else scal = 0.025; scal *= sc->dmax; glColor3f(0.8,0.2,0.6); glLineWidth(2.0); glBegin(GL_LINES); /* normals at vertices */ if ( mesh->extra->iv && mesh->extra->nv ) { for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ki = mesh->extra->nv[k]; if ( ki > 0 ) { iadr = 3*(ki-1)+1; n = &mesh->extra->n[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } /* normal at triangle vertices */ if ( mesh->extra->it && mesh->extra->nt ) { for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; for ( i=0; i<3; i++) { kk = 3*(k-1)+i+1; ki = mesh->extra->nt[kk]; if ( ki > 0 ) { ppt = &mesh->point[pt->v[i]]; iadr = 3*(ki-1)+1; n = &mesh->extra->n[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } } /* normal at quad vertices */ if ( mesh->extra->iq && mesh->extra->nq ) { for (k=1; k<=mesh->nq; k++) { pq = &mesh->quad[k]; if ( !pq->v[0] ) continue; for ( i=0; i<4; i++) { kk = 4*(k-1)+i+1; ki = mesh->extra->nq[kk]; if ( ki > 0 ) { ppt = &mesh->point[pq->v[i]]; iadr = 3*(ki-1)+1; n = &mesh->extra->n[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } } /* tangents at vertices */ if ( mesh->extra->jv && mesh->extra->tv ) { glColor3f(0.2,0.6,0.8); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ki = mesh->extra->tv[k]; if ( ki > 0 ) { iadr = 3*(ki-1)+1; n = &mesh->extra->t[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } /* tangent at edge vertices */ if ( mesh->extra->je && mesh->extra->te ) { for (k=1; k<=mesh->na; k++) { pr = &mesh->edge[k]; if ( !pr->v[0] ) continue; for ( i=0; i<2; i++) { kk = 2*(k-1)+i+1; ki = mesh->extra->te[kk]; if ( ki > 0 ) { ppt = &mesh->point[pr->v[i]]; iadr = 3*(ki-1)+1; n = &mesh->extra->t[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } } glEnd(); glLineWidth(1.0); glEndList(); return(dlist); } freefem++-3.38-1/src/medit/param.c000644 000767 000024 00000002125 11406142256 016742 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include "medit.h" #include "extern.h" #include "sproto.h" #ifndef ON #define ON 1 #define OFF 0 #endif extern void ortho2D(pScene ,ubyte ); /* globals */ typedef struct sparval { int arg; } Parval; typedef Parval * pParval; static void parMotion(int x,int y) { pScene sc; sc = cv.scene[currentScene()]; glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_XOR); glColor3ub(255,255,0); setFont("helvetica",10); drwstr(10,sc->par.ys-120,"Vector length"); glColor3ub(0,255,128); drwstr(150,sc->par.ys-120,"%g",10.1); glFlush(); glDisable(GL_COLOR_LOGIC_OP); } static void parMouse(int button,int state,int x,int y) { pScene sc; if ( button != GLUT_LEFT_BUTTON ) return; sc = cv.scene[currentScene()]; if ( state == GLUT_DOWN ) { glColor3ub(0,255,128); glDrawBuffer(GL_FRONT); ortho2D(sc,ON); glutMotionFunc(parMotion); } else { glDrawBuffer(GL_BACK); ortho2D(sc,OFF); glutMotionFunc(parMotion); } } void parEdit(pScene sc) { glutMouseFunc(parMouse); } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/parsar.c000644 000767 000024 00000010440 11500004245 017117 0ustar00hechtstaff000000 000000 /* * parse arguments from command line * * Written by Pascal J. Frey, 1998. * email: Pascal.Frey@inria.fr */ #include "medit.h" #include "extern.h" #include "sproto.h" short schw,schh; extern ubyte option,infogl,fullscreen,dosurf,stereoMode; /********************/ /* rajout popen */ extern ubyte dpopen; extern ubyte dpopenbin; extern ubyte dpopensol; void usage() { fprintf(stdout,"Usage: medit [options] [f1 .. fn]\n"); fprintf(stdout,"\n** Generic options :\n"); fprintf(stdout,"-d \t Debug mode (lot of info)\n"); fprintf(stdout,"-fs\t Fullscreen mode\n"); fprintf(stdout,"-h \t Print this message\n"); fprintf(stdout,"-i \t Print info on OpenGL configuration\n"); fprintf(stdout,"-l \t Process very large files\n"); fprintf(stdout,"-s \t Do no build surface\n"); fprintf(stdout,"-v \t Turn off quiet mode\n"); fprintf(stdout,"f1..fn\t Input data file(s)\n"); fprintf(stdout,"\n** Graphic options\n"); fprintf(stdout,"-a start stop\t Animation sequence\n"); fprintf(stdout,"-m Morphing\n"); fprintf(stdout,"-xv width height\t Visual Schnauzer\n"); fprintf(stdout,"-stereo\t Stereo mode\n"); fprintf(stdout,"\n"); exit(1); } int parsar(int argc,char *argv[]) { pMesh mesh; int i; int k; /* default*/ cv.nbm = cv.nbs = 0; i = 1; infogl = FALSE; dosurf = 1; stereoMode = MONO; while (i < argc) { if ( !strcmp(argv[i],"-h") || !strcmp(argv[i],"-help") ) usage(); else if ( !strcmp(argv[i],"-d") || !strcmp(argv[i],"-debug") ) ddebug = TRUE; // Rajout de l option popen else if ( !strcmp(argv[i],"-popen") ) { //printf("valeur de i=%i \n",i); dpopen = TRUE; if( !strcmp(argv[i+1],"-filebin") ){ dpopenbin = TRUE; i=i+1; } if( !strcmp(argv[i+1],"-addsol") ){ dpopensol = TRUE; i=i+1; } if(dpopensol == TRUE && dpopenbin==TRUE){ printf("medit with binary version of popen : mesh(es) and solution(s) \n"); } else if(dpopensol == FALSE && dpopenbin==TRUE){ printf("medit with binary version of popen : mesh(es) \n"); } else if(dpopensol == TRUE && dpopenbin==FALSE){ printf("medit with popen : mesh(es) and solution(s) \n"); } else{ printf("medit with popen : mesh(es) \n"); } if(i+1 != argc) { //printf("valeur de i=%i \n",i); cv.nbm = atoi(argv[i+1]); //printf("number of mesh= %i\n",cv.nbm); i++; if( cv.nbm==0) return(0); } for( k=0; kname,argv[i+1]); printf("mesh_name= %s\n",mesh->name); i++; } //assert(i==argc); } // Fin Rajout de popen else if ( !strcmp(argv[i],"-i") ) infogl = TRUE; else if ( !strcmp(argv[i],"-fs") ) fullscreen = TRUE; else if ( !strcmp(argv[i],"-l") ) option = VERYBIG; else if ( !strcmp(argv[i],"-m") ) option = MORPHING; else if ( !strcmp(argv[i],"-iso") ) option = ISOSURF; else if ( !strcmp(argv[i],"-stereo") ) stereoMode = LEFT+RIGHT; else if ( !strcmp(argv[i],"-s") ) dosurf = 0; else if ( !strcmp(argv[i],"-v") ) quiet = 0; else if ( !strcmp(argv[i],"-xv") ) { if ( ++i < argc && isdigit(argv[i][0]) ) schw = atoi(argv[i]); else usage(); if ( ++i < argc && isdigit(argv[i][0]) ) schh = atoi(argv[i]); else usage(); option = SCHNAUZER; } else if ( !strcmp(argv[i],"-a") ) { option = SEQUENCE; if ( ++i < argc && isdigit(argv[i][0]) ) animdep = atoi(argv[i]); if ( ++i < argc && isdigit(argv[i][0]) ) animfin = atoi(argv[i]); } else if ( !strcmp(argv[i],"-p") ) { option = SEQUENCE + PARTICLE; if ( ++i < argc && isdigit(argv[i][0]) ) animdep = atoi(argv[i]); if ( ++i < argc && isdigit(argv[i][0]) ) animfin = atoi(argv[i]); } else { if ( !cv.mesh[cv.nbm] ) { cv.mesh[cv.nbm] = (pMesh)M_calloc(1,sizeof(Mesh),"parsar.mesh"); if ( !cv.mesh[cv.nbm] ) return(0); } mesh = cv.mesh[cv.nbm]; /*mesh->name = argv[i];*/ strcpy(mesh->name,argv[i]); if ( ddebug ) printf("parsar: mesh[%d] %s\n",cv.nbm,mesh->name); if ( ++cv.nbm == MAX_MESH ) return(1); } i++; } return(1); } freefem++-3.38-1/src/medit/parsop.c000644 000767 000024 00000024737 11406142256 017163 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" extern ubyte stereoMode; int saveMeditFile(char *file,pScene sc) { FILE *out; pMaterial pm; time_t timeptr; int i,k,m; char *ptr,data[128]; strcpy(data,file); ptr = (char *)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; if ( !strstr(data,".medit") ) strcat(data,".medit"); fprintf(stdout," Writing %s\n",data); out = fopen(data,"w"); if ( !out ) { fprintf(stdout," ## Unnable to write file\n"); return(0); } /* create standard parameter file */ fprintf(out,"# File created with Medit %s\n",ME_VER); fprintf(out,"# Release %s\n",ME_REL); time(&timeptr); fprintf(out,"# Created: %s",ctime(&timeptr)); fprintf(out,"\n# Assign background color\n"); fprintf(out,"BackgroundColor\n%f %f %f\n", sc->par.back[0],sc->par.back[1],sc->par.back[2]); if ( sc->par.linc ) fprintf(out,"LineColor\n%f %f %f\n", sc->par.line[0],sc->par.line[1],sc->par.line[2]); if ( sc->mode == HIDDEN ) fprintf(out,"\nRenderMode\nhidden\n"); else if ( sc->mode == FILL ) fprintf(out,"\nRenderMode\nfill\n"); else if ( sc->mode == S_FILL+S_COLOR+S_MATERIAL ) fprintf(out,"\nRenderMode\ncolorshading\n"); else if ( sc->mode == SHADED ) fprintf(out,"\nRenderMode\nshading\n"); else if ( sc->mode == S_FILL+S_BDRY+S_COLOR+S_MATERIAL ) fprintf(out,"\nRenderMode\ncolorshadingline\n"); fprintf(out,"\n# Window Size\n"); fprintf(out,"WindowSize\n%d %d\n",sc->par.xs,sc->par.ys); if ( sc->par.sunp ) { fprintf(out,"\n# Source Light\n"); fprintf(out,"SunPosition\n%f %f %f\n", sc->par.sunpos[0]/(2.0*sc->dmax), sc->par.sunpos[1]/(2.0*sc->dmax), sc->par.sunpos[2]/(2.0*sc->dmax)); } if ( sc->iso.palette ) { fprintf(out,"# Color palette\n"); fprintf(out,"Palette\n"); for (k=0; kiso.val[k]); fprintf(out,"\n"); } if ( sc->par.nbmat ) { m = 0; for (k=0; kpar.nbmat; k++) { pm = &sc->material[k]; for (i=LTria; i<=LHexa; i++) if ( pm->depmat[i] && !pm->flag ) m++; } fprintf(out,"\n# Subdomains colors\n"); fprintf(out,"NbMaterials\n%d\n",m); for (k=0; kpar.nbmat; k++) { pm = &sc->material[k]; m = 0; for (i=LTria; i<=LHexa; i++) if ( pm->depmat[i] && !pm->flag ) break; if ( i > LHexa ) continue; fprintf(out,"# Material %s %d\n",pm->name,pm->ref); fprintf(out,"Material %s %d\n",pm->name,pm->ref); fprintf(out,"%.2f %.2f %.2f %.2f\n", pm->amb[0],pm->amb[1],pm->amb[2],pm->amb[3]); fprintf(out,"%.2f %.2f %.2f %.2f\n", pm->dif[0],pm->dif[1],pm->dif[2],pm->dif[3]); fprintf(out,"%.2f %.2f %.2f %.2f\n", pm->spe[0],pm->spe[1],pm->spe[2],pm->spe[3]); fprintf(out,"%.2f %.2f %.2f %.2f\n", pm->emi[0],pm->emi[1],pm->emi[2],pm->emi[3]); fprintf(out,"%.2f\n",pm->shininess); } } if ( stereoMode != MONO ) fprintf(out,"EyeSep\n%f",sc->par.eyesep); fclose(out); return(1); } /* setup default values */ void iniopt(pScene sc,pMesh mesh) { GLfloat sunpos[4] = { 0.0, 0.0, 1.0, 1.0}; int k; sc->par.back[0] = sc->par.back[1] = sc->par.back[2] = 0.0; sc->par.back[3] = 1.0; sc->par.line[0] = sc->par.line[1] = sc->par.line[2] = 1.0; sc->par.line[3] = 1.0; sc->par.edge[0] = 1.0; sc->par.edge[1] = 0.7; sc->par.edge[2] = 0.1; sc->par.edge[3] = 1.0; memcpy(sc->par.sunpos,sunpos,4*sizeof(GLfloat)); sc->par.nbmat = -1; sc->par.sunp = 0; sc->par.linc = 0; sc->par.linewidth = mesh->dim==3 ? 3 : 2; sc->par.pointsize = 3.0; for (k=0; kiso.val[k] = 0.0; sc->iso.col[k] = 0.0; } sc->iso.palette = 0; /* postscript */ sc->par.dpi = 300.; sc->par.cm = 10.; sc->par.coeff = 0.0; /* streamlines */ sc->par.maxtime = FLT_MAX; sc->par.dt = FLT_MAX; sc->par.nbpart = 1; /* clip plane */ sc->par.clip[0] = 0.0; sc->par.clip[1] = 0.0; sc->par.clip[2] = 0.0; sc->par.clip[3] = -1.0; sc->par.clip[4] = 0.0; sc->par.clip[5] = 0.0; sc->par.eyesep = -1.0; } /* parse the program options */ int parsop(pScene sc,pMesh mesh) { FILE *in; pMaterial pm; double dd; float r,g,b,ca,cb,cc,na,nb,nc; int k,i,m,n,xs,ys,ret,ref,nbmat; char *ptr,ub,data[128],key[256],buf[256],pscol[32]; /* check if user-specified parameters */ iniopt(sc,mesh); strcpy(data,mesh->name); ptr = (char *)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; in = 0; if ( !strstr(data,".medit") ) { strcat(data,".medit"); in = fopen(data,"r"); } if ( !in ) { sprintf(data,"%s",DEFAULT_FILE); in = fopen(data,"r"); if ( !in ) { fprintf(stdout," Loading default options\n"); sc->par.nbmat = MAX_MATERIAL; matInit(sc); return(1); } } if ( !quiet ) fprintf(stdout," Reading %s\n",data); m = n = 0; while ( !feof(in) ) { fscanf(in,"%s",key); if ( feof(in) ) break; for (i=0; ipar.back[0] = r; sc->par.back[1] = g; sc->par.back[2] = b; sc->par.back[3] = 1.0f; } else if ( !strcmp(key,"boundingbox") ) { fscanf(in,"%f %f %f %f %f %f",&ca,&cb,&cc,&na,&nb,&nc); mesh->xmin = ca; mesh->ymin = cb; mesh->zmin = cc; mesh->xmax = na; mesh->ymax = nb; mesh->zmax = nc; } else if ( !strcmp(key,"clipplane") ) { fscanf(in,"%f %f %f %f %f %f",&ca,&cb,&cc,&na,&nb,&nc); sc->par.clip[0] = ca - mesh->xtra; sc->par.clip[1] = cb - mesh->ytra; sc->par.clip[2] = cc - mesh->ztra; dd = sqrt(na*na + nb*nb + nc*nc); if ( dd > EPS ) { sc->par.clip[3] = na / dd; sc->par.clip[4] = nb / dd; sc->par.clip[5] = nc / dd; } } else if ( !strcmp(key,"linecolor") ) { fscanf(in,"%f %f %f",&r,&g,&b); sc->par.line[0] = r; sc->par.line[1] = g; sc->par.line[2] = b; sc->par.linc = 1; } else if ( !strcmp(key,"linewidth") ) { fscanf(in,"%f",&r); sc->par.linewidth = max(1.0,min(10.0,r)); sc->par.linc = 1; } else if ( !strcmp(key,"pointsize") ) { fscanf(in,"%f",&r); sc->par.pointsize = max(1.0,min(10.0,r)); sc->par.linc = 1; } else if ( !strcmp(key,"edgecolor") ) { fscanf(in,"%f %f %f",&r,&g,&b); sc->par.edge[0] = r; sc->par.edge[1] = g; sc->par.edge[2] = b; sc->par.linc = 1; } else if ( !strcmp(key,"sunposition") ) { fscanf(in,"%f %f %f",&r,&g,&b); sc->dmax = mesh->xmax - mesh->xmin; sc->dmax = max(sc->dmax,mesh->ymax - mesh->ymin); sc->dmax = max(sc->dmax,mesh->zmax - mesh->zmin); sc->dmax = fabs(sc->dmax); sc->par.sunpos[0] = 2.0*sc->dmax*r; sc->par.sunpos[1] = 2.0*sc->dmax*g; sc->par.sunpos[2] = 2.0*sc->dmax*b; sc->par.sunp = 1; } else if ( !strcmp(key,"windowsize") ) { fscanf(in,"%d %d",&xs,&ys); sc->par.xs = (short)xs; sc->par.ys = (short)ys; } else if ( !strcmp(key,"rendermode") ) { fscanf(in,"%s",buf); for (i=0; imode = HIDDEN; else if ( strstr(buf,"fill") ) sc->mode = FILL; else if ( strstr(buf,"colorshadingline") ) sc->mode = SHADED + S_MATERIAL; else if ( strstr(buf,"colorshading") ) sc->mode = S_FILL + S_COLOR + S_MATERIAL; else if ( strstr(buf,"shading") ) sc->mode = SHADED; } else if ( strstr(key,"palette") ) { sc->iso.palette = 1; if ( !strcmp(key,"palettet") ) sc->iso.palette = 1; else if ( !strcmp(key,"paletteb") ) sc->iso.palette = 2; else if ( !strcmp(key,"palettel") ) sc->iso.palette = 3; else if ( !strcmp(key,"paletter") ) sc->iso.palette = 4; for (k=0; kiso.val[k]); if ( sc->iso.val[MAXISO-1] < sc->iso.val[0] ) sc->iso.palette = 0; } else if ( !strcmp(key,"postscript") ) { fscanf(in,"%f %f %s %s",&sc->par.cm,&sc->par.dpi, buf,pscol); strncpy(sc->par.pscolor,pscol,10); sc->par.coeff = atof(buf); if ( sc->par.coeff < 0.0f ) sc->par.coeff = 0.0f; if ( sc->par.coeff > 1.0f ) sc->par.coeff = 1.0f; } else if ( !strcmp(key,"time") ) { ret = fscanf(in,"%f %f %f",&sc->par.maxtime,&sc->par.pertime,&sc->par.dt); if ( !EatSpace(in) ) { fscanf(in,"%c",&ub); sc->par.nbpart = max(atoi(&ub),1); } } else if ( !strcmp(key,"nbmaterial") ) { fscanf(in,"%d",&nbmat); sc->par.nbmat = max(2,nbmat); matInit(sc); } else if ( !strcmp(key,"material") ) { if ( sc->par.nbmat == -1 ) { sc->par.nbmat = MAX_MATERIAL; matInit(sc); } fgets(buf,255,in); if ( n > sc->par.nbmat ) continue; ret = sscanf(buf,"%s %d",buf,&ref); ptr = strstr(buf,"DEFAULT"); pm = ptr ? &sc->material[DEFAULT_MAT] : &sc->material[++n]; strcpy(pm->name,buf); if ( ret < 2 ) ref = 0; pm->ref = ref ? ref : n; fscanf(in,"%f %f %f %f",&pm->amb[0],&pm->amb[1],&pm->amb[2],&pm->amb[3]); fscanf(in,"%f %f %f %f",&pm->dif[0],&pm->dif[1],&pm->dif[2],&pm->dif[3]); fscanf(in,"%f %f %f %f",&pm->spe[0],&pm->spe[1],&pm->spe[2],&pm->spe[3]); fscanf(in,"%f %f %f %f",&pm->emi[0],&pm->emi[1],&pm->emi[2],&pm->emi[3]); fscanf(in,"%f",&pm->shininess); if ( pm->amb[3] == 0.0 ) pm->amb[3] = 1.0; if ( pm->dif[3] == 0.0 ) pm->dif[3] = 1.0; if ( pm->spe[3] == 0.0 ) pm->spe[3] = 1.0; if ( pm->emi[3] == 0.0 ) pm->emi[3] = 1.0; pm->shininess = min(fabs(pm->shininess),128.0f); pm->shininess = max(pm->shininess,3.0f); ++m; } /* stereo mode */ else if ( !strcmp(key,"eyesep") ) { fscanf(in,"%f",&sc->par.eyesep); } } fclose(in); if ( sc->par.nbmat < 0 ) { sc->par.nbmat = MAX_MATERIAL; matInit(sc); } else if ( m == n ) sc->par.nbmat++; if ( !sc->par.linc ) { sc->par.line[0] = 1.0 - sc->par.back[0]; sc->par.line[1] = 1.0 - sc->par.back[1]; sc->par.line[2] = 1.0 - sc->par.back[2]; } if ( ddebug ) fprintf(stdout," Materials %8d\n",sc->par.nbmat); return(1); } freefem++-3.38-1/src/medit/particle.c000644 000767 000024 00000021603 11406142256 017447 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define MAX_PRT 10 #define MAX_LST 1024 #define MAX_CPT 5000 #define HSIZ 0.03 extern int reftype,refitem; typedef struct spart { double cb[4]; float pos[MAX_PRT+1][3],col[MAX_PRT+1][3],size,norm,ct,step; int nsdep,cur; ubyte flag; } Particle; typedef Particle *pParticle; Particle *tp; void colorParticle(pScene sc,pParticle pp) { double rgb[3],norm,kc; int i; static double hsv[3] = { 0.0, 1.0, 0.80 }; norm = pp->norm; if ( norm < sc->iso.val[0] ) norm = sc->iso.val[0]; else if ( norm > sc->iso.val[MAXISO-1] ) norm = sc->iso.val[MAXISO-1]; for (i=0; iiso.val[i] ) break; kc = (norm-sc->iso.val[i-1]) / (sc->iso.val[i] - sc->iso.val[i-1]); hsv[0] = sc->iso.col[i-1]*(1.0-kc)+sc->iso.col[i]*kc; hsvrgb(hsv,rgb); pp->col[pp->cur][0] = rgb[0]; pp->col[pp->cur][1] = rgb[1]; pp->col[pp->cur][2] = rgb[2]; } void drawParticle(pScene sc,pParticle pp) { float radius; int i; radius = 0.005*sc->dmax; for (i=1; i<=sc->par.nbpart; i++) { glPushMatrix(); glTranslatef(pp->pos[i][0],pp->pos[i][1],pp->pos[i][2]); glColor3fv(pp->col[i]); glutSolidSphere(radius,10,10); glPopMatrix(); } } void computeTetraParticle(pScene sc,pMesh mesh,int k) { pTetra pt; pStream st; pParticle pp; double dd,cb[4],v[4]; float ux,uy,uz,pos[3],ldt; int cur,nsfin,nsold,nbp; st = sc->stream; pp = &tp[k]; if ( pp->ct > sc->par.pertime ) return; ldt = 0.0; nbp = 0; nsold = pp->nsdep; pos[0] = pp->pos[pp->cur][0]; pos[1] = pp->pos[pp->cur][1]; pos[2] = pp->pos[pp->cur][2]; do { ux = pos[0]; uy = pos[1]; uz = pos[2]; if ( st->typtrack == 1 || !nxtPoint3D(mesh,pp->nsdep,pos,pp->step,v) ) { pos[0] += pp->step*v[0]; pos[1] += pp->step*v[1]; pos[2] += pp->step*v[2]; } if ( pos[0]xmin || pos[0]>st->xmax || pos[1]ymin || pos[1]>st->ymax || pos[2]zmin || pos[2]>st->zmax ) { pp->flag = 0; break; } ux -= pos[0]; uy -= pos[1]; uz -= pos[2]; dd = sqrt(ux*ux + uy*uy + uz*uz) / pp->norm; ldt += dd; pp->ct += dd; if ( pp->ct >= sc->par.pertime ) { pp->flag = 0; sc->par.cumpertime = sc->par.pertime+1.e-06; break; /*return;*/ } else if ( ldt >= sc->par.dt ) { pp->cur = 1 + (pp->cur % sc->par.nbpart); pp->pos[pp->cur][0] = pos[0]; pp->pos[pp->cur][1] = pos[1]; pp->pos[pp->cur][2] = pos[2]; colorParticle(sc,pp); break; /*return;*/ } /* find tet containing p */ nsfin = locateTetra(mesh,pp->nsdep,++mesh->mark,pos,cb); if ( !nsfin ) { pp->flag = 0; break; /*return;*/ } pp->nsdep = nsfin; pt = &mesh->tetra[pp->nsdep]; if ( pt->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( pp->nsdep != nsold ) { pp->size = sizeTetra(mesh,pp->nsdep); nsold = pp->nsdep; } /* vector field interpolation */ pp->norm = field3DInterp(mesh,pp->nsdep,pp->cb,v); pp->step = HSIZ*min(pp->size,pp->norm); if ( sc->par.maxtime < FLT_MAX ) pp->step = min(0.05*sc->par.dt,pp->step); if ( pp->step == 0.0 ) { pp->flag = 0; return; } nbp++; } while ( ldt <= sc->par.dt ); cur = (pp->cur % MAX_PRT) + 1; pp->pos[cur][0] = pp->pos[pp->cur][0]; pp->pos[cur][1] = pp->pos[pp->cur][1]; pp->pos[cur][2] = pp->pos[pp->cur][2]; pp->cur = cur; colorParticle(sc,pp); } int displayParticle(pScene sc,pMesh mesh) { pParticle pp; pStream st; int k; st = sc->stream; if ( sc->par.advtim ) for (k=1; k<=st->nbstl; k++) computeTetraParticle(sc,mesh,k); /* redraw particles */ for (k=1; k<=st->nbstl; k++) { pp = &tp[k]; if ( pp->flag ) drawParticle(sc,pp); } return(1); } int createParticle(pScene sc,pMesh mesh) { pParticle pp; pStream st; pMaterial pm; pTetra pt1; pTriangle pt; pPoint ppt; double v[4],cx,cy,cz; int i,j,k,l,nmat,nbp,base; if ( ddebug ) printf("create particles\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( sc->stream ) { st = sc->stream; if ( st->listp ) free(st->listp); free(sc->stream); } sc->stream = createStream(sc,mesh); sc->par.cumtim = 0.0; sc->par.advtim = 0; assert(sc->stream); st = sc->stream; fprintf(stdout," Creating particles :"); fflush(stdout); st->nbstl = 0; base = ++mesh->mark; pt = &mesh->tria[refitem]; nmat = matRef(sc,pt->ref); pm = &sc->material[nmat]; k = pm->depmat[LTria]; if ( !k || pm->flag ) return(0); /* point positions */ for (i=1; i<=mesh->np; i++) { ppt = &mesh->point[i]; ppt->mark = base; } if ( sc->par.nbpart >= MAX_PRT ) sc->par.nbpart = MAX_PRT; ++base; l = 1; nbp = 0; while ( k != 0 && st->nbstl < MAX_LST-1 ) { pt = &mesh->tria[k]; if ( pt->v[0] ) { cx = cy = cz = 0.0; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; cx += 0.33 * ppt->c[0]; cy += 0.33 * ppt->c[1]; cz += 0.33 * ppt->c[2]; ppt->flag = 1; } st->listp[l++] = cx; st->listp[l++] = cy; st->listp[l++] = cz; ++st->nbstl; if ( st->nbstl > MAX_LST-1 ) break; k = pt->nxt; } } fprintf(stdout,"%d\n",st->nbstl); if ( !st->nbstl ) return(0); /* init positions */ tp = calloc((st->nbstl+1),sizeof(Particle)); assert(tp); for (k=1; k<=st->nbstl; k++) tp[k].nsdep = mesh->ntet / 2; for (k=1; k<=mesh->ntet; k++) mesh->tetra[k].cpt = 0; l = 1; for (k=1; k<=st->nbstl; k++) { pp = &tp[k]; pp->pos[1][0] = st->listp[l++]; pp->pos[1][1] = st->listp[l++]; pp->pos[1][2] = st->listp[l++]; tp[k].nsdep = locateTetra(mesh,pp->nsdep,++mesh->mark,pp->pos[1],pp->cb); if ( !pp->nsdep ) { for (j=1; j<=mesh->ntet; j++) { pt1 = &mesh->tetra[j]; if ( pt1->mark != mesh->mark && inTetra(mesh,j,pp->pos[1],pp->cb) ) break; } if ( j > mesh->ntet ) return(0); else pp->nsdep = j; } pp->norm = field3DInterp(mesh,tp[k].nsdep,tp[k].cb,v); pp->size = sizeTetra(mesh,tp[k].nsdep); if ( pp->size == 0.0 ) pp->step = EPS*sc->dmax; else pp->step = HSIZ * min(pp->size,pp->norm); pp->step = min(0.05*sc->par.dt,pp->step); pp->flag = 1; pp->cur = 1; colorParticle(sc,pp); for (i=2; i<=sc->par.nbpart; i++) { pp->pos[i][0] = pp->pos[1][0]; pp->pos[i][1] = pp->pos[1][1]; pp->pos[i][2] = pp->pos[1][2]; } } return(1); } int advectParticle(pScene sc,pMesh mesh) { pParticle pp; pStream st; pTetra pt1; pPoint ppt; double v[4]; int i,j,k,l,base; if ( ddebug ) printf("advect particles\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( !sc->stream ) return(0); st = sc->stream; if ( mesh->ntet && !hashTetra(mesh) ) return(0); st->xmin = mesh->xmin - mesh->xtra; st->ymin = mesh->ymin - mesh->ytra; st->zmin = mesh->zmin - mesh->ztra; st->xmax = mesh->xmax - mesh->xtra; st->ymax = mesh->ymax - mesh->ytra; st->zmax = mesh->zmax - mesh->ztra; sc->par.cumpertime = 0.0; sc->par.advtim = 0; /* init list */ sc->slist = (GLuint*)calloc(MAX_LST,sizeof(GLuint)); if ( !sc->slist ) return(0); /* point positions */ base = ++mesh->mark; for (i=1; i<=mesh->np; i++) { ppt = &mesh->point[i]; ppt->mark = base; } for (k=1; k<=mesh->ntet; k++) mesh->tetra[k].cpt = 0; l = 1; for (k=1; k<=st->nbstl; k++) { pp = &tp[k]; pp->ct = 0.0; st->listp[l++] = pp->pos[pp->cur][0]; st->listp[l++] = pp->pos[pp->cur][1]; st->listp[l++] = pp->pos[pp->cur][2]; pp->cur = 1; } ++base; l = 1; for (k=1; k<=st->nbstl; k++) { pp = &tp[k]; pp->pos[1][0] = st->listp[l++]; pp->pos[1][1] = st->listp[l++]; pp->pos[1][2] = st->listp[l++]; tp[k].nsdep = locateTetra(mesh,pp->nsdep,++mesh->mark,pp->pos[1],pp->cb); if ( !pp->nsdep ) { for (j=1; j<=mesh->ntet; j++) { pt1 = &mesh->tetra[j]; if ( pt1->mark != mesh->mark && inTetra(mesh,j,pp->pos[1],pp->cb) ) break; } if ( j > mesh->ntet ) continue; else pp->nsdep = j; } pp->norm = field3DInterp(mesh,tp[k].nsdep,tp[k].cb,v); pp->size = sizeTetra(mesh,tp[k].nsdep); if ( pp->size == 0.0 ) pp->step = EPS*sc->dmax; else pp->step = HSIZ * min(pp->size,pp->norm); pp->step = min(0.05*sc->par.dt,pp->step); pp->flag = 1; pp->cur = 1; colorParticle(sc,pp); for (i=2; i<=sc->par.nbpart; i++) { pp->pos[i][0] = pp->pos[1][0]; pp->pos[i][1] = pp->pos[1][1]; pp->pos[i][2] = pp->pos[1][2]; } } return(1); } freefem++-3.38-1/src/medit/path.c000644 000767 000024 00000010304 11406142256 016574 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define MAX_PATH 1024 #define IMG_PER_SEC 25 /* add point to path */ int pathAdd(pScene sc,int x,int y) { GLdouble modelmat[16],projmat[16]; GLdouble ptx,pty,ptz; GLint viewport[4]; Trajet *path; pMesh mesh; pTransform view; float *p,*p1,*a; int k; if ( ddebug ) fprintf(stdout,"pathAdd"); path = &sc->path; mesh = cv.mesh[sc->idmesh]; view = sc->view; if ( path->np == MAX_PATH ) return(0); /* memory alloc */ if ( !path->np ) { path->pt = (float*)calloc(mesh->dim*(MAX_PATH+1),sizeof(float)); if ( !path->pt ) { fprintf(stderr," Not enough memory to store path.\n"); return(0); } path->tg = (float*)calloc(mesh->dim*(MAX_PATH+1),sizeof(float)); if ( !path->tg ) { fprintf(stderr," Not enough memory to store tangents.\n"); return(0); } } else if ( path->np > MAX_PATH-1 ) return(0); /* get 3D point */ glGetDoublev(GL_PROJECTION_MATRIX,projmat); glGetIntegerv(GL_VIEWPORT,viewport); for (k=0; k<16; k++) modelmat[k] = view->matrix[k]; gluUnProject(x,y,-100,modelmat,projmat,viewport,&ptx,&pty,&ptz); /* store point coords */ ++path->np; p = &path->pt[mesh->dim*path->np]; p[0] = ptx; p[1] = pty; p[2] = ptz; /* compute tangent at point-1 */ if ( path->np > 2 ) { p1 = &path->pt[mesh->dim*(path->np-2)]; a = &path->tg[mesh->dim*path->np]; a[0] = 0.5 * (p[0] - p1[0]); a[1] = 0.5 * (p[1] - p1[1]); a[2] = 0.5 * (p[2] - p1[2]); } if ( ddebug ) printf(" Point %d: (%f %f %f) added\n",path->np,p[0],p[1],p[2]); return(1); } /* build list of points */ GLuint pathList(pScene sc) { Trajet path; pMesh mesh; GLuint dlist; float *p; int k; static GLfloat green[3] = {0.2, 1.0, 0.2}; /*static GLfloat orang[3] = {1.0, 0.7, 0.1};*/ if ( ddebug ) fprintf(stdout,"pathList"); path = sc->path; mesh = cv.mesh[sc->idmesh]; /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* node positions */ glPointSize(5); glColor3f(1.0,0.3,0.3); glBegin(GL_POINTS); for (k=1; k<=path.np; k++) { p = &path.pt[mesh->dim*k]; glVertex3fv(p); } glEnd(); /* straight path */ glLineWidth(2.0); glColor3fv(green); glBegin(GL_LINE_STRIP); for (k=1; k<=path.np; k++) { p = &path.pt[mesh->dim*k]; glVertex3fv(p); } glEnd(); glLineWidth(1.0); /* curvilinear path */ /* glBegin(GL_LINE_STRIP); glColor3fv(orang); glEnd(); */ glEndList(); return(dlist); } /* follow path */ void pathFollow(pScene sc) { Trajet path; int nbp; if ( !sc->path.np ) return; if ( ddebug ) fprintf(stdout,"pathFollow %d\n",sc->path.np); path = sc->path; if ( sc->path.sec < 0 ) nbp = sc->path.np; else nbp = (sc->path.sec*IMG_PER_SEC); } int pathLoad(char *file,pScene sc) { FILE *in; char *ptr,data[256]; strcpy(data,file); ptr = (char *)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; if ( !strstr(data,".path") ) strcat(data,".path"); in = fopen(data,"r"); if ( !in ) { sscanf(data,"DEFAULT.path"); in = fopen(data,"r"); if ( !in ) return(0); } if ( !quiet ) fprintf(stdout," Loading %s\n",data); return(1); } int pathSave(char *file,pScene sc) { FILE *out; pMesh mesh; time_t timeptr; float *p; int i,k; char *ptr,data[256]; strcpy(data,file); ptr = (char *)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; if ( !strstr(data,".path") ) strcat(data,".path"); out = fopen(data,"w"); if ( !out ) { fprintf(stdout," ## Unable to open file\n");; return(0); } if ( !quiet ) fprintf(stdout," Writing %s\n",data); /* create standard path file */ fprintf(out,"# File created with Medit %s\n",ME_VER); fprintf(out,"# Release %s\n",ME_REL); time(&timeptr); fprintf(out,"# Created: %s",ctime(&timeptr)); mesh = cv.mesh[sc->idmesh]; fprintf(out,"NbPoints\n%d\n",sc->path.np); for (k=1; k<=sc->path.np; k++) { p = &sc->path.pt[mesh->dim*k]; for (i=0; idim; i++) fprintf(out,"%f ",p[i]); fprintf(out,"\n"); } fclose(out); return(1); } freefem++-3.38-1/src/medit/persp.c000644 000767 000024 00000003570 11406142256 017000 0ustar00hechtstaff000000 000000 #include #include "medit.h" #include "extern.h" #include "sproto.h" static float ident[16] = { 1.,0.,0.,0., 0.,1.,0.,0., 0.,0.,1.,0., 0.,0.,0.,1.}; void setPersp(pScene sc,pPersp p,int pmode) { float tgalpha,deltax,deltay,alphax,alphay,alpha,beta; float rapx,rapy,Deltax,Deltay,yy; /* defalut */ Deltax = sc->par.xs; Deltay = sc->par.ys; alphax = p->fovy / 2.0f; alphay = p->fovy / 2.0f; deltax = (p->rubix+p->rubfx-Deltax) / (float)Deltax; deltay = (p->rubiy+p->rubfy-Deltay) / (float)Deltay; alpha = atan(deltax * tan(alphax*DTOR)); beta = atan(deltay * tan(alphay*DTOR)); yy = cos(alpha)*cos(alpha)*sin(beta)*sin(beta); yy /= yy + cos(beta)*cos(beta); yy = sqrt(yy); p->gamma = asin(yy)*RTOD; if ( deltay < 0. ) p->gamma = -p->gamma; p->alpha = alpha*RTOD; /* new fovy */ tgalpha = tan(p->fovy*DTOR); rapx = fabs(p->rubfx-p->rubix) / (float)sc->par.xs; rapy = fabs(p->rubfy-p->rubiy) / (float)sc->par.ys; if ( pmode == 1 ) p->fovy = atan(tgalpha * rapy)*RTOD; else if ( pmode == 0 ) p->fovy = atan(tgalpha / rapy)*RTOD; p->rubix = p->rubfx = 0; p->rubiy = p->rubfy = 0; } pPersp initPersp(pPersp p,float dmax) { pPersp pp; if ( p ) { p->fovy = 35.0f; p->rubber = 0; p->rubix = p->rubfx = 0; p->rubiy = p->rubfy = 0; p->alpha = p->gamma = 0.0f; p->depth = -2.0*dmax; p->pmode = PERSPECTIVE; memcpy(p->matrix,ident,16*sizeof(float)); return(p); } else { pp = (pPersp)M_calloc(1,sizeof(struct sperspective),"persp"); assert(pp); pp->fovy = 35.0f; pp->rubber = 0; pp->rubix = pp->rubfx = 0; pp->rubiy = pp->rubfy = 0; pp->alpha = pp->gamma = 0.0f; pp->depth = -2.0*dmax; pp->pmode = PERSPECTIVE; memcpy(pp->matrix,ident,16*sizeof(float)); return(pp); } } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/picking.c000644 000767 000024 00000063207 11500001056 017261 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" typedef struct color { GLuint rMask,gMask,bMask,aMask; int rShift,gShift,bShift; int rBits,gBits,bBits,aBits; } Color; int refmat=-1,reftype=-1,refitem=0,numel=0,refval=0; static int ch[6][4] = { {0,1,2,3}, {4,5,6,7}, {0,1,5,4}, {1,2,6,5}, {2,3,7,6}, {0,3,7,4} }; static int ct[4][3] = { {0,1,2}, {0,3,1}, {1,3,2}, {0,2,3} }; extern int refpick; static void drawTria(pScene sc,pMesh mesh,int k) { pMaterial pm; pTriangle pt; pPoint p0,p1,p2; double ax,ay,az,bx,by,bz,dd; float shrink,cx,cy,cz,n[3]; /* default */ if ( ddebug ) printf("draw triangle %d\n",k); if ( k < 1 || k > mesh->nt ) return; pt = &mesh->tria[k]; if ( refpick > 0 ) pt->ref = refpick; refmat = matRef(sc,pt->ref); p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; pm = &sc->material[refmat]; cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.; cz = (p0->c[2] + p1->c[2] + p2->c[2]) / 3.; shrink = 0.95 * sc->shrink; glBegin(GL_TRIANGLES); glColor3f(1.0-pm->dif[0],1.0-pm->dif[1],1.0-pm->dif[2]); /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0f / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } glNormal3fv(n); glVertex3f(shrink*(p0->c[0]-cx)+cx, shrink*(p0->c[1]-cy)+cy, shrink*(p0->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p1->c[0]-cx)+cx, shrink*(p1->c[1]-cy)+cy, shrink*(p1->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p2->c[0]-cx)+cx, shrink*(p2->c[1]-cy)+cy, shrink*(p2->c[2]-cz)+cz); glEnd(); glColor3f(1.0-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); output3(p0->c[0],p0->c[1],p0->c[2],"%d",pt->v[0]); output3(p1->c[0],p1->c[1],p1->c[2],"%d",pt->v[1]); output3(p2->c[0],p2->c[1],p2->c[2],"%d",pt->v[2]); } static void drawQuad(pScene sc,pMesh mesh,int k) { pMaterial pm; pQuad pq; pPoint p0,p1,p2,p3; double ax,ay,az,bx,by,bz,dd; float shrink,cx,cy,cz,n[3]; /* default */ if ( ddebug ) printf("draw quad %d\n",k); if ( k < 1 || k > mesh->nq ) return; pq = &mesh->quad[k]; if ( refpick > 0 ) pq->ref = refpick; refmat = matRef(sc,pq->ref); p0 = &mesh->point[pq->v[0]]; p1 = &mesh->point[pq->v[1]]; p2 = &mesh->point[pq->v[2]]; p3 = &mesh->point[pq->v[3]]; pm = &sc->material[refmat]; cx = (p0->c[0] + p1->c[0] + p2->c[0] + p3->c[0]) / 4.; cy = (p0->c[1] + p1->c[1] + p2->c[1] + p3->c[1]) / 4.; cz = (p0->c[2] + p1->c[2] + p2->c[2] + p3->c[2]) / 4.; shrink = 0.95 * sc->shrink; glBegin(GL_QUADS); glColor3f(1.0-pm->dif[0],1.0-pm->dif[1],1.0-pm->dif[2]); /* compute normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; dd = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( dd > 0.0f ) { dd = 1.0f / sqrt(dd); n[0] *= dd; n[1] *= dd; n[2] *= dd; } glNormal3fv(n); glVertex3f(shrink*(p0->c[0]-cx)+cx, shrink*(p0->c[1]-cy)+cy, shrink*(p0->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p1->c[0]-cx)+cx, shrink*(p1->c[1]-cy)+cy, shrink*(p1->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p2->c[0]-cx)+cx, shrink*(p2->c[1]-cy)+cy, shrink*(p2->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p3->c[0]-cx)+cx, shrink*(p3->c[1]-cy)+cy, shrink*(p3->c[2]-cz)+cz); glEnd(); /* display vertex number */ glColor3f(1.0-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); output3(p0->c[0],p0->c[1],p0->c[2],"%d",pq->v[0]); output3(p1->c[0],p1->c[1],p1->c[2],"%d",pq->v[1]); output3(p2->c[0],p2->c[1],p2->c[2],"%d",pq->v[2]); output3(p3->c[0],p3->c[1],p3->c[2],"%d",pq->v[3]); } static void drawTets(pScene sc,pMesh mesh,int k) { pMaterial pm; pTetra pt; pPoint p0,p1,p2,p3; float ax,ay,az,bx,by,bz,d,n[3]; float shrink,cx,cy,cz; int l; /* default */ if ( ddebug ) printf("draw tetra %d\n",k); if ( k < 1 || k > mesh->ntet ) return; pt = &mesh->tetra[k]; if ( refpick > 0 ) pt->ref = refpick; refmat = matRef(sc,pt->ref); pm = &sc->material[refmat]; shrink = 0.95*sc->shrink; glBegin(GL_TRIANGLES); glColor3f(1.0-pm->dif[0],1.0-pm->dif[1],1.0-pm->dif[2]); for (l=0; l<4; l++) { p0 = &mesh->point[pt->v[ct[l][0]]]; p1 = &mesh->point[pt->v[ct[l][1]]]; p2 = &mesh->point[pt->v[ct[l][2]]]; cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.; cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.; cz = (p0->c[2] + p1->c[2] + p2->c[2]) / 3.; /* compute face normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glNormal3fv(n); glVertex3f(shrink*(p0->c[0]-cx)+cx, shrink*(p0->c[1]-cy)+cy, shrink*(p0->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p1->c[0]-cx)+cx, shrink*(p1->c[1]-cy)+cy, shrink*(p1->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(shrink*(p2->c[0]-cx)+cx, shrink*(p2->c[1]-cy)+cy, shrink*(p2->c[2]-cz)+cz); } glEnd(); /* display vertex number */ p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; p3 = &mesh->point[pt->v[3]]; glColor3f(1.0-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); output3(p0->c[0],p0->c[1],p0->c[2],"%d",pt->v[0]); output3(p1->c[0],p1->c[1],p1->c[2],"%d",pt->v[1]); output3(p2->c[0],p2->c[1],p2->c[2],"%d",pt->v[2]); output3(p3->c[0],p3->c[1],p3->c[2],"%d",pt->v[3]); /*if ( mesh->nfield == 6 ) drawEllipse(sc,mesh,LTets,k);*/ if ( !mesh->nbb ) circumSphere(sc,mesh,LTets,k); } static void drawHexa(pScene sc,pMesh mesh,int k) { pMaterial pm; pHexa ph; pPoint p0,p1,p2,p3; float ax,ay,az,bx,by,bz,d,n[3]; float shrink,cx,cy,cz; int l; /* default */ if ( ddebug ) printf("draw hexa %d\n",k); if ( k < 1 || k > mesh->nhex ) return; ph = &mesh->hexa[k]; if ( refpick > 0 ) ph->ref = refpick; refmat = matRef(sc,ph->ref); pm = &sc->material[refmat]; shrink = 0.95*sc->shrink; glBegin(GL_QUADS); glColor3f(1.0-pm->dif[0],1.0-pm->dif[1],1.0-pm->dif[2]); for (l=0; l<6; l++) { p0 = &mesh->point[ph->v[ch[l][0]]]; p1 = &mesh->point[ph->v[ch[l][1]]]; p2 = &mesh->point[ph->v[ch[l][2]]]; p3 = &mesh->point[ph->v[ch[l][3]]]; cx = (p0->c[0] + p1->c[0] + p2->c[0] + p3->c[0]) / 4.; cy = (p0->c[1] + p1->c[1] + p2->c[1] + p3->c[1]) / 4.; cz = (p0->c[2] + p1->c[2] + p2->c[2] + p3->c[2]) / 4.; /* compute face normal */ ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2]; n[0] = ay*bz - az*by; n[1] = az*bx - ax*bz; n[2] = ax*by - ay*bx; d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2]; if ( d > 0.0f ) { d = 1.0 / sqrt(d); n[0] *= d; n[1] *= d; n[2] *= d; } glNormal3fv(n); glVertex3f(sc->shrink*(p0->c[0]-cx)+cx, sc->shrink*(p0->c[1]-cy)+cy, sc->shrink*(p0->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(sc->shrink*(p1->c[0]-cx)+cx, sc->shrink*(p1->c[1]-cy)+cy, sc->shrink*(p1->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(sc->shrink*(p2->c[0]-cx)+cx, sc->shrink*(p2->c[1]-cy)+cy, sc->shrink*(p2->c[2]-cz)+cz); glNormal3fv(n); glVertex3f(sc->shrink*(p3->c[0]-cx)+cx, sc->shrink*(p3->c[1]-cy)+cy, sc->shrink*(p3->c[2]-cz)+cz); } glEnd(); /* display vertex number */ glColor3f(1.0-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); for (l=0; l<8; l++) { p0 = &mesh->point[ph->v[l]]; output3(p0->c[0],p0->c[1],p0->c[2],"%d",ph->v[l]); } } static void drawPoint(pScene sc,pMesh mesh,int k) { pPoint pt; pt = &mesh->point[k]; /*glDisable(GL_DEPTH_TEST);*/ glDisable(GL_LIGHTING); glPointSize(6.0); glColor3f(1.0,0.,0.); glBegin(GL_POINTS); glVertex3f(pt->c[0],pt->c[1],pt->c[2]); glEnd(); output3(pt->c[0],pt->c[1],pt->c[2],"%d",refitem); glEnable(GL_LIGHTING); /*glEnable(GL_DEPTH_TEST);*/ } static void infoData(pScene sc,pMesh mesh,int k,int typel) { pSolution ps; if ( !mesh->nbb ) return; ps = &mesh->sol[k]; if ( mesh->nfield == 1 ) fprintf(stdout," Data (scalar): %f\n",ps->bb); else if ( mesh->nfield == mesh->dim ) { fprintf(stdout," Data (vector): %f %f",ps->m[0],ps->m[1]); if (mesh->dim == 3 ) fprintf(stdout," %f",ps->m[2]); fprintf(stdout,"\n"); } else if ( mesh->dim == 2 && mesh->nfield == 3 ) { fprintf(stdout," Data (tensor): %f %f %f\n", ps->m[0],ps->m[1],ps->m[2]); drawEllipse(sc,mesh,typel,k); } else if ( mesh->dim == 3 && mesh->nfield == 6 ) { if ( mesh->ne) fprintf(stdout," Data (tensor): %f %f %f %f %f %f\n", ps->m[0],ps->m[1],ps->m[2],ps->m[3],ps->m[4],ps->m[5]); drawEllipsoid(sc,mesh,typel,k); } fflush(stdout); /* add J. Morice 12/2008 */ } static void infoEntity(pScene sc,pMesh mesh,int k,int type) { pMaterial pm; pTriangle pt; pTetra ptt; pHexa ph; pQuad pq; pPoint p0; int i; if ( mesh->ne) fprintf(stdout,"\n Picking result :\n"); pm = &sc->material[refmat]; switch(type) { case LPoint: p0 = &mesh->point[k]; if ( mesh->ne) fprintf(stdout," Vertex %5d : %f, %f, %f ref : %d\n", k,p0->c[0]+mesh->xtra,p0->c[1]+mesh->ytra,p0->c[2]+mesh->ztra,p0->ref); if ( mesh->nbb && mesh->typage == 2 ) infoData(sc,mesh,k,LPoint); break; case LTria: pt = &mesh->tria[k]; fprintf(stdout," Triangle %5d : %d, %d, %d ref : %d [%s]\n", k,pt->v[0],pt->v[1],pt->v[2],pt->ref,pm->name); if ( mesh->nbb && mesh->typage == 1 ) infoData(sc,mesh,k,LTria); for (i=0; i<3; i++) { p0 = &mesh->point[pt->v[i]]; fprintf(stdout," vertex %5d : %f %f %f ref %d\n", pt->v[i],p0->c[0]+mesh->xtra,p0->c[1]+mesh->ytra,p0->c[2]+mesh->ztra,p0->ref); if ( mesh->nbb && mesh->typage == 2 ) infoData(sc,mesh,pt->v[i],LPoint); } break; case LQuad: pq = &mesh->quad[k]; fprintf(stdout," Quad %5d : %d, %d, %d, %d ref : %d [%s]\n", k,pq->v[0],pq->v[1],pq->v[2],pq->v[3],pq->ref,pm->name); if ( mesh->nbb && mesh->typage == 1 ) infoData(sc,mesh,k,LQuad); for (i=0; i<4; i++) { p0 = &mesh->point[pq->v[i]]; fprintf(stdout," vertex %5d : %f %f %f ref %d\n", pq->v[i],p0->c[0]+mesh->xtra,p0->c[1]+mesh->ytra,p0->c[2]+mesh->ztra,p0->ref); if ( mesh->nbb && mesh->typage == 2 ) infoData(sc,mesh,pq->v[i],LPoint); } break; case LTets: ptt = &mesh->tetra[k]; fprintf(stdout," Tetra %5d : %d, %d, %d, %d ref : %d [%s]\n", k,ptt->v[0],ptt->v[1],ptt->v[2],ptt->v[3],ptt->ref,pm->name); if ( mesh->nbb && mesh->typage == 1 ) infoData(sc,mesh,k,LTets); for (i=0; i<4; i++) { p0 = &mesh->point[ptt->v[i]]; fprintf(stdout," vertex %5d : %f %f %f ref %d\n", ptt->v[i],p0->c[0]+mesh->xtra,p0->c[1]+mesh->ytra,p0->c[2]+mesh->ztra,p0->ref); if ( mesh->nbb && mesh->typage == 2 ) infoData(sc,mesh,ptt->v[i],LPoint); } break; case LHexa: ph = &mesh->hexa[k]; fprintf(stdout," Hexa %5d : %d, %d, %d, %d, %d, %d, %d, %d ref : %d [%s]\n", k,ph->v[0],ph->v[1],ph->v[2],ph->v[3],ph->v[4],ph->v[5], ph->v[6],ph->v[7],ph->ref,pm->name); if ( mesh->nbb && mesh->typage == 1 ) infoData(sc,mesh,k,LHexa); for (i=0; i<8; i++) { p0 = &mesh->point[ph->v[i]]; fprintf(stdout," vertex %5d : %f %f %f ref %d\n", ph->v[i],p0->c[0]+mesh->xtra,p0->c[1]+mesh->ytra,p0->c[2]+mesh->ztra,p0->ref); if ( mesh->nbb && mesh->typage == 2 ) infoData(sc,mesh,ph->v[i],LPoint); } break; } fflush(stdout); /* add J. Morice 12/2008 */ } static int getColorRange(Color *c,pMesh mesh) { GLubyte mask; GLint rBits,gBits,bBits,aBits; long nbmax; int i,nbits; glGetIntegerv(GL_RED_BITS, &rBits); glGetIntegerv(GL_GREEN_BITS, &gBits); glGetIntegerv(GL_BLUE_BITS, &bBits); glGetIntegerv(GL_ALPHA_BITS, &aBits); nbits = rBits+gBits+bBits+aBits; if ( nbits < 32 ) { nbmax = 2 << (nbits-1); if ( nbmax < mesh->nt+mesh->nq+mesh->ntet+mesh->nhex ) { fprintf(stderr," Sorry. Picking disabled. (%ld,%d)\n",nbmax,mesh->nt+mesh->nq); return(0); } else if ( nbmax < 0.1*(mesh->ntet+mesh->nhex) ) { fprintf(stderr," Sorry. Picking disabled. (%ld,%d)\n",nbmax,mesh->nt+mesh->nq); return(0); } } mask = 0; nbits = nbits - rBits; for (i=0; irMask = mask << nbits; c->rShift = nbits; c->rBits = 8 - rBits; mask = 0; nbits = nbits - gBits; for (i=0; igMask = mask << nbits; c->gShift = nbits; c->gBits = 8 - gBits; mask = 0; nbits = nbits - bBits; for (i=0; ibMask = mask << aBits; c->bShift = nbits; c->bBits = 8 - bBits; mask = 0; for (i=0; iaMask = mask; c->aBits = 8 - aBits; } static void displayPoint(pScene sc,pMesh mesh,Color *c) { pPoint ppt; unsigned int k,kk; glPointSize(5); glBegin(GL_POINTS); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; kk = 2*k+1; glColor4ub((kk & c->rMask) >> c->rShift << c->rBits, (kk & c->gMask) >> c->gShift << c->gBits, (kk & c->bMask) >> c->bShift << c->bBits, (kk & c->aMask) << c->aBits); if ( mesh->dim == 2 ) glVertex2dv(ppt->c); else glVertex3dv(ppt->c); } glEnd(); glPointSize(1); } static void displayTria(pScene sc,pMesh mesh,Color *c) { pTriangle pt; pPoint p0,p1,p2; pMaterial pm; int m; unsigned int k,kk; glBegin(GL_TRIANGLES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( pt->v[0] ) { p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; kk = 2*k+1; glColor4ub((kk & c->rMask) >> c->rShift << c->rBits, (kk & c->gMask) >> c->gShift << c->gBits, (kk & c->bMask) >> c->bShift << c->bBits, (kk & c->aMask) << c->aBits); glVertex3dv(p0->c); glVertex3dv(p1->c); glVertex3dv(p2->c); } k = pt->nxt; } } glEnd(); } static int displayQuad(pScene sc,pMesh mesh,Color *c) { pQuad pq; pPoint p0,p1,p2,p3; pMaterial pm; int k,m,base; unsigned int kk; base = mesh->nt; glBegin(GL_QUADS); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pq = &mesh->quad[k]; if ( pq->v[0] ) { p0 = &mesh->point[pq->v[0]]; p1 = &mesh->point[pq->v[1]]; p2 = &mesh->point[pq->v[2]]; p3 = &mesh->point[pq->v[3]]; kk = base + k; kk = 2*kk + 1; glColor4ub((kk & c->rMask) >> c->rShift << c->rBits, (kk & c->gMask) >> c->gShift << c->gBits, (kk & c->bMask) >> c->bShift << c->bBits, (kk & c->aMask) << c->aBits); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); glVertex3f(p3->c[0],p3->c[1],p3->c[2]); } k = pq->nxt; } } glEnd(); } static int displayTets(pScene sc,pMesh mesh,Color *c) { pTetra ptt; pPoint p0,p1,p2; pMaterial pm; pClip clip; int k,l,m,base; unsigned int kk; clip = sc->clip; base = mesh->nt + mesh->nq; glBegin(GL_TRIANGLES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; while ( k != 0 ) { ptt = &mesh->tetra[k]; if ( ptt->v[0] ) { if ( (clip->active & C_ON && ptt->clip) || !(clip->active & C_ON) ) { kk = base + k; kk = 2*kk + 1; for (l=0; l<4; l++) { p0 = &mesh->point[ptt->v[ct[l][0]]]; p1 = &mesh->point[ptt->v[ct[l][1]]]; p2 = &mesh->point[ptt->v[ct[l][2]]]; glColor4ub((kk & c->rMask) >> c->rShift << c->rBits, (kk & c->gMask) >> c->gShift << c->gBits, (kk & c->bMask) >> c->bShift << c->bBits, (kk & c->aMask) << c->aBits); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); } } } k = ptt->nxt; } } glEnd(); } static int displayHexa(pScene sc,pMesh mesh,Color *c) { pHexa ph; pPoint p0,p1,p2,p3; pMaterial pm; pClip clip; int k,l,m,base; unsigned int kk; clip = sc->clip; base = mesh->nt + mesh->nq + mesh->ntet; glBegin(GL_QUADS); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LHexa]; if ( !k || pm->flag ) continue; while ( k != 0 ) { ph = &mesh->hexa[k]; if ( ph->v[0] ) { if ( (clip->active & C_ON && ph->clip) || !(clip->active & C_ON) ) { kk = base + k; kk = 2*kk + 1; for (l=0; l<6; l++) { p0 = &mesh->point[ph->v[ch[l][0]]]; p1 = &mesh->point[ph->v[ch[l][1]]]; p2 = &mesh->point[ph->v[ch[l][2]]]; p3 = &mesh->point[ph->v[ch[l][3]]]; glColor4ub((kk & c->rMask) >> c->rShift << c->rBits, (kk & c->gMask) >> c->gShift << c->gBits, (kk & c->bMask) >> c->bShift << c->bBits, (kk & c->aMask) << c->aBits); glVertex3f(p0->c[0],p0->c[1],p0->c[2]); glVertex3f(p1->c[0],p1->c[1],p1->c[2]); glVertex3f(p2->c[0],p2->c[1],p2->c[2]); glVertex3f(p3->c[0],p3->c[1],p3->c[2]); } } } k = ph->nxt; } } glEnd(); } void drawModelSimple(pScene sc,pMesh mesh,Color *c) { glDisable(GL_BLEND); glDisable(GL_LIGHTING); glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); if ( sc->clip->active & C_ON ) { glClipPlane(GL_CLIP_PLANE0,sc->clip->eqn); glEnable(GL_CLIP_PLANE0); if ( mesh->nt ) displayTria(sc,mesh,c); if ( mesh->nq ) displayQuad(sc,mesh,c); glDisable(GL_CLIP_PLANE0); if ( sc->clip->active & C_VOL ) { if ( mesh->ntet ) displayTets(sc,mesh,c); if ( mesh->nhex ) displayHexa(sc,mesh,c); } } else { if ( mesh->nt ) displayTria(sc,mesh,c); if ( mesh->nq ) displayQuad(sc,mesh,c); if ( mesh->dim == 3 ) { if ( !mesh->nt ) displayTets(sc,mesh,c); if ( !mesh->nq ) displayHexa(sc,mesh,c); } } if ( !mesh->ne ) displayPoint(sc,mesh,c); glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); } static int closestPoint(pScene sc,pMesh mesh,int x,int y,int item,int type) { pTriangle pt; pQuad pq; pTetra pte; pHexa ph; pPoint ppt; GLdouble projmat[16],winx,winy,winz,matrix[16]; GLint viewport[4]; double dd,dmin; int i,id; glGetDoublev(GL_PROJECTION_MATRIX,projmat); glGetIntegerv(GL_VIEWPORT,viewport); glGetDoublev(GL_MODELVIEW_MATRIX,matrix); y = viewport[3] - y; id = -1; dmin = 1.e20; switch(type) { case LTria: pt = &mesh->tria[item]; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; gluProject(ppt->c[0],ppt->c[1],ppt->c[2], matrix,projmat,viewport, &winx,&winy,&winz); dd = (winx - x)*(winx - x) + (winy - y)*(winy - y); if ( dd < dmin ) { dmin = dd; id = i; } } return(pt->v[id]); case LQuad: pq = &mesh->quad[item]; for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; gluProject(ppt->c[0]-sc->cx,ppt->c[1]-sc->cy,ppt->c[2]-sc->cz, matrix,projmat,viewport, &winx,&winy,&winz); dd = (winx - x)*(winx - x) + (winy - y)*(winy - y); if ( dd < dmin ) { dmin = dd; id = i; } } return(pq->v[id]); case LTets: pte = &mesh->tetra[item]; for (i=0; i<4; i++) { ppt = &mesh->point[pte->v[i]]; gluProject(ppt->c[0]-sc->cx,ppt->c[1]-sc->cy,ppt->c[2]-sc->cz, matrix,projmat,viewport, &winx,&winy,&winz); dd = (winx - x)*(winx - x) + (winy - y)*(winy - y); if ( dd < dmin ) { dmin = dd; id = i; } } return(pte->v[id]); case LHexa: ph = &mesh->hexa[item]; for (i=0; i<8; i++) { ppt = &mesh->point[ph->v[i]]; gluProject(ppt->c[0]-sc->cx,ppt->c[1]-sc->cy,ppt->c[2]-sc->cz, matrix,projmat,viewport, &winx,&winy,&winz); dd = (winx - x)*(winx - x) + (winy - y)*(winy - y); if ( dd < dmin ) { dmin = dd; id = i; } } return(ph->v[id]); } return(0); } GLuint pickingScene(pScene sc,int x,int y,int ident) { pMesh mesh; pClip clip; GLint viewport[4]; GLubyte pixel[4]; GLuint dlist; Color c; int k; unsigned int item; dlist = 0; refitem = 0; refmat = -1; mesh = cv.mesh[sc->idmesh]; clip = sc->clip; if ( !getColorRange(&c,mesh) ) return(dlist); glGetIntegerv(GL_VIEWPORT,viewport); glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-sc->persp->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glMultMatrixf(sc->view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); drawModelSimple(sc,mesh,&c); glFlush(); /* process color */ glReadBuffer(GL_BACK_LEFT); glReadPixels(x,viewport[3]-y,1,1, GL_RGBA,GL_UNSIGNED_BYTE,(void *)pixel); glDrawBuffer(GL_BACK_LEFT); if ( ddebug ) printf("pixel %d %d %d %d\n",pixel[0],pixel[1],pixel[2],pixel[3]); item = pixel[0] >> c.rBits << c.rShift & c.rMask; item += pixel[1] >> c.gBits << c.gShift & c.gMask; item += pixel[2] >> c.bBits << c.bShift & c.bMask; item += pixel[3] >> c.aBits & c.aMask; item /= 2; if ( !item ) return(dlist); if ( ddebug ) printf("item %d\n",item); if ( !mesh->ne ) { if ( item <= mesh->np ) { refitem = item; reftype = LPoint; } } else if ( item <= mesh->nt ) { refitem = item; reftype = LTria; } else if ( item <= mesh->nt+mesh->nq ) { refitem = item - mesh->nt; reftype = LQuad; } else if ( item <= mesh->nt+mesh->nq+mesh->ntet ) { refitem = item - (mesh->nt+mesh->nq); reftype = LTets; } else if ( item <= mesh->nt+mesh->nq+mesh->ntet+mesh->nhex ) { refitem = item - (mesh->nt+mesh->nq+mesh->ntet); reftype = LHexa; } /* peculiar case: vertex */ if ( refitem > 0 && ident == LPoint ) { if ( mesh->ne ) { refitem = closestPoint(sc,mesh,x,y,refitem,reftype); reftype = LPoint; } } if ( refitem > 0 ) { dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); switch(reftype) { case LPoint: if ( refitem <= mesh->np && !mesh->ne ) { for (k=1; k<=mesh->np; k++) { /*drawPoint(sc,mesh,k);*/ infoEntity(sc,mesh,k,LPoint); } } else { drawPoint(sc,mesh,refitem); infoEntity(sc,mesh,refitem,LPoint); } break; case LTria: drawTria(sc,mesh,refitem); infoEntity(sc,mesh,refitem,LTria); break; case LQuad: drawQuad(sc,mesh,refitem); infoEntity(sc,mesh,refitem,LQuad); break; case LTets: drawTets(sc,mesh,refitem); infoEntity(sc,mesh,refitem,LTets); break; case LHexa: drawHexa(sc,mesh,refitem); infoEntity(sc,mesh,refitem,LHexa); break; } glEndList(); return(dlist); } else refmat = -1; return(dlist); } GLuint pickItem(pMesh mesh,pScene sc,int numit) { pMaterial pm; pPoint ppt; GLuint dlist; int nm; /* default */ if ( ddebug ) printf("create pickitem list\n"); dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); if ( numit <= mesh->np && mesh->ne ) { ppt = &mesh->point[numit]; pm = &sc->material[DEFAULT_MAT]; if ( ppt->tag != M_UNUSED ) { if ( ppt->ref ) { nm = matRef(sc,ppt->ref); /*nm = 1+(ppt->ref-1) % (sc->par.nbmat-1);*/ pm = &sc->material[nm]; } glPointSize(3.0); glColor3f(pm->dif[0],pm->dif[1],pm->dif[2]); output3(ppt->c[0],ppt->c[1],ppt->c[2],"%d",numit); } } if ( numit <= mesh->nt ) drawTria(sc,mesh,numit); if ( numit <= mesh->nq ) drawQuad(sc,mesh,numit); if ( numit <= mesh->ntet ) drawTets(sc,mesh,numit); if ( numit <= mesh->nhex ) drawHexa(sc,mesh,numit); glEndList(); return(dlist); } freefem++-3.38-1/src/medit/psfile.c000644 000767 000024 00000015014 11406142256 017125 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include #include #ifndef ubyte typedef unsigned char ubyte; #endif #define CM2IN 0.3937 void writeEPSheader(FILE *out,char *data,char key,int ww,int hh,float cm,float dpi) { int wpad; fprintf(out,"%%!PS-Adobe-2.0 EPSF-2.0\n"); fprintf(out,"%%LanguageLevel: 1\n"); fprintf(out,"%%%%Title: %s\n",data); fprintf(out,"%%%%Creator: medit - (C) INRIA-Rocquencourt, 1999-2001\n"); fprintf(out,"%%%%BoundingBox: 50 50 %d %d\n", (int)(ww*72./dpi+50.5),(int)(hh*72.0/dpi+50.5)); fprintf(out,"%%%%Pages: (atend)\n"); fprintf(out,"%%DocumentFonts:\n"); fprintf(out,"%%%%EndComments\n"); fprintf(out,"%%%%EndProlog\n"); fprintf(out,"\n%%%%Page: 1 1\n"); fprintf(out,"\n%% remember original state\n"); fprintf(out,"/origstate save def\n"); fprintf(out,"\n%% build a temporary dictionary\n"); fprintf(out,"20 dict begin\n"); fprintf(out,"\n%% define space for color conversions\n"); fprintf(out,"/grays %d string def %% space for gray scale line\n",ww); fprintf(out,"/npixls 0 def\n"); fprintf(out,"/rgbindx 0 def\n"); fprintf(out,"\n%% lower left corner\n"); fprintf(out,"50 50 translate\n"); fprintf(out,"\n%% size of image (on paper, in 1/72inch coords)\n"); fprintf(out,"%g %g scale\n",72.0*CM2IN*cm,72.0*CM2IN*cm*(float)hh/ww); fprintf(out,"\n%% define string to hold a scanline's worth of data\n"); /* write BW image */ if ( key == 'B') { wpad = (ww+7) & ~7; fprintf(out,"/pix %d string def\n",wpad/8); fprintf(out,"\n%% dimensions of data\n"); fprintf(out,"%d %d 1\n",ww,hh); fprintf(out,"\n%% mapping matrix\n"); fprintf(out,"[%d 0 0 %d 0 %d]\n",ww,-hh,hh); fprintf(out,"\n{currentfile pix readhexstring pop}\n"); fprintf(out,"image\n"); } /* write greyscale image */ else if ( key == 'G' ) { fprintf(out,"/pix %d string def\n",ww); fprintf(out,"\n%% dimensions of data\n"); fprintf(out,"%d %d 8\n",ww,hh); fprintf(out,"\n%% mapping matrix\n"); fprintf(out,"[%d 0 0 %d 0 %d]\n",ww,-hh,hh); fprintf(out,"\n{currentfile pix readhexstring pop}\n"); fprintf(out,"image\n"); } /* color image */ else if ( key == 'C' ) { fprintf(out,"/pix %d string def\n",3*ww); fprintf(out,"\n%% dimensions of data\n"); fprintf(out,"%d %d 8\n",ww,hh); fprintf(out,"\n%% mapping matrix\n"); fprintf(out,"[%d 0 0 %d 0 %d]\n",ww,-hh,hh); fprintf(out,"\n%% define 'colorimage' if it isn't defined\n"); fprintf(out,"/colorimage where %% do we know about 'colorimage'?\n"); fprintf(out," { pop } %% yes: pop off the 'dict' returned\n"); fprintf(out," { %% no: define one\n"); fprintf(out," /colortogray { %% define an RGB->I function\n"); fprintf(out," /rgbdata exch store %% call input 'rgbdata'\n"); fprintf(out," rgbdata length 3 idiv\n"); fprintf(out," /npixls exch store\n"); fprintf(out," /rgbindx 0 store\n"); fprintf(out," 0 1 npixls 1 sub {\n"); fprintf(out," grays exch\n"); fprintf(out," rgbdata rgbindx get 20 mul %% Red\n"); fprintf(out," rgbdata rgbindx 1 add get 32 mul %% Green\n"); fprintf(out," rgbdata rgbindx 2 add get 12 mul %% Blue\n"); fprintf(out," add add 64 idiv %% I = .5G + .31R + .18B\n"); fprintf(out," put\n"); fprintf(out," /rgbindx rgbindx 3 add store\n"); fprintf(out," } for\n"); fprintf(out," grays 0 npixls getinterval\n"); fprintf(out," } bind def\n"); fprintf(out,"\n %% Utility procedure for colorimage operator.\n"); fprintf(out," %% This procedure takes two procedures off the\n"); fprintf(out," %% stack and merges them into a single procedure.\n"); fprintf(out,"\n /mergeprocs { %% def\n"); fprintf(out," dup length\n"); fprintf(out," 3 -1 roll\n"); fprintf(out," dup\n"); fprintf(out," length\n"); fprintf(out," dup\n"); fprintf(out," 5 1 roll\n"); fprintf(out," 3 -1 roll\n"); fprintf(out," add\n"); fprintf(out," array cvx\n"); fprintf(out," dup\n"); fprintf(out," 3 -1 roll\n"); fprintf(out," 0 exch\n"); fprintf(out," putinterval\n"); fprintf(out," dup\n"); fprintf(out," 4 2 roll\n"); fprintf(out," putinterval\n"); fprintf(out," } bind def\n"); fprintf(out," /colorimage { %% def\n"); fprintf(out," pop pop %% remove 'false 3' operands\n"); fprintf(out," {colortogray} mergeprocs\n"); fprintf(out," image\n"); fprintf(out," } bind def\n"); fprintf(out," } ifelse %% end of 'false' case\n"); fprintf(out,"\n{currentfile pix readhexstring pop}\n"); fprintf(out,"false 3 colorimage\n\n"); } } void writeEPStrailer(FILE *out) { fprintf(out,"\nshowpage\n"); fprintf(out,"\n%% stop using temporary dictionary\n"); fprintf(out,"end\n"); fprintf(out,"\n%% restore original state\n"); fprintf(out,"origstate restore\n"); fprintf(out,"\n%%%%Trailer\n"); } void writeEPSRow(FILE *out,char key,ubyte *buffer,int size,ubyte bckbyt) { int c,k,l; ubyte byte,bbyte; l = 0; switch (key) { case 'B': /* black & white */ byte = 0x0; c = 0; for (k=0; k<3*size; k+=3) { bbyte = (ubyte)(0.30*buffer[k] + 0.59*buffer[k+1] + 0.11*buffer[k+2] + 0.5); if ( bbyte == bckbyt ) byte |= (1 << (7-c)); /* if ( bbyte > 253 ) byte |= (1 << (7-c)); if ( bbyte && bbyte != 255 ) { printf("buffer %d %d %d\n",buffer[k],buffer[k+1],buffer[k+2]); printf("bbyte %d byte %d\n",bbyte,byte); exit(1); } */ if ( ++c == 8 ) { fprintf(out,"%.2x",byte); if ( ++l == 36 ) { fprintf(out,"\n"); l = 0; } byte = 0x0; c = 0; } } /* padding */ if ( c ) { for (l=8; l>c; l--) byte |= (1 << l); fprintf(out,"%.2x",byte); } break; case 'G': /* greyscale */ for (k=0; k<3*size; k+=3) { byte = (ubyte)(0.30*buffer[k] + 0.59*buffer[k+1] + 0.11*buffer[k+2]); fprintf(out,"%.2x",byte); if ( ++l == 36 ) { fprintf(out,"\n"); l = 0; } } break; case 'C': /* color scale */ for (k=0; k<3*size; k++) { fprintf(out,"%.2x",buffer[k]); if ( ++l == 36 ) { fprintf(out,"\n"); l = 0; } } break; } fprintf(out,"\n"); } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/scene.c000644 000767 000024 00000056450 11406142256 016751 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" extern GLboolean hasStereo; extern int *pilmat,ipilmat,refmat,reftype,refitem; extern short schw,schh; extern ubyte quiet,fullscreen,tiling,stereoMode; /* return current active scene */ int currentScene() { int k,idw; idw = glutGetWindow(); for (k=0; kidwin ) return(k); } return(0); } /* check for OpenGL error */ void checkErrors(void) { GLenum error; while ( (error = glGetError()) != GL_NO_ERROR ) { fprintf(stderr," ## ERROR: %d: %s\n", (int)error,(char*)gluErrorString(error)); exit(1); } } void farclip(GLboolean b) { pScene sc; pPersp p; pCamera c; float look[3],ratio,units; int idw = currentScene(); static GLfloat up[3] = { 0.0, 1.0, 0.0}; /* default */ sc = cv.scene[idw]; p = sc->persp; c = sc->camera; ratio = (GLfloat)sc->par.xs / sc->par.ys; glMatrixMode(GL_PROJECTION); glLoadIdentity(); switch (p->pmode) { case ORTHO: glOrtho(-1.,1.,-1.,0.1,0.01,0.01); break; case PERSPECTIVE: if ( b ) gluPerspective(p->fovy,ratio,sc->dmax,4.0*sc->dmax); else gluPerspective(p->fovy,ratio,0.01,10000.0*sc->dmax); units = 1.e-02; glPolygonOffset(1.0, units); break; case CAMERA: gluPerspective(p->fovy,ratio,0.001*sc->dmax,4.0*sc->dmax); look[0] = c->eye[0] + 0.001*sc->dmax*c->speed[0]; look[1] = c->eye[1] + 0.001*sc->dmax*c->speed[1]; look[2] = c->eye[2] + 0.001*sc->dmax*c->speed[2]; gluLookAt(c->eye[0],c->eye[1],c->eye[2], look[0],look[1],look[2], up[0],up[1],up[2]); break; } /* zoom transformation */ if ( p->rubber == 2 ) { glPushMatrix(); glLoadIdentity(); glRotatef(-p->gamma,1.,0.,0.); glRotatef(p->alpha,0.,1.,0.); glMultMatrixf(p->matrix); glGetFloatv(GL_PROJECTION_MATRIX,p->matrix); glPopMatrix(); p->rubber = 0; } /* apply transformation */ glMultMatrixf(p->matrix); glMatrixMode(GL_MODELVIEW); } void reshapeScene(int width,int height) { pScene sc; if ( ddebug ) printf("reshape scene\n"); sc = cv.scene[currentScene()]; sc->par.xs = width; sc->par.ys = height; glViewport(0,0,width,height); farclip(GL_TRUE); } static void drawList(pScene sc,int clip,int map) { pMesh mesh = cv.mesh[sc->idmesh]; ubyte elev = sc->mode & S_ALTITUDE; if ( ddebug ) printf("drawList %p %d %d\n",sc,clip,map); if ( mesh->dim == 2 && !elev ) glDisable(GL_DEPTH_TEST); glLineWidth(1.0); if ( clip ) { if ( map ) { if ( sc->cmlist[LTets] ) glCallList(sc->cmlist[LTets]); if ( sc->cmlist[LHexa] ) glCallList(sc->cmlist[LHexa]); } else { if ( sc->clist[LTets] ) glCallList(sc->clist[LTets]); if ( sc->clist[LHexa] ) glCallList(sc->clist[LHexa]); } } else if ( map ) { if ( mesh->nt+mesh->nq ) { if ( sc->mlist[LTria] ) glCallList(sc->mlist[LTria]); if ( sc->mlist[LQuad] ) glCallList(sc->mlist[LQuad]); } else { if ( sc->mlist[LTets] ) glCallList(sc->mlist[LTets]); if ( sc->mlist[LHexa] ) glCallList(sc->mlist[LHexa]); } } else { if ( mesh->nt+mesh->nq ) { if ( sc->dlist[LTria] ) glCallList(sc->dlist[LTria]); if ( sc->dlist[LQuad] ) glCallList(sc->dlist[LQuad]); } else { if ( sc->dlist[LTets] ) glCallList(sc->dlist[LTets]); if ( sc->dlist[LHexa] ) glCallList(sc->dlist[LHexa]); } } if ( mesh->dim == 2 && !elev ) glEnable(GL_DEPTH_TEST); } #ifdef ppc void bogusQuad(pScene sc) { /* bogus polygon (nvidia) */ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(1.0); glColor3fv(sc->par.back); glBegin(GL_QUADS); glVertex3f(0., 0.,-sc->persp->depth); glVertex3f(0., 0.,-sc->persp->depth); glVertex3f(0., 0.,-sc->persp->depth); glVertex3f(0., 0.,-sc->persp->depth); glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); } #endif static void displayScene(pScene sc,int mode,int clip) { int map; map = mode & S_MAP; switch(mode) { case FILL: /* solid fill */ if ( ddebug ) printf("solid fill\n"); glEnable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glDisable(GL_POLYGON_OFFSET_FILL); drawList(sc,clip,0); glDisable(GL_LIGHTING); break; case WIRE: /* basic wireframe */ case WIRE+S_MATERIAL: if ( ddebug ) printf("wireframe\n"); #ifdef ppc bogusQuad(sc); #endif glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor4fv(sc->par.line); glDisable(GL_POLYGON_OFFSET_FILL); drawList(sc,clip,0); break; case DEPTH: /* depth wireframe */ case DEPTH + S_MATERIAL: if ( ddebug ) printf("depth wireframe\n"); glEnable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glDisable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); drawList(sc,clip,0); glDisable(GL_LIGHTING); break; case HIDDEN: /* hidden lines removal */ case HIDDEN + S_MATERIAL: if ( ddebug ) printf("hidden lines\n"); glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glColor3fv(sc->par.back); drawList(sc,clip,0); glDisable(GL_POLYGON_OFFSET_FILL); #ifdef ppc bogusQuad(sc); #endif glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor4fv(sc->par.line); drawList(sc,clip,0); break; case SHADED: /* shaded polygons */ case SHADED+S_MATERIAL: if ( ddebug ) printf("shaded polygons\n"); glEnable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glEnable(GL_POLYGON_OFFSET_FILL); drawList(sc,clip,0); glDisable(GL_LIGHTING); glDisable(GL_POLYGON_OFFSET_FILL); #ifdef ppc bogusQuad(sc); #endif glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor4fv(sc->par.line); drawList(sc,clip,0); break; case SIZEMAP: /* display metric map */ case SIZEMAP+S_MATERIAL: if ( ddebug ) printf("display sizemap\n"); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); drawList(sc,clip,map); glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glDisable(GL_POLYGON_OFFSET_FILL); #ifdef ppc bogusQuad(sc); #endif glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor4fv(sc->par.line); glLineWidth(1.0); drawList(sc,clip,0); if ( sc->mode & S_ALTITUDE ) { glColor4fv(sc->par.line); if ( sc->mlist[LTets] ) glCallList(sc->mlist[LTets]); if ( sc->mlist[LHexa] ) glCallList(sc->mlist[LHexa]); } break; default: /* other modes */ if ( ddebug ) printf("rendering mode %d\n",sc->mode); /* interior */ if ( sc->mode & S_FILL ) { if ( sc->mode & S_COLOR ) glEnable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glEnable(GL_POLYGON_OFFSET_FILL); if ( sc->mode & S_MAP ) { glEnable(GL_COLOR_MATERIAL); drawList(sc,clip,map); glDisable(GL_COLOR_MATERIAL); } else { glColor4fv(sc->par.back); drawList(sc,clip,0); } } /* boundary */ glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glDisable(GL_POLYGON_OFFSET_FILL); #ifdef ppc bogusQuad(sc); #endif glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); if ( !(sc->mode & S_BDRY) ) break; if ( sc->mode & S_COLOR && !(sc->mode & S_FILL) ) { glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); } if ( sc->mode & S_MAP) { if ( sc->mode & S_FILL ) { glColor4fv(sc->par.line); drawList(sc,clip,0); } else drawList(sc,clip,map); } else if ( sc->mode & S_ALTITUDE ) { glColor4fv(sc->par.line); drawList(sc,clip,map); if ( sc->mlist[LTets] ) glCallList(sc->mlist[LTets]); if ( sc->mlist[LHexa] ) glCallList(sc->mlist[LHexa]); } else { glColor4fv(sc->par.line); drawList(sc,clip,0); } } } static void displayData(pScene sc,pMesh mesh) { int kk; glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); /* iso-lines */ if ( sc->isotyp & S_ISOLINE ) { glLineWidth(1.0); if ( sc->ilist[LTria] ) glCallList(sc->ilist[LTria]); if ( sc->ilist[LQuad] ) glCallList(sc->ilist[LQuad]); glDisable(GL_CLIP_PLANE0); if ( sc->ilist[LTets] && sc->clip->active & C_ON ) glCallList(sc->ilist[LTets]); } /* vector field */ if ( sc->isotyp & S_VECTOR ) { if ( mesh->dim == 2 ) { if ( sc->vlist[LTria] ) glCallList(sc->vlist[LTria]); if ( sc->vlist[LQuad] ) glCallList(sc->vlist[LQuad]); } else { if ( sc->clip->active & C_ON ) { glDisable(GL_CLIP_PLANE0); if ( sc->vlist[LTets] ) glCallList(sc->vlist[LTets]); if ( sc->vlist[LHexa] ) glCallList(sc->vlist[LHexa]); } else if (mesh->ntet+mesh->nhex == 0 ) if ( sc->vlist[LTria] ) glCallList(sc->vlist[LTria]); } } /* streamlines */ if ( sc->isotyp & S_CRITP && sc->cplist ) glCallList(sc->cplist); if ( sc->isotyp & S_STREAML ) { for (kk=0; kkstream->nbstl; kk++) glCallList(sc->slist[kk]); } else if ( sc->isotyp & S_PARTICLE ) { glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); displayParticle(sc,mesh); glDisable(GL_COLOR_MATERIAL); } /* iso-surfaces */ if ( sc->isotyp & S_ISOSURF ) { glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); if ( sc->ilist[LTets] ) glCallList(sc->ilist[LTets]); if ( sc->ilist[LHexa] ) glCallList(sc->ilist[LHexa]); glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); } } void setupView(pScene sc) { pScene slave; pMesh mesh; pTransform view; pPersp p; pCamera c; int clvol; /* default */ if ( ddebug ) fprintf(stdout,"setupView\n"); mesh = cv.mesh[sc->idmesh]; view = sc->view; p = sc->persp; c = sc->camera; /* init transformation matrix */ if ( sc->type & S_RESET ) { glPushMatrix(); glLoadIdentity(); if ( p->pmode != CAMERA ) { if ( mesh->dim == 3 || sc->mode & S_ALTITUDE ) { glRotatef(-60.,1.,0.,0.); glRotatef(-120.,0.,0.,1.); } } else { if ( c->vecup == X_AXIS ) glRotatef(90.0,0.0,0.0,1.0); else if ( c->vecup == Z_AXIS ) glRotatef(-90.0,1.0,0.0,0.0); } glGetFloatv(GL_MODELVIEW_MATRIX,view->matrix); glPopMatrix(); sc->type ^= S_RESET; } /* keep old transformation */ memcpy(view->oldmat,view->matrix,16*sizeof(float)); /* compute new transformation */ glPushMatrix(); glLoadIdentity(); if ( p->pmode != CAMERA ) { glTranslatef(view->panx,view->pany,0.0); if ( mesh->dim == 3 || sc->mode & S_ALTITUDE ) glRotatef(view->angle,view->axis[0],view->axis[1],view->axis[2]); glTranslatef(-view->opanx,-view->opany,0.); glMultMatrixf(view->matrix); glGetFloatv(GL_MODELVIEW_MATRIX,view->matrix); } else if ( animate ) { c->eye[0] += c->spmod*c->speed[0]; c->eye[1] += c->spmod*c->speed[1]; c->eye[2] += c->spmod*c->speed[2]; animateCamera(); reshapeScene(sc->par.xs,sc->par.ys); } glPopMatrix(); /* keep old translation */ view->opanx = view->panx; view->opany = view->pany; /* copy views */ if ( !animate && sc->slave > -1 ) { slave = cv.scene[sc->slave]; memcpy(slave->view,sc->view,sizeof(struct transform)); memcpy(slave->camera,sc->camera,sizeof(struct camera)); slave->view->angle = 0.0f; clvol = slave->clip->active & C_VOL; memcpy(slave->clip,sc->clip,sizeof(struct clip)); if ( clvol ) slave->clip->active |= C_VOL; } } void drawModel(pScene sc) { pMesh mesh; pTransform view; pClip clip; ubyte sstatic; /* default */ mesh = cv.mesh[sc->idmesh]; view = sc->view; clip = sc->clip; if ( ddebug ) printf("\n-- redraw scene %d, mesh %d\n",sc->idwin,sc->idmesh); glDisable(GL_LIGHTING); /* draw clipping plane */ if ( clip->active & C_ON ) { drawClip(sc,clip,mesh,0); glClipPlane(GL_CLIP_PLANE0,clip->eqn); glEnable(GL_CLIP_PLANE0); } else glDisable(GL_CLIP_PLANE0); /* draw object if static scene */ sstatic = view->mstate > 0 && clip->cliptr->mstate > 0; if ( sstatic || sc->type & S_FOLLOW ) { displayScene(sc,sc->mode,0); if ( sc->item & S_NUMP || sc->item & S_NUMF ) listNum(sc,mesh); /* draw normals */ if ( sc->type & S_NORMAL ) { if ( !sc->nlist ) sc->nlist = drawNormals(mesh,sc); glCallList(sc->nlist); } /* draw data */ if ( sstatic ) displayData(sc,mesh); } else if ( !(sc->item & S_BOX) ) drawBox(sc,mesh,0); /* draw ridges, corners, etc. */ if ( (sc->item & S_GEOM) && sc->glist ) { glDisable(GL_LIGHTING); if ( !mesh->ne ) glPointSize(1); else glPointSize(5); glDisable(GL_COLOR_MATERIAL); glCallList(sc->glist); } glDisable(GL_CLIP_PLANE0); if ( clip->active & C_EDIT || sc->item & S_BOX ) drawBox(sc,mesh,0); if ( sc->item & S_AXIS ) drawAxis(sc,mesh->dim); if ( (mesh->dim == 3 || sc->mode & S_ALTITUDE) && sc->item & S_GRID ) drawBase(sc,mesh); if ( sc->cube->active & C_ON ) drawCube(sc,mesh); sstatic |= tiling; if ( sstatic && clip->active & C_ON && clip->active & C_VOL ) displayScene(sc,sc->mode,1); if ( sc->picklist && !(sc->isotyp & S_PARTICLE) ) { glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glDisable(GL_POLYGON_OFFSET_FILL); glCallList(sc->picklist); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); } /* show path, if any */ if ( sc->type & S_PATH && sc->path.tlist ) glCallList(sc->path.tlist); } void redrawMorphing(pScene sc) { pMesh mesh; if ( morphing ) { mesh = cv.mesh[sc->idmesh]; if ( !morphMesh(sc,mesh) ) return; } } /* animate */ void glutIdle(void) { static float timePassed = 0.0; static float timeRedraw = 0.02; /*1.0 / 50.0*/ float clk,timeElaps; clk = clock(); timeElaps = (clk - timePassed) / (float)CLOCKS_PER_SEC; if ( timeElaps >= timeRedraw ) { timePassed = clk; glutPostRedisplay(); } } void streamIdle(void) { pScene sc; pMesh mesh; float elp; clock_t tim; static clock_t timbase= 0; static float maxtim = 0.; sc = cv.scene[currentScene()]; sc->par.cumtim += sc->par.dt; sc->par.advtim = 1; if ( sc->par.cumtim > sc->par.maxtime ) { sc->par.cumtim = 0.0; sc->par.cumpertime = 0.0; saveimg = 0; sc->isotyp &= ~S_PARTICLE; glutIdleFunc(0); printf("\nfin"); } else if ( sc->par.cumpertime >= sc->par.pertime ) { mesh = cv.mesh[sc->idmesh]; sc->par.cumpertime = 0.0; if ( !animParticle(sc,mesh) ) { sc->par.cumtim = 0.0; sc->par.cumpertime = 0.0; saveimg = 0; glutIdleFunc(0); printf("\nfin"); } else glutPostRedisplay(); } else glutPostRedisplay(); return; if ( timbase < 1 ) { timbase = clock(); maxtim = 0.0; sc->par.advtim = 0; glutPostRedisplay(); } else { tim = clock(); elp = (tim - timbase) / (float)CLOCKS_PER_SEC; if ( elp > sc->par.dt ) { timbase = tim; maxtim += elp; sc->par.advtim = 1; if ( maxtim > sc->par.maxtime ) glutIdleFunc(0); } sc->par.cumtim += sc->par.dt; glutPostRedisplay(); } } /* OpenGL callbacks */ void redrawScene() { pScene sc,slave; pTransform view; pPersp p; pCamera c; double ndfl,ratio,top,bottom,left,right,nnear,ffar; sc = cv.scene[currentScene()]; view = sc->view; p = sc->persp; c = sc->camera; if ( stereoMode == MONO || !hasStereo ) { glDrawBuffer(GL_BACK_LEFT); glClearColor(sc->par.back[0],sc->par.back[1], sc->par.back[2],sc->par.back[3]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-p->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glMultMatrixf(view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); drawModel(sc); if ( sc->type & S_DECO ) redrawStatusBar(sc); } else { nnear = -p->depth - 0.5 * sc->dmax; if ( nnear < 0.1 ) nnear = 0.1; ffar = -p->depth + 0.5 * sc->dmax; ratio = sc->par.xs / (double)sc->par.ys; top = nnear * tan(DTOR * 0.5 * p->fovy); ndfl = nnear / p->depth; if ( sc->par.eyesep < 0.0 ) sc->par.eyesep = fabs(p->depth / 20.0); /* left view */ glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); left = -ratio * top + 0.5 * sc->par.eyesep * ndfl; right = ratio * top + 0.5 * sc->par.eyesep * ndfl; bottom= -top; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(left,right,top,bottom,nnear,ffar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(-sc->par.eyesep,0.,-p->depth, sc->par.eyesep/3.0,0.,0., 0.0,1.0,0.0); setupView(sc); glMultMatrixf(view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); drawModel(sc); if ( sc->type & S_DECO ) redrawStatusBar(sc); /* right view */ glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); left = -ratio * top - 0.5 * sc->par.eyesep * ndfl; right = ratio * top - 0.5 * sc->par.eyesep * ndfl; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(left,right,top,bottom,nnear,ffar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(sc->par.eyesep,0.,-p->depth, sc->par.eyesep/3.0,0.,0., 0.0,1.0,0.0); setupView(sc); glMultMatrixf(view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); drawModel(sc); if ( sc->type & S_DECO ) redrawStatusBar(sc); } /* refresh screen */ if ( saveimg && animate ) glFlush(); else glutSwapBuffers(); if ( ddebug ) checkErrors(); if ( saveimg && !(sc->type & S_SCISSOR) ) keyFile('H',0,0); /* redraw linked scene */ if ( !animate && sc->slave > -1 ) { slave = cv.scene[sc->slave]; glutSetWindow(slave->idwin); redrawScene(); } } /* OpenGL callbacks */ void redrawSchnauzer() { pScene sc = cv.scene[currentScene()]; pMesh mesh; char *ptr,data[256]; mesh = cv.mesh[sc->idmesh]; strcpy(data,mesh->name); ptr = (char*)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; ptr = (char*)strstr(data,".gis"); if ( ptr ) *ptr = '\0'; strcat(data,".ppm"); redrawScene(); imgHard(sc,data,'H'); exit(0); } void deleteScene(pScene sc) { /* default */ if ( ddebug) printf("deleteScene\n"); M_free(sc->view); M_free(sc->clip); M_free(sc->persp); M_free(sc->camera); M_free(sc->material); M_free(sc->matsort); M_free(sc); } void initGrafix(pScene sc,pMesh mesh) { GLfloat lightamb[4] = { 0.3, 0.3, 0.3, 1.0 }; GLfloat lightdif[4] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat lightpos[4] = { 0.0, 0.0, 1.0, 0.0 }; if ( ddebug ) printf("initGrafix\n"); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glPolygonOffset(1.0, 1.0 / (float)0x10000); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glShadeModel(GL_SMOOTH); glDisable(GL_NORMALIZE); glDisable(GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH); glDisable(GL_DITHER); glDisable(GL_CULL_FACE); if ( mesh->typ == 2 ) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); } glPixelStorei(GL_UNPACK_ALIGNMENT,1); /* lighting */ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE); #if ( !defined(GL_VERSION_1_1) ) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR); #endif glLightfv(GL_LIGHT0,GL_DIFFUSE,lightdif); glLightfv(GL_LIGHT0,GL_AMBIENT,lightamb); glEnable(GL_LIGHTING); if ( stereoMode != MONO ) { lightpos[2] = -1.0; if ( sc->par.sunpos ) sc->par.sunpos[2] = -fabs(sc->par.sunpos[2]); } if ( sc->par.sunp ) glLightfv(GL_LIGHT0,GL_POSITION,sc->par.sunpos); else glLightfv(GL_LIGHT0,GL_POSITION,lightpos); glEnable(GL_LIGHT0); } /* new scene */ int createScene(pScene sc,int idmesh) { pMesh mesh; char data[128]; /* default */ mesh = cv.mesh[idmesh]; if ( !quiet ) fprintf(stdout," Computing 3D scene\n"); /* set default mode */ sc->idmesh = idmesh; sc->par.xi = sc->par.yi = 10; if ( option == SCHNAUZER ) { sc->par.xs = schw; sc->par.ys = schh; } else { if ( sc->par.xs == 0 ) sc->par.xs = 600; if ( sc->par.ys == 0 ) sc->par.ys = 600; } if ( !sc->mode ) sc->mode = HIDDEN; sc->item = 0; sc->shrink = 1.0; sc->slave = sc->master = -1; sc->picked = 0; if ( mesh->nvn == 0 ) sc->type ^= S_FLAT; if ( mesh->ne == 0 ) sc->item |= S_GEOM; /* compute scene depth */ sc->dmax = sc->dmin= mesh->xmax - mesh->xmin; sc->dmax = max(sc->dmax,mesh->ymax - mesh->ymin); sc->dmin = min(sc->dmin,mesh->ymax - mesh->ymin); if ( mesh->dim == 3 ) { sc->dmax = max(sc->dmax,mesh->zmax - mesh->zmin); sc->dmin = min(sc->dmin,mesh->zmax - mesh->zmin); } sc->dmax = fabs(sc->dmax); sc->dmin = fabs(sc->dmin); if ( !sc->par.sunp ) { sc->par.sunpos[0] *= 2.0*sc->dmax; sc->par.sunpos[1] *= 2.0*sc->dmax; sc->par.sunpos[2] *= 2.0*sc->dmax; } sc->par.sunpos[3] = 1.0; /* create window */ glutInitWindowSize(sc->par.xs,sc->par.ys); sc->idwin = glutCreateWindow(""); assert(sc->idwin != 0); if ( fullscreen ) { glutFullScreen(); sc->par.xs = glutGet(GLUT_SCREEN_WIDTH); sc->par.ys = glutGet(GLUT_SCREEN_HEIGHT); } /* set window name */ sprintf(data,"Medit - [%s] #%d",mesh->name,sc->idwin); glutSetWindowTitle(data); glutSetIconTitle(data); /* required! to change background color */ glClearColor(sc->par.back[0],sc->par.back[1], sc->par.back[2],sc->par.back[3]); /* init perspective */ sc->persp = initPersp(0,sc->dmax); sc->camera = (pCamera)initCamera(sc,Y_AXIS); if ( mesh->typ == 2 ) { sc->persp->pmode = CAMERA; sc->persp->depth *= 0.5; } /* create default view */ sc->view = (pTransform)createTransform(); if ( !sc->view ) return(0); sc->type |= S_RESET + S_DECO; sc->clip = (pClip)createClip(sc,mesh); if ( !sc->clip ) return(0); sc->cube = (pCube)createCube(sc,mesh); if ( !sc->cube ) return(0); /* create menus */ if ( !createMenus(sc,mesh) ) return(0); /* assign callbacks */ if ( sc->type & S_SCISSOR) glutDisplayFunc(scissorScene); else if ( option == SCHNAUZER ) glutDisplayFunc(redrawSchnauzer); else if ( sc->persp->pmode == CAMERA ) { glutMouseFunc(mouseCamera); glutMotionFunc(motionCamera); glutDisplayFunc(redrawScene); } else { glutMouseFunc(mouse); glutMotionFunc(motion); glutDisplayFunc(redrawScene); } glutReshapeFunc(reshapeScene); glutKeyboardFunc(keyScene); glutSpecialFunc(special); glutAttachMenu(GLUT_RIGHT_BUTTON); /* create display lists by geom type */ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); doLists(sc,mesh); sc->glist = geomList(sc,mesh); sc->type |= S_FOLLOW; /* local stack */ if ( !pilmat ) { pilmat = (int*)calloc(sc->par.nbmat+2,sizeof(int)); if ( !pilmat ) return(0); } /* color list */ setupPalette(sc,mesh); sc->stream = NULL; initGrafix(sc,mesh); return(1); } freefem++-3.38-1/src/medit/scissor.c000644 000767 000024 00000005372 11406142256 017336 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" void scissorScene() { pScene sc; pMesh mesh; pPersp p; pTransform view; int width,height; /* default */ if ( ddebug ) printf("enable scissoring\n"); sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; view = sc->view; p = sc->persp; /* subdivide main window */ glViewport(0,0,sc->par.xs,sc->par.ys); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,sc->par.xs,0,sc->par.ys); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(sc->par.back[0],sc->par.back[1],sc->par.back[2],sc->par.back[3]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* split window */ glDisable(GL_LIGHTING); glColor4fv(sc->par.line); glBegin(GL_LINES); glVertex2i(sc->par.xs/2,0); glVertex2i(sc->par.xs/2,sc->par.ys); glVertex2i(0,sc->par.ys/2); glVertex2i(sc->par.xs,sc->par.ys/2); glEnd(); glEnable(GL_LIGHTING); width = (sc->par.xs + 1)/2; height = (sc->par.ys + 1)/2; glDisable(GL_LIGHTING); glColor4fv(sc->par.line); output2(5,sc->par.ys/2+5,"Top"); output2(5,5,"Front"); output2(sc->par.xs/2+5,5,"Right"); glEnable(GL_SCISSOR_TEST); /* draw top right : normal */ glViewport(width,height,width,height); glScissor(width,height,width,height); farclip(1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-p->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glMultMatrixf(view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); drawModel(sc); if ( sc->type & S_DECO ) redrawStatusBar(sc); /* draw top left : top view */ glViewport(0,height,width,height); glScissor(0,height,width,height); farclip(1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-p->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glTranslatef(sc->cx,sc->cy,sc->cz); glRotatef(-90,0.0,0.0,1.0); glTranslatef(view->opanx,0.,0.); drawModel(sc); /* draw bottom left : front */ glViewport(0,0,width,height); glScissor(0,0,width,height); farclip(1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-p->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glTranslatef(sc->cx,sc->cy,sc->cz); glRotatef(-90.0,1.0,0.0,0.0); glTranslatef(view->opanx,0.,0.); drawModel(sc); /* draw bottom right : right */ glViewport(width,0,width,height); glScissor(width,0,width,height); farclip(1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-p->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glRotatef(-90.0,1.0,0.0,0.0); glRotatef(-90.0,0.0,0.0,1.0); glTranslatef(0.,view->opany,0.); drawModel(sc); glutSwapBuffers(); glDisable(GL_SCISSOR_TEST); glViewport(0,0,sc->par.xs,sc->par.ys); if ( saveimg ) keyFile('H',0,0); } freefem++-3.38-1/src/medit/sftcpy.c000644 000767 000024 00000016700 11406142256 017156 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include "medit.h" #include "extern.h" #include "sproto.h" /* OpenGL's GL_3D_COLOR feedback vertex format */ typedef struct Feedback3Dcolor { GLfloat x,y,z; GLfloat r,g,b,a; } Feedback3Dcolor; typedef struct Token { GLfloat depth; GLfloat *ptr; } Token; static int compare(const void *a, const void *b) { Token *p1 = (Token *)a; Token *p2 = (Token *)b; GLfloat diff = p2->depth - p1->depth; if ( diff > 0.0f ) return 1; else if ( diff < 0.0f ) return -1; else return 0; } void headps(FILE *file) { GLfloat color[4],viewport[4]; GLfloat linewidth = 0.1; GLfloat pointsize; glGetFloatv(GL_VIEWPORT,viewport); glGetFloatv(GL_COLOR_CLEAR_VALUE,color); glGetFloatv(GL_LINE_WIDTH,&linewidth); glGetFloatv(GL_POINT_SIZE,&pointsize); /* write EPS header */ fprintf(file,"%%!PS-Adobe-2.0 EPSF-2.0\n"); fprintf(file,"%%LanguageLevel: 1\n"); fprintf(file,"%%%%Creator: Medit (via OpenGL feedback)\n"); fprintf(file,"%%%%Pages: (atend)\n"); fprintf(file,"%%%%BoundingBox: %g %g %g %g\n", viewport[0],viewport[1],viewport[2],viewport[3]); fprintf(file,"%%EndComments\n\n"); /* define macros */ /* fprintf(file,"100 dict begin\n"); */ fprintf(file,"%%%%BeginProlog\n"); fprintf(file,"/sgm {moveto lineto stroke } def\n"); fprintf(file,"/stg {setgray} def\n"); fprintf(file,"/stc {setrgbcolor} def\n"); fprintf(file,"/mt {moveto} def\n"); fprintf(file,"/lt {lineto} def\n"); fprintf(file,"/dc {currentrgbcolor mark} def\n"); fprintf(file,"/fc {stc newpath moveto\n"); fprintf(file," counttomark 2 idiv {lineto} repeat\n"); fprintf(file," closepath fill cleartomark stc} def\n"); fprintf(file,"%%%%EndProlog\n\n"); fprintf(file,"gsave\n\n"); /* set background color */ fprintf(file,"%g %g %g setrgbcolor\n",color[0],color[1],color[2]); fprintf(file,"%g %g %g %g rectfill\n\n", viewport[0],viewport[1],viewport[2],viewport[3]); fprintf(file, "%g setlinewidth\n\n",0.01*linewidth); } void tailps(FILE *file) { /* write EPS tail */ fprintf(file,"\n"); fprintf(file,"%%%%Trailer\n"); fprintf(file,"%%%%Pages: 1\n"); fprintf(file,"grestore\n\n"); fprintf(file,"showpage\n\n"); fclose(file); } int coreps(FILE *file,GLsizei size,GLfloat *buffer) { Token *ttoken; pScene sc; Feedback3Dcolor *v; GLfloat *ptr; int i,k,idw,token,nit,nbv,sorting=TRUE; /* default */ if ( ddebug ) printf("dump EPS file\n"); idw = currentScene(); sc = cv.scene[idw]; /* Count tokens */ nit = 0; ptr = buffer; while ( *ptr && ptr < buffer+size ) { token = (int)*ptr; switch (token) { case GL_LINE_TOKEN: case GL_LINE_RESET_TOKEN: nit++; ptr += 14; break; case GL_POLYGON_TOKEN: nit++; ++ptr; nbv = *ptr; ptr += (7 * nbv); break; case GL_POINT_TOKEN: ptr += 7; break; case GL_BITMAP_TOKEN: puts("BITMAP"); nit++; ++ptr; nbv = *ptr; printf("nbv = %d\n",nbv); break; default: fprintf(stdout," Unrecognized token %d\n",token); break; } ptr++; } if ( ddebug ) printf("size = %d ptr = %p buffer = %p -> size = %d\n", size,ptr,buffer,ptr-buffer); /* allocate mem to store tokens */ if ( ddebug ) printf("%d tokens found\n",nit); ttoken = (Token *)malloc((1+nit)*sizeof(struct Token)); assert(ttoken); /* store tokens */ nit = 0; ptr = buffer; while ( *ptr && ptr < buffer+size ) { ttoken[++nit].ptr = ptr; token = (int)*ptr; ptr++; switch (token) { case GL_LINE_TOKEN: case GL_LINE_RESET_TOKEN: v = (Feedback3Dcolor *)ptr; ttoken[nit].depth = 0.5*(v[0].z+v[1].z); ptr += 14; break; case GL_POLYGON_TOKEN: nbv = *ptr; ptr++; v = (Feedback3Dcolor *)ptr; ttoken[nit].depth = v[0].z; for (k=1; kmode == WIRE || sc->mode == WIRE+S_MATERIAL ) sorting = FALSE; if ( ddebug ) printf("prim = %d size = %d, %d\n",nit,ptr-buffer-1,size); if ( sorting == TRUE ) { if ( ddebug ) printf("start sorting %d tokens...\n",nit); qsort(ttoken+1,nit,sizeof(struct Token),compare); if ( ddebug ) printf("end sorting\n"); } /* write tokens in EPS file */ for (k=1; k<=nit; k++) { ptr = ttoken[k].ptr; if ( *ptr == 0 ) continue; token = *ptr; ptr++; switch(token) { case GL_LINE_RESET_TOKEN: case GL_LINE_TOKEN: v = (Feedback3Dcolor *)ptr; fprintf(file,"%g %g %g stc\n",v[0].r,v[0].g,v[0].b); fprintf(file,"%g %g %g %g sgm\n",v[0].x,v[0].y,v[1].x,v[1].y); ptr += 14; break; case GL_POLYGON_TOKEN: nbv = *ptr; ptr++; v = (Feedback3Dcolor *)ptr; /* draw filled polygon */ if ( sorting == TRUE ) { /* fprintf(file,"1. stg\n"); */ fprintf(file, "dc "); for (i=0; imode & S_BDRY ) { fprintf(file,"0. stg\n"); for (i=0; iname); ptr = (char*)strstr(data,".mesh"); if ( ptr ) *ptr = '\0'; nfree = filnum(data,nfree,"ps"); if ( nfree == -1 ) return(0); /* open PS file */ sprintf(data,"%s.%.3d.ps",data,nfree); file = fopen(data,"w"); if ( !file ) { fprintf(stdout," Unable to open %s\n",data); return(0); } /* size for feedback buffer */ size = 0; nvalues = -1; do { size += 1024*1024; fbbuffer = (GLfloat *)calloc(1+size,sizeof(GLfloat)); if ( !fbbuffer ) { return(0); } if ( ddebug ) printf("feedback pointer = %p\n",fbbuffer); /* draw scene in back buffer */ glFeedbackBuffer(size,GL_3D_COLOR,fbbuffer); (void)glRenderMode(GL_FEEDBACK); /* glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.,0.,-sc->persp->depth, 0.,0.,0., 0.0,1.0,0.0); setupView(sc); glMultMatrixf(sc->view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); */ drawModel(sc); if ( sc->type & S_DECO ) redrawStatusBar(sc); /*drawModel(sc);*/ nvalues = (GLint)glRenderMode(GL_RENDER); if ( nvalues < 0 ) free(fbbuffer); } while ( nvalues < 0 ); if ( nvalues < 1 ) { return(0); } else if ( ddebug ) printf("nvalues = %d size = %d\n",nvalues,size); /* write EPS file */ glutSetCursor(GLUT_CURSOR_WAIT); headps(file); coreps(file,size,fbbuffer); tailps(file); if ( ddebug ) fprintf(stdout,"%s written\n",data); glutSetCursor(GLUT_CURSOR_INHERIT); return(1); } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/sproto.h000644 000767 000024 00000021146 12354532444 017206 0ustar00hechtstaff000000 000000 /* animat.c */ int loadNextMesh(pMesh ,int ,int ); int animat(); int playAnim(pScene ,pMesh ,int ,int ); void glutIdle(void); /* camera.c */ double Azimuth(pCamera ); double Elevation(pCamera ); void updateSun(pScene ,pCamera ); void updateCamera(pScene ,pCamera ,double ,double ); pCamera initCamera(pScene ,int ); /* clip.c */ void updateClip(pClip ,pMesh ); void clipVertices(pMesh ,pScene ,pClip ); void invertClip(pScene sc,pClip ); void drawClip(pScene ,pClip ,pMesh ,GLboolean ); void copyClip(pClip ); int pasteClip(pClip ); void resetClip(pScene ,pClip ,pMesh ); pClip createClip(pScene ,pMesh ); void updateCube(pCube ,pMesh ); pCube createCube(pScene ,pMesh ); /* clipvol.c */ GLuint capTetra(pMesh ); GLuint capTetraMap(pMesh ); GLuint capTetraIso(pMesh ); /* critip.c */ GLuint listCritPoint(pScene ,pMesh ); /* dlists.c */ GLuint listTria(pScene ,pMesh ); GLuint listQuad(pScene ,pMesh ); GLuint listTetra(pScene ,pMesh ,ubyte ); GLuint listHexa(pScene ,pMesh ,ubyte ); /* eigenv.c */ int eigenv(int sym,double mat[6],double lambda[3],double v[3][3]); /* geometry.c */ GLuint geomList(pScene ,pMesh ); /* gisfil.c */ int loadGIS(pMesh ); /* hash.c */ int hashTria(pMesh ); int hashTetra(pMesh ); /* image.c */ PPMimage *loadPPM(const char *imgname,int *type); int savePPM(const char *imgname,pPPMimage img,int typimg); void saveEPS(pScene sc,const char *imgname,pPPMimage pixels); int imgHard(pScene sc,char *data,char key); /* input/output */ int EatLine(FILE *in); int inmsh2(pMesh mesh); int bbfile(pMesh ); int loadMesh(pMesh ); int saveMesh(pScene ,pMesh ,char *,ubyte ); int loadSol(pMesh mesh,char *filename,int numsol); int loadMesh_popen(pMesh); //pour popen /* ilists.c */ GLuint listTriaIso(pScene ,pMesh ); GLuint listQuadIso(pScene ,pMesh ); GLuint listTetraIso(pScene ,pMesh ); /* items.c */ void drawAxis(pScene ,int ); void drawBox(pScene ,pMesh ,int ); void drawCube(pScene ,pMesh ); void drawGrid(pScene ,pMesh ); void rubberBand(pPersp ); void drawBase(pScene ,pMesh ); void drawIso(pScene ); /* keyboard.c */ void specCamera(pScene ,int ); void special(int ,int ,int ); void keyScene(unsigned char ,int ,int ); /* listnum.c */ void updatePoints(pScene sc,pMesh mesh,int refmat); void listNum(pScene sc,pMesh mesh); /* material.c */ void matInit(pScene ); void matSort(pScene ); int matRef(pScene ,int ); void matReshape(int ,int ); void matsubReshape(int ,int ); void matsubDisplay(); void matDisplay(); void matMouse(int ,int ,int ,int ); void matKeyboard(unsigned char ,int ,int ); void matEdit(pScene ); /* medit.c */ int medit0(); int medit1(); /* menus.c */ void doLists(pScene ,pMesh ); void doMapLists(pScene ,pMesh ,int ); void doIsoLists(pScene ,pMesh ,int ); void keyFile(unsigned char ,int ,int ); void menuFile(int ); void keyItem(unsigned char ,int ,int ); void menuItem(int ); void keyAnim(unsigned char ,int ,int ); void menuAnim(int ); void keyTrajet(unsigned char ,int ,int ); void menuTrajet(int ); void keyMode(unsigned char ,int ,int ); void menuMode(int ); void menuScene(int ); void keyView(unsigned char ,int ,int ); void menuView(int ); void keyColor(unsigned char ,int ,int ); void menuColor(int ); void keyClip(unsigned char ,int ,int ); void menuClip(int ); void keyFeature(unsigned char ,int ,int ); void menuFeature(int ); void menuImage(int ); void keyMetric(unsigned char key,int x,int y); int createMenus(pScene ,pMesh ); GLuint pickingScene(pScene sc,int x,int y,int ident); /* mesh.c */ void meshInfo(pMesh ); int meshSurf(pMesh ); void meshCoord(pMesh ,int ); void meshBox(pMesh mesh,int bb); void meshRef(pScene sc,pMesh mesh); int meshUpdate(pScene sc,pMesh mesh); /* mlists.c */ GLuint listTriaMap(pScene ,pMesh ); GLuint listQuadMap(pScene ,pMesh ); GLuint listTetraMap(pScene ,pMesh ,ubyte ); GLuint listHexaMap(pScene ,pMesh ,ubyte ); void cutTriangle(pScene ,triangle ); GLuint alt2dList(pScene ,pMesh ,int ,float ,float ); void setupPalette(pScene ,pMesh ); GLuint drawPalette(pScene ); /* morphing */ int morphMesh(pScene sc,pMesh mesh1); int modeMorphing(); /* mouse.c */ void mouse(int button,int state,int x,int y); void motion(int x,int y); void redrawOverlay(int stretchX,int stretchY); void motionCamera(int x,int y); void mouseCamera(int button,int state,int x,int y); void animateCamera(); /* normal.c */ GLuint drawNormals(pMesh mesh,pScene sc); /* outmsh.c */ int outmsh(pScene ,pMesh ,char *name,ubyte clipon); /* parsar.c */ int parsar(int argc,char *argv[]); /* parsop.c */ int saveMeditFile(char *,pScene ); void iniopt(pScene ,pMesh ); int parsop(pScene ,pMesh ); /* particle.c */ int createParticle(pScene ,pMesh ); /* path.c */ int pathAdd(pScene ,int, int); GLuint pathList(pScene ); int pathLoad(char *data,pScene ); int pathSave(char *file,pScene ); void pathFollow(pScene ); /* persp.c */ void setPersp(pScene ,pPersp ,int ); pPersp initPersp(pPersp ,float ); /* picking.c */ GLuint pickingList(pScene ,int ,int ); GLuint pickingPoint(pScene sc,int x,int y); GLuint pickItem(pMesh ,pScene ,int ); /* prierr.c */ void prierr(int typerr,int indice); /* psfile.c */ void writeEPSheader(FILE *,char *,char ,int ,int ,float ,float); void writeEPStrailer(FILE *); void writeEPSRow(FILE *,char ,ubyte *,int ,ubyte ); /* scene.c */ int currentScene(); void checkErrors(void); void oglerr(GLenum error); void farclip(GLboolean ); void reshapeScene(int width,int height); void setupView(pScene sc); void drawBackTex(pScene sc); void drawModel(pScene sc); void drawScene(pScene ); void redrawScene(); void deleteScene(pScene sc); void initGrafix(pScene sc,pMesh mesh); int createScene(pScene sc,int idmesh); void streamIdle(); /* scissor.c */ void scissorScene(); /* status.c */ void reshapeStatusBar(pScene sc,int width,int height); void redrawStatusBar(pScene sc); void mouseStatus(int button,int state,int x,int y); /* stream.c */ double sizeTetra(pMesh ,int ); double sizeHexa(pMesh ,int ); double sizeTria(pMesh ,int ); int locateTria(pMesh mesh,int nsdep,int base,float *p,double *cb); int locateTetra(pMesh mesh,int nsdep,int base,float *p,double *cb); int inTria(pMesh ,int ,float *,double *); int listTetraStream(pScene ,pMesh ,float *,int ); int listHexaStream(pScene ,pMesh ,float *,int ); int listTriaStream(pScene ,pMesh ,float *); pStream createStream(pScene ,pMesh ); int streamRefTria(pScene sc,pMesh mesh); int streamRefQuad(pScene sc,pMesh mesh); int streamRefPoint(pScene sc,pMesh mesh); int listSaddleStream(pScene sc,pMesh mesh,int depart, float *pp,float *vv,double lambda); int nxtPoint3D(pMesh mesh,int nsdep,float *p,float step,double *v); int nxtPoint2D(pMesh mesh,int nsdep,float *p,float step,double *v); double field2DInterp(pMesh mesh,int iel,double *cb,double *v); double vector3DInterp(pMesh mesh,pPoint pt[4],double *cb,double *v); double field3DInterp(pMesh mesh,int iel,double *cb,double *v); double sizeTria(pMesh mesh,int k); double sizeQuad(pMesh mesh,int k); double sizeTetra(pMesh mesh,int k); /* tensor.c */ GLuint listPointVector(pMesh ,ubyte ); /* texture.c */ pPPMimage texDistortion(pPPMimage ); /* tiles.c */ int imgTiling(pScene sc,char *data,char key); /* transform.c */ void resetTransform(pTransform ); pTransform createTransform(); /* util.c */ void setFont(char* name,int size); void drwstr(GLuint x,GLuint y,char* format, ...); void output2(GLfloat x,GLfloat y,char *format,...); void output3(GLfloat x,GLfloat y,GLfloat z,char *format,...); void hsvrgb(double *hsv,double *rgb); void transformPoint(double u[4],float v[4],float m[16]); void transformPointd(double u[4],double v[4],double m[16]); void transformVector(float u[4],float v[4],float m[16]); void multMatrix(GLfloat *p,GLfloat *a,GLfloat *b); void rotateMatrix(GLfloat angle,GLfloat x,GLfloat y,GLfloat z,GLfloat rm[16]); int invertMatrix(float src[16],float inverse[16]); int filnum(char *data,int numdep,char *ext); /* vector.c */ void drawVector2D(float p[2],double u[2],double scal); void drawVector3D(float p[3],double u[3],double scal); GLuint listTria2dVector(pMesh mesh); GLuint listTria3dVector(pMesh mesh); GLuint listClipTetraVector(pMesh mesh); GLuint listClipHexaVector(pMesh mesh); /* view.c */ void copyView(pTransform view,pCamera cam,pPersp persp); int pasteView(pTransform view,pCamera cam,pPersp persp); int linkView(pScene sc1); void unlinkView(pScene sc1); /* zaldy.c */ int zaldy1(pMesh mesh); int zaldy2(pMesh mesh); freefem++-3.38-1/src/medit/status.c000644 000767 000024 00000011144 11406142256 017166 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include "medit.h" #include "extern.h" #include "sproto.h" extern void drawHUD(pScene ); extern int refmat,imstep; void initTexture(void) { PPMimage *imgtex; int typimg; ubyte iquiet; GLuint texname; iquiet = quiet; quiet = 1; imgtex = loadPPM("Lions.ppm",&typimg); quiet = iquiet; if ( !imgtex ) return; glPixelStorei(GL_UNPACK_ALIGNMENT,1); glGenTextures(1,&texname); glBindTexture(GL_TEXTURE_2D,texname); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,imgtex->sizeX,imgtex->sizeY, 0,GL_RGB,GL_UNSIGNED_BYTE,imgtex->data); free(imgtex); } void backTexture(pScene sc) { glEnable(GL_TEXTURE_2D); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPushAttrib(GL_ENABLE_BIT); glEnable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0,0.0); glTexCoord2f(sc->par.xs,0.0); glVertex2f(sc->par.xs,0.0); glTexCoord2f(sc->par.xs,sc->par.ys); glVertex2f(sc->par.xs,sc->par.ys); glTexCoord2f(0.0,sc->par.ys); glVertex2f(0.0,sc->par.ys); glEnd(); glPopAttrib(); glDisable(GL_TEXTURE_2D); } void redrawStatusBar(pScene sc) { pClip clip = sc->clip; pMesh mesh = cv.mesh[sc->idmesh]; double dd; char buf[128]; float frame,elpms; static float fps=0.0,lastfr = 0.0; static int nfr = 0,pps = 0; if ( sc->par.xs < 100 ) return; if ( ddebug ) fprintf(stdout,"redrawStatusBar\n"); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(1.,sc->par.xs,1.,sc->par.ys); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); /* other info */ glColor3f(1.0-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]); if ( animate && !(sc->isotyp & S_PARTICLE) ) { nfr++; frame = glutGet(GLUT_ELAPSED_TIME) / 1000.0f; elpms = frame - lastfr; if ( elpms > 0.999 ) { fps = nfr / elpms; if ( mesh->nt+mesh->nq ) pps = fps * (mesh->nt+mesh->nq); else if (mesh->ntet+mesh->nhex ) pps = fps * (mesh->ntet+mesh->nhex); else pps = fps * mesh->np; nfr = 0; lastfr = frame; } output2(15,8,"Fps: %6.2f Pps: %8d",fps,pps); } if ( option == MORPHING ) output2(15,28,"%d",abs(imstep)); if ( sc->isotyp & S_STREAML && sc->par.maxtime < FLT_MAX ) output2(15,8,"t= %8.3f",sc->par.cumtim); else if ( sc->isotyp & S_PARTICLE ) output2(15,8,"t= %8.3f",sc->par.cumtim); /* clip eqn */ if ( clip->active & C_ON && !(clip->active & C_HIDE) ) { sprintf(buf,"Eqn: "); if ( fabs(clip->eqn[0]) > EPS ) sprintf(buf,"%s %+.2gx",buf,clip->eqn[0]); if ( fabs(clip->eqn[1]) > EPS ) sprintf(buf,"%s %+.2gy",buf,clip->eqn[1]); if ( fabs(clip->eqn[2]) > EPS ) sprintf(buf,"%s %+.2gz",buf,clip->eqn[2]); dd = clip->eqn[3]-clip->eqn[0]*mesh->xtra \ - clip->eqn[1]*mesh->ytra-clip->eqn[2]*mesh->ztra; if ( dd ) sprintf(buf,"%s %+.2g",buf,dd); if ( sc->par.xs > 180 ) output2(150,8,"%s = 0",buf); } if ( sc->picklist && sc->par.xs > 390 && !sc->isotyp & S_PARTICLE ) output2(350,8,"%15s",sc->material[refmat].name); if ( sc->persp->pmode == PERSPECTIVE && sc->item & S_PALETTE ) drawPalette(sc); if ( sc->persp->pmode == CAMERA ) drawHUD(sc); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); } void mouseStatus(int button,int state,int x,int y) { pScene sc = cv.scene[currentScene()]; pTransform view = sc->view; ubyte axis = X_AXIS; /* default */ if ( ddebug ) printf("control mouse %d\n",state); if ( button == GLUT_LEFT_BUTTON ) { if ( x < 16 && x > 5 ) axis = X_AXIS; else if ( x < 26 && x > 15 ) axis = Y_AXIS; else if ( x < 36 && x > 25 ) axis = Z_AXIS; switch (axis) { case X_AXIS: view->angle = 90.0; break; case Y_AXIS: view->angle = 90.0; view->axis[0] = 1.0; view->axis[1] = view->axis[2] = 0.0f; break; case Z_AXIS: view->angle = 90.0; view->axis[1] = 0.0f; view->axis[0] = view->axis[2] = 0.0f; break; } } } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/stream.c000644 000767 000024 00000135370 11406142256 017146 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define MAX_PTS 100000 #define MAX_CPT 5000 #define MAX_LST 1024 #define COS175 -0.996194698 #define COS178 -0.99939083 #define HSIZ 0.03 #define EPST -1.e-14 #define EPSR 1.e+14 extern int reftype,refitem; extern GLfloat altcoef; int nbar=0; enum {Euler=1,RK4=2}; /* find tetra containg p, starting nsdep */ int locateTetra(pMesh mesh,int nsdep,int base,float *p,double *cb) { pTetra pt; pPoint p0,p1,p2,p3; double bx,by,bz,cx,cy,cz,dx,dy,dz,vx,vy,vz,apx,apy,apz; double epsra,vol1,vol2,vol3,vol4,dd; int *adj,iadr,it,nsfin; it = 0; nsfin = nsdep; /* printf("locateTetra: searching for %f %f %f\n",p[0],p[1],p[2]);*/ do { if ( !nsfin ) return(0); pt = &mesh->tetra[nsfin]; if ( !pt->v[0] ) return(0); if ( pt->mark == base ) return(0); pt->mark = base; iadr = 4*(nsfin-1)+1; adj = &mesh->adja[iadr]; p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; p3 = &mesh->point[pt->v[3]]; /* barycentric */ bx = p1->c[0] - p0->c[0]; by = p1->c[1] - p0->c[1]; bz = p1->c[2] - p0->c[2]; cx = p2->c[0] - p0->c[0]; cy = p2->c[1] - p0->c[1]; cz = p2->c[2] - p0->c[2]; dx = p3->c[0] - p0->c[0]; dy = p3->c[1] - p0->c[1]; dz = p3->c[2] - p0->c[2]; /* test volume */ vx = cy*dz - cz*dy; vy = cz*dx - cx*dz; vz = cx*dy - cy*dx; epsra = EPST*(bx*vx + by*vy + bz*vz); apx = p[0] - p0->c[0]; apy = p[1] - p0->c[1]; apz = p[2] - p0->c[2]; /* p in 2 */ vol2 = apx*vx + apy*vy + apz*vz; if ( epsra > vol2 ) { nsfin = adj[1]; continue; } /* p in 3 */ vx = by*apz - bz*apy; vy = bz*apx - bx*apz; vz = bx*apy - by*apx; vol3 = dx*vx + dy*vy + dz*vz; if ( epsra > vol3 ) { nsfin = adj[2]; continue; } /* p in 4 */ vol4 = -cx*vx - cy*vy - cz*vz; if ( epsra > vol4 ) { nsfin = adj[3]; continue; } /* p in 1 */ vol1 = -epsra * EPSR - vol2 - vol3 - vol4; if ( epsra > vol1 ) { nsfin = adj[0]; continue; } dd = vol1+vol2+vol3+vol4; if ( dd != 0.0 ) dd = 1.0 / dd; cb[0] = vol1 * dd; cb[1] = vol2 * dd; cb[2] = vol3 * dd; cb[3] = vol4 * dd; pt->cpt++; return(nsfin); } while ( ++it <= mesh->ntet ); return(0); } /* return 1 if point in tetra, adjacent #, if not */ int inSubTetra(pPoint pt[4],float *p,double *cb) { double bx,by,bz,cx,cy,cz,dx,dy,dz,vx,vy,vz,apx,apy,apz; double epsra,vol1,vol2,vol3,vol4,dd; /* barycentric */ bx = pt[1]->c[0] - pt[0]->c[0]; by = pt[1]->c[1] - pt[0]->c[1]; bz = pt[1]->c[2] - pt[0]->c[2]; cx = pt[2]->c[0] - pt[0]->c[0]; cy = pt[2]->c[1] - pt[0]->c[1]; cz = pt[2]->c[2] - pt[0]->c[2]; dx = pt[3]->c[0] - pt[0]->c[0]; dy = pt[3]->c[1] - pt[0]->c[1]; dz = pt[3]->c[2] - pt[0]->c[2]; /* test volume */ vx = cy*dz - cz*dy; vy = cz*dx - cx*dz; vz = cx*dy - cy*dx; epsra = EPST*(bx*vx + by*vy + bz*vz); apx = p[0] - pt[0]->c[0]; apy = p[1] - pt[0]->c[1]; apz = p[2] - pt[0]->c[2]; /* p in 2 */ vol2 = apx*vx + apy*vy + apz*vz; if ( epsra > vol2 ) return(-1); /* p in 3 */ vx = by*apz - bz*apy; vy = bz*apx - bx*apz; vz = bx*apy - by*apx; vol3 = dx*vx + dy*vy + dz*vz; if ( epsra > vol3 ) return(-2); /* p in 4 */ vol4 = -cx*vx - cy*vy - cz*vz; if ( epsra > vol4 ) return(-3); /* p in 1 */ vol1 = -epsra * EPSR - vol2 - vol3 - vol4; if ( epsra > vol1 ) return(0); dd = vol1+vol2+vol3+vol4; if ( dd != 0.0f ) dd = 1.0 / dd; cb[0] = vol1 * dd; cb[1] = vol2 * dd; cb[2] = vol3 * dd; cb[3] = vol4 * dd; return(1); } int locateHexa(pMesh mesh,int nsdep,int base,float *p,double *cb,pPoint pt[4]) { pHexa ph; double bx,by,bz,cx,cy,cz,dx,dy,dz,vx,vy,vz,apx,apy,apz; double epsra,vol1,vol2,vol3,vol4,dd; int *adj,iadr,it,nsfin,in; it = 0; nsfin = nsdep; /*printf("locateHexa: searching for %f %f %f\n",p[0],p[1],p[2]);*/ do { if ( !nsfin ) return(0); ph = &mesh->hexa[nsfin]; /*printf("\nnsfin %d base %d mark %d\n",nsfin,base,ph->mark);*/ if ( !ph->v[0] || ph->mark == base ) return(0); ph->mark = base; iadr = 6*(nsfin-1)+1; adj = &mesh->adja[iadr]; /*printf("adj %d %d %d %d %d %d\n",adj[0],adj[1],adj[2],adj[3],adj[4],adj[5]);*/ /* tetra1: 0,2,3,7 : 3 external faces */ /*printf("tet1: %d %d %d %d\n",ph->v[0],ph->v[2],ph->v[3],ph->v[7]);*/ pt[0] = &mesh->point[ph->v[0]]; pt[1] = &mesh->point[ph->v[2]]; pt[2] = &mesh->point[ph->v[3]]; pt[3] = &mesh->point[ph->v[7]]; in = inSubTetra(pt,p,cb); printf("tet1 : on sort en %d\n",in); if ( in > 0 ) { ph->cpt++; return(nsfin); } else if ( in == 0 ) { nsfin = adj[4]; continue; } else if ( in == -1 ) { nsfin = adj[5]; continue; } else if ( in == -3 ) { nsfin = adj[0]; continue; } /* tetra2: 1,4,5,6 : 3 external faces */ pt[0] = &mesh->point[ph->v[1]]; pt[1] = &mesh->point[ph->v[4]]; pt[2] = &mesh->point[ph->v[5]]; pt[3] = &mesh->point[ph->v[6]]; in = inSubTetra(pt,p,cb); if ( in > 0 ) { ph->cpt++; return(nsfin); } else if ( in == 0 ) { nsfin = adj[1]; continue; } else if ( in == -1 ) { nsfin = adj[3]; continue; } else if ( in == -3 ) { nsfin = adj[2]; continue; } /* tetra3: 0,4,6,7 : 2 external faces */ pt[0] = &mesh->point[ph->v[0]]; pt[1] = &mesh->point[ph->v[4]]; pt[2] = &mesh->point[ph->v[6]]; pt[3] = &mesh->point[ph->v[7]]; in = inSubTetra(pt,p,cb); if ( in > 0 ) { ph->cpt++; return(nsfin); } else if ( in == 0 ) { nsfin = adj[1]; continue; } else if ( in == -2 ) { nsfin = adj[5]; continue; } /* tetra4: 0,1,2,6 : 2 external faces */ pt[0] = &mesh->point[ph->v[0]]; pt[1] = &mesh->point[ph->v[1]]; pt[2] = &mesh->point[ph->v[2]]; pt[3] = &mesh->point[ph->v[6]]; in = inSubTetra(pt,p,cb); if ( in > 0 ) { ph->cpt++; return(nsfin); } else if ( in == 0 ) { nsfin = adj[3]; continue; } else if ( in == -3 ) { nsfin = adj[0]; continue; } /* tetra5: 0,6,2,7 : 1 external face */ pt[0] = &mesh->point[ph->v[0]]; pt[1] = &mesh->point[ph->v[6]]; pt[2] = &mesh->point[ph->v[2]]; pt[3] = &mesh->point[ph->v[7]]; in = inSubTetra(pt,p,cb); if ( in > 0 ) { ph->cpt++; return(nsfin); } else if ( in == 0 ) { nsfin = adj[4]; continue; } /* tetra6: 0,4,1,6 : 1 external face */ pt[0] = &mesh->point[ph->v[0]]; pt[1] = &mesh->point[ph->v[4]]; pt[2] = &mesh->point[ph->v[1]]; pt[3] = &mesh->point[ph->v[6]]; in = inSubTetra(pt,p,cb); if ( in > 0 ) { ph->cpt++; return(nsfin); } else if ( in == -3 ) { nsfin = adj[2]; continue; } puts("PROBLEME"); exit(1); } while ( ++it <= mesh->nhex ); return(0); } int locateTria(pMesh mesh,int nsdep,int base,float *p,double *cb) { pTriangle pt; pPoint p0,p1,p2; double ax,ay,bx,by,cx,cy; double epsra,aire1,aire2,aire3,dd; int *adj,iadr,it,isign,nsfin; it = 0; nsfin = nsdep; /*printf("locateTria: searching for %f %f\n",p[0],p[1]);*/ do { pt = &mesh->tria[nsfin]; if ( !pt->v[0] ) return(0); if ( pt->mark == base ) return(0); pt->mark = base; iadr = 3*(nsfin-1)+1; adj = &mesh->adja[iadr]; p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; dd = ax*by - ay*bx; isign= dd > 0 ? 1 : -1; epsra = isign > 0 ? EPST*dd : -(EPST*dd); /* barycentric */ bx = p1->c[0] - p[0]; by = p1->c[1] - p[1]; cx = p2->c[0] - p[0]; cy = p2->c[1] - p[1]; /* p in 1 */ aire1 = isign*(bx*cy - by*cx); if ( epsra > aire1 ) { nsfin = adj[0]; continue; } ax = p0->c[0] - p[0]; ay = p0->c[1] - p[1]; aire2 = isign*(cx*ay - cy*ax); if ( epsra > aire2 ) { nsfin = adj[1]; continue; } aire3 = -epsra*EPSR - aire1 - aire2; if ( epsra > aire3 ) { nsfin = adj[2]; continue; } dd = aire1+aire2+aire3; if ( dd != 0.0f ) dd = 1.0 / dd; cb[0] = aire1 * dd; cb[1] = aire2 * dd; cb[2] = aire3 * dd; pt->cpt++; return(nsfin); } while ( ++it <= mesh->nt ); return(0); } /* point in tetra */ int inTetra(pMesh mesh,int nsdep,float *p,double *cb) { pTetra pt; pPoint p0,p1,p2,p3; double bx,by,bz,cx,cy,cz,dx,dy,dz,vx,vy,vz,apx,apy,apz; double epsra,vol1,vol2,vol3,vol4,dd; pt = &mesh->tetra[nsdep]; if ( !pt->v[0] ) return(0); p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; p3 = &mesh->point[pt->v[3]]; /* barycentric */ bx = p1->c[0] - p0->c[0]; by = p1->c[1] - p0->c[1]; bz = p1->c[2] - p0->c[2]; cx = p2->c[0] - p0->c[0]; cy = p2->c[1] - p0->c[1]; cz = p2->c[2] - p0->c[2]; dx = p3->c[0] - p0->c[0]; dy = p3->c[1] - p0->c[1]; dz = p3->c[2] - p0->c[2]; /* test volume */ vx = cy*dz - cz*dy; vy = cz*dx - cx*dz; vz = cx*dy - cy*dx; epsra = EPST*(bx*vx + by*vy + bz*vz); apx = p[0] - p0->c[0]; apy = p[1] - p0->c[1]; apz = p[2] - p0->c[2]; /* p in 2 */ vol2 = apx*vx + apy*vy + apz*vz; if ( epsra > vol2 ) return(0); /* p in 3 */ vx = by*apz - bz*apy; vy = bz*apx - bx*apz; vz = bx*apy - by*apx; vol3 = dx*vx + dy*vy + dz*vz; if ( epsra > vol3 ) return(0); /* p in 4 */ vol4 = -cx*vx - cy*vy - cz*vz; if ( epsra > vol4 ) return(0); /* p in 1 */ vol1 = -epsra * EPSR - vol2 - vol3 - vol4; if ( epsra > vol1 ) return(0); dd = vol1+vol2+vol3+vol4; if ( dd != 0.0f ) dd = 1.0 / dd; cb[0] = vol1 * dd; cb[1] = vol2 * dd; cb[2] = vol3 * dd; cb[3] = vol4 * dd; pt->cpt++; return(1); } int inHexa(pMesh mesh,int nsdep,float *p,double *cb,pPoint pt[4]) { return(0); } int inTria(pMesh mesh,int nsdep,float *p,double *cb) { pTriangle pt; pPoint p0,p1,p2; double ax,ay,bx,by,cx,cy; double epsra,dd,aire1,aire2,aire3; int isign; pt = &mesh->tria[nsdep]; if ( !pt->v[0] ) return(0); p0 = &mesh->point[pt->v[0]]; p1 = &mesh->point[pt->v[1]]; p2 = &mesh->point[pt->v[2]]; ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; dd = ax*by - ay*bx; isign= dd > 0 ? 1 : -1; epsra = isign > 0 ? EPST*dd : -(EPST*dd); /* barycentric */ bx = p[0] - p1->c[0]; by = p[1] - p1->c[1]; cx = p[0] - p2->c[0]; cy = p[1] - p2->c[1]; aire1 = isign*(bx*cy - by*cx); if ( epsra > aire1 ) return(0); ax = p[0] - p0->c[0]; ay = p[1] - p0->c[1]; aire2 = isign*(cx*ay - cy*ax); if ( epsra > aire2 ) return(0); aire3 = -epsra*EPSR - aire1 - aire2; if ( epsra > aire3 ) return(0); dd = aire1+aire2+aire3; if ( dd != 0.0f ) dd = 1.0 / dd; cb[0] = aire1 * dd; cb[1] = aire2 * dd; cb[2] = aire3 * dd; pt->cpt++; return(1); } /* return size of tetra */ double sizeTetra(pMesh mesh,int k) { pTetra pt; pPoint p[4]; double ax,ay,az,dd; double hmin; int i; static int idire[6][2] = {{0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3}}; pt = &mesh->tetra[k]; for (i=0; i<4; i++) p[i] = &mesh->point[pt->v[i]]; hmin = FLT_MAX; for (i=1; i<6; i++) { ax = p[idire[i][0]]->c[0] - p[idire[i][1]]->c[0]; ay = p[idire[i][0]]->c[1] - p[idire[i][1]]->c[1]; az = p[idire[i][0]]->c[2] - p[idire[i][1]]->c[2]; dd = ax*ax + ay*ay + az*az; hmin = min(dd,hmin); } return(sqrt(hmin)); } double sizeHexa(pMesh mesh,int k) { pHexa ph; pPoint p[8]; double ax,ay,az,dd; double hmin; int i; static int idire[12][2] = {{0,1}, {1,2}, {2,3}, {0,3}, {4,5}, {5,6}, {6,7}, {4,7}, {0,4}, {1,5}, {2,6}, {3,7}}; ph = &mesh->hexa[k]; for (i=0; i<8; i++) p[i] = &mesh->point[ph->v[i]]; hmin = FLT_MAX; for (i=1; i<12; i++) { ax = p[idire[i][0]]->c[0] - p[idire[i][1]]->c[0]; ay = p[idire[i][0]]->c[1] - p[idire[i][1]]->c[1]; az = p[idire[i][0]]->c[2] - p[idire[i][1]]->c[2]; dd = ax*ax + ay*ay + az*az; hmin = min(dd,hmin); } return(sqrt(hmin)); } double sizeTria(pMesh mesh,int k) { pTriangle pt; pPoint p0,p1; double ax,ay,dd; double hmin; int i; static int idir[5] = {0,1,2,0,1}; pt = &mesh->tria[k]; hmin = FLT_MAX; for (i=0; i<3; i++) { p0 = &mesh->point[pt->v[i]]; p1 = &mesh->point[pt->v[idir[i+1]]]; ax = p0->c[0] - p1->c[0]; ay = p0->c[1] - p1->c[1]; dd = ax*ax + ay*ay; hmin = min(dd,hmin); } return(sqrt(hmin)); } double sizeQuad(pMesh mesh,int k) { pQuad pq; pPoint p0,p1; double ax,ay,dd; double hmin; int i; static int idir[7] = {0,1,2,3,0,1,2}; pq = &mesh->quad[k]; hmin = FLT_MAX; for (i=0; i<4; i++) { p0 = &mesh->point[pq->v[i]]; p1 = &mesh->point[pq->v[idir[i+1]]]; ax = p0->c[0] - p1->c[0]; ay = p0->c[1] - p1->c[1]; dd = ax*ax + ay*ay; hmin = min(dd,hmin); } return(sqrt(hmin)); } /* vector interpolation */ double field3DInterp(pMesh mesh,int iel,double *cb,double *v) { pTetra pt; pSolution ps0,ps1,ps2,ps3; double dd; pt = &mesh->tetra[iel]; ps0 = &mesh->sol[pt->v[0]]; ps1 = &mesh->sol[pt->v[1]]; ps2 = &mesh->sol[pt->v[2]]; ps3 = &mesh->sol[pt->v[3]]; v[0] = cb[0]*ps0->m[0] + cb[1]*ps1->m[0] + \ cb[2]*ps2->m[0] + cb[3]*ps3->m[0]; v[1] = cb[0]*ps0->m[1] + cb[1]*ps1->m[1] + \ cb[2]*ps2->m[1] + cb[3]*ps3->m[1]; v[2] = cb[0]*ps0->m[2] + cb[1]*ps1->m[2] + \ cb[2]*ps2->m[2] + cb[3]*ps3->m[2]; dd = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); if ( dd > 0.0f ) { v[0] /= dd; v[1] /= dd; v[2] /= dd; } return(dd); } /* vector interpolation */ double vector3DInterp(pMesh mesh,pPoint pt[4],double *cb,double *v) { pSolution ps0,ps1,ps2,ps3; double dd; ps0 = &mesh->sol[pt[0]-&mesh->point[0]]; ps1 = &mesh->sol[pt[1]-&mesh->point[0]]; ps2 = &mesh->sol[pt[2]-&mesh->point[0]]; ps3 = &mesh->sol[pt[3]-&mesh->point[0]]; v[0] = cb[0]*ps0->m[0] + cb[1]*ps1->m[0] + \ cb[2]*ps2->m[0] + cb[3]*ps3->m[0]; v[1] = cb[0]*ps0->m[1] + cb[1]*ps1->m[1] + \ cb[2]*ps2->m[1] + cb[3]*ps3->m[1]; v[2] = cb[0]*ps0->m[2] + cb[1]*ps1->m[2] + \ cb[2]*ps2->m[2] + cb[3]*ps3->m[2]; dd = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); if ( dd > 0.0f ) { v[0] /= dd; v[1] /= dd; v[2] /= dd; } return(dd); } double field2DInterp(pMesh mesh,int iel,double *cb,double *v) { pTriangle pt; pSolution ps0,ps1,ps2; double dd; pt = &mesh->tria[iel]; ps0 = &mesh->sol[pt->v[0]]; ps1 = &mesh->sol[pt->v[1]]; ps2 = &mesh->sol[pt->v[2]]; v[0] = cb[0]*ps0->m[0] + cb[1]*ps1->m[0] + cb[2]*ps2->m[0]; v[1] = cb[0]*ps0->m[1] + cb[1]*ps1->m[1] + cb[2]*ps2->m[1]; v[2] = 0.0f; dd = sqrt(v[0]*v[0] + v[1]*v[1]); if ( dd > 0.0f ) { v[0] /= dd; v[1] /= dd; } return(dd); } /* add point to display list, if needed */ int filterPoint(pScene sc,Stream *st,float *p,ubyte color) { double norm,rgb[3],kc,ux,uy,uz,vx,vy,vz,dd; int i; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* store point */ memcpy(st->stpt[++st->stnp],p,3*sizeof(float)); nbar++; /* point color */ norm = st->norm; if ( !color ) { if ( norm < sc->iso.val[0] ) norm = sc->iso.val[0]; else if ( norm > sc->iso.val[MAXISO-1] ) norm = sc->iso.val[MAXISO-1]; for (i=0; iiso.val[i] ) break; kc = (norm-sc->iso.val[i-1]) / (sc->iso.val[i] - sc->iso.val[i-1]); st->stcol[st->stnp] = sc->iso.col[i-1]*(1.0-kc)+sc->iso.col[i]*kc; st->stiso[st->stnp] = i; } else { st->stcol[st->stnp] = sc->iso.col[MAXISO-1]; st->stiso[st->stnp] = MAXISO-1; } if ( sc->mode & S_ALTITUDE ) st->stpt[st->stnp][2] = altcoef*norm; if ( !color && (st->stiso[0] != st->stiso[st->stnp]) ) { hsv[0] = st->stcol[st->stnp]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex3fv(st->stpt[st->stnp]); memcpy(st->stpt[0],st->stpt[st->stnp],3*sizeof(float)); st->stcol[0] = st->stcol[st->stnp]; st->stiso[0] = st->stiso[st->stnp]; st->stnp = 0; return(1); } if ( st->stnp < 2 ) return(0); /* filtering point */ ux = st->stpt[0][0] - st->stpt[1][0]; uy = st->stpt[0][1] - st->stpt[1][1]; uz = st->stpt[0][2] - st->stpt[1][2]; dd = ux*ux + uy*uy + uz*uz; if ( dd > 0.0 ) { dd = 1.0f / sqrt(dd); ux *= dd; uy *= dd; uz *= dd; } else { memcpy(st->stpt[0],st->stpt[1],2*3*sizeof(float)); st->stnp--; return(0); } vx = st->stpt[2][0] - st->stpt[1][0]; vy = st->stpt[2][1] - st->stpt[1][1]; vz = st->stpt[2][2] - st->stpt[1][2]; dd = vx*vx + vy*vy + vz*vz; if ( dd > 0.0 ) { dd = 1.0f / sqrt(dd); vx *= dd; vy *= dd; vz *= dd; } else { memcpy(st->stpt[1],st->stpt[2],3*sizeof(float)); st->stnp--; return(0); } dd = ux*vx + uy*vy + uz*vz; if ( dd > COS178 ) { hsv[0] = st->stcol[st->stnp]; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex3fv(st->stpt[st->stnp]); memcpy(st->stpt[0],st->stpt[st->stnp],3*sizeof(float)); st->stcol[0] = st->stcol[st->stnp]; st->stiso[0] = st->stiso[st->stnp]; st->stnp = 0; return(1); } else { memcpy(st->stpt[st->stnp-1],st->stpt[st->stnp],3*sizeof(float)); st->stcol[st->stnp-1] = st->stcol[st->stnp]; st->stiso[st->stnp-1] = st->stiso[st->stnp]; st->stnp--; return(0); } } /* add vertex to display list */ void addPoint(pScene sc,Stream *st,float *p,ubyte color) { double norm,rgb[3],kc; int i; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* point color */ norm = st->norm; i = MAXISO-1; if ( !color ) { norm = st->norm; if ( norm < sc->iso.val[0] ) norm = sc->iso.val[0]; else if ( norm > sc->iso.val[MAXISO-1] ) norm = sc->iso.val[MAXISO-1]; for (i=0; iiso.val[i] ) break; kc = (norm-sc->iso.val[i-1]) / (sc->iso.val[i] - sc->iso.val[i-1]); hsv[0] = sc->iso.col[i-1]*(1.0-kc)+sc->iso.col[i]*kc; } if ( sc->mode & S_ALTITUDE ) p[2] = altcoef*norm; hsvrgb(hsv,rgb); glColor3dv(rgb); glVertex3fv(p); st->stnp = 0; memcpy(st->stpt[st->stnp],p,3*sizeof(float)); st->stcol[st->stnp] = hsv[0]; st->stiso[st->stnp] = i; st->stnp++; } int nxtPoint3D(pMesh mesh,int nsdep,float *p,float step,double *v) { pTetra pt; double norm,h6,cb[4],v1[3],v2[3],v3[3]; float xp1[3],xp2[3],xp3[3]; int k; /* 4th order Runge-Kutta */ xp1[0] = p[0] + 0.5*step*v[0]; xp1[1] = p[1] + 0.5*step*v[1]; xp1[2] = p[2] + 0.5*step*v[2]; k = locateTetra(mesh,nsdep,++mesh->mark,xp1,cb); if ( !k ) return(0); norm = field3DInterp(mesh,k,cb,v1); pt = &mesh->tetra[k]; pt->cpt--; xp2[0] = p[0] + 0.5*step*v1[0]; xp2[1] = p[1] + 0.5*step*v1[1]; xp2[2] = p[2] + 0.5*step*v1[2]; k = locateTetra(mesh,k,++mesh->mark,xp2,cb); if ( !k ) return(0); norm = field3DInterp(mesh,k,cb,v2); pt = &mesh->tetra[k]; pt->cpt--; xp3[0] = p[0] + step*v2[0]; xp3[1] = p[1] + step*v2[1]; xp3[2] = p[2] + step*v2[2]; k = locateTetra(mesh,k,++mesh->mark,xp3,cb); if ( !k ) return(0); norm = field3DInterp(mesh,k,cb,v3); pt = &mesh->tetra[k]; pt->cpt--; h6 = step / 6.0; p[0] += h6 * (v[0] + 2*(v1[0] + v2[0]) + v3[0]); p[1] += h6 * (v[1] + 2*(v1[1] + v2[1]) + v3[1]); p[2] += h6 * (v[2] + 2*(v1[2] + v2[2]) + v3[2]); return(1); } int nxtPoint2D(pMesh mesh,int nsdep,float *p,float step,double *v) { pTriangle pt; double norm,h6,cb[3],v1[3],v2[3],v3[3]; float xp1[3],xp2[3],xp3[3]; int k; /* 4th order Runge-Kutta */ xp1[0] = p[0] + 0.5*step*v[0]; xp1[1] = p[1] + 0.5*step*v[1]; k = locateTria(mesh,nsdep,++mesh->mark,xp1,cb); if ( !k ) return(0); norm = field2DInterp(mesh,k,cb,v1); pt = &mesh->tria[k]; pt->cpt--; xp2[0] = p[0] + 0.5*step*v1[0]; xp2[1] = p[1] + 0.5*step*v1[1]; k = locateTria(mesh,k,++mesh->mark,xp2,cb); if ( !k ) return(0); norm = field2DInterp(mesh,k,cb,v2); pt = &mesh->tria[k]; pt->cpt--; xp3[0] = p[0] + step*v2[0]; xp3[1] = p[1] + step*v2[1]; k = locateTria(mesh,k,++mesh->mark,xp3,cb); if ( !k ) return(0); norm = field2DInterp(mesh,k,cb,v3); pt = &mesh->tria[k]; pt->cpt--; h6 = step / 6.0; p[0] += h6 * (v[0] + 2*(v1[0] + v2[0]) + v3[0]); p[1] += h6 * (v[1] + 2*(v1[1] + v2[1]) + v3[1]); return(1); } /* read streamlines origins */ int parseStream(pScene sc,pMesh mesh) { FILE *in; pStream st; float x,y,z; int i,k,nbp,ret; char *ptr,data[128],key[256],tmp[128]; /* input file */ strcpy(tmp,mesh->name); ptr = (char*)strstr(tmp,".mesh"); if ( ptr ) *ptr = '\0'; sprintf(data,"%s.iso",tmp); in = fopen(data,"r"); if ( !in ) { sscanf(data,"DEFAULT.iso"); in = fopen(data,"r"); if ( !in ) return(0); } if ( !quiet ) fprintf(stdout," Reading %s\n",data); sc->stream = createStream(sc,mesh); st = sc->stream; while ( !feof(in) ) { fscanf(in,"%s",key); for (i=0; inbstl = nbp; if ( mesh->dim == 3 ) for (k=1; k<=3*st->nbstl; k+=3) { ret = fscanf(in,"%f %f %f\n",&x,&y,&z); printf("x %f %f %f\n",x,y,z); st->listp[k] = x - mesh->xtra; st->listp[k+1] = y - mesh->ytra; st->listp[k+2] = z - mesh->ztra; printf("x %f %f %f\n",st->listp[k],st->listp[k+1],st->listp[k+2]); } else for (k=1; k<=2*st->nbstl; k+=2) { ret = fscanf(in,"%f %f\n",&x,&y); st->listp[k] = x - mesh->xtra; st->listp[k+1] = y - mesh->ytra; } } else if ( !strcmp(key,"euler") ) { st->typtrack = Euler; } else if ( !strcmp(key,"box") ) { ret = fscanf(in,"%f %f",&x,&y); if ( ret != 2 ) break; st->xmin = x - mesh->xtra; st->xmax = y - mesh->xtra; ret = fscanf(in,"%f %f",&x,&y); if ( ret != 2 ) break; st->ymin = x - mesh->ytra; st->ymax = y - mesh->ytra; if ( mesh->dim == 3 ) { ret = fscanf(in,"%f %f",&x,&y); if ( ret != 2 ) break; st->zmin = x - mesh->ztra; st->zmax = y - mesh->ztra; } } else if ( key[0] == '#' ) { fgets(key,255,in); } } fclose(in); if ( !st->nbstl ) { fprintf(stderr," ## No data found.\n"); return(0); } k = 1; printf("fin proc %f %f %f\n",sc->stream->listp[k],sc->stream->listp[k+1],sc->stream->listp[k+2]); return(1); } /* build lists for streamlines */ int listTetraStream(pScene sc,pMesh mesh,float *pp,int squiet) { pTetra pt; pStream st; double dd,cb[4],cbdep[4],v[4],vdep[4],sizedep,normdep; float step,p[3],ox,oy,oz,ldt; int i,k,exh,depart,nsdep,nsfin,nsold,nbp,maxpts; clock_t ct; FILE *out; /* default */ if ( !mesh->ntet ) return(0); else if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("\n create streamlines list / TETRA\n"); if ( !squiet && !ddebug ) { fprintf(stdout," Building streamline(s)"); fflush(stdout); } ct = clock(); /* build display list */ st = sc->stream; if ( st->nbstl > MAX_LST-1 ) return(0); sc->slist[st->nbstl] = glGenLists(1); glNewList(sc->slist[st->nbstl],GL_COMPILE); if ( glGetError() ) return(0); k = st->nbstl*3 + 1; st->listp[k+0] = pp[0]; st->listp[k+1] = pp[1]; st->listp[k+2] = pp[2]; st->nbstl++; printf("\n%d: pp = %f %f %f\n",st->nbstl,st->listp[k+0],st->listp[k+1],st->listp[k+2]); maxpts = max(MAX_PTS,5*mesh->ntet); glLineWidth(2.0); /* compute streamline */ nbp = 0; exh = 0; nsdep = mesh->ntet / 2; step = 0.0; nbar = 0; if ( ddebug ) printf(" start point %d: %f %f %f\n", 3*k/3,st->listp[k],st->listp[k+1],st->listp[k+2]); for (i=1; intet; i++) { pt = &mesh->tetra[i]; pt->cpt = 0; } /* find enclosing tet */ memcpy(p,pp,3*sizeof(float)); depart = locateTetra(mesh,nsdep,++mesh->mark,p,cb); printf("depart = %d\n",depart); if ( !depart ) { for (depart=1; depart<=mesh->ntet; depart++) { pt = &mesh->tetra[depart]; if ( pt->mark != mesh->mark && inTetra(mesh,depart,p,cb) ) break; } if ( depart > mesh->ntet ) { glEndList(); return(0); } } st->norm = field3DInterp(mesh,depart,cb,v); memcpy(cbdep,cb,4*sizeof(double)); memcpy(vdep,v,4*sizeof(double)); st->size = sizeTetra(mesh,depart); sizedep = st->size; normdep = st->norm; ldt = 0.0; if ( st->size == 0.0 ) step = EPS*sc->dmax; else step = HSIZ * min(st->size,st->norm); /* build display list incrementally */ nsdep = nsold = depart; glBegin(GL_LINE_STRIP); addPoint(sc,st,p,0); nbp++; if ( sc->par.maxtime < FLT_MAX ) { sc->par.cumtim = 0.0; step = min(0.05*sc->par.dt,step); out = fopen("particules.dat","a+"); assert(out); fprintf(out,"\n%8.2f %f %f %f\n", sc->par.cumtim,p[0]+mesh->xtra,p[1]+mesh->ytra,p[2]+mesh->ztra); } do { ox = p[0]; oy = p[1]; oz = p[2]; /* move to next point */ if ( st->typtrack == Euler || !nxtPoint3D(mesh,nsdep,p,step,v) ) { p[0] += step*v[0]; p[1] += step*v[1]; p[2] += step*v[2]; } if ( p[0]xmin || p[1]ymin || p[2]zmin || p[0]>st->xmax || p[1]>st->ymax || p[2]>st->zmax ) break; else if ( sc->par.maxtime < FLT_MAX ) { ox -= p[0]; oy -= p[1]; oz -= p[2]; dd = sqrt(ox*ox + oy*oy + oz*oz) / st->norm; ldt += dd; sc->par.cumtim += dd; if ( sc->par.cumtim > sc->par.maxtime ) break; if ( ldt > sc->par.dt ) { fprintf(out,"%8.2f %f %f %f\n", sc->par.cumtim,p[0]+mesh->xtra,p[1]+mesh->ytra,p[2]+mesh->ztra); ldt = fabs(sc->par.dt - ldt); } } /* find tet containing p */ nsfin = locateTetra(mesh,nsdep,++mesh->mark,p,cb); if ( !nsfin ) break; nsdep = nsfin; pt = &mesh->tetra[nsdep]; if ( pt->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeTetra(mesh,nsdep); nsold = nsdep; } /* vector field interpolation */ st->norm = field3DInterp(mesh,nsdep,cb,v); step = HSIZ*min(st->size,st->norm); if ( sc->par.maxtime < FLT_MAX ) step = min(0.05*sc->par.dt,step); if ( step == 0.0 ) break; nbp += filterPoint(sc,st,p,0); } while ( nbp < maxpts ); addPoint(sc,st,p,0); glEnd(); if ( nbp >= maxpts || sc->par.maxtime < FLT_MAX ) { glLineWidth(1.0); glEndList(); if ( !squiet && !ddebug ) { fprintf(stdout,": %d (%d, %.2f) / %d lines", nbar,nbp,(float)nbp/nbar,k/3); ct = difftime(clock(),ct); fprintf(stdout," %6.2f sec.\n",ct); } if ( sc->par.maxtime < FLT_MAX ) { fprintf(out,"%8.2f %f %f %f\n", sc->par.cumtim,p[0]+mesh->xtra,p[1]+mesh->ytra,p[2]+mesh->ztra); fclose(out); } return(1); } /* reverse orientation */ memcpy(p,pp,3*sizeof(float)); memcpy(cb,cbdep,4*sizeof(double)); memcpy(v,vdep,4*sizeof(double)); st->norm = normdep; st->size = sizedep; if ( st->size == 0.0 ) step = EPS * sc->dmax; else step = HSIZ * min(st->size,st->norm); /* build display list incrementally */ nsdep = nsold = depart; glBegin(GL_LINE_STRIP); addPoint(sc,st,p,0); nbp++; do { /* move to next point */ if ( st->typtrack == Euler || !nxtPoint3D(mesh,nsdep,p,-step,v) ) { p[0] -= step*v[0]; p[1] -= step*v[1]; p[2] -= step*v[2]; } if ( p[0]xmin || p[1]ymin || p[2]zmin || p[0]>st->xmax || p[1]>st->ymax || p[2]>st->zmax ) break; /* find tet containing p */ nsfin = locateTetra(mesh,nsdep,++mesh->mark,p,cb); if ( !nsfin ) break; nsdep = nsfin; pt = &mesh->tetra[nsdep]; if ( pt->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeTetra(mesh,nsdep); nsold = nsdep; } /* vector field interpolation */ st->norm = field3DInterp(mesh,nsdep,cb,v); step = HSIZ * min(st->size,st->norm); if ( step == 0.0 ) break; nbp += filterPoint(sc,st,p,0); } while ( nbp < maxpts ); addPoint(sc,st,p,0); glEnd(); glLineWidth(1.0); glEndList(); if ( !nbp ) { st->nbstl--; if ( !squiet && !ddebug ) fprintf(stdout,"..empty\n"); return(0); } if ( !squiet && !ddebug ) { if ( nbar ) fprintf(stdout,": %d (%d, %.2f) / %d lines",nbar,nbp,(float)nbp/nbar,k/3); ct = difftime(clock(),ct); fprintf(stdout," %6.2f sec.\n",ct); } return(1); } int listHexaStream(pScene sc,pMesh mesh,float *pp,int squiet) { pHexa ph; pPoint pt[4]; pStream st; double cbdep[4],cb[4],v[6],vdep[6],sizedep,normdep; float step,p[3]; int i,k,exh,depart,nsdep,nsfin,nsold,nbp,maxpts; mytime tt; /* default */ if ( !mesh->nhex ) return(0); else if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("create streamlines list / HEXA\n"); if ( !squiet && !ddebug ) { fprintf(stdout," Building streamline(s)"); fflush(stdout); chrono(ON,&tt); } /* build display list */ st = sc->stream; if ( st->nbstl > MAX_LST-1 ) return(0); sc->slist[st->nbstl] = glGenLists(1); glNewList(sc->slist[st->nbstl],GL_COMPILE); if ( glGetError() ) return(0); st->nbstl++; k = st->nbstl*3; st->listp[k] = pp[0]; st->listp[k+1] = pp[1]; st->listp[k+2] = pp[2]; maxpts = max(MAX_PTS,5*mesh->nhex); glLineWidth(2.0); /* compute streamline */ nbp = 0; exh = 0; nsdep = mesh->nhex / 2; step = 0.0f; nbar = 0; if ( ddebug ) printf(" start point %d: %f %f %f\n", 3*k/3,st->listp[k],st->listp[k+1],st->listp[k+2]); for (i=1; inhex; i++) { ph = &mesh->hexa[i]; ph->cpt = 0; } /* find enclosing tet */ memcpy(p,pp,3*sizeof(float)); depart = locateHexa(mesh,nsdep,++mesh->mark,p,cb,pt); printf("DEPART %d\n",depart); ph = &mesh->hexa[depart]; printf("sommets %d %d %d %d %d %d %d %d\n", ph->v[0],ph->v[1],ph->v[2],ph->v[3],ph->v[4],ph->v[5],ph->v[6],ph->v[7]); if ( !depart ) { for (depart=1; depart<=mesh->nhex; depart++) { ph = &mesh->hexa[depart]; if ( ph->mark != mesh->mark && inHexa(mesh,depart,p,cb,pt) ) break; } if ( depart > mesh->nhex ) return(0); } st->norm = vector3DInterp(mesh,pt,cb,v); memcpy(cbdep,cb,4*sizeof(double)); memcpy(vdep,v,4*sizeof(double)); st->size = sizeHexa(mesh,depart); sizedep = st->size; normdep = st->norm; if ( st->size == 0.0f ) step = EPS*sc->dmax; else step = HSIZ * st->size; /* build display list incrementally */ nsdep = nsold = depart; glBegin(GL_LINE_STRIP); addPoint(sc,st,p,0); nbp++; do { /* move to next point */ if ( st->typtrack == Euler || !nxtPoint3D(mesh,nsdep,p,step,v)) { p[0] += step*v[0]; p[1] += step*v[1]; p[2] += step*v[2]; } if ( p[0]xmin || p[1]ymin || p[2]zmin || p[0]>st->xmax || p[1]>st->ymax || p[2]>st->zmax ) break; /* find tet containing p */ nsfin = locateHexa(mesh,nsdep,++mesh->mark,p,cb,pt); if ( !nsfin ) break; nsdep = nsfin; ph = &mesh->hexa[nsdep]; if ( ph->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeHexa(mesh,nsdep); step = HSIZ*st->size; nsold = nsdep; } /* vector field interpolation */ st->norm = vector3DInterp(mesh,pt,cb,v); if ( st->norm < EPS*step ) break; step = min(step,st->norm); if ( step == 0.0f ) break; /*step = 1.0e-06*sc->dmax;*/ nbp += filterPoint(sc,st,p,0); } while ( nbp < maxpts ); glEnd(); if ( nbp >= maxpts ) { glLineWidth(1.0); glEndList(); if ( !squiet && !ddebug ) { fprintf(stdout,": %d (%d, %.2f) / %d lines", nbar,nbp,(float)nbp/nbar,k/3); chrono(OFF,&tt); fprintf(stdout," %6.2f sec.\n",gttime(tt)); } return(1); } /* reverse orientation */ memcpy(p,pp,3*sizeof(float)); memcpy(cb,cbdep,4*sizeof(double)); memcpy(v,vdep,4*sizeof(double)); st->norm = normdep; st->size = sizedep; if ( st->size == 0.0f ) step = EPS * sc->dmax; else step = HSIZ*st->size; /* build display list incrementally */ nsdep = nsold = depart; glBegin(GL_LINE_STRIP); addPoint(sc,st,p,0); nbp++; do { /* move to next point */ if ( st->typtrack == Euler || !nxtPoint3D(mesh,nsdep,p,-step,v) ) { p[0] -= step*v[0]; p[1] -= step*v[1]; p[2] -= step*v[2]; } if ( p[0]xmin || p[1]ymin || p[2]zmin || p[0]>st->xmax || p[1]>st->ymax || p[2]>st->zmax ) break; /* find tet containing p */ nsfin = locateHexa(mesh,nsdep,++mesh->mark,p,cb,pt); if ( !nsfin ) break; nsdep = nsfin; ph = &mesh->hexa[nsdep]; if ( ph->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeHexa(mesh,nsdep); step = HSIZ * st->size; nsold = nsdep; } /* vector field interpolation */ st->norm = vector3DInterp(mesh,pt,cb,v); if ( st->norm < EPS*step ) break; step = min(step,st->norm); if ( step == 0.0f ) break; /*step = 1.e-06 * sc->dmax;*/ nbp += filterPoint(sc,st,p,0); } while ( nbp < maxpts ); glEnd(); glLineWidth(1.0); glEndList(); if ( nbp >= maxpts ) { glLineWidth(1.0); glEndList(); if ( !squiet && !ddebug ) { fprintf(stdout,": %d (%d, %.2f) / %d lines", nbar,nbp,(float)nbp/nbar,k/3); chrono(OFF,&tt); fprintf(stdout," %6.2f sec.\n",gttime(tt)); } return(1); } if ( !nbp ) { st->nbstl--; if ( !squiet && !ddebug ) fprintf(stdout,"..empty\n"); return(0); } if ( !squiet && !ddebug ) { if ( nbar ) fprintf(stdout,": %d (%d, %.2f) / %d lines",nbar,nbp,(float)nbp/nbar,k/3); chrono(OFF,&tt); fprintf(stdout," %6.2f sec.\n",gttime(tt)); } return(1); } int listTriaStream(pScene sc,pMesh mesh,float *pp) { pTriangle pt; pStream st; double dd,cb[3],cbdep[3],v[3],vdep[3],sizedep,normdep; float step,p[3],ox,oy,ldt; int i,k,exh,depart,nsdep,nsfin,nsold,nbp,maxpts; clock_t ct; FILE *out; /* default */ if ( !mesh->nt ) return(0); if ( ddebug ) printf("create streamlines / TRIA\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); fprintf(stdout," Building streamline(s)"); fflush(stdout); ct = clock(); /* build display list */ st = sc->stream; if ( st->nbstl > MAX_LST-1 ) return(0); sc->slist[st->nbstl] = glGenLists(1); glNewList(sc->slist[st->nbstl],GL_COMPILE); if ( glGetError() ) return(0); st->nbstl++; k = st->nbstl*3; st->listp[k] = pp[0]; st->listp[k+1] = pp[1]; st->listp[k+2] = pp[2]; maxpts = max(MAX_PTS,5*mesh->nt); glLineWidth(2.0); /* compute streamlines */ nbp = 0; exh = 0; nsdep = mesh->nt / 2; step = 0.0; nbar = 0; if ( ddebug ) printf(" start point %d: %f %f\n",3*k/3,st->listp[k],st->listp[k+1]); for (i=1; i<=mesh->nt; i++) { pt = &mesh->tria[i]; pt->cpt = 0; } /* find enclosing triangle */ memcpy(p,pp,3*sizeof(float)); depart = locateTria(mesh,nsdep,++mesh->mark,p,cb); if ( !depart ) { if ( ddebug ) printf("exhaustif search\n"); for (depart=1; depart<=mesh->nt; depart++) { pt = &mesh->tria[depart]; if ( pt->mark != mesh->mark && inTria(mesh,depart,p,cb) ) break; } if ( depart > mesh->nt ) { st->nbstl--; glEndList(); glLineWidth(1.0); fflush(stdout); return(0); } } st->norm = field2DInterp(mesh,depart,cb,v); memcpy(cbdep,cb,3*sizeof(double)); memcpy(vdep,v,3*sizeof(double)); st->size = sizeTria(mesh,depart); sizedep = st->size; normdep = st->norm; ldt = 0.0; if ( st->size == 0.0 ) step = EPS * sc->dmax; else step = HSIZ * min(st->size,st->norm); /* build display list incrementally */ nsdep = nsold = depart; glBegin(GL_LINE_STRIP); addPoint(sc,st,p,0); nbp++; if ( sc->par.maxtime < FLT_MAX ) { sc->par.cumtim = 0.0; step = min(0.05*sc->par.dt,step); out = fopen("particules.dat","a+"); assert(out); fprintf(out,"\n%8.2f %f %f\n", sc->par.cumtim,p[0]+mesh->xtra,p[1]+mesh->ytra); } do { ox = p[0]; oy = p[1]; /* move to next point */ if ( st->typtrack == Euler || !nxtPoint2D(mesh,nsdep,p,step,v) ) { p[0] += step*v[0]; p[1] += step*v[1]; } if ( p[0]xmin || p[1]ymin || p[0]>st->xmax || p[1]>st->ymax ) break; else if ( sc->par.maxtime < FLT_MAX ) { ox -= p[0]; oy -= p[1]; dd = sqrt(ox*ox + oy*oy) / st->norm; ldt += dd; sc->par.cumtim += dd; if ( sc->par.cumtim >= sc->par.maxtime ) break; if ( ldt > sc->par.dt ) { fprintf(out,"%8.2f %f %f\n", sc->par.cumtim,p[0]+mesh->xtra,p[1]+mesh->ytra); ldt = fabs(sc->par.dt - ldt); } } /* find tet containing p */ nsfin = locateTria(mesh,nsdep,++mesh->mark,p,cb); if ( !nsfin ) break; nsdep = nsfin; pt = &mesh->tria[nsdep]; if ( pt->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeTria(mesh,nsdep); nsold = nsdep; } /* vector field interpolation */ st->norm = field2DInterp(mesh,nsdep,cb,v); step = HSIZ * min(st->size,st->norm); if ( sc->par.maxtime < FLT_MAX ) step = min(0.05*sc->par.dt,step); if ( step == 0.0 ) break; nbp += filterPoint(sc,st,p,0); } while ( nbp < maxpts ); addPoint(sc,st,p,0); glEnd(); if ( nbp >= maxpts || sc->par.maxtime < FLT_MAX ) { glLineWidth(1.0); glEndList(); fprintf(stdout,": %d (%d, %.2f) / %d lines",nbar,nbp,(float)nbp/nbar,k/3); ct = difftime(clock(),ct); fprintf(stdout," %6.2f sec.\n",ct); if ( sc->par.maxtime < FLT_MAX ) { fprintf(out,"%8.2f %f %f\n", sc->par.cumtim,p[0]+mesh->xtra,p[1]+mesh->ytra); fclose(out); } return(1); } /* reverse orientation */ memcpy(p,pp,3*sizeof(float)); memcpy(cb,cbdep,3*sizeof(double)); memcpy(v,vdep,3*sizeof(double)); st->norm = normdep; st->size = sizedep; if ( st->size == 0.0 ) step = EPS * sc->dmax; else step = HSIZ* st->size; /* build display list incrementally */ nsdep = nsold = depart; glBegin(GL_LINE_STRIP); addPoint(sc,st,p,0); nbp++; do { /* move to next point */ if ( st->typtrack == Euler || !nxtPoint2D(mesh,nsdep,p,-step,v) ) { p[0] -= step*v[0]; p[1] -= step*v[1]; } if ( p[0]xmin || p[1]ymin || p[0]>st->xmax || p[1]>st->ymax ) break; /* find tet containing p */ nsfin = locateTria(mesh,nsdep,++mesh->mark,p,cb); if ( !nsfin ) break; nsdep = nsfin; pt = &mesh->tria[nsdep]; if ( pt->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeTria(mesh,nsdep); nsold = nsdep; } /* vector field interpolation */ st->norm = field2DInterp(mesh,nsdep,cb,v); step = HSIZ * min(st->size,st->norm); if ( step == 0.0 ) break; nbp += filterPoint(sc,st,p,0); } while ( nbp < maxpts ); addPoint(sc,st,p,0); glEnd(); glLineWidth(1.0); glEndList(); if ( !nbp ) { st->nbstl--; fprintf(stdout,".. empty.\n"); return(0); } /*if ( ddebug ) */ if ( nbar ) fprintf(stdout,": %d (%d, %.2f) / %d lines",nbar,nbp,(float)nbp/nbar,k/3); ct = difftime(clock(),ct); fprintf(stdout," %6.2f sec.\n",ct); return(1); } int listSaddleStream(pScene sc,pMesh mesh,int depart, float *pp,float *vv,double lambda) { pTriangle pt; pStream st; double cb[3],v[3]; float sens,step,p[3]; int i,k,nsdep,nsfin,nsold,nbp,maxpts; /* default */ if ( !mesh->nt ) return(0); if ( ddebug ) printf("create streamlines for saddle point\n"); if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* build display list */ st = sc->stream; if ( st->nbstl > MAX_LST-1 ) return(0); sc->slist[st->nbstl] = glGenLists(1); glNewList(sc->slist[st->nbstl],GL_COMPILE); if ( glGetError() ) return(0); maxpts = max(MAX_PTS,5*mesh->nt); glLineWidth(2.0); st->nbstl++; k = st->nbstl*3; st->listp[k] = p[0] = pp[0]; st->listp[k+1] = p[1] = pp[1]; st->listp[k+2] = p[2] = 0.0f; for (i=1; i<=mesh->nt; i++) { pt = &mesh->tria[i]; pt->cpt = 0; } /* compute streamlines */ nsold = nsdep = depart; nbp = nbar = 0; glBegin(GL_LINE_STRIP); addPoint(sc,st,pp,1); st->size = sizeTria(mesh,depart); st->norm = sqrt(vv[0]*vv[0] + vv[1]*vv[1]); if ( st->size == 0.0f ) step = EPS * sc->dmax; else step = HSIZ* st->size; if ( st->norm > 0.0f ) { v[0] = vv[0] / st->norm; v[1] = vv[1] / st->norm; } sens = lambda < 0.0f ? -1. : 1.; /* build display list incrementally */ do { /* move to next point */ if ( st->typtrack == Euler || !nxtPoint2D(mesh,nsdep,p,step,v) ) { p[0] += sens*step*v[0]; p[1] += sens*step*v[1]; } if ( p[0]xmin || p[1]ymin || p[0]>st->xmax || p[1]>st->ymax ) break; /* find tet containing p */ nsfin = locateTria(mesh,nsdep,++mesh->mark,p,cb); if ( !nsfin ) break; nsdep = nsfin; pt = &mesh->tria[nsdep]; if ( pt->cpt > MAX_CPT ) break; /* adjust local stepsize */ if ( nsdep != nsold ) { st->size = sizeTria(mesh,nsdep); step = HSIZ * st->size; nsold = nsdep; } /* vector field interpolation */ st->norm = field2DInterp(mesh,nsdep,cb,v); if ( st->norm < EPS*step ) break; step = min(step,st->norm); if ( step == 0.0f ) break; nbp += filterPoint(sc,st,p,1); } while ( nbp < maxpts ); glEnd(); glLineWidth(1.0); glEndList(); if ( !nbp ) { glDeleteLists(sc->slist[st->nbstl--],1); return(0); } return(1); } pStream createStream(pScene sc,pMesh mesh) { pStream st; /* hash simplices */ if ( mesh->dim == 2 ) { if ( mesh->nt && !hashTria(mesh) ) return(0); } else { if ( mesh->ntet && !hashTetra(mesh) ) return(0); if ( mesh->nhex && !hashHexa(mesh) ) return(0); } st = (pStream)calloc(1,sizeof(struct sstream)); if ( !st ) return(0); /*st->typtrack = Euler;*/ st->typtrack = RK4; st->stnp = 0; st->nbstl = 0; /* bounding box */ st->xmin = mesh->xmin - mesh->xtra; st->ymin = mesh->ymin - mesh->ytra; st->zmin = mesh->zmin - mesh->ztra; st->xmax = mesh->xmax - mesh->xtra; st->ymax = mesh->ymax - mesh->ytra; st->zmax = mesh->zmax - mesh->ztra; /* init list */ st->listp = (float*)malloc((MAX_LST*3+1)*sizeof(float)); assert(st->listp); sc->slist = (GLuint*)calloc(MAX_LST,sizeof(GLuint)); if ( !sc->slist ) return(0); return(st); } /* create from point picking */ int streamRefPoint(pScene sc,pMesh mesh) { pPoint ppt; float s[3]; ppt = &mesh->point[refitem]; if ( ppt->flag ) return(0); s[0] = ppt->c[0]; s[1] = ppt->c[1]; s[2] = ppt->c[2]; if ( mesh->dim == 2 ) listTriaStream(sc,mesh,s); else { if ( mesh->ntet ) listTetraStream(sc,mesh,s,0); else if ( mesh->nhex ) listHexaStream(sc,mesh,s,0); } ppt->flag = 1; return(1); } /* read starting point in file.iso */ int streamIsoPoint(pScene sc,pMesh mesh) { pStream st; int k,nbp,nbstl; time_t t; if ( !parseStream(sc,mesh) ) return(0); t = clock(); fprintf(stdout," Building streamline(s)"); fflush(stdout); st = sc->stream; nbstl = st->nbstl; nbp = 0; st->nbstl = 0; if ( mesh->dim == 3 ) { if ( !mesh->ntet ) return(0); nbp = 0; for (k=1; k<=3*nbstl; k+=3) { printf("\n ici: %f %f %f\n",st->listp[k],st->listp[k+1],st->listp[k+2]); nbp += listTetraStream(sc,mesh,&st->listp[k],1); } } if ( !nbp ) return(0); if ( ddebug ) printf("stream start: %d points ",nbp); fprintf(stdout,": %d lines",nbp); t = clock() - t; fprintf(stdout," %6.2f sec.\n",t/(float)CLOCKS_PER_SEC); return(1); } int streamRefTria(pScene sc,pMesh mesh) { pMaterial pm; pTriangle pt; pPoint ppt; float s[3]; int i,k,nmat,nbp,base; time_t t; /* build list */ base = ++mesh->mark; nbp = 0; pt = &mesh->tria[refitem]; nmat = matRef(sc,pt->ref); /*nmat = !pt->ref ? DEFAULT_MAT : 1+(pt->ref-1)%(sc->par.nbmat-1);*/ pm = &sc->material[nmat]; k = pm->depmat[LTria]; if ( !k || pm->flag ) return(0); t = clock(); fprintf(stdout," Building streamline(s)"); fflush(stdout); for (i=1; i<=mesh->np; i++) { ppt = &mesh->point[i]; ppt->mark = base; } ++base; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; if ( ppt->mark != base ) { ppt->mark = base; s[0] = ppt->c[0]; s[1] = ppt->c[1]; s[2] = ppt->c[2]; if ( ++nbp > MAX_LST-1 ) break; listTetraStream(sc,mesh,s,1); ppt->flag = 1; } } k = pt->nxt; } if ( !nbp ) return(0); if ( ddebug ) printf("stream start: %d points ",nbp); fprintf(stdout,": %d lines",nbp); t = clock() - t; fprintf(stdout," %6.2f sec.\n",t/(float)CLOCKS_PER_SEC); return(1); } int streamRefQuad(pScene sc,pMesh mesh) { pMaterial pm; pQuad pq; pPoint ppt; float s[3]; int i,k,nmat,nbp,base; time_t t; /* build list */ base = ++mesh->mark; nbp = 0; pq = &mesh->quad[refitem]; nmat = matRef(sc,pq->ref); /*nmat = !pt->ref ? DEFAULT_MAT : 1+(pt->ref-1)%(sc->par.nbmat-1);*/ pm = &sc->material[nmat]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) return(0); t = clock(); fprintf(stdout," Building streamline(s)"); fflush(stdout); for (i=1; i<=mesh->np; i++) { ppt = &mesh->point[i]; ppt->mark = base; } ++base; while ( k != 0 ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) { k = pq->nxt; continue; } for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; if ( ppt->mark != base ) { ppt->mark = base; s[0] = ppt->c[0]; s[1] = ppt->c[1]; s[2] = ppt->c[2]; if ( ++nbp > MAX_LST-1 ) break; listHexaStream(sc,mesh,s,1); ppt->flag = 1; } } k = pq->nxt; } if ( !nbp ) return(0); if ( ddebug ) printf("stream start: %d points ",nbp); fprintf(stdout,": %d lines",nbp); t = clock() - t; fprintf(stdout," %6.2f sec.\n",t/(float)CLOCKS_PER_SEC); return(1); } freefem++-3.38-1/src/medit/tiles.c000644 000767 000024 00000016046 11406142256 016771 0ustar00hechtstaff000000 000000 #include "medit.h" #include "sproto.h" #include "extern.h" extern ubyte ddebug; ubyte tiling; #define IN2CM 2.54 #define CM2IN 0.3937 void dumpTile(char *data,int width,int height,GLubyte *buffer) { FILE *out2; out2 = fopen(data,"w"); fprintf(out2,"P6\n"); fprintf(out2,"# Created using medit %s %s, (c) INRIA\n",ME_VER,ME_REL); fprintf(out2,"%d %d\n",width,height); fprintf(out2,"255\n"); fwrite(buffer,sizeof(GLubyte),width*height*3,out2); fclose(out2); } /* dump big image */ int imgTiling(pScene sc,char *data,char key) { FILE *out; pCamera c = sc->camera; GLubyte *tile,*buffer,*rowPtr; GLint matmode,viewport[4]; double xmin,xmax,ymin,ymax,left,right,top,bottom,ratio; float debhaut,finhaut,deblarg,finlarg,look[3]; int i,tw,th,col,row,nbcol,nbrow; int imgWidth,imgHeight,tileWidth,tileHeight,tileWidthNB,tileHeightNB; int bitsTileRow,bitsImgOffset,bitsCurTileRow,border; int bitsTileOffset,bitsPixel,imgRowSize; char *ptr,name[256]; ubyte bckbyte; static GLfloat up[3] = { 0.0, 1.0, 0.0}; glPixelStorei(GL_PACK_ALIGNMENT, 1); bckbyte = (ubyte)(255*(0.30*sc->par.back[0] + 0.59*sc->par.back[1] + 0.11*sc->par.back[2])+ 0.5); /* compute image size */ ratio = (double)sc->par.xs/(double)sc->par.ys; ymax = 0.1f*sc->dmax * tan(sc->persp->fovy * M_PI/360.0); ymin = -ymax; xmin = ymin * ratio; xmax = ymax * ratio; bitsPixel = 3 * sizeof(GLubyte); imgWidth = (int)(sc->par.dpi*CM2IN*sc->par.cm+0.5); imgHeight = (int)((double)imgWidth / ratio +0.5); imgRowSize = imgWidth * bitsPixel; tileWidth = sc->par.xs; tileHeight = sc->par.ys; border = sc->mode & S_BDRY ? 1 : 0; tileWidthNB = tileWidth - 2*border; tileHeightNB = tileHeight - 2*border; if ( ddebug ) { fprintf(stdout," Generating %d by %d image\n",imgWidth,imgHeight); fprintf(stdout," tile %d x %d\n",tileWidth,tileHeight); fprintf(stdout," image size %f x %f cm\n", sc->par.cm,(double)imgHeight/sc->par.dpi/CM2IN); } /* buffer to store one tile */ tile = (GLubyte*)calloc(tileWidthNB*tileHeightNB,bitsPixel); if ( !tile ) { fprintf(stderr," ## Unable to store buffer!\n"); return(0); } /* buffer for a row of tiles */ buffer = (GLubyte*)calloc(imgWidth*tileHeightNB,bitsPixel); if ( !buffer ) { free(tile); fprintf(stderr," ## Unable to store a row of tiles!\n"); return(0); } /* open EPS file */ strcpy(name,data); ptr = (char*)strstr(name,".ps"); if ( !ptr ) strcat(name,".ps"); out = fopen(name,"w"); if ( !out ) { fprintf(stderr," ## Unable to open file %s.\n",name); free(tile); return(0); } writeEPSheader(out,name,key,imgWidth,imgHeight,sc->par.cm,sc->par.dpi); /* save current viewport */ glGetIntegerv(GL_VIEWPORT,viewport); glDrawBuffer(GL_BACK_LEFT); glReadBuffer(GL_BACK_LEFT); /* dump tiles */ nbcol = (int)((float)imgWidth / tileWidthNB) + 1; nbrow = (int)((float)imgHeight/ tileHeightNB) + 1; tiling = 1; th = tileHeightNB; finhaut = sc->par.ys; for (row=nbrow-1; row>=0; row--) { if ( row < nbrow-1 ) th = tileHeightNB; else th = imgHeight - row*tileHeightNB; debhaut = finhaut - sc->par.ys * th / imgHeight; deblarg = 0; for (col=0; col tileHeightNB || tw > tileWidthNB ) { fprintf(stderr," %%%% Wrong tile size (%d,%d).\n",th,tw); free(buffer); free(tile); return(0); } finlarg = deblarg + sc->par.xs * tw / imgWidth; /* set viewport to tilesize (with border) */ glViewport(0,0,tw+2*border,th+2*border); /* current matrix */ glGetIntegerv(GL_MATRIX_MODE,&matmode); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMultMatrixf(sc->persp->matrix); /* compute projection parameters */ if ( sc->persp->pmode == PERSPECTIVE ) { left = xmin + (xmax-xmin) * (col*tileWidthNB) / imgWidth; right = left + (xmax-xmin) * tw / imgWidth; bottom = ymin + (ymax-ymin) * (row*tileHeightNB) / imgHeight; top = bottom + (ymax-ymin) * th / imgHeight; glFrustum(left,right,bottom,top,0.1*sc->dmax,10.0f*sc->dmax); glTranslatef(0.0f,0.0,sc->persp->depth); } else if ( sc->persp->pmode == CAMERA ) { left = xmin + (xmax-xmin) * (col*tileWidthNB) / imgWidth; right = left + (xmax-xmin) * tw / imgWidth; bottom = ymin + (ymax-ymin) * (row*tileHeightNB) / imgHeight; top = bottom + (ymax-ymin) * th / imgHeight; glFrustum(left,right,bottom,top,0.1f*sc->dmax,10.0f*sc->dmax); look[0] = c->eye[0] + 0.001*sc->dmax*c->speed[0]; look[1] = c->eye[1] + 0.001*sc->dmax*c->speed[1]; look[2] = c->eye[2] + 0.001*sc->dmax*c->speed[2]; gluLookAt(c->eye[0],c->eye[1],c->eye[2], look[0],look[1],look[2], up[0],up[1],up[2]); glTranslatef(0.0f,0.0f,0.5*sc->persp->depth); } else if ( sc->persp->pmode == ORTHO ) { glOrtho(-1.,1.,-1.,0.1,0.01,0.01); glTranslatef(0.0,0.0,sc->persp->depth); } /* redraw scene */ glDisable(GL_LIGHTING); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /*gluLookAt(0.,0.,-sc->persp->depth, 0.,0.,0., 0.0,1.0,0.0);*/ glMultMatrixf(sc->view->matrix); glTranslatef(sc->cx,sc->cy,sc->cz); drawModel(sc); /* read buffer */ glFlush(); glReadPixels(border,border,tileWidthNB,tileHeightNB, GL_RGB,GL_UNSIGNED_BYTE,tile); /* store to row buffer */ bitsImgOffset = col * tileWidthNB * bitsPixel; bitsTileRow = tileWidthNB * bitsPixel; bitsCurTileRow = tw * bitsPixel; bitsTileOffset = border*bitsPixel; bitsTileOffset = 0; for (i=0; ipar.coeff > 0.0f ) { for (i=0; i 10 ) buffer[i] += (255-buffer[i]) * sc->par.coeff; else buffer[i] += buffer[i] * sc->par.coeff; } /* write row of tiles */ for (i=0; ipos[0] = tr->pos[1] = tr->pos[2] = 0.0f; tr->angle = 0.0f; tr->panx = tr->pany = 0.0f; tr->opanx = tr->opany = 0.0f; tr->mstate = 1; tr->manim = GL_FALSE; memcpy(tr->matrix,itransf,16*sizeof(float)); memcpy(tr->rot,itransf,16*sizeof(float)); memcpy(tr->tra,itransf,16*sizeof(float)); } pTransform createTransform() { pTransform tr; /* default */ if ( ddebug) printf("create transformation\n"); tr = (pTransform)M_calloc(1,sizeof(struct transform),"transform") ; assert(tr); /* set default values */ resetTransform(tr); tr->mbutton = 0; return(tr); } freefem++-3.38-1/src/medit/util.c000644 000767 000024 00000016013 11406142256 016620 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include #include #include "medit.h" #include "extern.h" #include "sproto.h" static GLfloat IdMatrix[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; /* set font style and size */ void setFont(char* name,int size) { GLvoid *font_style = GLUT_BITMAP_HELVETICA_10; if ( !strcmp(name,"helvetica") ) { if (size == 12) font_style = GLUT_BITMAP_HELVETICA_12; else if (size == 18) font_style = GLUT_BITMAP_HELVETICA_18; } else if (strcmp(name, "times roman") == 0) { font_style = GLUT_BITMAP_TIMES_ROMAN_10; if (size == 24) font_style = GLUT_BITMAP_TIMES_ROMAN_24; } /* else if (strcmp(name, "8x13") == 0) font_style = GLUT_BITMAP_8_BY_13; */ else if (strcmp(name, "9x15") == 0) font_style = GLUT_BITMAP_9_BY_15; } /* display string format at pos(x,y) */ void drwstr(GLuint x,GLuint y,char* format, ...) { va_list args; char *s,buffer[255]; va_start(args,format); vsprintf(buffer,format,args); va_end(args); glRasterPos2i(x,y); for (s=buffer; *s; s++) glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18,*s); } void output2(GLfloat x,GLfloat y,char *format,...) { va_list args; char *s,buffer[255]; /*strcpy(myerror.procname,"output2");*/ va_start(args,format); vsprintf(buffer,format,args); va_end(args); glRasterPos2f(x,y); for (s=buffer; *s; s++) { /*glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,*s);*/ /*glutBitmapCharacter(font_style,*s);*/ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10,*s); } } void output3(GLfloat x,GLfloat y,GLfloat z,char *format,...) { va_list args; char buffer[255], *s; /*strcpy(myerror.procname,"output3");*/ va_start(args,format); vsprintf(buffer,format,args); va_end(args); glRasterPos3f(x,y,z); for (s=buffer; *s; s++) glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10,*s); } /* color converter */ void hsvrgb(double *hsv,double *rgb) { double f,p,q,t; int i; hsv[0] = ((int)hsv[0] % 360) / 60.; i = (int)floor((double)hsv[0]); /* largest int <= h */ f = hsv[0] - i; /* fractional part of h */ p = hsv[2] * (1.0 - hsv[1]); q = hsv[2] * (1.0 - (hsv[1] * f)); t = hsv[2] * (1.0 - (hsv[1] * (1.0 - f))); switch(i) { case 0: rgb[0] = hsv[2]; rgb[1] = t; rgb[2] = p; break; case 1: rgb[0] = q; rgb[1] = hsv[2]; rgb[2] = p; break; case 2: rgb[0] = p; rgb[1] = hsv[2]; rgb[2] = t; break; case 3: rgb[0] = p; rgb[1] = q; rgb[2] = hsv[2]; break; case 4: rgb[0] = t; rgb[1] = p; rgb[2] = hsv[2]; break; case 5: rgb[0] = hsv[2]; rgb[1] = p; rgb[2] = q; break; } } /* transform: u = MxV */ void transformPoint(double u[4],float v[4],float m[16]) { u[0] = v[0] * m[0] + v[1] * m[1] + v[2] * m[2] + v[3] * m[3]; u[1] = v[0] * m[4] + v[1] * m[5] + v[2] * m[6] + v[3] * m[7]; u[2] = v[0] * m[8] + v[1] * m[9] + v[2] * m[10] + v[3] * m[11]; u[3] = v[0] * m[12] + v[1] * m[13] + v[2] * m[14] + v[3] * m[15]; } void transformPoint2(double u[4],float v[4],float m[16]) { u[0] = v[0] * m[0] + v[1] * m[4] + v[2] * m[8] + v[3] * m[12]; u[1] = v[0] * m[1] + v[1] * m[5] + v[2] * m[9] + v[3] * m[13]; u[2] = v[0] * m[2] + v[1] * m[6] + v[2] * m[10] + v[3] * m[14]; u[3] = v[0] * m[3] + v[1] * m[7] + v[2] * m[11] + v[3] * m[15]; } void transformPointd(double u[3],double v[3],double m[16]) { u[0] = v[0] * m[0] + v[1] * m[1] + v[2] * m[2]; u[1] = v[0] * m[4] + v[1] * m[5] + v[2] * m[6]; u[2] = v[0] * m[8] + v[1] * m[9] + v[2] * m[10]; } void transformVector(float u[4],float v[4],float m[16]) { u[0] = v[0] * m[0] + v[1] * m[4] + v[2] * m[8]; u[1] = v[0] * m[1] + v[1] * m[5] + v[2] * m[9]; u[2] = v[0] * m[2] + v[1] * m[6] + v[2] * m[10]; u[3] = v[0] * m[3] + v[1] * m[7] + v[2] * m[11]; } /* p = axb */ void multMatrix(GLfloat *p,GLfloat *a,GLfloat *b) { GLint i,row; for (i=0; i<4; i++) { row = i*4; p[row+0] = a[row] * b[0] + a[row+1] * b[4] + a[row+2] * b[8] + a[row+3] * b[12]; p[row+1] = a[row] * b[1] + a[row+1] * b[5] + a[row+2] * b[9] + a[row+3] * b[13]; p[row+2] = a[row] * b[2] + a[row+1] * b[6] + a[row+2] * b[10] + a[row+3] * b[14]; p[row+3] = a[row] * b[3] + a[row+1] * b[7] + a[row+2] * b[11] + a[row+3] * b[15]; } } void rotateMatrix(GLfloat angle,GLfloat x,GLfloat y,GLfloat z,GLfloat rm[16]) { GLfloat mag,s,c; GLfloat xx,yy,zz,xy,yz,zx,xs,ys,zs,one_c; if ( angle == 0.0f ) { memcpy(rm,IdMatrix,16*sizeof(GLfloat)); return; } mag = x*x + y*y + z*z; if ( mag == 0.0f ) { memcpy(rm,IdMatrix,16*sizeof(GLfloat)); return; } mag = 1.0f / sqrt(mag); x *= mag; y *= mag; z *= mag; s = sin(angle * DTOR); c = cos(angle * DTOR); xx = x*x; yy = y*y; zz = z*z; xy = x*y; yz = y*z; zx = z*x; xs = x*s; ys = y*s; zs = z*s; one_c = 1.0f - c; rm[0] = (one_c * xx) + c; rm[1] = (one_c * xy) - zs; rm[2] = (one_c * zx) + ys; rm[3] = 0.0f; rm[4] = (one_c * xy) + zs; rm[5] = (one_c * yy) + c; rm[6] = (one_c * yz) - xs; rm[7] = 0.0f; rm[8] = (one_c * zx) - ys; rm[9] = (one_c * yz) + xs; rm[10] = (one_c * zz) + c; rm[11] = 0.0f; rm[12] = rm[13] = rm[14] = 0.0f; rm[15] = 1.0f; } int invertMatrix(float src[16],float inverse[16]) { double t; int i, j, k, swap; double tmp[4][4]; memcpy(inverse,IdMatrix,16*sizeof(GLfloat)); for (i=0; i<4; i++) for (j=0; j<4; j++) tmp[i][j] = src[i*4+j]; for (i=0; i<4; i++) { /* look for largest element in column. */ swap = i; for (j=i+1; j<4; j++) { if ( fabs(tmp[j][i]) > fabs(tmp[i][i]) ) swap = j; } if ( swap != i ) { /* swap rows. */ for (k=0; k<4; k++) { t = tmp[i][k]; tmp[i][k] = tmp[swap][k]; tmp[swap][k] = t; t = inverse[i*4+k]; inverse[i*4+k] = inverse[swap*4+k]; inverse[swap*4+k] = t; } } /* The matrix is singular. */ if ( tmp[i][i] == 0 ) return(0); t = tmp[i][i]; for (k=0; k<4; k++) { tmp[i][k] /= t; inverse[i*4+k] /= t; } for (j=0; j<4; j++) { if ( j != i ) { t = tmp[j][i]; for (k=0; k<4; k++) { tmp[j][k] -= tmp[i][k]*t; inverse[j*4+k] -= inverse[i*4+k]*t; } } } } return(1); } void print_matrix(const GLfloat m[16],const char *ligne) { int i; printf("---- %s ----\n",ligne); for (i=0; i<4; i++) printf("%f %f %f %f\n",m[i],m[4+i],m[8+i],m[12+i]); printf("---------------------------------\n"); } void print_matrixd(const GLdouble m[16],const char *ligne) { int i; printf("---- %s ----\n",ligne); for (i=0; i<4; i++) printf("%f %f %f %f\n",m[i],m[4+i],m[8+i],m[12+i]); printf("---------------------------------\n"); } int filnum(char *data,int numdep,char *ext) { FILE *in; char tmpstr[256]; do { sprintf(tmpstr,"%s.%.3d.%s",data,numdep,ext); in = fopen(tmpstr,"r"); if ( !in ) return(numdep); fclose(in); } while ( ++numdep < 999 ); return(-1); } #ifdef __cplusplus } #endif freefem++-3.38-1/src/medit/vector.c000644 000767 000024 00000050312 11406142256 017145 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" #define SCALV 1.0e-04 #define EPST 1.e-14 #define COSPI15 .9781476007338057 #define SINPI15 .2079116908177593 /* draw a vector in 3D: u = unit vector */ void drawVector3D(float p[3],double u[3],double scale) { double c[3],cc[3],m[9],dd,scal5; /* local frame */ m[0] = u[0]; m[1] = u[1]; m[2] = u[2]; if ( fabs(u[0]) > EPS ) { m[3] = -(u[1]+u[2]) / u[0]; m[4] = m[5] = 1.0f; } else if ( fabs(u[1]) > EPS ) { m[4] = -(u[0]+u[2]) / u[1]; m[3] = m[5] = 1.0f; } else { m[5] = -(u[0]+u[1]) / u[2]; m[3] = m[4] = 1.0; } dd = 1.0 / sqrt(m[3]*m[3] + m[4]*m[4] + m[5]*m[5]); m[3] *= dd; m[4] *= dd; m[5] *= dd; m[6] = m[1]*m[5] - m[2]*m[4]; m[7] = m[2]*m[3] - m[0]*m[5]; m[8] = m[0]*m[4] - m[3]*m[1]; u[0] *= scale; u[1] *= scale; u[2] *= scale; c[0] = p[0] + u[0]; c[1] = p[1] + u[1]; c[2] = p[2] + u[2]; glVertex3fv(p); glVertex3dv(c); /* draw 4 arrows */ scal5 = scale / 10.0; cc[0] = -COSPI15*scal5; cc[1] = 0.0; cc[2] = SINPI15*scal5; /* M^-1 . X */ glVertex3dv(c); glVertex3d(c[0]+(m[0]*cc[0]+m[6]*cc[2]), c[1]+(m[1]*cc[0]+m[7]*cc[2]), c[2]+(m[2]*cc[0]+m[8]*cc[2])); cc[0] = -COSPI15*scal5; cc[2] = -cc[2]; glVertex3dv(c); glVertex3d(c[0]+(m[0]*cc[0]+m[6]*cc[2]), c[1]+(m[1]*cc[0]+m[7]*cc[2]), c[2]+(m[2]*cc[0]+m[8]*cc[2])); cc[0] = -COSPI15*scal5; cc[1] = SINPI15*scal5; cc[2] = 0.0; glVertex3dv(c); glVertex3d(c[0]+(m[0]*cc[0]+m[3]*cc[1]), c[1]+(m[1]*cc[0]+m[4]*cc[1]), c[2]+(m[2]*cc[0]+m[5]*cc[1])); cc[1] = -cc[1]; glVertex3dv(c); glVertex3d(c[0]+(m[0]*cc[0]+m[3]*cc[1]), c[1]+(m[1]*cc[0]+m[4]*cc[1]), c[2]+(m[2]*cc[0]+m[5]*cc[1])); } void drawVector2D(float p[2],double u[2],double scale) { double c[2],dx,dy; u[0] *= scale; u[1] *= scale; c[0] = p[0] + u[0]; c[1] = p[1] + u[1]; glVertex2fv(p); glVertex2dv(c); dx = ( COSPI15*u[0] + SINPI15*u[1]) / 3.0; dy = (-SINPI15*u[0] + COSPI15*u[1]) / 3.0; glVertex2dv(c); glVertex2d(c[0]-dx,c[1]-dy); dx = ( COSPI15*u[0] - SINPI15*u[1]) / 3.0; dy = ( SINPI15*u[0] + COSPI15*u[1]) / 3.0; glVertex2dv(c); glVertex2d(c[0]-dx,c[1]-dy); } GLuint listClipTetraVector(pMesh mesh) { pMaterial pm; pTetra pt; pPoint ppt; pSolution ps0; pScene sc; pClip clip; double rgb[3],u[3],epsra,iso,kc,dd,scal,scalemin,scalemax; float cp[3]; GLuint dlist = 0; int ia,k,l,m; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* default */ if ( !mesh->ntet || !mesh->nbb ) return(0); if ( ddebug ) printf("create vector list for clip\n"); sc = cv.scene[currentScene()]; clip = sc->clip; if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* create display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ scalemin = sc->dmax * SCALV; scalemax = 10.0*scalemin; mesh->mark++; glLineWidth(2.0); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTets]; if ( !k || pm->flag ) continue; glBegin(GL_LINES); while ( k != 0 ) { pt = &mesh->tetra[k]; if ( !pt->v[0] || !pt->clip ) { k = pt->nxt; continue; } /* element size */ scal = 0.5*sizeTetra(mesh,k); epsra = EPST * scal; /* linear interpol. */ if ( mesh->typage == 2 ) for (l=0; l<4; l++) { ppt = &mesh->point[pt->v[l]]; if ( ppt->mark == mesh->mark ) continue; ppt->mark = mesh->mark; ps0 = &mesh->sol[pt->v[l]]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]\ + ps0->m[2]*ps0->m[2]); if ( dd < epsra ) continue; /* color = norm */ if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); /* 3D vectors */ dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; u[2] = ps0->m[2] * dd; cp[0] = ppt->c[0]; cp[1] = ppt->c[1]; cp[2] = ppt->c[2]; drawVector3D(cp,u,scal); } else { cp[0] = cp[1] = cp[2] = 0.0; for (l=0; l<4; l++) { ppt = &mesh->point[pt->v[l]]; cp[0] += ppt->c[0]; cp[1] += ppt->c[1]; cp[2] += ppt->c[2]; } cp[0] *= 0.25; cp[1] *= 0.25; cp[2] *= 0.25; /* color = norm */ ps0 = &mesh->sol[k]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]\ +ps0->m[2]*ps0->m[2]); if ( dd > epsra ) { if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; u[2] = ps0->m[2] * dd; drawVector3D(cp,u,scal); } } k = pt->nxt; } glEnd(); } glLineWidth(1.0); glEndList(); return(dlist); } GLuint listClipHexaVector(pMesh mesh) { pMaterial pm; pHexa ph; pPoint ppt; pSolution ps0; pScene sc; pClip clip; double rgb[3],u[3],epsra,iso,kc,dd,scal,scalemin,scalemax; float cp[3]; GLuint dlist = 0; int ia,k,l,m; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* default */ if ( !mesh->nhex || !mesh->nbb ) return(0); if ( ddebug ) printf("create vector list for clip\n"); sc = cv.scene[currentScene()]; clip = sc->clip; if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); /* create display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); /* build list */ scalemin = sc->dmax * SCALV; scalemax = 10.0*scalemin; mesh->mark++; glLineWidth(2.0); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LHexa]; if ( !k || pm->flag ) continue; glBegin(GL_LINES); while ( k != 0 ) { ph = &mesh->hexa[k]; if ( !ph->v[0] || !ph->clip ) { k = ph->nxt; continue; } /* element size */ scal = 0.5*sizeHexa(mesh,k); epsra = EPST * scal; /* linear interpol. */ if ( mesh->typage == 2 ) for (l=0; l<8; l++) { ppt = &mesh->point[ph->v[l]]; if ( ppt->mark == mesh->mark ) continue; ppt->mark = mesh->mark; ps0 = &mesh->sol[ph->v[l]]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]\ + ps0->m[2]*ps0->m[2]); if ( dd < epsra ) continue; /* color = norm */ if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); /* 3D vectors */ dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; u[2] = ps0->m[2] * dd; cp[0] = ppt->c[0]; cp[1] = ppt->c[1]; cp[2] = ppt->c[2]; drawVector3D(cp,u,scal); } else { cp[0] = cp[1] = cp[2] = 0.0; for (l=0; l<8; l++) { ppt = &mesh->point[ph->v[l]]; cp[0] += ppt->c[0]; cp[1] += ppt->c[1]; cp[2] += ppt->c[2]; } cp[0] *= 0.125; cp[1] *= 0.125; cp[2] *= 0.125; /* color = norm */ ps0 = &mesh->sol[k]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]\ +ps0->m[2]*ps0->m[2]); if ( dd > epsra ) { if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; u[2] = ps0->m[2] * dd; drawVector3D(cp,u,scal); } } k = ph->nxt; } glEnd(); } glLineWidth(1.0); glEndList(); return(dlist); } GLuint listTria2dVector(pMesh mesh) { pMaterial pm; pTriangle pt; pPoint ppt; pSolution ps0; pScene sc; double rgb[3],u[2],epsra,iso,kc,dd,scalemin,scalemax,scal; float cp[2]; GLuint dlist = 0; int ia,i,k,l,m; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* default */ if ( !mesh->nt || !mesh->nbb ) return(0); sc = cv.scene[currentScene()]; if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("create vector list\n"); /* create display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); scalemin = sc->dmax * SCALV; scalemax = 15*scalemin; mesh->mark++; glLineWidth(3.0); if ( mesh->typage == 2 ) { glBegin(GL_LINES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } scal = 0.5*sizeTria(mesh,k); epsra = EPST * scal; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; if ( ppt->mark == mesh->mark ) continue; ppt->mark = mesh->mark; ps0 = &mesh->sol[pt->v[i]]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]); if ( dd < epsra ) continue; /* color = norm */ if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; cp[0] = ppt->c[0]; cp[1] = ppt->c[1]; drawVector2D(cp,u,scal); } k = pt->nxt; } } glEnd(); } else { glBegin(GL_LINES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } scal = 0.5*sizeTria(mesh,k); epsra = EPST * scal; cp[0] = cp[1] = 0.0; for (l=0; l<3; l++) { ppt = &mesh->point[pt->v[l]]; cp[0] += ppt->c[0]; cp[1] += ppt->c[1]; } cp[0] /= 3.0; cp[1] /= 3.0; /* color = norm */ ps0 = &mesh->sol[k]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]); if ( dd < epsra ) { k = pt->nxt; continue; } if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; drawVector2D(cp,u,scal); k = pt->nxt; } } glEnd(); } glLineWidth(1.0); glEndList(); return(dlist); } GLuint listQuad2dVector(pMesh mesh) { pMaterial pm; pQuad pq; pPoint ppt; pSolution ps0; pScene sc; double rgb[3],u[2],epsra,iso,kc,dd,scalemin,scalemax,scal; float cp[2]; GLuint dlist = 0; int ia,i,k,l,m; static double hsv[3] = { 0.0, 1.0, 0.80 }; /* default */ if ( !mesh->nq || !mesh->nbb ) return(0); sc = cv.scene[currentScene()]; if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0); if ( ddebug ) printf("create vector list\n"); /* create display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); scalemin = sc->dmax * SCALV; scalemax = 15*scalemin; mesh->mark++; glLineWidth(3.0); if ( mesh->typage == 2 ) { glBegin(GL_LINES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) { k = pq->nxt; continue; } scal = 0.5*sizeQuad(mesh,k); epsra = EPST * scal; for (i=0; i<4; i++) { ppt = &mesh->point[pq->v[i]]; if ( ppt->mark == mesh->mark ) continue; ppt->mark = mesh->mark; ps0 = &mesh->sol[pq->v[i]]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]); if ( dd < epsra ) continue; /* color = norm */ if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; cp[0] = ppt->c[0]; cp[1] = ppt->c[1]; drawVector2D(cp,u,scal); } k = pq->nxt; } } glEnd(); } else { glBegin(GL_LINES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LQuad]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pq = &mesh->quad[k]; if ( !pq->v[0] ) { k = pq->nxt; continue; } scal = 0.5*sizeQuad(mesh,k); epsra = EPST * scal; cp[0] = cp[1] = 0.0; for (l=0; l<4; l++) { ppt = &mesh->point[pq->v[l]]; cp[0] += ppt->c[0]; cp[1] += ppt->c[1]; } cp[0] *= 0.25; cp[1] *= 0.25; /* color = norm */ ps0 = &mesh->sol[k]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]); if ( dd < epsra ) { k = pq->nxt; continue; } if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; drawVector2D(cp,u,scal); k = pq->nxt; } } glEnd(); } glLineWidth(1.0); glEndList(); return(dlist); } GLuint listTria3dVector(pMesh mesh) { pMaterial pm; pTriangle pt; pPoint ppt; pSolution ps0; pScene sc; double rgb[3],u[3],epsra,iso,kc,dd,scalemin,scalemax,scal; float cp[3]; GLuint dlist = 0; int ia,i,k,l,m; static double hsv[3] = { 0.0f, 1.0f, 0.80f }; /* default */ if ( !mesh->nbb ) return(0); sc = cv.scene[currentScene()]; /*if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) ) return(0);*/ if ( ddebug ) printf("create vector list\n"); /* create display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); scalemin = sc->dmax * SCALV; scalemax = 15*scalemin; mesh->mark++; glLineWidth(2.0); if ( mesh->typage == 2 ) { glBegin(GL_LINES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } scal = sizeTria(mesh,k); epsra = EPST * scal; for (i=0; i<3; i++) { ppt = &mesh->point[pt->v[i]]; if ( ppt->mark == mesh->mark ) continue; ppt->mark = mesh->mark; ps0 = &mesh->sol[pt->v[i]]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]\ + ps0->m[2]*ps0->m[2]); if ( dd < epsra ) continue; /* color = norm */ if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0] * dd; u[1] = ps0->m[1] * dd; u[2] = ps0->m[2] * dd; cp[0] = ppt->c[0]; cp[1] = ppt->c[1]; cp[2] = ppt->c[2]; drawVector3D(cp,u,scal); } k = pt->nxt; } } glEnd(); } else { glBegin(GL_LINES); for (m=0; mpar.nbmat; m++) { pm = &sc->material[m]; k = pm->depmat[LTria]; if ( !k || pm->flag ) continue; while ( k != 0 ) { pt = &mesh->tria[k]; if ( !pt->v[0] ) { k = pt->nxt; continue; } scal = 0.5*sizeTria(mesh,k); epsra = EPST * scal; cp[0] = cp[1] = 0.0; for (l=0; l<3; l++) { ppt = &mesh->point[pt->v[l]]; cp[0] += ppt->c[0]; cp[1] += ppt->c[1]; cp[2] += ppt->c[2]; } cp[0] /= 3.0; cp[1] /= 3.0; cp[2] /= 3.0; /* color = norm */ ps0 = &mesh->sol[k]; dd = iso = sqrt(ps0->m[0]*ps0->m[0] + ps0->m[1]*ps0->m[1]\ + ps0->m[2]*ps0->m[2]); if ( dd < epsra ) { k = pt->nxt; continue; } if ( iso < sc->iso.val[0] ) iso = sc->iso.val[0]; else if ( iso > sc->iso.val[MAXISO-1] ) iso = sc->iso.val[MAXISO-1]; for (ia=0; iaiso.val[ia] ) break; kc = (iso-sc->iso.val[ia-1]) / (sc->iso.val[ia] - sc->iso.val[ia-1]); hsv[0] = sc->iso.col[ia-1]*(1.0-kc)+sc->iso.col[ia]*kc; hsvrgb(hsv,rgb); glColor3dv(rgb); dd = 1.0 / dd; u[0] = ps0->m[0]/dd; u[1] = ps0->m[1]/dd; u[2] = ps0->m[2]/dd; drawVector3D(cp,u,scal); k = pt->nxt; } } glEnd(); } glLineWidth(1.0); glEndList(); return(dlist); } freefem++-3.38-1/src/medit/view.c000644 000767 000024 00000004463 11406142256 016623 0ustar00hechtstaff000000 000000 #include "medit.h" #include "sproto.h" #include "extern.h" static pTransform cview = 0; static pCamera ccam = 0; static pPersp cpersp = 0; static int cscene = 0; static ubyte curview = 0; void copyView(pTransform view,pCamera cam,pPersp persp) { cscene = currentScene(); if ( !cview ) { cview = (pTransform)calloc(1,sizeof(struct transform)); if ( !cview ) exit(2); } cview = (pTransform)memcpy(cview,view,sizeof(struct transform)); if ( !cview ) exit(2); if ( !ccam ) { ccam = (pCamera)calloc(1,sizeof(struct camera)); if ( !ccam ) exit(2); } ccam = (pCamera)memcpy(ccam,cam,sizeof(struct camera)); if ( !ccam ) exit(2); if ( !cpersp ) { cpersp = (pPersp)calloc(1,sizeof(struct sperspective)); if ( !cpersp ) exit(2); } cpersp = (pPersp)memcpy(cpersp,persp,sizeof(struct sperspective)); if ( !cpersp ) exit(2); curview = 1; } int pasteView(pTransform view,pCamera cam,pPersp persp) { if ( !curview && !ccam && !persp ) return(0); view = (pTransform)memcpy(view,cview,sizeof(struct transform)); cam = (pCamera)memcpy(cam,ccam,sizeof(struct camera)); persp = memcpy(persp,cpersp,sizeof(struct sperspective)); if ( !view || !cam || !persp ) exit(2); curview = 0; return(1); } /* link scene 1 (slave) to scene 2 (master) */ int linkView(pScene slave) { pScene master; int idw = currentScene(); /* default */ if ( ddebug ) printf("link view\n"); if ( !curview || idw == cscene ) return(0); /* link 2 scenes */ master = cv.scene[cscene]; master->slave = idw; master->master = -1; memcpy(slave->view,master->view,sizeof(struct transform)); memcpy(slave->camera,master->camera,sizeof(struct camera)); memcpy(slave->persp,master->persp,sizeof(struct sperspective)); memcpy(slave->clip->eqn,master->clip->eqn,4*sizeof(float)); memcpy(slave->clip->cliptr,master->clip->cliptr,sizeof(struct transform)); slave->slave = -1; slave->master = cscene; curview = 0; return(1); } void unlinkView(pScene sc1) { pScene sc2; if ( sc1->master == -1 ) return; /* copy master view */ sc2 = cv.scene[sc1->master]; sc1->view = (pTransform)createTransform(); memcpy(sc1->view,sc2->view,sizeof(struct transform)); /* remove link */ sc1->master = -1; sc2->slave = -1; } freefem++-3.38-1/src/medit/zaldy1.c000644 000767 000024 00000003373 11406142256 017054 0ustar00hechtstaff000000 000000 /* * memory allocation for data structures * * Written by Pascal J. Frey, Inria-Rocquencourt * Copyright (c) Inria, 1999. All rights reserved. */ #ifdef __cplusplus extern "C" { #endif #include #include #include "medit.h" #include "extern.h" #include "sproto.h" int zaldy1(pMesh mesh) { /* default */ if ( ddebug ) printf("allocate %d points\n",mesh->np); mesh->point = (pPoint)M_calloc(mesh->np+1,sizeof(Point),"zaldy1.point"); assert(mesh->point); if ( ddebug ) printf("allocate %d tria\n",mesh->nt); mesh->tria = (pTriangle)M_calloc(mesh->nt+1,sizeof(Triangle),"zaldy1.tria"); assert(mesh->tria); if ( ddebug ) printf("allocate %d quad\n",mesh->nq); if ( mesh->nq ) { mesh->quad = (pQuad)M_calloc(mesh->nq+1,sizeof(Quad),"zaldy1.quad"); assert(mesh->quad); } if ( mesh->ntet ) { if ( ddebug ) printf("allocate %d tetra\n",mesh->ntet); mesh->tetra = (pTetra)M_calloc(mesh->ntet+1,sizeof(Tetra),"zaldy1.tetra"); assert(mesh->tetra); } if ( mesh->nhex ) { if ( ddebug ) printf("allocate %d hexa\n",mesh->nhex); mesh->hexa = (pHexa)M_calloc(mesh->nhex+1,sizeof(Hexa),"zaldy1.hexa"); assert(mesh->hexa); } if ( mesh->na ) { if ( ddebug ) printf("allocate %d edges\n",mesh->na); mesh->edge = (pEdge)M_calloc(mesh->na+1,sizeof(Edge),"zaldy1.edge"); assert(mesh->edge); } if ( mesh->nvn || mesh->ntg ) { mesh->extra = (pExtra)M_calloc(1,sizeof(Extra),"zaldy1.extra"); assert(mesh->extra); if ( mesh->nvn ) { mesh->extra->n = (float*)M_calloc(3*mesh->nvn+1,sizeof(float),"inmesh"); assert(mesh->extra->n); } if ( mesh->ntg ) { mesh->extra->t = (float*)M_calloc(3*mesh->ntg+1,sizeof(float),"inmesh"); assert(mesh->extra->n); } } return(1); } freefem++-3.38-1/src/medit/zaldy2.c000644 000767 000024 00000001062 11406142256 017046 0ustar00hechtstaff000000 000000 #include "medit.h" #include "extern.h" #include "sproto.h" int zaldy2(pMesh mesh) { pSolution ps; int k,nbf; /* memory alloc. */ mesh->sol = (pSolution)M_calloc(mesh->nbb+1,sizeof(struct solu),"zaldy2"); assert(mesh->sol); if ( mesh->nfield == 1 ) return(1); if ( mesh->nfield == mesh->dim ) nbf = mesh->dim; /* vector field */ else nbf = mesh->dim*(mesh->dim+1)/2; /* d*d matrix */ for (k=1; k<=mesh->nbb; k++) { ps = &mesh->sol[k]; ps->m = (float*)malloc(nbf*sizeof(float)); } return(1); } freefem++-3.38-1/src/libMesh/chrono.c000644 000767 000024 00000003257 11406142256 017422 0ustar00hechtstaff000000 000000 /* * simulation of a chronograph * in : tim * out: tim.dtim = elapsed time in micro-secs * tim.ptim = elapsed time in secs * tim.call = number of calls * * Written by Pascal J. Frey * email: Pascal.Frey@inria.fr, 1999 */ #ifdef __cplusplus extern "C" { #endif #include #include #include #include "chrono.h" /* return elapsed time in secs. */ static double diftim(time_t t2,time_t t1) { struct tm *ptm; double tim; int hh1,mm1,ss1,hh2,mm2,ss2; ptm = localtime(&t1); hh1 = ptm->tm_hour; mm1 = ptm->tm_min; ss1 = ptm->tm_sec; ptm = localtime(&t2); hh2 = ptm->tm_hour; mm2 = ptm->tm_min; ss2 = ptm->tm_sec; if ( hh2 < hh1 ) hh2 += 24; tim = 3600.0*(hh2-hh1); tim += 60.0*(mm2-mm1); tim += ss2-ss1; return(tim); } /* get system and user times in micro-seconds */ void chrono(int cmode,mytime *ptt) { time_t tt; if ( cmode == RESET ) { ptt->dtim = clock(); ptt->ctim = 0.0f; ptt->ptim = 0; ptt->call = 0; } else { ptt->dtim = difftime(clock(),ptt->dtim); /* in secs */ if ( cmode == ON ) { ptt->ptim = time(NULL); ptt->call++; } else if ( cmode == OFF ) { tt = time(NULL); ptt->ctim += diftim(tt,ptt->ptim); ptt->ptim = 0; } } } /* return time (converted in secs */ double gttime(mytime t) { if ( t.ctim < MAXCLK ) return(t.dtim / (double)CLOCKS_PER_SEC); else return(t.ctim); } /* initialize time table */ void tminit(mytime *t,int maxtim) { int k; for (k=0; k #ifndef ON #define RESET 0 #define ON 1 #define OFF 2 #endif #define TIMEMAX 16 #define MAXCLK ( 1073741823. / (double)CLOCKS_PER_SEC ) typedef struct mytime { double ctim,dtim; time_t ptim; short call; } mytime; /* prototypes */ void chrono(int cmode,mytime *ptt); double gttime(mytime t); void tminit(mytime *t,int maxtim); #ifdef __cplusplus } #endif freefem++-3.38-1/src/libMesh/eigenv.c000644 000767 000024 00000035712 11406142256 017410 0ustar00hechtstaff000000 000000 #include #include #include /* seeking 1.e-05 accuracy */ #define EPSD 1.e-15 #define EPSD2 1.e-10 #define EPS6 5.e-06 #define EPS 1.e-06 #define EPSX2 2.e-06 #define MAXTOU 50 /* check if numbers are equal */ #define egal(x,y) ( \ ( ((x) == 0.0f) ? (fabs(y) < EPS) : \ ( ((y) == 0.0f) ? (fabs(x) < EPS) : \ (fabs((x)-(y)) / (fabs(x) + fabs(y)) < EPSX2) ) ) ) static double Id[3][3] = { { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0} }; /* find root(s) of polynomial: P(x)= x^3+bx^2+cx+d return 1: 3 roots, 2: 2 roots, 3: 1 root */ static int newton3(double p[4],double x[3]) { double b,c,d,da,db,dc,epsd; double delta,fx,dfx,dxx; double fdx0,fdx1,dx0,dx1,x1,x2; int it,n; /* coeffs polynomial, a=1 */ b = p[2]; c = p[1]; d = p[0]; n = 1; /* 1st derivative of f */ da = 3.0; db = 2.0*b; /* solve 2nd order eqn */ delta = db*db - 4.0*da*c; epsd = db*db*EPSD2; /* inflexion (f'(x)=0, x=-b/2a) */ x1 = -db / 6.0f; n = 1; if ( delta > epsd ) { delta = sqrt(delta); dx0 = (-db + delta) / 6.0; dx1 = (-db - delta) / 6.0; /* Horner */ fdx0 = d + dx0*(c+dx0*(b+dx0)); fdx1 = d + dx1*(c+dx1*(b+dx1)); if ( fabs(fdx0) < EPSD ) { /* dx0: double root, compute single root */ n = 2; x[0] = dx0; x[1] = dx0; x[2] = -b - 2.0*dx0; /* check if P(x) = 0 */ fx = d + x[2]*(c+x[2]*(b+x[2])); if ( fabs(fx) > EPSD2 ) { #ifdef DDEBUG fprintf(stderr," ## ERR 9100, newton3: fx= %E\n",fx); #endif return(0); } return(n); } else if ( fabs(fdx1) < EPSD ) { /* dx1: double root, compute single root */ n = 2; x[0] = dx1; x[1] = dx1; x[2] = -b - 2.0*dx1; /* check if P(x) = 0 */ fx = d + x[2]*(c+x[2]*(b+x[2])); if ( fabs(fx) > EPSD2 ) { #ifdef DDEBUG fprintf(stderr," ## ERR 9100, newton3: fx= %E\n",fx); #endif return(0); } return(n); } } else if ( fabs(delta) < epsd ) { /* triple root */ n = 3; x[0] = x1; x[1] = x1; x[2] = x1; /* check if P(x) = 0 */ fx = d + x[0]*(c+x[0]*(b+x[0])); if ( fabs(fx) > EPSD2 ) { #ifdef DDEBUG fprintf(stderr," ## ERR 9100, newton3: fx= %E\n",fx); #endif return(0); } return(n); } else { #ifdef DDEBUG fprintf(stderr," ## ERR 9101, newton3: no real roots\n"); #endif return(0); } /* Newton method: find one root (middle) starting point: P"(x)=0 */ x1 = -b / 3.0; dfx = c + b*x1; fx = d + x1*(c -2.0*x1*x1); it = 0; do { x2 = x1 - fx / dfx; fx = d + x2*(c+x2*(b+x2)); if ( fabs(fx) < EPSD ) { x[0] = x2; break; } dfx = c + x2*(db + da*x2); /* check for break-off condition */ dxx = fabs((x2-x1) / x2); if ( dxx < 1.0e-10 ) { x[0] = x2; if ( fabs(fx) > EPSD2 ) { fprintf(stderr," ## ERR 9102, newton3, no root found (fx %E).\n",fx); return(0); } break; } else x1 = x2; } while ( ++it < MAXTOU ); if ( it == MAXTOU ) { x[0] = x1; fx = d + x1*(c+(x1*(b+x1))); if ( fabs(fx) > EPSD2 ) { fprintf(stderr," ## ERR 9102, newton3, no root found (fx %E).\n",fx); return(0); } } /* solve 2nd order equation P(x) = (x-sol(1))* (x^2+bb*x+cc) */ db = b + x[0]; dc = c + x[0]*db; delta = db*db - 4.0*dc; if ( delta <= 0.0 ) { fprintf(stderr," ## ERR 9103, newton3, det = 0.\n"); return(0); } delta = sqrt(delta); x[1] = 0.5 * (-db+delta); x[2] = 0.5 * (-db-delta); #ifdef DDEBUG /* check for root accuracy */ fx = d + x[1]*(c+x[1]*(b+x[1])); if ( fabs(fx) > EPSD2 ) { fprintf(stderr," ## ERR 9104, newton3: fx= %E x= %E\n",fx,x[1]); return(0); } fx = d + x[2]*(c+x[2]*(b+x[2])); if ( fabs(fx) > EPSD2 ) { fprintf(stderr," ## ERR 9104, newton3: fx= %E x= %E\n",fx,x[2]); return(0); } #endif return(n); } /* find eigenvalues and vectors of a 3x3 symmetric definite * positive matrix * return order of eigenvalues (1,2,3) or 0 if failed */ int eigenv(int symmat,double *mat,double lambda[3],double v[3][3]) { double a11,a12,a13,a21,a22,a23,a31,a32,a33; double aa,bb,cc,dd,ee,ii,vx1[3],vx2[3],vx3[3],dd1,dd2,dd3; double maxd,maxm,valm,p[4],w1[3],w2[3],w3[3]; int k,n; /* default */ memcpy(v,Id,9*sizeof(double)); if ( symmat ) { lambda[0] = (double)mat[0]; lambda[1] = (double)mat[3]; lambda[2] = (double)mat[5]; maxm = fabs(mat[0]); for (k=1; k<6; k++) { valm = fabs(mat[k]); if ( valm > maxm ) maxm = valm; } /* single float accuracy */ if ( maxm < EPS6 ) return(1); /* normalize matrix */ dd = 1.0 / maxm; a11 = mat[0] * dd; a12 = mat[1] * dd; a13 = mat[2] * dd; a22 = mat[3] * dd; a23 = mat[4] * dd; a33 = mat[5] * dd; /* diagonal matrix */ maxd = fabs(a12); valm = fabs(a13); if ( valm > maxd ) maxd = valm; valm = fabs(a23); if ( valm > maxd ) maxd = valm; if ( maxd < EPSD ) return(1); a21 = a12; a31 = a13; a32 = a23; /* build characteristic polynomial P(X) = X^3 - trace X^2 + (somme des mineurs)X - det = 0 */ aa = a11*a22; bb = a23*a32; cc = a12*a21; dd = a13*a31; p[0] = a11*bb + a33*(cc-aa) + a22*dd -2.0*a12*a13*a23; p[1] = a11*(a22 + a33) + a22*a33 - bb - cc - dd; p[2] = -a11 - a22 - a33; p[3] = 1.0; } else { lambda[0] = (double)mat[0]; lambda[1] = (double)mat[4]; lambda[2] = (double)mat[8]; maxm = fabs(mat[0]); for (k=1; k<9; k++) { valm = fabs(mat[k]); if ( valm > maxm ) maxm = valm; } if ( maxm < EPS6 ) return(1); /* normalize matrix */ dd = 1.0 / maxm; a11 = mat[0] * dd; a12 = mat[1] * dd; a13 = mat[2] * dd; a21 = mat[3] * dd; a22 = mat[4] * dd; a23 = mat[5] * dd; a31 = mat[6] * dd; a32 = mat[7] * dd; a33 = mat[8] * dd; /* diagonal matrix */ maxd = fabs(a12); valm = fabs(a13); if ( valm > maxd ) maxd = valm; valm = fabs(a23); if ( valm > maxd ) maxd = valm; valm = fabs(a21); if ( valm > maxd ) maxd = valm; valm = fabs(a31); if ( valm > maxd ) maxd = valm; valm = fabs(a32); if ( valm > maxd ) maxd = valm; if ( maxd < EPSD ) return(1); /* build characteristic polynomial P(X) = X^3 - trace X^2 + (somme des mineurs)X - det = 0 */ aa = a22*a33 - a23*a32; bb = a23*a31 - a21*a33; cc = a21*a32 - a31*a22; ee = a11*a33 - a13*a31; ii = a11*a22 - a12*a21; p[0] = -a11*aa - a12*bb - a13*cc; p[1] = aa + ee + ii; p[2] = -a11 - a22 - a33; p[3] = 1.0; } /* solve polynomial (find roots using newton) */ n = newton3(p,lambda); if ( n <= 0 ) return(0); /* compute eigenvectors: an eigenvalue belong to orthogonal of Im(A-lambda*Id) */ v[0][0] = 1.0; v[0][1] = v[0][2] = 0.0; v[1][1] = 1.0; v[1][0] = v[1][2] = 0.0; v[2][2] = 1.0; v[2][0] = v[2][1] = 0.0; w1[1] = a12; w1[2] = a13; w2[0] = a21; w2[2] = a23; w3[0] = a31; w3[1] = a32; if ( n == 1 ) { /* vk = crsprd(wi,wj) */ for (k=0; k<3; k++) { w1[0] = a11 - lambda[k]; w2[1] = a22 - lambda[k]; w3[2] = a33 - lambda[k]; /* cross product vectors in (Im(A-lambda(i) Id) ortho */ vx1[0] = w1[1]*w3[2] - w1[2]*w3[1]; vx1[1] = w1[2]*w3[0] - w1[0]*w3[2]; vx1[2] = w1[0]*w3[1] - w1[1]*w3[0]; dd1 = vx1[0]*vx1[0] + vx1[1]*vx1[1] + vx1[2]*vx1[2]; vx2[0] = w1[1]*w2[2] - w1[2]*w2[1]; vx2[1] = w1[2]*w2[0] - w1[0]*w2[2]; vx2[2] = w1[0]*w2[1] - w1[1]*w2[0]; dd2 = vx2[0]*vx2[0] + vx2[1]*vx2[1] + vx2[2]*vx2[2]; vx3[0] = w2[1]*w3[2] - w2[2]*w3[1]; vx3[1] = w2[2]*w3[0] - w2[0]*w3[2]; vx3[2] = w2[0]*w3[1] - w2[1]*w3[0]; dd3 = vx3[0]*vx3[0] + vx3[1]*vx3[1] + vx3[2]*vx3[2]; /* find vector of max norm */ if ( dd1 > dd2 ) { if ( dd1 > dd3 ) { dd1 = 1.0 / sqrt(dd1); v[k][0] = vx1[0] * dd1; v[k][1] = vx1[1] * dd1; v[k][2] = vx1[2] * dd1; } else { dd3 = 1.0 / sqrt(dd3); v[k][0] = vx3[0] * dd3; v[k][1] = vx3[1] * dd3; v[k][2] = vx3[2] * dd3; } } else { if ( dd2 > dd3 ) { dd2 = 1.0 / sqrt(dd2); v[k][0] = vx2[0] * dd2; v[k][1] = vx2[1] * dd2; v[k][2] = vx2[2] * dd2; } else { dd3 = 1.0 / sqrt(dd3); v[k][0] = vx3[0] * dd3; v[k][1] = vx3[1] * dd3; v[k][2] = vx3[2] * dd3; } } } } /* (vp1,vp2) double, vp3 simple root */ else if ( n == 2 ) { w1[0] = a11 - lambda[2]; w2[1] = a22 - lambda[2]; w3[2] = a33 - lambda[2]; /* cross product */ vx1[0] = w1[1]*w3[2] - w1[2]*w3[1]; vx1[1] = w1[2]*w3[0] - w1[0]*w3[2]; vx1[2] = w1[0]*w3[1] - w1[1]*w3[0]; dd1 = vx1[0]*vx1[0] + vx1[1]*vx1[1] + vx1[2]*vx1[2]; vx2[0] = w1[1]*w2[2] - w1[2]*w2[1]; vx2[1] = w1[2]*w2[0] - w1[0]*w2[2]; vx2[2] = w1[0]*w2[1] - w1[1]*w2[0]; dd2 = vx2[0]*vx2[0] + vx2[1]*vx2[1] + vx2[2]*vx2[2]; vx3[0] = w2[1]*w3[2] - w2[2]*w3[1]; vx3[1] = w2[2]*w3[0] - w2[0]*w3[2]; vx3[2] = w2[0]*w3[1] - w2[1]*w3[0]; dd3 = vx3[0]*vx3[0] + vx3[1]*vx3[1] + vx3[2]*vx3[2]; /* find vector of max norm */ if ( dd1 > dd2 ) { if ( dd1 > dd3 ) { dd1 = 1.0 / sqrt(dd1); v[2][0] = vx1[0] * dd1; v[2][1] = vx1[1] * dd1; v[2][2] = vx1[2] * dd1; } else { dd3 = 1.0 / sqrt(dd3); v[2][0] = vx3[0] * dd3; v[2][1] = vx3[1] * dd3; v[2][2] = vx3[2] * dd3; } } else { if ( dd2 > dd3 ) { dd2 = 1.0 / sqrt(dd2); v[2][0] = vx2[0] * dd2; v[2][1] = vx2[1] * dd2; v[2][2] = vx2[2] * dd2; } else { dd3 = 1.0 / sqrt(dd3); v[2][0] = vx3[0] * dd3; v[2][1] = vx3[1] * dd3; v[2][2] = vx3[2] * dd3; } } /* compute v1 and v2 in Im(A-vp3*Id) */ dd1 = w1[0]*w1[0] + w1[1]*w1[1] + w1[2]*w1[2]; dd2 = w2[0]*w2[0] + w2[1]*w2[1] + w2[2]*w2[2]; if ( dd1 > dd2 ) { dd1 = 1.0 / sqrt(dd1); v[0][0] = w1[0]*dd1; v[0][1] = w1[1]*dd1; v[0][2] = w1[2]*dd1; } else { dd2 = 1.0 / sqrt(dd2); v[0][0] = w2[0]*dd2; v[0][1] = w2[1]*dd2; v[0][2] = w2[2]*dd2; } /* 3rd vector orthogonal */ v[1][0] = v[2][1]*v[0][2] - v[2][2]*v[0][1]; v[1][1] = v[2][2]*v[0][0] - v[2][0]*v[0][2]; v[1][2] = v[2][0]*v[0][1] - v[2][1]*v[0][0]; dd1 = v[1][0]*v[1][0] + v[1][1]*v[1][1] + v[1][2]*v[1][2]; dd1 = 1.0 / sqrt(dd1); v[1][0] *= dd1; v[1][1] *= dd1; v[1][2] *= dd1; } lambda[0] *= maxm; lambda[1] *= maxm; lambda[2] *= maxm; /* check accuracy */ /*------------------------------------------------------------------- if ( ddebug && symmat ) { double err,tmpx,tmpy,tmpz; float m[6]; int i,j; k = 0; for (i=0; i<3; i++) for (j=i; j<3; j++) m[k++] = lambda[0]*v[i][0]*v[j][0] + lambda[1]*v[i][1]*v[j][1] + lambda[2]*v[i][2]*v[j][2]; err = fabs(mat[0]-m[0]); for (i=1; i<6; i++) if ( fabs(m[i]-mat[i]) > err ) err = fabs(m[i]-mat[i]); if ( err > 1.e03*maxm ) { printf("\nProbleme eigenv3: err= %f\n",err*maxm); printf("mat depart :\n"); printf("%13.6f %13.6f %13.6f\n",mat[0],mat[1],mat[2]); printf("%13.6f %13.6f %13.6f\n",mat[1],mat[3],mat[4]); printf("%13.6f %13.6f %13.6f\n",mat[2],mat[4],mat[5]); printf("mat finale :\n"); printf("%13.6f %13.6f %13.6f\n",m[0],m[1],m[2]); printf("%13.6f %13.6f %13.6f\n",m[1],m[3],m[4]); printf("%13.6f %13.6f %13.6f\n",m[2],m[4],m[5]); printf("lambda : %f %f %f\n",lambda[0],lambda[1],lambda[2]); printf(" ordre %d\n",n); printf("\nOrtho:\n"); printf("v1.v2 = %.14f\n", v[0][0]*v[1][0]+v[0][1]*v[1][1]+ v[0][2]*v[1][2]); printf("v1.v3 = %.14f\n", v[0][0]*v[2][0]+v[0][1]*v[2][1]+ v[0][2]*v[2][2]); printf("v2.v3 = %.14f\n", v[1][0]*v[2][0]+v[1][1]*v[2][1]+ v[1][2]*v[2][2]); printf("Consistency\n"); for (i=0; i<3; i++) { tmpx = v[0][i]*m[0] + v[1][i]*m[1] + v[2][i]*m[2] - lambda[i]*v[0][i]; tmpy = v[0][i]*m[1] + v[1][i]*m[3] + v[2][i]*m[4] - lambda[i]*v[1][i]; tmpz = v[0][i]*m[2] + v[1][i]*m[4] + v[2][i]*m[5] - lambda[i]*v[2][i]; printf(" Av %d - lambda %d *v %d = %f %f %f\n", i,i,i,tmpx,tmpy,tmpz); printf("w1 %f %f %f\n",w1[0],w1[1],w1[2]); printf("w2 %f %f %f\n",w2[0],w2[1],w2[2]); printf("w3 %f %f %f\n",w3[0],w3[1],w3[2]); } exit(1); } } -------------------------------------------------------------------*/ return(n); } /* eigen value + vector extraction */ int eigen2(double *mm,double *lambda,double vp[2][2]) { double m[3],dd,a1,xn,ddeltb,rr1,rr2,ux,uy; /* init */ ux = 1.0; uy = 0.0; /* normalize */ memcpy(m,mm,3*sizeof(double)); xn = fabs(m[0]); if ( fabs(m[1]) > xn ) xn = fabs(m[1]); if ( fabs(m[2]) > xn ) xn = fabs(m[2]); if ( xn < EPSD2 ) { lambda[0] = lambda[1] = 0.0; vp[0][0] = 1.0; vp[0][1] = 0.0; vp[1][0] = 0.0; vp[1][1] = 1.0; return(1); } xn = 1.0 / xn; m[0] *= xn; m[1] *= xn; m[2] *= xn; if ( egal(m[1],0.0) ) { rr1 = m[0]; rr2 = m[2]; goto vect; } /* eigenvalues of jacobian */ a1 = -(m[0] + m[2]); ddeltb = a1*a1 - 4.0 * (m[0]*m[2] - m[1]*m[1]); if ( ddeltb < 0.0 ) { fprintf(stderr," Delta: %f\n",ddeltb); ddeltb = 0.0; } ddeltb = sqrt(ddeltb); if ( fabs(a1) < EPS ) { rr1 = 0.5 * sqrt(ddeltb); rr2 = -rr1; } else if ( a1 < 0.0 ) { rr1 = 0.5 * (-a1 + ddeltb); rr2 = (-m[1]*m[1] + m[0]*m[2]) / rr1; } else if ( a1 > 0.0 ) { rr1 = 0.5 * (-a1 - ddeltb); rr2 = (-m[1]*m[1] + m[0]*m[2]) / rr1; } else { rr1 = 0.5 * ddeltb; rr2 = -rr1; } vect: xn = 1.0 / xn; lambda[0] = rr1 * xn; lambda[1] = rr2 * xn; /* eigenvectors */ a1 = m[0] - rr1; if ( fabs(a1)+fabs(m[1]) < EPS ) { if (fabs(lambda[1]) < fabs(lambda[0]) ) { ux = 1.0; uy = 0.0; } else { ux = 0.0; uy = 1.0; } } else if ( fabs(a1) < fabs(m[1]) ) { ux = 1.0; uy = -a1 / m[1]; } else if ( fabs(a1) > fabs(m[1]) ) { ux = -m[1] / a1; uy = 1.0; } else if ( fabs(lambda[1]) > fabs(lambda[0]) ) { ux = 0.0; uy = 1.0; } else { ux = 1.0; uy = 0.0; } dd = sqrt(ux*ux + uy*uy); dd = 1.0 / dd; if ( fabs(lambda[0]) > fabs(lambda[1]) ) { vp[0][0] = ux * dd; vp[0][1] = uy * dd; } else { vp[0][0] = uy * dd; vp[0][1] = -ux * dd; } /* orthogonal vector */ vp[1][0] = -vp[0][1]; vp[1][1] = vp[0][0]; return(1); } freefem++-3.38-1/src/libMesh/eigenv.h000644 000767 000024 00000000300 11436737460 017410 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif int eigenv(int symmat,double *mat,double lambda[3],double v[3][3]); int eigen2(double *mm,double *lambda,double vp[2][2]); #ifdef __cplusplus } #endif freefem++-3.38-1/src/libMesh/libmesh3.c000644 000767 000024 00000056167 11406142256 017650 0ustar00hechtstaff000000 000000 /*----------------------------------------------------------*/ /* */ /* LIBMESH V 3.0 */ /* */ /*----------------------------------------------------------*/ /* */ /* Description: handle .meshb file format I/O */ /* Author: Loic MARECHAL */ /* Creation date: aug 2 2003 */ /* Last modification: jan 25 2006 */ /* */ /*----------------------------------------------------------*/ /*----------------------------------------------------------*/ /* Includes */ /*----------------------------------------------------------*/ #include #include #include #include #include "libmesh3.h" /*----------------------------------------------------------*/ /* Global variables */ /*----------------------------------------------------------*/ char *LM_kw_table[ LM_NBKW + 1 ][3] = { {"Reserved", "", ""}, {"MeshVersionFormatted", "", "i"}, {"Reserved", "", ""}, {"Dimension", "", "i"}, {"Vertices", "i", "dri"}, {"Edges", "i", "iii"}, {"Triangles", "i", "iiii"}, {"Quadrilaterals", "i", "iiiii"}, {"Tetrahedra", "i", "iiiii"}, {"Pentahedra", "i", "iiiiiii"}, {"Hexahedra", "i", "iiiiiiiii"}, {"SubDomainFromGeom", "i", "iiii"}, {"SubDomainFromMesh", "i", "iiii"}, {"Corners", "i", "i"}, {"Ridges", "i", "i"}, {"RequiredVertices", "i", "i"}, {"RequiredEdges", "i", "i"}, {"RequiredTriangles", "i", "i"}, {"RequiredQuadrilaterals", "i", "i"}, {"TangentAtEdgeVertices", "i", "iii"}, {"NormalAtVertices", "i", "ii"}, {"NormalAtTriangleVertices", "i", "iii"}, {"NormalAtQuadrilateralVertices", "i", "iiii"}, {"AngleOfCornerBound", "", "r"}, {"Geometry", "", "c"}, {"VertexOnGeometricVertex", "i", "ii"}, {"VertexOnGeometricEdge", "i", "iir"}, {"VertexOnGeometricTriangle", "i", "iirr"}, {"VertexOnGeometricQuadrilateral", "i", "iirr"}, {"EdgeOnGeometricEdge", "i", "ii"}, {"TriangleOnGeometricTriangle", "i", "ii"}, {"TriangleOnGeometricQuadrilateral", "i", "ii"}, {"QuadrilateralOnGeometricTriangle", "i", "ii"}, {"QuadrilateralOnGeometricQuadrilateral", "i", "ii"}, {"MeshSupportOfVertices", "", "c"}, {"VertexOnSupportVertex", "i", "ii"}, {"VertexOnSupportEdge", "i", "iir"}, {"VertexOnSupportTriangle", "i", "iirr"}, {"VertexOnSupportQuadrilateral", "i", "iirr"}, {"VertexOnSupportTetrahedron", "i", "iirrr"}, {"VertexOnSupportPentahedron", "i", "iirrr"}, {"VertexOnSupportHexahedron", "i", "iirrr"}, {"CrackedEdges", "i", "ii"}, {"CrackedTriangles", "i", "ii"}, {"CrackedQuadrilaterals", "i", "ii"}, {"EquivalentEdges", "i", "ii"}, {"EquivalentTriangles", "i", "ii"}, {"EquivalentQuadrilaterals", "i", "ii"}, {"PhysicsReference", "i", "ic"}, {"IncludeFile", "", "c"}, {"BoundingBox", "", "drdr"}, {"Identifier", "", "c"}, {"IdentityOfGeometry", "", "c"}, {"IdentityOfMeshSupport", "", "c"}, {"End", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Tangents", "i", "dr"}, {"Normals", "i", "dr"}, {"TangentAtVertices", "i", "ii"}, {"SolAtVertices", "i", "sr"}, {"SolAtEdges", "i", "sr"}, {"SolAtTriangles", "i", "sr"}, {"SolAtQuadrilaterals", "i", "sr"}, {"SolAtTetrahedra", "i", "sr"}, {"SolAtPentahedra", "i", "sr"}, {"SolAtHexahedra", "i", "sr"}, {"DSolAtVertices", "i", "sr"}, {"ISolAtVertices", "i", "i"}, {"ISolAtEdges", "i", "ii"}, {"ISolAtTriangles", "i", "iii"}, {"ISolAtQuadrilaterals", "i", "iiii"}, {"ISolAtTetrahedra", "i", "iiii"}, {"ISolAtPentahedra", "i", "iiiiii"}, {"ISolAtHexahedra", "i", "iiiiiiii"}, {"Iterations","","i"}, {"Time","","r"}, {"VertexHack","","drdr"} }; /*----------------------------------------------------------*/ /* Prototypes of local procedures */ /*----------------------------------------------------------*/ static void write_kw(LM_mesh_struct *, int); static int read_int(LM_mesh_struct *); static void write_int(LM_mesh_struct *, int); static void file2kw_tab(LM_mesh_struct *); static void kw_tab2file(LM_mesh_struct *); static int expand_format(LM_mesh_struct *, int, char *); static void swap_bytes(void *, void *, int); static void read_sol_headers(LM_mesh_struct *); /*----------------------------------------------------------*/ /* Open a mesh file in read or write mode */ /*----------------------------------------------------------*/ int LM_open_mesh(const char *filename, int mode, LM_mesh_struct *mesh, ...) { int i; va_list pa; /*---------------------*/ /* MESH STRUCTURE INIT */ /*---------------------*/ /* Init the kw table */ for(i=0;i<=LM_NBKW;i++) { mesh->kw_counters[i] = 0; mesh->kw_pos[i][0] = 0; mesh->kw_pos[i][1] = 0; mesh->kw_pos[i][2] = 0; mesh->sol_headers[i] = NULL; } /* Allocate a string large enough to contain the full filename and path plus the ".meshb" extension. */ mesh->filename = (char *)calloc((strlen(filename) + 7), sizeof(char)); strcpy(mesh->filename, filename); /* Store the opening mode (read or write) and guess the filetype (binary or ascii) depending on the extension */ mesh->mode = mode; mesh->current_kw = mesh->type = 0; mesh->endian = 1; if(strstr(mesh->filename, ".meshb")) mesh->type |= (LM_BINARY | LM_MESH); else if(strstr(mesh->filename, ".mesh")) mesh->type |= (LM_ASCII | LM_MESH); else if(strstr(mesh->filename, ".solb")) mesh->type |= (LM_BINARY | LM_SOL); else if(strstr(mesh->filename, ".sol")) mesh->type |= (LM_ASCII | LM_SOL); else return(0); /* Open the file in the required mode and initialyse the mesh structure */ if(mesh->mode == LM_READ) { /*-----------------------*/ /* OPEN FILE FOR READING */ /*-----------------------*/ /* Create the name string and open the file */ if(!(mesh->handle = fopen(mesh->filename, "rb"))) return(0); /* Read the endian tag and the mesh version in binary */ if(mesh->type & LM_BINARY) { mesh->endian = read_int(mesh); if( (mesh->endian != 1) && (mesh->endian != 16777216) ) return(0); mesh->version = read_int(mesh); } /*------------*/ /* KW READING */ /*------------*/ /* Read the list of kw present in the file */ file2kw_tab(mesh); /* Check the mesh dimension */ if(!mesh->kw_counters[ LM_Dimension ]) return(0); LM_read_field(mesh, LM_Dimension, 1, &mesh->dimension); if( (mesh->dimension != 2) && (mesh->dimension != 3) ) return(0); /* Read the meshversion in ascii case */ if(mesh->type & LM_ASCII) LM_read_field(mesh, LM_MeshVersionFormatted, 1, &mesh->version); /* And read the extended sol headers */ read_sol_headers(mesh); } else if(mesh->mode == LM_WRITE) { /*-----------------------*/ /* OPEN FILE FOR WRITING */ /*-----------------------*/ /* Check if the user provided a valid dimension */ va_start(pa, mesh); mesh->dimension = va_arg(pa, int); va_end(pa); if( (mesh->dimension != 2) && (mesh->dimension != 3) ) return(0); /* If no extension has been provided, create a binary file */ if(!(mesh->handle = fopen(mesh->filename, "wb"))) return(0); /*------------*/ /* KW WRITING */ /*------------*/ /* Initialyse the required fields. The kw will be stored afterward. */ mesh->version = LM_MESH_VERSION; mesh->endian = 1; /* Write the mesh version */ if(mesh->type & LM_ASCII) LM_write_field(mesh, LM_MeshVersionFormatted, 1, &mesh->version); else { write_int(mesh, mesh->endian); write_int(mesh, mesh->version); } /* Write the mesh dimension */ LM_write_field(mesh, LM_Dimension, 1, &mesh->dimension); } else return(0); return(1); } /*----------------------------------------------------------*/ /* Close a meshfile in the right way */ /*----------------------------------------------------------*/ int LM_close_mesh(LM_mesh_struct *mesh) { if(mesh->mode == LM_WRITE) { /* Test if the user wrote the "End" kw */ if(!mesh->kw_counters[ LM_End ]) LM_write_field(mesh, LM_End, 0, NULL); /* Write down the number lines written in each field to the file */ kw_tab2file(mesh); } if(fclose(mesh->handle)) return(0); else return(1); } /*----------------------------------------------------------*/ /* Bufferized read of a whole orpart of a field */ /*----------------------------------------------------------*/ int LM_read_field(LM_mesh_struct *mesh, int kw_code, int nbl, void *buffer) { int i, j, swaped, size, *int_buffer = (int *)buffer, string_size; float *flt_buffer = (float *)buffer; char format[256], letter, str_buf[256]; /* Check if the kw code is valid */ if( (kw_code < 1) || (kw_code > LM_NBKW) ) return(0); /* Check if this kw has a format */ if(!strlen(LM_kw_table[ kw_code ][2])) return(0); /* If this kw is only a header, the number of lines to be read is set to one */ if(!strlen(LM_kw_table[ kw_code ][1])) nbl = 1; /* Check if the user is not asking more lines than the remaining lines in the file */ if(nbl > mesh->kw_counters[ kw_code ] - mesh->kw_pos[ kw_code ][2]) nbl = mesh->kw_counters[ kw_code ] - mesh->kw_pos[ kw_code ][2]; if(!nbl) return(0); /* Set the curent position in file to the begining of this kw's data */ fseek(mesh->handle, mesh->kw_pos[ kw_code ][1], SEEK_SET); /* Transform the internal format into a "c" format string for the scanf and compute the size of field's line in order to compute the right adresses in the buffer */ size = expand_format(mesh, kw_code, format); if(mesh->type & LM_ASCII) { for(i=0;ihandle, "%d", &int_buffer[ i * size + j ]); else if(format[j] == 'r') fscanf(mesh->handle, "%g", &flt_buffer[ i * size + j ]); else if(format[j] == 'c') { string_size = 0; do { fscanf(mesh->handle, "%c", &letter); }while(letter != '"'); do { fscanf(mesh->handle, "%c", &letter); str_buf[ string_size++ ] = letter; }while( (letter != '"') && (string_size <= 256) ); str_buf[ string_size-1 ] = 0; memset(&flt_buffer[ i * size + j ], 0, 256); strcpy((char *)&flt_buffer[ i * size + j ], str_buf); } } else { fread(buffer, nbl * size * 4, 1, mesh->handle); /* Swap the bytes in the whole buffer in case of different endian */ if(mesh->endian != 1) for(i=0;ikw_pos[ kw_code ][1] = ftell(mesh->handle); mesh->kw_pos[ kw_code ][2] += nbl; return(nbl); } /*----------------------------------------------------------*/ /* Bufferized write of a whole field or part of it */ /*----------------------------------------------------------*/ int LM_write_field(LM_mesh_struct *mesh, int kw_code, int nbl, void *buffer, ...) { int i, j, size, *int_buffer = (int *)buffer, nbsol; float *flt_buffer = (float *)buffer; char format[256]; va_list pa; /* Check if the kw code is valid */ if( (kw_code < 1) || (kw_code > LM_NBKW) ) return(0); /* Read further arguments if this kw is solution field and the extra header was not provided by the user */ if(!mesh->sol_headers[ kw_code ] && !strcmp(LM_kw_table[ kw_code ][2], "sr")) { va_start(pa, buffer); nbsol = va_arg(pa, int); if(!(mesh->sol_headers[ kw_code ] = malloc((nbsol+2) * sizeof(int)))) return(0); mesh->sol_headers[ kw_code ][0] = nbsol; mesh->sol_headers[ kw_code ][1] = 0; for(i=1;i<=nbsol;i++) { mesh->sol_headers[ kw_code ][i+1] = va_arg(pa, int); switch(mesh->sol_headers[ kw_code ][i+1]) { case 1 : mesh->sol_headers[ kw_code ][1] += 1; break; case 2 : mesh->sol_headers[ kw_code ][1] += mesh->dimension; break; case 3 : mesh->sol_headers[ kw_code ][1] += (mesh->dimension * (mesh->dimension+1)) / 2; break; case 4 : mesh->sol_headers[ kw_code ][1] += mesh->dimension * mesh->dimension; break; } } va_end(pa); } /* If this kw is only a header, the number of lines to be read is set to one */ if(!strlen(LM_kw_table[ kw_code ][1])) nbl = 1; if(!mesh->kw_counters[ kw_code ]) write_kw(mesh, kw_code); mesh->kw_counters[ kw_code ] += nbl; /* Check if this kw has a format */ if(!strlen(LM_kw_table[ kw_code ][2])) return(0); size = expand_format(mesh, kw_code, format); if(mesh->type & LM_ASCII) { for(i=0;ihandle, "%d ", int_buffer[ i * size + j ]); else if(format[j] == 'r') fprintf(mesh->handle, "%g ", flt_buffer[ i * size + j ]); else if(format[j] == 'c') { fputc('"', mesh->handle); fprintf(mesh->handle, "%s", (char *)&flt_buffer[ i * size + j ]); fputc('"', mesh->handle); } fprintf(mesh->handle, "\n"); } } else fwrite(buffer, nbl * size * 4, 1, mesh->handle); mesh->kw_pos[ kw_code ][1] = ftell(mesh->handle); return(1); } /*----------------------------------------------------------*/ /* Single line read */ /*----------------------------------------------------------*/ int LM_read_line(LM_mesh_struct *mesh, int kw_code, ...) { float buffer[10], *ptr_flt; int i, size; char format[256]; va_list pa; /* Check wether this kw is not a simple header */ if(!strlen(LM_kw_table[ kw_code ][2])) return(0); /* Get a one line buffer */ LM_read_field(mesh, kw_code, 1, buffer); /* Start decoding the arguments */ va_start(pa, kw_code); size = expand_format(mesh, kw_code, format); for(i=0;itype & LM_ASCII) { /* Scan each string of the file until the end */ while(fscanf(mesh->handle, "%s", str) != EOF) { /* Fast test in order to reject quickly the numeric values */ if(isalpha(str[0])) { /* Search which kw code this string is associated with */ for(kw_code=1; kw_code<= LM_NBKW; kw_code++) if(!strcmp(str, LM_kw_table[ kw_code ][0])) { /* The base position (0) in the file is set right after the kw */ mesh->kw_pos[ kw_code ][0] = ftell(mesh->handle); /* If this kw has a header, read the number of lines */ if(!strcmp(LM_kw_table[ kw_code ][1], "i")) mesh->kw_counters[ kw_code ] = read_int(mesh); else mesh->kw_counters[ kw_code ] = 1; /* The curent position (1) in the file is set right before the data */ mesh->kw_pos[ kw_code ][1] = ftell(mesh->handle); break; } } else if(str[0] == '#') while(fgetc(mesh->handle) != '\n'); } } else { /* Jump through kw positions in the file */ do { kw_code = read_int(mesh); /* Check if this kw belongs to this mesh version */ if( (kw_code >= 1) && (kw_code <= LM_NBKW) ) { /* The base position (0) in the file is set right after the kw */ mesh->kw_pos[ kw_code ][0] = ftell(mesh->handle); /* Read the next kw position */ next_pos = read_int(mesh); /* If this kw has a header, read the number of lines */ if(!strcmp(LM_kw_table[ kw_code ][1], "i")) mesh->kw_counters[ kw_code ] = read_int(mesh); else mesh->kw_counters[ kw_code ] = 1; /* The curent position (1) in the file is set right before the data */ mesh->kw_pos[ kw_code ][1] = ftell(mesh->handle); } else { /* Otherwise, read the next kw position in order to skip these unknown kw */ next_pos = read_int(mesh); } /* Go to the next kw */ if(next_pos) fseek(mesh->handle, next_pos, SEEK_SET); }while(next_pos); } } /*----------------------------------------------------------*/ /* Update the number of lines written for each kw */ /*----------------------------------------------------------*/ static void kw_tab2file(LM_mesh_struct *mesh) { int i; for(i=1;i<=LM_NBKW;i++) if( mesh->kw_counters[i] && strlen(LM_kw_table[i][2]) ) write_kw(mesh, i); } /*----------------------------------------------------------*/ /* Write the string associated with the kw code */ /*----------------------------------------------------------*/ static void write_kw(LM_mesh_struct *mesh, int kw_code) { int i; if(mesh->type & LM_ASCII) { /* Test if it is the first time this kw is written */ if(!mesh->kw_counters[ kw_code ]) { /* If so, write the string and reserve some place afterward in order to store the number of lines */ fprintf(mesh->handle, "\n%s\n", LM_kw_table[ kw_code ][0]); mesh->kw_pos[ kw_code ][0] = ftell(mesh->handle); if(!strcmp("i", LM_kw_table[ kw_code ][1])) fprintf(mesh->handle, " \n"); /* In case of solution field, write the extended header at once */ if(mesh->sol_headers[ kw_code ]) { fprintf(mesh->handle, "%d ", mesh->sol_headers[ kw_code ][0]); for(i=1;i<=mesh->sol_headers[ kw_code ][0];i++) fprintf(mesh->handle, "%d ", mesh->sol_headers[ kw_code ][i+1]); fprintf(mesh->handle, "\n\n"); } /* Store the positions right after the kw in order to write the number of lines at closing time. Store the position right before the data for the write_field process. */ mesh->kw_pos[ kw_code ][1] = ftell(mesh->handle); } else { /* If this kw has already be written in the file and has a header, go to pos(0) and write down the final value */ if(strcmp("i", LM_kw_table[ kw_code ][1])) return; fseek(mesh->handle, mesh->kw_pos[ kw_code][0], SEEK_SET); fprintf(mesh->handle, "%d\n", mesh->kw_counters[ kw_code ]); } } else { /* Test if it is the first time this kw is written */ if(!mesh->kw_counters[ kw_code ]) { /* If so, write the code, store the position afterward, reserve an int for the next kw position and write the number of lines */ write_int(mesh, kw_code); mesh->kw_pos[ kw_code ][0] = ftell(mesh->handle); write_int(mesh, 0); /* Set the next kw pos in the previously written kw */ if(mesh->current_kw) { fseek(mesh->handle, mesh->kw_pos[ mesh->current_kw ][0], SEEK_SET); write_int(mesh, mesh->kw_pos[ kw_code ][0] - 4); fseek(mesh->handle, mesh->kw_pos[ kw_code ][0] + 4, SEEK_SET); } mesh->current_kw = kw_code; if(!strcmp("i", LM_kw_table[ kw_code ][1])) write_int(mesh, 0); /* In case of solution field, write the extended header at once */ if(mesh->sol_headers[ kw_code ]) { write_int(mesh, mesh->sol_headers[ kw_code ][0]); for(i=1;i<=mesh->sol_headers[ kw_code ][0];i++) write_int(mesh, mesh->sol_headers[ kw_code ][i+1]); } mesh->kw_pos[ kw_code ][1] = ftell(mesh->handle); } else { /* Write the number of lines written at closing time */ if(strcmp("i", LM_kw_table[ kw_code ][1])) return; fseek(mesh->handle, mesh->kw_pos[ kw_code ][0] + 4, SEEK_SET); write_int(mesh, mesh->kw_counters[ kw_code ]); } } } /*----------------------------------------------------------*/ /* Read an integer in a mesh file */ /*----------------------------------------------------------*/ static int read_int(LM_mesh_struct *mesh) { int swaped, integer = 0; if(mesh->type & LM_ASCII) fscanf(mesh->handle, "%d", &integer); else { /* Read a 4 bytes block in the file */ fread(&integer, 4, 1, mesh->handle); if(mesh->endian != 1) { swap_bytes((void *)&integer, (void *)&swaped, 4); integer = swaped; } } return(integer); } /*----------------------------------------------------------*/ /* Write an integer in a mesh file */ /*----------------------------------------------------------*/ static void write_int(LM_mesh_struct *mesh, int integer) { if(mesh->type & LM_ASCII) fprintf(mesh->handle, "%d ", integer); else fwrite(&integer, 4, 1, mesh->handle); } /*----------------------------------------------------------*/ /* Convert little endian <-> big endian */ /*----------------------------------------------------------*/ static void swap_bytes(void *c1, void *c2, int nbytes) { int k; char *c11, *c22; c11 = (char*)c1; c22 = (char*)c2; for (k=0; kdimension times */ duplicate_next = mesh->dimension; } else if(in_format[i] == 's') { /* 's' means duplicate the next character mesh->solsize times */ duplicate_next = mesh->sol_headers[ kw_code ][1]; } } /* Return the sum of item to be read */ return(size); } /*----------------------------------------------------------*/ /* Read the extended sol headers */ /*----------------------------------------------------------*/ static void read_sol_headers(LM_mesh_struct *mesh) { int i, j, nbsol, solsize; for(i=1;i<=LM_NBKW;i++) { /* If the kw is a special Sol field, read the extended header */ if(!mesh->kw_counters[i] || strcmp(LM_kw_table[i][2], "sr")) continue; /* Set the curent position in file to the begining of this kw's data */ fseek(mesh->handle, mesh->kw_pos[i][1], SEEK_SET); nbsol = read_int(mesh); if( (mesh->sol_headers[i] = malloc((nbsol+2) * sizeof(int)))) { mesh->sol_headers[i][0] = nbsol; solsize = 0; for(j=1;j<=nbsol;j++) { mesh->sol_headers[i][j+1] = read_int(mesh); switch(mesh->sol_headers[i][j+1]) { case LM_SCALAR : solsize += 1; break; case LM_VECTOR : solsize += mesh->dimension; break; case LM_SYM_MATRIX : solsize += (mesh->dimension * (mesh->dimension+1)) / 2; break; case LM_MATRIX : solsize += mesh->dimension * mesh->dimension; break; } mesh->sol_headers[i][1] = solsize; } mesh->kw_pos[i][1] = ftell(mesh->handle); } } } freefem++-3.38-1/src/libMesh/libmesh3.h000644 000767 000024 00000010026 11406142256 017635 0ustar00hechtstaff000000 000000 /*----------------------------------------------------------*/ /* */ /* LIBMESH V 3.0 */ /* */ /*----------------------------------------------------------*/ /* */ /* Description: handle .meshb file format I/O */ /* Author: Loic MARECHAL */ /* Creation date: aug 02 2003 */ /* Last modification: jan 25 2006 */ /* */ /*----------------------------------------------------------*/ /*----------------------------------------------------------*/ /* Includes */ /*----------------------------------------------------------*/ #include #include #include /*----------------------------------------------------------*/ /* Defines */ /*----------------------------------------------------------*/ #define LM_NBKW 79 #define LM_MESH_VERSION 1 #define LM_INT 1 #define LM_REAL 2 #define LM_READ 1 #define LM_WRITE 2 #define LM_ASCII 1 #define LM_BINARY 2 #define LM_MESH 4 #define LM_SOL 8 #define LM_SCALAR 1 #define LM_VECTOR 2 #define LM_SYM_MATRIX 3 #define LM_MATRIX 4 enum LM_kw_tags { LM_Reserved1, \ LM_MeshVersionFormatted, \ LM_Reserved2, \ LM_Dimension, \ LM_Vertices, \ LM_Edges, \ LM_Triangles, \ LM_Quadrilaterals, \ LM_Tetrahedra, \ LM_Pentahedra, \ LM_Hexahedra, \ LM_SubDomainFromGeom, \ LM_SubDomainFromMesh, \ LM_Corners, \ LM_Ridges, \ LM_RequiredVertices, \ LM_RequiredEdges, \ LM_RequiredTriangles, \ LM_RequiredQuadrilaterals, \ LM_TangentAtEdgeVertices, \ LM_NormalAtVertices, \ LM_NormalAtTriangleVertices, \ LM_NormalAtQuadrilateralVertices, \ LM_AngleOfCornerBound, \ LM_Geometry, \ LM_VertexOnGeometricVertex, \ LM_VertexOnGeometricEdge, \ LM_VertexOnGeometricTriangle, \ LM_VertexOnGeometricQuadrilateral, \ LM_EdgeOnGeometricEdge, \ LM_TriangleOnGeometricTriangle, \ LM_TriangleOnGeometricQuadrilateral, \ LM_QuadrilateralOnGeometricTriangle, \ LM_QuadrilateralOnGeometricQuadrilateral, \ LM_MeshSupportOfVertices, \ LM_VertexOnSupportVertex, \ LM_VertexOnSupportEdge, \ LM_VertexOnSupportTriangle, \ LM_VertexOnSupportQuadrilateral, \ LM_VertexOnSupportTetrahedron, \ LM_VertexOnSupportPentahedron, \ LM_VertexOnSupportHexahedron, \ LM_CrackedEdges, \ LM_CrackedTriangles, \ LM_CrackedQuadrilaterals, \ LM_EquivalentEdges, \ LM_EquivalentTriangles, \ LM_EquivalentQuadrilaterals, \ LM_PhysicsReference, \ LM_IncludeFile, \ LM_BoundingBox, \ LM_Identifier, \ LM_IdentityOfGeometry, \ LM_IdentityOfMeshSupport, \ LM_End, \ LM_Reserved10, \ LM_Reserved11, \ LM_Reserved12, \ LM_Reserved13, \ LM_Tangents, \ LM_Normals, \ LM_TangentAtVertices, \ LM_SolAtVertices, \ LM_SolAtEdges, \ LM_SolAtTriangles, \ LM_SolAtQuadrilaterals, \ LM_SolAtTetrahedra, \ LM_SolAtPentahedra, \ LM_SolAtHexahedra, \ LM_DSolAtVertices, \ LM_ISolAtVertices, \ LM_ISolAtEdges, \ LM_ISolAtTriangles, \ LM_ISolAtQuadrilaterals, \ LM_ISolAtTetrahedra, \ LM_ISolAtPentahedra, \ LM_ISolAtHexahedra, \ LM_Iterations, \ LM_Time, \ LM_VertexHack }; /*----------------------------------------------------------*/ /* Structures */ /*----------------------------------------------------------*/ typedef struct { /* Public */ int dimension; int kw_counters[ LM_NBKW + 1 ]; int *sol_headers[ LM_NBKW + 1 ]; /* Private */ int version, mode, type, endian, current_kw; FILE *handle; char *filename; size_t kw_pos[ LM_NBKW + 1 ][3]; }LM_mesh_struct; /*----------------------------------------------------------*/ /* External tables and procedures */ /*----------------------------------------------------------*/ #ifdef __cplusplus extern "C" { #endif extern int LM_open_mesh(const char *, int, LM_mesh_struct *, ...); extern int LM_read_field(LM_mesh_struct *, int, int, void *); extern int LM_write_field(LM_mesh_struct *, int, int, void *, ...); extern int LM_read_line(LM_mesh_struct *, int, ...); extern int LM_write_line(LM_mesh_struct *, int, ...); extern int LM_close_mesh(LM_mesh_struct *); extern char *LM_kw_table[][3]; #ifdef __cplusplus } #endif freefem++-3.38-1/src/libMesh/libmesh5.c000644 000767 000024 00000064502 11406142256 017642 0ustar00hechtstaff000000 000000 /*----------------------------------------------------------*/ /* */ /* LIBMESH V 5.0 */ /* */ /*----------------------------------------------------------*/ /* */ /* Description: handle .meshb file format I/O */ /* Author: Loic MARECHAL */ /* Creation date: feb 16 2007 */ /* Last modification: jul 12 2007 */ /* */ /*----------------------------------------------------------*/ /*----------------------------------------------------------*/ /* Includes */ /*----------------------------------------------------------*/ #include #include #include #include #include #include #include #include "libmesh5.h" /*----------------------------------------------------------*/ /* Structures */ /*----------------------------------------------------------*/ typedef struct { int pos, typ, SolSiz, NmbLin, NmbTyp, TypTab[ GmfMaxTyp ]; char fmt[ GmfMaxTyp ]; }KwdSct; typedef struct { int dim, ver, iter, mod, typ, cod, NexKwdPos; double angle, bbox[3][2], time; KwdSct KwdTab[ GmfMaxKwd + 1 ]; FILE *hdl; char FilNam[ GmfStrSiz ]; }GmfMshSct; /*----------------------------------------------------------*/ /* Defines */ /*----------------------------------------------------------*/ #define Asc 1 #define Bin 2 #define MshFil 4 #define SolFil 8 #define MaxMsh 100 #define InfKwd 1 #define RegKwd 2 #define SolKwd 3 #define WrdSiz 4 /*----------------------------------------------------------*/ /* Global variables */ /*----------------------------------------------------------*/ int IniFlg=0; GmfMshSct *MshTab[ MaxMsh + 1 ]; char *KwdFmt[ GmfMaxKwd + 1 ][3] = { {"Reserved", "", ""}, {"MeshVersionFormatted", "", "i"}, {"Reserved", "", ""}, {"Dimension", "", "i"}, {"Vertices", "i", "dri"}, {"Edges", "i", "iii"}, {"Triangles", "i", "iiii"}, {"Quadrilaterals", "i", "iiiii"}, {"Tetrahedra", "i", "iiiii"}, {"Pentahedra", "i", "iiiiiii"}, {"Hexahedra", "i", "iiiiiiiii"}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Corners", "i", "i"}, {"Ridges", "i", "i"}, {"RequiredVertices", "i", "i"}, {"RequiredEdges", "i", "i"}, {"RequiredTriangles", "i", "i"}, {"RequiredQuadrilaterals", "i", "i"}, {"TangentAtEdgeVertices", "i", "iii"}, {"NormalAtVertices", "i", "ii"}, {"NormalAtTriangleVertices", "i", "iii"}, {"NormalAtQuadrilateralVertices", "i", "iiii"}, {"AngleOfCornerBound", "", "r"}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"BoundingBox", "", "drdr"}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"End", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Tangents", "i", "dr"}, {"Normals", "i", "dr"}, {"TangentAtVertices", "i", "ii"}, {"SolAtVertices", "i", "sr"}, {"SolAtEdges", "i", "sr"}, {"SolAtTriangles", "i", "sr"}, {"SolAtQuadrilaterals", "i", "sr"}, {"SolAtTetrahedra", "i", "sr"}, {"SolAtPentahedra", "i", "sr"}, {"SolAtHexahedra", "i", "sr"}, {"DSolAtVertices", "i", "sr"}, {"ISolAtVertices", "i", "i"}, {"ISolAtEdges", "i", "ii"}, {"ISolAtTriangles", "i", "iii"}, {"ISolAtQuadrilaterals", "i", "iiii"}, {"ISolAtTetrahedra", "i", "iiii"}, {"ISolAtPentahedra", "i", "iiiiii"}, {"ISolAtHexahedra", "i", "iiiiiiii"}, {"Iterations","","i"}, {"Time","","r"}, {"Reserved","",""} }; /*----------------------------------------------------------*/ /* Prototypes of local procedures */ /*----------------------------------------------------------*/ static void ScaWrd(GmfMshSct *, unsigned char *); static void ScaDblWrd(GmfMshSct *, unsigned char *); static void RecWrd(GmfMshSct *, unsigned char *); static void RecDblWrd(GmfMshSct *, unsigned char *); static int ScaKwdTab(GmfMshSct *); static void ExpFmt(GmfMshSct *, int); static void ScaKwdHdr(GmfMshSct *, int); /*----------------------------------------------------------*/ /* Open a mesh file in read or write mod */ /*----------------------------------------------------------*/ int GmfOpenMesh(const char *FilNam, int mod, ...) { int i, KwdCod, res, *PtrVer, *PtrDim, MshIdx=0; char str[ GmfStrSiz ]; va_list par; GmfMshSct *msh; if(!IniFlg) { for(i=0;i= GmfStrSiz) return(0); strcpy(msh->FilNam, FilNam); /* Store the opening mod (read or write) and guess the filetype (binary or ascii) depending on the extension */ msh->mod = mod; if(strstr(msh->FilNam, ".meshb")) msh->typ |= (Bin | MshFil); else if(strstr(msh->FilNam, ".mesh")) msh->typ |= (Asc | MshFil); else if(strstr(msh->FilNam, ".solb")) msh->typ |= (Bin | SolFil); else if(strstr(msh->FilNam, ".sol")) msh->typ |= (Asc | SolFil); else return(0); /* Open the file in the required mod and initialyse the mesh structure */ if(msh->mod == GmfRead) { /*-----------------------*/ /* OPEN FILE FOR READING */ /*-----------------------*/ va_start(par, mod); PtrVer = va_arg(par, int *); PtrDim = va_arg(par, int *); va_end(par); /* Create the name string and open the file */ if(!(msh->hdl = fopen(msh->FilNam, "rb"))) return(0); /* Read the endian coding tag, the mesh version and the mesh dimension (mandatory kwd) */ if(msh->typ & Bin) { fread((unsigned char *)&msh->cod, WrdSiz, 1, msh->hdl); if( (msh->cod != 1) && (msh->cod != 16777216) ) return(0); ScaWrd(msh, (unsigned char *)&msh->ver); ScaWrd(msh, (unsigned char *)&KwdCod); if(KwdCod != GmfDimension) return(0); ScaWrd(msh, (unsigned char *)&KwdCod); ScaWrd(msh, (unsigned char *)&msh->dim); } else { do { res = fscanf(msh->hdl, "%s", str); }while( (res != EOF) && strcmp(str, "MeshVersionFormatted") ); if(res == EOF) return(0); fscanf(msh->hdl, "%d", &msh->ver); do { res = fscanf(msh->hdl, "%s", str); }while( (res != EOF) && strcmp(str, "Dimension") ); if(res == EOF) return(0); fscanf(msh->hdl, "%d", &msh->dim); } if( (msh->dim != 2) && (msh->dim != 3) ) return(0); (*PtrVer) = msh->ver; (*PtrDim) = msh->dim; /*------------*/ /* KW READING */ /*------------*/ /* Read the list of kw present in the file */ if(!ScaKwdTab(msh)) return(0); MshTab[ MshIdx ] = msh; return(MshIdx); } else if(msh->mod == GmfWrite) { /*-----------------------*/ /* OPEN FILE FOR WRITING */ /*-----------------------*/ msh->cod = 1; /* Check if the user provided a valid version number and dimension */ va_start(par, mod); msh->ver = va_arg(par, int); msh->dim = va_arg(par, int); va_end(par); if( (msh->ver != 1) && (msh->ver != 2) ) return(0); if( (msh->dim != 2) && (msh->dim != 3) ) return(0); /* Create the mesh file */ if(!(msh->hdl = fopen(msh->FilNam, "wb"))) return(0); MshTab[ MshIdx ] = msh; /*------------*/ /* KW WRITING */ /*------------*/ /* Write the mesh version and dimension */ if(msh->typ & Asc) { fprintf(msh->hdl, "%s %d\n\n", KwdFmt[ GmfVersionFormatted ][0], msh->ver); fprintf(msh->hdl, "%s %d\n", KwdFmt[ GmfDimension ][0], msh->dim); } else { RecWrd(msh, (unsigned char *)&msh->cod); RecWrd(msh, (unsigned char *)&msh->ver); GmfSetKwd(MshIdx, GmfDimension, 0); RecWrd(msh, (unsigned char *)&msh->dim); } return(MshIdx); } else return(0); } /*----------------------------------------------------------*/ /* Close a meshfile in the right way */ /*----------------------------------------------------------*/ int GmfCloseMesh(int MshIdx) { int res = 1; GmfMshSct *msh; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); fflush(stdout); msh = MshTab[ MshIdx ]; /* In write down the "End" kw in write mode */ if(msh->mod == GmfWrite) if(msh->typ & Asc) fprintf(msh->hdl, "\n%s\n", KwdFmt[ GmfEnd ][0]); else GmfSetKwd(MshIdx, GmfEnd, 0); /* Close the file and free the mesh structure */ if(fclose(msh->hdl)) res = 0; free(msh); MshTab[ MshIdx ] = NULL; return(res); } /*----------------------------------------------------------*/ /* Read the number of lines and set the position to this kwd*/ /*----------------------------------------------------------*/ int GmfStatKwd(int MshIdx, int KwdCod, ...) { int i, *PtrNmbTyp, *PtrSolSiz, *TypTab; GmfMshSct *msh; KwdSct *kwd; va_list par; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) return(0); kwd = &msh->KwdTab[ KwdCod ]; if(!kwd->NmbLin) return(0); /* Read further arguments if this kw is a sol */ if(kwd->typ == SolKwd) { va_start(par, KwdCod); PtrNmbTyp = va_arg(par, int *); *PtrNmbTyp = kwd->NmbTyp; PtrSolSiz = va_arg(par, int *); *PtrSolSiz = kwd->SolSiz; TypTab = va_arg(par, int *); for(i=0;iNmbTyp;i++) TypTab[i] = kwd->TypTab[i]; va_end(par); } return(kwd->NmbLin); } /*----------------------------------------------------------*/ /* Set the current file position to a given kwd */ /*----------------------------------------------------------*/ int GmfGotoKwd(int MshIdx, int KwdCod) { GmfMshSct *msh; KwdSct *kwd; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) return(0); kwd = &msh->KwdTab[ KwdCod ]; if(!kwd->NmbLin) return(0); return(fseek(msh->hdl, kwd->pos, SEEK_SET)); } /*----------------------------------------------------------*/ /* Write the kwd and set the number of lines */ /*----------------------------------------------------------*/ int GmfSetKwd(int MshIdx, int KwdCod, ...) { int i, CurPos, NmbLin=0, NulPos=0, *TypTab; va_list par; GmfMshSct *msh; KwdSct *kwd; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) return(0); kwd = &msh->KwdTab[ KwdCod ]; /* Read further arguments if this kw has a header */ if(strlen(KwdFmt[ KwdCod ][1])) { va_start(par, KwdCod); NmbLin = va_arg(par, int); if(!strcmp(KwdFmt[ KwdCod ][2], "sr")) { kwd->NmbTyp = va_arg(par, int); TypTab = va_arg(par, int *); for(i=0;iNmbTyp;i++) kwd->TypTab[i] = TypTab[i]; } va_end(par); } /* Setup the kwd info */ ExpFmt(msh, KwdCod); if(!kwd->typ) return(0); else if(kwd->typ == InfKwd) kwd->NmbLin = 1; else kwd->NmbLin = NmbLin; /* Store the next kwd position in binary file */ if( (msh->typ & Bin) && msh->NexKwdPos ) { CurPos = ftell(msh->hdl); fseek(msh->hdl, msh->NexKwdPos, SEEK_SET); RecWrd(msh, (unsigned char *)&CurPos); fseek(msh->hdl, CurPos, SEEK_SET); } /* Write the header */ if(msh->typ & Asc) { fprintf(msh->hdl, "\n%s\n", KwdFmt[ KwdCod ][0]); if(kwd->typ != InfKwd) fprintf(msh->hdl, "%d\n", kwd->NmbLin); /* In case of solution field, write the extended header */ if(kwd->typ == SolKwd) { fprintf(msh->hdl, "%d ", kwd->NmbTyp); for(i=0;iNmbTyp;i++) fprintf(msh->hdl, "%d ", kwd->TypTab[i]); fprintf(msh->hdl, "\n\n"); } } else { RecWrd(msh, (unsigned char *)&KwdCod); msh->NexKwdPos = ftell(msh->hdl); RecWrd(msh, (unsigned char *)&NulPos); if(kwd->typ != InfKwd) RecWrd(msh, (unsigned char *)&kwd->NmbLin); /* In case of solution field, write the extended header at once */ if(kwd->typ == SolKwd) { RecWrd(msh, (unsigned char *)&kwd->NmbTyp); for(i=0;iNmbTyp;i++) RecWrd(msh, (unsigned char *)&kwd->TypTab[i]); } } return(kwd->NmbLin); } /*----------------------------------------------------------*/ /* Read a full line from the current kwd */ /*----------------------------------------------------------*/ void GmfGetLin(int MshIdx, int KwdCod, ...) { double *DblPtr, *DblSolTab; float *FltPtr, *FltSolTab; int i, j, *IntPtr; va_list par; GmfMshSct *msh = MshTab[ MshIdx ]; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; /* Start decoding the arguments */ va_start(par, KwdCod); if(kwd->typ != SolKwd) { if(msh->ver == 1) { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { FltPtr = va_arg(par, float *); fscanf(msh->hdl, "%f", FltPtr); } else { IntPtr = va_arg(par, int *); fscanf(msh->hdl, "%d", IntPtr); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { FltPtr = va_arg(par, float *); ScaWrd(msh, (unsigned char *)FltPtr); } else { IntPtr = va_arg(par, int *); ScaWrd(msh, (unsigned char *)IntPtr); } } } } else { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { DblPtr = va_arg(par, double *); fscanf(msh->hdl, "%lf", DblPtr); } else { IntPtr = va_arg(par, int *); fscanf(msh->hdl, "%d", IntPtr); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { DblPtr = va_arg(par, double *); ScaDblWrd(msh, (unsigned char *)DblPtr); } else { IntPtr = va_arg(par, int *); ScaWrd(msh, (unsigned char *)IntPtr); } } } } } else { if(msh->ver == 1) { FltSolTab = va_arg(par, float *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fscanf(msh->hdl, "%f", &FltSolTab[j]); else for(j=0;jSolSiz;j++) ScaWrd(msh, (unsigned char *)&FltSolTab[j]); } else if(msh->ver == 2) { DblSolTab = va_arg(par, double *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fscanf(msh->hdl, "%lf", &DblSolTab[j]); else for(j=0;jSolSiz;j++) ScaDblWrd(msh, (unsigned char *)&DblSolTab[j]); } } va_end(par); } /*----------------------------------------------------------*/ /* Write a full line from the current kwd */ /*----------------------------------------------------------*/ void GmfSetLin(int MshIdx, int KwdCod, ...) { double d, *DblSolTab; float f, *FltSolTab; int i, j; va_list par; GmfMshSct *msh = MshTab[ MshIdx ]; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; /* Start decoding the arguments */ va_start(par, KwdCod); if(kwd->typ != SolKwd) { if(msh->ver == 1) { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); fprintf(msh->hdl, "%g ", (float)d); } else { j = va_arg(par, int); fprintf(msh->hdl, "%d ", j); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); f = d; RecWrd(msh, (unsigned char *)&f); } else { j = va_arg(par, int); RecWrd(msh, (unsigned char *)&j); } } } } else { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); fprintf(msh->hdl, "%.15lg ", d); } else { j = va_arg(par, int); fprintf(msh->hdl, "%d ", j); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); RecDblWrd(msh, (unsigned char *)&d); } else { j = va_arg(par, int); RecWrd(msh, (unsigned char *)&j); } } } } } else { if(msh->ver == 1) { FltSolTab = va_arg(par, float *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fprintf(msh->hdl, "%g ", FltSolTab[j]); else for(j=0;jSolSiz;j++) RecWrd(msh, (unsigned char *)&FltSolTab[j]); } else if(msh->ver == 2) { DblSolTab = va_arg(par, double *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fprintf(msh->hdl, "%.15lg ", DblSolTab[j]); else for(j=0;jSolSiz;j++) RecDblWrd(msh, (unsigned char *)&DblSolTab[j]); } } va_end(par); if(msh->typ & Asc) fprintf(msh->hdl, "\n"); } /*----------------------------------------------------------*/ /* Private procedure for transmesh : copy a whole line */ /*----------------------------------------------------------*/ void GmfCpyLin(int InpIdx, int OutIdx, int KwdCod) { double d; float f; int i, a; GmfMshSct *InpMsh = MshTab[ InpIdx ], *OutMsh = MshTab[ OutIdx ]; KwdSct *kwd = &InpMsh->KwdTab[ KwdCod ]; for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { if(InpMsh->ver == 1) { if(InpMsh->typ & Asc) fscanf(InpMsh->hdl, "%f", &f); else ScaWrd(InpMsh, (unsigned char *)&f); d = f; } else { if(InpMsh->typ & Asc) fscanf(InpMsh->hdl, "%lf", &d); else ScaDblWrd(InpMsh, (unsigned char *)&d); f = (float)d; } if(OutMsh->ver == 1) if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "%g ", f); else RecWrd(OutMsh, (unsigned char *)&f); else if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "%.15g ", d); else RecDblWrd(OutMsh, (unsigned char *)&d); } else { if(InpMsh->typ & Asc) fscanf(InpMsh->hdl, "%d", &a); else ScaWrd(InpMsh, (unsigned char *)&a); if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "%d ", a); else RecWrd(OutMsh, (unsigned char *)&a); } } if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "\n"); } /*----------------------------------------------------------*/ /* Find every kw present in a meshfile */ /*----------------------------------------------------------*/ static int ScaKwdTab(GmfMshSct *msh) { int KwdCod, NexPos, CurPos, EndPos; char str[ GmfStrSiz ]; if(msh->typ & Asc) { /* Scan each string in the file until the end */ while(fscanf(msh->hdl, "%s", str) != EOF) { /* Fast test in order to reject quickly the numeric values */ if(isalpha(str[0])) { /* Search which kwd code this string is associated with, then get its header and save the curent position in file (just before the data) */ for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++) if(!strcmp(str, KwdFmt[ KwdCod ][0])) { ScaKwdHdr(msh, KwdCod); break; } } else if(str[0] == '#') while(fgetc(msh->hdl) != '\n'); } } else { /* Get file size */ CurPos = ftell(msh->hdl); fseek(msh->hdl, 0, SEEK_END); EndPos = ftell(msh->hdl); fseek(msh->hdl, CurPos, SEEK_SET); /* Jump through kwd positions in the file */ do { /* Get the kwd code and the next kwd position */ ScaWrd(msh, (unsigned char *)&KwdCod); ScaWrd(msh, (unsigned char *)&NexPos); if(NexPos > EndPos) return(0); /* Check if this kwd belongs to this mesh version */ if( (KwdCod >= 1) && (KwdCod <= GmfMaxKwd) ) ScaKwdHdr(msh, KwdCod); /* Go to the next kwd */ if(NexPos) fseek(msh->hdl, NexPos, SEEK_SET); }while(NexPos && (KwdCod != GmfEnd)); } return(1); } /*----------------------------------------------------------*/ /* Read and setup the keyword's header */ /*----------------------------------------------------------*/ static void ScaKwdHdr(GmfMshSct *msh, int KwdCod) { int i; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; if(!strcmp("i", KwdFmt[ KwdCod ][1])) { if(msh->typ & Asc) fscanf(msh->hdl, "%d", &kwd->NmbLin); else ScaWrd(msh, (unsigned char *)&kwd->NmbLin); } else kwd->NmbLin = 1; if(!strcmp("sr", KwdFmt[ KwdCod ][2])) { if(msh->typ & Asc) { fscanf(msh->hdl, "%d", &kwd->NmbTyp); for(i=0;iNmbTyp;i++) fscanf(msh->hdl, "%d", &kwd->TypTab[i]); } else { ScaWrd(msh, (unsigned char *)&kwd->NmbTyp); for(i=0;iNmbTyp;i++) ScaWrd(msh, (unsigned char *)&kwd->TypTab[i]); } } ExpFmt(msh, KwdCod); kwd->pos = ftell(msh->hdl); } /*----------------------------------------------------------*/ /* Expand the compacted format and compute the line size */ /*----------------------------------------------------------*/ static void ExpFmt(GmfMshSct *msh, int KwdCod) { int i, j, TmpSiz=0; char chr, *InpFmt = KwdFmt[ KwdCod ][2]; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; /* Set the kwd's type */ if(!strlen(KwdFmt[ KwdCod ][1])) kwd->typ = InfKwd; else if(!strcmp(InpFmt, "sr")) kwd->typ = SolKwd; else kwd->typ = RegKwd; /* Get the solution-field's size */ if(kwd->typ == SolKwd) for(i=0;iNmbTyp;i++) switch(kwd->TypTab[i]) { case GmfSca : TmpSiz += 1; break; case GmfVec : TmpSiz += msh->dim; break; case GmfSymMat : TmpSiz += (msh->dim * (msh->dim+1)) / 2; break; case GmfMat : TmpSiz += msh->dim * msh->dim; break; } /* Scan each character from the format string */ i = 0; while(i < (int) strlen(InpFmt)) { chr = InpFmt[ i++ ]; if(chr == 'd') { chr = InpFmt[i++]; for(j=0;jdim;j++) kwd->fmt[ kwd->SolSiz++ ] = chr; } else if(chr == 's') { chr = InpFmt[i++]; for(j=0;jfmt[ kwd->SolSiz++ ] = chr; } else kwd->fmt[ kwd->SolSiz++ ] = chr; } } /*----------------------------------------------------------*/ /* Read a four bytes word in a mesh file */ /*----------------------------------------------------------*/ static void ScaWrd(GmfMshSct *msh, unsigned char *wrd) { unsigned char swp; fread(wrd, WrdSiz, 1, msh->hdl); if(msh->cod == 1) return; swp = wrd[3]; wrd[3] = wrd[0]; wrd[0] = swp; swp = wrd[2]; wrd[2] = wrd[1]; wrd[1] = swp; } /*----------------------------------------------------------*/ /* Read an eight bytes word in a mesh file */ /*----------------------------------------------------------*/ static void ScaDblWrd(GmfMshSct *msh, unsigned char *wrd) { int i; unsigned char swp; fread(wrd, WrdSiz, 2, msh->hdl); if(msh->cod == 1) return; for(i=0;i<4;i++) { swp = wrd[7-i]; wrd[7-i] = wrd[i]; wrd[i] = swp; } } /*----------------------------------------------------------*/ /* Write a four bytes word in a mesh file */ /*----------------------------------------------------------*/ static void RecWrd(GmfMshSct *msh, unsigned char *wrd) { fwrite(wrd, WrdSiz, 1, msh->hdl); } /*----------------------------------------------------------*/ /* Write an eight bytes word in a mesh file */ /*----------------------------------------------------------*/ static void RecDblWrd(GmfMshSct *msh, unsigned char *wrd) { fwrite(wrd, WrdSiz, 2, msh->hdl); } /*----------------------------------------------------------*/ /* Fortran 77 API */ /*----------------------------------------------------------*/ int call(gmfopenmeshf77)(char *FilNam, int *mod, int *ver, int *dim, int StrSiz) { int i; char TmpNam[ GmfStrSiz ]; for(i=0;i&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libMesh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libMesh_a_AR = $(AR) $(ARFLAGS) libMesh_a_LIBADD = am_libMesh_a_OBJECTS = chrono.$(OBJEXT) eigenv.$(OBJEXT) \ libmesh3.$(OBJEXT) libmesh5.$(OBJEXT) memory.$(OBJEXT) libMesh_a_OBJECTS = $(am_libMesh_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libMesh_a_SOURCES) DIST_SOURCES = $(libMesh_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libMesh.a libMesh_a_SOURCES = \ chrono.c eigenv.c libmesh3.c libmesh5.c memory.c \ chrono.h eigenv.h libmesh3.h libmesh5.h memory.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libMesh/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libMesh/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libMesh.a: $(libMesh_a_OBJECTS) $(libMesh_a_DEPENDENCIES) $(EXTRA_libMesh_a_DEPENDENCIES) $(AM_V_at)-rm -f libMesh.a $(AM_V_AR)$(libMesh_a_AR) libMesh.a $(libMesh_a_OBJECTS) $(libMesh_a_LIBADD) $(AM_V_at)$(RANLIB) libMesh.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chrono.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eigenv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmesh3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmesh5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/libMesh/memory.c000644 000767 000024 00000014233 11406142256 017436 0ustar00hechtstaff000000 000000 /* file : memory.c * C code for memory debugging, to be used in lieu * of standard memory functions */ #include #include #include #include #include "memory.h" typedef struct memstack { size_t size; void *ptr; int nxt; char call[30]; } Memstack; typedef Memstack * pMemstack; const int MAXMEM = 300; pMemstack mstack; int stack,cur; int M_memLeak() { int i,c=0; for (i=1; i<=MAXMEM; i++) if (mstack[i].ptr) c++; return(c); } /* print out allocated pointers */ void M_memDump() { size_t size; int i,c; static long mega = 1024 * 1024; static long kilo = 1024; fprintf(stdout,"\n -- MEMORY USAGE\n"); fprintf(stdout," Allocated pointers\n"); size = 0; c = 0; for (i=1; i<=MAXMEM; i++) if ( mstack[i].ptr ) { fprintf(stdout," %3d %3d Pointer %10p size ",++c,i,mstack[i].ptr); if (mstack[i].size > mega) fprintf(stdout," %10d Mbytes ",(int)(mstack[i].size/mega)); else if (mstack[i].size > kilo) fprintf(stdout," %10d Kbytes ",(int)(mstack[i].size/kilo)); else fprintf(stdout," %10d bytes ",(int)(mstack[i].size)); fprintf(stdout,"(%s)\n",mstack[i].call); size += mstack[i].size; } fprintf(stdout," Memory leaks "); if ( size > mega ) fprintf(stdout," %10d Mbytes %d pointers\n",(int)(size/mega),c); else if ( size > kilo ) fprintf(stdout," %10d Kbytes %d pointers\n",(int)(size/kilo),c); else if ( size ) fprintf(stdout," %10d bytes %d pointers\n",(int)size,c); } /* Returns allocated memory space in bytes */ size_t M_memSize() { size_t size; int i; size = 0; for (i=1; i<=MAXMEM; i++) if ( mstack[i].ptr ) size += mstack[i].size; return size; } /* Allocates space for a block of at least size bytes, but does not initialize the space. */ void *M_malloc(size_t size,char *call) { int i; /* check if first call */ if ( !mstack ) { mstack = (Memstack *)calloc((1+MAXMEM),sizeof(Memstack)); assert(mstack); for (i=1; i= nelem * elsize bytes. */ void *M_calloc(size_t nelem, size_t elsize,char *call) { int i; /* check if first call */ if ( !mstack ) { mstack = (Memstack *)calloc((1+MAXMEM),sizeof(Memstack)); assert(mstack); for (i=1; i 1024*1024) fprintf(stdout," Total size : %10Zd Mbytes", (long int)(memsize/(1024.*1024.))); else if (memsize > 1024) fprintf(stdout," Total size : %10Zd Kbytes",(long int)(memsize/1024.)); else fprintf(stdout," Total size : %10Zd bytes ",(long int)memsize); fprintf(stdout," (i.e. %d bytes/point)\n",memsize / np); } } freefem++-3.38-1/src/libMesh/memory.h000644 000767 000024 00000000625 11406142256 017443 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif #include #include /* prototype (re)definitions */ void *M_malloc(size_t size,char *call); void *M_calloc(size_t nelem,size_t elsize,char *call); void *M_realloc(void *ptr, size_t size,char *call); void M_free(void *ptr); /* ptototypes : tools */ int M_memLeak(); void M_memDump(); size_t M_memSize(); #ifdef __cplusplus } #endif freefem++-3.38-1/src/lglib/lg.tab.cpp000644 000767 000024 00000347733 12520223352 017354 0ustar00hechtstaff000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse lgparse #define yylex lglex #define yyerror lgerror #define yylval lglval #define yychar lgchar #define yydebug lgdebug #define yynerrs lgnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { IF = 258, ELSE = 259, SET = 260, GTGT = 261, LTLT = 262, OR = 263, AND = 264, NE = 265, EQ = 266, GE = 267, LE = 268, DOTSLASH = 269, DOTSTAR = 270, MOINSMOINS = 271, PLUSPLUS = 272, UNARY = 273, LNUM = 274, DNUM = 275, CNUM = 276, ID = 277, FESPACEID = 278, IDPARAM = 279, STRING = 280, ENDOFFILE = 281, INCLUDE = 282, LOAD = 283, BIDON = 284, FOR = 285, WHILE = 286, BREAK = 287, CONTINUE = 288, RETURN = 289, TRY = 290, CATCH = 291, THROW = 292, TYPE = 293, FUNCTION = 294, FESPACE = 295, FESPACE1 = 296, FESPACE3 = 297, PLUSEQ = 298, MOINSEQ = 299, MULEQ = 300, DIVEQ = 301, DOTMULEQ = 302, DOTDIVEQ = 303, ARROW = 304, BORDER = 305, CURVE = 306, SOLVE = 307 }; #endif /* Tokens. */ #define IF 258 #define ELSE 259 #define SET 260 #define GTGT 261 #define LTLT 262 #define OR 263 #define AND 264 #define NE 265 #define EQ 266 #define GE 267 #define LE 268 #define DOTSLASH 269 #define DOTSTAR 270 #define MOINSMOINS 271 #define PLUSPLUS 272 #define UNARY 273 #define LNUM 274 #define DNUM 275 #define CNUM 276 #define ID 277 #define FESPACEID 278 #define IDPARAM 279 #define STRING 280 #define ENDOFFILE 281 #define INCLUDE 282 #define LOAD 283 #define BIDON 284 #define FOR 285 #define WHILE 286 #define BREAK 287 #define CONTINUE 288 #define RETURN 289 #define TRY 290 #define CATCH 291 #define THROW 292 #define TYPE 293 #define FUNCTION 294 #define FESPACE 295 #define FESPACE1 296 #define FESPACE3 297 #define PLUSEQ 298 #define MOINSEQ 299 #define MULEQ 300 #define DIVEQ 301 #define DOTMULEQ 302 #define DOTDIVEQ 303 #define ARROW 304 #define BORDER 305 #define CURVE 306 #define SOLVE 307 /* Copy the first part of user declarations. */ #line 3 "lg.ypp" // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config-wrapper.h" #include #include #include // for reset cout,cin in windows dll #ifdef _WIN32 #include #include #include #endif #include "error.hpp" class Iden; #include "strversionnumber.hpp" #include "InitFunct.hpp" #ifdef __MWERKS__ #ifdef __INTEL__ #include #else #include #endif #endif #include "RNM.hpp" #include "AFunction.hpp" // to reserve space to graphical pointer function #include "rgraph.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lex.hpp" #include "environment.hpp" extern long storageused(); extern FILE *ThePlotStream; extern KN *pkarg; class Routine; bool load(string s); template class FE; template class FE_; extern mylex *zzzfff; // modif FH for window to have 1 dll for mpi and none mpi .. extern void (*initparallele)(int &, char **&); extern void (*init_lgparallele)(); // extern void (*end_parallele)(); // #ifdef HAVE_LIBARPACK void init_eigenvalue(); #endif aType dcltype; const int nbembtype=10; aType rettype[nbembtype]; Block * routineinblock[nbembtype]; // Add FH july 2005 pb clean on return int kkembtype=-1; int inloopcount=0; /// <> Block class from [[file:../fflib/AFunction.hpp::Block]] Block *currentblock; // Add FH july 2005 // problem clean variable after break,continue and return. const int sizeStackOfLoop=100; Block * StackOfLoop[sizeStackOfLoop]; // end ADD double CPUcompileInit =0; //class pfes; C_F0 fespacetype; bool fespacecomplex; int fespacedim; extern int UnShowAlloc; int ShowAlloc(const char *s,size_t &); // <> Connection from grammar to lexer object zzzfff [[file:../fflib/lex.hpp::zzzfff]] of class mylex // [[file:../fflib/lex.hpp::class mylex]]. Method mylex::scan() is implemented at [[file:../fflib/lex.cpp::mylex_scan]] inline int yylex() {return zzzfff->scan();} inline int lineno() {return zzzfff->lineno();} extern bool withrgraphique; /// <> inline void fingraphique() { if(withrgraphique) { withrgraphique=false; rattente(1); closegraphique(); }} void lgerror (const char* s) ; // mpi ptr to function ... void (*initparallele)(int &argc, char **& argv)=0 ; void (*init_lgparallele)()=0; //void (*end_parallele)()=0; // Add dec 2014 #include typedef void (*AtEnd)(); vector AtFFEnd; void ff_finalize() { for (vector::const_reverse_iterator i=AtFFEnd.rbegin(); i !=AtFFEnd.rend(); ++ i) (**i)(); AtFFEnd.clear(); } void ff_atend(AtEnd f) { AtFFEnd.push_back(f); } /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 1 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 156 "lg.ypp" { double dnum; long lnum; char * str; char oper[8]; CC_F0 cexp; Routine *routine; AC_F0 args; aType type; CListOfInst cinst; Block * block; ListOfId *clist_id; /* ListCatch * clist_Catchs;*/ } /* Line 193 of yacc.c. */ #line 373 "lg.tab.cpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 386 "lg.tab.cpp" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 81 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 1058 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 78 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 45 /* YYNRULES -- Number of rules. */ #define YYNRULES 191 /* YYNRULES -- Number of states. */ #define YYNSTATES 418 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 307 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 27, 2, 2, 2, 24, 12, 32, 34, 37, 22, 20, 5, 21, 36, 23, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 77, 73, 16, 6, 17, 76, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 35, 2, 38, 31, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 10, 75, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 7, 8, 9, 11, 13, 14, 15, 18, 19, 25, 26, 28, 29, 30, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 6, 8, 10, 13, 14, 16, 20, 23, 27, 30, 34, 37, 41, 45, 49, 55, 61, 66, 72, 77, 83, 88, 94, 96, 100, 102, 104, 106, 108, 110, 114, 119, 123, 125, 128, 131, 134, 138, 142, 148, 150, 155, 163, 170, 180, 185, 193, 203, 205, 210, 214, 218, 225, 231, 236, 243, 245, 247, 249, 251, 256, 258, 262, 264, 268, 271, 277, 282, 284, 288, 289, 294, 298, 301, 307, 308, 319, 320, 330, 332, 334, 336, 338, 339, 343, 345, 347, 350, 353, 359, 362, 364, 374, 384, 390, 396, 404, 408, 412, 419, 422, 425, 429, 437, 445, 455, 458, 460, 464, 466, 468, 470, 472, 474, 476, 480, 484, 488, 492, 496, 500, 504, 506, 512, 516, 522, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 602, 604, 608, 614, 615, 617, 619, 621, 625, 627, 631, 635, 639, 643, 649, 651, 655, 657, 660, 662, 666, 670, 673, 675, 677, 679, 681, 683, 688, 693, 700, 704, 708, 712, 717, 721, 726, 730, 735, 738, 741, 746, 750 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 79, 0, -1, 80, 46, -1, 81, -1, 108, -1, 81, 108, -1, -1, 84, -1, 84, 6, 114, -1, 60, 84, -1, 60, 12, 84, -1, 62, 84, -1, 62, 12, 84, -1, 87, 84, -1, 87, 12, 84, -1, 35, 82, 38, -1, 82, 5, 84, -1, 82, 5, 35, 82, 38, -1, 82, 5, 84, 6, 114, -1, 82, 5, 60, 84, -1, 82, 5, 60, 12, 84, -1, 82, 5, 62, 84, -1, 82, 5, 62, 12, 84, -1, 82, 5, 87, 84, -1, 82, 5, 87, 12, 84, -1, 84, -1, 83, 5, 84, -1, 42, -1, 60, -1, 62, -1, 61, -1, 42, -1, 42, 6, 114, -1, 42, 34, 86, 37, -1, 85, 5, 85, -1, 115, -1, 60, 42, -1, 61, 42, -1, 62, 42, -1, 42, 6, 115, -1, 86, 5, 115, -1, 86, 5, 84, 6, 115, -1, 58, -1, 58, 35, 58, 38, -1, 58, 35, 58, 38, 35, 58, 38, -1, 58, 35, 58, 5, 58, 38, -1, 58, 35, 58, 5, 58, 38, 35, 58, 38, -1, 58, 16, 58, 17, -1, 58, 16, 58, 17, 35, 58, 38, -1, 58, 16, 58, 17, 35, 58, 5, 58, 38, -1, 42, -1, 42, 35, 115, 38, -1, 42, 6, 115, -1, 35, 83, 38, -1, 35, 83, 38, 35, 115, 38, -1, 35, 83, 38, 6, 115, -1, 42, 34, 115, 37, -1, 35, 83, 38, 34, 115, 37, -1, 60, -1, 61, -1, 62, -1, 90, -1, 90, 16, 58, 17, -1, 89, -1, 92, 5, 89, -1, 88, -1, 93, 5, 88, -1, 91, 93, -1, 91, 35, 58, 38, 92, -1, 42, 34, 86, 37, -1, 95, -1, 96, 5, 95, -1, -1, 87, 98, 85, 73, -1, 43, 96, 73, -1, 94, 73, -1, 59, 42, 6, 112, 73, -1, -1, 59, 87, 42, 34, 82, 37, 99, 74, 81, 75, -1, -1, 59, 42, 34, 82, 37, 100, 6, 114, 73, -1, 74, -1, 75, -1, 50, -1, 51, -1, -1, 87, 106, 85, -1, 55, -1, 73, -1, 47, 45, -1, 48, 45, -1, 107, 74, 81, 75, 109, -1, 112, 73, -1, 97, -1, 103, 34, 112, 73, 112, 73, 112, 37, 108, -1, 103, 34, 105, 73, 112, 73, 112, 37, 108, -1, 104, 34, 112, 37, 108, -1, 3, 34, 112, 37, 108, -1, 3, 34, 112, 37, 108, 4, 108, -1, 101, 81, 102, -1, 70, 42, 111, -1, 70, 42, 35, 119, 38, 73, -1, 52, 73, -1, 53, 73, -1, 54, 112, 73, -1, 56, 34, 36, 36, 36, 37, 108, -1, 34, 42, 6, 112, 5, 112, 37, -1, 34, 42, 6, 112, 5, 112, 73, 42, 37, -1, 110, 108, -1, 114, -1, 112, 5, 112, -1, 21, -1, 20, -1, 27, -1, 29, -1, 28, -1, 115, -1, 115, 6, 114, -1, 115, 63, 114, -1, 115, 64, 114, -1, 115, 65, 114, -1, 115, 66, 114, -1, 115, 67, 114, -1, 115, 68, 114, -1, 116, -1, 116, 76, 116, 77, 116, -1, 116, 77, 116, -1, 116, 77, 116, 77, 116, -1, 120, -1, 116, 22, 116, -1, 116, 26, 116, -1, 116, 25, 116, -1, 116, 23, 116, -1, 116, 24, 116, -1, 116, 20, 116, -1, 116, 21, 116, -1, 116, 9, 116, -1, 116, 8, 116, -1, 116, 12, 116, -1, 116, 13, 116, -1, 116, 10, 116, -1, 116, 11, 116, -1, 116, 16, 116, -1, 116, 19, 116, -1, 116, 17, 116, -1, 116, 18, 116, -1, 116, 15, 116, -1, 116, 14, 116, -1, 116, -1, 77, -1, 116, 77, 116, -1, 116, 77, 116, 77, 116, -1, -1, 60, -1, 61, -1, 62, -1, 84, 6, 115, -1, 117, -1, 118, 5, 60, -1, 118, 5, 61, -1, 118, 5, 62, -1, 118, 5, 117, -1, 118, 5, 84, 6, 115, -1, 114, -1, 119, 5, 114, -1, 121, -1, 113, 121, -1, 122, -1, 122, 31, 120, -1, 122, 33, 120, -1, 122, 32, -1, 42, -1, 39, -1, 40, -1, 41, -1, 45, -1, 122, 34, 118, 37, -1, 122, 35, 117, 38, -1, 122, 35, 117, 5, 117, 38, -1, 122, 35, 38, -1, 122, 36, 42, -1, 60, 36, 42, -1, 60, 34, 118, 37, -1, 61, 36, 42, -1, 61, 34, 118, 37, -1, 62, 36, 42, -1, 62, 34, 118, 37, -1, 122, 29, -1, 122, 28, -1, 58, 34, 112, 37, -1, 34, 112, 37, -1, 35, 119, 38, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 289, 289, 341, 346, 347, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 373, 374, 379, 379, 379, 379, 383, 384, 385, 387, 394, 395, 396, 397, 398, 399, 400, 405, 406, 407, 408, 409, 410, 411, 412, 420, 421, 422, 423, 424, 425, 428, 429, 435, 435, 435, 436, 437, 442, 443, 445, 446, 448, 449, 455, 458, 459, 464, 464, 465, 466, 467, 469, 468, 485, 484, 493, 494, 496, 498, 503, 503, 506, 510, 511, 512, 513, 514, 515, 516, 517, 521, 522, 523, 524, 526, 528, 531, 535, 539, 546, 549, 556, 566, 574, 575, 581, 582, 583, 584, 585, 591, 592, 593, 594, 595, 596, 597, 598, 604, 605, 606, 607, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 639, 640, 641, 642, 648, 649, 650, 651, 654, 656, 657, 658, 659, 660, 663, 666, 667, 672, 673, 678, 679, 680, 681, 691, 693, 694, 695, 696, 701, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 724, 725 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "IF", "ELSE", "','", "'='", "SET", "GTGT", "LTLT", "'|'", "OR", "'&'", "AND", "NE", "EQ", "'<'", "'>'", "GE", "LE", "'+'", "'-'", "'*'", "'/'", "'%'", "DOTSLASH", "DOTSTAR", "'!'", "MOINSMOINS", "PLUSPLUS", "UNARY", "'^'", "'''", "'_'", "'('", "'['", "'.'", "')'", "']'", "LNUM", "DNUM", "CNUM", "ID", "FESPACEID", "IDPARAM", "STRING", "ENDOFFILE", "INCLUDE", "LOAD", "BIDON", "FOR", "WHILE", "BREAK", "CONTINUE", "RETURN", "TRY", "CATCH", "THROW", "TYPE", "FUNCTION", "FESPACE", "FESPACE1", "FESPACE3", "PLUSEQ", "MOINSEQ", "MULEQ", "DIVEQ", "DOTMULEQ", "DOTDIVEQ", "ARROW", "BORDER", "CURVE", "SOLVE", "';'", "'{'", "'}'", "'?'", "':'", "$accept", "start", "input", "instructions", "list_of_id_args", "list_of_id1", "id", "list_of_dcls", "parameters_list", "type_of_dcl", "ID_space", "ID_array_space", "fespace123", "fespace", "spaceIDa", "spaceIDb", "spaceIDs", "fespace_def", "fespace_def_list", "declaration", "@1", "@2", "@3", "begin", "end", "for_loop", "while_loop", "declaration_for", "@4", "try", "instruction", "catchs", "bornes", "border_expr", "Expr", "unop", "no_comma_expr", "no_set_expr", "no_ternary_expr", "sub_script_expr", "parameters", "array", "unary_expr", "pow_expr", "primary", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 44, 61, 260, 261, 262, 124, 263, 38, 264, 265, 266, 60, 62, 267, 268, 43, 45, 42, 47, 37, 269, 270, 33, 271, 272, 273, 94, 39, 95, 40, 91, 46, 41, 93, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 59, 123, 125, 63, 58 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 78, 79, 80, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 96, 96, 98, 97, 97, 97, 97, 99, 97, 100, 97, 101, 102, 103, 104, 106, 105, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 110, 110, 111, 112, 112, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 120, 120, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 1, 1, 2, 0, 1, 3, 2, 3, 2, 3, 2, 3, 3, 3, 5, 5, 4, 5, 4, 5, 4, 5, 1, 3, 1, 1, 1, 1, 1, 3, 4, 3, 1, 2, 2, 2, 3, 3, 5, 1, 4, 7, 6, 9, 4, 7, 9, 1, 4, 3, 3, 6, 5, 4, 6, 1, 1, 1, 1, 4, 1, 3, 1, 3, 2, 5, 4, 1, 3, 0, 4, 3, 2, 5, 0, 10, 0, 9, 1, 1, 1, 1, 0, 3, 1, 1, 2, 2, 5, 2, 1, 9, 9, 5, 5, 7, 3, 3, 6, 2, 2, 3, 7, 7, 9, 2, 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 5, 3, 5, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 3, 5, 0, 1, 1, 1, 3, 1, 3, 3, 3, 3, 5, 1, 3, 1, 2, 1, 3, 3, 2, 1, 1, 1, 1, 1, 4, 4, 6, 3, 3, 3, 4, 3, 4, 3, 4, 2, 2, 4, 3, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 112, 111, 113, 115, 114, 0, 0, 172, 173, 174, 171, 0, 175, 0, 0, 83, 84, 0, 0, 0, 87, 42, 0, 58, 59, 60, 0, 88, 81, 0, 0, 3, 72, 61, 0, 0, 93, 0, 0, 0, 0, 4, 0, 0, 109, 116, 124, 128, 165, 167, 0, 0, 0, 0, 0, 0, 163, 0, 0, 70, 0, 89, 90, 102, 103, 0, 0, 0, 0, 0, 42, 0, 152, 0, 152, 0, 152, 0, 0, 1, 2, 5, 0, 0, 0, 50, 65, 67, 75, 0, 0, 0, 0, 0, 92, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 187, 0, 170, 0, 152, 0, 0, 0, 190, 0, 191, 0, 0, 74, 104, 0, 0, 0, 0, 6, 0, 171, 153, 154, 155, 149, 0, 148, 157, 0, 181, 0, 183, 0, 185, 0, 0, 0, 100, 31, 0, 0, 27, 0, 28, 30, 29, 0, 25, 0, 0, 0, 82, 99, 85, 0, 0, 0, 0, 110, 117, 118, 119, 120, 121, 122, 123, 137, 136, 140, 141, 138, 139, 147, 146, 142, 144, 145, 143, 134, 135, 129, 132, 133, 131, 130, 0, 126, 168, 169, 0, 179, 0, 180, 0, 164, 171, 0, 0, 0, 0, 35, 71, 47, 189, 0, 43, 0, 6, 28, 29, 0, 7, 0, 6, 0, 0, 0, 182, 184, 186, 0, 0, 108, 0, 0, 0, 73, 62, 0, 0, 53, 52, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 176, 0, 177, 97, 0, 36, 37, 38, 0, 69, 0, 0, 0, 76, 0, 0, 9, 0, 11, 0, 79, 0, 0, 13, 0, 156, 150, 158, 159, 160, 0, 161, 0, 0, 32, 0, 34, 0, 0, 63, 68, 26, 0, 0, 51, 86, 0, 0, 96, 0, 91, 125, 127, 0, 0, 39, 28, 30, 29, 0, 40, 0, 45, 0, 15, 10, 12, 6, 28, 29, 16, 0, 0, 8, 14, 77, 0, 0, 0, 101, 33, 0, 0, 0, 55, 0, 0, 0, 0, 178, 98, 0, 0, 48, 0, 44, 0, 0, 19, 0, 21, 0, 0, 23, 0, 0, 151, 162, 0, 0, 0, 64, 54, 0, 0, 0, 41, 0, 0, 17, 20, 22, 18, 24, 0, 0, 110, 0, 56, 0, 0, 0, 49, 46, 80, 0, 106, 0, 0, 95, 94, 0, 78, 0, 57, 0, 107, 105 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 31, 32, 33, 238, 174, 153, 167, 227, 34, 88, 309, 35, 36, 310, 89, 37, 61, 62, 38, 84, 375, 342, 39, 180, 40, 41, 182, 263, 42, 43, 320, 164, 165, 44, 45, 46, 47, 48, 155, 156, 59, 49, 50, 51 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -230 static const yytype_int16 yypact[] = { 576, 20, -230, -230, -230, -230, -230, 222, 222, -230, -230, -230, -230, 24, -230, 79, 90, -230, -230, 97, 139, 222, -230, 212, 150, 21, 110, 204, 99, -230, -230, 182, 183, 576, -230, 199, 17, 168, -230, 576, 210, 221, 184, -230, 2, 945, -230, 39, 15, -230, -230, 791, 222, 241, 21, 110, 204, 112, -230, 46, 242, -230, 3, -230, -230, -230, -230, 4, 220, 222, 238, 114, 27, 260, 732, 261, 732, 263, 732, 265, 231, -230, -230, -230, 266, 252, 7, 38, -230, 309, -230, 356, 864, 222, 576, 222, -230, -230, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, -230, -230, 222, -230, 222, 732, 688, 273, 129, -230, 222, -230, 900, 24, -230, -230, 300, 154, 48, 222, 251, 284, 313, 14, 36, 151, -230, 314, 426, -230, 169, -230, 170, -230, 172, -230, 307, 222, 576, -230, 198, 6, 333, -230, 315, -230, -230, -230, 89, -230, 222, 222, 136, -230, -230, -230, 281, 8, 174, 454, -230, -230, -230, -230, -230, -230, -230, -230, 1017, 1017, 1032, 1032, 447, 447, 762, 762, 399, 399, 399, 399, 320, 320, -230, -230, -230, -230, -230, 643, 662, -230, -230, 176, -230, 104, -230, 576, -230, 349, 243, 253, 264, 179, -230, -230, 321, -230, 302, 323, 9, 251, 51, 68, 181, 355, 77, 251, 222, 222, 776, -230, -230, -230, 357, 109, -230, 222, 900, 266, -230, -230, 188, 192, 126, -230, 324, 192, -230, 266, 222, 222, 576, 308, 222, 222, -230, 820, -230, 361, 222, -230, -230, -230, 936, -230, 311, 332, 316, -230, 113, 192, -230, 192, -230, 676, -230, 222, 192, -230, 185, -230, 681, 14, 36, 151, 369, -230, 222, 305, -230, 189, -230, 192, 345, -230, 375, -230, 222, 222, -230, 376, 10, 12, -230, 352, -230, 1000, 1000, 350, 576, -230, 21, 110, 204, 381, -230, 116, 354, 362, -230, -230, -230, 251, 103, 138, 386, 141, 387, -230, -230, -230, 222, 222, 389, -230, -230, 117, 222, 188, -230, 364, 222, 222, 377, -230, -230, 222, 347, -230, 370, -230, 118, 192, -230, 192, -230, 222, 192, -230, 222, 338, 1000, -230, 222, 393, 395, -230, -230, 190, 200, 397, -230, 415, 416, -230, -230, -230, -230, -230, 382, 576, -27, 222, -230, 576, 576, 420, -230, -230, -230, 516, -230, 434, 421, -230, -230, 440, -230, 441, -230, 576, -230, -230 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -230, -230, -230, -38, -229, 173, -68, -28, 227, -21, 312, 133, -230, -230, -230, -230, -230, 353, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -230, -33, -230, -230, -230, -5, -230, -3, -116, 216, -128, -57, 328, 144, 453, -230 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -31 static const yytype_int16 yytable[] = { 83, 91, 57, 73, 219, 58, 284, 95, 139, 95, 406, 253, 294, 95, 95, 95, 67, 95, 175, 158, -28, 160, 228, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, -30, 68, 176, 98, 407, 134, 74, 169, 75, 136, 86, 232, 52, 74, 185, 75, 83, 87, 259, 260, 70, 285, 143, 170, 60, 171, 172, 173, 76, 181, 77, 177, 217, 96, 140, 141, 239, 254, 287, 265, 283, 356, 137, 357, 233, 183, 184, 292, 186, 124, 125, 169, 257, 187, 188, 189, 190, 191, 192, 193, 99, 100, 101, 102, 103, 104, 366, 271, 169, 171, 172, 173, 136, 367, 301, 95, 289, 169, 145, 362, 257, 289, 63, 240, 295, 258, 171, 172, 173, 250, 312, 222, 95, 64, 228, 171, 172, 173, 234, 80, 272, 323, 76, 169, 77, 303, 146, 135, 369, 334, 83, 372, 363, 379, 389, -29, 325, 95, 58, 313, 330, 171, 172, 173, 221, 239, 286, 288, 65, 261, 293, 239, 244, 244, 300, 244, 87, 95, 169, 244, 81, 169, 278, 78, 289, 79, 273, 311, 289, 231, 71, 175, 278, 95, 354, 355, 171, 172, 173, 171, 172, 173, 251, 95, 245, 246, 72, 247, 329, 266, 66, 270, 240, 85, 279, 335, 290, 336, 240, 340, 345, 307, 344, 306, 350, 399, 68, 82, 308, 377, 252, 318, 169, 315, 380, 400, 78, 175, 79, 90, 2, 3, 92, 386, 69, 70, 304, 4, 5, 6, 171, 172, 173, 93, 7, 8, 94, 316, 317, 9, 10, 11, 12, 162, 163, 14, 341, 239, 368, 370, 215, 373, 216, 69, 138, 74, 142, 75, 53, 408, 54, 55, 56, 275, 235, 76, 343, 77, 154, 360, 154, 169, 154, 276, 144, 348, 78, 390, 79, 391, 147, 157, 393, 159, 277, 161, 166, 72, 168, 236, 172, 237, 178, 220, 240, 230, 241, -27, 242, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 119, 120, 121, 122, 123, 154, 154, 248, 255, 383, 384, 256, 264, 274, 280, 405, 282, 1, 281, 291, 314, 302, 319, 324, 409, 410, 392, 331, 332, 394, 83, 396, 333, 347, 2, 3, 349, 352, 353, 253, 417, 4, 5, 6, 358, 361, 359, 364, 7, 8, 371, 374, 378, 9, 10, 11, 12, 13, 365, 14, 382, 15, 16, 387, 17, 18, 19, 20, 21, 22, 395, 385, 23, 24, 25, 26, 27, 117, 118, 119, 120, 121, 122, 123, 28, 397, 388, 29, 30, 179, 398, 401, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 402, 403, 404, 411, 1, 414, 296, 154, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 2, 3, 413, 415, 416, 305, 351, 4, 5, 6, 321, 322, 381, 154, 7, 8, 262, 249, 229, 9, 10, 11, 12, 13, 97, 14, 0, 15, 16, 243, 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, 26, 27, 0, 0, 1, 0, 0, 0, 0, 28, 0, 0, 29, 30, 267, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 0, 7, 8, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 376, 15, 16, 0, 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, 26, 27, 1, 0, 0, 0, 0, 0, 0, 28, 0, 0, 29, 30, 412, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 0, 7, 8, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 15, 16, 0, 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 29, 30, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 2, 3, 0, 337, 0, 0, 0, 4, 5, 6, 169, 0, 268, 0, 7, 8, 0, 0, 218, 9, 10, 11, 12, 0, 0, 14, 72, 0, 338, 172, 339, 269, 0, 0, 0, 0, 0, 0, 53, 0, 54, 55, 56, 0, 2, 3, 0, 0, 0, 0, 346, 4, 5, 6, 0, 0, 0, 152, 7, 8, 0, 0, 0, 9, 10, 11, 148, 0, 0, 14, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 0, 53, 0, 149, 150, 151, 0, 2, 3, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 152, 7, 8, 0, 0, 0, 9, 10, 11, 148, 126, 127, 14, 128, 129, 130, 131, 132, 133, 0, 0, 0, 0, 0, 0, 53, 0, 297, 298, 299, 0, 2, 3, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 152, 7, 8, 0, 0, 0, 9, 10, 11, 12, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 54, 55, 56, 0, 2, 3, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 152, 7, 8, 0, 0, 0, 9, 10, 11, 12, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 23, 0, 54, 55, 56, 4, 5, 6, 0, 0, 0, 0, 7, 8, 0, 0, 0, 9, 10, 11, 223, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 53, 0, 224, 225, 226, 4, 5, 6, 0, 0, 0, 0, 7, 8, 0, 0, 0, 9, 10, 11, 148, 7, 8, 14, 0, 0, 9, 10, 11, 12, 0, 0, 14, 0, 0, 0, 53, 0, 326, 327, 328, 0, 0, 0, 0, 53, 0, 54, 55, 56, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123 }; static const yytype_int16 yycheck[] = { 33, 39, 7, 24, 132, 8, 235, 5, 5, 5, 37, 5, 241, 5, 5, 5, 21, 5, 86, 76, 6, 78, 138, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 6, 16, 6, 6, 73, 52, 34, 42, 36, 5, 35, 5, 34, 34, 94, 36, 91, 42, 176, 177, 35, 12, 69, 58, 42, 60, 61, 62, 34, 92, 36, 35, 131, 73, 73, 73, 146, 73, 12, 73, 73, 73, 38, 73, 38, 92, 93, 12, 95, 76, 77, 42, 5, 98, 99, 100, 101, 102, 103, 104, 63, 64, 65, 66, 67, 68, 337, 5, 42, 60, 61, 62, 5, 12, 244, 5, 5, 42, 6, 5, 5, 5, 45, 146, 242, 38, 60, 61, 62, 164, 6, 136, 5, 45, 252, 60, 61, 62, 145, 42, 38, 271, 34, 42, 36, 38, 34, 37, 12, 38, 185, 12, 38, 38, 38, 6, 274, 5, 163, 35, 278, 60, 61, 62, 37, 235, 236, 237, 73, 35, 240, 241, 5, 5, 244, 5, 42, 5, 42, 5, 0, 42, 5, 34, 5, 36, 221, 257, 5, 37, 42, 261, 5, 5, 312, 313, 60, 61, 62, 60, 61, 62, 6, 5, 37, 37, 58, 37, 278, 37, 73, 37, 235, 16, 37, 285, 37, 287, 241, 289, 37, 35, 292, 253, 37, 37, 16, 46, 42, 347, 34, 266, 42, 263, 352, 37, 34, 307, 36, 73, 20, 21, 34, 361, 34, 35, 251, 27, 28, 29, 60, 61, 62, 34, 34, 35, 74, 264, 265, 39, 40, 41, 42, 34, 35, 45, 289, 337, 338, 339, 128, 341, 130, 34, 34, 34, 58, 36, 58, 397, 60, 61, 62, 42, 35, 34, 291, 36, 74, 324, 76, 42, 78, 42, 58, 302, 34, 367, 36, 369, 42, 42, 372, 42, 42, 42, 42, 58, 58, 60, 61, 62, 5, 42, 337, 17, 34, 6, 6, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 22, 23, 24, 25, 26, 131, 132, 42, 17, 356, 357, 38, 73, 6, 35, 395, 35, 3, 58, 6, 38, 6, 56, 4, 399, 400, 371, 58, 38, 374, 405, 378, 58, 6, 20, 21, 73, 34, 5, 5, 415, 27, 28, 29, 34, 6, 38, 35, 34, 35, 6, 6, 5, 39, 40, 41, 42, 43, 38, 45, 38, 47, 48, 58, 50, 51, 52, 53, 54, 55, 74, 36, 58, 59, 60, 61, 62, 20, 21, 22, 23, 24, 25, 26, 70, 34, 58, 73, 74, 75, 37, 36, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 38, 38, 73, 36, 3, 37, 243, 244, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 20, 21, 42, 37, 37, 252, 307, 27, 28, 29, 268, 269, 353, 271, 34, 35, 178, 163, 139, 39, 40, 41, 42, 43, 45, 45, -1, 47, 48, 77, 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, 60, 61, 62, -1, -1, 3, -1, -1, -1, -1, 70, -1, -1, 73, 74, 75, -1, -1, -1, -1, -1, -1, 20, 21, -1, -1, -1, -1, -1, 27, 28, 29, -1, -1, -1, -1, 34, 35, -1, -1, -1, 39, 40, 41, 42, 43, -1, 45, 346, 47, 48, -1, 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, 60, 61, 62, 3, -1, -1, -1, -1, -1, -1, 70, -1, -1, 73, 74, 75, -1, -1, -1, -1, 20, 21, -1, -1, -1, -1, -1, 27, 28, 29, -1, -1, -1, -1, 34, 35, -1, -1, -1, 39, 40, 41, 42, 43, -1, 45, -1, 47, 48, -1, 50, 51, 52, 53, 54, 55, -1, -1, 58, 59, 60, 61, 62, -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, 73, 74, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 20, 21, -1, 35, -1, -1, -1, 27, 28, 29, 42, -1, 77, -1, 34, 35, -1, -1, 38, 39, 40, 41, 42, -1, -1, 45, 58, -1, 60, 61, 62, 77, -1, -1, -1, -1, -1, -1, 58, -1, 60, 61, 62, -1, 20, 21, -1, -1, -1, -1, 77, 27, 28, 29, -1, -1, -1, 77, 34, 35, -1, -1, -1, 39, 40, 41, 42, -1, -1, 45, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, 58, -1, 60, 61, 62, -1, 20, 21, -1, -1, -1, -1, -1, 27, 28, 29, -1, -1, -1, 77, 34, 35, -1, -1, -1, 39, 40, 41, 42, 28, 29, 45, 31, 32, 33, 34, 35, 36, -1, -1, -1, -1, -1, -1, 58, -1, 60, 61, 62, -1, 20, 21, -1, -1, -1, -1, -1, 27, 28, 29, -1, -1, -1, 77, 34, 35, -1, -1, -1, 39, 40, 41, 42, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, 60, 61, 62, -1, 20, 21, -1, -1, -1, -1, -1, 27, 28, 29, -1, -1, -1, 77, 34, 35, -1, -1, -1, 39, 40, 41, 42, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 58, -1, 60, 61, 62, 27, 28, 29, -1, -1, -1, -1, 34, 35, -1, -1, -1, 39, 40, 41, 42, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 58, -1, 60, 61, 62, 27, 28, 29, -1, -1, -1, -1, 34, 35, -1, -1, -1, 39, 40, 41, 42, 34, 35, 45, -1, -1, 39, 40, 41, 42, -1, -1, 45, -1, -1, -1, 58, -1, 60, 61, 62, -1, -1, -1, -1, 58, -1, 60, 61, 62, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 20, 21, 27, 28, 29, 34, 35, 39, 40, 41, 42, 43, 45, 47, 48, 50, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 70, 73, 74, 79, 80, 81, 87, 90, 91, 94, 97, 101, 103, 104, 107, 108, 112, 113, 114, 115, 116, 120, 121, 122, 34, 58, 60, 61, 62, 112, 114, 119, 42, 95, 96, 45, 45, 73, 73, 112, 16, 34, 35, 42, 58, 87, 34, 36, 34, 36, 34, 36, 42, 0, 46, 108, 98, 16, 35, 42, 88, 93, 73, 81, 34, 34, 74, 5, 73, 121, 6, 63, 64, 65, 66, 67, 68, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 76, 77, 28, 29, 31, 32, 33, 34, 35, 36, 112, 37, 5, 38, 34, 5, 73, 73, 58, 112, 58, 6, 34, 42, 42, 60, 61, 62, 77, 84, 116, 117, 118, 42, 118, 42, 118, 42, 34, 35, 110, 111, 42, 85, 58, 42, 58, 60, 61, 62, 83, 84, 6, 35, 5, 75, 102, 87, 105, 112, 112, 81, 112, 114, 114, 114, 114, 114, 114, 114, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 120, 120, 118, 38, 117, 42, 37, 114, 42, 60, 61, 62, 86, 115, 95, 17, 37, 5, 38, 112, 35, 60, 62, 82, 84, 87, 34, 6, 77, 5, 37, 37, 37, 42, 119, 108, 6, 34, 5, 73, 17, 38, 5, 38, 115, 115, 35, 88, 106, 73, 73, 37, 75, 77, 77, 37, 5, 38, 108, 6, 42, 42, 42, 5, 37, 35, 58, 35, 73, 82, 12, 84, 12, 84, 5, 37, 6, 12, 84, 82, 115, 116, 60, 61, 62, 84, 117, 6, 38, 114, 86, 85, 35, 42, 89, 92, 84, 6, 35, 38, 85, 112, 112, 108, 56, 109, 116, 116, 117, 4, 115, 60, 61, 62, 84, 115, 58, 38, 58, 38, 84, 84, 35, 60, 62, 84, 87, 100, 114, 84, 37, 77, 6, 112, 73, 37, 83, 34, 5, 115, 115, 73, 73, 34, 38, 108, 6, 5, 38, 35, 38, 82, 12, 84, 12, 84, 6, 12, 84, 6, 99, 116, 115, 5, 38, 115, 89, 38, 112, 112, 36, 115, 58, 58, 38, 84, 84, 114, 84, 114, 74, 112, 34, 37, 37, 37, 36, 38, 38, 73, 81, 37, 73, 115, 108, 108, 36, 75, 42, 37, 37, 37, 108 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 289 "lg.ypp" { // clean FH mach 2014 const char * magicffglut="#!ffglutdata3.1\n";// for complex and vector 3d plot //FFCS: divert stream to FFCS if(ThePlotStream) ffapi::fwriteinit(magicffglut,strlen(magicffglut),1,ThePlotStream); size_t sizestack = currentblock->size()+1024 ; // before close (yyvsp[(1) - (2)].cinst)+=currentblock->close(currentblock); if(verbosity>2 || mpirank==0) cout << " sizestack + 1024 =" << sizestack << " ( " << sizestack-1024 <<" )\n" ; size_t lg0,lg1; int NbPtr = ShowAlloc("init execution ",lg0); // number of un delele ptr debugstack= new vector >; size_t stu0=storageused(); // get Storage usage UnShowAlloc =0;// add FH for parallee if(verbosity>2 || mpirank==0) cout << endl; { Stack stack = newStack(sizestack); double CPUcompile= CPUtime(); try { (yyvsp[(1) - (2)].cinst).eval(stack);} catch ( E_exception & e) { cerr << e.what() << " , mpirank " << mpirank << endl; return 1; } catch( Error & err) { cerr << err.what() << endl; cerr << " err code " << err.errcode() << " , mpirank " << mpirank << endl; return err.errcode(); } catch( ...) { cerr << "Strange catch exception ???\n"; cerr << " at exec line " << TheCurrentLine << " , mpirank " << mpirank << endl; return 1; } if(verbosity) cout << "times: compile "<< CPUcompile-CPUcompileInit <<"s, execution " << CPUtime()-CPUcompile <<"s, mpirank:" << mpirank << endl; deleteStack(stack); //debugstack.clear() } fingraphique(); //FFCS: divert stream to FFCS if(ThePlotStream) {ffapi::ff_pclose(ThePlotStream); ThePlotStream=0;} UnShowAlloc =1; if(debugstack) delete debugstack; NbPtr = ShowAlloc("end execution -- ",lg1) - NbPtr; long stu1 =storageused()-stu0 ; if (NbPtr || (stu1>100000) ) { cout << " ######## We forget of deleting " << NbPtr << " Nb pointer, " << lg1-lg0 << "Bytes " << " , mpirank " << mpirank << ", memory leak ="<< stu1 << endl;} return 0;;} break; case 4: #line 346 "lg.ypp" {(yyval.cinst)=(yyvsp[(1) - (1)].cexp);;;;} break; case 5: #line 347 "lg.ypp" { (yyval.cinst)= ((yyvsp[(1) - (2)].cinst)+=(yyvsp[(2) - (2)].cexp)) ;} break; case 6: #line 352 "lg.ypp" { (yyval.clist_id)=new ListOfId();;} break; case 7: #line 353 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(1) - (1)].str)));} break; case 8: #line 354 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].cexp))) ;} break; case 9: #line 355 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(2) - (2)].str),Find((yyvsp[(1) - (2)].str)),atype **>()));} break; case 10: #line 356 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str),Find((yyvsp[(1) - (3)].str)),atype **>(),true));} break; case 11: #line 357 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(2) - (2)].str),Find((yyvsp[(1) - (2)].str)),atype **>()));} break; case 12: #line 358 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str),Find((yyvsp[(1) - (3)].str)),atype **>(),true));} break; case 13: #line 359 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(2) - (2)].str),C_F0(),(yyvsp[(1) - (2)].type)->right())) ;} break; case 14: #line 360 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str),C_F0(),(yyvsp[(1) - (3)].type),true)) ;} break; case 15: #line 361 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(2) - (3)].clist_id))) ;} break; case 16: #line 362 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (3)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str))) ;} break; case 17: #line 363 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (5)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(4) - (5)].clist_id))) ;} break; case 18: #line 364 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (5)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].cexp))) ;} break; case 19: #line 365 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (4)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(4) - (4)].str),Find((yyvsp[(3) - (4)].str)),atype **>())) ;} break; case 20: #line 366 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (5)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(5) - (5)].str),Find((yyvsp[(3) - (5)].str)),atype **>(),true)) ;} break; case 21: #line 367 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (4)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(4) - (4)].str),Find((yyvsp[(3) - (4)].str)),atype **>())) ;} break; case 22: #line 368 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (5)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(5) - (5)].str),Find((yyvsp[(3) - (5)].str)),atype **>(),true)) ;} break; case 23: #line 369 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (4)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(4) - (4)].str),C_F0(),(yyvsp[(3) - (4)].type)->right())) ;} break; case 24: #line 370 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (5)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(5) - (5)].str),C_F0(),(yyvsp[(3) - (5)].type),true)) ;} break; case 25: #line 373 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(1) - (1)].str))); ;} break; case 26: #line 374 "lg.ypp" { (yyval.clist_id)=(yyvsp[(1) - (3)].clist_id) ; (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str))); ;} break; case 31: #line 383 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (1)].str),dcltype);} break; case 32: #line 384 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (3)].str),dcltype,(yyvsp[(3) - (3)].cexp));} break; case 33: #line 385 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (4)].str),dcltype,(yyvsp[(3) - (4)].args)); (yyvsp[(3) - (4)].args).destroy();} break; case 34: #line 387 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 35: #line 394 "lg.ypp" {(yyval.args)=(yyvsp[(1) - (1)].cexp);} break; case 36: #line 395 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (2)].str));} break; case 37: #line 396 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (2)].str));} break; case 38: #line 397 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (2)].str));} break; case 39: #line 398 "lg.ypp" { (yyval.args)=make_pair((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].cexp));} break; case 40: #line 399 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += (yyvsp[(3) - (3)].cexp)) ;} break; case 41: #line 400 "lg.ypp" { (yyval.args)= ((yyvsp[(1) - (5)].args)+= make_pair((yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].cexp)));} break; case 43: #line 406 "lg.ypp" {(yyval.type)=TypeArray((yyvsp[(1) - (4)].type),(yyvsp[(3) - (4)].type));} break; case 44: #line 407 "lg.ypp" {(yyval.type)=TypeArray(TypeArray((yyvsp[(1) - (7)].type),(yyvsp[(3) - (7)].type)),(yyvsp[(6) - (7)].type));} break; case 45: #line 408 "lg.ypp" {(yyval.type)=TypeArray((yyvsp[(1) - (6)].type),(yyvsp[(3) - (6)].type),(yyvsp[(5) - (6)].type));} break; case 46: #line 409 "lg.ypp" {(yyval.type)=TypeArray(TypeArray((yyvsp[(1) - (9)].type),(yyvsp[(3) - (9)].type),(yyvsp[(5) - (9)].type)),(yyvsp[(8) - (9)].type));} break; case 47: #line 410 "lg.ypp" {(yyval.type)=TypeTemplate((yyvsp[(1) - (4)].type),(yyvsp[(3) - (4)].type));} break; case 48: #line 411 "lg.ypp" {(yyval.type)=TypeArray(TypeTemplate((yyvsp[(1) - (7)].type),(yyvsp[(3) - (7)].type)),(yyvsp[(6) - (7)].type));} break; case 49: #line 412 "lg.ypp" {(yyval.type)=TypeArray(TypeTemplate((yyvsp[(1) - (9)].type),(yyvsp[(3) - (9)].type)),(yyvsp[(6) - (9)].type),(yyvsp[(8) - (9)].type));} break; case 50: #line 420 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(1) - (1)].str),currentblock,fespacetype,fespacecomplex,fespacedim); ;} break; case 51: #line 421 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(1) - (4)].str),currentblock,fespacetype,(yyvsp[(3) - (4)].cexp),fespacecomplex,fespacedim); ;} break; case 52: #line 422 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(1) - (3)].str),currentblock,fespacetype,(yyvsp[(3) - (3)].cexp),fespacecomplex,fespacedim) ;} break; case 53: #line 423 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(2) - (3)].clist_id),currentblock,fespacetype,fespacecomplex,fespacedim) ;} break; case 54: #line 424 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(2) - (6)].clist_id),currentblock,fespacetype,(yyvsp[(5) - (6)].cexp),fespacecomplex,fespacedim) ;} break; case 55: #line 425 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(2) - (5)].clist_id),currentblock,fespacetype,(yyvsp[(5) - (5)].cexp),fespacecomplex,fespacedim) ;} break; case 56: #line 428 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(1) - (4)].str),currentblock,fespacetype,(yyvsp[(3) - (4)].cexp),fespacecomplex,fespacedim); ;} break; case 57: #line 429 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(2) - (6)].clist_id),currentblock,fespacetype,(yyvsp[(5) - (6)].cexp),fespacecomplex,fespacedim) ;} break; case 58: #line 435 "lg.ypp" { fespacedim=2;} break; case 59: #line 435 "lg.ypp" { fespacedim=1;} break; case 60: #line 435 "lg.ypp" { fespacedim=3;} break; case 61: #line 436 "lg.ypp" {fespacecomplex=false; fespacetype = Find((yyvsp[(1) - (1)].str));;} break; case 62: #line 437 "lg.ypp" { if ((yyvsp[(3) - (4)].type) != typevarreal && (yyvsp[(3) - (4)].type) != typevarcomplex) lgerror (" type of finite element or "); fespacecomplex=((yyvsp[(3) - (4)].type)==typevarcomplex); fespacetype = Find((yyvsp[(1) - (4)].str));;} break; case 63: #line 442 "lg.ypp" { (yyval.cexp) = (yyvsp[(1) - (1)].cexp) ;} break; case 64: #line 443 "lg.ypp" { (yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));;} break; case 65: #line 445 "lg.ypp" { (yyval.cexp) = (yyvsp[(1) - (1)].cexp) ;} break; case 66: #line 446 "lg.ypp" { (yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));;} break; case 67: #line 448 "lg.ypp" { (yyval.cexp)=0; (yyval.cexp) = (yyvsp[(2) - (2)].cexp);} break; case 68: #line 449 "lg.ypp" { (yyval.cexp)=0; (yyval.cexp) = (yyvsp[(5) - (5)].cexp);} break; case 69: #line 455 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (4)].str),typeFESpace((yyvsp[(3) - (4)].args)),(yyvsp[(3) - (4)].args),dimFESpaceImage((yyvsp[(3) - (4)].args))); (yyvsp[(3) - (4)].args).destroy(); ;} break; case 71: #line 459 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 72: #line 464 "lg.ypp" {dcltype=(yyvsp[(1) - (1)].type);} break; case 73: #line 464 "lg.ypp" {(yyval.cexp)=(yyvsp[(3) - (4)].cexp);} break; case 74: #line 465 "lg.ypp" {(yyval.cexp)=(yyvsp[(2) - (3)].cexp);} break; case 75: #line 466 "lg.ypp" { (yyval.cexp)=(yyvsp[(1) - (2)].cexp);} break; case 76: #line 467 "lg.ypp" {(yyval.cexp)=currentblock->NewID((yyvsp[(1) - (5)].type),(yyvsp[(2) - (5)].str),(yyvsp[(4) - (5)].cexp));;} break; case 77: #line 469 "lg.ypp" { /* use the stack to store the prev return type*/ assert(kkembtype+1right(); routineinblock[kkembtype] = currentblock; (yyvsp[(5) - (6)].routine)=new Routine((yyvsp[(1) - (6)].type),(yyvsp[(2) - (6)].type)->right(),(yyvsp[(3) - (6)].str),(yyvsp[(5) - (6)].clist_id),currentblock); // routineinblock[kkembtype]->Add($3,"(",$5); //pas recursif pour l'instanat test FH 27 dec 2008 // cout << " \n after new routine \n " << endl; ;} break; case 78: #line 478 "lg.ypp" { currentblock=(yyvsp[(5) - (10)].routine)->Set((yyvsp[(9) - (10)].cinst)); currentblock->Add((yyvsp[(3) - (10)].str),"(",(yyvsp[(5) - (10)].routine)); //pas recursif pour l'instant test FH 27 dec 2008 kkembtype--; (yyval.cexp)=0; ;} break; case 79: #line 485 "lg.ypp" {Block::open(currentblock); (yyvsp[(1) - (5)].type)->SetArgs((yyvsp[(4) - (5)].clist_id));;} break; case 80: #line 487 "lg.ypp" { (yyval.cinst)=currentblock->close(currentblock); (yyval.cexp)=currentblock->NewID((yyvsp[(1) - (9)].type),(yyvsp[(2) - (9)].str),(yyvsp[(8) - (9)].cexp),*(yyvsp[(4) - (9)].clist_id)); delete (yyvsp[(4) - (9)].clist_id); // FH 23032005 ;} break; case 81: #line 493 "lg.ypp" { Block::open(currentblock);} break; case 82: #line 494 "lg.ypp" { (yyval.cexp)=currentblock->close(currentblock);} break; case 83: #line 496 "lg.ypp" {ffassert(inloopcountinput((yyvsp[(2) - (2)].str));(yyval.cexp)= 0; ;} break; case 90: #line 512 "lg.ypp" {load((yyvsp[(2) - (2)].str));(yyval.cexp)= 0; ;} break; case 91: #line 513 "lg.ypp" {(yyval.cexp)=Try((yyvsp[(3) - (5)].cinst),(yyvsp[(5) - (5)].cexp),currentblock->close(currentblock));;} break; case 92: #line 514 "lg.ypp" {(yyval.cexp)=(yyvsp[(1) - (2)].cexp);} break; case 93: #line 515 "lg.ypp" {(yyval.cexp)=(yyvsp[(1) - (1)].cexp);} break; case 94: #line 516 "lg.ypp" {inloopcount--; (yyval.cexp)=For((yyvsp[(3) - (9)].cexp),(yyvsp[(5) - (9)].cexp),(yyvsp[(7) - (9)].cexp),(yyvsp[(9) - (9)].cexp));} break; case 95: #line 518 "lg.ypp" {inloopcount--; (yyval.cexp)=C_F0(For((yyvsp[(3) - (9)].cexp),(yyvsp[(5) - (9)].cexp),(yyvsp[(7) - (9)].cexp),(yyvsp[(9) - (9)].cexp)),currentblock->close(currentblock));} break; case 96: #line 521 "lg.ypp" {inloopcount--;(yyval.cexp)=While((yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 97: #line 522 "lg.ypp" {(yyval.cexp)=FIf((yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 98: #line 523 "lg.ypp" {(yyval.cexp)=FIf((yyvsp[(3) - (7)].cexp),(yyvsp[(5) - (7)].cexp),(yyvsp[(7) - (7)].cexp));} break; case 99: #line 524 "lg.ypp" { (yyval.cexp)=C_F0(new E_block((yyvsp[(2) - (3)].cinst),(yyvsp[(3) - (3)].cexp)),atype()) ;} break; case 100: #line 526 "lg.ypp" { /* <> */ (yyval.cexp)=0;currentblock->NewID(atype(),(yyvsp[(2) - (3)].str),C_F0(TheOperators,"[border]",(yyvsp[(3) - (3)].args)));} break; case 101: #line 528 "lg.ypp" { (yyval.cexp)=0;currentblock->NewID(atype(),(yyvsp[(2) - (6)].str),C_F0(TheOperators,"[border]",(yyvsp[(4) - (6)].args)));} break; case 102: #line 531 "lg.ypp" { if(inloopcount) (yyval.cexp)= C_F0(new E_throw(E_exception::e_break),atype()); else lgerror("break not in loop") ;} break; case 103: #line 535 "lg.ypp" { if(inloopcount) (yyval.cexp)= C_F0(new E_throw(E_exception::e_continue),atype()) ; else lgerror("continue not in loop");} break; case 104: #line 539 "lg.ypp" { if (kkembtype>=0) (yyval.cexp)= C_F0(new E_throw(E_exception::e_return,(rettype[kkembtype]->CastTo((yyvsp[(2) - (3)].cexp))).OnReturn()) ,atype()); else lgerror(" return not in routine ") ;} break; case 105: #line 546 "lg.ypp" {(yyval.cexp) = (yyvsp[(7) - (7)].cexp); ;} break; case 106: #line 549 "lg.ypp" { Block::open(currentblock); (yyval.args) = currentblock->NewVar((yyvsp[(2) - (7)].str),atype()); (yyval.args)+= (yyvsp[(4) - (7)].cexp); (yyval.args)+= (yyvsp[(6) - (7)].cexp); (yyval.args)+= currentblock->NewVar("IndexBorder",atype());;} break; case 107: #line 556 "lg.ypp" { Block::open(currentblock); (yyval.args) = currentblock->NewVar((yyvsp[(2) - (9)].str),atype()); (yyval.args)+= (yyvsp[(4) - (9)].cexp); (yyval.args)+= (yyvsp[(6) - (9)].cexp); (yyval.args)+= currentblock->NewVar((yyvsp[(8) - (9)].str),atype());;} break; case 108: #line 566 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (2)].args) += (yyvsp[(2) - (2)].cexp)); currentblock->close(currentblock);} break; case 110: #line 575 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));;} break; case 117: #line 592 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 118: #line 593 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"+=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 119: #line 594 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"-=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 120: #line 595 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"*=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 121: #line 596 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"/=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 122: #line 597 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,".*=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 123: #line 598 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"./=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 125: #line 605 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"?:",(yyvsp[(1) - (5)].cexp),(yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 126: #line 606 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"::",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 127: #line 607 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"::",(yyvsp[(1) - (5)].cexp),(yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 129: #line 614 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 130: #line 615 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 131: #line 616 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 132: #line 617 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 133: #line 618 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 134: #line 619 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 135: #line 620 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 136: #line 621 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 137: #line 622 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 138: #line 623 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 139: #line 624 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 140: #line 625 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 141: #line 626 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 142: #line 627 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 143: #line 628 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 144: #line 629 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 145: #line 630 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 146: #line 631 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 147: #line 632 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 148: #line 639 "lg.ypp" {(yyval.cexp)=(yyvsp[(1) - (1)].cexp);} break; case 149: #line 640 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,":");} break; case 150: #line 641 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,":",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 151: #line 642 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,":",(yyvsp[(1) - (5)].cexp),(yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 152: #line 648 "lg.ypp" {(yyval.args)=0;} break; case 153: #line 649 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (1)].str));} break; case 154: #line 650 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (1)].str));} break; case 155: #line 651 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (1)].str));} break; case 156: #line 654 "lg.ypp" { (yyval.args)=make_pair((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].cexp));} break; case 157: #line 656 "lg.ypp" {(yyval.args)=(yyvsp[(1) - (1)].cexp);} break; case 158: #line 657 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += Find((yyvsp[(3) - (3)].str))) ;} break; case 159: #line 658 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += Find((yyvsp[(3) - (3)].str))) ;} break; case 160: #line 659 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += Find((yyvsp[(3) - (3)].str))) ;} break; case 161: #line 660 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += (yyvsp[(3) - (3)].cexp)) ;} break; case 162: #line 663 "lg.ypp" { (yyval.args)= ((yyvsp[(1) - (5)].args)+= make_pair((yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].cexp))) ;} break; case 163: #line 666 "lg.ypp" {(yyval.args)=(yyvsp[(1) - (1)].cexp);} break; case 164: #line 667 "lg.ypp" {(yyval.args) = ((yyvsp[(1) - (3)].args) += (yyvsp[(3) - (3)].cexp)) ;} break; case 166: #line 673 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(1) - (2)].oper),(yyvsp[(2) - (2)].cexp));} break; case 168: #line 679 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 169: #line 680 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 170: #line 681 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (2)].oper),(yyvsp[(1) - (2)].cexp));} break; case 171: #line 691 "lg.ypp" {(yyval.cexp)=Find((yyvsp[(1) - (1)].str));;} break; case 172: #line 693 "lg.ypp" {(yyval.cexp)= CConstant((yyvsp[(1) - (1)].lnum));} break; case 173: #line 694 "lg.ypp" {(yyval.cexp)= CConstant((yyvsp[(1) - (1)].dnum));} break; case 174: #line 695 "lg.ypp" {(yyval.cexp)= CConstant(complex(0,(yyvsp[(1) - (1)].dnum)));} break; case 175: #line 696 "lg.ypp" {(yyval.cexp)= CConstant((yyvsp[(1) - (1)].str));} break; case 176: #line 701 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (4)].cexp),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args));;} break; case 177: #line 703 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (4)].cexp),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].cexp));} break; case 178: #line 704 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (6)].cexp),(yyvsp[(2) - (6)].oper),(yyvsp[(3) - (6)].cexp),(yyvsp[(5) - (6)].cexp));} break; case 179: #line 705 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),"[]");} break; case 180: #line 706 "lg.ypp" { (yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].str)) ;;} break; case 181: #line 707 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (3)].str)),(yyvsp[(3) - (3)].str)) ;;} break; case 182: #line 708 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (4)].str)),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args)) ;;} break; case 183: #line 709 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (3)].str)),(yyvsp[(3) - (3)].str)) ;;} break; case 184: #line 710 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (4)].str)),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args)) ;;} break; case 185: #line 711 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (3)].str)),(yyvsp[(3) - (3)].str)) ;;} break; case 186: #line 712 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (4)].str)),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args)) ;;} break; case 187: #line 713 "lg.ypp" {(yyval.cexp)=C_F0(TheRightOperators,(yyvsp[(2) - (2)].oper),(yyvsp[(1) - (2)].cexp));} break; case 188: #line 714 "lg.ypp" {(yyval.cexp)=C_F0(TheRightOperators,(yyvsp[(2) - (2)].oper),(yyvsp[(1) - (2)].cexp));} break; case 189: #line 715 "lg.ypp" { if ((yyvsp[(1) - (4)].type)->right()->CastingFrom((yyvsp[(3) - (4)].cexp).left()) ) (yyval.cexp)=(yyvsp[(1) - (4)].type)->right()->CastTo((yyvsp[(3) - (4)].cexp)) ; else { (yyval.cexp)=(yyvsp[(1) - (4)].type)->right()->Find("<--",basicAC_F0_wa((yyvsp[(3) - (4)].cexp))); if (!(yyval.cexp).left()) { cerr << " no wait to change " << (yyvsp[(3) - (4)].cexp).left()->right()->name() << " in " << (yyvsp[(1) - (4)].type)->right()->name() << endl; CompileError(" Error in type(exp) "); } } ;} break; case 190: #line 724 "lg.ypp" {(yyval.cexp)=(yyvsp[(2) - (3)].cexp);} break; case 191: #line 725 "lg.ypp" { (yyval.cexp)=C_F0(TheOperators,"[]",(yyvsp[(2) - (3)].args));} break; /* Line 1267 of yacc.c. */ #line 3047 "lg.tab.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 730 "lg.ypp" #include using namespace std; // bool lgdebug; // bool lexdebug; void ForDebug(); void ForDebug() { int i=0; i++; } //extern void ShowAlloc(const char *s, size_t lg); //extern void ShowNbAlloc(const char *s); void init_lgfem() ; void init_lgmesh() ; void init_lgmesh3() ; void init_algo(); bool withrgraphique = false; /// <> Called by mainff(). Activates the bison parser by calling yyparse() int Compile() { // see [[YYSTYPE]] [[yylval]] [[lglval]] extern YYSTYPE *plglval; // modif FH /// plglval is allocated at [[file:../fflib/global.cpp::plglval]] plglval = &lglval; int retvalue=0; currentblock=0; Block::open(currentblock); try { UnShowAlloc =0; retvalue=yyparse(); // grammar analysis starting from [[start_symbol]] if(retvalue==0){ if(currentblock) {retvalue=1; if(!mpirank) cerr << "Error:a block is not close" << endl; } else { if( verbosity ) { UnShowAlloc =1; cerr << " CodeAlloc : nb ptr "<< CodeAlloc::nb << ", size :" << CodeAlloc::lg << " mpirank: " < * ccout = new stdio_filebuf(stdout, std::ios_base::out); static stdio_filebuf ccout(stdout, std::ios_base::out); static stdio_filebuf ccin(stdin, std::ios_base::in); //stdio_filebuf *ccin= new stdio_filebuf(stdin, std::ios_base::in); cout.rdbuf(&ccout); cin.rdbuf(&ccin); cerr.rdbuf(&ccout); cout << " -- SetcppIo --" << endl; #endif ios::sync_with_stdio(); } // pour l'environement. extern const char * prognamearg; extern bool echo_edp; /// Called by mymain() and calls Compile() to run the FF language parser int mainff (int argc, char **argv) { if(argc) prognamearg=argv[0]; int vvold=verbosity; if(mpirank !=0) verbosity=0; // ALH - 14/10/8 - This breaks FFCS output redirection #ifndef ENABLE_FFCS SetcppIo(); #endif GetEnvironment(); vvold=verbosity; if(mpirank !=0) verbosity=0; // size_t lg000; // ShowAlloc("begin main ",lg000); int retvalue=0; ff_atend(fingraphique); if (initparallele)initparallele(argc,argv); CPUcompileInit= CPUtime(); withrgraphique = false; atexit(ForDebug); // AllFunctions::maptype xlocal; // local=&xlocal; lexdebug = false; lgdebug = false; char * cc= new char [1024]; // istream * ccin=0; if ( ! (getprog(cc,argc,argv) >0) ) { cout << "-- FreeFem++ v" << StrVersionNumber() << " (error parameter!)\n" ; if(ThePlotStream) {ffapi::ff_pclose(ThePlotStream); ThePlotStream=0;} return 1; } if(verbosity && (mpirank==0)) { cout << "-- FreeFem++ v" << StrVersionNumber() << endl; if(verbosity>1) cout << " file :" << cc << " " << " verbosity= " << verbosity << endl; } KN karg(argc); for(int i=0;i< argc;++i) karg[i]=argv[i]; pkarg= &karg; /// <> zzzfff = Newlex(cout,echo_edp); /* ccin= new ifstream(cc); if (argc >1 && (ccin!=0) ) ccin= new ifstream(argv[1]),throwassert(ccin); if (ccin!=0) zzzfff = new mylex(*ccin,cout) ; else zzzfff = new mylex(cin,cout) ; */ // les motsclefs zzzfff->Add("include",INCLUDE); zzzfff->Add("load",LOAD); zzzfff->Add("while",WHILE); zzzfff->Add("for",FOR); zzzfff->Add("if",IF); zzzfff->Add("else",ELSE); zzzfff->Add("end",ENDOFFILE); zzzfff->Add("break",BREAK); zzzfff->Add("continue",CONTINUE); zzzfff->Add("return",RETURN); zzzfff->Add("border",BORDER); zzzfff->Add("fespace",FESPACEID); zzzfff->Add("try",TRY); zzzfff->Add("catch",CATCH); zzzfff->Add("throw",THROW); // Init_map_type(); if(verbosity>2 || (mpirank==0 ) ) cout << " Load: "; callInitsFunct() ; // init for dynamique libs ... // init_lgfem() ; init_lgmesh() ; init_lgmesh3() ; init_algo(); #ifdef HAVE_LIBARPACK init_eigenvalue(); #endif if(init_lgparallele) init_lgparallele(); // callInitsFunct() ; // init for dynamique libs ... if(verbosity>2 || mpirank==0) cout << endl; zzzfff->input(cc); // [[file:../fflib/lex.cpp::void mylex input]] EnvironmentLoad(); // just before compile verbosity=vvold; retvalue= Compile(); // [[Compile]] // cout << " xxxxx " << retvalue << " " << ThePlotStream << endl; //if(end_parallele) end_parallele(); ff_finalize(); // currentblock->close(currentblock).eval(thestack); // fingraphique(); // FFCS: divert stream to FFCS if(ThePlotStream){ ffapi::ff_pclose(ThePlotStream); ThePlotStream=0; } Destroylex( zzzfff); delete [] cc; // ClearMem(); return retvalue; } /* FFCS: emacs configuration for this file */ /*! * Local Variables: * mode:antlr * ispell-local-dictionary:"british" * coding:utf-8 * End: */ freefem++-3.38-1/src/lglib/lg.tab.hpp000644 000767 000024 00000010121 12520223352 017333 0ustar00hechtstaff000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { IF = 258, ELSE = 259, SET = 260, GTGT = 261, LTLT = 262, OR = 263, AND = 264, NE = 265, EQ = 266, GE = 267, LE = 268, DOTSLASH = 269, DOTSTAR = 270, MOINSMOINS = 271, PLUSPLUS = 272, UNARY = 273, LNUM = 274, DNUM = 275, CNUM = 276, ID = 277, FESPACEID = 278, IDPARAM = 279, STRING = 280, ENDOFFILE = 281, INCLUDE = 282, LOAD = 283, BIDON = 284, FOR = 285, WHILE = 286, BREAK = 287, CONTINUE = 288, RETURN = 289, TRY = 290, CATCH = 291, THROW = 292, TYPE = 293, FUNCTION = 294, FESPACE = 295, FESPACE1 = 296, FESPACE3 = 297, PLUSEQ = 298, MOINSEQ = 299, MULEQ = 300, DIVEQ = 301, DOTMULEQ = 302, DOTDIVEQ = 303, ARROW = 304, BORDER = 305, CURVE = 306, SOLVE = 307 }; #endif /* Tokens. */ #define IF 258 #define ELSE 259 #define SET 260 #define GTGT 261 #define LTLT 262 #define OR 263 #define AND 264 #define NE 265 #define EQ 266 #define GE 267 #define LE 268 #define DOTSLASH 269 #define DOTSTAR 270 #define MOINSMOINS 271 #define PLUSPLUS 272 #define UNARY 273 #define LNUM 274 #define DNUM 275 #define CNUM 276 #define ID 277 #define FESPACEID 278 #define IDPARAM 279 #define STRING 280 #define ENDOFFILE 281 #define INCLUDE 282 #define LOAD 283 #define BIDON 284 #define FOR 285 #define WHILE 286 #define BREAK 287 #define CONTINUE 288 #define RETURN 289 #define TRY 290 #define CATCH 291 #define THROW 292 #define TYPE 293 #define FUNCTION 294 #define FESPACE 295 #define FESPACE1 296 #define FESPACE3 297 #define PLUSEQ 298 #define MOINSEQ 299 #define MULEQ 300 #define DIVEQ 301 #define DOTMULEQ 302 #define DOTDIVEQ 303 #define ARROW 304 #define BORDER 305 #define CURVE 306 #define SOLVE 307 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 156 "lg.ypp" { double dnum; long lnum; char * str; char oper[8]; CC_F0 cexp; Routine *routine; AC_F0 args; aType type; CListOfInst cinst; Block * block; ListOfId *clist_id; /* ListCatch * clist_Catchs;*/ } /* Line 1529 of yacc.c. */ #line 168 "lg.tab.hpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE lglval; freefem++-3.38-1/src/lglib/lg.ypp000644 000767 000024 00000076470 12520223272 016633 0ustar00hechtstaff000000 000000 // \file %{ // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config-wrapper.h" #include #include #include // for reset cout,cin in windows dll #ifdef _WIN32 #include #include #include #endif #include "error.hpp" class Iden; #include "strversionnumber.hpp" #include "InitFunct.hpp" #ifdef __MWERKS__ #ifdef __INTEL__ #include #else #include #endif #endif #include "RNM.hpp" #include "AFunction.hpp" // to reserve space to graphical pointer function #include "rgraph.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lex.hpp" #include "environment.hpp" extern long storageused(); extern FILE *ThePlotStream; extern KN *pkarg; class Routine; bool load(string s); template class FE; template class FE_; extern mylex *zzzfff; // modif FH for window to have 1 dll for mpi and none mpi .. extern void (*initparallele)(int &, char **&); extern void (*init_lgparallele)(); // extern void (*end_parallele)(); // #ifdef HAVE_LIBARPACK void init_eigenvalue(); #endif aType dcltype; const int nbembtype=10; aType rettype[nbembtype]; Block * routineinblock[nbembtype]; // Add FH july 2005 pb clean on return int kkembtype=-1; int inloopcount=0; /// <> Block class from [[file:../fflib/AFunction.hpp::Block]] Block *currentblock; // Add FH july 2005 // problem clean variable after break,continue and return. const int sizeStackOfLoop=100; Block * StackOfLoop[sizeStackOfLoop]; // end ADD double CPUcompileInit =0; //class pfes; C_F0 fespacetype; bool fespacecomplex; int fespacedim; extern int UnShowAlloc; int ShowAlloc(const char *s,size_t &); // <> Connection from grammar to lexer object zzzfff [[file:../fflib/lex.hpp::zzzfff]] of class mylex // [[file:../fflib/lex.hpp::class mylex]]. Method mylex::scan() is implemented at [[file:../fflib/lex.cpp::mylex_scan]] inline int yylex() {return zzzfff->scan();} inline int lineno() {return zzzfff->lineno();} extern bool withrgraphique; /// <> inline void fingraphique() { if(withrgraphique) { withrgraphique=false; rattente(1); closegraphique(); }} void lgerror (const char* s) ; // mpi ptr to function ... void (*initparallele)(int &argc, char **& argv)=0 ; void (*init_lgparallele)()=0; //void (*end_parallele)()=0; // Add dec 2014 #include typedef void (*AtEnd)(); vector AtFFEnd; void ff_finalize() { for (vector::const_reverse_iterator i=AtFFEnd.rbegin(); i !=AtFFEnd.rend(); ++ i) (**i)(); AtFFEnd.clear(); } void ff_atend(AtEnd f) { AtFFEnd.push_back(f); } %} /* <> definition. <> is renamed <> by bison at [[file:lg.tab.cpp::lglval]]. It is allocated in lg.tab.o */ %union{ double dnum; long lnum; char * str; char oper[8]; CC_F0 cexp; Routine *routine; AC_F0 args; aType type; CListOfInst cinst; Block * block; ListOfId *clist_id; /* ListCatch * clist_Catchs;*/ } /* BISON Declarations */ %type input %type instructions %type instruction %type try %type catchs /* %type throw */ %type declaration %type declaration_for %type list_of_dcls %type fespace_def %type fespace_def_list %type Expr %type no_comma_expr %type sub_script_expr %type no_ternary_expr %type no_set_expr %type unary_expr %type pow_expr %type primary %type unop %type parameters %type array %type parameters_list %type begin %type end %type list_of_id_args %type list_of_id1 %type spaceIDs %type spaceIDa %type spaceIDb %type ID_space %type ID_array_space %type bornes; %type border_expr; %type type_of_dcl; %type id; %type fespace123; /* Add precedence rules to solve dangling else s/r conflict */ %nonassoc IF %nonassoc ELSE %left ',' %right '=' SET %left LTLT GTGT %left OR '|' %left AND '&' %left EQ NE %left '<' '>' LE GE %left '+' '-' %left '*' '/' '%' DOTSTAR DOTSLASH %right UNARY PLUSPLUS MOINSMOINS '!' %right '^' '\'' %right '_' %left '(' '[' '.' %token ')' ']' %token LNUM %token DNUM %token CNUM %token ID %token FESPACEID %token IDPARAM %token STRING %token ENDOFFILE %token INCLUDE %token LOAD %token BIDON %token FOR %token WHILE %token IF %token ELSE %token BREAK %token CONTINUE %token RETURN %token TRY %token CATCH %token THROW %token TYPE %token FUNCTION %token FESPACE %token FESPACE1 %token FESPACE3 %token DOTSTAR %token DOTSLASH %token AND %token OR %token EQ %token NE %token LE %token GE %token PLUSPLUS %token MOINSMOINS %token SET %token LTLT %token PLUSEQ %token MOINSEQ %token MULEQ %token DIVEQ %token DOTMULEQ %token DOTDIVEQ %token GTGT %token ARROW %token BORDER %token CURVE %token SOLVE %% start: input ENDOFFILE { // clean FH mach 2014 const char * magicffglut="#!ffglutdata3.1\n";// for complex and vector 3d plot //FFCS: divert stream to FFCS if(ThePlotStream) ffapi::fwriteinit(magicffglut,strlen(magicffglut),1,ThePlotStream); size_t sizestack = currentblock->size()+1024 ; // before close $1+=currentblock->close(currentblock); if(verbosity>2 || mpirank==0) cout << " sizestack + 1024 =" << sizestack << " ( " << sizestack-1024 <<" )\n" ; size_t lg0,lg1; int NbPtr = ShowAlloc("init execution ",lg0); // number of un delele ptr debugstack= new vector >; size_t stu0=storageused(); // get Storage usage UnShowAlloc =0;// add FH for parallee if(verbosity>2 || mpirank==0) cout << endl; { Stack stack = newStack(sizestack); double CPUcompile= CPUtime(); try { $1.eval(stack);} catch ( E_exception & e) { cerr << e.what() << " , mpirank " << mpirank << endl; return 1; } catch( Error & err) { cerr << err.what() << endl; cerr << " err code " << err.errcode() << " , mpirank " << mpirank << endl; return err.errcode(); } catch( ...) { cerr << "Strange catch exception ???\n"; cerr << " at exec line " << TheCurrentLine << " , mpirank " << mpirank << endl; return 1; } if(verbosity) cout << "times: compile "<< CPUcompile-CPUcompileInit <<"s, execution " << CPUtime()-CPUcompile <<"s, mpirank:" << mpirank << endl; deleteStack(stack); //debugstack.clear() } fingraphique(); //FFCS: divert stream to FFCS if(ThePlotStream) {ffapi::ff_pclose(ThePlotStream); ThePlotStream=0;} UnShowAlloc =1; if(debugstack) delete debugstack; NbPtr = ShowAlloc("end execution -- ",lg1) - NbPtr; long stu1 =storageused()-stu0 ; if (NbPtr || (stu1>100000) ) { cout << " ######## We forget of deleting " << NbPtr << " Nb pointer, " << lg1-lg0 << "Bytes " << " , mpirank " << mpirank << ", memory leak ="<< stu1 << endl;} return 0;} ; /*<>*/ input: instructions /*[[instructions]]*/ ; /*<>*/ instructions: instruction /*[[instruction]]*/ {$$=$1;;;} | instructions instruction { $$= ($1+=$2) } ; /* Function arguments list */ list_of_id_args: { $$=new ListOfId();} | id { $$ = new ListOfId(); $$->push_back(UnId($1))} | id '=' no_comma_expr { $$ = new ListOfId(); $$->push_back(UnId($1,$3)) } | FESPACE id { $$ = new ListOfId(); $$->push_back(UnId($2,Find($1),atype **>()))} | FESPACE '&' id { $$ = new ListOfId(); $$->push_back(UnId($3,Find($1),atype **>(),true))} | FESPACE3 id { $$ = new ListOfId(); $$->push_back(UnId($2,Find($1),atype **>()))} | FESPACE3 '&' id { $$ = new ListOfId(); $$->push_back(UnId($3,Find($1),atype **>(),true))} | type_of_dcl id { $$ = new ListOfId(); $$->push_back(UnId($2,C_F0(),$1->right())) } | type_of_dcl '&' id { $$ = new ListOfId(); $$->push_back(UnId($3,C_F0(),$1,true)) } | '[' list_of_id_args ']' { $$ = new ListOfId(); $$->push_back(UnId($2)) } | list_of_id_args ',' id { $$ = $1; $$->push_back(UnId($3)) } | list_of_id_args ',''[' list_of_id_args ']' { $$ = $1; $$->push_back(UnId($4)) } | list_of_id_args ',' id '=' no_comma_expr { $$ = $1; $$->push_back(UnId($3,$5)) } | list_of_id_args ',' FESPACE id { $$ = $1; $$->push_back(UnId($4,Find($3),atype **>())) } | list_of_id_args ',' FESPACE '&' id { $$ = $1; $$->push_back(UnId($5,Find($3),atype **>(),true)) } | list_of_id_args ',' FESPACE3 id { $$ = $1; $$->push_back(UnId($4,Find($3),atype **>())) } | list_of_id_args ',' FESPACE3 '&' id { $$ = $1; $$->push_back(UnId($5,Find($3),atype **>(),true)) } | list_of_id_args ',' type_of_dcl id { $$ = $1; $$->push_back(UnId($4,C_F0(),$3->right())) } | list_of_id_args ',' type_of_dcl '&' id { $$ = $1; $$->push_back(UnId($5,C_F0(),$3,true)) } ; list_of_id1: id { $$ = new ListOfId(); $$->push_back(UnId($1)); } | list_of_id1 ',' id { $$=$1 ; $$->push_back(UnId($3)); } ; /*<>*/ id: ID | FESPACE|FESPACE3|FESPACE1; /* <> */ list_of_dcls: ID {$$=currentblock->NewVar($1,dcltype)} | ID '=' no_comma_expr {$$=currentblock->NewVar($1,dcltype,$3)} | ID '(' parameters_list ')' {$$=currentblock->NewVar($1,dcltype,$3); $3.destroy()} | list_of_dcls ',' list_of_dcls {$$=C_F0($1,$3)} ; parameters_list: no_set_expr {$$=$1} | FESPACE ID {$$=Find($1)} | FESPACE1 ID {$$=Find($1)} | FESPACE3 ID {$$=Find($1)} | ID '=' no_set_expr { $$=make_pair($1,$3)} | parameters_list ',' no_set_expr { $$ = ($1 += $3) } | parameters_list ',' id '=' no_set_expr { $$= ($1+= make_pair($3,$5))} ; /* <> */ type_of_dcl: TYPE | TYPE '[' TYPE ']' {$$=TypeArray($1,$3)} | TYPE '[' TYPE ']' '[' TYPE ']' {$$=TypeArray(TypeArray($1,$3),$6)} // Add FH mars 2012 | TYPE '[' TYPE ',' TYPE ']' {$$=TypeArray($1,$3,$5)} | TYPE '[' TYPE ',' TYPE ']' '[' TYPE ']' {$$=TypeArray(TypeArray($1,$3,$5),$8)} | TYPE '<' TYPE '>' {$$=TypeTemplate($1,$3)} | TYPE '<' TYPE '>' '[' TYPE ']' {$$=TypeArray(TypeTemplate($1,$3),$6)} | TYPE '<' TYPE '>' '[' TYPE ',' TYPE ']' {$$=TypeArray(TypeTemplate($1,$3),$6,$8)} ; /* <> */ ID_space: ID { $$ = NewFEvariable($1,currentblock,fespacetype,fespacecomplex,fespacedim); } | ID '[' no_set_expr ']' { $$ = NewFEarray($1,currentblock,fespacetype,$3,fespacecomplex,fespacedim); } | ID '=' no_set_expr { $$ = NewFEvariable($1,currentblock,fespacetype,$3,fespacecomplex,fespacedim) } | '[' list_of_id1 ']' { $$ = NewFEvariable($2,currentblock,fespacetype,fespacecomplex,fespacedim) } | '[' list_of_id1 ']' '[' no_set_expr ']' { $$ = NewFEarray($2,currentblock,fespacetype,$5,fespacecomplex,fespacedim) } | '[' list_of_id1 ']' '=' no_set_expr { $$ = NewFEvariable($2,currentblock,fespacetype,$5,fespacecomplex,fespacedim) } ; ID_array_space: ID '(' no_set_expr ')' { $$ = NewFEarray($1,currentblock,fespacetype,$3,fespacecomplex,fespacedim); } | '[' list_of_id1 ']' '(' no_set_expr ')' { $$ = NewFEarray($2,currentblock,fespacetype,$5,fespacecomplex,fespacedim) } ; /* <> */ fespace123: FESPACE { fespacedim=2} |FESPACE1 { fespacedim=1} | FESPACE3 { fespacedim=3}; fespace: fespace123 {fespacecomplex=false; fespacetype = Find($1);} | fespace123 '<' TYPE '>' { if ($3 != typevarreal && $3 != typevarcomplex) lgerror (" type of finite element or "); fespacecomplex=($3==typevarcomplex); fespacetype = Find($1);} ; spaceIDa : ID_array_space { $$ = $1 } | spaceIDa ',' ID_array_space { $$=C_F0($1,$3);} ; spaceIDb : ID_space { $$ = $1 } | spaceIDb ',' ID_space { $$=C_F0($1,$3);} ; spaceIDs : fespace spaceIDb { $$=0; $$ = $2} | fespace '[' TYPE ']' spaceIDa { $$=0; $$ = $5} ; /* <> */ fespace_def: ID '(' parameters_list ')' {$$=currentblock->NewVar($1,typeFESpace($3),$3,dimFESpaceImage($3)); $3.destroy(); }; fespace_def_list: fespace_def | fespace_def_list ',' fespace_def {$$=C_F0($1,$3)} ; /* <> */ declaration: type_of_dcl {dcltype=$1} list_of_dcls ';' {$$=$3} /* see [[type_of_dcl]] [[list_of_dcls]] */ | FESPACEID fespace_def_list ';' {$$=$2} | spaceIDs ';'{ $$=$1} | FUNCTION ID '=' Expr ';' {$$=currentblock->NewID($1,$2,$4);} | FUNCTION type_of_dcl ID '(' list_of_id_args ')' { /* use the stack to store the prev return type*/ assert(kkembtype+1right(); routineinblock[kkembtype] = currentblock; $5=new Routine($1,$2->right(),$3,$5,currentblock); // routineinblock[kkembtype]->Add($3,"(",$5); //pas recursif pour l'instanat test FH 27 dec 2008 // cout << " \n after new routine \n " << endl; } '{' instructions'}' { currentblock=$5->Set($9); currentblock->Add($3,"(",$5); //pas recursif pour l'instant test FH 27 dec 2008 kkembtype--; $$=0; } | FUNCTION ID '(' list_of_id_args ')' {Block::open(currentblock); $1->SetArgs($4);} '=' no_comma_expr ';' { $$=currentblock->close(currentblock); $$=currentblock->NewID($1,$2,$8,*$4); delete $4; // FH 23032005 } ; begin: '{' { Block::open(currentblock)}; end: '}' { $$=currentblock->close(currentblock)}; for_loop: FOR {ffassert(inloopcount>*/ instruction: ';' {$$=0;} | INCLUDE STRING {zzzfff->input($2);$$= 0; } | LOAD STRING {load($2);$$= 0; } | try '{' instructions '}' catchs {$$=Try($3,$5,currentblock->close(currentblock));} | Expr ';' {$$=$1} /*[[Expr]]*/ | declaration {$$=$1} /*[[declaration]]*/ | for_loop '(' Expr ';' Expr ';' Expr ')' instruction {inloopcount--; $$=For($3,$5,$7,$9)} | for_loop '(' declaration_for ';' Expr ';' Expr ')' instruction {inloopcount--; $$=C_F0(For($3,$5,$7,$9),currentblock->close(currentblock))} | while_loop '(' Expr ')' instruction {inloopcount--;$$=While($3,$5)} | IF '(' Expr ')' instruction {$$=FIf($3,$5)} | IF '(' Expr ')' instruction ELSE instruction {$$=FIf($3,$5,$7)} | begin instructions end { $$=C_F0(new E_block($2,$3),atype()) } | BORDER ID border_expr { /* <> */ $$=0;currentblock->NewID(atype(),$2,C_F0(TheOperators,"[border]",$3))} | BORDER ID '[' array ']' ';' { $$=0;currentblock->NewID(atype(),$2,C_F0(TheOperators,"[border]",$4))} | BREAK ';' { if(inloopcount) $$= C_F0(new E_throw(E_exception::e_break),atype()); else lgerror("break not in loop") } | CONTINUE ';' { if(inloopcount) $$= C_F0(new E_throw(E_exception::e_continue),atype()) ; else lgerror("continue not in loop")} | RETURN Expr ';' { if (kkembtype>=0) $$= C_F0(new E_throw(E_exception::e_return,(rettype[kkembtype]->CastTo($2)).OnReturn()) ,atype()); else lgerror(" return not in routine ") } ; catchs: CATCH '(' '.' '.' '.' ')' instruction {$$ = $7; } ; bornes: '(' ID '=' Expr ',' Expr ')' { Block::open(currentblock); $$ = currentblock->NewVar($2,atype()); $$+= $4; $$+= $6; $$+= currentblock->NewVar("IndexBorder",atype());} ; bornes: '(' ID '=' Expr ',' Expr ';' ID ')' { Block::open(currentblock); $$ = currentblock->NewVar($2,atype()); $$+= $4; $$+= $6; $$+= currentblock->NewVar($8,atype());} ; /* <> */ border_expr: bornes instruction { $$ = ($1 += $2); currentblock->close(currentblock)} ; /*<>*/ Expr: no_comma_expr /*[[no_comma_expr]]*/ | Expr ',' Expr {$$=C_F0(TheOperators,$2,$1,$3);} ; /*<>*/ unop: '-' | '+' | '!' | PLUSPLUS | MOINSMOINS ; /*<>*/ no_comma_expr: no_set_expr /*[[no_set_expr]]*/ | no_set_expr '=' no_comma_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_set_expr PLUSEQ no_comma_expr {$$=C_F0(TheOperators,"+=",$1,$3)} | no_set_expr MOINSEQ no_comma_expr {$$=C_F0(TheOperators,"-=",$1,$3)} | no_set_expr MULEQ no_comma_expr {$$=C_F0(TheOperators,"*=",$1,$3)} | no_set_expr DIVEQ no_comma_expr {$$=C_F0(TheOperators,"/=",$1,$3)} | no_set_expr DOTMULEQ no_comma_expr {$$=C_F0(TheOperators,".*=",$1,$3)} | no_set_expr DOTDIVEQ no_comma_expr {$$=C_F0(TheOperators,"./=",$1,$3)} ; /*<>*/ no_set_expr: no_ternary_expr /*[[no_ternary_expr]]*/ | no_ternary_expr '?' no_ternary_expr ':' no_ternary_expr {$$=C_F0(TheOperators,"?:",$1,$3,$5)} | no_ternary_expr ':' no_ternary_expr {$$=C_F0(TheOperators,"::",$1,$3)} | no_ternary_expr ':' no_ternary_expr ':' no_ternary_expr {$$=C_F0(TheOperators,"::",$1,$3,$5)} ; /*<>*/ no_ternary_expr: unary_expr /*[[unary_expr]]*/ | no_ternary_expr '*' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr DOTSTAR no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr DOTSLASH no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '/' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '%' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '+' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '-' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr LTLT no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr GTGT no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '&' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr AND no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '|' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr OR no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '<' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr LE no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr '>' no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr GE no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr EQ no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | no_ternary_expr NE no_ternary_expr {$$=C_F0(TheOperators,$2,$1,$3)} ; /*<>*/ sub_script_expr: no_ternary_expr {$$=$1} | ':' {$$=C_F0(TheOperators,":")} | no_ternary_expr ':' no_ternary_expr {$$=C_F0(TheOperators,":",$1,$3)} | no_ternary_expr ':' no_ternary_expr ':' no_ternary_expr {$$=C_F0(TheOperators,":",$1,$3,$5)} ; /*<>*/ parameters: {$$=0} | FESPACE {$$=Find($1)} /*[[file:../fflib/AFunction2.cpp::Find]]*/ | FESPACE1 {$$=Find($1)} | FESPACE3 {$$=Find($1)} /* cf [[id]] [[no_set_expr]] */ | id '=' no_set_expr { $$=make_pair($1,$3)} | sub_script_expr {$$=$1} /*[[sub_script_expr]]*/ | parameters ',' FESPACE { $$ = ($1 += Find($3)) } | parameters ',' FESPACE1 { $$ = ($1 += Find($3)) } | parameters ',' FESPACE3 { $$ = ($1 += Find($3)) } | parameters ',' sub_script_expr { $$ = ($1 += $3) } /*[[sub_script_expr]]*/ /* cf [[id]] [[no_set_expr]] */ | parameters ',' id '=' no_set_expr { $$= ($1+= make_pair($3,$5)) } ; array: no_comma_expr {$$=$1} | array ',' no_comma_expr {$$ = ($1 += $3) }; /*<>*/ unary_expr: pow_expr /*[[pow_expr]]*/ | unop pow_expr %prec UNARY {$$=C_F0(TheOperators,$1,$2)} /*[[unop]] [[pow_expr]]*/ ; /*<>*/ pow_expr: primary /*[[primary]]*/ | primary '^' unary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | primary '_' unary_expr {$$=C_F0(TheOperators,$2,$1,$3)} | primary '\'' {$$=C_F0(TheOperators,$2,$1)} ; /*<>*/ primary: /* <> calls [[file:~/ff/draft/src/fflib/AFunction2.cpp::Find]] returns [[file:~/ff/draft/src/fflib/AFunction.hpp::C_F0]] */ ID {$$=Find($1);} | LNUM {$$= CConstant($1)} | DNUM {$$= CConstant($1)} | CNUM {$$= CConstant(complex(0,$1))} | STRING {$$= CConstant($1)} /* <> refers to [[parameters]] and creates an object of class [[file:../fflib/AFunction.hpp::C_F0]] */ | primary '(' parameters ')' {$$=C_F0($1,$2,$3);} | primary '[' sub_script_expr ']' {$$=C_F0($1,$2,$3)} | primary '[' sub_script_expr ',' sub_script_expr ']' {$$=C_F0($1,$2,$3,$5)} | primary '[' ']' {$$=C_F0($1,"[]")} | primary '.' ID { $$=C_F0($1,$3) ;} | FESPACE '.' ID { $$=C_F0(Find($1),$3) ;} | FESPACE '(' parameters ')' { $$=C_F0(Find($1),$2,$3) ;} | FESPACE1 '.' ID { $$=C_F0(Find($1),$3) ;} | FESPACE1 '(' parameters ')' { $$=C_F0(Find($1),$2,$3) ;} | FESPACE3 '.' ID { $$=C_F0(Find($1),$3) ;} | FESPACE3 '(' parameters ')' { $$=C_F0(Find($1),$2,$3) ;} | primary PLUSPLUS {$$=C_F0(TheRightOperators,$2,$1)} | primary MOINSMOINS {$$=C_F0(TheRightOperators,$2,$1)} | TYPE '(' Expr ')' { if ($1->right()->CastingFrom($3.left()) ) $$=$1->right()->CastTo($3) ; else { $$=$1->right()->Find("<--",basicAC_F0_wa($3)); if (!$$.left()) { cerr << " no wait to change " << $3.left()->right()->name() << " in " << $1->right()->name() << endl; CompileError(" Error in type(exp) "); } } } | '(' Expr ')' {$$=$2} | '[' array ']' { $$=C_F0(TheOperators,"[]",$2)} ; %% #include using namespace std; // bool lgdebug; // bool lexdebug; void ForDebug(); void ForDebug() { int i=0; i++; } //extern void ShowAlloc(const char *s, size_t lg); //extern void ShowNbAlloc(const char *s); void init_lgfem() ; void init_lgmesh() ; void init_lgmesh3() ; void init_algo(); bool withrgraphique = false; /// <> Called by mainff(). Activates the bison parser by calling yyparse() int Compile() { // see [[YYSTYPE]] [[yylval]] [[lglval]] extern YYSTYPE *plglval; // modif FH /// plglval is allocated at [[file:../fflib/global.cpp::plglval]] plglval = &lglval; int retvalue=0; currentblock=0; Block::open(currentblock); try { UnShowAlloc =0; retvalue=yyparse(); // grammar analysis starting from [[start_symbol]] if(retvalue==0){ if(currentblock) {retvalue=1; if(!mpirank) cerr << "Error:a block is not close" << endl; } else { if( verbosity ) { UnShowAlloc =1; cerr << " CodeAlloc : nb ptr "<< CodeAlloc::nb << ", size :" << CodeAlloc::lg << " mpirank: " < * ccout = new stdio_filebuf(stdout, std::ios_base::out); static stdio_filebuf ccout(stdout, std::ios_base::out); static stdio_filebuf ccin(stdin, std::ios_base::in); //stdio_filebuf *ccin= new stdio_filebuf(stdin, std::ios_base::in); cout.rdbuf(&ccout); cin.rdbuf(&ccin); cerr.rdbuf(&ccout); cout << " -- SetcppIo --" << endl; #endif ios::sync_with_stdio(); } // pour l'environement. extern const char * prognamearg; extern bool echo_edp; /// Called by mymain() and calls Compile() to run the FF language parser int mainff (int argc, char **argv) { if(argc) prognamearg=argv[0]; int vvold=verbosity; if(mpirank !=0) verbosity=0; // ALH - 14/10/8 - This breaks FFCS output redirection #ifndef ENABLE_FFCS SetcppIo(); #endif GetEnvironment(); vvold=verbosity; if(mpirank !=0) verbosity=0; // size_t lg000; // ShowAlloc("begin main ",lg000); int retvalue=0; ff_atend(fingraphique); if (initparallele)initparallele(argc,argv); CPUcompileInit= CPUtime(); withrgraphique = false; atexit(ForDebug); // AllFunctions::maptype xlocal; // local=&xlocal; lexdebug = false; lgdebug = false; char * cc= new char [1024]; // istream * ccin=0; if ( ! (getprog(cc,argc,argv) >0) ) { cout << "-- FreeFem++ v" << StrVersionNumber() << " (error parameter!)\n" ; if(ThePlotStream) {ffapi::ff_pclose(ThePlotStream); ThePlotStream=0;} return 1; } if(verbosity && (mpirank==0)) { cout << "-- FreeFem++ v" << StrVersionNumber() << endl; if(verbosity>1) cout << " file :" << cc << " " << " verbosity= " << verbosity << endl; } KN karg(argc); for(int i=0;i< argc;++i) karg[i]=argv[i]; pkarg= &karg; /// <> zzzfff = Newlex(cout,echo_edp); /* ccin= new ifstream(cc); if (argc >1 && (ccin!=0) ) ccin= new ifstream(argv[1]),throwassert(ccin); if (ccin!=0) zzzfff = new mylex(*ccin,cout) ; else zzzfff = new mylex(cin,cout) ; */ // les motsclefs zzzfff->Add("include",INCLUDE); zzzfff->Add("load",LOAD); zzzfff->Add("while",WHILE); zzzfff->Add("for",FOR); zzzfff->Add("if",IF); zzzfff->Add("else",ELSE); zzzfff->Add("end",ENDOFFILE); zzzfff->Add("break",BREAK); zzzfff->Add("continue",CONTINUE); zzzfff->Add("return",RETURN); zzzfff->Add("border",BORDER); zzzfff->Add("fespace",FESPACEID); zzzfff->Add("try",TRY); zzzfff->Add("catch",CATCH); zzzfff->Add("throw",THROW); // Init_map_type(); if(verbosity>2 || (mpirank==0 ) ) cout << " Load: "; callInitsFunct() ; // init for dynamique libs ... // init_lgfem() ; init_lgmesh() ; init_lgmesh3() ; init_algo(); #ifdef HAVE_LIBARPACK init_eigenvalue(); #endif if(init_lgparallele) init_lgparallele(); // callInitsFunct() ; // init for dynamique libs ... if(verbosity>2 || mpirank==0) cout << endl; zzzfff->input(cc); // [[file:../fflib/lex.cpp::void mylex input]] EnvironmentLoad(); // just before compile verbosity=vvold; retvalue= Compile(); // [[Compile]] // cout << " xxxxx " << retvalue << " " << ThePlotStream << endl; //if(end_parallele) end_parallele(); ff_finalize(); // currentblock->close(currentblock).eval(thestack); // fingraphique(); // FFCS: divert stream to FFCS if(ThePlotStream){ ffapi::ff_pclose(ThePlotStream); ThePlotStream=0; } Destroylex( zzzfff); delete [] cc; // ClearMem(); return retvalue; } /* FFCS: emacs configuration for this file */ /*! * Local Variables: * mode:antlr * ispell-local-dictionary:"british" * coding:utf-8 * End: */ freefem++-3.38-1/src/lglib/Makefile.am000644 000767 000024 00000001542 12235141673 017526 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- noinst_LIBRARIES=liblg.a liblg_a_SOURCES=lg.tab.hpp lg.tab.cpp mymain.cpp AM_CPPFLAGS=-I$(srcdir)/../fflib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics -I$(srcdir)/../femlib BUILT_SOURCES=lg.tab.hpp lg.tab.cpp # <> ALH - 10/9/13 - skip dependency on lg.ypp to make sure that lg.tab.?pp are not rebuilt on every new # machine (the danger is to generate unnecessary version conflicts) on these automatically generated files lg.tab.hpp lg.tab.cpp: -rm lg.tab.hpp lg.tab.cpp lg.tab.cpp.h bison -dtv -p lg lg.ypp -o lg.tab.cpp -mv lg.tab.cpp.h lg.tab.hpp # pour un pb entre des versions de bison libfreefem++.dylib: lg.tab.o ../fflib/libff.a g++ -bundle lg.tab.o ../fflib/libff.a $(UMFPACKLIB) $(ARPACKLIB) $(BLASLIB) $(LIBS) -o libfreefem++.dylib EXTRA_DIST=lg.ypp freefem++-3.38-1/src/lglib/Makefile.in000644 000767 000024 00000054707 12543260337 017553 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/lglib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = liblg_a_AR = $(AR) $(ARFLAGS) liblg_a_LIBADD = am_liblg_a_OBJECTS = lg.tab.$(OBJEXT) mymain.$(OBJEXT) liblg_a_OBJECTS = $(am_liblg_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblg_a_SOURCES) DIST_SOURCES = $(liblg_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = liblg.a liblg_a_SOURCES = lg.tab.hpp lg.tab.cpp mymain.cpp AM_CPPFLAGS = -I$(srcdir)/../fflib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics -I$(srcdir)/../femlib BUILT_SOURCES = lg.tab.hpp lg.tab.cpp EXTRA_DIST = lg.ypp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lglib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lglib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblg.a: $(liblg_a_OBJECTS) $(liblg_a_DEPENDENCIES) $(EXTRA_liblg_a_DEPENDENCIES) $(AM_V_at)-rm -f liblg.a $(AM_V_AR)$(liblg_a_AR) liblg.a $(liblg_a_OBJECTS) $(liblg_a_LIBADD) $(AM_V_at)$(RANLIB) liblg.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lg.tab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mymain.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # <> ALH - 10/9/13 - skip dependency on lg.ypp to make sure that lg.tab.?pp are not rebuilt on every new # machine (the danger is to generate unnecessary version conflicts) on these automatically generated files lg.tab.hpp lg.tab.cpp: -rm lg.tab.hpp lg.tab.cpp lg.tab.cpp.h bison -dtv -p lg lg.ypp -o lg.tab.cpp -mv lg.tab.cpp.h lg.tab.hpp # pour un pb entre des versions de bison libfreefem++.dylib: lg.tab.o ../fflib/libff.a g++ -bundle lg.tab.o ../fflib/libff.a $(UMFPACKLIB) $(ARPACKLIB) $(BLASLIB) $(LIBS) -o libfreefem++.dylib # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/lglib/mymain.cpp000755 000767 000024 00000000470 12471700247 017472 0ustar00hechtstaff000000 000000 /// \file int mainff (int argc, char **argv); namespace ffapi { void init();} extern void init_ptr_parallelepmi(); /// called by platform-dependent main() in src/Graphics/sansrgraph.cpp and others. int mymain (int argc, char **argv) { ffapi::init(); init_ptr_parallelepmi(); return mainff(argc,argv); } freefem++-3.38-1/src/Graphics/DefColor.cpp000644 000767 000024 00000005435 11406226635 020350 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include using namespace std; void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,int nbcolors,float *colors); void hsvToRgb (float h, float s, float v, float & r, float & g, float & b) { int i; float aa, bb, cc, f; if (s == 0) /* Grayscale */ r = g = b = v; else { h = h - floor(h); if (h == 1.0) h = 0; h *= 6.0; i = int(h); f = h - i; aa = v * (1 - s); bb = v * (1 - (s * f)); cc = v * (1 - (s * (1 - f))); switch (i) { case 0: r = v; g = cc; b = aa; break; case 1: r = bb; g = v; b = aa; break; case 2: r = aa; g = v; b = cc; break; case 3: r = aa; g = bb; b = v; break; case 4: r = cc; g = aa; b = v; break; case 5: r = v; g = aa; b = bb; break; } } } // def des couleurs de la tables void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,int nbcolors,float *colors) { if(k<=0) { r=g=b=1.;} // white else if (k==1) { r=g=b=0.; } // black else if (k >= nb) { r=g=b=0.;} // black else if (grey) { float gg = 0.1+0.9*float(k-2)/(nb-3); r=g=b=gg;} else if (nbcolors<=1) { float h=float(k-2)/(nb-2),s=1.,v=1.; hsvToRgb(h,s,v,r,g,b); return;} else { // interpolation dans la table hsv int i= (k-2); int j0= i*(nbcolors-1) / (nb-2); int j1=j0+1; int i0= j0*(nb-2)/(nbcolors-1); int i1= j1*(nb-2)/(nbcolors-1); int j03=j0*3,j13=j1*3; float a=float(i1-i)/(i1-i0),a1=1-a; if (hsv) { float h = colors[j03+0]*a + colors[j13+0]*a1; float s = colors[j03+1]*a + colors[j13+1]*a1; float v = colors[j03+2]*a + colors[j13+2]*a1; hsvToRgb(h,s,v,r,g,b); } else { r = colors[j03+0]*a + colors[j13+0]*a1; g = colors[j03+1]*a + colors[j13+1]*a1; b = colors[j03+2]*a + colors[j13+2]*a1; } } } freefem++-3.38-1/src/Graphics/ff-win32.cpp000644 000767 000024 00000004247 12471464467 020220 0ustar00hechtstaff000000 000000 #ifdef _WIN32 #include using namespace std; #include #include #include //*OT use for the console window BOOL ShowOpenDialogBox1(char *fileName) { OPENFILENAME ofn; char szDirName[256]; const char *strFilter="PCgFEM Files (*.edp)\0*.edp\0All Files (*.*)\0*.*\0\0"; memset(&ofn, 0, sizeof(OPENFILENAME)); getcwd(szDirName,sizeof(szDirName)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = strFilter; ofn.lpstrFileTitle = fileName; ofn.nMaxFileTitle = 80; ofn.lpstrInitialDir=szDirName; ofn.lpstrTitle ="Choose you freefem '*.edp' File"; ofn.Flags=OFN_SHOWHELP|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; return GetOpenFileName(&ofn); } string ChangeExt(const string & ff,const char * suff) { int dot = ff.rfind(".edp"); assert(dot>0); return ff.substr(0,dot)+suff; } bool GetConsoleBuff(const string &edpname) { CONSOLE_SCREEN_BUFFER_INFO csbi; //* to get buffer info HANDLE hConOut= GetStdHandle(STD_OUTPUT_HANDLE); //cout << " handle " << hConOut << endl; if( hConOut == 0) return false ; if ( INVALID_HANDLE_VALUE == hConOut) return false; GetConsoleScreenBufferInfo(hConOut, &csbi); COORD coordLine = {0,0}; CHAR *szLine=0; //* buffer to read from the console (a line) DWORD dwCharsRead; FILE *fp; string fname=ChangeExt(edpname,".log"); if ((fp = fopen(fname.c_str(),"w"))==NULL) { perror(fname.c_str()); cout<< " err fopen logfile: "<< fname << endl; return false; } szLine = new CHAR [csbi.dwSize.X+1]; for (int i=0; i 0)) szLine[j--] =0; if (j < csbi.dwSize.X-1) szLine[j+1] = '\n'; fprintf(fp,"%s",szLine); coordLine.Y++; } fclose(fp); delete [] szLine; cout << " save log in : '"<< fname << "'\n" ; return true; } #endif freefem++-3.38-1/src/Graphics/ffglut.cpp000644 000767 000024 00000220541 12471722341 020135 0ustar00hechtstaff000000 000000 #ifdef __APPLE__ #include #else #include #endif //#include #include #include #include #include #include using namespace std; #include #include #include #include #include #include #include #include #include #include "rgraph.hpp" #include "fem.hpp" #include "RNM.hpp" #include "Mesh2dn.hpp" #include "Mesh3dn.hpp" #include "PlotStream.hpp" extern long verbosity; // add for the gestion of the endianness of the file. //PlotStream::fBytes PlotStream::zott; //0123; //PlotStream::hBytes PlotStream::zottffss; //012345678; // ---- FH using namespace Fem2D; using std::numeric_limits; const R pi=M_PI;//4*atan(1.); using namespace std; int debug=1; int casemouse=0,keyact=0; double gwait=0;// no wait in second #include "ffglut.hpp" #include "ffthreads.hpp" int version =0; //Mutex MutexNextPlot; Thread::Id tidRead=0; bool NoMorePlot=false; bool NoMorePlotTilte=false; ThePlot *currentPlot=0, *nextPlot=0; bool inThreadRead=false; FILE *datafile=0; static bool TryNewPlot( void ); void LauchNextRead(); void WaitNextRead(); THREADFUNC(ThreadRead,fd); //void * ThreadRead(void *fd); int kread=-1; map AllWindows; map Num2Windows; int Fin(int code) { WaitNextRead(); if(!NoMorePlot && debug>2) cout << " exit before end " << endl; if(NoMorePlot && !code) exit(NoMorePlot ? 0 : 1); if(code) exit(NoMorePlot ? 0 : 1); return 0; } int ReadOnePlot(FILE *fp) { int err=0; if(!fp) return -4; err= feof(fp) ; if(err) return -2; err= ferror(fp) ; if(err) return -3; PlotStream f(fp); f.set_binary_mode(); const char * magic2="#!ffglutdata2.."; const char * magic3="#!ffglutdata3.."; const char * magic3_1="#!ffglutdata3.1"; const int lmagic=strlen(magic2); char magicxx[32]; err=0; // init .. if(kread==-1) { for(int i=0;i2) cout << " Err read magic heading " << endl; goto Lreturn; //return err; } kread++; if(debug>2) cout << " Read entete " << version << endl; int c1 =getc(fp);// if(c1==13) int c2 =getc(fp);// } long cas; f >> cas; err=-1; if (feof(fp)) goto Lreturn ; if((debug > 2)) cout << " ReadOnePlot " << kread+1<< " cas = " << cas << " " << nextPlot << endl; if(cas==PlotStream::dt_newplot) { assert(nextPlot==0); nextPlot = new ThePlot(f,currentPlot,++kread); if(debug>1) cout << " next is build " << nextPlot<< " wait :" << nextPlot->wait << " -> " << kread << " gwait = " << gwait << endl; assert(nextPlot); err=0; } else { err=1; cout << " Error Cas inconnue (skip) " << endl; } Lreturn: f.set_text_mode(); return err; } void TimerNextPlot(int value) { // the routine to until the end of nextplot. // we use gluttimerfunc functionnaly // remark, if we miss we retry. // ----- // if(debug) cout << " TimeNextPlot " << endl; value=min(1000,(value*3)/2);// try at leat every 1 second (not to heavy computation) if(TryNewPlot()) glutPostRedisplay(); else glutTimerFunc(value,TimerNextPlot,value); } int SendForNextPlot() { // to send a event to plot the date sheet. // and out a timer to wait to the end of read.. // every 25/ second.. = 1000/25 = 40 ms if(NoMorePlot) { if(gwait ) {usleep((useconds_t)(1e6*gwait)); Fin(0); } if((debug > 1)) cout << " send signal For Next plot, skip: No More Plot ! " << endl; return 0; } if((debug > 1)) cout << " Try to read read plot "<< endl; // put a timer for wait to the end of read glutTimerFunc(40,TimerNextPlot,40); return 1; } static bool TryNewPlot( void ); int signep4(int i0,int i1,int i2,int i3) { // calcul du signe dans la permutation int s =1; if(i0>i1) s=-s,Exchange(i0,i1); if(i1>i2) s=-s,Exchange(i1,i2); if(i2>i3) s=-s,Exchange(i2,i3); // i3 max if(i0>i1) s=-s,Exchange(i0,i1); if(i1>i2) s=-s,Exchange(i1,i2); // i2 max < i if(i0>i1) s=-s,Exchange(i0,i1); return s; } inline R3 bary(const R3 K[4],R f[4],int i0,int i1,R v) { R d=f[i0]-f[i1]; assert(fabs(d)>1e-20); R l1= (f[i0] - v)/ d; // == 1 si v = f[i1] R l0 = 1. -l1; assert(l0 >=-1e-10 && l1 >= -1e-10); return K[i0]*l0 + K[i1]*l1; // == K[i1] si l1 ==1 => v = f[i1] } void drawisoTet(const R3 K[4],R f[4],R v) { static const int nvfaceTet[4][3] ={{3,2,1}, {0,2,3},{ 3,1,0},{ 0,1,2}} ;//{ {2,1,3},{0,2,3},{1,0,3},{0,1,2} }; R3 P[4]; int nP=0; int np[4],nm[4]; int km=0,kp=0; for (int i=0;i<4;++i) { if(f[i]<=v) nm[km++]=i; if(f[i]>=v) np[kp++]=i; } //cout << "km kp "<< km << " " << kp << endl; int h=-1,b[3]; if(kp==1 && km==3) { h = np[0]; b[0]=nvfaceTet[h][0]; b[1]=nvfaceTet[h][1]; b[2]=nvfaceTet[h][2]; } if(km==1 && kp == 3) { h = nm[0]; b[0]=nvfaceTet[h][0]; b[2]=nvfaceTet[h][1]; b[1]=nvfaceTet[h][2]; } if(kp==2 && km==2) {// cas quad if(signep4(nm[0],nm[1],np[0],np[1]) < 0) Exchange(nm[0],nm[1]); // le tet m[0],nm[1],np[0],np[1] est positif P[0]=bary(K,f,nm[0],np[0],v); P[1]=bary(K,f,nm[0],np[1],v); P[2]=bary(K,f,nm[1],np[1],v); P[3]=bary(K,f,nm[1],np[0],v); nP=4; } else if (h>=0) { // cas triangle P[0]=bary(K,f,h,b[0],v); P[1]=bary(K,f,h,b[1],v); P[2]=bary(K,f,h,b[2],v); nP=3; } /* if(nP) { cout << "+ " << np[0] << " - " << nm[0] << endl; cout << nP << " ; "; for(int i=0;i2) { R3 N(R3(P[0],P[1])^R3(P[0],P[2])); N /= N.norme(); glNormal3d(N.x,N.y,N.z); } glBegin(GL_POLYGON); for(int i=0;i=0) ; // assert(nP < 3 || det(P[0],P[1],P[2],K[nm[0]]) <=0) ; } int dichotomie(const KN_ &viso,R v) { int i=0,j=viso.N(),k; if (v viso[j-1]) return -1; while (i v) j=k; else i=k; return i; } int ShowGlerror(const char *s) { GLint error = glGetError(); if ( error != GL_NO_ERROR ) printf("Attention %s erreur : %x \n",s,error); return error; } // def des couleurs de la tables void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,KN colors) { int nbcolors = colors.N()/3; if(k<=0) { r=g=b=1.;} // white else if (k==1) { r=g=b=0.; } // black else if (k >= nb) { r=g=b=0.;} // black else if (grey) { float gg = 0.1+0.9*float(k-2)/(nb-3); r=g=b=gg;} else if (nbcolors<=1) { float h=float(k-2)/(nb-2),s=1.,v=1.; hsvToRgb(h,s,v,r,g,b); return;} else { // interpolation dans la table hsv int i= (k-2); int j0= i*(nbcolors-1) / (nb-2); int j1=j0+1; int i0= j0*(nb-2)/(nbcolors-1); int i1= j1*(nb-2)/(nbcolors-1); int j03=j0*3,j13=j1*3; float a=float(i1-i)/(i1-i0),a1=1-a; if (hsv) { float h = colors[j03+0]*a + colors[j13+0]*a1; float s = colors[j03+1]*a + colors[j13+1]*a1; float v = colors[j03+2]*a + colors[j13+2]*a1; hsvToRgb(h,s,v,r,g,b); } else { r = colors[j03+0]*a + colors[j13+0]*a1; g = colors[j03+1]*a + colors[j13+1]*a1; b = colors[j03+2]*a + colors[j13+2]*a1; } } } template void Plot(const Mesh & Th,bool fill,bool plotmesh,bool plotborder,ThePlot & plot,GLint gllists,int * lok) { glDisable(GL_DEPTH_TEST); ShowGlerror("begin Mesh plot"); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); R z1= plot.z0; R z2= plot.z0; double r=0,g=0,b=0; if((debug > 3)) cout<< " OnePlotMesh::Draw " << plotmesh << " " << plotborder << " " << Th.nbBrdElmts() << " " << z1 << " " << z2 << endl; // plot.SetColorTable(16) ; bool cc[3]= { plotborder , plotmesh && fill , plotmesh }; int kk=0; //for(int i=0;i<3;i++) // cout << cc[i] << " " << lok[i] << " , "; //cout << endl; if(cc[kk]) if(lok[kk]) glCallList(gllists+kk); else { lok[kk]=1; glNewList(gllists+kk,GL_COMPILE_AND_EXECUTE ); // save la list sans affichage glLineWidth(2); glBegin(GL_LINES); for (int i=0;itheplot; win->SetScreenView() ; glColor3d(0.,0.,0.); cout << " Error plot item empty " << item << endl; int i = 4; char s[100]; sprintf(s,"Warning the item %ld fot the plot is empty",item); win->Show(s,4+item*2); win->SetView() ; } template void OnePlotMesh::Draw(OneWindow *win) { initlist(); ThePlot & plot=*win->theplot; Plot(*Th,plot.fill,true,true,plot,gllists,oklist); ShowGlerror("OnePlotMesh::Draw"); } void OnePlotMesh3::Draw(OneWindow *win) { initlist(); ThePlot & plot=*win->theplot; Plot(*Th,plot.fill,true,true,plot,gllists,oklist); ShowGlerror("OnePlotMesh3::Draw"); } void OnePlotFE3::Draw(OneWindow *win) { initlist(); ThePlot & plot=*win->theplot; ShowGlerror("begin OnePlotFE3 plot"); /// plot.SetDefIsoV(); if(plot.fill && what%10==6) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); else glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); bool change=false; if( (what%10==6) ) { change = win->changeiso ; } if(what%10==6) glEnable(GL_DEPTH_TEST); else glEnable(GL_DEPTH_TEST); win->setLighting(); if(oklist[0] && !change) glCallList(gllists+0); else { oklist[0]=1; glNewList(gllists+0,GL_COMPILE_AND_EXECUTE); // save la list sans affichage int nsubV=Psub.N(); int nsubT=Ksub.N()/4; KN Pn(nsubV); int nK=v.N()/ Th->nt; for(int k=0,o=0;knt;++k, o+= nK) { const Mesh3::Element & K=(*Th)[k]; int ii[4];// R ff[4]; R3 Pt[4]; for(int i=0;iunsetLighting(); ShowGlerror("b mesh OnePlotFE plot"); Plot(*Th,false,plot.drawmeshes,plot.drawborder,plot,gllists+2,&oklist[2]); ShowGlerror("OnePlotFE::Draw"); } template OnePlotFE::OnePlotFE(const Mesh *T,long w,PlotStream & f) :OnePlot(w,2,5),Th(T) { R2 P0,P1; Th->BoundingBox(P0,P1); Pmin=P0; Pmax=P1; if(version==2) { long nsub; f>> nsub; int nsubT=NbOfSubTriangle(nsub); int nsubV=NbOfSubInternalVertices(nsub); Psub.resize(nsubV); Ksub.resize(nsubT*3); for(int i=0,j=0;i> Psub ; f >> Ksub ; if(debug>2) { cout << " Psub " << Psub << endl; cout << " Ksub " << Ksub << endl;} } if(what<10) f>> v; else { f>> vc; vc2v(); } cas =2; vc2v(); if(debug>3) cout << "OnePlotFE" << Th <<" " << what<< " " << Psub.N() << " " << Ksub.N()/3 <<" " << v.N() << endl; ffassert(f.good()); } template bool OnePlotFE::vc2v() { bool ret=false; if(what>=10) { ret=true; int n = vc.N(); if(v.size() !=n) v.resize(n); for(int i=0;i=10) { ret=true; int n = vc.N(); if(v.size() !=n) v.resize(n); for(int i=0;isetLighting(); // OneWindow * win=plot.win;// bof bof la struct est tres mauvaise . assert(win); const Mesh & Th(*this->Th); int nsubT= Ksub.N()/3;//NbOfSubTriangle(nsub); int nsubV=Psub.N();//NbOfSubInternalVertices(nsub); int nK=v.N()/ Th.nt; if(debug>4) cout << "\t\t\tOnePlotMesh::Draw " <getcadre(xmin,xmax,ymin,ymax); double d= Max(ymax-ymin,xmax-xmin); R kk = 4*win->hpixel; R cc = win->hpixel*40; int klist=0; bool change=false; if( (what%10==1) ) { if ( plot.fill) klist=1; change = win->changeiso ; } else if (what%10==2) change = win->changearrow ; if(debug>9) cout << change << " " << klist << " ... " << oklist[klist] << " fill = " << plot.fill << " " << coef << endl; if (oklist[klist] && ! change ) glCallList(gllists+klist); else { // R fmn,fmx,vmn,vmx; // win->theplot->dyn_bfv(win,fmn,fmx,vmn,vmx) ; //win->theplot->SetDefIsoV(0,0,fmn,fmx,vmn,vmx) ; oklist[klist]=1; glNewList(gllists+klist,GL_COMPILE_AND_EXECUTE); // save la list aevc affichage if(debug>100) cout << win->Bmin << ", Bmax: " << win->Bmax << " Viso: "<< plot.Viso << endl; for(int k=0;k100) cout << uv << " l= " << l << " " << coef << " " < cc) uv = uv*(cc/l); glBegin(GL_LINES); win->Seg(P,P+uv); if (10*l>kk) { win->Seg(P+uv,P+uv+dd+dn); win->Seg(P+uv,P+uv+dd-dn); } glEnd(); } } glEndList(); // fin de la list } // if(plot.drawmeshes) // if(what==2) // glEnable(GL_DEPTH_TEST); ShowGlerror("b mesh OnePlotFE plot"); win->unsetLighting(); Plot(Th,false,plot.drawmeshes,plot.drawborder,plot,gllists+2,&oklist[2]); ShowGlerror("OnePlotFE::Draw"); } template void OnePlotFE::dyn_bfv(OneWindow *win,R & fmn,R &fmx,R & vmn2,R & vmx2) const { const Mesh & Th(*this->Th); int nsubT= Ksub.N()/3;//NbOfSubTriangle(nsub); int nsubV=Psub.N();//NbOfSubInternalVertices(nsub); int nK=v.N()/ Th.nt; ffassert(v.N()== Th.nt*nK); ffassert(nK == nsubV*(what%10)); int o=0; KN Pn(Psub.N()); KN P3(Psub.N()); double xmin,xmax,ymin,ymax; KN inCadre(nsubV); win->getcadre(xmin,xmax,ymin,ymax); bool ccc=false; bool ddd=false; if(ddd) cout << " dyn__ .. " << endl; for(int k=0;kmodelMatrix,win->projMatrix,win->viewport, &P3[i].x,&P3[i].y,&P3[i].z); if(ddd) cout <InRecScreen(P0,P1)) { if(debug>100) cout << " ??? " << P0 << " " << P1 << " , " << win->Bmin << " , " << win->Bmax << endl; inCadre[i1]=2; inCadre[i2]=2; inCadre[i3]=2; } } for (int i=0,j=0;i100 && ccc) cout << " dny_bfv : " << fmn << " " << fmx << " " << sqrt(vmn2) << " " << sqrt(vmx2) << " : " << Pn[0] << endl; } } void OnePlotCurve::Draw(OneWindow *win) { initlist(); ThePlot & plot= *win->theplot; plot.SetColorTable(16) ; double z = plot.z0; glBegin(GL_LINE_STRIP); plot.color(2); // cout << "nePlotCurve::Draw " << xx << " " << yy << endl; for (int i=0;itheplot; R h = 8*win->hpixel; double z = plot.z0; plot.SetColorTable(16) ; // vector > > data; for(int i=0;i > & v=data[i]; ShowGlerror("end OnePlotBorder::Draw 1"); for(int j=1;jSeg(Po,Pn); glEnd(); glLineWidth(1); glBegin(GL_LINES); if(j!=1) { win->Seg(Po,Po+dd+dn); win->Seg(Po,Po+dd-dn); } glEnd(); } ShowGlerror("end OnePlotBorder::Draw 2"); glPointSize(7); glBegin(GL_POINTS); int l= v.size()-1; plot.color(2+v[0].first); glVertex3d(v[0].second.x,v[0].second.y,z); plot.color(2+v[l].first); glVertex3d(v[l].second.x,v[l].second.y,z); glEnd(); glPointSize(1); ShowGlerror("end OnePlotBorder::Draw 3"); } ShowGlerror("end OnePlotBorder::Draw"); } OneWindow::OneWindow(int h,int w,ThePlot *p) : icurrentPlot(lplots.begin()), lplotssize(0), height(h),width(w),theplot(0),hpixel(1), Bmin(0,0),Bmax(1,1),oBmin(Bmin),oBmax(Bmax),zmin(0),zmax(1), windowdump(false),help(false), rapz0(-1.),rapz(1),withlight(false), changearrow(true),changeiso(true), keepPV(false),init(false) { add(p); } void OneWindow::set(ThePlot *p) { //ffassert(p); bool first = !theplot; bool change = theplot != p; theplot=p; if(p) { plotdim=p->plotdim; } if(!init) { rapz0 =-1; // to recompute the defalut rapz // p->win=this; // if(first) DefaultView(2) ; } } void OneWindow::add(ThePlot *p) { if(p) { lplots.push_back(p); lplotssize++; ++icurrentPlot; if(icurrentPlot==lplots.end()) --icurrentPlot;// the previous if(icurrentPlot != lplots.end()) set(*icurrentPlot); if( lplotssize>10) { bool isfirst = theplot == *lplots.begin(); if(debug >1) cout << " delete a plot " << *lplots.begin() << endl; delete *lplots.begin(); lplots.erase(lplots.begin()); lplotssize--; if(isfirst) set(*lplots.begin()); // change to the next plot } } else set(p); } void OneWindow::DefaultView(int state) { if(debug>1) cout << "DefaultView " << state << " " <plotdim; R3 A(theplot->Pmin),B(theplot->Pmax); R3 D(A,B); R dxy= max(D.x,D.y); zmax = theplot->fmax; zmin = theplot->fmin; theta=theplot->theta; phi=theplot->phi; if(theplot->datadim==3) rapz0=1; else if(rapz0<=0) { // ( zmax-zmin )*rapz0 = 0.3 dxyy rapz0 = 0.4* dxy/(zmax-zmin) ; if(debug>2) { cout << " rapz0 = " << rapz0 ; cout << " dz = " << zmax-zmin << " dxy =" << dxy << endl; } } rapz=rapz0; coef_dist=theplot->dcoef; focal=theplot->focal; if(theplot->datadim==3) { Bmin3=A; Bmax3=B; } else { // data plot 2d ou 1 d... if(theplot->boundingbox.size() ==4) { Bmin3.x=theplot->boundingbox[0]; Bmin3.y=theplot->boundingbox[1]; Bmax3.x=theplot->boundingbox[2]; Bmax3.y=theplot->boundingbox[3]; } else { Bmin3.x=A.x; Bmin3.y=A.y; Bmax3.x=B.x; Bmax3.y=B.y; } Bmin3.z=theplot->fmin; Bmax3.z=theplot->fmax; } Pvue3=(Bmin3+Bmax3)/2; D *=0.05; if(theplot->boundingbox.size() !=4) { A -= D; B += D; } else { R x1=theplot->boundingbox[0],y1=theplot->boundingbox[1]; R x2=theplot->boundingbox[2],y2=theplot->boundingbox[3]; A = R2(min(x1,x2),min(y1,y2)); B = R2(max(x1,x2),max(y1,y2)); } if (theplot->aspectratio) cadreortho(A.p2(),B.p2()); else cadre(A.p2(),B.p2()); } hpixel = (Bmax.x-Bmin.x)/width; // SetView() ; } void OneWindow::SetScreenView() const { glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,width,0,height,-1,1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void OneWindow::SetView() { if(plotdim==3 && theplot) { glViewport(0, 0,width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); R ratio= (double) width / (double) height; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); R aspect=ratio; R3 DD(Bmin3,Bmax3); DD.z *= rapz; R dmax= DD.norme();; R dist = 0.5*dmax/sin(focal/2)*coef_dist; cam.x=Pvue3.x+cos(phi)*cos(theta)*dist; cam.y=Pvue3.y+cos(phi)*sin(theta)*dist; cam.z=Pvue3.z*rapz+dist*sin(phi); R znear=max(dist-dmax,1e-30); R zfare=dist+dmax; gluPerspective(focal*180./M_PI,aspect,znear,zfare); /* if (eye) { R dmm = -dmax*ceyes; R dx = -dmm*sin(theta); R dy = dmm*cos(theta); camx += dx*eye; camy += dy*eye; } */ if(debug>2) { cout <<" setview 3d: rapz " << rapz << " cam: "; cout << cam << " Pvue:" ; cout << Pvue3 << " theta " << theta << " phi = "<< phi << endl; } gluLookAt(cam.x,cam.y,cam.z,Pvue3.x,Pvue3.y,Pvue3.z*rapz,0.,0.,1.); glScaled(1.,1.,rapz); glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); ShowGlerror(" Get PM"); glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); ShowGlerror(" Get MV"); glGetIntegerv(GL_VIEWPORT,viewport); ShowGlerror(" Get VP"); } else { ShowGlerror("Begin SetView"); glDisable(GL_DEPTH_TEST); glViewport(0, 0,width, height); R dz0,dz1,zm=0; if(plotdim==3) { dz0=Bmin3.z; dz1=Bmax3.z; } else { R zzmin = Min(zmin,theplot->fminT); R zzmax = Max(zmax,theplot->fmaxT); R dz = (zzmax-zzmin); zm=(zzmin+zzmax)*0.5; // to be sur the the z size is no zero . dz = max(dz,(Bmax.x-Bmin.x)*0.1); dz = max(dz,(Bmax.y-Bmin.y)*0.1); dz0=-dz; dz1 = dz; } if((debug>3 )) cout << "\t\t\t SetView " << this << " " << Bmin << " " << Bmax << " dz " << dz0 << " " << dz1 << " theta " << theta << " phi = "<< phi << endl; ShowGlerror("0 Set MV"); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); ShowGlerror(" Set MV"); glMatrixMode(GL_PROJECTION); glLoadIdentity(); ShowGlerror(" Set PM 1"); glOrtho(Bmin.x,Bmax.x,Bmin.y,Bmax.y,dz0,dz1); ShowGlerror(" Set PM 2"); R2 M=(Bmin+Bmax)/2.; glTranslated(0,0,-zm); //glLineWidth(1); //glColor3d(0.,0.,0.); glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); ShowGlerror(" Get PM"); glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); ShowGlerror(" Get MV"); glGetIntegerv(GL_VIEWPORT,viewport); ShowGlerror(" Get VP"); ShowGlerror("End SetView "); } } void OneWindow::resize(int w,int h) { double ww=width,hh=height; width=w; height=h; if (theplot && theplot->aspectratio) { cadreortho(oBmin,oBmax); } } void OneWindow::zoom(R coef) { coef_dist*=coef; R2 M=(oBmin+oBmax)/2.; R2 D=(oBmax-oBmin)/2.; R2 A= M - D*coef; R2 B= M + D*coef; if (theplot->aspectratio) cadreortho(A,B); else cadre(A,B); } void OneWindow::zoom(int w,int h,R coef) { GLdouble x=w,y=height-h,z=(zmin+zmax)/2.; GLdouble xx,yy,zz; GLint ok= gluUnProject( x,y,z,modelMatrix,projMatrix,viewport,&xx,&yy,&zz); ShowGlerror(" UnPro .. "); if(debug>2) cout << " ok " << ok << " " << x << " " << y << " " << z << " -> " << xx << " " << yy << " " << zz << endl; R2 oD(oBmin,oBmax); R2 D(Bmin,Bmax); R2 O(xx,yy);// oBmin.x+D.x*xx/width,oBmin.y+D.y*yy/height); if((debug > 3)) cout<< " zoom : " << this << " O " << O << " " << coef << " D = "<< D<< "as " << theplot->aspectratio << endl; oD *= 0.5*coef; R2 A = O - oD; R2 B = O + oD; if (theplot->aspectratio) cadreortho(A,B); else cadre(A,B); } void OneWindow::MoveXView(R dx,R dy) { R3 D(Bmin3,Bmax3); R3 dd( dx*D.x*sin(theta),-dx*D.y*cos(theta), - dy*D.z); if(debug>2) cout << " MoveXView "<< dx << " " << dy << " " << D << " mn: " << Bmin3 <<" mx :" << Bmax3 << " d=" << dd << endl; Pvue3 += dd/50.; // 2d ... add FH july 2009 R2 D2(-dx*5*hpixel,-dy*5*hpixel); oBmin += D2; oBmax += D2; Bmin += D2; Bmax += D2; // cout << xm << " " << ym << " " << zm << endl; } void OneWindow::cadre(R2 A,R2 B) { oBmin=Bmin=A; oBmax=Bmax=B; hpixel = (Bmax.x-Bmin.x)/width; } void OneWindow::getcadre(double &xmin,double &xmax,double &ymin,double &ymax) { xmin = Bmin.x; xmax = Bmax.x; ymin = Bmin.y; ymax = Bmax.y; } void OneWindow::Display() { if(!theplot) return; ffassert(this && theplot); SetScreenView() ; glColor3d(0.,0.,0.); if(help) { theplot->DrawHelp(this); help=false; } else { ShowGlerror("Begin Display"); // SetView(); if(theplot) theplot->Draw(this); ShowGlerror("After Display"); } } void OneWindow::cadreortho(R2 A, R2 B) { R2 D(A,B); oBmin=A; oBmax=B; double cxy = D.y*width/ (D.x*height); if ( D.y*width < D.x*height) // width -> infty => D.x la ref D.y = D.x*(double) height/ width; else // height -> infty => D.y la ref D.x = D.y*(double) width/height; R2 M=(A+B)/2., D2=D/2.; Bmin= M - D2; Bmax= M + D2; if((debug > 10)) cout << " cadreortho: "<< " :: " << Bmin << " " << Bmax <<" oB " << oBmin << " " << oBmax << endl; // if((debug > 10)) cout << "cadreortho\n"; } void OneWindow::setLighting() { if(withlight) { if(plotdim==3) { GLfloat lp0[4] = { (float) cam.x,(float) cam.y, (float) cam.z, 1.0F }; glLightfv(GL_LIGHT0,GL_POSITION,lp0); if(debug>1) cout << " Light pos 3d: " << cam << endl; } else { GLfloat position[] = {(float) Pvue3.x,(float) Pvue3.y,(float) (Pvue3.z+(Bmax3.z-Bmin3.z)*3),1.f} ; glLightfv(GL_LIGHT0, GL_POSITION, position); } float cca=0.3,ccd=1., ccs=0.8; GLfloat ambient[] = {cca,cca,cca,1.0f};//diffrents paramtres GLfloat diffuse[] = {ccd,ccd,ccd,1.0f}; GLfloat specular_reflexion[] = {ccs,ccs,ccs,1.0f}; GLubyte shiny_obj = 128; glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1); glEnable(GL_LIGHTING);//positionnement de la lumire avec glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);//les diffrents paramtres glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse); glEnable(GL_COLOR_MATERIAL);//spcification de la rflexion sur les matriaux glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse); // glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular_reflexion);// on peut le faire avant chaque objet //glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,shiny_obj);//si on veut qu'ils aient des caractristiques # glShadeModel(GL_FLAT); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } else { glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); } } void OneWindow::unsetLighting() { glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); //g->lightning=false; } OnePlotBorder::OnePlotBorder(PlotStream & f) :OnePlot(4,2,1) { long nbd; f>> nbd; data.resize(nbd); for(int i=0;i> n; //cout << n << endl; data[i].resize(n+1); for(int j=0;j<=n;++j) { long l; double x,y; f >> l>> x >> y; // cout << x << ' ' << y << ' ' << l << endl; R2 P(x,y); Pmin=Minc(Pmin,P); Pmax=Maxc(Pmax,P); data[i][j]=make_pair(l,P); } } ffassert(f.good()); } void OnePlot::GLDraw(OneWindow *win) { ThePlot & plot= *win->theplot; Draw(win); win->changeiso=0; win->changearrow=0; } void ThePlot::DrawHelp(OneWindow *win) { int i = 1; win->Show("Enter a keyboard character in the FreeFem Graphics window in order to:",i++); i+=1; win->Show("enter) wait next plot",i++); win->Show("p) previous plot (10 plots saved) ",i++); win->Show("ESC) exit from ffglut (if termined) ",i++); win->Show("^c) non-ignorable exit from ffglut ",i++); win->Show("?) show this help window",i++); win->Show("+) -) zoom in/out around the cursor 3/2 times ",i++); win->Show("=) reset vue ",i++); win->Show("r) refresh plot ",i++); win->Show("up, down, left, right) special keys to tanslate ",i++); win->Show("3) switch 3d/2d plot (in test) keys : ",i++); win->Show(" z) Z) (focal zoom unzoom) ",i++); win->Show(" H) h) switch increase or decrease the Z scale of the plot ",i++); win->Show("mouse motion) ",i++); win->Show(" - left button) rotate ",i++); win->Show(" - right button) zoom (ctrl+button on mac) ",i++); win->Show(" - right button +alt) tanslate (alt+ctrl+button on mac)",i++); win->Show("a) A) increase or decrease the arrow size",i++); win->Show("B) switch between show border meshes or not",i++); win->Show("i) I) update or not: the min/max bound of the functions to the window",i++); win->Show("n) N) decrease or increase the number of iso value array ",i++); win->Show("b) switch between black and white or color plotting ",i++); win->Show("g) switch between grey or color plotting ",i++); win->Show("f) switch between filling iso or iso line ",i++); win->Show("l) switch between lighting or not ",i++); win->Show("v) switch between show or not the numerical value of colors ",i++); win->Show("m) switch between show or not meshes ",i++); win->Show("w) window dump in file ffglutXXXX.ppm ",i++); win->Show("*) keep/unkeep viewpoint for next plot",i++); win->Show("k) complex data / change view type ",i++); win->Show("any other key : nothing ",++i); } void ThePlot::dyn_bfv(OneWindow *win,R & fmn,R &fmx,R & vmn2,R & vmx2) const { fmn=+1e100; fmx=-fmn; vmx2=0; vmn2=fmin; for (list::const_iterator i= plots.begin();i != plots.end(); ++i) { if(*i) (*i)->dyn_bfv(win,fmn,fmx,vmn2,vmx2) ; } if(debug>4) cout << "dyn_bfv " << fmn << " " << fmx << endl; if(fmn>fmx) fmn=fmin,fmx=fmax; if(vmn2>vmx2) vmn2=0,vmx2=vmax2; } bool ThePlot::NextCase() { bool ret=false; for (list::iterator i= plots.begin();i != plots.end(); ++i) ret = (**i).NextCase() || ret; // alway run NextCase .. return ret; } void ThePlot::Draw(OneWindow *win) { if((debug>1 )) { cout << " ThePlot::Plot " << count << " " << this << " win " << win << " " << state ; for (list::iterator i= plots.begin();i != plots.end(); ++i) cout << (**i).what; cout << endl; } if(state==0) { state=1; win->DefaultView(0); } win->SetView(); for (list::iterator i= plots.begin();i != plots.end(); ++i) (*i)->Draw(win); if(cm || value) { // screen plot ... win->SetScreenView(); if(cm) { color(1); win->DrawCommentaire(cm->c_str(),0.1,0.97); } if(value) { int k0=0; if(withiso) { win->PlotValue(Viso,k0,"IsoValue"); k0=1+Viso.N(); } if(witharrow) win->PlotValue(Varrow,k0,"Vec Value"); } // for picking.. win->SetView(); } changeViso=false; changeVarrow=false; changeColor=false; changeBorder=false; changeFill=false; } void ThePlot::SetColorTable(int nb) { tbc.resize(nb); for (int i=0;igrey; } greyo=grey; drawborder=true; drawmeshes=false; add=false; keepPV=false; echelle=1.; Pmin=R3(+dinfty,+dinfty,+dinfty); fmin = +dinfty; fmax = -dinfty; Pmax=R3(-dinfty,-dinfty,-dinfty); vmax2=0; coefr=1; long dimpp=0; long cas; #define READ_VTK_PARAM(index,type) \ case 20+index: {type dummy; fin >= dummy;} break; while(1) { fin >> cas; if((debug > 4)) cout << " read cas: " << cas << " " << PlotStream::dt_endarg << endl; if(cas==PlotStream::dt_endarg) break; if(version==2) switch (cas) { case 0: fin >> coeff; break; case 1: fin >> cm; break; case 2: fin >> psfile; break; case 3: fin >> wait; break; case 4: fin >> fill; break; case 5: fin >> value; break; case 6: fin >> clean; break; case 7: fin >> aspectratio;uaspectratio=true; break; case 8: fin >> boundingbox; break; case 9: fin >> Niso; break; case 10: fin >> Narrow; break; case 11: fin >> Viso;Niso=Viso.N();pViso=true; break; case 12: fin >> Varrow;Narrow=Varrow.N();pVarrow=true; break; case 13: fin >> bw; break; case 14: fin >> grey; break; case 15: fin >> colors; break; case 16: fin >> drawborder; break; case 17: fin >> dimpp; break;// ajout fevr 2008 v3.0.6 case 18: fin >> add; break; case 19: fin >> keepPV; break; case 20: fin >> echelle;break; default: cout << "Fatal error: Unknow case : " << cas <= coeff; break; case 1: fin >= cm; break; case 2: fin >= psfile; break; case 3: fin >= wait; break; case 4: fin >= fill; break; case 5: fin >= value; break; case 6: fin >= clean; break; case 7: fin >= aspectratio;uaspectratio=true; break; case 8: fin >= boundingbox; break; case 9: fin >= Niso; break; case 10: fin >= Narrow; break; case 11: fin >= Viso;Niso=Viso.N();pViso=true; break; case 12: fin >= Varrow;Narrow=Varrow.N();pVarrow=true; break; case 13: fin >= bw; break; case 14: fin >= grey; break; case 15: fin >= colors; break; case 16: fin >= drawborder; break; case 17: fin >= dimpp; break;// ajout fevr 2008 v3.0.6 case 18: fin >= add; break; case 19: fin >= keepPV; break; case 20: fin >= echelle;break; // unsed parameter ... READ_VTK_PARAM(1,double); // ZScale READ_VTK_PARAM(2,bool); // WhiteBackground READ_VTK_PARAM(3,bool); // OpaqueBorders READ_VTK_PARAM(4,bool); // BorderAsMesh READ_VTK_PARAM(5,bool); // ShowMeshes READ_VTK_PARAM(6,long); // ColorScheme READ_VTK_PARAM(7,long); // ArrowShape READ_VTK_PARAM(8,double); // ArrowSize READ_VTK_PARAM(9,long); // ComplexDisplay READ_VTK_PARAM(10,bool); // LabelColors READ_VTK_PARAM(11,bool); // ShowAxes READ_VTK_PARAM(12,bool); // CutPlane READ_VTK_PARAM(13,KN); // CameraPosition READ_VTK_PARAM(14,KN); // CameraFocalPoint READ_VTK_PARAM(15,KN); // CameraViewUp READ_VTK_PARAM(16,double); // CameraViewAngle READ_VTK_PARAM(17,KN); // CameraClippingRange READ_VTK_PARAM(18,KN); // CutPlaneOrigin READ_VTK_PARAM(19,KN); // CutPlaneNormal // SEND_VTK_PARAM(20,long); // WindowIndex case 40: fin >= winnum; break; default: static int nccc=0; if(nccc++<5) cout << " Skip Unknow case " << cas <<" (ffglut is too old ?)\n"; fin.SkipData(); break; } else ffassert(0); ffassert(fin.good() && ! fin.eof()); } if(dimpp) plotdim=dimpp; // if( !uaspectratio) aspectratio= true; ffassert(cas==PlotStream::dt_endarg); if((debug > 2)) { cout << " Window num " << winnum << ", "; cout << " coeff " << coeff <<", "; if(cm) cout << " cm " << *cm <<", "; if(wait) cout << " wait " ; if(fill) cout << " fill " ; if(value) cout << " value " ; if(bw) cout << " bw " ; if(grey) cout << " grey " ; if(drawborder) cout << " drawborder " ; if(colors.N()) cout << "\n colors =" << colors; if(boundingbox.N()) cout << "\n bb =" << boundingbox; cout << endl; } fin.GetMeshes(); long nbmeshes; fin >> nbmeshes; if((debug > 2)) cout << " read nb : mesh " << nbmeshes << endl; if(version==2) { Ths.resize(nbmeshes); for(int i=0;i> l; if(l>=0) { if((debug > 3)) cout << " read mesh " << i << " -> " << l << " " <=0 && l < nbmeshes); if(version==2) { ffassert(Ths[l]==0); fin >>Ths[l] ; } else { ffassert(Ths2[l]==0); fin >>Ths2[l] ; } if((debug > 3)) { if(version==2) cout << i << " nt/nv " << l << " " <nt << " " << Ths[l]->nv << endl; else cout << i << " nt/nv " << l << " " <nt << " " << Ths2[l]->nv << endl; } ffassert(fin.good()); } else // Add FH optimisation FH 11/12/2008 (not use to day) {// the mesh is already in the previous plot with number ll ffassert(l==-1); long ll; fin >> l>> ll; // read l and ll ffassert(old); if(version==2) { Ths[l]=old->Ths[ll]; Ths[l]->increment(); // } else { Ths2[l]=old->Ths2[ll]; Ths2[l]->increment(); // } } } long nbmeshes3=0; if(fin.GetMeshes3()) // read GetPlots if false ... { // il y a des solution 3d; fin >> nbmeshes3; if((debug > 2)) cout << " read nb : mesh3 " << nbmeshes3 << endl; Ths3.resize(nbmeshes3); for(int i=0;i> l; if(l>=0) { if((debug > 3)) cout << " read mesh3 " << i << " -> " << l << " " <=0 && l < nbmeshes3); ffassert(Ths3[l]==0); fin >>Ths3[l] ; if((debug > 3)) cout << i << " nt/nv " << l << " " <nt << " " << Ths3[l]->nv << endl; ffassert(fin.good()); } else // Add FH optimisation FH 11/12/2008 (not use to day) {// the mesh is already in the previous plot with number ll ffassert(l==-1); long ll; fin >> l>> ll; // read l and ll ffassert(old); Ths3[l]=old->Ths3[ll]; Ths3[l]->increment(); // } } fin.GetPlots(); } long nbplot; int iso3d=0; fin >>nbplot; if((debug > 2)) cout << " nb item plot " << nbplot << endl; for(int i=0;i> what; long imsh; if((debug > 2)) cout << " plot " << i << " what " << what << endl; if(what !=3 && !uaspectratio) aspectratio= true; if(what==-1) // gestion of error (empty plot) p = new OnePlotError(fin); else if(what==0) { fin >> imsh; if(version==2) p=new OnePlotMesh(Ths[imsh-1]); else p=new OnePlotMesh(Ths2[imsh-1]); } else if (what==1 || what==2 || what==11 || what==12 ) { fin >> imsh; if(what%10==1) withiso=true; else if (what%10==2) witharrow=true; if((debug >= 10)) cout << " plot : mesh " << imsh << endl; ffassert(imsh>0 && imsh <=nbmeshes); if(version==2) p=new OnePlotFE(Ths[imsh-1],what,fin); else p=new OnePlotFE(Ths2[imsh-1],what,fin); } else if(what==3) p=new OnePlotCurve(fin); else if(what==4) p=new OnePlotBorder(fin); else if(what==5) { fin >> imsh; p=new OnePlotMesh3(Ths3[imsh-1]); } else if (what==6 || what==7|| what==16 || what==17) { iso3d++; fin >> imsh; if(what==6||what==16 ) withiso=true; if((debug > 10)) cout << " plot : mesh3 " << imsh << endl; ffassert(imsh>0 && imsh <=nbmeshes3); p=new OnePlotFE3(Ths3[imsh-1],what,fin); } else { cout << "Bizarre unkown what : " << what<< endl; ffassert(0); } ffassert(p); plots.push_back(p); p->bb(Pmin,Pmax); p->bfv(fmin,fmax,vmax2); plotdim=max(plotdim,p->dim); ffassert(fin.good()); datadim=max(datadim,p->dim); } if(Niso==0) Niso = iso3d ? 5 : 20; // cout << "\t\t\t\t f min, max v max :" << fmin << " " << fmax << " " << vmax2 << endl; double ref_f = abs(fmax)+abs(fmin) ; if(fmax < fmin) { fmax = 1; fmin = 0; } else if( (fmax-fmin) <= 1e-8*ref_f) { if(ref_f< 1e-20) ref_f=0.5; fmax += ref_f/2; fmin -= ref_f/2; } PminT=Pmin; PmaxT=Pmax; fminT=fmin; fmaxT=fmax; if(old && 0) { Pmin= Minc(Pmin,old->PminT); Pmax= Maxc(Pmax,old->PmaxT); fmax= Max(fmax,old->fmaxT); fmin= Min(fmin,old->fminT); } z0= fminT +(fmaxT-fminT)*0.01; if((debug > 2)) cout << " data bound: " << PminT << " " << PmaxT << " fmin == " << fminT << " " << fmaxT << " z0 " << z0 << endl; fin.GetEndPlot(); Viso.resize(Niso); Varrow.resize(Narrow); SetColorTable(Max(Niso,Narrow)+4) ; SetDefIsoV() ; } void ThePlot::SetDefIsoV(int niso,int narr,double fmn,double fmx,double vmn,double vmx) { bool dyn=false; R d,x; if( fmx>fmn) { if(debug>3) cout << "Set Def dyn_bfv " << fmn << " " << fmx << endl; if(niso>2) Viso.resize(niso); Niso=Viso.N(); Narrow=narr; d = (fmx-fmn)/(Niso-2) ; x = (fmn+fmx)/2-d*0.5*(Niso-1); dyn=true; } else { d = 1 ? (fmaxT-fminT)/(Niso-2) : (fmaxT-fminT)/(Niso-1); x = 1 ? (fminT+fmaxT)/2-d*0.5*(Niso-1) :fminT+d/2; } if(!pViso || dyn) { for (int i = 0;i < Niso;i++) {Viso[i]=x;x +=d; } //if (fill ) {Viso[0]=fminT-d;Viso[Niso-1]=fmaxT+d;} } dyn=false; if(vmx>vmn) { if(narr>2) Varrow.resize(niso); Narrow=Varrow.N(); dyn=true; x = sqrt(vmn); d = (sqrt(vmx)-x)/(Narrow-1.1); } else { x=0; if(debug>10) cout << "vmax2= " << vmax2 << endl; d= sqrt(vmax2)/(Narrow-1.1); } if (!pVarrow || dyn) for (int i = 0;i < Narrow;i++) { Varrow[i]=x; x +=d; } if(debug>100) cout << " Viso ..; " << Viso < 10)) cout << "FR Rp: " << x0 << " " << y0 << " " << x1 << " " << y1 << endl; glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);//GL_FILL glBegin(GL_POLYGON); glVertex2d(x0, y0); glVertex2d(x1, y0); glVertex2d(x1, y1); glVertex2d(x0, y1); glEnd(); } void OneWindow::FillRect(R x0,R y0,R x1,R y1) { double z1= (zmin+zmax)/2; // line glPolygonMode(GL_FRONT,GL_FILL);//GL_FILL glBegin(GL_POLYGON); glVertex3d(x0, y0,z1); glVertex3d(x1, y0,z1); glVertex3d(x1, y1,z1); glVertex3d(x0, y1,z1); glEnd(); } void OneWindow::PlotValue(const KN_ & Viso,int k0,const char * cmm) { ShowGlerror("PlotValue b"); // glRasterPos2f(x,y); if((debug > 10)) cout << "PlotValue:" << cmm << " " << k0 << " " << width << " " < 10)) cout << "PlotValue " << Viso << endl; // int ix,iy; // GetSizeScreen(ix,iy); R dx=(xmax-xmin); R dy=(ymax-ymin); // 10 points // int kk = Max(30,iy/10); R h=10; R ho=h*1.1; R x0=xmin+dx*0.85; R y= ymin+dy*0.97; if((debug > 10)) cout << x0 << " " << y << " " << h << endl; y -= k0* ho; this->color(0); FillRectRasterPos(x0-h*0.5,y-h*(1.4*Viso.N()+0.3),x0+h*9,y+h*1.5); ShowGlerror("PlotValue m"); this->color(1); plot(x0+ho,y,cmm); y -= ho; for (int i=0;i 10)) cout << " x0 : " << x0<< " " << y << " " << h << " v = " << Viso[i] << endl; this->color(i+4); FillRectRasterPos(x0,y,x0+h,y+h); plot(x0+ho,y+3*h/10,Viso[i]); y -= ho; ; } ShowGlerror("PlotValue f"); } void OneWindow::DrawCommentaire(const char * cm,R x,R y) { R xmin=0,xmax=height,ymin=0,ymax=height; float dx=(xmax-xmin); float dy=(ymax-ymin); plot(xmin+dx*x,ymin+dy*y,cm); } /* void drwstr(R x,R y,char* format, ...) { va_list args; char *s,buffer[1024]; va_start(args,format); vsnprintf(buffer,1024,format,args); va_end(args); } */ void plot(double xx,double yy,const char *cmm,int font) { glRasterPos2f(xx,yy); float x[4]; glGetFloatv(GL_CURRENT_RASTER_POSITION,x); if((debug > 10)) cout<<"avant x : "< 10)) cout << *s ; glutBitmapCharacter(glut_font,*s); } if((debug > 10)) cout << " ;;; " <=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)<=0.1e-10) /* one side must be drawn */ { color(l+4); glVertex3f(Pt[i].x, Pt[i].y,xf*rapz); glVertex3f(Pt[j].x, Pt[j].y,xf*rapz); //MoveTo(Pt[i]); //LineTo(Pt[j]); } else { R xlam=(fi-xf)/(fi-fj); PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } } if (im>=2) /* draw one segment */ { color(l+4); //MoveTo(PQ[0]); //LineTo(PQ[1]); if( R2(PQ[0],PQ[1]).norme2() > eps2 ) { glVertex3f(PQ[0].x, PQ[0].y,xf*rapz); glVertex3f(PQ[1].x, PQ[1].y,xf*rapz); } } } glEnd(); } void ThePlot::DrawIsoTfill(const R2 Pt[3],const R ff[3],const R * Viso,int NbIso, R rapz) { R2 PQ[10]; R z[10]; R eps= (Viso[NbIso-1]-Viso[0])*1e-6; for(int l=1;l< NbIso;l++) // loop on the level curves { R xfb = Viso[l-1]; R xfh = Viso[l]; assert(xfb < xfh); int im=0; for(int i=0;i<3;i++) // for the 3 edges { int j=(i+1)%3; R fi=(ff[i]); R fj=(ff[j]); R xxfb = xfb; R xxfh = xfh; if (fj=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)>=0.1e-20) { R xlam=(fi-xf)/(fi-fj); z[im] = ff[i] * (1.F-xlam) + ff[j]* xlam; PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } xf = xxfh; if(((fi<=xf)&&(fj>=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)>=0.1e-20) { R xlam=(fi-xf)/(fi-fj); z[im] = ff[i] * (1.F-xlam) + ff[j]* xlam; PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } if ( xfb-eps <=fj && fj <= xfh+eps) z[im]=ff[j],PQ[im++] = Pt[j]; } if (im>2) { color(l+4); R3 P[10]; for(int i=0;i 10)) cout << i << " \t : " << PQ[i].x << " " << PQ[i].y << " " << z[i]*rapz << endl; glVertex3f(P[i].x, P[i].y,P[i].z); } glEnd(); } } } bool WindowDump(int width,int height) { int i,j; FILE *fptr; static int counter = 0; char fname[32]; unsigned char *image; /* Allocate our buffer for the image */ if ((image = new unsigned char[3*width*height]) == NULL) { fprintf(stderr,"WindowDump - Failed to allocate memory for image\n"); return(false); } /* Open the file */ sprintf(fname,"ffglut_%04d.ppm",counter); if ((fptr = fopen(fname, MODE_WRITE_BINARY)) == NULL) { fprintf(stderr,"WindowDump - Failed to open file for window dump\n"); return(false); } if((debug > 10)) cout << " WindowDump in " << fname << endl; /* Copy the image into our buffer */ glReadBuffer(GL_FRONT); glReadPixels(0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE,image); /* Write the PPM file */ fprintf(fptr,"P6\n%d %d\n255\n",width,height); for (j=height-1;j>=0;j--) { for (i=0;iresize(width,height); glutPostRedisplay(); } void Display(void) { OneWindow * win=CurrentWin(); if(win) { /* if (win->stereo) { ffassert(0); glClearColor(1.0, 1.0, 1.0, 0.0); glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); global->SetView(-1); glCallList(TheDrawList); glClearColor(1.0, 1.0, 1.0, 0.0); glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); global->SetView(+1); glCallList(TheDrawList); //win->Display(); glFlush(); glutSwapBuffers(); } else */ { Clean(); win->Display(); glFlush(); glutSwapBuffers(); if ( win->windowdump) WindowDump(win->width,win->height); win->windowdump=false; } } if(!win->theplot || !win->theplot->wait || gwait ) SendForNextPlot(); if(!NoMorePlotTilte &&NoMorePlot) { NoMorePlotTilte=true; glutSetWindowTitle("FreeFem++ / Program ended; enter ESC to exit)"); // if(gwait) {usleep((useconds_t)(1e6*gwait)); Fin(0); } } } static void Mouse( int button,int state,int x,int y ) { // state up or down OneWindow * win=CurrentWin(); keyact = glutGetModifiers(); switch(button) { case GLUT_LEFT_BUTTON: casemouse=GLUT_LEFT_BUTTON; if(win) { if(win && state == GLUT_DOWN) { win->xold=x,win->yold=y;return;} win->phi += (y-win->yold)/(2.*180.); win->theta -= (x-win->xold)/(2*180.); glutPostRedisplay(); } break; case GLUT_RIGHT_BUTTON: casemouse=GLUT_RIGHT_BUTTON; if(win) { if(win && state == GLUT_DOWN) { win->xold=x,win->yold=y;return;} } break; } } static void MotionMouse(int x,int y ) { OneWindow * win=CurrentWin(); switch(casemouse) { case GLUT_LEFT_BUTTON: if(win) { win->phi += (y-win->yold)/(2.*180.); win->theta -= (x-win->xold)/(2*180.); win->xold=x; win->yold=y; glutPostRedisplay(); } break; case GLUT_RIGHT_BUTTON: casemouse=GLUT_RIGHT_BUTTON; if(win) { if(keyact & GLUT_ACTIVE_ALT) { int dx = (x-win->xold); int dy = (y-win->yold); win->MoveXView(dx,-dy); glutPostRedisplay(); { win->xold=x,win->yold=y;} } else { // zoom en y R dd= (y-win->yold); { win->xold=x,win->yold=y;} win->zoom(pow(0.99,dd)); glutPostRedisplay(); } } break; } } static void Key( unsigned char key, int x, int y ) { OneWindow * win=CurrentWin(); if(!win->theplot)return; if(debug>1) cout << "Key winnum: " <theplot->winnum << endl; int ni=win->theplot->Viso.N(); int na=win->theplot->Varrow.N(); switch (key) { case 27: // esc char Fin(0); break; case 3: // esc char Fin(9); break; case 'w': if(win) win->windowdump=true; break; case 'l': win->withlight = !win->withlight; break; case '?' : if(win) win->help=true; case '+': win->zoom(x,y,0.7); win->coef_dist /= 1.2; break; case '-': win->zoom(x,y,1./0.7); win->coef_dist *= 1.2; break; case '3': win->plotdim=win->plotdim==2?3:2; break; /* case '2': win->plotdim=2; break; */ case '=': win->DefaultView(1); break; case 'f': win->theplot->fill = ! win->theplot->fill ; break; case '@': win->dtheta = win->dtheta ? 0 : pi/1800.; break; case '*': // add FH mars 2013 .. win->keepPV = ! win->keepPV; break; case 'k': if(win->theplot->NextCase()) { R fmn,fmx,vmn,vmx; win->theplot->dyn_bfv(win,fmn,fmx,vmn,vmx) ; win->theplot->SetDefIsoV(ni,na,fmn,fmx,vmn,vmx) ; win->changeiso=true; win->changearrow=true; } break; case 'b': win->theplot->grey = ! win->theplot->grey ; win->changeiso=true; win->changearrow=true; break; case 'g': win->theplot->grey = ! win->theplot->grey ; win->changeiso=true; win->changearrow=true; break; case 'v': win->theplot->value = ! win->theplot->value ; break; case 'm': win->theplot->drawmeshes = ! win->theplot->drawmeshes ; break; case 'B': win->theplot->drawborder = ! win->theplot->drawborder ; break; case 'H': win->rapz *= 1.2; break; case 'h': win->rapz /= 1.2; break; case 'p': if(win->icurrentPlot != win->lplots.begin()) win->set(*--win->icurrentPlot); break; case 'a': win->theplot->coeff/= 1.2; win->changearrow=true; break; case 'A': win->theplot->coeff*= 1.2; win->changearrow=true; break; case 'n': { na -= na < 10 ? 2 : 5; ni -= ni <10 ? 2 : 5; na = max(na,2); ni = max(ni,2); R fmn,fmx,vmn,vmx; win->theplot->dyn_bfv(win,fmn,fmx,vmn,vmx) ; win->theplot->SetDefIsoV(ni,na,fmn,fmx,vmn,vmx) ; win->changeiso=true; win->changearrow=true; } break ; case 'N': { na += na < 10 ? 2 : 5; ni += ni < 10 ? 2 : 5; } case 'i': { R fmn,fmx,vmn,vmx; win->theplot->dyn_bfv(win,fmn,fmx,vmn,vmx) ; win->theplot->SetDefIsoV(ni,na,fmn,fmx,vmn,vmx) ; win->changeiso=true; win->changearrow=true; } break; case 'I': { R fmn,fmx,vmn,vmx; win->theplot->SetDefIsoV(ni,na) ; win->changeiso=true; win->changearrow=true; } break; case 'z': if(win->focal < M_PI/1.2 ) { win->coef_dist*=sin(win->focal*1.2/2)/sin(win->focal/2); win->focal *=1.2; } break; case 'Z': if(win->focal > 1e-5) { win->coef_dist*=sin(win->focal/1.2/2)/sin(win->focal/2); win->focal /=1.2; } break; case '\r': case '\n': { list::iterator ic = win->icurrentPlot; if(++ic == win->lplots.end()) // last plot -> try new one SendForNextPlot(); else win->set(*++win->icurrentPlot); break; } default: if((debug > 10)) cout << " Key Character " << (int) key << " " << key << endl; } glutPostRedisplay(); } void SpecialKey(int key, int x, int y) { OneWindow * win=CurrentWin(); if(win) { // if((debug > 10)) cout << " SpecialKey " << key << " " << x << " " << y << " : "; R dx(0),dy(0); switch (key) { case GLUT_KEY_LEFT: dx = -1; break; case GLUT_KEY_RIGHT: dx = +1; break; case GLUT_KEY_DOWN: dy = -1; break; case GLUT_KEY_UP: dy = +1; break; } // calcul du deplacement de xm,ym,zm; // if((debug > 10)) cout << " " << dx << " " << dy << endl; win->MoveXView(dx,dy); glutPostRedisplay(); } } void LauchNextRead() { if(!NoMorePlot) { inThreadRead=true; tidRead = Thread::Start(&ThreadRead,(void *) datafile); } } void WaitNextRead() { if( inThreadRead ) { assert(tidRead!=0); Thread::Wait(tidRead); tidRead =0; inThreadRead=false;; } } //void * ThreadRead(void *fd) THREADFUNC(ThreadRead,fd) { int err=0; assert(nextPlot==0); // MutexNextPlot.WAIT(); if(gwait) usleep((useconds_t) (gwait*1.e6) ); err=ReadOnePlot((FILE*)fd); // MutexNextPlot.Free(); if(debug>1) cout << " We Read a plot : " << kread << " " << nextPlot << " " << err << endl; if(err<0) { NoMorePlot=true; } Thread::Exit(); return 0; } static bool TryNewPlot( void ) { // the routine to try to see if the next plot is read or not. // ----------------------------------------------------------- bool ret=false; if(debug>2) cout << " TryNewPlot plot : " << currentPlot << " next = " << nextPlot << endl;; if (nextPlot!=0) { WaitNextRead(); int iwnp= nextPlot-> winnum; if(debug>1) cout << " change current plot to: " << nextPlot << " et Lock Plot . winnum " << iwnp << endl;; //cout << " winnum: " << iwnp << endl; if(Num2Windows[iwnp]==0) { ostringstream titre; titre << "W "<< iwnp << " /FreeFem++: type return key to proceed (or ? for help on other)"; int Height = 512; int Width = 512*3/2; glutInitWindowSize(Width , Height); glutInitWindowPosition(100+iwnp*50, 100+iwnp*50); int iw0=glutCreateWindow(titre.str().c_str()); if(debug>1) cout << " ** glutCreateWindow " << iw0 << endl; glDisable(GL_DEPTH_TEST); glutReshapeFunc( Reshape ); // pour changement de fenetre glutKeyboardFunc( Key ); // pour les evenements clavier glutSpecialFunc(SpecialKey); glutMouseFunc(Mouse); // pour les evenements sourie glutMotionFunc(MotionMouse); // les mouvements de la sourie glutDisplayFunc( Display ); // l'affichage glutPushWindow(); glutShowWindow(); AllWindows[iw0]= new OneWindow(Width , Height,nextPlot); Num2Windows[iwnp]=iw0; } else AllWindows[Num2Windows[iwnp]]->add(nextPlot); glutSetWindow(Num2Windows[iwnp]); //if(currentPlot) delete currentPlot; // a change fait dans add // MutexNextPlot.WAIT(); currentPlot=nextPlot; nextPlot=0; // MutexNextPlot.Free(); LauchNextRead(); ret=true; } if(gwait && NoMorePlot ) {usleep((useconds_t)(1e6*gwait)); Fin(0); } return ret; } const char * Index(const char * p, const char c) { int k=0; while(k++<1000000) if(!*p) return 0; else if( *p==c) return p; else ++p; return 0; } const char * rIndex(const char * p, const char c) { int k=0; const char *pp=0; while(k++<1000000) if(!*p) break; else if( *p==c) pp= p; else ++p; return pp; } void SetDefWin(const char *p,int & iii0,int & jjj0,int & Width,int &Height) { // syntax // 1024x1024+100+100 // or // 1024x1024 const char *bx = p; const char *by = Index(p,'x'); const char *ox = Index(p,'+'); const char *oy = rIndex(p,'+'); if(by ==0) return; Width= atoi(bx); Height= atoi(by+1); if(ox && (ox != oy)) { iii0= atoi(ox+1); jjj0=atoi(oy+1); } if(debug>1) cout << " position = "<< Width << "x" << Height << "+"<< iii0 << "+" << jjj0 << endl; assert(Width >0 && Width < 3000); assert(Height >0 && Height < 3000); assert(iii0 >0 && iii0 < 3000); assert(jjj0 >0 && jjj0 < 3000); } int main(int argc, char** argv) { ffapi::init(); glutInit(&argc, argv); bool stereo=false; bool fullscreen = false; if(stereo) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STEREO); else glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); int i1=1; int Height = 512,Width = 512*3/2, iii0=100,jjj0=100; string titre = "W0/FreeFem++: type return key to proceed (or ? for help on other)"; int eerr=0; if(argc>1) { if( (i1 < argc) &&strcmp(argv[i1],"-?")==0) i1++,eerr=-1; if (i1 < argc) { if( strcmp(argv[i1],"-nv")==0) i1++,debug=0; else if( strcmp(argv[i1],"-v")==0) i1++,debug=2,verbosity=2; else if( strcmp(argv[i1],"-vv")==0) i1++,debug=5,verbosity=2; else if( strcmp(argv[i1],"-vvv")==0) i1++,debug=10, verbosity=1000; } if( (i1+1 < argc) && (strcmp(argv[i1],"-wait")==0)) { i1++; gwait=atof(argv[i1++]); } if( (i1+1 < argc) && (strcmp(argv[i1],"-g")==0)) { i1++; SetDefWin(argv[i1++], iii0,jjj0,Width,Height); } if( (i1+1 < argc) && (strcmp(argv[i1],"-t")==0)) { i1++; titre = argv[i1++]; } if( (i1 - argc > 1) ) { eerr = 1; cout << " error ming args " << i1 - argc << endl; } } datafile =0; if(debug>1) cout << "ffglut : " << (argc>i1) << eerr << endl; if(argc>i1 && (eerr==0))// && *argv[argc-1] != '-' ) { datafile=fopen(argv[argc-1], "r"); if(debug >1) cout << " fopen :" << argv[argc-1] << " " <1) cout << " mode read = " << MODE_READ_BINARY << endl; if(datafile==0) datafile=stdin; if ( !datafile){ cerr<< " Erreur fdopen stdin in binary " << endl; Fin(1); } int err=ReadOnePlot(datafile); if(err) { //cout << "Err ReadOnePlot " << err << endl; Fin(1);} if(kread==0) { //cout << " Error: no graphic data " << endl; Fin(1); } if(debug>1) cout << "on a lue le premier plot next plot: " << nextPlot << endl; glutInitWindowSize(Width , Height); glutInitWindowPosition(iii0,jjj0); int iw0=glutCreateWindow(titre.c_str()); //glutPushWindow(); // if (fullscreen) // glutFullScreen(); Num2Windows[0]=iw0; glDisable(GL_DEPTH_TEST); glutReshapeFunc( Reshape ); // pour changement de fenetre glutKeyboardFunc( Key ); // pour les evenements clavier glutSpecialFunc(SpecialKey); glutMouseFunc(Mouse); // pour les evenements sourie glutMotionFunc(MotionMouse); // les mouvements de la sourie glutDisplayFunc( Display ); // l'affichage glutSetWindow(iw0); AllWindows[iw0]=new OneWindow(Width , Height,currentPlot); TryNewPlot(); //cout << " Window " << iw0 << endl; glutMainLoop(); return 0; } freefem++-3.38-1/src/Graphics/ffglut.hpp000644 000767 000024 00000021424 12125101311 020121 0ustar00hechtstaff000000 000000 /* * ffglut.hpp * ff * * Created by FrÈdÈric Hecht on 04/11/08. * Copyright 2008 UPMC. All rights reserved. * */ #include typedef std::complex Complex; extern int debug; static const double dinfty=numeric_limits::max(); void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,KN colors); void hsvToRgb (float h, float s, float v, float & r, float & g, float & b); class ThePlot; class OneWindow; struct OnePlot { int dim; R3 Pmin,Pmax; double fmin,fmax; double vmax2; long what; GLsizei ngllists; GLint gllists; KN oklist; int setgllists; virtual void Draw(OneWindow *win) =0; virtual bool NextCase() {return false;} void bb(R3 & Pmn,R3 &Pmx) const { Pmn=Minc(Pmin,Pmn); Pmx=Maxc(Pmax,Pmx); } void bfv(R & fmn,R &fmx,R & vmx) const { // cout << "\t\t\t\t f min, max v max :" << fmin << " " << fmax << " " << vmax2 << endl; fmn=Min(fmin,fmn); fmx=Max(fmax,fmx); vmx=Max(vmax2,vmx); } virtual void dyn_bfv(OneWindow *win,R & fmn,R &fmx,R & vmn,R & vmx) const {// compute the function bound and arrow bound view .... } OnePlot(long w,int ddim=2,int nbgllist=0) : dim(ddim), Pmin(dinfty,dinfty,dinfty),Pmax(-dinfty,-dinfty,-dinfty), fmin(dinfty),fmax(-dinfty),vmax2(0), what(w),ngllists(nbgllist),gllists(0), oklist(nbgllist),setgllists(0){ } void initlist() { if(! setgllists) if(ngllists>0) { oklist=0; // gllists= glGenLists(ngllists); setgllists=1; assert(gllists); } } void GLDraw(OneWindow *win); virtual ~OnePlot() { if(setgllists) glDeleteLists(gllists,ngllists); }; private: // pas de copy car il y a des destructeurs dans les classes derives OnePlot(const OnePlot & ); OnePlot & operator=(const OnePlot & ); }; template struct OnePlotMesh : public OnePlot { const Mesh *Th; OnePlotMesh(const Mesh *T) : OnePlot(0,2,3),Th(T) { R2 P0,P1; Th->BoundingBox(P0,P1); Pmin=P0; Pmax=P1; } void Draw(OneWindow *win); }; struct OnePlotMesh3 : public OnePlot { const Mesh3 *Th; OnePlotMesh3(const Mesh3 *T) : OnePlot(0,3,3),Th(T) { Pmin=Th->Pmin; Pmax=Th->Pmax; //Th->BoundingBox(Pmin,Pmax); } void Draw(OneWindow *win); }; template struct OnePlotFE: public OnePlot { const Mesh *Th; // long nsub; KN v; KN vc; KN Psub; KN Ksub; int cas; // in cas of complex chaage interpertation of complex value OnePlotFE(const Mesh *T,long w,PlotStream & f); void Draw(OneWindow *win); void dyn_bfv(OneWindow *win,R & fmn,R &fmx,R & vmn,R & vmx) const ; bool vc2v(); bool NextCase() { cas++; return vc2v();} }; struct OnePlotFE3: public OnePlot { const Mesh3 *Th; long nsub; KN v; KN vc; KN Psub; KN Ksub; int cas; // in cas of complex chaage interpertation of complex value OnePlotFE3(const Mesh3 *T,long w,PlotStream & f) :OnePlot(w,3,5),Th(T),cas(2) { Pmin=Th->Pmin; Pmax=Th->Pmax; f >> Psub ; f >> Ksub ; if(what<10) f >> v; else f >> vc; vc2v(); if(debug>3) cout << "OnePlotFE3" << Th <<" " << what<< " " << nsub <<" " << v.N() << endl << " Pmin " << Pmin << " Pmax " << Pmax << endl; ffassert(f.good()); } void Draw(OneWindow *win); bool vc2v(); bool NextCase() { cas++; return vc2v();} }; struct OnePlotCurve: public OnePlot { KN xx,yy; OnePlotCurve(PlotStream & f) :OnePlot(3,2,1) { f >> xx>>yy; // cout << xx << " " << yy < > > data; OnePlotBorder(PlotStream & f); void Draw(OneWindow *win); }; // add 11/12/2008 for gestion of error FH (what -1) struct OnePlotError: public OnePlot { long item; OnePlotError(PlotStream & f) : OnePlot(-1) { f >> item; } void Draw(OneWindow *win) ; }; class ThePlot { public: int count; int state; // 0 new GLint gllist; KN colors; bool hsv; // hsv type KN boundingbox; double coeff; bool wait; bool value; bool fill; bool aspectratio; bool clean; bool uaspectratio; bool pViso,pVarrow; bool withiso; bool witharrow; long Niso,Narrow; R3 Pmin,Pmax,PminT,PmaxT;// with R -> true bound R fmin,fmax,fminT,fmaxT; // with bound with previous plot. R vmax2; KN Viso,Varrow; bool bw; string * psfile; string * cm; bool grey; bool greyo; bool drawborder; bool drawmeshes; bool add,keepPV; double echelle; vector Ths; vector Ths2; vector Ths3; list plots; bool changeViso,changeVarrow,changeColor,changeBorder,changeFill; R3 Pvue,Peyes; R alpha; R coefr; R z0; // z pour les objets 2d. // for 3d plot jan 2009 int plotdim; R theta, phi, dcoef, focal; int datadim; // 2D long winnum; bool NextCase(); bool Change() const { return changeViso||changeVarrow||changeColor||changeBorder||changeFill;} ~ThePlot() { for (list::iterator i= plots.begin();i != plots.end(); ++i) if(*i) delete *i; for (vector::iterator i= Ths.begin();i != Ths.end(); ++i) if(*i) delete *i; for (vector::iterator i= Ths2.begin();i != Ths2.end(); ++i) if(*i) delete *i; for (vector::iterator i= Ths3.begin();i != Ths3.end(); ++i) if(*i) delete *i; } ThePlot(PlotStream & fin,ThePlot *old , int kcount); void Draw(OneWindow *win) ; void DrawHelp(OneWindow *win) ; struct RGB { float r,g,b; void set(int k,int nb,ThePlot *theplot ) { DefColor(r,g,b, k,nb,theplot->hsv,theplot->grey,theplot->colors); } } ; vector tbc; void color(int i,R alpha=1.) { ffassert(tbc.size()); RGB c(tbc[min(max(0,i),(const int) tbc.size())]); if(alpha<1) { R a1=1.-alpha; c.r=c.r*alpha+a1; c.g=c.g*alpha+a1; c.b=c.b*alpha+a1; // cout << " aaaa" << alpha << endl; } glColor4f(c.r,c.g,c.b,alpha); } void SetColorTable(int nb); void SetDefIsoV(int niso=0,int narr=0,R fmn=1.,R fmx=-1.,R vmn=1.,R vmx=-1.); void DrawIsoT(const R2 Pt[3],const R ff[3],const R * Viso,int NbIso, R rapz=1); void DrawIsoTfill(const R2 Pt[3],const R ff[3],const R * Viso,int NbIso, R rapz=1); void dyn_bfv(OneWindow *win,R & fmn,R &fmx,R & vmn,R & vmx) const ; }; class OneWindow { public: ThePlot *theplot; list lplots;// to store some plot list::iterator icurrentPlot;//=lplots.begin(); int lplotssize; int height,width; R2 Bmin,Bmax; R2 oBmin,oBmax;// orign box R zmin,zmax; R hpixel;// taille pixel en coordonne x,y,z int xold,yold; bool windowdump,help; GLdouble modelMatrix[16]; GLdouble projMatrix[16]; GLint viewport[4]; int plotdim; R theta, phi, coef_dist, focal, dtheta; R rapz,rapz0; R3 Bmin3,Bmax3,Pvue3; R3 cam; bool withlight; bool changearrow,changeiso;// to rebuild de graphic list if neccessary bool keepPV,init; //double aspx, aspy, echx,echy,ech,rxmin,rxmax,rymin,rymax; OneWindow(int h,int w,ThePlot *p); void DefaultView(int state) ; bool NextCase() ; void SetView() ; void MoveXView(R dx,R dy) ; void set(ThePlot *p); void add(ThePlot *p); void cadre(R2 A,R2 B); void cadreortho(R2 A,R2 B); void getcadre(double &xmin,double &xmax,double &ymin,double &ymax); void Display(); void resize(int w,int h); void zoom(int w,int h,R coef); void zoom(R coef); float GetHeigthFont(){return 10;} void color(int i,R alpha=1) {theplot->color(i,alpha);} void FillRect(R x0,R y0,R x1,R y1); void PlotValue(const KN_ & Viso,int k0,const char * cmm); void DrawCommentaire(const char * cm,R x,R y); void SetScreenView() const ; void Show(const char *str,int i); void setLighting(); void unsetLighting(); void Seg(R2 A, R2 B) const { glVertex3d(A.x,A.y,theplot->z0); glVertex3d(B.x,B.y,theplot->z0); } int InRecScreen(R2 P1,R2 P2) const { R2 Pmn=Minc(P1,P2),Pmx=Maxc(P1,P2); return (Pmx.x >= Bmin.x) && (Pmn.x <= Bmax.x) && (Pmx.y >= Bmin.y) && (Pmn.y <= Bmax.y); } int InRecScreen(R3 P1,R3 P2) const { R3 Pmn=Minc(P1,P2),Pmx=Maxc(P1,P2); return (Pmx.x >= viewport[0]) && (Pmn.x <= viewport[2]) && (Pmx.y >= viewport[1]) && (Pmn.y <= viewport[3]); } }; void plot(double x,double y,const char *cmm,int font=-1); void plot(double x,double y,double i,int fint = -1); extern map AllWindows; inline OneWindow* CurrentWin() { OneWindow* w= AllWindows[glutGetWindow()]; ffassert(w); return w; } freefem++-3.38-1/src/Graphics/ffthreads.cpp000644 000767 000024 00000004561 11406226635 020620 0ustar00hechtstaff000000 000000 // SUMMARY : Threads for Linux and Microsoft Win32 // USAGE : // ORG : // AUTHOR : Antoine Le Hyaric / F. Hecht // E-MAIL : lehyaric@ann.jussieu.fr // This file is part of Freefem++ // // Freefem++ is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or // (at your option) any later version. // // Freefem++ is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with Freefem++; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // Frederic Hecht . #include #include #include #include #include #include using namespace std; #define ERROR_FF(msg) (cerr << msg< #else #include #endif Thread::Id Thread::Start(THREADFUNC(f,),Thread::Parm p){ Id tid; #ifdef __MINGW32__ unsigned ThreadId; tid = (HANDLE) _beginthreadex(NULL,0,f,p,0,&ThreadId); if(tid == NULL) ERROR_FF("Thread::Start: Thread could not be created"); #else int R = pthread_create(&tid,NULL,f,p); if(R != 0) ERROR_FF("Thread::Start: Thread could not be created"); #endif return tid; } void Thread::Wait(Thread::Id tid){ #ifdef __MINGW32__ DWORD R = WaitForSingleObject(tid,INFINITE); if(R == WAIT_FAILED) ERROR_FF("Thread::Wait" " -- Wait failed"); CloseHandle(tid); #else int R=pthread_join(tid,NULL); if(R!=0) ERROR_FF("Thread::Wait: Wait failed"); #endif } void Thread::Exit(){ #ifdef __MINGW32__ _endthreadex(0); #else pthread_exit(NULL); // No test: returns void. #endif } void Thread::Kill(Thread::Id tid){ #ifdef __MINGW32__ if(TerminateThread(tid,0) == 0) ERROR_FF("Thread::Kill: Thread not killed"); #else if(pthread_kill(tid,SIGINT)!=0) ERROR_FF("Thread::Kill: Thread not killed"); #endif } Thread::Id Thread::Current(){ #ifdef __MINGW32__ return GetCurrentThread(); #else return pthread_self(); #endif } freefem++-3.38-1/src/Graphics/ffthreads.hpp000644 000767 000024 00000003713 11406226635 020623 0ustar00hechtstaff000000 000000 // SUMMARY : Threads for Linux and Microsoft Win32 // USAGE : // ORG : // AUTHOR : Antoine Le Hyaric, Modif F. hecht // E-MAIL : lehyaric@ann.jussieu.fr // This file is part of Freefem++ // // Freefem++ is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or // (at your option) any later version. // // Freefem++ is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with Freefem++; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // from: // Antoine Le Hyaric - LJLL Paris 6 - lehyaric@ann.jussieu.fr - 21/10/04 // simplify by F. Hecht // Antoine Le Hyaric - LJLL Paris 6 - hect@ann.jussieu.fr - 22/11/08 #ifndef FFTHREADS_HPP #define FFTHREADS_HPP #include "mode_open.hpp" #include using namespace std; #ifdef __MINGW32__ #include #else #include #endif // Just check that we are in a known environment (otherwise it may be // difficult to recognise that the simple cause is an ifdef problem). class Thread{ public: #ifdef __MINGW32__ #define THREADFUNC(f,parm) unsigned int (__stdcall f)(Thread::Parm parm) typedef LPVOID Parm; typedef HANDLE Id; #else #define THREADFUNC(f,parm) void* f(Thread::Parm parm) typedef void* Parm; typedef pthread_t Id; #endif // Mingw is a little puzzled if there are no brackets around // __stdcall static Id Start(THREADFUNC(f,),Parm p); static void Wait(Id tid); static void Exit(); // From inside the thread static void Kill(Id tid); static Id Current(); }; #endif // THREADS_HPP freefem++-3.38-1/src/Graphics/getprog-unix.hpp000644 000767 000024 00000016010 12520432651 021272 0ustar00hechtstaff000000 000000 #include "mode_open.hpp" #if _WIN32 #include "ff-win32.cpp" #else #include #endif // FFCS: required for chdir() when g++ 4.7 is used #include // FFCS: redirecting visualization output #include "../fflib/ffapi.hpp" #include "../fflib/strversionnumber.hpp" #include extern long mpirank; extern long verbosity; extern FILE *ThePlotStream; // Add for new plot. FH oct 2008 // for the environ variables ... extern const char * prognamearg; extern const char * edpfilenamearg; extern bool waitatend; extern bool consoleatend; extern bool echo_edp; extern bool NoGraphicWindow; char * Shell_Space(const char * s); char * Shell_Space(const char * s) { const char *c=s; int nbspace; int i; for( i=0;i<100000;++i) if (! s[i]) break; else if(isspace(s[i])) ++nbspace; if (!(i<100000)) { cerr << " Bug Shell_Space routine " < no graphics noffglut=false; bool ch2edpdir = false; if(argc) prognamearg=argv[0]; if(prognamearg ) // FH add to remove ffglut in case of -nw or -nw.exe program. FH juin 2014.. {int l = strlen(prognamearg); if( (( l>4 ) && (strcmp("-nw",prognamearg+l-3) ==0)) || (( l>8) &&(strcmp("-nw.exe",prognamearg+l-7) ==0))) { consoleatend=false; noffglut=true; NoGraphicWindow=true; waitatend=false; } } echo_edp=true; if(argc) for (int i=1; i10) printf(" verbosity : %ld\n",verbosity); } else if (strcmp(argv[i],"-nw")==0 ) { consoleatend=false; noffglut=true; NoGraphicWindow=true; waitatend=false; // add modif FH. juin 2014 .. } else if (strcmp(argv[i],"-ne")==0 ) // no edp echo_edp=false; else if (strcmp(argv[i],"-cd")==0 ) // ch2edpdir=true; else if (strcmp(argv[i],"-ns")==0 ) // no script echo_edp=false; else if (strcmp(argv[i],"-nowait")==0 ) waitatend=false; else if (strcmp(argv[i],"-nc")==0 ) consoleatend=false; else if (strcmp(argv[i],"-log")==0 ) consoleatend=true; else if (strcmp(argv[i],"-wait")==0 ) waitatend=true; else if(strcmp(argv[i],"-fglut")==0 && i+1 < argc) { fileglut=argv[++i]; noffglut=true; } else if(strcmp(argv[i],"-glut")==0 && i+1 < argc) { progffglut=argv[++i]; noffglut=true; NoGraphicWindow=false; } else if(strcmp(argv[i],"-gff")==0 && i+1 < argc) { progffglut=Shell_Space(argv[++i]); noffglut=true; NoGraphicWindow=false; } else if(strcmp(argv[i],"-?")==0 ) ret=2; else if( strcmp(argv[i],"-f")==0 && i+1 < argc) { strcpy(fn,argv[++i]); ret=1; edpfilenamearg=argv[i]; } else if(ret==0) { strcpy(fn,argv[i]); edpfilenamearg=argv[i]; ret=1; } if( ch2edpdir && edpfilenamearg) { int i=0; int l= strlen(edpfilenamearg); #ifdef _WIN32 const char sepdir='\\'; #else const char sepdir='/'; #endif for(i=l-1;i>=0;i--) if(edpfilenamearg[i]==sepdir) break; if(i>0) { char *dir= new char [l+1]; strcpy(dir,edpfilenamearg); dir[i]=0; int err=0; if(verbosity>1) cout << " chdir '" << dir <<"'"<< endl; // FFCS: mingw64 API change err=chdir(dir); //cout << err << endl; if(err) { cerr << " error : chdir " << dir << endl; exit(1); } delete [] dir; } } if( ! progffglut && !noffglut) progffglut=ffglut; if(progffglut && mpirank==0) { // FFCS: divert stream to FFCS ThePlotStream = ffapi::ff_popen(progffglut,"w"); // FFCS: just forget the following message because it could be understood as an error during FFCS execution // although ffglut is not used there. //if(verbosity) // printf(" EXEC of the plot : %s\n",progffglut); if(!ThePlotStream) { cerr << " Error popen "<< progffglut << endl;exit(1);} } else if (fileglut) {// correction progffglut -> fileglut v3.0-2 FH. ThePlotStream = fopen(fileglut, MODE_WRITE_BINARY ); if(verbosity) printf(" save of the plot in file : %s\n",fileglut); if(!ThePlotStream) { cerr << " Error save file glut " << fileglut << " mode " << MODE_WRITE_BINARY<< endl; exit(1); } } #ifdef _WIN32 if(ret==0) { if ( ShowOpenDialogBox1(fn) ) ret=1; } #endif if(ret !=1) { const char * ff = argc ? argv[0] : "FreeFem++" ; cout << " Error parameter: "<< ff << " , version : " << StrVersionNumber() << endl; cout << " Syntaxe = " << ff << " [ -v verbosity ] [ -fglut filepath ] [ -glut command ] [ -nw] [ -f] filename [SCRIPT-arguments]\n" << " -v verbosity : 0 -- 1000000 level of freefem output \n" << " -fglut filepath : the file name of save all plots (replot with ffglut command ) \n" << " -glut command : change command compatible with ffglut \n" << " -gff command : change command compatible with ffglut (with space quoting)\n" << " -nowait : nowait at the end on window \n" << " -wait : wait at the end on window \n" << " -nw : no ffglut, ffmedit (=> no graphics windows) \n" << " -ne : no edp script output\n" << " -cd : Change dir to script dir\n" << endl ; ; if(noffglut) cout << " without default ffglut : " << ffglut << endl; else cout << " with default ffglut : " << ffglut << endl; cout << endl; exit(1); return ret; } if(verbosity>10) cout << " file : " << fn << endl ; return 1; } freefem++-3.38-1/src/Graphics/gggg.cpp000644 000767 000024 00000006733 12471673135 017574 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include namespace ffapi { // void init) (); // need #include // need #include // need using namespace std; std::istream * (*cin)(); std::ostream *(*cout)(); std::ostream *(*cerr)(); // <> Cannot name these functions identically to the original file pointers under MingW32 (compile // error). Impacts [[file:InitFunct.hpp::LOADINITIO]]. Changed from stdxxx_ptr() to ffstdxxx() according to the way FF // itself was changed. FILE *(*ffstdout)(); FILE *(*ffstderr)(); FILE *(*ffstdin)(); /// Initiate graphical pipe output. I need a separate function for this to warn ffcs to check the corresponding ffglut /// magic number size_t (*fwriteinit)(const void *ptr, size_t size, size_t nmemb,FILE *stream); /// Indicates the begining of a new plot to avoid sending socket control data with each plot item. void (*newplot)(); /// Redefinition of standard system calls FILE *(*ff_popen)(const char *command, const char *type); int (*ff_pclose)(FILE *stream); size_t (*ff_fwrite)(const void *ptr, size_t size, size_t nmemb,FILE *stream); int (*ff_fflush)(FILE *stream); int (*ff_ferror)(FILE *stream); int (*ff_feof)(FILE *stream); // Windows file mode // ----------------- /// Changing file mode needs to be disabled when the file is a TCP socket to FFCS. Since the treatment is different in /// FF and in FFLANG executables, they have to be stored in a DLL that changes between these two programs. void (*wintextmode)(FILE *f); void (*winbinmode)(FILE *f); // Transfer basic MPI control // -------------------------- void (*mpi_init)(int &argc, char **& argv); void (*mpi_finalize)(); // Permanent server control // ------------------------ /// if true, FF is considered to be accessible from remote anonymous connections and some commands (like shell /// commands) are not allowed. bool (*protectedservermode)(); } #include "config-wrapper.h" #include #include #include #include #include "environment.hpp" #define FF_GRAPH_PTR_DCL #include "rgraph.hpp" void ShowDebugStack(){} long verbosity = 1; long searchMethod=0; // = 9999; //pichon //PROBABLY BUG : can't compile without it FILE *ThePlotStream=0; // Add for new plot. FH oct 2008 int TheCurrentLine=-1; // unset: by default long mpisize=0,mpirank=0; bool showCPU= false; // add F. Hecht EnvironmentData ffenvironment; freefem++-3.38-1/src/Graphics/glrgraph.hpp000644 000767 000024 00000120464 12033706637 020470 0ustar00hechtstaff000000 000000 /**************DO NOR REMOVE THIS BANNER***************/ /* FreeFEM : Language for a Finite Element Method */ /* ------- Release 2.0: June 2007. */ /* Authors: D. Bernardi, Y. Darmaillac F. Hecht, */ /* O. Pironneau */ // ********** DO NOT REMOVE THIS BANNER ********** /* // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* (fax) Olivier.Pironneau@ann.jussieu.fr */ /******************************************************/ //#define FREEFEM // AGL apple // XGL X11 // WGL window (a faire) const char * edpfilenamearg=0; bool waitatend=true; bool consoleatend=true; #ifdef AGL #define TARGET_API_MAC_CARBON 1 #define CALL_IN_SPOCKETS_BUT_NOT_IN_CARBON 1 #include #include #include #include #endif #ifdef XGL #include #include #include #endif #ifndef AGL #include #include #endif #include #include "error.hpp" #include #include #include using namespace std; #include #include #include #include #include "rgraph.hpp" #include #include #include int currx=0,curry=0; static FILE *psfile = 0; static FILE *psfile_save = 0; #ifdef AGL static AGLPixelFormat fmt; static AGLContext ctx; int pStrCopy (StringPtr p1, char * p2); StringPtr c2p(const char * p,char *buf); #endif #ifdef XGL static Display *dpy; static Window win; static XSizeHints size_hints; //static GC gc; static XFontStruct *font_info; GLXContext cx; int stensize; static Cursor cursor_watch,cursor_arrow; static int shift, control,shiftlock,alt; static GLuint basefont; #endif extern long verbosity; // level off printing #ifdef FREEFEM void myenviron () { cout << "FreeFEM error: operator new failed; not enough memory" << endl; if (myenviron) longjmp(myenvironj,1); exit(2); } // pour imprimer la version FH #define STRING(i) #i #include jmp_buf myenvironj; static int myenviron = 0; void out_of_memory (); void NEW_HANDLER (void); void compile(char *fname); float scali(int i); float scalj(int j); void execute(char* what); char Getijc(int & x,int & y); int DoMouseDown (int windowPart, WindowPtr whichWindow, EventRecord *myEvent); void NEW_HANDLER (void){ set_new_handler (&myenvironj);} #endif static int nbcolor; static int ncolortable; static int LastColor; // LastColor=1 => Noir et Blanc #ifdef AGL #define ours(w) (w==grafWindow0) static WindowPtr grafWindow0; static GrafPtr grafPort0; static Rect boundsRect; static CursHandle CrossCurseur ; static CursHandle WatchCurseur ; static Pattern white,black; #else struct RGBColor { unsigned short red; /*magnitude of red component*/ unsigned short green; /*magnitude of green component*/ unsigned short blue; /*magnitude of blue component*/ }; #endif template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} static bool grey=false; static int cube6[7][3] ={ {65534,0,0},{65534,65534,0},{0,65534,0},{0,65534,65534},{0,0,65534} , {65534,0,65534},{65534,0,0} }; static int grey6[2][3] ={ {65534,65534,65534},{0,0,0} }; char errbuf[255]; static int INITGRAPH=0; static float aspx, aspy, echx,echy,ech,rxmin,rxmax,rymin,rymax; static int carre, lacouleur; static GLuint fontList; static int width,height; static RGBColor * colortable; int getcolor(); void putpixel(int ix,int iy, int couleur); int scalx(float x); int scaly(float y); void thisexit(); void DrawCStringGL (const char * cstrOut, GLuint fontList) { GLint i = 0; glRasterPos3d(currx,height-curry,0); while (cstrOut [i]) glCallList (fontList + cstrOut[i++]); } #ifdef AGL void InitMac(); // -------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------- // APPLE EVENT SUPPORT ROUTINES // -------------------------------------------------------------------------------------------------------------- StringPtr c2p(const char * p, unsigned char * buf) { int l=strlen(p); assert(l<255); buf[0]=l; memcpy(buf+1,p,l); return buf; } int pStrCopy (StringPtr p1, char * p2) /* copies a pascal string `p1 into a C string */ { int len,i; len = (*p1++) %256; for(i=1;i<=len;i++) *p2++=*p1++; *p2 = 0; return 0; } void InitMac() { BitMap screenBitMap; Rect screenBits; Cursor theArrow; GetQDGlobalsScreenBits(&screenBitMap); screenBits = screenBitMap.bounds; SetCursor(GetQDGlobalsArrow(&theArrow)); } class InitilisationMac { static int init; public: InitilisationMac(){ InitMac();} }; static InitilisationMac Initmac; // to call InitMac int getprog(char* fn,int argc, char** argv) { if (argc > 1) { int ret=0; for (int i=1; i0) cerr << " Syntaxe : " << argv[0] << " -f filename [-v verbosity] " << endl; else cerr << " Syntaxe : FreeFem++-agl -f filename [-v verbosity] " << endl; return ret; } return 1; } else { OSErr anErr; FSRef fsRef; NavDialogOptions dialogOptions; NavReplyRecord reply; anErr=NavGetDefaultDialogOptions(& dialogOptions); if( anErr != noErr) return -1; anErr =NavChooseFile(0,&reply,&dialogOptions,0,0,0,0,0) ; if (anErr == noErr && reply.validRecord) { // Deal with multiple file selection long count; anErr = AECountItems(&(reply.selection), &count); // Set up index for file list if (anErr == noErr) { long index; for (index = 1; index <= count; index++) { AEKeyword theKeyword; DescType actualType; Size actualSize; FSSpec documentFSSpec; // Get a pointer to selected file anErr = AEGetNthPtr(&(reply.selection), index, typeFSRef, &theKeyword, &actualType,&fsRef, sizeof(fsRef), &actualSize); if (anErr == noErr) { anErr=FSRefMakePath(&fsRef,(UInt8*)fn,256); if ( anErr == noErr ) { cout << "Path : " << fn << endl; char * ff=fn,*fff=0; while ( *ff) { if (*ff=='/') fff=ff; ff++; } if (fff) { *fff=0; cout << "chdir to "<< fn << endl; chdir(fn); *fff='/';} } else cout << "Err: "<< anErr << endl; /* anErr = AEGetNthPtr(&(reply.selection), index, typeFSS, &theKeyword, &actualType,&documentFSSpec, sizeof(documentFSSpec), &actualSize); anErr = HSetVol(0,documentFSSpec.vRefNum,documentFSSpec.parID); pStrCopy(documentFSSpec.name, fn);*/ } } } // Dispose of NavReplyRecord, resources, descriptors anErr = NavDisposeReply(&reply); } else return 0; // erreur cancel return (2); } } //----------------------------------------------------------------------------------------------------------------------- GLuint BuildFontGL (AGLContext ctx, GLint fontID, Style face, GLint size) { GLuint listBase = glGenLists (256); if (aglUseFont (ctx, fontID , face, size, 0, 256, (long) listBase)) { glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); return listBase; } else { glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glDeleteLists (listBase, 256); return 0; } } #else #include "getprog-unix.hpp" #endif #ifdef XGL void MyXSelectInput(Display * dpy,Window w,int mask) { XSetWindowAttributes attributes; attributes.event_mask = mask; XChangeWindowAttributes(dpy, w, CWEventMask, &attributes); } #endif //----------------------------------------------------------------------------------------------------------------------- void DeleteFontGL (GLuint fontList) { if (fontList) glDeleteLists (fontList, 256); } void coutmode(short i) { cout << flush; cerr << flush; ;} #ifdef FREEFEM void myexit(int err) { if (INITGRAPH) { rattente(0); closegraphique(); } if (err !=0) cout << "Error: freefem+ has ended with error code " <screen), vi->visual, AllocNone); /* create a window */ swa.colormap = cmap; swa.border_pixel = 0; swa.event_mask = StructureNotifyMask; height = 512; width = 512; aspx = width; aspy =height; win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa); XMapWindow(dpy, win); glXMakeCurrent(dpy, win, cx); cursor_arrow = XCreateFontCursor(dpy,XC_arrow); cursor_watch = XCreateFontCursor(dpy,XC_watch); XDefineCursor(dpy,win,cursor_watch); MyXSelectInput (dpy, win, (int) (ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask /* | ResizeRedirectMask */ | StructureNotifyMask) ); font_info = XLoadQueryFont(dpy, "6x9"); //XSetFont(dpy, gc, font_info->fid); {unsigned int first, last; int id = font_info->fid; first = font_info->min_char_or_byte2; last = font_info->max_char_or_byte2; fontList = glGenLists(last+1); if (fontList == 0) { printf ("out of display lists\n"); exit (1); } glXUseXFont(id, first, last-first+1, fontList+first); } } #endif #ifdef WGL a faire #endif carre = aspx == aspy; lacouleur = getcolor(); nbcolor= 256; ncolortable =0; LastColor=2;// En couleur pas defaul colortable=0; SetColorTable(2+6); INITGRAPH = 1; gluOrtho2D(0.0, height,0,width); glLineWidth(1); // cout <<" End Initgraphique\n"; } static RGBColor DefColorGL( int k,int nb, bool hsv,bool grey,int nbcolors,float *colors) { RGBColor C; float r,g,b; extern void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,int nbcolors,float *colors); DefColor(r,g,b, k,nb,hsv,grey,nbcolors,colors); C.red= (short unsigned int) (65535*r); C.green=(short unsigned int)(65535*g); C.blue= (short unsigned int) (65535*b); return C; } void SetColorTable1(int nb,bool hsv,int nbcolors,float *colors) { static bool greyo = !grey; static float * colorso=0; if(!INITGRAPH) return; if (ncolortable == nb && greyo == grey && colorso == colors ) return;// optim greyo = grey; colorso=colors; if (nbcolor && nb>2) { if(colortable) delete [] colortable; colortable = new RGBColor[nb]; ncolortable = nb; if(LastColor>1) LastColor=nb-1; for (int i0=0;i0 LastColor ? 1 : c; // c=Min(c,LastColor); pour noir et blanc lacouleur =c; float r=1,g=1,b=1; if (c>=0 && c < ncolortable) { r = (float) colortable[c].red /65535.F; g = (float) colortable[c].green /65535.F; b = (float) colortable[c].blue /65535.F; } else if (c!=0) r=g=b=0; glColor4f (r,g,b,1.); if (psfile) fprintf(psfile,"%.3f %.3f %.3f C\n",r,g,b); } int InRecScreen(float x1, float y1,float x2, float y2) { float xi = Min(x1,x2),xa=Max(x1,x2); float yi = Min(y1,y2),ya=Max(y1,y2); return (xa >= rxmin) && (xi <= rxmax) && (ya >= rymin) && (yi <= rymax); } int InPtScreen( float x, float y) { return (x >= rxmin) && (x <= rxmax) && (y >= rymin) && (y <= rymax); } void penthickness(int pepais) { // PenSize(pepais,pepais); glLineWidth(pepais); if (psfile) fprintf(psfile,"%d setlinewidth\n",pepais); } void cadre(float xmin,float xmax,float ymin,float ymax) { rxmin = xmin; rxmax = xmax; rymin = ymin; rymax = ymax; echx = aspx / (xmax - xmin); echy = aspy / (ymax - ymin); } void getcadre(float &xmin,float &xmax,float &ymin,float &ymax) { xmin = rxmin; xmax = rxmax; ymin = rymin; ymax = rymax; } void cadreortho(float centrex, float centrey, float rayon) { float xasp,yasp, getmaxx, getmaxy; getmaxx = xasp =aspx; getmaxy = yasp = aspy; if (getmaxx * (float)xasp > getmaxy * (float)yasp) { rymin = centrey - rayon; rymax = centrey + rayon; echy= getmaxy / (2 * rayon); echx= (echy * xasp) / yasp; rxmin= centrex - getmaxx / (2 * echx); rxmax= centrex + getmaxx / (2 * echx); } else { rxmin = centrex - rayon; rxmax = centrex + rayon; echx = getmaxx / (2 * rayon); echy = (echx * yasp) / xasp; rymin = centrey - getmaxy / (2 * echy); rymax = centrey + getmaxy / (2 * echy); } // cout << "cadreortho\n"; } int scalx(float x) { return int((x - rxmin) * echx); } int scaly(float y) { return int((rymax - y) * echy); } float scali(int i) { return i/echx + rxmin; } float scalj(int j) { return -j/echy + rymax; } void pointe(float x, float y) { int newx = scalx(x), newy = scaly(y); putpixel(newx, newy, lacouleur); if (psfile) fprintf(psfile,"%d %d P\n", newx, height-newy); } void rmoveto(float x, float y) { int newx = scalx(x), newy = scaly(y); // MoveTo(newx,newy); if (psfile) fprintf(psfile,"%d %d M\n", newx, height-newy); currx = newx; curry = newy; } void rlineto(float x, float y) { int newx = scalx(x), newy = scaly(y); glBegin(GL_LINES); glVertex2i(currx, height-curry); glVertex2i(newx, height-newy); glEnd(); if (psfile) fprintf(psfile,"%d %d L\n", newx,height-newy); currx = newx; curry = newy; } void fillpoly(int n, float *poly) { glBegin(GL_POLYGON); for (int i=0;iwhere)) { closegraphique(); cout << "The end (closing the graphic window) " <portRect)); ZoomWindow(whichWindow, inZoomIn, true); InitCursor(); } break; case inZoomOut: /* if (ours(whichWindow)) { SetCursor(&waitCursor); SetPort(whichWindow); EraseRect(&(whichWindow->portRect)); ZoomWindow(whichWindow, inZoomOut, true); if(whichWindow == editWindow) MyZoomWindow(whichWindow); InitCursor(); }*/ break; case inMenuBar: // return(DoCommand(MenuSelect(myEvent->where))); break; case inSysWindow: //SystemClick(myEvent, whichWindow); break; case inDrag: if (ours(whichWindow)) { SetPortWindowPort(whichWindow); GetPort(&grafPort0); // DragWindow(whichWindow, myEvent->where, &dragRect); } break; case inGrow: //if (ours(whichWindow)) // {MyGrowWindow(whichWindow, myEvent->where);} break; case inContent: wasactive = (whichWindow == FrontWindow()); if(!wasactive) { SelectWindow(whichWindow); // if (ours(whichWindow) && MacReDraw ) (* MacReDraw)(); } else if (ours(whichWindow)) { SetPortWindowPort(whichWindow); GetPort(&grafPort0); while (Button()) ; return 0; } break; } return 1; } char HandleEvent(EventRecord & myEvent) { // cout << "HandleEvent\n"; WindowPtr whichWindow=NULL; short windowPart; char char1=0; switch (myEvent.what) { case mouseDown: windowPart = FindWindow(myEvent.where, &whichWindow); if( DoMouseDown(windowPart, whichWindow, &myEvent) ==0) char1= 251; break; // // // case keyDown: case keyUp: case autoKey: { windowPart = FindWindow(myEvent.where, &whichWindow); if((whichWindow==grafWindow0) /* && (inContent == windowPart)*/) { if (grafWindow0 != FrontWindow()) { SelectWindow(whichWindow); SetPortWindowPort(whichWindow); GetPort(&grafPort0); } char1 = (myEvent.message & 127L); } break;} case updateEvt: /* if (ours((WindowPtr) myEvent.message)) { BeginUpdate((WindowPtr) myEvent.message); EndUpdate((WindowPtr) myEvent.message); } */ break; // cout << "End HandleEvent" << int(char1) << endl; } return char1; } #endif char Getijc(int & x,int & y) { char char1=0; #ifdef AGL viderbuff(); showgraphic(); EventRecord myEvent; int flag=1; // HLock( (Handle) WatchCurseur); // SetCursor(*CrossCurseur); // HUnlock( (Handle) WatchCurseur); SelectWindow(grafWindow0); while (char1==0) { if (GetNextEvent(everyEvent, &myEvent) /* ,OxFFFFFFFF,h)*/) char1=HandleEvent(myEvent); } GlobalToLocal( & myEvent.where); x = myEvent.where.h; y = myEvent.where.v; #endif #ifdef XGL XEvent event; int flag,nb; XComposeStatus status; char buffer[20]; KeySym keysym; /* incidence */ XDefineCursor(dpy,win,cursor_arrow); flag=0; while (!flag) { XNextEvent(dpy, &event); if(event.type == ButtonRelease) { x = event.xbutton.x; y = event.xbutton.y; if (event.xbutton.button == Button1) char1=shift?248:251; else if (event.xbutton.button == Button2) char1=shift?249:252; else char1=shift?250:253; // printf(" mouse release %d\n",(int) char1); flag=1; } else if(event.type == KeyPress) { x = event.xkey.x; y = event.xkey.y; char1= event.xkey.keycode ; keysym=0; nb=XLookupString(&event.xkey,buffer,20,&keysym,&status); /* printf("nb= %d keysym= %d buffer=",nb,keysym); /* for(i=0;i<20;i++) /* printf(" %d ",(int)buffer[i]); /* printf("\n"); */ /* voir /usr/include/X11/keysymdef.h + ap_keysym */ if (nb != 0) {char1 = buffer[0]; flag= 1; } else { /* if (IsFunctionKey(keysym)) printf("function down\n"); else if(IsModifierKey(keysym)) printf("modifier down\n"); else if(IsKeypadKey(keysym)) printf(" keypad down\n"); else if(IsMiscFunctionKey(keysym)) printf(" misc function down\n"); else if(IsPFKey(keysym)) printf(" PF key down\n"); */ #ifdef XK_MISCELLANY switch(keysym) { /* Cursor control & motion */ /* case XK_Left : flag = 1; char1 = call(keyboa).curs_left; break; case XK_Up : flag = 1; char1 = call(keyboa).curs_up; break; case XK_Right : flag = 1; char1 = call(keyboa).curs_right; break; case XK_Down : flag = 1; char1 = call(keyboa).curs_down; break; case XK_Next : flag = 1; char1 = call(keyboa).pad_down; break; case XK_Prior : flag = 1; char1 = call(keyboa).pad_up; break; case XK_End : flag = 1; char1 = call(keyboa).marg_right; break; case XK_Begin : flag = 1; char1 = call(keyboa).marg_left; break; */ /* Misc Functions */ /* case XK_Select : flag = 1; char1 = call(keyboa).mark; break; */ /* case XK_Print : flag = 1; char1 = ; break; case XK_Execute : flag = 1; char1 = ; break; case XK_Insert : flag = 1; char1 = ; break; case XK_Undo : flag = 1; char1 = call(keyboa).undo; break; case XK_Redo : flag = 1; char1 = ; break; case XK_Menu : flag = 1; char1 = ; break; case XK_Find : flag = 1; char1 = ; break; case XK_Cancel : flag = 1; char1 = call(keyboa).line_del; break; case XK_Help : flag = 1; char1 = call(keyboa).help; break; case XK_Break : flag = 1; char1 = ; break; case XK_Mode_switch : flag = 1; char1 = ; break; case XK_script_switch : flag = 1; char1 = ; break; case XK_Num_Lock : flag = 1; char1 = ; break; case XK_F1 : flag = 1; char1 = shift ? call(keyboa).sfunct1 : call(keyboa).funct1 ; break; case XK_F2 : flag = 1; char1 = shift ? call(keyboa).sfunct2 : call(keyboa).funct2 ; break; case XK_F3 : flag = 1; char1 = shift ? call(keyboa).sfunct3 : call(keyboa).funct3 ; break; case XK_F4 : flag = 1; char1 = shift ? call(keyboa).sfunct4 : call(keyboa).funct4 ; break; case XK_F5 : flag = 1; char1 = shift ? call(keyboa).sfunct5 : call(keyboa).funct5 ; break; case XK_F6 : flag = 1; char1 = shift ? call(keyboa).sfunct6 : call(keyboa).funct6 ; break; case XK_F7 : flag = 1; char1 = shift ? call(keyboa).sfunct7 : call(keyboa).funct7 ; break; case XK_F8 : flag = 1; char1 = shift ? call(keyboa).sfunct8 : call(keyboa).funct8 ; break; case XK_F9 : flag = 1; char1 = shift ? call(keyboa).sfunct9 : call(keyboa).funct9 ; break; case XK_F10 : flag = 1; char1 = shift ? call(keyboa).sfunct10 : call(keyboa).funct10 ; break; case XK_F11 : flag = 1; char1 = shift ? call(keyboa).sfunct11 : call(keyboa).funct11 ; break; case XK_F12 : flag = 1; char1 = shift ? call(keyboa).sfunct12 : call(keyboa).funct12 ; break; */ case XK_Shift_L : shift=1; break; case XK_Shift_R : shift=1; break; case XK_Control_L : control=1; break; case XK_Control_R : control=1; break; case XK_Caps_Lock : shiftlock = 1 ; break; case XK_Shift_Lock : shiftlock = 1 ; break; case XK_Meta_L : alt=1; break; case XK_Meta_R : alt=1; break; case XK_Alt_L : alt=1; break; case XK_Alt_R : alt=1; break; } /* end switch */ #endif } } else if(event.type == KeyRelease) { x = event.xkey.x; y = event.xkey.y; char1= event.xkey.keycode ; keysym=0; nb=XLookupString(&event.xkey,buffer,20,&keysym,&status); /* if (IsFunctionKey(keysym)) printf("function up\n"); else if(IsModifierKey(keysym)) printf("modifier up\n"); else if(IsKeypadKey(keysym)) printf(" keypad up\n"); else if(IsMiscFunctionKey(keysym)) printf(" misc function up\n"); else if(IsPFKey(keysym)) printf(" PF key up\n"); */ if (nb == 0) { #ifdef XK_MISCELLANY switch(keysym) { case XK_Shift_L : shift=0; break; case XK_Shift_R : shift=0; break; case XK_Control_L : control=0; break; case XK_Control_R : control=0; break; case XK_Caps_Lock : shiftlock = 0 ; break; case XK_Shift_Lock : shiftlock = 0 ; break; case XK_Meta_L : alt=0; break; case XK_Meta_R : alt=0; break; case XK_Alt_L : alt=0; break; case XK_Alt_R : alt=0; break; } /* end switch */ #endif } } } XDefineCursor(dpy,win,cursor_watch); XFlush(dpy); #endif #ifdef WGL a faire #endif return char1; } char Getxyc(float &x,float &y) { char c; int i,j; // cout << "getxyc \n"; c = Getijc( i,j); x = scali(i); y = scalj(j); // cout << "getxyc out \n"; return c; } void viderbuff(){ glFinish(); #ifdef AGL aglSwapBuffers (ctx); // send swap command #endif #ifdef XGL glXSwapBuffers (dpy,win); // send swap command #endif } void rattente(int waitm) { int i,j; char c=0; if(waitm) c = Getijc( i,j); if ( c == 3) {cout << "rattente: ^c => abort " << endl;closegraphique();exit(1);}// ^c => exit /* you may prefer to use carriage return to move to the next graph */ /* getc(stdin); */ // if(waitm) while(!Button()){ }; } //void GetSizeScreen(int & ix,int &iy); // GetScreenSize_ void GetScreenSize(int & ix,int &iy) { ix = width ; iy = height; } void openPS(const char *filename ) { char ffff[32]; int count=0; if(psfile_save) closePS(); time_t t_loc; float s=0.5; const int shiftx=50,shifty=50; // char username[10]; time(&t_loc); bool notfound; if( !filename) do { struct stat buf; sprintf(ffff,"rgraph_%.3d.ps",count++); volatile int r= stat(ffff,&buf) ; notfound = r !=0; if(count>1000) break; } while ( !notfound ); psfile=fopen(filename?filename:ffff,"w"); if(psfile==0) {printf("Erreur %s errno %d\n",filename?filename:ffff,errno);exit(1);} if(psfile) { fprintf(psfile,"%%!PS-Adobe-2.0 EPSF-2.0\n%%%%Creator: %s\n%%%%Title: FreeFem++\n","user"); fprintf(psfile,"%%%%CreationDate: %s",ctime(&t_loc)); fprintf(psfile,"%%%%Pages: 1\n"); fprintf(psfile,"%%%%BoundingBox: %d %d %d %d\n",shiftx,shifty,int(shiftx+width*s),int(shifty+height*s)); fprintf(psfile,"%%%%EndComments\n"); fprintf(psfile," /L { lineto currentpoint stroke newpath moveto} def\n"); fprintf(psfile," /M { moveto } def\n"); fprintf(psfile," /C {setrgbcolor} def\n"); fprintf(psfile," /rec {newpath 4 copy 8 1 roll moveto 3 -1 roll lineto 4 2 roll exch lineto lineto closepath} def\n"); fprintf(psfile," %d %d translate \n",shiftx,shifty); fprintf(psfile," %f %f scale \n",s,s); fprintf(psfile," 0 %d 0 %d rec clip newpath\n",int(width),int(height)); fprintf(psfile," /Helvetica findfont 10 scalefont setfont\n"); fprintf(psfile," /S { show} def\n"); fprintf(psfile," /bF { mark} def \n"); fprintf(psfile," /eF {newpath moveto counttomark 2 idiv {lineto} repeat closepath fill cleartomark} def\n"); fprintf(psfile," /P { /yy exch def /xx exch def xx xx 1 add yy yy 1 add rec fill } def\n"); fprintf(psfile," 1 setlinewidth\n"); psfile_save=psfile; } } void closePS(void) { if(psfile_save) { fprintf(psfile_save,"showpage\n"); fclose(psfile_save); } psfile=0; psfile_save=0; } void Commentaire(const char * c) { if(psfile) { fprintf(psfile,"%% %s\n",c); } }; void NoirEtBlanc(int NB) { if(NB) LastColor=1; else LastColor=ncolortable?ncolortable:2; } void MettreDansPostScript(int in) { if(in) psfile=psfile_save; else psfile=0; } static void FillRect(float x0,float y0, float x1, float y1) { float r[8]; r[0]=x0;r[1]=y0; r[2]=x1;r[3]=y0; r[4]=x1;r[5]=y1; r[6]=x0;r[7]=y1; fillpoly(4,r); } float GetHeigthFont() { // FontInfo MyFontInfo; // GetFontInfo(&MyFontInfo); #ifdef XGL int dir,asc,desc,k; XCharStruct overall; XTextExtents(font_info,"gML",3,&dir,&asc,&desc,&overall); return (asc+desc)*(0.9/echy); #else int interligne = 9;// MyFontInfo.ascent + MyFontInfo.descent + MyFontInfo.leading; return interligne/echy; #endif } int PutLevel(int lineno, float xf, int col) { float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); float xleft = xmax - (xmax-xmin)*0.1; float ytop = ymax; float ydelta = (ymax-ymin)/40; ydelta=GetHeigthFont(); xleft = xmax - 6*ydelta; ytop -= ydelta*(col+2); couleur(col); FillRect(xleft+ydelta/8.,ytop+ydelta/8.,xleft+ydelta*7./8.,ytop+ydelta*7./8.); rmoveto(xleft+ydelta*1.4,ytop+ydelta/4); char buf[30]; sprintf(buf,"%g",xf); couleur(1); plotstring(buf); return lineno; } void ShowHelp(const char * s,int k) { if(k) { MettreDansPostScript(0); couleur(1); float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); rmoveto(xmin+(xmax-xmin)/100,ymax-(k)*(ymax-ymin)/30); plotstring(s); MettreDansPostScript(1); // couleur(1); } } class Grid; void setgrey(bool gg ){grey=gg;} int getgrey(){ return grey;} void SaveMesh(Grid &t){} void SavePlot(int D, Grid& t, double *f){} void SavePlot(int D, Grid& t, float *f){} freefem++-3.38-1/src/Graphics/macglrgraf.cpp000644 000767 000024 00000001664 11406226635 020760 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // ORG : UPMC // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define AGL 1 #define FF_GRAPH_SET_PTR #include "glrgraph.hpp" freefem++-3.38-1/src/Graphics/macrgraf.cpp000644 000767 000024 00000071665 11500777104 020442 0ustar00hechtstaff000000 000000 // // SUMMARY : // ORG : UPMC // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /**************DO NOR REMOVE THIS BANNER***************/ /* FreeFEM++ : Language for a Finite Element Method */ /* ------- Release 1.0: June 1994. */ /* Authors: D. Bernardi, Y. Darmaillac F. Hecht, */ /* O. Pironneau */ // -*- Mode : c++ -*- /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* out our consent : fax (33)1 44 27 44 11 */ /* (fax) Olivier.Pironneau@ann.jussieu.fr */ /******************************************************/ // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : /* Authors: D. Bernardi, Y. Darmaillac F. Hecht, */ /* O. Pironneau */ // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ const char * edpfilenamearg=0; bool waitatend=true; //#define TARGET_API_MAC_CARBON 1 #define FF_GRAPH_SET_PTR #include #include #include //OP my hack #include "error.hpp" #include #include #include using namespace std; #include #include #include #include #define fill thequikdrawfill #include "rgraph.hpp" #include #include #include #include //#include #include #include #include #include #include #include #undef fill static FILE *psfile = 0; static FILE *psfile_save = 0; static bool grey=false; int pStrCopy (StringPtr p1, char * p2); #ifdef FREEFEM // pour imprimer la version FH #define STRING(i) #i #include jmp_buf environ; static int myenviron = 0; TEHandle TESioux; void out_of_memory (); void NEW_HANDLER (void); void compile(char *fname); float scali(int i); float scalj(int j); void execute(char* what); int DoMouseDown (int windowPart, WindowPtr whichWindow, EventRecord *myEvent); char Getijc(int & x,int & y); void out_of_memory () { cout << "FreeFEM error: operator new failed; not enough memory" << endl; if (myenviron) longjmp(environ,1); exit(2); } void NEW_HANDLER (void){ set_new_handler (&out_of_memory);} #endif #define ours(w) (w==grafWindow0) template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} static int cube6[7][3] ={ {65534,0,0},{65534,65534,0},{0,65534,0},{0,65534,65534},{0,0,65534} , {65534,0,65534},{65534,0,0} }; static int grey6[2][3] ={ {65534,65534,65534},{0,0,0} }; char errbuf[255]; static int INITGRAPH=0; static float aspx, aspy, echx,echy,ech,rxmin,rxmax,rymin,rymax; static int carre, lacouleur; // static CWindowRecord wgRecord0; static WindowPtr grafWindow0; static GrafPtr grafPort0; static Rect boundsRect; static int nbcolor; static CursHandle CrossCurseur ; static CursHandle WatchCurseur ; static int ncolortable; static int LastColor; // LastColor=1 => Noir et Blanc static Pattern white,black; static int width,height; static RGBColor * colortable; int getcolor(); void putpixel(int ix,int iy, int couleur); int scalx(float x); int scaly(float y); void thisexit(); void InitMac(); // -------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------- // APPLE EVENT SUPPORT ROUTINES // -------------------------------------------------------------------------------------------------------------- static OSStatus MissingParameterCheck( const AppleEvent *inputEvent) /* This routine checks an input AppleEvent for the missing keyword. If the missing keyword is found, that means that some required parameters were missing (ie, an error). However, if the missing keyword isn't found, that means that we aren't missing any required parameters (that is to say, all REQUIRED parameters were supplied by the person who created the event). SOME DAY, THE ABOVE COMMENT WILL MAKE SENSE TO YOU. IT STILL DOESN'T TO ME AND I WAS THE ONE WHO WROTE IT. */ { OSStatus anErr; AEKeyword missingKeyword; DescType ignoredActualType; Size ignoredActualSize; anErr = AEGetAttributePtr( inputEvent, keyMissedKeywordAttr, typeWildCard, &ignoredActualType, (Ptr) &missingKeyword, sizeof(AEKeyword), &ignoredActualSize); if (anErr == noErr) anErr = errAEParamMissed; else if (anErr == errAEDescNotFound) anErr = noErr; return anErr; } // MissingParameterCheck static pascal OSErr DoOpenApp( const AppleEvent *inputEvent, AppleEvent *outputEvent, SInt32 handlerRefCon) { /* #pragma unused (outputEvent, handlerRefCon) DoCommand(nil, cNew, 0, 0); // so that the initial document opens more quickly, we don't start // the threads until we get an OpenApp or OpenDocument AppleEvent if (gStarterThread != kNoThreadID) SetThreadState(gStarterThread, kReadyThreadState, gStarterThread); */ return(MissingParameterCheck(inputEvent)); } // DoOpenApp // -------------------------------------------------------------------------------------------------------------- static pascal OSErr DoReopenApp( const AppleEvent *inputEvent, AppleEvent *outputEvent, SInt32 handlerRefCon) { /* #pragma unused (outputEvent, handlerRefCon) if (FrontWindow() == nil) DoCommand(nil, cNew, 0, 0); */ return(MissingParameterCheck(inputEvent)); } // DoReopenApp // -------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------- static pascal OSStatus DoOpenFile( const AppleEvent *inputEvent ) // nil == 0, zero length == print to default, other == printer name { OSStatus anErr, anErr2; AEDescList docList; // list of docs passed in long index, itemsInList; Boolean wasAlreadyOpen; /* anErr = AEGetParamDesc( inputEvent, keyDirectObject, typeAEList, &docList); nrequire(anErr, GetFileList); anErr = AECountItems( &docList, &itemsInList); // how many files passed in nrequire(anErr, CountDocs); for (index = 1; index <= itemsInList; index++) // handle each file passed in { AEKeyword keywd; DescType returnedType; Size actualSize; FSRef fileRef; FSCatalogInfo theCatInfo; anErr = AEGetNthPtr( &docList, index, typeFSRef, &keywd, &returnedType, (Ptr)(&fileRef), sizeof( fileRef ), &actualSize ); nrequire(anErr, AEGetNthPtr); anErr = FSGetCatalogInfo( &fileRef, kFSCatInfoFinderInfo, &theCatInfo, NULL, NULL, NULL ); /* nrequire(anErr, FSGetCatalogInfo); if (anErr == noErr) anErr = DetermineWindowTypeOrOpen(&fileRef, ((FInfo*)&theCatInfo.finderInfo)->fdType, nil, nil, &wasAlreadyOpen); */ // } return anErr; } // DoOpenOrPrint // -------------------------------------------------------------------------------------------------------------- static pascal OSErr DoOpenDocument( const AppleEvent *inputEvent, AppleEvent *outputEvent, SInt32 handlerRefCon) { #pragma unused (outputEvent, handlerRefCon) OSStatus anErr=0; anErr = DoOpenFile(inputEvent); return anErr; } // DoOpenDocument void InitMac() { #if TARGET_API_MAC_OS8 InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(0L); FlushEvents(everyEvent, 0L); MaxApplZone(); #endif /* TARGET_API_MAC_OS8 */ MoreMasters(); InitCursor(); #if TARGET_API_MAC_CARBON BitMap screenBitMap; Rect screenBits; Cursor theArrow; GetQDGlobalsScreenBits(&screenBitMap); screenBits = screenBitMap.bounds; SetCursor(GetQDGlobalsArrow(&theArrow)); #else Rect screenBits = qd.screenBits.bounds; SetCursor(&qd.arrow); #endif /* TARGET_API_MAC_CARBON */ SIOUXSettings.initializeTB = 0; // else SIOUX initialize the toolbox for us SIOUXSettings.toppixel = 45; SIOUXSettings.leftpixel = 15; // SIOUXSettings.fontface = bold + italic;// or normal SIOUXSettings.asktosaveonclose = 0; short bas = screenBits.bottom; short droit = screenBits.right; SIOUXSettings.columns = (short)(2.+(float)droit/8.); SIOUXSettings.rows = (short)(10. + (float)bas/18.); SIOUXSetTitle("\pfreefem+ line output"); //marche pas!! SIOUXSettings.fontface = normal; SIOUXSettings.fontid = 22;// courier; SIOUXSettings.fontsize = 10; cout << "Initmac" << endl; #define INSTALL(event, handler) \ AEInstallEventHandler(kCoreEventClass, event, handler, 0, false) // AEC, changed to use the correct handler procs // INSTALL (kAEOpenApplication, NewAEEventHandlerUPP(DoOpenApp)); // INSTALL (kAEReopenApplication, NewAEEventHandlerUPP(DoReopenApp)); INSTALL (kAEOpenDocuments, NewAEEventHandlerUPP(DoOpenDocument)); #undef INSTALL } class InitilisationMac { static int init; public: InitilisationMac(){ InitMac();} }; static InitilisationMac Initmac; // to call InitMac int getprog(char* fn,int argc, char** argvptr) { OSErr anErr; NavDialogOptions dialogOptions; NavReplyRecord reply; anErr=NavGetDefaultDialogOptions(& dialogOptions); if( anErr != noErr) return -1; anErr =NavChooseFile(0,&reply,&dialogOptions,0,0,0,0,0) ; if (anErr == noErr && reply.validRecord) { // Deal with multiple file selection long count; anErr = AECountItems(&(reply.selection), &count); // Set up index for file list if (anErr == noErr) { long index; for (index = 1; index <= count; index++) { AEKeyword theKeyword; DescType actualType; Size actualSize; FSSpec documentFSSpec; // Get a pointer to selected file anErr = AEGetNthPtr(&(reply.selection), index, typeFSS, &theKeyword, &actualType,&documentFSSpec, sizeof(documentFSSpec), &actualSize); if (anErr == noErr) { anErr = HSetVol(0,documentFSSpec.vRefNum,documentFSSpec.parID); pStrCopy(documentFSSpec.name, fn); } } } // Dispose of NavReplyRecord, resources, descriptors anErr = NavDisposeReply(&reply); } else return 0; // erreur cancel return (2); } #ifdef FREEFEM void thisexit(){ myexit();} int main (int argc, char **argv) { char *prog; char fname[256]; SIOUXSettings.sleep=1; argc = getprog (fname, argc, argv); atexit(thisexit); NEW_HANDLER (); // see dependent system files ({pc,x,mac}rgraph.{h,cpp}) int OPTION = 0; if (argc == 2) { initgraphique(); if(0==setjmp(environ)) { myenviron=1; compile (fname); // cout << "No Error" << endl; } myenviron = 0; } else printf ("To launch freefem you must type freefem and a file name\n"); return 0; } #else extern int mymain(int argc,char **argv); string StrVersionNumber(); int main (int argc, char **argv) { SIOUXUseWaitNextEvent = true; SIOUXSettings.sleep=0; char * wn = new char [256]; for (int i=0;i<256;i++) wn[i] = 0; strcpy(wn," -- FreeFem++ "); strcat(wn,StrVersionNumber().c_str()); SIOUXSetTitle((unsigned char *) wn); int ret=15; try { ret=mymain(argc,argv);} catch( ...) { cerr << "catch exception ???";} catch( Error & err) { cerr << err.what() << endl; } return ret; } void myexit(int i) { exit(i); } #endif void coutmode(short i) { cout << flush; cerr << flush; // if(i)(**(SIOUXTextWindow->edit)).txFace = 0; // else (**(SIOUXTextWindow->edit)).txFace = 1; ;} void message(char *s) { printf("%s \n", s); } void erreur(char *s) { cout << endl; cerr << "##Fatal error :" << s << endl << "exit(1)" << endl; exit(1); } void *safecalloc(long nb, long size) { void* p=NULL; p = calloc(nb, size); if (p == NULL) erreur("Out of Memory!\n"); return p; } void safefree(void** f) { if(*f) { free(*f); *f=NULL; } } void initgraphique(void) { if(INITGRAPH) return; #if TARGET_API_MAC_CARBON BitMap screenBitMap; Rect screenBits; Cursor theArrow; GetQDGlobalsScreenBits(&screenBitMap); screenBits = screenBitMap.bounds; SetCursor(GetQDGlobalsArrow(&theArrow)); #else Rect screenBits = qd.screenBits.bounds; SetCursor(&qd.arrow); #endif /* TARGET_API_MAC_CARBON */ boundsRect.top = 45; boundsRect.left = (short) (15 + (0.35 * screenBits.right)); boundsRect.bottom = screenBits.bottom - 25; boundsRect.right = screenBits.right- 25; if((boundsRect.bottom - boundsRect.top) < (boundsRect.right - boundsRect.left)) boundsRect.right = boundsRect.left + boundsRect.bottom - boundsRect.top; else boundsRect.bottom = boundsRect.top + boundsRect.right - boundsRect.left; grafWindow0=NewCWindow(0, &boundsRect, "\pFreeFem Graphics",true, 8, NULL, true, 0); ShowWindow(grafWindow0); BringToFront(grafWindow0); SelectWindow(grafWindow0); SetPortWindowPort(grafWindow0); GetPort(&grafPort0); height = boundsRect.bottom - boundsRect.top - 10; width = boundsRect.right - boundsRect.left -10; aspx = boundsRect.right - boundsRect.left -10; aspy = boundsRect.bottom - boundsRect.top - 10; carre = aspx == aspy; lacouleur = getcolor(); CrossCurseur = GetCursor(crossCursor); WatchCurseur = GetCursor(watchCursor); GetQDGlobalsWhite(&white); GetQDGlobalsBlack(&black); //if( (**(wgRecord0.port.portPixMap)).pixelSize>7) nbcolor= 256; //else // nbcolor= 2; ncolortable =0; LastColor=2;// En couleur pas defaul colortable=0; SetColorTable(2+6); // TextFont(fontNum); TextSize(9); // small size INITGRAPH = 1; } static RGBColor DefColorMacOs( int k,int nb,bool hsv, bool grey,int nbcolors,float *colors) { RGBColor C; float r,g,b; extern void DefColor(float & r, float & g, float & b, int k,int nb,bool hsv, bool grey,int nbcolors,float *colors); DefColor(r,g,b, k,nb,hsv,grey,nbcolors,colors); C.red=65535*r; C.green=65535*g; C.blue=65535*b; return C; } void SetColorTable1(int nb,bool hsv,int nbcolors,float *colors) { static bool greyo = !grey; static float * colorso =0; if(!INITGRAPH) return; if (ncolortable == nb && greyo == grey && colorso == colors ) return;// optim greyo = grey; colorso=colors; if (nbcolor && nb>2) { if(colortable) delete [] colortable; colortable = new RGBColor[nb]; ncolortable = nb; if(LastColor>1) LastColor=nb-1; for (int i0=0;i0 LastColor ? 1 : c; // c=Min(c,LastColor); pour noir et blanc lacouleur =c; if ( c == 0 ) ForeColor(30); else if (ncolortable>3 && c < ncolortable && c >=0 ) RGBForeColor(colortable+c); else ForeColor(33); if (psfile) { float r=1,g=1,b=1; if (colortable) { if (c>0 && c < ncolortable) { r = (float) colortable[c].red /65535.F; g = (float) colortable[c].green /65535.F; b = (float) colortable[c].blue /65535.F; } } else if (c!=0) r=g=b=0; fprintf(psfile,"%.3f %.3f %.3f C\n",r,g,b); } } int InRecScreen(float x1, float y1,float x2, float y2) { float xi = Min(x1,x2),xa=Max(x1,x2); float yi = Min(y1,y2),ya=Max(y1,y2); return (xa >= rxmin) && (xi <= rxmax) && (ya >= rymin) && (yi <= rymax); } int InPtScreen( float x, float y) { return (x >= rxmin) && (x <= rxmax) && (y >= rymin) && (y <= rymax); } void penthickness(int pepais) { PenSize(pepais,pepais); if (psfile) fprintf(psfile,"%d setlinewidth\n",pepais); } void cadre(float xmin,float xmax,float ymin,float ymax) { rxmin = xmin; rxmax = xmax; rymin = ymin; rymax = ymax; echx = aspx / (xmax - xmin); echy = aspy / (ymax - ymin); } void getcadre(float &xmin,float &xmax,float &ymin,float &ymax) { xmin = rxmin; xmax = rxmax; ymin = rymin; ymax = rymax; } void cadreortho(float centrex, float centrey, float rayon) { int xasp,yasp, getmaxx, getmaxy; getmaxx = xasp =aspx; getmaxy = yasp = aspy; if (getmaxx * (float)xasp > getmaxy * (float)yasp) { rymin = centrey - rayon; rymax = centrey + rayon; echy= getmaxy / (2 * rayon); echx= (echy * xasp) / yasp; rxmin= centrex - getmaxx / (2 * echx); rxmax= centrex + getmaxx / (2 * echx); } else { rxmin = centrex - rayon; rxmax = centrex + rayon; echx = getmaxx / (2 * rayon); echy = (echx * yasp) / xasp; rymin = centrey - getmaxy / (2 * echy); rymax = centrey + getmaxy / (2 * echy); } } int scalx(float x) { return int((x - rxmin) * echx); } int scaly(float y) { return int((rymax - y) * echy); } float scali(int i) { return i/echx + rxmin; } float scalj(int j) { return -j/echy + rymax; } void pointe(float x, float y) { int newx = scalx(x), newy = scaly(y); putpixel(newx, newy, lacouleur); if (psfile) fprintf(psfile,"%d %d P\n", newx, height-newy); } void rmoveto(float x, float y) { int newx = scalx(x), newy = scaly(y); MoveTo(newx,newy); if (psfile) fprintf(psfile,"%d %d M\n", newx, height-newy); } void rlineto(float x, float y) { int newx = scalx(x), newy = scaly(y); LineTo(newx,newy); if (psfile) fprintf(psfile,"%d %d L\n", newx,height-newy); } void raffpoly(int n, float *poly) { PolyHandle thePoly; int i; thePoly =OpenPoly(); MoveTo(scalx(poly[0]),scaly( poly[1])); for(i=1; iwhere)) { closegraphique(); cout << "Fin (fermeture fenetre graphique) " <portRect)); ZoomWindow(whichWindow, inZoomIn, true); InitCursor(); } break; case inZoomOut: /* if (ours(whichWindow)) { SetCursor(&waitCursor); SetPort(whichWindow); EraseRect(&(whichWindow->portRect)); ZoomWindow(whichWindow, inZoomOut, true); if(whichWindow == editWindow) MyZoomWindow(whichWindow); InitCursor(); }*/ break; case inMenuBar: // return(DoCommand(MenuSelect(myEvent->where))); break; case inSysWindow: //SystemClick(myEvent, whichWindow); break; case inDrag: if (ours(whichWindow)) { SetPortWindowPort(whichWindow); GetPort(&grafPort0); DragWindow(whichWindow, myEvent->where, 0); } break; case inGrow: //if (ours(whichWindow)) // {MyGrowWindow(whichWindow, myEvent->where);} break; case inContent: wasactive = (whichWindow == FrontWindow()); if(!wasactive) { SelectWindow(whichWindow); // if (ours(whichWindow) && MacReDraw ) (* MacReDraw)(); } else if (ours(whichWindow)) { SetPortWindowPort(whichWindow); GetPort(&grafPort0); while (Button()) ; return 0; } break; } return 1; } char HandleEvent(EventRecord & myEvent) { WindowPtr whichWindow=NULL; short windowPart; char char1=0; switch (myEvent.what) { case mouseDown: windowPart = FindWindow(myEvent.where, &whichWindow); if( DoMouseDown(windowPart, whichWindow, &myEvent) ==0) char1= 251; break; // // // case keyDown: case keyUp: case autoKey: { windowPart = FindWindow(myEvent.where, &whichWindow); if((whichWindow==grafWindow0) /* && (inContent == windowPart)*/) { if (grafWindow0 != FrontWindow()) { SelectWindow(whichWindow); SetPortWindowPort(whichWindow); GetPort(&grafPort0); } char1 = (myEvent.message & 127L); } break;} case updateEvt: if (ours((WindowPtr) myEvent.message)) { BeginUpdate((WindowPtr) myEvent.message); EndUpdate((WindowPtr) myEvent.message); } break; } return char1; } void viderbuff(){ QDFlushPortBuffer(grafPort0,0); } char Getijc(int & x,int & y) { char char1=0; showgraphic(); EventRecord myEvent; int flag=1; HLock( (Handle) WatchCurseur); SetCursor(*CrossCurseur); HUnlock( (Handle) WatchCurseur); SelectWindow(grafWindow0); while (char1==0) { if (GetNextEvent(everyEvent, &myEvent) /* ,OxFFFFFFFF,h)*/) char1=HandleEvent(myEvent); } GlobalToLocal( & myEvent.where); x = myEvent.where.h; y = myEvent.where.v; HLock( (Handle) WatchCurseur); SetCursor(*WatchCurseur); HUnlock( (Handle) WatchCurseur); // printf("\t\t x = %d y = %d c=%d\n", x,y,char1); return char1; } char Getxyc(float &x,float &y) { char c; int i,j; c = Getijc( i,j); x = scali(i); y = scalj(j); return c; } void rattente(int waitm) { int i,j; char c=0; if(waitm) c = Getijc( i,j); if ( c == 3) {cout << "rattente: ^c => abort " << endl;closegraphique();exit(1);}// ^c => exit /* you may prefer to use carriage return to move to the next graph */ /* getc(stdin); */ // if(waitm) while(!Button()){ }; } void GetSizeScreen(int & ix,int &iy); void GetScreenSize(int & ix,int &iy) { ix = width ; iy = height; } void openPS(const char *filename ) { char ffff[32]; int count=0; if(psfile_save) closePS(); time_t t_loc; float s=0.5; const int shiftx=50,shifty=50; // char username[10]; time(&t_loc); bool notfound; if( !filename) do { struct stat buf; sprintf(ffff,"rgraph_%.3d.ps",count++); volatile int r= stat(ffff,&buf) ; notfound = r !=0; if(count>1000) break; } while ( !notfound ); psfile=fopen(filename?filename:ffff,"w"); if(psfile==0) {printf("Erreur %s errno %d\d",filename?filename:ffff,errno);exit(1);} if(psfile) { fprintf(psfile,"%%!PS-Adobe-2.0 EPSF-2.0\n%%%%Creator: %s\n%%%%Title: FreeFem++\n","user"); fprintf(psfile,"%%%%CreationDate: %s",ctime(&t_loc)); fprintf(psfile,"%%%%Pages: 1\n"); fprintf(psfile,"%%%%BoundingBox: %d %d %d %d\n",shiftx,shifty,int(shiftx+width*s),int(shifty+height*s)); fprintf(psfile,"%%%%EndComments\n"); fprintf(psfile," /L { lineto currentpoint stroke newpath moveto} def\n"); fprintf(psfile," /M { moveto } def\n"); fprintf(psfile," /C {setrgbcolor} def\n"); fprintf(psfile," /rec {newpath 4 copy 8 1 roll moveto 3 -1 roll lineto 4 2 roll exch lineto lineto closepath} def\n"); fprintf(psfile," %d %d translate \n",shiftx,shifty); fprintf(psfile," %f %f scale \n",s,s); fprintf(psfile," 0 %d 0 %d rec clip newpath\n",int(width),int(height)); fprintf(psfile," /Helvetica findfont 10 scalefont setfont\n"); fprintf(psfile," /S { show} def\n"); fprintf(psfile," /bF { mark} def \n"); fprintf(psfile," /eF {newpath moveto counttomark 2 idiv {lineto} repeat closepath fill cleartomark} def\n"); fprintf(psfile," /P { /yy exch def /xx exch def xx xx 1 add yy yy 1 add rec fill } def\n"); fprintf(psfile," 1 setlinewidth\n"); psfile_save=psfile; } } void closePS(void) { if(psfile_save) { fprintf(psfile_save,"showpage\n"); fclose(psfile_save); } psfile=0; psfile_save=0; } void Commentaire(const char * c) { if(psfile) { fprintf(psfile,"%% %s\n",c); } }; void NoirEtBlanc(int NB) { if(NB) LastColor=1; else LastColor=ncolortable?ncolortable:2; } void MettreDansPostScript(int in) { if(in) psfile=psfile_save; else psfile=0; } static void FillRect(float x0,float y0, float x1, float y1) { float r[8]; r[0]=x0;r[1]=y0; r[2]=x1;r[3]=y0; r[4]=x1;r[5]=y1; r[6]=x0;r[7]=y1; fillpoly(4,r); } float GetHeigthFont() { FontInfo MyFontInfo; GetFontInfo(&MyFontInfo); int interligne = MyFontInfo.ascent + MyFontInfo.descent + MyFontInfo.leading; return interligne*0.7/echy; } int PutLevel(int lineno, float xf, int col) { float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); float xleft = xmax - (xmax-xmin)*0.1; float ytop = ymax; float ydelta = (ymax-ymin)/40; ydelta=GetHeigthFont(); xleft = xmax - 6*ydelta; ytop -= ydelta*(col+2); couleur(col); FillRect(xleft+ydelta/8.,ytop+ydelta/8.,xleft+ydelta*7./8.,ytop+ydelta*7./8.); rmoveto(xleft+ydelta*1.4,ytop+ydelta/4); char buf[30]; sprintf(buf,"%g",xf); couleur(1); plotstring(buf); return lineno; } void ShowHelp(const char * s,int k) { if(k) { MettreDansPostScript(0); couleur(1); float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); rmoveto(xmin+(xmax-xmin)/100,ymax-(k)*(ymax-ymin)/30); plotstring(s); MettreDansPostScript(1); // couleur(1); } } void setgrey(bool gg ){grey=gg;} int getgrey(){ return grey;} class Grid; void SaveMesh(Grid &t){} void SavePlot(int D, Grid& t, double *f){} void SavePlot(int D, Grid& t, float *f){} freefem++-3.38-1/src/Graphics/Makefile.am000644 000767 000024 00000000475 12167254041 020177 0ustar00hechtstaff000000 000000 EXTRA_DIST=glrgraph.hpp macglrgraf.cpp \ macrgraf.cpp Pcrgraph.cpp rgraph.hpp \ sansrgraph.cpp xglrgraf.cpp Xrgraph.cpp DefColor.cpp \ getprog-unix.hpp mode_open.hpp ffglut.hpp ff-win32.cpp # FFCS: no compilation here, so the tags file must be built by hand tags:TAGS TAGS: etags *.?pp clean-local:: -rm TAGS freefem++-3.38-1/src/Graphics/Makefile.in000644 000767 000024 00000041417 12543260337 020214 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Graphics ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = glrgraph.hpp macglrgraf.cpp \ macrgraf.cpp Pcrgraph.cpp rgraph.hpp \ sansrgraph.cpp xglrgraf.cpp Xrgraph.cpp DefColor.cpp \ getprog-unix.hpp mode_open.hpp ffglut.hpp ff-win32.cpp all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Graphics/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Graphics/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-local \ cscopelist-am ctags-am distclean distclean-generic distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # FFCS: no compilation here, so the tags file must be built by hand tags:TAGS TAGS: etags *.?pp clean-local:: -rm TAGS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/Graphics/mode_open.hpp000644 000767 000024 00000000317 11406226635 020617 0ustar00hechtstaff000000 000000 #ifndef MODE_OPEN_HPP #define MODE_OPEN_HPP #ifdef __WIN32__ #define MODE_READ_BINARY "rb" #define MODE_WRITE_BINARY "wb" #else #define MODE_READ_BINARY "r" #define MODE_WRITE_BINARY "w" #endif #endif freefem++-3.38-1/src/Graphics/Pcrgraph.cpp000644 000767 000024 00000113615 12301212500 020376 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : D. Bernardi, Y. Darmaillac F. Hecht, */ /* O. Pironneau, K.Ohtsuka */ // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define PCRGRAPH_CPP #define FF_GRAPH_SET_PTR #include #define TOSTRING1(i) #i #define TOSTRING(i) TOSTRING1(i) #include #include ///#include #include #include #include #include #include #include #include using namespace std; //#include "vect.h" #include "error.hpp" #include "strversionnumber.hpp" //#include /* ** Windows includes */ #include #include ///#include #include #include #include #include //*OT use for the console window ///#include const char * edpfilenamearg=0; bool waitatend=true; bool consoleatend=true; #define fill thequikdrawfill #include "rgraph.hpp" //char *Version = "1.2.7"; void out_of_memory (); void NEW_HANDLER (void); void myexit(int); void compile(char *fname); float scali(int i); float scalj(int j); //int pStrCopy (StringPtr p1, StringPtr p2); int execute(char* what); //int DoMouseDown (int windowPart, WindowPtr whichWindow, EventRecord *myEvent); char Getijc(int & x,int & y); void postexit(); static int cube6[7][3] ={ {255,0,0},{255,255,0},{0,255,0}, {0,255,255},{0,0,255}, {255,0,255},{255,0,0} }; static int grey6[2][3] ={ {255,255,255},{0,0,0} }; static bool grey=false; static int ncolortable=0; static int LastColor=2; // LastColor=1 => Noir et Blanc >2 =>couleur typedef struct rgb { BYTE r; // red component of color BYTE g; // green component of color BYTE b; // blue component of color } rgb; static rgb * colortable=0; static HPEN* hpen=0; static HBRUSH* hbr=0; static HFONT hFont=0; static int fontH = 0; // The height of font static int cstatic=1; int getcolor(); void putpixel(int ix,int iy, int couleur); int scalx(float x); int scaly(float y); void compile (char *); void NEW_HANDLER (void){ set_new_handler (&out_of_memory);} #define ours(w) (w==grafWindow0) template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} char errbuf[255]; static int INITGRAPH=0; float rayon; static int width,height; static FILE *psfile = 0; static FILE *psfile_save = 0; static float aspx, aspy, echx,echy,ech,rxmin,rxmax,rymin,rymax; static int currx, curry; static int carre; static HWND hWnd; static WNDCLASS rClass; static HDC hdc; static HANDLE hConOut=0; const float fMinPixel = -32000; // to avoid int overflot const float fMaxPixel = 32000; /* Function definitions */ BOOL Init(HINSTANCE, HINSTANCE, LPSTR, int); int DoMain(HINSTANCE hInstance); LONG WINAPI OpenWindowProc1(HWND, UINT, WPARAM, LPARAM); int getcolor(); void putpixel(int ix,int iy, int couleur); int scalx(float x); int scaly(float y); void rattente (int); BOOL inittext(VOID); BOOL ShowOpenDialogBox(char *fileName); BOOL CreateProjetFile(char *fileName); char *ChangePdeToExt(char *fileName,char *ext); BOOL mainFreeFEM(); int GetFileName(char *fullname, char *shortname); DWORD GetOption(char lpszCmdLine[]); void SetConsole(HANDLE hConsole); FILE *GetConsoleHandle(DWORD Dev); BOOL GetConsoleBuff(); BOOL EditLog(); //void SaveMesh(Grid& t); //void SavePlot(int D,Grid& t, Real *f); BOOL FatalErr(char *s, int err); //BOOL CheckSameTrig(Grid& t); //*OT flag for FreeFEM+/WinfFEM #define winf_VFFEM 1 #define winf_NOWAIT 2 #define winf_NOCOLOR 4 #define winf_NOEDIT 8 #define winf_Usage 1024 unsigned int winf_flg = 0; // end char FreeFemCache[256]="\0", shortName[256]="\0", fullName[256]="\0"; void fillpoly(int n, float *poly){ POINT *pt; pt = new POINT[n]; for (int i=0; i < n; i++) { pt[i].x = scalx(poly[2*i]); pt[i].y = scaly(poly[2*i+1]); } if (cstatic <0 || cstatic > ncolortable) cstatic =1; SelectObject(hdc,hbr[cstatic]); int ret = Polygon(hdc,pt,n); delete [] pt; SelectObject(hdc,hpen[n]); if (psfile) { fprintf(psfile,"bF "); for (int i=0;i((x - rxmin) * echx); } int scaly(float y) { return static_cast((rymax - y) * echy); } float scali(int i) { return i/echx + rxmin; } float scalj(int j) { return -j/echy + rymax; } void pointe(float x, float y) { // putpixel(scalx(x), scaly(y), LastColor); } int InRecScreen(float x1, float y1,float x2, float y2) { float xi = Min(x1,x2),xa=Max(x1,x2); float yi = Min(y1,y2),ya=Max(y1,y2); return (xa >= rxmin) && (xi <= rxmax) && (ya >= rymin) && (yi <= rymax); } int InPtScreen( float x, float y) { return (x >= rxmin) && (x <= rxmax) && (y >= rymin) && (y <= rymax); } void SetRGBpen(int n) { SelectObject(hdc, hpen[n]); } static rgb DefColorWin32( int k,int nb, bool hsv,bool grey,int nbcolors,float *colors) { rgb C; float r,g,b; extern void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,int nbcolors,float *colors); DefColor(r,g,b, k,nb,hsv,grey,nbcolors,colors); C.r= (BYTE) (255*r); C.g= (BYTE) (255*g); C.b= (BYTE) (255*b); return C; } void SetColorTable1(int nb,bool hsv,int nbcolors,float *colors) { static bool greyo = !grey; static float * colorso =0; if(!INITGRAPH) return; if (ncolortable == nb && greyo == grey && colorso == colors ) return;// optim greyo = grey; colorso=colors; { if (hpen) for(int i=0; i1) LastColor=nb-1; for (int i0=0;i01) LastColor=nb-1; if (hpen) for(int i=0; i2) { nb -= 2; for (long i0=0;i0 LastColor ? 1 : c; // c=Min(c,LastColor); pour noir et blanc if (!(winf_flg&winf_NOCOLOR)) { if (c>=0 && c < ncolortable) cstatic = c; else cstatic = 1; SetRGBpen(cstatic); } // else SetRGBpen(1); } if (psfile) { float r=1,g=1,b=1; if (colortable) { if (c>0 && c < ncolortable) { r = (float) colortable[c].r /255.; g = (float) colortable[c].g /255.; b = (float) colortable[c].b /255.; } } else if (c!=0) r=g=b=0; fprintf(psfile,"%.3f %.3f %.3f C\n",r,g,b); } } int LaCouleur(){return cstatic;} //* Control on the graphic window void rattente(int waitm) { int i=0, j=0; char c; if (waitm) if(!(winf_flg&winf_NOWAIT)) c = Getijc(i,j); } char Getijc(int & x,int & y) { char char1=' '; if(!INITGRAPH) { x = 0; y = 0; return char1; } int cont=1; POINT xy; xy.x =0; xy.y =0; MSG msg; SetWindowText(hWnd,"Click mouse to continue"); do { GetMessage(&msg,hWnd,0,0);// all message GetCursorPos(&xy); switch (msg.message) { case WM_LBUTTONDOWN:char1=char(251), cont=0; break; // with shift 248 case WM_RBUTTONDOWN:char1=char(253), cont=0; break; // with shit 250 // if the 2 buttom, 252, et shith 249; case WM_CLOSE: myexit(2); case WM_DESTROY: myexit(3); case WM_CHAR: char1 = (TCHAR)msg.wParam; cont = 0; break; //case WM_KEYDOWN: char1 = (TCHAR)msg.wParam; cont=0; break; default: TranslateMessage(&msg); DispatchMessage(&msg); break; } } while (cont); // ScreenToClient(hWnd,&xy); ShowWindow(hWnd, SW_SHOW ); // SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetWindowText(hWnd, PACKAGE_STRING " works..."); RECT rc; ScreenToClient(hWnd,&xy); GetClientRect(hWnd, &rc); x = xy.x-rc.left; y = xy.y-rc.top; // cout << " x = " << x << " y = " << y << " char = " << ((unsigned char)char1 > 127 ? '*': char1) << ")" << endl; return char1; } char Getxyc(float &x,float &y) { char c=' '; int i=0,j=0; if(!(winf_flg&winf_NOWAIT)) c = Getijc( i,j); x = scali(i); y = scalj(j); //rattente(1); return c; } //* clear the screen with white void reffecran(void) { HBRUSH hbr; RECT rc; GetClientRect(hWnd, &rc); hbr = CreateSolidBrush(RGB(255, 255, 255)); FillRect(hdc,&rc,hbr); DeleteObject(hbr); } BOOL ShowOpenDialogBox(char *fileName) { OPENFILENAME ofn; char szDirName[256]; char *strFilter="PCgFEM Files (*.edp)\0*.edp\0All Files (*.*)\0*.*\0\0"; memset(&ofn, 0, sizeof(OPENFILENAME)); getcwd(szDirName,sizeof(szDirName)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = strFilter; ofn.lpstrFileTitle = fileName; ofn.nMaxFileTitle = 80; ofn.lpstrInitialDir=szDirName; ofn.lpstrTitle ="Choose you freefem '*.edp' File"; ofn.Flags=OFN_SHOWHELP|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; return GetOpenFileName(&ofn); } void coutmode(short r) { ;}// will be done later void initgraphique(void) { if (INITGRAPH) return; hdc=GetDC(hWnd); hpen=0; SetColorTable(2+6); RECT rc; GetClientRect(hWnd, &rc); aspx = (float)(rc.right - rc.left); aspy = (float)(rc.bottom - rc.top); width = rc.right - rc.left; height = rc.bottom - rc.top; carre = aspx == aspy; // Define the font style LOGFONT lf; TEXTMETRIC tm; HFONT hFont, hOldFont; memset(&lf, 0, sizeof lf); lf.lfHeight = -9; lstrcpy(lf.lfFaceName,"Arial"); lf.lfOutPrecision = OUT_TT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = PROOF_QUALITY; lf.lfPitchAndFamily = FF_SWISS | VARIABLE_PITCH; hFont = ::CreateFontIndirect(&lf); hOldFont = (HFONT)::SelectObject(hdc,hFont); ::GetTextMetrics(hdc, &tm); ::DeleteObject(hOldFont); fontH = static_cast((tm.tmHeight + tm.tmExternalLeading)*0.6); // end of font style INITGRAPH = 1; // cout << flush << "end inigraphique " << endl; } void closegraphique(void) { if(INITGRAPH) { if(hpen) DeleteObject(hpen), delete [] colortable; if (hbr) DeleteObject(hbr), INITGRAPH =0; // before DestroyWindow to avoid loop ReleaseDC(hWnd,hdc); // DestroyWindow(hWnd); } } void GetScreenSize(int & ix,int &iy) { ix = width ; iy = height; } void openPS(const char *filename ) { RECT rc; GetClientRect(hWnd, &rc); width = rc.right - rc.left; height = rc.bottom - rc.top; closePS(); time_t t_loc; float s=0.5; const int shiftx=50,shifty=50; time(&t_loc); printf(" Save Postscript in file '%s'\n",filename?filename:"freefem.ps"), psfile=fopen(filename?filename:"freefem.ps","w"); if(psfile==0) {printf("Erreur %s \n",filename);exit(1);} if(psfile) { fprintf(psfile,"%%!PS-Adobe-2.0 EPSF-2.0\n%%%%Creator: %s\n%%%%Title: FreeFem++\n","user"); fprintf(psfile,"%%%%CreationDate: %s",ctime(&t_loc)); fprintf(psfile,"%%%%Pages: 1\n"); fprintf(psfile,"%%%%BoundingBox: %d %d %d %d\n",shiftx,shifty,int(shiftx+width*s),int(shifty+height*s)); fprintf(psfile,"%%%%EndComments\n"); fprintf(psfile," /L { lineto currentpoint stroke newpath moveto} def\n"); fprintf(psfile," /M { moveto } def\n"); fprintf(psfile," /C {setrgbcolor} def\n"); fprintf(psfile," /rec {newpath 4 copy 8 1 roll moveto 3 -1 roll lineto 4 2 roll exch lineto lineto closepath} def\n"); fprintf(psfile," %d %d translate \n",shiftx,shifty); fprintf(psfile," %f %f scale \n",s,s); fprintf(psfile," 0 %d 0 %d rec clip newpath\n",int(width),int(height)); fprintf(psfile," /Helvetica findfont 10 scalefont setfont\n"); fprintf(psfile," /S { show} def\n"); fprintf(psfile," /bF { mark} def \n"); fprintf(psfile," /eF {newpath moveto counttomark 2 idiv {lineto} repeat closepath fill cleartomark} def\n"); fprintf(psfile," /P { /yy exch def /xx exch def xx xx 1 add yy yy 1 add rec fill } def\n"); fprintf(psfile," 1 setlinewidth\n"); psfile_save=psfile; } } void closePS(void) { if(psfile_save) { fprintf(psfile_save,"showpage\n");//fprintf(psfile,"showpage\n"); fclose(psfile_save);//fclose(psfile); } psfile=0; psfile_save=0; } void Commentaire(const char * c) { if(psfile) { fprintf(psfile,"%% %s\n",c); } }; void NoirEtBlanc(int NB) { if(NB) LastColor=1; else LastColor=ncolortable?ncolortable:2; } void MettreDansPostScript(int in) { if(in) psfile=psfile_save; else psfile=0; } // Various works when the program will end void myexit(int err) { time_t ltime; // write the time stump in console struct tm *now; time(<ime); // write the end time now = localtime(<ime); cout << "\nEnd Time: " << asctime(now) << endl; if (err==0) { // normal end cout << "end No Error " << endl << flush ; } else cout << "end by Error (no.=" << err << ')' << endl; rattente(1); if (GetConsoleBuff()==FALSE) FatalErr("Log file creation error !",0); if (!(winf_flg&winf_NOEDIT)) EditLog(); if (INITGRAPH) closegraphique(); FreeConsole(); PostQuitMessage(0); exit(err); } // initialize the console void SetcppIo() { FILE *fp=NULL,*fin=NULL; // Get the standard output fin = GetConsoleHandle(STD_INPUT_HANDLE); if(fin!=NULL) *stdin = *fin; // get the standard output if((fp = GetConsoleHandle(STD_OUTPUT_HANDLE)) == NULL) *stdout = *fp; freopen("conin$", "r", stdin); freopen("conout$", "w", stdout); // freopen("conout$", "w", stderr); using namespace __gnu_cxx; stdio_filebuf * ccout = new stdio_filebuf(stdout, std::ios_base::out); //static stdio_filebuf ccerr(stderr, std::ios_base::out); stdio_filebuf *ccin= new stdio_filebuf(stdin, std::ios_base::in); cout.rdbuf(ccout); cin.rdbuf(ccin); cerr.rdbuf(ccout); ios::sync_with_stdio(); } BOOL inittext(VOID) { OSVERSIONINFO osVer; // for GetVersionEx() osVer.dwOSVersionInfoSize = sizeof(osVer); GetVersionEx(&osVer); if (osVer.dwPlatformId == VER_PLATFORM_WIN32s) { MessageBox(NULL, "This FreeFEM++ cannot run on Windows 3.1.\n" "This application will now terminate.", "Error: Windows NT or Windows 95 Required to Run", MB_OK ); return FALSE; // Console API is not able in Windows 3.1 } // FreeConsole(); // If the console is already used AllocConsole(); // Use the console API SetcppIo(); /* freopen("conin$", "r", stdin); freopen("conout$", "w", stdout); freopen("conout$", "w", stderr); */ SetConsoleTitle(PACKAGE_STRING " console"); return TRUE; } //*------- Modules for MS-Windows //*OT 12/3/1999 //* Get the buffer of the console //* The buffer is stored in the filename.log BOOL GetConsoleBuff() { CONSOLE_SCREEN_BUFFER_INFO csbi; //* to get buffer info GetConsoleScreenBufferInfo(hConOut, &csbi); COORD coordLine = {0,0}; CHAR *szLine; //* buffer to read from the console (a line) DWORD dwCharsRead; char fname[255]; FILE *fp; strcpy(fname,ChangePdeToExt(shortName,"log")); if ((fp = fopen(fname,"w"))==NULL) { perror(fname); return FALSE; } szLine = (CHAR *)malloc((csbi.dwSize.X+1) * sizeof(CHAR)); for (int i=0; i 0)) szLine[j--] =0; if (j < csbi.dwSize.X-1) szLine[j+1] = '\n'; fprintf(fp,"%s",szLine); coordLine.Y++; } fclose(fp); return TRUE; } //*OT 12/3/1999 //* Open the filename.log by the editor //* default editor is notepad.exe //* Using variable "ffemEd", we can change the editor BOOL EditLog() { char *editor, fname[256], cmdLine[255]; strcpy(fname,ChangePdeToExt(shortName,"log")); editor = getenv("ffed"); if (editor == 0) sprintf(cmdLine,"notepad.exe %s",fname); else sprintf(cmdLine,"%s %s",editor,fname); if (WinExec(cmdLine,SW_SHOWNORMAL) < 31) { sprintf(errbuf,"Cannot execute [%s]",cmdLine); FatalErr(errbuf,99); return FALSE; } FreeConsole(); return true; } void Usage() { cout << "Usage: freefem++ [options]" << endl; cout << "Select a program file by the dialog box if option is omitted.\n[option]" << endl; cout << "-f filename: Run the program file \"filename\"." << endl; cout << " In this mode, all plotted datas are stored in the \".\\cache\"." << endl; cout << " The stored datas are used in \"WinfFEM\" (IDE for freefem+)." << endl; cout << " You can get this from ." << endl; cout << "-s : No wait at end." << endl; cout << "-b : Do not use the color" << endl; cout << "-n : Do not open the log file at end. The editor is the notepad if you do not" << endl; cout << " set \"ffed=[name of editor]\" in environments." << endl; cout << "-h : Display the usage (this)." << endl; } // freefem+ arg1 arg2 arg3 // Hack the args and analysis int StoreFname(char Line[], int len) { char msg[256]; char *ext; // ALH - 2/6/04 - add treatments for names surrounded with quotes // (but still breaks on names including quotes). char stopchar = ' '; bool skipone = false; if(Line[0] == '"' || Line[0] == '\''){ stopchar = Line[0]; skipone = true; } // Copies the name string, including its surrounding quotes if // necessary. int i; int j=0; for (i=0; i0 )||isdigit(c) )) if(isdigit(c)) vv+= c; verbosity=atoi(vv.c_str()); } case 's': // not wait at end of execution winf_flg |= winf_NOWAIT; ++i; break; case 'b': // no color winf_flg |= winf_NOCOLOR; ++i; break; case 'n': winf_flg |= winf_NOEDIT; ++i; break; case 'h': winf_flg |= winf_Usage; ++i; break; default: while (lpszCmdLine[i]!=' ' && (i < CmdLen)) i++; } } else { i += StoreFname(&lpszCmdLine[i],CmdLen-i); break; } } cout << " v = " << verbosity << endl; return 0; } /* * Init * Initialization for the program is done here: * 1) Register the window class (if this is the first instance) * 2) Create the desktop window for the app. * 3) Show the desktop window in the manner requested by the User. * */ BOOL Init(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { DWORD dwStyle = WS_OVERLAPPEDWINDOW; if (!hPrevInstance) { /* Register Class for First Overlapped Window */ rClass.lpszClassName = "FreeFem++" ; rClass.hInstance = hInstance; rClass.lpfnWndProc = OpenWindowProc1; rClass.hCursor = LoadCursor(NULL, IDC_ARROW); rClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); rClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); rClass.style = 0x4000; rClass.cbClsExtra = 0; rClass.cbWndExtra = 0; if (!RegisterClass( &rClass)) return FALSE; } int dd=600; int ddx0=200; int ddy0=30; // long dwFlags; /* DEVMODE dev_mode = {0}; if(!EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dev_mode)) { cout << " screen size ?? " << dev_mode.dmPelsWidth << " x " << dev_mode.dmPelsHeight << endl; dd = Min(dev_mode.dmPelsWidth*0.7,dev_mode.dmPelsHeight*0.9); ddx0 = dev_mode.dmPelsWidth*0.28; ddy0=dev_mode.dmPelsHeight*0.05; } else cout << " Error EnumDisplaySettings => no screen size " << endl; */ int sx = GetSystemMetrics(SM_CXSCREEN); int sy = GetSystemMetrics(SM_CYSCREEN); dd = static_cast(Min(sx*0.7,sy*0.9)); ddx0 = static_cast(sx*0.28); ddy0 = static_cast(sy*0.05); //cout << " Screen Size " << sx << " x " << sy << endl; // Rectangle ss=Get_VirtualScreen(); // dd=(Abs(ss.get_Top-ss.get_Bottom())*90)/100; GetOption(lpszCmdLine); hWnd = CreateWindow("FreeFEM++", PACKAGE_STRING " for Windows", dwStyle,ddx0,ddy0,dd,dd,/* CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,*/ NULL, NULL, hInstance, NULL); if (*fullName == '\0' && (winf_flg != winf_Usage)) { // in command line, there is no filename if (ShowOpenDialogBox(shortName)==FALSE) { exit(0); } strcpy(fullName,shortName); } if (inittext()==FALSE) myexit(1); else if (winf_flg & winf_VFFEM ) { // create only cache, option "-f" is given if (!getcwd(FreeFemCache,MAX_PATH)) { FatalErr("Fail to get current path",-1); } strcat(FreeFemCache,"\\cache\\"); if (chdir(FreeFemCache)) { // check the cache directory #ifndef __CYGWIN__ if (mkdir(FreeFemCache)) { #else if (mkdir(FreeFemCache,0777)) { #endif sprintf(errbuf,"Fail to create the directory %s",FreeFemCache); FatalErr(errbuf,-1); } } else (chdir("..\\")); // already created return TRUE; }; return TRUE; } /* OpenWindowProc1 - Handles messages for the main window. * Parameters: * hWnd - Handle to Window which message is delivered to. * msgID - ID number of message * wParam - 16-bit parameter * lParam - 32-bit parameter * */ LONG WINAPI OpenWindowProc1( HWND hWnd, UINT wMsgID, WPARAM wParam, LPARAM lParam) { switch (wMsgID) { case WM_DESTROY: PostQuitMessage(0); DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, wMsgID, wParam, lParam); } return 0; } //*OT 29/12/98 // Routines and functions for WinfFEM int chkCacheDir(); BOOL TestProjetPresence(char *shortName); BOOL CreateProjetFile(char *shortName); BOOL SaveLogFile(char *fileName); void GetOption(int argc, char *argv[]); FILE *projet=NULL; // end int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, // int argc, char *argv[] int nCmdShow) { MSG msg; LPTSTR cmd = GetCommandLine(); if (Init(hInstance, hPrevInstance,lpszCmdLine,nCmdShow)) { // main after checking options if (mainFreeFEM() == FALSE) myexit(99); // exit with error else myexit(0); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } myexit(msg.wParam); // exit(msg.wParam); } return -1; } // the real main extern int mymain(int argc,char **argv); // main() in FreeFEM+ for PCs BOOL mainFreeFEM() { char prjName[256]; if (winf_flg & winf_VFFEM) { // given by "-f filename" strcpy(prjName,ChangePdeToExt(shortName,"prj")); if (strcmp(FreeFemCache,"")!=0) if (CreateProjetFile(prjName)==FALSE) FatalErr(prjName,-1); } cout << "Welcome to freefem++ v " << StrVersionNumber() <= 0 ; i-- ) { // loop 1 if ( fullname[i] == '\\' ) { for ( j = i+1, k=0 ; j < tail ; j++, k++ ) *(shortname + k) = *(fullname + j ) ; *(shortname + k) = '\0'; break; } } if (i == -1) strcpy(shortname,fullname); return 0 ; // OK! } void ShowHelp(const char * s,int k) { if(k) { MettreDansPostScript(0); couleur(1); float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); rmoveto(xmin+(xmax-xmin)/100,ymax-(k)*(ymax-ymin)/30); plotstring(s); MettreDansPostScript(1); // couleur(1); } } char *ChangePdeToExt(char *fileName,char *ext) { int len; len=strlen(fileName); char *file = new char[len+1]; for(int i=0; i #define MAXPATH 256 char * getOp(const char *what) { int tail=0, len=0; char *p; p = strrchr(what, '\\'); if (p == NULL) p = (char *)what; while (*p && (*p != ' ')) p++; if (*p) *p++ = '\0'; else return NULL; while (*p && (*p == ' ')) p++; if (*p) return p; else return NULL; } #ifdef WWWWWWWWWWWWWWWWWWWW int execute(const char* what) { char szBuffer[MAXPATH + 1]; char *option; int r=0; char *vide=""; option = getOp(what); if(!option) option = vide; cout << "excute :: " < #include #include #include #include #include #include "rgraph.hpp" #include "error.hpp" #ifdef macintoshxx #include #include #else #include #endif #ifdef xTARGET_CARBON #include int pStrCopy (StringPtr p1, char * p2) /* copies a pascal string `p1 into a C string */ { int len,i; len = (*p1++) %256; for(i=1;i<=len;i++) *p2++=*p1++; *p2 = 0; return 0; } int getprog(char* fn,int argc, char** argvptr) { OSErr anErr; NavDialogOptions dialogOptions; NavReplyRecord reply; anErr=NavGetDefaultDialogOptions(& dialogOptions); if( anErr != noErr) return -1; anErr =NavChooseFile(0,&reply,&dialogOptions,0,0,0,0,0) ; if (anErr == noErr && reply.validRecord) { // Deal with multiple file selection long count; anErr = AECountItems(&(reply.selection), &count); // Set up index for file list if (anErr == noErr) { long index; for (index = 1; index <= count; index++) { AEKeyword theKeyword; DescType actualType; Size actualSize; FSSpec documentFSSpec; // Get a pointer to selected file anErr = AEGetNthPtr(&(reply.selection), index, typeFSS, &theKeyword, &actualType,&documentFSSpec, sizeof(documentFSSpec), &actualSize); if (anErr == noErr) { anErr = HSetVol(0,documentFSSpec.vRefNum,documentFSSpec.parID); pStrCopy(documentFSSpec.name, fn); } } } // Dispose of NavReplyRecord, resources, descriptors anErr = NavDisposeReply(&reply); } return (2); } #else #include "getprog-unix.hpp" #endif template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} static long cube6[7][3] ={ { 65535,32000,32000},{ 65535, 65535,0},{0, 65535,0},{0, 65535, 65535},{0,0, 65535} , { 65535,0, 65535},{ 32000,0,0} }; static long grey6[2][3] ={ {65534,65534,65534},{0,0,0} }; static bool grey=false; static FILE *psfile = 0; static FILE *psfile_save = 0; static int LastColor=2; // pour est en couleur par defaut const float fMinPixel = -32000; const float fMaxPixel = +32000; #define reel float typedef struct XColor { unsigned short red,green,blue; } XColor; static XColor *colortable; static int ncolortable,fcolor; static reel echx,echy,rxmin,rxmax,rymin,rymax; static int lacouleur=0, width, height, currx=0, curry=0; #define call(i) i static int INITGRAPH=0; void myend(); void myend() { if (INITGRAPH) closegraphique(); cout << "the end" < LastColor ? 1 : c; // c=Min(c,LastColor); pour noir et blanc lacouleur = c; float r=1,g=1,b=1; if (colortable) { if (c>0 && c < ncolortable) { r = (float) colortable[c].red /65535.; g = (float) colortable[c].green /65535.; b = (float) colortable[c].blue /65535.; } } else if (c!=0) r=g=b=0; if(psfile) fprintf(psfile,"%.3f %.3f %.3f C\n",r,g,b); } static XColor DefColorSansG( int k,int nb, bool hsv,bool ggrey,int nbcolors,float *colors) { XColor C; float r,g,b; extern void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool ggrey,int nbcolors,float *colors); DefColor(r,g,b, k,nb,hsv,ggrey,nbcolors,colors); C.red= (short unsigned int) (65535*r); C.green=(short unsigned int)(65535*g); C.blue= (short unsigned int) (65535*b); return C; } void SetColorTable1(int nb,bool hsv,int nbcolors,float *colors) { static bool greyo = !grey; static float *colorso =0; if(!INITGRAPH) return; if (ncolortable == nb && greyo == grey && colorso == colors ) return;// optim greyo = grey; colorso=colors; if (nbcolors && nb>2) { if(colortable) delete [] colortable; colortable = new XColor[nb]; ncolortable = nb; if(LastColor>1) LastColor=nb-1; for (int i0=0;i02 && nb < 256) { nb = Max(nb,8); if (ncolortable == nb) return;// optim if(colortable) delete [] colortable; colortable = new XColor[nb]; ncolortable = nb; if(LastColor>1) LastColor=nb-1; // cout << "SetColorTable "<< nb << endl; int k=0; colortable[k].red= 65535; colortable[k].green= 65535; colortable[k].blue= 65535; k++; colortable[k].red=0; colortable[k].green=0; colortable[k].blue=0; k++; nb = nb -2; for (long i0=0;i0>char1 ; return 0;// char1; } char Getxyc(float &x,float &y) { // cout << " in Getxyc" << endl; char c; int i,j; c = Getijc( &i,&j); x = scali(i); y = scalj(j); // cout << " out Getxyc" << x << " " << y << " " << c << endl; return c; } /// <> void rattente(int ) { } void GetScreenSize(int &ix,int &iy) { ix = width; iy = height; } void openPS(const char *filename ) { char ffff[32]; int count=0; if(psfile_save) closePS(); time_t t_loc; int widthA4PS=596; //int heightA4PS=842; float s= (double)widthA4PS/width; char username[10]; /*if (!cuserid(username)) */ strcpy(username,"inconnue"); time(&t_loc); bool notfound; if( !filename) do { struct stat buf; sprintf(ffff,"rgraph_%.3d.ps",count++); volatile int r= stat(ffff,&buf) ; notfound = r !=0; if(count>1000) break; } while ( !notfound ); const char *fps (filename?filename:ffff); psfile=fopen(fps,"w"); if(psfile) { psfile_save=psfile; fprintf(psfile,"%%!PS-Adobe-2.0 EPSF-2.0\n%%%%Creator: %s\n%%%%Title: FreeFem++\n","user"); fprintf(psfile,"%%%%CreationDate: %s",ctime(&t_loc)); fprintf(psfile,"%%%%Pages: 1\n"); fprintf(psfile,"%%%%BoundingBox: 0 0 %d %d\n",int(width*s),int(height*s)); fprintf(psfile,"%%%%EndComments\n"); fprintf(psfile," /L {newpath moveto lineto stroke} def\n"); fprintf(psfile," /C {setrgbcolor} def\n"); fprintf(psfile," /rec {newpath 4 copy 8 1 roll moveto 3 -1 roll lineto 4 2 roll exch lineto lineto closepath} def\n"); fprintf(psfile," %f %f scale \n",s,s); fprintf(psfile," 0 %d 0 %d rec clip\n",int(width),int(height)); fprintf(psfile," /Helvetica findfont %d scalefont setfont\n",int(9/s)); fprintf(psfile," /S {moveto show} def\n"); fprintf(psfile," /bF { mark} def \n"); fprintf(psfile," /eF {newpath moveto counttomark 2 idiv {lineto} repeat closepath fill cleartomark} def\n"); fprintf(psfile," /P { /yy exch def /xx exch def xx xx 1 add yy yy 1 add rec fill } def\n"); fprintf(psfile," 2 setlinewidth\n"); } else cerr << " Err openning postscript file " << fps << endl; } void closePS(void) { if(psfile_save) { fprintf(psfile_save,"showpage\n"); fclose(psfile_save); } psfile_save=0; psfile=0; } void coutmode(short ) {} // bof bof --- float GetHeigthFont() { double widthA4PS=596; float s=widthA4PS/width; return 5.5/s/echy; } void Commentaire(const char * c) { if(psfile) { fprintf(psfile,"%% %s\n",c); } } void NoirEtBlanc(int NB) { if(NB) LastColor=1; else LastColor=ncolortable?ncolortable:2; } void MettreDansPostScript(int in) { if(in) psfile=psfile_save; else psfile=0; } static void FillRect(float x0,float y0, float x1, float y1) { float r[8]; r[0]=x0;r[1]=y0; r[2]=x1;r[3]=y0; r[4]=x1;r[5]=y1; r[6]=x0;r[7]=y1; fillpoly(4,r); } int PutLevel(int lineno, float xf, int col); int PutLevel(int lineno, float xf, int col) { float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); float xleft = xmax - (xmax-xmin)*0.1; float ytop = ymax; float ydelta = (ymax-ymin)/40; ydelta=GetHeigthFont(); xleft = xmax - 6*ydelta; ytop -= ydelta*(col+2); couleur(col); FillRect(xleft+ydelta/8.,ytop+ydelta/8.,xleft+ydelta*7./8.,ytop+ydelta*7./8.); rmoveto(xleft+ydelta*1.4,ytop+ydelta/4); char buf[30]; sprintf(buf,"%g",xf); couleur(1); plotstring(buf); return lineno; } void ShowHelp(const char * s,int k) { if(k) { MettreDansPostScript(0); couleur(1); float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); rmoveto(xmin+(xmax-xmin)/100,ymax-(k)*(ymax-ymin)/30); plotstring(s); MettreDansPostScript(1); // couleur(1); } } void setgrey(bool gg ){grey=gg;} int getgrey(){ return grey;} class Grid; void SaveMesh(Grid &); void SavePlot(int , Grid& , double *); void SavePlot(int , Grid& , float *); void SaveMesh(Grid &){} void SavePlot(int , Grid& , double *){} void SavePlot(int , Grid& , float *){} freefem++-3.38-1/src/Graphics/xglrgraf.cpp000644 000767 000024 00000001677 11406226635 020473 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define XGL #define FF_GRAPH_SET_PTR #include "glrgraph.hpp" freefem++-3.38-1/src/Graphics/Xrgraph.cpp000644 000767 000024 00000074351 12033706624 020267 0ustar00hechtstaff000000 000000 /********** DO NOT REMOVE THIS BANNER **********/ // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR: D. Bernardi, F. Hecht, O. Pironneau , Y. Darmaillac // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /******************************************************************/ const char * edpfilenamearg=0; bool waitatend=true; bool consoleatend=true; #define FF_GRAPH_SET_PTR #include #include #include #include #include #include #include "strversionnumber.hpp" using namespace std; #define MAXSHORT 0xFFFF #ifdef HPPA #ifndef __GNUC__ typedef char *caddr_t; #endif #endif #ifdef __MWERKS__ #include #include #include #include #include #include #else #include #include #include #include #include #include #endif #undef index #include "rgraph.hpp" #ifdef macintoshxx #include #include #else #include #endif template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} static long cube6[7][3] ={ { 65535,32000,32000},{ 65535, 65535,0},{0, 65535,0},{0, 65535, 65535},{0,0, 65535} , { 65535,0, 65535},{ 32000,0,0} }; static long grey6[2][3] ={ {65534,65534,65534},{0,0,0} }; static FILE *psfile = 0; static FILE *psfile_save = 0; static bool grey=false; static int LastColor=2; // pour est en couleur par defaut const float fMinPixel = -32000; const float fMaxPixel = +32000; #define reel float static Display *display; static Window win; static XSizeHints size_hints; // static XEvent report; static int ncolortable,fcolor; static XColor *colortable; static GC gc; static XFontStruct *font_info; static int shift, control,shiftlock,alt; static reel echx,echy,rxmin,rxmax,rymin,rymax; static int lacouleur,screen, width, height, currx, curry; static unsigned long background,foreground; static Cursor cursor_watch,cursor_arrow; static long NbErrX11 =0; Colormap color_map,color_map_sys; #define call(i) i static Visual *visual; static int INITGRAPH=0; void myend() { if (INITGRAPH) closegraphique(); cout << "the end" <error_code, msg, 80); fprintf(stderr, "Error code %s\n", msg);} return 0; } /* void xerror() { fprintf(stderr, "Probleme avec X-Windows\n"); assert(0); } */ void xerrorio() { fprintf(stderr, "Fatal erreur avec X-Windows\n"); assert(0); exit(2); } void MyXSelectInput(Display * dpy,Window w,int mask) { XSetWindowAttributes attributes; attributes.event_mask = mask; XChangeWindowAttributes(dpy, w, CWEventMask, &attributes); } int LaCouleur() {return lacouleur;} void couleur(int c) { if ( lacouleur == c) // small optim return; c= c > LastColor ? 1 : c; // c=Min(c,LastColor); pour noir et blanc lacouleur = c; if (colortable) { if (c>=0 && c < ncolortable) XSetForeground(display,gc,colortable[c].pixel); else XSetForeground(display,gc,foreground); } else if ( c == 0 ) XSetForeground(display,gc,background); else XSetForeground(display,gc,foreground); if (psfile) { float r=1,g=1,b=1; if (colortable) { if (c>0 && c < ncolortable) { r = (float) colortable[c].red /65535.; g = (float) colortable[c].green /65535.; b = (float) colortable[c].blue /65535.; } } else if (c!=0) r=g=b=0; fprintf(psfile,"%.3f %.3f %.3f C\n",r,g,b); } } static XColor DefColorX11( int k,int nb, bool hsv,bool grey,int nbcolors,float *colors) { XColor C; float r,g,b; extern void DefColor(float & r, float & g, float & b, int k,int nb, bool hsv,bool grey,int nbcolors,float *colors); DefColor(r,g,b, k,nb,hsv,grey,nbcolors,colors); C.red=65535*r; C.green=65535*g; C.blue=65535*b; C.flags = DoRed | DoGreen | DoBlue; C.pixel=k; // cout << " color : " << k << " " << C.red << " "<< C.green << " " << C.blue << " " << r << endl; return C; } void SetColorTable1(int nb,bool hsv,int nbcolors,float *colors) { static bool greyo = !grey; static float * colorso =0; if(!INITGRAPH) return; if (ncolortable == nb && greyo == grey && colorso == colors ) return;// optim greyo = grey; colorso=colors; if (fcolor && nb>2 && nb < 256) { if(colortable) delete [] colortable; colortable = new XColor[nb]; ncolortable = nb; if(LastColor>1) LastColor=nb-1; for (int i0=0;i0c_class != TrueColor) { // cout << "XStoreColors( not TrueColor)" << ncolortable << " " << XStoreColors (display, color_map, colortable, ncolortable) ; // << endl; } else { // cout << "XAllocColor (TrueColor)" << endl; for (int i=0;i2 && nb < 256) { nb = Max(nb,8); if (ncolortable == nb) return;// optim if(colortable) delete [] colortable; colortable = new XColor[nb]; ncolortable = nb; if(LastColor>1) LastColor=nb-1; int k=0; colortable[k].pixel=k; colortable[k].red= 65535; colortable[k].green= 65535; colortable[k].blue= 65535; colortable[k].flags = DoRed | DoGreen | DoBlue; background=k; k++; colortable[k].pixel=k; colortable[k].red=0; colortable[k].green=0; colortable[k].blue=0; colortable[k].flags = DoRed | DoGreen | DoBlue; foreground=k; k++; nb = nb -2; for (long i0=0;i0bits_per_rgb; color_map_sys = DefaultColormap (display, DefaultScreen (display)); color_map = color_map_sys; foreground= BlackPixel(display, screen); background= WhitePixel(display, screen); switch (visual->c_class) { case GrayScale: {break;} case PseudoColor: { cout << " PseudoColor nbcolor =" << visual->map_entries << endl; color_map= XCreateColormap (display, RootWindow (display, DefaultScreen (display)), visual,AllocAll); // copy the def color map for (int i=0;imap_entries;i++) { XColor colorcell_defs; colorcell_defs.pixel = (unsigned long) i; XQueryColor (display, color_map_sys, &colorcell_defs); XStoreColor (display, color_map, &colorcell_defs); } fcolor=1; SetColorTable(8); // set break; } case DirectColor: { cout << " DirectColor " << endl; fcolor=1; SetColorTable(8); // set break; } case TrueColor : { cout << " TrueColor " << endl; fcolor=1; SetColorTable(8); // set break; } } font_info = XLoadQueryFont(display, "6x9"); if (!font_info) font_info = XLoadQueryFont(display, "6x10"); if( !font_info) {cout << " erreur font 6x10 and 6x9 not found !\n";exit(2);}; XSetErrorHandler((XErrorHandler)xerror); XSetIOErrorHandler((XIOErrorHandler)xerrorio); screen = DefaultScreen(display); width = DisplayWidth(display, screen); height = DisplayHeight(display, screen); ddd = width < height ? width : height; width = ddd*8/10; height = ddd*8/10; attributes.background_pixel = background; attributes.border_pixel = foreground; attributes.backing_store = Always; attributes.colormap = color_map; win = XCreateWindow(display, RootWindow(display, DefaultScreen(display)), 50, 80, width, height,4, CopyFromParent, InputOutput, visual, CWBackPixel | CWBorderPixel | CWBackingStore | CWColormap, &attributes); char title[256]; sprintf(title,"%s%s","FreeFrem++ ",StrVersionNumber().c_str()); XChangeProperty(display, win, XA_WM_NAME, XA_STRING, 8 , PropModeReplace,(const unsigned char *) title , strlen(title)); gcvalues.foreground = foreground; gcvalues.background = background; gcvalues.function = GXcopy ; gc = XCreateGC(display, win, GCForeground | GCBackground | GCFunction, &gcvalues); XSetFillRule(display,gc,WindingRule); // win = XCreateSimpleWindow(display, RootWindow(display, screen), 50, 80, width, height, 4, // foreground,background); cursor_arrow = XCreateFontCursor(display,XC_arrow); cursor_watch = XCreateFontCursor(display,XC_watch); size_hints.flags = PPosition | PSize; size_hints.x = 0; size_hints.y = 0; size_hints.width = width; size_hints.height = height; XSetFont(display, gc, font_info->fid); XSetForeground(display, gc, foreground); XMapWindow(display, win); MyXSelectInput (display, win, (int) (ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask /* | ResizeRedirectMask */ | StructureNotifyMask) ); // do XNextEvent(display, &report); while (report.type != Expose); XDefineCursor(display,win,cursor_watch); XFlush(display); INITGRAPH = 1; } void closegraphique() { if (INITGRAPH) { INITGRAPH = 0; XUnloadFont(display, font_info->fid); XFreeGC(display, gc); XCloseDisplay(display); closePS(); } } void cadre(reel xmin,reel xmax,reel ymin,reel ymax) { rxmin = xmin; rxmax = xmax; rymin = ymin; rymax = ymax; echx = width / (xmax - xmin); echy = height / (ymax - ymin); } void getcadre(reel &xmin,reel &xmax,reel &ymin,reel &ymax) { xmin = rxmin; xmax = rxmax; ymin = rymin; ymax = rymax; } int InRecScreen(reel x1, reel y1,reel x2, reel y2) { return (Max(x1,x2)>= rxmin) && (Min(x1,x2) <= rxmax) && (Max(y1,y2) >= rymin) && (Min(y1,y2) <= rymax); } int InPtScreen( reel x, reel y) { return (x >= rxmin) && (x <= rxmax) && (y >= rymin) && (y <= rymax); } float scali(int i) { return i/echx + rxmin; } float scalj(int j) { return -j/echy + rymax; } int scalx(reel x) { return (int) Min(fMaxPixel,Max(fMinPixel,((x - rxmin) * echx))); } int scaly(reel y) { return (int)Min(fMaxPixel,Max(fMinPixel,((rymax - y) * echy))); } void pointe(reel x, reel y) { XDrawPoint(display, win, gc, scalx(x), scaly(y)); } void rmoveto(reel x, reel y) { currx = scalx(x); curry = scaly(y); } void rlineto(reel x, reel y) { int newx = scalx(x), newy = scaly(y); XDrawLine(display, win, gc, currx, curry, newx, newy); if (psfile) fprintf(psfile,"%d %d %d %d L\n",currx, height-curry, newx, height-newy); currx = newx; curry = newy; /* XFlush(display); */ } void cadreortho(reel centrex, reel centrey, reel rayon) { // int xasp,yasp; if (height < width) { rymin = centrey - rayon; rymax = centrey + rayon; echx = echy= height / (2 * rayon); rxmin= centrex - width / (2 * echx); rxmax= centrex + width / (2 * echx); } else { rxmin = centrex - rayon; rxmax = centrex + rayon; echx = echy = width / (2 * rayon); rymin = centrey - height / (2 * echy); rymax = centrey + height / (2 * echy); } } void plotstring (const char * string) { int lx,l = strlen(string); XDrawString(display, win, gc, currx, curry , string, l); lx = XTextWidth( font_info,string,l); if(psfile) fprintf(psfile,"(%s) %d %d S\n",string,currx,height-curry); currx += lx; } void showgraphic() { } void x11draw3(int * ptype) { XGCValues gcvalues; int type; type= *ptype; switch (type) { case 0 : {gcvalues.line_style = LineSolid; break;} case 1 : {gcvalues.line_style = LineOnOffDash; break;} default : {gcvalues.line_style = LineDoubleDash;break;} } XChangeGC(display, gc, GCLineStyle, &gcvalues); if (psfile) switch (type) { case 0 : {fprintf(psfile,"[] setdash\n");break;} case 1 : {fprintf(psfile,"[3] setdash\n");break;} default : {fprintf(psfile,"[4 1] setdash\n");break;} } } void penthickness(int pepais) { XGCValues gcvalues; gcvalues.line_width = pepais; XChangeGC(display, gc, GCLineWidth, &gcvalues); if (psfile) fprintf(psfile,"%d setlinewidth\n",pepais); } void x11linsrn(int * x1,int * x2,int * y1,int * y2) //int *x1,*x2,*y1,*y2; { XDrawLine(display, win, gc, *x1, *x2, *y1, *y2); /* call(viderbuff)(); */ } void viderbuff() { XRaiseWindow (display,win); XFlush(display); } void cercle(reel centrex, reel centrey, reel rayon) { int r = (int) (rayon * echx); XDrawArc(display, win, gc, scalx(centrex) - r, scaly(centrey) - r, width, height, 0, 360 * 64); XFlush(display); } void reffecran() { XClearWindow(display,win); } void fillpoly(int n, float *poly) { int i; XPoint *poly0,polyloc[10]; if(n<10) poly0=polyloc; else if(poly0= (XPoint *) malloc(n*sizeof(XPoint)), !poly) { fprintf(stderr, "Erreur d'allocation dans raffpoly\n"); return; } for(i=0; i1000) break; } while ( !notfound ); const char *fps (filename?filename:ffff); psfile=fopen(fps,"w"); if(psfile) { psfile_save=psfile; fprintf(psfile,"%%!PS-Adobe-2.0 EPSF-2.0\n%%%%Creator: %s\n%%%%Title: FreeFem++\n","user"); fprintf(psfile,"%%%%CreationDate: %s",ctime(&t_loc)); fprintf(psfile,"%%%%Pages: 1\n"); fprintf(psfile,"%%%%BoundingBox: 0 0 %d %d\n",int(width*s),int(height*s)); fprintf(psfile,"%%%%EndComments\n"); fprintf(psfile," /L {newpath moveto lineto stroke} def\n"); fprintf(psfile," /C {setrgbcolor} def\n"); fprintf(psfile," /rec {newpath 4 copy 8 1 roll moveto 3 -1 roll lineto 4 2 roll exch lineto lineto closepath} def\n"); fprintf(psfile," %f %f scale \n",s,s); fprintf(psfile," 0 %d 0 %d rec clip\n",int(width),int(height)); fprintf(psfile," /Helvetica findfont 10 scalefont setfont\n"); fprintf(psfile," /S {moveto show} def\n"); fprintf(psfile," /bF { mark} def \n"); fprintf(psfile," /eF {newpath moveto counttomark 2 idiv {lineto} repeat closepath fill cleartomark} def\n"); fprintf(psfile," /P { /yy exch def /xx exch def xx xx 1 add yy yy 1 add rec fill } def\n"); fprintf(psfile," 1 setlinewidth\n"); } else cerr << " Err openning postscript file " << fps << endl; } void closePS(void) { if(psfile_save) { fprintf(psfile_save,"showpage\n"); fclose(psfile_save); } psfile_save=0; psfile=0; } void coutmode(short i) {} // bof bof --- float GetHeigthFont() { int dir,asc,desc,k; XCharStruct overall; XTextExtents(font_info,"gML",3,&dir,&asc,&desc,&overall); return (asc+desc)*(0.9/echy); } void Commentaire(const char * c) { if(psfile) { fprintf(psfile,"%% %s\n",c); } }; void NoirEtBlanc(int NB) { if(NB) LastColor=1; else LastColor=ncolortable?ncolortable:2; } void MettreDansPostScript(int in) { if(in) psfile=psfile_save; else psfile=0; } static void FillRect(float x0,float y0, float x1, float y1) { float r[8]; r[0]=x0;r[1]=y0; r[2]=x1;r[3]=y0; r[4]=x1;r[5]=y1; r[6]=x0;r[7]=y1; fillpoly(4,r); } int PutLevel(int lineno, float xf, int col) { float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); float xleft = xmax - (xmax-xmin)*0.1; float ytop = ymax; float ydelta = (ymax-ymin)/40; ydelta=GetHeigthFont(); xleft = xmax - 6*ydelta; ytop -= ydelta*(col+2); couleur(col); FillRect(xleft+ydelta/8.,ytop+ydelta/8.,xleft+ydelta*7./8.,ytop+ydelta*7./8.); rmoveto(xleft+ydelta*1.4,ytop+ydelta/4); char buf[30]; sprintf(buf,"%g",xf); couleur(1); plotstring(buf); return lineno; } void ShowHelp(const char * s,int k) { if(k) { MettreDansPostScript(0); couleur(1); float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); rmoveto(xmin+(xmax-xmin)/100,ymax-(k)*(ymax-ymin)/30); plotstring(s); MettreDansPostScript(1); // couleur(1); } } void setgrey(bool gg ){grey=gg;} int getgrey(){ return grey;} class Grid; void SaveMesh(Grid &t){} void SavePlot(int D, Grid& t, double *f){} void SavePlot(int D, Grid& t, float *f){} freefem++-3.38-1/src/fflib/AddNewFE.h000644 000767 000024 00000006421 12234450000 017174 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // to add Finite Element to ff++ class EConstantTypeOfFE :public E_F0 { // using namespace Fem2D; Fem2D::TypeOfFE * v; size_t N; bool isconst; public: AnyType operator()(Stack ) const { /*cout << " ()" << v << endl*/;return SetAny(v);} EConstantTypeOfFE( Fem2D::TypeOfFE * o,bool ic=true):v(o),N(v->N),isconst(ic) {assert(v); /*cout << "New constant " << o << endl;*/} size_t nbitem() const { return N ;} EConstantTypeOfFE & operator=(Fem2D::TypeOfFE * vv) { ffassert( !isconst && vv && (vv->N == N)); // same type v = vv; return *this; } operator aType () const { assert(v);return atype();} }; struct AddNewFE { AddNewFE (const char * FEname,Fem2D::TypeOfFE* tfe) { ffassert(tfe); // check Global.New(FEname, Type_Expr(atype() ,new EConstantTypeOfFE(tfe))); } }; // 3d case class EConstantTypeOfFE3 :public E_F0 { public: // using namespace Fem2D; typedef Fem2D::TypeOfFE3 * T; T v; public: AnyType operator()(Stack ) const { /*cout << " ()" << v << endl*/;return SetAny(v);} EConstantTypeOfFE3( T o):v(o) { /*cout << "New constant " << o << endl;*/} size_t nbitem() const { assert(v); cout << " nb item = " << v->N << endl; return v->N ;} operator aType () const { return atype();} }; Type_Expr CConstantTFE3(const EConstantTypeOfFE3::T & v); /* class EConstantTypeOfFE3 :public E_F0 { // using namespace Fem2D; Fem2D::TypeOfFE3 * v; size_t N; bool isconst; public: AnyType operator()(Stack ) const { return SetAny(v);} EConstantTypeOfFE3( Fem2D::TypeOfFE3 * o,bool ic=true):v(o),N(v->N),isconst(ic) {assert(v); //cout << "New constant " << o << endl;} size_t nbitem() const { return N ;} EConstantTypeOfFE3 & operator=(Fem2D::TypeOfFE3 * vv) { ffassert( !isconst && vv && (vv->N == N)); // same type v = vv; } operator aType () const { assert(v);return atype();} }; */ extern map TEF2dto3d; TypeOfFE * FindFE2(const char * s); struct AddNewFE3 { AddNewFE3 (const char * FEname,Fem2D::TypeOfFE3* tfe,const char * FEname2=0) { ffassert(tfe); // check Global.New(FEname, Type_Expr(atype() ,new EConstantTypeOfFE3(tfe))); if(FEname2 && strlen(FEname2)) TEF2dto3d[FindFE2(FEname2)]=tfe; } }; freefem++-3.38-1/src/fflib/AFunction.cpp000644 000767 000024 00000216713 12506466420 020066 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //#pragma dont_inline on //#pragma inline_depth(1) #include "config-wrapper.h" #include #include // put here some def dur to c++11 // problem with mixed with using namespace std; // to correct bug in g++ v 4.8.1 add std #ifdef _WIN32 #define NM_STD std:: #else #define NM_STD #endif long isNaN(double x){return NM_STD isnan(x);} long isInf(double x){return NM_STD isinf(x);} long isNormal(double x){return std::isnormal(x);} #ifdef HAVE_JN double myyn(long n, double x){ return yn((int)n,x);} double myjn(long n, double x){ return jn((int) n,x);} #endif //int ShowAlloc(const char *s, size_t lg); // F. Hecht fev. 2015 ... #include "AFunction.hpp" #include #include #include "error.hpp" #include "lex.hpp" #include "RNM.hpp" #include "Operator.hpp" // for exec routine #include "rgraph.hpp" #include "InitFunct.hpp" #include #include "array_init.hpp" // Add FH to get memroy used in test .. march 2014 #if __APPLE__ #include #elif HAVE_MALLOC_H #include #endif #ifdef HAVE_TIMES #include #endif long storageused() { #if HAVE_MSTATS struct mstats mem1; mem1 = mstats(); return mem1.bytes_used; #elif HAVE_MALLINFO struct mallinfo mem1; mem1=mallinfo(); return mem1.uordblks; #else return 0; #endif } long storagetotal() { #if HAVE_MSTATS struct mstats mem1; mem1 = mstats(); return mem1.bytes_total; #elif HAVE_MALLINFO struct mallinfo mem1; mem1=mallinfo(); return mem1.keepcost; #else return 0; #endif } // end add mach 2014 ... extern Map_type_of_map map_type_of_map ; // to store te type extern Map_type_of_map map_pair_of_type ; // to store te type extern basicForEachType * typevarreal, * typevarcomplex; // type of real and complex variable extern int TheCurrentLine; // unset: by default extern long mpisize,mpirank; // FH for g++ 3.4 the prototypage have change double VersionNumber(); double Imag(const complex & z){ return imag(z);} double Real(const complex & z){ return real(z);} const basicForEachType * basicForEachType::type_C_F0 =0; // for any type un formal operation .... FH add 09/2012 // FH template inline T Max (const T &a,const T & b){return a > b ? a : b;} template inline T Min (const T &a,const T & b){return a < b ? a : b;} template inline T Abs (const T &a){return a <0 ? -a : a;} template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} template inline T Square (const T &a){return a*a;} struct SubArray2: public binary_function { static SubArray f(const long & a,const long & b) { // cout << "SubArray: " << a << " " << b << endl; return SubArray(b-a+1,a);} }; struct SubArray3: public ternary_function { static SubArray f(Stack s,const long & a,const long & b,const long & c) { // cout << "SubArray: " << a << " " << b << " " << c << endl; return SubArray((b-a+1)/c,a,c);} }; #ifdef OLDCPP template inline complex polar(const T& r, const T& theta) { return complex(r * cos(theta), r * sin(theta)); } #endif double preal( Complex * const& p){return real(*p);} template A Build(B b) { return A(b);} long Exit(long i) {throw(ErrorExit("Exit",i));return 0;} bool Assert(bool b) {if (!b) throw(ErrorExec("exec assert",1));return true;} inline void MyAssert(int i,char * ex,char * file,long line) {if (i) { cout << "CompileError assertion : " << ex << " in file " << file << " line = " << line << endl; CompileError();} } /* template class OneOperator0 : public OneOperator { class E_F0_F :public E_F0 { public: typedef R (*func)( ) ; func f; E_F0_F(func ff) : f(ff) {} AnyType operator()(Stack ) const {return SetAny( f()) ;} operator aType () const { return atype();} }; // aType r; // return type typedef R (*func)() ; func f; public: E_F0 * code(const basicAC_F0 & ) const { return new E_F0_F(f);} OneOperator0(func ff): OneOperator(map_type[typeid(R).name()]),f(ff){} }; */ template class OneOperatorConst : public OneOperator { E_F0 * e; public: E_F0 * code(const basicAC_F0 & ) const { return e;} OneOperatorConst(E_F0 * ee): OneOperator(map_type[typeid(R).name()]),e(ee){} }; class OneOperator_array : public OneOperator {public: E_F0 * code(const basicAC_F0 & a) const { return new E_Array(a);} OneOperator_array(): OneOperator(atype(),true) {} }; class OneOperator_border : public OneOperator {public: E_F0 * code(const basicAC_F0 & a) const { if (a.size()==1 && a[0].left()==atype() ) return new E_Border(dynamic_cast(a[0].LeftValue())); else return new E_Border(a);} OneOperator_border(): OneOperator(atype(),true) {} }; class OneOperator_border_label : public OneOperator {public: class Op : public E_F0 {public: const E_Border *b; Op( const E_Border *bb) : b(bb) {} AnyType operator()(Stack) const { return SetAny(b->label);} }; E_F0 * code(const basicAC_F0 & a) const { const E_Border * b = dynamic_cast(a[0].LeftValue()); return new Op(b);} OneOperator_border_label(): OneOperator(atype(),atype()) {} }; template RR LIncremantation(RR* a){ return ++(*a);} template RR RIncremantation(RR* a){ return (*a)++;} template RR LDecremantation(RR* a){ return --(*a);} template RR RDecremantation(RR* a){ return (*a)--;} template RR * New_form_string(string * s) {B * r= new B(s);delete s;return r;}// correct Mars 2011 remove * if delete inline string ** get_elements( MyMap * const & a,string* const & b) { String* Sret= &((*a)[*b]); // correction FH feb 2004 // delete b; la chaine est detruire automatiquement en fin d'instruction FH jan 2010 return Sret->getap();} template RR Abs(RR a) { return a<0?-a:a;} template R *MakePtrWithDel( A const & a) { R *r= new B(a->c_str()); delete a; return r;} template struct Op1_new_pstring: public unary_function { static R f(string * const & a) {R r = new RR(a->c_str()); // delete a; (stack ptr) FH mars 2006 return r;} }; template struct Op2_set_pstring: public binary_function { static R f(R const & p,string * const & a) {*p = new RR(a->c_str()); if ( !*p || !**p) { cerr << " Error openning file " << *a << endl; ExecError("Error openning file");} // delete a; modif mars 2006 FH return p;} }; template struct Op2_set_pstringiomode: public ternary_function { static R f(Stack s,R const & p,string * const & a,const ios::openmode & mode) {*p = new RR(a->c_str(),mode); // delete a; modif mars 2006 FH return p;} }; AnyType FWhile(Stack s ,Expression test,Expression ins) { bool sptrclean=true; AnyType a; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(s); while ( GetAny((*test)(s))) try { a=(*ins)(s); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } catch ( E_exception & e) { if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr if (e.code == E_exception::e_break) break; else if (e.code == E_exception::e_continue) continue; else throw e; } return a; } AnyType FFor(Stack s ,Expression i0,Expression i1,Expression i2,Expression ins) { bool sptrclean=true; AnyType a; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(s); for ( (*i0)(s);GetAny((*i1)(s));(*i2)(s)) { try { a=(*ins)(s); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } catch ( E_exception & e) { if (verbosity>50) cerr << "FFor " << e.what() << e.code << endl; if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr if (e.code == E_exception::e_break) break; else if (e.code == E_exception::e_continue) continue; else throw e; } } return a; } AnyType TTry(Stack s ,Expression ins,Expression ccatch,Expression fin,Expression notused) { assert(notused == 0); AnyType a; try {a=(*ins)(s);} catch ( E_exception & e) { throw e; } catch(...) { if(verbosity> 2) cerr << "Try:: catch (...) exception " << endl; a=(*ccatch)(s); } a=(*fin)(s); return a; } AnyType FIf(Stack s ,Expression test,Expression i1,Expression i2,Expression ) { AnyType a; if (GetAny((*test)(s))) { if(i1) a=(*i1)(s);//Add if FH oct 2010 } else if (i2) { if(i2) a=(*i2)(s); //Add if FH oct 2010 } return a; } aType TypeArray(aType b,aType a) { // type of b[a] aType r=map_type_of_map[make_pair(a->right(),b->right())]; if (!r) { cerr << "Sorry is not possible to make a map "<< *b->right() << " [" << *a->right() << "]" << endl; cerr << " list: " << endl; Map_type_of_map::const_iterator i; for(i=map_type_of_map.begin();i!=map_type_of_map.end();i++) cerr << "\t " << *i->first.second << " [" << *i->first.first << "]" << "=" << *i->second << endl; CompileError(); } return r; } aType TypeTemplate(aType b,aType a) { // type of b[a] aType r=map_type_of_map[make_pair(b,a)]; if (!r) { cerr << "Sorry is not possible to make a map "<< *b << "<" << *a << ">" << endl; cerr << " list: " << endl; Map_type_of_map::const_iterator i; for(i=map_type_of_map.begin();i!=map_type_of_map.end();i++) cerr << "\t " << *i->first.second << " <" << *i->first.first << ">" << "=" << *i->second << endl; CompileError(); } return r; } aType TypeArray(aType c,aType b,aType a) { // type of c[ b, a] aType ba=map_pair_of_type[make_pair(b->right(),a->right())]; if (!ba) { cerr << "Sorry is not possible to make a type of pair "<< *b->right() << ", " << *c->right() << " " << endl; cerr << " list: " << endl; Map_type_of_map::const_iterator i; for(i=map_pair_of_type.begin();i!=map_pair_of_type.end();i++) cerr << "\t (" << *i->first.second << " , " << *i->first.first << ") " << "=" << *i->second << endl; CompileError(); } return TypeArray(c,ba); } inline void ShowOn_cerr(const pair & i) { cerr << "\t" << *i.first << ":" << endl; i.second->Show(cerr); } void ShowKeyWord(ostream & f ) { zzzfff->dump(f); } ostream* dumptable(ostream* f) { *f << " the keywords " << endl; ShowKeyWord(*f); *f << " the types " << endl; ShowType(*f); ListOfTOfId::const_iterator i=tables_of_identifier.begin(); for(;i!=tables_of_identifier.end();++i) { cout << " --------- table of identifier ---------\n"; TableOfIdentifier * ti=*i; TableOfIdentifier::const_iterator mc=ti->m.begin(); TableOfIdentifier::const_iterator end=ti->m.end(); for (;mc != end;mc++) { *f << " - " << mc->first << ", type :" << *mc->second.first << endl; const Polymorphic * op =dynamic_cast(mc->second.second) ; if ( op ) *f << *op << endl; } } return f; } long exec(string *s) { int r=execute(s->c_str()); // delete s; modif mars 2006 FH return r;} class ostream_precis { public: ostream_precis(ostream * ff) :f(ff) {} ostream * f; operator long () const {return f->precision();} }; ostream_precis ostream_precision(ostream **f){ return ostream_precis(*f);} ostream_precis ostream_precision(ostream *f){ return ostream_precis(f);} long get_precis( ostream_precis pf) { return pf.f->precision();} long set_precis( ostream_precis pf, long l) { return pf.f->precision(l);} class ostream_seekp { public: ostream_seekp(ostream * ff) :f(ff) {} ostream * f; operator long () const {return f->tellp();} }; class istream_seekg { public: istream_seekg(istream * ff) :f(ff) {} istream * f; operator long () const {return f->tellg();} }; ostream_seekp ff_oseekp(ostream **f){ return ostream_seekp(*f);} ostream_seekp ff_oseekp(ostream *f){ return ostream_seekp(f);} istream_seekg ff_iseekg(istream **f){ return istream_seekg(*f);} istream_seekg ff_iseekg(istream *f){ return istream_seekg(f);} long ffseekp( ostream_seekp pf, long l) { pf.f->clear();long ll= pf.f->tellp(); return pf.f->seekp(l),ll;} long fftellp( ostream_seekp pf) { pf.f->clear(); return pf.f->tellp() ;} long ffseekg( istream_seekg pf, long l) { pf.f->clear(); return pf.f->seekg(l),l;} long fftellg( istream_seekg pf) { return pf.f->tellg() ;} class istream_good { public: istream_good(istream * ff) :f(ff) {} istream * f; operator bool () const {return f->good();} }; inline istream_good to_istream_good(istream **f){ return istream_good(*f);} inline istream_good to_istream_good(istream *f){ return istream_good(f);} inline long get_good( istream_good pf) { return pf.f->good();} inline bool get_eof(istream ** p){ return (**p).eof();} typedef ios_base& ( * ostream_manipulateur )(ios_base&); ios_base& default1(ios_base& f) { f.flags( (ios_base::fmtflags) 0 ) ; // (/*ios_base::scientific | */ios_base::fixed) ); return f; } template< ostream_manipulateur pf> inline ostream **set_os(ostream **f) { **f << pf ; return f; } inline ostream **set_os_flush(ostream **f) { (**f).flush() ; return f; } inline ostream *set_os_flush(ostream *f) { (*f).flush() ; return f; } template< ostream_manipulateur pf> inline ostream *set_os1(ostream *f) { *f << pf ; return f; } template class OneOperator_0 : public OneOperator { class E_F0_F :public E_F0mps { public: typedef R (*func)( ) ; func f; E_F0_F(func ff) : f(ff) {} AnyType operator()(Stack ) const {return SetAny( f()) ;} operator aType () const { return atype();} }; typedef R (*func)() ; func f; public: E_F0 * code(const basicAC_F0 & ) const { return new E_F0_F(f);} OneOperator_0(func ff): OneOperator(map_type[typeid(R).name()]),f(ff){} }; void init_by_array(unsigned long init_key[], int key_length); long genrand_int32(void); void init_genrand(unsigned long); long genrandint (long s) { init_genrand( (unsigned long ) s); return 0;} long genrandint32 () {return (long) genrand_int32();} template struct MIMul { static bool MeshIndependent(Expression a,Expression b) { bool mia= a->MeshIndependent() ; bool mib= b->MeshIndependent(); if ( mia && mib) return true; else { if (mia && a->EvaluableWithOutStack() ) { A va = GetAny((*a)(NullStack)); // cout << " va = " << va << endl; if ( va == A() ) { // cout << " va = " << va << endl; return true; } } if (mib && b->EvaluableWithOutStack() ) { B vb = GetAny((*b)(NullStack)); // cout << " vb = " << vb << endl; if ( vb == B() ) { //cout << " vb = " << vb << endl; return true; } } return false; } } static bool ReadOnly() { return RO;} }; // add frev 2007 class TransE_Array: public E_F0 { public: const E_Array * v; int size() const {return v->size();} size_t nbitem() const {return v->size();} bool MeshIndependent(){return v->MeshIndependent();} TransE_Array(const E_Array * e): v(e) {ffassert(e);} AnyType operator()(Stack s) const {ffassert(0);return 0L;} }; // add frev 2007 class opTrans : public OneOperator{ public: AnyType operator()(Stack s) const {ffassert(0);return 0L;} opTrans(): OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new TransE_Array(dynamic_cast((Expression) args[0])); } }; /* class opTTrans : public OneOperator{ public: AnyType operator()(Stack s) const {ffassert(0);return 0L;} opTTrans(): OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return dynamic_cast((Expression) args[0])->v; } }; */ class opDot : public OneOperator{ public: AnyType operator()(Stack s) const {ffassert(0);return 0L;} bool MeshIndependent() const { return false;} opDot(aType A, aType B): OneOperator(atype(),A,B) {} opDot(): OneOperator(atype(),atype(),atype() ) {} E_F0 * code(const basicAC_F0 & ) const {ffassert(0);} C_F0 code2(const basicAC_F0 &args) const; }; class opColumn : public OneOperator{ public: AnyType operator()(Stack s) const {ffassert(0);return 0L;} bool MeshIndependent() const { return false;} opColumn(aType A, aType B): OneOperator(atype(),A,B) {if( A== basicForEachType::type_C_F0)pref=-100;} opColumn(aType A): OneOperator(atype(),ArrayOfaType(A,true)) {pref=-100;} // opColumn(): OneOperator(atype(),atype(),atype() ) {} E_F0 * code(const basicAC_F0 & ) const {ffassert(0);} C_F0 code2(const basicAC_F0 &args) const; }; class opSum : public OneOperator{ public: const char * op; AnyType operator()(Stack s) const {ffassert(0);return 0L;} bool MeshIndependent() const { return false;} opSum(const char *opp,aType A, aType B): OneOperator(atype(),A,B),op(opp) {} E_F0 * code(const basicAC_F0 & ) const {ffassert(0);} C_F0 code2(const basicAC_F0 &args) const; }; /* class opArray : public OneOperator{ public: const char * op; AnyType operator()(Stack s) const {ffassert(0);return 0L;} bool MeshIndependent() const { return false;} opSum(const char *opp,aType A, aType B): OneOperator(atype(),A,B),op(opp) {} E_F0 * code(const basicAC_F0 & ) const {ffassert(0);} C_F0 code2(const basicAC_F0 &args) const; }; */ class opFormal : public OneOperator{ public: AnyType operator()(Stack s) const {ffassert(0);return 0L;} bool MeshIndependent() const { return false;} C_F0 (*thecode2)(const basicAC_F0 &args); opFormal(aType A,C_F0 (c2)(const basicAC_F0 &args) ): OneOperator(atype(),A),thecode2(c2) {} E_F0 * code(const basicAC_F0 & ) const {ffassert(0);} C_F0 code2(const basicAC_F0 &args) const { return (*thecode2)(args);} }; // fin frev 2007 // nov 2007 v[i] class opVI : public OneOperator{ public: AnyType operator()(Stack s) const {ffassert(0);return 0L;} bool MeshIndependent() const { return false;} opVI(aType A): OneOperator(atype(),A,atype()) {} E_F0 * code(const basicAC_F0 & ) const {ffassert(0);} C_F0 code2(const basicAC_F0 &args) const; }; // fin nov 2007 // add 2010 feb. FH C_F0 TryConj(const C_F0 & c) { // here put the conj operator ... ArrayOfaType at(c.left()); basicAC_F0_wa p(c); const OneOperator * ff=TheOperators->Find("\'",at); if (ff) { if(verbosity>10) cout << " ( do Conj) " ; return ff->code2(p); } return c; } // fin add 2010 feb. // avril 2007 C_F0 formalMatCofactor(const basicAC_F0 &args) { bool ta =args[0].left()==atype(); const TransE_Array * tea=0; const E_Array * ea=0; if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); assert( ea || tea ); const E_Array & a= ta ? *tea->v : *ea; int ma =1; int na=a.size(); if(na <1 ) CompileError(" Cofactor ([ ...]) "); bool maa= a[0].left()==atype(); if(maa) { ma= a[0].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" a matrix with variable number of columm"); } int na1=na,ma1=ma; if(ta) RNM::Exchange(na1,ma1); if(na1 != ma1) CompileError(" CoFactor: no square matrix "); if(na1 > 3 || ( na1 <1) ) CompileError(" CoFactor: square matrix size is more then 3 "); KNM A(na1,na1); KNM C(na1,na1); if(maa) for (int i=0;i(a[i].LeftValue()); ffassert(li); for (int j=0; j(); const TransE_Array * tea=0; const E_Array * ea=0; if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); assert( ea || tea ); const E_Array & a= ta ? *tea->v : *ea; int ma =1; int na=a.size(); if(na <1 ) CompileError(" trace [ ...] "); bool maa= a[0].left()==atype(); if(maa) { ma= a[0].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" first matrix with variable number of columm"); } int na1=na,ma1=ma; if(ta) RNM::Exchange(na1,ma1); if(na1 != ma1) CompileError(" trace: no square matrix "); KNM A(na1,ma1); if(maa) for (int i=0;i(a[i].LeftValue()); ffassert(li); for (int j=0; j(); const TransE_Array * tea=0; const E_Array * ea=0; if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); assert( ea || tea ); const E_Array & a= ta ? *tea->v : *ea; int ma =1; int na=a.size(); if(na <1 ) CompileError(" trace [ ...] "); bool maa= a[0].left()==atype(); if(maa) { ma= a[0].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" matrix with variable number of columm"); } int na1=na,ma1=ma; if(ta) RNM::Exchange(na1,ma1); if(na1 != ma1) CompileError(" trace: no square matrix "); KNM A(na1,ma1); if(maa) for (int i=0;i(a[i].LeftValue()); ffassert(li); for (int j=0; j struct evalE_mul { static AnyType eval(Stack s,const E_F0 * ab,const E_F0 * a,const E_F0 * b, bool & meshidenp) { A aa = GetAny((*a)(s)) ; B bb = GetAny((*b)(s)) ; R rr(aa*bb); bool mia=a->MeshIndependent(); bool mib=b->MeshIndependent(); if (( aa == A()) && mia ) meshidenp=true; else if(( bb == B()) && mib ) meshidenp=true; else meshidenp = mib && mia; cout << " meshidenp ??? " << meshidenp << " " << rr << endl; return SetAny(static_cast(rr)); } }; istream *Getline(istream * f, string ** s) { if( *s==0) *s=new string; getline(*f,**s); size_t l = (**s).length(); if( l > 0 && ((**s)[l-1]=='\r')) (**s).resize(l-1); // return f; } // Fin Add ne marche pas .... // fiun avril 2007 // Hack to Bypass a bug in freefem FH ... template<> class ForEachType: public basicForEachType{public:// correction july 2009..... FH Hoooo.... (Il y a un bug DUR DUR FH ...) ForEachType(Function1 iv=0,Function1 id=0,Function1 OOnReturn=0):basicForEachType(typeid(void *),sizeof(void *),0,0,iv,id,OOnReturn) { } }; inline double walltime(){ #ifdef HAVE_GETTIMEOFDAY struct timeval currentWallTime; double msecTime; gettimeofday(¤tWallTime, NULL); //time with milliseconds msecTime = ( currentWallTime.tv_sec*1000. + currentWallTime.tv_usec/1000. )/1000.0; // return time with milliseconds return msecTime; #else // add for Pichon mars 2010 time_t currentWallTime; time(¤tWallTime); return (double)currentWallTime; #endif } inline long fftime() { #ifdef HAVE_GETTIMEOFDAY time_t tloc; return time(&tloc); #endif return -1; } long atoi(string* p) {return atoi(p->c_str());}// add march 2010 double atof(string* p) {return atof(p->c_str());}// add march 2010 double NaN(string* p) { return nan(p->c_str());}// add march 2012 double NaN() {return nan("");}// add march 2012 int ShowAlloc(const char *s,size_t & lg); long ShowAlloc1(string * s,long * np) { size_t lg; long n= ShowAlloc(s->c_str(),lg); *np=lg; return n;} long ShowAlloc1(string * s) { size_t lg; long n= ShowAlloc(s->c_str(),lg); return n;} void Init_map_type() { TheOperators=new Polymorphic(), TheRightOperators=new Polymorphic(); // cout << sizeof(string) << endl; map_type[typeid(AnyType).name()] = new ForTypeAnyType(); map_type[typeid(void).name()] = new ForTypeVoid(); Dcl_Type(0); Dcl_TypeandPtr(0,0,::InitializeDef,0); Dcl_TypeandPtr(0,0,::InitializeDef,0); Dcl_TypeandPtr(0,0,::InitializeDef,0); Dcl_TypeandPtr(0,0,::InitializeDef,0); Dcl_Type(); // add FH ... for mpi comm world Dcl_Type(); Dcl_Type(); Dcl_Type(); Dcl_TypeandPtr(0,0,::InitializePtr,::DeletePtr); Dcl_TypeandPtr(0,0,::InitializePtr,::DeletePtr); Dcl_TypeandPtr(0,0,::InitializePtr,::DeletePtr); Dcl_Type< ostream_precis > (); Dcl_Type< ostream_seekp > (); Dcl_Type< istream_seekg > (); Dcl_Type< istream_good > (); Dcl_Type< NothingType > (); Dcl_Type(); // Dcl_Type(); basicForEachType::type_C_F0 = map_type[typeid(C_F0).name()] = new TypeLineFunction; Dcl_Type(); Dcl_Type();// add Dcl_Type(); Dcl_Type(); Dcl_Type(); Dcl_Type >(); initArrayDCLlong(); initArrayDCLdouble(); initArrayDCLComplex(); Dcl_Type(); // les types des variables zzzfff->Add("real",typevarreal=atype()); zzzfff->Add("int",atype()); zzzfff->Add("complex",typevarcomplex=atype()); zzzfff->Add("bool",atype()); zzzfff->Add("string",atype()); zzzfff->Add("ifstream",atype()); zzzfff->Add("ofstream",atype()); zzzfff->AddF("func",atype()); // end of know types map_type[typeid(bool).name()]->AddCast( new E_F1_funcT(UnRef), new E_F1_funcT(Cast), new E_F1_funcT(Cast) ); map_type[typeid(long).name()]->AddCast( new E_F1_funcT(UnRef), new E_F1_funcT(Cast), new E_F1_funcT(Cast), new E_F1_funcT(Cast), new E_F1_funcT(Cast), new E_F1_funcT(Cast) ); map_type[typeid(double).name()]->AddCast( new E_F1_funcT(UnRef), new E_F1_funcT(Cast), new E_F1_funcT(Cast) ); map_type[typeid(Complex).name()]->AddCast( new E_F1_funcT(UnRef), new E_F1_funcT(Cast), new E_F1_funcT(Cast) ); map_type[typeid(string*).name()]->AddCast( new E_F1_funcT(UnRefCopyPtr), new E_F1_funcT(FCast), new E_F1_funcT(FCast), new E_F1_funcT(FCast), new E_F1_funcT(FCast) ); // a changer --------------- modif map_type[typeid(string*).name()]->AddCast( new E_F1_funcT(FCast), new E_F1_funcT(FCast) ); map_type[typeid(long).name()]->AddCast(new OneOperator_border_label); Global.New("verbosity",CPValue(verbosity)); Global.New("searchMethod",CPValue(searchMethod)); //pichon Global.New("cout",CConstant(&cout)); Global.New("cerr",CConstant(&cerr));// add jan 2014 FH. Global.New("cin",CConstant(&cin)); Global.New("append",CConstant(ios::app)); Global.New("binary",CConstant(ios::binary)); // add FH april 2014 TheOperators->Add("|",new OneBinaryOperator >); // add FH april 2014 Global.New("endl",CConstant("\n")); Global.New("true",CConstant(true)); Global.New("false",CConstant(false)); Global.New("pi",CConstant(3.14159265358979323846264338328)); Global.New("version",CConstant(VersionNumber())); Global.New("CPUTime",CConstant(&showCPU)); // def de Zero et One pZero = new C_F0(CConstant(0.0)); pOne = new C_F0(CConstant(1.0)); pminusOne = new C_F0(CConstant(-1.0)); TheOperators->Add(":", new OneOperatorConst(new EConstant(':')), new OneBinaryOperator, new OneTernaryOperator3); TheOperators->Add("+", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > , new OneBinaryOperator_st > // a changer to do FH string * mars 2006 ); TheOperators->Add("-", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > ); TheOperators->Add("*", new OneBinaryOperator,OneBinaryOperatorMI,evalE_mul >, new OneBinaryOperator,MIMul,evalE_mul >, new OneBinaryOperator, MIMul,evalE_mul >, new OneBinaryOperator,MIMul,evalE_mul >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > ); TheOperators->Add("/", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > ); TheOperators->Add("%", new OneBinaryOperator > ); TheOperators->Add("+", new OneUnaryOperator >, new OneUnaryOperator >, new OneUnaryOperator >); TheOperators->Add("-", new OneUnaryOperator >, new OneUnaryOperator >, new OneUnaryOperator >); TheOperators->Add("^", new OneBinaryOperator >, // new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, // new OneBinaryOperator >, // new OneBinaryOperator >, new OneBinaryOperator > ); TheOperators->Add("<", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // FH string * mars 2006 ); TheOperators->Add("<=", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // FH string * mars 2006 ); TheOperators->Add(">", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // string * mars 2006 ); TheOperators->Add(">=", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // FH string * mars 2006 ); TheOperators->Add("==", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // FH string * mars 2006 ); TheOperators->Add("!=", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // FH string * mars 2006 ); TheOperators->Add("!", new OneUnaryOperator > ); TheOperators->Add("&&", new OneBinaryOperator ); TheOperators->Add("&", new OneBinaryOperator ); TheOperators->Add("||", new OneBinaryOperator ); TheOperators->Add("|", new OneBinaryOperator ); // Unary_Op_Comparaision TheOperators->Add("=", new OneBinaryOperator ,OneBinaryOperatorMIWO >, new OneBinaryOperator ,OneBinaryOperatorMIWO>, new OneBinaryOperator ,OneBinaryOperatorMIWO>, new OneBinaryOperator ,OneBinaryOperatorMIWO>, new OneBinaryOperator ,OneBinaryOperatorMIWO> // FH string * mars 2006 ); TheOperators->Add("?:", new Operator_Aritm_If, new Operator_Aritm_If, new Operator_Aritm_If, new Operator_Aritm_If, new Operator_Aritm_If // (OK???) to do FH string * mars 2006 ); /* ArrayOperator(); ArrayOperator(); ArrayOperator(); */ // initArrayOperators() ; initArrayOperatorlong(); initArrayOperatordouble(); initArrayOperatorComplex(); initStringOperator(); TheOperators->Add("+=", new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO > ); TheOperators->Add("-=", new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO > ); TheOperators->Add("*=", new OneBinaryOperator ,OneBinaryOperatorMIWO>, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO > ); TheOperators->Add("/=", new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO > ); TheOperators->Add("+", // new OneBinaryOperator >, new AddBorderOperator ); // add frev 2007 TheOperators->Add("\'", new opTrans); // TheOperators->Add("\'", new opTTrans); TheOperators->Add("*",new opDot(atype(),atype() ) ); // a faire mais dur TheOperators->Add("*",new opDot(atype(),atype() ) ); // a faire mais dur TheOperators->Add("*",new opColumn(atype() ) ); // [ ]* C_F0 (all) TheOperators->Add("*",new opColumn(basicForEachType::type_C_F0,atype() ) ); // [ ]* C_F0 (all) TheOperators->Add("*",new opColumn(basicForEachType::type_C_F0,atype() ) ); // [ ]* C_F0 (all) // type_C_F0 TheOperators->Add("::",new opColumn(atype(),atype() ) ); // a faire mais dur TheOperators->Add("*",new opDot(atype(),atype() ) ); // a faire mais dur TheOperators->Add("*",new opDot(atype(),atype() ) ); // a faire mais dur // car le type de retour depent des objets du tableau atype()->Add("[","",new opVI(atype()) ); atype()->Add("[","",new opVI(atype()) ); TheOperators->Add("+",new opSum("+",atype(),atype() ) ); // a faire mais dur TheOperators->Add("+",new opSum("+",atype(),atype() ) ); // a faire mais dur TheOperators->Add("+",new opSum("+",atype(),atype() ) ); // a faire mais dur TheOperators->Add("+",new opSum("+",atype(),atype() ) ); // a faire mais dur TheOperators->Add("-",new opSum("-",atype(),atype() ) ); // a faire mais dur TheOperators->Add("-",new opSum("-",atype(),atype() ) ); // a faire mais dur TheOperators->Add("-",new opSum("-",atype(),atype() ) ); // a faire mais dur TheOperators->Add("-",new opSum("-",atype(),atype() ) ); // a faire mais dur TheOperators->Add(".*",new opSum("*",atype(),atype() ) ); // a faire mais dur TheOperators->Add(".*",new opSum("*",atype(),atype() ) ); // a faire mais dur TheOperators->Add(".*",new opSum("*",atype(),atype() ) ); // a faire mais dur TheOperators->Add(".*",new opSum("*",atype(),atype() ) ); // a faire mais dur TheOperators->Add("./",new opSum("/",atype(),atype() ) ); // a faire mais dur TheOperators->Add("./",new opSum("/",atype(),atype() ) ); // a faire mais dur TheOperators->Add("./",new opSum("/",atype(),atype() ) ); // a faire mais dur // correct in sept. 2009 TheOperators->Add("./",new opSum("/",atype(),atype() ) ); // a faire mais dur // il faut refechir ..... FH // il faut definir le type d'un tableau bof, bof (atype()) TheOperators->Add(">>", new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO >, new OneBinaryOperator,OneBinaryOperatorMIWO > ); TheOperators->Add("<<", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator > // FH string * mars 2006 ); TheRightOperators->Add("++", new OneOperator1 >(&RIncremantation)); TheRightOperators->Add("--", new OneOperator1 >(&RDecremantation)); TheOperators->Add("++", new OneOperator1 >(&LIncremantation)); TheOperators->Add("--", new OneOperator1 >(&LDecremantation)); // init TheOperators->Add("<-", new OneOperator2(&set_copyp_new), // FH string * mars 2006 new OneOperator2_(&set_copyp), // new OneOperator2_(&set_copyp), new OneOperator2_(&set_copyp), // mars 2006 new OneOperator2_(&set_copy), // new OneOperator2_(&set_copy_new), // new OneOperator2_(&set_copy_new), // new OneUnaryOperator >, // new OneUnaryOperator >, new OneBinaryOperator >, // FH string * mars 2006 new OneBinaryOperator >, // FH string * mars 2006 new OneTernaryOperator3 > , // FH string * mars 2006 new OneTernaryOperator3 > // FH string * april 2014 ); atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); // Add("<-","(", new OneUnaryOperator >); Add("<-","(", new OneUnaryOperator >); // FH string * mars 2006 // Polymorphic * precis =new Polymorphic(); // Add("precision",".",precis); Add("precision",".",new OneOperator1(ostream_precision)); Add("precision",".",new OneOperator1(ostream_precision)); // add FH jan 2010 ... Add("seekp",".",new OneOperator1(ff_oseekp)); Add("seekp",".",new OneOperator1(ff_oseekp)); Add("seekg",".",new OneOperator1(ff_iseekg)); Add("seekg",".",new OneOperator1(ff_iseekg)); Add("tellp",".",new OneOperator1(ff_oseekp)); Add("tellp",".",new OneOperator1(ff_oseekp)); Add("tellg",".",new OneOperator1(ff_iseekg)); Add("tellg",".",new OneOperator1(ff_iseekg)); // Add("(","",new OneOperator1(fftellp), // new OneOperator2(ffseekp)); Add("(","",new OneOperator1(fftellp), new OneOperator2(ffseekp)); Add("(","",new OneOperator1(fftellg), new OneOperator2(ffseekg)); // end add jan 2010 .. Add("(","",new OneOperator1(get_precis), new OneOperator2(set_precis)); // add v 1.41 Add("good",".",new OneOperator1(to_istream_good)); Add("good",".",new OneOperator1(to_istream_good)); Add("good",".",new OneOperator1(to_istream_good)); Add("(","",new OneOperator1(get_good)); Add("eof",".",new OneOperator1(get_eof)); // add v 2.8 Add("scientific",".",new OneOperator1(set_os)); Add("fixed",".",new OneOperator1(set_os)); Add("showbase",".",new OneOperator1(set_os)); Add("noshowbase",".",new OneOperator1(set_os)); Add("showpos",".",new OneOperator1(set_os)); Add("noshowpos",".",new OneOperator1(set_os)); Add("default",".",new OneOperator1(set_os)); Add("flush",".",new OneOperator1(set_os_flush));// ADD may 2010 Add("scientific",".",new OneOperator1(set_os1)); Add("fixed",".",new OneOperator1(set_os1)); Add("showbase",".",new OneOperator1(set_os1)); Add("noshowbase",".",new OneOperator1(set_os1)); Add("showpos",".",new OneOperator1(set_os1)); Add("noshowpos",".",new OneOperator1(set_os1)); Add("default",".",new OneOperator1(set_os1)); Add("flush",".",new OneOperator1(set_os_flush));// ADD may 2010 Global.Add("getline","(",new OneOperator2(Getline)); // add 2.16 Global.Add("trace","(",new opFormal(atype(),formalMatTrace )); Global.Add("det","(",new opFormal(atype(),formalMatDet )); // end add // add 3.20 Global.Add("Cofactor","(",new opFormal(atype(),formalMatCofactor )); TheOperators->Add("[]",new OneOperator_array ); TheOperators->Add("[border]",new OneOperator_border ); Global.Add("cos","(",new OneOperator1(cos)); // Global.Add("square","(",new OneOperator1_(Square)); Global.Add("square","(",new OneOperator1 >(Square));// add FH Mai 2011 Global.Add("square","(",new OneOperator1 >(Square)); Global.Add("square","(",new OneOperator1 >(Square));// add FH Mai 2011 //add for Olivier FH July 2014 Global.Add("sqr","(",new OneOperator1 >(Square));// Global.Add("sqr","(",new OneOperator1 >(Square)); Global.Add("sqr","(",new OneOperator1 >(Square));// Global.Add("round","(",new OneOperator1(round)); // add june 2007 Global.Add("lround","(",new OneOperator1(lround)); // add june 2007 Global.Add("floor","(",new OneOperator1(floor)); // add march 2006 Global.Add("ceil","(",new OneOperator1(ceil)); // add march 2006 Global.Add("rint","(",new OneOperator1(rint)); // add june 2006 Global.Add("lrint","(",new OneOperator1(lrint)); // add mars 2014 Global.Add("sin","(",new OneOperator1(sin)); Global.Add("tan","(",new OneOperator1(tan)); Global.Add("atan","(",new OneOperator1(atan)); Global.Add("sinh","(",new OneOperator1(sinh)); Global.Add("cosh","(",new OneOperator1(cosh)); Global.Add("tanh","(",new OneOperator1(tanh)); Global.Add("atoi","(",new OneOperator1(atoi));// add march 2010 Global.Add("atof","(",new OneOperator1(atof));// add march 2010 #ifdef HAVE_ATANH Global.Add("atanh","(",new OneOperator1(atanh)); #endif Global.Add("asin","(",new OneOperator1(asin)); Global.Add("acos","(",new OneOperator1(acos)); #ifdef HAVE_ASINH Global.Add("asinh","(",new OneOperator1(asinh)); #endif #ifdef HAVE_ACOSH Global.Add("acosh","(",new OneOperator1(acosh)); #endif #ifdef HAVE_ERFC Global.Add("erf","(",new OneOperator1(erf)); Global.Add("erfc","(",new OneOperator1(erfc)); #endif #ifdef HAVE_TGAMMA Global.Add("tgamma","(",new OneOperator1(tgamma)); Global.Add("lgamma","(",new OneOperator1(lgamma)); #endif // function de bessel j0, j1, jn, y0, y1, yn -- bessel functions of first and second kind #ifdef HAVE_JN Global.Add("j0","(",new OneOperator1(j0)); Global.Add("j1","(",new OneOperator1(j1)); Global.Add("jn","(",new OneOperator2(myjn)); Global.Add("y0","(",new OneOperator1(y0)); Global.Add("y1","(",new OneOperator1(y1)); Global.Add("yn","(",new OneOperator2(myyn)); #endif Global.Add("exp","(",new OneOperator1(exp)); Global.Add("log","(",new OneOperator1(log)); Global.Add("log10","(",new OneOperator1(log10)); Global.Add("pow","(",new OneOperator2(pow)); // Global.Add("pow","(",new OneOperator2(pow)); Global.Add("max","(",new OneOperator2_(Max )); Global.Add("min","(",new OneOperator2_(Min )); Global.Add("max","(",new OneOperator2_(Max)); Global.Add("min","(",new OneOperator2_(Min)); Global.Add("atan2","(",new OneOperator2(atan2)); Global.Add("hypot","(",new OneOperator2(hypot));// add Jan 2014 Global.Add("atan","(",new OneOperator2(atan2)); Global.Add("sqrt","(",new OneOperator1(sqrt,2)); Global.Add("abs","(",new OneOperator1(Abs)); Global.Add("abs","(",new OneOperator1(Abs)); Global.Add("cos","(",new OneOperator1_(cos)); Global.Add("sin","(",new OneOperator1_(sin)); Global.Add("sinh","(",new OneOperator1_(sinh)); Global.Add("cosh","(",new OneOperator1_(cosh)); Global.Add("log","(",new OneOperator1_(log)); // Global.Add("log10","(",new OneOperator1_(log10)); Global.Add("tan","(",new OneOperator1_(tan)); Global.Add("exp","(",new OneOperator1_(exp)); //Complex (* powcc )( const Complex &, const Complex &) =pow; Global.Add("pow","(",new OneBinaryOperator >); //new OneOperator2_(pow )); Global.Add("sqrt","(",new OneOperator1_(sqrt,0)); Global.Add("conj","(",new OneOperator1_(conj,0)); Global.Add("conj","(",new OneOperator1_(RNM::conj,1)); TheOperators->Add("\'",new OneOperator1_(conj,0)); TheOperators->Add("\'",new OneOperator1_(RNM::conj,1)); // add F. Feb 2010 of conj of varf.. Global.Add("imag","(",new OneOperator1_(Imag)); // Big probleme real is a type Add("<--","(",new OneOperator1_(Real)); // Global.Add("real","(",new OneOperator1_(Real)); // Add(typevarreal->right()->name(),".",new OneOperator1_(Real)); // Global.Add(typevarreal->right()->name(),".",new OneOperator1_(Real)); // Add(typevarreal->left()->name(),".",new OneOperator1_(preal)); Global.Add("abs","(",new OneOperator1_(abs)); Global.Add("arg","(",new OneOperator1_(arg)); Global.Add("norm","(",new OneOperator1_(norm)); Global.Add("exit","(",new OneOperator1(Exit)); Global.Add("assert","(",new OneOperator1(Assert)); Global.Add("clock","(",new OneOperator0(CPUtime)); Global.Add("time","(",new OneOperator0(walltime));// add mars 2010 for Pichon. Global.Add("ltime","(",new OneOperator0(fftime));// add mars 2014 ( the times unix fonction) Global.Add("storageused","(",new OneOperator0(storageused)); Global.Add("storagetotal","(",new OneOperator0(storagetotal)); Global.Add("dumptable","(",new OneOperator1(dumptable)); Global.Add("exec","(",new OneOperator1(exec)); //FH string * mars 2006 Global.Add("system","(",new OneOperator1(exec)); //FH string fevr 2011 Global.Add("polar","(",new OneOperator2_(polar)); // rand generator --- unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; init_by_array(init, length); extern long genrand_int31(void); extern double genrand_real1(void); extern double genrand_real2(void); extern double genrand_real3(void); extern double genrand_res53(void) ; Global.Add("randint32","(",new OneOperator_0(genrandint32)); Global.Add("randint31","(",new OneOperator_0(genrand_int31)); Global.Add("randreal1","(",new OneOperator_0(genrand_real1)); Global.Add("randreal2","(",new OneOperator_0(genrand_real2)); Global.Add("randreal3","(",new OneOperator_0(genrand_real3)); Global.Add("randres53","(",new OneOperator_0(genrand_res53)); Global.Add("randinit","(",new OneOperator1(genrandint)); // NaN and Inf Global.Add("ShowAlloc","(",new OneOperator1(ShowAlloc1));// debuging Global.Add("ShowAlloc","(",new OneOperator2(ShowAlloc1));// debuging Global.Add("NaN","(",new OneOperator0(NaN)); Global.Add("NaN","(",new OneOperator1(NaN)); Global.Add("isNaN","(",new OneOperator1(isNaN)); Global.Add("isInf","(",new OneOperator1(isInf)); Global.Add("isNormal","(",new OneOperator1(isNormal)); typedef MyMap MyMapSS; map_type[typeid(MyMapSS*).name()] = new ForEachType(Initialize,Delete) ; //Dcl_TypeandPtr_ ,KN* > (0,0,0,::Destroy >, ::ClearReturnKK_,KN_ >,::ClearReturnpKK >); // map_type[typeid(KN2String*).name()] = new ForEachType(Initialize,Delete) ; map_type_of_map[make_pair(atype(),atype())]=atype(); atype()->Add("[","",new OneOperator2_(get_elements)); tables_of_identifier.push_back(&Global); } //int ShowAlloc(const char *s,size_t & lg); void ClearMem() { size_t lg; ShowAlloc("ClearMem: begin" , lg); delete pZero; delete pOne; delete pminusOne; tables_of_identifier.clear(); for (map::iterator i=map_type.begin();i!=map_type.end();++i) delete i->second; map_type.clear(); map_type_of_map.clear(); map_pair_of_type.clear(); Global.clear(); if(TheOperators) TheOperators->clear(); if(TheRightOperators) TheRightOperators->clear(); CodeAlloc::clear(); ShowAlloc("ClearMem: end" , lg); } static addingInitFunct TheaddingInitFunct(-10000,Init_map_type); C_F0 opVI::code2(const basicAC_F0 &args) const { Expression p=args[1]; if ( ! p->EvaluableWithOutStack() ) { bool bb=p->EvaluableWithOutStack(); //cout << bb << " " << * p << endl; CompileError(" [...][p], The p must be a constant , sorry"); } int pv = GetAny((*p)(NullStack)); bool ta =args[0].left()==atype(); const TransE_Array * tea=0; const E_Array * ea=0; if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); assert( ea || tea ); const E_Array & a= ta ? *tea->v : *ea; // cout << " pv =" << pv << " size = "<< a.size() << endl; //ffassert(pv >=0 && pv (a[i].LeftValue()); ffassert(li && (li->size() >pv)); const C_F0 vi = TryConj( (*li)[pv]); if(i==0) v=vi; else v+= vi; } return C_F0(TheOperators,"[]",v); } if(!(pv >=0 && pv (); bool tb = args[1].left()==atype(); const TransE_Array * tea=0; const TransE_Array * teb=0; const E_Array * ea=0; const E_Array * eb=0;// E_F0 if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); if( tb) teb = dynamic_cast((Expression) args[1]); else eb = dynamic_cast((Expression) args[1]); assert( ea || tea ); assert( eb || teb ); const E_Array & a= ta ? *tea->v : *ea; const E_Array & b= tb ? *teb->v : *eb; int ma =1; int mb =1; int na=a.size(); int nb=b.size(); if(na <1 && nb < 1) CompileError(" empty array [ ...]'*[ ... ] "); bool mab= b[0].left()==atype(); bool maa= a[0].left()==atype(); if(maa) { ma= a[0].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" first matrix with variable number of columm"); } if(mab) { mb= b[1].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" second matrix with variable number of columm"); } int na1=na,ma1=ma,nb1=nb,mb1=mb; if(ta) RNM::Exchange(na1,ma1); if(tb) RNM::Exchange(nb1,mb1); KNM A(na1,ma1), B(nb1,mb1); if ( A.M() != B.N()) { cout << " formal prod array or matrix : [ .. ] * [ .. ] " << endl; cout << " first array : matrix " << maa << " trans " << ta << " " << na << "x" << ma <(a[i].LeftValue()); ffassert(li); for (int j=0; j(b[i].LeftValue()); ffassert(li); for (int j=0; j C(na1,mb1); CC_F0 s,abi; for (int i=0;i(); bool tb = args[1].left()==atype(); const TransE_Array * tea=0; const TransE_Array * teb=0; const E_Array * ea=0; const E_Array * eb=0;// E_F0 if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); if( tb) teb = dynamic_cast((Expression) args[1]); else eb = dynamic_cast((Expression) args[1]); // ffassert( ea || tea ); if( (eb || teb) && ( ea || tea ) ) { const E_Array & a= ta ? *tea->v : *ea; const E_Array & b= tb ? *teb->v : *eb; int ma =1; int mb =1; int na=a.size(); int nb=b.size(); if(na <1 && nb < 1) CompileError(" empty array [ ...]':[ ... ] "); bool mab= b[0].left()==atype(); bool maa= a[0].left()==atype(); if(maa) { ma= a[0].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" first matrix with variable number of columm"); } if(mab) { mb= b[1].LeftValue()->nbitem(); for (int i=1;inbitem()) CompileError(" second matrix with variable number of columm"); } int na1=na,ma1=ma,nb1=nb,mb1=mb; if(ta) RNM::Exchange(na1,ma1); if(tb) RNM::Exchange(nb1,mb1); KNM A(na1,ma1), B(nb1,mb1); if ( (na1!=nb1 ) || (ma1 != mb1) || (na1 * ma1 ==0) ) { cout << "\n formal array or matrix : [ .. ] : [ .. ] " << endl; cout << " first array : matrix " << maa << " trans " << ta << " " << na << "x" << ma <(a[i].LeftValue()); ffassert(li); for (int j=0; j(b[i].LeftValue()); ffassert(li); for (int j=0; j C(na1,mb1); CC_F0 s,aibi; for (int i=0;i [ a0*b',a1*b', const E_Array & a= ta ? *tea->v : *ea; int na=a.size(); AC_F0 v; v = 0; // empty C_F0 b =ta ? TryConj(args[1]) :args[1]; for (int i=0;iv : *eb; int nb=b.size(); C_F0 a =tb ? TryConj(args[0]) :args[0]; AC_F0 v; v = 0; // empty for (int i=0;i(); bool tb = args[1].left()==atype(); const TransE_Array * tea=0; const TransE_Array * teb=0; const E_Array * ea=0; const E_Array * eb=0;// E_F0 if( ta) tea = dynamic_cast((Expression) args[0]); else ea = dynamic_cast((Expression) args[0]); if( tb) teb = dynamic_cast((Expression) args[1]); else eb = dynamic_cast((Expression) args[1]); assert( ea || tea ); assert( eb || teb ); const E_Array & a= ta ? *tea->v : *ea; const E_Array & b= tb ? *teb->v : *eb; int na=a.size(); int nb=b.size(); if(na != nb) CompileError(" formal [ [...] [] ] : [ [..], [..] , ... ] "); AC_F0 v; v = 0; // empty for (int i=0;i #include #include #include #include #include "error.hpp" #include #include #include #include #include #include #include #include #include extern bool showCPU; #include "RNM.hpp" #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif // #include #include "CodeAlloc.hpp" inline double CPUtime(){ #ifdef SYSTIMES struct tms buf; if (times(&buf)!=-1) return ((double)buf.tms_utime+(double)buf.tms_stime)/(long) sysconf(_SC_CLK_TCK); else #endif return ((double) clock())/CLOCKS_PER_SEC; } extern long verbosity; // level off printing extern long searchMethod; //pichon extern bool withrgraphique; using namespace std; #include "ffstack.hpp" #include "AnyType.hpp" #include "String.hpp" class basicForEachType; class E_F1_funcT_Type; class E_F0; // une instruction exec time class C_F0; // une instruction complie time class ListOfInst; class Polymorphic; class OneOperator; /// <> is used as the type of the local list contained in ListOfInst typedef E_F0 * Expression; class AC_F0; class basicAC_F0; typedef complex Complex; /// <> [[file:AnyType.hpp::aType]] [[E_F0]] typedef pair Type_Expr ;// to store the type and the expression 29042005 FH int FindType(const char * name) ; void lgerror (const char* s) ; void CompileError(string msg="",aType r=0); void ExecError(string msg=""); struct UnId { const char * id; aType r; Expression e; deque * array; // to store a array aType re; bool ref; // a ref or non UnId() :id(0),r(0),e(0),array(0),re(0),ref(false) {} UnId(const char * idd) :id(idd),r(0),e(0),array(0),re(0),ref(false) {} UnId(const char * idd,const C_F0 & ee,aType rr,bool reff) ; UnId(deque * d) : id(0),r(0),e(0),array(d?new deque(*d):0),re(0),ref(false) {} UnId(const UnId & u) : id(u.id),r(u.r),e(u.e), array(u.array?new deque(*u.array):0), re(u.re),ref(u.ref) {} // Modif 24032005 void operator= (const UnId & u) { id=u.id; r=u.r; e=u.e; re=u.re; ref=u.ref; if(array) delete array; array=0; if(u.array) array= new deque(*u.array); } ~UnId(){ if( array) delete array;} // Modif 24032005 }; /// <> typedef deque ListOfId; // xxx is a type so xxx can't be a parameter #define ATYPE(xxx) map_type[typeid(xxx).name()] /* #define NEW_TYPE(type) map_type[typeid(type).name()] = new ForEachType(0,0) //#define NEW_TYPE(type) map_type[typeid(type).name()] = new ForEachType() #define NEW_TYPE_I(type,i,d) map_type[typeid(type).name()] = new ForEachType(i,d) #define NEW_TYPE_Ptr(type) map_type[typeid(type*).name()] = new ForEachTypePtr() #define NEW_TYPE_PtrND(type) map_type[typeid(type*).name()] = new ForEachTypePtr(0) #define NEW_TYPE_PtrNIND(type) map_type[typeid(type*).name()] = new ForEachTypePtr(0,0) //#define NEW_TYPE_PtrI(type) map_type[typeid(type*).name()] = new ForEachTypePtr(Initialize) */ /// Doxygen doc extern Polymorphic * TheOperators, * TheRightOperators; // ------------- extern C_F0 *pOne,*pZero,*pminusOne; typedef AnyType (* Function1)(Stack, const AnyType &); typedef AnyType (* Function2)(Stack, const AnyType &,const AnyType &); typedef AnyType (* CFunction2)(Stack, E_F0 *, E_F0 *); typedef AnyType (* CFunction4)(Stack, E_F0 *, E_F0 *, E_F0 *, E_F0 *); Expression NewExpression(Function1,Expression); Expression NewExpression(Function2,Expression,Expression); inline Type_Expr make_Type_Expr(aType t, E_F0 * e) {return make_pair(t,e);} inline Type_Expr make_Type_Expr( E_F0 * e,aType t) {return make_pair(t,e);} struct Keyless : binary_function { typedef const char * Key; bool operator()(const Key& x, const Key& y) const { return strcmp(x,y)<0;} }; // <> class TableOfIdentifier: public CodeAlloc { public: struct Value; typedef const char * Key; typedef map maptype; typedef pair pKV; typedef maptype::iterator iterator; typedef maptype::const_iterator const_iterator; struct Value :public Type_Expr { pKV * next; // link all the variable in reverse order to call delete on each variable bool del; Value(const Type_Expr & vv,pKV * n,bool dd=true) : Type_Expr(vv),next(n),del(dd) {} Value(aType t,E_F0 *f,pKV *n,bool dd=true): Type_Expr(t,f),next(n),del(dd) {} };// to store the type and the expression pKV * listofvar; // struct Keyless : binary_function // { bool operator()(const Key& x, const Key& y) const{ return strcmp(x,y)<0;} }; maptype m; C_F0 Find(Key) const ; C_F0 Find(Key,const basicAC_F0 &) const ; const Type_Expr & New(Key k,const Type_Expr & v,bool del=true); void Add(Key k,Key op,OneOperator *p0,OneOperator *p1=0, OneOperator *p2=0,OneOperator *p3=0,OneOperator *p4=0, OneOperator *p5=0,OneOperator *p6=0) ; void clear(); template C_F0 NewVar(Key k,aType t,size_t & top,const C_F0 &i) ; template C_F0 NewVar(Key k,aType t,size_t & top,const basicAC_F0 &args) ; template C_F0 NewVar(Key k,aType t,size_t & top,const basicAC_F0 &args,const U & data) ; // C_F0 NewVar(Key k,aType t,size_t & top,const basicAC_F0 &args,const C_F0& f) ; template C_F0 NewVar(Key k,aType t,size_t & top) ; C_F0 NewID(aType t,Key k, C_F0 & c,size_t & top,bool del=true); C_F0 NewID(aType t,Key k, C_F0 & c,const ListOfId & l,size_t & top,bool del=true); template C_F0 NewFESpace(Key k,aType t,size_t & top,const basicAC_F0 &args); friend ostream & operator<<(ostream & f,const TableOfIdentifier & ); C_F0 destroy(); TableOfIdentifier() ; //: listofvar(0) {}; ~TableOfIdentifier(); // }; // <> for all the type of the language class basicForEachType : public CodeAlloc { const type_info * ktype; // the real type_info // const type_info *ktypefunc;// the type of code public: static basicForEachType * tnull; const size_t size; typedef OneOperator * CastFunc; typedef map::const_iterator const_cast_iterator; typedef const char * Key; // virtual void print(ostream &f,const void *p) const =0; friend ostream & operator<<(ostream & f,const basicForEachType & e) { f << '<' << e.name() << '>' ;return f;} void Show(ostream & f) const ; const char * name() const { return this!=tnull ? ktype->name() :"NULL" ;} virtual bool CastingFrom(const basicForEachType * t) const ; // modif FH ----- A TESTER // virtual bool SametypeRight(const basicForEachType * t) const {return (this == t) || (t == un_ptr_type) || (t == type_C_F0);} // virtual Type_Expr init(const Type_Expr & te) const { return Type_Expr(0,0);} virtual int TYPEOFID() const {return 0;} // bool SametypeLeft(const basicForEachType * t) const {return t == this;} // bool To(const basicForEachType * t) const { throwassert(t && this);return un_ptr_type == this ? t->un_ptr_type == this : t == this;} virtual C_F0 CastTo(const C_F0 & e) const ; virtual void SetArgs(const ListOfId *lid) const ;// { cout << "SetArgs::\n " ;throwassert(lid==0 || lid->size()==0);} aType right() const {return un_ptr_type;}; Expression RightValueExpr(Expression f) const; // Type_Expr NewVar(Key k,aType t,size_t & top,const C_F0 &i); virtual C_F0 Initialization(const Type_Expr & e) const ; virtual Expression Destroy(const C_F0 &) const ; virtual bool ExistDestroy() const {return destroy;} virtual Type_Expr SetParam(const C_F0 & c,const ListOfId * l,size_t & top) const; virtual Expression OnReturn(Expression f) const; // { return make_pair(this,c.left());} protected: basicForEachType(const type_info & k ,const size_t , const E_F1_funcT_Type * p=0,basicForEachType *rr=0, Function1 iv=0,Function1 id=0, Function1 dreturn=0) ; /* inline basicForEachType(const type_info & k ,const type_info & kf ,const size_t , const E_F1_funcT_Type * p=0,basicForEachType *rr=0, Function1 iv=0,Function1 id=0) ;*/ public: static const basicForEachType * type_C_F0; // for any type un formal operation .... FH add 09/2012 const basicForEachType * un_ptr_type; // type of right exp private: // map mapofcast; OneOperator * casting; // list of operator for casting to this type const E_F1_funcT_Type * un_ptr; // is ptr -> get value function Function1 DoOnReturn; // to call some thing on return. Function1 InitExp; // to init the ptr value Function1 destroy;// the destroy function TableOfIdentifier ti; // all polymorphisme of the Identifier public: // basicForEachType * FunctionType() const;// { return funct_type ? funct_type : (funct_type= new FuncForEachType(this));} C_F0 Find(const char * k) const; // {return ti->Find(k);} C_F0 Find(const char * k,const basicAC_F0 & args) const; // {return ti->Find(k);} void New(Key k,Type_Expr v,bool del=true){ti.New(k,v,del);} void Add(Key k,Key op,OneOperator *p0,OneOperator *p1=0, OneOperator *p2=0,OneOperator *p3=0,OneOperator *p4=0, OneOperator *p5=0,OneOperator *p6=0) {ti.Add(k,op,p0,p1,p2,p3,p4,p5,p6);} void AddCast(CastFunc f1,CastFunc f2=0,CastFunc f3=0,CastFunc f4=0, CastFunc f5=0,CastFunc f6=0,CastFunc f7=0,CastFunc f8=0); ostream & ShowTable(ostream & f) const { f << ti; return f;} // basicForEachType * funct_type; virtual ~basicForEachType(); }; template inline basicForEachType * atype() { map::iterator ir=map_type.find(typeid(T).name()); // basicForEachType * r=map_type[]; if (ir == map_type.end()) { cerr << "Error: aType '" << typeid(T).name() << "', doesn't exist\n"; ShowType(cerr); throw(ErrorExec("exit",1));} return ir->second;} // -------- //typedef basicForEachType TheType; // const basicForEachType * ktype; // compilation time // class for all exp // a left exp is a pointer expression // ------- // -- exec times le code is just E_F0*(fonction without args) class C_LF2; class C_LF1; // 3 types of function/expression 0,1,2 args /// <> is the base class for all expressions built by parsing an EDP script in the grammar of the FreeFem++ /// language (see lg.ypp). E_F0 pointers are typed as #Expression, stored as a list in [[ListOfInst]], and evaluated /// when CListOfInst::eval() [[file:AFunction.hpp::CListOfInst::eval]] is called (see \ref index). class E_F0 :public CodeAlloc { public: static E_F0 *tnull; struct kless : binary_function { bool operator()(const Expression& x, const Expression& y) const{ //cout << x << " " << y << x->compare(y) << " ::: "; int r1 = x->compare(y);// , r2 = y->compare(x); //assert(r1+r2==0); return r1<0;} }; typedef map< E_F0 *,int,kless> MapOfE_F0; virtual AnyType operator()(Stack) const =0; virtual bool Empty() const {return this==tnull; } // virtual E_F0 * destroy(Stack ) const {return 0;} // virtual const E_F0 * Parameter(Stack ) const {return this;} virtual size_t nbitem() const {return 1;} virtual bool EvaluableWithOutStack() const {return false;} // virtual bool MeshIndependent() const {return true;} // virtual bool Zero() const {return false;} // virtual E_F0 * right_E_F0() const { return 0;} virtual bool ReadOnly() const { return true;} // the expression do not change the memory virtual ~E_F0() {} virtual int compare (const E_F0 *t) const { int r= (t==this) ? 0 : ( ( this > &l,MapOfE_F0 & m, size_t & n) ; // build optimisation virtual AnyType operator()(Stack stack,AnyType *) const { return operator()(stack);} // call optim code virtual operator aType () const { assert(0);return 0;} // the type of the expression virtual ostream & dump(ostream &f) const { f << ' ' << typeid(*this).name() << ' ' << this << ' ' ;return f; } // for OPTIMIZATION int find(const MapOfE_F0 & m) ; int insert(Expression opt,deque > &l,MapOfE_F0 & m, size_t & n) ; // ajoute for optimisation to say if a expression in meshindep a exec time // to solve 0*x // question // juin 2007 FH virtual AnyType eval(Stack stack, bool & meshindep ) const { meshindep=MeshIndependent();return operator()(stack);} }; inline ostream & operator<<(ostream & f,const E_F0 &e) { if(!e.Empty()) e.dump(f); else f << " --0-- " ;return f;} /// <> Specialization of [[E_F0]] where MeshIndependent() always returns false instead of true. class E_F0mps : public E_F0 { public: virtual bool MeshIndependent() const {return false;} // }; class E_F0info : public E_F0 { public: // not a real expression just to pass information virtual bool EvaluableWithOutStack() const {return true;} // virtual bool MeshIndependent() const {return true;} // virtual AnyType operator()(Stack ) const { return SetAny(this);} operator aType () const { return atype();} }; class E_F1 : public CodeAlloc{ public: virtual AnyType operator()(Stack,AnyType &) const =0;}; class E_F2 : public CodeAlloc{ public: virtual AnyType operator()(Stack,AnyType &,AnyType &) const =0;}; class E_FN : public CodeAlloc{ public: virtual AnyType operator()(Stack,size_t N,...) const =0;}; // class to play with polymorphisme // --------------------------------- class basicAC_F0; class ArrayOfaType : public CodeAlloc{ // class for the type of parameter aType tt[11]; protected: int n; aType * t; // array of type bool ellipse; void operator=(const ArrayOfaType &); // no set operator public: // ArrayOfaType() :n(0),t(0),ellipse(false) {} explicit ArrayOfaType(bool ell=false) :n(0),t(0),ellipse(ell) {} explicit ArrayOfaType(const aType & a,bool ell=false) :n(1),t(tt),ellipse(ell) {t[0]=a;} explicit ArrayOfaType(const aType & a,const aType & b,bool ell=false) :n(2),t(tt),ellipse(ell) {t[0]=a,t[1]=b;} explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,bool ell=false) :n(3),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;} explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,bool ell=false) :n(4),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; /* cout << * a << *b << * c << * d << " ---------" << endl; */} explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,const aType & e,bool ell=false) :n(5),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; } explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,const aType & e,const aType & f,bool ell=false) :n(6),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; t[5]=f; } explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,const aType & e, const aType & f,const aType & g, bool ell=false) :n(7),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; t[5]=f; t[6]=g; } // (6 args) Added by Fabian Dortu explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,const aType & e, const aType & f,const aType & g,const aType & h, bool ell=false) :n(8),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; t[5]=f; t[6]=g; t[7]=h; } // (7 args) Added by Fabian Dortu explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,const aType & e, const aType & f,const aType & g,const aType & h, const aType & i, bool ell=false) :n(9),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; t[5]=f; t[6]=g; t[7]=h; t[8]=i; } // (8 args) Added by Fabian Dortu explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d, const aType & e, const aType & f,const aType & g,const aType & h, const aType & i, const aType & j, bool ell=false) :n(10),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; t[5]=f; t[6]=g; t[7]=h; t[8]=i; t[9]=j; } // (10 args) Added by Fabian Dortu explicit ArrayOfaType(const aType & a,const aType & b,const aType & c,const aType & d,const aType & e,const aType & f,const aType & g,const aType & h, const aType & i, const aType & j, const aType & k,bool ell=false) :n(11),t(tt),ellipse(ell) {t[0]=a,t[1]=b;t[2]=c;t[3]=d; t[4]=e; t[5]=f; t[6]=g; t[7]=h; t[8]=i; t[9]=j; t[10]=k; } // (10 args) Added by Fabian Dortu ArrayOfaType(const basicAC_F0 & ) ; ArrayOfaType(const ArrayOfaType & ); // ArrayOfaType(const ListOfId * l); ~ArrayOfaType() { if(t && t != tt) delete [] t;t=0;n=0;} bool WithOutCast( const ArrayOfaType & a) const ; bool WithCast( const ArrayOfaType & a,int nbcast=100000) const ; // return the number of cast // exactly comparaison bool operator==( const ArrayOfaType & a) const { if (a.n != n || a.ellipse !=ellipse) return false; for (int i=0;i> Base class for all language operators. Daughter classes have the same name with several extensions: /// "[1-9]" represent the number of operator arguments, "_" designates operators that take a reference instead of a /// copied argument, "s" designates operators that require a stack argument. class OneOperator : public ArrayOfaType { friend class MakeVectSpaceN; friend class basicForEachType; const basicForEachType * r; // return type OneOperator *next; // to make a list of OneOperator public: int pref; // to try to solve ambiguity for binary operator // 10 for bool, 20 for int , 30 for long , 40, for float, 50 double, 60 for complex, 70 string // string+ 1 => string // 1+string => string OneOperator(aType rr) ;// : r(rr),ArrayOfaType(),next(0),pref(0) {throwassert(r);} OneOperator(aType rr,aType a) ;//: r(rr),ArrayOfaType(a,false),next(0),pref(0) {throwassert(rr && a );} OneOperator(aType rr,aType a,aType b);// : r(rr),ArrayOfaType(a,b,false),next(0),pref(0) { // throwassert(rr && a && b);} OneOperator(aType rr,aType a,aType b,aType c) ; //: r(rr),ArrayOfaType(a,b,c,false),next(0),pref(0) {throwassert(rr && a && b && c);} OneOperator(aType rr,aType a,aType b,aType c,aType d) ; //: r(rr),ArrayOfaType(a,b,c,d,false),next(0),pref(0) {throwassert(rr && a && b && c);} OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e) ; //: r(rr),ArrayOfaType(a,b,c,d,e,false),next(0),pref(0) {throwassert(rr && a && b && c && d);} // Added by Fabian Dortu (5 parameters) OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f) ; //: r(rr),ArrayOfaType(a,b,c,d,e,f,false),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f);} // Added by Fabian Dortu (6 parameters) OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g); // : r(rr),ArrayOfaType(a,b,c,d,e,f,g,false),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g);} // Added by Fabian Dortu (7 parameters) OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g, aType h); // : r(rr),ArrayOfaType(a,b,c,d,e,f,g,h,false),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g && h);} // Added by Fabian Dortu (8 parameters) OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g, aType h, aType i) ; //: r(rr),ArrayOfaType(a,b,c,d,e,f,g,h,i,false),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g && h && i);} // Added by Fabian Dortu (9 parameters) OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g, aType h, aType i, aType j); // : r(rr),ArrayOfaType(a,b,c,d,e,f,g,h,i,j,false),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g && h && i && j);} // Added by Fabian Dortu (10 parameters) OneOperator(aType rr,const ArrayOfaType &ta) ; //: r(rr),ArrayOfaType(ta),next(0),pref(0) {throwassert(rr);} OneOperator(aType rr,bool ellipse) ; //: r(rr),ArrayOfaType(ellipse),next(0),pref(0) {throwassert(rr );} OneOperator(aType rr,const ListOfId *l) ; //: r(rr),ArrayOfaType(l),next(0),pref(0) {throwassert(rr );} typedef pair pair_find; void operator+=(OneOperator &a){throwassert(a.next==0);a.next=next;next=&a;} // a way to make none recurve delete good virtual ~OneOperator(); pair_find Find(const ArrayOfaType & at) const ; pair_find FindWithOutCast(const ArrayOfaType & at) const ; // for OneOperator * FindSameR(const ArrayOfaType & at) ; void Show(const ArrayOfaType & at,ostream &f=cerr) const; void Show(ostream &f=cerr) const; operator aType () const { return r;} // <> virtual E_F0 * code(const basicAC_F0 &) const =0; virtual C_F0 code2(const basicAC_F0 &a) const ; // {return code(code(a),r);} const OneOperator * Simple() const { return next||n?0:this;} friend ostream & operator<<(ostream & f,const OneOperator & a); }; /// <> class Polymorphic: public E_F0mps // [[E_F0mps]] { // a list of type // simple, array or function private: typedef const char * Key; typedef OneOperator * Value; // struct Keyless : binary_function // { bool operator()(const Key& x, const Key& y) const{ return strcmp(x,y)<0;} }; typedef map maptype; // typedef maptype::const_iterator const_iterator; // typedef maptype::iterator iterator; // // remark the map is mutable because // a expression is const E_F0 * // So There is a incompatibility between // we save an expression in a variable // we have to add thing to a polymorphisme expression mutable maptype m; // all polymorphisme of the Identifier Expression e; // default expression public: Polymorphic() : m(),e(0) {} // by default Empty and do nothing virtual AnyType operator()(Stack ) const { return Nothing;} virtual bool Empty() const {return true;} // by default Empty void clear() { m.clear();} const OneOperator * Find(const char *op, const ArrayOfaType &at) const; const OneOperator * FindWithOutCast(const char *op,const ArrayOfaType &at) const; void Show(const char *op,const ArrayOfaType & at,ostream &f=cerr)const ; void Add(const char * op,OneOperator * p0 ,OneOperator * p1=0,OneOperator * p2=0, OneOperator * p3=0,OneOperator * p4=0,OneOperator * p5=0, OneOperator * p6=0,OneOperator * p7=0,OneOperator * p8=0, OneOperator * p9=0,OneOperator * pa=0,OneOperator * pb=0, OneOperator * pc=0,OneOperator * pd=0,OneOperator * pe=0 ) const {Addp(op,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pa,pb,pc,pd,pe,0);} void Add(const char * op,OneOperator ** pp) const ; private: void Addp(const char * op,OneOperator * pp,...) const ; friend ostream & operator<<(ostream & f,const Polymorphic & a); }; /// the type for polymorphisme of id /// <> compile time expressions class basicAC_F0; class C_F0 { friend class CC_F0; // cf [[CC_F0]] protected: Expression f; // the expression code, cf [[Expression]] aType r; // the expression type, cf [[file:../fflib/AnyType.hpp::aType]] public: // the constructeur C_F0() :f(0),r(0) {} C_F0(const C_F0 & c):f(c.f),r(c.r) {} C_F0(const C_F0 & a,const C_F0 & b); // concatenation /// cf [[Type_Expr]] C_F0(const Type_Expr & a):f(a.second),r(a.first) {} /// <> /// [[file:AFunction2.cpp::C_F0_constructor_pop_char_basicAC_F0_impl]] /// cf [[Polymorphic]] C_F0(const Polymorphic *,const char *,const basicAC_F0 & ); C_F0(const Polymorphic *,const char *, AC_F0 & ); // function, array .. C_F0(const C_F0 & e,const char *op,const basicAC_F0 & p) ; C_F0(const C_F0 & e,const char *op, AC_F0 & p) ; // <> [[C_F0_constructor_char_C_F0_impl]] C_F0(const C_F0 & e,const char *op,const C_F0 & ee); C_F0(const C_F0 & e,const char *op,const C_F0 & a,const C_F0 & b) ; C_F0(const C_F0 & e,const char *nm) ; // without parameter ex f(). cf [[Polymorphic]] C_F0(const Polymorphic * pop,const char *op); // unary operator C_F0(const Polymorphic * pop,const char *op,const C_F0 & a); // <> binary operator [[file:AFunction2.cpp::C_F0_constructor_binary]] C_F0(const Polymorphic * pop,const char *op,const C_F0 & a,const C_F0 & b); // ternary operator C_F0(const Polymorphic * pop,const char *op,const C_F0 & a,const C_F0 & b,const C_F0 & c); C_F0( Expression ff,aType rr ): f(ff),r(rr) { // cout << "C_F0: " << * rr << endl;// dec 2007 FH // if (!rr && ff) cerr << "Type Null" << endl; } // operator Expression() const {return f;} AnyType eval(Stack s) const {return (*f)(s);} Expression RightValue() const { return r->RightValueExpr(f);} Expression LeftValue() const; aType left() const {return r;} aType right() const {return r->right();} C_F0 RightExp() const { return C_F0(RightValue(),right());} // FH add 07/2005 operator E_F0 * () const {return f;} bool Empty() const {return !f || f->Empty();} bool NotNull() const {return f;} int TYPEOFID() const { return r ? r->TYPEOFID(): 0;} int nbitem() const { return f ? f->nbitem() : 0;} bool EvaluableWithOutStack() const { return f && f->EvaluableWithOutStack();} bool Zero() const { return !f || f->Zero();} Expression Destroy() { return r->Destroy(*this);} operator const Polymorphic * () const {return dynamic_cast(f);} bool operator==(const C_F0 & a) const {return f==a.f && r == a.r;} bool operator!=(const C_F0 & a) const {return f!=a.f || r != a.r;} // Type_Expr SetParam(const ListOfId * l,size_t & top) const ; bool MeshIndependent() const { return f ==0 ? f->MeshIndependent() : false;} C_F0 OnReturn() { f=r->OnReturn(f); return *this; } // Add mai 2009 (for return statment. private: friend class Block; friend class TableOfIdentifier; C_F0( Expression ff ): f(ff),r(0) {} }; // for bison [[CListOfInst]] class CListOfInst; // a => b // f => t||f // t => t // (a =>b) <=> (!a || b ) // warning ------------------ class ForTypeVoid: public basicForEachType{public: ForTypeVoid():basicForEachType(typeid(void),0,0,0,0,0) {} }; template class ForEachType: public basicForEachType{public: ForEachType(Function1 iv=0,Function1 id=0,Function1 OOnReturn=0):basicForEachType(typeid(T),sizeof(T),0,0,iv,id,OOnReturn) { if (sizeof(T) > sizeof(AnyTypeWithOutCheck) ) { cout << " Sorry the " < " << sizeof(AnyTypeWithOutCheck) << " ) " << endl; throwassert(sizeof(T) <= sizeof(AnyTypeWithOutCheck) ); } } }; template class ForEachType: public basicForEachType{public:// coorection july 2009..... FH Hoooo.... (Il y a un bug DUR DUR FH ...) ForEachType(Function1 iv=0,Function1 id=0,Function1 OOnReturn=0):basicForEachType(typeid(T),sizeof(T),0,0,iv,id,OOnReturn) { //T i= 0.0; } }; template AnyType UnRef(Stack,const AnyType &a) ; template AnyType Initialize(Stack,const AnyType &a) ; template AnyType Destroy(Stack,const AnyType &a) ; // the type of variable is pointer because we need to write in template class ForEachTypePtr: public basicForEachType { public: ForEachTypePtr(); ForEachTypePtr(Function1 init,Function1 dl,Function1 onreturn=0); ForEachTypePtr(Function1 dl); }; template class ForEachTypePtr: public basicForEachType { public: ForEachTypePtr(T* bb=0,Function1 onreturn=0); ForEachTypePtr(Function1 init,Function1 dl,Function1 onreturn=0); ForEachTypePtr(Function1 dl); }; template class ForEachTypePtrfspace: public ForEachTypePtr { public: ForEachTypePtrfspace():ForEachTypePtr() {} int TYPEOFID() const {return RTYPE;} }; class ForTypeAnyType: public basicForEachType{public: ForTypeAnyType(): basicForEachType(typeid(AnyType),sizeof(AnyType)) {} bool CastingFrom(const basicForEachType * ) const {return true;} C_F0 CastTo(const C_F0 & e) const {return e;} }; // for cast and get value associed to a pointer template AnyType Cast(Stack,const AnyType &b) { return SetAny(static_cast(GetAny(b)));} template AnyType FCast(Stack s,const AnyType &b) { return SetAny(Add2StackOfPtr2Free(s,F(GetAny(b))));} template AnyType UnRef(Stack,const AnyType &a) { return SetAny(*PGetAny(a));} template AnyType UnRef(Stack,const AnyType &a) { return SetAny(*GetAny(a));} template AnyType UnRefCopyPtr(Stack s,const AnyType &a) { A ** ppa=PGetAny(a); A * pc = new A(**ppa); return SetAny(Add2StackOfPtr2Free(s,pc)) ;} template AnyType Initialize(Stack,const AnyType &x){ A * a=PGetAny(x); A *b=new A;// memcpy(a,b,sizeof(A));// bitcopy ::operator delete(b); // delete with no destruction return SetAny(a); } template AnyType InitializePtr(Stack stack,const AnyType &x){ A * a=PGetAny(x); SHOWVERB( cout << " init ptr " << typeid(A*).name() << (char *) a - (char*) stack<< endl); *a=0; return x; } template AnyType InitializeDef(Stack stack,const AnyType &x){ A * a=PGetAny(x); SHOWVERB( cout << " init ptr " << typeid(A*).name() << (char *) a - (char*) stack<< endl); *a=A(); return x; } template inline AnyType Delete(Stack,const AnyType &x){ A * a=PGetAny(x); SHOWVERB(cout << "DESTROY " < inline AnyType Destroy(Stack,const AnyType &x){ A * a=PGetAny(x); SHOWVERB(cout << "DESTROY " <destroy(); return Nothing; } template inline AnyType DestroyS(Stack,const AnyType &x){ A a=GetAny(x); SHOWVERB(cout << "DESTROY " < inline AnyType InitS(Stack,const AnyType &x){ A a=GetAny(x); SHOWVERB(cout << "InitS " < inline AnyType InitP(Stack,const AnyType &x){ A *a=PGetAny(x); SHOWVERB(cout << "InitP " <init(); return Nothing; } template inline AnyType DestroyPtr(Stack,const AnyType &x) { const A * a=PGetAny(x); SHOWVERB(cout << "DestroyPtr " << typeid(A).name() << *a << endl); (*a)->destroy(); // delete *a; return Nothing; }; template inline AnyType DeletePtr(Stack,const AnyType &x) { const A * a=PGetAny(x); SHOWVERB(cout << "DeletePtr " << typeid(A).name() << *a << endl); // (*a)->destroy(); delete *a; return Nothing; }; template<> AnyType inline DestroyPtr(Stack,const AnyType &x) { string ** a=PGetAny(x); SHOWVERB( cout << "DestroyPtr " << typeid(string*).name() << *a << endl); delete *a; return Nothing; }; template AnyType Initialize(Stack,const AnyType &x,const AnyType &y){ A * a=PGetAny(x); A *b=new A(GetAny(x));// memcpy(a,b,sizeof(A));// bitcopy ::operator delete(b); // delete with no destruction return SetAny(a); } class E_F0_CFunc2 :public E_F0mps { public: CFunction2 f2; E_F0 *a,*b; AnyType operator()(Stack s) const {return f2(s,a,b);} E_F0_CFunc2( CFunction2 ff,E_F0 *aa,E_F0 *bb) : f2(ff),a(aa),b(bb){} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack() && b->EvaluableWithOutStack();} // operator aType () const { return atype();} }; class E_F0_CFunc4 :public E_F0mps { public: CFunction4 f4; E_F0 *a,*b,*c,*d; AnyType operator()(Stack s) const {return f4(s,a,b,c,d);} E_F0_CFunc4( CFunction4 ff,E_F0 *aa,E_F0 *bb,E_F0 *cc,E_F0 *dd) : f4(ff),a(aa),b(bb),c(cc),d(dd){} operator aType () const { return atype();} }; template class E_F1_F :public E_F1 { public: typedef R (*func)(A) ; func f; E_F1_F(func ff) : f(ff) {} AnyType operator()(Stack s,AnyType & a) const {return SetAny(f(GetAny(a)));} }; template class E_F2_F :public E_F2 { public: typedef R (*func)(const A0 &,const A1&) ; func f; E_F2_F(func ff) : f(ff) {} AnyType operator()(Stack s,AnyType & a0,AnyType & a1) const {return SetAny(f(GetAny(a0),GetAny(a1)));} }; template class E_F_F0 :public E_F0 { public: template struct remove_reference {typedef T type;}; // template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; typedef typename remove_reference::type A0; typedef R (*func)( TA0 ) ; func f; Expression a; E_F_F0(func ff,Expression aa) : f(ff),a(aa) {} AnyType operator()(Stack s) const {return SetAny(f(GetAny( (*a)(s) )));} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack();} // bool MeshIndependent() const {return a->MeshIndependent();} // bool ReadOnly() const { return RO ;} int compare (const E_F0 *t) const { int rr; // cout << "cmp " << typeid(*this).name() << " and " << typeid(t).name() << endl; const E_F_F0* tt=dynamic_cast(t); if (tt && f == tt->f) rr = a->compare(tt->a); else rr = E_F0::compare(t); return rr; } // to give a order in instuction int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) ; virtual ostream & dump(ostream &ff) const { ff << typeid(*this).name() <<" f= " << f << " a= "<< *a << ' ' ;return ff; } }; // modif for xlc++ FH template class E_F_F0_Opt: public E_F_F0 { public : size_t ia; E_F_F0_Opt(const E_F_F0 &t,size_t iaa) : E_F_F0(t) , ia(iaa) {assert(iaa<2000000 && iaa >0);} AnyType operator()(Stack s) const { // A0 x = *static_cast(static_cast(static_cast(s)+ia)); // cout << " opt f (" << x << " ) = " << ": " << ia << endl; return SetAny( this->f( *static_cast::A0 *>(static_cast(static_cast(s)+ia)) ) );} }; template int E_F_F0::Optimize(deque > &l,MapOfE_F0 & m, size_t & n) { int rr = find(m); if (rr) return rr; return insert(new E_F_F0_Opt(*this,a->Optimize(l,m,n)),l,m,n); } // fin modif xlc++ template class E_VF_F0 :public E_F0 { public: typedef void (*func)( A0 ) ; func f; Expression a; E_VF_F0(func ff,Expression aa) : f(ff),a(aa) {} AnyType operator()(Stack s) const {f(GetAny( (*a)(s) ));return Nothing;} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack();} // bool MeshIndependent() const { return a->MeshIndependent(); } }; inline int clexico(int i,int j) { return i==0 ? j : i;} inline int clexico(int i,int j,int k) { int ll=clexico(i,j); return ll==0 ? k : ll;} template class E_F_F0F0 :public E_F0 { public: template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; typedef typename remove_reference::type A0; typedef typename remove_reference::type A1; typedef R (*func)( A0 , A1 ) ; func f; Expression a0,a1; E_F_F0F0(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) {} AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)) , GetAny((*a1)(s)) ) );} bool EvaluableWithOutStack() const {return a0->EvaluableWithOutStack() && a1->EvaluableWithOutStack();} // bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent();} // int compare (const E_F0 *t) const { int rr; // cout << "cmp " << typeid(*this).name() << " and " << typeid(t).name() << endl; const E_F_F0F0* tt=dynamic_cast(t); if (tt && f == tt->f) rr= clexico(a0->compare(tt->a0),a1->compare(tt->a1)); else rr = E_F0::compare(t); return rr; } // to give a order in instuction int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) ; }; // modif for xlc++ template class E_F_F0F0_Opt: public E_F_F0F0 { public : size_t ia,ib; E_F_F0F0_Opt(const E_F_F0F0 &t,size_t iaa,size_t ibb) : E_F_F0F0(t) , ia(iaa),ib(ibb) {} AnyType operator()(Stack s) const { //A0 aa =*static_cast(static_cast(static_cast(s)+ia)); //A1 bb=*static_cast(static_cast(static_cast(s)+ib)) ; //cout << ia << " " << ib << "f( " << aa << "," << bb << " ) = "<< f(aa,bb) << endl; return SetAny( this->f( *static_cast::A0 *>(static_cast(static_cast(s)+ia)) , *static_cast::A1 *>(static_cast(static_cast(s)+ib)) ) );} }; template int E_F_F0F0::Optimize(deque > &l,MapOfE_F0 & m, size_t & n) { int rr = find(m); if (rr) return rr; return insert(new E_F_F0F0_Opt(*this,a0->Optimize(l,m,n),a1->Optimize(l,m,n)),l,m,n); } // add modif for xlc++ template class E_F_F0_ :public E_F0 { public: typedef R (*func)(const A0& ) ; func f; Expression a; E_F_F0_(func ff,Expression aa) : f(ff),a(aa) {} AnyType operator()(Stack s) const {return SetAny(f(GetAny( (*a)(s) )));} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack() ;} // bool MeshIndependent() const {return a->MeshIndependent();} // }; // add FH 07/2008 for pmesh clean template class E_F_F0_Add2RC :public E_F0 { public: typedef R (*func)(const A0& ) ; func f; Expression a; E_F_F0_Add2RC(func ff,Expression aa) : f(ff),a(aa) {} AnyType operator()(Stack s) const {return SetAny(Add2StackOfPtr2FreeRC(s,f(GetAny( (*a)(s) ))));} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack() ;} // bool MeshIndependent() const {return a->MeshIndependent();} // }; // end add. template class E_F_F0s_ :public E { public: typedef R (*func)(Stack stack,const A0& ) ; func f; Expression a; E_F_F0s_(func ff,Expression aa) : f(ff),a(aa) {} AnyType operator()(Stack s) const {return SetAny(f(s,GetAny( (*a)(s) )));} // bool MeshIndependent() const {return true;} // def in E operator aType () const { return atype();} }; template class E_F_F0F0_ :public E { public: typedef R (*func)(const A0 &,const A1 & ) ; func f; Expression a0,a1; E_F_F0F0_(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) {} AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)) , GetAny((*a1)(s)) ) );} bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent();} // }; // FH Add 07/2008 // class with add 1 to the refcounter for mesh . template class E_F_F0F0_Add2RC :public E { public: typedef R (*func)(const A0 &,const A1 & ) ; func f; Expression a0,a1; E_F_F0F0_Add2RC(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) {} AnyType operator()(Stack s) const {return SetAny(Add2StackOfPtr2FreeRC(s, f( GetAny((*a0)(s)) , GetAny((*a1)(s)) ) ));} bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent();} // }; // FH end 07/2008 template class E_F_F0F0F0_ :public E { public: typedef R (*func)(const A0 &,const A1 & , const A2 &) ; func f; Expression a0,a1,a2; E_F_F0F0F0_(func ff,Expression aa0,Expression aa1,Expression aa2) : f(ff),a0(aa0),a1(aa1),a2(aa2) {} AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)) , GetAny((*a1)(s)),GetAny((*a2)(s)) ) );} virtual size_t nbitem() const {return a2->nbitem(); } bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent();} // }; template class E_F_stackF0F0F0_ :public E_F0mps { public: typedef R (*func)(Stack, const A0 &,const A1 & , const A2 &) ; func f; Expression a0,a1,a2; E_F_stackF0F0F0_(func ff,Expression aa0,Expression aa1,Expression aa2) : f(ff),a0(aa0),a1(aa1),a2(aa2) {} AnyType operator()(Stack s) const {return SetAny( f(s, GetAny((*a0)(s)) , GetAny((*a1)(s)),GetAny((*a2)(s)) ) );} virtual size_t nbitem() const {return a2->nbitem(); } bool MeshIndependent() const { return true;} }; template class E_F_F0F0_NC :public E_F0 { public: typedef R (*func)( A0 &,const A1 & ) ; func f; Expression a0,a1; E_F_F0F0_NC(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) {} AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)) , GetAny((*a1)(s)) ) );} bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent() ; } // }; class E_F_StackF0F0 :public E_F0mps { public: typedef AnyType (*func)(Stack,Expression ,Expression ) ; func f; Expression a0,a1; E_F_StackF0F0(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) { } AnyType operator()(Stack s) const {return (*f)(s, a0 , a1) ;} }; /* class E_F_F0F0_ :public E_F0 { public: typedef AnyType (*func)(const AnyType &,const AnyType & ) ; func f; Expression a0,a1; E_F_F0F0_(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) {} AnyType operator()(Stack s) const {return f( (*a0)(s) , (*a1)(s) );} bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent() ; } // }; */ class E_F2_func :public E_F2 { public: Function2 f; AnyType operator()(Stack s,AnyType & a,AnyType & b) const {return f(s,a,b);} E_F2_func( Function2 ff) : f(ff) {} }; class E_F0_Func1 :public E_F0 { public: Function1 f; E_F0 *a; AnyType operator()(Stack s) const {return f(s,(*a)(s));} E_F0_Func1( Function1 f1,E_F0 *aa) : f(f1),a(aa){} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack();} // bool MeshIndependent() const {return a->MeshIndependent();} // int compare (const E_F0 *t) const { int rr; const E_F0_Func1* tt=dynamic_cast(t); if (tt && f == tt->f) rr = a->compare(tt->a); else rr = E_F0::compare(t); if(tt && 0) { cout << "\n\t\t\t -------- " << (void *) f << " " << (void *) tt->f << " rr=" << a->compare(tt->a) << endl; cout << "\t\t\tcmp E_F0_Func1 " << rr <<" << " << *this << " cmp " << *t << " " << tt << ">>\n"; } return rr; } // to give a order in instuction // int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const; // build optimisation virtual ostream & dump(ostream &ff) const { ff << "E_F0_Func1 f= " << f << " a= "<< *a << ' ' ;return ff; } }; class E_F0_Func2 :public E_F0 { public: Function2 f; E_F0 *a,*b; AnyType operator()(Stack s) const {return f(s,(*a)(s),(*b)(s));} E_F0_Func2( Function2 f1,E_F0 *aa,E_F0 *bb) : f(f1),a(aa),b(bb){} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack() &&b->EvaluableWithOutStack();} // bool MeshIndependent() const {return a->MeshIndependent() && b->MeshIndependent();} // }; // the variable offset / stack (local variable) template class Value1:public E_F0 { size_t offset; public: AnyType operator()(Stack s) const { return SetAny(static_cast(static_cast( static_cast(s)+offset)));} Value1(size_t o):offset(o) {} }; // the variable globale template class GValue:public E_F0 { mutable R v; public: AnyType operator()(Stack ) const { return SetAny(static_cast(static_cast(&v)));} GValue(R o):v(o) {} bool EvaluableWithOutStack() const {return true;} // }; // a constante value template int ccompare(const R & a,const R& b){ return a==b ? 0 :( a int ccompare(const complex & a,const complex& b){ int c=ccompare(a.real(),b.real()); return c==0 ? ccompare(a.imag(),b.imag()): c ;} template class EConstant:public E_F0 { const R v; public: AnyType operator()(Stack ) const { /*cout << " ()" << v << endl*/;return SetAny(v);} EConstant(const R & o):v(o) { /*cout << "New constant " << o << endl;*/} bool EvaluableWithOutStack() const {return true;} // operator aType () const { return atype();} bool Zero()const { return v == R();} int compare (const E_F0 *t) const { int rr; const EConstant * tt=dynamic_cast(t); if (tt) rr = ccompare(v,tt->v); else rr = E_F0::compare(t); return rr; } ostream & dump(ostream &f) const { f << " ((" <name() << endl); // return PtrtoAny(static_cast(static_cast(s)+offset),t);} return PtrtoAny(Stack_offset(s,offset),t);} LocalVariable(size_t o,aType tt):offset(o),t(tt) {throwassert(tt); SHOWVERB(cout << "\n--------new var " << offset << " " << t->name() << endl); } }; class LocalVariableFES : public LocalVariable { public: size_t data; LocalVariableFES(size_t o,aType tt,const size_t & d) : LocalVariable(o,tt),data(d) {} size_t nbitem() const { return data;} }; template class LocalVariablePlus : public LocalVariable { public: U data; LocalVariablePlus(size_t o,aType tt,const U & d) : LocalVariable(o,tt),data(d) {} }; // global variable bof bof template class PValue:public E_F0 { T * p; public: AnyType operator()(Stack ) const { return p;} PValue(T * pp):p(pp) {} }; // global variable bof bof // value througth a pointeur add F.H july 2014 template class dPValue:public E_F0 { T * p; public: AnyType operator()(Stack ) const { return SetAny(*p);} dPValue(T * pp):p(pp) {} }; template class PPValue:public E_F0 { R ** p; public: AnyType operator()(Stack ) const { return SetAny(*p);} PPValue(R ** pp):p(pp) {} }; template Type_Expr CPValue(R & v) { throwassert(map_type[typeid(R*).name()]); return make_pair(map_type[typeid(R*).name()],new PValue(&v)); } template Type_Expr dCPValue(R * v) { throwassert(map_type[typeid(R).name()]); return make_pair(map_type[typeid(R).name()],new dPValue(v)); } template Type_Expr CPPValue(R *& v) { throwassert(map_type[typeid(R*).name()]); return make_pair(map_type[typeid(R*).name()],new PPValue(&v)); } template Type_Expr CConstant(const R & v) { throwassert(map_type[typeid(R).name()]); return make_pair(map_type[typeid(R).name()],new EConstant(v)); } /// <> used in [[file:../lglib/lg.ypp::YYSTYPE]] class CC_F0 { Expression f; aType r; public: void operator=(const C_F0& c) { f=c.f;r=c.r;;} void operator=(const AC_F0& a) ; //{ f=new E_Array(a); f= atype();}; void operator=(long ) {f=0;r=0;} void operator=(const CListOfInst& c);//{ C_FO cc=c;f=cc.f;r=cc.r} operator C_F0 () const {return C_F0(f,r);} bool Empty() const {return !f || f->Empty();} aType left() const {return r;} // operator const C_F0 &() const {return *this;} }; /// <> class ListOfInst : public E_F0mps /*[[E_F0mps]]*/ { int n; Expression * list; int * linenumber; const int nx; public: ListOfInst():n(0),list(0),linenumber(0),nx(10){} ListOfInst(int nn):n(0),list(0),linenumber(0),nx(nn?nn:10){} void Add(const C_F0 & ins); /// <> implemented at [[file:AFunction2.cpp::ListOfInst::operator()]] AnyType operator()(Stack s) const; operator aType () const { return n ? (aType) * (list[n-1]) : atype();} Expression &operator[](int i){return list[i];} bool empty() const {return n==0;} int size() const {return n;} Expression * ptr() const {return list;} int * nlines() const {return linenumber;} ~ListOfInst(){ cout << " ----- ~ListOfInst " << endl; if(list) delete [] list; list=0; if(linenumber) delete[] linenumber; linenumber=0; } }; /// <> used in [[file:../lglib/lg.ypp::YYSTYPE]] class CListOfInst{ private: /// class [[ListOfInst]] ListOfInst * f; const basicForEachType *r; public: void operator=(const CC_F0 &a){ f=new ListOfInst(); if( !a.Empty() ) { f->Add(a); r=a.left(); }} CListOfInst & operator+=(const CC_F0 & a);//{ if( !a.Empty()){ f->Add(a);r=a.left();};return *this;} operator C_F0 () const { return C_F0(f,r);} /// <> Called by yyparse() at [[file:../lglib/lg.ypp::start_symbol]] to evaluate the /// complete expression tree when reaching the end of its "start" symbol. It calls ListOfInst::operator()() at /// [[ListOfInst::operator()]] for its private [[ListOfInst]] pointer #f. void eval(Stack s) {(*f)(s);} int size() const {return f->size();} Expression * ptr() const {return f->ptr();} int * nlines() const { return f->nlines();} }; AnyType FWhile(Stack ,E_F0 * test,E_F0 * ins); AnyType FFor(Stack s ,E_F0 * i0,E_F0 * i1,E_F0 * i2,E_F0 * ins); AnyType FIf(Stack s ,E_F0 * test,E_F0 * i1,E_F0 * i2,E_F0 * notuse); AnyType TTry(Stack s ,E_F0 * i0,E_F0 * i1,E_F0 * i2,E_F0 * notuse); /// <> Contains all FreeFem++ language keywords. Definition in [[file:global.cpp::Global]], uses /// [[TableOfIdentifier]] extern TableOfIdentifier Global; void ShowType(ostream & ); template inline C_F0 to(const C_F0 & a) { return map_type[typeid(T).name()]->CastTo(a);} /* inline C_F0 toBool(const C_F0 & a) {return ATYPE(bool)->CastTo(a);} inline C_F0 toInt(const C_F0 & a) {return ATYPE(int)->CastTo(a);} inline C_F0 toLong(const C_F0 & a) {return ATYPE(long)->CastTo(a);} inline C_F0 toDouble(const C_F0 & a) {return ATYPE(double)->CastTo(a);} inline C_F0 toComplex(const C_F0 & a) {return ATYPE(Complex)->CastTo(a);} */ inline C_F0 While(C_F0 test,C_F0 ins) {return C_F0(new E_F0_CFunc2(FWhile,to(test),ins),0);} inline C_F0 For(C_F0 i0,C_F0 i1,C_F0 i2,C_F0 ins) {return C_F0(new E_F0_CFunc4(FFor,i0,to(i1),i2,ins),0);} inline C_F0 Try(C_F0 i0,C_F0 i1,C_F0 i2) {return C_F0(new E_F0_CFunc4(TTry,i0,i1,i2,0),0);} inline C_F0 FIf(C_F0 i0,C_F0 i1,C_F0 i2) {return C_F0(new E_F0_CFunc4(FIf,to(i0),i1,i2,0),0);} inline C_F0 FIf(C_F0 i0,C_F0 i1) {return C_F0(new E_F0_CFunc4(FIf,to(i0),i1,0,0),0);} //inline C_F0 C_F0::PtrValue() const{ // if (!(r && r->un_ptr)) { cerr << "PtrValue: Not a Left value " << *r << endl;CompileError();} // return C_F0(new E_F0_Func1(r->un_ptr->f,f),r->un_ptr->r);} /// <> class basicAC_F0 { // version de base d'un tableau d'un parametres // pour les operateurs unaire, binaire, , // pas d'allocation friend class E_Array; // for mapping fonction protected: typedef const C_F0 const_C_F0; int nb; C_F0 *a; public: typedef map maptype ; typedef maptype::iterator iterator; typedef maptype::const_iterator const_iterator; maptype * named_parameter; basicAC_F0 & operator=(int i) {throwassert(i==0);named_parameter=0,nb=0;return *this;} // pas de parametres basicAC_F0 & operator=(C_F0 & c) {named_parameter=0;nb=1;a=&c;return *this;} basicAC_F0 & operator=(pair p) {named_parameter=0;nb=p.first;a=p.second;return *this;} const C_F0 & operator [] (int i) const {throwassert(a && ifind(k) ; if (i == named_parameter->end() ) return C_F0(); else return i->second;} else return C_F0();} struct name_and_type{ const char * name; const type_info * type; } ; void SetNameParam(int n=0,name_and_type *l=0 , Expression * e=0) const ; }; /// <> array of parameters for FF language operators. uses [[basicAC_F0]] class AC_F0: public basicAC_F0 { // a Array of C_F0 // tableau d'un parametres max 1024 parametres // avec allocation const static int MaxSize; // no constructor in this class (this class is in a union ) public: AC_F0 & operator=(pair p) { named_parameter=0; a=new C_F0[MaxSize]; nb=0;Add(p.first,p.second);return *this;} AC_F0 & operator+=(pair p) {Add(p.first,p.second);return *this;} AC_F0 & operator=(long k) {throwassert(k==0);named_parameter=0;a=new C_F0[MaxSize]; nb=0;return *this;} AC_F0 & operator=(const C_F0& c) {named_parameter=0; a=new C_F0[MaxSize]; nb=0;a[nb++]=c;return *this;} AC_F0 & operator+=(const C_F0& c) { if ( ! (a&& nb 1024"); a[nb++]=c;return *this;} AC_F0 & Add(const char * nm,const C_F0 &c) { if (!named_parameter) named_parameter=new maptype(); iterator i=named_parameter->find(nm); if(i==named_parameter->end()) named_parameter->insert(make_pair(nm,c)); else {cerr << " the named in the list already exists "<< nm <size();} size_t nbitem() const {return v->size();} void map(C_F0 (*mapping)(const C_F0 & )) const { for (int i=0;isize();i++) v->a[i]=(*mapping)(v->a[i]);} virtual bool MeshIndependent() const { for (int i=0;isize();i++) if (v->a[i].MeshIndependent()) return false; return false; } // operator aType () const { return atype();} }; class PlotStream; class E_Border ; class E_BorderN :public E_F0mps { public: const E_Border * b; int cas;// 0 long , 1, KN_ , 2 : Array // FH april 14 .. Expression n; const E_BorderN * next; static int Cas(C_F0 nn) { if( atype()->CastingFrom(nn.left())) return 0; else if(atype >()->CastingFrom(nn.left())) return 1; else if( atype< const E_Array * >()->CastingFrom(nn.left()) ) { E_Array & a = *dynamic_cast< E_Array *>((Expression) nn); ffassert(a); a.map(::to); // a[i]=CastTo(a[i]); return 2; } else CompileError(" Number of element of a border ( longn , int array, [ ] array "); return -1; // bug } E_BorderN(const E_Border * bb, C_F0 nn,const E_BorderN * nx=0) ; E_BorderN(const E_BorderN & bb,const E_BorderN * nx) : b(bb.b),n(bb.n),cas(bb.cas),next(nx) { int kk=1; if(bb.next) {// modif FH. 13/02/2008 const E_BorderN ** pnext = &next; E_BorderN *pp; next = bb.next; // copy bb; for(int step=0;step<2;++step) { while (*pnext) { kk++; pp = new E_BorderN(**pnext); // copy *pnext = pp; pnext = & pp->next; } if(step==0) *pnext= nx; // copy de nx } // cout << " BorderN : nb item : " << kk << " == " << size()<< endl; } } AnyType operator()(Stack) const { return SetAny(this);} operator aType () const { return atype();} int size() const { int k=0;for(const E_BorderN *pp=this;pp; pp=pp->next) k++; return k;} E_BorderN * operator+( const E_BorderN & bb) const { throwassert(bb.next==0); return new E_BorderN(bb,this);} static C_F0 to(int cas, C_F0 nn) { if(cas==0) return ::to(nn); else if(cas ==1) return ::to >(nn); else if(cas == 2) return ::to (nn); else ffassert(0); // Big bug .. FH .. } long Nbseg(Stack stack,int index) const { if(cas==0) {assert(index==0); return GetAny((*n)(stack));} else if (cas==1 ) return (GetAny >((*n)(stack)))(index); else if (cas==2) {E_Array & a = *dynamic_cast< E_Array *>((Expression) n);assert(a); Expression nn= a[index]; return GetAny((*nn)(stack));} else return 0; } long NbBorder(Stack stack) const { if(cas==0) return 1; else if (cas==1 ) return GetAny >((*n)(stack)).N(); else if (cas==2) return dynamic_cast(n)->size(); else return 0; } //GetAny((*n)(stack));} double from(Stack stack) const ;//{ return GetAny((*n)(stack));} double to(Stack stack) const ;//{ return GetAny((*b)(stack));} long * index(Stack stack) const ;//{ return GetAny((*b)(stack));} double * var(Stack stack) const ;//{ return GetAny((*n)(stack));} void code(Stack stack) const ; long label()const ; void Plot(Stack stack) const ; void SavePlot(Stack stack,PlotStream & plot ) const; void BoundingBox(Stack stack,double &xmin,double & xmax, double & ymin,double & ymax) const ; }; class AddBorderOperator: public OneOperator{ typedef const E_BorderN * A; public: E_F0 * code(const basicAC_F0 & args) const { A a0=dynamic_cast((Expression) args[0]); A a1=dynamic_cast((Expression) args[1]); ffassert( a0 && a1); //ffassert(a1->next==0); // change FH 13/02/2008 return new E_BorderN(*a1,a0);} AddBorderOperator(): OneOperator(map_type[typeid(A).name()],map_type[typeid(A).name()],map_type[typeid(A).name()]) {pref = 0;} }; class OneOperator_borderN : public OneOperator {public: const E_Border * theborder;int cas; E_F0 * code(const basicAC_F0 & a) const { return new E_BorderN(theborder,a[0]);} OneOperator_borderN(const E_Border * b) : OneOperator(atype(),atype()), theborder(b),cas(0){} OneOperator_borderN(const E_Border * b,int ) : OneOperator(atype(),atype >()), theborder(b),cas(1){} OneOperator_borderN(const E_Border * b,int,int ) : OneOperator(atype(),atype()), theborder(b),cas(2){} }; class E_Border :public Polymorphic { public: static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =0; static long Count; Expression xvar,xfrom,xto,xcode,xindex; basicAC_F0_wa * tab; long label; E_Border(const E_Array * a) : xvar(0),xfrom(0),xto(0),xcode(0),xindex(0), tab(a? a->v:0) ,label(++Count) { assert(tab); Add("(",new OneOperator_borderN(this)); Add("(",new OneOperator_borderN(this,1)); Add("(",new OneOperator_borderN(this,1,1)); /* A FAIRE pour multy border ****/ } E_Border(const basicAC_F0 & aa) : xvar(to(aa[0])), xfrom(to(aa[1])), xto(to(aa[2])), xcode(aa[aa.size()-1].LeftValue()), xindex( (aa.size() > 4) ? (Expression) to(aa[3]) : 0 ), //xindex( to(aa[3]) ), tab(0), label(++Count) { Add("(",new OneOperator_borderN(this)); Add("(",new OneOperator_borderN(this,1)); Add("(",new OneOperator_borderN(this,1,1)); } AnyType operator()(Stack) const { return SetAny(this);} double length(Stack ) const { ffassert(0);return 0.0; /* a faire */ } }; inline E_BorderN::E_BorderN(const E_Border *bb, C_F0 nn,const E_BorderN * nx) :b(bb),cas(Cas(nn)),n(to(cas,nn) ),next(nx) { /* cout << " -- E_BorderN : cas " << cas << endl; */ throwassert(b);} inline double E_BorderN::from(Stack stack) const { return b->xfrom ? GetAny((*b->xfrom)(stack)): double(0.0);} inline double E_BorderN::to(Stack stack) const { return b->xto? GetAny((*b->xto)(stack)): b->length(stack) ;} inline double * E_BorderN::var(Stack stack) const { return b->xvar ? GetAny((*b->xvar)(stack)): (double*) 0 ;} inline long * E_BorderN::index(Stack stack) const { return b->xindex ? GetAny((*b->xindex)(stack)): (long*) 0 ;} inline void E_BorderN::code(Stack stack)const { (*b->xcode)(stack);} inline long E_BorderN::label()const { return b->label;} inline ArrayOfaType::ArrayOfaType(const basicAC_F0 & aa) : n(aa.size()),t(n ? (n<=4 ? tt : new aType[n]):0),ellipse(false) { for (int i=0;isecond);} inline C_F0 TableOfIdentifier::Find(const char * name,const basicAC_F0 & args) const { const_iterator i=m.find(name); if ( i == m.end()) {cerr<<"No operator " << name<second),"(",args);}} // Attention il y a moralement un bug // les initialisation x = y ( passe par l'operateur binaire <- dans TheOperators // les initialisation x(y) ( passe par l'operateur unaire <- du type de x // ------- inline size_t align8(size_t &off) { size_t o= off %8 ; off += o ? 8-o : 0; return off; } template inline Type_Expr NewVariable(aType t,size_t &off) { size_t o= align8(off);// align // off += t->un_ptr_type->size; // bug off += t->size; off += t->un_ptr_type->size; // correction 16/09/2003 merci Richard MICHEL return Type_Expr(t,new T(o,t)); } template inline Type_Expr NewVariable(aType t,size_t &off,const basicAC_F0 &args) { size_t o= align8(off);// align off += t->un_ptr_type->size; return Type_Expr(t,new T(o,t,args)); } template inline Type_Expr NewVariable(aType t,size_t &off,const U & data) { size_t o= align8(off);// align off += t->un_ptr_type->size; return Type_Expr(t,new T(o,t,data)); } template inline C_F0 TableOfIdentifier::NewVar(Key k,aType t,size_t & top,const C_F0 &i) { return C_F0(TheOperators,"<-",New(k,NewVariable(t,top)),i);} template inline C_F0 TableOfIdentifier::NewVar(Key k,aType t,size_t & top,const basicAC_F0 &args) { // return C_F0(TheOperators,"<-",New(k,NewVariable(t,top)),t->Find("<-",args));} return C_F0(TheOperators,"<-",basicAC_F0_wa(New(k,NewVariable(t,top)),args));} template inline C_F0 TableOfIdentifier::NewFESpace(Key k,aType t,size_t & top,const basicAC_F0 &args) { return C_F0(TheOperators,"<-",basicAC_F0_wa(New(k,NewFESpace(t,top,args)),args));} template inline C_F0 TableOfIdentifier::NewVar(Key k,aType t,size_t & top,const basicAC_F0 &args,const U & data) { // return C_F0(TheOperators,"<-",New(k,t->NewVar(top)),t->Find("<-",args));} return C_F0(TheOperators,"<-",basicAC_F0_wa(New(k,NewVariable(t,top,data)),args));} //inline C_F0 TableOfIdentifier::NewVar(Key k,aType t,size_t & top,const AC_F0 &args,const C_F0& ) // { throwassert(0); return C_F0(TheOperators,"<-",New(k,NewVariable(t,top)),t->Find("<-",args));} template inline C_F0 TableOfIdentifier::NewVar(Key k,aType t,size_t & top) { return t->Initialization(New(k,NewVariable(t,top))); } // save a expression inline C_F0 TableOfIdentifier::NewID(aType r,Key k, C_F0 & c,size_t &top, bool del ) { New(k,(make_pair(c.left(),c.LeftValue())),del);return 0; } // { return r->Initialization(New(k,r->SetParam(c,ListOfId(),top),del));} inline C_F0 TableOfIdentifier::NewID(aType r,Key k, C_F0 & c,const ListOfId & l,size_t & top,bool del) { return r->Initialization(New(k,r->SetParam(c,&l,top),del));} /// <> allocated at [[file:global.cpp::tables_of_identifier]] typedef list ListOfTOfId; extern list tables_of_identifier; /// [[file:AFunction2.cpp::Find]] C_F0 Find(const char * name); inline C_F0 basicForEachType::Find(const char * k) const { C_F0 r( ti.Find(k)); //if (r.Empty()) {cerr << " no member " <MeshIndependent() && b->MeshIndependent();} } ; inline C_F0::C_F0(const C_F0 & a,const C_F0 & b) { // the concatenation if (a.Empty()) {r=b.r,f=b.f;} else if (b.Empty()) {r=a.r,f=b.f;} else {r=b.r; f= new E_comma(a.f,b.f);} } inline C_F0::C_F0(const C_F0 & e,const char *op, AC_F0 & p) { *this=C_F0(e,op,(const basicAC_F0 &) p); p.destroy(); } inline C_F0::C_F0(const Polymorphic * poly,const char *op, AC_F0 & p) { *this=C_F0(poly,op,(const basicAC_F0 &) p); p.destroy(); } inline C_F0::C_F0(const C_F0 & e,const char *op,const basicAC_F0 & p) { const Polymorphic * pop=e; if (pop) { //cerr << "poly: " << *pop << endl; *this=C_F0(pop,op,p); } else { // cerr << *e.r << " : table " << endl; // e.r->ShowTable(cerr); C_F0 x=e.r->Find(op); pop=x; if(pop) { basicAC_F0_wa ep(e,p); *this=C_F0(pop,"",ep); } else { cerr << " unknown operator " << op << " on type " << *e.r << endl; CompileError(); }} } inline C_F0::C_F0(const C_F0 & e,const char *op,const C_F0 & a,const C_F0 & b) { C_F0 tab[2]={a,b}; basicAC_F0 p; p=make_pair(2,tab); *this= C_F0(e,op,p); } /// <> inline C_F0::C_F0(const C_F0 & e,const char *op,const C_F0 & ee) { const Polymorphic * pop=e; if (pop) { // calls [[C_F0_constructor_binary_decl]] *this=C_F0(pop,op,e,ee); } else { // cerr << *e.r << " : table " << endl; // e.r->ShowTable(cerr); C_F0 x=e.r->Find(op); pop=x; if(pop) *this=C_F0(pop,"",e,ee); else { cerr << " unknown operator " << op << " on type " << *e.r << " " << *ee.r<< endl; CompileError(); } } } inline C_F0::C_F0(const C_F0 & e,const char *nm) { // cerr << " C_F0(const C_F0 & e,const char *item) : " << " " << nm << endl; C_F0 x=e.r->Find(nm); const Polymorphic * pop=x; // cerr << "Find " << *pop << endl; if (pop) *this=C_F0(pop,".",e); // unary oper . else { cerr << " No operator ." << nm << " for type " << *e.r << endl; lgerror(""); } } inline E_F0 * C_F0::LeftValue() const { return f; } /*inline Type_Expr C_F0::SetParam(const ListOfId * l,size_t & top) const { return r->SetParam(*this,l,top); }*/ /// Declaration of TypeArray aType TypeArray(aType,aType); aType TypeArray(aType c,aType b,aType a); /// Declaration of TypeTemplate aType TypeTemplate(aType,aType); void Init_map_type(); /// <> class Block { // static size_t Max(size_t a,size_t b){ return a < b ? b :a;} typedef const char * Key; Block * fatherblock; size_t top,topmax; TableOfIdentifier table; ListOfTOfId::iterator itabl; public: // list of variable size_t OffSet(size_t ssize) { top=align8(top); size_t r=top; top+=ssize ;topmax=Max(topmax,top); return r;} Block(Block * f=0); /* :fatherblock(f),top(f?f->top:BeginOffset*sizeof(void*)),topmax(top) { itabl=tables_of_identifier.insert(tables_of_identifier.begin(),&table); }*/ size_t size() const { return Max(topmax,top);} void Add(Key k,Key op,OneOperator *p0) { table.Add(k,op,p0);} template C_F0 NewVar(Key k,aType t,const C_F0 &i) {return table.NewVar(k, t,top,i);} template C_F0 NewFESpace(Key k,aType t,const basicAC_F0 &args) {return table.NewFESpace(k, t,top,args);} template C_F0 NewVar(Key k,aType t, AC_F0 &args) {C_F0 r= table.NewVar(k, t,top,args); args.destroy(); topmax=Max(topmax,top); return r;} template C_F0 NewVar(Key k,aType t,const basicAC_F0 &args) {C_F0 r= table.NewVar(k, t,top,args); topmax=Max(topmax,top); return r;} template C_F0 NewVar(Key k,aType t,const basicAC_F0 &args,const U & data) {C_F0 r= table.NewVar(k, t,top,args,data); topmax=Max(topmax,top); return r;} // C_F0 NewVar(Key k,aType t,const AC_F0 &args,const C_F0 & f) // {return table.NewVar(k, t,top,args,f);} template C_F0 NewVar(Key k,aType t) {C_F0 r= table.NewVar(k, t,top); topmax=Max(topmax,top); return r; } // C_F0 NewVar(aType t,Key k,C_F0 f) // {return table.NewVar(t,k, f);} C_F0 NewID(aType t,Key k,C_F0 f,bool del=true) {C_F0 r= table.NewID(t,k, f,top,del); topmax=Max(topmax,top); return r;} C_F0 NewID(aType t,Key k,C_F0 f,const ListOfId & l,bool del=true) {C_F0 r= table.NewID(t,k,f,l,top,del); topmax=Max(topmax,top); return r;} static Block * open(Block *& c); CC_F0 close(Block *& c); /* { tables_of_identifier.erase(itabl); c=fatherblock; if (fatherblock) {fatherblock->topmax=topmax; fatherblock->top=top;} CC_F0 r; r = table.destroy(); delete this; return r;}*/ C_F0 Find(const char * k) const {return table.Find(k);} ~Block(); //{} }; /// <> To know the meaning of OneOperator name extensions, see [[OneOperator]]. The template arguments to /// OneOperator classes are identical to the types of the arguments of the C++ function that is called from the /// class. The matrices are of type KNM* or KNM** (for left-side expressions, but this is "more /// tricky") which correspond to a real[int,int] in the edp script. template > class OneOperator1 : public OneOperator { aType r,t0; // return type typedef typename CODE::func func; // R (*func)(A) ; func f; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(f,t0->CastTo(args[0]));} OneOperator1(func ff,int ppref=0): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()]), t0( map_type[typeid(A).name()] ), f(ff) {pref=ppref;} OneOperator1(func ff,aType tt0,int ppref=0): OneOperator(map_type[typeid(R).name()],tt0), t0( map_type[typeid(A).name()] ), f(ff) {pref=ppref;} }; template > class OneOperator2 : public OneOperator { aType r,t0,t1; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(f,t0->CastTo(args[0]),t1->CastTo(args[1]));} OneOperator2(func ff): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()]), t0( map_type[typeid(A).name()] ),t1(map_type[typeid(B).name()] ), f(ff) {} OneOperator2(func ff,aType tt0,aType tt1): OneOperator(map_type[typeid(R).name()],tt0,tt1), t0( map_type[typeid(A).name()] ),t1(map_type[typeid(B).name()] ), f(ff) {} }; /*template struct OneBinaryOperator_Traits { typedef C::result_type R; typedef C::first_argument_type A; typedef C::second_argument_type B; };*/ template struct SameType { static const int OK=0;}; template struct SameType { static const int OK=1;}; template<> struct SameType { static const int OK=10;}; template<> struct SameType { static const int OK=20;}; template<> struct SameType { static const int OK=30;}; template<> struct SameType { static const int OK=40;}; template<> struct SameType { static const int OK=50;}; template struct ternary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Arg3 third_argument_type; typedef Result result_type; }; template struct quad_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Arg3 third_argument_type; typedef Arg4 fourth_argument_type; typedef Result result_type; }; template class OneTernaryOperator : public OneOperator{ typedef typename T::result_type R; typedef typename T::first_argument_type A; typedef typename T::second_argument_type B; typedef typename T::third_argument_type C; class Op : public E_F0 { typedef typename C::result_type Result; Expression a,b,c; public: AnyType operator()(Stack s) const {return SetAny(static_cast(C::f( GetAny((*a)(s)) , GetAny((*b)(s)) , GetAny((*c)(s)))));} Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc) {} bool MeshIndependent() const { return a->MeshIndependent() && b->MeshIndependent() && c->MeshIndependent();} }; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(t[0]->CastTo(args[0]),t[1]->CastTo(args[1]),t[2]->CastTo(args[2]));} OneTernaryOperator(): OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()]) {} }; template class OneQuadOperator : public OneOperator{ typedef typename T::result_type R; typedef typename T::first_argument_type A; typedef typename T::second_argument_type B; typedef typename T::third_argument_type C; typedef typename T::fourth_argument_type D; class Op : public E_F0 { typedef typename C::result_type Result; Expression a,b,c,d; public: AnyType operator()(Stack s) const {return SetAny(static_cast(T::f( GetAny((*a)(s)) , GetAny((*b)(s)) , GetAny((*c)(s)), GetAny((*d)(s)) )));} Op(Expression aa,Expression bb,Expression cc,Expression dd) : a(aa),b(bb),c(cc),d(dd) {} bool MeshIndependent() const { return a->MeshIndependent() && b->MeshIndependent() && c->MeshIndependent() && d->MeshIndependent();} }; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(t[0]->CastTo(args[0]),t[1]->CastTo(args[1]),t[2]->CastTo(args[2]),t[3]->CastTo(args[3]));} OneQuadOperator(): OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()] ) {} }; template class OneTernaryOperator3 : public OneOperator{ typedef typename T::result_type R; typedef typename T::first_argument_type A; typedef typename T::second_argument_type B; typedef typename T::third_argument_type C; class Op : public E_F0 { // typedef typename C::result_type Result; Expression a,b,c; public: AnyType operator()(Stack s) const {return SetAny(static_cast(T::f( s, GetAny((*a)(s)) , GetAny((*b)(s)) , GetAny((*c)(s)))));} Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc) {} bool MeshIndependent() const { return a->MeshIndependent() && b->MeshIndependent() && c->MeshIndependent();} }; public: E_F0 * code(const basicAC_F0 & args) const { return new Op(t[0]->CastTo(args[0]),t[1]->CastTo(args[1]),t[2]->CastTo(args[2]));} OneTernaryOperator3(): OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()]) {} }; struct OneBinaryOperatorMI { static bool MeshIndependent(Expression a,Expression b) { return a->MeshIndependent() && b->MeshIndependent();} static bool ReadOnly() { return true;} }; struct OneBinaryOperatorMIWO { static bool MeshIndependent(Expression a,Expression b) { return a->MeshIndependent() && b->MeshIndependent();} static bool ReadOnly() { return false;} }; // ---------- operator with stack ??? for auto delete template class OneBinaryOperator_st : public OneOperator{ typedef typename C::result_type R; typedef typename C::first_argument_type A; typedef typename C::second_argument_type B; aType t0,t1; // type of template modif FH mars 2006 class Op : public E_F0 { typedef typename C::result_type Result; Expression a,b; public: AnyType operator()(Stack s) const {return SetAny(static_cast(C::f(s, GetAny((*a)(s)) , GetAny((*b)(s)))));} Op(Expression aa,Expression bb) : a(aa),b(bb) {} bool MeshIndependent() const { return MI::MeshIndependent(a,b);} bool ReadOnly() const { return MI::ReadOnly() ;} int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) { int rr = find(m); if (rr) return rr; int Opa = a->Optimize(l,m,n); int Opb =b->Optimize(l,m,n); return insert(new Opt(*this,Opa,Opb),l,m,n); } int compare (const E_F0 *t) const { int rr; const Op * tt=dynamic_cast(t); if (tt ) rr = clexico(a->compare(tt->a),b->compare(tt->b)); else rr = E_F0::compare(t); // cout << "cmp E_F0_Func1 " << rr << endl; return rr; } // to give a order in instuction // int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const; // build optimisation virtual ostream & dump(ostream &f) const { f << "Op<" << typeid(C).name() << "> \n\t\t\t( a= "<< *a<< ") \n\t\t\t(b= "<< *b << ") " ; return f; } }; // build optimisation class Opt: public Op { public : size_t ia,ib; Opt(const Op &t,size_t iaa,size_t ibb) : Op(t) , ia(iaa),ib(ibb) {} AnyType operator()(Stack s) const { // cout << "Opt2 ::: " << ia << " "<< ib << " f = " // << GetAny(SetAny(C::f( *static_cast(static_cast(static_cast(s)+ia)) , // *static_cast(static_cast(static_cast(s)+ib))))) << endl; return SetAny( C::f(s, *static_cast(static_cast(static_cast(s)+ia)) , *static_cast(static_cast(static_cast(s)+ib)) ) );} }; // aType r; // return type public: E_F0 * code(const basicAC_F0 & args) const { //cout << "A op B \n" ; return new Op(t0->CastTo(args[0]),t1->CastTo(args[1]));} OneBinaryOperator_st(): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()]), t0(t[0]), t1(t[1]) {pref = SameType::OK ;} OneBinaryOperator_st(aType tt0,aType tt1): OneOperator(map_type[typeid(R).name()], tt0 ? tt0 : map_type[typeid(A).name()] , tt1 ? tt1 : map_type[typeid(B).name()]), t0(map_type[typeid(A).name()]), t1(map_type[typeid(B).name()]) {pref = SameType::OK ;} }; struct evalE_F2 { static AnyType eval(Stack s,const E_F0 * ab,const E_F0 * a,const E_F0 * b, bool & meshidenp) { return ab->E_F0::eval(s,meshidenp); } }; // template class OneBinaryOperator : public OneOperator{ typedef typename C::result_type R; typedef typename C::first_argument_type A; typedef typename C::second_argument_type B; aType t0,t1; // type of template modif FH mars 2006 class Op : public E_F0 { typedef typename C::first_argument_type A; typedef typename C::second_argument_type B; typedef typename C::result_type Result; Expression a,b; public: AnyType operator()(Stack s) const {return SetAny(static_cast(C::f( GetAny((*a)(s)) , GetAny((*b)(s)))));} // optim eval MI ... juin 2007 FH ... AnyType eval(Stack s, bool & meshidenp) const {return MIx::eval(s,this,a,b,meshidenp);} // fi optime Op(Expression aa,Expression bb) : a(aa),b(bb) {} bool MeshIndependent() const { return MI::MeshIndependent(a,b);} bool ReadOnly() const { return MI::ReadOnly() ;} int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) { int rr = find(m); if (rr) return rr; int Opa = a->Optimize(l,m,n); int Opb =b->Optimize(l,m,n); return insert(new Opt(*this,Opa,Opb),l,m,n); } int compare (const E_F0 *t) const { int rr; const Op * tt=dynamic_cast(t); if (tt ) rr = clexico(a->compare(tt->a),b->compare(tt->b)); else rr = E_F0::compare(t); // cout << "cmp E_F0_Func1 " << rr << endl; return rr; } // to give a order in instuction // int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const; // build optimisation virtual ostream & dump(ostream &f) const { f << "Op<" << typeid(C).name() << "> \n\t\t\t( a= "<< *a<< ") \n\t\t\t(b= "<< *b << ") " ; return f; } }; // build optimisation class Opt: public Op { public : size_t ia,ib; Opt(const Op &t,size_t iaa,size_t ibb) : Op(t) , ia(iaa),ib(ibb) {} AnyType operator()(Stack s) const { // cout << "Opt2 ::: " << ia << " "<< ib << " f = " // << GetAny(SetAny(C::f( *static_cast(static_cast(static_cast(s)+ia)) , // *static_cast(static_cast(static_cast(s)+ib))))) << endl; return SetAny( C::f( *static_cast(static_cast(static_cast(s)+ia)) , *static_cast(static_cast(static_cast(s)+ib)) ) );} }; // aType r; // return type public: E_F0 * code(const basicAC_F0 & args) const { //cout << "A op B \n" ; if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new Op(t0->CastTo(args[0]),t1->CastTo(args[1]));} OneBinaryOperator(): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()]), t0(t[0]), t1(t[1]) {pref = SameType::OK ;} OneBinaryOperator(aType tt0,aType tt1): OneOperator(map_type[typeid(R).name()], tt0 ? tt0 : map_type[typeid(A).name()] , tt1 ? tt1 : map_type[typeid(B).name()]), t0(map_type[typeid(A).name()]), t1(map_type[typeid(B).name()]) {pref = SameType::OK ;} }; //------------- template class Operator_Aritm_If : public OneOperator{ typedef bool A; typedef R B; typedef R C; class Op : public E_F0 { typedef R Result; Expression a,b,c; public: AnyType operator()(Stack s) const { bool ok = GetAny((*a)(s)) ; R r ; if( ok) r=GetAny((*b)(s)) ; else r =GetAny((*c)(s)) ; return SetAny(r);// static_cast( ? GetAny((*b)(s)) : GetAny((*c)(s)) )); } Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc){} bool MeshIndependent() const { return a->MeshIndependent() && b->MeshIndependent() &&b->MeshIndependent() ;} int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) { int rr = find(m); if (rr) return rr; int Opa = a->Optimize(l,m,n); int Opb =b->Optimize(l,m,n); int Opc =c->Optimize(l,m,n); return insert(new Opt(*this,Opa,Opb,Opc),l,m,n); } int compare (const E_F0 *t) const { int rr; const Op * tt=dynamic_cast(t); if (tt ) rr = clexico(a->compare(tt->a),b->compare(tt->b),c->compare(tt->c)); else rr = E_F0::compare(t); // cout << "cmp E_F0_Func1 " << rr << endl; return rr; } // to give a order in instuction // int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const; // build optimisation virtual ostream & dump(ostream &f) const { f << "Op<" << typeid(C).name() << "> \n\t\t\t( a= "<< *a<< ") \n\t\t\t(b= "<< *b << ") " ; return f; } }; // build optimisation class Opt: public Op { public : size_t ia,ib,ic; Opt(const Op &t,size_t iaa,size_t ibb,size_t icc) : Op(t) , ia(iaa),ib(ibb),ic(icc) {} AnyType operator()(Stack s) const { // cout << "Opt2 ::: " << ia << " "<< ib << " f = " // << GetAny(SetAny(C::f( *static_cast(static_cast(static_cast(s)+ia)) , // *static_cast(static_cast(static_cast(s)+ib))))) << endl; return SetAny( static_cast ( *static_cast(static_cast(static_cast(s)+ia)) ? *static_cast(static_cast(static_cast(s)+ib)) : *static_cast(static_cast(static_cast(s)+ic)) ) );} }; // aType r; // return type public: E_F0 * code(const basicAC_F0 & args) const { //cout << "A op B \n" ; if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new Op(t[0]->CastTo(args[0]),t[1]->CastTo(args[1]),t[2]->CastTo(args[2]));} Operator_Aritm_If(): OneOperator(map_type[typeid(R).name()],map_type[typeid(bool).name()],map_type[typeid(B).name()],map_type[typeid(B).name()]) {pref = SameType::OK ;} }; /* essai d'unification des classes template struct F_1 : unary_function,public E_F0 { AnyType operator()(Stack s) const { return SetAny( ff(GetAny((*a)(s)))) ;} }; template class bUnary_Op : public C { public: Expression a; public: bUnary_Op(Expression aa) : a(aa) {} int compare (const E_F0 *t) const { int rr; const bUnary_Op * tt=dynamic_cast(t); if (tt) rr = a->compare(tt->a); else rr = E_F0::compare(t); // cout << "cmp E_F0_Func1 " << rr << endl; return rr; } // to give a order in instuction bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack();} // bool MeshIndependent() const {return a->MeshIndependent();} // // int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const; // build optimisation virtual ostream & dump(ostream &f) const { f << "Op1<" << typeid(C).name() << "> \n\t\t\t( a= "<< *a<< ") " ; return f; } }; */ template class Unary_Op : public E_F0 { public: typedef typename C::result_type R; typedef typename C::argument_type A; Expression a; public: AnyType operator()(Stack s) const { return SetAny( C::f(GetAny((*a)(s)))) ;} Unary_Op(Expression aa) : a(aa) {} int compare (const E_F0 *t) const { int rr; const Unary_Op * tt=dynamic_cast(t); if (tt) rr = a->compare(tt->a); else rr = E_F0::compare(t); // cout << "cmp E_F0_Func1 " << rr << endl; return rr; } // to give a order in instuction bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack();} // bool MeshIndependent() const {return a->MeshIndependent();} // // int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const; // build optimisation virtual ostream & dump(ostream &f) const { f << "Op1<" << typeid(C).name() << "> \n\t\t\t( a= "<< *a<< ") " ; return f; } }; template > class OneUnaryOperator : public OneOperator{ typedef typename C::result_type R; typedef typename C::argument_type A; // aType r; // return type aType tA; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new Op(tA->CastTo(args[0]));} OneUnaryOperator(aType tt0=map_type[typeid(A).name()]): OneOperator(map_type[typeid(R).name()],tt0), tA(map_type[typeid(A).name()]) {} }; template class OneOperator1s_ : public OneOperator { aType r; // return type typedef R (*func)(Stack stack, const A &) ; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new E_F_F0s_(f,t[0]->CastTo(args[0]));} OneOperator1s_(func ff): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()]),f(ff){} }; template > class OneOperator1_ : public OneOperator { aType r,t0; // return type typedef R (*func)(const A &) ; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f,t[0]->CastTo(args[0]));} OneOperator1_(func ff,int ppref=0): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()]),t0( map_type[typeid(A).name()] ),f(ff){pref=ppref;} OneOperator1_(func ff,aType tt0,int ppref=0): OneOperator(map_type[typeid(R).name()],tt0), t0( map_type[typeid(A).name()]), f(ff) {pref=ppref;} }; template class E_F_F0F0_; template > class OneOperator2_ : public OneOperator { aType r,t0,t1; // return type type de f, f(t1, t2) typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f,t0->CastTo(args[0]),t1->CastTo(args[1]));} OneOperator2_(func ff): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()]), t0( map_type[typeid(A).name()] ),t1(map_type[typeid(B).name()] ), f(ff) {} OneOperator2_(int ppref,func ff): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()]), t0( map_type[typeid(A).name()] ),t1(map_type[typeid(B).name()] ), f(ff) {pref=ppref;} OneOperator2_(func ff,aType tt0,aType tt1): OneOperator(map_type[typeid(R).name()],tt0,tt1), t0( map_type[typeid(A).name()] ),t1(map_type[typeid(B).name()] ), f(ff) {} }; template > class OneOperator3_ : public OneOperator { // aType r; // return type aType tA,tB,tC; // type of template modif FH mars 2007 typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f,tA->CastTo(args[0]),tB->CastTo(args[1]),tC->CastTo(args[2]));} OneOperator3_(func ff, aType tt0=map_type[typeid(A).name()], aType tt1=map_type[typeid(B).name()], aType tt2=map_type[typeid(C).name()]) : OneOperator(map_type[typeid(R).name()],tt0,tt1,tt2), tA(map_type[typeid(A).name()]), tB(map_type[typeid(B).name()]), tC(map_type[typeid(C).name()]), f(ff){} }; // <> utilise [[E_F0]]. la class code doit contenir /* class CODE: public E_F0 { typedef ... func .. ; typedef .. R; static ArrayOfaType typeargs(); // the list of type de l'operateur of the args typedef ... R; // return type } */ template class OneOperatorCode : public OneOperator { public: E_F0 * code(const basicAC_F0 & args) const { return CODE::f(args);} OneOperatorCode(): OneOperator(atype(),CODE::typeargs()) {pref=ppref;} OneOperatorCode(aType rr,const ArrayOfaType & l): OneOperator(rr,l) {pref=ppref;} OneOperatorCode(aType rr,aType a): OneOperator(rr,a) {pref=ppref;} OneOperatorCode(aType rr,aType a,aType b): OneOperator(rr,a,b) {pref=ppref;} OneOperatorCode(aType rr,aType a,aType b,aType c): OneOperator(rr,a,b,c) {pref=ppref;} }; template struct binary_trait{ typedef A R ;}; template<> struct binary_trait { typedef double R;}; template<> struct binary_trait { typedef double R;}; template<> struct binary_trait > { typedef complex R;}; template<> struct binary_trait > { typedef complex R;}; template<> struct binary_trait > { typedef complex R ;}; template struct binary_trait { typedef string* R ;}; // 1 variable pour les operation de cast class E_F1_funcT_Type: public OneOperator{ public: // const basicForEachType *r,*a; Function1 f; E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new E_F0_Func1(f,args[0]);} E_F1_funcT_Type(const basicForEachType *rr,const basicForEachType *aa,Function1 ff) : OneOperator(rr,aa), f(ff) {} //: r(rr),a(aa),f(ff) {} // friend ostream & operator<<(ostream & f,const E_F1_funcT_Type & e) { f << *e.a << " -> " << *e.r ;return f;} }; template class E_F1_funcT :public E_F1_funcT_Type{ public: E_F1_funcT(Function1 ff) : E_F1_funcT_Type(map_type[typeid(R).name()],map_type[typeid(A).name()],ff){} E_F1_funcT(aType rr,aType a,Function1 ff) : E_F1_funcT_Type(rr,a,ff){} }; template ForEachTypePtr::ForEachTypePtr(): basicForEachType(typeid(PT),sizeof(PT), // new E_F1_funcT(UnRef),atype(), new E_F1_funcT_Type(atype(),this,UnRef),atype(), ::Initialize,::Delete){} template ForEachTypePtr::ForEachTypePtr(Function1 init,Function1 dl,Function1 onreturn): basicForEachType(typeid(PT),sizeof(PT), // new E_F1_funcT(UnRef),atype(), new E_F1_funcT_Type(atype(),this,UnRef),atype(), init, dl , onreturn ){} template ForEachTypePtr::ForEachTypePtr(Function1 dl): basicForEachType(typeid(PT),sizeof(PT), new E_F1_funcT_Type(atype(),this,UnRef),atype(), ::Initialize,dl){} template ForEachTypePtr::ForEachTypePtr(T* unused,Function1 OOnReturn): basicForEachType(typeid(T**),sizeof(T**), // new E_F1_funcT(UnRef),atype(), new E_F1_funcT_Type(atype(),this,UnRef),atype(), ::InitializePtr,::DestroyPtr,OOnReturn){} template ForEachTypePtr::ForEachTypePtr(Function1 init,Function1 dl,Function1 onreturn): basicForEachType(typeid(T**),sizeof(T**), // new E_F1_funcT(UnRef),atype(), new E_F1_funcT_Type(atype(),this,UnRef),atype(), init , dl , onreturn){} template ForEachTypePtr::ForEachTypePtr(Function1 dl): basicForEachType(typeid(T**),sizeof(T**), // new E_F1_funcT(UnRef),atype(), new E_F1_funcT_Type(atype(),this,UnRef),atype(), ::InitializePtr,dl){} /* class FuncForEachType : public basicForEachType {public: FuncForEachType(const basicForEachType * t); const basicForEachType * rtype; }; */ /* inline basicForEachType::basicForEachType(const type_info & k, const type_info & kf, const size_t s, const E_F1_funcT_Type * p, basicForEachType *rr, Function1 iv,Function1 id) : ktype(&k),ktypefunc(&kf), size(s), un_ptr(p), un_ptr_type(rr?rr:this), InitExp(iv), destroy(id) , funct_type(new FuncForEachType(this)){} */ inline C_F0 & operator+=(C_F0 & a,C_F0 &b) { C_F0 r = C_F0(TheOperators,"+",a,b); a=r; return a; } template void Dcl_TypeandPtr_ (Function1 i,Function1 d,Function1 pi,Function1 pd,Function1 OnReturn=0,Function1 pOnReturn=0) { map_type[typeid(T).name()] = new ForEachType(i,d,OnReturn); map_type[typeid(PT).name()] = new ForEachTypePtr(pi,pd,pOnReturn); } template void Dcl_TypeandPtr (Function1 i,Function1 d,Function1 pi,Function1 pd,Function1 OnReturn=0,Function1 pOnReturn=0) { map_type[typeid(T).name()] = new ForEachType(i,d,OnReturn); map_type[typeid(T*).name()] = new ForEachTypePtr(pi,pd,pOnReturn); } template void Dcl_TypeandPtr (Function1 pi,Function1 pd) { map_type[typeid(T).name()] = new ForEachType(); map_type[typeid(T*).name()] = new ForEachTypePtr(pi,pd); } template void Dcl_TypeandPtr (Function1 pd) { map_type[typeid(T).name()] = new ForEachType(); map_type[typeid(T*).name()] = new ForEachTypePtr(pd); } template void Dcl_TypeandPtr () { map_type[typeid(T).name()] = new ForEachType(); map_type[typeid(T*).name()] = new ForEachTypePtr(); } template aType Dcl_Type (Function1 iv=0,Function1 id=0,Function1 Onreturn=0) { if (sizeof(T) >sizeof(AnyData)) { cerr << " the type " << typeid(T).name() << " is too large " << sizeof(AnyData) << endl; throwassert(sizeof(T) <=sizeof(AnyData));} return map_type[typeid(T).name()] = new ForEachType(iv,id,Onreturn); } template void Add(const char * k,const char * op,OneOperator *p0,OneOperator *p1=0, OneOperator *p2=0,OneOperator *p3=0,OneOperator *p4=0, OneOperator *p5=0,OneOperator *p6=0) {atype()->Add(k,op,p0,p1,p2,p3,p4,p5,p6);} inline C_F0 operator *(const C_F0 &a,const C_F0 &b) { return a==*pOne ? b : ( b ==*pOne ? a : C_F0(TheOperators,"*",a,b)) ;} inline C_F0 operator+(const C_F0 &a,const C_F0 &b){ return C_F0(TheOperators,"+",a,b);} inline C_F0 operator-(const C_F0 &a,const C_F0 &b){ return C_F0(TheOperators,"-",a,b);} /// <> inline C_F0 &operator +=(C_F0 &a,const C_F0 &b) { C_F0 r=C_F0(TheOperators,"+",a,b); a=r; return a;} //inline bool CC_F0::Empty() const {return !f || f->Empty();} inline void CC_F0::operator=(const CListOfInst& c) { C_F0 cc=c;f=cc.f;r=cc.r;} inline CListOfInst & CListOfInst::operator+=(const CC_F0 & a) { if( !a.Empty()){ f->Add(a);r=a.left();};return *this;} inline Type_Expr basicForEachType::SetParam(const C_F0 & ,const ListOfId * ,size_t & ) const { cerr << " int basicForEachType " << name() << endl; InternalError("basicForEachType::SetParam non defined"); }//return make_pair(c.left(),c.LeftValue());} /* // --- pour les cast ------ class OneOpCast: public OneOperator { typedef const E_F1_funcT_Type * CastFunc; CastFunc f; public: E_F0 * code(const basicAC_F0 & args) const { return new E_F0_Func1(f->f,args[0]);} OneOpCast(CastFunc ff): OneOperator(ff->r,ff->a),f(ff){} }; */ // inline bool basicForEachType::CastingFrom(aType t) const { throwassert( t); if ( t == this) return true; else if( t == type_C_F0 ) return true; // FH do work .... 09 / 2012 (use of ellispe ...) return casting->FindSameR(ArrayOfaType(t,false)); } inline void CerrCast(const pair & i) { cerr << "\t" << *i.first << ":" << i.second << endl; } inline C_F0 basicForEachType::CastTo(const C_F0 & e) const { throwassert(this); aType t = e.left(); if (this== t) return e; C_F0 ce=e; basicAC_F0 at; at=ce; OneOperator * opcast =casting->FindSameR(ArrayOfaType(t,false)); if ( opcast ) if ( *opcast == at ) // left value return C_F0(opcast->code(at),this); else { // rigth value aType tr = e.right(); ce = C_F0(e.RightValue(),tr); at = ce; return C_F0(opcast->code(at),this); } else { cerr << "Impossible to cast " << *e.left() << " in " << *this << endl; if (casting) casting->Show(cerr) ; CompileError();} return C_F0(); } inline Expression basicForEachType::RightValueExpr(Expression f) const { if (un_ptr) return new E_F0_Func1(un_ptr->f,f); else return f; } inline void CompileError(string msg,aType r){ string m= r ? msg + " type: " + r->name() : msg ; lgerror(m.c_str()); } inline void ExecError(string msg){ // cerr << "Fatal ExecError: " << msg << endl; throw(ErrorExec(msg.c_str(),1)); } const Function1 NotReturnOfthisType = reinterpret_cast(1); inline Expression basicForEachType::OnReturn(Expression f) const { if(!DoOnReturn) return f; else if(DoOnReturn== NotReturnOfthisType ) CompileError("Problem when returning this type (sorry work in progress FH!) ", this); else return new E_F0_Func1(DoOnReturn,f); return 0; } inline void CC_F0::operator=(const AC_F0& a) { f=new E_Array(a); r= atype();}; inline UnId::UnId(const char * idd,const C_F0 & ee,aType rr=0,bool reff=false) :id(idd),r(rr),e(ee),array(0),re(ee.left()) ,ref(reff){} class E_exception : public exception { public: enum CODE_exception { UNKNOWN,e_break,e_continue,e_return} ; CODE_exception code; AnyType r; // for return public: E_exception(CODE_exception c,AnyType rr=Nothing) : code(c),r(rr) {} const int type() {return code;} virtual const char * what() const throw() { return "E_exception (break,continue or return) "; } ~E_exception() throw() {} }; class E_throw : public E_F0mps { public: E_exception::CODE_exception kind; Expression ret; // return value E_throw(E_exception::CODE_exception c,Expression e=0) :kind(c),ret(e) {} AnyType operator()(Stack s) const { (ret ? throw(E_exception(kind,(*ret)(s))) : throw(E_exception(kind))); return Nothing; } operator aType () const { return atype();} } ; class E_block : public E_F0mps { public: const int n; Expression * code; int * linenumber; Expression clean; E_block(CListOfInst l,C_F0 c) : n(l.size()),code(l.ptr()),linenumber(l.nlines()),clean(c) {} E_block( C_F0 l,C_F0 c) : n(1),code(new Expression),clean(c) { code[0]=l;} AnyType operator()(Stack s) const ; operator aType () const { return atype();} }; class Routine; class E_Routine : public E_F0mps { public: Expression code; Expression clean; aType rt; int nbparam; Expression * param; const char * name; E_Routine(const Routine * routine,const basicAC_F0 & args); AnyType operator()(Stack s) const; ~E_Routine() ;//{ delete [] param;} modif del for windows private: E_Routine(const E_Routine &); void operator=(const E_Routine &); operator aType () const{ return rt;} }; /// <> used in [[file:../lglib/lg.ypp::YYSTYPE]] class Routine: public OneOperator{ public: size_t offset; aType tfunc,tret; const char * name; const ListOfId param; Block * currentblock; Expression ins; Expression clean; E_F0 * code(const basicAC_F0 & args) const ; Routine(aType tf,aType tr,const char * iden, ListOfId *l,Block * & cb); Block * Set(C_F0 instr) ; }; class TypeLineFunction: public ForEachType { public: TypeLineFunction() : ForEachType(0,0) {} void SetArgs(const ListOfId *lid) const { if (lid) CompileError("No Argument in line function"); } Type_Expr SetParam(const C_F0 & c,const ListOfId *l,size_t & top) const { return Type_Expr(c.left(),c.LeftValue()); } C_F0 Initialization(const Type_Expr & ) const { return C_F0(); } // nothing to initialize }; class E_F0_Optimize : public E_F0 { deque > l; // mutable deque var; MapOfE_F0 m; int NBbitem; int ret; public: E_F0_Optimize(deque > &ll,MapOfE_F0 & mm,int rett) : l(ll),m(mm),NBbitem(1),ret(rett) {} int sizevar() const {return l.size();} AnyType eval(Stack s,int notinit,bool * unvar) const { int k= l.size(),kk=0; if(notinit ==0) { //var.resize(k); for (int i=0;i(s,offset) = l[i].first->eval(s, unvar[i]); if( unvar[i]) kk++; } if (verbosity/100 && verbosity % 10 == 2) cout << "E_F0_Optimize nb MI exp: " << kk << " / " << k << endl; } else for (int i=0;i(s,offset) = (*l[i].first)(s); //*static_cast(static_cast((char*)s+offset))= (*l[i].first)(s); // FH NEWSTACK // cout << " E_F0_Optimize " << offset << " " << *static_cast(static_cast((char*)s+offset)) << endl; ; } // return *static_cast(static_cast((char*)s+ret)); return *Stack_offset(s,ret); // FH NEWSTACK } virtual AnyType operator()(Stack s) const { int k= l.size(); for (int i=0;i(s,offset) = (*l[i].first)(s); //*static_cast(static_cast((char*)s+offset))= (*l[i].first)(s); // FH NEWSTACK // cout << " E_F0_Optimize " << offset << " " << *static_cast(static_cast((char*)s+offset)) << endl; ; } // return *static_cast(static_cast((char*)s+ret)); return *Stack_offset(s,ret); // FH NEWSTACK } virtual bool Empty() const {return l.size(); } // virtual E_F0 * destroy(Stack ) const {return 0;} // virtual const E_F0 * Parameter(Stack ) const {return this;} virtual size_t nbitem() const { return NBbitem;} virtual bool EvaluableWithOutStack() const {return false;} // virtual bool MeshIndependent() const {return false;} // virtual E_F0 * right_E_F0() const { return 0;} virtual ~E_F0_Optimize() {} // virtual int compare (const E_F0 *t) const { return t-this;} // to give a order in instuction virtual operator aType () const { return *(l.back().first);} // the type of the expression }; inline int E_F0::find(const MapOfE_F0 & m) { // exp // cout << " ffff :" ; MapOfE_F0::const_iterator i= m.find(this); if(i != m.end()) { if( (verbosity / 100)% 10 == 1) { cout << "\n find : "; cout << i->second << " mi=" ; cout << MeshIndependent() << " " ; cout << typeid(*this).name() ; cout << " cmp = " << compare(i->first) ; cout << " " << i->first->compare(this) << " "; dump(cout); } assert( compare(i->first) == 0); } return i == m.end() ? 0 : i->second ; } inline int E_F0::insert(Expression opt,deque > &l,MapOfE_F0 & m, size_t & n) { int rr=align8(n); pair p(this,rr); if( (verbosity / 100)% 10 == 1) cout << " -- insert opt " << n << " " << *this << endl; n += sizeof(AnyType); l.push_back(make_pair((Expression)opt,(int)rr)); m.insert(p); return rr; } extern vector > * debugstack; struct NothingType { // a type to do nothing NothingType() {}; }; extern basicForEachType * typevarreal, * typevarcomplex; // type of real and complex variable void initArrayOperators(); void initArrayDCL(); void ClearMem(); // <> inline C_F0 OneOperator::code2(const basicAC_F0 &a) const {return C_F0(code(a),r);} template class OneOperator0 : public OneOperator {public: class E_F0_F :public E_F0 { public: typedef R (*func)( ) ; func f; E_F0_F(func ff) : f(ff) {} AnyType operator()(Stack ) const {return SetAny( f()) ;} operator aType () const { return atype();} }; // aType r; // return type typedef R (*func)() ; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new E_F0_F(f);} OneOperator0(func ff): OneOperator(map_type[typeid(R).name()]),f(ff){} }; template Type_Expr CVariable(R (*ff)() ) { throwassert(map_type[typeid(R).name()]); return make_pair(map_type[typeid(R).name()],new typename OneOperator0::E_F0_F(ff)); } #endif freefem++-3.38-1/src/fflib/AFunction2.cpp000644 000767 000024 00000071265 12520446707 020153 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //#pragma dont_inline on //#pragma inline_depth(1) #include "config-wrapper.h" #include #include "AFunction.hpp" #include #include #include "error.hpp" #include "lex.hpp" #include "RNM.hpp" #include "Operator.hpp" // for exec routine #include "rgraph.hpp" #include "InitFunct.hpp" vector > *debugstack=0; class vectorOfInst : public E_F0mps { public: int n; Expression * v; vectorOfInst(int k): n(k),v(new Expression[k]) {ffassert(v); for(int i=0;inext) if (oo->pref>=p && oo->WithOutCast(at)) { if(ppref) {nn=0;p=oo->pref;} nn++; w=oo;} if (nn) return make_pair(w,nn);*/ for (int ncast=0;ncast<=n;ncast++) // loop on the number of cast { p=-10000; for (oo=this;oo;oo=oo->next) if (oo->pref>=p && oo->WithCast(at,ncast)) { if(ppref) {nn=0;p=oo->pref;} nn++; w=oo;} if (nn) return make_pair(w,nn); } for (oo=this;oo;oo=oo->next) if (oo->WithCast(at)) {nn++; w=oo;} return make_pair(w,nn); } OneOperator::pair_find OneOperator::FindWithOutCast(const ArrayOfaType & at)const { const OneOperator *w=0,*oo; int n=0; for (oo=this;oo;oo=oo->next) if (oo->WithOutCast(at)) {n++; w=oo;} return make_pair(w,n); } OneOperator* OneOperator::FindSameR(const ArrayOfaType & at) { if (this==tnull) return 0; OneOperator *oo,*r; int n=0; for (oo=this;oo;oo=oo->next) { //if (oo->WithOutCast(at)) if (at==*oo) n++,r=oo; else if (oo->WithOutCast(at)) n++,r=oo; // if (n) cout << " \t " << oo << " " << *oo << " <-----> " << at << " n =" << n << endl; } // if (n>1) cout << "FindSameR " << n << endl; // if (n) cout << *r << " <-----> " << at << " n =" << n << endl; return n==1 ? r : 0; } void OneOperator::Show(ostream &f) const { const OneOperator *oo; for (oo=this;oo;oo=oo->next) f << "\t (" << *oo << ")\n"; } void OneOperator::Show(const ArrayOfaType & at,ostream &f) const { const OneOperator *oo; int n=0,np=0; for (oo=this;oo;oo=oo->next) if (oo->WithOutCast(at)) {n++;f << "\t (" << *oo << ")\n";} if(n==0) for (oo=this;oo;oo=oo->next) if (oo->WithCast(at)) { n++; if (oo->pref) np++; if (oo->pref) f << " c(" << oo->pref << ") \t (" << *oo << ")\n" ; else f << " \t c(" << *oo << ")\n"; } if (n==0) { f << " List of choices "<< endl; Show(f); } else if (np != 1) f << " We have ambiguity " << n << endl; } const OneOperator * Polymorphic::Find(const char *op, const ArrayOfaType &at) const { const_iterator i=m.find(op); if (i!=m.end()) { OneOperator::pair_find r=i->second->Find(at); if (r.second==1) return r.first; } return 0; } const OneOperator * Polymorphic::FindWithOutCast(const char *op, const ArrayOfaType &at) const { const_iterator i=m.find(op); if (i!=m.end()) { OneOperator::pair_find r=i->second->FindWithOutCast(at); if (r.second==1) return r.first; } return 0; } void Polymorphic::Show(const char *op,const ArrayOfaType & at,ostream &f) const { const_iterator i=m.find(op); if (i==m.end()) f << " unknow " << op << " operator " << endl; else i->second->Show(at,f); } // <> cf [[file:AFunction.hpp::C_F0_constructor_pop_char_basicAC_F0_decl]] C_F0::C_F0(const Polymorphic * poly,const char *op,const basicAC_F0 & p) { ArrayOfaType at(p); if (poly) { // a Polymorphic => polymorphisme const OneOperator * ff=poly->Find(op,at); if (ff) { /* cout << endl; poly->Show(op,at,cout); cout << op << ": (in " << at << ") => " << " " << *ff<< "\n\n";*/ // [[file:AFunction.hpp::OneOperator_code2]] *this= ff->code2(p); } else { if(mpirank==0) { cerr << " error operator " << op << " " << at << endl; poly->Show(op,at,cerr); // const OneOperator * ff= poly->Find(op,at); } CompileError(); } } else { // no polymorphisme if(mpirank==0){ cerr << " const Polymorphic * poly,const char *op,const basicAC_F0 & p) " << endl; cerr << op << " " << at << endl; } CompileError(); } } // operator without parameter C_F0::C_F0(const Polymorphic * pop,const char *op) { basicAC_F0 p; p=0; *this= C_F0(pop,op,p); } // operator unaire C_F0::C_F0(const Polymorphic * pop,const char *op,const C_F0 & aa) { basicAC_F0 p; C_F0 a(aa); p=a; *this= C_F0(pop,op,p); } // <> operator binaire C_F0::C_F0(const Polymorphic * pop,const char *op,const C_F0 & a,const C_F0 & b) { C_F0 tab[2]={a,b}; basicAC_F0 p; p=make_pair(2,tab); // [[file:AFunction.hpp::C_F0_constructor_pop_char_basicAC_F0_decl]] *this=C_F0(pop,op,p); } // operator trinaire C_F0::C_F0(const Polymorphic * pop,const char *op,const C_F0 & a,const C_F0 & b,const C_F0 & c) { C_F0 tab[3]={a,b,c}; basicAC_F0 p; p=make_pair(3,tab); *this= C_F0(pop,op,p); } OneOperator::~OneOperator(){ OneOperator * d=next; next=0; if(! CodeAlloc::cleanning) // hash FH (pour les fuite de mmoire) while(d) { OneOperator * dd=d->next; d->next=0; delete d; d=dd; } } OneOperator::OneOperator(aType rr) : ArrayOfaType(),r(rr),next(0),pref(0) {throwassert(r);} OneOperator::OneOperator(aType rr,aType a) : ArrayOfaType(a,false),r(rr),next(0),pref(0) {throwassert(rr && a );} OneOperator::OneOperator(aType rr,aType a,aType b) : ArrayOfaType(a,b,false),r(rr),next(0),pref(0) { throwassert(rr && a && b);} OneOperator::OneOperator(aType rr,aType a,aType b,aType c) : ArrayOfaType(a,b,c,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c);} OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d) : ArrayOfaType(a,b,c,d,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c);} OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e) : ArrayOfaType(a,b,c,d,e,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c && d);} // Added by Fabian Dortu (5 parameters) OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f) : ArrayOfaType(a,b,c,d,e,f,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f);} // Added by Fabian Dortu (6 parameters) OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g) : ArrayOfaType(a,b,c,d,e,f,g,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g);} // Added by Fabian Dortu (7 parameters) OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g, aType h) : ArrayOfaType(a,b,c,d,e,f,g,h,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g && h);} // Added by Fabian Dortu (8 parameters) OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g, aType h, aType i) : ArrayOfaType(a,b,c,d,e,f,g,h,i,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g && h && i);} // Added by Fabian Dortu (9 parameters) OneOperator::OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f, aType g, aType h, aType i, aType j) : ArrayOfaType(a,b,c,d,e,f,g,h,i,j,false),r(rr),next(0),pref(0) {throwassert(rr && a && b && c && d && e && f && g && h && i && j);} // Added by Fabian Dortu (10 parameters) OneOperator::OneOperator(aType rr,const ArrayOfaType &ta) : ArrayOfaType(ta),r(rr),next(0),pref(0) {throwassert(rr);} OneOperator::OneOperator(aType rr,bool ellipse) : ArrayOfaType(ellipse),r(rr),next(0),pref(0) {throwassert(rr );} OneOperator::OneOperator(aType rr,const ListOfId *l) : ArrayOfaType(l),r(rr),next(0),pref(0) {throwassert(rr );} void Polymorphic::Addp(const char * op,Value pp,...) const { pair p=m.insert(pair(op,pp)); Value f= p.first->second; if (!p.second) // not insert => old *f += *pp; va_list ap; va_start(ap,pp); for(pp=va_arg(ap,OneOperator * );pp;pp=va_arg(ap,OneOperator * )) *f += *pp; /* if ( ! strlen(op) ) { // no polymorphisme if(m.size() !=1 || !f->Simple()) { cerr << " no polymorphisme and polymorphisme are mixed " << endl; // for_each(m.begin,m.end(),ShowOn_cerr); CompileError(); } } */ } void Polymorphic::Add(const char * op,Value *pp) const { if (*pp) { pair p=m.insert(pair(op,*pp)); Value f= p.first->second; if (!p.second) // not insert => old *f += **pp; pp++; for(;*pp;pp++) *f += **pp; /*if ( ! strlen(op) ) { // no polymorphisme if(m.size() !=1 || !f->Simple()) { cerr << " no polymorphisme and polymorphisme are mixed " << endl; // for_each(m.begin,m.end(),ShowOn_cerr); CompileError(); } } */ } } int FindType(const char * name) { C_F0 r; ListOfTOfId::const_iterator i=tables_of_identifier.begin(); for(;i!=tables_of_identifier.end();++i) { TableOfIdentifier * ti=*i; r = ti->Find(name); if (r.NotNull()) return r.TYPEOFID(); } return 0; } /// <> uses [[file:global.cpp::tables_of_identifier]] C_F0 Find(const char * name) { C_F0 r; ListOfTOfId::const_iterator i=tables_of_identifier.begin(); for(;i!=tables_of_identifier.end();++i) { TableOfIdentifier * ti=*i; r = ti->Find(name); if (r.NotNull()) return r; } if(mpirank==0) cerr << " The Identifier " << name << " does not exist " << endl; CompileError(); return r; } C_F0 TableOfIdentifier::destroy() { int k=0; // cout << "\n\t List of destroy variables " << m.size() << " : " ; for (pKV * i=listofvar;i;i=i->second.next) { if (i->second.del && i->second.first->ExistDestroy() ) // cout << i->first << ", " ; assert(i->second.first); if (i->second.del && i->second.first->ExistDestroy() ) k++; } // cout << endl; /* old code ListOfInst *l=new ListOfInst(k); for (pKV * i=listofvar;i;i=i->second.next) if (i->second.del && i->second.first->ExistDestroy()) l->Add(i->second.first->Destroy(i->second) ); */ // new code vectorOfInst * l= new vectorOfInst(k); int j=0; for (pKV * i=listofvar;i;i=i->second.next) if (i->second.del && i->second.first->ExistDestroy()) l->v[j++]=i->second.first->Destroy(i->second) ; ffassert(j==k); return C_F0(l); } void TableOfIdentifier::clear() { for (iterator i=m.begin();i!=m.end();++i) { // delete i->first; } m.clear(); } Expression basicForEachType::Destroy(const C_F0 & e) const { return destroy ? NewExpression(destroy,e) : (Expression) e; } basicForEachType::~basicForEachType() { if(casting) delete casting; ti.clear(); } basicForEachType::basicForEachType(const type_info & k, const size_t s, const E_F1_funcT_Type * p, basicForEachType *rr, Function1 iv,Function1 id, Function1 dreturn) : ktype(&k),//ktypefunc(0), size(s), un_ptr_type(rr?rr:this), casting(0), // no casting to un_ptr(p), InitExp(iv), DoOnReturn(dreturn), //funct_type(0), destroy(id) {} void basicForEachType::SetArgs(const ListOfId *lid) const { SHOWVERB(cout << "SetArgs::\n ") ;ffassert(lid==0 || lid->size()==0);} TableOfIdentifier::TableOfIdentifier() : listofvar(0) {} TableOfIdentifier:: ~TableOfIdentifier() {} Block::Block(Block * f):fatherblock(f),top(f?f->top:BeginOffset*sizeof(void*)),topmax(top) { itabl=tables_of_identifier.insert(tables_of_identifier.begin(),&table); } Block::~Block(){} CC_F0 Block::close(Block *& c) { tables_of_identifier.erase(itabl); c=fatherblock; if (fatherblock) {fatherblock->topmax=topmax; fatherblock->top=top;} CC_F0 r; r = table.destroy(); delete this; return r;} Block * Block::open(Block *& cb) { return cb = new Block(cb); } const Type_Expr & TableOfIdentifier::New(Key k,const Type_Expr & v,bool del) { if( this != &Global) { if ( Global.m.find(k) != Global.m.end() ) { if(mpirank==0) cerr << "\n *** Warning The identifier " << k << " hide a Global identifier \n"; } } pair p=m.insert(pKV(k,Value(v,listofvar,del))); listofvar = &*m.find(k); if (!p.second) { if(mpirank==0) { cerr << " The identifier " << k << " exists \n"; cerr << " \t the existing type is " << *p.first->second.first << endl; cerr << " \t the new type is " << *v.first << endl; } CompileError(); } return v; } void TableOfIdentifier::Add(Key k,Key op,OneOperator *p0,OneOperator *p1, OneOperator *p2,OneOperator *p3,OneOperator *p4,OneOperator *p5,OneOperator *p6) { iterator i= m.find(k); if (i==m.end()) // new { Value poly0=Value(atype(),new Polymorphic(),listofvar); i=m.insert(pair(k,poly0)).first; listofvar= &*i; } const Polymorphic * p= dynamic_cast(i->second.second); if ( !p) { if(mpirank==0) cerr << k << " is not a Polymorphic id " << endl; CompileError(); } p->Add(op,p0,p1,p2,p3,p4,p5,p6); } ArrayOfaType::ArrayOfaType(const ListOfId * l) : n(l->size()),t(new aType[n]),ellipse(false) { for (int i=0;i a.n) ) return false; for (int i=0;iSametypeRight(t[i])) return false; // cerr << " TRUE " << endl; return true; } bool ArrayOfaType::WithCast( const ArrayOfaType & a,int nbcast) const { if ( ( !ellipse && (a.n != n)) || (ellipse && n > a.n) ) return false; for (int i=0;iSametypeRight(t[i])) ; else if (! t[i]->CastingFrom(a.t[i])) return false; else if ( --nbcast <0) return false; return true; } void basicForEachType::AddCast(CastFunc f1,CastFunc f2,CastFunc f3,CastFunc f4, CastFunc f5,CastFunc f6,CastFunc f7,CastFunc f8) { CastFunc ff[]={f1,f2,f3,f4,f5,f6,f7,f8,0}; for (int i=0;ff[i];i++) { ffassert(this == *ff[i] ); if (casting->FindSameR(*ff[i])) { if(mpirank==0) { cerr << " The casting to " << *ff[i] << " exists " << endl; cerr << " List of cast " << endl; casting->Show(cerr); } CompileError(); } if (casting) *casting += *ff[i]; else casting = ff[i]; /* if( ! mapofcast.insert(make_pair(ff[i]->a,ff[i])).second) { cerr << " The casting to "<< *this << " from " << ff[i]->a << " exists " << endl; cerr << " List of cast " << endl; for_each(mapofcast.begin(),mapofcast.end(),CerrCast); CompileError(); } */ } } ostream & operator<<(ostream & f,const OneOperator & a) { // for(const OneOperator * tt=&a;tt;tt=tt->next) f << "\t " << * (a.r) << " : " <<(const ArrayOfaType &) a; return f; } ostream & operator<<(ostream & f,const Polymorphic & a) { Polymorphic::const_iterator i; if(&a==E_F0::tnull) return f << "Null " << endl; for (i=a.m.begin();i!=a.m.end();i++) { f << " operator" << i->first << " : " << endl; i->second->Show(f); } return f; } ostream & operator<<(ostream & f,const ArrayOfaType & a) { for (int i=0;isecond; f << i->first << ": " << *v.first << " <- " ; const Polymorphic * p=dynamic_cast(v.second); if(p) f << "Polymorphic " << *p << endl; else f << " Simple @" << v.second << endl; } return f; } Expression NewExpression(Function1 f,Expression a) { ffassert(f); return new E_F0_Func1(f,a); } Expression NewExpression(Function2 f,Expression a,Expression b) { ffassert(f); return new E_F0_Func2(f,a,b); } void ShowType(ostream & f) { map::const_iterator i; for(i=map_type.begin();i!=map_type.end();i++) { f << " --"<< i->first <<" = " ; i->second->Show(f) ; f << endl; } } void basicForEachType::Show(ostream & f) const { f << " " <<* this << endl; if (casting) casting->Show(f) ; if (ti.m.size()) { TableOfIdentifier::const_iterator mc=ti.m.begin(); TableOfIdentifier::const_iterator end=ti.m.end(); for (;mc != end;mc++) { f << " " << mc->first << ", type :" << *mc->second.first << endl; const Polymorphic * op =dynamic_cast(mc->second.second) ; if ( op ) f << *op << endl; } } } E_Routine::E_Routine(const Routine * routine,const basicAC_F0 & args) : code(routine->ins), clean(routine->clean), rt(routine->tret), nbparam(args.size()), param(new Expression[nbparam]), name(routine->name) { assert(routine->ins); for (int i=0;iparam[i].r << " <- " << *args[i].left() << endl; param[i]=routine->param[i].r->CastTo(args[i]); } }; E_Routine::~E_Routine() { delete [] param;} struct CleanE_Routine { const E_Routine * er; Stack s; AnyType * l; CleanE_Routine(const E_Routine * r,Stack ss,AnyType *ll): er(r),s(ss),l(ll) {} ~CleanE_Routine() { // cout << " Clean E_routine " << er <clean)(s); delete [] l; } }; AnyType E_Routine::operator()(Stack s) const { //cout << " E_Routine:: push " <size() << endl; debugstack->push_back(pair(this,TheCurrentLine)); const int lgsave=BeginOffset*sizeof(void*); char save[lgsave]; AnyType ret=Nothing; memcpy(save,s,lgsave); // save AnyType *listparam; // Add2StackOfPtr2Free(s,new CleanE_Routine(this,s,listparam=new AnyType[nbparam])); Add2StackOfPtr2FreeA(s,listparam=new AnyType[nbparam]); // AnyType *listparam =Add2StackOfPtr2FreeA(s,new AnyType[nbparam]); // // WhereStackOfPtr2Free(s)->Add2StackOfPtr2Free(s,listparam); // to day the memory gestion of the local variable are static, for (int i=0;i(s,ParamPtrOffset) = listparam; WhereStackOfPtr2Free(s)=new StackOfPtr2Free(s);// FH mars 2006 try { ret=(*code)(s); } catch( E_exception & e) { // cout << " catch " << e.what() << " clean & throw " << endl; if (e.type() == E_exception::e_return) ret = e.r; else ErrorExec("E_exception: break or contine not in loop ",1); } catch(...) { // clean and rethrow the exception //::delete [] listparam; (*clean)(s); WhereStackOfPtr2Free(s)->clean(); // FH mars 2005 memcpy(s,save,lgsave); // restore TheCurrentLine=debugstack->back().second; debugstack->pop_back(); // cout << " E_Routine:: ... pop " <size() << endl; throw ; } (*clean)(s); // the clean is done in CleanE_Routine delete . // delete [] listparam; after return memcpy(s,save,lgsave); // restore TheCurrentLine=debugstack->back().second; debugstack->pop_back(); // cout << " E_Routine:: pop " <size() << endl; // il faudrait que les variable locale soit detruire apres le return // cf routine clean, pour le cas ou l'on retourne un tableau local. // plus safe ????? FH. (fait 2008) // mais pb si a = f()+g() OK les pointeurs des instruction sont detruit // en fin d'instruction programme de l'appelant FH 2007 // ... ou alors changer le return ???? qui doit copie le resultat.. (voir) return ret; } void ListOfInst::Add(const C_F0 & ins) { if( (!ins.Empty()) ) { if (n%nx==0){ Expression * l = new Expression [n+nx]; int * ln = new int [n+nx]; for (int i=0;i> Iteratively calls each item in the local array #list of type #Expression AnyType ListOfInst::operator()(Stack s) const { AnyType r; double s0=CPUtime(),s1=s0,ss0=s0; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(s); try { // modif FH oct 2006 for (int i=0;iclean(); // modif FH mars 2006 clean Ptr s1=CPUtime(); if (showCPU) cout << " CPU: "<< i << " " << s1-s0 << "s" << " " << s1-ss0 << "s" << endl; s0=CPUtime(); } } catch( E_exception & e) { if (e.type() != E_exception::e_return) sptr->clean(); // pour ne pas detruire la valeur retourne ... FH jan 2007 throw; // rethow } catch(...) { sptr->clean(); throw; } return r;} AnyType E_block::operator()(Stack s) const { StackOfPtr2Free * sptr = WhereStackOfPtr2Free(s); if (clean) { try { for (int i=0;iclean(); }} catch( E_exception & e) { (*clean)(s); if (e.type() != E_exception::e_return) sptr->clean(); throw; // rethow } catch(/* E_exception & e*/...) { // catch all for cleanning (*clean)(s); sptr->clean(); // if(verbosity>50) // cout << " catch " << e.what() << " clean & throw " << endl; // throw(e); throw; // rethow } (*clean)(s); sptr->clean(); } else // not catch exception if no clean (optimization} for (int i=0;iclean(); // mars 2006 FH clean Ptr } return Nothing; } void ShowDebugStack() { if (mpisize) cerr << " current line = " << TheCurrentLine << " mpirank " << mpirank << " / " << mpisize <at(i).first->name<< " at line " <at(i).second << endl; } } int E_F0::Optimize(deque > &l,MapOfE_F0 & m, size_t & n) { int rr = find(m); if (rr) return rr; if( (verbosity / 10)% 10 == 1) cout << "\n new expression : " << n << " mi=" << MeshIndependent()<< " " << typeid(*this).name() << " :" << *this << endl; return insert(this,l,m,n); } class E_F0para :public E_F0 { public: const int i; AnyType operator()(Stack s) const { // return (* Stack_Ptr(s,ParamPtrOffset)[i])(s); return Stack_Ptr(s,ParamPtrOffset)[i]; } E_F0para(int ii) : i(ii){} }; Routine::Routine(aType tf,aType tr,const char * iden, ListOfId *l,Block * & cb) : OneOperator(tr,l),offset(cb->OffSet(sizeof(void*))), tfunc(tf),tret(tr),name(iden),param(*l), currentblock(new Block(cb)),ins(0),clean(0) { delete l; // add FH 24032005 (trap ) cb = currentblock; // cout <<"Routine: tf = " << *tf << " " << *tr << endl; for (size_t i=0;iright() << endl; currentblock->NewID(param[i].r,param[i].id,C_F0(new E_F0para(i),// modif FH 2007 param[i].r), // (param[i].ref ? param[i].r : param[i].r->right() ), !param[i].ref); } } Block * Routine::Set(C_F0 instrs) { ins=instrs; clean = (C_F0) currentblock->close(currentblock); return currentblock;} E_F0 * Routine::code(const basicAC_F0 & args) const { return new E_Routine(this,args); } void basicAC_F0::SetNameParam(int n,name_and_type *l , Expression * e) const { int k=0; if ( !n && !named_parameter) return; for (int i=0;iname()] ) { if(mpirank==0) { cerr << " missing ff type: '" <name() << "' "<< map_type.size() << "\n"; cerr << "i= " << i << "\n"; } InternalError(" missing type "); assert(map_type[l[i].type->name()]); } e[i]= map_type[l[i].type->name()]->CastTo(ce); k++; } } if (!named_parameter) return; if ((size_t) k!= named_parameter->size()) { cout << " Sorry some name parameter are not used! found" << k << " == " << named_parameter->size() <begin(); ii != named_parameter->end();ii++) { for (int i=0;ifirst)) goto L1; cout << "\t the parameter is '" << ii->first << "' is unused " << endl; L1:; } if ( n && mpirank==0) { cerr << " The named parameter can be " << endl; for (int i=0;iname() << ">\n"; } CompileError("Unused named parameter"); } } // change FH to bluid .dll void lgerror (const char* s) { if(mpirank==0) { cerr << endl; cerr <<" Error line number " << zzzfff->lineno() << ", in file " << zzzfff->filename() <<", before token " <YYText() << endl << s << endl; } throw(ErrorCompile(s,zzzfff->lineno(),zzzfff->YYText() )); } freefem++-3.38-1/src/fflib/AFunction_ext.hpp000644 000767 000024 00000056320 12514250615 020743 0ustar00hechtstaff000000 000000 // In order to use functions with the stack and 2 parameters , and more new classes (OneOperator2s_, OneOperator3s_, etc.) must // In order to use functions with more than 3 parameters, new classes (OneOperator4_, OneOperator5_, etc.) must // be defined. See example code in include/AFunction.hpp // Two classes must be defined (here we show an example for a function accepting 4 arguments): // // class OneOperator4_ // class E_F_F0F0F0F0_ // // Note: in file includeAFunction.hpp, the class "OneOperator" (around line 400) mut be modified. // ************************************************ // Add F. Hecht oct 2009 // **** 2 paramters with the stack // class OneOperator2s_ // class E_F_F0F0s_ #ifndef AFUNCTION_EXT_HPP__ #define AFUNCTION_EXT_HPP__ template // extend (4th arg.) class E_F_F0F0s_ :public E { public: // extend typedef R (*func)(Stack s,const A0 &,const A1 & ) ; // extend (statck +2th arg.) func f; Expression a0,a1; // extend E_F_F0F0s_(func ff, Expression aa0, Expression aa1) : f(ff), a0(aa0), a1(aa1) {} // extend (2th arg.) AnyType operator()(Stack s) const {return SetAny( f( s, GetAny((*a0)(s)), GetAny((*a1)(s)) ) );} // extend (2th arg.) virtual size_t nbitem() const {return a1->nbitem(); } // modif ??? bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent() ;} // extend (2th arg.) }; template > // extend (4th arg.) class OneOperator2s_ : public OneOperator { // aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]));} // extend OneOperator2s_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()]), // extens f(ff){} }; // **** 2 paramters with the stack // class OneOperator2s_ // class E_F_F0F0s_ template // extend (4th arg.) class E_F_F0F0F0s_ :public E { public: // extend typedef R (*func)(Stack s,const A0 &,const A1 &,const A2 & ) ; // extend (statck +2th arg.) func f; Expression a0,a1,a2; // extend E_F_F0F0F0s_(func ff, Expression aa0, Expression aa1, Expression aa2) : f(ff), a0(aa0), a1(aa1), a2(aa2) {} // extend (2th arg.) AnyType operator()(Stack s) const {return SetAny( f( s, GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)) ) );} // extend (3th arg.) virtual size_t nbitem() const {return a2->nbitem(); } // modif ??? bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent() && a2->MeshIndependent() ;} // extend (2th arg.) }; template > // extend (3th arg.) class OneOperator3s_ : public OneOperator { // aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]));} // extend OneOperator3s_(func ff): // 2-> OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()]), // extend f(ff){} }; // *********************************************** // *********************************************** // **** 4 parameters // *********************** template // extend (4th arg.) class E_F_F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 & ) ; // extend (4th arg.) func f; Expression a0,a1,a2,a3; // extend E_F_F0F0F0F0_(func ff, Expression aa0, Expression aa1, Expression aa2, Expression aa3) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3) {} // extend (4th arg.) AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)) ) );} // extend (4th arg.) virtual size_t nbitem() const {return a3->nbitem(); } // modif bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent()&& a3->MeshIndependent();} // extend (4th arg.) }; template > // extend (4th arg.) class OneOperator4_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]));} // extend OneOperator4_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()]), // extens f(ff){} }; template // extend (4th arg.) class E_F_F0F0F0F0s_ :public E { public: // extend typedef R (*func)(Stack, const A0 &,const A1 & , const A2 &, const A3 & ) ; // extend (4th arg.) func f; Expression a0,a1,a2,a3; // extend E_F_F0F0F0F0s_(func ff, Expression aa0, Expression aa1, Expression aa2, Expression aa3) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3) {} // extend (4th arg.) AnyType operator()(Stack s) const {return SetAny( f( s, GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)) ) );} // extend (4th arg.) virtual size_t nbitem() const {return a3->nbitem(); } // modif bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent()&& a3->MeshIndependent();} // extend (4th arg.) }; template > // extend (4th arg.) class OneOperator4s_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]));} // extend OneOperator4s_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()]), // extens f(ff){} }; // *********************************************** // **** 5 parameters // *********************** // // NOTE: add the following line in AFunction.hpp // // OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e) // : r(rr),ArrayOfaType(a,b,c,d,e,false),next(0),pref(0) {throwassert(rr && a && b && c && d);} template // extend AX class E_F_F0F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 &, const A4 & ) ; // extend AX func f; Expression a0,a1,a2,a3,a4; // extend aX E_F_F0F0F0F0F0_(func ff, // extend F0 Expression aa0, Expression aa1, Expression aa2, Expression aa3, Expression aa4) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3), a4(aa4) {} // extend aX AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)), GetAny((*a4)(s)) ) );} // extend aX virtual size_t nbitem() const {return a4->nbitem(); } bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent() && a3->MeshIndependent()&& a4->MeshIndependent();} // extend aX }; template > // extend class OneOperator5_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4]));} // extend OneOperator5_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()], map_type[typeid(E).name()]), // extend f(ff){} }; // *********************************************** // **** 6 parameters // *********************** // // NOTE: add the following line in AFunction.hpp // OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f) // : r(rr),ArrayOfaType(a,b,c,d,e,f,false),next(0),pref(0) {throwassert(rr && a && b && c && d && f);} template // extend AX class E_F_F0F0F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 &, const A4 &, const A5 & ) ; // extend AX func f; Expression a0,a1,a2,a3,a4,a5; // extend aX E_F_F0F0F0F0F0F0_(func ff, // extend F0 Expression aa0, Expression aa1, Expression aa2, Expression aa3, Expression aa4, Expression aa5) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3), a4(aa4), a5(aa5) {} // extend aX AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)), GetAny((*a4)(s)), GetAny((*a5)(s)) ) );} // extend aX virtual size_t nbitem() const {return a5->nbitem(); } bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent() && a3->MeshIndependent()&& a4->MeshIndependent()&& a5->MeshIndependent();} // extend aX }; template > // extend class OneOperator6_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4]), t[5]->CastTo(args[5]));} // extend OneOperator6_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()], map_type[typeid(E).name()], map_type[typeid(F).name()]), // extend f(ff){} }; // *********************************************** // **** 7 parameters // *********************** // // NOTE: add the following line in AFunction.hpp // OneOperator(aType rr,aType a,aType b,aType c,aType d,aType e,aType f) // : r(rr),ArrayOfaType(a,b,c,d,e,f,false),next(0),pref(0) {throwassert(rr && a && b && c && d && f);} template // extend AX class E_F_F0F0F0F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 &, const A4 &, const A5 &, const A6 & ) ; // extend AX func f; Expression a0,a1,a2,a3,a4,a5,a6; // extend aX E_F_F0F0F0F0F0F0F0_(func ff, // extend F0 Expression aa0, Expression aa1, Expression aa2, Expression aa3, Expression aa4, Expression aa5, Expression aa6) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3), a4(aa4), a5(aa5), a6(aa6) {} // extend aX AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)), GetAny((*a4)(s)), GetAny((*a5)(s)), GetAny((*a6)(s)) ) );} // extend aX virtual size_t nbitem() const {return a6->nbitem(); } // modif bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent() && a3->MeshIndependent()&& a4->MeshIndependent()&& a5->MeshIndependent()&& a6->MeshIndependent();} // extend aX }; template > // extend class OneOperator7_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4]), t[5]->CastTo(args[5]), t[6]->CastTo(args[6]));} // extend OneOperator7_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()], map_type[typeid(E).name()], map_type[typeid(F).name()], map_type[typeid(G).name()]), // extend f(ff){} }; // *********************************************** // **** 8 parameters // *********************** // template // extend AX class E_F_F0F0F0F0F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 &, const A4 &, const A5 &, const A6 &, const A7 & ) ; // extend AX func f; Expression a0,a1,a2,a3,a4,a5,a6,a7; // extend aX E_F_F0F0F0F0F0F0F0F0_(func ff, // extend F0 Expression aa0, Expression aa1, Expression aa2, Expression aa3, Expression aa4, Expression aa5, Expression aa6, Expression aa7) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3), a4(aa4), a5(aa5), a6(aa6), a7(aa7) {} // extend aX AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)), GetAny((*a4)(s)), GetAny((*a5)(s)), GetAny((*a6)(s)), GetAny((*a7)(s)) ) );} // extend aX virtual size_t nbitem() const {return a7->nbitem(); } // modif bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent() && a3->MeshIndependent()&& a4->MeshIndependent()&& a5->MeshIndependent()&& a6->MeshIndependent()&& a7->MeshIndependent();} // extend aX }; template > // extend class OneOperator8_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { if ( args.named_parameter && !args.named_parameter->empty() ) CompileError( " They are used Named parameter "); return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4]), t[5]->CastTo(args[5]), t[6]->CastTo(args[6]), t[7]->CastTo(args[7]));} // extend OneOperator8_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()], map_type[typeid(E).name()], map_type[typeid(F).name()], map_type[typeid(G).name()], map_type[typeid(H).name()]), // extend f(ff){} }; // *********************************************** // **** 9 parameters // *********************** // /* template // extend AX class E_F_F0F0F0F0F0F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 &, const A4 &, const A5 &, const A6 &, const A7 &, const A8 & ) ; // extend AX func f; Expression a0,a1,a2,a3,a4,a5,a6,a7,a8; // extend aX E_F_F0F0F0F0F0F0F0F0F0_(func ff, // extend F0 Expression aa0, Expression aa1, Expression aa2, Expression aa3, Expression aa4, Expression aa5, Expression aa6, Expression aa7, Expression aa8) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3), a4(aa4), a5(aa5), a6(aa6), a7(aa7), a8(aa8) {} // extend aX AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)), GetAny((*a4)(s)), GetAny((*a5)(s)), GetAny((*a6)(s)), GetAny((*a7)(s)), GetAny((*a8)(s)) ) );} // extend aX virtual size_t nbitem() const {return a8->nbitem(); } // modif bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent() && a3->MeshIndependent()&& a4->MeshIndependent()&& a5->MeshIndependent()&& a6->MeshIndependent()&& a7->MeshIndependent()&& a8->MeshIndependent();} // extend aX }; template > // extend class OneOperator9_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4]), t[5]->CastTo(args[5]), t[6]->CastTo(args[6]), t[7]->CastTo(args[7]), t[8]->CastTo(args[8]));} // extend OneOperator9_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()], map_type[typeid(E).name()], map_type[typeid(F).name()], map_type[typeid(G).name()], map_type[typeid(H).name()], map_type[typeid(I).name()]), // extend f(ff){} }; */ /* // // *********************************************** // **** 10 parameters // *********************** // template // extend AX class E_F_F0F0F0F0F0F0F0F0F0F0_ :public E { public: // extend typedef R (*func)(const A0 &,const A1 & , const A2 &, const A3 &, const A4 &, const A5 &, const A6 &, const A7 &, const A8 &, const A9 & ) ; // extend AX func f; Expression a0,a1,a2,a3,a4,a5,a6,a7,a8,a9; // extend aX E_F_F0F0F0F0F0F0F0F0F0F0_(func ff, // extend F0 Expression aa0, Expression aa1, Expression aa2, Expression aa3, Expression aa4, Expression aa5, Expression aa6, Expression aa7, Expression aa8, Expression aa9) // extend : f(ff), a0(aa0), a1(aa1), a2(aa2), a3(aa3), a4(aa4), a5(aa5), a6(aa6), a7(aa7), a8(aa8), a9(aa9) {} // extend aX AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)), GetAny((*a1)(s)), GetAny((*a2)(s)), GetAny((*a3)(s)), GetAny((*a4)(s)), GetAny((*a5)(s)), GetAny((*a6)(s)), GetAny((*a7)(s)), GetAny((*a8)(s)), GetAny((*a9)(s)) ) );} // extend aX virtual size_t nbitem() const {return a9->nbitem(); } // modif bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent()&& a2->MeshIndependent() && a3->MeshIndependent()&& a4->MeshIndependent()&& a5->MeshIndependent()&& a6->MeshIndependent() && a7->MeshIndependent()&& a8->MeshIndependent()&& a9->MeshIndependent();} // extend aX }; template > // extend class OneOperator10_ : public OneOperator { // 3->4 aType r; // return type typedef typename CODE::func func; func f; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(f, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4]), t[5]->CastTo(args[5]), t[6]->CastTo(args[6]), t[7]->CastTo(args[7]), t[8]->CastTo(args[8]), t[9]->CastTo(args[9]));} // extend OneOperator10_(func ff): // 3->4 OneOperator(map_type[typeid(R).name()], map_type[typeid(A).name()], map_type[typeid(B).name()], map_type[typeid(C).name()], map_type[typeid(D).name()], map_type[typeid(E).name()], map_type[typeid(F).name()], map_type[typeid(G).name()], map_type[typeid(H).name()], map_type[typeid(I).name()], map_type[typeid(J).name()]), // extend f(ff){} }; */ #endif freefem++-3.38-1/src/fflib/AnyType.hpp000644 000767 000024 00000012700 12274717221 017564 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // definition of the a type to store any bacis type // void *, long, double, complex, all bigger type // are pointer //#define WITHCHECK /// cf [[file:AFunction.hpp::basicForEachType]] class basicForEachType; /// <> uses [[file:AFunction.hpp::basicForEachType]] typedef const basicForEachType * aType; ostream & operator<<(ostream & f,const basicForEachType & e); //typedef unsigned char AnyData[24]; //typedef unsigned char AnyData[2*(sizeof(void*)+2*sizeof(double))]; // change for 64 architecture must containt 2*(1 ptr + 3 long)) // and for 32 2( ptr + 2 double) // so 2( 3ptr + double ) sims Ok FH MAI 2006 //typedef unsigned char AnyData[2*(3*sizeof(void*)+sizeof(double))]; typedef unsigned char AnyData[2*(5*sizeof(void*))]; // change . extern map map_type; template class CheckSize { } ; template class CheckSize { CheckSize() { } // private constructor to see the error } ; class AnyTypeWithCheck { private: union { AnyData data; void * p; double r; long l; bool b; // complex c; }; public: const basicForEachType *ktype; // friend ostream & operator<<(ostream &f,const AnyTypeWithCheck &p); AnyTypeWithCheck(): ktype(0){} AnyTypeWithCheck(long ll) {l=ll;ktype=map_type[typeid(long).name()];} AnyTypeWithCheck(double dd) {r=dd;ktype=map_type[typeid(double).name()];} AnyTypeWithCheck(bool bb ) {b=bb;ktype=map_type[typeid(bool).name()];} void operator =(void *pp){p=pp;} }; class AnyTypeWithOutCheck { public: union { AnyData data; void * p; double r; long l; bool b; // complex c; }; public: AnyTypeWithOutCheck(){} AnyTypeWithOutCheck(long ll) {l=ll;} AnyTypeWithOutCheck(double dd) {r=dd;} AnyTypeWithOutCheck(void *pp ) {p=pp;} AnyTypeWithOutCheck(bool bb ) {b=bb;} void operator =(void *pp){p=pp;} }; #ifdef WITHCHECK typedef AnyTypeWithCheck AnyType; #else typedef AnyTypeWithOutCheck AnyType; #endif static AnyType Nothing; #ifdef WITHCHECK template AnyTypeWithCheck SetAny(const T & x) { AnyTypeWithCheck any; CheckSize(); throwassert( (any.ktype=map_type[typeid(T).name()])); throwassert (sizeof(T) <= sizeof(AnyData)); //a.t=x; memcpy(&any,&x,sizeof(x)); return any; } inline AnyTypeWithCheck PtrtoAny(void * p,aType r) { AnyTypeWithCheck any; any=p; throwassert(any.ktype=r); return any; } #else template AnyTypeWithOutCheck inline SetAny(const T & x) { AnyTypeWithOutCheck any; CheckSize(); // plus stable ??? F avril 2006 FH. memcpy(&any,&x,sizeof(x)); // plante de temps en temps sous wind32 . FH //any = *( (AnyTypeWithOutCheck *) (void *) &x); return any; } inline AnyTypeWithOutCheck PtrtoAny(void * p,aType ) { return p; } template<> inline AnyTypeWithOutCheck SetAny(const double & x) { return x;} template<> inline AnyTypeWithOutCheck SetAny(const long & x) { return x;} template<> inline AnyTypeWithOutCheck SetAny(const bool & x) { return x;} template inline AnyTypeWithOutCheck SetAny( T * x) { return reinterpret_cast( x);} template inline AnyTypeWithOutCheck SetAny( const T * x) { return reinterpret_cast( x);} #endif template inline const T& GetAny(const AnyTypeWithCheck & x); template inline const T& GetAny(const AnyTypeWithCheck & x) { CheckSize(); if (x.ktype!=map_type[typeid(T).name()]) { cerr<< "GetAny: PB type <"; cerr < <=" << *(x.ktype) << endl; throw(ErrorExec("exit",1));} return *static_cast(static_cast(&x)); } template inline const T& GetAny(const AnyTypeWithOutCheck & x) { CheckSize(); return *static_cast(static_cast(&x)); } template<> inline const double& GetAny(const AnyTypeWithOutCheck & x) { return x.r;} template<> inline const long& GetAny(const AnyTypeWithOutCheck & x) { return x.l;} template<> inline const bool& GetAny(const AnyTypeWithOutCheck & x) { return x.b;} template inline T * PGetAny(const AnyTypeWithOutCheck & x) { return static_cast< T*>(x.p);} //template inline T * const & GetAny(const AnyTypeWithOutCheck & x) // { return x.p;} freefem++-3.38-1/src/fflib/array_complex.cpp000644 000767 000024 00000007156 12504534447 021047 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "array_tlp.hpp" #include "array_init.hpp" KN_ Get_C2R(KN_ > vc) { ffassert(vc.step==1); complex * pc=vc; // pointeur du tableau double *pr = static_cast(static_cast(pc)); return KN_(pr,vc.N()*2); } template KN_ Get_C2R_(KN_ > vc) { complex * pc=vc; // pointeur du tableau double *pr = static_cast(static_cast(pc)); return KN_(pr+offset,vc.N(),vc.step*2); } template KNM_ Get_C2R_(KNM_ > vc) { complex * pc=vc; // pointeur du tableau double *pr = static_cast(static_cast(pc)); return KNM_(pr+offset,ShapeOfArray(vc.N(),vc.step*2),vc.shapei,vc.shapej); } void initArrayDCLComplex() { ArrayDCL(); } Complex square(const Complex & x){return x*x;} void initArrayOperatorComplex() { typedef Complex K; typedef const K & KK; ArrayOperator(); ArrayOperatorF(); // take the real or imag part of complex array Add *>("im",".",new OneOperator1,KN_ >(Get_C2R_<1>,atype * >())); Add >("im",".",new OneOperator1,KN_ >(Get_C2R_<1>,atype >())); Add *>("re",".",new OneOperator1,KN_ >(Get_C2R_<0>,atype * >())); Add >("re",".",new OneOperator1,KN_ >(Get_C2R_<0>,atype >())); Add *>("im",".",new OneOperator1,KNM_ >(Get_C2R_<1>,atype * >())); Add >("im",".",new OneOperator1,KNM_ >(Get_C2R_<1>,atype >())); Add *>("re",".",new OneOperator1,KNM_ >(Get_C2R_<0>,atype * >())); Add >("re",".",new OneOperator1,KNM_ >(Get_C2R_<0>,atype >())); Global.Add("square","(",new OneOperator1F_KN_,K,KK,KN_ >(square)); Global.Add("conj","(",new OneOperator1F_KN_,K,KK,KN_ >(conj)); map_type[typeid(SetArray).name()]->AddCast( new E_F1_funcT,SetArray >(Cast,SetArray >), new E_F1_funcT,SetArray >(Cast,SetArray >) ); Global.Add("toCarray","(",new OneOperator_2KN_); } freefem++-3.38-1/src/fflib/array_init.hpp000644 000767 000024 00000002131 11406226635 020331 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ void initArrayDCLComplex(); void initArrayOperatorComplex(); // void initArrayDCLdouble(); void initArrayOperatordouble(); // void initArrayDCLlong(); void initArrayOperatorlong(); // void initStringOperator(); freefem++-3.38-1/src/fflib/array_long.cpp000644 000767 000024 00000014265 12505262630 020327 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "array_tlp.hpp" #include "array_init.hpp" const basicForEachType *aatypeknlongp; /* void initArrayOperators() { ArrayOperator(); ArrayOperator(); ArrayOperator(); } void initArrayDCL() { ArrayDCL(); ArrayDCL(); ArrayDCL(); } */ aType aaaa_knlp; void initArrayDCLlong() { // ArrayOperator(); Dcl_Type(); // Add FH mars 2005 ArrayDCL(); aaaa_knlp = atype*>(); } class OneBinaryOperatorInv_KN_long : public OneOperator { public: OneBinaryOperatorInv_KN_long(basicForEachType * ti) : OneOperator(atype(), ti ,atype()) {} E_F0 * code(const basicAC_F0 & args) const { Expression p=args[1]; if ( ! p->EvaluableWithOutStack() ) { bool bb=p->EvaluableWithOutStack(); cout << bb << " " << * p << endl; CompileError("Inverse: int[int] I, array, with I^p, The p must be a constant == -1, sorry");} long pv = GetAny((*p)(NullStack)); if (pv !=-1) { char buf[100]; sprintf(buf,"Inverse: int[int] I, array, I^%ld, The pow must be == -1, sorry",pv); CompileError(buf);} return new E_F_F0 >(Build >,to< KN_ >(args[0])); } }; // end Hack // Add mars 2010 template R * set_init_init( R* const & a,const long & n){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << n << endl); a->init(n); for (int i=0;i * const & a,long const & b) { ffassert( a && b >=0 && b < a->size()); String & Sret = (*a)[b]; // correction FH feb 2004 // delete b; la chaine est detruire automatiquement en fin d'instruction FH jan 2010 return Sret.getap();} template inline AnyType Destroy_KN(Stack,const AnyType &x){ KN * a=GetAny*>(x); for (int i=0;iN(); i++) (a)[i].destroy(); a->destroy(); return Nothing; } // fin add template struct set_Inv_KN_long: public binary_function { static A f(const A & a, B const & b) { int n=a.N(); KN_ I(b.t); for(int i=0;i=0 && j struct set_Inv_pKN_longI: public binary_function { static A f(const A & a, B const & b) { KN_ I(b.t); int n=I.max()+1; a->init(n); (*a)=-1; for(int i=0;i=0 && j(); // to def inverse permutation // Add FH mars 2005 TheOperators->Add("^", new OneBinaryOperatorInv_KN_long(atype >() )); //- TheOperators->Add("^", new OneBinaryOperatorInv_KN_long(atype *>() )) ; aatypeknlongp= atype*>(); // for compilation error with g++ 3.2.2 Add >("sort",".",new OneOperator1_,KN_ >(SortKn >)); // Add >("sort",".",new OneOperator1_,KN >(SortKn >)); Add *>("sort",".",new OneOperator1_*,KN* >(SortpKn)); // ArrayDCL(); Dcl_TypeandPtr_,KN *>(0,0,0,::Destroy >, ::ClearReturnKK_,KN_ >,::ClearReturnpKK >); atype* >()->Add("[","",new OneOperator2_*,long >(get_elements)); TheOperators->Add("<-", new OneOperator2_ *,KN *,long>(&set_init_init)); map_type_of_map[make_pair(atype(),atype())]=atype*>(); // vector Add *>("n",".",new OneOperator1 *>(get_n)); extern KN *pkarg; Global.New("ARGV",CPValue >(*pkarg));// add FH mars 2010 Global.Add("toZarray","(",new OneOperator_2KN_); TheOperators->Add("=", new OneBinaryOperator ,Inv_KN_long > > ); TheOperators->Add("<-", new OneBinaryOperator*,Inv_KN_long > > ); Add *>("imin",".",new OneOperator1 *>(get_imin)); Add *>("imax",".",new OneOperator1 *>(get_imax)); // madd FH. march 2015 ... Global.Add("Unique", "(", new OneOperator2_*, KN*>(Unique)); Global.Add("Unique", "(", new OneOperator2_*, KN*>(Unique)); // convertion double -> long (via lround) Dcl_Type >(); Global.Add("lround","(",new OneOperator1F_KN_,K,double,KN_ >(lround)); TheOperators->Add("=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("+=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("-=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("/=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("*=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 } void xxxx() { } freefem++-3.38-1/src/fflib/array_real.cpp000644 000767 000024 00000007135 12505262630 020311 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "array_tlp.hpp" #include "array_init.hpp" double square(double x){return x*x;} void initArrayDCLdouble() { // ArrayOperator(); ArrayDCL(); } //template A Build(B b) { return A(b);} void initArrayOperatordouble() { ArrayOperator(); ArrayOperatorF(); typedef double K; typedef double KK; Dcl_Type< QuantileKN > (); Global.Add("abs","(",new OneOperator1F_KN_,K,KK,KN_ >(fabs)); Global.Add("acos","(",new OneOperator1F_KN_,K,KK,KN_ >(acos)); Global.Add("asin","(",new OneOperator1F_KN_,K,KK,KN_ >(asin)); Global.Add("atan","(",new OneOperator1F_KN_,K,KK,KN_ >(atan)); Global.Add("floor","(",new OneOperator1F_KN_,K,KK,KN_ >(floor)); Global.Add("ceil","(",new OneOperator1F_KN_,K,KK,KN_ >(ceil)); Global.Add("square","(",new OneOperator1F_KN_,K,KK,KN_ >(square)); Add >("sort",".",new OneOperator1_,KN_ >(SortKn >)); // Add >("sort",".",new OneOperator1_,KN >(SortKn >)); Add *>("sort",".",new OneOperator1_*,KN* >(SortpKn)); // Add >("sort",".",new OneOperator2_,KN_,KN_ >(SortKn,KN_ >)); // Add >("sort",".",new OneOperator2_,KN,KN_ >(SortKn,KN_ >)); Global.Add("sort","(",new OneOperator2_*,KN*,KN* >(SortpKn2)); Add >("quantile",".",new OneOperator1,KN_ >(Build,KN_ >)); // Add >("quantile",".",new OneOperator1,KN_ >(Build,KN_ >, atype >())); // Add * >("quantile",".",new OneOperator1,KN_ >(Build,KN_ >, atype >())); Add * >("quantile",".",new OneOperator1,KN_ >(Build,KN_ >, atype *>() )); Add >("(","",new OneOperator2_,double>(Quantile)); map_type[typeid(SetArray).name()]->AddCast( new E_F1_funcT,SetArray >(Cast,SetArray >) ); Global.Add("toRarray","(",new OneOperator_2KN_); Add *>("imin",".",new OneOperator1 *>(get_imin)); Add *>("imax",".",new OneOperator1 *>(get_imax)); Global.Add("Unique", "(", new OneOperator2_*, KN*>(Unique)); Global.Add("Unique", "(", new OneOperator2_*, KN*>(Unique)); // ArrayDCL(); } freefem++-3.38-1/src/fflib/array_resize.hpp000644 000767 000024 00000001377 12107063771 020701 0ustar00hechtstaff000000 000000 template struct Resize{ T *v; Resize( T * vv) : v(vv) {} }; template T *resize1(const Resize & t,const long &n) { t.v->resize(n); return t.v; } template T *resizeandclean1(const Resize & t,const long &n) { int nn= t.v->N(); // old size for (int i=n;iresize(n); for (int i=nn;i T *resize2(const Resize & t,const long &n, const long & m) { t.v->resize(n,m); return t.v; } template Resize to_Resize( T *v){ return Resize(v);} template struct Resize1{ T v; Resize1( T vv) : v(vv) {} }; template Resize1 to_Resize1( T v){ return Resize1(v);} freefem++-3.38-1/src/fflib/array_tlp.hpp000644 000767 000024 00000163505 12527026300 020172 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //#pragma dont_inline on //#pragma inline_depth(1) #include "config-wrapper.h" #include #include #include "AFunction.hpp" #include #include #include "error.hpp" #include "lex.hpp" #include "RNM.hpp" #include "Operator.hpp" // for exec routine #include "rgraph.hpp" #include "InitFunct.hpp" #include #include "array_resize.hpp" #include "HeapSort.hpp" template struct affectation: binary_function { T& operator()(T& x, const T& y) const {return (x=y);} }; template struct affectation_add: binary_function { T& operator()(T& x, const T& y) const {return (x+=y);}// correct FH 25/10/2013 }; template struct affectation_sub: binary_function { T& operator()(T& x, const T& y) const {return (x-=y);}// correct FH 25/10/2013 }; extern Map_type_of_map map_type_of_map ; // to store te type extern Map_type_of_map map_pair_of_type ; // to store te type extern basicForEachType * typevarreal, * typevarcomplex; // type of real and complex variable extern int TheCurrentLine; // unset: by default extern long mpisize,mpirank; template inline T Max (const T &a,const T & b){return a > b ? a : b;} template inline T Min (const T &a,const T & b){return a < b ? a : b;} template inline T Abs (const T &a){return a <0 ? -a : a;} template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} template inline T Square (const T &a){return a*a;} template struct Op2_dotproduct: public binary_function >,KN *,K> { static K f( Transpose > const & a, KN * const& b) { return (conj(a.t),*b);} }; template struct Op2_dotproduct_: public binary_function >,KN_ ,K> { static K f( Transpose > const & a, KN_ const& b) { return (conj(a.t),b);} }; template A Build(B b) { return A(b);} template void HeapSort(T *c,long n,long o) { // trie un tableau c de n valeur avec un decalage de o. // le tableau: c[i*o] , pour i = 0 a n-1 long l,j,r,i; T crit; c-=o; // on decale de o pour que le tableau commence a o if( n <= 1) return; l = (n/2 + 1)*o; r = n*o; while (1) { // label 2 if(l <= o ) { // label 20 crit = c[r]; c[r] = c[o]; r-=o; if ( r == o ) { c[o]=crit; return;} } else crit = c[l-=o]; j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {c[i]=crit;break;} // L8 -> G2 if ((j G2 } } } template A SortKn(const A & ca) { A a(ca); HeapSort(&a[0],a.n,a.step); return a;} template A SortKn(const A & ca,const B & cb) { cout << "SortKn " << endl; const A &a(ca); const B &b(cb); ffassert(a.n == b.n); ffassert(a.step == b.step && b.step ==1); HeapSort(&a[0],&b[0],a.n); cout << b << endl; return a;} template KN * SortpKn2( KN * const & pa,KN * const & pb){ // cout << " SortpKn2 " << endl; KN &a(*pa); KN &b(*pb); ffassert(a.n == b.n); ffassert(a.step == b.step && b.step ==1); HeapSort(&a[0],&b[0],a.n); return pa;} template KN * SortpKn( KN * const & pa){ KN &a(*pa); HeapSort(&a[0],a.n,a.step); return pa;} template class QuantileKN: public KN_ { public: QuantileKN(const KN_ &a): KN_(a) {} QuantileKN(KN * p): KN_(*p) {} operator R *() const {return this->KN_::operator R *() ;} }; template R Quantile(QuantileKN const & a,const double & q){ KN b(a); HeapSort(b,b.n,b.step); long m=lrint(b.n*q); if( m >= b.n) m=b.n-1; if( m < 0) m=0; R qq=b[m]; // cout << "Quantile: m = " << m << " " << b < RR * get_elementp_(const A & a,const B & b){ if( b<0 || a->N() <= b) { cerr << " Out of bound 0 <=" << b << " < " << a->N() << " array type = " << typeid(A).name() << endl; ExecError("Out of bound in operator []");} return &((*a)[b]);} template KN_ fSubArray(const KN_ & a,const SubArray & b) { return a(b);} template KN_ fSubArrayp( KN * const & a,const SubArray & b) { return (*a)(b);} template KNM_ fSubArraybb(const KNM_ & a,const SubArray & b,const SubArray & c) { return a(b,c);} template KNM_ fSubArraypbb( KNM * const & a,const SubArray & b,const SubArray & c) { return (*a)(b,c);} template KN_ fSubArrayib(const KNM_ & a,const long &i,const SubArray & b) { return a(i,b);} template KN_ fSubArraybi(const KNM_ & a,const SubArray & b,const long &i) { return a(b,i);} template KN_ fSubArraypib( KNM *const & a,const long &i,const SubArray & b) { return (*a)(i,b);} template KN_ fSubArraypbi( KNM *const & a,const SubArray & b,const long &i) { return (*a)(b,i);} template A fSubArrayc(const A & a,const char & b) { return a;} template RR * get_elementp2_(const A & a,const B & b,const C & c){ if( b<0 || a->N() <= b || c<0 || a->M() <= c ) { cerr << " Out of bound 0 <=" << b << " < " << a->N() << " " << c << " < " << a->M() << " array type = " << typeid(A).name() << endl; ExecError("Out of bound in operator (,)");} return &((*a)(b,c));} template RR get_element_is(const A & a,const B & b,const C & c){ // cout << b << " .... " << ((*a)(SubArray(1,b),c)) << endl;; return ((*a)(b,'.')(c));} template RR get_element_si(const A & a,const B & b,const C & c){ // cout << c << " .... " << ((*a)(b,SubArray(1,c) )) << endl;; return ((*a)('.',c)(b));} template RR get_element_lineorcol(const A & a,const B & b,const C & c){ // cout << b << " .... " << ((*a)(SubArray(1,b),c)) << endl;; if(c == ':' && (b<0 || a->N() <= b)) ExecError("Out of bound"); if(b == ':' && (c<0 || a->M() <= c)) ExecError("Out of bound"); return ((*a)(b,c)); } template RR get_element_is_(const A & a,const B & b,const C & c){ // cout << b << " .... " << ((*a)(SubArray(1,b),c)) << endl;; return ((a)(b,'.')(c));} template RR get_element_si_(const A & a,const B & b,const C & c){ // cout << c << " .... " << ((*a)(b,SubArray(1,c) )) << endl;; return ((a)('.',c)(b));} template RR get_element_lineorcol_(const A & a,const B & b,const C & c){ // cout << b << " .... " << ((*a)(SubArray(1,b),c)) << endl;; return ((a)(b,c));} template RR * get_elementp2__(const A & a,const B & b,const C & c){ if( b<0 || a.N() <= b || c<0 || a.M() <= c ) { cerr << " Out of bound 0 <=" << b << " < " << a.N() << " " << c << " < " << a.M() << " array type = " << typeid(A).name() << endl; ExecError("Out of bound in operator (,)");} return &((a)(b,c));} template class InitArrayfromArray : public OneOperator { public: typedef KN * A; typedef KN * R; typedef E_Array B; class CODE : public E_F0 { public: Expression a0; int N; Expression * tab; int * what;// 0 RR, 1 KN, const bool mi; CODE(Expression a,const E_Array & tt) : a0(a),N(tt.size()), tab(new Expression [N]), what(new int[N]) , mi(tt.MeshIndependent()) { assert(&tt); // int err=0; for (int i=0;i()->CastingFrom(tt[i].right() ) ) { tab[i]=atype()->CastTo(tt[i]); what[i]=0; } else if(atype >()->CastingFrom(tt[i].right() ) ) { tab[i]=atype >()->CastTo(tt[i].RightExp()); what[i]=1; } else CompileError(" InitArrayfromArray: we are waiting for scalar or vector of scalar"); } AnyType operator()(Stack stack) const { //extern void xxxx(); //xxxx(); A a=GetAny((*a0)(stack)); KN v(N); KN nn(N+1); for (int i=0;i >(v[i]).size(); n += nn[i]; } if (isinit) a->init(n); else a->resize(n); for (int i=0,j=0 ;i(v[i]); else if (what[i]==1) (*a)(SubArray(nn[i],j)) = GetAny >((*(tab[i]))(stack));// correct bug nov 2014 // (due to resize=> pointer change Fh return SetAny(a); } bool MeshIndependent() const {return mi;} // ~CODE() { delete [] tab; delete[] what;} operator aType () const { return atype();} }; // end sub class CODE public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(t[0]->CastTo(args[0]),*dynamic_cast( t[1]->CastTo(args[1]).LeftValue()));} InitArrayfromArray(): OneOperator(atype(),atype(),atype()) {} }; template class InitMatfromAArray : public OneOperator { public: typedef KNM * A; typedef KNM * R; typedef E_Array B; class CODE : public E_F0 { public: Expression a0; int N; int M; Expression ** tab; const bool mi; CODE(Expression a,const E_Array & tt) : a0(a),N(tt.size()),M(0), tab(new Expression* [N]), mi(tt.MeshIndependent()) { assert(&tt); // int err=0; for (int i=0;i(tt[i].LeftValue()); if (li) { const E_Array & lli = *li; // -- check --- if( i == 0) { M = lli.size(); ffassert( M>0 ); for (int i=0;isize() ) { cout << " line " << i << " the size of the column change " << M << " to " << li->size() << endl; CompileError(" Is not a matrix, M is not constant" ); } } for (int j=0;j()->CastTo( lli[j]); } else // li == 0 CompileError(" we are waiting for vector of scalar [ , , , ] "); } } AnyType operator()(Stack stack) const { A a=GetAny((*a0)(stack)); if (isinit) a->init(N,M); else a->resize(N,M); for (int i =0;i( (*(tab[i][j]))(stack)) ; return SetAny(a); } bool MeshIndependent() const {return mi;} // ~CODE() { for (int i=0;i();} }; // end sub class CODE public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(t[0]->CastTo(args[0]),*dynamic_cast( t[1]->CastTo(args[1]).LeftValue()));} InitMatfromAArray(): OneOperator(atype(),atype(),atype()) {} }; template class SetArrayofKNfromKN : public OneOperator { public: typedef KN_ A; // Warning B type of 1 parameter typedef KN_ R; typedef E_Array B; // A type of 2 parameter class CODE : public E_F0 { public: Expression a0; int N; Expression * tab; int * what;// 0 RR, 1 KN, const bool mi; CODE(Expression a,const E_Array & tt) : a0(a),N(tt.size()), tab(new Expression [N]), what(new int[N]) , mi(tt.MeshIndependent()) { assert(&tt); // int err=0; for (int i=0;i()->CastingFrom(tt[i].left() ) ) { tab[i]=atype()->CastTo(tt[i]); what[i]=0; } else if(atype >()->CastingFrom(tt[i].right() ) ) { tab[i]=atype >()->CastTo(tt[i].RightExp()); what[i]=1; } else CompileError(" we are waiting for scalar or vector of scalar"); } AnyType operator()(Stack stack) const { A a=GetAny((*a0)(stack)); KN v(N); KN nn(N+1); for (int i=0;i >(v[i]).size(); n += nn[i]; } ffassert(n == a.size()); for (int i=0,j=0 ;i(v[i]) = a[j]; else if (what[i]==1) { // hack FH KN_ tab(GetAny >(v[i])); tab =a(SubArray(nn[i],j)); } return SetAny(a); } bool MeshIndependent() const {return mi;} // ~CODE() { delete [] tab; delete[] what;} operator aType () const { return atype();} }; // end sub class CODE public: // warning hack A and B E_F0 * code(const basicAC_F0 & args) const { return new CODE(t[1]->CastTo(args[1]),*dynamic_cast( t[0]->CastTo(args[0]).RightValue()));} SetArrayofKNfromKN(): OneOperator(atype(),atype(),atype()) {} // warning with A and B }; template long get_n(KN * p){ return p->N();} template long get_n(KNM * p){ return p->N();} template long get_m(KNM * p){ return p->M();} template K get_max(KN * p){ return p->max();} template K get_min(KN * p){ return p->min();} template long get_imax(KN * p){ long i =0; for(long k=1;k< p->N(); ++k) if( (*p)[k]>(*p)[i] ) i=k; return i ;} template long get_imin(KN * p){ long i =0; for(long k=1;k< p->N(); ++k) if( (*p)[k]<(*p)[i] ) i=k; return i ;} template K get_sum(KN * p){ return p->sum();} template double get_l2(KN * p){ return p->l2();} template double get_l1(KN * p){ return p->l1();} template double get_linfty(KN * p){ return p->linfty();} template K get_max(KNM * p){ return p->max();} template K get_min(KNM * p){ return p->min();} template K get_sum(KNM * p){ return p->sum();} template double get_l2(KNM * p){ return p->l2();} template double get_l1(KNM * p){ return p->l1();} template double get_linfty(KNM * p){ return p->linfty();} template K get_sum0(const T & p){ return p.sum();} template K get_max0(const T &p){ return p.max();} template K get_min0(const T &p){ return p.min();} template K get_l2_0(const T &p){ return p.l2();} template K get_l1_0(const T &p){ return p.l1();} template K get_linfty_0(const T &p){ return p.linfty();} class ostream_precis { public: ostream_precis(ostream * ff) :f(ff) {} ostream * f; operator long () const {return f->precision();} }; template B castto(const A & a){ return a;} /* template AnyType ClearReturnpKN(Stack stack, const AnyType & a) { KN * m = GetAny(a); Add2StackOfPtr2FreeRC(stack, (K*) (*m) ); if(verbosity>1) cout << "AddIncrement:: increment + Add2StackOfPtr2FreeRC " << endl; return new KN(true, *m); }*/ template AnyType ClearReturnpKK(Stack stack, const AnyType & a) { // a ne faire que pour les variables local au return... // pour l'instant on copie pour fqire mqrche // a repense FH mqi 2009.... KK * m = GetAny(a); // KN *cm=new KN(true, *m); bug quant KN est une variable global // KN *cm=new KN( *m); // on duplique le tableau comme en C++ (dur dur ?????? FH) m->increment(); Add2StackOfPtr2FreeRC(stack,m); if(verbosity>400) cout << "ClearReturnpKK:: increment + Add2StackOfPtr2FreeRC nb ref " << -m->next << endl; return m; } template AnyType ClearReturnpKK_(Stack stack, const AnyType & a) { // il faut faire un copie du tableau KK_ * m = GetAny(a); KK *cm=new KK(*m); Add2StackOfPtr2Free(stack,cm);// detruire la copie if(verbosity>400) cout << "ClearReturnpKK_:: copie Add2StackOfPtr2Free " << endl; return (KK_ *) cm; } template AnyType ClearReturnKK_(Stack stack, const AnyType & a) { // il faut faire un copie du tableau KK_ m = GetAny(a); KK *cm=new KK(m); Add2StackOfPtr2Free(stack,cm);// detruire la copie if(verbosity>400) cout << "ClearReturnKK_:: copie Add2StackOfPtr2Free " << endl; return SetAny(*cm); } template AnyType CopieKK_pKK(Stack stack,const AnyType &a) { KK_ m = GetAny(a); KK *cm=new KK(m); if(verbosity>400) cout << "CopieKK_pKK:: copie Add2StackOfPtr2Free "<< cm << endl; Add2StackOfPtr2Free(stack,cm);// detruire la copie return cm;} template AnyType UnRefpKN(Stack,const AnyType &a) { KK_ a_(*PGetAny(a)); return SetAny(a_);} template inline AnyType DestroyKN(Stack,const AnyType &x){ KN * a=PGetAny >(x); SHOWVERB(cout << "DESTROY " <N(); ++i) (*a)[i].destroy(); a->destroy(); return Nothing; } template void ArrayDCL() { // Dcl_TypeandPtr >(0,0,0,::Destroy >, 0 , ::ClearReturnKN ); //Dcl_Type *>(0,::Destroy >, ::ClearReturnpKK > ); //Dcl_TypeandPtr >(0,0,0,0,::ClearReturnKK_,KN_ >,::ClearReturnpKK_,KN_ >); Dcl_TypeandPtr_ ,KN* > (0,0,::InitP >,::Destroy >, ::ClearReturnKK_,KN_ >,::ClearReturnpKK >); // add init 0 // Dcl_Type *>(0,::Destroy >); // Dcl_Type *>(0,::Destroy >); // Modif 17102005 // attention un exp KN<> * right est un KN<> et non un KN<> * // Dcl_Type *>(0,::Destroy > ,::ClearReturnpKK >); Dcl_TypeandPtr_ ,KNM* > (0,0,0,::Destroy >, ::ClearReturnKK_,KNM_ >,::ClearReturnpKK >); Dcl_Type< KN >* >(0,::DestroyKN >,::ClearReturnpKK,KN > >); Dcl_Type< KN >* >(0,::DestroyKN >,::ClearReturnpKK,KN > >); Dcl_Type< outProduct_KN_* >(); Dcl_Type< Transpose > > (); Dcl_Type< Transpose< KNM *> >(); Dcl_Type >(); Dcl_Type >(); Dcl_Type >(); Dcl_Type >(); Dcl_Type >(); Dcl_Type >(); Dcl_Type >(); Dcl_Type *>(); Dcl_Type *>(); // for B(I) and B(I^-1) Dcl_Type,Inv_KN_long> *>(); Dcl_Type,KN_ > *>(); map_type[typeid(KN * ).name()]->AddCast( new E_F1_funcT*,KN_ >(CopieKK_pKK,KN > ) ); // add august 2009 FH to see full matrix as a array map_type[typeid(KN_ ).name()]->AddCast( new E_F1_funcT,KNM* >(UnRef,KNM *> )); map_type[typeid(KN_ ).name()]->AddCast( // new E_F1_funcT,KN_*>(UnRefpKN_ ), new E_F1_funcT,KN*>(UnRefpKN,KN_ > ) // inutil cas KN est right expression de KN* // new E_F1_funcT,KN >(Cast,KN >) ); map_type[typeid(KNM_ ).name()]->AddCast( new E_F1_funcT,KNM*>(UnRefpKN,KNM_ > ) ); // ,new E_F1_funcT,K>(ValueToKN_), // new E_F1_funcT,K*>(PtrToKN_) /* // Ajoute FH map_type[typeid(KN ).name()]->AddCast( new E_F1_funcT,KN*>(UnRef >) // ,new E_F1_funcT,K>(ValueToKN_), // new E_F1_funcT,K*>(PtrToKN_) ); */ map_type_of_map[make_pair(atype(),atype())]=atype*>(); // vector map_pair_of_type[make_pair(atype(),atype())] =atype >(); map_type_of_map[make_pair(atype >(),atype())]=atype*>(); // matrix map_type_of_map[make_pair(atype(),atype >())]=atype >*>();// tableau de tableau map_type_of_map[make_pair(atype(),atype >())]=atype >*>();// tableau de matrix } template pair * pBuild(const A & a,const B & b) { return new pair(a,b);} // add mars 2006 template struct set_A_BI: public binary_function,pair, KN_ > *,KN_ > { static KN_ f(const KN_ & a, pair, KN_ > * const & b) { KN_ x(a); OP op; const KN_ & y(b->first); const KN_ & I(b->second); L N = x.N(); L n = y.N(); L maxI=I(SubArray(N)).max() ; L minI=I(SubArray(N)).min() ; if( maxI >= n || I.N() < N) { cerr << " Out of Bound x=y(I) : 0 <= " << minI << " < "<< maxI << "< " << n << endl; cerr << " or I.N() " << I.N() << " > " << N << endl; ExecError("Out of Bound error"); } for(int i=0;i=0) op(x(i),y(I[i])); delete b; return a; } }; template struct set_AI_B: public binary_function, KN_ > * ,KN_, NothingType > { static NothingType f( pair, KN_ > * const & b,const KN_ & a) { KN_ x(a); OP op; const KN_ & y(b->first); const KN_ & I(b->second); L N = I.N(); L n = y.N(); L maxI=I(SubArray(N)).max() ; L minI=I(SubArray(N)).min() ; if( maxI >= n || x.N() < N ) { cerr << " Out of Bound x(I)=y : 0 <= " << minI << " < "<< maxI << "< " << n << endl; cerr << " or x.N() " << I.N() << " > " << N << endl; ExecError("Out of Bound error"); } for(int i=0;i=0) op(y(I[i]),x[i]); delete b; return NothingType(); } }; template struct Op3_paac: public ternary_function,KN_,K,if_arth_KN_*> { static if_arth_KN_* f(Stack s,const KN_ & a,const KN_ & b,const K & c ) { //K cc(c); KN_ kc(new(NewAllocTmp(s,sizeof(c))) K(c),1,0); return new if_arth_KN_(a,b,kc);} }; template struct Op3_paca: public ternary_function,K,KN_,if_arth_KN_*> { static if_arth_KN_* f(Stack s,const KN_ & a,const K & b,const KN_ & c ) { //K bb(b); KN_ kb(new(NewAllocTmp(s,sizeof(b))) K(b),1,0); return new if_arth_KN_(a,kb,c);} }; template struct Op3_pacc: public ternary_function,K,K,if_arth_KN_*> { static if_arth_KN_* f(Stack s,const KN_ & a,const K & b,const K & c ) { K cc(c),bb(b); KN_ kc(new(NewAllocTmp(s,sizeof(c))) K(c),1,0), kb(new(NewAllocTmp(s,sizeof(b))) K(b),1,0); return new if_arth_KN_(a,kb,kc);} }; template struct SetArray2: public binary_function > { static SetArray f(const K & a,const K & b) { // cout << "SubArray: " << a << " " << b << endl; // SetArray(long nn,R oo=R(),R sstep=R(1)): o(oo),n(nn),step(sstep) {} long n= long(abs((b-a))); ffassert(n); K s= (b-a)/K(n); n++; if(verbosity>100) cout << " SetArray " << n << " " << a << " " << s << endl; return SetArray(n,a,s);} }; template struct SetArray3: public ternary_function > { static SetArray f(Stack s,const K & a,const K &b,const K & c) { // cout << "SubArray: " << a << " " << b << " " << c << endl; long n= long(1+abs((c-a)/b)); if(verbosity>100) cout << " SetArray " << n << " : " << " " << a << " " << b << " " << c << endl; return SetArray(n,a,b);} }; template R * set_init_array( R* const & a,const A & b){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << &b << endl); a->init(b.size()); *a=b; return a;} template R * set_array( R* const & a,const A & b){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << &b << endl); a->resize(b.size()); *a=b; return a;} // missing FH august 2009 template R * set_arrayp( R* const & a,const A & b){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << &b << endl); a->resize(b->size()); *a=*b; return a;} template R set_array_( R const & a,const A & b){ SHOWVERB( cout << " set_array_ " << typeid(R).name() << " " << &b << endl); ffassert(a.N()==b.size()); R aa=a; aa=b; return a;} // xxxxxxxxxxx template KNM * set_initmat_t(KNM * a,Transpose * > b ){ ConjKNM_ tb=b.t->t(); ; a->init(tb.N(),tb.M()); *a=tb; return a;} template KNM * set_initmat(KNM * a,KNM * b ){ a->init(b->N(),b->M()); *a=*b; return a;} template KNM * set_mat_t(KNM * a,Transpose * > b ){ ConjKNM_ tb=b.t->t(); ; a->resize(tb.N(),tb.M());// correction mars 2013 *a=tb; return a;} template KNM * addto_mat_t(KNM * a,Transpose * > b ){ ConjKNM_ tb=b.t->t(); ; *a+=tb; return a;} template KNM * subto_mat_t(KNM * a,Transpose * > b ){ ConjKNM_ tb=b.t->t(); ; *a-=tb; return a;} template KNM * set_mat(KNM * a,KNM * b ){ a->resize(b->N(),b->M()); *a=*b; return a;} template class OneOperator_2KN_ : public OneOperator {public: class Op : public E_F0 { public: int N; Expression *tab; Op( const E_Array &bb) : N(bb.size()), tab(new Expression[N]) { for(int i=0;i()->CastTo( bb[i]); } AnyType operator()(Stack s) const { K * p = Add2StackOfPtr2FreeA(s,new K[N]); // mark to be delete .. KN A(N, p); for(int i=0;i( (*tab[i])(s)); return SetAny >(A);} }; E_F0 * code(const basicAC_F0 & a) const { const E_Array * b = dynamic_cast(a[0].LeftValue()); ffassert(b); return new Op(*b);} OneOperator_2KN_(): OneOperator(atype >(),atype()) { pref=-1;} }; template long Unique(KN* const& array, KN* const& val) { std::set vals; for(int i = 0; i < array->n; ++i) vals.insert((*array)[i]); val->resize(vals.size()); int i = 0; for(typename std::set::iterator it = vals.begin(); it != vals.end(); ++it) (*val)[i++] = *it; return vals.size(); } extern aType aaaa_knlp; template void ArrayOperator() { // juin 2009 remove type KN_< > * // and set KN<> * 9left expression) qnd KN_<> is the associated expression.. // => lot of change because KN<>* and KN_< > can generqte ambuguity. // so remove all to code with KN<>* type. // the remove cqde are in comment : // the comment begin //- // and the if(0) in comment /* */ Dcl_Type< Resize > > (); Dcl_Type< Resize > > (); aType knrp = atype *>(); aType knr_ = atype >(); //- typedef KN ZN; // add dec 2009. ne marche pas ( incompatible avec MatrixBlock) a comprendre ????? FH. // // xxxxxxxxxx 2010 feb. retest .. FH // il y a plusieurs problems // 1) [1,2,3.] -> tableau de quel type int, real , complex ???? // // map_type[typeid(KN_).name()]->AddCast(new OneOperator_2KN_); // fin add // ---- aType knlp= aaaa_knlp ; atype* >()->Add("[","",new OneOperator2_*,Z >(get_elementp_*,Z>)); atype* >()->Add("(","",new OneOperator2_*,Z >(get_elementp_*,Z>)); atype >()->Add("(","",new OneOperator2_,KN_,char >(fSubArrayc >)); atype >()->Add("(","",new OneOperator2_,KN_,SubArray>(fSubArray )); atype*>()->Add("(","",new OneOperator2_,KN*,SubArray>(fSubArrayp )); atype* >()->Add("(","",new OneOperator2_*,KN*,char >(fSubArrayc* >)); // atype >()->Add("(","",new OneOperator3_,KNM_,SubArray,SubArray>(fSubArraybb )); atype* >()->Add("(","",new OneOperator3_,KNM*,SubArray,SubArray>(fSubArraypbb )); /* atype >()->Add("(","",new OneOperator3_,KNM_,SubArray,long>(fSubArraybi )); atype >()->Add("(","",new OneOperator3_,KNM_,long,SubArray>(fSubArrayib )); atype >()->Add("(","",new OneOperator3_,KNM*,SubArray,long>(fSubArraypbi )); atype >()->Add("(","",new OneOperator3_,KNM*,long,SubArray>(fSubArraypib )); */ // atype >()->Add("[","",new OneOperator2_,Z >(get_element_,Z>)); atype >()->Add("(","",new OneOperator2_,Z >(get_element_,Z>)); atype* >()->Add("(","",new OneOperator3_,KNM*,Z,SubArray >(get_element_is,KNM*,Z,SubArray>)); atype* >()->Add("(","",new OneOperator3_,KNM*,SubArray,Z >(get_element_si,KNM*,SubArray,Z>)); atype* >()->Add("(","",new OneOperator3_,KNM*,Z,char >(get_element_lineorcol,KNM*,Z,char>)); atype* >()->Add("(","",new OneOperator3_,KNM*,char,Z >(get_element_lineorcol,KNM*,char,Z>)); atype* >()->Add("(","",new OneOperator3_*,Z,Z >(get_elementp2_*,Z,Z>)); atype >()->Add("(","",new OneOperator3_,KNM_,Z,SubArray >(get_element_is_,KNM_,Z,SubArray>)); atype >()->Add("(","",new OneOperator3_,KNM_,SubArray,Z >(get_element_si_,KNM_,SubArray,Z>)); atype >()->Add("(","",new OneOperator3_,KNM_,Z,char >(get_element_lineorcol_,KNM_,Z,char>)); atype >()->Add("(","",new OneOperator3_,KNM_,char,Z >(get_element_lineorcol_,KNM_,char,Z>)); atype >()->Add("(","",new OneOperator3_,Z,Z >(get_elementp2__,Z,Z>)); Add *>("sum",".",new OneOperator1 *>(get_sum)); Add *>("min",".",new OneOperator1 *>(get_min)); Add *>("max",".",new OneOperator1 *>(get_max)); Add *>("l2",".",new OneOperator1 *>(get_l2)); Add *>("l1",".",new OneOperator1 *>(get_l1)); Add *>("linfty",".",new OneOperator1 *>(get_linfty)); // add july 2009 Add *>("sum",".",new OneOperator1 *>(get_sum)); Add *>("min",".",new OneOperator1 *>(get_min)); Add *>("max",".",new OneOperator1 *>(get_max)); Add *>("l2",".",new OneOperator1 *>(get_l2)); Add *>("l1",".",new OneOperator1 *>(get_l1)); Add *>("linfty",".",new OneOperator1 *>(get_linfty)); // end add Add >("sum",".",new OneOperator1_ >(get_sum0 >)); Add >("min",".",new OneOperator1_ >(get_min0 >)); Add >("max",".",new OneOperator1_ >(get_max0 >)); Add >("l2",".",new OneOperator1_ >(get_l2_0 >)); Add >("l1",".",new OneOperator1_ >(get_l1_0 >)); Add >("linfty",".",new OneOperator1_ >(get_linfty_0 >)); // add july 2009 Add >("sum",".",new OneOperator1_ >(get_sum0 >)); Add >("min",".",new OneOperator1_ >(get_min0 >)); Add >("max",".",new OneOperator1_ >(get_max0 >)); Add >("l2",".",new OneOperator1_ >(get_l2_0 >)); Add >("l1",".",new OneOperator1_ >(get_l1_0 >)); Add >("linfty",".",new OneOperator1_ >(get_linfty_0 >)); // end add /* Add >("sum",".", new OneOperator1_ >(get_sum0 >)); Add >("min",".", new OneOperator1_ >(get_min0 >)); Add >("max",".", new OneOperator1_ >(get_max0 >)); Add >("l2",".", new OneOperator1_ >(get_l2_0 >)); Add >("l1",".", new OneOperator1_ >(get_l1_0 >)); Add >("linfty",".",new OneOperator1_ >(get_linfty_0 >)); */ Add *>("resize",".",new OneOperator1< Resize >,KN *>(to_Resize)); Add *>("resize",".",new OneOperator1< Resize >,KNM *>(to_Resize)); Add > >("(","",new OneOperator2_ *,Resize > , Z >(resize1)); Add > >("(","",new OneOperator3_ *,Resize > , Z, Z >(resize2)); TheOperators->Add("<-", new OneOperator2_ *,KN *,Z>(&set_init), new InitArrayfromArray // new OneOperator2_ *,KN *,KN >(&set_init), // new OneOperator2_ *,KN *,KN_ >(&set_init) ???? // new OneOperator2_ *,KN *,KN * >(&set_initp) ); TheOperators->Add("<-", new OneOperator2_ > *,KN< KN > * ,Z >(&set_init)); TheOperators->Add("<-", new OneOperator2_ > *,KN< KNM > * ,Z >(&set_init)); TheOperators->Add("<-", new OneOperator3_ *,KNM *,Z,Z>(&set_init2), new InitMatfromAArray ); Add *>("<-","(",new OneOperator2_ *,KN *,Z>(&set_init)); // Add *>("<-","(",new OneOperator2_ *,KN *,KN >(&set_init)); //Add *>("<-","(",new OneOperator2_ *,KN *,KN_ >(&set_init)); // Add *>("<-","(",new OneOperator2_ *,KN *,KN * >(&set_initp)); Add *>("<-","(",new OneOperator3_ *,KNM *,Z,Z>(&set_init2)); TheOperators->Add("<-",new OneOperator2 *,KNM *,Transpose * > >(&set_initmat_t));// may 2011 FH.. TheOperators->Add("=",new OneOperator2 *,KNM *,Transpose * > >(&set_mat_t));// may 2011 FH.. TheOperators->Add("+=",new OneOperator2 *,KNM *,Transpose * > >(&addto_mat_t));// oct 2011 FH.. TheOperators->Add("-=",new OneOperator2 *,KNM *,Transpose * > >(&subto_mat_t));// oct 2011 FH.. // TheOperators->Add("-=",new OneOperator2 *,KNM *,Transpose * > >(&subto_mat_t<-1>));// oct 2011 FH.. // Add *>("<-","(",new OneOperator2 *,KNM *,KNM * >(&set_initmat));// may 2011 FH.. // Add *>("=","(",new OneOperator2 *,KNM *,Transpose * > >(&set_mat_t));// may 2011 FH.. // Add *>("=","(",new OneOperator2 *,KNM *,KNM * >(&set_mat));// may 2011 FH.. // Add *>("=","(",new OneOperator2_ *,KNM *,Transpose * > >(&set_tt)); Add *>("<-","(",new InitArrayfromArray); Add *>("<-","(",new InitMatfromAArray); Add *>("n",".",new OneOperator1 *>(get_n)); Add *>("n",".",new OneOperator1 *>(get_n)); Add *>("m",".",new OneOperator1 *>(get_m)); //ajout ars 2012 FH Add > *>("n",".",new OneOperator1 > *>(get_n)); Add > *>("n",".",new OneOperator1 > *>(get_n)); atype > * >()->Add("[","",new OneOperator2_*,KN >*,Z >(get_elementp_,KN >*,Z>)); atype > * >()->Add("[","",new OneOperator2_*,KN >*,Z >(get_elementp_,KN >*,Z>)); Dcl_Type< Resize > > > (); Dcl_Type< Resize > > >(); Add > * >("resize",".",new OneOperator1< Resize > >,KN > *>(to_Resize)); Add > * >("resize",".",new OneOperator1< Resize > >,KN > *>(to_Resize)); Add > > >("(","",new OneOperator2_ > *,Resize > > , long >(resize1)); Add > > >("(","",new OneOperator2_ > *,Resize > > , long >(resize1)); // AddOpeqarray("="); TheOperators->Add("=", new InitArrayfromArray ); TheOperators->Add("=", new InitMatfromAArray ); TheOperators->Add("=", new SetArrayofKNfromKN ); if(0) // a change il faut regle un PB ambiguite ... TheOperators->Add("=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,KN_ > > , // Add FH juin 2005 new OneBinaryOperator ,Add_Mulc_KN_* > > , // Add FH aug 2005 new OneBinaryOperator ,if_arth_KN_* > > // new OneBinaryOperator ,KN* > > // test aug 2009 ); // add august 2007 TheOperators->Add("<-", // new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,KN_ > > , // Add FH juin 2005 new OneBinaryOperator ,Add_Mulc_KN_* > > , // Add FH aug 2005 new OneBinaryOperator ,if_arth_KN_* > > // new OneBinaryOperator ,KN* > > ); TheOperators->Add("=", new OneBinaryOperator ,K > > , new OneBinaryOperator , KNM * > > ); TheOperators->Add("=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,if_arth_KN_* > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , // Add FH aug 2005 new OneBinaryOperator ,KN_ > >, // add FH juin 2005 new OneBinaryOperator ,KN* > > //- new OneBinaryOperator ,KN* > > ); // ajoute mars 2010 FH TheOperators->Add("<-", new OneBinaryOperator ,KNM_ > > ); TheOperators->Add("=", new OneBinaryOperator ,KNM_ > > // new OneBinaryOperator ,K > > , // new OneBinaryOperator ,KNM_ > >, // new OneBinaryOperator ,KNM* > > ); // end add ... /*if(0) TheOperators->Add("+=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,if_arth_KN_* > > , new OneBinaryOperator ,KN_ > > , // Add FH juin 2005 new OneBinaryOperator ,KN* > > ); */ TheOperators->Add("+=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,if_arth_KN_* > > , new OneBinaryOperator ,KN_ > > // add FH juin 2005 // new OneBinaryOperator ,KN* > > ); /* if(0) TheOperators->Add("-=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,if_arth_KN_* > > , new OneBinaryOperator ,KN_ > > , // Add FH juin 2005 new OneBinaryOperator ,KN* > > );*/ TheOperators->Add("-=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,DotStar_KN_ > > , new OneBinaryOperator ,DotSlash_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,if_arth_KN_* > > , //- new OneBinaryOperator ,KN* > > new OneBinaryOperator ,KN_ > > // Add FH juin 2005 ); /* if(0) TheOperators->Add("*=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,KN* > > );*/ TheOperators->Add("*=", new OneBinaryOperator ,K > > ); TheOperators->Add(".*=", new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , //- new OneBinaryOperator ,KN* > > new OneBinaryOperator ,KN_ > > ); // FH correction 01 nov 2005 FH copy paste mistake eq_ exchange ok v2.0-3 /* if(0) TheOperators->Add("/=", new OneBinaryOperator ,K > > , new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,KN_ > > );*/ TheOperators->Add("/=", new OneBinaryOperator ,K > > ); TheOperators->Add("./=", new OneBinaryOperator ,Add_KN_ > > , new OneBinaryOperator ,Sub_KN_ > > , new OneBinaryOperator ,Mulc_KN_ > > , new OneBinaryOperator ,Divc_KN_ > > , new OneBinaryOperator ,Mul_KNM_KN_ > > , new OneBinaryOperator ,Add_Mulc_KN_* > > , new OneBinaryOperator ,KN_ > > ); // end correction TheOperators->Add("+", new OneBinaryOperator,KN_,KN_ > >, //- new OneBinaryOperator,KN_,KN_ > >(knrp,knrp), new OneBinaryOperator,Mulc_KN_,Mulc_KN_ > >, new OneBinaryOperator,KN_,Mulc_KN_ > >, new OneBinaryOperator,Mulc_KN_ ,KN_ > > ); TheOperators->Add("-", new OneBinaryOperator,KN_ ,KN_ > >, //- new OneBinaryOperator,KN_ ,KN_ > >(knrp,knrp), new OneUnaryOperator,KN_ > >, new OneBinaryOperator,Mulc_KN_,Mulc_KN_ > >, new OneBinaryOperator,KN_,Mulc_KN_ > >, new OneBinaryOperator,Mulc_KN_ ,KN_ > > ); TheOperators->Add("*", //- new OneBinaryOperator,KN*,K> >, //- new OneBinaryOperator,K,KN*> >, new OneBinaryOperator,KN_,K> >, new OneBinaryOperator,K,KN_ > >, new OneBinaryOperator,KNM*,KN*> >, // new OneBinaryOperator,KNM_,KN_> >, // - add #1 mqi 2009 // new OneBinaryOperator >, new OneBinaryOperator > //- ,new OneBinaryOperator,KN*,Transpose > > > ,new OneBinaryOperator,KN_,Transpose > > > ,new OneBinaryOperator,Mulc_KN_,Transpose > > > ); TheOperators->Add("/", new OneBinaryOperator,K,KN_ > >, new OneBinaryOperator,KN_,K > > ); // nouvel operateur TheOperators->Add("+=", new OneBinaryOperator ,outProduct_KN_* > > ); TheOperators->Add("-=", new OneBinaryOperator ,outProduct_KN_* > > ); TheOperators->Add("=", new OneBinaryOperator ,outProduct_KN_* > > ); // tested ok ... FH TheOperators->Add("?:", new OneTernaryOperator3, KN_ > > , new OneTernaryOperator3 > , new OneTernaryOperator3 > , new OneTernaryOperator3 > ); // end ... // add mars 2006 // atype >()->Add("(","",new OneOperator2_< pair,KN_ > * ,KN_ , KN_ >(pBuild< KN_ , KN_ >)); atype >()->Add("(","",new OneOperator2_< pair,KN_ > * ,KN_ , KN_ >(pBuild< KN_ , KN_ >,atype >(), atype >() )); atype *>()->Add("(","",new OneOperator2_< pair,KN_ > * ,KN_ , KN_ >(pBuild< KN_ , KN_ >,atype * >(), atype >() )); //atype >()->Add("(","",new OneOperator2_< pair,KN_ > * ,KN_ , KN_ >(pBuild< KN_ , KN_ >,atype >(), knlp )); //atype *>()->Add("(","",new OneOperator2_< pair,KN_ > * ,KN_ , KN_ >(pBuild< KN_ , KN_ >,atype * >(), knlp )); TheOperators->Add("=", new OneBinaryOperator > > , new OneBinaryOperator > > ); TheOperators->Add("+=", new OneBinaryOperator > > , new OneBinaryOperator > > ); TheOperators->Add("-=", new OneBinaryOperator > > , new OneBinaryOperator > > ); // fin TheOperators->Add("\'", // new OneOperator1 >,KN *>(&Build >,KN *>), new OneOperator1 >,KN_ >(&Build >,KN_ >), new OneOperator1 * >, KNM * >(&Build * >,KNM * >) ); TheOperators->Add(".*", new OneBinaryOperator,KN_,KN_ > > //-, //- new OneBinaryOperator,KN_,KN_ > >(knrp,knrp), //- new OneBinaryOperator,KN_,KN_ > >(knr_,knrp), //- new OneBinaryOperator,KN_,KN_ > >(knrp,knr_) ); TheOperators->Add("./", new OneBinaryOperator,KN_,KN_ > > //-, //- new OneBinaryOperator,KN_,KN_ > >(knrp,knrp), //- new OneBinaryOperator,KN_,KN_ > >(knr_,knrp), //- new OneBinaryOperator,KN_,KN_ > >(knrp,knr_) ); TheOperators->Add("<<", // new OneBinaryOperator*> >, new OneBinaryOperator > >, new OneBinaryOperator > > ); TheOperators->Add("<<", new OneBinaryOperator< PrintPnd< KN< KNM >* > >, new OneBinaryOperator< PrintPnd< KN< KN >* > > ); TheOperators->Add(">>", new OneBinaryOperator >, new OneBinaryOperator > ); map_type[typeid(MyMap*).name()] = new ForEachType*>(Initialize >,Delete >) ; map_type_of_map[make_pair(atype(),atype())]=atype*>(); atype*>()->Add("[","",new OneOperator2_*,string*>(get_element)); // Add Mai 2009 Dcl_Type >(); TheOperators->Add("::", new OneBinaryOperator >, new OneTernaryOperator3 >); TheOperators->Add("<-", new OneOperator2_ *,KN *,SetArray >(&set_init_array)); TheOperators->Add("=", new OneOperator2_ *,KN *,SetArray >(&set_array), new OneOperator2_ *,KN *,KN * >(&set_arrayp), // to reomve ambiguity aug 2009 new OneOperator2_ ,KN_ ,SetArray >(-1,&set_array_) // missing aug 2009 a(:)=1:3 less prioritaire ); } template class OneOperator1F_KN_ : public OneOperator { aType r; // return type typedef A (*func)( B ) ; func f; public: E_F0 * code(const basicAC_F0 & args) const { return new Op(f,t[0]->CastTo(args[0]));} OneOperator1F_KN_(func ff): OneOperator(map_type[typeid(R).name()],map_type[typeid(BB).name()]),f(ff){} class Op :public E_F0 { public: typedef A (*func)(B ) ; func f; Expression a; Op(func ff,Expression aa) : f(ff),a(aa) {} AnyType operator()(Stack s) const {return SetAny( R(f, GetAny( (*a)(s)) ) );} bool EvaluableWithOutStack() const {return a->EvaluableWithOutStack() ;} // bool MeshIndependent() const {return a->MeshIndependent();} // }; }; template void ArrayOperatorF() { Dcl_Type >(); Global.Add("exp","(",new OneOperator1F_KN_,K,KK,KN_ >(exp)); Global.Add("log","(",new OneOperator1F_KN_,K,KK,KN_ >(log)); Global.Add("log10","(",new OneOperator1F_KN_,K,KK,KN_ >(log10)); Global.Add("sqrt","(",new OneOperator1F_KN_,K,KK,KN_ >(sqrt)); Global.Add("sin","(",new OneOperator1F_KN_,K,KK,KN_ >(sin)); Global.Add("cos","(",new OneOperator1F_KN_,K,KK,KN_ >(cos)); Global.Add("tan","(",new OneOperator1F_KN_,K,KK,KN_ >(tan)); Global.Add("cosh","(",new OneOperator1F_KN_,K,KK,KN_ >(cosh)); Global.Add("sinh","(",new OneOperator1F_KN_,K,KK,KN_ >(sinh)); Global.Add("tanh","(",new OneOperator1F_KN_,K,KK,KN_ >(tanh)); // Global.Add("acos","(",new OneOperator1F_KN_,K,KK,KN_ >(acos)); // Global.Add("asin","(",new OneOperator1F_KN_,K,KK,KN_ >(asin)); // Global.Add("atan","(",new OneOperator1F_KN_,K,KK,KN_ >(atan)); TheOperators->Add("=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("+=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("-=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("/=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 TheOperators->Add("*=",new OneBinaryOperator ,F_KN_ > > ); // add FH juin 2005 } freefem++-3.38-1/src/fflib/CodeAlloc.cpp000644 000767 000024 00000007270 12305567354 020026 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include "error.hpp" using namespace std; #include "CodeAlloc.hpp" /* now in global.cpp size_t CodeAlloc::nb=0, CodeAlloc::lg=0,CodeAlloc::nbpx=0,CodeAlloc::chunk=2048; size_t CodeAlloc::nbt,CodeAlloc::nbdl=0; CodeAlloc ** CodeAlloc::mem=0; bool CodeAlloc::sort=true; bool CodeAlloc::cleanning=false; */ static long kerr=0; static long nbsort =0; template static void HeapSort(T *c,long n) { long l,j,r,i; T crit; c--; // on decale de 1 pour que le tableau commence a 1 if( n <= 1) return; l = n/2 + 1; r = n; while (1) { // label 2 if(l <= 1 ) { // label 20 crit = c[r]; c[r--] = c[1]; if ( r == 1 ) { c[1]=crit; return;} } else crit = c[--l]; j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {c[i]=crit;break;} // L8 -> G2 if ((j G2 } } } void CodeAlloc::resize() { Sort_mem(); if( nbt*1.5 +10 >= nbpx ) { nbpx = chunk; mem=(CodeAlloc **)realloc(mem,chunk*sizeof(void*)); if(mem) nbpx=chunk; else ErrorExec("Alloc problem",0); chunk *= 3; chunk /= 2; assert(chunk > nbpx); } } void CodeAlloc::Sort_mem() { size_t i,j; if(nbt ==0) return; nbsort++; HeapSort(mem,nbt); for( i=0,j=0;i nbt) ) Sort_mem(); int ib=0,ie=nbt-1,im; if(pp< mem[ib]) ErrorDel(pp); if(pp> mem[ie]) ErrorDel(pp); int p=-1; while( ib < ie ) { im = (ib + ie)/2; { if( pp < mem[im]) ie=im-1; // in [ib , im-1] else if (mem[im] == pp) { p=im;break;} else ib =im+1;// in [im+1 , ie] } } if( p <0 && mem[ib] == pp) p=ib; if(p<0) ErrorDel(pp); else { setdel(p); //le tableau est detruit nbdl++;nb--; ::operator delete(pp); } } freefem++-3.38-1/src/fflib/CodeAlloc.hpp000644 000767 000024 00000004015 12514225565 020022 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class CodeAlloc { public: static size_t nb,nbt,lg, nbdl,nbpx, chunk ; static CodeAlloc ** mem; static bool cleanning; static void * lgmax; static bool sort; static size_t memoryusage; // add FH mach 2014 .. static CodeAlloc * tnull; static bool isdel(int i) { return ((char *) (void *) mem[i] - (char *) 0) % 2 == 1; } static void setdel(int i) { mem[i] = (CodeAlloc *) (void *) (((char *) mem[i] - (char *) 0)+ 1); } static void resize(); static void * Add2CleanAtEnd(void * p) { if(p) { if(nbt>=nbpx) resize(); if(nbt>0) sort = sort && mem[nbt-1] < p; nb++; mem[nbt++]=(CodeAlloc*)p; } return p; } void *operator new(size_t ll ) { lg+=ll; return Add2CleanAtEnd(::operator new(ll));} static void Sort_mem(); static void clear(); static void ErrorDel(void *pp); void operator delete(void * pp); virtual ~CodeAlloc() {} }; template class CodeAllocT: public CodeAlloc{ T * p; public: CodeAllocT(int n): p(new T[n]) { assert(p);} static T * New(int n) { return (new CodeAllocT(n))->p;} ~CodeAllocT(){ delete [] p;} }; freefem++-3.38-1/src/fflib/endian.hpp000644 000767 000024 00000007640 11406226635 017440 0ustar00hechtstaff000000 000000 #ifndef ENDIAN_HPP__ #define ENDIAN_HPP__ // -------------------------------------------- // read and write without endianess problem. // the choise is little endian , such than the // the order of the bytes is the same order of // a shift operator << in a integer. // F. Hecht. // -------------------------------------------- template inline void w_endian(const unsigned char * c,unsigned char * k) {cerr<< " L = "<< L << endl; assert(0); } template inline void r_endian(const unsigned char *c,unsigned char * k) {assert(0); } template<> inline void w_endian<1>(const unsigned char *c,unsigned char* k) {*k=*c;} template<> inline void w_endian<8>(const unsigned char *c,unsigned char* k) { static const unsigned long long ull =( 0ULL + (1ULL << 8) + (2ULL << 16) + (3ULL << 24) + (4ULL << 32) + (5ULL << 40) + (6ULL << 48 ) + (7ULL << 56 )); static const unsigned char *o = reinterpret_cast(&ull); // cout << " ++++ " << ull << " .. " ; // for(int i=0;i<8;++i) cout <<(int) o[i] ; assert(8==sizeof(ull)); k[o[0]]=c[0]; k[o[1]]=c[1]; k[o[2]]=c[2]; k[o[3]]=c[3]; k[o[4]]=c[4]; k[o[5]]=c[5]; k[o[6]]=c[6]; k[o[7]]=c[7]; // cout << " --- " ; // for (int i=0;i<8;++i) // cout << k[i] ; // cout << k << endl; } /* template std::ostream &dump(std::ostream & f, const T &t) { const unsigned char *o = reinterpret_cast(&t); // f << " " << t << " " << & t << " == " << (void *) o << " -> "; for( int i=0;i< sizeof(t); ++i) f << (unsigned int) o[i] ; return f; } */ template<> inline void w_endian<4>(const unsigned char *c,unsigned char * k) { static const unsigned int u0123 = 0U + (1U << 8) + (2U << 16) + (3U << 24); static const unsigned char *o = reinterpret_cast(&u0123); // ordre c[o^-1] : si o: 0123 -> 2130 // si c == 1U + (2U << 8) + (3U << 16) + (4U << 24); // alors k[0] = 1, k[1]=2, k[2] = 3, k[3]=4 // ------------------ assert(4==sizeof(u0123)); k[o[0]]=c[0]; k[o[1]]=c[1]; k[o[2]]=c[2]; k[o[3]]=c[3]; } template<> inline void w_endian<2>(const unsigned char *c,unsigned char *k) { static const unsigned short int u01 = 0U + (1U << 8); static const unsigned char *o = reinterpret_cast(&u01); assert(2==sizeof(u01)); k[o[0]]=c[0]; k[o[1]]=c[1]; } template<> inline void r_endian<1>(const unsigned char *c,unsigned char *k) { *k=*c; } template<> inline void r_endian<8>(const unsigned char *c,unsigned char *k) { static const unsigned long long ull =( 0ULL + (1ULL << 8) + (2ULL << 16) + (3ULL << 24) + (4ULL << 32) + (5ULL << 40) + (6ULL << 48 ) + (7ULL << 56 )); static const unsigned char *o = reinterpret_cast(&ull); assert(8==sizeof(ull)); k[0]=c[o[0]]; k[1]=c[o[1]]; k[2]=c[o[2]]; k[3]=c[o[3]]; k[4]=c[o[4]]; k[5]=c[o[5]]; k[6]=c[o[6]]; k[7]=c[o[7]]; } template<> inline void r_endian<4>(const unsigned char c[4],unsigned char k[4]) { static const unsigned int u0123 = 0U + (1U << 8) + (2U << 16) + (3U << 24); static const unsigned char *o = reinterpret_cast(&u0123); assert(4==sizeof(u0123)); k[0]=c[o[0]]; k[1]=c[o[1]]; k[2]=c[o[2]]; k[3]=c[o[3]]; } template<> inline void r_endian<2>(const unsigned char c[2],unsigned char k[2]) { static const unsigned short u01 = 0U + (1U << 8) ; static const unsigned char *o = reinterpret_cast(&u01); assert(2==sizeof(u01)); k[0]=c[o[0]]; k[1]=c[o[1]]; } template inline T r_endian(const T & t ) { T r; r_endian(reinterpret_cast(&t),reinterpret_cast(&r)); return r; } template inline T w_endian(const T & t ) { T r; w_endian(reinterpret_cast(&t),reinterpret_cast(&r)); return r; } #endif freefem++-3.38-1/src/fflib/environment.cpp000644 000767 000024 00000022630 12406033654 020533 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "environment.hpp" #include "iostream" #include #include #include #include #include // set in getprog-unix.hpp in Graphic dir.. const char * prognamearg=0; extern void (*initparallele)(int &, char **&); // to know if mpiversion ... #ifdef PURE_WIN32 #include #endif #ifdef HAVE_GETENV #include #endif using namespace std; bool load(string s); const char SLACH='/'; const char BACKSLACH='\\'; #ifdef PURE_WIN32 const char dirsep=BACKSLACH, dirnsep=SLACH; #else const char dirnsep=BACKSLACH, dirsep=SLACH; #endif string DirName(const char * f) { const char *c= strrchr(f,dirsep); if(!c) return string(""); else return string(f,strlen(f)-strlen(c)); } string TransDir(string dir) { for (size_t i=0; i1 && dir[dir.size()-1] != dirsep) dir += dirsep; return dir; } template void show(const char * s,const T & l,const char * separateur="\n") { cout << s << * separateur; for (typename T::const_iterator i=l.begin(); i != l.end(); i++) cout << * i << * separateur; //cout << endl; } bool EnvironmentFind(string key,string item) { EnvironmentData::iterator ekey=ffenvironment.find(key); if( ekey != ffenvironment.end()) { OneEnvironmentData * pl= &ekey->second; OneEnvironmentData::iterator i=find(pl->begin(),pl->end(),item); return i != pl->end(); } return false; } bool EnvironmentClean(string key) { EnvironmentData::iterator ekey=ffenvironment.find(key); if( ekey != ffenvironment.end()) { OneEnvironmentData * pl= &ekey->second; pl->clear(); return true; } return false; } bool EnvironmentInsert(string key,string item,string before) { bool ret=true; OneEnvironmentData & l = ffenvironment[key]; char sufmpi[] = {'m','p','i',dirsep,'\0'}; string suf= ((key== "loadpath") && initparallele ) ? sufmpi : ""; if( ! suf.empty() ) if((item.find("mpi") == string::npos ) && (item.find("MPI") == string::npos ) && item != "." && item != "./" && item !="") { if(verbosity>=100) cout << " EnvironmentInsert: Add suf " << suf << " to " << item << " in GetEnvironment "<< key << endl; item += suf; } OneEnvironmentData::iterator i=find(l.begin(),l.end(),item); if(i!=l.end()) {ret=false; l.erase(i);} // if existe remove i=find(l.begin(),l.end(),before); if(verbosity>=100) cout << " insert " << key << " " << item << " " << before << endl; if(i == l.end() && before!="$") l.insert(l.begin(),item); // insert in front else l.insert(i,item); // insert before i return ret; } int GetEnvironment(const string & key, string items) { if(verbosity>=100) cout << key << " -> " << items << endl; bool path=key.find("path")!= string::npos; int d=0, k=0; if(path) items+=";;"; for (size_t i=0;i=100) cout << " + " << item << endl; if(!EnvironmentFind(key,item)) { EnvironmentInsert(key,item,"$"); k++; } d=i+1; } return k; } int readinitfile(const string & file) { string line=""; string key; string value; bool add=false; ifstream f(file.c_str()); if( ! f) { if(verbosity>=20) cout << "error opening init file: " << file << endl; return 0;} char c,c1,bv=0; int linenumber = 1; bool inkey=false,invalue=false,cmm=false; while (f) { c= f.get(); c1=f.peek(); //cout << c ; // if(bv) //cerr << bv ; //else cerr << '.'; if(c == EOF) break; if(c =='\n' || c=='\r' ) { linenumber++; line=""; cmm = false; } else line+= c; if(c=='#') cmm=true; if(!cmm) { if(invalue) // get value key [=|+= value ] { if (bv) // store the value { if (! (c == bv || ( bv==' ' && isspace(c)) ) ) { value+= c; // add to value } else // end of value { bv =0; invalue=0; // fin de la value if(verbosity >= 50) cout < 0) ff_verbosity=envv; if (GetEnvironmentVariable("FF_LOADPATH", envl, LEN) > 0) ff_loadpath=envl; if (GetEnvironmentVariable("FF_INCLUDEPATH", envi, LEN) > 0) ff_incpath=envi; if (GetEnvironmentVariable("HOMEPATH", envh, LEN) > 0) home=envh; #endif if ( ff_verbosity ) { verbosity = atoi(ff_verbosity); } #ifdef PURE_WIN32 #else EnvironmentInsert("init-files","/etc/"+ffpref,"$"); #ifdef FF_PREFIX_DIR_APPLE EnvironmentInsert("init-files",string(FF_PREFIX_DIR_APPLE) + "/etc/" + ffpref ,"$"); #endif #ifdef FF_PREFIX_DIR EnvironmentInsert("init-files",string(FF_PREFIX_DIR) + "/etc/" + ffpref ,"$"); #endif if(prognamearg) { if( strchr(prognamearg,dirsep) ) { EnvironmentInsert("init-files",TransDir(DirName(prognamearg))+"/../etc/"+ffpref,"$"); } } #endif if(home) EnvironmentInsert("init-files",TransDir(home)+"."+ffpref,"$"); EnvironmentInsert("init-files",ffpref,"$"); { OneEnvironmentData & l = ffenvironment["init-files"]; OneEnvironmentData::iterator i=l.begin(); while( i != l.end()) { if(verbosity>2) cout << " try initfile : " <<*i << endl; readinitfile(*i++); } } if ( ff_verbosity ) { verbosity = atoi(ff_verbosity); } if(ff_loadpath) GetEnvironment("loadpath",ff_loadpath); if(ff_incpath) GetEnvironment("includepath",ff_incpath); EnvironmentInsert("includepath","","");// always add "" the first include path if( verbosity >2) { EnvironmentData::iterator loadpath=ffenvironment.find("loadpath"); EnvironmentData::iterator inc=ffenvironment.find("includepath"); if( loadpath != ffenvironment.end()) { show("\nload path : ",loadpath->second, "\n \t "); cout <<"(.)"<second, "\n \t "); cout <<"(.)"<2) cout << " -- verbosity is set to " << verbosity << endl; } } void EnvironmentLoad() { EnvironmentData::iterator toload=ffenvironment.find("load"); if( toload != ffenvironment.end()) for (OneEnvironmentData::iterator i=toload->second.begin(); i != toload->second.end(); ++i) { if(verbosity) cout << "PreEnv load :"<< *i << endl; load(*i); } } #ifdef TESTMAIN long verbosity=50; EnvironmentData environment; int main() { GetEnvironment(); return 0; } #endif freefem++-3.38-1/src/fflib/environment.hpp000644 000767 000024 00000002405 11406226635 020540 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config-wrapper.h" #include #include #include typedef std::list OneEnvironmentData; typedef std::map EnvironmentData; extern EnvironmentData ffenvironment; extern long verbosity; bool EnvironmentInsert(std::string key,std::string item,std::string before); void GetEnvironment(); void EnvironmentLoad(); freefem++-3.38-1/src/fflib/error.hpp000644 000767 000024 00000007067 11406226635 017336 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ERROR_H #define ERROR_H #include #include #include "throwassert.hpp" #include extern int TheCurrentLine; #if defined(__GNUC__) && __GNUC__+0 < 3 #include typedef istrstream istringstream ; typedef ostrstream ostringstream ; #define ENDS << '\0' #define OLDCPP 1 #else // car ostringstream n'est pas encore defin sous g++ // #include #define ENDS #endif using std::exception; extern long mpirank; class Error : public exception { public: enum CODE_ERROR { NONE, COMPILE_ERROR,EXEC_ERROR, MEM_ERROR,MESH_ERROR,ASSERT_ERROR,INTERNAL_ERROR, UNKNOWN }; private: std::string message; const CODE_ERROR code; protected: Error(CODE_ERROR c,const char * t1,const char * t2,const char * t3=0, int n=0,const char * t4=0,const char * t5=0,const char * t6=0, const char * t7=0,const char * t8=0,const char * t9=0) : message(),code(c) { using namespace std; ostringstream mess; if(t1) mess << t1; if(t2) mess << t2; if(t3) mess << t3 << n ; if(t4) mess << t4; if(t5) mess << t5; if(t6) mess << t6; if(t7) mess << t7; if(t8) mess << t8; if(t9) mess << t9; message = mess.str(); extern void ShowDebugStack(); ShowDebugStack(); if (c!=NONE && mpirank==0) cerr << message << endl; // cerr << " at exec line " << TheCurrentLine << endl; } public: virtual int errcode() const {return code;} virtual const char * what() const throw () { return message.c_str(); } virtual ~Error() throw () {} }; class ErrorCompile : public Error { public: ErrorCompile(const char * Text,int l,const char * t2="") : Error(COMPILE_ERROR,"Compile error : ",Text,"\n\tline number :",l,", ", t2) {} }; class ErrorExec : public Error { public: ErrorExec(const char * Text,int l) : Error(UNKNOWN,"Exec error : ",Text, "\n -- number :", l) {} }; class ErrorInternal : public Error { public: ErrorInternal(const char * Text,int l,const char * t2="") : Error(INTERNAL_ERROR,"Internal error : ",Text, "\n\tline :",l,", in file ", t2) {} }; class ErrorAssert : public Error { public: ErrorAssert(const char * Text,const char *file,const int line) : Error(ASSERT_ERROR,"Assertion fail : (",Text, ")\n\tline :", line,", in file ",file) {} }; class ErrorMemory : public Error { public: ErrorMemory(const char * Text,int l=0) : Error(MEM_ERROR,"Memory Error : ",Text," number: ",l) {} }; class ErrorExit : public Error { int codeexit; public: ErrorExit(const char * ,int l) : Error(NONE,"exit","(","",l,")"), codeexit(l) {} // the exit code fo freefem++ is given by l int errcode() const{return codeexit;} }; #endif freefem++-3.38-1/src/fflib/ff++.hpp000644 000767 000024 00000001663 11654735104 016723 0ustar00hechtstaff000000 000000 #ifndef FF___HPP_ #define FF___HPP_ // a not to bad list of freefem++ include // to simplify like of programmer. // FH. #include #include #include #include #include #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "ufunction.hpp" using namespace std; #include "rgraph.hpp" #include "RNM.hpp" // after RNM otherwise // trouble with index in RNM (I do no understander FH) #include #include #include #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include "Mesh2dn.hpp" #include "Mesh3dn.hpp" #include "Operator.hpp" #include "lex.hpp" #include "libmesh5.h" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" #include "Mesh2.h" #include "BamgFreeFem.hpp" #include "ffapi.hpp" #endif freefem++-3.38-1/src/fflib/ffapi.cpp000644 000767 000024 00000021175 12471677270 017271 0ustar00hechtstaff000000 000000 #ifdef WITH_PETSC #include #endif /// \file /// ====================================================================== /// Written by Antoine Le Hyaric /// Laboratoire Jacques-Louis Lions /// Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France /// http://www.ljll.math.upmc.fr/lehyaric /// ====================================================================== /// This file is part of Freefem++ /// /// Freefem++ is free software; you can redistribute it and/or modify /// it under the terms of the GNU Lesser General Public License as /// published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// /// Freefem++ is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU Lesser General Public License for more details. /// /// You should have received a copy of the GNU Lesser General Public /// License along with Freefem++; if not, write to the Free Software /// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA /// 02110-1301 USA /// ====================================================================== /// headeralh cpp freefem start=21/01/10 upmc // Proposed FreeFem++ Application Programming Interface // ---------------------------------------------------- // headerfilter #include "ffapi.hpp" #ifdef FFLANG #include "socket.hpp" #include "spawn.hpp" #include "buffer.hpp" #endif #include #include #ifndef FFLANG #include #endif #ifdef FFLANG #include "options.hpp" #include #endif #ifndef FFLANG #ifdef _WIN32 #include #endif #endif #ifndef FFLANG #ifdef PARALLELE #include "mpi.h" #endif #endif // FFCS-specific implementations for the FF API // -------------------------------------------- /// FFLANG defined means that FFCS is being compiled. I am fairly confident that FFCS will not be defined while /// compiling the original FF. /// Need to choose a non-zero stream number because FF will check it (as global variable ThePlotStream) #define FFAPISTREAM 1 /// if FFCS is around, we need to bufferize all communications to avoid mixing up CMD_FFG and CMD_STDOUT messages #ifdef FFLANG void bufferwrite(const char *b,const int l){ Socket::dialoglock->WAIT(); // need #include "socket.hpp" // thank to the buffering, there is only one CMD_FFG tag for multiple visualization data items. onlyffsock()<(b),l); Socket::dialoglock->Free(); } Buffer buffer(NULL,bufferwrite); // need #include "buffer.hpp" #endif // allocation/definition of all ffapi in Global.cpp namespace ffapi{ // Get a pointer to the local cin/cout (which is distinct from ffcs's stdin/stdout under Windows because each DLL owns // separate cin/cout objects). // need #include static std::istream *ffapi_cin(){return &std::cin;} static std::ostream *ffapi_cout(){return &std::cout;} static std::ostream *ffapi_cerr(){return &std::cerr;} // FFCS - ::stdout not accepted under mingw32 // need #include static FILE *ffapi_ffstdout(){return stdout;} static FILE *ffapi_ffstderr(){return stderr;} static FILE *ffapi_ffstdin(){return stdin;} static void ffapi_newplot(){} FILE *ffapi_ff_popen(const char *command, const char *type){ #ifdef FFLANG // this happens right at the begining of FF, so the socket // communication must not be started yet (only when actual // visualization data needs to be transfered). PROGRESS; return (FILE*)FFAPISTREAM; #else // need #include return popen(command,type); #endif } static int ffapi_ff_pclose(FILE *stream){ #ifdef FFLANG // nothing to close in FFCS return 0; #else return pclose(stream); #endif } static size_t ffapi_fwriteinit(const void *ptr, size_t size, size_t nmemb,FILE *stream){ // printf() is useful for debug because it is not redirected through // the FFCS socket. But it is asynchronous with cout so it may end up // in the middle of the lines checked by test/compare. So deactivate // it by default. #ifdef DEBUG_FFAPI #ifdef FFLANG printf("debug: ffapi: using TCP sockets\n"); #else printf("debug: ffapi: using an anonymous pipe\n"); #endif // FFLANG #endif // DEBUG_FFAPI #ifdef FFLANG // Ask FFCS to analyze the visualization flux header. I could just skip this stage, but it will be useful to check // the coherency between FFCS and FF when FF evolves in the future. Socket::dialoglock->WAIT(); onlyffsock()<Free(); #endif return ff_fwrite(ptr,size,nmemb,stream); } static size_t ffapi_ff_fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream){ #ifdef FFLANG // if the ffsock pointer is null here, it means that the pointer exported from the FFCS shared library is not a // valid one (this has been the case with Windows DLLs in the past). // we won't make use of the stream, but make sure that the call from // FF is coherent with what we know. assert(stream==(FILE*)FFAPISTREAM); buffer.write(static_cast(ptr),size*nmemb); // stops the server flux at one precise point (point value expressed during a previous crash while reading server // data in the client in visudata.cpp). Use abort() to call the debugger (which can display the call stack and show // where the problematic pipe value came from). // need #include "options.hpp" if(options->AbortFFGraphicsDataAt==buffer.getpoint())abort(); // need #include #else fwrite(ptr,size,nmemb,stream); #endif return 0; } static int ffapi_ff_fflush(FILE *stream){ #ifdef FFLANG assert(stream==(FILE*)FFAPISTREAM); // we need to flush both the buffer and the socket to avoid a separate callback for flush in the buffer buffer.flush(); // ff_fflush() is used by FF only at the end of a plot, so we can use this location to send a marker for the // sequential java client to deal with one complete plot at a time. Socket::dialoglock->WAIT(); onlyffsock()<Free(); #else fflush(stream); #endif return 0; } static int ffapi_ff_ferror(FILE *stream){ #ifndef FFLANG return ferror(stream); #else return 0; #endif } static int ffapi_ff_feof(FILE *stream){ #ifndef FFLANG return feof(stream); #else return 0; #endif } static void ffapi_wintextmode(FILE *f){ #ifndef FFLANG #ifdef _WIN32 // need #include _setmode(fileno(f),O_TEXT); #endif #endif } static void ffapi_winbinmode(FILE *f){ #ifndef FFLANG #ifdef _WIN32 _setmode(fileno(f),O_BINARY); #endif #endif } static void ffapi_mpi_init(int &argc, char** &argv){ /// only call MPI_Init() if this has not already been done in ffcs/src/server.cpp #ifndef FFLANG #ifdef PARALLELE // need #include "mpi.h" int provided; MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); if(provided < MPI_THREAD_SERIALIZED) { MPI_Comm_rank(MPI_COMM_WORLD, &provided); if(provided == 0) std::cout << "MPI_THREAD_SERIALIZED not supported !" << std::endl; } #ifdef WITH_PETSCxxxxx PetscInitialize(&argc, &argv, 0, ""); #endif #endif #endif } static void ffapi_mpi_finalize(){ #ifndef FFLANG #ifdef PARALLELE #ifdef WITH_PETSCxxxxxxxx PetscFinalize(); #endif MPI_Finalize(); #endif #endif } static bool ffapi_protectedservermode(){ #ifdef FFLANG return !options->LocalClient; #else return false; #endif } void init(){ ffapi::cin = ffapi::ffapi_cin; ffapi::cout = ffapi::ffapi_cout; ffapi::cerr = ffapi::ffapi_cerr; ffapi::ffstdout = ffapi::ffapi_ffstdout; ffapi::ffstderr = ffapi::ffapi_ffstderr; ffapi::ffstdin = ffapi::ffapi_ffstdin; ffapi::newplot = ffapi::ffapi_newplot; ffapi::ff_popen = ffapi::ffapi_ff_popen; ffapi::ff_pclose = ffapi::ffapi_ff_pclose; ffapi::fwriteinit = ffapi::ffapi_fwriteinit; ffapi::ff_fwrite = ffapi::ffapi_ff_fwrite; ffapi::ff_fflush = ffapi::ffapi_ff_fflush; ffapi::ff_ferror = ffapi::ffapi_ff_ferror; ffapi::ff_feof = ffapi::ffapi_ff_feof; ffapi::wintextmode = ffapi::ffapi_wintextmode; ffapi::winbinmode = ffapi::ffapi_winbinmode; ffapi::mpi_init = ffapi::ffapi_mpi_init; ffapi::mpi_finalize = ffapi::ffapi_mpi_finalize; ffapi::protectedservermode = ffapi::ffapi_protectedservermode; } } /// Local Variables: /// mode:c++ /// ispell-local-dictionary:"british" /// coding:utf-8 /// End: freefem++-3.38-1/src/fflib/ffapi.hpp000755 000767 000024 00000010051 12472661136 017263 0ustar00hechtstaff000000 000000 /// \file /// ====================================================================== /// Written by Antoine Le Hyaric /// Laboratoire Jacques-Louis Lions /// Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France /// http://www.ljll.math.upmc.fr/lehyaric /// ====================================================================== /// This file is part of Freefem++ /// /// Freefem++ is free software; you can redistribute it and/or modify /// it under the terms of the GNU Lesser General Public License as /// published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// /// Freefem++ is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU Lesser General Public License for more details. /// /// You should have received a copy of the GNU Lesser General Public /// License along with Freefem++; if not, write to the Free Software /// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA /// 02110-1301 USA /// ====================================================================== /// headeralh cpp freefem start=21/01/10 upmc // Proposed FreeFem++ Application Programming Interface // ---------------------------------------------------- // headerfilter #ifndef FFAPI_HPP #include #include #include using namespace std; #endif //FFAPI_HPP #ifndef FFAPI_HPP #define FFAPI_HPP // void ff_finalize(); // void ff_atend( void (*atendff)()); typedef void (*AtEnd)(); void ff_atend(AtEnd f); // big change F. Hecht Frev 2015 // passe all function by pointer namespace ffapi{ // Redirecting the FF data stream // ------------------------------ // Getting a pointer to FF stdin and stdout enables extra DLLs to use standard IO even when they are redirected (eg // through FFCS). void init (); // init def all pointeur // need #include // need #include // need using namespace std; extern std::istream * (*cin)(); extern std::ostream *(*cout)(); extern std::ostream *(*cerr)(); // <> Cannot name these functions identically to the original file pointers under MingW32 (compile // error). Impacts [[file:InitFunct.hpp::LOADINITIO]]. Changed from stdxxx_ptr() to ffstdxxx() according to the way FF // itself was changed. extern FILE *(*ffstdout)(); extern FILE *(*ffstderr)(); extern FILE *(*ffstdin)(); /// Initiate graphical pipe output. I need a separate function for this to warn ffcs to check the corresponding ffglut /// magic number extern size_t (*fwriteinit)(const void *ptr, size_t size, size_t nmemb,FILE *stream); /// Indicates the begining of a new plot to avoid sending socket control data with each plot item. extern void (*newplot)(); /// Redefinition of standard system calls extern FILE *(*ff_popen)(const char *command, const char *type); extern int (*ff_pclose)(FILE *stream); extern size_t (*ff_fwrite)(const void *ptr, size_t size, size_t nmemb,FILE *stream); extern int (*ff_fflush)(FILE *stream); extern int (*ff_ferror)(FILE *stream); extern int (*ff_feof)(FILE *stream); // Windows file mode // ----------------- /// Changing file mode needs to be disabled when the file is a TCP socket to FFCS. Since the treatment is different in /// FF and in FFLANG executables, they have to be stored in a DLL that changes between these two programs. extern void (*wintextmode)(FILE *f); extern void (*winbinmode)(FILE *f); // Transfer basic MPI control // -------------------------- extern void (*mpi_init)(int &argc, char **& argv); extern void (*mpi_finalize)(); // Permanent server control // ------------------------ /// if true, FF is considered to be accessible from remote anonymous connections and some commands (like shell /// commands) are not allowed. extern bool (*protectedservermode)(); } #endif // FFAPI_HPP /// Local Variables: /// mode:c++ /// ispell-local-dictionary:"british" /// coding:utf-8 /// End: freefem++-3.38-1/src/fflib/ffstack.hpp000644 000767 000024 00000023526 12514154565 017627 0ustar00hechtstaff000000 000000 /// \file // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //----------------------------------- // to manage the freefem stack #include "throwassert.hpp" // in the stack we save all the variable // a adresse 0 we have the MeshPointStack to defineP,N, .... // a adresse sizeof(void *) // // // Offset in (void *) const int MeshPointStackOffset =0; const int ParamPtrOffset = 1; const int ElemMatPtrOffset = 2; const int ExprPtrs = 4; const int NbPtrs = 5; const int BeginOffset = 6; // 0 : MeshPoint pointeur // 1 : ParamPtrOffset // 2 : Truc les matrice elementaire #define NEWFFSTACKxxx #ifndef NEWFFSTACK typedef void StackType; /// <> typedef void *Stack; const Stack NullStack=0; //typedef StackType& Stack; inline Stack pvoid2Stack(void * pv) { return pv;} template T * Stack_offset (Stack stack,size_t offset) { //cout << "Stack_offset" << stack << " " << offset << endl; return (T *) (void *) (((char *) stack)+offset);} template T * & Stack_Ptr (Stack stack,size_t offset) {return (T * &) (((void **) stack)[offset]);} void ShowType(ostream & f); struct VOIDPtrType { virtual ~VOIDPtrType(); }; template struct PtrType: public VOIDPtrType { T * p; PtrType(T* pp):p(pp) {} ~PtrType() {delete p;} }; template struct PtrArrayType: public VOIDPtrType { T * p; PtrArrayType(T* pp):p(pp) {} PtrArrayType() {delete [] p;} }; #else struct StackType; //typedef void *Stack; /// Stack used by CListOfInst::eval() typedef StackType & Stack; struct StackType { size_t lg; char * stack; char * MeshPointStack; operator char *() { return stack;} operator void *() { return stack;} operator long *() { return (long *)(void *)stack;} operator void **() {return (void **) (void *) stack;} operator StackType *() { return this;} template T * Offset(size_t offset){ return (T*) (void*) (stack+offset);} template T *& ptr(size_t offset){ return (T* &) ((void**) (void *) stack)[offset];} StackType(size_t ll) :lg(ll),stack(new char[ll]),MeshPointStack(new char[1000]) { long * p= ptr(0); long l4=lg/sizeof(long); for (int i = 0;i< l4;i++) p[i]=0; ptr(MeshPointStackOffset)=MeshPointStack; } void clean() { delete []stack; delete [] MeshPointStack; } }; inline Stack pvoid2Stack(void * pv) { return *static_cast(pv) ;} static StackType * NullStackPtr= 0; static StackType & NullStack(*NullStackPtr); //typedef StackType& Stack; template T * Stack_offset (Stack stack,size_t offset) {return stack.Offset(offset);} template T * & Stack_Ptr (Stack stack,size_t offset) {return (T * &) (((void **) (void *) stack.stack)[offset]);} void ShowType(ostream & f); struct VOIDPtrType { virtual ~VOIDPtrType(); }; template struct PtrType: public VOIDPtrType { T * p; PtrType(T* pp):p(pp) {} ~PtrType() {delete p;} }; template struct PtrArrayType: public VOIDPtrType { T * p; PtrArrayType(T* pp):p(pp) {} PtrArrayType() {delete [] p;} }; #endif //------------------------------------ // Add FH mars 2006 // clean pointeur ceated by the language // ---- struct BaseNewInStack { virtual ~BaseNewInStack() {}; }; struct BaseNewInStack ; struct StackOfPtr2Free; inline StackOfPtr2Free * & WhereStackOfPtr2Free(Stack s) { return Stack_Ptr(s,ExprPtrs) ;} // fait struct StackOfPtr2Free { typedef vector::iterator iterator; StackOfPtr2Free ** where; // where is store the ptr to the stack StackOfPtr2Free *prev; // previous stack vector stackptr; static const int sizeofmemory4tmp=1024; int topmemory4tmp; char *memory4tmp ; // void add(BaseNewInStack *p) { // cout << "\n\t\t ### ptr/lg add " << p << " at " << stackptr.size() << " \n"; stackptr.push_back(p);} public: StackOfPtr2Free(Stack s): where(&WhereStackOfPtr2Free(s)), prev(*where), topmemory4tmp(0), // add FH oct 2008 of tmp allocation clean after each instruction memory4tmp(new char[sizeofmemory4tmp]) // add FH oct 2008 of tmp allocation clean after each instruction { stackptr.reserve(20); if(prev) Add2StackOfPtr2Free(s,this); } bool clean() { topmemory4tmp=0;// clean the tmp allocation bool ret= !stackptr.empty(); if(ret) { if(stackptr.size()>=20 && verbosity>2) // FFCS: nothing on following line for tests/compare cout << "\n\t\t ### big?? ptr/lg clean " << stackptr.size() << " ptr's\n"; for (iterator i=stackptr.end(); i != stackptr.begin();) { delete (* (--i) ); //cout << "StackOfPtr2Free: clean " << (* (i) ) << endl; } stackptr.resize(0);// clean the } return ret; } void * alloc(int lg) { int lg8=lg%8; if(lg8) lg += 8-lg8; if(topmemory4tmp + lg>= sizeofmemory4tmp) { ErrorExec(" Fatal Error: too much temporary alloction, your expression is too long, or a bug in ff++, FH; april,2015",1); ffassert(0);} void * p=static_cast (memory4tmp+topmemory4tmp);// correct FH Oct 2009 topmemory4tmp+= lg; return p; } ~StackOfPtr2Free() {clean();delete [] memory4tmp; *where=prev;} // restore the previous stack private:// no copy .... StackOfPtr2Free(const StackOfPtr2Free&); void operator =(const StackOfPtr2Free&); template friend T * NewTmp(Stack s); template friend T * Add2StackOfPtr2Free(Stack s,T * p); }; inline void * NewAllocTmp(Stack s,size_t l) { return WhereStackOfPtr2Free(s)->alloc(l); } template struct NewInStack: public BaseNewInStack { T * p; bool array; ~NewInStack() { // cout << "~NewInStack " << typeid(T).name() << " " << p << " array " << array << " " << this << "\n"; if(p) delete p;} private: NewInStack(T * pp,bool aa=false) : p(pp),array(aa) { // cout << "NewInStack " << typeid(T).name() << " " << p << " array " << aa << " " << this << "\n"; } template friend TT * Add2StackOfPtr2FreeA(Stack s,TT * p); template friend TT * Add2StackOfPtr2Free(Stack s,TT * p); }; // ajout of 2 class NewRefCountInStack and NewArrayInStack // for clean of meshes template struct NewRefCountInStack: public BaseNewInStack { T * p; bool array; ~NewRefCountInStack() { // cout << "~NewInStack " << typeid(T).name() << " " << p << " array " << array << " " << this << "\n"; if(p) p->destroy();} private: NewRefCountInStack(T * pp,bool aa=false) : p(pp),array(aa) { // cout << "NewInStack " << typeid(T).name() << " " << p << " array " << aa << " " << this << "\n"; } template friend TT * Add2StackOfPtr2FreeRC(Stack s,TT * p); }; template struct NewArrayInStack: public BaseNewInStack { T * p; bool array; ~NewArrayInStack() { // cout << "~NewInStack " << typeid(T).name() << " " << p << " array " << array << " " << this << "\n"; if(p) delete [] p; } private: NewArrayInStack(T * pp,bool aa=false) : p(pp),array(aa) { // cout << "NewInStack " << typeid(T).name() << " " << p << " array " << aa << " " << this << "\n"; } template friend TT * Add2StackOfPtr2FreeA(Stack s,TT * p); template friend TT * Add2StackOfPtr2Free(Stack s,TT * p); }; template T * Add2StackOfPtr2FreeRC(Stack s,T * p) { if(p) WhereStackOfPtr2Free(s)->add(new NewRefCountInStack(p)); return p; } template T * Add2StackOfPtr2Free(Stack s,T * p) { if(p) WhereStackOfPtr2Free(s)->add(new NewInStack(p)); return p; } template T * Add2StackOfPtr2FreeA(Stack s,T * p) { if(p) WhereStackOfPtr2Free(s)->add(new NewArrayInStack(p)); return p; } // fin modif gestion of allocation of Ptr in Language // --------------------------------------------------- #ifndef NEWFFSTACK /// <> inline Stack newStack(size_t l) { char * mps; Stack thestack = new char[l]; for (size_t i = 0;i< l/sizeof(long);i++) ((long*) thestack)[i]=0; ((char **) thestack)[MeshPointStackOffset] = mps = new char [1000]; for(int i=0;i<1000;++i) mps[i]=0; WhereStackOfPtr2Free(thestack)=new StackOfPtr2Free(thestack); return thestack; // return *new StackType(l);} } inline void deleteStack(Stack s) { delete WhereStackOfPtr2Free(s); // add gestion of the Ptr delete [] (((char **) s)[MeshPointStackOffset]); delete [] (char *) s; // s.clean(); } #else // a faire .... /// Called to create a new #Stack used to evaluate a FreeFem++ script in CListOfInst::eval() inline Stack newStack(size_t l) { /* Stack thestack = new char[l]; for (int i = 0;i< l/sizeof(long);i++) ((long*) thestack)[i]=0; ((char **) thestack)[MeshPointStackOffset] = new char [1000]; return thestack;*/ return *new StackType(l); } inline void deleteStack(Stack s) { // delete [] (((char **) s)[MeshPointStackOffset]); // delete [] (char *) s; s.clean(); } #endif freefem++-3.38-1/src/fflib/global.cpp000644 000767 000024 00000012074 12514227350 017426 0ustar00hechtstaff000000 000000 /// \file // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include namespace ffapi { // void init) (); // need #include // need #include // need using namespace std; std::istream * (*cin)(); std::ostream *(*cout)(); std::ostream *(*cerr)(); // <> Cannot name these functions identically to the original file pointers under MingW32 (compile // error). Impacts [[file:InitFunct.hpp::LOADINITIO]]. Changed from stdxxx_ptr() to ffstdxxx() according to the way FF // itself was changed. FILE *(*ffstdout)(); FILE *(*ffstderr)(); FILE *(*ffstdin)(); /// Initiate graphical pipe output. I need a separate function for this to warn ffcs to check the corresponding ffglut /// magic number size_t (*fwriteinit)(const void *ptr, size_t size, size_t nmemb,FILE *stream); /// Indicates the begining of a new plot to avoid sending socket control data with each plot item. void (*newplot)(); /// Redefinition of standard system calls FILE *(*ff_popen)(const char *command, const char *type); int (*ff_pclose)(FILE *stream); size_t (*ff_fwrite)(const void *ptr, size_t size, size_t nmemb,FILE *stream); int (*ff_fflush)(FILE *stream); int (*ff_ferror)(FILE *stream); int (*ff_feof)(FILE *stream); // Windows file mode // ----------------- /// Changing file mode needs to be disabled when the file is a TCP socket to FFCS. Since the treatment is different in /// FF and in FFLANG executables, they have to be stored in a DLL that changes between these two programs. void (*wintextmode)(FILE *f); void (*winbinmode)(FILE *f); // Transfer basic MPI control // -------------------------- void (*mpi_init)(int &argc, char **& argv); void (*mpi_finalize)(); // Permanent server control // ------------------------ /// if true, FF is considered to be accessible from remote anonymous connections and some commands (like shell /// commands) are not allowed. bool (*protectedservermode)(); } #include "config-wrapper.h" #include #include "AFunction.hpp" #include "error.hpp" #include "lex.hpp" #include "RNM.hpp" #include #include "environment.hpp" #define FF_GRAPH_PTR_DCL #include "rgraph.hpp" //#include "PlotStream.hpp" bool NoGraphicWindow=false; /// <> long verbosity = 1; long searchMethod = 0; //pichon FILE *ThePlotStream=0; // Add for new plot. FH oct 2008 KN *pkarg;// for the list of argument mars 2010 Map_type_of_map map_type_of_map ; // to store te type Map_type_of_map map_pair_of_type ; // to store te type basicForEachType * typevarreal, * typevarcomplex; // type of real and complex variable /// <> see [[file:lex.hpp::mylex]] mylex *zzzfff; bool lexdebug; /// <> see [[file:../lglib/lg.ypp::YYSTYPE]] and [[file:../lglib/lg.ypp::yylval]] #include "lg.tab.hpp" YYSTYPE *plglval; int TheCurrentLine=-1; // unset: by default long mpisize=0,mpirank=0; C_F0 *pOne=0,*pZero=0,*pminusOne=0; // const C_F0 & One(*pOne), &Zero(*pZero); Polymorphic * TheOperators=0, //=new Polymorphic(), * TheRightOperators=0; //=new Polymorphic(); /// <> Contains all FreeFem++ language keywords. Declaration in [[file:AFunction.hpp::Global]] TableOfIdentifier Global; long E_Border::Count =0; /// <> declared at [[file:AFunction.hpp::tables_of_identifier]] typedef list ListOfTOfId; ListOfTOfId tables_of_identifier; const int AC_F0::MaxSize=1024; // maximal number of parameters map map_type; bool showCPU= false; size_t CodeAlloc::nb=0, CodeAlloc::lg=0,CodeAlloc::nbpx=0,CodeAlloc::chunk=2048; size_t CodeAlloc::nbt,CodeAlloc::nbdl=0; CodeAlloc ** CodeAlloc::mem=0; size_t CodeAlloc::memoryusage=0; bool CodeAlloc::sort=true; bool CodeAlloc::cleanning=false; bool echo_edp=true; // add F.H of remove script dump // add F. Hecht EnvironmentData ffenvironment; basicForEachType *basicForEachType::tnull=0; E_F0 *E_F0::tnull=0; CodeAlloc *CodeAlloc::tnull=0; #include RefCounter *RefCounter::tnull=0; freefem++-3.38-1/src/fflib/glumesh2D.cpp000755 000767 000024 00000027234 12354063734 020035 0ustar00hechtstaff000000 000000 // $Id$ #include #include #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" using namespace std; #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include "Operator.hpp" #include "lex.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" #include #include #include using namespace Fem2D; class listMesh { public: list *lth; void init() { lth=new list;} void destroy() { delete lth;} listMesh(Stack s,Mesh *th) : lth(Add2StackOfPtr2Free(s,new list)) { lth->push_back(th);} listMesh(Stack s,Mesh *tha,Mesh *thb) : lth(Add2StackOfPtr2Free(s,new list)) { lth->push_back(tha);lth->push_back(thb);} listMesh(Stack s,const listMesh &l,Mesh *th) : lth(Add2StackOfPtr2Free(s,new list(*l.lth))) { lth->push_back(th);} }; Mesh * GluMesh(listMesh const & lst) { int nbt=0; int neb=0; int nebx=0; int nbv=0; int nbvx=0; double hmin=1e100; R2 Pn(1e100,1e100),Px(-1e100,-1e100); const list lth(*lst.lth); Mesh * th0=0; int kk=0; for(list::const_iterator i=lth.begin();i != lth.end();++i) { if(! *i ) continue; // ++kk; Mesh &Th(**i); th0=&Th; if(verbosity>1) cout << " GluMesh + "<< Th.nv << " " << Th.nt << endl; nbt+= Th.nt; nbvx += Th.nv; nebx += Th.neb; for (int k=0;k2) cout << " - hmin =" << hmin << " , Bounding Box: " << Pn << " "<< Px << endl; Vertex * v= new Vertex[nbvx]; Triangle *t= new Triangle[nbt]; Triangle *tt=t; BoundaryEdge *b= new BoundaryEdge[nebx]; BoundaryEdge *bb= b; ffassert(hmin>Norme2(Pn-Px)/1e9); double hseuil =hmin/10.; FQuadTree *quadtree=new Fem2D::FQuadTree(th0,Pn,Px,0); { map,int> bbe; for(list::const_iterator i=lth.begin();i != lth.end();++i) { if(! *i ) continue; // const Mesh &Th(**i); if(!*i) continue; if(verbosity>1) cout << " GluMesh + "<< Th.nv << " " << Th.nt << endl; int nbv0 = nbv; for (int ii=0;iiToClose(vi,hseuil); if(!pvi) { v[nbv].x = vi.x; v[nbv].y = vi.y; v[nbv].lab = vi.lab; quadtree->Add(v[nbv++]); } } for (int k=0;kToClose(K[0],hseuil)-v; //NearestVertex(K[0])-v; int i1=quadtree->ToClose(K[1],hseuil)-v; //NearestVertex(K[1])-v; int i2=quadtree->ToClose(K[2],hseuil)-v; //NearestVertex(K[2])-v; (*tt++).set(v,i0,i1,i2,K.lab); } for (int k=0;kToClose(be[0],hseuil)-v; int i1=quadtree->ToClose(be[1],hseuil)-v; int ii0=i0,ii1=i1; if(ii1 i01(ii0,ii1); if( bbe.find(i01) == bbe.end()) { (*bb++).set(v,i0,i1,be.lab); bbe[i01]= neb++; } } } } delete quadtree; if(verbosity>1) { cout << " Nb points : "<< nbv << " , nb edges : " << neb << endl; cout << " Nb of glu point " << nbvx -nbv; cout << " Nb of glu Boundary edge " << nebx-neb; } { Mesh * m = new Mesh(nbv,nbt,neb,v,t,b); R2 Pn,Px; m->BoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); // m->decrement(); return m; } } template struct Op2_addmesh: public binary_function { static RR f(Stack s,const AA & a,const BB & b) { return RR(s, a, b );} }; template struct Op2_setmesh: public binary_function { static RR f(Stack stack, const AA & a,const BB & b) { ffassert(a ); pmesh p=GluMesh(b); if(!INIT && *a) (**a).destroy() ; // Add2StackOfPtr2FreeRC(stack,p); // the pointer is use to set variable so no remove. return *a=p,a; } }; class SetMesh_Op : public E_F0mps { public: Expression a; static const int n_name_param =2+2+2+2+2; // add nbiter FH 30/01/2007 11 -> 12 static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const{ return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack, bool a ) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} public: SetMesh_Op(const basicAC_F0 & args,Expression aa) : a(aa) { args.SetNameParam(n_name_param,name_param,nargs); if( nargs[0] && nargs[2] ) CompileError("uncompatible change (Th, label= , refe= "); if( nargs[1] && nargs[3] ) CompileError("uncompatible change (Th, region= , reft= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type SetMesh_Op::name_param[]= { { "refe", &typeid(KN_ )}, { "reft", &typeid(KN_ )}, { "label", &typeid(KN_ )}, { "region", &typeid(KN_ )}, { "renumv",&typeid(KN_)}, { "renumt",&typeid(KN_)}, { "flabel", &typeid(long)}, { "fregion", &typeid(long)}, { "rmledges", &typeid(long)}, { "rmInternalEdges", &typeid(bool)} }; int ChangeLab(const map & m,int lab) { map::const_iterator i=m.find(lab); if(i != m.end()) lab=i->second; return lab; } AnyType SetMesh_Op::operator()(Stack stack) const { MeshPoint *mp=MeshPointStack(stack),smp=*mp; Mesh * pTh= GetAny((*a)(stack)); Mesh & Th=*pTh; Mesh *m= pTh; int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int neb=Th.neb; // nombre d'aretes fontiere KN zz; KN nre (arg(0,stack,arg(2,stack,zz))); KN nrt (arg(1,stack,arg(3,stack,zz))); KN rv (arg(4,stack,zz)); KN rt (arg(5,stack,zz)); Expression flab = nargs[6] ; Expression freg = nargs[7] ; bool rm_edge = nargs[8]; long rmlabedges (arg(8,stack,0L)); bool rm_i_edges = (arg(9,stack,false)); bool rV = (rv.size()== nbv); bool rT = (rt.size()== nbt); if(verbosity>1) cout << " -- SetMesh_Op: nb vertices" << nbv<< " nb Trai "<< nbt << " nb b. edges " << neb << "renum V " << rV << " , renum T "<< rT << " rm internal edges " << rm_i_edges<< endl; if(nre.N() <=0 && nrt.N()<=0 && !rV && ! rT && ! flab && ! freg && !rm_i_edges && !rm_edge ) return m; ffassert( nre.N() %2 ==0); ffassert( nrt.N() %2 ==0); map mape,mapt; int z00 = false; for(int i=0;ibedges[i].lab) ; nebn++; } Vertex * v= new Vertex[nbv]; Triangle *t= new Triangle[nbt]; BoundaryEdge *b= new BoundaryEdge[nebn]; // generation des nouveaux sommets Vertex *vv=v; // copie des anciens sommets (remarque il n'y a pas operateur de copy des sommets) for (int i=0;ix=V.x; vv->y=V.y; vv->lab = V.lab; } // generation des triangles int nberr=0; R2 PtHat(1./3.,1./3.); for (int i=0;iset(Th,Th[i](PtHat),PtHat,Th[i],Th[i].lab); t[ii].lab =GetAny( (* freg)(stack)) ; } } int nrmedge=0; // les arete frontieres qui n'ont pas change BoundaryEdge * bb=b; for (int i=0;ibedges[i].lab) ; mp->set(Th,Th[k](PtHat),PtHat,Th[k],l1); if(flab) { R2 E=K.Edge(ke); double le = sqrt((E,E)); double sa=0.5,sb=1-sa; R2 PA(TriangleHat[VerticesOfTriangularEdge[ke][0]]), PB(TriangleHat[VerticesOfTriangularEdge[ke][1]]); R2 Pt(PA*sa+PB*sb ); // // void set(const Mesh & aTh,const R2 &P2,const R2 & P_Hat,const Triangle & aK,int ll,const R2 &NN,int iedge,int VFF=0) MeshPointStack(stack)->set(Th,K(Pt),Pt,K,l1,R2(E.y,-E.x)/le,ke); l1 =GetAny( (*flab)(stack)) ; } if( !( intern && ( rm_i_edges || (rmlabedges && (l1 == rmlabedges)) ) )) *bb++ = BoundaryEdge(v,i1,i2,l1); else ++nrmedge; } nebn -= nrmedge; if(nrmedge && verbosity > 2) cout << " change mesh2 : number of removed internal edges " << nrmedge << endl; assert(nebn==bb-b); m = new Mesh(nbv,nbt,nebn,v,t,b); R2 Pn,Px; m->BoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); // m->decrement(); Add2StackOfPtr2FreeRC(stack,m); *mp=smp; return m; } class SetMesh : public OneOperator { public: typedef Mesh *pmesh; SetMesh() : OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new SetMesh_Op(args,t[0]->CastTo(args[0])); } }; // truc pour que la fonction // Init::Init() soit appele a moment du chargement dynamique // du fichier // #ifndef DYNAMICS_LIBS void init_glumesh2D() { Dcl_Type(); typedef Mesh *pmesh; //Dcl_Type(); //typedef Mesh3 *pmesh3; if(verbosity>2) cout << " glumesh2D " ; //cout << " je suis dans Init " << endl; TheOperators->Add("+",new OneBinaryOperator_st< Op2_addmesh > ); TheOperators->Add("+",new OneBinaryOperator_st< Op2_addmesh > ); TheOperators->Add("=",new OneBinaryOperator_st< Op2_setmesh > ); TheOperators->Add("<-",new OneBinaryOperator_st< Op2_setmesh > ); Global.Add("change","(",new SetMesh); } #else class Init { public: Init(); }; static Init init; // une variable globale qui serat construite au chargement dynamique Init::Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ Dcl_Type(); typedef Mesh *pmesh; //Dcl_Type(); //typedef Mesh3 *pmesh3; if (verbosity) cout << " glumesh2D " ; //cout << " je suis dans Init " << endl; TheOperators->Add("+",new OneBinaryOperator_st< Op2_addmesh > ); TheOperators->Add("+",new OneBinaryOperator_st< Op2_addmesh > ); TheOperators->Add("=",new OneBinaryOperator_st< Op2_setmesh > ); TheOperators->Add("<-",new OneBinaryOperator_st< Op2_setmesh > ); Global.Add("change","(",new SetMesh); } #endif freefem++-3.38-1/src/fflib/InitFunct.cpp000644 000767 000024 00000004371 11656307615 020103 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "InitFunct.hpp" #include #include #include #include #include "ffapi.hpp" using namespace std; typedef void (* afunc)(); typedef pair InitFunct; deque * getInitFunctlist() { static deque * data = new deque(); return data; } extern long verbosity; set & ff_SetofInitFunct() { static set sset; return sset;} void call(const InitFunct & a) { if(verbosity>5) cout << "\n addInitFunct : " << a.first << " call : " <5) cout << " ) " ; } bool comp(const InitFunct a,const InitFunct b) { return a.first < b.first; } void callInitsFunct() { deque * l(getInitFunctlist()); sort(l->begin(),l->end(),comp); if(verbosity>5) cout << " callInitsFunct : " << l->size() << endl; // for_each(l->begin(),l->end(),show); for_each(l->begin(),l->end(),call); l->clear(); } void addInitFunct(int i,void (* f)(),const char *name) { if(!name || (! *name ) || ff_SetofInitFunct().insert(name).second) { getInitFunctlist()->push_back(make_pair(i,f)); if(verbosity>9) cout << " -- addInitFunct: " << i << " " << f << " " << (name ? name : "" ) <rdbuf() ; \ streambuf * si =ffapi::cin()->rdbuf() ; \ streambuf * se =ffapi::cerr()->rdbuf() ; \ if( so && cout.rdbuf() != so ) cout.rdbuf(so); \ if( si && cin.rdbuf() != si ) cin.rdbuf(si); \ if( se && cerr.rdbuf() != se ) cerr.rdbuf(se); \ } #else #define LOADINITIO { \ streambuf * so =ffapi::cout()->rdbuf() ; \ streambuf * si =ffapi::cin()->rdbuf() ; \ streambuf * se =ffapi::cerr()->rdbuf() ; \ if( so && cout.rdbuf() != so ) cout.rdbuf(so); \ if( si && cin.rdbuf() != si ) cin.rdbuf(si); \ if( se && cerr.rdbuf() != se ) cerr.rdbuf(se); \ stdout = ffapi::ffstdout();\ stderr = ffapi::ffstderr();\ stdin = ffapi::ffstdin();\ } #endif #define LOADINITNM(EXEC,NM) \ static void AutoLoadInit() { LOADINITIO ; \ if(verbosity>9) cout << "\n loadfile " NM "\n" ; \ EXEC; } \ static int DoLoadInit() { \ if(verbosity>9) \ cout << " **** " << NM << " ****\n" ; \ addInitFunct(10000,&AutoLoadInit,NM); \ return 2;} \ \ static int callDoLoadInit=DoLoadInit(); #define LOADINIT(TI) LOADINITNM(TI init obsolete,__FILE__) #define LOADFUNC(FC) LOADINITNM(FC() ,__FILE__) #endif freefem++-3.38-1/src/fflib/lex.cpp000644 000767 000024 00000054664 12442643434 016776 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "error.hpp" #include #include #include #include "AFunction.hpp" //class pfes; #include #include "lg.tab.hpp" #include "lex.hpp" extern YYSTYPE *plglval; // New version of macro expantion more classical // and more simple // FH Jan. 2005 static const bool debugmacro = false; /*inline char * newcopy(const char * s) { char *r(new char [strlen(s)+1]); strcpy(r, s);return r; } */ void mylex::Add(Key k,int i) { Check(!i,k,"mot clef"); Add(k,i,0); } void mylex::Add(Key k,aType t) { Check(!t,k,"type"); // TYPE defined at [[file:../lglib/lg.ypp::token type TYPE]] Add(k,TYPE,t); } void mylex::AddF(Key k,aType t) { Check(!t,k,"FUNCTION"); Add(k,FUNCTION,t); } void mylex::AddSpace(Key k,aType t) { Check(!t,k,"FESPACE"); Add(k,FESPACE,t); } bool mylex::InMotClef (aType & t, int & r) const { const_iterator i= MotClef.find(buf); if (i== MotClef.end()) { t=0;r=ID; return false;} else { r=i->second.first; t=i->second.second; ffassert(r); return true;}} void mylex::Add(Key k,int r,aType t){ iterator ii= MotClef.find(k); ffassert(ii==MotClef.end()); MotClef.insert(pair(k,Value(r,t))); } void mylex::dump(ostream & f ) { const_iterator i=MotClef.begin(),e=MotClef.end(); for (;i != e;i++) { f << " " << i->first << " " << i->second.first << " " << i->second.second->name() << endl; } } inline bool isNLCR(istream & f,int c) { // eat CR NL or NL CR paire int cc= f.peek(); bool ret=(c == 10 || c == 13) ; if(ret && ( cc != c) && (cc == 10 || cc == 13) ) f.get(); return ret; } int mylex::EatCommentAndSpace(string *data) { // if data is !0 then add reading char in data // return the last read char c // -------------------- int c,caux,sep=0; const int space=(int) ' '; int incomment =0; do { incomment = 0; c = source().peek(); // eat spaces while (isspace(c) || c == 10 || c == 13 ) {sep=space; c = source().get(); if(isNLCR(source(),c)) c='\n'; if (echo) cout << (char) c; if(c=='\n') { linenumber++; if (echo) cout << setw(5) <= 50) erreur("Number to long"); buf[i]=0; if (nc=='i' ) { buf[i++]=source().get(),buf[i]=0,plglval->dnum = atof(buf),ret=CNUM;} else if (real) plglval->dnum = atof(buf),ret=DNUM; else plglval->lnum = atoi(buf),ret=LNUM; if(lexdebug) cout << " NUM : " << buf << " "<str = newcopy(buf); if(lexdebug) cout << "STRING=" << '"' << buf << '"' << endl; ret= STRING; } else { ret = c; switch(c) { case '{': case '%': case '}': case '(': case ')': case '[': case ']': case ',': case ';': case '#': break; case '*': if (nc == '=') ret=MULEQ; break; case '/': if (nc == '=') ret=DIVEQ; break; case '^': case '~': case '\'': case '_': case '?': break; case '.': if (nc == '*') ret = DOTSTAR; else if (nc == '/') ret = DOTSLASH; break; case ':': if (nc == '=') ret= SET; break; case '&': if (nc == '&') ret= AND; break; case '|': if (nc == '|') ret= OR; break; case '!': if (nc == '=') ret=NE; break; case '<': if (nc == '=') ret=LE; if (nc == '<') ret=LTLT; if (nc == '>') ret= NE; break; case '>': if (nc == '=') ret=GE; if (nc == '>') ret=GTGT; break; case '=': if (nc == '=') ret=EQ; break; case '-': if (nc == '>') ret=ARROW; if (nc == '-') ret=MOINSMOINS; if (nc == '=') ret=MOINSEQ; break; case '+': if (nc == '+') ret=PLUSPLUS; if (nc == '=') ret=PLUSEQ; break; default: cerr << "'" << (char) c << (char) nc << "' <=> " << (int) c << " is " ; erreur (" Unexpected character"); } if( (ret == DOTSTAR) || (ret==DOTSLASH)) { source().get(); nc = source().peek(); if(nc == '=' ) { buf[2]='=';// ad FH 19 april 2012 (bug in macro ) buf[3]=0; source().get(); ret = (ret == DOTSTAR) ?DOTMULEQ : DOTDIVEQ; } } else if (ret!=c) source().get(); else buf[1] = 0; strcpy(plglval->oper,buf); if(lexdebug) cout << "Special '" << plglval->oper << "' " << ret << " "; } typetoken=ret; return ret; } int mylex::scan1() { // extern long mpirank; // bool echo = mpirank == 0; int ret= basescan(); if(debugmacro) cout << " scan1 " << ret << " " << token() << " " << ID << endl; while ( ret == ID &&SetMacro(ret)); // correction mars 2014 FH while ( ret == ID && CallMacro(ret)) ; // correction mars 2014 FH return ret; } // <> int mylex::scan(int lvl) { int ret= scan1(); // ID defined at [[file:../lglib/lg.ypp::token str ID]] if ( ret == ID) { if (! InMotClef(plglval->type,ret)) { int ft = FindType(buf); // FESPACE, FESPACE1, FESPACE3 defined at [[file:../lglib/lg.ypp::token str FESPACE]] int feid3[4] ={ ID,FESPACE1,FESPACE,FESPACE3}; assert ( ft >= 0 && ft <= 3) ; ret = feid3[ft]; plglval->str = newcopy(buf); }} if ( ret =='{') { //cout << " listMacroDef->push_back"<< endl; listMacroDef->push_back( MapMacroDef() );} else if (ret == '}') {//cout << " listMacroDef->pop_back"<< endl; listMacroDef->pop_back( );} if (! lexdebug && echo && lvl==0 ) print(cout); return ret; } string mylex::token() const { int i=-1; string f; if (typetoken == STRING) { f += '"'; while (buf[++i]) if (buf[i]=='\n') f += "\\n"; else if (buf[i]=='"') f += "\\\""; else f += buf[i] ; f+= '"'; } else while (buf[++i]) if (buf[i]=='\n') f += "\\n"; else f += buf[i] ; return f; } void mylex::print(ostream &f) const { int i=-1; int k=0; if (typetoken == STRING) { f <<'"'; while (buf[++i]) { k++; if (buf[i]=='\n') k++, f << "\\n"; else if (buf[i]=='"') k++,f << "\\\""; else f << buf[i] ; if ( k%50==49) f << "\n ... : "; } f << '"'; } else while (buf[++i]) if (buf[i]=='\n') f << "\\n"; else f << buf[i] ; } char * mylex::match(int i) { if ( i != basescan() ) {// basescan -> scan1 change 2/2/2007 (non pas des substitution de parametres FH) cerr << " we waiting for a '" << char(i) <<"'" << endl; ErrorScan(" err macro ");}; return buf; } bool mylex::SetMacro(int &ret) { char endmacro[]="EndMacro"; char newmacro[]="NewMacro"; bool rt=false; int oldmacro=1; if (strcmp(buf,"macro")==0 || (oldmacro=strcmp(buf,newmacro))==0 ) { char *macroname=newcopy(match(ID)); int nbparam =0; deque macroparm; int rr=basescan(); string def; if (rr!='(') def += buf; else { // a '(' after macro name rr = basescan(); if (rr != ')' ) do { if (nbparam++>= 100) { cerr << "in macro " <back(); MapMacroDef::const_iterator i=MacroDef.find(macroname); if ( i == MacroDef.end() ) MacroDef[macroname]=macroparm; else { cerr << "ERREUR in macro name:" <str = newcopy(p.c_str()); ret = STRING; return false; } else if(strcmp(buf,"FILE")==0) { plglval->str = newcopy(filename() ); ret = STRING; return false; } else if(strcmp(buf,"LINE")==0) { plglval->lnum = linenumber; ret=LNUM; return false; } else for (list::const_iterator i=listMacroDef->begin(); i != listMacroDef->end(); i++) { MapMacroDef::const_iterator j= i->find(buf); if (j != i->end()) { // int inmacroold=withmacropara; if(debugmacro) cout <<"call macro : " << buf << endl; string * macronn= new string(" macro: "); *macronn+= buf; const deque & macroparm= j->second; int nbparam= macroparm.size()-1; MapMacroParam lp; if (nbparam > 0 ) { match('('); for (int k=0;k scan1 change 2/2/2007 ( not change to pass macro name as a parameter) if ( (rr=='}') && (--lvll==0) ) continue; // remove first { else if ( (rr=='{') && (++lvll==1) ) continue; // remove last } else if(lvll==0) // count the open close () [] { if(lvl && rr==')') lvl--; // if ( then we eat next ) else if(lvl && rr==']') lvl--; // if ( then we eat next ) else if (rr=='(') lvl++ ; // eat next else if (rr=='[') lvl++ ; // eat next else if (lvl<=0) { if (rr==kend ) break; else if (rr==')' || rr==',') {// Correction FH 2/06/2004 cerr << "Error in macro expansion "<< j->first << ", we wait for "<< char(kend) << " and we get " << char(rr)<< endl; cerr << " number of macro parameter in definition is " << nbparam << endl; ErrorScan(" Wrong number of parameter in macro call"); }}} if (rr==ENDOFFILE) ErrorScan(" ENDOFFILE in macro usage"); if(sep==' ') p+=' '; p += token(); // Correction FH 2/06/2004 of string parameter } if(debugmacro) cout << "macro arg "<< k << " :" << macroparm[k] << " -> " << p << endl; lp.insert(pair(macroparm[k],p)); //lp[macroparm[k]] = p; } } if(debugmacro) cout << " input in : -> " << macroparm[nbparam] << " <-> " << nbparam << endl; input(macroparm[nbparam]); // ici il faut faire la substitution de parameter // ----------------------------------------------- string expandtxt; bool echosave=echo; while(1) { int c= EatCommentAndSpace(&expandtxt); // eat comment to save it; if (c == EOF) break; ret = basescan(); if(debugmacro) cout << " ret = " << ret << token() << endl; if(ret== ENDOFFILE) break; if (nbparam && ret == ID) { MapMacroParam::const_iterator j=lp.find(buf); if ( j != lp.end()) expandtxt+=j->second; else expandtxt+=token(); } else if (ret!='#') // macro concatenation operator expandtxt+=token(); } echo=echosave; if(debugmacro) cout <<" (macro) eadin : " << expandtxt << endl; input(expandtxt,macronn); ret = scan1(); // Correction FH 6/06/2004 of string parameter return true; } } return false; } void mylex::xxxx::open(mylex *lex,const char * ff) { //filename=ff; l=0; nf=f=0; if(lex->ffincludedir.empty()) // if no liste nf=f= new ifstream(ff,ios_base::binary); // modif of win32 if (!f || !*f) { if ( f) { delete f; f=0; } for (ICffincludedir k=lex->ffincludedir.begin(); k!=lex->ffincludedir.end(); ++k) { string dif_ff(*k+ff); if (verbosity>=50) lex->cout << " --lex open :" << dif_ff << endl; nf=f= new ifstream(dif_ff.c_str(),ios_base::binary); if ( f) { if ( f->good()) { filename = new string(dif_ff); break; } delete f; f=0; } } } else filename=new string(ff); if (!f || !*f) { lex->cout << " Error openning file " <ffincludedir.begin(); k!=lex->ffincludedir.end(); ++k) lex->cout << " -- try :\"" << *k+ff << "\"\n"; lgerror("lex: Error input openning file ");}; } void mylex::xxxx::readin(mylex *lex,const string & s,const string *name, int macroargs)//,int nbparam,int bstackparam) { filename=name; macroarg=macroargs; l=0; nf=f= new istringstream(s.c_str()); if (!f || !*f) { lex->cout << " Error readin string :" <= -1); if (level>=0) pilesource[level].l =linenumber; pilesource[level+1].open(this,filename); pilesource[level+1].l =0; // cout << "\n ++include " << filename << ";" << level+1 << endl; linenumber = 1; level++; } void mylex::input(const string & str,const string * name) { ffassert(level<99 && level >= -1); if (level>=0) { pilesource[level].l =linenumber; } pilesource[level+1].readin(this,str,name); linenumber = 0; level++; } bool mylex::close() { if(debugmacro ) cout << "\n close " << level ; ffassert(level >=0 && level < 100); // cout << "\n-- close " << level << endl; pilesource[level].close(); // cout << "\n ++ " << level << endl; if (--level<0) return false; linenumber = pilesource[level].l; return true; } mylex::~mylex() { delete listMacroDef; while( ! strdata.empty()) { // commente july 2005 FH ???. a test plus finement. delete [] strdata.top(); // bug ????? FH 25032005 strdata.pop(); } } mylex::mylex(ostream & out,bool eecho): linenumber(1), charnumber(0), ffincludedir(ffenvironment["includepath"]), firsttime(true), level(-1), echo(eecho && (mpirank == 0) && verbosity), cout(out), listMacroDef(new list), listMacroParam(0) { listMacroDef->push_front(MapMacroDef()); }; mylex * Newlex( ostream & out,bool eecho) { return new mylex(out,eecho); } void Destroylex(mylex * m) { delete m; } ostream & mylex::ShowStack(ostream & f){ for (int i=0;i #include "environment.hpp" extern bool lexdebug; extern long mpisize,mpirank; /// <> class mylex : public CodeAlloc { public: typedef const char * Key; typedef pair Value; struct Keyless : binary_function { bool operator()(const Key& x, const Key& y) const{ return strcmp(x,y)<0;} }; typedef map MapMotClef; typedef map ,Keyless > MapMacroDef; typedef map MapMacroParam; typedef MapMotClef::const_iterator const_iterator; typedef MapMotClef::iterator iterator; public: int linenumber,charnumber; list ffincludedir; typedef list::iterator Iffincludedir; typedef list::const_iterator ICffincludedir; private: bool firsttime; int level; char buf[1024]; int typetoken; bool echo; stack strdata; struct xxxx { int l; istream * f; const string * filename; int macroarg; istream * nf; xxxx() : l(0), f(0) , filename(0),macroarg(0),nf(0) {} void open(mylex *lexx,const char * ff) ; void readin(mylex *lexx,const string & s,const string *name=0,int macroargg=0); void close() ; }; friend struct mylex::xxxx; xxxx pilesource[100]; istream & source() const {return * pilesource[level].f;} ostream & cout ; MapMotClef MotClef; list *listMacroDef; list *listMacroParam; public: mylex(ostream & out,bool eecho=true); string token() const; void print(ostream &f) const; /// This is the main [[file:../lglib/lg.ypp::yylex]] entry point from the grammar. Implemented in /// [[file:lex.cpp::mylex_scan]] int scan(int lvl=0); int lineno(){return linenumber;} char * YYText() { return buf;} void dump(ostream & f ) ; void erreur(const char * s) { cerr << " Error line number" <=0 ) return pilesource[level].filename ? pilesource[level].filename->c_str() : " -- in macro -- "; return "-- unkown --";} void input(const char * filename) ; void input(const string &str,const string *name=0); bool close() ; char * newcopy(const char * s) { char *r(new char [strlen(s)+1]); strcpy(r, s); strdata.push(r); return r; } ostream & ShowStack(ostream & f); ~mylex(); private: int basescan(); int EatCommentAndSpace(string *data=0); int scan1(); bool SetMacro(int &ret); bool CallMacro(int &ret); char * match(int i); void ErrorScan(const char * s) { cerr << "\n" ; ShowStack(cerr); throw(ErrorCompile(s,lineno(),YYText() ) );} } ; mylex * Newlex( ostream & out,bool =true); void Destroylex(mylex * m); /// <> This pointer is allocated in [[file:global.cpp::zzzfff]] and initialized in /// [[file:../lglib/lg.ypp::zzzfff]] extern mylex *zzzfff; #endif freefem++-3.38-1/src/fflib/lgfem.cpp000644 000767 000024 00000605167 12542575077 017310 0ustar00hechtstaff000000 000000 /// \file // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef __MWERKS__ #pragma optimization_level 0 //#pragma inline_depth(0) #endif #include #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include #include "fem.hpp" #include "Mesh3dn.hpp" #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include #include "Operator.hpp" #include #include #include #include "lex.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" #include "CGNL.hpp" #include "AddNewFE.h" #include "array_resize.hpp" #include "PlotStream.hpp" // add for the gestion of the endianness of the file. //PlotStream::fBytes PlotStream::zott; //0123; //PlotStream::hBytes PlotStream::zottffss; //012345678; // ---- FH namespace bamg { class Triangles; } namespace Fem2D { void DrawIsoT(const R2 Pt[3],const R ff[3],const RN_ & Viso); extern GTypeOfFE &P1bLagrange3d; extern GTypeOfFE &RT03d; extern GTypeOfFE &Edge03d; void Expandsetoflab(Stack stack,const CDomainOfIntegration & di,set & setoflab,bool &all); } #include "BamgFreeFem.hpp" static bool TheWait=false; bool NoWait=false; extern bool NoGraphicWindow; extern long verbosity; extern FILE *ThePlotStream; // Add for new plot. FH oct 2008 void init_lgmesh() ; namespace FreeFempp { template TypeVarForm * TypeVarForm::Global; } const int nTypeSolveMat=10; int kTypeSolveMat; TypeSolveMat *dTypeSolveMat[nTypeSolveMat]; AnyType Long2TypeSolveMat(Stack, const AnyType &ll) { long l=GetAny(ll); ffassert( l>=0 && l (tt); for(long l=0; l * )}, LIST_NAME_PARM_MAT /* { "init", &typeid(bool)}, { "solver", &typeid(TypeSolveMat*)}, { "eps", &typeid(double) } , { "precon",&typeid(Polymorphic*)}, { "dimKrylov",&typeid(long)}, { "bmat",&typeid(Matrice_Creuse* )}, { "tgv",&typeid(double )}, { "factorize",&typeid(bool)}, { "strategy",&typeid(long )}, { "tolpivot", &typeid(double)}, { "tolpivotsym", &typeid(double) }, { "nbiter", &typeid(long)}, // 12 { "paramint",&typeid(KN_)}, // Add J. Morice 02/09 { "paramdouble",&typeid(KN_)}, { "paramstring",&typeid(string*)}, { "permrow",&typeid(KN_)}, { "permcol",&typeid(KN_)}, { "fileparamint",&typeid(string*)}, // Add J. Morice 02/09 { "fileparamdouble",&typeid(string*)}, { "fileparamstring",&typeid(string* )}, { "filepermrow",&typeid(string*)}, { "filepermcol",&typeid(string*)} //22 */ }; basicAC_F0::name_and_type OpCall_FormLinear_np::name_param[]= { "tgv",&typeid(double ) }; /* template class E_F_F0F0F0 :public E_F0 { public: template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; typedef typename remove_reference::type A0; typedef typename remove_reference::type A1; typedef typename remove_reference::type A2; typedef R (*func)( A0 , A1, A2 ) ; func f; Expression a0,a1,a2; E_F_F0F0F0(func ff,Expression aa0,Expression aa1,Expression aa2) : f(ff),a0(aa0),a1(aa1),a2(aa2) {} AnyType operator()(Stack s) const {return SetAny( f( GetAny((*a0)(s)) , GetAny((*a1)(s)), GetAny((*a2)(s)) ) );} bool EvaluableWithOutStack() const {return a0->EvaluableWithOutStack() && a1->EvaluableWithOutStack() && a2->EvaluableWithOutStack() ;} // bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent() && a2->MeshIndependent();} // int compare (const E_F0 *t) const { int rr; // cout << "cmp " << typeid(*this).name() << " and " << typeid(t).name() << endl; const E_F_F0F0F0* tt=dynamic_cast(t); if (tt && f == tt->f) rr= clexico(a0->compare(tt->a0),a1->compare(tt->a1),a2->compare(tt->a2)); else rr = E_F0::compare(t); return rr; } // to give a order in instuction int Optimize(deque > &l,MapOfE_F0 & m, size_t & n) const { int rr = find(m); if (rr) return rr; return insert(new Opt(*this,a0->Optimize(l,m,n),a1->Optimize(l,m,n),a2->Optimize(l,m,n)),l,m,n); } // build optimisation class Opt: public E_F_F0F0F0 { public : size_t ia,ib,ic; Opt(const E_F_F0F0F0 &t,size_t iaa,size_t ibb,size_t icc) : E_F_F0F0F0(t) , ia(iaa),ib(ibb),ic(icc) {} AnyType operator()(Stack s) const { //A0 aa =*static_cast(static_cast(static_cast(s)+ia)); //A1 bb=*static_cast(static_cast(static_cast(s)+ib)) ; //cout << ia << " " << ib << "f( " << aa << "," << bb << " ) = "<< f(aa,bb) << endl; return SetAny( f( *static_cast(static_cast(static_cast(s)+ia)) , *static_cast(static_cast(static_cast(s)+ib)) , *static_cast(static_cast(static_cast(s)+ic)) ) );} }; }; template > class OneOperator3 : public OneOperator { aType r; // return type typedef typename CODE::func func; //typedef R (*func)(A,B) ; func f; public: E_F0 * code(const basicAC_F0 & args) const { return new CODE(f,t[0]->CastTo(args[0]),t[1]->CastTo(args[1]),t[2]->CastTo(args[3]));} OneOperator3(func ff): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()],map_type[typeid(C).name()]), f(ff){} }; */ const E_Array * Array(const C_F0 & a) { if (a.left() == atype() ) return dynamic_cast(a.LeftValue()); else return 0; } bool Box2(const C_F0 & bb, Expression * box) { const E_Array * a= Array(bb); if(a && a->size() == 2) { box[0] = to((*a)[0]); box[1] = to((*a)[1]); return true; } else return false; } bool Box2x2(Expression bb, Expression * box) { const E_Array * a= dynamic_cast(bb); if(a && a->size() == 2) return Box2((*a)[0],box) && Box2((*a)[1],box+2) ; else return false; } void dump_table() { cout << " dump the table of the language " << endl; cout << " ------------------------------ " <::const_iterator i; ; for (i= map_type.begin();i !=map_type.end();i++) { cout << " type : " << i->first << endl; if( i->second ) i->second->ShowTable(cout); else cout << " Null \n"; cout << "\n\n"; } for (i= map_type.begin();i !=map_type.end();i++) { cout << " type : " << i->first << endl; if( i->second ) i->second->ShowTable(cout); else cout << " Null \n"; cout << "\n\n"; } cout << "--------------------- " << endl; cout << *TheOperators << endl; cout << "--------------------- " << endl; } /* class LocalArrayVariable:public E_F0 { size_t offset; aType t; // type of the variable just for check Expression n; // expression of the size public: AnyType operator()(Stack s) const { SHOWVERB( cout << "\n\tget var " << offset << " " << t->name() << endl); return PtrtoAny(static_cast(static_cast(s)+offset),t);} LocalArrayVariable(size_t o,aType tt,Expression nn):offset(o),t(tt),n(nn) {ffassert(tt); SHOWVERB(cout << "\n--------new var " << offset << " " << t->name() << endl); } }; */ bool In(long *viso,int n,long v) { int i=0,j=n,k; if (v viso[j-1]) return false; while (i v) j=k; else i=k; return (viso[i]=v); } class LinkToInterpreter { public: Type_Expr P,N,x,y,z,label,region,nu_triangle,nu_edge,lenEdge,hTriangle,area,inside,volume; LinkToInterpreter() ; }; LinkToInterpreter * l2interpreter; using namespace Fem2D; using namespace EF23; /* inline pmesh ReadMesh( string * const & s) { Mesh * m=new Mesh(*s); R2 Pn,Px; m->BoundingBox(Pn,Px); m->quadtree=new FQuadTree(m,Pn,Px,m->nv); // delete s; modif FH 2006 (stack ptr) return m; } inline pmesh3 ReadMesh3( string * const & s) { Mesh3 * m=new Mesh3(s->c_str()); R3 Pn,Px; // m->BoundingBox(Pn,Px); m->gtree=new Mesh3::GTree(m->vertices,m->Pmin,m->Pmax,m->nv); // delete s; modif FH 2006 (stack ptr) return m; } */ template class E_F_A_Ptr_o_R :public E_F0 { public: typedef Result A::* ptr; Expression a0; ptr p; E_F_A_Ptr_o_R(Expression aa0,ptr pp) : a0(aa0),p(pp) {} AnyType operator()(Stack s) const { return SetAny(&(GetAny((*a0)(s))->*p));} bool MeshIndependent() const {return a0->MeshIndependent();} // }; // ---- // remarque pas de template, cela ne marche pas encore ...... class E_P_Stack_P :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->P);} operator aType () const { return atype();} }; class E_P_Stack_Px :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->P.x);} operator aType () const { return atype();} }; class E_P_Stack_Py :public E_F0mps { public: AnyType operator()(Stack s) const {throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->P.y);} operator aType () const { return atype();} }; class E_P_Stack_Pz :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->P.z);} operator aType () const { return atype();} }; class E_P_Stack_N :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->N);} operator aType () const { return atype();} }; class E_P_Stack_Nx :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->N.x);} operator aType () const { return atype();} }; class E_P_Stack_Ny :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->N.y);} operator aType () const { return atype();} }; class E_P_Stack_Nz :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->N.z);} operator aType () const { return atype();} }; class E_P_Stack_Region :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->region);} operator aType () const { return atype();} }; class E_P_Stack_Label :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(&MeshPointStack(s)->label);} operator aType () const { return atype();} }; class E_P_Stack_Mesh :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(const_cast(MeshPointStack(s)->Th));} operator aType () const { return atype();} }; class E_P_Stack_Nu_Triangle :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(MeshPointStack(s)->t);} operator aType () const { return atype();} }; class E_P_Stack_Nu_Vertex :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(MeshPointStack(s)->v);} operator aType () const { return atype();} }; class E_P_Stack_Nu_Face :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(MeshPointStack(s)->f);} operator aType () const { return atype();} }; class E_P_Stack_Nu_Edge :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(MeshPointStack(s)->e);} operator aType () const { return atype();} }; class E_P_Stack_inside :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); return SetAny(MeshPointStack(s)->outside? 0.0 : 1.0 );} operator aType () const { return atype();} }; class E_P_Stack_lenEdge :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); MeshPoint * mp=MeshPointStack(s); ffassert(mp->T && mp ->e >=0 && mp->d==2); double l= mp->T->lenEdge(mp->e); return SetAny(l);} operator aType () const { return atype();} }; class E_P_Stack_hTriangle :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); MeshPoint * mp=MeshPointStack(s); assert(mp->T) ; double l= mp->T->h(); return SetAny(l);} operator aType () const { return atype();} }; class E_P_Stack_nTonEdge :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); MeshPoint * mp=MeshPointStack(s); assert(mp->T && mp->e > -1 && mp->d==2 ) ; long l=mp->Th->nTonEdge(mp->t,mp->e); // cout << " nTonEdge " << l << endl; return SetAny( l) ;} operator aType () const { return atype();} }; class E_P_Stack_areaTriangle :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); MeshPoint * mp=MeshPointStack(s); assert(mp->T) ; double l=-1; // unset ... if(mp->d==2) l= mp->T->area; else if (mp->d==3 && mp->f >=0) { R3 NN = mp->T3->N(mp->f); l= NN.norme()/2.; } else { cout << "erreur : E_P_Stack_areaTriangle" << mp->d << " " << mp->f << endl; ffassert(0); // undef } return SetAny(l);} operator aType () const { return atype();} }; // add FH class E_P_Stack_VolumeTet :public E_F0mps { public: AnyType operator()(Stack s) const { throwassert(* (long *) s); MeshPoint * mp=MeshPointStack(s); assert(mp->T) ; double l=-1; // unset ... if (mp->d==3 && mp->T3 ) { l= mp->T3->mesure(); } else { cout << "erreur : E_P_Stack_VolumeTet" << mp->d << " " << mp->f << endl; ffassert(0); // undef } return SetAny(l);} operator aType () const { return atype();} }; /* class New_MeshPoint : public E_F0mps { };*/ //inline pfes MakePtr(pmesh * const & a, TypeOfFE * const & tef){ return pfes(new pfes_tef(a,tef)) ;} //inline pfes MakePtr(pmesh * const & a){ return pfes(new pfes_tef(a,&P1Lagrange)) ;} //inline pfes MakePtr(pfes * const & a,long const & n){ return pfes(new pfes_fes(a,n)) ;} /* class E_pfes : public E_F0 { const int N; Expression *Th,*tef; E_pfes(Expression *TTh,*ttef) : Th(TTh),tef(ttef),N(ttef?ttef->nbitem():0) {} virtual AnyType operator()(Stack) const { return AnyType } virtual size_t nbitem() const {return 1;} }; OneOperator_pfes():OneOperator(atype(),atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const ; };*/ template class E_StopGC: public StopGC { public: typedef KN Kn; typedef KN_ Kn_; Stack s; long n; long iter; Kn_ xx,gg; C_F0 citer,cxx,cgg; C_F0 stop; E_StopGC(Stack ss,long nn,const Polymorphic * op): s(ss),n(nn),iter(-1), xx(0,0),gg(0,0), citer(CConstant(&iter)), cxx(dCPValue(&xx)), cgg(dCPValue(&gg)), stop(op,"(",citer,cxx,cgg) { } ~E_StopGC() {// a verifier ???? FH.... delete (E_F0 *) cxx; // ??? delete (E_F0 *) cgg; // ??? delete (E_F0 *) citer; // ??? delete (E_F0 *) stop; // ??? } // template class StopGC { public: virtual bool Stop(int iter, R *, R * ){return false;} }; bool Stop(int iterr, R *x, R * g) { // cout << " Stop " << iterr << endl; iter=iterr; xx.set(x,n); gg.set(g,n); return GetAny(stop.eval(s)); } }; template class LinearCG : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; const int cas; class MatF_O: VirtualMatrice { public: Stack stack; mutable Kn x; C_F0 c_x; Expression mat1,mat; typedef typename VirtualMatrice::plusAx plusAx; MatF_O(int n,Stack stk,const OneOperator * op) : VirtualMatrice(n),stack(stk), x(n),c_x(CPValue(x)), mat1(op->code(basicAC_F0_wa(c_x))), mat( CastTo(C_F0(mat1,(aType)*op))) { //ffassert(atype() ==(aType) *op); // WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 } ~MatF_O() { // cout << " del MatF_O mat " << endl; if(mat1 != mat) delete mat; delete mat1; // cout << " del MatF_Ocx ..." << endl; Expression zzz = c_x; // cout << " zzz "<< zzz << endl; delete zzz; // WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 } void addMatMul(const Kn_ & xx, Kn_ & Ax) const { ffassert(xx.N()==Ax.N()); x =xx; Ax += GetAny((*mat)(stack)); WhereStackOfPtr2Free(stack)->clean(); } plusAx operator*(const Kn & x) const {return plusAx(this,x);} virtual bool ChecknbLine(int n) const { return true;} virtual bool ChecknbColumn(int m) const { return true;} }; class E_LCG: public E_F0mps { public: const int cas;// <0 => Nolinear static const int n_name_param=6; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; const OneOperator *A, *C; Expression X,B; E_LCG(const basicAC_F0 & args,int cc) :cas(cc) { args.SetNameParam(n_name_param,name_param,nargs); { const Polymorphic * op= dynamic_cast(args[0].LeftValue()); ffassert(op); A = op->Find("(",ArrayOfaType(atype(),false)); } if (nargs[2]) { const Polymorphic * op= dynamic_cast(nargs[2]); ffassert(op); C = op->Find("(",ArrayOfaType(atype(),false)); } else C =0; X = to(args[1]); if (args.size()>2) B = to(args[2]); else B=0; } virtual AnyType operator()(Stack stack) const { int ret=-1; E_StopGC *stop=0; // WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 try { Kn &x = *GetAny((*X)(stack)); int n=x.N(); MatF_O AA(n,stack,A); double eps = 1.0e-6; double *veps=0; int nbitermax= 100; long verb = verbosity; if (nargs[0]) eps= GetAny((*nargs[0])(stack)); if (nargs[1]) nbitermax = GetAny((*nargs[1])(stack)); if (nargs[3]) veps=GetAny((*nargs[3])(stack)); if (nargs[4]) verb=Abs(GetAny((*nargs[4])(stack))); if (nargs[5]) stop= new E_StopGC(stack,n,dynamic_cast(nargs[5])); // cout << " E_LCG: Stop = " << stop << " " << verb << endl; long gcverb=51L-Min(Abs(verb),50L); if(verb==0) gcverb = 1000000000;// no print if(veps) eps= *veps; KN bzero(B?1:n); // const array zero bzero=R(); KN *bb=&bzero; if (B) { Kn &b = *GetAny((*B)(stack)); R p = (b,b); if (p== R()) { // ExecError("Sorry LinearCG work only with nul right hand side, so put the right hand in the function"); } bb = &b; } if (cas<0) { if (C) { MatF_O CC(n,stack,C); ret = NLCG(AA,CC,x,nbitermax,eps, gcverb,stop );} else ret = NLCG(AA,MatriceIdentite(n),x,nbitermax,eps, gcverb,stop); } else if (C) { MatF_O CC(n,stack,C); ret = ConjuguedGradient2(AA,CC,x,*bb,nbitermax,eps, gcverb, stop );} else ret = ConjuguedGradient2(AA,MatriceIdentite(n),x,*bb,nbitermax,eps, gcverb, stop ); if(veps) *veps = -(eps); } catch(...) { if( stop) delete stop; // WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 throw; } // WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 if( stop) delete stop; return SetAny(ret); } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_LCG(args,cas);} LinearCG() : OneOperator(atype(), atype(), atype *>(),atype *>()),cas(2){} LinearCG(int cc) : OneOperator(atype(), atype(), atype *>()),cas(cc){} }; template basicAC_F0::name_and_type LinearCG::E_LCG::name_param[]= { { "eps", &typeid(double) }, { "nbiter",&typeid(long) }, { "precon",&typeid(Polymorphic*)}, { "veps" , &typeid(double*) }, { "verbosity" , &typeid(long)}, { "stop" , &typeid(Polymorphic*)} }; template class LinearGMRES : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; const int cas; class MatF_O: VirtualMatrice { public: Stack stack; mutable Kn x; C_F0 c_x; Kn *b; Expression mat1,mat; typedef typename VirtualMatrice::plusAx plusAx; MatF_O(int n,Stack stk,const OneOperator * op,Kn *bb) : VirtualMatrice(n), stack(stk), x(n),c_x(CPValue(x)),b(bb), mat1(op->code(basicAC_F0_wa(c_x))), mat( CastTo(C_F0(mat1,(aType)*op)) /*op->code(basicAC_F0_wa(c_x))*/) { // ffassert(atype() ==(aType) *op); } ~MatF_O() { if(mat1!=mat) delete mat; delete mat1; delete c_x.LeftValue();} void addMatMul(const Kn_ & xx, Kn_ & Ax) const { ffassert(xx.N()==Ax.N()); x =xx; Ax += GetAny((*mat)(stack)); if(b && &Ax!=b) Ax += *b; // Ax -b => add b (not in cas of init. b c.a.d &Ax == b WhereStackOfPtr2Free(stack)->clean(); // add dec 2008 } plusAx operator*(const Kn & x) const {return plusAx(this,x);} virtual bool ChecknbLine(int n) const { return true;} virtual bool ChecknbColumn(int m) const { return true;} }; class E_LGMRES: public E_F0mps { public: const int cas;// <0 => Nolinear static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =7; Expression nargs[n_name_param]; const OneOperator *A, *C; Expression X,B; E_LGMRES(const basicAC_F0 & args,int cc) :cas(cc) { args.SetNameParam(n_name_param,name_param,nargs); { const Polymorphic * op= dynamic_cast(args[0].LeftValue()); ffassert(op); A = op->Find("(",ArrayOfaType(atype(),false)); } if (nargs[2]) { const Polymorphic * op= dynamic_cast(nargs[2]); ffassert(op); C = op->Find("(",ArrayOfaType(atype(),false)); } else C =0; X = to(args[1]); if (args.size()>2) B = to(args[2]); else B=0; } virtual AnyType operator()(Stack stack) const { Kn &x = *GetAny((*X)(stack)); Kn b(x.n); E_StopGC *stop=0; if (B) b = *GetAny((*B)(stack)); else b= R(); int n=x.N(); int dKrylov=50; double eps = 1.0e-6; int nbitermax= 100; long verb = verbosity; if (nargs[0]) eps= GetAny((*nargs[0])(stack)); if (nargs[1]) nbitermax = GetAny((*nargs[1])(stack)); if (nargs[3]) eps= *GetAny((*nargs[3])(stack)); if (nargs[4]) dKrylov= GetAny((*nargs[4])(stack)); if (nargs[5]) verb=Abs(GetAny((*nargs[5])(stack))); if (nargs[6]) stop= new E_StopGC(stack,n,dynamic_cast(nargs[6])); long gcverb=51L-Min(Abs(verb),50L); int ret; if(verbosity>4) cout << " ..GMRES: eps= " << eps << " max iter " << nbitermax << " dim of Krylov space " << dKrylov << endl; KNM H(dKrylov+1,dKrylov+1); int k=dKrylov;//,nn=n; double epsr=eps; KN bzero(B?1:n); // const array zero bzero=R(); KN *bb=&bzero; if (B) { Kn &b = *GetAny((*B)(stack)); R p = (b,b); if (p) { // ExecError("Sorry MPILinearCG work only with nul right hand side, so put the right hand in the function"); } bb = &b; } KN * bbgmres =0; if ( !B ) bbgmres=bb; // none zero if gmres without B MatF_O AA(n,stack,A,bbgmres); if(bbgmres ){ *bbgmres= AA* *bbgmres; // Ok Ax == b -> not translation of b . *bbgmres = - *bbgmres; if(verbosity>1) cout << " ** GMRES set b = -A(0); : max=" << bbgmres->max() << " " << bbgmres->min()<min()<(n),x,nbitermax,eps, 51L-Min(Abs(verbosity),50L)); ConjuguedGradient */ } else { if (C) { MatF_O CC(n,stack,C,0); ret=GMRES(AA,(KN &)x, *bb,CC,H,k,nbitermax,epsr,verb,stop);} else ret=GMRES(AA,(KN &)x, *bb,MatriceIdentite(n),H,k,nbitermax,epsr,verb,stop); } if(verbosity>99) cout << " Sol GMRES :" << x << endl; if(stop) delete stop; return SetAny(ret); } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_LGMRES(args,cas);} LinearGMRES() : OneOperator(atype(), atype(), atype *>(),atype *>()),cas(2){} LinearGMRES(int cc) : OneOperator(atype(), atype(), atype *>()),cas(cc){} }; template basicAC_F0::name_and_type LinearGMRES::E_LGMRES::name_param[]= { { "eps", &typeid(double) }, { "nbiter",&typeid(long) }, { "precon",&typeid(Polymorphic*)}, { "veps" , &typeid(double*) }, { "dimKrylov", &typeid(long) }, { "verbosity", &typeid(long) }, { "stop" , &typeid(Polymorphic*)} }; template typename map::iterator closeto(map & m, int k) { typename map::iterator i= m.find(k); if (i==m.end()) { i= m.find(k+1); if (i==m.end()) i= m.find(k-1); } return i; } template class Smallvect { public: T v[N]; T & operator[](int i){return v[i];} const T & operator[](int i) const {return v[i];} }; template ostream & operator<<(ostream & f,const Smallvect & v) { for(int i=0;i int numeroteclink(KN_ & ndfv) { int nbdfv =0; for (int i=0;i=i) { int j=i,ii,kkk=0; do { ii=ndfv[j]; ffassert(kkk++<10); assert(nbdfv <= j); // assert(ii>=nbdfv); ndfv[j]=nbdfv ; j=ii; } while (j!=nbdfv); if (verbosity > 100) cout << " ndf: " << j << " " << ii << " <- " << nbdfv << " " << kkk << endl; nbdfv++; } return nbdfv; } bool InCircularList(const int *p,int i,int k) // find k in circular list: i , p[i], p[p[i]], ... { int j=i,l=0; do { if (j==k) return true; ffassert(l++<10); j=p[j]; } while (j!=i); return false; } bool BuildPeriodic( int nbcperiodic, Expression *periodic, const Mesh &Th,Stack stack, int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) { /* build numbering of vertex form 0 to nbdfv-1 and build numbering of edge form 0 to nbdfe-1 we removing common vextex or common edge -- we suppose one df by vertex nbdfv number of df on vertex ndfv[i] given the numero of the df of the vertex -- we suppose 1 df */ typedef Smallvect int2; if (nbcperiodic ) { // KN ndfv(Th.nv); // KN ndfe(Th.neb); ffassert(ndfv.N()==Th.nv); ffassert(ndfe.N()==Th.neb); MeshPoint *mp=MeshPointStack(stack),smp=*mp; int n= nbcperiodic; if (verbosity >2) cout << " Nb of pair of periodic conditions: = " << n << endl; int * link1=0; int * link2=0; KN plk1(n),plk2(n); KN nlk1(n),nlk2(n); KN lab1(n),lab2(n); #ifndef HUGE_VAL const double infty= numeric_limits::infinity(); #else const double infty= HUGE_VAL; #endif int nblink1, nblink2; int *plink1 , *plink2; for (int step=0;step<2;step++) { nblink1=0, nblink2=0; plink1=link1, plink2=link2; for (int ip=0, k=0;ip((*periodic[k+0])(stack)); int label2=GetAny((*periodic[k+2])(stack)); lab1[ip]=label1; lab2[ip]=label2; int l1=nblink1; int l2=nblink2; plk1[ip]= plink1; plk2[ip]= plink2; for (int ke=0;ke3) cout << " Periodic = " << nblink1 << " " << nblink2 << " step=" << step << endl; link1 = new int[nblink1]; link2 = new int[nblink2]; if(nblink1 != nblink2) { ExecError("Periodic: the both number of edges is not the same "); } } if ( nblink1 >0) { for (int ip=0, k=0;ip m; const int kk1=1,kk2=3; int label1=lab1[ip],label2=lab2[ip]; int n1=nlk1[ip],n2=nlk2[ip]; int *pke1=plk1[ip], *pke2=plk2[ip]; double xmn=infty,xmx=-infty,hmn=infty; if (verbosity >1) cout << " --Update: periodic couple label1= " << label1 << ", n edges= " << n1 << "; " << ", label2= " << label2<< ", n edges= " << n2 <set(e[0].x,e[0].y); double x0=GetAny((*periodic[k+kk1])(stack)); mp->set(e[1].x,e[1].y); double x1=GetAny((*periodic[k+kk1])(stack)); if(verbosity>5) cout << "lab1: e[" << pke1[i1] << "] v0: " << e[0].x << " " << e[0].y << " s = " << x0 << "\t v1 " << e[0].x << " " << e[0].y << " s = " << x1 << endl; xmn=Min(x1,x0,xmn); xmx=Max(x1,x0,xmx); hmn=Min(hmn,Abs(x1-x0)); } } ffassert(hmn>1.0e-20); double coef = 8/hmn; double x0 = xmn; if (verbosity > 2) cout << " --Update: periodic " << xmn << " " << xmx << " " << " h=" << hmn << endl; ffassert(coef>1e-10 && (xmx-xmn)*coef < 1.e7 ); // map construction ---- for (int i1=0;i1set(e[ne].x,e[ne].y); double xx=GetAny((*periodic[k+kk1])(stack)); int i0= (int) ((xx-x0)*coef); map::iterator im=closeto(m,i0); if (im==m.end()) { if (verbosity >50) cout << xx << " " << i0 << " " << ie << endl; im=m.insert(pair(i0,i2)).first; } else { if (verbosity >50) cout << xx << " " << i0 << " " << ie << " : " << im->second[0] << " " << im->second[1] << endl; assert( (im->second[1] < 0) && (im->second[0] >=0) ); im->second[1]=ie;} } } for (int i2=0;i250) cout << i2 << " : " <set(e[0].x,e[0].y); double xx0=GetAny((*periodic[k+kk2])(stack)); mp->set(e[1].x,e[1].y); double xx1=GetAny((*periodic[k+kk2])(stack)); if(verbosity>5 && !(verbosity >50)) cout << "lab2: e[" << pke2[i2] << "] v0: " << e[0].x << " " << e[0].y << " s = " << xx0 << "\t v1 " << e[0].x << " " << e[0].y << " s = " << xx1 << endl; int i0= int((xx0-x0)*coef); int i1= int((xx1-x0)*coef); map::iterator im0=closeto(m,i0); map::iterator im1=closeto(m,i1); if(im0 == m.end() || im1 == m.end() ) { cout << "Abscisse: s0 = "<< xx0 << " <==> s1 " << xx1 <second[0])==im1->second[1]) && (ie1>=0)) ; else if (((ie1=im0->second[0])==im1->second[1]) && (ie1>=0)) ; else if (((ie1=im0->second[1])==im1->second[1]) && (ie1>=0)) ; else if (((ie1=im0->second[1])==im1->second[0]) && (ie1>=0)) ; else if (((ie1=im0->second[0])==im1->second[0]) && (ie1>=0)) ; else { cout << ie2 << " ~ " << im0->second[0] << " " << im0->second[1] << ", " << im1->second[0] << " " << im1->second[1] << endl; ExecError("periodic: Sorry one egde is losted "); } if(verbosity>50) cout << " ( " << im0->second << " , " << im1->second << " ) .. "; ffassert(ie1>=0 && ie1 < Th.neb ); const BoundaryEdge & ep =Th.bedges[ie1]; mp->set(ep[0].x,ep[0].y); double yy0=GetAny((*periodic[k+kk1])(stack)); mp->set(ep[1].x,ep[1].y); double yy1=GetAny((*periodic[k+kk1])(stack)); if(verbosity>50) cout << " e0: s "<< xx0 << " " << xx1 << "e1 s "<< yy0 << " " << yy1 ; pke1[i2]=ie1*2+ ( ( (yy1-yy0) < 0) == ( (xx1-xx0) < 0) ) ; if (verbosity >50) cout << " \t edge " << ie1 << " <=> " << ie2 << " " << ( ( (yy1-yy0) < 0) == ( (xx1-xx0) < 0) ) << "; " << xx0 << " " < " << yy0 << " " <50) { cout << " vertex " << iv1 << "<==> " << iv2 << " list : " << iv1; int i=iv1,k=0; while ( (i=ndfv[i]) != iv1 && k++<10) cout << ", "<< i ; cout << endl; }} } } // generation de numero de dlt nbdfv = numeroteclink(ndfv) ; nbdfe = numeroteclink(ndfe) ; if (verbosity>2) cout << " -- nb df on vertices " << nbdfv << endl; delete [] link1; delete [] link2; return true; //new FESpace(**ppTh,*tef,nbdfv,ndfv,nbdfe,ndfe); } } return false; } bool v_fes::buildperiodic(Stack stack,int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) { return BuildPeriodic(nbcperiodic,periodic,**ppTh,stack,nbdfv,ndfv,nbdfe,ndfe); } #ifdef ZZZZZZZZ FESpace * pfes_tef::update() { typedef Smallvect int2; if (nbcperiodic ) { const Mesh &Th(**ppTh); KN ndfv(Th.nv); KN ndfe(Th.neb); int nbdfv,nbdfe; return new FESpace(**ppTh,*tef,nbdfv,ndfv,nbdfe,ndfe); } else return new FESpace(**ppTh,*tef); } #endif struct OpMake_pfes_np { static const int n_name_param =1; static basicAC_F0::name_and_type name_param[] ; }; basicAC_F0::name_and_type OpMake_pfes_np::name_param[]= { "periodic", &typeid(E_Array) }; map TEF2dto3d; AnyType TypeOfFE3to2(Stack,const AnyType &b) { TypeOfFE3 *t3=0; TypeOfFE *t2=GetAny(b); map::const_iterator i=TEF2dto3d.find(t2); if(i != TEF2dto3d.end()) t3=i->second; if(t3==0) { cerr << " sorry no cast to this 3d finite element " <next) { ffassert(i->tfe); // check AddNewFE(i->name,i->tfe); // Global.New(i->name, Type_Expr(atype(),new EConstantTypeOfFE(i->tfe))); } */ TypeOfFE * FindFE2(const char * s) { for (ListOfTFE * i=ListOfTFE::all;i;i=i->next) if(strcmp(i->name,s)==0) return i->tfe; cout << " s =" << s << endl; lgerror("FindFE2 "); return 0; } typedef TypeOfFE TypeOfFE2; template struct OpMake_pfes: public OneOperator , public OpMake_pfes_np { struct Op: public E_F0mps { public: Expression eppTh; Expression eppfes; const E_Array & atef; int nb; int nbcperiodic; Expression *periodic; KN tedim; Op(Expression ppfes,Expression ppTh, const E_Array & aatef,int nbp,Expression * pr,KN &ttedim) : eppTh(ppTh),eppfes(ppfes),atef(aatef),nbcperiodic(nbp),periodic(pr),tedim(ttedim) { } ~Op() { if(periodic) delete []periodic;} AnyType operator()(Stack s) const { const int d = Mesh::Rd::d; Mesh ** ppTh = GetAny( (*eppTh)(s) ); AnyType r = (*eppfes)(s) ; const TypeOfFE ** tef= new const TypeOfFE * [ atef.size()]; for (int i=0;i(atef[i].eval(s)); else if(tedim[i]==2 && d ==3) tef[i]= GetAny(TypeOfFE3to2(s,atef[i].eval(s))); else ffassert(0); pfes * ppfes = GetAny(r); bool same = true; for (int i=1;i(); aType t_tfe2= atype(); int d= TypeOfFE::Rd::d; string sdim= d ? " 2d : " : " 3d : " ; const E_Array * a2(dynamic_cast(args[2].LeftValue())); ffassert(a2); int N = a2->size(); ; if (!N) CompileError(sdim+" We wait an array of Type of Element "); KN tedim(N); for (int i=0;i< N; i++) if ((*a2)[i].left() == t_tfe) tedim[i]=d; else if ((*a2)[i].left() ==t_tfe2) tedim[i]=2; else CompileError(sdim+" We wait an array of Type of Element "); // ffassert(0); return new Op(args[0],args[1],*a2,nbcperiodic,periodic,tedim); } OpMake_pfes() : OneOperator(atype(),atype(),atype(),atype()) {} }; inline pfes* MakePtr2(pfes * const &p,pmesh * const & a, TypeOfFE * const & tef) { *p=new pfes_tef(a,tef) ; (**p).decrement(); return p;} inline pfes3* MakePtr3(pfes3 * const &p,pmesh3 * const & a, TypeOfFE3 * const & tef) { *p=new pfes3_tef(a,tef) ; (**p).decrement(); return p;} class OP_MakePtr2 { public: class Op : public E_F0mps { public: // static int GetPeriodic(Expression bb, Expression & b,Expression & f); static const int n_name_param =1; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; typedef pfes * R; typedef pfes * A; typedef pmesh * B; typedef TypeOfFE * C; Expression a,b,c; int nbcperiodic ; Expression *periodic; Op(const basicAC_F0 & args); AnyType operator()(Stack s) const { A p= GetAny( (*a)(s) ); B th= GetAny( (*b)(s) ); C tef= GetAny( (*c)(s) ); // cout << " ----------- " << endl; *p=new pfes_tef(th,tef,s,nbcperiodic,periodic) ; (**p).decrement(); return SetAny(p); } }; // end Op class typedef Op::R Result; static E_F0 * f(const basicAC_F0 & args) { return new Op(args);} static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), atype(),false ) ;} }; class OP_MakePtr3 { public: class Op : public E_F0mps { public: // static int GetPeriodic(Expression bb, Expression & b,Expression & f); static const int n_name_param =1; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; typedef pfes3 * R; typedef pfes3 * A; typedef pmesh3 * B; typedef TypeOfFE3 * C; Expression a,b,c; int nbcperiodic ; Expression *periodic; Op(const basicAC_F0 & args); AnyType operator()(Stack s) const { A p= GetAny( (*a)(s) ); B th= GetAny( (*b)(s) ); C tef= GetAny( (*c)(s) ); // cout << " ----------- " << endl; *p=new pfes3_tef(th,tef,s,nbcperiodic,periodic) ; (**p).decrement(); return SetAny(p); } }; // end Op class typedef Op::R Result; static E_F0 * f(const basicAC_F0 & args) { return new Op(args);} static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), atype(),false ) ;} }; void GetPeriodic(const int d,Expression perio, int & nbcperiodic , Expression * &periodic) { ffassert(d==2 || d ==3); if ( perio) { if( verbosity>1) cout << " -- Periodical Condition to do" << endl; const E_Array * a= dynamic_cast(perio); ffassert(a); int n = a->size(); nbcperiodic= n/2; if( verbosity>1) cout << " the number of periodicBC " << n << endl; if ( 2*nbcperiodic != n ) CompileError(" Sorry the number of periodicBC must by even"); periodic = new Expression[n*d]; for (int i=0,j=0;i(args[0])),b(to(args[1])),c(to(args[2])) { nbcperiodic=0; periodic=0; args.SetNameParam(n_name_param,name_param,nargs); GetPeriodic(2,nargs[0],nbcperiodic,periodic); } OP_MakePtr3::Op::Op(const basicAC_F0 & args) : a(to(args[0])),b(to(args[1])),c(to(args[2])) { nbcperiodic=0; periodic=0; args.SetNameParam(n_name_param,name_param,nargs); GetPeriodic(3,nargs[0],nbcperiodic,periodic); } int GetPeriodic(Expression bb, Expression & b,Expression & f) { const E_Array * a= dynamic_cast(bb); if(a && a->size() == 2) { b= to((*a)[0]); f= to((*a)[1]); return 1; } else return 0; } int GetPeriodic(Expression bb, Expression & b,Expression & f1,Expression & f2) { const E_Array * a= dynamic_cast(bb); if(a && a->size() == 3) { b= to((*a)[0]); f1= to((*a)[1]); f2= to((*a)[2]); return 1; } else return 0; } basicAC_F0::name_and_type OP_MakePtr2::Op::name_param[]= { "periodic", &typeid(E_Array) }; basicAC_F0::name_and_type OP_MakePtr3::Op::name_param[]= { "periodic", &typeid(E_Array) }; inline pfes* MakePtr2(pfes * const &p,pmesh * const & a){ *p=new pfes_tef(a,&P1Lagrange); (**p).decrement(); return p ;} inline pfes* MakePtr2(pfes * const &p,pfes * const & a,long const & n){ *p= new pfes_fes(a,n); (**p).decrement(); return p ;} long FindTxy(Stack s,pmesh * const & ppTh,const double & x,const double & y) { R2 P(x,y),PHat; bool outside; MeshPoint & mp = *MeshPointStack(s); const Mesh * pTh= *ppTh; if(pTh == 0) return 0; const Triangle * K=pTh->Find(mp.P.p2(),PHat,outside); if (!outside) mp.set(*pTh,P,PHat,*K,K->lab); else return 0; return 1; } template KN * pfer2vect( pair *,int> p) { KN * x=p.first->x(); if ( !x) { // defined FESpace * Vh= p.first->newVh(); throwassert( Vh); *p.first = x = new KN(Vh->NbOfDF); *x=K(); } return x;} template long pfer_nbdf(pair *,int> p) { if (!p.first->Vh) p.first->Vh= p.first->newVh(); throwassert( !!p.first->Vh); return p.first->Vh->NbOfDF; } double pmesh_area(pmesh * p) { throwassert(p && *p) ; return (**p).area ;} long pmesh_nt(pmesh * p) { throwassert(p && *p) ; return (**p).nt ;} long pmesh_nbe(pmesh * p) { throwassert(p && *p) ; return (**p).neb ;} long pmesh_nv(pmesh * p) { throwassert(p && *p) ; return (**p).nv ;} long pVh_ndof(pfes * p) { throwassert(p && *p); FESpace *fes=**p; ; return fes->NbOfDF ;} long pVh_nt(pfes * p) { throwassert(p && *p); FESpace *fes=**p; ; return fes->NbOfElements ;} long pVh_ndofK(pfes * p) { throwassert(p && *p); FESpace *fes=**p; return (*fes)[0].NbDoF() ;} long mp_nuTriangle(MeshPoint * p) { throwassert(p && p->Th && p->T); long nu=0; if(p->d==2) nu=(*p->Th)(p->T); else if (p->d==3) nu=(*p->Th3)(p->T3); else ffassert(0); delete p; return nu ;} long mp_region(MeshPoint * p) { throwassert(p && p->Th); long nu(p->region); delete p; return nu ;} class pVh_ndf : public ternary_function { public: class Op : public E_F0mps { public: Expression a,b,c; Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc) {} AnyType operator()(Stack s) const { pfes * p(GetAny((*a)(s))); long k(GetAny((*b)(s))); long i(GetAny((*c)(s))); throwassert(p && *p); FESpace *fes=**p; throwassert(fes && k >=0 && k < fes->NbOfElements ); FElement K=(*fes)[k]; throwassert(i>=0 && i *,KN *> { public: static KN * f(Stack s,pfes *p ,KN * k) { ffassert(0); // debile ... return k ; } }; */ //plus class Op_CopyArray : public OneOperator { public: Op_CopyArray():OneOperator(atype(),atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const ; }; template AnyType pfer2R(Stack s,const AnyType &a) { pair< FEbase * ,int> ppfe=GetAny *,int> >(a); FEbase & fe( *ppfe.first); int componante=ppfe.second; if ( !fe.x()) { if ( !fe.x()){ // CompileError(" Sorry unset fem array "); return SetAny(0.0); } } const FESpace & Vh(*fe.Vh); const Mesh & Th(Vh.Th); assert(Th.ntet==0 && Th.volume==0 && Th.triangles != 0); MeshPoint & mp = *MeshPointStack(s); const Triangle *K; R2 PHat; bool outside=false; bool qnu=true; if ( mp.Th == &Th && mp.T) { qnu=false; K=mp.T; PHat=mp.PHat.p2(); } else if ( mp.other.Th == & Th && mp.other.P.x == mp.P.x && mp.other.P.y == mp.P.y ) { K=mp.other.T; PHat=mp.other.PHat.p2(); outside = mp.other.outside; } else { if (mp.isUnset()) ExecError("Try to get unset x,y, ..."); K=Th.Find(mp.P.p2(),PHat,outside); mp.other.set(Th,mp.P.p2(),PHat,*K,0,outside); } // cout << " --- " << qnu << " " << mp.P << " " << mp.outside << " " << outside << endl; const FElement KK(Vh[Th(K)]); if (outside && !KK.tfe->NbDfOnVertex && !KK.tfe->NbDfOnEdge) return SetAny(0.0); /* if (!outside) { if ( Norme2_2( (*K)(PHat) - mp.P ) > 1e-12 ) cout << "bug ?? " << Norme2_2( (*K)(PHat) - mp.P ) << " " << mp.P << " " << (*K)(PHat) << endl; } */ /* int nbdf=KK.NbDoF(); int N= KK.N; KN_ U(*fe.x()); KNMK fb(nbdf,N,3); // the value for basic fonction KN fk(nbdf); for (int i=0;i 0.05 && Norme2_2(mp.P) < 0.4*0.4 ) { int vv=verbosity; cout << " f() triangle " << Th(K) << " " << mp.P << " " << PHat << " = " << r << " " < * y=new KN(Vh.NbOfDF); KN & yy(*y); KN Viso(100); // R2 Ptt[3]; for (int i=0;i Aipj(ipj.N()); KN Vp(PtHat.N()); const E_F0 & ff(* (const E_F0 *) e ) ; if (Vh.isFEMesh() ) { ffassert(Vh.NbOfDF == Th.nv && Vh.N == 1 ); for (int iv=0;iv=0); mps->set(Th,v,TriangleHat[il],K,v.lab); yy[iv] = GetAny( ff(s) ); sptr->clean(); // modif FH mars 2006 clean Ptr } } else for (int t=0;tset(K.T(PtHat[p]),PtHat[p],K); Vp[p]=GetAny( ff(s) ); } for (int i=0;iclean(); // modif FH mars 2006 clean Ptr } *mps=mp; fe=y; kkff = Mesh::kfind - kkff; kkth = Mesh::kthrough -kkth; if(verbosity>1) ShowBound(*y,cout) << " " << kkth << "/" << kkff << " = " << double(kkth)/Max(1.,kkff) << endl; return SetAny*>(&fe); } AnyType set_feoX_1 (Stack s,Expression ppfeX_1, Expression e) { // inutile // mme chose que v(X1,X2); StackOfPtr2Free * sptr = WhereStackOfPtr2Free(s); typedef const interpolate_f_X_1::CODE * code; MeshPoint mp= *MeshPointStack(s); code ipp = dynamic_cast(ppfeX_1); pair *,int> pp=GetAny *,int> >((*ipp->f)(s)); FEbase & fe(*pp.first); const FESpace & Vh(*fe.newVh()); KN gg(Vh.MaximalNbOfDF()); const Mesh & Th(Vh.Th); R F[100]; // buffer TabFuncArg tabexp(s,Vh.N+2); tabexp[0]=e; tabexp[1]=ipp->x; tabexp[2]=ipp->y; throwassert(Vh.N==1); KN * y=new KN(Vh.NbOfDF); for (int t=0;tclean(); // modif FH mars 2006 clean Ptr } *MeshPointStack(s)=mp; fe=y; if(verbosity>1) cout << " -- interpole f= g*X^-1, function's bound: " << y->min() << " " << y->max() << endl; return SetAny*>(&fe); } template E_set_fev::E_set_fev(const E_Array * a,Expression pp,int ddim) :dim(ddim), aa(*a),ppfe(pp),optimize(true), where_in_stack_opt(),optiexp0(),optiexpK() { aa.map(to) ; bool kdump=false; if(optimize) { // new code Optimized ------- int n=aa.size(); deque > ll; MapOfE_F0 m; where_in_stack_opt.resize(n); size_t top = currentblock->OffSet(0), topbb=top; // FH. bofbof ??? for (int i=0; iOptimize(ll, m, top); if (kdump) cout << "\n\t\t"<< i << ": " << where_in_stack_opt[i] << endl; } currentblock->OffSet(top-topbb); // int k=ll.size(),k0=0,k1=0; for (int i=0;iMeshIndependent()) k0++; deque > l0(k0),l1(k-k0); k0=0,k1=0; for (int i=0;iMeshIndependent()) { if (kdump) cout << " mi " << ll[i].second << " " << *(ll[i].first) << endl; l0[k0++]=ll[i]; } else { if (kdump) cout << " md " << ll[i].second << " " << *(ll[i].first) << endl; l1[k1++]=ll[i]; } if (k0) optiexp0 = new E_F0_Optimize(l0,m,0); // constant part if (k1) optiexpK = new E_F0_Optimize(l1,m,0); // none constant part } } template AnyType E_set_fev::operator()(Stack s) const { if(dim== 2) return Op2d(s); else if(dim == 3) return Op3d(s); return Nothing; } template AnyType E_set_fev::Op3d(Stack s) const { // voir E_set_fev3 ( pb de consitance a revoir FH) ffassert(0); // a faire } template AnyType E_set_fev::Op2d(Stack s) const { StackOfPtr2Free * sptr = WhereStackOfPtr2Free(s); MeshPoint *mps=MeshPointStack(s), mp=*mps; FEbase ** pp=GetAny< FEbase **>((*ppfe)(s)); FEbase & fe(**pp); const FESpace & Vh(*fe.newVh()); KN gg(Vh.MaximalNbOfDF()); const Mesh & Th(Vh.Th); const int dim=Vh.N; K ** copt=0; if (optimize) copt= new K *[dim]; if(copt) { assert((size_t) dim== where_in_stack_opt.size()); for (int i=0;i10); copt[i]= static_cast(static_cast((char*)s+offset)); *(copt[i])=0; } if (optiexp0) (*optiexp0)(s); // init } ffassert(dim<100); // R F[100]; // buffer TabFuncArg tabexp(s,Vh.N); // const E_Array * aa = dynamic_cast(e); ffassert( aa.size() == Vh.N); for (int i=0;i * y=new KN(Vh.NbOfDF); KN & yy(*y); FElement::aIPJ ipj(Vh[0].Pi_h_ipj()); FElement::aR2 PtHat(Vh[0].Pi_h_R2()); KN Aipj(ipj.N()); // KNM Vp(dim,PtHat.N());// bug // g++ error: too many initializers for `const __class_type_info_pseudo KN Vp1(dim*PtHat.N()); if (Vh.isFEMesh() ) { ffassert(Vh.NbOfDF == Th.nv && dim == 1 ); for (int iv=0;iv=0); mps->set(Th,v,TriangleHat[il],Kt,v.lab); if (copt) { if (optiexpK) (*optiexpK)(s); yy[iv] = *(copt[0]); } else yy[iv] = GetAny( ff(s) ); sptr->clean(); // modif FH mars 2006 clean Ptr } } else for (int t=0;tset(Kt.T(PtHat[p]),PtHat[p],Kt); // KN_ Vpp(Vp('.',p)); KN_ Vpp(Vp1,SubArray(dim,p*dim)); // a Change FHHHHHHHH if (copt) { // optimize version if (optiexpK) (*optiexpK)(s); for (int j=0;j( (*tabexp[j])(s) ); else Vpp[j]=0; } for (int i=0;iclean(); // modif FH mars 2006 clean Ptr } #endif for (int df=0;dfunset(); fe=y; if (copt) delete [] copt; *MeshPointStack(s) = mp; if(verbosity>1) ShowBound(*y,cout) << endl ; //HHHH*/ return Nothing; } template inline FEbase * MakePtrFE(pfes * const & a){ FEbase * p=new FEbase(a); //cout << "MakePtrFE " << p<< endl; return p ;} template inline FEbase ** MakePtrFE2(FEbase * * const & p,pfes * const & a){ *p=new FEbase(a); //cout << "MakePtrFE2 " << *p<< endl; return p ;} template inline FEbaseArray ** MakePtrFE3(FEbaseArray * * const & p,pfes * const & a,const long & N){ *p=new FEbaseArray(a,N); //cout << "MakePtrFE2 " << *p<< endl; return p ;} /* inline pmesharray* MakePtr(pmesharray* const & p,long const & a){ p->first=new pmesh [a]; p->second=a; for (int i=0;ifirst[i]=0; // nuset return p ;} */ template class OneOperatorMakePtrFE : public OneOperator { public: // il faut Optimize // typedef double K; typedef FEbase ** R; typedef pfes* B; class CODE : public E_F0mps { public: Expression fer,fes; E_set_fev * e_set_fev; const E_Array * v; CODE(const basicAC_F0 & args) : fer(to(args[0])), fes(to(args[1])), e_set_fev(0) { if (BCastTo(args[2]) ) v = new E_Array(basicAC_F0_wa(to(args[2]))); else v = dynamic_cast( args[2].LeftValue() ); if (!v) { cout << "Error: type of arg :" << *args[2].left() << " in " << typeid(K).name() << " case " << endl; ErrorCompile(" We wait a double/complex expression or a array expression",1); } //v->map(to); e_set_fev= new E_set_fev(v,fer,v_fes::d); } AnyType operator()(Stack stack) const { R p = GetAny( (*fer)(stack)); B a = GetAny( (*fes)(stack)); *p=new FEbase(a); (*e_set_fev)(stack); // cout << "MakePtrFE: build p " << p << " " << *p << endl; return SetAny(p); } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new CODE(args);} OneOperatorMakePtrFE(aType tt): // tt= aType() or aType() OneOperator(map_type[typeid(R).name()],map_type[typeid(R).name()],map_type[typeid(B).name()],tt) {} }; // --- template class OneOperator_Ptr_o_R: public OneOperator { // aType r; // return type typedef Result A::* ptr; ptr p; public: E_F0 * code(const basicAC_F0 & args) const { return new E_F_A_Ptr_o_R(t[0]->CastTo(args[0]),p);} OneOperator_Ptr_o_R(ptr pp): OneOperator(atype(),atype()),p(pp) {} }; template K *PAddition(const K * a,const K * b) {return new K(*a+*b);} // class fCLD { public: typedef pair Key; typedef map::iterator iterator; map *l; fCLD (){ l=new map;} void operator=(const fCLD & a){ *l=*a.l;} void destroy() { delete l;l=0;} ~fCLD(){ delete l;l=0;} void Add(finconnue *v,int lab,C_F0 f) { const MGauche *pn= v->simple(); Check(pn,"Def CL Dirichet "); Label r(lab); Key k(make_pair(pn->first,r)); iterator i=l->find(k); Check( i != l->end() ,"Def CL Dirichet already exists"); l->insert(make_pair(k,CastTo(f))); } }; // pour stocker des expression de compilation class Convect : public E_F0mps { public: typedef double Result; // return type Expression u,v,w,ff,dt; int d; Convect(const basicAC_F0 & args) : u(0),v(0),w(0),ff(0),dt(0) { args.SetNameParam(); const E_Array * a = dynamic_cast(args[0].LeftValue()); ffassert(a); d= a->size(); if (d == 3) w= CastTo((*a)[2]); else if (d != 2) { CompileError("convect vector have only 2 or 3 componant");} u= CastTo((*a)[0]); v= CastTo((*a)[1]); dt=CastTo(args[1]); ff=CastTo(args[2]); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype(),atype());} static E_F0 * f(const basicAC_F0 & args) { return new Convect(args);} AnyType operator()(Stack s) const ; AnyType eval2(Stack s) const ; AnyType eval3(Stack s) const ; operator aType () const { return atype();} }; /// <> used for the [[plot_keyword]] class Plot : public E_F0mps /* [[file:AFunction.hpp::E_F0mps]] */ { public: typedef KN_ tab; typedef pferbase sol; typedef pferbasearray asol; typedef pf3rbase sol3; typedef pf3rbasearray asol3; typedef pfecbase solc; typedef pfecbasearray asolc; typedef pf3cbase solc3; typedef pf3cbasearray asolc3; typedef long Result; struct ListWhat { int what,i; int cmp[3]; int n; void * v[3];// for pmesh th() { assert(v[0] && what==0); return static_cast(v[0]);} pmesh3 th3() { assert(v[0] && what==5); return static_cast(v[0]);} void Set(int nn=0,void **vv=0,int *c=0) { cmp[0]=cmp[1]=cmp[2]=-1; v[0]=v[1]=v[2]=0; n=nn; for(int i=0;i void eval(S *f,int *c) { for(int i=0;i<3;++i) { f[i]= static_cast(v[i]); c[i]= cmp[i]; } } template M eval() { assert(v[0]); return static_cast(v[0]); } void eval(sol & f0,int & cmp0, sol &f1,int &cmp1) { f0=static_cast(v[0]); f1=static_cast(v[1]); cmp0=cmp[0]; cmp1=cmp[1]; } }; /// <> struct Expression2 { long what; // 0 mesh, 1 iso, 2 vector, 3 curve , 4 border , 5 mesh3, 6 iso 3d, // 7: vector 3d ( +10 -> complex visu ???? ) // 101 array of iso 2d , 106 array of iso 3d , 100 array of meshes bool composant; Expression e[3]; Expression2() {e[0]=0;e[1]=0;e[2]=0;composant=false;what=0;} Expression &operator[](int i){return e[i];} template int EvalandPush(Stack s,int ii,vector & ll ) const { int n=-1; S f[3]={0,0,0}; int cmp[3]={-1,-1,-1}; for(int i=0;i<3;++i) if (e[i]) { if (!composant) { pair p= GetAny< pair >((*e[i])(s)); n=i;cmp[i]=p.second; f[i]= p.first;} else { cmp[i]=0; f[i]=GetAny< S >((*e[i])(s)); n=i;} } ll.push_back(ListWhat(what,ii,n+1,f,cmp)); return n;} template // ok of mesh too because composant=true; int AEvalandPush(Stack s,int ii,vector & ll ) const { typedef pair PA; int nn=-1; A f[3]; union { S fj[3]; void *fv[3]; }; f[0]=f[1]=f[2]=0; int cmp[3]={-1,-1,-1}; for(int i=0;i<3;++i) if (e[i]) { if (!composant) { PA p= GetAny< PA >((*e[i])(s)); cmp[i]=p.second;f[i]=p.first; nn=i;} else { f[i]= GetAny< A >((*e[i])(s)); cmp[i]=0; nn=i;} } else break; nn++; int n = f[0]->N; if(verbosity>50) // add 01/2011 FH ???? cout << "add N = " << n << " " << nn << " "<< what << endl; for(int j=0;joperator[](j); if(fj[i] && fj[i]->x()) m=i; else break; } if(m>=0) { ll.push_back(ListWhat(what%100,ii,m+1,fv,cmp)); if(verbosity>100) cout << "."; } } if(verbosity>100) cout << endl; return nn; } template int MEvalandPush(Stack s,int ii,vector & ll ) const { typedef KN * A; A ath; ath= GetAny< A >((*e[0])(s)); int n=0; if(ath) n = ath->N(); S th; for(int j=0;joperator[](j); if(th) ll.push_back(ListWhat(what%100,ii,static_cast(th))); } return n; } sol eval(int i,Stack s,int & cmp) const { cmp=-1; if (e[i]) { if (!composant) {pfer p= GetAny< pfer >((*e[i])(s)); cmp=p.second;return p.first;} else {return GetAny< pferbase >((*e[i])(s));} } else return 0;} sol3 eval3(int i,Stack s,int & cmp) const { cmp=-1; if (e[i]) { if (!composant) {pf3r p= GetAny< pf3r >((*e[i])(s)); cmp=p.second;return p.first;} else {return GetAny< pf3rbase >((*e[i])(s));} } else return 0;} // add FH Japon 2010 .. for complex visu ... to complex .... try to uniformize ... solc evalc(int i,Stack s,int & cmp) const { cmp=-1; if (e[i]) { if (!composant) {pfec p= GetAny< pfec >((*e[i])(s)); cmp=p.second;return p.first;} else {return GetAny< pfecbase >((*e[i])(s));} } else return 0;} solc3 evalc3(int i,Stack s,int & cmp) const { cmp=-1; if (e[i]) { if (!composant) {pf3c p= GetAny< pf3c >((*e[i])(s)); cmp=p.second;return p.first;} else {return GetAny< pf3cbase >((*e[i])(s));} } else return 0;} asol evala(int i, Stack s,int & cmp) const { cmp=-1; if (e[i]) {pferarray p= GetAny< pferarray >((*e[i])(s)); cmp=p.second;return p.first;} else return 0;} asol3 evala3(int i, Stack s,int & cmp) const { cmp=-1; if (e[i]) {pf3rarray p= GetAny< pf3rarray >((*e[i])(s)); cmp=p.second;return p.first;} else return 0;} asolc evalca(int i, Stack s,int & cmp) const { cmp=-1; if (e[i]) {pfecarray p= GetAny< pfecarray >((*e[i])(s)); cmp=p.second;return p.first;} else return 0;} asolc3 evalca3(int i, Stack s,int & cmp) const { cmp=-1; if (e[i]) {pf3carray p= GetAny< pf3carray >((*e[i])(s)); cmp=p.second;return p.first;} else return 0;} Mesh & evalm(int i,Stack s) const { throwassert(e[i]);return * GetAny< pmesh >((*e[i])(s)) ;} KN * evalma(int i,Stack s) const { throwassert(e[i]);return GetAny< KN * >((*e[i])(s)) ;} const Mesh3 & evalm3(int i,Stack s) const { throwassert(e[i]);return * GetAny< pmesh3 >((*e[i])(s)) ;} const E_BorderN * evalb(int i,Stack s) const { throwassert(e[i]);return GetAny< const E_BorderN *>((*e[i])(s)) ;} tab evalt(int i,Stack s) const { throwassert(e[i]);return GetAny((*e[i])(s)) ;} }; // see [[Plot_name_param]] static basicAC_F0::name_and_type name_param[] ; /// FFCS: added new parameters for VTK graphics. See [[Plot_name_param]] for new parameter names static const int n_name_param=42; Expression bb[4]; /// see [[Expression2]] vector l; Expression nargs[n_name_param]; Plot(const basicAC_F0 & args) : l(args.size()) { args.SetNameParam(n_name_param,name_param,nargs); if ( nargs[8] ) Box2x2( nargs[8] , bb); for (size_t i=0;i()) { //cout << "args[i].left()==atype()" << endl; l[i].composant=false; const E_Array * a = dynamic_cast(args[i].LeftValue()); ffassert(a); int asizea=a->size(); if(asizea==0) CompileError("plot of vector with 0 of components(!= 2 or 3) "); bool bpfer= BCastTo((*a)[0]); bool bpf3r= BCastTo((*a)[0]); bool bpfec= BCastTo((*a)[0]); bool bpf3c= BCastTo((*a)[0]); if ( bpfer && asizea <3) { l[i].what=asizea; for (int j=0;jsize();j++) l[i][j]= CastTo((*a)[j]); } else if ( bpfec && asizea <3) { l[i].what=10+asizea; for (int j=0;jsize();j++) l[i][j]= CastTo((*a)[j]); } else if (asizea==2) { l[i].what=3; for (int j=0;jsize();j++) l[i][j]= CastTo((*a)[j]); } else if (asizea == 3 && bpf3r ) // 3d vector ... { l[i].what=7; // new 3d vector for (int j=0;jsize();j++) l[i][j]= CastTo((*a)[j]); } else if (asizea == 3 && bpf3c ) // 3d vector ... { l[i].what=17; // new 3d vector for (int j=0;jsize();j++) l[i][j]= CastTo((*a)[j]); } else { CompileError("plot of array with wrong number of components (!= 2 or 3) ");} } else if (BCastTo(args[i])) { l[i].what=1; // iso value 2d // cout << "BCastTo(args[i])" << endl; l[i].composant=true; l[i][0]=CastTo(args[i]); } else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=1; // iso value 2d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { l[i].what=11; // iso value 2d // cout << "BCastTo(args[i])" << endl; l[i].composant=true; l[i][0]=CastTo(args[i]); } else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=11; // iso value 2d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=6; // iso value 3d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=16; // iso value 3d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=101; // iso value array iso value 2d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=111; // iso value array iso value 2d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=106; //arry iso value array iso value 3d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])) { // cout << "BCastTo(args[i])" << endl; l[i].composant=false; l[i].what=116; //arry iso value array iso value 3d l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])){ l[i].composant=true; l[i].what=0; // mesh ... l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])){ l[i].composant=true; l[i].what=5;// 3d mesh ... l[i][0]=CastTo(args[i]);} else if (BCastTo(args[i])){ // cout << "BCastTo(args[i])" << endl; l[i].what=4; // border 2d l[i].composant=true; l[i][0]=CastTo(args[i]);} else if (BCastTo *>(args[i])){ l[i].composant=true; // cout << "BCastTo(args[i])" << endl; l[i].what=100; // mesh 2d array l[i][0]=CastTo *>(args[i]);} else { CompileError("Sorry no way to plot this kind of data"); } } static ArrayOfaType typeargs() { return ArrayOfaType(true);}// all type /// <> Creates a Plot object with the list of arguments obtained from the script during the grammatical /// analysis of the script (in lg.ypp) static E_F0 * f(const basicAC_F0 & args) { return new Plot(args);} /// Evaluates the contents of the Plot object during script evaluation. Implemented at [[Plot_operator_brackets]] AnyType operator()(Stack s) const ; }; /// <> basicAC_F0::name_and_type Plot::name_param[Plot::n_name_param] = { { "coef", &typeid(double)}, { "cmm", &typeid(string*)}, { "ps", &typeid(string*) }, { "wait", &typeid(bool) }, { "fill", &typeid(bool) }, { "value", &typeid(bool) }, { "clean", &typeid(bool) }, { "aspectratio", &typeid(bool)}, { "bb",&typeid(E_Array) }, { "nbiso", &typeid(long)}, { "nbarrow", &typeid(long)}, { "viso", &typeid(KN_)}, { "varrow", &typeid(KN_)}, { "bw",&typeid(bool)}, { "grey", &typeid(bool)}, { "hsv", &typeid(KN_)}, { "boundary", &typeid(bool)}, // 16 { "dim", &typeid(long)}, // 2 or 3 { "add", &typeid(bool)}, // add to previous plot { "prev", &typeid(bool)}, // keep previou view point { "ech", &typeid(double)}, // keep previou view point // FFCS: more options for VTK graphics (numbers are required for processing) {"ZScale",&typeid(double)}, // #1 {"WhiteBackground",&typeid(bool)}, // #2 {"OpaqueBorders",&typeid(bool)}, // #3 {"BorderAsMesh",&typeid(bool)}, // #4 {"ShowMeshes",&typeid(bool)}, // #5 {"ColorScheme",&typeid(long)}, // #6 {"ArrowShape",&typeid(long)}, // #7 {"ArrowSize",&typeid(double)}, // #8 {"ComplexDisplay",&typeid(long)}, // #9 {"LabelColors",&typeid(bool)}, // #10 {"ShowAxes",&typeid(bool)}, // #11 {"CutPlane",&typeid(bool)}, // #12 {"CameraPosition",&typeid(KN_)}, // #13 {"CameraFocalPoint",&typeid(KN_)}, // #14 {"CameraViewUp",&typeid(KN_)}, // #15 {"CameraViewAngle",&typeid(double)}, // #16 {"CameraClippingRange",&typeid(KN_)}, // #17 {"CutPlaneOrigin",&typeid(KN_)}, // #18 {"CutPlaneNormal",&typeid(KN_)}, // #19 {"WindowIndex",&typeid(long)}, // #20 {"NbColorTicks",&typeid(long)}, // #21 }; template class pb2mat : public E_F0 { public: typedef Matrice_Creuse * Result; const Problem * pb; pb2mat(const basicAC_F0 & args) : pb(dynamic_cast(args[0].left())) {ffassert(pb);} static ArrayOfaType typeargs() { return ArrayOfaType(atype());} static E_F0 * f(const basicAC_F0 & args) { return new Plot(args);} AnyType operator()(Stack s) const { Problem::Data *data= pb->dataptr(this->stack); if ( SameType::OK ) { ffassert( !!data->AR); return SetAny * >(&data->AR) ; } else { ffassert( !!data->AC); return SetAny * >(&data->AC) ; } } }; //template void PrintP(RR* a, A b){ *a <<*b;} LinkToInterpreter::LinkToInterpreter() { //P,N,x,y,z,label,region,nu_triangle; P=make_Type_Expr(atype(),new E_P_Stack_P); x=make_Type_Expr(atype(),new E_P_Stack_Px); y=make_Type_Expr(atype(),new E_P_Stack_Py); z=make_Type_Expr(atype(),new E_P_Stack_Pz); N=make_Type_Expr(atype(),new E_P_Stack_N); region=make_Type_Expr(new E_P_Stack_Region,atype()); label=make_Type_Expr(new E_P_Stack_Label,atype()); nu_triangle= make_Type_Expr(atype(),new E_P_Stack_Nu_Triangle); nu_edge= make_Type_Expr(atype(),new E_P_Stack_Nu_Edge); lenEdge = make_Type_Expr(atype(),new E_P_Stack_lenEdge); hTriangle = make_Type_Expr(atype(),new E_P_Stack_hTriangle); area = make_Type_Expr(atype(),new E_P_Stack_areaTriangle); volume = make_Type_Expr(atype(),new E_P_Stack_VolumeTet); inside = make_Type_Expr(atype(),new E_P_Stack_inside); Global.New("x",x); Global.New("y",y); Global.New("z",z); Global.New("label",label); Global.New("region",region); Global.New("nuTriangle",nu_triangle); Global.New("nuEdge",nu_edge); Global.New("P",P); Global.New("N",N); Global.New("lenEdge",lenEdge); Global.New("area",area); Global.New("volume",volume); Global.New("hTriangle",hTriangle); Global.New("inside",inside); Global.New("nTonEdge",make_Type_Expr(atype(),new E_P_Stack_nTonEdge)); } template struct set_eqmatrice_creuse_fbl: public binary_function*,const Matrice_Creuse *,const C_args * > { static Matrice_Creuse* f(Matrice_Creuse* const & a,const C_args * const & b) { // 1 verif the FESpace // 2 set = or += ffassert(0); return a;} }; template struct set_eqvect_fl: public binary_function*,const FormLinear *,KN*> { static KN* f(KN* const & a,const FormLinear * const & b) { ffassert(0); return a;} }; template AnyType IntFunction::operator()(Stack stack) const { MeshPoint mp=* MeshPointStack(stack); R r=0; SHOWVERB(cout << " int " << endl); const vector & what(di->what); const int dim =di->d; const GQuadratureFormular& FIE = di->FIE(stack); const GQuadratureFormular & FIT = di->FIT(stack); const GQuadratureFormular & FIV = di->FIV(stack); CDomainOfIntegration::typeofkind kind = di->kind; set setoflab; bool all=true; if (verbosity>3) { if(dim==2) { if (CDomainOfIntegration::int1d==kind) cout << " -- boundary int border ( nQP: "<< FIE.n << ") levelset: "<< di->islevelset() << " ," ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges ( nQP: "<< FIE.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIE.n << ")," ; else cout << " -- int (nQP: "<< FIT.n << " ) in " ; } else if(dim==3) { if (CDomainOfIntegration::int2d==kind) cout << " -- boundary int border ( nQP: "<< FIT.n << ") ," ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all faces ( nQP: "<< FIT.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF face nQP: ("<< FIT.n << ")," ; else cout << " -- int (nQP: "<< FIV.n << " ) in " ; } } /* if ( verbosity>3) if (kind==CDomainOfIntegration::int1d) cout << " -- boundary int border " ; else if (kind==CDomainOfIntegration::intalledges) cout << " -- boundary int all edges " ; else if (kind==CDomainOfIntegration::intallVFedges) cout << " -- boundary int all VF edges " ; else cout << " -- boundary int " ;*/ Expandsetoflab(stack,*di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; } */ if(dim==2) { if(di->islevelset() && (CDomainOfIntegration::int1d!=kind) && (CDomainOfIntegration::int2d!=kind) ) InternalError("So no levelset integration type case (10 2d)"); const Mesh & Th = * GetAny( (*di->Th)(stack) ); ffassert(&Th); if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if (kind==CDomainOfIntegration::int1d) { const QuadratureFormular1d & FI = FIE; if(di->islevelset()) { double llevelset = 0; double uset = HUGE_VAL; R2 Q[3]; KN phi(Th.nv);phi=uset; double f[3]; for(int t=0; t< Th.nt;++t) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di->levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } if( umn <=0 && umx >= 0) { int np= IsoLineK(f,Q,1e-10); if(np==2) { const Triangle & K(Th[t]); R2 PA(K(Q[0])),PB(K(Q[1])); R2 NAB(PA,PB); double lAB=sqrt((NAB,NAB)); NAB = NAB.perp()/lAB; llevelset += lAB; for (int npi=0;npiset(Th,K(Pt),Pt,K,-1,NAB,-1); r += lAB*pi.a*GetAny( (*fonc)(stack)); } } } } if(verbosity > 5) cout << " Lenght level set = " << llevelset << endl; } else for( int e=0;eset(Th,K(Pt),Pt,K,Th.bedges[e].lab,R2(E.y,-E.x)/le,ie); r += le*pi.a*GetAny( (*fonc)(stack)); } } } } else if (kind==CDomainOfIntegration::int2d) { const QuadratureFormular & FI =FIT; if(di->islevelset()) { // add FH mars 2014 compute int2d on phi < 0 .. double llevelset = 0; double uset = HUGE_VAL; R2 Q[3]; KN phi(Th.nv);phi=uset; double f[3],umx,umn; for(int t=0; t< Th.nt;++t) { if (all || setoflab.find(Th[t].lab) != setoflab.end()) { const Triangle & K(Th[t]); double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di->levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } double area =K.area; if( umn >=0 ) continue; // all positif => nothing if( umx >0 ) { // coupe .. int i0 = 0, i1 = 1, i2 =2; if( f[i0] > f[i1] ) swap(i0,i1) ; if( f[i0] > f[i2] ) swap(i0,i2) ; if( f[i1] > f[i2] ) swap(i1,i2) ; double c = (f[i2]-f[i1])/(f[i2]-f[i0]); // coef Up Traing if( f[i1] < 0 ) {double y=f[i2]/(f[i2]-f[i1]); c *=y*y; } else {double y=f[i0]/(f[i0]-f[i1]) ; c = 1.- (1.-c)*y*y; }; assert( c > 0 && c < 1); area *= 1-c; } // warning quadrature wrong just ok for constante FH, we must also change the quadaturer points .. // just order 1 here ??? for (int npi=0; npiset(Th,K(pi),pi,K,K.lab); r += area*pi.a*GetAny( (*fonc)(stack)); } } } } else for (int i=0;i< Th.nt; i++) { const Triangle & K(Th[i]); if (all || setoflab.find(Th[i].lab) != setoflab.end()) for (int npi=0; npiset(Th,K(pi),pi,K,K.lab); r += K.area*pi.a*GetAny( (*fonc)(stack)); } } } else if (kind==CDomainOfIntegration::intalledges) { const QuadratureFormular1d & FI = FIE; for (int i=0;i< Th.nt; i++) if (all || setoflab.find(Th[i].lab) != setoflab.end()) for( int ie=0;ie<3;ie++) { const Triangle & K(Th[i]); R2 E=K.Edge(ie); double le = sqrt((E,E)); R2 PA(TriangleHat[VerticesOfTriangularEdge[ie][0]]), PB(TriangleHat[VerticesOfTriangularEdge[ie][1]]); for (int npi=0;npiset(Th,K(Pt),Pt,K,K.lab,R2(E.y,-E.x)/le,ie);// correction FH 6/2/2014 r += le*pi.a*GetAny( (*fonc)(stack)); } } } else if (kind==CDomainOfIntegration::intallVFedges) { double untier(1./3.); cerr << " a faire CDomainOfIntegration::intallVFedges " << endl; //%%%%%%%%% ffassert(0); const QuadratureFormular1d & FI = FIE; for (int i=0;i< Th.nt; i++) if (all || setoflab.find(Th[i].lab) != setoflab.end()) { const Triangle & K(Th[i]); const R2 GH(untier,untier); const R2 G=K(GH); for( int ie=0;ie<3;ie++) { int ie0=VerticesOfTriangularEdge[ie][0] ; int ie1=VerticesOfTriangularEdge[ie][1] ; const R2 MH=(TriangleHat[ie0]+TriangleHat[ie1])*0.5; const R2 M(K(MH)); R2 E(G,M); double le = sqrt((E,E)); for (int npi=0;npiset(Th,K(Pt),Pt,K,Th[ie].lab,R2(E.y,-E.x)/le,ie,1); r += le*pi.a*GetAny( (*fonc)(stack)); } } } } else { InternalError("CDomainOfIntegration kind unkown"); } } else if(dim==3) { if(di->islevelset() && (CDomainOfIntegration::int2d!=kind) && (CDomainOfIntegration::int3d!=kind) ) InternalError("So no levelset integration type on no int2d / int3d case (10 3d)"); const Mesh3 & Th = * GetAny( (*di->Th)(stack) ); ffassert(&Th); if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if (kind==CDomainOfIntegration::int2d) if(di->islevelset()) { const GQuadratureFormular & FI = FIT; double llevelset = 0; const double uset = std::numeric_limits::max(); // cout << " uset ="< phi(Th.nv); phi=uset; double f[4]; for(int t=0; t< Th.nt;++t) { double umx=std::numeric_limits::min(),umn=std::numeric_limits::max(); for(int i=0;i<4;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di->levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,f[i]); umn = std::min(umn,f[i]); } if( umn <=0 && umx >= 0) { int np= IsoLineK(f,Q,1e-10); double l[3]; if(np>2) { if(verbosity>999) cout << t << " int levelset : " << umn << " .. " << umx << " np " << np <<" " << f[0] << " " << f[1] << " "<< f[2] << " "<< f[3] << " "< pi( FI[npi]); pi.toBary(l); R3 Pt( l[0]*Q[i0]+l[1]*Q[i1]+l[2]*Q[i2]); // MeshPointStack(stack)->set(Th,K(Pt),Pt,K,-1,NN,-1); r += mes*pi.a*GetAny( (*fonc)(stack)); } } } } } if(verbosity > 5) cout << " Area level set = " << llevelset << endl; // if(verbosity > 50) cout << "phi " << phi << endl; } else { const GQuadratureFormular & FI = FIT; int lab; for( int e=0;e pi( FI[npi]); R3 Pt(K.PBord(ie,pi)); // MeshPointStack(stack)->set(Th,K(Pt),Pt,K,lab,NN,ie); r += mes*pi.a*GetAny( (*fonc)(stack)); } } } } else if (kind==CDomainOfIntegration::int3d) { if(di->islevelset()) { // int3d levelset < 0 GQuadratureFormular FI(FIV.n*3); double llevelset = 0; const double uset = std::numeric_limits::max(); // cout << " uset ="< phi(Th.nv); phi=uset; double f[4]; for (int t=0;t< Th.nt; t++) { const Mesh3::Element & K(Th[t]); if (all || setoflab.find(K.lab) != setoflab.end()) { double umx=std::numeric_limits::min(),umn=std::numeric_limits::max(); for(int i=0;i<4;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di->levelset(stack);//zzzz } f[i]=phi[j]; } int ntets= UnderIso(f,Q, vol6,1e-14); setQF(FI,FIV,QuadratureFormular_Tet_1, Q,vol6,ntets); for (int npi=0; npi pi(FI[npi]); MeshPointStack(stack)->set(Th,K(pi),pi,K,K.lab); r += K.mesure()*pi.a*GetAny( (*fonc)(stack)); } } } } else { const GQuadratureFormular & FI =FIV; for (int i=0;i< Th.nt; i++) { const Mesh3::Element & K(Th[i]); if (all || setoflab.find(K.lab) != setoflab.end()) for (int npi=0; npi pi(FI[npi]); MeshPointStack(stack)->set(Th,K(pi),pi,K,K.lab); r += K.mesure()*pi.a*GetAny( (*fonc)(stack)); } } } } else if (kind==CDomainOfIntegration::intalledges) { const GQuadratureFormular & FI = FIT; int lab; for (int i=0;i< Th.nt; i++) if (all || setoflab.find(Th[i].lab) != setoflab.end()) for( int ie=0;ie<3;ie++) { const Mesh3::Element & K(Th[i]); R3 NN=K.N(ie); double mes = NN.norme(); NN /= mes; mes*=0.5;// correction 05/01/09 FH for (int npi=0;npi pi( FI[npi]); R3 Pt(K.PBord(ie,pi)); // MeshPointStack(stack)->set(Th,K(Pt),Pt,K,lab,NN,ie); r += mes*pi.a*GetAny( (*fonc)(stack)); } } } } else { InternalError("CDomainOfIntegration dim unkown");} *MeshPointStack(stack)=mp; return SetAny(r); } void Show(const char * s,int k=1) { if(k) { couleur(1); float xmin,xmax,ymin,ymax; getcadre(xmin,xmax,ymin,ymax); rmoveto(xmin+(xmax-xmin)/100,ymax-(k)*(ymax-ymin)/30); plotstring(s); // couleur(1); } } template int Send2d(PlotStream & theplot,Plot::ListWhat & lli,map & mapth) { typedef FEbase * pfek ; pfek fe[3]={0,0,0}; int cmp[3]={-1,-1,-1}; int err=1; long what=lli.what; int lg,nsb; lli.eval(fe,cmp); if (fe[0]->x() && what %10 ==1) { err=0; theplot << what ; theplot <Vh->Th)];// numero du maillage KN V1=fe[0]->Vh->newSaveDraw(*fe[0]->x(),cmp[0],lg,nsb); // construction of the sub division ... int nsubT=NbOfSubTriangle(nsb); int nsubV=NbOfSubInternalVertices(nsb); KN Psub(nsubV); KN Ksub(nsubT*3); for(int i=0;i9) cout << " Send plot:what: " << what << " " << nsb << " "<< V1.N() << " Max " << V1.max() << " min " << V1.min() << endl; theplot << Psub ; theplot << Ksub ; theplot << V1; // theplot << (long) nsb<< V1; } else if (fe[0]->x() && fe[1]->x() &&what %10 ==2) { { err=0; theplot << what ; KN V1=fe[0]->Vh->newSaveDraw(*fe[0]->x(),*fe[1]->x(),cmp[0],cmp[1],lg,nsb); // construction of the sub division ... int nsubT=NbOfSubTriangle(nsb); int nsubV=NbOfSubInternalVertices(nsb); KN Psub(nsubV); KN Ksub(nsubT*3); for(int i=0;iVh->Th)];// numero du maillage theplot << Psub ; theplot << Ksub ; theplot << V1; // theplot << (long) nsb<< V1; } } return err; } template int Send3d(PlotStream & theplot,Plot::ListWhat &lli,map &mapth3) { typedef FEbase * pfek3 ; pfek3 fe3[3]={0,0,0}; int cmp[3]={-1,-1,-1}; int err=1; long what=lli.what; int lg,nsb; if (what%10==6) { int lg,nsb; lli.eval(fe3,cmp); // FFCS is able to display 3d complex data //if(what==6) { if (fe3[0]->x()) { err=0; theplot << what ; theplot <Vh->Th)];// numero du maillage // KN GFESpace::newSaveDraw(const KN_ & U,int composante,int & lg, // KN &Psub,KN &Ksub,int op_U) const KN Psub; KN Ksub; KN V1=fe3[0]->Vh->newSaveDraw(*fe3[0]->x(),cmp[0],lg,Psub,Ksub,0); if(verbosity>9) cout << " Send plot:what: " << what << " " << nsb << " "<< V1.N() << " " << V1.max() << " " << V1.min() << endl; theplot << Psub ; theplot << Ksub ; theplot << V1; } } } else if (what%10==7) { int lg,nsb; lli.eval(fe3,cmp); // FFCS is able to display 3d complex data //if(what==7) // ve { if (fe3[0]->x()&& fe3[1]->x() && fe3[2]->x()) { err=0; theplot << what ; theplot <Vh->Th)];// numero du maillage // KN GFESpace::newSaveDraw(const KN_ & U,int composante,int & lg, // KN &Psub,KN &Ksub,int op_U) const KN Psub1,Psub2,Psub3; // bf Bof ... KN Ksub1,Ksub2,Ksub3; KN V1=fe3[0]->Vh->newSaveDraw(*fe3[0]->x(),cmp[0],lg,Psub1,Ksub1,0); KN V2=fe3[1]->Vh->newSaveDraw(*fe3[1]->x(),cmp[1],lg,Psub2,Ksub2,0); KN V3=fe3[2]->Vh->newSaveDraw(*fe3[2]->x(),cmp[2],lg,Psub3,Ksub3,0); if(verbosity>9) cout << " Send plot:what: " << what << " " << nsb << " "<< V1.N() << " " << V1.max() << " " << V1.min() << endl; theplot << Psub1 ; theplot << Ksub1 ; ffassert( V1.N() == V2.N() &&V1.N() == V3.N()); KNM V123(3,V1.N()); // warning fortran numbering ... V123(0,'.')=V1; V123(1,'.')=V2; V123(2,'.')=V3; // FFCS: should be able to deal with complex as well theplot << (KN_&) V123; } } } return err; } /// <> from class [[Plot]] AnyType Plot::operator()(Stack s) const{ // remap case 107 and 108 , 109 for array of FE. vector ll; ll.reserve(l.size()); // generation de la list de plot ... for (size_t i=0;i * ath; //pmesh th; //int cmp0=0,cmp1=1,cmp2=2; switch (l[i].what) { case 0: case 5: l[i].EvalandPush(s,i,ll); break; case 1: case 2: case 6 : case 7 : case 11: case 12: case 16 : case 17 : l[i].EvalandPush(s,i,ll);break; case 100 : l[i].MEvalandPush< pmesh>(s,i,ll);break; case 105 : l[i].MEvalandPush< pmesh3>(s,i,ll);break; case 101 : l[i].AEvalandPush(s,i,ll);break; case 106 : l[i].AEvalandPush(s,i,ll);break; case 111: l[i].AEvalandPush(s,i,ll);break; case 116: l[i].AEvalandPush(s,i,ll);break; default: ffassert(l[i].what<100) ; // missing piece of code FH (jan 2010) ... ll.push_back(ListWhat(l[i].what,i)); break; } } if(ThePlotStream) { /* les different item of the plot are given by the number what: what = 0 -> mesh what = 1 -> scalar field (FE function 2d) what = 2 -> 2d vector field (two FE function 2d) what = 3 -> curve def by 2 plot what = 4 -> border what = 5 3d meshes what = 6 FE function 3d what = 100,101,106 // remap ... what = 7 => 3d vector field (tree FE function 3d) what = 8 ??? what = -1 -> error, item empty */ PlotStream theplot(ThePlotStream); pferbase fe[3]={0,0,0}; pf3rbase fe3[3]={0,0,0}; double echelle=1; int cmp[3]={-1,-1,-1}; theplot.SendNewPlot(); if (nargs[0]) (theplot<< 0L) <= GetAny((*nargs[0])(s)); if (nargs[1]) (theplot<< 1L) <= GetAny((*nargs[1])(s)); if (nargs[2]) (theplot<< 2L) <= GetAny((*nargs[2])(s)); if (nargs[3]) (theplot<< 3L) <= (bool) (!NoWait && GetAny((*nargs[3])(s))); else (theplot<< 3L) <= (bool) (TheWait&& !NoWait); if (nargs[4]) (theplot<< 4L) <= GetAny((*nargs[4])(s)); if (nargs[5]) (theplot<< 5L) <= GetAny((*nargs[5])(s)); if (nargs[6]) (theplot<< 6L) <= GetAny((*nargs[6])(s)); if (nargs[7]) (theplot<< 7L) <= GetAny((*nargs[7])(s)); if (nargs[8]) { KN bbox(4); for (int i=0;i<4;i++) bbox[i]= GetAny((*bb[i])(s)); (theplot<< 8L) <= bbox ; } if (nargs[9]) (theplot<< 9L) <= GetAny((*nargs[9])(s)); if (nargs[10]) (theplot<< 10L) <= GetAny((*nargs[10])(s)); if (nargs[11]) { KN_ v =GetAny >((*nargs[11])(s)) ; (theplot<< 11L) <= v ;} if (nargs[12]) (theplot<< 12L) <= GetAny >((*nargs[12])(s)) ; if (nargs[13]) (theplot<< 13L) <= GetAny((*nargs[13])(s)); if (nargs[14]) (theplot<< 14L) <= GetAny((*nargs[14])(s)); if (nargs[15]) (theplot<< 15L) <= GetAny >((*nargs[15])(s)); if (nargs[16]) (theplot<< 16L) <= GetAny((*nargs[16])(s)); // add frev 2008 FH for 3d plot ... if (nargs[17]) (theplot<< 17L) <= GetAny((*nargs[17])(s)); if (nargs[18]) (theplot<< 18L) <= GetAny((*nargs[18])(s)); if (nargs[19]) (theplot<< 19L) <= GetAny((*nargs[19])(s)); if (nargs[20]) (theplot<< 20L) <= (echelle=GetAny((*nargs[20])(s))); // FFCS: extra plot options for VTK (indexed from 1 to keep these lines unchanged even if the number of standard // FF parameters above changes) received in [[file:../../../../src/visudata.cpp::receiving_plot_parameters]] #define VTK_START 20 #define SEND_VTK_PARAM(index,type) \ if(nargs[VTK_START+index]) \ (theplot<<(long)(VTK_START+index)) \ <=GetAny((*nargs[VTK_START+index])(s)); SEND_VTK_PARAM(1,double); // ZScale SEND_VTK_PARAM(2,bool); // WhiteBackground SEND_VTK_PARAM(3,bool); // OpaqueBorders SEND_VTK_PARAM(4,bool); // BorderAsMesh SEND_VTK_PARAM(5,bool); // ShowMeshes SEND_VTK_PARAM(6,long); // ColorScheme SEND_VTK_PARAM(7,long); // ArrowShape SEND_VTK_PARAM(8,double); // ArrowSize SEND_VTK_PARAM(9,long); // ComplexDisplay SEND_VTK_PARAM(10,bool); // LabelColors SEND_VTK_PARAM(11,bool); // ShowAxes SEND_VTK_PARAM(12,bool); // CutPlane SEND_VTK_PARAM(13,KN_); // CameraPosition SEND_VTK_PARAM(14,KN_); // CameraFocalPoint SEND_VTK_PARAM(15,KN_); // CameraViewUp SEND_VTK_PARAM(16,double); // CameraViewAngle SEND_VTK_PARAM(17,KN_); // CameraClippingRange SEND_VTK_PARAM(18,KN_); // CutPlaneOrigin SEND_VTK_PARAM(19,KN_); // CutPlaneNormal SEND_VTK_PARAM(20,long); // WindowIndex SEND_VTK_PARAM(21,long); // NbColorTicks theplot.SendEndArgPlot(); map mapth; map mapth3; long kth=0,kth3=0; // send all the mesh: for (size_t ii=0;iix()) th=&fe[0]->Vh->Th; if(fe[1] && fe[1]->x()) { ffassert(th == &fe[1]->Vh->Th); // assert(th); }; } else if (what==6 || what==7|| what==16 || what==17) { ll[ii].eval(fe3,cmp); if (fe3[0]->x()) th3=&fe3[0]->Vh->Th; if (fe3[1]) ffassert(th3 == &fe3[1]->Vh->Th); if (fe3[2]) ffassert(th3 == &fe3[2]->Vh->Th); } if(th && mapth.find(th)==mapth.end()) mapth[th]=++kth; if(th3 && (mapth3.find(th3)==mapth3.end())) mapth3[th3]=++kth3; } theplot.SendMeshes(); theplot << kth ; for (map::const_iterator i=mapth.begin();i != mapth.end(); ++i) { theplot << i->second << * i->first ; } // 3d meshes if(kth3) { theplot.SendMeshes3(); theplot << kth3 ; for (map::const_iterator i=mapth3.begin();i != mapth3.end(); ++i) { theplot << i->second << * i->first ; } } theplot.SendPlots(); theplot <<(long) ll.size(); for (size_t ii=0;ii( theplot,ll[ii] ,mapth); else if (what==11 || what==12 ) err = Send2d( theplot,ll[ii] ,mapth); /* { int lg,nsb; ll[ii].eval(fe,cmp); if(what==1) { if (fe[0]->x()) { err=0; theplot << what ; theplot <Vh->Th)];// numero du maillage KN V1=fe[0]->Vh->newSaveDraw(*fe[0]->x(),cmp[0],lg,nsb); // construction of the sub division ... int nsubT=NbOfSubTriangle(nsb); int nsubV=NbOfSubInternalVertices(nsb); KN Psub(nsubV); KN Ksub(nsubT*3); for(int i=0;i9) cout << " Send plot:what: " << what << " " << nsb << " "<< V1.N() << " " << V1.max() << " " << V1.min() << endl; theplot << Psub ; theplot << Ksub ; theplot << V1; // theplot << (long) nsb<< V1; } } else { if ( fe[0]->x() && fe[1]->x()) { err=0; theplot << what ; KN V1=fe[0]->Vh->newSaveDraw(*fe[0]->x(),*fe[1]->x(),cmp[0],cmp[1],lg,nsb); // construction of the sub division ... int nsubT=NbOfSubTriangle(nsb); int nsubV=NbOfSubInternalVertices(nsb); KN Psub(nsubV); KN Ksub(nsubT*3); for(int i=0;iVh->Th)];// numero du maillage theplot << Psub ; theplot << Ksub ; theplot << V1; // theplot << (long) nsb<< V1; } } }*/ else if (l[i].what==3 ) { tab x=l[i].evalt(0,s); tab y=l[i].evalt(1,s); if( x.N() >0 && y.N() == x.N()) { err=0; // correction dec 2008 FH theplot << what ; theplot << x << y ; } else { if(verbosity) cerr << "Warning: Plot of array with wrong size (item "<< i + 1 << ") sizes = " << x.size()<< " , " << y.size() << endl; } } else if (l[i].what==4 ) { err=0; theplot << what ; const E_BorderN * Bh= l[i].evalb(0,s); Bh->SavePlot(s,theplot); } else if(what ==5) { pTh3=&l[i].evalm3(0,s); if(pTh3) { err=0; theplot << what ; theplot <( theplot,ll[ii] ,mapth3); else if (what==16 || what==17 ) err = Send3d( theplot,ll[ii] ,mapth3); /* { int lg,nsb; ll[ii].eval(fe3,cmp); if(what==6) { if (fe3[0]->x()) { err=0; theplot << what ; theplot <Vh->Th)];// numero du maillage // KN GFESpace::newSaveDraw(const KN_ & U,int composante,int & lg, // KN &Psub,KN &Ksub,int op_U) const KN Psub; KN Ksub; KN V1=fe3[0]->Vh->newSaveDraw(*fe3[0]->x(),cmp[0],lg,Psub,Ksub,0); if(verbosity>9) cout << " Send plot:what: " << what << " " << nsb << " "<< V1.N() << " " << V1.max() << " " << V1.min() << endl; theplot << Psub ; theplot << Ksub ; theplot << V1; } } } else if (what==7) { int lg,nsb; ll[ii].eval(fe3,cmp); if(what==7) // ve { if (fe3[0]->x()&& fe3[1]->x() && fe3[2]->x()) { err=0; theplot << what ; theplot <Vh->Th)];// numero du maillage // KN GFESpace::newSaveDraw(const KN_ & U,int composante,int & lg, // KN &Psub,KN &Ksub,int op_U) const KN Psub1,Psub2,Psub3; // bf Bof ... KN Ksub1,Ksub2,Ksub3; KN V1=fe3[0]->Vh->newSaveDraw(*fe3[0]->x(),cmp[0],lg,Psub1,Ksub1,0); KN V2=fe3[1]->Vh->newSaveDraw(*fe3[1]->x(),cmp[1],lg,Psub2,Ksub2,0); KN V3=fe3[2]->Vh->newSaveDraw(*fe3[2]->x(),cmp[2],lg,Psub3,Ksub3,0); if(verbosity>9) cout << " Send plot:what: " << what << " " << nsb << " "<< V1.N() << " " << V1.max() << " " << V1.min() << endl; theplot << Psub1 ; theplot << Ksub1 ; ffassert( V1.N() == V2.N() &&V1.N() == V3.N()); KNM V123(3,V1.N()); // warning fortran numbering ... V123(0,'.')=V1; V123(1,'.')=V2; V123(2,'.')=V3; theplot << (KN_&) V123; } } }*/ else ffassert(0);// erreur type theplot inconnue if(err==1) { if(verbosity) cerr << "Warning: May be a bug in your script, \n" << " a part of the plot is wrong t (mesh or FE function, curve) => skip the item " << i+1 << " in plot command " << endl; theplot << -1L << (long) i ; } } theplot.SendEndPlot(); } if (!withrgraphique) {initgraphique();withrgraphique=true;} viderbuff(); MeshPoint *mps=MeshPointStack(s),mp=*mps ; int nbcolors=0; float *colors=0; bool hsv=true; // hsv type R boundingbox[4]; double coeff=1; bool wait=TheWait; bool value=false; bool fill=false; bool aspectratio=false; bool clean=true; bool uaspectratio=false; bool pViso=false,pVarrow=false; int Niso=20,Narrow=20; KN Viso,Varrow; bool bw=false; string * psfile=0; string * cm=0; pferbase fe=0,fe1=0; int cmp0,cmp1; bool grey=getgrey(); bool greyo=grey; bool drawborder=true; if (nargs[0]) coeff= GetAny((*nargs[0])(s)); if (nargs[1]) cm = GetAny((*nargs[1])(s)); if (nargs[2]) psfile= GetAny((*nargs[2])(s)); if (nargs[3]) wait= GetAny((*nargs[3])(s)); if (nargs[4]) fill= GetAny((*nargs[4])(s)); if (nargs[5]) value= GetAny((*nargs[5])(s)); if (nargs[6]) clean= GetAny((*nargs[6])(s)); if (nargs[7]) uaspectratio=true,uaspectratio= GetAny((*nargs[7])(s)); if (nargs[8]) for (int i=0;i<4;i++) boundingbox[i]= GetAny((*bb[i])(s)); if (nargs[9]) Niso= GetAny((*nargs[9])(s)); if (nargs[10]) Narrow= GetAny((*nargs[10])(s)); if (nargs[11]) { KN_ v =GetAny >((*nargs[11])(s)) ; Niso=v.N(); Viso.init(Niso); Viso=v; pViso=true;} if (nargs[12]) { KN_ v =GetAny >((*nargs[12])(s)) ; Niso=v.N(); Varrow.init(Niso); Varrow=v; pVarrow=true; } if (nargs[13]) bw= GetAny((*nargs[13])(s)); if (nargs[14]) grey= GetAny((*nargs[14])(s)); if (nargs[15]) { KN_ cc= GetAny >((*nargs[15])(s)); nbcolors= cc.N()/3; if ( nbcolors > 1&& nbcolors < 100) { colors = new float [nbcolors*3]; for (int i=0; i<3*nbcolors; i++) colors[i]=cc[i]; } else nbcolors = 0; } if (nargs[16]) drawborder= GetAny((*nargs[16])(s)); int dimplot=2; if (nargs[17]) dimplot= GetAny((*nargs[17])(s)); bool addtoplot=false, keepPV=false; if (nargs[18]) addtoplot= GetAny((*nargs[18])(s)); if (nargs[19]) keepPV= GetAny((*nargs[19])(s)); // for the gestion of the PTR. WhereStackOfPtr2Free(s)=new StackOfPtr2Free(s);// FH aout 2007 setgrey(grey); if (Viso.unset()) Viso.init(Niso); if (Varrow.unset()) Varrow.init(Narrow); // KN Viso(Niso); // KN Varrow(Narrow); // if (pViso) Viso=*pViso; // if (pVarrow) Varrow=*pVarrow; const Mesh * cTh=0; bool vecvalue=false,isovalue=false; bool ops=psfile; bool drawmeshes=false; if ( clean ) { reffecran(); if (psfile) { openPS(psfile->c_str()); } if (bw) NoirEtBlanc(1); R2 Pmin,Pmax; R2 uminmax(1e100,-1e100); R2 Vminmax(1e100,-1e100); bool first=true; for (size_t ii=0;iix()) continue; //int nb=fe->x()->N(); fe->Vh->cmesh->BoundingBox(P1,P2); cTh=fe->Vh->cmesh; if (fe1==0) uminmax = minmax(uminmax,fe->Vh->MinMax(*fe->x(),cmp0)); else { if (fe1) { if (fe->Vh == fe1->Vh) { KN_ u( *fe->x()),v(*fe1->x()); Vminmax = minmax(Vminmax,fe->Vh->MinMax(u,v,cmp0,cmp1)); } else cerr << " On ne sait tracer que de vecteur sur un meme type element finite. " << endl; } } } else if (l[i].what==0) { if( !uaspectratio) aspectratio= true; const Mesh & Th= *ll[ii].th(); Th.BoundingBox(P1,P2); cTh=&Th; } else if (l[i].what==4) { if( !uaspectratio) aspectratio= true; const E_BorderN * Bh= l[i].evalb(0,s); Bh->BoundingBox(s,P1.x,P2.x,P1.y,P2.y); } else if (l[i].what==3) { tab ttx=l[i].evalt(0,s); tab tty=l[i].evalt(1,s); tab *tx=&ttx,*ty=&tty; P1=R2(tx->min(),ty->min()); P2=R2(tx->max(),ty->max()); if(verbosity>2) cout << "Plot: bound Pmin=" << P1 << ", Pmax=" << P2 << endl; } else continue; if (first) {first=false; Pmin=P1;Pmax=P2;} else { Pmin.x = Min(Pmin.x,P1.x); Pmin.y = Min(Pmin.y,P1.y); Pmax.x = Max(Pmax.x,P2.x); Pmax.y = Max(Pmax.y,P2.y); } } { R umx=uminmax.y,umn=uminmax.x; if (verbosity>5) cout << " u bound " << uminmax << " V : " << Vminmax <1) cout << "Plot bound [x,y] " << Pmin << " max [x,y] " << Pmax << endl; int N=Viso.N(); int Na=Varrow.N(); R2 O((Pmin+Pmax)/2); R rx(Pmax.x-Pmin.x),ry(Pmax.y-Pmin.y); // bug version 1.41 correct FH to remove div by zero. rx = Max(rx,1e-30); ry = Max(ry,1e-30); // -- end correction R r = (Max(rx,ry)*0.55); showgraphic(); if (aspectratio) cadreortho((float)O.x,(float)(O.y+r*0.05),(float) r); else cadre( (float)(O.x-rx*.55),(float)(O.x+rx*0.55),(float)(O.y-ry*.55),(float)(O.y+ry*.55)); R d = fill ? (umx-umn)/(N-1) : (umx-umn)/(N); R x = fill ? umn-d/2 :umn+d/2; if (!pViso) for (int i = 0;i < N;i++) {Viso[i]=x;x +=d; } if (fill && !pViso) {Viso[0]=umn-d;Viso[N-1]=umx+d;} x=0; d= sqrt(Vminmax.y)/(Na-1.001); if (!pVarrow) for (int i = 0;i < Na;i++) {Varrow[i]=x;x +=d; } SetColorTable(Max(N,Na)+4) ; } } // clean float xx0,xx1,yy0,yy1; if (nargs[8]) { xx0=min(boundingbox[0],boundingbox[2]); xx1=max(boundingbox[0],boundingbox[2]); yy0=min(boundingbox[1],boundingbox[3]); yy1=max(boundingbox[1],boundingbox[3]); if (verbosity>2) cout << "bb= xmin =" << xx0 << ", max =" << xx1 << ", ymin = " << yy0 << ", ymax = " << yy1 << endl; if (aspectratio) cadreortho((xx0+xx1)*0.5,(yy0+yy1)*0.5, max(xx1-xx0,yy1-yy0)*0.5); else cadre(xx0,xx1,yy0,yy1); } getcadre(xx0,xx1,yy0,yy1); const R ccoeff=coeff; bool plotting = true; // drawing part ------------------------------ while (plotting) { if(verbosity>99) cout << "plot::operator() Drawing part \n"; plotting = false; bool thfill=fill; for (size_t ii=0;iiDraw(0,thfill); else ll[ii].th()->Draw(0,thfill); else if (what==1 || what==2) { ll[ii].eval(fe,cmp0,fe1,cmp1); // fe= l[i].eval(0,s,cmp0); // fe1= l[i].eval(1,s,cmp1);; if (!fe->x()) continue; #ifdef VVVVVVV cout << " Min = " << fe->x->min() << " max = " << fe->x->max() ; if(fe1 && verbosity > 1) cout << " Min = " << fe1->x->min() << " max = " << fe1->x->max() ; cout << endl; #endif if (fe1) { if (fe->Vh == fe1->Vh) vecvalue=true,fe->Vh->Draw(*fe->x(),*fe1->x(),Varrow,coeff,cmp0,cmp1,colors,nbcolors,hsv,drawborder); else cerr << " On ne sait tracer que de vecteur sur un meme interpolation " << endl; if (drawmeshes) fe->Vh->Th.Draw(0,fill); } else if (fill) isovalue=true,fe->Vh->Drawfill(*fe->x(),Viso,cmp0,1.,colors,nbcolors,hsv,drawborder); else isovalue=true,fe->Vh->Draw(*fe->x(),Viso,cmp0,colors,nbcolors,hsv,drawborder); if (drawmeshes) fe->Vh->Th.Draw(0,fill); } else if (l[i].what==4) { const E_BorderN * Bh= l[i].evalb(0,s); Bh->Plot(s); } else if(l[i].what==3) { tab x=l[i].evalt(0,s); tab y=l[i].evalt(1,s); long k= Min(x.N(),y.N()); // cout << " a faire " << endl; // cout << " plot :\n" << * l[i].evalt(0,s) << endl << * l[i].evalt(1,s) << endl; rmoveto(x[0],y[0]); couleur(2+i); for (int i= 1;ic_str(),0.1,0.97); } if (ops ) { ops=false; closePS(); } if (wait && ! NoWait) { next: float x,y,x0,y0,x1,y1,dx,dy,coef=1.5; getcadre(x0,x1,y0,y1); char c=Getxyc(x,y); dx=(x1-x0)/2.;dy=(y1-y0)/2.; switch (c) { case '+' : plotting=true; cadre(x-dx/coef,x+dx/coef,y-dy/coef,y+dy/coef);reffecran(); break; case '-' : plotting=true; cadre(x-dx*coef,x+dx*coef,y-dy*coef,y+dy*coef);;reffecran(); break; case '=' : plotting=true; coeff=ccoeff; cadre(xx0,xx1,yy0,yy1);;reffecran(); break; case 'r' : plotting=true; reffecran(); break; case 'a' : case 'c' : coeff /= 1.5; plotting=true;reffecran(); reffecran(); break; case 'A' : case 'C' : coeff *= 1.5; plotting=true; reffecran(); break; case 'b' : bw= !bw;NoirEtBlanc(bw) ; plotting=true; reffecran(); break; case 'v' : value = !value ; plotting=true; reffecran(); break; case 'f' : fill = !fill ; plotting=true; reffecran(); break; case 'g' : setgrey(grey=!getgrey()); plotting=true; reffecran(); break; case 'm' : reffecran(); drawmeshes= !drawmeshes; plotting=true; break; case 'p' : plotting=true; reffecran(); ops=true; openPS(0); plotting=true; break; case 'q' : couleur(8); #ifdef DRAWING if (cTh) cTh->quadtree->Draw(); #endif couleur(1); goto next; case 's' : if(cTh) { R2 P(x,y),PF(P),Phat; bool outside; const Vertex * v=cTh->quadtree->NearestVertexWithNormal(P); if (!v) v=cTh->quadtree->NearestVertex(P); else { couleur(2); const Triangle * t= cTh->Find( PF, Phat,outside,&(*cTh)[cTh->Contening(v)]) ; t->Draw(0.8); couleur(2); PF=(*t)(Phat); DrawMark(PF,0.003); } couleur(5); DrawMark(P,0.0015); couleur(1); if (v) DrawMark(*v,0.005); goto next;} case '?': int i=2; reffecran(); //Show("Enter a keyboard character in graphic window to do :",i++); Show("Enter a keyboard character in the FreeFem Graphics window in order to:",i++); i+=2; //Show("+) zomm around the cursor 3/2 times ",i++); Show("+) zoom in around the cursor 3/2 times ",i++); Show("-) zoom out around the cursor 3/2 times ",i++); //Show("-) unzomm around the cursor 3/2 times ",i++) ; Show("=) reset zooming ",i++); Show("r) refresh plot ",i++); Show("ac) increase the size arrow ",i++); Show("AC) decrease the size arrow ",i++); Show("b) switch between black and white or color plotting ",i++); Show("g) switch between grey or color plotting ",i++); Show("f) switch between filling iso or not ",i++); Show("v) switch between show the numerical value of iso or not",i++); Show("p) save plot in a Postscprit file",i++); Show("m) switch between show meshes or not",i++); Show("p) switch between show quadtree or not (for debuging)",i++); Show("t) find Triangle ",i++); Show("?) show this help window",i++); Show("any other key : continue ",++i); goto next; } if (!pViso || !pVarrow) { // recompute the iso bound R2 uminmax(1e100,-1e100); R2 Vminmax(1e100,-1e100); for (size_t i=0;ix()) continue; // int nb=fe->x()->N(); if (fe1==0) uminmax = minmax(uminmax,fe->Vh->MinMax(*fe->x(),cmp0,false)); else { if (fe1) if (fe->Vh == fe1->Vh) { KN_ u( *fe->x()),v(*fe1->x()); Vminmax = minmax(uminmax,fe->Vh->MinMax(u,v,cmp0,cmp1,false)); } } } else continue; } if (verbosity>5) cout << " u bound " << uminmax << endl; R umx=uminmax.y,umn=uminmax.x; int N=Viso.N(); int Na=Varrow.N(); R d = fill ? (umx-umn)/(N-1) : (umx-umn)/(N); R x = fill ? umn-d/2 :umn+d/2; if (!pViso) for (int i = 0;i < N;i++) {Viso[i]=x;x +=d; } if (fill && !pViso) {Viso[0]=umn-d;Viso[N-1]=umx+d;} x=0; d= sqrt(Vminmax.y)/Na; if (!pVarrow) for (int i = 0;i < Na;i++) {Varrow[i]=x;x +=d; } } } *mps=mp; } // end plotting NoirEtBlanc(0) ; setgrey(greyo); if (colors) delete[] colors; // modif mars 2006 auto stack ptr // if (cm) delete cm; // if (psfile) delete psfile; viderbuff(); return 0L; } AnyType Convect::operator()(Stack s) const { if(d==2) return eval2(s); else return eval3(s); } AnyType Convect::eval2(Stack s) const { MeshPoint* mp(MeshPointStack(s)); static MeshPoint mpp,mps; static R ddts; R ddt = GetAny((*dt)(s)); if (ddt) { MeshPoint mpc(*mp); MeshPointStack(s,&mpc); if(*mp==mpp && ddt == ddts) mpc=mps; else { const Mesh & Th(*mp->Th); ffassert(mp->Th && mp->T); R l[3]; l[1]=mpc.PHat.x; l[2]=mpc.PHat.y; l[0]=1-l[1]-l[2]; int k=0; int j; int it=Th(mpc.T); while ( (j=WalkInTriangle(Th,it,l,GetAny((*u)(s)),GetAny((*v)(s)),ddt))>=0) { ffassert( l[j] == 0); //int jj = j; R a= l[(j+1)%3], b= l[(j+2)%3]; int itt = Th.ElementAdj(it,j); if(itt==it || itt <0) break; // le bord it = itt; l[j]=0; l[(j+1)%3] = b; l[(j+2)%3] = a; mpc.change(R2(l[1],l[2]),Th[it],0); if(k++>1000) { cerr << "Fatal error in Convect (R2) operator: loop => velocity too high ???? or NaN F. Hecht " << endl; ffassert(0); } } mpc.change(R2(l[1],l[2]),Th[it],0); mpp=*mp; mps=mpc; } } ddts=ddt; AnyType r= (*ff)(s); MeshPointStack(s,mp); return r; } AnyType Convect::eval3(Stack s) const { MeshPoint* mp(MeshPointStack(s)); static MeshPoint mpp,mps; static R ddts; randwalk(-1); // init randwalk R ddt = GetAny((*dt)(s)); if (ddt) { bool ddd=verbosity>1000; MeshPoint mpc(*mp); MeshPointStack(s,&mpc); if(*mp==mpp && ddt == ddts) mpc=mps; else { const Mesh3 & Th3(*mp->Th3); ffassert(mp->Th3 && mp->T3); R3 PHat=mpc.PHat; int k=0; int j; int it=Th3(mpc.T3); if(ddd) cout << " IN: " << (*mpc.T3)(PHat) << " ; " << mpc.P <<" : " << ddt << endl; while ( (j=WalkInTet(Th3,it,PHat,R3(GetAny((*u)(s)),GetAny((*v)(s)),GetAny((*w)(s))),ddt))>=0) if(j>3) { it=j-4; mpc.change(PHat,Th3[it],0); if(ddd) cout << " **P= "<< (*mpc.T3)(PHat) << " , Ph " << PHat << " : j = " << j << " it: " << it ; } else { if(ddd) cout << "P= "<< (*mpc.T3)(PHat) << " , Ph " << PHat << " : j = " << j << " it: " << it ; #ifdef DEBUG R3 Po=(*mpc.T3)(PHat),Pho=PHat; int ito=it; #endif int itt = Th3.ElementAdj(it,j,PHat); if(ddd && itt>=0) cout << " -> " << itt << " " << j << " : Pn " << Th3[itt](PHat) << " PHn " << PHat << " , " << ddt << endl; if(itt<0) break; it=itt; mpc.change(PHat,Th3[it],0); #ifdef DEBUG if(((Po-mpc.P).norme2() > 1e-10)) { cout << ito << " " << &Th3[ito][0] << " " << &Th3[ito][1] << " " << &Th3[ito][2] << " " << &Th3[ito][3] << " " << endl; cout << it << " " << &Th3[it][0] << " " << &Th3[it][1] << " " << &Th3[it][2] << " " << &Th3[it][3] << endl; cout << Pho << "o Hat " << PHat << endl; cout << Po << " o != " << mpc.P << " diff= "<< (Po-mpc.P).norme2() < class Op3_pfe2K : public ternary_function *,int>,R,R,K> { public: class Op : public E_F0mps { public: Expression a,b,c; Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc) {/*cout << "Op3_pfe2K" << endl;*/} AnyType operator()(Stack s) const { R xx(GetAny((*b)(s))); R yy(GetAny((*c)(s))); MeshPoint & mp = *MeshPointStack(s),mps=mp; mp.set(xx,yy,0.0); AnyType ret = pfer2R(s,(*a)(s)); mp=mps; return ret; } }; }; //Add FH 16032005 class Op3_Mesh2mp : public ternary_function { public: class Op : public E_F0mps { public: Expression a,b,c; Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc) {} AnyType operator()(Stack s) const { R xx(GetAny((*b)(s))); R yy(GetAny((*c)(s))); pmesh *ppTh(GetAny((*a)(s))); if( !ppTh || !*ppTh) ExecError("Op3_Mesh2mp unset mesh ??"); pmesh pTh(*ppTh); MeshPoint * mp = new MeshPoint(); mp->set(xx,yy,0.0); R2 PHat; bool outside; const Triangle * K=pTh->Find(mp->P.p2(),PHat,outside); mp->set(*pTh,(R2) mp->P.p2(),PHat,*K,0,outside); return mp;} }; }; template class JumpOp : public E_F0mps { public: typedef RR R; typedef AA A; typedef RR result_type; typedef AA argument_type; Expression a; public: AnyType operator()(Stack stack) const { // a faire A rd,rg; MeshPoint *mp=MeshPointStack(stack),smp=*mp; rg = GetAny((*a)(stack)); rd = 0. ;// to be compatible with varf def... FH april 2014 ... v 3.31. if ( mp->SetAdj() ) rd = GetAny((*a)(stack)); *mp=smp; return SetAny(rd-rg);// external - internal } JumpOp(Expression aa) : a(aa) {} }; template class MeanOp : public E_F0mps { public: typedef RR R; typedef AA A; typedef RR result_type; typedef AA argument_type; Expression a; public: AnyType operator()(Stack stack) const { // a faire A rd,rg; MeshPoint *mp=MeshPointStack(stack),smp=*mp; rg = GetAny((*a)(stack)); rd = rg; if ( mp->SetAdj() ) rd = GetAny((*a)(stack)); *mp=smp; return SetAny((rg+rd)*0.5); } MeanOp(Expression aa) : a(aa) {} }; long get_size(pferarray const & a) { return a.first->N; } long get_size(pfecarray const & a) { return a.first->N; } long get_size(pferbasearray *const & a) { return (**a).N; } long get_size(pfecbasearray *const & a) { return (**a).N; } long get_size(pf3rarray const & a) { return a.first->N; } long get_size(pf3rbasearray *const & a) { return (**a).N; } long resize(pferbasearray *const & a, long const & n) { (**a).resize(n); return n; } long resize(pfecbasearray *const & a, long const & n) { (**a).resize(n); return n; } pferbase* get_element(pferbasearray *const & a, long const & n) { return (**a)[n]; } pfer get_element(pferarray const & a, long const & n) { return pfer( *(*a.first)[n],a.second); } // complex case pfecbase* get_element(pfecbasearray *const & a, long const & n) { return (**a)[n]; } pfec get_element(pfecarray const & a, long const & n) { return pfec( *(*a.first)[n],a.second); } // end complex case lgElement get_element(pmesh const & a, long const & n) { return lgElement(a,n); } lgElement get_element(pmesh *const & a, long const & n) { return lgElement(*a,n); } lgBoundaryEdge get_belement(lgBoundaryEdge::BE const & a, long const & n) { return lgBoundaryEdge(a,n); } lgElement get_adj(lgElement::Adj const & a, long * const & n) { return a.adj(*n); } lgVertex get_vertex(pmesh const & a, long const & n) { return lgVertex(a,n); } lgVertex get_vertex(pmesh *const & a, long const & n) { return lgVertex(*a,n); } lgVertex get_element(lgElement const & a, long const & n) { return a[n]; } lgVertex get_belement(lgBoundaryEdge const & a, long const & n) { return a[n]; } R getx(lgVertex const & a) { return a.x(); } R gety(lgVertex const & a) { return a.y(); } long getlab(lgVertex const & a) { return a.lab(); } long getlab(lgElement const & a) { return a.lab(); } long getlab(lgBoundaryEdge const & a) { return a.lab(); } double getarea(lgElement const & a) { return a.area(); } double getlength(lgBoundaryEdge const & a) { return a.length(); } lgElement getElement(lgBoundaryEdge const & a) { return a.Element(); } long EdgeElement(lgBoundaryEdge const & a) { return a.EdgeElement(); } /* pmesh* get_element(pmesharray *const & a, long const & n) { assert(n>=0 && n <=a->second); return a->first +n; } */ template inline AnyType DestroyKN(Stack,const AnyType &x){ KN * a=GetAny*>(x); for (int i=0;iN(); i++) (*a)[i]->destroy(); a->destroy(); return Nothing; } template RR * get_elementp_(const A & a,const B & b){ if( b<0 || a->N() <= b) { cerr << " Out of bound 0 <=" << b << " < " << a->N() << " array type = " << typeid(A).name() << endl; ExecError("Out of bound in operator []");} return &((*a)[b]);} template R * set_initinit( R* const & a,const long & n){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << n << endl); a->init(n); for (int i=0;i inline AnyType DestroyKNmat(Stack,const AnyType &x){ KN * a=GetAny*>(x); for (int i=0;iN(); i++) (*a)[i].destroy(); a->destroy(); return Nothing; } template R * set_initmat( R* const & a,const long & n){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << n << endl); a->init(n); for (int i=0;i *>(0,::DestroyKN ); atype* >()->Add("[","",new OneOperator2_*,long >(get_elementp_*,long>)); TheOperators->Add("<-", new OneOperator2_ *,KN *,long>(&set_initinit)); map_type_of_map[make_pair(atype(),atype())]=atype*>(); // vector // resize mars 2006 v2.4-1 Dcl_Type< Resize > > (); Add*>("resize",".",new OneOperator1< Resize >,KN*>(to_Resize)); Add > >("(","",new OneOperator2_ *,Resize > , long >(resizeandclean1)); } template RR get_elementp(const A & a,const B & b){ if( b<0 || a->N() <= b) { cerr << " Out of bound 0 <=" << b << " < " << a->N() << " array type = " << typeid(A).name() << endl; ExecError("Out of bound in operator []");} return ((*a)[b]);} template T *resizeandclean2(const Resize & t,const long &n) { // resizeandclean1 int nn= t.v->N(); // old size for (int i=n;iresize(n); for (int i=nn;i AnyType ClearReturn(Stack stack, const AnyType & a) { // a ne faire que pour les variables local au return... // pour l'instant on copie pour fqire mqrche // a repense FH mqi 20014.... PMat * m = GetAny(a); // KN *cm=new KN(true, *m); bug quant KN est une variable global // KN *cm=new KN( *m); // on duplique le tableau comme en C++ (dur dur ?????? FH) m->increment(); Add2StackOfPtr2FreeRC(stack,m); return m; } template void DclTypeMatrix() { Dcl_Type* >(InitP >,Destroy >, ClearReturn >); Dcl_Type >(); // matrice^t (A') Dcl_Type >(); // matrice^-1 A^{-1} Dcl_Type::plusAx >(); // A*x (A'*x) Dcl_Type::plusAtx >(); // A^t*x (A'*x) Dcl_Type::solveAxeqb >(); // A^t*x (A'*x) Dcl_Type >(); Dcl_Type *,bool> >*>(); // resize mars 2006 v2.4-1 // array of matrix matrix[int] A(n); typedef Matrice_Creuse Mat; typedef Mat * PMat; typedef KN AMat; Dcl_Type(0,::DestroyKNmat ); // init array TheOperators->Add("<-", new OneOperator2_(&set_initmat)); // A[i] atype()->Add("[","",new OneOperator2_(get_elementp_)); // resize Dcl_Type< Resize > (); Add("resize",".",new OneOperator1< Resize,AMat*>(to_Resize)); Add >("(","",new OneOperator2_ , long >(resizeandclean2)); // to declare matrix[int] map_type_of_map[make_pair(atype(),atype())]=atype(); } template AnyType First(Stack,const AnyType &b) { return SetAny(GetAny(b).first);} template AnyType AddIncrement(Stack stack, const AnyType & a) { K m = GetAny(a); m->increment(); Add2StackOfPtr2FreeRC(stack,m); if(verbosity>1) cout << "AddIncrement:: increment + Add2StackOfPtr2FreeRC " << endl; return a; } /* class EConstantTypeOfFE3 :public E_F0 { public: // using namespace Fem2D; typedef Fem2D::TypeOfFE3 * T; T v; public: AnyType operator()(Stack ) const { ;return SetAny(v);} EConstantTypeOfFE3( T o):v(o) {} size_t nbitem() const { assert(v); cout << " nb item = " << v->N << endl; return v->N ;} operator aType () const { return atype();} }; */ Type_Expr CConstantTFE3(const EConstantTypeOfFE3::T & v) { throwassert(map_type[typeid( EConstantTypeOfFE3::T).name()]); return make_pair(map_type[typeid( EConstantTypeOfFE3::T).name()],new EConstantTypeOfFE3(v)); } // end --- call meth be .. // 2013 resize of array of fe function.. template T fepresize(const Resize1 & rt,const long &n) { (**(rt.v)).resize(n); return rt.v;} template T feresize(const Resize1 & rt,const long &n) { rt.v.first->resize(n); return rt.v;} double get_R3(R3 *p,long i){return (*p)[i];} R3 * set_eqp(R3 *a,R3 *b) { *a=*b; return a;} void init_lgfem() { // ThePlotStream = new ofstream("ttttt.plot"); if(verbosity&& (mpirank==0)) cout <<"lg_fem "; #ifdef HAVE_CADNA cout << "cadna "; cadna_init(-1); // pas de fichier #endif //Dcl_Type(); // to store compilation expression Dcl_Type(); Dcl_Type(::Initialize); Dcl_Type(::Initialize); map_type[typeid(R3*).name()] = new ForEachType(Initialize); Dcl_TypeandPtr(0,0, ::InitializePtr,::DestroyPtr,AddIncrement,NotReturnOfthisType); Dcl_TypeandPtr(0,0,::InitializePtr,::DestroyPtr,AddIncrement,NotReturnOfthisType); Dcl_Type(); Dcl_Type( ); Dcl_Type( ); Dcl_Type( ); Dcl_Type( ); atype()->AddCast( new E_F1_funcT(Cast), new E_F1_funcT(Cast), new E_F1_funcT(Cast) ); Dcl_Type(); Dcl_Type(); // 3d map_type[typeid(TypeOfFE3*).name()]->AddCast( new E_F1_funcT(TypeOfFE3to2) ); Dcl_Type(); DclTypeMatrix(); DclTypeMatrix(); // Dcl_Type >(); // A^(-1) x Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_Type< pfer >(); Dcl_Type< pferarray >(); Dcl_Type< pferarray >(); // pour des Func FE complex // FH v 1.43 Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_Type< pfec >(); Dcl_Type< pfecarray >(); // FH v 1.43 // add mai 2009 FH for 3d eigen value. Dcl_Type *>(); Dcl_Type *>(); // Dcl_Type< pmesharray *>(); // il faut le 2 pour pourvoir initialiser map_type[typeid(pfes).name()] = new ForEachType(); map_type[typeid(pfes*).name()] = new ForEachTypePtrfspace(); Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_Type< pf3r >(); Dcl_Type< pf3rarray >(); // pour des Func FE complex // FH v 1.43 Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_TypeandPtr(); // il faut le 2 pour pourvoir initialiser Dcl_Type< pf3c >(); Dcl_Type< pf3carray >(); // cast of eigen value mai 2009 ... map_type[typeid(FEbaseArrayKn *).name()]->AddCast( new E_F1_funcT *,pferbasearray>(Cast *,pferbasearray> ), new E_F1_funcT *,pferarray>(First *,pferarray> ), new E_F1_funcT *,pf3rbasearray>(Cast *,pf3rbasearray> ), new E_F1_funcT *,pf3rarray>(First *,pf3rarray> ) ); map_type[typeid(FEbaseArrayKn *).name()]->AddCast( new E_F1_funcT *,pfecbasearray>(Cast *,pfecbasearray> ), new E_F1_funcT *,pfecarray>(First *,pfecarray> ), new E_F1_funcT *,pf3cbasearray>(Cast *,pf3cbasearray> ), new E_F1_funcT *,pf3carray>(First *,pf3carray> ) ); map_type[typeid(pfes3).name()] = new ForEachType(); // 3d map_type[typeid(pfes3*).name()] = new ForEachTypePtrfspace(); // 3d // Dcl_Type(); Dcl_Type(); Dcl_Type *>(); Global.New("qf1pT",CConstant(&QuadratureFormular_T_1)); Global.New("qf1pTlump",CConstant(&QuadratureFormular_T_1lump)); Global.New("qf2pT",CConstant(&QuadratureFormular_T_2)); Global.New("qf2pT4P1",CConstant(&QuadratureFormular_T_2_4P1)); Global.New("qf5pT",CConstant(&QuadratureFormular_T_5)); Global.New("qf7pT",CConstant(&QuadratureFormular_T_7)); Global.New("qf9pT",CConstant(&QuadratureFormular_T_9)); Global.New("qf1pE",CConstant(&QF_GaussLegendre1)); Global.New("qf2pE",CConstant(&QF_GaussLegendre2)); Global.New("qf3pE",CConstant(&QF_GaussLegendre3)); Global.New("qf4pE",CConstant(&QF_GaussLegendre4)); Global.New("qf5pE",CConstant(&QF_GaussLegendre5)); Global.New("qf1pElump",CConstant(&QF_LumpP1_1D)); Global.New("qfV1",CConstant *>(&QuadratureFormular_Tet_1)); Global.New("qfV2",CConstant *>(&QuadratureFormular_Tet_2)); Global.New("qfV5",CConstant *>(&QuadratureFormular_Tet_5)); Global.New("qfV1lump",CConstant *>(&QuadratureFormular_Tet_1lump)); // juste du code genere Global.New("wait",CConstant(&TheWait)); Global.New("NoUseOfWait",CConstant(&NoWait)); Global.New("NoGraphicWindow",CConstant(&NoGraphicWindow)); Dcl_Type(); Dcl_Type(); Dcl_Type(); Dcl_Type(); Dcl_Type(); Dcl_Type(); // a set of boundary condition Dcl_Type *>(); // to set Vector Dcl_Type *>(); // to set Matrix Dcl_Type *>(); // to set Vector 3d Dcl_Type *>(); // to set Matrix 3d Dcl_Type::type>(); // to make interpolation x=f o X^1 ; map_type[typeid(const FormBilinear*).name()] = new TypeFormBilinear; map_type[typeid(const FormLinear*).name()] = new TypeFormLinear; aType t_C_args = map_type[typeid(const C_args*).name()] = new TypeFormOperator; map_type[typeid(const Problem*).name()] = new TypeSolve; map_type[typeid(const Solve*).name()] = new TypeSolve; Dcl_Type*>(); Dcl_Type >*>(); basicForEachType * t_solve=atype(); basicForEachType * t_problem=atype(); basicForEachType * t_fbilin=atype(); basicForEachType * t_flin=atype(); basicForEachType * t_BC=atype(); /// Doxygen doc basicForEachType * t_form=atype(); Dcl_Type(); atype()->AddCast( new E_F1_funcT(UnRef)); // in mesh3 atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); Add("[]",".",new OneOperator1 *,pfer>(pfer2vect)); Add("[]",".",new OneOperator1 *,pfec>(pfer2vect)); Add("(","",new OneTernaryOperator,Op3_pfe2K::Op> ); Add("(","",new OneTernaryOperator,Op3_pfe2K::Op> ); Add("(","",new OneTernaryOperator,Op3_K2R::Op> ); // Add("(","",new OneTernaryOperator,Op3_K2R::Op> ); // FH stupide Add("(","",new OneTernaryOperator,Op3_K2R::Op> ); Add("(","",new OneTernaryOperator ); Add("nuTriangle",".",new OneOperator1(mp_nuTriangle)); Add("region",".",new OneOperator1(mp_region)); Add("n",".",new OneOperator1(pfer_nbdf)); Add("n",".",new OneOperator1(pfer_nbdf)); Add("area",".",new OneOperator1(pmesh_area)); Add("mesure",".",new OneOperator1(pmesh_area)); Add("nt",".",new OneOperator1(pmesh_nt)); Add("nbe",".",new OneOperator1(pmesh_nbe)); Add("nv",".",new OneOperator1(pmesh_nv)); Add("ndof",".",new OneOperator1(pVh_ndof)); Add("nt",".",new OneOperator1(pVh_nt)); Add("ndofK",".",new OneOperator1(pVh_ndofK)); Add("(","", new OneTernaryOperator ); /* FH: ne peux pas marcher, il faut passer aussi le nouveau Vh Add("(","", new OneBinaryOperator_st ); */ //new OneOperator3(pVh_ndf)); atype * >()->AddCast(new OneOperatorCode >); atype * >()->AddCast(new OneOperatorCode >); /* TheOperators->Add("*", new OneBinaryOperator::plusAx,Matrice_Creuse*,KN* > >, new OneBinaryOperator::plusAtx,Matrice_Creuse_Transpose,KN* > >, new OneBinaryOperator::solveAxeqb,Matrice_Creuse_inv,KN* > > ); TheOperators->Add("^", new OneBinaryOperatorA_inv()); */ // Add all Finite Element "P0","P1","P2","RT0", ... for (ListOfTFE * i=ListOfTFE::all;i;i=i->next) { ffassert(i->tfe); // check AddNewFE(i->name,i->tfe); // Global.New(i->name, Type_Expr(atype(),new EConstantTypeOfFE(i->tfe))); } // Global.New("P1",CConstant(&P1Lagrange)) // Global.New("P2",CConstant(&P2Lagrange)); kTypeSolveMat=0; Global.New("LU",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::LU))); Global.New("CG",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::GC))); Global.New("Crout",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::CROUT))); Global.New("Cholesky",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::CHOLESKY))); Global.New("GMRES",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::GMRES))); Global.New("UMFPACK",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::SparseSolver))); Global.New("sparsesolver",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::SparseSolver))); Global.New("sparsesolverSym",CConstant(dTypeSolveMat[kTypeSolveMat++]=new TypeSolveMat(TypeSolveMat::SparseSolverSym))); ffassert(kTypeSolveMatAddCast(new E_F1_funcT(Long2TypeSolveMat) ); map_type[typeid(long).name()]->AddCast( new E_F1_funcT(TypeSolveMat2Long) ); // init pmesh /* Add("<-","(", new OneOperator1_(ReadMesh), new OneOperator3_ >(& FindTxy ) ); Add("<-","(", new OneOperator1_(ReadMesh3) ); */ /*TheOperators->Add("<-",); );*/ //old -- // init FESpace TheOperators->Add("<-", new OneOperator2_(& MakePtr2 ), // new OneOperator2_(& MakePtr3 ), // new OneOperator3_(& MakePtr2 ), // new OneOperator3_(& MakePtr2 ), new OneOperatorCode, new OneOperatorCode, new OpMake_pfes, new OpMake_pfes ); TheOperators->Add("=",new OneOperator2(&set_eqp)); Add("P",".", new OneOperator_Ptr_o_R( & MeshPoint::P)); Add("N",".", new OneOperator_Ptr_o_R( & MeshPoint::N)); Add("x",".", new OneOperator_Ptr_o_R( & R3::x)); Add("y",".", new OneOperator_Ptr_o_R( & R3::y)); Add("z",".", new OneOperator_Ptr_o_R( & R3::z)); Add("x",".", new OneOperator_Ptr_o_R( & R2::x)); Add("y",".", new OneOperator_Ptr_o_R( & R2::y)); Add("[","",new OneOperator2(get_R3)); Add("[","",new OneOperator2_(get_element)); Add("be",".",new OneOperator1_(Build)); Add("adj",".",new OneOperator1_(Build)); Add("(","",new OneOperator2_(get_belement)); Add("(","",new OneOperator2_(get_adj)); TheOperators->Add("==", new OneBinaryOperator >); TheOperators->Add("!=", new OneBinaryOperator >); TheOperators->Add("<", new OneBinaryOperator >); TheOperators->Add("<=", new OneBinaryOperator >); Add("[","",new OneOperator2_(get_element)); Add("(","",new OneOperator2_(get_vertex)); Add("(","",new OneOperator2_(get_vertex)); Add("[","",new OneOperator2_(get_element)); Add("[","",new OneOperator2_(get_belement)); Add("x",".",new OneOperator1_(getx)); Add("y",".",new OneOperator1_(gety)); Add("label",".",new OneOperator1_(getlab)); Add("label",".",new OneOperator1_(getlab)); Add("region",".",new OneOperator1_(getlab)); Add("area",".",new OneOperator1_(getarea)); Add("mesure",".",new OneOperator1_(getarea)); Add("length",".",new OneOperator1_(getlength)); Add("label",".",new OneOperator1_(getlab)); Add("Element",".",new OneOperator1_(getElement)); Add("whoinElement",".",new OneOperator1_(EdgeElement)); // New FF language types. zzzfff is defined at [[file:lex.hpp::zzzfff]] as a pointer to an object of class mylex // [[file:lex.hpp::class mylex]]. zzzfff->Add() is at [[file:lex.cpp::void mylex Add Key k aType t]]. The lexer will // then be called from the parser via [[file:../lglib/lg.ypp::yylex]] zzzfff->Add("R3",atype()); // <> pmesh is a pointer to Mesh [[file:../femlib/fem.hpp::class Mesh]] defined at // [[file:lgfem.hpp::typedef Mesh pmesh]] zzzfff->Add("mesh",atype()); // pmesh3 is a pointer to Mesh3 defined at [[file:lgfem.hpp::typedef Mesh3 pmesh3]] zzzfff->Add("mesh3",atype()); zzzfff->Add("element",atype()); zzzfff->Add("vertex",atype()); // zzzfff->Add("fespace",atype()); zzzfff->Add("matrix",atype *>()); zzzfff->Add("Cmatrix",atype *>()); // a voir Global.Add("LinearCG","(",new LinearCG()); // old form with rhs (must be zer Global.Add("LinearGMRES","(",new LinearGMRES()); // old form Global.Add("LinearGMRES","(",new LinearGMRES(1)); // old form without rhs Global.Add("AffineGMRES","(",new LinearGMRES(1)); // New better Global.Add("LinearCG","(",new LinearCG(1)); // without right handsize Global.Add("AffineCG","(",new LinearCG(1)); // without right handsize Global.Add("NLCG","(",new LinearCG(-1)); // without right handsize // Global.Add("LinearCG","(",new LinearCG()); // old form with rhs (must be zer // Global.Add("LinearGMRES","(",new LinearGMRES()); // old form with rhs (must be zer // Global.Add("LinearGMRES","(",new LinearGMRES(1)); // old form without rhs // Global.Add("LinearCG","(",new LinearCG(1)); // without right handsize // Global.Add("NLCG","(",new LinearCG(-1)); // without right handsize zzzfff->AddF("varf",t_form); // var. form ~ <> zzzfff->AddF("solve",t_solve); zzzfff->AddF("problem",t_problem); Global.Add("jump","(",new OneOperatorCode >); Global.Add("jump","(",new OneOperatorCode >); Global.Add("average","(",new OneOperatorCode >); Global.Add("average","(",new OneOperatorCode >); Global.Add("mean","(",new OneOperatorCode >); Global.Add("mean","(",new OneOperatorCode >); Global.Add("otherside","(",new OneOperatorCode >); Global.Add("otherside","(",new OneOperatorCode >); Global.Add("conj","(",new OneOperatorCode >); Global.Add("conj","(",new OneOperatorCode >); Global.Add("conj","(",new OneOperatorCode >); TheOperators->Add("\'", new OneOperatorCode >); TheOperators->Add("\'", new OneOperatorCode >); TheOperators->Add("\'", new OneOperatorCode >); Global.Add("dx","(",new OneOperatorCode >); Global.Add("dy","(",new OneOperatorCode >); Global.Add("dx","(",new OneOperatorCode >); Global.Add("dy","(",new OneOperatorCode >); Global.Add("dxx","(",new OneOperatorCode >); Global.Add("dxy","(",new OneOperatorCode >); Global.Add("dyx","(",new OneOperatorCode >); Global.Add("dyy","(",new OneOperatorCode >); Global.Add("dxx","(",new OneOperatorCode >); Global.Add("dyy","(",new OneOperatorCode >); Global.Add("dxy","(",new OneOperatorCode >); Global.Add("dyx","(",new OneOperatorCode >); Global.Add("on","(",new OneOperatorCode ); /// <> uses [[Plot]] and [[file:AFunction.hpp::OneOperatorCode]] and [[file:AFunction.hpp::Global]] Global.Add("plot","(",new OneOperatorCode ); Global.Add("convect","(",new OneOperatorCode ); TheOperators->Add("+", new OneOperatorCode > , new OneOperatorCode > , new OneOperatorCode > , new OneOperatorCode(t_C_args,t_C_args,t_C_args) // , // new OperatorIdentity(), // add FH 13042005 // new OperatorIdentity() // add FH 13042005 + int2d ( ..) ); TheOperators->Add("-", new OneOperatorCode > , new OneOperatorCode > , new OneOperatorCode >, new OneOperatorCode > , new OneOperatorCode > , new OneOperatorCode >, new OneOperatorCode(t_C_args,t_C_args,t_fbilin) , new OneOperatorCode(t_C_args,t_C_args,t_flin) , new OneOperatorCode >, new OneOperatorCode > ); atype()->AddCast( new OneOperatorCode(t_C_args,t_fbilin) , new OneOperatorCode(t_C_args,t_flin) , new OneOperatorCode(t_C_args,t_BC) ); atype()->AddCast( new OneOperatorCode(t_C_args,atype >()) , new OneOperatorCode(t_C_args,atype*>()) , new OneOperatorCode(t_C_args,atype >()) , new OneOperatorCode(t_C_args,atype*>()) , new OneOperatorCode(t_C_args,atype::plusAx >()), new OneOperatorCode(t_C_args,atype::plusAtx >()) ); atype()->AddCast( new OneOperatorCode(t_C_args,atype >()) , new OneOperatorCode(t_C_args,atype*>()) , new OneOperatorCode(t_C_args,atype >()) , new OneOperatorCode(t_C_args,atype*>()) , new OneOperatorCode(t_C_args,atype::plusAx >()), new OneOperatorCode(t_C_args,atype::plusAtx >()) ); TheOperators->Add("*", new OneOperatorCode > , new OneOperatorCode > ); // Warning just double or complex in following operator // ---------------------------------------------------- // in case of ambiguity we take the double version // case long -> double // long -> complex TheOperators->Add("*", new OneOperatorCode, 20> , new OneOperatorCode, 20 > , new OneOperatorCode, 20 > , new OneOperatorCode, 20 > , new OneOperatorCode, 20 > , new OneOperatorCode, 20 > ); TheOperators->Add("*", new OneOperatorCode, 10 > , new OneOperatorCode, 10 > , new OneOperatorCode, 10 > , new OneOperatorCode, 10 > , new OneOperatorCode, 10 > , new OneOperatorCode, 10 > ); TheOperators->Add("/", new OneOperatorCode, 20 > , new OneOperatorCode, 20 > , new OneOperatorCode, 20 > ); TheOperators->Add("/", new OneOperatorCode, 10 > , new OneOperatorCode, 10 > , new OneOperatorCode, 10 > ); // Warning just double or complex in previous operator // ---------------------------------------------------- // TheOperators->Add("=",new OneOperatorCode >); TheOperators->Add("=", new OneOperator2(&set_eqdestroy_incr), //- new OneBinaryOperator ,VirtualMatrice::plusAx > > , //- new OneBinaryOperator ,VirtualMatrice::plusAtx > > , //- new OneBinaryOperator ,VirtualMatrice::solveAxeqb > > , new OneBinaryOperator ,VirtualMatrice::plusAx > > , new OneBinaryOperator ,VirtualMatrice::plusAtx > > , new OneBinaryOperator ,VirtualMatrice::solveAxeqb > > , //- new OpArraytoLinearForm(atype< KN* >(),true,false) , new OpArraytoLinearForm(atype< KN_ >(),false,false) , new OpMatrixtoBilinearForm); TheOperators->Add("=", //- new OpArraytoLinearForm(atype< KN* >(),true,false) ,// 3d new OpArraytoLinearForm(atype< KN_ >(),false,false) ,//3d new OpMatrixtoBilinearForm);//3d TheOperators->Add("<-", new OpArraytoLinearForm(atype< KN* >(),true,true) , new OpArraytoLinearForm(atype< KN* >(),true,true) , new OpArraytoLinearForm(atype< KN* >(),true,true) , //3d new OpArraytoLinearForm(atype< KN* >(),true,true) //3d ); TheOperators->Add("=", new OneBinaryOperator ,VirtualMatrice::plusAx > > , new OneBinaryOperator ,VirtualMatrice::plusAtx > > , new OneBinaryOperator ,VirtualMatrice::solveAxeqb > > , //- new OneBinaryOperator ,VirtualMatrice::plusAx > > , //- new OneBinaryOperator ,VirtualMatrice::plusAtx > > , //- new OneBinaryOperator ,VirtualMatrice::solveAxeqb > > , new OpArraytoLinearForm(atype< KN* >(),true,false) , //- new OpArraytoLinearForm(atype< KN_ >(),false,false) , new OpMatrixtoBilinearForm); TheOperators->Add("=", //- new OpArraytoLinearForm(atype< KN* >(),true,false) , // 3d new OpArraytoLinearForm(atype< KN_ >(),false,false) , //3d new OpMatrixtoBilinearForm);// 3d // add august 2007 TheOperators->Add("<-", new OneBinaryOperator ,VirtualMatrice::plusAx > > , new OneBinaryOperator ,VirtualMatrice::plusAtx > > , new OneBinaryOperator ,VirtualMatrice::solveAxeqb > > , new OneBinaryOperator ,VirtualMatrice::plusAx > > , new OneBinaryOperator ,VirtualMatrice::plusAtx > > , new OneBinaryOperator ,VirtualMatrice::solveAxeqb > > ); TheOperators->Add("+=", //- new OneBinaryOperator ,VirtualMatrice::plusAx > > , //- new OneBinaryOperator ,VirtualMatrice::plusAtx > > , new OneBinaryOperator ,VirtualMatrice::plusAx > > , new OneBinaryOperator ,VirtualMatrice::plusAtx > >, //- new OpArraytoLinearForm(atype< KN* >(),true,false,false) , new OpArraytoLinearForm(atype< KN_ >(),false,false,false) , //- new OpArraytoLinearForm(atype< KN* >(),true,false,false) , // 3d new OpArraytoLinearForm(atype< KN_ >(),false,false,false) // 3d ); TheOperators->Add("+=", //- new OneBinaryOperator ,VirtualMatrice::plusAx > > , //- new OneBinaryOperator ,VirtualMatrice::plusAtx > > , new OneBinaryOperator ,VirtualMatrice::plusAx > > , new OneBinaryOperator ,VirtualMatrice::plusAtx > >, //- new OpArraytoLinearForm(atype< KN* >(),true,false,false) , new OpArraytoLinearForm(atype< KN_ >(),false,false,false) , //- new OpArraytoLinearForm(atype< KN* >(),true,false,false) , new OpArraytoLinearForm(atype< KN_ >(),false,false,false) ); TheOperators->Add("<-",new OpMatrixtoBilinearForm(1) ); TheOperators->Add("<-",new OpMatrixtoBilinearForm(1) ); TheOperators->Add("<-",new OpMatrixtoBilinearForm(1) ); // 3d TheOperators->Add("<-",new OpMatrixtoBilinearForm(1) );// 3d Add("(","",new OpCall_FormLinear ); Add("(","",new OpCall_FormBilinear ); Add("(","",new OpCall_FormLinear2 ); Add("(","",new OpCall_FormLinear2); Add("(","",new OpCall_FormBilinear ); Add("(","",new OpCall_FormLinear ); Add("(","",new OpCall_FormBilinear ); Add("(","",new OpCall_FormLinear2 ); Add("(","",new OpCall_FormLinear2); Add("(","",new OpCall_FormBilinear ); // correction du bug morale // Attention il y a moralement un bug // les initialisation x = y ( passe par l'operateur binaire <- dans TheOperators // les initialisation x(y) ( passe par l'operateur unaire <- de typedebase de x (inutile 2007). // x(y1,..,yn) est un operator n+1 (x,y1,..,yn) // on passe toujours par x(y) maintenant. // ------- TheOperators->Add("<-", new OneOperator2_(MakePtrFE2), new OneOperator3_(MakePtrFE3), new OneOperator2_(MakePtrFE2), new OneOperator3_(MakePtrFE3) //, // new OneOperator2_(MakePtr) ); TheOperators->Add("<-", new OneOperatorMakePtrFE(atype()), // scalar case new OneOperatorMakePtrFE(atype()), // vect case new OneOperatorMakePtrFE(atype()), // scalar complex case new OneOperatorMakePtrFE(atype()) // vect complex case ); // interpolation operator TheOperators->Add("=", new OneOperator2_ >(set_fe) , new OneOperator2_ >(set_fe) ) ; // new OneOperator2_(set_fev)); // Attention il y a moralement un bug // les initialisation x = y ( passe par l'operateur binaire <- dans TheOperators // les initialisation x(y) ( passe par l'operateur unaire <- de typedebase de x // ------- corrige TheOperators->Add("=", new OneOperator2(&set_eqdestroy_incr), new Op_CopyArray() ); TheOperators->Add("<-", new OneOperator2_(&set_copy_incr)); TheOperators->Add("<<", new OneBinaryOperator >, new OneBinaryOperator*> >, new OneBinaryOperator*> > ); TheOperators->Add(">>", new OneBinaryOperator > >, new OneBinaryOperator > > ); Global.Add("int2d","(",new OneOperatorCode); Global.Add("int1d","(",new OneOperatorCode); Global.Add("intalledges","(",new OneOperatorCode); Global.Add("intallVFedges","(",new OneOperatorCode); Global.Add("jump","(",new OneUnaryOperator,JumpOp >); Global.Add("mean","(",new OneUnaryOperator,MeanOp >); Global.Add("average","(",new OneUnaryOperator,MeanOp >); Global.Add("jump","(",new OneUnaryOperator,JumpOp >); Global.Add("mean","(",new OneUnaryOperator,MeanOp >); Global.Add("average","(",new OneUnaryOperator,MeanOp >); Add("(","",new OneOperatorCode ); Add("(","",new OneOperatorCode ); Add("(","",new OneOperatorCode >); Add("(","",new OneOperatorCode > >); map_type[typeid(double).name()]->AddCast( new E_F1_funcT(pfer2R) ); map_type[typeid(Complex).name()]->AddCast( new E_F1_funcT(pfer2R) ); // bof Global.Add("dx","(",new E_F1_funcT(pfer2R)); Global.Add("dy","(",new E_F1_funcT(pfer2R)); Global.Add("dxx","(",new E_F1_funcT(pfer2R)); Global.Add("dyy","(",new E_F1_funcT(pfer2R)); Global.Add("dxy","(",new E_F1_funcT(pfer2R)); Global.Add("dyx","(",new E_F1_funcT(pfer2R)); Global.Add("dx","(",new E_F1_funcT(pfer2R)); Global.Add("dy","(",new E_F1_funcT(pfer2R)); Global.Add("dxx","(",new E_F1_funcT(pfer2R)); Global.Add("dyy","(",new E_F1_funcT(pfer2R)); Global.Add("dxy","(",new E_F1_funcT(pfer2R)); Global.Add("dyx","(",new E_F1_funcT(pfer2R)); // Add("[","",new OneOperator2_FEcomp(get_element)); Add("[","",new OneOperator2_(get_element)); // use FH sep. 2009 Add("[","",new OneOperator2_(get_element)); // use ???? FH sep. 2009 // bof bof .. // resize of array of Finite element .. a little hard 2013 FH Dcl_Type< Resize1 > (); Dcl_Type< Resize1 > (); Dcl_Type< Resize1 > (); Dcl_Type< Resize1 > (); Add("resize",".",new OneOperator1,pfecbasearray*>(to_Resize1)); // FH fev 2013 Add("resize",".",new OneOperator1,pferbasearray*>(to_Resize1)); // FH fev. 2013 Add("resize",".",new OneOperator1,pferarray>(to_Resize1)); // FH fev 2013 Add("resize",".",new OneOperator1,pfecarray>(to_Resize1)); // FH fev. 2013 new OneOperator2_ , long >(fepresize); Add >("(","",new OneOperator2_ , long >(fepresize)); Add >("(","",new OneOperator2_ , long >(fepresize)); Add >("(","",new OneOperator2_ , long >(feresize)); Add >("(","",new OneOperator2_ , long >(feresize)); Dcl_Type< Resize1 > (); Dcl_Type< Resize1 > (); Add("resize",".",new OneOperator1,pf3rbasearray*>(to_Resize1)); // FH fev. 2013 Add("resize",".",new OneOperator1,pf3rarray>(to_Resize1)); // FH fev 2013 new OneOperator2_ , long >(fepresize); Add >("(","",new OneOperator2_ , long >(fepresize)); Add >("(","",new OneOperator2_ , long >(feresize)); // end of resize ... Add("n",".",new OneOperator1_(get_size)); // FH fev 2013 Add("n",".",new OneOperator1_(get_size)); // FH fev. 2013 Add("n",".",new OneOperator1_(get_size)); // FH fev 2013 Add("n",".",new OneOperator1_(get_size)); // FH fev. 2013 Add("n",".",new OneOperator1_(get_size)); // FH fev. 2013 Add("n",".",new OneOperator1_(get_size)); // FH fev 2013 Add("[","",new OneOperator2_FE_get_elmnt());// new version FH sep 2009 Add("[","",new OneOperator2_FE_get_elmnt()); Add("[","",new OneOperator2_FE_get_elmnt());// new version FH sep 2009 // Add("[","",new OneOperator2_(get_element)); // Add("[","",new OneOperator2_(get_element)); // Add("[","",new OneOperator2_(get_element)); TheOperators->Add("\'", new OneOperator1,Matrice_Creuse *>(&Build,Matrice_Creuse *>), new OneOperator1,Matrice_Creuse *>(&Build,Matrice_Creuse *>) ); Add("(","",new interpolate_f_X_1 ); TheOperators->Add("=", new OneOperator2_::type,double,E_F_StackF0F0 >(set_feoX_1) ) ; // init_lgmesh() ; init_lgmat(); init_mesh_array(); l2interpreter = new LinkToInterpreter; using namespace FreeFempp; FreeFempp::TypeVarForm::Global = new TypeVarForm(); FreeFempp::TypeVarForm::Global = new TypeVarForm(); Global.New("P13d",CConstantTFE3(&DataFE::P1)); Global.New("P23d",CConstantTFE3(&DataFE::P2)); Global.New("P03d",CConstantTFE3(&DataFE::P0)); Global.New("RT03d",CConstantTFE3(&RT03d)); Global.New("Edge03d",CConstantTFE3(&Edge03d)); Global.New("P1b3d",CConstantTFE3(&P1bLagrange3d)); /* for (ListOfTFE * i=ListOfTFE::all;i;i=i->next) { ffassert(i->tfe); // check AddNewFE(i->name,i->tfe); // Global.New(i->name, Type_Expr(atype(),new EConstantTypeOfFE(i->tfe))); } */ TEF2dto3d[FindFE2("P1")]=&DataFE::P1; TEF2dto3d[FindFE2("P2")]=&DataFE::P2; TEF2dto3d[FindFE2("P0")]=&DataFE::P0; TEF2dto3d[FindFE2("P1b")]=&P1bLagrange3d; TEF2dto3d[FindFE2("RT0")]=&RT03d; /* // add may 2011 F. HEcHt // in progress ????? to set varaible to store FinitELEMEnt type. zzzfff->Add("FiniteElement",atype()); zzzfff->Add("FiniteElement3",atype()); TheOperators->Add("=",new OneOperator2(&setFE<1>) ); TheOperators->Add("<-",new OneOperator2_(&setFE<0>)); */ } /* in progress ????? to set varaible to store FinitELEMEnt type. template TypeOfFE* setFE(TypeOfFE* a,TypeOfFE* b) { if(init) return a; } */ void clean_lgfem() { for (int i=0;i::Global; delete FreeFempp::TypeVarForm::Global; } template Expression IsFEcomp(const C_F0 &c,int i, Expression & rrr,Expression &iii) { Expression r=0; if(!i) rrr=0,iii=0; // typedef double K; if(atype::Result>() == c.left()) { const E_FEcomp * e= dynamic_cast*>(c.LeftValue() ); if( !e) { const E_FEcomp_get_elmnt_array * ee= dynamic_cast*>(c.LeftValue() ); if( !ee) { cerr <<" Fatal error Copy array .." << *c.left()<< " composante : " << i << endl; ffassert(ee); } else { if (ee->comp ==i) { if (i && ee->a00->a0 != rrr) cerr << " error composante arry vect. incompatible " << ee->comp << " "<< ee->a00->a0 << " != " << rrr << endl; else { r= ee->a0; rrr= ee->a00->a0; iii= ee->a1; } } else cerr << " erreur composante " << ee->comp << " != " << i << endl; } } else { if (e->comp ==i) { if (i && e->a0 != rrr) cerr << " error composante incompatible " << e->comp << endl; else rrr=r=e->a0; } else cerr << " erreur composante " << e->comp << " != " << endl; } } return r; } /* Expression IsCFEcomp(const C_F0 &c,int i) { typedef Complex K; if(atype::Result>() == c.left()) { const E_FEcomp * e= dynamic_cast*>(c.LeftValue() ); ffassert(e); if (e->comp !=i) return 0; else return e->a0; } else return 0; } */ template Expression Op_CopyArrayT(const E_Array & a,const E_Array & b) { typedef FEbaseArray FEba; //int na=a.size(); int nb=b.size(); Expression r=0,rr=0,rrr,iii; // try real voctor value FE interpolation rr=IsFEcomp(a[0],0,rrr,iii) ; if (rr !=0) { for (int i=1;i(a[i],i,rrr,iii)) CompileError("Copy of Array with incompatible K vector value FE function () !");; if(iii) {// ffassert(0); // moralement il : rrr[iii] C_F0 aa(rrr,atype()),ii(iii,atype()); C_F0 aa_ii(aa,"[",ii); rr=aa_ii.LeftValue(); } if(v_fes::d==2) r=new E_set_fev(&b,rr,2); else if(v_fes::d==3) r=new E_set_fev3(&b,rr); } // try complex vector value FE interpolation return r; } E_F0 * Op_CopyArray::code(const basicAC_F0 & args) const { E_F0 * ret=0; const E_Array & a= *dynamic_cast(args[0].LeftValue()); const E_Array & b= *dynamic_cast(args[1].LeftValue()); int na=a.size(); int nb=b.size(); if (na != nb ) CompileError("Copy of Array with incompatible size!"); if(0) { // old code !!!!!!! before removing FH sept. 2009 Expression rr=0,rrr,iii; // try real voctor value FE interpolation rr=IsFEcomp(a[0],0,rrr,iii) ; if (rr !=0) { for (int i=1;i(a[i],i,rrr,iii)) CompileError("Copy of Array with incompatible real vector value FE function () !");; return new E_set_fev(&b,rr,2); } // try complex vector value FE interpolation rr=IsFEcomp(a[0],0,rrr,iii) ; if (rr !=0) { for (int i=1;i(a[i],i,rrr,iii)) CompileError("Copy of Array with incompatible complex vector value FE function () !");; return new E_set_fev(&b,rr,2); } rr=IsFEcomp(a[0],0,rrr,iii) ; if (rr !=0) { for (int i=1;i(a[i],i,rrr,iii)) CompileError("Copy of Array with incompatible real vector value FE function () !");; return new E_set_fev3(&b,rr); } // try complex vector value FE interpolation rr=IsFEcomp(a[0],0,rrr,iii) ; if (rr !=0) { for (int i=1;i(a[i],i,rrr,iii)) CompileError("Copy of Array with incompatible complex vector value FE function () !");; return new E_set_fev3(&b,rr); } } else { Expression r=0; // new code FH sep 2009. if(!r) r=Op_CopyArrayT(a,b); if(!r) r=Op_CopyArrayT(a,b); if(!r) r=Op_CopyArrayT(a,b); if(!r) r=Op_CopyArrayT(a,b); if(r) return r; } CompileError("Internal Error: General Copy of Array : to do "); return ret;} template C_F0 NewFEvariableT(ListOfId * pids,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim) { ffassert(dim==DIM); // if (cplx) // cout << "NewFEvariable cplx=" << cplx << endl; typedef FEbase FE; typedef E_FEcomp FEi; typedef typename FEi::Result FEiR; typedef FEbase CFE; typedef E_FEcomp CFEi; typedef typename CFEi::Result CFEiR; Expression fes =fespacetype; aType dcltype=atype(); aType cf0type=atype(); aType rtype=atype(); if(cplx) { dcltype=atype(); rtype=atype(); } ffassert(pids); ListOfId &ids(*pids); string str("["); const int n=ids.size(); ffassert(n>0); if ( fes->nbitem() != (size_t) n) { cerr << " the array size must be " << fes->nbitem() << " not " << n << endl; CompileError("Invalide array size for vectorial fespace function"); } for (int i=0;i::New(str.size()+1),str.c_str()); C_F0 ret; // modif 100109 (add Block:: before NewVar for g++ 3.3.3 on Suse 9) ret= binit ? currentblock->Block::NewVar(name,dcltype,basicAC_F0_wa(fespacetype,init)) : currentblock->Block::NewVar(name,dcltype,basicAC_F0_wa(fespacetype)); C_F0 base = currentblock->Find(name); if (cplx) for (int i=0;iNewID(cf0type,ids[i].id, C_F0(new CFEi(base,i,n), rtype) ); else for (int i=0;iNewID(cf0type,ids[i].id, C_F0(new FEi(base,i,n), rtype) ); delete pids; // add FH 25032005 return ret ; } C_F0 NewFEvariable(ListOfId * pids,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim) { if(dim==2) return NewFEvariableT(pids,currentblock,fespacetype,init,cplx,dim); else if (dim==3) return NewFEvariableT(pids,currentblock,fespacetype,init,cplx,dim); else CompileError("Invalide fespace on Rd ( d != 2 or 3) "); return C_F0(); } C_F0 NewFEvariable(const char * id,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim) { ListOfId * lid =new ListOfId; lid->push_back(UnId(id)); return NewFEvariable(lid,currentblock,fespacetype,init,cplx,dim); } size_t dimFESpaceImage(const basicAC_F0 &args) { //aType t_m2= atype(); // aType t_m3= atype(); aType t_tfe= atype(); aType t_tfe3= atype(); aType t_a= atype(); size_t dim23=0; for (int i=0;inbitem(); else if (args[i].left() == t_a) { const E_Array & ea= *dynamic_cast(args[i].LeftValue()); ffassert(&ea); for (int i=0;i(); aType t_m3= atype(); aType t_tfe= atype(); aType t_tfe3= atype(); //aType t_a= atype(); size_t d=0; // 20 avril 2009 add brak for (int i=0;i0); if ( fes->nbitem() != (size_t) n) { cerr << " the array size must be " << fes->nbitem() << " not " << n << endl; CompileError("Invalid array size for vectorial fespace function"); } for (int i=0;i::New(str.size()+1),str.c_str()); C_F0 ret= currentblock->Block::NewVar(name,dcltype,basicAC_F0_wa(fespacetype,sizeofarray)); C_F0 base = currentblock->Find(name); if(cplx) for (int i=0;iNewID(cf0type,ids[i].id, C_F0(new CFEi(base,i,n), rtype) ); else for (int i=0;iNewID(cf0type,ids[i].id, C_F0(new FEi(base,i,n), rtype) ); delete pids ; // add FH 25032005 return ret ; } C_F0 NewFEarray(ListOfId * pids,Block *currentblock,C_F0 & fespacetype,CC_F0 sizeofarray,bool cplx,int dim) { if(dim==2) return NewFEarrayT(pids,currentblock,fespacetype,sizeofarray,cplx,dim); else if (dim==3) return NewFEarrayT(pids,currentblock,fespacetype,sizeofarray,cplx,dim); else CompileError("Invalid vectorial fespace on Rd ( d != 2 or 3) "); return C_F0(); } C_F0 NewFEarray(const char * id,Block *currentblock,C_F0 & fespacetype,CC_F0 sizeofarray,bool cplx,int dim) { ListOfId *lid= new ListOfId; lid->push_back(UnId(id)); return NewFEarray(lid,currentblock,fespacetype,sizeofarray,cplx,dim); } namespace Fem2D { void Expandsetoflab(Stack stack,const BC_set & bc,set & setoflab) { for (size_t i=0;i( (*bc.on[i])(stack)); setoflab.insert(lab); if ( verbosity>99) cout << lab << " "; } else { KN labs( GetAny >( (*bc.on[i])(stack))); for (long j=0; j99) cout << labs[j] << " "; } } if(verbosity>99) cout << endl; } void Expandsetoflab(Stack stack,const CDomainOfIntegration & di,set & setoflab,bool &all) { for (size_t i=0;i( (*di.what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; } else { KN labs( GetAny >( (*di.what[i])(stack))); for (long j=0; j3) cout << labs[j] << " "; } all=false; } } } #include "InitFunct.hpp" static addingInitFunct TheaddingInitFunct(-20,init_lgfem); freefem++-3.38-1/src/fflib/lgfem.hpp000644 000767 000024 00000061640 12542543070 017271 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // ATTENTION pfes est la classe qui modelise un pointeur // sur un FESpace (donc un espace d'element fini // mais si la maillage change alors // l'espace change // cf la fonction set qui reconstruit FESpace extern Block *currentblock; void init_lgmat(); // initialisation for sparse mat functionnallity class v_fes; class v_fes3; typedef v_fes *pfes; typedef v_fes3 *pfes3; namespace Fem2D { class Mesh3; } using Fem2D::Mesh; using Fem2D::Mesh3; typedef Mesh * pmesh; typedef Mesh3 * pmesh3; using Fem2D::FESpace; using Fem2D::TypeOfFE; using Fem2D::R; // typedef double R; namespace { using namespace Fem2D; using Fem2D::Vertex; class lgVertex { public: typedef double R; CountPointer pTh; Vertex *v; void Check() const { if (!v || !pTh) { ExecError("Too bad! Unset Vertex!"); } } void init() { v=0;pTh.init();} lgVertex(Mesh * Th,long kk): pTh(Th),v( &(*pTh)(kk)) {} lgVertex(Mesh * Th,Vertex * kk): pTh(Th),v(kk) {} operator int() const { Check(); return (* pTh)(v);} operator R2*(){ Check(); return v;} R x() const {Check() ; return v->x;} R y() const {Check() ; return v->y;} // R z() const {Check() ; return v->z;} long lab() const {Check() ; return v->lab;} void destroy() {pTh.destroy();} }; class lgElement { public: struct Adj {// Mesh *pTh; Triangle *k; Adj(const lgElement & pp) : pTh(pp.pTh),k(pp.k) {} lgElement adj(long & e) const { int ee; ffassert(pTh && k && e >=0 && e < 3 ); long kk=pTh->ElementAdj((*pTh)(k),ee=e); e=ee; return lgElement(pTh,kk);} }; CountPointer pTh; Triangle *k; lgElement(): k(0) {} void Check() const { if (!k || !pTh) { ExecError("Unset Triangle,Sorry!"); } } void init() { k=0;pTh.init();} void destroy() {pTh.destroy();} lgElement(Mesh * Th,long kk): pTh(Th),k( &(*Th)[kk]) {} lgElement(Mesh * Th,Triangle * kk): pTh(Th),k(kk) {} operator int() const { Check(); return (* pTh)(k);} lgVertex operator [](const long & i) const { Check(); return lgVertex(pTh,&(*k)[i]);} long lab() const {Check() ; return k ? k->lab : 0;} double area() const {Check() ; return k->area ;} long n() const { return k ? 3: 0 ;} bool operator==(const lgElement & l) const { return pTh==l.pTh && k == l.k;} bool operator!=(const lgElement & l) const { return pTh!=l.pTh || k != l.k;} bool operator<(const lgElement & l) const { return pTh==l.pTh && k pTh; BoundaryEdge *k; lgBoundaryEdge(): k(0) {} void Check() const { if (!k || !pTh) { ExecError("Unset BoundaryEdge,Sorry!"); } } void init() { k=0;pTh.init();} void destroy() {pTh.destroy();} lgBoundaryEdge(Mesh * Th,long kk): pTh(Th),k( &(*pTh).be(kk)) {} lgBoundaryEdge(Mesh * Th,BoundaryEdge * kk): pTh(Th),k(kk) {} lgBoundaryEdge(const BE & be,long kk): pTh(be.p),k( &(*pTh).be(kk)) {} lgBoundaryEdge(const BE & be,BoundaryEdge * kk): pTh(be.p),k(kk) {} operator int() const { Check(); return (* pTh)(k);} lgVertex operator [](const long & i) const { Check(); return lgVertex(pTh,&(*k)[i]);} long lab() const {Check() ; return k ? k->lab : 0;} double length() const {Check() ; return k->length() ;} long n() const { return k ? 2: 0 ;} lgElement Element() const {Check() ;int ee; return lgElement(pTh,(*pTh).BoundaryElement((*pTh)(k),ee));} long EdgeElement() const {Check() ;int ee; (*pTh).BoundaryElement((*pTh)(k),ee);return ee;} }; } // end namespace blanc void GetPeriodic(const int d,Expression perio, int & nbcperiodic , Expression * &periodic); bool BuildPeriodic( int nbcperiodic, Expression *periodic, const Mesh &Th,Stack stack, int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe); class v_fes : public RefCounter { public: typedef ::pfes pfes; typedef ::FESpace FESpace; static const int d=2; const int N; const pmesh* ppTh; // adr du maillage CountPointer pVh; Stack stack; // the stack is use whith periodique expression int nbcperiodic; Expression *periodic; operator FESpace * () { throwassert(this && d==2); if ( !pVh || *ppTh != &pVh->Th ) pVh=CountPointer(update(),true); return pVh ;} FESpace * update() ; v_fes(int NN,const pmesh* t,Stack s, int n,Expression *p) : N(NN), ppTh(t),pVh(0),stack(s), nbcperiodic(n),periodic(p) {} v_fes(int NN,const v_fes *f,Stack s,int n,Expression *p) : N(NN),ppTh(f->ppTh),pVh(0),stack(s), nbcperiodic(n),periodic(p) {} void destroy(){ ppTh=0;pVh=0; delete this;} virtual ~v_fes() {} bool buildperiodic(Stack stack,int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) ; virtual FESpace * buildupdate(int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) =0; virtual FESpace * buildupdate() =0; }; class v_fes3 : public RefCounter { public: typedef pfes3 pfes; typedef FESpace3 FESpace; static const int d=3; const int N; const pmesh3* ppTh; // adr du maillage CountPointer pVh; Stack stack; // the stack is use whith periodique expression int nbcperiodic; Expression *periodic; operator FESpace3 * () { throwassert(this && d==3); if ( !pVh || *ppTh != &pVh->Th ) pVh=CountPointer(update(),true); return pVh ;} FESpace3 * update() ; v_fes3(int NN,const pmesh3* t,Stack s, int n,Expression *p) : N(NN), ppTh(t),pVh(0),stack(s), nbcperiodic(n),periodic(p) {} v_fes3(int NN,const v_fes3 *f,Stack s,int n,Expression *p) : N(NN),ppTh(f->ppTh),pVh(0),stack(s), nbcperiodic(n),periodic(p) {} void destroy(){ ppTh=0;pVh=0; delete this;} virtual ~v_fes3() {} bool buildperiodic(Stack stack, KN & ndfe) ; virtual FESpace3 * buildupdate( KN & ndfe) { return 0;} virtual FESpace3 * buildupdate() {return 0;}; }; class pfes_tef : public v_fes { public: const TypeOfFE * tef ; pfes_tef(const pmesh* t,const TypeOfFE * tt,Stack s=NullStack, int n=0,Expression *p=0 ) : v_fes(tt->N,t,s,n,p),tef(tt) { operator FESpace * ();} FESpace * buildupdate(int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) { return *ppTh ? new FESpace(**ppTh,*tef,nbdfv,(int *) ndfv,nbdfe,(int*)ndfe): 0;} FESpace * buildupdate() { return *ppTh ? new FESpace(**ppTh,*tef):0 ;} }; class pfes_tefk : public v_fes { public: const TypeOfFE ** tef ; const int k; pfes_tefk(const pmesh* t,const TypeOfFE ** tt,int kk,Stack s=NullStack,int n=0,Expression *p=0 ) : v_fes(sum(tt,&Fem2D::TypeOfFE::N,kk),t,s,n,p),tef(tt),k(kk) { // cout << "pfes_tefk const" << tef << " " << this << endl; operator FESpace * ();} FESpace * buildupdate() { // cout << "pfes_tefk upd:" << tef << " " << this << endl; assert(tef); return *ppTh? new FESpace(**ppTh,tef,k):0;} virtual ~pfes_tefk() { delete [] tef;} FESpace * buildupdate(int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) { assert(tef); return *ppTh? new FESpace(**ppTh,tef,k,nbdfv,ndfv,nbdfe,ndfe):0 ;} }; class pfes3_tef : public v_fes3 { public: const TypeOfFE3 * tef ; pfes3_tef(const pmesh3* t,const TypeOfFE3 * tt,Stack s=NullStack, int n=0,Expression *p=0 ) : v_fes3(tt->N,t,s,n,p),tef(tt) { operator FESpace3 * ();} FESpace3 * buildupdate( KN & ndfe) { return *ppTh ? new FESpace3(**ppTh,*tef,ndfe.size()/2,ndfe):0; } FESpace3 * buildupdate() { return *ppTh? new FESpace3(**ppTh,*tef):0;} }; class pfes3_tefk : public v_fes3 { public: const TypeOfFE3 ** tef ; const int k; KN< GTypeOfFE const *> atef; GTypeOfFESum tefs; static int sum(const Fem2D::TypeOfFE3 ** l,int const Fem2D::TypeOfFE3::*p,int n) { int r=0; for (int i=0;i*p; return r; } pfes3_tefk(const pmesh3* t,const Fem2D::TypeOfFE3 ** tt,int kk,Stack s=NullStack,int n=0,Expression *p=0 ) : v_fes3(sum((const Fem2D::TypeOfFE3 **)tt,&Fem2D::TypeOfFE3::N,kk),t,s,n,p), tef(tt),k(kk), atef(kk,tt),tefs(atef) { // cout << "pfes_tefk const" << tef << " " << this << endl; operator FESpace3 * (); } FESpace3 * buildupdate() { // cout << "pfes_tefk upd:" << tef << " " << this << endl; //assert(tef); return *ppTh? new FESpace3(**ppTh,tefs):0;} virtual ~pfes3_tefk() { delete [] tef;} FESpace3 * buildupdate(KN & ndfe) { return *ppTh? new FESpace3(**ppTh,tefs,ndfe.size()/2,ndfe):0; } }; class pfes_fes : public v_fes { public: pfes * Vh; int n; pfes_fes( pfes * Vhh, int nn,Stack s=NullStack,int n=0,Expression *p=0) :v_fes((**Vhh).N*nn,static_cast(*Vhh),s,n,p), Vh(Vhh),n(nn) { operator FESpace * () ;}; FESpace * buildupdate() { return new FESpace(*(FESpace *)**Vh,n); } FESpace * buildupdate(int & nbdfv, KN & ndfv,int & nbdfe, KN & ndfe) { InternalError(" No way to define a periodic BC in this case: tensorisation of FEspace "); // return new FESpace(***Vh,n,nbdfv,ndfv,nbdfe,ndfe); } }; template class FEbase; template class FEcomp { public: typedef typename v_fes::pfes pfes; typedef typename v_fes::FESpace FESpace; friend class FEbase; FEbase * base; int comp; FEcomp(FEbase * b,int c) :base(b),comp(c) {}; private: // rule of programming FEcomp(const FEcomp &); void operator= (const FEcomp &); }; template class FEbase { public: typedef typename v_fes::pfes pfes; typedef typename v_fes::FESpace FESpace; v_fes *const*pVh; // pointeur sur la variable stockant FESpace; KN * xx; // value CountPointer Vh; // espace courant KN *x() {return xx;} FEbase(const pfes *ppVh) :pVh(ppVh), xx(0),Vh(0) {} ~FEbase() { delete xx;} void destroy() { // cout << "~FEbase destroy " << this << endl; delete this;} void operator=( KN *y) { Vh=**pVh; throwassert((bool) Vh); if (xx) delete xx;xx=y; ffassert( y->N() == Vh->NbOfDF); } void operator=(KN_ & y) { Vh=**pVh; throwassert((bool) Vh); if (xx) { // resize if need if(xx->N() != Vh->NbOfDF) delete xx;xx=0; } if(!xx) xx= new KN(Vh->NbOfDF) ; ffassert(SameShape(y,*xx)); *xx=y; } FESpace * newVh() { throwassert(pVh ); const pfes pp= *pVh; // cout << pVh << " " << *pVh << endl; return *pp; } operator FESpace &() { throwassert(Vh); return *Vh;} private: // rule of programming FEbase(const FEbase &); void operator= (const FEbase &); }; template class FEbaseArrayKn { public:// for eigen value int N; FEbaseArrayKn(int NN):N(NN){} virtual void set(int i,KN_ ) =0; virtual KN* get (int i) const = 0; // for P. Jolivet virtual void resize(int i) = 0; // for P. Jolivet }; template class FEbaseArray :public FEbaseArrayKn { public: typedef typename v_fes::pfes pfes; typedef typename v_fes::FESpace FESpace; // int N; FEbase **xx; FEbaseArray(const pfes *ppVh,int NN) :FEbaseArrayKn(NN),xx(new FEbase * [std::max(NN, 1)]) { for (int i=0;iN, 1);i++) xx[i]=new FEbase(ppVh); } ~FEbaseArray() { // cout << " ~FEbaseArray " << endl; for (int i=0;iN, 1);i++) xx[i]->destroy(); delete [] xx;} void destroy() { //cout << " destroy ~FEbaseArray " << endl; delete this;} FEbase** operator[](int i) const { if(xx==0 || i <0 || i>=this->N) ExecError("Out of bound in FEbaseArray"); return xx+i;} void resize(int i) { if(xx != 0 && i > 0 && i != this->N) { FEbase** yy = new FEbase*[i]; if(i > this->N) { for(unsigned int j = 0; j < std::max(this->N, 1); ++j) yy[j] = xx[j]; for(unsigned int j = std::max(this->N, 1); j < i; ++j) yy[j] = new FEbase(xx[0]->pVh); } else { for(unsigned int j = 0; j < i; ++j) yy[j] = xx[j]; for(unsigned int j = i; j < this->N; ++j) xx[j]->destroy(); } FEbase **oldXx = this->xx; this->xx = yy; delete [] oldXx; this->N = i; } } void set(int i,KN_ v){ **(operator[](i))=v;} KN* get(int i)const { return (**(operator[](i))).xx; } private: // rule of programming FEbaseArray(const FEbaseArray &); void operator= (const FEbaseArray &); }; void GetPeriodic(const int d,Expression perio, int & nbcperiodic , Expression * &periodic); int GetPeriodic(Expression bb, Expression & b,Expression & f); int GetPeriodic(Expression bb, Expression & b,Expression & f1,Expression & f2); C_F0 NewFEarray(const char * id,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim); C_F0 NewFEarray(ListOfId * ids,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim); C_F0 NewFEvariable(const char * id,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim); C_F0 NewFEvariable(ListOfId * ids,Block *currentblock,C_F0 & fespacetype,CC_F0 init,bool cplx,int dim); inline C_F0 NewFEvariable(const char * id,Block *currentblock,C_F0 & fespacetype,bool cplx,int dim) { CC_F0 init;init=0;return NewFEvariable( id,currentblock,fespacetype, init, cplx,dim);} inline C_F0 NewFEvariable(ListOfId * ids,Block *currentblock,C_F0 & fespacetype,bool cplx,int dim) { CC_F0 init;init=0;return NewFEvariable( ids,currentblock,fespacetype, init,cplx,dim);} size_t dimFESpaceImage(const basicAC_F0 &args) ; aType typeFESpace(const basicAC_F0 &args) ; template > class E_FEcomp : public E_F0mps { public: // typedef FEbase FE; typedef vv_fes v_fes; typedef pair< FE * ,int> Result; Expression a0; const int comp, N; AnyType operator()(Stack s) const { return SetAny( Result( *GetAny((*a0)(s)),comp) );} E_FEcomp(const C_F0 & x,const int cc,int NN) : a0(x.LeftValue()),comp(cc),N(NN) {if(x.left()!=atype() ) cout << "E_FEcomp: Bug " << *x.left() << " != " << *atype() << " case " <() &&a0);} operator aType () const { return atype();} }; //typedef double R; typedef pair< FEbase * ,int> aFEvarR; typedef pair< FEbaseArray * ,int> aFEArrayR; typedef pair< FEbase * ,int> aFEvarC; template class interpolate_f_X_1 : public OneOperator { public: // to interpolate f o X^{-1} typedef FEbase * pferbase ; typedef FEbaseArray * pferbasearray ; typedef pair pfer ; typedef pair pferarray ; class type {}; class CODE : public E_F0mps { public: Expression f; Expression x,y; CODE(const basicAC_F0 & args) : f(args[0].LeftValue()) { const E_Array * X(dynamic_cast(args[1].LeftValue())); if ( ! X || X->size() != 2) { CompileError("array of 2 double x,y f([xx,yy]) = ... "); } x=to((*X)[0]); y=to((*X)[1]); assert(f && x && y ); } AnyType operator()(Stack) const { ExecError("No evaluation"); return Nothing;} operator aType () const { return atype();} }; // end class CODE E_F0 * code(const basicAC_F0 & args) const { return new CODE(args);} interpolate_f_X_1(): OneOperator(map_type[typeid(type).name()],map_type[typeid(pfer).name()],map_type[typeid(E_Array).name()]) {} }; inline FESpace * v_fes::update() { assert(d==2); if(!*ppTh) return 0; if (nbcperiodic ) { assert(periodic); const Mesh &Th(**ppTh); KN ndfv(Th.nv); KN ndfe(Th.neb); int nbdfv,nbdfe; buildperiodic(stack,nbdfv,ndfv,nbdfe,ndfe); return buildupdate(nbdfv,ndfv,nbdfe,ndfe); } else return buildupdate(); } inline FESpace3 * v_fes3::update() { assert(d==3); if(!*ppTh) return 0; if (nbcperiodic ) { assert(periodic); //const Mesh3 &Th(**ppTh); // KN ndfv(Th.nv); KN ndfe; // int nbdfv,nbdfe; buildperiodic(stack,ndfe); return buildupdate(ndfe); } else return buildupdate(); } template A Build(B b) { return A(b);} class TabFuncArg { public: typedef double R; typedef Fem2D::R2 R2; Stack s; int nb; Expression * e; void eval(R *v) const { for (int i=0;i( (*e[i])(s)); // cout <<" (" << i << " " << *v << ") "; } else v[i] = 0; } R2 eval_X() const { return R2(GetAny( (*e[nb-2])(s)),GetAny( (*e[nb-1])(s))); } void eval_2(R *v) const { for (int i=0;i( (*e[i])(s)); else v[i] = 0; } TabFuncArg(Stack ss,int n) : s(ss),nb(n),e(new Expression[n]) {} void operator=(int j) { ffassert(j==0); for (int i=0;i class E_F_StackF0F0opt2 :public E_F0mps { public: typedef AnyType (*func)(Stack,Expression ,Expression ) ; func f; Expression a0,a1; E_F_StackF0F0opt2(func ff,Expression aa0,Expression aa1) : f(ff),a0(aa0),a1(aa1) { const E_FEcomp * e= dynamic_cast*>(a0); if ( e && e->N != 1) { cerr << " err interpolation of no scalar FE function componant ("<< e->comp<< " in 0.." << e->N<< ") << with scalar function \n" ; CompileError("interpolation of no scalar FE function componant with scalar function "); } /* // inutil car a0 est un composante d'un vecteur ???? // pour l'instant on a juste une erreur a l'execution // et non a la compilation. if (a0->nbitem() != a1->nbitem() ) { // bofbof cerr << " err interpolation of no scalar FE function ("<< a0->nbitem() << " != " << a1->nbitem() << ") << with scalar function \n" ; CompileError("interpolation of no scalar FE function with scalar function "); } */ deque > ll; MapOfE_F0 m; size_t top = currentblock->OffSet(0), topbb=top; // FH. bofbof ??? int ret =aa1->Optimize(ll, m, top); a1 = new E_F0_Optimize(ll,m,ret); currentblock->OffSet(top-topbb); } AnyType operator()(Stack s) const {return (*f)(s, a0 , a1) ;} }; template inline ostream & ShowBound(const KN & y,ostream & f) { f << " -- vector function's bound " << y.min() << " " << y.max() ; return f; } template<> inline ostream & ShowBound(const KN & y,ostream & f) { f << " -- vector function's bound : (no complex Value) " ; return f; } template class Op3_K2R : public ternary_function { public: class Op : public E_F0mps { public: Expression a,b,c; Op(Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc) {} AnyType operator()(Stack s) const { R xx(GetAny((*b)(s))); R yy(GetAny((*c)(s))); MeshPoint & mp = *MeshPointStack(s),mps=mp; mp.set(xx,yy,0.0); AnyType ret = (*a)(s); mp=mps; return ret;} }; }; template class Op4_K2R : public quad_function { public: class Op : public E_F0mps { public: Expression a,b,c,d; Op(Expression aa,Expression bb,Expression cc,Expression dd) : a(aa),b(bb),c(cc),d(dd) {} AnyType operator()(Stack s) const { //cout <<"class Op4_K2R : public quad_function" << endl; R xx(GetAny((*b)(s))); R yy(GetAny((*c)(s))); R zz(GetAny((*d)(s))); MeshPoint & mp = *MeshPointStack(s),mps=mp; mp.set(xx,yy,zz); AnyType ret = (*a)(s); mp=mps; return ret;} }; }; template class E_set_fev3: public E_F0mps { public: typedef typename v_fes::pfes pfes; typedef typename v_fes::FESpace FESpace; typedef typename FESpace::Mesh Mesh; typedef typename FESpace::FElement FElement; typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::RdHat RdHat; typedef typename Mesh::Rd Rd; E_Array aa; Expression ppfe; bool optimize, optimizecheck; vector where_in_stack_opt; Expression optiexp0,optiexpK; E_set_fev3(const E_Array * a,Expression pp) ; AnyType operator()(Stack) const ; operator aType () const { return atype();} }; template class E_set_fev: public E_F0mps {public: const int dim; E_Array aa; Expression ppfe; bool optimize,optimizecheck; vector where_in_stack_opt; Expression optiexp0,optiexpK; E_set_fev(const E_Array * a,Expression pp,int ddim=2) ; AnyType operator()(Stack) const ; AnyType Op2d(Stack) const ; AnyType Op3d(Stack) const ; operator aType () const { return atype();} }; bool InCircularList(const int *p,int i,int k); template int numeroteclink(KN_ & ndfv) ; // for ... vectorial FE array .. template class E_FEcomp_get_elmnt_array :public E_F0 { public: typedef FEbaseArray * pfekbasearray ; typedef FEbase * pfekbase ; typedef pair pfek ; typedef pair pfekarray ; typedef pfek R; typedef pfekarray A; typedef long B; typedef FEbaseArray CFE; typedef E_FEcomp E_KFEArray; Expression a0,a1; const E_KFEArray * a00; const int comp, N; E_FEcomp_get_elmnt_array(Expression aa0,Expression aa1,int compp,int NN,const E_KFEArray * aa00) : a0(aa0),a1(aa1),a00(aa00),comp(compp),N(NN) {} AnyType operator()(Stack s) const {return SetAny( get_element( GetAny((*a0)(s)) , GetAny((*a1)(s)) ) );} bool MeshIndependent() const {return a0->MeshIndependent() && a1->MeshIndependent();} // }; template class OneOperator2_FE_get_elmnt : public OneOperator { // /// Add("[","",new OneOperator2_FEcomp(get_element)); // not used ... // Add("[","",new OneOperator2_(get_element)); typedef FEbase * pfekbase ; typedef FEbaseArray * pfekbasearray ; typedef pair pfek ; typedef pair pfekarray ; typedef pfek R; typedef pfekarray A; typedef long B; typedef E_FEcomp_get_elmnt_array CODE; typedef FEbaseArray CFE; typedef E_FEcomp E_KFEArray; typedef E_FEcomp E_KFEi; aType t0,t1; // return type type de f, f(t1, t2) public: E_F0 * code(const basicAC_F0 & args) const { const E_KFEArray * afe=dynamic_cast (args[0].LeftValue()); // cout << " build xxx " << afe << " " << *args[0].left() << endl; //afe=0;// E_KFEi n'est pas le bon type on mame le vieux code ????? ffassert(afe); return new CODE(t0->CastTo(args[0]),t1->CastTo(args[1]),afe->comp,afe->N,afe); } OneOperator2_FE_get_elmnt(): OneOperator(map_type[typeid(R).name()],map_type[typeid(A).name()],map_type[typeid(B).name()]), t0( map_type[typeid(A).name()] ),t1(map_type[typeid(B).name()] ){} }; freefem++-3.38-1/src/fflib/lgmat.cpp000644 000767 000024 00000323264 12543220164 017276 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef __MWERKS__ #pragma optimization_level 0 //#pragma inline_depth(0) #endif /* #include "error.hpp" #include "RNM.hpp" #include #include #include #include #include #include #include using namespace std; #include "FESpacen.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "MatriceCreuse_tpl.hpp" //#include "fem3.hpp" #include "MeshPoint.hpp" #include "Operator.hpp" #include "lex.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" */ #include "ff++.hpp" #include "array_resize.hpp" #include "CGNL.hpp" namespace bamg { class Triangles; } namespace Fem2D { void DrawIsoT(const R2 Pt[3],const R ff[3],const RN_ & Viso); } extern const basicForEachType *aatypeknlongp; //// for compilation error with g++ 3.2.2 #include "BamgFreeFem.hpp" // Debut FH Houston -------- avril 2004 --------- // class for operator on sparse matrix // ------------------------------------ // pour le addition de matrice ----matrice creuse in french) // MatriceCreuse real class for matrix sparse // Matrice_Creuse class for matrix sparse + poiteur on FE space def // to recompute matrice in case of mesh change // list *,bool> > * is liste of // \sum_i a_i*A_i where a_i is a scalare and A_i is a sparse matrix // template list *, bool > > * to(Matrice_Creuse * M) { list *,bool> > * l=new list *,bool> >; l ->push_back(make_triplet *,bool>(1,M->A,false)); return l; } template list *, bool > > * to(Matrice_Creuse_Transpose M) { list *,bool> > * l=new list *,bool> >; l ->push_back(make_triplet *,bool>(1,M.A->A,true)); return l; } template AnyType M2L3 (Stack , const AnyType & pp) { return to(GetAny *>(pp)); } template AnyType tM2L3 (Stack , const AnyType & pp) { return to(GetAny >(pp)); } template struct Op2_ListCM: public binary_function *,list *,bool> > *> { typedef triplet *,bool> P; typedef list

L; typedef L * RR; typedef R AA; typedef Matrice_Creuse * BB; static RR f(const AA & a,const BB & b) { RR r= new list

; r ->push_back(make_triplet *>(a,b->A,false)); return r;} }; template struct Op2_ListMC: public binary_function *,R,list *,bool> > *> { typedef triplet *,bool> P; typedef list

L; typedef L * RR; typedef R AA; typedef Matrice_Creuse * BB; static RR f(const BB & b,const AA & a) { RR r= new list

; r ->push_back(make_triplet *>(a,b->A,false)); return r;} }; // ADD FH 16/02/2007 template struct Op2_ListCMt: public binary_function ,list *,bool> > *> { typedef triplet *,bool> P; typedef list

L; typedef L * RR; typedef R AA; typedef Matrice_Creuse_Transpose BB; static RR f(const AA & a,const BB & b) { RR r= new list

; r ->push_back(make_triplet *>(a,b.A->A,true)); return r;} }; template struct Op2_ListMtC: public binary_function ,R,list *,bool> > *> { typedef triplet *,bool> P; typedef list

L; typedef L * RR; typedef R AA; typedef Matrice_Creuse_Transpose BB; static RR f(const BB & b,const AA & a) { RR r= new list

; r ->push_back(make_triplet *>(a,b.A->A,true)); return r;} }; // FIN ADD 16/02/2007 template struct Op1_LCMd: public unary_function *,bool> > *, list *,bool> > * > { // - ... typedef triplet *,bool> P; typedef list

L; typedef L * RR; static RR f(const RR & l) { typedef typename list *,bool> >::iterator lci; for (lci i= l->begin();i !=l->end();++i) i->first *= R(-1); return l; } }; template struct Op2_ListCMCMadd: public binary_function *,bool> > *, list *,bool> > *, list *,bool> > * > { // ... + ... typedef triplet *,bool> P; typedef list

L; typedef L * RR; static RR f(const RR & a,const RR & b) { a->insert(a->end(),b->begin(),b->end()); delete b; return a; } }; template struct Op2_ListMCMadd: public binary_function *, list *,bool> > *, list *,bool> > * > { // M + .... typedef triplet *,bool> P; typedef list

L; typedef L * RR; typedef Matrice_Creuse * MM; static RR f(const MM & a,const RR & b) { b->push_front(make_triplet *>(R(1.),a->A,false)); return b; } }; template struct Op2_ListCMMadd: public binary_function< list *,bool> > *, Matrice_Creuse * , list *,bool> > *> { // .... + M typedef triplet *,bool> P; typedef list

L; typedef L * RR; typedef Matrice_Creuse * MM; static RR f(const RR & a,const MM & b) { a->push_back(make_triplet *,bool>(R(1.),b->A,false)); return a; } }; template struct Op2_ListMMadd: public binary_function< Matrice_Creuse *, Matrice_Creuse * , list *,bool> > *> { // M + M typedef triplet *,bool> P; typedef list

()); TheOperators->Add("<-", new OneOperator2(OpenDir)); Global.Add("readdir","(",new OneOperator1s_(ReadDir)); Global.New("modeRWXu long",CConstant(0700)); Global.New("modeRWXg long",CConstant(070)); Global.New("modeRWXo long",CConstant(07)); Global.New("modeRu long",CConstant(0400)); Global.New("modeRg long",CConstant(040)); Global.New("modeRo long",CConstant(04)); Global.New("modeWu long",CConstant(0200)); Global.New("modeWg long",CConstant(020)); Global.New("modeWo long",CConstant(02)); Global.New("modeXu long",CConstant(0100)); Global.New("modeXg long",CConstant(010)); Global.New("modeXo long",CConstant(01)); Global.Add("unlink","(",new OneOperator1(ff_unlink)); Global.Add("rmdir","(",new OneOperator1(ff_rmdir)); Global.Add("cddir","(",new OneOperator1(ff_chdir)); Global.Add("chdir","(",new OneOperator1(ff_chdir)); #ifndef _WIN32 Global.Add("mkdir","(",new OneOperator2(ff_mkdir)); #endif Global.Add("chmod","(",new OneOperator2(ff_chmod)); Global.Add("mkdir","(",new OneOperator1(ff_mkdir)); Global.Add("stat","(",new OneOperator1(ff_stat)); Global.Add("isdir","(",new OneOperator1(ff_isdir)); Global.Add("getenv","(",new OneOperator1s_(ffgetenv)); Global.Add("setenv","(",new OneOperator2_(ffsetenv)); Global.Add("unsetenv","(",new OneOperator1_(ffunsetenv)); } LOADFUNC(init); freefem++-3.38-1/examples++-load/shell.edp000644 000767 000024 00000000440 12123017524 020261 0ustar00hechtstaff000000 000000 load "shell" Directory c="."; while(1) { string n=readdir(c); if( n != "") cout << n << " " << isdir(n) << endl; else break; } cout << " login " << getenv("LOGIN") << endl; setenv("FF_TOTO","toto"); setenv("FF_TOTO","toto"); cout << " FF_TOTO " << getenv("FF_TOTO") << endl; freefem++-3.38-1/examples++-load/SortedList.h000755 000767 000024 00000060610 11714503141 020735 0ustar00hechtstaff000000 000000 // // SortedList.h // FastMarchingBundle // // Created by Jean-Marie Mirebeau on 22/06/11. // Copyright 2011 UPMC. All rights reserved. // #ifndef SORTED_LIST_H #define SORTED_LIST_H #include #include #include #include //#include #include "float.h" #include "BasicMath.h" using namespace std; /* The template class Tab implements arrays of arbitrary length, which does not need to be fixed in advance. The template class SortedList implements sorted lists of arbitrary length, which does not need to be fixed in advance either. Common usages, such as insersion and deletion, access to minimal and maximal element, have the complexity log(n). The template class RBTree implements Balanced Trees using the Red/Black labels approach. It should not be used directly, but only through SortedList. */ template class Tab; template class SortedList; template class RBTree; /****************************** Arrays of arbitrary length : Tab *******************************************/ template class Tab { public: Tab():cardMax(startCard), growIndex(0), max_accessed_pos(-1){ elements[growIndex++].resize(startCard); }; Tab(const Tab & tab):max_accessed_pos(tab.max_accessed_pos) { cout << "Tab constructor Warning : copying Tab of cardinality " << tab.cardMax << "; max accessed pos : " << tab.max_accessed_pos << endl; elements[growIndex++].resize(startCard); for(int i=0; i=0,"Tab::Element Error : Negative index " << pos); if(pos >= cardMax){ const bool hasGrown = grow(); //contents of an assertion are not executed if NDEBUG assert_msg(hasGrown,"Tab::Element Error : Maximum array size excessed. "<< pos); return operator[](pos);} max_accessed_pos = max(pos, max_accessed_pos); if(pos=2*pow; i++, pow*=2){}; for(i=growIndex-1, pow=cardMax/2; pos=0, "Tab::Element Error : Negative index " << pos); assert_msg(pos<=max_accessed_pos,"Tab::Element const Error : max_accessed_pos exceeded. "<< pos); if(pos=2*pow; i++, pow*=2){}; // for(i=growIndex-1, pow=cardMax/2; pos=1; i--, pow/=2) { const int j = int(ptr-&elements[i][0]); if(0<=j && j elements[growMax]; // TabElement * elements[growMax]; // TabElement NegElement; bool grow(){ if(growIndex==growMax) return false; elements[growIndex++].resize(cardMax); cardMax*=2; return true; } TabElement & Element(int pos) {return operator[](pos);} const TabElement & Element(int pos) const {return operator[](pos);} }; template void Tab::sort(){ if(max_accessed_pos >50){ //tri n ln(n). SortedList list; for(int i=0; i<=max_accessed_pos; ++i) list.insert(Element(i)); for(int i=0; i<=max_accessed_pos; ++i) Element(i)=list.pop(); return; } TabElement swap; for (int i=0; i=0 && Element(j)>swap; --j) Element(j+1)=Element(j); Element(j+1)=swap; } } } template void print_array(ostream & f, const Tab & tab, bool one_per_line=false){ const int N=tab.max_accessed_pos+1; if(one_per_line) for(int i=0; i void print_array(ostream_math f, const Tab & tab, bool one_per_line=false){ if(f.format==Mathematica) { const int N=tab.max_accessed_pos+1; if(N<=0) {f << "{}"; return;} f << "{"; for(int i=0; i ostream& operator <<(ostream& f, const Tab & tab ){print_array(f,tab); return f;} template ostream_math operator <<(ostream_math f, const Tab & tab ){print_array(f,tab); return f;} // ********************** Reservoir ********************* //Reservoir of copies of a given object. References are consistent over time. template class Reservoir { Tab reserve; mutable vector unused; public: int card() const {return int(reserve.card()-unused.size());} E* next(){if(unused.empty()) return reserve.next(); E* e=unused.back(); unused.pop_back(); return e;} //bizarre that pop is void bool free(E* e){if(reserve.index(e)<0) return false; unused.push_back(e); return true;} void enumerate(vector &elems); void enumerate(vector &elems) const; }; template void Reservoir::enumerate(vector &elems){ sort(unused.begin(), unused.end()); int u=0; //vector::const_iterator u does not work for some reason for(int i=0; i void Reservoir::enumerate(vector &elems) const { sort(unused.begin(), unused.end()); int u=0; //vector::const_iterator u does not work for some reason for(int i=0; i class safe_vector : public vector { public: E & operator[](size_t n) {assert(0<=n && nsize()); return this->vector::operator[](n);} const E & operator[](size_t n) const {assert(0<=n && nsize()); return this->vector::operator[](n);} E & front() {assert(0size()); return this->vector::front();} const E & front() const {assert(0size()); return this->vector::front();} E & back() {assert(0size()); return this->vector::back();} const E & back() const {assert(0size()); return this->vector::back();} }; /************************ Sorted List *********************/ //new implementation : a simple interface with std::set template class SortedList { set s; public: int Card(){return int(s.size());} bool contains(E e){return s.count(e);} E min(){return *s.begin();} //empty cases ? E max(){return *--s.end();} bool insert(E e){return s.insert(e).second;} bool remove(E e){return s.erase(e);} E pop(){E e=min(); remove(e); return e;} void print(ostream &f){ Tab tab; enumerate(tab); f << tab;} //int enumerate(Tab &tab){set::const_iterator it; int i; for(it=s.begin(), i=0; it!=s.end(); ++it, ++i){tab[i]=*it;} return i;} //int enumerate(Tab &tab){for(int i=0; i &tab); void clear(){s.clear();} }; template<> inline int SortedList::enumerate(Tab &tab){ set::const_iterator it; int i; for(it=s.begin(), i=0; it!=s.end(); ++it, ++i){tab[i]=*it;} return i; } //old implementation based on personal construction of red black trees. Works fine, but the standard library might be safer and/or faster (?) /* template class SortedList { public: const int & Card; SortedList() : newNode(0), deleteNode(0), card(0), Card(card), cardMax(startCard), growIndex(1){ nodes[0] = new RBTree [2*cardMax]; pNodes = new RBTree * [2*cardMax]; for(int i=0; i<2*cardMax; i++) {pNodes[i] = nodes[0]+i;} } SortedList(const SortedList & list){ cout << "Sorted list constructor warning : copying list of cardinal " << list.Card << endl; Tab tab; list.enumerate(tab); for(int i=0; i & tab){int counter=0; root.enumerate(tab, counter); return counter;} void clear(){while(Card>0) pop();} private: const static int startCard = 64; const static int growMax = 25; int growIndex; RBTree root; RBTree * nodes[growMax]; RBTree * * pNodes; int newNode; int deleteNode; int card; //attention : le nombre de noeuds est le double du cardinal int cardMax; bool grow(){ //lorsque grow est appelé, on doit avoir card==cardMax, et donc newNode == deleteNode if(growIndex == growMax) return false; nodes[growIndex] = new RBTree [2*cardMax]; //création des nouveaux noeuds. même nombre que tous ceux créés jusque alors cardMax*=2; delete pNodes; pNodes = new RBTree * [2*cardMax]; //création des nouveaux pointeurs, autant que de noeuds au total for(int i=0; i TreeLabel SortedList::pop(){ TreeLabel ans; if(card<=0) return root.ELEMENT_MAX; ans = root.pop(pNodes[deleteNode], pNodes[deleteNode+1]); card--; deleteNode = (deleteNode+2)%(2*cardMax); return ans; } template ostream& operator <<(ostream& f, const SortedList & list){ list.print(f); return f;} template ostream_math operator <<(ostream_math f, const SortedList & list){ if(f.format==Mathematica) {Tab tab; list.enumerate(tab); f< class RBTree { public: RBTree () :color(Leaf),n(),left(NULL),right(NULL){} bool contains (TreeLabel m); bool checkColor(); TreeLabel min(); TreeLabel max(); int black_height(); bool check(); bool insert(TreeLabel m, RBTree * leftTree, RBTree * rightTree); bool remove(TreeLabel m, RBTree * & leftTree, RBTree * & rightTree); TreeLabel pop( RBTree * & leftTree, RBTree * & rightTree); //renvoie le plus petit élément, et le supprime void print(ostream& f) const; void printInOrder(ostream& f) const; bool isEmpty(){return color==Leaf;} void enumerate(Tab & tab, int & counter); void reset(); private: friend class SortedList; RBL color; TreeLabel n; RBTree * left; RBTree * right; void conflict(); bool rec_insert(TreeLabel m, RBTree * leftTree, RBTree * rightTree); APb rec_remove(TreeLabel m, RBTree * & leftTree, RBTree * & rightTree); AP unbalanced_right(); AP unbalanced_left(); static const TreeLabel ELEMENT_MIN; static const TreeLabel ELEMENT_MAX; }; template inline ostream& operator <<(ostream& f, const RBTree & tree ){ tree.print(f); return f; } template void RBTree::print(std::ostream& f) const { if(color==Leaf) {f << "Leaf"; return;} f << n << " "; if(color==Red) {f << "Red";} else f << "Black"; f << "( " << *left << ", " << *right << ")"; } template void RBTree::printInOrder(std::ostream& f) const { if(color==Leaf) return; left->printInOrder(f); if(!left->isEmpty()) f << ", "; f << n; if(!right->isEmpty()) f << ", "; right->printInOrder(f); } template bool RBTree::contains (TreeLabel m){return n==m || (color != Leaf && (mcontains(m) : right->contains(m)) ); } template bool RBTree::checkColor(){ return color==Leaf || (left->checkColor() && right->checkColor() && (color != Red || (left->color != Red && right->color != Red))); } template TreeLabel RBTree::min() {return color==Leaf ? ELEMENT_MAX : (left->color==Leaf ? n : left->min() );} template TreeLabel RBTree::max() {return color==Leaf ? ELEMENT_MIN : (right->color==Leaf ? n : right->max() );} template int RBTree::black_height(){ if(color==Leaf) return 0; int lh = left->black_height(); int rh = right->black_height(); return lh==rh ? (color == Black) + lh : INT_MIN; } // par construction, la hauteur noire à gauche et à droite doivent être égales. En cas de différence, la valeur reçue est négative. template bool RBTree::check(){return checkColor() && black_height() >= 0;} template void RBTree::conflict(){ if(color!=Black) return; if(left->color==Red && left->left->color==Red){ RBTree * OldLeft = left; RBTree * OldLeftLeft = left->left; RBTree * t1 = OldLeftLeft->left; RBTree * t2 = OldLeftLeft->right; RBTree * t3 = OldLeft->right; RBTree * t4 = right; const TreeLabel n1 = OldLeftLeft->n; const TreeLabel n2 = OldLeft->n; const TreeLabel n3 = n; color = Red; left = OldLeftLeft; left->color = Black; right = OldLeft; right->color = Black; left->left = t1; left->right = t2; right->left = t3; right->right = t4; left->n = n1; n = n2; right->n = n3; return; } if(left->color == Red && left->right->color == Red){ //RBTree * OldLeft = left; RBTree * OldLeftRight = left->right; //RBTree * t1 = OldLeft->left; RBTree * t2 = OldLeftRight->left; RBTree * t3 = OldLeftRight->right; RBTree * t4 = right; //const TreeLabel n1 = OldLeft->n; const TreeLabel n2 = OldLeftRight->n; const TreeLabel n3 = n; color = Red; //left = OldLeft; //inchangé left->color = Black; right = OldLeftRight; right->color = Black; //left->left = t1; //inchangé left->right = t2; right->left = t3; right->right = t4; //left->n = n1; n = n2; right->n = n3; return; } if(right->color == Red && right->right->color == Red){ RBTree * OldRight = right; RBTree * OldRightRight = right->right; RBTree * t1 = left; RBTree * t2 = OldRight->left; RBTree * t3 = OldRightRight->left; RBTree * t4 = OldRightRight->right; const TreeLabel n1 = n; const TreeLabel n2 = OldRight->n; const TreeLabel n3 = OldRightRight->n; color = Red; left = OldRight; left->color = Black; right = OldRightRight; right->color = Black; left->left = t1; left->right = t2; right->left = t3; right->right = t4; left->n = n1; n = n2; right->n = n3; return; } if(right->color == Red && right->left->color == Red){ //RBTree * OldRight = right; RBTree * OldRightLeft = right->left; RBTree * t1 = left; RBTree * t2 = OldRightLeft->left; RBTree * t3 = OldRightLeft->right; //RBTree * t4 = OldRight->right; const TreeLabel n1 = n; const TreeLabel n2 = OldRightLeft->n; // const TreeLabel n3 = OldRight->n; color = Red; left = OldRightLeft; left->color = Black; //right = OldRight; //inchangé right->color = Black; left->left = t1; left->right = t2; right->left = t3; //right->right = t4; //inchangé left->n = n1; n = n2; //right->n = n3; return; } } template bool RBTree::rec_insert(TreeLabel m, RBTree * leftTree, RBTree * rightTree){ if(color==Leaf){color=Red; n=m; left = leftTree; right = rightTree; return true;} if(n==m) return false; const bool ans = m < n ? left->rec_insert(m, leftTree, rightTree) : right->rec_insert(m, leftTree, rightTree); conflict(); return ans; } template bool RBTree::insert(TreeLabel m, RBTree * leftTree, RBTree * rightTree){ const bool ans = rec_insert(m, leftTree, rightTree); color = Black; return ans; } template AP RBTree::unbalanced_right(){ //branche de droite plus légère que celle de gauche (suite à une délétion) if(color == Red && left->color == Black){ color = Black; left->color = Red; conflict(); return Absorbed; } if(color == Black && left->color == Red){ RBTree * OldLeft = left; RBTree * t1 = left->left; RBTree * t2 = left->right; RBTree * t3 = right; const TreeLabel n1 = left->n; const TreeLabel n2 = n; left = t1; right = OldLeft; right->left = t2; right->right = t3; right->color = Black; t2->color = Red; //par construction t2->color == Black initialement n = n1; right->n = n2; right->conflict(); return Absorbed; } if(color == Black && left->color == Black){ left->color = Red; conflict(); return Propagated; //l'arbre a été allégé, le déséquilibre est propagé } return Absorbed; // on n'est pas censé en arriver là } template AP RBTree::unbalanced_left(){ //branche de gauche plus légère que celle de droite (suite à une délétion) if(color == Red && right->color == Black){ color = Black; right->color=Red; conflict(); return Absorbed; } if(color == Black && right->color == Red){ RBTree * OldRight = right; RBTree * t1 = left; RBTree * t2 = right->left; RBTree * t3 = right->right; const TreeLabel n1 = n; const TreeLabel n2 = right->n; left = OldRight; left->left = t1; left->right = t2; right = t3; left->color = Black; t2->color = Red; //par construction t2->color == Black initialement left->n = n1; n = n2; left->conflict(); return Absorbed; } if(color == Black && right->color == Black){ right->color = Red; conflict(); return Propagated; //l'arbre a été allégé, le déséquilibre est propagé } return Absorbed; // on n'est pas censé en arriver là } template APb RBTree::rec_remove(TreeLabel m, RBTree * & leftTree, RBTree * & rightTree){ if(color == Leaf) return Absorbed_false; //rien ne se passe if(mrec_remove(m, leftTree, rightTree); conflict(); if(ans != Propagated_true) return ans; return AP_b2APb(unbalanced_left(), APb2bool(ans)); } if(m>n){ const APb ans = right->rec_remove(m, leftTree, rightTree); conflict(); if(ans != Propagated_true) return ans; return AP_b2APb(unbalanced_right(), APb2bool(ans)); } //cas m==n if(left->color != Leaf){ const TreeLabel maxLeft = left->max(); n = maxLeft; const APb ans = left->rec_remove(maxLeft, leftTree, rightTree); conflict(); if(ans != Propagated_true) return ans; return AP_b2APb(unbalanced_left(), APb2bool(ans)); } if(right->color!=Leaf){ const TreeLabel minRight = right->min(); n = minRight; const APb ans = right->rec_remove(minRight, leftTree, rightTree); conflict(); if(ans != Propagated_true) return ans; return AP_b2APb(unbalanced_right(), APb2bool(ans)); } RBL OldColor = color; leftTree = left; rightTree = right; reset(); if(OldColor == Black) return Propagated_true; return Absorbed_true; } template void RBTree::reset() {color = Leaf; n=ELEMENT_MIN; left = NULL; right = NULL;} template bool RBTree::remove(TreeLabel m, RBTree * & leftTree, RBTree * & rightTree){ const APb ans = rec_remove(m, leftTree, rightTree); if(color == Red) color = Black; return APb2bool(ans); } template TreeLabel RBTree::pop(RBTree * & leftTree, RBTree * & rightTree){ const TreeLabel m=min(); remove(m, leftTree, rightTree); return m; } template void RBTree::enumerate(Tab & tab, int & counter){ if(color==Leaf) return; left->enumerate(tab, counter); tab[counter++] = n; //RZ(n.distance, n.number); right->enumerate(tab,counter); } template<> const double RBTree ::ELEMENT_MIN = DBL_MIN; template<> const int RBTree ::ELEMENT_MIN = INT_MIN; template const TreeLabel RBTree::ELEMENT_MIN = TreeLabel().MIN(); template<> const double RBTree ::ELEMENT_MAX = DBL_MAX; template<> const int RBTree ::ELEMENT_MAX = INT_MAX; template const TreeLabel RBTree::ELEMENT_MAX = TreeLabel().MAX(); */ #endif freefem++-3.38-1/examples++-load/splitedges.cpp000644 000767 000024 00000015036 12466662577 021366 0ustar00hechtstaff000000 000000 #include "ff++.hpp" using namespace Fem2D; Mesh * Split_Edges(Fem2D::Mesh * const & pTh, long *dK) { bool v10 = verbosity>10; bool vp = verbosity>1; assert(pTh); const Mesh & Th(*pTh); // le maillage d'origne a decoupe using Fem2D::Triangle; using Fem2D::Vertex; using Fem2D::R2; using Fem2D::BoundaryEdge; using Fem2D::Mesh; // using Fem2D::R; int nbtn =Th.nt; int nbvn =Th.nv; int nebn =Th.neb; for(int k=0;k0); if(v10) cout << " " << i1 << " " << iee << " " << i2 << " " << lab << " " << endl; *bb++ = BoundaryEdge(v,i1,iee,lab); *bb++ = BoundaryEdge(v,iee,i2,lab); } else *bb++ = BoundaryEdge(v,i1,i2,lab); } ffassert(bb-b==nebn); // generation de la class Mesh a partir des 3 tableaux : v,t,b { Mesh * m = new Mesh(nbvn,nbtn,nebn,v,t,b); R2 Pn,Px; m->BoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); m->decrement(); return m; } } // truc pour que la fonction // static void Load_Init() soit appele a moment du chargement dynamique // du fichier // /* class Init { public: Init(); }; */ class SplitEdges : public E_F0mps { public: typedef pmesh Result; Expression expTh; Expression spt; SplitEdges(const basicAC_F0 & args) { args.SetNameParam(); expTh= to(args[0]); // a the expression to get the mesh spt= to(args[1]); // a the expression to get the mesh } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype()); } static E_F0 * f(const basicAC_F0 & args){ return new SplitEdges(args);} AnyType operator()(Stack s) const ; }; AnyType SplitEdges::operator()(Stack stack) const { Mesh * pTh = GetAny((*expTh)(stack)); MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; bool v10= verbosity>10; ffassert(pTh); Mesh & Th(*pTh); KN dK(Th.nt); dK=0L; int ne=0; for (int k=0;kset(P.x,P.y); double de = fabs(GetAny((*spt)(stack))); bool be= fabs(de)>1e-30; if(be) { dK[k] += (1<=0)) { bool bee = dK[kk] & (1<0) cout << " SplitEdges: nb split edge = " << ne << endl; *mp=mps; return SetAny( Split_Edges(pTh,(long *) dK)); } static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ if (verbosity) cout << " lood: Split3 " << endl; Global.Add("SplitEdgeMesh","(", new OneOperatorCode( )); // utilisation // mesh Th,Th3; // ... construction du maillage Th ici // Th3=splitmesh3(Th); /* example complet : splitmesh3.edp load "splitedge" mesh Th=square(5,5); mesh Th3=SplitEdgeMesh(Th,x<0.51 && y < 0.49 ); plot(Th3,wait=1); */ } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/splitedges.edp000644 000767 000024 00000000317 11556312310 021320 0ustar00hechtstaff000000 000000 load "splitedges" mesh Th=square(50,50); real xx=1.1,yy=1.1; for(int i=0;i<4;++i) { xx *= 0.5; yy *= 0.5; Th=SplitEdgeMesh(Th,x #include using namespace std; #include "error.hpp" #include "AFunction.hpp" using namespace std; #include "rgraph.hpp" #include "RNM.hpp" #include #include using namespace Fem2D; Mesh * SplitMesh3(Fem2D::Mesh * const & pTh) { assert(pTh); const Mesh & Th(*pTh); // le maillage d'origne a decoupe using Fem2D::Triangle; using Fem2D::Vertex; using Fem2D::R2; using Fem2D::BoundaryEdge; using Fem2D::Mesh; // using Fem2D::R; int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int neb=Th.neb; // nombre d'aretes fontiere // allocation des nouveaux items du maillage Vertex * v= new Vertex[nbv+nbt]; Triangle *t= new Triangle[nbt*3]; BoundaryEdge *b= new BoundaryEdge[neb]; // generation des nouveaus sommets Vertex *vv=v; // copie des anciens sommets (remarque il n'y a pas operateur de copy des sommets) for (int i=0;ix=V.x; vv->y=V.y; vv->lab = V.lab; vv++; } // generation des points barycentre de trianngles for (int k=0;kx=G.x; vv->y=G.y; vv->lab = 0; vv++; } // generation des triangles Triangle *tt= t; int nberr=0; for (int i=0;iBoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); m->decrement(); return m; } } // truc pour que la fonction // static void Load_Init() soit appele a moment du chargement dynamique // du fichier // /* class Init { public: Init(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ if (verbosity) cout << " lood: Split3 " << endl; Global.Add("splitmesh3","(",new OneOperator1_(SplitMesh3)); // utilisation // mesh Th,Th3; // ... construction du maillage Th ici // Th3=splitmesh3(Th); /* example complet : splitmesh3.edp load "splitmesh3" mesh Th=square(5,5); mesh Th3=splitmesh3(Th); plot(Th3,wait=1); */ } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/splitmesh3.edp000644 000767 000024 00000000121 11406142255 021244 0ustar00hechtstaff000000 000000 load "splitmesh3" mesh Th=square(5,5); mesh Th3=splitmesh3(Th); plot(Th3,wait=1);freefem++-3.38-1/examples++-load/splitmesh6.cpp000644 000767 000024 00000007733 12466661714 021316 0ustar00hechtstaff000000 000000 // $Id$ #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" using namespace std; #include "rgraph.hpp" #include "RNM.hpp" #include #include using namespace Fem2D; Mesh * SplitMesh6(Fem2D::Mesh * const & pTh) { assert(pTh); const Mesh & Th(*pTh); // le maillage d'origne a decoupe using Fem2D::Triangle; using Fem2D::Vertex; using Fem2D::R2; using Fem2D::BoundaryEdge; using Fem2D::Mesh; // using Fem2D::R; int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int neb=Th.neb; // nombre d'aretes fontiere // allocation des nouveaux items du maillage int nbe = 0; for(int k=0; k mm(3*nbt); // copie des anciens sommets (remarque il n'y a pas operateur de copy des sommets) for (int i=0;ix=V.x; vv->y=V.y; vv->lab = V.lab; vv++; } // generation des points barycentre de trianngles for (int k=0;kx=G.x; vv->y=G.y; vv->lab = 0; vv++; } // generation des milieux des cote int nn=0; for(int k=0; k =k) || (kk <0) ) { int v0=Th(k,EdgesVertexTriangle[e][0]); int v1=Th(k,EdgesVertexTriangle[e][1]); R2 M = ((R2) Th(v0) + Th(v1)) /2.; int lab=0; BoundaryEdge *be=Th.TheBoundaryEdge(v0,v1); if( be) { lab= be->lab; } vv->x=M.x; vv->y=M.y; vv->lab = lab; mm[k*3+e]= vv-v;// numero du sommet vv++; nn++; } else mm[k*3+e] = mm[kk*3+ee]; } cout << " nb edge = " << nbe << " == " << nn << endl; ffassert(nbe==nn); // generation des triangles Triangle *tt= t; int nberr=0; for (int i=0;iBoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); m->decrement(); return m; } } // truc pour que la fonction // static void Load_Init() soit appele a moment du chargement dynamique // du fichier // /* class Init { public: Init(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ if (verbosity) cout << " lood: Split6 " << endl; Global.Add("splitmesh6","(",new OneOperator1_(SplitMesh6)); // utilisation // mesh Th,Th3; // ... construction du maillage Th ici // Th3=splitmesh3(Th); /* example complet : splitmesh3.edp load "splitmesh3" mesh Th=square(5,5); mesh Th3=splitmesh3(Th); plot(Th3,wait=1); */ } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/splitmesh6.edp000644 000767 000024 00000001315 11406142255 021255 0ustar00hechtstaff000000 000000 load "splitmesh6" mesh Th=square(5,5); mesh Th6=splitmesh6(Th); plot(Th6,wait=1); fespace Vh(Th,P1); fespace Nh(Th,P0); fespace Vh6(Th6,P1); fespace Nh6(Th6,P0); fespace RT6(Th6,RT0); // Raviart Thomas ordre 0 // varf vM6(u,v) = int2d(Th6,qforder=1)(u*v*3/area); matrix M610= vM6(Nh6,Vh6); matrix I61 = interpolate(Vh,Vh6); matrix S61 = I61*M610; Nh6 eta6=1; Vh eta; eta[]= S61*eta6[]; plot(eta,wait=1); RT6 [u6,v6]; RT6 [uu6,vv6]; Nh6 x6=x,y6=y; //solve PP([u6,v6],[uu6,vv6]) = intalledges(Th6)( u6*uu6*N.x + v6*vv6*N.y) //- intalledges(Th6)( mean(x6)*uu6*N.x + mean(y6)*vv6*N.y); [u6,v6] = [mean(x6),mean(y6)]; // OK version 2.19 [uu6,vv6] = [x6,y6]; plot( [u6,v6], [uu6,vv6], wait=1); freefem++-3.38-1/examples++-load/SuperLu.cpp000644 000767 000024 00000060316 12466663031 020605 0ustar00hechtstaff000000 000000 // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: superlu blas //ff-c++-cpp-dep: // for Super4.0 library #include "ff++.hpp" #include "slu_ddefs.h" #include "superlu_enum_consts.h" #define GlobalLU_t GlobalLU_txxxx #define countnz countnzxxxx #define fixupL fixupLxxxx #define print_lu_col print_lu_colxxxx #define check_tempv check_tempvxxxx #define PrintPerf PrintPerfxxxx #define ilu_countnz ilu_countnzxxxx #include "slu_zdefs.h" #undef GlobalLU_t #undef countnz #undef fixupL #undef print_lu_col #undef check_tempv #undef PrintPerf #undef ilu_countnz template struct SuperLUDriver { }; template <> struct SuperLUDriver { /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_D;} static void gssv(superlu_options_t * p1, SuperMatrix * p2, int * p3, int * p4, SuperMatrix * p5, SuperMatrix * p6, SuperMatrix * p7 , SuperLUStat_t * p8, int * p9) { dgssv( p1,p2,p3,p4,p5,p6,p7,p8,p9); } static void gssvx(superlu_options_t * p1, SuperMatrix * p2, int * p3, int * p4, int * p5, char * p6, double * p7, double * p8, SuperMatrix * p9, SuperMatrix * p10, void * p11, int p12, SuperMatrix * p13, SuperMatrix * p14, double * p15, double * p16, double * p17, double * p18, mem_usage_t * p19, SuperLUStat_t * p20, int * p21) { dgssvx( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13,p14,p15,p16,p17,p18,p19,p20, p21); } /* Supernodal LU factor related */ static void Create_CompCol_Matrix(SuperMatrix * p1, int p2 , int p3, int p4, double * p5, int * p6, int * p7, Stype_t p8, Dtype_t p9 , Mtype_t p10) { dCreate_CompCol_Matrix( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); } static void Create_CompRow_Matrix(SuperMatrix * p1, int p2, int p3, int p4, double * p5, int * p6, int * p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { dCreate_CompRow_Matrix( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); } static void Create_Dense_Matrix(SuperMatrix * p1, int p2, int p3, double * p4, int p5, Stype_t p6, Dtype_t p7, Mtype_t p8) { dCreate_Dense_Matrix( p1,p2,p3,p4,p5,p6,p7,p8); } static void Create_SuperNode_Matrix(SuperMatrix * p1, int p2, int p3, int p4, double * p5, int * p6, int * p7, int * p8, int * p9, int * p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { dCreate_SuperNode_Matrix( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13); } static void CompRow_to_CompCol(int p1, int p2, int p3, double *p4, int *p5, int *p6, double **p7, int **p8, int **p9) { dCompRow_to_CompCol( p1, p2, p3, p4, p5, p6, p7, p8, p9); } }; template <> struct SuperLUDriver { /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_Z;} static doublecomplex *dc(Complex *p) { return (doublecomplex *) (void *) p;} static doublecomplex **dc(Complex **p) { return (doublecomplex **) (void *) p;} static void gssv(superlu_options_t * p1, SuperMatrix * p2, int * p3, int * p4, SuperMatrix * p5, SuperMatrix * p6, SuperMatrix * p7 , SuperLUStat_t * p8, int * p9) { zgssv( p1,p2,p3,p4,p5,p6,p7,p8,p9); } static void gssvx(superlu_options_t * p1, SuperMatrix * p2, int * p3, int * p4, int * p5, char * p6, double * p7, double * p8, SuperMatrix * p9, SuperMatrix * p10, void * p11, int p12, SuperMatrix * p13, SuperMatrix * p14, double * p15, double * p16, double * p17, double * p18, mem_usage_t * p19, SuperLUStat_t * p20, int * p21) { zgssvx( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13,p14,p15,p16,p17,p18,p19,p20, p21); } /* Supernodal LU factor related */ static void Create_CompCol_Matrix(SuperMatrix * p1, int p2 , int p3, int p4, Complex * p5, int * p6, int * p7, Stype_t p8, Dtype_t p9 , Mtype_t p10) { zCreate_CompCol_Matrix( p1,p2,p3,p4,dc(p5),p6,p7,p8,p9,p10); } static void Create_CompRow_Matrix(SuperMatrix * p1, int p2, int p3, int p4, Complex * p5, int * p6, int * p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { zCreate_CompRow_Matrix( p1,p2,p3,p4,dc(p5),p6,p7,p8,p9,p10); } static void Create_Dense_Matrix(SuperMatrix * p1, int p2, int p3, Complex * p4, int p5, Stype_t p6, Dtype_t p7, Mtype_t p8) { zCreate_Dense_Matrix( p1,p2,p3,dc(p4),p5,p6,p7,p8); } static void Create_SuperNode_Matrix(SuperMatrix * p1, int p2, int p3, int p4, Complex * p5, int * p6, int * p7, int * p8, int * p9, int * p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { zCreate_SuperNode_Matrix( p1,p2,p3,p4,dc(p5),p6,p7,p8,p9,p10, p11,p12,p13); } static void CompRow_to_CompCol(int p1, int p2, int p3, Complex *p4, int *p5, int *p6, Complex **p7, int **p8, int **p9) { zCompRow_to_CompCol( p1, p2, p3, dc(p4), p5, p6, dc(p7), p8, p9); } }; // read options for superlu in freefem++ /* #ifdef __cpluscplus int s_(char *ff, ...) { int i = 0; while( *(++i+&str) != 0 ) if( strcmp(str, (char*)*(&str+i)) == 0) return i; return 0; } #else */ int s_(char* str, const char* cmp[]) { int i = 0; while( cmp[i] != 0){ if( strcmp(str, cmp[i]) == 0){ //cout << *str << " return" << i << endl; return i+1 ; } i++; } //cout << *str << " return 0" << endl; return 0; } //#endif /* static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[5] = {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD, MY_PERMC}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SINGLE, DOUBLE, EXTRA}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; static const char* comp[] = {"Fact", "Equil","ColPerm", "DiagPivotThresh","Trans","IterRefine", "SymmetricMode","PivotGrowth","ConditionNumber", "PrintStat",0}; */ void read_options_freefem(string string_option, superlu_options_t *options){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[5] = {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD, MY_PERMC}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SLU_SINGLE, SLU_DOUBLE, SLU_EXTRA}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; static const char* comp[] = {"Fact", "Equil","ColPerm", "DiagPivotThresh","Trans","IterRefine", "SymmetricMode","PivotGrowth","ConditionNumber", "PrintStat",0}; /* Set the default values for options argument: options.Fact = DOFACT; options.Equil = YES; options.ColPerm = COLAMD; options.DiagPivotThresh = 1.0; options.Trans = NOTRANS; options.IterRefine = NOREFINE; options.SymmetricMode = NO; options.PivotGrowth = NO; options.ConditionNumber = NO; options.PrintStat = YES; */ //cout << "string_option" << *string_option << endl; KN kdata(string_option.size()+1); char * data=kdata; strcpy( data, string_option.c_str()); cout << "data=" << data << endl; char * tictac; tictac = strtok(data," =,\t\n"); cout << "tictac=" << data << endl; // #ifdef __cplusplus // while(tictac != NULL){ // int id_option = s_(tictac, "Fact", "Equil","ColPerm", // "DiagPivotThresh","Trans","IterRefine", // "SymmetricMode","PivotGrowth","ConditionNumber", // "PrintStat",0); // tictac = strtok(NULL," ,\t\n"); // int val_options; // switch (id_option) // { // case 1 : // Fact // val_options= s_(tictac, "DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","Fact"); // exit(1); // } // options->Fact= enumfact_t[val_options-1]; // break; // case 2: // Equil // val_options= s_(tictac, "NO", "YES", 0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","Equil"); // exit(1); // } // options->Equil= enumyes_no_t[val_options-1]; // break; // case 3: // ColPerm // val_options= s_(tictac,"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","ColPerm"); // exit(1); // } // options->ColPerm= enumcolperm_t[val_options-1]; // case 4: // DiagPivotThresh // options->DiagPivotThresh= strtod(tictac,&tictac); // break; // case 5: // Trans // val_options= s_(tictac, "NOTRANS", "TRANS", "CONJ",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","Trans"); // exit(1); // } // options->Trans= enumtrans_t[val_options-1]; // break; // case 6: // IterRefine // val_options= s_(tictac, "NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","IterRefine"); // exit(1); // } // options->IterRefine= enumIterRefine_t[val_options-1]; // break; // case 7: // SymmetricMode // val_options= s_(tictac, "NO","YES",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); // exit(1); // } // options->SymmetricMode= enumyes_no_t[val_options-1]; // break; // case 8: // PivotGrowth // val_options= s_(tictac, "NO","YES",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); // exit(1); // } // options->PivotGrowth= enumyes_no_t[val_options-1]; // break; // case 9: // ConditionNumber // val_options= s_(tictac, "NO","YES",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); // exit(1); // } // options->ConditionNumber = enumyes_no_t[val_options-1]; // break; // case 10: // PrintStat // val_options= s_(tictac, "NO","YES",0); // if( val_options == 0){ // printf("value given for SuperLU for options %s is not correct\n","PrintStat"); // exit(1); // } // options->PrintStat = enumyes_no_t[val_options-1]; // break; // case 0: // Equivalent of case default // printf("A false parameter for SuperLU is given %s \n",tictac); // exit(1); // } // tictac = strtok(NULL," ,\t\n"); // } // #else while(tictac != NULL){ //char* comp[] = {"Fact", "Equil","ColPerm", //"DiagPivotThresh","Trans","IterRefine", //"SymmetricMode","PivotGrowth","ConditionNumber", //"PrintStat",0 }; int id_option = s_(tictac, comp); tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ColPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 4: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 5: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 6: // IterRefine //char* comp6[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA", 0}; val_options= s_(tictac, compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","IterRefine"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 7: // SymmetricMode //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->SymmetricMode= enumyes_no_t[val_options-1]; break; case 8: // PivotGrowth //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->PivotGrowth = enumyes_no_t[val_options-1]; break; case 9: // ConditionNumber //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->ConditionNumber = enumyes_no_t[val_options-1]; break; case 10: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; case 0: // Equivalent of case default break; } tictac = strtok(NULL," =,\t\n"); } //#endif } template class SolveSuperLU : public MatriceMorse::VirtualSolver, public SuperLUDriver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 mutable char equed[1]; yes_no_t equil; mutable SuperMatrix A, L, U; NCformat *Astore; NCformat *Ustore; SCformat *Lstore; R *a; int *asub, *xa; KN perm_c; /* column permutation vector */ KN perm_r; /* row permutations from partial pivoting */ string string_option; //string *file_option; //string *file_perm_r; //string *file_perm_c; KN etree; R *rhsb, *rhsx, *xact; double *RR, *CC; int m, n, nnz; R *arow; int *asubrow, *xarow; mutable superlu_options_t options; mutable mem_usage_t mem_usage; public: SolveSuperLU(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string & param_char, KN pperm_r, KN pperm_c ) : eps(epsilon),epsr(0), tgv(ttgv), etree(0),string_option(param_char),perm_r(pperm_r), perm_c(pperm_c), RR(0), CC(0), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { SuperMatrix B, X; SuperLUStat_t stat; void *work=0; int info, lwork=0, nrhs=1; int i; double ferr[1]; double berr[1]; double rpg, rcond; R *bb; R *xx; A.Store=0; B.Store=0; X.Store=0; L.Store=0; U.Store=0; int status; n=AA.n; m=AA.m; nnz=AA.nbcoef; arow=AA.a; asubrow=AA.cl; xarow=AA.lg; /* FreeFem++ use Morse Format */ // FFCS - "this->" required by g++ 4.7 this->CompRow_to_CompCol(m, n, nnz, arow, asubrow, xarow, &a, &asub, &xa); /* Defaults */ lwork = 0; nrhs = 0; /* Set the default values for options argument: options.Fact = DOFACT; options.Equil = YES; options.ColPerm = COLAMD; options.DiagPivotThresh = 1.0; options.Trans = NOTRANS; options.IterRefine = NOREFINE; options.SymmetricMode = NO; options.PivotGrowth = NO; options.ConditionNumber = NO; options.PrintStat = YES; */ set_default_options(&options); printf(".. default options:\n"); printf("\tFact\t %8d\n", options.Fact); printf("\tEquil\t %8d\n", options.Equil); printf("\tColPerm\t %8d\n", options.ColPerm); printf("\tDiagPivotThresh %8.4f\n", options.DiagPivotThresh); printf("\tTrans\t %8d\n", options.Trans); printf("\tIterRefine\t%4d\n", options.IterRefine); printf("\tSymmetricMode\t%4d\n", options.SymmetricMode); printf("\tPivotGrowth\t%4d\n", options.PivotGrowth); printf("\tConditionNumber\t%4d\n", options.ConditionNumber); printf("..\n"); if(!string_option.empty()) read_options_freefem(string_option,&options); printf(".. options:\n"); printf("\tFact\t %8d\n", options.Fact); printf("\tEquil\t %8d\n", options.Equil); printf("\tColPerm\t %8d\n", options.ColPerm); printf("\tDiagPivotThresh %8.4f\n", options.DiagPivotThresh); printf("\tTrans\t %8d\n", options.Trans); printf("\tIterRefine\t%4d\n", options.IterRefine); printf("\tSymmetricMode\t%4d\n", options.SymmetricMode); printf("\tPivotGrowth\t%4d\n", options.PivotGrowth); printf("\tConditionNumber\t%4d\n", options.ConditionNumber); printf("..\n"); Dtype_t R_SLU = SuperLUDriver::R_SLU_T(); // FFCS - "this->" required by g++ 4.7 this->Create_CompCol_Matrix(&A, m, n, nnz, a, asub, xa, SLU_NC, R_SLU, SLU_GE); this->Create_Dense_Matrix(&B, m, 0, (R*) 0, m, SLU_DN, R_SLU, SLU_GE); this->Create_Dense_Matrix(&X, m, 0, (R*) 0, m, SLU_DN, R_SLU, SLU_GE); if ( etree.size() ==0 ) etree.resize(n); if ( perm_r.size() ==0 ) perm_r.resize(n); if ( perm_c.size() ==0 ) perm_c.resize(n); if ( !(RR = new double[n]) ) ABORT("SUPERLU_MALLOC fails for R[]."); for(int ii=0; ii::gssvx(&options, &A, perm_c, perm_r, etree, equed, RR, CC, &L, &U, work, lwork, &B, &X, &rpg, &rcond, ferr, berr, &mem_usage, &stat, &info); if(verbosity>2) printf("LU factorization: dgssvx() returns info %d\n", info); if(verbosity>3) { if ( info == 0 || info == n+1 ) { if ( options.PivotGrowth ) printf("Recip. pivot growth = %e\n", rpg); if ( options.ConditionNumber ) printf("Recip. condition number = %e\n", rcond); Lstore = (SCformat *) L.Store; Ustore = (NCformat *) U.Store; printf("No of nonzeros in factor L = %d\n", Lstore->nnz); printf("No of nonzeros in factor U = %d\n", Ustore->nnz); printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz - n); printf("L\\U MB %.3f\ttotal MB needed %.3f\texpansions %d\n", mem_usage.for_lu/1e6, mem_usage.total_needed/1e6, stat.expansions ); fflush(stdout); } else if ( info > 0 && lwork == -1 ) { printf("** Estimated memory: %d bytes\n", info - n); } } if ( verbosity>5 ) StatPrint(&stat); StatFree(&stat); if( B.Store) Destroy_SuperMatrix_Store(&B); if( X.Store) Destroy_SuperMatrix_Store(&X); options.Fact = FACTORED; /* Indicate the factored form of A is supplied. */ } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { SuperMatrix B, X; SuperLUStat_t stat; void *work=0; int info=0, lwork=0, nrhs=1; int i; double ferr[1], berr[1]; double rpg, rcond; double *xx; B.Store=0; X.Store=0; ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; Dtype_t R_SLU = SuperLUDriver::R_SLU_T(); { KN_2Ptr xx(x),bb(b); // cout << " xx #### " << xx.c.N() << " "<< xx.ca.N() << " " << xx.ca.step << endl; //cout << " bb #### " << bb.c.N() << " "<< bb.ca.N() << " " << bb.ca.step <" required by g++ 4.7 this->Create_Dense_Matrix(&B, m, 1, bb, m, SLU_DN, R_SLU, SLU_GE); this->Create_Dense_Matrix(&X, m, 1, xx, m, SLU_DN, R_SLU, SLU_GE); B.ncol = nrhs; /* Set the number of right-hand side */ /* Initialize the statistics variables. */ StatInit(&stat); SuperLUDriver::gssvx(&options, &A, perm_c, perm_r, etree, equed, RR, CC, &L, &U, work, lwork, &B, &X, &rpg, &rcond, ferr, berr, &mem_usage, &stat, &info); if(verbosity>2) printf("Triangular solve: dgssvx() returns info %d\n", info); } if(verbosity>3) { if ( info == 0 || info == n+1 ) { /* This is how you could access the solution matrix. */ R *sol = (R*) ((DNformat*) X.Store)->nzval; if ( options.IterRefine ) { printf("Iterative Refinement:\n"); printf("%8s%8s%16s%16s\n", "rhs", "Steps", "FERR", "BERR"); printf("%8d%8d%16e%16e\n", i+1, stat.RefineSteps, ferr[0], berr[0]); } fflush(stdout); } else if ( info > 0 && lwork == -1 ) { printf("** Estimated memory: %d bytes\n", info - n); } } //cout << " x min max " << x.min() << " " <3) cout << "~SolveSuperLU S:" << endl; // if (etree) delete[] etree; // if (perm_r) delete[] perm_r; // if (perm_c) delete[] perm_c; if (RR) delete[] RR; if (CC) delete[] CC; if( A.Store) Destroy_SuperMatrix_Store(&A); if( L.Store) Destroy_SuperNode_Matrix(&L); if( U.Store) Destroy_CompCol_Matrix(&U); } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverSuperLU(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverSuperLU" << endl; return new SolveSuperLU(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym,ds.sparams,ds.perm_r,ds.perm_c); } MatriceMorse::VirtualSolver * BuildSolverSuperLU(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverSuperLU" << endl; return new SolveSuperLU(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym,ds.sparams,ds.perm_r,ds.perm_c); } /* class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetSuperLU() { if(verbosity>1) cout << " SetDefault sparse solver to SuperLU" << endl; DefSparseSolver::solver =BuildSolverSuperLU; DefSparseSolver::solver =BuildSolverSuperLU; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; return true; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: SuperLU, defaultsolverSuperLU" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverSuperLU; DefSparseSolver::solver =BuildSolverSuperLU; Global.Add("defaulttoSuperLU","(",new OneOperator0(SetSuperLU)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/SuperLU.edp000644 000767 000024 00000003540 12167254041 020522 0ustar00hechtstaff000000 000000 load "SuperLu" verbosity=0; { cout << "laplace solving with SuperLu" << endl; mesh Th=square(10,10); fespace Vh(Th,P1); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh,solver=sparsesolver,tgv=1e5) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // bou ndary condition form laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="Laplace.eps",value=true); } // FFCS: need to declare it globally to print out its value for regression tests complex[int] lastx(4); for(int i=0;i<3;++i) { if(i==0) cout << "resolution SuperLU" < // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ff++.hpp" template long symmetrizeCSR(Matrice_Creuse* const &A) { MatriceMorse* mA = static_cast*>(&(*A->A)); if(!mA->symetrique) { mA->symetrique = true; std::vector cl; std::vector a; a.reserve(mA->nbcoef); cl.reserve(mA->nbcoef); unsigned int save = mA->lg[0]; for(unsigned int i = 0; i < mA->n; ++i) { for(unsigned int j = save; j < mA->lg[i + 1]; ++j) { int col = mA->cl[j]; if(col <= i) { T val = mA->a[j]; if(abs(val) > 1e-14) { a.push_back(val); cl.push_back(col); } } else break; } save = mA->lg[i + 1]; mA->lg[i + 1] = cl.size(); } delete [] mA->cl; delete [] mA->a; int* col = new int[cl.size()]; T* val = new T[cl.size()]; for(unsigned int i = 0; i < cl.size(); ++i) { col[i] = cl[i]; val[i] = a[i]; } mA->cl = col; mA->a = val; mA->nbcoef = cl.size(); } return 1L; } /* class Init { public: Init(); }; Init init; */ static void Load_Init() { Global.Add("symmetrizeCSR", "(", new OneOperator1_* >(symmetrizeCSR)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/TensorK.hpp000755 000767 000024 00000102500 11714263321 020564 0ustar00hechtstaff000000 000000 // // TensorK.h // // // Created by Jean-Marie Mirebeau on 12/10/11. // Copyright 2011 UPMC. All rights reserved. // // This file contains two main routines : // - one for the construction of a metric // - one for the computing the derivatives of a polynomial sampled at lagrange points on a triangle #ifndef _TensorK_h #define _TensorK_h #include #include #include #include "assert.h" using std::vector; // ***************** Quelques fonctions ************ //quelques fonctions inline double square(double u){return u*u;}; inline double max(double a, double b) {return a>b ? a : b;} inline double max(double a, double b, double c) {return a>c ? max(a,b) : max(b,c);} inline double max(double a, double b, double c, double d) {return a>d ? max(a,b,c) : max(b,c,d);} inline double max(double a, double b, double c, double d, double e) {return a>e ? max(a,b,c,d) : max(b,c,d,e);} // ***************** Prototypes ******************** class TensorK { vector factorials; std::vector exponents; double factorial(int n) const {assert(0<=n<=factorials.size()); return factorials[n];} double binomial(int n, int k) const {assert(0<=n && n<=factorials.size() && 0<=k && k<=n); return factorials[n]/(factorials[k]*factorials[n-k]);} const int t_deg; //degree of the polynomials involved public: const int m_deg; const int r_deg; enum triangulation_type {Graded=0, Quasi_Acute=1, Quasi_Acute_Unrefined=2, Quasi_Acute_Proved=3}; const triangulation_type ttype; const double p_exp; enum which_matrix {M0_alone=0, M1_alone=1, M0_M1_weighted_sum=2}; const which_matrix wmat; static const int d_dim=2; const double gamma_exp; const double homog_exp; const bool is_valid; TensorK(int m_deg_, int r_deg_, triangulation_type ttype_, which_matrix wmat, double p_exp_); void getM(const double *D, double M[3]) const; //L^Infinity metric // size required : D[m_deg+1], m_deg+1 == m_dim void equilibrate(const double M[3], double Me[3]) const; //Me = (det M)^(-1/((m-r)p+d)) M = (det M)^gamma_exp M. private: void getMc(const double *D, double Mc[3]) const; //size required : D[t_deg+1] void getM0(const double E[2], double c, double s, double M0[3]) const; //input : eigenvalues and eigenvector of Mc void getM1(const double *D, double c, double s, double M1[3]) const; //size required : D[t_deg+1] void getMs(const double *D, double Ms[3]) const; //size required : D[t_deg+1] void rotate(const double *D, double *Dr, double c, double s) const; //size required : D[t_deg+1] void getSquare(const double *D, double *Ds) const; //get |d^r pi|^2. D[m_deg+1], Ds[t_deg+1] public: //derivative estimation void getDerivatives(const std::vector & DOFt, const R2 invHauteur[3], double *f) const; private: template void Derivatives(const std::vector & DOFt, const R2 invHauteur[3], double f[m]) const; public: //symmetric matrix utilities static void EigenSym(const double S[3], double E[2]); static void EigenSysSym(const double S[3], double Eigen[2], double &c, double &s); static void MakeEigenSym(double S[3], double vap[2], double c, double s); static void AffSym(double S[3], double a, double b); static void MaxSym(double S[3], double lambda); static double det(const double S[3]){return S[0]*S[2]-S[1]*S[1];} static void PowSym(double S[3], double p); private: //debugging friend int main(int argc, const char * argv[]); }; // **************** Constructor ******************** TensorK::TensorK(int m_deg_, int r_deg_, triangulation_type ttype_=Graded, which_matrix wmat_=M1_alone, double p_exp_=2): m_deg(m_deg_), r_deg(r_deg_), ttype(ttype_), wmat(wmat_), p_exp(p_exp_), t_deg((ttype_==Quasi_Acute_Proved) ? 2*(m_deg_-r_deg_) :m_deg_), gamma_exp(-1./((m_deg_-r_deg_)*p_exp_+d_dim)), homog_exp(1./((m_deg_-r_deg_)*(ttype_==Quasi_Acute_Proved ? 2. : 1.)) ), is_valid(m_deg_>=2 && m_deg_<=5 && r_deg_>=0 && r_deg_<=m_deg_-1 && ttype_>=0 && ttype_ <=3 && wmat_>=0 && wmat_ <=2 && p_exp_ >=0) { factorials.resize(t_deg+1); factorials[0]=1; for(int i=1; i<=t_deg; ++i) factorials[i]=i*factorials[i-1]; exponents.resize(t_deg+1); for(int k=1; k<=t_deg; ++k) switch (ttype) { case Graded: exponents[k] = 1./k; break; case Quasi_Acute: exponents[k] = 1./std::min(k,m_deg-r_deg); break; case Quasi_Acute_Unrefined: exponents[k] = (k<=m_deg-r_deg) ? 1./k : 1./(k-1./p_exp); break; case Quasi_Acute_Proved: exponents[k] = 1./k; break; } } /* void Mc(const double * D, int m_deg, double Mc[3]); void M0(const double * D, int m_deg, double M0[3], const double Mc[3]){NULL;}; void M0(const double * D, int m_deg, double M0[3]){double getMc[3]; Mc(D,m_deg,getMc); M0(D,m_deg,getMc);} void M1(const double * D, int m_deg, double M1[3], const double Mc[3]){NULL;}; void M1(const double * D, int m_deg, double M1[3]){double getMc[3]; Mc(D,m_deg,getMc); M1(D,m_deg,getMc);} void Ms(const double * D, int m_deg, double Ms[3]); */ //void Derivatives(const double DOFt[3], const R2 invHauteur[3], double &fx, double &fy); //void Derivatives(const double DOFt[6], const R2 invHauteur[3], double &fxx, double &fxy, double &fyy); //void Derivatives(const double DOFt[10], const R2 invHauteur[3], double &fxxx, double &fxxy, double &fxyy, double &fyyy); //void Derivatives(const double DOFt[15], const R2 invHauteur[3], double &fxxxx, double &fxxxy, double &fxxyy, double &fxyyy, double &fyyyy); // ********************* Matrices ********************** void TensorK::getMc(const double * D, double Mc[3]) const { Mc[0]=0; Mc[1]=0; Mc[2]=0; for(int i=0; i=0 ? sqrt(c) : 0; //normalement toujours positif s = (Eigen[0]*S[2]-Eigen[1]*S[0])/div; s= s>=0 ? sqrt(s) : 0; //idem s= (Eigen[0]-Eigen[1])*S[1]>0 ? s : -s; } } void TensorK::MakeEigenSym(double S[3], double vap[2], double c, double s){ S[0] = vap[0]*c*c+vap[1]*s*s; S[1] = (vap[0]-vap[1])*c*s; S[2] = vap[0]*s*s+vap[1]*c*c; } void TensorK::AffSym(double S[3], double a, double b){ S[0] = a*S[0]+b; S[1] = a*S[1]; S[2] = a*S[2]+b; } void TensorK::MaxSym(double S[3], double lambda){ double E[2]; EigenSym(S,E); if(lambda <= E[0]) return; if(E[1] <= lambda) {S[0] = lambda; S[1]=0; S[2] = lambda; return;}; AffSym(S, (E[1]-lambda)/(E[1]-E[0]), E[1] * (lambda - E[0])/(E[1] - E[0])); } void TensorK::PowSym(double S[3], double p){ double E[2]; //old eigenvalues EigenSym(S,E); double Ep[2]; //new eigenvalues if(p==-2) {Ep[0]=1/(E[0]*E[0]); Ep[1]=1/(E[1]*E[1]);} else if (p==-0.5) {Ep[0]=1/sqrt(E[0]); Ep[1]=1/sqrt(E[1]);} else {Ep[0]=pow(E[0],p); Ep[1]=pow(E[1],p);} const double diff=E[1]-E[0]; if(diff==0) {S[0]=Ep[0]; S[1]=0; S[2]=Ep[0]; return;} //scalar case AffSym(S,(Ep[1]-Ep[0])/diff, (Ep[0]*E[1]-Ep[1]*E[0])/diff); } // ********************* Derivatives estimation ******************** template<> void TensorK::Derivatives<2>(const std::vector & DOFt, const R2 invHauteur[3], double f[2]) const { f[0] = -DOFt[0]*invHauteur[0].x -DOFt[1]*invHauteur[1].x -DOFt[2]*invHauteur[2].x; f[1]= -DOFt[0]*invHauteur[0].y -DOFt[1]*invHauteur[1].y -DOFt[2]*invHauteur[2].y; } template<> void TensorK::Derivatives<3>(const std::vector & DOFt, const R2 invHauteur[3], double f[3]) const { f[0] = 4*DOFt[0]*invHauteur[0].x*invHauteur[0].x+ 4*DOFt[1]*invHauteur[1].x*invHauteur[1].x+ 4*DOFt[2]*invHauteur[2].x*invHauteur[2].x+ 8*DOFt[3]*invHauteur[1].x*invHauteur[2].x+ 8*DOFt[4]*invHauteur[2].x*invHauteur[0].x+ 8*DOFt[5]*invHauteur[0].x*invHauteur[1].x; //dérivée seconde en x de la fonction P2 sur le triangle d'intérêt. f[1] = 4*DOFt[0]*invHauteur[0].x*invHauteur[0].y+ 4*DOFt[1]*invHauteur[1].x*invHauteur[1].y+ 4*DOFt[2]*invHauteur[2].x*invHauteur[2].y+ 4*DOFt[3]*(invHauteur[1].x*invHauteur[2].y+invHauteur[1].y*invHauteur[2].x)+ 4*DOFt[4]*(invHauteur[2].x*invHauteur[0].y+invHauteur[2].y*invHauteur[0].x)+ 4*DOFt[5]*(invHauteur[0].x*invHauteur[1].y+invHauteur[0].y*invHauteur[1].x); f[2] = 4*DOFt[0]*invHauteur[0].y*invHauteur[0].y+ 4*DOFt[1]*invHauteur[1].y*invHauteur[1].y+ 4*DOFt[2]*invHauteur[2].y*invHauteur[2].y+ 8*DOFt[3]*invHauteur[1].y*invHauteur[2].y+ 8*DOFt[4]*invHauteur[2].y*invHauteur[0].y+ 8*DOFt[5]*invHauteur[0].y*invHauteur[1].y; } template<> void TensorK::Derivatives<4>(const std::vector & DOFt, const R2 invHauteur[3], double f[4]) const { f[0] =-6.*( (9./2.) *DOFt[0] *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x+ (9./2.) *DOFt[1] *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x+ (9./2.) *DOFt[2] *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x+ (27./2.) *DOFt[3] *invHauteur[1].x *invHauteur[1].x *invHauteur[2].x+ (27./2.) *DOFt[4] *invHauteur[1].x *invHauteur[2].x *invHauteur[2].x+ (27./2.) *DOFt[5] *invHauteur[2].x *invHauteur[2].x *invHauteur[0].x+ (27./2.) *DOFt[6] *invHauteur[2].x *invHauteur[0].x *invHauteur[0].x+ (27./2.) *DOFt[7] *invHauteur[0].x *invHauteur[0].x *invHauteur[1].x+ (27./2.) *DOFt[8] *invHauteur[0].x *invHauteur[1].x *invHauteur[1].x+ 27. *DOFt[9] *invHauteur[0].x *invHauteur[1].x *invHauteur[2].x ); f[1] =-6.*( (9./2.) *DOFt[0] *invHauteur[0].x *invHauteur[0].x *invHauteur[0].y+ (9./2.) *DOFt[1] *invHauteur[1].x *invHauteur[1].x *invHauteur[1].y+ (9./2.) *DOFt[2] *invHauteur[2].x *invHauteur[2].x *invHauteur[2].y+ (27./2.) *DOFt[3] *(invHauteur[1].x *invHauteur[1].x *invHauteur[2].y*(1./3.)+ invHauteur[1].y *invHauteur[1].x *invHauteur[2].x*(2./3.))+ (27./2.) *DOFt[4] *(invHauteur[1].x *invHauteur[2].x *invHauteur[2].y*(2./3.)+ invHauteur[1].y *invHauteur[2].x *invHauteur[2].x*(1./3.))+ (27./2.) *DOFt[5] *(invHauteur[2].x *invHauteur[2].x *invHauteur[0].y*(1./3.)+ invHauteur[2].y *invHauteur[2].x *invHauteur[0].x*(2./3.))+ (27./2.) *DOFt[6] *(invHauteur[2].x *invHauteur[0].x *invHauteur[0].y*(2./3.)+ invHauteur[2].y *invHauteur[0].x *invHauteur[0].x*(1./3.))+ (27./2.) *DOFt[7] *(invHauteur[0].x *invHauteur[0].x *invHauteur[1].y*(1./3.)+ invHauteur[0].y *invHauteur[0].x *invHauteur[1].x*(2./3.))+ (27./2.) *DOFt[8] *(invHauteur[0].x *invHauteur[1].x *invHauteur[1].y*(2./3.)+ invHauteur[0].y *invHauteur[1].x *invHauteur[1].x*(1./3.))+ 27. *DOFt[9] *(invHauteur[0].x *invHauteur[1].x *invHauteur[2].y/3.+ invHauteur[0].x *invHauteur[1].y *invHauteur[2].x/3.+ invHauteur[0].y *invHauteur[1].x *invHauteur[2].x/3.) ); f[2] =-6.*( (9./2.) *DOFt[0] *invHauteur[0].x *invHauteur[0].y *invHauteur[0].y+ (9./2.) *DOFt[1] *invHauteur[1].x *invHauteur[1].y *invHauteur[1].y+ (9./2.) *DOFt[2] *invHauteur[2].x *invHauteur[2].y *invHauteur[2].y+ (27./2.) *DOFt[3] *(invHauteur[1].y *invHauteur[1].y *invHauteur[2].x*(1./3.)+ invHauteur[1].x *invHauteur[1].y *invHauteur[2].y*(2./3.))+ (27./2.) *DOFt[4] *(invHauteur[1].y *invHauteur[2].y *invHauteur[2].x*(2./3.)+ invHauteur[1].x *invHauteur[2].y *invHauteur[2].y*(1./3.))+ (27./2.) *DOFt[5] *(invHauteur[2].y *invHauteur[2].y *invHauteur[0].x*(1./3.)+ invHauteur[2].x *invHauteur[2].y *invHauteur[0].y*(2./3.))+ (27./2.) *DOFt[6] *(invHauteur[2].y *invHauteur[0].y *invHauteur[0].x*(2./3.)+ invHauteur[2].x *invHauteur[0].y *invHauteur[0].y*(1./3.))+ (27./2.) *DOFt[7] *(invHauteur[0].y *invHauteur[0].y *invHauteur[1].x*(1./3.)+ invHauteur[0].x *invHauteur[0].y *invHauteur[1].y*(2./3.))+ (27./2.) *DOFt[8] *(invHauteur[0].y *invHauteur[1].y *invHauteur[1].x*(2./3.)+ invHauteur[0].x *invHauteur[1].y *invHauteur[1].y*(1./3.))+ 27. *DOFt[9] *(invHauteur[0].y *invHauteur[1].y *invHauteur[2].x/3.+ invHauteur[0].y *invHauteur[1].x *invHauteur[2].y/3.+ invHauteur[0].x *invHauteur[1].y *invHauteur[2].y/3.) ); f[3] =-6.*( (9./2.) *DOFt[0] *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y+ (9./2.) *DOFt[1] *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y+ (9./2.) *DOFt[2] *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y+ (27./2.) *DOFt[3] *invHauteur[1].y *invHauteur[1].y *invHauteur[2].y+ (27./2.) *DOFt[4] *invHauteur[1].y *invHauteur[2].y *invHauteur[2].y+ (27./2.) *DOFt[5] *invHauteur[2].y *invHauteur[2].y *invHauteur[0].y+ (27./2.) *DOFt[6] *invHauteur[2].y *invHauteur[0].y *invHauteur[0].y+ (27./2.) *DOFt[7] *invHauteur[0].y *invHauteur[0].y *invHauteur[1].y+ (27./2.) *DOFt[8] *invHauteur[0].y *invHauteur[1].y *invHauteur[1].y+ 27. *DOFt[9] *invHauteur[0].y *invHauteur[1].y *invHauteur[2].y ); } template<> void TensorK::Derivatives<5>(const std::vector & DOFt, const R2 invHauteur[3], double f[5]) const { f[0] = (32./3.) *DOFt[0] *24 *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x+ (32./3.) *DOFt[1] *24 *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x+ (32./3.) *DOFt[2] *24 *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x+ (128./3.) *DOFt[3] *24 *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x *invHauteur[2].x+ 64 *DOFt[4] *24 *invHauteur[1].x *invHauteur[1].x *invHauteur[2].x *invHauteur[2].x+ (128./3.) *DOFt[5] *24 *invHauteur[1].x *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x+ (128./3.) *DOFt[6] *24 *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x *invHauteur[0].x+ 64 *DOFt[7] *24 *invHauteur[2].x *invHauteur[2].x *invHauteur[0].x *invHauteur[0].x+ (128./3.) *DOFt[8] *24 *invHauteur[2].x *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x+ (128./3.) *DOFt[9] *24 *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x *invHauteur[1].x+ 64 *DOFt[10] *24 *invHauteur[0].x *invHauteur[0].x *invHauteur[1].x *invHauteur[1].x+ (128./3.) *DOFt[11] *24 *invHauteur[0].x *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x+ 128. *DOFt[12] *24 *invHauteur[0].x *invHauteur[1].x *invHauteur[2].x *invHauteur[2].x+ 128. *DOFt[13] *24 *invHauteur[2].x *invHauteur[0].x *invHauteur[1].x *invHauteur[1].x+ 128. *DOFt[14] *24 *invHauteur[1].x *invHauteur[2].x *invHauteur[0].x *invHauteur[0].x; f[1] = (32./3.) *DOFt[0] *24 *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x *invHauteur[0].y+ (32./3.) *DOFt[1] *24 *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x *invHauteur[1].y+ (32./3.) *DOFt[2] *24 *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x *invHauteur[2].y+ (128./3.) *DOFt[3] *(6 *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x *invHauteur[2].y+ 18*invHauteur[1].x *invHauteur[1].x *invHauteur[1].y *invHauteur[2].x)+ 64 *DOFt[4] *(12*invHauteur[1].x *invHauteur[1].x *invHauteur[2].x *invHauteur[2].y+ 12*invHauteur[1].x *invHauteur[1].y *invHauteur[2].x *invHauteur[2].x)+ (128./3.) *DOFt[5] *(18*invHauteur[1].x *invHauteur[2].x *invHauteur[2].x *invHauteur[2].y+ 6 *invHauteur[1].y *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x)+ (128./3.) *DOFt[6] *(6 *invHauteur[2].x *invHauteur[2].x *invHauteur[2].x *invHauteur[0].y+ 18*invHauteur[2].x *invHauteur[2].x *invHauteur[2].y *invHauteur[0].x)+ 64 *DOFt[7] *(12*invHauteur[2].x *invHauteur[2].x *invHauteur[0].x *invHauteur[0].y+ 12*invHauteur[2].x *invHauteur[2].y *invHauteur[0].x *invHauteur[0].x)+ (128./3.) *DOFt[8] *(18*invHauteur[2].x *invHauteur[0].x *invHauteur[0].x *invHauteur[0].y+ 6 *invHauteur[2].y *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x)+ (128./3.) *DOFt[9] *(6 *invHauteur[0].x *invHauteur[0].x *invHauteur[0].x *invHauteur[1].y+ 18*invHauteur[0].x *invHauteur[0].x *invHauteur[0].y *invHauteur[1].x)+ 64 *DOFt[10] *(12*invHauteur[0].x *invHauteur[0].x *invHauteur[1].x *invHauteur[1].y+ 12*invHauteur[0].x *invHauteur[0].y *invHauteur[1].x *invHauteur[1].x)+ (128./3.) *DOFt[11] *(18*invHauteur[0].x *invHauteur[1].x *invHauteur[1].x *invHauteur[1].y+ 6 *invHauteur[0].y *invHauteur[1].x *invHauteur[1].x *invHauteur[1].x)+ 128. *DOFt[12] *(12*invHauteur[0].x *invHauteur[1].x *invHauteur[2].x *invHauteur[2].y+ 6 *invHauteur[0].x *invHauteur[1].y *invHauteur[2].x *invHauteur[2].x+ 6 *invHauteur[0].y *invHauteur[1].x *invHauteur[2].x *invHauteur[2].x)+ 128. *DOFt[13] *(12*invHauteur[2].x *invHauteur[0].x *invHauteur[1].x *invHauteur[1].y+ 6 *invHauteur[2].x *invHauteur[0].y *invHauteur[1].x *invHauteur[1].x+ 6 *invHauteur[2].y *invHauteur[0].x *invHauteur[1].x *invHauteur[1].x)+ 128. *DOFt[14] *(12*invHauteur[1].x *invHauteur[2].x *invHauteur[0].x *invHauteur[0].y+ 6 *invHauteur[1].x *invHauteur[2].y *invHauteur[0].x *invHauteur[0].x+ 6 *invHauteur[1].y *invHauteur[2].x *invHauteur[0].x *invHauteur[0].x); f[2] = (32./3.) *DOFt[0] *24 *invHauteur[0].x *invHauteur[0].x *invHauteur[0].y *invHauteur[0].y+ (32./3.) *DOFt[1] *24 *invHauteur[1].x *invHauteur[1].x *invHauteur[1].y *invHauteur[1].y+ (32./3.) *DOFt[2] *24 *invHauteur[2].x *invHauteur[2].x *invHauteur[2].y *invHauteur[2].y+ (128./3.) *DOFt[3] *(12*invHauteur[1].x *invHauteur[1].x *invHauteur[1].y *invHauteur[2].y+ 12*invHauteur[1].x *invHauteur[1].y *invHauteur[1].y *invHauteur[2].x)+ 64 *DOFt[4] *(4 *invHauteur[1].x *invHauteur[1].x *invHauteur[2].y *invHauteur[2].y+ 16*invHauteur[1].x *invHauteur[1].y *invHauteur[2].x *invHauteur[2].y+ 4 *invHauteur[1].y *invHauteur[1].y *invHauteur[2].x *invHauteur[2].x)+ (128./3.) *DOFt[5] *(12*invHauteur[1].x *invHauteur[2].x *invHauteur[2].y *invHauteur[2].y+ 12*invHauteur[1].y *invHauteur[2].x *invHauteur[2].x *invHauteur[2].y)+ (128./3.) *DOFt[6] *(12*invHauteur[2].x *invHauteur[2].x *invHauteur[2].y *invHauteur[0].y+ 12*invHauteur[2].x *invHauteur[2].y *invHauteur[2].y *invHauteur[0].x)+ 64 *DOFt[7] *(4 *invHauteur[2].x *invHauteur[2].x *invHauteur[0].y *invHauteur[0].y+ 16*invHauteur[2].x *invHauteur[2].y *invHauteur[0].x *invHauteur[0].y+ 4 *invHauteur[2].y *invHauteur[2].y *invHauteur[0].x *invHauteur[0].x)+ (128./3.) *DOFt[8] *(12*invHauteur[2].x *invHauteur[0].x *invHauteur[0].y *invHauteur[0].y+ 12*invHauteur[2].y *invHauteur[0].x *invHauteur[0].x *invHauteur[0].y)+ (128./3.) *DOFt[9] *(12*invHauteur[0].x *invHauteur[0].x *invHauteur[0].y *invHauteur[1].y+ 12*invHauteur[0].x *invHauteur[0].y *invHauteur[0].y *invHauteur[1].x)+ 64 *DOFt[10] *(4 *invHauteur[0].x *invHauteur[0].x *invHauteur[1].y *invHauteur[1].y+ 16*invHauteur[0].x *invHauteur[0].y *invHauteur[1].x *invHauteur[1].y+ 4 *invHauteur[0].y *invHauteur[0].y *invHauteur[1].x *invHauteur[1].x)+ (128./3.) *DOFt[11] *(12*invHauteur[0].x *invHauteur[1].x *invHauteur[1].y *invHauteur[1].y+ 12*invHauteur[0].y *invHauteur[1].x *invHauteur[1].x *invHauteur[1].y)+ 128. *DOFt[12] *(4 *invHauteur[0].x *invHauteur[1].x *invHauteur[2].y *invHauteur[2].y+ 4 *invHauteur[0].y *invHauteur[1].y *invHauteur[2].x *invHauteur[2].x+ 8 *invHauteur[0].x *invHauteur[1].y *invHauteur[2].x *invHauteur[2].y+ 8 *invHauteur[0].y *invHauteur[1].x *invHauteur[2].x *invHauteur[2].y)+ 128. *DOFt[13] *(4 *invHauteur[2].x *invHauteur[0].x *invHauteur[1].y *invHauteur[1].y+ 4 *invHauteur[2].y *invHauteur[0].y *invHauteur[1].x *invHauteur[1].x+ 8 *invHauteur[2].x *invHauteur[0].y *invHauteur[1].x *invHauteur[1].y+ 8 *invHauteur[2].y *invHauteur[0].x *invHauteur[1].x *invHauteur[1].y)+ 128. *DOFt[14] *(4 *invHauteur[1].x *invHauteur[2].x *invHauteur[0].y *invHauteur[0].y+ 4 *invHauteur[1].y *invHauteur[2].y *invHauteur[0].x *invHauteur[0].x+ 8 *invHauteur[1].x *invHauteur[2].y *invHauteur[0].x *invHauteur[0].y+ 8 *invHauteur[1].y *invHauteur[2].x *invHauteur[0].x *invHauteur[0].y); f[3] = (32./3.) *DOFt[0] *24 *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y *invHauteur[0].x+ (32./3.) *DOFt[1] *24 *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y *invHauteur[1].x+ (32./3.) *DOFt[2] *24 *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y *invHauteur[2].x+ (128./3.) *DOFt[3] *(6 *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y *invHauteur[2].x+ 18*invHauteur[1].y *invHauteur[1].y *invHauteur[1].x *invHauteur[2].y)+ 64 *DOFt[4] *(12*invHauteur[1].y *invHauteur[1].y *invHauteur[2].y *invHauteur[2].x+ 12*invHauteur[1].y *invHauteur[1].x *invHauteur[2].y *invHauteur[2].y)+ (128./3.) *DOFt[5] *(18*invHauteur[1].y *invHauteur[2].y *invHauteur[2].y *invHauteur[2].x+ 6 *invHauteur[1].x *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y)+ (128./3.) *DOFt[6] *(6 *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y *invHauteur[0].x+ 18*invHauteur[2].y *invHauteur[2].y *invHauteur[2].x *invHauteur[0].y)+ 64 *DOFt[7] *(12*invHauteur[2].y *invHauteur[2].y *invHauteur[0].y *invHauteur[0].x+ 12*invHauteur[2].y *invHauteur[2].x *invHauteur[0].y *invHauteur[0].y)+ (128./3.) *DOFt[8] *(18*invHauteur[2].y *invHauteur[0].y *invHauteur[0].y *invHauteur[0].x+ 6 *invHauteur[2].x *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y)+ (128./3.) *DOFt[9] *(6 *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y *invHauteur[1].x+ 18*invHauteur[0].y *invHauteur[0].y *invHauteur[0].x *invHauteur[1].y)+ 64 *DOFt[10] *(12*invHauteur[0].y *invHauteur[0].y *invHauteur[1].y *invHauteur[1].x+ 12*invHauteur[0].y *invHauteur[0].x *invHauteur[1].y *invHauteur[1].y)+ (128./3.) *DOFt[11] *(18*invHauteur[0].y *invHauteur[1].y *invHauteur[1].y *invHauteur[1].x+ 6 *invHauteur[0].x *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y)+ 128. *DOFt[12] *(12*invHauteur[0].y *invHauteur[1].y *invHauteur[2].y *invHauteur[2].x+ 6 *invHauteur[0].y *invHauteur[1].x *invHauteur[2].y *invHauteur[2].y+ 6 *invHauteur[0].x *invHauteur[1].y *invHauteur[2].y *invHauteur[2].y)+ 128. *DOFt[13] *(12*invHauteur[2].y *invHauteur[0].y *invHauteur[1].y *invHauteur[1].x+ 6 *invHauteur[2].y *invHauteur[0].x *invHauteur[1].y *invHauteur[1].y+ 6 *invHauteur[2].x *invHauteur[0].y *invHauteur[1].y *invHauteur[1].y)+ 128. *DOFt[14] *(12*invHauteur[1].y *invHauteur[2].y *invHauteur[0].y *invHauteur[0].x+ 6 *invHauteur[1].y *invHauteur[2].x *invHauteur[0].y *invHauteur[0].y+ 6 *invHauteur[1].x *invHauteur[2].y *invHauteur[0].y *invHauteur[0].y); f[4] = (32./3.) *DOFt[0] *24 *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y+ (32./3.) *DOFt[1] *24 *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y+ (32./3.) *DOFt[2] *24 *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y+ (128./3.) *DOFt[3] *24 *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y *invHauteur[2].y+ 64 *DOFt[4] *24 *invHauteur[1].y *invHauteur[1].y *invHauteur[2].y *invHauteur[2].y+ (128./3.) *DOFt[5] *24 *invHauteur[1].y *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y+ (128./3.) *DOFt[6] *24 *invHauteur[2].y *invHauteur[2].y *invHauteur[2].y *invHauteur[0].y+ 64 *DOFt[7] *24 *invHauteur[2].y *invHauteur[2].y *invHauteur[0].y *invHauteur[0].y+ (128./3.) *DOFt[8] *24 *invHauteur[2].y *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y+ (128./3.) *DOFt[9] *24 *invHauteur[0].y *invHauteur[0].y *invHauteur[0].y *invHauteur[1].y+ 64 *DOFt[10] *24 *invHauteur[0].y *invHauteur[0].y *invHauteur[1].y *invHauteur[1].y+ (128./3.) *DOFt[11] *24 *invHauteur[0].y *invHauteur[1].y *invHauteur[1].y *invHauteur[1].y+ 128. *DOFt[12] *24 *invHauteur[0].y *invHauteur[1].y *invHauteur[2].y *invHauteur[2].y+ 128. *DOFt[13] *24 *invHauteur[2].y *invHauteur[0].y *invHauteur[1].y *invHauteur[1].y+ 128. *DOFt[14] *24 *invHauteur[1].y *invHauteur[2].y *invHauteur[0].y *invHauteur[0].y; } void TensorK::getDerivatives(const std::vector & DOFt, const R2 invHauteur[3], double *f) const { assert(DOFt.size()==((m_deg+1)*m_deg)/2); // [((m+1)*(m+2))/2] switch(m_deg){ case 2: return Derivatives<2>(DOFt, invHauteur, f); case 3: return Derivatives<3>(DOFt, invHauteur, f); case 4: return Derivatives<4>(DOFt, invHauteur, f); case 5: return Derivatives<5>(DOFt, invHauteur, f); } } #endif freefem++-3.38-1/examples++-load/test-ElementMixte.edp000644 000767 000024 00000013453 12274777125 022560 0ustar00hechtstaff000000 000000 load "Element_P4" load "Element_Mixte" macro DD(f,hx,hy) ( (f(x1+hx,y1+hy)-f(x1-hx,y1-hy))/(2*(hx+hy))) // macro dn(f) ( N.x*dx(f)+N.y*dy(f)) // macro ccn(f) ( N.x*f#1+N.y*f#2) // macro cctau(f) ( -N.y*f#1+N.x*f#2) // macro dnn(f) ( N.x*N.x*f#11+2.*N.y*N.x*f#12+ N.y*N.y*f#22) // mesh Th=square(1,1,flags=1);//,[10*(x+y/3),10*(y-x/3)]); Th=trunc(Th,(x+y)<1.1);plot(Th,wait=1); Th=movemesh(Th,[0.1*(x+y/3),0.1*(y-x/3)]); Th=movemesh(Th,[0.1*(x),0.1*(y)]); real x1=0.7,y1=0.9, h=1e-6; int it1=Th(x1,y1).nuTriangle; fespace Zh(Th,P1dc); Zh f11= 1, f12=0, f22=0; fespace Vh(Th,TDNNS1); cout << Vh.ndof << endl; cout << Vh.ndofK << endl; fespace Eh(Th,P0edge); fespace P3h(Th,[P0,P0,P0]); Eh edges; macro SS(a) [a#11,a#12,a#22] // P3h SS(pp); Vh SS(a),SS(b),SS(c); varf vFlux([ax11,ax12,ax22],[e]) = intalledges(Th,qforder=1)( dnn(a)*e*lenEdge); edges=x; cout << " x = " << edges[]<< endl; edges=y; cout << " y = " << edges[]<< endl; real gx=1./3., gy(1./3); for(int j=0; j G " << Vh(0,i) << endl; macro diff(err,dd,c,a,s) { real ddd = int2d(Th) (square( dd(a)-dd(c))) ; cout << " ddd " << s << " : " <1e-10) err++ ;} // int err=0; for (int i=0;i 1e-10) {err1++; cout << j<< " " << i << " err disc " << ddcc << endl; Eh0 eee; eee[]=veeee(0,Eh0); plot(eee,cmm=" jump ",fill=1,wait=1); mesh Tg=trunc(Th,1,split=5); fespace WWh(Tg,P2dc); WWh gu1=u1,gu2=u2; plot([gu1,gu2],wait=1,cmm=" dof "+j+" K=0 ");} w1[][i]-=1; if(w1[].linfty > 1e-10) { w1[][i]+=1;cout << j << " " << i << " diff = " << w1[] << endl;} cout << " ||w - (\delta_ij)_j= || " << w1[].linfty << endl; assert( w1[].linfty < 1e-10); NewMacro diff2(op) int2d(Th)(square(op(u1)-op(U1))+square(op(u2)-op(U2))) EndMacro assert( diff2( 0+ )) ; assert( diff2(dx)) ; assert( diff2(dy)) ; } assert(err1==0); Th=square(5,5,[10*(x+y/3),10*(y-x/3)]); V(u)=[0,0]; V(w)=[0,0]; func p1=2+x+y*2; func uu1 = 1+xx*p1; func uu2 = 2+yy*p1; [u1,u2] = [uu1 ,uu2]; cout << int2d(Th)( square(uu1-u1) )/ Th.area << endl; cout << int2d(Th)( square(uu2-u2) )/Th.area << endl; plot([u1,u2],wait=1); for( int i=0;i " << Vh(0,i) << endl; for (int i=0;i " << Vh(0,i) << endl; for (int i=0;i " << Vh(0,i) << endl; for (int i=0;i " << Vh(0,i) << endl; for (int i=0;i " << Vh(0,i) << endl; for (int i=0;i &maptri ); Mesh3 *Transfo_Mesh2_tetgen_new(const double &precis_mesh, char *switch_tetgen,const Mesh & Th2, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, int &border_only, int &recollement_border, int &point_confondus_ok, const int &label_tet, const map &maptri, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl); Mesh3 * ReconstructionRefine_tetgen(char *switch_tetgen,const Mesh3 & Th3, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl, const double *tsizevol); class Build2D3D_Op : public E_F0mps { public: Expression eTh; Expression xx,yy,zz; static const int n_name_param =13+2; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: Build2D3D_Op(const basicAC_F0 & args,Expression tth) : eTh(tth),xx(0),yy(0),zz(0) { if(verbosity) cout << "construction par BuilLayeMesh_Op" << endl; args.SetNameParam(n_name_param,name_param,nargs); const E_Array * a1=0 ; if(nargs[0]) a1 = dynamic_cast(nargs[0]); int err =0; if(a1) { if(a1->size() !=3) CompileError("Build2D3D (Th,transfo=[X,Y,Z],) "); xx=to( (*a1)[0]); yy=to( (*a1)[1]); zz=to( (*a1)[2]); } if( nargs[2] && nargs[13] ) CompileError("uncompatible movemesh3 (Th, region= , reftet= "); if( nargs[3] && nargs[14] ) CompileError("uncompatible movemesh3 (Th, label= , refface= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type Build2D3D_Op::name_param[]= { { "transfo", &typeid(E_Array)},//0 { "switch", &typeid(string*)}, { "reftet", &typeid(long)}, //2 { "refface", &typeid(KN_)},//3 { "facemerge", &typeid(long)}, { "ptmerge", &typeid(double)}, // nouvelle variable { "nbofholes", &typeid(long)},//6 { "holelist", &typeid(KN_)}, { "nbofregions", &typeid(long)}, { "regionlist", &typeid(KN_)}, { "nboffacetcl", &typeid(long)}, { "facetcl", &typeid(KN_)},//11 // mesure mesh { "mesuremesh", &typeid(long)}, { "region", &typeid(long)}, //13 { "label", &typeid(KN_)}//14 }; class Build2D3D : public OneOperator { public: Build2D3D() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new Build2D3D_Op( args,t[0]->CastTo(args[0]) ); } }; AnyType Build2D3D_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh= GetAny((*eTh)(stack)); ffassert( pTh ); Mesh &Th=*pTh; Mesh *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int neb=Th.neb; // nombre d'aretes fontiere if(verbosity) cout << " Vertex Triangle Border " << nbv<< " "<< nbt << " " << neb << endl; if(verbosity >1) cout <<" ======================= " << endl; if(verbosity >1) cout <<" == Build2D_3D_Op==" << endl; KN zzempty; string stringempty = string("pqaAAYCQ"); string* switch_tet= (arg(1,stack,&stringempty)); int label_tet(arg(2,stack,arg(13,stack,0L))); KN nrf (arg(3,stack,arg(14,stack,zzempty))); int point_confondus_ok(arg(4,stack,0L)); double precis_mesh(arg(5,stack,-1.)); // new parameters KN zdzempty; int nbhole (arg(6,stack,0L)); KN tabhole (arg(7,stack,zdzempty)); int nbregion (arg(8,stack,0L)); KN tabregion (arg(9,stack,zdzempty)); int nbfacecl (arg(10,stack,0L)); KN tabfacecl (arg(11,stack,zdzempty)); if(nbhole && nbhole*3 != tabhole.N()) {ExecError(" nbhole and holes are incompatibale ");} if(!nbhole) nbhole=tabhole.N()/3; // modif FH dec 2010... // mesuremesh parameters int mesureM(arg(12,stack,1L)); int surface_orientation=1; if( mesureM <0 ){ surface_orientation=-1; } if(nbregion==0) nbregion=tabregion.N()/5; if(nbhole==0) nbhole=tabhole.N()/3; if(nbfacecl==0) nbfacecl=tabfacecl.N()/2; // assertion au niveau de la taille ffassert( tabhole.N() == 3*nbhole); ffassert( tabregion.N() == 5*nbregion); ffassert( tabfacecl.N() == 2*nbfacecl); //==================================== // How to change string* into char* //==================================== cout << "string" << switch_tet << endl; size_t size_switch_tet = switch_tet->size()+1; char* switch_tetgen =new char[size_switch_tet]; strncpy(switch_tetgen, switch_tet->c_str(), size_switch_tet); cout << "switch_tetgen=" << switch_tetgen << endl; //exit(1); ffassert( nrf.N() %2 ==0); map mapf; for(int i=0;i mapfme; Transfo_Mesh2_map_face( Th, mapfme ); // Map utilisateur map< int, int > :: iterator imap; for( int ii=0; ii < nrf.N(); ii+=2){ imap = mapfme.find(nrf[ii]); if( imap != mapfme.end()){ imap -> second = nrf[ii+1]; } } //KN txx(nbv), tyy(nbv), tzz(nbv); //KN takemesh(nbv); double *txx=new double[nbv]; double *tyy=new double[nbv]; double *tzz=new double[nbv]; int *takemesh=new int[nbv]; MeshPoint *mp3(MeshPointStack(stack)); for(int ii=0; iisetP(&Th,it,iv); if(xx){ txx[i]=GetAny((*xx)(stack)); } if(yy){ tyy[i]=GetAny((*yy)(stack)); } if(zz){ tzz[i]=GetAny((*zz)(stack)); } takemesh[i] = takemesh[i]+1; } } } delete [] takemesh; int border_only = 0; int recollement_border=1; /* Mesh3 *Th3=Transfo_Mesh2_tetgen( precis_mesh, switch_tetgen, Th, txx, tyy, tzz, border_only, recollement_border, point_confondus_ok, label_tet, mapfme); */ Mesh3 *Th3_tmp = MoveMesh2_func( precis_mesh, Th, txx, tyy, tzz, border_only, recollement_border, point_confondus_ok); /* delete array */ delete [] txx; delete [] tyy; delete [] tzz; /* check orientation of the mesh and flip if necessary*/ Th3_tmp->flipSurfaceMesh3(surface_orientation); int addcheckorientation=0; if( addcheckorientation==1 ){ cout << "check :: orientation des surfaces" << endl; Th3_tmp->BuildBoundaryElementAdj(); cout << "fin check :: orientation des surfaces" << endl; } /* set label of surface Th3_tmp */ for(int ii=0; ii< Th3_tmp->nbe; ii++) { const Triangle3 & K(Th3_tmp->be(ii)); int iv[3]; int lab; iv[0] = Th3_tmp->operator()(K[0]); iv[1] = Th3_tmp->operator()(K[1]); iv[2] = Th3_tmp->operator()(K[2]); map< int, int>:: const_iterator imap; imap = mapfme.find(K.lab); if(imap!= mapfme.end()){ lab=imap->second; } else{ lab=K.lab; } Th3_tmp->be(ii).set( Th3_tmp->vertices, iv, lab ) ; } /* mesh domains with tetgen */ Mesh3 *Th3 = RemplissageSurf3D_tetgen_new( switch_tetgen, *Th3_tmp, label_tet, nbhole, tabhole, nbregion, tabregion, nbfacecl, tabfacecl); /* Mesh3 *Th3=Transfo_Mesh2_tetgen_new( precis_mesh, switch_tetgen, Th, txx, tyy, tzz, border_only, recollement_border, point_confondus_ok, label_tet, mapfme, nbhole, tabhole, nbregion, tabregion, nbfacecl,tabfacecl); */ delete Th3_tmp; //Th3->BuildBound(); // Th3->BuildAdj(); // Th3->Buildbnormalv(); // Th3->BuildjElementConteningVertex(); Th3->BuildGTree(); //Th3->decrement(); Add2StackOfPtr2FreeRC(stack,Th3); delete [] switch_tetgen; *mp=mps; cout << "FreeFem++: End check mesh given by tetgen" << endl; return Th3; } // Fonction pour tetgen // new parameter void mesh3_tetgenio_out(const tetgenio &out, Mesh3 & Th3) { int i; // All indices start from 1. if(out.firstnumber != 1){ cout << " probleme ???" << endl; exit(1); } if(out.numberoffacets !=0){ cout << "tetgen: faces non triangulaire" << endl; exit(1); } if(out.numberofcorners !=4){ cout << "tetgen: element subparametric of order 2" <=0 && iv[jj] = Th3.nv || iv[jj]< 0 ) cout << "iv[jj]=" << iv[jj] << " triangle" << ibe << endl; assert( iv[jj] >=0 && iv[jj] " < 1e-10 ) cout << v[nnv] << " " << v[nnv1] << endl; // } // } // } // cout << "dist entre les points du maillage tetgen" << dist << endl; // } i=0; for(int nnt=0; nnt < out.numberoftetrahedra; nnt++){ int iv[4],lab; iv[0] = out.tetrahedronlist[i]-1; iv[1] = out.tetrahedronlist[i+1]-1; iv[2] = out.tetrahedronlist[i+2]-1; iv[3] = out.tetrahedronlist[i+3]-1; //lab = label_tet; for(int jj=0; jj<4; jj++){ assert( iv[jj] >=0 && iv[jj] < out.numberofpoints ); } //cout << "nnt= " << nnt << " " << lab << " " << out.tetrahedronattributelist[nnt] << endl; lab = out.tetrahedronattributelist[nnt]; //cout << "nnt= " << lab << " " << out.tetrahedronattributelist[nnt] << endl; //Th3.elements[nnt].set( Th3.vertices, iv, lab); (*tt++).set( v, iv, lab); i=i+4; } for(int ibe=0; ibe < out.numberoftrifaces; ibe++){ int iv[3]; iv[0] = out.trifacelist[3*ibe]-1; iv[1] = out.trifacelist[3*ibe+1]-1; iv[2] = out.trifacelist[3*ibe+2]-1; for(int jj=0; jj<3; jj++){ if(iv[jj]>= out.numberofpoints || iv[jj]< 0 ) cout << "iv[jj]=" << iv[jj] << " triangle" << ibe << endl; assert( iv[jj] >=0 && iv[jj] < out.numberofpoints ); } //Th3.be(ibe).set( Th3.vertices, iv, out.trifacemarkerlist[ibe]); (*bb++).set( v, iv, out.trifacemarkerlist[ibe]); } Mesh3 *T_TH3 = new Mesh3(out.numberofpoints, out.numberoftetrahedra, out.numberoftrifaces, v, t, b); cout << "FreeFem++: Check mesh given by tetgen" << endl; //return T_TH3; if( TestElementMesh3(*T_TH3) != 1){ return T_TH3; } else{ //Mesh3 *T2_TH3 = TestElementMesh3_patch( *T_TH3 ); //return T2_TH3; exit(1); } } Mesh3* mesh3_tetgenio_out(const tetgenio &out, const int & label_tet) { int i; // All indices start from 1. if(out.firstnumber != 1){ cout << " probleme ???" << endl; exit(1); } if(out.numberoffacets !=0){ cout << "tetgen: faces non triangulaire" << endl; exit(1); } if(out.numberofcorners !=4){ cout << "tetgen: element subparametric of order 2" <nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; cout << "FreeFem++: End check mesh given by tetgen" << endl; return T_Th3; } Mesh3 * RemplissageSurf3D_tetgen(char *switch_tetgen,const Mesh3 & Th3, const int & label_tet){ //Mesh3 *T_Th3= new Mesh3; assert(Th3.nt == 0 ); int nv_t = Th3.nv; int nt_t = Th3.nt; int nbe_t = Th3.nbe; if(verbosity) cout << "3D RemplissageSurf3D:: Vertex triangle2 border " << nv_t << " "<< nt_t << " " << nbe_t<< endl; // Creation des tableau de tetgen tetgenio in,out; //tetgenio::facet *f; //tetgenio::polygon *p; if(verbosity) cout << " tetgenio: vertex " << endl; int itet,jtet; // All indices start from 1. in.firstnumber = 1; in.numberofpoints = nv_t; in.pointlist = new REAL[in.numberofpoints*3]; in.pointmarkerlist = new int[in.numberofpoints]; itet=0; jtet=0; for(int nnv=0; nnv < nv_t; nnv++) { in.pointlist[itet] = Th3.vertices[nnv].x; in.pointlist[itet+1] = Th3.vertices[nnv].y; in.pointlist[itet+2] = Th3.vertices[nnv].z; in.pointmarkerlist[nnv] = Th3.vertices[nnv].lab; itet=itet+3; } assert(itet==in.numberofpoints*3); if(verbosity) cout << " tetgenio: facet " << endl; // Version avec des facettes in.numberoffacets = nbe_t; in.facetlist = new tetgenio::facet[in.numberoffacets]; in.facetmarkerlist = new int[in.numberoffacets]; for(int ibe=0; ibe < nbe_t; ibe++){ tetgenio::facet *f; tetgenio::polygon *p; f = &in.facetlist[ibe]; f->numberofpolygons = 1; f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; f->numberofholes = 0; f->holelist = NULL; p = &f->polygonlist[0]; p->numberofvertices = 3; p->vertexlist = new int[3]; // creation of elements const Triangle3 & K(Th3.be(ibe)); // const Triangle2 & K(Th2.elements[ii]); // Version Mesh2 p->vertexlist[0] = Th3.operator()(K[0])+1; p->vertexlist[1] = Th3.operator()(K[1])+1; p->vertexlist[2] = Th3.operator()(K[2])+1; for( int kkk=0; kkk<3; kkk++){ assert( p->vertexlist[kkk]<= in.numberofpoints && p->vertexlist[kkk]>0); } in.facetmarkerlist[ibe] = K.lab; } cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; tetrahedralize(switch_tetgen, &in, &out); cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; //mesh3_tetgenio_out( out, label_tet, *T_Th3); Mesh3 *T_Th3 = mesh3_tetgenio_out( out, label_tet); cout <<" Finish Mesh3 tetgen :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; cout << "FreeFem++: End check mesh given by tetgen" << endl; return T_Th3; } Mesh3 * RemplissageSurf3D_tetgen_new(char *switch_tetgen,const Mesh3 & Th3, const int & label_tet, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl){ //Mesh3 *T_Th3= new Mesh3; assert(Th3.nt == 0 ); int nv_t = Th3.nv; int nt_t = Th3.nt; int nbe_t = Th3.nbe; if(verbosity) cout << "3D RemplissageSurf3D:: Vertex triangle2 border " << nv_t << " "<< nt_t << " " << nbe_t<< endl; // Creation des tableau de tetgen tetgenio in,out; //tetgenio::facet *f; //tetgenio::polygon *p; if(verbosity) cout << " tetgenio: vertex " << endl; int itet,jtet; // All indices start from 1. in.firstnumber = 1; in.numberofpoints = nv_t; in.pointlist = new REAL[in.numberofpoints*3]; in.pointmarkerlist = new int[in.numberofpoints]; itet=0; jtet=0; for(int nnv=0; nnv < nv_t; nnv++) { in.pointlist[itet] = Th3.vertices[nnv].x; in.pointlist[itet+1] = Th3.vertices[nnv].y; in.pointlist[itet+2] = Th3.vertices[nnv].z; in.pointmarkerlist[nnv] = Th3.vertices[nnv].lab; itet=itet+3; } assert(itet==in.numberofpoints*3); if(verbosity) cout << " tetgenio: facet " << endl; // Version avec des facettes in.numberoffacets = nbe_t; in.facetlist = new tetgenio::facet[in.numberoffacets]; in.facetmarkerlist = new int[in.numberoffacets]; for(int ibe=0; ibe < nbe_t; ibe++){ tetgenio::facet *f; tetgenio::polygon *p; f = &in.facetlist[ibe]; f->numberofpolygons = 1; f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; f->numberofholes = 0; f->holelist = NULL; p = &f->polygonlist[0]; p->numberofvertices = 3; p->vertexlist = new int[3]; // creation of elements const Triangle3 & K(Th3.be(ibe)); // const Triangle2 & K(Th2.elements[ii]); // Version Mesh2 p->vertexlist[0] = Th3.operator()(K[0])+1; p->vertexlist[1] = Th3.operator()(K[1])+1; p->vertexlist[2] = Th3.operator()(K[2])+1; for( int kkk=0; kkk<3; kkk++){ assert( p->vertexlist[kkk]<= in.numberofpoints && p->vertexlist[kkk]>0); } in.facetmarkerlist[ibe] = K.lab; } // mise a jour des nouvelles variables in.numberofholes = nbhole; in.holelist = new REAL[3*nbhole]; for(int ii=0; ii<3*in.numberofholes; ii++){ in.holelist[ii] = tabhole[ii]; } in.numberofregions = nbregion; in.regionlist = new REAL[5*nbregion]; for(int ii=0; ii<5*in.numberofregions; ii++){ in.regionlist[ii] = tabregion[ii]; } in.numberoffacetconstraints = nbfacecl; in.facetconstraintlist = new REAL[2*in.numberoffacetconstraints]; for(int ii=0; ii<2*in.numberoffacetconstraints; ii++){ in.facetconstraintlist[ii+1] = tabfacecl[ii+1]; } cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; cout << "numberof regions "<< in.numberofregions << endl; cout << "numberof hole "<< in.numberofholes << endl; tetrahedralize(switch_tetgen, &in, &out); cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; //mesh3_tetgenio_out( out, *T_Th3); Mesh3* T_Th3=mesh3_tetgenio_out( out); cout <<" Finish Mesh3 tetgen :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; cout << "FreeFem++: End check mesh given by tetgen" << endl; return T_Th3; } Mesh3 * RemplissageSurf3D_tetgen_new(char *switch_tetgen,const Mesh3 & Th3, const int & label_tet, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl, const int &nbinside, const double *InsidePoint, const int &sizeofmetric, const double *metric){ //Mesh3 *T_Th3= new Mesh3; assert(Th3.nt == 0 ); int nv_t = Th3.nv; int nt_t = Th3.nt; int nbe_t = Th3.nbe; if(verbosity) cout << "3D RemplissageSurf3D:: Vertex triangle2 border " << nv_t << " "<< nt_t << " " << nbe_t<< endl; // Creation des tableau de tetgen tetgenio in,out; tetgenio addin; if(verbosity) cout << " tetgenio: vertex " << endl; int itet,jtet; // All indices start from 1. in.firstnumber = 1; in.numberofpoints = nv_t; in.pointlist = new REAL[in.numberofpoints*3]; in.pointmarkerlist = new int[in.numberofpoints]; itet=0; jtet=0; for(int nnv=0; nnv < nv_t; nnv++) { in.pointlist[itet] = Th3.vertices[nnv].x; in.pointlist[itet+1] = Th3.vertices[nnv].y; in.pointlist[itet+2] = Th3.vertices[nnv].z; in.pointmarkerlist[nnv] = Th3.vertices[nnv].lab; itet=itet+3; } assert(itet==in.numberofpoints*3); // Add inside point if( nbinside ){ cout << "nbinside=" << nbinside << endl; addin.firstnumber = 1; addin.numberofpoints = nbinside; addin.pointlist= new REAL[3*nbinside]; addin.pointmarkerlist = new int[addin.numberofpoints]; for(int nnv=0; nnv < 3*nbinside; nnv++) addin.pointlist[nnv] = InsidePoint[nnv]; for(int nnv=0; nnv < nbinside; nnv++) addin.pointmarkerlist[nnv] = 111; } // Add metric if( sizeofmetric ){ cout << "sizeofmetric=" << sizeofmetric << endl; in.numberofpointmtrs = sizeofmetric; in.pointmtrlist = new REAL[in.numberofpointmtrs*in.numberofpoints]; for(int nnv=0; nnv < in.numberofpointmtrs*in.numberofpoints; nnv++) in.pointmtrlist[nnv]=metric[nnv]; } if(verbosity) cout << " tetgenio: facet " << endl; // Version avec des facettes in.numberoffacets = nbe_t; in.facetlist = new tetgenio::facet[in.numberoffacets]; in.facetmarkerlist = new int[in.numberoffacets]; for(int ibe=0; ibe < nbe_t; ibe++){ tetgenio::facet *f; tetgenio::polygon *p; f = &in.facetlist[ibe]; f->numberofpolygons = 1; f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; f->numberofholes = 0; f->holelist = NULL; p = &f->polygonlist[0]; p->numberofvertices = 3; p->vertexlist = new int[3]; // creation of elements const Triangle3 & K(Th3.be(ibe)); // const Triangle2 & K(Th2.elements[ii]); // Version Mesh2 p->vertexlist[0] = Th3.operator()(K[0])+1; p->vertexlist[1] = Th3.operator()(K[1])+1; p->vertexlist[2] = Th3.operator()(K[2])+1; for( int kkk=0; kkk<3; kkk++){ assert( p->vertexlist[kkk]<= in.numberofpoints && p->vertexlist[kkk]>0); } in.facetmarkerlist[ibe] = K.lab; } // mise a jour des nouvelles variables in.numberofholes = nbhole; in.holelist = new REAL[3*nbhole]; for(int ii=0; ii<3*in.numberofholes; ii++){ in.holelist[ii] = tabhole[ii]; } in.numberofregions = nbregion; in.regionlist = new REAL[5*nbregion]; for(int ii=0; ii<5*in.numberofregions; ii++){ in.regionlist[ii] = tabregion[ii]; } in.numberoffacetconstraints = nbfacecl; in.facetconstraintlist = new REAL[2*in.numberoffacetconstraints]; for(int ii=0; ii<2*in.numberoffacetconstraints; ii++){ in.facetconstraintlist[ii+1] = tabfacecl[ii+1]; } cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; cout << "numberof regions "<< in.numberofregions << endl; cout << "numberof hole "<< in.numberofholes << endl; tetrahedralize(switch_tetgen, &in, &out, &addin); cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; //mesh3_tetgenio_out( out, *T_Th3); Mesh3* T_Th3=mesh3_tetgenio_out( out); cout <<" Finish Mesh3 tetgen :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; cout << "FreeFem++: End check mesh given by tetgen" << endl; return T_Th3; } Mesh3 * Transfo_Mesh2_tetgen(const double &precis_mesh, char *switch_tetgen,const Mesh & Th2, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, int &border_only, int &recollement_border, int &point_confondus_ok, const int &label_tet, const map &maptri ){ //Mesh3 *T_Th3= new Mesh3; int nv_t,nt_t,nbe_t; int* Numero_Som; int* ind_nv_t; int* ind_nt_t; int* ind_nbe_t; int* label_nbe_t; //int i_som; Numero_Som = new int[Th2.nv]; ind_nv_t = new int[Th2.nv]; ind_nbe_t = new int[Th2.nt]; label_nbe_t = new int[Th2.nt]; if(verbosity) cout << "2D: Mesh::Vertex triangle2 border " << Th2.nv << " "<numberofpolygons = 1; f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; f->numberofholes = 0; f->holelist = NULL; p = &f->polygonlist[0]; p->numberofvertices = 3; p->vertexlist = new int[3]; int & ii=ind_nbe_t[ibe]; // creation of elements const Mesh::Triangle & K(Th2.t(ii)); // const Triangle2 & K(Th2.elements[ii]); // Version Mesh2 p->vertexlist[0] = Numero_Som[ Th2.operator()(K[0]) ]+1; p->vertexlist[1] = Numero_Som[ Th2.operator()(K[1]) ]+1; p->vertexlist[2] = Numero_Som[ Th2.operator()(K[2]) ]+1; for( int kkk=0; kkk<3; kkk++){ assert( p->vertexlist[kkk]<= in.numberofpoints && p->vertexlist[kkk]> 0); } map< int, int>:: const_iterator imap; imap = maptri.find(K.lab); // imap= maptri.find( label_nbe_t[ibe] ); assert( imap != maptri.end()); in.facetmarkerlist[ibe] = imap->second; // K.lab; // before } cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; tetrahedralize(switch_tetgen, &in, &out); cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; //mesh3_tetgenio_out( out, label_tet, *T_Th3); Mesh3 *T_Th3=mesh3_tetgenio_out( out, label_tet); cout <<" Finish Mesh3 :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; delete [] Numero_Som; delete [] ind_nv_t; delete [] ind_nbe_t; delete [] label_nbe_t; cout << "FreeFem++: End check mesh given by tetgen" << endl; return T_Th3; } Mesh3 * Transfo_Mesh2_tetgen_new(const double &precis_mesh, char *switch_tetgen,const Mesh & Th2, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, int &border_only, int &recollement_border, int &point_confondus_ok, const int &label_tet, const map &maptri, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl){ //Mesh3 *T_Th3= new Mesh3; int nv_t,nt_t,nbe_t; int* Numero_Som; int* ind_nv_t; int* ind_nt_t; int* ind_nbe_t; int* label_nbe_t; //int i_som; Numero_Som = new int[Th2.nv]; ind_nv_t = new int[Th2.nv]; ind_nbe_t = new int[Th2.nt]; label_nbe_t = new int[Th2.nt]; if(verbosity) cout << "2D: Mesh::Vertex triangle2 border " << Th2.nv << " "<numberofpolygons = 1; f->polygonlist = new tetgenio::polygon[f->numberofpolygons]; f->numberofholes = 0; f->holelist = NULL; p = &f->polygonlist[0]; p->numberofvertices = 3; p->vertexlist = new int[3]; int & ii=ind_nbe_t[ibe]; // creation of elements const Mesh::Triangle & K(Th2.t(ii)); // const Triangle2 & K(Th2.elements[ii]); // Version Mesh2 p->vertexlist[0] = Numero_Som[ Th2.operator()(K[0]) ]+1; p->vertexlist[1] = Numero_Som[ Th2.operator()(K[1]) ]+1; p->vertexlist[2] = Numero_Som[ Th2.operator()(K[2]) ]+1; for( int kkk=0; kkk<3; kkk++){ assert( p->vertexlist[kkk]<= in.numberofpoints && p->vertexlist[kkk]> 0); } map< int, int>:: const_iterator imap; imap = maptri.find(K.lab); // imap= maptri.find( label_nbe_t[ibe] ); assert( imap != maptri.end()); in.facetmarkerlist[ibe] = imap->second; // K.lab; // before } // mise a jour des nouvelles variables in.numberofholes = nbhole; in.holelist = new REAL[3*nbhole]; for(int ii=0; ii<3*in.numberofholes; ii++){ in.holelist[ii] = tabhole[ii]; } in.numberofregions = nbregion; in.regionlist = new REAL[5*nbregion]; for(int ii=0; ii<5*in.numberofregions; ii++){ in.regionlist[ii] = tabregion[ii]; } in.numberoffacetconstraints = nbfacecl; in.facetconstraintlist = new REAL[2*in.numberoffacetconstraints]; for(int ii=0; ii<2*in.numberoffacetconstraints; ii++){ in.facetconstraintlist[ii+1] = tabfacecl[ii+1]; } cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; tetrahedralize(switch_tetgen, &in, &out); cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; //mesh3_tetgenio_out( out, *T_Th3); Mesh3 *T_Th3=mesh3_tetgenio_out( out); cout <<" Finish Mesh3 :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; delete [] Numero_Som; delete [] ind_nv_t; delete [] ind_nbe_t; delete [] label_nbe_t; cout << "FreeFem++: End check mesh given by tetgen" << endl; return T_Th3; } // Fonction Refine avec tetgen Mesh3 * ReconstructionRefine_tetgen(char *switch_tetgen,const Mesh3 & Th3, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl, const double *tsizevol){ // verif option refine int i; assert(Th3.nt != 0 ); { size_t testr, testp; int lenswitch; const char* test_tetgen = switch_tetgen; testr = strcspn(test_tetgen,"r"); testp = strcspn(test_tetgen,"p"); if( testr == strlen(test_tetgen) ) { cout << "The option 'r' of tetgen is not used" << endl; exit(1); } testp = strcspn(test_tetgen,"p"); if( testp != strlen(test_tetgen) ) { cout << "With TetGen :: the option 'p' is not possible to use with option 'r' " << endl; exit(1); } } int nv_t = Th3.nv; int nt_t = Th3.nt; int nbe_t = Th3.nbe; if(verbosity) cout << "3D RemplissageSurf3D:: Vertex triangle2 border " << nv_t << " "<< nt_t << " " << nbe_t<< endl; // Creation des tableau de tetgen tetgenio in,out; //tetgenio::facet *f; //tetgenio::polygon *p; if(verbosity) cout << " tetgenio: vertex " << endl; int itet,jtet; // All indices start from 1. in.firstnumber = 1; in.numberofpoints = nv_t; in.pointlist = new REAL[in.numberofpoints*3]; in.pointmarkerlist = new int[in.numberofpoints]; itet=0; jtet=0; for(int nnv=0; nnv < nv_t; nnv++) { in.pointlist[itet] = Th3.vertices[nnv].x; in.pointlist[itet+1] = Th3.vertices[nnv].y; in.pointlist[itet+2] = Th3.vertices[nnv].z; in.pointmarkerlist[nnv] = Th3.vertices[nnv].lab; itet=itet+3; } assert(itet==in.numberofpoints*3); // Tetrahedrons if(verbosity) cout << "tetrahedrons" << endl; in.numberofcorners = 4; in.numberoftetrahedra = Th3.nt; in.tetrahedronlist = new int[in.numberofcorners*in.numberoftetrahedra]; in.numberoftetrahedronattributes = 1; in.tetrahedronattributelist = new REAL[in.numberoftetrahedronattributes*in.numberoftetrahedra]; in.tetrahedronvolumelist = new REAL[in.numberoftetrahedra]; i=0; for(int nnt=0; nnt < Th3.nt; nnt++){ const Tet & K(Th3.elements[nnt]); in.tetrahedronlist[i] = Th3.operator()(K[0])+1; in.tetrahedronlist[i+1] = Th3.operator()(K[1])+1; in.tetrahedronlist[i+2] = Th3.operator()(K[2])+1; in.tetrahedronlist[i+3] = Th3.operator()(K[3])+1; in.tetrahedronvolumelist[nnt] = tsizevol[nnt]; in.tetrahedronattributelist[nnt] = K.lab; i=i+4; } if(verbosity) cout << "lecture des facettes" << endl; in.numberoftrifaces = Th3.nbe; in.trifacelist = new int[3*in.numberoftrifaces]; in.trifacemarkerlist = new int[in.numberoftrifaces]; for(int ibe=0; ibe < Th3.nbe; ibe++){ const Triangle3 & K(Th3.be(ibe)); in.trifacelist[3*ibe] = Th3.operator()(K[0])+1; in.trifacelist[3*ibe+1] = Th3.operator()(K[1])+1; in.trifacelist[3*ibe+2] = Th3.operator()(K[2])+1; in.trifacemarkerlist[ibe] = K.lab; } // mise a jour des nouvelles variables in.numberofholes = nbhole; in.holelist = new REAL[3*nbhole]; for(int ii=0; ii<3*in.numberofholes; ii++){ in.holelist[ii] = tabhole[ii]; if(verbosity) cout << "in.holelist[ii]=" << in.holelist[ii] << endl; } in.numberofregions = nbregion; in.regionlist = new REAL[5*nbregion]; for(int ii=0; ii<5*in.numberofregions; ii++){ in.regionlist[ii] = tabregion[ii]; if(verbosity) cout << "in.regionlist[ii]=" << in.regionlist[ii] << endl; } in.numberoffacetconstraints = nbfacecl; in.facetconstraintlist = new REAL[2*in.numberoffacetconstraints]; for(int ii=0; ii<2*in.numberoffacetconstraints; ii++){ in.facetconstraintlist[ii+1] = tabfacecl[ii+1]; } if(verbosity > 0){ cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; cout << "numberof regions "<< in.numberofregions << endl; cout << "numberof hole "<< in.numberofholes << endl; } tetrahedralize(switch_tetgen, &in, &out); if(verbosity > 0) cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; Mesh3 *T_Th3=mesh3_tetgenio_out( out); if(verbosity > 0){ cout <<" Finish Mesh3 tetgen :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; cout << "FreeFem++: End check mesh given by tetgen" << endl; } return T_Th3; } // Fonction Refine avec tetgen l'aide d'une metrique Mesh3 * ReconstructionRefine_tetgen(char *switch_tetgen,const Mesh3 & Th3, const int &nbhole, const double *tabhole, const int & nbregion, const double *tabregion, const int &nbfacecl, const double *tabfacecl, const double *tsizevol, const int &sizeofmetric, const double *metric){ // verif option refine int i; assert(Th3.nt != 0 ); { size_t testr, testp; int lenswitch; const char* test_tetgen = switch_tetgen; testr = strcspn(test_tetgen,"r"); testp = strcspn(test_tetgen,"p"); if( testr == strlen(test_tetgen) ) { cout << "The option 'r' of tetgen is not used" << endl; exit(1); } testp = strcspn(test_tetgen,"p"); if( testp != strlen(test_tetgen) ) { cout << "With TetGen :: the option 'p' is not possible to use with option 'r' " << endl; exit(1); } } int nv_t = Th3.nv; int nt_t = Th3.nt; int nbe_t = Th3.nbe; if(verbosity) cout << "3D RemplissageSurf3D:: Vertex triangle2 border " << nv_t << " "<< nt_t << " " << nbe_t<< endl; // Creation des tableau de tetgen tetgenio in,out; //tetgenio::facet *f; //tetgenio::polygon *p; if(verbosity) cout << " tetgenio: vertex " << endl; int itet,jtet; // All indices start from 1. in.firstnumber = 1; in.numberofpoints = nv_t; in.pointlist = new REAL[in.numberofpoints*3]; in.pointmarkerlist = new int[in.numberofpoints]; itet=0; jtet=0; for(int nnv=0; nnv < nv_t; nnv++) { in.pointlist[itet] = Th3.vertices[nnv].x; in.pointlist[itet+1] = Th3.vertices[nnv].y; in.pointlist[itet+2] = Th3.vertices[nnv].z; in.pointmarkerlist[nnv] = Th3.vertices[nnv].lab; itet=itet+3; } assert(itet==in.numberofpoints*3); if( verbosity ) cout << "sizeofmetric=" << sizeofmetric << endl; in.numberofpointmtrs = sizeofmetric; in.pointmtrlist = new REAL[in.numberofpointmtrs*in.numberofpoints]; for(int nnv=0; nnv < in.numberofpointmtrs*in.numberofpoints; nnv++) in.pointmtrlist[nnv]=metric[nnv]; // Tetrahedrons if(verbosity) cout << "tetrahedrons" << endl; in.numberofcorners = 4; in.numberoftetrahedra = Th3.nt; in.tetrahedronlist = new int[in.numberofcorners*in.numberoftetrahedra]; in.numberoftetrahedronattributes = 1; in.tetrahedronattributelist = new REAL[in.numberoftetrahedronattributes*in.numberoftetrahedra]; in.tetrahedronvolumelist = new REAL[in.numberoftetrahedra]; i=0; for(int nnt=0; nnt < Th3.nt; nnt++){ const Tet & K(Th3.elements[nnt]); in.tetrahedronlist[i] = Th3.operator()(K[0])+1; in.tetrahedronlist[i+1] = Th3.operator()(K[1])+1; in.tetrahedronlist[i+2] = Th3.operator()(K[2])+1; in.tetrahedronlist[i+3] = Th3.operator()(K[3])+1; in.tetrahedronvolumelist[nnt] = tsizevol[nnt]; in.tetrahedronattributelist[nnt] = K.lab; i=i+4; } if(verbosity) cout << "lecture des facettes" << endl; in.numberoftrifaces = Th3.nbe; in.trifacelist = new int[3*in.numberoftrifaces]; in.trifacemarkerlist = new int[in.numberoftrifaces]; for(int ibe=0; ibe < Th3.nbe; ibe++){ const Triangle3 & K(Th3.be(ibe)); in.trifacelist[3*ibe] = Th3.operator()(K[0])+1; in.trifacelist[3*ibe+1] = Th3.operator()(K[1])+1; in.trifacelist[3*ibe+2] = Th3.operator()(K[2])+1; in.trifacemarkerlist[ibe] = K.lab; } // mise a jour des nouvelles variables in.numberofholes = nbhole; in.holelist = new REAL[3*nbhole]; for(int ii=0; ii<3*in.numberofholes; ii++){ in.holelist[ii] = tabhole[ii]; if(verbosity) cout << "in.holelist[ii]=" << in.holelist[ii] << endl; } in.numberofregions = nbregion; in.regionlist = new REAL[5*nbregion]; for(int ii=0; ii<5*in.numberofregions; ii++){ in.regionlist[ii] = tabregion[ii]; if(verbosity) cout << "in.regionlist[ii]=" << in.regionlist[ii] << endl; } in.numberoffacetconstraints = nbfacecl; in.facetconstraintlist = new REAL[2*in.numberoffacetconstraints]; for(int ii=0; ii<2*in.numberoffacetconstraints; ii++){ in.facetconstraintlist[ii+1] = tabfacecl[ii+1]; } if(verbosity > 0){ cout << "tetgen: before tetrahedralize( , &in, &out);" << endl; cout << "numberof regions "<< in.numberofregions << endl; cout << "numberof hole "<< in.numberofholes << endl; } tetrahedralize(switch_tetgen, &in, &out); if(verbosity > 0) cout << "tetgen: after tetrahedralize( , &in, &out);" << endl; Mesh3 *T_Th3=mesh3_tetgenio_out( out); if(verbosity > 0){ cout <<" Finish Mesh3 tetgen :: Vertex, Element, Border" << T_Th3->nv << " "<< T_Th3->nt << " " << T_Th3->nbe << endl; cout << "FreeFem++: End check mesh given by tetgen" << endl; } return T_Th3; } // declaration pour FreeFem++ class Remplissage_Op : public E_F0mps { public: //typedef pmesh3 Result; Expression eTh; // Surface mesh // ==================== // This parameter allow to add inside points of this initial volume mesh Expression eVolTh; bool bVol; // ==================== static const int n_name_param =9+2+1+1; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a ) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: Remplissage_Op(const basicAC_F0 & args,Expression tth) : eTh(tth) { if(verbosity >1) cout << "Remplissage du bord" << endl; args.SetNameParam(n_name_param,name_param,nargs); if( nargs[2] && nargs[9] ) CompileError("uncompatible movemesh3 (Th, region= , reftet= "); if( nargs[3] && nargs[10] ) CompileError("uncompatible movemesh3 (Th, label= , refface= "); bVol=false; /* if( BCastTo(args[1]) ){ eVolTh = CastTo(args[1]); bVol=true; } else{ bVol=false; } */ } Remplissage_Op(const basicAC_F0 & args,Expression tth, Expression vth) : eTh(tth),eVolTh(vth) { if(verbosity >1) cout << "Remplissage du bord" << endl; args.SetNameParam(n_name_param,name_param,nargs); if( nargs[2] && nargs[9] ) CompileError("uncompatible movemesh3 (Th, region= , reftet= "); if( nargs[3] && nargs[10] ) CompileError("uncompatible movemesh3 (Th, label= , refface= "); bVol=true; } /* static ArrayOfaType typeargs() { return ArrayOfaType( atype(),true ); }// all type static E_F0 * f(const basicAC_F0 & args) { return new Remplissage_Op(args);} operator aType () const { return atype();} */ AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type Remplissage_Op::name_param[]= { { "switch", &typeid(string*)}, { "reftet", &typeid(long)}, //1 { "refface", &typeid(KN_ )},//2 // new parmameters { "nbofholes", &typeid(long)}, { "holelist", &typeid(KN_)}, { "nbofregions", &typeid(long)}, { "regionlist", &typeid(KN_)}, { "nboffacetcl", &typeid(long)}, { "facetcl", &typeid(KN_)}, { "region", &typeid(long)}, //9 { "label", &typeid(KN_)},//10 { "addpointlist", &typeid(KN_)}, // 11 { "metric", &typeid(KN_)} }; class Remplissage : public OneOperator { public: Remplissage() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new Remplissage_Op( args,t[0]->CastTo(args[0]) ); } }; class RemplissageAddPoint : public OneOperator { public: RemplissageAddPoint() : OneOperator(atype(),atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new Remplissage_Op( args,t[0]->CastTo(args[0]),t[1]->CastTo(args[1]) ); } }; AnyType Remplissage_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); ffassert( pTh ); Mesh3 &Th=*pTh; Mesh3 *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.nbe; // nombre d'aretes fontiere cout << "Tetgen : Vertex Triangle Border " << nbv<< " "<< nbt << " nbe "<< nbe << endl; KN zzempty; //int intempty=0; string stringempty= string("pqaAAYQC"); string* switch_tet(arg(0,stack,&stringempty)); int label_tet(arg(1,stack,arg(9,stack,0L))); KN nrf (arg(2,stack,arg(10,stack,zzempty))); // new parameters KN zdzempty; int nbhole (arg(3,stack,0L)); KN tabhole (arg(4,stack,zdzempty)); int nbregion (arg(5,stack,0L)); KN tabregion (arg(6,stack,zdzempty)); int nbfacecl (arg(7,stack,0L)); KN tabfacecl (arg(8,stack,zdzempty)); // parameter inside point // need to add "i" to the switch KN InsidePoint(arg(11,stack,zdzempty)); // Add inside point in the volume mesh generated by tetgen // need to add "m" to the switch KN metric(arg(12,stack,zdzempty)); // Add metric for tetgen //========================= // Add a metric int sizeofmetric= metric.N()/Th.nv; if( nargs[12] ){ cout << " size of the metric " << metric.N()/Th.nv << endl; assert( (metric.N()/Th.nv)*Th.nv == metric.N() ); } // fin add a metric //========================== //========================== // Add inside points if( nargs[11] ) assert( ((InsidePoint.N()/3)*3) == InsidePoint.N() ); // case with a inside meshes if( bVol ){ // Inside point is given by a mesh Mesh3 *pvolTh = GetAny((*eVolTh)(stack)); Mesh3 &volTh=*pvolTh; KN takevertex(volTh.nv); takevertex = 1; // determination of vertices in the border for(int ibe=0; ibesize()+1; char* switch_tetgen =new char[size_switch_tet]; strncpy(switch_tetgen, switch_tet->c_str(), size_switch_tet); cout << "char" << switch_tetgen << endl; ffassert( nrf.N() %2 ==0); map mapf; for(int i=0;i1) cout << "tetgen:" << "nbhole=" << nbhole << "nbregion=" << nbregion << endl; /* int addcheckorientation=0; if( addcheckorientation==1 ){ cout << "check :: orientation des surfaces" << endl; Th.BuildBoundaryElementAdj(); cout << "fin check :: orientation des surfaces" << endl; } */ int nbinside=InsidePoint.N()/3; Mesh3 *Th3 = 0; if( nargs[11] || nargs[12] || bVol){ Th3 = RemplissageSurf3D_tetgen_new( switch_tetgen, Th, label_tet, nbhole, tabhole, nbregion, tabregion, nbfacecl, tabfacecl, nbinside, InsidePoint, sizeofmetric, metric); // delete multiple vertex Th3->TrueVertex(); } else Th3 = RemplissageSurf3D_tetgen_new( switch_tetgen, Th, label_tet, nbhole, tabhole, nbregion, tabregion, nbfacecl, tabfacecl); cout << "finish tetgen " << endl; // changement de label if( nrf.N() > 0){ cout << "changement de label" << endl; for(int ii=0; ii< Th3->nbe; ii++){ const Triangle3 & K(Th3->be(ii)); int lab; int iv[3]; iv[0] = Th3->operator()(K[0]); iv[1] = Th3->operator()(K[1]); iv[2] = Th3->operator()(K[2]); map< int, int> :: const_iterator imap; imap = mapf.find(K.lab); if( imap != mapf.end() ){ lab = imap -> second; } else{ lab = K.lab; } Th3->be(ii).set(Th3->vertices,iv,lab); } } cout << "action sur le maillage" << endl; // Th3->BuildBound(); // Th3->BuildAdj(); // Th3->Buildbnormalv(); // Th3->BuildjElementConteningVertex(); Th3->BuildGTree(); //Th3->decrement(); Add2StackOfPtr2FreeRC(stack,Th3); *mp=mps; delete [] switch_tetgen; cout << "FreeFem++: End check mesh given by tetgen" << endl; return Th3; } // Refine et Recontruction class ReconstructionRefine_Op : public E_F0mps { public: Expression eTh; static const int n_name_param =10+2+1; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a ) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: ReconstructionRefine_Op(const basicAC_F0 & args,Expression tth) : eTh(tth) { if(verbosity >1) cout << "ReconstructionRefine du bord"<< endl; args.SetNameParam(n_name_param,name_param,nargs); if( nargs[2] && nargs[10] ) CompileError("uncompatible ... (Th, region= , reftet= "); if( nargs[3] && nargs[11] ) CompileError("uncompatible ... (Th, label= , refface= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type ReconstructionRefine_Op::name_param[]= { { "switch", &typeid(string*)}, { "reftet", &typeid(KN_)}, { "refface", &typeid(KN_ )}, // new parmameters { "nbofholes", &typeid(long)}, { "holelist", &typeid(KN_)}, { "nbofregions", &typeid(long)}, { "regionlist", &typeid(KN_)}, { "nboffacetcl", &typeid(long)}, { "facetcl", &typeid(KN_)}, { "sizeofvolume", &typeid(double)}, { "region", &typeid(KN_)}, //10 { "label", &typeid(KN_)},//11 { "metric", &typeid(KN_)}//12 // parameter for tetgen }; class ReconstructionRefine : public OneOperator { public: ReconstructionRefine() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new ReconstructionRefine_Op( args, t[0]->CastTo(args[0]) ); } }; AnyType ReconstructionRefine_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); //double msvol= GetAny((*maxvol)(stack)); ffassert( pTh ); Mesh3 &Th=*pTh; Mesh3 *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.nbe; // nombre d'aretes fontiere cout << "refine tetgen: Vertex Triangle Border " << nbv<< " "<< nbt << " "<< nbe << endl; KN zzempty; //int intempty=0; string stringempty= string("rqaAAYQC"); string* switch_tet(arg(0,stack,&stringempty)); KN nrtet(arg(1,stack,arg(10,stack,zzempty))); KN nrf (arg(2,stack,arg(11,stack,zzempty))); // new parameters KN zdzempty; int nbhole (arg(3,stack,0L)); KN tabhole (arg(4,stack,zdzempty)); int nbregion (arg(5,stack,0L)); KN tabregion (arg(6,stack,zdzempty)); int nbfacecl (arg(7,stack,0L)); KN tabfacecl (arg(8,stack,zdzempty)); KN metric(arg(12,stack,zdzempty)); // Add metric for tetgen //========================= // Add a metric int sizeofmetric = metric.N()/Th.nv; if( nargs[12] ){ cout << " size of the metric " << metric.N()/Th.nv << endl; assert( (metric.N()/Th.nv)*Th.nv == metric.N() ); } // fin add a metric //========================== if(nbregion==0) nbregion=tabregion.N()/5; if(nbhole==0) nbhole=tabhole.N()/3; if(nbfacecl==0) nbfacecl=tabfacecl.N()/2; // assertion au niveau de la taille ffassert( tabhole.N() == 3*nbhole); ffassert( tabregion.N() == 5*nbregion); ffassert( tabfacecl.N() == 2*nbfacecl); //==================================== // How to change string* into char* //==================================== size_t size_switch_tet = switch_tet->size()+1; char* switch_tetgen =new char[size_switch_tet]; strncpy(switch_tetgen, switch_tet->c_str(), size_switch_tet); ffassert( nrf.N() %2 ==0); map mapf; for(int i=0;i maptet; for(int i=0;i tsizevol(nbt); MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); for (int it=0; itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); if( nargs[9]){ tsizevol[it]= GetAny< double >( (*nargs[9])(stack) ); } else if(tabregion.N()==0){ for(int i=0; i< nbregion;i++){ if( K.lab == tabregion[3+5*i] ){ tsizevol[it] = tabregion[4+5*i]; } } } else{ tsizevol[it] = K.mesure(); } } cout << "Before reconstruction:" << " nbhole=" << nbhole << " nbregion=" << nbregion << endl; Mesh3 *Th3=0; int RefineMethod=-1; if( nargs[9] ) RefineMethod=1; if( nargs[12] ) RefineMethod=0; // Add parameter "perhaps' with add a metric which defined sizeofvolume if( RefineMethod == 1) Th3 = ReconstructionRefine_tetgen(switch_tetgen, Th, nbhole, tabhole, nbregion, tabregion, nbfacecl,tabfacecl,tsizevol); else if( RefineMethod == 0) Th3 = ReconstructionRefine_tetgen(switch_tetgen, Th, nbhole, tabhole, nbregion, tabregion, nbfacecl,tabfacecl,tsizevol,sizeofmetric,metric); else{ cerr << " We can't refine the initial mesh with tetgen. No sizeofvolume or metric is given " << endl; exit(1); } cout << "finish reconstruction " << endl; // changement de label 1 if( nrtet.N() > 0){ for(int ii=0; ii< Th3->nt; ii++){ const Tet & K(Th3->elements[ii]); int lab; int iv[4]; iv[0] = Th3->operator()(K[0]); iv[1] = Th3->operator()(K[1]); iv[2] = Th3->operator()(K[2]); iv[3] = Th3->operator()(K[3]); map< int, int> :: const_iterator imap; imap = maptet.find(K.lab); if( imap != maptet.end() ){ lab = imap -> second; } else{ lab = K.lab; } Th3->elements[ii].set(Th3->vertices,iv,lab); } } if( nrf.N() > 0){ for(int ii=0; ii< Th3->nbe; ii++){ const Triangle3 & K(Th3->be(ii)); int lab; int iv[3]; iv[0] = Th3->operator()(K[0]); iv[1] = Th3->operator()(K[1]); iv[2] = Th3->operator()(K[2]); map< int, int> :: const_iterator imap; imap = mapf.find(K.lab); if( imap != mapf.end() ){ lab = imap -> second; } else{ lab = K.lab; } Th3->be(ii).set(Th3->vertices,iv,lab); } } //cout << "fin du changement de label " << endl; // Th3->BuildBound(); // Th3->BuildAdj(); // Th3->Buildbnormalv(); // Th3->BuildjElementConteningVertex(); Th3->BuildGTree(); //Th3->decrement(); Add2StackOfPtr2FreeRC(stack,Th3); delete [] switch_tetgen; *mp=mps; cout << "FreeFem++: End check mesh given by tetgen" << endl; return Th3; } // ConvexHull3D_tetg_Op class ConvexHull3D_tetg_Op : public E_F0mps { public: Expression numofpts; Expression xx,yy,zz; static const int n_name_param =5; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a ) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: ConvexHull3D_tetg_Op(const basicAC_F0 & args, Expression nop, Expression ffxx, Expression ffyy, Expression ffzz ) : numofpts(nop), xx(ffxx), yy(ffyy), zz(ffzz) { if(verbosity) cout << "Convex Hull with TetGen" << endl; args.SetNameParam(n_name_param,name_param,nargs); if( nargs[2] && nargs[3] ) CompileError("uncompatible ... (Th, region= , reftet= "); if( nargs[3] && nargs[4] ) CompileError("uncompatible ... (Th, label= , refface= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type ConvexHull3D_tetg_Op::name_param[]= { { "switch", &typeid(string*)}, { "reftet", &typeid(long)}, { "refface", &typeid(long)}, { "region", &typeid(long)}, { "label", &typeid(long)} }; class ConvexHull3D_tetg : public OneOperator { public: ConvexHull3D_tetg() : OneOperator( atype(), atype(), atype< KN_ >(), atype< KN_ >(), atype< KN_ >() ) {} E_F0 * code(const basicAC_F0 & args) const { return new ConvexHull3D_tetg_Op( args,t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]) ); } }; AnyType ConvexHull3D_tetg_Op::operator()(Stack stack) const { int nbv = (int) GetAny((*numofpts)(stack)); KN cxx(nbv),cyy(nbv),czz(nbv); cxx = GetAny< KN > ((*xx)(stack)); cyy = GetAny< KN > ((*yy)(stack)); czz = GetAny< KN > ((*zz)(stack)); assert( cxx.N() == nbv ); assert( cyy.N() == nbv ); assert( czz.N() == nbv ); KN zzempty; //int intempty=0; string stringempty= string("YqaAAQC"); string* switch_tet(arg(0,stack,&stringempty)); int label_tet(arg(1,stack,arg(3,stack,0L))); int label_face(arg(2,stack,arg(4,stack,1L))); //==================================== // How to change string* into char* //==================================== size_t size_switch_tet = switch_tet->size()+1; char* switch_tetgen =new char[size_switch_tet]; strncpy(switch_tetgen, switch_tet->c_str(), size_switch_tet); //====================================== Mesh3 *Th3 = Convexhull_3Dpoints ( switch_tetgen, nbv, cxx, cyy, czz, label_tet, label_face ); // Th3->BuildBound(); // Th3->BuildAdj(); // Th3->Buildbnormalv(); // Th3->BuildjElementConteningVertex(); Th3->BuildGTree(); //Th3->decrement(); Add2StackOfPtr2FreeRC(stack,Th3); delete [] switch_tetgen; cout << "FreeFem++: End check mesh given by tetgen" << endl; return Th3; } // ConvexHull3D_tetg_file_Op class ConvexHull3D_tetg_file_Op: public E_F0mps { public: Expression filename; static const int n_name_param =5; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a ) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: ConvexHull3D_tetg_file_Op(const basicAC_F0 & args, Expression zfilename ) : filename(zfilename) { if(verbosity) cout << "Convex Hull with TetGen" << endl; args.SetNameParam(n_name_param,name_param,nargs); if( nargs[1] && nargs[3] ) CompileError("uncompatible ... (Th, region= , reftet= "); if( nargs[2] && nargs[4] ) CompileError("uncompatible ... (Th, label= , refface= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type ConvexHull3D_tetg_file_Op::name_param[]= { { "switch", &typeid(string*)}, { "reftet", &typeid(long)}, { "refface", &typeid(long)}, { "region", &typeid(long)}, { "label", &typeid(long)} }; class ConvexHull3D_tetg_file : public OneOperator { public: ConvexHull3D_tetg_file() : OneOperator( atype(), atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new ConvexHull3D_tetg_file_Op( args,t[0]->CastTo(args[0]) ); } }; AnyType ConvexHull3D_tetg_file_Op::operator()(Stack stack) const { string* pointsfile = GetAny((*filename)(stack)); // lecture du fichier contenant les points int nbv; //int lec; ifstream fp( pointsfile->c_str() ); if(!fp) { cerr << " -- tetgconvexhull : Erreur openning " << pointsfile <1) cout << " -- tetgconvexhull: Read On file \"" << pointsfile <<"\""<< endl; fp >> nbv; if(verbosity>1) cout << " -- Nb of Points " << nbv << endl; KN cxx(nbv), cyy(nbv), czz(nbv); for(int lec=0;lec> cxx[lec] >> cyy[lec] >> czz[lec]; } ffassert(fp.good()); if(verbosity>1) cout << " bound x " << cxx.min() << " " << cxx.max() << " y " << cyy.min() << " "<< cyy.max() << " z " << czz.min() << " "<< czz.max() << endl; // if( lec !=nbv ) { // cerr << " -- tetgconvexhull : Erreur Reading File " << pointsfile < zzempty; //int intempty=0; string stringempty= string("YQV"); string* switch_tet(arg(0,stack,&stringempty)); int label_tet(arg(1,stack,arg(3,stack,0L))); int label_face(arg(2,stack,arg(4,stack,1L))); //==================================== // How to change string* into char* //==================================== size_t size_switch_tet = switch_tet->size()+1; char* switch_tetgen =new char[size_switch_tet]; strncpy(switch_tetgen, switch_tet->c_str(), size_switch_tet); //====================================== Mesh3 *Th3 =new Mesh3; Th3 = Convexhull_3Dpoints( switch_tetgen, nbv, cxx, cyy, czz, label_tet, label_face ); // Th3->BuildBound(); // Th3->BuildAdj(); // Th3->Buildbnormalv(); // Th3->BuildjElementConteningVertex(); Th3->BuildGTree(); //Th3->decrement(); Add2StackOfPtr2FreeRC(stack,Th3); delete [] switch_tetgen; cout << "FreeFem++: End check mesh given by tetgen" << endl; return Th3; } /* class Init1 { public: Init1(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ //if (verbosity) if(verbosity) cout << " load: tetgen " << endl; Global.Add("tetgconvexhull","(",new ConvexHull3D_tetg_file); Global.Add("tetgconvexhull","(",new ConvexHull3D_tetg); Global.Add("tetgtransfo","(",new Build2D3D); Global.Add("tetg","(",new Remplissage); Global.Add("tetg","(",new RemplissageAddPoint); Global.Add("tetgreconstruction","(",new ReconstructionRefine); } // because i include this file in tetgen.cpp (very bad) FH // a will correct this in next version ... #define WITH_NO_INIT #include "msh3.cpp" LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/tetgencube.edp000644 000767 000024 00000004601 12327445332 021312 0ustar00hechtstaff000000 000000 // file tetgencube.edp load "msh3" load "tetgen" load "medit" real x0,x1,y0,y1; x0=1.; x1=2.; y0=0.; y1=2*pi; mesh Thsq1 = square(5,35,[x0+(x1-x0)*x,y0+(y1-y0)*y]); func ZZ1min = 0; func ZZ1max = 1.5; func XX1 = x; func YY1 = y; int[int] ref31h = [0,12]; int[int] ref31b = [0,11]; mesh3 Th31h = movemesh23(Thsq1,transfo=[XX1,YY1,ZZ1max],label=ref31h,orientation=1); mesh3 Th31b = movemesh23(Thsq1,transfo=[XX1,YY1,ZZ1min],label=ref31b,orientation=-1); //medit("haut",Th31h); //medit("bas",Th31b); ///////////////////////////////// x0=1.; x1=2.; y0=0.; y1=1.5; mesh Thsq2 = square(5,8,[x0+(x1-x0)*x,y0+(y1-y0)*y]); func ZZ2 = y; func XX2 = x; func YY2min = 0.; func YY2max = 2*pi; int[int] ref32h = [0,13]; int[int] ref32b = [0,14]; mesh3 Th32h = movemesh23(Thsq2,transfo=[XX2,YY2max,ZZ2],label=ref32h,orientation=-1); mesh3 Th32b = movemesh23(Thsq2,transfo=[XX2,YY2min,ZZ2],label=ref32b,orientation=1); ///////////////////////////////// x0=0.; x1=2*pi; y0=0.; y1=1.5; mesh Thsq3 = square(35,8,[x0+(x1-x0)*x,y0+(y1-y0)*y]); func XX3min = 1.; func XX3max = 2.; func YY3 = x; func ZZ3 = y; int[int] ref33h = [0,15]; int[int] ref33b = [0,16]; mesh3 Th33h = movemesh23(Thsq3,transfo=[XX3max,YY3,ZZ3],label=ref33h,orientation=1); mesh3 Th33b = movemesh23(Thsq3,transfo=[XX3min,YY3,ZZ3],label=ref33b,orientation=-1); //////////////////////////////// mesh3 Th33 = Th31h+Th31b+Th32h+Th32b+Th33h+Th33b; // "gluing" surface meshs to obtain the surface of cube //medit("glumesh",Th33); savemesh(Th33,"Th33.mesh"); // build a mesh of a axis parallel box with TetGen //real[int] domaine = [1.5,pi,0.75,145,0.001]; //mesh3 Thfinal = tetg(Th33,switch="pqaAAYYQ",nbofregions=1,regionlist=domaine); // Tetrahelize the interior of the cube with tetgen //medit("tetg",Thfinal); //savemesh(Thfinal,"Thfinal.mesh"); // build a mesh of a half cylindrical shell of interior radius 1. and exterior radius 2 and heigh 1.5 func mv2x = x*cos(y); func mv2y = x*sin(y); func mv2z = z; //mesh3 Thmv2 = movemesh3(Thfinal, transfo=[mv2x,mv2y,mv2z]); //savemesh(Thmv2,"halfcylindricalshell.mesh"); verbosity=2; mesh3 Thmv2surf = movemesh(Th33, [mv2x,mv2y,mv2z], facemerge=0); cout << "\b\b Thmv2surf.mesure=" << Thmv2surf.mesure << endl; cout << " Thmv2surf.bordermesure=" << Thmv2surf.bordermesure << endl; medit("maiAllagesurf",Thmv2surf,wait=1); //savemesh(Thmv2surf,"maillagesurfacecylindre.mesh"); //medit("maillageplein",Thmv2); freefem++-3.38-1/examples++-load/tetgenholeregion_rugby.edp000644 000767 000024 00000005262 11406142255 023736 0ustar00hechtstaff000000 000000 // file tetgenholeregion_rugby.edp load "msh3" load "tetgen" load "medit" verbosity=2; // Test 1 // data of rugby ball real Ra=2.; real Rb=2.; real Rc=1.; mesh Th=square(10,20,[x*pi-pi/2,2*y*pi]); // $]\frac{-pi}{2},\frac{-pi}{2}[\times]0,2\pi[ $ // a parametrization of a ellipsoid func f1 = Ra*cos(x)*cos(y); func f2 = Rb*cos(x)*sin(y); func f3 = Rc*sin(x); // partiel derivative of the parametrization DF func f1x=Ra*sin(x)*cos(y); func f1y=-Ra*cos(x)*sin(y); func f2x=-Rb*sin(x)*sin(y); func f2y=Rb*cos(x)*cos(y); func f3x=Rc*cos(x); func f3y=0; // $ M = DF^t DF $ func m11=f1x^2+f2x^2+f3x^2; func m21=f1x*f1y+f2x*f2y+f3x*f3y; func m22=f1y^2+f2y^2+f3y^2; func perio=[[4,y],[2,y],[1,x],[3,x]]; real hh=0.1; real vv= 1/square(hh); verbosity=2; Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); plot(Th,wait=1); verbosity=2; // construction of the surface of prolate ellipsoide real Rmin = 1.; func f1min = Rmin*f1; func f2min = Rmin*f2; func f3min = Rmin*f3; cout << "=====================" << endl; cout << "=====================" << endl; mesh3 Th3sph=movemesh23(Th,transfo=[f1min,f2min,f3min],orientation=1); cout << "=====================" << endl; cout << "=====================" << endl; real Rmax = 2.; func f1max = Rmax*f1; func f2max = Rmax*f2; func f3max = Rmax*f3; cout << "=====================" << endl; cout << "=====================" << endl; mesh3 Th3sph2=movemesh23(Th,transfo=[f1max,f2max,f3max],orientation=-1); cout << "=====================" << endl; cout << "=====================" << endl; cout << "addition" << endl; mesh3 Th3=Th3sph+Th3sph2; savemesh(Th3sph,"ellipsoide.mesh"); real[int] domain2 = [1.5*Ra,0.,0.,145,0.001,0.,0.,0.,18,0.001]; cout << "==============================" << endl; cout << " tetgen call without hole " << endl; cout << "==============================" << endl; mesh3 Th3fin=tetg(Th3,switch="paAAYYCCV",nbofregions=2,regionlist=domain2); cout << "=============================" << endl; cout << "finish: tetgen call without hole" << endl; cout << "=============================" << endl; savemesh(Th3fin,"spherewithtworegion.mesh"); medit("maillagetwo",Th3fin); real[int] hole = [0.,0.,0.]; real[int] domain = [1.5*Ra,0.,0.,53,0.001]; cout << "=============================" << endl; cout << " tetgen call with hole " << endl; cout << "=============================" << endl; mesh3 Th3finhole=tetg(Th3,switch="paAAYCCV",nbofholes=1,holelist=hole,nbofregions=1,regionlist=domain); cout << "=============================" << endl; cout << "finish: tetgen call with hole " << endl; cout << "=============================" << endl; savemesh(Th3finhole,"spherewithahole.mesh"); freefem++-3.38-1/examples++-load/thresholdings.cpp000644 000767 000024 00000005702 12466661714 022067 0ustar00hechtstaff000000 000000 // ORIG-DATE: September 2010 // -*- Mode : c++ -*% // // SUMMARY : seuillage des matrices EF de freefem++ // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "ff++.hpp" //using namespace Fem2D; template struct Thresholding{ Matrice_Creuse *v; Thresholding( Matrice_Creuse * vv) : v(vv) {} }; template Matrice_Creuse *thresholding2(const Thresholding & t,const double &threshold) { Matrice_Creuse * sparse_mat =t.v; if(sparse_mat) { int n=sparse_mat->N(),m=sparse_mat->M(); map,R> M; if (n >0 && m>0 && sparse_mat->A) { int nrt = sparse_mat->A->NbCoef(); sparse_mat->A->addMatTo(R(1.),M,false,0,0,false,threshold); // (M)[make_pair(n-1,m-1)]+=R(); bool sym=false; // bof bof sparse_mat->typemat=TypeSolveMat(TypeSolveMat::GMRES); // none square matrice (morse) sparse_mat->A.master(new MatriceMorse(n,m,M,sym)); nrt-=sparse_mat->A->NbCoef(); if(verbosity) cout << " thresholding= remove " << nrt << " them in the matrix " << sparse_mat << " " << threshold << endl; } else if(verbosity) cout << " empty matrix " < Thresholding to_Thresholding( Matrice_Creuse *v){ return Thresholding(v);} /* class Init1 { public: Init1(); }; $1 */ static void Load_Init() { // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ typedef Thresholding TMR ; typedef Thresholding TMC ; typedef Matrice_Creuse MR ; typedef Matrice_Creuse MC ; Dcl_Type< TMR > (); Dcl_Type< TMC > (); TMR t(0); thresholding2(t,0.); Add("thresholding",".",new OneOperator1< TMR ,MR *>(to_Thresholding)); Add("(","",new OneOperator2_(thresholding2)); Add("thresholding",".",new OneOperator1< TMC ,MC *>(to_Thresholding)); Add("(","",new OneOperator2_(thresholding2)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/thresholdings.edp000644 000767 000024 00000000473 11515554001 022035 0ustar00hechtstaff000000 000000 load "thresholdings" mesh Th = square(2,2); fespace Xh(Th,P1); Xh u,v; macro grad(u)[dx(u),dy(u)] // EOM func f=1; varf Lapl(u,v) = int2d(Th)( grad(u)'*grad(v) ) + int2d(Th)( f*v ); // ' for emacs matrix M=Lapl(Xh,Xh); cout << M << endl; M.thresholding(0.7);// remove all term less then 0.7 cout << M << endl;freefem++-3.38-1/examples++-load/ttestio.edp000644 000767 000024 00000002605 12240775536 020670 0ustar00hechtstaff000000 000000 load "gmsh" load "iovtk" load "medit" verbosity = 1; // example gmsh mesh3 Th = gmshload3("cube.msh"); //medit("gmsh3d",Th,wait=1); // example iovtk border Gamma(t=0,2*pi){x=cos(t);y=sin(t);label=3;} border Gamma1(t=0,2*pi){x=2*cos(t);y=2*sin(t);label=5;} mesh Th2 = buildmesh( Gamma(10)+Gamma1(20) ); fespace Vh(Th2,P1); // P1 FE space func gg=x; Vh uh,vh,u; Vh ggg=gg; solve laplacep(uh,vh,solver=CG,tgv=1e5) = // definion of the problem int2d(Th2)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + on(3,uh=1)+ on(5,uh=2) ; // boundary condition form cout << "vtk information" << endl; int[int] fforder=[0,0,1,0,1]; savevtk("disque.vtk",Th2,uh,ggg,uh,[uh,ggg],[uh,ggg],dataname="kkdjd jyqql bidule45 vector nnn nn44233T",order=fforder); mesh3 Th3; try { Th3=readmesh3("spherewithahole.mesh"); // This .mesh file is obtaing with tetgenholeregion.edp } catch (...) { // FFCS - path to example scripts are changed, so this needs to be in the local directory to be common to FF and FFCS include "tetgenholeregion_rugby.edp" } fespace Vh3(Th3,P1); // P1 FE space func gg2=x+y; int[int] fforder2=[0,0,1,1]; verbosity=6; savevtk("bidule.vtk",Th3,gg2,[gg2,gg2,gg2],gg2,[gg2,gg2,gg2],order=fforder2,dataname="kkdjd jyqql bidule45"); // The fourth solution Have no name. This name is vector4 (4 ==> fourth solution and vector ==> vector solution). freefem++-3.38-1/examples++-load/UMFPACK64.cpp000644 000767 000024 00000027736 12167254041 020452 0ustar00hechtstaff000000 000000 // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: umfpack amd blas //ff-c++-cpp-dep: // // file to add UMFPACK solver with dynamic load. #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" #include "MatriceCreuse_tpl.hpp" #include #ifdef HAVE_LIBUMFPACK extern "C" { #ifdef HAVE_UMFPACK_H #include #else #ifdef HAVE_UMFPACK_UMFPACK_H #include #else #ifdef HAVE_BIG_UMFPACK_UMFPACK_H #include #else #ifdef HAVE_UFSPARSE_UMFPACK_H #include #else #ifdef HAVE_SUITESPARSE_UMFPACK_H #include #else // Defaults to a local version of the UMFPACK headers #include "../../download/include/umfpack.h" #endif // HAVE_SUITESPARSE_UMFPACK_H #endif // HAVE_UFSPARSE_UMFPACK_H #endif // HAVE_BIG_UMFPACK_UMFPACK_H #endif // HAVE_UMFPACK_UMFPACK_H #endif // HAVE_UMFPACK_H } #endif template class SolveUMFPACK64 : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; void *Symbolic, *Numeric ; int umfpackstrategy; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 public: SolveUMFPACK64(const MatriceMorse &A,int strategy,double ttgv, double epsilon=1e-6, double pivot=-1.,double pivot_sym=-1. ) : eps(epsilon),epsr(0), tgv(ttgv), Symbolic(0),Numeric(0) , umfpackstrategy(strategy), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { int status; throwassert( !A.sym() && Numeric == 0 && Symbolic==0 ); int n=A.n; double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; for(int i=0;i4) Control[UMFPACK_PRL]=2; if(tol_pivot_sym>0) Control[UMFPACK_SYM_PIVOT_TOLERANCE]=pivot_sym; if(tol_pivot>0) Control[UMFPACK_PIVOT_TOLERANCE]=pivot; if(umfpackstrategy>=0) Control[UMFPACK_STRATEGY]=umfpackstrategy; if(verbosity>3) { cout << " UMFPACK (long) real Solver Control :" ; cout << "\n\t SYM_PIVOT_TOLERANCE "<< Control[UMFPACK_SYM_PIVOT_TOLERANCE]; cout << "\n\t PIVOT_TOLERANCE "<< Control[UMFPACK_PIVOT_TOLERANCE]; cout << "\n\t PRL "<< Control[UMFPACK_PRL]; cout << "\n"; } // convert array in long ... // FFCS: Win64 long pb #ifdef WIN64 KN Alg(n+1),Acl(A.nbcoef); #else KN Alg(n+1),Acl(A.nbcoef); #endif for(int i=0;i<=n;++i) Alg[i]=A.lg[i]; for(int i=0;i3) cout << " -- umfpack_dl_build LU " << n << endl; if(verbosity>5) (void) umfpack_dl_report_info(Control,Info); } void Solver(const MatriceMorse &A,KN_ &x,const KN_ &b) const { ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; for(int i=0;i Alg(n+1),Acl(A.nbcoef); #else KN Alg(n+1),Acl(A.nbcoef); #endif for(int i=0;i<=n;++i) Alg[i]=A.lg[i]; for(int i=0;i(x), KN_2Ptr(b), Numeric,Control,Info) ; if (status != 0) { umfpack_dl_report_info (Control, Info) ; umfpack_dl_report_status (Control, status) ; cerr << "umfpack_dl_solve failed" << endl; ExecError("umfpack_dl_solve failed"); ffassert(0); } if(verbosity>2) cout << " -- umfpack_dl_solve, peak Mem : " << long(Info[UMFPACK_PEAK_MEMORY])/(1024*1024)*Info[UMFPACK_SIZE_OF_UNIT] << "Mbytes " << endl; if(verbosity>3) cout << " b min max " << b.min() << " " <3) (void) umfpack_dl_report_info(Control,Info); if(verbosity>1) cout << " x min max " << x.min() << " " <3) cout << "~SolveUMFPACK 64:" << Symbolic << " N:" << Numeric < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; template<> class SolveUMFPACK64 : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; int umfpackstrategy; double tgv; void *Symbolic, *Numeric ; double *ar,*ai; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 public: SolveUMFPACK64(const MatriceMorse &A,int strategy,double ttgv, double epsilon=1e-6, double pivot=-1.,double pivot_sym=-1. ) : eps(epsilon),epsr(0),umfpackstrategy(strategy),tgv(ttgv), Symbolic(0),Numeric(0), ar(0),ai(0), tol_pivot_sym(pivot_sym), tol_pivot(pivot) { int status; throwassert( !A.sym()); int n=A.n; // copy the coef of the matrice --- ar= new double[A.nbcoef]; ai= new double[A.nbcoef]; ffassert(ar && ai); C2RR(A.nbcoef,A.a,ar,ai); double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; umfpack_zl_defaults (Control) ; Control[UMFPACK_PRL]=1; if(verbosity>4) Control[UMFPACK_PRL]=2; // Control[UMFPACK_SYM_PIVOT_TOLERANCE]=1E-10; // Control[UMFPACK_PIVOT_TOLERANCE]=1E-10; if(tol_pivot_sym>0) Control[UMFPACK_SYM_PIVOT_TOLERANCE]=pivot_sym; if(tol_pivot>0) Control[UMFPACK_PIVOT_TOLERANCE]=pivot; if(umfpackstrategy>=0) Control[UMFPACK_STRATEGY]=umfpackstrategy; if(verbosity>3) { cout << " UMFPACK(64) complex Solver Control :" ; cout << "\n\t SYM_PIVOT_TOLERANCE "<< Control[UMFPACK_SYM_PIVOT_TOLERANCE]; cout << "\n\t PIVOT_TOLERANCE "<< Control[UMFPACK_PIVOT_TOLERANCE]; cout << "\n\t PRL "<< Control[UMFPACK_PRL]; cout << "\n"; } // convert array in long ... // FFCS: need a longlong on Win64 because longs are 32 bits #ifdef WIN64 KN Alg(n+1),Acl(A.nbcoef); #else KN Alg(n+1),Acl(A.nbcoef); #endif for(int i=0;i<=n;++i) Alg[i]=A.lg[i]; for(int i=0;i3) cout << "umfpack_zl_build LU " << n << endl; if(verbosity>5) (void) umfpack_zl_report_info(Control,Info); } void Solver(const MatriceMorse &A,KN_ &x,const KN_ &b) const { ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; umfpack_zl_defaults (Control) ; int n = b.N(); ffassert(A.ChecknbLine( n) && n == x.N() && A.ChecknbColumn(n) ); KN xr(n),xi(n),br(n),bi(n); C2RR(n,b,br,bi); // change UMFPACK_At to UMFPACK_Aat in complex oct 2005 // convert array in long ... // FFCS: Win64 long pb #ifdef WIN64 KN Alg(n+1),Acl(A.nbcoef); #else KN Alg(n+1),Acl(A.nbcoef); #endif for(int i=0;i<=n;++i) Alg[i]=A.lg[i]; for(int i=0;i1) { cout << " -- umfpack_zl_solve, peak Mem : " << long(Info[UMFPACK_PEAK_MEMORY])/(1024*1024)*Info[UMFPACK_SIZE_OF_UNIT] << "Mbytes " << endl; if(verbosity>3) (void) umfpack_zl_report_info(Control,Info); cout << " b min max " << b.min() << " " <5) cout << "~SolveUMFPACK64 " << endl; if (Symbolic) umfpack_zl_free_symbolic (&Symbolic),Symbolic=0; if (Numeric) umfpack_zl_free_numeric (&Numeric),Numeric=0; delete [] ar; delete [] ai; } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; inline MatriceMorse::VirtualSolver * BuildSolverIUMFPack64(DCL_ARG_SPARSE_SOLVER(double,A)) { if( verbosity>9) cout << " BuildSolverUMFPack64" << endl; return new SolveUMFPACK64(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym); } inline MatriceMorse::VirtualSolver * BuildSolverIUMFPack64(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if( verbosity>9) cout << " BuildSolverUMFPack64" << endl; return new SolveUMFPACK64(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym); } // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetUMFPACK64() { if(verbosity>1) cout << " SetDefault sparse solver to IUMFPack64" << endl; DefSparseSolver::solver =BuildSolverIUMFPack64; DefSparseSolver::solver =BuildSolverIUMFPack64; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; return true; } void init22() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: UMFPACK64: defaultsolver defaultsolverUMFPACK64" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverIUMFPack64; DefSparseSolver::solver =BuildSolverIUMFPack64; if(! Global.Find("defaulttoUMFPACK64").NotNull() ) Global.Add("defaulttoUMFPACK64","(",new OneOperator0(SetUMFPACK64)); } LOADFUNC(init22); freefem++-3.38-1/examples++-load/VarIneq2.edp000644 000767 000024 00000007705 12167254041 020621 0ustar00hechtstaff000000 000000 load "ff-NLopt" //A brief script to demonstrate how to use the freefemm interfaced nlopt routines //The problem consist in solving a simple variational inequality using one of the //optimization algorithm of nlopt. We restart the algorithlm a few times agter //performing some mesh adaptation to get a more precise output. int kas = 3; // choose of the algo ... int NN = 10; mesh Th = square(NN,NN); func f1=1.; func f2=-1.; func g1=0.; func g2=0.1; int iter=0; int nadapt=2; real starttol=1e-6,bctol=6.e-12; fespace Vh(Th,P1); Vh oldu1,oldu2; for(int al=0;al #include #include #include using namespace std; #include "ff++.hpp" using namespace Fem2D; class VtkWriter { struct tsinfo { int imesh;//! vecistant; }; private: std::vector _vecmesh; //std::vector _vecofts; std::string _nameoffile; /*! This string contains the name of data file with \\ where there's a \ in the path*/ std::string _nameofdatafile; //!files containing the data and the timeseries std::ofstream _ofdata; public: VtkWriter() { std::cout << "Constructor of VtkWriter" << endl; } void openfiles(const std::string& s) { _nameoffile=s; std::string tmp=s+".vtu"; std::cout<" << std::endl; _ofdata << "" ; _ofdata << std::endl; _ofdata << "" ; _ofdata << std::endl; _ofdata << ""; _ofdata << std::endl; _ofdata << "" << std::endl; _ofdata << ""; _ofdata << std::endl; for(int k=0;k" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; _ofdata << ""; _ofdata << std::endl; for(int i=0;i" << std::endl; _ofdata << ""; _ofdata << std::endl; for(int i=0;i" << std::endl; _ofdata << "" ; _ofdata<< std::endl; for(int i=0;i" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << endl; } double checkprecision(double val) { double tmp; if ( val >= 0. ) tmp=max(0.,val); if ( val < 0. ) tmp=min(0.,val); return tmp; } /*!Add a field*/ void addscalar(const string& nameoffield, Fem2D::Mesh* mesh, const KN&val) { _ofdata.flags(std::ios_base::scientific); _ofdata.precision(15); _ofdata << ""; _ofdata << std::endl; for(int i=0;i" << std::endl; _ofdata.flush(); } /*!Add a field*/ void addvector(const string& nameoffield, Fem2D::Mesh* mesh, const KN&val, const KN&val2) { _ofdata.flags(std::ios_base::scientific); _ofdata.precision(15); _ofdata << ""; _ofdata << std::endl; for(int i=0;i" << std::endl; _ofdata.flush(); } /*!Get the mesh associated with the series nameofts*/ Fem2D::Mesh* getmeshts(const string& nameofts) { return _vecmesh[0]; } void init() { new(this)VtkWriter(); } void destroy() { if(_ofdata.is_open()) { _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata.close(); } } }; //End of class class Vtkwritesol_Op : public E_F0mps { public: typedef long Result; Expression edx; Expression ename;//!(args[0])) edx = CastTo(args[0]); if (BCastTo(args[1])) ename = CastTo(args[1]); if ( args[2].left()==atype() ) { what=1; nbfloat=1; evct=to( args[2] ); } else if ( args[2].left()==atype() ) { what=1; nbfloat=1; evct=to( args[2] ); } else if ( BCastTo(args[2]) ) { what=1; nbfloat=1; evct=to( args[2] ); } else if ( args[2].left()==atype() ) { std::cout << "Until now only scalar solution" << std::endl; int i=2; const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); if( a0->size() == ddim){ // vector solution what=2; nbfloat=a0->size(); evct = to( (*a0)[0]); evct2 = to( (*a0)[1]); } cout << "Passed Until now only scalar solution" << std::endl; } else { CompileError("savesol in 2D: Sorry no way to save this kind of data"); } } // all type static ArrayOfaType typeargs() { return ArrayOfaType(atype(), atype(), true); } static E_F0 * f(const basicAC_F0 & args) { return new Vtkwritesol_Op(args);} AnyType operator()(Stack stack) const ; }; // end of class AnyType Vtkwritesol_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; VtkWriter &dx=*(GetAny((*edx)(stack))); string &name=*(GetAny((*ename)(stack))); //double t=GetAny((*et)(stack)); Mesh &Th=*(dx.getmeshts(name)); int nt = Th.nt; int nv = Th.nv; int nbsol=nv; long longdefault; KN valsol(nbsol); valsol=0.; KN takemesh(nbsol); takemesh=0; MeshPoint *mp3(MeshPointStack(stack)); for (int it=0;itsetP(&Th,it,iv); valsol[i] = valsol[i] + GetAny< double >((*evct)(stack)); ++takemesh[i]; } } for(int i=0; i valsol2(nbsol); valsol2=0.; KN takemesh(nbsol); takemesh=0; MeshPoint *mp3(MeshPointStack(stack)); for (int it=0;itsetP(&Th,it,iv); valsol2[i] = valsol2[i] + GetAny< double >((*evct2)(stack)); ++takemesh[i]; } } for(int i=0; iinit(); a->openfiles(*s); std::cout << "end init_VtkWriter" << std::endl; return a; } void* call_addmesh( VtkWriter * const & mt, Fem2D::Mesh* const & pTh) { mt->addmesh(pTh); return NULL; } // Add the function name to the freefem++ table /* class Init { public: Init(); }; $1 */ static void Load_Init() { Dcl_Type(InitP,Destroy); // declare deux nouveau type pour freefem++ un pointeur et zzzfff->Add("VtkWriter",atype()); // ajoute le type myType a freefem++ // constructeur d'un type myType dans freefem TheOperators->Add("<-", new OneOperator2_(&init_VtkWriter)); Global.Add("Vtkaddmesh","(",new OneOperator2_(call_addmesh)); Global.Add("Vtkaddscalar","(",new OneOperatorCode< Vtkwritesol_Op> ); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/VTK_writer_3d.cpp000644 000767 000024 00000022743 12466661714 021644 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Cedric Ody (not an expert in c++) // E-MAIL : cedric.listes@gmail.com // from the work of Sala Lorenzo (Dxwriter) #include "mode_open.hpp" #include #include #include #include using namespace std; #include "ff++.hpp" //using namespace Fem2D; #include #include //#include "msh3.hpp" class VtkWriter { struct tsinfo { int imesh;//! vecistant; }; private: std::vector _vecmesh; //std::vector _vecofts; std::string _nameoffile; /*! This string contains the name of data file with \\ where there's a \ in the path*/ std::string _nameofdatafile; //!files containing the data and the timeseries std::ofstream _ofdata; public: VtkWriter() { std::cout << "Constructor of VtkWriter" << endl; } void openfiles(const std::string& s) { _nameoffile=s; std::string tmp=s+".vtu"; std::cout<" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; for(int k=0;k" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << std::endl; for(int i=0;i" << std::endl; _ofdata << "" << std::endl; for(int i=0;i" << std::endl; _ofdata << "" << std::endl; for(int i=0;i" << std::endl; _ofdata << "" << std::endl; _ofdata << "" << endl; } /*!Add a field*/ void addscalar(const string& nameoffield, Mesh3* mesh, const KN&val) { _ofdata.flags(std::ios_base::scientific); _ofdata.precision(15); _ofdata << "" << std::endl; for(int i=0;i" << std::endl; _ofdata.flush(); } double checkprecision(double val) { double tmp; if ( val >= 0. ) tmp=max(0.,val); if ( val < 0. ) tmp=min(0.,val); return tmp; } /*!Add a field*/ void addvector(const string& nameoffield, Mesh3* mesh, const KN&val, const KN&val2,const KN&val3 ) { _ofdata.flags(std::ios_base::scientific); _ofdata.precision(15); _ofdata << "" << std::endl; for(int i=0;i" << std::endl; _ofdata.flush(); } /*!Get the mesh associated with the series nameofts*/ Mesh3* getmeshts(const string& nameofts) { return _vecmesh[0]; } void init() { new(this)VtkWriter(); } void destroy() { if(_ofdata.is_open()) { _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata << "" << endl; _ofdata.close(); } } }; //End of class class Vtkwritesol_Op : public E_F0mps { public: typedef long Result; Expression edx; Expression ename;//!(args[0])) edx = CastTo(args[0]); if (BCastTo(args[1])) ename = CastTo(args[1]); if ( args[2].left()==atype() ) { what=1; nbfloat=1; evct=to( args[2] ); } else if ( args[2].left()==atype() ) { what=1; nbfloat=1; evct=to( args[2] ); } else if ( BCastTo(args[2]) ) { what=1; nbfloat=1; evct=to( args[2] ); } else if ( args[2].left()==atype() ) { std::cout << "Until now only scalar solution" << std::endl; int i=2; const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); if( a0->size() == 1){ // scalar solution what=1; nbfloat=a0->size(); evct = to( (*a0)[0]); } if( a0->size() == ddim){ // vector solution what=2; nbfloat=a0->size(); evct = to( (*a0)[0]); evct2 = to( (*a0)[1]); evct3 = to( (*a0)[2]); } cout << "Passed Until now only scalar solution" << std::endl; } else { CompileError("savesol in 2D: Sorry no way to save this kind of data"); } } static ArrayOfaType typeargs() { return ArrayOfaType(atype(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new Vtkwritesol_Op(args);} AnyType operator()(Stack stack) const ; }; // end of class AnyType Vtkwritesol_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; VtkWriter &dx=*(GetAny((*edx)(stack))); string &name=*(GetAny((*ename)(stack))); //double t=GetAny((*et)(stack)); Mesh3 &Th=*(dx.getmeshts(name)); int nt = Th.nt; int nv = Th.nv; int nbsol=nv; long longdefault; KN valsol(nbsol); valsol=0.; KN takemesh(nbsol); takemesh=0; MeshPoint *mp3(MeshPointStack(stack)); for (int it=0;itsetP(&Th,it,iv); valsol[i] = valsol[i] + GetAny< double >((*evct)(stack)); ++takemesh[i]; } } for(int i=0; i valsol2(nbsol); valsol2=0.; KN takemesh(nbsol); takemesh=0; MeshPoint *mp3(MeshPointStack(stack)); for (int it=0;itsetP(&Th,it,iv); valsol2[i] = valsol2[i] + GetAny< double >((*evct2)(stack)); ++takemesh[i]; } } for(int i=0; i valsol3(nbsol); valsol3=0.; KN takemesh(nbsol); takemesh=0; MeshPoint *mp3(MeshPointStack(stack)); for (int it=0;itsetP(&Th,it,iv); valsol3[i] = valsol3[i] + GetAny< double >((*evct3)(stack)); ++takemesh[i]; } } for(int i=0; iinit(); a->openfiles(*s); std::cout << "end init_VtkWriter" << std::endl; return a; } void* call_addmesh( VtkWriter * const & mt, Mesh3* const & pTh) { mt->addmesh(pTh); return NULL; } // Add the function name to the freefem++ table /* class Init { public: Init(); }; $1 */ static void Load_Init() { Dcl_Type(InitP,Destroy); // declare deux nouveau type pour freefem++ un pointeur et zzzfff->Add("VtkWriter",atype()); // ajoute le type myType a freefem++ // constructeur d'un type myType dans freefem TheOperators->Add("<-", new OneOperator2_(&init_VtkWriter)); Global.Add("Vtkaddmesh","(",new OneOperator2_(call_addmesh)); Global.Add("Vtkaddscalar","(",new OneOperatorCode< Vtkwritesol_Op> ); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-eigen/all.edp000644 000767 000024 00000006325 12420157325 020106 0ustar00hechtstaff000000 000000 NoUseOfWait=true;int verbosityy=verbosity; cout << "--------- file : BeamEigenValue.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "BeamEigenValue.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : BeamEigenValueperio.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "BeamEigenValueperio.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : Lap3dEigenValue.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "Lap3dEigenValue.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapComplexEigenValue.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapComplexEigenValue.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapEigenValue.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapEigenValue.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapEigenValueFunc.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapEigenValueFunc.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapnosymEigenValue.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapnosymEigenValue.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : Stokes-eigen.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "Stokes-eigen.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : VP-Steklov-Poincare.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "VP-Steklov-Poincare.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : WGM-sphere.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "WGM-sphere.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : free-cyl-axi.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "free-cyl-axi.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : neuman.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "neuman.edp";}; cout << "------------------------------------------------------------------------------ " << endl; freefem++-3.38-1/examples++-eigen/BeamEigenValue.edp000644 000767 000024 00000004551 12341207757 022155 0ustar00hechtstaff000000 000000 // Computation of the eigen value and eigen vector of the // Dirichlet problem on square $]0,\pi[^2$ // ---------------------------------------- // we use the inverse shift mode // the shift is given with sigma real // ------------------------------------- // find $\lamda$ such that: // $$ \int_{\omega} \nabla u_ \nabla v = \lamba \int_{\omega} u \nabla v $$ verbosity=1; int bottombeam = 2; border aaa(t=2,0) { x=0; y=t ;label=1;}; // left beam border bbb(t=0,10) { x=t; y=0 ;label=bottombeam;}; // bottom of beam border ccc(t=0,2) { x=10; y=t ;label=1;}; // rigth beam border ddd(t=0,10) { x=10-t; y=2; label=3;}; // top beam real E = 21.5; real sigma = 0.29; real mu = E/(2*(1+sigma)); real lambda = E*sigma/((1+sigma)*(1-2*sigma)); real gravity = -0.05; mesh Th = buildmesh( bbb(20)+ccc(5)+ddd(20)+aaa(5)); fespace Vh(Th,[P1,P1]); Vh [uu,vv], [w,s]; cout << "lambda,mu,gravity ="< 0.3) nerr++; cout << i << " ev " << e << " freq = " << freq << "Hz, err=" << abs(freq-freqref[i]) < 1e-6) nerr++; if(abs(ev[i]-eev[i]) > eev[i]*1e-1) nerr++; cout << " ---- " << i<< " " << ev[i] << " == " << eev[i] << " err= " << err << " --- "< u1,u2; Vh ur,ui; int n=u1.n; complex[int] Bu1(n),Bu2(n); complex[int] Au1(n),Au2(n); complex sigma = 0; //1.000+1i; complex nu=1+1i; varf op(u1,u2)= int2d(Th)( nu*(dx(u1)*dx(u2) + dy(u1)*dy(u2)) - sigma*u1*u2 ) + on(1,2,3,4,u1=0) ; varf a(u1,u2)= int2d(Th)( nu*(dx(u1)*dx(u2) + dy(u1)*dy(u2)) ) + on(1,2,3,4,u1=0) ; varf b([u1],[u2]) = int2d(Th)( u1*u2 ) ;//+ on(1,2,3,4,u1=0); matrix OP= op(Vh,Vh,solver=UMFPACK); matrix A= a(Vh,Vh,solver=GMRES); matrix B= b(Vh,Vh,solver=GMRES,eps=1e-20); int nev=10; complex[int] ev(nev); // to store 10 eigen value Vh[int] eV(nev); // to store 10 eigen vector int k=EigenValue(OP,B,sigma=sigma,value=ev,vector=eV, tol=1e-10,maxit=90000,ncv=100); k=min(k,nev); // some time the number of converged eigen value // can be greater than nev; for (int kk=0;kk1e-5) cout << "BUG ::: zero == " < 1e-6) nerr++; if(abs(ev[i]-eev[i]) > 1e-1) nerr++; cout << " ---- " << i<< " " << ev[i] << " == " << eev[i] << " err= " << err << " --- "<=k) break; u2 = eV[j]; } cout << " ||u1|| " << u1[].linfty << " || u2|| = " << u2[].linfty << endl; Bu1=B*u1[]; Bu2=B*u2[]; Au1=A*u1[]; Au2=A*u2[]; // The Rayleigh quotient lambda = x'Ax/x'Bx // given the eigen value real xBx = u1[]'*Bu1 + u2[]'*Bu2; complex xAx = u1[]'*Au1 + u2[]'*Au2 + 1i*(u1[]'*Au2 - u2[]'*Au1); complex eigenvalue = xAx/xBx; cout << " ---- " << i<< " " << v <<" eigenvalue= " << eigenvalue << endl; // FFCS: add 3D view plot(eV[i],cmm="Eigen Vector "+i+" valeur =" + er + " , " + ei ,wait=1,value=1,dim=3,fill=1); } // FFCS: order of eigenvalues may change, and biggest eigenvalue // (95.xxx) may not be picked up at all. real regtest=0; for(int i=1;i $@ freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref freefem++-3.38-1/examples++-eigen/Makefile.in000644 000767 000024 00000104035 12543260337 020712 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++-eigen ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw SKIP=$(SKIP_TESTS_EIGEN) TESTS = BeamEigenValue.edp BeamEigenValueperio.edp Lap3dEigenValue.edp LapEigenValue.edp LapnosymEigenValue.edp Stokes-eigen.edp VP-Steklov-Poincare.edp neuman.edp WGM-sphere.edp free-cyl-axi.edp LapEigenValueFunc.edp # LapComplexEigenValue.edp (buggus) EXTRA_DIST = *.edp all.edp all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-eigen/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-eigen/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? BeamEigenValue.edp.log: BeamEigenValue.edp @p='BeamEigenValue.edp'; \ b='BeamEigenValue.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) BeamEigenValueperio.edp.log: BeamEigenValueperio.edp @p='BeamEigenValueperio.edp'; \ b='BeamEigenValueperio.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Lap3dEigenValue.edp.log: Lap3dEigenValue.edp @p='Lap3dEigenValue.edp'; \ b='Lap3dEigenValue.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapEigenValue.edp.log: LapEigenValue.edp @p='LapEigenValue.edp'; \ b='LapEigenValue.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapnosymEigenValue.edp.log: LapnosymEigenValue.edp @p='LapnosymEigenValue.edp'; \ b='LapnosymEigenValue.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Stokes-eigen.edp.log: Stokes-eigen.edp @p='Stokes-eigen.edp'; \ b='Stokes-eigen.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) VP-Steklov-Poincare.edp.log: VP-Steklov-Poincare.edp @p='VP-Steklov-Poincare.edp'; \ b='VP-Steklov-Poincare.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) neuman.edp.log: neuman.edp @p='neuman.edp'; \ b='neuman.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) WGM-sphere.edp.log: WGM-sphere.edp @p='WGM-sphere.edp'; \ b='WGM-sphere.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) free-cyl-axi.edp.log: free-cyl-axi.edp @p='free-cyl-axi.edp'; \ b='free-cyl-axi.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapEigenValueFunc.edp.log: LapEigenValueFunc.edp @p='LapEigenValueFunc.edp'; \ b='LapEigenValueFunc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic cscopelist-am ctags-am distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am .PRECIOUS: Makefile # $Id$ # F. hecht july 2014 add LapEigenValueFunc.edp example all-local: all.edp freefem++.pref all.edp: (echo "NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-eigen/neuman.edp000644 000767 000024 00000001575 12167254041 020624 0ustar00hechtstaff000000 000000 border ccc(t=0,2*pi){x=cos(t);y=sin(t);} mesh Th=buildmesh(ccc(10)); //mesh Th=readmesh("Th.msh"); fespace Vh(Th,P2); Vh u1,u2; real sigma = 1e-5; varf a(u1,u2)= int2d(Th)( dx(u1)*dx(u2) + dy(u1)*dy(u2) - sigma* u1*u2 ); varf b([u1],[u2]) = int2d(Th)( u1*u2 ) ; // no Boundary condition matrix A= a(Vh,Vh,solver=Crout,factorize=1); matrix B= b(Vh,Vh,solver=CG,eps=1e-20); int nev=20; // number of computed eigen valeu close to sigma real[int] ev(nev); // to store nev eigein value Vh[int] eV(nev); // to store nev eigen vector int k=EigenValue(A,B,sym=true,sigma=sigma,value=ev,vector=eV,tol=1e-10,maxit=0,ncv=0); k=min(k,nev); // some time the number of converged eigen value // can be greater than nev; for(int i=0;i20) { th = adaptmesh(th,u,verbosity=1,abserror=1,nbjacoby=2, err=0.001, nbvx=5000, omega=1.8, ratio=1.8, nbsmooth=3, splitpbedge=1, maxsubdiv=5,rescaling=1) ; j=0; xveloc = -x*r+x*sigmax^2+x*rho*sigmax*sigmay/2; yveloc = -y*r+y*sigmay^2+y*rho*sigmax*sigmay/2; u=u; }; uold=u; solve eq1(u,v,init=j,solver=LU) = int2d(th)( u*v*(r+1/dt) + dx(u)*dx(v)*(x*sigmax)^2/2 + dy(u)*dy(v)*(y*sigmay)^2/2 + dy(u)*dx(v)*rho*sigmax*sigmay*x*y/2 + dx(u)*dy(v)*rho*sigmax*sigmay*x*y/2) + int2d(th)( -v*convect([xveloc,yveloc],dt,uold)/dt)+ on(2,3,u=0); j=j+1; }; plot(u,wait=1,value=1); plot(th,wait=1); freefem++-3.38-1/examples++-chapt3/condensor.edp000755 000767 000024 00000002032 12167254041 021416 0ustar00hechtstaff000000 000000 // file condensor.edp int C1=99, C2=98; // could be anything border C0(t=0,2*pi){x=5*cos(t); y=5*sin(t);} border C11(t=0,1){ x=1+t; y=3; label=C1;} border C12(t=0,1){ x=2; y=3-6*t; label=C1;} border C13(t=0,1){ x=2-t; y=-3; label=C1;} border C14(t=0,1){ x=1; y=-3+6*t; label=C1;} border C21(t=0,1){ x=-2+t; y=3; label=C2;} border C22(t=0,1){ x=-1; y=3-6*t; label=C2;} border C23(t=0,1){ x=-1-t; y=-3; label=C2;} border C24(t=1,0){ x=-2; y=-3+6*t; label=C2;} mesh Th=buildmesh( C0(50) +C11(5)+C12(20)+C13(5)+C14(20) +C21(5)+C22(20)+C23(5)+C24(-20)); plot(Th,wait=1); fespace Vh(Th,P1); Vh u,v; solve a(u,v)= int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v)) +on(C0,u=0)+on(C1,u=1)+on(C2,u=-1); plot(u,value=true, ps="condersor.eps"); // savemesh(Th,"condensor.msh"); /* mesh Sh=readmesh("condensor.msh"); fespace Vsh(Sh,P1); Vsh us,vs; solve b(us,vs)= int2d(Sh)(dx(us)*dx(vs)+dy(us)*dy(vs)) +on(1,us=0)+on(99,us=1)+on(98,us=-1); plot(us,value=true); */ freefem++-3.38-1/examples++-chapt3/convects.edp000755 000767 000024 00000003235 11475226130 021255 0ustar00hechtstaff000000 000000 // file convects.edp // Characteristics Galerkin border C(t=0, 2*pi) { x=cos(t); y=sin(t); }; mesh Th = buildmesh(C(100)); fespace Uh(Th,P1); Uh cold, c = exp(-10*((x-0.3)^2 +(y-0.3)^2)); real dt = 0.17,t=0; Uh u1 = y, u2 = -x; for (int m=0; m<2*pi/dt ; m++) { t += dt; cold=c; c=convect([u1,u2],-dt,cold); plot(c,cmm=" t="+t + ", min=" + c[].min + ", max=" + c[].max); } // Now with Discontinuous Galerkin fespace Vh(Th,P1dc); Vh w, ccold, v1 = y, v2 = -x, cc = exp(-10*((x-0.3)^2 +(y-0.3)^2)); real u, al=0.5; dt = 0.05; macro n()(N.x*v1+N.y*v2) // problem Adual(cc,w) = int2d(Th)((cc/dt+(v1*dx(cc)+v2*dy(cc)))*w) + intalledges(Th)((1-nTonEdge)*w*(al*abs(n)-n/2)*jump(cc)) // - int1d(Th,C)((n(u)<0)*abs(n(u))*cc*w) // unused because cc=0 on d(Omega)^- - int2d(Th)(ccold*w/dt); for ( t=0; t< 2*pi ; t+=dt) { ccold=cc; Adual; plot(cc,fill=1,cmm="t="+t + ", min=" + cc[].min + ", max=" + cc[].max); }; real [int] viso=[-0.1,0,0.5,0.1,0.5,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.9,1]; plot(c,wait=1,fill=1,value=1,ps="convectCG.eps",viso=viso); plot(cc,wait=1,fill=1,value=1,ps="convectDG.eps",viso=viso); // the same DG very much faster varf aadual(cc,w) = int2d(Th)((cc/dt+(v1*dx(cc)+v2*dy(cc)))*w) + intalledges(Th)((1-nTonEdge)*w*(al*abs(n)-n/2)*jump(cc)); varf bbdual(ccold,w) = - int2d(Th)(ccold*w/dt); matrix AA= aadual(Vh,Vh); matrix BB = bbdual(Vh,Vh); set (AA,init=t,solver=UMFPACK); Vh rhs=0; for ( t=0; t< 2*pi ; t+=dt) { ccold=cc; rhs[] = BB* ccold[]; cc[] = AA^-1*rhs[]; plot(cc,fill=0,cmm="t="+t + ", min=" + cc[].min + ", max=" + cc[].max); }; plot(cc,wait=1,fill=1,value=1,ps="convectDG.eps",viso=viso); freefem++-3.38-1/examples++-chapt3/heatex.edp000755 000767 000024 00000001545 12167254041 020712 0ustar00hechtstaff000000 000000 // file heatex.edp int C1=99, C2=98; // could be anything border C0(t=0,2*pi){x=5*cos(t); y=5*sin(t);} border C11(t=0,1){ x=1+t; y=3; label=C1;} border C12(t=0,1){ x=2; y=3-6*t; label=C1;} border C13(t=0,1){ x=2-t; y=-3; label=C1;} border C14(t=0,1){ x=1; y=-3+6*t; label=C1;} border C21(t=0,1){ x=-2+t; y=3; label=C2;} border C22(t=0,1){ x=-1; y=3-6*t; label=C2;} border C23(t=0,1){ x=-1-t; y=-3; label=C2;} border C24(t=0,1){ x=-2; y=-3+6*t; label=C2;} mesh Th=buildmesh( C0(50) + C11(5)+C12(20)+C13(5)+C14(20) + C21(-5)+C22(-20)+C23(-5)+C24(-20)); plot(Th,wait=1,ps="heatexTh.ps"); fespace Vh(Th,P1); Vh u,v; Vh kappa=1+4*(x<-1)*(x>-2)*(y<3)*(y>-3); solve a(u,v)= int2d(Th)(kappa*(dx(u)*dx(v)+dy(u)*dy(v))) +on(C0,u=20)+on(C1,u=100); plot(u,value=true,wait=1,fill=true); freefem++-3.38-1/examples++-chapt3/lame.edp000755 000767 000024 00000001722 11406142255 020345 0ustar00hechtstaff000000 000000 // file lame.edd mesh Th=square(10,10,[20*x,2*y-1]); fespace Vh(Th,P2); Vh u,v,uu,vv; real sqrt2=sqrt(2.); macro epsilon(u1,u2) [dx(u1),dy(u2),(dy(u1)+dx(u2))/sqrt2] // EOM // remark the $1/\sqrt2$ in term (dy(u1)+dx(u2)) is because // we want: // epsilon(u1,u2)'* epsilon(v1,v2) == $ \varepsilon(\bm{u}): varepsilon(\bm{v})$ macro div(u,v) ( dx(u)+dy(v) ) // EOM real E = 21e5, nu = 0.28, mu= E/(2*(1+nu)); real lambda = E*nu/((1+nu)*(1-2*nu)), f = -1; // solve lame([u,v],[uu,vv])= int2d(Th)( lambda*div(u,v)*div(uu,vv) +2.*mu*( epsilon(u,v)'*epsilon(uu,vv) ) ) - int2d(Th)(f*vv) + on(4,u=0,v=0); real coef=100; plot([u,v],wait=1,ps="lamevect.eps",coef=coef); mesh th1 = movemesh(Th, [x+u*coef, y+v*coef]); plot(th1,wait=1,ps="lamedeform.eps"); real dxmin = u[].min; real dymin = v[].min; cout << " - dep. max x = "<< dxmin<< " y=" << dymin << endl; cout << " dep. (20,0) = " << u(20,0) << " " << v(20,0) << endl; freefem++-3.38-1/examples++-chapt3/Makefile.am000644 000767 000024 00000002575 12212035762 020775 0ustar00hechtstaff000000 000000 # $Id$ all-local: all.edp regtests.edp freefem++.pref TESTS=BlackScholes2D.edp NSNewton.edp NSprojection.edp condensor.edp convects.edp heatex.edp lame.edp membrane.edp membranerror.edp muwave.edp optimcontrol.edp potential.edp schwarz.edp sound.edp stokes.edp test1.edp testbed.edp thermal.edp thermic.edp # if .. no arpack ... XFAIL_TESTS=sound.edp EXTRA_DIST=*.edp all.edp regtests.edp regtests.m4 ref.edp LOG_DRIVER=$(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT=TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw all.edp: (echo "NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ # To create a new set of reference values in "ref.edp" Ref: makeref.edp ../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref FORCE:freefem++-3.38-1/examples++-chapt3/Makefile.in000644 000767 000024 00000110567 12543260337 021014 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++-chapt3 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = BlackScholes2D.edp NSNewton.edp NSprojection.edp condensor.edp convects.edp heatex.edp lame.edp membrane.edp membranerror.edp muwave.edp optimcontrol.edp potential.edp schwarz.edp sound.edp stokes.edp test1.edp testbed.edp thermal.edp thermic.edp # if .. no arpack ... XFAIL_TESTS = sound.edp EXTRA_DIST = *.edp all.edp regtests.edp regtests.m4 ref.edp LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-chapt3/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-chapt3/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? BlackScholes2D.edp.log: BlackScholes2D.edp @p='BlackScholes2D.edp'; \ b='BlackScholes2D.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSNewton.edp.log: NSNewton.edp @p='NSNewton.edp'; \ b='NSNewton.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSprojection.edp.log: NSprojection.edp @p='NSprojection.edp'; \ b='NSprojection.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) condensor.edp.log: condensor.edp @p='condensor.edp'; \ b='condensor.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convects.edp.log: convects.edp @p='convects.edp'; \ b='convects.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) heatex.edp.log: heatex.edp @p='heatex.edp'; \ b='heatex.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lame.edp.log: lame.edp @p='lame.edp'; \ b='lame.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) membrane.edp.log: membrane.edp @p='membrane.edp'; \ b='membrane.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) membranerror.edp.log: membranerror.edp @p='membranerror.edp'; \ b='membranerror.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) muwave.edp.log: muwave.edp @p='muwave.edp'; \ b='muwave.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) optimcontrol.edp.log: optimcontrol.edp @p='optimcontrol.edp'; \ b='optimcontrol.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) potential.edp.log: potential.edp @p='potential.edp'; \ b='potential.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) schwarz.edp.log: schwarz.edp @p='schwarz.edp'; \ b='schwarz.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sound.edp.log: sound.edp @p='sound.edp'; \ b='sound.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) stokes.edp.log: stokes.edp @p='stokes.edp'; \ b='stokes.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test1.edp.log: test1.edp @p='test1.edp'; \ b='test1.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testbed.edp.log: testbed.edp @p='testbed.edp'; \ b='testbed.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) thermal.edp.log: thermal.edp @p='thermal.edp'; \ b='thermal.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) thermic.edp.log: thermic.edp @p='thermic.edp'; \ b='thermic.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic cscopelist-am ctags-am distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am .PRECIOUS: Makefile all-local: all.edp regtests.edp freefem++.pref all.edp: (echo "NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ # To create a new set of reference values in "ref.edp" Ref: makeref.edp ../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref FORCE: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-chapt3/membrane.edp000755 000767 000024 00000001710 12167254041 021214 0ustar00hechtstaff000000 000000 // file membrane.edp real theta=4.*pi/3.; real a=2.,b=1.; // the length of the semimajor axis and semiminor axis func z=x; border Gamma1(t=0,theta) { x = a * cos(t); y = b*sin(t); } border Gamma2(t=theta,2*pi) { x = a * cos(t); y = b*sin(t); } mesh Th=buildmesh(Gamma1(100)+Gamma2(50)); // construction of mesh fespace Vh(Th,P2); // P2 conforming triangular FEM Vh phi,w, f=1; solve Laplace(phi,w)=int2d(Th)(dx(phi)*dx(w) + dy(phi)*dy(w)) - int2d(Th)(f*w) + on(Gamma1,phi=z); // resolution of laplace equation plot(phi,wait=true, ps="membrane.eps"); //Plot Th and v plot(Th,wait=true, ps="membraneTh.eps"); //Plot Th and v // to build a gnuplot data file { ofstream ff("graph.txt"); for (int i=0;i 2; u2=0; // Physical parameter real nu= 1./50, nufinal=1/200. ,cnu=0.5; // stop test for Newton real eps=1e-6; verbosity=0; while(1) // Loop on vicosity { int n; real err=0; for( n=0;n< 15;n++) // Newton Loop { solve Oseen([du1,du2,dp],[v1,v2,q]) = int2d(Th) ( nu*(Grad(du1,du2)'*Grad(v1,v2) ) + UgradV(du1,du2, u1, u2)'*[v1,v2] + UgradV( u1, u2,du1,du2)'*[v1,v2] - div(du1,du2)*q - div(v1,v2)*dp - 1e-8*dp*q // stabilization term ) - int2d(Th) ( nu*(Grad(u1,u2)'*Grad(v1,v2) ) + UgradV(u1,u2, u1, u2)'*[v1,v2] - div(u1,u2)*q - div(v1,v2)*p - 1e-8*p*q ) + on(1,du1=0,du2=0) ; u1[] -= du1[]; u2[] -= du2[]; p[] -= dp[]; real Lu1=u1[].linfty, Lu2 = u2[].linfty , Lp = p[].linfty; err= du1[].linfty/Lu1 + du2[].linfty/Lu2 + dp[].linfty/Lp; cout << n << " err = " << err << " " << eps << " rey =" << 1./nu << endl; if(err < eps) break; // converge if( n>3 && err > 10.) break; // Blowup ???? } if(err < eps) // if converge decrease nu (more difficulte) { plot([u1,u2],p,wait=1,cmm=" rey = " + 1./nu , coef=0.3,bb=bb); if( nu == nufinal) break; if( n < 4) cnu=cnu^1.5; // fast converge => change faster nu = max(nufinal, nu* cnu); // new vicosity u1p=u1; u2p=u2; pp=p; // save correct solution ... } else { // if blowup, increase nu (more simple) assert(cnu< 0.95); // final blowup ... nu = nu/cnu; // get previous value of viscosity cnu= cnu^(1./1.5); // no conv. => change lower nu = nu* cnu; // new vicosity cout << " restart nu = " << nu << " Rey= "<< 1./nu << " (cnu = " << cnu << " ) \n"; // restore correct solution .. u1=u1p; u2=u2p; p=pp; } } freefem++-3.38-1/examples++-chapt3/NSprojection-Opt.edp000755 000767 000024 00000007350 12401300130 022567 0ustar00hechtstaff000000 000000 // file NSprojection.edp // Version july 2014, // FH. Change B.C on u on outpout , more simple .. // ............ verbosity=0; border a0(t=1,0){ x=-2; y=t; label=1;}// inlet .. border a1(t=-2,0){ x=t; y=0; label=2;} border a2(t=0,-0.5){ x=0; y=t; label=2;} border a3(t=0,1){ x=18*t^1.2; y=-0.5; label=2;} border a4(t=-0.5,1){ x=18; y=t; label=3;}// outlet border a5(t=1,0){ x=-2+20*t; y=1; label=4;} int n=1; mesh Th= buildmesh(a0(3*n)+a1(20*n)+a2(10*n)+a3(150*n)+a4(5*n)+a5(100*n)); plot(Th); fespace Vh(Th,P1); fespace Wh(Th,[P1,P1]); real nu = 0.0025, dt = 0.2; // Reynolds=200 Vh w,u = 0, v =0, p = 0, q=0; Vh uold,vold,pold; // def of Matrix dtMx and dtMy matrix M1,Mdx,Mdy,AAu,AAv,AAp; real[int] rhsu(Vh.ndof), rhsv(Vh.ndof), rhsp(Vh.ndof); real[int] rhsu0(Vh.ndof), rhsv0(Vh.ndof), rhsp0(Vh.ndof); macro BuildMat() { /* for memory managenemt */ w=w; u=u; v=v; p=p; q=q; uold=0; vold=0; pold=0; varf vM(unused,v) = int2d(Th)(v) ; varf vdx(u,v) = int2d(Th)(v*dx(u)) ; varf vdy(u,v) = int2d(Th)(v*dy(u)) ; varf pb4u(u,w) =int2d(Th)(u*w/dt +nu*(dx(u)*dx(w)+dy(u)*dy(w))) + on(1,u = 4*y*(1-y)) + on(2,4,u = 0) ; varf pb4v(v,w) = int2d(Th)(v*w/dt +nu*(dx(v)*dx(w)+dy(v)*dy(w))) +on(1,2,3,4,v = 0); varf pb4p(q,w) = int2d(Th)(dx(q)*dx(w)+dy(q)*dy(w)) + on(3,q=0); AAu = pb4u(Vh,Vh,solver=sparsesolver); AAv = pb4v(Vh,Vh,solver=sparsesolver); AAp = pb4p(Vh,Vh,solver=sparsesolver); rhsu.resize(Vh.ndof); rhsv.resize(Vh.ndof); rhsp.resize(Vh.ndof); rhsu0.resize(Vh.ndof); rhsv0.resize(Vh.ndof); rhsp0.resize(Vh.ndof); rhsu0 = pb4u(0,Vh); rhsv0 = pb4v(0,Vh); rhsp0 = pb4p(0,Vh); real[int] Mlump = vM(0,Vh); real[int] one(Vh.ndof); one = 1; real[int] aM1 = one ./ Mlump; M1 = aM1; Mdx = vdx(Vh,Vh); Mdy = vdy(Vh,Vh); } // BuildMat real err=1, outflux=1; for(int n=0;n<300;n++) { varf cpb4u(u,w) = int2d(Th)((convect([uold,vold],-dt,uold)/dt)*w); varf cpb4v(u,w) = int2d(Th)((convect([uold,vold],-dt,vold)/dt)*w); uold[] = u[]; vold[] = v[]; pold[]=p[]; p[]=-p[]; rhsu = rhsu0; rhsv = rhsv0; rhsp = 0; rhsu += Mdx*p[]; rhsv += Mdy*p[]; rhsu += cpb4u(0,Vh); rhsv += cpb4v(0,Vh); u[]= AAu^-1*rhsu; v[]= AAv^-1*rhsv; rhsp += Mdx*u[]; rhsp += Mdy*v[]; rhsp /= dt; rhsp += rhsp0; q[]= AAp^-1*rhsp; p[] = pold[] -q[]; rhsu = Mdx*q[]; rhsv = Mdy*q[]; rhsu *= dt; rhsv *= dt; u[] += rhsu; v[] += rhsv; plot(u); /* solve pb4u(u,w,init=n,solver=CG,eps=epsu) =int2d(Th)(u*w/dt +nu*(dx(u)*dx(w)+dy(u)*dy(w))) -int2d(Th)((convect([uold,vold],-dt,uold)/dt-dx(p))*w) + on(1,u = 4*y*(1-y)) + on(2,4,u = 0) ; plot(u); solve pb4v(v,w,init=n,solver=CG,eps=epsv) = int2d(Th)(v*w/dt +nu*(dx(v)*dx(w)+dy(v)*dy(w))) -int2d(Th)((convect([uold,vold],-dt,vold)/dt-dy(p))*w) +on(1,2,3,4,v = 0); solve pb4p(q,w,solver=CG,init=n,eps=epsp) = int2d(Th)(dx(q)*dx(w)+dy(q)*dy(w)) - int2d(Th)((dx(u)+ dy(v))*w/dt)+ on(3,q=0); // to have absolute epsilon in CG algorithm. epsv = -abs(epsv); epsu = -abs(epsu); epsp = -abs(epsp); p = pold-q; u[] += dtM1x*q[]; v[] += dtM1y*q[]; */ if(n%50==49){ Th = adaptmesh(Th,[u,v],q,err=0.04,nbvx=100000); plot(Th, wait=true); BuildMat // rebuild mat. } err = sqrt(int2d(Th)(square(u-uold)+square(v-vold))/Th.area) ; outflux = int1d(Th)( [u,v]'*[N.x,N.y]) ; cout << " iter " << n << " Err L2 = " << err << " "<< " flux sortant = "<< outflux << endl; if(err < 1e-3) break; } assert(abs(outflux)< 2e-3); // verifaction ... plot(p,wait=1,ps="NSprojP.eps"); plot(u,wait=1,ps="NSprojU.eps"); freefem++-3.38-1/examples++-chapt3/NSprojection.edp000755 000767 000024 00000004632 12401077145 022050 0ustar00hechtstaff000000 000000 // file NSprojection.edp // Version july 2014, // FH. Change B.C on u on outpout , more simple .. // ............ verbosity=0; border a0(t=1,0){ x=-2; y=t; label=1;}// inlet .. border a1(t=-2,0){ x=t; y=0; label=2;} border a2(t=0,-0.5){ x=0; y=t; label=2;} border a3(t=0,1){ x=18*t^1.2; y=-0.5; label=2;} border a4(t=-0.5,1){ x=18; y=t; label=3;}// outlet border a5(t=1,0){ x=-2+20*t; y=1; label=4;} int n=1; mesh Th= buildmesh(a0(3*n)+a1(20*n)+a2(10*n)+a3(150*n)+a4(5*n)+a5(100*n)); plot(Th); fespace Vh(Th,P1); real nu = 0.0025, dt = 0.2; // Reynolds=200 Vh w,u = 0, v =0, p = 0, q=0; real epsv = 1e-6, epsu = 1e-6, epsp = 1e-6;// Eps CG .. // def of Matrix dtMx and dtMy matrix dtM1x,dtM1y; macro BuildMat() { /* for memory managenemt */ varf vM(unused,v) = int2d(Th)(v) ; varf vdx(u,v) = int2d(Th)(v*dx(u)*dt) ; varf vdy(u,v) = int2d(Th)(v*dy(u)*dt) ; real[int] Mlump = vM(0,Vh); real[int] one(Vh.ndof); one = 1; real[int] M1 = one ./ Mlump; matrix dM1 = M1; matrix Mdx = vdx(Vh,Vh); matrix Mdy = vdy(Vh,Vh); dtM1x = dM1*Mdx; dtM1y = dM1*Mdy; }// BuildMat real err=1, outflux=1; for(int n=0;n<300;n++) { Vh uold = u, vold = v, pold=p; solve pb4u(u,w,init=n,solver=CG,eps=epsu) =int2d(Th)(u*w/dt +nu*(dx(u)*dx(w)+dy(u)*dy(w))) -int2d(Th)((convect([uold,vold],-dt,uold)/dt-dx(p))*w) + on(1,u = 4*y*(1-y)) + on(2,4,u = 0) ; plot(u); solve pb4v(v,w,init=n,solver=CG,eps=epsv) = int2d(Th)(v*w/dt +nu*(dx(v)*dx(w)+dy(v)*dy(w))) -int2d(Th)((convect([uold,vold],-dt,vold)/dt-dy(p))*w) +on(1,2,3,4,v = 0); solve pb4p(q,w,solver=CG,init=n,eps=epsp) = int2d(Th)(dx(q)*dx(w)+dy(q)*dy(w)) - int2d(Th)((dx(u)+ dy(v))*w/dt)+ on(3,q=0); // to have absolute epsilon in CG algorithm. epsv = -abs(epsv); epsu = -abs(epsu); epsp = -abs(epsp); p = pold-q; u[] += dtM1x*q[]; v[] += dtM1y*q[]; if(n%50==49){ Th = adaptmesh(Th,[u,v],q,err=0.04,nbvx=100000); plot(Th, wait=true); BuildMat // rebuild mat. } err = sqrt(int2d(Th)(square(u-uold)+square(v-vold))/Th.area) ; outflux = int1d(Th)( [u,v]'*[N.x,N.y]) ; cout << " iter " << n << " Err L2 = " << err << " "<< " flux sortant = "<< outflux << endl; if(err < 1e-3) break; } assert(abs(outflux)< 2e-3); // verifaction ... plot(p,wait=1,ps="NSprojP.eps"); plot(u,wait=1,ps="NSprojU.eps"); freefem++-3.38-1/examples++-chapt3/optimcontrol.edp000644 000767 000024 00000002610 11406142255 022152 0ustar00hechtstaff000000 000000 // file optimcontrol.edp border aa(t=0, 2*pi) { x = 5*cos(t); y = 5*sin(t); }; border bb(t=0, 2*pi) { x = cos(t); y = sin(t); }; border cc(t=0, 2*pi) { x = -3+cos(t); y = sin(t); }; border dd(t=0, 2*pi) { x = cos(t); y = -3+sin(t); }; mesh th = buildmesh(aa(70)+bb(35)+cc(35)+dd(35)); fespace Vh(th,P1); Vh Ib=((x^2+y^2)<1.0001), Ic=(((x+3)^2+ y^2)<1.0001), Id=((x^2+(y+3)^2)<1.0001), Ie=(((x-1)^2+ y^2)<=4), ud,u,uh,du; real[int] z(3); problem A(u,uh) =int2d(th)((1+z[0]*Ib+z[1]*Ic+z[2]*Id)*(dx(u)*dx(uh) +dy(u)*dy(uh))) + on(aa,u=x^3-y^3); z[0]=2; z[1]=3; z[2]=4; A; ud=u; ofstream f("J.txt"); func real J(real[int] & Z) { for (int i=0;i absolue stop test \index{precon=} LinearCG(divup,p[],eps=-1.e-6,nbiter=50,precon=CahouetChabart); divup(p[]); // computed the velocity plot([u1,u2],p,wait=!(idt%10),value= 1,coef=0.1); } */freefem++-3.38-1/examples++-chapt3/thermal.edp000755 000767 000024 00000001524 12167254041 021065 0ustar00hechtstaff000000 000000 // file heatex.edp int C1=99, C2=98; // could be anything border C0(t=0,2*pi){x=5*cos(t); y=5*sin(t);} border C11(t=0,1){ x=1+t; y=3; label=C1;} border C12(t=0,1){ x=2; y=3-6*t; label=C1;} border C13(t=0,1){ x=2-t; y=-3; label=C1;} border C14(t=0,1){ x=1; y=-3+6*t; label=C1;} border C21(t=0,1){ x=-2+t; y=3; label=C2;} border C22(t=0,1){ x=-1; y=3-6*t; label=C2;} border C23(t=0,1){ x=-1-t; y=-3; label=C2;} border C24(t=0,1){ x=-2; y=-3+6*t; label=C2;} mesh Th=buildmesh( C0(50) + C11(5)+C12(20)+C13(5)+C14(20) + C21(-5)+C22(-20)+C23(-5)+C24(-20)); plot(Th,wait=1); fespace Vh(Th,P1); Vh u,v; Vh kappa=1+4*(x<-1)*(x>-2)*(y<3)*(y>-3); solve a(u,v)= int2d(Th)(kappa*(dx(u)*dx(v)+dy(u)*dy(v))) +on(C0,u=20)+on(C1,u=100); plot(u,value=true,wait=1,fill=true); freefem++-3.38-1/examples++-chapt3/thermic.edp000755 000767 000024 00000002426 12167254041 021066 0ustar00hechtstaff000000 000000 // file thermal.edp func u0 =10+90*x/6; func k = 1.8*(y<0.5)+0.2; real ue = 25, alpha=0.25, T=5, dt=0.1 ; mesh Th=square(30,5,[6*x,y]); fespace Vh(Th,P1); /* Vh u=u0,v,uold; // for the flat plate problem thermic(u,v)= int2d(Th)(u*v/dt + k*(dx(u) * dx(v) + dy(u) * dy(v))) + int1d(Th,1,3)(alpha*u*v) - int1d(Th,1,3)(alpha*ue*v) - int2d(Th)(uold*v/dt) + on(2,4,u=u0); // for the rod problem thermaxi(u,v)=int2d(Th)((u*v/dt + dx(u)*dx(v) + dy(u)*dy(v))*x) + int1d(Th,3)(alpha*x*u*v) - int1d(Th,3)(alpha*x*ue*v) - int2d(Th)(uold*v*x/dt) + on(2,4,u=u0); ofstream ff("thermic.dat"); for(real t=0;t> reylnods; assert(reylnods>1 && reylnods < 100000); up1=0; up2=0; func g=(x)*(1-x)*4; Vh p=0,q; real alpha=0; real nu=1; int i=0,iter=0; real dt=0; real sig = 2*classique-1; varf vNS([u1,u2,p],[v1,v2,q]) = int2d(Th)( alpha*( u1*v1 + u2*v2) + nu * ( dx(u1)*dx(v1) + dy(u1)*dy(v1) + dx(u2)*dx(v2) + dy(u2)*dy(v2) ) + p*q*(0.000001) - p*dx(v1) - p*dy(v2) - dx(u1)*q - dy(u2)*q ) + int2d(Th) ( sig*(-alpha*convect([up1,up2],-dt,up1)*v1 -alpha*convect([up1,up2],-dt,up2)*v2 ) ) + on(3,u1=g,u2=0) + on(1,2,4,u1=0,u2=0) ; solve NS ([u1,u2,p],[v1,v2,q],solver=UMFPACK,init=i,save="toto") = vNS; cout << "-- n " << p[].n << " stokes " << endl; cout << "-- u1 : " << u1[].min << " " << u1[].max << endl; cout << "-- u2 : " << u2[].min << " " << u2[].max << endl; cout << "-- p : " << p[].min << " " << p[].max << endl; //plot(coef=0.2,cmm=" [u1,u2] et p ",p,[u1,u2],ps="StokesP2P1.eps",value=1,wait=1); dt = 0.1; int nbiter = 2; real coefdt = 0.25^(1./nbiter); real coefcut = 0.25^(1./nbiter) , cut=0.01; real tol=0.5,coeftol = 0.25^(1./nbiter); nu=1./reylnods; Wh [uu1,uu2,pp]; Wh [vv1,vv2,qq]; Wh [f1,f2,fp]; for (iter=1;iter<=nbiter;iter++) { cout << " dt = " << dt << " ------------------------ sig ="<< sig << endl; alpha=1/dt; for (i=0;i<=1;i++) { up1=u1; up2=u2; matrix A=vNS(Wh,Wh,solver=UMFPACK); // set(A,solver=UMFPACK); // set a solver verbosity=3; if(classique) { //NS; solve NS1 ([uu1,uu2,pp],[vv1,vv2,qq],solver=UMFPACK,init=i,save="toto") = vNS; } else { f1[] = vNS(0,Wh); { ofstream tt("tt.matrix"); tt << A << endl; } { ofstream tt("tt.b"); tt << f1[] << endl; } uu1[] = A^-1*f1[]; } verbosity=1; u1=uu1; u2=uu2; p = pp; cout << "-- n " << p[].n << endl; cout << "-- u1 : " << u1[].min << " " << u1[].max << endl; cout << "-- u2 : " << u2[].min << " " << u2[].max << endl; cout << "-- p : " << p[].min << " " << p[].max << endl; if ( !(i % 10)) plot(coef=0.2,cmm=" [u1,u2] et p ",p,[u1,u2],ps="plotNS_"+iter+"_"+i+".eps"); cout << "CPU " << clock()-s0 << "s " << endl; } if (iter>= nbiter) break; Th=adaptmesh(Th,[dx(u1),dy(u1),dx(u1),dy(u2)], abserror=0,cutoff=cut,err=tol, inquire=0,ratio=1.5,hmin=1./1000); plot(Th,ps="ThNS.eps"); dt = dt*coefdt; tol = tol *coeftol; cut = cut *coefcut; } cout << "CPU " << clock()-s0 << "s " << endl; freefem++-3.38-1/examples++-bug/bug-arg-string.edp000644 000767 000024 00000001343 11406142255 021646 0ustar00hechtstaff000000 000000 // bug string macro parameter version < 1.41 // bug in string parameter version before <2.5 // ----------------- macro tyty(uu) uu// cout << tyty("toto") << endl; // other bug un func parameter no correct func string write(string fn,real[int] & u) { cout <<"write : " << fn << " u = "<< u << endl; // delete 2 times before version 2.5 return fn; } func string write1(string fn,real[int] & u) { cout << "write 1 " << fn << " u = " << u << endl; string toto=fn; ; return toto+"dfsdf"; } real[int] u(3); u=1; string tt=tyty("toto1"+1+" -- 77"); string t1="0123456789";// write(tt,u); string t2= write1(t1,u)+write1(tt,u); cout << " t2 = " << t2 << endl;freefem++-3.38-1/examples++-bug/bugborder.edp000644 000767 000024 00000002177 11406142255 020777 0ustar00hechtstaff000000 000000 verbosity=0; real x0=0.0, x1=1.5; real y0=0.0, y1=2.0; real xx0=0.5, xx1=1.; real yy0=0.5, yy1=1.; int acc,ref, i; real sH; ref=10; border a( t= x0,x1){ x= t ; y= y0; label=1; }; border b( t= y0,y1){ x= x0; y= t ; label=2; }; border c( t= x0,x1){ x= t ; y= y1; label=3; }; border d( t= y0,y1){ x= x1; y= t ; label=4; }; border aa( t= xx0,xx1){ x= t ; y= yy0; label=1; }; border bb( t= yy0,yy1){ x= xx0; y= t ; label=2; }; border cc( t= xx0,xx1){ x= t ; y= yy1; label=3; }; border dd( t= yy0,yy1){ x= xx1; y= t ; label=4; }; //cout << "enter accuracy = "; //cin >> acc; acc=0; // Creation des maillages grossier et fin //mesh TH=square(ref,ref,[x0+(x1-x0)*x,y0+(y1-y0)*y]); mesh TH = buildmesh( a(10) + b(-10) + c(-10) + d(+10) +aa(-10) + bb(+10) + cc(+10) + dd(-10) ); plot(TH,wait=1); end; { // hole real pi=4.0*atan(1); border a(t=0,2*pi){ x=cos(t); y=sin(t);label=1;}; border b(t=0,2*pi){ x=0.3+0.3*cos(t); y=0.3*sin(t);label=2;}; mesh Thwithouthole= buildmesh(a(50)+b(+30)); mesh Thwithhole = buildmesh(a(50)+b(-30)); plot(Thwithouthole,wait=1,ps="Thwithouthole.eps"); plot(Thwithhole,wait=1,ps="Thwithhole.eps"); }freefem++-3.38-1/examples++-bug/bugf.edp000644 000767 000024 00000000435 11406142255 017742 0ustar00hechtstaff000000 000000 // routine // bug before version 1.27 pb passage d'argument func int myfunction(real a1) { int i=a1*a1/1; return i; }; func real myfunction(real a,real b) { real z =myfunction(a)+b; return z; }; // appele cout << myfunction(1.0,3.) << " " << myfunction(1,3) << endl; freefem++-3.38-1/examples++-bug/bugifexp.edp000644 000767 000024 00000000164 12154364011 020624 0ustar00hechtstaff000000 000000 mesh Th=square(10,10); fespace Vh(Th,P1); // bug due to optimisation process .. HARD .... FH Vh u = y ? 1./y : x;freefem++-3.38-1/examples++-bug/bugv1.18.edp000644 000767 000024 00000000251 11406142255 020266 0ustar00hechtstaff000000 000000 // bug correct in version 1.19 cout << ( 10. < 2 ) << endl; cout << ( 10. < 2. ) << endl; mesh Th=square(5,5); fespace Xh(Th,P2); Xh v; v=label; plot(v,value=1,wait=1); freefem++-3.38-1/examples++-bug/fe-vect.edp000644 000767 000024 00000000654 11406142255 020353 0ustar00hechtstaff000000 000000 mesh Th = square(10,10); fespace Wh(Th,[P2,P2]); // R2->R2 Wh [F1,F2]; //def de l'inconnu et des fonct tests F1 = 1; // il y a un bug ici car dans un element fini vectoriel // il est impossible defini juste une composante // il faut faire: cout << F1(0.5, 0.6) << endl; cout << F2(0.5, 0.6) << endl; cout << F1(0.5, 0.6); [F1,F2]=[1,2]; cout << " -- F1 " << F1(0.5, 0.6) << endl; cout << " -- F2 " << F2(0.5, 0.6) << endl;freefem++-3.38-1/examples++-bug/FE0.edp000644 000767 000024 00000001037 12130731352 017365 0ustar00hechtstaff000000 000000 {// example with no mesh .. mesh Th,Th1; // no mesh fespace Vh(Th,P2); Vh u,v; // ok varf a(u,v) = int2d(Th1)(u*v) + int2d(Th)(v) +on(1,u=1); matrix A=a(Vh,Vh); real[int] b=a(0,Vh); problem PPP(u,v) = int2d(Th)(u*v) + int2d(Th)(v) +on(1,u=1); Th=square(1,1); u=x; } { load "msh3" mesh3 Th; // no mesh fespace Vh(Th,P2); Vh u,v; // ok varf a(u,v) = int2d(Th)(u*v) + int2d(Th)(v) +on(1,u=1); matrix A=a(Vh,Vh); real[int] b=a(0,Vh); problem PPP(u,v) = int2d(Th)(u*v) + int2d(Th)(v) +on(1,u=1); Th=buildlayers(square(2,2),3); u=x; } freefem++-3.38-1/examples++-bug/func.edp000644 000767 000024 00000000302 12051112444 017735 0ustar00hechtstaff000000 000000 // bug -- mesh Th=square(1,1); fespace Vh(Th,P1); Vh u; func real ff( Vh & u) { return u;} func real xx(real x){ return x;} func real yy(func real(real xx)) { return xx(1);} func f=1; f=2; freefem++-3.38-1/examples++-bug/Makefile.am000644 000767 000024 00000000031 11406142255 020351 0ustar00hechtstaff000000 000000 # $Id$ EXTRA_DIST=*.edp freefem++-3.38-1/examples++-bug/Makefile.in000644 000767 000024 00000040730 12543260337 020401 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++-bug ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = *.edp all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-bug/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-bug/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-bug/SegmentationFault.edp000755 000767 000024 00000004224 11406142255 022453 0ustar00hechtstaff000000 000000 //////////////////////////////////// // Optimisation d'une 'grue' // // volume constant // // avec un maillage sous-jacent // // qu'on adpate a x^2 et y ^2 mais avec une // erreur constante // // plante de temps a autre (depend de niter !!!) //////////////////////////////////// // Nom du fichier de sauvegarde string sauve="grue"; // nombre d'itrations int niter=1; //nombre de sauvegardes du maillage (1)*(x<4); func cuty =(y>1)*(x<4); //dfinition des bords de la forme //label = // 1:Condition de Dirichlet // 2:Condition Libre // 3:Condition de Neuman non nulles border a1(t=8,9) {x=5; y=t;label=3;}; // logement de la charge border b(t=5,0) {x=t; y=9;label=2;}; // haut de la grue border c1(t=1.5,5) {x=t; y=8;label=2;}; //bras de la grue border d2(t=9,0) {x=-0.5+0.5/9*t; y=t;label=2;}; //cote gauche de la grue border d1(t=0,8) {x=0.5+t/8; y=t;label=2;} //cote droit de la grue border e(t=-0.5,0.5) {x=t; y=0;label=1;}; //base de la grue // forces appliques func g1=0; func g2=-1; // coefficients de Young et de Lam real lambda=12; real mu=6; // coefficients de Lam du matriau cout <<"lambda,mu ="< 0.2); } //EOF Verif(x,1) Verif(y,2) Verif(z,3) assert(err==0); freefem++-3.38-1/examples++-3d/cube-period.edp000644 000767 000024 00000003776 12167254041 020763 0ustar00hechtstaff000000 000000 load "msh3" int nn=10;; mesh Th2=square(nn,nn,region=0); fespace Vh2(Th2,P2); // // label face numbering // 1 : ( x == xmin) 2 : ( x == xmax) // 3 : ( y == ymin) 4 : ( y == ymax) // 5 : ( z == zmin) 6 : ( z == zmax) // --- int[int] rup=[0,5], rdown=[0,6], rmid=[4,1,2,2, 1,3 ,3,4]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], // region=r1, labelmid=rmid, reffaceup = rup, reffacelow = rdown); cout << "Th : nv = " << Th.nv << " nt =" << Th.nt << endl; savemesh(Th,"Th.mesh"); verbosity=10; // the Finite element space with full periodic condition in 3 axes fespace Vh(Th,P2,periodic=[[1,y,z],[2,y,z],[3,x,z],[4,x,z],[5,x,y],[6,x,y]]); verbosity=2; // a code to build some verification .... fespace Vhh(Th,P2); int[int] num(Vhh.ndof); num=-1; int er=0; for(int k=0;k int n2 = n1-1; // int nnn=n2*n2*n2; int nnn1=n1*n1*n1; cout << " ndf pare= " << Vh.ndof << " " << nnn << endl; cout << " ndf = " << Vhh.ndof << " " << nnn1 << endl; assert(er==0 && nnn == Vh.ndof && nnn1 == Vhh.ndof); // some verification ... Vh u,v,uu; real x0=2*pi/3,y0=2*pi/4,z0=2*pi*2/3; func ue= sin(2*pi*x+x0)*sin(2*pi*y+y0)*sin(2*pi*z+z0); real cc= -3*(2*pi)^2 ; func f = -cc*ue; uu=ue; macro Grad(u) [dx(u),dy(u),dz(u)] //; solve P(u,v,solver=CG)= int3d(Th)(Grad(u)'*Grad(v)) - int3d(Th)(f*v); //') ; cout << "Err L2 = " << sqrt(int3d(Th)( square(u-uu)) ) << endl; // FFCS: add 3D view ///Vh2 u0=u(x,y,0); ///Vh2 u1=u(x,y,1); ///plot(u0,u1,wait=1); plot(u,nbiso=10); freefem++-3.38-1/examples++-3d/cube.idp000644 000767 000024 00000002203 12306336277 017476 0ustar00hechtstaff000000 000000 load "msh3" load "medit" // ! basic functions to build regular mesh of a cube /* mesh3 Cube(NN,BB,L); -- build the surface mesh of a 3d box where: for exqmple: int[int] NN=[nx,ny,nz]; // the number of seg in the 3 direction real [int,int] BB=[[xmin,xmax],[ymin,ymax],[zmin,zmax]]; // bounding bax int [int,int] L=[[1,2],[3,4],[5,6]]; // the label of the 6 face left,right, front, back, down, right */ func mesh3 Cube(int[int] & NN,real[int,int] &BB ,int[int,int] & L) { // first build the 6 faces of the hex. real x0=BB(0,0),x1=BB(0,1); real y0=BB(1,0),y1=BB(1,1); real z0=BB(2,0),z1=BB(2,1); int nx=NN[0],ny=NN[1],nz=NN[2]; mesh Thx = square(nx,ny,[x0+(x1-x0)*x,y0+(y1-y0)*y]); int[int] rup=[0,L(2,1)], rdown=[0,L(2,0)], rmid=[1,L(1,0), 2,L(0,1), 3, L(1,1), 4, L(0,0) ]; mesh3 Th=buildlayers(Thx,nz, zbound=[z0,z1], labelmid=rmid, labelup = rup, labeldown = rdown); return Th; } func mesh3 Cube(int Nx,int Ny,int Nz) { int[int] NN=[Nx,Ny,Nz]; real [int,int] BB=[[0,1],[0,1],[0,1]]; int[int,int] LL=[[1,2],[3,4],[5,6]]; return Cube(NN,BB,LL); } freefem++-3.38-1/examples++-3d/cylinder-3d.edp000644 000767 000024 00000000677 12167254041 020677 0ustar00hechtstaff000000 000000 load "msh3"// buildlayer load "medit"// buildlayer border C(t=0,2*pi) { x = cos(t); y=sin(t); label=1;} mesh Baseh = buildmesh(C(20)); plot(Baseh,wait=1); int[int] rup=[0,1], rdown=[0,2], rmid=[1,3]; func zmin= 1; func zmax= 10; int nlayer=100; mesh3 Th=buildlayers(Baseh,nlayer, coef= 1., zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); medit("Cyl",Th,wait=1); // FFCS: testing 3d plots plot(Th,cmm="Cyl"); freefem++-3.38-1/examples++-3d/cylinder.edp000644 000767 000024 00000002125 12167254041 020361 0ustar00hechtstaff000000 000000 load "msh3" load "tetgen" load "medit" // Maillage d'un cylindre d'axe 0x // int nx=10; // nombre de points le long de l'axe int nth=50; // nombre de points sur la circonference real xmin=1.,xmax=3.; // Maillage de cercles pour les deux faces border cc(t=0,2*pi){x=cos(t);y=sin(t);label=1;} mesh Thcercle = buildmesh(cc(nth)); // Maillage de carre qui va etre applique au bord du cylindre ave movemesh23 mesh Thcarre=square(nx,nth,[xmin+x*(xmax-xmin),2*pi*y]); //plot(Thcarre); // parametrisation d'un cylindre d'axe Ox func f1 = x; func f2 = cos(y); func f3 = sin(y); mesh3 Thsurf1=movemesh23(Thcarre,transfo=[f1,f2,f3],orientation=-1); mesh3 Thsurf2=movemesh23(Thcercle,transfo=[xmin,x,y],orientation=-1); mesh3 Thsurf3=movemesh23(Thcercle,transfo=[xmax,x,y],orientation=1); mesh3 Thsurf=Thsurf1+Thsurf2+Thsurf3; real voltet= ( ( (2*pi)/50 )^3 )/6.; cout << " voltet = " << voltet << endl; real[int] domaine = [1.5,0.,0.,1,voltet]; mesh3 Th=tetg(Thsurf,switch="pqaaAAYYQ",nbofregions=1,regionlist=domaine); savemesh(Th,"cyl.mesh"); medit("cyl",Th,wait=1); // FFCS: testing 3d plots plot(Th,cmm="cyl"); freefem++-3.38-1/examples++-3d/dodecaedre01.mesh000644 000767 000024 00000061312 11406142255 021155 0ustar00hechtstaff000000 000000 MeshVersionFormatted 1 # Mesh generated by nb2mesh (INRIA) Dimension 3 # Set of mesh vertices Vertices 216 0.491123 0.356822 0.794654 0 -0.187592 0.57735 0.794654 0 -0.607062 9.31409e-17 0.794654 0 -0.187592 -0.57735 0.794654 0 0.491123 -0.356822 0.794654 0 0.187592 0.57735 -0.794654 0 -0.491123 0.356822 -0.794654 0 -0.491123 -0.356822 -0.794654 0 0.187592 -0.57735 -0.794654 0 0.607062 -4.65705e-17 -0.794654 0 0.794654 0.57735 0.187592 0 0.303531 0.934172 -0.187592 0 -0.303531 0.934172 0.187592 0 -0.794654 0.57735 -0.187592 0 -0.982247 1.39711e-16 0.187592 0 -0.794654 -0.57735 -0.187592 0 -0.303531 -0.934172 0.187592 0 0.303531 -0.934172 -0.187592 0 0.794654 -0.57735 0.187592 0 0.982247 -4.65705e-17 -0.187592 0 -2.79423e-17 0 1 0 -2.79423e-17 2.79423e-17 -1 0 0.276393 0.850651 0.447214 0 -0.723607 0.525731 0.447214 0 -0.723607 -0.525731 0.447214 0 0.276393 -0.850651 0.447214 0 0.894427 -5.58846e-17 0.447214 0 -0.276393 0.850651 -0.447214 0 -0.894427 6.98557e-17 -0.447214 0 -0.276393 -0.850651 -0.447214 0 0.723607 -0.525731 -0.447214 0 0.723607 0.525731 -0.447214 0 0.25923 -0.188342 0.947274 0 0.525731 -5.94228e-17 0.850651 0 0.25923 0.188342 0.947274 0 0.0990171 0.304743 -0.947274 0 0.425325 0.309017 -0.850651 0 0.320426 -9.83253e-18 -0.947274 0 0.0468717 0.753743 0.655496 0 0.16246 0.5 0.850651 0 0.405119 0.637341 0.655496 0 -0.702368 0.277497 0.655496 0 -0.425325 0.309017 0.850651 0 -0.480959 0.58224 0.655496 0 -0.480959 -0.58224 0.655496 0 -0.425325 -0.309017 0.850651 0 -0.702368 -0.277497 0.655496 0 0.405119 -0.637341 0.655496 0 0.16246 -0.5 0.850651 0 0.0468717 -0.753743 0.655496 0 0.731336 0.188342 0.655496 0 0.731336 -0.188342 0.655496 0 -0.0468717 0.753743 -0.655496 0 -0.16246 0.5 -0.850651 0 -0.405119 0.637341 -0.655496 0 -0.731336 0.188342 -0.655496 0 -0.525731 8.91342e-17 -0.850651 0 -0.731336 -0.188342 -0.655496 0 -0.405119 -0.637341 -0.655496 0 -0.16246 -0.5 -0.850651 0 -0.0468717 -0.753743 -0.655496 0 0.480959 -0.58224 -0.655496 0 0.425325 -0.309017 -0.850651 0 0.702368 -0.277497 -0.655496 0 0.702368 0.277497 -0.655496 0 0.480959 0.58224 -0.655496 0 -0.0990171 0.304743 0.947274 0 -0.320426 4.91626e-17 0.947274 0 -0.0990171 -0.304743 0.947274 0 0.0990171 -0.304743 -0.947274 0 -0.25923 -0.188342 -0.947274 0 -0.25923 0.188342 -0.947274 0 0.688191 0.5 0.525731 0 0.565332 0.753743 0.33507 0 0.587785 0.809017 -1.48557e-17 0 0.306102 0.942084 0.137036 0 8.91342e-17 1 0 0 -0.0143242 0.942084 0.33507 0 -0.262866 0.809017 0.525731 0 -0.542155 0.770582 0.33507 0 -0.587785 0.809017 0 0 -0.801385 0.58224 0.137036 0 -0.951057 0.309017 0 0 -0.900402 0.277497 0.33507 0 -0.850651 1.2463e-16 0.525731 0 -0.900402 -0.277497 0.33507 0 -0.951057 -0.309017 1.48557e-17 0 -0.801385 -0.58224 0.137036 0 -0.587785 -0.809017 1.48557e-17 0 -0.542155 -0.770582 0.33507 0 -0.262866 -0.809017 0.525731 0 -0.0143242 -0.942084 0.33507 0 -1.78268e-16 -1 0 0 0.306102 -0.942084 0.137036 0 0.587785 -0.809017 0 0 0.565332 -0.753743 0.33507 0 0.688191 -0.5 0.525731 0 0.891549 -0.304743 0.33507 0 0.951057 -0.309017 0 0 0.990566 -5.40789e-17 0.137036 0 0.951057 0.309017 -1.48557e-17 0 0.891549 0.304743 0.33507 0 -0.688191 0.5 -0.525731 0 -0.565332 0.753743 -0.33507 0 -0.306102 0.942084 -0.137036 0 0.0143242 0.942084 -0.33507 0 0.262866 0.809017 -0.525731 0 -0.688191 -0.5 -0.525731 0 -0.891549 -0.304743 -0.33507 0 -0.990566 1.10616e-16 -0.137036 0 -0.891549 0.304743 -0.33507 0 0.262866 -0.809017 -0.525731 0 0.0143242 -0.942084 -0.33507 0 -0.306102 -0.942084 -0.137036 0 -0.565332 -0.753743 -0.33507 0 0.850651 -4.98521e-17 -0.525731 0 0.900402 -0.277497 -0.33507 0 0.801385 -0.58224 -0.137036 0 0.542155 -0.770582 -0.33507 0 0.542155 0.770582 -0.33507 0 0.801385 0.58224 -0.137036 0 0.900402 0.277497 -0.33507 0 -0.641066 0.180621 -0.121104 0 -0.289149 0.338185 0.123889 0 -0.53285 0.493571 -0.1668 0 -0.657109 0.289176 0.105955 0 -0.660539 0.140781 -0.339313 0 0.236469 0.702297 -0.119761 0 0.293479 0.664326 0.253992 0 0.177505 0.363349 -0.0220877 0 -0.13669 0.666735 0.148585 0 -0.077289 0.624594 -0.105375 0 0.490099 0.439095 -0.389076 0 0.572485 0.513847 0.00158281 0 -0.0147537 -0.301166 0.00573164 0 0.027261 -0.609388 -0.0368522 0 -0.210932 -0.44583 0.274374 0 -0.187906 -0.469788 -0.121119 0 -0.264179 0.00110005 -0.0686397 0 0.139429 -0.176865 0.141747 0 0.137993 0.0397672 -0.0474711 0 0.0549939 -0.277568 0.38053 0 -0.31332 -0.205816 0.246979 0 -0.470354 -0.172651 -0.0444443 0 -0.512056 -0.451171 0.0222751 0 -0.63543 -0.27962 0.191868 0 -0.485376 -0.459615 0.361165 0 -0.377691 -0.632462 -0.145148 0 0.195227 0.497143 0.558163 0 0.471638 0.295428 0.498678 0 -0.0767607 0.422523 0.42746 0 -0.0133728 0.314914 0.699076 0 0.210462 0.199609 0.658993 0 0.29383 0.428373 0.283453 0 -0.751395 -0.148984 -0.116319 0 -0.440269 -0.0800457 -0.444693 0 0.168272 0.0650597 -0.364626 0 0.129559 -0.219634 -0.638505 0 0.463777 -0.0623083 -0.361699 0 0.343182 -0.330995 -0.364227 0 0.493658 -0.143422 -0.586334 0 0.411319 0.125283 -0.636386 0 0.264237 -0.384147 -0.612663 0 0.501592 0.206461 -0.358475 0 0.0132368 0.307451 -0.300997 0 -0.0152879 0.569786 -0.430361 0 0.768744 -0.0853962 0.0302352 0 0.703096 -0.0195892 -0.265073 0 0.66767 -0.0937254 0.365578 0 0.624914 0.135741 0.228425 0 0.43053 -0.191743 0.280203 0 0.628446 -0.397168 0.176134 0 -0.294394 -0.562508 -0.388368 0 0.541027 -0.233274 -0.0637026 0 0.24393 0.432938 -0.480573 0 -0.0108428 0.352749 -0.652537 0 -0.345747 0.285932 -0.306576 0 -0.462044 0.0270721 0.201178 0 -0.74082 0.00772943 0.147783 0 -0.0988376 -0.0884954 -0.304341 0 -0.536653 -0.327598 -0.375823 0 -0.254917 -0.700613 0.152166 0 0.0579332 0.0669963 0.312854 0 -0.313188 0.627651 -0.209244 0 -0.413966 0.58379 0.136803 0 0.491904 -0.0087985 0.549865 0 0.0023627 -0.55211 0.524977 0 0.289635 -0.414128 0.643574 0 0.178419 -0.180643 0.644293 0 -0.609006 0.0150692 0.405833 0 -0.510316 0.242031 0.42591 0 0.317525 0.133964 0.182226 0 0.48528 0.243879 -0.00862047 0 0.614023 0.390478 0.226698 0 0.274736 -0.399844 -0.0376275 0 -0.125503 0.319529 -0.117781 0 0.0874565 -0.359885 -0.278676 0 0.690974 0.253499 -0.13669 0 0.313572 -0.578924 0.300802 0 -0.371471 0.262212 -0.608757 0 -0.0594493 0.658146 0.400466 0 -0.182072 -0.407708 0.600325 0 -0.30708 -0.124887 0.675407 0 -0.260489 0.127059 0.594044 0 0.0510777 -0.6298 -0.374388 0 -0.072537 -0.384745 -0.477982 0 0.389971 -0.550182 -0.266139 0 0.598158 -0.329966 -0.383532 0 0.0625799 -0.651979 0.186025 0 0.431474 -0.619128 -0.00192976 0 -0.0958472 -0.00188602 0.654796 0 -0.171146 -0.117364 -0.711793 0 -0.268558 -0.406826 -0.616475 0 -0.326231 0.520121 0.384798 0 -0.105999 0.124624 -0.618196 0 0.152665 0.0433483 -0.681703 0 # Set of Triangles Triangles 240 33 34 35 0 36 37 38 0 39 40 41 0 42 43 44 0 45 46 47 0 48 49 50 0 51 34 52 0 53 54 55 0 56 57 58 0 59 60 61 0 62 63 64 0 65 37 66 0 35 40 67 0 67 43 68 0 68 46 69 0 69 49 33 0 38 63 70 0 70 60 71 0 71 57 72 0 72 54 36 0 41 73 74 0 74 75 76 0 76 77 78 0 78 79 39 0 44 79 80 0 80 81 82 0 82 83 84 0 84 85 42 0 47 85 86 0 86 87 88 0 88 89 90 0 90 91 45 0 50 91 92 0 92 93 94 0 94 95 96 0 96 97 48 0 52 97 98 0 98 99 100 0 100 101 102 0 102 73 51 0 55 103 104 0 104 81 105 0 105 77 106 0 106 107 53 0 58 108 109 0 109 87 110 0 110 83 111 0 111 103 56 0 61 112 113 0 113 93 114 0 114 89 115 0 115 108 59 0 64 116 117 0 117 99 118 0 118 95 119 0 119 112 62 0 66 107 120 0 120 75 121 0 121 101 122 0 122 116 65 0 21 33 35 0 5 34 33 0 1 35 34 0 22 36 38 0 6 37 36 0 10 38 37 0 23 39 41 0 2 40 39 0 1 41 40 0 24 42 44 0 3 43 42 0 2 44 43 0 25 45 47 0 4 46 45 0 3 47 46 0 26 48 50 0 5 49 48 0 4 50 49 0 27 51 52 0 1 34 51 0 5 52 34 0 28 53 55 0 6 54 53 0 7 55 54 0 29 56 58 0 7 57 56 0 8 58 57 0 30 59 61 0 8 60 59 0 9 61 60 0 31 62 64 0 9 63 62 0 10 64 63 0 32 65 66 0 10 37 65 0 6 66 37 0 21 35 67 0 1 40 35 0 2 67 40 0 21 67 68 0 2 43 67 0 3 68 43 0 21 68 69 0 3 46 68 0 4 69 46 0 21 69 33 0 4 49 69 0 5 33 49 0 22 38 70 0 10 63 38 0 9 70 63 0 22 70 71 0 9 60 70 0 8 71 60 0 22 71 72 0 8 57 71 0 7 72 57 0 22 72 36 0 7 54 72 0 6 36 54 0 23 41 74 0 1 73 41 0 11 74 73 0 23 74 76 0 11 75 74 0 12 76 75 0 23 76 78 0 12 77 76 0 13 78 77 0 23 78 39 0 13 79 78 0 2 39 79 0 24 44 80 0 2 79 44 0 13 80 79 0 24 80 82 0 13 81 80 0 14 82 81 0 24 82 84 0 14 83 82 0 15 84 83 0 24 84 42 0 15 85 84 0 3 42 85 0 25 47 86 0 3 85 47 0 15 86 85 0 25 86 88 0 15 87 86 0 16 88 87 0 25 88 90 0 16 89 88 0 17 90 89 0 25 90 45 0 17 91 90 0 4 45 91 0 26 50 92 0 4 91 50 0 17 92 91 0 26 92 94 0 17 93 92 0 18 94 93 0 26 94 96 0 18 95 94 0 19 96 95 0 26 96 48 0 19 97 96 0 5 48 97 0 27 52 98 0 5 97 52 0 19 98 97 0 27 98 100 0 19 99 98 0 20 100 99 0 27 100 102 0 20 101 100 0 11 102 101 0 27 102 51 0 11 73 102 0 1 51 73 0 28 55 104 0 7 103 55 0 14 104 103 0 28 104 105 0 14 81 104 0 13 105 81 0 28 105 106 0 13 77 105 0 12 106 77 0 28 106 53 0 12 107 106 0 6 53 107 0 29 58 109 0 8 108 58 0 16 109 108 0 29 109 110 0 16 87 109 0 15 110 87 0 29 110 111 0 15 83 110 0 14 111 83 0 29 111 56 0 14 103 111 0 7 56 103 0 30 61 113 0 9 112 61 0 18 113 112 0 30 113 114 0 18 93 113 0 17 114 93 0 30 114 115 0 17 89 114 0 16 115 89 0 30 115 59 0 16 108 115 0 8 59 108 0 31 64 117 0 10 116 64 0 20 117 116 0 31 117 118 0 20 99 117 0 19 118 99 0 31 118 119 0 19 95 118 0 18 119 95 0 31 119 62 0 18 112 119 0 9 62 112 0 32 66 120 0 6 107 66 0 12 120 107 0 32 120 121 0 12 75 120 0 11 121 75 0 32 121 122 0 11 101 121 0 20 122 101 0 32 122 65 0 20 116 122 0 10 65 116 0 # Set of tetrahedra Tetrahedra 867 123 124 125 126 0 127 83 111 110 0 14 83 111 127 0 123 125 14 126 0 128 76 129 75 0 128 130 131 132 0 128 133 107 120 0 128 134 120 75 0 135 136 137 138 0 135 139 140 141 0 135 142 140 143 0 135 139 144 143 0 145 146 87 88 0 145 147 88 90 0 145 148 89 16 0 149 150 41 1 0 149 151 152 39 0 149 153 151 154 0 123 127 155 110 0 103 125 14 127 0 109 156 127 155 0 109 127 110 155 0 157 158 159 160 0 127 109 29 58 0 127 56 156 58 0 161 116 162 159 0 161 38 162 10 0 161 160 158 163 0 161 62 163 63 0 130 141 157 164 0 130 141 165 157 0 128 166 106 107 0 128 131 130 129 0 128 132 77 106 0 167 117 168 20 0 167 169 170 171 0 167 172 169 171 0 173 61 30 59 0 167 98 169 172 0 167 168 117 174 0 167 100 169 98 0 128 132 131 77 0 65 164 133 162 0 162 164 133 175 0 128 133 175 107 0 128 165 132 166 0 175 166 107 6 0 175 176 6 37 0 143 135 138 144 0 123 177 139 156 0 144 139 178 143 0 144 179 155 146 0 144 180 181 156 0 145 146 144 155 0 145 147 90 182 0 143 139 178 183 0 139 141 183 140 0 135 140 139 143 0 145 146 147 143 0 138 180 181 144 0 166 55 28 53 0 123 179 110 155 0 83 123 127 14 0 184 166 177 55 0 184 81 125 185 0 184 125 124 185 0 126 82 84 24 0 184 125 55 177 0 169 170 27 100 0 169 51 186 52 0 169 51 170 186 0 142 187 188 189 0 179 190 191 84 0 179 85 190 84 0 179 126 83 84 0 179 146 86 87 0 179 86 190 85 0 179 146 87 155 0 179 190 178 191 0 192 183 186 150 0 192 141 174 140 0 130 192 183 141 0 130 192 154 183 0 192 183 150 154 0 193 170 194 154 0 170 192 154 193 0 130 192 141 193 0 141 140 195 174 0 130 141 196 165 0 141 196 165 180 0 165 157 175 130 0 192 174 141 193 0 141 164 193 159 0 183 141 124 130 0 192 183 140 171 0 128 130 165 175 0 135 139 141 180 0 135 197 138 180 0 139 141 180 196 0 157 197 160 141 0 141 159 193 174 0 158 9 60 70 0 198 194 193 170 0 167 198 20 168 0 198 194 134 193 0 198 133 134 121 0 198 32 133 121 0 198 168 193 164 0 198 168 122 20 0 184 132 105 131 0 128 129 77 131 0 128 132 106 166 0 132 106 166 28 0 185 184 131 124 0 124 132 130 196 0 171 199 172 97 0 184 104 125 81 0 125 126 124 185 0 123 177 125 124 0 125 82 126 185 0 127 103 177 200 0 125 55 177 103 0 184 55 125 104 0 123 127 125 177 0 123 126 14 83 0 123 144 178 179 0 123 139 124 178 0 127 125 177 103 0 136 93 18 94 0 192 174 193 170 0 130 183 154 151 0 123 144 139 178 0 141 124 130 196 0 139 124 196 177 0 135 141 195 197 0 145 181 148 16 0 146 147 25 88 0 144 146 143 178 0 168 20 117 116 0 145 87 155 16 0 161 163 158 63 0 145 182 138 137 0 144 135 138 180 0 129 201 23 78 0 129 134 75 74 0 194 154 74 134 0 153 35 21 33 0 128 77 129 76 0 128 130 134 129 0 128 129 134 75 0 128 130 132 165 0 130 129 154 134 0 145 182 90 89 0 147 91 137 202 0 147 182 91 90 0 143 202 147 137 0 143 147 203 190 0 130 133 134 193 0 198 164 32 122 0 65 66 37 133 0 133 164 65 32 0 133 134 121 120 0 203 202 69 46 0 203 190 47 3 0 3 204 68 203 0 205 112 18 113 0 197 157 160 158 0 205 163 206 197 0 182 17 114 93 0 197 160 195 207 0 197 136 207 195 0 197 158 206 180 0 197 138 205 136 0 197 206 138 180 0 208 168 117 116 0 208 168 159 174 0 208 174 118 117 0 160 62 161 208 0 208 207 174 160 0 163 160 62 161 0 208 62 207 160 0 145 138 182 148 0 182 114 148 136 0 145 147 182 137 0 89 182 114 148 0 136 93 209 182 0 145 181 138 148 0 147 182 137 91 0 182 137 187 209 0 182 137 91 187 0 91 182 187 92 0 210 209 195 136 0 210 174 207 195 0 210 207 118 119 0 210 18 136 207 0 210 207 119 18 0 134 74 194 11 0 130 154 129 131 0 128 130 175 133 0 130 133 193 164 0 129 131 78 77 0 129 154 74 41 0 167 198 170 101 0 198 133 32 164 0 167 174 117 99 0 161 159 208 116 0 208 168 116 159 0 168 116 164 122 0 199 172 97 96 0 141 180 165 157 0 135 143 137 142 0 183 153 151 211 0 183 204 211 151 0 124 183 204 178 0 60 206 212 213 0 206 181 138 180 0 163 160 197 205 0 141 197 160 195 0 206 213 61 173 0 168 193 164 159 0 198 168 164 122 0 167 168 174 193 0 164 116 159 162 0 129 41 74 23 0 141 164 159 157 0 204 214 151 124 0 143 203 211 204 0 204 43 152 151 0 204 67 211 152 0 204 152 43 67 0 203 204 68 211 0 3 191 43 204 0 204 151 152 211 0 149 151 39 201 0 151 152 39 2 0 214 201 2 151 0 211 189 21 69 0 130 183 151 124 0 151 124 214 131 0 149 150 1 153 0 149 151 201 154 0 130 124 151 131 0 175 162 164 157 0 130 141 164 193 0 199 48 96 97 0 165 180 215 157 0 165 176 215 177 0 206 205 138 173 0 128 166 175 165 0 132 184 166 165 0 130 134 154 193 0 213 8 108 181 0 145 146 155 87 0 206 173 181 213 0 181 148 115 173 0 181 156 58 109 0 181 8 108 58 0 145 144 181 155 0 181 115 148 16 0 181 155 109 16 0 181 155 156 109 0 200 215 177 156 0 169 186 171 97 0 156 212 215 180 0 170 51 27 102 0 144 181 155 156 0 127 156 200 177 0 162 10 38 37 0 156 155 123 127 0 145 137 143 147 0 146 25 147 47 0 123 144 179 155 0 179 146 190 86 0 179 126 84 191 0 204 190 191 178 0 42 190 84 191 0 190 191 42 3 0 145 144 138 181 0 145 143 137 138 0 182 136 148 138 0 146 147 143 190 0 145 182 89 148 0 47 203 46 147 0 147 202 45 91 0 192 183 171 186 0 183 211 142 189 0 198 101 134 194 0 164 157 162 159 0 133 66 37 175 0 175 176 37 216 0 198 134 101 121 0 167 170 193 174 0 171 174 172 195 0 171 188 142 199 0 183 171 189 142 0 146 47 190 86 0 206 156 181 180 0 182 137 209 136 0 139 141 124 183 0 148 205 138 136 0 148 205 30 173 0 181 173 115 108 0 148 115 173 30 0 215 22 216 212 0 165 177 215 180 0 215 200 177 176 0 215 157 180 216 0 158 216 212 180 0 213 8 60 59 0 213 59 173 108 0 197 206 205 138 0 213 212 71 8 0 213 212 60 71 0 213 173 59 61 0 183 154 153 150 0 177 196 165 184 0 131 124 132 130 0 170 194 102 101 0 170 51 150 186 0 170 102 150 51 0 167 171 174 172 0 167 171 170 174 0 168 193 159 174 0 169 170 171 186 0 167 101 170 100 0 210 199 172 195 0 210 174 195 172 0 139 141 196 124 0 134 194 101 11 0 123 83 179 126 0 146 47 147 190 0 145 144 143 138 0 123 156 127 177 0 144 179 146 178 0 209 136 94 93 0 93 209 182 92 0 210 209 199 195 0 140 209 199 142 0 187 26 92 209 0 50 187 26 92 0 123 126 179 178 0 210 118 19 95 0 126 191 24 84 0 179 126 191 178 0 203 204 190 3 0 147 203 46 202 0 143 203 204 190 0 139 143 140 183 0 211 142 189 202 0 146 143 178 190 0 203 211 69 202 0 178 183 204 143 0 149 154 41 150 0 149 23 201 39 0 152 153 40 35 0 204 124 191 214 0 149 153 154 150 0 151 201 2 39 0 169 97 171 172 0 2 214 151 43 0 143 142 183 211 0 181 16 108 115 0 182 187 92 209 0 215 177 156 180 0 143 190 204 178 0 148 136 114 205 0 135 140 142 209 0 145 144 146 143 0 123 126 178 124 0 128 134 133 120 0 140 171 195 174 0 130 154 192 193 0 140 171 183 142 0 197 157 158 180 0 165 166 176 177 0 128 175 166 107 0 192 186 171 170 0 130 196 132 165 0 159 160 174 141 0 151 154 131 201 0 204 124 178 191 0 143 147 202 203 0 184 185 105 81 0 126 185 24 191 0 149 23 129 201 0 165 184 166 177 0 169 52 27 51 0 161 116 208 64 0 62 112 207 160 0 141 157 197 180 0 158 160 197 163 0 199 48 188 187 0 210 96 199 94 0 210 209 136 94 0 135 209 136 195 0 184 196 124 177 0 131 79 201 78 0 13 214 80 185 0 129 131 201 78 0 184 132 124 196 0 131 185 13 105 0 184 185 131 105 0 43 214 151 204 0 183 189 171 186 0 42 3 191 43 0 149 41 129 23 0 79 214 201 2 0 149 152 40 39 0 211 68 21 67 0 161 63 64 62 0 136 114 205 113 0 143 211 183 204 0 179 190 146 178 0 135 136 197 195 0 171 199 195 172 0 210 172 199 96 0 210 209 94 199 0 172 97 19 98 0 208 160 174 159 0 140 209 195 199 0 158 159 160 161 0 160 141 159 157 0 160 174 141 195 0 161 64 208 62 0 210 174 172 118 0 154 170 194 150 0 134 75 121 120 0 135 137 209 142 0 167 193 198 168 0 199 142 187 188 0 143 142 211 202 0 202 187 189 49 0 130 175 133 164 0 134 193 194 154 0 132 105 131 77 0 166 176 53 6 0 184 132 166 28 0 184 166 55 28 0 149 201 129 154 0 125 14 126 82 0 184 131 124 132 0 200 7 54 72 0 139 156 177 180 0 8 156 181 213 0 156 212 8 57 0 202 147 45 46 0 185 131 13 214 0 123 124 139 177 0 139 196 180 177 0 112 163 160 62 0 167 172 99 98 0 207 174 118 208 0 70 158 9 63 0 158 9 63 163 0 161 38 216 162 0 157 216 159 158 0 161 208 159 160 0 180 139 144 135 0 210 207 174 118 0 206 158 9 60 0 184 196 165 132 0 216 159 158 161 0 215 157 216 176 0 123 110 179 83 0 181 138 148 173 0 206 212 156 180 0 182 136 93 114 0 153 34 35 33 0 208 168 174 117 0 183 211 189 153 0 182 138 137 136 0 145 155 181 16 0 171 5 189 188 0 150 73 1 51 0 199 187 26 48 0 188 189 33 5 0 188 189 49 33 0 186 171 5 189 0 189 171 188 142 0 188 187 49 189 0 192 170 150 186 0 185 214 80 24 0 165 157 215 176 0 185 214 24 191 0 211 69 202 189 0 124 214 185 191 0 204 190 3 191 0 186 52 97 169 0 28 132 105 184 0 127 125 14 123 0 208 118 207 31 0 169 172 98 97 0 198 170 101 194 0 164 162 65 116 0 10 161 116 162 0 79 214 80 13 0 140 171 199 195 0 174 172 118 99 0 210 172 96 19 0 126 24 185 82 0 203 69 211 68 0 151 152 211 153 0 161 158 216 38 0 158 212 22 70 0 158 212 70 60 0 126 124 185 191 0 176 37 216 36 0 215 200 176 72 0 166 53 176 55 0 153 189 33 21 0 176 72 200 54 0 216 162 38 37 0 202 187 49 4 0 175 162 157 216 0 175 176 166 6 0 160 112 207 205 0 167 170 198 193 0 156 56 200 57 0 206 180 158 212 0 158 38 22 216 0 216 158 212 22 0 211 152 67 21 0 140 171 142 199 0 135 180 141 197 0 150 186 1 153 0 215 36 176 216 0 206 9 205 61 0 174 160 207 195 0 186 153 189 34 0 175 133 66 107 0 198 134 133 193 0 157 162 159 216 0 147 203 190 47 0 199 97 188 48 0 211 153 21 189 0 154 74 134 129 0 124 214 131 185 0 133 32 120 121 0 135 209 137 136 0 70 158 38 22 0 123 144 156 139 0 144 156 155 123 0 215 72 176 36 0 57 200 215 72 0 156 200 215 57 0 15 110 179 87 0 209 94 199 26 0 179 15 83 110 0 179 84 15 85 0 14 127 111 103 0 128 12 107 106 0 216 212 180 215 0 133 107 120 66 0 128 12 75 120 0 194 11 73 102 0 208 116 117 64 0 162 10 37 65 0 161 63 10 64 0 206 60 9 61 0 212 71 8 57 0 213 108 8 59 0 200 54 7 55 0 200 57 7 72 0 200 103 7 56 0 202 69 4 49 0 203 3 46 68 0 190 3 85 47 0 152 39 2 40 0 214 43 2 44 0 176 6 54 53 0 179 85 15 86 0 177 55 176 200 0 189 33 5 34 0 134 11 101 121 0 164 116 65 122 0 170 101 102 100 0 143 211 203 202 0 135 137 143 138 0 68 204 67 211 0 126 82 14 83 0 194 11 74 73 0 166 53 28 106 0 126 124 191 178 0 154 150 73 41 0 213 8 71 60 0 175 6 107 66 0 179 15 87 86 0 200 7 103 55 0 206 138 181 173 0 127 200 56 103 0 127 111 56 29 0 167 99 20 100 0 208 31 117 118 0 175 133 162 37 0 187 4 91 50 0 185 82 24 80 0 167 20 99 117 0 182 17 91 90 0 184 81 105 104 0 202 4 46 45 0 29 109 127 110 0 177 55 200 103 0 192 141 140 183 0 183 204 151 124 0 176 54 55 53 0 203 46 3 47 0 211 68 69 21 0 137 209 142 187 0 46 147 45 47 0 202 46 4 69 0 176 36 6 37 0 216 37 38 36 0 183 139 178 124 0 198 121 122 32 0 215 57 212 156 0 164 122 65 32 0 198 133 164 193 0 148 30 114 115 0 136 113 93 114 0 126 83 84 82 0 125 103 104 55 0 184 124 125 177 0 58 156 127 109 0 58 156 181 8 0 162 10 65 116 0 210 19 96 95 0 137 202 91 187 0 210 95 96 94 0 147 47 25 45 0 190 86 47 85 0 145 16 88 87 0 201 39 78 79 0 129 77 78 76 0 125 14 82 81 0 175 37 6 66 0 204 68 67 43 0 204 43 214 191 0 186 34 5 52 0 197 160 207 205 0 153 33 189 34 0 37 133 162 65 0 133 66 32 65 0 162 159 216 161 0 161 158 38 63 0 157 175 130 164 0 150 192 154 170 0 167 98 99 100 0 183 186 153 189 0 175 176 165 166 0 212 70 71 22 0 158 60 206 212 0 186 189 5 34 0 5 52 97 186 0 208 31 62 64 0 186 153 34 1 0 129 76 78 23 0 191 24 84 42 0 150 102 194 73 0 210 119 118 95 0 167 170 169 100 0 148 114 89 115 0 153 35 34 1 0 127 58 29 56 0 181 109 58 108 0 156 57 58 56 0 168 122 20 116 0 149 41 39 40 0 31 208 62 207 0 156 57 8 58 0 128 12 120 107 0 140 143 142 183 0 184 104 28 55 0 128 12 106 77 0 169 98 100 27 0 187 48 50 26 0 187 91 92 50 0 187 50 48 49 0 167 174 99 172 0 188 5 33 49 0 169 27 170 51 0 215 216 22 36 0 125 14 81 104 0 146 86 88 25 0 72 57 212 215 0 147 90 25 88 0 43 3 204 68 0 147 90 91 45 0 215 212 72 22 0 167 198 101 20 0 157 180 216 158 0 188 5 48 97 0 214 80 24 44 0 191 24 42 44 0 154 74 41 73 0 208 64 117 31 0 149 1 41 40 0 150 41 1 73 0 131 13 78 77 0 131 201 79 214 0 175 216 37 162 0 175 216 157 176 0 132 77 106 105 0 176 54 36 72 0 207 18 112 119 0 174 99 118 117 0 152 67 35 40 0 131 78 13 79 0 167 100 20 101 0 216 22 36 38 0 168 159 164 116 0 134 75 11 121 0 133 66 120 32 0 151 131 214 201 0 171 199 97 188 0 214 131 13 79 0 206 213 181 156 0 163 9 63 62 0 166 106 107 53 0 198 121 101 122 0 207 62 31 119 0 156 212 213 8 0 181 108 213 173 0 206 213 60 61 0 173 30 115 59 0 209 26 199 187 0 206 163 205 9 0 173 108 59 115 0 156 139 144 180 0 17 89 182 114 0 125 185 81 82 0 205 30 61 113 0 127 111 29 110 0 134 11 75 74 0 155 87 110 109 0 179 15 84 83 0 143 202 137 142 0 200 7 57 56 0 146 88 86 87 0 145 88 16 89 0 181 108 16 109 0 170 27 100 102 0 128 75 12 76 0 185 80 81 82 0 184 104 105 28 0 214 80 44 79 0 202 91 187 4 0 206 213 156 212 0 169 27 52 98 0 146 86 25 47 0 171 188 97 5 0 169 97 98 52 0 215 36 22 72 0 183 186 150 153 0 210 136 195 207 0 110 179 87 155 0 172 99 19 118 0 209 93 94 92 0 205 113 61 112 0 142 202 187 189 0 210 94 18 95 0 192 170 171 174 0 207 62 119 112 0 128 130 133 134 0 209 199 142 187 0 188 49 187 48 0 202 49 189 69 0 148 138 205 173 0 197 207 136 205 0 135 141 140 195 0 145 89 90 88 0 137 187 142 202 0 190 85 3 42 0 136 113 205 18 0 210 94 136 18 0 183 154 151 153 0 205 163 160 112 0 192 140 174 171 0 135 197 136 138 0 209 26 92 94 0 155 16 87 109 0 170 150 102 194 0 106 28 132 105 0 85 42 190 84 0 131 105 13 77 0 172 19 99 98 0 161 10 63 38 0 202 4 45 91 0 182 92 17 93 0 214 2 79 44 0 210 172 19 118 0 163 112 9 62 0 149 152 151 153 0 198 20 122 101 0 172 19 97 96 0 210 95 18 119 0 205 173 61 30 0 201 78 39 23 0 148 30 205 114 0 163 112 205 9 0 186 51 1 34 0 205 207 18 112 0 136 205 207 18 0 166 6 53 107 0 199 96 48 26 0 199 94 96 26 0 212 22 71 72 0 127 103 56 111 0 206 205 173 61 0 135 195 140 209 0 97 186 171 5 0 206 163 9 158 0 197 163 206 158 0 175 157 165 176 0 149 40 153 1 0 150 186 51 1 0 189 69 49 33 0 149 40 152 153 0 128 76 12 77 0 154 73 194 74 0 130 131 151 154 0 176 6 36 54 0 153 1 40 35 0 154 150 194 73 0 152 2 67 40 0 152 67 21 35 0 201 79 2 39 0 212 70 60 71 0 213 60 61 59 0 149 154 129 41 0 205 61 9 112 0 205 114 30 113 0 182 91 17 92 0 148 89 16 115 0 125 14 104 103 0 166 176 177 55 0 158 63 70 38 0 127 200 156 56 0 161 64 10 116 0 187 49 4 50 0 149 39 41 23 0 189 21 69 33 0 212 57 72 71 0 136 18 93 113 0 176 200 55 54 0 151 43 152 2 0 196 165 180 177 0 150 73 51 102 0 129 154 201 131 0 145 147 146 88 0 182 17 90 89 0 214 44 191 43 0 207 31 118 119 0 129 74 75 76 0 191 44 42 43 0 203 46 69 68 0 152 2 43 67 0 152 153 35 21 0 129 76 23 74 0 110 123 127 83 0 186 52 51 34 0 211 152 21 153 0 188 48 5 49 0 185 13 81 80 0 214 191 44 24 0 194 11 102 101 0 185 13 105 81 0 147 45 25 90 0 End freefem++-3.38-1/examples++-3d/EqPoisson.edp000644 000767 000024 00000001550 11672406254 020476 0ustar00hechtstaff000000 000000 load "msh3" load "medit" func f=2*((0.1+(((x/3))*(x-1)*(x-1)/1+x/100))^(1/3.)-(0.1)^(1/3.)); real yf=f(1.2,0); border up(t=1.2,0.){ x=t;y=f;label=0;} border axe2(t=0.2,1.15) { x=t;y=0;label=0;} border hole(t=pi,0) { x= 0.15 + 0.05*cos(t);y= 0.05*sin(t); label=1;} border axe1(t=0,0.1) { x=t;y=0;label=0;} border queue(t=0,1) { x= 1.15 + 0.05*t; y = yf*t; label =0;} int np= 100; func bord= up(np)+axe1(np/10)+hole(np/10)+axe2(8*np/10)+ queue(np/10); plot( bord); mesh Th2=buildmesh(bord); plot(Th2,wait=1); int[int] l23=[0,0,1,1]; mesh3 Th=buildlayers(Th2,coef= max(.15,y/max(f,0.05)), 50 ,zbound=[0,2*pi] ,transfo=[x,y*cos(z),y*sin(z)],facemerge=1,labelmid=l23); macro Grad(u) [dx(u),dy(u),dz(u)] // fespace Vh(Th,P1); Vh u,v; solve Poisson(u,v) = int3d(Th)( Grad(u)'*Grad(v) ) - int3d(Th)( v) + on(1,u=1); plot(u,wait=1,nbiso=20,value=1); medit("u",Th,u,wait=1); freefem++-3.38-1/examples++-3d/fallingspheres.edp000644 000767 000024 00000002576 12327437406 021576 0ustar00hechtstaff000000 000000 // test of mmg3d for move objets in a mesh ... load "msh3" load "tetgen" load "medit" load "mmg3d-v4.0" include "MeshSurface.idp" // build mesh of a box (311) wit 2 holes (300,310) real hs = 0.8; int[int] N=[4/hs,8/hs,11.5/hs]; real [int,int] B=[[-2,2],[-2,6],[-10,1.5]]; int [int,int] L=[[311,311],[311,311],[311,311]]; mesh3 ThH = SurfaceHex(N,B,L,1); mesh3 ThSg =Sphere(1,hs,300,-1); // "gluing" surface meshs to tolat boundary meshes mesh3 ThSd =Sphere(1,hs,310,-1); ThSd=movemesh(ThSd,[x,4+y,z]); mesh3 ThHS=ThH+ThSg+ThSd; medit("ThHS", ThHS); real voltet=(hs^3)/6.; cout << " voltet = " << voltet << endl; real[int] domaine = [0,0,-4,1,voltet]; real [int] holes=[0,0,0,0,4,0]; mesh3 Th = tetg(ThHS,switch="pqaAAYYQ",regionlist=domaine,holelist=holes); medit("Box-With-two-Ball",Th); // End build mesh // int[int] opt=[9,0,64,0,0,3]; // options of mmg3d see freeem++ doc real[int] vit=[0,0,-0.3]; func zero = 0.; func dep = vit[2]; fespace Vh(Th,P1); macro Grad(u) [dx(u),dy(u),dz(u)] // Vh uh,vh; // to compute the displacemnt field problem Lap(uh,vh,solver=CG) = int3d(Th)(Grad(uh)'*Grad(vh)) //') for emacs + on(310,300,uh=dep) +on(311,uh=0.); for(int it=0; it<29; it++){ cout<<" ITERATION "<3.4-1 // --------- new stuff ----------------- int k=0,l=1,e=1; Th.nbe ; // return the number of boundary element \hfilll Th.be(k); // return the boundary element k $\in \{0,...,Th.nbe-1\}$ \hfilll Th.be(k)[l]; // return the vertices l $\in \{0,1\}$ of boundary element k \hfilll Th.be(k).Element ; // return the tet contening the boundary element k \hfilll Th.be(k).whoinElement ; // return the egde number of triangle contening the boundary element k \hfilll Th[k].adj(e) ; // return adjacent tet to k by face e, and change the value of e to \hfilll // the corresponding face in the adjacent tet Th[k] == Th[k].adj(e) ;// non adjacent tet return the same Th[k] != Th[k].adj(e) ;// true adjacent tet cout << " print mesh connectivity " << endl; int nbelement = Th.nt; for (int k=0;k " << int(Th[k].adj((ee=e))) << " " << ee << " adj: " << ( Th[k].adj((ee=e)) != Th[k]) << endl; } // note : if k == int(Th[k].adj(ee=e)) not adjacent element int nbboundaryelement = Th.nbe; Th.be; for (int k=0;k $@ # To create a new set of reference values in "ref.edp" Ref: makeref.edp freefem++.pref export FF_LOADPATH=../examples++-load/.;../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref 3d-Leman.edp:freefem++.pref install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/idp $(INSTALL) -m 555 $(LIST_IDP) $(DESTDIR)$(ff_prefix_dir)/idp # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp FORCE: freefem++-3.38-1/examples++-3d/Makefile.in000644 000767 000024 00000124205 12543260337 020132 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++-3d ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = 3d-Leman.edp ArrayFE-3d.edp EqPoisson.edp Lac.edp Laplace-Adapt-3d.edp Laplace-Adapt-aniso-3d.edp Laplace3d.edp LaplaceRT-3d.edp NSI3d-carac.edp NSI3d.edp Period-Poisson-cube-ballon.edp Poisson-cube-ballon.edp Poisson.edp Poisson3d.edp Stokes.edp TruncLac.edp beam-3d.edp cone.edp convect-3d.edp cube-period.edp cylinder-3d.edp cylinder.edp fallingspheres.edp first.edp meditddm.edp p.edp periodic-3d.edp pyramide.edp refinesphere.edp schwarz-nm-3d.edp sphere2.edp sphere6.edp tetgencube.edp tetgenholeregion.edp intlevelset3d.edp XFAIL_TESTS = Laplace-Adapt-aniso-3d.edp fallingspheres.edp Laplace-Adapt-3d.edp Period-Poisson-cube-ballon.edp Poisson-cube-ballon.edp cylinder.edp refinesphere.edp tetgencube.edp tetgenholeregion.edp Poisson3d.edp schwarz-nm-3d.edp LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw LIST_IDP = MeshSurface.idp cube.idp EXTRA_DIST = *.edp all.edp regtests.edp regtests.m4 ref.edp dodecaedre01.mesh \ lac-leman-v4.msh $(LIST_IDP) all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-3d/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-3d/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? 3d-Leman.edp.log: 3d-Leman.edp @p='3d-Leman.edp'; \ b='3d-Leman.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ArrayFE-3d.edp.log: ArrayFE-3d.edp @p='ArrayFE-3d.edp'; \ b='ArrayFE-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) EqPoisson.edp.log: EqPoisson.edp @p='EqPoisson.edp'; \ b='EqPoisson.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Lac.edp.log: Lac.edp @p='Lac.edp'; \ b='Lac.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Laplace-Adapt-3d.edp.log: Laplace-Adapt-3d.edp @p='Laplace-Adapt-3d.edp'; \ b='Laplace-Adapt-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Laplace-Adapt-aniso-3d.edp.log: Laplace-Adapt-aniso-3d.edp @p='Laplace-Adapt-aniso-3d.edp'; \ b='Laplace-Adapt-aniso-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Laplace3d.edp.log: Laplace3d.edp @p='Laplace3d.edp'; \ b='Laplace3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceRT-3d.edp.log: LaplaceRT-3d.edp @p='LaplaceRT-3d.edp'; \ b='LaplaceRT-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSI3d-carac.edp.log: NSI3d-carac.edp @p='NSI3d-carac.edp'; \ b='NSI3d-carac.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSI3d.edp.log: NSI3d.edp @p='NSI3d.edp'; \ b='NSI3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Period-Poisson-cube-ballon.edp.log: Period-Poisson-cube-ballon.edp @p='Period-Poisson-cube-ballon.edp'; \ b='Period-Poisson-cube-ballon.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Poisson-cube-ballon.edp.log: Poisson-cube-ballon.edp @p='Poisson-cube-ballon.edp'; \ b='Poisson-cube-ballon.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Poisson.edp.log: Poisson.edp @p='Poisson.edp'; \ b='Poisson.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Poisson3d.edp.log: Poisson3d.edp @p='Poisson3d.edp'; \ b='Poisson3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Stokes.edp.log: Stokes.edp @p='Stokes.edp'; \ b='Stokes.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TruncLac.edp.log: TruncLac.edp @p='TruncLac.edp'; \ b='TruncLac.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) beam-3d.edp.log: beam-3d.edp @p='beam-3d.edp'; \ b='beam-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cone.edp.log: cone.edp @p='cone.edp'; \ b='cone.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convect-3d.edp.log: convect-3d.edp @p='convect-3d.edp'; \ b='convect-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cube-period.edp.log: cube-period.edp @p='cube-period.edp'; \ b='cube-period.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cylinder-3d.edp.log: cylinder-3d.edp @p='cylinder-3d.edp'; \ b='cylinder-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cylinder.edp.log: cylinder.edp @p='cylinder.edp'; \ b='cylinder.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fallingspheres.edp.log: fallingspheres.edp @p='fallingspheres.edp'; \ b='fallingspheres.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) first.edp.log: first.edp @p='first.edp'; \ b='first.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) meditddm.edp.log: meditddm.edp @p='meditddm.edp'; \ b='meditddm.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) p.edp.log: p.edp @p='p.edp'; \ b='p.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) periodic-3d.edp.log: periodic-3d.edp @p='periodic-3d.edp'; \ b='periodic-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pyramide.edp.log: pyramide.edp @p='pyramide.edp'; \ b='pyramide.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) refinesphere.edp.log: refinesphere.edp @p='refinesphere.edp'; \ b='refinesphere.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) schwarz-nm-3d.edp.log: schwarz-nm-3d.edp @p='schwarz-nm-3d.edp'; \ b='schwarz-nm-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sphere2.edp.log: sphere2.edp @p='sphere2.edp'; \ b='sphere2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sphere6.edp.log: sphere6.edp @p='sphere6.edp'; \ b='sphere6.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tetgencube.edp.log: tetgencube.edp @p='tetgencube.edp'; \ b='tetgencube.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tetgenholeregion.edp.log: tetgenholeregion.edp @p='tetgenholeregion.edp'; \ b='tetgenholeregion.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) intlevelset3d.edp.log: intlevelset3d.edp @p='intlevelset3d.edp'; \ b='intlevelset3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic cscopelist-am ctags-am distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am recheck \ tags-am uninstall uninstall-am .PRECIOUS: Makefile all-local: all.edp regtests.edp freefem++.pref all.edp: Makefile (echo "NoGraphicWindow=true;NoUseOfWait=true;int verbosityy=verbosity;int MEM1234=storageused();"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;searchMethod=0;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << " mem leak = " < $@ # To create a new set of reference values in "ref.edp" Ref: makeref.edp freefem++.pref export FF_LOADPATH=../examples++-load/.;../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref 3d-Leman.edp:freefem++.pref install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/idp $(INSTALL) -m 555 $(LIST_IDP) $(DESTDIR)$(ff_prefix_dir)/idp # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp FORCE: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-3d/meditddm.edp000644 000767 000024 00000003501 11435701373 020340 0ustar00hechtstaff000000 000000 // meditddm.edp load "medit" /******************************************** Initial Problem: Resolution of the following EDP: $- \Delta u = f$ on $\Omega =\{ (x,y) | 1 \leq sqrt(x^2+y^2) \geq 2}$ $- \Delta u = f1$ on $\Omega_{1} =\{ (x,y) | 0.5 \leq sqrt(x^2+y^2) \geq 1.}$ $u = 1$ on $\Gamma$ + Null Neumman condition on $\Gamma_{1}$ and on $\Gamma_{2}$ We find the solution $u$ in solving two EDP defined on domain $\Omega$ and $\Omega_{1}$ This solution is vizualize with ffmedit *********************************************/ verbosity=3; border Gamma(t=0,2*pi){x=cos(t); y=sin(t); label=1;}; border Gamma1(t=0,2*pi){x=2*cos(t); y=2*sin(t); label=2;}; border Gamma2(t=0,2*pi){x=0.5*cos(t); y=0.5*sin(t); label=3;}; // construction of mesh of domain $\Omega$ mesh Th=buildmesh(Gamma1(40)+Gamma(-40)); fespace Vh(Th,P2); func f=sqrt(x*x+y*y); Vh us,v; macro Grad2(us) [dx(us),dy(us)] // EOM problem Lap2dOmega(us,v,init=false)=int2d(Th)(Grad2(v)' *Grad2(us)) - int2d(Th)(f*v)+on(Gamma,us=1) ; // Resolution of EDP defined on the domain $\Omega$ // $- \Delta u = f$ on $\Omega$ // $u = 1$ on $\Gamma // + Null Neumann condition on $\Gamma_{1}$ Lap2dOmega; // construction of mesh of domain $\Omega1 =\{ (x,y) | 0.5 \leq sqrt(x^2+y^2) \geq 1.}$ mesh Th1=buildmesh(Gamma(40)+Gamma2(-40)); fespace Vh1(Th1,P2); func f1=10*sqrt(x*x+y*y); Vh1 u1,v1; macro Grad21(u1) [dx(u1),dy(u1)] // EOM problem Lap2dOmega1(u1,v1,init=false)=int2d(Th1)(Grad21(v1)' *Grad21(u1)) - int2d(Th1)(f1*v1)+on(Gamma,u1=1) ; // Resolution of EDP defined on the domain $\Omega_{1}$ // $- \Delta u = f1$ on $\Omega_{1}$ // $u = 1$ on $\Gamma$ // + Null Neumann condition on $\Gamma_{2}$ Lap2dOmega1; // vizualisation of solution of the initial problem medit("solution",Th,us,Th1,u1,order=1,meditff="ffmedit",save="testsavemedit.solb",wait=1); freefem++-3.38-1/examples++-3d/MeshSurface.idp000644 000767 000024 00000010232 12354742427 020767 0ustar00hechtstaff000000 000000 load "msh3" load "medit" load "freeyams" // 2 basic functions to build surface mesh /* Usage: mesh3 SurfaceHex(N,B,L,orient); -- build the surface mesh of a 3d box where: for example: int[int] N=[nx,ny,nz]; // the number of seg in the 3 direction real [int,int] B=[[xmin,xmax],[ymin,ymax],[zmin,zmax]]; // bounding bax int [int,int] L=[[1,2],[3,4],[5,6]]; // the label of the 6 face left,right, front, back, down, right orient the global orientation of the surface 1 extern (-1 intern) func mesh3 Sphere(real R,real h,int L,int orient); -- build a surface mesh of a sphere with 1 mapping (spheriale coordinate) where R is the raduis, h is the mesh size of the shpere L is the label the the sphere orient the global orientation of the surface 1 extern (-1 intern */ func mesh3 SurfaceHex(int[int] & N,real[int,int] &B ,int[int,int] & L,int orientation) { real x0=B(0,0),x1=B(0,1); real y0=B(1,0),y1=B(1,1); real z0=B(2,0),z1=B(2,1); int nx=N[0],ny=N[1],nz=N[2]; mesh Thx = square(ny,nz,[y0+(y1-y0)*x,z0+(z1-z0)*y]); mesh Thy = square(nx,nz,[x0+(x1-x0)*x,z0+(z1-z0)*y]); mesh Thz = square(nx,ny,[x0+(x1-x0)*x,y0+(y1-y0)*y]); int[int] refx=[0,L(0,0)],refX=[0,L(0,1)]; // Xmin, Ymax faces labels renumbering int[int] refy=[0,L(1,0)],refY=[0,L(1,1)]; // Ymin, Ymax faces labesl renumbering int[int] refz=[0,L(2,0)],refZ=[0,L(2,1)]; // Zmin, Zmax faces labels renumbering mesh3 Thx0 = movemesh23(Thx,transfo=[x0,x,y],orientation=-orientation,label=refx); mesh3 Thx1 = movemesh23(Thx,transfo=[x1,x,y],orientation=+orientation,label=refX); mesh3 Thy0 = movemesh23(Thy,transfo=[x,y0,y],orientation=+orientation,label=refy); mesh3 Thy1 = movemesh23(Thy,transfo=[x,y1,y],orientation=-orientation,label=refY); mesh3 Thz0 = movemesh23(Thz,transfo=[x,y,z0],orientation=-orientation,label=refz); mesh3 Thz1 = movemesh23(Thz,transfo=[x,y,z1],orientation=+orientation,label=refZ); mesh3 Th= Thx0+Thx1+Thy0+Thy1+Thz0+Thz1; return Th; } func mesh3 Ellipsoide (real RX,real RY, real RZ,real h,int L,int orientation) { mesh Th=square(10,20,[x*pi-pi/2,2*y*pi]); // $]\frac{-pi}{2},frac{-pi}{2}[\times]0,2\pi[ $ // a parametrization of a sphere func f1 =RX*cos(x)*cos(y); func f2 =RY*cos(x)*sin(y); func f3 =RZ*sin(x); // partiel derivative func f1x= -RX*sin(x)*cos(y); func f1y= -RX*cos(x)*sin(y); func f2x= -RY*sin(x)*sin(y); func f2y= +RY*cos(x)*cos(y); func f3x=-RZ*cos(x); func f3y=0; // the metric on the sphere $ M = DF^t DF $ func m11=f1x^2+f2x^2+f3x^2; func m21=f1x*f1y+f2x*f2y+f3x*f3y; func m22=f1y^2+f2y^2+f3y^2; func perio=[[4,y],[2,y],[1,x],[3,x]]; // to store the periodic condition real hh=h;// hh mesh size on unite sphere real vv= 1/square(hh); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); int[int] ref=[0,L]; mesh3 ThS= movemesh23(Th,transfo=[f1,f2,f3],orientation=orientation,refface=ref); ThS=freeyams(ThS,hmin=h,hmax=h,gradation=2.,verbosity=-10,mem=100,option=0); return ThS; } func mesh3 Sphere(real R,real h,int L,int orientation) { return Ellipsoide(R,R,R,h,L,orientation); } /* test: load "tetgen" { real hs = 0.1; // mesh size on sphere int[int] N=[20,20,20]; real [int,int] B=[[-1,1],[-1,1],[-1,1]]; int [int,int] L=[[1,2],[3,4],[5,6]]; //////////////////////////////// mesh3 ThH = SurfaceHex(N,B,L,1); mesh3 ThS =Sphere(0.5,hs,7,1); // "gluing" surface meshs to tolat boundary meshes cout << " xxxx" << ThH.nv << " " << ThS.nv << endl; mesh3 ThHS=ThH+ThS; savemesh(ThHS,"Hex-Sphere.mesh"); exec("ffmedit Hex-Sphere.mesh;rm Hex-Sphere.mesh"); real voltet=(hs^3)/6.; cout << " voltet = " << voltet << endl; real[int] domaine = [0,0,0,1,voltet,0,0,0.7,2,voltet]; mesh3 Th = tetg(ThHS,switch="pqaAAYYQ",nbofregions=2,regionlist=domaine); medit("Cube-With-Ball",Th); } */freefem++-3.38-1/examples++-3d/NSI3d-carac.edp000644 000767 000024 00000005716 11643543622 020514 0ustar00hechtstaff000000 000000 load "msh3" real nu=0.01,dt=0.3; real alpha=1./dt,alpha2=sqrt(alpha); int nn=5; mesh Th2=square(nn,nn); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], // region=r1, labelmid=rmid, reffaceup = rup, reffacelow = rdown); fespace VVh(Th,[P23d,P23d,P23d,P13d]); fespace Vh(Th,P23d); fespace Ph(Th,P13d); macro Grad(u) [dx(u),dy(u),dz(u)]// EOM macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM varf vStokes([u1,u2,u3,p],[v1,v2,v3,q]) = int3d(Th,qforder=3)( Grad(u1)'*Grad(v1) + Grad(u2)'*Grad(v2) + Grad(u3)'*Grad(v3) - div(u1,u2,u3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,u1=1.,u2=0,u3= 0) + on(1,u1=0,u2=0,u3=0) ; cout << "b mat " << endl; matrix A=vStokes(VVh,VVh); cout << "e mat " << endl; set(A,solver=UMFPACK); cout << "e fac mat " << endl; real[int] b= vStokes(0,VVh); VVh [u1,u2,u3,p]; VVh [X1,X2,X3,Xp]; VVh [x1,x2,x3,xp]=[x,y,z,0]; u1[]= A^-1 * b; ux= u1(x,0.5,y); uz= u3(x,0.5,y); p2= p(x,0.5,y); plot([ux,uz],p2,cmm=" cut y = 0.5",wait=1); macro XX1() (x-u1*dt)// macro XX2() (y-u2*dt)// macro XX3() (z-u3*dt)// varf vNS([uu1,uu2,uu3,p],[v1,v2,v3,q]) = int3d(Th)( alpha*(uu1*v1+uu2*v2+uu3*v3) + nu*(Grad(uu1)'*Grad(v1) + Grad(uu2)'*Grad(v2) + Grad(uu3)'*Grad(v3)) - div(uu1,uu2,uu3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,uu1=1,uu2=0,uu3=0) + on(1,uu1=0,uu2=0,uu3=0) + int3d(Th,optimize=1,qforder=4)( alpha*( convect([u1,u2,u3],-dt,u1)*v1 + convect([u1,u2,u3],-dt,u2)*v2 + convect([u1,u2,u3],-dt,u3)*v3 ) ) ; // + int3d(Th,optimize=1)( alpha*( u1(X1,X2,X3)*v1 + u2(X1,X2,X3)*v2 + u3(X1,X2,X3)*v3 ) ) ; // + int3d(Th,optimize=1)( alpha*( u1(XX1,XX2,XX3)*v1 + u2(XX1,XX2,XX3)*v2 + u3(XX1,XX2,XX3)*v3 ) ) ; //+ int3d(Th,optimize=1)( alpha*( u1(x,y,z)*v1 + u2(x,y,z)*v2 + u3(x,y,z)*v3 ) ) ; //+ int3d(Th,optimize=1)( alpha*( u1*v1 + u2*v2 + u3*v3 ) ) ; cout << " build A" << endl; A = vNS(VVh,VVh); cout << " fac A" << endl; set(A,solver=UMFPACK); real t=0; for(int i=0;i<10;++i) { t += dt; cout << " iteration " << i << " t = " << t << endl; X1[]=x1[]+u1[]*(-dt); // verbosity=1000; b=vNS(0,VVh); verbosity=2; u1[]= A^-1 * b; ux= u1(x,0.5,y); uz= u3(x,0.5,y); p2= p(x,0.5,y); plot([ux,uz],p2,cmm=" cut y = 0.5, time ="+t,wait=0); if(i%5==6) { exec("mkdir dd"); string prefu="dd/u-"+(100+i); string prefp="dd/p-"+(100+i); savemesh(Th,prefu+".mesh"); savemesh(Th,prefp+".mesh"); ofstream file(prefu+".bb"); ofstream filep(prefp+".bb"); Ph up1=u1,up2=u2,up3=u3,pp=p; file << "3 1 3 "<< up1[].n << " 2 \n"; filep << "3 1 1 "<< pp[].n << " 2 \n"; for (int j=0;j1) plot(part,fill=1,cmm="dual",wait=1); mesh3[int] aTh(npart); mesh3 Thi=Th; fespace Vhi(Thi,P1); Vhi[int] au(npart),pun(npart); matrix[int] Rih(npart); matrix[int] Dih(npart); matrix[int] aA(npart); Vhi[int] auntgv(npart); Vhi[int] rhsi(npart); for(int i=0;i0,label=10,split=1); Rih[i]=interpolate(Vhi,Vh,inside=1); // Vh -> Vhi if(RAS) { suppi= abs(part-i)<0.1; varf vSuppi(u,v)=int3d(Th,qforder=1)(suppi*v/volume); unssd[]= vSuppi(0,Vh); unssd = unssd>0.; if(withplot>19) plot(unssd,wait=1); } pun[i][]=Rih[i]*unssd[]; sun[] += Rih[i]'*pun[i][];//'; if(withplot>9) plot(part,aTh[i],fill=1,wait=1); } real[int] viso=[0,0.1,0.2,0.3]; plot(sun,wait=1,dim=3,fill=1,viso=viso); for(int i=0;i8) plot(pun[i],wait=1); } // verif partition of unite macro Grad(u) [dx(u),dy(u),dz(u)]//EOM sun=0; for(int i=0;i5) plot(sun,fill=1,wait=1); cout << sun[].max << " " << sun[].min<< endl; // verification of the partition of the unite. assert( 1.-1e-9 <= sun[].min && 1.+1e-9 >= sun[].max); int nitermax=1000; { Vh un=0; for(int iter=0;iter1.e-10,split=1,label=135); medit("Lac",wait=1,Th); plot(Th); // FFCS: testing 3d plots medit("LacTruncated",Th3,wait=1); plot(Th3); // FFCS: testing 3d plots freefem++-3.38-1/examples++/aaa-adp.edp000644 000767 000024 00000004360 12131740306 017526 0ustar00hechtstaff000000 000000 // ----- real eps = 0.0001; real h=1; real hmin=0.000005; real val=10; real coef=50; // err = 1/100 int nbiter=6,firstplot=3; func f = y*x*x+y*y*y+h*tanh(val*(sin(5.0*y)-2.0*x)); cout << atanh(1) << endl; func fx = .0*y*x-0.2E1*h*(1.0-pow(tanh(val*(sin(0.5E1*y)-0.2E1*x)),2.0))*val; func fy = x*x+3.0*y*y+0.5E1*h*(1.0-pow(tanh(val*(sin(0.5E1*y)-0.2E1*x)),2.0))*val*cos(0.5E1*y); func fxy = 2.0*(x*pow(cosh(val*sin(5.0*y)-2.0*val*x),3.0)+10.0*h*val*val*cos(5.0*y) *sinh(val*sin(5.0*y)-2.0*val*x))/pow(cosh(val*sin(5.0*y)-2.0*val*x),3.0); func fxx= 2.0*(y*pow(cosh(val*sin(5.0*y)-2.0*val*x),3.0)-4.0*h*val*val *sinh(val*sin(5.0*y)-2.0*val*x))/pow(cosh(val*sin(5.0*y)-2.0*val*x),3.0); func d = fx*fy - fxy*fxy; func fyy=(6.0*y*pow(cosh(val*sin(5.0*y)-2.0*val*x),3.0)-50.0*h*val*val* pow(cos(5.0*y),2.0)*sinh(val*sin(5.0*y)-2.0*val*x)-25.0*h*val*sin(5.0*y)*cosh(val* sin(5.0*y)-2.0*val*x))/pow(cosh(val*sin(5.0*y)-2.0*val*x),3.0); border cercle(t=0,2*pi){ x=cos(t);y=sin(t);} mesh Th=buildmesh(cercle(20)); fespace Ph(Th,P0); fespace Vh(Th,P1); fespace V2h(Th,P2); Vh fh=f; plot(fh,wait=0); // for (int i=0;i0)*2-1; plot(Th,fh,dh); real[int] vviso(20); for (int i=0;i<20;i++) vviso[i]=(-20+i)/2.; cout << " min max fh " << fh[].min << " " << fh[].max << endl; cout << " min max log(e) " << e[].min << " " << e[].max << endl; if (i>=firstplot) { plot(e,fill=1,value=1,wait=0,viso=vviso,cmm="log10(e) err="+1./coef); savemesh(Th,"Thh"+i+".mesh"); savemesh(Th,"Th"+i,[x,y,fh/2]); { Vh eh=e; ofstream file("Th"+i+".BB"); file << "2 1 1 "<< fh[].n << " 2 \n"; int j; for (j=0;j $@ # To create a new set of reference values in "ref.edp" clean-local: -rm *.fg *.eps *~ *.ps Th?.faces Th?.points Th?.BB Th?.mesh.gmsh ListOf?llocPtr*.bin ffglut*.ppm toto.txt Ref: makeref.edp ../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp FORCE: freefem++-3.38-1/examples++/Makefile.in000644 000767 000024 00000112010 12543260337 017615 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = aadaptation.edp aalapacien.edp aalaplace-nc.edp aamove.edp aaRT.edp arrayoFVh.edp bilap.edp D2.edp demo1.edp demo.edp funct.edp lapacienprecon.edp lap_mat.edp NSP1P1b.edp NSP1P1.edp NSP1P2.edp parareal.edp Richard.edp teste.edp testFE.edp wafer-heating-laser-axi.edp LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw EXTRA_DIST = *.edp all.edp regtests.edp regtests.m4 ref.edp all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? aadaptation.edp.log: aadaptation.edp @p='aadaptation.edp'; \ b='aadaptation.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) aalapacien.edp.log: aalapacien.edp @p='aalapacien.edp'; \ b='aalapacien.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) aalaplace-nc.edp.log: aalaplace-nc.edp @p='aalaplace-nc.edp'; \ b='aalaplace-nc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) aamove.edp.log: aamove.edp @p='aamove.edp'; \ b='aamove.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) aaRT.edp.log: aaRT.edp @p='aaRT.edp'; \ b='aaRT.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) arrayoFVh.edp.log: arrayoFVh.edp @p='arrayoFVh.edp'; \ b='arrayoFVh.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bilap.edp.log: bilap.edp @p='bilap.edp'; \ b='bilap.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) D2.edp.log: D2.edp @p='D2.edp'; \ b='D2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) demo1.edp.log: demo1.edp @p='demo1.edp'; \ b='demo1.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) demo.edp.log: demo.edp @p='demo.edp'; \ b='demo.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) funct.edp.log: funct.edp @p='funct.edp'; \ b='funct.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lapacienprecon.edp.log: lapacienprecon.edp @p='lapacienprecon.edp'; \ b='lapacienprecon.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lap_mat.edp.log: lap_mat.edp @p='lap_mat.edp'; \ b='lap_mat.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSP1P1b.edp.log: NSP1P1b.edp @p='NSP1P1b.edp'; \ b='NSP1P1b.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSP1P1.edp.log: NSP1P1.edp @p='NSP1P1.edp'; \ b='NSP1P1.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSP1P2.edp.log: NSP1P2.edp @p='NSP1P2.edp'; \ b='NSP1P2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parareal.edp.log: parareal.edp @p='parareal.edp'; \ b='parareal.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Richard.edp.log: Richard.edp @p='Richard.edp'; \ b='Richard.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) teste.edp.log: teste.edp @p='teste.edp'; \ b='teste.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE.edp.log: testFE.edp @p='testFE.edp'; \ b='testFE.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) wafer-heating-laser-axi.edp.log: wafer-heating-laser-axi.edp @p='wafer-heating-laser-axi.edp'; \ b='wafer-heating-laser-axi.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-local cscopelist-am ctags-am distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am .PRECIOUS: Makefile all-local: all.edp regtests.edp freefem++.pref all.edp: (echo "NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ # To create a new set of reference values in "ref.edp" clean-local: -rm *.fg *.eps *~ *.ps Th?.faces Th?.points Th?.BB Th?.mesh.gmsh ListOf?llocPtr*.bin ffglut*.ppm toto.txt Ref: makeref.edp ../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp FORCE: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++/makeref.edp000644 000767 000024 00000011774 11412643014 017662 0ustar00hechtstaff000000 000000 // Regression tests // ---------------- // $Id$ // Regression tests // ---------------- // The tests are checked against reference values by "make check" in // each examples subdirectory // "ref.edp" contains all reference values and may be rebuilt with // "make Ref" // $Id$ // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. NoUseOfWait=true; int verbosityy=verbosity; ofstream ref("ref.edp"); // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. cout << "--------- file : aadaptation.edp -----------------" << endl; verbosity=verbosityy; { include "aadaptation.edp"; real TESTaadaptation=regvalue; ref<<"real REFaadaptation="<= nbiter) break; u1x=0;u1y=0; Pu1;Pu2; plot([u1x,u2x],wait=1); Th=adaptmesh(Th,[u1x,u2x],abserror=0,cutoff=cut,err=tol, inquire=0); plot(Th); dt = dt*coefdt; tol = tol *coeftol; cut = cut *coefcut; } cout << "CPU " << clock()-s0 << "s " << endl; freefem++-3.38-1/examples++/NSP1P1b.edp000644 000767 000024 00000004036 11406142255 017331 0ustar00hechtstaff000000 000000 // remark: the sign of p is correct real s0=clock(); mesh Th=square(20,20); Th=adaptmesh(Th,1./20.,IsMetric=1,splitpbedge=1); fespace Vh2(Th,P1b); fespace Vh(Th,P1); Vh2 u2,v2,up1,up2; Vh2 u1,v1; Vh u1x=0,u1y,u2x,u2y, vv; real reylnods=400; //cout << " Enter the reynolds number :"; cin >> reylnods; assert(reylnods>1 && reylnods < 100000); up1=0; up2=0; func g=(x)*(1-x)*4; Vh p=0,q; real alpha=0; real nu=1; int i=0,iter=0; real dt=0; solve NS ([u1,u2,p],[v1,v2,q],solver=Crout,init=i) = int2d(Th)( alpha*( u1*v1 + u2*v2) + nu * ( dx(u1)*dx(v1) + dy(u1)*dy(v1) + dx(u2)*dx(v2) + dy(u2)*dy(v2) ) + p*q*(0.000001) - p*dx(v1) - p*dy(v2) - dx(u1)*q - dy(u2)*q ) + int2d(Th) ( -alpha*convect([up1,up2],-dt,up1)*v1 -alpha*convect([up1,up2],-dt,up2)*v2 ) + on(3,u1=g,u2=0) + on(1,2,4,u1=0,u2=0) ; plot(coef=0.2,cmm=" [u1,u2] et p ",p,[u1,u2],ps="StokesP2P1.eps",value=1,wait=1); { real[int] xx(21),yy(21),pp(21); for (int i=0;i<21;i++) { yy[i]=i/20.; xx[i]=u1(0.5,i/20.); pp[i]=p(i/20.,0.999); } cout << " " << yy << endl; plot([xx,yy],wait=1,cmm="u1 x=0.5 cup"); plot([yy,pp],wait=1,cmm="pressure y=0.999 cup"); } dt = 0.05; int nbiter = 3; real coefdt = 0.25^(1./nbiter); real coefcut = 0.25^(1./nbiter) , cut=0.01; real tol=0.5,coeftol = 0.5^(1./nbiter); nu=1./reylnods; for (iter=1;iter<=nbiter;iter++) { cout << " dt = " << dt << " ------------------------ " << endl; alpha=1/dt; for (i=0;i<=50;i++) { up1=u1; up2=u2; NS; if ( !(i % 10)) plot(coef=0.2,cmm=" [u1,u2] et p ",p,[u1,u2],ps="plotNS_"+iter+"_"+i+".eps"); cout << "CPU " << clock()-s0 << "s " << endl; } if (iter>= nbiter) break; Th=adaptmesh(Th,[dx(u1),dy(u1),dx(u1),dy(u2)],splitpbedge=1,abserror=0,cutoff=cut,err=tol, inquire=0,ratio=1.5,hmin=1./1000); plot(Th,ps="ThNS.eps"); dt = dt*coefdt; tol = tol *coeftol; cut = cut *coefcut; } cout << "CPU " << clock()-s0 << "s " << endl; freefem++-3.38-1/examples++/NSP1P2.edp000644 000767 000024 00000003754 12354473756 017216 0ustar00hechtstaff000000 000000 // remark: the sign of p is correct real s0=clock(); mesh Th=square(10,10); fespace Vh2(Th,P2); fespace Vh(Th,P1); Vh2 u2,v2,up1,up2; Vh2 u1,v1; Vh u1x=0,u1y,u2x,u2y, vv; real reylnods=1000; //cout << " Enter the reynolds number :"; cin >> reylnods; assert(reylnods>1 && reylnods < 100000); up1=0; up2=0; func g=(x)*(1-x)*4; Vh p=0,q; real alpha=0; real nu=1; int i=0,iter=0; real dt=0; solve NS ([u1,u2,p],[v1,v2,q],solver=Crout,init=i) = int2d(Th)( alpha*( u1*v1 + u2*v2) + nu * ( dx(u1)*dx(v1) + dy(u1)*dy(v1) + dx(u2)*dx(v2) + dy(u2)*dy(v2) ) + p*q*(0.000001) - p*dx(v1) - p*dy(v2) - dx(u1)*q - dy(u2)*q ) + int2d(Th) ( -alpha*convect([up1,up2],-dt,up1)*v1 -alpha*convect([up1,up2],-dt,up2)*v2 ) + on(3,u1=g,u2=0) + on(1,2,4,u1=0,u2=0) ; plot(coef=0.2,cmm=" [u1,u2] et p ",p,[u1,u2],ps="StokesP2P1.eps",value=1,wait=1); { real[int] xx(21),yy(21),pp(21); for (int i=0;i<21;i++) { yy[i]=i/20.; xx[i]=u1(0.5,i/20.); pp[i]=p(i/20.,0.999); } cout << " " << yy << endl; plot([xx,yy],wait=1,cmm="u1 x=0.5 cup"); plot([yy,pp],wait=1,cmm="pressure y=0.999 cup"); } dt = 0.1; int nbiter = 5; real coefdt = 0.25^(1./nbiter); real coefcut = 0.25^(1./nbiter) , cut=0.01; real tol=0.5,coeftol = 0.25^(1./nbiter); nu=1./reylnods; for (iter=1;iter<=nbiter;iter++) { cout << " dt = " << dt << " ------------------------ " << endl; alpha=1/dt; for (i=0;i<=50;i++) { up1=u1; up2=u2; NS; if ( !(i % 10)) plot(coef=0.2,cmm=" [u1,u2] et p ",p,[u1,u2],ps="plotNS_"+iter+"_"+i+".eps"); cout << "CPU " << clock()-s0 << "s " << endl; } if (iter>= nbiter) break; Th=adaptmesh(Th,[dx(u1),dy(u1),dx(u1),dy(u2)], abserror=0,cutoff=cut,err=tol, inquire=0,ratio=1.5,hmin=1./1000); plot(Th,ps="ThNS.eps"); dt = dt*coefdt; tol = tol *coeftol; cut = cut *coefcut; } cout << "CPU " << clock()-s0 << "s " << endl; freefem++-3.38-1/examples++/parareal.edp000644 000767 000024 00000006525 11406142255 020041 0ustar00hechtstaff000000 000000 //int Nh=20; // d u /dt = cos(t), u= sin(t) + u0 // avec de methode para reel. // schema euler explicite // (u,v)' = (v,-u) // u_n+1 - u_n = v_n*dt, u_n+1 = u_n + v_n*dt // v_n+1 - v_n = -u_n*dt, // u=cos(t) u' = - sin(t) = v // v=sin(t), v' = cos(t) = u // ---------------------------- real DT=0.4; int nbT=50; // nb de big time step int ksub=50; // nb of small time step int Nbig=20; // max number of Big iteration real T0=0; // initial time real tol=1e-5; // tolerance // ---------------------------------------------------- int nbt=ksub*nbT; real dt=DT/ksub; // array for plotting real[int] pt(nbt+1),pT(nbT+1),pu(nbt+1),pU(nbT+1); // gros maillage mesh TH=square(3,3); // maillage fin mesh Th=trunc(TH,1,split=1); fespace VH(TH,P1); fespace Vh(Th,P1); int n=2; int N=2; func real Norm(real[int] & U) { return sqrt(square(U[10])+square(U[11])); } // restriction func bool h2H(real[int] & u,real[int] & U) { U=0; U[10+0]=u[0]; U[10+1]=u[1]; return true; } // prolongement func bool H2h(real[int] & U,real[int] & u) { u=0; u[0]=U[10+0]; u[1]=U[10+1]; return true; } func bool initG(real[int] & U) { U=0; U[10+0]=1;// cos(0) U[10+1]=0;// sin(0) } // un pas de temps FIN func bool F(real[int] & u,real[int] & up) { u[0] = up[0] + up[1]*dt; u[1] = up[1] - up[0]*dt; // cout << up[0] << " " << up[1] << endl; return true; } // pas de temps grossier func bool G(real[int] & U,real[int] & Up) { U[0+10] = Up[0+10] + Up[1+10]*DT; U[1+10] = Up[1+10] - Up[0+10]*DT; // cout << Up[10] << " " << Up[11] << endl; return true; } func bool AddGp(real[int] & U,int I) { pT[I]= T0+I*DT; pU[I]=U[10]; return true; } func bool AddFp(real[int] & u,int I,int i) { pt[I*ksub+i]= T0+I*DT+i*dt; pu[I*ksub+i]= u[0]; return true; } Vh ustart[nbT+1],uend[nbT]; // start VH Uend[nbT]; VH U0,U1; real t=T0,T=T0; // temps courant int it=0,iT=0; pt[it]=t; pT[iT]=T; initG(U0[]); AddGp(U0[],iT); H2h(U0[], ustart[iT][]); // initial for (int I=0;I> z; cout << " z = " << z << " f=" << f << endl;}; { mesh Th = square(5,5); fespace Vh(Th); // P1 Vh uh; uh=2*x+10*y; // do P1 interpolation x=0.5; y=0.9; real uhxy=uh; // get the value of uh at point (x,y)= 0.5,0.9 cout << "uh at (0.5,0.9) =" << uhxy << endl; }; { ofstream f("toto.txt"); f << "coucou'\n"; }; { ofstream f("toto.txt",append); f << "add coucou'\n"; }; // no current mesh map["1"]=2.0; map[2]=3.0; // 2 is automaticaly cast to the string "2" cout << " map[\"1\"] = " << map["1"] << "; "<< endl; cout << " map[2] = " << map[2] << "; "<< endl; { real a,b,c; int i,j,k; }; string str,str1; str="abc+"; str1="+abcddddd+"; str=str + str1; str = str + 2 ; cout << "str= " << str << "== abc++abcddddd+2;\n"; real x=3.14,y; int i,j; complex c; cout << " x = " << x << "\n"; x = 1;y=2; x=y; i=0;j=1; cout << 1 + 3 << "\n"; cout << 10 ^10 << "\n"; cout << 10 ^-10 << "\n"; cout << -10^-2+5 << "== 4.99 \n"; cout << 10^-2+5 << "== 5.01 \n"; cout << "------------------ complex ---- \n" ; cout << 10-10i << " \n"; cout << " -1^(1/3) = " << (-1+0i)^(1./3.) << " \n"; cout << " 8^(1/3)= " << (8)^(1./3.) << " \n"; cout << " sqrt(-1) = " << sqrt(-1+0i) << " \n"; cout << " ++i =" << ++i ; cout << " i=" << i << "\n"; cout << " i++ = "<< i++ << "\n"; cout << " i = " << i << "\n"; cout << " for (i=0;i<10;i=i+1) \n"; for (int i=0;i<100;i=i+1) { if (i>=10) break; real a=i; tab[i] = i*i; if (i>5) continue; cout << i << " " << tab[i] << "\n"; }; R3 P; P.x=1; x=P.x; cout << P.x << "\n"; freefem++-3.38-1/examples++/testFE.edp000644 000767 000024 00000002350 12167254041 017436 0ustar00hechtstaff000000 000000 real regtest;// for FFCS regression tests // exact solution is [x*x,y] -Delta [x*x,y] = [-2,0] // This exemple is buggus before version 1.26 { // test of product of same FE verbosity = 2; mesh Th=square(2,2); fespace Vh(Th,P2); Vh uHx=0; Vh uHy=0; Vh vHx; Vh vHy; solve deuxlap([uHx,uHy],[vHx,vHy],solver=CG) = int2d(Th)( dx(uHx)*dx(vHx) + dy(uHx)*dy(vHx) + dx(uHy)*dx(vHy) + dy(uHy)*dy(vHy) ) - int2d(Th)( -2* vHx ) + on(1,2,3,4,uHx=x*x,uHy=y); // plot(uHx, uHy,wait=1); real err2= sqrt( int2d(Th)(square(uHx-x*x)+square(uHy-y))); cout << " Error in L2 norme " << err2 << endl ; assert(err2 < 1e-10); } { // test of product of different FE verbosity = 2; mesh Th=square(2,2); fespace Vh(Th,P2); fespace Vh1(Th,P1); Vh uHx=0; Vh1 uHy=0; Vh vHx; Vh1 vHy; solve deuxlap([uHx,uHy],[vHx,vHy],solver=CG) = int2d(Th)( dx(uHx)*dx(vHx) + dy(uHx)*dy(vHx) + dx(uHy)*dx(vHy) + dy(uHy)*dy(vHy) ) - int2d(Th)( -2* vHx ) + on(1,2,3,4,uHx=x*x,uHy=y); // plot(uHx, uHy,wait=1); real err2= sqrt( int2d(Th)(square(uHx-x*x)+square(uHy-y))); cout << " Error in L2 norme " << err2 << endl ; assert(err2 < 1e-10); regtest=err2; } freefem++-3.38-1/examples++/wafer-heating-laser-axi.edp000644 000767 000024 00000010653 11406142255 022653 0ustar00hechtstaff000000 000000 // simulation of wafer heating by a laser. /************************************************************** From: Fabian Dortu Materials and Components Analysis group (MCA) SPDT division IMEC, Kapeldreef 75, B-3001 Leuven, Belgium tel: +32/16 28 8774 e-mail: Fabian.Dortu@imec.be **************************************************************/ // The poisson equation (here the heat equation) is solved in cylindrical coordinates: // $ \Delta u = 1/r \partial_r(r \partial_r u) + \partial_{zz} u + 1/r^2 \partial_{\theta^2} u $ // so the variationnal formulation is after integer on the 3d cylinder // rotation invariant given $\partial_{\theta} u =0$ // $ - \Delta u = f $ // on the 1/2 plan $ \theta =0$ // $ \int r ( \partial_r u \partial_r v + \partial_z u \partial_z v ) = \int r f v - \int_{\Gamma} r \partial_n u v $ // the radial coordinate 'r' is called 'x'. // the depth coordinate 'z' is called 'y'. // The wafer stuck is a rectangle with upper left corner at (0,0) // and lower right corner at (radius,-thickness) // The laser beam it the surface from top to bottom at the center (0,0). // The units assumed for the distance is the micrometer (um) //*********************** //*** User parameters *** //*********************** real radius=1000; // the wafer radius (um) real thick=600; // the wafer thickness (um) real thC=1.5e-4; // the thermal conductivity (W/K/um) real beamr=2; // the laser beam radius (in the sens of a gaussian) real refl=0.55; // reflection coefficient Air/Silicon real Eg=1.12; // Band gap of Silicon (eV) real En=1.49; // Energy of laser (eV) - must be greater than Eg. real I0=1e-2; // Laser beam intensity (W/um^2) real alpha=0.2; // absorption coefficient (um^-1) func f=I0 * (1-refl) * (En-Eg)/En * alpha * exp(alpha*y) * exp(-x*x/beamr/beamr); // the heat generation function: a laser beam of radius 'beamr' // lateral shape is gaussian. // in depth shape is decreasing exponential because of absorption. real g=300; // temperature at right and bottom surfaces (in Kelvin) //******************************** //*** Geometry/Mesh definition *** //******************************** //--- less basic mesh --- border bottom1(t=0,radius/5) {x=t; y=-thick; label=1;} border bottom2(t=radius/5,radius) {x=t; y=-thick; label=2;} border right1(t=-thick,0) {x=radius; y=t; label=3;}; // 'right' actually means external surface border top1(t=radius,radius/5*3) {x=t; y=0; label=4;}; border top2(t=radius/5*3,radius/5) {x=t; y=0; label=5;} border top3(t=radius/5,0) {x=t; y=0; label=6;}; border left1(t=0,-thick/5) {x=0; y=t; label=7;}; // 'left' actually means center of cylinder border left2(t=-thick/5,-thick) {x=0; y=t; label=8;}; // 'left' actually means center of cylinder mesh Th = buildmesh ( bottom1(20) + bottom2(10) + right1(20) + top1(10) + top2(20) + top3(50) + left1(50) + left2(25) ); plot(Th,wait=1,fill=1,ps="wafer_mesh2.eps"); //savemesh(Th,"wafer_stuck.msh"); //************************** //*** Problem definition *** //************************** fespace Vh(Th,P1); Vh u,v,zero; u=0; // The temperature variable. v=0; // The weight function. zero=0; // used to set initial condition int i=0; // variable used for mesh reconstruction real error=0.1, coef=0.1^(1./5.); //--- Variational Form ---- problem Problem1(u,v,solver=CG,init=i,eps=1.0e-8) = int2d(Th) ( x*dx(u)*dx(v) + x*dy(u)*dy(v) ) + int2d(Th) ( -v*x*f/thC ) // the source term = laser heating + on( 1,2,3,u=g ) ; // fixed temperature at bottom and right surface. //************* //*** Solve *** //************* real cpu=clock(); cout << "***USER*** " << "Begin solve/adapt iterations" << endl; for (i=0;i<10;i++) { cout << "***USER*** " << "Iteration number: " << i << endl; real d = clock(); Problem1; plot(u,wait=1); Th=adaptmesh(Th,u,inquire=1,err=error); cout << " CPU = " << clock()-d << endl; error = error * coef; } ; plot(Th,wait=1,bb=[[0,0],[-10,-10]],nbiso=20,ps="adaptedmesh.eps"); // plot the last adapted mesh plot(u,wait=1,bb=[[0,0],[-10,-10]],nbiso=20,ps="temperature.eps"); // plot the solution //Plot a cut section at r=0 real[int] xx(10),yy(10); for (i=0;i<10;i++) { x=0.; y=i/10.; // this line is used by the next one xx[i]=i; yy[i]=u; // value of u at point (0. , i/10.) } plot([xx,yy],ps="likegnu.eps",wait=true); cout << " CPU = " << clock()-cpu << endl; freefem++-3.38-1/download/arpack/000755 000767 000024 00000000000 12544247066 016666 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/AUTHORS000644 000767 000024 00000000547 11443625351 016475 0ustar00hechtstaff000000 000000 Library mmg3d, Authors: -- Dobrzynski Ccile -- Frey Pascal This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The licence will be CeCILL-C (see http://www.cecill.info/ for more detail.) freefem++-3.38-1/download/blacs/000755 000767 000024 00000000000 12544247066 016511 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/blas/000755 000767 000024 00000000000 12544247066 016346 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/common.mak000644 000767 000024 00000003502 12306032762 017376 0ustar00hechtstaff000000 000000 # Common make rules for all downloaded packages (request from FH) # ====================================================================== # Written by Antoine Le Hyaric # http://www.ljll.math.upmc.fr/lehyaric # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Common make rules for all downloaded packages (request from FH)" default=0 freefem make start=06/11/2013 upmc written # Common goals for all packages: # download compile install reinstall clean veryclean # <> # PKGCOMMON_PACKTITLE correspond to package names in [[file:getall]] download:: ../getall -o $(PKGCOMMON_PACKTITLE) $(PKGCOMMON_PACKAGES):download compilepkg::download # <> install::compilepkg # <> reinstall::compilepkg clean-local:: veryclean::clean -rm $(PKGCOMMON_PACKAGES) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/f2c/000755 000767 000024 00000000000 12544247066 016077 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/fftw/000755 000767 000024 00000000000 12544247066 016373 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/getall000755 000767 000024 00000023607 12535517567 016641 0ustar00hechtstaff000000 000000 #!/usr/bin/perl # Download third-party packages independently of FF configuration (request from FH) # ====================================================================== # Written by Antoine Le Hyaric # http://www.ljll.math.upmc.fr/lehyaric # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Download third-party packages independently of FF configuration (request from FH)" default=0 freefem perl start=21/10/2013 upmc written use strict; use Getopt::Std; use Digest::MD5 qw(md5_hex); # [[http://perldoc.perl.org/Digest/MD5.html]] # This download script needs to be able to work on platforms that do not have threads (eg Mingw). my $can_use_threads=eval 'use threads;use threads::shared;1'; my %opts; getopts('afho:',\%opts); if($opts{h}){ print <create(\&downloadone,$_)} foreach(@threads){$_->join()} } else{ foreach(@downloads){downloadone($_)} } if($errors ne ''){ print "\n$errors"; exit 1; } sub download{ my($title,$url,$lic,$pkg,$md5,$opts)=@_; # skip packages that have not been requested explicitely return if($only && !defined $packs{$title}); # skip packages that are already present if(-f "pkg/$pkg" && !$opts{f}){ my $md5check=md5_hex(`cat pkg/$pkg`); if( ( $md5 eq "none") || ($md5check eq $md5)) { print "$title $pkg done\n"; return; } else { print "$title $pkg md5 change => reget \n"; } } # we do not store the answers to these questions. To repeat the same downloads without manual input, options "-a" and # "-o names" are provided. if(!$opts{a}){ print "$title: please check the licence at $lic. Do you want to download $url? (yN)\n"; my $ans=uc ; chomp $ans; return if $ans ne 'Y'; } # uses [[file:../build/download]] push @downloads,"$url,pkg/$pkg,$md5,$opts"; } sub downloadone{ my($url,$pkg,$md5,$opts)=split(/,/,$_[0]); my $cmd="../build/download $url $pkg $opts"; print "$cmd\n"; system $cmd; if($?){ my $cmd="../build/download http://www.freefem.org/ff++/$pkg $pkg $opts"; print "try other site: $cmd\n"; system $cmd; if($?){ $errors.="ERROR: $cmd FAILED\n"} } # check if resulting package contents are valid my $md5check=md5_hex(`cat $pkg`); if( ( $md5 ne "none") && ($md5check ne $md5)){$errors.="ERROR: INVALID MD5 for $pkg\n"} } # Local Variables: # mode:cperl # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/gmm/000755 000767 000024 00000000000 12544247066 016205 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/headers-sparsesolver.inc000644 000767 000024 00000011351 11406142255 022250 0ustar00hechtstaff000000 000000 # BLAS #FFBLASINCLUDE = -I/Users/morice/librairie/PATCHVECLIB/ #FFBLASDIRLIBS = #FFBLASLIB = -L/Users/morice/librairie/PATCHVECLIB/ -lwrapperdotblas -framework veclib #FFBLASLIB2 = -lblas # LAPACK #FFLAPACKDIRLIBS = #FFLAPACKLIB = -framework veclib #FFLAPACKLIB2 = -llapack # MPI #FFMPIDIR = /Users/morice/librairie/openmpi-gcc-gfortran-4.4/ #FFMPIINCLUDE = -I/Users/morice/librairie/openmpi-gcc-gfortran-4.4/include/ #FFMPILIB = -L/Users/morice/librairie/openmpi-gcc-gfortran-4.4/lib/ -lmpi -lmpi_cxx -lopen-pal -lopen-rte -lotf -lvt #FFMPIDIRLIBS = /Users/morice/librairie/openmpi-gcc-gfortran-4.4/lib/ #FFMPILIB2 = mpi mpi_cxx open-pal open-rte otf vt # INT #pastix FFVERSIONINT = _long FFCTYPESINT = -DFORCE_LONG -DLONG #scotch FFINTSCOTCH = -DLONG #hips :: -DINTSIZE32, -DINTSIZE64 ou default FFINTHIPS = # particularite # FFLIBOTHERSMUMPS = -framework Carbon -framework AppKit #blasdef :: FFBLASDEF = -DUSE_VENDOR_BLAS #### parameter for blacs #### # ------------------------------------------------------------------------ # Allows the user to vary the topologies that the BLACS default topologies # (TOP = ' ') correspond to. If you wish to use a particular topology # (as opposed to letting the BLACS make the choice), uncomment the # following macros, and replace the character in single quotes with the # topology of your choice. # ------------------------------------------------------------------------ # DEFBSTOP = -DDefBSTop="'1'" # DEFCOMBTOP = -DDefCombTop="'1'" FFDEFBSTOP = FFDEFCOMBTOP = # ------------------------------------------------------------------- # If your MPI_Send is locally-blocking, substitute the following line # for the empty macro definition below. # SENDIS = -DSndIsLocBlk # ------------------------------------------------------------------- FFSENDIS = # -------------------------------------------------------------------- # If your MPI handles packing of non-contiguous messages by copying to # another buffer or sending extra bytes, better performance may be # obtained by replacing the empty macro definition below with the # macro definition on the following line. # BUFF = -DNoMpiBuff # -------------------------------------------------------------------- FFBUFF = # ----------------------------------------------------------------------- # If you know something about your system, you may make it easier for the # BLACS to translate between C and fortran communicators. If the empty # macro defininition is left alone, this translation will cause the C # BLACS to globally block for MPI_COMM_WORLD on calls to BLACS_GRIDINIT # and BLACS_GRIDMAP. If you choose one of the options for translating # the context, neither the C or fortran calls will globally block. # If you are using MPICH, or a derivitive system, you can replace the # empty macro definition below with the following (note that if you let # MPICH do the translation between C and fortran, you must also indicate # here if your system has pointers that are longer than integers. If so, # define -DPOINTER_64_BITS=1.) For help on setting TRANSCOMM, you can # run BLACS/INSTALL/xtc_CsameF77 and BLACS/INSTALL/xtc_UseMpich as # explained in BLACS/INSTALL/README. # TRANSCOMM = -DUseMpich # # If you know that your MPI uses the same handles for fortran and C # communicators, you can replace the empty macro definition below with # the macro definition on the following line. # TRANSCOMM = -DCSameF77 # ----------------------------------------------------------------------- FFTRANSCOMM = -DUseMpi2 # -------------------------------------------------------------------------- # You may choose to have the BLACS internally call either the C or Fortran77 # interface to MPI by varying the following macro. If TRANSCOMM is left # empty, the C interface BLACS_GRIDMAP/BLACS_GRIDINIT will globally-block if # you choose to use the fortran internals, and the fortran interface will # block if you choose to use the C internals. It is recommended that the # user leave this macro definition blank, unless there is a strong reason # to prefer one MPI interface over the other. # WHATMPI = -DUseF77Mpi # WHATMPI = -DUseCMpi # -------------------------------------------------------------------------- FFWHATMPI = # --------------------------------------------------------------------------- # Some early versions of MPICH and its derivatives cannot handle user defined # zero byte data types. If your system has this problem (compile and run # BLACS/INSTALL/xsyserrors to check if unsure), replace the empty macro # definition below with the macro definition on the following line. # SYSERRORS = -DZeroByteTypeBug # --------------------------------------------------------------------------- FFSYSERRORS = freefem++-3.38-1/download/hips/000755 000767 000024 00000000000 12544247066 016370 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/hypre/000755 000767 000024 00000000000 12544247066 016554 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/ipopt/000755 000767 000024 00000000000 12544247066 016560 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/Makefile.am000755 000767 000024 00000014245 12534101664 017462 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id: Makefile.am,v 1.16 2010/05/06 21:20:38 hecht Exp $ SUBDIRS=blas arpack umfpack EXTRA_DIST= \ ./nlopt/Make.inc ./nlopt/Makefile \ ./blacs/BLACS.patch \ ./blacs/BLACS_gridinit_.c-return-values.patch \ ./blacs/Bmake-blacs.inc \ ./blacs/Makefile \ ./f2c/Makefile \ ./f2c/Makefile-MacOs \ ./f2c/f2c.h-int \ ./f2c/fort77.sed \ ./f2c/tt.f \ ./fftw/Makefile.am \ ./fftw/Makefile.in \ ./gmm/Makefile \ ./gmm/cxxflags \ ./headers-sparsesolver.inc \ ./hips/Makefile \ ./hips/SRC_SPKIT_makefile \ ./hips/hips-1.2b-rc4.patch \ ./hips/makefile-hips.inc \ ./hypre/Makefile \ ./hypre/ff-flags.inc \ ./metis/Makefile \ ./metis/Makefile-metis.in \ ./metis/patch-metis \ ./metis/metis-4.0_main_return.patch \ ./mmg3d/Makefile \ ./mmg3d/patch-mmg3dv4.diff \ ./mshmet/Makefile \ ./mshmet/Makefile-mshmet.inc \ ./mshmet/mshmet.2011.03.06.patch \ ./mshmet/mshmet.2012.04.25_i586.patch \ ./mshmet/mshmetlib-internal.h \ ./mshmet/mshmetlib.c \ ./mshmet/mshmetlib.h \ ./mumps/Makefile \ ./mumps-seq/Makefile-mumps-5.0.0.inc \ ./mumps-seq/Makefile \ ./mumps/Makefile-mumps-5.0.0.inc \ ./parmetis/Makefile-parmetis.in \ ./parmetis/makefile \ ./parmetis/parmetis-4.0.3.patch \ ./parms/Makefile \ ./parms/makefile-parms.in \ ./pastix/Makefile \ ./pastix/config-pastix-complex.in \ ./pastix/config-pastix-real.in \ ./pastix/pastix_release_2200-blend.patch \ ./pastix/patch-pastix_long_complex.h \ ./pastix//all_macros.diff \ ./scalapack/Makefile \ ./scalapack/SLmake-scalapack.inc \ ./scotch/Makefile \ ./scotch/Makefile-scotch.inc \ ./scotch/Makefile.patch \ ./scotch/scotch_6.0.3.patch \ ./superlu/Makefile \ ./superlu/make.inc \ ./superludist/Makefile \ ./superludist/make-superlu.inc \ ./superludist/superludist_2.3.patch \ ./superludist/superludist_3.0-printf.patch \ ./superludist/superludist_3.0-cast_warning.patch \ ./superludist/superludist_3.0-return_values.patch \ ./superludist/superludist_3.0-operation_undefined.patch \ ./tetgen/Makefile \ ./tetgen/tetgen1.4.2.patch \ ./tetgen/patches.win64 \ ./yams/Makefile \ ./yams/freeyams.2012.02.05.patch \ ./yams/freeyams.2012.02.05-return-values.patch \ ./yams/makefile-yams.inc \ ./yams/yamslib.c \ ./yams/yamslib.h \ ./yams/yamslib_internal.h \ ipopt/Makefile \ ipopt/Makefile.inc.in \ ipopt/patch-IpBlas \ getall patch-hpddm-1 # FFCS: See [[file:../../../configure.ac::tools_problems_all_platforms]] for reasons why some tools may be deactivated # <> blacs is included in scalapack 2.0.2 MPI_SOFT= scalapack @TOOL_COMPILE_superludist@ \ @TOOL_COMPILE_mumps@ @TOOL_COMPILE_pastix@ \ @TOOL_COMPILE_hips@ @TOOL_COMPILE_parms@ LIST_SOFT=tetgen @TOOL_COMPILE_parmetis@ @TOOL_COMPILE_superlu@ fftw \ @TOOL_COMPILE_scotch@ @TOOL_COMPILE_mshmet@ \ @TOOL_COMPILE_yams@ @TOOL_COMPILE_mmg3d@ @TOOL_COMPILE_gmm@ \ @TOOL_COMPILE_nlopt@ @TOOL_COMPILE_mumps_seq@ \ @TOOL_COMPILE_ipopt@ all-recursive: bin lib include pkg lib: mkdir lib bin: mkdir bin include: mkdir include pkg: mkdir pkg # ALH - /download/yams and /download/mshmet need /src/libMesh/libmesh.a but /src is compiled after /download, so we # need to compile it now lib/libMesh.a:lib include cd ../src/libMesh && $(MAKE) $(AM_MAKEFLAGS) test -f ../src/libMesh/libMesh.a mkdir -p include/libMesh cp ../src/libMesh/*h include/libMesh echo libMesh LD -L@DIR@/lib -lMesh > lib/WHERE.libMesh echo libMesh INCLUDE -I@DIR@/include/libMesh >> lib/WHERE.libMesh cp ../src/libMesh/libMesh.a lib/libMesh.a all-local:bin lib include lib/libMesh.a pkg $(DOWNLOADCOMPILE) install-other install-other: tag-install-other tag-install-other: if test -n "$(TOOL_COMPILE_schwarz)" ; then $(MAKE) install-hpddm; else true; fi touch tag-install-other WHERE-OTHER: lib/WHERE.hpddm WHERE-LD: tag-compile-pkg WHERE-OTHER touch ../examples++-load/WHERE_LIBRARY-config ../examples++-load/WHERE_LIBRARY grep LD ../examples++-load/WHERE_LIBRARY ../examples++-load/WHERE_LIBRARY-config >WHERE-LD install-hpddm: if test -n "$(TOOL_COMPILE_schwarz)"; then ./getall -o hpddm -a; $(MAKE) include/hpddm-master lib/WHERE.hpddm; else true;fi reinstall-hpddm: -rm ./pkg/hpddm.zip -rm -rf include/hpddm-master -test -n "$(TOOL_COMPILE_schwarz)" && $(MAKE) install-hpddm || true include/hpddm-master:patch-hpddm-1 -if test -f ./pkg/hpddm.zip ; then cd include; unzip ../pkg/hpddm.zip ; else true; fi if `../build/ff-md5 include/hpddm-master/src/wrapper.hpp 4c8acce994d0d5ac533ed58e59dcd187` ; then patch -p1 $@ ;\ echo hpddm INCLUDE -I@DIR@/include/hpddm-master/src >> $@ ;\ else true; fi # FFCS: need to stop at the first error to make sure that all libraries are correctly compiled compile-dir: @echo "\n\n ****** $(COMPILEDIR) ****** \n\n"; @if [ 0 -eq `egrep ':$(COMPILEDIR)' WHERE-LD | wc -l` ] ;then \ cd $(COMPILEDIR) && $(MAKE) $(DIRTARGET) ; \ else \ echo $(COMPILEDIR) is in WHERE- files ;\ fi compile-pkg: tag-compile-pkg WHERE-LD # FFCS: need to stop at the first error to make sure that all libraries are correctly compiled tag-compile-pkg: bin lib include pkg FORCE @if [ -n "$(WGET)" ] ; then \ for d in $(LIST_SOFT) ; do $(MAKE) compile-dir COMPILEDIR=$$d || exit 1;done ;\ if [ -n "$(MPICC)" ] ; then \ for d in $(MPI_SOFT) ; do $(MAKE) compile-dir COMPILEDIR=$$d || exit 1; done;\ fi;fi touch tag-compile-pkg FORCE: re-install: $(MAKE) compile-pkg DIRTARGET=install WHERE: $(MAKE) compile-pkg DIRTARGET=WHERE install-exec-local: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/bin $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/include cp -rp lib $(DESTDIR)$(ff_prefix_dir) cp -rp include $(DESTDIR)$(ff_prefix_dir) cp -rp bin $(DESTDIR)$(ff_prefix_dir) clean-local: -rm -rf tag-* include lib bin -mkdir include lib bin -rm */FAIT */FAIRE # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see # [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) for d in $(LIST_SOFT) $(MPI_SOFT) ; do $(MAKE) clean -C $$d ; done freefem++-3.38-1/download/Makefile.in000644 000767 000024 00000071644 12543260336 017500 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Downloading and compiling extra libraries # ----------------------------------------- # $Id: Makefile.am,v 1.16 2010/05/06 21:20:38 hecht Exp $ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = download ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ AUTHORS DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = blas arpack umfpack EXTRA_DIST = \ ./nlopt/Make.inc ./nlopt/Makefile \ ./blacs/BLACS.patch \ ./blacs/BLACS_gridinit_.c-return-values.patch \ ./blacs/Bmake-blacs.inc \ ./blacs/Makefile \ ./f2c/Makefile \ ./f2c/Makefile-MacOs \ ./f2c/f2c.h-int \ ./f2c/fort77.sed \ ./f2c/tt.f \ ./fftw/Makefile.am \ ./fftw/Makefile.in \ ./gmm/Makefile \ ./gmm/cxxflags \ ./headers-sparsesolver.inc \ ./hips/Makefile \ ./hips/SRC_SPKIT_makefile \ ./hips/hips-1.2b-rc4.patch \ ./hips/makefile-hips.inc \ ./hypre/Makefile \ ./hypre/ff-flags.inc \ ./metis/Makefile \ ./metis/Makefile-metis.in \ ./metis/patch-metis \ ./metis/metis-4.0_main_return.patch \ ./mmg3d/Makefile \ ./mmg3d/patch-mmg3dv4.diff \ ./mshmet/Makefile \ ./mshmet/Makefile-mshmet.inc \ ./mshmet/mshmet.2011.03.06.patch \ ./mshmet/mshmet.2012.04.25_i586.patch \ ./mshmet/mshmetlib-internal.h \ ./mshmet/mshmetlib.c \ ./mshmet/mshmetlib.h \ ./mumps/Makefile \ ./mumps-seq/Makefile-mumps-5.0.0.inc \ ./mumps-seq/Makefile \ ./mumps/Makefile-mumps-5.0.0.inc \ ./parmetis/Makefile-parmetis.in \ ./parmetis/makefile \ ./parmetis/parmetis-4.0.3.patch \ ./parms/Makefile \ ./parms/makefile-parms.in \ ./pastix/Makefile \ ./pastix/config-pastix-complex.in \ ./pastix/config-pastix-real.in \ ./pastix/pastix_release_2200-blend.patch \ ./pastix/patch-pastix_long_complex.h \ ./pastix//all_macros.diff \ ./scalapack/Makefile \ ./scalapack/SLmake-scalapack.inc \ ./scotch/Makefile \ ./scotch/Makefile-scotch.inc \ ./scotch/Makefile.patch \ ./scotch/scotch_6.0.3.patch \ ./superlu/Makefile \ ./superlu/make.inc \ ./superludist/Makefile \ ./superludist/make-superlu.inc \ ./superludist/superludist_2.3.patch \ ./superludist/superludist_3.0-printf.patch \ ./superludist/superludist_3.0-cast_warning.patch \ ./superludist/superludist_3.0-return_values.patch \ ./superludist/superludist_3.0-operation_undefined.patch \ ./tetgen/Makefile \ ./tetgen/tetgen1.4.2.patch \ ./tetgen/patches.win64 \ ./yams/Makefile \ ./yams/freeyams.2012.02.05.patch \ ./yams/freeyams.2012.02.05-return-values.patch \ ./yams/makefile-yams.inc \ ./yams/yamslib.c \ ./yams/yamslib.h \ ./yams/yamslib_internal.h \ ipopt/Makefile \ ipopt/Makefile.inc.in \ ipopt/patch-IpBlas \ getall patch-hpddm-1 # FFCS: See [[file:../../../configure.ac::tools_problems_all_platforms]] for reasons why some tools may be deactivated # <> blacs is included in scalapack 2.0.2 MPI_SOFT = scalapack @TOOL_COMPILE_superludist@ \ @TOOL_COMPILE_mumps@ @TOOL_COMPILE_pastix@ \ @TOOL_COMPILE_hips@ @TOOL_COMPILE_parms@ LIST_SOFT = tetgen @TOOL_COMPILE_parmetis@ @TOOL_COMPILE_superlu@ fftw \ @TOOL_COMPILE_scotch@ @TOOL_COMPILE_mshmet@ \ @TOOL_COMPILE_yams@ @TOOL_COMPILE_mmg3d@ @TOOL_COMPILE_gmm@ \ @TOOL_COMPILE_nlopt@ @TOOL_COMPILE_mumps_seq@ \ @TOOL_COMPILE_ipopt@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu download/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu download/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile all-local installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ check check-am clean clean-generic clean-local cscopelist-am \ ctags ctags-am distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile all-recursive: bin lib include pkg lib: mkdir lib bin: mkdir bin include: mkdir include pkg: mkdir pkg # ALH - /download/yams and /download/mshmet need /src/libMesh/libmesh.a but /src is compiled after /download, so we # need to compile it now lib/libMesh.a:lib include cd ../src/libMesh && $(MAKE) $(AM_MAKEFLAGS) test -f ../src/libMesh/libMesh.a mkdir -p include/libMesh cp ../src/libMesh/*h include/libMesh echo libMesh LD -L@DIR@/lib -lMesh > lib/WHERE.libMesh echo libMesh INCLUDE -I@DIR@/include/libMesh >> lib/WHERE.libMesh cp ../src/libMesh/libMesh.a lib/libMesh.a all-local:bin lib include lib/libMesh.a pkg $(DOWNLOADCOMPILE) install-other install-other: tag-install-other tag-install-other: if test -n "$(TOOL_COMPILE_schwarz)" ; then $(MAKE) install-hpddm; else true; fi touch tag-install-other WHERE-OTHER: lib/WHERE.hpddm WHERE-LD: tag-compile-pkg WHERE-OTHER touch ../examples++-load/WHERE_LIBRARY-config ../examples++-load/WHERE_LIBRARY grep LD ../examples++-load/WHERE_LIBRARY ../examples++-load/WHERE_LIBRARY-config >WHERE-LD install-hpddm: if test -n "$(TOOL_COMPILE_schwarz)"; then ./getall -o hpddm -a; $(MAKE) include/hpddm-master lib/WHERE.hpddm; else true;fi reinstall-hpddm: -rm ./pkg/hpddm.zip -rm -rf include/hpddm-master -test -n "$(TOOL_COMPILE_schwarz)" && $(MAKE) install-hpddm || true include/hpddm-master:patch-hpddm-1 -if test -f ./pkg/hpddm.zip ; then cd include; unzip ../pkg/hpddm.zip ; else true; fi if `../build/ff-md5 include/hpddm-master/src/wrapper.hpp 4c8acce994d0d5ac533ed58e59dcd187` ; then patch -p1 $@ ;\ echo hpddm INCLUDE -I@DIR@/include/hpddm-master/src >> $@ ;\ else true; fi # FFCS: need to stop at the first error to make sure that all libraries are correctly compiled compile-dir: @echo "\n\n ****** $(COMPILEDIR) ****** \n\n"; @if [ 0 -eq `egrep ':$(COMPILEDIR)' WHERE-LD | wc -l` ] ;then \ cd $(COMPILEDIR) && $(MAKE) $(DIRTARGET) ; \ else \ echo $(COMPILEDIR) is in WHERE- files ;\ fi compile-pkg: tag-compile-pkg WHERE-LD # FFCS: need to stop at the first error to make sure that all libraries are correctly compiled tag-compile-pkg: bin lib include pkg FORCE @if [ -n "$(WGET)" ] ; then \ for d in $(LIST_SOFT) ; do $(MAKE) compile-dir COMPILEDIR=$$d || exit 1;done ;\ if [ -n "$(MPICC)" ] ; then \ for d in $(MPI_SOFT) ; do $(MAKE) compile-dir COMPILEDIR=$$d || exit 1; done;\ fi;fi touch tag-compile-pkg FORCE: re-install: $(MAKE) compile-pkg DIRTARGET=install WHERE: $(MAKE) compile-pkg DIRTARGET=WHERE install-exec-local: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/bin $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/include cp -rp lib $(DESTDIR)$(ff_prefix_dir) cp -rp include $(DESTDIR)$(ff_prefix_dir) cp -rp bin $(DESTDIR)$(ff_prefix_dir) clean-local: -rm -rf tag-* include lib bin -mkdir include lib bin -rm */FAIT */FAIRE # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see # [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) for d in $(LIST_SOFT) $(MPI_SOFT) ; do $(MAKE) clean -C $$d ; done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/download/metis/000755 000767 000024 00000000000 12544247066 016546 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/mmg3d/000755 000767 000024 00000000000 12544247066 016434 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/mshmet/000755 000767 000024 00000000000 12544247066 016722 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/mumps/000755 000767 000024 00000000000 12544247066 016566 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/mumps-seq/000755 000767 000024 00000000000 12544247066 017354 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/nlopt/000755 000767 000024 00000000000 12544247066 016561 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/parmetis/000755 000767 000024 00000000000 12544247066 017251 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/parms/000755 000767 000024 00000000000 12544247066 016547 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/pastix/000755 000767 000024 00000000000 12544247066 016735 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/patch-hpddm-1000644 000767 000024 00000004137 12527612217 017677 0ustar00hechtstaff000000 000000 --- a/include/hpddm-master/src/wrapper.hpp 2015-05-21 17:25:46.000000000 +0200 +++ b/include/hpddm-master/src/wrapper.hpp 2015-05-22 11:12:32.000000000 +0200 @@ -374,10 +374,6 @@ } #define HPDDM_GENERATE_MKL_VML(C, T) \ template<> \ -inline void Wrapper::diag(const int& n, const T* const d, const T* const in, T* const out) { \ - diag(n, i__1, d, in, out); \ -} \ -template<> \ inline void Wrapper::diag(const int& m, const int& n, const T* const d, \ const T* const in, T* const out) { \ if(in) \ @@ -386,7 +382,14 @@ else \ for(int i = 0; i < n; ++i) \ v ## C ## Mul(m, d, out + i * m, out + i * m); \ -} +} \ +template<> \ +inline void Wrapper::diag(const int& n, const T* const d, const T* const in, T* const out) { \ + diag(n, i__1, d, in, out); \ +} + + + HPDDM_GENERATE_MKL(s, float) HPDDM_GENERATE_MKL(d, double) HPDDM_GENERATE_MKL(c, std::complex) freefem++-3.38-1/download/scalapack/000755 000767 000024 00000000000 12544247066 017347 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/scotch/000755 000767 000024 00000000000 12544247066 016710 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/superlu/000755 000767 000024 00000000000 12544247066 017124 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/superludist/000755 000767 000024 00000000000 12544247066 020010 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/tetgen/000755 000767 000024 00000000000 12544247066 016713 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/umfpack/000755 000767 000024 00000000000 12544247066 017053 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/yams/000755 000767 000024 00000000000 12544247066 016376 5ustar00hechtstaff000000 000000 freefem++-3.38-1/download/yams/freeyams.2012.02.05-return-values.patch000644 000767 000024 00000000346 12167254041 025065 0ustar00hechtstaff000000 000000 --- freeyams.2012.02.05/sourceslib/debug.c.orig 2013-01-27 14:24:38.489115910 +0000 +++ freeyams.2012.02.05/sourceslib/debug.c 2013-01-27 14:25:24.156118592 +0000 @@ -178,7 +178,7 @@ } } } - + return 0; } freefem++-3.38-1/download/yams/freeyams.2012.02.05.patch000644 000767 000024 00000030464 12021327602 022250 0ustar00hechtstaff000000 000000 diff -ru freeyams.2011.09.23/sourceslib/blinde.c freeyams.2011.09.23-orig/sourceslib/blinde.c --- freeyams.2011.09.23/sourceslib/blinde.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/blinde.c 2011-11-16 09:59:50.000000000 +0100 @@ -36,7 +36,7 @@ ida = id[0]*10 + id[1]; /*printf("date = %d %d %d\n",iy,im,ida); */ if ( YMD(iy,im,ida) > YMD(MAX_YEAR,MAX_MONTH,MAX_DAY) ) { - fprintf(stdout," -- YAMS (LJLL), Version %s (%s)\n",VERSION,RELEASE); + fprintf(stdout," -- YAMS (LJLL), Version %s (%s)\n",YAMS_VERSION,RELEASE); fprintf(stdout," Copyright (C) LJLL, 1999-2006.\n\n"); fprintf(stdout," ## Expiration date reached. Sorry.\n"); fprintf(stdout," Please contact the author.\n"); diff -ru freeyams.2011.09.23/sourceslib/defines.h freeyams.2011.09.23-orig/sourceslib/defines.h --- freeyams.2011.09.23/sourceslib/defines.h 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/defines.h 2011-11-16 09:59:50.000000000 +0100 @@ -18,7 +18,7 @@ /* current version */ #define DEFAULT_FILE "DEFAULT.yams" #define RELEASE "oct, 2006" -#define VERSION "2.4 b" +#define YAMS_VERSION "2.4 b" #define COPYRIGHT "Copyright (C) LJLL, 1999-2006" #define REL 1 diff -ru freeyams.2011.09.23/sourceslib/extern.h freeyams.2011.09.23-orig/sourceslib/extern.h --- freeyams.2011.09.23/sourceslib/extern.h 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/extern.h 2011-11-16 09:59:50.000000000 +0100 @@ -4,6 +4,7 @@ #ifndef __YAMS +#ifndef __YAMSLIB extern Error yerr; extern Info info; extern Options opts; @@ -14,7 +15,7 @@ extern short imprim; extern ubyte ddebug; #endif - +#endif #ifdef __cplusplus } diff -ru freeyams.2011.09.23/sourceslib/inout.c freeyams.2011.09.23-orig/sourceslib/inout.c --- freeyams.2011.09.23/sourceslib/inout.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/inout.c 2011-11-16 09:59:50.000000000 +0100 @@ -581,7 +581,7 @@ ppt->tag |= M_UNUSED; ppt->flag = ppt->color = 0; } - + printf("sm->connex %d\n",sm->connex); if ( sm->connex > 0 ) { for (k=1; k<=sm->ne; k++) { pt1 = &sm->tria[k]; @@ -679,8 +679,8 @@ natv++; if ( ppt->tag & M_CORNER ) tatv++; } - if ( !gs->new ) gs->new = ++nn; - if ( !gt->new ) gt->new = ++nt; + if ( !gs->newnum ) gs->newnum = ++nn; + if ( !gt->newnum ) gt->newnum = ++nt; if ( !pt1->edg[i] && pt1->tag[i] == M_NOTAG ) continue; else if ( pt1->adj[i] && (k > pt1->adj[i]) ) continue; nedge++; @@ -864,12 +864,12 @@ nn = nbl = 0; for (k=1; k<=sm->nvmax; k++) { gs = &sm->geom[k]; - if ( gs->new > 0 ) { + if ( gs->newnum > 0 ) { iadr = nbl * 3; tabf[iadr+0] = gs->vn[0]; tabf[iadr+1] = gs->vn[1]; tabf[iadr+2] = gs->vn[2]; - gs->new = ++nn; + gs->newnum = ++nn; ++nbl; if ( nbl == NMAX ) { LM_write_field(&ms, LM_Normals, nbl, tabf); @@ -890,7 +890,7 @@ iadr = nbl * 2; gs = &sm->geom[pt1->vn[i]]; tabi[iadr+0] = ppt->tmp; - tabi[iadr+1] = gs->new; + tabi[iadr+1] = gs->newnum; ppt->flag = 1; ++nbl; if ( nbl == NMAX ) { @@ -916,7 +916,7 @@ iadr = nbl * 3; tabi[iadr+0] = nn; tabi[iadr+1] = i+1; - tabi[iadr+2] = gs->new; + tabi[iadr+2] = gs->newnum; ++nbl; if ( nbl == NMAX ) { LM_write_field(&ms, LM_NormalAtTriangleVertices, nbl, tabi); @@ -931,12 +931,12 @@ nt = nbl = 0; for (k=1; k<=sm->ntmax; k++) { gt = &sm->tgte[k]; - if ( gt->new > 0 ) { + if ( gt->newnum > 0 ) { iadr = nbl * 3; tabf[iadr+0] = gt->t[0]; tabf[iadr+1] = gt->t[1]; tabf[iadr+2] = gt->t[2]; - gt->new = ++nt; + gt->newnum = ++nt; ++nbl; if ( nbl == NMAX ) { LM_write_field(&ms, LM_Tangents, nbl, tabf); @@ -956,7 +956,7 @@ iadr = nbl * 2; gt = &sm->tgte[ppt->tge]; tabi[iadr+0] = ppt->tmp; - tabi[iadr+1] = gt->new; + tabi[iadr+1] = gt->newnum; ppt->flag = 1; ++nbl; if ( nbl == NMAX ) { @@ -1105,8 +1105,8 @@ natv++; if ( ppt->tag & M_CORNER ) tatv++; } - if ( !gs->new ) gs->new = ++nn; - if ( !gt->new ) gt->new = ++nq; + if ( !gs->newnum ) gs->newnum = ++nn; + if ( !gt->newnum ) gt->newnum = ++nq; if ( !pq1->edg[i] && pq1->tag[i] == M_NOTAG ) continue; else if ( pq1->adj[i] && (k > pq1->adj[i]) ) continue; nedge++; @@ -1263,12 +1263,12 @@ nn = nbl = 0; for (k=1; k<=sm->nvmax; k++) { gs = &sm->geom[k]; - if ( gs->new > 0 ) { + if ( gs->newnum > 0 ) { iadr = nbl * 3; tabf[iadr+0] = gs->vn[0]; tabf[iadr+1] = gs->vn[1]; tabf[iadr+2] = gs->vn[2]; - gs->new = ++nn; + gs->newnum = ++nn; ++nbl; if ( nbl == NMAX ) { LM_write_field(&ms, LM_Normals, nbl, tabf); @@ -1289,7 +1289,7 @@ iadr = nbl * 2; gs = &sm->geom[pq1->vn[i]]; tabi[iadr+0] = ppt->tmp; - tabi[iadr+1] = gs->new; + tabi[iadr+1] = gs->newnum; ppt->flag = 1; ++nbl; if ( nbl == NMAX ) { @@ -1315,7 +1315,7 @@ iadr = nbl * 3; tabi[iadr+0] = nn; tabi[iadr+1] = i+1; - tabi[iadr+2] = gs->new; + tabi[iadr+2] = gs->newnum; ++nbl; if ( nbl == NMAX ) { LM_write_field(&ms, LM_NormalAtQuadrilateralVertices, nbl, tabi); @@ -1330,12 +1330,12 @@ nq = nbl = 0; for (k=1; k<=sm->ntmax; k++) { gt = &sm->tgte[k]; - if ( gt->new > 0 ) { + if ( gt->newnum > 0 ) { iadr = nbl * 3; tabf[iadr+0] = gt->t[0]; tabf[iadr+1] = gt->t[1]; tabf[iadr+2] = gt->t[2]; - gt->new = ++nq; + gt->newnum = ++nq; ++nbl; if ( nbl == NMAX ) { LM_write_field(&ms, LM_Tangents, nbl, tabf); @@ -1355,7 +1355,7 @@ iadr = nbl * 2; gt = &sm->tgte[ppt->tge]; tabi[iadr+0] = ppt->tmp; - tabi[iadr+1] = gt->new; + tabi[iadr+1] = gt->newnum; ppt->flag = 1; ++nbl; if ( nbl == NMAX ) { @@ -1524,8 +1524,8 @@ /* adjust sizes */ if ( opts.hmin < 0.0 ) opts.hmin = max(opts.hmin,hmin); - if ( opts.hmax < 0.0 ) - opts.hmax = max(opts.hmax,hmax); + if ( opts.hmax < 0.0 ) + opts.hmax = max(opts.hmax,hmax); E_pop(); return(1); Only in freeyams.2011.09.23-orig/sourceslib: inout.c.orig diff -ru freeyams.2011.09.23/sourceslib/parsop.c freeyams.2011.09.23-orig/sourceslib/parsop.c --- freeyams.2011.09.23/sourceslib/parsop.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/parsop.c 2011-11-16 09:59:50.000000000 +0100 @@ -16,7 +16,7 @@ } /* create standard parameter file */ - fprintf(out,"# Generated by YAMS %s\n",VERSION); + fprintf(out,"# Generated by YAMS %s\n",YAMS_VERSION); fprintf(out,"# Uncomment next if absolute unit desired\n"); fprintf(out,"#Absolute\n"); Only in freeyams.2011.09.23-orig/sourceslib: parsop.c.orig diff -ru freeyams.2011.09.23/sourceslib/primsg.c freeyams.2011.09.23-orig/sourceslib/primsg.c --- freeyams.2011.09.23/sourceslib/primsg.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/primsg.c 2011-11-16 09:59:50.000000000 +0100 @@ -18,10 +18,10 @@ case 0000: if ( opts.ctrl & ISO ) fprintf(stdout,"\n %s\n MODULE YAMS-LJLL : %s\n %s\n", - STR,VERSION,STR); + STR,YAMS_VERSION,STR); else fprintf(stdout,"\n %s\n MODULE YAMS-LJLL (ANISO) : %s\n %s\n", - STR,VERSION,STR); + STR,YAMS_VERSION,STR); return; case 0001: fprintf(stdout,"\n %s\n END OF MODULE YAMS\n %s\n\n",STR,STR); diff -ru freeyams.2011.09.23/sourceslib/surf.h freeyams.2011.09.23-orig/sourceslib/surf.h --- freeyams.2011.09.23/sourceslib/surf.h 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/surf.h 2011-11-16 09:59:50.000000000 +0100 @@ -64,13 +64,13 @@ typedef struct geomsupp { float vn[3]; /* array of vertex normals */ float gap; /* local gap value */ - int new; /* pointer to new number */ + int newnum; /* pointer to new number */ } GeomSupp; typedef GeomSupp * pGeomSupp; typedef struct geomtge { float t[3]; - int new; + int newnum; } Geomtge; typedef Geomtge * pGeomtge; diff -ru freeyams.2011.09.23/sourceslib/yams.c freeyams.2011.09.23-orig/sourceslib/yams.c --- freeyams.2011.09.23/sourceslib/yams.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/yams.c 2011-11-16 09:59:50.000000000 +0100 @@ -24,6 +24,7 @@ ubyte ddebug; ubyte ecp; +long verbosity; static void excfun(int sigid) { fprintf(stdout,"\n Unexpected error:"); fflush(stdout); Only in freeyams.2011.09.23-orig/sourceslib: yams.c.orig diff -ru freeyams.2011.09.23/sourceslib/yams.h freeyams.2011.09.23-orig/sourceslib/yams.h --- freeyams.2011.09.23/sourceslib/yams.h 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/yams.h 2011-11-16 09:59:50.000000000 +0100 @@ -6,12 +6,17 @@ #include #include "chrono.h" -#include "edge.h" -#include "error.h" -#include "hash.h" -#include "stack.h" -#include "info.h" #include "memory.h" -#include "option.h" -#include "surf.h" + +//#include "edge.h" +//#include "error.h" +//#include "hash.h" +//#include "stack.h" +//#include "info.h" +//#include "memory.h" +//#include "option.h" +//#include "surf.h" + +#include "yamslib.h" +#include "yamslib_internal.h" #include "global.h" diff -ru freeyams.2011.09.23/sourceslib/yams0.c freeyams.2011.09.23-orig/sourceslib/yams0.c --- freeyams.2011.09.23/sourceslib/yams0.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/yams0.c 2011-11-16 09:59:50.000000000 +0100 @@ -24,7 +24,7 @@ if ( imprim ) { if ( ecp ) fprintf(stdout," ## Version: Ecole Centrale de Paris ##\n\n"); - fprintf(stdout," -- YAMS (LJLL) Version %s (%s)\n",VERSION,RELEASE); + fprintf(stdout," -- YAMS (LJLL) Version %s (%s)\n",YAMS_VERSION,RELEASE); fprintf(stdout," %s.\n",COPYRIGHT); fprintf(stdout," compiled: %s.\n\n",COMPIL); } diff -ru freeyams.2011.09.23/sourceslib/zaldy1.c freeyams.2011.09.23-orig/sourceslib/zaldy1.c --- freeyams.2011.09.23/sourceslib/zaldy1.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/zaldy1.c 2011-11-16 09:59:50.000000000 +0100 @@ -45,13 +45,20 @@ } } else { + int bytes = sizeof(Point) \ + + sizeof(Metric) \ + + 2 * sizeof(Triangle) \ + + 1.5 * sizeof(GeomSupp) \ + + 0.2 * sizeof(Geomtge) \ + + 3.7 * sizeof(Hashtable); + /* int bytes = sizeof(struct spoint) \ + sizeof(struct metric) \ + 2 * sizeof(struct striangle) \ + 1.5 * sizeof(struct geomsupp) \ + 0.2 * sizeof(struct geomtge) \ + 3.7 * sizeof(struct shashtab); - + */ sm->npmax = (int)((double)memory / bytes * million); sm->npmax = max(sm->npmax,npmax); sm->nemax = max(2 * sm->npmax,nemax); diff -ru freeyams.2011.09.23/sourceslib/zaldy3.c freeyams.2011.09.23-orig/sourceslib/zaldy3.c --- freeyams.2011.09.23/sourceslib/zaldy3.c 2011-11-16 11:06:08.000000000 +0100 +++ freeyams.2011.09.23-orig/sourceslib/zaldy3.c 2011-11-16 09:59:50.000000000 +0100 @@ -34,7 +34,7 @@ for (j=sm->nvmax; jgeom[j].vn[0] = sm->geom[j].vn[1] = sm->geom[j].vn[2] = 0.; sm->geom[j].gap = 1.; - sm->geom[j].new = 0; + sm->geom[j].newnum = 0; } sm->nvmax = nvsize; yerr.inderr[0] = sm->nvmax; diff -u freeyams.2012.02.05/sourceslib/outqua_a.c freeyams.2011.09.23-orig/sourceslib/outqua_a.c --- freeyams.2012.02.05/sourceslib/outqua_a.c 2009-05-13 21:00:03.000000000 +0200 +++ freeyams.2011.09.23-orig/sourceslib/outqua_a.c 2012-09-04 08:51:04.000000000 +0200 @@ -219,7 +219,7 @@ pt = &mesh->tria[iel]; fprintf(stdout," WORST ELEMENT %d (%d) %d %d %d\n",iel,ielr,pt->v[0],pt->v[1],pt->v[2]); - if ( abs(imprim) < 5 ) return; + if ( abs(imprim) < 5 ) return (1) ; fprintf(stdout,"\n HISTOGRAMM\n"); imax = min(9,(int)(10.*rapmax)); freefem++-3.38-1/download/yams/Makefile000644 000767 000024 00000006263 12500234742 020032 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ all-local: yams include ff-flags # Downloading and compiling yams # ------------------------------- # DIRPKG= ../pkg SRCDIR= ./freeyams$(yams_VERSION) #-$(yams_VERSION) PACKAGE=$(DIRPKG)/freeyams$(yams_VERSION).tgz SERVER=http://www.ann.jussieu.fr/~frey/ftp/archives/ INSTALL=../.. yams_VERSION=.2012.02.05 # ---------------------- # yamslib YAMS_DIR = $(abs_top_builddir)/download/yams/$(SRCDIR) YAMS_SRCDIRNOLIB = $(YAMS_DIR)/sources YAMS_SRCDIR = $(YAMS_DIR)/sourceslib YAMS_OBJDIR = $(YAMS_DIR)/objects yams: FAIRE # FFCS - make sure that PATCH is done sequentially otherwise its error messages are drowned into other meaningless # parallel compilation messages FAIRE: $(SRCDIR)/PATCH yamslib_internal.h yamslib.c yamslib.h ../Makefile $(MAKE) install WHERE touch FAIRE $(SRCDIR)/FAIT: $(SRCDIR)/PATCH yamslib_internal.h yamslib.c yamslib.h cp yamslib_internal.h yamslib.c yamslib.h $(YAMS_SRCDIR)/ cp makefile-yams.inc $(YAMS_DIR)/makefile cd $(YAMS_DIR); make touch $(SRCDIR)/FAIT install: $(SRCDIR)/FAIT sed s/defines.h/freeyams_defines.h/ <$(YAMS_SRCDIR)/yamslib.h >../include/freeyamslib.h cp $(YAMS_SRCDIR)/defines.h ../include/freeyams_defines.h -mkdir ../lib cp $(YAMS_OBJDIR)/libyams.a ../lib/libfreeyams.a # FFCS - WHERE is made to depend on FAIT otherwise it may be built in parallel and not be activated because FAIT is not # there yet WHERE: $(SRCDIR)/FAIT echo freeyams LD -L@DIR@/lib -lfreeyams >$(SRCDIR)/$(INSTALL)/lib/WHERE.freeyams ; echo freeyams INCLUDE -I@DIR@/include>> $(SRCDIR)/$(INSTALL)/lib/WHERE.freeyams ; $(SRCDIR)/PATCH: $(PACKAGE) -mkdir -p $(SRCDIR) cd $(SRCDIR); tar xvzf ../$(PACKAGE) -mkdir $(YAMS_SRCDIR) cp $(YAMS_SRCDIRNOLIB)/*.c $(YAMS_SRCDIRNOLIB)/*.h $(YAMS_SRCDIR) rm $(YAMS_SRCDIR)/memory.c cp $(YAMS_SRCDIRNOLIB)/compil.date $(YAMS_SRCDIR) cd $(YAMS_SRCDIR) && \ patch -p2 < ../../freeyams$(yams_VERSION).patch && \ patch -p2 < ../../freeyams$(yams_VERSION)-return-values.patch mv $(YAMS_SRCDIR)/yams.c $(YAMS_SRCDIR)/.. touch $(SRCDIR)/PATCH $(PACKAGE): ../getall -o freeYams -a # FFCS: only run make clean if cd to SRCDIR worked, otherwise this is infinite loop. clean-local: -rm FAIRE FAIT $(SRCDIR)/FAIT -cd $(YAMS_DIR) && $(MAKE) -C $(YAMS_DIR) clean -rm $(YAMS_OBJDIR)/libyams.a # FFCS -simplifying all paths clean: clean-local -rm ff-flags -rm $(SRCDIR)/$(INSTALL)/lib/libfreeyams.a -rm $(SRCDIR)/$(INSTALL)/include/*freeyams*.h -rm $(SRCDIR)/$(INSTALL)/lib/WHERE.freeyams -rm ../lib/libfreeyams.a -rm ../include/*freeyams*.h -rm ../lib/WHERE.freeyams -rm -rf $(YAMS_DIR) -rm -rf $(SRCDIR) #FH -rm $(PACKAGE) -rm FAIT FAIRE ff-flags: ../Makefile Makefile grep 'abs_top_builddir *=' ../Makefile > ff-flags grep 'CC *=' ../Makefile >> ff-flags grep 'CFLAGS *=' ../Makefile >> ff-flags grep 'LDFLAGS *=' ../Makefile >> ff-flags grep 'AR *=' ../Makefile >> ff-flags grep 'ARFLAGS *=' ../Makefile >> ff-flags grep 'RANLIB *=' ../Makefile >> ff-flags grep 'yams_VERSION *=' ./Makefile >> ff-flags grep 'WGET *=' ../Makefile >> ff-flags grep 'LIBS *=' ../Makefile >> ff-flags .PHONY: $(SRCDIR)/$(INSTALL) freefem++-3.38-1/download/yams/makefile-yams.inc000644 000767 000024 00000002521 12470666365 021622 0ustar00hechtstaff000000 000000 include ../ff-flags # working dirs YAMS2DIR =$(abs_top_builddir)/download/yams/freeyams$(yams_VERSION) EXEDIR = $(abs_top_builddir)/download/bin SRCDIR = $(YAMS2DIR)/sourceslib OBJDIR = $(YAMS2DIR)/objects ARCDIR = $(YAMS2DIR)/archives DIRDIR = $(EXEDIR) $(OBJDIR) $(ARCDIR) INCDIR = -I$(YAMS2DIR)/sourcesnew -I$(abs_top_builddir)/src/libMesh/ LDLDIR = -L$(abs_top_builddir)/download/lib -lMesh VPATH = $(SRCDIR) # objects list src = $(wildcard $(SRCDIR)/*.c) header = $(wildcard $(SRCDIR)/*.h) objs = $(patsubst $(SRCDIR)%,$(OBJDIR)%,$(src:.c=.o)) prog = yams2 lib = $(OBJDIR)/libyams.a #.SILENT: $(OBJDIR)/%.o: $(SRCDIR)/%.c $(CC) $(OPT64) $(INCDIR) $(CFLAGS) -c $< -o $@ $(EXEDIR)/$(prog):$(DIRDIR) $(objs) echo "#define COMPIL " '"' `date` '"' > $(SRCDIR)/compil.date $(CC) -c $(CFLAGS) $(INCDIR) $(SRCDIR)/yams0.c -o $(OBJDIR)/yams0.o -I../../../src/libMesh/ $(CC) -c $(CFLAGS) $(INCDIR) $(SRCDIR)/../yams.c -I$(SRCDIR) -o $(OBJDIR)/yams.o -I../../../src/libMesh/ $(AR) $(ARFLAGS) $(lib) $(objs) $(CC) $(LDFLAGS) $(OPT64) $(LDLDIR) $(OBJDIR)/yams.o -o $@ $(lib) -lm -L../../../src/libMesh/ -lMesh $(LIBS) $(RANLIB) $(lib) $(objs):$(header) $(DIRDIR): @[ -d $@ ] || mkdir $@ clean: -rm $(objs) $(EXEDIR)/$(prog) tar:$(DIRDIR) tar czf $(ARCDIR)/$(prog).`date +"%Y.%m.%d"`.tgz sources makefile target: $(EXEDIR)/$(prog)freefem++-3.38-1/download/yams/yamslib.c000644 000767 000024 00000035444 12305200035 020170 0ustar00hechtstaff000000 000000 #define __YAMSLIB #include #include #include #include #include #include "yams.h" #include "defines.h" #include "sproto.h" extern long verbosity; /* globals (see globals.h) */ Error yerr; Info info; Options opts; pHashtable hash; mytime ctim[TIMEMAX]; long nhmax,hnext,hsize; int out,idir[5] = {0,1,2,0,1},idirq[7] = {0,1,2,3,0,1,2}; short imprim; ubyte ddebug; ubyte ecp; static void yams_excfun(int sigid) { switch(sigid){ case SIGFPE: fprintf(stderr," ## FP EXCEPTION. STOP\n"); break; case SIGILL: fprintf(stderr," ## ILLEGAL INSTRUCTION. STOP\n"); break; case SIGSEGV: fprintf(stderr," ## SEGMENTATION FAULT. STOP\n"); break; case SIGABRT: case SIGTERM: case SIGINT: fprintf(stderr," ## ABNORMAL END. STOP\n"); break; } out = 0; exit(1); } static void yams_endcod() { chrono(OFF,&ctim[0]); chrono(OFF,&ctim[1]); E_dump(); if ( out <= 0 ) { prierr(WAR,8002); fprintf(stdout,"\n ELAPSED TIME %.2f SEC.\n",gttime(ctim[0])); } } static void yams_inival(){ /* initialize data */ E_put("inival"); info.dmin = (double)FLT_MAX; info.dmax = (double)FLT_MIN; info.xmin = info.ymin = info.zmin = (double)FLT_MAX; info.xmax = info.ymax = info.zmax = (double)-FLT_MAX/2.; info.nedg = info.nrid = info.ndang = 0; info.ncoi = info.nreq = info.nvus = 0; info.cc = info.flip = 0; info.nulp = info.nulf = info.nuln = 0; info.qpire = 0; info.manifold = TRUE; /* set default values for options */ opts.hmin = -2.0; opts.hmax = -2.0; opts.shock = 1.3; /* default mesh gradation */ opts.eps = 0.01; /* geometric approximation */ opts.iso = 0.0; opts.declic = 1.0 / BETAC; opts.lambda = -1.0; opts.mu = -1.0; opts.ridge = cos(RIDG*M_PI/180.); opts.geom = cos(GEOM*M_PI/180.); opts.walton = COS45DEG; /* Walton limitation */ opts.bande = -2; /* default = 1 unit */ opts.degrad = QUALCOE; /* quality degradation */ opts.ctrl = REL | ISO; opts.iter = -1; opts.check = 1; opts.alpha = sqrt(opts.eps*(2.0-opts.eps)); opts.gap = 1 - opts.eps; opts.minnp = -1; opts.alpha = sqrt(opts.eps*(2.0-opts.eps)); opts.gap = 1.0 - opts.eps; E_pop(); } void yams_printval() { if(verbosity<1) return; /* set default values for options */ printf("-- freeyams options value \n"); printf(" - hmin %f\n",opts.hmin); printf(" - hmax %f\n",opts.hmax); printf(" - kmin %f\n",opts.kmin); printf(" - kmax %f\n",opts.kmax); printf(" - eps %f\n",opts.eps); printf(" - iso %f\n",opts.iso); printf(" - alpha %f\n", opts.alpha ); printf(" - gap %f\n", opts.gap ); printf(" - degrad %f\n", opts.degrad); printf(" - ridge %f\n", opts.ridge); printf(" - geom %f\n", opts.geom); printf(" - shock %f\n",opts.shock); printf(" - bande %f\n", opts.bande ); printf(" - walton %f\n", opts.walton); printf(" - declic %f\n", opts.declic); printf(" - lambda %f\n",opts.lambda); printf(" - mu %f\n",opts.mu); printf(" - ctrl %d\n", opts.ctrl ); printf(" - iter %d\n", opts.iter ); printf(" - choix %d\n", opts.choix ); printf(" - minnp %d\n", opts.minnp ); printf(" - check %X\n", (unsigned char) opts.check); printf(" - ptmult %X\n", (unsigned char) opts.ptmult); printf(" - noreff %X\n", (unsigned char) opts.noreff); printf(" - ffem %X\n", (unsigned char) opts.ffem ); } int yams_main(pSurfMesh sm, int intopt[23], double fopt[14], int infondang, int infocc ) { hash=NULL; float declic; float ridge=RIDG; int option,absopt,ret,memory,corr; int choix; short phase; int k; /* trap exceptions */ signal(SIGABRT,yams_excfun); signal(SIGFPE,yams_excfun); signal(SIGILL,yams_excfun); signal(SIGSEGV,yams_excfun); signal(SIGTERM,yams_excfun); signal(SIGINT,yams_excfun); //atexit(yams_endcod); /* init time and calls */ tminit(ctim,TIMEMAX); chrono(ON,&ctim[0]); /* assign default values */ yerr.lerror = FALSE; yerr.coderr = 0; phase = 0; ret = TRUE; out = -1; memory = -1; imprim = -99; option = -99; choix = option; ddebug = FALSE; declic = 0.009; ecp = 0; // assigne option and surfacemesh /* setting defaults */ sm->infile = NULL; sm->outfile = NULL; sm->type = M_SMOOTH | M_QUERY | M_DETECT | M_BINARY | M_OUTPUT; yams_inival(); for (k=1; k<=sm->npfixe; k++) { pPoint ppt = &sm->point[k]; /* find extrema coordinates */ if ( ppt->c[0] < info.xmin ) info.xmin = ppt->c[0]; if ( ppt->c[0] > info.xmax ) info.xmax = ppt->c[0]; if ( ppt->c[1] < info.ymin ) info.ymin = ppt->c[1]; if ( ppt->c[1] > info.ymax ) info.ymax = ppt->c[1]; if ( ppt->c[2] < info.zmin ) info.zmin = ppt->c[2]; if ( ppt->c[2] > info.zmax ) info.zmax = ppt->c[2]; } // info nuln et nulp info.nuln = 0; for (k=1; k<=sm->nvfixe; k++) { pGeomSupp g0 = &sm->geom[ k ]; double dd = g0->vn[0]*g0->vn[0] + g0->vn[1]*g0->vn[1] + g0->vn[2]*g0->vn[2]; if ( dd < 0.0 ) info.nuln++; } info.nulp = 0; /* mark used vertices */ for (k=1; k<=sm->nefixe; k++) { pTriangle pt1 = &sm->tria[k]; int i; if ( pt1->v[0] ) for (i=0; i<3; i++) { pPoint ppt = &sm->point[pt1->v[i]]; ppt->tag &= ~M_UNUSED; } } /* count unused vertices */ for (k=1; k<=sm->npfixe; k++) { pPoint ppt; ppt = &sm->point[k]; if ( ppt->tag & M_UNUSED ) info.nulp++; } /* get decimation parameters */ opts.noreff = 0; opts.ffem = 1; opts.ptmult = 0; /* intopt : 0 !! anisotropie 1 !! ecp 2 !! extended out put file 3 !! FE correction 4 !! Formatted (ascii) output file 5 !! save metric file 6 !! msh2 7 !! Split multiple connected points 8 !! memory 9 !! connected component 10 !! vrml 11 !! imprim 12 !! nm : Create point on straight edge (no mapping) 13 !! nc : No validity check during smoothing (opt. 9) 14 !! np : Specify number of points desired 15 !! nit : Nb Iter 16 !! nq : Output quads 17 !! nr : No ridge detection 18 !! ns : No point smoothing 19 !! no : No output file 20 !! ref : Ignore face references // rajouter lors de l'ouverture du fichiers yams 21 !! absolute : opts.ctrl &= ~REL; 22 !! set optim option fopt : 0 !! iso 1 !! eps 2 // pas de valeur 3 !! opts.lambda 4 !! opts.mu 5 // pas de valeur 6 !! hgrad :: opts.shock 7 !! hmin :: opts.hmin 8 !! hmax :: opts.hmax // rajouter lors de l'ouverture du fichiers yams 9 !! tolerance :: opts.bande 10 !! degrad :: opts.degrad 11 !! declic :: opts.declic 12 !! walton :: opts.walton = cos(dummy/180.0*M_PI); 13 !! ridge :: opts.ridge */ if( intopt[0] == 1) opts.ctrl ^= ISO; opts.iso = fopt[0]; if( intopt[1] == 1 ) { ecp = 1; sm->type &= ~M_BINARY; } opts.eps = fopt[1]; if( intopt[2] == 1 ) sm->type |= M_EXTEND; if( intopt[3] == 1 ) opts.ffem = 0; if( intopt[4] == 1 ) sm->type &= ~M_BINARY; if( intopt[5] == 1 ) sm->type |= M_METRIC; if( intopt[6] == 1 ){ sm->type |= M_MSH2; sm->type &= ~M_BINARY; sm->type &= ~M_EXTEND; } if( intopt[7] == 1 ){ opts.ptmult = 1; } memory = intopt[8]; sm->connex = intopt[9]; // a initialiser -1 par dfault if( intopt[10] == 1 ){ sm->type |= M_VRML; sm->type &= ~M_BINARY; sm->type &= ~M_EXTEND; } imprim = intopt[11]; // parsar -n if( intopt[12] == 1 ) sm->type &= ~M_QUERY; if( intopt[13] == 1 ) opts.check = 0; opts.minnp = intopt[14]; opts.iter = intopt[15]; if(verbosity>9) printf(" type = %d %d \n", sm->type,intopt[17]); if( intopt[16] == 1 ) sm->type |= M_QUADS; if( intopt[17] == 1 ) sm->type &= ~M_DETECT; if( intopt[18] == 1 ) sm->type &= ~M_SMOOTH; //if( intopt[19] == 1 ) sm->type &= ~M_OUTPUT; if(verbosity>9) printf(" type = %d %d \n", sm->type,intopt[17]); sm->type &= ~M_OUTPUT; // parsar -r if( intopt[20] == 1 ) opts.noreff = 1; // parsar -l opts.lambda = fopt[3]; opts.mu = fopt[4]; // parsar -O option = intopt[22]; choix = intopt[22]; // parsar -h opts.shock = fopt[6]; opts.hmin = fopt[7]; opts.hmax = fopt[8]; // fin parsar opts.choix = option; // yams0 /* check option */ if ( (option) > 0 ) sm->type |= M_ENRICH; else memory = -1; /* if ( (abs(*choix) > 4) && !(sm->type & M_QUADS) ) sm->type &= ~M_SMOOTH; */ if ( !(opts.ctrl & ISO) && (abs(option) != 1) && (abs(option) != 6) ) opts.ctrl ^= ISO; if ( imprim ) fprintf(stdout," -- INPUT DATA\n"); chrono(ON,&ctim[5]); opts.bande = fopt[9]; opts.degrad = fopt[10]; if( intopt[21] == 1) opts.ctrl &= ~REL; // parsop check /* check parameters consistency */ ridge = fopt[13]; if ( (ridge < 0.0) || !(sm->type & M_DETECT) ) opts.ridge = -1.0; else opts.ridge = cos(ridge*M_PI / 180.0); opts.degrad = min(opts.degrad,1.0); opts.degrad = max(opts.degrad,0.001); /* bound values */ opts.alpha = sqrt(opts.eps * (2.-opts.eps)); opts.gap = 1.0 - opts.eps; if ( opts.walton < COS45DEG ) opts.walton = COS45DEG; // end assignement mesh and options //int bb = loadSol(sm,sm->infile); //sm->nmfixe = bb ? sm->npfixe : 0; absopt = abs(option); chrono(OFF,&ctim[5]); if ( imprim ) { fprintf(stdout," NUMBER OF GIVEN VERTICES %8d\n",sm->npfixe); fprintf(stdout," NUMBER OF GIVEN TRIANGLES %8d\n",sm->nefixe); fprintf(stdout," -- DATA READING COMPLETED. %.2f sec.\n", gttime(ctim[5])); if ( imprim < -4 ) priopt(choix); } if ( imprim ) yams_printval(); /* set adjacencies */ chrono(ON,&ctim[1]); chrono(ON,&ctim[2]); ret = tabvo2(sm,declic); chrono(OFF,&ctim[2]); if ( !ret ) { prierr(ERR,yerr.coderr); exit(1); } /* print surface quality */ if ( imprim ) { if ( opts.ctrl & ISO ) priqua(sm); else if ( sm->metric ) priqua_a(sm); primsg(0000); if ( abs(imprim) > 1 ) { yerr.inderr[0] = sm->npmax; yerr.inderr[1] = sm->nemax; primsg(0002); } } /* pre-processing stage */ yerr.inderr[0] = ++phase; out = 0; if ( abs(imprim) > 1 ) primsg(1000); chrono(ON,&ctim[2]); corr = sm->type & M_DETECT ? 1 : 0; if ( !setvoi(sm,corr) ) exit(1); if ( !ptmult(sm) ) exit(1); if ( absopt < 6 ) { declic = 0.038; declic = opts.ctrl & ISO ? 1e-6 : 1.e-8; if ( !sident(sm,corr) ) exit(1); if ( !delnul(sm,declic) ) exit(1); if ( !optedg(sm) ) exit(1); } if ( sm->type & M_DETECT && !sident(sm,1) ) exit(1); /* smoothing */ if ( absopt == 9 ) { if ( !noshrk(sm,opts.check) ) exit(1); //if ( !hilbert(sm) ) exit(1); //if ( !denois(sm) ) exit(1); } else { if ( opts.iter < 0 ) opts.iter = 5; if ( absopt < 5 ) { if ( !norpoi(sm,0,corr) ) exit(1); if ( !tgepoi(sm,0,corr) ) exit(1); } } chrono(OFF,&ctim[2]); yerr.inderr[0] = phase; yerr.cooerr[0] = gttime(ctim[2]); if ( abs(imprim) > 1 ) { primsg(1001); if ( imprim < -4 ) { bilan(sm); prigap(sm); } } if(verbosity>9) { printf("absopt= %d\n", absopt); printf("imprim= %d\n", imprim); printf("sm->np %d\n", sm->np); printf("sm->dim %d\n", sm->dim); } /* surface remeshing */ yerr.inderr[0] = ++phase; if ( absopt && absopt <= 6 ) { if ( abs(imprim) > 1 ) primsg(1000); chrono(ON,&ctim[4]); /* geometry enrichment */ if ( option > 0 ) { chrono(ON,&ctim[6]); if ( option == 4 ) ret = yams4(sm); else if ( option == 6 ) ret = yams6(sm); else ret = yams3(sm); chrono(OFF,&ctim[6]); if ( !ret ) exit(1); } /* surface simplification */ if ( absopt == 1 ) ret = yams1(sm); else if ( absopt == 2 ) { if ( opts.minnp < 0 ) ret = yams2(sm); else ret = yams22(sm); } else if ( absopt == 5 && sm->type & M_METRIC ) ret = calmet(sm); chrono(OFF,&ctim[4]); if ( !ret ) exit(1); yerr.inderr[0] = phase; yerr.cooerr[0] = gttime(ctim[4]); if ( abs(imprim) > 1 ) { primsg(1001); if ( imprim < -4 ) { if ( opts.ctrl & ISO ) priqua(sm); else priqua_a(sm); prilen(sm); } } } /* mesh optimization */ yerr.inderr[0] = ++phase; if ( absopt < 4 && absopt != 2 && yerr.coderr != 4000 ) { if ( abs(imprim) > 1 ) primsg(1000); chrono(ON,&ctim[3]); if ( sm->type & M_SMOOTH && yerr.coderr != 4000 ) { ret = optra4(sm,option); if ( !ret ) exit(1); } if ( absopt < 2 && opts.ffem && !optfem(sm) ) exit(1); chrono(OFF,&ctim[3]); yerr.inderr[0] = phase; yerr.cooerr[0] = gttime(ctim[3]); if ( abs(imprim) > 1 ) primsg(1001); } /* convert to quads (09-2003) */ if ( sm->type & M_QUADS ) { yerr.inderr[0] = ++phase; if ( abs(imprim) > 1 ) primsg(1000); chrono(ON,&ctim[4]); if ( !yamsq(sm) ) exit(1); yerr.inderr[0] = phase; yerr.cooerr[0] = gttime(ctim[4]); if ( abs(imprim) > 1 ) primsg(1001); } chrono(OFF,&ctim[1]); /* evaluation histograms */ if ( abs(imprim) > 1 && absopt < 10 ) { if ( sm->type & M_QUADS ) outqua_q(sm); else { if ( absopt == 1 ) prilen(sm); if ( opts.ctrl & ISO ) outqua(sm); else { outqua_a(sm); outqua1_a(sm); } if ( sm->connex && info.cc > 1 ) rchsub(sm); } } if ( abs(imprim) > 1 ) primsg(0001); /* write resulting mesh */ // pertinence freefem++ ??? J. Morice if ( sm->type & M_OUTPUT ) { chrono(ON,&ctim[5]); out = yams8(sm,sm->outfile,absopt); chrono(OFF,&ctim[5]); } else { if ( imprim ) priout(sm); out=1; } if ( imprim ) yams_printval(); /* print CPU requirements */ chrono(OFF,&ctim[0]); if ( imprim ) { if ( imprim < 0 ) primem(sm->npmax); pritim(sm,option); } if ( imprim ) yams_endcod(); M_free(hash); hash=NULL; /* check for mem leaks */ if ( imprim < 0 && M_memLeak() ) M_memDump(); #ifdef DISTRIB /* free token */ if ( !IsKeyCodeProtected(keycode) ) free_token(&token); #endif infondang = info.ndang; infocc = info.cc; return(0); } // add FH 03/14 ... void yams_free(pSurfMesh sm) { /* release allocated memory */ M_free(sm->point); M_free(sm->tria); M_free(sm->geom); M_free(sm->tgte); if ( sm->metric ) M_free(sm->metric); if ( sm->edge ) M_free(sm->edge); M_free(sm); } freefem++-3.38-1/download/yams/yamslib.h000644 000767 000024 00000012741 12305200065 020173 0ustar00hechtstaff000000 000000 #ifdef __cplusplus extern "C" { #endif /* Edge: Structure used to store specified mesh edges */ typedef struct yams_sedge { int p1,p2; int ref; int tag; } yams_Edge; typedef yams_Edge * yams_pEdge; #ifndef ERR #define ERR 1 #define WAR 2 #define MSG 3 #endif typedef struct yams_error { double cooerr[6]; int inderr[6]; int lerror; int coderr; } yams_Error; #include "defines.h" /* HashTable: hash table structure for mesh edges */ typedef struct yams_shashtab { int min; /* min(a,b) */ int nxt; /* next edge */ int elt; int ind; } yams_Hashtable; typedef yams_Hashtable * yams_pHashtable; typedef struct yams_sstack { int *t; int in,out,cur; } yams_Stack; typedef yams_Stack * yams_pStack; typedef struct yams_sinfo { double xmin,ymin,zmin,xmax,ymax,zmax; /* bounding box */ double delta; double dmin,dmax; /* edge lengths */ float qworst; int meshtype,cc,flip; long nulp,nulf,nuln; /* not used */ int qpire; int nedg,nrid,ncoi,nreq,nvus; int nafixe,nvrequis,ndang; int manifold; } yams_Info; typedef struct yams_soptions { float hmin,hmax; /* desired sizes */ float kmin,kmax; /* curvature min,max*/ float eps,iso; /* max. tolerance, isovalue */ float alpha,gap; /* max values allow.*/ float degrad; /* max degrad. qual */ float ridge; /* cosine ridge ang */ float geom; float shock; /* mesh gradation */ float bande; /* bandwidth */ float walton; /* angle limitation */ float declic; float lambda,mu; /* for smoothing */ int ctrl; /* absolute values */ int minnp; short iter,choix; unsigned char ptmult,noreff,ffem,check; } yams_Options; #ifndef ubyte typedef unsigned char ubyte; #endif /* Point: Structure that defines a vertex in a mesh. */ typedef struct yams_spoint { float c[3]; /* coordinates */ float size; /* calculated size */ int tge; /* tangent at ridge */ short color; int ref; int tmp; ubyte tag; /* vertex type */ ubyte geom; ubyte flag; } yams_Point; typedef yams_Point * yams_pPoint; /* Triangle: Structure that defines a triangle in a mesh. */ typedef struct yams_striangle { float n[3]; /* face normal */ float dish; /* distance to surface */ float qual; /* triangle quality */ int v[3]; /* array of vertex indices */ int adj[3]; /* array of adjacent trias */ int vn[3]; /* array of vertex normals */ int edg[3]; int nxt; int ref; short cc; ubyte voy[3]; /* array of voyeur vertices */ ubyte flag1; ubyte tag[3]; /* array of edge classes */ ubyte flag2; } yams_Triangle; typedef yams_Triangle * yams_pTriangle; typedef struct yams_squad { float qual; float n[3]; int v[4]; int adj[4]; int ref,edg[4],vn[4]; short cc; ubyte flag1,flag2; ubyte voy[4]; ubyte tag[4]; } yams_Quad; typedef yams_Quad * yams_pQuad; typedef struct { int v[4]; int ref; } yams_Tetra; typedef yams_Tetra * yams_pTetra; typedef struct yams_geomsupp { float vn[3]; /* array of vertex normals */ float gap; /* local gap value */ int newnum; /* pointer to new number */ } yams_GeomSupp; typedef yams_GeomSupp * yams_pGeomSupp; typedef struct yams_geomtge { float t[3]; int newnum; } yams_Geomtge; typedef yams_Geomtge * yams_pGeomtge; typedef struct yams_metric { float k1,k2; float m[6]; /* anisotropic metric */ } yams_Metric; typedef yams_Metric * yams_pMetric; /* SurfMesh: Structure that defines a mesh. */ typedef struct yams_smesh { int dim; /* mesh dimension (2,3) */ int type; int connex; /* # connected component */ int np,npfixe,npmax; /* number of vertices */ int ne,nefixe,nemax; /* number of triangles */ int nq,ntet; /* quads, ntets */ int nv,nvfixe,nvmax; /* number of vertex normals */ int nafixe,nmfixe; int nt,ntfixe,ntmax; /* vertex tgtes */ int mark; /* coloring... */ int ipil; char *infile; char *outfile; yams_pPoint point; /* array of vertices */ yams_pTriangle tria; /* array of triangles */ yams_pTetra tetra; yams_pQuad quad; yams_pGeomSupp geom; /* pointer to geometric info */ yams_pGeomtge tgte; /* pointer to tge at ridge */ yams_pMetric metric; /* local metric at vertex */ yams_pEdge edge; } yams_SurfMesh; typedef yams_SurfMesh * yams_pSurfMesh; #ifdef __cplusplus namespace yams{ #endif int yams_main(yams_pSurfMesh sm, int intopt[23], double fopt[14], int infondang, int infocc ); int zaldy1(int nemax,int npmax,int nvmax,int memory,yams_pSurfMesh sm,int choix); int zaldy2(int npmax); int zaldy3(yams_pSurfMesh ,int code); void yams_free(yams_pSurfMesh sm); // Add FH 03/14 #ifdef __cplusplus } #endif #ifdef __cplusplus } #endif freefem++-3.38-1/download/yams/yamslib_internal.h000644 000767 000024 00000002266 11406142255 022077 0ustar00hechtstaff000000 000000 /* typedef struct yams_sedge sedge; typedef struct yams_error error; typedef struct yams_shashtable shashtable; typedef struct yams_sstack sstack; typedef struct yams_sinfo sinfo; typedef struct yams_soptions soptions; typedef struct yams_spoint spoint; typedef struct yams_striangle striangle; typedef struct yams_squad squad; typedef struct yams_geomtge geomtge; typedef struct yams_geomsupp geomsupp; typedef struct yams_metric metric; typedef struct yams_smesh smesh; */ typedef yams_Edge Edge; typedef yams_Error Error; typedef yams_Hashtable Hashtable; typedef yams_Stack Stack; typedef yams_Info Info; typedef yams_Options Options; typedef yams_Point Point; typedef yams_Triangle Triangle; typedef yams_Quad Quad; typedef yams_Tetra Tetra; typedef yams_Geomtge Geomtge; typedef yams_GeomSupp GeomSupp; typedef yams_Metric Metric; typedef yams_SurfMesh SurfMesh; typedef yams_pEdge pEdge; typedef yams_pHashtable pHashtable; typedef yams_pStack pStack; typedef yams_pPoint pPoint; typedef yams_pTriangle pTriangle; typedef yams_pQuad pQuad; typedef yams_pTetra pTetra; typedef yams_pGeomtge pGeomtge; typedef yams_pGeomSupp pGeomSupp; typedef yams_pMetric pMetric; typedef yams_pSurfMesh pSurfMesh; freefem++-3.38-1/download/umfpack/Makefile.am000644 000767 000024 00000015337 12533551303 021106 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries for Umfpack # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Downloading and compiling extra libraries for Umfpack" default=0 freefem make multipleauthors start=04/06/04 upmc # see [[file:../../configure.ac::DOWNLOAD_UMFPACK]] all-local: $(DOWNLOAD_UMFPACK) EXTRA_DIST= SuiteSparse_config.mk.in # Downloading and compiling UMFPACK # --------------------------------- DIRPKG=../pkg SUITESPARSE_TGZ=$(DIRPKG)/SuiteSparse-4.4.4.tar.gz UMFPACKLIB=../lib/libumfpack.a AMDLIB=../lib/libamd.a CAMDLIB=../lib/libcamd.a CHOLMODLIB=../lib/libcholmod.a COLAMDLIB=../lib/libcolamd.a SUITESPARSECONFIGLIB=../lib/libsuitesparseconfig.a # ALH - 4/9/13 - parallel make crashes ("pipe from processes is a directory"?). make sure that everything is run # sequentially umfpack: $(MAKE) MAKEFLAGS= $(AMDLIB) $(MAKE) MAKEFLAGS= $(UMFPACKLIB) $(MAKE) MAKEFLAGS= $(SUITESPARSECONFIGLIB) # # ALH - 19/9/13 - cholmod part built sequentially # $(MAKE) MAKEFLAGS= $(CAMDLIB) $(MAKE) MAKEFLAGS= $(COLAMDLIB) $(MAKE) MAKEFLAGS= $(AMDLIB) $(MAKE) MAKEFLAGS= $(CHOLMODLIB) $(MAKE) MAKEFLAGS= $(SUITESPARSECONFIGLIB) # FFCS: SuiteSparse/*/Source are not able to compile in parallel from scratch ("pipe from processes is a # directory"?). But specifying "make -j 1" is not enough (another error pops up). Use "$(MAKE) MAKEFLAGS=" instead # (using "make MAKEFLAGS=" still produces an error on Cygwin). $(SUITESPARSECONFIGLIB): SuiteSparse/FF cd SuiteSparse/SuiteSparse_config && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/SuiteSparse_config/SuiteSparse_config.h ../include cp SuiteSparse/SuiteSparse_config/libsuitesparseconfig.a ../lib/libsuitesparseconfig.a $(RANLIB) ../lib/libsuitesparseconfig.a $(UMFPACKLIB): SuiteSparse/FF cd SuiteSparse/UMFPACK/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/UMFPACK/Include/*.h ../include cp -f SuiteSparse/SuiteSparse_config/SuiteSparse_config.h ../include cp SuiteSparse/UMFPACK/Lib/libumfpack.a ../lib/libumfpack.a $(RANLIB) ../lib/libumfpack.a $(AMDLIB): SuiteSparse/FF cd SuiteSparse/AMD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/AMD/Include/*.h ../include cp SuiteSparse/AMD/Lib/libamd.a ../lib/libamd.a $(RANLIB) ../lib/libamd.a $(CAMDLIB): SuiteSparse/FF cd SuiteSparse/CAMD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/CAMD/Include/*.h ../include cp SuiteSparse/CAMD/Lib/libcamd.a ../lib/libcamd.a $(RANLIB) ../lib/libcamd.a $(CHOLMODLIB): SuiteSparse/FF cd SuiteSparse/CHOLMOD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/CHOLMOD/Include/*.h ../include cp SuiteSparse/CHOLMOD/Lib/libcholmod.a ../lib/libcholmod.a $(RANLIB) ../lib/libcholmod.a $(COLAMDLIB): SuiteSparse/FF cd SuiteSparse/COLAMD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/COLAMD/Include/*.h ../include cp SuiteSparse/COLAMD/Lib/libcolamd.a ../lib/libcolamd.a $(RANLIB) ../lib/libcolamd.a UMFPACKv4.4: tar xzf UMFPACKv4.4.tar.gz # The 'lib' goal is replaced with 'libb' to avoid problems with the existing 'Lib' subdirectory on case-insensitive file # systems the lib depend of the Makefile to force the reconstruction if the parameter change UMFPACKv4.4/AMD/Makefile2 UMFPACKv4.4/UMFPACK/Makefile2: UMFPACKv4.4 sed 's/lib:/libb:/' < UMFPACKv4.4/UMFPACK/`basename $@ 2` >$@ SuiteSparse/DATE:$(SUITESPARSE_TGZ) tar zxvf $(SUITESPARSE_TGZ) touch SuiteSparse/DATE SuiteSparse/FF:SuiteSparse/DATE SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk touch SuiteSparse/FF SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk:SuiteSparse/DATE Makefile SuiteSparse_config.mk.in ../../config.status --file="SuiteSparse_config.mk:SuiteSparse_config.mk.in" -if diff SuiteSparse_config.mk SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk 2>&1 >/dev/null; then \ echo " same flags => no recompilation ! " ; \ else \ echo " recompile umfpack (some flags change) => clean umfpack colmod amd " ;\ mkdir -p SuiteSparse/SuiteSparse_config ;\ cp SuiteSparse_config.mk SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk ; \ (cd SuiteSparse/UMFPACK && make clean); \ (cd SuiteSparse/CHOLMOD && make clean); \ (cd SuiteSparse/COLAMD && make clean); \ (cd SuiteSparse/CAMD && make clean); \ (cd SuiteSparse/CAMD && make clean); \ (cd SuiteSparse/AMD && make clean); \ find . -name '*.exe'|xargs rm; \ fi; touch SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk UMFPACK_Make.m4: Makefile UMFPACKv4.4 m4 -DFF_CC="$(CC)" \ -DFF_CFLAGS="@CPPFLAGS@ @CFLAGS@ @BLASINC@" \ -DFF_LIB="@BLASLIB@ @LIBS@" \ -DFF_CONFIG="@FF_UMFPACK_CONFIG@" \ UMFPACK_Make.m4 >Make.include -if diff Make.include UMFPACKv4.4/UMFPACK/Make/Make.include 2>&1 >/dev/null; then \ echo " same flags => no recompilation ! " ; \ else \ echo " recompile umfpack (some flags change) => clean umfpack" ;\ cp Make.include UMFPACKv4.4/UMFPACK/Make/Make.include; \ cd UMFPACKv4.4/UMFPACK && make clean; \ find . -name '*.exe'|xargs rm; \ fi; UMFPACKv4.4.tar.gz: @WGET@ -N http://www.cise.ufl.edu/research/sparse/umfpack/v4.4/UMFPACKv4.4.tar.gz $(SUITESPARSE_TGZ): ../getall -o SuiteSparse -a clean-local: -rm $(AMDLIB) $(CAMDLIB) $(CHOLMODLIB) $(COLAMDLIB) $(SUITESPARSECONFIGLIB) -rm ../include/amd*.h -rm ../include/umfpack*.h -rm ../include/colmod*.h -rm ../include/camd*.h -rm ../include/amd*.h -rm ../include/SuiteSparse_config.h -rm -rf UMFPACKv4.?.tar.gz UMFPACKv4.? -rm SuiteSparse*gz -rm -rf SuiteSparse # -rm ../pkg/SuiteSparse-* -rm SuiteSparse_config.mk # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/umfpack/Makefile.in000644 000767 000024 00000056341 12543260337 021124 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Downloading and compiling extra libraries for Umfpack # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Downloading and compiling extra libraries for Umfpack" default=0 freefem make multipleauthors start=04/06/04 upmc VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = download/umfpack ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = SuiteSparse_config.mk.in # Downloading and compiling UMFPACK # --------------------------------- DIRPKG = ../pkg SUITESPARSE_TGZ = $(DIRPKG)/SuiteSparse-4.4.4.tar.gz UMFPACKLIB = ../lib/libumfpack.a AMDLIB = ../lib/libamd.a CAMDLIB = ../lib/libcamd.a CHOLMODLIB = ../lib/libcholmod.a COLAMDLIB = ../lib/libcolamd.a SUITESPARSECONFIGLIB = ../lib/libsuitesparseconfig.a all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu download/umfpack/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu download/umfpack/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # see [[file:../../configure.ac::DOWNLOAD_UMFPACK]] all-local: $(DOWNLOAD_UMFPACK) # ALH - 4/9/13 - parallel make crashes ("pipe from processes is a directory"?). make sure that everything is run # sequentially umfpack: $(MAKE) MAKEFLAGS= $(AMDLIB) $(MAKE) MAKEFLAGS= $(UMFPACKLIB) $(MAKE) MAKEFLAGS= $(SUITESPARSECONFIGLIB) # # ALH - 19/9/13 - cholmod part built sequentially # $(MAKE) MAKEFLAGS= $(CAMDLIB) $(MAKE) MAKEFLAGS= $(COLAMDLIB) $(MAKE) MAKEFLAGS= $(AMDLIB) $(MAKE) MAKEFLAGS= $(CHOLMODLIB) $(MAKE) MAKEFLAGS= $(SUITESPARSECONFIGLIB) # FFCS: SuiteSparse/*/Source are not able to compile in parallel from scratch ("pipe from processes is a # directory"?). But specifying "make -j 1" is not enough (another error pops up). Use "$(MAKE) MAKEFLAGS=" instead # (using "make MAKEFLAGS=" still produces an error on Cygwin). $(SUITESPARSECONFIGLIB): SuiteSparse/FF cd SuiteSparse/SuiteSparse_config && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/SuiteSparse_config/SuiteSparse_config.h ../include cp SuiteSparse/SuiteSparse_config/libsuitesparseconfig.a ../lib/libsuitesparseconfig.a $(RANLIB) ../lib/libsuitesparseconfig.a $(UMFPACKLIB): SuiteSparse/FF cd SuiteSparse/UMFPACK/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/UMFPACK/Include/*.h ../include cp -f SuiteSparse/SuiteSparse_config/SuiteSparse_config.h ../include cp SuiteSparse/UMFPACK/Lib/libumfpack.a ../lib/libumfpack.a $(RANLIB) ../lib/libumfpack.a $(AMDLIB): SuiteSparse/FF cd SuiteSparse/AMD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/AMD/Include/*.h ../include cp SuiteSparse/AMD/Lib/libamd.a ../lib/libamd.a $(RANLIB) ../lib/libamd.a $(CAMDLIB): SuiteSparse/FF cd SuiteSparse/CAMD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/CAMD/Include/*.h ../include cp SuiteSparse/CAMD/Lib/libcamd.a ../lib/libcamd.a $(RANLIB) ../lib/libcamd.a $(CHOLMODLIB): SuiteSparse/FF cd SuiteSparse/CHOLMOD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/CHOLMOD/Include/*.h ../include cp SuiteSparse/CHOLMOD/Lib/libcholmod.a ../lib/libcholmod.a $(RANLIB) ../lib/libcholmod.a $(COLAMDLIB): SuiteSparse/FF cd SuiteSparse/COLAMD/Lib && $(MAKE) MAKEFLAGS= mkdir -p ../include ../lib cp -f SuiteSparse/COLAMD/Include/*.h ../include cp SuiteSparse/COLAMD/Lib/libcolamd.a ../lib/libcolamd.a $(RANLIB) ../lib/libcolamd.a UMFPACKv4.4: tar xzf UMFPACKv4.4.tar.gz # The 'lib' goal is replaced with 'libb' to avoid problems with the existing 'Lib' subdirectory on case-insensitive file # systems the lib depend of the Makefile to force the reconstruction if the parameter change UMFPACKv4.4/AMD/Makefile2 UMFPACKv4.4/UMFPACK/Makefile2: UMFPACKv4.4 sed 's/lib:/libb:/' < UMFPACKv4.4/UMFPACK/`basename $@ 2` >$@ SuiteSparse/DATE:$(SUITESPARSE_TGZ) tar zxvf $(SUITESPARSE_TGZ) touch SuiteSparse/DATE SuiteSparse/FF:SuiteSparse/DATE SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk touch SuiteSparse/FF SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk:SuiteSparse/DATE Makefile SuiteSparse_config.mk.in ../../config.status --file="SuiteSparse_config.mk:SuiteSparse_config.mk.in" -if diff SuiteSparse_config.mk SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk 2>&1 >/dev/null; then \ echo " same flags => no recompilation ! " ; \ else \ echo " recompile umfpack (some flags change) => clean umfpack colmod amd " ;\ mkdir -p SuiteSparse/SuiteSparse_config ;\ cp SuiteSparse_config.mk SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk ; \ (cd SuiteSparse/UMFPACK && make clean); \ (cd SuiteSparse/CHOLMOD && make clean); \ (cd SuiteSparse/COLAMD && make clean); \ (cd SuiteSparse/CAMD && make clean); \ (cd SuiteSparse/CAMD && make clean); \ (cd SuiteSparse/AMD && make clean); \ find . -name '*.exe'|xargs rm; \ fi; touch SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk UMFPACK_Make.m4: Makefile UMFPACKv4.4 m4 -DFF_CC="$(CC)" \ -DFF_CFLAGS="@CPPFLAGS@ @CFLAGS@ @BLASINC@" \ -DFF_LIB="@BLASLIB@ @LIBS@" \ -DFF_CONFIG="@FF_UMFPACK_CONFIG@" \ UMFPACK_Make.m4 >Make.include -if diff Make.include UMFPACKv4.4/UMFPACK/Make/Make.include 2>&1 >/dev/null; then \ echo " same flags => no recompilation ! " ; \ else \ echo " recompile umfpack (some flags change) => clean umfpack" ;\ cp Make.include UMFPACKv4.4/UMFPACK/Make/Make.include; \ cd UMFPACKv4.4/UMFPACK && make clean; \ find . -name '*.exe'|xargs rm; \ fi; UMFPACKv4.4.tar.gz: @WGET@ -N http://www.cise.ufl.edu/research/sparse/umfpack/v4.4/UMFPACKv4.4.tar.gz $(SUITESPARSE_TGZ): ../getall -o SuiteSparse -a clean-local: -rm $(AMDLIB) $(CAMDLIB) $(CHOLMODLIB) $(COLAMDLIB) $(SUITESPARSECONFIGLIB) -rm ../include/amd*.h -rm ../include/umfpack*.h -rm ../include/colmod*.h -rm ../include/camd*.h -rm ../include/amd*.h -rm ../include/SuiteSparse_config.h -rm -rf UMFPACKv4.?.tar.gz UMFPACKv4.? -rm SuiteSparse*gz -rm -rf SuiteSparse # -rm ../pkg/SuiteSparse-* -rm SuiteSparse_config.mk # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/download/umfpack/SuiteSparse_config.mk.in000644 000767 000024 00000034701 12115427416 023603 0ustar00hechtstaff000000 000000 #=============================================================================== # SuiteSparse_config.mk: common configuration file for the SuiteSparse #=============================================================================== # This file contains all configuration settings for all packages authored or # co-authored by Tim Davis: # # Package Version Description # ------- ------- ----------- # AMD 1.2 or later approximate minimum degree ordering # COLAMD 2.4 or later column approximate minimum degree ordering # CCOLAMD 1.0 or later constrained column approximate minimum degree ordering # CAMD any constrained approximate minimum degree ordering # UMFPACK 4.5 or later sparse LU factorization, with the BLAS # CHOLMOD any sparse Cholesky factorization, update/downdate # KLU 0.8 or later sparse LU factorization, BLAS-free # BTF 0.8 or later permutation to block triangular form # LDL 1.2 or later concise sparse LDL' # CXSparse any extended version of CSparse (int/long, real/complex) # SuiteSparseQR any sparse QR factorization # RBio 2.0 or later read/write sparse matrices in Rutherford-Boeing format # # By design, this file is NOT included in the CSparse makefile. # That package is fully stand-alone. CSparse is primarily for teaching; # production code should use CXSparse. # # The SuiteSparse_config directory and the above packages should all appear in # a single directory, in order for the Makefile's within each package to find # this file. # # To enable an option of the form "# OPTION = ...", edit this file and # delete the "#" in the first column of the option you wish to use. # # The use of METIS 4.0.1 is optional. To exclude METIS, you must compile with # CHOLMOD_CONFIG set to -DNPARTITION. See below for details. However, if you # do not have a metis-4.0 directory inside the SuiteSparse directory, the # */Makefile's that optionally rely on METIS will automatically detect this # and compile without METIS. #------------------------------------------------------------------------------ # Generic configuration #------------------------------------------------------------------------------ # Using standard definitions from the make environment, typically: # # CC cc C compiler # CXX g++ C++ compiler # CFLAGS [ ] flags for C and C++ compiler # CPPFLAGS [ ] flags for C and C++ compiler # TARGET_ARCH [ ] target architecture # FFLAGS [ ] flags for Fortran compiler # RM rm -f delete a file # AR ar create a static *.a library archive # ARFLAGS rv flags for ar # MAKE make make itself (sometimes called gmake) # # You can redefine them here, but by default they are used from the # default make environment. # C and C++ compiler flags. The first three are standard for *.c and *.cpp # Add -DNTIMER if you do use any timing routines (otherwise -lrt is required). # CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER # ranlib, and ar, for generating libraries. If you don't need ranlib, # just change it to RANLAB = echo AR = @AR@ RANLIB = @RANLIB@ ARFLAGS =@ARFLAGS@ ARCHIVE = $(AR) $(ARFLAGS) # copy and delete a file CP = cp -f MV = mv -f # Fortran compiler (not required for 'make' or 'make library') F77 = gfortran F77FLAGS = $(FFLAGS) -O F77LIB = # C and Fortran libraries. Remove -lrt if you don't have it. LIB = -lm # Using the following requires CF = ... -DNTIMER on POSIX C systems. # LIB = -lm # For "make install" INSTALL_LIB = @abs_srcdir@/../lib INSTALL_INCLUDE = @abs_srcdir@/../include # Which version of MAKE you are using (default is "make") # MAKE = make # MAKE = gmake #------------------------------------------------------------------------------ # BLAS and LAPACK configuration: #------------------------------------------------------------------------------ # UMFPACK and CHOLMOD both require the BLAS. CHOLMOD also requires LAPACK. # See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or # http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD. # LAPACK is at http://www.netlib.org/lapack/ . You can use the standard # Fortran LAPACK along with Goto's BLAS to obtain very good performance. # CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz # Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops # on a 2.5Ghz dual-core AMD Opteron. # These settings will probably not work, since there is no fixed convention for # naming the BLAS and LAPACK library (*.a or *.so) files. # This is probably slow ... it might connect to the Standard Reference BLAS: BLAS = @BLASLIBS@ LAPACK = @LAPACKLIBS@ # NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto" # statement. Rather, the Goto BLAS is written by Dr. Kazushige Goto. # Using the Goto BLAS: # BLAS = -lgoto -lgfortran -lgfortranbegin # BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread # Using non-optimized versions: # BLAS = -lblas_plain -lgfortran -lgfortranbegin # LAPACK = -llapack_plain # BLAS = -lblas_plain -lgfortran -lgfortranbegin # LAPACK = -llapack # The BLAS might not contain xerbla, an error-handling routine for LAPACK and # the BLAS. Also, the standard xerbla requires the Fortran I/O library, and # stops the application program if an error occurs. A C version of xerbla # distributed with this software (SuiteSparse_config/xerbla/libcerbla.a) # includes a Fortran-callable xerbla routine that prints nothing and does not # stop the application program. This is optional. # XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a # If you wish to use the XERBLA in LAPACK and/or the BLAS instead, # use this option: XERBLA = # If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead, # use this: # XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a #------------------------------------------------------------------------------ # GPU configuration for CHOLMOD, using the CUDA BLAS #------------------------------------------------------------------------------ # no cuda GPU_BLAS_PATH = GPU_CONFIG = # with cuda BLAS acceleration for CHOLMOD # GPU_BLAS_PATH=/usr/local/cuda # GPU_CONFIG=-DGPU_BLAS -I$(GPU_BLAS_PATH)/include #------------------------------------------------------------------------------ # METIS, optionally used by CHOLMOD #------------------------------------------------------------------------------ # If you do not have METIS, or do not wish to use it in CHOLMOD, you must # compile CHOLMOD with the -DNPARTITION flag. # The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc. # You may wish to use an absolute path. METIS is optional. Compile # CHOLMOD with -DNPARTITION if you do not wish to use METIS. METIS_PATH = ../../metis-4.0 METIS = ../../metis-4.0/libmetis.a #------------------------------------------------------------------------------ # UMFPACK configuration: #------------------------------------------------------------------------------ # Configuration flags for UMFPACK. See UMFPACK/Source/umf_config.h for details. # # -DNBLAS do not use the BLAS. UMFPACK will be very slow. # -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by # LAPACK and the BLAS (defaults to 'int') # -DNSUNPERF do not use the Sun Perf. Library (default is use it on Solaris) # -DNRECIPROCAL do not multiply by the reciprocal # -DNO_DIVIDE_BY_ZERO do not divide by zero # -DNCHOLMOD do not use CHOLMOD as a ordering method. If -DNCHOLMOD is # included in UMFPACK_CONFIG, then UMFPACK does not rely on # CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS. UMFPACK_CONFIG = # uncomment this line to compile UMFPACK without CHOLMOD: # UMFPACK_CONFIG = -DNCHOLMOD #------------------------------------------------------------------------------ # CHOLMOD configuration #------------------------------------------------------------------------------ # CHOLMOD Library Modules, which appear in libcholmod.a: # Core requires: none # Check requires: Core # Cholesky requires: Core, AMD, COLAMD. optional: Partition, Supernodal # MatrixOps requires: Core # Modify requires: Core # Partition requires: Core, CCOLAMD, METIS. optional: Cholesky # Supernodal requires: Core, BLAS, LAPACK # # CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a): # Tcov requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal # optional: Partition # Valgrind same as Tcov # Demo requires: Core, Check, Cholesky, MatrixOps, Supernodal # optional: Partition # # Configuration flags: # -DNCHECK do not include the Check module. License GNU LGPL # -DNCHOLESKY do not include the Cholesky module. License GNU LGPL # -DNPARTITION do not include the Partition module. License GNU LGPL # also do not include METIS. # -DNGPL do not include any GNU GPL Modules in the CHOLMOD library: # -DNMATRIXOPS do not include the MatrixOps module. License GNU GPL # -DNMODIFY do not include the Modify module. License GNU GPL # -DNSUPERNODAL do not include the Supernodal module. License GNU GPL # # -DNPRINT do not print anything. # -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by # LAPACK and the BLAS (defaults to 'int') # -DNSUNPERF for Solaris only. If defined, do not use the Sun # Performance Library CHOLMOD_CONFIG = -DNPARTITION -DNGPL $(GPU_CONFIG) # uncomment this line to compile CHOLMOD without METIS: # CHOLMOD_CONFIG = -DNPARTITION #------------------------------------------------------------------------------ # SuiteSparseQR configuration: #------------------------------------------------------------------------------ # The SuiteSparseQR library can be compiled with the following options: # # -DNPARTITION do not include the CHOLMOD partition module # -DNEXPERT do not include the functions in SuiteSparseQR_expert.cpp # -DHAVE_TBB enable the use of Intel's Threading Building Blocks (TBB) # default, without timing, without TBB: SPQR_CONFIG = # with TBB: # SPQR_CONFIG = -DHAVE_TBB # This is needed for IBM AIX: (but not for and C codes, just C++) # SPQR_CONFIG = -DBLAS_NO_UNDERSCORE # with TBB, you must select this: # TBB = -ltbb # without TBB: TBB = #------------------------------------------------------------------------------ # Linux #------------------------------------------------------------------------------ # Using default compilers: CC = @CC@ CFLAGS = @CFLAGS@ # CF = $(CFLAGS) -O3 -fexceptions # alternatives: # CF = $(CFLAGS) -g -fexceptions \ -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \ -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \ -funit-at-a-time # CF = $(CFLAGS) -O3 -fexceptions \ -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \ -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi # CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE # CF = $(CFLAGS) -O3 # CF = $(CFLAGS) -O3 -g -fexceptions # CF = $(CFLAGS) -g -fexceptions \ -Wall -W -Wshadow \ -Wredundant-decls -Wdisabled-optimization -ansi # consider: # -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering # -frename-registers -ffast-math -funroll-loops # Using the Goto BLAS: # BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread # Using Intel's icc and ifort compilers: # (does not work for mexFunctions unless you add a mexopts.sh file) # F77 = ifort # CC = icc # CF = $(CFLAGS) -O3 -xN -vec_report=0 # CF = $(CFLAGS) -g # 64bit: # F77FLAGS = -O -m64 # CF = $(CFLAGS) -O3 -fexceptions -m64 # BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA) # LAPACK = -llapack64 # SUSE Linux 10.1, AMD Opteron, with GOTO Blas # F77 = gfortran # BLAS = -lgoto_opteron64 -lgfortran # SUSE Linux 10.1, Intel Pentium, with GOTO Blas # F77 = gfortran # BLAS = -lgoto -lgfortran #------------------------------------------------------------------------------ # Mac #------------------------------------------------------------------------------ # As recommended by macports, http://suitesparse.darwinports.com/ # I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard), # on my MacBook Air, and they work fine. # F77 = gfortran # CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER # BLAS = -framework Accelerate # LAPACK = -framework Accelerate # LIB = -lm #------------------------------------------------------------------------------ # Solaris #------------------------------------------------------------------------------ # 32-bit # CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32 # 64-bit # CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc # FFLAGS = -fast -KPIC -dalign -xlibmil -m64 # The Sun Performance Library includes both LAPACK and the BLAS: # BLAS = -xlic_lib=sunperf # LAPACK = #------------------------------------------------------------------------------ # Compaq Alpha #------------------------------------------------------------------------------ # 64-bit mode only # CF = $(CFLAGS) -O2 -std1 # BLAS = -ldxml # LAPACK = #------------------------------------------------------------------------------ # IBM RS 6000 #------------------------------------------------------------------------------ # BLAS = -lessl # LAPACK = # 32-bit mode: # CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto # F77FLAGS = -O4 -qipa -qmaxmem=16384 # 64-bit mode: # CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto # F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64 #------------------------------------------------------------------------------ # SGI IRIX #------------------------------------------------------------------------------ # BLAS = -lscsl # LAPACK = # 32-bit mode # CF = $(CFLAGS) -O # 64-bit mode (32 bit int's and 64-bit long's): # CF = $(CFLAGS) -64 # F77FLAGS = -64 # SGI doesn't have ranlib # RANLIB = echo #------------------------------------------------------------------------------ # AMD Opteron (64 bit) #------------------------------------------------------------------------------ # BLAS = -lgoto_opteron64 -lg2c # LAPACK = -llapack_opteron64 # SUSE Linux 10.1, AMD Opteron # F77 = gfortran # BLAS = -lgoto_opteron64 -lgfortran # LAPACK = -llapack_opteron64 #------------------------------------------------------------------------------ # remove object files and profile output #------------------------------------------------------------------------------ CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno freefem++-3.38-1/download/tetgen/Makefile000755 000767 000024 00000004637 12500134760 020354 0ustar00hechtstaff000000 000000 # and compiling extra libraries # ----------------------------------------- include cxxflags all-local: tetgen # Downloading and compiling Tetgen # ------------------------------ # Tetgen information DIRPKG=../pkg tetgen_VERSION=1.4.3 SRCDIR=tetgen$(tetgen_VERSION) PACKAGE=$(DIRPKG)/tetgen$(tetgen_VERSION).tar.gz # FFCS - 6/11/12 - curl is not able to follow redirections from http://tetgen.org/files SERVER=http://wias-berlin.de/software/tetgen/files INSTALL=../.. tetgen: FAIRE FAIRE:install.done $(SRCDIR)/FAIT cxxflags WHERE.done touch FAIRE # ALH - FFCS - 18/12/8 - need '-fPIC' on Linux64 because the .a will be used in a .so (by examples++-load/tetgen.cpp). # FFCS - 30/11/10 - need ranlib on Win64. The PATH is setup so that mingw/ranlib is called $(SRCDIR)/FAIT: $(SRCDIR)/tags cxxflags cd $(SRCDIR);$(CXX) $(CXXFLAGS) -fPIC -DSELF_CHECK -DNDEBUG -DTETLIBRARY -c tetgen.cxx cd $(SRCDIR);$(CXX) $(CXXFLAGS) -fPIC -DSELF_CHECK -DNDEBUG -DTETLIBRARY -c predicates.cxx touch $(SRCDIR)/FAIT WHERE.done: $(SRCDIR)/FAIT echo tetgen LD -L@DIR@/lib -ltet >$(SRCDIR)/$(INSTALL)/lib/WHERE.tetgen echo tetgen INCLUDE -I@DIR@/include >> $(SRCDIR)/$(INSTALL)/lib/WHERE.tetgen touch $@ clean-local:: -rm WHERE.done # FFCS - avoid remaking install every time install.done:$(SRCDIR)/FAIT cd $(SRCDIR);$(AR) $(ARFLAGS) $(INSTALL)/lib/libtet.a tetgen.o predicates.o ranlib $(SRCDIR)/$(INSTALL)/lib/libtet.a cp $(SRCDIR)/tetgen.h $(SRCDIR)/$(INSTALL)/include touch $@ clean-local:: -rm install.done $(SRCDIR)/tags: $(PACKAGE) tar xvzf $(PACKAGE) # FFCS: needs to patch tetgen because mingw64 has 4-byte longs cd tetgen1.4.3 && patch -u -p1 < ../patches.win64 touch $(SRCDIR)/tags # cd tetgen1.4.2;patch -p1 <../tetgen1.4.2.patch $(PACKAGE): ../getall -o TetGen -a clean-local:: -rm -rf tetgen1.4.? FAIT FAIRE clean: -rm $(SRCDIR)/$(INSTALL)/lib/libtet.a -rm $(SRCDIR)/$(INSTALL)/include/tetgen.h -rm FAIT -rm -rf tetgen1.4.? cxxflags: ../Makefile Makefile grep 'CXX *=' ../Makefile >cxxflags grep 'CC *=' ../Makefile >>cxxflags # FFCS - 10/5/12 - bug under Windows if -O3 is specified tetgen never returns. It could also be the case under # Ubuntu. All optimisation options are removed for safety. grep 'CXXFLAGS *=' ../Makefile | sed 's/ -O[0-9]* / /g' >>cxxflags grep 'WGET *=' ../Makefile >>cxxflags grep 'AR *=' ../Makefile >>cxxflags grep 'ARFLAGS *=' ../Makefile >>cxxflags .PHONY:$(SRCDIR)/$(INSTALL)freefem++-3.38-1/download/tetgen/patches.win64000644 000767 000024 00000012127 12167254041 021226 0ustar00hechtstaff000000 000000 # -*- mode:diff;coding:raw-text; -*- diff -u -p1 /home/alh/tmp/tetgen1.4.3/tetgen.cxx tetgen1.4.3/tetgen.cxx --- /home/alh/tmp/tetgen1.4.3/tetgen.cxx 2009-12-13 22:21:08.000000000 +0100 +++ tetgen1.4.3/tetgen.cxx 2010-11-24 15:47:44.253943800 +0100 @@ -4844,3 +4844,3 @@ void tetgenmesh::dummyinit(int tetwords, { - unsigned long alignptr; + unsigned FFCSLONG alignptr; @@ -4850,3 +4850,3 @@ void tetgenmesh::dummyinit(int tetwords, // Align 'dummytet' on a 'tetrahedrons->alignbytes'-byte boundary. - alignptr = (unsigned long) dummytetbase; + alignptr = (unsigned FFCSLONG) dummytetbase; dummytet = (tetrahedron *) @@ -4875,3 +4875,3 @@ void tetgenmesh::dummyinit(int tetwords, // Align 'dummysh' on a 'subfaces->alignbytes'-byte boundary. - alignptr = (unsigned long) dummyshbase; + alignptr = (unsigned FFCSLONG) dummyshbase; dummysh = (shellface *) @@ -15082,3 +15082,3 @@ void tetgenmesh::btree_insert(point inse point *ptary; - long arylen; // The array lenhgth is saved in ptary[0]. + FFCSLONG arylen; // The array lenhgth is saved in ptary[0]. @@ -15087,3 +15087,3 @@ void tetgenmesh::btree_insert(point inse // Get the current array length. - arylen = (long) ptary[0]; + arylen = (FFCSLONG) ptary[0]; // Insert the point into the node. @@ -15106,3 +15106,3 @@ void tetgenmesh::btree_search(point inse int ptsamples, ptidx; - long arylen; + FFCSLONG arylen; int i; @@ -15112,3 +15112,3 @@ void tetgenmesh::btree_search(point inse // Get the current array length. - arylen = (long) ptary[0]; + arylen = (FFCSLONG) ptary[0]; @@ -15165,3 +15165,3 @@ void tetgenmesh::ordervertices(point* ve point *ptary; - long arylen; + FFCSLONG arylen; int index, i, j; @@ -15186,3 +15186,3 @@ void tetgenmesh::ordervertices(point* ve ptary = *jpptary; - arylen = (long) ptary[0]; + arylen = (FFCSLONG) ptary[0]; for (j = 2; j <= arylen; j++) { // Skip the first point. @@ -21031,3 +21031,3 @@ bool tetgenmesh::delaunizecavity(arraypo printf(" Queue a subface x%lx (%d, %d, %d).\n", - (unsigned long) checksh.sh, pointmark(sorg(checksh)), + (unsigned FFCSLONG) checksh.sh, pointmark(sorg(checksh)), pointmark(sdest(checksh)), pointmark(sapex(checksh))); @@ -21081,3 +21081,3 @@ bool tetgenmesh::delaunizecavity(arraypo printf(" Queue a subface x%lx (%d, %d, %d).\n", - (unsigned long) checksh.sh, pointmark(sorg(checksh)), + (unsigned FFCSLONG) checksh.sh, pointmark(sorg(checksh)), pointmark(sdest(checksh)), pointmark(sapex(checksh))); @@ -23474,3 +23474,3 @@ bool tetgenmesh::carvecavity(list* newte printf(" Intet x%lx %d (%d, %d, %d, %d) is iversed.\n", - (unsigned long) intet.tet, intet.loc, pointmark(pa), + (unsigned FFCSLONG) intet.tet, intet.loc, pointmark(pa), pointmark(pb), pointmark(pc), pointmark(oppo(intet))); @@ -23544,3 +23544,3 @@ bool tetgenmesh::carvecavity(list* newte pointmark(org(neightet)), pointmark(dest(neightet)), - pointmark(apex(neightet)), (unsigned long) auxsh.sh); + pointmark(apex(neightet)), (unsigned FFCSLONG) auxsh.sh); printf(" p:draw_tet(%d, %d, %d, %d) -- in\n", @@ -33711,5 +33711,5 @@ int tetgenmesh::checksegments() printf(" Tet: x%lx (%d, %d, %d, %d) - Seg: x%lx (%d, %d).\n", - (unsigned long) tetloop.tet, pointmark(org(tetloop)), + (unsigned FFCSLONG) tetloop.tet, pointmark(org(tetloop)), pointmark(dest(tetloop)), pointmark(apex(tetloop)), - pointmark(oppo(tetloop)), (unsigned long) sseg.sh, + pointmark(oppo(tetloop)), (unsigned FFCSLONG) sseg.sh, pointmark(pa), pointmark(pb)); @@ -33725,3 +33725,3 @@ int tetgenmesh::checksegments() printf(" Tet: x%lx (%d, %d, %d, %d) - ", - (unsigned long) tetloop.tet, pointmark(org(tetloop)), + (unsigned FFCSLONG) tetloop.tet, pointmark(org(tetloop)), pointmark(dest(tetloop)), pointmark(apex(tetloop)), @@ -33729,3 +33729,3 @@ int tetgenmesh::checksegments() if (checkseg.sh != NULL) { - printf("Seg x%lx (%d, %d).\n", (unsigned long) checkseg.sh, + printf("Seg x%lx (%d, %d).\n", (unsigned FFCSLONG) checkseg.sh, pointmark(sorg(checkseg)), pointmark(sdest(checkseg))); diff -u -p1 /home/alh/tmp/tetgen1.4.3/tetgen.h tetgen1.4.3/tetgen.h --- /home/alh/tmp/tetgen1.4.3/tetgen.h 2009-12-13 22:20:33.000000000 +0100 +++ tetgen1.4.3/tetgen.h 2010-11-24 15:43:52.687137100 +0100 @@ -3318,5 +3318,12 @@ inline bool tetgenmesh::isfacehasedge(fa +// FFCS: mingw64 compiler refuses to convert 8-byte pointers to 4-byte longs +#ifdef WIN64 +#define FFCSLONG long long +#else +#define FFCSLONG long +#endif + inline bool tetgenmesh::issymexist(triface* t) { tetrahedron *ptr = (tetrahedron *) - ((unsigned long)(t->tet[t->loc]) & ~(unsigned long)7l); + ((unsigned FFCSLONG)(t->tet[t->loc]) & ~(unsigned FFCSLONG)7l); return ptr != dummytet; freefem++-3.38-1/download/tetgen/tetgen1.4.2.patch000644 000767 000024 00000003630 11625376054 021606 0ustar00hechtstaff000000 000000 diff -ur tetgen1.4.2/tetgen.cxx tetgen1.4.2-okk/tetgen.cxx --- tetgen1.4.2/tetgen.cxx 2007-04-16 16:45:11.000000000 +0200 +++ tetgen1.4.2-okk/tetgen.cxx 2009-05-25 10:37:19.000000000 +0200 @@ -3506,7 +3506,7 @@ // // /////////////////////////////////////////////////////////////////////////////// -void tetgenmesh::set_compfunc(char* str, int* itbytes, compfunc* pcomp) +void tetgenmesh::set_compfunc(const char* str, int* itbytes, compfunc* pcomp) { // First figure out whether it is a pointer or not. if (str[strlen(str) - 1] == '*') { @@ -25978,6 +25978,7 @@ } delete [] oldtetlist; delete [] newtetlist; + delete [] newpt; // Add by J. Morice for FreeFem++ (missing delete) Nov 2008 // Clear work lists. newsegshlist->clear(); spinshlist->clear(); diff -ur tetgen1.4.2/tetgen.h tetgen1.4.2-okk/tetgen.h --- tetgen1.4.2/tetgen.h 2007-04-16 16:45:13.000000000 +0200 +++ tetgen1.4.2-okk/tetgen.h 2009-05-25 10:37:41.000000000 +0200 @@ -980,7 +980,7 @@ // The function used to determine the size of primitive data types and // set the corresponding predefined linear order functions for them. - static void set_compfunc(char* str, int* itembytes, compfunc* pcomp); + static void set_compfunc(const char* str, int* itembytes, compfunc* pcomp); /////////////////////////////////////////////////////////////////////////////// // // @@ -1021,7 +1021,7 @@ list(int itbytes, compfunc pcomp, int mitems = 256, int exsize = 128) { listinit(itbytes, pcomp, mitems, exsize); } - list(char* str, int mitems = 256, int exsize = 128) { + list(const char* str, int mitems = 256, int exsize = 128) { set_compfunc(str, &itembytes, &comp); listinit(itembytes, comp, mitems, exsize); } freefem++-3.38-1/download/superludist/make-superlu.inc000644 000767 000024 00000002757 12471323611 023116 0ustar00hechtstaff000000 000000 # FFCS - let "make clean" work even if include file is not found -include $(abs_top_builddir)/download/headers-sparsesolver.inc ############################################# # FLAGS :: FREEFEM TO COMPILE SUPERLU_DIST # DSUPERLULIB = $(abs_top_builddir)/download/lib/libsuperlu_dist_3.0.a BLASDEF = $(FFBLASDEF) BLASLIB = @BLASLIBS@ # # The archiver and the flag(s) to use when building archive (library) # If your system has no ranlib, set RANLIB = echo. # ARCH = @AR@ ARCHFLAGS = @ARFLAGS@ RANLIB = @RANLIB@ ############################################################################ # C compiler setup CC = @MPICC@ # CFLAGS should be set to be the C flags that include optimization # FFCS - problem with some return statements on MacOS # FFCS - -I MPI_INC_DIR required on MacOS 10.8 MacPorts+OpenMPI CFLAGS = -Wreturn-type @CFLAGS@ -I'@MPI_INC_DIR@' # NOOPTS should be set to be the C flags that turn off any optimization NOOPTS = @CNOFLAGS@ ############################################################################ # FORTRAN compiler setup FORTRAN = @F77@ FFLAGS = @FFLAGS@ ############################################################################ LOADER = @CXX@ LOADOPTS = ############################################################################ # C preprocessor defs for compilation (-DNoChange, -DAdd_, or -DUpCase) # # Need follow the convention of how C calls a Fortran routine. # CDEFS = @CFLAGSF77@ WGET =@WGET@ freefem++-3.38-1/download/superludist/Makefile000644 000767 000024 00000005426 12535505215 021450 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- all-local: superludist # Downloading and compiling SuperLU DIST # ------------------------------ # SUPERLU information #http://crd.lbl.gov/~xiaoye/SuperLU/superlu_3.1.tar.gz #http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_dist_3.0.tar.gz DIRPKG=../pkg SRCDIR=SuperLU_DIST_3.0 PACKAGE=superlu_dist_3.0.tar.gz PACKAGE_PATH=$(DIRPKG)/$(PACKAGE) SERVER=http://crd-legacy.lbl.gov/~xiaoye/SuperLU/ INSTALL=../.. SUPERLU_DIST_VERSION=3.0 DISTSUPERLULIB=../$(INSTALL)/lib/libsuperlu_dist_3.0.a SPLD_PATCHS=superludist_2.3.patch superludist_3.0-printf.patch superludist_3.0-cast_warning.patch superludist_3.0-return_values.patch superludist_3.0-operation_undefined.patch ## WGET=wget include make.inc superludist: FAIT # FFCS: more dependencies for parallel builds FAIT:$(SRCDIR)/tags-tar $(MAKE) FAIRE install WHERE touch FAIT FAIRE: $(SRCDIR)/SRC/$(DSUPERLULIB) touch FAIRE make.inc: ../../config.status Makefile grep 'abs_top_builddir *=' ../Makefile >> dirflags cat dirflags make-superlu.inc > make-superlu-tmp.inc rm dirflags ../../config.status --file="make.inc:make-superlu-tmp.inc" case 'uname' in *CYGWIN_) cp make.inc Makefile.inn; sed "s/COPTIONS =/COPTIONS = -D__VC__/" Makefile.in; rm Makefile.inn ;; esac rm make-superlu-tmp.inc # FFCS: we need an error if make breaks $(SRCDIR)/SRC/$(DSUPERLULIB): $(SRCDIR)/tags-tar cp make.inc $(SRCDIR)/make.inc cd $(SRCDIR)/SRC && $(MAKE) # FFCS: we need more dependencies for parallel builds install:$(SRCDIR)/SRC/$(DSUPERLULIB) mkdir -p $(SRCDIR)/$(INSTALL)/include/superludist cp $(SRCDIR)/SRC/*.h $(SRCDIR)/$(INSTALL)/include/superludist WHERE: echo superlu_dist LD -L@DIR@/lib -lsuperlu_dist_3.0 >$(SRCDIR)/$(INSTALL)/lib/WHERE.superlu_dist echo superlu_dist INCLUDE -I@DIR@/include/superludist >> $(SRCDIR)/$(INSTALL)/lib/WHERE.superlu_dist $(SRCDIR)/tags-tar: $(PACKAGE_PATH) $(SPLD_PATCHS) tar xvzf $(PACKAGE_PATH) cd $(SRCDIR)/SRC/; patch -p1 < ../../superludist_2.3.patch cd $(SRCDIR)/SRC/; patch -p3 < ../../superludist_3.0-printf.patch cd $(SRCDIR)/SRC/; patch -p2 < ../../superludist_3.0-cast_warning.patch cd $(SRCDIR)/SRC/; patch -p2 < ../../superludist_3.0-return_values.patch cd $(SRCDIR)/SRC/; patch -p2 < ../../superludist_3.0-operation_undefined.patch touch $(SRCDIR)/tags-tar $(PACKAGE_PATH): ../getall -o SuperLU_DIST -a # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) clean: -rm -rf SuperLU_DIST* -rm ../include/superludist/*.h -rm -r ../include/superludist/ -rm -r ../lib/libsuperlu_dist*.a -rm -r make.inc -rm -rf FAIT FAIRE freefem++-3.38-1/download/superludist/superludist_2.3.patch000644 000767 000024 00000002140 11406142255 023761 0ustar00hechtstaff000000 000000 diff -ur SuperLU_DIST_2.3/SRC/Makefile SuperLU_DIST_2.3-okk/Makefile --- SuperLU_DIST_2.3/SRC/Makefile 2008-09-13 17:13:18.000000000 +0200 +++ SuperLU_DIST_2.3-okk/Makefile 2010-02-16 08:24:45.000000000 +0100 @@ -51,6 +51,8 @@ ZSLUSRC = dcomplex.o zlangs.o zgsequ.o zlaqgs.o zutil.o \ zmemory.o zmyblas2.o dmemory.o zsp_blas2.o zsp_blas3.o +#ZSLUSRCdemory= dmemory.o + # # Routines for double precision parallel SuperLU # DPLUSRC = dldperm.o ddistribute.o pdgstrf.o pdgstrs_Bglobal.o @@ -69,7 +71,7 @@ pzgsequ.o pzlaqgs.o pzgsrfs.o pzgsmv.o pzgstrs_lsum.o \ pzsymbfact_distdata.o -all: double complex16 +all: doublecomplex16 double: $(DSLUSRC) $(DPLUSRC) $(ALLAUX) $(LAAUX) $(ARCH) $(ARCHFLAGS) $(DSUPERLULIB) \ @@ -81,6 +83,10 @@ $(ZSLUSRC) $(ZPLUSRC) $(ALLAUX) $(LAAUX) $(RANLIB) $(DSUPERLULIB) +doublecomplex16: $(DSLUSRC) $(DPLUSRC) $(ZSLUSRC) $(ZPLUSRC) $(ALLAUX) $(LAAUX) + $(ARCH) $(ARCHFLAGS) $(DSUPERLULIB) \ + $(DSLUSRC) $(DPLUSRC) $(ZSLUSRC) $(ZPLUSRC) $(ALLAUX) $(LAAUX) + $(RANLIB) $(DSUPERLULIB) ################################## # Do not optimize these routines # freefem++-3.38-1/download/superludist/superludist_3.0-cast_warning.patch000644 000767 000024 00000002176 12167254041 026447 0ustar00hechtstaff000000 000000 diff -ur SuperLU_DIST_3.0.orig/SRC/pdgstrf.c SuperLU_DIST_3.0/SRC/pdgstrf.c --- SuperLU_DIST_3.0.orig/SRC/pdgstrf.c 2011-10-11 20:45:40.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/pdgstrf.c 2013-02-13 12:51:45.691434748 +0000 @@ -2597,7 +2597,7 @@ MPI_Isend(ublk_ptr, u_diag_cnt, MPI_DOUBLE, pr, tag, comm, U_diag_blk_send_req + pr); } - U_diag_blk_send_req[krow] = 1; /* flag outstanding Isend */ + U_diag_blk_send_req[krow] = (MPI_Request) 1; /* flag outstanding Isend */ } } else { /* non-diagonal process */ Only in SuperLU_DIST_3.0/SRC: pdgstrf.o diff -ur SuperLU_DIST_3.0.orig/SRC/pzgstrf.c SuperLU_DIST_3.0/SRC/pzgstrf.c --- SuperLU_DIST_3.0.orig/SRC/pzgstrf.c 2011-10-11 20:45:40.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/pzgstrf.c 2013-02-13 12:54:00.212442635 +0000 @@ -2543,7 +2543,7 @@ MPI_Isend(ublk_ptr, u_diag_cnt, SuperLU_MPI_DOUBLE_COMPLEX, pr, tag, comm, U_diag_blk_send_req + pr); } - U_diag_blk_send_req[krow] = 1; /* flag outstanding Isend */ + U_diag_blk_send_req[krow] = (MPI_Request) 1; /* flag outstanding Isend */ } } else { /* non-diagonal process */ freefem++-3.38-1/download/superludist/superludist_3.0-operation_undefined.patch000644 000767 000024 00000001321 12167254041 030000 0ustar00hechtstaff000000 000000 --- SuperLU_DIST_3.0/SRC/util.c.orig 2013-02-20 10:23:45.674505816 +0000 +++ SuperLU_DIST_3.0/SRC/util.c 2013-02-20 10:24:09.001507187 +0000 @@ -662,8 +662,8 @@ do { ++(*num_diag_procs); - i = (++i) % nprow; - j = (++j) % npcol; + i = (i + 1) % nprow; + j = (j + 1) % npcol; pkk = PNUM( i, j, grid ); } while ( pkk != 0 ); /* Until wrap back to process 0 */ if ( !(*diag_procs = intMalloc_dist(*num_diag_procs)) ) @@ -673,8 +673,8 @@ for (i = j = k = 0; k < *num_diag_procs; ++k) { pkk = PNUM( i, j, grid ); (*diag_procs)[k] = pkk; - i = (++i) % nprow; - j = (++j) % npcol; + i = (i + 1) % nprow; + j = (j + 1) % npcol; } for (k = 0; k < nsupers; ++k) { knsupc = SuperSize( k ); freefem++-3.38-1/download/superludist/superludist_3.0-printf.patch000644 000767 000024 00000001030 12535504244 025260 0ustar00hechtstaff000000 000000 --- ./SuperLU_DIST_3.0/SRC/xerbla.c.orig 2013-02-13 12:21:04.893027330 +0000 +++ ./SuperLU_DIST_3.0/SRC/xerbla.c 2013-02-13 12:21:22.677028381 +0000 @@ -9,6 +9,7 @@ */ #include "Cnames.h" +#include /* Subroutine */ /*! \brief --- ./SuperLU_DIST_3.0/SRC/memory.c.orig 2011-09-06 02:16:34.000000000 +0200 +++ ./SuperLU_DIST_3.0/SRC/memory.c 2015-06-09 08:29:57.000000000 +0200 @@ -36,7 +36,7 @@ { /*fprintf(stderr, msg); fflush(stderr);*/ - printf(msg); + printf("%s",msg); exit (-1); } freefem++-3.38-1/download/superludist/superludist_3.0-return_values.patch000644 000767 000024 00000011316 12167254041 026662 0ustar00hechtstaff000000 000000 Only in SuperLU_DIST_3.0/SRC: 1 diff -ur SuperLU_DIST_3.0.orig/SRC/dutil.c SuperLU_DIST_3.0/SRC/dutil.c --- SuperLU_DIST_3.0.orig/SRC/dutil.c 2011-09-06 00:16:34.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/dutil.c 2013-02-13 17:40:36.696123287 +0000 @@ -185,6 +185,8 @@ if ( (dp = (double *) Astore->nzval) != NULL ) PrintDouble5("nzval", nnz_loc, dp); printf("==== end CompRowLoc matrix\n"); + + return 0; } int file_dPrint_CompRowLoc_Matrix_dist(FILE *fp, SuperMatrix *A) @@ -205,6 +207,8 @@ if ( (dp = (double *) Astore->nzval) != NULL ) file_PrintDouble5(fp, "nzval", nnz_loc, dp); fprintf(fp, "==== end CompRowLoc matrix\n"); + + return 0; } void @@ -355,6 +359,8 @@ fprintf(fp, "%14e", x[i]); } fprintf(fp, "\n"); + + return 0; } /*! \brief Print the blocks in the factored matrix L. @@ -461,6 +467,8 @@ file_PrintInt10(fp, "ptr_ind_torecv", procs+1, gsmv_comm->ptr_ind_torecv); file_PrintInt10(fp, "SendCounts", procs, gsmv_comm->SendCounts); file_PrintInt10(fp, "RecvCounts", procs, gsmv_comm->RecvCounts); + + return 0; } Binary files SuperLU_DIST_3.0.orig/SRC/dutil.o and SuperLU_DIST_3.0/SRC/dutil.o differ diff -ur SuperLU_DIST_3.0.orig/SRC/pddistribute.c SuperLU_DIST_3.0/SRC/pddistribute.c --- SuperLU_DIST_3.0.orig/SRC/pddistribute.c 2011-09-06 00:16:34.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/pddistribute.c 2013-02-13 17:44:50.198138179 +0000 @@ -304,6 +304,8 @@ CHECK_MALLOC(iam, "Exit dReDistribute_A()"); #endif + return 0; + } /* dReDistribute_A */ float Binary files SuperLU_DIST_3.0.orig/SRC/pddistribute.o and SuperLU_DIST_3.0/SRC/pddistribute.o differ diff -ur SuperLU_DIST_3.0.orig/SRC/psymbfact.c SuperLU_DIST_3.0/SRC/psymbfact.c --- SuperLU_DIST_3.0.orig/SRC/psymbfact.c 2011-09-06 00:16:34.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/psymbfact.c 2013-02-13 17:47:47.931004764 +0000 @@ -2267,6 +2267,8 @@ for (i = fstVtx_toUpd; i < nvtcs_toUpd; i++) marker[i] = 0; + + return 0; } static int_t @@ -4005,6 +4007,8 @@ if (newelts_U) SUPERLU_FREE (newelts_U); if (PS->szDnsSep < mem_dnsCS) PS->szDnsSep = mem_dnsCS; + + return 0; } /*! \brief @@ -4534,6 +4538,8 @@ if (request_snd != NULL) SUPERLU_FREE (request_snd); if (request_rcv != NULL) SUPERLU_FREE (request_rcv); if (status != NULL) SUPERLU_FREE (status); + + return 0; } static void Binary files SuperLU_DIST_3.0.orig/SRC/psymbfact.o and SuperLU_DIST_3.0/SRC/psymbfact.o differ diff -ur SuperLU_DIST_3.0.orig/SRC/pzdistribute.c SuperLU_DIST_3.0/SRC/pzdistribute.c --- SuperLU_DIST_3.0.orig/SRC/pzdistribute.c 2011-09-06 00:16:34.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/pzdistribute.c 2013-02-13 17:53:06.269023492 +0000 @@ -303,6 +303,7 @@ CHECK_MALLOC(iam, "Exit zReDistribute_A()"); #endif + return 0; } /* zReDistribute_A */ float Binary files SuperLU_DIST_3.0.orig/SRC/pzdistribute.o and SuperLU_DIST_3.0/SRC/pzdistribute.o differ diff -ur SuperLU_DIST_3.0.orig/SRC/util.c SuperLU_DIST_3.0/SRC/util.c --- SuperLU_DIST_3.0.orig/SRC/util.c 2011-10-11 21:14:16.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/util.c 2013-02-13 17:54:31.042028470 +0000 @@ -490,6 +490,7 @@ gstrs_comm->ptr_to_ibuf = ptr_to_ibuf; gstrs_comm->ptr_to_dbuf = ptr_to_ibuf + procs; + return 0; } /* PXGSTRS_INIT */ @@ -763,6 +764,8 @@ fprintf(fp, "%6d", x[i]); } fprintf(fp, "\n"); + + return 0; } int_t Binary files SuperLU_DIST_3.0.orig/SRC/util.o and SuperLU_DIST_3.0/SRC/util.o differ diff -ur SuperLU_DIST_3.0.orig/SRC/zutil.c SuperLU_DIST_3.0/SRC/zutil.c --- SuperLU_DIST_3.0.orig/SRC/zutil.c 2011-09-06 00:16:34.000000000 +0000 +++ SuperLU_DIST_3.0/SRC/zutil.c 2013-02-13 17:56:24.618035143 +0000 @@ -184,6 +184,8 @@ if ( (dp = (doublecomplex *) Astore->nzval) != NULL ) PrintDoublecomplex("nzval", nnz_loc, dp); printf("==== end CompRowLoc matrix\n"); + + return 0; } int file_zPrint_CompRowLoc_Matrix_dist(FILE *fp, SuperMatrix *A) @@ -204,6 +206,8 @@ if ( (dp = (doublecomplex *) Astore->nzval) != NULL ) file_PrintDoublecomplex(fp, "nzval", nnz_loc, dp); fprintf(fp, "==== end CompRowLoc matrix\n"); + + return 0; } void @@ -351,6 +355,8 @@ fprintf(fp, "%10s:\tReal\tImag\n", name); for (i = 0; i < len; ++i) fprintf(fp, "\t%d\t%.4f\t%.4f\n", i, x[i].r, x[i].i); + + return 0; } /*! \brief Print the blocks in the factored matrix L. @@ -457,6 +463,8 @@ file_PrintInt10(fp, "ptr_ind_torecv", procs+1, gsmv_comm->ptr_ind_torecv); file_PrintInt10(fp, "SendCounts", procs, gsmv_comm->SendCounts); file_PrintInt10(fp, "RecvCounts", procs, gsmv_comm->RecvCounts); + + return 0; } Binary files SuperLU_DIST_3.0.orig/SRC/zutil.o and SuperLU_DIST_3.0/SRC/zutil.o differ freefem++-3.38-1/download/superlu/make.inc000644 000767 000024 00000002016 11406142255 020521 0ustar00hechtstaff000000 000000 ############################################################################ # # Program: SuperLU # # Module: make.inc # # Purpose: Top-level Definitions # # Creation date: October 2, 1995 # # Modified: February 4, 1997 Version 1.0 # November 15, 1997 Version 1.1 # September 1, 1999 Version 2.0 # ############################################################################ # # # The name of the libraries to be created/linked to # TMGLIB = $(INSTALL)/../lib/libtmglib.a SUPERLULIB = $(INSTALL)/../lib/libsuperlu_3.1.a BLASLIB = $(BLASLIBS) # # The archiver and the flag(s) to use when building archive (library) # If your system has no ranlib, set RANLIB = echo. # ARCH = $(AR) ARCHFLAGS = $(ARFLAGS) FORTRAN = f77 FFLAGS = -O LOADER = $(CC) LOADOPTS = # # C preprocessor defs for compilation (-DNoChange, -DAdd_, or -DUpCase) # CDEFS = -DAdd_ # # The directory in which Matlab is installed # MATLAB = /usr/sww/pkg/matlab freefem++-3.38-1/download/superlu/Makefile000755 000767 000024 00000007712 12274717221 020571 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- all-local: superlu # Downloading and compiling Tetgen # ------------------------------ # SUPERLU information #http://crd.lbl.gov/~xiaoye/SuperLU/superlu_4.0.tar.gz DIRPKG=../pkg SRCDIR=SuperLU_4.3 PACKAGE=superlu_4.3.tar.gz PACKAGE_PATH=$(DIRPKG)/$(PACKAGE) SERVER=http://crd-legacy.lbl.gov/~xiaoye/SuperLU/ # http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_4.3.tar.gz INSTALL=../.. SUPERLU_VERSION=4.3 SUPERLULIB=../$(INSTALL)/lib/libsuperlu_$(SUPERLU_VERSION).a include ff-FLAGS ### LAPACK LAAUX = lsame.o xerbla.o SLASRC = slacon.o DLASRC = dlacon.o CLASRC = clacon.o scsum1.o icmax1.o ZLASRC = zlacon.o dzsum1.o izmax1.o SCLAUX = slamch.o DZLAUX = dlamch.o ### SuperLU ALLAUX = superlu_timer.o util.o memory.o get_perm_c.o mmd.o \ sp_coletree.o sp_preorder.o sp_ienv.o relax_snode.o \ heap_relax_snode.o colamd.o SLUSRC = \ sgssv.o sgssvx.o \ ssp_blas2.o ssp_blas3.o sgscon.o \ slangs.o sgsequ.o slaqgs.o spivotgrowth.o \ sgsrfs.o sgstrf.o sgstrs.o scopy_to_ucol.o \ ssnode_dfs.o ssnode_bmod.o \ spanel_dfs.o spanel_bmod.o sreadhb.o \ scolumn_dfs.o scolumn_bmod.o spivotL.o spruneL.o \ smemory.o sutil.o smyblas2.o DLUSRC = \ dgssv.o dgssvx.o \ dsp_blas2.o dsp_blas3.o dgscon.o \ dlangs.o dgsequ.o dlaqgs.o dpivotgrowth.o \ dgsrfs.o dgstrf.o dgstrs.o dcopy_to_ucol.o \ dsnode_dfs.o dsnode_bmod.o \ dpanel_dfs.o dpanel_bmod.o dreadhb.o \ dcolumn_dfs.o dcolumn_bmod.o dpivotL.o dpruneL.o \ dmemory.o dutil.o dmyblas2.o ## dgstrsL.o dgstrsU.o CLUSRC = \ scomplex.o cgssv.o cgssvx.o csp_blas2.o csp_blas3.o cgscon.o \ clangs.o cgsequ.o claqgs.o cpivotgrowth.o \ cgsrfs.o cgstrf.o cgstrs.o ccopy_to_ucol.o \ csnode_dfs.o csnode_bmod.o \ cpanel_dfs.o cpanel_bmod.o creadhb.o \ ccolumn_dfs.o ccolumn_bmod.o cpivotL.o cpruneL.o \ cmemory.o cutil.o cmyblas2.o ZLUSRC = \ dcomplex.o zgssv.o zgssvx.o zsp_blas2.o zsp_blas3.o zgscon.o \ zlangs.o zgsequ.o zlaqgs.o zpivotgrowth.o \ zgsrfs.o zgstrf.o zgstrs.o zcopy_to_ucol.o \ zsnode_dfs.o zsnode_bmod.o \ zpanel_dfs.o zpanel_bmod.o zreadhb.o \ zcolumn_dfs.o zcolumn_bmod.o zpivotL.o zpruneL.o \ zmemory.o zutil.o zmyblas2.o OBJ_SUPERLU = $(ALLAUX) $(LAAUX) \ $(SLUSRC) $(SLASRC) $(SCLAUX) \ $(DLUSRC) $(DLASRC) $(DZLAUX) \ $(CLUSRC) $(CLASRC) \ $(ZLUSRC) $(ZLASRC) superlu: FAIT # FFCS - 18/6/12 - depend on SRCDIR to remake all when package version changes FAIT:$(SRCDIR) $(MAKE) install WHERE touch FAIT FAIRE:$(SRCDIR) cd $(SRCDIR)/SRC; $(MAKE) -f ../../ff-FLAGS $(OBJ_SUPERLU) touch FAIRE # FFCS - FAIRE and WHERE need to be done sequentially, even in a parallel build (corrected by Cico, 1/3/12) install: FAIRE $(MAKE) WHERE cd $(SRCDIR)/SRC; $(AR) $(ARFLAGS) $(SUPERLULIB) $(OBJ_SUPERLU) cd $(SRCDIR)/SRC; $(RANLIB) $(SUPERLULIB) cp $(SRCDIR)/SRC/s*h $(SRCDIR)/$(INSTALL)/include WHERE: echo superlu LD -L@DIR@/lib -lsuperlu_$(SUPERLU_VERSION) >$(SRCDIR)/$(INSTALL)/lib/WHERE.superlu echo superlu INCLUDE -I@DIR@/include >> $(SRCDIR)/$(INSTALL)/lib/WHERE.superlu $(SRCDIR)/$(INSTALL): mkdir $(SRCDIR)/$(INSTALL) $(SRCDIR): $(PACKAGE_PATH) tar xvzf $(PACKAGE_PATH) touch $(SRCDIR) $(PACKAGE_PATH): ../getall -o SuperLU -a # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) clean: -rm -rf SuperLU_* ff-FLAGS -rm -rf FAIT FAIRE # ALH - FFCS - 18/5/9 - FHecht says he forgot to add -fPIC for 64 bit platforms, so I add it myself here. ff-FLAGS: ../Makefile Makefile grep '^CXX *=' ../Makefile >>$@ grep '^CC *=' ../Makefile >>$@ grep '^CFLAGS *=' ../Makefile|sed 's/$$/ -fPIC/' >>$@ grep '^BLAS[A-Z ]*=' ../Makefile|grep = >>$@ grep '^AR *=' ../Makefile|grep = >>$@ grep '^ARFLAGS *=' ../Makefile|grep = >>$@ grep '^RANLIB *=' ../Makefile|grep = >>$@ grep '^WGET *=' ../Makefile|grep = >>$@ freefem++-3.38-1/download/scotch/Makefile000644 000767 000024 00000010011 12505076110 020324 0ustar00hechtstaff000000 000000 # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # http://www.ljll.math.upmc.fr/lehyaric # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=19/03/10 upmc # Downloading and compiling extra libraries # ----------------------------------------- include Makefile.inc all-local: scotch # Downloading and compiling scotch # ------------------------------- # https://gforge.inria.fr/frs/download.php/file/34099/scotch_6.0.3.tar.gz # http://gforge.inria.fr/frs/download.php/23391/scotch_5.1.7_esmumps.tar.gz # Scotch information DIRPKG=../pkg SRCDIR=scotch_$(scotch_VERSION) PACKAGE=$(DIRPKG)/scotch_$(scotch_VERSION_LOCAL).tar.gz SERVER=https://gforge.inria.fr/frs/download.php/file/34099 #https://gforge.inria.fr/frs/download.php/file/34099/scotch_6.0.3.tar.gz #https://gforge.inria.fr/frs/download.php/23391 INSTALL=../.. scotch_VERSION=6.0.3 scotch_VERSION_LOCAL=6.0.3 # trick to no in MPI on NOT .. TESTMPI= test -n "$(CCP)" scotch: FAIRE $(SRCDIR)/AFAIRE: $(MAKE) install FAIRE: $(SRCDIR)/FAIT $(MAKE) WHERE touch FAIRE Makefile.inc: ../../config.status Makefile-scotch.inc Makefile ../../config.status --file="Makefile.inc:Makefile-scotch.inc" # DCOMMON_TIMING_OLD # FFCS - 16/1/13 - what was "$(CCP)" used for? $(SRCDIR)/FAIT: $(SRCDIR) Makefile.inc cp Makefile.inc $(SRCDIR)/src cd $(SRCDIR)/src && $(MAKE) scotch esmumps # # FFCS - 16/1/13 - this crashes when run in parallel # FH: compile pt only if mpi is here if $(TESTMPI) ; then cd $(SRCDIR)/src && $(MAKE) -j1 ptscotch ptesmumps ; fi touch $(SRCDIR)/FAIT install:$(SRCDIR)/FAIT mkdir -p $(SRCDIR)/$(INSTALL)/include/scotch cp $(SRCDIR)/include/*.h $(SRCDIR)/$(INSTALL)/include/scotch/ cp $(SRCDIR)/lib/*.a $(SRCDIR)/$(INSTALL)/lib/ # ALH - 16/1/13 - simplifying make rules WHERE:$(SRCDIR)/FAIT $(MAKE) install -rm $(SRCDIR)/$(INSTALL)/lib/WHERE.scotch -$(TESTMPI) &&echo ptscotch LD -L@DIR@/lib -lesmumps -lptscotch -lptscotcherr >>$(SRCDIR)/$(INSTALL)/lib/WHERE.scotch -$(TESTMPI) &&echo ptscotchparmetis LD -L@DIR@/lib -lesmumps -lptscotchparmetis >>$(SRCDIR)/$(INSTALL)/lib/WHERE.scotch -$(TESTMPI) &&echo ptscotch INCLUDE -I@DIR@/include/scotch >> $(SRCDIR)/$(INSTALL)/lib/WHERE.scotch echo scotch LD -L@DIR@/lib -lesmumps -lscotch -lscotcherr >>$(SRCDIR)/$(INSTALL)/lib/WHERE.scotch echo scotchmetis LD -L@DIR@/lib -lscotchmetis >>$(SRCDIR)/$(INSTALL)/lib/WHERE.scotch echo scotch INCLUDE -I@DIR@/include/scotch >> $(SRCDIR)/$(INSTALL)/lib/WHERE.scotch $(SRCDIR): $(PACKAGE) tar xvzf $(PACKAGE) patch -p1 ../lib/WHERE.scalapack ;\ echo scalapack INCLUDE -I@DIR@/include >> ../lib/WHERE.scalapack ;\ fi FAIRE: $(SRCDIR)/FAIT-202 $(MAKE) WHERE touch FAIRE SLmake.inc: ../../config.status Makefile SLmake-scalapack.inc ../../config.status --file="SLmake.inc:SLmake-scalapack.inc" $(SRCDIR)/tag-tar: $(PACKAGE1) gunzip -c $(PACKAGE1) | tar xvf - touch $(SRCDIR)/tag-tar $(PACKAGE1): ../getall -o ScaLAPACK -a clean: # FFCS - need to clean completely even in case of error -rm SLmake.inc FAIRE FAIT # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see # [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) -rm -rf scalapack-* -rm config.log # -rm $(PACKAGE1) .PHONY:$(SRCDIR)/$(INSTALL)freefem++-3.38-1/download/scalapack/SLmake-scalapack.inc000644 000767 000024 00000003442 12471321332 023125 0ustar00hechtstaff000000 000000 ############################################################################ # # Program: ScaLAPACK # # Module: SLmake.inc # # Purpose: Top-level Definitions # # Creation date: February 15, 2000 # # Modified: October 13, 2011 # # Send bug reports, comments or suggestions to scalapack@cs.utk.edu # ############################################################################ # # C preprocessor definitions: set CDEFS to one of the following: # # -DNoChange (fortran subprogram names are lower case without any suffix) # -DUpCase (fortran subprogram names are upper case without any suffix) # -DAdd_ (fortran subprogram names are lower case with "_" appended) CDEFS = @CFLAGSF77@ -DNO_IEEE $(USEMPI) # # The fortran and C compilers, loaders, and their flags # FC = @MPIF77@ CC = @MPICC@ NOOPT = -O0 @CNOFLAGS@ # FFCS - some return statements without value cause trouble on MacOS # FFCS - add path to mpi.h (required for MacOS 10.8 + MacPorts OpenMPI) # FFCS - added @CNOFLAGS@ according to upstream changes CCFLAGS = -O3 -Wreturn-type @CFLAGS@ -I'@MPI_INC_DIR@' @CNOFLAGS@ FCFLAGS = -O3 @CNOFLAGS@ FCLOADER = $(FC) CCLOADER = $(CC) FCLOADFLAGS = $(FCFLAGS) CCLOADFLAGS = $(CCFLAGS) # # The archiver and the flag(s) to use when building archive (library) # Also the ranlib routine. If your system has no ranlib, set RANLIB = echo # ARCH = @AR@ ARCHFLAGS = @ARFLAGS@ RANLIB = @RANLIB@ # # The name of the ScaLAPACK library to be created # SCALAPACKLIB = libscalapack.a # # BLAS, LAPACK (and possibly other) libraries needed for linking test programs # BLASLIB = $(FFBLASLIB) LAPACKLIB = $(FFLAPACKLIB) LIBS = $(LAPACKLIB) $(BLASLIB) WGET = @WGET@freefem++-3.38-1/download/pastix/all_macros.diff000644 000767 000024 00000001276 12214307167 021702 0ustar00hechtstaff000000 000000 --- pastix_release_2200/src/all_macros 2009-02-19 07:33:00.000000000 -0600 +++ pastix_release_2200/src/all_macros.new 2013-03-24 10:34:37.026406767 -0500 @@ -11,7 +11,7 @@ OBJ = $(OBJEXT) AR = $(ARPROG) -CCINC = -I. -I$(DSTDIR) -I$(INSDIR) +CCINC = -I$(DSTDIR) -I$(INSDIR) CAT = cat CP = cp MKDIR = mkdir @@ -21,10 +21,10 @@ TOUCH = touch TAIL = tail HEAD = head -VERSION = `../../myversion.sh` +VERSION = ../../myversion.sh COMMONPASTIX_H = $(INSDIR)/common_pastix.h \ $(INSDIR)/api.h \ $(INSDIR)/debug.h \ $(INSDIR)/errors.h \ - $(INSDIR)/redefine_functions.h \ No newline at end of file + $(INSDIR)/redefine_functions.h freefem++-3.38-1/download/pastix/config-pastix-complex.in000644 000767 000024 00000015150 12504553125 023477 0ustar00hechtstaff000000 000000 abs_top_builddir=@abs_top_builddir@ include $(abs_top_builddir)/download/headers-sparsesolver.inc HOSTARCH = @PASTIX_HOSTARCH@#i686_mac VERSIONBIT = _@SIZEOF_PTRINBIT@bit EXEEXT = OBJEXT = .o LIBEXT = .a CCPROG = @CC@ -Wall -DX_ARCH$(HOSTARCH) CFPROG = @F77@ CF90PROG = @F77@ -ffree-form MCFPROG = @MPIFC@ CF90CCPOPT = -ffree-form -x f95-cpp-input #avant # Compilation options for optimization (make expor) CCFOPT = -O3 @CFLAGS@ # Compilation options for debug (make | make debug) CCFDEB = -g3 LKFOPT = MKPROG = make # FFCS - add MPI_INCLUDE because FF cannot use the defaut openmpi scripts on MacOS (see # [[file:../../../../configure.ac::mpicc_on_macos]]) MPCCPROG = @MPICC@ -Wall -DX_ARCH$(HOSTARCH) @MPI_INCLUDE@ ARFLAGS = @ARFLAGS@ # ruv ARPROG = @AR@ # ar EXTRALIB = @FLIBS@ -lm -lsupc++ VERSIONMPI = _mpi VERSIONSMP = _smp VERSIONBUB = _nobubble VERSIONINT = _int VERSIONPRC = _simple VERSIONFLT = _real VERSIONORD = _scotch ################################################################### # INTEGER TYPE # ################################################################### # uncomment the following lines for integer type support (Only 1) CCTYPES= -DINTSSIZE32 -DFORCE_INT #VERSIONINT = $(FFVERSIONINT)#_long #CCTYPES = $(FFCTYPESINT)#-DFORCE_LONG -DLONG #--------------------------- #VERSIONINT = _int32 #CCTYPES = -DFORCE_INT32 #--------------------------- #VERSIONINT = _int64 #CCTYPES = -DFORCE_INT64 -DINTSSIZE64 ################################################################### # FLOAT TYPE # ################################################################### # uncomment the following lines for double precision support #VERSIONPRC = _double CCTYPES := $(CCTYPES) -DFORCE_DOUBLE -DPREC_DOUBLE # uncomment the following lines for float=complex support VERSIONFLT = _complex CCTYPES := $(CCTYPES) -DFORCE_COMPLEX -DTYPE_COMPLEX -DPREC_DOUBLE ################################################################### # Mpi/THREADS # ################################################################### # uncomment the following lines for sequential (NOMPI) version #VERSIONMPI = _nompi #CCTYPES := $(CCTYPES) -DFORCE_NOMPI #MPCCPROG = $(CCPROG) #MCFPROG = $(CFPROG) # uncomment the following lines for non-threaded (NOSMP) version #VERSIONSMP = _nosmp #CCTYPES := $(CCTYPES) -DFORCE_NOSMP # Uncomment the following line to enable a progression thread #CCPASTIX := $(CCPASTIX) -DTHREAD_COMM # Uncomment the following line if your MPI doesn't support MPI_THREAD_MULTIPLE level #CCPASTIX := $(CCPASTIX) -DPASTIX_FUNNELED # Uncomment the following line if your MPI doesn't support MPI_Datatype correctly #CCPASTIX := $(CCPASTIX) -DNO_MPI_TYPE ################################################################### # Options # ################################################################### # Uncomment the following lines for NUMA-aware allocation (recommended) CCPASTIX := $(CCPASTIX) -DNUMA_ALLOC # Show memory usage statistics #CCPASTIX := $(CCPASTIX) -DMEMORY_USAGE # Show memory usage statistics in solver #CCPASTIX := $(CCPASTIX) -DSTATS_SOPALIN # Uncomment following line for dynamic thread scheduling support #CCPASTIX := $(CCPASTIX) -DPASTIX_BUBBLE # Uncomment the following lines for Out-of-core #CCPASTIX := $(CCPASTIX) -DOOC ################################################################### # GRAPH PARTITIONING # ################################################################### CCPASTIX := $(CCPASTIX) $(FFMPIINCLUDE) EXTRALIB := $(EXTRALIB) $(FFMPILIB) # uncomment the following lines for using metis ordering #VERSIONORD = _metis #METIS_HOME = $(abs_top_builddir)/download/ #CCPASTIX := $(CCPASTIX) -DMETIS -I$(METIS_HOME)/include/metis/ #EXTRALIB := $(EXTRALIB) -L$(METIS_HOME)/lib/ -lmetis # Scotch always needed to compile SCOTCH_HOME = # ALH - 4/9/13 - see [[file:../../configure.ac::SCOTCH_INCLUDE]] SCOTCH_INC = @SCOTCH_INCLUDE@ SCOTCH_LIB = $(abs_top_builddir)/download/lib/ # uncomment on of this blocks #scotch CCPASTIX := $(CCPASTIX) -I$(SCOTCH_INC) EXTRALIB := $(EXTRALIB) -L$(SCOTCH_LIB) -lscotch -lscotcherrexit #ptscotch #CCPASTIX := $(CCPASTIX) -I$(SCOTCH_INC) -DDISTRIBUTED #EXTRALIB := $(EXTRALIB) -L$(SCOTCH_LIB) -lptscotch -lscotcherrexit ################################################################### # MARCEL # ################################################################### # Uncomment following lines for marcel thread support #VERSIONSMP := $(VERSIONSMP)_marcel #CCPASTIX := $(CCPASTIX) `pm2-config --cflags` -I${PM2_ROOT}/marcel/include/pthread #EXTRALIB := $(EXTRALIB) `pm2-config --libs` # ---- Thread Posix ------ EXTRALIB := $(EXTRALIB) @LIBSPTHREAD@ # Uncomment following line for bubblesched framework support (need marcel support) #VERSIONBUB = _bubble #CCPASTIX := $(CCPASTIX) -DPASTIX_USE_BUBBLE ################################################################### # BLAS # ################################################################### # Choose Blas library (Only 1) # Do not forget to set BLAS_HOME if it is not in your environnement BLAS_HOME= $(FFBLASINCLUDE ) #---- Blas ---- BLASLIB = $(FFBLASLIB) #@BLASLIBS@ #---- Gotoblas ---- #BLASLIB = -L$(BLAS_HOME) -lgoto #---- MKL ---- # Uncomment the correct line #BLASLIB = -L$(BLAS_HOME) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core #BLASLIB = -L$(BLAS_HOME) -lmkl_intel -lmkl_sequential -lmkl_core #---- Acml ---- #BLASLIB = -L$(BLAS_HOME) -lacml ################################################################### # DO NOT TOUCH # ################################################################### FOPT := $(CCFOPT) FDEB := $(CCFDEB) CCHEAD := $(CCPROG) $(CCTYPES) $(CCFOPT) CCFOPT := $(CCFOPT) $(CCTYPES) $(CCPASTIX) CFDEB := $(CCFDEB) $(CCTYPES) $(CCPASTIX) ################################################################### # MURGE COMPATIBILITY # ################################################################### MAKE = $(MKPROG) CC = $(MPCCPROG) CFLAGS = $(CCTYPES) $(CCFOPT) FC = $(MCFPROG) FFLAGS = $(CCFOPT) LDFLAGS = $(EXTRALIB) $(BLASLIB)freefem++-3.38-1/download/pastix/config-pastix-real.in000644 000767 000024 00000015102 12504553125 022750 0ustar00hechtstaff000000 000000 abs_top_builddir=@abs_top_builddir@ include $(abs_top_builddir)/download/headers-sparsesolver.inc HOSTARCH = @PASTIX_HOSTARCH@ VERSIONBIT = _@SIZEOF_PTRINBIT@bit EXEEXT = OBJEXT = .o LIBEXT = .a WGET = @WGET@ CCPROG = @CC@ -Wall -DX_ARCH$(HOSTARCH) CFPROG = @F77@ CF90PROG = @FC@ MCFPROG = @MPIFC@ CF90CCPOPT = -ffree-form -x f95-cpp-input #avant # Compilation options for optimization (make expor) CCFOPT = -O3 @CFLAGS@ # Compilation options for debug (make | make debug) CCFDEB = -g3 LKFOPT = MKPROG = make # FFCS - add MPI_INCLUDE because FF cannot use the defaut openmpi scripts on MacOS (see # [[file:../../../../configure.ac::mpicc_on_macos]]) MPCCPROG = @MPICC@ -Wall -DX_ARCH$(HOSTARCH) @MPI_INCLUDE@ ARFLAGS = @ARFLAGS@ # ruv ARPROG = @AR@ # ar EXTRALIB = @FLIBS@ -lm -lsupc++ VERSIONMPI = _mpi VERSIONSMP = _smp VERSIONBUB = _nobubble VERSIONINT = _int VERSIONPRC = _simple VERSIONFLT = _real VERSIONORD = _scotch ################################################################### # INTEGER TYPE # ################################################################### # uncomment the following lines for integer type support (Only 1) #VERSIONINT = $(FFVERSIONINT)#_long #CCTYPES = $(FFCTYPESINT)#-DFORCE_LONG -DLONG #--------------------------- VERSIONINT = _int CCTYPES = -DFORCE_INT #--------------------------- #VERSIONINT = _int64 #CCTYPES = -DFORCE_INT64 -DINTSSIZE64 ################################################################### # FLOAT TYPE # ################################################################### # uncomment the following lines for double precision support VERSIONPRC = _double CCTYPES := $(CCTYPES) -DFORCE_DOUBLE -DPREC_DOUBLE # uncomment the following lines for float=complex support #VERSIONFLT = _complex #CCTYPES := $(CCTYPES) -DFORCE_COMPLEX -DTYPE_COMPLEX -DPREC_DOUBLE ################################################################### # Mpi/THREADS # ################################################################### # uncomment the following lines for sequential (NOMPI) version #VERSIONMPI = _nompi #CCTYPES := $(CCTYPES) -DFORCE_NOMPI #MPCCPROG = $(CCPROG) #MCFPROG = $(CFPROG) # uncomment the following lines for non-threaded (NOSMP) version #VERSIONSMP = _nosmp #CCTYPES := $(CCTYPES) -DFORCE_NOSMP # Uncomment the following line to enable a progression thread #CCPASTIX := $(CCPASTIX) -DTHREAD_COMM # Uncomment the following line if your MPI doesn't support MPI_THREAD_MULTIPLE level #CCPASTIX := $(CCPASTIX) -DPASTIX_FUNNELED # Uncomment the following line if your MPI doesn't support MPI_Datatype correctly #CCPASTIX := $(CCPASTIX) -DNO_MPI_TYPE ################################################################### # Options # ################################################################### # Uncomment the following lines for NUMA-aware allocation (recommended) CCPASTIX := $(CCPASTIX) -DNUMA_ALLOC # Show memory usage statistics #CCPASTIX := $(CCPASTIX) -DMEMORY_USAGE # Show memory usage statistics in solver #CCPASTIX := $(CCPASTIX) -DSTATS_SOPALIN # Uncomment following line for dynamic thread scheduling support #CCPASTIX := $(CCPASTIX) -DPASTIX_BUBBLE # Uncomment the following lines for Out-of-core #CCPASTIX := $(CCPASTIX) -DOOC ################################################################### # GRAPH PARTITIONING # ################################################################### CCPASTIX := $(CCPASTIX) $(FFMPIINCLUDE) EXTRALIB := $(EXTRALIB) $(FFMPILIB) # uncomment the following lines for using metis ordering #VERSIONORD = _metis #METIS_HOME = $(abs_top_builddir)/download/ #CCPASTIX := $(CCPASTIX) -DMETIS -I$(METIS_HOME)/include/metis/ #EXTRALIB := $(EXTRALIB) -L$(METIS_HOME)/lib/ -lmetis # Scotch always needed to compile SCOTCH_HOME = # ALH - 4/9/13 - see [[file:../../configure.ac::SCOTCH_INCLUDE]] SCOTCH_INC = @SCOTCH_INCLUDE@ SCOTCH_LIB = $(abs_top_builddir)/download/lib/ # uncomment on of this blocks #scotch CCPASTIX := $(CCPASTIX) -I$(SCOTCH_INC) EXTRALIB := $(EXTRALIB) -L$(SCOTCH_LIB) -lscotch -lscotcherrexit #ptscotch #CCPASTIX := $(CCPASTIX) -I$(SCOTCH_INC) -DDISTRIBUTED #EXTRALIB := $(EXTRALIB) -L$(SCOTCH_LIB) -lptscotch -lscotcherrexit ################################################################### # MARCEL # ################################################################### # Uncomment following lines for marcel thread support #VERSIONSMP := $(VERSIONSMP)_marcel #CCPASTIX := $(CCPASTIX) `pm2-config --cflags` -I${PM2_ROOT}/marcel/include/pthread #EXTRALIB := $(EXTRALIB) `pm2-config --libs` # ---- Thread Posix ------ EXTRALIB := $(EXTRALIB) @LIBSPTHREAD@ # Uncomment following line for bubblesched framework support (need marcel support) #VERSIONBUB = _bubble #CCPASTIX := $(CCPASTIX) -DPASTIX_USE_BUBBLE ################################################################### # BLAS # ################################################################### # Choose Blas library (Only 1) # Do not forget to set BLAS_HOME if it is not in your environnement BLAS_HOME= $(FFBLASINCLUDE ) #---- Blas ---- BLASLIB = $(FFBLASLIB) #@BLASLIBS@ #---- Gotoblas ---- #BLASLIB = -L$(BLAS_HOME) -lgoto #---- MKL ---- # Uncomment the correct line #BLASLIB = -L$(BLAS_HOME) -lmkl_intel_lp64 -lmkl_sequential -lmkl_core #BLASLIB = -L$(BLAS_HOME) -lmkl_intel -lmkl_sequential -lmkl_core #---- Acml ---- #BLASLIB = -L$(BLAS_HOME) -lacml ################################################################### # DO NOT TOUCH # ################################################################### FOPT := $(CCFOPT) FDEB := $(CCFDEB) CCHEAD := $(CCPROG) $(CCTYPES) $(CCFOPT) CCFOPT := $(CCFOPT) $(CCTYPES) $(CCPASTIX) CFDEB := $(CCFDEB) $(CCTYPES) $(CCPASTIX) ################################################################### # MURGE COMPATIBILITY # ################################################################### MAKE = $(MKPROG) CC = $(MPCCPROG) CFLAGS = $(CCTYPES) $(CCFOPT) FC = $(MCFPROG) FFLAGS = $(CCFOPT) LDFLAGS = $(EXTRALIB) $(BLASLIB)freefem++-3.38-1/download/pastix/Makefile000644 000767 000024 00000022451 12536342056 020375 0ustar00hechtstaff000000 000000 # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # http://www.ljll.math.upmc.fr/lehyaric # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=19/03/10 upmc # Downloading and compiling extra libraries # ----------------------------------------- include config.in all-local: pastix # Downloading and compiling pastix # ------------------------------ DIRPKG = ../pkg SRCDIR = pastix_release_$(VERSION) PACKAGE1 = $(DIRPKG)/pastix_release_$(VERSION).tar.bz2 SERVER = https://gforge.inria.fr/frs/download.php/21873/ INSTALL = ../.. VERSION = 2200 VERSIONTYPE=$(VERSIONINT)$(VERSIONPRC)$(VERSIONFLT) VERSIONTYPECOMPLEX=$(VERSIONINT)_complex VERSIONNAME=$(VERSIONBIT)$(VERSIONMPI)$(VERSIONSMP)$(VERSIONBUB)$(VERSIONTYPE)$(VERSIONORD)_$(HOSTARCH) PASTIX_DIR = $(abs_top_builddir)/download/pastix/$(SRCDIR)/install ifneq (,$(findstring libtool,$(ARPROG))) OBJLIBTOOL = $(SRCDIR)/src/sopalin/obj/$(HOSTARCH)/*.o $(SRCDIR)/src/blend/obj/$(HOSTARCH)/*.o $(SRCDIR)/src/fax/obj/$(HOSTARCH)/*.o $(SRCDIR)/src/kass/obj/$(HOSTARCH)/*.o $(SRCDIR)/src/order/obj/$(HOSTARCH)/*.o $(SRCDIR)/src/symbol/obj/$(HOSTARCH)/*.o $(SRCDIR)/src/common/obj/$(HOSTARCH)/*.o else OBJLIBTOOL = endif pastix: FAIRE # FFCS - parallel make rules WHERE: install echo double_pastix LD -L@DIR@/lib/pastix/double -lpastix >$(SRCDIR)/$(INSTALL)/lib/WHERE.pastix ; echo double_pastix INCLUDE -I@DIR@/include/pastix/double >> $(SRCDIR)/$(INSTALL)/lib/WHERE.pastix ; echo complex_pastix LD -L@DIR@/lib/pastix/complex -lpastix >>$(SRCDIR)/$(INSTALL)/lib/WHERE.pastix ; echo complex_pastix INCLUDE -I@DIR@/include/pastix/complex >> $(SRCDIR)/$(INSTALL)/lib/WHERE.pastix ; FAIRE:$(SRCDIR)/FAIT $(MAKE) WHERE touch FAIRE config.in: ../Makefile ../../config.status Makefile ../../config.status --file="config.in:config-pastix-real.in" ../../config.status --file="config-complex.in:config-pastix-complex.in" install:$(SRCDIR)/FAIT $(SRCDIR)/FAIT: $(SRCDIR)/FAITC2 touch $(SRCDIR)/FAIT ## change F. Hecht ## WARNING target $(SRCDIR)/FAITR2 $(SRCDIR)/FAITC2 not in // # => $(SRCDIR)/FAITC2 depend on $(SRCDIR)/FAITR2 $(SRCDIR)/FAITR1: $(SRCDIR)/tag-tar cp config.in $(SRCDIR)/src/ # # FFCS - 16/1/13 - this crashes in parallel # cd $(SRCDIR)/src; $(MAKE) -j1 expor #ifndef (,$(OBJLIBTOOL)) # redefinition of "cd $(SRCDIR)/src; $(MAKE) install" for libtool rm -f $(SRCDIR)/install/pastix*.h $(SRCDIR)/install/pastix*.in $(SRCDIR)/install/murge*.inc $(abs_top_builddir)/download/pastix/$(SRCDIR)/src/utils/bin/${HOSTARCH}/genheader $(PASTIX_DIR)/pastix$(VERSIONTYPE).h $(PASTIX_DIR)/pastix_fortran$(VERSIONTYPE).h \ $(PASTIX_DIR)/murge$(VERSIONTYPE).inc $(SRCDIR)/src/murge/include/murge.h $(SRCDIR)/src/murge/scripts/genfort.pl cat $(SRCDIR)/src/../bin/$(HOSTARCH)/pastix.h >> $(PASTIX_DIR)/pastix$(VERSIONTYPE).h cat $(SRCDIR)/src/common/src/api.h >> $(PASTIX_DIR)/pastix$(VERSIONTYPE).h cat $(SRCDIR)/src/../bin/$(HOSTARCH)/pastix_fortran.inc >> $(PASTIX_DIR)/murge$(VERSIONTYPE).inc ln -sf $(PASTIX_DIR)/pastix$(VERSIONTYPE).h $(PASTIX_DIR)/pastix.h ln -sf $(PASTIX_DIR)/pastix_fortran$(VERSIONTYPE).h $(PASTIX_DIR)/pastix_fortran.h ln -sf $(PASTIX_DIR)/murge$(VERSIONTYPE).inc $(PASTIX_DIR)/murge.inc cp $(SRCDIR)/src/sopalin/src/csc_utils.h $(PASTIX_DIR)/csc_utils$(VERSIONTYPE).h ln -fs $(PASTIX_DIR)/csc_utils$(VERSIONTYPE).h $(PASTIX_DIR)/csc_utils.h cp $(SRCDIR)/src/sopalin/src/cscd_utils.h $(PASTIX_DIR)/cscd_utils${VERSIONTYPE}.h ln -fs $(PASTIX_DIR)/cscd_utils$(VERSIONTYPE).h $(PASTIX_DIR)/cscd_utils.h cp $(SRCDIR)/src/common/src/nompi.h $(PASTIX_DIR)/pastix_nompi.h cp $(SRCDIR)/src/murge/include/murge.h $(PASTIX_DIR)/murge.h $(ARPROG) $(ARFLAGS) $(SRCDIR)/install/libpastix$(VERSIONNAME).a $(OBJLIBTOOL) ranlib $(SRCDIR)/install/libpastix$(VERSIONNAME).a ln -sf $(PASTIX_DIR)/libpastix$(VERSIONNAME).a $(PASTIX_DIR)/libpastix.a cp $(PASTIX_DIR)/../bin/$(HOSTARCH)/libpastix_murge.a $(PASTIX_DIR)/libpastix_murge$(VERSIONNAME).a ln -sf $(PASTIX_DIR)/libpastix_murge$(VERSIONNAME).a $(PASTIX_DIR)/libpastix_murge.a #else #cd $(SRCDIR)/src; $(MAKE) -j1 install #endif touch $(SRCDIR)/FAITR1 $(SRCDIR)/FAITR2: $(SRCDIR)/FAITR1 mkdir -p $(SRCDIR)/$(INSTALL)/include/pastix/double cp $(SRCDIR)/install/*.h $(SRCDIR)/$(INSTALL)/include/pastix/double/ mkdir -p $(SRCDIR)/$(INSTALL)/lib/pastix/double cp $(SRCDIR)/install/*.a $(SRCDIR)/$(INSTALL)/lib/pastix/double/ cd $(SRCDIR)/src/ && $(MAKE) clean touch $(SRCDIR)/FAITR2; $(SRCDIR)/FAITC1:$(SRCDIR)/tag-tar # # complex version # cp config-complex.in $(SRCDIR)/src/config.in # # FFCS - 16/1/13 - this crashes in parallel # cd $(SRCDIR)/src/;$(MAKE) -j1 expor #ifdef ($(OBJLIBTOOL)) rm -f $(SRCDIR)/install/pastix*.h $(SRCDIR)/install/pastix*.in $(SRCDIR)/install/murge*.inc $(abs_top_builddir)/download/pastix/$(SRCDIR)/src/utils/bin/${HOSTARCH}/genheader $(PASTIX_DIR)/pastix$(VERSIONTYPECOMPLEX).h $(PASTIX_DIR)/pastix_fortran$(VERSIONTYPECOMPLEX).h \ $(PASTIX_DIR)/murge$(VERSIONTYPECOMPLEX).inc $(SRDIR)/src/murge/include/murge.h $(SRDIR)/src/murge/scripts/genfort.pl cat $(SRCDIR)/src/../bin/$(HOSTARCH)/pastix.h >> $(PASTIX_DIR)/pastix$(VERSIONTYPECOMPLEX).h cat $(SRCDIR)/src/common/src/api.h >> $(PASTIX_DIR)/pastix$(VERSIONTYPECOMPLEX).h cat $(SRCDIR)/src/../bin/$(HOSTARCH)/pastix_fortran.inc >> $(PASTIX_DIR)/murge$(VERSIONTYPECOMPLEX).inc ln -sf $(PASTIX_DIR)/pastix$(VERSIONTYPECOMPLEX).h $(PASTIX_DIR)/pastix.h ln -sf $(PASTIX_DIR)/pastix_fortran$(VERSIONTYPECOMPLEX).h $(PASTIX_DIR)/pastix_fortran.h ln -sf $(PASTIX_DIR)/murge$(VERSIONTYPECOMPLEX).inc $(PASTIX_DIR)/murge.inc cp $(SRCDIR)/src/sopalin/src/csc_utils.h $(PASTIX_DIR)/csc_utils$(VERSIONTYPECOMPLEX).h ln -fs $(PASTIX_DIR)/csc_utils$(VERSIONTYPECOMPLEX).h $(PASTIX_DIR)/csc_utils.h cp $(SRCDIR)/src/sopalin/src/cscd_utils.h $(PASTIX_DIR)/cscd_utils${VERSIONTYPECOMPLEX}.h ln -fs $(PASTIX_DIR)/cscd_utils$(VERSIONTYPECOMPLEX).h $(PASTIX_DIR)/cscd_utils.h cp $(SRCDIR)/src/common/src/nompi.h $(PASTIX_DIR)/pastix_nompi.h cp $(SRCDIR)/src/murge/include/murge.h $(PASTIX_DIR)/murge.h $(ARPROG) $(ARFLAGS) $(SRCDIR)/install/libpastix$(VERSIONNAME).a $(OBJLIBTOOL) ranlib $(SRCDIR)/install/libpastix$(VERSIONNAME).a ln -sf $(PASTIX_DIR)/libpastix$(VERSIONNAME).a $(PASTIX_DIR)/libpastix.a cp $(PASTIX_DIR)/../bin/$(HOSTARCH)/libpastix_murge.a $(PASTIX_DIR)/libpastix_murge$(VERSIONNAME).a ln -sf $(PASTIX_DIR)/libpastix_murge$(VERSIONNAME).a $(PASTIX_DIR)/libpastix_murge.a #else #cd $(SRCDIR)/src/ && $(MAKE) install -j1 -C $(SRCDIR)/src #endif touch $(SRCDIR)/FAITC1 $(SRCDIR)/FAITC2: $(SRCDIR)/FAITR2 $(SRCDIR)/FAITC1 mkdir -p $(SRCDIR)/$(INSTALL)/include/pastix/complex cp $(SRCDIR)/install/*.h $(SRCDIR)/$(INSTALL)/include/pastix/complex/ mkdir -p $(SRCDIR)/$(INSTALL)/lib/pastix/complex cp $(SRCDIR)/install/*.a $(SRCDIR)/$(INSTALL)/lib/pastix/complex/ (cd $(SRCDIR)/$(INSTALL)/include/pastix/complex/; patch pastix_int_complex.h) +#define pastix_float_t std::complex +extern "C" { + MPI_Datatype GetMpiType() ; +#else #include +#define pastix_float_t double complex +#endif + #define pastix_int_t int #define pastix_uint_t unsigned int #define MPI_PASTIX_INT MPI_INT -#define pastix_float_t double complex #define MPI_PASTIX_FLOAT GetMpiType() #define INT pastix_int_t #define UINT pastix_uint_t @@ -744,3 +753,6 @@ #define MTX_ISRHS(a) (a)[0]!='\0' /* **************************************** */ +#ifdef __cplusplus +} +#endif freefem++-3.38-1/download/parms/Makefile000644 000767 000024 00000003504 12274717221 020204 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- include Makefile.in all-local: parms # Downloading and compiling parms # ------------------------------- # http://www-users.cs.umn.edu/~saad/software/pARMS/pARMS_2.2.php # Parms information DIRPKG=../pkg SRCDIR=pARMS_$(parms_VERSION) PACKAGE=$(DIRPKG)/pARMS_$(parms_VERSION).tar.gz SERVER=http://www-users.cs.umn.edu/~saad/software/pARMS/pARMS_2.2.php INSTALL=../.. parms_VERSION=2.2 parms: FAIRE # FFCS: more dependencies for parallel builds $(SRCDIR)/FAIT:$(SRCDIR) $(MAKE) $(SRCDIR)/$(INSTALL) WHERE touch $(SRCDIR)/FAIT install:$(SRCDIR)/$(INSTALL) FAIRE: $(SRCDIR)/FAIT Makefile.in: ../../config.status Makefile makefile-parms.in ../../config.status --file="Makefile.in:makefile-parms.in" case `uname` in *CYGWIN*) cp Makefile.in Makefile.inn; sed "s/COPTIONS =/COPTIONS = -D__VC__/" Makefile.in; rm Makefile.inn ;; esac $(SRCDIR)/$(INSTALL): $(SRCDIR) cp Makefile.in $(SRCDIR)/makefile.in cd $(SRCDIR); $(MAKE) ./LIB/libparms$(DBG).a mkdir -p ../include/parms cp $(SRCDIR)/INCLUDE/*.h ../include/parms/ cp $(SRCDIR)/LIB/*.a ../lib/ $(SRCDIR): $(PACKAGE) tar xvzf $(PACKAGE) touch $(SRCDIR) $(PACKAGE): ../getall -o pARMS -a clean: -make cleanall -C $(SRCDIR)/src -rm Makefile.in ../lib/WHERE.parms -rm ../lib/libparms.* -rm -rf ../include/parms -rm -rf $(SRCDIR) # # FFCS - make sure that all directories are cleaned. This is especially important under Windows because there is no # compilation dependencies control there (see # [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) # -rm -rf pARMS_* -rm config.log # -rm $(PACKAGE) WHERE: echo parms LD -L@DIR@/lib -lparms$(DBG) >../lib/WHERE.parms echo parms INCLUDE -I@DIR@/include/parms >> ../lib/WHERE.parms .PHONY:$(SRCDIR)/$(INSTALL) freefem++-3.38-1/download/parms/makefile-parms.in000644 000767 000024 00000003401 12500334565 021763 0ustar00hechtstaff000000 000000 abs_top_builddir = @abs_top_builddir@ WGET=@WGET@ # FFCS - let "make clean" work even if include file is not found -include $(abs_top_builddir)/download/headers-sparsesolver.inc # path for this directory PARMS_ROOT = $(abs_top_builddir)/download/parms/pARMS_2.2 # name used for architecture ARCH = LINUX DARCH = -D$(ARCH) # variable to declare optimization level # use '-g' to create libparms for debugging purposes DBG = -O3 # to make pARMS name compatible with other linear algebra software # such as PETSc, assign DCHNAME as: DCHNAME = -DPETSC DCHNAME = # archive command AR = @AR@ #ar ARFLAGS = @ARFLAGS@ #cr #==================================================================== #==================================================================== # Options for a generic LINUX configuration ################################# CC = @MPICC@ # FFCS - "-I MPI_INC_DIR" required on MacOS 10.8 MacPorts+OpenMPI CFLAGS = $(DBG) $(DARCH) $(DCHNAME) @CFLAGS@ -I "@MPI_INC_DIR@" INCLUDE_METIS = #-I METIS_HOME = #-L/Users/morice/work/ParMetis-3.1.1/ -lparmetis -lmetis # fortran compiler / linker FC = @MPIFC@ # ALH - add no-range-check for Windows (hexadecimal parameter constants like # [[file:c:/cygwin/home/alh/ffcs/rel/mingw/mpif.h::PARAMETER MPI_SHORT_INT z 8c000003]] # are rejected without this. See [[file:../../configure.ac::NO_RANGE_CHECK]] FFLAGS = $(DBG) $(DARCH) @FFLAGS@ @NO_RANGE_CHECK@ # the directory of MPI library. for example -L/usr/local/mpich/lib LFLAGS_MPI = $(FFMPIINCLUDE) # the mpi library LIBS_MPI = $(FFMPILIB) # the directory of BLAS LFLAGS_BLAS = $(FFBLASINCLUDE) # the BLAS library LIBS_BLAS = $(FFBLASLIB) @LIBSPTHREAD@ #LINKER LINKER = $(FC) #LINK OPTION LINK_OPT = #-nofor_main pour ifort compiler freefem++-3.38-1/download/parmetis/makefile000755 000767 000024 00000013675 12505101023 020743 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- include Makefile.in all-local: parmetis # Downloading and compiling Tetgen # ------------------------------ # http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.tar.gz # Parmetis information DIRPKG=../pkg SRCDIR=parmetis-$(parmetis_VERSION) PACKAGE=$(DIRPKG)/ParMetis-$(parmetis_VERSION).tar.gz SERVER=http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis INSTALL=../.. parmetis_VERSION=4.0.3 parmetis: FAIRE $(SRCDIR)/FAIT: $(MAKE) install.done touch $(SRCDIR)/FAIT install.done:$(SRCDIR)/tag-compile -mkdir -p ../include/parmetis -mkdir -p ../lib/parmetis test -z "$(MPIRUN)" || cp $(SRCDIR)/libparmetis.a ../lib/parmetis cp $(SRCDIR)/libmetis.a ../lib/parmetis cp $(SRCDIR)/include/*.h ../include/parmetis cp $(SRCDIR)/metis/include/*.h ../include/parmetis touch $@ FAIRE: $(SRCDIR)/FAIT $(MAKE) WHERE touch FAIRE METISCFLAGS=$(FLAGS_REGEX_H) $(CFLAGS) -I../GKlib -I../include -I. -D__thread= PMETISCFLAGS=$(MPI_INCLUDE) $(FLAGS_REGEX_H) $(CFLAGS) -I../metis/GKlib -I../metis/include -I../include -I. -D__thread= $(SRCDIR)/tag-compile: $(SRCDIR)/tags make -C $(SRCDIR)/metis/libmetis $(OBJS_METIS) "CC=$(CC)" "CFLAGS=$(METISCFLAGS)" make -C $(SRCDIR)/metis/GKlib $(OBJS_GK) "CC=$(CC)" CFLAGS="$(METISCFLAGS) -Dmetis_EXPORTS" test -z "$(MPIRUN)" || make -C $(SRCDIR)/libparmetis $(OBJS_PARMETIS) "CC=$(CC)" "CFLAGS=$(PMETISCFLAGS)" -mkdir $(SRCDIR)/lib cd $(SRCDIR); $(AR) libmetis.a metis/libmetis/*.o metis/GKlib/*.o test -z "$(MPIRUN)" ||(cd $(SRCDIR); $(AR) libparmetis.a libparmetis/*.o ) touch $(SRCDIR)/tag-compile WHERE: install.done -if [ -f $(SRCDIR)/FAIT ] ; then \ test -z "$(MPIRUN)" ||echo parmetis LD -L@DIR@/lib/parmetis -lparmetis -lmetis >$(SRCDIR)/$(INSTALL)/lib/WHERE.parmetis ;\ test -z "$(MPIRUN)" ||echo parmetis INCLUDE -I@DIR@/include/parmetis >> $(SRCDIR)/$(INSTALL)/lib/WHERE.parmetis ;\ echo metis LD -L@DIR@/lib/parmetis -lmetis >$(SRCDIR)/$(INSTALL)/lib/WHERE.metis ;\ echo metis INCLUDE -I@DIR@/include/parmetis >> $(SRCDIR)/$(INSTALL)/lib/WHERE.metis ;\ touch $@ ;\ fi OBJS_METIS=auxapi.o coarsen.o fm.o graph.o kwayrefine.o minconn.o options.o separator.o timing.o \ balance.o compress.o fortran.o initpart.o mcutil.o mincover.o parmetis.o sfm.o util.o \ bucketsort.o contig.o frename.o kmetis.o mesh.o mmd.o pmetis.o srefine.o wspace.o \ checkgraph.o debug.o gklib.o kwayfm.o meshpart.o ometis.o refine.o stat.o OBJS_GK=b64.o error.o fs.o graph.o itemsets.o omp.o random.o sort.o tokenizer.o \ blas.o evaluate.o getopt.o htable.o mcore.o pdb.o rw.o string.o util.o \ csr.o fkvkselect.o gkregex.o io.o memory.o pqueue.o seq.o timers.o OBJS_PARMETIS=akwayfm.o diffutil.o initpart.o move.o renumber.o wave.o \ ametis.o frename.o kmetis.o msetup.o rmetis.o weird.o \ balancemylink.o gkmetis.o kwayrefine.o node_refine.o selectq.o wspace.o \ comm.o gkmpi.o match.o ometis.o serial.o xyzpart.o \ csrmatch.o graph.o mdiffusion.o pspases.o stat.o \ ctrl.o initbalance.o mesh.o redomylink.o timer.o \ debug.o initmsection.o mmetis.o remap.o util.o # FFCS: patch is necessary for metis 4.0, but not for 4.0.3 $(SRCDIR)/tags: $(PACKAGE) tar xvzf $(PACKAGE) patch -p1 ../include/parmetis/metis.h # # FFCS - 23/5/12 - cannot keep name libmetis.a because it is identical to the library created by # [[file:../metis/Makefile]] and library path mechanisms at link time pick one for the other on MinGW. mv $(SRCDIR)/$(INSTALL)/lib/parmetis/libmetis.a $(SRCDIR)/$(INSTALL)/lib/parmetis/libmetis.a # -cd $(SRCDIR)/Programs && make touch $@ # FFCS - simpler makefile WHERE.done:install.done echo parmetis LD -L@DIR@/lib/parmetis -lparmetis -lmetis >$(SRCDIR)/$(INSTALL)/lib/WHERE.parmetis ; echo parmetis INCLUDE -I@DIR@/include/parmetis >> $(SRCDIR)/$(INSTALL)/lib/WHERE.parmetis ; touch $@ Makefile.in: ../../config.status Makefile-parmetis.in ../../config.status --file="Makefile.in:Makefile-parmetis.in" $(SRCDIR)/tags-old: $(PACKAGE) tar xvzf $(PACKAGE) mv $(SRCDIR)/Programs/Makefile $(SRCDIR)/Programs/Makefile-orig sed -e 's;BINDIR = .*$$;BINDIR = ../$(INSTALL)/bin;' \ -e 's;../libparmetis.a;../$(INSTALL)/lib/parmetis/libparmetis.a;' \ -e 's;../libmetis.a;../$(INSTALL)/lib/parmetis/libmetis.a;' \ -e 's;-L[.][.];-L../$(INSTALL)/lib/parmetis;' \ <$(SRCDIR)/Programs/Makefile-orig \ >$(SRCDIR)/Programs/Makefile mv $(SRCDIR)/ParMETISLib/Makefile $(SRCDIR)/ParMETISLib/Makefile-orig sed -e 's;../libparmetis.a;../$(INSTALL)/lib/parmetis/libparmetis.a;' \ -e 's;../libmetis.a;../$(INSTALL)/lib/parmetis/libmetis.a;' \ <$(SRCDIR)/ParMETISLib/Makefile-orig \ >$(SRCDIR)/ParMETISLib/Makefile mv $(SRCDIR)/METISLib/Makefile $(SRCDIR)/METISLib/Makefile-orig sed -e 's;../libparmetis.a;../$(INSTALL)/lib/parmetis/libparmetis.a;' \ -e 's;../libmetis.a;../$(INSTALL)/lib/parmetis/libmetis.a;' \ <$(SRCDIR)/METISLib/Makefile-orig \ >$(SRCDIR)/METISLib/Makefile touch $(SRCDIR)/tags $(PACKAGE): ../getall -o ParMETIS -a # FFCS - 23/5/12 - corrected bug in removing .a from ../lib clean: -cd $(SRCDIR) && $(MAKE) realclean -C $(SRCDIR) -rm Makefile.in $(SRCDIR)/tags -rm -rf ../lib/parmetis -rm -rf ../include/parmetis # -rm -rf ../include/metis -rm -rf $(SRCDIR) -rm *.done freefem++-3.38-1/download/parmetis/Makefile-parmetis.in000644 000767 000024 00000001367 12505040155 023132 0ustar00hechtstaff000000 000000 # Which compiler to use CC = @CC@ LD= @CC@ # What optimization level to use OPTFLAGS = @CFLAGS@ CFLAGS = @CFLAGS@ MPI_INCLUDE=@MPI_INCLUDE@ MPI_LIBC=@MPI_LIBC@ MPIRUN=@MPIRUN@ # What options to be used by the compiler # FFCS - add path to mpi.h (required for MacOS 10.8 + MacPorts OpenMPI) COPTIONS = -DHAVE_CONFIG_H -I. -I../../../.. -I'@MPI_INC_DIR@' @FFMETIS_CFLAGS@ #-D_MSC_VER # What options to be used by the loader LDOPTIONS = @LDFLAGS@ XTRALIBS= @MPI_LIBC@ # What archiving to use AR = @AR@ @ARFLAGS@ # What to use for indexing the archive RANLIB = @RANLIB@ #RANLIB = ar -ts #RANLIB = WGET = @WGET@ # hack to set -DUSE_GKREGEX if no regex.h => FF_HAVE_REGEX_H=0 USE_GKREGEX0=-DUSE_GKREGEX FLAGS_REGEX_H=$(USE_GKREGEX@FF_HAVE_REGEX_H@) freefem++-3.38-1/download/parmetis/parmetis-4.0.3.patch000644 000767 000024 00000002327 12505101023 022535 0ustar00hechtstaff000000 000000 --- a/parmetis-4.0.3/metis/GKlib/gk_arch.h 2015-03-12 18:55:30.000000000 +0100 +++ b/parmetis-4.0.3/metis/GKlib/gk_arch.h 2015-03-12 20:27:25.000000000 +0100 @@ -41,7 +41,9 @@ #endif #include #include - #include +#ifndef __WIN32__ + #include +#endif #include #endif --- a/parmetis-4.0.3/metis/GKlib/gk_getopt.h 2013-03-30 17:24:50.000000000 +0100 +++ b/parmetis-4.0.3/metis/GKlib/gk_getopt.h 2015-03-26 14:26:48.000000000 +0100 @@ -52,11 +52,11 @@ /* Function prototypes */ -extern int gk_getopt(int __argc, char **__argv, char *__shortopts); -extern int gk_getopt_long(int __argc, char **__argv, char *__shortopts, - struct gk_option *__longopts, int *__longind); -extern int gk_getopt_long_only (int __argc, char **__argv, - char *__shortopts, struct gk_option *__longopts, int *__longind); +extern int gk_getopt(int argc, char **argv, char *shortopts); +extern int gk_getopt_long(int argc, char **argv, char *shortopts, + struct gk_option *longopts, int *longind); +extern int gk_getopt_long_only (int argc, char **argv, + char *shortopts, struct gk_option *longopts, int *longind); freefem++-3.38-1/download/nlopt/Make.inc000644 000767 000024 00000000165 12471317177 020133 0ustar00hechtstaff000000 000000 FFDOWNLOAD=@abs_builddir@/download CC=@CC@ CXX=@CXX@ WGET=@WGET@ CXXFLAGS=@CXXFLAGS@ CFLAGS=@CFLAGS@ CXXCPP=@CXXCPP@ freefem++-3.38-1/download/nlopt/Makefile000644 000767 000024 00000003006 12471320351 020204 0ustar00hechtstaff000000 000000 URL="http://ab-initio.mit.edu/nlopt/nlopt-2.2.4.tar.gz" SRCDIR=nlopt-2.2.4 TARGZ=../pkg/$(SRCDIR).tar.gz -include Make.defs all: FAIRE FAIRE: ../pkg $(SRCDIR)/FAIT $(SRCDIR)/FAIT: $(TARGZ) tar zxvf $(TARGZ) # # FFCS - 30/11/11 - "--disable-dependency-tracking": dependencies pose problem on mixed Cygwin/MinGW setups # because of slashes and backslashes # # FFCS - 22/10/12 - Fred - "--without-octave": patch for one machine that has octave installed on it: building of # nlopt fails because it wants to install the octave components. Not a bad idea in general but probably not when # building ffcs. # #remove c++11 flags for windfows FH .. cxxflags=`echo $(CXXFLAGS) |sed -e 's/[-]std=c[+][+]11//g'` ; \ cd $(SRCDIR) && ./configure --disable-dependency-tracking --with-cxx --prefix="$(FFDOWNLOAD)" CXX="$(CXX)" \ CXXFLAGS="$(CXXFLAGS)" CC="$(CC)" CFLAGS="$(CFLAGS)" CPP="$$cxxflag" "--without-threadlocal" "--without-octave" # # FFCS - 30/11/11 - we need to know when the building process breaks # cd $(SRCDIR) && $(MAKE) install touch $(SRCDIR)/FAIT $(MAKE) WHERE ../pkg: mkdir $@ $(TARGZ): ../getall -o NLopt -a clean-local: rm -rf $(SRCDIR) Make.defs rm -f ../lib/libnlopt_cxx* ../lib/WHERE.nlopt rm -f ../include/nlopt* clean:clean-local WHERE: -if [ -f $(SRCDIR)/FAIT ] ; then \ echo nlopt LD -L@DIR@/lib -lnlopt_cxx >../lib/WHERE.nlopt ;\ echo nlopt INCLUDE -I@DIR@/include >> ../lib/WHERE.nlopt ;\ fi Make.defs: ../../config.status Makefile Make.inc ../../config.status --file="Make.defs:Make.inc" freefem++-3.38-1/download/mumps-seq/Makefile000644 000767 000024 00000005732 12500244365 021012 0ustar00hechtstaff000000 000000 # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # http://www.ljll.math.upmc.fr/lehyaric # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=19/03/10 upmc # Downloading and compiling extra libraries # ----------------------------------------- include Makefile.inc all-local: mumps mumps:../lib/WHERE.mumpsseq # Downloading and compiling mumps # ------------------------------- DIRPKG=../pkg SRCDIR=MUMPS_$(VERSION) PACKAGE1=$(DIRPKG)/MUMPS_$(VERSION).tar.gz INSTALL=../.. VERSION=5.0.0 # FFCS - install and WHERE need to be done sequentially, even in parallel builds ../lib/WHERE.mumpsseq: install.done echo mumps-seq LD -L@DIR@/lib -ldmumpsFREEFEM-SEQ -lzmumpsFREEFEM-SEQ -lmumps_commonFREEFEM-SEQ \ -lpordFREEFEM-SEQ $(LIBSPTHREAD) > ../lib/WHERE.mumpsseq echo mumps-seq INCLUDE -I@DIR@/include/libseq >> ../lib/WHERE.mumpsseq echo libseq LD -L@DIR@/lib -lmpiseqFREEFEM-SEQ >>../lib/WHERE.mumpsseq echo libseq INCLUDE -I@DIR@/include/libseq >> ../lib/WHERE.mumpsseq install.done: $(SRCDIR)/FAIT -mkdir -p ../include/libseq cp $(SRCDIR)/include/*.h ../include/libseq cp $(SRCDIR)/libseq/*.h ../include/libseq -mkdir -p ../lib cp $(SRCDIR)/lib/*.a ../lib/ cp $(SRCDIR)/libseq/libmpiseqFREEFEM-SEQ.a ../lib/ touch $@ $(SRCDIR)/FAIT:Makefile.inc cp Makefile.inc $(SRCDIR) # # FFCS - 22/5/12 - Mumps has difficulties compiling d & z in parallel # cd $(SRCDIR) && $(MAKE) d cd $(SRCDIR) && $(MAKE) z touch $@ Makefile.inc: ../../config.status Makefile Makefile-mumps-$(VERSION).inc $(SRCDIR)/tag-tar ../../config.status --file="Makefile.inc:Makefile-mumps-$(VERSION).inc" $(SRCDIR)/tag-tar:$(PACKAGE1) tar xvzf $(PACKAGE1) touch $@ $(PACKAGE1): ../getall -o MUMPS -a clean: -rm Makefile.inc FAIRE* *~ -rm -rf ../include/*mumps* -rm -rf ../lib/lib*mumps*SEQ* ../lib/libpord*SEQ.a ../lib/libmpiseq*SEQ.a ../lib/WHERE.mumpsseq -rm -rf $(SRCDIR) -rm *.done config.log # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/mumps-seq/Makefile-mumps-5.0.0.inc000644 000767 000024 00000013366 12477570412 023371 0ustar00hechtstaff000000 000000 abs_top_builddir=@abs_top_builddir@ DOWNLOADFF= $(abs_top_builddir)/download # # This file is part of MUMPS 4.10.0, built on Tue May 10 12:56:32 UTC 2011 # ################################################################################ # # Makefile.inc.generic # # This defines some parameters dependent on your platform; you should # look for the approriate file in the directory ./Make.inc/ and copy it # into a file called Makefile.inc. For example, from the MUMPS root # directory, use # "cp Make.inc/Makefile.inc.generic ./Makefile.inc" # (see the main README file for details) # # If you do not find any suitable Makefile in Makefile.inc, use this file: # "cp Make.inc/Makefile.inc.generic ./Makefile.inc" and modify it according # to the comments given below. If you manage to build MUMPS on a new platform, # and think that this could be useful to others, you may want to send us # the corresponding Makefile.inc file. # ################################################################################ ######################################################################## #Begin orderings # # NOTE that PORD is distributed within MUMPS by default. If you would like to # use other orderings, you need to obtain the corresponding package and modify # the variables below accordingly. # For example, to have Metis available within MUMPS: # 1/ download Metis and compile it # 2/ uncomment (suppress # in first column) lines # starting with LMETISDIR, LMETIS # 3/ add -Dmetis in line ORDERINGSF # ORDERINGSF = -Dpord -Dmetis # 4/ Compile and install MUMPS # make clean; make (to clean up previous installation) # # Metis/ParMetis and SCOTCH/PT-SCOTCH (ver 5.1 and later) orderings are now available for MUMPS. # SCOTCHDIR = $(DOWNLOADFF)/ ISCOTCH = #-I$(SCOTCHDIR)/include/scotch # You have to choose one among the following two lines depending on # the type of analysis you want to perform. If you want to perform only # sequential analysis choose the first (remember to add -Dscotch in the ORDERINGSF # variable below); for both parallel and sequential analysis choose the second # line (remember to add -Dptscotch in the ORDERINGSF variable below) #LSCOTCH = -L$(SCOTCHDIR)/lib/scotch/ -lesmumps -lscotch -lscotcherr LSCOTCH = #-L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr LPORDDIR = $(topdir)/PORD/lib/ IPORD = -I$(topdir)/PORD/include/ LPORD = -L$(LPORDDIR) -lpord LMETISDIR = $(DOWNLOADFF) #IMETIS = # Metis doesn't need include files (Fortran interface avail.) # You have to choose one among the following two lines depending on # the type of analysis you want to perform. If you want to perform only # sequential analysis choose the first (remember to add -Dmetis in the ORDERINGSF # variable below); for both parallel and sequential analysis choose the second # line (remember to add -Dparmetis in the ORDERINGSF variable below) LMETIS = # -L$(LMETISDIR)/lib -lparmetis -lmetis # The following variables will be used in the compilation process. # Please note that -Dptscotch and -Dparmetis imply -Dscotch and -Dmetis respectively. #ORDERINGSF = -Dscotch -Dmetis -Dpord -Dptscotch -Dparmetis ORDERINGSF = -Dpord ORDERINGSC = $(ORDERINGSF) LORDERINGS = $(LMETIS) $(LPORD) $(LSCOTCH) IORDERINGSF = $(ISCOTCH) IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH) #End orderings ######################################################################## # DEFINE HERE SOME COMMON COMMANDS, THE COMPILER NAMES, ETC... # PLAT : use it to add a default suffix to the generated libraries PLAT = FREEFEM-SEQ # Library extension, + C and Fortran "-o" option # may be different under Windows LIBEXT = .a OUTC = -o OUTF = -o # RM : remove files RM = /bin/rm -f # CC : C compiler CC = @CC@ # FC : Fortran 90 compiler FC = @FC@ # FL : Fortran linker FL = @FC@ # AR : Archive object in a library # keep a space at the end if options have to be separated from lib name AR = @AR@ @ARFLAGS@ # RANLIB : generate index of an archive file # (optionnal use "RANLIB = echo" in case of problem) RANLIB = @RANLIB@ #RANLIB = echo # SCALAP should define the SCALAPACK and BLACS libraries. #SCALAPDIR = $(DOWNLOADFF)/lib/scalapack/ #SCALAP = $(FFBLASLIB) -L$(SCALAPDIR) -lscalapack -L$(DOWNLOADFF)/lib/blacs/ -lblacs_MPI-$(PLAT)-0 -lblacsF77init_MPI-$(PLAT)-0 -lblacsCinit_MPI-$(PLAT)-0 # INCLUDE DIRECTORY FOR MPI #INCPAR = $(FFMPIINCLUDE) # LIBRARIES USED BY THE PARALLEL VERSION OF MUMPS: $(SCALAP) and MPI LIBPAR = #$(SCALAP) $(FFMPILIB) # The parallel version is not concerned by the next two lines. # They are related to the sequential library provided by MUMPS, # to use instead of ScaLAPACK and MPI.l INCSEQ = -I$(DOWNLOADFF)/mumps-seq/MUMPS_5.0.0/libseq LIBSEQ = -L$(DOWNLOADFF)//mumps-seq/MUMPS_5.0.0/libseq -lmpiseq$(PLAT) # DEFINE HERE YOUR BLAS LIBRARY LIBBLAS = @BLASLIBS@ # DEFINE YOUR PTHREAD LIBRARY LIBOTHERS = @LIBSPTHREAD@ @FLIBS@ $(FFLIBOTHERSMUMPS) LIBSPTHREAD = @LIBSPTHREAD@ # FORTRAN/C COMPATIBILITY: # Use: # -DAdd_ if your Fortran compiler adds an underscore at the end # of symbols, # -DAdd__ if your Fortran compiler adds 2 underscores, # # -DUPPER if your Fortran compiler uses uppercase symbols # # leave empty if your Fortran compiler does not change the symbols. # CDEFS = @CFLAGSF77@ #COMPILER OPTIONS OPTF = -O @FFLAGS@ OPTC = -O -I. @CFLAGS@ OPTL = -O @FFLAGS@ # CHOOSE BETWEEN USING THE SEQUENTIAL OR THE PARALLEL VERSION. #Sequential: INCS = $(INCSEQ) LIBS = $(LIBSEQ) LIBSEQNEEDED = libseqneeded #Parallel: #INCS = $(INCPAR) #LIBS = $(LIBPAR) #LIBSEQNEEDED = libseqneeded WGET = @WGET@ # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/mumps/Makefile000644 000767 000024 00000006024 12500244075 020215 0ustar00hechtstaff000000 000000 # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # http://www.ljll.math.upmc.fr/lehyaric # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=19/03/10 upmc include Makefile.inc all-local: mumps # Downloading and compiling mumps # ------------------------------- DIRPKG=../pkg SRCDIR=MUMPS_$(VERSION) PACKAGE1=$(DIRPKG)/MUMPS_$(VERSION).tar.gz VERSION=5.0.0 mumps:../lib/WHERE.mumps $(SRCDIR)/FAIT: $(SRCDIR)/tag-tar cp Makefile.inc $(SRCDIR) # # ALH - 'd' and 'z' versions need to be made sequentially # cd $(SRCDIR);make d cd $(SRCDIR);make z touch $@ # ALH - WHERE was not built properly during a full compile from a clean source. This goal has been rewritten to solve # this issue. ../lib/WHERE.mumps:install.done echo mumps LD -L@DIR@/lib -ldmumpsFREEFEM -lzmumpsFREEFEM -lmumps_commonFREEFEM -lpordFREEFEM $(LIBSPTHREAD) > $@ echo mumps INCLUDE -I@DIR@/include >> $@ install.done:$(SRCDIR)/FAIT -mkdir -p ../include/libseq cp $(SRCDIR)/include/*.h ../include/ cp $(SRCDIR)/libseq/*.h ../include/libseq -mkdir -p ../lib cp $(SRCDIR)/lib/*.a ../lib/ cp $(SRCDIR)/libseq/libmpiseqFREEFEM.a ../lib/ touch $@ FAIRE-$(VERSION):WHERE touch FAIRE-$(VERSION) # ALH - "make d" and "make z" need to be done sequentially $(SRCDIR)/FAIT:$(SRCDIR)/tag-tar Makefile.inc cp Makefile.inc $(SRCDIR) cd $(SRCDIR) && $(MAKE) d cd $(SRCDIR) && $(MAKE) z touch $@ Makefile.inc:../../config.status Makefile Makefile-mumps-$(VERSION).inc ../../config.status --file="Makefile.inc:Makefile-mumps-$(VERSION).inc" $(SRCDIR)/tag-tar:$(PACKAGE1) tar xvzf $(PACKAGE1) #patch -d MUMPS_$(VERSION) -p 1 < MUMPS_$(VERSION).patch touch $(SRCDIR)/tag-tar clean:clean-local clean-local: #FH -cd $(SRCDIR) && $(MAKE) clean -C $(SRCDIR) -rm Makefile.inc FAIRE* ../lib/WHERE.mumps -rm -rf ../include/*mumps* -rm -rf ../lib/lib*mumpsFREEFEM* ../lib/libpordFREEFEM.a ../lib/libmpiseqFREEFEM.a -rm -rf $(SRCDIR) # -rm $(PACKAGE1) -rm config.log *.done # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/mumps/Makefile-mumps-5.0.0.inc000644 000767 000024 00000013544 12500252602 022562 0ustar00hechtstaff000000 000000 abs_top_builddir=@abs_top_builddir@ DOWNLOADFF= $(abs_top_builddir)/download # # This file is part of MUMPS 5.0.0, built on Tue May 10 12:56:32 UTC 2011 # ################################################################################ # # Makefile.inc.generic # # This defines some parameters dependent on your platform; you should # look for the approriate file in the directory ./Make.inc/ and copy it # into a file called Makefile.inc. For example, from the MUMPS root # directory, use # "cp Make.inc/Makefile.inc.generic ./Makefile.inc" # (see the main README file for details) # # If you do not find any suitable Makefile in Makefile.inc, use this file: # "cp Make.inc/Makefile.inc.generic ./Makefile.inc" and modify it according # to the comments given below. If you manage to build MUMPS on a new platform, # and think that this could be useful to others, you may want to send us # the corresponding Makefile.inc file. # ################################################################################ ######################################################################## #Begin orderings # # NOTE that PORD is distributed within MUMPS by default. If you would like to # use other orderings, you need to obtain the corresponding package and modify # the variables below accordingly. # For example, to have Metis available within MUMPS: # 1/ download Metis and compile it # 2/ uncomment (suppress # in first column) lines # starting with LMETISDIR, LMETIS # 3/ add -Dmetis in line ORDERINGSF # ORDERINGSF = -Dpord -Dmetis # 4/ Compile and install MUMPS # make clean; make (to clean up previous installation) # # Metis/ParMetis and SCOTCH/PT-SCOTCH (ver 5.1 and later) orderings are now available for MUMPS. # SCOTCHDIR = $(DOWNLOADFF)/ ISCOTCH = -I$(SCOTCHDIR)/include/scotch # You have to choose one among the following two lines depending on # the type of analysis you want to perform. If you want to perform only # sequential analysis choose the first (remember to add -Dscotch in the ORDERINGSF # variable below); for both parallel and sequential analysis choose the second # line (remember to add -Dptscotch in the ORDERINGSF variable below) #LSCOTCH = -L$(SCOTCHDIR)/lib/scotch/ -lesmumps -lscotch -lscotcherr LSCOTCH = -L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr LPORDDIR = $(topdir)/PORD/lib/ IPORD = -I$(topdir)/PORD/include/ LPORD = -L$(LPORDDIR) -lpord LMETISDIR = $(DOWNLOADFF) #IMETIS = # Metis doesn't need include files (Fortran interface avail.) # You have to choose one among the following two lines depending on # the type of analysis you want to perform. If you want to perform only # sequential analysis choose the first (remember to add -Dmetis in the ORDERINGSF # variable below); for both parallel and sequential analysis choose the second # line (remember to add -Dparmetis in the ORDERINGSF variable below) LMETIS = #-L$(LMETISDIR)/lib -lparmetis -lmetis # The following variables will be used in the compilation process. # Please note that -Dptscotch and -Dparmetis imply -Dscotch and -Dmetis respectively. ORDERINGSF = -Dscotch -Dpord #ORDERINGSF = -Dscotch -Dmetis -Dpord -Dptscotch -Dparmetis #ORDERINGSF = -Dpord ORDERINGSC = $(ORDERINGSF) LORDERINGS = $(LMETIS) $(LPORD) $(LSCOTCH) IORDERINGSF = $(ISCOTCH) IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH) #End orderings ######################################################################## # DEFINE HERE SOME COMMON COMMANDS, THE COMPILER NAMES, ETC... # PLAT : use it to add a default suffix to the generated libraries PLAT = FREEFEM # Library extension, + C and Fortran "-o" option # may be different under Windows LIBEXT = .a OUTC = -o OUTF = -o # RM : remove files RM = /bin/rm -f # CC : C compiler CC = @CC@ # FC : Fortran 90 compiler FC = @FC@ # FL : Fortran linker FL = @FC@ # AR : Archive object in a library # keep a space at the end if options have to be separated from lib name AR = @AR@ @ARFLAGS@ # RANLIB : generate index of an archive file # (optionnal use "RANLIB = echo" in case of problem) RANLIB = @RANLIB@ #RANLIB = echo # SCALAP should define the SCALAPACK and BLACS libraries. SCALAPDIR = $(DOWNLOADFF)/lib/scalapack/ SCALAP = $(FFBLASLIB) -L$(SCALAPDIR) -lscalapack -L$(DOWNLOADFF)/lib/blacs/ -lblacs_MPI-$(PLAT)-0 -lblacsF77init_MPI-$(PLAT)-0 -lblacsCinit_MPI-$(PLAT)-0 # INCLUDE DIRECTORY FOR MPI INCPAR = $(FFMPIINCLUDE) # LIBRARIES USED BY THE PARALLEL VERSION OF MUMPS: $(SCALAP) and MPI LIBPAR = $(SCALAP) $(FFMPILIB) # The parallel version is not concerned by the next two lines. # They are related to the sequential library provided by MUMPS, # to use instead of ScaLAPACK and MPI. INCSEQ = -I$(topdir)/libseq LIBSEQ = -L$(topdir)/libseq -lmpiseq # DEFINE HERE YOUR BLAS LIBRARY LIBBLAS = @BLASLIBS@ # DEFINE YOUR PTHREAD LIBRARY LIBOTHERS = @LIBSPTHREAD@ @FLIBS@ $(FFLIBOTHERSMUMPS) LIBSPTHREAD = @LIBSPTHREAD@ # FORTRAN/C COMPATIBILITY: # Use: # -DAdd_ if your Fortran compiler adds an underscore at the end # of symbols, # -DAdd__ if your Fortran compiler adds 2 underscores, # # -DUPPER if your Fortran compiler uses uppercase symbols # # leave empty if your Fortran compiler does not change the symbols. # CDEFS = @CFLAGSF77@ #COMPILER OPTIONS # FFCS - 23/4/13 - -fno-range-check required on MinGW to compile with # Microsoft MPI. mpif.h contains INTEGER MPI_FLOAT_INT / PARAMETER # (MPI_FLOAT_INT=z'8c000000') which requires this. OPTF = -O @FFLAGS@ @MPI_INCLUDE@ @NO_RANGE_CHECK@ OPTC = -O -I. @CFLAGS@ @MPI_INCLUDE@ OPTL = -O @FFLAGS@ @MPI_LIBFC@ # CHOOSE BETWEEN USING THE SEQUENTIAL OR THE PARALLEL VERSION. #Sequential: #INCS = $(INCSEQ) #LIBS = $(LIBSEQ) #LIBSEQNEEDED = libseqneeded #Parallel: INCS = $(INCPAR) LIBS = $(LIBPAR) LIBSEQNEEDED = libseqneeded WGET = @WGET@freefem++-3.38-1/download/mshmet/Makefile000755 000767 000024 00000005563 12305574254 020373 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- all-local: mshmet include ff-flags # Downloading and compiling mshmet # ------------------------------- # DIRPKG= ../pkg SRCDIR= ./mshmet$(mshmet_VERSION) #-$(mshmet_VERSION) PACKAGE=$(DIRPKG)/mshmet$(mshmet_VERSION).tgz SERVER=http://www.ann.jussieu.fr/~frey/ftp/archives/ INSTALL=../.. mshmet_VERSION=.2012.04.25 FAIRE=$(SRCDIR)/FAIRE # ---------------------- # mshmetlib MSHMET_DIR = $(abs_top_builddir)/download/mshmet/mshmet$(mshmet_VERSION) MSHMET_SRCDIRNOLIB = $(MSHMET_DIR)/sources MSHMET_SRCDIR = $(MSHMET_DIR)/sourceslib MSHMET_OBJDIR = $(MSHMET_DIR)/objects mshmet: $(FAIRE) $(FAIRE):$(SRCDIR)/FAIT $(MAKE) WHERE $(SRCDIR)/$(INSTALL) touch $(FAIRE) $(SRCDIR)/FAIT:$(SRCDIR)/tag-tar cd $(MSHMET_DIR); $(MAKE) touch $(SRCDIR)/FAIT # FFCS - libMesh is also required by yams, so we move all the rules to [[file:../../../Makefile.am]] install:$(SRCDIR)/FAIT cp $(MSHMET_SRCDIR)/mshmetlib.h $(SRCDIR)/$(INSTALL)/include/mshmetlib.h cp $(MSHMET_OBJDIR)/libmshmet.a $(SRCDIR)/$(INSTALL)/lib/libmshmet.a # FFCS - simplify makefile structure for automatic rebuilds WHERE:install echo mshmet LD -L@DIR@/lib -lmshmet >$(SRCDIR)/$(INSTALL)/lib/WHERE.mshmet echo mshmet INCLUDE -I@DIR@/include>> $(SRCDIR)/$(INSTALL)/lib/WHERE.mshmet $(SRCDIR)/tag-tar: $(PACKAGE) mshmetlib-internal.h mshmetlib.c mshmetlib.h -mkdir mshmet$(mshmet_VERSION) cd mshmet$(mshmet_VERSION); tar xvzf ../$(PACKAGE) -mkdir $(MSHMET_SRCDIR) cp $(MSHMET_SRCDIRNOLIB)/*.c $(MSHMET_SRCDIRNOLIB)/*.h $(MSHMET_SRCDIR) cp $(MSHMET_SRCDIRNOLIB)/compil.date $(MSHMET_SRCDIR) cp mshmetlib-internal.h mshmetlib.c mshmetlib.h $(MSHMET_SRCDIR)/ cp ../../src/libMesh/chrono.h $(MSHMET_SRCDIR) rm $(MSHMET_SRCDIR)/mshmet.c rm $(MSHMET_SRCDIR)/chrono.c cp ../../src/libMesh/eigenv.c $(MSHMET_SRCDIR) cp Makefile-mshmet.inc $(MSHMET_DIR)/makefile cd $(MSHMET_SRCDIR); patch -p2 < ../../mshmet.2011.03.06.patch # # Patch for i586 developed by John Hunt (14/2/13) # cd $(MSHMET_SRCDIR); patch -p2 < ../../mshmet.2012.04.25_i586.patch touch $(SRCDIR)/tag-tar $(PACKAGE): ../getall -o mshmet -a clean: -rm ff-flags # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see # [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) -rm -rf mshmet.????.??.?? -rm FAIT $(FAIRE) ff-flags: ../Makefile grep 'abs_top_builddir *=' ../Makefile >> ff-flags grep 'CC *=' ../Makefile >> ff-flags grep 'CFLAGS *=' ../Makefile >> ff-flags grep 'LDFLAGS *=' ../Makefile >> ff-flags grep 'AR *=' ../Makefile >> ff-flags grep 'ARFLAGS *=' ../Makefile >> ff-flags grep 'RANLIB *=' ../Makefile >> ff-flags grep 'WGET *=' ../Makefile >> ff-flags grep 'mshmet_VERSION *=' ./Makefile >> ff-flags .PHONY: $(SRCDIR)/$(INSTALL) freefem++-3.38-1/download/mshmet/Makefile-mshmet.inc000644 000767 000024 00000002253 12256027013 022413 0ustar00hechtstaff000000 000000 include ../ff-flags MSHMETDIR = $(abs_top_builddir)/download/mshmet/mshmet$(mshmet_VERSION) # working dirs EXEDIR = #$(MSHMETDIR)/executable SRCDIR = $(MSHMETDIR)/sourceslib OBJDIR = $(MSHMETDIR)/objects/$(ARCHI) ARCDIR = $(MSHMETDIR)/archives DIRDIR = $(EXEDIR) $(OBJDIR) $(ARCDIR) VPATH = $(SRCDIR) INCDIR = -I$(MSHMETDIR)/sourceslib/ -I$(abs_top_builddir)/src/libMesh/ LDLDIR = -L$(abs_top_builddir)/src/libMesh/ -lMesh # objects list src = $(wildcard $(SRCDIR)/*.c) header = $(wildcard $(SRCDIR)/*.h) objs = $(patsubst $(SRCDIR)%,$(OBJDIR)%,$(src:.c=.o)) prog = mshmet lib = $(OBJDIR)/libmshmet.a #.SILENT: $(OBJDIR)/%.o: $(SRCDIR)/%.c $(CC) $(OPT64) $(INCDIR) $(CFLAGS) -DSERIAL -c $< -o $@ $(EXEDIR)/$(prog):$(DIRDIR) $(objs) echo "#define COMPIL " '"' `date` '"' > $(SRCDIR)/compil.date #$(CC) -c $(CFLAGS) $(INCDIR) $(SRCDIR)/mshmet.c -o $(OBJDIR)/mshmet.o #$(CC) $(LDFLAGS) $(OPT64) $(LDLDIR) $(objs) -o $@ -lm $(AR) $(ARFLAGS) $(lib) $(objs) $(RANLIB) $(lib) $(objs):$(header) $(DIRDIR): @[ -d $@ ] || mkdir $@ clean: -rm $(objs) $(EXEDIR)/$(prog) tar:$(DIRDIR) tar czf $(ARCDIR)/$(prog).`date +"%Y.%m.%d"`.tgz sources makefile target: $(EXEDIR)/$(prog) freefem++-3.38-1/download/mshmet/mshmet.2011.03.06.patch000644 000767 000024 00000004041 12131233631 022247 0ustar00hechtstaff000000 000000 --- mshmet.2011.03.06/sources/mshmet.h 2011-02-11 19:41:49.000000000 +0100 +++ mshmet.2011.03.06/sourceslib/mshmet.h 2011-11-16 22:04:20.000000000 +0100 @@ -33,7 +33,7 @@ #define MS_MAX(a,b) ( ((a) < (b)) ? (b) : (a) ) #define MS_MIN(a,b) ( ((a) < (b)) ? (a) : (b) ) -char idir[5]; +extern char idir[5]; typedef struct { double c[3]; @@ -135,17 +135,17 @@ pHash hashEdge_3d(pMesh mesh); pHash hashEdge_2d(pMesh mesh); -int (*boulep)(pMesh ,int ,int ,int *); -int (*hashel)(pMesh ); -int (*gradLS)(pMesh ,pSol ,int ,int ); -int (*hessLS)(pMesh ,pSol ,int ,int ); -int (*avgval)(pMesh ,pSol ,int ); -int (*clsval)(pMesh ,pSol ,int ); -int (*nrmhes)(pMesh ,pSol ,int ); -int (*redsim)(double *,double *,double *); -int (*defmet)(pMesh ,pSol ,int ); -double (*getSol)(pSol ,int ,int ); -int (*metrLS)(pMesh mesh,pSol ); -int (*lissag)(pMesh ,pSol , int ,int ); +extern int (*boulep)(pMesh ,int ,int ,int *); +extern int (*hashel)(pMesh ); +extern int (*gradLS)(pMesh ,pSol ,int ,int ); +extern int (*hessLS)(pMesh ,pSol ,int ,int ); +extern int (*avgval)(pMesh ,pSol ,int ); +extern int (*clsval)(pMesh ,pSol ,int ); +extern int (*nrmhes)(pMesh ,pSol ,int ); +extern int (*redsim)(double *,double *,double *); +extern int (*defmet)(pMesh ,pSol ,int ); +extern double (*getSol)(pSol ,int ,int ); +extern int (*metrLS)(pMesh mesh,pSol ); +extern int (*lissag)(pMesh ,pSol , int ,int ); #endif --- mshmet.2012.04.25/sources/lplib3.c 2013-04-10 11:53:17.000000000 +0200 +++ mshmet.2012.04.25/sourceslib/lplib3.c 2013-04-10 11:54:49.000000000 +0200 @@ -30,7 +30,10 @@ #include #include #include "lplib3.h" - +#ifdef __FreeBSD__ +#include +#include +#endif /*----------------------------------------------------------*/ /* Defines */ @@ -1250,6 +1253,7 @@ * NPROC environment variable (BSD/OS, CrayOS) * sysctl hw.ncpu or kern.smp.cpus */ + int ncpu; if (pmc_init() == 0 && (ncpu = pmc_ncpu()) != -1) maxthreads = ncpu; else freefem++-3.38-1/download/mshmet/mshmet.2012.04.25_i586.patch000644 000767 000024 00000000517 12167254041 023040 0ustar00hechtstaff000000 000000 --- mshmet.2012.04.25/sourceslib/libmesh5.c.orig 2013-02-12 17:47:00.093678985 +0000 +++ mshmet.2012.04.25/sourceslib/libmesh5.c 2013-02-12 17:48:27.083684096 +0000 @@ -1381,7 +1381,7 @@ int IntVal; long pos; - if(msh->ver >= 3) + if ( (msh->ver >= 3) && (sizeof(long) == 8) ) ScaDblWrd(msh, (unsigned char*)&pos); else { freefem++-3.38-1/download/mshmet/mshmetlib-internal.h000644 000767 000024 00000000564 11437145556 022677 0ustar00hechtstaff000000 000000 typedef MSHMET_Point Point; typedef MSHMET_Tetra Tetra; typedef MSHMET_Tria Tria; typedef MSHMET_Mesh Mesh; typedef MSHMET_Sol Sol; typedef MSHMET_Deriv Deriv; typedef MSHMET_pPoint pPoint; typedef MSHMET_pTetra pTetra; typedef MSHMET_pDeriv pDeriv; typedef MSHMET_pTria pTria; typedef MSHMET_Info Info; typedef MSHMET_pMesh pMesh; typedef MSHMET_pSol pSol; freefem++-3.38-1/download/mshmet/mshmetlib.c000644 000767 000024 00000021403 12305633312 021036 0ustar00hechtstaff000000 000000 /* mshmetlib.c mshmetlib(int option, ...) to use mshmet via a library * compute metric based on hessian * j.morice LJLL 2010 * Copyright (c) LJLL, 2010. */ #include "mshmet.h" #include "compil.date" extern long verbosity; char idir[5] = {0,1,2,0,1}; mytime mshmet_ctim[TIMEMAX]; int (*boulep)(pMesh ,int ,int ,int *); int (*hashel)(pMesh ); int (*gradLS)(pMesh ,pSol ,int ,int ); int (*hessLS)(pMesh ,pSol ,int ,int ); int (*avgval)(pMesh ,pSol ,int ); int (*clsval)(pMesh ,pSol ,int ); int (*nrmhes)(pMesh ,pSol ,int ); int (*redsim)(double *,double *,double *); int (*defmet)(pMesh ,pSol ,int ); double (*getSol)(pSol ,int ,int ); int (*metrLS)(pMesh mesh,pSol ); int (*lissag)(pMesh ,pSol , int ,int ); static void mshmet_excfun(int sigid) { fprintf(stdout,"\n Unexpected error:"); fflush(stdout); switch(sigid) { case SIGABRT: fprintf(stdout," Abnormal stop\n"); exit(1); case SIGFPE: fprintf(stdout," Floating-point exception\n"); exit(1); case SIGILL: fprintf(stdout," Illegal instruction\n"); exit(1); case SIGSEGV: fprintf(stdout," Segmentation fault\n"); exit(1); case SIGTERM: case SIGINT: //fprintf(stdout," Program killed\n"); exit(1); fprintf(stdout," Abnormal end\n"); exit(1); } exit(1); } /* static void usage(char *prog) { fprintf(stdout,"\n usage: %s filein[.mesh] [solin[.sol]] [fileout.sol] -eps x -hmin y -hmax z -v -iso -norm\n",prog); fprintf(stdout,"\n** Generic options :\n"); fprintf(stdout,"-d Turn on debug mode\n"); fprintf(stdout,"-h Print this message\n"); fprintf(stdout,"-ls Build levelset metric\n"); fprintf(stdout,"-v [n] Tune level of verbosity\n"); fprintf(stdout,"-m file Use metric file\n"); fprintf(stdout,"\n** Specific options : \n"); fprintf(stdout," -eps : tolerance\n"); fprintf(stdout," -hmin: min size\n"); fprintf(stdout," -hmax: max size\n"); fprintf(stdout," -iso : isotropic\n"); fprintf(stdout," -w : relative width for LS (0name); ptr = strstr(data,".sol"); if ( ptr ) *ptr = '\0'; strcat(data,".mhes"); in = fopen(data,"r"); if ( !in ) { strcpy(data,"DEFAULT.hmet"); in = fopen(data,"r"); if ( !in ) { if ( mesh->info.imprim < 0 ) fprintf(stdout," %%%% DEFAULT VALUES (%g %g %g)\n", mesh->info.eps,mesh->info.hmin,mesh->info.hmax); return(1); } } fprintf(stdout," %%%% %s FOUND\n",data); while ( !feof(in) ) { ret = fscanf(in,"%s",key); if ( !ret || feof(in) ) break; for (i=0; iinfo.hmin = dummy; } else if ( !strcmp(key,"hmax") ) { fscanf(in,"%f",&dummy); mesh->info.hmax = dummy; } else if ( !strcmp(key,"eps") ) { fscanf(in,"%f",&dummy); mesh->info.eps = dummy; } else if ( !strcmp(key,"iso") ) { mesh->info.iso = 1; } else if ( !strcmp(key,"norm") ) { fscanf(in,"%d",&mesh->info.nnu); } else if ( key[0] == '#' ) { fgets(key,255,in); } else fprintf(stderr," unrecognized keyword : %s\n",key); } fclose(in); return(1); } */ static void mshmet_stats(pMesh mesh,pSol sol) { fprintf(stdout," NUMBER OF GIVEN VERTICES %8d\n",mesh->np); if ( mesh->nt ) fprintf(stdout," NUMBER OF GIVEN TRIANGLES %8d\n",mesh->nt); if ( mesh->ne ) fprintf(stdout," NUMBER OF GIVEN TETRAHEDRA %8d\n",mesh->ne); fprintf(stdout," NUMBER OF GIVEN DATA %8d\n",sol->np); } static void mshmet_endcod() { double ttot,ttim[TIMEMAX]; int k,call[TIMEMAX]; chrono(OFF,&mshmet_ctim[0]); for (k=0; k 0.01 ) { fprintf(stdout,"\n -- CPU REQUIREMENTS\n"); fprintf(stdout," in/out %8.2f %% %3d. calls, %7.2f sec/call\n", 100.*ttim[1]/ttim[0],call[1],ttim[1]/(float)call[1]); fprintf(stdout," analysis %8.2f %% %3d. calls, %7.2f sec/call\n", 100.*ttim[2]/ttim[0],call[2],ttim[2]/(float)call[2]); fprintf(stdout," metric %8.2f %% %3d. calls, %7.2f sec/call\n", 100.*ttim[3]/ttim[0],call[3],ttim[3]/(float)call[3]); fprintf(stdout," total %8.2f %% %3d. calls, %7.2f sec/call\n", 100.*ttot/ttim[0],call[0],ttot/(float)call[0]); } fprintf(stdout,"\n ELAPSED TIME %.2f SEC. (%.2f)\n",ttim[0],ttot); } /* set function pointers */ /* set function pointers */ void MSHMET_setfunc(pMesh mesh) { if ( mesh->dim == 2 ) { boulep = boulep_2d; hashel = hashel_2d; gradLS = gradLS_2d; hessLS = hessLS_2d; getSol = getSol_2d; avgval = avgval_2d; clsval = clsval_2d; nrmhes = nrmhes_2d; defmet = defmet_2d; redsim = redsim_2d; metrLS = metrLS_2d; lissag = lissag_2d; } else { if ( mesh->ne > 0 ) { /* 3d */ boulep = boulep_3d; hashel = hashel_3d; gradLS = gradLS_3d; hessLS = hessLS_3d; getSol = getSol_3d; avgval = avgval_3d; clsval = clsval_3d; nrmhes = nrmhes_3d; defmet = defmet_3d; redsim = redsim_3d; metrLS = metrLS_3d; lissag = lissag_3d; } else { /* surface mesh */ boulep = boulep_2d; hashel = hashel_2d; lissag = lissag_2d; avgval = avgval_3d; clsval = clsval_3d; nrmhes = nrmhes_3d; getSol = getSol_3d; redsim = redsim_3d; gradLS = gradLS_s; hessLS = hessLS_s; defmet = defmet_s; metrLS = metrLS_3d; } } } int MSHMET_mshmet(int intopt[7], double fopt[4], pMesh mesh, pSol sol){ Info *info; fprintf(stdout," -- MSHMET, Release %s (%s) \n",MS_VER,MS_REL); fprintf(stdout," %s\n",MS_CPY); fprintf(stdout," %s\n",COMPIL); /* trap exceptions */ signal(SIGABRT,mshmet_excfun); signal(SIGFPE,mshmet_excfun); signal(SIGILL,mshmet_excfun); signal(SIGSEGV,mshmet_excfun); signal(SIGTERM,mshmet_excfun); signal(SIGINT,mshmet_excfun); //atexit(mshmet_endcod); tminit(mshmet_ctim,TIMEMAX); chrono(ON,&mshmet_ctim[0]); chrono(ON,&mshmet_ctim[1]); /* default */ info = &mesh->info; info->hmin = (float) fopt[0]; // 0.01; info->hmax = (float) fopt[1]; // 1.0; info->eps = (float) fopt[2]; // 0.01; info->width = (float) fopt[3]; // 0.05; info->nnu = intopt[0]; // 0; info->iso = intopt[1]; // 0; info->ls = intopt[2]; // 0; info->ddebug = intopt[3]; // 0; info->imprim = intopt[4]; // 10; info->nlis = intopt[5]; // 0; info->bin = 1; // pas besoin c'est pour le fichier info->nsol = -1; //-1; // pas besoin ==> on peut prendre plusieurs solutions en meme temps ??? info->metric = intopt[6]; // 0; // metric given besoin ??? MSHMET_setfunc(mesh); chrono(OFF,&mshmet_ctim[1]); if ( mesh->info.imprim ) mshmet_stats(mesh,sol); fprintf(stdout," -- DATA READING COMPLETED. %.2f sec.\n",gttime(mshmet_ctim[1])); fprintf(stdout,"\n %s\n MODULE MSHMET-LJLL : %s (%s)\n %s\n", MS_STR,MS_VER,MS_REL,MS_STR); /* analysis */ chrono(ON,&mshmet_ctim[2]); if ( mesh->info.imprim ) fprintf(stdout,"\n -- PHASE 1 : ANALYSIS\n"); if ( abs(mesh->info.imprim) > 4 ) { fprintf(stdout," ** SETTING ADJACENCIES\n"); fflush(stdout); } if ( !scaleMesh(mesh,sol) ) return(1); if ( !hashel(mesh) ) exit(1); chrono(OFF,&mshmet_ctim[2]); if ( mesh->info.imprim ) fprintf(stdout," -- PHASE 1 COMPLETED. %.2f sec.\n",gttime(mshmet_ctim[2])); /* metric */ chrono(ON,&mshmet_ctim[3]); if ( mesh->info.imprim ) fprintf(stdout,"\n -- PHASE 2 : METRIC\n"); if ( !mshme1(mesh,sol) ) exit(1); chrono(OFF,&mshmet_ctim[3]); if ( mesh->info.imprim ) fprintf(stdout," -- PHASE 2 COMPLETED. %.2f sec.\n",gttime(mshmet_ctim[3])); fprintf(stdout,"\n %s\n END OF MODULE MSHMET \n %s\n",MS_STR,MS_STR); /* sol->outn="zzzz"; if ( !saveMet(sol,&mesh->info,sol->outn) ) exit(1); */ if ( mesh->info.imprim ) mshmet_endcod(); fprintf(stdout,"\n %s\n END OF MODULE MSHMET \n %s\n",MS_STR,MS_STR); if ( mesh->info.imprim < -4 || mesh->info.ddebug ) M_memDump(); return(0); } freefem++-3.38-1/download/mshmet/mshmetlib.h000644 000767 000024 00000003604 12305633343 021052 0ustar00hechtstaff000000 000000 typedef struct { /* double aire,rins; double c[3]; int s,nv,mark; unsigned char b,h; */ double c[3]; int s,nv,mark; unsigned char b,h; } MSHMET_Point; typedef MSHMET_Point * MSHMET_pPoint; typedef struct { int v[3]; int mark; /* double aire; int v[3]; int mark;*/ } MSHMET_Tria; typedef MSHMET_Tria * MSHMET_pTria; typedef struct { int v[4]; int mark; } MSHMET_Tetra; typedef MSHMET_Tetra * MSHMET_pTetra; typedef struct { double delta; double min[3],max[3]; float eps,hmin,hmax,width,ani,hgrad,map; int nnu,nsol,nlis; char imprim,ddebug,iso,bin,metric,ls; /* double delta; double min[3],max[3]; float eps,hmin,hmax,width; int nnu,nsol,nlis; char imprim,ddebug,iso,bin,metric,ls; */ } MSHMET_Info; typedef struct { /* int np,nt,ne,ver,dim; int *adja,mark; char *name,*mname; MSHMET_pPoint point; MSHMET_pTria tria; MSHMET_pTetra tetra; MSHMET_Info info; */ int np,nt,ne,ver,dim; int *adja,mark; char *name,*mname; MSHMET_pPoint point; MSHMET_pTria tria; MSHMET_pTetra tetra; MSHMET_Info info; } MSHMET_Mesh; typedef MSHMET_Mesh * MSHMET_pMesh; typedef struct { int np,ver,dim,type,size,typtab[GmfMaxTyp]; double *sol,*met,*hes,*grd,*nn,umin,umax; char *name,*outn,*mapname; /* version 2.0 int np,ver,dim,type,size,typtab[GmfMaxTyp]; double *sol,*met,umin,umax; char *name,*outn; */ } MSHMET_Sol; typedef MSHMET_Sol * MSHMET_pSol; typedef struct { double grd[3]; double hes[6]; } MSHMET_Deriv; typedef MSHMET_Deriv * MSHMET_pDeriv; #ifdef __cplusplus namespace mshmet{ extern "C" { #endif int MSHMET_mshmet(int intopt[7], double fopt[4], MSHMET_pMesh mesh, MSHMET_pSol sol); #ifdef __cplusplus }} #endif freefem++-3.38-1/download/mmg3d/Makefile000644 000767 000024 00000007266 12500241535 020072 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- all-local: mmg3d include ff-flags # Downloading and compiling mmg3d # ------------------------------- # DIRPKG= ../pkg SRCDIR= ./mmg3d4 PACKAGE=$(DIRPKG)/mmg3d4.0.tgz INSTALL=.. mmg3d_VERSION= # mmg3d pas sur internet LIBMMG3D=$(INSTALL)/lib/libmmg3d-v4.a OPT=4 # size of the PKG file ( this file change See Cecile.) FFCS - 19/2/13 - the test for the file size (`stat -f "%z" file`) # is not portable from MacOS, so just leave it out in FFCS (SIZEPKG is still useful to force a remake when the package # changes) SIZEPKG=158547 OBJS= analar.o chkmsh.o hash.o memory.o optcte.o outqua.o simu44.o swap44.o zaldy.o \ analarcutting.o chrono.o heap.o mmg3d1.o optlap.o pattern.o simu56.o swap56.o \ baryct.o colpoi.o inout.o mmg3d4.o optlen.o quality.o simu68.o swap68.o \ boulep.o coquil.o length.o mmg3d9.o optlentet.o queue.o simu710.o swap710.o \ bucket.o cutelt.o librnbg.o movevertex.o optra4.o ratio.o solmap.o swapar.o \ delaunay.o locate.o optbdry.o opttet.o scalem.o spledg.o swaptet.o \ cenrad.o eigenv.o matrix.o optcoq.o opttyp.o simu23.o swap23.o typelt.o OBJSNOP = cendel.o swapar.o # FFCS - simplify Makefile structure mmg3d:WHERE.done mmg3d4/FAIT-4.done:tag-tar-$(SIZEPKG) echo "#define COMPIL " '"' `date` '"' > ./mmg3d4/build/sources/compil.date cd mmg3d4/build/sources/; $(MAKE) CC='$(CC)' CFLAGS='$(CNOFLAGS) -g' $(OBJSNOP) cd mmg3d4/build/sources/; $(MAKE) CC='$(CC)' CFLAGS='$(CFLAGS) -g' $(OBJS) cd mmg3d4/build/sources/mmg3dmain; $(CC) -c $(CFLAGS) mmg3d.c -I.. $(AR) $(ARFLAGS) $(LIBMMG3D) mmg3d4/build/sources/*.o mmg3d4/build/sources/mmg3dmain/mmg3d.o # # FFCS - ranlib required on Windows 7 64 bits # $(RANLIB) $(LIBMMG3D) -$(CC) $(CNOFLAGS) mmg3d4/build/sources/mmg3dmain/mmg3d.o mmg3d4/build/sources/*.o -o ../bin/mmg3d $(STD_LIBS) touch mmg3d4/FAIT-4.done # FFCS - simplify Makefile structure install-4.done:mmg3d4/FAIT-4.done -mkdir ../include/mmg3d-v4/ cp mmg3d4/build/sources/*.h ../include/mmg3d-v4/ touch $@ clean:: -rm install-4.done mmg3d-4:$(PACKAGE) install:install-4.done WHERE.done # FFCS - keep simplest makefile structure for automatic recompilations WHERE.done: install-4.done echo mmg3d-v4 LD -L@DIR@/lib -lmmg3d-v4 >../lib/WHERE.mmg3d ; echo mmg3d-v4 INCLUDE -I@DIR@/include/mmg3d-v4>> ../lib/WHERE.mmg3d ; echo build WHERE ./lib/WHERE.mmg3d ; touch $@ clean:: -rm WHERE.done FAIRE: mmg3d4/FAIT-4.done install-4.done # FFCS - keep it simple tag-tar-$(SIZEPKG): $(PACKAGE) patch-mmg3dv4.diff -rm -rf mmg3d4 tar xvzf $(PACKAGE) touch mmg3d4/build/sources/dataff.h # # ALH - clean-up all CR/LF to make patching more successful # ../../build/cleancrlf mmg3d4 # cd mmg3d4;patch -p1 <../patch-mmg3dv4.diff cat mmg3d4/build/sources/mmg3dConfig.h touch tag-tar-$(SIZEPKG) # cp makefile-mmg3d.inc $(SRCDIR)/makefile $(PACKAGE): ../getall -o MMG3D -a clean:: -rm ff-flags # # FFCS - make sure that all directories are cleaned. Thisis especially important under Windows because there is no # compilation dependencies control there (see # [[file:c:/cygwin/home/alh/ffcs/dist/configure.ac::dependency_tracking]]) # -rm -r mmg3d4 -rm FAIT* mmg* flags-* tag-tar* #FH -rm $(PACKAGE) ff-flags: ../Makefile Makefile grep 'abs_top_builddir *=' ../Makefile > ff-flags grep 'CC *=' ../Makefile >> ff-flags grep 'CFLAGS *=' ../Makefile >> ff-flags grep 'LDFLAGS *=' ../Makefile >> ff-flags grep 'AR *=' ../Makefile >> ff-flags grep 'ARFLAGS *=' ../Makefile >> ff-flags grep 'RANLIB *=' ../Makefile >> ff-flags grep 'WGET *=' ../Makefile >> ff-flags grep 'STD_LIBS *=' ../Makefile >> ff-flags grep 'CNOFLAGS *=' ../Makefile >> ff-flags .PHONY:$(SRCDIR)/$(INSTALL)freefem++-3.38-1/download/mmg3d/patch-mmg3dv4.diff000644 000767 000024 00000313441 12325500525 021637 0ustar00hechtstaff000000 000000 >diff -r -u mmg3d4/build/sources/analarcutting.c mmg3d4-new/build/sources/analarcutting.c --- mmg3d4/build/sources/analarcutting.c 2012-12-19 16:05:32.000000000 +0100 +++ mmg3d4-new/build/sources/analarcutting.c 2013-01-18 16:33:45.000000000 +0100 @@ -307,7 +307,7 @@ printf("6 cut : %8d\n",n6); printf("---------------------------\n"); */ if ( !na ) return(na); -#warning check memory allocation + // #warning check memory allocation //printf("%d cut init --- nb tet %d\n",na,mesh->ne); return(na); diff -r -u mmg3d4/build/sources/cutelt.c mmg3d4-new/build/sources/cutelt.c --- mmg3d4/build/sources/cutelt.c 2012-12-19 16:05:32.000000000 +0100 +++ mmg3d4-new/build/sources/cutelt.c 2013-01-18 16:35:41.000000000 +0100 @@ -305,8 +305,7 @@ // } // return(1); // } -int ddebug=0; - +extern int ddebug; int MMG_decouphex(pMesh mesh, pHedge hed,int k,int* p,int ref) { pTetra pt; int i,nu1,nu2; diff -r -u mmg3d4/build/sources/dataff.h mmg3d4-new/build/sources/dataff.h --- mmg3d4/build/sources/dataff.h 2013-01-18 21:52:48.000000000 +0100 +++ mmg3d4-new/build/sources/dataff.h 2013-01-18 18:50:04.000000000 +0100 @@ -0,0 +1,60 @@ +/* + * dataff.h + * + * + * Created by Fr\E9d\E9ric Hecht on 19/06/11. + * Copyright 2011 UPMC. All rights reserved. + * + + */ + +enum ff_data_type { + ff_id_vertex =0, + ff_id_seg =1, + ff_id_tria=2, + ff_id_tet =3, + + ff_id_prism =5, + ff_id_hex =6, + ff_id_quad =7, + ff_id_corner=8 +} ; + + +typedef struct DataFF +{ + const char * meshname; + const char * movename; + const char * solname; + int imprim; + int memory; + int np; // nb of vertices in/out + int typesol; // 1 iso , 6 : m11; m12,m13,m22,m23,m33 + void * mesh; + double * sol; /* metric :size typesol*np */ + double * mov; /* displac. size :3*np */ + void (*set_mesh)(void *dataff,int *data,int ldata); + void (*end_mesh)(void *dataff); + void (*set_v)(void *dataff,int i,double *xyz,int lab); + void (*set_elmt)(void *dataff,int ff_id,int i,int *k,int lab); + void (*get_mesh)(void *dataff,int *data,int ldata); + void (*get_v3)(void *dataff,int i,double *xyz,int *lab); + void (*get_elmt)(void *dataff,int ff_id,int i,int *k,int *lab); +} DataFF; + +#ifdef __cplusplus +extern "C" { +#endif + int mainmmg3d(int argc,char *argv[],DataFF *dataff); + +#ifdef __cplusplus +} +#endif +/* + m11 = met[0] + m12 = met[1] + m13 = met[2] + m22 = met[3] + m23 = met[4] + m33 = met[5] +*/ diff -r -u mmg3d4/build/sources/delaunay.c mmg3d4-new/build/sources/delaunay.c --- mmg3d4/build/sources/delaunay.c 2012-12-19 16:05:32.000000000 +0100 +++ mmg3d4-new/build/sources/delaunay.c 2013-01-18 16:32:41.000000000 +0100 @@ -728,7 +728,7 @@ if ( ppt->tag & M_UNUSED ) return(0); tref = mesh->tetra[list->tetra[1]/6].ref; -#warning remove this test + // #warning remove this test for (k=1; k<=lon; k++) if(tref!=mesh->tetra[list->tetra[k]/6].ref) printf("pbs coquil %d %d tet %d\n",tref,mesh->tetra[list->tetra[k]/6].ref,list->tetra[k]/6); diff -r -u mmg3d4/build/sources/libmmg3d.h mmg3d4-new/build/sources/libmmg3d.h --- mmg3d4/build/sources/libmmg3d.h 2012-12-19 16:05:36.000000000 +0100 +++ mmg3d4-new/build/sources/libmmg3d.h 2013-01-18 16:32:41.000000000 +0100 @@ -118,12 +118,12 @@ typedef MMG_Sol * MMG_pSol; /* inout */ -int MMG_loadMesh(MMG_pMesh ,char *); -int MMG_loadSol(MMG_pSol ,char *,int ); -int MMG_loadVect(MMG_pMesh ,char *,int ); -int MMG_saveMesh(MMG_pMesh ,char *); -int MMG_saveSol(MMG_pMesh ,MMG_pSol ,char *); -int MMG_saveVect(MMG_pMesh ,char *); +int MMG_loadMesh(MMG_pMesh ,char *,void *); +int MMG_loadSol(MMG_pSol ,char *,int ,void *); +int MMG_loadVect(MMG_pMesh ,char *,int ,void *); +int MMG_saveMesh(MMG_pMesh ,char *,void *); +int MMG_saveSol(MMG_pMesh ,MMG_pSol ,char *,void *); +int MMG_saveVect(MMG_pMesh ,char *,void *); #ifdef __cplusplus namespace mmg3d{ diff -r -u mmg3d4/build/sources/mesh.h mmg3d4-new/build/sources/mesh.h --- mmg3d4/build/sources/mesh.h 2012-12-19 16:05:36.000000000 +0100 +++ mmg3d4-new/build/sources/mesh.h 2013-01-18 16:32:41.000000000 +0100 @@ -405,17 +405,17 @@ /* function pointers */ typedef int (*MMG_Swap)(pMesh ,pSol ,pList ); -MMG_Swap MMG_swpptr; -double (*MMG_length)(double *,double *,double *,double *); -double (*MMG_caltet)(pMesh ,pSol ,int ); -double (*MMG_calte1)(pMesh ,pSol ,int ); -int (*MMG_caltet2)(pMesh ,pSol ,int ,int ,double ,double *); -int (*MMG_cavity)(pMesh ,pSol ,int ,int ,pList ,int ); -int (*MMG_buckin)(pMesh ,pSol ,pBucket ,int ); -int (*MMG_optlen)(pMesh ,pSol ,double ,int ); -int (*MMG_interp)(double *,double *,double *,double ); -int (*MMG_optlentet)(pMesh ,pSol ,pQueue ,double ,int ,int ); -int (*MMG_movevertex)(pMesh ,pSol ,int ,int ); +extern MMG_Swap MMG_swpptr; +extern double (*MMG_length)(double *,double *,double *,double *); +extern double (*MMG_caltet)(pMesh ,pSol ,int ); +extern double (*MMG_calte1)(pMesh ,pSol ,int ); +extern int (*MMG_caltet2)(pMesh ,pSol ,int ,int ,double ,double *); +extern int (*MMG_cavity)(pMesh ,pSol ,int ,int ,pList ,int ); +extern int (*MMG_buckin)(pMesh ,pSol ,pBucket ,int ); +extern int (*MMG_optlen)(pMesh ,pSol ,double ,int ); +extern int (*MMG_interp)(double *,double *,double *,double ); +extern int (*MMG_optlentet)(pMesh ,pSol ,pQueue ,double ,int ,int ); +extern int (*MMG_movevertex)(pMesh ,pSol ,int ,int ); #endif diff -r -u mmg3d4/build/sources/mmg3d4.c mmg3d4-new/build/sources/mmg3d4.c --- mmg3d4/build/sources/mmg3d4.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-new/build/sources/mmg3d4.c 2013-01-18 18:28:05.000000000 +0100 @@ -3,32 +3,32 @@ Co-auteurs : Cecile Dobrzynski et Pascal Frey. Propriétaires :IPB - UPMC -INRIA. -Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, +Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, diffusé sous les termes et conditions de la licence publique générale de GNU -Version 3 ou toute version ultérieure. +Version 3 ou toute version ultérieure. Ce fichier est une partie de MMG3D. MMG3D est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier suivant les termes de la licence publique générale de GNU Version 3 ou toute version ultérieure. -MMG3D est distribué dans l'espoir qu'il sera utile, mais SANS -AUCUNE GARANTIE ; sans même garantie de valeur marchande. +MMG3D est distribué dans l'espoir qu'il sera utile, mais SANS +AUCUNE GARANTIE ; sans même garantie de valeur marchande. Voir la licence publique générale de GNU pour plus de détails. -MMG3D est diffusé en espérant qu’il sera utile, -mais SANS AUCUNE GARANTIE, ni explicite ni implicite, -y compris les garanties de commercialisation ou -d’adaptation dans un but spécifique. +MMG3D est diffusé en espérant qu’il sera utile, +mais SANS AUCUNE GARANTIE, ni explicite ni implicite, +y compris les garanties de commercialisation ou +d’adaptation dans un but spécifique. Reportez-vous à la licence publique générale de GNU pour plus de détails. -Vous devez avoir reçu une copie de la licence publique générale de GNU -en même temps que ce document. +Vous devez avoir reçu une copie de la licence publique générale de GNU +en même temps que ce document. Si ce n’est pas le cas, aller voir . /**************************************************************************** Initial software: MMG3D Version 4.0 Co-authors: Cecile Dobrzynski et Pascal Frey. Owners: IPB - UPMC -INRIA. -Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, -spread under the terms and conditions of the license GNU General Public License +Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, +spread under the terms and conditions of the license GNU General Public License as published Version 3, or (at your option) any later version. This file is part of MMG3D @@ -41,26 +41,26 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with MMG3D. If not, see . +along with MMG3D. If not, see . ****************************************************************************/ #include "mesh.h" -int MMG_npuiss,MMG_nvol,MMG_npres; -int MMG_nlen,MMG_ncal,MMG_ntopo,MMG_nex; -int MMG_npuisstot,MMG_nvoltot,MMG_nprestot; -int MMG_npdtot; -int MMG_nplen,MMG_npref,MMG_bouffe; +extern int MMG_npuiss,MMG_nvol,MMG_npres; +extern int MMG_nlen,MMG_ncal,MMG_ntopo,MMG_nex; +extern int MMG_npuisstot,MMG_nvoltot,MMG_nprestot; +extern int MMG_npdtot; +extern int MMG_nplen,MMG_npref,MMG_bouffe; int ddebug; int MMG_mmg3d4(pMesh mesh,pSol sol,int *alert) { Hedge hash; - pBucket bucket; + pBucket bucket; double declic; - int base,na,nd,ns,nna,nnd,nns,dd,it,nf,maxtou; - double lmoy,LLLONG; - int k; - pTetra pt; + int base,na,nd,ns,nna,nnd,nns,dd,it,nf,maxtou; + double lmoy,LLLONG; + int k; + pTetra pt; if ( abs(mesh->info.imprim) > 3 ) fprintf(stdout," ** SIZE OPTIMIZATION\n"); if ( mesh->info.imprim < 0 ) { @@ -73,82 +73,82 @@ maxtou = 10; nna = nns = nnd = 0; it = 0; - declic = 3. / ALPHAD; + declic = 3. / ALPHAD; lmoy = 10.; LLLONG = 1.5; - + nna = 10; - do { - na = nd = ns = 0; + do { + na = nd = ns = 0; if(0) ddebug = 1; else ddebug = 0; - + if(it && !(it%2) ) { bucket = MMG_newBucket(mesh,M_MAX(mesh->info.bucksiz,BUCKSIZ)); if ( !bucket ) return(0); - //MMG_saveMesh(mesh,"avtana.mesh"); - MMG_analar(mesh,sol,bucket,&na,&nd,&nf,alert); - //MMG_saveMesh(mesh,"apresana.mesh"); - if ( abs(mesh->info.imprim) > 5 ) - fprintf(stdout," %7d INSERTED %7d REMOVED %7d FILTERED\n",na,nd,nf); - - M_free(bucket->head); - M_free(bucket->link); - M_free(bucket); - + //MMG_saveMesh(mesh,"avtana.mesh",0); + MMG_analar(mesh,sol,bucket,&na,&nd,&nf,alert); + //MMG_saveMesh(mesh,"apresana.mesh",0); + if ( abs(mesh->info.imprim) > 5 ) + fprintf(stdout," %7d INSERTED %7d REMOVED %7d FILTERED\n",na,nd,nf); + + M_free(bucket->head); + M_free(bucket->link); + M_free(bucket); + } else { - ++mesh->flag; + ++mesh->flag; } - //printf("IT %d $$$$$$$$$$$ LLLONG %9.3f\n",it,LLLONG); - nna = nns = nnd = 0; - + //printf("IT %d $$$$$$$$$$$ LLLONG %9.3f\n",it,LLLONG); + nna = nns = nnd = 0; + /*splitting*/ if ( !mesh->info.noinsert && (!*alert) ) { /* store points on edges */ if ( !MMG_zaldy4(&hash,mesh->np) ) { - if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM.\n"); - *alert = 2; - break; + if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM.\n"); + *alert = 2; + break; } - nna = MMG_analarcutting(mesh,sol,&hash,alert,&lmoy,LLLONG); + nna = MMG_analarcutting(mesh,sol,&hash,alert,&lmoy,LLLONG); if ( abs(mesh->info.imprim) > 5 ) { printf("lmoy %9.5f\n",lmoy); } /*puts("--------------------------------------"); - puts("--------------------------------------"); - puts("--------------------------------------"); - */ + puts("--------------------------------------"); + puts("--------------------------------------"); + */ if ( *alert ) { - fprintf(stdout," \n\n ** UNABLE TO CUT (analarcutting)\n"); - fprintf(stdout," ** RETRY WITH -m > %6d \n\n",mesh->info.memory); - MMG_saveMesh(mesh,"crash.mesh"); - MMG_saveSol(mesh,sol,"crash.sol"); - exit(0); + fprintf(stdout," \n\n ** UNABLE TO CUT (analarcutting)\n"); + fprintf(stdout," ** RETRY WITH -m > %6d \n\n",mesh->info.memory); + MMG_saveMesh(mesh,"crash.mesh",0); + MMG_saveSol(mesh,sol,"crash.sol",0); + exit(0); } - M_free(hash.item); + M_free(hash.item); } - else if ( *alert ) nna = 0; - /* adjacencies */ + else if ( *alert ) nna = 0; + /* adjacencies */ if ( nna /*|| it == (maxtou-1)*/ ) { mesh->nt = 0; if ( !MMG_hashTetra(mesh) ) return(0); if ( !MMG_markBdry(mesh) ) return(0); } - // printf("chkmsh\n"); - // MMG_unscaleMesh(mesh,sol); - // MMG_saveMesh(mesh,"chk.mesh"); + // printf("chkmsh\n"); + // MMG_unscaleMesh(mesh,sol); + // MMG_saveMesh(mesh,"chk.mesh",0); //MMG_chkmsh(mesh,1,-1); - //if(it==1)exit(0); - /* delaunization */ - if ( !mesh->info.noswap && (nna || na) ) { + //if(it==1)exit(0); + /* delaunization */ + if ( !mesh->info.noswap && (nna || na) ) { nns = MMG_cendel(mesh,sol,declic,base); } /* deletion */ /*if ( 0 && nna ) { nnd = MMG_colvert(mesh,sol,base); - } */ + } */ if ( nna+nnd+nns && abs(mesh->info.imprim) > 3 ) fprintf(stdout," %7d INSERTED %7d REMOVED %7d FLIPPED\n",nna+na,nnd+nd,nns); - + } while ( na+nd+nns+nna+nnd > 0 && ++it < maxtou && lmoy > 1.3); @@ -161,80 +161,80 @@ MMG_prilen(mesh,sol); } - //return(1); - //MMG_saveMesh(mesh,"aprescut.mesh"); - fprintf(stdout," ---\n"); - + //return(1); + //MMG_saveMesh(mesh,"aprescut.mesh",0); + fprintf(stdout," ---\n"); + /*analyze standard*/ - base = mesh->flag; - *alert = 0; + base = mesh->flag; + *alert = 0; - nna = 0; - nnd = 0; - nf = 0; - it = 0; - maxtou = 100; - MMG_npdtot=0; - MMG_npuisstot=0; - MMG_nprestot=0; - MMG_nvoltot=0; - - /* 2. field points */ - if ( mesh->info.imprim < -4 ) { - MMG_prilen(mesh,sol); - fprintf(stdout," -- FIELD POINTS\n"); - } - - /* create filter */ - bucket = MMG_newBucket(mesh,M_MAX(mesh->info.bucksiz,BUCKSIZ)); - if ( !bucket ) return(0); - - do { - MMG_analar(mesh,sol,bucket,&na,&nd,&nf,alert); - nna += na; - nnd += nd; - if ( *alert ) { - if ( nd < 1000 ) break; - else *alert = 0; - } - if ( it > 5 ) { - dd = abs(nd-na); - if ( dd < 5 || dd < 0.05*nd ) break; - else if ( it > 12 && nd >= na ) break; - } - if ( na+nd && abs(mesh->info.imprim) > 3 ) - fprintf(stdout," %7d INSERTED %7d REMOVED %7d FILTERED\n",na,nd,nf); - // MMG_saveMesh(mesh,"chk.mesh"); - // //if(it==1) exit(0); - } - while ( na+nd > 0 && ++it < maxtou ); - - if ( nna+nnd && abs(mesh->info.imprim) < 3 ) { - fprintf(stdout," %7d INSERTED %7d REMOVED %7d FILTERED\n",na,nd,nf); - } - - if(MMG_npdtot>0) { - fprintf(stdout," REJECTED : %5d\n",MMG_npdtot); - fprintf(stdout," VOL : %6.2f %% %5d \n", - 100*(MMG_nvoltot/(float) - MMG_npdtot),MMG_nvoltot); - fprintf(stdout," PUISS : %6.2f %% %5d \n", - 100*(MMG_npuisstot/(float) MMG_npdtot),MMG_npuisstot); - fprintf(stdout," PROCHE : %6.2f %% %5d \n", - 100*(MMG_nprestot/(float) MMG_npuisstot),MMG_nprestot); + nna = 0; + nnd = 0; + nf = 0; + it = 0; + maxtou = 100; MMG_npdtot=0; MMG_npuisstot=0; + MMG_nprestot=0; MMG_nvoltot=0; - } - if ( mesh->info.imprim < 0 ) { - MMG_outqua(mesh,sol); - MMG_prilen(mesh,sol); - } - M_free(bucket->head); - M_free(bucket->link); - M_free(bucket); + /* 2. field points */ + if ( mesh->info.imprim < -4 ) { + MMG_prilen(mesh,sol); + fprintf(stdout," -- FIELD POINTS\n"); + } + + /* create filter */ + bucket = MMG_newBucket(mesh,M_MAX(mesh->info.bucksiz,BUCKSIZ)); + if ( !bucket ) return(0); + + do { + MMG_analar(mesh,sol,bucket,&na,&nd,&nf,alert); + nna += na; + nnd += nd; + if ( *alert ) { + if ( nd < 1000 ) break; + else *alert = 0; + } + if ( it > 5 ) { + dd = abs(nd-na); + if ( dd < 5 || dd < 0.05*nd ) break; + else if ( it > 12 && nd >= na ) break; + } + if ( na+nd && abs(mesh->info.imprim) > 3 ) + fprintf(stdout," %7d INSERTED %7d REMOVED %7d FILTERED\n",na,nd,nf); + // MMG_saveMesh(mesh,"chk.mesh",0); + // //if(it==1) exit(0); + } + while ( na+nd > 0 && ++it < maxtou ); + + if ( nna+nnd && abs(mesh->info.imprim) < 3 ) { + fprintf(stdout," %7d INSERTED %7d REMOVED %7d FILTERED\n",na,nd,nf); + } + + if(MMG_npdtot>0) { + fprintf(stdout," REJECTED : %5d\n",MMG_npdtot); + fprintf(stdout," VOL : %6.2f %% %5d \n", + 100*(MMG_nvoltot/(float) + MMG_npdtot),MMG_nvoltot); + fprintf(stdout," PUISS : %6.2f %% %5d \n", + 100*(MMG_npuisstot/(float) MMG_npdtot),MMG_npuisstot); + fprintf(stdout," PROCHE : %6.2f %% %5d \n", + 100*(MMG_nprestot/(float) MMG_npuisstot),MMG_nprestot); + MMG_npdtot=0; + MMG_npuisstot=0; + MMG_nvoltot=0; + } + if ( mesh->info.imprim < 0 ) { + MMG_outqua(mesh,sol); + MMG_prilen(mesh,sol); + } + M_free(bucket->head); + M_free(bucket->link); + M_free(bucket); + return(1); } diff -r -u mmg3d4/build/sources/mmg3dConfig.h mmg3d4-new/build/sources/mmg3dConfig.h --- mmg3d4/build/sources/mmg3dConfig.h 2012-12-19 16:05:36.000000000 +0100 +++ mmg3d4-new/build/sources/mmg3dConfig.h 2013-01-18 16:32:41.000000000 +0100 @@ -2,4 +2,4 @@ #define Tutorial_VERSION_MAJOR #define Tutorial_VERSION_MINOR -#define USE_SCOTCH +/* #undef USE_SCOTCH */ diff -r -u mmg3d4/build/sources/mmg3dlib/mmg3dlib.c mmg3d4-new/build/sources/mmg3dlib/mmg3dlib.c --- mmg3d4/build/sources/mmg3dlib/mmg3dlib.c 2012-12-19 16:06:03.000000000 +0100 +++ mmg3d4-new/build/sources/mmg3dlib/mmg3dlib.c 2013-01-18 16:32:41.000000000 +0100 @@ -385,7 +385,7 @@ if ( !MMG_hashTetra(mesh) ) return(1); if ( !MMG_markBdry(mesh) ) return(1); if (abs(mesh->info.option)==10) { - MMG_saveMesh(mesh,"tetra.mesh"); + MMG_saveMesh(mesh,"tetra.mesh",0); return(0); } if ( !sol->np) { @@ -431,7 +431,7 @@ if ( abs(info->option) == 9 ) { if(!MMG_mmg3d9(mesh,sol,&alert)) { if ( !MMG_unscaleMesh(mesh,sol) ) return(1); - MMG_saveMesh(mesh,"errormoving.mesh"); + MMG_saveMesh(mesh,"errormoving.mesh",0); //MMG_saveSol(mesh,sol,mesh->outf); return(1); } diff -r -u mmg3d4/build/sources/optlen.c mmg3d4-new/build/sources/optlen.c --- mmg3d4/build/sources/optlen.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-new/build/sources/optlen.c 2013-01-18 16:32:41.000000000 +0100 @@ -48,7 +48,7 @@ #define HQCOEF 0.9 #define HCRIT 0.98 -double MMG_rao(pMesh mesh,int k,int inm); +double MMG_rao(pMesh mesh,int k,FILE* ); int MMG_optlen_ani(pMesh mesh,pSol sol,double declic,int base) { pTetra pt,pt1; pPoint ppa,ppb; diff -r -u mmg3d4/build/sources/pattern.c mmg3d4-new/build/sources/pattern.c --- mmg3d4/build/sources/pattern.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-new/build/sources/pattern.c 2013-01-18 18:41:02.000000000 +0100 @@ -47,7 +47,7 @@ unsigned char MMG_arfa[3][4] = { {2,0,1,3}, {1,2,0,3}, {0,1,2,3} }; -extern int MMG_permar[10][4]; +extern int MMG_permar[12][4]; extern int MMG_pointar[64][2]; extern int ddebug; //insert ip on ia-ib diff -r -u mmg3d4/build/sources/quality.c mmg3d4-new/build/sources/quality.c --- mmg3d4/build/sources/quality.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-new/build/sources/quality.c 2013-01-18 16:32:41.000000000 +0100 @@ -46,7 +46,7 @@ #include "mesh.h" -double MMG_rao(pMesh mesh,int k,int inm); +double MMG_rao(pMesh mesh,int k,FILE* inm) ; double MMG_caltetrao(pMesh mesh,pSol sol,int iel) { return(MMG_rao(mesh,iel,0)); } diff -r -u mmg3d4/build/sources/ratio.c mmg3d4-new/build/sources/ratio.c --- mmg3d4/build/sources/ratio.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-new/build/sources/ratio.c 2013-01-18 16:32:41.000000000 +0100 @@ -365,7 +365,7 @@ fprintf(stdout," ELEMENT %d (%d) %d %d %d %d\n", iel,ielreal,pt->v[0],pt->v[1],pt->v[2],pt->v[3]); - if ( abs(mesh->info.imprim) < 5 ) return; + if ( abs(mesh->info.imprim) < 5 ) return (1) ; fprintf(stdout,"\n HISTOGRAMM\n"); for (k=1; k<9; k++) { diff -r -u mmg3d4/build/sources/sproto.h mmg3d4-new/build/sources/sproto.h --- mmg3d4/build/sources/sproto.h 2012-12-19 16:05:36.000000000 +0100 +++ mmg3d4-new/build/sources/sproto.h 2013-01-18 16:32:41.000000000 +0100 @@ -67,13 +67,13 @@ int MMG_inEdge(pHedge ,int *,int *,int *); int MMG_markBdry(pMesh ); -/* inout */ -int MMG_loadMesh(pMesh ,char *); -int MMG_loadSol(pSol ,char *,int ); -int MMG_loadVect(pMesh ,char *,int ); -int MMG_saveMesh(pMesh ,char *); -int MMG_saveSol(pMesh ,pSol ,char *); -int MMG_saveVect(pMesh ,char *); +/* inout add param F.H. june 2011 (dataff) */ +int MMG_loadMesh(pMesh ,char *,void *); +int MMG_loadSol(pSol ,char *,int ,void *); +int MMG_loadVect(pMesh ,char *,int ,void *); +int MMG_saveMesh(pMesh ,char *,void *); +int MMG_saveSol(pMesh ,pSol ,char *,void *); +int MMG_saveVect(pMesh ,char *,void *); int MMG_loctet(pMesh ,int ,int ,double *,double *); int MMG_computeMetric(pMesh ,pSol ,int ,double * ); diff -r -u mmg3d4/build/sources/swapar.c mmg3d4-new/build/sources/swapar.c --- mmg3d4/build/sources/swapar.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-new/build/sources/swapar.c 2013-01-18 18:43:38.000000000 +0100 @@ -1,106 +1,107 @@ -/**************************************************************************** -Logiciel initial: MMG3D Version 4.0 -Co-auteurs : Cecile Dobrzynski et Pascal Frey. -Propriétaires :IPB - UPMC -INRIA. - -Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, -diffusé sous les termes et conditions de la licence publique générale de GNU -Version 3 ou toute version ultérieure. - -Ce fichier est une partie de MMG3D. -MMG3D est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier -suivant les termes de la licence publique générale de GNU -Version 3 ou toute version ultérieure. -MMG3D est distribué dans l'espoir qu'il sera utile, mais SANS -AUCUNE GARANTIE ; sans même garantie de valeur marchande. -Voir la licence publique générale de GNU pour plus de détails. -MMG3D est diffusé en espérant qu’il sera utile, -mais SANS AUCUNE GARANTIE, ni explicite ni implicite, -y compris les garanties de commercialisation ou -d’adaptation dans un but spécifique. -Reportez-vous à la licence publique générale de GNU pour plus de détails. -Vous devez avoir reçu une copie de la licence publique générale de GNU -en même temps que ce document. -Si ce n’est pas le cas, aller voir . -/**************************************************************************** -Initial software: MMG3D Version 4.0 -Co-authors: Cecile Dobrzynski et Pascal Frey. -Owners: IPB - UPMC -INRIA. - -Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, -spread under the terms and conditions of the license GNU General Public License -as published Version 3, or (at your option) any later version. - -This file is part of MMG3D -MMG3D is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3 of the License, or -(at your option) any later version. -MMG3D is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with MMG3D. If not, see . -****************************************************************************/ -#include "mesh.h" - -int MMG_swapar(pMesh mesh,pSol sol,pQueue q,List *list,int lon,double crit,double declic) { - pTetra pt; - int i,l,jel,ncas,ddebug,iadr; - - MMG_swpptr = 0; - ncas = 0; - if ( !MMG_getnElt(mesh,10) ) return(-1); - if(0 && list->tetra[1]/6==2352) ddebug=1; - else ddebug=0; - - switch(lon) { - case 3: - ncas = MMG_simu32(mesh,sol,list,crit); - break; - case 4: - ncas = MMG_simu44(mesh,sol,list,crit); - break; - case 5: - ncas = MMG_simu56(mesh,sol,list,crit); - break; - case 6: - ncas = MMG_simu68(mesh,sol,list,crit); - break; - case 7: - ncas = MMG_simu710(mesh,sol,list,crit); - break; - default: - return(0); - } - if(ddebug) printf("on fait swap %d\n",ncas); - if ( ncas && MMG_swpptr ) { - if(ddebug) MMG_saveMesh(mesh,"avt.mesh"); - for (l=1; l<=lon; l++) { - jel = list->tetra[l]/6; - pt = &mesh->tetra[jel]; - if(ddebug) { - printf("tet %d : %d %d %d %d -- %d %d %d %d %d %d\n",jel,pt->v[0],pt->v[1],pt->v[2],pt->v[3], - pt->bdryinfo[0],pt->bdryinfo[1],pt->bdryinfo[2],pt->bdryinfo[3],pt->bdryinfo[4],pt->bdryinfo[5]); - - } - MMG_kiudel(q,jel); - } - lon = MMG_swpptr(mesh,sol,list); - assert(lon); - if(!lon) return(0); - - for (l=1; l<=lon; l++) { - jel = list->tetra[l]; - pt = &mesh->tetra[jel]; - if ( pt->qual >= declic ) MMG_kiuput(q,jel); - for (i=0; i<4; i++) mesh->point[pt->v[i]].flag = mesh->flag; - - } - if(ddebug) {MMG_saveMesh(mesh,"sw.mesh"); exit(0);} - return(1); - } - - return(0); -} +/**************************************************************************** +Logiciel initial: MMG3D Version 4.0 +Co-auteurs : Cecile Dobrzynski et Pascal Frey. +Propriétaires :IPB - UPMC -INRIA. + +Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, +diffusé sous les termes et conditions de la licence publique générale de GNU +Version 3 ou toute version ultérieure. + +Ce fichier est une partie de MMG3D. +MMG3D est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier +suivant les termes de la licence publique générale de GNU +Version 3 ou toute version ultérieure. +MMG3D est distribué dans l'espoir qu'il sera utile, mais SANS +AUCUNE GARANTIE ; sans même garantie de valeur marchande. +Voir la licence publique générale de GNU pour plus de détails. +MMG3D est diffusé en espérant qu’il sera utile, +mais SANS AUCUNE GARANTIE, ni explicite ni implicite, +y compris les garanties de commercialisation ou +d’adaptation dans un but spécifique. +Reportez-vous à la licence publique générale de GNU pour plus de détails. +Vous devez avoir reçu une copie de la licence publique générale de GNU +en même temps que ce document. +Si ce n’est pas le cas, aller voir . +/**************************************************************************** +Initial software: MMG3D Version 4.0 +Co-authors: Cecile Dobrzynski et Pascal Frey. +Owners: IPB - UPMC -INRIA. + +Copyright © 2004-2005-2006-2007-2008-2009-2010-2011, +spread under the terms and conditions of the license GNU General Public License +as published Version 3, or (at your option) any later version. + +This file is part of MMG3D +MMG3D is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. +MMG3D is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with MMG3D. If not, see . +****************************************************************************/ +#include "mesh.h" + +int MMG_swapar(pMesh mesh,pSol sol,pQueue q,List *list,int lon,double crit,double declic) { + pTetra pt; + int i,l,jel,ncas,ddebug,iadr; + + MMG_swpptr = 0; + ncas = 0; + if ( !MMG_getnElt(mesh,10) ) return(-1); + if(0 && list->tetra[1]/6==2352) ddebug=1; + else ddebug=0; + + switch(lon) { + case 3: + ncas = MMG_simu32(mesh,sol,list,crit); + break; + case 4: + ncas = MMG_simu44(mesh,sol,list,crit); + break; + case 5: + ncas = MMG_simu56(mesh,sol,list,crit); + break; + case 6: + ncas = MMG_simu68(mesh,sol,list,crit); + break; + case 7: + ncas = MMG_simu710(mesh,sol,list,crit); + break; + default: + return(0); + } + if(ddebug) printf("on fait swap %d\n",ncas); + if ( ncas && MMG_swpptr ) { + if(ddebug) MMG_saveMesh(mesh,"avt.mesh",0); + for (l=1; l<=lon; l++) { + jel = list->tetra[l]/6; + pt = &mesh->tetra[jel]; + if(ddebug) { + printf("tet %d : %d %d %d %d -- %d %d %d %d %d %d\n",jel,pt->v[0],pt->v[1],pt->v[2],pt->v[3], + pt->bdryinfo[0],pt->bdryinfo[1],pt->bdryinfo[2],pt->bdryinfo[3],pt->bdryinfo[4],pt->bdryinfo[5]); + + } + MMG_kiudel(q,jel); + } + lon = MMG_swpptr(mesh,sol,list); + assert(lon); + if(!lon) return(0); + + for (l=1; l<=lon; l++) { + jel = list->tetra[l]; + pt = &mesh->tetra[jel]; + if ( pt->qual >= declic ) MMG_kiuput(q,jel); + for (i=0; i<4; i++) mesh->point[pt->v[i]].flag = mesh->flag; + + } + if(ddebug) {MMG_saveMesh(mesh,"sw.mesh",0); exit(0);} + return(1); + } + + return(0); +} + diff -u mmg3d4/build/sources/inout.c mmg3d4-ok/build/sources/inout.c --- mmg3d4/build/sources/inout.c 2012-12-19 16:05:32.000000000 +0100 +++ mmg3d4-ok/build/sources/inout.c 2013-07-11 11:43:47.000000000 +0200 @@ -44,6 +44,7 @@ along with MMG3D. If not, see . ****************************************************************************/ #include "mesh.h" +#include "dataff.h" extern short MMG_imprim; @@ -100,35 +101,467 @@ return(out); } + +int MMG_loadMeshff(pMesh mesh,char *filename,DataFF *dataff) { + + + Hedge hed,hed2; + pPoint ppt; + pTetra pt; + pTria pt1; + int i,j,k; + int nhex=0, npris=0, netmp=0,nq=0, pp[10] , ned=0, ncor=0; + int p0,p1,p2,p3,p4,p5,p6,ref ; + int data[10],ldata=10; + dataff->get_mesh(dataff,data,10); + mesh->np = data[ff_id_vertex]; + ned = data[ff_id_seg]; + mesh->nt = data[ff_id_tria]; + mesh->ne = data[ff_id_tet]; + netmp=mesh->ne; + nhex=data[ff_id_hex]; + npris=data[ff_id_prism]; + nq=data[ff_id_quad]; + ncor= data[ff_id_corner]; + + if( nhex || npris) { + printf("mmg3d ff interface , hex or prism NOT SUPPORTED to day (sorry FH) \n"); + goto L0; + } + + mesh->ncor = 0; + mesh->ver =1; + if ( abs(mesh->info.option)==10 ) { + fprintf(stdout," -- READING %8d HEXA %8d PRISMS\n",nhex,npris); + if(!mesh->ne) netmp = 0; + mesh->ne += 6*nhex + 3*npris; + } + + if ( abs(mesh->info.imprim) > 5 ) + fprintf(stdout," -- READING DATA for ff interface "); + + if ( !mesh->np || !mesh->ne ) { + fprintf(stdout," ** MISSING DATA yy\n"); + goto L0; ; + } + if ( !MMG_zaldy(mesh) ) goto L0; + + /* read mesh vertices */ + mesh->npfixe = mesh->np; + + for (k=1; k<=mesh->np; k++) { + ppt = &mesh->point[k]; + dataff->get_v3(dataff,k,ppt->c,&ppt->ref); + ppt->tag = M_UNUSED; + } + + /* read mesh triangles */ + mesh->ntfixe = mesh->nt; + + for (k=1; k<=mesh->nt; k++) { + pt1 = &mesh->tria[k]; + dataff->get_elmt(dataff,ff_id_tria,k,pt1->v,&pt1->ref); + + } + + + + /* read mesh quads (option 10)*/ + if(abs(mesh->info.option)==10) { + fprintf(stdout," QUADS READING %d\n",nq); + mesh->ntfixe += 4*nq; + for (k=1; k<=nq; k++) { + dataff->get_elmt(dataff, ff_id_quad ,k,pp,&ref); + + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = pp[0]; + pt1->v[1] = pp[1]; + pt1->v[2] = pp[2]; + pt1->ref = ref; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = pp[0]; + pt1->v[1] = pp[2]; + pt1->v[2] = pp[3]; + pt1->ref = ref; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = pp[0]; + pt1->v[1] = pp[1]; + pt1->v[2] = pp[3]; + pt1->ref = ref; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = pp[1]; + pt1->v[1] = pp[2]; + pt1->v[2] = pp[3]; + pt1->ref = ref; + + } + } + + /*read and store edges*/ + if (ned) { + if ( !MMG_zaldy4(&hed,ned) ) { + if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : EDGES IGNORED\n"); + ned = 0; + } + mesh->ned = ned; + + for (k=1; k<=ned; k++) { + dataff->get_elmt(dataff, ff_id_seg ,k,pp,&ref); + + if(MMG_edgePut(&hed,pp[0],pp[1],2)>1) { + fprintf(stdout," ## WARNING DOUBLE EDGE : %d %d\n",pp[0],pp[1]); + } + } + } + + /* read mesh tetrahedra */ + mesh->nefixe = mesh->ne; + + + for (k=1; k<=netmp; k++) { + pt = &mesh->tetra[k]; + dataff->get_elmt(dataff,ff_id_tet,k,pt->v,&ref); + pt->ref = ref;//0;//ref ; + for(i=0 ; i<4 ; i++) + pt->bdryref[i] = -1; + + if (ned) { int nu1,nu2; + for(i=0 ; i<6 ; i++) { + nu1 = pt->v[MMG_iare[i][0]]; + nu2 = pt->v[MMG_iare[i][1]]; + pt->bdryinfo[i] = MMG_edgePoint(&hed,nu1,nu2); + } + + } else { + for(i=0 ; i<6 ; i++) + pt->bdryinfo[i] = 0; + } + } + if (ned) M_free(hed.item); + + /*read corners*/ + if (ncor) { + + mesh->ncor = ncor; + for (k=1; k<=ncor; k++) { + dataff->get_elmt(dataff,ff_id_corner,k,&ref,0); + + ppt = &mesh->point[ref]; + ppt->geom = M_CORNER; + } + } +#ifdef XXXXXXXXXXXXXXX + if ( abs(mesh->info.option)==10 ) { + if(bin) { + printf("NOT SUPPORTED\n"); + exit(0); + } + if ( !MMG_zaldy4(&hed2,3*npris+6*nhex) ) { + if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : PRISM IGNORED\n"); + npris = 0; + nhex = 0; + } + + /*read hexa and transform to tetra*/ + rewind(inm); + fseek(inm,posnhex,SEEK_SET); + for (k=1; k<=nhex; k++) { + fscanf(inm,"%d %d %d %d %d %d %d %d %d",&p0,&p1,&p2,&p3,&p4,&p5,&p6,&p7,&ref); + //fscanf(inm,"%d %d %d %d %d %d %d %d %d",&p0,&p4,&p2,&p1,&p3,&p5,&p6,&p7,&ref); + //printf("hex %d : %d %d %d %d %d %d %d %d\n",k,p0,p1,p2,p3,p4,p5,p6,p7); + MMG_cuthex(mesh,&hed2,netmp+(k-1)*6,p0,p1,p2,p3,p4,p5,p6,p7,ref); + } + + /*read prism and transform to tetra + ---> compatibility pbs ==> hash edge and switch case*/ + rewind(inm); + fseek(inm,posnpris,SEEK_SET); + nimp = 0; + ne = netmp+6*nhex; + for (k=1; k<=npris; k++) { + fscanf(inm,"%d %d %d %d %d %d %d",&p0,&p1,&p2,&p3,&p4,&p5,&ref); + if(!MMG_cutprism(mesh,&hed2,ne,p0,p1,p2,p3,p4,p5,ref)) + { + if(mesh->info.imprim < 0 ) fprintf(stdout,"DECOMPOSITION PRISM INVALID \n\n"); + mesh->ne += 5; + ne += 8; + nimp++; + continue; + } + ne += 3; + } + if(abs(mesh->info.imprim) > 3 )fprintf(stdout," %d INVALID DECOMPOSITION\n\n",nimp); + } +#endif + if ( abs(mesh->info.imprim) > 3 ) { + fprintf(stdout," NUMBER OF GIVEN VERTICES %8d\n",mesh->npfixe); + if ( mesh->ntfixe ) + fprintf(stdout," NUMBER OF GIVEN TRIANGLES %8d\n",mesh->ntfixe); + fprintf(stdout," NUMBER OF GIVEN TETRAHEDRA %8d\n",mesh->nefixe); + if ( ncor ) + fprintf(stdout," NUMBER OF GIVEN CORNERS %8d\n",ncor); + if ( ned ) + fprintf(stdout," NUMBER OF GIVEN EDGES %8d\n",ned); + } + // MMG_saveMesh(mesh,"XXXXX.mesh",0); + dataff->mesh=0; // used + return 1; +L0: + dataff->mesh=0;// used + return 1; +} + +int MMG_loadSolff(pSol sol,char *filename,int npmax,DataFF *dataff) { + + double tmp , *dsol ; + int binch,bdim,iswp; + int k,i,isol,type,bin,dim,btyp,bpos; + long posnp; + char *ptr,data[128],chaine[128]; + if( ! dataff->sol){ + fprintf(stdout," ** MISSING DATA metrix ff \n"); + return(1); + } + dsol = dataff->sol; + dataff->sol=0;// used + + + btyp = (dataff->typesol== 6) ? 3: dataff->typesol ; + sol->np= dataff->np; + + if ( !sol->np ) { + fprintf(stdout," ** MISSING DATA zz\n"); + return(1); + } + + if ( btyp!= 1 && btyp!=3 ) { + fprintf(stdout," ** DATA IGNORED (ff) btyp=%d\n",btyp); + sol->np = 0; + return(1); + } + + sol->offset = (btyp==1) ? 1 : 6; + + if ( abs(MMG_imprim) > 5 ) + fprintf(stdout," -- READING DATA FILE(ff) %s\n",data); + + if ( !sol->np ) { + fprintf(stdout," ** MISSING DATA no metrix \n"); + return(0); + } + sol->npfixe = sol->np; + sol->npmax = npmax; + if ( !MMG_zaldy3(sol) ) return(0); + + /* read mesh solutions */ + sol->npfixe = sol->np; + + for (k=1; k<=sol->np; k++) { + isol = (k-1) * sol->offset + 1; + for (i=0; ioffset; i++) + sol->met[isol + i] = *dsol++; + + } + + if ( abs(MMG_imprim) > 3 ) + fprintf(stdout," NUMBER OF GIVEN DATA %8d\n",sol->npfixe); + + + return(1); + +} +/* load solution (metric) */ +int MMG_loadVectff(pMesh mesh,char *filename,int npmax,DataFF *dataff) { + + + pDispl pd; + int binch,bdim,iswp; + int k,i,type,bin,dim,btyp,bpos,iadr; + long posnp; + char *ptr,data[128],chaine[128]; + double *fsol = dataff->mov; + dataff->mov=0;// used + + pd = mesh->disp; + pd->np =mesh->np ; + + if ( !pd->np || !fsol ) { + fprintf(stdout," ** MISSING DATA dep ff %d %p\n",pd->np, fsol); + return(0); + } + + + if ( abs(mesh->info.imprim) > 5 ) + fprintf(stdout," -- COPY DATA form ff interface %s\n",data); + + /* read mesh solutions */ + for (k=1; k<=pd->np; k++) { + iadr = (k - 1) * 3 + 1; + + for (i=0; i<3; i++) { + pd->mv[iadr + i] = *fsol++; + } + } + + + + if ( abs(mesh->info.imprim) > 3 ) + fprintf(stdout," NUMBER OF GIVEN DATA %8d\n",pd->np); + return(1); + + +} +int MMG_saveMeshff(pMesh mesh,char *filename,DataFF *dataff) { + + pPoint ppt; + pTetra pt; + pTria pt1; + int j,k,np,nc,k0; + int data[10],ldata=10; + int kn[10]; + np = 0; + nc = 0; + // compress vertex ... fist case ... + for (k=1; k<=mesh->np; k++) { + ppt = &mesh->point[k]; + if ( ppt->tag & M_UNUSED ) continue; + ppt->tmp = ++np; + /* if ( ppt->geom & M_CORNER ) cor[nc++] = ppt->tmp; */ + } + + /* seacrch vertex not in tet ???? */ + { + int kk=0,npp=np; + for (k=1; k<=mesh->np; k++) + { + ppt = &mesh->point[k]; + if ((ppt->tag & M_UNUSED )) ppt->tmp =-2; + else ppt->tmp =-1; + + } + for ( k=1; k<=mesh->ne; k++) + { + pt = &mesh->tetra[k]; + if ( !pt->v[0] ) continue; + k0++; + for(j=0;j<4;++j) + mesh->point[pt->v[j]].tmp=0; + } + np=0; + for (k=1; k<=mesh->np; k++) + { + ppt = &mesh->point[k]; + + if ( ppt->tmp ==0) + ppt->tmp = ++np; + else + { + + if (ppt->tmp==-1) + { + kk++; + ppt->tag |= M_UNUSED; + } + ppt->tmp=0; + } + } + if(kk) printf(" mmg3d: Strange nb of point %d not in tet is not zero (correct by FH)!\n" , kk); + + } + + mesh->nt=0; + if(! MMG_markBdry(mesh)) + mesh->nt=0; + data[ff_id_vertex]=np ; + //data[ff_id_seg]=ned ; + data[ff_id_tria]=mesh->nt ; + int ne=0; + for ( k=1; k<=mesh->ne; k++) + { + pt = &mesh->tetra[k]; + if ( !pt->v[0] ) continue; + ne++; + } + + data[ff_id_tet]=ne ; + printf(" mmg3d: nbp = %d, nb tet %d\n",np,ne); + //data[ff_id_hex]=nhex; + //data[ff_id_prism]=npris; + //data[ff_id_quad]=nq; + // data[ff_id_corner]=ncor; + + dataff->set_mesh(dataff,data,10); + + + for ( k=1; k<=mesh->np; k++) + { + ppt = &mesh->point[k]; + if ( ! ppt->tmp ) continue; + dataff->set_v(dataff, ppt->tmp,ppt->c,ppt->ref); + } + + + for (k=1; k<=mesh->nt; k++) + { + pt1 = &mesh->tria[k]; + for(j=0;j<3;++j) + kn[j] = mesh->point[pt1->v[j]].tmp; + dataff->set_elmt(dataff,ff_id_tria,k,kn,pt1->ref); + + } + k0=0; + for ( k=1; k<=mesh->ne; k++) + { + + pt = &mesh->tetra[k]; + if ( !pt->v[0] ) continue; + k0++; + for(j=0;j<4;++j) + kn[j] = mesh->point[pt->v[j]].tmp; + dataff->set_elmt(dataff,ff_id_tet,k0,kn,pt->ref); + + } + dataff->end_mesh(dataff); + return 1; +} +int MMG_saveSolff (pMesh mesh,pSol sol,char *filename,DataFF *dataff) { + return 1; +} +/*save the node speed : coornew-coorold/dt*/ +int MMG_saveVectff(pMesh mesh,char *filename,DataFF *dataff) { + return 1; +} /* read mesh data */ -int MMG_loadMesh(pMesh mesh,char *filename) { +int MMG_loadMesh(pMesh mesh,char *filename,void *dataff) { FILE* inm; Hedge hed,hed2; pPoint ppt; pTetra pt; pHexa ph,listhexa; pTria pt1; - int k,dim,ref,bin,bpos,i,tmp; - int *adjahex; + int k,dim,ref,bin,bpos,i,tmp; + int *adjahex; long posnp,posnt,posne,posnhex,posnpris,posncor,posned,posnq; char *ptr,data[128],chaine[128]; int nhex,npris,netmp,ncor,ned,nq; - int p0,p1,p2,p3,p4,p5,p6,p7; - int binch,bdim,iswp,nu1,nu2,nimp,ne,nbado; - float fc; - double volhex,volref; + int p0,p1,p2,p3,p4,p5,p6,p7; + int binch,bdim,iswp,nu1,nu2,nimp,ne,nbado; + float fc; + double volhex,volref; int iadr,reorient; - + if(dataff) + return MMG_loadMeshff( mesh,filename,(DataFF*) dataff); + posnp = posnt = posne = posnhex = posnpris = 0; netmp = ncor = ned = 0; bin = 0; iswp = 0; - mesh->np = mesh->nt = mesh->ne = mesh->ncor = 0; + mesh->np = mesh->nt = mesh->ne = mesh->ncor = 0; npris = nhex = nq = 0; - + strcpy(data,filename); - ptr = strstr(data,".mesh"); + ptr = strstr(data,".mesh"); if ( !ptr ) { strcat(data,".meshb"); if( !(inm = fopen(data,"rb")) ) { @@ -136,8 +569,8 @@ *ptr = '\0'; strcat(data,".mesh"); if( !(inm = fopen(data,"r")) ) { - fprintf(stderr," ** %s NOT FOUND.\n",data); - return(0); + fprintf(stderr," ** %s NOT FOUND.\n",data); + return(0); } } else { bin = 1; @@ -147,194 +580,194 @@ ptr = strstr(data,".meshb"); if( !ptr ) { if( !(inm = fopen(data,"r")) ) { - fprintf(stderr," ** %s NOT FOUND.\n",data); - return(0); - } + fprintf(stderr," ** %s NOT FOUND.\n",data); + return(0); + } } else { bin = 1; if( !(inm = fopen(data,"rb")) ) { - fprintf(stderr," ** %s NOT FOUND.\n",data); - return(0); + fprintf(stderr," ** %s NOT FOUND.\n",data); + return(0); } - - } + + } } fprintf(stdout," %%%% %s OPENED\n",data); if (!bin) { - strcpy(chaine,"D"); - while(fscanf(inm,"%s",&chaine[0])!=EOF && strncmp(chaine,"End",strlen("End")) ) { + strcpy(chaine,"D"); + while(fscanf(inm,"%s",&chaine[0])!=EOF && strncmp(chaine,"End",strlen("End")) ) { if(!strncmp(chaine,"MeshVersionFormatted",strlen("MeshVersionFormatted"))) { - fscanf(inm,"%d",&mesh->ver); - continue; + fscanf(inm,"%d",&mesh->ver); + continue; } else if(!strncmp(chaine,"Dimension",strlen("Dimension"))) { - fscanf(inm,"%d",&dim); - if(dim!=3) { - fprintf(stdout,"BAD DIMENSION : %d\n",dim); - return(0); - } - continue; + fscanf(inm,"%d",&dim); + if(dim!=3) { + fprintf(stdout,"BAD DIMENSION : %d\n",dim); + return(0); + } + continue; } else if(!strncmp(chaine,"Vertices",strlen("Vertices"))) { - fscanf(inm,"%d",&mesh->np); - posnp = ftell(inm); - continue; + fscanf(inm,"%d",&mesh->np); + posnp = ftell(inm); + continue; } else if(!strncmp(chaine,"Triangles",strlen("Triangles"))) { - fscanf(inm,"%d",&mesh->nt); - posnt = ftell(inm); - continue; + fscanf(inm,"%d",&mesh->nt); + posnt = ftell(inm); + continue; } else if(!strncmp(chaine,"Tetrahedra",strlen("Tetrahedra"))) { - fscanf(inm,"%d",&mesh->ne); - netmp = mesh->ne; - posne = ftell(inm); - continue; - } else if(!strncmp(chaine,"Hexahedra",strlen("Hexahedra"))) { - assert(abs(mesh->info.option)==10); - fscanf(inm,"%d",&nhex); - //nhex=0; - posnhex = ftell(inm); - continue; - } else if(!strncmp(chaine,"Pentahedra",strlen("Pentahedra"))) { - assert(abs(mesh->info.option)==10); - fscanf(inm,"%d",&npris); - //npris=0; - posnpris = ftell(inm); - continue; - } else if(!strncmp(chaine,"Corners",strlen("Corners"))) { - fscanf(inm,"%d",&ncor); - posncor = ftell(inm); - continue; - } else if(!strncmp(chaine,"Edges",strlen("Edges"))) { - fscanf(inm,"%d",&ned); - posned = ftell(inm); - continue; - } else if(abs(mesh->info.option)==10 && !strncmp(chaine,"Quadrilaterals",strlen("Quadrilaterals"))) { - fscanf(inm,"%d",&nq); - posnq = ftell(inm); - continue; - } - } + fscanf(inm,"%d",&mesh->ne); + netmp = mesh->ne; + posne = ftell(inm); + continue; + } else if(!strncmp(chaine,"Hexahedra",strlen("Hexahedra"))) { + assert(abs(mesh->info.option)==10); + fscanf(inm,"%d",&nhex); + //nhex=0; + posnhex = ftell(inm); + continue; + } else if(!strncmp(chaine,"Pentahedra",strlen("Pentahedra"))) { + assert(abs(mesh->info.option)==10); + fscanf(inm,"%d",&npris); + //npris=0; + posnpris = ftell(inm); + continue; + } else if(!strncmp(chaine,"Corners",strlen("Corners"))) { + fscanf(inm,"%d",&ncor); + posncor = ftell(inm); + continue; + } else if(!strncmp(chaine,"Edges",strlen("Edges"))) { + fscanf(inm,"%d",&ned); + posned = ftell(inm); + continue; + } else if(abs(mesh->info.option)==10 && !strncmp(chaine,"Quadrilaterals",strlen("Quadrilaterals"))) { + fscanf(inm,"%d",&nq); + posnq = ftell(inm); + continue; + } + } } else { bdim = 0; fread(&mesh->ver,sw,1,inm); - iswp=0; - if(mesh->ver==16777216) - iswp=1; + iswp=0; + if(mesh->ver==16777216) + iswp=1; else if(mesh->ver!=1) { fprintf(stdout,"BAD FILE ENCODING\n"); - } - fread(&mesh->ver,sw,1,inm); - if(iswp) mesh->ver = MMG_swapbin(mesh->ver); - while(fread(&binch,sw,1,inm)!=0 && binch!=54 ) { - if(iswp) binch=MMG_swapbin(binch); - if(binch==54) break; + } + fread(&mesh->ver,sw,1,inm); + if(iswp) mesh->ver = MMG_swapbin(mesh->ver); + while(fread(&binch,sw,1,inm)!=0 && binch!=54 ) { + if(iswp) binch=MMG_swapbin(binch); + if(binch==54) break; if(!bdim && binch==3) { //Dimension - fread(&bdim,sw,1,inm); //NulPos=>20 - if(iswp) bdim=MMG_swapbin(bdim); - fread(&bdim,sw,1,inm); - if(iswp) bdim=MMG_swapbin(bdim); - if(bdim!=3) { - fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); - exit(0); - return(1); - } - continue; + fread(&bdim,sw,1,inm); //NulPos=>20 + if(iswp) bdim=MMG_swapbin(bdim); + fread(&bdim,sw,1,inm); + if(iswp) bdim=MMG_swapbin(bdim); + if(bdim!=3) { + fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); + exit(0); + return(1); + } + continue; } else if(!mesh->np && binch==4) { //Vertices - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&mesh->np,sw,1,inm); - if(iswp) mesh->np=MMG_swapbin(mesh->np); - posnp = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&mesh->np,sw,1,inm); + if(iswp) mesh->np=MMG_swapbin(mesh->np); + posnp = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; } else if(!mesh->nt && binch==6) {//Triangles - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&mesh->nt,sw,1,inm); - if(iswp) mesh->nt=MMG_swapbin(mesh->nt); - posnt = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; - } else if(!mesh->ne && binch==8) { - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&mesh->ne,sw,1,inm); - if(iswp) mesh->ne=MMG_swapbin(mesh->ne); - netmp = mesh->ne; - posne = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; - } else if(!nhex && binch==10) { - assert(abs(mesh->info.option)==10); - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&nhex,sw,1,inm); - if(iswp) nhex=MMG_swapbin(nhex); - posnhex = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; - } else if(!npris && binch==9) { - assert(abs(mesh->info.option)==10); - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&npris,sw,1,inm); - if(iswp) npris=MMG_swapbin(npris); - posnpris = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; - } else if(!ncor && binch==13) { - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&ncor,sw,1,inm); - if(iswp) ncor=MMG_swapbin(ncor); - posncor = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; - } else if(!ned && binch==5) { //Edges - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - fread(&ned,sw,1,inm); - if(iswp) ned=MMG_swapbin(ned); - posned = ftell(inm); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - continue; - } else { - //printf("on traite ? %d\n",binch); - fread(&bpos,sw,1,inm); //NulPos - if(iswp) bpos=MMG_swapbin(bpos); - //printf("on avance... Nulpos %d\n",bpos); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - } - } - + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&mesh->nt,sw,1,inm); + if(iswp) mesh->nt=MMG_swapbin(mesh->nt); + posnt = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; + } else if(!mesh->ne && binch==8) { + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&mesh->ne,sw,1,inm); + if(iswp) mesh->ne=MMG_swapbin(mesh->ne); + netmp = mesh->ne; + posne = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; + } else if(!nhex && binch==10) { + assert(abs(mesh->info.option)==10); + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&nhex,sw,1,inm); + if(iswp) nhex=MMG_swapbin(nhex); + posnhex = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; + } else if(!npris && binch==9) { + assert(abs(mesh->info.option)==10); + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&npris,sw,1,inm); + if(iswp) npris=MMG_swapbin(npris); + posnpris = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; + } else if(!ncor && binch==13) { + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&ncor,sw,1,inm); + if(iswp) ncor=MMG_swapbin(ncor); + posncor = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; + } else if(!ned && binch==5) { //Edges + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + fread(&ned,sw,1,inm); + if(iswp) ned=MMG_swapbin(ned); + posned = ftell(inm); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + continue; + } else { + //printf("on traite ? %d\n",binch); + fread(&bpos,sw,1,inm); //NulPos + if(iswp) bpos=MMG_swapbin(bpos); + //printf("on avance... Nulpos %d\n",bpos); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + } + } + } if ( abs(mesh->info.option)==10 ) { - fprintf(stdout," -- READING %8d HEXA %8d PRISMS\n",nhex,npris); - if(!mesh->ne) netmp = 0; - mesh->ne += 6*nhex + 3*npris; + fprintf(stdout," -- READING %8d HEXA %8d PRISMS\n",nhex,npris); + if(!mesh->ne) netmp = 0; + mesh->ne += 6*nhex + 3*npris; } if ( abs(mesh->info.imprim) > 5 ) fprintf(stdout," -- READING DATA FILE %s\n",data); if ( !mesh->np || !mesh->ne ) { - fprintf(stdout," ** MISSING DATA\n"); + fprintf(stdout," ** MISSING DAT qqA\n"); return(0); } - if(abs(mesh->info.option)==10) { //allocation + if(abs(mesh->info.option)==10) { //allocation listhexa = (pHexa)M_calloc(nhex+1,sizeof(Hexa),"allochexa"); - assert(listhexa); - adjahex = (int*)M_calloc(6*nhex+7,sizeof(int),"allocadjhexa"); - assert(adjahex); - } + assert(listhexa); + adjahex = (int*)M_calloc(6*nhex+7,sizeof(int),"allocadjhexa"); + assert(adjahex); + } if ( !MMG_zaldy(mesh) ) return(0); /* read mesh vertices */ mesh->npfixe = mesh->np; @@ -342,35 +775,35 @@ fseek(inm,posnp,SEEK_SET); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; - if (mesh->ver < 2) { /*float*/ + if (mesh->ver < 2) { /*float*/ if (!bin) { - for (i=0 ; i<3 ; i++) { - fscanf(inm,"%f",&fc); - ppt->c[i] = (double) fc; - } - fscanf(inm,"%d",&ppt->ref); + for (i=0 ; i<3 ; i++) { + fscanf(inm,"%f",&fc); + ppt->c[i] = (double) fc; + } + fscanf(inm,"%d",&ppt->ref); } else { - for (i=0 ; i<3 ; i++) { - fread(&fc,sw,1,inm); - if(iswp) fc=MMG_swapf(fc); - ppt->c[i] = (double) fc; - } - fread(&ppt->ref,sw,1,inm); - if(iswp) ppt->ref=MMG_swapbin(ppt->ref); + for (i=0 ; i<3 ; i++) { + fread(&fc,sw,1,inm); + if(iswp) fc=MMG_swapf(fc); + ppt->c[i] = (double) fc; + } + fread(&ppt->ref,sw,1,inm); + if(iswp) ppt->ref=MMG_swapbin(ppt->ref); } } else { - if (!bin) - fscanf(inm,"%lf %lf %lf %d",&ppt->c[0],&ppt->c[1],&ppt->c[2],&ppt->ref); + if (!bin) + fscanf(inm,"%lf %lf %lf %d",&ppt->c[0],&ppt->c[1],&ppt->c[2],&ppt->ref); else { - for (i=0 ; i<3 ; i++) { - fread(&ppt->c[i],sd,1,inm); - if(iswp) ppt->c[i]=MMG_swapd(ppt->c[i]); - } - fread(&ppt->ref,sw,1,inm); - if(iswp) ppt->ref=MMG_swapbin(ppt->ref); - } - } - ppt->tag = M_UNUSED; + for (i=0 ; i<3 ; i++) { + fread(&ppt->c[i],sd,1,inm); + if(iswp) ppt->c[i]=MMG_swapd(ppt->c[i]); + } + fread(&ppt->ref,sw,1,inm); + if(iswp) ppt->ref=MMG_swapbin(ppt->ref); + } + } + ppt->tag = M_UNUSED; } /* read mesh triangles */ @@ -378,227 +811,226 @@ rewind(inm); fseek(inm,posnt,SEEK_SET); for (k=1; k<=mesh->nt; k++) { - pt1 = &mesh->tria[k]; + pt1 = &mesh->tria[k]; if (!bin) fscanf(inm,"%d %d %d %d",&pt1->v[0],&pt1->v[1],&pt1->v[2],&pt1->ref); else { - for (i=0 ; i<3 ; i++) { - fread(&pt1->v[i],sw,1,inm); - if(iswp) pt1->v[i]=MMG_swapbin(pt1->v[i]); - } - fread(&pt1->ref,sw,1,inm); - if(iswp) pt1->ref=MMG_swapbin(pt1->ref); - } - } - /* read mesh quads (option 10)*/ - if(abs(mesh->info.option)==10) { - fprintf(stdout," QUADS READING %d\n",nq); + for (i=0 ; i<3 ; i++) { + fread(&pt1->v[i],sw,1,inm); + if(iswp) pt1->v[i]=MMG_swapbin(pt1->v[i]); + } + fread(&pt1->ref,sw,1,inm); + if(iswp) pt1->ref=MMG_swapbin(pt1->ref); + } + } + /* read mesh quads (option 10)*/ + if(abs(mesh->info.option)==10) { + fprintf(stdout," QUADS READING %d\n",nq); mesh->ntfixe += 4*nq; rewind(inm); fseek(inm,posnq,SEEK_SET); for (k=1; k<=nq; k++) { if (!bin) - fscanf(inm,"%d %d %d %d %d",&p0,&p1,&p2,&p3,&ref); + fscanf(inm,"%d %d %d %d %d",&p0,&p1,&p2,&p3,&ref); else { - fread(&p0,sw,1,inm); - if(iswp) p0=MMG_swapbin(p0); - fread(&p1,sw,1,inm); - if(iswp) p1=MMG_swapbin(p1); - fread(&p2,sw,1,inm); - if(iswp) p2=MMG_swapbin(p2); - fread(&p3,sw,1,inm); - if(iswp) p3=MMG_swapbin(p3); - fread(&pt1->ref,sw,1,inm); - if(iswp) ref=MMG_swapbin(ref); - } + fread(&p0,sw,1,inm); + if(iswp) p0=MMG_swapbin(p0); + fread(&p1,sw,1,inm); + if(iswp) p1=MMG_swapbin(p1); + fread(&p2,sw,1,inm); + if(iswp) p2=MMG_swapbin(p2); + fread(&p3,sw,1,inm); + if(iswp) p3=MMG_swapbin(p3); + fread(&pt1->ref,sw,1,inm); + if(iswp) ref=MMG_swapbin(ref); + } /*creation of 4 triangles per quads because we don't know how hexa will be cut*/ - pt1 = &mesh->tria[++mesh->nt]; - pt1->v[0] = p0; - pt1->v[1] = p1; - pt1->v[2] = p2; - pt1->ref = ref; - pt1 = &mesh->tria[++mesh->nt]; - pt1->v[0] = p0; - pt1->v[1] = p2; - pt1->v[2] = p3; - pt1->ref = ref; - pt1 = &mesh->tria[++mesh->nt]; - pt1->v[0] = p0; - pt1->v[1] = p1; - pt1->v[2] = p3; - pt1->ref = ref; - pt1 = &mesh->tria[++mesh->nt]; - pt1->v[0] = p1; - pt1->v[1] = p2; - pt1->v[2] = p3; - pt1->ref = ref; - - } - } - /*read and store edges*/ - if (ned) { - if ( !MMG_zaldy4(&hed,ned) ) { - if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : EDGES IGNORED\n"); - ned = 0; - } - mesh->ned = ned; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = p0; + pt1->v[1] = p1; + pt1->v[2] = p2; + pt1->ref = ref; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = p0; + pt1->v[1] = p2; + pt1->v[2] = p3; + pt1->ref = ref; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = p0; + pt1->v[1] = p1; + pt1->v[2] = p3; + pt1->ref = ref; + pt1 = &mesh->tria[++mesh->nt]; + pt1->v[0] = p1; + pt1->v[1] = p2; + pt1->v[2] = p3; + pt1->ref = ref; + + } + } + /*read and store edges*/ + if (ned) { + if ( !MMG_zaldy4(&hed,ned) ) { + if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : EDGES IGNORED\n"); + ned = 0; + } + mesh->ned = ned; rewind(inm); - fseek(inm,posned,SEEK_SET); - for (k=1; k<=ned; k++) { + fseek(inm,posned,SEEK_SET); + for (k=1; k<=ned; k++) { if (!bin) - fscanf(inm,"%d %d %d",&nu1,&nu2,&ref); + fscanf(inm,"%d %d %d",&nu1,&nu2,&ref); else { - fread(&nu1,sw,1,inm); - if(iswp) nu1=MMG_swapbin(nu1); - fread(&nu2,sw,1,inm); - if(iswp) nu2=MMG_swapbin(nu2); - fread(&ref,sw,1,inm); - if(iswp) ref=MMG_swapbin(ref); - } - if(MMG_edgePut(&hed,nu1,nu2,2)>1) { - fprintf(stdout," ## WARNING DOUBLE EDGE : %d %d\n",nu1,nu2); - } - mesh->point[nu1].geom = M_RIDGE_GEO; - mesh->point[nu2].geom = M_RIDGE_GEO; + fread(&nu1,sw,1,inm); + if(iswp) nu1=MMG_swapbin(nu1); + fread(&nu2,sw,1,inm); + if(iswp) nu2=MMG_swapbin(nu2); + fread(&ref,sw,1,inm); + if(iswp) ref=MMG_swapbin(ref); + } + if(MMG_edgePut(&hed,nu1,nu2,2)>1) { + fprintf(stdout," ## WARNING DOUBLE EDGE : %d %d\n",nu1,nu2); + } + mesh->point[nu1].geom = M_RIDGE_GEO; + mesh->point[nu2].geom = M_RIDGE_GEO; } } /* read mesh tetrahedra */ mesh->nefixe = mesh->ne; rewind(inm); - fseek(inm,posne,SEEK_SET); - reorient = 0; - for (k=1; k<=netmp; k++) { + fseek(inm,posne,SEEK_SET); + reorient = 0; + for (k=1; k<=netmp; k++) { pt = &mesh->tetra[k]; - if (!bin) - fscanf(inm,"%d %d %d %d %d",&pt->v[0],&pt->v[1],&pt->v[2],&pt->v[3],&ref); - else { - - for (i=0 ; i<4 ; i++) { - fread(&pt->v[i],sw,1,inm); - if(iswp) pt->v[i]=MMG_swapbin(pt->v[i]); - } - fread(&ref,sw,1,inm); - if(iswp) ref=MMG_swapbin(ref); - } + if (!bin) + fscanf(inm,"%d %d %d %d %d",&pt->v[0],&pt->v[1],&pt->v[2],&pt->v[3],&ref); + else { + + for (i=0 ; i<4 ; i++) { + fread(&pt->v[i],sw,1,inm); + if(iswp) pt->v[i]=MMG_swapbin(pt->v[i]); + } + fread(&ref,sw,1,inm); + if(iswp) ref=MMG_swapbin(ref); + } pt->ref = ref;//0;//ref ; /*check orientation*/ - volref = MMG_voltet(mesh,k); - if(volref < 0) { - reorient++; - tmp = pt->v[2]; - pt->v[2] = pt->v[3]; - pt->v[3] = tmp; - } - + volref = MMG_voltet(mesh,k); + if(volref < 0) { + if(!reorient) { + fprintf(stdout,"\n $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n"); + fprintf(stdout," BAD ORIENTATION : vol < 0 -- Some tetra will be reoriented\n"); + fprintf(stdout," $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n\n"); + reorient = 1; + } + tmp = pt->v[2]; + pt->v[2] = pt->v[3]; + pt->v[3] = tmp; + } + for(i=0 ; i<4 ; i++) - pt->bdryref[i] = -1; - - if (ned) { - for(i=0 ; i<6 ; i++) { - nu1 = pt->v[MMG_iare[i][0]]; - nu2 = pt->v[MMG_iare[i][1]]; - pt->bdryinfo[i] = MMG_edgePoint(&hed,nu1,nu2); - } - - } else { - for(i=0 ; i<6 ; i++) - pt->bdryinfo[i] = 0; - } + pt->bdryref[i] = -1; + + if (ned) { + for(i=0 ; i<6 ; i++) { + nu1 = pt->v[MMG_iare[i][0]]; + nu2 = pt->v[MMG_iare[i][1]]; + pt->bdryinfo[i] = MMG_edgePoint(&hed,nu1,nu2); + } + + } else { + for(i=0 ; i<6 ; i++) + pt->bdryinfo[i] = 0; + } } - if(reorient) { - fprintf(stdout,"\n $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n"); - fprintf(stdout," BAD ORIENTATION : vol < 0 -- %8d tetra reoriented\n",reorient); - fprintf(stdout," $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ \n\n"); - reorient = 1; - } - if (ned) M_free(hed.item); + if (ned) M_free(hed.item); - /*read corners*/ + /*read corners*/ if (ncor) { rewind(inm); - fseek(inm,posncor,SEEK_SET); + fseek(inm,posncor,SEEK_SET); mesh->ncor = ncor; - for (k=1; k<=ncor; k++) { + for (k=1; k<=ncor; k++) { if (!bin) - fscanf(inm,"%d",&ref); + fscanf(inm,"%d",&ref); else { - fread(&ref,sw,1,inm); - if(iswp) ref=MMG_swapbin(ref); - } + fread(&ref,sw,1,inm); + if(iswp) ref=MMG_swapbin(ref); + } ppt = &mesh->point[ref]; - ppt->geom = M_CORNER; - } + ppt->geom = M_CORNER; + } } - - - if ( abs(mesh->info.option)==10 ) { + + + if ( abs(mesh->info.option)==10 ) { if(bin) { printf("NOT SUPPORTED\n"); exit(0); - } - if ( !MMG_zaldy4(&hed2,3*npris+6*nhex) ) { - if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : PRISM IGNORED\n"); - npris = 0; - nhex = 0; - } + } + if ( !MMG_zaldy4(&hed2,3*npris+6*nhex) ) { + if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : PRISM IGNORED\n"); + npris = 0; + nhex = 0; + } /*read hexa and transform to tetra*/ rewind(inm); - fseek(inm,posnhex,SEEK_SET); - nbado = 0; + fseek(inm,posnhex,SEEK_SET); + nbado = 0; for (k=1; k<=nhex; k++) { - ph = &listhexa[k]; - fscanf(inm,"%d %d %d %d %d %d %d %d %d",&ph->v[0],&ph->v[1],&ph->v[2],&ph->v[3],&ph->v[4],&ph->v[5],&ph->v[6],&ph->v[7],&ph->ref); - //fscanf(inm,"%d %d %d %d %d %d %d %d %d",&p0,&p4,&p2,&p1,&p3,&p5,&p6,&p7,&ref); - //printf("hex %d : %d %d %d %d %d %d %d %d\n",k,p0,p1,p2,p3,p4,p5,p6,p7); + ph = &listhexa[k]; + fscanf(inm,"%d %d %d %d %d %d %d %d %d",&ph->v[0],&ph->v[1],&ph->v[2],&ph->v[3],&ph->v[4],&ph->v[5],&ph->v[6],&ph->v[7],&ph->ref); + //fscanf(inm,"%d %d %d %d %d %d %d %d %d",&p0,&p4,&p2,&p1,&p3,&p5,&p6,&p7,&ref); + //printf("hex %d : %d %d %d %d %d %d %d %d\n",k,p0,p1,p2,p3,p4,p5,p6,p7); //check orientability of the hexahedra : vol of tet p0 p1 p3 p4 - volhex = MMG_quickvol(mesh->point[ph->v[0]].c,mesh->point[ph->v[1]].c,mesh->point[ph->v[2]].c,mesh->point[ph->v[3]].c); - if(k==1) { - volref = volhex; - //printf("vol %e\n",volref); - } - else { - if(volref*volhex < 0) { - fprintf(stdout,"BAD ORIENTATION OF HEXAHEDRON %d : %d %d %d %d %d %d %d %d\n",k,p0,p1,p2,p3,p4,p5,p6,p7); - nbado++; - tmp = ph->v[3]; - ph->v[3] = ph->v[1]; - ph->v[1] = tmp; - tmp = ph->v[5]; - ph->v[5] = ph->v[7]; - ph->v[7] = tmp; - } - } - // MMG_cuthex(mesh,&hed2,netmp+(k-1)*6,ph->v[0],ph->v[1],ph->v[2],ph->v[3],ph->v[4],ph->v[5],ph->v[6],ph->v[7],ph->ref); - } - fprintf(stdout,"%8d HEXA REORIENTED\n",nbado); + volhex = MMG_quickvol(mesh->point[ph->v[0]].c,mesh->point[ph->v[1]].c,mesh->point[ph->v[2]].c,mesh->point[ph->v[3]].c); + if(k==1) { + volref = volhex; + //printf("vol %e\n",volref); + } + else { + if(volref*volhex < 0) { + fprintf(stdout,"BAD ORIENTATION OF HEXAHEDRON %d : %d %d %d %d %d %d %d %d\n",k,p0,p1,p2,p3,p4,p5,p6,p7); + nbado++; + tmp = ph->v[3]; + ph->v[3] = ph->v[1]; + ph->v[1] = tmp; + tmp = ph->v[5]; + ph->v[5] = ph->v[7]; + ph->v[7] = tmp; + } + } + // MMG_cuthex(mesh,&hed2,netmp+(k-1)*6,ph->v[0],ph->v[1],ph->v[2],ph->v[3],ph->v[4],ph->v[5],ph->v[6],ph->v[7],ph->ref); + } + fprintf(stdout,"%8d HEXA REORIENTED\n",nbado); - if(!MMG_hashHexa(listhexa,adjahex,nhex)) return(0); - MMG_cuthex(mesh,&hed2,listhexa,adjahex,nhex,netmp); + if(!MMG_hashHexa(listhexa,adjahex,nhex)) return(0); + MMG_cuthex(mesh,&hed2,listhexa,adjahex,nhex,netmp); /*read prism and transform to tetra - ---> compatibility pbs ==> hash edge and switch case*/ + ---> compatibility pbs ==> hash edge and switch case*/ rewind(inm); - fseek(inm,posnpris,SEEK_SET); - nimp = 0; - ne = netmp+6*nhex; + fseek(inm,posnpris,SEEK_SET); + nimp = 0; + ne = netmp+6*nhex; for (k=1; k<=npris; k++) { - fscanf(inm,"%d %d %d %d %d %d %d",&p0,&p1,&p2,&p3,&p4,&p5,&ref); - if(!MMG_cutprism(mesh,&hed2,ne,p0,p1,p2,p3,p4,p5,ref)) - { - if(mesh->info.imprim < 0 ) fprintf(stdout,"DECOMPOSITION PRISM INVALID \n\n"); - mesh->ne += 5; - ne += 8; - nimp++; - continue; - } - ne += 3; + fscanf(inm,"%d %d %d %d %d %d %d",&p0,&p1,&p2,&p3,&p4,&p5,&ref); + if(!MMG_cutprism(mesh,&hed2,ne,p0,p1,p2,p3,p4,p5,ref)) + { + if(mesh->info.imprim < 0 ) fprintf(stdout,"DECOMPOSITION PRISM INVALID \n\n"); + mesh->ne += 5; + ne += 8; + nimp++; + continue; + } + ne += 3; } - if(abs(mesh->info.imprim) > 3 )fprintf(stdout," %d INVALID DECOMPOSITION\n\n",nimp); + if(abs(mesh->info.imprim) > 3 )fprintf(stdout," %d INVALID DECOMPOSITION\n\n",nimp); } - + if ( abs(mesh->info.imprim) > 3 && abs(mesh->info.option)!=10 ) { fprintf(stdout," NUMBER OF GIVEN VERTICES %8d\n",mesh->npfixe); if ( mesh->ntfixe ) @@ -609,24 +1041,26 @@ if ( ned ) fprintf(stdout," NUMBER OF GIVEN EDGES %8d\n",ned); } - fclose(inm); - return(1); + fclose(inm); + return(1); } /* load solution (metric) */ -int MMG_loadSol(pSol sol,char *filename,int npmax) { - FILE *inm; +int MMG_loadSol(pSol sol,char *filename,int npmax,void *dataff) { + FILE *inm; float fsol; - double tmp; + double tmp; int binch,bdim,iswp; int k,i,isol,type,bin,dim,btyp,bpos; long posnp; char *ptr,data[128],chaine[128]; - - posnp = 0; + if(dataff) + return MMG_loadSolff( sol,filename,npmax,(DataFF*) dataff); + + posnp = 0; bin = 0; - iswp = 0; + iswp = 0; strcpy(data,filename); ptr = strstr(data,".mesh"); @@ -645,94 +1079,94 @@ } fprintf(stdout," %%%% %s OPENED\n",data); - - if(!bin) { + + if(!bin) { strcpy(chaine,"DDD"); - while(fscanf(inm,"%s",&chaine[0])!=EOF && strncmp(chaine,"End",strlen("End")) ) { + while(fscanf(inm,"%s",&chaine[0])!=EOF && strncmp(chaine,"End",strlen("End")) ) { if(!strncmp(chaine,"Dimension",strlen("Dimension"))) { - fscanf(inm,"%d",&dim); - if(dim!=3) { - fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); - return(1); - } - continue; + fscanf(inm,"%d",&dim); + if(dim!=3) { + fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); + return(1); + } + continue; } else if(!strncmp(chaine,"SolAtVertices",strlen("SolAtVertices"))) { - fscanf(inm,"%d",&sol->np); - fscanf(inm,"%d",&type); - if(type!=1) { - fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); - return(1); - } - fscanf(inm,"%d",&btyp); - posnp = ftell(inm); - break; - } - } - } else { - fread(&binch,sw,1,inm); - iswp=0; - if(binch==16777216) iswp=1; + fscanf(inm,"%d",&sol->np); + fscanf(inm,"%d",&type); + if(type!=1) { + fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); + return(1); + } + fscanf(inm,"%d",&btyp); + posnp = ftell(inm); + break; + } + } + } else { + fread(&binch,sw,1,inm); + iswp=0; + if(binch==16777216) iswp=1; else if(binch!=1) { fprintf(stdout,"BAD FILE ENCODING\n"); - } - fread(&sol->ver,sw,1,inm); - if(iswp) sol->ver = MMG_swapbin(sol->ver); + } + fread(&sol->ver,sw,1,inm); + if(iswp) sol->ver = MMG_swapbin(sol->ver); while(fread(&binch,sw,1,inm)!=EOF && binch!=54 ) { - if(iswp) binch=MMG_swapbin(binch); - if(binch==54) break; + if(iswp) binch=MMG_swapbin(binch); + if(binch==54) break; if(binch==3) { //Dimension - fread(&bdim,sw,1,inm); //NulPos=>20 - if(iswp) bdim=MMG_swapbin(bdim); - fread(&bdim,sw,1,inm); - if(iswp) bdim=MMG_swapbin(bdim); - if(bdim!=3) { - fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); - exit(0); - return(1); - } - continue; + fread(&bdim,sw,1,inm); //NulPos=>20 + if(iswp) bdim=MMG_swapbin(bdim); + fread(&bdim,sw,1,inm); + if(iswp) bdim=MMG_swapbin(bdim); + if(bdim!=3) { + fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); + exit(0); + return(1); + } + continue; } else if(binch==62) { //SolAtVertices - fread(&binch,sw,1,inm); //NulPos - if(iswp) binch=MMG_swapbin(binch); - fread(&sol->np,sw,1,inm); - if(iswp) sol->np=MMG_swapbin(sol->np); - fread(&binch,sw,1,inm); //nb sol - if(iswp) binch=MMG_swapbin(binch); - if(binch!=1) { - fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); - return(1); - } - fread(&btyp,sw,1,inm); //typsol - if(iswp) btyp=MMG_swapbin(btyp); - posnp = ftell(inm); - break; + fread(&binch,sw,1,inm); //NulPos + if(iswp) binch=MMG_swapbin(binch); + fread(&sol->np,sw,1,inm); + if(iswp) sol->np=MMG_swapbin(sol->np); + fread(&binch,sw,1,inm); //nb sol + if(iswp) binch=MMG_swapbin(binch); + if(binch!=1) { + fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); + return(1); + } + fread(&btyp,sw,1,inm); //typsol + if(iswp) btyp=MMG_swapbin(btyp); + posnp = ftell(inm); + break; } else { - fread(&bpos,sw,1,inm); //Pos - if(iswp) bpos=MMG_swapbin(bpos); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - } - } - - } + fread(&bpos,sw,1,inm); //Pos + if(iswp) bpos=MMG_swapbin(bpos); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + } + } + + } if ( !sol->np ) { - fprintf(stdout," ** MISSING DATA\n"); + fprintf(stdout," ** MISSING DATA ss\n"); return(1); } if ( btyp!= 1 && btyp!=3 ) { - fprintf(stdout," ** DATA IGNORED\n"); + fprintf(stdout," ** DATA IGNORED %d\n",btyp); sol->np = 0; return(1); } - + sol->offset = (btyp==1) ? 1 : 6; if ( abs(MMG_imprim) > 5 ) fprintf(stdout," -- READING DATA FILE %s\n",data); if ( !sol->np ) { - fprintf(stdout," ** MISSING DATA\n"); + fprintf(stdout," ** MISSING DATA xx\n"); return(0); } sol->npfixe = sol->np; @@ -742,31 +1176,31 @@ /* read mesh solutions */ sol->npfixe = sol->np; rewind(inm); - fseek(inm,posnp,SEEK_SET); + fseek(inm,posnp,SEEK_SET); for (k=1; k<=sol->np; k++) { isol = (k-1) * sol->offset + 1; - if (sol->ver == 1) { + if (sol->ver == 1) { for (i=0; ioffset; i++) { - if(!bin){ - fscanf(inm,"%f",&fsol); - sol->met[isol + i] = (double) fsol; - } else { - fread(&fsol,sw,1,inm); - if(iswp) fsol=MMG_swapf(fsol); - sol->met[isol + i] = (double) fsol; - } - } + if(!bin){ + fscanf(inm,"%f",&fsol); + sol->met[isol + i] = (double) fsol; + } else { + fread(&fsol,sw,1,inm); + if(iswp) fsol=MMG_swapf(fsol); + sol->met[isol + i] = (double) fsol; + } + } } else { for (i=0; ioffset; i++) { - if(!bin){ - fscanf(inm,"%lf",&sol->met[isol + i]); + if(!bin){ + fscanf(inm,"%lf",&sol->met[isol + i]); - } else { - fread(&sol->met[isol + i],sd,1,inm); - if(iswp) sol->met[isol + i]=MMG_swapd(sol->met[isol + i]); - } - } - } + } else { + fread(&sol->met[isol + i],sd,1,inm); + if(iswp) sol->met[isol + i]=MMG_swapd(sol->met[isol + i]); + } + } + } /* MMG_swap data */ if ( sol->offset == 6 ) { tmp = sol->met[isol + 2]; @@ -778,13 +1212,13 @@ if ( abs(MMG_imprim) > 3 ) fprintf(stdout," NUMBER OF GIVEN DATA %8d\n",sol->npfixe); - fclose(inm); - return(1); + fclose(inm); + return(1); } -int MMG_loadVect(pMesh mesh,char *filename,int npmax) { - FILE *inm; +int MMG_loadVect(pMesh mesh,char *filename,int npmax,void *dataff) { + FILE *inm; pDispl pd; float fsol; int binch,bdim,iswp; @@ -792,10 +1226,13 @@ long posnp; char *ptr,data[128],chaine[128]; - pd = mesh->disp; + if(dataff) + return MMG_loadVectff( mesh, filename,npmax,(DataFF*) dataff); - posnp = 0; - bin = 0; + pd = mesh->disp; + + posnp = 0; + bin = 0; iswp = 0; strcpy(data,filename); @@ -815,76 +1252,76 @@ } fprintf(stdout," %%%% %s OPENED\n",data); - - if(!bin) { + + if(!bin) { strcpy(chaine,"DDD"); - while(fscanf(inm,"%s",&chaine[0])!=EOF && strncmp(chaine,"End",strlen("End")) ) { + while(fscanf(inm,"%s",&chaine[0])!=EOF && strncmp(chaine,"End",strlen("End")) ) { if(!strncmp(chaine,"Dimension",strlen("Dimension"))) { - fscanf(inm,"%d",&dim); - if(dim!=3) { - fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); - return(1); - } - continue; + fscanf(inm,"%d",&dim); + if(dim!=3) { + fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); + return(1); + } + continue; } else if(!strncmp(chaine,"SolAtVertices",strlen("SolAtVertices"))) { - fscanf(inm,"%d",&pd->np); - fscanf(inm,"%d",&type); - if(type!=1) { - fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); - return(1); - } - fscanf(inm,"%d",&btyp); - posnp = ftell(inm); - break; - } - } - } else { - fread(&pd->ver,sw,1,inm); - iswp=0; - if(pd->ver==16777216) iswp=1; + fscanf(inm,"%d",&pd->np); + fscanf(inm,"%d",&type); + if(type!=1) { + fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); + return(1); + } + fscanf(inm,"%d",&btyp); + posnp = ftell(inm); + break; + } + } + } else { + fread(&pd->ver,sw,1,inm); + iswp=0; + if(pd->ver==16777216) iswp=1; else if(pd->ver!=1) { fprintf(stdout,"BAD FILE ENCODING\n"); - } - fread(&pd->ver,sw,1,inm); - if(iswp) pd->ver = MMG_swapbin(pd->ver); + } + fread(&pd->ver,sw,1,inm); + if(iswp) pd->ver = MMG_swapbin(pd->ver); while(fread(&binch,sw,1,inm)!=EOF && binch!=54 ) { - if(iswp) binch=MMG_swapbin(binch); - if(binch==54) break; + if(iswp) binch=MMG_swapbin(binch); + if(binch==54) break; if(binch==3) { //Dimension - fread(&bdim,sw,1,inm); //Pos=>20 - if(iswp) bdim=MMG_swapbin(bdim); - fread(&bdim,sw,1,inm); - if(iswp) bdim=MMG_swapbin(bdim); - if(bdim!=3) { - fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); - exit(0); - return(1); - } - continue; + fread(&bdim,sw,1,inm); //Pos=>20 + if(iswp) bdim=MMG_swapbin(bdim); + fread(&bdim,sw,1,inm); + if(iswp) bdim=MMG_swapbin(bdim); + if(bdim!=3) { + fprintf(stdout,"BAD SOL DIMENSION : %d\n",dim); + exit(0); + return(1); + } + continue; } else if(binch==62) { //SolAtVertices - fread(&binch,sw,1,inm); //Pos - if(iswp) binch=MMG_swapbin(binch); - fread(&pd->np,sw,1,inm); - if(iswp) pd->np=MMG_swapbin(pd->np); - fread(&binch,sw,1,inm); //nb sol - if(iswp) binch=MMG_swapbin(binch); - if(binch!=1) { - fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); - return(1); - } - fread(&btyp,sw,1,inm); //typsol - if(iswp) btyp=MMG_swapbin(btyp); - posnp = ftell(inm); - break; + fread(&binch,sw,1,inm); //Pos + if(iswp) binch=MMG_swapbin(binch); + fread(&pd->np,sw,1,inm); + if(iswp) pd->np=MMG_swapbin(pd->np); + fread(&binch,sw,1,inm); //nb sol + if(iswp) binch=MMG_swapbin(binch); + if(binch!=1) { + fprintf(stdout,"SEVERAL SOLUTION => IGNORED : %d\n",type); + return(1); + } + fread(&btyp,sw,1,inm); //typsol + if(iswp) btyp=MMG_swapbin(btyp); + posnp = ftell(inm); + break; } else { - fread(&bpos,sw,1,inm); //Pos - if(iswp) bpos=MMG_swapbin(bpos); - rewind(inm); - fseek(inm,bpos,SEEK_SET); - } - } - - } + fread(&bpos,sw,1,inm); //Pos + if(iswp) bpos=MMG_swapbin(bpos); + rewind(inm); + fseek(inm,bpos,SEEK_SET); + } + } + + } if ( !pd->np ) { fprintf(stdout," ** MISSING DATA\n"); return(0); @@ -895,7 +1332,7 @@ } if ( btyp != 2 ) { - fprintf(stdout," ** DATA IGNORED\n"); + fprintf(stdout," ** DATA IGNORED %d !=2\n",btyp); return(0); } @@ -907,47 +1344,50 @@ fseek(inm,posnp,SEEK_SET); for (k=1; k<=pd->np; k++) { iadr = (k - 1) * 3 + 1; - if (pd->ver < 2) { + if (pd->ver < 2) { for (i=0; i<3; i++) { - if(!bin){ - fscanf(inm,"%f",&fsol); - pd->mv[iadr + i] = (double) fsol; - } else { - fread(&fsol,sw,1,inm); - if(iswp) fsol=MMG_swapf(fsol); - pd->mv[iadr + i] = (double) fsol; - } - } + if(!bin){ + fscanf(inm,"%f",&fsol); + pd->mv[iadr + i] = (double) fsol; + } else { + fread(&fsol,sw,1,inm); + if(iswp) fsol=MMG_swapf(fsol); + pd->mv[iadr + i] = (double) fsol; + } + } } else { for (i=0; i<3; i++) { - if(!bin){ - fscanf(inm,"%lf",&pd->mv[iadr + i]); - } else { - fread(&pd->mv[iadr + i],sd,1,inm); - if(iswp) pd->mv[iadr + i]=MMG_swapd(pd->mv[iadr + i]); - } - } - } + if(!bin){ + fscanf(inm,"%lf",&pd->mv[iadr + i]); + } else { + fread(&pd->mv[iadr + i],sd,1,inm); + if(iswp) pd->mv[iadr + i]=MMG_swapd(pd->mv[iadr + i]); + } + } + } } if ( abs(mesh->info.imprim) > 3 ) fprintf(stdout," NUMBER OF GIVEN DATA %8d\n",pd->np); - fclose(inm); + fclose(inm); return(1); } /* save mesh to disk */ -int MMG_saveMesh(pMesh mesh,char *filename) { - FILE* inm; - Hedge hed; +int MMG_saveMesh(pMesh mesh,char *filename,void *dataff) { + FILE* inm; + Hedge hed; pPoint ppt; pTria pt1; pTetra pt; int i,k,np,ne,nc,ned,*cor,*ed,ref,bin,bpos; - char *ptr,data[128],chaine[128]; + char *ptr,data[128],chaine[128]; int binch,nu1,nu2; + if(dataff) + return MMG_saveMeshff( mesh, filename,(DataFF*) dataff); + mesh->ver = 2; //double precision bin = 0; strcpy(data,filename); @@ -959,28 +1399,28 @@ *ptr = '\0'; strcat(data,".mesh"); if( !(inm = fopen(data,"w")) ) { - fprintf(stderr," ** UNABLE TO OPEN %s.\n",data); - return(0); + fprintf(stderr," ** UNABLE TO OPEN %s.\n",data); + return(0); } } else { - bin = 1; + bin = 1; } } - else { + else { ptr = strstr(data,".meshb"); if( ptr ) bin = 1; if( !(inm = fopen(data,"w")) ) { fprintf(stderr," ** UNABLE TO OPEN %s.\n",data); return(0); - } + } } fprintf(stdout," %%%% %s OPENED\n",data); /*entete fichier*/ if(!bin) { - strcpy(&chaine[0],"MeshVersionFormatted 2\n"); + strcpy(&chaine[0],"MeshVersionFormatted 2\n"); fprintf(inm,"%s",chaine); - strcpy(&chaine[0],"\n\nDimension 3\n"); + strcpy(&chaine[0],"\n\nDimension 3\n"); fprintf(inm,"%s ",chaine); } else { binch = 1; //MeshVersionFormatted @@ -993,33 +1433,38 @@ fwrite(&bpos,sw,1,inm); binch = 3; fwrite(&binch,sw,1,inm); - + } /* compact vertices */ - if(mesh->ncor) { + if(mesh->ncor) { cor = (int*) M_calloc(mesh->ncor,sizeof(int),"MMG_savemesh"); - assert(cor); + assert(cor); } - if(mesh->ned) { - if ( !MMG_zaldy4(&hed,mesh->ned) ) { - if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : EXPORT EDGES IGNORED\n"); - mesh->ned = 0; - } + if(mesh->ned) { + if ( !MMG_zaldy4(&hed,mesh->ned) ) { + if ( mesh->info.ddebug ) fprintf(stdout," ## MEMORY ALLOCATION PROBLEM : EXPORT EDGES IGNORED\n"); + mesh->ned = 0; + } ed = (int*)M_calloc(2*mesh->ned,sizeof(int),"MMG_savemesh"); - assert(ed); + assert(ed); } - np = 0; + np = 0; nc = 0; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; - if ( ppt->tag & M_UNUSED ) continue; - ppt->tmp = ++np; + if ( ppt->tag & M_UNUSED ) continue; + ppt->tmp = ++np; if ( ppt->geom & M_CORNER ) cor[nc++] = ppt->tmp; + } + //assert(mesh->ncor==nc); + if(mesh->ncor!=nc) { + fprintf(stdout,"WARNING: some corners have been added or deleted\n"); + mesh->ncor = nc; } - assert(mesh->ncor==nc); + if(!bin) { - strcpy(&chaine[0],"\n\nVertices\n"); + strcpy(&chaine[0],"\n\nVertices\n"); fprintf(inm,"%s",chaine); fprintf(inm,"%d\n",np); } else { @@ -1027,27 +1472,27 @@ fwrite(&binch,sw,1,inm); bpos += 12+(1+3*mesh->ver)*4*np; //NullPos fwrite(&bpos,sw,1,inm); - fwrite(&np,sw,1,inm); + fwrite(&np,sw,1,inm); } for(k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; - if ( ppt->tag & M_UNUSED ) continue; - //if(ppt->tmp==52453) printf("point %d --> %d\n",ppt->tmp,k); + if ( ppt->tag & M_UNUSED ) continue; + //if(ppt->tmp==52453) printf("point %d --> %d\n",ppt->tmp,k); if(!bin) { fprintf(inm,"%.15lg %.15lg %.15lg %d\n",ppt->c[0],ppt->c[1],ppt->c[2],ppt->ref); } else { - fwrite((unsigned char*)&ppt->c[0],sd,1,inm); - fwrite((unsigned char*)&ppt->c[1],sd,1,inm); - fwrite((unsigned char*)&ppt->c[2],sd,1,inm); - fwrite((unsigned char*)&ppt->ref,sw,1,inm); + fwrite((unsigned char*)&ppt->c[0],sd,1,inm); + fwrite((unsigned char*)&ppt->c[1],sd,1,inm); + fwrite((unsigned char*)&ppt->c[2],sd,1,inm); + fwrite((unsigned char*)&ppt->ref,sw,1,inm); } } - /* rebuild triangles tabular and write triangles */ + /* rebuild triangles tabular and write triangles */ mesh->nt = 0; if(MMG_markBdry(mesh)) { if(!bin) { - strcpy(&chaine[0],"\n\nTriangles\n"); + strcpy(&chaine[0],"\n\nTriangles\n"); fprintf(inm,"%s",chaine); fprintf(inm,"%d \n",mesh->nt); } else { @@ -1055,49 +1500,48 @@ fwrite(&binch,sw,1,inm); bpos += 12+16*mesh->nt; //Pos fwrite(&bpos,sw,1,inm); - fwrite(&mesh->nt,sw,1,inm); + fwrite(&mesh->nt,sw,1,inm); } for (k=1; k<=mesh->nt; k++) { pt1 = &mesh->tria[k]; - ref = pt1->ref; + ref = pt1->ref; if(!bin) { - //if(ref==0) printf("tr %d bad ref!!\n",k); - fprintf(inm,"%d %d %d %d\n",mesh->point[pt1->v[0]].tmp,mesh->point[pt1->v[1]].tmp - ,mesh->point[pt1->v[2]].tmp,ref); + fprintf(inm,"%d %d %d %d\n",mesh->point[pt1->v[0]].tmp,mesh->point[pt1->v[1]].tmp + ,mesh->point[pt1->v[2]].tmp,ref); } else { - fwrite(&mesh->point[pt1->v[0]].tmp,sw,1,inm); - fwrite(&mesh->point[pt1->v[1]].tmp,sw,1,inm); - fwrite(&mesh->point[pt1->v[2]].tmp,sw,1,inm); - fwrite(&ref,sw,1,inm); + fwrite(&mesh->point[pt1->v[0]].tmp,sw,1,inm); + fwrite(&mesh->point[pt1->v[1]].tmp,sw,1,inm); + fwrite(&mesh->point[pt1->v[2]].tmp,sw,1,inm); + fwrite(&ref,sw,1,inm); } } - } - + } + /* write tetrahedra */ - ne = 0; - ned = 0; - //printf("avt %d\n",mesh->ned); + ne = 0; + ned = 0; + //printf("avt %d\n",mesh->ned); for (k=1; k<=mesh->ne; k++) { pt = &mesh->tetra[k]; - if ( !pt->v[0] ) continue; - if(mesh->ned) { - for (i=0 ; i<6 ; i++) { - if (pt->bdryinfo[i]) { - nu1 = pt->v[MMG_iare[i][0]]; - nu2 = pt->v[MMG_iare[i][1]]; - if (MMG_edgePut(&hed,nu1,nu2,2)<=1) { - ed[2*ned] = (mesh->point[nu1]).tmp; - ed[2*ned + 1] = (mesh->point[nu2]).tmp; - ned++; - } - } - } - } - ne++; + if ( !pt->v[0] ) continue; + if(mesh->ned) { + for (i=0 ; i<6 ; i++) { + if (pt->bdryinfo[i]) { + nu1 = pt->v[MMG_iare[i][0]]; + nu2 = pt->v[MMG_iare[i][1]]; + if (MMG_edgePut(&hed,nu1,nu2,2)<=1) { + ed[2*ned] = (mesh->point[nu1]).tmp; + ed[2*ned + 1] = (mesh->point[nu2]).tmp; + ned++; + } + } + } + } + ne++; } - //printf("ned %d\n",ned); + //printf("ned %d\n",ned); if(!bin) { - strcpy(&chaine[0],"\n\nTetrahedra\n"); + strcpy(&chaine[0],"\n\nTetrahedra\n"); fprintf(inm,"%s",chaine); fprintf(inm,"%d\n",ne); } else { @@ -1105,29 +1549,29 @@ fwrite(&binch,sw,1,inm); bpos += 12 + 20*ne;//Pos fwrite(&bpos,sw,1,inm); - fwrite((unsigned char*)&ne,sw,1,inm); - } - ne=0; + fwrite((unsigned char*)&ne,sw,1,inm); + } + ne=0; for (k=1; k<=mesh->ne; k++) { pt = &mesh->tetra[k]; - if ( !pt->v[0] ) continue; - ne++; - ref = pt->ref; + if ( !pt->v[0] ) continue; + ne++; + ref = pt->ref; if(!bin) { fprintf(inm,"%d %d %d %d %d\n",mesh->point[pt->v[0]].tmp,mesh->point[pt->v[1]].tmp - ,mesh->point[pt->v[2]].tmp,mesh->point[pt->v[3]].tmp,ref); + ,mesh->point[pt->v[2]].tmp,mesh->point[pt->v[3]].tmp,ref); } else { - fwrite(&mesh->point[pt->v[0]].tmp,sw,1,inm); - fwrite(&mesh->point[pt->v[1]].tmp,sw,1,inm); - fwrite(&mesh->point[pt->v[2]].tmp,sw,1,inm); - fwrite(&mesh->point[pt->v[3]].tmp,sw,1,inm); - fwrite(&ref,sw,1,inm); + fwrite(&mesh->point[pt->v[0]].tmp,sw,1,inm); + fwrite(&mesh->point[pt->v[1]].tmp,sw,1,inm); + fwrite(&mesh->point[pt->v[2]].tmp,sw,1,inm); + fwrite(&mesh->point[pt->v[3]].tmp,sw,1,inm); + fwrite(&ref,sw,1,inm); } - } - + } + if(mesh->ned) { if(!bin) { - strcpy(&chaine[0],"\n\nEdges\n"); + strcpy(&chaine[0],"\n\nEdges\n"); fprintf(inm,"%s",chaine); fprintf(inm,"%d\n",ned); } else { @@ -1135,50 +1579,50 @@ fwrite(&binch,sw,1,inm); bpos += 12 + 3*4*ned;//Pos fwrite(&bpos,sw,1,inm); - fwrite((unsigned char*)&ned,sw,1,inm); - } - for (k=0; kncor); } else { binch = 13; //Corners fwrite(&binch,sw,1,inm); - bpos += 12 + 4*mesh->ncor;//Pos + bpos += 12 + 4*mesh->ncor;//Pos fwrite(&bpos,sw,1,inm); - fwrite((unsigned char*)&mesh->ncor,sw,1,inm); + fwrite((unsigned char*)&mesh->ncor,sw,1,inm); } for (k=0; kncor; k++) { if(!bin) { fprintf(inm,"%d \n",cor[k]); } else { - fwrite(&cor[k],sw,1,inm); + fwrite(&cor[k],sw,1,inm); } - } + } /*fin fichier*/ if(!bin) { - strcpy(&chaine[0],"\n\nEnd\n"); + strcpy(&chaine[0],"\n\nEnd\n"); fprintf(inm,"%s",chaine); } else { binch = 54; //End fwrite(&binch,sw,1,inm); } - fclose(inm); + fclose(inm); if(mesh->ncor) M_free(cor); if ( mesh->info.imprim ) { fprintf(stdout," NUMBER OF GIVEN VERTICES %8d\n",mesh->npfixe); @@ -1193,20 +1637,22 @@ if ( mesh->ned ) fprintf(stdout," TOTAL NUMBER OF EDGES %8d\n",ned); } - //if(ned!=mesh->ned) exit(0); + //if(ned!=mesh->ned) exit(0); return(1); } -int MMG_saveSol(pMesh mesh,pSol sol,char *filename) { +int MMG_saveSol(pMesh mesh,pSol sol,char *filename,void *dataff) { FILE* inm; pPoint ppt; float fsol; double tmp; int i,k,nbl,isol,bin,bpos,typ; - char *ptr,data[128],chaine[128]; + char *ptr,data[128],chaine[128]; int binch; + if(dataff) + return MMG_saveSolff( mesh, sol, filename,(DataFF*) dataff); if ( !sol->np ) return(1); bin = 1; @@ -1219,24 +1665,24 @@ *ptr = '\0'; bin = 0; } else { - ptr = strstr(data,".solb"); - if ( ptr ) { - *ptr = '\0'; - bin = 1; + ptr = strstr(data,".solb"); + if ( ptr ) { + *ptr = '\0'; + bin = 1; } else { - ptr = strstr(data,".sol"); - if ( ptr ) { - *ptr = '\0'; - bin = 0; - } - } - } + ptr = strstr(data,".sol"); + if ( ptr ) { + *ptr = '\0'; + bin = 0; + } + } + } } - if ( bin ) + if ( bin ) strcat(data,".solb"); else strcat(data,".sol"); - + sol->ver = 2; if( bin && !(inm = fopen(data,"wb")) ) { fprintf(stderr," ** UNABLE TO OPEN %s.\n",data); @@ -1251,9 +1697,9 @@ /*entete fichier*/ if(!bin) { - strcpy(&chaine[0],"MeshVersionFormatted 2\n"); + strcpy(&chaine[0],"MeshVersionFormatted 2\n"); fprintf(inm,"%s",chaine); - strcpy(&chaine[0],"\n\nDimension 3\n"); + strcpy(&chaine[0],"\n\nDimension 3\n"); fprintf(inm,"%s ",chaine); } else { binch = 1; //MeshVersionFormatted @@ -1266,19 +1712,19 @@ fwrite(&bpos,sw,1,inm); binch = 3; fwrite(&binch,sw,1,inm); - + } switch(sol->offset) { case 1: - typ = 1; - break; + typ = 1; + break; case 6: - typ = 3; + typ = 3; break; default: - fprintf(stdout," ** DATA IGNORED\n"); + fprintf(stdout," ** DATA IGNORED not 1 ou 6 == %d\n",sol->offset); return(0); } @@ -1287,11 +1733,11 @@ for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag & M_UNUSED ) continue; - nbl++; + nbl++; } - + if(!bin) { - strcpy(&chaine[0],"\n\nSolAtVertices\n"); + strcpy(&chaine[0],"\n\nSolAtVertices\n"); fprintf(inm,"%s",chaine); fprintf(inm,"%d\n",nbl); fprintf(inm,"%d %d\n",1,typ); @@ -1300,7 +1746,7 @@ fwrite(&binch,sw,1,inm); bpos += 20+(sol->offset*sol->ver)*4*nbl; //Pos fwrite(&bpos,sw,1,inm); - fwrite(&nbl,sw,1,inm); + fwrite(&nbl,sw,1,inm); binch = 1; //nb sol fwrite(&binch,sw,1,inm); binch = typ; //typ sol @@ -1317,34 +1763,34 @@ sol->met[isol + 3] = tmp; } if (sol->ver < 2) { - if(!bin) { - for (i=0; ioffset; i++) { - fsol = (float) sol->met[isol + i]; - fprintf(inm,"%f ",fsol); - } - fprintf(inm,"\n"); + if(!bin) { + for (i=0; ioffset; i++) { + fsol = (float) sol->met[isol + i]; + fprintf(inm,"%f ",fsol); + } + fprintf(inm,"\n"); } else { - for (i=0; ioffset; i++) { - fsol = (float) sol->met[isol + i]; - fwrite(&fsol,sw,1,inm); - } + for (i=0; ioffset; i++) { + fsol = (float) sol->met[isol + i]; + fwrite(&fsol,sw,1,inm); + } } } else { - if(!bin) { - for (i=0; ioffset; i++) - fprintf(inm,"%.15lg ",sol->met[isol + i]); - fprintf(inm,"\n"); + if(!bin) { + for (i=0; ioffset; i++) + fprintf(inm,"%.15lg ",sol->met[isol + i]); + fprintf(inm,"\n"); } else { - for (i=0; ioffset; i++) - fwrite(&sol->met[isol + i],sd,1,inm); + for (i=0; ioffset; i++) + fwrite(&sol->met[isol + i],sd,1,inm); } - + } } - + /*fin fichier*/ if(!bin) { - strcpy(&chaine[0],"\n\nEnd\n"); + strcpy(&chaine[0],"\n\nEnd\n"); fprintf(inm,"%s",chaine); } else { binch = 54; //End @@ -1355,14 +1801,16 @@ } /*save the node speed : coornew-coorold/dt*/ -int MMG_saveVect(pMesh mesh,char *filename) { - FILE* inm; +int MMG_saveVect(pMesh mesh,char *filename,void *dataff) { + FILE* inm; pDispl pd; pPoint ppt; double dsol,dd; int i,k,nbl,bin,bpos,typ; - char *ptr,data[128],chaine[128]; + char *ptr,data[128],chaine[128]; unsigned char binch; + if(dataff) + return MMG_saveVectff( mesh, filename,(DataFF*) dataff); pd = mesh->disp; pd->ver = 2; @@ -1378,7 +1826,7 @@ bin = 0; } } - if ( bin ) + if ( bin ) strcat(data,".o.solb"); else strcat(data,".o.sol"); @@ -1395,9 +1843,9 @@ /*entete fichier*/ if(!bin) { - strcpy(&chaine[0],"MeshVersionFormatted 2\n"); + strcpy(&chaine[0],"MeshVersionFormatted 2\n"); fprintf(inm,"%s",chaine); - strcpy(&chaine[0],"\n\nDimension 3\n"); + strcpy(&chaine[0],"\n\nDimension 3\n"); fprintf(inm,"%s ",chaine); } else { binch = 1; //MeshVersionFormatted @@ -1410,20 +1858,20 @@ fwrite(&bpos,sw,1,inm); binch = 3; fwrite(&binch,sw,1,inm); - + } - typ = 2; + typ = 2; /* write data */ nbl = 0; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; if ( ppt->tag & M_UNUSED ) continue; - nbl++; + nbl++; } - + if(!bin) { - strcpy(&chaine[0],"\n\nSolAtVertices\n"); + strcpy(&chaine[0],"\n\nSolAtVertices\n"); fprintf(inm,"%s",chaine); fprintf(inm,"%d\n",nbl); fprintf(inm,"%d %d\n",1,typ); @@ -1432,34 +1880,34 @@ fwrite(&binch,sw,1,inm); bpos += 20+(3*pd->ver)*4*nbl; //Pos fwrite(&bpos,sw,1,inm); - fwrite(&nbl,sw,1,inm); + fwrite(&nbl,sw,1,inm); binch = 1; //nb sol fwrite(&binch,sw,1,inm); binch = typ; //typ sol fwrite(&binch,sw,1,inm); - } - - - dd = mesh->info.delta / (double)PRECI; + } + + + dd = mesh->info.delta / (double)PRECI; fprintf(stdout," DT %e\n",mesh->info.dt); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; - if ( ppt->tag & M_UNUSED ) continue; + if ( ppt->tag & M_UNUSED ) continue; for (i=0 ; i<3 ; i++) { - dsol = (ppt->c[i] - mesh->disp->cold[3*(k-1) + 1 + i]* dd - mesh->info.min[i])/mesh->info.dt; - if(!bin) { - fprintf(inm,"%.15lg ",dsol); + dsol = (ppt->c[i] - mesh->disp->cold[3*(k-1) + 1 + i]* dd - mesh->info.min[i])/mesh->info.dt; + if(!bin) { + fprintf(inm,"%.15lg ",dsol); } else { - fwrite(&dsol,sd,1,inm); + fwrite(&dsol,sd,1,inm); } } - if (!bin) fprintf(inm,"\n"); + if (!bin) fprintf(inm,"\n"); } - - + + /*fin fichier*/ if(!bin) { - strcpy(&chaine[0],"\n\nEnd\n"); + strcpy(&chaine[0],"\n\nEnd\n"); fprintf(inm,"%s",chaine); } else { binch = 54; //End --- mmg3d4/build/sources/mmg3d9.c 2012-12-19 16:05:33.000000000 +0100 +++ mmg3d4-nnew/build/sources/mmg3d9.c 2014-03-05 18:37:03.000000000 +0100 @@ -382,7 +382,7 @@ fprintf(stdout," ** MOVING MESH\n"); /*alloc et init metold*/ - sol->metold = (double*)M_calloc(sol->npmax+1,sol->offset*sizeof(double),"MMG_mmg3d9"); + if(!sol->metold) sol->metold = (double*)M_calloc(sol->npmax+1,sol->offset*sizeof(double),"MMG_mmg3d9"); assert(sol->metold); mesh->disp->cold = (double*)M_calloc(3*(mesh->npmax + 1),sizeof(double),"MMG_mmg3d9"); assert(mesh->disp->cold); --- mmg3d4/build/sources/mmg3dmain/mmg3d.c 2012-12-19 16:05:53.000000000 +0100 +++ mmg3d4-new/build/sources/mmg3dmain/mmg3d.c 2014-04-22 16:37:41.000000000 +0200 @@ -46,7 +46,7 @@ #include "compil.date" #include "mesh.h" #include "eigenv.h" - +#include "dataff.h" TIM_mytime MMG_ctim[TIMEMAX]; short MMG_imprim; @@ -310,7 +310,8 @@ strcpy(sol->name,mesh->name); } if ( mesh->outf == NULL ) { - mesh->outf = (char *)calloc(128,sizeof(char)); + static char stbub [256]; + mesh->outf = stbub; /*(char *)calloc(128,sizeof(char)); */ assert(mesh->outf); strcpy(mesh->outf,mesh->name); ptr = strstr(mesh->outf,".mesh"); @@ -397,6 +398,7 @@ 100.*ttot/ttim[0],call[0],ttot/(float)call[0]); } fprintf(stdout,"\n ELAPSED TIME %.2f SEC. (%.2f)\n",ttim[0],ttot); + fflush(stdout); } @@ -433,8 +435,7 @@ return(1); } - -int main(int argc,char *argv[]) { +int mainmmg3d(int argc,char *argv[],DataFF *dataff) { pMesh mesh; pSol sol; Info *info; @@ -442,7 +443,7 @@ int k,iadr,i,jj,kk,ii; double lambda[3],v[3][3],*mold,*m,declic,maxLES,calLES; fprintf(stdout," -- MMG3d, Release %s (%s) \n",M_VER,M_REL); - fprintf(stdout," Copyright (c) LJLL/IMB, 2010\n"); + fprintf(stdout," Copyright (c) LJLL/IMB, 2014\n"); fprintf(stdout," %s\n",COMPIL); signal(SIGABRT,excfun); @@ -451,7 +452,7 @@ signal(SIGSEGV,excfun); signal(SIGTERM,excfun); signal(SIGINT,excfun); - atexit(endcod); + if(dataff==0) atexit(endcod); TIM_tminit(MMG_ctim,TIMEMAX); TIM_chrono(ON,&MMG_ctim[0]); @@ -479,15 +480,27 @@ info->dt = 1.; info->bdry = 0; info->optles = 0; - + /* modif F. Hecht ..*/ + if(dataff) + { + mesh->name=dataff->meshname; + mesh->move=dataff->movename; + sol->name=dataff->solname; + /* printf(" #### %p %p %p --- \n",mesh->name,mesh->move,sol->name); */ + info->imprim=dataff->imprim; + info->memory=dataff->memory; + } + /* end modf */ if ( !parsar(argc,argv,mesh,sol) ) return(1); MMG_imprim = info->imprim; /* load data */ if ( MMG_imprim ) fprintf(stdout,"\n -- INPUT DATA\n"); TIM_chrono(ON,&MMG_ctim[1]); - if ( !MMG_loadMesh(mesh,mesh->name) ) return(1); - if ( !MMG_loadSol(sol,sol->name,mesh->npmax) ) return(1); + /* modif FH. for interface with ff++ add dataff param */ + if ( !MMG_loadMesh(mesh,mesh->name,dataff) ) return(1); + if ( !MMG_loadSol(sol,sol->name,mesh->npmax,dataff ) ) return(1); + if ( sol->np && sol->np != mesh->np ) { fprintf(stdout," ## WARNING: WRONG SOLUTION NUMBER. IGNORED\n"); sol->np = 0; @@ -495,7 +508,7 @@ if ( !parsop(mesh) ) return(1); - if ( abs(info->option) == 9 && !MMG_loadVect(mesh,mesh->move,mesh->np) ) return(0); + if ( abs(info->option) == 9 && !MMG_loadVect(mesh,mesh->move,mesh->np,dataff) ) return(0); if ( !MMG_setfunc(sol->offset) ) return(1); if ( !MMG_scaleMesh(mesh,sol) ) return(1); @@ -527,7 +540,7 @@ if ( !MMG_hashTetra(mesh) ) return(1); if ( !MMG_markBdry(mesh) ) return(1); if (abs(mesh->info.option)==10) { - MMG_saveMesh(mesh,"tetra.mesh"); + MMG_saveMesh(mesh,"tetra.mesh",dataff); return(0); } @@ -571,8 +584,8 @@ if ( abs(info->option) == 9 ) { if(!MMG_mmg3d9(mesh,sol,&alert)) { if ( !MMG_unscaleMesh(mesh,sol) ) return(1); - MMG_saveMesh(mesh,mesh->outf); - MMG_saveSol(mesh,sol,mesh->outf); + MMG_saveMesh(mesh,mesh->outf,dataff); + MMG_saveSol(mesh,sol,mesh->outf,dataff); return(1); } /*puts("appel 1"); @@ -678,18 +691,18 @@ fprintf(stdout,"\n ## WARNING: INCOMPLETE MESH %d , %d\n", mesh->np,mesh->ne); - if ( MMG_imprim ) fprintf(stdout,"\n -- WRITING DATA FILE %s\n",mesh->outf); + if ( MMG_imprim && !dataff) fprintf(stdout,"\n -- WRITING DATA FILE %s\n",mesh->outf); TIM_chrono(ON,&MMG_ctim[1]); if ( !MMG_unscaleMesh(mesh,sol) ) return(1); - MMG_saveMesh(mesh,mesh->outf); + MMG_saveMesh(mesh,mesh->outf,dataff); if ( info->option == 9 ) { - MMG_saveSol(mesh,sol,mesh->outf); - MMG_saveVect(mesh,mesh->move); + MMG_saveSol(mesh,sol,mesh->outf,dataff); + MMG_saveVect(mesh,mesh->move,dataff); } else - MMG_saveSol(mesh,sol,mesh->outf); + MMG_saveSol(mesh,sol,mesh->outf,dataff); TIM_chrono(OFF,&MMG_ctim[1]); - if ( MMG_imprim ) fprintf(stdout," -- WRITING COMPLETED\n"); + if ( MMG_imprim && !dataff) fprintf(stdout," -- WRITING COMPLETED\n"); /* free mem */ M_free(mesh->point); @@ -697,14 +710,42 @@ M_free(mesh->tetra); /*la desallocation de ce pointeur plante dans certains cas...*/ M_free(mesh->adja); + /* free FH thank to Iztok Bajc */ + /* if( mesh->outf ) free( mesh->outf ); */ + if(sol->metold ) M_free(sol->metold ); + if(mesh->disp->cold ) M_free(mesh->disp->cold); + /* ---- */ M_free(mesh->disp->alpha); M_free(mesh->disp->mv); M_free(mesh->disp); - if ( sol->npfixe ) M_free(sol->met); + if ( sol->met ) M_free(sol->met); M_free(sol); if ( MMG_imprim < -4 || info->ddebug ) M_memDump(); M_free(mesh); + if(MMG_imprim && dataff ) endcod(); + if( M_memLeak() > 1000) + { + M_memDump(); + } return(0); } + +int main(int argc,char *argv[]) { + return mainmmg3d( argc,argv,0); +} +/* + def + */ + MMG_Swap MMG_swpptr; + double (*MMG_length)(double *,double *,double *,double *); + double (*MMG_caltet)(pMesh ,pSol ,int ); + double (*MMG_calte1)(pMesh ,pSol ,int ); + int (*MMG_caltet2)(pMesh ,pSol ,int ,int ,double ,double *); + int (*MMG_cavity)(pMesh ,pSol ,int ,int ,pList ,int ); + int (*MMG_buckin)(pMesh ,pSol ,pBucket ,int ); + int (*MMG_optlen)(pMesh ,pSol ,double ,int ); + int (*MMG_interp)(double *,double *,double *,double ); + int (*MMG_optlentet)(pMesh ,pSol ,pQueue ,double ,int ,int ); + int (*MMG_movevertex)(pMesh ,pSol ,int ,int ); freefem++-3.38-1/download/metis/Makefile000644 000767 000024 00000006617 12477547615 020230 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- include Makefile.in all-local: metis # Downloading and compiling Tetgen # ------------------------------ # http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-4.0.tar.gz # Metis information DIRPKG=../pkg SRCDIR=metis-$(metis_VERSION) PACKAGE=$(DIRPKG)/metis-$(metis_VERSION).tar.gz SERVER=http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis #//http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/OLD INSTALL=../.. # FFCS - 14/11/11 - version 4.0.3 is not available from netlib anymore metis_VERSION=5.1.0 metis: FAIRE $(SRCDIR)/FAIT: $(MAKE) install touch $(SRCDIR)/FAIT install:$(SRCDIR)/tag-compile # cd $(SRCDIR)/Programs ;$(MAKE) # cd $(SRCDIR) ; $(MAKE) -C install -mkdir -p ../include/metis -mkdir -p ../lib/metis cp $(SRCDIR)/libmetis.a ../lib/metis cp $(SRCDIR)/include/*.h ../include/metis FAIRE: $(SRCDIR)/FAIT $(MAKE) WHERE touch FAIRE Makefile.in: ../../config.status Makefile-metis.in ../../config.status --file="Makefile.in:Makefile-metis.in" $(SRCDIR)/tag-compile: $(SRCDIR)/tags #cd $(SRCDIR)/libmetis ; make -C $(SRCDIR)/libmetis $(OBJS) 'CC=$(CC)' CFLAGS='$(CFLAGS) -I../GKlib -I../include -I.' make -C $(SRCDIR)/GKlib $(OBJS_GK) 'CC=$(CC)' CFLAGS='$(CFLAGS) -I../GKlib -I../include -I. -Dmetis_EXPORTS' mkdir $(SRCDIR)/lib cd $(SRCDIR); $(AR) libmetis.a libmetis/*.o GKlib/*.o touch $(SRCDIR)/tag-compile WHERE: -if [ -f $(SRCDIR)/FAIT ] ; then \ echo metis LD -L@DIR@/lib/metis -lmetis >$(SRCDIR)/$(INSTALL)/lib/WHERE.metis ;\ echo metis INCLUDE -I@DIR@/include/metis >> $(SRCDIR)/$(INSTALL)/lib/WHERE.metis ;\ fi OBJS=auxapi.o coarsen.o fm.o graph.o kwayrefine.o minconn.o options.o separator.o timing.o \ balance.o compress.o fortran.o initpart.o mcutil.o mincover.o parmetis.o sfm.o util.o \ bucketsort.o contig.o frename.o kmetis.o mesh.o mmd.o pmetis.o srefine.o wspace.o \ checkgraph.o debug.o gklib.o kwayfm.o meshpart.o ometis.o refine.o stat.o OBJS_GK=b64.o error.o fs.o graph.o itemsets.o omp.o random.o sort.o tokenizer.o \ blas.o evaluate.o getopt.o htable.o mcore.o pdb.o rw.o string.o util.o \ csr.o fkvkselect.o gkregex.o io.o memory.o pqueue.o seq.o timers.o # FFCS: patch is necessary for metis 4.0, but not for 4.0.3 $(SRCDIR)/tags: $(PACKAGE) tar xvzf $(PACKAGE) touch $(SRCDIR)/tags $(SRCDIR)/tags-4.0: $(PACKAGE) tar xvzf $(PACKAGE) patch -p0 $(SRCDIR)/Programs/Makefile mv $(SRCDIR)/Lib/Makefile $(SRCDIR)/Lib/Makefile-orig sed -e 's;../libmetis.a;../$(INSTALL)/lib/metis/libmetis.a;' \ <$(SRCDIR)/Lib/Makefile-orig \ >$(SRCDIR)/Lib/Makefile touch $(SRCDIR)/tags $(PACKAGE): ../getall -o METIS -a clean-local: -cd $(SRCDIR) && $(MAKE) realclean -C $(SRCDIR) -rm -rf metis-4.0 config.log -rm -rf ../lib/metis ../lib/WHERE.metis -rm -rf ../include/metis -rm -rf $(SRCDIR) -rm FAIRE FAIT # FFCS - 23/5/12 - $(SRCDIR)/$(INSTALL) is meaningless if $(SRCDIR) does not exist clean: clean-local -rm ../lib/metis/libmetis.a -rm ../lib/include/metis.h -rm -rf $(SRCDIR) -rm FAIRE FAIT freefem++-3.38-1/download/metis/Makefile-metis.in000644 000767 000024 00000000651 12500012405 021707 0ustar00hechtstaff000000 000000 # Which compiler to use CC = @CC@ # What optimization level to use OPTFLAGS = @CFLAGS@ CFLAGS = @CFLAGS@ # What options to be used by the compiler COPTIONS = @FFMETIS_CFLAGS@ # What options to be used by the loader LDOPTIONS = @LDFLAGS@ # What archiving to use AR = @AR@ @ARFLAGS@ # What to use for indexing the archive RANLIB = @RANLIB@ #RANLIB = ar -ts #RANLIB = WGET = @WGET@ EXEEXT = @EXEEXT@ VERNUM = @EXEEXT@freefem++-3.38-1/download/metis/metis-4.0_main_return.patch000644 000767 000024 00000012076 12167254041 023610 0ustar00hechtstaff000000 000000 --- metis-4.0/Programs/kmetis.c.orig 2013-01-26 21:01:39.898052768 +0000 +++ metis-4.0/Programs/kmetis.c 2013-01-26 21:01:52.186053491 +0000 @@ -19,7 +19,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, nparts, options[10]; idxtype *part; @@ -100,6 +100,8 @@ GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, &part, LTERM); + + return 0; } --- metis-4.0/Programs/pmetis.c.orig 2013-01-26 22:42:46.375724925 +0000 +++ metis-4.0/Programs/pmetis.c 2013-01-26 22:43:33.744727711 +0000 @@ -19,7 +19,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, nparts, options[10]; idxtype *part; @@ -100,6 +100,8 @@ GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, &part, LTERM); + + return 0; } --- ./metis-4.0/Programs/graphchk.c.orig 2013-01-26 23:00:11.167253583 +0000 +++ ./metis-4.0/Programs/graphchk.c 2013-01-26 23:00:38.003255160 +0000 @@ -19,7 +19,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { GraphType graph; char filename[256]; @@ -53,6 +53,8 @@ GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, LTERM); + + return 0; } --- ./metis-4.0/Programs/mesh2dual.c.orig 2013-01-26 23:02:14.677260844 +0000 +++ ./metis-4.0/Programs/mesh2dual.c 2013-01-26 23:02:45.081262631 +0000 @@ -20,7 +20,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, j, ne, nn, etype, numflag=0; idxtype *elmnts, *xadj, *adjncy; @@ -67,6 +67,7 @@ GKfree(&elmnts, &xadj, &adjncy, LTERM); + return 0; } --- ./metis-4.0/Programs/mesh2nodal.c.orig 2013-01-26 23:03:35.671265601 +0000 +++ ./metis-4.0/Programs/mesh2nodal.c 2013-01-26 23:03:59.234266985 +0000 @@ -20,7 +20,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, j, ne, nn, etype, numflag=0; idxtype *elmnts, *xadj, *adjncy; @@ -67,6 +67,7 @@ GKfree(&elmnts, &xadj, &adjncy, LTERM); + return 0; } --- ./metis-4.0/Programs/oemetis.c.orig 2013-01-26 23:04:51.689270079 +0000 +++ ./metis-4.0/Programs/oemetis.c 2013-01-26 23:05:15.686271479 +0000 @@ -19,7 +19,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, options[10]; idxtype *perm, *iperm; @@ -90,6 +90,8 @@ GKfree(&graph.xadj, &graph.adjncy, &perm, &iperm, LTERM); + + return 0; } --- ./metis-4.0/Programs/onmetis.c.orig 2013-01-26 23:06:04.908274368 +0000 +++ ./metis-4.0/Programs/onmetis.c 2013-01-26 23:06:26.011275618 +0000 @@ -19,7 +19,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, options[10]; idxtype *perm, *iperm; @@ -90,6 +90,8 @@ GKfree(&graph.xadj, &graph.adjncy, &perm, &iperm, LTERM); + + return 0; } --- ./metis-4.0/Programs/partdmesh.c.orig 2013-01-26 23:07:09.315278152 +0000 +++ ./metis-4.0/Programs/partdmesh.c 2013-01-26 23:07:33.761279588 +0000 @@ -20,7 +20,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, j, ne, nn, etype, numflag=0, nparts, edgecut; idxtype *elmnts, *epart, *npart; @@ -88,6 +88,7 @@ GKfree(&elmnts, &epart, &npart, LTERM); + return 0; } --- ./metis-4.0/Programs/partnmesh.c.orig 2013-01-26 23:09:04.858284939 +0000 +++ ./metis-4.0/Programs/partnmesh.c 2013-01-26 23:09:45.701287342 +0000 @@ -20,7 +20,7 @@ /************************************************************************* * Let the game begin **************************************************************************/ -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, j, ne, nn, etype, numflag=0, nparts, edgecut; idxtype *elmnts, *epart, *npart; @@ -88,6 +88,7 @@ GKfree(&elmnts, &epart, &npart, LTERM); + return 0; } freefem++-3.38-1/download/metis/patch-metis000644 000767 000024 00000000467 11406142255 020704 0ustar00hechtstaff000000 000000 --- metis-4.0/Lib/rename.h 2009-09-22 18:28:35.000000000 +0200 +++ metis-4.0/Lib/rename.h-ok 2009-09-22 18:28:47.000000000 +0200 @@ -410,7 +410,7 @@ #define RandomPermute __RandomPermute #define ispow2 __ispow2 #define InitRandom __InitRandom -#define log2 __log2 +#define log2 metis_log2 freefem++-3.38-1/download/ipopt/Makefile000755 000767 000024 00000004766 12500235435 020225 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- include Makefile.inc all-local: Ipopt # Downloading and compiling mumps # ------------------------------ DIR=$(DOWNLOADFF)/ipopt DIRPKG=../pkg SRCDIR=Ipopt-$(VERSION) PACKAGE=$(DIRPKG)/Ipopt-$(VERSION).tgz INSTALL=../.. VERSION=3.10.2 # 3.10.2 URL=http://www.coin-or.org/download/source/Ipopt FHSL=#$(DIRPKG)/ddeps.f $(DIRPKG)/ma27ad.f $(DIRPKG)/mc19d.f LIBMUMPS=-L$(DOWNLOADFF)/lib -ldmumpsFREEFEM-SEQ -lzmumpsFREEFEM-SEQ -lmumps_commonFREEFEM-SEQ -lpordFREEFEM-SEQ -lmpiseqFREEFEM-SEQ INCMUMPS=$(DOWNLOADFF)/include/libseq #/Ipopt-3.10.2.tgz Ipopt: $(SRCDIR)/FAIRE # --enable-static --disable-shared # ALH - 6/1/14 - We need to specify FLIBS explicitely because Ipopt # fails to guess FLIBS correctly on Windows+Cygwin+Mingw64, see [[file:Makefile.inc.in::FLIBS]] $(SRCDIR)/FAIT: $(SRCDIR)/tag-tar # FFCS - disable dependency tracking like in FFCS itself for MinGW compilation (problem with backslashes, see # [[file:../../../../configure.ac::enable_dependency_tracking]]) cd $(SRCDIR) ; \ ./configure --disable-dependency-tracking \ --disable-shared --enable-static \ --with-mumps='$(LIBMUMPS)' \ --without-hsl \ --with-mumps-incdir='$(INCMUMPS)' \ CXX='$(CXX)' CXXFLAGS='$(CXXFLAGS) -I$(INCMUMPS)' \ CC='$(CC)' CFLAGS='$(CFLAGS) -I$(INCMUMPS)' \ F77='$(FC)' FFLAGS='$(FCFLAGS)' \ FLIBS='$(FLIBS)' \ CXXCPP='$(CXXCPP)' CPP='$(CXXCPP)' \ --with-blas='$(LIBBLAS)' --with-lapack='$(LIBLAPACK)' --prefix='$(DOWNLOADFF)' touch $(SRCDIR)/FAIT # FFCS - avoid remaking install every time install.done: $(SRCDIR)/FAIT $(MAKE) -C $(SRCDIR) install touch $@ clean-local:: -rm *.done # FFCS - install and WHERE need to be sequential WHERE.done: install.done echo Ipopt LD -L@DIR@/lib -lipopt >$(SRCDIR)/$(INSTALL)/lib/WHERE.Ipopt; echo Ipopt INCLUDE -I@DIR@/include/coin >> $(SRCDIR)/$(INSTALL)/lib/WHERE.Ipopt ; touch $@ Makefile.inc: ../../config.status --file="Makefile.inc:Makefile.inc.in" # FFCS - install and WHERE need to be sequential $(SRCDIR)/FAIRE: install.done WHERE.done touch $@ $(SRCDIR)/$(INSTALL): $(SRCDIR)/tag-tar $(SRCDIR)/tag-tar:$(PACKAGE) $(FHSL) tar xvzf $(PACKAGE) patch -p0 > ALH - 6/1/14 - Ipopt fails to guess FLIBS correctly on Windows+Cygwin+Mingw64 FLIBS=@FLIBS@ freefem++-3.38-1/download/ipopt/patch-IpBlas000644 000767 000024 00000006767 12106520714 020756 0ustar00hechtstaff000000 000000 --- Ipopt-3.10.2/Ipopt/src/LinAlg/IpBlas.cpp 2010-12-21 22:34:47.000000000 +0100 +++ Ipopt-3.10.2-okk/Ipopt/src/LinAlg/IpBlas.cpp 2012-03-15 15:30:11.000000000 +0100 @@ -8,7 +8,7 @@ #include "IpoptConfig.h" #include "IpBlas.hpp" - +#include // Prototypes for the BLAS routines extern "C" { @@ -57,6 +57,7 @@ int transa_len, int diag_len); } + namespace Ipopt { #ifndef HAVE_CBLAS @@ -65,8 +66,13 @@ Index incY) { ipfint n=size, INCX=incX, INCY=incY; - - return F77_FUNC(ddot,DDOT)(&n, x, &INCX, y, &INCY); + + Number s=0; + if( incX && incY ) s= F77_FUNC(ddot,DDOT)(&n, x, &INCX, y, &INCY) ; + else + for (int i=0,ix=0,iy=0; i$(SRCDIR)/src/config/Makefile.config # cd $(SRCDIR)/src/config/; mv Makefile.config Makefile-tmp.config; # sed -e 's;${abs_top_builddir}/download/hypre/${SRCDIR}/src/blas; ;'\ # <$(SRCDIR)/src/config/Makefile-tmp.config\ # >$(SRCDIR)/src/config/Makefile.config # # end patch cd $(SRCDIR)/src && $(MAKE) cd $(SRCDIR)/src && $(MAKE) install touch $(SRCDIR)/FAIT install: cd $(SRCDIR)/src && $(MAKE) install WHERE: if [ -f $(SRCDIR)/FAIT ] ; then \ echo hypre LD -L@DIR@/lib/hypre -lHYPRE >$(SRCDIR)/$(INSTALL)/lib/WHERE.hypre ;\ echo hypre INCLUDE -I@DIR@/include/hypre >> $(SRCDIR)/$(INSTALL)/lib/WHERE.hypre ;\ fi $(SRCDIR): $(PACKAGE) tar xvzf $(PACKAGE) touch $(SRCDIR) $(PACKAGE): -mkdir $(DIRPKG) cd $(PKGDIR); $(WGET) $(SERVER)/`basename $(PACKAGE)` clean: clean-local clean-local: -rm -rf $(SRCDIR) FAIT -rm ff-flags FAIT ff-flags: ../Makefile ff-flags.inc ../../config.status --file="ff-flags:ff-flags.inc" freefem++-3.38-1/download/hips/hips-1.2b-rc4.patch000644 000767 000024 00000013070 12021334263 021465 0ustar00hechtstaff000000 000000 diff -ur hips-1.2b-rc4/SRC/INCLUDE/hips.h hips-1.2b-rc4-okk/SRC/INCLUDE/hips.h --- hips-1.2b-rc4/SRC/INCLUDE/hips.h 2009-06-21 23:12:59.000000000 +0200 +++ hips-1.2b-rc4-okk/SRC/INCLUDE/hips.h 2010-06-17 10:42:14.000000000 +0200 @@ -122,6 +122,7 @@ #ifndef HIPS_H #define HIPS_H #include +#include #include "type.h" #ifdef INTL diff -ur hips-1.2b-rc4/SRC/INCLUDE/makefile hips-1.2b-rc4-okk/SRC/INCLUDE/makefile --- hips-1.2b-rc4/SRC/INCLUDE/makefile 2009-03-09 13:34:49.000000000 +0100 +++ hips-1.2b-rc4-okk/SRC/INCLUDE/makefile 2010-06-17 10:42:14.000000000 +0200 @@ -7,7 +7,7 @@ $(CP) -f hips.inc $(HIPS_DIR)/LIB/ hips.inc: hips_interface.F90 - $(CC) $(CC_OPT) -E hips_interface.F90 > hips.inc + $(CPP) $(CFLAGS) $(CC_OPT) hips_interface.F90 > hips.inc .h: $(CP) -f $< $(HIPS_DIR)/LIB/ Only in hips-1.2b-rc4-okk/SRC/INCLUDE: makefile.orig diff -ur hips-1.2b-rc4/SRC/INCLUDE/queue.h hips-1.2b-rc4-okk/SRC/INCLUDE/queue.h --- hips-1.2b-rc4/SRC/INCLUDE/queue.h 2009-06-21 23:12:57.000000000 +0200 +++ hips-1.2b-rc4-okk/SRC/INCLUDE/queue.h 2010-06-25 08:21:50.000000000 +0200 @@ -98,7 +98,7 @@ } Heap; -#define static +/*#define static*/ int Heap_Init (Heap *, dim_t size); void Heap_Exit (Heap *); diff -ur hips-1.2b-rc4/SRC/IO/io_hb.c hips-1.2b-rc4-okk/SRC/IO/io_hb.c --- hips-1.2b-rc4/SRC/IO/io_hb.c 2009-05-11 15:59:33.000000000 +0200 +++ hips-1.2b-rc4-okk/SRC/IO/io_hb.c 2010-06-17 10:42:14.000000000 +0200 @@ -222,7 +222,11 @@ #include #include #include +#ifdef __APPLE__ +#include +#else #include +#endif #include /** macros FSCANF and FGETS **/ diff -ur hips-1.2b-rc4/SRC/IO/io_hb.h hips-1.2b-rc4-okk/SRC/IO/io_hb.h --- hips-1.2b-rc4/SRC/IO/io_hb.h 2009-02-23 23:59:03.000000000 +0100 +++ hips-1.2b-rc4-okk/SRC/IO/io_hb.h 2010-06-17 10:42:14.000000000 +0200 @@ -5,7 +5,11 @@ #include #include +#ifdef __APPLE__ +#include +#else #include +#endif #ifdef __cplusplus extern "C" { #endif diff -ur hips-1.2b-rc4/SRC/IO/io_mm.c hips-1.2b-rc4-okk/SRC/IO/io_mm.c --- hips-1.2b-rc4/SRC/IO/io_mm.c 2009-05-11 15:59:33.000000000 +0200 +++ hips-1.2b-rc4-okk/SRC/IO/io_mm.c 2010-06-17 10:42:14.000000000 +0200 @@ -11,7 +11,11 @@ #include #include +#ifdef __APPLE__ +#include +#else #include +#endif #include diff -ur hips-1.2b-rc4/SRC/IO/makefile hips-1.2b-rc4-okk/SRC/IO/makefile --- hips-1.2b-rc4/SRC/IO/makefile 2009-03-19 18:13:16.000000000 +0100 +++ hips-1.2b-rc4-okk/SRC/IO/makefile 2010-06-17 10:42:14.000000000 +0200 @@ -17,7 +17,7 @@ $(AR) $(ARFLAGS) $(LIBIOMM) $(OBJ) uread.f90: template-uread.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E $< > $@ + $(CPP) $(CFLAGS) $(CC_OPT) $< > $@ %.o: %.c $(CC) $(CC_OPT) $< -c -o $@ Only in hips-1.2b-rc4-okk/SRC/IO: makefile.orig diff -ur hips-1.2b-rc4/SRC/SPKIT/makefile hips-1.2b-rc4-okk/SRC/SPKIT/makefile --- hips-1.2b-rc4/SRC/SPKIT/makefile 2009-03-19 18:13:16.000000000 +0100 +++ hips-1.2b-rc4-okk/SRC/SPKIT/makefile 2010-06-17 10:42:14.000000000 +0200 @@ -6,6 +6,7 @@ OBJ = $(TMP:.f90=.o) else OBJ = + AR = echo do nothing : ar endif default: $(OBJ) @@ -15,10 +16,10 @@ $(FC) $(FC_OPT) $< -c -o $@ skitfc.f90: template-skitfc.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E $< > $@ + $(CPP) $(CFLAGS) $(CC_OPT) $< > $@ skitf.f90: template-skitf.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E $< > $@ + $(CPP) $(CFLAGS) $(CC_OPT) $< > $@ clean: rm -f $(TMP) *.o *.ex* *core ./extras/core* out* \#* *~ Only in hips-1.2b-rc4-okk/SRC/SPKIT: makefile.orig diff -ur hips-1.2b-rc4/TESTS/PARALLEL/makefile hips-1.2b-rc4-okk/TESTS/PARALLEL/makefile --- hips-1.2b-rc4/TESTS/PARALLEL/makefile 2009-04-30 10:24:48.000000000 +0200 +++ hips-1.2b-rc4-okk/TESTS/PARALLEL/makefile 2010-06-17 10:42:14.000000000 +0200 @@ -41,17 +41,17 @@ $(MPICC) $(MPICC_OPT) $< -c -o $@ testHIPS1-Fortran.f90 : ../../SRC/INCLUDE/hips.inc templateHIPS1-Fortran.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E templateHIPS1-Fortran.F90 > testHIPS1-Fortran.f90 + $(CPP) $(CFLAGS) $(CC_OPT) templateHIPS1-Fortran.F90 > testHIPS1-Fortran.f90 testHIPS2-Fortran.f90 : ../../SRC/INCLUDE/hips.inc templateHIPS2-Fortran.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E templateHIPS2-Fortran.F90 > testHIPS2-Fortran.f90 + $(CPP) $(CFLAGS) $(CC_OPT) templateHIPS2-Fortran.F90 > testHIPS2-Fortran.f90 testHIPS3-Fortran.f90 : ../../SRC/INCLUDE/hips.inc templateHIPS3-Fortran.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E templateHIPS3-Fortran.F90 > testHIPS3-Fortran.f90 + $(CPP) $(CFLAGS) $(CC_OPT) templateHIPS3-Fortran.F90 > testHIPS3-Fortran.f90 testHIPS-Laplace1-Fortran.f90 : ../../SRC/INCLUDE/hips.inc templateHIPS-Laplace1-Fortran.F90 - $(CC) $(CFLAGS) $(CC_OPT) -E templateHIPS-Laplace1-Fortran.F90 > testHIPS-Laplace1-Fortran.f90 + $(CPP) $(CFLAGS) $(CC_OPT) templateHIPS-Laplace1-Fortran.F90 > testHIPS-Laplace1-Fortran.f90 testHIPS1-Fortran.o: testHIPS1-Fortran.f90 $(LIBHIPS) $(MPIFC) $(MPIFC_OPT) $< -c -o $@ Only in hips-1.2b-rc4-okk/TESTS/PARALLEL: makefile.orig Only in hips-1.2b-rc4-okk: makefile.inc Only in hips-1.2b-rc4-okk: tag-ff++ diff -ur hips-1.2b-rc4/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd.c~ hips-1.2b-rc4/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd.c --- hips-1.2b-rc4/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd.c~ 2009-06-21 23:13:12.000000000 +0200 +++ hips-1.2b-rc4/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd.c 2012-09-04 10:08:08.000000000 +0200 @@ -80,7 +80,7 @@ assert(incx == incy); for(i=0; i permet de chopper tout les points *.c d'un repertoire # OBJ = $(SRC:.c=.o) # ==> implique *.o dans les repertoire pour recuperer SRCPhidalCommon = $(SRCDIR)/SRC/PHIDAL/COMMON ObjPhidalCommon = $(SRCPhidalCommon)/*.o SRCPhidalOrdering = $(SRCDIR)/SRC/PHIDAL/ORDERING ObjPhidalOrdering = $(SRCPhidalOrdering)/*.o SRCPhidalSequential = $(SRCDIR)/SRC/PHIDAL/SEQUENTIAL ObjPhidalSequential = $(SRCPhidalSequential)/*.o SRCDBMATRIX = $(SRCDIR)/SRC/BLOCK/DBMATRIX/ ObjBlockDBMATRIX = $(SRCDIR)/SRC/BLOCK/DBMATRIX/amalgamate.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix2PhidalMatrix.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_Build.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_Copy.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_FACTO2.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_FACTO.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_FACTOu.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_func.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_GEMM.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_GEMM_N.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_GEMMu.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MatVec2.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MatVec.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MLILUPrec.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MLIutil.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_PrecSolve.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_SEQ.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_Setup.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_SetupHID.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_solve2.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_solve.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_TRSM.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_LL.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_RL.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_RL_DROP.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_func.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_pic.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_SchurProd.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/db_struct.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/dumpDBMatrix.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_SymbolMatrix.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/PHIDAL_SymbolMatrix.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/print.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/SF_Direct.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/size.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MLICCPrec.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix2PhidalMatrix_drop.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd_PH_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_SetupHID.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MLICCPrec.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMATRIX_MLILUPrec.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_LL.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_LLu.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_FACTO.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix_FACTO2u.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_RL.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_RLu.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_RL_DROP.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBPrec_FACTO_TRSM_GEMM_RL_DROPu.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd_DB_PH.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd_PH_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_Fgmresd_DB_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_PCG_DB_PH.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_PCG_PH_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_PCG_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/HIPS_PCG_DB_DB.o \ $(SRCDIR)/SRC/BLOCK/DBMATRIX/DBMatrix2PhidalMatrix_drop.o SRCBlockSOLVMATRIX = $(SRCDIR)/SRC/BLOCK/SOLVMATRIX ObjBlockSOLVMATRIX = $(SRCBlockSOLVMATRIX)/*.o SRCBlockSOLVMATRIX2 = $(SRCDIR)/SRC/BLOCK/SOLVMATRIX2 ObjBlockSOLVMATRIX2 = $(SRCBlockSOLVMATRIX2)/*.o #/SRC/IO; ObjIO = $(SRCDIR)/SRC/IO/*.o #/SRC/PHIDAL/PARALLEL SRCPhidalParallel = $(SRCDIR)/SRC/PHIDAL/PARALLEL ObjPhidalParallel = $(SRCPhidalParallel)/*.o #SRC/BLOCK/PARALLEL ObjBlockParallel = $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_func.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_Build.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_Setup.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_Copy.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDISTRMATRIX_SEQ.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDISTRMATRIX_MLICCPrec.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDISTRMATRIX_MLILUPrec.o $(SRCDIR)/SRC/BLOCK/PARALLEL/db_parallel_struct.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBcomm.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix2PhidalDistrMatrix.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDISTRMATRIX_PrecSolve.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_solve.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_ICCT.o $(SRCDIR)/SRC/BLOCK/PARALLEL/CellDBDistr.o $(SRCDIR)/SRC/BLOCK/PARALLEL/VS_RowDiv.o $(SRCDIR)/SRC/BLOCK/PARALLEL/HIPS_DistrFgmresd_PH_DB.o $(SRCDIR)/SRC/BLOCK/PARALLEL/HIPS_DistrFgmresd_DB_PH.o $(SRCDIR)/SRC/BLOCK/PARALLEL/HIPS_DistrFgmresd_DB.o $(SRCDIR)/SRC/BLOCK/PARALLEL/HIPS_DistrFgmresd_DB_DB.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_SchurProd.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_SetupHID.o $(SRCDIR)/SRC/BLOCK/PARALLEL/HIPS_DistrPCG_PH_DB.o $(SRCDIR)/SRC/BLOCK/PARALLEL/HIPS_DistrPCG_DB_PH.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_func.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_FACTO.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_FACTOu.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_FACTO_TRSM_GEMM_LL.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_FACTO_TRSM_GEMM_RL.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_FACTO_TRSM_GEMM_RL_DROP.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_FACTO_TRSM_GEMM_LLu.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_FACTO_TRSM_GEMM_RLu.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_FACTO_TRSM_GEMM_RL_DROPu.o \ $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrPrec_func2.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDistrMatrix_solve_sub.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBcomm2.o $(SRCDIR)/SRC/BLOCK/PARALLEL/DBDISTRMATRIX_MatVec2.o #SRC/HIPS_WRAPPER ObjHIPS_WRAPPER= $(SRCDIR)/SRC/HIPS_WRAPPER/*.o #SRC/BLAS ObjBLAS= $(SRCDIR)/SRC/BLAS/zsymv.o $(SRCDIR)/SRC/BLAS/csymv.o #SRC/SPKIT pas besoin ObjSPKIT= $(SRCDIR)/SRC/SPKIT/skitfc.o $(SRCDIR)/SRC/SPKIT/skitf.o # definition of obj for librairies OBJLIBHIPSSEQUENTIAL = $(ObjPhidalCommon) $(ObjPhidalOrdering) $(ObjPhidalSequential) $(ObjBlockDBMATRIX) $(ObjBlockSOLVMATRIX) $(ObjBlockSOLVMATRIX2) $(ObjHIPS_WRAPPER) $(ObjBLAS) OBJLIBHIPS = $(ObjPhidalCommon) $(ObjPhidalOrdering) $(ObjPhidalSequential) $(ObjBlockDBMATRIX) $(ObjBlockSOLVMATRIX) $(ObjBlockSOLVMATRIX2) $(ObjPhidalParallel) $(ObjBlockParallel) $(ObjHIPS_WRAPPER) $(ObjBLAS) OBJLIBIO = $(ObjIO) ifndef FC OBJLIBSPKIT = else OBJLIBSPKIT = $(ObjSPKIT) endif hips: FAIRE # FFCS: more dependencies for parallel builds FAIT:$(SRCDIR)/tag-ff++ $(MAKE) .. WHERE touch FAIT FAIRE: FAIT makefile.inc: ../Makefile ../../config.status makefile-hips.inc Makefile ../../config.status --file="makefile.inc:makefile-hips.inc" install:.. ..: $(SRCDIR)/tag-ff++ cp makefile.inc $(SRCDIR) cd $(SRCDIR); $(MAKE) -rm $(SRCDIR)/LIB/*.a $(AR) $(ARFLAGS) $(SRCDIR)/LIB/libhips.a $(OBJLIBHIPS) $(RANLIB) $(SRCDIR)/LIB/libhips.a $(AR) $(ARFLAGS) $(SRCDIR)/LIB/libhipssequential.a $(OBJLIBHIPSSEQUENTIAL) $(RANLIB) $(SRCDIR)/LIB/libhipssequential.a $(AR) $(ARFLAGS) $(SRCDIR)/LIB/libio.a $(OBJLIBIO) $(RANLIB) $(SRCDIR)/LIB/libio.a if [ -n "$(OBJLIBSPKIT)" ] ; then \ $(AR) $(ARFLAGS) $(SRCDIR)/LIB/libspkit.a $(OBJLIBSPKIT) ;\ $(RANLIB) $(SRCDIR)/LIB/libspkit.a;\ fi mkdir -p ../include/hips cp $(SRCDIR)/LIB/*.h ../include/hips/ mkdir -p ../lib/hips cp $(SRCDIR)/LIB/*.a ../lib/hips WHERE: echo hips LD -L@DIR@/lib/hips -lio -lhips >../lib/WHERE.hips echo hips INCLUDE -I@DIR@/include/hips>> ../lib/WHERE.hips echo hipssequential LD -L@DIR@/lib/hips -lio -lhipssequential >>../lib/WHERE.hips echo hipssequential INCLUDE -I@DIR@/include/hips >> ../lib/WHERE.hips $(SRCDIR)/tag-ff++: $(PACKAGE) tar xvzf $(PACKAGE) cd $(SRCDIR); patch -p1 <../hips-1.2b-rc4.patch # cd $(SRCDIR)/SRC/INCLUDE/; patch -p1 < ../../../hips-1.2b-rc4-1.patch; # cd $(SRCDIR)/SRC/IO/; patch -p1 < ../../../hips-1.2b-rc4-2.patch; # cd $(SRCDIR); for d in SRC/INCLUDE SRC/IO SRC/SPKIT TESTS/PARALLEL; do \ # cp $$d/makefile $$d/makefile.orig; \ # sed 's/\$$(CC).*-E/$$(CPP) $$(CFLAGS) $$(CC_OPT)/' >$$d/makefile <$$d/makefile.orig;\ # done # cp SRC_SPKIT_makefile $(SRCDIR)/SRC/SPKIT/makefile touch $(SRCDIR)/tag-ff++ $(PACKAGE): ../getall -o Hips -a # FFCS: avoid loops when SRCDIR does not exist clean-local: -cd $(SRCDIR) && $(MAKE) clean -C $(SRCDIR) rm makefile.inc -rm ../WHERE/hips -rm ../lib/hips/* -rm -rf ../lib/hips/ -rm ../include/hips/* -rm -rf ../include/hips/ -rm -rf $(SRCDIR) -rm FAIT clean: clean-local .PHONY:..freefem++-3.38-1/download/hips/makefile-hips.inc000755 000767 000024 00000004614 12477773437 021624 0ustar00hechtstaff000000 000000 abs_top_builddir=@abs_top_builddir@ DOWNLOADFF=$(abs_top_builddir)/download/ include $(DOWNLOADFF)/headers-sparsesolver.inc ### ADD for freefem++ ### ### HIPS specific compilation flags ### ## Arithmetic ## - default is -DTYPE_REAL in double precision (-DPREC_DOUBLE) ## - use -DTYPE_COMPLEX to build Complex version of HIPS ## - use -DPREC_SIMPLE to compute in single precision #COEFTYPE = COEFTYPE = -DTYPE_REAL #COEFTYPE = -DTYPE_COMPLEX #COEFTYPE = -DTYPE_REAL -DPREC_SIMPLE #COEFTYPE = -DTYPE_COMPLEX -DPREC_SIMPLE ## Partitionner ## - default partitioner is METIS ## - use -DSCOTCH_PART to use SCOTCH PARTITIONER = PARTITIONER = -DSCOTCH_PART ## Integer size ## - default int type is : INTS = INTL = int (C type length) ## - use -DINTSIZE32 To set : INTS = INTEGER(4) and INTL = INTEGER(4) ## - use -DINTSIZE64 to set : INTS = INTEGER(4) and INTL = INTEGER(8) INTSIZE = #INTSIZE = -DINTSIZE64 #INTSIZE = -DINTSIZE32 ### ### Compiler ### ARCH = -DLINUX RANLIB = @RANLIB@ CC = @CC@ # C compiler # FFCS - add MPI_INCLUDE because FF cannot use the defaut openmpi scripts on MacOS (see # [[file:../../../../configure.ac::mpicc_on_macos]]) MPICC = @MPICC@ @MPI_INCLUDE@ CPP = cpp FC = MPIFC = @MPIFC@ LD = $(CC) # Linker MPILD = $(MPICC) CFLAGS = @CFLAGS@ # Additional C compiler flags FFLAGS = @FCFLAGS@ # Additional Fortran compiler flags LFLAGS = @LDFLAGS@ # Additional linker flags COPTFLAGS = #-fno-inline # Optimization flags FOPTFLAGS = #-fno-inline # ### ### Library ### IBLAS = $(FFBLASINCLUDE) # BLAS include path LBLAS = $(FFBLASLIB) @LIBSPTHREAD@ # BLAS linker flags IMPI = $(FFMPIINCLUDE) # Additional MPI include path LMPI = $(FFMPILIB) -lsupc++ @FLIBS@ # Additional MPI linker flags ## METIS_DIR : path to METIS METIS_DIR = $(DOWNLOADFF)# IMETIS = #-I$(METIS_DIR)include/metis/ LMETIS = #-L$(METIS_DIR)lib/ -lmetis ## SCOTCH_DIR : path to SCOTCH SCOTCH_DIR = $(DOWNLOADFF) ISCOTCH = -I$(SCOTCH_DIR)include/scotch LSCOTCH = -L$(SCOTCH_DIR)lib/ -lscotch -lscotcherr ### ### Misc ### MAKE = make AR = @AR@ #//ar ARFLAGS = @ARFLAGS@ #//-crs LN = ln CP = cp ### ## Uncomment that to run in DEBUG mode #DEBUG = -g -DDEBUG_M WGET = @WGET@freefem++-3.38-1/download/hips/SRC_SPKIT_makefile000755 000767 000024 00000000743 11406142255 021546 0ustar00hechtstaff000000 000000 HIPS_DIR = ../.. include $(HIPS_DIR)/makefile.co ifneq ($(FC),true) TMP = skitfc.f90 skitf.f90 OBJ = $(TMP:.f90=.o) else OBJ = AR = echo do nothing : ar endif default: $(OBJ) $(AR) $(ARFLAGS) $(LIBSPKIT) $(OBJ) %.o: %.f90 $(FC) $(FC_OPT) $< -c -o $@ skitfc.f90: template-skitfc.F90 $(CPP) $(CFLAGS) $(CC_OPT) $< > $@ skitf.f90: template-skitf.F90 $(CPP) $(CFLAGS) $(CC_OPT) $< > $@ clean: rm -f $(TMP) *.o *.ex* *core ./extras/core* out* \#* *~ freefem++-3.38-1/download/gmm/cxxflags000644 000767 000024 00000001277 12544244557 017760 0ustar00hechtstaff000000 000000 CXX = clang++ -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk MPICXX = ac_ct_CXX = CC = clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk H5CC = /usr/local/bin/h5cc HDF5_CC = clang MPICC = YACC = bison -y ac_ct_CC = clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk CXXFLAGS = -m64 -fPIC -g -DBAMG_LONG_LONG -DCHECK_KN -fno-inline -fexceptions -fPIC CFLAGS = -g -m64 -fPIC -g -fPIC FCFLAGS = -g -fPIC GSL_CFLAGS = -I/usr/local/include HDF5_CFLAGS = WGET = wget --no-check-certificate WIN32DLLTARGET = freefem++-3.38-1/download/gmm/Makefile000644 000767 000024 00000002610 12274717221 017637 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- include cxxflags # Downloading and compiling FFTW # ------------------------------ PKG=gmm # $(PKG) information SRCDIR=$(PKG)-$(PKG_VERSION) PACKAGE=$(PKG)-$(PKG_VERSION).tar.gz SERVER=http://download.gna.org/getfem/stable PKGDIR=../pkg PKG_VERSION=4.2 INSTALL=../.. $(PKG):FAIT FAITwin32-dll-target: echo "On Pure Win32 (to hard to compile) " FAIT: $(MAKE) install touch FAIT $(MAKE) WHERE FAIRE: $(SRCDIR) cd $(SRCDIR) && ./configure --disable-dependency-tracking --prefix=`pwd`/$(INSTALL) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS)" CPP='gcc -E' CXXFLAGS="$(CXXFLAGS)" cd $(SRCDIR) && make touch FAIRE install: FAIRE cd $(SRCDIR) && make install $(SRCDIR): $(PKGDIR)/$(PACKAGE) gunzip -c $^ | tar xvf - $(PKGDIR)/$(PACKAGE): ../getall -o Gmm++ -a clean: clean-local clean-local: -rm -rf $(PKG)-* FAIT FAIRE $(SRCDIR) -rm ../lib/WHERE.gmm cxxflags: ../Makefile grep 'CXX *=' ../Makefile >cxxflags grep 'CC *=' ../Makefile >>cxxflags grep 'CXXFLAGS *=' ../Makefile >>cxxflags grep 'CFLAGS *=' ../Makefile >>cxxflags grep 'WGET *=' ../Makefile >>cxxflags grep 'WIN32DLLTARGET *=' ../Makefile >>cxxflags WHERE: -@if [ -f FAIT ] ; then \ echo build ../lib/WHERE.gmm ;\ echo gmm INCLUDE -I@DIR@/include > ../lib/WHERE.gmm ;\ echo gmm LD -L@DIR@/lib >> ../lib/WHERE.gmm ;\ fi freefem++-3.38-1/download/fftw/Makefile.am000644 000767 000024 00000002252 12240775536 020431 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- all-local: $(DOWNLOAD_FFTW) # Downloading and compiling FFTW # ------------------------------ # FFTW information FFTW_VERSION=3.3.2 SRCDIR=fftw-$(FFTW_VERSION) PACKAGE=fftw-$(FFTW_VERSION).tar.gz SERVER=http://www.fftw.org THIS=fftw3 fftw: $(SRCDIR)/FAIT WHERE $(MAKE) WHERE $(SRCDIR)/FAIT:$(SRCDIR)/FAIT-1 cd $(SRCDIR) && ./configure --disable-dependency-tracking --disable-fortran --prefix=`pwd`/../.. CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS)" CPP='gcc -E' CXXFLAGS="$(CXXFLAGS)" cd $(SRCDIR) && make cd $(SRCDIR) && make install touch $(SRCDIR)/FAIT $(SRCDIR)/FAIT-1:../pkg/$(PACKAGE) tar xvzf ../pkg/$(PACKAGE) touch $(SRCDIR)/FAIT-1 ../pkg/$(PACKAGE): -mkdir ../pkg cd ../pkg;@WGET@ -N $(SERVER)/$(PACKAGE) WHERE:$(SRCDIR)/FAIT -if [ $(SRCDIR)/FAIT ] ; then \ echo $(THIS) LD -L@DIR@/lib -l$(THIS) >../lib/WHERE.$(THIS) ;\ echo $(THIS) INCLUDE -I@DIR@/include >> ../lib/WHERE.$(THIS) ;\ fi clean-local: -rm -rf fftw-* -rm ../include/fftw3.f ../include/fftw3.f03 ../include/fftw3.h ../include/fftw3l.f03 ../include/fftw3q.f03 \ ../lib/libfftw3.a ../lib/libfftw3.la freefem++-3.38-1/download/fftw/Makefile.in000644 000767 000024 00000043211 12543260337 020434 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Downloading and compiling extra libraries # ----------------------------------------- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = download/fftw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = fftw-$(FFTW_VERSION).tar.gz PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Downloading and compiling FFTW # ------------------------------ # FFTW information FFTW_VERSION = 3.3.2 SRCDIR = fftw-$(FFTW_VERSION) SERVER = http://www.fftw.org THIS = fftw3 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu download/fftw/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu download/fftw/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am .PRECIOUS: Makefile all-local: $(DOWNLOAD_FFTW) fftw: $(SRCDIR)/FAIT WHERE $(MAKE) WHERE $(SRCDIR)/FAIT:$(SRCDIR)/FAIT-1 cd $(SRCDIR) && ./configure --disable-dependency-tracking --disable-fortran --prefix=`pwd`/../.. CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS)" CPP='gcc -E' CXXFLAGS="$(CXXFLAGS)" cd $(SRCDIR) && make cd $(SRCDIR) && make install touch $(SRCDIR)/FAIT $(SRCDIR)/FAIT-1:../pkg/$(PACKAGE) tar xvzf ../pkg/$(PACKAGE) touch $(SRCDIR)/FAIT-1 ../pkg/$(PACKAGE): -mkdir ../pkg cd ../pkg;@WGET@ -N $(SERVER)/$(PACKAGE) WHERE:$(SRCDIR)/FAIT -if [ $(SRCDIR)/FAIT ] ; then \ echo $(THIS) LD -L@DIR@/lib -l$(THIS) >../lib/WHERE.$(THIS) ;\ echo $(THIS) INCLUDE -I@DIR@/include >> ../lib/WHERE.$(THIS) ;\ fi clean-local: -rm -rf fftw-* -rm ../include/fftw3.f ../include/fftw3.f03 ../include/fftw3.h ../include/fftw3l.f03 ../include/fftw3q.f03 \ ../lib/libfftw3.a ../lib/libfftw3.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/download/f2c/f2c.h-int000644 000767 000024 00000011151 11406142255 017477 0ustar00hechtstaff000000 000000 /* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE /* set integer to int not to long */ typedef int integer; typedef unsigned int uinteger; typedef int logical; typedef char *address; typedef short int shortint; typedef float real; typedef double doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef short int shortlogical; typedef char logical1; typedef char integer1; #ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ typedef long long longint; /* system-dependent */ typedef unsigned long long ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef long int flag; typedef long int ftnlen; typedef long int ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; int nvars; }; typedef struct Namelist Namelist; #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ int (*S_fp)(...); #else typedef int /* Unknown procedure type */ (*U_fp)(); typedef shortint (*J_fp)(); typedef integer (*I_fp)(); typedef real (*R_fp)(); typedef doublereal (*D_fp)(), (*E_fp)(); typedef /* Complex */ VOID (*C_fp)(); typedef /* Double Complex */ VOID (*Z_fp)(); typedef logical (*L_fp)(); typedef shortlogical (*K_fp)(); typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* double complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif freefem++-3.38-1/download/f2c/fort77.sed000644 000767 000024 00000017312 11406142255 017716 0ustar00hechtstaff000000 000000 #! /usr/bin/perl -w # fort77 (compiler driver) script for f2c # For use with gcc under Linux # This code is in the public domain; use at your own risk. # Parse options $version = "1.14a"; $nnflag = '-Nn802'; $tmpdir = $ENV{'TMPDIR'} || '/tmp'; $cpp = 0; $fast_math = 1; $debug = 0; $debugcmd = ""; push(@includes, "@INC@"); # Loop over all options; pull all options from @ARGV and put all # arguments into @argv. This is needed because, apparently, UNIX # compilers acceppt options anywhere on the command line. while ($_ = $ARGV[0]) { shift; if (!/^-/) { if (/\.P$/) { push(@pfiles, $_); } else { push(@argv, $_); } next; } # First, the f2c options. if (/^-[CUuaEhRrz]$/ || /^-I[24]$/ || /^-onetrip$/ || /^-![clPR]$/ || /^-ext$/ || /^-!bs$/ || /^-W[1-9][0-9]*$/ || /^-w8$/ || /^-w66$/ || /^-r8$/ || /^-N[^n][0-9]+$/) { push (@fopts, $_); } elsif (/^-Nn[0-9]+$/) { $nnflag = $_; } # Prototype flags for f2c elsif (/^-Ps?/) { $extract_prototypes ++; push (@fopts, $_); } # Does somebody want to run the preprocessor? elsif (/^-cpp$/) { $cpp++; } # These are common to both f2c and gcc elsif (/^-w$/) { push(@fopts, $_); push(@copts, $_); } # This is for the linker, too... elsif (/^-g$/) { push(@fopts, $_); push(@copts, $_); push(@lopts, $_); $debug ++; } # Special options for the different subprocesses: f for f2c step, # p for (separate) preprocessing, c for C compiler, l for linker. # a is also passed to the C compiler. elsif (/^-Wf,/) { push(@fopts, &parsewx($_)); } elsif (/-Wp,/) { push(@cppopts, &parsewx($_)); } elsif (/-W[ca],/) { push(@copts, &parsewx($_)); } elsif (/-Wl,/) { push(@lopts,&parsewx($_)); } # gcc only options # too many -f and -W options to list them all... # First, let's see wether somebody wants to adhere to the C standard # in Fortran. elsif (/^-fnofast-math$/) { $fast_math = 0; } elsif (/^-m64$/) { push(@copts, $_); push(@lopts, $_); } elsif (/^-m32$/) { push(@copts, $_); push(@lopts, $_); } # The '-f' option to f2c... elsif (/^-f$/) { push(@fopts, $_); } elsif (/^-[fWUAm]/ || /^-[Ex]$/ || /^-pipe$/ ) { push(@copts, $_); } # Includes and outputs... elsif (/^-I$/) { (@ARGV > 0) || die "$0: Missing argument to \"$_\"\n"; push(@includes, "-I".shift); } elsif (/^-I./) { push(@includes, $_); } elsif (/^-o$/) { (@ARGV > 0) || die "$0: Missing argument to \"$_\"\n"; $output = shift; } elsif (/^-o(.*)/) { $output = $1; } # Optimization elsif (/^-O/) { push(@copts, $_); push(@lopts, $_); $optimize ++; } # Options for both C compiler and linker elsif (/^-[Og]/ || /^-p$/ || /^-pg$/) { push(@copts, $_); push(@lopts, $_); } elsif (/^-[bV]$/ ) { (@ARGV > 0) || die "$0 : Missing argument to \"$_\"\n"; $arg = shift; push(@copts, $_, $arg); push(@lopts, $_, $arg); } elsif (/^-[bV]./ ) { push(@copts, $_); push(@lopts, $_); } # Linker only options elsif (/^-[lL]$/) { push(@lopts, $_); (@ARGV > 0) || die "$0: Missing argument to \"$_\"\n"; $_ = shift; push(@lopts, $_); } elsif (/^-[lL]./ || /^-nostartfiles$/ || /^-static$/ || /^-shared$/ || /^-symbolic$/) { push(@lopts, $_); } elsif (/^-[cS]$/) { $compile_only = $_; } elsif (/^-D/) { push(@cppopts, $_); } # Are we verbose? elsif (/^-v$/) { $verbose ++; } # Does somebody want to keep the C files around? elsif (/^-k$/) { $keep_c ++; } else { die "$0: Illegal option: $_\n"; } } push(@fopts,$nnflag); push(@copts,'-ffast-math') if $optimize && $fast_math; push(@cppopts,@includes); push(@fopts,@includes,"-I."); push(@fopts, @pfiles); if ($verbose) { print STDERR "$0: fort77 Version $version\n"; if ($verbose > 1) { push(@copts,"-v"); push(@lopts,"-v"); push(@cppopts,"-v"); } } @ARGV = @argv; if ($compile_only && $output && (@ARGV>1)) { warn "$0: Warning: $compile_only and -o with mutiple files, ignoring -o\n"; $output = ""; } die "$0: No input files specified\n" unless @ARGV; while ($_ = $ARGV[0]) { shift; $ffile = ""; $cfile = ""; $lfile = ""; $basefile = ""; if (/\.[fF]$/) { $ffile = $_; $basefile = $ffile; } elsif (/\.[cCisSm]$/ || /\.cc$/ || /\.cxx$/) { $cfile = $_; $basefile = $_; } else { push(@lfiles, $_); } if ($ffile) { &check_file_read($ffile); if ($keep_c) { $cfile = ($ffile =~ /([^\/]*\.).$/)[0] . "c"; } else { $seq ++; $cfile = "$tmpdir/fort77-$$-$seq.c"; } if ($debug) { $debugcmd = ' | /usr/bin/perl -p -e \'s/^(#line.*)""/$1"' . $ffile . '"/\' ' } if ($cpp || ($ffile =~ /\.F$/)) { # Backslashes at the end of comment lines confuse cpp... $pipe = "| /lib/cpp -traditional " . join(' ',@cppopts) . " | @f2c@ " . join(' ',@fopts) . $debugcmd . " > $cfile"; print STDERR "$0: Running \"$pipe\"" if $verbose; open(F2C,$pipe); open (FFILE, "$ffile") || die ("$0: Cannot open $ffile: $_\n"); while () { s/([cC*].*)\\$/$1/; print F2C $_; } close(FFILE); close(F2C); $retcode = $? / 256; } else { $retcode = &mysystem("@f2c@ ". join (" ",@fopts). " < ". $ffile . $debugcmd . " > $cfile")/256; } if ($retcode && !$keep_c) { print STDERR "$0: unlinking $cfile\n" if $verbose; unlink $cfile; die "$0: aborting compilation\n"; } # Separate the prototypes out from the C files. if ($extract_prototypes) { $pfile = ($basefile =~ /([^\/]*\.).$/)[0] . "P"; open(CFILE, "$cfile") || die ("$0: Cannot open $cfile\n"); # *wdh* while (($line = ) && while (defined($line = ) && ($line !~ '#ifdef P_R_O_T_O_T_Y_P_E_S\n')) { print $line; } if ($_) { open(PFILE, ">$pfile") || die ("$0: Cannot open $pfile\n"); # *wdh* while (($line = ) && ($line !~ '#endif')) { while (defined($line = ) && ($line !~ '#endif')) { print PFILE $line; } close(PFILE); } close(CFILE); } } # C compilation step. if ($cfile) { # *wdh* @command = ("cc",@cppopts,@copts); @command = ("@CC@",@cppopts,@copts); if ($compile_only && $output) { push(@command,'-o',$output,$compile_only); } elsif ((!$compile_only) || ($compile_only eq '-c')) { $lfile = ($basefile =~ /([^\/]*\.).$/)[0] . "o"; push(@command, '-c', '-o', $lfile); } elsif ($compile_only eq '-S') { $sfile = ($basefile =~ /([^\/]*\.).$/)[0] . "s"; push(@command, '-S', '-o', $sfile); } push(@command,$cfile); $retcode = &mysystem(@command)/256; if ($retcode) { die "$0: aborting compilation\n"; } if ($ffile && !$keep_c) { print STDERR "$0: unlinking $cfile\n" if $verbose; unlink $cfile; } if ($lfile) { push (@gener_lfiles, $lfile); push(@lfiles, $lfile); $lfile = ""; } } push (@lfiles, $lfile) if $lfile; } exit if $compile_only; push (@output, "-o", $output) if $output; $retcode = &mysystem("@CC@", @output, @lfiles, @lopts, "@LLIBDIR@","-lf2c", "-lm" ); if (@gener_lfiles) { print STDERR "$0: unlinking ",join(',',@gener_lfiles),"\n" if $verbose; unlink (@gener_lfiles); } exit $retcode; # Basically a system call, except that we want to be verbose if # necessary. sub mysystem { local (@args) = @_; if (@args == 1) { print STDERR "$0: Running \"$args[0]\"\n" if $verbose; system($args[0]); } else { print STDERR "$0: Running \"",join(' ',@args),"\"\n" if $verbose; system(@args); } } sub parsewx { local ($str) = @_; local(@tmp) = split(/,/,$str); shift(@tmp); return @tmp; } sub check_file_read { local ($name) = @_; open (TESTFILE,"$name") || die "Cannot open $name: $!\n"; close(TESTFILE); } freefem++-3.38-1/download/f2c/Makefile000644 000767 000024 00000005743 12123136341 017532 0ustar00hechtstaff000000 000000 DIRPKG=../pkg LISTINST= ../bin/f2c ../bin/fort77 ../include/f2c.h ../lib/libf2c.a DIRINSTALL=/usr/local F2C_TAR=$(DIRPKG)/f2c.tar all:compile $(F2C_TAR): mkdir -p $(DIRPKG) $(WGET) # wget --passive-ftp ftp://netlib.bell-labs.com/netlib/f2c.tar curl http://netlib.sandia.gov/cgi-bin/netlib/netlibfiles.tar?filename=netlib/f2c -o "$(DIRPKG)/f2c.tar" f2c:$(F2C_TAR) f2c.h-int tar xvf $(F2C_TAR) gunzip -rf f2c/* gunzip -rf f2c/*/* cd f2c;unzip -d libf2c libf2c.zip for i in `find . -name f2c.h`; do cp f2c.h-int $$i; done f2c/libf2c/makefile: Makefile egrep -v 'ld -r|mv [$$]' f2c/libf2c/makefile compile:f2c f2c/libf2c/makefile cd f2c/src; make -f makefile.u f2c cd f2c/libf2c; make compile-10.4:f2c Makefile-MacOs cd f2c/src; make -f makefile.u f2c cd f2c/libf2c; make -f ../../Makefile-MacOs OS=10.4 compile-10.5:f2c Makefile-MacOs cd f2c/src; make -f makefile.u f2c cd f2c/libf2c; make -f ../../Makefile-MacOs OS=10.5 compile-10.6:f2c Makefile-MacOs cd f2c/src; make -f makefile.u f2c cd f2c/libf2c; make -f ../../Makefile-MacOs OS=10.6 install: ../lib ../include ../bin ../bin/fort77 ../bin/mpifort77 -mkdir ../bin cp f2c/src/f2c ../bin/. cp f2c/src/f2c.h ../include cp f2c/libf2c/libf2c.a ../lib ../bin/fort77 tt.f rm a.out install-10.4: compile-10.4 sudo make install-sudo make install install-10.5: compile-10.5 sudo make install-sudo make install install-10.6: compile-10.6 sudo make install-sudo make install install-sudo: $(DIRINSTALL)/bin/fort77 $(DIRINSTALL)/bin/mpifort77 mkdir -p $(DIRINSTALL)/bin $(DIRINSTALL)/include $(DIRINSTALL)/lib cp f2c/src/f2c $(DIRINSTALL)/bin; cp f2c/src/f2c.h $(DIRINSTALL)/include; cp f2c/libf2c/libf2c.a $(DIRINSTALL)/lib $(DIRINSTALL)/bin/fort77 tt.f rm a.out ../bin/fort77: fort77.sed Makefile dd="`pwd`/.." ; \ sed -e "s;@CC@;$(CC);"g \ -e "s;@INC@;-I$$dd/include;g" \ -e "s;@LLIBDIR@;-L$$dd/lib;g" \ -e "s;@f2c@;$$dd/bin/f2c;g" < fort77.sed >../bin/fort77 chmod a+x ../bin/fort77 ../bin/mpifort77: fort77.sed Makefile dd="`pwd`/.." ; \ sed -e "s;@CC@;mpicc;"g \ -e "s;@INC@;-I$$dd/include;g" \ -e "s;@LLIBDIR@;-L$$dd/lib;g" \ -e "s;@f2c@;$$dd/bin/f2c;g" < fort77.sed >../bin/fort77 chmod a+x ../bin/fort77 $(DIRINSTALL)/bin/fort77: fort77.sed Makefile dd="$(DIRINSTALL)/" ; \ sed -e "s;@CC@;$(CC);"g \ -e "s;@INC@;-I$$dd/include;g" \ -e "s;@LLIBDIR@;-L$$dd/lib;g" \ -e "s;@f2c@;$$dd/bin/f2c;g" < fort77.sed >$(DIRINSTALL)/bin/fort77 chmod a+x $(DIRINSTALL)/bin/fort77 $(DIRINSTALL)/bin/mpifort77: fort77.sed Makefile dd="$(DIRINSTALL)/" ; \ sed -e "s;@CC@;mpicc;"g \ -e "s;@INC@;-I$$dd/include;g" \ -e "s;@LLIBDIR@;-L$$dd/lib;g" \ -e "s;@f2c@;$$dd/bin/f2c;g" < fort77.sed >$(DIRINSTALL)/bin/fort77 chmod a+x $(DIRINSTALL)/bin/fort77 ../bin: mkdir ../bin ../lib: mkdir ../lib ../include: mkdir ../include clean-local: -rm -rf f2c *~ a.out clean:clean-local veryclean: clean -rm $(LISTINST) $(F2C_TAR) freefem++-3.38-1/download/f2c/Makefile-MacOs000644 000767 000024 00000016566 11406142255 020543 0ustar00hechtstaff000000 000000 # Unix makefile: see README. # For C++, first "make hadd". # If your compiler does not recognize ANSI C, add # -DKR_headers # to the CFLAGS = line below. # On Sun and other BSD systems that do not provide an ANSI sprintf, add # -DUSE_STRLEN # to the CFLAGS = line below. # On Linux systems, add # -DNON_UNIX_STDIO # to the CFLAGS = line below. For libf2c.so under Linux, also add # -fPIC # to the CFLAGS = line below. .SUFFIXES: .c .o CC = cc SHELL = /bin/sh ifeq (10.4,$(OS)) CC=gcc-4.0 LIST_ARCH=-arch ppc -arch i386 -arch ppc64 -arch x86_64 SDK=/Developer/SDKs/MacOSX10.4u.sdk endif ifeq (10.5,$(OS)) LIST_ARCH=-arch ppc -arch i386 -arch x86_64 -arch ppc64 SDK=/Developer/SDKs/MacOSX10.5.sdk endif ifeq (10.6,$(OS)) LIST_ARCH= -arch i386 -arch x86_64 SDK=/Developer/SDKs/MacOSX10.6.sdk endif CFLAGS = -O -isysroot $(SDK) $(LIST_ARCH) -mmacosx-version-min=$(OS) -DNO_My_ctype LDFLAGS=-Wl,-syslibroot,$(SDK) $(LIST_ARCH) AR=libtool -static -o LIBDIR=/usr/local/lib # compile, then strip unnecessary symbols .c.o: $(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c ## Under Solaris (and other systems that do not understand ld -x), ## omit -x in the ld line above. ## If your system does not have the ld command, comment out ## or remove both the ld and mv lines above. MISC = f77vers.o i77vers.o main.o s_rnge.o abort_.o exit_.o getarg_.o iargc_.o\ getenv_.o signal_.o s_stop.o s_paus.o system_.o cabs.o\ derf_.o derfc_.o erf_.o erfc_.o sig_die.o uninit.o POW = pow_ci.o pow_dd.o pow_di.o pow_hh.o pow_ii.o pow_ri.o pow_zi.o pow_zz.o CX = c_abs.o c_cos.o c_div.o c_exp.o c_log.o c_sin.o c_sqrt.o DCX = z_abs.o z_cos.o z_div.o z_exp.o z_log.o z_sin.o z_sqrt.o REAL = r_abs.o r_acos.o r_asin.o r_atan.o r_atn2.o r_cnjg.o r_cos.o\ r_cosh.o r_dim.o r_exp.o r_imag.o r_int.o\ r_lg10.o r_log.o r_mod.o r_nint.o r_sign.o\ r_sin.o r_sinh.o r_sqrt.o r_tan.o r_tanh.o DBL = d_abs.o d_acos.o d_asin.o d_atan.o d_atn2.o\ d_cnjg.o d_cos.o d_cosh.o d_dim.o d_exp.o\ d_imag.o d_int.o d_lg10.o d_log.o d_mod.o\ d_nint.o d_prod.o d_sign.o d_sin.o d_sinh.o\ d_sqrt.o d_tan.o d_tanh.o INT = i_abs.o i_dim.o i_dnnt.o i_indx.o i_len.o i_mod.o i_nint.o i_sign.o\ lbitbits.o lbitshft.o HALF = h_abs.o h_dim.o h_dnnt.o h_indx.o h_len.o h_mod.o h_nint.o h_sign.o CMP = l_ge.o l_gt.o l_le.o l_lt.o hl_ge.o hl_gt.o hl_le.o hl_lt.o EFL = ef1asc_.o ef1cmc_.o CHAR = f77_aloc.o s_cat.o s_cmp.o s_copy.o I77 = backspac.o close.o dfe.o dolio.o due.o endfile.o err.o\ fmt.o fmtlib.o ftell_.o iio.o ilnw.o inquire.o lread.o lwrite.o\ open.o rdfmt.o rewind.o rsfe.o rsli.o rsne.o sfe.o sue.o\ typesize.o uio.o util.o wref.o wrtfmt.o wsfe.o wsle.o wsne.o xwsne.o QINT = pow_qq.o qbitbits.o qbitshft.o ftell64_.o TIME = dtime_.o etime_.o # If you get an error compiling dtime_.c or etime_.c, try adding # -DUSE_CLOCK to the CFLAGS assignment above; if that does not work, # omit $(TIME) from OFILES = assignment below. # To get signed zeros in write statements on IEEE-arithmetic systems, # add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.o # to the end of the OFILES = assignment below. # For INTEGER*8 support (which requires system-dependent adjustments to # f2c.h), add $(QINT) to the OFILES = assignment below... OFILES = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \ $(HALF) $(CMP) $(EFL) $(CHAR) $(I77) $(TIME) all: f2c.h signal1.h sysdep1.h libf2c.a libf2c.a: $(OFILES) libtool -static -o libf2c.a $(OFILES) ## Shared-library variant: the following rule works on Linux ## systems. Details are system-dependent. Under Linux, -fPIC ## must appear in the CFLAGS assignment when making libf2c.so. ## Under Solaris, use -Kpic in CFLAGS and use "ld -G" instead ## of "cc -shared". libf2c.so: $(OFILES) libtool -dynamic -o libf2c.dylib $(OFILES) # cc -shared -o libf2c.so $(OFILES) ### If your system lacks ranlib, you don't need it; see README. f77vers.o: f77vers.c $(CC) -c f77vers.c i77vers.o: i77vers.c $(CC) -c i77vers.c # To get an "f2c.h" for use with "f2c -C++", first "make hadd" hadd: f2c.h0 f2ch.add cat f2c.h0 f2ch.add >f2c.h # For use with "f2c" and "f2c -A": f2c.h: f2c.h0 cp f2c.h0 f2c.h # You may need to adjust signal1.h and sysdep1.h suitably for your system... signal1.h: signal1.h0 cp signal1.h0 signal1.h sysdep1.h: sysdep1.h0 cp sysdep1.h0 sysdep1.h # If your system lacks onexit() and you are not using an # ANSI C compiler, then you should uncomment the following # two lines (for compiling main.o): #main.o: main.c # $(CC) -c -DNO_ONEXIT -DSkip_f2c_Undefs main.c # On at least some Sun systems, it is more appropriate to # uncomment the following two lines: #main.o: main.c # $(CC) -c -Donexit=on_exit -DSkip_f2c_Undefs main.c install: libf2c.a cp -p libf2c.a $(LIBDIR) #-ranlib $(LIBDIR)/libf2c.a clean: rm -f libf2c.a *.o arith.h signal1.h sysdep1.h backspac.o: fio.h close.o: fio.h dfe.o: fio.h dfe.o: fmt.h due.o: fio.h endfile.o: fio.h rawio.h err.o: fio.h rawio.h fmt.o: fio.h fmt.o: fmt.h iio.o: fio.h iio.o: fmt.h ilnw.o: fio.h ilnw.o: lio.h inquire.o: fio.h lread.o: fio.h lread.o: fmt.h lread.o: lio.h lread.o: fp.h lwrite.o: fio.h lwrite.o: fmt.h lwrite.o: lio.h open.o: fio.h rawio.h rdfmt.o: fio.h rdfmt.o: fmt.h rdfmt.o: fp.h rewind.o: fio.h rsfe.o: fio.h rsfe.o: fmt.h rsli.o: fio.h rsli.o: lio.h rsne.o: fio.h rsne.o: lio.h sfe.o: fio.h signbit.o: arith.h sue.o: fio.h uio.o: fio.h uninit.o: arith.h util.o: fio.h wref.o: fio.h wref.o: fmt.h wref.o: fp.h wrtfmt.o: fio.h wrtfmt.o: fmt.h wsfe.o: fio.h wsfe.o: fmt.h wsle.o: fio.h wsle.o: fmt.h wsle.o: lio.h wsne.o: fio.h wsne.o: lio.h xwsne.o: fio.h xwsne.o: lio.h xwsne.o: fmt.h arith.h: arithchk.c $(CC) $(CFLAGS) -DNO_FPINIT arithchk.c -lm ||\ $(CC) -DNO_LONG_LONG $(CFLAGS) -DNO_FPINIT arithchk.c -lm ./a.out >arith.h rm -f a.out arithchk.o check: xsum Notice README abort_.c arithchk.c backspac.c c_abs.c c_cos.c \ c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c close.c comptry.bat \ d_abs.c d_acos.c d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c \ d_dim.c d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c \ d_nint.c d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c \ d_tanh.c derf_.c derfc_.c dfe.c dolio.c dtime_.c due.c ef1asc_.c \ ef1cmc_.c endfile.c erf_.c erfc_.c err.c etime_.c exit_.c f2c.h0 \ f2ch.add f77_aloc.c f77vers.c fio.h fmt.c fmt.h fmtlib.c \ fp.h ftell_.c ftell64_.c \ getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \ h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ i77vers.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c \ i_nint.c i_sign.c iargc_.c iio.c ilnw.c inquire.c l_ge.c l_gt.c \ l_le.c l_lt.c lbitbits.c lbitshft.c libf2c.lbc libf2c.sy lio.h \ lread.c lwrite.c main.c makefile.sy makefile.u makefile.vc \ makefile.wat math.hvc mkfile.plan9 open.c pow_ci.c pow_dd.c \ pow_di.c pow_hh.c pow_ii.c pow_qq.c pow_ri.c pow_zi.c pow_zz.c \ qbitbits.c qbitshft.c r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \ r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \ r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \ r_tan.c r_tanh.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c \ s_cat.c s_cmp.c s_copy.c s_paus.c s_rnge.c s_stop.c scomptry.bat sfe.c \ sig_die.c signal1.h0 signal_.c signbit.c sue.c sysdep1.h0 system_.c \ typesize.c \ uio.c uninit.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c xwsne.c \ z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >xsum1.out cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out freefem++-3.38-1/download/f2c/tt.f000644 000767 000024 00000000063 11406142255 016662 0ustar00hechtstaff000000 000000 program tt print *,"dgfgdfg" end freefem++-3.38-1/download/blas/Makefile.am000644 000767 000024 00000024012 12405772636 020403 0ustar00hechtstaff000000 000000 # Downloading and compiling extra BLAS libraries # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Downloading and compiling extra BLAS libraries" default=0 freefem make multipleauthors start=04/06/04 upmc DIRPKG=../pkg BLAS_TGZ=$(DIRPKG)/blas.tgz CBLAS_TGZ=$(DIRPKG)/cblas.tgz PKGCOMMON_PACKTITLE=BLAS PKGCOMMON_PACKAGES=$(BLAS_TGZ) $(CBLAS_TGZ) ../pkg/OpenBLAS.tar.gz include ../common.mak EXTRA_DIST= \ openblas.patches # Downloading and compiling the Generic Blas # ------------------------------------------ noinst_LIBRARIES=@DOWNLOADED_BLAS@ ##compile::$(noinst_LIBRARIES) EXTRA_LIBRARIES=libf77blas.a libcblas.a pkgcompile::@DOWNLOADED_BLAS@ # List of files to compile (do not list them in *_SOURCES to prevent them from being included in distributions). F77BLAS_SOURCES=BLAS/caxpy.f BLAS/crotg.f BLAS/dcopy.f BLAS/dsymv.f BLAS/lsame.f BLAS/sspmv.f BLAS/zaxpy.f BLAS/zhpr2.f \ BLAS/ccopy.f BLAS/cscal.f BLAS/ddot.f BLAS/dsyr2.f BLAS/sasum.f BLAS/sspr2.f BLAS/zcopy.f BLAS/zhpr.f BLAS/cdotc.f \ BLAS/csrot.f BLAS/dgbmv.f BLAS/dsyr2k.f BLAS/saxpy.f BLAS/sspr.f BLAS/zdotc.f BLAS/zrotg.f BLAS/cdotu.f BLAS/csscal.f \ BLAS/dgemm.f BLAS/dsyr.f BLAS/scasum.f BLAS/sswap.f BLAS/zdotu.f BLAS/zscal.f BLAS/cgbmv.f BLAS/cswap.f BLAS/dgemv.f \ BLAS/dsyrk.f BLAS/scnrm2.f BLAS/ssymm.f BLAS/zdrot.f BLAS/zswap.f BLAS/cgemm.f BLAS/csymm.f BLAS/dger.f BLAS/dtbmv.f \ BLAS/scopy.f BLAS/ssymv.f BLAS/zdscal.f BLAS/zsymm.f BLAS/cgemv.f BLAS/csyr2k.f BLAS/dnrm2.f BLAS/dtbsv.f BLAS/sdot.f \ BLAS/ssyr2.f BLAS/zgbmv.f BLAS/zsyr2k.f BLAS/cgerc.f BLAS/csyrk.f BLAS/drot.f BLAS/dtpmv.f BLAS/sdsdot.f BLAS/ssyr2k.f \ BLAS/zgemm.f BLAS/zsyrk.f BLAS/cgeru.f BLAS/ctbmv.f BLAS/drotg.f BLAS/dtpsv.f BLAS/sgbmv.f BLAS/ssyr.f BLAS/zgemv.f \ BLAS/ztbmv.f BLAS/chbmv.f BLAS/ctbsv.f BLAS/drotm.f BLAS/dtrmm.f BLAS/sgemm.f BLAS/ssyrk.f BLAS/zgerc.f BLAS/ztbsv.f \ BLAS/chemm.f BLAS/ctpmv.f BLAS/drotmg.f BLAS/dtrmv.f BLAS/sgemv.f BLAS/stbmv.f BLAS/zgeru.f BLAS/ztpmv.f BLAS/chemv.f \ BLAS/ctpsv.f BLAS/dsbmv.f BLAS/dtrsm.f BLAS/sger.f BLAS/stbsv.f BLAS/zhbmv.f BLAS/ztpsv.f BLAS/cher2.f BLAS/ctrmm.f \ BLAS/dscal.f BLAS/dtrsv.f BLAS/snrm2.f BLAS/stpmv.f BLAS/zhemm.f BLAS/ztrmm.f BLAS/cher2k.f BLAS/ctrmv.f BLAS/dsdot.f \ BLAS/dzasum.f BLAS/srot.f BLAS/stpsv.f BLAS/zhemv.f BLAS/ztrmv.f BLAS/cher.f BLAS/ctrsm.f BLAS/dspmv.f BLAS/dznrm2.f \ BLAS/srotg.f BLAS/strmm.f BLAS/zher2.f BLAS/ztrsm.f BLAS/cherk.f BLAS/ctrsv.f BLAS/dspr2.f BLAS/icamax.f BLAS/srotm.f \ BLAS/strmv.f BLAS/zher2k.f BLAS/ztrsv.f BLAS/chpmv.f BLAS/dasum.f BLAS/dspr.f BLAS/idamax.f BLAS/srotmg.f BLAS/strsm.f \ BLAS/zher.f BLAS/chpr2.f BLAS/daxpy.f BLAS/dswap.f BLAS/isamax.f BLAS/ssbmv.f BLAS/strsv.f BLAS/zherk.f BLAS/chpr.f \ BLAS/dcabs1.f BLAS/dsymm.f BLAS/izamax.f BLAS/sscal.f blas_xerbla.f BLAS/zhpmv.f CBLAS_SOURCES=CBLAS/src/cblas_caxpy.c CBLAS/src/cblas_drot.c CBLAS/src/cblas_sgemm.c CBLAS/src/cblas_zher2.c \ CBLAS/src/cblas_ccopy.c CBLAS/src/cblas_drotg.c CBLAS/src/cblas_sgemv.c CBLAS/src/cblas_zher2k.c \ CBLAS/src/cblas_cdotc_sub.c CBLAS/src/cblas_drotm.c CBLAS/src/cblas_sger.c CBLAS/src/cblas_zher.c \ CBLAS/src/cblas_cdotu_sub.c CBLAS/src/cblas_drotmg.c CBLAS/src/cblas_snrm2.c CBLAS/src/cblas_zherk.c \ CBLAS/src/cblas_cgbmv.c CBLAS/src/cblas_dsbmv.c CBLAS/src/cblas_srot.c CBLAS/src/cblas_zhpmv.c CBLAS/src/cblas_cgemm.c \ CBLAS/src/cblas_dscal.c CBLAS/src/cblas_srotg.c CBLAS/src/cblas_zhpr2.c CBLAS/src/cblas_cgemv.c CBLAS/src/cblas_dsdot.c \ CBLAS/src/cblas_srotm.c CBLAS/src/cblas_zhpr.c CBLAS/src/cblas_cgerc.c CBLAS/src/cblas_dspmv.c CBLAS/src/cblas_srotmg.c \ CBLAS/src/cblas_zscal.c CBLAS/src/cblas_cgeru.c CBLAS/src/cblas_dspr2.c CBLAS/src/cblas_ssbmv.c CBLAS/src/cblas_zswap.c \ CBLAS/src/cblas_chbmv.c CBLAS/src/cblas_dspr.c CBLAS/src/cblas_sscal.c CBLAS/src/cblas_zsymm.c CBLAS/src/cblas_chemm.c \ CBLAS/src/cblas_dswap.c CBLAS/src/cblas_sspmv.c CBLAS/src/cblas_zsyr2k.c CBLAS/src/cblas_chemv.c \ CBLAS/src/cblas_dsymm.c CBLAS/src/cblas_sspr2.c CBLAS/src/cblas_zsyrk.c CBLAS/src/cblas_cher2.c CBLAS/src/cblas_dsymv.c \ CBLAS/src/cblas_sspr.c CBLAS/src/cblas_ztbmv.c CBLAS/src/cblas_cher2k.c CBLAS/src/cblas_dsyr2.c CBLAS/src/cblas_sswap.c \ CBLAS/src/cblas_ztbsv.c CBLAS/src/cblas_cher.c CBLAS/src/cblas_dsyr2k.c CBLAS/src/cblas_ssymm.c CBLAS/src/cblas_ztpmv.c \ CBLAS/src/cblas_cherk.c CBLAS/src/cblas_dsyr.c CBLAS/src/cblas_ssymv.c CBLAS/src/cblas_ztpsv.c CBLAS/src/cblas_chpmv.c \ CBLAS/src/cblas_dsyrk.c CBLAS/src/cblas_ssyr2.c CBLAS/src/cblas_ztrmm.c CBLAS/src/cblas_chpr2.c CBLAS/src/cblas_dtbmv.c \ CBLAS/src/cblas_ssyr2k.c CBLAS/src/cblas_ztrmv.c CBLAS/src/cblas_chpr.c CBLAS/src/cblas_dtbsv.c CBLAS/src/cblas_ssyr.c \ CBLAS/src/cblas_ztrsm.c CBLAS/src/cblas_cscal.c CBLAS/src/cblas_dtpmv.c CBLAS/src/cblas_ssyrk.c CBLAS/src/cblas_ztrsv.c \ CBLAS/src/cblas_csscal.c CBLAS/src/cblas_dtpsv.c CBLAS/src/cblas_stbmv.c CBLAS/src/cdotcsub.f CBLAS/src/cblas_cswap.c \ CBLAS/src/cblas_dtrmm.c CBLAS/src/cblas_stbsv.c CBLAS/src/cdotusub.f CBLAS/src/cblas_csymm.c CBLAS/src/cblas_dtrmv.c \ CBLAS/src/cblas_stpmv.c CBLAS/src/dasumsub.f CBLAS/src/cblas_csyr2k.c CBLAS/src/cblas_dtrsm.c CBLAS/src/cblas_stpsv.c \ CBLAS/src/ddotsub.f CBLAS/src/cblas_csyrk.c CBLAS/src/cblas_dtrsv.c CBLAS/src/cblas_strmm.c CBLAS/src/dnrm2sub.f \ CBLAS/src/cblas_ctbmv.c CBLAS/src/cblas_dzasum.c CBLAS/src/cblas_strmv.c CBLAS/src/dsdotsub.f CBLAS/src/cblas_ctbsv.c \ CBLAS/src/cblas_dznrm2.c CBLAS/src/cblas_strsm.c CBLAS/src/dzasumsub.f CBLAS/src/cblas_ctpmv.c CBLAS/src/cblas_f77.h \ CBLAS/src/cblas_strsv.c CBLAS/src/dznrm2sub.f CBLAS/src/cblas_ctpsv.c CBLAS/src/cblas_globals.c \ CBLAS/src/cblas_xerbla.c CBLAS/src/icamaxsub.f CBLAS/src/cblas_ctrmm.c CBLAS/src/cblas.h CBLAS/src/cblas_zaxpy.c \ CBLAS/src/idamaxsub.f CBLAS/src/cblas_ctrmv.c CBLAS/src/cblas_icamax.c CBLAS/src/cblas_zcopy.c CBLAS/src/isamaxsub.f \ CBLAS/src/cblas_ctrsm.c CBLAS/src/cblas_idamax.c CBLAS/src/cblas_zdotc_sub.c CBLAS/src/izamaxsub.f \ CBLAS/src/cblas_ctrsv.c CBLAS/src/cblas_isamax.c CBLAS/src/cblas_zdotu_sub.c CBLAS/src/Makefile CBLAS/src/cblas_dasum.c \ CBLAS/src/cblas_izamax.c CBLAS/src/cblas_zdscal.c CBLAS/src/sasumsub.f CBLAS/src/cblas_daxpy.c CBLAS/src/cblas_sasum.c \ CBLAS/src/cblas_zgbmv.c CBLAS/src/scasumsub.f CBLAS/src/cblas_dcopy.c CBLAS/src/cblas_saxpy.c CBLAS/src/cblas_zgemm.c \ CBLAS/src/scnrm2sub.f CBLAS/src/cblas_ddot.c CBLAS/src/cblas_scasum.c CBLAS/src/cblas_zgemv.c CBLAS/src/sdotsub.f \ CBLAS/src/cblas_dgbmv.c CBLAS/src/cblas_scnrm2.c CBLAS/src/cblas_zgerc.c CBLAS/src/sdsdotsub.f CBLAS/src/cblas_dgemm.c \ CBLAS/src/cblas_scopy.c CBLAS/src/cblas_zgeru.c CBLAS/src/snrm2sub.f CBLAS/src/cblas_dgemv.c CBLAS/src/cblas_sdot.c \ CBLAS/src/cblas_zhbmv.c CBLAS/src/xerbla.c CBLAS/src/cblas_dger.c CBLAS/src/cblas_sdsdot.c CBLAS/src/cblas_zhemm.c \ CBLAS/src/zdotcsub.f CBLAS/src/cblas_dnrm2.c CBLAS/src/cblas_sgbmv.c CBLAS/src/cblas_zhemv.c CBLAS/src/zdotusub.f nodist_libf77blas_a_SOURCES=$(F77BLAS_SOURCES) nodist_libcblas_a_SOURCES=$(CBLAS_SOURCES) BUILT_SOURCES=@DOWNLOADED_BLAS_BUILT_SOURCES@ # -ICBLAS/include to find cblas.h libcblas_a_CFLAGS=-DADD_ -ICBLAS/include # "xerbla" exists in both BLAS and CBLAS. So we need to rename it to obtain two different object files. BLAS:BLAS/fait BLAS/fait:$(BLAS_TGZ) mkdir -p ../include ../lib -if tar xvzf $(BLAS_TGZ) BLAS/xerbla.f 2>&1 1>/dev/null ; then \ tar xvzf $(BLAS_TGZ) ; \ else \ mkdir -p BLAS;cd BLAS && tar xvzf ../$(BLAS_TGZ);\ fi cp BLAS/xerbla.f blas_xerbla.f touch BLAS/fait $(F77BLAS_SOURCES): BLAS CBLAS:CBLAS/fait CBLAS/fait: $(CBLAS_TGZ) tar xvzf $(CBLAS_TGZ) cp CBLAS/include/*.h CBLAS/src touch CBLAS/fait $(CBLAS_SOURCES): CBLAS/fait clean-local:: -rm -r BLAS CBLAS blas_xerbla.f # <> ALH - 18/9/13 - Downloading and building the OpenBLAS # ------------------------------------------------------------------ # to activate this, see [[file:../../configure.ac::OpenBLAS]] all-local::@COMPILE_OPENBLAS@ pkgcompile::@COMPILE_OPENBLAS@ generic: openblas:links.done # links2files is required for the MinGW compiler to understand where to find the library contents under Cygwin if FFCS_WINDOWS links.done:openblas.done cd OpenBLAS && ../../../build/links2files touch $@ else links.done:openblas.done touch $@ endif openblas.done:openpatches.done # # DYNAMIC_ARCH=1 allows the Openblas to run fast on all the processor architectures that the FFCS users may have # test -d ../lib || mkdir ../lib cd OpenBLAS && make BINARY=@SIZEOF_PTRINBIT@ CC=${CC} FC=${FC} DYNAMIC_ARCH=1 libs netlib touch $@ # The OpenBLAS directory is updated during the compilation, so the patching step should not depend on the directory # date openpatches.done:opendownload.done tar xvzf ../pkg/OpenBLAS.tar.gz # # ALH - 7/1/14 - The tar directory has changed names # mv xianyi-OpenBLAS-* OpenBLAS patch -u -p1 < openblas.patches touch $@ download::opendownload.done opendownload.done: ../getall -o OpenBLAS -a touch $@ # ALH - 6/11/13 - Since OpenBLAS is quite long to compile and it does not change very often, it's only cleaned as part # of the specific target 'veryclean'. veryclean:: -rm -r *.done OpenBLAS xianyi-OpenBLAS-* # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/blas/Makefile.in000644 000767 000024 00001455061 12543260337 020422 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Downloading and compiling extra BLAS libraries # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Downloading and compiling extra BLAS libraries" default=0 freefem make multipleauthors start=04/06/04 upmc # Common make rules for all downloaded packages (request from FH) # ====================================================================== # Written by Antoine Le Hyaric # http://www.ljll.math.upmc.fr/lehyaric # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Common make rules for all downloaded packages (request from FH)" default=0 freefem make start=06/11/2013 upmc written # Common goals for all packages: # download compile install reinstall clean veryclean # <> VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = download/blas ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libcblas_a_AR = $(AR) $(ARFLAGS) libcblas_a_LIBADD = am__objects_1 = libcblas_a-cblas_caxpy.$(OBJEXT) \ libcblas_a-cblas_drot.$(OBJEXT) \ libcblas_a-cblas_sgemm.$(OBJEXT) \ libcblas_a-cblas_zher2.$(OBJEXT) \ libcblas_a-cblas_ccopy.$(OBJEXT) \ libcblas_a-cblas_drotg.$(OBJEXT) \ libcblas_a-cblas_sgemv.$(OBJEXT) \ libcblas_a-cblas_zher2k.$(OBJEXT) \ libcblas_a-cblas_cdotc_sub.$(OBJEXT) \ libcblas_a-cblas_drotm.$(OBJEXT) \ libcblas_a-cblas_sger.$(OBJEXT) \ libcblas_a-cblas_zher.$(OBJEXT) \ libcblas_a-cblas_cdotu_sub.$(OBJEXT) \ libcblas_a-cblas_drotmg.$(OBJEXT) \ libcblas_a-cblas_snrm2.$(OBJEXT) \ libcblas_a-cblas_zherk.$(OBJEXT) \ libcblas_a-cblas_cgbmv.$(OBJEXT) \ libcblas_a-cblas_dsbmv.$(OBJEXT) \ libcblas_a-cblas_srot.$(OBJEXT) \ libcblas_a-cblas_zhpmv.$(OBJEXT) \ libcblas_a-cblas_cgemm.$(OBJEXT) \ libcblas_a-cblas_dscal.$(OBJEXT) \ libcblas_a-cblas_srotg.$(OBJEXT) \ libcblas_a-cblas_zhpr2.$(OBJEXT) \ libcblas_a-cblas_cgemv.$(OBJEXT) \ libcblas_a-cblas_dsdot.$(OBJEXT) \ libcblas_a-cblas_srotm.$(OBJEXT) \ libcblas_a-cblas_zhpr.$(OBJEXT) \ libcblas_a-cblas_cgerc.$(OBJEXT) \ libcblas_a-cblas_dspmv.$(OBJEXT) \ libcblas_a-cblas_srotmg.$(OBJEXT) \ libcblas_a-cblas_zscal.$(OBJEXT) \ libcblas_a-cblas_cgeru.$(OBJEXT) \ libcblas_a-cblas_dspr2.$(OBJEXT) \ libcblas_a-cblas_ssbmv.$(OBJEXT) \ libcblas_a-cblas_zswap.$(OBJEXT) \ libcblas_a-cblas_chbmv.$(OBJEXT) \ libcblas_a-cblas_dspr.$(OBJEXT) \ libcblas_a-cblas_sscal.$(OBJEXT) \ libcblas_a-cblas_zsymm.$(OBJEXT) \ libcblas_a-cblas_chemm.$(OBJEXT) \ libcblas_a-cblas_dswap.$(OBJEXT) \ libcblas_a-cblas_sspmv.$(OBJEXT) \ libcblas_a-cblas_zsyr2k.$(OBJEXT) \ libcblas_a-cblas_chemv.$(OBJEXT) \ libcblas_a-cblas_dsymm.$(OBJEXT) \ libcblas_a-cblas_sspr2.$(OBJEXT) \ libcblas_a-cblas_zsyrk.$(OBJEXT) \ libcblas_a-cblas_cher2.$(OBJEXT) \ libcblas_a-cblas_dsymv.$(OBJEXT) \ libcblas_a-cblas_sspr.$(OBJEXT) \ libcblas_a-cblas_ztbmv.$(OBJEXT) \ libcblas_a-cblas_cher2k.$(OBJEXT) \ libcblas_a-cblas_dsyr2.$(OBJEXT) \ libcblas_a-cblas_sswap.$(OBJEXT) \ libcblas_a-cblas_ztbsv.$(OBJEXT) \ libcblas_a-cblas_cher.$(OBJEXT) \ libcblas_a-cblas_dsyr2k.$(OBJEXT) \ libcblas_a-cblas_ssymm.$(OBJEXT) \ libcblas_a-cblas_ztpmv.$(OBJEXT) \ libcblas_a-cblas_cherk.$(OBJEXT) \ libcblas_a-cblas_dsyr.$(OBJEXT) \ libcblas_a-cblas_ssymv.$(OBJEXT) \ libcblas_a-cblas_ztpsv.$(OBJEXT) \ libcblas_a-cblas_chpmv.$(OBJEXT) \ libcblas_a-cblas_dsyrk.$(OBJEXT) \ libcblas_a-cblas_ssyr2.$(OBJEXT) \ libcblas_a-cblas_ztrmm.$(OBJEXT) \ libcblas_a-cblas_chpr2.$(OBJEXT) \ libcblas_a-cblas_dtbmv.$(OBJEXT) \ libcblas_a-cblas_ssyr2k.$(OBJEXT) \ libcblas_a-cblas_ztrmv.$(OBJEXT) \ libcblas_a-cblas_chpr.$(OBJEXT) \ libcblas_a-cblas_dtbsv.$(OBJEXT) \ libcblas_a-cblas_ssyr.$(OBJEXT) \ libcblas_a-cblas_ztrsm.$(OBJEXT) \ libcblas_a-cblas_cscal.$(OBJEXT) \ libcblas_a-cblas_dtpmv.$(OBJEXT) \ libcblas_a-cblas_ssyrk.$(OBJEXT) \ libcblas_a-cblas_ztrsv.$(OBJEXT) \ libcblas_a-cblas_csscal.$(OBJEXT) \ libcblas_a-cblas_dtpsv.$(OBJEXT) \ libcblas_a-cblas_stbmv.$(OBJEXT) cdotcsub.$(OBJEXT) \ libcblas_a-cblas_cswap.$(OBJEXT) \ libcblas_a-cblas_dtrmm.$(OBJEXT) \ libcblas_a-cblas_stbsv.$(OBJEXT) cdotusub.$(OBJEXT) \ libcblas_a-cblas_csymm.$(OBJEXT) \ libcblas_a-cblas_dtrmv.$(OBJEXT) \ libcblas_a-cblas_stpmv.$(OBJEXT) dasumsub.$(OBJEXT) \ libcblas_a-cblas_csyr2k.$(OBJEXT) \ libcblas_a-cblas_dtrsm.$(OBJEXT) \ libcblas_a-cblas_stpsv.$(OBJEXT) ddotsub.$(OBJEXT) \ libcblas_a-cblas_csyrk.$(OBJEXT) \ libcblas_a-cblas_dtrsv.$(OBJEXT) \ libcblas_a-cblas_strmm.$(OBJEXT) dnrm2sub.$(OBJEXT) \ libcblas_a-cblas_ctbmv.$(OBJEXT) \ libcblas_a-cblas_dzasum.$(OBJEXT) \ libcblas_a-cblas_strmv.$(OBJEXT) dsdotsub.$(OBJEXT) \ libcblas_a-cblas_ctbsv.$(OBJEXT) \ libcblas_a-cblas_dznrm2.$(OBJEXT) \ libcblas_a-cblas_strsm.$(OBJEXT) dzasumsub.$(OBJEXT) \ libcblas_a-cblas_ctpmv.$(OBJEXT) \ libcblas_a-cblas_strsv.$(OBJEXT) dznrm2sub.$(OBJEXT) \ libcblas_a-cblas_ctpsv.$(OBJEXT) \ libcblas_a-cblas_globals.$(OBJEXT) \ libcblas_a-cblas_xerbla.$(OBJEXT) icamaxsub.$(OBJEXT) \ libcblas_a-cblas_ctrmm.$(OBJEXT) \ libcblas_a-cblas_zaxpy.$(OBJEXT) idamaxsub.$(OBJEXT) \ libcblas_a-cblas_ctrmv.$(OBJEXT) \ libcblas_a-cblas_icamax.$(OBJEXT) \ libcblas_a-cblas_zcopy.$(OBJEXT) isamaxsub.$(OBJEXT) \ libcblas_a-cblas_ctrsm.$(OBJEXT) \ libcblas_a-cblas_idamax.$(OBJEXT) \ libcblas_a-cblas_zdotc_sub.$(OBJEXT) izamaxsub.$(OBJEXT) \ libcblas_a-cblas_ctrsv.$(OBJEXT) \ libcblas_a-cblas_isamax.$(OBJEXT) \ libcblas_a-cblas_zdotu_sub.$(OBJEXT) \ libcblas_a-cblas_dasum.$(OBJEXT) \ libcblas_a-cblas_izamax.$(OBJEXT) \ libcblas_a-cblas_zdscal.$(OBJEXT) sasumsub.$(OBJEXT) \ libcblas_a-cblas_daxpy.$(OBJEXT) \ libcblas_a-cblas_sasum.$(OBJEXT) \ libcblas_a-cblas_zgbmv.$(OBJEXT) scasumsub.$(OBJEXT) \ libcblas_a-cblas_dcopy.$(OBJEXT) \ libcblas_a-cblas_saxpy.$(OBJEXT) \ libcblas_a-cblas_zgemm.$(OBJEXT) scnrm2sub.$(OBJEXT) \ libcblas_a-cblas_ddot.$(OBJEXT) \ libcblas_a-cblas_scasum.$(OBJEXT) \ libcblas_a-cblas_zgemv.$(OBJEXT) sdotsub.$(OBJEXT) \ libcblas_a-cblas_dgbmv.$(OBJEXT) \ libcblas_a-cblas_scnrm2.$(OBJEXT) \ libcblas_a-cblas_zgerc.$(OBJEXT) sdsdotsub.$(OBJEXT) \ libcblas_a-cblas_dgemm.$(OBJEXT) \ libcblas_a-cblas_scopy.$(OBJEXT) \ libcblas_a-cblas_zgeru.$(OBJEXT) snrm2sub.$(OBJEXT) \ libcblas_a-cblas_dgemv.$(OBJEXT) \ libcblas_a-cblas_sdot.$(OBJEXT) \ libcblas_a-cblas_zhbmv.$(OBJEXT) libcblas_a-xerbla.$(OBJEXT) \ libcblas_a-cblas_dger.$(OBJEXT) \ libcblas_a-cblas_sdsdot.$(OBJEXT) \ libcblas_a-cblas_zhemm.$(OBJEXT) zdotcsub.$(OBJEXT) \ libcblas_a-cblas_dnrm2.$(OBJEXT) \ libcblas_a-cblas_sgbmv.$(OBJEXT) \ libcblas_a-cblas_zhemv.$(OBJEXT) zdotusub.$(OBJEXT) nodist_libcblas_a_OBJECTS = $(am__objects_1) libcblas_a_OBJECTS = $(nodist_libcblas_a_OBJECTS) libf77blas_a_AR = $(AR) $(ARFLAGS) libf77blas_a_LIBADD = am__objects_2 = caxpy.$(OBJEXT) crotg.$(OBJEXT) dcopy.$(OBJEXT) \ dsymv.$(OBJEXT) lsame.$(OBJEXT) sspmv.$(OBJEXT) \ zaxpy.$(OBJEXT) zhpr2.$(OBJEXT) ccopy.$(OBJEXT) \ cscal.$(OBJEXT) ddot.$(OBJEXT) dsyr2.$(OBJEXT) sasum.$(OBJEXT) \ sspr2.$(OBJEXT) zcopy.$(OBJEXT) zhpr.$(OBJEXT) cdotc.$(OBJEXT) \ csrot.$(OBJEXT) dgbmv.$(OBJEXT) dsyr2k.$(OBJEXT) \ saxpy.$(OBJEXT) sspr.$(OBJEXT) zdotc.$(OBJEXT) zrotg.$(OBJEXT) \ cdotu.$(OBJEXT) csscal.$(OBJEXT) dgemm.$(OBJEXT) \ dsyr.$(OBJEXT) scasum.$(OBJEXT) sswap.$(OBJEXT) \ zdotu.$(OBJEXT) zscal.$(OBJEXT) cgbmv.$(OBJEXT) \ cswap.$(OBJEXT) dgemv.$(OBJEXT) dsyrk.$(OBJEXT) \ scnrm2.$(OBJEXT) ssymm.$(OBJEXT) zdrot.$(OBJEXT) \ zswap.$(OBJEXT) cgemm.$(OBJEXT) csymm.$(OBJEXT) dger.$(OBJEXT) \ dtbmv.$(OBJEXT) scopy.$(OBJEXT) ssymv.$(OBJEXT) \ zdscal.$(OBJEXT) zsymm.$(OBJEXT) cgemv.$(OBJEXT) \ csyr2k.$(OBJEXT) dnrm2.$(OBJEXT) dtbsv.$(OBJEXT) \ sdot.$(OBJEXT) ssyr2.$(OBJEXT) zgbmv.$(OBJEXT) \ zsyr2k.$(OBJEXT) cgerc.$(OBJEXT) csyrk.$(OBJEXT) \ drot.$(OBJEXT) dtpmv.$(OBJEXT) sdsdot.$(OBJEXT) \ ssyr2k.$(OBJEXT) zgemm.$(OBJEXT) zsyrk.$(OBJEXT) \ cgeru.$(OBJEXT) ctbmv.$(OBJEXT) drotg.$(OBJEXT) \ dtpsv.$(OBJEXT) sgbmv.$(OBJEXT) ssyr.$(OBJEXT) zgemv.$(OBJEXT) \ ztbmv.$(OBJEXT) chbmv.$(OBJEXT) ctbsv.$(OBJEXT) \ drotm.$(OBJEXT) dtrmm.$(OBJEXT) sgemm.$(OBJEXT) \ ssyrk.$(OBJEXT) zgerc.$(OBJEXT) ztbsv.$(OBJEXT) \ chemm.$(OBJEXT) ctpmv.$(OBJEXT) drotmg.$(OBJEXT) \ dtrmv.$(OBJEXT) sgemv.$(OBJEXT) stbmv.$(OBJEXT) \ zgeru.$(OBJEXT) ztpmv.$(OBJEXT) chemv.$(OBJEXT) \ ctpsv.$(OBJEXT) dsbmv.$(OBJEXT) dtrsm.$(OBJEXT) sger.$(OBJEXT) \ stbsv.$(OBJEXT) zhbmv.$(OBJEXT) ztpsv.$(OBJEXT) \ cher2.$(OBJEXT) ctrmm.$(OBJEXT) dscal.$(OBJEXT) \ dtrsv.$(OBJEXT) snrm2.$(OBJEXT) stpmv.$(OBJEXT) \ zhemm.$(OBJEXT) ztrmm.$(OBJEXT) cher2k.$(OBJEXT) \ ctrmv.$(OBJEXT) dsdot.$(OBJEXT) dzasum.$(OBJEXT) \ srot.$(OBJEXT) stpsv.$(OBJEXT) zhemv.$(OBJEXT) ztrmv.$(OBJEXT) \ cher.$(OBJEXT) ctrsm.$(OBJEXT) dspmv.$(OBJEXT) \ dznrm2.$(OBJEXT) srotg.$(OBJEXT) strmm.$(OBJEXT) \ zher2.$(OBJEXT) ztrsm.$(OBJEXT) cherk.$(OBJEXT) \ ctrsv.$(OBJEXT) dspr2.$(OBJEXT) icamax.$(OBJEXT) \ srotm.$(OBJEXT) strmv.$(OBJEXT) zher2k.$(OBJEXT) \ ztrsv.$(OBJEXT) chpmv.$(OBJEXT) dasum.$(OBJEXT) dspr.$(OBJEXT) \ idamax.$(OBJEXT) srotmg.$(OBJEXT) strsm.$(OBJEXT) \ zher.$(OBJEXT) chpr2.$(OBJEXT) daxpy.$(OBJEXT) dswap.$(OBJEXT) \ isamax.$(OBJEXT) ssbmv.$(OBJEXT) strsv.$(OBJEXT) \ zherk.$(OBJEXT) chpr.$(OBJEXT) dcabs1.$(OBJEXT) \ dsymm.$(OBJEXT) izamax.$(OBJEXT) sscal.$(OBJEXT) \ blas_xerbla.$(OBJEXT) zhpmv.$(OBJEXT) nodist_libf77blas_a_OBJECTS = $(am__objects_2) libf77blas_a_OBJECTS = $(nodist_libf77blas_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = F77COMPILE = $(F77) $(AM_FFLAGS) $(FFLAGS) AM_V_F77 = $(am__v_F77_@AM_V@) am__v_F77_ = $(am__v_F77_@AM_DEFAULT_V@) am__v_F77_0 = @echo " F77 " $@; am__v_F77_1 = F77LD = $(F77) F77LINK = $(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ $@ AM_V_F77LD = $(am__v_F77LD_@AM_V@) am__v_F77LD_ = $(am__v_F77LD_@AM_DEFAULT_V@) am__v_F77LD_0 = @echo " F77LD " $@; am__v_F77LD_1 = SOURCES = $(nodist_libcblas_a_SOURCES) $(nodist_libf77blas_a_SOURCES) DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/../common.mak $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DIRPKG = ../pkg BLAS_TGZ = $(DIRPKG)/blas.tgz CBLAS_TGZ = $(DIRPKG)/cblas.tgz PKGCOMMON_PACKTITLE = BLAS PKGCOMMON_PACKAGES = $(BLAS_TGZ) $(CBLAS_TGZ) ../pkg/OpenBLAS.tar.gz EXTRA_DIST = \ openblas.patches # Downloading and compiling the Generic Blas # ------------------------------------------ noinst_LIBRARIES = @DOWNLOADED_BLAS@ EXTRA_LIBRARIES = libf77blas.a libcblas.a # List of files to compile (do not list them in *_SOURCES to prevent them from being included in distributions). F77BLAS_SOURCES = BLAS/caxpy.f BLAS/crotg.f BLAS/dcopy.f BLAS/dsymv.f BLAS/lsame.f BLAS/sspmv.f BLAS/zaxpy.f BLAS/zhpr2.f \ BLAS/ccopy.f BLAS/cscal.f BLAS/ddot.f BLAS/dsyr2.f BLAS/sasum.f BLAS/sspr2.f BLAS/zcopy.f BLAS/zhpr.f BLAS/cdotc.f \ BLAS/csrot.f BLAS/dgbmv.f BLAS/dsyr2k.f BLAS/saxpy.f BLAS/sspr.f BLAS/zdotc.f BLAS/zrotg.f BLAS/cdotu.f BLAS/csscal.f \ BLAS/dgemm.f BLAS/dsyr.f BLAS/scasum.f BLAS/sswap.f BLAS/zdotu.f BLAS/zscal.f BLAS/cgbmv.f BLAS/cswap.f BLAS/dgemv.f \ BLAS/dsyrk.f BLAS/scnrm2.f BLAS/ssymm.f BLAS/zdrot.f BLAS/zswap.f BLAS/cgemm.f BLAS/csymm.f BLAS/dger.f BLAS/dtbmv.f \ BLAS/scopy.f BLAS/ssymv.f BLAS/zdscal.f BLAS/zsymm.f BLAS/cgemv.f BLAS/csyr2k.f BLAS/dnrm2.f BLAS/dtbsv.f BLAS/sdot.f \ BLAS/ssyr2.f BLAS/zgbmv.f BLAS/zsyr2k.f BLAS/cgerc.f BLAS/csyrk.f BLAS/drot.f BLAS/dtpmv.f BLAS/sdsdot.f BLAS/ssyr2k.f \ BLAS/zgemm.f BLAS/zsyrk.f BLAS/cgeru.f BLAS/ctbmv.f BLAS/drotg.f BLAS/dtpsv.f BLAS/sgbmv.f BLAS/ssyr.f BLAS/zgemv.f \ BLAS/ztbmv.f BLAS/chbmv.f BLAS/ctbsv.f BLAS/drotm.f BLAS/dtrmm.f BLAS/sgemm.f BLAS/ssyrk.f BLAS/zgerc.f BLAS/ztbsv.f \ BLAS/chemm.f BLAS/ctpmv.f BLAS/drotmg.f BLAS/dtrmv.f BLAS/sgemv.f BLAS/stbmv.f BLAS/zgeru.f BLAS/ztpmv.f BLAS/chemv.f \ BLAS/ctpsv.f BLAS/dsbmv.f BLAS/dtrsm.f BLAS/sger.f BLAS/stbsv.f BLAS/zhbmv.f BLAS/ztpsv.f BLAS/cher2.f BLAS/ctrmm.f \ BLAS/dscal.f BLAS/dtrsv.f BLAS/snrm2.f BLAS/stpmv.f BLAS/zhemm.f BLAS/ztrmm.f BLAS/cher2k.f BLAS/ctrmv.f BLAS/dsdot.f \ BLAS/dzasum.f BLAS/srot.f BLAS/stpsv.f BLAS/zhemv.f BLAS/ztrmv.f BLAS/cher.f BLAS/ctrsm.f BLAS/dspmv.f BLAS/dznrm2.f \ BLAS/srotg.f BLAS/strmm.f BLAS/zher2.f BLAS/ztrsm.f BLAS/cherk.f BLAS/ctrsv.f BLAS/dspr2.f BLAS/icamax.f BLAS/srotm.f \ BLAS/strmv.f BLAS/zher2k.f BLAS/ztrsv.f BLAS/chpmv.f BLAS/dasum.f BLAS/dspr.f BLAS/idamax.f BLAS/srotmg.f BLAS/strsm.f \ BLAS/zher.f BLAS/chpr2.f BLAS/daxpy.f BLAS/dswap.f BLAS/isamax.f BLAS/ssbmv.f BLAS/strsv.f BLAS/zherk.f BLAS/chpr.f \ BLAS/dcabs1.f BLAS/dsymm.f BLAS/izamax.f BLAS/sscal.f blas_xerbla.f BLAS/zhpmv.f CBLAS_SOURCES = CBLAS/src/cblas_caxpy.c CBLAS/src/cblas_drot.c CBLAS/src/cblas_sgemm.c CBLAS/src/cblas_zher2.c \ CBLAS/src/cblas_ccopy.c CBLAS/src/cblas_drotg.c CBLAS/src/cblas_sgemv.c CBLAS/src/cblas_zher2k.c \ CBLAS/src/cblas_cdotc_sub.c CBLAS/src/cblas_drotm.c CBLAS/src/cblas_sger.c CBLAS/src/cblas_zher.c \ CBLAS/src/cblas_cdotu_sub.c CBLAS/src/cblas_drotmg.c CBLAS/src/cblas_snrm2.c CBLAS/src/cblas_zherk.c \ CBLAS/src/cblas_cgbmv.c CBLAS/src/cblas_dsbmv.c CBLAS/src/cblas_srot.c CBLAS/src/cblas_zhpmv.c CBLAS/src/cblas_cgemm.c \ CBLAS/src/cblas_dscal.c CBLAS/src/cblas_srotg.c CBLAS/src/cblas_zhpr2.c CBLAS/src/cblas_cgemv.c CBLAS/src/cblas_dsdot.c \ CBLAS/src/cblas_srotm.c CBLAS/src/cblas_zhpr.c CBLAS/src/cblas_cgerc.c CBLAS/src/cblas_dspmv.c CBLAS/src/cblas_srotmg.c \ CBLAS/src/cblas_zscal.c CBLAS/src/cblas_cgeru.c CBLAS/src/cblas_dspr2.c CBLAS/src/cblas_ssbmv.c CBLAS/src/cblas_zswap.c \ CBLAS/src/cblas_chbmv.c CBLAS/src/cblas_dspr.c CBLAS/src/cblas_sscal.c CBLAS/src/cblas_zsymm.c CBLAS/src/cblas_chemm.c \ CBLAS/src/cblas_dswap.c CBLAS/src/cblas_sspmv.c CBLAS/src/cblas_zsyr2k.c CBLAS/src/cblas_chemv.c \ CBLAS/src/cblas_dsymm.c CBLAS/src/cblas_sspr2.c CBLAS/src/cblas_zsyrk.c CBLAS/src/cblas_cher2.c CBLAS/src/cblas_dsymv.c \ CBLAS/src/cblas_sspr.c CBLAS/src/cblas_ztbmv.c CBLAS/src/cblas_cher2k.c CBLAS/src/cblas_dsyr2.c CBLAS/src/cblas_sswap.c \ CBLAS/src/cblas_ztbsv.c CBLAS/src/cblas_cher.c CBLAS/src/cblas_dsyr2k.c CBLAS/src/cblas_ssymm.c CBLAS/src/cblas_ztpmv.c \ CBLAS/src/cblas_cherk.c CBLAS/src/cblas_dsyr.c CBLAS/src/cblas_ssymv.c CBLAS/src/cblas_ztpsv.c CBLAS/src/cblas_chpmv.c \ CBLAS/src/cblas_dsyrk.c CBLAS/src/cblas_ssyr2.c CBLAS/src/cblas_ztrmm.c CBLAS/src/cblas_chpr2.c CBLAS/src/cblas_dtbmv.c \ CBLAS/src/cblas_ssyr2k.c CBLAS/src/cblas_ztrmv.c CBLAS/src/cblas_chpr.c CBLAS/src/cblas_dtbsv.c CBLAS/src/cblas_ssyr.c \ CBLAS/src/cblas_ztrsm.c CBLAS/src/cblas_cscal.c CBLAS/src/cblas_dtpmv.c CBLAS/src/cblas_ssyrk.c CBLAS/src/cblas_ztrsv.c \ CBLAS/src/cblas_csscal.c CBLAS/src/cblas_dtpsv.c CBLAS/src/cblas_stbmv.c CBLAS/src/cdotcsub.f CBLAS/src/cblas_cswap.c \ CBLAS/src/cblas_dtrmm.c CBLAS/src/cblas_stbsv.c CBLAS/src/cdotusub.f CBLAS/src/cblas_csymm.c CBLAS/src/cblas_dtrmv.c \ CBLAS/src/cblas_stpmv.c CBLAS/src/dasumsub.f CBLAS/src/cblas_csyr2k.c CBLAS/src/cblas_dtrsm.c CBLAS/src/cblas_stpsv.c \ CBLAS/src/ddotsub.f CBLAS/src/cblas_csyrk.c CBLAS/src/cblas_dtrsv.c CBLAS/src/cblas_strmm.c CBLAS/src/dnrm2sub.f \ CBLAS/src/cblas_ctbmv.c CBLAS/src/cblas_dzasum.c CBLAS/src/cblas_strmv.c CBLAS/src/dsdotsub.f CBLAS/src/cblas_ctbsv.c \ CBLAS/src/cblas_dznrm2.c CBLAS/src/cblas_strsm.c CBLAS/src/dzasumsub.f CBLAS/src/cblas_ctpmv.c CBLAS/src/cblas_f77.h \ CBLAS/src/cblas_strsv.c CBLAS/src/dznrm2sub.f CBLAS/src/cblas_ctpsv.c CBLAS/src/cblas_globals.c \ CBLAS/src/cblas_xerbla.c CBLAS/src/icamaxsub.f CBLAS/src/cblas_ctrmm.c CBLAS/src/cblas.h CBLAS/src/cblas_zaxpy.c \ CBLAS/src/idamaxsub.f CBLAS/src/cblas_ctrmv.c CBLAS/src/cblas_icamax.c CBLAS/src/cblas_zcopy.c CBLAS/src/isamaxsub.f \ CBLAS/src/cblas_ctrsm.c CBLAS/src/cblas_idamax.c CBLAS/src/cblas_zdotc_sub.c CBLAS/src/izamaxsub.f \ CBLAS/src/cblas_ctrsv.c CBLAS/src/cblas_isamax.c CBLAS/src/cblas_zdotu_sub.c CBLAS/src/Makefile CBLAS/src/cblas_dasum.c \ CBLAS/src/cblas_izamax.c CBLAS/src/cblas_zdscal.c CBLAS/src/sasumsub.f CBLAS/src/cblas_daxpy.c CBLAS/src/cblas_sasum.c \ CBLAS/src/cblas_zgbmv.c CBLAS/src/scasumsub.f CBLAS/src/cblas_dcopy.c CBLAS/src/cblas_saxpy.c CBLAS/src/cblas_zgemm.c \ CBLAS/src/scnrm2sub.f CBLAS/src/cblas_ddot.c CBLAS/src/cblas_scasum.c CBLAS/src/cblas_zgemv.c CBLAS/src/sdotsub.f \ CBLAS/src/cblas_dgbmv.c CBLAS/src/cblas_scnrm2.c CBLAS/src/cblas_zgerc.c CBLAS/src/sdsdotsub.f CBLAS/src/cblas_dgemm.c \ CBLAS/src/cblas_scopy.c CBLAS/src/cblas_zgeru.c CBLAS/src/snrm2sub.f CBLAS/src/cblas_dgemv.c CBLAS/src/cblas_sdot.c \ CBLAS/src/cblas_zhbmv.c CBLAS/src/xerbla.c CBLAS/src/cblas_dger.c CBLAS/src/cblas_sdsdot.c CBLAS/src/cblas_zhemm.c \ CBLAS/src/zdotcsub.f CBLAS/src/cblas_dnrm2.c CBLAS/src/cblas_sgbmv.c CBLAS/src/cblas_zhemv.c CBLAS/src/zdotusub.f nodist_libf77blas_a_SOURCES = $(F77BLAS_SOURCES) nodist_libcblas_a_SOURCES = $(CBLAS_SOURCES) BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ # -ICBLAS/include to find cblas.h libcblas_a_CFLAGS = -DADD_ -ICBLAS/include all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .f .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../common.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu download/blas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu download/blas/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../common.mak $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libcblas.a: $(libcblas_a_OBJECTS) $(libcblas_a_DEPENDENCIES) $(EXTRA_libcblas_a_DEPENDENCIES) $(AM_V_at)-rm -f libcblas.a $(AM_V_AR)$(libcblas_a_AR) libcblas.a $(libcblas_a_OBJECTS) $(libcblas_a_LIBADD) $(AM_V_at)$(RANLIB) libcblas.a libf77blas.a: $(libf77blas_a_OBJECTS) $(libf77blas_a_DEPENDENCIES) $(EXTRA_libf77blas_a_DEPENDENCIES) $(AM_V_at)-rm -f libf77blas.a $(AM_V_AR)$(libf77blas_a_AR) libf77blas.a $(libf77blas_a_OBJECTS) $(libf77blas_a_LIBADD) $(AM_V_at)$(RANLIB) libf77blas.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_caxpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ccopy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cdotc_sub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cdotu_sub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cgbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cgemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cgemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cgerc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cgeru.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_chbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_chemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_chemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cher2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cher2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cherk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_chpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_chpr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_chpr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cscal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_csscal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_cswap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_csymm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_csyr2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_csyrk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctbsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctpsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctrmm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctrmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctrsm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ctrsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dasum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_daxpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dcopy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ddot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dgbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dgemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dgemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dnrm2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_drot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_drotg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_drotm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_drotmg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dscal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsdot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dspmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dspr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dspr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dswap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsymm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsymv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsyr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsyr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsyr2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dsyrk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtbsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtpsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtrmm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtrmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtrsm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dtrsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dzasum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_dznrm2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_icamax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_idamax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_isamax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_izamax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sasum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_saxpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_scasum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_scnrm2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_scopy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sdot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sdsdot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sgbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sgemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sgemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_snrm2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_srot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_srotg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_srotm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_srotmg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sscal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sspmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sspr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sspr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_sswap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssymm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssymv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssyr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssyr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssyr2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ssyrk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_stbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_stbsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_stpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_stpsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_strmm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_strmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_strsm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_strsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_xerbla.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zaxpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zcopy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zdotc_sub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zdotu_sub.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zdscal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zgbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zgemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zgemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zgerc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zgeru.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zhbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zhemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zhemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zher2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zher2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zherk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zhpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zhpr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zhpr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zscal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zswap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zsymm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zsyr2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_zsyrk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztbsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztpsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztrmm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztrmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztrsm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-cblas_ztrsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcblas_a-xerbla.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libcblas_a-cblas_caxpy.o: CBLAS/src/cblas_caxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_caxpy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_caxpy.Tpo -c -o libcblas_a-cblas_caxpy.o `test -f 'CBLAS/src/cblas_caxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_caxpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_caxpy.Tpo $(DEPDIR)/libcblas_a-cblas_caxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_caxpy.c' object='libcblas_a-cblas_caxpy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_caxpy.o `test -f 'CBLAS/src/cblas_caxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_caxpy.c libcblas_a-cblas_caxpy.obj: CBLAS/src/cblas_caxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_caxpy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_caxpy.Tpo -c -o libcblas_a-cblas_caxpy.obj `if test -f 'CBLAS/src/cblas_caxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_caxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_caxpy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_caxpy.Tpo $(DEPDIR)/libcblas_a-cblas_caxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_caxpy.c' object='libcblas_a-cblas_caxpy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_caxpy.obj `if test -f 'CBLAS/src/cblas_caxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_caxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_caxpy.c'; fi` libcblas_a-cblas_drot.o: CBLAS/src/cblas_drot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drot.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drot.Tpo -c -o libcblas_a-cblas_drot.o `test -f 'CBLAS/src/cblas_drot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drot.Tpo $(DEPDIR)/libcblas_a-cblas_drot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drot.c' object='libcblas_a-cblas_drot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drot.o `test -f 'CBLAS/src/cblas_drot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drot.c libcblas_a-cblas_drot.obj: CBLAS/src/cblas_drot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drot.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drot.Tpo -c -o libcblas_a-cblas_drot.obj `if test -f 'CBLAS/src/cblas_drot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drot.Tpo $(DEPDIR)/libcblas_a-cblas_drot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drot.c' object='libcblas_a-cblas_drot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drot.obj `if test -f 'CBLAS/src/cblas_drot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drot.c'; fi` libcblas_a-cblas_sgemm.o: CBLAS/src/cblas_sgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sgemm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sgemm.Tpo -c -o libcblas_a-cblas_sgemm.o `test -f 'CBLAS/src/cblas_sgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sgemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sgemm.Tpo $(DEPDIR)/libcblas_a-cblas_sgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sgemm.c' object='libcblas_a-cblas_sgemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sgemm.o `test -f 'CBLAS/src/cblas_sgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sgemm.c libcblas_a-cblas_sgemm.obj: CBLAS/src/cblas_sgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sgemm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sgemm.Tpo -c -o libcblas_a-cblas_sgemm.obj `if test -f 'CBLAS/src/cblas_sgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sgemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sgemm.Tpo $(DEPDIR)/libcblas_a-cblas_sgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sgemm.c' object='libcblas_a-cblas_sgemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sgemm.obj `if test -f 'CBLAS/src/cblas_sgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sgemm.c'; fi` libcblas_a-cblas_zher2.o: CBLAS/src/cblas_zher2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zher2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zher2.Tpo -c -o libcblas_a-cblas_zher2.o `test -f 'CBLAS/src/cblas_zher2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zher2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zher2.Tpo $(DEPDIR)/libcblas_a-cblas_zher2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zher2.c' object='libcblas_a-cblas_zher2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zher2.o `test -f 'CBLAS/src/cblas_zher2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zher2.c libcblas_a-cblas_zher2.obj: CBLAS/src/cblas_zher2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zher2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zher2.Tpo -c -o libcblas_a-cblas_zher2.obj `if test -f 'CBLAS/src/cblas_zher2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zher2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zher2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zher2.Tpo $(DEPDIR)/libcblas_a-cblas_zher2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zher2.c' object='libcblas_a-cblas_zher2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zher2.obj `if test -f 'CBLAS/src/cblas_zher2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zher2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zher2.c'; fi` libcblas_a-cblas_ccopy.o: CBLAS/src/cblas_ccopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ccopy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ccopy.Tpo -c -o libcblas_a-cblas_ccopy.o `test -f 'CBLAS/src/cblas_ccopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ccopy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ccopy.Tpo $(DEPDIR)/libcblas_a-cblas_ccopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ccopy.c' object='libcblas_a-cblas_ccopy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ccopy.o `test -f 'CBLAS/src/cblas_ccopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ccopy.c libcblas_a-cblas_ccopy.obj: CBLAS/src/cblas_ccopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ccopy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ccopy.Tpo -c -o libcblas_a-cblas_ccopy.obj `if test -f 'CBLAS/src/cblas_ccopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ccopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ccopy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ccopy.Tpo $(DEPDIR)/libcblas_a-cblas_ccopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ccopy.c' object='libcblas_a-cblas_ccopy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ccopy.obj `if test -f 'CBLAS/src/cblas_ccopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ccopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ccopy.c'; fi` libcblas_a-cblas_drotg.o: CBLAS/src/cblas_drotg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drotg.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drotg.Tpo -c -o libcblas_a-cblas_drotg.o `test -f 'CBLAS/src/cblas_drotg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drotg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drotg.Tpo $(DEPDIR)/libcblas_a-cblas_drotg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drotg.c' object='libcblas_a-cblas_drotg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drotg.o `test -f 'CBLAS/src/cblas_drotg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drotg.c libcblas_a-cblas_drotg.obj: CBLAS/src/cblas_drotg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drotg.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drotg.Tpo -c -o libcblas_a-cblas_drotg.obj `if test -f 'CBLAS/src/cblas_drotg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drotg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drotg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drotg.Tpo $(DEPDIR)/libcblas_a-cblas_drotg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drotg.c' object='libcblas_a-cblas_drotg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drotg.obj `if test -f 'CBLAS/src/cblas_drotg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drotg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drotg.c'; fi` libcblas_a-cblas_sgemv.o: CBLAS/src/cblas_sgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sgemv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sgemv.Tpo -c -o libcblas_a-cblas_sgemv.o `test -f 'CBLAS/src/cblas_sgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sgemv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sgemv.Tpo $(DEPDIR)/libcblas_a-cblas_sgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sgemv.c' object='libcblas_a-cblas_sgemv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sgemv.o `test -f 'CBLAS/src/cblas_sgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sgemv.c libcblas_a-cblas_sgemv.obj: CBLAS/src/cblas_sgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sgemv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sgemv.Tpo -c -o libcblas_a-cblas_sgemv.obj `if test -f 'CBLAS/src/cblas_sgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sgemv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sgemv.Tpo $(DEPDIR)/libcblas_a-cblas_sgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sgemv.c' object='libcblas_a-cblas_sgemv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sgemv.obj `if test -f 'CBLAS/src/cblas_sgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sgemv.c'; fi` libcblas_a-cblas_zher2k.o: CBLAS/src/cblas_zher2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zher2k.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zher2k.Tpo -c -o libcblas_a-cblas_zher2k.o `test -f 'CBLAS/src/cblas_zher2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zher2k.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zher2k.Tpo $(DEPDIR)/libcblas_a-cblas_zher2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zher2k.c' object='libcblas_a-cblas_zher2k.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zher2k.o `test -f 'CBLAS/src/cblas_zher2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zher2k.c libcblas_a-cblas_zher2k.obj: CBLAS/src/cblas_zher2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zher2k.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zher2k.Tpo -c -o libcblas_a-cblas_zher2k.obj `if test -f 'CBLAS/src/cblas_zher2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zher2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zher2k.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zher2k.Tpo $(DEPDIR)/libcblas_a-cblas_zher2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zher2k.c' object='libcblas_a-cblas_zher2k.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zher2k.obj `if test -f 'CBLAS/src/cblas_zher2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zher2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zher2k.c'; fi` libcblas_a-cblas_cdotc_sub.o: CBLAS/src/cblas_cdotc_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cdotc_sub.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cdotc_sub.Tpo -c -o libcblas_a-cblas_cdotc_sub.o `test -f 'CBLAS/src/cblas_cdotc_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cdotc_sub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cdotc_sub.Tpo $(DEPDIR)/libcblas_a-cblas_cdotc_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cdotc_sub.c' object='libcblas_a-cblas_cdotc_sub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cdotc_sub.o `test -f 'CBLAS/src/cblas_cdotc_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cdotc_sub.c libcblas_a-cblas_cdotc_sub.obj: CBLAS/src/cblas_cdotc_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cdotc_sub.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cdotc_sub.Tpo -c -o libcblas_a-cblas_cdotc_sub.obj `if test -f 'CBLAS/src/cblas_cdotc_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cdotc_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cdotc_sub.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cdotc_sub.Tpo $(DEPDIR)/libcblas_a-cblas_cdotc_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cdotc_sub.c' object='libcblas_a-cblas_cdotc_sub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cdotc_sub.obj `if test -f 'CBLAS/src/cblas_cdotc_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cdotc_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cdotc_sub.c'; fi` libcblas_a-cblas_drotm.o: CBLAS/src/cblas_drotm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drotm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drotm.Tpo -c -o libcblas_a-cblas_drotm.o `test -f 'CBLAS/src/cblas_drotm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drotm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drotm.Tpo $(DEPDIR)/libcblas_a-cblas_drotm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drotm.c' object='libcblas_a-cblas_drotm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drotm.o `test -f 'CBLAS/src/cblas_drotm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drotm.c libcblas_a-cblas_drotm.obj: CBLAS/src/cblas_drotm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drotm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drotm.Tpo -c -o libcblas_a-cblas_drotm.obj `if test -f 'CBLAS/src/cblas_drotm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drotm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drotm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drotm.Tpo $(DEPDIR)/libcblas_a-cblas_drotm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drotm.c' object='libcblas_a-cblas_drotm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drotm.obj `if test -f 'CBLAS/src/cblas_drotm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drotm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drotm.c'; fi` libcblas_a-cblas_sger.o: CBLAS/src/cblas_sger.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sger.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sger.Tpo -c -o libcblas_a-cblas_sger.o `test -f 'CBLAS/src/cblas_sger.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sger.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sger.Tpo $(DEPDIR)/libcblas_a-cblas_sger.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sger.c' object='libcblas_a-cblas_sger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sger.o `test -f 'CBLAS/src/cblas_sger.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sger.c libcblas_a-cblas_sger.obj: CBLAS/src/cblas_sger.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sger.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sger.Tpo -c -o libcblas_a-cblas_sger.obj `if test -f 'CBLAS/src/cblas_sger.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sger.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sger.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sger.Tpo $(DEPDIR)/libcblas_a-cblas_sger.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sger.c' object='libcblas_a-cblas_sger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sger.obj `if test -f 'CBLAS/src/cblas_sger.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sger.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sger.c'; fi` libcblas_a-cblas_zher.o: CBLAS/src/cblas_zher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zher.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zher.Tpo -c -o libcblas_a-cblas_zher.o `test -f 'CBLAS/src/cblas_zher.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zher.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zher.Tpo $(DEPDIR)/libcblas_a-cblas_zher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zher.c' object='libcblas_a-cblas_zher.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zher.o `test -f 'CBLAS/src/cblas_zher.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zher.c libcblas_a-cblas_zher.obj: CBLAS/src/cblas_zher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zher.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zher.Tpo -c -o libcblas_a-cblas_zher.obj `if test -f 'CBLAS/src/cblas_zher.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zher.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zher.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zher.Tpo $(DEPDIR)/libcblas_a-cblas_zher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zher.c' object='libcblas_a-cblas_zher.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zher.obj `if test -f 'CBLAS/src/cblas_zher.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zher.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zher.c'; fi` libcblas_a-cblas_cdotu_sub.o: CBLAS/src/cblas_cdotu_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cdotu_sub.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cdotu_sub.Tpo -c -o libcblas_a-cblas_cdotu_sub.o `test -f 'CBLAS/src/cblas_cdotu_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cdotu_sub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cdotu_sub.Tpo $(DEPDIR)/libcblas_a-cblas_cdotu_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cdotu_sub.c' object='libcblas_a-cblas_cdotu_sub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cdotu_sub.o `test -f 'CBLAS/src/cblas_cdotu_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cdotu_sub.c libcblas_a-cblas_cdotu_sub.obj: CBLAS/src/cblas_cdotu_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cdotu_sub.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cdotu_sub.Tpo -c -o libcblas_a-cblas_cdotu_sub.obj `if test -f 'CBLAS/src/cblas_cdotu_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cdotu_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cdotu_sub.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cdotu_sub.Tpo $(DEPDIR)/libcblas_a-cblas_cdotu_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cdotu_sub.c' object='libcblas_a-cblas_cdotu_sub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cdotu_sub.obj `if test -f 'CBLAS/src/cblas_cdotu_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cdotu_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cdotu_sub.c'; fi` libcblas_a-cblas_drotmg.o: CBLAS/src/cblas_drotmg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drotmg.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drotmg.Tpo -c -o libcblas_a-cblas_drotmg.o `test -f 'CBLAS/src/cblas_drotmg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drotmg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drotmg.Tpo $(DEPDIR)/libcblas_a-cblas_drotmg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drotmg.c' object='libcblas_a-cblas_drotmg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drotmg.o `test -f 'CBLAS/src/cblas_drotmg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_drotmg.c libcblas_a-cblas_drotmg.obj: CBLAS/src/cblas_drotmg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_drotmg.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_drotmg.Tpo -c -o libcblas_a-cblas_drotmg.obj `if test -f 'CBLAS/src/cblas_drotmg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drotmg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drotmg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_drotmg.Tpo $(DEPDIR)/libcblas_a-cblas_drotmg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_drotmg.c' object='libcblas_a-cblas_drotmg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_drotmg.obj `if test -f 'CBLAS/src/cblas_drotmg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_drotmg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_drotmg.c'; fi` libcblas_a-cblas_snrm2.o: CBLAS/src/cblas_snrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_snrm2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_snrm2.Tpo -c -o libcblas_a-cblas_snrm2.o `test -f 'CBLAS/src/cblas_snrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_snrm2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_snrm2.Tpo $(DEPDIR)/libcblas_a-cblas_snrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_snrm2.c' object='libcblas_a-cblas_snrm2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_snrm2.o `test -f 'CBLAS/src/cblas_snrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_snrm2.c libcblas_a-cblas_snrm2.obj: CBLAS/src/cblas_snrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_snrm2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_snrm2.Tpo -c -o libcblas_a-cblas_snrm2.obj `if test -f 'CBLAS/src/cblas_snrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_snrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_snrm2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_snrm2.Tpo $(DEPDIR)/libcblas_a-cblas_snrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_snrm2.c' object='libcblas_a-cblas_snrm2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_snrm2.obj `if test -f 'CBLAS/src/cblas_snrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_snrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_snrm2.c'; fi` libcblas_a-cblas_zherk.o: CBLAS/src/cblas_zherk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zherk.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zherk.Tpo -c -o libcblas_a-cblas_zherk.o `test -f 'CBLAS/src/cblas_zherk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zherk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zherk.Tpo $(DEPDIR)/libcblas_a-cblas_zherk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zherk.c' object='libcblas_a-cblas_zherk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zherk.o `test -f 'CBLAS/src/cblas_zherk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zherk.c libcblas_a-cblas_zherk.obj: CBLAS/src/cblas_zherk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zherk.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zherk.Tpo -c -o libcblas_a-cblas_zherk.obj `if test -f 'CBLAS/src/cblas_zherk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zherk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zherk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zherk.Tpo $(DEPDIR)/libcblas_a-cblas_zherk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zherk.c' object='libcblas_a-cblas_zherk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zherk.obj `if test -f 'CBLAS/src/cblas_zherk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zherk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zherk.c'; fi` libcblas_a-cblas_cgbmv.o: CBLAS/src/cblas_cgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgbmv.Tpo -c -o libcblas_a-cblas_cgbmv.o `test -f 'CBLAS/src/cblas_cgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_cgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgbmv.c' object='libcblas_a-cblas_cgbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgbmv.o `test -f 'CBLAS/src/cblas_cgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgbmv.c libcblas_a-cblas_cgbmv.obj: CBLAS/src/cblas_cgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgbmv.Tpo -c -o libcblas_a-cblas_cgbmv.obj `if test -f 'CBLAS/src/cblas_cgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_cgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgbmv.c' object='libcblas_a-cblas_cgbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgbmv.obj `if test -f 'CBLAS/src/cblas_cgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgbmv.c'; fi` libcblas_a-cblas_dsbmv.o: CBLAS/src/cblas_dsbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsbmv.Tpo -c -o libcblas_a-cblas_dsbmv.o `test -f 'CBLAS/src/cblas_dsbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsbmv.Tpo $(DEPDIR)/libcblas_a-cblas_dsbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsbmv.c' object='libcblas_a-cblas_dsbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsbmv.o `test -f 'CBLAS/src/cblas_dsbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsbmv.c libcblas_a-cblas_dsbmv.obj: CBLAS/src/cblas_dsbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsbmv.Tpo -c -o libcblas_a-cblas_dsbmv.obj `if test -f 'CBLAS/src/cblas_dsbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsbmv.Tpo $(DEPDIR)/libcblas_a-cblas_dsbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsbmv.c' object='libcblas_a-cblas_dsbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsbmv.obj `if test -f 'CBLAS/src/cblas_dsbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsbmv.c'; fi` libcblas_a-cblas_srot.o: CBLAS/src/cblas_srot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srot.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srot.Tpo -c -o libcblas_a-cblas_srot.o `test -f 'CBLAS/src/cblas_srot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srot.Tpo $(DEPDIR)/libcblas_a-cblas_srot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srot.c' object='libcblas_a-cblas_srot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srot.o `test -f 'CBLAS/src/cblas_srot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srot.c libcblas_a-cblas_srot.obj: CBLAS/src/cblas_srot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srot.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srot.Tpo -c -o libcblas_a-cblas_srot.obj `if test -f 'CBLAS/src/cblas_srot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srot.Tpo $(DEPDIR)/libcblas_a-cblas_srot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srot.c' object='libcblas_a-cblas_srot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srot.obj `if test -f 'CBLAS/src/cblas_srot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srot.c'; fi` libcblas_a-cblas_zhpmv.o: CBLAS/src/cblas_zhpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhpmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhpmv.Tpo -c -o libcblas_a-cblas_zhpmv.o `test -f 'CBLAS/src/cblas_zhpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhpmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhpmv.Tpo $(DEPDIR)/libcblas_a-cblas_zhpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhpmv.c' object='libcblas_a-cblas_zhpmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhpmv.o `test -f 'CBLAS/src/cblas_zhpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhpmv.c libcblas_a-cblas_zhpmv.obj: CBLAS/src/cblas_zhpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhpmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhpmv.Tpo -c -o libcblas_a-cblas_zhpmv.obj `if test -f 'CBLAS/src/cblas_zhpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhpmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhpmv.Tpo $(DEPDIR)/libcblas_a-cblas_zhpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhpmv.c' object='libcblas_a-cblas_zhpmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhpmv.obj `if test -f 'CBLAS/src/cblas_zhpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhpmv.c'; fi` libcblas_a-cblas_cgemm.o: CBLAS/src/cblas_cgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgemm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgemm.Tpo -c -o libcblas_a-cblas_cgemm.o `test -f 'CBLAS/src/cblas_cgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgemm.Tpo $(DEPDIR)/libcblas_a-cblas_cgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgemm.c' object='libcblas_a-cblas_cgemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgemm.o `test -f 'CBLAS/src/cblas_cgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgemm.c libcblas_a-cblas_cgemm.obj: CBLAS/src/cblas_cgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgemm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgemm.Tpo -c -o libcblas_a-cblas_cgemm.obj `if test -f 'CBLAS/src/cblas_cgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgemm.Tpo $(DEPDIR)/libcblas_a-cblas_cgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgemm.c' object='libcblas_a-cblas_cgemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgemm.obj `if test -f 'CBLAS/src/cblas_cgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgemm.c'; fi` libcblas_a-cblas_dscal.o: CBLAS/src/cblas_dscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dscal.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dscal.Tpo -c -o libcblas_a-cblas_dscal.o `test -f 'CBLAS/src/cblas_dscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dscal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dscal.Tpo $(DEPDIR)/libcblas_a-cblas_dscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dscal.c' object='libcblas_a-cblas_dscal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dscal.o `test -f 'CBLAS/src/cblas_dscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dscal.c libcblas_a-cblas_dscal.obj: CBLAS/src/cblas_dscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dscal.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dscal.Tpo -c -o libcblas_a-cblas_dscal.obj `if test -f 'CBLAS/src/cblas_dscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dscal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dscal.Tpo $(DEPDIR)/libcblas_a-cblas_dscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dscal.c' object='libcblas_a-cblas_dscal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dscal.obj `if test -f 'CBLAS/src/cblas_dscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dscal.c'; fi` libcblas_a-cblas_srotg.o: CBLAS/src/cblas_srotg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srotg.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srotg.Tpo -c -o libcblas_a-cblas_srotg.o `test -f 'CBLAS/src/cblas_srotg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srotg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srotg.Tpo $(DEPDIR)/libcblas_a-cblas_srotg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srotg.c' object='libcblas_a-cblas_srotg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srotg.o `test -f 'CBLAS/src/cblas_srotg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srotg.c libcblas_a-cblas_srotg.obj: CBLAS/src/cblas_srotg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srotg.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srotg.Tpo -c -o libcblas_a-cblas_srotg.obj `if test -f 'CBLAS/src/cblas_srotg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srotg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srotg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srotg.Tpo $(DEPDIR)/libcblas_a-cblas_srotg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srotg.c' object='libcblas_a-cblas_srotg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srotg.obj `if test -f 'CBLAS/src/cblas_srotg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srotg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srotg.c'; fi` libcblas_a-cblas_zhpr2.o: CBLAS/src/cblas_zhpr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhpr2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhpr2.Tpo -c -o libcblas_a-cblas_zhpr2.o `test -f 'CBLAS/src/cblas_zhpr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhpr2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhpr2.Tpo $(DEPDIR)/libcblas_a-cblas_zhpr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhpr2.c' object='libcblas_a-cblas_zhpr2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhpr2.o `test -f 'CBLAS/src/cblas_zhpr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhpr2.c libcblas_a-cblas_zhpr2.obj: CBLAS/src/cblas_zhpr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhpr2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhpr2.Tpo -c -o libcblas_a-cblas_zhpr2.obj `if test -f 'CBLAS/src/cblas_zhpr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhpr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhpr2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhpr2.Tpo $(DEPDIR)/libcblas_a-cblas_zhpr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhpr2.c' object='libcblas_a-cblas_zhpr2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhpr2.obj `if test -f 'CBLAS/src/cblas_zhpr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhpr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhpr2.c'; fi` libcblas_a-cblas_cgemv.o: CBLAS/src/cblas_cgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgemv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgemv.Tpo -c -o libcblas_a-cblas_cgemv.o `test -f 'CBLAS/src/cblas_cgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgemv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgemv.Tpo $(DEPDIR)/libcblas_a-cblas_cgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgemv.c' object='libcblas_a-cblas_cgemv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgemv.o `test -f 'CBLAS/src/cblas_cgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgemv.c libcblas_a-cblas_cgemv.obj: CBLAS/src/cblas_cgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgemv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgemv.Tpo -c -o libcblas_a-cblas_cgemv.obj `if test -f 'CBLAS/src/cblas_cgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgemv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgemv.Tpo $(DEPDIR)/libcblas_a-cblas_cgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgemv.c' object='libcblas_a-cblas_cgemv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgemv.obj `if test -f 'CBLAS/src/cblas_cgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgemv.c'; fi` libcblas_a-cblas_dsdot.o: CBLAS/src/cblas_dsdot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsdot.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsdot.Tpo -c -o libcblas_a-cblas_dsdot.o `test -f 'CBLAS/src/cblas_dsdot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsdot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsdot.Tpo $(DEPDIR)/libcblas_a-cblas_dsdot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsdot.c' object='libcblas_a-cblas_dsdot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsdot.o `test -f 'CBLAS/src/cblas_dsdot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsdot.c libcblas_a-cblas_dsdot.obj: CBLAS/src/cblas_dsdot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsdot.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsdot.Tpo -c -o libcblas_a-cblas_dsdot.obj `if test -f 'CBLAS/src/cblas_dsdot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsdot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsdot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsdot.Tpo $(DEPDIR)/libcblas_a-cblas_dsdot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsdot.c' object='libcblas_a-cblas_dsdot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsdot.obj `if test -f 'CBLAS/src/cblas_dsdot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsdot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsdot.c'; fi` libcblas_a-cblas_srotm.o: CBLAS/src/cblas_srotm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srotm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srotm.Tpo -c -o libcblas_a-cblas_srotm.o `test -f 'CBLAS/src/cblas_srotm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srotm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srotm.Tpo $(DEPDIR)/libcblas_a-cblas_srotm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srotm.c' object='libcblas_a-cblas_srotm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srotm.o `test -f 'CBLAS/src/cblas_srotm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srotm.c libcblas_a-cblas_srotm.obj: CBLAS/src/cblas_srotm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srotm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srotm.Tpo -c -o libcblas_a-cblas_srotm.obj `if test -f 'CBLAS/src/cblas_srotm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srotm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srotm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srotm.Tpo $(DEPDIR)/libcblas_a-cblas_srotm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srotm.c' object='libcblas_a-cblas_srotm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srotm.obj `if test -f 'CBLAS/src/cblas_srotm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srotm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srotm.c'; fi` libcblas_a-cblas_zhpr.o: CBLAS/src/cblas_zhpr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhpr.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhpr.Tpo -c -o libcblas_a-cblas_zhpr.o `test -f 'CBLAS/src/cblas_zhpr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhpr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhpr.Tpo $(DEPDIR)/libcblas_a-cblas_zhpr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhpr.c' object='libcblas_a-cblas_zhpr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhpr.o `test -f 'CBLAS/src/cblas_zhpr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhpr.c libcblas_a-cblas_zhpr.obj: CBLAS/src/cblas_zhpr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhpr.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhpr.Tpo -c -o libcblas_a-cblas_zhpr.obj `if test -f 'CBLAS/src/cblas_zhpr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhpr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhpr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhpr.Tpo $(DEPDIR)/libcblas_a-cblas_zhpr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhpr.c' object='libcblas_a-cblas_zhpr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhpr.obj `if test -f 'CBLAS/src/cblas_zhpr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhpr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhpr.c'; fi` libcblas_a-cblas_cgerc.o: CBLAS/src/cblas_cgerc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgerc.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgerc.Tpo -c -o libcblas_a-cblas_cgerc.o `test -f 'CBLAS/src/cblas_cgerc.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgerc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgerc.Tpo $(DEPDIR)/libcblas_a-cblas_cgerc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgerc.c' object='libcblas_a-cblas_cgerc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgerc.o `test -f 'CBLAS/src/cblas_cgerc.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgerc.c libcblas_a-cblas_cgerc.obj: CBLAS/src/cblas_cgerc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgerc.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgerc.Tpo -c -o libcblas_a-cblas_cgerc.obj `if test -f 'CBLAS/src/cblas_cgerc.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgerc.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgerc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgerc.Tpo $(DEPDIR)/libcblas_a-cblas_cgerc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgerc.c' object='libcblas_a-cblas_cgerc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgerc.obj `if test -f 'CBLAS/src/cblas_cgerc.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgerc.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgerc.c'; fi` libcblas_a-cblas_dspmv.o: CBLAS/src/cblas_dspmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dspmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dspmv.Tpo -c -o libcblas_a-cblas_dspmv.o `test -f 'CBLAS/src/cblas_dspmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dspmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dspmv.Tpo $(DEPDIR)/libcblas_a-cblas_dspmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dspmv.c' object='libcblas_a-cblas_dspmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dspmv.o `test -f 'CBLAS/src/cblas_dspmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dspmv.c libcblas_a-cblas_dspmv.obj: CBLAS/src/cblas_dspmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dspmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dspmv.Tpo -c -o libcblas_a-cblas_dspmv.obj `if test -f 'CBLAS/src/cblas_dspmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dspmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dspmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dspmv.Tpo $(DEPDIR)/libcblas_a-cblas_dspmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dspmv.c' object='libcblas_a-cblas_dspmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dspmv.obj `if test -f 'CBLAS/src/cblas_dspmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dspmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dspmv.c'; fi` libcblas_a-cblas_srotmg.o: CBLAS/src/cblas_srotmg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srotmg.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srotmg.Tpo -c -o libcblas_a-cblas_srotmg.o `test -f 'CBLAS/src/cblas_srotmg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srotmg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srotmg.Tpo $(DEPDIR)/libcblas_a-cblas_srotmg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srotmg.c' object='libcblas_a-cblas_srotmg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srotmg.o `test -f 'CBLAS/src/cblas_srotmg.c' || echo '$(srcdir)/'`CBLAS/src/cblas_srotmg.c libcblas_a-cblas_srotmg.obj: CBLAS/src/cblas_srotmg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_srotmg.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_srotmg.Tpo -c -o libcblas_a-cblas_srotmg.obj `if test -f 'CBLAS/src/cblas_srotmg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srotmg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srotmg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_srotmg.Tpo $(DEPDIR)/libcblas_a-cblas_srotmg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_srotmg.c' object='libcblas_a-cblas_srotmg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_srotmg.obj `if test -f 'CBLAS/src/cblas_srotmg.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_srotmg.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_srotmg.c'; fi` libcblas_a-cblas_zscal.o: CBLAS/src/cblas_zscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zscal.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zscal.Tpo -c -o libcblas_a-cblas_zscal.o `test -f 'CBLAS/src/cblas_zscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zscal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zscal.Tpo $(DEPDIR)/libcblas_a-cblas_zscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zscal.c' object='libcblas_a-cblas_zscal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zscal.o `test -f 'CBLAS/src/cblas_zscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zscal.c libcblas_a-cblas_zscal.obj: CBLAS/src/cblas_zscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zscal.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zscal.Tpo -c -o libcblas_a-cblas_zscal.obj `if test -f 'CBLAS/src/cblas_zscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zscal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zscal.Tpo $(DEPDIR)/libcblas_a-cblas_zscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zscal.c' object='libcblas_a-cblas_zscal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zscal.obj `if test -f 'CBLAS/src/cblas_zscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zscal.c'; fi` libcblas_a-cblas_cgeru.o: CBLAS/src/cblas_cgeru.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgeru.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgeru.Tpo -c -o libcblas_a-cblas_cgeru.o `test -f 'CBLAS/src/cblas_cgeru.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgeru.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgeru.Tpo $(DEPDIR)/libcblas_a-cblas_cgeru.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgeru.c' object='libcblas_a-cblas_cgeru.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgeru.o `test -f 'CBLAS/src/cblas_cgeru.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cgeru.c libcblas_a-cblas_cgeru.obj: CBLAS/src/cblas_cgeru.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cgeru.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cgeru.Tpo -c -o libcblas_a-cblas_cgeru.obj `if test -f 'CBLAS/src/cblas_cgeru.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgeru.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgeru.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cgeru.Tpo $(DEPDIR)/libcblas_a-cblas_cgeru.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cgeru.c' object='libcblas_a-cblas_cgeru.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cgeru.obj `if test -f 'CBLAS/src/cblas_cgeru.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cgeru.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cgeru.c'; fi` libcblas_a-cblas_dspr2.o: CBLAS/src/cblas_dspr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dspr2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dspr2.Tpo -c -o libcblas_a-cblas_dspr2.o `test -f 'CBLAS/src/cblas_dspr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dspr2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dspr2.Tpo $(DEPDIR)/libcblas_a-cblas_dspr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dspr2.c' object='libcblas_a-cblas_dspr2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dspr2.o `test -f 'CBLAS/src/cblas_dspr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dspr2.c libcblas_a-cblas_dspr2.obj: CBLAS/src/cblas_dspr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dspr2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dspr2.Tpo -c -o libcblas_a-cblas_dspr2.obj `if test -f 'CBLAS/src/cblas_dspr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dspr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dspr2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dspr2.Tpo $(DEPDIR)/libcblas_a-cblas_dspr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dspr2.c' object='libcblas_a-cblas_dspr2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dspr2.obj `if test -f 'CBLAS/src/cblas_dspr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dspr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dspr2.c'; fi` libcblas_a-cblas_ssbmv.o: CBLAS/src/cblas_ssbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssbmv.Tpo -c -o libcblas_a-cblas_ssbmv.o `test -f 'CBLAS/src/cblas_ssbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssbmv.Tpo $(DEPDIR)/libcblas_a-cblas_ssbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssbmv.c' object='libcblas_a-cblas_ssbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssbmv.o `test -f 'CBLAS/src/cblas_ssbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssbmv.c libcblas_a-cblas_ssbmv.obj: CBLAS/src/cblas_ssbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssbmv.Tpo -c -o libcblas_a-cblas_ssbmv.obj `if test -f 'CBLAS/src/cblas_ssbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssbmv.Tpo $(DEPDIR)/libcblas_a-cblas_ssbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssbmv.c' object='libcblas_a-cblas_ssbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssbmv.obj `if test -f 'CBLAS/src/cblas_ssbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssbmv.c'; fi` libcblas_a-cblas_zswap.o: CBLAS/src/cblas_zswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zswap.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zswap.Tpo -c -o libcblas_a-cblas_zswap.o `test -f 'CBLAS/src/cblas_zswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zswap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zswap.Tpo $(DEPDIR)/libcblas_a-cblas_zswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zswap.c' object='libcblas_a-cblas_zswap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zswap.o `test -f 'CBLAS/src/cblas_zswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zswap.c libcblas_a-cblas_zswap.obj: CBLAS/src/cblas_zswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zswap.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zswap.Tpo -c -o libcblas_a-cblas_zswap.obj `if test -f 'CBLAS/src/cblas_zswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zswap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zswap.Tpo $(DEPDIR)/libcblas_a-cblas_zswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zswap.c' object='libcblas_a-cblas_zswap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zswap.obj `if test -f 'CBLAS/src/cblas_zswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zswap.c'; fi` libcblas_a-cblas_chbmv.o: CBLAS/src/cblas_chbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chbmv.Tpo -c -o libcblas_a-cblas_chbmv.o `test -f 'CBLAS/src/cblas_chbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chbmv.Tpo $(DEPDIR)/libcblas_a-cblas_chbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chbmv.c' object='libcblas_a-cblas_chbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chbmv.o `test -f 'CBLAS/src/cblas_chbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chbmv.c libcblas_a-cblas_chbmv.obj: CBLAS/src/cblas_chbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chbmv.Tpo -c -o libcblas_a-cblas_chbmv.obj `if test -f 'CBLAS/src/cblas_chbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chbmv.Tpo $(DEPDIR)/libcblas_a-cblas_chbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chbmv.c' object='libcblas_a-cblas_chbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chbmv.obj `if test -f 'CBLAS/src/cblas_chbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chbmv.c'; fi` libcblas_a-cblas_dspr.o: CBLAS/src/cblas_dspr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dspr.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dspr.Tpo -c -o libcblas_a-cblas_dspr.o `test -f 'CBLAS/src/cblas_dspr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dspr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dspr.Tpo $(DEPDIR)/libcblas_a-cblas_dspr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dspr.c' object='libcblas_a-cblas_dspr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dspr.o `test -f 'CBLAS/src/cblas_dspr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dspr.c libcblas_a-cblas_dspr.obj: CBLAS/src/cblas_dspr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dspr.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dspr.Tpo -c -o libcblas_a-cblas_dspr.obj `if test -f 'CBLAS/src/cblas_dspr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dspr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dspr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dspr.Tpo $(DEPDIR)/libcblas_a-cblas_dspr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dspr.c' object='libcblas_a-cblas_dspr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dspr.obj `if test -f 'CBLAS/src/cblas_dspr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dspr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dspr.c'; fi` libcblas_a-cblas_sscal.o: CBLAS/src/cblas_sscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sscal.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sscal.Tpo -c -o libcblas_a-cblas_sscal.o `test -f 'CBLAS/src/cblas_sscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sscal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sscal.Tpo $(DEPDIR)/libcblas_a-cblas_sscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sscal.c' object='libcblas_a-cblas_sscal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sscal.o `test -f 'CBLAS/src/cblas_sscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sscal.c libcblas_a-cblas_sscal.obj: CBLAS/src/cblas_sscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sscal.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sscal.Tpo -c -o libcblas_a-cblas_sscal.obj `if test -f 'CBLAS/src/cblas_sscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sscal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sscal.Tpo $(DEPDIR)/libcblas_a-cblas_sscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sscal.c' object='libcblas_a-cblas_sscal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sscal.obj `if test -f 'CBLAS/src/cblas_sscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sscal.c'; fi` libcblas_a-cblas_zsymm.o: CBLAS/src/cblas_zsymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zsymm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zsymm.Tpo -c -o libcblas_a-cblas_zsymm.o `test -f 'CBLAS/src/cblas_zsymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zsymm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zsymm.Tpo $(DEPDIR)/libcblas_a-cblas_zsymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zsymm.c' object='libcblas_a-cblas_zsymm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zsymm.o `test -f 'CBLAS/src/cblas_zsymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zsymm.c libcblas_a-cblas_zsymm.obj: CBLAS/src/cblas_zsymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zsymm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zsymm.Tpo -c -o libcblas_a-cblas_zsymm.obj `if test -f 'CBLAS/src/cblas_zsymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zsymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zsymm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zsymm.Tpo $(DEPDIR)/libcblas_a-cblas_zsymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zsymm.c' object='libcblas_a-cblas_zsymm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zsymm.obj `if test -f 'CBLAS/src/cblas_zsymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zsymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zsymm.c'; fi` libcblas_a-cblas_chemm.o: CBLAS/src/cblas_chemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chemm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chemm.Tpo -c -o libcblas_a-cblas_chemm.o `test -f 'CBLAS/src/cblas_chemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chemm.Tpo $(DEPDIR)/libcblas_a-cblas_chemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chemm.c' object='libcblas_a-cblas_chemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chemm.o `test -f 'CBLAS/src/cblas_chemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chemm.c libcblas_a-cblas_chemm.obj: CBLAS/src/cblas_chemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chemm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chemm.Tpo -c -o libcblas_a-cblas_chemm.obj `if test -f 'CBLAS/src/cblas_chemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chemm.Tpo $(DEPDIR)/libcblas_a-cblas_chemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chemm.c' object='libcblas_a-cblas_chemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chemm.obj `if test -f 'CBLAS/src/cblas_chemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chemm.c'; fi` libcblas_a-cblas_dswap.o: CBLAS/src/cblas_dswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dswap.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dswap.Tpo -c -o libcblas_a-cblas_dswap.o `test -f 'CBLAS/src/cblas_dswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dswap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dswap.Tpo $(DEPDIR)/libcblas_a-cblas_dswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dswap.c' object='libcblas_a-cblas_dswap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dswap.o `test -f 'CBLAS/src/cblas_dswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dswap.c libcblas_a-cblas_dswap.obj: CBLAS/src/cblas_dswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dswap.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dswap.Tpo -c -o libcblas_a-cblas_dswap.obj `if test -f 'CBLAS/src/cblas_dswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dswap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dswap.Tpo $(DEPDIR)/libcblas_a-cblas_dswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dswap.c' object='libcblas_a-cblas_dswap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dswap.obj `if test -f 'CBLAS/src/cblas_dswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dswap.c'; fi` libcblas_a-cblas_sspmv.o: CBLAS/src/cblas_sspmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sspmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sspmv.Tpo -c -o libcblas_a-cblas_sspmv.o `test -f 'CBLAS/src/cblas_sspmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sspmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sspmv.Tpo $(DEPDIR)/libcblas_a-cblas_sspmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sspmv.c' object='libcblas_a-cblas_sspmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sspmv.o `test -f 'CBLAS/src/cblas_sspmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sspmv.c libcblas_a-cblas_sspmv.obj: CBLAS/src/cblas_sspmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sspmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sspmv.Tpo -c -o libcblas_a-cblas_sspmv.obj `if test -f 'CBLAS/src/cblas_sspmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sspmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sspmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sspmv.Tpo $(DEPDIR)/libcblas_a-cblas_sspmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sspmv.c' object='libcblas_a-cblas_sspmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sspmv.obj `if test -f 'CBLAS/src/cblas_sspmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sspmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sspmv.c'; fi` libcblas_a-cblas_zsyr2k.o: CBLAS/src/cblas_zsyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zsyr2k.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zsyr2k.Tpo -c -o libcblas_a-cblas_zsyr2k.o `test -f 'CBLAS/src/cblas_zsyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zsyr2k.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zsyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_zsyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zsyr2k.c' object='libcblas_a-cblas_zsyr2k.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zsyr2k.o `test -f 'CBLAS/src/cblas_zsyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zsyr2k.c libcblas_a-cblas_zsyr2k.obj: CBLAS/src/cblas_zsyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zsyr2k.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zsyr2k.Tpo -c -o libcblas_a-cblas_zsyr2k.obj `if test -f 'CBLAS/src/cblas_zsyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zsyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zsyr2k.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zsyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_zsyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zsyr2k.c' object='libcblas_a-cblas_zsyr2k.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zsyr2k.obj `if test -f 'CBLAS/src/cblas_zsyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zsyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zsyr2k.c'; fi` libcblas_a-cblas_chemv.o: CBLAS/src/cblas_chemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chemv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chemv.Tpo -c -o libcblas_a-cblas_chemv.o `test -f 'CBLAS/src/cblas_chemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chemv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chemv.Tpo $(DEPDIR)/libcblas_a-cblas_chemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chemv.c' object='libcblas_a-cblas_chemv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chemv.o `test -f 'CBLAS/src/cblas_chemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chemv.c libcblas_a-cblas_chemv.obj: CBLAS/src/cblas_chemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chemv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chemv.Tpo -c -o libcblas_a-cblas_chemv.obj `if test -f 'CBLAS/src/cblas_chemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chemv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chemv.Tpo $(DEPDIR)/libcblas_a-cblas_chemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chemv.c' object='libcblas_a-cblas_chemv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chemv.obj `if test -f 'CBLAS/src/cblas_chemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chemv.c'; fi` libcblas_a-cblas_dsymm.o: CBLAS/src/cblas_dsymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsymm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsymm.Tpo -c -o libcblas_a-cblas_dsymm.o `test -f 'CBLAS/src/cblas_dsymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsymm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsymm.Tpo $(DEPDIR)/libcblas_a-cblas_dsymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsymm.c' object='libcblas_a-cblas_dsymm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsymm.o `test -f 'CBLAS/src/cblas_dsymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsymm.c libcblas_a-cblas_dsymm.obj: CBLAS/src/cblas_dsymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsymm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsymm.Tpo -c -o libcblas_a-cblas_dsymm.obj `if test -f 'CBLAS/src/cblas_dsymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsymm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsymm.Tpo $(DEPDIR)/libcblas_a-cblas_dsymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsymm.c' object='libcblas_a-cblas_dsymm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsymm.obj `if test -f 'CBLAS/src/cblas_dsymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsymm.c'; fi` libcblas_a-cblas_sspr2.o: CBLAS/src/cblas_sspr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sspr2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sspr2.Tpo -c -o libcblas_a-cblas_sspr2.o `test -f 'CBLAS/src/cblas_sspr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sspr2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sspr2.Tpo $(DEPDIR)/libcblas_a-cblas_sspr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sspr2.c' object='libcblas_a-cblas_sspr2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sspr2.o `test -f 'CBLAS/src/cblas_sspr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sspr2.c libcblas_a-cblas_sspr2.obj: CBLAS/src/cblas_sspr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sspr2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sspr2.Tpo -c -o libcblas_a-cblas_sspr2.obj `if test -f 'CBLAS/src/cblas_sspr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sspr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sspr2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sspr2.Tpo $(DEPDIR)/libcblas_a-cblas_sspr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sspr2.c' object='libcblas_a-cblas_sspr2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sspr2.obj `if test -f 'CBLAS/src/cblas_sspr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sspr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sspr2.c'; fi` libcblas_a-cblas_zsyrk.o: CBLAS/src/cblas_zsyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zsyrk.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zsyrk.Tpo -c -o libcblas_a-cblas_zsyrk.o `test -f 'CBLAS/src/cblas_zsyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zsyrk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zsyrk.Tpo $(DEPDIR)/libcblas_a-cblas_zsyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zsyrk.c' object='libcblas_a-cblas_zsyrk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zsyrk.o `test -f 'CBLAS/src/cblas_zsyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zsyrk.c libcblas_a-cblas_zsyrk.obj: CBLAS/src/cblas_zsyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zsyrk.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zsyrk.Tpo -c -o libcblas_a-cblas_zsyrk.obj `if test -f 'CBLAS/src/cblas_zsyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zsyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zsyrk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zsyrk.Tpo $(DEPDIR)/libcblas_a-cblas_zsyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zsyrk.c' object='libcblas_a-cblas_zsyrk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zsyrk.obj `if test -f 'CBLAS/src/cblas_zsyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zsyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zsyrk.c'; fi` libcblas_a-cblas_cher2.o: CBLAS/src/cblas_cher2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cher2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cher2.Tpo -c -o libcblas_a-cblas_cher2.o `test -f 'CBLAS/src/cblas_cher2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cher2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cher2.Tpo $(DEPDIR)/libcblas_a-cblas_cher2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cher2.c' object='libcblas_a-cblas_cher2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cher2.o `test -f 'CBLAS/src/cblas_cher2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cher2.c libcblas_a-cblas_cher2.obj: CBLAS/src/cblas_cher2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cher2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cher2.Tpo -c -o libcblas_a-cblas_cher2.obj `if test -f 'CBLAS/src/cblas_cher2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cher2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cher2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cher2.Tpo $(DEPDIR)/libcblas_a-cblas_cher2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cher2.c' object='libcblas_a-cblas_cher2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cher2.obj `if test -f 'CBLAS/src/cblas_cher2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cher2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cher2.c'; fi` libcblas_a-cblas_dsymv.o: CBLAS/src/cblas_dsymv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsymv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsymv.Tpo -c -o libcblas_a-cblas_dsymv.o `test -f 'CBLAS/src/cblas_dsymv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsymv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsymv.Tpo $(DEPDIR)/libcblas_a-cblas_dsymv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsymv.c' object='libcblas_a-cblas_dsymv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsymv.o `test -f 'CBLAS/src/cblas_dsymv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsymv.c libcblas_a-cblas_dsymv.obj: CBLAS/src/cblas_dsymv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsymv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsymv.Tpo -c -o libcblas_a-cblas_dsymv.obj `if test -f 'CBLAS/src/cblas_dsymv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsymv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsymv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsymv.Tpo $(DEPDIR)/libcblas_a-cblas_dsymv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsymv.c' object='libcblas_a-cblas_dsymv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsymv.obj `if test -f 'CBLAS/src/cblas_dsymv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsymv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsymv.c'; fi` libcblas_a-cblas_sspr.o: CBLAS/src/cblas_sspr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sspr.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sspr.Tpo -c -o libcblas_a-cblas_sspr.o `test -f 'CBLAS/src/cblas_sspr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sspr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sspr.Tpo $(DEPDIR)/libcblas_a-cblas_sspr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sspr.c' object='libcblas_a-cblas_sspr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sspr.o `test -f 'CBLAS/src/cblas_sspr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sspr.c libcblas_a-cblas_sspr.obj: CBLAS/src/cblas_sspr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sspr.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sspr.Tpo -c -o libcblas_a-cblas_sspr.obj `if test -f 'CBLAS/src/cblas_sspr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sspr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sspr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sspr.Tpo $(DEPDIR)/libcblas_a-cblas_sspr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sspr.c' object='libcblas_a-cblas_sspr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sspr.obj `if test -f 'CBLAS/src/cblas_sspr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sspr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sspr.c'; fi` libcblas_a-cblas_ztbmv.o: CBLAS/src/cblas_ztbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztbmv.Tpo -c -o libcblas_a-cblas_ztbmv.o `test -f 'CBLAS/src/cblas_ztbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztbmv.Tpo $(DEPDIR)/libcblas_a-cblas_ztbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztbmv.c' object='libcblas_a-cblas_ztbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztbmv.o `test -f 'CBLAS/src/cblas_ztbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztbmv.c libcblas_a-cblas_ztbmv.obj: CBLAS/src/cblas_ztbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztbmv.Tpo -c -o libcblas_a-cblas_ztbmv.obj `if test -f 'CBLAS/src/cblas_ztbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztbmv.Tpo $(DEPDIR)/libcblas_a-cblas_ztbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztbmv.c' object='libcblas_a-cblas_ztbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztbmv.obj `if test -f 'CBLAS/src/cblas_ztbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztbmv.c'; fi` libcblas_a-cblas_cher2k.o: CBLAS/src/cblas_cher2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cher2k.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cher2k.Tpo -c -o libcblas_a-cblas_cher2k.o `test -f 'CBLAS/src/cblas_cher2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cher2k.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cher2k.Tpo $(DEPDIR)/libcblas_a-cblas_cher2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cher2k.c' object='libcblas_a-cblas_cher2k.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cher2k.o `test -f 'CBLAS/src/cblas_cher2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cher2k.c libcblas_a-cblas_cher2k.obj: CBLAS/src/cblas_cher2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cher2k.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cher2k.Tpo -c -o libcblas_a-cblas_cher2k.obj `if test -f 'CBLAS/src/cblas_cher2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cher2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cher2k.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cher2k.Tpo $(DEPDIR)/libcblas_a-cblas_cher2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cher2k.c' object='libcblas_a-cblas_cher2k.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cher2k.obj `if test -f 'CBLAS/src/cblas_cher2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cher2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cher2k.c'; fi` libcblas_a-cblas_dsyr2.o: CBLAS/src/cblas_dsyr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyr2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyr2.Tpo -c -o libcblas_a-cblas_dsyr2.o `test -f 'CBLAS/src/cblas_dsyr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyr2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyr2.Tpo $(DEPDIR)/libcblas_a-cblas_dsyr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyr2.c' object='libcblas_a-cblas_dsyr2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyr2.o `test -f 'CBLAS/src/cblas_dsyr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyr2.c libcblas_a-cblas_dsyr2.obj: CBLAS/src/cblas_dsyr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyr2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyr2.Tpo -c -o libcblas_a-cblas_dsyr2.obj `if test -f 'CBLAS/src/cblas_dsyr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyr2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyr2.Tpo $(DEPDIR)/libcblas_a-cblas_dsyr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyr2.c' object='libcblas_a-cblas_dsyr2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyr2.obj `if test -f 'CBLAS/src/cblas_dsyr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyr2.c'; fi` libcblas_a-cblas_sswap.o: CBLAS/src/cblas_sswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sswap.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sswap.Tpo -c -o libcblas_a-cblas_sswap.o `test -f 'CBLAS/src/cblas_sswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sswap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sswap.Tpo $(DEPDIR)/libcblas_a-cblas_sswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sswap.c' object='libcblas_a-cblas_sswap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sswap.o `test -f 'CBLAS/src/cblas_sswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sswap.c libcblas_a-cblas_sswap.obj: CBLAS/src/cblas_sswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sswap.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sswap.Tpo -c -o libcblas_a-cblas_sswap.obj `if test -f 'CBLAS/src/cblas_sswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sswap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sswap.Tpo $(DEPDIR)/libcblas_a-cblas_sswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sswap.c' object='libcblas_a-cblas_sswap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sswap.obj `if test -f 'CBLAS/src/cblas_sswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sswap.c'; fi` libcblas_a-cblas_ztbsv.o: CBLAS/src/cblas_ztbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztbsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztbsv.Tpo -c -o libcblas_a-cblas_ztbsv.o `test -f 'CBLAS/src/cblas_ztbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztbsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztbsv.Tpo $(DEPDIR)/libcblas_a-cblas_ztbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztbsv.c' object='libcblas_a-cblas_ztbsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztbsv.o `test -f 'CBLAS/src/cblas_ztbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztbsv.c libcblas_a-cblas_ztbsv.obj: CBLAS/src/cblas_ztbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztbsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztbsv.Tpo -c -o libcblas_a-cblas_ztbsv.obj `if test -f 'CBLAS/src/cblas_ztbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztbsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztbsv.Tpo $(DEPDIR)/libcblas_a-cblas_ztbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztbsv.c' object='libcblas_a-cblas_ztbsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztbsv.obj `if test -f 'CBLAS/src/cblas_ztbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztbsv.c'; fi` libcblas_a-cblas_cher.o: CBLAS/src/cblas_cher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cher.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cher.Tpo -c -o libcblas_a-cblas_cher.o `test -f 'CBLAS/src/cblas_cher.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cher.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cher.Tpo $(DEPDIR)/libcblas_a-cblas_cher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cher.c' object='libcblas_a-cblas_cher.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cher.o `test -f 'CBLAS/src/cblas_cher.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cher.c libcblas_a-cblas_cher.obj: CBLAS/src/cblas_cher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cher.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cher.Tpo -c -o libcblas_a-cblas_cher.obj `if test -f 'CBLAS/src/cblas_cher.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cher.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cher.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cher.Tpo $(DEPDIR)/libcblas_a-cblas_cher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cher.c' object='libcblas_a-cblas_cher.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cher.obj `if test -f 'CBLAS/src/cblas_cher.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cher.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cher.c'; fi` libcblas_a-cblas_dsyr2k.o: CBLAS/src/cblas_dsyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyr2k.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyr2k.Tpo -c -o libcblas_a-cblas_dsyr2k.o `test -f 'CBLAS/src/cblas_dsyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyr2k.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_dsyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyr2k.c' object='libcblas_a-cblas_dsyr2k.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyr2k.o `test -f 'CBLAS/src/cblas_dsyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyr2k.c libcblas_a-cblas_dsyr2k.obj: CBLAS/src/cblas_dsyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyr2k.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyr2k.Tpo -c -o libcblas_a-cblas_dsyr2k.obj `if test -f 'CBLAS/src/cblas_dsyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyr2k.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_dsyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyr2k.c' object='libcblas_a-cblas_dsyr2k.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyr2k.obj `if test -f 'CBLAS/src/cblas_dsyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyr2k.c'; fi` libcblas_a-cblas_ssymm.o: CBLAS/src/cblas_ssymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssymm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssymm.Tpo -c -o libcblas_a-cblas_ssymm.o `test -f 'CBLAS/src/cblas_ssymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssymm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssymm.Tpo $(DEPDIR)/libcblas_a-cblas_ssymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssymm.c' object='libcblas_a-cblas_ssymm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssymm.o `test -f 'CBLAS/src/cblas_ssymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssymm.c libcblas_a-cblas_ssymm.obj: CBLAS/src/cblas_ssymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssymm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssymm.Tpo -c -o libcblas_a-cblas_ssymm.obj `if test -f 'CBLAS/src/cblas_ssymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssymm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssymm.Tpo $(DEPDIR)/libcblas_a-cblas_ssymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssymm.c' object='libcblas_a-cblas_ssymm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssymm.obj `if test -f 'CBLAS/src/cblas_ssymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssymm.c'; fi` libcblas_a-cblas_ztpmv.o: CBLAS/src/cblas_ztpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztpmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztpmv.Tpo -c -o libcblas_a-cblas_ztpmv.o `test -f 'CBLAS/src/cblas_ztpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztpmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztpmv.Tpo $(DEPDIR)/libcblas_a-cblas_ztpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztpmv.c' object='libcblas_a-cblas_ztpmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztpmv.o `test -f 'CBLAS/src/cblas_ztpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztpmv.c libcblas_a-cblas_ztpmv.obj: CBLAS/src/cblas_ztpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztpmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztpmv.Tpo -c -o libcblas_a-cblas_ztpmv.obj `if test -f 'CBLAS/src/cblas_ztpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztpmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztpmv.Tpo $(DEPDIR)/libcblas_a-cblas_ztpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztpmv.c' object='libcblas_a-cblas_ztpmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztpmv.obj `if test -f 'CBLAS/src/cblas_ztpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztpmv.c'; fi` libcblas_a-cblas_cherk.o: CBLAS/src/cblas_cherk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cherk.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cherk.Tpo -c -o libcblas_a-cblas_cherk.o `test -f 'CBLAS/src/cblas_cherk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cherk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cherk.Tpo $(DEPDIR)/libcblas_a-cblas_cherk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cherk.c' object='libcblas_a-cblas_cherk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cherk.o `test -f 'CBLAS/src/cblas_cherk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cherk.c libcblas_a-cblas_cherk.obj: CBLAS/src/cblas_cherk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cherk.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cherk.Tpo -c -o libcblas_a-cblas_cherk.obj `if test -f 'CBLAS/src/cblas_cherk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cherk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cherk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cherk.Tpo $(DEPDIR)/libcblas_a-cblas_cherk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cherk.c' object='libcblas_a-cblas_cherk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cherk.obj `if test -f 'CBLAS/src/cblas_cherk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cherk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cherk.c'; fi` libcblas_a-cblas_dsyr.o: CBLAS/src/cblas_dsyr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyr.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyr.Tpo -c -o libcblas_a-cblas_dsyr.o `test -f 'CBLAS/src/cblas_dsyr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyr.Tpo $(DEPDIR)/libcblas_a-cblas_dsyr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyr.c' object='libcblas_a-cblas_dsyr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyr.o `test -f 'CBLAS/src/cblas_dsyr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyr.c libcblas_a-cblas_dsyr.obj: CBLAS/src/cblas_dsyr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyr.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyr.Tpo -c -o libcblas_a-cblas_dsyr.obj `if test -f 'CBLAS/src/cblas_dsyr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyr.Tpo $(DEPDIR)/libcblas_a-cblas_dsyr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyr.c' object='libcblas_a-cblas_dsyr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyr.obj `if test -f 'CBLAS/src/cblas_dsyr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyr.c'; fi` libcblas_a-cblas_ssymv.o: CBLAS/src/cblas_ssymv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssymv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssymv.Tpo -c -o libcblas_a-cblas_ssymv.o `test -f 'CBLAS/src/cblas_ssymv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssymv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssymv.Tpo $(DEPDIR)/libcblas_a-cblas_ssymv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssymv.c' object='libcblas_a-cblas_ssymv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssymv.o `test -f 'CBLAS/src/cblas_ssymv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssymv.c libcblas_a-cblas_ssymv.obj: CBLAS/src/cblas_ssymv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssymv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssymv.Tpo -c -o libcblas_a-cblas_ssymv.obj `if test -f 'CBLAS/src/cblas_ssymv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssymv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssymv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssymv.Tpo $(DEPDIR)/libcblas_a-cblas_ssymv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssymv.c' object='libcblas_a-cblas_ssymv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssymv.obj `if test -f 'CBLAS/src/cblas_ssymv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssymv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssymv.c'; fi` libcblas_a-cblas_ztpsv.o: CBLAS/src/cblas_ztpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztpsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztpsv.Tpo -c -o libcblas_a-cblas_ztpsv.o `test -f 'CBLAS/src/cblas_ztpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztpsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztpsv.Tpo $(DEPDIR)/libcblas_a-cblas_ztpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztpsv.c' object='libcblas_a-cblas_ztpsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztpsv.o `test -f 'CBLAS/src/cblas_ztpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztpsv.c libcblas_a-cblas_ztpsv.obj: CBLAS/src/cblas_ztpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztpsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztpsv.Tpo -c -o libcblas_a-cblas_ztpsv.obj `if test -f 'CBLAS/src/cblas_ztpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztpsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztpsv.Tpo $(DEPDIR)/libcblas_a-cblas_ztpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztpsv.c' object='libcblas_a-cblas_ztpsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztpsv.obj `if test -f 'CBLAS/src/cblas_ztpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztpsv.c'; fi` libcblas_a-cblas_chpmv.o: CBLAS/src/cblas_chpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chpmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chpmv.Tpo -c -o libcblas_a-cblas_chpmv.o `test -f 'CBLAS/src/cblas_chpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chpmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chpmv.Tpo $(DEPDIR)/libcblas_a-cblas_chpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chpmv.c' object='libcblas_a-cblas_chpmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chpmv.o `test -f 'CBLAS/src/cblas_chpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chpmv.c libcblas_a-cblas_chpmv.obj: CBLAS/src/cblas_chpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chpmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chpmv.Tpo -c -o libcblas_a-cblas_chpmv.obj `if test -f 'CBLAS/src/cblas_chpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chpmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chpmv.Tpo $(DEPDIR)/libcblas_a-cblas_chpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chpmv.c' object='libcblas_a-cblas_chpmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chpmv.obj `if test -f 'CBLAS/src/cblas_chpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chpmv.c'; fi` libcblas_a-cblas_dsyrk.o: CBLAS/src/cblas_dsyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyrk.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyrk.Tpo -c -o libcblas_a-cblas_dsyrk.o `test -f 'CBLAS/src/cblas_dsyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyrk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyrk.Tpo $(DEPDIR)/libcblas_a-cblas_dsyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyrk.c' object='libcblas_a-cblas_dsyrk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyrk.o `test -f 'CBLAS/src/cblas_dsyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dsyrk.c libcblas_a-cblas_dsyrk.obj: CBLAS/src/cblas_dsyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dsyrk.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dsyrk.Tpo -c -o libcblas_a-cblas_dsyrk.obj `if test -f 'CBLAS/src/cblas_dsyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyrk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dsyrk.Tpo $(DEPDIR)/libcblas_a-cblas_dsyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dsyrk.c' object='libcblas_a-cblas_dsyrk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dsyrk.obj `if test -f 'CBLAS/src/cblas_dsyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dsyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dsyrk.c'; fi` libcblas_a-cblas_ssyr2.o: CBLAS/src/cblas_ssyr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyr2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyr2.Tpo -c -o libcblas_a-cblas_ssyr2.o `test -f 'CBLAS/src/cblas_ssyr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyr2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyr2.Tpo $(DEPDIR)/libcblas_a-cblas_ssyr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyr2.c' object='libcblas_a-cblas_ssyr2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyr2.o `test -f 'CBLAS/src/cblas_ssyr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyr2.c libcblas_a-cblas_ssyr2.obj: CBLAS/src/cblas_ssyr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyr2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyr2.Tpo -c -o libcblas_a-cblas_ssyr2.obj `if test -f 'CBLAS/src/cblas_ssyr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyr2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyr2.Tpo $(DEPDIR)/libcblas_a-cblas_ssyr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyr2.c' object='libcblas_a-cblas_ssyr2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyr2.obj `if test -f 'CBLAS/src/cblas_ssyr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyr2.c'; fi` libcblas_a-cblas_ztrmm.o: CBLAS/src/cblas_ztrmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrmm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrmm.Tpo -c -o libcblas_a-cblas_ztrmm.o `test -f 'CBLAS/src/cblas_ztrmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrmm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrmm.Tpo $(DEPDIR)/libcblas_a-cblas_ztrmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrmm.c' object='libcblas_a-cblas_ztrmm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrmm.o `test -f 'CBLAS/src/cblas_ztrmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrmm.c libcblas_a-cblas_ztrmm.obj: CBLAS/src/cblas_ztrmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrmm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrmm.Tpo -c -o libcblas_a-cblas_ztrmm.obj `if test -f 'CBLAS/src/cblas_ztrmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrmm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrmm.Tpo $(DEPDIR)/libcblas_a-cblas_ztrmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrmm.c' object='libcblas_a-cblas_ztrmm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrmm.obj `if test -f 'CBLAS/src/cblas_ztrmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrmm.c'; fi` libcblas_a-cblas_chpr2.o: CBLAS/src/cblas_chpr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chpr2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chpr2.Tpo -c -o libcblas_a-cblas_chpr2.o `test -f 'CBLAS/src/cblas_chpr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chpr2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chpr2.Tpo $(DEPDIR)/libcblas_a-cblas_chpr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chpr2.c' object='libcblas_a-cblas_chpr2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chpr2.o `test -f 'CBLAS/src/cblas_chpr2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chpr2.c libcblas_a-cblas_chpr2.obj: CBLAS/src/cblas_chpr2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chpr2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chpr2.Tpo -c -o libcblas_a-cblas_chpr2.obj `if test -f 'CBLAS/src/cblas_chpr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chpr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chpr2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chpr2.Tpo $(DEPDIR)/libcblas_a-cblas_chpr2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chpr2.c' object='libcblas_a-cblas_chpr2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chpr2.obj `if test -f 'CBLAS/src/cblas_chpr2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chpr2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chpr2.c'; fi` libcblas_a-cblas_dtbmv.o: CBLAS/src/cblas_dtbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtbmv.Tpo -c -o libcblas_a-cblas_dtbmv.o `test -f 'CBLAS/src/cblas_dtbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtbmv.Tpo $(DEPDIR)/libcblas_a-cblas_dtbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtbmv.c' object='libcblas_a-cblas_dtbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtbmv.o `test -f 'CBLAS/src/cblas_dtbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtbmv.c libcblas_a-cblas_dtbmv.obj: CBLAS/src/cblas_dtbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtbmv.Tpo -c -o libcblas_a-cblas_dtbmv.obj `if test -f 'CBLAS/src/cblas_dtbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtbmv.Tpo $(DEPDIR)/libcblas_a-cblas_dtbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtbmv.c' object='libcblas_a-cblas_dtbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtbmv.obj `if test -f 'CBLAS/src/cblas_dtbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtbmv.c'; fi` libcblas_a-cblas_ssyr2k.o: CBLAS/src/cblas_ssyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyr2k.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyr2k.Tpo -c -o libcblas_a-cblas_ssyr2k.o `test -f 'CBLAS/src/cblas_ssyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyr2k.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_ssyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyr2k.c' object='libcblas_a-cblas_ssyr2k.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyr2k.o `test -f 'CBLAS/src/cblas_ssyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyr2k.c libcblas_a-cblas_ssyr2k.obj: CBLAS/src/cblas_ssyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyr2k.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyr2k.Tpo -c -o libcblas_a-cblas_ssyr2k.obj `if test -f 'CBLAS/src/cblas_ssyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyr2k.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_ssyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyr2k.c' object='libcblas_a-cblas_ssyr2k.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyr2k.obj `if test -f 'CBLAS/src/cblas_ssyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyr2k.c'; fi` libcblas_a-cblas_ztrmv.o: CBLAS/src/cblas_ztrmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrmv.Tpo -c -o libcblas_a-cblas_ztrmv.o `test -f 'CBLAS/src/cblas_ztrmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrmv.Tpo $(DEPDIR)/libcblas_a-cblas_ztrmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrmv.c' object='libcblas_a-cblas_ztrmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrmv.o `test -f 'CBLAS/src/cblas_ztrmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrmv.c libcblas_a-cblas_ztrmv.obj: CBLAS/src/cblas_ztrmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrmv.Tpo -c -o libcblas_a-cblas_ztrmv.obj `if test -f 'CBLAS/src/cblas_ztrmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrmv.Tpo $(DEPDIR)/libcblas_a-cblas_ztrmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrmv.c' object='libcblas_a-cblas_ztrmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrmv.obj `if test -f 'CBLAS/src/cblas_ztrmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrmv.c'; fi` libcblas_a-cblas_chpr.o: CBLAS/src/cblas_chpr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chpr.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chpr.Tpo -c -o libcblas_a-cblas_chpr.o `test -f 'CBLAS/src/cblas_chpr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chpr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chpr.Tpo $(DEPDIR)/libcblas_a-cblas_chpr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chpr.c' object='libcblas_a-cblas_chpr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chpr.o `test -f 'CBLAS/src/cblas_chpr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_chpr.c libcblas_a-cblas_chpr.obj: CBLAS/src/cblas_chpr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_chpr.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_chpr.Tpo -c -o libcblas_a-cblas_chpr.obj `if test -f 'CBLAS/src/cblas_chpr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chpr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chpr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_chpr.Tpo $(DEPDIR)/libcblas_a-cblas_chpr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_chpr.c' object='libcblas_a-cblas_chpr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_chpr.obj `if test -f 'CBLAS/src/cblas_chpr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_chpr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_chpr.c'; fi` libcblas_a-cblas_dtbsv.o: CBLAS/src/cblas_dtbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtbsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtbsv.Tpo -c -o libcblas_a-cblas_dtbsv.o `test -f 'CBLAS/src/cblas_dtbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtbsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtbsv.Tpo $(DEPDIR)/libcblas_a-cblas_dtbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtbsv.c' object='libcblas_a-cblas_dtbsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtbsv.o `test -f 'CBLAS/src/cblas_dtbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtbsv.c libcblas_a-cblas_dtbsv.obj: CBLAS/src/cblas_dtbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtbsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtbsv.Tpo -c -o libcblas_a-cblas_dtbsv.obj `if test -f 'CBLAS/src/cblas_dtbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtbsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtbsv.Tpo $(DEPDIR)/libcblas_a-cblas_dtbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtbsv.c' object='libcblas_a-cblas_dtbsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtbsv.obj `if test -f 'CBLAS/src/cblas_dtbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtbsv.c'; fi` libcblas_a-cblas_ssyr.o: CBLAS/src/cblas_ssyr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyr.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyr.Tpo -c -o libcblas_a-cblas_ssyr.o `test -f 'CBLAS/src/cblas_ssyr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyr.Tpo $(DEPDIR)/libcblas_a-cblas_ssyr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyr.c' object='libcblas_a-cblas_ssyr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyr.o `test -f 'CBLAS/src/cblas_ssyr.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyr.c libcblas_a-cblas_ssyr.obj: CBLAS/src/cblas_ssyr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyr.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyr.Tpo -c -o libcblas_a-cblas_ssyr.obj `if test -f 'CBLAS/src/cblas_ssyr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyr.Tpo $(DEPDIR)/libcblas_a-cblas_ssyr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyr.c' object='libcblas_a-cblas_ssyr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyr.obj `if test -f 'CBLAS/src/cblas_ssyr.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyr.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyr.c'; fi` libcblas_a-cblas_ztrsm.o: CBLAS/src/cblas_ztrsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrsm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrsm.Tpo -c -o libcblas_a-cblas_ztrsm.o `test -f 'CBLAS/src/cblas_ztrsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrsm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrsm.Tpo $(DEPDIR)/libcblas_a-cblas_ztrsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrsm.c' object='libcblas_a-cblas_ztrsm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrsm.o `test -f 'CBLAS/src/cblas_ztrsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrsm.c libcblas_a-cblas_ztrsm.obj: CBLAS/src/cblas_ztrsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrsm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrsm.Tpo -c -o libcblas_a-cblas_ztrsm.obj `if test -f 'CBLAS/src/cblas_ztrsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrsm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrsm.Tpo $(DEPDIR)/libcblas_a-cblas_ztrsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrsm.c' object='libcblas_a-cblas_ztrsm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrsm.obj `if test -f 'CBLAS/src/cblas_ztrsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrsm.c'; fi` libcblas_a-cblas_cscal.o: CBLAS/src/cblas_cscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cscal.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cscal.Tpo -c -o libcblas_a-cblas_cscal.o `test -f 'CBLAS/src/cblas_cscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cscal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cscal.Tpo $(DEPDIR)/libcblas_a-cblas_cscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cscal.c' object='libcblas_a-cblas_cscal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cscal.o `test -f 'CBLAS/src/cblas_cscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cscal.c libcblas_a-cblas_cscal.obj: CBLAS/src/cblas_cscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cscal.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cscal.Tpo -c -o libcblas_a-cblas_cscal.obj `if test -f 'CBLAS/src/cblas_cscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cscal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cscal.Tpo $(DEPDIR)/libcblas_a-cblas_cscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cscal.c' object='libcblas_a-cblas_cscal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cscal.obj `if test -f 'CBLAS/src/cblas_cscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cscal.c'; fi` libcblas_a-cblas_dtpmv.o: CBLAS/src/cblas_dtpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtpmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtpmv.Tpo -c -o libcblas_a-cblas_dtpmv.o `test -f 'CBLAS/src/cblas_dtpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtpmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtpmv.Tpo $(DEPDIR)/libcblas_a-cblas_dtpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtpmv.c' object='libcblas_a-cblas_dtpmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtpmv.o `test -f 'CBLAS/src/cblas_dtpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtpmv.c libcblas_a-cblas_dtpmv.obj: CBLAS/src/cblas_dtpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtpmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtpmv.Tpo -c -o libcblas_a-cblas_dtpmv.obj `if test -f 'CBLAS/src/cblas_dtpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtpmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtpmv.Tpo $(DEPDIR)/libcblas_a-cblas_dtpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtpmv.c' object='libcblas_a-cblas_dtpmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtpmv.obj `if test -f 'CBLAS/src/cblas_dtpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtpmv.c'; fi` libcblas_a-cblas_ssyrk.o: CBLAS/src/cblas_ssyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyrk.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyrk.Tpo -c -o libcblas_a-cblas_ssyrk.o `test -f 'CBLAS/src/cblas_ssyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyrk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyrk.Tpo $(DEPDIR)/libcblas_a-cblas_ssyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyrk.c' object='libcblas_a-cblas_ssyrk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyrk.o `test -f 'CBLAS/src/cblas_ssyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ssyrk.c libcblas_a-cblas_ssyrk.obj: CBLAS/src/cblas_ssyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ssyrk.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ssyrk.Tpo -c -o libcblas_a-cblas_ssyrk.obj `if test -f 'CBLAS/src/cblas_ssyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyrk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ssyrk.Tpo $(DEPDIR)/libcblas_a-cblas_ssyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ssyrk.c' object='libcblas_a-cblas_ssyrk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ssyrk.obj `if test -f 'CBLAS/src/cblas_ssyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ssyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ssyrk.c'; fi` libcblas_a-cblas_ztrsv.o: CBLAS/src/cblas_ztrsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrsv.Tpo -c -o libcblas_a-cblas_ztrsv.o `test -f 'CBLAS/src/cblas_ztrsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrsv.Tpo $(DEPDIR)/libcblas_a-cblas_ztrsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrsv.c' object='libcblas_a-cblas_ztrsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrsv.o `test -f 'CBLAS/src/cblas_ztrsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ztrsv.c libcblas_a-cblas_ztrsv.obj: CBLAS/src/cblas_ztrsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ztrsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ztrsv.Tpo -c -o libcblas_a-cblas_ztrsv.obj `if test -f 'CBLAS/src/cblas_ztrsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ztrsv.Tpo $(DEPDIR)/libcblas_a-cblas_ztrsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ztrsv.c' object='libcblas_a-cblas_ztrsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ztrsv.obj `if test -f 'CBLAS/src/cblas_ztrsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ztrsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ztrsv.c'; fi` libcblas_a-cblas_csscal.o: CBLAS/src/cblas_csscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csscal.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csscal.Tpo -c -o libcblas_a-cblas_csscal.o `test -f 'CBLAS/src/cblas_csscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csscal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csscal.Tpo $(DEPDIR)/libcblas_a-cblas_csscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csscal.c' object='libcblas_a-cblas_csscal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csscal.o `test -f 'CBLAS/src/cblas_csscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csscal.c libcblas_a-cblas_csscal.obj: CBLAS/src/cblas_csscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csscal.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csscal.Tpo -c -o libcblas_a-cblas_csscal.obj `if test -f 'CBLAS/src/cblas_csscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csscal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csscal.Tpo $(DEPDIR)/libcblas_a-cblas_csscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csscal.c' object='libcblas_a-cblas_csscal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csscal.obj `if test -f 'CBLAS/src/cblas_csscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csscal.c'; fi` libcblas_a-cblas_dtpsv.o: CBLAS/src/cblas_dtpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtpsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtpsv.Tpo -c -o libcblas_a-cblas_dtpsv.o `test -f 'CBLAS/src/cblas_dtpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtpsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtpsv.Tpo $(DEPDIR)/libcblas_a-cblas_dtpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtpsv.c' object='libcblas_a-cblas_dtpsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtpsv.o `test -f 'CBLAS/src/cblas_dtpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtpsv.c libcblas_a-cblas_dtpsv.obj: CBLAS/src/cblas_dtpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtpsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtpsv.Tpo -c -o libcblas_a-cblas_dtpsv.obj `if test -f 'CBLAS/src/cblas_dtpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtpsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtpsv.Tpo $(DEPDIR)/libcblas_a-cblas_dtpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtpsv.c' object='libcblas_a-cblas_dtpsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtpsv.obj `if test -f 'CBLAS/src/cblas_dtpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtpsv.c'; fi` libcblas_a-cblas_stbmv.o: CBLAS/src/cblas_stbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stbmv.Tpo -c -o libcblas_a-cblas_stbmv.o `test -f 'CBLAS/src/cblas_stbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stbmv.Tpo $(DEPDIR)/libcblas_a-cblas_stbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stbmv.c' object='libcblas_a-cblas_stbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stbmv.o `test -f 'CBLAS/src/cblas_stbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stbmv.c libcblas_a-cblas_stbmv.obj: CBLAS/src/cblas_stbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stbmv.Tpo -c -o libcblas_a-cblas_stbmv.obj `if test -f 'CBLAS/src/cblas_stbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stbmv.Tpo $(DEPDIR)/libcblas_a-cblas_stbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stbmv.c' object='libcblas_a-cblas_stbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stbmv.obj `if test -f 'CBLAS/src/cblas_stbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stbmv.c'; fi` libcblas_a-cblas_cswap.o: CBLAS/src/cblas_cswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cswap.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cswap.Tpo -c -o libcblas_a-cblas_cswap.o `test -f 'CBLAS/src/cblas_cswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cswap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cswap.Tpo $(DEPDIR)/libcblas_a-cblas_cswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cswap.c' object='libcblas_a-cblas_cswap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cswap.o `test -f 'CBLAS/src/cblas_cswap.c' || echo '$(srcdir)/'`CBLAS/src/cblas_cswap.c libcblas_a-cblas_cswap.obj: CBLAS/src/cblas_cswap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_cswap.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_cswap.Tpo -c -o libcblas_a-cblas_cswap.obj `if test -f 'CBLAS/src/cblas_cswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cswap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_cswap.Tpo $(DEPDIR)/libcblas_a-cblas_cswap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_cswap.c' object='libcblas_a-cblas_cswap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_cswap.obj `if test -f 'CBLAS/src/cblas_cswap.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_cswap.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_cswap.c'; fi` libcblas_a-cblas_dtrmm.o: CBLAS/src/cblas_dtrmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrmm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrmm.Tpo -c -o libcblas_a-cblas_dtrmm.o `test -f 'CBLAS/src/cblas_dtrmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrmm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrmm.Tpo $(DEPDIR)/libcblas_a-cblas_dtrmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrmm.c' object='libcblas_a-cblas_dtrmm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrmm.o `test -f 'CBLAS/src/cblas_dtrmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrmm.c libcblas_a-cblas_dtrmm.obj: CBLAS/src/cblas_dtrmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrmm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrmm.Tpo -c -o libcblas_a-cblas_dtrmm.obj `if test -f 'CBLAS/src/cblas_dtrmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrmm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrmm.Tpo $(DEPDIR)/libcblas_a-cblas_dtrmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrmm.c' object='libcblas_a-cblas_dtrmm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrmm.obj `if test -f 'CBLAS/src/cblas_dtrmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrmm.c'; fi` libcblas_a-cblas_stbsv.o: CBLAS/src/cblas_stbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stbsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stbsv.Tpo -c -o libcblas_a-cblas_stbsv.o `test -f 'CBLAS/src/cblas_stbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stbsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stbsv.Tpo $(DEPDIR)/libcblas_a-cblas_stbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stbsv.c' object='libcblas_a-cblas_stbsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stbsv.o `test -f 'CBLAS/src/cblas_stbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stbsv.c libcblas_a-cblas_stbsv.obj: CBLAS/src/cblas_stbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stbsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stbsv.Tpo -c -o libcblas_a-cblas_stbsv.obj `if test -f 'CBLAS/src/cblas_stbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stbsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stbsv.Tpo $(DEPDIR)/libcblas_a-cblas_stbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stbsv.c' object='libcblas_a-cblas_stbsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stbsv.obj `if test -f 'CBLAS/src/cblas_stbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stbsv.c'; fi` libcblas_a-cblas_csymm.o: CBLAS/src/cblas_csymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csymm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csymm.Tpo -c -o libcblas_a-cblas_csymm.o `test -f 'CBLAS/src/cblas_csymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csymm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csymm.Tpo $(DEPDIR)/libcblas_a-cblas_csymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csymm.c' object='libcblas_a-cblas_csymm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csymm.o `test -f 'CBLAS/src/cblas_csymm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csymm.c libcblas_a-cblas_csymm.obj: CBLAS/src/cblas_csymm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csymm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csymm.Tpo -c -o libcblas_a-cblas_csymm.obj `if test -f 'CBLAS/src/cblas_csymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csymm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csymm.Tpo $(DEPDIR)/libcblas_a-cblas_csymm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csymm.c' object='libcblas_a-cblas_csymm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csymm.obj `if test -f 'CBLAS/src/cblas_csymm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csymm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csymm.c'; fi` libcblas_a-cblas_dtrmv.o: CBLAS/src/cblas_dtrmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrmv.Tpo -c -o libcblas_a-cblas_dtrmv.o `test -f 'CBLAS/src/cblas_dtrmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrmv.Tpo $(DEPDIR)/libcblas_a-cblas_dtrmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrmv.c' object='libcblas_a-cblas_dtrmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrmv.o `test -f 'CBLAS/src/cblas_dtrmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrmv.c libcblas_a-cblas_dtrmv.obj: CBLAS/src/cblas_dtrmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrmv.Tpo -c -o libcblas_a-cblas_dtrmv.obj `if test -f 'CBLAS/src/cblas_dtrmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrmv.Tpo $(DEPDIR)/libcblas_a-cblas_dtrmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrmv.c' object='libcblas_a-cblas_dtrmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrmv.obj `if test -f 'CBLAS/src/cblas_dtrmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrmv.c'; fi` libcblas_a-cblas_stpmv.o: CBLAS/src/cblas_stpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stpmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stpmv.Tpo -c -o libcblas_a-cblas_stpmv.o `test -f 'CBLAS/src/cblas_stpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stpmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stpmv.Tpo $(DEPDIR)/libcblas_a-cblas_stpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stpmv.c' object='libcblas_a-cblas_stpmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stpmv.o `test -f 'CBLAS/src/cblas_stpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stpmv.c libcblas_a-cblas_stpmv.obj: CBLAS/src/cblas_stpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stpmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stpmv.Tpo -c -o libcblas_a-cblas_stpmv.obj `if test -f 'CBLAS/src/cblas_stpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stpmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stpmv.Tpo $(DEPDIR)/libcblas_a-cblas_stpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stpmv.c' object='libcblas_a-cblas_stpmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stpmv.obj `if test -f 'CBLAS/src/cblas_stpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stpmv.c'; fi` libcblas_a-cblas_csyr2k.o: CBLAS/src/cblas_csyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csyr2k.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csyr2k.Tpo -c -o libcblas_a-cblas_csyr2k.o `test -f 'CBLAS/src/cblas_csyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csyr2k.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_csyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csyr2k.c' object='libcblas_a-cblas_csyr2k.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csyr2k.o `test -f 'CBLAS/src/cblas_csyr2k.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csyr2k.c libcblas_a-cblas_csyr2k.obj: CBLAS/src/cblas_csyr2k.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csyr2k.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csyr2k.Tpo -c -o libcblas_a-cblas_csyr2k.obj `if test -f 'CBLAS/src/cblas_csyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csyr2k.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csyr2k.Tpo $(DEPDIR)/libcblas_a-cblas_csyr2k.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csyr2k.c' object='libcblas_a-cblas_csyr2k.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csyr2k.obj `if test -f 'CBLAS/src/cblas_csyr2k.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csyr2k.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csyr2k.c'; fi` libcblas_a-cblas_dtrsm.o: CBLAS/src/cblas_dtrsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrsm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrsm.Tpo -c -o libcblas_a-cblas_dtrsm.o `test -f 'CBLAS/src/cblas_dtrsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrsm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrsm.Tpo $(DEPDIR)/libcblas_a-cblas_dtrsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrsm.c' object='libcblas_a-cblas_dtrsm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrsm.o `test -f 'CBLAS/src/cblas_dtrsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrsm.c libcblas_a-cblas_dtrsm.obj: CBLAS/src/cblas_dtrsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrsm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrsm.Tpo -c -o libcblas_a-cblas_dtrsm.obj `if test -f 'CBLAS/src/cblas_dtrsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrsm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrsm.Tpo $(DEPDIR)/libcblas_a-cblas_dtrsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrsm.c' object='libcblas_a-cblas_dtrsm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrsm.obj `if test -f 'CBLAS/src/cblas_dtrsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrsm.c'; fi` libcblas_a-cblas_stpsv.o: CBLAS/src/cblas_stpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stpsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stpsv.Tpo -c -o libcblas_a-cblas_stpsv.o `test -f 'CBLAS/src/cblas_stpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stpsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stpsv.Tpo $(DEPDIR)/libcblas_a-cblas_stpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stpsv.c' object='libcblas_a-cblas_stpsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stpsv.o `test -f 'CBLAS/src/cblas_stpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_stpsv.c libcblas_a-cblas_stpsv.obj: CBLAS/src/cblas_stpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_stpsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_stpsv.Tpo -c -o libcblas_a-cblas_stpsv.obj `if test -f 'CBLAS/src/cblas_stpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stpsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_stpsv.Tpo $(DEPDIR)/libcblas_a-cblas_stpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_stpsv.c' object='libcblas_a-cblas_stpsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_stpsv.obj `if test -f 'CBLAS/src/cblas_stpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_stpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_stpsv.c'; fi` libcblas_a-cblas_csyrk.o: CBLAS/src/cblas_csyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csyrk.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csyrk.Tpo -c -o libcblas_a-cblas_csyrk.o `test -f 'CBLAS/src/cblas_csyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csyrk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csyrk.Tpo $(DEPDIR)/libcblas_a-cblas_csyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csyrk.c' object='libcblas_a-cblas_csyrk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csyrk.o `test -f 'CBLAS/src/cblas_csyrk.c' || echo '$(srcdir)/'`CBLAS/src/cblas_csyrk.c libcblas_a-cblas_csyrk.obj: CBLAS/src/cblas_csyrk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_csyrk.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_csyrk.Tpo -c -o libcblas_a-cblas_csyrk.obj `if test -f 'CBLAS/src/cblas_csyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csyrk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_csyrk.Tpo $(DEPDIR)/libcblas_a-cblas_csyrk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_csyrk.c' object='libcblas_a-cblas_csyrk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_csyrk.obj `if test -f 'CBLAS/src/cblas_csyrk.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_csyrk.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_csyrk.c'; fi` libcblas_a-cblas_dtrsv.o: CBLAS/src/cblas_dtrsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrsv.Tpo -c -o libcblas_a-cblas_dtrsv.o `test -f 'CBLAS/src/cblas_dtrsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrsv.Tpo $(DEPDIR)/libcblas_a-cblas_dtrsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrsv.c' object='libcblas_a-cblas_dtrsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrsv.o `test -f 'CBLAS/src/cblas_dtrsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dtrsv.c libcblas_a-cblas_dtrsv.obj: CBLAS/src/cblas_dtrsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dtrsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dtrsv.Tpo -c -o libcblas_a-cblas_dtrsv.obj `if test -f 'CBLAS/src/cblas_dtrsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dtrsv.Tpo $(DEPDIR)/libcblas_a-cblas_dtrsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dtrsv.c' object='libcblas_a-cblas_dtrsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dtrsv.obj `if test -f 'CBLAS/src/cblas_dtrsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dtrsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dtrsv.c'; fi` libcblas_a-cblas_strmm.o: CBLAS/src/cblas_strmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strmm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strmm.Tpo -c -o libcblas_a-cblas_strmm.o `test -f 'CBLAS/src/cblas_strmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strmm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strmm.Tpo $(DEPDIR)/libcblas_a-cblas_strmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strmm.c' object='libcblas_a-cblas_strmm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strmm.o `test -f 'CBLAS/src/cblas_strmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strmm.c libcblas_a-cblas_strmm.obj: CBLAS/src/cblas_strmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strmm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strmm.Tpo -c -o libcblas_a-cblas_strmm.obj `if test -f 'CBLAS/src/cblas_strmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strmm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strmm.Tpo $(DEPDIR)/libcblas_a-cblas_strmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strmm.c' object='libcblas_a-cblas_strmm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strmm.obj `if test -f 'CBLAS/src/cblas_strmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strmm.c'; fi` libcblas_a-cblas_ctbmv.o: CBLAS/src/cblas_ctbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctbmv.Tpo -c -o libcblas_a-cblas_ctbmv.o `test -f 'CBLAS/src/cblas_ctbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctbmv.Tpo $(DEPDIR)/libcblas_a-cblas_ctbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctbmv.c' object='libcblas_a-cblas_ctbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctbmv.o `test -f 'CBLAS/src/cblas_ctbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctbmv.c libcblas_a-cblas_ctbmv.obj: CBLAS/src/cblas_ctbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctbmv.Tpo -c -o libcblas_a-cblas_ctbmv.obj `if test -f 'CBLAS/src/cblas_ctbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctbmv.Tpo $(DEPDIR)/libcblas_a-cblas_ctbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctbmv.c' object='libcblas_a-cblas_ctbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctbmv.obj `if test -f 'CBLAS/src/cblas_ctbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctbmv.c'; fi` libcblas_a-cblas_dzasum.o: CBLAS/src/cblas_dzasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dzasum.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dzasum.Tpo -c -o libcblas_a-cblas_dzasum.o `test -f 'CBLAS/src/cblas_dzasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dzasum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dzasum.Tpo $(DEPDIR)/libcblas_a-cblas_dzasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dzasum.c' object='libcblas_a-cblas_dzasum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dzasum.o `test -f 'CBLAS/src/cblas_dzasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dzasum.c libcblas_a-cblas_dzasum.obj: CBLAS/src/cblas_dzasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dzasum.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dzasum.Tpo -c -o libcblas_a-cblas_dzasum.obj `if test -f 'CBLAS/src/cblas_dzasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dzasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dzasum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dzasum.Tpo $(DEPDIR)/libcblas_a-cblas_dzasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dzasum.c' object='libcblas_a-cblas_dzasum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dzasum.obj `if test -f 'CBLAS/src/cblas_dzasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dzasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dzasum.c'; fi` libcblas_a-cblas_strmv.o: CBLAS/src/cblas_strmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strmv.Tpo -c -o libcblas_a-cblas_strmv.o `test -f 'CBLAS/src/cblas_strmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strmv.Tpo $(DEPDIR)/libcblas_a-cblas_strmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strmv.c' object='libcblas_a-cblas_strmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strmv.o `test -f 'CBLAS/src/cblas_strmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strmv.c libcblas_a-cblas_strmv.obj: CBLAS/src/cblas_strmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strmv.Tpo -c -o libcblas_a-cblas_strmv.obj `if test -f 'CBLAS/src/cblas_strmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strmv.Tpo $(DEPDIR)/libcblas_a-cblas_strmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strmv.c' object='libcblas_a-cblas_strmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strmv.obj `if test -f 'CBLAS/src/cblas_strmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strmv.c'; fi` libcblas_a-cblas_ctbsv.o: CBLAS/src/cblas_ctbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctbsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctbsv.Tpo -c -o libcblas_a-cblas_ctbsv.o `test -f 'CBLAS/src/cblas_ctbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctbsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctbsv.Tpo $(DEPDIR)/libcblas_a-cblas_ctbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctbsv.c' object='libcblas_a-cblas_ctbsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctbsv.o `test -f 'CBLAS/src/cblas_ctbsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctbsv.c libcblas_a-cblas_ctbsv.obj: CBLAS/src/cblas_ctbsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctbsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctbsv.Tpo -c -o libcblas_a-cblas_ctbsv.obj `if test -f 'CBLAS/src/cblas_ctbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctbsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctbsv.Tpo $(DEPDIR)/libcblas_a-cblas_ctbsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctbsv.c' object='libcblas_a-cblas_ctbsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctbsv.obj `if test -f 'CBLAS/src/cblas_ctbsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctbsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctbsv.c'; fi` libcblas_a-cblas_dznrm2.o: CBLAS/src/cblas_dznrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dznrm2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dznrm2.Tpo -c -o libcblas_a-cblas_dznrm2.o `test -f 'CBLAS/src/cblas_dznrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dznrm2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dznrm2.Tpo $(DEPDIR)/libcblas_a-cblas_dznrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dznrm2.c' object='libcblas_a-cblas_dznrm2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dznrm2.o `test -f 'CBLAS/src/cblas_dznrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dznrm2.c libcblas_a-cblas_dznrm2.obj: CBLAS/src/cblas_dznrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dznrm2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dznrm2.Tpo -c -o libcblas_a-cblas_dznrm2.obj `if test -f 'CBLAS/src/cblas_dznrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dznrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dznrm2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dznrm2.Tpo $(DEPDIR)/libcblas_a-cblas_dznrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dznrm2.c' object='libcblas_a-cblas_dznrm2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dznrm2.obj `if test -f 'CBLAS/src/cblas_dznrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dznrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dznrm2.c'; fi` libcblas_a-cblas_strsm.o: CBLAS/src/cblas_strsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strsm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strsm.Tpo -c -o libcblas_a-cblas_strsm.o `test -f 'CBLAS/src/cblas_strsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strsm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strsm.Tpo $(DEPDIR)/libcblas_a-cblas_strsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strsm.c' object='libcblas_a-cblas_strsm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strsm.o `test -f 'CBLAS/src/cblas_strsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strsm.c libcblas_a-cblas_strsm.obj: CBLAS/src/cblas_strsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strsm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strsm.Tpo -c -o libcblas_a-cblas_strsm.obj `if test -f 'CBLAS/src/cblas_strsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strsm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strsm.Tpo $(DEPDIR)/libcblas_a-cblas_strsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strsm.c' object='libcblas_a-cblas_strsm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strsm.obj `if test -f 'CBLAS/src/cblas_strsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strsm.c'; fi` libcblas_a-cblas_ctpmv.o: CBLAS/src/cblas_ctpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctpmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctpmv.Tpo -c -o libcblas_a-cblas_ctpmv.o `test -f 'CBLAS/src/cblas_ctpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctpmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctpmv.Tpo $(DEPDIR)/libcblas_a-cblas_ctpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctpmv.c' object='libcblas_a-cblas_ctpmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctpmv.o `test -f 'CBLAS/src/cblas_ctpmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctpmv.c libcblas_a-cblas_ctpmv.obj: CBLAS/src/cblas_ctpmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctpmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctpmv.Tpo -c -o libcblas_a-cblas_ctpmv.obj `if test -f 'CBLAS/src/cblas_ctpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctpmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctpmv.Tpo $(DEPDIR)/libcblas_a-cblas_ctpmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctpmv.c' object='libcblas_a-cblas_ctpmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctpmv.obj `if test -f 'CBLAS/src/cblas_ctpmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctpmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctpmv.c'; fi` libcblas_a-cblas_strsv.o: CBLAS/src/cblas_strsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strsv.Tpo -c -o libcblas_a-cblas_strsv.o `test -f 'CBLAS/src/cblas_strsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strsv.Tpo $(DEPDIR)/libcblas_a-cblas_strsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strsv.c' object='libcblas_a-cblas_strsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strsv.o `test -f 'CBLAS/src/cblas_strsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_strsv.c libcblas_a-cblas_strsv.obj: CBLAS/src/cblas_strsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_strsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_strsv.Tpo -c -o libcblas_a-cblas_strsv.obj `if test -f 'CBLAS/src/cblas_strsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_strsv.Tpo $(DEPDIR)/libcblas_a-cblas_strsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_strsv.c' object='libcblas_a-cblas_strsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_strsv.obj `if test -f 'CBLAS/src/cblas_strsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_strsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_strsv.c'; fi` libcblas_a-cblas_ctpsv.o: CBLAS/src/cblas_ctpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctpsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctpsv.Tpo -c -o libcblas_a-cblas_ctpsv.o `test -f 'CBLAS/src/cblas_ctpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctpsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctpsv.Tpo $(DEPDIR)/libcblas_a-cblas_ctpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctpsv.c' object='libcblas_a-cblas_ctpsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctpsv.o `test -f 'CBLAS/src/cblas_ctpsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctpsv.c libcblas_a-cblas_ctpsv.obj: CBLAS/src/cblas_ctpsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctpsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctpsv.Tpo -c -o libcblas_a-cblas_ctpsv.obj `if test -f 'CBLAS/src/cblas_ctpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctpsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctpsv.Tpo $(DEPDIR)/libcblas_a-cblas_ctpsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctpsv.c' object='libcblas_a-cblas_ctpsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctpsv.obj `if test -f 'CBLAS/src/cblas_ctpsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctpsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctpsv.c'; fi` libcblas_a-cblas_globals.o: CBLAS/src/cblas_globals.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_globals.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_globals.Tpo -c -o libcblas_a-cblas_globals.o `test -f 'CBLAS/src/cblas_globals.c' || echo '$(srcdir)/'`CBLAS/src/cblas_globals.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_globals.Tpo $(DEPDIR)/libcblas_a-cblas_globals.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_globals.c' object='libcblas_a-cblas_globals.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_globals.o `test -f 'CBLAS/src/cblas_globals.c' || echo '$(srcdir)/'`CBLAS/src/cblas_globals.c libcblas_a-cblas_globals.obj: CBLAS/src/cblas_globals.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_globals.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_globals.Tpo -c -o libcblas_a-cblas_globals.obj `if test -f 'CBLAS/src/cblas_globals.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_globals.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_globals.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_globals.Tpo $(DEPDIR)/libcblas_a-cblas_globals.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_globals.c' object='libcblas_a-cblas_globals.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_globals.obj `if test -f 'CBLAS/src/cblas_globals.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_globals.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_globals.c'; fi` libcblas_a-cblas_xerbla.o: CBLAS/src/cblas_xerbla.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_xerbla.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_xerbla.Tpo -c -o libcblas_a-cblas_xerbla.o `test -f 'CBLAS/src/cblas_xerbla.c' || echo '$(srcdir)/'`CBLAS/src/cblas_xerbla.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_xerbla.Tpo $(DEPDIR)/libcblas_a-cblas_xerbla.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_xerbla.c' object='libcblas_a-cblas_xerbla.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_xerbla.o `test -f 'CBLAS/src/cblas_xerbla.c' || echo '$(srcdir)/'`CBLAS/src/cblas_xerbla.c libcblas_a-cblas_xerbla.obj: CBLAS/src/cblas_xerbla.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_xerbla.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_xerbla.Tpo -c -o libcblas_a-cblas_xerbla.obj `if test -f 'CBLAS/src/cblas_xerbla.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_xerbla.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_xerbla.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_xerbla.Tpo $(DEPDIR)/libcblas_a-cblas_xerbla.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_xerbla.c' object='libcblas_a-cblas_xerbla.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_xerbla.obj `if test -f 'CBLAS/src/cblas_xerbla.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_xerbla.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_xerbla.c'; fi` libcblas_a-cblas_ctrmm.o: CBLAS/src/cblas_ctrmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrmm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrmm.Tpo -c -o libcblas_a-cblas_ctrmm.o `test -f 'CBLAS/src/cblas_ctrmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrmm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrmm.Tpo $(DEPDIR)/libcblas_a-cblas_ctrmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrmm.c' object='libcblas_a-cblas_ctrmm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrmm.o `test -f 'CBLAS/src/cblas_ctrmm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrmm.c libcblas_a-cblas_ctrmm.obj: CBLAS/src/cblas_ctrmm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrmm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrmm.Tpo -c -o libcblas_a-cblas_ctrmm.obj `if test -f 'CBLAS/src/cblas_ctrmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrmm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrmm.Tpo $(DEPDIR)/libcblas_a-cblas_ctrmm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrmm.c' object='libcblas_a-cblas_ctrmm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrmm.obj `if test -f 'CBLAS/src/cblas_ctrmm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrmm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrmm.c'; fi` libcblas_a-cblas_zaxpy.o: CBLAS/src/cblas_zaxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zaxpy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zaxpy.Tpo -c -o libcblas_a-cblas_zaxpy.o `test -f 'CBLAS/src/cblas_zaxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zaxpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zaxpy.Tpo $(DEPDIR)/libcblas_a-cblas_zaxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zaxpy.c' object='libcblas_a-cblas_zaxpy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zaxpy.o `test -f 'CBLAS/src/cblas_zaxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zaxpy.c libcblas_a-cblas_zaxpy.obj: CBLAS/src/cblas_zaxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zaxpy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zaxpy.Tpo -c -o libcblas_a-cblas_zaxpy.obj `if test -f 'CBLAS/src/cblas_zaxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zaxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zaxpy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zaxpy.Tpo $(DEPDIR)/libcblas_a-cblas_zaxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zaxpy.c' object='libcblas_a-cblas_zaxpy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zaxpy.obj `if test -f 'CBLAS/src/cblas_zaxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zaxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zaxpy.c'; fi` libcblas_a-cblas_ctrmv.o: CBLAS/src/cblas_ctrmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrmv.Tpo -c -o libcblas_a-cblas_ctrmv.o `test -f 'CBLAS/src/cblas_ctrmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrmv.Tpo $(DEPDIR)/libcblas_a-cblas_ctrmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrmv.c' object='libcblas_a-cblas_ctrmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrmv.o `test -f 'CBLAS/src/cblas_ctrmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrmv.c libcblas_a-cblas_ctrmv.obj: CBLAS/src/cblas_ctrmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrmv.Tpo -c -o libcblas_a-cblas_ctrmv.obj `if test -f 'CBLAS/src/cblas_ctrmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrmv.Tpo $(DEPDIR)/libcblas_a-cblas_ctrmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrmv.c' object='libcblas_a-cblas_ctrmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrmv.obj `if test -f 'CBLAS/src/cblas_ctrmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrmv.c'; fi` libcblas_a-cblas_icamax.o: CBLAS/src/cblas_icamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_icamax.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_icamax.Tpo -c -o libcblas_a-cblas_icamax.o `test -f 'CBLAS/src/cblas_icamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_icamax.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_icamax.Tpo $(DEPDIR)/libcblas_a-cblas_icamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_icamax.c' object='libcblas_a-cblas_icamax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_icamax.o `test -f 'CBLAS/src/cblas_icamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_icamax.c libcblas_a-cblas_icamax.obj: CBLAS/src/cblas_icamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_icamax.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_icamax.Tpo -c -o libcblas_a-cblas_icamax.obj `if test -f 'CBLAS/src/cblas_icamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_icamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_icamax.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_icamax.Tpo $(DEPDIR)/libcblas_a-cblas_icamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_icamax.c' object='libcblas_a-cblas_icamax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_icamax.obj `if test -f 'CBLAS/src/cblas_icamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_icamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_icamax.c'; fi` libcblas_a-cblas_zcopy.o: CBLAS/src/cblas_zcopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zcopy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zcopy.Tpo -c -o libcblas_a-cblas_zcopy.o `test -f 'CBLAS/src/cblas_zcopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zcopy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zcopy.Tpo $(DEPDIR)/libcblas_a-cblas_zcopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zcopy.c' object='libcblas_a-cblas_zcopy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zcopy.o `test -f 'CBLAS/src/cblas_zcopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zcopy.c libcblas_a-cblas_zcopy.obj: CBLAS/src/cblas_zcopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zcopy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zcopy.Tpo -c -o libcblas_a-cblas_zcopy.obj `if test -f 'CBLAS/src/cblas_zcopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zcopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zcopy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zcopy.Tpo $(DEPDIR)/libcblas_a-cblas_zcopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zcopy.c' object='libcblas_a-cblas_zcopy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zcopy.obj `if test -f 'CBLAS/src/cblas_zcopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zcopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zcopy.c'; fi` libcblas_a-cblas_ctrsm.o: CBLAS/src/cblas_ctrsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrsm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrsm.Tpo -c -o libcblas_a-cblas_ctrsm.o `test -f 'CBLAS/src/cblas_ctrsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrsm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrsm.Tpo $(DEPDIR)/libcblas_a-cblas_ctrsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrsm.c' object='libcblas_a-cblas_ctrsm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrsm.o `test -f 'CBLAS/src/cblas_ctrsm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrsm.c libcblas_a-cblas_ctrsm.obj: CBLAS/src/cblas_ctrsm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrsm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrsm.Tpo -c -o libcblas_a-cblas_ctrsm.obj `if test -f 'CBLAS/src/cblas_ctrsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrsm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrsm.Tpo $(DEPDIR)/libcblas_a-cblas_ctrsm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrsm.c' object='libcblas_a-cblas_ctrsm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrsm.obj `if test -f 'CBLAS/src/cblas_ctrsm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrsm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrsm.c'; fi` libcblas_a-cblas_idamax.o: CBLAS/src/cblas_idamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_idamax.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_idamax.Tpo -c -o libcblas_a-cblas_idamax.o `test -f 'CBLAS/src/cblas_idamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_idamax.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_idamax.Tpo $(DEPDIR)/libcblas_a-cblas_idamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_idamax.c' object='libcblas_a-cblas_idamax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_idamax.o `test -f 'CBLAS/src/cblas_idamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_idamax.c libcblas_a-cblas_idamax.obj: CBLAS/src/cblas_idamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_idamax.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_idamax.Tpo -c -o libcblas_a-cblas_idamax.obj `if test -f 'CBLAS/src/cblas_idamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_idamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_idamax.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_idamax.Tpo $(DEPDIR)/libcblas_a-cblas_idamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_idamax.c' object='libcblas_a-cblas_idamax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_idamax.obj `if test -f 'CBLAS/src/cblas_idamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_idamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_idamax.c'; fi` libcblas_a-cblas_zdotc_sub.o: CBLAS/src/cblas_zdotc_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zdotc_sub.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zdotc_sub.Tpo -c -o libcblas_a-cblas_zdotc_sub.o `test -f 'CBLAS/src/cblas_zdotc_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zdotc_sub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zdotc_sub.Tpo $(DEPDIR)/libcblas_a-cblas_zdotc_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zdotc_sub.c' object='libcblas_a-cblas_zdotc_sub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zdotc_sub.o `test -f 'CBLAS/src/cblas_zdotc_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zdotc_sub.c libcblas_a-cblas_zdotc_sub.obj: CBLAS/src/cblas_zdotc_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zdotc_sub.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zdotc_sub.Tpo -c -o libcblas_a-cblas_zdotc_sub.obj `if test -f 'CBLAS/src/cblas_zdotc_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zdotc_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zdotc_sub.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zdotc_sub.Tpo $(DEPDIR)/libcblas_a-cblas_zdotc_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zdotc_sub.c' object='libcblas_a-cblas_zdotc_sub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zdotc_sub.obj `if test -f 'CBLAS/src/cblas_zdotc_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zdotc_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zdotc_sub.c'; fi` libcblas_a-cblas_ctrsv.o: CBLAS/src/cblas_ctrsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrsv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrsv.Tpo -c -o libcblas_a-cblas_ctrsv.o `test -f 'CBLAS/src/cblas_ctrsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrsv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrsv.Tpo $(DEPDIR)/libcblas_a-cblas_ctrsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrsv.c' object='libcblas_a-cblas_ctrsv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrsv.o `test -f 'CBLAS/src/cblas_ctrsv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ctrsv.c libcblas_a-cblas_ctrsv.obj: CBLAS/src/cblas_ctrsv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ctrsv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ctrsv.Tpo -c -o libcblas_a-cblas_ctrsv.obj `if test -f 'CBLAS/src/cblas_ctrsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrsv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ctrsv.Tpo $(DEPDIR)/libcblas_a-cblas_ctrsv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ctrsv.c' object='libcblas_a-cblas_ctrsv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ctrsv.obj `if test -f 'CBLAS/src/cblas_ctrsv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ctrsv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ctrsv.c'; fi` libcblas_a-cblas_isamax.o: CBLAS/src/cblas_isamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_isamax.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_isamax.Tpo -c -o libcblas_a-cblas_isamax.o `test -f 'CBLAS/src/cblas_isamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_isamax.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_isamax.Tpo $(DEPDIR)/libcblas_a-cblas_isamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_isamax.c' object='libcblas_a-cblas_isamax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_isamax.o `test -f 'CBLAS/src/cblas_isamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_isamax.c libcblas_a-cblas_isamax.obj: CBLAS/src/cblas_isamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_isamax.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_isamax.Tpo -c -o libcblas_a-cblas_isamax.obj `if test -f 'CBLAS/src/cblas_isamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_isamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_isamax.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_isamax.Tpo $(DEPDIR)/libcblas_a-cblas_isamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_isamax.c' object='libcblas_a-cblas_isamax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_isamax.obj `if test -f 'CBLAS/src/cblas_isamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_isamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_isamax.c'; fi` libcblas_a-cblas_zdotu_sub.o: CBLAS/src/cblas_zdotu_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zdotu_sub.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zdotu_sub.Tpo -c -o libcblas_a-cblas_zdotu_sub.o `test -f 'CBLAS/src/cblas_zdotu_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zdotu_sub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zdotu_sub.Tpo $(DEPDIR)/libcblas_a-cblas_zdotu_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zdotu_sub.c' object='libcblas_a-cblas_zdotu_sub.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zdotu_sub.o `test -f 'CBLAS/src/cblas_zdotu_sub.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zdotu_sub.c libcblas_a-cblas_zdotu_sub.obj: CBLAS/src/cblas_zdotu_sub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zdotu_sub.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zdotu_sub.Tpo -c -o libcblas_a-cblas_zdotu_sub.obj `if test -f 'CBLAS/src/cblas_zdotu_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zdotu_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zdotu_sub.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zdotu_sub.Tpo $(DEPDIR)/libcblas_a-cblas_zdotu_sub.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zdotu_sub.c' object='libcblas_a-cblas_zdotu_sub.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zdotu_sub.obj `if test -f 'CBLAS/src/cblas_zdotu_sub.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zdotu_sub.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zdotu_sub.c'; fi` libcblas_a-cblas_dasum.o: CBLAS/src/cblas_dasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dasum.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dasum.Tpo -c -o libcblas_a-cblas_dasum.o `test -f 'CBLAS/src/cblas_dasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dasum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dasum.Tpo $(DEPDIR)/libcblas_a-cblas_dasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dasum.c' object='libcblas_a-cblas_dasum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dasum.o `test -f 'CBLAS/src/cblas_dasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dasum.c libcblas_a-cblas_dasum.obj: CBLAS/src/cblas_dasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dasum.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dasum.Tpo -c -o libcblas_a-cblas_dasum.obj `if test -f 'CBLAS/src/cblas_dasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dasum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dasum.Tpo $(DEPDIR)/libcblas_a-cblas_dasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dasum.c' object='libcblas_a-cblas_dasum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dasum.obj `if test -f 'CBLAS/src/cblas_dasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dasum.c'; fi` libcblas_a-cblas_izamax.o: CBLAS/src/cblas_izamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_izamax.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_izamax.Tpo -c -o libcblas_a-cblas_izamax.o `test -f 'CBLAS/src/cblas_izamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_izamax.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_izamax.Tpo $(DEPDIR)/libcblas_a-cblas_izamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_izamax.c' object='libcblas_a-cblas_izamax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_izamax.o `test -f 'CBLAS/src/cblas_izamax.c' || echo '$(srcdir)/'`CBLAS/src/cblas_izamax.c libcblas_a-cblas_izamax.obj: CBLAS/src/cblas_izamax.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_izamax.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_izamax.Tpo -c -o libcblas_a-cblas_izamax.obj `if test -f 'CBLAS/src/cblas_izamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_izamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_izamax.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_izamax.Tpo $(DEPDIR)/libcblas_a-cblas_izamax.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_izamax.c' object='libcblas_a-cblas_izamax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_izamax.obj `if test -f 'CBLAS/src/cblas_izamax.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_izamax.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_izamax.c'; fi` libcblas_a-cblas_zdscal.o: CBLAS/src/cblas_zdscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zdscal.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zdscal.Tpo -c -o libcblas_a-cblas_zdscal.o `test -f 'CBLAS/src/cblas_zdscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zdscal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zdscal.Tpo $(DEPDIR)/libcblas_a-cblas_zdscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zdscal.c' object='libcblas_a-cblas_zdscal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zdscal.o `test -f 'CBLAS/src/cblas_zdscal.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zdscal.c libcblas_a-cblas_zdscal.obj: CBLAS/src/cblas_zdscal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zdscal.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zdscal.Tpo -c -o libcblas_a-cblas_zdscal.obj `if test -f 'CBLAS/src/cblas_zdscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zdscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zdscal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zdscal.Tpo $(DEPDIR)/libcblas_a-cblas_zdscal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zdscal.c' object='libcblas_a-cblas_zdscal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zdscal.obj `if test -f 'CBLAS/src/cblas_zdscal.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zdscal.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zdscal.c'; fi` libcblas_a-cblas_daxpy.o: CBLAS/src/cblas_daxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_daxpy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_daxpy.Tpo -c -o libcblas_a-cblas_daxpy.o `test -f 'CBLAS/src/cblas_daxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_daxpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_daxpy.Tpo $(DEPDIR)/libcblas_a-cblas_daxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_daxpy.c' object='libcblas_a-cblas_daxpy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_daxpy.o `test -f 'CBLAS/src/cblas_daxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_daxpy.c libcblas_a-cblas_daxpy.obj: CBLAS/src/cblas_daxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_daxpy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_daxpy.Tpo -c -o libcblas_a-cblas_daxpy.obj `if test -f 'CBLAS/src/cblas_daxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_daxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_daxpy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_daxpy.Tpo $(DEPDIR)/libcblas_a-cblas_daxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_daxpy.c' object='libcblas_a-cblas_daxpy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_daxpy.obj `if test -f 'CBLAS/src/cblas_daxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_daxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_daxpy.c'; fi` libcblas_a-cblas_sasum.o: CBLAS/src/cblas_sasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sasum.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sasum.Tpo -c -o libcblas_a-cblas_sasum.o `test -f 'CBLAS/src/cblas_sasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sasum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sasum.Tpo $(DEPDIR)/libcblas_a-cblas_sasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sasum.c' object='libcblas_a-cblas_sasum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sasum.o `test -f 'CBLAS/src/cblas_sasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sasum.c libcblas_a-cblas_sasum.obj: CBLAS/src/cblas_sasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sasum.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sasum.Tpo -c -o libcblas_a-cblas_sasum.obj `if test -f 'CBLAS/src/cblas_sasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sasum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sasum.Tpo $(DEPDIR)/libcblas_a-cblas_sasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sasum.c' object='libcblas_a-cblas_sasum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sasum.obj `if test -f 'CBLAS/src/cblas_sasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sasum.c'; fi` libcblas_a-cblas_zgbmv.o: CBLAS/src/cblas_zgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgbmv.Tpo -c -o libcblas_a-cblas_zgbmv.o `test -f 'CBLAS/src/cblas_zgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_zgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgbmv.c' object='libcblas_a-cblas_zgbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgbmv.o `test -f 'CBLAS/src/cblas_zgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgbmv.c libcblas_a-cblas_zgbmv.obj: CBLAS/src/cblas_zgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgbmv.Tpo -c -o libcblas_a-cblas_zgbmv.obj `if test -f 'CBLAS/src/cblas_zgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_zgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgbmv.c' object='libcblas_a-cblas_zgbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgbmv.obj `if test -f 'CBLAS/src/cblas_zgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgbmv.c'; fi` libcblas_a-cblas_dcopy.o: CBLAS/src/cblas_dcopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dcopy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dcopy.Tpo -c -o libcblas_a-cblas_dcopy.o `test -f 'CBLAS/src/cblas_dcopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dcopy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dcopy.Tpo $(DEPDIR)/libcblas_a-cblas_dcopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dcopy.c' object='libcblas_a-cblas_dcopy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dcopy.o `test -f 'CBLAS/src/cblas_dcopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dcopy.c libcblas_a-cblas_dcopy.obj: CBLAS/src/cblas_dcopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dcopy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dcopy.Tpo -c -o libcblas_a-cblas_dcopy.obj `if test -f 'CBLAS/src/cblas_dcopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dcopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dcopy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dcopy.Tpo $(DEPDIR)/libcblas_a-cblas_dcopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dcopy.c' object='libcblas_a-cblas_dcopy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dcopy.obj `if test -f 'CBLAS/src/cblas_dcopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dcopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dcopy.c'; fi` libcblas_a-cblas_saxpy.o: CBLAS/src/cblas_saxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_saxpy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_saxpy.Tpo -c -o libcblas_a-cblas_saxpy.o `test -f 'CBLAS/src/cblas_saxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_saxpy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_saxpy.Tpo $(DEPDIR)/libcblas_a-cblas_saxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_saxpy.c' object='libcblas_a-cblas_saxpy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_saxpy.o `test -f 'CBLAS/src/cblas_saxpy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_saxpy.c libcblas_a-cblas_saxpy.obj: CBLAS/src/cblas_saxpy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_saxpy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_saxpy.Tpo -c -o libcblas_a-cblas_saxpy.obj `if test -f 'CBLAS/src/cblas_saxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_saxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_saxpy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_saxpy.Tpo $(DEPDIR)/libcblas_a-cblas_saxpy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_saxpy.c' object='libcblas_a-cblas_saxpy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_saxpy.obj `if test -f 'CBLAS/src/cblas_saxpy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_saxpy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_saxpy.c'; fi` libcblas_a-cblas_zgemm.o: CBLAS/src/cblas_zgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgemm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgemm.Tpo -c -o libcblas_a-cblas_zgemm.o `test -f 'CBLAS/src/cblas_zgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgemm.Tpo $(DEPDIR)/libcblas_a-cblas_zgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgemm.c' object='libcblas_a-cblas_zgemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgemm.o `test -f 'CBLAS/src/cblas_zgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgemm.c libcblas_a-cblas_zgemm.obj: CBLAS/src/cblas_zgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgemm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgemm.Tpo -c -o libcblas_a-cblas_zgemm.obj `if test -f 'CBLAS/src/cblas_zgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgemm.Tpo $(DEPDIR)/libcblas_a-cblas_zgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgemm.c' object='libcblas_a-cblas_zgemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgemm.obj `if test -f 'CBLAS/src/cblas_zgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgemm.c'; fi` libcblas_a-cblas_ddot.o: CBLAS/src/cblas_ddot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ddot.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ddot.Tpo -c -o libcblas_a-cblas_ddot.o `test -f 'CBLAS/src/cblas_ddot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ddot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ddot.Tpo $(DEPDIR)/libcblas_a-cblas_ddot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ddot.c' object='libcblas_a-cblas_ddot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ddot.o `test -f 'CBLAS/src/cblas_ddot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_ddot.c libcblas_a-cblas_ddot.obj: CBLAS/src/cblas_ddot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_ddot.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_ddot.Tpo -c -o libcblas_a-cblas_ddot.obj `if test -f 'CBLAS/src/cblas_ddot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ddot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ddot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_ddot.Tpo $(DEPDIR)/libcblas_a-cblas_ddot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_ddot.c' object='libcblas_a-cblas_ddot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_ddot.obj `if test -f 'CBLAS/src/cblas_ddot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_ddot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_ddot.c'; fi` libcblas_a-cblas_scasum.o: CBLAS/src/cblas_scasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_scasum.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_scasum.Tpo -c -o libcblas_a-cblas_scasum.o `test -f 'CBLAS/src/cblas_scasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_scasum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_scasum.Tpo $(DEPDIR)/libcblas_a-cblas_scasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_scasum.c' object='libcblas_a-cblas_scasum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_scasum.o `test -f 'CBLAS/src/cblas_scasum.c' || echo '$(srcdir)/'`CBLAS/src/cblas_scasum.c libcblas_a-cblas_scasum.obj: CBLAS/src/cblas_scasum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_scasum.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_scasum.Tpo -c -o libcblas_a-cblas_scasum.obj `if test -f 'CBLAS/src/cblas_scasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_scasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_scasum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_scasum.Tpo $(DEPDIR)/libcblas_a-cblas_scasum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_scasum.c' object='libcblas_a-cblas_scasum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_scasum.obj `if test -f 'CBLAS/src/cblas_scasum.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_scasum.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_scasum.c'; fi` libcblas_a-cblas_zgemv.o: CBLAS/src/cblas_zgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgemv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgemv.Tpo -c -o libcblas_a-cblas_zgemv.o `test -f 'CBLAS/src/cblas_zgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgemv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgemv.Tpo $(DEPDIR)/libcblas_a-cblas_zgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgemv.c' object='libcblas_a-cblas_zgemv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgemv.o `test -f 'CBLAS/src/cblas_zgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgemv.c libcblas_a-cblas_zgemv.obj: CBLAS/src/cblas_zgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgemv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgemv.Tpo -c -o libcblas_a-cblas_zgemv.obj `if test -f 'CBLAS/src/cblas_zgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgemv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgemv.Tpo $(DEPDIR)/libcblas_a-cblas_zgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgemv.c' object='libcblas_a-cblas_zgemv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgemv.obj `if test -f 'CBLAS/src/cblas_zgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgemv.c'; fi` libcblas_a-cblas_dgbmv.o: CBLAS/src/cblas_dgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dgbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dgbmv.Tpo -c -o libcblas_a-cblas_dgbmv.o `test -f 'CBLAS/src/cblas_dgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dgbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_dgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dgbmv.c' object='libcblas_a-cblas_dgbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dgbmv.o `test -f 'CBLAS/src/cblas_dgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dgbmv.c libcblas_a-cblas_dgbmv.obj: CBLAS/src/cblas_dgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dgbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dgbmv.Tpo -c -o libcblas_a-cblas_dgbmv.obj `if test -f 'CBLAS/src/cblas_dgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dgbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_dgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dgbmv.c' object='libcblas_a-cblas_dgbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dgbmv.obj `if test -f 'CBLAS/src/cblas_dgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dgbmv.c'; fi` libcblas_a-cblas_scnrm2.o: CBLAS/src/cblas_scnrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_scnrm2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_scnrm2.Tpo -c -o libcblas_a-cblas_scnrm2.o `test -f 'CBLAS/src/cblas_scnrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_scnrm2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_scnrm2.Tpo $(DEPDIR)/libcblas_a-cblas_scnrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_scnrm2.c' object='libcblas_a-cblas_scnrm2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_scnrm2.o `test -f 'CBLAS/src/cblas_scnrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_scnrm2.c libcblas_a-cblas_scnrm2.obj: CBLAS/src/cblas_scnrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_scnrm2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_scnrm2.Tpo -c -o libcblas_a-cblas_scnrm2.obj `if test -f 'CBLAS/src/cblas_scnrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_scnrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_scnrm2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_scnrm2.Tpo $(DEPDIR)/libcblas_a-cblas_scnrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_scnrm2.c' object='libcblas_a-cblas_scnrm2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_scnrm2.obj `if test -f 'CBLAS/src/cblas_scnrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_scnrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_scnrm2.c'; fi` libcblas_a-cblas_zgerc.o: CBLAS/src/cblas_zgerc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgerc.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgerc.Tpo -c -o libcblas_a-cblas_zgerc.o `test -f 'CBLAS/src/cblas_zgerc.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgerc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgerc.Tpo $(DEPDIR)/libcblas_a-cblas_zgerc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgerc.c' object='libcblas_a-cblas_zgerc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgerc.o `test -f 'CBLAS/src/cblas_zgerc.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgerc.c libcblas_a-cblas_zgerc.obj: CBLAS/src/cblas_zgerc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgerc.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgerc.Tpo -c -o libcblas_a-cblas_zgerc.obj `if test -f 'CBLAS/src/cblas_zgerc.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgerc.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgerc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgerc.Tpo $(DEPDIR)/libcblas_a-cblas_zgerc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgerc.c' object='libcblas_a-cblas_zgerc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgerc.obj `if test -f 'CBLAS/src/cblas_zgerc.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgerc.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgerc.c'; fi` libcblas_a-cblas_dgemm.o: CBLAS/src/cblas_dgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dgemm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dgemm.Tpo -c -o libcblas_a-cblas_dgemm.o `test -f 'CBLAS/src/cblas_dgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dgemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dgemm.Tpo $(DEPDIR)/libcblas_a-cblas_dgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dgemm.c' object='libcblas_a-cblas_dgemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dgemm.o `test -f 'CBLAS/src/cblas_dgemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dgemm.c libcblas_a-cblas_dgemm.obj: CBLAS/src/cblas_dgemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dgemm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dgemm.Tpo -c -o libcblas_a-cblas_dgemm.obj `if test -f 'CBLAS/src/cblas_dgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dgemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dgemm.Tpo $(DEPDIR)/libcblas_a-cblas_dgemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dgemm.c' object='libcblas_a-cblas_dgemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dgemm.obj `if test -f 'CBLAS/src/cblas_dgemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dgemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dgemm.c'; fi` libcblas_a-cblas_scopy.o: CBLAS/src/cblas_scopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_scopy.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_scopy.Tpo -c -o libcblas_a-cblas_scopy.o `test -f 'CBLAS/src/cblas_scopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_scopy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_scopy.Tpo $(DEPDIR)/libcblas_a-cblas_scopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_scopy.c' object='libcblas_a-cblas_scopy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_scopy.o `test -f 'CBLAS/src/cblas_scopy.c' || echo '$(srcdir)/'`CBLAS/src/cblas_scopy.c libcblas_a-cblas_scopy.obj: CBLAS/src/cblas_scopy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_scopy.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_scopy.Tpo -c -o libcblas_a-cblas_scopy.obj `if test -f 'CBLAS/src/cblas_scopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_scopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_scopy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_scopy.Tpo $(DEPDIR)/libcblas_a-cblas_scopy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_scopy.c' object='libcblas_a-cblas_scopy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_scopy.obj `if test -f 'CBLAS/src/cblas_scopy.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_scopy.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_scopy.c'; fi` libcblas_a-cblas_zgeru.o: CBLAS/src/cblas_zgeru.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgeru.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgeru.Tpo -c -o libcblas_a-cblas_zgeru.o `test -f 'CBLAS/src/cblas_zgeru.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgeru.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgeru.Tpo $(DEPDIR)/libcblas_a-cblas_zgeru.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgeru.c' object='libcblas_a-cblas_zgeru.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgeru.o `test -f 'CBLAS/src/cblas_zgeru.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zgeru.c libcblas_a-cblas_zgeru.obj: CBLAS/src/cblas_zgeru.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zgeru.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zgeru.Tpo -c -o libcblas_a-cblas_zgeru.obj `if test -f 'CBLAS/src/cblas_zgeru.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgeru.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgeru.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zgeru.Tpo $(DEPDIR)/libcblas_a-cblas_zgeru.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zgeru.c' object='libcblas_a-cblas_zgeru.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zgeru.obj `if test -f 'CBLAS/src/cblas_zgeru.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zgeru.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zgeru.c'; fi` libcblas_a-cblas_dgemv.o: CBLAS/src/cblas_dgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dgemv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dgemv.Tpo -c -o libcblas_a-cblas_dgemv.o `test -f 'CBLAS/src/cblas_dgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dgemv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dgemv.Tpo $(DEPDIR)/libcblas_a-cblas_dgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dgemv.c' object='libcblas_a-cblas_dgemv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dgemv.o `test -f 'CBLAS/src/cblas_dgemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dgemv.c libcblas_a-cblas_dgemv.obj: CBLAS/src/cblas_dgemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dgemv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dgemv.Tpo -c -o libcblas_a-cblas_dgemv.obj `if test -f 'CBLAS/src/cblas_dgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dgemv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dgemv.Tpo $(DEPDIR)/libcblas_a-cblas_dgemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dgemv.c' object='libcblas_a-cblas_dgemv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dgemv.obj `if test -f 'CBLAS/src/cblas_dgemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dgemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dgemv.c'; fi` libcblas_a-cblas_sdot.o: CBLAS/src/cblas_sdot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sdot.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sdot.Tpo -c -o libcblas_a-cblas_sdot.o `test -f 'CBLAS/src/cblas_sdot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sdot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sdot.Tpo $(DEPDIR)/libcblas_a-cblas_sdot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sdot.c' object='libcblas_a-cblas_sdot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sdot.o `test -f 'CBLAS/src/cblas_sdot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sdot.c libcblas_a-cblas_sdot.obj: CBLAS/src/cblas_sdot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sdot.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sdot.Tpo -c -o libcblas_a-cblas_sdot.obj `if test -f 'CBLAS/src/cblas_sdot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sdot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sdot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sdot.Tpo $(DEPDIR)/libcblas_a-cblas_sdot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sdot.c' object='libcblas_a-cblas_sdot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sdot.obj `if test -f 'CBLAS/src/cblas_sdot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sdot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sdot.c'; fi` libcblas_a-cblas_zhbmv.o: CBLAS/src/cblas_zhbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhbmv.Tpo -c -o libcblas_a-cblas_zhbmv.o `test -f 'CBLAS/src/cblas_zhbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhbmv.Tpo $(DEPDIR)/libcblas_a-cblas_zhbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhbmv.c' object='libcblas_a-cblas_zhbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhbmv.o `test -f 'CBLAS/src/cblas_zhbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhbmv.c libcblas_a-cblas_zhbmv.obj: CBLAS/src/cblas_zhbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhbmv.Tpo -c -o libcblas_a-cblas_zhbmv.obj `if test -f 'CBLAS/src/cblas_zhbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhbmv.Tpo $(DEPDIR)/libcblas_a-cblas_zhbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhbmv.c' object='libcblas_a-cblas_zhbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhbmv.obj `if test -f 'CBLAS/src/cblas_zhbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhbmv.c'; fi` libcblas_a-xerbla.o: CBLAS/src/xerbla.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-xerbla.o -MD -MP -MF $(DEPDIR)/libcblas_a-xerbla.Tpo -c -o libcblas_a-xerbla.o `test -f 'CBLAS/src/xerbla.c' || echo '$(srcdir)/'`CBLAS/src/xerbla.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-xerbla.Tpo $(DEPDIR)/libcblas_a-xerbla.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/xerbla.c' object='libcblas_a-xerbla.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-xerbla.o `test -f 'CBLAS/src/xerbla.c' || echo '$(srcdir)/'`CBLAS/src/xerbla.c libcblas_a-xerbla.obj: CBLAS/src/xerbla.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-xerbla.obj -MD -MP -MF $(DEPDIR)/libcblas_a-xerbla.Tpo -c -o libcblas_a-xerbla.obj `if test -f 'CBLAS/src/xerbla.c'; then $(CYGPATH_W) 'CBLAS/src/xerbla.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/xerbla.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-xerbla.Tpo $(DEPDIR)/libcblas_a-xerbla.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/xerbla.c' object='libcblas_a-xerbla.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-xerbla.obj `if test -f 'CBLAS/src/xerbla.c'; then $(CYGPATH_W) 'CBLAS/src/xerbla.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/xerbla.c'; fi` libcblas_a-cblas_dger.o: CBLAS/src/cblas_dger.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dger.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dger.Tpo -c -o libcblas_a-cblas_dger.o `test -f 'CBLAS/src/cblas_dger.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dger.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dger.Tpo $(DEPDIR)/libcblas_a-cblas_dger.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dger.c' object='libcblas_a-cblas_dger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dger.o `test -f 'CBLAS/src/cblas_dger.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dger.c libcblas_a-cblas_dger.obj: CBLAS/src/cblas_dger.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dger.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dger.Tpo -c -o libcblas_a-cblas_dger.obj `if test -f 'CBLAS/src/cblas_dger.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dger.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dger.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dger.Tpo $(DEPDIR)/libcblas_a-cblas_dger.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dger.c' object='libcblas_a-cblas_dger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dger.obj `if test -f 'CBLAS/src/cblas_dger.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dger.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dger.c'; fi` libcblas_a-cblas_sdsdot.o: CBLAS/src/cblas_sdsdot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sdsdot.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sdsdot.Tpo -c -o libcblas_a-cblas_sdsdot.o `test -f 'CBLAS/src/cblas_sdsdot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sdsdot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sdsdot.Tpo $(DEPDIR)/libcblas_a-cblas_sdsdot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sdsdot.c' object='libcblas_a-cblas_sdsdot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sdsdot.o `test -f 'CBLAS/src/cblas_sdsdot.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sdsdot.c libcblas_a-cblas_sdsdot.obj: CBLAS/src/cblas_sdsdot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sdsdot.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sdsdot.Tpo -c -o libcblas_a-cblas_sdsdot.obj `if test -f 'CBLAS/src/cblas_sdsdot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sdsdot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sdsdot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sdsdot.Tpo $(DEPDIR)/libcblas_a-cblas_sdsdot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sdsdot.c' object='libcblas_a-cblas_sdsdot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sdsdot.obj `if test -f 'CBLAS/src/cblas_sdsdot.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sdsdot.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sdsdot.c'; fi` libcblas_a-cblas_zhemm.o: CBLAS/src/cblas_zhemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhemm.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhemm.Tpo -c -o libcblas_a-cblas_zhemm.o `test -f 'CBLAS/src/cblas_zhemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhemm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhemm.Tpo $(DEPDIR)/libcblas_a-cblas_zhemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhemm.c' object='libcblas_a-cblas_zhemm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhemm.o `test -f 'CBLAS/src/cblas_zhemm.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhemm.c libcblas_a-cblas_zhemm.obj: CBLAS/src/cblas_zhemm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhemm.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhemm.Tpo -c -o libcblas_a-cblas_zhemm.obj `if test -f 'CBLAS/src/cblas_zhemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhemm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhemm.Tpo $(DEPDIR)/libcblas_a-cblas_zhemm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhemm.c' object='libcblas_a-cblas_zhemm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhemm.obj `if test -f 'CBLAS/src/cblas_zhemm.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhemm.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhemm.c'; fi` libcblas_a-cblas_dnrm2.o: CBLAS/src/cblas_dnrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dnrm2.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dnrm2.Tpo -c -o libcblas_a-cblas_dnrm2.o `test -f 'CBLAS/src/cblas_dnrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dnrm2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dnrm2.Tpo $(DEPDIR)/libcblas_a-cblas_dnrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dnrm2.c' object='libcblas_a-cblas_dnrm2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dnrm2.o `test -f 'CBLAS/src/cblas_dnrm2.c' || echo '$(srcdir)/'`CBLAS/src/cblas_dnrm2.c libcblas_a-cblas_dnrm2.obj: CBLAS/src/cblas_dnrm2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_dnrm2.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_dnrm2.Tpo -c -o libcblas_a-cblas_dnrm2.obj `if test -f 'CBLAS/src/cblas_dnrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dnrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dnrm2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_dnrm2.Tpo $(DEPDIR)/libcblas_a-cblas_dnrm2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_dnrm2.c' object='libcblas_a-cblas_dnrm2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_dnrm2.obj `if test -f 'CBLAS/src/cblas_dnrm2.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_dnrm2.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_dnrm2.c'; fi` libcblas_a-cblas_sgbmv.o: CBLAS/src/cblas_sgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sgbmv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sgbmv.Tpo -c -o libcblas_a-cblas_sgbmv.o `test -f 'CBLAS/src/cblas_sgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sgbmv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_sgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sgbmv.c' object='libcblas_a-cblas_sgbmv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sgbmv.o `test -f 'CBLAS/src/cblas_sgbmv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_sgbmv.c libcblas_a-cblas_sgbmv.obj: CBLAS/src/cblas_sgbmv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_sgbmv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_sgbmv.Tpo -c -o libcblas_a-cblas_sgbmv.obj `if test -f 'CBLAS/src/cblas_sgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sgbmv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_sgbmv.Tpo $(DEPDIR)/libcblas_a-cblas_sgbmv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_sgbmv.c' object='libcblas_a-cblas_sgbmv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_sgbmv.obj `if test -f 'CBLAS/src/cblas_sgbmv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_sgbmv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_sgbmv.c'; fi` libcblas_a-cblas_zhemv.o: CBLAS/src/cblas_zhemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhemv.o -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhemv.Tpo -c -o libcblas_a-cblas_zhemv.o `test -f 'CBLAS/src/cblas_zhemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhemv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhemv.Tpo $(DEPDIR)/libcblas_a-cblas_zhemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhemv.c' object='libcblas_a-cblas_zhemv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhemv.o `test -f 'CBLAS/src/cblas_zhemv.c' || echo '$(srcdir)/'`CBLAS/src/cblas_zhemv.c libcblas_a-cblas_zhemv.obj: CBLAS/src/cblas_zhemv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -MT libcblas_a-cblas_zhemv.obj -MD -MP -MF $(DEPDIR)/libcblas_a-cblas_zhemv.Tpo -c -o libcblas_a-cblas_zhemv.obj `if test -f 'CBLAS/src/cblas_zhemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhemv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcblas_a-cblas_zhemv.Tpo $(DEPDIR)/libcblas_a-cblas_zhemv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='CBLAS/src/cblas_zhemv.c' object='libcblas_a-cblas_zhemv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcblas_a_CFLAGS) $(CFLAGS) -c -o libcblas_a-cblas_zhemv.obj `if test -f 'CBLAS/src/cblas_zhemv.c'; then $(CYGPATH_W) 'CBLAS/src/cblas_zhemv.c'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cblas_zhemv.c'; fi` .f.o: $(AM_V_F77)$(F77COMPILE) -c -o $@ $< .f.obj: $(AM_V_F77)$(F77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` cdotcsub.o: CBLAS/src/cdotcsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotcsub.o `test -f 'CBLAS/src/cdotcsub.f' || echo '$(srcdir)/'`CBLAS/src/cdotcsub.f cdotcsub.obj: CBLAS/src/cdotcsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotcsub.obj `if test -f 'CBLAS/src/cdotcsub.f'; then $(CYGPATH_W) 'CBLAS/src/cdotcsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cdotcsub.f'; fi` cdotusub.o: CBLAS/src/cdotusub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotusub.o `test -f 'CBLAS/src/cdotusub.f' || echo '$(srcdir)/'`CBLAS/src/cdotusub.f cdotusub.obj: CBLAS/src/cdotusub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotusub.obj `if test -f 'CBLAS/src/cdotusub.f'; then $(CYGPATH_W) 'CBLAS/src/cdotusub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/cdotusub.f'; fi` dasumsub.o: CBLAS/src/dasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dasumsub.o `test -f 'CBLAS/src/dasumsub.f' || echo '$(srcdir)/'`CBLAS/src/dasumsub.f dasumsub.obj: CBLAS/src/dasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dasumsub.obj `if test -f 'CBLAS/src/dasumsub.f'; then $(CYGPATH_W) 'CBLAS/src/dasumsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/dasumsub.f'; fi` ddotsub.o: CBLAS/src/ddotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ddotsub.o `test -f 'CBLAS/src/ddotsub.f' || echo '$(srcdir)/'`CBLAS/src/ddotsub.f ddotsub.obj: CBLAS/src/ddotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ddotsub.obj `if test -f 'CBLAS/src/ddotsub.f'; then $(CYGPATH_W) 'CBLAS/src/ddotsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/ddotsub.f'; fi` dnrm2sub.o: CBLAS/src/dnrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dnrm2sub.o `test -f 'CBLAS/src/dnrm2sub.f' || echo '$(srcdir)/'`CBLAS/src/dnrm2sub.f dnrm2sub.obj: CBLAS/src/dnrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dnrm2sub.obj `if test -f 'CBLAS/src/dnrm2sub.f'; then $(CYGPATH_W) 'CBLAS/src/dnrm2sub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/dnrm2sub.f'; fi` dsdotsub.o: CBLAS/src/dsdotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsdotsub.o `test -f 'CBLAS/src/dsdotsub.f' || echo '$(srcdir)/'`CBLAS/src/dsdotsub.f dsdotsub.obj: CBLAS/src/dsdotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsdotsub.obj `if test -f 'CBLAS/src/dsdotsub.f'; then $(CYGPATH_W) 'CBLAS/src/dsdotsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/dsdotsub.f'; fi` dzasumsub.o: CBLAS/src/dzasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dzasumsub.o `test -f 'CBLAS/src/dzasumsub.f' || echo '$(srcdir)/'`CBLAS/src/dzasumsub.f dzasumsub.obj: CBLAS/src/dzasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dzasumsub.obj `if test -f 'CBLAS/src/dzasumsub.f'; then $(CYGPATH_W) 'CBLAS/src/dzasumsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/dzasumsub.f'; fi` dznrm2sub.o: CBLAS/src/dznrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dznrm2sub.o `test -f 'CBLAS/src/dznrm2sub.f' || echo '$(srcdir)/'`CBLAS/src/dznrm2sub.f dznrm2sub.obj: CBLAS/src/dznrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dznrm2sub.obj `if test -f 'CBLAS/src/dznrm2sub.f'; then $(CYGPATH_W) 'CBLAS/src/dznrm2sub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/dznrm2sub.f'; fi` icamaxsub.o: CBLAS/src/icamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o icamaxsub.o `test -f 'CBLAS/src/icamaxsub.f' || echo '$(srcdir)/'`CBLAS/src/icamaxsub.f icamaxsub.obj: CBLAS/src/icamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o icamaxsub.obj `if test -f 'CBLAS/src/icamaxsub.f'; then $(CYGPATH_W) 'CBLAS/src/icamaxsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/icamaxsub.f'; fi` idamaxsub.o: CBLAS/src/idamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o idamaxsub.o `test -f 'CBLAS/src/idamaxsub.f' || echo '$(srcdir)/'`CBLAS/src/idamaxsub.f idamaxsub.obj: CBLAS/src/idamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o idamaxsub.obj `if test -f 'CBLAS/src/idamaxsub.f'; then $(CYGPATH_W) 'CBLAS/src/idamaxsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/idamaxsub.f'; fi` isamaxsub.o: CBLAS/src/isamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o isamaxsub.o `test -f 'CBLAS/src/isamaxsub.f' || echo '$(srcdir)/'`CBLAS/src/isamaxsub.f isamaxsub.obj: CBLAS/src/isamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o isamaxsub.obj `if test -f 'CBLAS/src/isamaxsub.f'; then $(CYGPATH_W) 'CBLAS/src/isamaxsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/isamaxsub.f'; fi` izamaxsub.o: CBLAS/src/izamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o izamaxsub.o `test -f 'CBLAS/src/izamaxsub.f' || echo '$(srcdir)/'`CBLAS/src/izamaxsub.f izamaxsub.obj: CBLAS/src/izamaxsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o izamaxsub.obj `if test -f 'CBLAS/src/izamaxsub.f'; then $(CYGPATH_W) 'CBLAS/src/izamaxsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/izamaxsub.f'; fi` sasumsub.o: CBLAS/src/sasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sasumsub.o `test -f 'CBLAS/src/sasumsub.f' || echo '$(srcdir)/'`CBLAS/src/sasumsub.f sasumsub.obj: CBLAS/src/sasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sasumsub.obj `if test -f 'CBLAS/src/sasumsub.f'; then $(CYGPATH_W) 'CBLAS/src/sasumsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/sasumsub.f'; fi` scasumsub.o: CBLAS/src/scasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scasumsub.o `test -f 'CBLAS/src/scasumsub.f' || echo '$(srcdir)/'`CBLAS/src/scasumsub.f scasumsub.obj: CBLAS/src/scasumsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scasumsub.obj `if test -f 'CBLAS/src/scasumsub.f'; then $(CYGPATH_W) 'CBLAS/src/scasumsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/scasumsub.f'; fi` scnrm2sub.o: CBLAS/src/scnrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scnrm2sub.o `test -f 'CBLAS/src/scnrm2sub.f' || echo '$(srcdir)/'`CBLAS/src/scnrm2sub.f scnrm2sub.obj: CBLAS/src/scnrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scnrm2sub.obj `if test -f 'CBLAS/src/scnrm2sub.f'; then $(CYGPATH_W) 'CBLAS/src/scnrm2sub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/scnrm2sub.f'; fi` sdotsub.o: CBLAS/src/sdotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdotsub.o `test -f 'CBLAS/src/sdotsub.f' || echo '$(srcdir)/'`CBLAS/src/sdotsub.f sdotsub.obj: CBLAS/src/sdotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdotsub.obj `if test -f 'CBLAS/src/sdotsub.f'; then $(CYGPATH_W) 'CBLAS/src/sdotsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/sdotsub.f'; fi` sdsdotsub.o: CBLAS/src/sdsdotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdsdotsub.o `test -f 'CBLAS/src/sdsdotsub.f' || echo '$(srcdir)/'`CBLAS/src/sdsdotsub.f sdsdotsub.obj: CBLAS/src/sdsdotsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdsdotsub.obj `if test -f 'CBLAS/src/sdsdotsub.f'; then $(CYGPATH_W) 'CBLAS/src/sdsdotsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/sdsdotsub.f'; fi` snrm2sub.o: CBLAS/src/snrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o snrm2sub.o `test -f 'CBLAS/src/snrm2sub.f' || echo '$(srcdir)/'`CBLAS/src/snrm2sub.f snrm2sub.obj: CBLAS/src/snrm2sub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o snrm2sub.obj `if test -f 'CBLAS/src/snrm2sub.f'; then $(CYGPATH_W) 'CBLAS/src/snrm2sub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/snrm2sub.f'; fi` zdotcsub.o: CBLAS/src/zdotcsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotcsub.o `test -f 'CBLAS/src/zdotcsub.f' || echo '$(srcdir)/'`CBLAS/src/zdotcsub.f zdotcsub.obj: CBLAS/src/zdotcsub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotcsub.obj `if test -f 'CBLAS/src/zdotcsub.f'; then $(CYGPATH_W) 'CBLAS/src/zdotcsub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/zdotcsub.f'; fi` zdotusub.o: CBLAS/src/zdotusub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotusub.o `test -f 'CBLAS/src/zdotusub.f' || echo '$(srcdir)/'`CBLAS/src/zdotusub.f zdotusub.obj: CBLAS/src/zdotusub.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotusub.obj `if test -f 'CBLAS/src/zdotusub.f'; then $(CYGPATH_W) 'CBLAS/src/zdotusub.f'; else $(CYGPATH_W) '$(srcdir)/CBLAS/src/zdotusub.f'; fi` caxpy.o: BLAS/caxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o caxpy.o `test -f 'BLAS/caxpy.f' || echo '$(srcdir)/'`BLAS/caxpy.f caxpy.obj: BLAS/caxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o caxpy.obj `if test -f 'BLAS/caxpy.f'; then $(CYGPATH_W) 'BLAS/caxpy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/caxpy.f'; fi` crotg.o: BLAS/crotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o crotg.o `test -f 'BLAS/crotg.f' || echo '$(srcdir)/'`BLAS/crotg.f crotg.obj: BLAS/crotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o crotg.obj `if test -f 'BLAS/crotg.f'; then $(CYGPATH_W) 'BLAS/crotg.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/crotg.f'; fi` dcopy.o: BLAS/dcopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dcopy.o `test -f 'BLAS/dcopy.f' || echo '$(srcdir)/'`BLAS/dcopy.f dcopy.obj: BLAS/dcopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dcopy.obj `if test -f 'BLAS/dcopy.f'; then $(CYGPATH_W) 'BLAS/dcopy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dcopy.f'; fi` dsymv.o: BLAS/dsymv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsymv.o `test -f 'BLAS/dsymv.f' || echo '$(srcdir)/'`BLAS/dsymv.f dsymv.obj: BLAS/dsymv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsymv.obj `if test -f 'BLAS/dsymv.f'; then $(CYGPATH_W) 'BLAS/dsymv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsymv.f'; fi` lsame.o: BLAS/lsame.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o lsame.o `test -f 'BLAS/lsame.f' || echo '$(srcdir)/'`BLAS/lsame.f lsame.obj: BLAS/lsame.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o lsame.obj `if test -f 'BLAS/lsame.f'; then $(CYGPATH_W) 'BLAS/lsame.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/lsame.f'; fi` sspmv.o: BLAS/sspmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sspmv.o `test -f 'BLAS/sspmv.f' || echo '$(srcdir)/'`BLAS/sspmv.f sspmv.obj: BLAS/sspmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sspmv.obj `if test -f 'BLAS/sspmv.f'; then $(CYGPATH_W) 'BLAS/sspmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sspmv.f'; fi` zaxpy.o: BLAS/zaxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zaxpy.o `test -f 'BLAS/zaxpy.f' || echo '$(srcdir)/'`BLAS/zaxpy.f zaxpy.obj: BLAS/zaxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zaxpy.obj `if test -f 'BLAS/zaxpy.f'; then $(CYGPATH_W) 'BLAS/zaxpy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zaxpy.f'; fi` zhpr2.o: BLAS/zhpr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhpr2.o `test -f 'BLAS/zhpr2.f' || echo '$(srcdir)/'`BLAS/zhpr2.f zhpr2.obj: BLAS/zhpr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhpr2.obj `if test -f 'BLAS/zhpr2.f'; then $(CYGPATH_W) 'BLAS/zhpr2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zhpr2.f'; fi` ccopy.o: BLAS/ccopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ccopy.o `test -f 'BLAS/ccopy.f' || echo '$(srcdir)/'`BLAS/ccopy.f ccopy.obj: BLAS/ccopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ccopy.obj `if test -f 'BLAS/ccopy.f'; then $(CYGPATH_W) 'BLAS/ccopy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ccopy.f'; fi` cscal.o: BLAS/cscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cscal.o `test -f 'BLAS/cscal.f' || echo '$(srcdir)/'`BLAS/cscal.f cscal.obj: BLAS/cscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cscal.obj `if test -f 'BLAS/cscal.f'; then $(CYGPATH_W) 'BLAS/cscal.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cscal.f'; fi` ddot.o: BLAS/ddot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ddot.o `test -f 'BLAS/ddot.f' || echo '$(srcdir)/'`BLAS/ddot.f ddot.obj: BLAS/ddot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ddot.obj `if test -f 'BLAS/ddot.f'; then $(CYGPATH_W) 'BLAS/ddot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ddot.f'; fi` dsyr2.o: BLAS/dsyr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyr2.o `test -f 'BLAS/dsyr2.f' || echo '$(srcdir)/'`BLAS/dsyr2.f dsyr2.obj: BLAS/dsyr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyr2.obj `if test -f 'BLAS/dsyr2.f'; then $(CYGPATH_W) 'BLAS/dsyr2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsyr2.f'; fi` sasum.o: BLAS/sasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sasum.o `test -f 'BLAS/sasum.f' || echo '$(srcdir)/'`BLAS/sasum.f sasum.obj: BLAS/sasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sasum.obj `if test -f 'BLAS/sasum.f'; then $(CYGPATH_W) 'BLAS/sasum.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sasum.f'; fi` sspr2.o: BLAS/sspr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sspr2.o `test -f 'BLAS/sspr2.f' || echo '$(srcdir)/'`BLAS/sspr2.f sspr2.obj: BLAS/sspr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sspr2.obj `if test -f 'BLAS/sspr2.f'; then $(CYGPATH_W) 'BLAS/sspr2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sspr2.f'; fi` zcopy.o: BLAS/zcopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zcopy.o `test -f 'BLAS/zcopy.f' || echo '$(srcdir)/'`BLAS/zcopy.f zcopy.obj: BLAS/zcopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zcopy.obj `if test -f 'BLAS/zcopy.f'; then $(CYGPATH_W) 'BLAS/zcopy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zcopy.f'; fi` zhpr.o: BLAS/zhpr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhpr.o `test -f 'BLAS/zhpr.f' || echo '$(srcdir)/'`BLAS/zhpr.f zhpr.obj: BLAS/zhpr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhpr.obj `if test -f 'BLAS/zhpr.f'; then $(CYGPATH_W) 'BLAS/zhpr.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zhpr.f'; fi` cdotc.o: BLAS/cdotc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotc.o `test -f 'BLAS/cdotc.f' || echo '$(srcdir)/'`BLAS/cdotc.f cdotc.obj: BLAS/cdotc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotc.obj `if test -f 'BLAS/cdotc.f'; then $(CYGPATH_W) 'BLAS/cdotc.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cdotc.f'; fi` csrot.o: BLAS/csrot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csrot.o `test -f 'BLAS/csrot.f' || echo '$(srcdir)/'`BLAS/csrot.f csrot.obj: BLAS/csrot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csrot.obj `if test -f 'BLAS/csrot.f'; then $(CYGPATH_W) 'BLAS/csrot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/csrot.f'; fi` dgbmv.o: BLAS/dgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dgbmv.o `test -f 'BLAS/dgbmv.f' || echo '$(srcdir)/'`BLAS/dgbmv.f dgbmv.obj: BLAS/dgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dgbmv.obj `if test -f 'BLAS/dgbmv.f'; then $(CYGPATH_W) 'BLAS/dgbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dgbmv.f'; fi` dsyr2k.o: BLAS/dsyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyr2k.o `test -f 'BLAS/dsyr2k.f' || echo '$(srcdir)/'`BLAS/dsyr2k.f dsyr2k.obj: BLAS/dsyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyr2k.obj `if test -f 'BLAS/dsyr2k.f'; then $(CYGPATH_W) 'BLAS/dsyr2k.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsyr2k.f'; fi` saxpy.o: BLAS/saxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o saxpy.o `test -f 'BLAS/saxpy.f' || echo '$(srcdir)/'`BLAS/saxpy.f saxpy.obj: BLAS/saxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o saxpy.obj `if test -f 'BLAS/saxpy.f'; then $(CYGPATH_W) 'BLAS/saxpy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/saxpy.f'; fi` sspr.o: BLAS/sspr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sspr.o `test -f 'BLAS/sspr.f' || echo '$(srcdir)/'`BLAS/sspr.f sspr.obj: BLAS/sspr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sspr.obj `if test -f 'BLAS/sspr.f'; then $(CYGPATH_W) 'BLAS/sspr.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sspr.f'; fi` zdotc.o: BLAS/zdotc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotc.o `test -f 'BLAS/zdotc.f' || echo '$(srcdir)/'`BLAS/zdotc.f zdotc.obj: BLAS/zdotc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotc.obj `if test -f 'BLAS/zdotc.f'; then $(CYGPATH_W) 'BLAS/zdotc.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zdotc.f'; fi` zrotg.o: BLAS/zrotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zrotg.o `test -f 'BLAS/zrotg.f' || echo '$(srcdir)/'`BLAS/zrotg.f zrotg.obj: BLAS/zrotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zrotg.obj `if test -f 'BLAS/zrotg.f'; then $(CYGPATH_W) 'BLAS/zrotg.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zrotg.f'; fi` cdotu.o: BLAS/cdotu.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotu.o `test -f 'BLAS/cdotu.f' || echo '$(srcdir)/'`BLAS/cdotu.f cdotu.obj: BLAS/cdotu.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cdotu.obj `if test -f 'BLAS/cdotu.f'; then $(CYGPATH_W) 'BLAS/cdotu.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cdotu.f'; fi` csscal.o: BLAS/csscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csscal.o `test -f 'BLAS/csscal.f' || echo '$(srcdir)/'`BLAS/csscal.f csscal.obj: BLAS/csscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csscal.obj `if test -f 'BLAS/csscal.f'; then $(CYGPATH_W) 'BLAS/csscal.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/csscal.f'; fi` dgemm.o: BLAS/dgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dgemm.o `test -f 'BLAS/dgemm.f' || echo '$(srcdir)/'`BLAS/dgemm.f dgemm.obj: BLAS/dgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dgemm.obj `if test -f 'BLAS/dgemm.f'; then $(CYGPATH_W) 'BLAS/dgemm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dgemm.f'; fi` dsyr.o: BLAS/dsyr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyr.o `test -f 'BLAS/dsyr.f' || echo '$(srcdir)/'`BLAS/dsyr.f dsyr.obj: BLAS/dsyr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyr.obj `if test -f 'BLAS/dsyr.f'; then $(CYGPATH_W) 'BLAS/dsyr.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsyr.f'; fi` scasum.o: BLAS/scasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scasum.o `test -f 'BLAS/scasum.f' || echo '$(srcdir)/'`BLAS/scasum.f scasum.obj: BLAS/scasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scasum.obj `if test -f 'BLAS/scasum.f'; then $(CYGPATH_W) 'BLAS/scasum.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/scasum.f'; fi` sswap.o: BLAS/sswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sswap.o `test -f 'BLAS/sswap.f' || echo '$(srcdir)/'`BLAS/sswap.f sswap.obj: BLAS/sswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sswap.obj `if test -f 'BLAS/sswap.f'; then $(CYGPATH_W) 'BLAS/sswap.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sswap.f'; fi` zdotu.o: BLAS/zdotu.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotu.o `test -f 'BLAS/zdotu.f' || echo '$(srcdir)/'`BLAS/zdotu.f zdotu.obj: BLAS/zdotu.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdotu.obj `if test -f 'BLAS/zdotu.f'; then $(CYGPATH_W) 'BLAS/zdotu.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zdotu.f'; fi` zscal.o: BLAS/zscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zscal.o `test -f 'BLAS/zscal.f' || echo '$(srcdir)/'`BLAS/zscal.f zscal.obj: BLAS/zscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zscal.obj `if test -f 'BLAS/zscal.f'; then $(CYGPATH_W) 'BLAS/zscal.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zscal.f'; fi` cgbmv.o: BLAS/cgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgbmv.o `test -f 'BLAS/cgbmv.f' || echo '$(srcdir)/'`BLAS/cgbmv.f cgbmv.obj: BLAS/cgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgbmv.obj `if test -f 'BLAS/cgbmv.f'; then $(CYGPATH_W) 'BLAS/cgbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cgbmv.f'; fi` cswap.o: BLAS/cswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cswap.o `test -f 'BLAS/cswap.f' || echo '$(srcdir)/'`BLAS/cswap.f cswap.obj: BLAS/cswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cswap.obj `if test -f 'BLAS/cswap.f'; then $(CYGPATH_W) 'BLAS/cswap.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cswap.f'; fi` dgemv.o: BLAS/dgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dgemv.o `test -f 'BLAS/dgemv.f' || echo '$(srcdir)/'`BLAS/dgemv.f dgemv.obj: BLAS/dgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dgemv.obj `if test -f 'BLAS/dgemv.f'; then $(CYGPATH_W) 'BLAS/dgemv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dgemv.f'; fi` dsyrk.o: BLAS/dsyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyrk.o `test -f 'BLAS/dsyrk.f' || echo '$(srcdir)/'`BLAS/dsyrk.f dsyrk.obj: BLAS/dsyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsyrk.obj `if test -f 'BLAS/dsyrk.f'; then $(CYGPATH_W) 'BLAS/dsyrk.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsyrk.f'; fi` scnrm2.o: BLAS/scnrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scnrm2.o `test -f 'BLAS/scnrm2.f' || echo '$(srcdir)/'`BLAS/scnrm2.f scnrm2.obj: BLAS/scnrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scnrm2.obj `if test -f 'BLAS/scnrm2.f'; then $(CYGPATH_W) 'BLAS/scnrm2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/scnrm2.f'; fi` ssymm.o: BLAS/ssymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssymm.o `test -f 'BLAS/ssymm.f' || echo '$(srcdir)/'`BLAS/ssymm.f ssymm.obj: BLAS/ssymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssymm.obj `if test -f 'BLAS/ssymm.f'; then $(CYGPATH_W) 'BLAS/ssymm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssymm.f'; fi` zdrot.o: BLAS/zdrot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdrot.o `test -f 'BLAS/zdrot.f' || echo '$(srcdir)/'`BLAS/zdrot.f zdrot.obj: BLAS/zdrot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdrot.obj `if test -f 'BLAS/zdrot.f'; then $(CYGPATH_W) 'BLAS/zdrot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zdrot.f'; fi` zswap.o: BLAS/zswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zswap.o `test -f 'BLAS/zswap.f' || echo '$(srcdir)/'`BLAS/zswap.f zswap.obj: BLAS/zswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zswap.obj `if test -f 'BLAS/zswap.f'; then $(CYGPATH_W) 'BLAS/zswap.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zswap.f'; fi` cgemm.o: BLAS/cgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgemm.o `test -f 'BLAS/cgemm.f' || echo '$(srcdir)/'`BLAS/cgemm.f cgemm.obj: BLAS/cgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgemm.obj `if test -f 'BLAS/cgemm.f'; then $(CYGPATH_W) 'BLAS/cgemm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cgemm.f'; fi` csymm.o: BLAS/csymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csymm.o `test -f 'BLAS/csymm.f' || echo '$(srcdir)/'`BLAS/csymm.f csymm.obj: BLAS/csymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csymm.obj `if test -f 'BLAS/csymm.f'; then $(CYGPATH_W) 'BLAS/csymm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/csymm.f'; fi` dger.o: BLAS/dger.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dger.o `test -f 'BLAS/dger.f' || echo '$(srcdir)/'`BLAS/dger.f dger.obj: BLAS/dger.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dger.obj `if test -f 'BLAS/dger.f'; then $(CYGPATH_W) 'BLAS/dger.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dger.f'; fi` dtbmv.o: BLAS/dtbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtbmv.o `test -f 'BLAS/dtbmv.f' || echo '$(srcdir)/'`BLAS/dtbmv.f dtbmv.obj: BLAS/dtbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtbmv.obj `if test -f 'BLAS/dtbmv.f'; then $(CYGPATH_W) 'BLAS/dtbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtbmv.f'; fi` scopy.o: BLAS/scopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scopy.o `test -f 'BLAS/scopy.f' || echo '$(srcdir)/'`BLAS/scopy.f scopy.obj: BLAS/scopy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o scopy.obj `if test -f 'BLAS/scopy.f'; then $(CYGPATH_W) 'BLAS/scopy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/scopy.f'; fi` ssymv.o: BLAS/ssymv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssymv.o `test -f 'BLAS/ssymv.f' || echo '$(srcdir)/'`BLAS/ssymv.f ssymv.obj: BLAS/ssymv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssymv.obj `if test -f 'BLAS/ssymv.f'; then $(CYGPATH_W) 'BLAS/ssymv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssymv.f'; fi` zdscal.o: BLAS/zdscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdscal.o `test -f 'BLAS/zdscal.f' || echo '$(srcdir)/'`BLAS/zdscal.f zdscal.obj: BLAS/zdscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zdscal.obj `if test -f 'BLAS/zdscal.f'; then $(CYGPATH_W) 'BLAS/zdscal.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zdscal.f'; fi` zsymm.o: BLAS/zsymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zsymm.o `test -f 'BLAS/zsymm.f' || echo '$(srcdir)/'`BLAS/zsymm.f zsymm.obj: BLAS/zsymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zsymm.obj `if test -f 'BLAS/zsymm.f'; then $(CYGPATH_W) 'BLAS/zsymm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zsymm.f'; fi` cgemv.o: BLAS/cgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgemv.o `test -f 'BLAS/cgemv.f' || echo '$(srcdir)/'`BLAS/cgemv.f cgemv.obj: BLAS/cgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgemv.obj `if test -f 'BLAS/cgemv.f'; then $(CYGPATH_W) 'BLAS/cgemv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cgemv.f'; fi` csyr2k.o: BLAS/csyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csyr2k.o `test -f 'BLAS/csyr2k.f' || echo '$(srcdir)/'`BLAS/csyr2k.f csyr2k.obj: BLAS/csyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csyr2k.obj `if test -f 'BLAS/csyr2k.f'; then $(CYGPATH_W) 'BLAS/csyr2k.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/csyr2k.f'; fi` dnrm2.o: BLAS/dnrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dnrm2.o `test -f 'BLAS/dnrm2.f' || echo '$(srcdir)/'`BLAS/dnrm2.f dnrm2.obj: BLAS/dnrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dnrm2.obj `if test -f 'BLAS/dnrm2.f'; then $(CYGPATH_W) 'BLAS/dnrm2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dnrm2.f'; fi` dtbsv.o: BLAS/dtbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtbsv.o `test -f 'BLAS/dtbsv.f' || echo '$(srcdir)/'`BLAS/dtbsv.f dtbsv.obj: BLAS/dtbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtbsv.obj `if test -f 'BLAS/dtbsv.f'; then $(CYGPATH_W) 'BLAS/dtbsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtbsv.f'; fi` sdot.o: BLAS/sdot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdot.o `test -f 'BLAS/sdot.f' || echo '$(srcdir)/'`BLAS/sdot.f sdot.obj: BLAS/sdot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdot.obj `if test -f 'BLAS/sdot.f'; then $(CYGPATH_W) 'BLAS/sdot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sdot.f'; fi` ssyr2.o: BLAS/ssyr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyr2.o `test -f 'BLAS/ssyr2.f' || echo '$(srcdir)/'`BLAS/ssyr2.f ssyr2.obj: BLAS/ssyr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyr2.obj `if test -f 'BLAS/ssyr2.f'; then $(CYGPATH_W) 'BLAS/ssyr2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssyr2.f'; fi` zgbmv.o: BLAS/zgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgbmv.o `test -f 'BLAS/zgbmv.f' || echo '$(srcdir)/'`BLAS/zgbmv.f zgbmv.obj: BLAS/zgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgbmv.obj `if test -f 'BLAS/zgbmv.f'; then $(CYGPATH_W) 'BLAS/zgbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zgbmv.f'; fi` zsyr2k.o: BLAS/zsyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zsyr2k.o `test -f 'BLAS/zsyr2k.f' || echo '$(srcdir)/'`BLAS/zsyr2k.f zsyr2k.obj: BLAS/zsyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zsyr2k.obj `if test -f 'BLAS/zsyr2k.f'; then $(CYGPATH_W) 'BLAS/zsyr2k.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zsyr2k.f'; fi` cgerc.o: BLAS/cgerc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgerc.o `test -f 'BLAS/cgerc.f' || echo '$(srcdir)/'`BLAS/cgerc.f cgerc.obj: BLAS/cgerc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgerc.obj `if test -f 'BLAS/cgerc.f'; then $(CYGPATH_W) 'BLAS/cgerc.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cgerc.f'; fi` csyrk.o: BLAS/csyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csyrk.o `test -f 'BLAS/csyrk.f' || echo '$(srcdir)/'`BLAS/csyrk.f csyrk.obj: BLAS/csyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o csyrk.obj `if test -f 'BLAS/csyrk.f'; then $(CYGPATH_W) 'BLAS/csyrk.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/csyrk.f'; fi` drot.o: BLAS/drot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drot.o `test -f 'BLAS/drot.f' || echo '$(srcdir)/'`BLAS/drot.f drot.obj: BLAS/drot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drot.obj `if test -f 'BLAS/drot.f'; then $(CYGPATH_W) 'BLAS/drot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/drot.f'; fi` dtpmv.o: BLAS/dtpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtpmv.o `test -f 'BLAS/dtpmv.f' || echo '$(srcdir)/'`BLAS/dtpmv.f dtpmv.obj: BLAS/dtpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtpmv.obj `if test -f 'BLAS/dtpmv.f'; then $(CYGPATH_W) 'BLAS/dtpmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtpmv.f'; fi` sdsdot.o: BLAS/sdsdot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdsdot.o `test -f 'BLAS/sdsdot.f' || echo '$(srcdir)/'`BLAS/sdsdot.f sdsdot.obj: BLAS/sdsdot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sdsdot.obj `if test -f 'BLAS/sdsdot.f'; then $(CYGPATH_W) 'BLAS/sdsdot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sdsdot.f'; fi` ssyr2k.o: BLAS/ssyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyr2k.o `test -f 'BLAS/ssyr2k.f' || echo '$(srcdir)/'`BLAS/ssyr2k.f ssyr2k.obj: BLAS/ssyr2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyr2k.obj `if test -f 'BLAS/ssyr2k.f'; then $(CYGPATH_W) 'BLAS/ssyr2k.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssyr2k.f'; fi` zgemm.o: BLAS/zgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgemm.o `test -f 'BLAS/zgemm.f' || echo '$(srcdir)/'`BLAS/zgemm.f zgemm.obj: BLAS/zgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgemm.obj `if test -f 'BLAS/zgemm.f'; then $(CYGPATH_W) 'BLAS/zgemm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zgemm.f'; fi` zsyrk.o: BLAS/zsyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zsyrk.o `test -f 'BLAS/zsyrk.f' || echo '$(srcdir)/'`BLAS/zsyrk.f zsyrk.obj: BLAS/zsyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zsyrk.obj `if test -f 'BLAS/zsyrk.f'; then $(CYGPATH_W) 'BLAS/zsyrk.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zsyrk.f'; fi` cgeru.o: BLAS/cgeru.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgeru.o `test -f 'BLAS/cgeru.f' || echo '$(srcdir)/'`BLAS/cgeru.f cgeru.obj: BLAS/cgeru.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cgeru.obj `if test -f 'BLAS/cgeru.f'; then $(CYGPATH_W) 'BLAS/cgeru.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cgeru.f'; fi` ctbmv.o: BLAS/ctbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctbmv.o `test -f 'BLAS/ctbmv.f' || echo '$(srcdir)/'`BLAS/ctbmv.f ctbmv.obj: BLAS/ctbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctbmv.obj `if test -f 'BLAS/ctbmv.f'; then $(CYGPATH_W) 'BLAS/ctbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctbmv.f'; fi` drotg.o: BLAS/drotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drotg.o `test -f 'BLAS/drotg.f' || echo '$(srcdir)/'`BLAS/drotg.f drotg.obj: BLAS/drotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drotg.obj `if test -f 'BLAS/drotg.f'; then $(CYGPATH_W) 'BLAS/drotg.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/drotg.f'; fi` dtpsv.o: BLAS/dtpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtpsv.o `test -f 'BLAS/dtpsv.f' || echo '$(srcdir)/'`BLAS/dtpsv.f dtpsv.obj: BLAS/dtpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtpsv.obj `if test -f 'BLAS/dtpsv.f'; then $(CYGPATH_W) 'BLAS/dtpsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtpsv.f'; fi` sgbmv.o: BLAS/sgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sgbmv.o `test -f 'BLAS/sgbmv.f' || echo '$(srcdir)/'`BLAS/sgbmv.f sgbmv.obj: BLAS/sgbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sgbmv.obj `if test -f 'BLAS/sgbmv.f'; then $(CYGPATH_W) 'BLAS/sgbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sgbmv.f'; fi` ssyr.o: BLAS/ssyr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyr.o `test -f 'BLAS/ssyr.f' || echo '$(srcdir)/'`BLAS/ssyr.f ssyr.obj: BLAS/ssyr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyr.obj `if test -f 'BLAS/ssyr.f'; then $(CYGPATH_W) 'BLAS/ssyr.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssyr.f'; fi` zgemv.o: BLAS/zgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgemv.o `test -f 'BLAS/zgemv.f' || echo '$(srcdir)/'`BLAS/zgemv.f zgemv.obj: BLAS/zgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgemv.obj `if test -f 'BLAS/zgemv.f'; then $(CYGPATH_W) 'BLAS/zgemv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zgemv.f'; fi` ztbmv.o: BLAS/ztbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztbmv.o `test -f 'BLAS/ztbmv.f' || echo '$(srcdir)/'`BLAS/ztbmv.f ztbmv.obj: BLAS/ztbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztbmv.obj `if test -f 'BLAS/ztbmv.f'; then $(CYGPATH_W) 'BLAS/ztbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztbmv.f'; fi` chbmv.o: BLAS/chbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chbmv.o `test -f 'BLAS/chbmv.f' || echo '$(srcdir)/'`BLAS/chbmv.f chbmv.obj: BLAS/chbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chbmv.obj `if test -f 'BLAS/chbmv.f'; then $(CYGPATH_W) 'BLAS/chbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/chbmv.f'; fi` ctbsv.o: BLAS/ctbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctbsv.o `test -f 'BLAS/ctbsv.f' || echo '$(srcdir)/'`BLAS/ctbsv.f ctbsv.obj: BLAS/ctbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctbsv.obj `if test -f 'BLAS/ctbsv.f'; then $(CYGPATH_W) 'BLAS/ctbsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctbsv.f'; fi` drotm.o: BLAS/drotm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drotm.o `test -f 'BLAS/drotm.f' || echo '$(srcdir)/'`BLAS/drotm.f drotm.obj: BLAS/drotm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drotm.obj `if test -f 'BLAS/drotm.f'; then $(CYGPATH_W) 'BLAS/drotm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/drotm.f'; fi` dtrmm.o: BLAS/dtrmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrmm.o `test -f 'BLAS/dtrmm.f' || echo '$(srcdir)/'`BLAS/dtrmm.f dtrmm.obj: BLAS/dtrmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrmm.obj `if test -f 'BLAS/dtrmm.f'; then $(CYGPATH_W) 'BLAS/dtrmm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtrmm.f'; fi` sgemm.o: BLAS/sgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sgemm.o `test -f 'BLAS/sgemm.f' || echo '$(srcdir)/'`BLAS/sgemm.f sgemm.obj: BLAS/sgemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sgemm.obj `if test -f 'BLAS/sgemm.f'; then $(CYGPATH_W) 'BLAS/sgemm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sgemm.f'; fi` ssyrk.o: BLAS/ssyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyrk.o `test -f 'BLAS/ssyrk.f' || echo '$(srcdir)/'`BLAS/ssyrk.f ssyrk.obj: BLAS/ssyrk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssyrk.obj `if test -f 'BLAS/ssyrk.f'; then $(CYGPATH_W) 'BLAS/ssyrk.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssyrk.f'; fi` zgerc.o: BLAS/zgerc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgerc.o `test -f 'BLAS/zgerc.f' || echo '$(srcdir)/'`BLAS/zgerc.f zgerc.obj: BLAS/zgerc.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgerc.obj `if test -f 'BLAS/zgerc.f'; then $(CYGPATH_W) 'BLAS/zgerc.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zgerc.f'; fi` ztbsv.o: BLAS/ztbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztbsv.o `test -f 'BLAS/ztbsv.f' || echo '$(srcdir)/'`BLAS/ztbsv.f ztbsv.obj: BLAS/ztbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztbsv.obj `if test -f 'BLAS/ztbsv.f'; then $(CYGPATH_W) 'BLAS/ztbsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztbsv.f'; fi` chemm.o: BLAS/chemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chemm.o `test -f 'BLAS/chemm.f' || echo '$(srcdir)/'`BLAS/chemm.f chemm.obj: BLAS/chemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chemm.obj `if test -f 'BLAS/chemm.f'; then $(CYGPATH_W) 'BLAS/chemm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/chemm.f'; fi` ctpmv.o: BLAS/ctpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctpmv.o `test -f 'BLAS/ctpmv.f' || echo '$(srcdir)/'`BLAS/ctpmv.f ctpmv.obj: BLAS/ctpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctpmv.obj `if test -f 'BLAS/ctpmv.f'; then $(CYGPATH_W) 'BLAS/ctpmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctpmv.f'; fi` drotmg.o: BLAS/drotmg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drotmg.o `test -f 'BLAS/drotmg.f' || echo '$(srcdir)/'`BLAS/drotmg.f drotmg.obj: BLAS/drotmg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o drotmg.obj `if test -f 'BLAS/drotmg.f'; then $(CYGPATH_W) 'BLAS/drotmg.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/drotmg.f'; fi` dtrmv.o: BLAS/dtrmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrmv.o `test -f 'BLAS/dtrmv.f' || echo '$(srcdir)/'`BLAS/dtrmv.f dtrmv.obj: BLAS/dtrmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrmv.obj `if test -f 'BLAS/dtrmv.f'; then $(CYGPATH_W) 'BLAS/dtrmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtrmv.f'; fi` sgemv.o: BLAS/sgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sgemv.o `test -f 'BLAS/sgemv.f' || echo '$(srcdir)/'`BLAS/sgemv.f sgemv.obj: BLAS/sgemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sgemv.obj `if test -f 'BLAS/sgemv.f'; then $(CYGPATH_W) 'BLAS/sgemv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sgemv.f'; fi` stbmv.o: BLAS/stbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stbmv.o `test -f 'BLAS/stbmv.f' || echo '$(srcdir)/'`BLAS/stbmv.f stbmv.obj: BLAS/stbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stbmv.obj `if test -f 'BLAS/stbmv.f'; then $(CYGPATH_W) 'BLAS/stbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/stbmv.f'; fi` zgeru.o: BLAS/zgeru.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgeru.o `test -f 'BLAS/zgeru.f' || echo '$(srcdir)/'`BLAS/zgeru.f zgeru.obj: BLAS/zgeru.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zgeru.obj `if test -f 'BLAS/zgeru.f'; then $(CYGPATH_W) 'BLAS/zgeru.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zgeru.f'; fi` ztpmv.o: BLAS/ztpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztpmv.o `test -f 'BLAS/ztpmv.f' || echo '$(srcdir)/'`BLAS/ztpmv.f ztpmv.obj: BLAS/ztpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztpmv.obj `if test -f 'BLAS/ztpmv.f'; then $(CYGPATH_W) 'BLAS/ztpmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztpmv.f'; fi` chemv.o: BLAS/chemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chemv.o `test -f 'BLAS/chemv.f' || echo '$(srcdir)/'`BLAS/chemv.f chemv.obj: BLAS/chemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chemv.obj `if test -f 'BLAS/chemv.f'; then $(CYGPATH_W) 'BLAS/chemv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/chemv.f'; fi` ctpsv.o: BLAS/ctpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctpsv.o `test -f 'BLAS/ctpsv.f' || echo '$(srcdir)/'`BLAS/ctpsv.f ctpsv.obj: BLAS/ctpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctpsv.obj `if test -f 'BLAS/ctpsv.f'; then $(CYGPATH_W) 'BLAS/ctpsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctpsv.f'; fi` dsbmv.o: BLAS/dsbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsbmv.o `test -f 'BLAS/dsbmv.f' || echo '$(srcdir)/'`BLAS/dsbmv.f dsbmv.obj: BLAS/dsbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsbmv.obj `if test -f 'BLAS/dsbmv.f'; then $(CYGPATH_W) 'BLAS/dsbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsbmv.f'; fi` dtrsm.o: BLAS/dtrsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrsm.o `test -f 'BLAS/dtrsm.f' || echo '$(srcdir)/'`BLAS/dtrsm.f dtrsm.obj: BLAS/dtrsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrsm.obj `if test -f 'BLAS/dtrsm.f'; then $(CYGPATH_W) 'BLAS/dtrsm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtrsm.f'; fi` sger.o: BLAS/sger.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sger.o `test -f 'BLAS/sger.f' || echo '$(srcdir)/'`BLAS/sger.f sger.obj: BLAS/sger.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sger.obj `if test -f 'BLAS/sger.f'; then $(CYGPATH_W) 'BLAS/sger.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sger.f'; fi` stbsv.o: BLAS/stbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stbsv.o `test -f 'BLAS/stbsv.f' || echo '$(srcdir)/'`BLAS/stbsv.f stbsv.obj: BLAS/stbsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stbsv.obj `if test -f 'BLAS/stbsv.f'; then $(CYGPATH_W) 'BLAS/stbsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/stbsv.f'; fi` zhbmv.o: BLAS/zhbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhbmv.o `test -f 'BLAS/zhbmv.f' || echo '$(srcdir)/'`BLAS/zhbmv.f zhbmv.obj: BLAS/zhbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhbmv.obj `if test -f 'BLAS/zhbmv.f'; then $(CYGPATH_W) 'BLAS/zhbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zhbmv.f'; fi` ztpsv.o: BLAS/ztpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztpsv.o `test -f 'BLAS/ztpsv.f' || echo '$(srcdir)/'`BLAS/ztpsv.f ztpsv.obj: BLAS/ztpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztpsv.obj `if test -f 'BLAS/ztpsv.f'; then $(CYGPATH_W) 'BLAS/ztpsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztpsv.f'; fi` cher2.o: BLAS/cher2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cher2.o `test -f 'BLAS/cher2.f' || echo '$(srcdir)/'`BLAS/cher2.f cher2.obj: BLAS/cher2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cher2.obj `if test -f 'BLAS/cher2.f'; then $(CYGPATH_W) 'BLAS/cher2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cher2.f'; fi` ctrmm.o: BLAS/ctrmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrmm.o `test -f 'BLAS/ctrmm.f' || echo '$(srcdir)/'`BLAS/ctrmm.f ctrmm.obj: BLAS/ctrmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrmm.obj `if test -f 'BLAS/ctrmm.f'; then $(CYGPATH_W) 'BLAS/ctrmm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctrmm.f'; fi` dscal.o: BLAS/dscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dscal.o `test -f 'BLAS/dscal.f' || echo '$(srcdir)/'`BLAS/dscal.f dscal.obj: BLAS/dscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dscal.obj `if test -f 'BLAS/dscal.f'; then $(CYGPATH_W) 'BLAS/dscal.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dscal.f'; fi` dtrsv.o: BLAS/dtrsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrsv.o `test -f 'BLAS/dtrsv.f' || echo '$(srcdir)/'`BLAS/dtrsv.f dtrsv.obj: BLAS/dtrsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dtrsv.obj `if test -f 'BLAS/dtrsv.f'; then $(CYGPATH_W) 'BLAS/dtrsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dtrsv.f'; fi` snrm2.o: BLAS/snrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o snrm2.o `test -f 'BLAS/snrm2.f' || echo '$(srcdir)/'`BLAS/snrm2.f snrm2.obj: BLAS/snrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o snrm2.obj `if test -f 'BLAS/snrm2.f'; then $(CYGPATH_W) 'BLAS/snrm2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/snrm2.f'; fi` stpmv.o: BLAS/stpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stpmv.o `test -f 'BLAS/stpmv.f' || echo '$(srcdir)/'`BLAS/stpmv.f stpmv.obj: BLAS/stpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stpmv.obj `if test -f 'BLAS/stpmv.f'; then $(CYGPATH_W) 'BLAS/stpmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/stpmv.f'; fi` zhemm.o: BLAS/zhemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhemm.o `test -f 'BLAS/zhemm.f' || echo '$(srcdir)/'`BLAS/zhemm.f zhemm.obj: BLAS/zhemm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhemm.obj `if test -f 'BLAS/zhemm.f'; then $(CYGPATH_W) 'BLAS/zhemm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zhemm.f'; fi` ztrmm.o: BLAS/ztrmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrmm.o `test -f 'BLAS/ztrmm.f' || echo '$(srcdir)/'`BLAS/ztrmm.f ztrmm.obj: BLAS/ztrmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrmm.obj `if test -f 'BLAS/ztrmm.f'; then $(CYGPATH_W) 'BLAS/ztrmm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztrmm.f'; fi` cher2k.o: BLAS/cher2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cher2k.o `test -f 'BLAS/cher2k.f' || echo '$(srcdir)/'`BLAS/cher2k.f cher2k.obj: BLAS/cher2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cher2k.obj `if test -f 'BLAS/cher2k.f'; then $(CYGPATH_W) 'BLAS/cher2k.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cher2k.f'; fi` ctrmv.o: BLAS/ctrmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrmv.o `test -f 'BLAS/ctrmv.f' || echo '$(srcdir)/'`BLAS/ctrmv.f ctrmv.obj: BLAS/ctrmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrmv.obj `if test -f 'BLAS/ctrmv.f'; then $(CYGPATH_W) 'BLAS/ctrmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctrmv.f'; fi` dsdot.o: BLAS/dsdot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsdot.o `test -f 'BLAS/dsdot.f' || echo '$(srcdir)/'`BLAS/dsdot.f dsdot.obj: BLAS/dsdot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsdot.obj `if test -f 'BLAS/dsdot.f'; then $(CYGPATH_W) 'BLAS/dsdot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsdot.f'; fi` dzasum.o: BLAS/dzasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dzasum.o `test -f 'BLAS/dzasum.f' || echo '$(srcdir)/'`BLAS/dzasum.f dzasum.obj: BLAS/dzasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dzasum.obj `if test -f 'BLAS/dzasum.f'; then $(CYGPATH_W) 'BLAS/dzasum.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dzasum.f'; fi` srot.o: BLAS/srot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srot.o `test -f 'BLAS/srot.f' || echo '$(srcdir)/'`BLAS/srot.f srot.obj: BLAS/srot.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srot.obj `if test -f 'BLAS/srot.f'; then $(CYGPATH_W) 'BLAS/srot.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/srot.f'; fi` stpsv.o: BLAS/stpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stpsv.o `test -f 'BLAS/stpsv.f' || echo '$(srcdir)/'`BLAS/stpsv.f stpsv.obj: BLAS/stpsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o stpsv.obj `if test -f 'BLAS/stpsv.f'; then $(CYGPATH_W) 'BLAS/stpsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/stpsv.f'; fi` zhemv.o: BLAS/zhemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhemv.o `test -f 'BLAS/zhemv.f' || echo '$(srcdir)/'`BLAS/zhemv.f zhemv.obj: BLAS/zhemv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhemv.obj `if test -f 'BLAS/zhemv.f'; then $(CYGPATH_W) 'BLAS/zhemv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zhemv.f'; fi` ztrmv.o: BLAS/ztrmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrmv.o `test -f 'BLAS/ztrmv.f' || echo '$(srcdir)/'`BLAS/ztrmv.f ztrmv.obj: BLAS/ztrmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrmv.obj `if test -f 'BLAS/ztrmv.f'; then $(CYGPATH_W) 'BLAS/ztrmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztrmv.f'; fi` cher.o: BLAS/cher.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cher.o `test -f 'BLAS/cher.f' || echo '$(srcdir)/'`BLAS/cher.f cher.obj: BLAS/cher.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cher.obj `if test -f 'BLAS/cher.f'; then $(CYGPATH_W) 'BLAS/cher.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cher.f'; fi` ctrsm.o: BLAS/ctrsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrsm.o `test -f 'BLAS/ctrsm.f' || echo '$(srcdir)/'`BLAS/ctrsm.f ctrsm.obj: BLAS/ctrsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrsm.obj `if test -f 'BLAS/ctrsm.f'; then $(CYGPATH_W) 'BLAS/ctrsm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctrsm.f'; fi` dspmv.o: BLAS/dspmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dspmv.o `test -f 'BLAS/dspmv.f' || echo '$(srcdir)/'`BLAS/dspmv.f dspmv.obj: BLAS/dspmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dspmv.obj `if test -f 'BLAS/dspmv.f'; then $(CYGPATH_W) 'BLAS/dspmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dspmv.f'; fi` dznrm2.o: BLAS/dznrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dznrm2.o `test -f 'BLAS/dznrm2.f' || echo '$(srcdir)/'`BLAS/dznrm2.f dznrm2.obj: BLAS/dznrm2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dznrm2.obj `if test -f 'BLAS/dznrm2.f'; then $(CYGPATH_W) 'BLAS/dznrm2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dznrm2.f'; fi` srotg.o: BLAS/srotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srotg.o `test -f 'BLAS/srotg.f' || echo '$(srcdir)/'`BLAS/srotg.f srotg.obj: BLAS/srotg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srotg.obj `if test -f 'BLAS/srotg.f'; then $(CYGPATH_W) 'BLAS/srotg.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/srotg.f'; fi` strmm.o: BLAS/strmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strmm.o `test -f 'BLAS/strmm.f' || echo '$(srcdir)/'`BLAS/strmm.f strmm.obj: BLAS/strmm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strmm.obj `if test -f 'BLAS/strmm.f'; then $(CYGPATH_W) 'BLAS/strmm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/strmm.f'; fi` zher2.o: BLAS/zher2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zher2.o `test -f 'BLAS/zher2.f' || echo '$(srcdir)/'`BLAS/zher2.f zher2.obj: BLAS/zher2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zher2.obj `if test -f 'BLAS/zher2.f'; then $(CYGPATH_W) 'BLAS/zher2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zher2.f'; fi` ztrsm.o: BLAS/ztrsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrsm.o `test -f 'BLAS/ztrsm.f' || echo '$(srcdir)/'`BLAS/ztrsm.f ztrsm.obj: BLAS/ztrsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrsm.obj `if test -f 'BLAS/ztrsm.f'; then $(CYGPATH_W) 'BLAS/ztrsm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztrsm.f'; fi` cherk.o: BLAS/cherk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cherk.o `test -f 'BLAS/cherk.f' || echo '$(srcdir)/'`BLAS/cherk.f cherk.obj: BLAS/cherk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o cherk.obj `if test -f 'BLAS/cherk.f'; then $(CYGPATH_W) 'BLAS/cherk.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/cherk.f'; fi` ctrsv.o: BLAS/ctrsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrsv.o `test -f 'BLAS/ctrsv.f' || echo '$(srcdir)/'`BLAS/ctrsv.f ctrsv.obj: BLAS/ctrsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ctrsv.obj `if test -f 'BLAS/ctrsv.f'; then $(CYGPATH_W) 'BLAS/ctrsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ctrsv.f'; fi` dspr2.o: BLAS/dspr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dspr2.o `test -f 'BLAS/dspr2.f' || echo '$(srcdir)/'`BLAS/dspr2.f dspr2.obj: BLAS/dspr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dspr2.obj `if test -f 'BLAS/dspr2.f'; then $(CYGPATH_W) 'BLAS/dspr2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dspr2.f'; fi` icamax.o: BLAS/icamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o icamax.o `test -f 'BLAS/icamax.f' || echo '$(srcdir)/'`BLAS/icamax.f icamax.obj: BLAS/icamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o icamax.obj `if test -f 'BLAS/icamax.f'; then $(CYGPATH_W) 'BLAS/icamax.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/icamax.f'; fi` srotm.o: BLAS/srotm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srotm.o `test -f 'BLAS/srotm.f' || echo '$(srcdir)/'`BLAS/srotm.f srotm.obj: BLAS/srotm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srotm.obj `if test -f 'BLAS/srotm.f'; then $(CYGPATH_W) 'BLAS/srotm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/srotm.f'; fi` strmv.o: BLAS/strmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strmv.o `test -f 'BLAS/strmv.f' || echo '$(srcdir)/'`BLAS/strmv.f strmv.obj: BLAS/strmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strmv.obj `if test -f 'BLAS/strmv.f'; then $(CYGPATH_W) 'BLAS/strmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/strmv.f'; fi` zher2k.o: BLAS/zher2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zher2k.o `test -f 'BLAS/zher2k.f' || echo '$(srcdir)/'`BLAS/zher2k.f zher2k.obj: BLAS/zher2k.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zher2k.obj `if test -f 'BLAS/zher2k.f'; then $(CYGPATH_W) 'BLAS/zher2k.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zher2k.f'; fi` ztrsv.o: BLAS/ztrsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrsv.o `test -f 'BLAS/ztrsv.f' || echo '$(srcdir)/'`BLAS/ztrsv.f ztrsv.obj: BLAS/ztrsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ztrsv.obj `if test -f 'BLAS/ztrsv.f'; then $(CYGPATH_W) 'BLAS/ztrsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ztrsv.f'; fi` chpmv.o: BLAS/chpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chpmv.o `test -f 'BLAS/chpmv.f' || echo '$(srcdir)/'`BLAS/chpmv.f chpmv.obj: BLAS/chpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chpmv.obj `if test -f 'BLAS/chpmv.f'; then $(CYGPATH_W) 'BLAS/chpmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/chpmv.f'; fi` dasum.o: BLAS/dasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dasum.o `test -f 'BLAS/dasum.f' || echo '$(srcdir)/'`BLAS/dasum.f dasum.obj: BLAS/dasum.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dasum.obj `if test -f 'BLAS/dasum.f'; then $(CYGPATH_W) 'BLAS/dasum.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dasum.f'; fi` dspr.o: BLAS/dspr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dspr.o `test -f 'BLAS/dspr.f' || echo '$(srcdir)/'`BLAS/dspr.f dspr.obj: BLAS/dspr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dspr.obj `if test -f 'BLAS/dspr.f'; then $(CYGPATH_W) 'BLAS/dspr.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dspr.f'; fi` idamax.o: BLAS/idamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o idamax.o `test -f 'BLAS/idamax.f' || echo '$(srcdir)/'`BLAS/idamax.f idamax.obj: BLAS/idamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o idamax.obj `if test -f 'BLAS/idamax.f'; then $(CYGPATH_W) 'BLAS/idamax.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/idamax.f'; fi` srotmg.o: BLAS/srotmg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srotmg.o `test -f 'BLAS/srotmg.f' || echo '$(srcdir)/'`BLAS/srotmg.f srotmg.obj: BLAS/srotmg.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o srotmg.obj `if test -f 'BLAS/srotmg.f'; then $(CYGPATH_W) 'BLAS/srotmg.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/srotmg.f'; fi` strsm.o: BLAS/strsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strsm.o `test -f 'BLAS/strsm.f' || echo '$(srcdir)/'`BLAS/strsm.f strsm.obj: BLAS/strsm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strsm.obj `if test -f 'BLAS/strsm.f'; then $(CYGPATH_W) 'BLAS/strsm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/strsm.f'; fi` zher.o: BLAS/zher.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zher.o `test -f 'BLAS/zher.f' || echo '$(srcdir)/'`BLAS/zher.f zher.obj: BLAS/zher.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zher.obj `if test -f 'BLAS/zher.f'; then $(CYGPATH_W) 'BLAS/zher.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zher.f'; fi` chpr2.o: BLAS/chpr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chpr2.o `test -f 'BLAS/chpr2.f' || echo '$(srcdir)/'`BLAS/chpr2.f chpr2.obj: BLAS/chpr2.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chpr2.obj `if test -f 'BLAS/chpr2.f'; then $(CYGPATH_W) 'BLAS/chpr2.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/chpr2.f'; fi` daxpy.o: BLAS/daxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o daxpy.o `test -f 'BLAS/daxpy.f' || echo '$(srcdir)/'`BLAS/daxpy.f daxpy.obj: BLAS/daxpy.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o daxpy.obj `if test -f 'BLAS/daxpy.f'; then $(CYGPATH_W) 'BLAS/daxpy.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/daxpy.f'; fi` dswap.o: BLAS/dswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dswap.o `test -f 'BLAS/dswap.f' || echo '$(srcdir)/'`BLAS/dswap.f dswap.obj: BLAS/dswap.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dswap.obj `if test -f 'BLAS/dswap.f'; then $(CYGPATH_W) 'BLAS/dswap.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dswap.f'; fi` isamax.o: BLAS/isamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o isamax.o `test -f 'BLAS/isamax.f' || echo '$(srcdir)/'`BLAS/isamax.f isamax.obj: BLAS/isamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o isamax.obj `if test -f 'BLAS/isamax.f'; then $(CYGPATH_W) 'BLAS/isamax.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/isamax.f'; fi` ssbmv.o: BLAS/ssbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssbmv.o `test -f 'BLAS/ssbmv.f' || echo '$(srcdir)/'`BLAS/ssbmv.f ssbmv.obj: BLAS/ssbmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o ssbmv.obj `if test -f 'BLAS/ssbmv.f'; then $(CYGPATH_W) 'BLAS/ssbmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/ssbmv.f'; fi` strsv.o: BLAS/strsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strsv.o `test -f 'BLAS/strsv.f' || echo '$(srcdir)/'`BLAS/strsv.f strsv.obj: BLAS/strsv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o strsv.obj `if test -f 'BLAS/strsv.f'; then $(CYGPATH_W) 'BLAS/strsv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/strsv.f'; fi` zherk.o: BLAS/zherk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zherk.o `test -f 'BLAS/zherk.f' || echo '$(srcdir)/'`BLAS/zherk.f zherk.obj: BLAS/zherk.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zherk.obj `if test -f 'BLAS/zherk.f'; then $(CYGPATH_W) 'BLAS/zherk.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zherk.f'; fi` chpr.o: BLAS/chpr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chpr.o `test -f 'BLAS/chpr.f' || echo '$(srcdir)/'`BLAS/chpr.f chpr.obj: BLAS/chpr.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o chpr.obj `if test -f 'BLAS/chpr.f'; then $(CYGPATH_W) 'BLAS/chpr.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/chpr.f'; fi` dcabs1.o: BLAS/dcabs1.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dcabs1.o `test -f 'BLAS/dcabs1.f' || echo '$(srcdir)/'`BLAS/dcabs1.f dcabs1.obj: BLAS/dcabs1.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dcabs1.obj `if test -f 'BLAS/dcabs1.f'; then $(CYGPATH_W) 'BLAS/dcabs1.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dcabs1.f'; fi` dsymm.o: BLAS/dsymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsymm.o `test -f 'BLAS/dsymm.f' || echo '$(srcdir)/'`BLAS/dsymm.f dsymm.obj: BLAS/dsymm.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o dsymm.obj `if test -f 'BLAS/dsymm.f'; then $(CYGPATH_W) 'BLAS/dsymm.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/dsymm.f'; fi` izamax.o: BLAS/izamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o izamax.o `test -f 'BLAS/izamax.f' || echo '$(srcdir)/'`BLAS/izamax.f izamax.obj: BLAS/izamax.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o izamax.obj `if test -f 'BLAS/izamax.f'; then $(CYGPATH_W) 'BLAS/izamax.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/izamax.f'; fi` sscal.o: BLAS/sscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sscal.o `test -f 'BLAS/sscal.f' || echo '$(srcdir)/'`BLAS/sscal.f sscal.obj: BLAS/sscal.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o sscal.obj `if test -f 'BLAS/sscal.f'; then $(CYGPATH_W) 'BLAS/sscal.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/sscal.f'; fi` zhpmv.o: BLAS/zhpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhpmv.o `test -f 'BLAS/zhpmv.f' || echo '$(srcdir)/'`BLAS/zhpmv.f zhpmv.obj: BLAS/zhpmv.f $(AM_V_F77)$(F77) $(AM_FFLAGS) $(FFLAGS) -c -o zhpmv.obj `if test -f 'BLAS/zhpmv.f'; then $(CYGPATH_W) 'BLAS/zhpmv.f'; else $(CYGPATH_W) '$(srcdir)/BLAS/zhpmv.f'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) all-local installdirs: install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-local clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-local clean-noinstLIBRARIES cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # PKGCOMMON_PACKTITLE correspond to package names in [[file:getall]] download:: ../getall -o $(PKGCOMMON_PACKTITLE) $(PKGCOMMON_PACKAGES):download compilepkg::download # <> install::compilepkg # <> reinstall::compilepkg clean-local:: veryclean::clean -rm $(PKGCOMMON_PACKAGES) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: pkgcompile::@DOWNLOADED_BLAS@ # "xerbla" exists in both BLAS and CBLAS. So we need to rename it to obtain two different object files. BLAS:BLAS/fait BLAS/fait:$(BLAS_TGZ) mkdir -p ../include ../lib -if tar xvzf $(BLAS_TGZ) BLAS/xerbla.f 2>&1 1>/dev/null ; then \ tar xvzf $(BLAS_TGZ) ; \ else \ mkdir -p BLAS;cd BLAS && tar xvzf ../$(BLAS_TGZ);\ fi cp BLAS/xerbla.f blas_xerbla.f touch BLAS/fait $(F77BLAS_SOURCES): BLAS CBLAS:CBLAS/fait CBLAS/fait: $(CBLAS_TGZ) tar xvzf $(CBLAS_TGZ) cp CBLAS/include/*.h CBLAS/src touch CBLAS/fait $(CBLAS_SOURCES): CBLAS/fait clean-local:: -rm -r BLAS CBLAS blas_xerbla.f # <> ALH - 18/9/13 - Downloading and building the OpenBLAS # ------------------------------------------------------------------ # to activate this, see [[file:../../configure.ac::OpenBLAS]] all-local::@COMPILE_OPENBLAS@ pkgcompile::@COMPILE_OPENBLAS@ generic: openblas:links.done # links2files is required for the MinGW compiler to understand where to find the library contents under Cygwin @FFCS_WINDOWS_TRUE@links.done:openblas.done @FFCS_WINDOWS_TRUE@ cd OpenBLAS && ../../../build/links2files @FFCS_WINDOWS_TRUE@ touch $@ @FFCS_WINDOWS_FALSE@links.done:openblas.done @FFCS_WINDOWS_FALSE@ touch $@ openblas.done:openpatches.done # # DYNAMIC_ARCH=1 allows the Openblas to run fast on all the processor architectures that the FFCS users may have # test -d ../lib || mkdir ../lib cd OpenBLAS && make BINARY=@SIZEOF_PTRINBIT@ CC=${CC} FC=${FC} DYNAMIC_ARCH=1 libs netlib touch $@ # The OpenBLAS directory is updated during the compilation, so the patching step should not depend on the directory # date openpatches.done:opendownload.done tar xvzf ../pkg/OpenBLAS.tar.gz # # ALH - 7/1/14 - The tar directory has changed names # mv xianyi-OpenBLAS-* OpenBLAS patch -u -p1 < openblas.patches touch $@ download::opendownload.done opendownload.done: ../getall -o OpenBLAS -a touch $@ # ALH - 6/11/13 - Since OpenBLAS is quite long to compile and it does not change very often, it's only cleaned as part # of the specific target 'veryclean'. veryclean:: -rm -r *.done OpenBLAS xianyi-OpenBLAS-* # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/download/blas/openblas.patches000644 000767 000024 00000001362 12240775536 021525 0ustar00hechtstaff000000 000000 # -*- mode:diff;coding:raw-text; -*- diff -r -u ref/OpenBLAS/c_check OpenBLAS/c_check --- ref/OpenBLAS/c_check 2010-01-28 20:26:25.000000000 +0100 +++ OpenBLAS/c_check 2012-06-05 15:17:47.877934400 +0200 @@ -22,15 +22,16 @@ $cross_suffix = ""; -if ($ARGV[0] =~ /(.*)(-[.\d]+)/) { - if ($1 =~ /(.*-)(.*)/) { - $cross_suffix = $1; - } -} else { - if ($ARGV[0] =~ /(.*-)(.*)/) { - $cross_suffix = $1; - } -} +# FFCS - this test is broken when using full paths with dashes for compilers +#if ($ARGV[0] =~ /(.*)(-[.\d]+)/) { +# if ($1 =~ /(.*-)(.*)/) { +# $cross_suffix = $1; +# } +#} else { +# if ($ARGV[0] =~ /(.*-)(.*)/) { +# $cross_suffix = $1; +# } +#} $compiler = ""; $compiler = PGI if ($data =~ /COMPILER_PGI/); freefem++-3.38-1/download/blacs/BLACS.patch000644 000767 000024 00000002261 12167254041 020347 0ustar00hechtstaff000000 000000 diff -ur BLACS/SRC/MPI/Makefile BLACS-okk/Makefile --- BLACS/SRC/MPI/Makefile 2010-02-16 13:29:39.000000000 +0100 +++ BLACS-okk/Makefile 2010-02-16 13:24:56.000000000 +0100 @@ -86,7 +86,8 @@ rm -f $(BLACSFINIT) $(BLACSCINIT) make $(BLACSFINIT) make $(BLACSCINIT) - $(ARCH) $(ARCHFLAGS) $(BLACSLIB) $(Fintobj) $(Cintobj) + cp INTERNAL/*.o . + $(ARCH) $(ARCHFLAGS) $(BLACSLIB) $(internal) $(Fintobj) $(Cintobj) $(RANLIB) $(BLACSLIB) $(BLACSFINIT) : @@ -110,7 +111,7 @@ ( cd INTERNAL ; $(MAKE) -f ../Makefile I_int "dlvl=$(BTOPdir)" ) I_int : Bdef.h Bconfig.h $(internal) - $(ARCH) $(ARCHFLAGS) $(BLACSLIB) $(internal) + #$(ARCH) $(ARCHFLAGS) $(BLACSLIB) $(internal) Bdef.h : ../Bdef.h rm -f Bdef.h @@ -196,9 +196,10 @@ bi_f77_mpi_testall.o : mpif.h bi_f77_mpi_testall.f $(F77) -c $(F77FLAGS) $*.f -mpif.h : $(MPIINCdir)/mpif.h +# FFCS: watch out for spaces and links under Windows. Also, make dependencies cannot contain spaces. +mpif.h : rm -f mpif.h - ln -s $(MPIINCdir)/mpif.h mpif.h + cp $(MPIINCdir)/mpif.h mpif.h # ------------------------------------------------------------------------ # We move C .o files to .C so that we can use the portable suffix rule for freefem++-3.38-1/download/blacs/BLACS_gridinit_.c-return-values.patch000644 000767 000024 00000000512 12167254041 025427 0ustar00hechtstaff000000 000000 --- ./BLACS/SRC/MPI/blacs_gridinit_.c.orig 2013-01-27 12:42:38.712531484 +0000 +++ ./BLACS/SRC/MPI/blacs_gridinit_.c 2013-01-27 12:49:32.411131896 +0000 @@ -35,4 +35,9 @@ blacs_gridmap_(ConTxt, tmpgrid, nprow, nprow, npcol); #endif free(tmpgrid); +#if (INTFACE == C_CALL) + return 0; +#else + return NULL; +#endif } freefem++-3.38-1/download/blacs/Bmake-blacs.inc000644 000767 000024 00000027320 12167254041 021301 0ustar00hechtstaff000000 000000 abs_top_builddir=@abs_top_builddir@ include $(abs_top_builddir)/download/headers-sparsesolver.inc #============================================================================= #====================== SECTION 0: FREEFEM++ ================================ #============================================================================= # The following macros specify the executable to download BLACS #============================================================================= WGET = @WGET@ #============================================================================= #====================== SECTION 1: PATHS AND LIBRARIES ======================= #============================================================================= # The following macros specify the name and location of libraries required by # the BLACS and its tester. #============================================================================= # -------------------------------------- # Make sure we've got a consistent shell # -------------------------------------- SHELL = /bin/sh # ----------------------------- # The top level BLACS directory # ----------------------------- BTOPdir = $(abs_top_builddir)/download/blacs/BLACS # --------------------------------------------------------------------------- # The communication library your BLACS have been written for. # Known choices (and the machines they run on) are: # # COMMLIB MACHINE # ....... .............................................................. # CMMD Thinking Machine's CM-5 # MPI Wide variety of systems # MPL IBM's SP series (SP1 and SP2) # NX Intel's supercomputer series (iPSC2, iPSC/860, DELTA, PARAGON) # PVM Most unix machines; See PVM User's Guide for details # --------------------------------------------------------------------------- COMMLIB = MPI # ------------------------------------------------------------- # The platform identifier to suffix to the end of library names # ------------------------------------------------------------- PLAT = FREEFEM # ---------------------------------------------------------- # Name and location of the BLACS library. See section 2 for # details on BLACS debug level (BLACSDBGLVL). # ---------------------------------------------------------- BLACSdir = $(BTOPdir)/LIB BLACSDBGLVL = 0 BLACSFINIT = $(BLACSdir)/libblacsF77init_$(COMMLIB)-$(PLAT)-$(BLACSDBGLVL).a BLACSCINIT = $(BLACSdir)/libblacsCinit_$(COMMLIB)-$(PLAT)-$(BLACSDBGLVL).a BLACSLIB = $(BLACSdir)/libblacs_$(COMMLIB)-$(PLAT)-$(BLACSDBGLVL).a # ------------------------------------- # Name and location of the MPI library. # ------------------------------------- MPIdir = $(FFMPIDIR) MPIdev = MPIplat = # FFCS: Windows path to MPICH2 contains spaces, but FF configure --with-mpipath option should not contain quotes # because FF configure adds quotes when defining MPI_LIB MPILIBdir = '@MPI_LIB_DIRS@' MPIINCdir = '@MPI_INC_DIR@' MPILIB = @MPI_LIB@ # ------------------------------------- # All libraries required by the tester. # ------------------------------------- BTLIBS = $(BLACSFINIT) $(BLACSLIB) $(BLACSFINIT) $(MPILIB) # ---------------------------------------------------------------- # The directory to put the installation help routines' executables # ---------------------------------------------------------------- INSTdir = $(BTOPdir)/INSTALL/EXE # ------------------------------------------------ # The name and location of the tester's executable # ------------------------------------------------ TESTdir = $(BTOPdir)/TESTING/EXE FTESTexe = $(TESTdir)/xFbtest_$(COMMLIB)-$(PLAT)-$(BLACSDBGLVL) CTESTexe = $(TESTdir)/xCbtest_$(COMMLIB)-$(PLAT)-$(BLACSDBGLVL) #============================================================================= #=============================== End SECTION 1 =============================== #============================================================================= #============================================================================= #========================= SECTION 2: BLACS INTERNALS ======================== #============================================================================= # The following macro definitions set preprocessor values for the BLACS. # The file Bconfig.h sets these values if they are not set by the makefile. # User's compiling only the tester can skip this entire section. # NOTE: The MPI defaults have been set for MPICH. #============================================================================= # ----------------------------------------------------------------------- # The directory to find the required communication library include files, # if they are required by your system. # ----------------------------------------------------------------------- SYSINC = -I$(MPIINCdir) # --------------------------------------------------------------------------- # The Fortran 77 to C interface to be used. If you are unsure of the correct # setting for your platform, compile and run BLACS/INSTALL/xintface. # Choices are: Add_, NoChange, UpCase, or f77IsF2C. # --------------------------------------------------------------------------- INTFACE = @CFLAGSF77@ # ------------------------------------------------------------------------ # Allows the user to vary the topologies that the BLACS default topologies # (TOP = ' ') correspond to. If you wish to use a particular topology # (as opposed to letting the BLACS make the choice), uncomment the # following macros, and replace the character in single quotes with the # topology of your choice. # ------------------------------------------------------------------------ # DEFBSTOP = -DDefBSTop="'1'" # DEFCOMBTOP = -DDefCombTop="'1'" DEFBSTOP = $(FFDEFBSTOP) DEFCOMBTOP = $(FFDEFCOMBTOP) # ------------------------------------------------------------------- # If your MPI_Send is locally-blocking, substitute the following line # for the empty macro definition below. # SENDIS = -DSndIsLocBlk # ------------------------------------------------------------------- SENDIS = $(FFSENDIS) # -------------------------------------------------------------------- # If your MPI handles packing of non-contiguous messages by copying to # another buffer or sending extra bytes, better performance may be # obtained by replacing the empty macro definition below with the # macro definition on the following line. # BUFF = -DNoMpiBuff # -------------------------------------------------------------------- BUFF = $(FFBUFF) # ----------------------------------------------------------------------- # If you know something about your system, you may make it easier for the # BLACS to translate between C and fortran communicators. If the empty # macro defininition is left alone, this translation will cause the C # BLACS to globally block for MPI_COMM_WORLD on calls to BLACS_GRIDINIT # and BLACS_GRIDMAP. If you choose one of the options for translating # the context, neither the C or fortran calls will globally block. # If you are using MPICH, or a derivitive system, you can replace the # empty macro definition below with the following (note that if you let # MPICH do the translation between C and fortran, you must also indicate # here if your system has pointers that are longer than integers. If so, # define -DPOINTER_64_BITS=1.) For help on setting TRANSCOMM, you can # run BLACS/INSTALL/xtc_CsameF77 and BLACS/INSTALL/xtc_UseMpich as # explained in BLACS/INSTALL/README. # TRANSCOMM = -DUseMpich # # If you know that your MPI uses the same handles for fortran and C # communicators, you can replace the empty macro definition below with # the macro definition on the following line. # TRANSCOMM = -DCSameF77 # ----------------------------------------------------------------------- TRANSCOMM = $(FFTRANSCOMM) # -------------------------------------------------------------------------- # You may choose to have the BLACS internally call either the C or Fortran77 # interface to MPI by varying the following macro. If TRANSCOMM is left # empty, the C interface BLACS_GRIDMAP/BLACS_GRIDINIT will globally-block if # you choose to use the fortran internals, and the fortran interface will # block if you choose to use the C internals. It is recommended that the # user leave this macro definition blank, unless there is a strong reason # to prefer one MPI interface over the other. # WHATMPI = -DUseF77Mpi # WHATMPI = -DUseCMpi # -------------------------------------------------------------------------- WHATMPI = $(FFWHATMPI) # --------------------------------------------------------------------------- # Some early versions of MPICH and its derivatives cannot handle user defined # zero byte data types. If your system has this problem (compile and run # BLACS/INSTALL/xsyserrors to check if unsure), replace the empty macro # definition below with the macro definition on the following line. # SYSERRORS = -DZeroByteTypeBug # --------------------------------------------------------------------------- SYSERRORS = $(FFSYSERRORS) # ------------------------------------------------------------------ # These macros set the debug level for the BLACS. The fastest # code is produced by BlacsDebugLvl 0. Higher levels provide # more debug information at the cost of performance. Present levels # of debug are: # 0 : No debug information # 1 : Mainly parameter checking. # ------------------------------------------------------------------ DEBUGLVL = -DBlacsDebugLvl=$(BLACSDBGLVL) # ------------------------------------------------------------------------- # All BLACS definitions needed for compile (DEFS1 contains definitions used # by all BLACS versions). # ------------------------------------------------------------------------- DEFS1 = -DSYSINC $(SYSINC) $(INTFACE) $(DEFBSTOP) $(DEFCOMBTOP) $(DEBUGLVL) BLACSDEFS = $(DEFS1) $(SENDIS) $(BUFF) $(TRANSCOMM) $(WHATMPI) $(SYSERRORS) #============================================================================= #=============================== End SECTION 2 =============================== #============================================================================= #============================================================================= #=========================== SECTION 3: COMPILERS ============================ #============================================================================= # The following macros specify compilers, linker/loaders, the archiver, # and their options. Some of the fortran files need to be compiled with no # optimization. This is the F77NO_OPTFLAG. The usage of the remaining # macros should be obvious from the names. #============================================================================= F77 = @MPIF77@ #--prefix /Users/morice/librairie/openmpi-gcc-gfortran-4.4/ F77NO_OPTFLAGS = @FNOFLAGS@ F77FLAGS = @FFLAGS@ F77LOADER = $(F77) F77LOADFLAGS = @FFLAGS@ @LDFLAGS@ CC = @MPICC@ #--prefix /Users/morice/librairie/openmpi-gcc-gfortran-4.4/ CCFLAGS = @CFLAGS@ #-fnested-functions CCLOADER = $(CC) CCLOADFLAGS = @LDFLAGS@ # -------------------------------------------------------------------------- # The archiver and the flag(s) to use when building an archive (library). # Also the ranlib routine. If your system has no ranlib, set RANLIB = echo. # -------------------------------------------------------------------------- ARCH = @AR@ #ar ARCHFLAGS = @ARFLAGS@ #rs RANLIB = @RANLIB@ #============================================================================= #=============================== End SECTION 3 =============================== #============================================================================= freefem++-3.38-1/download/blacs/Makefile000644 000767 000024 00000005322 12167254041 020143 0ustar00hechtstaff000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ include Bmake.inc all-local: blacs # Downloading and compiling BLACS # ------------------------------ # http://www.netlib.org/blacs/ # Hips information DIRPKG=../pkg SRCDIR=BLACS PACKAGE1=$(DIRPKG)/mpiblacs.tgz PACKAGE2=$(DIRPKG)/mpiblacs-patch03.tgz PACKAGE3=$(DIRPKG)/blacstester.tgz SERVER=http://www.netlib.org/blacs/ INSTALL=../.. SYSERRORS = blacs:FAIRE FAIRE:$(SRCDIR)/FAIT $(MAKE) WHERE touch FAIRE Bmake.inc: ../../config.status Makefile Bmake-blacs.inc ../../config.status --file="Bmake.inc1:Bmake-blacs.inc" sed s/-DAdd__/-Df77IsF2C/ Bmake.inc rm Bmake.inc1 # FFCS: make sure that this makefile fails if the BLACS do not compile. But run links2files when the compilation fails because of # a symbolic link (under Windows). Repeat it only by hand to avoid infinite loops! $(SRCDIR)/FAIT: $(SRCDIR) # cd $(SRCDIR)/INSTALL/;$(MAKE) xintface xsyserrors xcmpi_sane xfmpi_sane xtc_CsameF77 xtc_UseMpich -cd $(SRCDIR) && $(MAKE) mpi ../../../../build/links2files -cd $(SRCDIR) && $(MAKE) mpi ../../../../build/links2files cd $(SRCDIR) && $(MAKE) mpi touch $(SRCDIR)/FAIT WHERE: -if [ -f $(SRCDIR)/FAIT ] ; then \ make install; \ echo blacs LD -L@DIR@/lib/blacs -lblacs_MPI-FREEFEM-0 -lblacsF77init_MPI-FREEFEM-0 -lblacsCinit_MPI-FREEFEM-0 -lblacs_MPI-FREEFEM-0 >$(SRCDIR)/$(INSTALL)/lib/WHERE.blacs ;\ fi install: $(SRCDIR)/FAIT mkdir -p $(SRCDIR)/$(INSTALL)/lib/blacs cp $(SRCDIR)/LIB/*.a $(SRCDIR)/$(INSTALL)/lib/blacs/ # FFCS: some files in the untarred archives are symbolic links that need to be converted for MinGW compilers $(SRCDIR): $(PACKAGE1) $(PACKAGE2) $(PACKAGE3) gunzip -c $(PACKAGE1) | tar xvf - gunzip -c $(PACKAGE2) | tar xvf - gunzip -c $(PACKAGE3) | tar xvf - patch -p0 < BLACS_gridinit_.c-return-values.patch cd $(SRCDIR)/SRC/MPI; patch -p1 < ../../../BLACS.patch cp Bmake.inc $(SRCDIR) mv $(SRCDIR)/SRC/MPI/Makefile $(SRCDIR)/SRC/MPI/Makefile.tmp sed -e 's;\.C;\.oo;g' -e 's@: $$(MPIINCdir)/mpif.h@:@' \ < $(SRCDIR)/SRC/MPI/Makefile.tmp \ > $(SRCDIR)/SRC/MPI/Makefile ../../../../build/links2files touch $(SRCDIR) $(PACKAGE1): -mkdir $(DIRPKG) cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE1)` $(PACKAGE2): -mkdir $(DIRPKG) cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE2)` $(PACKAGE3): -mkdir $(DIRPKG) cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE3)` # FFCS: only run make clean if cd to SRCDIR worked, otherwise this is an infinite loop. clean-local: -cd $(SRCDIR)/SRC/MPI && $(MAKE) clean -C $(SRCDIR)/SRC/MPI -rm Bmake.inc FAIRE -rm $(SRCDIR)/$(INSTALL)/lib/blacs/*.a -rm -rf $(SRCDIR) clean: clean-local .PHONY:$(SRCDIR)/$(INSTALL) compile installfreefem++-3.38-1/download/arpack/ARmake.m4000644 000767 000024 00000007563 11406142255 020271 0ustar00hechtstaff000000 000000 # ARPACK ARmake.inc modified for FreeFem++ # $Id$ ########################################################################### # # Program: ARPACK # # Module: ARmake.inc # # Purpose: Top-level Definitions # # Creation date: February 22, 1996 # # Modified: # # Send bug reports, comments or suggestions to arpack@caam.rice.edu # ############################################################################ # # %---------------------------------% # | SECTION 1: PATHS AND LIBRARIES | # %---------------------------------% # # # %--------------------------------------% # | You should change the definition of | # | home if ARPACK is built some place | # | other than your home directory. | # %--------------------------------------% # home = FF_HOME # # %--------------------------------------% # | The platform identifier to suffix to | # | the end of library names | # %--------------------------------------% # PLAT = ff++ # # %------------------------------------------------------% # | The directories to find the various pieces of ARPACK | # %------------------------------------------------------% # BLASdir = $(home)/BLAS LAPACKdir = $(home)/LAPACK UTILdir = $(home)/UTIL SRCdir = $(home)/SRC # #DIRS = $(BLASdir) $(LAPACKdir) $(UTILdir) $(SRCdir) # # %-------------------------------------------------------------------% # | Comment out the previous line and uncomment the following | # | if you already have the BLAS and LAPACK installed on your system. | # | NOTE: ARPACK assumes the use of LAPACK version 2 codes. | # %-------------------------------------------------------------------% # DIRS = FF_LAPACKdir $(UTILdir) $(SRCdir) # # %---------------------------------------------------% # | The name of the libraries to be created/linked to | # %---------------------------------------------------% # ARPACKLIB = FF_ARPACKLIB LAPACKLIB = FF_LAPACKLIB BLASLIB = FF_BLASLIB # ALIBS = $(ARPACKLIB) $(LAPACKLIB) $(BLASLIB) # # # %---------------------------------------------------------% # | SECTION 2: COMPILERS | # | | # | The following macros specify compilers, linker/loaders, | # | the archiver, and their options. You need to make sure | # | these are correct for your system. | # %---------------------------------------------------------% # # # %------------------------------% # | Make our own suffixes' list. | # %------------------------------% # .SUFFIXES: .SUFFIXES: .f .o # # %------------------% # | Default command. | # %------------------% # .DEFAULT: @$(ECHO) "Unknown target $@, try: make help" # # %-------------------------------------------% # | Command to build .o files from .f files. | # %-------------------------------------------% # .f.o: @$(ECHO) Making $@ from $< @$(FC) -c $(FFLAGS) $< # # %-----------------------------------------% # | Various compilation programs and flags. | # | You need to make sure these are correct | # | for your system. | # %-----------------------------------------% # FC = FF_FC FFLAGS = FF_FFLAGS LDFLAGS = FF_LDFLAGS SECOND_O = FF_SECOND CD = cd ECHO = echo LN = ln LNFLAGS = -s MAKE = make RM = rm RMFLAGS = -f SHELL = /bin/sh # # %----------------------------------------------------------------% # | The archiver and the flag(s) to use when building an archive | # | (library). Also the ranlib routine. If your system has no | # | ranlib, set RANLIB = touch. | # %----------------------------------------------------------------% # AR = FF_AR ARFLAGS = FF_ARFLAGS RANLIB = FF_RANLIB # # %----------------------------------% # | This is the general help target. | # %----------------------------------% # help: @$(ECHO) "usage: make ?" freefem++-3.38-1/download/arpack/arpack-patch-lapack.tar.gz000644 000767 000024 00000002204 11406142255 023570 0ustar00hechtstaff000000 000000 k@Earpack-patch-lapack.tarV]s8_q!k\HNֳPLU`3M^iu%]{t9j:b?8:'aض;a(=ʟۚL:Y08nZdRA9@mőy$cZ8Z;3Ko/ӵ7;wKgY `0B7@0 )d"0I CL9q_tHgqҔ1݌F]=iMo`!]+fIi,SL N <*pGn4qpr~x*){la,C.΃u [@f;u,8k!O~3ɔsO9dN{`˴UɯEM38 <{'Bˌ Fr}LfjimjV/2ѯP[dmû Y_U+C,K_ 7y0nxqjuv.*wz@e4 g7h1`>8NP֣g3NEs:; l~_` QBvX'I@c(j)d,(+zq0gQ(ፖz lϰϐZvs(N7xv~vL?Ēh_; (DAF4S-'η@o!_k|/OWPPPPPPPPPPPPPP 74Z(freefem++-3.38-1/download/arpack/Makefile.am000644 000767 000024 00000007463 12405772572 020735 0ustar00hechtstaff000000 000000 # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=04/06/04 upmc brief="Makefile for downloaded ARPACK" all-local:$(DOWNLOAD_ARPACK) EXTRA_DIST=ARmake.m4 arpack-patch-lapack.tar.gz veclib_zdotc.f PKGCOMMON_PACKTITLE=ARPACK include ../common.mak # nothing specific to do for [[file:../common.mak::reinstall]] reinstall::install # Downloading and compiling ARPACK # -------------------------------- # set in configure #ARPACKLIB=ARPACK/libarpack_ff++.a DIRPKG=../pkg ARPACK96_TAR_GZ=$(DIRPKG)/arpack96.tar.gz PATCH_TAR_GZ=$(DIRPKG)/patch.tar.gz PKGCOMMON_PACKAGES=$(ARPACK96_TAR_GZ) $(PATCH_TAR_GZ) # FFCS: need to add $(RANLIB) under mingw64 to avoid "archive has no index" error compilepkg::$(ARPACKLIB) $(ARPACKLIB): ARPACK/fait case '$(BLASLIBS)' in *vecLib*|*Accelerate*) $(F77) -c $(FFLAGS) veclib_zdotc.f -o ARPACK/SRC/veclib_zdotc.o ;; esac; mkdir -p ../include ../lib if [ -n '@FF_LAPACKdir@' ] ; then \ $(F77) -c `echo $(FFLAGS)\ |sed -e s/-O.\*\ // ` ARPACK/LAPACK/dlamch.f -o ARPACK/LAPACK/dlamch.o; \ fi; \ cd ARPACK && make lib if test -n '@FF_LAPACKdir@' ; then \ $(AR) $(ARFLAGS) $(LAPACK_arpack_LIB) ARPACK/SRC/*.o ARPACK/UTIL/*.o ARPACK/LAPACK/*.o ;\ $(RANLIB) $(LAPACK_arpack_LIB) ;\ else \ $(AR) $(ARFLAGS) $(ARPACKLIB) ARPACK/SRC/*.o ARPACK/UTIL/*.o ;\ fi ARPACK/fait: $(ARPACK96_TAR_GZ) $(PATCH_TAR_GZ) ARmake.m4 Makefile -rm -rf ARPACK gunzip -c $(ARPACK96_TAR_GZ) | tar xf - gunzip -c $(PATCH_TAR_GZ) | tar xf - gunzip -c arpack-patch-lapack.tar.gz | tar xf - case '$(BLASLIBS)' in *vecLib*|*Accelerate*) \ for i in ARPACK/LAPACK/zlatrs.f ARPACK/LAPACK/ztrsyl.f ARPACK/SRC/zgetv0.f ARPACK/SRC/znaitr.f ARPACK/SRC/znaup2.f ARPACK/SRC/zneupd.f;\ do mv $$i $$i.cpy; sed -e 's/ZDOTC/ZZDOTC/' -e 's/zdotc/zzdotc/' <$$i.cpy >$$i;rm $$i.cpy; \ done;; \ esac for i in ARPACK/SRC/*.f ; do \ mv $$i $$i.cpy; sed -e 's/, second/, secnd2/' -e 's/call *second/call secnd2/' <$$i.cpy >$$i;rm $$i.cpy; done for i in ARPACK/UTIL/second.f; do \ mv $$i $$i.cpy; cat $$i.cpy| sed 's/ SECOND *(/ secnd2(/'|grep -v EXTERNAL >$$i;rm $$i.cpy; done m4 -DFF_BLASLIB="$(BLASLIB)" \ -DFF_ARPACKLIB="$(ARPACKLIB)" \ -DFF_LAPACK_arpack_LIB="$(LAPACK_arpack_LIB)" \ -DFF_FC="@F77@" \ -DFF_FFLAGS="@FFLAGS@" \ -DFF_LAPACKdir='@FF_LAPACKdir@' \ -DFF_LDFLAGS="@LDFLAGS@" \ -DFF_HOME=`pwd`/ARPACK \ -DFF_SECOND="@FF_SECOND@" \ -DFF_AR="@AR@" \ -DFF_ARFLAGS="@ARFLAGS@" \ -DFF_RANLIB="@RANLIB@" \ ARmake.m4 >ARPACK/ARmake.inc touch ARPACK/fait $(ARPACK96_TAR_GZ) $(PATCH_TAR_GZ): ../getall -o ARPACK -a clean-local:: -rm -r ARPACK ../lib/libarpack.a # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/download/arpack/Makefile.in000644 000767 000024 00000054236 12543260336 020737 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=04/06/04 upmc brief="Makefile for downloaded ARPACK" # Common make rules for all downloaded packages (request from FH) # ====================================================================== # Written by Antoine Le Hyaric # http://www.ljll.math.upmc.fr/lehyaric # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Common make rules for all downloaded packages (request from FH)" default=0 freefem make start=06/11/2013 upmc written # Common goals for all packages: # download compile install reinstall clean veryclean # <> VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = download/arpack ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/../common.mak $(srcdir)/Makefile.in \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = ARmake.m4 arpack-patch-lapack.tar.gz veclib_zdotc.f PKGCOMMON_PACKTITLE = ARPACK # Downloading and compiling ARPACK # -------------------------------- # set in configure #ARPACKLIB=ARPACK/libarpack_ff++.a DIRPKG = ../pkg ARPACK96_TAR_GZ = $(DIRPKG)/arpack96.tar.gz PATCH_TAR_GZ = $(DIRPKG)/patch.tar.gz PKGCOMMON_PACKAGES = $(ARPACK96_TAR_GZ) $(PATCH_TAR_GZ) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../common.mak $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu download/arpack/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu download/arpack/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/../common.mak $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile all-local installdirs: install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am .PRECIOUS: Makefile all-local:$(DOWNLOAD_ARPACK) # PKGCOMMON_PACKTITLE correspond to package names in [[file:getall]] download:: ../getall -o $(PKGCOMMON_PACKTITLE) $(PKGCOMMON_PACKAGES):download compilepkg::download # <> install::compilepkg # <> reinstall::compilepkg clean-local:: veryclean::clean -rm $(PKGCOMMON_PACKAGES) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: # nothing specific to do for [[file:../common.mak::reinstall]] reinstall::install # FFCS: need to add $(RANLIB) under mingw64 to avoid "archive has no index" error compilepkg::$(ARPACKLIB) $(ARPACKLIB): ARPACK/fait case '$(BLASLIBS)' in *vecLib*|*Accelerate*) $(F77) -c $(FFLAGS) veclib_zdotc.f -o ARPACK/SRC/veclib_zdotc.o ;; esac; mkdir -p ../include ../lib if [ -n '@FF_LAPACKdir@' ] ; then \ $(F77) -c `echo $(FFLAGS)\ |sed -e s/-O.\*\ // ` ARPACK/LAPACK/dlamch.f -o ARPACK/LAPACK/dlamch.o; \ fi; \ cd ARPACK && make lib if test -n '@FF_LAPACKdir@' ; then \ $(AR) $(ARFLAGS) $(LAPACK_arpack_LIB) ARPACK/SRC/*.o ARPACK/UTIL/*.o ARPACK/LAPACK/*.o ;\ $(RANLIB) $(LAPACK_arpack_LIB) ;\ else \ $(AR) $(ARFLAGS) $(ARPACKLIB) ARPACK/SRC/*.o ARPACK/UTIL/*.o ;\ fi ARPACK/fait: $(ARPACK96_TAR_GZ) $(PATCH_TAR_GZ) ARmake.m4 Makefile -rm -rf ARPACK gunzip -c $(ARPACK96_TAR_GZ) | tar xf - gunzip -c $(PATCH_TAR_GZ) | tar xf - gunzip -c arpack-patch-lapack.tar.gz | tar xf - case '$(BLASLIBS)' in *vecLib*|*Accelerate*) \ for i in ARPACK/LAPACK/zlatrs.f ARPACK/LAPACK/ztrsyl.f ARPACK/SRC/zgetv0.f ARPACK/SRC/znaitr.f ARPACK/SRC/znaup2.f ARPACK/SRC/zneupd.f;\ do mv $$i $$i.cpy; sed -e 's/ZDOTC/ZZDOTC/' -e 's/zdotc/zzdotc/' <$$i.cpy >$$i;rm $$i.cpy; \ done;; \ esac for i in ARPACK/SRC/*.f ; do \ mv $$i $$i.cpy; sed -e 's/, second/, secnd2/' -e 's/call *second/call secnd2/' <$$i.cpy >$$i;rm $$i.cpy; done for i in ARPACK/UTIL/second.f; do \ mv $$i $$i.cpy; cat $$i.cpy| sed 's/ SECOND *(/ secnd2(/'|grep -v EXTERNAL >$$i;rm $$i.cpy; done m4 -DFF_BLASLIB="$(BLASLIB)" \ -DFF_ARPACKLIB="$(ARPACKLIB)" \ -DFF_LAPACK_arpack_LIB="$(LAPACK_arpack_LIB)" \ -DFF_FC="@F77@" \ -DFF_FFLAGS="@FFLAGS@" \ -DFF_LAPACKdir='@FF_LAPACKdir@' \ -DFF_LDFLAGS="@LDFLAGS@" \ -DFF_HOME=`pwd`/ARPACK \ -DFF_SECOND="@FF_SECOND@" \ -DFF_AR="@AR@" \ -DFF_ARFLAGS="@ARFLAGS@" \ -DFF_RANLIB="@RANLIB@" \ ARmake.m4 >ARPACK/ARmake.inc touch ARPACK/fait $(ARPACK96_TAR_GZ) $(PATCH_TAR_GZ): ../getall -o ARPACK -a clean-local:: -rm -r ARPACK ../lib/libarpack.a # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/download/arpack/veclib_zdotc.f000644 000767 000024 00000001626 12357250420 021477 0ustar00hechtstaff000000 000000 double complex function zzdotc(n,zx,incx,zy,incy) c c forms the dot product of a vector. c jack dongarra, 3/11/78. c modified 12/3/93, array(1) declarations changed to array(*) c double complex zx(*),zy(*),ztemp integer i,incx,incy,ix,iy,n ztemp = (0.0d0,0.0d0) zzdotc = (0.0d0,0.0d0) if(n.le.0)return if(incx.eq.1.and.incy.eq.1)go to 20 c c code for unequal increments or equal increments c not equal to 1 c ix = 1 iy = 1 if(incx.lt.0)ix = (-n+1)*incx + 1 if(incy.lt.0)iy = (-n+1)*incy + 1 do 10 i = 1,n ztemp = ztemp + dconjg(zx(ix))*zy(iy) ix = ix + incx iy = iy + incy 10 continue zzdotc = ztemp return c c code for both increments equal to 1 c 20 do 30 i = 1,n ztemp = ztemp + dconjg(zx(i))*zy(i) 30 continue zzdotc = ztemp return end freefem++-3.38-1/DOC/freefem++doc.pdf000644 000767 000024 00044375406 12542734353 017170 0ustar00hechtstaff000000 000000 %PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 807 /Length 1373 /Filter /FlateDecode >> stream xڍVn8}Wcn5(ȥ> c [IRTYrRlCp"Z9s IA e)ͨ PH'!ⓓoJ2#)HfLJ%/IZ椲dE,QUx(J%)@Q@Q%eMeY5K%ees*/JJ$YB"WQVPpR *|K*r *U0+FH@ᩀ|\E e\䬔$$(3< +H:pb@^ XYZ!%3&+L2D|?1D1dw2ɉ2OgD4(cW2V!FE=d`;@7ȤPP0CFX!%,C:R D}tP!)Ţ7@VC@I*5L`%ӌr4P3Vx@K䌣CKV 9 n¼3$e!X )d`dQ>Y"K2c\r*YUV;:)Zu0@g>eֵgܙd]ך/g.ӹd߸uONڻ~~a{ {cM ﬽޵ikoMm?HˁmmM *).8yb5FLy>eT+y>ͳI/$^5{xoi&'&_!)j]fQ#:[L/}{vfxamg^e,ŅѾea٣nujbsi۸%Hs9/\;Y|k:q˳TM)?n4&S`-_4:<+ֶ;tvVu{. \W-1%kV+v{eSC 'iW1n39hQ⩋.@ 5نM̵<hTSP#y0X+}o;"E!B_KF<ܼŝ.5:NNmG1^;NhuE:zu8s@c۟ :!x=l:ߴA?i7:hYǶ8_da.5v7t\vF ycxh\"iryBN݉iNv~(.o b> stream xڍVn6}߯)y-r[pb;-Z6[+W.[J]q[K~$33sҁt3^1 (Qx)RXʐbyBT"4`5CtGAHbVa!N !{N+9h؆W010EMLEQ PQb=4k'bI/ҔpS"G%SbJI qHic(lMU 3VJ2a|NbRZJQqxR0At d8F#ajT )2QaĠGE H;P+(cB X1hR <|3R `J%)AJăz`DRTdw$0f6͊HHVZb p` i U0b3h 7-yf|Af^؀׍۴y]#oÇw{_o\͜Ͼo^hgȫzmvv:.gW9o]#5x| mkO zh돵Ϝ_vg,ܩm-]۴w !?r6;aŶtU;$m𧺪d.of{G&n#Pʬ [h>vyђmܣBkƂ^!fbz8O^w%'O7vøpsc}O2zi6sv}/b&8tݖbS}OmM8խ<v Qh"u/9[Z K?.,DfI~Dp>]%y' v2o> _m^9L'эk29HX8- }Zrk6*g;C 8bnEcߩvߵE'``34c=62U,og 7[5=rė-g?mV*7u[PI+oK4ųhS>%@ƭ잿ǨJx1G_vJd9OsO¾h_hӴhk2x;vE1Kb1K=q07> stream xڕV]S:|ϯ8w:$0ihE"nm˕@vR(Ԧ`9=:E$#%d2ddx*b3&錸<ǘxfK Sp?x4iH (83DVpgJSD/F"RA޿+GszUuc]y1>|l Zo٘[1 _b@Ϝ/ҪҾ6torn4}QNs|򎗊h'{ܙ-mc0eSڕeX͏VWs ussbѠ2wزAܖ6[-j#~fc?O[籼IT5HT덅r1(yRnL~@eq*7nmލ<8m_DO˫bwuV]Hdl 'dK:ƜKvܕ+ ]-i39=Q(p$%$'讜v.Gs@^7uU$Š-ewf2v+qǸ7S!/sT`XT|5N]ۼp-M tEg6/&KpaOw.^w=Υad(][nAD %F$Kg!c=YG$Л/ n5lP:}}I\7d:,[oǬC=_a;QC>zݴw(/lKW^3ߝC4w+}6X3֙}[StޚP:_w> I5+>:77ƛMBNM}4>SN">zjun1_7.izW m:Ǿٻ;kU㾁s1pN$j,GDA/?'HGt[fn_To]kӭ־92jLG0j{|8Cw5><֮\unwO;s\4%wv/QM endstream endobj 605 0 obj << /Type /ObjStm /N 100 /First 864 /Length 1377 /Filter /FlateDecode >> stream xڝV]oH}ϯT@B*RĞ=ױXZ'ڇ*=~;w2AD'P"EB %aa% | R4vfdH #A1i%IJWtR= -h0a036OGd:&dy?Tdc"QL@+D3cB#3Ic茕XvY  6`l"E H>Lb(Lf#Jb'Y b0Bff0sm,(X?aWe؏e,DPR0T"V" ŌDda DsV qDT, H&bBY&BG3RnR ] r(BåSFRqKɬyZE攡 %x @PPp$ M`V[ JBAiHef,6ҖjlFF[ dyAAɝAAȮslc,4@٫Wt򺤓7VOڬ,X׳g?^&>~Gm!.d]voܧtUܯ(DḮ]ѬA81Ӳ+RW?%Y]Mos״YYQnv_zrM E;+Ro2K_|__+hZ_g.o ZHӲ;^6GӺu,Ɛ7!/~!yAKQ[ }Xw~9MKo>eM[uy!޺Lb7On|Lw_Jnf>LJ:K|(;gd;Wۦ_\]Е9oNI{Oj+ig'!z䩞ŸZ"KPp_Զhj䤖0VEaPookxjʜ5^?5& .74i^Z =v'DdŴ?B4jQ;k]o@9Z?./ q Wh𢡊oxI5`\;Pq89D6䊔nk\~P2GY CaL8fHy۷CI/e{ endstream endobj 869 0 obj << /Length 391 /Filter /FlateDecode >> stream xuQMO@Wx3ޏ *vguB<3of=)BD~bR@9ARs/19z{a=U8s٠UR\AiCjJJN6\I/VvO19L3eٹ7*.5' :ւ&N|_bA꺩7Ѕu4ggo_T $8BƸ#(>y6;{RT:z*# e9nN؅!eԾfSi+eϴzĞ_M6QEm'~>/cn2mT:k{qeh-1}K9տ+ endstream endobj 864 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/titre-ff.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 875 0 R /BBox [0 0 226 146] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 876 0 R >>>> /Length 7587 /Filter /FlateDecode >> stream x][%9nk Swi T]~}jJ5>嵧(ǧ?}JgݟƧ_/=Z[ɟ |%Yv}Wtu͟YZ6-S"ָ>]1G]RfH;ʨEGصzPIky|]9<׹ ^KԳQ{g;(+b:_itq{/V?Kz5(ii39Y&MKZTw egO/yd[Wĩ}Gjt1NN:4`߼ͷV]Ilo*ڗ\Kmh%:a2kv, K*ḵ\Zsiq*Hq*ZÄe-M)kV<ȴ!5?ȶL)ƾcuAT4.9 KA4}JhfSeRZYzK![@p6w@ڄf-\޹Bʑ[rKПr?8#ft [hD *b~u0vF~c=+T'B*'5R?T&,׽/қaVRK`CMkiZ$_MTTP5lHIlD@f7ýE]. ^9ϻŮw?%y gʺY4ܴ8"4cr9̂FM\t Ȭ9lX[.0'֏ ޻g軏6;h[Ye9WFHM&љ.!{ Ӕè9.uxpȣ߁_Wďx\𼺨:"4ciwM*?4 f4)Ѵy*I #=˚U('w"#76TS! L_AXПE~FC҄\z^TOЬ&xB9_݁/aQ~:G"^9CLo:"{"w:!rpC~ܬ%B-ظT&Ä7* jˠEF6H98:3u^:wikz4JOB82\ЮPr'~4{M'@lMq:Q9T3.mons`['AalMjtAlVwa [įd'@P"Iٶ˻г qiZ Ρ?~Yu4N_S!2qm),X:FM,u^RD19#GLzz[I"Inpg@ull#H"{q~Oԑa!R^ho5ˋW19v1uib8d&*v9m =0Y{ uYWI9.=:zqQw2Ɗ޲n,vnlGײ@v ZTá>49rt42ڸ.bl81D>$6zeJéO<i6Eiͩ[?;1 *S`-W֞j};c_9+4ۚd#=XӛI!xYsl͉ߺb[X8{4pτݰEc@g`>qc\1W7 Pt$RGrqJ)|E]0x}o&pY!w|.߇YA@"/#a8P+OG5ȺCMΨ#Adei/vs Ypf{D++QVι$y`Ӏ÷E1f{)9@)0vy}$ i pBp{ W32+VGFi{ !l8zrh"@81GOs2Zz us;tIWzp5k]j/Wʟjʷ+A_jت9jp5ĶWCv5Ր}] ՠOWClp5jV{YOWդ`W#_u5:)A?}لm\ۘlo۬Ymf?/oCT6smߧaoZooC6GH}y(o@< J6۬6&R}x`Fft72?t72ssߘR: <ˑX~xlhs{/y;hwx;Ϊm`OCwV~~{f;,2~~)C9︀;nÒ~g՗V~g߹Oh?O~)O5SelCVř5#SCANQJ iTN-P  rk.-^2C#nۊbUBx׆T ( hfaŹ \;$j.KdMi^dj jʚj$0#`x2~PYU~fd|FO bʥ,ߍ}?8T,>36YmP3M,\!H9tJ YYV,zgOQӢAU>fݕK!B7e{Ti$@Gq5Mz);k~Y:b ?h.t:!P%X-3`zTm>4*3MhucTؐ.2UW&Y=ZmAvX1W|THZC5OF,^ Š2ޢjrW cL *!N57G|>.^Υ 3#(Q?9^bBxm^B>l֕7A~ 3Džcv`/z \T W{D+Ĉ -GLc ˺ B 3A(ޮ8Pe{Qw@REz]S%+FYY/5v\PuVbE]CMg#S\x~MWpv#բ,>R+ z-ZfZE(^]AmRwJ6pe-ѢDK5l!Xc5#m#WM `^<]Y4 YAM\6;f &SW&T 4G°蟠O. cO_e7\9}v>NVf}1u*"Ci2|PJDu p2J 66 -)0iS( ߍ=.'b,zp{#HhݜY6|N'{eK|(rN{FXݐ%4wT֓N.{=}s$q˸P(Ns ;c욎.>x[!"AoJRwX1%Vy(BRpFY wnf"@y i!U/w)T|=H1&1;: @=}e#s ;zu<QU;r?XGk.bݔ_'GjO-_/Qbq~NZ9?i6yt>fns~ /%/'7P~G){ (?ǾJa6姈pzn7'秨2=H/Rzs~Z$ٮ|I#|I>^9ޤ_Uz`9ϋ/ľ—tX?f_/)-8| ,3,I<_mZs`Y'ۙnOr#̟DKM#ơd3ٝ3/_w? _r,&h{y$KhQ~5I9]x(<ɿsz49I&a{5o2TG(U {b_`/f㠆>W찞'E'ݪ>|}N0Sz99/)a78- BeEWwjߎG1L 9+ ! L,)MNbkS`I1ͨR:Bt\!ף[yS0ݴ}mg:* [<gMQG39j[%LWU6I{~C6L/_1 %ﯘv 0 rJۡu[>o+~V5;#nX5\.EG=Stk̠L:]rD|ֵFGŮAq ' #MkD]\ l9Ou4G z Ay$LyE,bΐ)/`eRf׶8gm%Z81ӆ0m@+ 0 gB]).;Oj:Qt }?p/2zYs4/,vW@ ] E6=tFPzu#VP1tݕ2^#|֎=J@vh8xyŗ+D/ɁR||n) v3iFgB#4-W ߧDYƟDgaAb߅H0{3diM'N\,~#BKq#i TO>⏸0\M!e~Z@nn#([ G"_| *"qEA讼,6*i4am=H`@Z#hLj#4{$ Mpu89l)Vh4b^P)֣'u]Xpq-@qf2;[noMv?DvuL;,QX1z-׽o1֤bĶJky vkxtE;‡@h$R|QIMO?qR4%H2O]gz|i>olf)c[ zsR|g1Vn8!}ka"\D$ z}^+/)BeG.p|@#NzҼj@\C>XWncR*W^JHѶюqxmg|[C+AW \e\$'pI^oʉ(L\z 2"?KzWL\\01^)=Kzt3++. \. \_yw ,?9=m|O\>pep'peM%=˚Lu\.+4PexWO\,?+:#7NeZ՟iB \:L$'pI.oHzj.ڭ{-:ܯ.UK endstream endobj 866 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/ffauteur.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 877 0 R /BBox [14.99807 91.54739 155.5242 135.2476] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 878 0 R /Cs2 879 0 R >>/ExtGState << /Gs1 880 0 R /Gs2 881 0 R >>/Font << /F1.0 882 0 R>> >> /Length 211 /Filter /FlateDecode >> stream xA 0ofNJ,(`YeZ}[ Qv>CAQ:%ICЍyh4vxvO*p%%+ЃX\3PX`pC/qT=R}5P̤!13_h׊a}]G]#6 g6 _ Lh(e+m/VWk} endstream endobj 883 0 obj << /Length 887 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream xQkA~+^BRzc$?[L4ĘhDu3i쮳hBOxI e+bg$Y,ܶ%f* bc{\vx-E-i8qNžqo5fdXg?u1Nao 3UVQXv7re`!+M{(pSh:s3kTnAA)q/U"Nl|mb4KIjkP\` , wlJVE fCH+ }Mտ?m Չ|" Ӌ_SP/tTPلqE>x}g\z[*$/۫^rȟ"T:w-qR.=sP}`o.Gn\>қ4e0=+ x|fm^j?Q endstream endobj 884 0 obj << /Length 888 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xOHQǿ%Be&RN]u0UWSe]3Eu43x!YbE'{B (GIָ4!Z6{I+k $ٌg}k(! 1R6<"xA!͔`%QMⰕNň_x*,bZH! U3(~[1yYP3 \N|&m`-p ǁzl7GjY] +v9RRM9td]-)}>Hs&+iΫR}VRt{3qU)`pp=lWxHߧryur'?X`n!C3Wj3*sD3(4@UfL :hL*'/f!=YO@'F IL14cGHQlqXhZ'4Oӝ sXʫ `H!("0a,h(*9E5ؘ=R#YJ'EͶ]k 5&[FV O;7̢(EMBҩE x=5}_]Xl0?NLLZt_&鍻7=Үͯsm\ ʛ?yŧϚͰh endstream endobj 889 0 obj << /Length 890 0 R /Length1 12000 /Filter /FlateDecode >> stream xz Wyfխ[nzjFFcIB,B%#eɖm,lb# s1e$JIw7gn|rd $eyIl$Lw_A $aϊxx[ﻧV;_A?۷v+p°q6 %Ah:uy.N Wv؞8uOVw1>vǙ[?{O%)l<~w?">>{=Rga{ٻO=t/mE/&+ _3 _f%ÂWA/5ng>u8m1 x|! D$p* +_>gğ^W##/L ]-eH/H񈈅 ^>-|RpIxX <$A,`sTS%$^(5WjkSO\^Jtc4m]n8tYڜo,aGwF-;,K_/ l\}eTX,a VU,/`r_KS-.2ѿ?yʿ|?jM[FJw?y?:zs1~ʍѲ@˒ދ_ދS}4N/=_^'#Yni)kPtؖ)Ư)_!J XGb43.#'z⤘úT3I| ~U̞(f((Dr%R4Yǭ8MKvL=7p*ӱ1.$wj麮;"q-Ia" O^ |w_Ж%h¨7մD)4a&3\[ӱ?릕CC3MŪcB3t]镯ߑ ?_ooow57구Hs4zc}[(WzhyOj A"ބM-XX/B;8p Ģ5aW2Q(A]UUE[l&Q("oP)*LS&[20Q$E#l5'}M]:Zj&>5ɡz'L\=D֐iD:q^1um1[ Q7Jbj9cL~k(JLfőY%i0'5}֔.aʘWpWaUqՅ;+NaLjF2cƾW aB4{{z{1Ł;!yTkWW =d|iR`RñJ⬤}dYJJq w2q655 Rhz%pS=$L+Od$ YNEX\"~8*_\,q"Ȥ thn"%`8& P7o)#E~r 5P"SSEerF kؤė$t;W,gI:1 d϶݄P]z)Kb`ٶH\UÒ%a51n# ;!,tc?>+.fLcIVJ)USlyyݺ1Vq^+G1s 9Q)N}oIsC{O[6 PIdxmv S<`$9ܭ8Î! D{@p0zXAD$j\&.PNtI¢]4p-5n)k@zu ʢ[ h۷}fG61)J#`;,֘Z'QYMJƇS rkXtޡ17p+9]iFiLOU-Y7PQe?AՠS4ED[brjT QInYF[kbcחv^/O k˭O}⩏G?/]|GnZEZc\348rYrn5f*#@_)<8>q$;sq@pͼQ?bz!69`'Y@(a憙0 #T\ FfN4$lg*|<ƅ)1_8LY _d%%Vh!tB*բݖJq(K6"E۟$:\̜@EMv/eww ZJ6kmRVq6!w1^oX)FU M JU%~LrL_ f!B8d(5 0K+4<1z?t0^fccNf&5GeÒj1MbadZ֣j/=)T)v:AR'>2IBEIjO]Qv[<8ueHZD0)Ѫ@ vpWZEJ'|t,`\˫/ g? {Ż!9NlUդWG Ϻ2o.KE{P܏G6IMK#/TR bgv8ݏQ't'$P<Ј!t,tLco*f NLtY)B\̞ۚKMؿ+Vhզ[E^$Yr}=In vvyLzygz`(jXV)24m*09|]W}->/K/~BVeu F*ᨀSxc;ך` N*h2y?3@oJߧv.D1,ͭīt'w Aflo}(JDP.bFqawS.̳U7S 9l=nBfBl^S4RAHmDZ  4qV*{!gۙn1ʾBp_@)C`T7hnA-)4zǂ ڀЄRFIjCݗ/nٖFLQmb:I)<1i2 ; ˵{Ck;Ww@,Ru雴#AK_**3 Qs.hv34Ö8 4#u-||Tʷԯ!;zWuMWw>$"I ҢSoX{#ӫ%pTGebKkffvpWp-U% N#C"I)Ϻ;dzR."/iUX5 Hep]˥e^Ln),հPp÷ݟ)!KFN2Ӑ"CXqrױ\~[].?KO#q]۹:侑.Yǣf#hف-*=q,9C]u+<g /*@!i <Τ"D}vZ`AdYϽ"Ⱦ+!!:s<R$X*sdh10PT|;I]h"YۤiE$69\!8)k2^FB9b0LK%o%a,*8U*[37(C ;&`~^.z{vQ zfV;}\U$Tgyr2zMe#2;jU@{pi۞2SlVX릯M{3?@H G}5%{BUg/W+yCbt;Ϛn5VԲBnq}j:ʗ*G0nZht($;N2BPn'P 08r/q xC6w.CfvO"(`ay sUpVD)=cX"_A:QJnCWyleƪ0lsJQ\'PpjNV^(R >+>QVˑRt[jc4 U7l`w !(sP;xa+IBbڊkiqypQnRմ&-@0/bHS#l:cdl6gkUbcw8&}w%;Ҵj}Hcr%{?U\="\SVI܈@],, +%L0{;o;ǎ7ЭZ-FUЛq,'xV-t+L@0q]B@ wZד#q.ˡ  GsCO xcNJ?VJHu$m(H/qQf{+y@#*+XP]n(,qY0[{K OgGzY ,%`j2:ȷbat׫4LV iӷk,n 8xhρ e)ԟ3Q rm@$ם[KYFS5(kjqxCs|?}fRt>swt7\@`FK)ܱFEd smDfZ>x5z ~HPH 8M pP~8;TK1Džst|KlUIimI}x TaFbӫ6[}OImA2hr&>h^'/0IuU1E8:< AgnnJ| 0C0S֜b!В1X4 clf%q`%~LJǡ-ɸ[S\_0nT{n6j zZ$[5xoVgnQR.`4יЪ"5%HpcTK#ғ=rwwu.nLҸC-KMY 6 rsұ@>7 i<a-[Am'3d\ALBWsP1"#)`;nܬYmfiz?dkFAKF87\ _>ԯJWJ}D iN5mg5{kObs(X XT^z(S FjQÚ7եk-\ ]`^V0X A3]|iv[k۴t%1쯿^s8L}3MF:fi$3 8Jʫ%K=q x8AiI+<:4p޽ 8|yBnzt['S(a.xo>6iw:-t 8Xb{& v#"8TH5E[w=gTRJ-XڧX3yuݱ3l+Jvua, Hb@I2mVN0Rgi1 m.U¨(S@.P+zdcW{ n d7io\y}Agx\b▀,1,i:36jUF"<m޻ZI\(39z5OMלP/~T P=SUcϪH(?A,7֏V:nFɊ-D)Xf*]ߞO#Yex6sGmM[VԐ! goۿy,{[CBf"Ϙ%1MˇsCo. Jtkέ S jrY?V'olL^7˗E!\3—ſ ~ٟZϾ~Lp;s'% K%ᒲGXr A4Ex0GSc<Ϩ/ ς"R_dSƷ̿~~ԙt~~ \/x5"`plia-ŏ% Nk߻ξg}98gG7'0/#L =a檮 k.afE3 o Gayr\1Q),ij;)wqYf<”ҕi(ܷ\uE<7QV endstream endobj 867 0 obj << /Type /XObject /Subtype /Image /Width 768 /Height 512 /BitsPerComponent 8 /Length 105704 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIFHHC  !"$"$C" a !"1A#2QaBq$3R%46CTUVbt57Scru &'fsDWdA !1AQa"q2#BR3br$%4 ?4DM4DM4DM5C}D^lv)nk$~[kwUZEEQ 0]bR =n;ѹnvj vSU(43@Wf(ԥDbZ٦:=:ͥ]Ҷxq40kĵ&˴OuYG$: *zMk,вWnvP˜ "dfhYr2)Κ6xY6Utu0SPYfSQKI,(.5N۵QVfhJ2`&y㽷i,םRK u2%+I,[,bͦ .UVZp*HZ$/HLy$OB ԅ3"j9p}%^7-[[d֩K)ĮBtN Ă+MVv:kZhܗ(^gT3%LmMISN>BK(K-pVM=Y&z`KZFW KʡdG:EQ#]j*7kv޻}J۞Iyo""$PM,`BY>}^]iE5 -RTݸfZ- 0')P)0e,Hs+MUnk5`t[eҮ)Io*x\ȌԵcUHj@+Sns6G6媉j9&gF;w!=a"$b+MTp?Rc_&,!U[^KEN Ӂvؖ0eu񲧚}ø&J#Law-cTTRԼNrFD cIi3nR۳^e2Dъx3l%4\7$9Dqݛ:Mx{L5S4 X駐O23]u+1JFD]M}.UMEjv̶U`JyjGN%?2X9YsU1uf6UwE撮Zv.L3Nd@ĐI"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i+P-SHj}SSvbyuYLx\a\dٝQܨ_{EU5u޶-L#HѤƥaFDx@H3MRwingۂ96j-XHU*a?J'@kո/}+t͹.@\m3TJQ<j┾4/ eR+MPwY `_O<6ښ+p2Jd-+|"CI{;2IeKe JEnuP2qvXJ:B+M4M4M4M4M4M4M4Qӳv箢S-RdG$2̰ʈfQ@B ̃M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M5gSG: ,XR: B;:xii:HZ2))cieV`t+eVXD#ǞHB n@ND ȃY( zxԱFUij깽<eEY( KN!ͩa<6y kkb)8$_\հ-RBsiHS o"s9 ה5X{&DQhTCDLIE9$oosuō0Εcag9*qꉧȫ}E`۔Ҵeݍ7m7jb~+rB6сè ]iHTLX<~ lq\3C!N1`92R$GU 'bHNuGe TI ېp .?qVmۦdEͶ#:M>;-p $jEqjhBjrtHEQ!9hS`-|Ÿ%(D2X)l>߷gXm|"`&M|ecR%SvM4QM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DMiw1G809|uV(q;d؇Dt? :(ci[p9ᇏ+PGO" TpѨ\9>5?_Je!9t`80$y'5ϫ6@ ˥MXUJ~M,'}C2s܃1c_I) TȢ9 A_f|}o|Ծ'lq9qwȆEjfa3FP7/?ks?~I[WwzTPҵtYC#{3zPUg\pϓ_h*qljq$?ϑkR OGN<3{yBn &&cpeֻOLָaJƎxqY|#$k?Zקb$Nyb 0G#󭖶y]J{@hAtc7ri M4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4Dև|O=='HXdb[ǍoLXdIԨ 9rTZ.m~꯲퓳u[PS8GmݨZt f CΧ5Xd#Hsc[PƖf+ ;c?6h`w Ṉ Ϗ$ǟ>5t W8,Fi1LDkZԞ>@/|3v9g/8_ȪjXfPUeL $~Nr@N5jIZԦ)l3#:H}>@r2Ǒs0V[-rSNyek ᜷o^gϷ{2|cq[;ei>A 8&)Z_O?2MZ ;$eB#X4Ui'= @ c`t: {#y9뢩`sU=u6o~Đ78Ӽ^7˫qQɀÔs%2U=}4 =Q Gftea3d> ֌(-Z飲d?b QJ&#m*̋R`OcTTtMT oݐcC&@pqFeKf& ,`8ީc 7x Zp5 Iq1K+rGV,4Uj#~pHժ:׿C5C Pu:s-ךM5U_M4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DMBW-٦*4 (8#>>~u47RMֶx#CC`P*5]&/MrgY[B]jzTSqBdyU|VH%(Fe"?9FpFGΩGe]khWVBQZ`8ۨ4 3ǎ<<|j2,>& ;eطFmGfV/U/Spxs|sg?/G2{qĬG_ZZ9H)2Ic x#s]$HaԘ$S^9AڵS4ЬܙB'Byŧw+>?;?|?uiVvm}c++.h$,$8Z Gw)Aqtjg4*PD`pɊ\@g-KHӽ3,GpC55 }De,*w_S_ruI+6\I!b1JTຠ#Xv%l-$i2H.[4[&i&i&i&i&k< /3*XB@ONJZm]2 ^لth`Io*@$?|YpZfS I:))e8)C$Q b|'^WJ[]]/fy8N>θ}a?öp&c,x*[̇,;wee\{hޥ&/F٩L,prČsaGʀT6O~ܮ }ASh>* C57.[ (WnjG*ƿ SN2c9j/*AC'B{ǥeW%1LrfvĹT GBJXV[pM:v[iHJ9u1 -?S:߻cZ^D)5;2+eIV8:I:)ɝ4R:;'pt>p# Pnoʓ馚ֹ4M4M4M4M4M4Z-:C 2TwJUHhʖ\pϟ$Oxo%C(5 yPhvjwKE3, ̆F*I?v>zXonf5CSI[X(>ub ^UDy*ts:XM!x r{o# ºaj+$Pr|{SǟSrKn7dmT`p>G5nuF;~䠊% u "'[|`3 kdPk]R;WqIN-e=Hi@d I+{;zn6#`edo<GsowTW[6*qYQTyaTC``coiz Hj GPq&\~͎!H$X kqU >>$/3m ;k(pm3:#f]{>{AUvC IRaP Yً6(2~~Ƨ) A5<+ Fv8ĜK6cNj)0?}zk7Oԫ\(g&mVU Wݵ'|#f*m6"t5]Όx[j?.L#Y(⮇&!*:龙T|b:S`"#䦚i4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M5]nܧzbHc.@p>F{ƩXZýs,-nM.6{@vՎK-iY;38'ʛeS<_W )5 ~9D pq󏱧qzYRY*BtlȢB 1r%c6ٙt1e_y3ټ[M/ɶd3'Ǐ+Fs &d4cT@U8ps~[`Z~Ҋ|y| Q53݌QK@!y`ɓu`rN{Ȑ8"Am)p5BP XK*HYy$s'>Kܾf\h.5fS eF1hʅbig 5LqfPYÕ+kҖjzUt++AO LyeA>u+;44Èn@i#6ݩiE+$R!r' ThICu7i?9N`yQj%%T2wޝ8F!3+.rx)xbKyb 00l;kx;=kLoѿM5SM4M4M5\mwx!eF$(1809 k6SsdLeJ̥f&$/̐M545κA5}c:Se|x?ٮt7lWtY S? >qm'tQΫhmD4'z]iﳽ|uLW$arda\sxQK*UYSrgMZZg(@9Նbq-"ܦGrS.6I<ɛ W:JGmc <>Lp B9qa!I>e:Dz8s2 8xIXFf9iWHL1þaL7W\7 Zf(ZT̥F 'OKz͸vM[%MI/$',Ř cXzu2[fٻB:*"Uf:)5g30ԃ\.-q<_Q\寣AkjH3sFrKX+bXQhbnYښ*Tdf c?)zjt(r22 AԸ ت>DmҶoYA `H Xay9TR"bυ2u۪%\MI'F x 020Nu@ة.pJLYի) y3]j{K :X#cF?cŊm U"SS/I$$~QRep=C G~*|FUg.i&O|͗GssC_$6l3/%b|cV%Q6X,JFY))–pmЉԉc^1K c98S *N1 kn}8ۓ!{Mk4bLo@Bg@$3*T9M`vUJ=>e@b8_O8<9-vZجRP%DA䑫2|F#Y3rG}F$~8@iUŁx9i;Kn8{K<5 '##N8Q>ܛo~TK{rI$-;"g#b^DP||kXToWI$-Ry"Fk}9#mifYqQ.䌁ϒI>I'oEk;t1o)K^K`ey8 lZ#ҚIP #39AR*T%ڟQWФOlEq;MxC$SU:23yU_ִ02"M4׋^5TTSYS 4 Rrp2O䁬Yȭ"e,1sI i3CWJ&I'u[bz0s(!Ǐ#0'T|73}lgO8üplA7|4a?vU@: 5_g6av5Nm ^tKSM4A<.$Hث# #]˰oe2tѕVQ@o8}>Oθ"U9[Nƾxm-5bISOT1ª''YJÚCC]˿QEOx%4] ftvi+l)1NA!C<>'>.kD߁O܍䡁G_[ ?:݇ % ^t۹~{f0h nb"comfٲ4 5L%=t3M$y^D8$?om [aw)=Ú ?*y-t.Z2Nd Ԑr80?f\diUSYq' k^LLO+'黢gyh0&"HP#zuip]8o8rHG~IUfg ̥=>?Gx<SXeE*%[M wdTH,^5ª;4tZ>CO0NG, d22{'_r-+fݱ;o"7SE@9Y뤊KU 6x.@'96ةL*+QUH'EsI' uH فm-dwlgpٖڟYnÿ9u u*PHI"B>}U|m u,~ڦiTɦh?6s8jLP.x `g_--kw5~5a/n$1kcZg^ pN@8$n2엘WTig* x.ĹSBc!8%KV0 ıx+,{gsN"aëel*NpOvHgC|Y;Or%C;*Wg8zհgHϰU0loV?Yv[imrAϿOىW?ecԳ÷%ktq1AԾk5U’D]hiᮘ4ϗB䑂G~ئO_w&+ܺUyTgqRmSxO9+N5n!u]`KrD){'wvtjMrXIRpdyϏ`˵H׵Yb71aά_;rxv|%L0p;iۏ`G1ks=!kc*7 .y-=|Ke`3w,Pr~`v0I&(?$ӱѯ2X,cO2Md!hDg8Ef?ѯMzqٰV*RT0ȉCTcg8guWŎ# Dg)!>Z\*`ojpuNU(>rIq?k܏dJs+ c 5\Py]J OkMIJ+v\"6y{JdMW-z.IqYl1O.=$sHF⓷[yE% @('ImTuCk/]nBH4ұ Yq 嘳9,qi ;M|ny+߭ŀ$IwA1"r?Y~Z].5Jb ! *G?$vܦcJ5>|13?~n:ʚ;}iv+8 RX8eO38Q8&)Fcv L y>imwxٶے@ @Gg fGA#79 Cc2|qvzWME,JL w[sRP6 "E :Zӹ[k[lU4i&Ah4C'qѾa8*C4pc/g G2݉Su=lDox}֟wn{ӶqގI.C0@OŸ?5[gQ =tjXDqNj|'@'$'Pu-n)L,j[OH(/c? nѽ;-q;~hԸn4ԭ@n,>UFTkmWeduꪚ:jyJH2Gdzuz9ꖊUejZ{ɕ FrkHrJ]~};麶^z?wp| MU[sXMuXӔn 0pF._y(꣤y%&App3˰'x RF*fy8W=mZLA#`j{nܚT+***So 0b7?5qܤyVdj!19>2pIöc”{zēU[Np2=8,-2YV ){(U*2RGZn5%.v/y?9^'::djkhh HJɢ"\IwL&Kx}V[gf'VE g ?q =ejliEL*~{U/%N'{7h޶yfzzQdIbb$&LU2:kVm +CH.<·+nGO^uѓ[k&弴40J!RF GR >qޠoJ+5oSI{5DróBbN@>]2X`9ǦWEDYYN=5,Tza4rH(G~l<+[#Gx67+ddM؈BLcW22#( d<_RpKiY;4ӫ%b*vGB\c"OAؐ7F7~86;Sdf ^xno]Yḗ XU-G۰yOW 2 x*ꮭ GFi971pH 'yK @\+~}! i(9EBƵ `(Өj6d6;M4ֽmM4M4pUݹDkݳ3zu*s/5#rbsjeay K F^K8`"Dig޻p"(KNY` ⷆ f$Ikt1i>F䘗6oum;|ݘ穸0fW4eTC*Hk:dޚ)[1rb2# c'?(l7 3c3.ޥyb?K6'YN?=g {mMd+HrN2OǓ: :H FQFYC[e ZOyUH1EA':5I:ӬEiVkmbMZ@F v\ CusLt_?y>xz™(>A9 w6cުw\|*9n f$Ij7j~cXajcQ-!g9?ၬ)bpB>P5q)2 hf0TS >Ϝ ~ T*cL:ʬm1{4\,1I78IuWTT1eg*Nx䓍x뮥 _kqo)Љ HuibVҢ,5Y759_5W#t_Ҟ zMX妩FnqG.|p|$ ' ITMMpyQ#b9d yV@6"5#r ĺTx{A,H]h5+qKh%,?GDΥ]|]>ѩYdWM:l |c AZ/wWG,#X槁+x~3tӅe꥗o >HmY" U3/}&R\H6g9jt疿r'\n #O鏥{l#=4yE K O5<îCCr嗸 zOo/ƺ_46\4,?[0ٳ0vjv~Y>)k\jû&¶Zc뀐ąr##.rօc6#SAn5Q8yed`|1#GCp) ͗y(iS.6z+\܀1cַM}Ϩd}rҼsٯưnj# *~JtDB_WHTyȠ?Lw.v3SJBQc}g /i'e1JvlA\+0~!d'r~֠ܖgc-8:YX~#[pV$芖_"mze?,Brf!1fCqP7Px9|F3G|NU鴹6y{ Tqj$jpϥI]Ms v ϟj7V{.[oi,/LK*)Ho @\ķ JK@dIR}BɲmTETMU.D#O I a|`9_ڙ橩i&W/$1fv'%>I'u篬`z=OE< Cۇ$O9+SyMa0$.$u7rHqhS5[vh'\EV2/Tl>:Y,it70'upoHQùcOeĐ2x83Mj?;g5z:L_Cq"y;-_?8ƸD+0jOH4Z)J{%ځmġEK;t]=E5 syq6Ur`gf]T5CZ8ERuۇ w7HI ګMG=hU/U.y?1Ɂ*aSQWf(3B Ib e] o$p ; Nևy#YT7=sPU7 !)w/;V<)%@f\ p|[VuɮWGP^5_B3)vo8!qj$kQX–9'#k3Jaվ< / (}8&01䃟?&SmfA`'H5]uQy#uM%*hn 9%pI3X:;e OM F~I Df"=Fu.O-b^4MUαMN>dpϒ@^+Sn}Ğy  k\v3,5t7K!gUPHJ@htl&`7c1ej=pTQiÊ~=u-} _s8eRq $iBwG(ȥUH'Nn G8÷nl5r{Ơ90l|g?8TF8߻’O5o9UpttHNbRPŃgqOLR.U(.؀1$䜝s3es0Xc'5>b/ޚii"i"j[-}:[+khV-;rY|`|>0mRXʋLunR! yѦvk@T0ݫ=U<{6lLwơZ*{DXUdR\҆pA8:Emm- bۏ+RIM+{{B]2bc-!Gm]7e_t’'$ݷUj&bςpN<vB{M&SwSh#2d9=Ni̩H28xxZV(þ] -\ۣhP["R~4S۽%96cJxE%wڥm}; kZHAlKuUre%Ic.pVSK-+N.+]QY} u4I"+EO  Nvyb ՛:U_n zV](gB'0sNg #a 0"d#McFϫZ|k,;eC8FiGQQ,1O(B]H~lU[Opf^֩l y4:>UA/T"r1cst47j*msL1†va 0*uT[驭rKDZ$d,*E Urh&`7:솈!gutX)ܥP$+Fj%0YdLǗ UuuoT5x%|ƫFiP+jD|'!B8Wu..猝.m  M4T馚hh':u+J-sͪ9#NpM"L.?mʜ7\*A9Ȉ?jQ7:y[?]˙B읓Ec Wvfdr_~ͭ5A̙>YpTMl]O(?qikX{;$q}] "_=9A|m9vvR9LSF,wcUhidd8$>|xx-ՔΑYe<D gƺlR/gXelF Aט+ŠͶ,;5NP?ײ9an57F~FIܬmh$P +:֒]6@)8?CT ΨSZڹ {NZuiTNG%PԊmN'+,Gƫ>-}tvxV88+|g.??ئ,.|Oc`T u8##:YϘ ݟfXX,uKm=nV 2.]G6-}pVYh*UI@Gʼ \rU<ٔ[s~XҞ+F蠸ӣHCp( 1,IeK3N~Axdžm&/|>ڻG Qx V{/$:#RḺ85#bF1ۭIKQ*vy0ܪୖ0<5T QȓH0~?? J˽W#+v0N:7^@mkYICZ,. mih˅ 誩ki)ڮِhNv9ImTe=/:W]TyTT_n(譿?(_X.e1 qWU y;EԾE³?S ? L A77uUtc:ڄ}Ce:B Fʫdup+nr7oW}j=EΊ+bȣ'C8}#ι1,Oܝ_K1 K^{=5<)VFFRC cypHmfccQ<˙P5ԍ@3@|RH/Z E c'''YJ^~Y_1_?Bnx$!y g d[]m{q+,T L&|rPGSճ+27؃\B~&2i?UGh8@XUnn%+Hi $JK{)q,2I?`5=g5èdB)d@ĕß f?}} ˾ᨼnK8kd$ B,9v $.II??gZhmGoMWYeʱNWۉD,ũVșj'$4f:Jf,_L!)z?Jx?շzww9vf?9F8PIƱ?I?Xʥ*)k6qܪV̨%~I"nުXc~"Yѣ7z*@ڹٓԎS3'Nߥ]ݷw6ޖJkz|@[L{Åy{N 2!Gֳ7pù,D;ӄEVY"}+6~ѷYQo?>5[XߚHM޺VG!23 e||uX6ww.}$ 5m8P|}>*{vO۸vXl;_zNxs~d="f$O$'PL|uei5-pTbPP:j`XNkF%}pر['8Սxɿ^ŸeS5GFl+kZ&i^JVFST>ƶUTTSYS 4 Rrp2O䁯ձ8RLNMx ;B&vZ#{i:8f5+NڗRs E+sٚ<Ӄr<- ?+ES;!`yļln7-‚~H0/{'*jOSn^#y8#:ízʙg|rW.́| mYuBܴhC}M ywwr[ޖ*6@i~2~~u!-.:9yN93Ĝg5m4XaD 8#}Q|i8ɹ u oMnY\ GǛ8‚FO-?7Hc?\ysZBΉo{#b9ف IDws]u޷S$ۦi$fUb>|v29dvmϷnQ$p,ϱb~>uz I.vU0B<0@'$#2\Yah&3͗O9f4@6N7]u,ZZR-3B?&2 ȚQ##UOYN*V"FaJdưmj]i|V䒀q?pp@# g[-] lw*r4GMZ^pDU8<534֡Pza8at\^52I-DAuZjOk;UMjhՅUD%`l9$g%Y P\)yJ)d2=x+Wlo.`ڠyvƤi*Un.e5'${Y>Td꣚Z`k-2\ztoK[)y @;3A C79I,H;z᭳OvܖK Jy"/iqF-(rndw9InoԡUe}MMuk&ݸCc;mzD=5̔CQ㑍'ץ(!dU(,@u5bt|?hT{H =D+D0nh9=oq(rON>''Yi92TSL `(Nͣqs ohr9̊|+_z`x9#?c9uE%]ݩcUyLyc`y'#| t>yVjiwetdU;`m?oa'S j۽)S$^:$է`=, GuE6IT8): zU=ܾM *29>B5R?/Qg3/dž,I V|14MRFI8ܺ\T)J[E7@p[pG[,GX,u%m^ X I_Ue*Hdtn *F? αbH;&2Rkn: JYPqaD$P;#5$@:JX??[H$hT` Qh˭m|ɭNc(a受r<QYg_.NR>?\7`\csNOh굑Z3פvlniT,?k8IƱ5Hpv??:usvwJ gzy{>ݢ(Ґ J20υ9pye8m[qy<~kMaYLk NEOy^I|αhJEGuGb?Z9n.O&J2MsZ{CE*ȹ5 d8uG0`>?[A[ơG^1tmR]=4WZih#2'Y#%?cOMEY ƒTF"d?F-nZK1:#J?pp|kEW`FvT\"`g@FM0uEx zk.VSKGj5P-M\keʪ (\{vPubIUoZ~\M [}29FQ ē1ƣ -uF@4]כ={%xJ`qCRq|ږ6Fjܽw7Ζ+u֪kKYci*F쀡QAwgZz{EELP"Ye}6Q_M?J9-ӽR4U纤 m Xu4qKY1MH,{OijaPpNssت-1x#p/!¨)8hrD?7Yu{깎'K8Fݢ@3X2},3L ܍#MFQQK[L%9^@P>k7~loWJtY1 k[MKKWS,u(BrQ?s[m7X֮1C\'0e:8jm %*N}LqH4TQ0v`U]7Z[ y֪)H^QNCAdӨ;w;զ!;h\C0f!p ;q䎑;(%gOqsz n?99k,3F&\X%}}z/Tsy[x`ې O?4tqea~ZX} \:/~onUrf8vu2 xy  ?jVvŲϪz3t=O93Aur**1Pp\S/W*[#  sV5 s"HLlpāyϐ5cQTWL,ʏ axǕp|}ƴxc0ΒƖ q]V] ͑Q A r~s=%M%ƬFX=u#T#LJS+OUmlR4e* ≎,21kMjkTq#$ 8. ьNl Ɛ|-Nldݝ4q&T*${RU^[57veWV'[#Bx:Y?j瑞:n]pi%RX@r΄ *N>d?>u+a 3so(e R&ւ9EE ]7R-uBl۫Ռʰcel*AyGzF驼ljb_HI8jYEKKELt@HW''xI:ֱ،(<3=[E IM4QZYp];W)摙a  5%:%&ࢭB`FDpt;mvnٝלT-<-BX |JvlY/VV#ƴi@`f8 mBv&׸5RߑL<^8'r 陛~c0";pz?Lž+eHcY642+u`Tn~K bž2? j{$YeˌK";6 ~GTnİx~%6ݩG1Ib0ER JyxXl+GWyY4U8 {Xs9)Mc𺓢u* Uhi$րc`Ά;M409sGi齾+¶^#ej\fl$` 'xq]][6-mhf"J3fyyg"#-dqt)=ΥMpl"Jb1 ^] n>55Ml}Q==1P@Gx֎G=ݧfʃM4KM4DM4DM4D}iW3sS<,srgc3NUv\Sp6[36F[*ή 2?W= mqr'$|59$gŻ,$k>6~먲wιn.6JfT<A p9u/ܻc0K՞ ji%n+HU09)֑I)F<#R,bO~ϝm)coHBniΤezGzz祔ܡH1hȀ/ ?ό]5qg!u&Wy9ܶe9VKGE* vI9+?|kmKi tU+Jxffa~Z7Y[invdI^GSRbG> )Z}ebg3Ds22xp9|k:$y]Q'j@<[G׵  Q & #?'ӫy7bVnvIu78ͦZ /Rld8? ;[OftŶWy,$Pk6lFU ZqGOMEh.*vUH\>P]I%T|Ԍ0O}iTXk⌸ˏF9h[_D 26I]n=YS`6fDq>b/u V濚ViiClHWks;8">󪪟jOnYs%իj|uSap&Ф$ YezA*NITDP^iaFn1"' ?'X59[b\$F憺iB;+Bfq:ΥۍT3c#O5!GcjgieCCKF .|lPNH"E pS2 Nv6+MDwjTJIR4'vec`/?c67iiS\gpخ.4ir1=T\ 'WW$-ç[&`=afHQc<,3m]7VbkGJ|ƴUCɬ7ꤥba^ǒ4<|f4ZR"!~sRH >AZaY6+%RjڊiSƪTF$3g硊F,g]E1Cq1odߕĺI:Ɩ1iZ57~tё|/w]G\+^k::tdzv9k<W?8g7]V8F3]:}M[)oVx=4nyMKG8k` W\SM}co kP` RN" 0$0-̜gD{naK7p$Cwެp.| ^>##1MUIXj$*՛8:v>mvnznWp\P.1nxĝ[5yn3)a7[!Gmë;NaJPr|{ʜv<ĉG!o5kF1Zưj,[gQj?W_wd9|Hk*t'Uǀ'n骞ի¦Xhծ=4̉,!ϸ8"7<\r^V-Ϝvi}M7|o'/=S5^^:]A EI7d -R4+Člj yqd?#PvgMn R1π̀ ƢO,(> ,/W@vAo>)fƷa3i"V^ VE q~|N9ڵxiiY&i&i&i/h鞞VQx9C֖emjiYi%nrVj$299R 5-:i8x^g`q!W9-$Էwzk剂rr#[.8{K~[Y"h2|ȁ 3>3lIy;@:y^mB՞`C6\[$Ifw~zdISI#vjrx\1 r0ƥ6lLаlb`yrMeWB=*<>YaK1[@{v9`6{ }ڂU^e I.@?Utmmn7V+vAYk̑MA;!' q8ؔRHnqU/v|cO]F:zR[l@@x]WC14`idvX?6IT5#\"Dqc(`S nj)Cw32Vyog5MP$c9eŗp9m-q[nDQ3=5qn>͒_tKdb+7u =J{E#n1{g޾aXTG̶nLޠ[Tp׋eK\IX*yEMZHF&^1V^'W].qZ:W\M5aSBqO݉͒jW&詂M5p]IHx3 v ̡gO38vP_Tk2DT 9Gı2IG# [9kQvˑmZ(u;@$EB|"VKty^6@{aqO( 2ͬz:#tI:یFPeXfd`񢼐3…x`aFp)+QQYUQSCK32R32ĎrW\a·xT[SzH.EpH$W1?%Up _q}UH._Atԕ#ePvu%cRTQQnߧ5Ԙ;kG߻Ŷ)ҖMKq+2c.JιNG yjy- ٿ-t8@? 10WMs{jSD*HeⲠ"T3 9+-ub#5OM,hTvX2 BIڜ>A6AA},- .s]Z{g`1{:fnwut{j+uQUPz9Y/i$QD9=VM{Io/W1ICD.<䴅HV٫%j-3 H`%#,'N&bR`[KC7^ Sl-xX8v Iy!$&'s'X+ eE$UUb2$b%q\'~{%-3bR4u,J>OƪMy^So X e1?H>NO#vx[O+dܪBgjqzb.bYK޵d#(>011?29l6Bl/q%txL&5h:I'f :˴7mckgT-ThqtA'!A|dv۪.$jIrr#/A]/wGd%y|=q@η:X{Lui;G@/r8e:-ځ%I .olމ&3\.N0!!l  |FrW5,YO,ѦNX *0q, f7 B="0Tڏ`}ڝ4NW&XAI^oM[},Aip 4*U2Mg'[M}⛖接-S`!prrO̲7i)SY9- Q+ljos~j/K=E si))\n]| guud7ۨ4,ݣsi+,6`jl"wLLP nֳ#TY9*<~P>劍e].tV"Y???si舓s>~?5wػf/t I 3Rl0xuޗDҹv62tȝݓ]!먮4ޢ~iȩGdL' G9 I+3͆[ӲT,]?w$kzppr>5eu *T@:kJ0=;u R=<LJ/ 24m*=pZ*)>~0: [$E,5Ou*D<|:Y|U78qᯢoLuئV$9qQ:T3*H!b j$[drJIQQuNonAj:ָHc 2><`p|ce=9Q%hVX0rqNR?L ,%$7CaX"C?8Uh kѠD*@ b:GhZmIQY5uL[ [\9 q>|}b-+\]=7cyCg!T.1<|:+~%ХP&l]kqxmCI-i&),梨G./y%?5=O/FQKgG']%h!cH*;`9R|qn>ˎd[<*TPH%Kq#rkfY^COΓyԾG(V*Gvo%b[7ι]ͪK%_22.8G`'sζnW:Պu +-9 >u㺺OYks=%>C1cʜ 1fFJBk-Bz#/,|A0u3M3;ҫi+?͙tݖ鼸W5ISA`P4nr;Up1*p9t߫p_^ym7tQ/]-{:^`70@p@Zc[#Zii#N!rŎ1i-/8,ƪbVmLUy69ԎdsU2E| 7Nw$MpUGUgձ$TjY`eVV*U`Ssvv$bEV5(PD(9(#:[z `[\t@wj|MN} Oktj`rl?z3TF[V$0Y8?YʢI<*r'05'Uݎtʩ=(k!p dۂ[5?̡8_x"_ԟƬ͍AO=J--}IIYOoC`y֯8lPVYY\o⮺ 42UIaǩkdǗsSvOJ~YQLi_otrM x?%ƒ"tuYHup,U[W7z?vÇiaO>~?'mQƭj']u.e9u4\-`Yt]m6 mlvIA#=\ѣIRO1J~n;lS ss-Fqysjv?~TNdt1Ճʺukɫfmy3+r9'8#%Oj-hث⵫Yn~gi"朼eAL>JeqX MRKձ PpIC8qja19.k8<Ŗcf0Q;E&uS *8'ʓ_pm}{aG  #NZk/>c'p$i;-Qk4EW;yj% A uD8>2x#'>ZъhvjD8DEfY|gu~!$m=Om %j9UҲ"y W{>Jd)$yg[[|,Sa8 #Fثj^mYiQٰ02Hk$PE1|5AH ct;~C_hiN!8C<2OIP<0GܫTB?uԶM`Aw{jڔ&**_NygvM3FMHHPA$q]Qi\v6)'o2FM(4Ii3 |~;LV=%Q4k Ͻ~{E嶖Z}7SRigfC[;CGXȌ ܨ࠳d-seњ;vq E$` "xxcyrO6@ 2=t2=!5P$P$Y`1fAr AlkﯣMd{u-XβvsԶXxX؂xQ~pX5 ГHrF. 1}'U>;CL~# 0'$xnXLj[yER~KdU4Pۃ#LU<:zUclz[>A뢆*di0KPR廷ث=wuh"'(xnf,Pc6uJրI?4-s"T[)*K7Դ 8YA$(&O݉D${Z\@ >~6UzgCS)j+)k#R* TU X[;&tw5(ߨrTx`09Cld;Nߊx֊o8X,hJ`N u]qM:5Zi N>u%G0s0X̛ի j龆]"J@r( 12=IYQmRic,'UTNXxlVns$PI=ABBTC0'CqׇM"HnPĔ$! G!q[f%ulZHSa*%ŤLNZ>}9m+?AwԞ*$H,@82!oHWKM.)j\9h>2Ҫ/9nt/TTphdUA`1.UHb0=ۿW=Y]3-S,0nŁO,g ak\jeO[tiTuy$nc]m'Cb̝ؐpl2{NGϏ'8雥7Wi=Y?’2Տ͏ ?E'OKmJ;HghiB*  q};~YSf3تn+T(^XD2,|)(R0\2<| 7G>*3k)]6Љm]jDTI͞eQ$;fn B8ιLW[Zvmdؐ-(Z:gIPhcyeGI嬠y񱬵t*:@=H$_<q<Z]Dxm{ol$SݝT߱,  `"GRp 6;27[Tt?;Ei%WJ}uHoS%IV'Wdy`qd0c]}4_ A]wRiT! ),u)~%Ѻ(Cn4R8¢;$8(ѨR8P}O!kAS6 Dk; ÌL̋Cn" P{#gE}++>T%fTr~5~ocpS3ũ&6;c.\IύomMI׋%4,27G_8u~{TNHF_^KОa1.f;.%25թn_wNV^nVJKw-1\)ZeV@ ɔq'`^vCFWu<15Qor0Ok;}8n'(! ,^FSeT*PNIewMea ZwbU8Q3le/[ 7(ɺ)[i lIxKZomu$Oe'r?o#yUKeF>|`>ULL>߹cǏ5o d]Hi0e4L$',< xǻO<٦ĺ>zOÖtQ]p դnSBWk*%uU}5 I*y$vH?~sۑݖ b2_ɾTKp|ݺ #W nܝFW4,d)j%t$ Y8VbWq!k|IcXݣi ֳu2ըשR&b&A,LD\)x0^i&|¸ukzQEqxjђ3>uӞΘ% 3HA$?:շӵj^aҏLjalN?G2N=s -{S6`i귦զziPsLeG@>:ʦܻvrbo<^ҡGT!>,q<0>>~> GY|dfk" ` 'Lڂ,/qr/GV*8_ӳXAkzv[nڪcFTzU!_q'8ɾi*iz* 4Nb99 A[&觉DvͬFECX>|W޽iSvԩ_t!َ5jb]T5'Q!E뿭S%ia$6ˌh@ ņ&ʺ#Ÿ ]Q ̈́KKjNJB.A#]:E6.ݸmeoz(jd/ @b'\U t}#X UFFI1D۷%zDV򢴵@1pPAgqr\q)u8.$M1IUfZʢ*$l;Bf ͎ͧ-dX}%!Tqοw͵m4o]-UX=dcܕ|{83]+fH*HTKa[ό7ms(ծl{Govfcmak:(?!0y>au|N5ėZF 4$]U;MO%EM|pIUE$0_so(kڜ_KLHCpf*I Gq :*ɹfeV<Ʀrj۶ŶҖXPI,噎I?$>Ҟ1T4RhCwpjdR.mWLD`ttek):w4$%s3zGpvXॶlZ8|4*|*/~5?kKb&L_\>:E}Ӳ|g?,*Lr1~QB," H$Σ@H`ȢԻcH; 2s?ՋCSQALTQ !Gւ+e6c[?M="Qxe*`'ƶ 2ȬLǭh3l^+2 gP`nƶxLkw(%kI U}8+δd @\۝-[]NN3xxϟS?J68JơT!%=-^apcbvwgG3-hnC[/u[%Ȱd]-w $Fw U$dp@q'+KS5ɜqia OyՈdq8wM0@VѼ,,h6ܹ`h;| ՝C\4sChU+?>2ĸʖ*C}r[].ٳvvHu.{|O`kcfZrn*62 |6;f V=~a^-էCoEm=;)UH"cx|d$j;U}O[$VF\qhYde*F]Az[`|DZ[jG.Y]}nu>A<`/,)|`B/?#_u՚IxfZO ŏ gIvX.U HZ|ϡl멽5h:kqEM4uֿK2om8#>0XXΠ,orsaEfꭂ⏵ʜ8$IϜƋ]~~_?U8aɱ-|V[jq>\yf'?>5UB 5YeU}G2i2f ܝF5.quG0I6jJڊ*hf3X.F<5 At콼AN7p#&C KnDfN qVnsQϝ8sqqPM5MfIAlig! ??>Be$-qX`rKxԧnkoC)eF]HWpG|‸NRΨ]rds%KƢx[L7g'OE}'5C78vz:DKq ;͜S$8ƱjR+*cxϖu >>\W[m3)ʨ?l}P,8o'}va,c#.ࢿXjRm(ٰ2p \mQ@\,"H> b2q󮡵]=߭C) I+R6"p! '.aaboΰq0VM4%M4DM4DMTTkVmvKK;DLSFɵo6ElCR*Ԯ傲K+ a.,*1_%2m6\}k6JoU^dQp○ן8pNwKNs=W;{駪CMƎ*S/IXz -S($JQQTG&$ xHɶܚ [Kl܆0}ʘc6 7v%|Gn+p3fccêQpĂb0 5P@.U24ִ /u륥Rb+T ^z֚ ʚj;4M)~"ye.\ԲPȶ%{r@)Pc8 x=VەTX-S5I)(dy0\H+'fx" Q 0&HLZۤmz.{jrZidw]br s7c>uMd5iM4DM4Eꏭu:enMKnMx#ezf9GV udPY n; 3R eyvXN9 ]/y7-p2WT \3r9r^O[:NY(v뫲V\җY_,˂qګF"$avil wZ}qUgSH#Vgc%TR[HMΫuzV [D ]Y4KL4Thb G*:q\1EWww')/ 3[;FhT_hOeW_{UdU 5Ϸ~o[ʖ9w'Uȱ,6{y M"e #8s"W6: l}Cw{6mETT{Ԡ\ijQ rE$<pݛX%z)*TIc<A+ *a+BiTM%#x7m]W6}W}]X---,#S<^Yk_Vw_Aj%Iv(&O1GU R W6նZ⬳E@"xvn>@CڨcΝLdBI*jj'0,t'F`TQpJx&MԸ7F"]k ^ٳO6w*"J:4#* T#*<<>`jic*M6.$L\ o θWa\D]Bq?qUA)bV79K kGs3nf/\6c,[Oam6 .¶Oe+^KzYTF&df*p xy9F%뚶vm$:}[$"]d,g$ #g{^q[ gH+$U Tlrz9_^Ef 'BD[9xnЦbevS e `An|jԙ#'o\bye1"D`_/z^ͷVl5c@#cF e\ l-Dy^@|`_O(U~z 3AS DLhk:EA:ĉ=2&VZ5 M`PMU|32uʺj}Bg{0⩬hjcI!$ed Cd;LiVoE̝rW|³p5 kR_mq) O?3otbQK%lµ~r!A7C-fgRU33q@$NIq--2SQCMgQ E\y$:BP475.Sq8߁D!aC.4=6^ƺQoZzG,9cd1 sZF(TB8^znn{t5qML5QS HB0܏KuMIML,US,F=*J|{ٵ[. H.y=*uM22aa mc&."֞ZkeulqQCeI<':򓭽8MWIC5*0 H> Gy`I1$~}3`{Q!Xp c,<|a߬5KOy??1nUjP$^d+K@xNπOK(zi-MJm ?N~5.#;± w⡭|h6yח=)"tTj!$rp_@ο{bGSq$3CH,Wu⫌{8dc)Rd'n~l[L V cga$Ƿ99oImZOf$wX:9W6pix l鿶Fֹeʀ?aʏU6ӅBEDaJ099  ݧKG˸^檏EC*$1rfRՏ3K֕)W`+e]]i # |~3at-eVE5'me*>~~3D[qm{z%[-"Je] *s~^.۶=VjKߏŴ)\wi~:.C "Q$ƳH~ܶSx2;U2R#rQ3{]C[hԉGo3(c''xz.ZV$8 WF2f\ԗk}yu"v;HďcQK݉x+:C-4*$>N~?:IA]W QTENxfX\Ѫv۷)F Ma0Ԙ-gk|ܒNeh7[V֑tY%#T-G ܋2I'(rI:uoxX淋Ti:L`*2\[-8G驦^>ύx:S#d85J]),5pPsEπs,t)qEĵ-doߊOeQ!0WYw0;AoI^UY"8_qǘBFO!$߼3λulZĝ 6Z"Hh7,[mI5t{ޢEDy-87ԭeNb;gE mTi?.s!QCORGDpu}p&^b# aO$ pǜι ,n:DG!x/`:˜+֪KFP5Y MMtDi߻Hl i-fINiԒn-R+*Q_>YQ:m*rPȪ=4r!?T<)UvtYhOyҾ2!qe<a);Ub>/uƖo/.]d"l{.ib b@$ꦽ4ݴbR5uԴ1?xp“+0as :\:\n`[gf2ȼ$cu[ZLrb$!.JA8!%sq4}Lݱ$SA ^$a)@A>1eTW5zx2yyn[?P`ݣB27ۮAOom[W8eL U_,jMeߺ\ #Hd3FPsɰ9nj}XiԅPR%D'|/yܴt5x$3DJǐHp߰3Ϊ]U:T$3M Uujچ__U_GI_H԰USɎqMtlv--l3as=4x_+N)=6TԿ^5ٸsBcQϺ@cmlhmI7HoVpgeUcwNb#{+(kYuGl)6;wh0ݶ^n| #P]$z*J21+̢ ^xdKRVۮUT SDXpA%>nB Z{V;t۪(V;MaƐqtZ"jLJ`HH?W~߄oIyٽ?conjcUqu5l+-)XfjC_pqO$3?nG<&׃+=nE -uX%qOSN$2GܪX R$ BZr+ ֖&K-mL,V'}]-:;wEnպ4;AkoOptH,ĥ*)rC/NvDK@oͻe**?-Mn6U ![K eNKzU~ҨbpRX:U~OJ 2$EU&dZʆ3Z3{!r+<jjꩠMC+`d>Ep[7-6[\%1UHZzh&3܉Oi ƣtmO )u b @8*ߩH'>0#ƺI,JLW&;Y-=TFyfxHZkiv*Arh䪎Z9"uy=:ѧع Ɏ-t F.Zw 'P\aMqL[xu"_oZ7Mں-K3@EK(>OuVM ӻmUkE5tT+ukS"A=uH![_}Wzq[]@{M`ig17vQ'+t걲A "I+a6V(fVkU }: 9 YYC nniwFSS>9 gLʜ9mlnmn[pToj3맧8ʰܒH¡֥uE,TrT}M%@zD%r%9ʒs Wlmw^7˗%7XoќGV[k - ꦰo6Nedv颉q`G~[[V(*믶xbҴu8'y9A/U4g)%V4heKJUjxTU)JBaWኅ!}ڌׁ,;ɫCPp7$X''ȩNOUKSJS! hFT1  5c6KѶ [p3VPF 1<U;FkkA-~΢YiLAeLv}u Eu=Gl!hm|f"8Dž-@'%uWkqó m%7O .;EL˩].WJ-$lvܡ$nYQ:Ჱ̅}ov^mc-ն֔JҒci>ؑl ^ r ɸTUL,rp )+]K:=5m ǯX#Ȏ:xlʥhn'6 >Ix,4I4X=jJJUʌJ)SA5Un߼w }LQD i-, U> "N28Ve/}Ek Q2[ʿ9!X|])թC詫 9bx#>ppFU17-F4 ,_I\ IlNN/uԶKd34N"&xQ8.IԢ޲[*4!Y]F<|/V >[G*i>WϜuһ6n:+<JB[\{&yZeᓒMH'#W=LI-B<ҼGH"NRK2>1Mw[nVЮ٨Quͷ`ʈIPx;U"3FneKnk1n>e]Wf2OM$<;Q$6f=.G|wMCO کU.ʪ|f>A$cutwZw-kDQID>/$JpH9"3ܖ;ڸ* jyU.+Gp=f \: Im?!|38iԿU]fi-~iAAl7W@‰c-%TP+8ǒ9ϏXpt+gڪK_ssdՈ·8!ѯ -Xj¥H8|-{՚NKO&tm5JUtKdV'nKcԆOC䏾0>ή}H+VTj8[3.r <}UnڔVwn{%5%d$ !\G[bR#JH#TK wf0rdHzKn4,3B]jZ' }ru8$<鶞5~}J)B6Zo =Kw17P$(ݑ}rp?l|z{ i1MZj6O Ÿ?Ψ ת.hJ4טӚ䇉?V\xև=ET߸-5cG$EMGS3$HɐD$ˀ=}LA0H>;(O4żVq1$H;#zOO.r^)g\hkP7咤08leHG5oRhW%h(mVȥyXEQ9+-fhɾVt36L~#,"0_Ʌ1T %v}umv۔KF GϊB ʒ9%`8᪾p;+G2n݀f".OvNڒʻn\#S8Yry:C3!e 0㐍nQlQXo6sdHjk%LUeCMP~:K\vz+=V=\2㚜򹦔2QȎ%D$`RmUZn8hq'`0a1'0 10yjޝr۾lkz)=u=MYCG_pZDTgT-miw[$Փ[D=dK>Y75o7[B`yLc;Ytw"v?c[U!;$4eq'u vMtJoLVH a cPgV`lK`#T[2qvuCĹR>8ǂOGAuuX ``ǎ> YxF>mmu z[RkC$lX) }X'Hgbk>q,ӤE{wtqTa i!3a=KQCm$`j8(P>>F+=((*(?Tǜ9e>>X:#ē*&7$+~8?FR8pw[BV ,@d w#y.^L=^)nn?n'JyHWS< |xώԷAQOYM*bQ8'05{u궲n^iZ9(y DcgbXI]stZmy=F $|8΁˱NA}S3+5.DHiAx߸$o],*%`d/>2đrƬMwj]}5l*H$|:=5g~uV4| ^z^y-+r*.=wtJy q yܿUpp8LEo5Zߡ1svCXƍ$mM 5MbWZQ2>:GL[k""¦X񮖾7,ǴV4t3r0^yT.s l H$XjjnfA eUs$2| X nQ+ךyTH䑂?>5WYT7{d+mJTN~A ZٳSƳH#qj_Hs*ot6u] &齒 o=M 0#i%Pr$|kuȚs.Rˤu1kS ;DGiѓM4M4M4M4M4M4M4M4M4Z8V ܳĐ eJ(U`0>'[}5}BVl}$ػ")vަ3(NN\$TV=K>ˋkA4 RS %#X9{.@Wo5SN~JAa`s:p\$UU=ܵUXUOX,ġ|=N%c"yͳޭU[-z^=mA#`3x禚gxUՑ2XbLl(U:ыl }e%JlzeIvNaHd-@8E"|w̱]zt}M㷢^uWu֐I5DK$V.TmC.]i%amӛe8&zK4,%NJ&l*̥&{þ]auRK^nuG) A`Fc=pWU [jehmG}[jbHjjH"T(ʦ9e)[KS\l;+ڢq)ھc$2ʅd1pdUTɲ\54RcK5-=I`pTS8San^m[-rN)jR `vKԹt8\*0<EX kv]ā\Lw}*K"Z]O5j#1MR"i v!(Y՗쪉Qph:Թ&:fTfde4$ه%R]m]@G Ogy 낹xIx8\,UN%:f_l&w^B:ȋgI:Iqu7Ch*14rvS_r2KI`e*+dx=W09h 4C4@9We`6nKUgٚ N}֍qw;v} qTXiD`%#&BXD[Ǹ=(ˉts6-#đm[Sn>%(&▮Hy)Ң%xv&X*ꟋmNmuSUnڪfG|ҚXiM,aJ lVex#7%He@(onDƱM U md_T^1*>]IߢZU{Ee]-uu1MrjZ4&("I"X4$tcEgQFӷtkwO-GbfH @3w(eEfQ$8\ٶaږMy[⢆P)aHNA^~C}]e EߤD@'>VHb)X.$,l ``c|so~_v6OP@9EWrɒ.cor Nmj:5@OWyP 󟓝M nl {!Y'*s? $Ƿ<|kpxqh1:^DpRm0,p&4r/@NWnxT%m[5, j3Ȫ-PJ6֗t=cH:(bXIL38*y<('~駞uEG F]#fP2I[6Ϣi{$GOO2q͹\Eז]$yraྜIpD}~zEcݳd%f c~Aw)~E ^ P]鞦( D^XHV?~2qu,—Z*l츐dqՊ5suSllg@v5+o4h`zIj)'LH0GRۧW{\&G$k`e@ʦ</۩f`bQBZSŞ۴p&, !!E@|:-) ReVǐ q`OI.TSO()xU(2}xϟճ=e*tS8'}a!:Mp&A!8'[7~ccE]?WӪژxlp?V4MrM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DMU{Ǩ z˔ݿQ`BU'6VLyaPJ aTͮiZ㴭4bЌߠy{_I6Koo(BmJ)a=ۍێ`||j\ҦLe?s].5՛Jm$v:Jaens=Ppp0CQb*cno@Q|qZTzCtF)M= 6Hb>A#{⢜El5V]+q㧅^3r G ~lŮ\)(DsQ$1 a!<|cm4;ު jm#uTEem\*ǦX[+bnu{+j! I4;IQ5:;I<.*[*SznX_)0ڃ*p*m3 Uowbn7)⮸,T= n8XbJ^sW6Sɐru6RCG @ʏrD Ie٤*BʊO*j-$4V~T+)rXt6|\k 8^lCD+=(3zrIFmimeު^UCVX)^!$xe'lj}O-s͍_gM:;M% d`W<1M%'804XP]za7gYm`FFH!Ce/Fok{J6f<K\xV ?3ő48-fSa6mqP,fĠ IWa+ά=Sms}3G >߶R$%BEf($Ǜu굯5{ʚԺUKE4SW(h)*2szn~-:\D7ÜFlH"":UFǺ 4w%byK*ѧ0{Q::̅NꫫI75k⪸mF(c c!b 8&}z_[.4W (Xe/qY6kuNݞٹ*vٮOR)(GDܔ*7}5lSn ܖڞj6nRVFWI⇸+"cE6O񸂭gօ˵j֊*` =ɏcX8R85hlo-W→Nj Tr]QK8#_k*xy_ktw&\魍j}+(Vxfď(%|XHOGT6}|T.޵\dhhR}HҰJn# ن8|5Z[qxz}ԯk=\mKLA[KQ R,~9Xd0(Q᚛pXfVDA,|IT#":eS(>Ӌߧܨcؗm͊hvj&dQL,D|FeCG,Etn; r1-ƺb꤉Le4+%"* @&{n@sxĪO.ꈬEY^CULiTeOY$SJ( 2赖fhTCQr̞B̰4JѤ]4f=OMӵ*ֵw VofX) ?{!Gz7,mG6]Zm[jj#LQJҰT#<.!Jt(Kԯ_KPo.*zv]zE`)fpHYZVhgErMܑ[6-=6NSPAr/*q*#)APw!yTբw%dLJC( \,xo.mvMeܛoRٸt;3W沃(vo:nʄrځ}.xwqYN`wŮM`n5imh:pˌ0u)O5iʲA/6NܙʌCi&j%^ۻ߿S+Q$qӤVA6̱*e tͫ}&*.X6kS$mJ)%):8Lˑe7Qv-e>졢T8g2oJNp ͵i 讜5VvL>x)mɶ&۰eGh*A[lܔ4*R$QKZ#hcWG e> jnP>1E*+k҆#iBvIscnnAzZ4mu'X 꽱}y~sz:9&X@,T~25XؙX/-nJIy53CSo)YzƆjyj VsH"G̝h`۠;pVWQgJrb2T&%]ߤtCpJ9P i0v$ A7``K)ci=8M'T}Nl3 H|7OZ:5񷩮tΪ{z٧GM%JJIePOj8b 3oӿβnz4[goKqG}R+!S ^#zq:{ڗvtn[j(zGI:Wr`6Müv\AWZI-`ࡇ$ܕ*P].Xmr|@ߧ-C?k)? ꫡK;s3Af<'~$ӡ,ޥjA.̬kc$,I#$Xh6h2Sb)`㐪 A<U&A` \bLE`4F^_M  k[ȹ0 .6`]O~Zr 6a{ѻJ܏<:0&CSLjjEJ)oON*<ȥ?,# {ĉxQ] \n=p^!p KkqXTuUu0x _ˀ\Kmb|@ t[^: oJg5UTd I;YN͡׿- ts67vz:i< $+I>) 58wKr?>uյ]s 5Ǻ 9LN ass;G{_bEV#.f' ©>% bCwq }¯spi|ˤ4 Tf֘+7#S+V ۄ\ 7~YRa5{*zS2/D\6?Zy\j 5Hl]ۻ-m2@F~|hc~k;0MYTI!8Ʊ~CUt}YSnQy,{xܭ5ϖo YW)\Pyq9yeukrP귁E~QX>sCkOGqv p?y[xݦ~ Vfn=d۽+}/~\q?P gArR-XdޒD$'9!GpIٻi^j]裠E(fi=SSzѰ,^ Ѿ;cnK%k R"X†9rs*A ci?}aU}zCIA?s7EWUE3MGS54!F)"t$UH!>oKmӎ޶nku[5EhIJE W~dwn9d!3Nѷp Lm~rMztgۨ]U)-Jww0 `e֊JJIK<8 B1C6+Ȳ@Pe=6q^";|W^]dV:CwVةj Em^֚hpE:"Mܧ&ıU 2E[_N-o$V.VģѬ**4 :Ni$b 7һ}Qaԝ9WZrDs̱JsV{eMநhj傂:†9u;T; Gxe"TDJ\-RJ٠u[xGfnJayV_×+qXkHz k;{(8_9Tu18#׮tA зY+lֺH$\Qr*x,ۯb4[X۬\lti20dz7u;2`ǁusy;u=Vʆ:+:Xm7ik0IuTE!;xFw[[1wM-M8_Vi\>@2l$St* +r#cUƌ=L^7FѸ `4}:%Ue[.-sF K[D0F98m}[/ÿJwN@,,=#JXL=RJh]9WHhd[SA릝"lO!:-u/KkMgnjצVHi־ iQ0WpZCV=XIPlk$Q,0A u8G`;a[ݝcn vU[rePEX6ΊRPI,@` NBRg* wzPn'bKAeCUB*b(FpYǠu$5=@ZKv^nNJFPHVN\4Z_*ZEKW"% i8$rۮ  #GئZp*P#`ٝFSP۫sǗQlgRYpd"}nX)gRn.Qij^|! c΍LvVKJb3E?;jYl,^6ϧ]`P5ŷ뮔q7z.$vʒ q9{]P" Hiyv{[ܪmteKm##,j < yƸUێh=u(ij9b)h2PKL7VMڛ6 Lveq%%8ZU,VVdEe,LJ dl-kᦋ$o ó30TDE,UUf` h',;&녦vgx /qkg=-L#B )*!mxZ6I9"幪/\)k\d4dQL%j#vG/Ӧ];E*eӓ+9f8UL$7h~4;sm+0 $pZ' eZ6uW2!G"ܶoXo[bSSJ-57ۈh"D3TPa48{/mB[>N-MJDj㲵<Y{u7n^UMKդ6$0,h$OyRQ8D #4;l\GQ6{}rQGASGA=S@LGRR"X!F^۷@t֯y= ]Ͷ6}tUWm^EKh qh'ouml7KOd.du9#;ӞRphBN۵RYK*%Vb3jh`R3տh3=e4df--mui"ika0@E:SIL:FYUg[74[GI)~<'%40L&gQ7ydQ}ꕻn|ln^I% "$zHj#i&2F4o@̠/"dpPKHbhC/l)8*YD=f],]"7|TF-V2BwIvȇ2@%U,D޲^ih:z*_mE"H1xB'ϟD%hi௷ω)1[L*uO ~!XwIHyqԌϑWe g*Lh˿,!0eocI>0~' Bڏ;-o[ߩ=]Ӻ\PXoUljAe._9#F+oj NCjgHEou\#E aR #>vS 2>oްuR+%`4VjMyGN5\EC_zXnGe1TeTÀc&U$p,le]fۻq-6Z/銺9ypGʩk vӝ>6:lpo2= cfޕ}e 5鋢YzѴNd, <C>H 0׌K}MQc])y V6?OW><Z@Ϝ0I'm"UզK^Y餷m^_-}/zI2JDDsD˨$yn(ĴLMԕqT8D+*$ʐ-]gNxGZg4MfMk`=UuXls'dp5Y5h!%FLAsAy&ji#UTp–>O?m+jhh*dUyjn2dxB2!'#Z`bI vF}TsΎI< q\;'E}(~bRLm)!Fջ?PW1b%kmf I|Ϝx6\f O" >12^̱*<6C\AF5G+W嘪44! W3uEĠ^[k<15oc1.pYGM[QjF5@SLwV #q ei$^WQ<~[~'v"yT$ U eUV{kN;їɐTyR|?Q ׿jWed{Rfa?,uAS4ߺws-x.?SXӦlbu,rWoX?((BG 3,<Ktu!5mN#K4r!c18 ,X7Eꧻ₂jV-Lv h3NVnj];=Lo[44Fܣ$^3;F&,̤1V+?V1ڛI *ߕ3o+TqT(jY/uI޴5\E4%JTK?ЗH$||֓11i&GNc@kW:I Q޺q)D3p`Yqh^GUzۗJvm4wwKGFI!h‚Ty\U o؛uyK塳L~j* `9"٥D7+u@i<5lnmm>;tZP٥im]jSmTU Ԭeo"]Qٗh?[ݻ8">p89R?VlCmFJw TBPb gi1sQ-ͼnx:jQ=EHgfed~2l0VHĔڋ?碂n&gwKnoIUgem([0L*i)9H{sSOQNbSҿ% '8t>mO[]OzQF,2i8[LAYibiA)(u=:^hiRjRC?8EhTKWں{%unj Hv ( 1j:QNYB}5ПZxo$.nSݔQ[+{ԒGiԚB4Bۢ+Z8FJ#6WnYkj{ej 2jwX*X³E XF9M: n J٣USIPE$PʐĦ7hT%P ՍWu[ʙoݗ*b+]fWX2a)cFȎeYtUf/CݻtӼ >zJJC=]E5<õKCՉ]efme韧jmgnG'N3z)q-M=$OJhL "#InsAw؟Gr68rV\䥑 c=D#ȭ,bdђQL:s*n2FY`%WpGe<({eT< y 쌳C!XNuօOsS(eTSY؈Ӵpah$L(_WtY7}ke]-UMsEǡQXTPOK$NpaX^x1Ǻg]q4jA42VSMRԣ$AiCQ, #ߞw== /;%,Hep4#,@2x?]큾wV =H#T2Lg?q/YF8m4 1h`l=ζ 5h]-w XWLnQO+=e:3 nlc)QS5]=j+5n]IhC^D!d^}y>:)sZ+)`ު3J'i؍VCT]P=K FMeȉj3X*||juYst_a"Fk'+U>פ2Estc틤wrm /hx $[ 4h$Ey@"{p}(]v̼OI+XbdI8Ty^1SqQ]{k-ʢLfosHQIcu5W>jxg՝S ڽ0U#.79b_Zc㪥w* &#<^F1m^v+Fwj[\-Z*:zz=h2*RY(d-B~%dJ%$^G槑[¤h jeP؁QvN7u3ukaPΓJ)OyNmM a:**Zz 2 pҥQjSY "8U;۶.0e5P^ւEeGQdd<*˱bٸ:oUsJfP[-rՉqBD ;!WԖbi2' u {Z*+-w9!Y~dʪd~ oeInT((kG:f4$(+VZ7VRP;\>^էoM҆ҴqUc /"gq?S>~3s%ó,׻nҶU*CGgۦJ&R8e(#G%ؖ KTp{A SONjr3e _O|}zj1K }wGԞIA%=^&%B)h<| EOw_57ۚٸ(-" Dݎ4bÛD-&FU=nܶ>AU;{,+ui1y'd>-o3Mq6ڻ-#RK{r5Y&rC>zE}%ULQ'ʖ~r=x[eL4MzM4DQyK%׫,1> e$(\r p#_Y*f:!iߌӤ]QABSÐA'R=5h4@&IO/U@`gHp72OZ-iM4UU֮}ɷkXأFXA>s[ڻoS_,Y=;z0 |!q ZSnzke+(P 6<bNXLj1٧osHz@_[@.$D^x/ޔⶵ[qԭ&` &~l@#a=HRSG]%0 9''J>4j[b"[@lps|FvACA ,+Y05}F0@#uM>1xƤ7-i0L>^o[şk ;V¹# 1@?|`y8pj~ٷ]m}fRHZd(=2TēF@ |^5ʏE:IMꑣ`aOtca_?H|]*u:LxKutr; v8h & "Op"{+MMzV\?W&kDߚK3 *PPxK6ŋsS]SN=4QL9|ﯡ0?O(;t؃Γ-N HP5`nNnlr[y )1rObO)1)P.FFA<u. ~pA1xlit>~Pf)"zh\d@>>qZ;m([u򎎈H]AU2ǀ2EOEM%]JSЫpe"_>YQ:fĿweMxM홻AAdA$ ~sODW1x>itjgOa$@6.lJvZ?l=:ùl]p4i=:3|8aMy=p-tv繿96ˇoO2A,0DD18|OmP:%E!xU?O֪Wg38_lgiVM4M4M4M4M4M4M4M4M4UV:Ӟ Zk 0غ|? j^ 8o6 ,ĝ/6dJUK2(f 8枹[&"m * O1cfO#qλ˪O[G[ۖX⢕P"F1A+NZKߤZjMA< $1@I0` ߇UfQ{jf2^c~9o{+M%u m5t办kC$:Qv]isEQ֘T ,SڜJ&HFp_G쫾⢵TtBu,.wʊWODVbTBۙjU}+[}eQlzũKP8Ԛ~,cy )bH.'Ifqnk{Tz*ښWd m'~uFc<$J>+g7CsZWY-*8%VXTHʅv'n=ڛrm|oiF %AS+x J^^xg*8CXFLxtQԤYt [J76Q iEJkxaOUUSҺ*M̈́APKYQRVԥ543xfONveKpsHSFTz8 - d#~:_OC*ze;[m]`Zf]R@ %ħhvl4wS +: }5ǵ4UV@Zvq=H1٭i[Nij+iaInX# +o]-g*nͫ);r<\62E =%v^fQQQ3E -)5$jeE '5%{e|7?b+MW<⚜tXqTc1-}O-7MVTKs%]$/S5<5ԉKnʴu2`tp_6lE+w&U %XI &+'DTo57+t%ʥGcdYޢ UՄ Фm2"Y߬wk}f>EKŖ OKWSOSHyjavL!jvP$D"HhR;Zûj+Z鞆Zjb4PjjՖS0U`diLwep_pjnݛU=a^Wi'JCE͛cs:y]˵j ]rKLdHH(BU|5捖9wϨ[-F0i喧$3K4lL[8AV(jQk}¦S")m-JY|"KrEؐxt|hf炒?}rRrv;Q=T),9,HLn*fW{ ==xoP@uCc]"s\/J]*Olqf`2ꗼzQNZMU w•!{5JnmDSOZygdXi"YA~[M\wImIǷT04|`堘>LRzd,]Uhiz}*Vm}uJeE#0$$>2ŸI[Kl^rS,eEr|Q(*j-]?TUpS[Ӻ* qdHԷatsl RGG-뤂jqX(:ll'̑TP-h$i:ו.ubVnxhjѤX<f‡^I’B-۾Yf~_8/Npq})}SBtExKU7~FPfb8bע6 }OEW[M=Vg)HX{d,xO/ u-0,dϗ)^{RԫK㗏b%|qf mݖî $3zf4 /0N1`u ԗIvpRv>N~rr3V_{ xJUMm8smh".|\_5 rCtFrW\? qӭKUuۮvKFh ""ʆaŀ zZ&5%&488\FH8>>FzicSk DZ}6Ox*k~Śs\ZpIQ$>B_ Ri[!`gs-&CK#c'88hwu^+mdK!Rgf,^a9#cOsWIiϚgTeL.<+M,wjj+0'$r>34dY; +TlRQ"N@󪶛Qқii(>"f‰ 2`?# ۽BeW` u3<Gǐ23Bpiͷ = `3 _3aV<Κb󯺬?IMEtDTNܣ$'jSm-ٶwQ, 9|ܛNI:--,0M ˳+ -!~FGy[<~.Sn,f-e<ش'_UkDM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4E~_,uKM%-T\{H]r$dmR[;7UD6k*0x^&$Ɨ=ÂEWe]A.ve].3z!,?5B`ef%F8bF!rN>hz*6{VYOoFjŞ>+,qOpGۋh7L=f:W(gT \ׇЎ~ѵܿelW'GXl4~LE $B)bqc!ߖ׎t|1Ŧct$Ƚ\k:M5eRT\>WuuG beFn5OnUW#8Nm}lFmZvٝ`p$QMh|uw$߿1_;R ʔDM 8 $`"1ȉ <6~/ۮ۸*sl+<`9ĺ%  񟡻f;vont7]t]yG *C  u~m;55ތ_$wbK;`ɉ8g׆puϟ-k59=1t{d׶ҥ[S%EdsU<1c%+m5 *5K,gSxՉ][VVCߒ_{~FfR 5(f. vI1w;M4j4M4DMQXG; c.MMWBJ;BBdPxL ,70QtM-*v$:xR@d FU[aq URzz=w%Ga]5w.XTHc[,a1#w>z]jB 80kž}Y%[k$MW#Ȓͱc ^U!(l˸=o;z`xoa E޴۷ړq\AhUUfKGYH#)-Fݔ5{C(0 6#vcq$*xcbIb9^Wi"hHtrdVYc6$oʭi!QNԐ2DLGUQL}J;mxj׬[չEI举5ެK%T"yցIe&9S+ _v੷ZiuyVG U(@8= 6禝B[p7`k5|⊡+^ԎP!nȞXNi\Uoph92aPTF(Iu/5 C/|i~R*.mrޮS04 N%/slJC5kN6 `5)\;YIB[.n4ʹCDV Rc``x yyW7KZh-K+3zj. bpGb0זtvݹ}\T̕tx e^KH# Au#լpAm;pz22#J:}K+/WmJvRt8Xeeh)`e-ܯ;ݚQDf'8Os/W𫞌K3R<}Me e9RmIwR:˃&&`zJ'MվVZb^f<  YDER d'0DB6=8kiڄW$8ׄS lВ$Bϕ3&q78(i9{NUEPBFanq۠aM[̯$(g'HL e&Amo٬}m yْQW>&pPHV,dQ@!ONg-k?n-dq /e'"'%T#8?:ӭ薇ӸPnUwx $e+wzP_yZ vOn#d"@8IĖZ?7z/\];{u& iZuޥ0YچNdVJ#q,IP=$F<}%]z۞UiG9*y 0UH^q7e.QM-E( :M,q dON1~2bkidiʿOԭם^`hrS >FrJz# r"7?c'gb;Iki\-,߹:0fݹNTa>r^EyUnj:n-]1̯ihJ(SSqsdjmP9p_Gͥ^۶f킦HX葴H=.pJ `_[?'L/ۢ߶nuo:s<ȫR.qQ=gﭵ/4 uȽ`Ue %K[|zImKddYJX'*_ e'$`ʯp2#u-L=69g/7}@_5OYDg4hՀQsRF|{_s`09! -r$$1fu* $zqOpVJ<#8OUyfm:>?:8\}8 ]KSn='sE#8ArǑXO&],[]vzh(.cXʧqG:\Esࠩa,qu02f{Gl>#=Gۛ3NYzi^jWci1M4XM4M4M4M4M4M4M4M4M4M4M4M4M4M4M4տթuԝ "[8jfVvx'=>vmߥzK]S1E,XR31c`5X.iibiiiQO%=DI42I#u `j[V[ӽ2a%7Yתڎj|IM4R7oO]e7m9cg<9ut;=ߖj-i54TI #1@%`d p5WzM >l])k(Y@vʖ 5V80j|}${HVj7 zcJ'Sm{Y\mJUlӚ<8ʬy+8ߠHw=+-,rҽ,wh!&hR`'K8uQ`s?n?Vm v -nSEn %<"8ʒ3<#YZ ʛ)kՊjoHvV-[|(-K?DR:Ǧӌ~}JXO|[.I{ۧ۶%;#BЧVwIe`IJ.{rޞ,ƍ\4R`'7~ڰn Erin+$@#aR rfjñ:Mj 1jhZLX][‚JF}W)#k[AÜfݩfUTQO;%5H"hYX#oض]*OլŒay7 QXSoj;F𨽫4JGfgq8;j]W-.\R'iU3c FGxTu+a -Ɂ`궔= =pO OLC1%May#_e4ՊcYrIiYM4,R톇An}YU7ܥ>I NKʨUˑ$.tzAm{Hn+]LRA5*%A*񸜠$89ʟ9߄6 wƤB>Xiw߇n`WJP ʳE)wY*YRtg0C"0\֭*Lif!( * Me5 htgmO8*F<Ïm`kE^Wnښ+[G"®9b\(eʺmBD[q(!z+}%G=)h_.k|7f$iriBpN5d}ֻtii^c9y礪ٌTE]1:Rght赖EURZ{} x館u*PpL:g˪Mz pMZ1k$RV:[9J*Hr4~WXIB-K&>~7W{%=bC 1m @L)OǼy̋~[uIMlXe5rVZzNF ˆ$h ~U\f]z EY/&(*å?ii9J]UQ/"6sqiSGmzA5QaY^ EXCzyE##پzi%kNZXIwi*0$fCYn/-9^2I21(eVB:mwTG/[3tTva4;f *%^i""GH0Nxt žQ*0L!L%t,,VҾS$3\*V妚)IfWqEJM-FJiDt5 axVb35DQH8f%ylKz]m[2]JI@`|ΫVuF~vyecxiAyoԷ͸).TpUGWXEw$gPrT=ߥNݺF$,4 s@'ɂ>Fvۦ;Z^-PMWD+{O)!Upsɟ9g[+U4ì_J)0B? qā:LOOE=2&#~wԸAtKocfc-Mk9 w+lF$Z/n"yK:tsMQES®Ibi@eepYǎՖwBT$=iBiiiiiiiiiiiiiiiiiiiiiiiiin+rJ*2FU5An[+^)X\,m9:MxZ A\e.5$]7F1n0 ~x1,y1n۲۶킆h@<)5U` Mx}W?_DziFii)((ޒ ~4$ol|>u連\d-ڋUdġJjTr8#ޚ1 U{.q1TnŰ]qϸ{^k@TQ,&Dg ,$:i ,\8ˌ[tZ{-t*:VE 3gN}$l w]o6zsx*0|(tFXEcvy`OnwF{,P=9 aB%1*Ͽ+vt;.~rnna1$@Y9lg:)wStXA"GS-LHA4lC+8$d;o}Wuoi%hiVr$$$YĨug$ tS'˒Z. ˘L5jNs֦&ca{&-PDY-n;]41CbISފFbL RNRn>SIIϧ-ބ6Re\MɖRӻ5rʼn>o6+D)=¾uH1¯'!A$2G53*mHx^3˿ڢy#䯯c,!#ܻfUܾl|+5=žSPFK)ŇƠݹvݩԛ钆RGdA. lbKKmw7S܉-\a\(I$sQ*$|oSѣ*}$ċoWV`4we55: $@BIJ+,T鶗E:߼+M&\ՓU\z**G&x#<쭂\)ڻ7c&mZw㨵IDԦ%aU,B<@'4dFrG*lӇl3mFUsE -]J*Sf$1ከ1stGwq]kjZ(Zb_ jkYߟdwQBCMw+eʒ'"j p]_ x.J#?~-x`ܐ4^JVe@DO>QaNuVӳTM6j/6 8(h%r1ѕcX+=U99c3YhtyU8j*eJmnA)j|ZG;Q+-S[bJh:cIT%H J𸍛l;H[kקMQmTZ;}4f^6dq$>Znef:}ϜguvٚNĘHN% .uIWgٗxi8y)~ L"G,"A}VRV[)g-D݅Gj~! i.oZpUAZKnkmNAF3DW;G$,NL#ɒkU;~ U%֊[,Y][#:iĄ(ini+ުYgPdf^"eLFFēfuQ\.ťRIǨrp/:R5l-#V'MY$d5-P x"Y@1"~ GpsluR96cqWy}Z(!#ۖck)7Tn'J / Ʈo,n-D2e FA;jC6`-UjJDcQo3MfLJ *7l|4MfM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DQ ]Saz*h a#A"^[C/pY'rx C9p=;OծQ ,hؚ3PG.}bE MNѬfDUD%U9C q|>6vvvNC.%@1q:#|kFTޟte-SNĒ8_GsG|}E^ϯm Jv]_F#*8y* >w^.l.\./[>ZUr)7k"c4e1%s+6Mf(4MdM4DM4DM4DQӽ_N75$V^kE\kn ÞxF|Wuon n6Ue4NDFrO`Sn(ukyvj%CꃐsdjؿK[n4wzbTi0Ka;2Yq9Q8k韟7+ =םۼu`_Lzv, Sp6RPYRҩ`&^eV#SUMr$˘>2*Rm~UZn3\1EM{mK5ʲU u=*Fh8 kr$OvId8EYkjK\ {uwk''5fղŹI!Hdt_E尺-E&کOM-2/s*Y xbFF@̬H,{jgӃw%=vKFUY/kxOMQtp#T铡V1t$撎TqFJ` y_p8o=5! E=jt.m#Fu- h)pb+#Wo:J|wMAPJA%0iVR"HB"0doβYek`٠L6 ʓ2"G*%WD:G[:.ؿnU-S v(~\V6 K{G:vD dbɪ&dhchrm1 xji-W99*'3R3Jeb[:Zk|{e:\Q WN'N2Ichard,}NmګSIVUt[L $&S 4 x7|aYq* uzy%esr!J(y䎾c@SY#qtAL K"%fڹoyL3/"B;Yx })+Kpᮣ uUz#Ju$L>g)owCƣUݶkDRTԭ*DUTe1> #G;npP^Fkˬw(:7EPJT'[r駊oV@}M:Q^ZOM98^t49*챪C1oկA6վU(6V*kᢍ*&RA!UOjF5B>qM4=I˿HծiP eKE+UV,B0`*d;Oʂ)匍x ^Ҧj;d|RH`}JYV\kM*ƥ$sXAUY;k[-j)҉UCbO^Go<_&ùl߲*hdwvImg$Ȍ"Yd=YpK*Q!N?;E EwRI\vEC*#8;R\v +|Xa콟U$<6nqIJɈvf'-b[lZ {᧫дvz*^7I%1Q,a$Kbaʰl:]:T;~ݼ/ۡy~%HeyNQʤ{1t %kE-rTLc)QY8HLПQ_*d=摵OH WlwZ{Zh =Q44W2B,wX +F)O޷(Z-hU$H;ogU86䌸*<v=vnI-Oi+ za;MJ*TSCjU4QF6~ݹi(i&$̔%`DHa-4cMpw>閚h}QX,5v{-p\i'7j 42(ʑ`=HE29*5Nn-e={j٘:TUT+qI]ǿp˸/!Lwo~-%]G871e}񭞾w}8`ڭW~_-CY Ք BVSZHVVw UGܽ7aS\k yH>GA :“~qI^fdqؘM5*4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M5~Z?WM$tJBKoňn't &U{tܡ;jjsn X$" JJ#`E}_ZiZOyyip0>['n:4e+bGUR"TσWG֒csYZ6%WnW LȦ5r<2(duTi{V$ THyH<IR!P -^v%ʺkbkLwY$~/$$+>.@_ovhkvڱR%-jdlbK3|$'Q}"<FO~ }+_Ebn T5ZFcT1 $?Dy[ im[iyZcɎ\ebIԃZ]hv~ӸnkPT-9ELyc| fD@tPIƳtܶ=Mmjݻ2HbHI#9k:SUΧmکB洬x!pe?9 WՏD;p[cNڿ>ϝrgoRy:wlfRVv.5²9*g|h h,K  R<džt9xcE۽BSm&iR*)eJK-\m4+Cj>n S|vQWpUƂ6C2p~},J]"qni6,s7MG vW\p'? ]([ӱܖLmT"58Y}pcjW!WIhuqTtywƛ %$9+ƣ"iM*78;],ךu%OGlJGCےLdNJRRGSWXxB0ԛ邓o[w'J,ŒCYgVT$CNPK[S@ۥCʙ5yr0B6pq {OVY*/ҩj5 ɼXتDž]VÀ*c:9Q۲ſۦSJ+AnT; $M5;ݐU/vk%i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"=vK6,EENn%T~jA4^jV&h\#Z`.r]d%כ7NBr+\rξopsc_=ZdT!"G >G$Oj f mDWQø,I>|4 i_ܗ/m>̧}k[$ {1ǐDGrg#3@+ͭ}k 4{6+D_ۍD܇(ٻg'7 c}pzk;F]뇿 kw-}#^); B[eB)fRH+>:H.w긁S,*+ł, a|>17NΨ{TU+%l٪jyI!Xےr912qq>-aUv{UިǷmު0X2hę9c@E<ԅs$E3smk[tYc>f^JR3Z^c*m`hY uvEVQe\:y3Ҋ"i=MMS-{MQ!G>q2%aqb#{ͲmEr0I%-EHJђ]O 8ˉFr5w~k5s-N׼(7U>j_*j*!eY%rxTP2-tWv޻O.#x.ejHӴO>d*T1AX:">~[.sbALC ixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii endstream endobj 893 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 919 0 obj << /Length 2673 /Filter /FlateDecode >> stream xڵYIsܶWr ⁈OVlˑ#/ORq eŲ_79(;N=DF_c WG^l\:T3HVғazID&?o=o~yzCh$" CG"R"bo(\v1k/E_4>KoFh@ Sdh7e56YWV!$Q T ȟ hkTq Sn}HSd(,+;Gl]4$seu-n+*9/ \f\cԏYQbDҖb9P jtL%`0`zBoVgj{GfU#ae[چ6J؀$_Zp]w5y#־+D61WRh%!+m3k SNXUUb=u3T b+DհK&_qG'n 3fi͒u  uVw=qVp` sE Ew-pG㲬u$?ï4Pd~wy^R|i4oh-yqZ^4px=lr/x p@8x0&,C ,TF^P Z mH0IBYE?4ۮE B&~9INSdis<[O40DIN:, 77 NFȶᗃ3#)KNd)7 1"`,06H05❙ SLC&lQl'Tc0nmgv emS&KGu&&+8AВɞ_X:жT4pM\ |ۋKt:Z| A.A]Է֜oz^Pr lȅ`9e<\)rS?[N8 5'Hz -x-ʒ`uyO li4]׶/qWQ]f*5Y qŖS+jh…Mr. Z;3;@aMɘ8}ȶvk.gI˫#o}H_Ќ6^^}$Xn~r&8>9SBj"lj""m>B+<%eC7 20_ۦ  :qIF6M7e@!չ K>"?@^jFx|m8Uvq]tvU.JAzr(3e,$VAsPGapdν]+{hu8wH }W@aQSN-6acݲH8?W (4 Dgw.s <`^AT@iyMW>V&ĩ0&6-9!wN @ɵuE 8kx!ݧSY8$ywW:p=zANPX`? ٩I)2 Mh'L Rb-65nV` *y;r &Տ*txTs*ȯG`7W^AKU=1q\-1NnK6`R? <.yH@{~ꇨ kT6A4[8Ļs*OJ d.!C;PR=$7HETD̕;w?$fXf9V?O&^%I.V߀LkBݽԜM_o4> X~s<)+Ƿ-f` Wfh}=~AoNP endstream endobj 911 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/LogoLJLL.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 933 0 R /BBox [0 0 567 652] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R9 934 0 R >>/XObject << /R10 935 0 R >>>> /Length 64 /Filter /FlateDecode >> stream x+T03T0A(Uȥd^U`jfT0352000450024Pp Ca endstream endobj 935 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 567 /Height 652 /BitsPerComponent 8 /Filter /DCTDecode /Length 20831 >> stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY7" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( * ?1裩ɯd;WkKG.0lӒ(-j_1ֳԀחSV[hhdAG'uj= ăTU#E>2ʐk>Ax%t4hvάWJ*řдQEl ((((((((((((((((((((((((((((:ڍWeF \Ϙ圖brI,V#rsjte#H坋1M=MVVUzز @SSbY84PĒ pNXCiZ)Lg}*:)RkՃ NP?t^FL-Q]$Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@PQEQEQEQEcFIEl~iN[U'"gc"nVtQ)MVwnﵴEjZ+T՛DZVTdnjU56%TԀұ$ӁA$@RijX Vm JUEiB5"Z4hR:ZD1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (()(i( )(-QMW}X+滉dD^avv9,rkHVh:RFѫhhS#U4jhjQVhZVTejZe5 5]Z$ӁHD0\13Pjُn>j(KP+(((((((((((((((((J()( J)(i3Fi3@ Lf&LLLvMѓ@u)^1kѫ5|3,\Bq muFH:5qtQtjS#VMuFH:5f-UjS+TCEjZ+T,AP+TԱXp54j$340,ڟ^OkBO{Q^EPEPEPEPEPEPEPEPEPEPEPSKGek2RIC>}C] xdz$O7 ?$!WGՠ/O= M'~i?+hO= M'~i?+hO= M'~i?+hO= M'~i?+hO= M'~'$O7 (AIG$zW7 (@JG$zW7 (GGCJ\%V}n}GCoK\}^!G||ECoL\ n}ECoL\%W}n}ECo-3~p4Qx֧λMm,_jW[w9V/3|.M_u%(ȲSU$j֏XS#U$zh]F5NY4KEjZ+T՛D\VULP-᪲HPɱdx5\5H C$p54jV/NONJ\tk?V=}^]K-ާJ5cHoGC?DsAIG$zO7 (EGGCM'~y}ZGICM'~y}ZGICM'~y}ZGICM'~y}ZGICM'~y}ZGICM'~y}ZGICM'~y}ZGICM'~y}ZGICM'~y}ZGIC>"ku MwsΡ ((((((IKI@’ J(aIE!044fQHbsFh٪d5g4Щk:q75jcrSիÔm>4uFH2=dejSVMb=NTdzɢZ.TMZV%ڵJUUUj͢lYVCUUjZhi4gcQj ՗[US_1QR2.fk%nsTRHwaESQE%1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]jku %ESQEQEQEQEQEJ(aIJi(RPi) ) f4.i3ILњCFi&!Ȼ*jfd#ʼnp8OnJ:5SVUh˨:=RF6^F=LY4IuVJ2=d6.TMZV%ڵJUeH#=jT,Uj*m.ܟdidgscN{7JXhO>dQEwaE(((((((((((>}CS]i- (((((R!4xP4B=&HyjݰV9vR;B湲va>#P~zRB|9XE4n<"XS W?sSa9?)?~I4ϸ{}_GcEG?|ɣ&k>i1~ñ"2hg=>#Z-ג_1U3Vi|Nsl/ʮyK؊ke_}j+qѠ \4gѝ|t{UtjVRro7ɑ{g^}L5H=jx56v'F:? Z%)uVH2g"Rwv.@JNi+p=tSYy5/v/ߥQG9ɨk)^*uv ZJ+((BhI.YI8׏9o׮[DOk6qc ʤaUuZ҉ه&Wz? Oo׮Oz]Wz? Oo׮=v9_CS[5?^(W [xB(gkڠOƺf4[?vWFFqJ$QEzQEQEQEMwsΡo4{QLAEPEPEPEPIE JJSIHbt[X L/K;rsdJ뒣QQEQEQEW?i+yP12º }CIl7QEQEQEQEQE%QHbii@ȤT=j܆MYLIOZG͜DdW#PJkgP~ֹd#FÊTmҹ΢&TgLG(,Rm ArV[ LǬT?84537]gzYK*x4s>ʻ.ek"9;SE4s>ʻ 6?m~*kgkO$v*kiz=I>W?qWM$eU%qPOu;XyĒy+b@ޛD%&Ѹ2qz'}?#jI=_eoIOG#zOG֥K{(*2?"?ޓ>ƵK{(*2?"?|5tȏ5E]CQѰKZp:5Ƽ镤r $A^ǮOm^a`>`~bSZSmٕHH~xVٻ!?@+޽G&enF pQ2QYQ@Q@RPxo;]#[|UZ)4 ((((ku MwsΡ(b ( ( ( ( JZ)n!QJH1\Msꦊֽo1y4q#~}IlFF@z La1+#b*r) P$ BJTRFKzTr"v&8 zq&98d.'Mecmcͽ}g@_#!b9oy; @iFhfI`<@R(f4Pk<${y<~!\~+Wlc}CIl7QEQEQEQEQEQE 2tOJC&TJ)W&5FJMOly+H8wn%fHzQ=lDb b bTcAd$ SJtt QGLTc7hJH n\pBV\eiY qWbr<jUO$sD]&[ivHZg<(Jv\P=) ӂӂP3Ofi 8ԧMZ׬ m&lLG~ޒѳ"+ᵸDr#>Ԛ7^x^h%7MZ(Ţ(((qXy짭tAZ'%Gy`QWְH}xm->,nub={me3jh(((*9$QK+'÷ gvZi]M\.yc5M̦YNtH 7C!Hʆkg9F?ֶ (Š((\֮9_ˏ^#go^TdMua8ǢBQEyEPEPEPEP7>}CIl7QEQEQEQEQEQA5TVSk91UXѧ[T"Ċ{6oMܮ({gbW10L ~)1@ b R`Px`S(#קk=\W޺g4Nkn\#ēִdT~-i3ͷP?לzm%+u2}đb {8`S(͆3NRP)qF)q@ J:>>Q~'\tQqzHSskhq&Γ忝q'h!w_^}nHj2z a-ΘlQEIaEPEP\ 8Y?W7v/xΫYJjχ׈tHʴXzrAU$SzO٥?ß^i)%9'[+qkeon:C:׬!#*Ӯ휟ҽfb A1E.)q@ \QEbnAcg/E?ﯗJn]H1ǚjc֪9p=Wݹ+!y|-uUqk> 1Ԍ֥s=ŰQEQEQE8E:"%X^^/}UWa-cY葕!}/\ ̟+z?6OgP0Ӟ¦:(7 ( ( (9Mm!#\lo7\s*~^h#ǮQQZQ@Q@Q@Q@]jku %ESQEQEQEQESZMjCD1FcֱM$5? hW|ϷP1^j> 6R.C︒?B+gu5E-RPIKE%<-!$}k]7dW/!Q-fΏ8'[j υͨ\rO蕌7QKEIbREQK@ \׏'%e=@0+$FWh3PBnnrZWT'MiF^*N'|Ҷ0=T"QQEsaEPEPEPmB3TL׭x#w\ڃ#?k=kj{_]{_m>.J-׋8WHԜW,q ¨AS3JhuQYQ@Q@T7RM<ћsyԹi[LUh֊7wp)((((>}CS]i- (((((sRRcEiMPɍQkl릊`=+,P[ƨ?m^ N9?{r(B((@3NzKXy7NwH5jĒIjzqS[>2<`YY^/!վoZ:RE!Q@Q@yn<HD(?,i%kIjمwF.pdw\Wy X3n\#w-!Lv~?Dc1*''Қt$5{x#++C]rڕ8!səjzUQX!EPEPEP/&9W]w6kë@N,QEnrQ@Q@Q@Q@Q@]jku %ESQEQEQERZC@jƭjǭc6tSEI u K3`$BH5y5? -ܑXtdBf;N((((VWJkqͬϤ<'5Mf:jV[J+k<n.|Wf%c-!œ~ckO`* ((jH8) ]Ƴ>s+~QWi7hydǭSsVe5XFK]9 duټ-``~aKЊۨm`֐H?Yض (Q@Q@x>ѯ_I>]U %oXvr~՘V{"ץ|3 \,^f潏 W}GEt֦QYQ@Q@Q@7f5ut ?WټjHWU )E#Ū6Š(3 ( ( ( ( (&oP7KaŠ( (((:Ԙ^S֨j䧊1&Κh><-nwx@WqmɢcZM(((}CS]i- (&iZ) i6Z1XqTj*A ??/G"ge@??/G"genx@WL!o@k 3f5FS^ [&.EVRo Gikm紨޹i6'2ۗsg򮎰(Š((Eg3jzTgwe>R%w=XTՙMV`I]29"{[# d>#oT6d>Lk=slQE!Q@Q@yn>ѯ>s ?/Z8ۅPI +Y^FX<ԖE)ZܐsF'W>gq_MjutQEbnQEQEQEp?3qenF'ۙPv'm٫k>ۃ&rz+ntC`*K ( ( c7,`,cdA]QԴ}Mc[FI[jҒlΤ\<֊?/KT8:+WLݗ*+v_Et}*+v_Et}*je\\"ɹ<\}k 7fQEYQE5}:74{MDتIsPiܜ+<{tg`6[&!b}|ֹJهsV(S(((((((+>*(XJ+Ͼ"\nW"*;E4Vk!#*휟ҪHy12 ?0=n((((3S@_^=1^F2ʠP2/E="rwY{_>.c#'5B7P>T"QQ=g3ZhuQYQ@Q@U{˧ϜyQ3C4u[Ɂr>sU\L8ךGP0++eޟ%\[?εku(0(((((((yz@@y@12M-!9p5סAZwŠ(`([uYf>}Uzu+JتR*ƨzgU45wI*Ƽkݡ`8ơG WxbxO89~c ;iQYQ@Q@Q@Q@Q@Q@Q@yO.<~qWhx4 ((KuRC[:!h)z5rc֨kl릎ͿFl/&VP+Ւ5?Lw-lQEIaEPEPEPEPEPEPEP=Vao\z,fZf$zox~`.BSֶg=WEw5^'~^7gl׷P~' ***f]4:(B((*qM681>ki&*ߦx+CV<-(k -%Xgf깿ۈ<+l3< ~WI\ER(((+ξ"\o"8sB@+kɼaq`55g$`~֍׭xwC^HG4;& haTlDx\ҙP;*+Bߦ {~5GOEs__wyQfc {~N//j,Ù=wyQ ޅ=MEs#N//j?;п缿騳dtW1 ޅ=MG'z5a̎?;п缿:п缿騳dtW6W֏(mm>Y EY62/遏Oԯ1Ѷ; k_BC%cxц $60yG޵1*mZQ9ʻhVG}rrX9b4rȖDqոba9E5E/߰'PjkGqbakO%/ƯZivDkHbaJw֮QC{QQH(((!iJyF=í4&/:5S[|ݿO¹i[$ިkUcMWeY zWKqq94ӑPc&{k#>a\:M(7 ( ( ( ( ( ( ( _A-]Ss/!Vg#?)+#*g }hke=J[Nv'٫+~ۍڅ $j2zrsQRXQEQEQEQEQEQEQEG;}¼#;ubIGf4[ּWfhQ]gQEQEQEQEQEQEQEQE5}:oP[ QE1Q@Q@Q@ j)ګKҢF)LjɻG4{Y8b g8=;+ҫ+kJNHn\z"q[C( <,.ۇqt+X Wj,RLߢY\ %VFR(((jY*Vuψ4QF>2hcNo|}Ñi MbW7xVae|ZdJQZc&nU|dF9v u^j@?3s\V˹,rMY<՜+4qH}u$qqJ)ګJx!ĥ1OV=jY=Oտ!waS]]y㱥iVKy?rN6Yɟ¹]ε$4WGLGLr#h>P(P(ȁA_B?g_B?g2=YɟYɟŽV+Ͽe#& ?e#& 9Xs#h>P(P(aΏAWBg} ɏƎV.xç juƩRK4|c6!c$~'+]o[:yH'g8]b3MNwAEVEPEPEPEPEPEPEPEP7>}CIl7QEQEQEQE1Q楢VV@+ Dҵ|)L&ڶbRGU=$?#EM)DJ9G z ypJחc}펙(O}(9Xs%J}*UUdV#Su2jc*iLN NHŻ-U1UYj ED"g*-hyQ3(Wzy>r(W|z> stream xc` endstream endobj 937 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xkhD endstream endobj 912 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/LogoUPMC.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 938 0 R /BBox [0 0 419 210] /Resources << /ProcSet [ /PDF ] /ExtGState << /Gs2 939 0 R /Gs1 940 0 R >>>> /Length 4298 /Filter /FlateDecode >> stream xu[氍߽ cI% y 2?"UTա,xUk?8*x9k>˿Mh?.khetk=؀{ VޟrܭN 9G6q?ʳv'y V&~s{^/.z;_/;_<7k;?gG~ǹ3uc8x9 8+': {d˵|Dsϣ&_NVL`yޝ/$nt>vпg/B0J,1kj;2n[u h9jE8Q`6a&О^~hRSY\Abbb%>; Xbf?v 35jok7XtE MGLkG>|Ta RӍ/;dTS/5aY3kӃҮcv t۾FN9 DTWs^Ott{}K_e>Q\ich^XBQb->c,N -(k&AJx"c 8% wl0jG1bk%l!Ѱۂ ߢLdX@ ]d,o݌K@'|Z  `>nE:ZBvˎtd6s!RބK |Ȼ(T)[͖NONH^2=$ġa ayp[6c@KD!m)f=,u:TU&2ma*n2-GѲV('˗MX68X{ϟ R 8iFzajqNqH}K*q5Vv)"62[ \p6'1J2^Yz|T[;<ij@QG0JHNе}O;qTg8[/p8Ҩ*O/7R->4A n_ yw v~': b5(\]ዦ4LFPP<&LnSeΔȮߴL,A)'Y4 C!TBC2(&C'ƭ5X]+@m!nX&B5˿FIYxE^u%Bmgׂ>Ga~b6:nñ JZ՞Q |P_S4{$vwc|RTcl_q Sփpc7eyjD>X Q#KY#H{9z21n9 kEƼY񤂿QyHhkQNj3)ˊt*6. JmSXȩ?IA*'";iQ$zQ=s#l?)5{rY4HxxUVo8bo@dN4WK21#y?E{>*f2j`hǣ[߸ȍOxo*&r 5΍\u6ȉtYqt]"减:=9E :$[y 8t.7* 87{s=C,7}k)6XWWCaF/:P_.U?5;("I51Z B4+q,MTl3dv$gyP(^o-H p]SAP@ >'8 0eAAq&muwijDqG&mq]Vs-yO_m9bqRI ́|YOB泷LrȤA0-k`D'e\(Rw=TUM^;ωx.@lXqI91hTQJs*g\dbLv3f덻M2Fl9ղ7=\]swAN. BJu&W?\$;Jsh[A@SE)FSpOģE8 )bovhf8׋ D)Ca~]O`zHJK.N'('eQq$ap 2<9NPw%@DQ`#a,ԑ7Jz*xs*!yGd4 [` ʲrKSF-(-@ +JQl`΅ +4p1 /,5QhS^PrxRbjV9+:+O<찝 %V.Q4xue bvc&Bd)iBp(&qJٸظbSg$m 'lHбz. )뾺Gc9^Qͯ_2aD\1Jtj΀耄?q4ʫE(]\ZȠPEM[!ѱXXٙkLcbw$DŌ˶]rͨk4=Di, 2*T9|k1͕^ja-[Yb4 "ء+Jga50(QfL>_}Ŏ+GYhhspbAwQEb6%ܨA,Mf4nn/&!9I">㵃]b <!$;p-O]JQ+tV44hg+# WHXL,^cB\տ>p6tɒ#<җ"l/LBOy2@𖷴NI.Av' *?p.Zy53ے8/rVdGF;"WV8wo \W%|<ʒ70I<ԣy hPD'HEG O@},Ftc(&>kQP]QvhPgk9 }vF?7b#5<޲I*=2iDnûqpDP 瓇PȀ~qyCPmB,H+H->nW?RkPG6} I:EA I>RyCRwY7$84A\'̆"xCRө+:0/^wp$&m *i7$m>_=YFʠ&;k\Iܝ ͨyCug `s2:0 I3YuQTCRpAaJ6r Izj Iv'7v>0o*@`$d>`P;_|'SR  P g>YlA\MzRI0i ,Qrn.`kB_酼W )dTX3P*􍔈TZU4"%:yШ 7 )ӂ9 ED妽 !P *!W(f]FH#TW]aԆ`Kv7{P,T:Be*˦nSV@URHlsTc &.@EoA|/Jp @f}fq9Hj0-P2k(z8)P '⤔$~Í52u\ag @%E} ncYJnƽ2WgQe endstream endobj 913 0 obj << /Type /XObject /Subtype /Image /Width 505 /Height 207 /BitsPerComponent 8 /Length 12349 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIFHCREATOR: XV Version 3.10a Rev: 12/29/94 Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +^kf xvZč"wW88RQE ( ( ~ ,c7CQI'^ºj+J5=Hy&[iC$΢C)V0AXڏ?["GđoߧoGŞ k[;Xb3JPᛐ$@׳[|6BH{; $o롃Z]֌Gނc"k h2!yoq]4gi;zs)kUxӏ)ٮO;RZ^}op?Ju 2I6ӎvH8WlXZ ߭T`Ճ=GŢ^Ǩϧx?sW}g}i-͕W7I"peihs]JUǣ/C^F+I^}3c5Es+Wk/mU1?$PCֻzjzyuS(İ((((((((v[]*I`r#Z5_K1ZQIԊ}ɟ+[~3%H$Mu(&)"qXmCKզf $`0Ӝ?\WV*I+|SW/jWwEXEM[/c8EXZiFW.hɿp ?TumN]",ˁ7z||Z!Z4bGjݥ=9g&S/+qkw \:F9¨$@+툱r'8?*SMtkJ%;Ii">QneJC\tzT}=2 *5o]&TWYYhœEq[L>_zlbn<`3igR1iA?JkR>t&7 BVۣ(ԒS.fwFH޿%bAV1 e\XN 88?+S6 $RX}ziMXdcvUH4bm}*U% ܞG[5N>ZkסH]^E_jt}Nd2F>ߥv 2jV7 kNSkSf$w5J-8ǷZui5(YŌ`U\jYc'Q.kv.^]v#tc NNJ&+٤l)_gxYk{\@#.X"#\zP^\[[ sh#S+Z{U=;Ns[[\1`~Q'ֺYIP]CkD3Nk $oͦfjzۜ!ʀ{t]Uqju-e"{WcQQSI-zE {It3Ѹ`We}qi'$hW֕'aii^$vЎקfU0cYy'Z%n<7>Yo =+&tϟ\] RX2#uQ4ݰԵQWq־z?kS{]/EpXי:TQQZyi H;iٟFQE ( ( ( ( ( ( ( K{I bCW誌d z }p9Vd)()KJ?izuԲ\*d05/t˝Gg |۷6:+n{N{5Uِ `!Tui3y0hUV-_E*urZ b 9xjo[CE(֜a7vrAs^kr)t"ewiv*^rJSJbx{LӾ۷kgơ\Zg޺)bj[Ǘ,ӄ3q<=gCqlʓѿEJ5>u+8tM`JO.WlO@ZtDw\ U*^Si5CkV$1dsWOG<6GrŦQ۳ϭZQZI)}`y8+(IJKm]Y%:pp')q i6 OI\9};rREt cߊj`$˜(*5ȏeXѠӖ !!pseu2y,Y9]*]Gȴ9u5Cqa*z]:T$r=)hR[oF5?־(EJuK/Ge%3+?*_?*L^> (((/-yoq68c55'WRh2eP+Nt4j.EWy uCx--K)Z_ wu.Oڒ6g{~}RTKO˚XQE!EPEPEPEPEPHW?=J[y *==+SRʵ QkhCNfeQ:XdBn6cxOU}+JydѤ]Š(QEQEQEϧ#&䌜m$*Fdyk*9ṏd$5oDt;3~?4}'k_\о>m'jïBR<9]R\gg`Nq+GY]2#5x{Y;;Orb˞;Qou}Q^YQEQE[PI$ӮL YvwWV8'a8'UI$#z1 פS%))4j{0wG0t;3>?4}'k__V| pT?XuS*G'4%LOҤR0Tfc)$՝'NmNE; 8v*/|O+!IfqItHu "54+έ]յլtšW?D}_9PpԿ4q_^9 (Q'!SBj'!SBj?e#0_0+;((e X|cvFᔐ~F9¨,O,ŘO$<5S>(<~ oTeЫګ~ڑo^4Q)' (((u|!]l "^mͭ mG%ܞd5韫cg7࿦xyEx3ÒxĖAO ?0yOAjH҃G b%=ᦐtY[ܸ{kUT@UF ZڽWZ>ӂTW@+"Š((((uiiW;w7r8Jڌo+"-iV|vuFD1Tⷬbm?gjlÏVz(% fď#Yd0̒9'hD]Ζ@C(`rȥ((((+׿7uBu ?#EOR~8(8Kym. kG=nʮB6d` = mg][8j[[r FQ!%w49= LcԭÎ?jyޝK],ќW}kuO e~^Ƽ|NJfvҩεܚ(SP((9u~RCyzY~oᑍkb8>;?zV5*huOUz拳WV9z*I0?G^w74ټ@jX\]?ۮ*;+2((({Cw_+^ b>mG=nʺ:<#?]c4#^ۯZI ݺ̣WV.1O#4]Yی>M}=e]ydsŸQDWF 2E:k?fqip߹c1?pv֢JŠ( ( $:_G/_#<; +okR<=ƅmЍioK՛AEVe|CJ.lJWѕ()^K/G z(3=GO_ Qӵ}GHӯgwYrC?W5LV!ՌNǥƕ54? +ڙ }fV5iYDuDc+־"kDF~SchD>p?_;\^]]1y!n4VwV3)rlv.xucӳK{::CGgAdqFzdt>^0XvCHGyJrܣំZ޾5gO頔r9Vzױ{E-V+ح]gu5Vx'JU) Gjڵ%Vgu(SKyd6H9S([sk%>*.Sw?S=Gֺ| 1( `VUc~ H8;Kk:M t9/RR?¼iK4G#.xaSMJ#=+d0Gifw'p3sk+\29B%Ѭ @kF^ ((+?Qu_cR(EJw_%v1^􉿳?<ƏOTW/<_O:yjs˸r_OKۘˏ֮O]Õv9z*֡v+|ªt]vj3e^z|´띴ȹGtUZ6SwAEV%Q@Q@p:W}^u~0|(z?tuxG=ʺ:iKAEW9QEW/=_[?/񮢂kJU]9s"g%fyh`ρќ}>^9ǚ'=Vm2 n}}=wH,jAyoxY$pc+\ڍK{k\9?ƳȬGCп kfk;B%Ѯ*ė7‚( ]W蔯+?Qu_cRz_?2QEgz? {Ux? {U|&y/EAQ^AQEr<.h7EWQEQEWk:WםjMTlϏ~g>#dt#ʻ/o7v󮦱] +((dq *G iiEZ&7^Ub-Z G^UU>чK]^gSZKetL0z#T&8wYUln[DǸ//xA*A#!$Mg Jr]JܒOh_t3Z5h׋Wgt>QEfPW_?uR?+<}& 'vdth#=GO_ Cଘ.gu\~G (s(+?[Mtrه85ETd%(4&Vg:s:um*}G?Rs]0kVq|9/^O>_.ׯGi:֋AYIx[rb8tWde0Mt}K~ĺ,q#'&7TF kW|CY1NFE}oq ݼw,ʡ0=2#pZ$+:((f[\99=kCT Oʜge7a7vlQmiW?&6!55rMEYQR0((]V-"@8qRh[iJV3WF%>) R(Ӝу2)k;K <++F'Wc;QR0(4m2ֽm,f6)׷^q^?9qdt`/N,Du~mux+g+lmV(?t(6 ( ( (3u)u;otj$④u*pAkk:77v2]LG#GEWq K_O5Y-?֍x/Vz0PQEA_,_USFS;L%t1F͸:C|_WØy%:h_fUj(s;bp[iHnk*CJe5kMBdd4mb],eC(Ϻ},'Bz)Q[*ufl' *QڰԍH)3e-½'៏?MS%ecc?繯6ai:U6tʔ}w֊/ش f`6=+kf?}ѭhQ\VmWZnT5RV+=iMtG.odZMk܎I Qr!xUԭOW#ꦫcsG?7?wKQȒtm{Ӫh>vgb (5cBpTsB3k}@+U徊j'=jOo^N2|ˢ?9ףzC<320ԇV\2MLJ[)im!I8ji;$W󴃍zҮyFJZcfxQL{m\֤?I_y[n6n?QYA쫢pyԿOXD+SYO~?vB*0t7v^ly8 0?ʏC T_QZOiԋ/E}6@7Y땷H2@q!*4?_yn6m?S\u#n6yQErQ@Q@Q@o%?vO W9^ʮX`Њo1rLl^<.)[lI7/Z~+EdaXcH5[kA @9k,6ݭfɻ8VGJ쥉o/s{t?gs̸ _BV֖`S#V) C!sWy,՟3<,tyy]̷Y$lګW??H]r?UzK7EYOOGG3?W??H]r?U?ԫ/yEjh"ռ=pfdrSC!uAT?|)8LD]J?H .LN=) B9!uAUdw9yH+YRxU zZ.̸s)`1J_-;s>]Y^څQR0(?Z,59uCѐk|YVŲ=KqCVwX9aYksJ+Mo5i.,D kc?5?5xvK_QC=^~*_Z?ץx?ΓvIwh*N9߅+Vo2/V1ku+7+= yzuk䔔z({jI#NLc%USEiWHF쎧!2Jq9 iݩB`䵉 endstream endobj 914 0 obj << /Type /XObject /Subtype /Image /Width 981 /Height 410 /BitsPerComponent 8 /Length 17802 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF@ICC_PROFILE0ADBEmntrRGB XYZ  3;acspAPPLnone-ADBE cprt2desc0kwtptbkptrTRCgTRCbTRCrXYZgXYZbXYZtextCopyright 2000 Adobe Systems IncorporateddescAdobe RGB (1998)XYZ QXYZ curv3curv3curv3XYZ OXYZ 4,XYZ &1/tExifMM*>F(iNՠC" $-K1-))-\BF7Km`sqk`igxxgi͘uӼ⭾ºC ""-'-X11X|i|" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?訢(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((() NiȑF^F 5}~MrIB4m$&d?ꌚ~f:U(_?Y}8TϴyP mwR)].vi :RnƔ^j21T%#O֨EAڢZ԰ [BWt=LCP@p` ZqNnl(dQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@V~}u?aQ"/ՍJy94 TUQEX?tƢԹ9>Ъ(U(SH­Kh*@(((((((((((((((((((((((nnc;.R"~5Is)Cݍi72]KCCEbV9p鰃 :+z+T ǩQGԭa,l4e(9%''vQE2B((((((((((((((((((((((((((((*+#=MJ_-\`tZ]ܳXiTUw;iÑQATu08}Go, +KXB/,yf4ҹJ̒8S袬(((((((((((((((((((((((*9X"iIMtYe=AkRAPWBtBՑ4S*~:VtKDs$4f>µ-4'50zKMDVoa*S((((((((((((((((((((((((((((((FeE, I5_]Š^m?"J̨lN (RIVeQ?΄L䢮:m{ްzU(8%''vQE1Q@Q@Q@RPܕµ.;UAMirEsmyrg.'"i3/>MEW̦s<bū;T3]C>Lobj+.]\t,U=EO24T+io+H:;~t/X0\DG\z75mp1^;i&g*n$QEQEPEPEG @QY꽡orhdb*RfδҷޕՍ0zis|Γ#֍W7IG8{3=f]((csZVpv0'cTn(3 ( ( (i^ItV,*g#UF]NvQE30(((R0B?UFmSXNO&Lޕ;( ,H>@~Qj Cs/wJ;`VuliqyvW9*Wh ( (7מP1~sRnId:`G#Yر=IX\TDAS-t)[cOcgpBܩE[ϹE4@@Ol敘)' R(J|+p6&HS4֬;+QEtaEPHHPI84+Lqݎ-بɉ{~D}v4VMQVCh >"iG*{ЕRQWciUOZ()9;)QET771[&dn{(kkvGi7cHSr4u8aʧ۠k&!jux%EtƜb%%-D\rp+B-3JI^)؉Twf5.h?V5GUHܶ;ѓER5$gItӭ *= rխwFM3 ѺEUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPESQ5 Jծټ?"}gRVg|b(km>~GH$*RG-iQEQQEQEQE[D]?¾;hRKv5OW٥y2HrƛE-fuS[@>h1CCB[l[? }.Y^g#4Z1dUk g=OjCn>Ex2eM. }UoRՍ[K"w8E#RR)j)Vv?. eT5ĥΈ.UQKNDgp2OR(LG,}t`  cjj*䜹QEDTW3!/ސҹ Ё6޲I$JSJTdΘE 2j~?֬YsaU0g:HBaN(^G/RnId>`W 'd;4Y,z $NIIXJW:( M D*E\[xy/}+n(( x/}jZ19QVfQT )|?;u>vM"FvaDwu%`θEY E-X7sPvWc,$lґT*Q8J,Š( (* 'nyYG]ҾGif=2m~Ni$XMj'%vTĹ']20<=W##@Tv괬rΫEUa7Iy:{ 'bbcAQO ( ( ( ;TǢKpQ0vZĒGŘr:\ڽ\O%ą<GKEfulRHi`)s+䒻+ >ԓZN4wZ$6F }hcu[(!f8kIԷ~syqݎVRGE8[VRYkZ+ii֍kg=IAEV!EcBp:jjս\)e`IsfpA5/UQem#Ak^mSKml,zOSVT}QEQEUWj?&һ{wg=Oeu4)]1ZtqIPEJdطmڼmn֦6(0BBI@\-,y'س55yKGCXJWgL#ʆKJ]<Rh:yB/}nEDmlsN|(0i!;qTMd^ߙYX梺{PtZYJW;jKEA)kWNۉU=꒹2acz?ֵ(J$Š(HTWFI:iR̒(z(Rݍ)~Dw3GzAQRTMRFI8Z}ݯ-сU쭅O<5b+5'Š(fQEQEQEQEQEQQq _%E&(2jљ_g R4TV -v'@OvN?.b -5:YSe,?ԛqx S~m=sR]Π]o),mdCa\s]κRic:*ZxB1tU }V Y?t?:ץ3Š( ((((((Z}9+6͞I?u=.XQE,mt~VWM`V^"SԝJq֕`*B(*֡ THi7-3*)f Ԛɼ f;lR#qGAP90:Z(6 Z)i)UKO@)8H$if˟!M+9y-{ Ѣ+ (!Yڍ3Vo.9|I$rMg9[CjpJ)h­ͽj+h (A[HF*eRv+c(_$yXRm-Ɠ{& M~})#rI4s0Q.g;ZUON`O\aQEYE:w#y'wfv,$.&3Xr:aT%I&Dg`2Mk۬ 穦[Ws}ڬg<}QEQEA=pNݷMLH$ ν/{Z{'?1ttk)N#hӶJJu%fj%iWq*>t95ZSS*QEl`S]5{mΠϕ*j\*1rصuzeWY29y'Si+'&ΘDJ)i*KZ< a{tO1ֽ5QSt9K(dE<^Cw5v˃?e<\ICv.V57-^Iu&G_JNu$JJZ((mjֹ&ςuz8aT`U֝( ( ( (e>MMEfˬBF߁T{ WFU彶̹'zIdQR4T;nMfW?ׁU$A2k>WfBi.zg)[Q@Š(()p}(((X_Ҩ@%fuyi̖c<} hգQv (!EPEPEPEPLCl7_PEG'E-%fz!EPِ:օs6rZI9)Zɫ۰f39s]V{jàv .LjݎiM6*ơoFf$8 4?sO>UOtS*)f=MlJZ2݌T0M=Z@5IaKkl2m^ޕ )a#ne:-ķKx楢nEPEv0Ɠi]˼Ϝ?(~δ%-l!nMOYHHڄǠU N)lԪ^oE&Ov]N*]绖n ھU,($³mTWl7$=j[k yp[v:)肊(B(m(UCR5vPWFZ+LہTխЅJ2EThiQU ]Q}NknxrHPKw\n}Y>zCSO5p" KNDg` 'l$QNe*OPqIHbRS(w&V,SB6Okfj ͨ*}OJff9bI&TYey[tIRӣmvAu[k .; ~ʩťvJnȭIKE"ĭ-&1I;hڷev-+QT]7 *-U;Eկ29$,ʊYw5uuKJ4s#TUw4$$ibKNjV*UJ xc 9TށuqJ 5tXFט?(X}FcI\WlV!'+ؿEe>BO^M^D t%Flݨ/s]Kr=3PQhwf}aT&oh=5E+EJ([Jzg(IlQK@Ģ_ |`Us.q[>ڏEъhqh+3uwJ}\T8*)Hu#M*麪:h~>5ED:fj$K^S!ԓW[+U~#5 % (( P:)hQ"Q@5#ME+%1fѤ^a?| m zꩮ"u Mc]]8ܨ-!,b\듚ΤtQE2(((((sRv|-T.ʷ~[g"هCPJ܂(lQE- v"p) +ӕY*b{Zh0g?քPE $ =ʲ[VT_Aִ8,fU r{u;,y5N2NUZv;AQQKY)[@my-&Bx+f-ڼ޴ng:+M AD%V&EPEPU-hViR<M] ;;-Xx 'cՎ)h"A,u q7b:#U/>ZEl߭hCp jJ+h#M* ( ( xӳE\̂Z.G}*AVROa(Ģu pJdl{ SִT܇Q"6Nȿ_$pZ}be)6cL13Lś̌gUW<])h(JJuHPMj K($¯ŧđ "Z*mf%B =N:Hj(EjRYdJ$`kN,k,eph˕Oi$$n_ X5mΤJ)i) JJu>8%Fߵ0Tg`V:a<W8WZ{ʪ[mtޏq|Z I# Irrsw:+.N$-^2]MiM-INe*H`A%ft RS)KIO #Θ]-ԕ=}Drjz4CdAvd]LJr#+15akHTuaT(€f뮈n[GUV5E;#7ZLjyYG*pE~ܛ݅QL((((((((((((((((e R@d9PqP?*ӢjS4hwCJUFoE:}HƫIEȽŠ(eo3dR*[ƛl?;X#(>MECroQE ( ( ( ( `~Z1n*j)ZM`E IR]XO? }S$(`QEQEQEQEQEEE:~fkTûFu~( )QES( H ?Z@?5=Wa>(ŸEQE0 ( ( 늖A{?@?RjWbr4>j=RQE2op)QEQE"A[*ڟe5jV[Fj?~jE^3SQEqB({ Z(HQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE&A8B@@L<ёgJZ($QLc?Z}FA8f)?:7@FA#:`>E4:1²L<HH$=HuրEPE7̌\iAdE!e_@Z) OPE&Fqih#8>QGJ@As@ EЃ@ EnL:(h:PNM3͏8޿>(k:)2][?C@B@q@ E:uB@'QH=4QIdf +:Iur!,#yf2z0c#j )}y}M*`~"E&A8-SK8,:) -RSր)"):hSU4((((((((((((((((((((((++Nտ*լ;B_VЩ3H|2#֔J$m-FU+kt~3uh4zŷq}cK}!_3V5h&#vq.R!pO?]Ͳ ÊjܞR [}9xmъ8ڜ4k|rPܨ@9>٨ϟhW+.ZGkHN~cXQJfu9I&"pfXB&"0}M Pvr6Ue9d9S֤f`^3ҙoar/AfmG&UI#U>+s$GkǬTOoS#w%hO$ z;-=.$j_7}voA6<ŵl,Yzd𪺇m~Uk'Ub*![_T=7ױY3v/F&odS ipL4Y/sS4\mKi}ܼl>\4VG{mU+'qES\dظGfn`~M4ѭ˟ kjn,Ex֬r$6 +>~AՏ%aɼտ-GoջsFq/%˧BkJW6=?Z6da!o5Y7FgL?>O&OejTT?/P1M (j *Noq9.ڝǑjBQj.fV, u+ĠwB`v<:YvP4hvs+3>ejv2J&^4=ͻtLi Q9z?տE.?"}*ηsڠ?E%6(ԟ{ЃHbA%u'?*}.[h݌A856'V,IRqwtS!{wW 9j/K4h[+On$ \ᶗ̌8&[]^k\]i+Bfk#{Vfk"{S{KBm'LSuQi{ ?ϵˬ:ʧԗRޥ ~43F ~4E3O?))kQaz:lYCu8yOP8mmѤB E9t+nI sN{UfgHNH>ks!tR/ȑtkp琟 kirwC|CVUcqAޚ2ൎPY }k-` ɨ![]Bf}ji'FRMu\+i>SOտ*anmV6?7V-;BVЩ3VK\H'R)E#\CAkZ$)%6r?tMw?ҋ5o3F`KkkVNQZuOT296d8bBUme$,1mgqifIcGjs^ZoɅϯ5 U·hݻh隹I!ԒbZNmcNS]"KQ> K2WB"*BCZu2_ _Ƶdr*hc(GQT3(WvYZ?fZZEd&-FFbd99$M$kkb“D9kW֜,4n>V5 v36g>ԭӅ?7U=<*$`A-#A9ɧԔ+CuMG6zsWFA+>MbQ=qiǕ5f;iT5bLKyQ#\j$]hj2Uut r+)\k9Dd \ ĽzՍ8;2VsnўTKDU6V)NZ+t34eOJӪXKp>z/,*]J ';]'se1)WF?4G"!GQڗQT>o?5o_kZH$ge`16M6ԴIR[ ATG?<0BmLSWӑg9Eue r 6hc3MQ:49YqFx$D[2G >uP[Elb\g=MMM rMT?/hΟ=0![Z&$(I!{:%*" "J*ժZ$2ۜ2w(^jq'PSxe){%\T?LzqKTU$ЎVҧ(vV_+B+hDsLK#wf3[Ak\4}5m&ֺJ& B|l@M tc5? eP)nsTIJ:qqdzhHcHVU{ΤטԖ?ܚꮥXeHM[dVӘ5X `ժ}IGZNKY|ő4%vv5+N%*0 saA$"YmїL}ANq](zUK:|,5rE> 2*vWX5~OA+RѓޔɋVc5T[@ڬ퇪ŃTvd8stڭFSц(%dCD7 UԁQZ[%F4$sSЅ7y6?onW~ƟmVߌcLS;rJs$ {Z:4YgVvhێy-F2!;Tjq4<~jAq$ZL"# VЧ?zlчYwnUKUFDv`Npݩ Hn$YId易J,ArG?ZDtެ I4I5+h%$uZke L`=YѫS!A6?FbŃYôdE 8ʰ4$du}D\yYESKI ČsW(!ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETsA P03ڤ( Pz⤢Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ endstream endobj 945 0 obj << /Length 64 /Filter /FlateDecode >> stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ0ь 2j@]CUX endstream endobj 984 0 obj << /Length 1456 /Filter /FlateDecode >> stream xZMwFWD'0C7=Nb'IK'4Ir 3`$S4W1.wCIp$'?>=yv` )P0;L4l| _˰PMnB(N$8d4R[L9X 6B ;FHČAhE[ $AaU a2FöF|t(%%smdH$q6_X3SK`n'd(ObYìjwGh;!q2bV%qW6-P5v8 2ᔃJNiL%|p8N.[#KxPx Kfi_օ@ܧ)x/9z{φnkc[`kд\ Z+ay<')(npX&nj |Ҋ 6| <[/\{/x!V*_y/X^#&.he.3_ <-w0I[U4&ŏ{g4vۿ[@OUqEKܣ{@ȯsM{rUX2h")GH/E,U,*폃VzMWݑvf"˥WҕCg@wd[gfʕ(+݂,GKDŽvc}wegn{SBG[] *^9fw% ;$fDʘn"kqcp<;F^m\8p:9y P˺0Y~ 76}*v]r!_iUUf @ :?Aw"xnSN!& WS)nz3P%CxhK[#wlZzAfQlQɏGӴ!XqJ[ "؎YjG$rS7:d=/^WV!㑐Q#_Vbj(o]-ibۀe?6ZH 6r1{Fpl#1=ʮ^xV\Of ?p<#0}N32en=0<1ndacoǨk{ig7czȍ njb}̾U=M,}.aIhsv?4Pv2 ޽ L 2v͗VY~{{ 8v7YUoz- ?ud i.~qƜYOɬ3=r|FHu9@$&ȘP<Ϟ/x endstream endobj 806 0 obj << /Type /ObjStm /N 100 /First 863 /Length 2943 /Filter /FlateDecode >> stream xZ[s6~ׯ %ı4qnJR%Vg2 >spnp DdZ f!1,z4I&-zd2HeJQP)G}|^>a^yuO,8otϮEwusӾvϫ|ViY~Iٴ+|Zɢƌ&>ae;n bc{)m=V:?f@0e8;$K.f/I}|٤u&VlNYΪ*ŹJRINSy޴kEsLv*?U'-}t2v'2QhYxoaOq?{6ZC<?e3 ֛߮V?~ =;x^N궃L9fs+)rn=}1TJ iom_?:oyL~]ŋa짃}&CI-ߋd{=ϺfM__uC-{!]fonb3v蔗;QvoEA֢N?qwY~n1p'?q7i{޿ߙ ({({QdzW/W}^ ՎI|CQN:r2Qc'4m0xk0{AEQ h ?8W˧x:j]1~LGٻ)?P+<Ù"q2rymVNM3sN D o­Ԭ&Ag9|J(>uCk-1Q@ @`7!(!{qVrD4X:9t4{ ߓm?}گm4;~~~Mn$>}O8)fnNۂ0v]+TynqܪtzvBcp_O Y=IJ_?LO>nitfj-_(YD<ɡQ0;=+=ʯ|(aD{~}h}jCj5}h*UjuһIr\|z_!iQL󥻇$ܠ+MNs X.w⮞ro`ޒS ޝ㜿D^;؝Nb\kv^)]`-?Ɂ_齰%Χ B^ŕ,7}%#HţH7m.a[v"}=jAbȒ6K*öٗA'ua" ǩ¡ӁGouw,/]‚O{WY:2}.I0nNCTM48YMxBՃ}ar]N+ y{0_L|,*qѶHBr@:0K}teh*G~4k1@ @Zs c$nZe\OK M]UExQk[A\ sqv;<`pܧ%VP !LzLLoqjbcGZFx-C YrR1G7-&9n/Wxotp]4"rE9/` 8ʇDxpk mϤk&|? hXjӗ 8.pp\N3AA `uD(̧H?t9xϥq!rKK;Z[@E*G]e˩eOx1KtɩbzȾŚғ鋄d/ty/ !&P+V[exm]nfnD0W6TtڗL* T.\dSYʦrM(P6l*CD&z6sK\1U"cS2D%z>^bmL:}=D'z> raQRv UAj"(G x;`dSrby;ZˋAIdLp =B\CRחRŇ X4 u  q]aF{ZSeoapZu[o7'E鈓KF0tlG:V^̍'Xm^W be*AB+$T'9ަJV_.E._df.X6Ɓ/wPF-QdIҒ>F8CZ:3S endstream endobj 1036 0 obj << /Length 1629 /Filter /FlateDecode >> stream x[Kw8Wt&fGڙ9MsNYtfAsM}M$MqQ̧G(;y5;9}!_!ͮF >&h>yٟP֟G`fgfSI`xB8#F}Bԧ Mok% X.<ǓO x*Doqѧ "Dxn. ~HC,RXJ(F{=9# b467e%:-Dq(Qc 5+ȻsiP8ȋ4 73X ^1u9, -Ԏ1 6q L@D8 "&u@)4>}؁w6ZPr4>nn.Vfح6<HEwXqGDY:}acG ^QZV4Oҹ_MYՍyCxo > OY߹n7`jZS4PKZ)=^';(.7:D,A~P υZ3>vqJ5 `We6=:CI&BEkEb(@T b`lE+!=ts^t*- uFE 'F J1eCu2hO j)n @q2K-59g${Hn㼋Z˲ڰ]lH&oasasr6(܌zViͷ#_v6mF=ḋױ4wYII ߰6]QHWE+pLp7VH0S:9ކ@NPz/ؘTUIg՟MScO"A)9nLR F -ahl "l ՘LWR8u+.$ R:6{V9 A4|ཙ7`GtЙN^ח_@`Ǎ XA?t((dcӃt?Yf'&&{J+Y4J3QǺȚU2vՇ{[2K/NG%œA'mKѵ}Yޤ]E?]e-w_n׷goڶ4 endstream endobj 1084 0 obj << /Length 1604 /Filter /FlateDecode >> stream x[o6+]Q褊O]A%1jiG%#ERA<mWeB|޼.^Ϟ`z1!7걘(#/j1__) 8^Rל=cD!#$O CPHir8޹q ÞMy4Z.0=<B\BLARU|4RYޚT,+Q%yf/^8:Qb]Xr,flY("O-"4*6-O)Z7HX9 ( EuZcA%EPB1'cpPIPFCwǷy*JjTjߎY1[vp5R.s" S Q+qKWu^LJ"K5jf(_y'?1 c"5ޜߵo/U6gsUMcVǣӺua]׏^".69>0RӀ(u>HCl+ޣ8`efR["mEtn v"*R72уΨzyAh]RY$ LCIZqE bxY$5m3ew? 6޽U|,^ zfG#U#$VFdwU@lVMjtZCK_T%c/pqT')*}i}c7![r%ɿNq!fX1wۀ~p2<'47p̚N"l1Pk^|3uNsx SReEӞnA?w> stream xڵ[] }_EW!F$-`$~hkq`7@{{غFΝ("u4]{*[ITWJ+')kM*WI⪩qfoʸcày2B[_0IsPRܫa*#(nM#}7$64x`K`D:4a.a} YЋ`} FZ |8kc:0uRj x޲Ë%Pz/pq8,Y" ,%6m~ɑ6E:SeqjN| R%ch.3+\ Q%cJ nvR,W,V,#a\hÏᐊK/7юGt/7 Hi_D;U u(j)DY" \J!t0#r.̳ղGG3.SR BL.>j#G҅hEDV @Y(|v xV=1Fueug?@ř˾+VXP ϱ1μqà2ɎD5.| )tu{w~grK>fΧk{cڭn ۯxqBLNH&'$6|X&$m6ddM2%딬SN:%딬SN:%딬SM6%۔lSM6%۔lSM6%SO>%SO>%} ˏVtUf+JVT P] l*rMZF.͸hAPe8m<1!} l3*88n"Rۆ4X#j$ C:Kr[@al((〞8Vوǹ8a&L45`vpjAi 珦f)t< a V+JM[6p^86Uϱ2 K,ծ`hq4pTX&#)K.c{7kTVeOKB,{A|*׺ g:q)>ޮ;aQ[lԬ&*1qT.*6Bi OKTYǎU|%l]ddAXK0dk}E&p|Q7|D>HW˙9vjz4Bf2ԅC endstream endobj 1135 0 obj << /Length 1766 /Filter /FlateDecode >> stream xZKs6WHM {s;Mgx*9= ,H$ί/%+&8qh]L1o@ MsQ/JLd!c50ˬRPB>fIF!MqZϪ4,\ A.q|^ 9cHb"hA40B5,8K0'ɣ"E.ü:N39ˢ2Tc09 ) ):\Ի/L~R^|Z%Ӫ,Tf+e @'r)S(̭EsQصN @:B%6 EZU~Y*cZ/-ߛ04P-2t,b FZƌh-7QcvSO~UyJhݜ'>iWL[ɸlY|"E#듥x/:s)3%9 Dղdm?5r/H0b6}Ţr 1 /ߨ7V~YN$GJa _wKVR{Jb8bCy+{` 3Ѭ7Lk$Nβ&?ecZ_u{rGg8[ ^^Ҫڭ&^޹Q,X*]R; Od/VXbuMk"q^QTj s!@ҹ,$'*RZS(EwepAYns@6Ӎ„}%I'eKa=6erc-]lؠ&'NND:=1;LPT< km2"5u.BaJa3%grپnED=qC+ ;m`˴ݛeBdkʝ )^Usޯ4ݕϮzsc(+J'R\(M5J7kO2T~Z/eY~Z>ƬNqu{"DG8pϡbgk zQZE5b:UTR2rC̡jˋ ^OX8m?Ȯ76g4;Q;GB#ɶ2)grL帵h ϙ_MLrÉvE;U\G0za\۽Nm endstream endobj 1182 0 obj << /Length 1514 /Filter /FlateDecode >> stream x]sFjw:n2uiBkFBTu_߳L3AX̳yٳd> ASag~%=L3_:݋n7 c)G檇*=fɝ#>sFXz13Żsa)jz1(F͠0K!nà`fnF}z]p~I*]e.@F ւm!s!wjBAS9H7Id~ Id8XUlbEC Pb7j>Bs"ע7XbG]m { QIHfHX\rj [Bxn%Q^@\rJ p,SKh!(ja"v5σ0yVGI8J(Wcxl~+fc-".c(,--1J7}$ g8vvH<]u#4<Cke/2Z O"}>x ߁B :We|a@# mv\-.uE=|;Wu+f~zįHDndZֶޮ5 ]ڂqyo~~ @e܋4RBv8FvP"[IUl/Lz20ǩ7Y'Ԣu%XnVe-x#ݖ/-d& WyVmEZ_ƨo/èVI_j'[fpUO|yO6f\$ub:A^>y! iL޴}$ҚAԇII{Y4y FUo2kWaY0>E?Z^MWg0n-ueknݙθpgN%<˒ʪ[Pl- ]>rJM[|l$:5YTiM^ΧNQ/CY}h9= o榪 uӻ6_#FEo`}C#Q@/$4.ԘSDSӕj pn^Ŷ^V`lsG) ~_g)J:45+:׭:+Fym䯚i)=slv:ur9{²U&o;a$v5s8'uN߈M0<^Y endstream endobj 1087 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2816 /Filter /FlateDecode >> stream xڵ[ێ}߯c! -( Ădi1v P>pXm Hb]N9 )T,d5`M1oN)Xj0s&$#۸΂8GzQ Ҹ6S+PDPCJ1Ζ 4\zȋKƷ5TB5.E=Ԓ-Vsɡ>>В:Q=B90Q3zd)yЪ3VzP=SYs20C|n}ܫTvI(5x)bPpHN6sb4l6֋C(EX2ٌXWK͔0Ӝ7;}\F:>UGLxoe<9^-_NjrPdZv?E })=qf> ѷ2?-գGWy7wWWoonߞo_&W?reƛ]xZtL%E*'ýbOGy8M8= \7\q(Lb׊8=[7p8N% W7pq8jms,_UǛ~wpe#Ae!G1Ii9"l86ıq5Ă+D@> ,+l#9{DhP.P(@o0T[[# 16lL9GJDCe5&8/q9pÅCv~7y4HIA/u"Q[AyM9999(sP`JYN9s`JSr󔜧<%)9OyJSreJ)YdeJ)YdeJ)YdH~u(Ubh[{+]Ee Da"qU^^@_Ϟ69,#pBb]9Ybj  ,Hdı\(,k*ju[^ ^@74 Rڂj3Cw,@%U5". v584m]>u|F |dΚ7HXeNBV(PRSi;iEXqzGFL mzչ]x!?|oPmhԵDnKFn8\h`z:KjS{6kӆ23@{,pg˰+cVH@4z) ȿs*+ҢivVJYa0)nA+/MA`X)hރfwe?w3+! {H  EȘr(̞Vm/7G h]C-ÅB' .0BZW{肦"K1܂=r V;VcB0Kn*t<-G%ؖ传[" !htYtM 5oYH^V>aY؎FPnKhJɨ삳shHA:W*᱆ݧ (IDM7:~Id&+%SO>%SO>%\2%)LeJ.Sr˔\2%)NuJSrw/ao\vkm_?[<+]:-4)+zo\Qe5F|N0 h(DwšܾV|Z'$aAu*wF VA_ 7䎼BVt8>@l2bYQ&# M'F7r|D6ZܹtwPm}FDHR~~&/XCa"$ѯ(icUVP{Qi5ҷ5U!^G@5wwzHi$>x3< t>_ endstream endobj 1190 0 obj << /Length 476 /Filter /FlateDecode >> stream xՔMo0+|>8;"[*R8DoH];햂̼dlo3Y!% W}-* B}/:t^ϡtAxa=85a3.)¹r(Uljöfd rEI晔TdA3^UsxeX*0@AsWuĠC>Nv366oT fKB/(~7!qp(fRg<,YEo/.6Ό&2;Cj# 5ō2]em:$!Ǿu.47?4f{ /Nc1_ޓj.k3~KRϮv"].cucwS8\G5P\Gע59ӑը,TaW!1 ÅT0[Ύ<TFV( 6P]=xnTOuU.~#e endstream endobj 1195 0 obj << /Length 1292 /Filter /FlateDecode >> stream xڝVKs4ϯSX5 تPdO,֌UIN6z!#5|uV4q[fQV$eUaYݥvC[W^J4Q^$ۉHDdۨWO$vKgK"-psWчq| iܜ eHd'e4,vEkxƯ79=E׍ÁW5nzUq{N{^k ,x)Y?e+{tm Zj[ݿ{ǼolIYݙ%YܚCxP*ER[nFm8YƛgnpIG qͽV^wc̮ͤ7@f̗Tچ ~ڐI-ތhHE(FHh 쀑Q54ϓ38}hT0̌2;ZkH,#OW(,k߲}3"D:ZiekećCO!/  myL-^Sɥ^!_٤%4hQL{oQ3ُP`>m{Z\ 1BɂCӸVz4a;QapuLZ[UQp`-sV[4x3͖#=:͈:3!ú_bn{1՞Tw |ۻ g> R|%|[/MwMOkhQ~NV3R_?30O 1ZJ39Xa󆠡1j5/޹^eI,0̍8s%&(V(W^SaDb#ri7:5'$J)<rfaf%oKQPeas\`.[ju2é!ؔ9W,9ܵ *ݚAu45!bz}a<^#4\^%Bn.b! &ql"O꠼CnK(a7PX9tY{NCg L"d ϰԳ#m(5u{ñY=yN64qܩ߶懖uzv%ÜB\eGН%Ia[eT*rP\ 7mK_ysB"ȍw=,3 |*F`9-`(xX׼{P(yRAtXQwMW~oaO)k =,4bU7q/ba6 endstream endobj 1192 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/sanskrit.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1198 0 R /BBox [0 0 842 595] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 1199 0 R >>/XObject << /R8 1200 0 R >>>> /Length 67 /Filter /FlateDecode >> stream x+T03T0A(˥d^eU1013Qе013 @@ B%+W endstream endobj 1200 0 obj << /Subtype /Image /ImageMask true /Width 990 /Height 2934 /BitsPerComponent 1 /Filter /CCITTFaxDecode /DecodeParms << /K -1 /Columns 990 >> /Length 9369 >> stream dְS#r( IG+ed#XM8MPa>BuZJUZdh~ӫzWJ¯K k"}[uJʂM$nt"/Ҿ!jmW.vi7[^]^z"g}?JzIVJnVOjkN/i.4u_^v?W^!A`n*gS[Ki|Dz Vҧ]-* -]+imaR { %bU87aQ )0(0E2c~̂-޺鶊P[4W{K aQa3PҴw_ӺWZiAW].m )tqb V]^+p.+u_ ;oW].;0.PޒKiWkuM{5ҽWk_ކ"^.ע_N~ّj*S24 GEU֘BB!wUF]ifJ7T@| ~ѐ@<[*P~ҧ}Z~*UiՈ_zݢܨ" P3Q]a뿥a'izWNuWWpՃ^QvյIPƒk \aZi4Wh5 APpkU1A{ h5r+!Nᐛ5$hy{CE7xxd y"prB1h "!Ȇ!wOO";$N¾7UNds#^KrІf#zW_MR*_Pr>b$G erg I?R`yV%:!m wᦿHAA}k[I?PH9B;݄ Ӻ^{_T?E-j+O}mamVIץmVMa a@6"8iWLO$A1K~zJ:K<'Mi{OxúzItx2\2ֹ\5BC,NV oIP!D}LR#UB x^ (A/pW]._WKx*$;q$DќI,Qς2З+#xVpDvKURQ^^_mkpDu 03{C**aHGCDKGρX\<ȨPGG!P,/}}a Һ5j2vNJ!!9 h~`2 " &׾ &_Ofr9=q'2f'zu1^}t}y Ϛ 6D{cU+~uީp$p ;@Ñ" 6aUXuFbbuGDDG C[w~]W8Z!YG7 kn_dYdd4# &^EcO*𿤷Kҭ%]\2Ch}[d+vP"e5>NjN)' rC,p0\>ZkA#&?KCg 9c ~nooɵBtAm?ӯU_5/u% >7Jd> |4@+Vd\J@i'8lPe֞@/  'P_ /z]%_[H;]R5'H!Goߪ_-#O"h_t __W  }=-2Hi;֭%vDC)_f͆p|0 Sp"";pwu~~M/,a~!i^̉ -!KZ3֝ڥ]!kAvM$MN mP-`mFC)/L  GlZRפ~֒ z!! #pCkЈvիzzWATi;5 A5y]xAәii=4NڥNuӴ\&wKûh-\զSAC#vm0P?i®%>kM!sXB 0PF4ֽ__֫&ixL!@eMl/_Zyh$1"" _[WR ğMzKW:_?Ul5`=AfIa¨[ҙ`rBx]ҳ 4ͤADf@uDF P*]T.ªޗ uD Q :rDQ 'Wd+A!Z>!Ё>D!B.1rZ֓x|_ ռKKvM?_O_ ? (}Cd4tBw+4ҿ6?lIkx~뾂to^OPa> m:W$ 7zTfd }A^'2){:Gd4JD8!ÒSC^A,tU-W=Yg&;vC!'M\M""H sO0 ސ"$E|"+OPIU J|WuZײ?oK E!(zMqC>WQ@1흆_h>_WmK_ ?WOT̊ +¯׮d6is0l}izUVץWO3]?P9(EA ֯k_XDD\qz!q \p"#֖&/{k[Uָ:Z GYG r!HxDM?_] _L?!Wj x@d7сpO_#\B|]SgCUn!Il$pUT])ẓB0k9xEϥ." %^__wIU\R1Y 5 f-f[DD#o"dcм)uZM"@x@;2AgT?h<"ZV;[ q+zL0JANp=/N+7ӵ_Pn륆o4hamw025 LtjI8 @eW@}!H?~z_z?_k{RUJ{^}X-[7wèiJmu~A}HJd1I?UKi`` !KK{_^]=kIky Q; r-Cu̾# DDl$,j-;iP+/K@ 2a^+Xgt~]BԮMW Ow;!]]{|8 }7!weE֥zOW;jլ%/_STu]5/D(P^6+ yp628 Z}/ֶJ~׾\2 ,Z.hPʢh(289@1+]zk7BlxB.f#gM7<M3>M?i+i[M_i+UTS1i ?AQjђ)UI&E=POTl$+k@ńC@6TDtAk| }~ӾMF a+EdГ-+Ӱ! &i&oiP5R6/4ӧ#Ov{m{TO]; BگW }~RWVKmANPz[V5a0@› `4ˆpFCB(p918XTIwV Vᠩ͵=uz_R 3Dp0\̓odu".M'K=I;ڂKxTҾ wKy6XKuK./ָPխ`+" 3(!ְX-I5QakDH5gfD7H=..ְ4 rvUD߈3tz:W)9Q QBd&)03aq-U:d 45UD)$h'&2ENdZ| X^_8B"L5vfg\ fC`FhDqҙjҡ]-8/(.PK*]PDD.Be ȦE :2%؈;HpРDh|aoJdƽ_Dk5}a%jJ%WF& /wՆ}lz-<",Y@^ߺMj^w>zm*^BBk lBz`nrhׇq<5:xXk tάkpt8_!^RAH W@6([ +2F|g2ࡵ^W@R:CB"<'] C֞!F3n:Љ (+]^$.@0/"!K,35GMЏE~ _"`~_+/W+zPuzү/2 ʅ넄GO :$?^uU-I^4A$Qah"Z}N`fJIby\4ND|ԋtc \@#D9ޜ*DDiW)uT,UkZK<3\EAwH%:#}%x|r,"‘GNO 5 ml%Aɹ}"?_ze?ّfQ.^Du_w"uT$*OH<ʤ^(k@B$MKUizh| 4# ߻N Jg{HCDnAL 28g>/T7ڽw={yg \qgo?u￵뿒|תToK|}{ʰ#_l'wA֡}o/~V" ?!j] KMu> 4EpTqu 1AN>ѶAX1҄$Hk \uB]>*V'%_KI(_}*p.c6K]#!/IhMlCAI~CznLqfګv"%[*pT[nvfwCK_@+:oۿfJBPU (>" dvl?i…AS/w'TW^膎S[\tP o<09pXiԃf"N`ϠBk ~W- "" Hfx_|M[ "o*=רO?_1_A?O!;Z zSпUkeݏ}o__}k*2(zuZ oiq{]iiH,HejWxTB :j- N~W O,r+fpGQ 5z_Bf}w oany\0]_D 뾓o_OW\/ 괲2|!#\ 4ү}Wkg}|{}z]hv?2˵Z!ֺUֽկ3FgÑEDH% hA?zN?7,_+Z}0U>NGI AׄiM?i_̫fu| x! p!fBNjiiW &pj &g0!$<&"FhP1l'әntd ӵ[p[̜ef@ |%\ ]wKU_Knn g޴}D(/XA}$,^U%bPpKIzAuU_Wv}*AKï\ᔒԨ િZZIj/ ZZ^_Hk΢`209 ꐊ H; TRq[tB]+Kn&~ d3G Ñ ED9 ݡJvo&갶ɸXX5;|x+^RMaKI]xNw>.79E*du"zᅲFӏ|&#s"V2*0!@Y-Ἓ aaT^ZĉQ9"""k [p$ziUA*_d0l[ :NB&ݭQX09<*?DDDD.;}._:=<30. K#&=; ¾>O[3D<;q߇4L."sA CV!=m,RVDd]Ñ !#^6zaU'$2[H,`U}[2Fz8 } #c."P`W{ 8ARjʄxB89G9 (Nj"(dQT@5 N u@dX! R:#xB:$kTЈƪ/"'겇 K i/+u/v}deEݽ>MV v[gѿH`!b. NցKaآ[}+oTU}FdoV Gai n-DPӤWszZo.D.{hDB1FFQG"""A'a|5ڪ }C" [D2 *'}jz|' ~_ST.9o?|}"fA$z!ǠO(ׄO-%NWU*_ uU|/z^}owZאM-J^am7z{WaJ]/+_A/$/_קBBiɸR7" ePB""g$D#a$=@AOaxI5ꁦ W}KBV@lNGL=߈׺.%v_[?K,Q/(pzMz G ނzZ}_{o߫u.u_k3?`\;_ֈ8^ !mtZNKxP~}ACOpgUkx7 ɁCDo30AD[/}+ ¾A_qA2 X2AM2-S@҉\3-kZdR@kdp` !77Sx7#xB"""!'Wt\2Z6Br!FU)_uD/$A,ӄ<, jMpA=k|㐯ꐇ??X&Ҩ";X QW Oץ_KIz;ޞzWZW^WUתA}ނ %,`2Rϩ9҂JJak x TdVe@""C zojeGf RTfHE \. ET*9jd2(dW$ 0v>  endstream endobj 1203 0 obj << /Length 91 /Filter /FlateDecode >> stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ04Ҍ 20GVfb`T4//$j8: = endstream endobj 1209 0 obj << /Length 2007 /Filter /FlateDecode >> stream xڽXK-xD)R1x; x}h=RcPؤgǿ>_UuS  X]]]]]R9nͷo"Û/($YXEyxfW$*6:z٦i7> GyL(n2fo=U;"r>bM0)J9<28a4EczY__bLe`|̛epEGbDi-kotBn .f+BNG- d Iʰ"ݠnbͽ8,G}ر ?$ F'm8'KjJ5Md^;+5Tiύd܃aŅN4 \Vz>U&mX ƶ"`jjrQ箄:((!rtfd8K9e^'3oɹ#z銇a(z:XϪ"n8NV6#T֒tqP8hq# Ocs^dq"~"q =8-E #'=EJ#<-?|ɨO1Xt pw0u\=̧UwX%v~ ,OErryޏƎJYb [U*YrqLu+ ^$Τq9P%< ӬiOf,*) l$e#8t#,M7 xI)ȏ̩wVAR(PTqVW*-8LpCWj]}{bcv+mWHy~*$lAF־ê]]! n0)NRaB߮.ݥӞroe.;]5Hn3l6v\[-?3aIH~/̰P@^R4&ޗaÛ} endstream endobj 1218 0 obj << /Length 2085 /Filter /FlateDecode >> stream xڽXKs6Wm9e )ZƲUҸ6UI3IpRo7B'N'c/$6,eEQ:[U=] T,,9hRVo(L=Yz?a}OQѫm=˛4,L}vF q#ׯ} Dl m-~.~_ A'i ϣos; jg5 #42Dvμ ={xE"n4z!8XkNNKU旀ŭŔD-ab#~Opsn]aJ;: &P-UkWZ%w9 $BT}X#@%dl{+ &GB9 6+݅0ֽp]yp0? pcwp25Q1Iq`3& NOq>n54y9_$yղ\_`h*yVZINa8M(; R2wP!;-;($F',V; =ir{*V p,\B#[m/ 4MRuw[E-!nka; pzGY#^Q[ FGw{Џ#`҆"N6J7֧tOTRϏS\LɠwHMw*@^ON~S?tF\NmG~?C}-nlȿ耲l{%Df2~ģ +9'4^%hZ=IЁJ3'@sՆt-w .NewЏNb*ܿy?\^?Ϸw$y?}ǘ1_Y!z`JQdzNX'ó^H;ccG뽘C^6"ʁ.kY{0zqU`\zt Ȧ;rNI'Bkn;XEfIft;Y˸[Jۊ$k $/љ *ln(S8c P v bUC4D( y 7憓+ a P E@=GX(jŐk -6+imtvwZgb@@ Xe '+>hϖ% J܀mDd?0$Bc! %œ+iz(Q=Mu\m@Y%Fj[ZzNޝBNZ삚-ܵB@FVFkKCK ^'{TBp8Κ yB 2nر2?G- .ϊ-!65S`k(@~7sH(3} .B( ؙq#qTutrW@ÃV5SBb="_g*&ٰr|~~7Zh|d9wr+x+2GNeMmq7hu6V8>^ļOn!ZtmZ` Ǐ!vn uv emkū߽h- Pi ׏D r%Ԁ'+O幤wŚIby7O 5uڌBbʨMO,kAqON7zF5N8|,=Mqڥ(p9H%XBR}"Ғfl)rtxTӻ HV6|=ЭT#NSH! s$5cUU4F SXw+=7E~Z{|/O~&TfK>$oR_˵.!hR endstream endobj 1227 0 obj << /Length 2661 /Filter /FlateDecode >> stream xڵY۸ T\s ػK.)K]4Z-$9;З E?!Q[_x Ӆ"c,RHL(,n׋RH\ ^,W22S˗7}odS8@qѣ"Q5]rW*:bz,UJy𱪋2ܫ :T_v[HN[<ڮǽ*sTb#:跆ND5e tH諦wr# }+wDU |Z»ӠRk! To>"өJhht NLJ::6ݚ&|ZH=mC@m=&,MD>'%sKK\u'AlϙuŅƹJAocu\L2eQP;M- I%4gh}?xHq>\'eCK?Q /)IQn٭͆H)+03&轈";b}&&K@KUN=E Pr"M ?arxF Wo"T,I:@4 6런r3k |(g xQu*B"5ftA ÎYdpOc576S%!ZϬd: *-u#谌Uk?R4ÃzMl1tb/讽#h Yէ $jk BŃz}%|R.`wG"8D:D )abROУW=,B*G;u=Ԩ}q"f{fe߃Vtwh;g93سh:$P= 5{`^AGB+MwU: '@r!3͈F_prWmS\#pF&$П+l*,ji`8~]qKT-/!yb%;1,,,mn2m>CY!J(KQ#|ELuBHEBay(!%5hTQ|;003d r!8HGc#!R (ʂ쀮Cߡ*yPDB^#[/MG64/+j/WcnI-;&!laddNtH $tFS:' X~<Y0c7őHT{nkp f;-Rgm- Q"tR]s؛/B1/ ?tkhc\˩h9AfIPE[XOχL;>Dg@XsWڻlfH 2lcpX4N`ΖJ|*]Vbu(eKW閁L`d]tk<ךsgyڍKb^-Z9/mj/atj1~Rp2/G'eVIh Ar*F1]}Q^>ޢ<x,0n<}_ endstream endobj 1236 0 obj << /Length 1924 /Filter /FlateDecode >> stream xXK6 WVy6ʥn6i:ytәE[jeI#l~}A%ҋ|>.^=e%K4 bY| AXeO~U4.)#'ŬK?ҏ#~WiEOZkS ~+P ]/yŭ~(kFIh0"`XUm1#rw4n> )Jh;.y#1:JEkك:0i$$ "pjڹ2$|7p ~vn%쭾߹4qZ&ܫ5/}+=>S&JAђE VuMOPqkŅ!@d-~u&H.Z`ai8ǽ;L,K я$fb{w#?U TaU\M]PT[kk*31]7ZIIHBP D/qPQ:.T)i2OD o EcYDrQu=ϕ_ eP"  A0:>SJc:~qvaH#B4!o]p`8j ;a][w$WV:T܁iC~gM`cvw]v(魀;}U? ༚ I$d<.AxK ig +ʮ:}%fVm[Nӗ8e n9'`Frԯ`epjHBl}^W 6 X]zWU8=!=H KF ɀCيaQ#!x>nb+F*=1Ƣ" IpU~@ⲦhƎf NHi8ҪlX0iV+:q1 D1 9IZ@K f ?ϟT%syk_jbY;!Ń# iO96oG=yDp ]߭ۢ)zaz7A;tQASYÐ;=؂v4PbE]7 =qO-UV=iȱ!`atƏqe@qfi_74K}KHSsF@XNM)u tcD6qϢXL]Kb{J}&&joǿp`[ay˩ytdoncV~:+c|LTUj%4'j瘸u97ىM<-NٖF C&9Ԭlm s̽-M=3ս.ڙw"zKz&14ְ#ϡ3zc ?a i$; wݱ{LeRwi_pq HBGnD/8ֶp41ۆƏj4ձ1ȴ\`3͇Ǜ_Hn [:RLQRH8I14p {u%AEKH$,Wi R<~2&\kz JYEBx%Js80 ;> stream xX[s6~ϯh@#xΤnxlet`H˞=$Ev/~wo~\9=n8ž/fY(fa1!*pbܹX,suZDyyWdc*0sBDBƵ|瞘qn.b9[IJ 6mPbR:ke8ڮrɚf*OhӨVNZO L8pcFa \)ed"VPo5釅zqO˴X- NQ|dh(y SkIixB{/JM^7uZCaҩeٷيGkݑ:ٓ ۯ{ǝFe-R)8~ix@_w+͔G KdRQƓ#/)aoV.YEe.rZ󮓯KpUZ$IKiXe-mݮ(ثzkBNSխɊ; E'!d3A-2|A, O(AXm-St I/64 | RUzTc$cZꩪNF>F H#PVuzEA_~ΡQzQgU^yG* %e3.=N.Ѝީ i+ay?dA 0rgW`xА uT+vӑp8W#a7!6f3Ǭa>`g"ؘLaAN |'ΜЪ,nrcei;c腔ӥIj3L,ejWyt%$}T$n4x>mBl[F"Csdh䯂 ðҟbh[3:ݍwmr1(L<Jő.U Q5<81ƹe}@d*0gR#SM߷f6ϗ}p+.\ jοK,5ZXX'|VΔoiɺ7& ~Nb.8ŝ(HWV|9ЗvXJIXLA 8eX"v 5Ҝvfw *(l 8oY}Rmf`qznS֏Ɋ ɚitb}V࢒e/cZMqMx:T;MHgf5ZΗ}iJ 1-jfpOO3}I4~X/z )!U/Zhl;w0v6zRq2H$5XD}B؝4NPMWqQ0& ,z_]⻝qKJsu~qu|fpt|H?_zo.>IʇLD򈡦WLh I2}wiH0|Ah;8e2}E^U(ldSFwg%7X:=Zعsv_nwv#k7XbWn783P`)Z %9`J@fd<=)aU P+tU}NRb5CʳGeH0p4K8~h‡+?ulP%3 Nm"> *>F6҇Vx>ҌY8jR֭Ud+Z_>T%F5P%SUGw2k$7T˦VsQw}m`e]T4]Q4Mۥm_;^+QmNɫ&&%ۣC 6_ CņGi=yPς<'Y{Q}ὺz'7 endstream endobj 1263 0 obj << /Length 2230 /Filter /FlateDecode >> stream xڝXmo6_aŝzt$=E{pD%ʒᐲ(I7_!MqÙg[wgڜ]\x9K@,6"(&[xͿa3Wİ^7O˕'B* RD_֛?FgQm"]?EEݽh;:Tm%wiVV-d 1úJU*dA+3ߞ G{MviaNvZ;mL,k|w_Tw4-' hG(|zwvjV˕NdIRڝLa{?Hwd_[5Ł5-haգ|\QTCighPVyWsUEG7Ⱥ,Rr_]Q~x1%BuFuY$DS27{)8H_Ukej'￧.Zu]ߨ4M܄ Y7nb߳ QYŜZ]V3V]2coO|N]1F#HgRDw5Lgju^4*WR^\l=eRPD!Nz dMSَ$LJq?Y(VuѸdU~||?&cQhVK(R%M9y1Ƚj6ɰt ]/wJ QLCrNgC_7J]-FX _tanrnE`ӝx^XLd_t^|p0UY@C`eV2u $Kj}ceh% mNp'a1ob{G1'6Z 8%S _SG t,l:X9S4 _*3&b 793Ű7BaxgZe6w0=H0.T<)qݾ*ki0KlDPXXy pu OۧˮV$"0$2GP3ɕ쀵 m:ig,Np 9^i O|gLX,OG'ڄل 7:4 EF_-)t+);"АF d-Avr ,*EF%RPG٩ސ0ZKu{c|RfbkZUws׊w@!N$t!6D Lp@o/B"]#>F,Ibd<"^}cd[hq,Q"HEPᰮRyd,:vCI|uS):Z? 6`}[w䆌5L?`\ 1& 58TUpEP7 {mkudB]g V0hnw/~8_G`Pq:b?Vc !hiҘ6(WnTJ:$2 t?ɯox7*>Y&Q<}}['pOi??5o#4)A3|Cw OS}3Єqӯo_9xh:ykh鴁FJ-sqKC2khTvlΤ4ǯC2`(荚DL,:O*hxOzr˟ em[<Ԋޛ|Oau~jQ 6CfP wË25aOڮbm-3kb"fN4P&><Xd@-mx7N815>rϕ8]3yXl>]6bV6!uq:[CPg C\**۱ϫٟg@] endstream endobj 1272 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0 W ,˲cd퀢ؚm7QlY(N!|%=>"9N>Ϯh!xB`YK|!$I2 Y*dAAoPЇ@)L~_JdTgLs zŷ|1aX 3ɀhYcø$)~|ҵM=kNNjQ'#1=kke\a.zPI[vWQU}/MRJ|w[5 U*X dL \COQ hٴ*?{ I]'MA*i+om e3(T%_.luM$#|A M:z ̂>7Q^=ƔME@Tj{P <,n1\>=Lhö['ganD@ ŲD#yڨlVy=ut>/XObject << /R8 1278 0 R >>>> /Length 57 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`n`i 41Cc#2 |@ ^ endstream endobj 1278 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 946 /Height 932 /BitsPerComponent 8 /Filter /DCTDecode /Length 301969 >> stream AdobedC       C   }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?C_>P7? nnq{|ǿo¿Ϙc]?}/S,75a?ƭ2[U4)P5[{|ye_ :wg]& iߋV\ vI 'ڛm>Қ IG~mgh?634gw[~W?@ ;G~-gh?34NQ?~(ſLMӿ&&iߊ?o?@'ŷs4&&io?o?@4ɟI[[$ -#~mgh?634oWG[$ +#~-gh?634GH?$ͿLM?&&ho?@>#kosF|F(>|I_"γ8^cn`,=~ֹľOĝc_ zA,.gkpn# np@k*<4o/nm ?p#_q_?}KkTp?r<O 6`[/}|3$`\3M_ڵ<_ >4XkW,?hOM_ڵGGu+= C|={[kKKmJ?$?࡟v^hZ-N\]VG֮ϏM_ڵ'{ohVhnşh_\#Xqҿ&&Vhr4wo?XXp֮罿LM?~"{os4T;V`=$Pڵw*i7Zn%!t.-"dY|ڵS/Oq_խع hVwZ݃$Pڵ?wxPڵvPڵ.?hnſ\;4`Z݅OsG խӲW6Mq{7K{asS, y;!jw}K4kv?!?r` KIIuad!74`zY~,\g_{ [ᠯ'do] şO z|qjTY[[=_bx3?hfsG ׮jYx7ti{*q cZߴlc0|I+ àߌk_WӴX >..>[/1OA񥮼,tf\AkMq˿|Wuj{ڕxƷ"otkmfiKmKMϹ=0?*υSZGHgz_Þ@^|  Y ~}~=>}GDA]7SsG ',+;_ ;e۽qtM^o\_Gqo}&ǵAWÚi??GпmsAy6T։ "QIE;Y%ỈnO#V??\jx/6]}MqIJ@4*NntoO]u>n|%_m:LIeձ_&mƵm [o+oJ-n.m4?7qeo"}i [n\fF Of|D_.hk @P(>Gx[Ea)7/_ NJtMkk{vH7}f-a+)gmW+ Oψ :? lK^8gsyz֫sg|?si΃q5ֻ6h<}_ m}?K%olE-^ tƟhx'7^!+ 4:kyg>~=qG~,6Voekoߪ߹m_}/:πZsu>\1ݹ5sݯ#,%dըKkkO_SŴIXO.4 |f~xOڕAq7&[!ؚi+ނߥVVKշC'#SҞ}xh/[\Lo'Ng>AF"e({)_]4k|Cjv:>KWE=+Pݧ|?[GXӠ60h.L/0rOBRn6jˮYtyA>M (iŶmgqs@"܀O#ۜ%֌XI-^:{_>5}7 o[qocɘbéK$޺k~r}+=kql`ռE xsRY3"s^dMx΋-)GUu⏆ic^[9m<7A#߈1XyZ2%m͇/^%aOi/x;'SU|.E697xn嘌N/wGV>C4k%efhv[>qNejr_# |oߎ"4x#N𞳩i#ƣaM5oǐM?|ףW_˗U}//+1_Xe[go_jM&5{ p7OOp3ǚږ_.}m-ZLaմ{-zWQar5=vFQ?ԧ9q ~>ђx+՚kݻ=uN!?ռ>KNm/jC[??ѳ?'~+0+N[yϱ A'?7z/zp< l ߟPa g>qW38Z~GjzY~.v ~ŷٻ7A[s\Gִ[Y_Wg= 6>vPoKfM-5 u:M 8com;[:qňb1T1kmknSgOՓgznu'>MͨnmH?NM}SSKZvz.}O+iž/$>hyx+?wÜް|_} j*;F:٧BV\\h1jG]O ~<ּu|Dc}m?zӳ(+:OO=QgK[ Md]7lQxOWtO|}x~0 \jVZus\TqMP՟-V>_4^\Rſ8G\ǟGMͿtE? <(ߴP~\xx}} 8GOGu>_b}c,Fs~~_IUƕƥ5>'٭ ;\ܛ:Y8wk-?Aφ @ccP?RLon>^be4֗GuS|.~h}⏌گ0-[Qt3GL6h s;Rci0-#շۻxk>(5W3·?au;Bȿqp?ř_^ 3l>w xPPľ <{ujV#f|H x5ip~|;df/"6TCԮ.LM$C37Ýi |; ÷;m |gێg4}c6j? uo|pӴ_5DŽ$6Z=Ƴq} sxn-ro?OX|;+h|X|?FZ8؃Ķ+ SOka:AqnmfҔ,g2t_:85r`{&|On?n>{ -7zQb0[z|~fÜՇ>5ƲnxN|jOl :kvH^8%bKGW?K[oY]\|6 K˯[oZ8JG{o駐gG+Z֧k}+k#PŽF>玼N#kbO^׎5}gU:W.ϡ[\Qo'8.I5xVk0W8<o]i#ק>mu[[[ ⹭m=uD|bg)˾v#]Z~|!oK✺O~t#z>?2qGP8b10X0W>jO|OJOjinn&kM:p'@_+l>ż2?9o^^? n|K" -[y?{O[nv_P[1m?d3ZHm{c!H dy<㕮\C ޟ;#jě:| aHm-:Cssooqq<}>՚^.v}#C⿅ Ǥ[KiWye?x㮚0s1<)gAW:q\A?h9z?q_YJO]6wW\t+'R}CTnnmS{[G'\'VsX<%cy޵ͽͻJ }z:ljX۾= 7x@Vo[6}i-i`_xVH|C:T6pn.џθr{s\1_Vxg}y'GB𯋼;}ik ir4?=r0}5Nш_|0˟^ :'ZiZδgǞ?T,iySh^Ƌ.oXi:ǐa?猞{C_V#]_ަW|1=+B#I70Es.f|r:t F>",Gu WHtssoowo?<7GG]$OQ|8\諨[One1&xaͻsi|ǎaW$wWéOJ6'?G>W+Va{}*Z My &.fangk86~33SK1].k}?H4 J . >t|sִ+a;n,F{a:O Ɵl~}`m~yZbxiY[au^?RƧJϨAqwwMMscB~Όn/Ϸi}~/^nS9u+# I_ p/#6_˙ xwOGOAltJ rp9Wֹek'4źɗ+]5>mqqm|SÉx\>>_ w$d;?gѱퟴ@JoW9'./?`~oopQ~Zn|5[-G|S~_&Z @X}7cr?ɍyw<_&jQt"څΛqo߯E V<.?HK܌=g^~_9mnO?ᑾ,i?hFqϦƀdo>O?ᑾ,i?hFq ?ƀd @2wŏq;B8 c_hNP4g?Ǧ(ᕾ,zi_hVqU>O?~,Ϯƀe_qW?hU>Ocҿ4>(϶eϊyRq k [}cn!,?Ɓ ~?4o\[IH~Өj/rfOf$`~mfG 2=+M7]M[v[0AssqοoF>q^_Cyѭ|>vcckoȸ.->p?>>_gl *7sG}#S[db 6'tl?0j?db 1'?G݀@ü~6\5v?1w?G݀@2x'?G݀Ak FnF ?>1j?db _cO .C'>[=K߲-_Þ(ë+}>qkooiG٫ Yvaw~Cb8Cas`AW T#o?sxdb eg&hNOɗ)9[WÇF KA E#Uxdb _?7j??1 sᖼA5>?1 Y-0\5>?1 hs<A=.is?1P6?Xxdb 6otsp__hZiޑ.eĹtӌaE_P-5_6?1Q-4p(KH?l8db YA=#.hY7>=Ɩ5}gGi|k{~\l/l)33%Etp)OO?l8db _|K?6G͇@¥/E6?1U%?(YUG͇Ak?6p+Mo~l(Y-»OfÇF ?]a#jAXCwmoX}?1_@l8db oG͇AcxL4[}F/P?m\<˛R{?Կ KR(ÇF Σ?6o#j^֫o y<_?1PxVQ.f|>mu FS+a\ӽto#?8dbԠӵ/˽ͷRi+0Y [ğ[>"}#W SisbΟo@.綺5Žmں?1\[[[F<>0'CwmsǷ?oF tŘ7th.|Rb0G8s:|@]Ѽum A`"/X>'Z F /sXSU_f}OV{}NN`KoNP ( ( ( ( ( ( (<ǿq̞&ÿym/4|j|gtxHF lu {h!К{ks[akq$ېpq'oN,pS|?W4]z^m> -*-'Onz~=뵟 [Tq⿍>2}wNŭýo[7t6?g?0zPQ^4-/Fm5uZo4b躍MRhI@XG~4_?pfu }B6X6x]ÛxlڍXj5eƠ-G"qkԞ&9w} -SLaZ )p,-o<0jqnG?h~ l#ʾ ~~3l =M=CWg&Ӵ{k{xvc0ڸcbnkV xxxr/ mٸkQ`{si\7Ogᶙ |8|Ock}Ʒ\i\]_?i5]OYžݴw6TFM󍽌cyq|`.a߄+]?^.5Ӽ Q .n- o'z4mGZOAo<.-oq\[˽ z-|_"֗8͝|1x_ZtOEL<:p."~o w}`MO{h""3С[χ[}i&Ӹm?6XY↿Oj~M3k?hԮ..5o{|gϽ| m|9iEνqNsAkqkhܐEῌZwז#CA}P@ 5{kss4moP,<@J!4CESp-ciDsnk[/!7Sϧ[ {Mџ[ƿ>!5m8PxA׵~-ȶIM?ߋ‹u]KUѭC×no[=Žb-gŚ~HmGYf\xw-aum;H»]j7&6N'&q[ȷH#ԿriK5ơNoaihEG>=7|ǵeaYᆡ8ΣG& MwvkB {x?MEI⵰.Z/τ>x)վgpO:ƟqWC6 kfǾ@@}#Y|I?|0<i1j>ҧnl+B [{{n냊 ]K,[}ٷ?oq O;Ǟ!FQIsxOkvmEپH^ՍJ+$i=o&;}76v?`ӧ$[t@?j ?Ot Q+ii79?sLmwZ_u m;76p[Kk{o[}g>m5<7IT4^j0Ah>qqjfG?n.ӿ x ŃZLJoKK Ԯ4۟>-.-+;+E47.%-5Okgp[L֭6r-M>hwo=\Zx;_]w?}> 2OѮnnu \bYnnPӴi>[[Amn\}?iHӵ+o@t6?7.a.e׉-tg\72nV{i#U> έ>gW ->\䋁[܋@8WwFxVon#ew"QͽOob33Z.IB/hzW%>}eh,#=O5-|)m/Ku]G@ҵI`/ 8܉=9θ-V64P@P@P@P@P@P! AgVuEo6| D~.?cmVqߵ ]VΙhnO[xNau?hmOH>> ]׈>j:G?gq[[iqoqsO7<#^;?-xtuņow~NqAj{" qoIc,,Ia#z(hO%"?Mq@ x?!+/ޫ^Zw]P@P@P@P@P@P@P@=gm\>Vct}WOfa3m k[gF9;3?kZw?q[~ 9|["|kin? &NNyǥh7Z7>(տ/qooom@x߆fx&Exz6k:mifc=?غu~Ϝw@*H4o}N=ڮ.nn?&>+ 0wvYҳ}jza6[Žſ|НG}q&Y&zr\[Ѽh.n!7[7{?(˯ ĖZZ\Z ;O5N鋏xlЕg|5+G'·n~4h5]GK;ľ$|3{\x_J-ŵ.@fsIp9f wA?"mp:Uώa^k }sAūjW6[oqsX6>/|aD  ʀ:ZO_>#|9ЇmgssEmP]WR~u]\bPOǟq\\qwpῃ~ ơ ^M6&O7W":L.QRH?PP|]y|O }i 5/t[]_Xg'n']\sXFZ=x\?Ծ=U4x7 .-i4V{QM?]jw>,E{=Ph:&jZچ :ŵm\\ }#71s[P?ֿ ioDzu{huˍ>Os ٭~#\ _K4x O[\xG4}?fIGRܫ 9xSN׃|QbLqOumg5OW5m*ZƋixO.>o.G?ҏ|뿳Ck=SԿmy`tB {Gh? e.t:CZ{o~5㴿sJuQ>𐏴?.?_k~q@M4h7<[c*}Em?֮ty7i9mG?Zou|E}xBK0h`3mp9t&o): cGOga5gIӭ` ChGG?cshIp78Ѿisq}jαPϨj$<}nJOWÍQT`'Yխ[b=&_i-G~(_i?Oڇ>m#"Np[opOM揣xŶ>ҧѮ.4[fjG7sp~ۏn~ZξtxKҿВͷ6f~spn.ѭy߅ /<] +˝"F kk{k{koϵbP =h?<==پ#W_iw75z.?B4o^Ş)$Xz hmn5}q>|{n..-~1n>cjoxx^ |΢EGG?7٨AV# ( ( ( ( ( XofԆq|tZ|)C?'־"-g>"itX?<_WW- /v7麖4Xl]?4];>&Ohk~>拁*|m4ڍƧu?@Trտgc~ nm\kְjF~mmN4XxźwͫxZG.MJ}?@E֓hMrx2}>m@32p ?x\5~t|5uX脮p?P zyi"z=tP@P@P@P@P@P@P@Px=n?}sS<9cgLuas\Z~qmo?㯧'>J|wXwL].ԭG\P3'>7NE'4?j[|kqsqwh>}H,>}H,r (_]}}~[-Qջ﵎?`KKVgi\ϤǽbN?|7@@X'Hjzu..O[[[E9|G [~Vx\Msqh-HyGjt 擧'QZ[_ֿ~;9 Zk>;,|;\Ox.jV}.(e_,Ëqv}=iWzρ5i{ڕh{C5qosm=ǟoNxkQP5m1Skoqqo?#>zUrúeg^vm?⁘>xX<+#ztqm= v~#^5x4O/FyO^cjzׂ~'-fKOTmmg&OҝUҭv֋noFv'Ԯmm"Nt 擧'QZ[_ֿ~;`o?"<-^Cӯ 6k>?&([c_:;^hoP~?(|W[x0jzg+.|>}HV >$P8 x_!Opu Kj; >$P>l4JH ao@~o`o?"`o?"`o?"`o?"`o?"i>[IEjo\qoo?P>}H,>}H,>}H,Gi^l-t@LnTZ\[;O&NG^z j_o]N?ց5?#5ݖ3U|]\ϦdjG@Oqo(?$}/I/}~>aFa4+ jW0\Ej`o?"X5+jvfWMܝ6}P3f  _ǽhE>@<%7w7:mMszρ;3ePyPNo>qp (H66muM2'SngK;}wG? j:/~ oH׭Fx*5݇1X.d35,+8a{zBa}Nn>k[yIx/ 6m5~!|R7 6q~|TҼ)v?'ҼA] Լ1 kȸOO>_={Ziwmi77֦nH`=+0'YaPk$x^|-]ڵſ?Z1'pYWþԗGũ:>m[|; aNnl->moV7fr3~oihw5 ]\\h=i|7@H,yVxc#7[[jZmE҃VZGk v{ _?=mq"#@*iW85 ]#P6??ָ6N>}H,>}H,>}H,>}H,>}H,y+{k VuZ]BbO6~V8PПKE\.?:>:,BW8^WE=( ( ( ( ( ( ( (<{^7>ڹ|j?q%YP[Z)lOe|,Zw?Zgu <9 ΐm[? rt`Ii9Y#M[Z֧O4<#xVbISҦo\sn@q>@-`m2v|?8u 73i[vek/TB[~Tw~$/Ic6 Yk.l~i \7[L}F}%_SO}Uhmz:>Qo];wÝ3:JԮ..4c{}K<eRռT&È,_}Mo1c= og\[\\tq8?:9WULJ>5iq< i[[{.0kxֶ&'oz)^wx= ྵ?(hy .x<[c NaN>0\[#5Oc.릖{wMY\0!젆k}W6&lj8+8,73RBJKO75/5k:tOY!tMJ5N3-XFf{hn?|.U]|_[3I-=o5 F?iAzT1>M#vlC?=,_xS𗈼y:vQŵAq{sqogi0z2~#>nEygIĽS/ğ_NR6ٮX& uN 1y̚n<5gQ|G~x#Γ\j >W rh~gfYϑoo9J0wX_=˲z+mďjWt{H?QEͽŸ6_^6eja^_OކۭQXYxgGO[mng58gٞez߿k-wտOCfZß~;u_ &;.l. X=[n?>}l=x W} [v6 ]f56k'^[z}-qm>iO3ϭ* tȱo>eM៉7<_'toooIԭn1qq@A?g#?q.o5nz 7xk=.pXM$߆1:W.. ݪ[[yֿ{|G# ׇη8Nu+=-!/`Zq}]%V_͆~oosqok?U\x,TXv䛛hw@Ěz.?R~osqqq۞hGQsԎ@@6bNL%Hڶ|/Z}cNWE9cOz4 o#Fbgx6a;?'+.> xBa[CГ<| 'Vm_b+|GZW|j_y'Gx[ׇu1hψTm4]?FWp}\}[5h`n>j07?f>4[OƧZ='@EjA[\[7? ND?m\ :ōJ/k]# ޡux ksȀrv\\[so'Ϋ=Oic\-k柩ousqpl~\~" x&'I쯂BmW~O=\Y-cJ\Owo]}>>.-Zx?G𥅮wS՗3gAkjھ?a|m LE晧jums-}~F߽js׃|Kk-Z5q\igGIjxҿ+O#H]Oϯ RωzL׶G i^j qok[C9ɸcOcqitpZ+ǹz,~|CѮi?u}C&?f&n11  V|B+є-_WKMt{+{U״OcJ;[WkajίڏgYj._h:MfӚ:viCreY; 5. d{Jx7kukk|'o}Moq\x)滗glS>;'_Լ1/.7Zu.m=ŵkx; _īӿF3 Ckt~wx~ŸSmiZ=mMݴ$@]ݎo[@.z~9 }fYѭrC+QRMQU#A_\Wz߹X}o_zEZ:z֞"ҵ{kZq˧ g}G_WC}[^&{ңu/-'' )öcP=GO`_?5+|~=9W/< ϫxkvūVwcn}g?Y l 0j;ѥ1}CG}~mgV77ڥmmm.m.. '</t 4}ó~'5Mm'C7V ~^O(?h=LH1G9~է F*㡣ۋ"NIӾpGp?>ۿ>υO_}oƺߞ/8í}eƱ~/ThGy?syF_|6?M E+5/<Λ⇌ w"I)qm}kf>u {\c?LmlCϾ׆0Oz>o{Kk_O^jux+(Ӎq=j(hO%"?Mq@ x?!+/ޫ^Zw]P@P@P@P@P@P@P@=gm\>zh58Pn_V|9|Gi^%ε\jP]8 q1/?Jަ7,hswh|9}*H&| `96u;zS9UN߳Wkx퍏u=F N ^xaeN$_ۖ>EI90zM?<(½{{m_h߲=վis/$7?qvk3y~]_NnZ-|{mu}&𾡢Ai|-τ!rUf7gIl},>'>(k_5/|% y&M~//q~_XlcZ6?XAooo˿+𽿅nl ׼;mAk{{{j3\gg'G/t?xw4-8\,Ե8cp1<ҽO#> _k¾:ҮKF wf:$\[\6ұ?/Sⶻwo>*KPyK:}8\oh'7hOPkPVm~уW<'?=Txß]`'5R|_[}9c[\=]'~w~m hn٭ںYп_ҿRj$|amgvm/FV=[N˽ͷ#8Ϳ9?i?ha&C]c5$7 oqiz&ߵ/uO6[o[R~bş >:[#z5j u ssqoj;;^5xnQ4ڕm%·r $yG9ׇ> ~КOďUO_VǾM#vlC>>w \.mhOtvƱǷEžrq5"v_W>֛O x[Z5_-.f>Vw_|q? xoIԾ=?+$χn-|-GTևAѭ[\g\`hΝ4q#,v P}L=[z߄W3ĶigxN'77=f:u gS/,ahz0i֚os"?*qlNAz'&iW/u SFVMnIԭo 7ۆx >όe J)7謖p{τ'Dtm'Ko]cQEXi_\`=I˥x-qqI]衹ŧ t3GAq; }?T>q Vxj06#GϿj}cgGF7W7Wvuϑu{:L ]y7d>.tnG.#]zV: Z˾tkcsoh Xi_?pӨ8g{[ GOo ]kqoog |C>ϟ#g{c#i`=c߅x m/i1>nAȿƥHg3τ$߆I Yi\>ς[5qassq??1^}kþм=kohZ>,~mh%>@+M<bu+ j!mvΡo<ķgߏmQ(/n>/?7Ww1{jWw+F Fuӵoo"3޿. /ҷ>j f3dX\mzsmo^g mJ5NO>p.5/m>cپo}sτ=?<O^Xrnnܟ\\+H: *M_xZ񍝆46iP79?rnx7>(uKO"v7?hIWƟFu<;ͷ/#KWo}Σoo˿?m/4 7?l C>qk|>'y>*"#|B1x x~-6'PjLj~?~kLg? úφ_!-n>5u< vЭ_s,xsQ~ hoIt-Ү>޵kN[܉ίČ(6rk_޾ߪ_aWč'େ-A|E5GY{msk:I<}Ӟ9|Pk}foƝv{wZV7> 5O\ign}޽{P|}myu |g{ZXSsoj6f5ŵG{[[֗1=SP[_hp󏎟 o(b5l}:܋qoqmqھs¹9Xb0YØ*?xz@ a|'7K OHIv==p|5>tXvMN_wu_G2x;S't?L=3n[jھK_qb0'׈GW7|?dh,Xn.? 7Ӟg8|~x|7KfmVMa@׆t*wefOvpmX-[xZOlNr ž=9pdždC9zߎ UtO\M?t 6gIȀ秧0e__k⿈~+Cmsqo\܏S?88|=k~*h_/_љ sZOi_h:gc 3< )4kirnIn'q8;_1F'bfAhxſؖ_hE75 '[]ú$W>?7?ڀ<~|8É~V@B.pkk$? \~x>_ӿEz ( ( ( ( ( ( (8{?xj/"Zw$5Wmo^g47 POYtW:?735tşM}c ,o+ C?gg_@jC??POYtW:?735tşM}c ,o+ C?gg_@jC??POYtW:?735tşM}c ,o+ C?gg_@jC??POYtW:?735tşM}c ,o+ C?gg_@jC??POYtW:?735tşM}c ,o+ C?gg_@jsh-.-?~mɭEbݿUs} { [07c't ;P?g{kYl/MO?٬- |fO?`2F:f":MwwL񭮭{6]x~:%p\}"X?ՐoT񥮅{iڅͤZu\7g}??zV:O}d0޹kP7xB4B ~:.\>j+'Xڲqx[LX.4ŽD-%P; gũMd+zc7?Wktk@-cnO\8|~2hbNǫ}c.d뿷wXڀ9SƖj6]kip}QXH k og_.M%gJ4]΢#ymt|9EV?_cYi<| Isڔ-c}ds>/jYJݟasegGյj+/XڲƶZAh:\ZIs>/Yk-G<VqzWo5|uUۛtMzc\X=ٵ{?cW[o88TRu]{z7M]tW׹g5q__?x[CW|Ͽ{\~ {?kZ#c_wO5οm\g[\5j +%}Oz3miojp2G~3g|Wӵx<i?i?ٖ-I,/Ε]G⇄`^qk rWϹva|:# XxzNk]_ۙ>-(gn>x>5{n~ZUP@P@P@P@P@P@P@C[?> Ekl8n`ῴ' &ΏN`KU-;DQ@G (8Ěo-Wkv]v(F8^Wx,�PP=vv4yߴ(G?4/n0؏Pz?9f' _iT?C+z.+Я؏R?xQG|?\WlG)iT?C(ޣ>qKg+6#4*^oQ8%W3C_/P ?ϜG@ _M! /C(# q_?x&'0 OnWp4׮bF)B1?@GVx!{ZT1??&?xSޣ>qKW3C_/P ?ϜG@ _M! /C(# q_?x&!EK??PBWb?HK G\W(s?^+ ?Rz.+Я؏R?xQG|?\WlG)O?# ~z9f' +B1k?oGhbtCW+6# /C(??PBWb?HK G\W(s?^+ ?Rz.+Я؏R?xQG|?\WlG)iT?C(ޣ>qKg+6#4*^oQ8%W3Lh&x7%bK+C :qyNixɶ|=l?hr6aOooE_{HǦ^?^G̾1:vŶ[4~q~Ϗ[\}%hHO>v6g j:-5+HCgN iQju^e5xSQ\u kCQ}P1Eٮ>-#]O] Z㻛Mjw:惨έ=?zkz:XI_C~m-t麍Fs/֞<5ZPP<?!ٮ5l}=}ҏȗ\=bO?Jءڶ255X}Īy$soS+g^ի6f4xq.j~V=wPi?n-.G ?m1X>,]O|}{k [}hh7z/4X5qoA c>we?V<1/ۛ}'.5r5\f܎- o۵I[?"д]|xU5F?$㋍4dv'B5x]D-~*?t?%fP'ΚN\,<(~(:n?xA&φ|5\g76AF<-;>!AW ;sLӿFt{.>oP#_kg ?Nk???H7ٿ&hc:(ws:xnt$ rAqp-S3^^{`q|9YrF_W)|7?k^ m.m՞sxz>N#2V<4L'1T 4[:g뻁j}|= ׆n-o>[ o##=Kn9_>a~Tէv8]N| uۭNڑѭ펧&'ZP;Q^x’Z~Y忊αg Pܕ'' Hn(R>rK7PikkWڀ:1oqpΌ.1p.A \ tv)NFXt iu>}P׵}C6h3Z\ہf=|8|׉-.qu=}ǭ Gϒ|9u 4myxt3 γ㒃 }c3X5}5LUE5ϟO_O ~{ZK-;ދyC Vg:v~o=s>-m>LFa⻛xL_~hW?g>ͨ:7shx3SghO h+S}Bͺ}@EL-W O)GZş Ks=׈x;jb|c=>s+oc%h_tojkx&n<umEno}[X\\OD8 [|ue6QWǞ+5ޣ6scAq[܁.G?G_xgozk_34}2MO}h~'x7Ikkt&óq[60q)]OYi6DBŚ#-Q_ qoso]*\]џ7 9O\e_X3tu"Јnw݇UPo_|OR,ua@sgb[ӥx8sKm<bM`I(敧|MuAӋ5羹 oٗ8 cźX>_caok)Wa@P@Cksmӈͫ_DI:bAkii= Ժ=xyЕj_@cK+ǿ(Կ/Rj?4{K J 5/F.cK+ǿ(Կ/RjʆOwU)x^Q]Ŷo-燥?nKoO7߄5 44Jo9-?5[?O`*a~ȿV?koG_/6Eo6z, "[ a~ȿV?koG_/6Eo6z,[/ڻ:;Cڝ}]E?m: +m?~o[`3?e-^^a /j??e-^=6E_GxK }_/`~Z%{lW>` /j>~џoß^v7i/|\Nl/߇mmX E[=E?᰿d_+~#`l/߇mmX E[=E?᰿d_+~#`l/߇mmX E[=E?᰿d_+~#`l/߇mmX E[=E?᰿d_+~#`l/߇mmX E[=E?᰿d_+~#`l/߇mmX E[=E?᰿d_+~#`l/߇mmX E[=E?᰿d_+~#`)|0i2w':l~~n?:FtPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*rzJ?0 q^+43/T#-?n},U?ۯr?loC|7g6vS}g4wX_73>+/c`0QLUnF s)vH??6˒ssK ; \?g Ke4 Lvב_>_?ٲ{`Pl'^A 6#r)񟂼 Z^:f.hw? *M״+[ѵ+{6in>oszXa\yxms5?<-EKS3[}\\QHŷ?n?uAX}B?gm?fk-"_]%t _cEۈ` {Wm4zO% }x>>)Ӯφ.}.l&eԅWM"}>6AP3/o12}ݴz7ٚΗx{JEMV-WS56`uso 7;}ܘA`ruo}%α>ExtOҏL޴`~[d0XN2&~ Ŀ_x/'"V<~&>x-w.5gp&re،cC{NaoO?Rj ѧ或Dn4sintl }cb_5<3~Ϻ~6C/h0l-{g EN2&~5؋ᆽ:FOᏃ2N<qm6"$ q<o>> rc\7Y7~VMjo?Kt[emF]: ._41\@ n?Bb4Ot8Vov^K  k[me>cbWV&eWor.N<[mcEo3[[A{{ ݜ[3nC =Ys?_x_Ҵk=&YQ%ńAOn-XAGfŽm]__k|#_UͶ3@4|Vsmkx<4;;q}Cc.DUtjTއu+XtX[ ?Ub)9P SZ >XKiK_ Aۑ}\y?[ĵX񿄣0} 7w aңpEo.mDql䁧[gߎ,7ڞ_dxJ58V>GytAz4ۈC41Od{X[៉<;i |5,6z]2{{vHso>hOA11X|GEm.ᆇa jY ?Grf[[O|h־Dn$i Ͷ~,&[k[Kkp!oxҤ5|)_ [[0Л? eug^#1?p4RE|M>VtUӯX-ƒmqk<'0 7NX–+.qO_Jx+Cu f6$0g_؛uo$`t0 tη=zysY[H>vV]@m|܌7NBx1,|2;"ong_ #Mӱ0aǐ>k_ wXO,6ERt?>[aoo'ȶ48!sn{Îbq=Ed!ߏf VO[OFm{CEEƝbm1qoUt~ͧ_Eec/|+Y|*<cƘOp-moyp|>61X?/OXZxA?qOw^MNO(uAs>V"?xk?>']O x^x1ciCuGVF OOp?c ?;5[gᕄ|?a xu8:n<-okcY,ea-v;D+}.~ 6AnFcaÏ!p}oֿ<Ht#?o xMt`Yޟ.6v|s]|+_GuMkmwfsҠlSUU5e51\ ť~i&Xza3:[pMoVov^K  k[me>cbS̰?wr~-ޡ:Q;}!kG4k$76iFi4m4 PX lCR:b?Cno^ß ӛL<wCnmΞ`'%Р |`^' z[%׋i Ve,tKyslf#g$ :<NXo=wJݎZW/<^Վ1!:y#cu0W٦# <;W3X<6=Ɵs ?,6`#:x6!л0$V'o 5cm4H`ο6H`n{*?; ._ h>xmni6 lm;N88VYĭQ헷Xt_ h>xmni6 lm;N88QJ^a,ea-v;D+}.~ 6AnFcaÏ!qK[Zc>Zx:v(|ad-=/mM@ 04<υR:T]o,vQ"Ѿ:ܺTWl5 o6OnRic`ϋwwa}*٘u7r, 63of ?NbGknzB9mLNނs)3}KKIi͸9zrebT3 '޲<)=vV]@m|܌7NB%, >XKiK_ Aۑ}\[ĵg+ m#> [vq;r0t;?y x0Y,ea-v;D+}.~ 6AnFcaÏ!p}oֿ ? %`[oۯ t`>q.Zgᕄ|?a xu8:nk_ φVGað}@-kv`v0l8-oka`Y[H>vV]@m|܌7NB%,|~о -ܾO=]ᮡqbD-}_09v?w8.m-=J/[ ݴ~߰MͿuπ=?~8>tPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*r(%QBeu˨{z9d[m:xn4enHMCX Ы<ȗ?;V 1&Qjߐ29F7Qz>Xh+ۿ}{a7:c" HXLʄӵzh{ԾJ{ߣϭZaEɉn=2 "3Bu)-|W91%dgnDq 3Ϋfs'K_s,9eA~4TpkwUS[P޴Cx^=򷝺{|CZPr=`?5ձwWhԏ ڴ_Kd3[ kq!D^,jpWe/a&Ѫ _qK:~?:޿v=/?Ə޿ #x`وys/^v?W9ye?w-f~$\]Jw~Ѩk?i8>=2 ؚUvOV F׷tWu]ϘkݴÌ4_ 6Z_bsoj0ޯ\}10*'t8jֲ]%)r;VU-cY?kYZOѭF0|'_3y.gn+j\?F'?_?ݧWxgß[񭘺?.->cihQ9?fb0!$Vˢ /5M+X ]|K]ŧO0 Ο6aoCA3C"~_uʽt? 繟B/o'{Oe3&"6w#Db_*ϠU/97"5 a֡Nh<|`ZrZ"@`\dt;~>Wh?3[i/k{MnkalF/qo|p?|1Vv47$7h7h8N OS/xvo2Xx>Ú iv~͙D7"IMm_6C zo^?>&|N4ۿ kt k:)H[5.:3X `Ͻ wÉ5>Ծk։5.Pg?9੸eI Þ?|1}c?𠥧o~ |>/x{߉ik_4 Gyh<<r1m5MnzG<<>C|q{HH׮mErh-go>5_sSgľx]ih@tvӶ j33!mك&0ikj>DžtFCQ֛mkJÏ~r;/=:|F'mb==5_xwV&GҡփsGSZO93yON9ïa.GEᣩCr+.dD.n XBLG;{O5|:xĞ/φ?_ bHƖm1s} M 62KnO 2x'g+~6YJftkCpp{| [|EumOIo}* h7:DpAu5=Ǟ۴`1 :?t 4-KG^jlBP֯l ,& MG(>fg43<3[lu+X @ڵݽ-퍯1onf:'lhs GY?fiw])=o~%tqEq5pMr6 y ͖%lb߆_{qxCi`}Cҭ&{UFFU?}<7|61=KDZj֕iXBu `9%w?񭏏"ú7>"8 ym}pF|~}[ w;/4tXϏAikmRq_{ppI` ٘I|}|??wG>P/V|cw&y'Vu_wxohjk}_gVxo\_ |xš[O3mޟ|NZmZy瀩|f)/Ǵu7->(|LZ+Fu/ nx'#N ooo>m`yV *١!ik&Ͳhǀ~^.3?s4> o|Mߌ)oxq}hvӁk]??P Ҟ#a#|;׃/n5/xÚ,zUO`J1~'k|4u&<_ k~2զọ,] )+_b#OS3=Iw=43AyTW1X6f8$p+ }|??wC< {J]n_?Z>qa3Qon p|eW`*xKM֋[udHkh2,mL#v'O1̑S6- UԵK7<[Fum[(\j>Jm(X HGIScBcG^l/fZ}]ۜC%>FyBh_`ѕMUS^S>4 ν)0\>sß<ξ{;> |wNgj~*/?|1C=.I&sҿ@ st'!Uy}^i6\\q{ v_IIaE9]ῴ' &ΏN`KU-;DQ@G (4ZHB*9h}+u_0G \,&⼯V g?"fSO'jgՓ|?Z-k؏?V-j]R:,u2+e9kҡB]CP:ady6nlabO_7FrW7xPyJ8-Ju}!P߰~1P;/^fu/x{[C׵-~o|xqǩȑ3|G/o {mKƞ#`M?K| SlhVj@ZE'Hp8RM N^cv ?S>.K5~ G;iB{\j77hHIu_HQӮ.si?4;:E'4):E?K| Qpio_Rt>Б&tiOke"akO75`wPg $UZX} c?7?m@G½z_|K^H|3yuj x'ʹ'ȸ>m |>2Liap5:^ϗZ+ױoc_eOzυ-bO:#N7SAi4r0-k?>18,0>Kwy_7F-uYy$nΧB'jW><-ao6`um:|[%bӴ[o|yϰpu1 ri7Qm{}p얷j~do[[%[\o]iV0Zξ}֫moiܖE1s7 IVvBXA=n #Sc~[oxB\ź>kgo"Ob6 >fȱ!a.[?c]$ۼM˂%[||C+ hS:ou ?N>bt-1ic-7 F<o8:h4v콾MvK[G`}> ͉'㛛mУLDN`i3@!/EO4}%EKk2CAx =8SKw1m7oks{}?ì@9ź`(M<x.L,5{}KΝ4m-m;`@@8^/ _ .mhw>!?n4͖|Vw[8nAcg@#FDoßkw:dևu m"ܬnl`e)y i?f |O?xᯇBN6ֺ~ll Q4 [ty+O'/>tcWiEY>SD0&ט~@=7 -#vU@m<\ٚv9} ?fO 㖙xHUfGlukA- moslt mP$6{ß |1_|5[>u p-,m4vM'Pke@m4KH7 >ܯpևx6e 6i_싋hɂ 4[_" }F`@݈ _nӬ2Vj&=>M<-\ڙ8N v i;_hZ5%'ssm4D:~`tpHXgہhoe}|?Ϳ؄;}*~ 6A.F;>e}|?Ϳ؄;}*~ 6A.F;>%>V]f?,=ߴKl-ͨȶ?tҢ?C_{WxC^[Ğ[O}>soUcOٴmu?)vm͡-?? 5+%m[c\/v`p0O'Siaπ4+oyX'0 7N$-4o^-zg6"[?P:w8o$`t, p?qMKH>fBongO #ofl?MKH>fBongO #ofl?Kɾ._]:iխmmQi"p&/ |6< M/#à^󧙞Ӳi "ow}ϥh^,KhmS?ض2ZgOKshr(ngj/Ziͅ:߀|7s@zonf[skp| -_<+?íxh ;湵Mu Ym``t| [N}GC[ 3oo& {-X [_ o|'>I`o ݄oݛs G'h CX"7/I| =\3M-ΟX;70`:v8Ǹ/z  1^7ilm>s 6ft 8#BѾxjKN AhntBἑӴ1Ϸ=7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} 7 -#vU@m<\ٚv9} ) /o/k~M<\l[c+yet߇ω7uifW:o?ggdHbO /J(9  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCO~f LO2oW̺5}r??`R!rpEz+=IMh2zw7&{?q?|+?*WН@j4g6|kZO?fwmA7g|.a Gk|ޘnZeh^3 @ub_?f28;$^$ǬQ9kСW{h_c[5W_?ZlRv*} |Oi?^޷zmB[JrΖ\W_ovguZtO`+8f@?ɬ\p}gY,mAxnXno>]&NZƷஃ=WAwj:_/ֿs]9@xWI4{—ׯsΛg J}7j+OW-Oz6mxu+O}{{y9Bz39^gi^i&Ʒctط]>?sYΔ49XnXC$; J.WU5onAwd_I=m~4M_ඹKo~vIŠD0X! BmcJuGF]J-W]VmǗpm?y]2o?k։m7@m?Vf\=.fygN4珋08a k]: tuj^c/bx/o7/#ořsa>F3VrUu]^5_['e+e%YB~_>~w 2"|}[Gؠ%#oor`͂ >\וqCaU~rioC~k%{yG_w},Vgw]{[ǟsAhn~ȰjNDf77O/s`)a E~]리m?pZӶZWZ_33W MzC:UƏ&sa0NDt9>I83OMNc_ ciK񿏾#C-/Pl_칍Ԗ.'tNm඄?* +K7ys Da%pDa 瞿i4|+9OVᧉgc?6֓Ӣ}GO?f@O0yz{U|' ź%xoHM& ǜ! x{>?>;'յ'H4&~ 'k=ǞwiǓ%Če> 8GƍJxZjslOloxEovL%:9\ |~|wcO<5k:NiM9sZOp{<ӭ'K߅#>>YZU[o4]WLmt3¤M Ƀ\Np@1|=A jΓjFk\֓5;lcF:/~|;IkCPu iyٞ2pK);MԬ嶺#.^ 6cyfXa"pglk%i/ Mk¾&vy5 `rD0\|A!= 6}W7RX ѴE/Ɵ\u9x'"ԃooooϛ|^E*\":qfl߇?9]h\fh o>%gkGCӼ+>>}6g'-t!𶃣?ǁuŖ8`-X-< Otk}wN7 ڭ)l8&N pI'@@P@P@P@P@P@}WP>Oo1c\u >u [iӽ!HbO /J(9  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCO~a@t^D0猂L|rH9jk+>#^= ,?ן7j?/B1F$ oXke9ԍ5p{OdKp81~]O漟rU(u#q .7B+~k>R<\\ִ85lr}_R.7%ֵ)^iD1\xS/G5Y}ZЇU}/^7f;}*o?3VD~f>sBcF 4_ 3?ؐa`hش웉߷~%b?(/4}!6Y]?>_oqMS55[6iZ.aoqIhp3*m>7y|7v:'Í;X-<1ͦxOoPhh9H΃RO+Mnڈeo ܋`~Ϧ4>q9p75E|!nn?Ѿmp/迳Z*ސ_ |ixl |g1t5_ ~.m?=ͱ?qOٿᎳ.9tx[kg~D^-@Oc*0>swp&sPe"akO75s/efT$[X klF]GGJ Sf~)|FѴ[}V>Վww[qoq6.< qrg+i-/fݓzz2>[]|wzxwUtI?'[ Vͼ\}0$0+ϼ;rN/ K A6wn\}iuC'{fL|"KGZWҭ 6/9DD8W3s9׌bFOaڢݒ?+9KEc| N| ۬{xsR4j-9syCjY$Y*wA=u{u Fz/ElxO$<^kolYfrsw/ s Y?2uG~ܚڒOZ{ܸ}}{t=F>kţďXMVڇumϜ{q"eo"̓r+籜eμcFJ2~엷i]Z.:>z_"_ߴ, uo^Yα/;\l!#̽s]C ż>m?>"'=Ytiw[X5pCo\f'}5<>xi^}Th:-aq^X3p60OL3`o]Cwh&su<&u,[B 0@$`s ~:x3◁Wx -}XԠ[ ˱$g#  i:έju֐\-;lc2@= t߇~Vi/ 7Z6#2B2OR(|=> i:έju֐\-;lc2@>?f+W,-Gc;FI¾;>"4{m Aa<8ې{uu񧅴Xڞ w B . '#ނ14/Ŭ"DncR[ Xmm}ڈ!|?m}2Zz崋gmy3Ϟ|N t~xO,OK{,6ЂxO'ĝK3AּKQ𖶺 }|'#GL4jqi:VݥZAʺeXni{ <?G_dz牮v?4v|'ӏP;M O%Ѽh4WST{{hL-k ǎ~|IgV5 _I߈ukH.aoڍ1d~ BǟЖ#~ãI]_j=6څ~Opm@>~%[UχC4gǟ ?p5/Ҽ7a^NgKAjk`[_ܐ ?w) $x^/o>#*.ГZ]ͨ2'$}_59k`}kO76Mg_$Yϗg\էA5__{?_ZVM:1CxKر1kx >m8_LWgTd֬Wz 5[\__[̈́wkm},G0%{u [*[=kC?۩ iϑSC 1& eJ4mC\yneѽ+汖˫ ?UgWҝ@\tDM_?Wf _9~E>\j??؏|?X]jּc~D[6K?q͌e}=~=6M}qsĥ2l9 Щ^?W^CW!Mj[#~Çg~:(׼u}^Zwj?>?Ys/M? "jD>_zXJ>@9)u!cIğj?N[ς>|eԼ w|&LziԞݭ&gRyMa`f_xZ7|S=W1w6nu+%Q*A0\ eO>/^1N͇4mb^F.mqpڅ!`QەQp26Fs1?\^߶|,g3sok~ .-Žh-٧_p9~S[闺ֵGҭqDk\koqu9/ "[]j[D\i:}0YA<@g+g0A-/l||t09✖Fb΃#S\[}ۃqmoob 5_;I?>ȿZt@v~.-n>j676f??gWZįZmfK/ $Wvn5sOf4r 4ҽӺMunǺ_n|5)>(i:= :sq:ܰH'wvL]|+b>j^F-{ݭ̿z:f/hms[!qcKA`CnȄے ^> :{[*T?pmݪ~i뱫e/>߳Lj~#ikQ n~({\3CQĜiC3`pzֺtoauՇ՞ǘ_~~<4_ 4|on<+_ GM43%Ճi1C[ ú|g?C' 0njNW{KFw|*[e4D;ා?gh? ?aƝ}kpon^9&f3RúMYF~;赻קm>wgBN >3{]M&Hű-05&=ծGkQy}3:-%3OX*p.7y@|5x.a2h",5}D6[a~bty881ѩOMVPӮm-nѩV'+@ώ~ I񇆵mgI5 #I߇.txkIOqu1 ~#^{'>+_jkzƋM?t›{XT0sל/?|a[YtCHm|7˝8 {yvmy8_HEú|coi-|Cjy`a66_#"9x;3N)x_"5iZzիpZl|{o3 3[ ~cs-%AixW_>./4x|nH 6OH0$0_ϪC׆=Kmi3Cf <|O|#_xvt=;³~a܃o{ qrp_ϪC׆=Kmi3Cf~ .=+ռy qh~OHq 7y: h}90dv?4~ #杮nK[m?OSpLɜO=b>0awP׀'9A<]qj`.fOoonnn.- {U|' ź%xoHM& ǜ! x{>?>;'յ'H4&~ 'k=ǞwiǓ%Čmxoti,}ͭ.i6| maR&.'^s8 ώ~ I񇆵mgI5 #I߇.txkIOqu1 ~#oÍ?:_|H5kVOG'prg8$ ?vfw}.}3Sqyw_\~tm9nm& qO+@ºxS k7Ӭnt"q :n !ݪ||z$=*ςl4mt?f2Ng H 3,|? W7r\Y/7ÏEf_F`2Bb5(|E>1|9Q ϧϟr 0as1 @o΃/ h> ׯ-%Ώai{Ј0q#<]~7=s61u<[qpEB,f\Mt4~ #杮nK[m?OSpLɜOχ9߮2xXYgW>uŖ8`-X-< Otk}wN7 ڭ)l8&N pI'@@P@P@P@P@P@9xBc?ٺȗ\=d3IIaEjs@B.pkk$? \~x>_ӿEz (>=bWm"G>"?(D€ ӧ"^N;6WTtرntɥA?;x_?hsWG_*^^\M b/?WFQ`q,>![FӷQt_}סaeBzZX7ݗ1eMl:Pgz8ז-a(:4_bp4i?^޷z#lRv*~m> _3ʿ'Ai?/g|_/y_ (9a@_i!6gG9fo6o^%z}_}c}_3վV볷Ǫt6mׯ߬&7-r?Zß^_ڶ?v?_^ц)md\`j pTnNn.H4|Jo4i^;L湽Ken"f]Zqy`@9˚4?x$VF4oOX .mΠD&pο=KU]ÿ΃Cq=+}OFm[ BV:m~oŽظg+wO%hf%vMM뮈ʲouk7<W]&n7[76Aqc8p=18-,71rqkͥôu71_}.-W$}jm_J<3ؾo |Oۏ+yl\ β^1%?mjvK۴p-[Yw+3+:Q?o7nqJLsuOl@r|^V fedPu3ײT1iQߋ >{zOkDeɽg[\ ?6ܼ1)dʽ"arj6~ƻjJI?irZHE>a6[jl_]>sH6qȯpNu':U(l;T[^ݧwg)h|~~_>/̱1z9f6:V6҈Ms-c'?2tqg|/^ڃopgY|9֥mc@ !reO_Ҿp6_/­#Gu=V666: .2&=!omw3INL\M԰Am3VhB31ϊ^_84ҭcox[R_@fAm.|1W:x?Hi.A?BšBgo Ao\pH\8~<h_M& T.a-g8|n@>àI'Rl5j|%&[OrI/yAHi'9P|::?,u |mOM[oslnSÑoA@tx[kt]Q1q]ܭ6>Ds >6xPVo-t=BrEo6<>A'2u i:έju֐\-;lc2@>?f+W,-Gc;FI¾;>"4{m Aa<8ې| |K/5{lh>o>#58+PX- ]2c,`S4=Ipz#R2=qDĚIOk;u >(~oxKak՚O_ٖs!ߕMj<܊G/axNR_H<5M ){\cqz@σ?Esr;dt@@|X_-+vu@x$}/&E5-j~Қ>G|5}b~Ѯ|@񦛫R]RGZ60@ic wzwǏ#RXhtM:Rnt>y+>'9pHׂ3x':ޏ7mkh|e/Z 1d#K:m3ûoK¿5ctw3>q>ڄΰ`|o(:_"h*ϭxgS-ʹ =h̾|rc>²?toۥմv>M |O_EQ}~d3A{|y3>Pv;CN3|϶lcLP~%[UχC4gǟ ?zP@P@P@P@P@| xҋfc?٥>W9 :&?Z|9WkGOn\y-HfݏªX,ҌܰtWw%G KiK<究'<ruKoa/byp? 隬?e?XppP@!+qMy=r-NX$gҼ|(k>ka@{~3זھo=OOǖ@:yO_x f=H;^FV,eϐ3~F<@*|Xa'~sV_u/_ >v7g-'k{{q}{YԞpXzq0ٗŞ>ּMC?i kƇj-۶J T}J3D00>-/%j%7ӥ_Aq4[=ֳ P@"~C]lΚHt}JSA@=sF-{ú׊׎i*Rx'n4 >s{{sw/ M²/l/5'7 p~rwCZh#~ayZjShMi:4qDP۔ 5s/__yGy'Y}wjPд[@aš}KGtIچ5-jSApy{WfTr W]vW1=JuNᯇ#aMA5 CH~ϨXӛՌ68rA;bxa[_YVvJ1oߛmed/1xD kĽo  \ZOc~ hpD&ܖ?xt?XJqh`]ԫ޲UuڡfnU],GO]_߳/| ?V<+牢Y~q_n:n?61ҖW޺j6 E޽;mu=t^Rh4?i7ZE-mเG 5jG&ty-q4%)0%ŠxWZo^&-BYJoa5!WO=~ӏ`hWsĞO m'çD;]i) W m&0`4_OG7tKTޑkޛ[L8CA@ |~|wcO<5k:NiM9sZOp{<ӭ'K߅#>>YZU[o4]WLmt3¤M Ƀ\Np@1|=A jΓjFk\֓5;lcF:tͥ ѭ杚 % 7zMr_ >N?!x^=𮽦ZG֑-X؆Y @-%qĝǁ@?Umj:?څڃ[ |<8 x~|Vv]jwVwokkx ?ϳ,0nh35Gψ_YhHwAy򚆰 ".By>B ÌƳ<|+ n}-tkq qzH#pp(ώ~ I񇆵mgI5 #I߇.txkIOqu1 ~#^{'>+_jkzƋM?t›{XT0sל/?|a[YtCHm|7˝8 {yvmy8_H[OΗ ѴE/Ɵ\u9x'"ԃooooϛ|^E*\":qfl߇?9]h\fh o>%gkGCӼ+>>}6g'-vwO:56zuhj&x'7S@<ᯅg;moiXqP2g3>̠'8i98G;\6j~=!;39$/ßxsM]neV6 |뉋,p[[y-4~ #杮nK[m?OSpLɜO=b ( ( ( ( (>rEsu8/_zgؓ Ҋ?P+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>=e?y6z5ڿ_'?e[:)k<Һ(eXu_O@m^UA@_l8S4##`԰zoW_?Ϧ]+@y8ކ[sδh2O+o{UθS0J)?,?~kdw_] ѠzAr?]HUy|Gz?N |FQޢQ^ ͇g}\Z:~O [޺<9gYczf_b?ȓA][̿j5Ƴo Lr8>`V5Я^ۭ"4T{0L/e$ЇUW^7fc/؎hf((c"N ~b>3!,_?Gu&ֿw\qVZƏe5߱k1Gނ} a>$oCҾxo 'ڣkooiy6ms P?9# ࿉!|wwZAo -maϯZm[Y;_}Qi/Wou^[.05g*g'7$y_x\_$fIu~|y?xnx^֯5w:֢~+<mƳӚSmbx%6| uxWWAu?3Ijڂ&Z-nf rao0!"p7/ŮG߇<}aAi4D]iiƱtom*b .>ώ~Yv40 EejD޶e[[- |Fq;$ڟ+}F.>sIF' Z7F.N>m{YvF>kţďXMVڇumϜ{q"eo"̓r+9\1Td'Qn{vݜk1cE~~'X>}t<9Zy\Nn Oz9<!,’UljvV[=# ="<{}VqIthL\y7Q, s9ѻۗ9,WPq?sZMFmI_XI'=\>KT~}bG֬&mC:͋t=i2f9 β^1%?mjvK۴p-[YXý?/ok?:޷G,xgXQeÑd^!rKPr NC:O4wZԭt{PX!.L>Wo࿌ ΧwmZ8Yxú-Y/ΠL]o]Cwh&su<&u,[B 0@$`s ~:x3◁Wx -}XԠ[ ˱$g#  i:έju֐\-;lc2@>?f+W,-Gc;FI¾;>"4{m Aa<8ې~|IԾ#? k kkɦ7ܒt ;}iRnTv_N46KB_>SVnA3[suP&x^(Cmv\jWw+ap`+ -ϷQ>y C5|?=ͼ^/U66K]Pr[9}ϐq 4O]\iemgּ3peO$|F6׃5_ j>GMn-$vU-.8 u3Md_w>7x^>M֝xkQS ";~?_- ^!τvƀ5N-'J5; HxO,OK{,6ЂxO'ĝK3AּKQ𖶺~ r@*|FZ<ߴ|6 x_X_tk7|iTQ7̀FL0{u@ޝg>(6NԿ{6O~gsq }j&π @࿌ ΧwmZ8Yxú-Y/ΠLR G7?΢cpf8W'42ĶqA^sm'ZٿhK ѤmψMfmBXAs?'86y ~?_- ^!τvƀ!?$֗Owju-7 ^}c:b&'/"ڨ|?}=z5W"%y_ kD/mBQn'086aZUZe|:մW9chFO{5 gߢ?{+sy}c5˲Jw_] Qz@P@,U ௜?z睈&e:3 (.&cC375|}cZѢ" q:חZ?-u_?;ͱeiF*Wt}^Zwj?>?Ys/M? "jD>_zXJ>@9)u!cIğj?N[ς>|eԼ w|&LziԞݭ&gRyMa`f_xZ7|S=W1w6nu+%Q*A0\ xo Tcխ{٠ѯ,t 帅n/[Ctsq:[$@|9zƟ^hH𮱨]Oqa0h-is0 S.Eq~|1|@džIeioA:Α[Z] qmk\\j`38[Ec~MuPCxE/Mi}C om;"{9E2n!A_95y-gj^tاEKu`w=.&F4|Sw}Ş"m{//o alL0A9-*i?ľҭnSSȿZt@u:%6!?_os@Bվ6㷇#t]O`Q[Am-p׫攲 U]i7kk3tط]>?sYΔ49XnXC$W; J.WU5onAwd_I=m~4M_ඹKo~vIŠD0X! BmcJuGF]J-W]VmǗpm?y]2o?k։m7@m?Vf\=.fygN4珋08a k]: tuj^c/bx/o7/#ořsa>F3VrUu]^5_['e+e%YB~_>~w 2"|}[Gؠ%#oor`͂ >\וqCaU~rioC~k%{yG_w},Vgw]{[ǟsAhn~ȰjNDf77O/s`)a E~]리m?pZӶZWZ_3!x'O=.CFu^bؖ p@Sľ|? W7r\Y/7ÏEf_F`2Bb=3¾Լ?04Oj;WM{ 1 }y@w¿$?lxv>#_hi>:'NiO4a [hq4?_ z??|[_h7]>B`y< g?|a[YtCHm|7˝8 {yvmy8_H׆-Iϊڬޫqfk>p"hnLu?0#ğxkVt#P4_ rG/yݧ[cN0|({Pm,Ooqo4Y, ԷhYw_ 2u7ŗז?.m4rϨ\o+$< wUmCm%u CQ,,&/xK}A/fx/ c^7RP@{{X. \mm}a`. :g3>𧋮4C[ŷt#> Uï {T!4=&f*  >N?!x^=𮽦ZG֑-X؆Y @-%qĝǁ@Í?:_|H5kVOG'prg8$X>H?vfw}.}3Sqyw_\~tm9nm& qO+@ºxS k7Ӭnt"q :n !ݪ||z$=*ςl4mt?f2Ng H 3,|? W7r\Y/7ÏEf_F`2Bb5(|E>1|9Q ϧϟr 0as1 @o΃/ h> ׯ-%Ώai{Ј0q#|~|wcO<5k:NiM9sZOp{<ӭ'K~i98G;\6j~=!;39$/ßxsM]neV6 |뉋,p[[y-4~ #杮nK[m?OSpLɜO=b ( ( ( ( (>rEsu8/_zgؓ Ҋ?P+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>;Qr+Ym[{C__#%0psf_8_4 Q(سml`sbY0_QTReOMB$E,sz8qW:~C+oZKS'Jz_XX&8kwa7:c" Ha3*[N[?QWkݗN ܱ?HGp~O_+!Xi qok/)K:XYrס^ !ޏFJ^J+{s9#׋qWF [u~K_G6#A8;k˫RMݤ{hMT.('fTm骮Gr(cΝ/6c4^n?f?lG ^#FͶHb t?Oָ1c *!z w1zVDrzT#yk V o6X`e3N9a|?\VrloOeażc\ \|f)JݽWzGG<_N;i_o> kOuΧa[Okw=~)-fgz90/h޿g mg}E _ž4S}ynȸAਫ਼ܜ\߶hG/&|X\t>9>^y IV}h\i~0_op,' ZuXrt)^V4WVڅ!g?2eOt <|uXd\ZEL~'EiFCNo^<)^_ os֓cea g>ټ =ugV9+6xcxܝE{iDžiu8?+?ϑlY⇉.4M?A/wp&sPe"akO75sx+WV Z]#N?aq3o.~|`tDWusk9~m\|\}+Ȳ>iapWKE{9;&։mʷ3>[]|wzxwUtI?'[ Vͼ\}0$0+ϼ;rN/ K A6wn\}iuC'{fL|"KGZWҭ 6/9DD8W3s9׌bFOaڢݒ?+9KEc| N| ۬{xsR4j-9syCjY$Y*wA=u{u Fz/ElxO$<^kolYfrsw/ s Y?2uG~ܚڒOZ{ܸ}}{t=F>kţďXMVڇumϜ{q"eo"̓r+籜eμcFJ2~엷i]Z.:>z_"_ߴ, uo^Yα/;\l!#̽s]C ż>m?>"'=\tCSK`ϕt{Ld'y50v>4Yog:vK=յ Ɵ >h >z {kq.MpdԴ.nn hAbFqhO|R*@4o}[ڔ2 o|_dv3䑌dG<}Ito 7|4ƞ;y xB8w}|'YմCWn7;b9ౚ 3[vmy_@|A3M>}&WfW;F@<)Ey}|'YմCWn7;b9ౚ 3[vmy_@д >$_ WZuiI:}4)M7d*;/^'_x[G[/mp` mJ`xr:(BZ΁/Kmq6;X5+0\ݨ|8NG<}Ito 7|4ƞ;y xB8w}|'YմCWn7;b9ౚ 3[vmy_@?mT_`j> }|'#GL4TP)jqi:VݥZAʺeXni{ <?G_dz牮v?4v|'ӏP;MAMWW~a[{ z\eǭr >$_ WZuiI:}4)M7d*=?\tCSK`ϕt{Ld'y#ᏍOZIh4m@^Mq,qk[S2.4}3ďk+\+M7W𤺥&l2a۬8 !a=^4f}&}M?oaPQuÃ1: DmA?/§*d?O}cw|Oԥ,Yf2{PPAEY+!hh;Qzsq?|T?~GqcA( "i0?Zr u#Mj[X쭓ǑoMy.;0g_G՞CE7o<q]!? Vph!ITy,>"[ T^P@n+-5|[9Z4V"v֟. z 溶lxy)帼O2Cuu 3Rmya^}.=`TÏ\?palF?g2VhC{_oӿ{Ug y~_o> kOuǸiGwR!hłW9yOӨǑOL>$Qw|.[ 4~gL𥶤ooq6./Ok:kN&3}2׺׉z<7CE]@v۩_*Vr=^ x 5ƃ]yq4wCnkS:-_>m(|QFr];O>[B_cYm6Xӧӧ@/_"șwvq_/>#Pxᑷc LCR9b0f`f.k80*Y~ݹ475+q-Z9}47?dX|5q_}y3\F9牰|Yf".VQN-nl-]Nk^ihזZ:jqo}`V:qdo>)|4PO ž#·:m/  䇹B7 |5x.a2h",5}D6[a~bty88?>;'յ'H4&~ 'k=ǞwiǓ%Čt -#CA{//n/KA[;4K<0A! n#$-|7B7{]{Me嶏ይ"[{ 8[J;;:~|;IkCPu iyٞ2pK);MԬ嶺#.^ 6cyfXa"pglk%i/ Mk¾&vy5 `rD0\|A!;gy=WǾ A<7ZGP<=A jΓjFk\֓5;lcF:߇tk}wN7 ڭ)l8&N pI'@@ :i><);P1s5{{{ssqqmppmt=H/<{;_j:Y?`A= 8f98h/n|!~%kI3 Ep?~xផ `Ìc=? 6}W7RX 𭭶&<dϜ\ܑbn3#QqKo&|_4sp]i~Â`Lx|?}6uZΣ<*&,yaol ȶ``P|8sp7ď[/vm.m?qO{a0Bwg&sI< ( ( ( ( ( 5ǖxD"I!>HbO /J+S@ Iw\PG_'^%J ז(@P@!Hu%3ob=%N[a?}Պ:i?9W1F4>뵿\}`tjDJc~O:`X뭟u2)nDG_ݗ~c"O EBJ b;yp>#b j.6'^\C1Ec|F#b JkV(%QBe^ m9d^1[m3:p09.8n9)`0O9*tR^M:y9 x8ہha?$Q2zPPB5ψ|@x@/IzUE%z4U\3莰 X΂3 1/(g'&.OkG ?g'4A" >8j+Ww?|.<}/l߬&7-r?Zß^_ڶ?v?_^ц)md\`j pTnNn.H4*mD,ii4fd EO٭xޟ*捩|GBuF[]Ț6V5R7$xO ~ϜcCc&-/ճMnu{Bq CpC P <9;; i񥾱mZ¶]AbQ[xn?ܳM2  ~2LZ~~sƞ|- }#H- dE֟oqk@f~.8 /ً⭾s/@|}qmDω5 4?aí\ P|.M\AEWnk;(mZ"aBۋz$u77jI>X 3,|[<[ڹ/U/K]+եw֚F蟷,>4h&%Vwc ~kx[% ݝ 8evoݽVWc~t/ڋந4 6]_LVӮq $#ĭ)2]ݢӔIމ73i_gA]3u^iц,. C&[gդӮo&ybo&l)Oۨ2, 3i^ٶޫD޶je[3gC^ԭR׼COCbۨ7u݃Oo?5q5ZZW Y:]=-횷VC0Q/ڃύO<_s}w㨯e>[ë}n}5ۂ\ǁ3+eqU*QOzyu BVSGo3⯊>&xSDZsfdJELnmolm O 8ZpXid*]nΎ!b1|@ɮ|B -OӮ.ê}+k{DA'$=9 W) hsYZi[w{ =cuᆉ'^/ -mjoͧ[\iavcщǐM}&\֮WĽ+*,lIkevz>pʾ!}2FjR\EnWv8湝ER\ 8evoݽVWa}{ѝnQ|F<]s˫uLjKElaO-Ž0$䟗$x38Rr4~Tk۴ST\r=[&:>F?" ?k[ > ~.^"е"Z08Hc03pfcUVt.?%_8oeDլoOўد.'<ӘM`[=?^2zuY])'g(SjQKť{ƼJɇj[YxSK{ BA77͜mmrJ  wz>!խ󅗈;h2Ő,  j׼c[أi{k9u 73[4oq͓i=%%U޽uy<;:7kϑ8[drg!G2N46KB_>SVnA3[suPPx48\G:s/C7٭A+?5 |3Dm-\ki7`ۃlI yCu2²[xV]GNt50gɰ3Yq 4x|immn:}Pf7 ) 뷠H7B55ipzt^o[܂?7+@gI{Za\^_ 6ɖbp=J ||q^j~1{QԴ{汆 Ǖ{`€>p0̀ABk1񇇭Q=A:Л dmo|0>'_,|+%e4:۷Ki_C m|0 @=O׉ƞFcKjzj-5&k{cp.`z X nDu}vv{o70@gtc8yhmƿt_ZFw7kz.hmmmu y\d)kkMz΃׼c[أi{k9u 73[4oq͓i=2a|O񎿦XVKo ˠh)unV/澆6` 3.!zï<-P϶ո[jL6p%0\<9v^& :3xoQΜk{Gh>ukR kB`2N@o࿌ ΧwmZ8Yxú-Y/ΠLoh>(M{>06ǶQY'Ps5A|9 /ed[vum2ka>ϓ`f18A0h::?,u |mOM[oslnSÑoA@@nkj0Ӭs7̽ fnV'58+PX- ]2c,`S4=Ip_ QizcKUjVzkZt[\}pi[/k5(}Eg BhM26id7Oxh~ |zw]xOΆM_fs}NY,ga\Q t0{ï<-P϶ո[jL6p%0\<9v|::?,u |mOM[oslnSÑoA@x?mT_`j> }|'#GL4T?&?J.k,~*EC<}ğ_V9]ῴ' &ΏN`KU-;DQ@G (#%]GV[_96yx\C?*8J0u}n_h:jWs 0jLde`uT_8Q֛3&HoFMpϼۀkʨo׊uΘK tfF?,IU u_bS@4FQiY´eV-޵{=^ҺWQC-ш̿ڗE6G[ηX>־}㸏 J] pxև.XUlO [y[1[.:?WajnѲ _36*~m> _3ʿ'D(aY?q5gGi?/9a@e3K9!=??h /_1G#_ 04Qs3怾/(|qkÈfl9z4{,G>|_.k> ( ( U]ÿ΃C]O֡]Y?Ɩ rcd_}f*@ڎoYXt[Rt%K/`]GVNeZ#?쟯x>Ν iZMB=sqK[u[Nx#3^9p/]IK؏o* ?gG.OT|+N#ex֯=M]LM.l|#s,Vn'FrBc8}>yG8!p>MXZs8_?ݍ֙XAym<^|7F1{# w>^,C\hzMaT(5o? oFMOucq͈|r|`Cd3WjI^FW_ʿc/+?:+k?]ki2N.-+7P. "%g\kͰٖt?$"w݋[T0 68߇ob %N0&7"{p7M܀&ܩ>>qV|6 uɜ0z7?Umj:?څڃ[ |<8mGM53VKɞxn!9cO_^O<_?V-qgM,-nr6}:ngGo?tMN {` 󗃳ooO,w [qx+>}IЭ.t4=n{p~U6jϤ隷 >K{M {s=i0bi 󗃳,~ [ZmŞkm6=9#y^^[kDky[żSZ(Gwo>)|4PO ž#·:m/  䇹B7 |5x.a2h",5}D6[a~bty8|6 uɜ0z7?Umj:?څڃ[ |<8>wUmCm%u CQ,,&/xK}A/fxtk}wN7 ڭ)l8&N pI'@@9xBc?ٺȗ\=d3IIaEjs@B.pkk$? \~x>_ӿEz (>=bWm"G>"?(D€ːH|F#bb C\gky ~۟=ϱ$fW 9i]P_aÔ^j̲\KYMYDC\vPG?_rQۮ<˙4ϭz8a9ְVbC˶b8Nr7e_NJuiX1I JW#SWNmz@Y9{ד׶ĦXvy-=kaA αM4-)ן̿뙺IQsζa۟x /8hT%jL_ FxA+=A€ܟg@P@{~3זھo=OOǖ@:yO_x f> ( ( U]ÿ΃C)˛ANRjvS5Gbh,>4h&%Vwc ~kx[% ݝc<4 rI׷Ov}Z[-]>ηB ꉣ@.em:ZFj60'f rO˒3&o7\ռ'`hڮst4fP-Ʌ?j |_Ew|5͠7{ݝ&F ʍ&/ch b|h+Fx#g<mshzc, C° YD& 0( WC[Qs~/X؞\\-m|kc?q*8kڽC唰{z>,q/>3A}4CEπ@]5O xP^+F :/xzStO jmM_Tҭu368p.>< gەcpuǰelvOKmh-..QI!=+,=|:Ɔ*C0YE|_.?( ( (>swp&sPe"akO75si"!+ὸMGߌ4߳׈ѭW_?/Iw>.MwEծ? xv|?]94 F{gh[q!_r? 7#77@żX5D15x',D}pTr?mtArO9φ_~j|eotτٶ70KnV dg$.9|MsO }i<=]]}';M>𯆵/&MZo}kl/Bo?ziO^;ƻYC#S4y|B} 'i%#pp~x7gz?ßx kgԠZ?0Ӻ+}ێz[|F‚=_^_6'Fvh,x`B@FI[4~:shJ:6| ơ(> 3rG]|E*:8ηzZ~>xšֹx—>D}FD->ݸ3/l},C}c|N6%חw:x^*wc:u ˨hJ\0039s9Ά"C6 u>"#mo/> S5>!X_]CA|K9c'gu%E43uX_[}>H^R5.uͧCi e-!ڄhoy `'"k>ss%7r?|5/s&H7.|/%=3?}[}qf_ uݵzlm K/b~鷟}o^y9ú|coi-|Cjy`a66_#"9x;3N-8sp7ď[/vm.m?qO{a0Bwg&sI< ( ( ( ( ( ( ( ( ( (>rEsu8/_zgؓ Ҋ?P+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>=o{ 8#GZUY5}_ XsAy21K? h\d70!"-?}b}.S\%+|ᙰ+]b1eRi7VYNb &)׬t?M qq_sx8uИi[qjY&gXl\PW]mÒ*_ևOfsqU\Jg_uQŀ yq8q_|Ƶx8k{ omz=c+igi70Oo+m1F ?Dxu ~#(9Ե*hϭ{WGaq>Q{W> G_{ _7i0_Q)hϭ}hGdڷ/?T7 9?[Vj?|??Oup'AO5ۀ2EoGk: Wy0}"~\xHԴ[mFD[[ @|A .IrG[3%'(SM'eFME5Eɧ)hսoC4g "ӿjZDž4=g&_hK/uXR\ r@1| hWTZ؊ͻ+[Kg?ooᯊQ4/&7}֛ m. (q ,͓ǡ5ך's ku~tMtd,e榅Q|F<]s˫uLjKElaO-Ž0$䟗$pV IwIQnMQriZ$oDпџ7k '.,]cL:ŋz&Cqy؞[NDvr*xwX,%|U\>kQ]+4|i5t?ѝG?h7Դi>$V%3%!?$ ggy>+FꋵnZk8*-QK]ɮ_=⏊|QxžxMא~9mDD 93P!9bGY_CviAR?_3<9}_CkkF֧gxHE6FZr 0qY,q@=bf|5[v-޶g7CO&eܘ_O?h9SA^*OGIZ=a`bF?j|f' f:g>6xs1k֍gO2$0mn+ Ar` X=S֬k;{v8l p>쳪b98|gtMakJxj[['vB<о|IԾ#? k kkɦ7ܒt ;}iRnTv_N46KB_>SVnA3[suP~%[UχC4gǟ ?zP@P@P@P@P@P@P@P@P@P@P@9xBc?ٺȗ\=d3IIaEjs@B.pkk$? \~x>_ӿEz (>=bWm"G>"?(D€%ib U>WPWNd%I)?Ҽ sED~ƒJ}o3rF ep3v/wU"bku#yuX᥻l [ Q}dyICPF׶5z`|@7OzRTX ( (>f-;G|{H,ʁu&ֿw^A}Q@P@P@ 5s/__yGG-. $js7^͂76wퟳ>;ԭuH-S spnm>͋UY_1ռ/O?=[_=gV-4 ay Υl` 8 }wxLel[Ɗ]8`JUo 5w]O֡]Y?Ɩ rcd_}f*@6nԝ boCRK+FQըf[/׹_O[YЦ)j|1maL>YhjMiV6cr`V*-fQ?qydqy2%ޘwFeͭx)]aWtvOO \ n<+=< 6oqe=n%w 'cFu+u1q%E5iKWsO]?GvӾm+ Kxw Ϩ@kl& `2ҾO2 `p bu^k;TFo^g+tCO~G%ǂd6 oχVu/npDu@Æ Á[q'KKRP\hm78|?ե}>}_v+|1 no5ht _i,xo"o&kuuiGK-?( x,t]OGsm|7= \OٺwEoq_{|5x.a2h",5}D6[a~bty89 ~~9k?s^xTҡjxF0O\r6İnx,t]OGsm|7= \OٺwEoq_zwl-OJ7aX ŇRɘ[m[qt Ĝ&h99~t_ m ռC[kga1qKLAi&a`XYw_ 2u7ŗז?.m4rϨ\o+$< wUmCm%u CQ,,&/xK}A/fxtk}wN7 ڭ)l8&N pI'@@P@P@P@P@P@P@P@P@P@P@P^0(vn<%?OY C_QZtPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*rzJ?2V7<[Ñk sʴhIDVp[)=ku\?s5*ҍ퓱>T'P_шY%wө3 / v;/W 0%j /߫|pu,TMZ+ѮfфG{Ya?q__% ְ>lNy^:!~_%g͢*K(9&P{ BtS42pÕ9,? $7S[cce1)WuFJ6׃\ψp'ְwZ%d{)g?W;7ȳzsTas/fP<3+lEqKauʝ|E(_-cN.&Y]m 7}k= =UR\ ( (o{_oӿ{W y~_o> kOuP@P@P@9 wW9~(|2U9;/VcT7z}ͽ.~i~Ў@  4{|Wx~o|j>*t\|663{<-/ϐTOWGxW-{ZѬY$s хa܈.LA6a P뚜ZNjwiy,yoqw10[l$83k,|!xo\?Nj:UQjAh9I$@t|{|6vj3xsH]Aa=13cq4wڇ)b~%[UχC4gǟ ?zP@P@P@P@P@P@P@P@P@P@P@P@P@P^0(vn<%?OY C_QZtPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*r57m>_iFw_^)h*(^&qc[3r?cc*1b+> 7:r_ڟNc ^#bmCew'oUT2wcCi+If070ێq^NpX1MP\m)[w>uPgT]0 v[ m3zNv 9i]P_aÔ^jѽ61My8yyG"!/z_=BwZgkj^оg(rk>&{z(-K:C/^?U,l{PhߙՌS( ( ;kj r\ܶ,F~n2uz~Đ,0eZwj^4e s.ie}ɼ'<]şͧP@P@P@9 wW9~(|2U9:D֩k:%ŔEื{8=Jc?8{Yޯ>ơcmb\}>G?ڀ>ˏ|q׈5Q7o>c?QAtŨkW6>Y`߇D:L>l܏[~P@'ß: Y~$躞7^0n{Y(&{y ?tv㧞g>=og\?^=o<< a9Hm (ͽ]Qm ߈M ~{q|X i٠YHbO /J+S@ Iw\PG_'^%J ז(@P@!Hu%3ob=%N[a?WG&PY 2Jq^ 5u0B-#ŲE/5a-]y 0?+*\?W:~'OPmNvrkicKGʎh~'>oN2+W>qY9_b3Rmyra^}.S\ Мiu?&adk`fX2Gdr:՗gОfy9{דNgY!efbuZ†Äh{k:B ( ;kj r\ܶ,ֽ1_b Y;WpSx€>|c7G~q'Æ?_?cpo~_o> kOu}Q@P@P@ 5s/__ymF5K{AcwϨ[}\\𭷈Ʃoq(,n {[{\ q}Ǿ.Ԧt\J-y˼Ÿ? +Ux3+:Q?o7nqJLsuOl@r|^WږaI*VJ];+PO]{-Lb0,h_]Q4h:l>\xHԴ[mFD[[ @|A .IrFU38Rr4~Tk۴ST\r=[&џ7'ėj$F}c@tU P0D'ta@9'Vc(QvVg%E:k|<"/*|sQ i%GoxN<|A8zy~uOuZܾ_E"kx~ǿ:Γ.]ֵ+k.m ,zǓgm-"\xV}^gOtٸc3( ~Ƕw׃u {^xcY<f\]krK~ N]#KחwFo&b }xDɘ0pmyKHWi^6x_W-ann O}sG\ }|'#GL4TP@P@P@P@P@P@P@P@P@P@P@P^0(vn<%?OY C_QZtPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*rzJ?0:_ tNyVue\UG_#Pi(g<<0`1Uo9S ( (H}&c0LZ~z5^_:>%%w+u'_& 5ՏY_M%Zj$m)x`0ViRUX zNچ#ܗ$-#v W/l x׽C(N5w( 0˷>w=?~Sbs\]_?O^sZ٪S:yO_x?O( ( (>swp&sPe"akO75su SPtK)-ﳏqoq.p{^w^$5SQÚ3mmqc=(?e7_ ZMfuڇoWe}1~̾%'[xm;Zmuj:AMOբ|u<< Fxk(fybBZN-".][A{=r#HҴ|:hr ģ6Mm5\`9cxfUuy){ ؟mA\tx߮t0-oo]+A?[ |k7ӓOмl_X lm縹y{@">m} )̲1 b3rs{~hCDNf O_&x3į ?u& \XlmћI&lvr"d\3RsZNivt'7w}O>!x'O=.CFu^bؖ p@S~~ڟ;{[OzggҮ,u0Ěnugܣ0 <~u 7|/~E|?[ikAko3[ ؍~ >k_oZσ$>>yo 0I1_L5>H/|gx{S4F|)qڛ['kk,`}ŁCxᆙǞ$𿊼%6>7>kx<\r@\CkY~jxpDoO }鵸8=px$88xv?~$Zo×:?>;'յ'H4&~ 'k=ǞwiǓ%ČRYw_ 2u7ŗז?.m4rϨ\o+$< i98G;\6j~=!;39$zP@P@P@P@P@P@P@P@P@P@P@?&?J.k,~*EC<}ğ_V9]ῴ' &ΏN`KU-;DQ@G ( kOu}Q@P@P@ 5s/__ymF5K{AcwϨ[}\\/<7cO+-Vsooiia-\˽{엨=v0çvQo ϟ>]&oai\{?}^?n+?FgO<ٷHHn!o";."ѣgt[WMb~3p<Uc{Y_ki qq9'[{p 9>s/Q+ Գ IUU:ZzlU Fz/-:ڮu]3N Ca'k\b&T#}GMn-$vγ`N+(_WhJi?ho' VדEs<ߠZ?eN_M_0b^}vS'xcSMnaHۈN~V]fi"za~iXnOڎ%Ye}υt<_ڋ(><Dž5./+pnmt+15(bKwem7| Mm-_C7 ϊ Ca(z_=FWAV,En:'C? :tkx'y26CPv[[cp8,3AbKk:Γ.]ֵ+k.m ,zy?6x^mf/iZ|׍k^/nf{Kyw@[훈32?珴x[hiۣZRN@ !đq?flAp b@|{+|Es-kKۥ6 ͸e8Pi'42ĶqA^sm'Z|IԾ#? k kkɦ7ܒt ;}iRnTv|k; Ox_I඀ z@M|PfGMžVOC,}Ͱkl-WP `a࿌ ΧwmZ8Yxú-Y/ΠL{e|KՇƫzx6v6t7o׬#3#p"g ;:B6e>x|immn:}Pf7 ) 뷠RHӮonmVZcla@"h*ϭxgS-ʹ =hӨ ( ( ( (>rEsu8/_zgؓ Ҋ?P+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>;QP@P@p:@:xRqC? Wn1WCnV(aaq0 ( (nBn'GS_qcCk]v+E俁bVoT򡅈6~'<*סl |?D?4}\7%{rR`0Cedg # o=z?濤jYmM?Lt> ( ( U]ÿ΃C-|M/ TZ6>Ѫ6M @ggىg7 G3*yT~nN>T'hoۭJGa[4}e/>߳Lj~#ikQ n~({\3C_ĜiC3`pzֺtoauXz }Yy>q`H'rYF؈t'P>~-|ߜ?r}^$5X&b(+WNƻ%PuʚѻMv?eWu|W ?Ö:d\[-Vn&3]EKs3:\m̰ $Ӿ^ݷ.*_ô{x㶿⿊zII~Na簄-43F8g[0`(ex~d߶U~;+hM;;8oسRӾ W~[|-x5 fY5`~`'.W' xYx׺/~._|)ztiًin9/ 'IjEZ6-UBn?mN"c~vplnBN8uWmgkkwr-ޚ:y^^[kDky[żSZ(GwxO :6k_oZσ$>>yo 0I1_L9߈_ߊz|S.Mc6zk{ YOڌymBr[ @gǯK/ZҮ-&FL~as-y R >mB~Ț~-?~|.߁IoorL#;bOTzuB޷+R[k;Dh =:~Cp~g/xǾ״^k^[h%[+>s3(𯆵/&MZo}kl/Bo?z73MGMo/ _x÷0}N?i} ~({Pm,Ooqo4Y, Էh!P_ߊּmLx퇞4#h$}7_':Y< }y]LSowe-{`n'!T lMh.ƔnR_ C v=MZ͌XN95RU+b-z*.SGnhJo?okvgu;qOg|(- '21 a]>F]SƾsF M^/Bփ=gF2B t2.8xVyOç?G0{=mߵ?RLJ|>vYMo=#RIwJAA{V3p?PQm_==wQ2ʅJݴE¯ .'~xg@-~q>[XK=_( }^"EUzi |xf;il$-l@g=<;ῳo#Sa_([Ӿ}W𶡪[Da h 젏#Λ<\\x9*a[E;?r'W%1h-qo;/3IO~#ǂ>4jSǬxU,tb|;c|,mK}[jea.ՉWG/_5 gƉ࿄2kk{/m/]s.4.Wl o4`k5χW6=~%x_7>mݼ2 UM6iÏ۠v=Wץ^X-6JJÿ 隍u>r/y$AE{Dž/m>xoڤy q6֓4=aPH8Yw_ 2u7ŗז?.m4rϨ\o+$< ??NuM#2k6svdѯ0-w q"adq㵏~*?>=5e|xBC4 Wӵ_OsZ1 ͑?@i-YAkZMƑ}kMwo9"ks P'χZֽ <gZ)(~|$)TѼởxVIO 2c`?cs.nHl1q\ϑ|#XK_X3XM_ͨ5H^Ft3[5k/4|φ9z|/n|!~%kI3 Ez]P@P@P@P@P^0(vn<%?OY C_QZtPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*rʛyW?e_V9IEa]42jpő=e#p ,&%-\ qf7wMٿ9V@ֿhsAJ٘xQzs{JoeĈP㟯ֺ!:(gAy+ԏ-ܴBH:N+|6KS4Z?o4sw~f_WPAA@P@40901Ss֌Vdw{x֟&/b<_}YI^j?%cfRcoHug6&rXf_fqj IKݾm73ni7ufr,_cF6z߱Wswp&sPe"akO75sv^𭷈Ʃoq(,n {[{\ > n>u 9?hQ{|Ҁ>Sm@P@|oo_XY>[]Eu&(N3c#xw>7NQש1WgNW4lwٞ~ Vž3xH!5W͚(U Gn8 q_/esE.m&Vv>=S⧇|%3Ioq,VTpV䟳Iq>s|22> ?87JW[x'nw#Ǟ<3yhpڍ徳m(KV&j*r51؇mvV?C36.Ctt= J\kͥ֯7_i'PUװIi[CM2NOj<&>Uy UPy Gg_xw+v]'t)Fj5wk57xjAmomWW9y3(yAʟv z?oU/yFs{è9Q~m O@u?h|l} b׵ZLe"Ha0Vk=Ȃaf{泬>ukR kB`2N@oJ,!wwׄumAlmf6X2L,F'9ߴC|oz>r FֺƗ\{0᱁U:NכYpjZV5iZׅ{ ۫k|{q=;f̠c'O]9Ov_/^_iܙ3-C&`y€sz_A=[^<&|QC÷z6NbmE xgm-"\xV}^gOtٸc3( <D:sXI",<55ͲOQ-o 3fC|Vu֗@/-:[ѦxWQMפ0\onf$x$r0xŞ*|eKLIǶ{|3ͭX(ԋ'իe@ï<-P϶ո[jL6p%0\<9v׼c[أi{k9u 73[4oq͓i=\tCSK`ϕt{Ld'y់^f #zlj6<_)ҮP @.;P< G"t4' e?k.`ʜ93 O?/x΅t5=CMʁ2~[{~з6iǟj|$|F6׃5_ j>GMn-$vpu-[_AAxyݷZH? <{߇z熭Oq}>[{}&Qo oYNG$g xv?$?ZNixow:sc5 pgF tSмMa Cu.fޣ9 e@7uk5Ģw$:PR>⇀ /RMjSk+I [\[ ŸU}EcMe;;~_z?;2xc]Rl-6䇶kf! >lr=+`a~_3o]Cwh&su<&u,[B 0@$`q3k,|!xo\?Nj:UQjAh9I$@tN46KB_>SVnA3[suPCt&gk~uWLcgY ȹP fpn<`PEj_|P=W_ۍTmei465k{k|8 AϱȬ}鬲üGgoG^ ;o Z'5i.nr3@ï<-P϶ո[jL6p%0\<9v'߁|-xrB.5oU?U4@1֌F"1s O|o[ -s:'u}Zvd7q vy#{W/xmzjGoqzW_VkQhz>^׾+4Qvgv#0nt $m,=~Bl?տsю/2/y"h|Gq<AM^9;W _o᤾q6 NL3Ͻm4|uGX[G;ï~m&6u~8q ׯ(gxt#_^X7_V{a@M 3Ns 2~}0}\upg/h?r!uɁ?a_RWl7%m?Akï8~8^/f?ZZ|}>ՒV,Si8i[]X )?_(+B͉/6Ak5aDʮI#[|1z^2j_57 *UtLjfA,}ɼ'<]giEP@P@Pzt _?s!<=ujΉ{wqe5}q.-?cҀ.w~ޥcAn5]:GK71]%Wқj@ ( 'O|F~#xnmWƉgFb -a ߜ351ԼӋr)VK ݟYWWﵭo6p-k~]t^-/G~+OeM2T E,]#;|I_X>(K1Mh0yL |##s ו}(h;fwbr.`|ͺ~d^wO<+K7ys Da%pDa 瞿i5쟚τ kM91ѩOMVPӮm-nѩV'+@c/7uX(<&vkz ƟqlgP'8pG{N@:|}YB hS77 3_w n1I9,>H/|gx{S4F|)qڛ['kk,`}Ł#_Qk|+Yd7Чѯ-aRf\܉&+:P-7/6G⍅u=w: 6o.}4uCt7Źto2?wzϥ\YX a47T2$oF`x@; a?gx*𖏠{Ovm1s sC|-/o1O:E݅O lvP1: 9' ow+?E|4@~f\Oqsq5NiO1 g?Umj:?څڃ[ |<8O kR+\dx651}{xx@Gcas8O &Q{s Hiд˛HҧBYnyS@-C.%k˭yGЙtmN?!x^=𮽦ZG֑-X؆Y @-%qĝǁ@'Qx?߉IxMf{.Lú5&n;[$\L2w 1@vO^?_GǺfAf>v o S6'h>6^k>(4mkI/|ɮ#tBMnv 9S׼'kB0|`=x3oQO_]^^Ѯ,r}~S3s4h kxO^'K}hn.-7P\j>y'NOdmO_^O<_?V-qgM,-nr6}:} @o|;&,麵|ċ llz1R5[5^o_I:|9Ni²Y-(lz`{VW;~B}¿^.!cx_CۗssqH"n|54h7T kR+\d'1o~77j_ \v3SF(cqAPkmZ𯆵/&MZo}kl/Bo?zq> V\ל-} O^Ɲm}$<qú|coi-|Cjy`a66_#"9x;3N=QtnLլ ag/>Nx#=<ᗁ|S>վj }Yvh ko۰\M{17lj)K$zna>;@q"4[ qTh W?xH_Mv⦗7:u<@m+},D:c5ΰNa!,>g7Cྩ\5=\! 6 ɟP[h-f;v8(Ѷjxaׯ>𯆵/&MZo}kl/Bo?zǐy>0}?|;y D<6o`GmXz?Umj:?څڃ[ |<8|=phi%/n4ءVo?w:7r3$hҍoaj?o*iwo{#XiQsDҷ>L``c3X,?SaK/h<MOA4iG4=jMFkg c7َ(~ 4m3um<+K7ys Da%pDa 瞿i5a> Ɲ/ zivi[qooמӵstr^8/_zgؓ Ҋ?P+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>?U4@#IOۿ+qYP!}QIn["$ ?=q,Fy;G |?W:?!l7aC*<3u=c?ˋbMd4?{aOswp&sPe"akO75sv^𭷈Ʃoq(,n {[{\ '&z:V=#?7ڀ=.\M~P@nkj0Ӭs7̽ fnV;*<8|+/qj 2qa5M>Q gˆG -[}6o Sb..iuoﭳ<9Ll|{OŮKÞ*fX/t E?f2|~eK1z;ne|lqn{ k-߰k_ONž!G<1xfD׵}gPw= >M3T60j(cm|~^gl.]]׮${W*ݴכKk=5_oßNa aծPfʚd`yM|,7$\4 >ֿשي?9W_+'FNZRwk״j>3&o7\ռ'`hڮst4fP-Ʌ?jρ<h?x>$_ jh:>7gIQrIA$~ ў\ůkZ5>;D.a07{Ƀ&!cgY|9֥mc@ !reO_Ҁ<Y}C+{',u!ڂtmMeXO?!-0 s? i<q|3gu/?`6&auc-#u~-=3< 6iiԴ>kҵ V3={ -vAOƺs_+5 }m3g[p3'L6ڃzx# fxM<'[T:o4m,/ŶۜI(kͬZE5-+Okյ io=n uqfP@*x?ßuo:4EXxkZk;e'?f [ge$N.__jZuM𮣢H`I1𖙥ÏlRgUZQp7 su5jO4 Vy;^'_x[G[/mp` mJ`xr:( xF8s+9Bnfh1O'!{@@@7' &MKOyL&X +`! HƧ./u xnO4;AC{@LSq뚜ZNjwiy,yoqw10[l$8? |~mO'umvkA2OWNn>= [A>}duu񧅴Xڞ w B . '#ނ<&-|5Iͬ?)?g|-)( Y\fp`KSx/xJmSKP S0y2a: x|immn:}Pf7 ) 뷠  |K/5{lh>o>#*( ( ( ( ( ( (>@IxsSj|֍}:* cn#HOzHbO /J(9  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCOaX2.gXH?@ oοuUie"{}hPkoosFu|{W+**LsohE5 ۱묕*+4hȼ68H{K۩|}n+8)1?'F|_. ( ( (=WAwj:_/ֿs]9_5 gDȾ8qG@$j>΋kx^CվϷOv|5|e񶥛\}>-㹠t3[5k/4|φ9ze_O5ojiz,B oxo0PzW ,aܱ˹&sf_oFq:/#ÿm[Gn[Ky呏 @p~zT2F l6'k_xE<0+kj6ҊI[Z^ hCšyi{edn~Y['{ ^NPg,6KPt%%_Լ0;ak'&7Jj1Gog$/jtFᥘt&F[EI>qxΆWWʾ4zyY;19~qa hft2I}_e/;NnО֥WɢxPm"oMmU_XONg~߆5ߎZ&מ7?4, ܁;M,'9s^ =ĝS&_ k>oo!n[t^G?|hԧXŦkX6vgXΖ[ȷh]ӫ1kǏx:Zom;B=O3 \D#=?' ?>EO >!Kn4}F)[`k$t$?ώ]3<=#hlmMŭVj[Ox0> bு^(F>|FΕ2O Sזp)3 nDq(UFNCODžNOվko:塺Sl܀y7~ڟ;{[OzggҮ,u0Ěnugܣ0 <~u 0 3gt'"'m|6V;(DLC Q7¿^;s퟈aX [ ?Bn] 'S4όX姘u_*6ZP5nmBmAGDrvg'|5x.a2h",5}D6[a~bty8=< ,ӼQ"IZk^5w$')k!(͇/ 8 _suj5ƇZLA"<|&.!xz[BwIw\i:?o+l3ymHHӁ_u$ؾwUmCm%u CQ,,&/xK}A/fxcxkBo.o4="vJ1 \~{x=gnOY=MxW. mBeŷlj<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCObvڳbr{J2M~Sp*w>![]sE-4XJZ]lSopz|>j7jI #?8 mgBxwb5f5^cNy5pAʑ_W_;&YUE5^Pµ׼2 F|c|Ɇ[0~Z>#?lw.RWef^_WٟDgazyXa7kb#B}x$UގEk1o/'\g#W042?BYE7xGZzh y{XPbVpka?ի⥹q!= ˸~,\_AaˇQ k_Gs>4!qϑ_s^};/y_X9+4[$׫?հDcE]J"sJކ#܇$-}g{x~>bshy._G/Yw[}cO?~2LG>|_.3 ( ( (=WAwj:_/ֿs]9e xj"OPEุz/?2A%淀YoJѸ"~?>Eg#On.ϑjo4k4nPl~hZliB ` {7VQC/Y9:MGJ]NYCڶ7s ?}^?n+?FgO<ٷHHn!o",/6wImE{Z-Jqyj#KMw\΍h.i< ،^. w֖:-4:ӬmwZ_סx%)↗=a6k{ogjͤu 6mH '*G#!":~?_- ^!τvƀ= ( ( ( ( ( ( ( ( ( ( ( ( ( (.sg_m>j<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCOM0P,yz^~?)XTHkpkʎU˚#Ok9ʦfqkf?#s~E{_^s`Ѿ{dbn4^Ta3q&#N|zq)_GWv(e(L!+סN[GK7_jK\n =8bP_y%i+y]_5,K,[O3(Pt0MB)EY"*҄,Dzw7p8kzz[~TL#(4<</|s5-{e W/Ϧ/&; o&?_cVSAc_#&_$Wo_AB|Gin\Z9U3/lL 0X}f7Ԟ ?c^ZwjƏe?{.[ςZ~4:TP@P@P@|.M\AEWnk;Z藷wSX[g]9H>([Y=?ͫs쥮\x㏎A%7z-ի-[-|SO|}-[1Am-[[Mx`IW־4⬧2ʰ9Lpڼ{&q_۶H_~j|eotτٶ70KnV dg$.9|MsO }i<=]]}/Xv{_z^4'g_>Q[} q/iDgoI0q]|F?kT}YU6Wڬeeu+ ~|7B7{]{Me嶏ይ"[{ 8[J;;;tk}wN7 ڭ)l8&N pI'@@P@P@P@P@P@P@P@P@P@P@P@P@P@P^йW/f?65|{Uuã+tPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*r꿦( ( (qۘ)?|a+ G=uPsh7Jgo64jOiu&}@f1#g ;]x+ 5q6t_Zr€ ҷsk`+~#1JEz͂ A1uK+V!=Bg⽼?Tf~t{9x!#&NPp8+ѭZdַMJƺƶ~FW} gpP@uN_l5:w}1C:yO_xƏS( ( (_;I?>ȿZt@|+m1[x >}B?gmׂukե4W6J?cP~#x8 >@[/>y~Lr.8q=*MTXҹxBHkgP J:yO}@&ЂD-Y߇o)a{nlN"*J]ݣfwtqEi9.*8z?=GF>kţďXMVڇumϜ{q"eo"̓r+pNu':U(l;T[^ݧwg)h|~~_>/̱1z9f6:V6҈Ms-c'?2tqg|/^ڃopp xF8s+9Bnfh1O'!{@.i7ޱéC{QK[n4}JPڶ6.Ln@TLH0*G[#>7 _[ jcOom } q!s`;>ݏ>֓F7^αXi-Qo>#P'&om-Y/ 6A4$HyD7$P5}z@- 屒X(">ϳ͑pHyg P@2|0>'_,|+%e4:۷Ki_C m|0 @=g?ĿjWf9:g[ /{xmB՛H_m\so}BOT0GCrEw:_ӿEz (>=bWm"G>"??` ( ( mjbq9ZZ9U3?l9mO^,W!}CaV *NM ~_se|[EYc[oE{ {I%ѮgWI>5ZVO~P= (=-זڿktb?u&ֿw_ΧP@P@P@9 wW9~(|2U9:D֩k:%ŔEื{8=JK&ce P/ơ}o[[_}i?OvfW_gůݬ}5m&+ 6slI9&8㞜UC*߽13/O?=[_=gV-4 ay Υl` 8 }wxLel[Ɗ]8`JUo 5wً&[\%|;\XR}{,|o@ۆ!6åc%z840.UYlP³mvvlqc~ x~Vh>#>  \ihvpF@8#x8牰|Yf".VQN-nl-]|ɩ~֥WɢxPm"oMmU_X~(|E>1|9Q ϧϟr 0as1 @{U|' ź%xoHM& ǜ! x{>?>;'յ'H4&~ 'k=ǞwiǓ%Ču4~ #杮nK[m?OSpLɜO<w_Þ=NxkXi g3xk>!<,n`Ar[p>>xg tm'z]i= oya[BW)?xhχ?|gozhv-Mb\yoC8ɜp2k\@<_qKo&|_4sp]i~Â`Lx xþ"uGľ}zwg\OϿ09 xKX z( XFm {Ym?pD͌G#e_O5ojiz,B oj<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCOM0P@P@yR:9?X,}gwarxd{aڽZYlC&XL>J[P@t#?d3Lqȇ> jό >'/ MwMIף_z3e ,b:/~90€ (?c^ZwjƏe?{.[ςZ~4:TP@P@P@|.M\AEWnk;#[oRPX36h<o@ j6m/o[?m|pa[Y]:ҭ :x^Ԡiھ[0y9Hu袀= ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<Mw?_ߜ 9~1~OX+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>~}W??I#UO+j<7B߾gб<)>gq_* z<׭kmz.g7:lA8#LvXej4tZI$ӎ.cYJ@:B1_`\?pzSBZ ( ( (GM'5;MNL?_18|*+t53&֬.-$';?LW\%bO[s]/%Z.3˫,F7kmߩ_twP{[-;G~G=-M??O( ( (>swp&sPe"akO75su SPtK)-ﳏqoq.p{^[hz޳iȸghGGI?b* Pܟ5/LОn5;n̟fӦ 9[-¯E*P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@׻.zl>Uُ͸_Ǖs}}]ῴ' &ΏN`KU-;DQ@G (4/ ΁rLG>|_. ( ( (=WAwj:_/ֿs]9e xj"OPEุzoVs'ÛmOi78IH?Q߲E?_j.mצ}6P}rZֵg^ϣYkg\5eVcWsƺg5?"lgwCZwXn 6 m\ygB;_ k??Kk#PVۓ1]Fxw<"|o8PKߴ|6 x_X_tk7|iTQ7̀FL0{u@ޝg>(6NԿ{6O~gsq }j&π @}F0Ҵ_VO`<N#ju{m}[Wp~>)񿈬=wzoelr`8i snͽ6xu/Zf-GZiŴ$>gx&2sǃ?Esr;dt@@P@P@P@P@P@P@P@P@P@P@P@P@P^йW/f?65|{Uuã+tPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*rj? mUbψ$/NkƔ+q[N?WER+;UojF&}Կ^QO/!_UV5:x"Gfhߧݽ94 ( ( (&4>(kelO"5! {{qF͉Q/;mWL>] W] 7xێG.T?$}ɼ'<]EP@P@Pzt _?s!<=ujΉ{wqe5}q.-?cҀ.#N>|7ϠqXXge-r|u A-tFamM[eҚ;]jHFdPkx#K&Qӌi~AYFǑi|2|*,qo-a#vH0_Qk|+Yd7Чѯ-aRf\܉&+:P; OC~O~%<)xFR|#smoac5iQ16 ۈNK}ah_TIeS{ZU߅h"O~.e<ܑajAg;Xj<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCO{)xrӯϚO ~0X6+\6%W.ͷVyc7ȣ"9eXfS،5 mJ&zse4Kx/mX0Z3%pbjђҥVw/jsJRYjSK=0 ( ( (i(b(WyTQ]QK#ǯxts&M&(sfBC*O$ ?xPrJ/6ˏc70\ ( ( (=WAwj:_/ֿs]9e xj"OPEุzM/ú 5(澸4-"4졣\xcln}*MtըS@szγsKuJG// xB18x֙C&յ{fu;H -5k@a[L6 <0O?g(l6ͥ^+RҴJּ/^[[ۉ0Y7 feM/ý\h?zv5sMQ@|eH|g?{>6VwZtAGOhIOOӎsЊ?j[jc$jQ@E}g[#ϛ"o  ?j[jc$jQ@E}g[#ϛ"o :sSIҵ N/%>U-.8 u3Md~-xŚ4 W7'~J-CH-s?69| <#xLvo}+m?St$lOS-m xR'&Mԡ5>k;;ֻf'0C؞T qԀi|AYe"Oyug͎LL |o+/xk:]޳u[[prm\ۂ3soo=͹3<C\W]7k0vLa=N@N% oşUjz}خm`m7 so,/y?X)?j[jc$jQ@E}g[#ϛ"o  ?j[jc$jQ@E}g[#ϛ"o =R>C1?5=i8C1?5=i8+WX<7aWI>|[Ҽm13yLq@Wg _^4mBld;J(pyd\-yAYT0g _^4mBld;J(pyd\-yAYT0uoio= \,2cQ&m&+ yA~(q"z] o޽4_ ֓]. ھACgwaF>lë[\]-Ź 3ּ\kG4կK:p8}}=h*mWĞ.w!~)=:b|%}^M\ o_vd~%[UχC4gǟ ?}I枅@P@P@P@P@]{B;?_m?ۀ|yW?P@B.pkk$? \~x>_ӿEz (>=bWm"G>"? (z;ۆ_5_&5J;slkjԕ ;][b?mgPxLO=cKGR lo<`z\ǔ~l]jTUĒ]kѽط?0i]禞/BgDrs(a0իnֻ4˚d5f@P@P@Oq =Q͈QYsq =+aFu1&.']vG ïWm]GGAP@zb7J|v.__~Equ&ֿw_TP@P@P@|.M\AEWnk;Z藷wSX[g]9H>({8i T7Rf/ks1mo?>]G_]kR\- ψ^ !xuKQiX%y8&mr?kxb>"qM0L6,@;? iJuoAxº\Z{=Cΰ€4NL0٨fcuj^iw3O '<s:OØtM uoP\¾ -!@"hqpt+A CTC/TwpAm@3y}6`~&#/chl>~'>?sonr>xs8 yajyNΥsqrqoL7G`6]kޠ}İK-ίuqs@8*>\eOifu>SW6rf6͉)@`X+?~8ҵ)Ŷ1NӴIl#Өt7 0Aiu/5ozΧ3Ǎ%:[_[gjbOVUͶX 31'\b9?ݍ֙XAym<^|7F1{?a'45eoAs /TLhZl}iЬDy߆/s R]\R I [\ Ax`@= ( -GM53VKɞxn!9c1~äOhk}R^i ն b@6ӋX<  x^6}'4@+nٛ5{|{>x651}{xx@Gcas8O &Q{s Þņ]^ PwO-u+>ˋx.>zf6 <sb^%Ymu{`${t=xWy-O|3O3悸Ѵې 1h>D&lNYO$?fkƱ}|T^ !z]Ε}g~\$\a3s^u?|@־kZ:ˍ3 cs\[gึRspTaę~ | 4ۮ[Q]W<9 S6* 0 Gj:ni]>Lq cy"}SC]f[0KHnv\( A@-k>!<,n`Ar[p>>xg 5m&W/{G+0ˡqVLލg3о͠;ɇÆ[(DܮE㙾ѓs_5cwOcqgr':\'FY0&~8cB9{ We|Zg_󯉮[{  uu?99qPrO'j^[?kݻWo;|~=gF~ WPAp*?(Ŏ)ga<}#CEժI橮ilxt%_t8?؎$hf7X[ލWϚ;PV]}b {WVEEml, ( (څ#UFpb3L>v:qptSHԧj5d4aO(Z՝$Z&jTkQxX&OL?05}oRXm!$A^a1Ef۲$jq{kޯwiQ\iyXYi (пS=~1׎ _ξ;/?"Sl:yO_xϪ( ( (>swp&sPe"akO75sv~ދI?,[ͽ`?ss.//ú 5(澸4-"4졣\xcln}*MtըS@r^ p`Ih'8x3t3Ҫ=_cG??k7A{&5 9/9o>kxaw a%fNm&읝}(֣_ad>!~~񖇧vbiZ>͵ͽf" @\xoNO`+cC~Jۻկدk4_ֽoc\Z>HՄھmxgY}v<Ξ'm"&V 9"pNu':U(l;T[^ݧwg)hXý?s#KMw\΍h.i< ، pmiaqӢJ_o:)v6aVw{kq.MpdԴ.nn hAbFqh~-xŚ4 W7'~J-CH-s?69|Zui[\؊hh~(xB +z? TC~u|#Z~⾽4{?eKKjZi44osUswu sg=X~Bl'exڴ)P 婕'ZM[N_zO=r3 GC?r:|tb> Iw\PG_'^%J ז(@P@!Hu%3ob=%N[a?-_GP@'c}r(ɥ_p%z8<Zf7Æ$pPXi*JR8kafTt'1[VJƥ9یVFym43g#~#25Oss7A`F93syZ1uj՝4j45MU'K"=s9,SVX[+j+-ZڂThWZA$ů(( (?BaO^:o5:\ҿ@MM? ?> ( ( U]ÿ΃C>{{7iٿ??>ˏ|q׈5Q7o?Jh_Zү ]> Xy"k3SOT-w4~j??o5t kA}: p37>"YQB¬+??]=~õg_Ko7>;k+_imĚ~i>{MN!83C8$cVL,0 ^y{_7ߥN$Nƫ ӻ{Zk2fh!x-iEF4'w47q !?᱘<Ž ~\${AŦwuQYliOv~^s_ |05xu? Wڀ7 BI96[O)0q]|F?kT}YU6Wڬe M=¾Լ?04Oj;WM{ 1 }y_0hy>0}?|;y D<6o`GmXz‹oP^GoK ۋhN yH=K|8zWȞD0&#%gr1&G],~o_3}ZXu}/;y_:χu}kOCBm m#N@R%9+\/^t4_}zzg(bp߷w־KMf=gF:,BW8^WE=( _C3ث,Ȼϥ*rj? MZ~!ȹu%a??!] ",9T 4Zɺ֯:t]{~_]p+Y-~۾Yuwz/=}]{Ɲ=Z}Zcw?-?'UI1XY#ϯxB9u}F^BXjQ⭝㫫EX͞{#F'Ui:Ea<~o=yy^yNO;㟝㇋M*P޻V]oomool zdJ"Ȫ5eſbƫ%+Fo{uTM%-}A@P@P_)M҆_Wx\}ɼ'<]P@P@P@9 wW9~(|2U9;?xoE$NWZ0[{oOVcT7z}ͽ.~_w_Jm a}~>k^$C@иXI<ぜq?P-SQE֯6y~vtu'*4яڭ$<H -n%McQZ-7W'sq5m\xHԴ[mFD[[ @|A .IrG[3%'(SM'eFME5Eɧ)hսoC/џ7m_iDUkx]7 -`MK=NAqn xcR1{E>5lvԕ ۤO71_}.-W$}jm_J<3ؾo |Oۏ+yl_=.Nu2QvdO Ru;~>F Ϋp^OoooJ7<"yͿECq } ώpy۝d hѳM{j-&1m?zV(xc㏇V? P o7w~rBgT3*#rxooE;ۛT%uuGBItOۇU v4xR+wb?5F?" ?k[ > ~.^"е"Z08Hc03pfcUVt.?%_8oeDլoOўد.'<ӘM`[=?^2zuY])'g(SjQKť{ƼJ~|gLoxNѵ]_i̠[ *~5YA^)( "kWAo?g:L:L_V $ SWGxW-{ZѬY$s хa܈.LA6a P뚜ZNjwiy,yoqw10[l$83k,|!xo\?Nj:UQjAh9I$@z&>ukR kB`2N@OכYpjZV5iZׅ{ ۫k|{q=;f̠e ß^ 5{O:fAqt mO,N|D:sXI",<55ͲOQ-o 3fC|_U宯=xHt)/xoSm[@Of2|?k6x KJm+Za{umo3[n'ۺgl@1 |zs;kx~IڇW<1^Z}..r i%? k??Kk#PVۓ1]Fxw<"|o8P l6ͥ^+RҴJּ/^[[ۉ0Y7 fe >994ijOBetmJ c {<,3)(׉ƞFcKjzj-5&k{cp.`z ?ĿjWf9:gB ( ( ( ( ( ( (<Mw?_ߜ 9~1~OX+<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>;l?_'cGAY繸1>bB ( ( 5eb ha(uڿ=uP@P@P_)M҆_Wx\}ɼ'<]P@P@P@9 wW9~(|2U9=,𮓡i/^7Vo.5 gDȾ8qG@J?f{{/"iӊ(|'/c]oy}SsJ< >!p>MXZs<ߋ! kN<_xC>js0t 6Q7߅xOj>->Lns +p <%uB{ h|5mT|A𽾝v³skS\\]OZ}rp )J{z\k*F>rMlvosO]?-ƫnRl?q" 2Xʰ\Y Eb/HaUR!|pic{y9WRMonԜo/w\o]|4߈z7t m[04 5AP/18V? >}f9^*v_orT-~EK\_O/';վ.hZTZ wGgX|3uy[}`n2A?>O;j9f}amIЖ&>5.TmuZ}8z k܏~OC:w|%k5  z.o. n'4?gQ9bx;=wK%/b=(;ܻ{O]=Pa\;smZ4_t[34mè[C |93pC_nOk?_WIooO+K7ys Da%pDa 瞿i5is>1r7Caan&,- ma9/ß: Y~$躞7^0n{Y(&{y ?tv㧞gtͥ ѭ杚 % 7zMy>0}?|;y D<6o`GmXu:O|c<R=cc\co:[o"ݣS+ wNNW9_^=+C ?&㪛]D(OHM/ |)Gﭼ+>}-:h&v#h a?gx*𖏠{Ovm1s sCgy=WǾ A<7ZGP ~އ|qecx/$uSp˨=Ié6~/5HgZ[}eQܟ$xnmWA#Z>#xJ|'a}t)k}8X}7"I`aC1{=#ڞ6K6Z\Muo6;\e]g, >|CU?|6Gthl4mK 󗃳9U@P@P@P@P@P@R[qqmipMuy kOuqEP@P@Pzt _?s|I1ӧŖq9L~.n?xoE$NWZ0[{o'.\M~P@Ci׺,!7} %?L: oWƑ'mcM~ɯuMCK.N[ϳ&x'%A8< f{IYxI'gf쮟c 5wh5ψ_|eXuָuOEsmsoqqq 3f3S X沵Ҷ{5k+=bmE>a6[jl_]>sH6qȬ1eμcFJ2~엷i]Z.0O\+C;恧kSc3k%ż$E0b8v#891ZX\t趴ҺWN]Mjz=bf|5[v-޶g7CO&eܘ_O?h9SA-SQE֯6y~vtu'*4яڭ$<H>ZYS錳$I "[ |-g\8l,8`Vb"6"ïn<CJޏy77|8'ֶ߸M4Rڭ֚z ƾfBg\m!0[ ^6 Tº9jex ֫GkifESs,b\\>'_]JA~ b2z*=_v+hs@mSA,s0$, zWNEx!8GMn-$vo>#*( ( ( ( ( ( ( ( ( ( (.sg_m>j<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCOUP@P@P@P@P@UQ8V)t8q h`qK@%ݗG5H)Λ䋍@>L~7nOp[aZQĨV:|#[#%o2xmtI3ppNA q?sDR^o.W*Vj,DiEtgK};xhQq_nsS:yO_xO( ( (>swp&sPe"akO75sz?C˵{]%Wқj@9}jJ-t`3Eci䉮ϓN9>USWطeߠҹ';վ.hZT czWϵ|-~1_jD5 Q'oA<uV^!QfW+th)^jsl.Xm7_ kR+\dsN2? de>0zë~ȷ,I|;[Zz*n[iGr2)]xУ ǚ3 ݵn Uï {T!4=&f* 'yφ^&|+i,ּ1uKo~V6!}B }=I\gq'qP_ú|coi-|Cjy`a66_#"9x;3N-8sp7ď[/vm.m?qO{a0Bwg&sI< ( ( ( ( ( ( ( ( ( ( (.sg_m>j<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCOUP@P@P@P@nvv5@?yC"JU Muѣ+|V~3 rMB i`kʧĵTV*4ݎBFgⱸ"Wb<;p'Eib1_E#>3ZG}LS a>˨TYӻ [=9jk**I/lӻ09MN#_u4-.3N~q]c j01T#[hQJJ^!ʍd5d kOu|)EP@P@Pzt _?s|I1ӧŖq9L~.n?,x/efT$[X klF]GGJ.\M~P)jqi:VݥZAʺeXni{ <u#u}Bk>8~ϡj~3Cm#F@ׅ58,%_umC+y7 Z'5i.nr3@7?Esr;dt@@P@P@P@P@P@P@P@P@P@P@P@P@P@P^йW/f?65|{Uuã+tPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*r*( ( ( ( -j5{0 q/؆j<󼎽^ i>%>uq\W,23F'N km:ݡmOQ-6}?_J2Z>ڻvu6һteYBVb Ω>Epn's=\O<(x|Uk~ɪ8{֬}>YC/eF׿׿F^VU~y@~;xhQq_?H/-|'?E?c7z> ( ( (=WAwj:_/ֿs]9cŞt;3^sR{qڀ2]WZ}{N?lnm͛Ŷ-b* Pǃ?fš×~ Xo4 ]Ӌs}>q9Sㅷ<| Uï {T!4=&f*  kS[ 燄 4v6g?impAe9b_4~ #杮nK[m?OSpLɜO=b ( ( ( ( ( ( ( ( ( ( ( ( ( (.sg_m>j<SGV(  ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCOUP@P@P@oupy| ǟh`K@˟V?o=yS<6%֜VA pLfxo6+ƾ"zդ:p պ;(u ҂|91@s?]m[e˟Mj_訴N W3k Ԛ]C)_8xvo],9YFa?|S5v;mW讝et˅'_W0P@N^7\WO cp ŻOM?> ( ( U]ÿ΃C994ijOBetmJ c {<,3)(]Ԣ4ۄ0CA-P%'42ĶqA^sm'Z굝gI{Za\^_ 6ɖbp=Jl6ͥ^+RҴJּ/^[[ۉ0Y7 fe/_Znk k76|g \mnZ|`w@@?wDiH-UWQo0y3c< 6iiԴ>kҵ V3={ -vAoO~. iSPY]R yD0(CIN.t2]O V V-Սۼg+.Dpe|>1𖙥ÏlRgUZQp7 su5jO4 Vy=?ĿjWf9:gB ( ( ( ( ( ( ( ( ( ( (˯wh\s?}p=*:º(hO%"?Mq@ x?!+/ޫ^Zw]P@xǯ!UjͿ]g9oP_a@P@Z}ON_ '#5V]"a0ggHWUUyEÔ'5;pb^#>vȞ{B0O+b (4WU:n%1?ŸS?8g&+* Y㬭웷Vú5ڢܭdVb>?_!Y_E}WO&=֌:հ5MQ^څ^j?V[ zt03| S,Ǡq404jԒ'˩⋄_3[B19 B~Qpp{ַ֬Ej]EC_g?_@~;xhQq_?H/-|'?E?c7z> ( ( (=WAwj:_/ֿs]9cŞt;3^sR{qڀuΗq|u Mվot } $j?nmK7Z=2U|[s@BSAI/flKo8 pMx//SgwkzOL Uŕ࿆ؓCqM.Lfa'?O{ m#wMh>muFr|_Qk|+Yd7Чѯ-aRf\܉&+:Pÿ|CjzF/.4Sqkqq5ռڄqv X0k| yW=5|AgIѴ[/yB>{a` '0:kv7Zfa{=yBs9@/m>xoڤy q6֓4=aPH BSAI/flKo8 pMx//SgwkzOL Uŕ࿆ؓCqM.Lfa'?O{ m#wMh>muFr|_Qk|+Yd7Чѯ-aRf\܉&+:Pÿ|CjzF/.4Sqkqq5ռڄqv X0Kτ l|) rGH ml`@<-|c vh </]^ ]km?ķè0T7sϻ{g9$%׎{g?hOд;Bk.n&i409i$qKo&|_4sp]i~Â`LxP@P@P@P@P@P@P@P@P@P@P@yu <~Ͽ8~rcnWDZ\_|:?@xW@xo $_I(D%soNP ($??\^-|j?%|c?xZ%H_W; yE.#+mj?VVsn\,=ƾoAF  ( (f}>w3^FC{{[_,O>qxktw:ZT&|cG_qک؅CugBξ!>֢h5e|?~?~sP7{OFXX&.+E-s&0a}[[|;;zΧuca"5m k{}F?W4/A|G\u՜ooqo|=`#K{hOni }ds>/z}?_m@Xڀ}?ajwǯ,wme/^<59<>@цn-G٧Ҋ{Wfه>0Ngw[J+ڴ 3WAwjPe"akO75sv~ދI?,[ͽ`?ss./_eQSKoޕpE3/}?cϊFsqqeq][}#6T<]&xPӮ!iŵ7A~%[UχC4gǟ ?zP@P@P@P@P@P@P@P@P@P@P@P@P@P@P^йW/f?65|{Uuã+tPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*r ң ( ( ( (7Vݤ;[m9? Ma[-a_j]r8|m[Ֆ`W1Zym^6#3# < -+NG?᥾I(4):EW|]ƿx;Zl|;&?xr~'~5|9ě -r4[iȷ6izϾ1|b'C^ gt}O4ow}WAwjPe"akO75sz?G=֙mhK\7xPKxn.Q[{Vh/>~qbmgQ\X<0`[@00(i98G;\6j~=!;39$zP@P@P@P@P@P@P@P@P@P@P@P@P@P@P^йW/f?65|{Uuã+tPПKE\.?:>:,BW8^WE=( _C3ث,Ȼϥ*r ң ( ( ( (/k偗y[y?ǓS˰UukVZnϹAkgF5ao?1wgb8у<7]!#U@LFҋZGzb?\᯹4f;i ?6n/O¿ Jg[Pm3~- ?G[L j`?ڀkiAm@X?? ,g[Pm3~- ?G<[[}W<ossm e"akO75sv~ދI?,[ͽ`?ss./g_bPjwtK+o}_|R4/&iӚ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?|%SWt=KyuOjNLo?o>Gk}ƞ.]<4FM`'#mC0UP@P@P@P@3VRZxX;Ÿ)^35m/m2b X bqMl6<}]qn_DI:PSȯc1|3]5]u_gV^[i֗A˰$d ;2NMF/md;_s&>Վr(?UC׎5,_sOxQp`Ԯv}SP\xSIE_\dx~8<$.L7:;j0Ay'uy Bk}C0`pf#?g@E8LYfnުZkkgxwA~4t- VPߍ6\[xQӠ+[>y?i [wzx^5ʱ){+_/ xL4{ F\F#G;W:73An$6uE{\˷P} /IgMXZz5ͽͷt˟mh_>~?U>=oss[][_YOH -ks}jh€:fOBS"U>ZΣ4S 9|=oi\y+Op;(}ğ_Ps@B.pkk$? \~x>_ӿEz (>=bWm"G>"?*J ( ( (2t|#0L@G{Dkx࿘k/>fA/F'ញՋvV;Ǔ: 9yŻ3: '8<;,sIlm]/];VwuaE0ùQ[u^gX|_kyi܏xkź _MgMmW<޿Y9 (_&oy~E-}#=1pAԿEq_(Tú73Mi70N oB|2GOERqv: h޻I7gf#Q*Ӻww wMoQ֝CJn"9p|o§ L+iV^b=I}_V?+%k.(gqt`&"{?t36Zh-Ek懍M/>w}#PoD[fqs?`9>p~-~& /OOm/_u\gZk }$[i6if#Ğ4zeĉ#׸N>muoa> ?@j6ğ>?cS|+ݯ4iwm4 [~5 >.?u}y/sg5^Uo[i{rO.q~pG~F{SQs=n.n ?EءP$| oi:{ @:s>/?ű'{_$u*@y_Mv.|'j2o;oψ5(z}^KŞ1熧Nu}w]0Ef>|NANB] P6ޏ\~Vt |1"/h:gNSHzVm G 4Ӧ=Kxw.E~ݾ|]?j\g4~٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<j[]O5-.~'p횖f??8K˳ߟf?ُ}R?>٩ovc{y?lԷ1=<sq8c ?uFWnJf՛E{$۬c^JQov_k[ӭ]wu뺖? Lqok6'@3t8O ùN*NRտmYźUY#U% g<E%. e*yy zm'NsnbiFƅ +ϲ_Vkwĵ{G+o_@P7!@O_5p>"kKŞ&|EwEֱgF7Gپqoǿkzzg0Th*C ?Sj<C ?Sj<C ?Sj<C ?Sj<C ?Sj}~i>Ai.7Կ2X?i _Lt۝5_Rj~%h"N/۵j>~|?Þ"նq?mnnn>x/?%εao\j3=6s'eG_hw%P60"!: xk ?VmugEȞ{p)<[;4KĚ<VӼ[oj5W  - M|Cn j|!7z ZUF?kS/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_mm?ۀ9~1>rcn|l?ُ͸p/f?6_m>i|O|/񾑡]5Ź:oqnMOG_Y >5 = : vZ>s`8=?߅,iOY:_;sO5?@<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>0UP@>4+Kn#5a!&׭9_M{ǙS*}rSDUҰڞF#??} 繟>e0Qb1? 9€ (nնX!<3y=*>ϡS}(_Wߖ-/hj&hGvlx\7F3[ZomlJslA\'𲯘Ow+6PWiQwEVW0b_:nz _ c:mc_m&xʅ_cqowWս{._s+( UfǗ ^:7\?| }ѿ >$W!#E~c[yg){|Z?m6~AioҀU g?!~E`YO_Q@X?V|/P77*^ a-Ujmp=,a(c@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X0oqc@X|cc4voo{o,dt_XPz1o |A?a@X:|?,( O`>?נS,>c^L€t_XPz1o |A?a@X:|?,( O`>?נS,>c^L€t_XP5:qKo~@^=*>?נS,>c^L€t_XPz1o |A?a@X:|?,( xk_ ?? m/dt_XPz1o |A?a@X:|?,( O`>?נS,>c:ÍBQ?e{=Ο+S?(&=rr߆Pkfkoo( kzP_wZ_ZtAi>1A]ῴ' &ΏN`KU-;DQ@G (pb1? 9€ ( (NYԬ,>iт?OXm>?N>0_ռAfAo#=iM:9  P@P@P@P@P@P@P@P@P@P/_NӍuP@:(N:-zb' '?CV,|xFڵ App-AG -Շ{+b^;w_{;QK}>%E>}k]?,xxÒGWu2E-o|K4χ{x/ڮ:>ѩN{}hܑqx:~|+熶>Dt;ŞӼx^@ kĿ|[oA?sIb#tP=(#(ҝ:SǾ,oϕ|?r~Mtsj~9n<'o;Bjx79G!n-G wF?nOM<=rOOrӼ5?7*%Ƒ:=qۋkoߛkH|*3_a1OAk#۠x#px^<ZRM>-~qO?i18Kqݏϻk@N?`?+WbN<0o.F7$z ?NcPD\][Evf>qo>^h < eMC>m֍a;iqj0DO9([qq.k>'1ļGG>u xWMg >q}&GX.?=?@di5\Ͻ!7+_SuD-G=m?N<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>&U@P@P@P@P@Ǎ}>};IͥiE򹸸_K1 ձcχp(U~Gmjnh(\kZ6g(;a45qqln/ؐ:yxʜT0PMW{=4U4FIzGvxvԵ`.n O9E_|(Ӯ];Y1ge^-I*1 -'AtzVXwQ4]LuR Mqq޿+M'^X΁dIVKqe:gn-goFF*A NBmkPm~um_?m@͇?f#F;[᭾m}C6hI4g|O]x]֕VQF[[i |M{ m?amYkt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @+kt[P m?am@& @U/5x-mǟ.fx=_*z4:u ko[mn?38tCྀ|gk q5յW_Nz0uK?]xCUF-NM7jWNsvC>{uAn>硧A{eH2ԭ|q֗}\ x\ 5d=_?[~v\&& ~"?5_Cm ;oH5M~mEG\OmVNҗ|Cz/.MͰ6;2& ~"j/Pߝ$Pq;PS_Pii8?mbL-cеmtO xOMᶶ&+ kcnkko+5M~mEG\OmVNҗ|Cz/.MͰ6;1Zj4Ѯ->mq[m6O ZC^׈<;+7*+{K_?Za wc:o|=?/~YζeM|?oeqA[iZ>]e|M[[uo=O7޿biv G^{}\lkhF&އPom|E-4o[Cl?O:5 oa/|E&}m>Ez?[6vnMHӭomjmm"j~4_}j~#>% ŷ ]ῴ' &ΏN`KU-;DQ@G (m>c+?,(m>c(T?l[ϴ ?,(a^'?WPC ? aܿ/>(#G6S@~A0D|#Bhܿ?ּaW[ Oן¿L/|(uu iisn.:xiǎlYe +qq-,OJq­7jVu߰ᕼ>|6i6^6#ѤV?9_fT(fXի;%6|9/Ӿ5.rx<\dWkgX?m*U$E].Y64п-ۏA*r~ gYmt+ʽzU QT"1wh֣^zxbOï Ci~}':YE{j˛W_UK:ʰq\_:(JT>RV~wF^?ڇ3>_{q]FGX|t#gŞ$fj,"I=1Crc&Z6]={{u% AlyMیt^?ݺs>k61}O.k+Gq^w4(湶a^& vZWjCG ÿZ^˥x@m'G㞙8$cC^ aboӞ>w~%5{?eiIQg!Q[*ד_XB7[|:}[{WG¶uD( >w_?}o)|+= o\?n%#2<8[|W?mCxx>?6\eM3x Kw]]:ω+co,&uuXekN)%?+Н/<Q/>na‰¾W }Qg_ %ag0D?_x+(Z0[b?_X௵[cֲ9+ogN ՈlKz|ïty^{C Q?>fͿ'VA?Kky +D?lqoGמ·OfͿ'VA?Kky +D?lqoGמ·OfͿ'5t?/?|+ Wgo(Cf؜GF';U _6^g۟¿H|w_y7koDžkYm-ĪJ+q>}Ss FWM緦޿[S2F,C_t>; m¼>(_Y߅Sk +D_A>; m>(k#g/'~MQ0|w_yj焰?mn1ϔn GHfN%/_y SD ~&#3}{*?K< owo?}om O(]x[G SD ?~&#0>,-߉g={*?K< owo?}om O(]x[Gi w1j#b|GQsqӧA`H5pԽ{}ޯ洲NQK(ü: v=~ַ[ O+]x[ϗOweYdR#3k_$> ^gğ3ըv8|!Ectτ ԯf`2ױwO|Fij)k['d﫲sV5jK]|??h~q¾D6³io#?iqO؈8-+k跹׏BTpEU.Z}+T59ϑQC~2,D>C2_ʽggIni~j:h/.  Wm$#>G]'ƺ <m-6͠~c?ok|JgƼG ,ƽݣm/n:j`/co[~?;[cCk׍q' >$s}^o(^ O}|&T]\3A#n^G/?}m_ߢ_%V/aGoҾs~,F~.XV3c[x_<fڿ~{к|4y6jKytL^$:t~i0?rx]sa=iPbLCn&pn.j:~_,? j8>xF 8 4?_q`qW/TRzY֧A ;??g#}S࿁ுgE3jϟ?s,p__m3>_;og_E|Ɲ+4?~w zo]힫$ee7-,+[yePAր=~ Iw\PG_'^%J ז(@P@!Hu%3ob=%N[a?WrP@P@P@P@A~,;h0-qyqp~+4c⿌S=J^Tt7osP~>{4mX wzx+^e,>VƻoQW/ȱ8E-wQj^V4(_?gϟaρ> o5 syw[]\ܛ~I=_gg`8qbJ)WI-]-x{_wGpw^'2F >'F&-?"ӋeŒ@oOe~ӋeŒ@}_;WMkG2F >4a3[xg GkN.)90?(b? p oQ.?ן>a!Ws7䊯;# 18~@'"Ӟ??2h?OENyCGb#(pn?k9 qQ쌣o'"<# 1??2k _Hi?cŒ@deY|}+9q.{Vakj?b4j1D 1? ,I?^~7@a3DNz?o &_ (ӿ^~X/,5DOr? 1U?2 kNbWo\ g ¿\?Y (p~EC ?kb3O%9F7?q\|>#0eYN'p zwܺ~,-ßpݻ?f^3}+_SY k?=o{/aaA'7.>_[ C$Q@^v H>+|0qo#m+A1h0L?k|0{}~oG~GA2[ ?" +?[l8oDEp pM'p8S8go'É ??_H>?7]|8eD(3B?/'GpMaF~L1sm/ᇀጓ.P|2 ǿ |7OȲ= a'"߭ɿa0ue)d yw лp՗H'/`So'ÍŇH???_|901 NgGT~ȱ  wU2c O0]3W__?_|?m3$Qe_?~~ >?|/=Y9 0aawÿm?W'_mwBMR?w(uO?" ]? #:EI@'_Q>0'^(TO: Wr?ȹ{x}-$T%//dol0X 6K_se G wW+_C#/0Lc>]!qп,/ЙHK_`?ax/!Ԭ0M? ЙY LE AMgIȺ&:?mXf??Qp Lpc5B?/aY)5B?/Xf?HG{ ?b'n??KF_O;@)"_/2 rǍ;qŴh''&*Y]_o_˟w$T5B?/Ë ΋B?$SQk&_h_7 пXg䊿_doOp,ZR9?>pVX ?oV_hx7hҊ_ P}zώt{([]__,o-{"_daOr&Z7nb76h?oa`$ @s?"_/20'V_Mk|IS\kE:7o-ok@Oq<5B?#{&1}sb|E P26mjXBXx}n}-KA2?#ĭhO+@?:GJ?.&F^A3}k \i\ssog{|ǭſ}.~ ~ZԵIaaoo={Yn -`Vzξkk}敧^i7"{pG|v7Y5PxZЬuϷ7S[x70Iiz-ƣ2GwhsѶf%w"IxmTpͯx9_\tE (Kk;-+ЬT{y1+/)k:-FKvl= 5oxlE,*__V<ҿ]>H(ǑGNuU/aƙG`rc_? h՗l]\n[Xe[_g[vf|5zJ'n?muqs{v=Z[ma{kxW>4Wq_G^'=+J]Ʃ6.M[@<9+[6%͇>moq]B%o\n-hƓiWȵtkMjX _j\ 4Iaa7gHtۻmj{{=uW w-.c6ݶq[}%@T -&6_\eOEu?:LOپ]o;־syz6hZ[W8 R&Q=7(k @r (P(.P@( @X (r (P( P@( @X (;`ut=TNVg f[|.wm_ixB-=45h/7x;>o]&~C\n<: Űn6A|߂m|Fψ|o#R5O{['&0>e'O9:ƀ<7]/sI׀ cB7}(@P|z]_If E؏F}/SE>&U@P@P@7=MJI,?&cpބ}[偣_N:}b~ cQx1s  ( #Kem:e[q9~A+W zQ*ү{u*u29%Cj ~:|? AM\\]\xOMN?n++s/ B>~mjwƍ{A|-3]4=zo?~t~*h'𶵩M-N,-/.'5gt53>(^R޿OG{}MPX|QUoW>դ}ݨ0}+\} j}|Hլtۏ dӾ{_쏳}?-nn|7=ݿٿҿ??}5GT֥ޯq]}~(|ma{i[xoW64WХ;O?b_N5ծ-@ph>?to e~_'|iZmdžk@'G d[_bk}?jϹ P[H_fh=ů=}-џ>t_B?/4y%.kgz?/-ax `zPPPo@@K[%@K[%d ?-dk z?5=o#SmK@N@ۏ'RmK@N@ۏ'RmK@ K@u/=aԿqkn?j z>ϵj_q}}?\ϵ _`k>s>NN_j{qsmomN_2-O?#{|??cc8.0iύ<9Q\vE?gOz^iaXkiKƶֶ\`a;<'.oo<)tx`wJF'gUŷ;VZ_H?-ognf=V-_+N> ui_[x?iGE{\? 괏'Z4Iw\PG_'^%J ז(@P@!Hu%3ob=%N[a?WrP@P%?3yU. qa>mFZXy5U|vė[c]?WZ\/CZgh`:5H9kjeX,1kzc^\թ{Z-{ۿcl;lijAKšcM-G-Ϗ􋎣Ƕ^Og3I6S GJ{stj$wq~ X[TˌGNo}sk#ႀ ( (ѯ@Ӽ%a+n$= Ά ޿$͸:j ~+m=\y~n2igT_SȨm7^E/_ufkB:]Z0}_?W'^3QGԮ-[ _kg3ԃ0gJmc6={Og{k΃쟈 (!ѿh/xƞ5Buq᫽6csiȃr^x|]oVs&ִ<;9Gs㞳{m>6ׯ5[p|3cd{Px?k/kjIq4BZ۩ ĴfɹXşuK_ ^;ux&:6~i q?m<\q>S. wmO4ϵ7 $B>OYgH_Zڍ۱>mŽ3/=sm@~z.wNogV}M~$/8|FG"YCW _kzͯ>rIQo s Q Oj((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((}?~|ab_jؠ((վ X⯌_#Ok.m7OG{pA0h6>X^\¾$&dxSuo_3RxS𿇵Hu ht˩kZAGԿm]}@B.pkk$? \~x>_ӿEz (>=bWm"G>"?*QP+}/N$ vI֪GlCs.\ G8G8æT^sN+cזtڎ1H⫛c+uXxS7בZLz9Yn_ qGTx,N-}ej^ڽ9I[M[[tUz4mMQVZ\}e?chH'>"9W?Rr4Ri+rޕڙ.Y__Qv;v`d:'eί;\On} 0pfi+[APVWu ݭh(;݅<,¯,y۲t];R&X^j7 $폓|}zGd-EZw/Wѧ^fV7>}Z%^NUQZ|\?SG[}+?ȁ`;zXk98miRƴZzwqoc0An pɲxl/*lJjνog{5K۷oWX8cCJ%p_]j7Pf=kZᇏ3:xw?ϼ{>Cčoj- N@6>ˎk T𸹿P^nA]_a j[Y|m-c_FVh%WZZk؄oi̾3_\W}^'>b0Xğk0?~x^67궺DOM|;k:ok-K>> xu4]gP7f?~~\>Pq?i(V:KP\Amo`A..0{$p@>Xwux^2ҭRsfNNOeO|qz# s]7.b?[Db >,i_~)k"އuCnu΢5 An9=SX'~hw|K3>=#o,cۡyO62;_z'Wp]ϨE}Z

q0@9odBC9kakp^s~A=xUP@P@uwl4#\.uo}Q"y $qӥrP@⟅<i^$,@4HZoL0N=h̨Plm9!m<σ&lPlm9!m<σ&l ]_~,ݎxkp}OԬ'Q# n9y [o>kFǁu [ӧGT Z|/ZftJ{hur0@󗞠?ox]_ 5:{O{8 @P@zo~Pmx\\nm!i3882 BUno,=Ǐ> r= ΀ BUno,=Ǐ> r= ΀:?ox]_ 5:{O{8 ߇|֍kOiq<[Ѽq]wm|3><3@~ACZ7< m`ޝ==ǜh ( ( ( ( ( ( (=kc$~_!|ul|o~ӯF= msq{N?r>1xpx/oau!6}</_ӿEz (>=bWm"G>"?>y:)w=C[R( (BPo- չSjl aE:Mw;p8muÿyZֱkBY9?xe|=x\ GAϘ+c*_K͜}z7KZګymsυHͺ~C,)eʖѭ.Z>p޺}z\1xmN_dfy~|pP@P@}jn5:3zT!KVxxv^hF^ؚاN?wp} n}2wns9 jbxE(*?J[^CaQvmUgmllǴuq&뇡_}VF{0 }s8zfqk~ϰrc}v|N"ͧ[>m5Ƙ'!xOP&yGQwZ9P~39vӏ' tӇ$yW_KZS~,֕T-N~jg߇}YzŽ޻(uX>cs@~|iT]M~#ϋ+xS\wj~hn5hӼ܏3ߴ:mASkREqۖ]C7w8|kRѾC_|Ag/j]XZ6W3N;1@>j^+!c%CI"{;d~ x÷W>ixSVn]jZAXA0C>qqr~h`@Mf{CI_E?>d ( (=c慦ݦu H3=ʆ ~/|!0~?j> -R Դ߳\ mokq {طj>#IŸ[Nmu{{hrS?<1#8>|9Ѿ𝷇OYԼ oi\Au۴iFx;N;sPĚlu\i|k glP jZWM]GR݊ FD_ ͥ_^*L6q\mmnmI:\b?7uo |Ix5R?,w ]OSAU6߾qo;q@L!Ҍ?b9~ G;m?J:xSQ_}c5WJU[| r1h09 < ]ռKM=im4Fc4?⾝ki/έFO_i6@`QЧn?]?4\|bm`hNki36 FH<T>xN@3:|D5`v?h=?,>hZo,0mmW^<3ܨoК tm š߃[ =u4&t|jF h-n _Oα/^8ǎMCAJԭ>] o qsnmm @'6>>|qY;h|Kl]-ilOLyFM|2NRӬ~"nm,j|*:;6`5Kyh+.2G@~Zg~ |6zv?Ӽcs ke>|sr #9O~x[Mu۝U4ߎ !gt\Csq7y}Hh]xoejRts\\xbuW ٷ8<+^񞕬h~4=xcs]g`lM?h@?< ( ( ( ( ( ( (v,`i>io708{`@2-_ڞc?ZZo[Rſӷp o؏ں><7]/sI׀ cB7}(@P|z]_If E؏F}/SE>P@P@B%M6:k}>%9#}'5u^81ʰm^4=!vE6k¾&[CK{9V"Wqݼױf7 ( (5ky؜} 2|?=Ѵc5 M?A_-̫V~Ge^qPGOajÝ3H/-GC-m=N%:-AH? ~K]W WltwR 8Nd\rO??_ x~]SG,l]vQ?. x-6g??\ NFi|Ƀ@> O2xPWtz]+773e_ \ql3@5> vx[Ėƥ B5^ﷳY )ǜ-‹|t   c ~][s>a:'-mRŎ'6Nh*zZ6t4jM㋆ݹ [?׌P#?|[_˫c?|q٬5AXIt_~,%5Koj>B\\\x[ہm:drï +?-VHP1A;u}GaV?˪h_j7ݧ֝o"ߌ=@ }[[Y/w0{(PП~{~FOZj*𮟯\krr n-#~z0|%]O.'WO_mmE uyO>H8|2ψZt+. -m\^gn`Ԝ</z!xT׆5[kAs:" |Am8??$? i)zfӬ?m ̪@< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ٖcoF|xxDo[5X_\m Ƿon07߈i{4-ϑnݿ;ÿyw#_yIw\PG_'^%J ז(@P@!Hu%3ob=%N[a?sW~DP@P@Px h <6?mrOoֿ(03Ji=uBkÍxծ5D_fi\ (cK5-^o#Ock"^0\؆z)caH?a)| xJMKjV3a:=8{׌wY|S~$hojx}=uu/ఞi 89h|M߅ڝM#L%Ί/]kLaũgr?v19>_//N'v2?n9?q@=t-s_Y'qaR:[ng[h q?8ljj.#}+.)85UԾѨ[ux<7ҿ⟉ssU]KŽ?_q@j.#}+.)85UԾѨ[u_G)hW |S㛯SjW#[y6@_q &!hWG|+ٚq8IOus#ExsVskOoo\7@o.i g.tT1x^_gK-O? ~%L+fİxsO/kko { |O䙱eyM'LzWufkf -ං{{x9WW?hg!-_^%kٿt [f+yn~3|iox亳q{B so۔-m` pygh7'K|9t>k{Ojo73On`[ypJCUC&~h|C!1G}=Xۭl.~nAϞO">[tO[4 5Kټ-渔1? (x6 WI.Yqi76ޙ`zPW{vK5"VG5+ @HH:P)@5xf}yf8 ( (;?ox]_ 5:{O{8 G#%z#_nٛ~On9\sҀ5[Ѽq]wm|3><3@minZiMLy\Jq{PikǚŖnFP>i` | k~n?h׺^lg-hOѹ(;M_~,ݎxkp}OԬ'Q# n9y bnZiMLy\Jq{P߂Yai-4;ѧ+k2mؑag" (λaw} La$`$( (Plm9!m<σ&l ?a?}?fow>~yqJ?׿?,wg|q:㞔@P@P@P@P@P@8$~?f{ E}X84D~:i} =?'g9վRէ.|WNմW~m/}_=='ÿyw#_y>Ϡ ?x\5~t|5uX脮p?P zyi"z=tP@gWWY6v#џK?TCO5A@P@P@njڭƳ{pbwD8_, $)%g7{WoUVGk: (FO5Icm4ֹk)P;/2kףW{ž e 7Zmu(=ǐtyEz MWş M#4g{ @V)oivh>'tkrnn-}A`4濴g GCmx~O]h>{.h?5 ??g G}3V:L^ =.wxP}5.DӮ[>6:p| _?|ey|+uoX܋`6*-ůh@ɟ>3=!$@N/C~@2P~^ݢ|~_~:aj sl1x~l|<Ҵ=s ѼY/7y"էQ4=\€>?^~iQߊ#xcI5]}| ?αuk^xKhkڍm/R>d. A3n7h7RKMOIT΂_"kyF99j\_k妧64 k[i`r7`~̿ ^ߊwu+K COѮ. 0\3 [A|] R |?FpEߎ?LWw~'<3O&o dž|Os[[q 6.nHG@- ~ ~Zk𾟫붞%nl|Fuu 1hσ <Xj EYaMQ\y??@-@z?ÏK`7mn>Ϸs4?x<3+F?#xƱ[iZ=75 ^Oq=oڭu Ͷ3pI#Hkx3wMci:? x>&+]By.>` a>σhc敡>fLi~mmV֭:B OQCO4xu܆p#'Qu_*];EXoiz q ;qs@$|t Ya4:=3QA&`Rߠ4wDzu *? aeykዑa {xHF N00~GNNv?[Kskί[xͩgN}JN&G' dxK h? >)|Zů(}A8ѿ~8 /3ãá6&|6n4>#׬4ٮ-,, 4_/AxǶƅ& i}sOM=><0X0@xXkfԮk[CN3 vٝny)I$|麞}ii6jy0[[q)c'9@/|&mFpj[YYyPpYx?Nm.cYa>Eh&{L sg+@%nZiMLy\Jq{Po_ Qx`\$ڿ#Cb3y7=(Y8:g/mޏ~6ϟ"1I@WuVǧ=m?Q'P8 '#?L| 3j5o WrhwLF?sA㿃=sbڧX"F>q6}kEoAv\ϒtznw֚fa={7^|p2s:sFѬu?Zu[em_\z9mSz,iPGN" {ko;.b: cOφ &'z5ſ{>G_>,xN^XADtNQ iYǑs`/| }Wsmg/& d9=hg_2^V/M궺5_ڴun&v,Eg>po c@Ԟ]3V38[_?" =2j~ v^ihz旯隅>L0\` zh?go 3^xOjV77\O3,ۨ06@ -~$7#G$ICo_c-xkImcR<%=- /.p ?@_"7hH[]#B/;qH?هZ/:,BW8^WE=( _C3ث,Ȼϥ*r㚿  ( (64#R4if>ƹ(# U͈gh ϜwIG㸖pginA PW,F|#_]ݖ3 ( (?@k0?,Mq_|S#1Ce(ß xxP'ֵ/ NsiZ4Ϋk~x.H-t@]Kw7C|1X[o{> 6b?щ3#P<Ȁi sU~~__?o4vm[J_ {{oJ ?U ǾNKZUrj^Rq ހ>Ah>.* k>9θd| p%zO]~/ xz;:<[/iVɩx~ J9b3['PGz[~k_i^-/wzմ x-퇮ֹ(WR*5V>}oom<~ؐA`n(o /:E5 km*[M Ous8q@-е^峏ēxMo-f݃ˍ?gۙ/pO@@9|-ZIO{.C{s}sMkW:ޯs=x BA $m'> oe[&5+xo0A==_ҦN{6/?ﭵynRg-ps׀|eS6^w0m0|2qy_}kR:MV0h+oY`N(%㇎ҿ$Cx_.-|ro/RREf[|k>?[㞱?2Ye? N:p93nCiOu?YYko,mOj:`C<6Mdgo֚LztJۛkZ{g '#n@ ms/oi&WB>WPꥈo)| xJMKjV3a:=8{_i 7*k<Y߈u1XiO3w`sz{=G}[?n'ۏ79@P֛zOy^mo5ħO{[uFf=nB~@PQ g۾f?Ǜq{=G}[?n'ۏ79@P@P@P@P@P@P@P@P@P@_i s@?_m}]6}nxGԿm]ῴ' &ΏN`KU-;DQ@G (LۍÚ敡>fLi~mmV֭:B=x'I_ k^o~"=w\|9߾v< #'>~ G?WNPy𶸷V?ikC8e@~ | Ë⁧xkHZM _g@93ãá6i DZDЌڌw6\n1>1΍^6=xwΥk{M. >ݧNn..3qۜb> tO[4 5Kټ-渔1ۿfi=7} ԼK7|>.+ɺn>A- n?VTڊ[hOco\ܴ+J~~$r>xC¾:DŽ]x:5  +Rִt-.=͹| >u? o |`ϧ~/~aqn |7}0pMwO/~:7֩jW;Fo.G㓚#}2B*qq@cJ Ú|[œxR]P9k|\۟?v뿵<;k&4WB<_kqu\.l<g0Eg4)@Rx߳-N[ueǚ3?n@.?)#owf<_?ǛѼsxwJ>Vch[:ϸS~y<ɺ( ( ( ( ( ( ( ( ( (޿e*?m?Rnl??7o؏ں hO%"?Mq@ x?!+/ޫ^Zw]P@xǯ!UjͿ]g9oP_P@twEm\5u`N"QFoBu)kT0Rʁ߳M\_d3Z  9Uuv]^whϚ2~m"_ ˉ_@־]I:^\teKeIĘcVT>Ѳ7IUo%ǫتZ8jLGn?1ECjmgNN$B ( ( ( M/Ah\N&^#ˣ|C}~{j޾?zf|]O_LE5򞿖8F؏?8gDXH~~cOφ &'z5ſ{O!~Ƕo >=4/^i3fL}֢mY` Wy>𕄺_OC6uZjqHp΁OrI$x[Q|%*8/_9Bk Is@\xm]~I{.,t f]͏n.g0O7| /ڏwvf5fo[_fio`kpn9Fr¿ i4ä^f\Op6>b[hl|A3~Gog[V['>O7!MOtk; j'ar21 :Pi[nHoGH1޿jHN(Z}kᇈ<5jP?ɟFi|Ƀ@>RᶩþV Xk+6 qqu= {r<[qIҀ='?- i^!]~_|e>ލæ\c?-:@~$O7R5xgNIltP496h,a9+@P@P@zFm{n[iY[Oߍw9O&g>qi}ef[np:,BW8^WE=( _C3ث,Ȼϥ*rῇ!K::X hNlkӘ:V OF;@?Xhhb%_#JQHV|P`]gөOZlt15߷vTSoo` h߭mҸSVBŚ{1)>p|Cq2q4QϯEWI޵mY),&kVI;{uڅ J$0 q^X$4qA=AGOʿ;V-U]ת7E:l} w4(>څ = fů ( ( (=?G׋g0s3{=K4*\UJ:؊ؗ_s58ʓ(?m2ֿzXb? `#Oj^^ҴiWJtF %c-\+,[޼O; |]x{-A{?XYċϑ(z@O@ _ƿ j //㟈;kʭ[X/`%}hxU@kM@Px-JZص1tu+1< 4|>`Ϗ#Ƞ ĺVikQL[ -fͿs מ<>xgwÝ{JѦu]+]4Xp AlczR |_/|%,V)X.Ytۈ5qrmTߒ@3~"H6_)d^+Dȃ?fvrs׊ڿGuԗ@Ť|@fu-io~ɭy <?1ZÚܶqoi-v۰oqs?EN H?/+Zi1eu(ono|Ij[bǿ~H$\d5 ]VIk <2a,?:msǟx24ީrj:qOu? qNhutjf" } 08O_''q1@w㞇[zDžI+NtW$l%n9O|]j0mK|Y3~&~}H}?h{P{ռSNJ.Sx}g^*7IpGKslě~7m7## ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=_>_/<>nh'ُͿ8/ϳm}O]m><7]/sI׀ cB7}(@P|z]_If E؏F}/SE>5ȡ@Y@5z^M[{j0 omsu$1/60. ?*ch`p֬eZh.5mN"&jV8g-Р)#8( ( ( 0[\\A ӽDF*[ |<yS\+3a>75ϥ-՞^ !@f`k_=,qjp?#;{#cvW} ~_~:aj sl1x~l|<Ҵ=s ѼY/7y"էQ4=\€>?^~iQߊ#xcI5]}| ?αuk^xKhkڍm/R>d. A3n7h7MM3ITɂ/>kN89jt_Xܷ [>-{F as[׾-ۗZ_"h𥶋='~07']-;:\brgɷgm>߉gCZ(+; 7 6ˏ4g"܁;~]h.$z#QBm4d/۸[| c}\jo"xCv> qK`-i7 ('쓡67tG[v MhG8[q?' Gb? F (t[Zٌ}nn<>M#?& ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |wʅ/f?6T[> <[ÿyw#_yIw\Pğ i >]kkct17s7}(@P@!Hu%3ob=%N[a?W("P@lhWi֓MkX^3qvKdx5QA=4N7&L 3y&kֿf敭hx;L6V5[nn}yן;z\Ce8lކu]WfQP[WZaCYJ[uZ+Kb}.g<Tm?s֏/Z5}o8 ß _f64#ZYӟ&i ~^t㷑_/qX0\kע=uZm|v^fxz5Q*ţuS]2ۏ ( (~K(Oo-vaG՜8-w>4 ¯a/}q_quWR^*QNʲҊ}7Kb_8|){}G[JzX ^V~Ykkt 39dCC ڵ …_6eS2jrexf׳V\T`1DqV-aw05y(LG3i끊KYQn;Qe<9YCtb(jJ_OZf'cpVT2 ^z+סE WβKS":d{Tҧ9<4b]:kJqx-*aas*n__QG縜5|wFdzo&YO_̼A#lG3",$8nw֚fa={7^|p2sBz}l^v6~l{1Lp.Jb01ߎ35σ_3ϭxᏋ4 ZnO9hV^&o7hNmcq)00s젓>s-ia*^- Ӿm2[n휜r;1߇6-xE-4jiֺV/mpma,AA@//vx橧]`= -Gh˵O,5Y-/O;I&a DcuMO㿃=sbڧX"F>q6}kEoAv\ϒt46j| OO\O}?Zѱ#P\o? yP@P@xsÚZ]կm,GYQ}?>i[G"Ol5/73ڏ<[@E?6ݗ2xMphfq_jwmCG.żN? q,;d <{ŵOEB}m:PP% %8(7S4&{Ro& kx%8 d=<5;|Z/t??_4-_Y.5KCH4q:YpFf<h??_ x~]SG,l]vQ?. x-6g??\ NFi|Ƀ@>g? O_C<]?:ɷKA*  Mg}k-7[ҴCtu]; l[[b g94xO&⏍]fxНoZƣhP\[lMh>0|%]O.'WO_mmE uyO>H8|2ψZt+. -m\^gn`Ԝ<ᦃW_]m?^Er!ӭ57b0pqЂ(9Ws׶vv{gW_O-t_OsG-o }nվ A4#X$k-/_5 r0|`0A !%'~7};oNP7=( _C3ث,Ȼϥ*r溿C( (]+$_[G6I?M~KUcC+M{ o]?Vk=lB>7K2(?qE^lkN)x/' +'8'{c_Vqx|7+eý(gujp9.ի&Cۃϊ ( D-;Nayua8!>+c^/*/"[#7'-XwmVb-^ά6&Eڲ8\IN0}1_G-ά׶7B]nƳtGqS:$uk$ѮСuwwe}6fRmB6>E^#;d0nz~+.;Z]4.ΏRWTK9b!J0˫wi~{EuU}#G|?Q%2O"sx%ya8Hf`k_=~6A?">GW^I'A׉<=?.5&3Z*t)cڎըBZR ܘ3(|[>xD6m,|k @~m}~ ~s? 9`?Z[i1c±j欋kRm<[[GgV>|L^fk;mjs˙DxL 7 ]VIk <2a,?:5 ]VIk <2a,?:>x/ }vaN-x9\?~Pmx\\nm!i388GPlm9!m<σ&lſ !|60 oN4P@zï7> +VW(IO{gm}ڒoK_!:١Ҡ֡o/G23@-|3F&sku$3 4CЀr=|uxMa׾!]@k. 0` #$d?q@-Pe> oe[&5+xo0A=/č֛mZ;ϧι\=rG#MxO[S{i|)DP+mzy|I Q,8?,.G Gk^|/աcGN"ڃ |ӎq@uJx>(ߏtot~Ru=x\im kmoN9Mukk??º>uO[k >f|~-|k/ħesi:Fmqo p|oom?IRO:`c߂z™xɼgڗ{!X>ȷlmӻg|fߊugK1AMѡ)mZmo4_\gGu[]__'&q> 흴%w{ucFޗ}e 譯n ݽֲ-.UPk~ .{&wk ?A>6iX]2 m0-[.M|-|DŽ+2C`7?.oo=ŸΞNKZUrj^Rq ހ>]\H~-iգ{_a&Zw4; j>7BpSo l@#`灌exGuo[*['[O @-n 0@-?rpAk"- H?Ë OQVO&ks=@L@>-~g?k_Ʒ^85Df7!+moۏCӞ ( ( ( ( ( ( (zϗK'[rcoKepSż;'{b>j0>Ϡ ?x\5|@| >I649ےmv0_W>7}@P@!Hu%3ob=%N[a?W("P@LŞn~ӧ:fϴ?_͗Y>~1^PnB' KyQusZV>0qpqM춮a[\Is;Y{ >[VivOU W4GCjLxI"mkr:NV=Ebk7^vm'iYR{ڕ)I)Q_{-t򽿏msP@<x#yކ [vyYmCz.K!ھGb?C1ٖ'0 z€ E` X=ϳ)K,ΰ={PokZ j:kW_Or>\1LXlB[P{YPw]\vx%T ־2R]]|VQG2;Yw0X}yB{Yc_V.jҤZ~#|?~_oZ믳ޅРwe}O'P?FGKq#?lӭd >o5Ɯ44Z[Oq'9_g6A._-m;fx[%ݿ{5-sŖ6}(خ~o<޼h+=?k|765}{O'״2څƱss=96='qվS |1&H`^-u?OT~ſ'9}yKxg?C z|/X]4{ Jmrmq@NJl|gF ;<&4x^jt[Lεφ&9}a@|]wi xwyGmsÍmq}b77& [k {qoLg\>g?⣡Zx úskqۍ 3Y_Am2$q^&xGoǧj~sxߍ;70_kzжQ h7 3g~!xI𶵠W:D;V?/m>oxԆN, ?=0G˻-;o KWN.wuus7s3 >4mAYA_hṴ}>\i>&.5ͽ=KP⟀[Ꮙ5Gkj*ݮ-q8v1(?G?xúQ[g7//hm@O j+o0l|}qBJ\{AnB-۞4k㿃,|7H%6^;OZ'qž"mByv?pIQ/\> |+sįuo\Of\[ აCzWMoؿzՁm x> U҅_{ƒom&8 s@j <_I^xtjL"}0cGO i;@ ŸtP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@_i s@?_m}]6}nxGԿm]ῴ' &Ë?A]/mc)Շ΃Cז)P9G ('ۿp#XuYhJ*Cԗ@m/~>ptᾠҾGs>/(SFտ{Eg[=쯯pgr"SfdEua^+St7($.0]ոsJ׆^?6+;F%wpTupn2̆ĭ]}qû%/`(PWWpWo ms_k\UcԿm2ֿz7?m?E|?殼M7MM3ITɂ/>kN89j?4ؼS/m,-zc͘\`cfk+xgOZ7iZ- WCܟV*yMt{Eցuk{ ;Qy;TDƀ=ğ?O {yߴ%kg^Z3I@0ߊ6VIG-ƇkgW<8nzPQg_ E1՟I} XLWPش[܀x dz8k_ug𦋫^|1̚uW6F&P6h[mů(g9fi>ҵKX\M  >[Q:/OWo 5,׼@zմSI󪁧5U ŌhM^54?ꩠiisopab'^' q_~*Lڍ[&6\@KqP_ r`iIO$zzw?f߇?3<{,)8xn[Ń ʹ2`#4k? j ~8F i _O|56*3ܜL-Ws@>*NW?Ɵ>x7Xxtl /{gFSm~Bu?n j&eAF,r aE~ͷa XK|5t3jWZ֡xlη <$@>OtO[4 5Kټ-渔1[ߊ6VIG-ƇkgW<8nzP'Sޗm10zޟO4O=|K[p93cOφ &'z5ſ{>oO{:ipGI#(|I+LK{L[I_m͵{. 6Dd k{mZľ 6n׷jiW0[  | />RxytZ'\m||7/^tJ/`2麆X\a]='q_8)oe7⯄ͨռ0.m_q?1@ck o X~8x.&4Aۏ"_W8mCy[? x@ߋ5y+qmmx>gnOzθ y?foc^i9zxn 7-mlE ~9( ( ( ( ( (zϗK'[rcoKepSż;'{b>j0>Ϡ ?x\5h@>؝4oN@G (6 -?.WIei['Tg׈,!=O[%9(sUWKg]{6WtRA&1|~k3  suwm[Oqi퇠dl\Do^I#c 5~J aꚴF\b+*aU h_{s'uca1ydo^"ϕb+r$빓AQ$sON_}M`붫{'WtO-J?hOcs\}zq]uְBNõFxyY*IcW>#8~(QX \E8V2E|Ew[~ .Xu5c&(VUUmVj>iWuFxęF;}|ףBebPrڻ޽WH0ʇa2df20}p5<=ލhlGψ ^o]~kuM._Yp-m=?_Ω%yZaݒ~ڽ-޵4j1 pfOw1 6ocB[qw_FFOY8uŖ`)bcc*=q WO,GKl_@+14k#h~&ѯtrٶa[ПsPC> ywU%~m@UAbk'|bo5}_Nt_gֶh2 iW~8z?[#u R m:h>4Nm/ë؂jj7Ʃhj:X@ۂmp.'c~!~1Ga>XT6t;~2sgy_?ÍJKnē ]ۛ-۞9(оx^67궺DOM|;hR5=>w}O"]z 2=Wo# 6ـߟ<g47ď}l?.|NmRT[[/5y --<G-𗌴xԼ?o1#Ӂǽ} <}]xU>h|sspɮ-kl6M Ju_ 2JּE%DwP0 _#m=B㯯`+xM,r|iܜ~{>&+d4 O kP]MamA;fo<b{-MxwB.ak yɏ'ayYJ37? W^|7OumN\_s=n, Dnfy8_ڱ /loxNP.Fqm/M#N0[xG&4?j|z77do9NvDD\m$6X@x^Ω_6O=2iy`4 1ZÚܶqoi-v۰oqs?EN H?/+Zi1eu(ono|Ij[bǿ~H$\d_TxR[oH<}?)!eu?-s@gVO(N yKx%-ͳ[mݴh&Y_ CM宏xnFMglk⧈~jPxSGK[1K5Uv?<|mMl~ЗLAYLb8/^.o|AW#Q/o8FԼC/|O]x^LUuq `#M#"KkT oB ng,rG oxQg|%-*95/[8Fkyq@G|Bh^O?\2kssqqpA[ SsspAƕ▹2/]wZ6q\#P$n>aoC3ߠoxU@kM@Ox|+?zNHΩc}g99)>|0$ Ooş.dմs9]WSjJ>NŽ6@_A?<[M ]>s}N ^fn7pKw f.VOmu}u{?m<ϸ#4k__K:wR<=uSi羂_ >< ߠ/ BυKZ5G>"[3d?@?h- Qun[8I7nRm7[xm4麔77>$ֵs1N??g$ .2OF܀6YꖗwV6װC0g-~};}@^Y$j X` G; :Oč֛mZ;ϧι\=rG#MxşZw4O χ??i~y Ja={p-?;~\p>~ ( ( ( ( (=_>_/<>nh'ُͿ8/ϳm}O]m><7]/s<bvPׁU-;DW==( _C3ث,Ȼϥ*r溿C( \\qps=9 ]APEltb+w@P-.f inޢu#N_czumna$v{^c~CwInۂQ̽W]][{zj.Uzִ+Nҡˀ-u'=~~> Uf43zЮVMl<:~x]߷Pm]PWw( #um#~zaS!{dkKX.VOEe_ mh7-"Ru! &ݻ^zie-C[*aVo\]wiVp? ]9m~~`*=85<.Fc_+/ |ҸL]||.u÷; HPA >†>VwpA oy_k/*+G|<ڍ-]wGyO&o8 W؎*Wi:5ʽkV+O,d'l#ΐ,0r1#j^;֒kD?pQG l7'kO:it(V_x6}R[-BqZ?kxa;y^QGǢIi5Lvwc &?hג~jp'obfE(uO)\xE]Bx5oosm\r9.@8_ 5XN_~/ωJP| "byhz珼xS_o[[{UENiz?}/nG7PƓ>k?@1=7!E9HI ob㯊*xNg.-^?}0\AgnƟ4\4ojcKkoHiM6OB'7 -k:JKZ{WPNF.' p(O -5"xHI=Fj76NG8O6$pؠ~iZh,ƗVUimjӨl.O@~/ M"'}f`ù&sq?iyυto~2'mSÿu/[iwW7]i8sqqp~ўӎg%/@~'kcf 2kp=ͱͱE_>Zc¾Σ*m v ~YFgn' ?5{cZQ]LJo/'ϖݡ:}@[Q h& 8l?j_-PgJo" o_N<-W# [~Wih BO6Q67:u9}9#|@}I~Ϛ;xQl~"nm,j|7/Rå"W_iu}P@$Ϙ9'zxud[i.4uylF5 (&0Zv^ǿ}?5x C?PQoG:JOгuV3|v!_֯ҕի?۷_ۯ`zb=4 1H w:k7zJڭ֥l-Y:U Qwj+[}]ۭ+9k}%Bs#NDϮݿ~}*)k_M^mG)a5"M< y-n ?hV>KtO[4 5Kټ-渔1[ߊ6VIG-ƇkgW<8nzPk߄-V!E-jRSqoBm=b>yl@@ ωGE/Q֚ͭo7]om?G qݐ222Wfj 6u1* J<{ŵOEB}m:PP% %8(7S4&{Ro& kx%8 d=usX~U׿4 ++-f =4㿃=sbڧX"F>q6}kEoAv\ϒtlu\i|k glPG/o/A^vqO >8"NZ۟>y n3v84:\ѮtkOÖ]j"zƛas4`&3?DO=jBvP2Wfj 6u1* J_v~ m~; }B\ӵ;ܜ?gǐg>5o?t ;H/l44=ZtmsKB\&{. 0d~G=4?74_^ I\4hmX߁4<*>#x]-W[- 6Ŀilw<2=_Za i-jZaE.rg(w^ Ү#RmD&@NG>o:G~);{¾VXj΂ [p0-Աc͹>~ͺ߇Ǎ3zӼssk}r@n- |Z؋vPs PMj.״_ hwVgsG@he7⯄ͨռ0.m_q?1@ck5W־xZKk)oi~/u n\JmG~-tԼAo$ &)'ӑϵ}%[Α~^>-տ>8}B u,Xyna$:n}/L^4=mZhܷ}B"݆?P@P@P@P@P@P@P@P@P@P~gST-d9~1t͸o˽R͵tgПKE\.4g ?N7}@P@!Hu%3ob=%N[a?W("gOMGA3K^XM ':ըPxv/aW_?E~$;#VNQsFksl:8U{=:6]_:],K|9EW0|9Uk[2aHNzzwOpɲ}׷oBæָ^d??tҾ++N?Sk#\??: (*#`ھGřF]ST^I Z=gY}>+6X<#(i׮A}sL (G&eSI⸞{ K(=/]?>]8WZu{+*p(@c{nmƳET_,bڵQt_d2|(MEoeB5t9$O,7Z/Op{:ܧppUѬVjkQЭJ}%oiqNc, ak_{/ՍB.T1lz.4Vg'vçm?\ʿHf JUW>TbdU5O 7ucЬTcX]Ң|;SRX|iPIbę:tq?&$Pג[qr&Jq^OJxF"xGBmU 5*,eʴ0T0I?Wç~QT٣π)O6?Y(qn:_)Kp8\UHʵeAar6TuoVuJ7]=Y%r[{oVt0ҕZV"W^ " p3*5͗(ip}2O6_AKMKgÞY|ɣ^Ka#Ip'oi47S4&{Ro& kx%8 d=oVmbG^qu^a[Nu4D0O g>@rFMhxr]1SZNJ'Z|+<=5KYҢn'"onF'#;:<[/iVɩx~ J9b3['PGz/kx7ⵟ_Yxzƫ{-GZi>|0XZ[78GZ.iigO h|Au }N}/W?C{uQlH(Bx#KikVAu4AtoP|c-Eׇ5l$!|[KY`mo᷶~P?_ |Vc˦P\Zη8<H7?h?r;:<[/iVɩx~ J9b3['PGzs.YOi|Ho2xi3 m7Q9@9O~+qxSL/ĻmkV6[\[ο`|$95x~'xĺ>s0ak?=gހ> <'M>0<=jXlGa=n-`?ss9$ 7Sلx#o?檺5{n:ګ×3> 5o.ZcQYsqnqm *_~}gl;Y3C;lϷwc__ޗiV 随W"pG}6`|r2(GoO|\[:-Sk.@Y&ȹżgɠGO}[vxNm7Q׮u-:@D}A1W'4Ж:ÍcZ^?mqozTX\<x-945zⷉ_|NfLٟOu˫nRP7> oe[&5+xo0A=-~g?k_Ʒ^85Df7!+moۏCӞ?ŭ;'xg^]?K0c=ɸ.8 @ Lma|GݳO;*3Sq:[%Vq ׋|o}kK'=>44ovOvf v}n 9(h>.V&V>2V6>o,t)3uu XG-𗌴xԼ?o1#Ӂǽ{ůL {TZx<%mqrzsYxDo zVqkwԦLg7h( ( ( ( ( ( ( ( ( (޿e*?m?Rnl??7o؏ں hO%"?Mq@?'hE mx>_ӿEs ($??\^-|F?<&?p}L⿩9`ym_k^7_WlWgYŹ>.0A~g%߶i#Fž!a:\fW=4yOl T^Ʋoҭ߱vts.wF,.!b0÷ezoUQu՛<;!G`?}ּ]caUa\P_N~bf՛v^GiԟP(n|ߑOk&0է+ZZYhpeY˙;#> NEF_XψֆJ:)M$i0 D6@=8%yㅡ3,:+WoqA;{Po4OWT+bfSeGK*ޅ{cto'a׽tZj.(:c&fb.j3tVX|Ct1%Y{޺Rm5[UYj-U"# x$_bk;1 #ToUlO\OGλu6ҼHqNawYzat;reZDb|,WV;2vT{5Fγly_g%ծ]aCNw @p_,|!ՒKغUoooJTi**xK2L.dУ"z؅G+zp}T0[;***mPx#lͳN,'ʨ* 6F?6,Fsƶ{xQ߷^&F7+mr*rv^N?2acqԩ+e9F#;;"3Oc- M#ݚ$+sj^!Uu~MN3}_ \{go/n ;U>^Oq=oڭu Ͷ3pI#Hkx3wMci:? x>&+]By.>` a>σhV3oÝC^Qaq "N~`!0Ƿ6m>!}o\|=mqrIц.z@.mmob㯊*xNg.-^?}0\Agn߳?7h_~L_S^~mmqpHmA rGO t6ЎEo|[6_ZixW:h\\c?ѿ x| |qk_aſ-o\bmH#> 0L:<:mcxE;شXu}1pCA\NF <ؘpi}Zk?Dznm1 ΝqqqqapmH@Ԟ;7xKS7ga4FqO8o˭x?Qz!f/!zދk.&'9j2guho|)ous\u.qn?H.K\еϵ͡O2I3s@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@//ON?P4l?ߜ ug6ᾧxwO.}KO6`}@B.pk?| ;E(hkז+]P@xǯ!UjͿ]g9oPf(nvYGBk̰|΃hGgiQcLGCYl!tP o4D$kÆP?`mWFj5_/o^)췍mfrXaװWA{|= 9jͿn#B q,I cejUb3B`,Yc?| SR9a4^Vɴ׈qM"F_lږ]I;_]]V=j :v?ŒF9GPpWț?1E?}n#Fa_[WUVC]c`V7;_捀.i#hpwCm(z--o*M5BoңovܗgUv:ob(bѷ^bѢ[ղ[$Fyanaz;*zXz7ohj,I? 䏷r} #לqYkF֔vիg ,wy=+V[z+ 췛j†#E+l~);Dsھ ;<ik;{uuPs3,]CW*ʱ9%`jgߟ/ۚ_X|!G5|7ο¿ i4ä^f\Op6>} =G~^)qx:I7Ze\o2p #` 9 0fτ^0%>r}:+ZPӌEݼug[t xI 'nZiMLy\Jq{Po_ Qx`\$ڿ#Cb3y7=(j?xoKa@uoO'Q} So%lu\i|k glP?fǃ|I5{'k]b؝rQ }V3G{MRhxoĚi^"iX>h`GLaoxUz[XԵ Og |K~\wP ç\_A\Oo=Q E=Z/h u |9p\MiYE-s@=#[q¶~]5 _:kkW}όܟp@;>~ͺ߇Ǎ3zӼssk}r@n- |Z؋vPs P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@_i s@?_m}]6}nxGԿm]ῴ' & H_"6 zyi"@P|z]_If E؏F}/SE>~;WarP@ne&ܟθ4(zXa4U19rQ mտQ|^_=4{zW;uJ62?ߺ4Ac)p]r*׎I 6_mG'] ;`uo?jY=M?J㊕0n0[עDo  Wwvu봶%BмpLd?8n:{W¹N 7~C}og??/fX٫~[C*,qs: ^QjXi%zU5e4 O8ֿZûP+ѝ{~C_|W IUY;|Uol?Oge-'|- zϰ ?6L8q򢁒kq UOzkխYW3-ײRKx_oûW~i20~x^67궺DOM|;kR5=>w}O"]z 2=Wo# 6ـߟ<g47ď}l?.|NmRT[[/5y --<G-𗌴xԼ?o1#Ӂǽ}4|'⿁~.gS^WMg?/>¿hOWߊZȼ=wjۭƝsCl[dAF8~< ߇1_5Ϧ{[K<qGzSMLxmIs6oojmsnOo|g=;B<;c}}CGT|3klmb|#L?6( ms/oi&WB>WPꥈ& =Rf5弛cp|9k >B

[]X}dB |[tIOZm9Gq5ԿKy[HpxkNƉׇ>O5L'qrnoˎP@P@uwl4#\.uo}Q"y $qӥrP@⟅<i^$,@4HZoL0N=h̨Plm9!m<σ&lſ !|60 oN4{? (x6 WI.Yqi76ޙ`z?ox]_ 5:{O{8 /H5_:'gƹBzfqq@|[Ѽq]wm|3><3@P@)_Cj/uOir sIր<ʀ7 ]VIk <2a,?:зs.ok_Mq4'@߿ cO|>}k |YhP'5]r}X߇|֍kOiq/ŞеO_WҴn:0a܁/=A ~- h8.ᶾkzthp ( ( ( ( ( ( ( |wʅ/f?6T[> <[ÿyw#_yIw\P$g/C@^W\z (>=bWm"G>"?OWo?w?,]_NbAz  .'1_O =^?w??q'|GŸ; W?]"cD*iq իhxvoMq +䘕G]/Rԇ~R9ksb^2#a5j)=+]/kРӽm0OYm8j|MtY ;gGl=剎W? , Tp¿#s(`n[[Y]QwoQ5a0l]Bm|CPN۽(ӉߞGL9ǹrk2WYتֶˢڕYkw,>(-]WuI׮ԕ T|O)51o?'Cp¾tk+|nU2lBEc >sU"b8beV~ַ[VUWFtUo){.7 ߚuWn WbxEf/~?s3-ʲEe*h7.ɽR<h<>[^+W vå(-+%d)bǾkߖ{T˟,obڵՒVT_o\;Ùrm_A{]y-rH~r3nUPx^yXob+ײ|y^WoJ2<ø9^WG^Gy敳lڷWI.tGj[z:|=?ͳB)πsS=L(0,a[-B{l_ʳ: t+ơt.Z{%&:a_?Qiak{.gd .u*㇖~?hג~+\ $[`G?6m:ki4>gA z6+rgoq@s7NI=3($OYe+ ֩[]Jq.@*/ω5=Lլ{vQ :7|Dz>fQGßW>&-'Fkh>ѧy;A$g ͿiO 7u=^x+L',.n.<(3q楣|Ŀ^Ժ:mίogw!|/EѴ}w+BԼW9g5($;_E|@P@P@z MWş M#4g{ @l^Ca>~|;IËqhZ;Aif&@z{[_o$ 5D|GuËqn:ycFp(>>|.s|3񗍼/;ojxKOiӛvv4ٴ{'խ2 #k'|,Դ xD>u&xo3};_KUƙsmBX[` t~n)Pj~0X/m}wc>3r~!DŽ=?>Ӭ.Ju%m[sA686>3]yC<_/Z:m gZgܓq>0&|_)htmzxJO\j&NA#|<>0%|x_=;w6|p !M &~mV4}Gc\ikڍψM>t[Ao<>h_M]G4 _>7O^ hA?hS΀=c慦ݦu H3=ʆ <} λ/7Fм)?UXY-OmGGƤnn.>H$<; ov8ko |G_$"jMFFluĿg}M[F?fi S<m$Zi[< f#@Oxw- M}/~/|DSqm[谛wb-O BxFp7$ a_ÿ4|?y?mCgq DĻ??iD|3,!#'i}G֖ͭOӼ!Ū`r_ OR&q{i }K4:u`M?g:( ( ( ( ( ( ( (޿e*?m?Rnl??7o؏ں hO%"?Mq@?'hE mx>_ӿEs ($??\^-|y%WhFs?A輺RʴxZ =-m~W&f#?*{kk"c=W'@<Up*aף+s QvE\w2}v+?%ʰ9)`3:W*WVԤ.IEֿUw{|?YVG-RZ/J+{cPFa}_@?ٰVz(4ƗSw&ؕqX_*[kdyr3l8\~'\C%)/T7caaXz;ѣm&dgDf|fo#WBx aܤwtttwWFʏ器]gKK a 6pw# F|ݪJuL/YL?h|5}>/o[qOmR:ں^†"MgtլeȷTxʥ>&+kѭn߹֭Uʓ[>bd|5j^Рu3fgk\F6eT->ڡE{m(m+Y?gG"p_ClVsT\BjJ8Z;Զ0?uN:q>REjWwvn}ip^ZbdֽcBMѽ}Ҷ?tIa@+g9!ӹ+bgBUZr>f*V^u̾ˁO:O.СBtQIaׯו^T[vUbm> >†?k՝1qz/u?50c=,3x_Q?(RASuohBtTK,R_rVƯ` `@Z܋r0>*}cObzk˛\QXO Y&mY֣eZ2J^Y4v7"݁SWh|>8"ù')6i_bZJZ{{ρCVt3Gӧummmm=\F| ™ss_ūWC?sB"]Դ;N7%f`q湏>0+@e4y Um5nBN@oosam-k|=ϔ(|#7mCx; t`N-ϰDg߆"||=+N?11M,7GUӲſ5 sN3@_W8mCy[? x@ߋ5y+qmmx>gnOzθ yA4M$HO@|=QR#X& l[`d/k6!𭟆Wo C_oΚ<Ÿ<h37'=g\</~¿ O  Exh..0+@e4y Um5nBN@oosam-k|=ϔ(O?|=TM'5 xWO׮5bK Sss9VUo?=[|+~3kx6Z\ >osu7p`-= '$@:{/=sm3C𮷧[]AQ5"~p]Ook]|>'5|+^?\|oSN?~19X <5/!0l|Wq ?>|4~|J~-g+Ȯ_:u9ն?fFBF:E|}@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@//ON?P4l?ߜ ug6ᾧxwO.}KO6`}@B.pk?| ;E(hkז+]P@xǯ!UjͿ]g9oPJrzrwc=GA_YUG9VV_]k2:i[?/_{V]S~5Dۂou?]yLL`m}cWJ5YW{+{˨q p؄޷N>ף,={Q+€ ‰#rCn<9nG_YNu̠! wG$8w0<:1 W]ar*TvdAqϸ˞]oѡI&QvS2n#?JPõ؊+Lf$ͬ;0F8 SJs_8Y=߷[=Vν*7v\M*q>% ]uW_{kc>hDJ+p8:Ecca{XЙmw,όg"b/|SXOX{cxSglJ{>X{1yBn# i=O9tvU_M*4mw^-xMfd9`WZ'{?+EWN' vWfo ;Gg AB(0.!_#d>Rwu33IU6 /ف<?,n.tE/]WVo~,qcG?lOc$bk>hb%/6W8\[m5|MEmGTͱ F[^MҭI굺w$ (" i-5I䶍V/pI 1~+)ak`sz(=}{Zwv5}tzؼ 8р~ƊWJT+z7gWzT,p7KBk࿇7 xh'ԗZR@ɶ2i7^.? B'<[]FSmg@pGArHk/ŭ6Úw?O{s]K4,'{{}>-mźGxvgHS>sWv>@.Xqj~Y\@ /g1\|%4>%Ú~{[[[O[(7$͍+G l1WZfO<"Coo {kaanV{=H )w֥{>"wsoz.\xS]i-4mR`s@J|5Ni8O->F -srS^/У[q/^>tO][u h ϴ3񦓠kڗWW'B5|z-ie8[fʃ->StO[4 5Kټ-渔1? (x6 WI.Yqi76ޙ`zPW{vK5"VG5+ @HH:P)@5xf}yf8 ( ( BUno,=Ǐ> r= ΀:/H5_:'gƹBzfqq@|[Ѽq]wm|3><3@~ACZ7< m`ޝ==ǜh 7MM3ITɂ/>kN89j-~UX]hװXj3M? ϐ@o:ևmK-l[ 7?sPi/ŞеO_WҴn:0a܁/=A ]7MM3ITɂ/>kN89jݻW,-/W:Ŧg~47Z|Em~M0L<P@uwl4#\.uo}Q"y $qӥrP@vY T}+LNsXOmFrO Uïx{K \kMͤ-7g'syg$6{W18NE׽5ݷV€' N_7NNg+29 }?GI4/ֽ.Gt_IB~5y|%Z쫭+$eljt§m{a^7BIPM&Fy/ǎv_ Èԯ={{j.Mmɔpե#wivrl/bԕQ\O{|5Ե5m/bQVBXu}t>W:aI7{koG޻5u{ &-3S oo3Ek\*M`?_4U /7nYc8W/ ~|!)#qn6_‹ڿ/- dkˌ)PM2bj)/կ ]gVIݑy-_2~ߋ?x>[+u_Wk2Q_uE;q5 _N_\-mZt_~"du찘W{7K8*Wae}{z>ҽv L0鍵ԮB#}kb3WV.wGgls,UF9i|]\H/g̱5p5՟q(mGvm l^gg0hE*|:*2ڵ[Ww4[VW9 O%c%fu?(B y^047NUը7Zc>Kt+۫{xaC[\\O0 ܑ^Vqefajij׷U5kZoxNj3ejѠ]oOcsJ{}67PÃtھ'`a>,&kct+W(k:n맞ѯ` M_sOˁ?\Лlu\i|k glPjC/΀oN<7NzgP]WI.qkOZVSĶ]:ƀ<=c慦ݦu H3=ʆ o+O~o4;PմMnk{:577W>0_3ãá6?ڗ M?-pmyp~־/Ⱦ2<WR,nE0A\}dşA _Qk!xh(ٿgo/n ?/ÿ|0S῅W#|=h}P `c?r1iZh,ƗVUimjӨl.O@lp k[oM<1sOwP On.i>o~>RpX ^%ӴY5mFOolnl|2 }4Vjz%gYMAso/5c}S7gt'Kc?[5so2è0}og9Wm?Y~CIo|8}?Tֻ~cۋp.'-qVs灻&Ư$־ ~3x /mrSYGڅF{@r 9Izg?f_]B/_Zjzo ;:Օh_.u qqA-  > .xo>s F}~q"\f@+t_ÿiž7A>'֭xmf7$`HGob- _OO76>G#v:ͺa~ @g GCmx~O]h>{.h?5 ??g 5¿ McGHxQ7Z͵!Ӯ..>?. 6(~&5 jvx0&.<џCruG=OXd&NBME9POm/؛>,օ3@lzu`4?OW7 9g_x[-ѵ Ҽ;~xĺ-sBׯ>6n>m {u?h$z~5C xA6Z쎣ܙ]x:N;{#cvP~ /RsEVkH$s\p<;k&4WB<_kqu\.l<g0Eg4Jx3Ff4 궶MkVDd!r gx_E]G~(n'Ú|:b{qtnCOs@(:կ_xU.wi\[j7崽J{csgk`ϝ9>ko~,0nHΠ0\o xY|=o:冕c0m0M$}' @sC|#-X|syNo=,rnu͸6D8%MOKxp?=UA⨮}c7gn>}M-gT[+l-axBq+Wit'EGgkl?on';HO-ƥMG5RW-YjfԿ'm>kl'?\}#2FO-mzOE žӜ v޿߿qoᇂakǗZ,OŢë鋂 Br0m#/M|%X'#l-֣sm|mnt닋s lrG -_g3 &eJy~?3lwxwC࿎$<- 3.ykSFԘ 0ig16zo+_xׇ|GNj&݂ \qҀ?? ( ( ( ( (zϗK'[rcoKepSż;'{b>j0>Ϡ ?x\5h@>؝4oN@G (A-1U^i=!{z O˂ R伌TC!_(o҆">ä_ΏU;q(cB߰{Wܟliy}fn?WWC9/,vW-ZKg^o|+V#'Ļ᫮*YumlXmt.ဘ g'%s\yJ9{fVʏ}c_:l$Fu9Px;1UňѯGWf_]VY x9N92Jy\q>ҿuil~zY;g$DžN:DݮZVoK+B/x_ mkYa?ס|;ׯws [-v|-5cGd|;̱q8jWۿ-u0P@ެMΗFuןp1sw#38ퟚgW:~YNYս׷ƩP䲻wr}:+ZPӌEݼug[t xI 'nZiMLy\Jq{Po_ Qx`\$ڿ#Cb3y7=(j?xoKa@uoO'Q} So%znw֚fa={7^|p2s~2Wfj 6u1* J?~0x_⻻ Wϋ(ĩ|SixkA#-5lH$V{qq ğ'DĺŴU}Y ɷo0$NAOAfկKa躭{|us𛉼!ݱKoϜ~}X5'mLխLyHqq<:LsZ:kDxefb.F=2?# מ#燵m':M EͶ=P96~;K`-߰9 7 ?_|@z[XԵ Og |K~\wPWï +?-VHP1A;u}GaV?˪h_j7ݧ֝o"ߌ=@P@P@oڭֹmfT.[t\M1?sP@P@P@P@P@P@P@P@P@P@_i s@?_m}]6}nxGԿm]ῴ' & H_"6 zyi"@P|z]_If E؏F}/SE>~;War:BdwO_ftco_oEmZ4wW$VxyK ECο+׽ַNۯ׶'Q^E&:Ӏ=?ZKȨarޤ5gjW:tttz}˸?I**NkP]-Z mkɧE6X? vg!8=+̞%W[[G׷_XUɸ4z֯ _OmK\} &ٝm6G?' (SYpKW8 F_=|1昏cjϮ^z&5IF[޾s5Ǽ:f|}76:B ({Kwyj8 Dy~7'Sqٍw엚U}zq[$[,~5_.ǒx,>V2]6G? (<Gn+\F82O%29W1!@ZԼ3;νhk:,J[VX 1ӽ}u/Ư. [[c'm '45F$\\|@"zd|j5U5kUYE]צUm*-(=W<.@;:<[/iVɩx~ J9b3['PGz;x@|?%:\[ 6m› ??]wwa|4l_ck5-[9 > oe[&5+xo0A=?nk:>}xxCV\+{kp-෶Z8_uK (>x>!ZK'ϛqlEqbA݁#p '4ּ-A n7XO0@q=KL qx?>?B]xs[?M7ž.Եv .6{ngi?u3ekM&=?n ω5\zSO3 s xS3žoԭf#5uzp8JA:Ùtؾ$Ӿu庚}K }Z`'9 ߏ^O{{?2FA K?V6ZĬe e` c;2RO8Ak{h4˫mB}Emku6q@{ <}]xU>h|sspɮ-kl6M J7-MxwB.ak yɏ'ayYJ37 ~7>#OLɿ.KJQ[}mEpN|zzozgWᖳGw{k'[:#(͹ sp?s@S>+|Eueei౷~c 4/+Zi1eu(ono|Ij[bǿ~H$\d(յόMϢw5] f~]]CpG"9xQg|%-*95/[8Fkyq@b|X{vK[~( :['Q..tfr@c o/H5_:'gƹBzfqq@k77rCm}ycǟL9م@P@Znw֚fa={7^|p2s>o:ևmK-l[ 7?sP@coY {i|0{fu)_Cj/uOir sIր9BUno,=Ǐ> r= ΀0( ( ( ( ( ( ( ( ( |wʅ/f?6T[> <[ÿyw#_yIw\P:#f>=,ז+]P@xǯ!UjͿ]g9oPf(,qө犾#+?skZm[gZi{vے,B=pK1a> GW]Y-[ ]A9Z T8;3CK9VWĿ߼ tH ͞]YWwTˉ5wF-=Ri[J\YF:5F^;7AZ7qT4{b!<`{WFGXW|7ѳ Y!,+lBUk_k-+ƽnW>(EYF^T_ CI^Jz>K%Zô֟x+:0Amz_^l1`P@^$=gV]|a;sͳO{q<|G9IOqƙD$d4QbkҖר< ZXY^]m7 n8 ׍KkmOଇaϰccV^VIʵi+yhIVv[nN9'ehS@\aϱycV^$IFF/uhȯ5}/Ko'Q-ʊ;J}WlVQQuL^zBd/̋_ns}=O#=\G m՟執Q* oK_/?O/_ ?mTo{?Lj_k-_j'X66E' sg"|!~_5A1[u a`9- >͏Vx751fUZo$[Z&' P?>+/>>Du i>]ۋr}[G.~:¯t{MbQ-Sg;_ h&||iJx3Ff4 궶MkVDd!r ߂ּiut.tl>{ B{oh {{or;Oğu?\x#nGfLi~mmV֭:B 4x"-OxZ?hFmFI|;`.?g7|\P|]Fg/x_v<;gR5usq֟onӉ781@inZiMLy\Jq{PǏ3kvw|aXj^%Fo􁦟ۈ'ݸ@>kO'sAw͹[dM4_MFm50-R?4xI4-i>_]iwBTdM LzPX~[En+G mEmyծnnZ|[\?g?fp@9?l՟g:ğ7Ïi>0gO kk?f0reg>xј8[rn&VĿXOCPTӵ+[Pp #q~sԞ;7xKS7ga4FqO8o˭x?PC{J:M,wrsӸҟ?4_7|Y˭ Úf]Fi~p..n- {rq>s@v5O]Oյ5Ǎܘ-m3-ż11s7R_#׼YYO:Qӭoډ`CW&ctk&flGC3C8 Ǵu^p MWş M#4g{ @eI4-i>_]iwBTdM LzPW7_7,w~ҖH :5[]|!~_5A1[u a`9- >J~&5 jvx0&.<џCrujiGS> Ӆ7SnnAp1zwSG&ϋ<9uxsL<X ?OſAonB?g<h׾.Z;?;Kƶq~3F.q@&Kz +5yGJ:uQ6`*ی`@P@P@P@P@P@P@P@P@P~gST-d9~1t͸o˽R͵tgПKE\.>]$Y2uhg5 Ь#va@*cqΎT^_ p}cOџޫ^Zww]P@xǯ!UjͿ]g9oPʿw7G_9oo v+O?7_ ?`#O΅|9|;؋[6oev5Q^F ؅w.7#z+ Ege[8d~u5ř]_%_vpƎOA'|G [RVpY/T򖤨bpk6=h=kȧ[n.w5ˈQQնG3,E,6Zkvr?SL6&luzXf)U;H<=}L<3a̡k|8s2,ul\c{aꪔbE*5kPjM֯Vmi}-?C_Q8,+|KVUu|MUוZ?W6v 璛 1ke:)}w`$^#]Xͦ \a> ?K?>n1 _ 7xk0 :޷(`)q7sh~i3᷃uIaqo``l}!~ķ?gh֭N|nBs0xiq "=;ǟ4|o7KħNzզ5?FO:[c^2m@7yM|"eZkxv^"%fڰzq@:@P@zFm{n[iY[Oߍw9O&g>qi}ef[npW\z (>=bWm"G>"?B2lG9j8r Lֵ :{Ҥv?ctxۊ0"kzo]ȱr?zx8?oż9)rm/nE*/)d\=/'~eн y}E-:]c)PJ9ݐׁfwT`5ָj*Қ_è+l$s^3 <(k^PI헰JW 6Â]2:{Z?3\%ZT(5 ѡ^^^׿}UljU*،E׻W&VmCË_!@i_} 9jyzu=Z3€ (~Y5;6عg&,PO-Y/IUJN4{]>?_a^M>^ xێ澗l8FeukUz-n=v7 mf??(:cV4~/iCs jNQ[bk&Рjzz򓟲ajo\[#x2eV~i*[[G9q? s# t[ ZN*Xz8w*)t9`V5i Qkdc|vQLn#V*붵*/Op~˟.z3J۫aI7[a툤/׫qMUG_b~4CU60dC, Wq.n=} l_*͵흹%{W]~Vg~'-+fzp>GZԼ3;νhk:,J[VX 1ӽl} Կ'x7ooxŶ0Opgk <#qs9>e\ 5WWesGmv^Uk@,D\|c״_mwI`O(gtzÖР[k^<.0Ef'yO]~/ xz|'ֵ/ NsiZ4Ϋk~x.H-t@j]~_O%/%_x>ѼK.q5An.MHo_t=/fsw4]?7,Cv70hgnNz@WOΥ-5|>G'?>?B]xs[?M7ž.Եv .6{ngi?u3ekM&=?n ω5\zSO3 s xxnBӧVCÑr=TxR[oH<}?)!eu?-s;ODL~EryGMTva_qOĹƹCx~ۯ7mg=xW_'K{maӀxOzygƟx-/ڶxSA1ιoqal'E8= >b ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zϗK'[rcoKepSż;'{b>j0>Ϡ ?x\5q?WIH| zyi"@P|z]_If E؏F}/SE>~;War% $c\Xu Y#ʲFsX,cdmp׎S_fyF/r0xzMv:~黸zWPv\ܫ"1{=]q_/cҶ!5B2v+_`3*7J?+F#$2~1+=;JsB ( B5K:nA^Voa<l wkx_kΨWZ+K}zZL. m۠m7=1gsJʋ~{^01*Wa*)T(]nYQWwgR}U?B05,+xq8KKRw~t|F?>ɰxl7׷׊6m]%_L=oZ(vYAom#Wh`0pv30,Fmw]z5zeNY WY{s7G~ߟho5_Ix+I??7h_3;U>^Oq=oڭu Ͷ3pI#Hkx3wMci:? x>&+]By.>` a>σhc敡>fLi~mmV֭:B OQCO4xu܆p#'Qu_*];EXoiz q ;qs@inZiMLy\Jq{PW[WwZqn36[ :nnN~ܾ*/G-_>#Q7i:om|>M>o@T'M>j EYaMQ\y??@g JMo<?϶h;⿁;m_^kN˩[jL4XO3=7핯Oxkþ;_ĺ=Οkkk!0Z\g[ۋx:c?h$bo_|Gx?P_.}tt[Zn@ ®M@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@{|_y?;|BO~p*_o-Mg?ۆ-</ 8{;WûKWB}+ɻCں'xjxYe95/;Ҿ#Uk]%v߰eoct#\e}N. 8=~uL0 mנn5RދHѕ#swJѻ{|:zikS oxmV_ N=7T=-6xzm##E+䬖9N{fP@eOajV3o; zO\D&;Gztkuxoxrla_Bg^)|:enqm^,CscVog؊οm}jiآiK"t>H_>W xwNsWAԆ:/KhRVJU)٤VZ):AykOҜ\pkQOtk8K'<*`U[~K0(WuMF7.|{ǹ~3L KZӚO_m-׀ϱTp.t[FmQXYj]5$4m~ow8SpJxQhoVݺսp~l%J~?v)QnJWַWGP3`u5gu?]M+6$<E G_LstO[4 5Kټ-渔1}?~6iyڧ_Y[;Ǜ11+Ո~;> |VΟ>o>,Ҵ([uk >T Yxž޳:Ƴxç,ϲO_gx"^Ĩ|KsYxW\7SNmn?0hrrqxǏ~ضѨOM_Z[dszWxVk74mwUd[@[ۀ9r9.>|JgL>%>x'k m1wqס4? x͋j+`M=uK\yAp>KqPg >|guM`uMF[кӾ-඀[Ǵp(;;Xok{k;y&s ?2?} p[@w"&.n.} l~,s(L4=+M|_u}] _Mn!(C||U3^'/ h.ޟSQOۥvmO}z&>5 cZw!ia:?-ѭXqoBzƳo kv5~\魬cϩ\[ko>3ruϠ66 ~7Nσŭq-kob-cAL|!@7<9^|5@nuZuyas֑)zn+VRcs=ż[`z z:kDxefb.F=2?#?$^<;.RJV dsr-8%IyqA?ׄ[|c k}E}N >0+@e4y Um5nBN@oosam-k|=ϔ(O?|=TM'5 xWO׮5bK Sss9VUo?=[|+~3kx6Z\ >osu7p`-= '$@=LQ3_uM^.XxQ`]$۝: ?7gzcg_ 5⟆YN5;5(.|mo yn<N&v ٖ4/2x _xoFna. Ly g} )Ĉ<]泧i:({\ r 0 ( ( ( ( ( ( (zϗK'[rcoKepSż;'{b>j0>Ϡ ?x\5h@>؝4oN@G (7jM;^k_߫du}*E N[{FBތk{U$f CNiG׷a^a9C1+~5}I d9eZI!'qIWfE1 mBq[Zc!X_Af,+{eωnxb`kᪿ^~VPHt&skoϡיI<73ˊxcjy=b"IV15M?ޯ? 94//qml<g?:Mu>n"QWwu.g/ʴ _F|CT"?F-{lEigkV>͌~@y{酇ʵ}~]",?i_#P{J_I42+P>kBMڵ$g?:T/Kʒ4mG[%#>e(YL>CjWQX"[i}a+>mӬ M\ 7>CM#:.9Uwx~ֽgy1M:j…JꇶI%z` PE~ 좬29?mnkW9oeiDzo~Pmx\\nm!i3882Lš߆gž P~mtOOm&4bmѭ;?gK@OQxw>>QSOjP77W[[bqI`g+|m|<7]NgNdP?Hw}7Ŷ1}oOE~q&x2xP|Kψ-1XMvVEε]BWO {x-# p 3|+@LYӾ&C/Z}zWS\΍69"qf<r|@coY {i|0{fh[__BЯ@TPLo߆1M>͂w<ى^F;Pfkⷆt|1fB؟Pt;XmbP# g۾f?Ǜq{=G}[?n'ۏ79@P|:sx#momu|y'v>*&O5ZZmmm*jVq9΢dyjkZL>*RO}os0NLL=-ߏ^O{{?2FAv^NKZUrj^Rq ހ>]\H~-iգ{_a(ߏtot~Ru=x\im kmoN9Mtk/ŭ6Úw?O{s]K4,'{{}>-mźGϋ?h ]x~ -t.P{&[|v-|@> ywU%~m@R\~wV?ln>w^*ok" bY?oO|\[:-Sk.@Y&ȹżgɠO,xJº|3$0/+Q|= x-sKfky<)=|> oe[&5+xo0A=/č֛mZ;ϧι\=rG#MxO[S{i|)DP+mzy|I Q,8?,.G ??#cs[0qrs#(?|!kNZ_m R𦃧b rQN0[r&%~pz r~,/ᆅaxrG7W#&36 pz ㏌9m>O x }V>5ﴜ\'>®5\x%>,}o?g>$}>џ~=L)qc^)ռA>?uO#kbM|@P@P@P@P@P@P@P@{|_y?;|BO~p*_o-Mg?ۆ-</;UA?t?!(,# 2{?r_UaYjCӬI^r1twC8sZyuo^ 'PNK*^j,:PUI'޿QePJ߁mb3,m|}}6įLyΕ ԵG,+㳌Yj/QWz]xz<PͼOcRUpuZ&_u~<=l,֓jt쒋n8{V\ThU}}1Ҽ԰tsl;lGÁhc{nA7I$*Wum;86`\F.-6d>&"g#-W VZ;z$&^SZ3o3ziw^'@ۯ?+ ǼҡQ:"ه;zs||&Vկ}}_T~qkR&zm^y$k4}J\ʲrꖺvaoPܙXO;B1 +3z:8yJUZkg(K]O`߰_]~c-L3VA^²t]gZaZjF"ia"ڋF{ (a#>c_d^b{-_] #%mЯA?x1"!on6㰯h;#|v;b*qU]Z^[BZ\5oZ^5Ol36~ӧ g/-់xK<'(>avPӭ@'+m 9w)υ,`Azթmo|E0_;:t>䛎q7_࿂iM[@/[kxĚT{XQ6r ͵ygS +ÿ - 珼KR4-zshF@SA}|w2NRӬ~"nm,j|"۵xfm3G< 8и_u e|u~(0e~xWf~=|mN}g"ѲVJ5wG+){M$jCWFU}sYP]#mX'1=ksncE/Og^kIړүj~EÜAbq9'eO6 ٫ދrj6ZjvVv> . s?q2+~kJgS D6MRQ^QM׫-\Rxz[3`^}WsjkS2$ M-{_3>QVA@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@{w' ]KH:Bj!?<3ލ>{'WOk\" a?7+ռcQ ߉<_ۋD?n) ÿyw#_y><7]/s|:Ϥ_p=ז(@P@!Hu%3ob=%N[a?_ه\rg<`f]ƍ?QfʽguoZY4׶j2: g޾Jeufb0Wot}گ?ܻWR8:a?/ݕ}4x}~_Wü=@e{pV#ogg;wpYnY }c_mmeW^V<^5ϨY|N aQI 4U WA/oIz~}K_z 3 >g㙶} 7zq<|9IOq€ (&फkbS-y$!2G1%75w]UѲ<(lgՕ{gW.6mJP[-ŵǝq ^`] Nooo=;/sqx<~_偒Taj4Zwm+5UZVJj"XVm=o>1>d`zW`gv5%]YW+m[yIfx/gV~ڍ>#ӯ+VJe(ueY{cjٷ''ہ|F/JF7{e8#qTG*՟FX{#gGcc`x|A9 OUcY?mJƵ+ѭm-^PMyVŶ(#X%|o׽U@ފjp ÏTx ó^$U#ּ ;pZBk~B5H0k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! Ho?oEoF}3(k~B5@;[L?߶Cg$Pj7?"vD#Põm! HOA~ٞZ}T>Nqo鄘`Y^&?n/|aP_كİ>я0\G3㗏.<|tm?vq\6?|s@{GԿm]9}xo $_I(8%t I<+H!\{_U-;DQ@G (iZM*4Vطh^ƷU8.et-+gmh6~{t}_e^/m<8.A'L5mu+e5^== 傀24wnfżgp}a_?UuV_֩{[y~Y 55%~ZMº GZ$Ir R5ݏ<pOPg{yB_Gi~q)WXl]ﭕ xfrx ba|:RR?z-PZVBWqkV[)<n}A:UW_/?^2R/aNI{MsWoTYjWП-꺶8H!z?䰧X讫ּmz.nĕ'pOT5_woc]WaWa֭I*;G'#u.[ 96-TLO>#g< GD6eE|љFQLO4G.&ViWyJQ(Q2)Jy]@! zgp8r5b05صz6Jfu.DLa?q_n*դV+ֽZ|N)8k(/Q6p ;61Wg9\i:{%WK~Y cz.R^׳Nk+ZۤqiVom`[0ur =5/33cn}޿M^@n̳ X}`Jy[xGsb1 =< >,&u[hd^ ?O||ߏ ?L^27Oiabh7AQW)uWǚ>c{ ~IҺhO(xl&Q5A$k CkHO Ms `1#aC$(?bk*?K?icig>Q'Ln_09ΐNz/?pG?? 1r+G/u1ߺzZI>۾ޏt׻?eZLMP_(pw_+z??G&W ?ܧ /*Z??_'c _At&9еG{$hLM?c _At&9еG{$hLM?c _At&9еG{$hLM?c _At&9еG{3GH_5qqWK sK>:Q?_&еG{%LMCL:kK>:Q??uB|u14 0 ??,EGHch_?a _Yt0ï(q>7C&?q"Z>zYW8"_b?g帳xC2|C!kEk{g#ͼPxzpz)h7E/EhEWEBx00s…pFcGK]};,N/m*=۫]jI{]7E/EhE?pйB _)z/G(_&.P@|gymc8&)?\?*UTAƗK\iKJ#E/"pl|s.?*^poƗ?4R{?-?+_K\iKJ#E/"pl|s.?*^poňuSDiKҋk;.Qc.o/-G#h p!iHI&.?rݤ"?&hй˱e"|sҡϧG$U;cA`(iP,°EJ)*B_]_/ZWKTR?\/P+?rt]93Zb|"ok-@SVXxo.:HYP#}Vi_E/%W'L/'J>:zҿ_J&R ]Z>6hzmƣqO`mo>|WN Ueǵ\G{"~=D|l _m$MFfi$}+ U`擽K_+ReZ]^:_Vi_E/%W)KpA+^"B_?Ws+U?=!taO=o{{~uՃ@Ʒl&qմ}ltargQ6\a֕RUrR?\/Psd޷ƨ/.-ťmA7+?7_~Η䚯^z|r,?&^zW/+:_hKP|r,?&^z򭆣Pҭ1kJχ_k ?OkJSO=X-}/ a5F_/=>yn ~}Eߍk_~@=XPͿ-*{ ُ7y{KP:ںh,Euh:gٽ.?&~7B./wNܭ}s9?g$_k|7=C^F {o[ZVfQst{ x}|;hس_Vt%$нۼ#㟊;k-m[]hA3jqopH퓛`1j€<7]/sjv /vX<;Ch}>7}(@P@!Hu%3ob=%N[a?_هWrsZe3[r%x!_^p_V⾟X2F}ixP@_ GNmvNGC\8 lA/Ÿ:9?'F*k[Q}dDVE6wjVt.>?yGGldVnZJ5^ JON:5k1|A?Yd\u2>e$l75oݪTИ-B0qG\YlMz b?0#O;>.WIn^T|Dhs9P@P@WWPP@P[?xy5I<7W&h4ZeC+9N%ЛEV(,FwcO-uaC⛺RtTk'gza^dnrkӆY\U{kcPbxisGr!S٧fq E4[..+A^oS%h֍g&t 2M'Y^ݷnwuf'2~) ;Iqq0=fX>g=i֢ŸgUt;`klVy}mi:n&xz(bѣϥ^QzӤg`͝[ f' z9%K'd_&(7A=WO3J7_m˻cy8cm.s|w_PFm/_q]Nos.U_׮#3Uv<&?<5u-yRد0 Ŷ'YK~ᡯ^q&F/\q]os>W_I}=bWm"G>"?09OEWN' vWfo ;Gg AB(0.!_#d>Rwu3005GR;=Oe:+zgW]_u]/m25&cj,;hU u{GG=oCRV=l/Pv߷whV>|ƬK ~kAYPqOZ.C>^C_h~0sH{,[0`?N29|7:D6.+ѿ_`8o=T8.lm}a-Vbm1ãJ_]-g_C˨}c>[2*CanFiGI?mY*4m6KKx&{H3My8 5J?׿]~zMaq^9GIQMs>U jjr.Z*B*ۃܛ7bŷ?qN|%E؅+keϞ:ըr2Ez7N~z+YWt.OajV3o; zO%O ctwF^7_xoxrla_Bg^)̽om`[0zG Gj*>s; 2fz۬{z 8]qn~ym==#F?^^ǵR%Wv!'ZvJ-:55FNגqBZUM6_+.Bٺ۟OQc({WolWdq҆Z5VE(J?u*T+5ZKJ#W+WШe'`PIҘ?͈}e{ȧ)zW啝xZd7B}w mωy7⬟9Y,!^{hejmQhTk5I^_/Nk_3W@ Waba㫪4Su[x/+7?PTًj^Xve}!Psl@#1; ( (&so_Aܕ!V$;* eΟ2_=Lݭ~_t~vgYj6Fs7K(|#.CV8ѫ7g7>{ 6mGP!5i8''~&b+α1~H.Uo+kvvkFrt;Z[馯_W̒p76ڥ\M'JQlk'mf>R~s?Wjd;'G+c+=wVՅŰmy[z:x|hWw[O5B򾉣'cx/<6=+;-ᾮwu[֕WfIWڿR?1/"Kڲ.-Iv#1*P,VVg9.gÙ(VJWxz8ZXKPeCVն ;Wp4o\-2 իn]I>`(9?=yzޅ2ì( DA,${ C9;o}M<⨪::Stԝ\VjѫZWY]ϙGyj328>8lJ =*߿G}f9[x4,CJ5}yJnqZr뿗IrM{jc}c~X7 ῳ}j֯]mA֍{R׾~pPsl@#1; ( ( _ׯX;  ( W_=ĘRXsz=f@P@:WE$ (=2` (:u?>?~G_^AA@P@hכ+>#q\ǴP==6 (3^_XLDk8'E e^'èK; Nb܋Z!C&9n~ЖQNu+?>jZVk-nH޲Mկ>c lZiχgxxD[gM_O{OmMm]Y_+Y`_I",Zm.$H#9Ǔnq5k0v]oY Ҏ Nϲwҍvmf&^ֿ</U?T}W|_p~P@F&q>uB.W㩱^hq;NowsKra5Ӆ|۩T\V oKdY_~Edž~] dzP@B.pkrl߱YĶR˿(t_׻i?ޫ^Zw}I@P'hZgtmOizC( ʶWL&2 FZq ?H='kE\yY 0Ap~Y@}[$Qq?_ +Q 33?"cQ_VGB`?៾V{OŠ??`? ?H&WУggտEA5.쬏 8?|,>O(8 ped(_ggunj:n׿՗m/mo_wM\ ?կհZm?|,>O+_cQ_?Y 0Ap~Y@}[$Qq?_ +Q 33?"cQ_VGB`ʶZ4+0kzc\\^C7t8p،Gzl<: ~Y@}[$WOM(ˏ?+#F0? ?S='kE\Y 0As-gφ2C<%OmoQ|w1XV՝*k_mYͻ^g~TpO(8 ped(i<8[}Qk#6hW+#|E/k_-·`og.?|,>O(8 qVGB`?៾V{OŠ??`? گ$Qz_ +ed_(  Su5O 33Ÿ?"/_W0O 33Ÿ?"/_W0O 33Ÿ?"/_W0O 3~Ͽ qs&~@$¹:ʕJwv{磁Q(0 > K J:cCOu]P_gПgg?EP_aПgg?EP_aПgg?EP_aПggo?}EOav#7#>0?Sy[B֣G _V2>У/(g-j?< _V0QB?~еQ/Q[G 0oy[B֣G࿕Eoe( o Z5?GW>У/(g-j?< _V0QB?~еQ/Q[G 0oy[B֣G࿕Eoe( ᝾б{Gןd>У_PXƣT2okA vGB5?G?[(3?/q? }G+F0?᝾б{Gd9_ 0A j?~C&Ʒ$QQ /(go,^Q75 WBaA17'Wۊڿdj_+[ex7A3ooqEa}\x7@6F$Q}g om=B5H! :r?߅ {jGCu+  78?"7@U?W~3ooqE8o>Я/(5}D)~p/4;e_ 9swwEs:N/wwEcb~ p?>z$Q?/wwEcb~ p?>z$Q?/wwEcb~ p?>z$Q?/ ~;UƒR䊏%B oP~;UƒR? a oP~;UƒR? a oP~;UƒR? a oP~;UƒR? a oP~;UƒR? a oP~;UƒR? a oP>/U QׄQ](p ?_KEa^|?a@kRGBza|?a@kRGBza|?a@kRGBza|?a@kRGBza|?a@kRGBza|?a@kRGBza|?a@kRGBza|?aA:R '// 6>J p w!£T䚟B^?! w!£T? 0Z?)S $]׏CaHg?&B?ּj#J02M M9"}I_(՞\VS $_ x?׏CaHg?&B?ּj#C="7O RZͪvmUxPP_;OQMe]x?F4FfjҊ$_wZU҇ P_ Coqȇ(/? [WED?A|3oC?(! (u?GC~||CP_ C?‚g@=C G߅_0_8GPC?P?~-@+??""C 7zC__o_x"PIA|37o__‚g@=C G߅_0_8GPHe×Gм>u1>%C&z:!  b_8GPC?P?~-@+??""P‡Q7o_?!?> stream xڝWo6 _=͇ƪmwO]lfkmꏛK>l 'ŊN%Q$EH`/IR!h1 4A`op|a׿l߾DʐMK޼۾8}j{sj#KMu g~pof CVE&7&a۝t՟IDA&a ǺQvGLMQ"pvt'&ԗF;}.7$l~-ܶ9zU`D8AD8XUdM [c0Ď$xrx,LŰ[1$ t|Vk]x@š)CTLnD֯'wu~G ,<ՙ c[ jg9%Jy:zݩӆS>*әi(u.XQ:7@ڰըHd5aI2^Bm "lvntqg5c23{0 iNJ ,Q}cF#8ܺhg΋"⓽g-1>Tob6%y?s5֙ gAy]HrYubfwv)N̗7W rApt&yUYBP!V,&Xۃg17U&{ ڽ޷׹i|8ڇ~NEIr]  {SWw\|eMpLP$!x2aΤػ 8pla2^WcpJ5"Қ1ERPfWl}vշ +k =_91H 1 `UQq*[\i  >>;"7$8rt@,L:tU۵MZaܳ$ O^Q k ?+/?$:OI}ES 7aPYִyQ0>6Zk$t2}SKl%8yGePwnug!x)J%18QSd$|*6AZh27|ljV@i Q"'  D b 0-];;|qkꉖ^3@W~Yn*n5~WC\@UɄZluln=ço[ UesQaLm|t۫XfT I}ӽn4"Bƙ9+O> bEqcP6*J4,6깯 ͌{#}}+~rQĖ&R{p Ig$,> stream JFIFPhotoshop 3.08BIM ICC_PROFILE applmntrRGB XYZ acspAPPL-applrXYZ,gXYZ@bXYZTwtpthchad|,rTRCgTRCbTRCvcgtndin>desc ,ddscm mmod (cprt -XYZ ]J4%XYZ t `#=XYZ %l*XYZ Rsf32 B&lcurvcurvcurvvcgt  "#$&'()+,-/012356789;<=>@ABCDFGHIJKLNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~  !"#$%'()*+-./013456789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZZ[\]^_`abcdefghijklmnopqrstuvwwxyz{||}~  !"#$%&'()*+,-./01234567889:;<=>>?@ABCCDEFGHIIJKLMNNOPQRRSTUUVWXXYZ[[\]^^_`aabcddefgghiijkllmnnopqqrsstuuvwxxyzz{||}~~ndin6V:S'P T9+xQ #1@Re{?a Kw3e=u)g*nE9 > P k * W (lM;12D`bT.rc !h""#$A$%&y';(()*b+2,,-./`0>1123456r7\8L99:+;<==>?@ABCDEFGHJK LM1NPOoPQRTU6VlWXZ![m\]_O`acKdfg_hj/kmnxoqnrtmuwyz|*}[;⇀*،9㑛X̘R៬Z/ˮм߿ĵƅX. ϺњӀcG*nSB, Y= %7Me 5a+d_4pt-\R T d G 2 & !$/C]CyXHI[ }!7!"$0$%&~'F(()*y+J,,-./y0U132234567q8\9I:8;(<>>?@ACDEFGHKL!M0N@ORPfRSTUVXY?Za[\]^aRbcdfgGh|ijmdnoq"restv6wz{c|~UV Š!G{䖼+ jZեQϧNΫQԮZi~ )Mw§A{ʺˊ[ϣJԛEٟN&ޱdAv6|_Be1 %7Me 5a+d_4pt-R d G 2 & !$/C]CyXHI }!7!#o$0$%'F((*y+J,-./y13224568\9I:8<=>?@BCDFGJ KL!N@ORQ{RTUVY?Za\]`%aRcdfh|ijmdnoq"retv6wxz|~U eŠ!G{P+ jZեQϨNΫQԭZi~ )񺺼Mw§A{Jʺˊ[ϣvJԛEٟN&ޱߊddAvV6|_B%eK1desc Color LCDmluc itITfrFRBnbNOesES,fiFI>ptPTNzhTWfjaJPtnlNLdeDEkoKR enUSsvSEdaDKzhCN LCD coloricran cristaux liquides couleurFarge-LCDLCD colorVri-LCDLCD colorido_irmfvoy:Vh000 LCDKleuren-LCDFarb-LCD LCDColor LCDFrg-LCDLCD-farveskrm_ir LCDmmodNstextCopyright Apple Computer, Inc., 20054ExifMM*i&C     C  1%" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?'<ޝ<%(;k 6b@[.ǩf%9$5i V);bOx!77sw6qV6<Hpx8tW$Я [m+IcIx.RK*PXn|VjJk{K2I X=_+{%ºֱnږkVW֥Cadw<1޿O/ 9Rswn]tӳ~>c F0MS#C*)񩿴׼!DiZWVsLlR tlAVرC5V$ݠӊ7m>ࡰj_O8-=SD ۴ I7u_fo|^o x;Տ_j[lg< ٸ|%L\#qSWuLQ{q.o'Nunj$FͣB(]gj6w񒠞:Wt56aVT7ן]y; JocyӼGZռK5Z> kw o.!G|*I0 ^?}?:7+[ K/h]{$d>e&J7/*A_퍬xwoTTZ%lc d[M&o"挟wW?gߌ?l>%~-=m-MN?u5]DV1"}5M7[Wi$?ODҴ/׋_ [J\E4i1Rt3=[kQx^w~7co_<O uvڽ=QHei!rt'eIuWz~7N6Wٓ1+|gHğ~lu+kkiQ"Yl*JlA r9þ3i6HxCvt |4;S`. !?bcǨ4I r=ψm/<`ɧ|E#x~,v;F?$ ?²}-KwB]J;>A$0ȡ7^YH`Â5kwß |Y%wioWs\_\VK20[k4|4WyYxwö?o4-YM* WTHʢHH"*sCC[/ĩ×tSQLJt5#O׵Ǚ4m>}@a B 6p'O%<\VRAlɹ ~5Yw|<|o@@mmxMּuq,F 6au.2JStPɃPO8=nj.>2V\OSIęfGû-wKMPnɒ$_ק=IFݾ37eLpW/i#wg=>}.r&kKFDJ(5JOW?|#k o \xú̈́ܬ:;J<^df$O=v\({~֧_mHu6#V}4mxƋs|1BƣlhlW&ڄvJp9M[{wiO&#Fkd#3X"Mg7jriKխkU,LLseS=.fIRZ?&IŠes~| .7G|muyբmZ 7`M˸eq{?{h~v7[Yӵ:كݕp86 +J s= |틻STc|)ŘXH!=w]6>D𞝨x1xBy-'ڵ\Y||8s^,?W|{{kgk{$8I!Ȥd^_(j?:CƷ?%_ I/D0d<nsPq4 aERrRn;,&zޗ)rx^=Þ#W$!|/aK~ndĭl46[qQqKUooVZ[_>;?e/6Qdnbg dz`L##:DݹĀ9Yl}_ >3_|7.Jۄw ZtK@ 9+W#c?N<6}jĚ=޻qMj.W!%+FjxRq'KmE+JVZ^-">4 |=jw^6 hdL-.nJYew CQl}q~S~7"]Ƨ@?'='EԅS_iYDK/$/Χe>Z^|K^(|e]\IT?^'Uц3eJ&,޵SylU_|I|UZb\Ʒjz\OKTc~Z?d=%x|Uk˟]2Zɨ)lrx!x`G`y}_̺)~yt~U|F߅5koi)kjȡHӷ5v?|qC/A%-d2Mg#9P݊ML⏇<+^&W=3m-ԁpE []A;o5_&?uEg dCgenŸ.Nk?^ 3::Fy,.,R$ Kyș{?S7#}jfKs6ڒF[v#wQ:r+ m_p4zxsgO:Wo.mW"2,ܟeP|P|>%HPv\Sei4k>o?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6M+ƍ'ho?'hƀ:6袹܏?E|oo5Il ?))-oVA" 11ֽ#R Z%4PHx @l>I cny\$_]qKMGYմ$m  C`DldG ;|h|.*Ҽ;]46֮,o4*ATkr15(ГӧjutjW写?V->b:n|V#tM= d$_V{m[ωD]:HY"mg :יjKokR3+$2J).u[^+1pMRW_)i{F A'j!UK\1xN8 x?f4 5Xu\iۙ<N$b ?^ ҵ{ZHYYc8ܩzbYi / X<[xr;c +pPN2~#E~?#aɶPW.w?/@#|3Id8dUzƾ;w)n^?Ҵy_M*/ [sPG#ʻ /]?)8, a$%ݥբ4W!Ius5MQ\ךȽN k(mCı3g}מR_Gn4g&lܧ<{Օܿ5*[n}.y${q]8'&65xC_ڝ#<=8xcfxv?0_*e৿'@b@<+zXǗ<7z~͞+[WF.Gp* FFqW².otϊ !UV? L'2xKJ1fw7~^1+<.7;ujI55K}nSkW%[·=k" _!=:!nIJm¬4>;;elU-rg>ҹ˿%{m:~{bZG|D88 f8\1Y˷붦ju#V~g|W+oE.}?wןq6CS|Vo$4 *oIlnN:V]wܦfB}M|? ĞEx^.;awsNPYzI&U|Q^eM< rɦxVxDsGJ&B9{sE'K6Ϗ[&!P{.IuS74<&Dį+9Q_OhƏByVY4kEԷ:aeyfو'F k[}o꛼ᛲq ڿ?W Ycc鿴7M~1'uѤklRj@|Z$6'MYh -ce|wzsTwS^dE*ksy:RGo םVߊd~oclm X/ ;ӊn?$V7? yF? Ί.OIϩ'u#֢[/oݦK@ګ 'q{TuLrmoGݳPcxe6λU |1x#8?^G5OǏ?ɨxj?هN<:\L-M}H>v d&b^8B䜱}8aNt-A?tnUt״?ox!}ۼ_A}Mg1|z{[kzWu-GO!6:FwC.6xnm'ehr0YH8^<7TYuE O_=~(~U;CU}Q!|'wּQo:վqᩬckmcLsm V؟0cv#e=^L6TW9&;2 *n\wWkW#N'Z'-ߋ]h.ßO^9Hb$o wÿy;ڦG[g4J ~j>*xFƕjSjs8嵓i16u:XZGax~x5+6 |`n Uk{p~K'ӆU"f?|[K zgu 2⿋G+x.uM>orWQF^612qϰem뚫5!vN9WU%tƻI؀n$w~w#0|?Xe徱#zCB&G:_#厩 N\|T\G*+ }x?u+8L ^Ob|?XdrѸhI' 60FOq_[?rIʰŇ$ u5MY ^eo)O쎰PI?HRb^W#Vkm NQx>/k:20N#8kɮm̯ H?* kS=Ν|#RrU://(G⟌uŭ9FxrbgAl鞇//*j^FUH?Xٟ8}_S$G#kS)&YO*?a# :9)[W~Ƒ˱un'/HG_ #!k;FEX6<|/8xLnVDU^+fSg%+¾&⯆^.tC]A{`Z[GHaS!T`=m6ܚC?1$_m*Ӿ hL]?x6sVٿh?3p. }?Kǧ<^^-6e_ ,AuMfvP{~3?jzjs1~ >сA]F5I 7Lψ~b71W+^3z1-W4CUqQ(q>}j{.Hv4j1O|g+cm)FXҟ%vOY\6m}rOGij0{](DL LiO3 J?<> x+I hqnE!'u˧jkKOK?7.xaK"RT-"Wey>)g=GQrO[[-D1±+|SR z<ԳyGQv--[?Rړ2i<_:'?,GOK?7ƟڣI? i^8/w.?+CE̵yOPmR=b`Ob9Kw./9YSq~k{n>ÚkEVYТc?½b{odrk~^k٬n,8i8*}GtL>Z~Ӟ o_k8|Xd=~?Z{]Cc[rp;2HVq?P<cYO(eH̝#]| žk;~mF=WPKx@+@Z=o8ŷ'sHd_@PTlql0;5?/k+_e~'yo-m9ŷ#\7?(H!=WQHi±p87gIiQx.C12uMz_(q1jy<߃K'?0ll=qxOG~~Ҝ"WeRWDj?ßHξO>dړX~ҟeAȕ?/y:Ӟ l韃JHUҥ<@QiQqNx4V_` ?/^(Wq?g[wBկ=[)sX#in̻S#>_ f_|B{X)561Q=IJ$0!#Y+SKx- [^-$Ԗ;mٷcF+k⯄>(~%5Z Jgtް4.@䅒4$z NG Iҽ쬅:rt7|F|w yU7ͦV*Y'Aϩ<֟/ǍsÏh^//UKءQ0^o0"dԊp ^w ͠x.B6]+DvJcz  &o 5Kx4{<1:;hݗ2~F`2}8&g}8-zsV*x/>x'P%rrKJ^9ӌA츻0Ͱ(Oi]su6x5}t8?_AmE>ַV53zօIͤX_3fiZotq 220Jӳ_{Y,tߍ:Gkmt3[-c?|wC%|cKi$$TVA< ?G;FCʀwB?Fm "ܮT ޳w- uh~~ ? Z'|xUg!5I]RcařKnJ*0~&_&Ûk{3W #jWPě!#DAA_N=)sw|g S$,%.|]U*^[0-k~I6~?MOX{j~|\;2_Kž8mkD'k_j=E-VCwGyXR}Zƿ?< heYs/ Z.0ȓ$K*@Ѿ|pׁ ETw݂q{GEHV4&~I`dWbm}}$m <^ԄEqټO*w|f">K1?K\Ծii;O/j_jCƀ;O/j_jCƀ;O/j_jCƀ;O/j_jCƀ;O/j_j'z-CZT2 v܀S^ R"? CH.r^5ܱs`qO31^&*vc6 3SM ԿY/W_@??FcG| U QUul?dgGgU]Y/W_@??FcG| U QUul?dgGgU]Y/W_@??FcG| U QUul?dgGgU]Y/W_@??FcG| U QUuVG| U Q@?N"toZzUO<i>ՄH64F%ֿk''m8c%kK|WmthH`Jʡ|ǵ|s}FoGeI:HSI~kZω~9bS11Βof 6gasцy?Ɵ Z_ck]gP5/ٮӄ pm?r RNcW𿇵v;Icίk t-ϔK]H<4Kr9iIM~uO#RhV#nPŚbC]\]D~W_#6iGieTA'[M/ֲumÚ4Bj^.jcgltάN-xF9\>}Tҋ1+{7'l{?AjV>){OVgO,4H;Bdww Ny7di~j>Cooip5Q \igiI 2F6dU]ޓy|-O<+ךV~vۻRO #د4e<60JpQ3"m,?,|;ux%ŶofhK/d6$ c@'! +diRb8ٞGDEP ,Vݿ4(.ğcYQYRA 6n~>$|gk]/:Z4NQVkjiѓ"E$`L"s>/ OcI/k)<7ZΡosج-F-cQ²"IrߨVof_i|OE J`x&:NZ+)7BE!V4d[[HEF1;F7;ЧOH^Ŭ }(X%?LJ,g+^+N( KVѼ'5/HKwPk 2VQ v|#F,pg,Ai]Ɨ׃5^ZwL kq$کf "aEwXyu@-kY$vڃo[1bBWz~?_.W=(?Nӿ-,dO`m8%g#kG|-޽3Ǩ&w$RvZ/ [KGK;K Ou8&"E#"dS >x#:xZhOs WuNj+I˱]B:[FhfZ0E>ሾ [x]] ktŲ9#6Ts@&?$?;k7zJ_xlNFCI,LcIR]֬]|'dwm?a-ĚP-gӣI D{ym"I-5N1t够N i[e?ijr|Oӿx7BҮ/o<_K8"igY4XA,'5gN[?o>9WylMUFN4ໟ\m  5%mSU'|GVNFe eqF&-F2Ok!Nsaշ!O$⮤dE0F1뚭xWZ/4P2 MѺ[}ue#R;WKx{<-weH53LAbI3&wYX8!5XxMYAҵ-|i%֩qmc!)lH"-V6QURF1GH&/OSW6>mnlağY.<6R6|%&wڹڹ("Zxnw~=IK[mJIa[%-X琻u_*-_sd}in<(|5eM` F3wi?'NzgNZ#;BǂH-ּ_hѮci VHв\N%#𥦟kg%+TLFh04;E/0&bZ:qRS<1w}[ðxKm2iU'2ci$ F9"'?Rf?d Fo<7K/trm>&F^73~kI39ޓOľ"uACWWRɴD-yG?f2*2E|Jt#~>lͧ[ 3iߊe+7VbPܺ+rq@y_O{&@ƷWZkeV?FMtv~d0S1Q:J9!TNYvɹq޹o6KGx *$}]Fp~jF},$+za:?~j_?n.Lgͅ#=?O€b?Pa9'厔3T>PqKůt&8 ϊ,CdeiFv_&ϧ{P_`}Cϓ5?7_l?cNgpO>*u}%P٦ERR㟽i3q<8xm3? ƣ f hl&S׌AiiN95R xkz~e~{,5 #Fb:oϿr[i-}s <}#PBmvK:(6b pލf^qx KOg;jC-/x.s;k_g? x_Fyq䳻,䲺`f(+U#;.x?DZ@Tvg)Ydi-%gi8Y3MžxOwZy=E&K]w(`-x$G*z)w"+/'~x#оj"0a^jv\+S,3N)`5zk?Ӽw(uWfv!hOGb6`$WK]y[mςt{[ gGaQrHd-9/þּ KG˽:;M$bDZJ`y[?  tޥn$+Y,mQcxQ-(J/_>|;{ruN i2X`%Ki- #z&_qJ]oU{4/ xZW4?|Huu)񽢺89R)0Y>0>-o|fV]NbV'F$lr@Q*Jo_vkz6;IGRKG(Y · mb1T>6<i-|9}K?%~⛝ /&EGymgu,Yg(TH76]Ufq֧mmA/EZݾ=(e+bb0+d\e3muf{$~"A׺ֶSo'KK #DX)t[>|FMJ~w#%3[K.-:1fs-I1$8X-~WFb4S(dAp%uezQM]7_k*5egiy;URlIURNEy~i]>7Gxo2M4XKǺt 5/ |D~k? 4=3.PfA;,G/nJ&Ѻ| 6 ^?b }-ٰIu6yIn ,͍ feecOƿl +[/' Ad,ڪwŽ~3%խ[;WD[/)Guf A u߄zޯ΅;U,Q 5YFyqr ؽk>V;M RYKy,SۮϗO$ y<]scuo>5L|EvLqZ̒Ȉ]vE"\ n' $M߀m;Q-/#*֝ȴix?SE;kݎ3^i_ƓSπ(w"ҏi3E돽-{ 4ӡ_ʀ<7-(g>'}iJ<OѴEp?~Ta⿕| Al4I-ujK(h3k偱T1ӒF Gxɲ$r# ['ƫBl*RccoIqq?oR8FYIӿi?7λ9=̖:f፝#\!WzW??闚n4[OHR4{-E%KYg P&慤4Ɩ"t _^XJݍ;w k C$6~jU||X&ðM/_9"Q 6oox^*_wiE 3Kl_Ƴ)!z6T&}$D> ikK|qv~ok?fE>RԼ{$`rMt3Y]w{ r<4V A~Cƫ>>,g7G&I*7[.c>sc(,ԟb_h0hrp|n(atb&=|L?>7km. I؞d|6)S,(B(ds/xZ#^hg5-r}9[͕w6r[[D) &Xy5|EceOq*nm.[aҳcV~>5*̆RAڭj_cB 5wOO NwǠZ'.qygoj#xhr]y#Tx޾K{,ӼaMkos*Ԗ^( 5Ÿ*x|߭IG_Ç2úJͤ{i~u3(,nh<7qgDZn 觯JePmGuk%ŷo)QU  rͫx> εtjƟ|FhM"WDpȸG~4? !,X XiW7ڗ++xK{q ffk<I'/xi:]3*|{iŮɢ=å[u@x1\&=|y_?|BѤt?xu(/,Ր5UCw 4\:5זWcNBH .v:63>+oBo Qi>_Vl=Vk]8kոjB{_?f<8z5> fcƥ'#EWZ m~/"?BK}I]m@H +#w\tw\au0@cSu7F5??n?" ƧAs?q?n?"!u7IO9(OEAO7SE@hۺu7SE@cSu!tcS|( j?3|(w\atwGP3|ƧAsGP30q6 iEf,#v{!-}^e XwэO"1{\ats"@.d/UCrmmU5Y!&i@m^=V(((((((((0_?_ ؓFou)l;YX-/?1PHdk;Ʒ7:_*j2ym Q~%e8 b?b\x_ G;kf4WuE)Aҿz?Sw?t-z妍YP㸸* kExxU*{=#+ӹg_?=?_{ׅ6fUO{u4 >f`2Np5gP s ޼4} pw+-bCt6DPXƥ+:ο@-|b.!y,拾DJRcIap $lX |^&? ]Eݵ_DU"u^}Eo+E*"cL[6k㫡?TԡU*Vа"k`C8&??/K&5+HyaVԭfK'i2QCe $Kһ7ğx =+*4L(tx^7u@ڴ{?:회Wn/:js@3?vcī>dZsxo O]WֵIk]BTWG6Kg4t!|7oEIxBoV> 4]n]jIU] 1^hDSZOo_&R\¨]@7x|G~퉿k?>!|Yφ.KU׼0,:ƒ;l!2J"tYYyXx:|s; ?:z); n1'#z?ucCKk~5i]˫:Υu}F+k?-ܳ:[i |gyinb_YxTb-F KJK#M* %#tnrUԼ_6g|>iqxLȳ̓( v@x9 5j:(?~KԦe lP7zuP~8)Ѽ m#TfhM*--|7 vhk~̈mϑ0{,y > 'o~',K]Uw^,<-*Oxg\\I#2lKXe] ]A/Ek9Ү,#0K'aaum/.]mU uw'ڡU0~yqY@KH]G]h>0Tz^ GƋ6߿u6W'j(%w xľ,3oX|-}k 5i#e${Ri:_~:gjPY\ت[+hX58!~C@YZxOZ[os'cxoٚWAⷎ]CD]s%!ioGLOOW(V+V5Ak}A$Rdd,{ZMix/j:w@?|~:~nko 4p&m-W%rA^?G{3(xGPc4ڿ|/*[dkU g@X~ O @ζfΨsfz}Mr^ k(ϵ隲hvu7%V28er{yfnt(=|9%%f~gkZ ~;}-ovFY{%?k'1b1 ;Xx:|s; ?:z); n1'#eVիr[>iopvOmʾ[ǝR񎂾 ,.ۤV<$_=񞅩E?6_Z֡sQ,m{eH4وUU@&oWu|O-xľ7.}Cm<^6dT88{ZY5jr|#)x߷.Z .|\<~<]xz-?ךڶtt'Y%yc+KMjY ZPwkei]GOhn-'I$HGVR &$7/+/ω9aڎ=2{դ"2{LZYZؽ[+ I[;"\r[dr>mE3UOoO:Z*$,+H̐4#P+SW#~#MJK%Rem &Fӊ?a_Iqz_&VruTz_MX[wvjR5֩^֣rʪ UP8T4EO"ď'<71q!zWKY{wOT7w?yF@׼!MsP06>ζf/:)lg\UJ>yYWKI࠺iOCFuV.w7dmJ̦['KE|mtF:{Kow[+[1?1ݫ#N8Z!ۿgzvؙڽp+S_6_< ?m6KxX[\^XʶmK(㉳/@9'ͩ kZ HY/EV% n! YJ̑ʪ:oԳh2wW~%/mtk.c=%o4.R@2jt_7>NS4Ab/>gwhO߈>+n<1ˍ6oxWRdԴK6lFb^2#,e4=EJ|MG_oj^1vӴdT&p}ס~7? 2y}/V?" fh=X?"+/G٢c(h=fՏ(٢}/V?" fT1gOEF"A\S?"(?"(?"(?"(?"(?"(?"(?"(?"(?"(?" hS-hEg^KG_mׯhG(?"(/E>uо0*q^g k=v=sږqqAw-Ԣkp,UBg?~ο ?+S+[:(.`Xq 3;G,Q(DnIc)?e|><;gx|Mx 7.#Wo5;9.WY" Np*_A+rybr8@a@8E70jo~5/kE5MQtצ_4-y2MnO)*?I4ml7JֵKva=}y/z\SQfa T% Iw_/ٻZԤizvyH-y甅bBGrHQI>~7|WCP":tMkqI!X~fUFK#։w} S&]dԍ2xWG!E ^jww.h:Vkrϯ~0!i~ qo5uaڦM%ܓ\k+4#m2+ӼU~ |mx&tt+hvHlDQ%?t@c|s5^>xw~x.ccp?h,FEEhZ_t|UeM ȵI-,n'd VpS4`]sV(M5[@x;^@>|*trI$u*t~9OVz2|U%o -umrF`SRuKu}庤n/^/ܹS]amnx_¶KYs;2O#H]H[|n_h_=O_Ѽ1jKlAzd6V@64T$i,+ΖӳGhjmžE6CkoZU~/~;34{G_Ib -ORmYu]9]a5 0/,22.픀MnWugW=oW Ӭ~lHF蛔nf^1C@?Jy'?>Lx?]P%"֮4wild!'-VGd =+Go~3t6?RI,Ν[m=cy$Ŷ+!> koFk@Akc[A{hZtKr3K&`H u"4>0_@Ygk gu.Q:]̰\sijGW_goe2|UA-^oi~i>k$yeh =z}亯y><ŬxǞ5>xcXDNw<9z1ŠaAo ꨠo[=ֱk h9Aqy 1:rk|@eܿtPs=/˩|խm尹]\ƪ {(8#[ |Mq". 'h~' ?@}svZcR(ؔ&7 8ݣ<`׀?EyO ^վ"xWY5TU[+ LR[MT}>/G]mjt%1թJС)H~؏/ҬdW|Fm_k׭/ZZa9kI"?7ZZ?7ZZ=?ژL(Ȯ5wģn֟fEjb|?3ȣ"oGICfGICf $gsFEpxo?xo?Η_'';2+{ğ>kih{ğ>kiht?1? ?Q\7#$[{O3G#$[{O3G?WAI"Z'F-,&mY K52&gҤ䷟T0n~|J>%3kGF ~~758t+?NE﬚ ʑ J,$e :pЬcIҵ z·Iii=)I"7^6RU}|_ƿ|-~<ƪ&Y{a}E$0\K ! ?PЯ}/s;D Sӭ|5=떳èIiwn5g|6 wH&[S X Ui*m<΁^Gf>%Z}֝ ~S^e'wXٷ/-6 ~>~~_'h]ׄ nM&Um=.:$C8U%_־)PԿ |7ax¾%"bH e/RG4V?:h{$y_xu kUnt^#5#p6:љ2)K/xf^cn ~Bu V,IdFivfb;|9Kj0/09iwuHŻLMjڌW+Kb8{|Q];m >g^jEyvqK<,33w1©#to/ MgQ<=ka-C.S67V&smywv;>lD NW[@xo?OJ%}R6~n.->hX?1Fv\4?Ƴx xG-KA.Jo bEBV+PWI %YMGYi.`futY-xr|QĿ<U֯=CKAeg`4CA_ <_N^#aD]JXd~̒0>|RL?$j-؊h%{K:|t?]KĿ <|5s)Ljn5'2I[AM2BmMg⏎3go6>*K};P7ዘ-.5/1h/o0}h~9ǿ ~-T)Ԡ}[ijvDyjv[2Mc*HE}{x6_o_v,o~V" ӷɰɍw/C' R𽟃_4-Y.E6ʦF>cEk ٗ`F Ip?_~> txƷnkkiݢh:VbX]!kS1pEy*>1 ➷g<^&յcC}ˤ,f֬ش032ΡDy3|%O&|!xrĺwi0ip7^jP}Gwr w$ί+ɟ~>?5>oÝW~ Yhw߆5A6Z[Zo,Ų2"fFTHy ^, / O _h+-[y^ԯRIq0yi?޲a UҤ΁ k_^h )KK{+xgv& #?"=25?9n? A|.໴ j,bĩi'Y&IQ9|VO[ ?jڏ!BKif3GqqVlZKgP"<m[_7 WW~.+!b[YaĊ@?ٳKY5OT_Mq]Z47q屃D,$t f\,~aaiw_5V{WzvQAӪ{!"DlN_.:į:oR@O/UƱk/cl-n ӢKme1FnHcXD@>|#zo?Pn{5^1ق;ۋs80Gmhn%-`I Oi:m;XP;#RE X'DȊrAEsNs.}}Zm/T!,XUt܏ehfRjVyjz~i%ypq2A!^Id$^,hQYvZjZ]jp[ܬYNaq1b6 IQ:ijvz]ش I$q42lc i\?m_ J+VK}h㕔$SF ,2(N>*%fҿ 6_&I!vPynclnd'xEEgzkIws\,(LAf $HEm[J<-k&i%ޡ_\$֐FYDEH J+3I iŜZ6w(u:$ G"+ʲNs.}}Zm/T!,XUt܏ehfRQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE.r5$\D@>ٯ4ž'%կ|]K}BV,GB ]7[DUxA@1.']WQa6ͩs4^D૪2|;]|Z|^^tIO2|0+ү.i9/II~L襉_44elj<8>SgU[Ǫڬ~5ir0xe/9xO _J8>$?/%W]zBxK?H>>_r_`y'>A­zkg{Q\x#< 8>mܮ?s}NDtxTӓр8_{WRYrMJ)+w|kSEV%+#^ <:z:/&T kTXZ_.?& \߸gG?d<;?W t_Mk??&Zе ̏@B]G ^ Sÿ.Z \߸=$گYT it_Mk?&7q4{:?-u?H=_?<:?REsm Zk% 橣麌me{?n,llد̖KwT}x#Gռ?[Ill%dCi eծ\(m 0H[ ?hu:~/f/$ۻ?nt OW4OKneխk٭F~L3e__o[P+7DMn|=\h7iKc.7?q~f)W*CN(↙* fUunO GNk˟_j->¥ '\ ǘWtj,i_/~VI_^|նzcO}NH-ԑ,R,D\B_?[>1/~ 4> ͠U|G48i^"@FPXTxY/d6 ][Lާ]^ E治-,K_4W#٫MğU|w^ׅ߫5=MBKI-k;IXd;dᕔG=?g[_BP-j:ij\ws4RI4$#3\(~Э,xO]i> %j.h74Jn<3rѭ^g_V< >'qTѮu^(ƝhZiiz؋z5,Gi06@Q1g*(R#G']0<6F.UnCXs(!ݚc _~,Z5֝ztX.s-Q@Oy0+gY 5}'J)Z:&i%ۤpH$Xteb A/]BkK XkˇH"gY I#3I?W ?4_8|HſڗyU}Cz޳JY44 Ggams6. 3(4yad_ h^h"}cUT.$I,vډQ;ba$QFi:^}3Bд Dm#t$qEUPI{{xg)Ϗl5]i|'GEh0xbZ;5]  bx%o0WCWtš~j6Zj}OowRHWFRU t2E𶛣˨Miak_MypS,3;;1$)L?^)ϿsGo.ğ[gP~<uĵI}Q[]GKm %MXd%-Xf5K'i. !gmE(aEh:F4- LtM6;M?OH- BGQ UU@>~*kW^6_[O4KgccB\iDQ.ﭥ9լHVTCu桥|0<3+ V_m7i]1%̗zʹqMw. !3f:D)J/U1 u>jsZ'KJWaRp 3r)k[OZck>/PcY&% `(FonEP+}]x[C#MUզ/-jiHf)ᥑb 4L4" >JˆiZ|#C8ѪE`OON|)_.Ή7>t67> : GrfKe[H% !7??_GQ???|m6l}eiZv^ifaw]N{{tgXbe#0͓$\T+_𦧡knhn")cpUєe`A44q|u kZwƟ c:DZ%֧GuE>ͪjO$]K%BQ"5'lP 1(@+߷҈ ~ +߷҈} ~ hc(/fBޣj-?9[ZX ,{/ ڧOF,h?3 mg!Qcǡ7,\:ͥݡoJyc'ωnn }/n82lq c1֦:R}'(e}/ v_}r8\Yb}q+^U?~_}>Xʨ]/i\ˏvz}`ѼK3fœQH$9N:OUU5'Yb"h}(:z*Ok/?VR[ςr?q[2io `p?_os_CF{YƣMOOյ H`vR4Bh䈺Dd W=O^&G/D63fY M>8{< j/<?t]iswLogZ (t=KQWe6$2 xQ_'~<3|E;yu%P$#|j!^?! x{㯂|&%~&@ԧ{EZG%n krD xQ_?_Hd KwƝ:E|lm7[Kw&k+K ܴmyп=g/ď:m~]W3x^8,tk MwgW_%vB4Fs<2cv}{i+MA-Bv-ts# cY])rO~&?߉ۯMSICvڀaT($M);"9(vͳ}oᏆrtpf6X$*b;[O`ҋ 7xwG|:3i|VP' &2Ğ+8TMub0Nnϻ׽3_~lt jp?ue5#v{Ǩhyivvk4^\mVV` X2?|+u #֗  #qki!Pó0(19Oyp%CTc{wg􄀹+6Q/k֚wlZ$6]":XA|Ao⿉:o쓨]}ĵBeR$;F"jGaco4b=F˲b|э澽VxWz_vaJ'ۥ5?IC s,u++BF[rHB%?Tx/7^(7ZZ춶wDI&P[DX` 1WOx*ũF;;_^41_3q2/K_|9mF'K6zjL۾XU[m' y |PM_Džu=ĺn5+[8ma .އ3pV"_֟tis+^ɟ\|'~u~񄚗t+Y 跺5֛4Ωs;MlblX!4n~>|N}Mv;k>>,u]Okyƕږjַ%3MYqpF`p~IoT1 m-}ޛk{mSھDߏ-W޿=[~sxHmkk]Cv˫25˨+6ށw|B5B|/umR-Dp2;hz%~<@u};KMM ưGqlȗ%d QؕdLܚX^he%_nsA .sDN|'m⿉Zo쑨]uıe4ˇI)w6Eԏ*h#%\B]r^|ъN_^+kvsJ::[ <;i^%{t1.!Kܖw:!h-`$! ׉tSI[k]B;bi"W*L 1R?$ qj{YnvvY2= [º]^]kWhഹ} J,H!yBDf621Eʋ}i|{s/+'RGw\jzwMIxRhP$R4Y%ZȒyD/e׭m)+ίBTj:shGEFaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|V oW5A}V oW5A>m=v!2~UuŷA[[sVh/;aؿDo ^u(y%ʼn=nGXx`&DDZ;F\ jZziѽ2.}\ڹմ#K}J!VI LY__1&}O>8t9<xaa.LEyT}#%tFr7iac۴Vve098ҫ:WPϑs$cQ;r8H4kR|kzfܛ-84=yg{` ^pr0p5I Ig.3yc9$]Ԟ'GISw]>i9lFA5NO>Up/?İ9/<`w__9o,D 3fI8PR]:[qFgeO AW̼*lo B93j{ns"My99l5r*JfK}Zzs7rJ6w7~/D;G!z'ڥ_I'  KX_!ο̽^wwv/E?wwjO;&ø G԰Cu>Ke.|sw_v|SΝo~H.=HX׌j" >7O[Aom3*/8I ||(}TA,=B{I7Q?KX`ʾ)/^~4u_[BiMu#b 6 y5 *-NGqm\yS혠kq.;tVVMiv%K` ;aXzn}O!Ǜ'# "*K:~[|/5UյA gkvKjzFG0ͻب9|@[7~ 3t8۴p*7č2<F^7Coypĸ?3$Z2#X?wG#ox"E6kjGÖ}ݷ6_;V]i߇zl?a+ cؾճ,6}6 Mj#*9OӾ |@zؼYKyfFT~)i+c}[%ޮv4xK8w_.O%iaE>]gעZZx@Q}m'|mOj~=o4OB\Jr$iɵ-Pr+oR}-k ~.ּ [qky[z[ݥ 㺎;Pp05||$'|wxtya'ӤZWX8d7PflkL}F_ ˪jn2$dB@bH^t+N|ѷo'kХsef掠s> /.<|ch-]_8ZkAe1P0H?< o|;o3E>>{{+E8na8#XYcKx$T$~/u}`ףEX9Au sy 4}v{_ZG?MqSqܒdb2R*vKD=S[S ~?|'mc?zQӾ wz}ʹgn3bLcO7̒JG^!O&Zmo?5lַR,Q: AkkϢiS-#ؓbB7 sr|0|1|<1h"kC>/|1𭮗z|>KJ%[έ#+3g5x#ϧ֑*>%דP.e%ƙiҘn3C9Kr lo 5|?[i7C+G%K !wBz![*%q?OҔZ8i}}g n? inciecXEip.m3-ڒ(Hd:EP n2YӼK^+RXtQnayRRdWl<יO CZϫx|5]Mt=]T u3Pd͆ (>.M.i߸"_Fv*yjZE(;k5ۓ]tIVRxnKiy_{k8[OX|N]"RK>'q{kW@^"T@RŨxb z+ x~D6"t;s P*+?h ]'^?tF`.%{Zue6cHSx>rPQ| fik7?Ş}#XׅȲEԦKi#9GHYLhJUU; ў'~ggѧ{}cj^MF]Ү̸3Cwk+ D}3_j=k(˥Vs:).% ؕ+/ SᏎu?oi^)Jڵ׉uGMcw'LG)yYv:H~*=+NdY{<‹ʹgE$JG{X4g<5,Eԥi9%Ky$5}>ڹVO_5Wƀu-V}Jo%*ֲJr *P+WKDx~AqSw>d>F5'MWcVwPx^oVCJtb,HiJ<s+1T⎧F=*$e&k ) W!f4U$x`&2)K"|77/-//'E7 tԵ[Y;a[Bk$.в% "{53[/ϳ Fq=¨2!$qƛNQEhc'Ҏ$doV:(((((((((((((((((((<$[~J"k`t ~+߷҈} ~ hg͵]ATH/'1'3{WVFmR<#Hv2 <烛V3mN툨Voc\V,qI' 8O5{v?Ւ BYa"sFy@>x {X}*fv h8'';RFLލ)|pяIJ2?jYrQCY܇ 9# 8 ޕ5؛/+=?ſ8?sv122?*chP:i#H>QDbg8gxŵ?X -¯q-p@$tTzs%迯yۋEyA^^Y_ o?&;'E{;?ȟ//2`mg9$jl&M(O-&x'N91[*0Rr{l<VMO\u-?FI.B 5/$*F$hvZ5= ]4kDm$4t K+e`A5n|៍2B>E6+?k#E[g,uEo?s5Œ{G XVEU.V0I p⼾oٻF-wp->&kz}խjwW6x.mmVx]NŽp>|Uc^3ix>*EIOW76e4SMkR&x&i8]H$/k;_/׵O|K/چa4`]#X[젇En弱<]( ( ( ( ( ( ( ( ( B KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyo Qs_?!]/o Qs?!@kms x.<,FXն:>Gh?#0c k]YYoŗiԯ?Uol# 5+&5AF~f3. yS:wov_v"xϖ+~=/Uk2BW¾յ(lԕ;0V&RHAOo_yudxIH:\3r F7n (Pj-WQf3%Ï_Be 2P^F!ɧ^# K76?+'6W(?SW}-gٞ3p1(.FoKq}F5> WWʥYPW{-:kÖ,3ulz1ʸ-5Rw5Ǘ>~Ig.;ohshn}c6N>ַ"ARaqI8AvQn/Cm-;MN#Lͻ@~l Cs9߆@[ yuyǦ݇wsjZh_WVc͚iB"d2I,|qkw4oECOlצ6$@#$mR{aJ\Rn~I[uSӛe0[oOAH3IWֻیg8Q ?^@͟,q<)^~Z~jknFǮQ2(8 {(9? *;/Lml,tm-b0ETP0+^fŜ9GHeG$`p'ԗ_9nxg9Wkgieaְ(@?ݮ I$N޲-O(O_&e??L`w#]Kot mG1 HkO1Tݸ+o~1ڗMV|ai?@<{ˏIޙ cI*[9fIS)m8~Cj/v յjxTko[[;kkoghM@vWη|ChO5[/]kxncvcɎd2c`^7U{B3#?c]|3irIɩ\qer6˹=CusN࿀+}+>*o+M!g X53`CfD~<SnO]Cþҭ]`pח2LsҷvKo<_~ƺ_|gjwZFq8RԭeZw9B!X5[fŞ^Y|A ["A7L6O7("̼b3 _ j/5#X>.xB?_x_t %wZFK-SPnx? N(w#v#oniujgŖm朞!ғQ'<1ezkxntmVvh$JS7FxU,~ɨxUMS[ΑtvK&vɵ_fb|S](\xφ> h ڷ?2 Vc6M /  ~X|@/[mWÚmMIX.h3+G+NM5O3^|߁?ζ6ƍΝG Ol?AtkDU|>d?Ar_"z,avG(nOU'AhM2Mq4"AR  U$L+գJsvGj.+KHd 8U]u#EsJDŐ22 ;}w[xnuc1- Dɋ=FPHUTDJU/B8i65z_*< GQ lA )PC ɳgF'ս`;KZ+5D(eRPA 3S`AEK,+ <#31%%$$I$MfghX!'31%%X$I$MR5{[H]-,ն6s`r71*[vr( 1d}6K{ gij7vq̚iB"2OL\|kkrÑ?"Lg28e*H$ w;j1X(gHyo|ǎNuݘs[4yWyz4| ~_ ږ1O[.~ycC;ƺuF܋M2Hi% 2@;UVU\%fU"~QW|9M;ӵR>]s:!d?(8NzuT})A;MrW>4#i}F7(ml"i\l+' GV/ov +NSYscMq_iضDׯH`*zerN/j#BGP ` )l)P~9}Lw/u~>Ko2kMgg,ơ͵M;+]V"N@2@͗u춡r|;vUyzGH+ܤee+{X"$ h*0ھ>uNI!]],QGY,@HQJ:T\ʾn]QsIEdxWc~ _fJ3NI|>Tz>U88B?¯x7~qjK{[xYgmv8^ٹd[Fƍ}7xLh4zve@c-q8Go@O-wk?kRl̵l U4qE3ۤ)$6+I->Ь5m-dm>m)1,lC:A$#igq|Cg ;uHa^:ӤSIek4 b+X$!B#e>#S_ֹ>ux[ZVMbOkg 4Lc-*YTF@;wZ'<#Xu n>c>[tz,0$f@Y!Io~~ٿ?h)Oؼ?-ws$5xW\ռk}jmiCcg\H~滓PY΋Q|i񖱧|2/k2鶚D:\=H6eix]:z{yP$lbK'o| o <-U ?ŚC.e&?.--->]@l-̓HdLQ@|;L?g}?J4_i:zLj&KLZϳna Фs,S5u-7C{I~ i> ~^4zGĚ޵6(,බ1 v bBHhx  <-/xŶn%&Ɠ6OE.uXfgȗE+N>ᢼS]',~~(KIu6׮(NYwf cmG`c7, $|+tkXZ}RFiV:iJu9 7W˿1k k>Z^#'xluuԼ=kFc~r24Q\ܽ_Zz|aC<_*[OvE vKr#9 t\x 4o+k_ o ?>#Vs4K˟a,wlg[%cbU7ğw2]ɦh{mIO :.IuإT I:@%+_>0U𦕫j;iŜvg.5biVn.ωw|m i]ldSj$-CX}6\R0BƲ!eĿ~*O>?7 xJn<.}ˣG\65]ݥKPe_>~˾&Ov։ Qk^;%gLb]G<*Ɉ(g,h( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jGY'2NDD$*K߅lɪmyc$k Qd@,vPN"% Dov/=\xe*\ӻ#xUR~Ǫqڦ?tڠzt[Sԯu-nWj:Pb A4!NBM['Mމuojz槭McxB[@`!`A r(omEaaoN31%%,XXI$F<60mrIffbIf$,I$I$Tug5`">vbPfeVqn"#w$k:rgg u;0wdkY=@Yt]8wy?uyxSngj"rvN2I,ƍg'no/ mD\NI%}[VJWuyqC2NT39$$ }Ӊ.'lҘ΋̣s=Umcc:_286U\ %n䝮_ !Q/f wEnmݒI&:w}\k^aeZ}mG П=R!%msWFRm޴x{Kpø^=Ա;)4*䥾rB KM׆[]W3ѤHi-FKe =6Լi+// x:0ju4__?mz?ES?X?GsO)W‹<2 D>]JJ U?_ <%ԃy_oXUo)7!e'~H~-s-|+/ mq)+G~ϟfF;7\76$[ ^Zv0ismuo2Mi!ݍ&4C ?t oCMY ^OKy-o$vq-ԩ Vͺ>7?sTc}MJ _i+H7Z72j0<6! eݳ[%v|?W.-5=molwqiiw&[C 8KWk@>=Wȋ kz֥oj!7FdF70UZVU^Vvڳ4g|~ƙa WVm5^^]-1vIUD07WGd?/ÿ OkGONޫKfS>4vG--&Skl#@HԔex|]=O IeY~=K;-~ڢ[y+UH>S_xᦿcUN>-F nE>k"C8_?ٛߴ_lZ;CѿP<#XuZM"bF6rRXptIygLּ+G>5Z/D"] =' KvWC"c@6? g>7<%ڌw$rꚕmf=݉ͭ<$| -*xGPzxVh^i-}<}Ei33D8>Z/T~o5K.-B;A*]u)Tm៎zC#ǿ_wud͝pjdb) W}LNZx6&[|1|Gէ>d ܯ$>{,"@=?g/ًO7~#k_ iVkjc\C] GQӒ+$GQS< ZYO{vk>x*|5ƍ;4+m+ľOɥ䵼6EyUuh'ymnVsO'Þ1Tg>QM=U"-و$38ʩ4Oäx]/'UƓs+b>ê-rJ=QR"kaMT˭_y[]v.!!-M).|GƾogO([_]]\x-ST෺PbkCzZ7gH7LxX/ ? Jf;O[sR`/$~m$kuwD|߼'|3MgXo_U9٤-tַdwO !7)־#;ΥkѶ2.,nȎ?\E"Ꮖ]?OG.:Wz6xݍBmxE&Woc3M1;2CxQHxضi~%ƭ<:eo=+D-Iu;1?dLjfaKtxCk{罂7"6̗0!H0ʷM/x#|߷_k7GǟROx=F{[dRLK{{Q-ك[RXEi  φz$^IP xθF Hb8H'sk⟆<߅.Ӿ i  u+ÚNtDw{GY/bgMQf/Gu$sDHzWCmԚW!_66_6Ղ{yI9"AuIu3'x?Nς ?KSkH-$fggx) } Z~ױj;mG⮡i&x_Z6MI^0>"^jw|2 <!H‚6$)(ThBVK}Ibj!C-*0Ӱ 9 wY:=3M4h,a`',Ėff$bI%$I$j=M|=LfrIfff$1%KI$]gZ[{;8uEm탲5,ʭQNHB/~m]gYX,:ugfncs`r 932.gwCZ^2mߌE\NI%Ѵo= M񝨋5ڙ8$33OjiV*#yvd¨8@`DcoVv9?eյյXt=]Ikh2Nd"x'$$" WJSGq,pF:j$jG8br8Qt}cJ<=>jV:F6u(0U1eԑU B"O3R/yίN6YF-c~\Ni%fpÔQOko/$?<>cGUk>y9!W ĠXV7o;hF^{/oK'{.22Y@DVbY@+>1>/ *,e$W [cfφ Z-={r8y?<ϖb]1,ĜOLG<޿=254_V|Y2q&Z* @KHKpܓR߿3staw${eiO+嘗rK1'$j~^ꚭwwS,P)gݰUA%I+ <|U_&iwh6!ba,Ed=vK_1NחKO{~1db45o7 A}ORE4#YO:n¬>%&F,ǠG<737Ld/';GОTڅ/?>gJumO"|R lD&{]%˹"{'gBՆkѴ>𵮅Jmu[.c@rp9$|a;Ϗe_\ Lα+ʥʣPsc^k ψ]CZ]ž϶ɾd'[m}8:+BH}.ߙ(SWct|+s[⅝=>,bs-wl$ "<*~K"mv?' [Y5y#j2ɸdh$sԚ3ҿ&֛Zk NO:-}_7QN+&t"[B¿+ڞq^{[)+v pk6P[gncŢ$޲D@1 8Ӽ)z~"{m;Y˷.CA$!0C3 E:]Z~/$xFվ(y"5[ IoCTrSb~:7gBxs>}>o >okg]%bY7,sY`ʯtxx[BǍR;i_s^3Q/s"I2Efϸ ( ( (tWcͦivZZnqoHFFA1 EƝQEQERKEfiZ^jzvbS#{Yee(a3d8UJ((ݮxx[B?52_p^M4kS/$p1H|Z5VȷC ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (J-n{ᥥkkhT$Iff<$XI'&'Ü'sꇄ/Hm)"V G*  Ay+Yߨj1$Sk2FLvG& L/hʯsyquww)IH'\!*)cFimiTF[\ss9[@ (?VՠҬY'GooI܌Px$mvaӊlGvåiO<[Dw#!39$$ t&q~ھjPp|8\NUSHg]A}]WJP| 5=REHFwvf 1UTPYI!B>oX4?b Qwf* 30P W1hwiîKRUI X $p5~xBXsV~]7zL<޼||jv|VXјrѾYlaS1p2F6_Zu޳)eZ}z\A)ʤ{_d^:Owƿ[Қ=0🂴8?@,}F+H^R00u“ڸ_K|{!?#:;t?4\4]I+hk=HМ7v]ub[qzQ!#Ĕ3]QFwnrU>UoyfËYk>(?η0CGq 0[n%I#?#ۊS㿂8FheBZ&dywBҕyr#hKӥN _יx ^*_\Z͟45K2uu: h`HTr9/?㿏AD k"6de k4L_QA$m$HQoKo!s>ltKkw}$J^}BVK.n\",eُ5ꚦxnX5 -+I{۹(mE,H@DU$&jPҌ._;}V5l|^<&H/G㫫fnpou[ݖI!Y_{f|gnZ1q^J^ ~0x}Jmj͢hBw bche ?w7?kxc.$&xxU_vf͉֛I|Z#c1,|7ֿiZnkK[7o @`GQ]6/nWۧOUʕsް.|IY|@-sz#5+;o- 6s lTfaGOՅƥ}&U__H[x6D)tM#n)J@\e,:yTDK(䚳;1O&Zc9~h>9U/}h 2҃?ۥ+_>`6m/h}~&e-ɉ m@YNzsQέ{}^2#vۯoStiGj뵇50\Ɏ= 7̏?C${'Ef;KqL,69qָX^ j5S?٤C;۷w}~~6vԜܺt*z_3>p9H_pFW0#i}ڰ)Hȑ 2<}g9̉/y\^ VJUl9~+}mWɈ&@ݴ|%v]**JЋozӁEV@Hih`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyo Qs?!]7o Qs_!@g׋icmpH!"D{@rI 6ido6y ;x _ Dv/=3z:OnGc@HوU\Iu8q0IQ+]mu[k[XpVnflF4i~ڝMC]J|$-;#@{dbXɡi")o.g7 &U؋rzK33[M;G.`@Ċ2x $ʹ!sRJTGMVjƟxzT>iAgvfUTPYI#H5mz)P:F]]te*]ʒtHgj8I&&}jNu]O4_itB-FY|[we 夌 $%tbZ5h_}:N{귶ngwwu* "wwb$8dזc"}[B})XjA͎'!J٩-9`4O#:\4cگ.䶒l6U6S|T߰v_ˡЗRm/BΣkZZ ƥGbT,$?x׍ ]Ȣ~67o7?I/g^.Vv7~\s'^|i5ޙ.ܨw'ܭ,rA5Y({RxSI#_4_=%qs;It vi:Fkccgnk j8EQ@PW~'߃y7t MjԵ[mꋾIU2MyQ%z?>;B% *;DYm'H} . /i[+Օd&)5<Dȩt! kK^~-uF1o/ᯅ47i>F=,iN /u;|I/(x.bX*ta"=}UĂkI 5ԋ^t B\ŦJ<8yeweDݕUY*wP[۴Ma…pko_xgP4g y2m [r8BVw~8m$TVg!浂 crUI^yO"-F Ե[˙o5 Cvy/м1x\?yi-^x ycb;oc],0x?|l|A|eXP5[OV~({yMf}JԗwR[ئ"o[sOᖻ#σSif;_xuYo_ywikZhg7?}MsM,cj\߮Z]ژ4xmnRyx+'i~F'~ɨ[@uM5cҊIJ~Jq'xڟiCWfx}&n5{qm*@Z:1G|-u Cg,Y9bD/#?x¾  [O6zf%],{FKpq!Vg߼Q xw(Px "McgeY/[pv-hG?N^lu7ّ>Ϩ<->Z\j`mQi!vQ Y#bSEp_/U9c~+ ]/QM!@5ѼM[FHO KN Q~>ֽf9u5߇!A>0OӖ {5݂UDuf|oO&Gj0bit k/\|#75/-VM%-v)=ཱུ@A.Vy-R[?٧sc[{PZ bokw na\Ii}Csu̱XPy81o*ՏS^37wΠoeDUh31 ! a |OAYh6ԯC_[Y}pYfeyUq4wUL4&}p)FV׋m=s_S?t j l54O xzXiHY5Tf\(+4~nh|7<sjYHYᣌĂL4.I%W8wq4dtE,)-Vc1)QhlY?' uX~>oO7 btflgNnLooG5? x|{aPBm{>[ .ncH.b$ŧW@\rky}8_]:31Us(+^_iY[t{ůKU3Gw};~Hq6rߪ%WUn 7=={t* 8\D(/yyi{>:7/#㏆|WxCߌ.|%iz7OK g~<Fh)$){#HkKUI{5'87b[78냚}7N6Ė6jKBhi#WB" ъXHe58Z֪M[ovVxkofG6&aTY+=J8ݶZ9+F-7NW:vV0G¢ibhџ*YJ8G#H#ĕqW-4Rm}xô~mQ?˨5MmţlZ1d9m/vO@jwg¾!Wz"atqIhDs\I<)D'j=qZFPqnGSj1KVvt[$H4Cşeui 회֎./c%C5tfM_o_ߎ:dƍ=n;#|FB8` R+ZJ2{G1N:P~:׀ ;7o?í"F?pɤO;I JH߮cG ts4}߳tj'X6Zhys(H ۘ9djiЌq\E(ӔUoo}߯[_7E4S4ukXOT[xHlfn߳d-do-Av {ixΥ 0+|.nU$$j$ nĿ EO ~~.; :gs)Ѭ}^H MĴ`q}UJyk\Pv=/|zdױ%O{wuq%̛P<M)X#RQ"OJ99Kvj?y|j|–sOן'I8ŵa)l|D~eȥq#?ڵʼPvRw4~/i湮]}O6I$qGʉ+;*0ri-mExWzw=>hfXY$w`h +*$h쪪'þCOz,z:idd%%R ;C 2]Zxvd-uYcБԣK#!)-̯"HQYON+RT^w/ik;0i ڤ FKcsMGP>!ÞӼ%g;[9ndF+%AVV'Sh>%hu[:Te՚:ů{7ZV~chz;<hKHh7yws஻A-K]ú.hۼ->a-]fc$=i'Ktsa~2~ϟ4[+ Zx>,ԯ.dWxQA s_Pr 3ͬv0w<5E8\Zմmkºy. a5$QS,2N#eu8*Fyŝ:W>%:wA BºX\^:\k"մO4#U>b+NˤEK|QR}/ iik  V mU35~;'u v(kj7wq{yq//DeV b`ſ189Cj֛W4;$KmNWҭΩjmu $[G)R! xC~% t?a7|WM};|bO3g.n3_/nY\ 3Aԧϗ~.ߏ;iˤ\jt|Vw`得c6ĺÆV6oNo9kz}6]]od xPrfͼJmυolJ~dRX/)$Rm{'̤ R%xʼn4< ?3[}7Wۗ ݵẼɷUuD ݑ->yJ_W]^ohƍx{y4t¶e]r[:d $P!0|+׍(0ꮝ6[K}O+xᆋ$~橧qCy}&D[%_F; G4!eU{XT^Wim=h$p2/x+e6}+O2/|[h/mjj>}1ɥBEosyom=,E Ez|MxV9.%mCVak2خnVZ߯}A! H!ߌ$x㖗|YSAi=3OාDu)غBɲ'FC2_-c1S(o-LEh&:..|քO+dӗkh}Ww>^/.;wO7x6Qmg, 5ԛ6lIx߅~%|e4+x\mxcJxc8T9@gSH#LcGS˕+kb0N)=UwrmtozAN [j7E֮_[,m-2$A"Sތ ]Ŀ½f25!XR#dc@+Jj?O<$򮶋KMɞN9$iGN$-ㅧ-5k-_K-=2,vײe U)"]1OW-n./ZYzE7MlH ] )V\T)F\ײU0AI-},iPQSN"MwP4J@+-jH,.dEIo,!㉣iX0_zʅiv~*ni}G2哎fTmONVD֑0K=JdS9*X0Do\ß־JojENRvLNѭH[H[^2M4xYW>.~+1uos-ּhr=Mk-{o9f2G]zitxYZz~vo?bUiʧIF}#ݕ-Ӻgi*` 'ǚŧŏ_ghzyQג7Wd@$,cdicduy)ўt>&^XYډ$,Y#|ePVwn[%t۞W&}m9R ^ῳ6ͦi~ikmo(#MrQTh'PэX򵣄c.In|;w^*a,UhP/'k]A zbwXk71t߈Zc V+5߈W( }J/49|s ŵys0xC׿a?+no,5gt};H|$N#(p# fNJ1{FؼʭXkӦǷǩH[h#LhXݓ9 )@b0LnvhҼOn:Qϋ{kɒ $Ild({p1䢒0H涌&CͭQ t%+C((((((((((((((((ϊA*6B_A*6B\+"GZ +zpI#Ҭ|,dd(K6_G?31f9'y$U?i WWP6hf &oCǦzzVT6,liʾzEgO{in ++hZY'$q"Y I<\;+~Zꚝη,71c"Xf3$TCMǦ˻{`=lG+ /ͽו@Zn7 ?Ʒ 7+}]KPt STtH{(`g݈ %I:]躧u;o^NUcbtM8Xw2-lT~)į&$xGmgeOɟ%0(_7WHߙaxkWlooj| I; k:tZ8akw4/*7|S}Wy/midjQU,q [K|?s\Yy:I ;Mw.r;b~o5iE6 CeO*J)q"ȶb'@ U:IV*+n%h&I䲹{y"eI`Ki!}شMs8 <7_?oeCxx=*;y/ZA,msY,46(ֽ~wj> _iZN\k vח:d䛩I,u)ԭ Sy@z!ΉFi~Iľ,ѵIyom2ϥg}b֊ke!`Yv n_ j& k&YgEԥͱMODT].M>դte8-ViB$%AGl|qޙ_Mm 5 [t ǬxFR}IJO<t/u-%{#O5[۟qtc3fӯi2IerI5bl獴?|B-4Ox~[Ӡ8.xUFeE Бv rJ!>WZ'S> |9ּeàI?,'^3C^ѥfk;乴bs5} pL?yx9_G'O_~#|1eEegoE<ɥeE2FYH/ῌ_ /t?x=~o5[IҴ1m9Udec0pAPF@2WF,|gO3RO U1c<^D߾S6vHa|dE,;€S^?|f ug._jg<3mZv6l&aX=3%oxG )4F^#1hy1FPD$wM^m3~ Ѽ7/TKǟR̅ki1;8Dy#&iaOn @HϦGJ7/Zĕ.\WKxL{X4x|0RܤZuw] H?Ih "]Vo kz~kjum8xiQ[!]BvW/qq?*]ȼtZA<pR|Mcka>%xӬ?hO^]iws\j$:ĩ2۪B3 sfmŇv}`GˀҼoS-+Qs Zo/od|m6M м'^x_GP4*u}HTyss<N~y$l?bOv|KO-t{7ಓKm<]e;clL֒5ߊp~cyl1v}O~ѿfo|Vai7ڗW:\1t"y xbܱ@&lx/9ni~?ī}5coxBgy[_N#(ŁܫN4- ֵGƷ!f{*O x#";0UAbM+3>jKy} iX>bɼ 22/@UǦxë/Ev~Wh>MŚN- <~me4(,sӰs3W4 i2^[_]zcgh$,H,GO!) 2CCM, 7:RjWŠF$8cËkݑ\_dI^Nϲ^/^% IuucO{a1vM+4$ \|Y B;xGfw&x7J#[yRBQ ZMv^s{WE sZWq.e}WK 6Sn--,o/KJs("!aq㓵tV9+{_f?kpto7ZHajOIvwˊtӡN3i_KY9M? xI. B+U8dPK0Fszo[ z{[ʪKHV9bn*BH 7&/)mӴ Ǐ7ˋˏw]QGEN6!dtc]&lyMc˴lʥJZۄbO얗vў_y9}wRL!8d+؛U7z8N1I$MjөQԓջV'j=j9K i ?Wl49Y~c#Yn#@2gt,Ŋ&`o3@=hTRRomQEDQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y[H6E\WK[H6E\P/Aȏ'ݪ_"zºkSu]Mj]jN'{ AI.TAN\uKMtaussvc+R/DŽB'ra,NcLb!Jnu'M};)$zi/tGҴta$P( Vӫ~"+ w\&oXY$w`h +*$h쪪NZjؒrzn#_}cid݂Gq/,쨑3xwXevVvgkkm U= UZce֪労Pp:w^5;_eh5飫(`ԆT jY85sS|Os\} \+0+%۩ AXՖY8-K߆-0 3Y݉gؖffbI$ֱh)W/}B*sWv>_ JԼxm/%qsJs(UW/]agE@\<L[6Yl඿eZ9bda~2=t'Z5)';?猴>8>i:~xcLpk 5bd@?2gjNxSSе3OִMFKMCOIJI*VVH ]Y|b,~ M$~#v~ _TӮ0-tq%ͳT^GfiXd Y?a狯|\DZ x~+ k5_>$SE-#鬍-´%/o..׈-"Mo%-K!fៀ:|7ĦZ,'ݥs9@>0ηCZ-i(-Ekoij<q$T7*akGtznMl:&y^6XǗkg FڻUyN?˵ $2>Oej{mh[YYm]W|Kv:qEsUp[N'T^7Ѽ}kgB񅍤mlzrΨJxqJʰ8Oા#wIm;VѤY_WԁIrpw: &Z~i?Yh~kmխ mt:$vfUO25ENp-ki)տ'_jw8˱ɸ?f_^;ς:w ;_¸.Äu>%ª4m>?f?ah}{υ h_xVO xg6y>å-;3?s+|ϻ-O}X|O]<-x^%Vk.{3)0"ݯDf_!y 2yLnoK< \j fڌ\\h(xAg!h#Z\>1)o xji X{c]iKlCԺvLPA;@v:g+EђK/ J]2ݗY2–5M bOxGh%GY݋|)'$z.rEWzZ^]w}5Y^wݘS=[|?V?i6Wڍ݅[62LjH^+f2<]e{dVx6tk=V//mw%el$KM6j_-- gº7SPDntM.]q,m#HfxK~ٿ>#xNѴkiךiY- [y$]N!L >~+x_ïT6) ȑrc/^=Q i/ڝ uw5 $$ ,"ƨY4\)˻I-tEY!LтAu_/?o;w*^ϫ}-2-B/:mNktIe[IȤ~,|dK-CLضW` 8kX~Ӎ?t3FȖ4n B֑xAPðy6>F)Z|"%2HH#V ikZ&iޟX$pH)xX2 A Ѿ5 [ݏGw q5$0̒ZIyI ;gV~-񗀿6"wߝ/[ӿ&Ob_kwn?/5oz^aiZ4o4I͝˪]_2G$ <z7>_P~W"}tZi̖"E H:m3c3`fRR@ x'G"*:_y3"->(XxOr *мX|he6|A"=NEc-m>ϛ(gE(H??Xȵ h"Xl;y& m$O"=+~| i}I]'JNdدey0o gxo*=,4ψ7WkOYԖh~κTHeHm`7ڞ&U<WM4#UE͵T(_  OO=.KM5][\G?-Y˕bJ#[i O m6z/oƑG C3$Hey*G|?1g#ω:t Ua t`vK\د̗Gc܆? ⿎%oO+xG.Wqy@=(~/Nÿ(#O6tľ$k]w 6O线(0tC^AwngX];F ]Zl4+ñg`$=KSI!H._GᏄ|wxĐ]_j{Atbi$xM$EgW_.iɤV[߅z;lpocmp'⯈_<_8#.KJy8ŭ;l/U/7|-W3BĿ_muixS~ c'#K/>_3iMgx+χ)|)fѬoFtf`ӭ mR >|о^Q᩼#ESTudddIwXIecTWg #{Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y[H6E\WK[H6E\P/@|8?;?q Ɓ၆Ӭ:ΰ=vHM]n&rquUt;ᶵYI&W rYI=m5k%u56J[xC%A/nXvpWlyB<ϩ T*>0_KFG|2ss/fdvfۃZ|"'.rF&Him湕bk#5FF;i72(g^hЭMXEeao洞T1 4aT $j .IN:CZM=>\:6E-Hw >:Y{k,J5m=/l&ht=Wv# 1>DWdzi/tG"-쬬X*FEPP0^?|cGxV <%(ߏO7[yGyKDhzmٯ`5l"i "du V5a,S'o>yѮkHVPʈԆT j,SoVFo[wG;,33;;ĒMk1R9yuh: hE٬@ggwvbK<ij3I&< O*_FFWP+^:2FAXYA(1eVm1'^m7~'N#>xv~<__Ě˓ eaf©m"Ng6Pه]FY'W58<;gč(9'v0B'ڿ&K 'wM5kRfau e¾}s"~Vt{yzl1P|U?k?TA]GKЦQHZ;ge'`#L0K5C>"މokZI<* Be$k: ޑ#o5e O]?C8F; i:sBMo|'m/Jd3[Kw-o44r<3DJ4}< ۷ᵟKo~T^ -u-mAex\3WgơagkiޛU {5["B!Y őSsn;OݤJz{P9[ Ye@u |K5-;WKgկ`]9noti(xfU[^LTx_zh4KRtM2/Qw#[Ѩ;Ir ş@>(izWq-0*M%Y~kab˷{ifլ^HVTYY!u*~jOA -R7kݶn48$ԭ49q Kcu֑?H$ e5ɺx]_aחxW|UD|aacV}`ca}:ͤf 쭜/ eHQx>a -h`ύ]$&=׈I'^{ $Cle;=|&|7x~iZMsuq܈o RݥbBd7@=AK]Oׄ-{G8埕sOx@~};s9|Ȕ W?8>)6Oqk"Ҿ?xcė| ]]~ uev4}Zcuv|n9K_Ww5\x֕'4+˦tL6Ζm}u6D{}?!JkM34jP0d2L |l'ZJtkU揩|pm"-$Ş R e$hTj@*@~Э,xO]i> %j.h74Jn<3rѭt'J<-hZazmv~cn[A(@#UP߆zeoڣD\:k_:iizލGL a,ÏBO M@xwFதcfr;E\09忚9RHb[:KEyo OZeXiW^'Y&%Ot%*gUrF0;/ Ѽ?&ϱi޳.g6dPeV/ B;A,vBoؿ'>OZ1 ɖk/5_:{2Hm7nfiVjfK&S2yQ\xrbN dy訠Gd;uZm6I ?An2 $_>|6|>Ïö}I?tkủ]s$+\ߦ4Pzxl>;GWY*t!i<7i,ͭ jiPR* 3:?y?޾f3aۜbn쯪 xO4Y>Ᏸe 3]ZwtVwH2h$C(o7(~<?ON5-6$f  ܠ۸l B⿃`H|1 :Oyk_x]5M*q+}>* sO(cL|+|1?-ևzE͋\KI'T q {V}[K -KhP֭-<5wwxOm!@ta! Q#eiZv]fcw]N{{tgXbe#0͓$\T *( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (l?A=ٵD4^H͞YdاjoڸPߍd3: <Z_}q?϶v4>|y;cw_ջ}O[~>$V}P&nhl2YZ9K^׉5#ݖ;xŚh>O,rI5k !Q7ټCHc^ o%˙4- >ʝym"^lLRR5+J?LS48|'?Fӡӭ|חɂ8sͅUbII' ̚.xnolu6;|eϵ99^1 W|@Ikk$>D->;\&W|,wHI)(λխܛ{RTu_SٰsDxZ]_Q|wg: ֑i(խhG9Ձ 4SD\ $5[^ZTKKs:4F-j7ޙ9^%h幑6r)YXH1D|2K_K4?HЬ.N-!H--mX4U)t6GЬ.N,X-mmX4UT1Z @ǵUZccU5hQuk'wn~{ѮkaHVP0+%۩P dj7~k:"U"Fѣ%C ʀ@pMh: Z=la@giFf,ijK;31$kXQ_D ENj{.o]wznxk6>mk(wݘ#33,ĒIHx^m=wVռk/|%u a-#uv[&W#hYn%0̱ qlC>ͷٍ:sQ}<帚)_;Fk"hc0+%D J,Wi^𽶏}yĴ;;䳳31$M@Ҽ3[]G% #H;1w݉i$wfwgffbI$g/lTߘVp+oOr3E\g[/g?\/! ''O_F&^3P`}\xEha~k?WԼ)z]ZI BNUfM$ nVBֻe,|K|?[WQH2EhKk!GE' ##(UbU?ɧX6[i\5[ @wEitO_~GBOzrFbrok qq+3A!k3}3Rr%-sĚoh4WúFyg>It#@F^sk2Kg'k=|#Zok_i״yu~1\ ີ|-M,76ԧR |oWEG=c :ֵׇ(};M)4fm*\#kJdhZ-u,Ik?,c:^wE*H\^[A$Dx2E>:jxsAZi73!}{7ie'G lhrƑ|ݫtؿNs>>>+8b p5In.Xt0ًy&h!NXnӯsѡԩgt{_=3VԼw߉Z]ޘt7KAe m%mQLʪ"4x||ICZ%;oη=KM(o[~!-~y|? q? _RiAw\@fZ &u+$h|_ U/|_|/𵭧F|9'CYKy#6q=tkH.U[iN9Fǟ%h| K3¿/# ?>Լ{=2B]EK˹å?gO&75g_}__i/R^3;1_WO?>=3?/k_<=i+re$H죞,O>kye[ q}!?0O~Xj <9[MOw ${|]>s/[=߇SQy[ K*,BƲR`(vk?Ž?M֞eM?~2E -ԵMt5K-|E:yc_~*m|:MGPsaj6Wuw96.guE5⟳USÞ9nc`?.ϴK^?ÏO/ߌuOW -DgDoͭ_gӵ{ճxVOWO)+pTxcދ7qM/+x_M(uiƅ`%8x.w}O~#«Kck lڷx%* tX%YrkJ.`9?|mo6?gB=OW-+8dvm?bj2N6 Cz|'گ_ x-/Z֫oqmZ\'h+Ťʶm厌%%+ٵk' wgԇ|Ꮜ*-+QA MokR7p^[âK!&1''AO}z:.c-ǔyPąݶ,U' 8^T %ٶq4>k~7MB Pֹ:x[@3Yv,UVif!$oi֌h'SյEju Rλ'4lnfxg =FIߥO}9uoxAƃeyI ?VwwS[EёK۵ގ;Gt6)ߊ$χ=c \:e֡uj0\]d/’G2ǫ0zǞXE-IՅc*}.'񯎼=^);KK:K\KæH&HBuXǖmvVNzמ&v.xmJKݫVhR!}y3_\*)UcyF:G-z'ۿ|.5= $J?FXGfl{O+@F L\bU)GĿ`eؼ;mxsNMŞQB,F@H̀FD%ݞsҌ⻏6:񶅯W~!Fekuo;[L+4 h-&Uix~ Y/ZgVVmfM$HaY#*Kz9q:MKm}ݳk ߌ> ƚƿ jthM){L#4ԍ~L ?[G?$mdu=;Kkg /gU*dX +35M0W;[k= ?6ӂ1KN+]G]sPx/:<>m X'I6VVXă9hx:txWDя+Y.uuHtMиUP|'!?ey )ca_կ>Ԅe &﬜WNiwd}ߥ8q_'A /w ׉l.M& -mub\O2'85-ZV~3PZ+ip[\RgV x Wi7C;Uš<INQZ5dӻI_Bk/x㗇cI?_Tet6١"P fIq)k|o+ .<XtV̔=Y@H$: -~ jnC=ZEγ c=tW@dkQVmci2׺v鶽.zs@|>'_U:MByn%k$I,g1O rȓ`|׍o/)񽖛q) ׶6ҡ"B&D.Z4]G7*=]URMޮ{\r;*oOK] u.iu ~`hdH?|W=fyxoqb#wnxJ#6!cˎ2>x7֟U>m'6t>9ßj?~Gvx]}Q/oU-!ck**=G>#Ѽ__?iW^S[I#@Y 8p|;C0M_Y?^ѼXjVTȞH7!*ua$d)A+~vRu l3/K+Jn9=2/{~>iz/<&!WvePX{kSW|^c%4{vDZ:; nM 6 UGxUrmu4O na6ݠzGyq"( zS1W+]_UsO%|$ ĀgOJׇu_eZJzf̚x?2Fn lr\vr>17,>ŔSݠki>a昷 dhV/a<UoI$H$3^UoR-^]Y::=7!/y42;f89!EV9p=Xÿ-C~+u_мGcچripGm9eeTGgt"+t>F[i} KPFQ@ (hnTb쩧&L"{Pno&nɨW^~}[K<)楧&k%ޡ_,FYHAff $Z5Cݷ--5iڜ}50#HK3bʬ@Ogg9xGdw:E5oU;ɼahHϕ߀Xki$H qWD"YAP~s @ݞ+mq7E[)Cq>cINѼ k|?}w':~473x떖ֺ~noOnٻ.| ?i_nWSKuEwrgHhm"PtFRIZ媳jk_fK ?/>?x_V^OoϧEcI]\YDx e{vx~Ҭ4 }歨kv>|iGA܍G $UP^o,3?ITo-;$ַq4%4Jys!+:%;[x|;gxg D"K.uX[OOk>to$!dU1P+W]{WVMDMXQZ&8`6m)tj%FVhꡙbKGk]>=Ja >-6z̺|Myo $oT"Io |?qx;:ɧ3iXGkUTXUFq(u]=h\e,UwG'm4D<m- .|/{V >; :95rӼ8t xzJ3\} >(-+n腼2b> ={V{3^<_vZR#My6)*8~gth_4[QK%r8*pʬ28 ;fʚ^ǂ<y7N4 X@`ekxpQ&+WH0;xoR4g×Neiiw5ݥK$SૣH$A4 cqʽI4ܞyxjK4H4'MK [He#bI"#ej6|x'‰uce˥BT#;~X8DTdV w');X8]_?72=}vȈb"#124md`WuaѼ5:gmK]$I&-!e˶(E,|NуwkSZy&tqx~&=3hVڳ_iـaf0/$3^9t*q_"6(8SINkoF> ]s~5U ֶZˉmBUv$ q|I Xmt"IU"Io|zR< n{uҲp_ _WZ+euE} =3R/*JLjޭޥmuHU}>)^%sh}UJ1sKǰ.NQ<Ֆm xCMx4yI"#;(fU'$KgҬ|-Yim=O"m+n!"qҎ# x9C6j:wMh֯#m˴,c-A\bo+|ien"_ jQkpR4 sNUEDD#@( ?*:JTլ],mzsSRw0|5'~|1ڛ-JC*"rXT II}jIYT');uQL(((((((((((($KGQC~*:}~xnw5mu@IJ#/<3-sp&R+x3gQ:y-ջ_>O8yT"O{/]a}GH,d yx?kvQςj~<}h7̞>!< ɤG=g1n*LdZ\iJ!;rOd.*mY?V=:(Pe+i4$ XğOkvc_˶L("p=G~%|/%oM2}GS^_"I_bv+(,q ⸿,ΝZVZy'q1Jm2F ypIa'%w?zf#~)? _23*T0_xσ'~!ho%OmwJG9kumB{J^v_6<^@kGֽ^3[mv="bOf[wǜ_k׿w}HpGI9 ш>(x?C.ѿ]L{z?>$}oVҒ}s[m# Y@ #W+2iֺ`H~i&H٘MkOxyO^:)/e^W/KE5\wSwO]V<4;e,6oI{m]ۛ\VJUgEjݎ3_U~Ӟ(IJt AhsIeH%$JMg:mL1b\g%ƾ!knٙ{pY'W*T˾^{*4@+I. v:5 JI?'?\?\t&_r> ?|D9vCމGOqs,vGo2VQG9ack?V- z5亄6[O%w)F1O $;dFߵ-k:| ik:%Wr b][AN5[\Gsxn 0v__d_x ^HGer2yj<;6?h'ߧ/][gWV.HMSKKXomM=Ej%s%Ena߿x/n<'CkE]3T[ˏy}*%hs,,b(KKn-=gu)H3@YU m=]oZu;DF FWR*I+yD[I_xSž*mkYt߲iȬS{W {x$~rMsf^~Yo>& {f}+Tۛ=JPk7+$O'%B3!W_ Fº >.ÄJŠ~%ª}5>?iy?aOg}:=<įO:w>YҴp4.ϋ> i&{2itK_3}UA՞QRWtM|"𯀼U>j/kguv#29+y4K&PbE@f?>)xK_9j:~xJtt2I9x#Du# , Q>/[hi~k5zdT(5IBU֡x5uko ;<ß?i(&5_ j_; / }&>8$M"/9@xS۪$k˻Kd4fq,S<햵Vn$K) ?vºO&i xEUG̾տ,yfڵ6l&P4+@𶙡hzm鶑i}Aoij8TUB o;xeu#wҵ8ӯ.[m{00:u[f+a[Kh\? ~?- >5:gtkdVk=m4os{jn?9fKv3Wb?XoW{c}3g/͛x6~j|?P"7|7OO}_mwN?mɱ~yr+G.Ä?J‹,U_𯿱4'>;o4|}o^+%oLj4/@p7.^1^#~ J<;kɯhVoj&ܛBQay@Q@Q@Q@Q@Q@z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( CҖkki?m 44 ' {7~׵n!,0 ڿY~,Ɠ|ףUcnXdn"_:G%[C|OE̚t6<=Ѹ2JxZ>/21txΡiAMc#|7]/_I~.?.~ҋ>7\[AfYN]# B|+¯^|9}v&F$7\֗'V[:ڏ#Y.PHPf9c\1צ(#˰o 4eJҿ`fӝyʚUȅge 0U }N;W|XYj6̏gY]_Arp :ZAiU2I NJ忿p|jQ}\~qgуl$\۳Ix?ˣZcE$r~Џ:X}8 >\֯&.{I#.6h~t\fB؇ZڶCfׯ$:(N%e\o@:5 !z.]\xrHѥG-MYm౑Dwn3U|84#1t_X" 6aq{r=V[>%hŽTS &Ο5̏3Owm ڔ2\c:s o&j &4,+MMyᴻxmRUk;M2KRAA3JUrvD)#?d-_^[)?[$bΓd^Р̇TspM +k0Wھ(],tRm;EWi&)eB#O?گ䜏ƾaο/+C?fy~Gy_wsv~$H!XH[XeBI $Dӧ:֓J|O$4|PjO[v]kǺ R ,}_|LWk(aFov>NqiZlr4/3oDm|{m<z-uH vKen ;^^dž_EUfm?E++Jd +D!,,쉕h-uQ1uehSrv輹-}(WMlM? {ijx+O%K训<ǁK;gGV }l\F9qSO`ZAaoco-rP#cNrɖ8fVEK6E-xJ|+XkZ.Ɏn]«$,bIb~+h:g%{=T:oo6D}qǬ@v|ıEsz}OޛO ^jb(ZɖID&+ d-Iܬ>Fu*O{SԶdԦW=>Oj/c/nx3DԤG,f]&eޯ&n>VR?cϋ ߋ~sjf~O<3 ݵ7m|N?x^}wYȌͿisGlx፤`R$ "^߳|7Kmq.snuxT5vc$7;9fƟ6._-c'yGܶTŗo-:([Ps@hd|n @02knDt'٥Gbp|]#|z}?̬r9Wa]ݽ&z)Hy?z 7'-<붵'ŮemZDMM@ɏ#{pEYn`uG 8şgYqt65L"d;p~_݌i= oN{j]%eqExWûQ 18<MxῆOAr";Xy-˳ql?J K?ixѼ=f4 ~7SxFY,%d6RM\f?~:$_B*(`v1B~SXNbOZI63E4)t /*TAo+'dJ\N[&AZןY7,c_OO?K|+_fY-/rn۹snzqk|5㟈wxW֡+I<* Be$k7G%L¾*[<QּKgq1m2i5BͯmصX[-`ۆHCIx?M4 v-?V%G]Bﭬ|Z5y"KV(-o "9}<ۀԿh/Y=:J/~0WXƹҭ٦&Po/_ H^ݣUd;U~j|UM}[|bO3gn3_/nZm\3Aԧ&<ίEk$54mEki%Y;ZQO+ hRE2|0aY|O?#ڵ$+!w{}9]IF$jIB> ߏ?c)[FPY_WԁIrpiw: &П7xW-;wΝ\)5`}[ijvDyjv[ oʶ'8J\޿vTԝ7 YY-?|_s^4j=uK\JŦZ7QF2$BO(b_|Iÿ?# gZx߆ۻccumgne wPGa5ʤDN,.EWC Ej*.̧ Jt-ב'AX5h&OL-kr@&%C1 1o,ǿۣ!&ƿ4uI _o#g'پ-յ_A[OPOYk|)% 0ibIYn,r38KHI]/(׼![Eռ9}\xz\ .[WQ=ɸ ˿r`KtG=.*[Y&j*{XX/^$Eͭ<;aZi<l/#"]ʛj<žI.#Z|Q>'ޕ}g{ xnW/-?xL%FSO}3h IM⦅xu`_LVkrAp(`x¾-|i]٫zVVvcO2iYQ7; YOFgK8J &-4ך_uG坲iBbXG>2 ŷӾ|`O_Zh7Oq$NWk ,7Qщ!,J >'xW|O <S5Y|J-Hn,[&qiw Kq,XH4W-mmh\]n6S υ> U߆l>$w}.Mȩgu M8I36|7oi&[ H&s̑f;?C34iɩj\Ilv]Er.#{K2.&ʷQs?~7de׊gĽWL6ݴ]j+)}:ݡ຺5 o &|헿(MI<8EiK {4kIu ,-#K.#@efyfr$%M|%KZv'{K{ u_ pF5XRD ^39guSuiGi[nu?h|iX5++庶(͍V+8q*g d>R0Bq_x#>-O¿}u[IhWvJKPVmoM'tG=^E?V]7Ś"$[K<%g]Y2#^5ӣu3fc,E8+6ME%QӮ>? |JEƇpZ5ڄ߃j4IY$H5HC _?)j%Cs04Wx>;~;94_x#X%^*߂&{OG_2dy[w6AA(((((((((((((((((((((((<$[~J"g!+$[~J"ka(`qne}]Aϧ.ly_*Cgw ld\s@5EN UHc׎|RJ|[ik=>Cq]m$dVkFP1Ur%9WNm"%h$v?a^!qzsxPEWޱ,qU1f 񭿵W?$}fy~gٱkByPf z^rna>i-<]eJ%Ԣx%^Vp(+#F s^=j?cWdv;{BNGb. ޑVOhRwnߒFv8DpIyO步%甶</gu&WHlP ~ݟi>H@k{$Ұ<9i7;1<\5Tߵ>[UN3uxeC|d RR~cG\^S1OVFRc H[~WHlP  xOkGm1ݱ^GwejbRX1k<4=q^y#O?V>qwO H6O3#s1Ng氜ovrԫ*s՜oRROyopFmcK!HbY$OxW߅z^%yy_mFI$]W\w?<-E?k|=f|A@8_3:b2{8Y۹d!q^{GuaOE~o4?<'+¾|K] -Kg m@YN$kk^3lׂ~ϣ[g~ X|}hC]#o͖=&Wc իi;Ej}ʺ_=;z1KBaYWG-`2Kpа%4cXbmj̞0]e{##d?_{kd+?&Xd@U#5 p<'J׼'Z:i%ۤpH$XxIVVH#^ge+#Be_{tv ,xEiwC2IkLx6U6f ]`P ?t P-.|GV[2uFg|ݮ[|ß | !Gt/Y<-'ط|gYM+w@y㯄 ~(e_ <3ֺݞglǻn3s +J<-hzk$F#8HT(U(ƥV࿌/G}[utE\BjSZ@|e-qnǞğW^uwOukvVUӮ#+yc9x)ԂdWaEyC󿷼UVM~Ѫic_/.\FO̭w(s~|^ g|?zE%3Edy?R9XmEwŬzZ]ݸAoyu$/*˹3mmg@[௃>W𮏨ZݵYYGy[gq3ŧZZ$Qon1A/G1,OG5ҭc/)(6\G*މs:ks 1#{=o6ϴY\y.iˋβ}T~lO=O f+hӺ+FMM{_)inf@.Yx7P|S F=YT?tG%OlbYcVhHg%ܑBP-B9͒?@y~M:Lj[QPEkoJ[BdD9]OKŚ5m+4_Iv ǨZwVjƩ'*y:(G/x^$:u,A,2F,3C,LA+߷҈} ~ ~+߷҈} ~ h/;aؿDݼ?eU__"z߈nIr_DOg6Ҽ[O1"h|Jo A~/^Y WqkW[ ݬ3 q RYkb>SW~kb>SW'{SҟD_  MEb n {+h?94cJ=T65Qꖿ6<_wMBڭ 6ŧܤxK{r' zx漋@:>/:b٦}7mo]K0dI'SQI(Cx!hUwWTl4+o-mڛ6c'v @ڼ7>KohگXO-)m3pʲ>7ߊ +Eq4Lzf>ǎx@ ޯRIeG_;8zrH6߅ >#M?\G?_o˼tf\ ŕ}އ5(ꢓH#Q/0VZGY8sqwr<nm *Vod<+zυ>05ow,l˲? ^efh҅v/4_{=QH  Nf쫁jdwWIsYUl'm@Ϥ<5KMx:+{;~G.|}[J|'&i%ޡ_\,FYHT3Z5CV+>kh"\G: !*YXҽ[= S7Y^JKs9mh|x±n># M߀a uOh7i0bHqo ʫ0dk!ҿe 3ߋ7F-vK !w)jfmZ4r4u.a6[iy7i¿ӹ[/|'~,%іt G3 +%$ag FIº~D~1R%35tD6| (I+zr/_uMoJ&{A<^e^ެ ʆe󑊪;j;,?> -5m'Ğ֭5{kDٴ"ȷÆ0vWZ-tNi[j#O>!Ks yTFAe5sGC׊~͠k xyoiR#ȭc'`^η3IhNarNS6v~Zjwdeoƞ)ћU ƅMe^[4n-k6vzir`F!-!5rVV~C'#JM˙ݚmwwVΘAzƑk=ޡ}nfDKvi~ТXͲl6;&wON֡èɧ2JѮ̐\4kב$|*b/(Oegj9We<\/Ϳ0ʏ3[m> \6}x@< pf$a1:אaۇz.&Ռv2^^iݏfc%0-&fm3nU*8E:6 UJXoiFJmtjm/>O|pukw:~x=.Tu*k9ѧpvο w1.*=GC#}TA+{9!83ּX:><; quZݤ ܷC?QF{{8hzm?;K6%φ4[dsY$B"?, ; EOxcPxomt M`]-wyb+U$*/v[?UFKVR*kI+Jk=/v-gǯOw{iZ5֥u*-cO)Ki6S$`]A-:|*#-orcq SBcȬrPVHyW5χ%/t~.iz`)Kmi<((LsSjvB+̹{]Jɤ~V_"QxKok!yWSH8Id!.-'w|x_gNwuvG!ێ>cq7 NhJֲok$'>׍h÷+_|(恤\l,@fDLl3cd.z (Jx+J6#1'p]EM? (=4c ds^e " Cg_o54ƹ Mees&+‘ ww ,z[_P+oKd{O9vdQm2(|tU.OO<IJK.UhֿٻOtK[5縒ҭ3MBфg2$%U,*Md vKY=MmY7ke5(GIB!tѡ xNMgmJ2I2h.X&gkn[XwOuߕ$wv6}u<y.Ra`.$v` ,h2:"^.>> ge {EM΅ewmݍp+ż#8W|].ėV?cQV ;]>i2# /Q^:ÿZ'56:}ݖh$Fm|KU;*k6VqXl<4*rVIZ;uk~,<);ÑjrtӖM2#;>, /?sž!i7ũm>* _FeeC> iڗl?AtkDU|>l?Ar+ý{zc?g]*q.G>A [Ιl G~?%xsñǵ?-7+Fuho/(>VgQq-~ʃW|+Z5W[Ǣ+>s@~G,+_F*;ҭD?+n>{ X¼WYd4E;HA^9HVc߅!ӫ=QSҟD_ W+֫9?ʼ{¿鿶ōJ2.<6^DoopOK+)?ʞ;qƏ$y7?K\ow-fQڭܰʇF:ᕁ+^K#LMzjs+5}'=dt%7|7+[][}VhՇ WH@$ד|~ B^cSQzG7zK+񧉬Ğ,ԢOcPҼqF0@){y$q҄5V']xoEoУE$ 0-g/SS}KGm,nbby"#rJN22z*+HRqwNO#^C+Hnc?^!e^C=Ɍ"?MHͩT)ETiS%'E~xDHc/gbQ ;?u> iYRc:|pG,rkY|o`+`sVW|}ͅV^g_e?𮣮fl%O^[nsGI_;nx@|cUX4buHRɦjn^8.bd^᧌5_K/>:Q׼CZCQ&-7"O5$&H f=u?e uEK?m|U6ej:fC,KZOF8toB20h^]ǃ%[/.dz+mO:Fľom.?njR5aUqe&({?02i>i>(5j^<l`mđb%wYym4\.f=[xWaf"HIXِ,V#"j .zOVz/?_Mg_x&Nu}N?ݵ³jY"Nc0n(<魩im];Y{i>0 _oM,+%$rK{ c +c~ ~źĽ?tF~էC^F#Bݛco3m-U~'jjOuh w/ty.`[h- .t" . ZIEZ^TU_Kǟ׏Ce׃ ~񾳥)}VD3Km KS1ty$G|a5xut-gŹ.ѧi]\M_ Em%$[/"M>*xN 5TյKp]_]m|pnNXYM,I#ֶRE904<i'~-K[g1[$mHR$1O"s3$K ϏH?p-&+xПN;O5aT?xVVx3"_:ú dRa]T[hKoFXZuG,]5淠x3ºwqwsu}aCvнԯ"(fyݤbs!2Ĕ\{qG{}mo2s& k> tԬ/x.dšڬ渁LR$/iwB_A?l_Zy[(\pIo4vk "KB PїϞ:%|O:S_N6+ [k7(Fy4e{VyqxSK5 9/vP L2I *Lr:ay e**NMg|d?4oxP֩|J[[ۤ.3 {Do."8 %Vi^x  OxZ͛xK .N/m˩fFm^37E3W>>,e}cu27We- ' ? ?$i &j"tiMe;ٓu_"I"}ipIRM:x?ϏANa:5~{]fGztsH'qm0ii+Ms^Bk6T N*Vc1$f v_I|վ_EƇ CDm֋y oSbe!I'Ѱg-Ԧ,i?/|-/xOռ?5M_Cmto2 >8tיB[KK-ew⏂x[_C:TC^KlBA yI"x} ( ( ( ( ( J( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Oy_K3rAň>cVڥ?}Ok#\~['lPƃ g?xR]NJ#?"ǬˆұC߅!ӫSB}+ž,ළɢk;Cǧv0eݍ)fVp0^)pg(W~|8+o1i5K$j:mōd$.ueVY? T2מ2Akr?lallHSV~̞"~[^o_#B;/;~܍vsʞ:_=I<ƌ_?$z>X^tK{>qŠP*8?G^Ly6xrm[K>&j:mͅo,.t`AV9fI9a鶖u KPƪ(* y?~͚v%S2AÕ$)!Axxt>G}O_I>?|T\v!\\OC (:HfuP Wא|p%^g,}EYD}QONpvyO=BI*jz]ޝZWPSȶt`AV9 m'N|7][,qAUDE* 1k:;k_aQӰbvBAPIVGT_Dz?)G 5QH y|[/VMstdBұ@o8n+!e\hQ2joW.>]Q txWoG~6<)䶿`HHH]PHx:xƾ)χSWd4I5gmv8]FoÏl4/CUf'tO xI,{ <7si ($]j%_oѴ/~ƾҼwmj:^5m&E>Ԣλ,s\I1 {_cn| W_xb;/7zx{_G}N8VY.#KE wX"5/ٟO: ZsgSζ/Ĺ1ҴpH4b0 "? W'|rO _ѧuq-oC&JJr-n>l}аeW}{{qH7zV| li Y;j>fS D] *7t$4~u4kz=ntD6qA2-H[S A &YHPSύ4x?x{_j_#o<һ %_#˶{&2|@uk 9|9;i |{ai6vz֝qk6$GI"I&|xļֿ?=T$o$-4ƴWsY,*+"g(ߴg?<3Q<=y/usvNSIW$Cl̨SPgMkAv$ॶdedFݛ챓yYi:\*g4uKIuF $o2c$t~px \| Kki&nea^j$*hc ~G#xmšH|apdZ%7hI`kV&qYncG:J-GIt>K7zd$S2e&9 3Me)+p*((((((((((((((((((((((((((((ϊA*6B_A*6B9Dv/=y=?xr{+ßDO^C?O|OW',/%wgwiEiI,5b|u_260٠ x(dF+GBD?<=״Iͳkży?ڳfo_j~$ONtR2|.l@ .Ĕ* s2.ntF-ѶM 2A$H d#5)?l̳^mZG.G'ݦv7$V0BemŒҟюM! Xm Ү4^xkqC4{eu܎ra t5uxSXxG𮣨x{H_oI-]*&!vEt['aw5_?1]ZO@M!5M--a mM=Ej$s%x/n<'CkE]3T[ˏy}*%hs,,b(KKn-`wؿMs1<h3|[㮫[mjjvjˤC6P ) ~avxV~ /5۽yR[ -/.^GdtbKfb@gu)H3@?xu𯋾*\?4{+0o\ipiehȓLR^OqwGnf*e0پ>Yx^[^0𞷥Z]PZ]in ##1vg0aS 9}?e+|:ҵ\hcZ ] ٙFܱm0C|,>>y ~>)~y;jx7'|gϳ'gGN5-*mI"WxsC'4qPxiio>Tu~/x{Xҍx{DI%MOepPai_%ٺ?|!cƾ,ִ>ij!w\B<R0ʀX?}mm<1s^"/v|/u>^>҈ԐM}0#O[=?ƟcG Y :5FmJE<5moukyh3_v1M5KwyW꿳oQk>x'9woe>\4KP[iv % KK})Y꿳 xž 5o:VVM;\\kY#b^N輓#2> x Zۿ57?y?vq"|!ּ=,jxB|\į _mM}gFV9O"D-~Ʊ?5i&k} Knw4k=cr%f`H@=A~4xV5o "=7zvz7;eDCL?o4Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y[H6E\WK[H6E\Ph.|8?۱u?dÿ5?7>v?> D_&z_c3W wkʢkT|ڋ$o_kƿfGwTF+t| _5x/nthZ6h<[KB,q:_ >x#WV4lݚ8, ! dlJ$s_ ?E5ǫ^1/?"Kty?ݪ Ui~? ?P*?ҿh߃:|U&NOy3[e>cdo&; 7I"Oci5?V&ztaWҧ#k<#n?upii]Cyx.~qv[o!t+"ݯN~AȮV{%5cs?ű +džuۜqa/[g?797OmFom"y:l]'>67V e0B?QgRKAXygakkPeEޗ3s5w.3;#4 {U죩suӧ_XuQH{ ?y?=ɨW_+./5 k ßnMZ>,|Ki ou Ghdl7mܻ9GomH5O_hjٚT^&צ]v6BuIhbUsR2u ^AEy`[$Y\o=HG%lZ&)>|b|uuc MKL]jHiZEˋaiLk@sŻfw״oڧc_ G[W!񮟩\Cgjv~%ķon$)y{9d{>N=);OݠO 9~8| }HkZ-tnET]Xⸯd?_L/Ծh^1w7j7d-Y,Cl KHQK]6mvM6-,/ ʏ28xicV8 E'hebM~Ag۴|xc'yo74KV\nQq཮uguwᅵݭ֥is)I!MOBdk,!h9t.$i' 5^$ԣ;Kyr[hsckȑV/7 | ?Z⟊XOIiU'#KqxR.RU]+|AxŞ~5ȶ[ⳆIʥʣ ݁߇~K;~Oѵ f/. QP},CxsT].yܞ!m [,] KhTeqm-ZArx>F|;aCºj)s-خt;)-m,z[Fz}EZI'$$Khdv}|F¿ $AҮx5-Cq7l}ޏwf%5@$VI&vF-C{iЊ|^ ᇇ~%:tZ_|/SB` ]Dڪ,/9rI}CI_3|tJԵ ^Dխo?~ugk4Ky[T/ @<[W¾5-GI-?86Gˢfq,_~wC i:AҦP7K:di>tZ[nO3.n8NߵOO|*c KPƉ{[ > v^ĸvy"Ȳ]miDiLxGXk-)W|? j^lvfFpNXEy7 xºcյ;9/cǶGO27XwG-˖^*ao[xaדÞ Х4{xZ`&hhT^gPh((((((((((((((((((((((((((ϊA*6B_A*6B3Ib3ג#d] Dv/=y7????O|1!g,_nGџ;%OYhσ; 6H洖8{eb$k|: JNJ:Vs.3f̝ln/5U qwuȮr -tz# R+zTd{ #}KHs:׌x,~k?\,YdIlckG%=?:8d۞%[ O_}]>Ϸ}n~\} _[>we^wg7۝"զqRgRiiJ' x1.oy7k[s\p8cJwZ7+g î*ɞaFGW( ฟ]lu%Z~~߳ů//wM=l5!}2UFI;7ˌ8~+1 &2DWƺW_^8z'|?yjX"İZȱ+d(fPN2@ 4+^𞧡knzn")cpUe%YXA Wj|[OL|2_Cn / <4-^}{-3GZnV 4 - /]OZ.$v!5W7@Ҳ3]i+N%h~4M/_Z~c[AoXp%K T 3ɤJ~€?;u{?iZ'*㧁85;T7~{SQ< 7)K=?ik?x'߅zt/ uJ3{ձM󭧎Mk%`)g+H~< ZZNiK9YVHm)!Hě[[N[L<9_ 4ѯ|k sk}YDpk6Skm'= [4KwB{% om1X#HKese@>BQe?gxG'Z_\G!ΓV8dx5aYc ,.w~,*|U𷂵^AAi-$3٪͛ b1{578DOwUloլ|֯men9X,mI`-dXEeYGLǏ9k[=NI4yJ*Epo!*U?~D6߳{GτuW EIjkZl'_P̨̒N33?)pĒ,B=2Ѡ|s1 "$N4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyo Qs_!]/o Qs_!BHb3אXZO5/+go_^y{3mǘDv/=y=?xrLk%_s#H?^53;~?ѿ h?^14:?ѿ ŸGBD"Yb/Ag=_o_?mZZ޻hwe6w{$8< Ϧ>+h!Y{LxP#j ?O՞A;H~8?ZxO|GͿ|X.[۠4D#sʊ2X| !O>Y4 Ce]oFsy5~I3qfi֤5YюH:+h#?Ǖo/u8~yROF /R±-ລ{s]5 ~= hR{W'*X&Itۛ"fk Gݍ 3.9|+KakO\u~}qu|3p*=kQdi~zBdԑ*3O>²{Ǎ_L4],G>?<#sVϗv4%b3^A_}ޤ-ƣ'neV 2n3?F'r_%gɓQE8ߋ>-|5 hjىd2ZLt"9e~􎢿'ş%|$5^h׺Ř4F\ޑcizYH-G6$H-d)߼VxP_BE`nţܵA=<Di=E ~5x ~0x2ᆕg57!:]btbT!R%*|;ӡ6?|U};|bO3g.n3_/fZm\ 3Aԭ8w◁tOO Sz>o|gιEv]E%5 ki-BnxcP%ۖ<̱̱Hʔ Q@VMO]u=?D4I. F`5/$*F 31I8W_KǺ..RVo]*H<l_jwq$v[OvKg*+7$ϏC;= 'X繂_us$>N.$_Mn I!1/A-k[|#o&mM/ڌWr[MAqWHe/ @E|}sо VWcEpkodl#9nXU h;v-MTs| xWۼ -"gfMwр}HzWw?CQTVi01GMZQyw[ q&$qB'e|Vq O?-Y'H[,0A9F6sk&8'> 4<(|c;g<ټ8;ʽ9VpyܺTgRm__csޓq^q5ݶh~>_yۿ>϶+6 ˥1IY.m|{<Thhw:w2MX2&b,ykR;.u{sG$ZZ:b?ѿ X?^3>{w2uO# OGOW?k5-L9o._^6_l|;.w(bqm\*_Hcyk}sgG{|ϳ߃v60k|7 |u j~%|{ֿlo kK}l!FI$3ɮ$li0)JNoMGʦkúޙO n~ۤqyV2p@>Vԋ{MH8Mū4#%`<_OX׭E?ʼHBWvo<14̇0UH k!ϐcHORM^A_['IW7vcvlk  }|:&~̍ݜdgXї-D̲9lG3mʥ W'|fmhd#Ή$ٿvzt˸yd^Ք%m?AßpZH0&~QMy89yO0,$T/~tQE#?&\[ypr+ c_.Or3pMB1\X ?-!{;Gšgj դ$-qdVh H2azM>j\x~ 'M<rb7\}K[8H_)Q;vmulFZW~ӷ,6}6O7CxF?lV4Keǯi%[[XKh;ิ#ԭiwRh?iX>W"Km>mgfWJ_ ~ 4 ZjIkzw1|Y4ދ)5Mbg[0]W对/~?xl5oz;: ^Zi"x/8:QEjm3O:?mhGV?t\lt$ַ.$ky)pl%#p>",۷⮗ܯinp>$|eφŇ?:xzk^CM͆h ZPFV,Ou GZKHP{[y/$l!Y v#q%x kszcdݬ7 |XkgY~ҵ]7]֝躍Gsce:2(hE%]He`H 57.ܚޗ\#4<T,$5<[+8Mѧϣ6fyْtH03 B|A|.|wOoƺ~%E}mO@{>q<9%ͼw0s[-̪4e,Xe~w(ӟO𦗭}=B,;.q F٤vv7n$zMW$o(J/REM'QMG{Zt |/O/|:g-tO~DfR(. &ue,AWZxi]@V:=i:yog 6w6Qʼnk d& Rhff'Ǻᯇ VuepI{f ႶӃx+OxQq–$khiqisKArƻÏv;x`fWD}s~rƾ>+1}'mҳJc̝O wWm0e&ycxH,49 r˪]&23 ^sod<;u}lZqwwIfF&ݙn08w\E=wJ|Ag,ךیtRB M^(9 j' xL)iV:}ۂo}gFd!?iRaHm/;iv񞇡jtMgW<]:"o=:(E_-A DB^'; K /M5\:RI 7|Ȏ[ y5KJnl7k/q:?V$2&H?T?x[ >ׇtJݥ <,rQc&/"ݕρ;/qZu¹"x=rɍa:L˥Z֍vגZ[SxL־6\Wtڕ|)$fL2Ha&i%ťsMȓK4p~XEy 0Y(u#_.Z%7tWY̵~k˧@k[JC8.'ȐJdOğ2H?|9<?]mj=QtnsXJq5ؿeyA4UJUi=μ7 |OķS/{kfwv1g2"B2~_ټ%IĶ&eڪW %ʛ#Oό<5|D~.x_6 g5Y滑mcuM[m>0i?î_lF#$H~ө^Ic*es>lc3 0Q'4b!RWWoeoş5xYӼs_WM0 4vb?< nX* ?S06σ†_[WgE/g/?Sxÿ =_Vwt&1p~ͪ^YCsawyws)Yо#.: =o6I#eYk)܄`r: MJ ͞ytU'/uy.ܺ鮚jq,|~Ϛ Tk~5w6@< pf$ahl[ Gְ2H.-/u[fi5˥;98yf;bI%P`(Œ{ j?tCFJnu8p>vTgSn8K^uZIɷdJZ%-EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkDU|>l?AtkDU|>l?As_"z ߷Gۏ{9M: cK;unVUAdlG_$xwñǵ?-7Furuz g?>fǎIZ?.|Cn>kvWU|Ex¿/ Q o->= {:u{"A^7cžֶ݌(I^AN?/&}_yÏ.s^7yUbvz{/S>Q3&~[+qi[Z]D~4N:"22Uo%+$Vx_?s{^9OWOZ_ x{[fYk{"uܤ0ʒ2#Oaw?lYyjl@@QIss H:|_>igk:c6ͭy!4fۖ,I51WJ끝J6+#*9OMIQ=npGtyC~['IH#ُ\ŞhdMJܩ ^:׏>GwKz[?AjWoShe\FVR}O5#;oڭ3^Ay_ekzG_Gjsvh=N+˿bٕCU8=(<$f q3[}%es sjmwl/a}[J|)&i%ޡ_,FYDER@Nh75n||B3)x|aiIցgխ4>Ά;̪o- TN$ +9~;_*H]hm/C_'u%fx?z m'ٿCx kHyvTf8ۥy`7 zNJ?g \^M!w"|v흦7076 #6YXA I3x-Zm+NUoxgM2 q8< ٵ{giZ}- ͵BH捁VFVᔂA r6ցቭ|l }5eQ x;KFxgAY#Gx[M*ުR6`*<MgB/^ ӵ]GFMt{WHHբy4iJ`fex7Y#|~euVerr:֋-c0g>yҒ.`{ޅ|Ywm pxJ5 ln-5};R"ζwO!|XYWs*+rtZhO~;e~Pt订o2An"V)#\1Fr V ~מ&t[]jXƷs6(p8RiuVG 7&HC@UFe`qbqCvYxĖZ\\ 7+ Km9K;P~oAD?zfh5#WǝgCvQna> QSp4xV:&h7^.u݀[I;g[r<||=?j#B97[:LጇXiBxSO4hX7Wm/8.?Ě5oꎋ2:2 ?- ➝w[h;+ĶƲNfEʯdž 3O?OO,}+N}8z5wlikh'o KOo*,M !k]׃g#X< z_e^f '6:$Y;o2+-Z*±;?|7ï?:$mw> :IQVU.V4RB(h>T ?D>_)=kY}kr:(((((((((((((((((((((((<$[~J"k!+$[~J"ka(?{/=xE>Z&!'fZm_*n+"?;s;R}*<N?Zd:W/8x3O:O}}>gwl}3gK1Սq>_xG~lf+y4 Hy]F'[XŒ{?J5?% u)1^C;_<#ߧ.;o.kpPY|+<?ޛ{Ϸk'eϝhٖ*;Pd|~MEHfy:ǀ8Ic+4L?+Xum/;aOy;xRƹ([>%#?IB^C8i9Y 9t[H6yY Rfgü~|c=# W袊8Gҳq>;GN8I_"L0G+ݻ#(]5h/t+?WUšii#iko}wwn7y;y:oڠO ._x;@Veky},]}qgn,ij6 )~|(Vxg-l}6)լ{+ ίs,!yd>NPEP^{㯊>pt|Y}V|m }GWo%ה+\dE,= G_ ;/A5϶kyt%E{!ds8?ǏVZύO>#ǧye[E@x~ [;~j y$/.*l7K Lͯ+yo/lt+N߻=7Cm A%2LegB@( Iq$PvN2NvJGh%6ScfG,t4?kh o^7uK4/'}췻7I>,TRMf7Iep?s춷~Įa>ds@7Ʃie_#&tkڿ;w|ѯ]˷ڮgٵR/*58j{-[*%`f&j {ɵ<ۻhB %"t.;OAx[G/@QaT m#Ni gWK7%{{_ Cw\펡 7S% 7O\Cvl2́fFhmf蚷4+O4};̶}lIeVڕ@)+xi5_j~1~~ugw7B]B(m|.tf-qDG+'!?Wy jMjv>0#F5~ 2HmZ+xuXy*aEk>/[UaG*YwX𷂾0xO_\ooiv6Vv/gkk;1[$xw|)q Y_<.Y-q;DP[ ,q #+K$(f}[U+ )_WǧڤW^Rȯ'q>&~ҿ>\v> )5#]WO-RpWLd%L$ڎ˹⏂|wO_wk͟mob,)%KMKd!B)q_~[-c1s xOP&vҥŕ3,6/otw`lRPa]Z{Wl'{hr U,| ?4&K9/6 u;iOy_z"meAkh:Ÿ k~3)c/ž-I^<ߖ!ͽrFAAf>h^:+Χ=m7Wm1>ctn3_ x ¿~#Z+]JL PYK("$Ey@w;>*c(O^5> R^kZޯ.x} =ϐD)^k/QtQE`0((((((((((((((((((((>+߷҈} ~ ~+߷҈} ~ h/;aؿDa?ºbO[T-pZ%T,?h/;aؿD_x7/㟇?jH|˿nw.qݖՍ<]9"kg6YԝcPWca/Sk}򿵵ϻd{z31=4co `G_ۤWw߷v3\Qe  τ|Z&yxNaJNKe4עLދ=TӴcjZ]wgu N^7FYX &_]VS<Owyu3K5įiűw x'II-T8#_#?aKb/*]}䚙[̴%ҞZ)#efHIcT1q\'ğ xir[E,[\ UۉH,(oͰw_*ӣVӡ"CH sGhƧU? >E{^WkzɵUi I/l煎8Rh=1\ 2ZR V;{g* SIM'-F5fGyל~4?ι i][[,H&PHIpѺdte<]6N+ŵ.Jr7Gxs"V<;fqf͟.fb(` {k>]cúV^A`9bɣpF% VOO_xjŭ5Ɲ-eĖ&ķfCa]iWh7꼒HxϏ@t ϥ뻏io\ oi,;n`~&x:φuoڥwc' Qr*eHH5WCiw~8{֓S0_~~-xK@^&=LbEKɒO&eVp 2 j>?><~ў8wR8\jihMm`fXܪ Wdp6SxA5Qu}G#êix&|3O<;?wگ/|#iRӏ-%h^DC䤋fWkV:%,R^) p E(NEz}(׎u-k?|A_ y7O,ΟL^Ym$ Ske2]K`x㯌~" i}> %Me z!.FOo~!xMɤ:Ӽ; Ɲ$&P]>bxg">z *i.uþ/ѴKKmGC5\nH˕UȔufK"oQK;yxщ#hX,˴nJ+4o^~"lմ/'FHҾmYh7;aNvM>wxB[߉|Sf$[ěㅈY@ S}ѿj?DŽ>"t}'W5m_]ciYg|gE;3'ubtW|!㯇uG᧌!ЕZ(4&)'fBmbOoaz}}'[yws|.˷bFA?E..-LYAu<1+76ῈedӺ:Y8'ml\JBh>ǸKס;K_)i=H񿂿-댶lyO C;`ԠF$rvqs^+5oHOvii}1e%6@"mb~{WޥRITD69|z4-+ EehdB\#*A>kg cᏌ>4,ms7h.0nYgu3 kwn2*/cWK _W$%tXcctI R[Ccr92z̼rV;0DuȦ݆$~SE3xo^6[<$FoI, */|GeiJ%t۵Nc,$)67#}GՈF}_g~9{E ̵Z?VoSsɯ?zѼoeR?*Y-4$}Ukʾ.iDOѭi%(YQ@9ky.-mb}k:-sr'.st\>$#A=ygiZSMtkkiVH22H  zicQqO(wsa?cH.U X8F5U^6IBTh8[S @lc?~kxn=N+HKXEIOt`n,) yOqj||s'34x:LJxľ?ּKq|8S57WMGLX"Y1Lo+!*>k? Whޓ{ϫgWDj/stfY|F1ɶk_ o ?>#Vs4K˟a,wlg[%cbU7ğw2]ɦh{mIO :.IuإT I:@%C_uOiυ6㿅>*>*ƾ t˭_I^ԭHcKuGD$X _x /|i%ԋjsV(S&"]Lak!{? >8CLxƟ \5eAͨhw/=ݢ2c"<"9X⹷ +'?g?4_^ oχuO.Pm ˭-⾒o6줿F`n5I|d[6??qxWz*zn4Bk3`Y-q,aPgX xߵO~6^(jZ/l;;^;6Ic8#Eqm.~hz&]ẼF>xcSö;HcKd_Yoq}=nҴN/?mik*j$)1Q3߽HGWA]Xƍ -l,8fn`BE,3={f&3>ؘ'_k<Q?=c/ڿ>N⯇k~?Kh~X,VŮ.`I?%./G/oxW BŦ3]C@`M1bn[.m$M\D%]?x<-oؼ?xfjަW[--#$35j1^/eh; {P|[淦^[Ě>je"nɺ%ͦ Ŀ|+,4oncgb్fy&]C#־"noA!F!׊u|Ka1O5 Wz}g\+ʬgRKx|}|BbY|?ӼMKJ4sÚ5o ?n[yo D.eAoֹV8MoÿƏ /g+CiᙼKkJym4^sԐ&Qle?؃tS|H4 o[7·A,T24<ChXDS?Ρek*~x& ?@׵?I$IPIdu icEa ?c6J־xDUDH{j6L,&nŢIwjΑiuA/42,?嗊[3>x5t)tky` Z))&Wı&ƿ_  |9wiڞ'ߤ2Yij'-Q{t[g07x O? ak?U,MYk6u)f<*-.T̹.m,?S3xKz;?oq4 $wRđB*RLmgAxNn~8$Zu[>*GC4PIJgB#vPsxFt+/ZCv֯<'h7%X/ÌHP1*|tO(?6Z7<;໏Z:x~&KvugrtGѾm}φW^xᮮ4o Vy\ږ-14PEi@ Ey|C7Ý@u '5U-`WDu.!hvGsd((((((((((((((((((((ϊA*6B_A*6Be5 7o{wg˟vͩۘN(Ք1k:hg'o>//hi> muK8o#U8!YQd ̡¸+08'\Či~ xsk׮=RGe{e3N[O6KDnƧ/di_u?KXG1II.}9g#y@5~:麅TxbtkXWӦ :=HȘfV`X鯟Odzz[+P1̍ԫ.!A# ;S1Ҥ$5 8InHMJQs\Ե+k u}}/VcY`uOj`mZvKY!Xv;E BBȷ/H?_vzޮI,s=mTD6mcu &?_|w]//֭h~sw|W?qI-$A'ƍ*=vɰ@=o~Һ΅.5׼-kVH3LIrZ󛗍-{rY_?xCоS]g o>Q5-?̩=?̋,d<5ƥoZh?%hsxkLx^emjLrIjdMt$!oy->%4O77Z_cvyWp+t+@𶙡Zfzuvz~cl[A(PUUUT 4nfמG.|; 4{I}" XGcl?AtkDU|>l?Aqm=WX-#E25A keDžn..$gi6gv<1$y''ãXZŞHv_oɿ"O'­0 P:+R+tj9b Y_|][2~ ^%W6z>x .cf Ep8⼿?ɾ<=t۲%^Hp̲/F2< 7EG&iXz )2,+ 5}4$kno꽤=S1YN|Sf:G/dyRD~ӻ/?iݸy{_O1Rk_\ާFxkEP×왾izΝnV6rR努u|1!4ymmntKePuglwD`BU*y/^j>(YV~Ϸwgv/sSsָ/ڭR t x+^4Ki][֙7J*G4k", 3OZ'׍=?>& >[ k|A‡rAoZT,~c#_[rF6G적\JZz=Q.VUG|P=ch6=#[@όKlNN)*zo|FfGui?E"FAtLr0kG5{YǑ+&mR?*37I%[ChH+erT3~~fН._{5QX[O._ Zφ _Ҽmk:&B}^P6gKw,W72%'_+wݢxH]2LӖNC2[^ǾuiSL۠[^G~_k:oޝwf#s]}-lfv%UTa Ÿ -|#?'ZEPfE&_!s4ψm߬RiƓۀ}3MN{^Ӽa+> ˢkEul)@;w.9V y[x*|C'jVp%ZF![Er5kV \T:Vgi~iqyn"o2OX$X:+ .uoRQ@~*k%eҿ༚i֦_:HFb#2j7n$. gEEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkDU|>l?AtkDU|>d?Ar:nŏ=yW]~m^.,يEKD`AȓG O^o W/#B-Pks躍gwg3,N[O2MEnƧ_[ntڋ5_Nj1f?&}?`+g~͛{Pzy3y"\i7co,wV{E^c_ L6ݗ~۵&:~>L{-bCV8ozJ~mt.~_߲v_Zi:rVE@TP̀Թ1Sմ;ZΡkz{m% ,1:xF]IH A-:kk=#WsjXdA:erX1Z/)~ѽ2Wf|gu DsqÀ"i*NKoxR 2{Y?)u?g{ 1x?P!..#I%nʫ7`ƽ349ҌGB^?siWZPkB$1u&U1d[I,~хw+ؗ >x6^4GoS][Η>s-#6 3 c.5{Z#ך+mB S%E* bN0їX|.~2o~}?䖺]:BJ?"gq$H!jztB!$s#) e Ak,5_gQIu*Om;·y%A?Jmwq{o q#I-Ĉ\r\3VQN"㽿Aѭ(7?GHq FZiSg9S]y;ٽN\Eij,ryyY??&t\v*fȫhJNb Cd mNBFgY]KrF2kŮ*3sWgJWWYEe~5ӯ /PuR]]>K{Y&Y.R42 @=+cSJn> j3 t-RJJ5MiMI!1,S\L|Ō=u~ǖSKi__D{Y/#Ѽf^MvWs$VI4UCzO쉭~168#PhVLIy%XGv3IʪFĀƾ^>DŧV:JEY,Q±aA@{0kwS;QE|_~*?Q_?ͧOvK,]q}N,R7F!-w=+w?}/? kCVnOXŭd+1Z˶ْB|kV|SYq64h^.Q+O{GpĤ6_i}>EFsyIௌiOi+5MSǚu?4[DWvXk)qJ;_[kn~>t~6cMƩ-x^?u溒%wZCjfYF<Ā\:6GZ~YU;[KT&# xb)8PW? Z.Z BFcvw:I[sJ4iŞ S??wcƞ+]'Lσu;hc ;뛫X#Ha9@o S'wu oL\hfK;|@%))僱Mĕ_i|-=#^"N~%iCy}3fU7o'j>W_%_OOY|awIEzT}BMr)m%CA"Kns o60ѼMNW<`zo$9톕e F"gw22c[=4?xGs[Xx[DM) 70C!, (F6G6~;|:Z*!i`[i6y| FEn-th3ށf/7tk_W jZ}͂Kx}mZ`NBݒoDtTWOi^O<>چM~Ӵ5K1uzV;[eY]y2N|#NLլtEŕwe,d"wysHp>>zqW;/^8[^O> ҭM"xkq Ur:p@"KKI{P^`/|Z- wM,k'NK}I或{vI)LI1M`wČd?|3Gޕk3x4^Hٲ鯙켂)n$ F1om=/;(u)&W8#=k~ć7_KK'4;UM,g$Zlv.US'>x{Aw~Spw+)>< F>Ŧ׺/m-91mzMvF_՝_ɯKT=UtcWNciiW+,7:xH*F$/:ޣ=?JM+_fo+<^InaLrHcdku? >7X|_xW(>eXe +G cg)ʗWfW%cZ^:2"r@~xP`eu|NY3?*[G R2 +d*F=t wpޠb4zU;+Yq&bU̐@ }ޫ׭SWoUM}=ʼcc];GPNXu̲pdD 3F)|nX}M{3sҩ/lC+G]u3FW=2OfIѺWV\R "wsyN__. LE䷑i/m#PK31-5s,cޗ]惯i~%ͮ]}}3FѼlQt`9Ցeee` UJV\ٗ[hXgl)pwP[?7L`coZkPpxK-mۿK8W\:T( j-yş ^xX: :]5ZuėBܽ,,P@ź" M_xJ?4+?j:I{hr1k>&׮'F]!W7Im3m[iˎԯ>M?|ULbڶyzŔfϱcfg^h|G?%_x? |->8_ON>+*]-yk mؑĒ[x: *k/udmaEOڭ~w̰->NPEPzkƶ>gtxKy7W=;_/ T';N+|km?KW𿊡t3ɠi^.mO6| H-`|?_l~ eT_ZA=λ4wwsjbȷZݍVA I#+ڟ5;:GǔTtW:fg M ‘A}E5>_-> OisM7$w[xV :eޝa^/&[3$?YVhS絽ĐO4s)mƗ~ ĺkRk6bѴ k_LV/1c!xbV;c:JO&|8Z|*ׁS[ECnng1}dX,伵\Fs6*ZyZ2RqZ;39t} z+Pu}'ž%ΟM >kHc3D A[gS]/vҮ5麍晭B,#0>[ʖDKhKFb6('^ֵOxP?ksYykFQ5w6J+ m9 Kw}u t2]i/|Sg0D-ZA)yPpw ʪNG7vOKu|aZYgxsǚwၧY5}[qmld\n Ւ?xu=/H 2躄ւ{k-eťV1w0/?A׾~&xgB>%<+{XX7b2C `CJ Ǝ# !DlW5xFžOK\hږvSC Գ>TyL!7O3&ݒoKyy6}n,OhnK˯ktI.Ѳִ[7 ~}SSEq㿃~2O~=G>ώ$ōĺMI/b[y#m]fchzt/ zEφ~7:P\X^z]2xlyx3$P(Ax-٫ZVVvcMJʋd(&g')9d''KS75~^$W}?]K)|?ҵkm"Of $R-R6Gr}S>.K?[k]?Me7PyN|tik}pӁj/57k=v_ Z%֖N DƷ39Q4dsN SQO,nR{{$@J2 ̒|c6׾<|)|Jp\O{,cw:EEl%7xHe=| _0ٴSWy xF{xR6wv㼀y5A<}kyo<_o;+in0[5-mgI> kO+{FYJ߄"~4|Jt no.E^$p)_e3EW.m]  ]hw&y}\6&IӋmnA[@i$Ha[=qM[n'Kƾ4oVݿtkHm+MRsgoiyƪ />E=?q׎ϋ<å[#m%H+[-F&U5O^ Oh!6CN5kZ6o@|=XH+MOM`H mGT|U|,?TK&k.̴mw-BkƎȿ=Hux~KŨڋn"&'f2.v]YOu?h߈/ '$Iuc_hs$o%ufuKR0sZ?_ZvGny7$wX$V_1b 1GDp7ׁtzwrF7OHWnL1KxLv+#$0.6TSVoKlF>WͩIhFM:Y;m/Z]FAfbk;hV[$M4ArfCj5O"m&R[? qk&b)qy]3,q00xvӹx{'~쫿}#ȥkhfE\Yg%JX!ħl>7>Ǿt-LZ7t-1kg==vyK,WoZQ)g_:dH$\۫Kmֺ$slsJ:xjCxm}bګ4 I-ewI BR@>;ǁ-cS\Z扩KMk6%8"Gs;3L X[{*H*O$iqDuY3x5 jWz6 [ͧx(b;wHnKH/,d~лvKh<k/REWӢ2iʯ1s(}N0䄓n8Դ=m]u]:q}?QUh/>ԼKQV2ޱMv찴H6ԸbTF4d_~'i##]bY\]hi(HXcgs$(܁[b5h[_+[IW-ӼuDV 흶oQR`JMkp#Exe$T櫦iχ/ZS {{;VXn"u*6C+AR0A ׎Qa򮕭AԲ7M0Y\Cjy#'{vj$Og/5i#| Ï^^K5u3H5K`Jo#mDq&;X={5v-!OZVbzmʫ* 0`e*"<ȲFj햣xM?z$gi4FI$flAs~j̅i V*]XzR4S\~u> 4JE֭~c6UdhX5/K_k+|Ro{)RDlޡ1EzDf$V/u{\)i_ s)EV @b&_Mtr1t-Ysrvykj-s-㏅~%W,?<3 *K64SG6W]7+ ]yśwK>%~<+ϤOhj1]% [YHʗs ReY_jf΃|A1xL3_u_#E-楦Xs-4 '2]еmu ohKkzew5YEg< bDXCqjױ|o [~$~ $c[N7YjI+ym.O.i%`Ô? !O;hڇiMu5-}-]5ශ 4mYm@>NPEPkS௅xP KQX.c!nmo6C@#G46AG|]s"x? /]s*xFR Z"³K]=uG}I?٘櫥k_J?ٺG5kH趒Mgp"0Oe$h򮌤H|xWe>ޢ4huh#Ե-tl &vҭ-x!<շK T_|_nOQV<sgs=6Vv/gki;1[u[xʼl|KǺ'oY<3&ch#'lw I.M~ÝDG~HY?džu j't[4^6V2,*i/H8⮜JWSO.|!{-C/ut7ψakj"(mXDvĄYRE=[~:վ'ŭGwȶe:+ų1-wa&Xv> xWß@w@nZƑjv<r_PH`;@i'yŏx_Yt@oQa?IdI 'ΆHwJڎ`쩖Ԃmz5rm|cx;^~[ O~C{ơ2@j.FgR^csY~2|_aȏL\ַd>=t07}m[oݾ{w]/S\iM\qmi0,Rʐ^Xvnm_jC^áf7ҭjCCQqi6]Vm8_a2<7A {ko<Ϥt>jY5xwծ|Aie5&vH Vr<|dw)ʳwk_w|I G-sXȺxN('o4ID9ogl^lI..0-Ǖ\Ȟx\h^)W|3Aac%']Vɯ&K#q ۋƖAj#X=Bwͷ,~ [hږΑD~TYPwj6i!y>hڇB~?6Μ5ONOa_-t|p啤wrTP>k_9{~ ItnHϨ'3@<]~ş^/WZf>z6 /42fPF8 <OCkܰAuY0[Zp q5 f+$=!Wž'Lj4 *u卾h?Ҭ+@8$M"tcs1/~ѿ[xM>'|Ե$оgKg÷.,ף|W %;(ZBo:O'VoQkZ`kh &#\UiV-#&ހ=;[~6Ϗ`~?ht_<_IgU$qiV2˦M56J)඾b$ iBFWc-(,+ohcԮ(I?x+[좟GO: yQeֱT9@1^п,G{.G׹_+=RE>sqhK;y%6 RuF:V/$|=p#Ů }> -QC*BknDvK!X?NiOZ'uUW!е?:h֩z_\i h喊)Nc$enИ+Ѽk#σt4Ke*fxcVrAbg s:WS(pr1SeqQEjqQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}N] ֭YbgMdn":_|5VqGوvS}O#?,u*O?4 x~*cbac@cu_ IQR8 'V3}IQ2g yw/V(EΟFP_vO_S~|ׇuImm/,V{+[ncެeU6(в1c ~'ԡ|o\Fח&m'SeL'Xt4?aG^?$t^74o|9׼)+? Yԭ|׏΂h9r˹Xg p G\exo/$uxuXP"Ā#icz Azzfj:ŏ^mMcMwiSĭwcn0A tZ$Ipϝ:2뷯;υ5Z@O񇇧}<]3GRFcDRcC yr"'tON7k:>gi7se{g:2(d7RUє h\NFn;Ś< oi^ZZ]֗6oqfBFdbcԞAyx7,o/y-Э"iT 5F-Y"[A^^մMKKKKYVXn"u #!AzQ<>yU`/^}v?J[k!tYPHPYsgݙC ۾M>$㹵ivrV[yhZ9$) 3M%uT1}dI96#w\HxEYJS]0jhq/jj^.XOwC ^I$Tdnt 7QմK=OK4Vkky4lWV AE]e  1ҼZ߅5xK)fkCE[{rZi݀0\\A#ި=^5-%'Onhb~-'d{?=gt|kuh>m~>G[CHe@M xlv4R=T%ԤLf?h mO Nb_ɟHo 6>\e,t/k;XմzZ~֒]Aoij^IeTTfbqZ5CǍxz -eo\ƥ42|Uc]9ῌ3M{ڝ@Q@5<ө3Ԋ? }\ g}L6|Ӌ]a]xS~-kssK-67QHK$q.B3 [0 {a#Mѭ<' .y dq nMo|!y`|uj0:$֝yi E%W Ks "]\ d$RZ}KŸ }֒O+h$ yHӢEchE⹹)><_t"{[ya3;ض-#JC++lԐ;/|'|,n͇Ώsa+|Z=27cvqSWρ<_O ^|=e[y'\Hl5=okWdT']%b)Qisk|E4ܛ:#7;@lI/tOg.]">,[4j˜4OJׄnt Figܶ&9+eλD p@=b\tk|?4;RǼ+Xm<U9֩o \iq%LjE ˻:Fe-g p^>^W|'Z]ZI B6NUfO$ nVFڗ<i>, VCg%O|q?Wx h6[Gthr3.!vO 4.3{WZw /B}5ޭ%玶tinFؗ6Gryu''B >_O?)yE?m3w߸LH>lo`?cO?wV?Nu7d7P 9al帆g*p2~`'|Eе?> Ahv{y`ңd$8n%BI̡ ~|3gsˉf|,O#٧A&XJHL&d>Rվ|G> *`o6i>>!3~g%%ϗ~k}~pil񯐿wC^;H ?}L _͉TMqW9l>1i RmVT2鳃8/PX| ]2_мu};/uhEn"0v6@x:O<3[W6}jF772v,T #>;ipt:3oč\<_཰l:{;1o7l@lؕ@>?tמ-|Dgt[BRxkf,Pi_6kKKvDnx +]Bs};ouJhEn"d/ocH4Iѯ5oDMMuy~}3ZƧksw!mw Ɨȿ+ı {loZ\Z\\:?oO뚏OxĿՆmcZOo\p 5ok֗ynjq6T;Su5 &u Ex/>)Ht Nϛ , g5X},Mǘ[GrM<;CGT$>c}{; d.>Zf3$m1i RmVT2鳃8/PXmEs)ѵ/xH|YzV[\m4#[Ko# ]A:{w?x{|0 )\E?m3w߸LH>lo`>=x-v(6TwYi\%he0f `"O_<-fSWCkif4r uC:=4yܭ Q ?o5 ;lzg;QEZkh+ߋK[O[<m 1FݡO[׊auy ehϤK% xe<_Ft S[}ލ4]3^WU0iwLdiWG 7 cVjz~|MaeeC=gBn. dj/38|? S/H.Wcڿba6Tz!o4G[KHP{[i<#䕢qTi\ r7 {xǾ y5x¾ [h/V$8dKGm p|?oy  ?紺--4m7F;xKnۿi?M}_m0Q_B-$RD۞̺ kkvkeؙ7mbg|iXYus-ڬ"iX ᙔ rOK_?TxsZ/]^i~qio,jfB'>L*W<;/^Wᗋ4M!<m_A/ mfm:m'mzss'~ [ |fq%M&ދ^lzsn]C)}WTe(nK-{;{Fww>3o%5^a7@;Q3FAv ϧ <4|$=W@+P.L|7J>^yS[keIE-/ci;oL53y|i7uʢ"s;TNU8m2TuT^^^Gx oh7.zZ[gl.Ԭ6Tr#WҴwi:m% 52)GHte%JA^]5<;-đ-nX7ʫ$[YIb֬^4`WU6-<_ྩwXaFRonWN{FvXYw麓UPm+ž+iZ|X}kUiZ#33߅7SxlΓ熴kF,u}.loYEFJ2C) %4Goۡy~|EּJ6VXHxWI^}ImϘᐪA,FЭ^ܬs~PGxK|+񷆾O6O?߿mbD'֋}Oie4oI#xGUttuVR*tSUO4_NJzz=t_k  _T$|\ d=^=AmXF[±,["qCZ% kt}:z^91)O\QY)hs>5?f>6XXT]ˬ\j/]uf7]>%x _. f'^|3_tK_[1ev."ќn&pDѹ?*UaGpKf-_mvoOSBG[KYOldH̀,rF|Ie~=jWڔvv;9kѬkW*ryua5 4g~|ñj FziQqieǿkcijiQPXpEg7 4n; CKDWcWm 2K-uX.EotD!.ҠhfIkc |__5t$>+NEFȉ+yHؒK4 bBW&M|(ơr~{I-4"\(m$Ǡ6ֱx]%:x1y"7[aGv)B$ĜnqSL}pk?zX_LU&iş&%ͨy =pۍ><u]9pIWx|al9oQPEk<=ʉ#FanB#›xq'P? Գ#HI?koPZA:GlDbu em>1<I]W6//W65ܿ홠Vir8CK*]SL"GŵQxgQ=)|d~C+?ř{x6/!ðM2le61)fY/QNx45+x<D}>4s띐'eo+G!]&W9E@p0|lox  k_̭̓Q[TuɑKV^x⏌'ψ_SOg"{{QHD1s"4omʢ%Yc3LnJ$1]T1G~&Z I?0^ ?*A1?|A$N񕵍ƍ$ 5#{7s-9dߌ!QR<@nGbLw~2[$Y>7Ik඗ʻk/*I6Q4"}<|V]\T6]g2I WSS)>†)>†.;';jW O?O?0Ix. Fc _oCk _wCk_ĝJ _3_?W=? O?O?/5w)|B O?W?7\KgKui]E'Pt]E'Pu$nqšd\@I6]I6]fy .K1€4k-(m?k.(m2xqΡrxg)< gPPi(mWë {8R ݀~ f ~+&>0՝-=/\ Ȯ?ʹFh1\<:\iEUNs[U=tŏ |0޵e0@O_Oo}DK&WKn9Ѳ/fV%wݫj|nk08pv?j qx ٪A/F /*|qƟ 60 nDP23ֿb4~չd18MSO髾C Y$lkhOL|#COgG&>3mC>/L|#COgG&>3mCb?4oqTc|78V!Q ?*/L|#COgG&>3mCb?4oqTc|78V!Q ?*/L|#COgG&>3mCb?4oqTc|78V!Q ?*/L|#COgG&>3mCb?4oqTc|78V!Q ?*/L|#COgG&>3mCb?4oqTc|78V!Q ?*/L|#COgG&>3mCb?4oqTc|78V!Q ?*/L|#COgG&>3mCb?4oqTeW¶xʩ:-#hnj<$TiEQ J<; EW:σ*n"u᳹7G2J6|u_ ]oWnjwLevtP,R2@ӭ/nomF@/?4x{QU4~?cqi\[h!kmtRW%GF}>~о ڷc-ͣ@mB4qP|bg5Zo{h΅jKkyO78 y=Q/5t5;Y}NĶ팙P'8;XK<1:l y7:TsąUWF_z=KPt+OSO¤HKz S l{o-wbh>[nU9R _'h6,^PQ#LiW+}Eyo=:.$,b2w]Ky KFb 4/!1眼<ӥ.zCqjusXe9x\|d'7obmr`V)ٮHK+^ :e\Z]̲ŷ^7-Ok]ZOy2izڪ1B%dHo3<~T [IA)U9hL*8;5kvh]ٗ*,T[ZH$h}GlOO\?! tGeomYH|'~2 ܾ}K eݵ9chOŚ 4Muktd-Mf$(gEfUH'yӄO~+zJdu= YpTGC^:t|ñk{7GecG!U@G R1Қ2q=g 7Ou~g+g:5[MRͽү-+<<3.(.q=v-Wž(Gu\ʑ4HPY:[OWկgg?{Þ>?~4.u+)${`W([Q`s 'x&Z{V1EueݱkP y=DRWuX]xz忥|_UC]]&8Ւr?k9F/5o@啦m6}1'[Vc"nVR,j?akJQo&!Z=;[X.n7D4Qʎ'E1"1>;ћZ]GiVgHԭdH"x5{C̖p0ynZ`;@b,@n rEvNqO?"shw2G4.\k{oz 8UMe#(o,Ý{OZyp|m٫[ZGk[5=#7[%h!%2B\HEy_vnk_b? ^/%. iP,:\ڈB^yNp61~9izOW'l4'M@=JKtf!h(0o3w/j:VPR񮵥XZ5Y-:F0FpWz1#\xþuX-eM,ֳ:һ/흔饍R2+/mԺ>;:|_/{[|]oO'2YYEcEn߻)ϖsFK|Е+<1|3kM}Dͤ6Z[Y p(>8F;4O?i k7}FPImi'"' s?ey3aoOcch֓MRwӄ&.k܁P Wj2E Εuo{{KynTbA@*?~/.)'?5GS^Ϗn}:? lJVMf=٫o;],noSUk}Tw G?콟5]CPӾ-xtxW m Al~ͥ=BK'Vf\Ό]rWz_[ꚝ4{H]Udff8@h kc`ڿ'+'5GW^|}t\$t||sn/5VKS>=]G]Fy݀ 1O x_/DM7~j1gϙ͸'G+K_s[^۬ط1#z#ե?X=siF{}7Q+mF[Ug"˙8 ! Vax| A> ӮW>$`խaEg2[ dbCPC3~ڿ܏9[\$ۼ_ jCm5i߅Km[H^-r $d"ER22^W}/ zx5EB)WFXCJg6콟n~ڿ]bޣ7E ꚅׇCVӛ͢Fѯ$+ Gp rj>j=`5E[b%YxdBnŹc]?mOw'+˞8oQzCjˡs D~>cKQͶka},V~@|S4b<]R'{_ {M_^ 61i#*䐦H+rYAR;\/m_x}soQz??et?\o3Kmw0K[[:z/nZ363XoFҼ9bNԞ\P wĖWFa$c=~g_^ /n?_]cG/`뼟O __?jZ-qwa}4Q}HmR@vMNXf.$T\kuYʫГ޿-"?^.طCYe}Y'X1j<Ơ!oAϥ~K>ci]~,tW,zMͻ܍a]Ux+#mgYo5WHg=6\ɷ2%ܥ=|Ⱥ[v~пf_-uPM;wEuLqo+1Tr-lW,mJ:aN߰6~泤h/<( ֙`Ǧs#L7yY js/|E˨k 4_j$F>T ]݈D# z.!0U*5Zi<Ç8ʜZuk>_ m>xCLJY.-,4J[;wzwm/٢HǒQ?Ժ?ߧJo\qo_bەSVkY1f#q $xt/RkA,Z|g8RKrpNJ̳lf>i&:^ZOGif{.OLxwR#I'KF߉>!柯khjy6pY\,ebe ˒~ hjV~jz}֙ڈI4;F \=1w Nf>DPFKWOCDSzVԖ_콨2YEy OE㭷'ŭ{&axIhd[K H!]$цHHO5-oĨ-Ah~SCWsm_'/Gsm_'/GS2ϱh3/恟۟o==۟o==~h™}G)4_ 6/ڗ# 6/ڗ#)4™}@۟o==۟o==~h™}G)4_ 6/ڗ# 6/ڗ#)4™}@۟o==۟o==~h™}G)4_ 6/ڗ#n~͸gKG̿?L>ҁrzC(Rsozsm_'/G;ORIxv™}@۟o==۟o==~h™}G)4۟f?~ KOk=3B%njg{B88QI3.?5$>_ xh~_j2фirMcn٩S3F_)KGN?!$;v8zf'˾U u K PZ%[&:6^W.~?5;@2Oj]ӿ?fs wRz~JRj)sL+b%OO'wcn٩6KFj6R1 |-t%lV<;%C`'bװԺO-|G붺,wsSPK?7gbgNTn7SB-}NF~#Lyu뻌gsNXn_v_s=֞<# /:i춛$|{Rq 1ǥ$\c'tzkGj/3ž>#Rk^ /A:Osu$F#k=&n֥1du ?WxYi!e]`+pyxEb1O6o|+<_隫Fl5Ǔ6DsȐKay^$Mӵ+ _CMKL'exC$He`AA g~ ߌץ1ϱD]UG 5҅U]&xr=Ex9g/=> [7ڵī2Ťn%r2 KcdN|%玭mZmFXa~.-VKj#񚚘FM/zs>&~G oӏAobȅ~}DWwRFR)졃~|;Ca.宿#]OEmfٻcKE2$O$l}_J|c;͗ĚARӄzŕԶ:m~ynqoU*EޙFʒ:Z[֗Vٲe5x~V ͛ e:*\ʤIM,NUx7r9CT"xEVb[29>ӝ̹ɗP’Jw> ZUwVlvG$lU#52VI/G J?4'ʾ!дW'3o?"Uxþ,𝦿oHuچxmbD%[ <=;^aC'a:ߵj.&ءse $U**Qr/OӞ5g|g1௉!N>#{|ҫPzyyiBgo&k{:S+;)DEe:qޞ|szT{ˏ+}F~Df9 2HOj g|hռ5iVWwyc5cTIkdմ}?S(e|nF[=UB5fΉ|ڭj77m]Ǜ.1ֿ`vk_C;߳'¿k])mKP}O jֽ8|8N{eO׭.-CGa="7lt>Ea GsfφW:>*kFh2:Z&6-)\ڴgFk%kV56A4d:R0[|뿰AG ^bJd_>C^f_.mqD#-u,͐ToZ #|[@:`l#6C+@cnT c>.gwv>Jo{{_spD׈r4C(# /P/j깸bV;TUVOagWcG>&,4.O$iL&Bd%pwyo~n<5.5 . nW J(v/#h֟`aӳi;|Ux;2.r r0Yw)Nq_| t~ܞXGU[Nz;~W';Gkgo_լMҐ1CIn*V+h1| O澚AL[>| O澚}?}5?(>S>@?g^?v!'­B1Uj[}Q|H;FF0>t_R~ԒxOZ6#wq(NwC<24"-:[U eQ ycGsS擵RĿB';N5]o]Ƒ>I*4uRǰd&XʶhA}qjNZv3_>5IEgEgCGau~']uoP֊km2ǥ^jlsvLo{P|ro >$W|3kNǃEC5Miui c$V>x'.\zKK)_ɍb@ iR&97OH?==Zm.7V5_ dOh熮-xڟsx?GcR=mj]?O ""(ЯygGQ۫@oJY7##mҜ.~#<; c-+V"I^B3lͼ[]Wdžl};f^aSV|1[.fFfp|΁UPɿi7Z%ރᏆ/(wM]Njt yQMXG[rMo }: Ѵ:I%5.Y]8::ڿ0x 6uY>|+Uk[{Փ{fI5/;E,r!U$S+Ik!NM5͖tžҬ< J/ ish:>V]\fƱ 3y_)FҸ`ItA4G|ok#vGYyy?uw\~y̒?Q'LVYRe$R|aȵtm> αVP# ]D=LUd2p[t|B6'<%8y;֦QL">g R@i|2qڛA.$yxW`k_MHդ69̩ L|d #7"y?av!m,4_sK˒\`x-`D-f3pH(`}G [zͣxIZ-3G,g3ݙi+ kiC_,>𦳥xsֺη5jڅxCn>x_⾋mB}jR-, H!ȗSd@EC=S;%mr-2~~?}yZjk}e'tftm&[coڇȑÌ҃U| O澚}tk鯰AG [>| O澚}tk鯰AG [>| O澚}'+x1|`A@ a?U>BqIaֽ+z&a517[tP̿tho_M}>E| xįA|Q\<9_} 9^jD~ (# }~7k/Jۣv"h,[: rMpڅxg kqU*zo(QS-V#ϛ1!|Iyv˯CzCY̲DH::JA A!s%ޤPj19ᶂwn3GRzR(+(W5ALmup:j[G$ "8czq\cG/zM7\w=9pF  OwemOLUYO[6q`=ZːrK #I5[Qs< f(PQI{7+1(Wxu:!kVk~#Լ;{w+^6W<$->X8wt0ye.ĩlິ+%@$nXA}{Ֆ#548^2ZuuJr[5OJWk}[DT` 8*A#9[8*r?LZ֫}Vj7R4 =g%bIxF2| VKX|)O"ok s 5y[IrB #[̯M˪5o_?}>+ ^ÝbEP(^Iaʺ15j3^# VмM^!nvRK%tn UGښ){]{zO}k%0i>0lu[kU+qܪuk2%adK9GSqD߀|1τozϫ[Pv[m9$H+Cy;?tim/7i:o Y<]\e:+tY Boj<0iy8F+/4G܏rmSi,púI/vfÞL<^Mي.cA?1>'K|!vA߅L/~]Bk9ehi}Cĺn{;vE ϫLEf05ۆ(*d6 JxlM;ʗUo5 v!ߴԭ⍚~{"ס? )r% FY=#I>W|Kk8cɫyls=VV.3wUBܬ r9vOgS%5 y'&|:5@{}=bfgvq~94O<}If3ݱ7mvz (ez%d^QO3?>ogkmFu=@ӎA_OYH8\f> <|ο*.QR^w?O3[]kO3Gͮ5"=R3[]kO3Gͮ5"|omw?fC6֟f?"!54y Z(fk3k ijo(3[]kO3Fo3k ijo(̾& w5YZǴ5 =?گ3?d޾$>>U)}_%~PEPAh4ȳwU ?Ĝuз[f#n[w5?xC|]\&yRFϔy>|6 CbxwדA} y1ȓyG܋杪Wǟ|.> 𵟆?% ЧAˏTɏ,nic~ſxxKwv\^Km,$$Ij;s25iN*I.egI_ѭ3Qk,>ԮwÓxrP6w1̶"[_>?vlL/#4}S-vھzJ+e,8(Dȝ%PbWizw3hc5vuox4?OoT1ȶp<RFt&$^vOZ ^[doc5tX࿛NYQ Y"cB(~x|}2@O6W <1M"/ kd׏W{'RI͘3BU }?bXG׊:P >XaY Ky*D$O0ѕO&D@hx;zt} {-bY.f֯&?9Q+GK5Rƪ0tO 2:xCHCjZ/P]lؤ/ RLJl?WG[C_;W^fWM }[;w+#D@Kpa\-Oo i,F{=]ugӣkTQCi@hzrw__x޳k=3^uMM}Uu?ڮ Q&b@P*X%)]on0m;|rW=šޫ OW]>%^O Cuq8]nN#H՜؉LW@3^ƙ&<5s\)NyvOrco[2+gsʹ=soG<w}SZºE]k&wyDGrcn&_4ټWu-j6:lܹ[aS|۾hl.g{⯂}g6TC_f%׊-% W x=#񖡥jֶ1Gu4 3FH]z>OjZu΁5նkߙ;%yR LvW^$ʰ|[_RDf$-ºNd;䗊 7ZF#^7u&𞝪֛ OiR\΍y. }45ATJ~Uۦ/ߍ>|?sy7<;%߆;qh:{ݺ989,9C\ڍ.]30ھ1lbf^x^\+&q,lI+'_Jh?K_xC/~[\$ֳ=Α[k?ugau̸N_x? Gg/]Q4|J~C.*%XUFFk7IIow^^2t}BV:A&{&estVRϾHVc$?;geO#fDK [_|o7^ >FQ_Sokz6i4"/'%,W㏈߿ɭl>â)QEQEQEQEQEQEOWהi?tW_GA^@Q@ q_EA^?f)7kݗK%_y~_Hkb4'J>:Ek[٧?WuZ|n%O$WI?[}axI^&P 5~s8OB^3 F?%x}Pֿ fu/6HX C2@y 7Kyp611\2{@ ]wq+a'Njr~M|/c(ӺGW=*CMcBw4mpeܭ-cYUv J7"ir{+s$.孮I99,Xf6C&XϢgI>xg$)mI(u d-io}k&<Ȧ@ אMVMZj},t[V~Ne#֪YYZM͆kMMxF2 H AL:ޅKOMɼ2B;fؐ<(1Fm;S6Den|P8?yrqIRG h%q̡){,Ly$=S}}4}dxO5mKuź́G'p$*K&%Pt~V#wom)춮\2ޞ$ vV CSn%Mm7GOhn-`áeF1H7(ѶUc=*-{S_UuoӐ +WauqqޟƑxve_X$LLA#EcC 0GS<Hz^Hwאָ5-*% u`pT#ApEE_4N k=殼+_mlJh6k>ύȭ5Y[8-;Rմ;-OJԴ˸{KiVHn"p$GRC+`pA⮑9漶ûnT.1NW~)uX2]= CKw#7B%- -&d[]*hC#iae{Ӛ;~vp}nZ_gv_Zk~tKGݺ}:a̲,h,J?᳻ß?X煢[mMkXma`F6gs Oie}Y*y:Cc]Pg;c1ZެSJEtBU?>sڮ+ ++_m]|kJ*q?=ε޷Γfbx jr X0!^M֩ψ,LIM{xd|%k p$'HLO_$x/M/~)_3jJN"8]FY@9}㧏J!RVri/SΧ)Qűiïڅڝe:,S]]XbK3BYBs^?| oxI AdG`c#Aד~&x:.jZQY< xY($F 3$ƞ/|?wn? q]9 yKkx`Ҳmɻ:o~fI'ZWd{?J37o,1ÚLHēy0d}HaNGWGƿ|Xc[FzOs`r:ҙoH%yivX$LQt_$-GѦa dO$pnNyc&~?4&KgvWw}`%z`^Fmp8[<=5Fj6j.v%aXV;F?ca?_S<w7'4;]RmllyV2"Xg>|Dh T?? I&LHyw(r̦XvbY/⇇lE xĞ$Ixn=5}vյf[İIjbb$q \Rq_ i?A|=׉t ~ Kj:o&.8v $PIi5]_T/HlfmxeDfTg#A4%H3lo[>(>%~,3hV!k:(<7-ֶ#S$}Z[f7O>6?i{ψ>`HG? H'Lo߳,vgBøm4{x*54͸[l_i.Ox95 >ӣ|c /D|GvXjZ֋m~'a[inO7nn/{ }[*~|CB.4[CđK%6,wÒD E]_7boV[\Ѿ(0ף1_kIhC zq2rs}ꥯV?>w6ag-%Ѡ&4j /p+EhS់tSoOV\VwӬ5IMke˧In$So4&Ꮖ,u=oRhGgjk]l;"3pX(UBJ/wq3O'&V־+|3թG{[8OJKG7^!xE7aUgu!WblpAx5׀ff?~TҾ!x]fYQ5;g36di `n()q&|omW><];ZxsVWmsqq= :M r1]"jJұWzß?64c7Lu._jzáY^[QV0N`y $8Er>x>k>*EޫiW*Omjc'TYb+ |GVg}{6u(%ksCҥл y;"Hr\ޡYh2x+#G۹o-mK`q'r7V,K0Q"o=ܚ>/>񾊓4 j۬2D̻pNFk{o}zI牴8a֣χ.oW aOp#Id`.pN<)iko74g:&iKViTT,\-E9 [H6g7|E+5Y1lD}LVD,ܣ%4ck??}N[y4>LJ&mgd-.9 l1*m7wMg>#~KmVZ\dUr +W_/Ej <[j ]Ϫ~Ϛᴾ𭖝y5ѓO,$RI4c>h+h^g4ZW' jnw[sE?0I eAgg=Cܾ&Z 4Gㆧ∬_RӄmςE{ˤL˙ ?|xß4φxR[gPаv4U lڄ*ݤqZz/sZ+GzU7F{h%̷Ck\ǥM]K$#ɷ< 8dg>i?4?j OZhWG֮xf!%.0Wa;|}7ĚN]oTaasH0%{{? LF|1B4l<`fd ÕkpäGRxKӿ< [CxK"b֒[%UʼnS"4b_M_~jxZY5-?Kѭ-{۹+x"U;;rI cr|#쇋k[ 6brm'cO]$&cկ|CԷugwwy=A -B|ȻTy'>|I߉zŸx??kڗHOSXmJIB1)1eܕJJ?7b}YmT|-mKIg]kmj`T5,s4фJ;moXxA_ _C zƶ 6)RX>Ank/D*?컫ui>ëXεy!Ly${m ^Oo>"|ท>!5RR]oC66ڽɈ BAή*ʊF>j墺-|wOW-?WLj4iR[nB;$ޱ̅^6 D` ֏Uklk:_ I_5PGAÉǁE~[YC0O狋0[8m.x>c:W@+6߻jcE ( ( ( ( ( (bt7:9uwc88I1*sG4 -/,f Ol8geXr j9kqM24SCgdC.qAm|D}J\3V;]zj$qVFk+ .B8xVH1t!y5 xq^s)y7lq|JsQXnepX&AV `AA48>hشՎc%'s_xty%ϊ4hDΫq#PjI#u7ZiۤQJ7%O(#*@#FWoSZ\i: H-_i۞(u;w1\R_elVZ2wtmz{ןx&{-VT65 ZkcJĖxF~frFvyEEQkg[Or PA1i~*~ֺ~i5ڡw߶X ~e @ y+S:|,~%Ngzwt!V$@|xsRyz<>N I6>`_Χ׀c_"H|$~f8ݳ;rIX2 4 ƣiK:Vֺk~7u8)i1^l~xBؖ_!B[(^ҵl-q2ႪeRa|GԾkŸ6 PO3d.-LI `oaiKXV?baJ7 O⦅st WAK+MGL໴exJnee$#RA\qoX->?%4ݛc;H1't却_hҦjqm?7֦Zνo-v}4_)cP 2akXGI>[ۭ_;ix*Jn蟺Wk!]+ⷅu WqOi{i `eaBv+æο]cGGi3*u󺮩>E)l|ZɏE׷WIgo)C~T|΍~4}Š)`tSi{4QSܶE(>QS);7QE>_Ɗ+FOT'~QM#} 'Ҝp}(5tEoe#O@OZGx_UtR:bE ( ( ( ( ( (<&QE\eυ_A-`[_kQEO@]Ko5!_ N.&s8t?;Ikx>#cƊ+ //ه~=袹d}z =~93-+8w?i_ K^*s|=/(~Q\c!K`_>{?v߳w~_W=Q^7⧫ϰ endstream endobj 1292 0 obj << /Length 1409 /Filter /FlateDecode >> stream xڝWr6}WhȊ(L?Fb2 磐>LG,,>pCcPz\Ye~›lfz.!~ˏz/Ϭ].EcźMrUF fVF\|U}l ejZ r. ,jw…]vJsE誵l?hfwqu|P* mBoR߳dvAOaTG(=A1$0=r;x}?gyU-lB+n:Av$Β"9ɺ!§U>K']`JIFIUj\W .{YpQc)ܹ/""zc[f}h{^0EnUv4(KDc}4 2BӴHØ$If> J7GA6~]H DNBLjX@}:W[mݗBcG3j'J=F ~1elU nhnΛ6!]ᇛVvzzv(/TycBW(YtNlnt. v (~-6 "?鎿YH7GpƲJ{-ѩp6=Y" endstream endobj 1184 0 obj << /Type /ObjStm /N 100 /First 976 /Length 2348 /Filter /FlateDecode >> stream xڵZnG}W[$6bDS45IB&qFHⰦԭ[D> %|d< -O1aEĉdh)"KӶ "lcUz ѠUw!? y{o ߵ0_0;BܧրMF%[H^x:+uXPy0۳CkgZx5t8f3'<^f I{:t.@٣ym0#Xb\w"x{P{Im ѲsH1K+u Gqbk 5 K bJ&r:w6~W(95+LD77RNƎ+h'ʵ%8~= ~v~A+!o[^)/՘ZDG~-T,/*=Oq鯕$6\2{%"q;qtzyx}<N:I]U8xrkvAUvWWu׫V6AV){tz\x>5~ӤXyƲxm+mYWxպ4̃A䳌a"8cd0Y3 wx\O|@-iڥ羓'}$>.&>iqC A2i8 e*d7b%zI/55Z#U` {YM8kw0^Ya\71 OL@QP[ѷG8wH)|< 0Hy2ȧMrX {*𱿝C 18thy?hf mPhe1IOM>j8Dj@!Lef{xۃ&h?!i|zکm$WuX+`Bm i%梖FL14`̍nDU7X5ǘ T#$3~&f\ ah3l:8l<,: ɟ|f^pPZ>np?2x*fSn%S CoQ zFkL=}7kYo= !5\XqIú4btYVG)3d0GXn5xXi'>d=ˈ"K{8mv]S! 6R9%ix6NRz*4(w``PUf4AX\׳ #z|d/J}jⴒzWsBP mVwkǕPr =%{'~Z?h{y۠|CӠ/nbܟ z[Uݦ`2Lݳ$ͺ]Na<Т*z]L kY1aWK_!' a2-=XH{soŦKT '猄ksqB\/pnQ()zF |KGōvj?OCq^%&/Jo endstream endobj 1299 0 obj << /Length 1865 /Filter /FlateDecode >> stream xڭXKs6WԡKɩͣM'{uzpr%HĘ )Ya2MX,OEՏE",T.VE.yY2>7s6Y0H!tzz,2d̃ۗX}"QRa+nj@n"( 6ڭk084\o;&`ن-S&EE/>v6=Kɨz ]V"kxյC j ~zÔFW}_vT7p ܑW^'\n2zݔ6s]ܘ9(st&,X_"x y%~-Id d 'H\w,@B@Q')Ue_/ҍQ܃rf=/N(lӢz ¨jtɑ 4rZ;ʪ^fPsd.gy"dRpˎ !x3L2Z(ʠ4褡aB76 'YO@]#Ruv>d^1ّeg,0n}WyPb@ 491EXNvsBD m)HϔešpqaQ5G" oD)9Mo5'n3ӅuY}†IFVIqY؀鍮Q̤Y!gSM8ކ]oq]H,ūl$S7#%>< 8eo1L)S__f.޹x>hZ(|VG~-P;eҴ%$LNwa+,)9W]Ż)3f, RG]`eqY:rR;j ݐÎ\wT掮F9"ӋGۿ3c.aL7'h:y CoCe?2CT[Ì{8̣ɑkV)_{áKI{,lUc%qrٺTP@5̰ CerUQc2xXА㭲LQ? Y3s TW7rBD as=At8γR[[~"Y+P^AH&ܑ0Q);3vDgLO}rEWЄiʋټ8.OR ӠBA PcUii zrfrSgf4 ,/W*-/eı8K?D(b{0q.@xFh>F9eAY\ pk J> stream xYIoFWV dz/M=M[lQ6[ITD*QM-N޼}'7 NތprtvA0M(GJ+\Ei0"$Cv8ctW8q4M^S':Z:`BZpLpD.ǚ%2$-MU'u}djLy|qlb5Sy58A%CqPǩq|YLeEb!6-0fa>:-*1̀eC]cͤ.y8BXaJpy㬴8Kڲ n}f D,j>¼1HݿgD!Ǝ!m{K>b—Ӂ QJĔHJvm)mӐO'u5{e8B `EF%"\417PXIGBi3 ]e-cHh'dF'}{ tn-j!k!4Z KѶ V}RD{dž2 bJ@*ę?|(( _-ʈ7";XIkqh`:ǔb0t'0R8Cx/:Zdq8}W t~ɧr^8[ L"aD d`WHy$02  #́;Ylf0ޑEȃ- ؇)EO9SPHRW$C VA :*ȶ j&6QbN#`CĕNªfʙ'Go= ^&"7 lτI#F$#<4`ij(ЫSFk 3$ՓxMb0ļУ{^C̡CۃwW@=+rNз Z7‹-[\6u˷p.9XbznͣYY}SP O43~HZ bcG\`Vf/yE'ao]~zn{[l(TFDQ_5TP>Z9_Y@v5k|$V]zHrҧuY3fl1@uDe6Kri~UܫSchp,:0 ;S'{p/]>;Y܁(nti‚z1,NdVj44ImLZ,c3CJ\8(i%L˅2|omo&UYX)Ñ^ΜpAVx+֬OU1 ,A;ͺes>&鴡s+a5;5m!Icwpb?/@ @9ݹ{0d\ D_7Jӗఒm62pbMm![&6 w*#7s,d$uH`mz5XvO8Iy>edo6ޜN{R`mOhK~iN%H8Ы e~NO=sł$?U߶aj` - )Y9 _ a ;tygVҮAԉQiWb>xel]R? "%:3Cn=; EpVnۜ챝  u I<,3yM),[~2q<; KH}aX;1:f^Ϙؔ6?㬏Lo;+%~~`OmI!'t␢!n=ש?$k Հm`|,Niġ+h flp?uh endstream endobj 1307 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1321 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥khO endstream endobj 1306 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/firstTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1322 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1323 0 R >>>> /Length 5432 /Filter /FlateDecode >> stream x]M UظS+8/K x/X`s0_d, $'woWn_4O{Zt{_ io~;N@-P\N"l<.>z}g~-5̼}@m,UYdOK RH_8z\RPabA{2i61RvPqޭo@fY\uҚHި )|a!{(~Q=V~O,oC++Ijr.۩м|'R^rK6FOT6zSQ?߈PF.E}3Q.鬸e"{2/ w=\?)ԯ௷V[\c+t~o7'[סdVFz:zO7Rj@Hǧi&.LŭN=vZ ]_M?ɘy㔀ފQt~ᓍׂ|tAm6\1/o[)VǴMJ<$o4/9gřgxMRrwvP޶sLEW2hΊ.ݎo@KրkjEu#FPUB|$Xro^̧>azY_fs2sI\ =NR#C]|=,h ^3|j:WSh"BW>XIhbUX +*ZWjwjw*4 <,PZfk:*t~i1nl ܒ2{ bYTҦJݡ+~y4-gɫu:AmgۡZ 4eB:N,x8d|S&[1R j74c%7MGV-Kk/b;ܣ'"; 6^phȇ^khȇMջw},Iel74bIwOYS EkԳgm%{}!r|i(yT؏ϷO=| r-:?,Yɨ NIj-7:JPۃxuAzzaxB;=t[jq:騭1NPx'͇Ͷيt4J-,X7ИR~3ٷ_h"D'\CQzKH%ERth<󾅇Xb:?wWx';v7͇!>P C̖H`*t*}0F{k> 5n5Z?SIz;_%]IjzOQaj>}t5kSXeV^[pC2}Hd]B8-ckSV82.el=O>;o{],y_YC()׈l(F"9 +7UU,쭽 M#!{YKu4DpyxSO(EऒZ+SG{A-2t6TBhߣH|>+ŞSCCKԤz cGJ+N@6 Ώtl4Dajѳ@ޅf[urfAkZ{m[kQBjZꁞ4q#]i)ݜ2?o_kݴ_~}f6Iv&߿r ki)x Ͼvrw۲{_GՑ~d*t+H2.+{2?|Z)8 >tpfBW4]P5Ԭc#ƆZߕџ=G'"yp<_I=z`?^tRxa}S⓪xNTJS0 V}oCq#̢n S uCG!GBH /ѵZs/ 9ץUZ܍Rw}S$\XmTsx]?]څ /ι֠:7&uD40m0[ǩWSxQrppGVspTo4C}#),Yѕ&y&BCM sS\mJGRf0sz}:Jajl3,7ӛ>Fs/N)}n  Nʛ05WW2.J95 oŐ >L NϿvmQϨB'E]2l<ּ-t5T}DIs/j \g 29n, zG,/Y<a8sꙒQEnM˺!K k8UP澶y Į|IGVr#YcbPuDŽ'UD tʃ5Hȴ$ <4Y ȫ$FɯFh.L ﮫ4*ƿ!7M~S ]jym-R'C567h=ӷ.w&kM[ (wtନE#gGuSΗKr8+bk=Lm 9A-crIcΊJ>F˙T(OtHndG׿45ݸ3q 0xi n{tds_k%9W^&k2uS ۠#EOS/=3zui^Fi7h;;~OCkU!];x, R?mU~p#PoY%`9rik ";\Izm.632=oSCgE/Ha?#`ư##-K?}3 5{Ech0J*67VK Z0cݠf:s`NK,9~@w @LQJ QQ;򮈲r4]1:< Ѯ22"2'WElzz뭊7y9pVB"^Jܘ;0WPjTj?ã (4QQukжN'?>c?Vp\GUhB;{!:#_0i>7ft%߱KN~EKLnD`e lgEmVjHZ:oYEQbSs99/Zѡ+#@:KA5z+\쏠tjPl0񚹒0i8W}^ea9w9sUt9G"_̳Xij;j@'@T"Y'ȫh^]nBKַv{d\SS-y:j}2` XJlWmT1~60Z*b]@/82#j~N;hSh?NU'S_-I),︂G$~pPE>4F֘IQ!ΰl0TW(ZTVѫcPEg2!̒Ξ9Vd {1bvzU,O1;Q1ЉQ"fؓA VIAG HNJZX R:e =ol抛{ _brb'[-W}V@@ -kTdxVWK'4|5%_V|v,!-Mu*@R83%M=\Z;~kh_GI 0D@M;$~۫5۫s*OTpTkڹJJ_Z~n f￾Z5{d3ܿ~c΃~W?k7?ӿ{?{g3ǟ>}bsJ%YIg;a+oܡwY2b]x $zM'?D^9uΆ'xH4ˎ"2iXpWMԘ0uuivm endstream endobj 1309 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1324 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥khO endstream endobj 1308 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/firstU.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1325 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1326 0 R >>>> /Length 31967 /Filter /FlateDecode >> stream x90.*jmR5{Kp|x.~IVtA8?<?ڟ?/,{?ԟv<ϳ7B>|ȳm$w1xL&rpIX)NG-]*6m?G=R_|Gź8>>TvTݧMϙ}^-Sݬ1T2ƿN ͸Ku6n1S#GR|.D 0ʿ~&1VD;]^ }'wmVVCd5!p =pv p^ 6EwBsz ҹ9&܇-B~2gݶ^Gnè|p|d VrTASwl9M}|Qҕ__%}LS]A;e2_У`^nOSZ{8V:»` 9 ?_j\f@@vz3vf?6[&<6Sh-[%n^CJ߿6R-%lWkrډtwL{zwx O,W|l}X}ar80C:נ=s;DK5(+ƟdTxr):~x>Sd!8gO ̀GX󽻷jVA`.Km=0|_ feH&:/c%W/^6ëo*ڹ9㻰eX9̐wJ'7ވ֭۳>O݇)޸A`70.x z D .C6%l߮.h_Α ́tqFFEۧГx4*RrR pM=LC+Ä# AN{6M'd;$ohohj ?[]IS[Y妌dF \l.x;A}u~Fv٘uxo6g_G|Ygڎ21豘U|Mf }0 ;f&[^]Fo.*tg DYJPs5Y93By=o^9r b;Y0?g tnlw[dDT.4 )X?%1Ý 71;٢ WpMA^–w3QD)y*1x P6{r-!ZyqLD'7L>Ʈ4S=^@aV8-Čr Rj&)ieBX?a5eFYNadmSYZ@ۈ 紮Мs%hAxٔ߫~ĸ7ƫ3~d lC}M5Pܭsc%'pOxL7}ٸx˼i#qp$/q7z"` Yl +9D2!݈UuO]洸Rӝ翣{o"=z _nj/CNJv|F2&r֥|jSv&jcS^\ރ)V*rI.S6gEV)?$@W>k]TO1 V4;FmIo,miMa14kA%=̓ AULq@1,}9wpX%mv)b݇w W]KOd %m!,_J5e+PD%+z _|]5{؍3SW8TN<ͦ#/O4΍)+cnX;BJpm,ҎW3D +9No+Pe4'.[j)bfluu 6#p؜->7^1 ם~ߣ`kf6t"L?zß! 9𱾥HGA2:&C;)iT hÒNp±U=c~s;"\˔c._/4Z{JM]fdQ.[}O)+Amx|"aUGs <83T?"x[Q'Fcr,\c/㝳ݧÝl-&|$];,8wϩNpc@}L ?kri)BN\~z\A$xp[-\ڷ͑C"ԁsu3,UEvi^CٰDKvwk5Rr Om(hwd ?km?bwHI |3-Y!YlܬEX)b1 N7; sf -ZJv?H5Vlzs[7ޤ+ BYz@=< U}|48 PxSFcmzu%(S$ NjY5I&}#_7<~{3$< R3H<4ؿ/<? Nw~s.j^܎آ|tC NTJ(~xcRv&sq/l<=ew[XwpN_rg~eDA @;f眆>!:.8hN=#a'DM=oɛG`l?8/Ir xqv+X(@TR dSc8#I\p:#ڝ<gOPZ%6<$/(OGynN9г2@ 7s͛(o '-]uo7N7vs׬W^g!68gPj: PƇ/vqOq_19s YR8 P4@*P%m:CV?~sΜd ^O\!8, s~o|Xlm9)l9 _jo$8 zQУMknd<-_v'{KsDL zxDв;EyqTrmIFo϶nO_TٜWN* \UŽބ]Pv6k:Y %"+4X(@-b8oTN [^!`ms. a>P9T}@M6<29=w=v 8[`='OQH(@qb?otn~+|5Uߍ}sqJOeVos/wm$58_+ ch:8dO*?)A%Rn*y^)Cw=nR#=I}$:N3qs^F@F$!| |?:;0VgpɅj"Zp$ǜ"4gEl!;ؙK?ËsUذBQDCM*'s5sbm #Jq(v qx=Yo55` Pj+mf[;u4gacn\hF6K*d(@+Q n(f.a*,0yX%W%7Fm:xͲ^pn4trV[lK@\c˸csRvR!E^L@:2곴-s \pݠ%9 Pcųf()B6thJ'3T^ d1)ma-n qvnxp|5[fmHE{dr6:W#̎,G*Cv7PIaA-4_gS?0uOXX3 $s9UEN ܆,Fz|p ,O!k t rj~6;ziSbKmܦsO #s=Yi~*Y@(@g؆؝ 02maAw#7 Rtr*h#; +̩R+3Jsɀ-"5A5(@I(Z_1KH`ir1'nk+ϗmPoqsdžfsg`CfQx?Kպ39#~`cN2׆da`3ˉ31YVtsƎE !Vv*b(@d[،A_ >יzlU J ~J`fUi Fx3?Bo̝f1liAIAM<+ iL(M \c*ZK9ݹdh_HAuƠ&~r\Q-yF`CM\"暩H!Ȃ u> e6g*d̐wϛ9ˆoVvB&.?L"(o?0PX;Csp~{Thy@1_+W> 4V(@ްd)@[ǘ4 Ϡx2SPBYGj35K'ZV 7lF[98!.fx$ZJX՚|77OPXFLkB 'c?6k9V~.rjv)x`7Ɯ -<+9 Y͏|7*p_еI3\]0TG31#YLvi:&)HD3Etz~S-3d"/:+`15=g#^:.t獎bG=k |0;VX)W JUL➤Q5)t G㦒q\%)㏷vqm]#+67\ YC qw$_CLFCE ug_pйP xJqc/+_FTJ$ ͨBxy<-/S5*wyqe൝0X]|2wfr]~ g 9|Fwd[!xа7X|xή%>t}ag-zx_681Lݛ"Dxqp Cn6]s,d!l$zRr]|fl|%h4I.sYU> v%B6iښ]E } #Q?ʬrRegO}F >GJ% 7u6:( s: Px-2#EwLɱ-=zC[qd$@*_`q)Czo0(ǮR+iV3dp,,r|?ySAݍJ@;t`{?/:&Y_q )Ssځ Zl SͶ|Fb*e^5 h P1g"VT7'+qǃ%lyyΛ= "(w"Pvm ͅ'!≘eݬ'鸾[Z8W(HWl m9ʤnZus =RwliVz] #MYLucbfuÐ{<딳:,6'VF\tU<ΝuS1leL(̃ǓT|m:k.䲍{Y[c ɡydӘ˜%9 LGS?\~IB|y>?f~mѻ$E29S_^|dzUqx]ǻqұ}8.=94 w &NA#;iԲ@wcC8şD5&#f)|gJ@S奀?-)m6O}G v{,"t"UZY= p 0@gk!2L0${δq>j8=n /ՑJD&gtU|Ȟ}fU3\.'6<@c/*5:̄MuECeU1vyS6Bݮ@{Ω+ѦB(?a)9)WFA 2zu7!^U.7~"+2Λ)@Z-g;1wx9<=cWm2vuGN_yOw<-COQ>|Q :cCwKni)@UnGq"wnzNiIQ GvL+i\S[ޞsL*]iŹ2 Q8?3PKR'M !E(ZR4$[hbiU$YGCύfyi$Y@,䚗|l6QC%g`D]q4sAiPvkV DM1qQJ6)&>G$bS/-8 gHE= 06K!O-U˸p#*5\; PXsK-4)@,R74(d.Yz^ aim C.*/G,*3kjv'u~`djY&v`7ij]/r*96Y~"{^S2(~J U ; P?pJP($bKB|-/):r=+ T:<$u#hF}˦3784mn9P[qQ}Nk@jZy7gZY1V +*a&˼˘"Br6*UڂLPʩŨ*hSrֱ33k#J-.^l罐A[ϲ6 rrPS?į#3jTh jʌ8_y';<=6{ychooU0? w]OcPWg0mJˁ Z)rzwO66_T()QƤ_֔8\=-fOT|j5~a5Y.d)GhGFf,a=w# U #n1T^ dWyɹLI0 K7W%TBqsx]UFe-UmfOWːu,4},p3():L2}Aw۔Gt/WWѱ16\^ ;,Bbxlm3yh55x%&ͷ-Hf4^S\5^O~t4/neuhb|0“6Ӄ{L동0^W<3_lESFݥe ^  \Wזtz~6bf+b̝!OBLFUՔč.DncdO{i DR&a]Kr`!\t.U[؄ٌ" Go.5DuQ*lΕJEt i}Z"׾ -s'wN3@$sݜAf"tj)U?QR%(AG B*Wbep0G[oFjIwDFHu=8le#(*$$1h'sFWAI5!Wfp- g<xUJzs# +i=[Y@SDu vX4)?쀊;Y4¹oTn1шM xEl F-537q^ *ߓ 7ۈ\k;Bbp?$Vn(@\e.vtELإ00\FJGS񆋏= P wu(k86L\#6yV7=:F7s^vRKnImޥ̦+ NDLQ݉4Ʈ=ƴk^TGG$ pCக@,+.w{ZZIK(;JL+Vop2Oz3:)(`X<Ҵb@v+B-g{'x!ܩ#diqL*V͂v P;B`L8p6B5;` Rh:}#׆sZl'q7nZV<$jUwrݞ:+ P)5>5|9m Pf]_6ʨ鐝t{w~މd)AO~.q|H .M{~e5V,Aw20'݋Vfc :~{{ӥzwSؙ W3[Cw0"^629p;RZR*Bk, v_)qN)Al]xP@c38q8_bA}'{d lSѤe%&:?㉂9VӶ!f& (Zvkaw3}jc(SF Z&18 P<Ü/.&kMvEY(l,e^n X:PLH)J[q)YZXr25H[|y羝vO 'd#3y iPP漢[hGIS7h087`Xm(@M}>d)3\ \r9w6IA9: G]wNDxav(@*Z Te\.9Û:48a=2؊iAGƣ:eh9j P'^~^ܽPoJYu3cnb$u!1QziBS[/7 &T䏣/C_Q1j3Jju‹3ςh`46zߡ 5%F% P*yGTө'W:ÜmJNFP qns2.FHq gvi}&܆^  y-w(@}#M-2ҽ%t(^= OTNwawa;bQGvxC},npq 35wnh\ o\=}CrJeϹ4"{JP'K3!'[xրj*/LIcHu?%ջ*O4NmT#Ai#}cWtNv ?<#hSmxI/anrts"}-=A L uR_$@v#~NWS.ԮpowǪa2)*0L޿.Il9hm"г~GэHD+dR$d,=LKmz{y$}l㍻;5N!cD y壿-sa. ޝtķamM{9x |xILl(&RLy%AƵJk7Y{f\wg֞ 1r (Wo{溿fy^\ F3~{qž7_y-K1HV' &~닢2l~D+dRN^v򻥗D+dXS\Q 8U̇诮x@u S5nESLaUSr?صxd6k~XJJ8Y⅙'#olʾ'U9q4h*Td/K~G>g!c+cRfwOwrhT!Zيi[g 𜐺+=XAJg|UGd9_Q2SeRPk4)@eݒH}^.S~U~2` 7JrnL8T9ބl2P!-ZXsC-,5iz.mknzo;o CV9O ;[]CaaA%WQn2eϲUv&(@ԔYD>\B|'S3 =v~S$M](9PͅnjSʅ L7_5RyM;nn{|]7uT)ƕ/c /?ȁ˟O3Lv&9@l^.Եz%N-Owf967w.-{k>-f|X\3Dciu2rK7yb9]\5Iesi_5)gFiQvbͼ(@ L'ZDb)@dӦߧDNw_`(3'#hS{9O{sUq#ԿUMPlKÐvQR5.Ucq4jw{&d?E? 8|+Ԓǯ;)Nc3ޑ5tĀGe -[ eϚՆL=J2*_ҽ1x'-P ey&8h*gv =^ pcgaﶳ +tLThz9Ȯܰ(9~P՟0`סo~8AR\7G,Ba=wy.d3~;lG~iJ)i>Zһ,4%y}܁87lLS~D2M3XJHݍ^Twږd}%~t(0F\}c ύ۝ @Q\z&Gƕxc|Ef(p&.U~LuWg! '+$"ŬktEqx"]wa;_gmEHʿ0M< C9dPЌKmCAw>2Su &L AR(vnw8 Cݺ?uCEΏXB0$vzS㌧3yKެl u)pNV (3|zj8 ~yF䜸ZJ,BPLN{$j&M)A?e=MxKlءI'~I|[TxW( ?,-i{ǝ&(AnG ˡ Cz$b@<ඔ1c($;j[jŨasnz7lȇRXZxʶ|/Dsn^bUf>ec}.H 3YrjCY>3g~&ԙ7ZQ۹B)RJT (_'|t˪Qe`6asC e@!9夠Tf.s(d<7NPhQ5=սt#ZrO]XeT;3w5>/ ߧ-kW~6.l>;_-GN4Բ f;>u_fȷ(!"w3 ֐u/cޞ ~ ġ~o`zU߅5)RGADYAmj1 *Rv(@, yBn/0vL7w7K#..w&a뗱LhQP>#@Jlc o`YQH@*<`snu*jn>rҁPMdj&өЂFB g]Y}RE9 \zf"2]N*e_됧#W ؗQ7x|$MzhVӤ `[:x`PL=G~p|;v gyH'}>SjcXƃ\)7g{hAwiEq΍W =tGTxkQZjS%>nd Ok]Vd@dmA]5|v%IˊRv P$*?F:?M(ĭ ӥ-o!LP`[$ƥ !_V(Q4$;DBߠo4oؖ|P{ytJCCg 욬HvMIMa0;uԶFn> EݍZ0y͛ϧMM'oT  w\RI--0pwu)=/:E7-}B \, gbFGrl)A ,8y%(f|6; b%8!y8Q;-)ԩm/@L|rkqMRX̉T&Į^bf ]pù1b 7.g|9Usm\k6MdM( dgP1nbD~Q ǜ;d5uª䘷ntlL :z:}F1V9'#R_j >R5k!&@Rkf`{_Vr4 A$e)#fEʕPח"@ukDEbw BFų)i7W>͇\,b]Z S1 ,w1W:P;sm{93 'Rf6V IdI6|4N ziO& JsT+Z,M{f#Vb x' USGr#A#9/h%Y_8kw~*_8˴FmsͱV8paBQ:9ɾ(b2m&҂av$Ӑ1?U;KΓ:Ap/ ;2ƭe*l?{h#\ׯh;څLB'8d1ɎH9\A _gekS5DhW)(~*)"06 T鸻 `9Vn@d7_rSA g| 1mq9E:P M4c99H|v0^Rܟ>qsrI|5R:\HRRA2xɓݷkշ Ur_R\)6dG*./U^p_P[R6@fCk\m)bl$Zp?rbAݠT(SP;zm<'=׬jaW(,1"A7ճv6aCKl0PJT(p+ &fJ~Vk33.三c/l];rRBj ȆBl4N=?}]jv-(DkcU f^Hrjn)8>_.~/W/cZ m)2߼%!t7;dݖ14XDR,"-gk~.7lLܮۨ APX\Figc:|z1/u3),M if dtCHegѾItE`3ݾ8% |\L`)U" ݷo`.{| N2hP^ Ϯ5^1 )d3flmżGw;K\a$N$h8:$Lrh_N,9@yx^feQ,ɫ{TXx6")HA/a>?8_u)"$抙/{\bDD|:# @&,[ֺ CScN7 >)mwBYZ{Rb?P vqdjvXwB_R>s>5в=Ok]P j?emdɀ}m̝ cK@{?# HQvi7;T{R8TǜΧӌd.:V:VfDW1 rQ(svkYV"t`1xr"wdvCm,>TؤF:aN¿Z-C%ғh>68̸tʤSSRۣW ðcc/$߻>NzK^f]*Ar I¤t U? zy25 =S~k'< LK3r3UZf5K[K B"edB!Md]"+LYIWV#㚊r4W6d]h Y |!/Mot(^h0( Ӄ|98gh閂[GEj7T"/ OM p ]n˼Kw V2͞ ǾB3AN1_@WrrkQoǟlۭšwnJN8#ܚh s^ 3m&ä7;r|stFl,_S $QԸ3Yw-m6aW[|uUXE>nI^?n|}X'؉J {&aOF] r͍K6~x{-[J)H|ja4v3 r4&9 .掟Tv(yBcpβ/hN8e'v# O&^$l h B T2p{!_K;3ל!${98*oxQ; a/fAv 0cΡRӤRdP|wOLx*Aí9,>\rųC< d#2EB;^w~KUmLeeau7hۈυԵZvD1r :) ʰ+\gYrQ4kIRLq(Q PC]al:w;GV/Nw+Ppix.d<%k<[>[nqn.2]sו`Uh.3,rMOf+*W.@!&D Tʠ1EX(cX)lW_[Ea=5] dy™%-W/VcZ8؎fb_m2ƺR^%X& o.a_\>0*M຅$|`wJ5ӎvW蜡(%g1:f6PCݎ^ځR2qB*A7Fv9{gl{jD/ U&x~Ҵx)E%esʾ憉:sʜT fȫcz/ˤ#C_mfm{r{NCI#\F Q~͊:@+TxDQ˽0-p}֍k >zF}2]tM.y.nSqUre N<nf->Ia=*9R\Y_NE ~. yT~9:O@&n,ݟfD{},^LVѶ5꺓ݱ* uuLl^I>vj3C`bߘϵ{ 2O(ȷhFAnDb E{ҧ_xُaҳס4GR2#)+DlВ)4eW:%YxU/P;^(9?Z<eлM+3^]L"%Rs"ZXQd%@+knNa9H|PҲO; +s7?c=gkMl :<3FΖ\<Au>_xN>anTf6!?4^<6 \[sa+ڬ`6Go-7V%;_(ҹ~T: dO`:_N gf>7G5tf^F&iy7}w[wz㩦gۦ+ W],Iqxz~ij\,ݳ\ קj_~MO&PSժe,Ԥ:m$(9=>)UQ:%9njc3^;Sٿ˫J.'#קV 9VO7kΥKdvr޿p\/v86+9#{4Q$%3/NfvYAS߫/mgjG7/Urc)>Ə0vPֈ{c$>8eckRɆbwW F_.?#].WqڦMOD~IErK C1'*ZXikֱ;mɪ}FjڼVW터1^-jT&ӹ-ӞϪ:*>abTNG D¿G ۫Ue{SM4Ja;EKU?4b #_jDAdP,eaT QEHX}ufC^Rd{ ./4 $ٹ(S[Hf]ovt%(?F3ԯ[v0Cy?Z q$'pڼLw[ yMD=#INtJfxn92]d$Tq陝 x6Ht䰲& Mwc?u鍁Zd%.!u"<~Ñm]c$çyįtrM}l ]{mO^]Ewǻ x=nӊ(G觛=H_<"9\A{%XIf:dz ys*lm(-Qcٸ޶FI|ַ_b@,%Xu&%8oʹ 8s.[į {Ś~815L49!d8{4pgjB/&tzs1v+ׯbd۪MS@fs3gy"pKXH$8mO2+ݢ7oqrIW-5~֣=DciW21W2~}T0GF| S{uCs’~yFc|wT?BQ#G19HDW ܳoq BgfX!EUmwFg@%կ>uhVd=I6Q$y%dpBq҃?\LS9BSOԚr]Lo؈bJ\妠),2hY#Ϟ#8=?[0CE$UhQSs D~L;M,0x!oLbSài̴^z ^WiXr=bLW|%5[VlL}#DYcre0!I.U)"N[tz(60#:b8i"TH>YvIN;D9Œgy @}fUUJ-OQfNC'He^utַ=h:IWk^Ɏ-ˍ2+9N L}BӤ5pW:n1&<ڛ86F|=L}D ,]d'5E|2G+ȘQz5gTα.:L3nxT=Ko9uM2Hκva9 B]o] w} :9ȆVj I&-R I>sxc[^M;{d}wZ1Y^n؀"'I 4ˆ8_qoNwG[}BnN.m!ְ!|x}Mё~q[|=/aCyI)HQn!e=tq@^9\|a.vi@/.3?~`ikOfI&$tY5j3gTO?EQqPCOO4Nnaowސ^~BT <o=ϩwL)zVS7|b8:@1DCTzJE3Gu(P,z t7.S"ggwM^{M|}|XV>|uODyHt-J^W)w 3\G/fvv7(ӓawb72~ZɳE=pN'ǜyX&@ʳd`דUI8'D$r9;D;D.%-󄖙IE! ZL@G*k :C*gC3\ ($?7Jd%zѤ)pĆҤUo"!TBR.Xp[ො ~MElDAb^u=`LS6]KuY2JBUl >Й_j rp'9D`#VX4*v⟨aKW#\ޡEKm(dlw-c-wC_yqمI99Ȇ^]^7 eVʏsy-;s7jkLƐ1ǙCw`h(> B29qE+(gr䴴QPYS+ yTK: ZlOl5/?jXRE׉͡ŸZi{u5InSy"KUH#ߑuR ]l!Y\6ZN'cPT*ٵ$؎y`>^eB+9/ź "" fa)nIE>^*NW;!^>^C#au0<27^n-^q|P^Vxe _sSG0wgz5|=OFÍa]4 j"Y6 f!ܽaMP %χ >?99}nxsNX mjOݬ`Xn0MP=.=NJi8buҼT,ge\n/ PCOH5n߸yz/>83)p>pj"]vobiyݪ1-,KpϢ^sf 5uMIEb2z'^;FċmutۢU_Xq!yg^J6G~ggodm%lijCk,HUb^p՘C21,0k}OuA]mfg3anvQ Q?Q,Fd Q/jP/LiSm7É-i~i72krIMAO_YCDA&#;z١$3bIX7M1Jӱ:X>r _4j50fȀ,G2&XF׶%^] !kHSr80B LN5tZ p9=Z_'Ob[Z\ ,T;E9Zb-(zى.ќGJmL\j,]BfԬa6/)2gW#7&1܏+pzX`Hf˜ R)0~]dv= ^]ܟsLA3 /FkQn`AylH0̳͐cvpp9Fd+QF岙(AA׋yu;-KUGe'2g;ݟOwF,${I*b c v=9.jO#kP~xT3W?t◡)֦,g]=Rx.tO}M/" ]`I°JT;=O); ?%܂bU9a^tnB&w Pj*w;|Vv҇`G=3\gfNe<|vTa `x;~Gs"&:pڰS6JB Ws &&: š^}TMOK51T9}+2ojC^XڛܟPl?|*qU?WjWi׏>~KI/9I;ت cɥ]>v(p*V='҆fE| Z=(Eᓁ@Ct݀=3a,c:t,S2햰&3 /a AȢ٤' Д(b>Y]CsDIj ^nZ#h>lZRe&y=Vo)rxAE.;n2va˜E{-;U5u'MتV f`CJ-{yyV2zRz/lU,棱U5c1֓#9Y"iSb(lY vsx ˣk0G%xnD'i s3'+>pܞ:[Ʒ JI[X,|c,/a`GwJF$ix~[4xXL a<'P , hi%M [Hw7\n=8 endstream endobj 1331 0 obj << /Length 3427 /Filter /FlateDecode >> stream x[s_ɓ;K}=|*=V|h5~u5~+|3=oC5^}9̆(_+JFHDZin<-ȅF(\y{8θ\FEƥS<[ɚ%]7榤V̹/J~]Vq~Y‹kO\W+2K~Ł5xe3@bIV"aS-ɋ+8/q8Izd~~$@"|%/c[d|ДnuRrۤfeֵil PՖݚfqTK\$ ܮ?ʂnW9N'@J֋~j2]>(:_EulF5z~;TFL>"Vt׬|Ϗ70ג57[ɺ*ֳ2aϼttw\uIJȺx>EhvLofЍ񾟹nR*5q?Omk.fi6-B7)w>oNazB( w %xIg`:K"[΀*WKNc_GPCA?:r.\ _>*&O$T{`< Pe. 0 QA[~(Itቢ;:jJ G=`1g'8/[ wi E,g`Iz='lbɀc`w[ySPc]D O٩yT/W9R }a}lV<9PܑlBPyjjfqvٓvlOh?%+S6AMI&B4 `5b$pyQ{>v=QQ(܆,7T7%|BK[Gz&aֈ6QdͮCDۨQ댧/Ucbs@lr*eV:Mqذ;ͪtՙݻ'ھq[ 5;q>0e"AK,@xD`9͐?xC^SiW8nB) U8g~ tO$[hԲ\'$:J*dX2?^fh2]+<[ЄɬUE5un̵Y={ַn7UIx/xƤ%I5wNG7}sA`v&{[`gGǙeynU#;0vHV.a@ͮUN>Ob qu'+Pu{q;ε-PYE 4 +fjd}"sj/\Ae-v>=Wӳ_*H~ F>lf~tFsx;K5 Ϻtt ؝F>ynOMU?#F=yJDQ00c`0p*F$~'f 9pa}ٷr<E5aD kPsVg{@!T[†4m { W xw ի)z97iqp0ӗ}el G'+K|)((%γ2Ԟa]P -$[&3 K572rvzp''-p:SH P6.sk"p_Mٺj~`=Y[&vWh(SgIazFިȞ/!^0x"kJH_+(Z5q6!KV~\N\)i*LoQ >0+O G_(I}|ٖ{\RKr\' A5j%$גB%2s@qQT+"59}M%z[T(aآZݒt5Z$[YRLAbw9{*z[:>u5M6% xf6{ uXD_ǵmtQSh endstream endobj 1344 0 obj << /Length 3812 /Filter /FlateDecode >> stream xkOw5 M$R!(-Q')ע3K+ι)>yngtͳ<33H$|v%Lpf7ُs\tgF/oA,R*B&P!MC,R= R? z$B_JF0cw[/f<%Ƙق-Gj=|Nk t^H $M~:C}I̐Ύa?1í.rI|~!{X! ̀ĉ x qMQ aJB$hw뫅 Tk |W\ys`8&[hۼ|qMG^;S`otct Z<9*ʦXy۪֓|-CsU0Eohum+75{s }h bwK(/mb wyqOy0Q@Te”gÕ*f fG@oeM:iO>%pr ;s|^8>3{D"8,fz&nWFȽ GUqRz FUOnͯ/c{MQ ''q c 拂@8tԺeFmbvh"LX[HyXf4P%(T`5yF2*oA-Lp(h%>[-tp ji,ΪZBrW6HƓMelzFΗ}WF*@wȶMf Z_m8ѮCX!E'(#R똠8m{vmi F}aM =\8z}$Fhrlb]sbwϘ!PfkDT8@!zS$M0@bz* >lUw&쳑Wuw_~C*I/XMv>2FS"tbhJq5Z FP1JhEssHYAf@1;<Tk}*p4 P.S:[b$˄uos͊DNͨW3X̰)r9CWF)-T%FT5J5E<É.2j!2]UN18+W1-$z,X10W|*nm&qDqz );u0X{oW.,ٻAs>ab끏`?"ZyRwn(ˢ݆tFrj8 ;RIVVHd67K!ߢ0aHQn4@eB6 Z;v܋g^>ڄGVTK<.PyO8,ZacOa@˚u_`@0z5N$#zw/aZ/G kHNE6$Kg^h9c"$0 )U/VkW\um4| [oA[ACk2N!\uZ!񴏛'R(qG]q7Mt0$BVspz-Qc9QqB./x 4!,ܽA}s:>)-6)> eGٺ ~}ݶ/]^׾ j٦P)VOĬ/~;=./1V#tw!Qw-pnY9rmCuhn%lܬs >үӥjRCק`Jctt^ XyQ O07|cF s,bqce{hDn鲭j7g}}ֲ߃ n@.֨ƦnX=s9fUDUY,$Le+kNG(a;<ŜF"FPpV끾E9,P񴛛oڰ)ȑcp_(7EƗ,PTG`3ȗ?,8˘?cV]0miOdtA+`~^: ױ{ <̬iZ־kI*Е0 iJ$d/F5~"Z@ fGBA4 tc igwcL݉!3<70!L)᐀=556 h1;1T# إbV fw  ay"*5;s @|1c1v 2$1 -P#>ȦE4@ PQ>5+61-t >@'2%DM*Qr-<%n3(k4Hiʱ@r"'WDa+9K}rM!grXNe?JD ʽƳ4ӧ**aJrvgPWb9ϮZUo4Y兩q nee9؉'U@Qvy,7u>X]%QL4C]{ݹ8Tqy^ dDN([w0504Aqhﴸ _Rܣh򥿮 K0:PՓHC?Y ʈ5=liXp[5mq[b?/^hXmЇ `iG^'[ ޫZ>bV_ʾ758 ݹ|)gO6"S  L^˧C׏r_i $)tND] }7ͦڅkny }GB=':[8sDfvgv 5mg}4k,o 6jI2^†@ĚI6YSțֽC u R]8 _(ٸ>n1:4!풂%nBg"ĩaZM?yPldW` *fAj{O՘9 pnX`O.mBAhw*9ڶq͖~GmCp}px'8^ƍtYil,".Fװ3|C ~AFk U:sEe)˺[=w̕x1,I';',P>GP{  4?ǵHNz~9\Oz0iLl  rJ & k^pm:RF'Ƀ4e &-S=Ѯ^QD* o5%<%>i`$X1=Ed9*9{@Ibz#c>Ɉ~:UDž9[NK@Nlb8x>ub<CPrƻհtUmv!qǁ/ lT{yG!rk z,#ry.Gmp6c0#;0`_KHB>‰uc.t_g6}@d6!7T| endstream endobj 1358 0 obj << /Length 1601 /Filter /FlateDecode >> stream xYߓ6~;$}|ttL18\}igfN,vW+Z+˵.80F+z8x B%6a?_A}1]] Zy5C 8nEܩߣIWI@hz#^ڍ:.0ܸn0#bkx IwYTPB\<&WWFZApuZ6]!m.bWy wqRu[N׸>> LSDyj]jBj0ãɡzFrP^~3Cz>T6R.@L)c7 g;2cKBd9B2fۋbӋԠSN(3hr̓׹t^z&LzMe~rzA6V`XN4aI@=L1# kQq<ޭD6HCdz;ms n͍2ĸ"Y5> JܓbcoF.L13$Uq;Cr:6"{̋MgJ W1ž)iI`'9 \/ j9H;@K+Kyhbاsڭ\^ⰉN4l|ʍv(?iB-6Q\V_*UTbYE#جU[ZC,S`ع0Tg"envLއN ]qbjEsN-n9݅y4wϏ}>Y#^BRVuݙ{-d\kIT'fC/GBX }[keiU_Ŧ.O?ׄgrxYB˜* @c;Ol;[%=nۇ۩|lޫLBA - |UeQ^?I&NL"R~S endstream endobj 1339 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/secondT.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1361 0 R /BBox [0 0 287 304] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1362 0 R >>/Font << /R10 1363 0 R/R8 1364 0 R>> >> /Length 1213 /Filter /FlateDecode >> stream xWˮ7 +lB6@7*h ċ~ǁk^69y|֐߿۟IbSRtIP&"a)X2M1hr(77yEJ[8dB]/]~R02EC@@e'A oB! 1qcM᪷GƉH:gCN0W m|H9y4 -%DELhYt Z)[tJ)#RĒ㒲+33_ugFJYHRɭL4%nc9SgZĻ+ T>J\/`AjJI#|%N+E'F-3̈ZKVicӕ6RR/vt'[k.&iL9IP/*#ɉ\!Id6PA'f8acg  ^6&=9hʢp^l7S KWIRs<`~J?B\LXLUgз'-> stream x=oLSg-8e:X镖f`V˿u`* dKԣ%0SfeRCZA- U⌋Ct/>|x眜! . I'?d6XV՜P/AQ+H#6 FJ"᫣R2٪d╌DHLS2b (fkD'&ȣ18 $y#iC<%K8RNu!(7D[xF)kw" ^E-e tHVoVo0Þ/sj"qxokѳOYaP7)@zcђZ{xt=Lz(msw~kftH]G4fYmJ*FLtʙnKX,F0 1%%yk7H-oP.\<) qiCPn`|0n<D\u͠zk3ՄW~ z:jvɥgB2,3+v`h0ۇ-Lgb U6=x_h%%\[|Bceu՝{Dnl=AUXxܸ}i$9 3t,w@T7qob*٤0%}8/q6!N>JtPk*x?3G-^АѠ:=itZ{؋ 4?WwT;˭l -Z5QY$wFTÏ]/" 2N; qp^^G IoBЁ(Ħ>荿~+݅]p^]~|l;׶PxR>)e00'kRe$33ՖqC k8>?ڦCΡQcU4(׌|n` b__ӞSB2h F|7|Bd4smyN]bɹ{r5aīvPj)TRϺ0ɭME”~@[A睳7'Fݾ1l.6"9oc6<ýCCA Cļk5<#pڟ}=z2 VJwg|^/z( rrM'M'2‡Zaa^6C.4&1Ea)*(:I5}H*AA sK{ endstream endobj 1370 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 151 >> stream xcd`ab`ddds,L~H3f3ECCa]^# L@`܍  ;@L:|?~{ȰT'%&&s|wb篝;pfil|pfZV@. endstream endobj 1340 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/hat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1371 0 R /BBox [0 0 496 224] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1372 0 R >>/Font << /R10 1373 0 R/R8 1374 0 R>> >> /Length 790 /Filter /FlateDecode >> stream x1 } @!lY** ^OͿMr9¤Ƒ>,k%LJY?oz{*r֚LT҇9SWN*YUDz4YNP*iݨoe*: XJ= VUo$&Oӷa5{:<T $3׈=W\7w^ eԴF&H(PW?):r䶪""K'T ^~}PmFFb J %V*1#/5mPjhqfl)w`1Fo$5xv#/~^iro/J%z |o$`d^ $5E\`-r@Lva"i$ Y^Ja~ZhiUY`_E@a3],Y\PHf)/" a'L S<"W\ *۫r St^8a y>\Uz0fVC9/Q1:E=\AC'Mbxr;닔N?Zn̩:#Ehl5Dj50%d2W̆nx`c߽Cj5:*Ďa7}~5Vs"4Fh>FJ=PkyI9/]wgIW#TRX=)# Y,q 5l endstream endobj 1379 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 802 >> stream x=mHSq5]kLҊ,]&db͙knj \(aTRak`/Ll-3Y&D¤Gk:/s<4A4-[OSZh~Dh Նw@: gR''r%Hg:z, QXt\Kq*(Jĥ}>I>MTJ".Ȃ,v-iķ[:+7  : :6իUEœ B]ݮIoE<08J3oKf79PPm;곿{MMMyWsAo wZC}VO.ud@ 5d1E-ʷ5D+! NHҟRXbղI~jH)$gʥF5wW ;{;7|BX{CYV0#fɱb3$¥5Anrpח[O2 +(L߃qH7ި^|!1ltAK4z\$INJT`3p +pQ\"q7Q? n:H_nb귷ڼ.xZF ƚWϽC!MZX <[`rf0ޕ DNH(+.\ u *iowOO{؈ƻy~xz-#ɍƛ1˵bdx]ԂX}4. endstream endobj 1380 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 250 >> stream xcd`ab`ddds,L~H3f3ECCa^# L@`܍;@L=|fw/sۤ7/>Oߺwb>~+/seI[ax8Gxxsoyӿrߙ7|W!wmhuf,.J 7-7on6GNvQVy6}23ـd`*4c endstream endobj 1389 0 obj << /Length 2533 /Filter /FlateDecode >> stream xZY~PVil0 EA#X KI"ٗD3>IV]:H:4_ۏ,1FR|v{?S<%)Bn̹_0 P>Hݬf fM"7MQ~If@:a k'L͗ӯ2o?weJ05O%X:eXgU^&|@h 紱e%Jˎ$+u8'F(ʞ%T+{p3Zl&_k3nq72}D "%&4?QEcI舾I6}TMVb M IMb_dhf,̴cZRDx1P=b"#'p)fKpĦ#UoVE'V NOSX&`+ϑIyӇP,+QqTbbϱa`򉩄.gy[_kxd3`GڜS\!5IyHE&*> B8rP<*Bm1BH'dde7<[m1!l`3϶Z:0/.Ā5n00zOΓIo.`t<%iV?[gdi먕 4CG4*?݃?loҿ~ɼ )l >ZM7m̪ؖVN\OǓ8Wr,W2ִ!˪"e5k$nUԃ$ʉ  sǥq{?]7z^N6̈AI.ci^cCȤ- ҁCʚ^&#g;oW %'bZ2EG0D4<>-M9 H݊tH fƊOYl-KRgS@"ACq"|y}<CTziMC,;I0o)yVSmL!즢C|G_y]ȹimBG6_lC<>;q.qSFQ(CvW7 Q)AwuΤzP@Zu0տU25_4GڱҸƻL QbrpϺ2)񛸫t 4l 0#q:g0E&&*Zc1쿌Ï+)Hw!4Ց ]#ef'3W ]G$sXd |wW.;tJNȡjN0ᜄv'}e- Iy/庹LLrwd}$L9>y$|oWoStAПȨ4Qpm#v6g(`}au43/C&@Ϻ>C֛9Ar?f.-x\R/"xW9]R؜p>bx+̚I@ )QJ/{A#'٦ R&P OO@,劝{f9_(ju^B R(G{X/cלI= !D9Slq"(l/U4yBz.7oz6b vr{ 5xi›ke]!r긜fG$jۮUm k7C[.n  C (Tehd Yr$֘ZM} v''uSfri߉p2׎MUǚ'x܁̲ٶ˪U4uݳ^U]u/'2>wR136' Lx7R׵?-;w CwP52$r}) )]~T .}:=zf]u: [[.+̜0ϸ.Dgk}*swלWe F`ܮߟr+6[^ I?.mwh*/GyVG/cl1NgdwOn;Z\^ɌyTXs\g4?3(ӡ@e "o_J5 endstream endobj 1404 0 obj << /Length 3415 /Filter /FlateDecode >> stream xr۸=_Q] K\m';;NIhJˋ$A 3mpֳp__|{E$"6)6SIL]T\0BBhW_t302_(ɂ7zŷ/B .,*6w2E5> vyݦL5>`U(ͦ*m( UFx 2}uf%[+BWeef~+@VPn {Q7øX曻2srψxeʐu`3A f} mb?y[/ʦj9`]]ԈId<>?UydQg3lY&3X62 #*_}b @, Ng@%`󠭑Yd٪C$Iݴ3mj.9K:6^UYvm{% 57?ϻlsoqkJC>9rL(ȧ1Zۙt)4wVfUbuzG2Nr4{rS۴@^v֨/ vzeSV- @戓/'8lPU"8=hCd[3.o{,~`mfLDT[(!HcȎP91IaZHѤ GFAZ vxТ`wE&€}lEE pvlPUJ?SwXYL hukENBk lРyvT$R}IpX#WDu x¢D he*U?f[0|ַ Pb_TN}{rA0:lh=RPPH(eG$e>b"1j @ p;qzʷ;Xg?_$ #kRmŀ rBFW3pcdКޡzsBgۢmlظ^=4_Dj>`AoGt1R;s£(6Pd +XIfT<N UTF&[ˎ/໼< 3 *ǰl91^7omf}/:HDZuvhAnqߍF_YDʽ_;{xnjFbb9s`Uq܄~; <D QIgVtA]:4s^C#K2FZDn9PQHA 6BXEtqp*ΞԐbH"8FTQ"t.M0tTib.QQE6}qfY`>ct_&BsO9$ zpy1`^ VmO}saúA'DǬd40cᦫ'y"^ e p1pBQI'\vrIѹԩk SmJLMck\/yt] Wj;4ia+%`@;A 68:! ߕ3`FX4)=sؤv"+bgW8YGfAHgm.IFᎃTAn'pqb FȩlgQO-BŊG.q qvdu:H(TB|LӰ.C"f·Ϗ4|-=AXwOǺM44ܩ<s|AQjOk𸏕|{k<5O>GL\$S}9,@$)Oٔ<]!_Js&?3{:&Ww9qEdM䶊F'ɮ7~Z6@cMY` tڡ vc }U*ԴUL@֍T'#w4$CQ&;tji1+re;d t })+}lJf#JOSztJ/*=}>g*=]J?q `#aB:"Uܵ[콶>[79\ xtfsKY"%1G C*^b qp#Z gy[N d݁v-u2NhcLtMdBU4.gSo%"vOR>xsds$;/hNNyOe^eaoNIKv~@YS=]՛/P?H~OJW\G)B7_N0Y;!Jў]eMZ>@5?:39iױ]6 ZHw}v*odA9#LLh,EЙ>tp5Gο%<$}ۢ,>봱߼G*fR76w[~}?4< endstream endobj 1411 0 obj << /Length 3044 /Filter /FlateDecode >> stream xZ[o~ϯ hC(6*m@Sc0E=JuE8sv93;YNa[F)Ej2Dj%P^8/&ptҙ?;z*r̾s$뿽~?goͿJ)t>˻?zﳯfОs'84?BJ < Nz.E5Ohu:Juvr眅LL 䆬쇞@\b7uUkKPHk+ioFU JPOBrG+H!$:m /q,Oi$rpE~βK=dUw5xZ(1hdrn^i\yy.h3`^ɩ餋jk.QsHm݁9Tl: LjO$eUWsv* })f@!`5#WGԾYGC䝼v6ӛւRH 'UXQ#sLr| l%]oj2YL$- 푀@x@,5{`FF]vAgli @t DrpQe|ȓIdt֗c H3:m<#'I&/jѦc'e?Q)#|z/GLgFs)>{mVh(K|wf+_~ɛg=YB%^ʰ@x;\/h׀Vf D7` `W5%ϐ8roMכLaD7"k+I^Zk2ƽui*-8 EEy=,*HykTD!ir4:7iM*jQ3@pG e䅉6EChpje& [PEkI:J"Ȫd_㔔$P5%|R5Q༻1+S}Q2/!ac\JNh>W) I`NMȱwVWS tpQ)f@}ʦ6&z%~?aC%@NV2eLݕ8dYvf161M-7} pˠ, ܑ!tqT(xbꊼ2ݒxDo!rZC޽ȋ(J!ZnӁ33=.}SDC%pzJw^;CbS9*&t/rg .`0[XPE$j ; mr 0RӁ7jXq'53Qd-@;f@;6b {;Ta U4MI>23;5Om1E('-V{D6Gx(K$\谏uEz * A _Tbn ` n5=TK '밥;$vqv`8" 6x 9A+{ϧ*}/9,4R"=mIx ]tmz7`V%yiH0~B/6 ' (V(EE &N?/TtpY;`n;' |/;n7l<ኰs:A>¯ E kT&6@|K<ʦы']V& \vefXͷҋE},cD22)Ï ڏPp&" UHWLHtw9^?<=PC'ݯ%GNaꇧtO:ȑ}(C7-ZWI)j%axE)h@;ՃTO2kHHD(E9ںgi6§\|q8@Y`>c}()4I//ڑ79WVyV5Ϙ=G, ]˳k8!TIn'2+hnAAɨ6PGn|6#W\jgh͓f0E \9nQAKTAp7~R cĜ%:>.aXann /|?P6:OнdwLP=sN9m8 \ za$HwD>ȳuw$w I:>;Wtb}No_ .J" pw<(.W>y3jrnz~Y~T9r9bsi8In}H$zt'h?)V5G~7c?I6]Sl@ "c}I7T;?c endstream endobj 1415 0 obj << /Length 1759 /Filter /FlateDecode >> stream xXKs6WMθL&@Ț">bw)R-)d Z,owaMk 'qdxl>aܝ*1"Ł5ˌ7׳wopԧ凩όkblemMnkA>&Sӵ,c+I)ɋ>3> $n9Gr=%uHynK!]NLJ&ivICe8uF=8ĵQ̒d6ݸ; naEamӉƕX hCጸnety#VczPN]% GX0_R j>7w(b];NrS ʛ\UvcˣJr6sh ?P&\5{4']1jJz[H*Ӻl*VNZQT[oT#>ۺyZF8ww{Ё"&{}6 tн]<@P|BbTJߓa%1n5^H3GMQSpTQ5-@ܢ($&"p?HE^G>j,eU&u>ZEE- ǗߺxA.Z|r#r8>6b߱1dr49v!Kyw[?ienͫtThn^2mұbR2w^c(dcRQ'ԝ4UwAOc]H`;!6v'"<гo eh?`}M+w^*?֪h endstream endobj 1419 0 obj << /Length 2221 /Filter /FlateDecode >> stream xڽYK۸ϯmś][MΣTR;U9#b$)gf}ѠD$eh4_݀b?_w YR[ra3΄7O|vRJ%j`Jg M|e!ۥt#u!+,X-`1%F3YRr-J,YaQ~t5O#{9t؝f{jNE( ^49Uǖ+eP'.W"ܑ@W6ʹVҊdݠ˨rljH|^\ G]>_=*|<?k9T'`~ܙ(ѐkv[}yߴK'p*yt`A{2R\2%';ki\[)Lƾ5nmAhj\_y( @EE>[̇f< ӃcфmpeWC2Eoњ{/\:-CQ(F X ^["QL cIݦX<',y}-.ςKZMp\$*XJ&p Q.|[D!WP4mC ]S}Ssl}쭋+8+bVaY E$ !)PC00[f~e/-\h Á28:UyۖM BdgwLgATCJGb~ U]C6XH?]8>кGFFbL&|  ;: 5A o[?0]Z1jUp #4!$ =yDva\-rS4{_!9ЀAgD l#.pCn` 7|VFzSc=IbV3=Ȕ6̳D> ~}6(\SG1gH5sR?_),5wA[)EeV㳔V2ERbnI(PIjv9 jE1Ğ(3N\#`n{YsKnSG ^ϣZ PX#BlnnAXLB U !C7)z5BJ (c9!fh>ZKO~}NdZ'`a"ڛ;Y S9}@qEWHщ1/ЂtyJq(aM(Acmͻ7 (L ; H3zP3܍{L.=p&=f#l+p|T<yt`wtalҷؙԑXҘX*G~,65D%j=ד*I֦*a+X3GY1:/"@-cEHp(Jtd7_,#6*m8(Tc٤nն5_#Զ!aR}1.#Bدc0sR@hM)#BPW:Y51h~>:ą8'8蹍Xv!n $9X4C?TسAvu 7Ŵ=6x %'O\ǧPNf:"=h8؊$lbSWDNP>nNc!C! 7I*9sN7&,PĄP=͔&T2oÇUBœ{cxwH sr9fٺ+~m_RHOpOxxS2~T<$/QY/|je' ?E3fZEJLfO 5ܓ endstream endobj 1294 0 obj << /Type /ObjStm /N 100 /First 983 /Length 2672 /Filter /FlateDecode >> stream xZn}W0%0-SV6~RcD*$8ssx8q@ 3S]]}TUhPD&+$t6h, ㅋDPYhN1yZ[ : b҂-te βԥpЕś!TT#h(={%fopl="ik0Qx[)E1`S@<ZDf-ۄwCɈ TQsmr"V&Z|Dc!\]a9DRvSHH8ЛBKb~VRlTiyhREvDSH9ꢟ9UNiy-j/}{#).H{hR#0S:\B5#Xz>_4o08,77_[EnaT+r`"?niJ?Xc07^hPMѾ8D, WUCWɘlSoQO{[]/>{iL+ "2 )QBtF(}+?'MVptYʨku0W* 2VBIo!wRlAφןTbTuGI)mֈ.[I QjPwQ:һkNe`$ceuzrJJt^1oڏ%.v̎$F4[_;u|/f Wē7z8{DdS4ppڝT_,E)R@rHjUU}i$O>Lg"+t~Tf2̩w6"x~ƤqplmWJiVAQ.K*a&x%B>id`"gD-/aLB9(# h`]XuEɰP2O39׹-5-;.&[IIL,Q W (1!?ADfx"LD/;P XZi(Atoޤ/aF'33Y~_/=*T Ӵf_X O߾Uzs_5"/ `n>xޯo@Q5lF&mۭw҆FIごqwI^-륶SF<2mS)c]7Dl&^`vX_%vDsW%5^Cu&#)x`,Bmy%]H{yJ- c)փ>nlbH3 ˯fW;Wb{o"nI. ?S.tYˠf3 endstream endobj 1429 0 obj << /Length 3152 /Filter /FlateDecode >> stream xZ[w ~ʍ5\8$dnO6'MZ,n(RKR`xGgml 9yuq5Gb1 (B&]G?8@}2!GT~Ӊz,$bw?{C`|ח?{ٞxVm)& TVt|16Sedc>g)KK;dHKԺmbZ"]4DѲxz::Ҝ^d 0(SPu+٬섹,]ihi)Iᛄ4sZ$Z&g^rCJw/m-_Wk%)daߋ (FĶj\eiVP;wg܇lp@ b+vƛjzC$͎Ny N8bid5‡41+,oWea `uR|w-~9PSA: fBZyNV.Ukk`l"8;I n+8Bj (\!qEP/NB3?2ЫP/!V/#1u/0eEeR@0[ =e%tS)]g=rZ*ZhkAK^tߍ!:өuLеl'*V7w|*}tKBk<K.Kz"L1,e0hz첌%u#`є"ŕ4yxq>W;e.z' ==\$9L&ɶlІw:*TB ({9O.{d/2`ox*[;Q@>d]A8#CB8nxKbFF-ALK@GPbH=4oa0xƠ͉.0a#r(~[3,TmM'BCDC|d2=9bz{zsD]> ߥi i4Ŝц7$xę1ɇ^2SﶙZ-ݛwhV1J-g50U@闇G1Qg-=4PF˺>Zu!1?TAc>E60TGpSJ3& Ǥ{&>*`r哾7&ɿs, endstream endobj 1436 0 obj << /Length 413 /Filter /FlateDecode >> stream xڕn0E .)pfw1b-mkP*1G*;-!M1<hsF>8]!3Rkb81-I H/ b=.?k cTbh8"&,~m]E,as# ɯ]C‘<e9pGE[3sh9BcZNP Ii]>רP`l* 2&Ags܁ayN~e%3&Z Mfh껼~%qB }Sofȑ֯ǩoqJӅƘ7TV<>>>> /Length 32807 /Filter /FlateDecode >> stream x;8 -(zϒT˟x9}7  ߭osS[_}l_[o1o9[AKnj#p^་&C7Vq߿:Ar ?}q>_VR}5noR kт||Mno8{ٞd|9O<8ܭ oQom~kK_) >&oWUwA7i+-.CO1 ORv}JفCkC>/ _-3:DC7ז'|흏COH U+ٛCۿ/oEf܂|458Dz|>? ؄FRp/T;/o} Rq|7B| =XJ8~bڹlu^*d-1Z t~UemnA>_]/Ĺ^U؟[ Mwx|߽޴?r_&AϞ-2j qע`VU׵C|Hׯ)y:h/;+.ĿF;QUؔA6v݀Z<=W-oBc$t?38T[ -⺭/t9>G"$ßH|+4 ~玿׏tK1t~tRzzс;Pšԇ={A"}Z7sS=G47[FMb'&~'<ӗrѹһ<~\?<$:@|vj[ƒ6{ˊV܁r<؊܁ߋ>+܁GiZԡwԿ=JqO!%7`aiJo-#O_"b%~A!rrD8VǷܡ22? {|Zsm0ǂv!l% Tv Fa[B*D|;&Z>,kh+-ؼ+ [˯SZ` $0FƜީe-%|h']''ϻz%cZI|lYj'V|K{eog>ϪT/ỡ݀?QӱԪoA. RtUA7WoPHwj`6gyG=UtZpiy_h!<'ˆC'Mn+f΢kA{Aq6uZ+~6PgVHez-79i>٣}Gp^ ]_O~_J]-YC(Ib͇a1C1x]xS|#h`-@-caU۲{cۙwIf sqrFctfMEm9Y šn 4Kec {3Ox IpIO ?m۳;zww`m)bڊl3Mq=;dܘ ~os JC=1m!IL`ɇWvK.ZQ3#ߏS/cm*;>0|mX9-e,iVlᜋ0?EZyù:Efh>1&ɪY 6$ۃl=k̻)BF59Rcf5qiL;Ij1J2( \,҇>[Ҳ b] 9pj|'.qZ_Wa]JnZH.O8~2l j6ΫA7a(L(;r(KQnV&gUmZ;d ꬝)nI^8pj{zYO`;pb܁|?UvJ@"M^Wl5#9Nlڿdp_v:c?~Ho3wVc}y^Iz;pjVcH{/~qu׏wVR쑼{u~RζDk;0 |wn.g&ԛwU;,,_38o_}㻶sԛ5y:0 ]J{~v=&߁WYmNgQv{߁Ğn TUV~އw|e E*]J;t PeԶN=~s`/-ί'OgT9ۼP-oz%\S3`eUjW\k::B?)GnENQ5CQ\כ'ع>[1N71kD*^emG!f}> @-զvYpڏ/s0'qNw谽G3 ~909_(d`ʞeWbJHdBu܁:U1Dz+ѷn̞ Y7ͫ<;Wvn#%Ot_e_@]Ư.E@9 Uߺ%lU^pjrT'[T_9`۾wNn@690̧u>jqCwO/#eWqa^1ʷMvnb˿}IqJAk<.zx@؛(~QR)AjPثN`Xj Cy9˓$3K&;'|^4`1߿o;EJaefsi"5k-WKrR3^O-ȧm LF?!˪:j&ju9vEJTr;TN ,ӡkKY܂|45^_nK~_e-ΧCI7bv#v^[f= o\+noZZg9TZʖ:t~C7;&; kBdCwBvL9Wq߬2b\E|4Z"['Ƣe-MR@CebJC9dXP29m!uK\+@ 9CTϑ :kvA>CSfK$C>GxKʰaB~[Oŷf/JʦCh*-6 uM\oKIUᇅX-|ʪ^e{jHp\Ff׎?wM7έ&莸^+7Ρ>WN%Rl@[ǒyR>Lf+JGOn=75mGa83,/܁$vsR'܁j~oKl+:ZN: 8V''x*C2B“th3?L2̯UC!N#3(CqG__DEOm9.hE)yd?RS١)|gMZSf(2AT!_*CV;_?#_:ڭ3ʞ!5 @m'< ㋾; h tG5=0V<4{mwց;P%<=~JNGXv^rZtHD{@"{ [Om>2 tj%]c@sAFrRf{5L:"BC#Cf*(Xqʟ߃~W.&*CG0<>kJ?Uj\ L}Or\(:$Oؿ'ոqD/2Tl hbV؛o#}%Λ88_y)cL\dvfC9LW!>zr%_ُ߅=*Enü- 9)~xC{IZ/:}EQ)28 2ѦelPs#@@уz@_f A1SϾ&X*ȫXƍCe9f?Iq3UڐgBƢcOˊYZaQvcM~ ΁;Pe~ia{/~wt { }E,4$SKOTqONO@>j@u={v.+Gmڥv7}=b8p=H1*T4R"T@"}hHLR窒+TS5/|o<>ᬇQ`'gt|pʎWst͒>ŵ|{q]v?w6?PC_ [;߁c>IoA9_{:JN_jPr<As5QtPʥ倦O~}Ktc?ʏjK EE+B=A**o ?O0*D_VB|RSP;090D#xxIr`,) JYRq#v(+x~靖mވxW}~az7Q]o=~0~q^Ƽ| HV82߿.pȗ~5/ 9)yJŷz%]YX*։('_O_] | ~)u`rRC `WSѧydg f_WEE&ye]{XG~E;woO8@Vk_)?ʣk%$Ogx ;c".Uq,pcE+pfO}rny(Y#^oț]~~at[W8/t(`6fZD6g\k4րj' OE'm=U ֛FC5$A7sZ7F^cPZB_5'Xz[I;"FoHو#+Ym˦SW~0r ^ҫBwdVߏZ~SthRUF/WeQno8Xߪe# {$ol&{&_*-_Lvj?QKFC԰OZܧ||VK}=( Kj kvZ7?k=r5BYR[ծ#CRגB~'.x/9~koLz$ VNb7j>D 5v  r[33 {C^}Є%nŒ7ΉovqohrgJ|:Y=\mҀZzxb /ٷv+W9j|v&PB^Q ?ChK(g2S3gzF8S3$4z!9=9F"rLQHe9Ov69,rt0gr(s:ê=k,tڞt]s>щ\.E_C9ax}u~T9p"YZN>3\][|/o ̱@?w j}8S\F<{gQGtP)tY4ͯ gTp̭$gcDr_urIN^]@ϴl 6Q{gcx(t6kfvQ{xpz`l5䪖I4RHZ ?ӗ5?F9Zh-ۿp+{9 _QQ50+yT ɹy G7ڏxI;5N}_oGmve_U[.kHkA\W ui?~QvE5{ՉzJji`8 ~}!?bɚaj}3Ԫj_/Gu̿cN_ʮug}ao($ϩ~}]cv@80ҁ%?VwOg7+_.D@=?ɏGЧT1Nո}FtKPؕP? &B;LmahhJA,1F=>{fX cGsM5yX:5-+TOj_]|C-zZ2kQKjӾ:%a"wۢVj ؏{O_f/vKѧE;W w9ڷ;ߥSfA˚7 ;k;gsp ϩ 㟖^zK=2qy͑'9xyް#vgϝ\XJa۹h .5o-wiRW[H #B9tL;05 >BΦnZɤ8 ߬'!wѨ<)w߼߃#56۝GlMY&*WpI(={ɓGb*g򒧦f/@K(F ޥۮkGv7Cekc NCۯsCzkPkK}onv=μZՎ~%p\W$wlVojA95 ZͥDjo-Er%߃1Z:!j?Oד{{w¡Z$+ W0h-_I/d}:J_Zyt@_Z^ 9;Vk_P=D-8]Y|V=v]hѲI>?K-&`!{ڱ6فޒ[6_Y~OC6.*Ϫ%~nGA7wlF]F0Oזu0x1=n +?2P㓙I!jկH#mz P:S3Rq՛Z6wXj!lfgTY4kum= w{8TZ>[dt~+#\p Qq/-nP'gZ`rrnf[@h-QiRjٴKۃF.Aj1!C9t~רʹmʥ6|ײA7ꁋK`Pg=tc\|~zd6zưC9sz;ħX^N@XjԛDs/ƩC#u]v-Ts=7j5|C7?螏[־AԮS12L6Ň{\s>5MyfV5`]_z7θ/ywpQk]lw( c| Bp {j=΀KK9걳tlrhKLF=F0ѼX[մT J-'q I,$}_ #ֽ]]=aj K?,u9z)+;uj~h@77b=jN+Uu_Q kՍPڎYhO 8z/ ٍ pWoJK^0hZ7P( g>u(_U(ir%N+W\'|x%N8[TUImz_8GA| ]ʨ;ϝ$޼r6\'7qIAR#ξZ)kt=VwQr>W-|ꉂd-7npF>~?al,~kmղi>wKVG޲;O,26 @_?E؞uNA7s!r, 3:m9k]Yb?+(`2YF2BaW%i>p4h~ʵYEӌēޭ{LkZ2ڿ2室*b/yWJ*ޕI5=dO:ku]c݀_[m=WտmЄ8~é n>6}Xno8e|}1ѻUרCkdhcДe:8f^80I_DHlġ'|! hQ9ozm3W;5.rGajO_FrPh']ЏjO򼀻볶aw4e9wNدynq'Xg ^XπP;-m!m;!Fi2vId{R!Od/#bMI ;EN35|t%zK Ae<Ȼn 9dB>v:c+ #kV3u|x΢.y:O|v'97ơ{ڇ-8wh+7hF쑲i>ߋz{Oos!u"렬}?~rjVltOvقgsiYu{h~\j8$;_͗IqFwFx8 ly$a0Zg;qFZ1Y٬DYHs#_/]t0|id+pBv`q!P:dy6C35;|1)7\gs~<̜Ou :в%|HԧRIo}=$pT@Y5ԝc?ORX;sKXX;(>Ӳv/R'k@mk><{*k hT'}3 O+g,\f٧[FHb#|s#zfQ G(T&eKfgiqѳiy6CKL997JN*470lnJW1?Qr lϠxyiaކdܼOPl-MM0,$OA%:ǽi~Z.z}JkZoڋ8pٳ5 9Y:㷶c81G:KmGʖbE3,+q(OS"5=f~އ}ط[ڝ:'E:?ߥI>}1Yt3e^?c>|Z{3evv^@77jeecAo{2ȼؗ|~iyx80nՈ1n~txv uJۨCժθw7ުQ6m' $Bmg9Eo/f;@ٔ$R5i<-Wfv_Z@Q !u14&%oz7hZ})ku=VIRr޸ESS:\R6ӼKi&ϞOG#l: b6]ݻ=7$7'jlS9Yu6n; ^Eo=ޏD_-'mitTJF)Gsa@i&g|iZNJ=l@%?)XpRW ]7M NMo݀phkLC7{KPiycFC7:xmqP9hz!ӵFP5/?mʗo']-GK{Hw;:ԲOu!wѝJxЫ^(op͡'_1V9#4y>UO]sA˾HO#W%[E}5z9>Uʯmт|/GϽ (-f]^ޒ֋ -o%=ß}ѪԄSTqP]Q燨h|O Kv=c~Udk zڮ9+L˦vIjߓPDҵ֨=wUj컾 XAj\@;YTh{<.O 5fx-kg_oC c]˦ѓu}J-V2 ]5y7in%Y; y^o͔'ײ-Dz/UR3Lb˲~ ̲x xcQBR{ yϐSLn秆Z̕[F'Tye|{ >-$>=D6͇όK^gFӹE^4Ilp@g>}Ş;ɮEzjB|Ӊ7($r٧Og١D7[,TxD-,wU>lqv'ߨ:~|]sCIhz,Op"ڱ,&t~o)ߍ8ۂOA5GV|^@z[iH|v9CԼjkg@({Z^Y-V_kRř2ndκw eɇs~"[0HgQv6u)ɦ(W=i\ lZZ3W'Ը3Wpu>^sZ=cj9 ve;Owޭ[ 5m=b)>vQ6TNp5QM-J[ѷ6;;3Q M^ ٔMl ,Dß$=!5ڻhmTmTZbwZիÏǂ1ӹRcWP^8¯ѭ-xQƇܢǬJ-Go[ B|$5f$#JqNeޠޑ+Wګ,~yK=۾ {zS}oxrk7 lju߀U7-b1Z]X8FG{h<L9:R^ǶmRkO-5VuwFnMW0 >In~WW%d~k"N/*e$~I'ydž3uo;nRґᇽYfQEyBc:)>FrB5"3 Ee]ͲZ j3d|b{YlK>CN0?*3f&ڑٵC) g(揖Xayn Jَs撗^ 5јlz/O2HOGր2~=݀j3 zNC77 d|,knA>,~ϐe2es[ew@M9Iy/4]]`ا]0VgEdrO(|Zos [hl nyon6g/o.OnӖԆ{!ByYߝW-'N6nƸ[{zC֣ ֧2oyK{R,!jx{AwOw>;-=뛾[o*x2vX=>s*o+ԊZdfkٲW ;~YZA==Җ;fVV_q.Uw  ße+3AQb;ۧ8O ?4zSC7zӲI>ҽmwx|v >'s!sN/cG["ӫ NE>ԷG55:"N??lN_\2tSGmdNV$~㷖4OЌ~^\r>ߢ٤Uv>*q|]?$1 Z鳌C7wv3$o-C/u/6ded@>_[JʓzeT/f7t~9vP;k3n 'e+m^lh!>v?K ߳5ԛVOm6s(Cz]^${Sc!xɇBqȽclA>Ⴧ=-at?,yB%ǟZjZ/=psƳRs&p6{X@wF]N@H8'%8A >| R׳ڡ=; whNEY~AepZo͜k#!QtVFOq+~Xj>Kor5s7'A΂\q.k3R&SImì=nA> 9c-Y4&{ßr"5Q,)Ab/F#XɑցhCOsSOٳ(qJ!{PT#.Q爕=iqslI-GGzEh>LmZM:ա^Q3LQGy=OjJ\y=ӻzYZQFK-9=H=(kڻ{z&O܈~vNGzط./Fi垏̀]Zۓz|H8D8B)\´YR||Lgz"gƙϩd-SE> FEMxYhrV<&>k}+{{9)×v~xγCY|:t%fD8:Ǩg'_\nl4R Ni~iU/n><ɡw mU$+mi;KMr:Y.S-C(f7,7c6d74'j  9wϙB- }:@j1<6JXp(Rß-'6뺝ŝ/U>^̠Q_-*_Kyp]wn-j8܂|45ǯ-pm{܂|45pÖ wt(~gvPǟf3=3JsK4hERš2Kg>kOfgZ5z{Πsu&\Cnlu|H9~XH_Կ=tpʀno|jPkCmnA>Ym\=w꿲/5IX;FD G!ͪ|ѡy s{ԇD/ 5-3>DS$}j\9#.{>_@LM<xײ%Q6:13Yf=SƜ[8lev7;E N9Qm6sɪࣥd eS|Ѩ-^2\ htBuM:+seb\r7jPAʦ /.f@>IՒᷖcW 4ÏjԆʭBԁD:T=M(C_Ѳq?H Hw}~s5mhjy7PrĠS7%5m]Eu25TucNh&.8JznJK=㷽4n-MC[OYnԀZZt~ LRgy݀?) Җqv͡_Gg ʹdZJz. ȦzWnҥїŖؙ݀vG->?r$x+|x=Wdrv(7N͉J{{R;~NϢHVWPʇq)3N7=y:1+9dRs"ʦuN-Avϗ;5yEg:+ 8[kq$)$8E˦( SEQϺdoplG'a)sdr^gXM*n!>8{~oW~C)_ї>e2սdsڽre||Maۙn ]ZU1J>)X6ێFmY>?gˆIFYs@ʍqImi3Jɇu]{S7ǟ$Q)gi`;WaHCy\9tI-|WSHmud@nj׃l+ Z|o|՜H S>v - Dok@B7md;QaXeͷ~<O[l䣩qȘٳ>|xceEyۚ aK˔-.݀1E{c4-OknddEi߾`"1'jveLNi)O^Kng HUVhh>$Z[lgz^&wjn-a'953YR,}i{!ѵ<Q7-=hoK`tS>ݻX/[U?{eӻ6lY[^' ;{ho띓7뙺GvY3'jF:tfuղ?g$(]߾_rR6JR*no-唦m-GS{.*y",n2W<,< Im8I]?|MS+l}iiN,ݲKc>h;Z5iԨ͇Q~"g;BdrK<'Rj{e|N/x[X%_JQIMZzLޮܗfSǿ(x%tF)e2NijjYhr~j |wuk-sKhj?߯m=iYPk[ջzn/-G}ϧ[b1JˆޡgeC qHHo M>n^LXHM$_=2{Zr=v<|uQ m@:OH~m\#=q_s<2r厙4\zOb~kʓ%:ZrSϝYp I%aF5vxC|$Yh8~Cf(uT4_YJ++(7(/a{''C>X,tY:S4hQeo*jhA+-[bk3XPI7kߞzzoD~o ;Bs3-&{id֧YָCoCi{Ktӣot<p%G=h/݋z6P]? x^C7OcN{ A x9Vy}OѲEPYlj N/MߓЧ"L{R6͇w콞ƻQ[I>fԿ_|1ơ!GZt o_ rd\lY:@om{R跞,*t? H02;Pgbwz.]Esu#sޒfdSvA!S"μQrw%ϕZS+#ɇQ\6k͡Jn׉8OO! P|x*z'PtOcNpBR#Pk|P$WIHHG\y]rU!jSw"*-F]Eejt"L`$e|([Vۯ??zno85>| _W?1Ӣ`l *-[§㷖jx.CXU@7q\=vи*`o^]R :=Fy쟜`^Eq7r:t~k3j> 5lvz&@'[-U$~7hh>YMC%ES;d%݀?|0oؔ_p[W`)I`EYhvt/$١I;{b_̠y kMvx劫ۡIZO5Kj༟hzQPᅱMaڿ#\ ugf˜m{shL5gjR-> ps:fxޫѵV|<ף^߃8z])UVM 5zY|KԴisWO{+ޫXm,~6ʹlR_cLzcrz\jc*MußI4 b|Lb=M疲%zc1 G#fifGL2%7(2kV8:B[48(7>[PK/ *$w8(KqI6KY:UJM\i+ɪZ*mQ_2+R0jT%PwߓFP6Wކ*Hz3TVKf՟^AmIݮC6i//|쑷C%=Ћ9t~mlzۡ҂w!t~vD|=l@l(s]٨Jk@Kjw,ޥlI&\NԎUU 9:oʠ)d-Cl:_7noڲq ? cW1RnHJOk|Njju ^'ji>.kGOt&057?I!O1>^l&jKdK= 2+?z|<')|n6x s)|_̠qbeg`9-9!s@mm!gK̮l~=q~.h$ע<)v|!Jol=5ZTSN߿该VayC7w{;E>%ҵڱn{~D+c ec {xđ5bFl$~ڙW'>_9t_}A4P6g@GG\AOI#a^F-}ԿmXon|45g{G/ݮOJ;i h߫t"ب?RӞ<Ԋ{Šb>ѡUN˂ogh X6s|>DRmJn{_)zu~.C)> rzOOCш8qe)rsf;t4I6z !W*4IZ;^ԿC;ph}Gish`# c8ɶl7Ol{ރBϗ7w>̀Ԃ|*~|k35ǟZwQ2e@&j݀?Hy889=Nx㼠Ƕg?Z4otl)u0D5"׍Y--]t"gԚ!Ľ4Py.P0Yml 9ki!,ʼn2dU$1i7sV濚JZ ?V݀?1x76^l!%qy䣥3MajA8]M49bq(qHe\5E5#9rǨB=- :TZ^P lsKH=֩ X8ITQ:`>ճn-|Mq"FIlIz41-T)"8Qǖ&$ph:T.syt~ljlclJ˟4 ڧf'm䣩~mYB|#&u*_慮Z|IPrd܂|Xo8&8>PɖƇ%y 5mUE}zmhT?s 5ݧRoIoFɮX=._\:}~kSsK|hqCjlt4Z?nA>m>ɶl8}!f @;lz/Ϋh@-W#t~Xbe9sš'Z4Y<ٵ Si>('jRQ;ޘO-疽Lq284}e~Cχ|tݔdvd/hٸH;d(?M:qU 5R*5v͇9J#;ojἅ>]_hYVPhmh}Y<5)],pD̓C7#9~PdR"p8'Qk{i[yfCwPzv kC_߿v9?݀_[%/2H?0hҲ|WqP/-ev/_nA>Iu{YvVfo~k~8(ǖ~&-3޷wtla;o䣩nfɇL # x-!Xט栯 uj*ɝ%C0GS$ߒ2>Lz$ߨF;[X5]Bu`W|Cޒ==}cUݤPUjْ$K)QćLsGqCKԧ='o[rRfin!K;Πdz#]vd/=AװsԼ=/wcxZm贂cG5-5FܺE~)7Y:|Jv@`!JRnK}/]݀pjOI}"S5 "펨Rj_[QmW>w4Is}u5ZTJˉM߃/]zk|ʷ=| ?,2ut݀j;d-_;Cy(`s mShjܧp%ڇ$9\+#~ڌV.IVmHmbPi;s݀Zʾc+;QODZnv~&P*7jeNqU݀?I~m{P;?lAX2˰ YF`>qŇ%[7$@V؛ƖXV{. 7E~V/軺>$d1szvNzgMԵOh 5&uPF)7IM["7܂|dO^v'Y}YxXT5PeC A~CqZChDքC8v9;|j~PER(}c}t剦>:j!>Zwz[LUOWth4Jpƭ4݀?I܋ q<~V,JDէNnd]2P4T6iQPop6<̈́ހQRѵ휼 e!&j5Ԋ+Xߦ@5Ip QC>yK9?J vk=ZuRL -h$&0SQ=hQ?35+;t>L[1C|st gȟ7l=t"g̙dawru[s[K9o\!|>M3k-; {# ?pL|RIMajɲQߞP_yq@7ූ_su? |/k;]w۫U.K& i esp GWO+#ZM>VC^()8r@je)kPʇg9FFCW~=Էfvaw^ fR}5Ov;iuuҁV}O کVuzcV9JT?蕷^gD}Fٴނ|ms|Ђ|4 s4>E;UVg4AHPu`kuk *8ug%0]w݀$8D(JvI|oݡ{P;=gʼnfMQoa )>޺;_jP) %|jr$"8az.kM^кԸv`@)i}Cojs ]*-%x:t }z.K򑿵WZ߶Ys ]AkR;t~ -ȧv7 {Yn8tewotwȻblԽXusbZjvzܪ k8t~zn&OOQuNUM-,ǟi4V}9.׵A7OD<|+:(},*sԼCJ$䣩9$udڑXK,S6c llq$clt/e||ꎎ:Կ8pv/vl:Bq5yɪPoITQT];T:dq=ބ-s -?>$^}~w.Ve st^̔[uuP~y-FM%زg- uෞUh"kZ:p9؛^3NVzwByk\Sds>efs QF%sb3X/O>V۔1@;]Rj?*d^Qf&$9%23-,nA>FPāKaS0қK@oaծmF-?l`v,7katzKr$AjԵίҽ=w'OFC޵:1#S|egz݀2KV9{͆[p@7ූz8S'N/f; ;EpP+gվ hzmu T!jZקEi`t~sÇSucKs"^ =^Gq-ׁ;P߿Ύtvc:܁Z~oǟ\mhZ}lYk!kA荷O{fxw 7zp>~kbgl ȩmD٢q}2fv8f {nԴO9؁;}TZvԀnZOQwxl1_66tIɞh QmOު hjsh!%³dJ|+wv(sߩ8Yb?C)ǯ~|v6=Su: 69[' B lC9ZVxׁ;P+c5Y4[@},f'5榫 jhc{WsFQLF t ${Г% ڀic#m-}Sy1ٯ< L)giӏW |I>+Md|Vgdעȓg$uZmZEC7v@gx-q*<喲i>tf^޿с>[nw10UCDm'ք Ojjz:c,#}#4TEP^+E{bTK8X 8F:kshkj DO,VCiZ^.ɿ&u}M_Jk׆ĵ$طZc_=%Zb/v'ǧz<;FEIF"Kvܙ0+x)Ie&q1V\psz+0*Z?7M&A :jS>mAio!8p@\|^'p`S*Ziu Q&7|\>/Ac+]a=Moz֜nuTVVnu~ߛg `/@OtfO@,^p9;0~ҮTKH)(=Sԫk8|@bZV6g܁=\o"@q|Je9/@?w 5ÏeL1ɮ%#F d!]O7to|؇Թ Oqĭ*yϠ^h|tӲ<}:mcPi/VqAxs#tVt7J>&fw{@vQ~T;&oJ>Lmkq}3/u@w{ t^%g=_rUE |ǖcrת7R>L<{>_9‡eߴc_EzIe{x.QcaQBV%6JJM՘YoQʽ"НVI~|iJQ;\UqFOɕ+~ 7~9SOSj+OZxAӊ^1|e,ÛA &5y%qlr)N ZUd]2>얲|^U~u64[]wx=;נDWZYf13mOsVԾUh`(+><7>|z h/ױ[Aw{.^bv/1s kxns |7߻g^Mpn-W]Pǯ-e#_^ԣ:݀_Z^%GOB|y5n]WajʃH#]E뿲X@7v GփUgs YMow-5 O8/-We|?w*C?ëۢH_}1hW]5]YFu`G]Y5P:/lZ&:d|š^kЪ2j=ZGpbU~__kuq iC ?j߶'PVW [6|)x̓o hKY`sܡ'S_F lJ[6RӴcvmZfRoZX6zgD/!A7ූ-dӳL+?t v [?*v*ZūQ3ֿth8$5 tPG4ǟKԪ/hx:dc[?u-o>&8Z??i4 -GSJj:|v]xCyۓ{$)ORKt< 2{ǠޘOܩ%)>ߩm$o~ª(j~}ѧe|W)B47.7owQxMT@F %@,{B\3 [bRmlZ^=SDqo g vR RoD07U$ᵕܬZ!áWҎb_|0IȦ59r ivoDH]2oS|}9;J_sI^-s};٧ 5ßGQx?Ȫ|ܮ=d[^֨}i¬!jS-OzƩ~ҹao [w(sz]+=Yo94I@CEot'r'!GSgU&/sP産MgoR'Yv= ˜`^8NX}dJ煇7.?fnɸOޠtZdv>eBtHQ$5F1a앴\6V/"nz_׊u,zA|uWix:^W9ز|_hx=12>fjZlU1Ђ|45oh-GRՌ}#qאG\QmDQLeޅx ~ôz1oqtg,Fem} O}-DL;ZqCeWye݀_[s+bM8(ז2eW?)~Ԫow?d믱q a {4ٖ|ߩ')eK Y܂|'CFVjɀJˆ9tZ;OYj0T,5}I[W'$hP(yfTk3\;ͧIpϙi٨CViZOյ9$NRZ/M~i"$Q+Ҽ6[g9aju4v>wLYE-\s`7({HQ9Twwq|h_Ԃ|45~MuP}UaˈZJOMzASw#됺ux7kn|>ȧya58i)05SsO$M}`6.zCs@qsvN'S=&'CPך-9iUSÞ rG?4R ZT;,6.n+S:xG {RPmҡ'ٸ<܊Xвi>`-oӡT6CjM<ǽ|UrȲJuowt{0wZM6st"ӡ;߯Zo)<^R>#g⻟:dޣn |;"JKՔS3gt&pM7h6A]kl{n\/cd%A:k=+í?y[\#a/~5{G&k?:sq]YYBƞs3m⳵Fw9t ݪS\Z|K??|?Abo5?\j/ǫ۶==mbم=.V1ȶʕ[v*{zD-نK ّ_\;ݭh5ݮR^\ 该n*XorBk)&VPi-U.)Z*:=R__˷^ f__UDw8Zu*-ա5S N-%TZR-ٞ abԉyZ^°JK LJ aTZ es`aRK9rF@ly?3j>2Z_ڑz@62Y_ >[:u⯽u6 #})u$-UTnPYOk ۹TZj*C}<51q{\?~رh@?$uA@DP]>Tg䀺m_+/C o!wh*"؁z}^L=Q eL@xm@0:8?avӏHbBh@3 hM?8!M9+¨ ( ^w}1TzVLƃ;y8@-Hڋr:߃Txց6<vhnf #󀺗>Y|l k9,מEgZQOZs#_[g* uwy =6u&B{1a}c {?~Ӆtcv+P\jN0~<q B]jM*"f+:cܥ D ^TY CX(_[R]yX1ʨxiDl7XW&Is#Nxmlb~ص33G jqk;KgԘ E58RlJ@*uVV3Og"Wt&Z@Hqzƿ_Y>Z$ZQڔVPmz1q7]S_8RZҳu6ԋ,nM *Rz 2dSs2|bx?^$>t3R:BbK]w lju5pjfN* lwɌ¶nMNA D49*ox~@MZZ`TS̮{@j6P^K >9(#?RPECQVo€nmN,mh9@"uc%vyD_e"r3xLy'jip@1ŲxQlAt#"\Ȥ]=F)d:F ;F,,R߿)q endstream endobj 1425 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/membrane.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1441 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1442 0 R >>>> /Length 8771 /Filter /FlateDecode >> stream x]9$n{wO9@ CPU89}?mt$A3?\??IJ_t|<u) ]u%2?zp~0P.BECysϐJ1F-H-~pfHorNcuw:g<׬=_t~B=p%˟ .g?_Ouny^]نqW>S)O,|S.||IнjG]yGG8>A\rhIDjB4؋d<'VC[U>wGJa6Nx5??*2d"x\Mk%  J?ze/w]Ѵm{KλϖZ 5v:>4-Uڸ"g0T7q߉OZh+mKed =w6zvz)3zk%Q#y;;Dks^&5UeH l>R%3'g4+ Hgδl!<ϴcڣm؂VKTc;QW +%3GXx&17ّb.AVUEL{*o=VEcMd$:/R_) ((Ʈ"+S͌DH"BbA!R4ɱ'jDp$-o6PZȤqH(<lP~3˱Hӎ:0*O/ iӵdd!_"S3f? ?12B8dWI:}DH^B&Jg]@g;:%=4QFזa7MR F_Ni-I Ḓm{ucm @yKa)$qh X2N1?0p۰:cZlǣ$ZE^`7e6O=HaH 9H]b>}I =lKNA@Jdl(jFiG0h2>{3 I^owbc: xCo(VU/P8%:1;bFuh5x )7l\vYrxXg V)7Pq\4|$B'am.DIPzͳsyc'穪}jR:}k*AMF vlR''LW֨Gە7"45Y\doҡZݜ6GI欰vpI,ɩC~E ?B 0_>snu$'l{qDC7=?`ZhSs7ͨpu4fp-!v<ũE.,H]R@1adIXh7^ $&+0YWxY9#Q@ QI.NED]DUag)YW;"eT$98}q+ս.2!֚$t;>&`@Qo1YwN:B_E >A9;|. sA=h+D~eDq  sY>V'6?r0 ~Q5yI@bmmO9E?pP΃hkQT@#A"xl7'gIX׻􈂓 "r7/gǣY֐p*bl""յBуd׽U; uh~kkXSzpi/5N-\JA{T߻*]/h^Ų6 *yA}լLퟧ|#0! y\!:׺I鱁t Ã~;휘7;2I]fvk-I>]T_=<9'°.8pOҦ1  D91vvĂ/LWL\Y\{+f:dEV6?DYYKNo=:}^ umFi9,_b$/='lP&?c[u<Xq[xϵEs{b4)b^W[_ͺ͞XI;E윆Q]]+CEg_ҩ;-DP:!pW76OpعE~H i& 󈪣ڒ"F fo6/F+Y|_I_f=qcTZ7:rMeWڭ'=bt$6%Q4;thI.|yHd;5<<քTtgv U;~®T/Gǟ\K7s< D}q c檫7hyZN yyGcC qԺ"OHCEq*[i;aR➕ hVzy0Zob AH]pکKr܆7=~ha&T !UlЈ0+nz@O,{WXn^<ǔ*U6&+p:J0ﵜ4G׊tl3'2DBD["7`Y7r>X뵙L.zvS j^P2`Gmp ? Ls~:믕dZlߗҿ%cL:_w'b1n7Bm mEtM(9IZPbFe `%рbCwlc49:}ᔡ[ʣ.Ns2 7} ܈s3=!Tj p8w7 w->5JOa t,go)kG-M44@N{H&p%[e.~5OgktqO@'an0&DՍّIWwL I^ zܥ9J5]>ْSTz>a.)+D-K4(g ^,k:FܱVϹ9D-%y ܚG-w8Eψ&.W>l_&1 g.i*fE%4״c콍%%@~ӷr?!Lr+ 4E;NS ;Ei<@2u HHqfwߢ ؤ J13ldpN+˫|13" ^VC֢,}9G!)#ȉIG4n4ޠLJPkZ/z`k4g8ƶ߯r%#yRLyRki!z E)zdk|uCd4lgHqk$ւBͪ-8$1 n啅e?-qrnΩV.Mg}%-Ll-1D^Ydұir7l 25M˝+'8:7/ CƗ}WɢDnjTtFxD|X,S>GRJ Β!*̲^MYbŜdžCRv0:b֢׵Tڧ<f|%84wvwígiyKdf$s,0ߚz0>˨с5^hRr[  6{fBfI\6(Dd_ByZ]M?{^)t#WQ=!7~Z.|F3]8+)7+!8 ӬoWGѐIAN%_ (@7lN z!@"8q9dwVDa5» 8c3rY%QxM. [Z6&%S>z۩G ^lʵz5޺:` WiX Rmݹa5~#dV%lsKO[Hr*_W90gӚXJЇ Q3LgrqFN| Ao&A$*n6=B*j (r{bO/1mcp<;ZlC Sh_~iӿJyL*ts.36RM u%8ɻtH^rlJ\#9}7p`1`hCq#xO{fG``rAcFnނZR*%ڜt]!^z sa)ԙmF(GCo2xȼ0ΰ- :Z~}5}R"al&% n ~XxD^shm޶QLK ׼bbO-Zj\(k^o*Z?r,8ϑ] %Q\PdҞ%^N?OAWثsɇY8{v5d4~٢s^k\I{+ zPR9gc='MW{}C۬m飩f_=k otd;Vi i ,ͯkQ9Q `MTh`47k^~N]ԑ L[KC"26W<ByT3NX `Xߩ8-[ݫ7nEMv:t97U=c Cf"_/w-)hYu0l,&mA}[f"kfP2EK,5sgU-k}n|c TCQn,rپBWVnzY_8Qk rg*to5Xr5~ ~ AodaCa{oe-MxWj. 5/57WUHHzyX:r#`x:P.I^nzCj|oyű{xsW-EwWЪto*9:X_OoEwGJz(neq鞄"nܾoφ5#Jjr洅=9yl i8]aM}Cp'uL.2ȑ3˟_kxkZw7})VPs Vi&9Bg|I!3~4,VuSPG:v[t^<3M|Ǜ8DYGǡ1ѲKztI]" T9lg~g>36_*95әaGFN-IlH[C?sz7cxCKNLz.3Jf5هkU/Xj[. UH CބpH>%E v`,8ZX8nlN2 5fax"5 {3i;~anȴ^;E&y^6]OME4X{Y2mŠɏ<0C8{DtIELM/SXk2jbn= _/% tYjY7CCɋ}y[7WreƯѱ NdL=ŧI!joE3[f )x6wes%{j|BwBU[y}Vn/GHc˜gUCt,=1A|K)&&I#lsnʔiͦ æb|fslDG+sh>}}$䁉 0g l8Y,Qrns!OcUsS?bRW#@~]:ܔN2A.O.yC/+ܭ@n'>*}\~R7c8?; C"Q-\|ľy_?(p~D}H!EbLKK-ۦM;)h|m2q)Xq[) Η.kbD—x͵-mCK{jno_?s R7H4BU73H>*kYK^BʦR=ܠ/wd A$Yp% Vvz!ɤ- -va-g`|Vx ;RkD1a=sEYmtQCT!+rHJt6JDUI<95x3!U]Wje-zu2sZvo{8D-KݗQ Ve!4סWkڢ)WR!ItQ Pkb9D-gд㧶(D-O%Q:]E]gm)U{jC^us9sԙ> U޾y7=g ]!%6֭W-!Ys>8$tnP?>k!9OEsj3ht2Hκ2HKYHg!5.K8&k 0{ ZwHA S㐕lӕ$rjC"[K4E&, ȚJDz54v9--G# g`>kD/:$aǡWofdL e;f>gFUkyFդ z9NC|U$WJ9lx82]+JT x"cC|2 r x5cH*˹i :Me'W&.4e!IZBsc 3ětcG\ 7[rm?i8pRdQ)hQQw]QULSQʝ;yo( X*0z_K mSEW>l '$\ bvC$l]j?tO endstream endobj 1426 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/gnumembrane.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1443 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1444 0 R >>/Font << /R8 1445 0 R>> >> /Length 89413 /Filter /FlateDecode >> stream xm֯pidZCwungN88Gn$E]+FQw7qQ> oMqB/\]̵~> ~ e8ERIPcSQoyW{Y[oxUNT>&HEhoJ[ EMM.FkڷW`щP{;E{^ |K{ΞBPÇˎyK VHn }[>=:G|A߁ԯ h<1 j/ri/w*r-wR_V~mpվ!o~!ס; Nۡ-oW$o7ɰ9A7?4qO'lSqzTI[.ojH$ or鍯? v$hot4/B,d~X'h}7pUI᫐ܷ_ːoz)}G!oO3ːB^6Ap-t)~Al!7o!ox#Ȓ-.J/}OArTo/0oϏd}u/ A !. }})!/_rM!WI#K %*~A,!7F@P@ */l< 7ryF%K(O J´M}o/˔&Bd2-K"B]p n}7KO(퍑[^'獑,B]p ʥ'tF~ |[KO |jz!jP$v n =Vuv:A{#p\zB_{-޵̣Bp -1.=79cVz%/^1^zBk_g~h@W3DLRO}}AGW3DROw@lζ|zT4]*3C ac* /\}NN* ]|1Ac7B >n/š/ar( r(ߘy >7b}cr(C!__r( 3ۧW;D >7B @b(CP7Ror9|Jor9|or9ֵ7B >7f~A9Pٽps{ \C\_mM^ r(-f(C^ r(j\ r(\ r(y @P(CPys(PPۛCZ^J|s(}|yAˡK~s(ˡ˫ ^ x+ Q//͡p[]{s(ˡЧ͡P/8Pտ1y͡P/ˡkzs(ˡ/\ r(jCPC&ofz9šP/ofQoϛC]^ Zxs(ˡ/v9|/ܼ]ҋC]Uޘy 7B 7f.8+oC!8PhC!W3D 7B̐@bhC!PhC ofv9KoK.9P5PhU 7f.\{s(ˡPB yLn.BKO. )BW/h:I{RŸB! A2 zSXNQn~S=!~QXƈN>G= sR ZA )B B?87:DR҅_Bw/@$EQG0{HxSD)1(ڻչbSƑ '_^L qΠL"z ~^<'0qnbx:AtEjx:AqN!hס3} [`uٗ{c6goxOAs0X Nl*=S{WRB;t1 C_GSDk4_Cbjo,fӘy͆;5f^x,U(bEL3oMc1|f@h°taOfZ(ߓԢz&0)/o=@TR4N:Ay+?]TWЋ7fq+6yƮwJ螇~G-vVK5"94I T(N~EOyG)K=bn]<|uetp=th@w=t+<>p=@W<?^]P1\Vxm{Oygc ? M >îks }k=B+hy]n D? ;bwc$.VyAhz Rq^D/b"eNhSQ3ydxL9^A\ "[q 4QXƎ]]&#c5#e SȌq \mF,78d\>Ξ+ug@ߥ9i;8K78 yx CQU'<,?R\x 1xDw2~pL3*l*p_/c5T3H}9{ x=%Ze ZS÷&߆"Ǘ@^jw=}4[yqfK]Z⇾&{5 X׷ N'3+g?ڥEkbrSXiR pucj{Ƶ)F_-Yq##qbG Y$7g3qeFW<-/ٌt'uwrCPqLz-Τ˅xiuXyȉwTLס-ZK Ƀǝ[QTqnX#6ty@><. Nn{طFu/[ ;>`x 3rӬϘ<8TBbknFvyD1V 0o΃U]]42| kPMNν@jwYrޒg8>X "Dσ@:䓋pX|!D[KJ=^[׏%t~yp, pƬ#dP ľ-k`ǧ+IhU˗X3et^La,^\G5ψ JtgzL rIT|8}w0jz,iX,ya}X@QYTg%e%}z{򦽵B*p]r:1*pa W0u(gKq#?'/?v' WK=3䆯v1_+,oy*݉P{,7ܜ`n~Yv~E,GyaO&BZ,'c9̧ r~p%bPOk`qC9/pO!P'To0 6Di(sh٧Pŵi[m{!6yVC7R*7M@n>^An8ۧ khOQ=Q=f٧ FJe; C3v FX^\`|@nNo Χ{>]{fh7v`,',b4 j@Ĩb~QLw30dyاWd^z؁ܐCTp/XƔ^l nC;6=F^,o1 /~ ,|#J`#y3W _]:i ҳ A=]j Ι q7i%sұi6og0Dg(7h\7ƴi-|Zi9O0g(7)^v PΧ鞑ShjC+!ZSɺ3}yTs>TCdqh7lg亰7P[EЩNAH m*MqCN JW&t~hۗU]T/z1W]  t6Ps}b]G:F}#[;t'2]: ati()l2:Uݦ9Ȧg;gNGu.gtMbt·ΰ }3}t횊tv]ot0 Jjtzl9]jzތ tsuM6;;5eN!Tӏzg낈-z^JҁCnzNe@t#Fu頛;Z tΈ(FWU' ;[ulM(WI̛%M蝟Tdyz@y2+t9#]%ϳ(9s :S鿆wt/'L^z8{m1ϻ#v9MwmӜյNufŜt_ &/[G-szt =΀5ia9覧r :):s r fdQwN"Y^;hTN&tGΘfFUw ~;)PْN2Cr'⥫-ʡ*6,9ho>:qkntXyxtNyſ6@G`gb/. =L7z^ Ag<,ħB+!n⋜3MKJƛ:z֢EY qB+!n =",$.xB B:5_l7 z^/V 6230tz=DʵI|KB+̺Yp B:ӍL|Esvm.) =@2="-l/e,oÝOy@g9RJo҄WbŜ$x^roƍ`$Jz1sm(/:0*3 {s֑z^ o\^,]3 c@->KFh]\/eۍ7ý =/ۍ]|Rσh& HYy!$nEA4ȏ䥞L礚 K%MgUy7ͦμ~-̰L!%ռNg:6ҙWk(y%'ۙ7_1Vy̵g|μ۸3}WK5/عft1K5/Wۙj|μvm3g;f7tK5<3ocx/y@g :Kxۙ71l^y%9,h;&Ig^lm&tG: %?ҙWmX @&yWByktq@*y͜6y]J^}rmRt3o̜5!CDD::y g^D3oFhK9٧IgЙμӄ3oZ[ș4J#mgҙw-+μ ?RtCЂ3/ۙwptb0J$μ,T3Ku0tM!34u t&g, 3@R9nae+ZκXVQ<3y 3/-p#y^[y(Ig^sS vm $o L!gdьy/TƵs̛@\(^6rm%HAR3yY 2)y3W]X"E?XLݒs.f }9vMM< 3y ҙW!I\tUlg{pUHog+ ҙW!˝M 3B;V)әx:әȨ_Ĝ:ybZ^}Q#y& <ҙWb;&0 -L#ƘR:y\qҙW+DxFgu)vm4.` -3Aۙa'y@f:&6j -_O3oVu&f8ˆcnFmFr zbf-t *v636:~?P\o&>e8r^ jgIcF5>Ϻf _bڀ[]EgomC(.%6bB.脦kotu:W1D۹7X`b x -lL/+0Hʚ% C)$±^!l.hAQ-Wߐ. ȚMRU͕ ( ٪dw^$dYcy3Pz_(AywnY.$$2huyò yg9JH} .fPMWv~,\I<ch8$$m׀ 0|Az"YF߸ei9}M7n>>#h*;O/w_r~ 7^߫Fw}L̮~׿OGϿe}B,!}׿_yZz]N , WvاSuq գ&h9{}z4~#Û=r,VO٧qi:}Z_OOwh=m գh}:2KUnui]>_OiؙO^mbvGez4~ܣdGYڭbvJ[}}j}&h/w`xjX*4¿YS? 0#z^h@W-k@~%6 _nOZ˟4ͭ/ܧo/@Σz0k+v*chrFyqY 봟VÏeŽ^4 y̒Ajc[~HDΐ[~Y>s"Lp؃~cO-?`>ư4}MQB>m<][6Mr'}>оqD:@_Z^wW z3BJz3N`[B' ru0C?%~\b?w1Z6)_ )o΋Ax:%H}wz28G05DA~wÿ@cȹDKWipx Ⲑ:ʽWᏺ1IM.q݅~ U; e,:+B|䲫)ar@W / [o?fk>j΅ lhoJS -y[dd@rN< 4#9b%pN9doڎmKa۟=3D;/*d __s;|pYP.}1'=׿- MŲ;nwi-UvibJU~E==ߡtJw40cv\%ѱ%W,t*?,yr,Bɠ²A',KCo*9Œd"ste&K,}CrN`BA #˲PrKt 쇨0ҹD)=`Et`Y'b,9cJFefn/ n:.{N[ ~ k10g&%~,awSV;M2$E } 4]) j;d [|Zlvi5a{}o?4C WX|ff|;23 7]&dv9T^?CԩJo;-ZR? X̭^xʉ,$-1 Cʮy돵4F>c0,UT 7<+V?"Hf:Sk5 O YmQVjuR2|anu .cmh<}{=d0sp!zuհ@Ma ؚ J;p?aƕbռX+h1 x>q_5a:hi w'aVÁqp;e-`41Y؏EPyN!zX>/-f͓.P0 ES3wy v!4A;PrnyKJ118Iy<1N}JXO&4w)O+/zgLt8>V@o^/P0>kN&:R4> 4#BԲ\{]= ,T~ZA icC穄AX匦7H4߀`oqQ(Y(7:4-}vh| DCS':1d+o' doCUZ;Ww6O x]{KȠ-?ZI{,\ȲX1&ZK,$ 4c: w, pl֯0m`֏9QYT 3nR1vwCgߘoV^;eREEi;w|l@_%Lܭq-uIüU?2ĵ7x3=8QX2ўJ+ڧ?.'ևA@֕FIYowU1\?UlWo%FW,d4:c.hgW~v)i폽>f繴\WU4}:F[-Ij4igʬdW<^_E˴.&\[,a.'j!uiZ$,uMPeء0q6ν!&ދ D=},ri#?T u\`a?Ҋf"ۼ275p*}l;f#D'u}Tٌ]<í6z*WݒjA=d`˛2@'ʭ0xxIԻ4Q.yk}%,z>x4ʨGUq"nP|sS֘:9[Wϔ9fǓTyioZ7vd?h#jP'&`<֎zlBXÏ>B[7GCcL=#!zy`>Y9c #Vfl6 fxz ݱwsQ }/M(9;c}otQ)GJM|jYKvɾg'J9! Eȩ6[G;}J}a\۴Ն8m| 4-7 mW|obh ?$8OˍpTSZb1*mץ#*Tas3`E2KFol/ke7љOFO#XI8I&^},]#8#뉳Ppv2#vռ!\UDF>V'ڣYZ3{wc=P4yKDTVsSG#('y ImZqoBj1NǡX}xko%\_#/ }^'=9 %#qq.?ʴ ,*qY݈Sێbp6-ϣq Zf$ȏ=S֛٥^ch!tIJX3`II'Ui͐\dEx9 0jj)ۙ~> FCqZI?JH[4&:40@hO>0 !%? u=n(I 1q~eb+1?j-p9@Md)ؤĨqJL7$JL6z+rNCxF]#RWϔi/g&Y|a|0f,r~a7R 䔝9Ha&qe;߀6br^ũe|҃D6KǙ#C$,n F|CT"RB[b#H+۔n眱r,"(Tɜ E}=̑Ppc~V0/ b|TF"ΒF*ɭ֎ jg3@CZ9@+GSCgCJ_^dz,.c _t;̃۟UT{" ~wSC]V t|$kP卵̲`~MwY ϥَ1CJ?Ai2WG&|ϔ]JqXKk#4Fe3wgv}"͚WOu"i;ln/ztOSnQz-npz%ք*P)خ6 ~i\ش¾KGn-V 3_5-my"Uf蕑W;THL-0]Es#(3A9\̄46!PԹW͚sK5ͤo'eNJC^'wr$׃ ^+8>׀#mHʰtH˃mVNGCb@#_jܷZJtb[ـM$ϳw4 m^z3ǼrpL̍f犮5+i!K Hʮ2.a◢ѱ̼AÏ VcF@h6-W"#w̯0ff7)#8:gok״-yMk<=AgUIփWWsfپFfG@jْxq:Zxi HXO#7 \8iƸw0] {tF>(o;Y Js#5!޳1qYֈ`~|F主в|vfCLh>|\f-W;J&iki ȸ_J^$dIu Ն{V|B4 ę;m`I7g?~%o *-+8y8ŕ m-Tt(/;#rۄpEbZհ$1oZcr0 >G 7^zR35J%x=D2½b=KxMc!IilyqȴAcf%u"g(/aǰthIicF};+#eȌ;/?Y}h{|IOmo|FZѭ? Y?e,kL qy}jml|v9 9.l!;AIiǛ}{\`Ļzޘ-<%Ӆ{eb}&$Z`m>"£M6b<$3=)5/"#d)|ғ%zOJD{/ K GF8+q;wU _ QU&.ÇӺ@K eUB(֜S]=%cy)1 tb,ٶvkf]̐DԯCRkԬ\U}_k&,CAxDX#l0kIcOty#E A9SѰHͯƜx5{Nh#tۊbB2QsW6<넦'ґJ릸3]^j>[P߮^XJԏ19 ^'ߘ{=+8~0xQMiTuu|m RݼYmL+57QjQ=QTH8#XC͠+#Eq~VHP$jQNn d^~^ oSٞ=ai;թxv|6ЌGtj\ZB88G~eN3);Mgmz!J.~ YFwAAF@f]kH]3}>v:2{ sl43bu6g:< ݴ[5&<Ϸ 8\ VMLO>5άi0kѧ;`r16 (/^2>2g\{ILzCYi<ҝ^|R7Ϲc0uQ'M{k`Sse.lW0HZMk7NUwBnGg>)2yG,l!<֦.MָRrb@:U.= 39W޾V%ĸv#t\ഠdFqʞ#|>?9 bm#ԈYϸe#hiKhe(< <jE\Oebn?Ҋ.Iv!\ej+E6Zc3tӝlTJgUx7gc\E{ h}W5ᏏX'7~ rD vqaL 蕞"ͱ>EdJMY9܂*<'-eeAمg]-1+VV7`Z~%;?[X:&ue-rjFO =Z]Jj43L X2PI ߒ7q۟ 1̞qq^ q0 0*&@*/T^2K1_J`u2+Ҭd3ʳ=<[X{9pK;jC;xE||5^4Zc¨i7V;WNQZ{9KxC8z ^!4#-'s`y3zHqƣx|U$g oʵq|ߨ\1_ NM7߹`g7.ƈJܙVW]1 ۓed9^\%ғtnة=!=>|IP$KSfdulK5$*{nM9V;*\UoًD͆v2_wttgk'tZcu k3B6#CV)|a'ٌT෵ԖuGjiH'I8lH]nϮ?#βO=oNDju7Žx'oW9YG+kS#G7<9&_t1v#$YP\?=pj =)Zd,wܟPF;TeV:"0c˦a' {N-LdF@xޢ,h'Z)mg&ww `]XmKLl:x{u$D>\ q&J+.z3@:5+ݷ%E[ E9Q3aW{Hx|F@ڛ2@EE}D_c=~x9VaOPx`f$`vҍo$0?AS0U tNWƾCo )V} ><J9aQ5&Qnfye%9zX/No=`} A- ccocb]nu%OD cbH^CvtWW#;$%{Xy_HFQy?4+$.3fW/o$_g#݀҉r@i}n'y>;;*bems/%LϓqU-/\'M $J1c%P1IA#Y*Xve{SF* &OŇK xbllc˙No=dUֻn Hb7~RV%|19)EwvBi>A pi~\ۂ7QR2Q+4$)nH.~W7b1Ә^fU/=@|-aNSE,; c{j*.4a񸝟w !\Z]k Xgr\MW @l2óyDta$gIx &&=ЦIoϠ0]%iNO 0c3e=Ym9an&x{e&me8oI#WL11hIym•-ԙrx)~Z 7p?G#oYy}K >$7d$D__PqS]2P}L`)pZ2꾠v'FI36'NN/'vK@J'M\.vM“>5m0~E3,Y㇮1,ˊ]hЏEmUCł6몜 iuJi?Iw;2>FY<U+VIR \+! CJՀUxCPWXPO* @UJY0 Oc̅bs䰂-*"<(+nFR+O֕OEf:FG9 CGA9 CHN źXK*&R> ǒ@ ɕ[lS)ώ#9Hն a'4E ph1JtggZi+upN^v*W#wf4:f}N73;A=kZ󨬉DԲULptD*uA7bJmF6z)B&cU D :.pa v&7Rx&FQ JW%XId۟C- /jHʞmWH b "B@zF VypGqL[=M ƹUH3L^iKd^"qJK%5fJ0  }ȞV=n"{AHi ZXFujs>Kҹʨpdn^hְnQ1igP@`[ H3T~u3hXEi&Zd(nCPX a}IIO_ͮulzL~{ JD e{s1j?ֲ?ӫ&]Y ZjשY#7]^֞BIr/͵>[2K&B|,";'!6@rs 7CD`k:"l\V !j48R*&FTdu b Ak]id 1bE.`X%zJDd "7Ytxt[n"P!pYbSٝd"(E&@>@Lܝƍtn/q#)uCzSCx]<}:¦cxE[ =Jȵ'*{}Cza^⽷(,l ]c#syl.;wAwqyhܿH5<CBàx/ævS JdejEkV/)!T} R B8Tgl& ؄W/7UN%߭.L3e|*v-'EU,H%D.pE Hؠ*'8*?=зzveGBe|dbH@Csw@AsW Us"G ngR$_wgbt\'?)Tdne.Fasa|Nc;黗vo>Ij14=t4@8 ;䦀'Y'g= %^Tx }313j#7zuSߊ @,|Sui)"S|fcز#סoQ E:ّ.. HyO sm @weěkth_ z_tkKKH~$v"^F䣤 nWrȱ05a1䲀w)4'{$aA,' 7r8I|h^;ItB@资(${h; IRC蕄2e!d6wG3\Wx:+2 ?h<lyF〙_}lCT}+  |%8zo9ΜF!y}N~vBq+"?īkR%Px&5IKi)1&?*~t!k9(X CcQ*u>h:yFlttTB_. ۄ76\'Z=Kp(g( dA3,;-0; `I&ށb:#J-L<i̹L0,i =s='Gg [[1 ȊTl:hU1I۫Kk2[Uc{fk=~;Z뽓ΖXٛ'<쟣5qC,Z;iwE2i˧.>RE'UՆ=\c2_", 8Ng5\b΍UX\ ʧTl^[.PR B bnDa$7*4G$IZ?IGh:P R[d 9*FQ$RogbT ir*8|2JG$[F d7٥j5$DԹW7T7ܵ..z*g$mP]?0 -[-plSQml6#S-.q˦!ݖZ|&/,0TNx~Oe\$p_S3wD9Yg ,;Ǚ!3%; 1M62<~Vz0gTD^>x ,m^6Ħ M.uXʌEX*-i;UqL^פ3 Ht^x.N.'YYz7=VRI .q\IKlf ?)H{=QRCT j6۳JQqƆ0HU­[iQY} c)p.F>:{eaAA-ghle;'qjOxlKy}"рxΏ!z:54xJ `J7C!x xOEXQVtV# }k x?g? 39*i ^早q}WW=nw撧nMgPK{T< \|KX@Rp}4E:N2Y`Oݬ90;gqi}F_srh>鳘m{P;3$;83|m\U7"RCۧĨ{1\{,D=V%L{}5+Q>XwXDeOD90ˎ h?\an9qg 7!_O#s}ega>b)`? ;Ժrѝ@< Nk-2 Ak d;#^W=]SsN(f񾥹s>̵STǕcYQ6a+l\o!?m;ғ'`SҍjVVRjޤ,Q9_rVU?V9IeGf#x&1eyJѪ/&ƨ3#ȠWvu$O@'Cr|z,kƫ'0-qi:{rU_C$_0u=9@a& B|zҷ ;obna*/|Z@*?/ bpa]{ƪ`!Ծc''D@R9"9E y{lt] f*x~jɘ8c$uΛ*Q/'<;N piJ`ʙbX0UX?>kKF̯^}7T!q-A+DeWy>t4Pm~ /a9⦰eO Vof&F3u\" DihO]PU/6Gص*x@>eFxB[7C>3s7~:,xښhp0KfK@+ 44rm&y<'t]lM! /C>*RPTr <^u3VI Dh^5S|m?zğcH;u4O5@>uWZ3OHT.S;!k)^eR2Ƶ*b w,)x7z";.rU>GU~K&o'ڍV Mf?jLsnT}#8-ڇ˻7Ln1{6[@f0XDdBW9ո0'zW}:sExY%aKx^rlڇѪ]DFOr }JH9<͏LyJ itZdC3sUuLv-u_sSE]]")e|OOCܒY1Iy hԬU_4| i֏a q3 m'Q$[dp|+#ȷyZ+3h [yrm1^_30Q>!_ kr an07'4z\+T ,;j~cU A1w^ ăIiZσZ!}>eټ]s z%vbr.B͏5,($+U)\fZ0? ]*Ϋ12|4m@ tZ&A!C0rRQQ^C9б-v (Q,! (FO jL'@ Q@j5`(Cb!dӈ!a̮յ/Sa S g'~9(A Z}J݂!WB<)S`]W91$Qo3c"w,;VbrC0yɢx *%y"x1AJJ2Tc7&Ǫq'dW{'yuo`][ϙ$`ߍ )/mF5`#AVAh`|V+˰XmhbGE5-drk8͝"j]>y_B$R ~ Ͽqzh@)b*Wch1}@ȠڷNTFFi{zdy\lIRy$$@B? @/e2C1N Ő9yIdrlu HNNp:8~@75@~lz}u`e⸮>sVfUO>tg]D6$Idc$T<e 4w0{,18kM\9H4A y?ˡw*Le8ӧ%*P80Фi;<+qmޜ?nv5/=PlUl֭o lo ;ÊԸкFm>#TW꦳Ful]~Xf FGH&`SqTL^RY9>q;m}v&sW4RgA]h k[u(,<]6?+, 랯憕gNe3pP3<#)zf$QV+p[a/qNw^#9kDv4яJ.KuGyjǐ.+P]ÝZAy4 l .l& y!D ϊ@uAUnH0CIW-;І40:b%Adڢju[c;@~ nUF9Sv69`i'l6kg\|P!-ڞ^<6P412-T ds*} i$uar iQg0]oR#5izS2[Rx"rs]{.KX駲'%{: {נZii>3Lp܅5-,kjSNBv"EKr/Wclsn-"-z}O_';uNSIIw%D5$=cDeLv <CAYqKHf/c)N&(^ǏD{V/LՃN.~y)aPt|DI ] uݜkL\Ly)+O'/^:6~A@VσzWz##].Iq~"GP_8w//!dFŗG @=Ln->^Ѣ0:a]NI783یa|Ven"|)0084bvVA B\t\28 v!!gcC0;({F~uKdŐ&/NG{@2d-DG>QH-hl`}R#&}F^Ld[YyD[׉4o\6Sr`wg^Yߚ1KZa@xQ!n89fG9ҞLj y < RqN`,g(x*㲆[ `.&˭2K&|?EB|:QzW0 \fhƵy ii~% gvĻWb W{E*9ϒA(I|&02: LF_&cmB>6X 9ay6ö>&5/raћ΁r+!5zoy+F:LTˮ h(]4su 0sm[ޅ5ղg( f&l,\g-\[sM90P˶Vs'2.D VWkGe;6Zhf V~/̩M#l#Shڛu)B_IaYӂY]W6l8؀teL~Zg_ru$s\[=52A 2},=8W4s&pdUZ\e)S| @uC4KYm83 ~,6 OWP uiAV?/\( \r3 hmܷdLdQu˾cϒWOPzJ# ^3^~g^OȓlV .>jcI2|鯵eߝ<O m]-kEyr}3Zz%:xow扽政kVzT#VZ7&; wmxֿp683 %m[ۖ+ldJcѶ{m:}3T/R^Ci]>!g(%5Gy9VX0 N լv-o\@ kIFxYH )ʁPA6ϸF/Qc&yz^Mzmќ9y{+vuWk7Ccu$RK:m{dGuYWz=KǻmrE$>|쯞Y? ENW sM70|հ`oh0%w *(ҿ~ZCr8`F/s`4̈́|vM_ׂ+ʔv L0ǛAqhb[3h ui[)X{G5&'-wg@ÿ+$ͯKwo?Wpa  R/wǎ<6#*}ɇ؋־uM[bXjǁt׷9qhs'Lo"; ܍͔pq +ys[R$rUF;fuuh (*mkvl8*-DoD:nFje8q,m'p޵:mmrNPNl jը.JN;;ZLLEEհ`?v,Iv(kG[M[yYyWx8_f</_us-Fwmy_9W﫱pG\^h1gM?C ձ8+* |L[_WcƵ3+`ג ܳ`Fٕ9 ??dVE%'x?2v}o:ap֗bKlpine1jZ1纛SrnΡg>j+Uij%ڶW+wF/{V{^K*'?n9b_=ESC{JKc4LA]Wh"+?8˅I.*jZp[}7ݲGǤQa{ Z4|ۿ!U?/X ˅ۀ @GYR)[zb6#}b{E\MO+z _mo ߪ[vcQ֘CS5϶ Q'v=p)VӢ-ѩ'TP )HN!b="Z\p FdlWζµ{^p%vgh468fu2-q=ULӆitO2>WSyuZN"㨰hnƩ] ydcisVj(*3ڝ4ձ6ycfʞ/r: ]Sq0u%q} au3{#f9~_^ _?7jॷWV[^;[`zQ驱w͉r~/hZmP= 3#JaVvs]0G#\as 8nlQs9P"{.|Wk]e~=TN读*cKw/ۋ^\]yNy)?]c9jD#Qk ܛO}`P,r]ʻ&1j-tQ&1ZʯmmjGur7᭲U~]w2)~yqpgߦshJ[u"Z$s e܁XN@d#np )^߿{.3ka;)pț4 d=H]^NFpYRw8 .!wthYq>b/t ai5+q= )i(_?ZHrj3=\U^FЙku=;Y C!уy>-Ե˅+Ҵ E0Y u6Xu{LE'] s#j{ы]m 8 *p%E?f3P$SAƷLWsSoV'#3p5߉4ۉg-Z]Su9f p1yuznm;}dX8;7 F(0 H0_T5QcL!e*&\fG)V]6Cؾq[ZEnTLjHEa OxP Wh)zNPGdbdϹ=gyX. к#:ztzW<)UJf=/xϓJW]"*:@/DЂɢ0Nhf~o[8^}ZI9)~ >C#,? 4KQ_((5~8(5\ AQa0ęP+oڋC5Lrr CxFE3Élu1$uB 4FEwWN'!4:ni k^|ʬ BMf+h~=yf/cID˙=v7'0k?$fx4CBss+hF˾7N( 1 w(!>Xb.{:?Mv,}j~Mp;Ӟ.[Ng9+x;}t*ŷz܍M!1 "NhfƱz7iC='>#C^m#h!d`+~fQytM#v| Sh.r+A$4XqV3s:U=ξGK5'֩f֟xc}ÊI Ghb^kМʵФ7Ymq0`Tci ?4!G !==⫦_)Mq|\lWU cb R0˜XFG 'lo͝,ao}hN_>;-Db ggBBbg>WQxs .{Cb0tY3œ^)PYX>f1%)b^Ԍ1֨2{ћY |,IM|0z˟9KM~܄(a7afn-ref-Gq `~DCH SCb؜DE=l:@i!Q?mE:bnLN(~,c< q4r~fh5& T6z*!ҾkdЃytMц`WqFV}F5+(Xvo|M<_~BdU:k̗ߋzoQ>2gu3(H:gZLM3"!Xѳdqj0[?z:BR8/1"~5#R DXg\/ /_9ԑx򛮓gڷIeUhP"\w4"_J#;x6̄?r HVfJ׃n!7#7Y>Fȑ[YNضX܇XCҮ=7gZqoIW P;$!x~.ڊvW^%ǁJ Rb7aBHv,'.K[mZ/« ~_Tp -U(9JIdZ}vw琚:S?" [}{vD8~d©;^o}){`=@Zz& TLC[%Ʉ`^1a:\k D^ynU|.?e1cH#|N5->v]U ;[B,ǡN/7^B88nsة?^΅Av9c!5V2UO뼀%V`v (@\B. P rZޠk~[AرS>\zC <`o|B2ajm4ϧLr),&QCBM^$sOW'}r/zx'=yH>GS R7X?> ǪߋG=s 9`Q&J1#gd<a_6,@xPPWFujK*WF|Dǹ/ \ZWj[ m߬Rjˆ* `u9#\]W cLMf+Tp]u~e;fjT. A -.g sj!@4h ~ˀ,\G#e\}k¸؀? F)0:JUqQ45D0>1cv6CM&7k#&̊m!;h!Hc%}.BÞdܭz^ZK!ѭyk:ѹq`uAPN9s8j5Wu(=\ϐ?a"o-fZOg3`@ @>doxp_h#,b{l==wvxcL<47) ?gcC2->Cnנ߄c-\hlnWJ@.,s'}(mS'ʞr)>gEGN{/}wJvk-|w8X{3a@Z{Yڗز~yzwwT\vmE!m"BhiیӲ,4i֏ t_Ih +1Jz'S2b/PJ !hRA '&YS;yXb%ul~g8t$Tۑ_cbz@O}H^;ؤmV5S"mg+6y|`O=O,(IOr>pI\}U4Q)013,oHխ",N=[&gI`SQNPjӜ&;~eKǔ:qQNnC<*P"f7Yr!d!`3'gh[3P%}|Qt!e("ryy~(O}CL{M7т_wA晚7-V@3#Ŭ5>X@|&T}7WqjQer"_A4셞-"vM<7)k4WI/_3rջ v26-b(vgU݆-¬}g sٗI&f* $Wsiyيrlxʻ9-[T靺 e-%<횽mzNo;~4s( Z}]D|W&=Z(aU ~S dm!PTAE9i}%]Sc<v!J tGajq쫗Y )QT.h{`5`L0,=(=d%6 #v36G+ut`2b8EaY.Ê1hB}ͺ*>j19p?9`W4Ybn^^龃=jus\F-Fr;r_gD\wTv3lпv< XvTC b)!A10%ç:'HN+.).OXiPOTLӟ %'7suשgѩ)85BwEbd|/0QNX/~,5ODQ:,sIzwe偭9Ӽ-tAŽ퉮X!?_DroCi< `74B0M1Pm(U|QڕVc%iB]i5jzf]I{5+۴ eUҩߥ{}}Bu|ЇjEύJe+f'|47q활FrСӈkkS`r8>_ѳJO?j=%tn *lzbs`8dow[O^=7X"OI钻X%},M, (i0W;bW{xE0 ؿ'C Ё)EPWd@ ^`ou3Ps250xt<#w ҫ@0ʓOw 7.9aJYcwx.X94൲pxn,@e,d\ )p{$=8ZDzIVI2D"7Ign[y|Yj!Qu꼧O edEO$CB_9ۄ- iw"=&jf5VjT;n3a>*LT_,ɣΞEA~P,edza jkC`ELBt,HG3J0 HBcsns]P];oя!0mj dK.ڔyBHhf5d$\*aIErv1G %V(ё@ ra9_0\X+q~jOl x;n? aR wog˷#~9% Pl[y)=NE9izS*_K #V][U*댲H{hΞUXkG)㍥)aSK#O (o] Gmy3-\s[ ^G$](B1Q؊'Md~i(Lan_Vǜ+ݮ  "uX$ /a} sZ޽Hc #}kmyTl30&~3|:z+鮙M&V^ך\zy/uElEu5Ps °N}o6[}5 r6_5'{iq׹S43oh ۸"*D+UJa%֔vL)%.5H{+Ҿpt>yUۑoj#aB.rAh㴼F`ԮŖKRO'b^VJٲSq.9@bk78t1ϵqt3͂16sY!$PดnG @@ 5,kh`v4oȳlYWdxhQ؂*-jFoSa篵^};f W?CUKP((wZ|v +oTq:^ڞP y=Ev*~ h[+JںRb1DʂgKu(_FK3M>j0|7G98Af]Vy%/( Cs 9U6'FL9o&,H bx$C3r{CeoZ|qy  ["f"Hc=KL2ϛʮ/zbkn;k9iZ|@ޜg\U~ k:f5k~9߶6Dsb 6olX1PwO{7J?hnB{oG>_pB1y 'OO8¼KE+^HAnQ&(l=T6 =RCgxȍy6/*bu:$Wk޷V̻d6zd4}#W^a@8v=;…/zsP.tW~%d=g"^ |A\MH@actWggL˓1iuzKO7a-O;mVJev[FG]ULv~~"7]of2-?H[>@j{Χ&a?Ϸψ@=M_>s|nRw>/<`fhzGNfh۫H{U[l_3Χހ5[LGgP+]WJ;y"*RR.~b>8?Iw+j3]axv4ÖgH5sX؋`ﭿTlОuܻj8s<{힃$&kY)HCH) 16XR{ؾ/rOifm&Y $Q~qhjeݢ-뗇ZhOs(*Ƚ) }^Nyvgt =O/rilibN2P>1,0Tu;0_ ~xmjD}*}Wժ|h @;%8?q;>nzTT:LkS7>O3U >CW>h rũaz5ED*mr} H'p>sܠ|mU_ /a-yNo GWCE37ڭNn u,>2jkٌĉawB9LӪĊ-Dڭ7^zLC0 N0aW !7 k{@CH& Ra+0նȴpu hZrn]iBy5?֪_"dh\֔f93ӌLudeO.lẗfy5Ysz{gLPCIpQ}yul=Y}'wUL4dogOݛ->5iƷw3~޷a>Z}.RGzȭƋvKȫHBTpOAZfc5E}Qg_tV1bV`M#ls=uKŷͨ%6&gMOOҭmY`Kb\d!=gy_K4zz8\VS('U<}t4)9YL |6ôBMW#36vS$ 8( 1Ui>F;G. ui55םCc pP :x>JwJ߷z6,{yoF"ס,&RG92g񥰄mKi6W>xW;us3>X:{%ʌy?[v!{`8y/[' ePA]1:g8Vn#+ >@Kl;!%8KsK0+zȘ=dqW>,lŭ6Y>OsaOD$ N~aꃃ ;rBuFF[-u+@<ƇL 5>0"'j/|]uo\|SAG8i7ތ (Ex;M$hHYD"VY DxC IrfDWf_~fQYFu0`1Gv@1 SKntB'w/: TePU5m~)hP|ZjZFB/xЬk uIjl佑v@E2چ7R}𓜇N}OC uExfQ8#'YύvkDVyny< c̨vm53 i2ܚ.Gg|͐JwwRm9e^B[fn?(E󨡃, ]7ϥo<$NY&. g"ԗfFBїfcEBłmB'yS6)oߥ1V щ9ɻ1^,TpDuj$(FuJTG<`S\M֚~[?8zƝo\iFũ;GАi$}Mik9us tqdձHFCpl u-f+>2JQ24<$}q>GLDOm9#ipe6W1/>s"h=̳-<ͬ*Iab>s),ZqA\X vȵ?)mvb*PbgY륥g?)<,qG3˾7SDOĸAL"޸ )NPܬzGpI*&{e  9z".xaNfL4Kqeb= 2OxE&% {\& WG1] 9`NUFg>>fЅ'2YJ2fes6YNsX&t^eQ&0X&G :"ӗy{R۷UxA }ʪ]c%v狻&KhmfLS{t[Fݿ0ba7cReifgā-ctf~4Z?%}me}JGOV4*MD6rEi暽$td39Et,X(>lFs J1L Wzl/ ٌXeb@dKY8h`r&ѺS 3f@M +0'&OCc]O<9JnX 3(VW !(L aeH}K c ,EMSXjkOʢN)Wܯa~ aFr81^w]myZ^!fCt>g N؃P!{6/駣<yKSri&t?FA3XO ) gC3lh(AgAybr5@tX LZRa"$ pϯ 3Z^ | =82ըgQ]g7:S*e0ޘ{nM;4[RkuGgyQ~=G7wKr:tkOov5d;)S8}/ǵ&6sce#dH:R$>.n1i%<ⳏsg^ a#4պ'F+6Z nawdضjm/VOz:4}VՏjri/T>GY>xkfٯa&(_&m)qBP_A 8!:\3!!Q1U+dPs Կms=@:-;@BJ4 "/0hD4^M #Rft:N1TuK̨tQ  y1J;Ffst뱵Xv&{[D̺,/XGVQ(nBM堦>B~VC3Cd (xCW)(U7b /f FuMpD/ԵHa>X+4lS~ƙxFs6 m"KceA4,灵orGs$ShHm0 qmEFdos8"%?D󛘩x@;.]*i%i g_2;ȄmLHe&(儏hNփ³/YΔ+fPu?#51Dbb'ۜ)5NN1ϊ5p=I(" \#s8'q&>HjFMFnۘI%d,#\Gū r]O`:~S&Uilt(8~jHgp|v P;Zؔiű#lHs*}J(< UI8P8٬Gy'a8)!Cu4m 9i 1Ux a_,۴ !6WHxngJX8"/ [gx710T`ZBw%r6[0%x-Gm0/D$N!h5tcAޙ9/g9r?Tյ@nZ-k%hg2(e5nf9W<>+>Y7VaVi(ƪ OOf #⨶SL&Zپx0OMXۊ=_s/gp=A T};Kq8no ,f.,wCx8S*%'ڵIqYFUf!kZ} ni^ZğgAl1Xa)t@{.䏗ey_5jr.f:V*N,(-P*1~6k`!0d3D2!YfƱ<7j 9RLQV]jDML5~+DJ;1NVL^71/bdj~ q=%t}&ZQ S,HkF"]\00lCŁ}VM8 ]iFy«A賱ӊn \6N1!5g\%iJ\da߈/y !/ 鞭d} |?/뭖9!El~ntIkcS8Fhh+X8:j޺HlP+bZ0LbdLgdؕBv`{ cےv=mJJN*Z,br~H,s7jl^vPI^/+9VEų=V4#'ΊfW?o9(=w۵S|/2c80K,iaѶIVzŐggl<ޣPwfD܊泚9F56R)6AE@ E؆-]غiU* =񯽗A)/mX㵡yށou3 ׾m>CVG7;Q n r,Dr(w&6,#7e1fS9~彍WL^ގ͝A2Qg@@j#X(Іrx嫡1`U lAgf]mͻJ QͼCbIkblHx .6 }׬߉Lkl=tk#4aTW-nR $ $&-tnhOݎ@pBV)UZ-9xؓ?ٗxPh6[mrEnT^^9alQ90 QEаN ze~.? +M!`t!0=2ľL֖ ۰aB7_S&AP4Nw[T6=%pۤgq>Dń;9Y2}.aH'5SP:%-RV(r˻}쑻շcnG$ذ~xw&֒­؆2jDli# JQ/~:(>J2FTqV]+ĆRlD:;t6[ sCbBB7>{ggO©Nw2T p%0;G45<AlZ.PB&²n# F6PHG`p7-7gr>gp~[ yg՜x\*w&sS<fa)]8Xw$$1c7ÿ&)67(A6dpِq`8:x.P/ə gEdg4"2 E#&`)F|Z !micVdV*y#V``@_OwSeB†yIa$ldȘ\%+`lؾ+g9N IQ.-uYNQ{,H n @8H|*G$̅ TE6:H\|Vq>.pHɅfti{FY7{"d`sjrU6l: -sX}f`[.vQJ{;]I)BvNdۅm6]J|4jIM43ݏ.py۟ LI;-X篟`;?3 D^p䒌c*o5e&YF蜩~FVEy@Gv ;I=58(AGG͸`hз_=|En-]_}pW y-PA3#+xä8|"Y^E2oI F^yc>}',Y伩e'LFx+a;I[ `j-,/NÁ ,O-pcz=|C1ߡjU4N 4-NuiHjm0#d6 %io>`+N)\{[)+9Js ^|U[az0nUX7& p(l̺u]"2 "?E57mJEizpk-a|bPC+1é@DUhgm>1Ɇi}ffi捈Pȯ1j8I{5TmIrFʄY(rYqZAi70Y ""2v2-l2Jq-!'2,L8gydCeL!6\ ݻtko`q3t۶vJ llVvD7ݳ)Oo#*_[JiT6s2J6o iHa.i+INoxzyU8 .nX_߾J{qb֔^CϚphmv3FqcLgBoMxƴQR%V8@ 9:@6/;@١L@Cִi1U$鯓YYYZQ{{Ou Ѓݶx 1T~[)*Rns$ԙnOh۰}صg$Lmں')wO pG_Su:u`GR &i+ nQ`eK ɣtb0b"jSUc6F rlQ *8  _pI9bQMRϙbnW>Y- I`g`TFI,EX: dGfZjZ?M^ @=0J cJojWƉebWķN\p~7-3nz"}%.K|z?2 XX $R;l65g| ~ԦVi皉|ZG~'&88i_003޶c60WqQ9GV]w" ]ElЎ,g o2K0L9T+X1!DҲ8^Wce6H&i3y@CJ #BQM7,lQPҝ0v ?:s=E_̤kOCƪ> $=H!%Jȭ\e8^8T8HO\a)YuQj7Q 뱮`h%^iJgT@L`K9 amn\_ېD8A&@ ٞ}jp$5?5mThf?T$ ޞ"AʅyHyPF"qyl@+.tK=Q\ʓx߿:41gQO}@xNt趁\#Nlq5C-m= l\tld % Sƫ@[wS ( eP MHx<}fl`*c-RW|f# 3ʌlc\W[}3߶"ۏ> c1s<;ŦLi"c/8GqBcK a|mr&7:(DlX{v 0HMJKR# hKcG5JXcajqn<>"6_@QF;[5g[yPm/crNFJBҰy=u8_vqg;AeGAeBP{\ai>:OM̓aCa{svWCU6`~qʢ.c %%Mt}hqa;E0 [p0zhtNxCZAmL:r q)ntbE vn4h ݇Q۠`vҜX={ȴ2J5b-G0d3vC^\AAwP{SDeŵJRRJKJIMq_J,$ݡax{&َW܀+M'Wc6'(41QMR8qyb\Xwxc&^E)慝W[L``8{LwPb;.)\ū~qiO纤[";4zǢڇ$g|UcڙeC-G1)@윱UP_Oyeobm\\! ױiS^pRu{mCVB߽>( 4[iMITGfqFߤf̱L- xBz'ZB+eZLC~0 |˛];YЭx #]^D^`iiQ8;8eTw<ߗ0QbsȬY-Jj-Y Ԏ3^GY!:Ye%0kMg 3]3>nCރ{+1:V瑰ۢ)~ŗ"w$^|հˢ| Aմl9&"eǘ*l/H_0ލoLCh\G|:1wfe 1RrP&CPB4zB*t"|[7]-NX-y'4J;6\NG8Pi*G.in6xkUA }hϞ’qUYnJ]oS*˕F',TҽFU&-$7)5f%0)RefّwY٧mq{+7EX@鵗@p;=!Kq+JJdUG2<6lؐw;+=6nWN|q1 =/g6AKUZ}o!uL*;ŸhҔy YgsŽE?.AIX _Ulkq. [B&Ҭ4b3RwQYd8R,a/z%QKoR~a)aᆻ8P,Ҕ=DcI[0l"E#|n흆~ECq&t4kOTm0Es>Y TUIUY; ^ V'Eоf: 6Q:J#4 0CL8 i<pw=`SAybMŔvIc`scnV jx8s|VF|LQ;Qj$`6Xᨦȳ"K$98$6?u˗u'mHiitӍ#ts=F!A]wXՐ T` E.(=.ww&vA e-"Ir|wQ3Thg(h|o$!-Py<in%$@Id?2GI@VJp/tX' 5P-ct^ikFG:lq?h )6"ÎY36+)W+G%QY{5ؒoN}&-<?06 ?Z1Ciٚ|yNEt_InkSU= vf S ,֋c S'V62~Z3̇XL<_ۜ,&5e+ߦvPBL.#?qZW:װ󸂷#+Ni@W|$uoY)FavYm%jrak.cB_ېMfmdV1 LFV5Cij9o$cL1JπHWd ͚*4`@oUNjDr(n1?F8Y;謊Xͷk6eVNj"i `Н&~ELψZI|vҕ 4 Db7ج]3E-Ș J+f4 J̊h8Fѐwr-Tn#%(aY9Yz bgx9{IAi]FP0݇4׍2>2K:* -:!1e#mĔ]N I^Kb+N{g#(TTt s+҇}AWm&`[KFg3"Gw!-#dk$s|bQVXa$;Ț "JyuW+tսXǰkO+2z{Bza-FqO!"!'D p$8cGrOz|#GD9qD_+qK)~8H׹5esh.׆V,ufd_$Ǡ>f9{7:&ƌ2:AgXGoq{Vn(]lKY0sU%wv9dG6]> h= )zˑSk ݓ.K xvHfô7v^jg>C3*Up h#TjRrE2qxqCB1L۽Wks ~hMR, [[a g$K&Զgش}C"_2lXnCjF$3˄?YR>Pb출#k2Zw@I7 XH3MGP%jDK$g%ߊ޽k+?BJMWLlg{pZ~$@'3ȥ72n?&v`z*gnϵMqT(ȋ.uwn0nIQHГY4}53~{P׃HD:st;Yΰf٘5ߚ/IhT;sؤ]hZѿw#ag7^_"ʾx܎GԢ(zCb3JdUטa-R¯RhWKǑyo8)W։_XuL}&6ؑ~5" apaHqanoNAw]odZ}f/Ėt+x̿/o r4asNjWݎXwTgN0j8?{q_Uۗ8Ļe4?3U6wƈW٫7^^LW^ uP!e[#pt6\e=L=L)3sYO-UI跈 @""\"Qq[?r`]2v}Bfݎ4 n'Yғ3+ Ul4 [>EMTB"]>G|R %3@"S5ϝD,چ-,uCC{T>GyRr70;|s Cx?L+su^.t:&_9gz&2bAE'<#~!d7d.FC¶83IBdƲ4tn| 9m_?} YMV(};ȍ_gtKB[mQ櫽q:/^ٵ1\*ϙs K>4LSo [14@)FE oLLrjٷHLqgF؜~SҼilIMz6 Ww?>2{Bmh85O{6:.ZN?Vn >߷EvܞPA jD q32^mdM!Q;h%gp ;_IY<^K?&E߈/7H7X-Tk#E҈9QܒŜ'TAwYoC.9(TAt'?N:j1)J~~ІY5qۡ(2b~ŴlL*PUqʄȐ* 3FZHkѐ)%^캓|w( ^NVcT: Q "gЉ SfE#}\i&.z{^6Bv*,L)1* NU:$606˹_t҄Շ P9&E*c y ŢA1 ?kB Vݲof $fݷb#w s[G-P pIKw,!;F1P ǸD 1` X2w#Dez2>ČJބ-Q^AnQc$pnNlJ,Du[af`fFeYPs:יN$* a pV<9Ҥ,9U52iX[YWEHGO|eU'34'{o"@˿Oc,tś)Aa5SVMӶw`]Cܭgݤku|QyÓSaCBO ,jF߿~/h}wA~1 ~vx&x3ɟ, K"+xlwth+?nO+D D (1m׌rd;f٦4ݣVi;ZGʟLFX&m>eʷ0bTZIam&ɣKĢ6PF}W֣B1N2˷I= Ǔe7,u=鯾\k D.er.uZ% ;.l{(c5-c׬Ud. i4DqpM ײ*Ul=cnO=7Ą*m$Aۂv [5?25%-ĨI,Ψmp qFۜ{|81s7>%W'ZXPYPJ5IqON>֝u_рڬ+^Bh4";~0` TY}&|6j4J"EP:D؃CώA<+`Bdž6O%Kǐ]=YQ.[2%?֬n9!KqLo]q'/J7JXR9QB+i6z=I0W(n(:6zYro`#؁^ԲqBWR6mEdzJDR:Tp 5#f^dLtYsMIÆeVf"39u&֝et(JT-*v`~>d D>'l& %Um܎{-9np3:$5=y67IȦdOBB) ˅<j8˾kn4.) foW%qq[>@˾L؅FTxZtj e0L,n(:e6@M!k9OX Hzߢc14?waʼnm lm*d^C)|CO(| %u(ƗEujԔu1-λnfhx&j0Ѡ5U *) .\½{'kY%-6metm:q}/l2S( KF}\`oƇ@^YUG qé]]}׳ *͞=P>78Ewu:d (V*腊Bnٮ >~<ږ$lR*bo>yRGB wJ٭SK։ dꜴfM,1aH,c"fQE$$(ѐ$[%&gI+s eQ7. BЀ="^FGLqSAيj-Bˎ[t֙3jb `-.҈Xұ#F0ǤB %U8YqN96˺d˟"Y6Eet, , 4t l|ɴRRHx,ft??H@zՍrttƿĿuQL-IY:%16|8=k~IJ(j5ҜC)T xg`9r%7 PUMkVwYy% JR1"XgyzS.*x>]( ݠ;uYe:a'4]U @ub߯f 6mѣ(÷|1˖tBdb鈼ޡh&伧{"Nqҧ;#<^{ROǟP~Q4|pǦ@qᓱLdV(0VTd){dE8+z_p fe9;Y{l8*7bZ@/i,]e Y0fi/>Qβq3ަ-9Џej`th+ ճDCDz'6'}Ygw[mH)RO7nn$Ijde0ĺ=SR: s=W:v I>cνf_MHBeAby4iTzҠ,O^[-U f,9}sz1ur iQ ɻ֫snMQF zKUnXܟe6 2b)'t yN嶸j׍HCΤ2awp,jXsaJQGڏڬMl.Tuu ?cq[[7{ Yt;(r:A 䖱TFTVi$Q"P=5^Y,lda*zdeRSBRcf$&zu6M+HS=VTbL1I@Z|H41$-͆)5 c8D5{pIZO7ӘM1&qvyClPVulYw eۣ'`ބx1.״3c {rnn`u$nJeI91J!_ܹSeϿHt|_# Pf=| ui%9f«u7ϭ_m0 f/N+lI qMOgK5wȱ16 2Axh1&7~;`ÚL(ӝmxejnÓ$7[)q+],p\=RRʬ\BR;"ԩȢc|6lHmHʊߞ9t(btYwlÓ$4܇B'LIxNt S}̤'%~wB`orƜ,ra(]AKTlu6Z,_䞘+!zs`HPxX `,>hNnID72,gEŠ "r,_fyr䌧r8$C^+ [S)j3 `C{Z ur,%ETVp<ӳ dJcx҇$fA]c|KiL⼷ `UYӤԲq!BVȏEZSfʾ_T >QA#3 n:(NfVxCCU38<[Q륬3~;ƏE`~#v%ͱqliѻ <_d.@%"gUv~f >0qf!' ^.~Ku90K]yIj Ҋb(Rr3.1Rmz5`zem>-!qG)g<FmjS.fҏBRѓ읞8섄ڦ!r}~m@ 4w&7x7Lް>.zv򒶸&jq R?1QqY4hŖJ*&m;ǩ*3:R~;m7'U 'ۼM l}Y_5* '$!N 9^U(CZny96$ ߞ Q~܌fʫ`} IHֻifl= ڧ۾&-|BTeoԭx{j*ٖIW)26&L{) `"4 3yA5/YMqk¡ nmi@ʢ֩F25i֟lA04peEG^IhV;R=n5}HfWio%;f|kR2̄vC)%-PCxȩqi8)3݌3WvcgK <ܡ J7H;e%aw@`}F74'J'^A)^^_d7I\ץ]D_ s aYڈ:KZuOh~>MuW7~j}U+"qP}t])7 _2+q^:RXcF[]uaE1fU-d ?Z5xiߝOÂ>,/7w¨B ů Z8U9@&q5W=}vg&2:6q}pg=@1Ồl<"T/\t1 /1)kV$4u|ЊfRfc ǢOTYХW i:h^f#KsƁuJ>)5!H761 ^DΔ| ti~owI@'+["'@ƅ kaܑqӌEQ"VD>~q]9^WU͎L+ZQc]Iٻt '֟M#TrTvxB/>6| x֡`>B>ܨ6j+AXG.kҼ> Z5'g]F oXEsMASOqu;ߤc1[6-m}ᡶqt:NWIN_jW՟)3f:glT 55ѓ3YلUz;3=VV} K"2N@ެLԶ︩pS(%cba71n=^q^l[_vgV<+݇J%?o:TAj{2oeVkAfXaM*~NkAhL.0]J|B`dV@^l÷DnS]|jԞrVm|`{x|qk{Ǿmk "Jj͝!ȭ>|.'y5ɍ$a>غcRϾ"i~_\8R$6d8Сf8UT-hJ!FP+*$p'] up[^C bq*cBUPYqׅvpQBâ+'ZBTdv`7n1/zB8nw^6Z%([>[2ow6"1$2^x6Fc~D-+pa.((qJ#^AU'^y,CCvSiS6gu :&TؤiUI\7|gM[lr\r!_y:A,d|28r=(}̞.+_ɚpa d~e߆$3+4!xs' 'Y, T],ĉ+3}3e6zaoHmaevvd@U3N~.rT)uCGʏ vA9wZׁg2ePdZvLG) .#JPiXOrR4"S4C5o( gav,E CQ$U,0AEB@G *ѶY\A:-j ۢ:T(cѱw)XpQ&lxqJvt!Uje0씔hu!e*Pq-i7kc6dTCd483Xc0T1ܮxx4O- %PQr<[C11\ԯUu:*=iDK FL_Kaפ ؀;cLfr1\fңprîOn"SZÍ5X5012abīttB,MJ'j3N&2%335K&V(G5;yhx&R9]S<)l.3. ]v]ݐl"?lMd]Zp`L4A_`E=)5Qҭ \wv:ZDܦ6SFF՗BBsގHykw`a@ P蝝=?"}``8F{"ء`Ɲ &1/QE!|f` t/2k! (CEXֹ9[?\mߔwjaLAI 3A)z^OR53:YѯpA,( ]yko_{6,ZgjcH.;¸ج#隔c3nU FTlZfU"- )X\~Z(3XRN7 cd. DM=vphb;Jf/VZ|~'̰a'O&lZ,KqS6ṁ6_jpE_~c1'D`ꉶtSH"P6 C[)b/y87h'RukxCGI4z;&E9֥*O茩@2Z6Țފr W\KBzc+[t6/mm/T.NO^(T#GWT10 Xo] |r:V4$ӋH@& ٥wJf7tvDv١)&.8 YP( / 2,7P$F  fi%̤CX$Rd}`gͱ/Z*o'e6Qn.F1 _ t?f( R c.MN.p0[,;*UQJR'),YQnH\HiMơ[v.Te?3^GٴDtQug/y=Y3ZԘU=wN.ʢbRt_5D/$`qćRU*b(̥14HD8?o d>ШtveS͠ s/s p2ѣ(sn90L|MU8vHG>ڽf|sP65HA .)/zUMuҘ4=+J9=˧ISӴs&̓iZ j}y%+c,9%8)5֚ҕ9XPgSiluZ&1tδ5/zK]AC21?YȺWӞT`_s0~OqeO u;1sm3锊C6A]eOJ'nSHTK ^J{cgے#?ljW %;KB~ #c%oǡ,P2,b9 _vst A#,gVx]'EїyvV K]>­]ff(T7BEj6&J]=H$"];^JҨ\bx& 1p™[x=6R.)fiuU%i/7NM<-Ͽdz_|<"QM2G䗭2i7$dNL#fY*6$z!(Z- ƭbe-X1N{+bsǗt̎讷Q4x>ptQ/L@*KCYr9} R-[ŁۉH"v_k itRvVvNjUi˰jU'Ʋ$ UcEn$"! v%\Pƴڇp8x- V zaeġ|sPl~O;BT}?{w$muM%{[!2j׺4@_ff[4qbĝ_ZٙH5EwU "i&Ø|"X:@d+KZBbdF'$/8l6vha9j4wx w:6fҡa=|ʐH{!l?+!qE?:}n:p}3x`I9RO^mٍ.p ;.ѲPz}r-^) dΓln}7:66%:nצ4W1tλiwR'@/^F MڊPyܳNLdIa/GE]Ѽ:l_[7N73iʠ`~1І۝3B>͂m*PT,&甫k{ktk>vtP5 ҭUOǠxnGJSe \ɤ ɘ UۗqOp8}Sq n[vN(P lϷٽuQ8d09+2V0΃}T~ 8j! CUW җ!<=pEu{Onds*a?j,?9B4ܾT؏ ZQhD|BܕPYix+[]v\!Oa7աWʥϹh.ĺJW E<2\ jqNhPW12 S=eo]7JtfX/PRJ5K֙>-i :4^l?7^l.ATk(l9{]欳I1Px c{30 A9ΡZЦU,D֍tB9@NѢpEܰO_ ٛ mX ]Ngr挭p~ou|!4uC Zf9PQPi j]j# zU-> 6 0$2tkfw2mW[Q4 h.Ϛxj_4֬4kMcCH_8龳mf:lZJNFam1(BKO㛸-nJDbw:Fp5O V}sG\f_mӛ$xP?י6MCXܽ.eHx3Ws<;-ޒ3g-G|/zyqS4bЧ~Čhu8]rk cLYy @IU#]AYG]Fy\c7^T\[#Pt uh͠  `qTUj䈗%;{>#m[j6Fԙ5 C8h#7j}P&_- #3Zxs;vRQ (oL06a]^acB  R:sT7# BM.2ֺۭb ˆ8SZ!$i[ 7qH5 "pEѯgl;7֞H12w][<*nvzǥX}z_ vz5Jq[vqqq$_+ VE8 ( >Q $MbS ,h+,*Z1[{?8c|Wq) RUU0zh/~a%ŝ7.Qp癯4ԅ KXg&xힰ.q'#σb'XOS4v7Mo\AUIS5?ynZ]Yy SOl2.> N=_W/EV5Sř ^Ob'fy"ꍠ/ʂB7KYi{z=I l;7R~ BןF ?ͮ.4$JZz z2k"XQ)+v$?y){>'oAy !rg.yٰ|OǍ~*u1K+'YU~d_$!ԷAxX54\rZ݈;޶h"Xm5ha,>aM;v3v(AOfsjl:? Mj8mתqS6D0>*V@$$>5RO 3Nώ3%3G {UرߔyzE' ) "gK䅕*GqЗ¤0gjH_m\a䮕"ĈG!cDHq| I3lGwѻ,jVbJL e!(o3p M"Cp`_,KĊUr%fʵqdd i`~biDy~/ /`̴ #ݲ噺'tCϨ2fgY^fq^Vs'F 6F/E}͉gqJY򔅀IqD#hŚ!&]@{O< ^'ݙ1., JJʶEO~l}܈”?|B6lv%ԒMondH+y5,X>%ՖL3HY9 Qݢu8InD~#d}OuS΅|cPmVsQX&pwh]%#V w^~} nY[r}=5LAi/>_ ]qlcPPx,*U] G|K4x9\chX 27ӳ0,3  ٖfԎo8XبWbslB>*ig8з_Dcqy 8vee0_dkpە5~~4>d,:&g21w~[Ynj7#q ( 5ΕXɕ~JdV榆D[ʯYM׹Ve,)ۨupog܆6|hpEtthe$Ƽ ٣:xV^7;82kwPk O&4 !@D;hpS9C>*:8l< / 0cvL*(3fC&eRmzQ̲WZQiJj9WA"6OϏ]zOu:g 'gl Do,Vk'ݺįBdw:,+ڥy'5=8'6x؇a\A<%f?ݷI7HvaSP!Eti z62K*\ePzvBCy_db]e@ܠ@!Q >7yY2ڪ?@G{ \nZ$B/}TG;ľւX'P6%篏mu)k;^۩ԗ.:ъ  ftqt& -zTfs %nЃrM`]PeTھgK qG}袣 OJW;x7ֺ FqK5Q rr`o4&; +FJLjZյkF]FʔQcUR$HSwG"e@ƫkzL9T_UGZW`2)I>%Ąz] }h_+G2= uwZ8n01^*}H*}PSs)%4'#J(> d[ `QTg0*g]8͋S!sEIAR-{@۽R?όrO(%Z^$sG+HA1S`o*RPe;PY;y}vNKo2NXoBK{.*/E7ks(vZ7ǭsP\M:Ѥy26cNĬcS0>=#^mY\]V`/i<-.+,U[óD c9>>އ=ez4KJJB\rM OT"_%I_6BG' 17IHȮt٘639.UVoör`HU?L.=VXl{V eI;4DЅ/?U?Hnqƕ\Hp4cjy{WWJ?=}[kM>1;A骰ZuZ]vrF)Fx Eu*W6-3^)U_+$X/[X8:ʌVf]}`_vǨFh){#ʸ="yI(ɃS$NJz犂v.:)F_~7-^:vg;Xe+=UE3i~ 9qgP/u?!RSό! Յ`fjRI~|SUKσahy,=Y~ŖlX{q4fkG\S z ZYULBb@:1$S1nmpf5!ehS[t%Y)8XXү//@7/:ngs_d1gWqn%{w6F(g'Fl-i}^XC|تu/cP3"f*w\zZb{jzyBOۻL Sho)dU}R ұ_^nj)廽2c\c|*RP~} ]rb[(.ʲ8>Yl-*`((`JQt֣x7Y4R`Z)DZ (/rAI/䭕܊H[+oЗEDfIyn"{߇@sY8auI,o몠݌!|Bcs]eSWTzեrίAFg~sʏ/z 7jz8=T5K֓Uh.闅V[/f]J@T.xtk/cZ* T! 'rQaۻ ^zaWaݳP_^N4lzvOQ %k{E8u{:kFז=YIsHUƣ$Gݙ=O9xV CqcCɾO),VSB:ρU n8)H﫿*cb@+ ʩJǼWBm*Wc껸i[3.2bIBR_ӊJj(nBT;: PY y.i(5?[q=7>Ex lXO(%Dg M`h2Ad+nѡ2t֯,[jf9 Gu`·2WTư&gvh:uCQ]oqieCSen0dpq>zp{X]l)cٰSJCt6t\VO t&bq<E6o< `٥R`[\ѭs!$HYw~{Jm" qQq/!42Gã`e(}vnX;/ߢ2G (xm=ww+hJإ8EE_Ca5}vE% 9'l,CUAUA5C#{R:~r  )˼F'vj5U"ጰʵZ;uy#i3 ׀d:`h[:&9q}#Nej3"j9 B[z}Y@KQ/ U|i ֿKy6.Nv2sz֝k/\e6;,~D q2Uo7+!"Tɂ{Z|o5h?T#K۹ ^]ޛ:a_2 0Y=d ɛ9n+=t5 @&Z%#]TwTW/YR+MU, 'ԺDYhK t~9߼t_+@|㘂1AcuZ!rMB\T6r. y*e䓕2p1X&8.}Jdy6;Vqx#?u ȫm= uvq}Z\C.rY^0<>T'L=_%$b(hTdupɁ~rnKPy+>Ij8 1PG# jSS7.(nrݽ=NDxOUɲ/UɫhAT-p[cWIQNeUY4h>opB#++׊؅8٦r=mF7Gz\_>])*܈'lQj͉G$)k(K]W~Ov\uv3rb:^U4ݩP[  w[(q&eSڸ/*BfۗQF=EϬh,NVcGw1_~Ob ]d)zۯmh2# 9ItL#d;wĜG|<8Mjͣt( ]Ǒ^?:qpoU]uIx2մ\qۅa:AUPTG3"|1&$tEdB?Ƹև*;\K=eU1ī:A?g6NZs.JO›2qSG87upc7sws S568) ʲrN BwN/"[3iƽJⓩ(/H})Gv4G<ޥf/ ev]NTRLLV-JXީ-45n4])[&[-{%.E; ɋ{}pNFM~FxgzHiB!Ctz  p $w;&Qsx.L׌.%4\;PQ'MY:bͦv)*ZGeGU]'Nm"q"}Z=R#jWgEjWZF!ۻfm7USգ]Ew0bv28{w62!GFk U.cubiZs.\͚/I݆"BRLk BGTTH^K&79`_Ę wkIz#jlJejqG!bcGz;zz]*p}E~gj2]v .s Q@&g$0T̒d*4=bt2BĆsl?R΍ î?yMdD&fH.(dE䍵AY{C+Rv*x5!3^[Eg#<Y'5$j 'G@rQ~XnӉgWJ-R'γN5=*ӵBHy "KTA`4 tLTVRnyNG+<A@ ʰ/&ΨxUy2bKS9g0!$=Sb;lP@ÓӌTo[UN ^hLB y=&/NMaLW RjaЖ~] ͥSb$u_l?`[;)+yx;ihNĊnu3 SJc+[bÈ(FR,ܲ-(.@wĘu)ӳ]f2 }AQH^XA+nHƥN,\j={>JuH?ѫ擨AYt)1m{$< ֲ"}5@GYY=&2fXJ/cT9=84lxٌ#<"2<z&U1(Y? 'LaABaAPgc34c=<#D6TۯA.I_˳ņ%Qr'0u~¤W'Åg/r' %Gvߒ9Gg;Z{kDfq[YF#ȏa~2.7s ɹ}nny--xT>1 %2 OAC*qh|SL[:Wt̃z_H[UG7yގtND%i"`anW%{ydԧi$dE_FBtIQN-`# a3K\7QU3[~f3cMfM=nh<N dRhgZj(  Sc*QDy!.g0ENcPtEI ߈$,4]X8"k禷7nMЌR|kNdky6YZ)+,3 9~ץwټ܆h 1@?g3繱l92aZ{d4-v. # S F(?>&UrWfj4,`~7Xww},'n0x?ײl$FUڰj(¬zFx8ƙrC[Ѧ+$>rQoraz=uT 1uw!?NH4vpcyo|TʦT>IiҤ\HG%Qy I{x!WJ;jlgmmK81/o&\`DzkZn/G!=w 'ǹ(hAi~QNc &XK>"a4M Fs"/ 2UoXb eS[ |Mf!%9ʄMT@x@qdfaZLQRj~-kJѽ,~1cfE@%H-#H]fS O.#y>T镭sL=7]3^[4ғe<:[$e.Fv+cXz-x>ǞO7/M},fH߇l tz4_-VTfy X3Y}p]Ub-7~@#D(pd"pfsuJ PnmA/t粜UiUsLa.畺ÂǀaT¾+|AUNrشpJW @(>4^@ZP>tH=1T7Rm׸9`@b[ ROOy<-7a-˜Ne2xP9pCC|qm^FS@J 6Gsi<Z퐑9~Ͼ*_)tEP_F#ˇ1bܥ9[snbs-1DC zt(5ú^$ ^D%ntWi60=lӄP~ȧ p7dk7[;׬Mm>~ Xz U*7$ϵxD19 NFҩV1)a9 P`n ˷xgЇ,t݋Q 5I[v h1,!­7Wcdg~h秛k*o1$uGepJ󦜸iNKN`o5p$Bo/,{3DC;kPʦ@;ʍ^_NA(Xg`C]*w&#ώ{q/zdZa0TcSaaJۺJ*E#2}(ZX)+„*TI<7C hRKDJ ߶3t W~R+̮vjœt~\]whs#۞ y<_mm@zRV^)FKrSp"*Nkuzq١A;wUϽB\!PR1l}2[^f={gqF>F){Y7 Dϯ6ߒlx>GYİ@CUh$F , &L7EBٲ}q ud글 VT3D5WEYbSCV\6)v5T&k ZПɹچoԮA BіNCK|9kSB徽Ί&Hcxg ;eLG:nvuz *)I_,Q? *z[y֏ôF/%X O.SW%gx!Γ; )Ǹ? riR.S'uяILNꙊ#9f1ĪTZ:u|ƉJiC=8.!+"?m_U*/d5K=@dTP$-{w@KMOx;Glsʌ}/).u?)'e9w+gڎ*5j+yvCV:5 yr8 i4p]o3js3y{2BܤSуݥ+lKU+xrU+˸T\nRho'}I ?\͞I=Q>~Yr6n70ET{ ߡ x(M3iZY pee?++f/:ERt DR]"/T:_u2fBY,dGB[lyvGrRN羵#~r90PQc^׵]Ͱ:\ &_N٣JyBvj0αf cq6tD(k}EtН8^},u!ErWNi;1BoJf+ z?Ԩ}Min:v$(>=a+f*#u,sRZ+,t'zikIK);v⻄'$)dXk%fVR-vvt u> xmgopY |w S!Us&5cjSOV3X"oՉ/q6(2"W<&u+5\Id|7¹'\Oەpr<FI..U\d,`϶uS[D?I!j!ҽ=HZڬ1nsڲjb\z2=iUeԮN:w*ʶ!F%THK8ΰ>{,teT')Q)e>Z|&<+ XyX*0M&.0#Khsiif+c̦43qux33tlи /%y.c1I>$tNwɇI2Yb2L,eX'CX>d X d2.2X1J|%Fh@3d3Xt-6i8q|X)}^B*m\H{ԭ$Ofˀ¯pIb!-ɒ9oIW݀cn.ΐ_ĺ+%6!8z=d0tP0Qflj>ϸM_}|AB炂j}*]aV<NO;+gfBFvV1zc㹮lqZcTuI5~q:5OS:>WtA|dAIev8ܸ8:a~XmuS2Fo2$`/AIM40̼q28sl3`빅l6y6n=y_Rq@B[e:ܽ|Z49hq`9?{I Ŏ@%Ϟg~ 簛Ziհ,DoHF!BK\ SCzȹY,v3!6,>̆!_#*fY8: U)t5)gO;avq~S9w||XGՍ7-Л˅U˵ղ8oZ<&8)tiq57Qz)&*~e"Qzs$_Vs oRAb5n:^O*2GԒn$Ĝ5f"E07Ťã:q8΍gv'1X>YIQkn [U{)8zS64PϒqƽhrY{SvN%d*r-GE韵Q Zx!ÈS? p\`=[1{"n}rio|o](ҧ`}wdf+p H(y/_=Qqj8*YFKxjըQԦcfac{B'H_cʼnuEHS֬gn*<{hIr^Qǚ2=K]rRB*\ # ?vegVEv+Ml7+qf*T`*ml C`?gmcvYl{Yz~e+ ޢ\8&t&y]1D1:6D#pT;TqUJ ?Lj(9D9TpA ʧQ'?+Q jn1ݠig04 \W ׬_ FwC7O T1S*>=γ3L~8a?谆' Yxػ.<d;GӋ\k"E5ɨ܁ζkقœy&ظ؍qzϻOc/w{/7~/LMy}Q2ʔttD?G}qgvT.! ??dm endstream endobj 1447 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1210 >> stream xSLSW}}j-?}] "*U(EP_mNQ$ȘLFMdST8MA&3n1 4bv]\l{Ͻ;w($ FY-BI'p0.l XhA@XAc6\U HJQ &VL:5:e}Gi:'nS-%vUqb]_f؝KJmk7f{9oM V__PpsR]lY|BĴPE( R#0DFJBDeL͠vS% I#G{F6J* -DU=ph&v29;0 ~`.ƃhgf햫 Tm$Z3y {~*ᄳKz4| p01LL]}grNo}zx:MV`佪z-r. RlCTDT`E3Bd |#FE2uEuzKwٸm^8#A[]#[%x^7\ڹ8OJp^n$xw J2!tvDp #:}4 rx8/$%;="h 6h6<\Rf]fI6ϟ6%fX/kMAja͒[ i+ ` >}JG >.09zc~m܅}\E8Y8, ~gյgYOi^+ %+kvXR;##z?_tGk2^$Õn8pa%st%iR$@G_|҂֌IƩU LuVʹk|:Q<&ṅj OMKn0:i|λCN ͋ n 3ӦV9~)haL#^lE>$<~oEEޫqK3;~ eɓ?@[Uߗ{Ea0:wK΂t}у!3^[ҵZ~XT8: B݅s4‡ܽyW6w45ӪKR[v¬e׽֖9+WD -?Fc0N=%> stream xv_>D `:N";mWaKXA@QrN3;"=}ٹ wr=q'}5 '9|9|""̓OS<+@wt o_^/ޝ9ɀO\|/o_W_9.\|h1 -/CO2mi7M+zuM,O;sbhSuwEkpހ/x =_dX3"| phNl, 8 IFiYk䢋][ii㤸>"-խ>m,~DoBlH,|Npg6ϵ|'9$6ԇ+:SY#K|w Ng Z u2@.^M0Scx37p&^  {uْX/I {9Bߟ5vi`I \Kd&B [De: H5Ņ`I0i:awmQ+j1YM3KǕlùP~?]Ȅ%db!uBDUiFll,e EKy]nm)XwD-.{ؘkȊ҄+Þ ʰ]+ak FNpGX524xOwMƌK4Һ6 ǔMJqNO"' x 8qd0Hq^(.oV.NkV(ZF>NΝrsuK*X%R W)\M݁ -__U5iH+[̔;YJ!X  Â$-^ 4(ڴR,0 4A#*^qa[D,QyS+CڢaEq mE ȫ:>4n:-NF8iȬ+>g }:>0G A6#HO9& v`hZ !05f7쁝2h}zrwZ^67.rR}nbڃlwebSW.Ё82cndMFvXIgO/\Zي:Ax9|FRRXHk҂Fk_1bp܀>BtxaHY,EAt[%PxjhEl-C.1GlV:9IwπP@B`%ԟ-dPYÝԾ6" Q _'%~Re jKbWmSL?yVźV|87s:9anqIj qwsSAN8iZuӶÐ9!p\1 3쎂`Ւy(V= Ҧ"]o{!ՎN޳ӎl"@f)!Y఻'10%=突DHl Ux= !čCCYnfS#QUQ!x!2@M e$#4<ˇ4ARRu^ڹ{`_I&j ·[o bjCkwZ)F8isk h_藓~vt1 Lca&% G agۃۃxB{);a0P<2_}P\ozCszfSv|<&#-ݧcj _.6TƋ|?3MJg7\8ԧ@K 8RΔ7qUB67^[)5S$|qڃOE~zxҶ'_dǜ]?MWAV|u%j+K1P0w垚$$x*?mix{/>\ތP=.!O#͓DcW@d̈́Ov:7UI1jlwzPsFI b?!$hMn HW+D!?Vû95310rnNFs]fajyC ҳ)`"/FnS]h:h~/ ,F* endstream endobj 1457 0 obj << /Length 2198 /Filter /FlateDecode >> stream xYKs`VOK:ĩ&ٲYA"$dPr忧{$qc*yg~MKV#9ه+%ÑR"}=-Gq$ Fzliwpg}S!h>H>Z¯8GyBh#a$i}Y;{.O6vs[&v[:w*wG=o:H񗬨'z5IScI}mYu~sIT5J^X6ȟ}L浛Jj& FSҀu9{%GrkPt$'(Ky_GH ş ߫<57א!e9i[256_dg|A_??cE~o˕&ʤϱNVPYU7\gLS5³ߡk2KSiSXӍŮj㴢=|82zؕ=) 9@vozPPhhqc*rw:.64:}]ÁjQd.ϊ$c +(qB bIbq(o盡s~Gb 7?.pM=6GyVT̃͋݊54$Ķt^[v}jISO(9|/c,t)80N ğmu rSELaȞVx#*uK,Y4/r*ʅ-ǚY8J۲]MB*͇Je]B?'| (kL("4æ'Ґɚ Cn{'q  Rǩv*@BF^Sw~Õ"ᅍt *nYsغEn~ k^^ǏCg j/%C$'mQ'jCD>zs'a=PRwU&[4HDe2ON-z 0RZN8`W4IoqG)oP13ƭ,1#e/øj%|柂)pfŜ[gVG%M{TgO9XezƘV+>-ɲSBl;\= ڹ@lRtf( <"U9"孾69"+$o$ol^ˬ|#hrN MԏIMt=4~Z ˮoB=AhQ_\ ]v9Bk7"҇Zl)tqzGj|l5vojcK^X endstream endobj 1461 0 obj << /Length 2681 /Filter /FlateDecode >> stream xZKsFWrxĥR"a$@KTL^Pd\vN~~$,&tW^ƈQO>L>ILJГH鿮T4q /)R]yi,ƉW~k]_~{ezA,>a LI?n7yJl!|3Ji&'Dty7EfW|(.>]ޓ21$՚h&[CEJDt2j>_(6x.d]ۛr˅-y'_fϚm)J=ergpfu+R+ (31DVs@ⅲ n۪hr\7kϤq%|΍nz'J1ۼA"9"(fZDI1IERh5I1e"&Q`TEh+AD *T K xfC^,be 'B#I"FҜY.%.i,jmC>v֔U/ofYl]gf*mɅ"cQEQ:H.|t6AʍZ"f|5d:wI-]7 X'MAkUYGY)1m@YH!C.+PQizujX:oխGEc:MRQ{ePD&(Mgνk$:lUV-PQ ` 4fӫpcߦ)d:dmڕm,jC:-:1rBQmȨ:=JE肋DkB5M@ta:Z6P^dg UJ>[^fQ{A,C)%?@UuI.]}m*b&h nJ|LJXJ|M9ub,`(}c/LT4lI=lԐ CZZK{AG~"RnȠԪ.lӼW:+ >.o;hmKX+ĴP$kisNRLre@(wkۆM3NHsilYBhA҄B̘]f) Oi,B yxċXPChbBrͣBݪd`UX- @'MOuPQh*X$ђ=N v@V踰ݰ+y h6+0ZãPO_9yz17j1l@Sm==7/AJCJu@Nٲ18CݶT=ؖaJ  E"6O:EOQ!sbCսR合}=ws0߇;%Vm8LA^Izh VtbO 3\Nji },4$q3f+\(Ă.`,cp*q(Mشd~z{]d IJ;G @bd3 f8rM!" OW/8á:/{ZG>sţ3@>gAw.ݐJMDxdpHʷM^,R6ڤC!(2}'9d\`>S=Lx?{ Ojؓ'Ty(7a?h% 9uw!kD֓Htt-w߇y|Ss\4ȃ nrn_d `:B-(֝v: #Y6Į]R*B9gI'^fE5[yi\7lDTeVy=tт WeU,Yx.ɧc'H-eöW6 7 )tl_yR?Y.aK;i c& vLX>euhpe3}W[Y_I 6ISSdsyo\ Af*Ϛ69߫:K-bKڴ;мx&F ղc;c5.`mP &iv~Í =*^scP ~nҗGZ)=L2rkߵ7Q,Ζ]: A"$4\eBs+5z@v;$)!!G c1v}8$aad$}.M朞9KM$X3҃ܟ Ί7E~lgeĸL":I]lz&{}:Cc-cs=o;ˋvbUv/aF&5`N#93v6avǤQǛ8io~_1<؅3#܃}8⹏gdvh̲I|#s̟7]]EgG83tm}8O篿qx>>JNXtcG/8D3nyޞǮoi'Rs?`^YS'daщWqS{)/BLo9om!7w8ݹ&MMo$IW&Y>\v| WGjbAH=LR$ݎ/JĤG$vkQqrQG6 E۫噃-w^^=?S endstream endobj 1470 0 obj << /Length 2134 /Filter /FlateDecode >> stream xY_o6ϧ0$_"F$%Qj7}Xmx+K$qoȡdɱ#{w{ؐ"o3t0{g=|G1Qf3f"Mv9ㄑ/b}?wv0vs{73]ܒ!0I@)l!: |O4R,6C' Q$4zDN,N]8TB(Hz=%/:b^<~cxpO 8"G^+z,DpCID"DDRvcK#K'.ݼJ$I/V~sTxr48$4gbj5"WGc)Ii6M|O RvHJ9|?Ñ CԹx~;h{SAR)|_^N #amGtu1l %}~nTߝ:hXpq"Q)N IDxU"<5_`~jV](V uWz&j]իf77q3s"ˬ>ԮlGxesxOxzG 9E\8n`F z^$5NLN>KS*L٨IEٺj2]OV|opH'Ĕ,anSsN[kY';pY,mM:x5;5{e9ŀ4 IFU]CȻ _}ʆ l$LRZ=F[[]Y;PޝFPku\:'D( $<<دP`إz>S1èGsFޠ/Hk~ymTR?XC.T *DŽBUٮ2]̉R˕B,& Zy27^Sbu !C/eEY,uˢa+\; $pV8IY`ܮueoP%l2zHj<ok$^"UUxujϬN:V8;-La|2N 'eUzAK`\D0YjΠ+ZIk;a꭫+0W Z)>"1gri^ s7o{ AmlTnufnOhfŪ]`b;hTuB4wi-X W){ulбG4g0w#EԪ񠯆2"NpE20ںEܝ͹  'QK,K(sL֭m×zTb$r}tc^ PD`PJ(8l 1CvLݸ= L$eE]j5 `f\nN6$C8!D#td>~1YXx.vrXMܚ$TpCwӺ0؟\) [{<D|98 I (UjEQNbF4A06;\I/:*Xv%B"a[*zҎ>_1D~hd'9qRu_dYb"TuѧWBF!:+D;khk%h,%Į%( [#t@k&GX&_A[dA D`PeiQ&lD/mb՝yܺہB=:Q8XvF€۪- v[.XE]yW׳>Yr-L[=-uv4>PpBoE2c$kn\;V.7빟 Y2OZSlګBN x0;Q 7ϪZ=wuA]ЧmLBYTsy`HV8 *J-ę~|V5DQHs5e"ಲpse2yX.w3,WRhfV N+qb˲a8%d9g]wծdQ`{=Bfe/m`U%ds ( endstream endobj 1466 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/heatexTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1475 0 R /BBox [0 0 422 422] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1476 0 R >>>> /Length 13592 /Filter /FlateDecode >> stream x}In9ej 54_IJ!qsM'EIGퟯOl{^??^__ןu ^cn>]$R"Ł|ןnDwYC_s6N{C}3W1SzR&=?.k{ݤd7.냖qhi`;P2+1@};PRKX@6,@'|n \l>sKwLdsj8=8d87F>*=^Sӱ0iʧFPRmHK\͐ffԨQ=lnl)7%ҫ&/ϣ:^OaNNZ9N;+8yLS6) L}C΁g͇Gu5|a޴WސZz!S~ש[Jٴ8~k! l9ԁu7l)> 7@Ⱥ,0RC>寂C'Ԗ RWh'U>' 2}('| Wsd| 5S:HSf*PG4ƩC95`Lmy%|>:u|~=!irt9Iz5XTWokm'T{V/>_3, ۧ໮ *Ypġ|L]"HyGBA> ju!٤Z&2Mj{jCC>L Wo?:g:#bNkT[{jqḣad=p}ZYMv>>IX։lO~W,>z 2~R ]\Z;5Bx㝡 y>Do; :G: ?6|TͤWipﴞ8{jꠗpRS C$3_]n>O\!<׉?8<|lS;^A|Ee bLPҸvI38Z3Sێ:\G%t=W&>ZO*vx謜XaB39t{z[oZׯƐ|Z-$[ uؒ䣩i6xu{xn~ 8'@GkOj:zxGAhijFebӉ}ow;)⮢w#!lw~#FI~'r|"d|޿ȖqG#J> :W'bN^*S9-9`H:'0[Ti3_~{ǧo-5}W^b|6zو dNr=0sk<`y5 elo~q+2;VG6k:￲ *CԿNfǯJŮ@J{@:Wtan@7Zuϒ?wחo|Cp=rgf@Ui n Ԏ33K3 (jGNq JKjHPz;08 вw\٣lfMĀ3P_wn{+bƁ3PHYE_<؋}h/'gnwK?.^wy ?>eVnN5^n[+β^Z"8d#:Fg_AȲA^P8~ed)k;0e9Ѫ lP72oUﱤ):2qi͔:PI[`Jз P3zzMr&[!X5ݝGif4k ]i$|=xu Fm—f~ZZkj_S }̡aO{섏r{u2>Bh܉|4N8JG$6rl I͡EI~^ N]J;5x%ͅҢY"ẋAӾ28^/~-8bۡe$7 2j#j -1DOj<j.C'wXQ͇vL555jT[AK-g7Y[IGdę|zem5_2rl[Aub'IŵF'kOCZ ~෭:?S}C5ǡ!IhL#H͹biN7LdK׷zerO$+Q#K4cNg4#Y>wGl61wݒnFS-:e?^tNt3yMOH׬,Wρ>`\'+Fi_{$.]~Ѩ3Vz#bҫ&C;DzRSt=2^voX6f)9zSze_cZ6=JO0]i^QN;pϬ=wxL;0zG}K@h_iuAڨY5STڮ}oޡpŊ>-Aݦ!ӵ !V 3Կ1T :' PSԺ_(vM}+ҬjДOXнt5䣩J|e NS>yx?${eMql9Y˰KEF';fkeO>wi?u년15;Xȱ<'ϩu+ʕr1Ttp=W>Gt(м/LOyƊePe^OHO.ZPyRu FR;~3:TtYGti9GNjD6';hS{S^~Ԫ$wW峑'J#+x#^h+@~ЯSlo;ldɯ{{+Ll _ki4){,"+U@=|45t|zƩl=-dvh!:ߴl> I۝M&Rҹ7Ժ{i,L|( tO~XʡnѭrK{ḧ́+Cxef:`]䪉ǧ8;]!)ݚ6''>[Lx~-l}f٥%fYxZ.tPOl{UįGqg"[;'.`%TtIwIC*ۤzѥ{CwoRdGkݯI|dÀN$b{Qw__Aep)8;O'^ t 9~;˯?T>|`4XqS~ÝF+$\$m݇/?t/FO@V|ġv FfLSM3˽'_؎y';ƈC]NfrmB8+Flkl֧H7NՁSs;'ؽ6NPyz-qhȧL?jGkF1|45KciS JHv'Ԧi>ɖl5XW{:xsWz) ݪZw\iɽ%fqd rojm'=˦05U:LGu|ڞ/{gwV?or@;W SZI/ .XX{\jޭc?Gɤ@1MkGٰ7\Td+=!Zx99>L?|VY'빁lOCg!kYXAeOI*o|jY}H|=,F:^^I$=m!f #.390Nt=DAy8,>P!L{rw}"vyoim5#GMF 5U@]._cݠau߫w |{S pEu=i +m*=7 `y_ďCedN8t~o<|457[uw J[iILʋtŵ3A[@]qGޭvN{ BOuw=rmSjGkT˦5x]KtA[>OĀFQvuTGM,Ȓ3;U]Fw+Eri '&y Ie,vuL{M?L: ؿQK5Gy1Q=~+֧OTEpa{H}oݡ+Yh'VV21>{?{vn;j/vt4 ǡHAᤀN#U8}Gޏ*7>dc p>Y>jh6Ԯ)2T=:t~kA>zl9F~0 =qV,w%OpJ熆:` H;/| |ϒ)bqbWF(+kC^G]d~4!5UYuzbW5)F FYjЎmP׺D([JՑ1G\Ͱ6j(+sHsMp['9~,ތ Iht(Co17QwG 8lW`^rrCExLjNl-Gk VȍM?hF,mMajugڧMsCsB7~Gڔ6hjOD>S}Fs\i8T4Zc]C'wzӲIj7i=P:P+͇fR+y%̔e`SohmқMi<`7!U%!8{/PZajU@6QsWS;wG|Y|U'Ƃwq}T7L jA,h>-{^u e㚅ݼv:? kkC? b؃<Ŧ}T5zs(Ѽ; *w8t~e.wy8N M3M5媯biǡderɇhwd~g:55##tCR>L"KZAEyG̕{ܕ_Cd5Rh_~L=53}Z}TKw}~>mzypWG߫|jQtrlwcGg X ,eϧcr<)dnΘ4]tSntMfAq gJY^ѥGc@; :Aޑ}y/ys"fX- |Zوs@;Z63t/F$si@mWI!j|Cs2RxHzΖk: ϻ$n$ PjgWPjMabd x!ٿA>-7;-MgЦ|Fw$S{"*þz{֝WAfe%q՟8E A*6=6t5{P^ HW38o99]Oswwjq,'>o4'1KgRS>CKns,uw3<+=N&Ϩ:Kv$>+:/ُj>wtlsY 'r|dDaz iTͰ6jLې\TlOS >/LCAݦCq\!l+`X39t|<t`T3w:1X`l؟ qwR>v@C>LmXY@MSC'zcSޢa@/؆q?Rk;RJ?5.gvJ2{k}IHݳ({A ,Y4y1h2b@ʒJedr2u[/ '{@7q]q@n|I}'Sh! uSnGs_c/80h{ީ;y%7QV7[ﬨdSnح^]N_d|S.M6*H^K@%TRICiW͎DMQڧɧ05#GP%eoNuhąAld`>yn~]W&.OAI쥼zWtz~p`E+o|hgmǀ&B'_$;U[򦙐ɂJ+ۢHZׁw#3^6Tbԁj|Cg 7:rS3x}J4}Schkʏ\:t;e|yġy1>cj 1n:eC'I'{7C#3~:t=Tf9b^%'[:/;Rl_픴_)7޼ os,{iri>T<յ>kQTmT!k=Nr$Uި֚X'guHºYB`P9O2JyU?E/P ?K*w^%(4rw Ean )˂uȨY 'w #ʾzN*r勪ڑρ甖hKJEc/bU>PrϓQ <t)m<|H>wX82Al/osZA*qGm\ղz@SfNV;;Iv/@K֜ L]d-W8<-oNFd79:΍!]dn=HScKt}U&~EKS.u. ]yx&Z:j`!㍬F;=ng)X"}=m1Y $И i~Bd_uil0؉ —1_R.K`Mrj:?Fp>L_6ymq~Xwlۣ T\D\+9p5QiׁssYt ڨ}JK\D "{᝼B.TSk#-^JImlM7eh:T/,ŞB1 Ԧ&u_- hj+dA%ղC[D}Z0 }'Rd;pv!cJ%c-qFLa)9Bta3Aj`icʝ["Ͽl߶p>Aqܠ#X(TΨzkBе|U_G((dzCxbzoh݅Vmy-R> 53L3̀9P_eݔ|sFIU^)/)X JLxnB9^ T8A*c ,^9[^i'jˣ{썕G؂y*4=}9&֒j؎^ :ny>zݓP8v^ZNd <1-ʻ)sO#S"YZNRֹ*1h*8=r"yQ%1^-5,__[t ("PY򌀟+Pa]FCD 0? Fɤc dhՠ[5FVEIڬM U`e߉Ӽ,jL82O9iv2*嬹kE㹌#24k9*io]H|| 4AjC3婎?y׶~~ڀV3MBj]<ӥEB~1XfבqTeukvq{g^g#}AP/:_ۋS70o?| 0W7jEh*c~|^{ %UN{n@R5+eR.*+Rv)ydFcV~>@ kdxü\fq]Q"赩^T:*MXAEg7 kI/G+w^l.6/[_b`YrV>||?nQbv@}y @U*:[!'+/VtD,&d{U(>|++=Z]7Ȧځ3[JZ,i-xkzXӛ7jˈg)' h{"%+1)z(Ջ{O#OX90cW+=%! 阧#H:/'/塬iuDp`D%I"OZ(Ź OGˊiߗ1z &ˊz_?ׁcݼ<>k~v^! ?EK t+<pjYU&V+0_%ԔYV|k:0w̘8#Fk\Ft/՞*s>W"Zd pIƵ|ڈ%)XD-ޤ߲DoS y1PB4ރy7uڍ "0_π} m>WzwTAf >e%ES'b\Lro}E\-5l1 hzo\H.ow>_;\l{*蝊R=  ԃa/$z3#A/;RI=Er֗=OR{Zώ\ć}g{.ZNGu{>Io P^ɯVj#WJEEI ߑ] ~7&򀣶%8Bo8/3]GoRς/zSAR~<߃15SC7|g:Q?l41Av.i/{4}/]nڻ= h_GжrVΕ9^ۙ7@vC(@mQݥ?1^D|:H?v#k]/1zЗy-N v~N~K|u A g053ar=@㶱$R ( eP z(7F~ πNwj8FGn(9QYC])a'sMmеk{ʡbr־ ! l<KBnEptᄋA>׶ j'[j'!r#F+gOdyetTF4;;tHV#rΈ Ǡ.|t*=AЁۀi#A>_5zĠ|mSC}RЫ?$A>wK>TGfP7)@,5tиhLѫ sӠԲ1?eֹ֚@J9  V,ZF;ec3#u=ZAAjrgPZc/AÊ͙j>ݩ"H4Xx }TYaཌྷ}¦wdT<:qRoZ߮aUkV8Z}\e"]EqEв)>j^y $5^al\=XMSDMMw::h>Lt@۴(z,QxkXVXj^alk"u(wHXׅ}g)GxׅP z@%Wjh߅ |b|R@JRz>%î#P7ԎMit]Fp 5 ',RWP[wl~Տ9 j~Zpt;wUY{\cAhZkC)ey/F GMu,hNvatP2UN;69=rq&g;ף$ ~ {HwnDg !>ygǺ;%x%{?NoJ¡Q3+hvֽD|$Fo|gxHydѽHu>'FmYCZ6mm}GF$NmDS(O!. 9@򝲧{nnWkaʴF~A>eۿ g=f# 05t7(s|'C N>Q{GOc:t~P]'Z^w(Ѧz1۔*ɣn|<ڑQZz{ V< ;zV?%sESo6 zG `Pc-yݩlPk||8jQ{E6es3}co%2 zdz o$%OoO:ן}_L_Vůߍ O<g{Oh~۸hVv{@6q損|~y~x{-~c:d#>?lu=ztF\و!q;d#䐍9t:d#7c!xrF<[lc!Y (Bz׊+^ng11|r%_١q݆p>f^Q]lob:d#~!GW7^`6qա{&3^́_:d#pF,_P8d##و%lL@6BjaMpꐍ׉Cr=:/neޯm&zz!׏(~#QE3+Rkuq'[AGݿ[{wzu8t^7zd@e>Aai;t^/ 0CU]uġU >L O zRDq+Ӂ{~7:abGD'>CA\Icpx8j8^y)=zMKD/4Ei;Y3ZXc,-'B]X\, m#:+G4-c/'д76z6Z]_PaWzP7y#^? endstream endobj 1467 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/heatex.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1477 0 R /BBox [0 0 420 433] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1478 0 R >>/Font << /R8 1479 0 R>> >> /Length 37497 /Filter /FlateDecode >> stream xI%8dj]ۨ-ejPY7K (o/ g'?kq˟翶xǺ_0ؽ.~EAM_A{mY1Zt:/w=0`}iJ8v61 //0Gle2sg68}-"#`¬OgУLypf?(2%T6CEOkqt?}H6G^ 1@D*ud^0ngp0KYq_fmXi@xo'QܻI!׌q>̝~\(Ik,txiDRCk>MX28VcE H0q7)[}[N:pNA!>SM`5J?D;=UCY# _hL C䂠x HR1#2smʫ%3ٵ !+v6Y- Pb&I@YzIRX8J`qeI2=(%=B_PeZ mҋ2g{?#*Y8w¿>ZMfOV 6 T!سvA,BVPHq2quebBq)'%i h3Y P&cc:C zH?꤂Bf0.;-188>sw2"VXAw 6P0\`EuH~Q_x®]ỌBb뜼&?r)0pIk6,%fwj }d e#w40^ā[-F&s0HfF݄_X:g}-?zDWNw~N׵/{{0(kG+ 9$(]o qdPͳPl82^U2OB8*rjd 2}QteU+&q+,l^; >`CC6?!71}Kon`jICue>Gҝ`KV[ce&n9̣>n{ Ǝ0¾%i>aDcHP {Oj< ĽJƂ:< &ë53x5ɹIgv@Y{CbswOGר/h81L vIړX8ZɊUeO;uP܊`*tYl:|)7>T0f `a\]ck-]rte1|J38LR"yB l8 /p#,- Uv=ؕ".DOˎRN1C+6=BZcG9l,)v@i="UOy +ۮ_WLH"vҨy٤Q3ڇ>^.,12!  ɤ! (6 ?>?,QE\*5û{}[>uY51rgQ܋-NE^wEX0ۮip6zL}mB9Pq Su6 ̤swZ бPNoS~eV9fm+H]V,\db2 y=·|kMe;a3a/$V>ذTrW=@n|@ 5, ?DlX˜%֣f& ^춷g WPz0v' S~乹"_0h !Ͳ˂GK|9[PwIN# <{RFl0$vK`e.efK,(HL$?|H&˓x@"YEr ݏ}DtȇMeDh Lr2@+NfO~rߵx5a6FBv[xB=Upy4x<傀ƓQ'E 9< N9Nlu2Fj! yŷI!2t§Pz-Ql6L("^|w(u(҆)jݷ𥤐)d5jgԁ-vKEEOT@3ܟC$4P5#; V J#]&sok5AjrZޕ) N~ Ȏ1.P0g qȊaҳ-j;ݟdc?@4Q]W$ɶh49߃4)5=Od+\ Xʯj GRa\0H C#]m))*eǸ͇l/iU1`=q7_Ԫ+֓l.(X[5RgZIW4|*m*-]rbZX (vuv߯Zv A8u .K!0U5,Lc2b]' 10FNC@Jp>{U ?H4OWqH1#a6wImr"]jnv̱,Ӓ;K!+B"D80`WM8QmK1&=tgW|%C,j %URSQmG5P}0荍-"ɋ,y}PNd2i!;0;~'l`{Z8@*sAz|*B` 5/J+l^>ߢֿDcXdTS&Ey"0fMږZA74MIs;^HejC{ +\YxQ ̆C1D@nR%٦KRv KNCA+,8NX'I酞JY+Dxz 1t/^VI \B 86S6Ia_~iq^vVx/gw+H?6juu0Pwk*_%09_i42a8>4͆w=@!b1n YZLiyĩOH']5|@&+,*mi s QX,ĺ=`Xo"˷R9kd{=` ģV~ Ci&X$|VrT(QAgV@:+}2c%E|q5e*j;ϙ40b K^q\Ǘx+2TT A&k]4 }`%@AeVSB+/0?rik,-.#s 3ZUsZ@;z|h0zMKw/gEBP  9ɌO4_fXd Cv9?N- :k(L;?с@_9ΐ8=gD!z7gU$MOpAپَwzx.ڿH}ێS DW KJG; z_4^Nh(8(PE7 'Pˮ(5Xf[]RF-SްUݷ6Yp2 |b|4s ylt,,a+jEңgX6g)OOf^ Ng*A>.I%~3\A &ǶHd~,1yYrEU<8TJ,oUHR` <:67bY%PJ*N!&ƪJ{VY̢=ûC-RBRNJ e㸖^)g Є?~懎<*C(l"CBZđ藃BS]0Igw%t-.ߤ؅S,5x``c7V3o`˾\D%M];ΑID Q麯` 06H)޻$cYfF!EF,n1#ka#݇yK#$*dM *(MT^xB#{_^nZgZ["H r:Џ"|Ƿ#6RR Fʀ57Om*^vrv;pOztZH!W@c|ÏjKa̳C RtCm H 3 W{eXTd%0R};9K"RH֯= {`_ hL4G%mMoX#ytSKIW0y(RdgÇs\Ĥ'U+֥r2P= IYP*(+ ׂ ,,xcHR*L+S>rkVDϢIpG25{&38و00z#kAZ9s2t(3<׌UP(4Lrs"K"3dMbH[ѪH,)؄B-*&1SY)5O,;t '8tΝjT jT3*0Ӟ~W|룪MCׇğjEB(Z/SP قKZ]|\Ǣ zl9`HfTjXOp藏:`Ũe t~SIʴ`=:#&2ؤ,+|zqrV-U,a3 $N[h}s j0FAE,4{лWI}v$]ǘdm frh+&a]$Z ϋ|$ՔL'Ə2Qp<`"%V3lo B >/}Iq[cY0O1 Qqm>ʈm[W++lK0{M,H,mP},XJdp@b /Dk#ޔXeûndǴ@c" Kl6(P5O#evj/Ũe p$ei#~_dt+уۨccQ*{GoX" _N FnB\S3zw 4/LnR\ӝQ*r#ۇ "j4? `P!{|4p(* 3bm<IG6{ > rcI8)Pp,~~>:Q[0rz*Ԋ˛7K$(x9pL`?t8f\ſ"F 53jEɭX 2sNf O\$z^[Z.6,pOC^A>s>|2*( 3|{r~ZrIE}˚H!d洡cv^4$s t=Zy L1%gQ:bf& ca8yU+3GuP9,+P1>RZZB* >,20Fa+=SNvbě3%6 #^GƇ0r\ǗQ\u&/UVJ&Ӄ;(.\ |d 0%6=j=[tV%w1$Ry\b'hmשbPOb)S|^l\:K+r AsQFb(pHI܍t1wW6Rh#;.diȰzHjo$tJ74/ )msOjl]8~G<E=|ݹLRhoJG?4ͣs6[R upz7Pjo#'H1;W{~*!<dzErzX/nNnrmSG 1X/eR8sn,/MC{f׊W Z:ҪB3PU}EO<! El6~AD~pQ,Zښu$ X! @nV6?c71[PH?C5 kt6$J{淹*!4*jO9_跽ݡ-rKWfٟ1bX`nm*78) Ċ캻 Ljrdzti ;ХR5rbƿr>mzְ: (g)Cj/pY*@m*nzˢyogBĢT)lt~N"P7^ W/hu};*EyMԫWJ!u$V)rE,v%#^|/`~]r Zż_g@M'ȩ} B}CCgתAz[P Xi@!`+X`].R-%ޝ jMFA9WVS=KyzqR+N*2!`X:/wI #z̆W<#qÇ7b!a'&#r+'p@&PV鋼֎r^NMMsW ..IWx#ae&A 0>T(Ąb ŭlʦ0TݖhG g 9xbCIˇP( "\is1-l۽2 d HDod#)L#гhf2 ]3) k=(tqjZ%m }G6zZ꽂B i4$䂢jS4Rkڝrh꒷ f^TRr)!,/u() V.)%+ڼzw=|m/IGHHUIڕo~,k< ;+V.?@=V,>;Uԇ].ޗ(lw #7Ȏՙ-7J&K UC2L8NZ3}۹,Z?6itS* eѤ8 ٻmܐinHc,tgM:@wE*@Vܳ[Ӷ[& +HW@"4-e2c֨P,]Fuζr#kؼmh$J!S(n)F?ɀt*#sۮw`ўm|d2!;VfIo#^P+ d•89"/ܩQ5"iqd * po&&ˤ_ )$Zc3N-gHxȒnr HbTa! dlpу9rtR#5lĦt{JKdT:!M6(:ָ ,Mb!]Yh6Ra r:C)h|~i (Zi45P(\e?,vȗ0cwmFQM"xh\&|4ӦwPXE {%"2b>{BwMs^ln.aTaDgԲȥF!bщ*J+_12| K2e(B0d;fgjvZa%uSɱ*jz`k;yxܟmh8vCP#w,&_Aq,%-Tj^layķ=Sz+k!P,mZߥ߷"e1T $ >!@NCk¹q"L45!ޖ*(y I=Av,K_63qT 'H'0j?)>qo2 )}n}DIۃLeq5:@V g %*} k`:DpD.? PM2A<Ʌ=Iېd9QF-pR}'y{؀/FX')laarȻ/ё~KȽm*=%H`p9&~FȕuoϱV]gv Sz (!yoI:aX9a%*up}cQ{~ SozDŽƱ~W  A CǠ´`/a|&Nz)5& AjCIMϿXtS.;!~;9<9B]H Yeiuu\D+m[ol/9w$8R'PO! &2HiR C~X}1jno}tj %?][rl; 9AGȋY9l C^gY̶.GrHl࿨;!tÒɌ&ñ:K@|W,rRkt7rv{c5W_pٺdɨ]=TX'RQ6 ;.y^dѿ-]=Hw3NL3JlÖLG׀t +NۃIzyF- M5YITI_ "(LI/d"8NzڨE,gLM+ +Aww9Ha ˳2V(fˣHfy\bSCq{<@6 簚ةr̈́M!IE&ӽ0RSGgxH\E{Gw:zr[yM±h\1QdafQ49UAꞰ B,q d8-QQ>FIc;mU"XY5 Kbփ,RYQ ؑVkL $s2!z $ *#N VfS(G{`6p5^po'k˄Q f+PCLjsm}YK]r9 Rx)\..r+vn.b5 |Kw !S$hCV'e2L3뉾%eں$j+֓Ib6o0VTA|pT17j Էz8F=(!~!=I>E 6q NŻ!t̏C /cvpL(f&{eYB4XYаciHyA טZ<=ca$S ivU|96O9JUG_ryXpάꢝ0Ni(xL^AҗPF z>7m;up=ǨJ6ֺ X\34RXmpjش "iͮt.(A%fdXDC֓OQ\c}X$M;k)(Y2It@!u$UrsFbc0XJ>k!:֣XQSܬ$ $ 7k(ZHm"]l'NrЩE,;:`>+v~r#SeQS@H=:=iٿMOڥ2_=sndR[hsTQ@EE+uȷAOd FsKQfu YMH!0Y(cM[I)E7o +ϳ\pܺ/[^=df^_ʷ|ͼlvBD%-CzhYt*d#$]*d#d]b=mjg>~1Җ#@@R0|>f* P C|(V2@!Eb>7%"eAУGr Q惽|Ah2u38(֓L*3|(V6NaE^!M>{۱ɧ 5'Q7%M,_uqq]کE,j}@:̵xcK#*oyiMJ(̿! 4bi\1eu\C|VOy <b!X=cV,! H~  X1Dv,g2|5$|0Љ$[l_b"FMXcT;P2Ӷ lgI?m?΋iĐH8QB ?f l!aOY~OdVQ  gѵ:,.ʌNDA%=OCX}8t8S;Hp S܍Nw:QCchDhgzCjbgxpWUD-O]4DrNeF!bѽ8^E\>XsΟ0O1xt͈E$y=LAE,EZk?Ưyw&0|&qO pS^9Vc5yS+꾱蚖 }jC7`_ 5zj`x#iƁLp._xz/\4,]WNR¥8Eؗ|H)|ҩX1<5%Jf\d Ctoh\$ga"JݕW83 uJ9S+Q590V.2I0;-I']2(%&oz+&8}v^0+ďa$Ӿup?c[wI?+\'NAU&)ũ)?vAvV %钿u<,3k:ĵP&rD' <5,@*5,@4pͬB5$)J~;5\,Z%w (*,B{6r-.ʝ KcOF U K}$4BsUB>ihgzS01ZjEwI!Bè&gs:6t' ;t Y殣Q)aɹ`w#F`z༞"+CE.(`XO B#}c[*s?:xV4IUDg6*[pf jk (-Lj+ e^8p =U=@Ay:pа[l2P(Fe܎9wV*z $grg*a8/~OVa_Pb0)T&3aF!b%ΎK 5z0<|hefB3v5/5ֆO Xl\B 2[V$]ne ŤIOf.}Eg~%S$&m0O19b҆eLa>PC+g&I%2iZ6Rm|vP*L:Q^Wo9VKcN. ?;;cl LGM(/4v3Qք?Ayѧ$$W($퇪TB7w&iBGd_:n<'AH8߄a>cS4 |O̔ I5J'~U>жR7[(7revEQOytSúq MCa'f*z!'>1S D iȳ̂Pδ"_8X}!BWEZyu!֫B-<"|\?Fm Aj>o{篲ڇҾ y}GW` Ql}/|>DW%hMEחCF[Obr/eht. =/PN5aT<R_NXQ-U1i퐝nqu( Hj ztc }A}?V>[b]cȀ5+{Y<]Ls}pE9ېDj #f5=lw%'|vyKaHOr0Х0';;òPkqY=T:[O$D9`%94$C^(+X,4Ҙ X)%'V^#N!!W*U(5KtMLA]S/*g52J(tU&R܍ΑK˻GA;~x2be-I*iv;;I\)^ξ*j,,yq FaExOy^nزsON'S 2@ZR|LIzQ9S5Ge%]MusrC[ڥ.Hva4̺ynwO"yGauw{OZ*Is%mד'qqQX $UrwRq'ŒkZE^}! L?䇶f$:CO "S#~9"+-Ek {.^EUF!bEmJ;cw>Xp%SURV,)Jօ4Nd,V w)}a=PuJFn/~v}$!dPX<|=Y+%ޱ .4$ USy5j^E ">-: hTWZGD4g,v1rËp1XUOxx!s]/1BGv|.Xɥ>?F8qH$PE1/aŢ1(CUCm!p:b,+6Pa*Kqt&Qzr^X wZ#ĘQpW_u1HXiΑeԺY/Y aÔ0uB$9%}q> B5#PޞӤ5vL i'  @vkK1IF%7K X,FfoӴcʀR(U1sLbu'!?4yzZ(B#H3ALIDȎ?/ʛ\O!V"|>j"1WQeI~4X  x `3 6*L!ܲmѵDo+M8d/n_5kgOF8͏1dI9ͭDK(~4JJO^+^^ ̜|C!5+]ͼ"#Vn?jE 7X Mâ,Ϯ=@Dps|[t sU/˖RHbG 5z):ynԌDkT*F0 EU6",;tGyv;7=$cR? P@ڸǕ>td N'grD(p>F ׺_'i[6y#+&)Sv/qҁN7N) ×hO.ˆ(2~=$t/J5.Woy}̧7QQ/7]C|[XJ{?h0O>g%j0U!^uv2%*z9rљ;,V3)> ̍}WG,N&)G&mm3?"E]OS~'m*vnV.n׈CE& s4T)Kt=4ScP(n?tƧxD?T>t0#"+܃#G33 \@5_ -;m#PӠq=,bu9оEKJu>Z7qHPb*|q\t. >)A>}35V_@+zȸ,j(E5o@AGwh=G1a$O Ͽ~&"`^b:]?:cKsǜOG$/m}[Y"SE:]i 3K.XkFBe)٬9^%C7 TA%P$6.TN}g "8#&]#]{p?jlw*u ىɆP`'[Ft&]||a Mš0Y9ԝu41,zIʬ? % dTO4*)r֕$ &z =D^tvG/r~TXj$ WqE&ߕ5WU Vw[&L\^瘓W_!_g`uV̜q a"h,Y$}=m CPH5V9A=];HUpeHv"KNÛ!IK!#Z0MbM[/&D*]5u YIZ _.M WXCtTpZN ϴuMK{4J(CO;>=Zq`m {({躙+0pb9xU>m+:lK|]ECT\R6r `wJL- p| !Rr¸+Nڰ_'u![ [@rhO*eV8328҉P/pgG^*^ғ}u&W/a6ܸ!ߔ\pr8!N/CBBA7{+i%)}0 ~̇E pB^#-@mӡY3Epm @F(`}ceɄ1m+!6;Q hFԙ;~vq\^(0f\o^W f^p66=`0u$جt8⍯\&l3K벦-k!r% Kys}+;p2:L_pP^a4ZEz:vׄ37]B$`=1\_45lZ1_Ob0խ8 h׮@ԾѐFL is>'@F0=CwJDz%彘56<gFi55LE_N%P>''1)̀ Z4*P/zL46`or)A/U`"FZ`L([x %ն|Q4{\gpemRbxF$I ~bK}cn/bOJOWS9{20J$!9 ҖNqoHTC&^ m-k1+ Z$Z_ۧ $dC 0yuڰK\|?nQsAg类.'=zG!\4^F{n!qd08Ժ'EU\yAp*?),W VlPӀ4u0*jEmTL&=C TFhM]f$2p9#n9Ɵ}9_&ι^0` q)`\8x"u0 9 9|}P%+7V\GtϚ\:2#!+. 0)O9I79K"5=bP yFX=#:sZXl(T}&T@8i?mdMDڲ`pЀZ`@Z7-d'e\4"+o1l#̡FYkC{P3,Z.EXAyur) TǸGӁe&u 6gʇ.F:c͆KmN9ShNBhuY 7={3I@am(/T; 2gH!xQ%+5.(/6}9 1U!htE1;HXdȯ8#a eIzA~H@Xnw>& N"`OSbgI1qnD5uyȹ%)Pܶd0R+#G} s3۞y0`,K!8i$$O}ҡe؃[|`m\]'}ێSȜzCO?CotqAm4(`*f_eZ& ozuϔB&%@aLuTkm0%F}iayLbn dfK6`-|H8d{Ӗ3YHxw>Rڑrj/;Rw]80 L=xs;fcݲ6>A Z`bhjgdjHHB8ݶSm9U(<w[7*Nru.o+r-9 a_]6OO M-m 2EX(.Ԯ'1{( V-ymY@av/&WN %'>֯&o ?@(0'S_ s+;bsLTX~Y2r4@')۸S("PY@"~&C?^@LJ7$܏|(HuCcaOHA8  E5IgGT2 #b. P 7 w_K*VjCK d)̼-ocraR*|`L!"5Bܑ E ?d".lɕW+}~9EhȪį'*?]/y+ |O!4COW0=%f(GIEal\I G#q>9 1|ZIeJd$K :oBbj˛qGz.aOn:x|7rxcW[Mf?E/ܩʏ=o/1G?S`bұ%bB皸Kl3r5/R$g>/1>]U\`ش,֛&΃mf}W:FҬmRkȾLE>(}O\D>u27nt'*+c)@Df8aR,@O U% E(1| JЫEo=e1^qgL_m59"5 .]݈-/iӵs4IÝ#I2]$٧`SˆӦseUrЎ jRXQ~wWƼ8Ja=Yj'/#gAy-JgW~N#u;;@C+*7U0j5 M`z@3|-?2+qvGןamuSK/>dvFG,o@g6Lyd턖4̞%)qAuSC HiST?|IGQ ѩOcSJ(*eT/QVAx dZf@a!d.`+SRA܇8Ԓ־Wt,.0=0XvG.6XɍG q\tK!n*/ osߝoP Ф?wL vhA~"$7N\|׉KK#Plڝf_L=T%1rԛ%|" \ 6 ~{ _zv% S({PZ2/6q ٚG`?9;%nk|\^y#3Ft@`1__QA'=A7 P1R4_iDWOw x'nWllH\sTTc}Ht1tÎa'lh {o20|9,OJdžqykp9/ֿ>5ON{i9cB&ˬ ^]4b7{ؤ4 BMQ83 H:un;c'=9KPy@=J@򡻷9O+qWMt  z 1Gq ˏw-EwX1ݮAjy%GEqMhsq@ywe U4o eNadbt=7%~r8 $-6Asa)ߪ%K!H0ˉR2:8% {v)C"Ī:$բH{MbWB.C :/-p;잹g8ڭl"P8u?N'1n3Cd*޾m(yԡ v+,i}FJVf+'V܊ mv Rb"ڴx Sؗ^vPKYIv@ڷ?G'e.ͭpJ8yJ2c;;NClA/ׇB:Ҍ=fa_p (PCeaGhLtB_D5¥vXR S|ت ت2YJAi&*p8zM:%{a/,LCi\42-|5_Z:*v@wz~oi%0O:R eVm a&9ud*bM7sl v%ʄdȇ(V;ub03cnjG᣺`6stQ5[GU zp}CkX81jyVbߍ\%D.Z{A$(ܒ.K,TCZiQB++p<~~. H}{{BҞPq@ &[jTû3! 7=(QoVZg!e˭ a3OBfVpP~7M*Ǝa‹2d bL.Dޭ;E Y5"yW/Ϻiw2vRNq!p'z4 )\ٮ8 QCfզ-j6i~4sЗ;~{ټ'mjv'-k)X+Z]^g=w}:RUBe`INz4BeGf^]V8A ~>pFKOW1 V=Z*ܓg8`cSҺjUeuH*9ϤDyu0%!GY}Rꐕ6pa9|؁Co#h?N(f^*kA*H9 rXPPF6ځ/h"XAN bm4[i-*\6Gp~iVŮSlJ%}dfъ7 0YvDWk|Wv> JS PvU?l (Pчu3H+#O{2XNӣ;D\N#(>]ěY 'Xm{bx3(K+.Q(YE.Zo"rۊұ= %Pm;C?Q35DijRzI> [tj3§!O1-W'tu|JQ֛k/Ξ,t$]bؕw[1QyT;m6TAC7E]Ƣju="]Q% ڽ \ykU?a;|kUOheђ.T'*u/"_ʭ+8[Ho5g}c+Eី?~#]#6bظX!nfhYHP>u,ɪ(g0F٪)vbv4FhΒ1R|Z& rME!l7F`PeA2>_Ecjb\<~a1n"ϭ8YPBkAM@hܪBڍzD:koK؆gm]+9X=ރU.TķGeGC)nŸn*h^b/ewیnp}][["np֡5JPCPb8m!0 hApYMR0387b$ 83hLhUI(n2v AR9 [%[50ZNlT!NF4ZFT"FR-#TYc,*'4Dn6QfذֿXp." ƥ`#PjZ/buj([M:%mskke(@f0 !y`آRK8 ~`q~YO wkO7g,l`ݛW9$5B9JtofE(x(ѽz±O͵;B ޾+B u[t'lKtpA2eIi$~6簮'TmkW , Gl^c<9b"rqH j-xǎ຀;Jgyl,j OάN<{RԆoN:"JP%'N g܉f_! {Z*St}4WHBfE $"[w;a??ʵX^lfcQxI=ޘF(ʽ6'[ 7l\} RHa&|F7cQͮ$U ([/Q}fw*_Y4:(> 3>8rغK-3ЍP@zgLo WK?Vc4S@~ħ}%`ޓS$qy#P<5[OUzFCPt1Fw;P!|B2hX>#4 b@C2nʡ}qFz pŞцhsp;@;聠b7BWS{RMC<f k[f@ڋi msV 1jPioQ:~^bț-rfm3Wcn*4Z`m(,[ 1 yHX%H?|,TpCƽ&DEQ ˢ(OР!/Z6 MG\XK,M&:!C}@FCJ/ =_hq=_4 l~rC d((Ϫ1 ʾ|Ba'#ى4= $GP:F_g_Hit? Gld?!LǐǷO!NR?168+:9L!68+;/afaO4 `\eoH?&JX,$6 vN?N'&C,QkϐIgO(3֏H^`&l(`C&R$P?1bJ~;F'&U,-ReR.VB ,?&[,k 2ڏK*{vm Vxq-IP][N-ـD؝cF˥D/L.]FFB=[~$jU듡+x-ؕcrĢ@-]Č&Ws<@-cqivbY6B`E܄9 # #H|L{fz[F/@ӤڝR{{aޡ]2ryf.ZC ‰'r)c x E $TVJrX1HyU.&iD~5YV~fM7Fr60v{|+L i?I'WIa m=WfDc0c繉,EuzM5Z1e7/aEDmqa7яushUk7ڮmL%~[UKXa ]_bwh|N=ol;=769u92^lh[nmk5SX[#4D`냲H|'p#ڙ\F +Ote;;%3:zU>]ƞQIl+z譪',[Iޞ{n. 5JSrAl`ڳi>$lEkz:ј}0 qi+xw4^#na>MW-n軚AWIT|$9d~X> ȈBD,9hFA2ʵF2†]wz3d QgXVk(Om9K pE$ܧ{ߤqɌQ!u/+XV74I@ emԪ1(}uE]4+|*)ZSG/0ޛ5 S>ÒB[$ 1+OJ)YV9/iup DVpP5CVL`i;]Ģtܒ#<nnι&|+6wF7'nSb&S'mh<> \<{:( =@D/$}~RXTm dghx8[-@N/:q'OVbKs!]2іޣ-տ\ce),PXqYڢn,7fR V.~IYLsO:J|Eh٭o@Ӷ^h'mC-,\Mo 2ZR ;aױr) nfPo28(SyYOױ(pe;u,1B|iʭEr+q_v1.ͱ* A=in 9Mmd>^<]}]DiuN'e 0G iiVqPLgNtڴ X l{gǭ[6X %?i'2WSKsk#1bbU|0ّԐ{LUXmNafHe5&FV|@Tx!q4Z& C)Ka<\RtP(;yݼ_qfjKvl EEEѳ(F(oH!%' 0XHYDQ#~vW*x}0RzKg*W"U/f}h4UW#2Rgٿ8k"pt zGe?!k<r7qTPfcuނ~㞳PQL̞g2od/ɛeI+m}M& D& G_QUm~2b l":e\#G"wр@5 h/{MXN -6uܶ:XgW{p{~6f; )؀@5> eqK B H!'D$4oDPu0IBCYh}껧Qh" d^ R8x[& (=exu]88`u4xv>#{/[8c8&8t5n ob[R2rK2hvfW0;1DqY%>1+IAtc:05ud-s apj !؂38GcV%A&&;vdEn7Y>͟qJaKW y8oэ{I/)+n޻cQW~j]iɾ@]~RUSoe])jz _[7aIEW@)TBU#ϩe ?Ojqg-)feNkRcE7/PE.._϶uR ]H*_b> 3U2n~X=z/T^2W^p vQZقS_."A85@ɶ;yuix={/6MbN8@uӻoAD(8Etx-﫤t3L<m"QmnpT諛4Y ޞd"lCK&MV(BKl~j 6w{I!n6f8@V$vMݼˁiW: 'Ņ;1qw| 0$off{^ݼDlq"M'v|kdf0LPfPWF #RRHHapgc?T24 til@-gJZ@pNȹE؟Bۡ9Ra| l&Fq7;{)nw i,ۖRd*mrT}۲WZhrTٙN瑽PSG/sІX!*pWW`fZfTQg|jx|yUШJTy+US5fmu#" l>_B0ۦ 9j^H>DcL,^ys)+)Y,qz:,r2뷊}{bb].RfHԔC(9Y_ڶ ݡR{n@JglU{">/ \ېMGͳ".3ސ7Nȿ_6Bd[nm~m6BwLz(޺Vx*2zZXWQf E*)su9T:WpZ _^‘l'xXl\v렱xU[:xblSj }z@CPlBŠirV|\nPԌylY}mYMTYNsX2vd~3fYvDnUxcu~ R<=v)HOr鶂qTk N_2X'{ʜC4E&\:oN [w"½b>M8pr%M>nph/-ʢW\Iwf0ns9|/76 cEWUUOtȁ\GԄq zsΙCEnvTC+j[O9gne 夃IsQ9%Z*.GƺJuu2Na=/& k2u~:Ma6gPbdcwE5dT9(pT#u͂-_TK`nPnagzla9^^5oUd|û֪w[9 ٖb AApuXTs. wŶb TpeXᦪ׫/<:?I ￳e`e~"`3٭A}4kӟ]"KTJ)Dőt.Vn*.Ώ9o۱ .s)w$úH(52o/Wo/~]_)hʠfMpbMs&X}moYqyl.0;jFRibt/^o8j`zm~#ceQI8]KD9Sտ+*qhn8Xp{K3 *Gv䦪2j ^z @ٕ~fN-ar"UZǭVYfZu{U*kW}SM[Zo"aPD{/}XN2 o~Q?{7XѼn!u;5X |!*?^i3mn!E+^y(VáL}(]^+Vs}$- ިQ*'4IrbM֑]83c9僣K6_篕i=nNORӃ'4oNHiN;'4KIRcr-9_cKiNcX8gOҜ{A.@!EǛK۩&NK8KKXGl k~Wn樀<9*TOiv4G;S)QzJst`yJrl0zJst{JsTz(\ĞҜL|~6e)Q)ͱiyi#/_R,m endstream endobj 1481 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1654 >> stream xT{PSW?$7/TfA\۰P&pQtjTX0⣻<*·ؖj"+ Rq;eΜ3ߡQ5'J-gO ŻDX?<,BۊJC|-5)*(6s IK-(,+ݪW Tl.SF8/7_.lJ5ڂB&_\RHV+bI* d%jV|U>%Bh=@J#{$C #rBh!z -Bb.qJBUS/m6KlmNh肘 JRn6Rf6+%{$| dz_aĬ ܡPvZ(q C}} usΎĚ>2ގAbؽܚ t7vJqsZK{N;DXpʔ/O&ζsS*j`#G+ԁ[Ehwtմ4^[FuCfکZj|D)lF7B[V3:ُ1nIGv64$;W^\`*3H|ք Ҹ)ZZ)/;ڍ8݆+=#SxeQC$ ,i7JL| YuMU $ F?{Xܿ%k./t_FD$Y](™;}|2S3eY[4|QA,Nbed,dATs7*ޘ82~bTpn3<+! 3!K$lܸlO/եQ2ݸaTtTZTKu'+}`[ -"~ƅ&W^^qOUu"r͎+)0}j3ݘ鿙6yo*9қ+bG&,&ֵ6' qis" O)Lp ڋW6n> stream xYsݿ/jS'nlml;IhXSC^Kv6}~w_쫻a ][ws ϺY"p7~ N7Wo&-=npѷq׷3jQNiH$[a.l&.hfV]I-4<å)i\^s~m^O 4/c+]-J̈́Zq!a%"uo.qy]"Z)A0IdP(h6g8Sd1R/"q>B)eWqnyjg8++XeoDNuC h/KtdvC'oģsWZNO20\Ntq<.lͣ=vy6c]^lʷ۠Fc. aͩJpIy<<4Jǚw3eA Th m5;G}a Tk=hk悄L3@?Pnt_P4_KlO7ډtZZ{[z[:A hjh 0T$HD_@6 A]F(_$;gVq~!u,m~EP~⚮i y͢"A(iGٙ0^HLPogQj^efKqd[L2+榁I ZtLR#+:87qC<,)Sݒ7UTb$ v5l&hR;ղ9N=d{*(~}ʺ"M'U ]D+R>dH ̴DLF(BX%Ӳ{yyD@6jO> qo@?qXqQ$kC03K>Wt"6QZ#c4k+ d>qYօi6WI[uӎ%Qc^avVfEw8_mTd8+cOye:pXkoyaUPO3Bzi@X`JD>v$`)Xُḡ9 R =~ >O IQpeu{wbK,QhxCbF`* ҕC>r~6oq#]胁<  ZR+ 010:; E*(8 ]?l ߌiA%'k F"!4ʳ\ʩT | g8#5<*n>!7#4s{T%UcC5P/df^iW^)nΤRQH 1 ~@nG ;QQiUq~0Wf`7o{S+{Sksք~ĜLM͙$@u-IF8?Uz7/[!`Y_SAچ DH|<ԁ1v9avAo#+wob崴iҺ"d WE `k~S}ͪL*-iq0MQ5"ā0l`'R)$]J #PGb>_|lk'CU M]dV5YTIke1Wf#T鮭~$9>3@ IKPs@ ̇7לTqw(nW;2Mx^PYn94l[Ou֠ɳ(ƯF_k݂JLS\T%Fף-\̗~6fۼ%+4ŧ1|ZK( QӪIn]9f3Pu%.Nj0* '7v?So jj*҅[ "Gf$8j3 "_HhIjbWVϮϚgٻYz Ô_p+{W_ez> stream xZ[s6~ϯIJ D3ۤm6}p@K͉D*){^E]:i[Cùtp5\~MY' } ׈z,( xk(<$mh(6I/pX AOVmʈb~ Z'Ɏ}ДU|n kWDi.NŴ9Wyt~V+݅3<D-/ &n2=6:vDٔٛfP{ 7˵__&#A.l#AFU _DWyBni06A0\P|Djh,AS򒐛aE]<oGR eeזu\,\U,JbhGED἞qFGDңˮz>QܐeR(ŵԀ'3MC1тs \ lɂ,X,{# Wk'YkI/c:Jtמ^H.jC2*resF ֙ $pi(W D=, L՗ġzw[$/q, M_j%:Rk{䃾kDWXpj =CȦaW7FĩңG 0֘ M ^5:.zwLnӃy`"J2T zj._e%\UmfW<^a<8:Ykg9(I\|Wω+xiH(+}aǾZw/0OȺ S;$:g9mݯuS[4fM@lrv>>yV K%/fj_FNty4/%lj<靹'"1Q:`#C9H}%?vIBp/;K en7omc1g:}&y6 YFi /O-(C?eĔ{X= s)?UT`VN Q|B)cf`c: ҖM{23To$i{ٹ+c4k&jZ hnJV`6pH댤?ú !Qws\{{vt[M4ZwgnfX9x4$Khe(q,WI=R4,Y~W+ )sJ)W;$l*̢^78//2D urchN0-M]V0ȢUXt"3ӵ6C M>ҽI]DYcZ($ cldfv8{fߋ6 ?=C5v.+9^8Qlq8d =RPH,hV9jD977>0 2R&JAXAgx pi3]D@uOduSΪ e1ro;ⳮSPDWD9l1pt=9B s`9<"L~$PB^+VduA6+JӥA^wэ}{+Ɓ“C]($1 4tQu.JMm Pw?L>s2IT(jC*K[w^tqϡ4,_0U'n:݇O: MRPl'\|5+Ճs:XC007Ѥ5_6+- n& 9DXu~8F^Y%V qѴhw>^dCm(;džt<; 4Jm=̔y _id sV5=GJUVk-2I 7pe>@}مoNQ\tm|լ<0 fn©>^E·@GB܇Ǹժ ?P.@7\z5 @A{m L#|இ1^hv0"x4)\6>~(m\N|k*Iݭֲ_8uNajӼDt?TKw;n9kGǛ ޛ aN@] 5$A2jG7ppIi#J6?Fت%9 "hs1pJռ@oM endstream endobj 1505 0 obj << /Length 2486 /Filter /FlateDecode >> stream xZms_ɗyW`3uZNɸ 'EAB!AYj|w @DЦ3L',}v@4x}HF@@'1" F}(iG)' ޤVo^]^G x?x?^/8 u1a>gy2lB+ HeAZX{3"4#X{*O TV hgvܜ!#l׳@h`SD/rBk4TWwݼ3~읮SJĉPؾyALh!LMRC)Mp_;8$'h ;#R5[jTU2qt (t߶ΝJ,IPxEÐ XXQ.dB\;~B$yBk'WV.Jv v@8QwK ]@5GNxUKҋ/2h>#-0;hQ⣃vD#LF0h}d|8Kn+w:#y4Tӯs"vŝ(V>ǾxlowyW:=@vDWE:;KX6P@ܝMK넧@¨jpŝ ?B5[*̀ x 쬍7gw{wSTz*~GT:ȫΡZn!*Y_T$`@c8լU`Ridž0irN U'LM TR;i'v%R^}𠒜+M(7n7hvtО\1I@=68]iucu;(CqܡDhʞúvඞ4։ϥgg=h saYwkŢVFPƯ=s 0_Z_DCH{~"4}UTEGUN?i'iieZ)/0dⲫUb~k  p G۬4uc~vq1/}wyqqH;Z6=J"~mLVkḋ! endstream endobj 1492 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/sound0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1508 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1509 0 R >>>> /Length 9295 /Filter /FlateDecode >> stream x]I:r)Ap:B/2-t}?11ʬ><ԟO);J>v|uhE:~7`\.iO)W˿f/9m\ol1a+wm %~m.):lԚh */7%k )n{ܮRO?Zi[93駇yОK$ԨbZQ^UJIˆQҵ "T(M/7Lsn_/8Vxwsh_v_'K,uhJ5rv;?bp’W'BO8٩'wJOΧ}fףs,q3>"Ք7jA7ƨ0LS%c#w&iSX0Xy=w#t=NJ,=ڙm,\$r?@G"}N^'{hJ>JJ^5ɰ[݇jNt\gЧu(Aq29ۥ-v"ldou6r= Գ#[>I;6|Ax; oM JObkvr9g7hS$t9[8LND8FgJq;]iP&ĄF/385[[7 [ (LO7tP@y5vM "-Ѣ{) /C4|nv ]r-}~Yz~& |\hƂT68V:dza#c&<Ϣ?6rc2[<(R{fho̎,(.VSUZ? U>PE4jY\1]>w*mLL73g YEXE'y|#9w)gs'Q}!f/Fp0 DppM\?"I >ņ┳MѸe1):LN҂v@K["?b~aO8 :ªsddUal 2&>w | ELd}t$?ʀ$:rn YgpP<wƒ"CZ1 Zh+\B|+$3r|ϋfYma`Vl>^}!;}jNe}\,8QxنL7gIUOSK'enB,5I gbUWZ-,x}.vF% ӗzd}f2 V&" ׊dO(A@٢pZ̬h6t[- y1yc91 8\X 3~N]xVW\+wB@u')jI,`hX,&.-p趩K'5^ zAZHGʓdwda[݃yN qwEp-nAaqO+dK!fMrd ZCwؘA9A~}h:tEq'g *>Dui#P-:0aˆN*00|c~6Vw, LcIrirӊNI;7iVk<lSsת Ыz`cVoK/`tW NǝbX)%stH*kGy3j5$])ZF' 4; a!ѓʇ>=huW򦿹iso,ҩB|,Ү_pI`A;[N~U*; C&x/َl P(.!4ן-)aO4:/c#]ml㦩UɌ˧UH)!~{ +i$(p\I/II$ٲEˢ '츻X%^ihyD/Gp>0O4DɘM? 81ؔ#.2 tkܑRSGʚa'pKEXsЂv6˘ tMzK%ڑ(#_4<˚1﵇6g'QVZʏ-P,">Ԯ OTH3pt WuFʍ-(!h~aO0q q)A4heeVXl͎* *2~PS1*p T]oB^͜W}ȮԒ\D*QV&Qm c=,e0|f2;U27Iq-{g?) ػ'4e=]ukHbIIÐT"V3w^Ěf/{M6]4k͔XYb~N7҆q"t0MI akI޻r۔bb!s}vy<ߌ1FIF*S?i%j'* iu Y oÍ jI .Q(Y9+[HK&ΐ% _VnG;W Xt^4{YSkn&d}1?ld^4݋C}6'~GFkitqdGkOP t*0מ~ dȄFj0UEo$h-^7 yYB'J92+䣽3\wҭa?vpJ䁞H=]>ȄHz2',=LA71,f\nX}ful D-{2#/&F*V ZX &<+ :q$x4py J~1{mŚ1mvfL;d,c o54HNMXp >Nي/봋oe0;V0c"*Ec7"cxgX!DaIQeǩjOFϗwQͻ_c݈%V,n[![lLPxCʭZTkr')-|!`i3gkL1= A&f8?Yܭ8M[k) #U;0MCdv"qv`X4Ɗtd6Ð/q=?LX±ЙBH' <%6^|۶IDƽVGQ#SY6'1 `孴׉H 2^ꑽ'vSBS-Mn:?ٔBD߃#;* dVI&]0AIU&IPqN٪lK<]Td_460Bar༩,;'tp8z6"]Df}S }Jew&kUe=?Ai5')N3WvYB1#{nDTΧV)JƓ~b\`͠Ptc%<xbğqs8ظSdQE 3ݚO7m}4y[e0,ov[4l8NдJ~)9ʆٻzw?qG?񫺰0_ p)/R{8U5mꤷqk0Gg~/k렴/a>EK4K mI_Jrsz.b;'h))DhzC" @x.γbw ,5W}=z#i/>TC~y%_:[wU.lj\̑..n%+:x "ȁ18D<.*x5n] l+w8 |\+qooON~v#75wQFafWRM? (-DJNM5}2)҉KP f?\~g3"#\K.r$҇0as>}9E0;(߾R֬E&mA 3`0b{96ƌWCqQL=^B;C9.n_(,$nsq[`"~\|sgCöfgu@>~05a# ĘvP)6dN[o*Ո=sQP$ws[~v'KgwcTEbLEOpA; zЦXdeeX1TV')].0,@cϿ1d:ESy0Z=ï=|݇>B5&N}ۉ禺O ඪͧ+^wDzx>UcirG~lzO.Beo)]Щ'Q>w׀\\mu*bUnɟPPGiW@HjQ\-BE|xSFd',堲1пcKvXXGxjKuU B8^&~xD?7ig.DauAÚOA<3(ԒEn>R색k2Eiu`Ul.9u1w8.Eo n^Y\*ÖDT B )ozB.G'(3qg8adQeT9 4i' c >v>혊#s$gkoiV*g,6mC.)ݥmAE QT;<.|/8JUd Mj|o=\S"~(. s`ܞ.aW7jrz‡zbyvD&jԼ*\#kUhf:IүpQm_"). \ܢvXwzxurմ"zm&ONċl=e\<"d8SÂal#y"1g_Oy .(3 c&ҚZMl wA Ww@.6xluzկ;p6GZ1x4?zg3bJ&Ihu!gmФw8Hm$IѴ ^VO7KLg;% z\EYrɨ9:X}jdj## jD.w^ǧ- 1he.~Mb"}wΘ p#}E ,DJ043EU5mNZOoLC*,{ 7$nR+9\4Q˱/k15af3N,Fh9ađy3w*TVY38%ĝ/ @THKQ:C6gߠox}z8^}헟*.Zsc/9x$&4AR(uْ)V9xڏaD@Qf U_0\ }p(Kv1ӯA  `e읍"38`45W5z]!D d>ev>YǸW"cnHaq\ad$9{bt D4&1KyR}%$dh .RdHa5i[ zaX*ʼn\ȢB@UIVѵJdOk7lL$d<ֿ;խ"[JvaI cF0ۘ1ʰfO6PѭFZի ]5clmD zL4d zƻj x4yYG+:TUj{q }\10嵇?eoWJp/y^N#߳D&ײA G?efGyK!P\b6_{KjM#A5վ5~.{BkrqiLʆ9ޠZf[ZOmsj޾#U˟=zK[)pZfZm=j#kݭN#RU,4X-sHZud4hU݆M5k>"jXEؾ{{5ombfJ1VgPڙ(Xc{¯AZE#|g>["|6OI >wmY2O_5;ހYf헾gʪ^C+nS*v0{{?k+޾ۼ5jY9?٫Q-`K\r<(0ӛz i+x 𷒋zDs~)>OHCyȇsm͌K}w~mH(/)!t9} j'^'V#~{ȴX<=Io{NV5RRVӄ.kOr/$[ټF8{jXM'Výq4R<[zb =M{R}mƵyM35p+n[ŸXMo'[X[5qm9 O0]SOo>OXM[/zMM5{r45}R8Z9|4zMhkDScfO8k|6k;o铻Yk35}ŵ5PR'?Q~5}jſ? k endstream endobj 1493 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/eigen.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1510 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1511 0 R >>>> /Length 22672 /Filter /FlateDecode >> stream x}I]"E#v;VÑ~., pX ߿_?IWttϟ??'+T0? n_ܭdj%"\ AYy,dl ~mD?ZIՕRzd(Rd5 #ᮺOx%y|m[E2>Qz7E88{nc8rmŨ6s;q$QX/?a:['ζN7aԞd<~mcwrb#frҠ}^F_36% 끖ƫ Ml= \ dΨbY+4 `ĶiA BsZP rLm8;ḿ|(!tD|~Կ jb'dRx&C8_[ɦy3bmTXոI<1yoY )2|n%ۮRIjt _ %8;K$*|~Dג5l[92" Iuϋ}e69P4l !a2.8)v=]\rXJCX2n1%q(CD_!E:t3,cMM(1|uj]dM?[ve%pv*,C)D2a)I4gQ-lj“iX`$* K:,2Z$E;ny"7!}jz-&ɨ8;x@Z% ޼"nkU!W |Os|srշ4R s~oS֦&s=MB{e23)RVkπDw佣k92b SK}XKVXAPSƫHט 6UMO0%X乷d>߈abrtY_ rȤXV 1[ElL3d&O$ Wt%'F;I<"Y*K}"dL?q=_V'!&ӌfTd{YVe*e_Us]E7kp·"йz. _B]&\]cXfv}UL*x*\%=BZj@8ĞWaQ)B;u-Ɍ,V\\}(I\:a3M݌ܰ.7 !QQ?GrM y{(:U%%fz[!vҍbҴ\x뚌l,2i7mܩx_o"2F .Eǃ2dr2$;R_0ȹB, `QK%+?/J/P)N1_`| |yJ { l^A;WN" }=nݲ j?έ[6PAǹuQPqnҕPqnz^E3̆:3ٸ':3u @~H%+zDv@32Fah,GIo( kCay7 ZDW0m굴UFz-$Y DKXuAyg*bVY |œbY( ^V_e,t* 0nϠ0k{M?ٞ7 lr y6*Φ>m37=0~m/m\}d#DmXb>si'  $ @CV KH:\ AEX!yi'[#ZCX^{V#QPCmL}r?q϶f>6{6N8ՌG]_ՅzgcCq/&T1U51$WZzy7tff9l?."gJlugmVaVaaL:iWT,Gl32ORr:\(r@~9x1o 2AE0\odx 3Ӌeٲmqkg[`kl>"AjN 2.%Ydl|} X? /Sת\ǩ徥{om}۫Fqu ~b&X(i)sTWZRmt+ҔIv2̩-$&sH9{V@!i3Y !ck(ȋAND.C}>Go1@q /vWphdE1V@CR;e QJ6Ho\&OA^ Aa+XI SI 2kQ`$07oYhT*Q#60kn3jpEKR⡩ ɢ*0:իQYWQDflE̛MyدlFWFFϗNQ^H!M9Y@M,4Y9p f{&},R 9. %SOP~͊Af] X~‡CY‡A˞xd{!kG?{qS1uEHG4H* p[qJX^ " kW5 }׶ "FR/aq)7CrU,%#!jSqv :ffbd0/&y"1ͷ-k 'ό'}jA#YM1[bTέ+U"Vp JȀњWmR19]d}>2>{oD16nG\pSÑPɐffv||)Y8E?C?&wͤa^aAByY}?kA:4|<̆? WP?XcȽ*!ε/ɠeZ%A=ps ǚwj a-\Gh}؜M(l[|K!ht< 2BNcن1G䛛:%IQ3عðA}^tHuSa}wja|a|0> O+TCkn0T/iL1N>+fL-,8FE]X^;{`>PI04^d,׈yܭd"x#2ԞU% ;56zô\vD]WĴ-̑U]t(85OFnkYe!dPl?Ugb-ղ ,Tnj9Sz2>9Zkhu43bNQfˇA/LUByT!0*oG7̳{%4N OezRU(;N*izmaO~/Y ,ґdfdz,将$,8}iרk:Xj~sr'\u`UAk]P]vw3|ۇBZh!]nrL[т`ZX-IG%9F i,o7].K`t.,ݾe}W7 2#>׾n mRM#Z WdИP?1\lJ@)ՏA91 yUUZF1PEh(;%w\vWæ&3om(9cOMP)3w}y;2۽GfGez9/$a/9_rZr*X,% C_Jo{ A{G,{k +{3 [HP梽sEh{ێ 1&E BJ.uu>]bO/ڦ4 -x7o#NAhjI4✇psg^{{&}L{&}(`{kP,)Ihn3JhALE -ZVyd5|ugiZo -ao`1~ȶwT_*sCm^|DtQ}mIʃZ mx_VjCc& 2ʶ#w!$t@IϤ=B˫- w9*N-KjjX+[t$MF*JEXwЮ2쉴pe%|K\ Y+,@ ;'z\w!6U? Y)Ўzpsv:.͋.,V? CtCx94w6J$S,cCot@1TY1{kNÞN*&RM~ Y7+T nZӫ< ,>ރM޿V0@ \]Y oP#"GnR;](і=/%4`c4W5R H.HA]e^{$R=f|B90J @NG^$D*#uUH6'7+~sUdqKf)%iAHelSE+TgbϫV 9ϫ*oz[wVmTci~II"9UMM&U$fѩx<=3gƏ)[A`OVf͓ttt8u]WTZ[{/;J91XbOpmqg8qU0cs-pb٭Օ_~`@+-î5Zㆴ3nJ| ?I% )'yhXu}dt Ld3WWYdUkMoϳ(H"$ R%U JACqu΃ꇒ/~TyiE@uK^zW]~m n+GDf]iOy1dxޙT2ٱx|$^*I.4^;嫁+!W`zүg AMsN:9U2q]QFx@b/$ejwn9*LVHʤm3F&THplNpzߗ\r܀LG!>#%Puzzث=[{54uēǸI,捼`UN/:X'hy#e¡*v&өe&a/K2}z"6Ṿ1cleuD7M1.BMN.rJ H+*jYKǻa&vRKf` \^7©>*R'?bهG:X>nJ Ј EY:Hs%Di_fx bLt 6 *qXH@+oq.ѤW8GqtQq[ >qx"TBBH<o`>P٬J_gGB_6Sl4޿Zԛ/(" Ó"A#LF^}*$rbvww3;/GQ]1gQ[PeT62JDu%VW/! 'v[C}|Sۉ6ؒ6n32>C%䉵ylB+Ѕm]GV5|׵N|WGSKL^<\쉹@& joC h@Bڱ9C ʺS6UÆ֫GFv˖$().Hzԡw(iT!!FOI%0N!tS:=R>`ʰ>P@lUŅq a SM  4gf;-.J,FWauE;U_4Cr:=烈ӆOdZ#d1;ǻ9|ep4[y<Y&j-ꁢF9p6g=N#MbDNbk%٧݌mwT)R* 8jbƅU\Y*ȮNљkMu$=tts '~R`s :!ȶb+Ae,@pc ghͬNv;b9ð{ay#?`j/_~8jC/ǀ;E.)aO2h`O}h/t!᥻@KE*%(m#}WD1(;>EEd! NȂCR+ N\Y^p1'u\{~qƓZp%"t-S%VY%7ʓt!XOq 6]b- p&qRQ|ڌg$Ƅ T2ԴB[Z!M%2ƈ%5jJ!1+@?AWU*ZC( f0B]v`Eݕ*PȈӦUQ&fg^j\*FQ*WU/6zUb+I3 MU Xf Ӵ?kLdSۂxil9Gf c4[}kݠ4[2*V;˾d)zX׷+1.lrdIN Θz\V_[O5$)k(>ii@votmӾ|  zXuj":mbdqT&'+ro"v;ykI|GK 8ylS>n1}. mȲJ1y-H`q]&s'hL:vVq\ӳ9*%^Lj M@0^qG%wXol}箂QylJ윴IA{?.5V _`I>#=Z5HKa ngѤ5dS{8"ֿVOȫc;{B:vC\@R5btr^VCZ2lZ;QqtSqh|?cݟڿOǽ#>s[jҷsw޷A¯k1ǃ1ol%3'}) D&&3ޅ mFgT'H(1;` FaPbƷb:eaFP{m7hdHk;U=VN,=2)l0)18)qzn qW IRTМ<׷b@Kjc]6Fд**"-{r{Msn|R '[jr!ڝq=\=d[;A[vZk]ia %%B#穄PXϠ}엞Zr ~A'ym|ƭz{+8e]>9"^i)?OÄ>"hx˖ _s(r>:ž ς.(Gi!Y9zd],X/X-w<>,Z2$E0upHg;QXx]Yk122mMkF7vܲ!k۸9R]C/W|RS66.@Ѻ%vm  LeStk70w P7U/}S9kg|\80:c`i"fWw%waUMʶsdB-IkEiaP2ƶ(/lsj>Ѣfl-@fڜ^Qoqy@є|@TcjES AqolY Ͳ]..`sVwq!.{(.}5τLZ T5slJ]+RXƖ毑HO/K\/ yI2x*ܟJB`r$TY8o% lŔ07֣acs$NPh`wf38S$U&XY+=x 0~O?CUC웡dQ6Kay+/q$=Iz.O5 KxA:\s6USz+0NhC'K\ v$G+$e9:T_˒:/l8$(ژ[GXbr ~i6Û 13t ⊼ gB(Rٜ:Mpv{6QH.WQݜ{uhSkBF v@*&JCh#VphaV✬G:L #/H3&?YT v[#1g4ăG1- +8@ozO)'Xqi|4BîEֱj/}G迫-~/Rxo*)OSIOa|Jz #6Ɨ~Mng*y V}$]W_W/ZY*_jO^UϚZY*gGںYѹȕVFZ'pw_.([YYFiVD3F a+eq/iL]wCCH&G$JKQ ad8{dBd}Ь&KW?viRh]Oqbl` .DhR~,2D VsSsQ9Q%F* R{o-]=~d[ݒShֽ.tayrdP;O5Rz(S$A3.ũ[O.gqq o jE5RZ==w}[$쌯)[b$G`ǵ&TEW]O=s&òX6ͽe<#i&Hq|)L{_}T̿$l r&rSdncݷ>ѰGFê^xU"Jfíp.< QLJkfЭW#l#sU lO_Şa&$&[ kZDFl㜀:^<.wb%yBC7Y^3I-[F%$ݝr`X/b[  B$ ]ں]ozc`2m^dfB^^+b0Y39[DakUȲas\2#Sn/-fbi>eU_y wI4ʛ!]ftf?lRilP.r;tJr0Jdw.i[, cn,oU$~xwU뇈A5ֵ/_ ]jBDI*VZڟQhK?Y쑽zQG潨R\g$e:ܳS!35[&̮qgs$ZH6t `̔VrE̬.f31QJ|9! μD }D/)[.ƒZ@=@3aSIAEYϵqB9)=] TSst_E_.]T M(> Ȕw ]kVgȆ;ю}R`Y`p,=3}mQ=/i#|ofm97"t/gul_u66ӛE::^2ĎLGhHR`3% X( _jH,IvXeO }q#Wâr_ga0d#U XP$q.m.vߴ HV)bׄ٧Q>&zQ Er8UjA3f5MK5c1ͨZrz܊Vj+m F[ǁ1Uqmt\cklu0"ND)[(n'^U^Uk :6Ƹl 1.۲V}[}B()=(6J o0po[:4a^ t| gpp4PN||3%wi5v[Z8VzTJaU- XUC_v$.H K'~KJ*i d%!Q}hB N- 8OfϰGb*:܊sM;'vQ2pq.bEߓb0c 2xLɎ L&tYl8`/ss !^_Vt(MtŹt<.JYҝ237rSF9Cet:r!#ety}"˲?2 )狡 JhUKǕzq&v+ SWDn),'BqA\^Te` MED~۪{Ύ ҋa3,Rrj/ag UZoDž8#XIraLH]kܵ!uc]b=ޡ.1Wڦ@CՓަ,dmFB-$@Hl,f ?Ά^ ij%k$qb KS]%{m9Dd .AMq iy  p_4[4WIV/,'_>ihd:QIw(}锴i`;Lo%]v_?LK5b뇱@$HuzT'uړp ^w ~Wp˅DWƺ>}k}ka ~";R8U+*@)? 8|d{ ТLa@H17RwTijewj9p:X;и8hNKDƻ_;綯8lSBKJhD`Ƨ.qwCп֟&|.Gm§PRuT~-h+G1tMC7jo =]φk Ẁ,5Jsyu5Ityu5It\r:iPtؠЪFЇB9~w*0FWRzo;"'Z~ӃH{sڷ~(HG3尉<^V &aJ|Cle"`-ҕOc{qxIŦYv+CYUZX2ɏ϶8[G 3we\Kfd ,~HQp*}?3^?Fe}rR{M{n?s26N/Zh[B~i20Iu/!jꦷV MN<=rY2Wo b?tZmC`ѓJ!ˉݴd,h[-3I6)9u($-*C ^xNi9!mkduJk!9HH_ɫ!hs|ts<&L?gH:I5X|wmST&Jr$m*NjŰۼkl^΀c+GsRmzMmD㉵:=-n\z |nǑU*~%OE[z r6sov<|ʘ.Tic9N~c3 C?T56?417 Ğ?79I#HB#RαmeR7X+jȖ~\ ; z b_ڷqdHrnaW"㚂W DzB68&H:6+ukqU8Xi`YwrwD `!c:kzD=M3H5&+Тm(Y[Z$֞IG|c vR[a Њj|ȹCZ}V_p_T3S~o h@N5R5FAQ:˰ÉdOG#بֵUST,97$z\퓫빓szn@zUjݭcME86$"$MQȇ|Vd(h Ԯ[iu5MTɐSUl!UW^2T7S&CU}$༴%mZ݀ayr8,o{`JGNƧKD_;h,lGzd &n* T؎,SH]֑7MtSNUt!ŘXݣFT(\QZWmcEcs_jbރ2-\7~.IL 69sq:rQ}B{*{ ]ZdESu{ C:]Z3ZFZ? ߟd7d84J]-5pF;R#aGiͺ3]z.4]v^~oMNӟuKp\+#tT$?UKw`"36 wB qeqYQ}NZΪ wdW|?=x6AUtKqp3{jq.Ԧ19 <MZᮢwOQR"Bq=ؐh~92_fxfv\' m[XnDWv-cn/H?TM!1eBZy[Sp@&tOoSzZId<j8-ٲ"XrtҗεW5Nz&2ogA$sJJPJGl߫.AO8FDfR j{J=Zaӡ34?, cSd[TƓ+Q?%~XdJj3LLF^iWUGS7mEQ"s<xvh/ѕaCܰJtN5,.,_8#zBÏqݑm PwͧѪE-`Nn`H1-ҵ l&H%}촳ǯBEx2Ʉ؂M@$؇~+ _8HBS,2<8 kkY~r>BPPOPC509>Ck`Ȅ+Ld/8ueG\Gォ5-pv 4x; v`Bh`jX1Cl%F)iqGꜦ$[I1]7H-ۆk+˄8氕rGwrJҏBp@]EN@CBܪ櫜 9~mOVN}?66)nK~I%3Livwk*a3.Q8Y[B/*:&|*x}QsjFzN\p)72^ BSh=DҪ{*=|k>0U="m(qt4vUCRRO#]cm[.R6 #l|iRaeM_iI 1pҾV}'Q])@m wPR<:M@鬼T j!v ̛mrR^(C=vZvuЉY&H]Y'#s ý <Ѳ;c4#K!DwҬ,aƜ$LCM6^drQg)2AH R0)K?ߣOcCh,"_EH7 vv0:0En*׿M.)+ JJ0 tg.85NEsiԚW[;Um1m$j-5},hn 37l6]]Ȩ%~XBQ)3 \&LDF|?3D~=QG1:u+ċrzT2一|`rHxE*lV͖lXƲ; f Ta(G5{x_Orz@w89D]>!xχ%S;r)پ>v޷ߋ XQmӞ$*E`\x눰-sFN c[r3X|/Ǹvn:>~rQL*tgL8:ban>J3I9EԮc|-j +71Gۣ8'7YSeb,&C骒!r<5$۬ vXŠ p;>.2>})d?H꧟_Ͽ觟_!ISθOnɖcw({> O-2#|>6Sqg BaZ G`K^jbn@̸Es& m3?lD"3QwSyӫEZ(J=W4Xvo/%ps[_ 3S T%~{ohVgRmoݨ:0k]`HQ>~}'^~o W {ZXվO5>d?>gl~|6͏f$'nxnJBO⿊`GQ7} B}Y5NkiJI߫kd9^ aHES7'}ﻴ>?S(|ۼd?/%y9j`rVur}/µOm3.;O?$SۚkU,~~i,?/mWO:/)eGqEO͠(U Ԍv/-}j&|e!cڧea ڧeb%ڧR]I o>=n%@r7{FoiOMfwӋ}jfF?5OצR/{;VN6 [~6ܮ~qmۻmݸ7n~O|EuVܸr9.mnܰx8wQ/QYI~>/Y|$k_nMhI~k"g"'"ǵrڎj;mr }_mMu}_6߶YT7'E}_ Oſo! endstream endobj 1517 0 obj << /Length 2475 /Filter /FlateDecode >> stream xڽYݓ۶}j ilj;39_hwT"n{vP)/"H,B4Ih߯ΞbT'^&dHtF~Y .D)Or+pT Neɔ" Y'itgd($ߪft ?951vp4n,w4oh[vEeMZr? KW)K;G*OHrƷE=w ~ZTuY z&mM]$;zaiX58^xfjQxkҦ-Gry7"){!RGܧx ϹZ+7t= jFE6$<::K6C 1U`Խ[+4D],ݢ蓳ЖU[Ο«2^@*mY9wvYQyx4\9AFYj&UWԛ@m|(Th&iFyS8%C@.H DCdL>1I&xrM2Gabؘ%]¾Fd0Z$~up+ aS13J %|bVMG1brDdd81gdcub\tOGS4&`f)׏C{g֍9RԏZ( zӄ6(z&G11EzDM|Ee?MTa Raj'\ gXnrFZC6{GbC8h\%au`zRצv󯪛ukŇCO}fN!R?iu"M^/!l KM<&~ Q<υ&ܦqnda2"ro\k4d 0¹_ >.$ɱ̲fb}pYcvuV $”AKfnqA@ۺU[T6 -Iv*ºrJ0w.CB6f)KӿiU :g>,xSq Y0{8k,hF}N icD" o&~nF8ʤгnǤTeΖ o ]z ͨ[: {Lb6F}͢ofQrlY k/NAUQo2;spQ Y/6e1o :Xn h w`J >##BXą$\ 0Er(*0cD.4yTP؞tOlWXrl"Jp29<}bM WRu80=pĄ8 D`(^d?97J5ɅpX| 4jH<8SAS;sۜ'T?)0JRǁ"U*%W4 Km)Ur{㮮hPj Ъ~b^nrT,|rg뚘>h4@cPxkezx,lpWI*a(RK}̍@ D^FKmxCtT(=Q\|Aȑc+Db߳\7֝s*mY!Rym>-JF$֮G;'8` OJO@Q#>H'}jpvj Zj044{eG5!n.j8Ѷ'˶A}KfDz|߀&oɤ 8H;Hs U=#@ M Ǝ}?DB#Aȉ "y0xn?S0BL  PjT'k]{Ȯo >S&2h@4{ȹ-"V恆[ٕt7uYXn1pZ-p {@I`VŎj 3?ڂ hvJB#ۢ>QYƫzTu'F%egK(4P B@81Li=/@Z1ށ?%:}(6D-T=80 0Ķw;L!nt`ߴ@p endstream endobj 1513 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/thermic.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1521 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1522 0 R >>>> /Length 5031 /Filter /FlateDecode >> stream xK:nEw9!inWi^Vu^4\nxIEfxTpS~  z?_ߟ^x??u53ᱭO(ICH ]_ט ?Ƥ[5ِMUCꖌW֣<T4. b>y ̳Xb>e'>aZjurA{NIBYޗW;-N>4.-q!ʗWjі.y/nk.!=)2eYNa[jͭmTpK6?mRʕ=FvD'CY66,ʺ!-H0kҹ4}2Sc.~VQQsaݫu2)'qP6z`T8-TiD\QT\tL#H֤&TȂ4?!HqTEV>|#<%2Unsp}m[F:ŋ.ΨQ±$պUφ-wQQq?6&un8<z`T8!U gI)góUZBAza`_X1)NyX\]S:ylԣ}ަv6T3c!H?3z|O6˳1(KsNnӳ0U C*=+C27vNܡDN-ikx^lcISB&.!M;1.Tzb*#Sp%=1˷۾#OcLEIhCyቨ;CVux^wK"gQHQѮt1YBN,= e룵PR1Zy^7%0(~:":H+Feu! LȦa1ƿoĶnSXJF-zG+oЊ䱽0@ڤi4R/Dߙ%ҿ˕S4ER5ʛ7c|j k3Z,`M(TzhQ-cm.0vF˓=VJCt4xZgu\_uuC}z_Ӆ3KU `EJ )ewfγ;$zυBPXwX2R-(953]BYpӫ:6kUA^ltpjQ OuؾXPZJy.U̅ 1LM<*VDą'JS*.~}Z%`ᡔP :۔j zmRҊ &Jq/U".80͟(åTi,5%e,Vz6M 'ZjrauƘ8!g Jb*^Wn[_mvcS5U{R7\5z6ku՝Z^; vw3GwĨnxIRi/M3hᩔM->ZAKȇRh Jc>Ӝ`v6i\Ϣ8'rZ$5bexF"oJTkPZSН@Uy x+M;#Sq6^,xzip⺵&LqH`Wƶ cQVm"?5@?B#UV?xb+ng[:m젦^SQsI`\&ܼ@x> 0[iT5v|ڝg^eo͡A]xRy<Ր3,BtKem}XYH ؆2/-B[ׂ02H"m1_ >j>M߬OVvw UFg>vZʻ{f` "DV$06$ro98;wh7?61M~I'~ރI[ '; ^p~| O/ȷү&_s)g.r~'7Lۨ=N}Pn_~!_m;rSױN\S6E֔O[GOW<8ҷO_8Pl}qƁ ßq L!g(=qdđrG )O)S8҇G|zHN҉#}8qw'đ8k'ARA/V[ߝr>kϟ?>. endstream endobj 1514 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/thermicvst.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1523 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1524 0 R >>/Font << /R8 1525 0 R>> >> /Length 1688 /Filter /FlateDecode >> stream xX͎6 )ڋ+(zNv_H4E4@_"c1Eq<(Ç{+?Y?oN9oz`&?zI/e#Ƿm}C\:JKm':]n?n : &'6[>>Y(8+_(zCZE !=_:p@r&q4jq[`q+6ր=Fl*rbƒ}(ǨJx߾}x˷w'C? N\L<^lC Ų&5Rмh^g TzJ"yuv͑YЛY4rQ61Jݔȓi聅"~CtsّZ`wy#O_;R_5rYڕnRPKv52dhJrWMe ޒ;.oPJR[OпsBZ3؃).PfYTW0eHo^pS?P]m?Π4O ij8KJ.:51{PNc]@0S4bz4b eҀI1,E@ciBf'WQYqyXV@AbGZN{_ |ιv{k\K ;U6}k8uQ |k kbfT #1**W[hHmkkLNZm~?,ӀmF_ U- Aɷ6skT4o*SZ=xWgga(1N_h^zV@Qdfw+kZ_EvChT9ylӬ0/JE3wW̱^h\4̶^ ͘Q)+snȿe6`rEg0Cl/8;94Q:sp P(tC.6{{v[UYKl✽b.\<؆ɻBoƻQHH6TJK-ڲ *7,{ߚ2uKݐ;T6=C7v#iCyrwveݡ<F{ ,%p}IV. _{ ;c*Bƻ;9wk^BwvO |3CV6(qgoZD@f&VhCV?Esfhē:| x` ] endstream endobj 1527 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1696 >> stream xTkPgg;I`l3 ( 3"Dqa .]]_`D̖A$J" /D3q]BVK{HU[?{$DVIBU<>#Ei-$%+jU-j!GUDZDl/>%߇ 60?T70 Wssc?iN|]Ž3}%bQ$j A޵7RpR(\o77|?'cd~ieGG+@`y cw#51RVOGC,s z!m MUKsjnc^m0 /e J+ +Gw7nGMgDlUӥ'YB8U\gh u|FSgX~w!/(~7<2z.&zlh9yC2w5@@YgvaY-k  O`\KY x%g6[l#GHshÖu%1qj>8Qڬ?8-NN|3XaуF(3RߴF{`JZ_Ci,3wMy:vw|{*wHKg"1fvy*am$^GFCWo˪P)͒WR,!4H t+kC+ B{K# u34)̴zwX(wp$MVUX wwXlE/q7^BB$|)7W:9`rov.`_VLe&nM7tΛȄzrM*CJIԩ$Ne-'*jjUׁc߮P<>BB^CЈ/3-wn,O%y{mpKlyl}<<+!ӈ%39ͻA&{R`7t.~UM͵]5ع>>_Z(99q}>=> aT`80 >pw3xx.ZѠoϩ&_'-,aΊ?hnN4'RUQ'3 ?cdY=$ khaSpU?$0QPݤཫ|jpH+cIm*Y vAS?a-^ÍwD{m[hvI&h/Z^]9 DŽdw_XQU QJlyO߁3Rz6I%ӘpKRpXBR;ۛ[egM4y;;jͷƞ1.H)v7Q g.!M3p6 "5aOY'Fq endstream endobj 1530 0 obj << /Length 3050 /Filter /FlateDecode >> stream xr8_Wfk}"%J{@wOE:ѳW,0FB僋~.tё|'~ N|I __Ac۳߽y}/|?_ZDֱWy@Je&+gQi+gv3ӘEyu9ïRLxjj.qP4 ^E`n%eAv]0f W;Ӹ䪌8KX)!stnrf^G0ĥ}j!k|Pf*բ&BDoZv$ -]& & WRk07lO2 _ڕTTV&\]I^ } *+(v ~+xYPFyvV r:lת8 zӻB({$T$r$ l2A$jKyt.]nN{r3 j) ]s֠H Ɩ6v@ CYpI胻X < 3(u{2]٧GפghdOB7$4|<&ZcpIy0X':@?u5\>zW3;HafC'?JH3m mi]c74dsg$3=ʨ4UB8UimSeL pSvKYWwt';{2ta;L 0ЯsxCI?0.]I(7,Vʣl**;wɉ<@yp ߡ!w>q4 yۇ!Rw1fiE@2#J@B㵳eJ/)!_nKBJp*!2#ٕy.Z1srot3yV:y,>&@aJp0I2sl<[^L''DY%vS/,YW*:\m*[Lomo]%V= m>*JTBs$}NPDөKS/ ,0dpt{7njbكcEk:$6Ny5 (4K$>2\PB=7{"]rĬeLhBBD!~̏>~)ظ dopo ';%;e0INY#ݘtc+D\>q9oSk(i(݂Qyc]:ZQi#\CɪuD4ҩYfp< wd|r]p8nmJ 56]z&Dl@ 4kB2D"h%1>ժ{6 qEOAK.C, |!uK dz!eKܡ uaֽG0'h9c[/,}*ncwňLƓmٮO\5;ih>n֝yM =ìv?{^yx -[j)t9 JXදL-f?Yd;b/U nX_{+iJ2Q[mԸ<+pٱbFJykS${h[cD[2f]HC1Y-w %-z|tv _툳$o?ui˞N=ڈԢ ukfቛHN[V,8.:7ݻ*i:"enO^yklK/)]BzQգAz"DA&B3{ssm8aY6<;˳g R*NcQ?Bd`wǓܴ ;TbIwnƺöi?! }T}UǥQՐ, *g^ip7[a#U#Oj7n)0u˜ҷ<>5k TKPNoN,]y[`ue;0=bSx׌ v5!.4ܧl8$|#mZ ]Z9 ~ ŏ8 6ākb YTUȷS" !ʹ߭n(MZ1լâ#pJmX+@ j\[q&ϳ2yp^ &I4Uvִƅ?CbIY40i%yVX>,s[ |MPV{*Tvyܹ1, É& a<5Yv SS>>oVds3d*ᱭyÙ}oDرuxGñddmO3]aHOR6Xhv0<줡&J̴fOz($*XeIsm.ԡxg/ iFNaG/G3in,a)*‘.ove& YVfiy] endstream endobj 1538 0 obj << /Length 2607 /Filter /FlateDecode >> stream xZ[s~ׯ@ZX}h&#θvkq; N{^DL8 pӓoV!(@@Q&<2$$Ro' ?~P~N4 'ӷޟD̈́`ww?;o0*) -Ovo\^N~ taBę!:^ #G }D5b 򶘕UuvpgLDi:ͱfEYÓJ_zVڈuoTsgj:: `cPmj`y7I-oD Ԉpo2D|esMWR,V &͐Jbk(QcE"ppGsH&R"-tIXqO"'ӓ/'p@@1 'o8tpkIa{G$}a@NdǠXdRžf"Ô F {aN *A\0&yÊhDuOr2dqpw A\(pg1 pvV?8P xvcżYB.:+ kl c.2tTC(Hml@d(XCRy  /CdlHr0%E1f3x;)C54~T\d | ]QlPLh'WuZRjlL8`C)xO8dɸ͡xW>^YLdsGyI^7J*py}Z&Nvy O?yfbniR`xNY eUB޳IaX;e[/PpHmenЈ E? cb1ԥ[242d۵fc2sJ5gsz fp  Q,ka)Iuoz'c\}es~Γ9SqjǬ~~iTHhYKFC\D *`$G1R7>㰫BhV йѣH9&YASkGu3J׭vzNZbu3}CRpuQmC9mTb oi #IҝܯDxA ixmϱkVs[홛Zf/|/jRߨ7u26AAt%vjl/ogyRG~z٧fMV'|NsH٬v]y"$tJs#-<2zoWb; Q9Ԟ&pV,i!^bwpvwL˵Rňu{hú0 P3b50dV$Pw4bV;!,m}W?RCܓGS!IAdLl.k iÒ thWA>&,΂[O޿bQUQ\%U{KȚ%ڕazba^B|V·'É$6E3em/_CH/ufΓp2νzRu㳓N;ܣ=0E\$=L&wV׺"gq4)F5fWᔇIFf,ګCzm+> 4`3nlWƋ /߻3a&0 2+k z{. Ί-64(?/WnMZ9++{[Ũn+DyarZ0ږ 3&k?i{sA-q(iї@)p<ƅ[&)EOa}$*.h #x2+&xȥ[gn/N2=*ˌs0fRQߍzLr<1nMӒ;Ѿ|,H(Cqۯa6驁мΛ$۾/}܂sǑGB" V!ώmW,*N`Dގ֮~:5ݿ~Z`ײ^ NlF F;csЊ$$ج7:1Ǧ9nofTڙn=?R1/REF`?Ev"F5RR{ؐ;)(7> stream xZ[s6~U0f8mRO6}%ZV"U^dvBiv鴄;p3wW$pAԙ::2 e39?~|RX(Ll.93|;]FշW_ޗR_^tחj#l{99"qD>A tuh5P=v~ycaKVO9l5ǰDc?‚ID93}̫<p|qx1w6l"t<ҙ,:9Ƅ(odiEOҹ;,nEjqa:ca|Z5+6~[}N1 _[=zH甄"Y  8VQ.A w2 Pp즌VMŒD^fiUElU;1y4-{H=0ϣ=V()|N؍ VZ?}# }0=Qڌgi -;K䦂PѝQieb̝0}42#CRW+ӑb۟eLgvk: j!{q!z1(5ad+sNcelQa7pNs;ŐEѬ(T"Ƹ 1ieH Zi @0Z(V:m85lF){]5𥻌^>X0ߨ(*mFAE 7Q ㉝ȬXd=&Fj]̄i!KeYH7ɯPU<$YeMZ4@ZkZwo|GN<!E°zV('aT6~iD}HJL`m Zo=- -) Y!(nn>ANHiޮ} HoΧ#-mo5T #a Rcҷ@!cyVe2p=QHKPC/֑H`W5q[RΉ}rO|h'mfdzmQf#Ec$łP !) .w-r^:4Q^moyXOO2 .zM XECu=U۔XC,՘e+:T[jͪ h~_R RDYvo q U{Dٸdo%|(%H7ZVqs03E!P%JbG\Kd@>#Q@*WEkꏛFISؠ9+ Y +f+MۖEe$Pv[ezXݦ{w5*ٚpuRSsw'l-r[3SVp\[%;N툁5ҥ<zaOMk$!o[ i;&pu,\wH_$/2/&T)zcr\}5LM"#TNOX>4wmbӊ*<2d {|ۭb!![nsmO;/Y>@/_PRQ~{!6$HXP Gɻ^yg/nґ( [PX^/NX$u0A9lk`;"̠jd|s '6%Hg|A͎}!\nac_kp C0@5Ks~mOƳCax&PoU:#bd )fESl٣@%߇+22t6L|His_hWu'{,#38lA&#L! !9e?rV_P$%| jdeA $hOQtTFLu\9y ^?ɻwyr|}A5 xuk:IҤ''ED]9W`0KcYSs96IHtloOݳl,o]O1˶f>FS @/OOy:>~ x ~_&ΉS܉v wh3qE9@i~guk6v>Y>AG 9;-{jltYO`xg{M+D;m jYYx99̰MC endstream endobj 1423 0 obj << /Type /ObjStm /N 100 /First 980 /Length 2492 /Filter /FlateDecode >> stream xZmo8_oۢ8o×C@h{:j;J/{TKlCx( C !B eu9F Ja-3{a-2$'& "<* @(m'!g BN-2. KI~Z/AA%YB=&=lDSJRJς02͊T褳Ô1[Ma<]POJZE+NXx,Lʘ Kl,/l H HTeʁ(DV+<(F@Ote o)5hP{b5rQ ')=)D։ 1 ($A"Ip`'ts'J /u@QYC^{6bC{J}ާ|>VC@D9`dEp<RAc(Bw5ūNGͳc/.+yW?^ ϊAj%i;bT,W)'={]'KI vR4+X I۫O)%%?76X>#b2|3#C!:MRfT:sNu2wnuK)wqjk89)ZHHیH՝fOWM20׶Xj^xp8ϖr(畈1VllXj)F;%#~'𽞝v$Q3 u,h/ :/8as/wd_޼Uec:UU<^_ie}.x5*a3)j4ߊ='d,Rx|+r4\b57 JΕH~ r Ajn(CyZ 9DZ lWZ^x"lE4LϤD >f +WN wJK h.j>amq/7 p[rŃ+70H>IѪIo pkDκaEƮaÛ"Y恡ea\x{gnK?*ST_8y;]ۺ:VXzn7Mj-mkrݾ|}k>k%]Omn@u/_a^$س^eD7M(ƾ؆joPcdRaFn;{2joid6@}:v(x݁';rЇ$䴲4Xqawf4*khL&zwK޶o Ⱦo4\lo?[NO=`TǸK(PT<4ߔ8Ƈqwg05<\HfdƆ' v3=eh0`Dè]5F-m%_az딺 7caGmX-ԊF;)>vܑ|+(2+_5ŽUC/ڰT4_G}TV7RS#RtDk`n|Wvv*U}[VvoxuaWI<= YKQ6/{BQI(BQz6"Z|n)By+닞Em=AeגڌƛjG2nBR^Ug}271fR7B+3::)/Y4]HLmܲ}Y2WLt8&dɨIͨ|nF ?p$nt[o-PER ]]*8(}ΌAɤΕ!:ݭ\gBbTQR-|3h>>> /Length 23606 /Filter /FlateDecode >> stream xI$%6 7+JK@q @W;`fyqAo??\]fƟ,>$ʟV?s=y^y2JBF O3!G>ROwʪNj;h*r3rԕ@Zĩ,֞!@:v"ctY[gA<sp @ lZAT b<ӎH|zΟ:@ZxUАʺ>CkSҾX~7i{eϽ=ۍ^uۭrg^-rhNgr'!Z}ph}u! (J4D~W3Dn߯5T@W#5\}E~ċHS1Q= zWB:5m"iտUҾH1 v>gvӧzϜ6;GdWRzSP\ɣwe<#]qW%ճnc_3-bWߏ5 GߍU(Kךj[n*Zޗ|uHb^֣үI + ϐsKyd(NBS>ȴ^VlV7$V!Zk罞a אcӫOmƾF)˳M#W38 Bgu Y?Gq`%T#GQeY<ף+No$&"WGyw跫P͢?>\~U]ߍD 9%俵:I>o^>!-V*<|tCn-PxjK:dںO<|񜁬Wi"5$c%Q2Yyhw$bMd)G.d |xz1ITR[!%I+0Rb*<@Ӟ{辑JHc> "eF*#̳u+2gi 1ITP{+He$)0B<5VΧ8MPVnM'ci>;qH- gH# IlSDf䏜甙o L^scCK`<#]ahZx G~ʥͳ}; o~SmlMܼ[+[-kStD\']Tx&Xs {gr F S iyiҚkogA,zDR Gs4S*JIpajB9W8dyL=!K}FN9PeɸdAX3 {Dzf!\,H'U]7d u4m"5_ZtB\Ch^B ܄,b_;[6f~NЊ&<|L+J@Х9 &Q\C+}ځ*KlTrHuBn "ςB F!5?dϾsĞAn_$4F2ϻI;sqij{$8嫽̧_<)o} s &:q<,Z d-iSŰ0i0r8$@m4:TtxC #}&I2gU0AVYJP f>xIT8O/GFL=Oտ{TaC:}j4IT:E)oIT Sjqt5~MڎucʉB@uȳOT5 y։OP^hbh(ڡCڋ:2W/} [ !s]u=I:9dn+7k$* ^IKL>B3e L]G#U CwŤSWo;̦S]z6dNGk22.&q mVE)8xF'X;CN4##6KdG]vYZg`Ujk$(RU-78hBfjCzU|#26"UlY<&Q&5H< IDOU.ݮ6] ~ŴGk) IgU1~AZyZk]i!`嘱cV栛D[ JoYg h]H8,7!^ഥ*nt]E1UM5+.Gl\9AZCr&&Qj˔U#xnN rOMMdw-#7^Umh"rå&Y Y?3&QҎzG4? NuY)] ޛSg:7yT"&i@Ο<$t2;rg(MzծIEwy(\c[[-㝍mݐ#WB<1,Fat<.F #<-s_H'_zSYl*iE@ƛ:ljH5̼w29 {l܇Ѽ9!I#yeD%o >fCRS] )ծyOiP4N1ITVv;'/aN4zn{/0tpl$ס\.yK:iK>˳7hqĩuHZEG_]N N93* {{t$qٓ/ZpN{rުMz TG.םCS A7JfvgiiC];%&NH dٯϑFH%$x,2D%:bF3RCS?v;E-h.:$~-*s"5a6_L3;;$*!ygGR$u} BED%c0 |&$L6艊d2#G OxjVZ3J'-ΑI#sт+JC`M.pJ3,I{91Oi6R'ArP_&G [>IkgRNR:Ϥ ؝IdCTDfNaVcC5iI0k|WB.'ݤ:T ilZ i 1viv^Z Bdw]!GB.BNFnoԨ!R<'F<Kު ,7o$K$mIH{m!Ϫ]RnFnտ&\`wv+zӽQ曜Q&>`-}8cZF ? 3Wkn~.@T naQUPaL0aRr*@Qwa8l60[+rFNBOT@D%zx6]\5OOe?'DR>0@i `ȝxБėC/My8 e>]M5AlřgxzB*!%I3'4⩄| #<D|i7HY'w/ U}OI<:6v:,|Ɛ@' izDςt9R>x:#XyGz<8|nT27|t$Mp $MZK3b|,OEN?{,odrBO{'$tok/w ކupj6rDϜSs) }x4ï]s&i-x\u>\qjDEȑu V@ p7 {[ܿQ%{ziB΂"OI<'!lg4; I}k #s|M[K0'%Y)>1e:Ҷ"t=ZZ$РLI}߯헤T/]hn;wc_0#]R\u ypXj?n?@swD\$Lv! H;p4꺸զ3! [$=/Ϋe9ކ#t@%i܎i=n ڝ9 Zk7D@By([}|y^=ϖrbHOH]sMOB(S(+!Cjs$P-3Wu7l xׅ+Np]P 7dR lNAIH 0 _gITC!1'I N%bfjbZL(6W?V-2&QjC(:|C@H \{G #.aRF&ei0HIșf*xʯX?ds2#(ҏ=̿rk!wI\ 9gP AF!-!#S$ˎ*]upx&Q ŅzCsϕCz]p 6G:#-{ѠDoQHZw :JiA} a*la3:4aT0)υ|EWۈ qtOw#힤 F7j{OuZ>57OzD֠D%OHU,nn)[(ZzQ|HMi&aR(']xrԸ@⹈.>>'L_6$~ .--C m;SXb].`R%o?g #!U9aoMP##?gq@̃oFj$Lsg< S61mC$*vP>&ySEX5aFQ j6pAȺT;=Kȡ6A`_sΔ·%rb?i;0,:3rHD-GKx8g9$_*- srITIu;#9F7J:~x|ZaRǽ8Ο|z+n[Yʚg$^^ٝ,A:~j!w$n!dp݂&%bx"'Ara}dv @hk2 #h .[p]'>CvD$D{GЍy#";l=%fp&/;b79,cr2$UerUN"?v+hήLxrEggP3GrSi!mhb5 M,ɞďی/2ShV:q*A%Ko.J$({i.R$YNTuG@zUSpdgoO4t 5w(,'IFC81}TŻf:A|N/"cT6XP)ʢ>V(A:$c'B_(I"4=5lwE\~Ĥh@p6+2P &+yG-oq|u;߽,JUY{/2rITGHsɹ-z #1aǨ0ҷIʠ5` pإCbg1IT4oB1W.av8خpyyV\2.}&QIlkn~%L._+֪Ӝi`B;gͧ9֡&Q[ܞOHnyՔ*`RhWP0~>KDߣ&IY ' LY!WKq~6L¤<˶NEU|/&[ ,WՄM6u%Ȟ[x< C}oފks^ 3r|fLFV,A<ٜHaiyDAJ{w:8h5/7Mq#Ð& Dk`ِc0B L<'OVF%d.B\",H iG'dR; 7!O*C<)?zӒR"砖;RrGjZᅜ\嗴3sr3Onq0̣/!Ϗ6Gn KwF^8S<A$ X≁/7ԭ{J$BÈF2Q `'@3!Ww x/FHAPGt;ͯ=;qJۘۓQM:!Gva'K=i%!s&+%ȵsR)%bW}YoKE}Ң:/^ӐԩPi>eyc zav!gN.5܈N"Nٵ*R(:XZ%|g4pjޜ#PFH{Rai.aR1NVbt0R1o#;+tG\íP/.yVY3uO`yC[Rpz45V2@hniC"i6J'poB^>aM +'L|tT!gB+q}ċ 17OF8$Y^2 };YBI:rH vdѳE^ҸSy NMv& js"D3HHfb7s]!O$1t Kk?߂:D:uO3X-jgSe +y=g9 V3D _.%SJ\tmw>az#|Χθ?'٘VͩΉMx]cR?Gi|c>کCadDTqQ&uwx!v]zh_%rIDR-g2Vذծf|Sem7L핇ߍhIKMUbzXKZ.8廿+#m&Q=qoW윻b3˓XOM;V1ASbP RKH=~+ڦBORR "PnjSAgAڶ0`HZ4\@Bڳ/dWaϓ7"^1t}$8Kځ4O'ixGZkS_W*_p&Q Z9%_ZITSg0XZv*9gI`pSn~y7&љ4h 1Ǔ 05%&}jB*-f񯰘#R~&Q[O9oA@W}yj~Ttr{GW\+r0OB.izIHk-SNcRS~ &3KK4xZkiƇF#O#(7M%QGsh͞Y_xH|XW`׬tc"W!S}qU &aULz ?~SqPEY*m>xzI/G"3\RՆ9Q 0WƍE$_yX̃=o6cQTmA7|McʔPl5Zǭ)*VGidAnUE_Ot L/ uAQ;;Eez5wLV󍵧&*dxN]gUaLY3 0G̃w}JĦ C]xjXۛ>oG}!UF3CJ+E/F-zjH' YLj`uM>ȕ3!O rxB<Պ#9eMqwqj!KO,#L1@sT6$|#fWdLvwB~ʻưV|p] [%yr:$"&wԽuDz_R>*A,5?uؘ hjN!-ܺ Ɇ\hϫKM"$"3`p>Ih?dSߜM-BDQ'~$͗#'|I2ٯRM nRayZu4aIpk(j8U,*j\p ۘt Mof!<1uWakԏ eǓxhD3Hzu}]1CFOCRiL1]}y`YiuIO|\WܲJ9Vwͳ0UD( ڪb*TЦSI9j=k͵PDKjY8p%LUUPhjя_$jXr_v;d.`;؎?'spkl;,nɊ'|F`U1]E웈FP7n/]7UAulKt|7 SB,L1/F%*݄2h84^pf'3a< >[#G㸋ft& re N4d~XEblSݲG}UaizN4Df ;QCLz3RWq1U/oyj[RWIKydQC%މfDW8$&0$а)Z I-6M] jƨ1icI@l ;'},һD/J<|*ȉfzuK} f"Qw|vCԘ߈fg.N4I_q3D#[PUt\o0P65cHDS3Dl݉fWŅN6;>,LjfܽlVM,.=w Sߤ9#2qnvJ \nw̧R+K b#0Hpb,r*lN8e/v\QYRcXlZj|gN?QjRcfE=G<?!bߵ1GA][w+D?pޗEn=FwH 5%:gȺ&rWX #5"%fH֝INv7xd>$Q'<-S|a6LշY?/s8M,wd=muO9qm85eTibqqDqhbxhTvnD3H> dk zV  a"GLܼZ>f"6=< $WYֵ˧i7zYN\}ud'A" 鋖Gn;cZfޔ1 c"wb=nZPFqqnxڥ_fͼ AX]O6I3 99ػlۜ<.:ͅ*q-cY'9T=)YMZp*dOkW1k՜>X>?fXsZ~QlV*Qԣ[6e|qZd>q\Ȧˌgtd*e/S{;p:|`C$_q׍-Ɖfu²Dhf"D0ا<1uU%ƝhZ٫خ4 \XC~1>c/g"sʪF֧${${fZcϓ١&(DvvȣZ |OکϺNGYVÓyrrҜJ'I2Ѭ٤u,kK %~6N7ʵ G:#TU5Tֻ#0rb&Q}Kc~WysWo詟ti S@gYAȕAWoXjLԲ_u4V2zmM[SI T> r_HK5}W#\yyBRԓnOB.⹹s&QIliSבc0r2$HH|ntcȳHOIȑJHIH'2rM#vTTz'45cr$יFILj$.?Ƥ)h?< 1IT/ZJ?9ogf$4VA192,3(D= r~GGoa oHL߰\с 6/z"4u|-D }ѫ:vd^dRF"zv;P0sMUڮW)z͊~UwwIT( l/auߋ.ܳy5ywKI>o%G[Vԑ\@aMO]Z ֱnq']–}Mk;Jgg 25ܿtWf B. њr M!A)Bԕ̋kO`3!G%Fkӹdy, f-蚁dkʹuد,LMۋ7/FKn5|~> L|FV̠.ya+ MGYoXGY.Te]_7w$RZ,K1|s|}&7ܱcD'~a`pp EC+ D3Hْn9 +79C|*ߜ<15WV/w$я6WBRGD3HЙq,.o msV8 qI`GB[ `ѳ5O/r˅~ χ[-H Ӵ _n?׬Fmڭ'f\a% "lmJK#=>OMY͢LG xżN|/י_{?QTkxjmiyL?F *馺5l165pĠ3I~'d'YjH7#|~5|RyW|ԋjO, W>\쇒Lr.En ZtRy%@C"mD3DZSWJEvՃj>h %Ec= D3HOGAoD3HvNlD7gz/z#CصJYk՜=1V:ql"'sɮ?ŽYSL.z5 ƶiNX2;zYb+@cvG~Cjě5 +'Ab^3vŲ{$U\vW?\?\bTF_^Ɣfs\X(h}l8/)}ݸIW!ʥϺAXf;Q N9JN @~k?`FVoըxx#,!'=1u?[<VL y#˫Kyy9{ 1H\NN$%]~cz#gt,re)yGpzC<, @0!MJ*V LRIڑAș i:;!ⶮ9 azbU^ngesIT܃z^fS41B<7!oTԃ̂Օ$:e;6@YQ{wŮ(m͏y+ >Dp_5Uծ m).dӌj+.:s` Qpi$2Qi&c \̲֎T<̃cB($Lڵ'%26rֈ"Xf䊇k7N8u4d `J38%'s2on uwX}H49g5ctWW\hP_K`D3DZ{WӯU0 )?jDO>jMgVʴ.n ,gĩ^V0,ꍷV͈f)DS91 @~7TF$I{DkKqfYƷPb7.R׭E8DY9Wc!b8V'݂^&~cVuTM:SCC/=AR(߯+< m7p>\Y#gBNBFB ЅwB z}H|XdѨbSpRE';$< au'@r iKMJrH*o<\TU jMW[ :aHϓj[Vxso:(_cqS6Z eۻR$e.-!^1;.QKq{&QL[{'P?q߿yI76 n_?+<~dS~Hrn$(KM$LA$m0#tᡥ M.:҉5U3Zz M.c(nFWKCb/si7y5YOO`9Y Ω+F*@yŒA7JQc׶1%yne#E-y ; 6o"sWlqYpYń$H鍁$U|JE[>IXSV,i{x^RΘ̲I=H>zK^rVOҋW.0DD3Hd>8;>3HDN|;K|2~ӽwBOC?iA* $&Q1Rr7BîwYbkMÿ eU%F4JD(~ZQ.??fգUYfN&w\W_svo-#A"rZBygA3*> DyJw]auyvrÆ*yBϿ3 V]FFqLzKt=Jb:0DDMy; J~mnR3 ٯE.ƶLrӉfVk3 k\WQ_ւr;YgV42ǯL2Ѭ~eeOkھqKGO)r؈fU^^=W[!9Q0SZ}i؇e5~uٵ;ܮ0rrq>N7j4Jt.F|75a?Dy⻬U&̎44OMi&w?^0fm劃6-SUnD%jXຍp\E[U dxR>&ycg} 킏a5so-ΘgH,_kyYd9k6ze [S Mkvp5#khH0.jE>]{qwF89v7oBY$"7|EY&,o՞!dv&E?XL c|ތiX679nD3D u3`i&ݪ1B}XC% x1pA˔',!Mڶ݉}h߈?~Wv!;_4uL~zp*枸J}u;"tz\nd|~qOCt^U\N7*.N4,Rr'6H%t ~g-T (CHptaF$P>~!Й$,s,m{7+_aqcå/k @p$LiF7I+冄 [jӔ#z[!3xXZga[HOoJHuE#a4F']Hqh?I\@R7!vy[}DC{ht"=$X;ď6<p>_ aqiIB$١Fn՗4UxjYui8s|\ԩbĘa i$G0Oa%L3zUDKW0j4ʕt_< o'&?$aWFN&7,Q Mp)I-YVO}&&}6ԪΨ2C.`曉DF!F!Op>YZ$'\+1@Pܼm.n<;_;D+]* oUj!nŲ,BI;bs|$I]oW0D%+>ԭk5;C7.& B_NbQNM 7ܱ ;( IM|Hڕx.aDjeirO:S>N7J<rRc<q uYr .(;L>d'KDX% Xi7h$ݝdw ?6MNHI-W;9bς@~=IdORoi+~`$JT'AU-z.rk;NMF"2tk+shc5['A"mBg>du%8h(]3u-q\v{!>~aOז'v)S b'IN <ЫLǯ;lam .aRXơrQHk]s1%S7 G1$ǮxyЬ,{ 0m7ߗ @=nMo$2໒,W,`$ɇcGx蚷n>]s3UC_BG^Zb+~7Y ruKv@qĿ]> !l?qAϨ;$* iK jH+0Rϱ_UY6S&ŕun'xU@8XK[l.HRF7 ΃s߃;Be$*X,eHtޚ" YeۚI*ͯh$p zmKKÊ41*!y警}JH1(NȑB*_E4:;<lj$~'JyJv 8eV 9D%2l$$LmjzD'zktlװfpq gVw"iyV* R++>+6[Q~M0}ۈƃ] 2bof.uޞr N&{DTlrM= F0{H9⻇g!f3& b&+3wfz;7#ԗ(D%2XM|B !_o!{r>^ #yAK숎i>ȒO2kF7JAҗc-HPN7JZPxjB,5_rd;K g2 F!_eWj9JKB ~eIe\#"y,\)A\5IWmdCbcR(^ݯN7Jj/7}9"*ɈMʶ ]\B/缊$<*9ǩ udI ]ԧF?f<4m}yI~; ![HMi 1-5[?bD[b /U= j8 )bbawxwk mD)立JZj,_H ITXpR':qN&-Z렛DXBkJ]K w_OM `ʝ0HQ*tBЯ_Ȯ8TǕ܁8ϥ<5.f^I.s_8 I}I|Mt#j 4&Qm;OzNQ[:%b}lT>ǨT>!wzӛߴ"e4z@NOFy~|'#5fr XjWȳ#g>jPZTyʊ;6K#ׁxjjp2yĀ; x )hԔĀ{>qGjJB,eN@.uĔ(K-r8:"<(<5%z 4ԔoJRGuO *09G 0҂'vT:T7N|)+jʆxj=rP%ڑZH^)Sau GI>"H %FppH>;u"53;>Fj'w|ԔKb5RZA=ee33R>v6RVd/RVoi2RV%OY'ړ>Vhv6RS+)` +[T>/Font << /R8 1556 0 R>> >> /Length 90572 /Filter /FlateDecode >> stream x[--g+Vxt]0(@eH"9Ei bh$ /_zk>__߶mK?LxI=oxU/B]+˿w /xο y/x~ǒ_{ǹ_i?^Ja-XJߎ^{ϊu㣎S)$ +GZ<ټ{櫲%,K{H{)ػx֙@,b!geuW%Qq]ɈzXO{/1}Y b=ufGa,rcqUƭeۣ>pP*E{N;`Oj Ѿ+BYw|OpUSֻ*Ef ރ{05fa&`8LTpՔ/R653&Fm`EfL1=0Ql.k`FPc3 Tv48DdR2hp. Zt6OQI2x[cluSj”Gx8 l y`VX>\ iE0Ew b2,X,d\q2%f,T .=̓;2K KHgsc2V07 tr- bI$(rq`9cim?ݞVfUubV'bq{1MD1E!LM/X],\$C \Q;ٿ2 *^3N<좩QUce <6JרSJz)=1J=mx,!X۲)IFziףQ} &4%LLH}CLT%Ev[Oc3L+ưe+)??@҃_/8(_͉y#UDXr2\eQ胊:leh6G!c.61^Ubu}g+A'oǭrk%`՝?pC^ ]x lX(֘ PtOxgÒ5[3˾"[ TQ2a ߿-|}nOﺽl8n/E_t(W-.(ݎu+Tk \ X[vXFJ%_eݴR2Pu\vuLK!_fYlQsrX^QKxu|-s^53U9 U@bGqȖҗv$'eKO4vPR{akUXJ~Ub?!1sKpi,ыİ XcȎl0 +~1,Z/F7(Jʪ6 )i&m uBm+I'A}kL(լZ U$Ҝt, /hE j{`ݮ7({Ա4[_Ez jt䢡 Zb-*)E%I=@_Jwo}׵Kʑ΍ R(5XW; ߊR(v@UNY_`gPԺCZ) B>8nc^_6 269n&FB> X`QYBb5ʝ%>b:omx[T",{RZ%Q@=MCD3k^=H_Kw߿+wNĀnUL%'ӋBdM-Q-"pUñuEuuio\Y`\ǣ ]+Jdm ]+JlCYXX9Y_V͘P̆9rmmyHy`hvFu«H–& b&ПbZ$ڂ <5mjFdRDdj$1\k2U,Mjs'9cb=YXgj,Udz1Mب[CJ$[ĮR9/^20̋vN:1W?)#FQ5X4\"u55 I Nw洛WW/BNU>Pg9 `55=p!g$Aͤkx'댭:.j&C4t?_;"{6f=J@ŲJeTeWڊWR^64I#Θ&YReB%o5ʬܫFZx7b[&55̰3 *gkZ QXֺ^p +0W!!V/( -"\#q~ir-"aDžK@ fy^D"ņEȶ/{^n0Կw P$w1vz`,^ t[']*(#%wuluz_VJvH=%UPDA ᧛JMׇvg_k'P`}f΍.87(ċviJW}zO~î 'A/ N3P =Q\0Sav6f\~cw܁*6 {{{F7/*=@rwlG3PkT" "ԆeuLh5QveZiҗF N#?o<_cܤ@,`|moBkHsŨPos;ZpBeAxk7_m63ckT[1W-@ޫx~aZp8fޗد%b-*{EnWVnkWH1m5oYWb4(+<|˿0=ٵ{ZuϐMvkٝBЮ.9O\&(RaZ6yokhm?vn\7/}{y_u_l_ OXlpzW6мC[3h.MQEZh.!>Px= J6=7rZm{A˺ymVU>+e S}(0+I(`qPhqӂPLEKaqzU!" UDq"X&"NtHdq&߰,f`mn`W(XTn?9􂗋*NB-e쁵!pkDjM^DPR^j9 /eJLrP`,|(i)I7 LIrz&E6c(\o}b'GH~ *yABRK$ lK^h'愴 SV' -;I̴i)e ^}&]i.{;-NMcma )àGmo[|, .K]V/n)V>kZm@Oox~ #m'M'V}W}DGjzPwHF[kG1zu~;v HL D,'˔[`cWb\nۊт CغY35;[8kApVXu]ˡ7\ctu<% RZb4"FI!W_$E+w&(M* $>yמԽf"< YP2%ylRIb\:6?a ;v7l^un6<_ƅD].«lcYq?B;=P u[{n$`{\Ԃ+C!r7,{o~1Yy3|r;x}Uj*ӫtbx)M}?5 XBA>a@8N^Y،:^Njf@9UnD`=_Ò[$iiWsyF"cG^eeFbG'n~ w˷/tz#Hˮ'L^I<#5?%y`=s#蹈 v?Y8s+RyYe}.,_.-e))kLDIk^9m걜Z3N {3|\iaZmx5=ݳLA񛪵؎Uǰ{<WY*$E]ZB-0A.2wk=7}v0cM cԝ[Q+CLg3{YKgqJHY U8T䵷=0i"Zvom@;f/FK|(tcX큭|ؠZҕ W9$I4j M^((^n`kSkħxZv-4*@|9oG!Q[BZۑI͘N!Td6@Ej7xLGBg5 s2. &fY**ݓ,F$czCAvaܠ _ȅUDXf楒UjzSk}-T)dd,֝VRPXdyzCkV K0U$BA~!ܡRt'ajNd(tonDzBX=".m12p 9u3[cjdQkGb}4DSLsm5L Ejɽ(WH$bb 1沶PBYl:YC)Zjċ&YLV uUݑ՝y#aN"~9q'B %7z0rz5Zj˻8Maµg^Ypmo| ɫ_SCڣ@ G|`VCU@SSR)RVD̸a-MJ@e+ 4I]F"]2,"zQCZ,־Jd6B09A~6Ĭg H(rKJ~==ox_k+Ktׯ"[~aMyoD_J-Or7ܟl^ڏPPweuhB:P yu%zbn^=t:!?@'J=wU Lg}"I+ RiZNjXY5EHr/A-`Jp oXFj6_7q4:hʰ P'aCŸ/rəP؊È="]LJ-A7n1KJwg( Z:Ybp^q:qƷi\r| 1JW3WMʭ[kO2FdpNE|cAkLC,FrQna^J`/H5V!jB4nhCg;f!TM~+'<k" 5,Z6K)l3qR X|lpCga3ka!ʭqkޱZI"nXԤQt4.2Zkn jƵo8EFqH7Sst_O%m߈$ :Ɲed3#!ʹw ' Z5Q[PP힭9u} Z*Z(@=բmq\k"k"Fa$;>/3Mr@a@ 78-+3rˢ60?/.Pz_+U6&Tfh`]C ;r;4 Ɍҧ"@>N\O:ń"XDU:So3U#ǀߖJvNh[ >F0:N=mBmZLpysaXCؠ &l\B)eJ٬]9ׄ5ߔ?%v,^L›1nx m!tHx_VV/#(_ =p=` ^슕o v 4U/8; ~qvJW9" }f_ko/~B/|w~D|O(gAQQԾvr_qeCaJ"Cov7Ň䱬AK)xЁ5_jUk:z;[oR`w}Q8//O~y^,dM$S+?(} C eb 6f;g" 3U.-8鰇/rd|$:.:;4^;Dɸuv2K-P`W'ɇ1F1J91 &bj &0:x6d b 1WWԈb'&?@c)yzj^8V%v۰t4&2/ q7[n\sxC;q+k^g,zےu2Wn[UX,I_!=Niz eOm7Cxb iܮUFM(Y)|h7fukeB࡫X?#'MB*8ayڍz}<#. F,RXl;nO-kЛ ЕEݲ@fIKoX`'t*c^6*%Sޖvt(0yFEU#g:4?BwV8gM}?x٦ 6w\ÑvRʨXϚe}BEgwZ[1*{`ʥk6V ʎ/坆RRӜ-T}7W2 ^huw#ZF^$x5S?se!&+Ce3!^߂H.Τ2#AYt7oB 0R7n>a66 HƖ"ȌaPgWHZJS@v tiX N/)9Œ9Zhwb= VrЦM},N 4VlD>HFY(+1~GM!i# l$8~_٢ C@y.m\[rOƱHEo@5u^&-T_FNxJ* 5XDekbA}Z#"Yd3?u";`b{:@$Hm dԢ_@xFŐpʨ H !;10 2xӋu`"rb#*ZPx ~Xh% jpGp-R`dTS]a Q#+@TǐQ)rdP7&dԄ`{ ' i9pR 6]2 S-/~>g; }Xn5~ XmͲJ8\-i'k V?'B*B>pa⺵M x=!XC2zX8y7PHQC)RG<7L$lyޓkV, {w ~.Fi5s#BY<~|UY~0}4sB-+Rhy4-=8IcOwyr\_a0Ӫ%VJł$%Q8Vz1ۼ&lM&5j+j-`sFP0>>}heo;4 Rv#XíjжwbmB{{ Y4^hqO8^hq3AKvM% ˏG}kjXv!:duq<@dҘHy7Z;8|jX.5L6Lw&4EpfK2 /m:*.&!>`_f Ag/jg/>_fC)Jez,o =6O T 7Y+,d0#"0d$T`F, !=;j0rV 6~jƞ/ag%m"GS sP>꼘#S O1vO h5ޡi' ڸavMPEcI{'q%J"=_Sb7k*L1{â9S;ڮwS}p]a!FNܼ \Bg,@E+|Fv !arCr2Q ØR3[ٴ6:V{늵dG-;8z5]ʎ]kF2;Zw|%q!!lZoA0X\u-'Žxܢ ݛov׈%9ݞAAૻ-mlvƣ=Q(~(U8y\>e+j^sQE&u B 8*}p~$ C,}p%NͪtNpC5) TaS7Sh%:<#&>;Pʟ1l Fn p cu~$zRar\c?@I0!\#OO &IgV2hzԑA );[ %A& ay[\p?bNYEJwl.YElCpi?Rɯ$Z_߀]](J-eSc?͡d2mf%6 pB MW<G;rTXeiLia38zNɅʊ5BEƠB0tctK׮\-ݘ\ŽƵG8C]3VbnoajY3JrQ%5? 1ZYykoPe$h 5ɆQ&90xߠmO2$ͪ*jA(me)'2 #X@t H2)/cUٖWI f7t4[l1]j{ S'*xteQ`6N9n-/@ eOaWiWY& ؤɲ>Ψ(1FZ_ruw;d~s$fmgbRǤek _Q>%H뺪Tk֏7aH&ƃr`c6ՓVp]O 7{mdTgi٬b]ƸEyJ$U)@c9G|@a[p4s$>L6IoF_坤<=~Ͳ+v/tڍG.p/wu2I< F مFh']0Gj:v.΄Łݻ3M-J%v)'|]ZX5x. Qt..0B+pv]5 Q b:*8HfAXB  Y~O=YЯum#w"k1{/εb@KP1s+, R3+`mi@L"[ʙkeo#9S,FN66jq,oezsM &XFS9(4=2FΜ*c7Kpa $UDKHS i5H%?q\!'֤J`Y 66j㭸KDU洏DuUWtCF8Yx i1LKrB;fnB Y&A- +czWdC s3;l\P[܄fcPq lFb,D }@&c̒:1maaO Skp6z^`_?& kwcy-C1 @ |b i^ ã3Z@R0|LBտek1W~pkX&d+%p kL2L$[dkmC[ia/ɖb(|/O$u=,"PpbXmA$d߂  E]1ZAI KrdC_@}toz{,F;\|gFh3)PFC2P XX1zBjQW+'SQI)3ͭ:m,WqᦙDi-Ev e<h)p6Pᅲl p<Pc+GGk^k{oMz Twlq@PwM)d[WXm<JRc5`l2d|MMw,N'K) ϻ eh.d"[L:/Ja3Yq<[2z|P#sd=2);?9dDpxߤ|ԬyJ:dIe+oo _Kn BA+ Ɓ{ ^o}$|"y^|m =P|jj^(7XI<>:D*wKa5]J Rqɩ=N!ph狥ؖiSX$ᆼ" :l WIM1] /rok$<g}hXڲ!5GƧ6/7U#a"9Pc,lY))D)0|bpez``YU5wغ3Ƽ {aC8\LdRhѶ'q5 u,dLKH&p2A{lZBb%8֐Zd/f7/y 5Cn;9dOxb0Nbf!2 ɒVa_܍Gll-b9YUo)7l=v2 R-㞂Mְ^ B!9jd6p+0,=;j|KmA ^͗4gd5l Xa-+ٹ J2F򍡌BPmD:L!qdM-Ȗn&$2<-Y4i+y20;y".ڍZ'([^"/ɠ?N"sA9Ngͬ |G,ʑ]S^C;4͂v,~&"NV> _\ 5$LF&4%R%7L)a>_\ zJMd vV"LX ]@!"5Q.Hb:Eq+ DEy&ss4iY{Eh4-/,VC~Zwظ.:!Vk5`jl 9ZJ -^}Zy|O$ k G^y9ci1 h1qj@Qc嶬%0 dxR6@Z+#qWv1Wr;'[=L=4Zm)VXI!`a;6M-X[%Vͧ5w͒@o 3qć~S5bɸd>e$f4rG^2ּ'*sdnOiQu.ۓYPjŕI+5 N@بkUJ!J Po*F,E Qc,< J1J,@I; WΧizMЅV:=V}`^5HWG,)D)«{XZuD M 5]$k~Sb"^$nO Q ήLk5@5 ьճNP\.|bglhԈ٩R>9';a6\[7j%X=i)}CY̕ṽ.0Pj`R+<:+Zn*Z%8h SK6tUkPr+'+ԻM1=ǔ92#gPc,scwʺ@|.\h%7uɵumB\!_W{jWl5g >`sޒ4b3^PvЉ@n8rKuAG, CG'}p8k+xr3`] ܉!m*LƻWoȵpm:i)bdB\ *ct2x[ !JdeulXmw| +tYӋ+Ɍ:2 \%L6ϒ^w{VW:-Ǿ5BǸy FF@'ŢΕ"<ܗA6ΰ6^'4sL:XhQ!9LMG%j>K.R/ZfW\ /۳#13$cx`B1V_ބjqx}-)W !󠔙:>@c "ê.GKl[>ξ+R}2j7$Z 9?dd=HSAP[6qS> WGXQ?7Aڿl"Ъ5)ƪ$Ԓc;t%jVApv^NQƭҡxok2'tQ lqeちaՎ$Ak*)5ƪ ZdJF1EeF/2P;+:GťcÈ\\Y} j'#rب~.XqZ5cV>-ShA:9G`;] wk0<$p8Ɔ:_<8::pRX0ELF MdRh4~% J`_"Kd*!K]JѾD.Qj?*)JS0~i>D \Ʊ}"=@*=i*z!V9 O~@X2t:*{S_g0Nm &[7m3ӭŮJ(b [ lܴ؆i0fZ6@bP@8lt0d;0RKY1VKϽ #߀d~]tznm` }T oc~E)iRtBϟڋI2!RӍW,`n)[{f 5 ơex [!O*ߏLE2$˯c%F]P ~tm+dsN.rKS>{1'X*e$zEw;Û#֎kA#%(줐7f/] :踞kIꒆ Nԝ&6AS3&aO8OJ?H\tab+َ5LB$p:Z,ebݚ`  >hMQO?W5Xc( 2GnE%A y*q cҽsHSLC AL S$3t+ &EW[bBB>@_&Ҏp7Kñu:_*~^/,ų{7zI-uXٜOl6=aF"Ga"9HH̺ȀA܂ 5YXd 7l:X+Y\E;Ksw=)$i ?I}r6DR,Pi)*v '0)0q9sTK+oS*g)mJx|kf޻Rc%qxkfXU_d;I)R~cm*J36n宦QHi;oD62]MXu; Jx5 /J55˘ Xm-sy,l& ܻd4w=/ٗcҚݣsKq}-%lXU)tĪtÀ[J;|F,~Lǐ66:UJ1 iB/`.ja/dc1r21fCF1N鑈/E/Ԅ9 6dZ8ҝ  ^wDŸ/l<@ zps&_+aTpK܂N`.Nˎ}L:MpO{Sje}Nv #H7F ;Kᬻq }{4(,Y=X~_pi5q+ 71>Y|QP7@g Ԯtg(X{tNz>jv=a7up_ΕL൦c~@ٵ/v,Z$efjI.܃,} }f>>Zf $brPC[@ǖa-Q471 gRf"+sCԴ96eJ&svcgQn<4mfOS̤G8ː2)8(fl|$h$;A3!᥉xe.+n<-x'F"R`S_Wej@VDKUm@)'b%6,x jc-ϖ^%0RI;6:a!HJy3`ujRcZR&2X@*MsuÂ:T 70rX3dh!P@# a#QpNrBHya٘@pHG3#Ev狛 ?)tPs8og"D'z9lKm0+9AvȎ0)|xAMY!@T9|_<_v5ay 8_5wyQ~R|o.x==˾Ŵͅ\ʷZWY"YAb-9ܰrVմ Ay4XVRE`e|aJ~`\b\.Ⴅ'˝ ƪ&@jy# H.ْ=eʁJ]=nE0jL8Ϊ:wZ/ $16:Jƣ)$amR`,9nF{pQ\keNSZ$JhSQ { "ԑ-eA]eK+1Få_K[H閰BҷiU*-Qv̭WE:RGu83h;-S),5%D# 8\&BAF)8b[ .6`vi`;4+nJR.*(];79,dkuu3>`3F(ؘa|ٌ޴iyptm:+H+m4ilPuj@VNj>|I x7xn ﯭ Rn1Qs5l8l2X M?,@*V5T7T(Ac'N\k/=@(r%8 RxHmh->?d|xp/_'^l" 5|dl-pFUY^, dYmJծ&QPA9RR z_vCO.EV䨑$ЋVO̸̎UTʙZ<)V,P1`}I $Cxb:Hw00zDncQoI]h#dM!P@jlF%X1Lٟ~<\1(AE+7Ւk[U]bgQLB)Fi n+_+`참j&)tl#,λF~g_xM__V뺆v緹I/鏞hOqPi}UŴ<}=c/mf|-L\ M:Wm/+aݰ-y2R ĆKx{,] 2J~7jW6ZezQX(7L*D54͌nJ>D3xDӇ15&ӇQ#3xDG6J" 4_CSOBh5W 1..ێ bohc!5*"y1'+Ŭ{&Qڕbc_aa_ B;nB1HRo2d|}MM z»'RZeW .jHhY#`|̴#vF`CZv /yVa}X,fЅӏR&jl[<g];(lr5mc'(v@YtAg549!li>('}T|4'{ҍA{Wł4w~nRwT;YSmNfFYA]ZVIJYty@ń 46G=w|R h>_ .j=a}'6u_՟4]`Hwp PW} *p( יؠNGvc;*>6-r$Gk> n.4$27@2mXv a:4% ӘvA E,7;헒㎥\- N\2_bܵZvX\5k&׆?bkPmBL|6;gF3Cajl:sLRׇgΕB.f=ySt2*_dLԬ›a(vh|C ' zPLRcqg2*Pb Ί̽YqC Xh߿APMZ,I/8ٺHaZa5ѵ *-d_['P՚9TJa1x)WU* θ!L3'MΓjMic6 2C;o5-CJۼ^o#o~ =ױKU$ yBKm!+E癄 I5P^V %H%(Oʂ#X@x?Z 0RKɴ`d<xK.t C(>;($7cEYOyŧVŽ(- dTL~ @uPb >_ A2ڱx lP`<٩ xؠ` re n{*]` z 5.&_)>_\q ~ah/.V+$?-zL(ϧ~،J12Rr|I ybF%2-CTlo^$FU1c2bd&PRpc(k:ЈŅ]y,r J8 9657p $^1֒itCL狣qX,/1b#R$~~8?02Ӎ?Ea cɥX$XbI̥ũe5_@Q"*F "*FFGzf\V 6:ʥ]C^** LW LhšQI5K)%m &v02Yj 1P5)$ݹ109KO)/pTC.!ICH( w,'~wI?΀qAKa؁̸`S6۶ȶJj<;uZS0(PgkB3ٶ_W=kiѼ޵ݻyXTg={_H\9FcSKytPUv$bzB/Zoֻ$sᕭ6l@/[yo]^E׫Ű; reh3~͏;ecTEmPNѐ:ǝϲu(U=pB߽<ç|;V!jgC0-=~: ;[x\_Z qEwnuU 8|0K谣RI(FZRɸ#ss%-$2>H%|V aZ B2NYykhhŊUЕ |QRH1J%srk Y*Prn+KO0Pڲ>~<(5( %O,@atwc@/H@ Ԃ@JLߥ+~Ggb.tL6x FD!k0BLL P lD&CmBUk' "=NN6#b=N.@qqB }aTjd{xm7X [t\Bۨ "j$}z)]zGȲQTWZT@v! `]l,Cs"wNpK Gy_Фܕƥ̮ۮTQQQs=6N{+bT&Z7hH0Z%ZC ;vBȒԿ:@z[4*ָJ8O&hJPl6ZxJP"q­Mj.Pa78TtB>8t(u;q$%,߁c j^R Ӭc5/tdlH"CV^ \7Hc哂w83IRV,pϝ>/2o?,0.2ɯc䝚j:x//O-HTI|)0Q {֦%i;/b)JG$z Ve L:(RK>Pg%qf뭥4~ؒP;g7ewa\ԳLXt- Fp?"P #,K$a:6Gdl( zhcaB!=pVDh88 U/.+_$2[RgA|Azib?0zI4 KnvG{1f77+h&*>U~o~8HZ[mWva'mC\bJ,zƍٲu-PhEI1N'[)üdmFE&+$Z]{/5Q2i0? kԮ)!BV003qˊ4de˼xR-P  \ĨYgee%D(tavQъ8xC&.W=F`/ڰgQ:q0v)!Bu y7j>_PiN Dp iwO)>\Mh#gN;}Y@bfvpI%'Է"G)6'(] Cnht|"6Q:xF)b'4N?VǶlE>MpYHT6ZE)6\U|& Q^EӍkW ҶH1D+J(*{[ŻtŶK~U a8a 6 ɂ B(܃A"8(}N24[;lZmyۄ[c = #.g۵|qOuP-{\SrFQƓe Y G(SM:&qc߳k'N X^*nܥB0*gL80 aIqBn5Dn<Ɲ}氫H1ԃcSQYz Q,#QHˏ2b֮য়H` &mYC6*꺮2Cv <65r1ca$=n}O7S|[mnu%SQ 1j?sW9]A҂}E2O wC+`wC+À=Fw/xz"8Bui)WMQUiMSU[=>Vvjv7HgdͶw{b*z<gC]sN2-I /d+"b'vw´V.}J-W4]* }Yn=Ρ8JQey;w׻XAeDexnmm{ ԏ! e_DߖN?cѷMAEH>rJ>U;9Eh ]%'Dz'C ;v/=M/+ш]-_O]:w˺:촎i;:ɾiŀq )_m|>_/}Aȧ/6 R799Y:qdWLv4L`v5o3q:0šKGv^W]Nl4I;re横Nz? md瘓$Qpw='MD(XV *p_PQ#hCv b%0EN('AzhaogB)9y>L\5 ez2R1 eX-2z=gûY\ؗ ر F0/.u&͛% W+WH'0R=(JVoR3nQ)[ך(IqvDh4ۍ6}%7hE4D%M@A* uQ-3miyV$h YͫM.2n뛆[z6N6qb$Wjbz^b?ZF0;;ϢJ{ToFo3t17m$Nu6>كǕ[;&g7.\ >qf~&< ܟ}0g5\C#ʷqgTH^YwWvv l۳Q2C.աd4s[j)!b ÄBSۍ梟dmTs9ZZfvkQV;ۍ<4f{;tC$\R Y:qyQލ\ooC(!ߣ0zsC t& a, Z!#ry; %C/`2BH \8L-D[pHh_w_eZ-S=-G%oF58odɽ?~7v H\z腟3f ~,ҝ1WGVQqgPjZ{Y{ޑ#!ch۔ } ˶A{aP=x1 ʮl>i&s.j,_C2`"O}IB4R=VŃx[ed9fWQQ.Ϥֳr½:0&x;y 8 !LjY/Χ4xH|@z<)< T$B'[ B'Vtj{ ?$f%UVoꚳG89¨Xju-\= u!|3QCx,sաdȺl4(KS7r[..gPQ &Id[A5:$7eUdf„ hTqyT^n it,AJم%\KHQɓS7j"0CDY ݛ8|㰛P`.>ݍDw=NAX=˜+%a -Wsm4ڙ+ am9 qe`Qh *ܴp_9ntR,ˀ @УԻt;MsJ 9 tDO3hټnۍm*} mNp҄Avc,&tqf7ǬR! IC<|b(yyƥ9-tJZ;F]\.Og<>L8aI L$!E;$Ai%fTeZw^%6.Uݫ/D蠾l0N՗P@ vKt\+>+yI^\]$&߹,T7s ӌLuа{LE@ca6a`5] m٤|Ϛ8)bk#5]ݹYg=]KZͭ$\S 3Qmsuv:a􁇣G:uz>L9*rt”8n]I5;߁*zdi1 h^a].VIBOe\lEQxrbV>( x9郹%)ZU&<i/E(Yb&p '*XC+*< !# N0y5=m](vb9$]"_E}eυ,OF$.ÄdHhriIyaO[ [{GO8h=A65yt 6=>:Xh7 E&o[M'xrJO 'mv$ԁ(aGU^FԌ֓K&ƒ7qЄ snHyg$Ex J:+z:WՙLh:yby(B0YLr-B05s*$=$_(dKա :<ޫ9ԋUtNKl~э#?>* HaDBy[zTR5.6{!.%/nfJ$@,zuPBM`UPGPGFX!Y.2C"n *SRn.P},ZX;nTeYYia|Jf*-o*g Z<5ULIdD́AP!9P.h [d` wJf@nţKBEo%de/KpG\ 3 1n(DI*& _Qm T|@c!r]L|r#$엋|*mNNN;h`, q`Z6:Vu=TUz`>I+=OfA^C@/fZ' $~T .6$uB7Lu A1}E[Q#D~vc!%GXAA#f4;)vSlNDI\)lhQQ XQI$JeDPGCOGZlB՘ fG'ǀ.:#ȣ@n!YoC5m2߬CLݷ M2|ҷ͆~ݿdE:2`q#i30Yk+JfYS+`0$@! Xq0aX!CӁ--}$_,-τH_S/ƄU\~7O :F3 xC2S2Y2L)Hf|- s:/sgZ1ZKաFEj͢B 3 ?{n*ʘjRwﴔEcAk-z'0|X1&Ӝr~'ɝ~s+[Ŭ6!V+ sEMGrPaW9oC&'  IqY p?OR I}ģCa-:b0Ze1cj?`.PȘCCOtV]"tkN::HGoXG!.-i10JSODMi%+D+O%wJQz} \/ wif~3t"9"[;}?rI Z&|WF@ [z:xAg2`UW-ҏ|io,鏚b' نC7^`*r3fegHgTow,"އ>uq`ݙQZM~-6p+/1XE\B6;{ꣿȂ8y,ۧ2`x3;u#Ts[ p? .NߖUmBu:P5wNt肧S+nb %tf^kp>]0sA҇mw"mI*'*PJ}%>R{`)1<5ϤK[էi_ լP.ZrΪҥ5+ĤEגO+ۛZAϪ6<,-m}!C<[E5sU6J_<^z[yE =m^r q#VcB˗C4xX ˯f3ٶ=@Em#j ftPHߛj|-w 黕UN&Qu/h~Rnq6BNݣ;_5F Z%XG ۘE'DwWEb|Bюrަ-G^7̨鰳z AQ F/p=ҡ>'#C7YG tH;#]o7c#qTos>C&ۖz[ɚkM#ڦ$5J 01!`f 1c/BSyWI0y&2qkɓ4?cN2p+CAecY1 BE/}dѧX|L [RJqʐWutߏ{%Hrsedj46Xk$v—n\X-?`N(r.=xijGi|Fv曡k}0p]Ro H%Qr1 <ʼn $l`َ$U  B(a^]:hy l-2xkm5"Ȏ!jN쪺^Oɯn಍=MzǮCrV4~}]Q~f b.Q/ۇOX7>.r n-"ȋ~lK/Ll?zvxZՠBH7(-זW҂BQ.?V~~"Sy"j%^ѪOM2aڻhqy7MvLxR e ̒tDLݵ Zim}mз1NзfvֺrΒ=ҏU$^LB;I]u7 {ȗ& qvlKiNU)F "W>sr5_t]1Zϰ"=jc,% ^V 9weAh/v 7\Ax vkպ+AFy'o5U8R)捃e>'Hah,)BC)BeX B 8M<+3D0A1 =8OLx)^bw !81KhȁشAhW ζ5l&5|M4ž{^ndՈ75Rv{ k]Uӭ<㍃ҢoaXCu:Bm\h42+ Jmahx:UIy͋ r ((fh"Gi3o0w[ P̑SȰA6!GN l5\eA "VaBJȫx:gF2$(ڬEO($ @jlA:C UR"AZh';MX l~}U'&~a+\\ߍ}<Ԙ5[i>A48ύ&LHV}jU{_8y{}4B.i(' FǸh_m~L͘ Eo45C@'${QצЗY+2>IZ XIzmVIۘfn!CF~(h.PtNg!GaBI¦xC әXVB>6zśd(2E4 ␚e>fSR;,?XF8Х9l$Ab7Jҹ o%KqA v,+Ղǝ6㤍KKOltxk'HEFI>ڤ3nG'k#Q$ SB1 C L3c:EhC&4"mࡽgU%EDw7rjxi&a)@Z-ɩ%V^H4lنFjha-I_کjIsY,كsS\ ."co8IUUTod1[M߉@"aw&>fQT0p4PCa xhyO㡺pZ+?􋰋Npܵ0?h!=/yD;F8vj϶?t/Er{LPĻ83 ݙz.ٷڥWc ,jh?F NOo 7&FG)|sD2cf;*8:ɠb >OS /{3RA>yI3@w!C!/).[04v} bj37e/a;ג81ݪ $ 'EȚ€);Ȧ h>.7 F&3?}5wD4ޢ;\X!D+e`[uͰ~LT u@20߷?EH]=qNEf<*7vpUq+O5xoQVĒkvAFsZ|'?wq#eFMГ) Y6&.x4|"W|بĄ"8~ h &ͪQ#o$v,@0pBA84W3WI8,1K ֢v MAn5:_ ΉQ6LMJ;x7SUs*g/u*LO.^ANG6]ΌP2`zy/u*Ϡ KQt0!Ry(} P OT4ZK5Ѩ,9MFuiCFӱG]7$G2jWΞ<ġSt-!V~^ݥ(Dd V % X-Y3эHD7:I!.Lu((z&h6U*DQsqMtK.8 Ch"m3 `˸ 9:by9YFзd;Dau͚Zr:v߹q-ɶKPVPwCP ly MCPiۆz^t;qtYu E"b[NJ&H@/EfEt6ʐLfk SG[)d?%5nOKCG.ͦZK֢3r8S9ʏSTj3B>Bk dBI7|Ux q|xznRlaj@{8w]cGpm mV9wT AC QHtW=SL=TTrq>V][,>8"[?"!G90RTI򷨆Ԡ9T.3/Idƒ0Dzgpv$]rz8Ʋz>˨c>4 Q\#2 t);).YN2\zƼjRMiq TodNC!Ga6o 9B0ߦ `A$%U +G`sTp~2t2Ad ~,WsK,7W%"LVp󸂥a@OQ'X),ڶ:7/[ 3jwEv؁8Y=555pVO&~YB_[!%p+%e}ɈNuiE7?F] .Df5Ű6.юg`VbxKr_/>k.ZG_)P_8wh7X?_<.U|t i&gt>uq5"w/4fL _g9YfG1U _J=/s dv^2qfg{ L?/,doƋ„^5 H%gu͉+{|BnWHkH5Y FOczt 3>V 0c4N,eYpeÍj徿8;)6t_N[xkhsKsY ~RuJe+`exav!}>9"xs=WiGW^1C~HA8M# `w+sqlP4A>ۛVKv3>Vc$Q غ}h^x#*;~nZ;ґV:/Lc{2euI_DgTunEBlTbRoݗ훿h8(4囚k?#bñj3K,/"KL31to{h+<2tTG;u՝߼vf3 M,gVff7fj*BUNi #Yj+YQ}/?tR bᶉd=o;)I|$NTc @'~(R׀P2f9vt}W੫65,mSֈϞ#COh~>jtuܸt5R&u?>RNn(=\kPns^g kq2DdjCzt!9AmVZ2H!P D* OZ : Mm0_! }e'e4 -@Z%A%V@O0VD+^s[Ccg01Kb`, ʋNS^c?V SdkF,;2b%#rΘc@iZk8cC 1ju{Q)3kKOL怙Agc›"5gjώ1V AU^8lɯ]TDSDY.f|(CJ~m`B8e"|,-#a0HOi!"EϨg"鼍`߈]blo?Ʋ\ð>uڮfߎ2B]y.uو=K=;vQ`Sv=.` .LM i06e/t<yhJя?&]z];_)C](a/K2yYvm U6Px P^Zi5L/)v)IyU~=7Xe6ZYim5_厍'%tWCZ5$`iAj{Ƈ9NЗ5an]niMM[L*~xwB=5L 4>]VKXTiwC%Ȏ=:5nWB.v]7T~ =-m53@F?R@bє1R؋Q=hQPES#봄Z>ZkO[PF%!5_rT2-`}MԺTwl*jɦC~ATdAth?ȽtC/ߞɽnCOh\Y7;er/[v{sP76;ظш.cn1A|:Zspa`;W-UdކuQlF[ iN;]Ǹ7A@X J(`,SM@}VW% )+}qp{xw^[-R⏭XЌ4ߧc[iOJ4wy_W8u`04_Xqc ,:m9{ć4KF'cG8Zd;l8~(?k#.PfȄlϘzSm_-d*R/EOwZ挵3jkګ!anm[U#"7H+̲@xvgSj,e? VAH7 \>.wPO`B=bC7j oxV_j@K>"Ch +eК0v6hh5+HmXb5+c{*Ū#ĤV7\BbfUF b2,$2"BQ=h2  w)XKJ}pR6@pO w~wZAsͷN xȀ4I9WUCqR#gRԄ l 5 HMܶoe`A * 0rb 7OJ2@djr#U1 2A'X]e..`&6϶"!jDQl\‘M >zIsb2^4+zXڡѭ~m&o٦am꾟o. tNЅn[wr6aۿÊ~>vԾiԟ64Oxbg{' HfY}DP7Qb_k'OVGLտ'giXݧtwm5]S M:"-B6hBjB=Vmk>'oAٿ̿>Zߌ]y}Оg՝?3 ʾԩ7#}[a*x@y~^eh.iөu8taϮ|:xQ\{ۆ׏M'unô}`Yu,^C{rWۊ>k`6^Pa$ےid:I,rAb:?a^f`B#i.jdX]Yd=3.2_40S.ez ǢOZchK>Mؔ\,%A=KK@ ~,M]r,fJP LLZ$X rw`(1Ly;~U 13Ex1_`/hۻJACeT⼸ ݿfzuit7wS&GNƬ)m lA)΁Jr@=]ay̰5wƾAFzj%)*o揬7qe~zP7?2eLnuG2^ I؞*2E}OŷsZA/bGHm+[ zMgcOX֊̂Tg=i[_jE5'nacN4ڶ| gq7mTC{j?/ :lӄNRy܍WO82$zr@uR_,hXZ7i>nT%;zNv'%,B gv6ߞY*^ٵEh]`*-X__I"ٚ$$4z;S$ mIP$V$ *s/Ac>/'Ai+1^v^81~+`obF)8xm#》<hrXbfiSz17X s_eQ\>=5ԋm@}JZئ)cEG*iw&pzkMBc8_T'q)K@ɥ٢"VeXHNX`Z}D⨱{iZ`Y|dɅ5 K3X.fAsԞ|`y'.̳Z``1 Q&p}1> "oqf|C)_kt)*0X 턃vDּ/A>rօ˭+ kAPX j. m=bq6--Q=ڠIb@2h/?B˿,/ty妫JȁTWBk7R؅b\J lpd/~U< VKۉϊv6$TQ *+I{p~L-KiJf̫y֦-Up6xmjX6ΘlcA"cFY;F_Y,~6p 9qp_&z1TǡC|yig.xyqo{NlK[OXdGVLoQ;5DH؛=N-y,G ?re߶~x/-Q5_໇:Mϫo#tiB{N{{&xC]',վ-QT!qMh!w@gv+QjDᶡk@-pw9y>3;sl6*âljk;u%!p.)1 WK\E @ƻi.%ڱ(Px8c8H{bp*/:&-}K)R1p8Rml}`F em{;Pτq4Y' !а6Jo@,:mg -iXBQru YajJ_n 'y|lbh퉎@A~ :RrxoƨK v8H%#/"tEȫ8 GD-j #WG m*U*0@qH`'H-L9i]D?< FԅۓUBVJ K<m%,YA,R ]U(pPW$2PHbmʘYMB5Aǧc=KT3?b?<8ܪXuI_BQ{pYj3^B`d;ʏVuiw?uLA g QnO?,y)LnX f[G;{@H#GRs+Y~[sd)j4,_-E`%)WPxV35&MtjܛXA[^^l:9};i_$_ܴ;}t|h8?@CG@!w#/LfV[Gc ?Zq%SmfTӫoSm)6^8`M8i2SKN:ԦI32h{hk crԷwV-@-Yw%mͼ+<ȞPje^v7XH6+n"M,y~9J-0Hx Y 4ѿ_z(:cjOv$IvOm] $Pz~"hY̤z  bT3DAԙMj|Ύ"Wj;@aaZ%$w.cL=V;0k!} |J򣅚`7l K}*yS{|`/ |Gz|s=xޝChv ?.u,iiyR(L!^NYi(+$S)+ͳS'Rm.ΖgBSVVw\R#^10Owݱk%uy ^׳WͩJ71/mtWVYM<Ğ&VkF}:;=JKpEMWi5}Z?O_ݹv fOʟ.?|qNMyMv5$*\hAqٚLe"O[KiL-7)e唳K H~K2J XQv6'\#FYA6FYn Ar75J6-2FCSTBPԣJ+FZSZ  H 2@knM^XORF_޸ޤ7AF%J}S2RW@idL*h43[^7| }4Rum2B'0 ^W*pJa82| !~` &yxz/oyo5Yzt_<"owKЙ>DF 3^箙~uoX7 Db᭷> uwh,?>ۣp>;kKѱ]_AhOۨ=2$F~vDA89lZ:5h,p)5F,:q sso4b$9 I-vlT EFr>)5FI{bwz4_`%;`ayuAi8O* d#l6եLC'*7EڥOXўɻ^EN"x ;3&]9r vR/vQ ^ac [JG(@;c%C;ekP'D"@c/J@Jq;ʬXlݑ%e=7yȧF\]m9=u()Щ;B)2;ؤt,Y:Qf’HbyQŧT( vIc;^r-&@\=-]ړ\.|{E{ \,\~_h\⠘񲤛_=-?uiO.MXևJ 7r!`f҄3'T*@s)T 'M8Mv Uc1XĐkEǸ_T d1nF{a]B=t 5N?FVz `#]>Vס؞#fဪQV5 JTP$'sR#K6P6_0S(7M0`>Q{|_qnsdX@ yԞ9@K?R3(TZmjom+I- ۄDBp`"rA7>A߅^$?M2X~&\"́3pOft9)(A%8c>$BHFqYSU@<s2z'p0  xӓɸ9+4WaҬfXys(\ g2)t(jRC@Jf,: 鯼|&iD_qfeգZr/Hńݟ% c/ruqP0(d` `pE1URjɂT  qmC(Kl)%4Hy_ j*x:G%b QQ+;K!s̾ ~8d*'jªzL8q BҿB+4}<L@c `5hR1I>PzqMҫi%_r.G\rG=S{SR튃} 2hB`S}s6,!'W'8|h! QH݆$Z,,JhpmaBJ{xyES؊#++*t͸KJ.a&~n= ̶R-Kn?ёey]8˓O_a/<+r\E-&]:sŧ6]bjFVʌj'l̿wZ>6Zt݁AP7j* {6;  < glnܜCSrU5/JI A @AA @QAJ@Q Jl7+DFA;u4ޜNwqߞXo\6b,T\Qm/%n=2QjlO"Cmo{ m g1+i>aA.]'j)vH鳵}R9yI=(KU7:V*}Yfhctxd}.~rӏ [i*_˰Mw؟cmvW_Cm7=䫵 M(QCUܶQMpR&(^kX\3"_f}w{i:ޮBzҾ_Z-4[;bvok߳G^k=x wSb|upH?t R\{CwlR՞璻|:Z(zVq}䛒YDm ֎mMrR_ninh}F$٭D?{O="Eu:F/C^3.+_l@>-$˴QBZ)q* {ٕXC|^pe}Rf֔qU]` S"*V*-To„\`!+7ue &8$6`N.`@"NCԊh&2rHct6P]e٧l6GGu"볜/Wx幇;0 z.cnlR(Q+Q;R )}wa0zr"]NnNj"zTi8^H_X\2\cWqM!)r`U yJQXD5qSO.QjZTnuVn,Pߕ[}٤2G`{p ~p %N`"Ɓ?A= 'O,c"D +|;c"'!&JyFb.'x AaYq{z^=t6uWS?5d:3IWR sȥlmᕱ GqGocy >*$6hb.V3$U1_jo J5>mM[{؋G;x2i uyU}cG8ylpC wo.1,MXiUfK^ڗkSQgi*r3{ՆpN}Ԟ/j  P}-4^r{d_IϺM,̖w*H{+Oj( 96˫/mH'>C>6tndPǙ˹^-`Gwæ@-y!a[ߙ3N`.9{S&ku%'o 2ƝN0/~7PK)c%PS( h񘂪^D}zjgɭkhWyuh?Udd{ q}LWĨ#XGV0TҞ+F 5tm50 kV퉅tAnRch&b&JQc` UI:mXC@&h?MZJ [W-M}% bAfD7Dd=#FSq)٫#<3ߑ+#Ãw ϋ)6po򟅍 /ڝ3D>L!Yc21H_TϨ%+6QE ؉7cFOA@Q=O4RcQ)d;FO8j(fqVP0>92bl[o5PbNOjJB1jWQ-0Y ڙۻl@}\[s6=UYyB1#hPXyB2܊!zMWq@y⣖] F.:{TxQ8jCcPxwkuQgw>tY$HYR{^f)1Q\+ &ȇ$Œՙ-1Ez>d4t [|[^+1ʔUMxVε`]0TƦI!w%`[cJi)(خvQAJ EXBbEOzruZ0;hp% OnzbR ^|KMra5~;gGj?f6Wb_Gm0V̚J,Ȩ[C AϢ7Dcj83~I & xL ݔh/®1#E/K8b nLFfbnTS0K˦ UKa2]BQQڐhtməGyӑAO=af(?oOA%y<0~Ši"Z?D>7=:U*0=6Rzgaĩ"}^y<=66M M*F+cOS6ZTQ CP 9ͶZlOf[mJJ5kݰm6SP=6v> m:affiSźyXdχaB,ZosE $,o=hV^f sa{mC3{P Chj'{FkIkChkŋt?GcNJ+Fx)L'ش0M$R0v"Ĉ)gQR rbZ8lqEI1C !2Cb+BVvf3x;&~J`^"}ʮRk}^ZTRJR{Z~ (yū-{y  j(uSrToSNy")7־f'$Gpr$LTguO0_u4{7œ#^\x ĪXa.@9&a=RK3D48 Hcr wV2;,g1ʜB86ĦzYMָr' ykS2ܝe~OOG5\p`+I+ ̒|EIqH Zy6R+Ѧx]x Ev 0D6UTFAΛF6ޫE_I_vtO.I1&wmJƨ^v}gx<-@Y]ӫ _^V`@εO,u UjjK b,\ae]8L w]fl(5Fa45 _dsoچ[10(JaJ ZLtjfg4PXxC}XP*.Y5WUyޓuؠ?*Aq)? phF&&,7Pr71;ǩ}ҕ^rnizG!; z[CćHmcD5nlJkRڽX@uP5RnObad-Z=,+(٭H)hmk a_C٧Y 4AZէϸ y a::h2s>nf략V4!ǒRF&fS@ҞVmD?l` "l̉vw6j՜R tS m}7{UHvPNL7E).QPx wz H#Sjj0^U {(;Ifo2HPxC-,r#^T^à݋Ә8HtI`7'w d%e]S+L5CAFBĒ5CQHAue%kuxjfhwJdR3uփJ݀+OAW@ix%C P\ c"UhtL4*|'+Ԑ9^ }n{.l4}M%@A03JoO>AyDD HپNsqkL(_08)#5w;c |u7';MS,lGpxEœ„mx_(\׽7-IыOiHBp*)ŧ1ᑫohB6 )$Hد(B.1$)]Ҧv٦gB;Dff/o6xW6 ܐ97ޛveVǶdHiW7 , fS~ mOC0&=9OlwW&x<XpKx"mn q/, #z鮙o OjΓhr!O@=M>nv;cOge* ނW@ nI(xml7X}6. Ҧzo(Jz ?AY %]< 'zS2"7K&(UJPysrH6JAwȶڀ,piF]NS 8G[kF=yfdv@_&Ҧۙz3MeJz*܄ړf];W6jdJV N [F4F0Z&|!\=FQf(Q[r=laؾ-_5fv;tSok']L{?AΟ?hU>)la[%f_?oVk^?]|Qp_ t5|L ~~' ?ѣ`r=*G6n O#]7>VT!mKŵ`DRqڕVpi)"nƨюXEjQ`w<eZ~K>|?[vþc@vÎ WT`;35e^ a&OC7{>/!ڥMɼu $y݉pwNE.=)[b?2Upl-ook׶25"s }>S84~2zwNxãkafG28_!mò'}A$FEAIR,a[MO)eF v8WY Hg1%d{ `qJQ!mYrj5] > }Yc~ |L[(N7v\XLI-hå*[D?.-,uhS:&y/ibGuc((S lèO0? iW]яñ#hpѓU=#Xrqa%FTa{2aY_df#H),}px***әf4is,_]/@oeP̴ `WP#N+,:;l8nʡhݢ#*jN,foA˨~٥vr`җ63LIrwiO $BY xQcx+s_sJP^E*eN\8<8&$ƽǫagIq~B=r-[%#lQeU §/B~¿1 O QǢJ5ۤ2k!oڙ NJA O#(~Iݭ4vp_΂1ӽF5Dx/tm=ًg݊>^\{q>pͰe>DF1d>,05 +\WpB3(lP\׹f6#3:|h/7t`;ɔ*L X&SBQ?tn s`>Kn oT8S2= r"G4!:aDW+N#CúC{NnjcP7A]6n &[HW w/|o[P+7=yV 0[[qh]+or z0H{[VhIh(0jy]v .7PcTd]rZhHGoCbX'rF7t@T8Y0d(8M^+ ܥEVZ(Ɖ ԣx\4LøӢ#؞shܡR1KQj{e=#Ry/-˥:x(Mz*ߤ(_g_ՇgЎf騊|plZəɑ'dT(ɗ$ͪV91EZNNkhU:刵\v&O]4)|3Q(+e38V .HKƁ9{'2QgeLl[SuLaZGW僌FXqKLn/O ])y~Xˇmυ‹c>_MF|ک)r(>z$ )7Xs@Ui7;mڳr j!E'= #gi]i {ђ ݖA}0OCNAXw[&/%:[,ehr#n 5 rWaq"kC+uCL?Z8p~<YW{;G|"}, [Fv`FeCy,C) }UJ!LX˅ӵOnYZεΔi͔i]Z'9^(+#4?em1$K#yibK+w3YlhEEƋ T5!͸4y5Z.ve<`;%Ыۛޡ-rWjFnwva1.:OjP9::NiR1SDQ !P/DY_ 1r&'2LSV &ގ|F w3ͺQJC~Tɻ8[xϨ8cHP !LjtQP>_vàk|jxģ%,'6uIL bHIFb=ZeF`hzq;B\VsŊnBR00}%'"f~Dc_WjjAS,`䮻pk,8JVS_NY"<k ELh,*NyW9ڽ[ի EE (*se{:40_?*Ϟ>*SQ|`_?Fk--ntD\`ȇk>+VA#^vS)tS RnL>\ߵhH 4 bF 3z% Rp˛ ZyeR秒6Л@1Z|ᜧFj кEo|p+PXv2oδ) lcKJ F@Nr_۱Ԍ\ܿ\yl"WByF&> 2qNjQ2r)J} l!+n9ZX 9|VP~m ׬=7:yzl2%ֺuq@5ݗ;w/dvja=N(t ^w ^>C{ M?;E=n&r^&Qu((VIla7 wP5CBˊ ?gH-_+@09Cj{ ze/٢՗usK(+Jϫ.Hye)y֞i2Yn:\|Ls". g8Өa JƬ̼7 4f[p50;2<\ $]φ|MƻnZVwq]\ ;o) H ]\~*<  ެyfk},DGiѱ33/@9=IѢ7ZCh>)oCO[WVOY|x`ʚL2|U5'C,گ-e,f~J#\2=,MYE>Ey+>̱3 _Pɑļ]&k`λ`N j;TOJnQZ"`>X!l|.vjemA)7s"Ɯ_؏V2%< :c]Gi/WE+P4.(ѼU$ZZ+ /H ~W1q} M2-uC{U>PUţ| Z-Z  #./Vv.ç#iwH%'u-ӴOG08ֽ|葩sN[[@z5Xߊ.W>]]~+zUM'[UVEZmdܾ aktWMXuVE{W(,Ufsپ@yB3 4ó[o~2dfx) Ժd|.i4?Ʋ%cfo$#SWc<ʷzD^[ zqPֈJŮlMkշҵJ'HuJce v>+{j"LML1ق4X(jV` gdO2 n4ْ?$wL:5 蔛G L(P OwL-XVlBIčfݰnLk,Zhǖq (ozO| @MfAd_({s'z1 3g(3B=)1;+d ~jFP=R[r_W][ u)PH SL{N &l6>ϱ#G )PqwPT>ت \qгRW|'M6A6j;E2#Ο3saC>X"1!B!jB6$+J~)"I2Y΍u±cER""'`L4'{}@sb.3zsf4mXPYAk6sD% r*<VB z"̉ԂÒf>LD04-h&oytciZf)kw̲ͬ>.nHnJcD9$ڔ(Djm , %a{vjC%d:c@gP)jSqueh{Ke|=HkK@^s| Wħ7v )h곤֩0GZ@<;l uƅ1,:87%{~cgD1b 8t}0Dt:Ֆ<=[Y40e8E >Ł8̜T`~bS޿T'R|x{*jx8;#_FgX$@'b.Xǿqܑg> &pIw4n7_&8EBG2Ƕ(Nd9L}ܗuwKp bWr"+ّz.%kStFG=1MH({ḀYaܞ.d8-HL?5{K'2xt whcs=MH TIղ71imycY7(~]쪚 l[?ЎymtZFiE*ӉEg7׶]+"N|jlgh$m<)0gwY+OTP>sEY\uP^~+<ՊK QȪ邱rW 㮨z8> j4f3@Q'q5!Ɔ{rln!_`= oE0%JPO0mg"v'HOR&V,C* rG4O"1@t@Q[N_q+F={ .6y%,堍 -{38@A1>p]S4KWk7<&?L78[, BrN2*IpӽrG5;"hh+`&jV7|m]X\" Y ŕS|hJuztJ|ql֙z{f-?K*Ō2qO3sG":A.QV>J=Df*{1%/TŞ+qן c0L|"1sk^DH|H/LbhE|,=[u{ho(M.gRl?.ځgAr-!1?\@}v~OxsUr]Eք] , yp- I#Nzs(T;B{cϟn_"9?bIQo֓hN]?mWq/DpV@.ޙjH2a Uvrj Usb^٤ZI(iXEK3KB4ҋ=uhu)({>c_7psMۑ$etcĊmuq2Ohq:_Vu@ 6HIwnhjgh)oJN-bQmP;OFv' ZGJr1br`,}n dIIA`Q >Jo4.J}˜XeG ֳl Vgc. /e%W賭tU]1Sk~h7~g7#lC$.2?;<4;$-.7l;b̘(| n jߺ>jwV`w$E4,/oc8D4\J#8hŸ:J(uŻ!`fu+G_bփr@gg7?17kqx?0 оR0m 8%23{k% cס~靎xWP!_FZ| _bBv G>%lxr.{T.ʱQY#s+O:v?Zw#.߅8N=R , 0bmz*b~ps 295s#˝gSnT+-e@z e9V:Nr?x*$~~jSgXUZVyQ[Xy Mvba"ư;|ky|nx-_ މmw^Ì^3pQ˱[(* W3Nywl%ka2banȥgh$D7QP,GPAnc#haK՟9[[Xi54x=/ AuY@l@@C]=g tI)7WneOC9j7P(zieQI؟ej !ͱ6ݪPg>CWLޕ^bPHiQVJ{ky-@fQmjgۄ-=\(Y» 1},ƴ5Ou4Pe02k^m¾Jq{@j}!t}v䣧D&|w٤< {x-!2<d1h[,ä˦K48(*!-‡ .zA !!b940Ō8Wê"1cD%#9+M_z~Wl_P8raD=ʰ3TަT.h7[@p˶!6>ms EWɧød+[ց;Uv,kG(:7A2sw8PG0@Kn3x]rqZ_>[(\#zt!00(4jWC~ <[Š5SbU.!(nf[y܋$7 }ᛔ>*8rRwy-SR&3%(N )~'RClUG_tզc} du(ie jm%ƚshASpr ZcCM&K ln AÍa?ŝ/f,XV}ZH Ĥc̮`x@JŅ~𚱊M0a 0ѐfCj L߶Ŵ5lkGZlxX ?ŵ/Qֵykv;(9y-[TZܸ*P&ĺC]\kCr.EkԠm# A7U>*Gk7nIK+"\T -GWA_(傃u^7QCڈ;S_%~-gtoyӲcR%չ=x{9/ݓ l>[{\4K y${Ϩ =&6.;z+d}1{R*k .Y ] >^,dErB 'F_嚅rv,So(/qI̓Z rgC-|)Yk)KlWL~.AqbO#.HEZvcoI6!D%|֒ 6U(Ծ]@ABNx]'FSj,~W& V޷e=)Hy LB#Pxu"[e[>EéN9rS媼([tI$[E+bB[*0iA)A-t \CRg:%\z(,)Aڻ6pZв=u:nΠֳ?<j5Ÿk aLODp[}>"GbؠmyosqβVca,#GKƯ]ډ)?Ƀۇ0"8[GM /'+.&pH}8Z7X0C,&TLS@-Nf;E?@qj'b:j`B{R`^ATMj<͙_UETV(-O3}0YE`1=`4y2RC#@J{FIə+ Pr*ΰ\NY5#UXUAL3A)Nqψ:ˆ8{ jUR+|E4rSFM qV)Ͻ{z疄TL05LGB -%0_b_RTO6g½f#/{&6u£.B2j :5hK~;cd\Z218 ,栵N=(:`LgĠ :}5ڞ#7QV˜dsқ26T!VRZG$Y?˲[Dhc^yFHO1(G ֽ)ˉY)0LA\D)DzcK;.xQV -hv^ ^ޢ_M;;ǚ5ڲG2ueX@C 9"xk::vZQ<3S >.K v| S͐RnɾQPGFSj `߶18-Z9pz(rnCxT~EzeFwDŽ;úk_+eDae<+a+w wa+uAXtKa00tu\sCCq?Vz8K'W"n%t W28HcroAm9sp^VL];c#)Zo6\{M~"{0^>x[|anūWEQMщFd^E-W1%|yQm`Env7C` iF7/:{W_o*VqL ]eYX+*C3bŶ|Hr-F!3q_]Is&I[+@~R_X@^DJ9~R]F'4BѠ=aPfA Y #aTvP&j{ (?]; FYeXZ91?`Q~ [' oBķ~0-n 2ޓ#`Ay=?F2Hx^$cjj|VY;I3/ucஞm4&Tm ٔXER5yOL@6s!  "1jťq\_3rMX71t.B=\K+VK}U 5ZDR<]1UKw|]rh+b7_xkb_I !5^L f#@IVV:Xn=Drq47Itґ"y>0Ɔ .|qLkՠvj&M$3Yj.BWS~-:RhWoJsE75 BܰDpUgpBdPz_XI M+UlA7Vހĉ Ezgn'KbԧVwi;gERԭW%c-ú+Rnec[%FrmpF"8@--ıו4 ƞz64R@Z(x-_C(0 vjoDqsD˄DZKʱ[fk Qc00+Q H6huIBT$ZZxTCi7cO>TTj%!#*tthEe3|?j|AkJ\AX{sL` 5e;S#>Q̈e ŒB!6XA/"iމbSNSz07u2 0cG՟ht5JNga<x.5HIRaz3M LC ,&?Ξ H@*e<\-׻Ta. *?W(6[5Sz7 t%>+.RP&ZbNf22-7)!Vqv?_/"diǢ[QQe7Eʴ"̔V4 Z/+SD螑אVM/ɲ(-Rdƹ{`) P"=\;Fr5ѽÝ8M|Ff(bVNM; %-Fq*%P5`vA.sbvH١]q)6O)hƾM;4Xjq.2(ud ~dـsmuK5J8fYN5;m@ʴyF-SvSI1\zy+K5Hz.M#A}(e)dn)DwP.| sזd"5X7¨Dsyc}v'+Vg\_C ,q8>|]}T 5 p. m Bˆ(?au0oU_X׬>PfkS-ܤ̨)W*9W-|ZIvAk˴& ]O@'|*`| ]y} b.@_b-j<}[%)?#"id~4,۞6تD)%k֋壚l㾱5$HNP< ej&Û;;_8 KCy[c!"&h )RgF`-ڇ 𝭠MN|j.ΑdtNy0G.BkGF l]VRN 7Sd[?*?֖RjZܯ\ѭE:P̤#c=_Fclt+TȢыm>숏|3~6x?qj|YMH.}qaՉ$'Fw r+e|ٶ *8KQCI~( 9hR9.!&Ea9H l2P;$a]_ "&hh5BtdziY~*6*R@on2~Ts?0M|4$ ZxSG:Fs:QNb=*܆btT,4M5(=q\ӳv/CT&,V5f8"ԷXZ^N64RNe- lK"Υe!,uK@t>4b,!Ү [}OyTrŷßkR)RভkXJđg(5 (a=zyPѪٰؖ\=TOc\_'RXu M'N_iK>+SP,,i{[OP콘xEx4Ek?/~VZGg`xQ7Ё2Jd un{k|ͻ޿ g1_#P#hÜC=% "(F!oGužGE$ Ybj;.vڻi{u$c(r+bYV.K۲5pɟ.+;NnIvu_mUAVJ*a _gW=Gv$۪+!&U(~6&Mn#t"c u' NOVq5I6gBH 9Ve}c7z5XH@{g4#vv{:CHR \ZH8)݅%E6XH]W C8BM*(B-d+MNP;Ai8-ŔMX\kiiͮd,fԡ@UNh-^{o~8Xƽ"ljn d'!T&(k_"9uH= ܭa$P 12bv!q[oL&ꪕB5rw(Cfx%PmQL?U AhXp_C~/^>[s2[ vKSF="i'+ +Gvn(-FAYFHPo~5' 'n_Szhi$<CŨڹ8yo!ZlR? QSYjw}uy}6MmQfVՑ DPxFZO]*ZYWcgdZ' e1ÊO|\rA1.@Mf)M/_|3$ojla)1*%-&)FE+n6:w]VT/9@iޔ9JF[vU;!UZ<{_XZyo\an*N}r\Jl^2J3qo%Mw(L?Fm!#k٤hA;#TPU}1b7.qe !aBFd*0˗ ^R$F]džsиä́)j&.'A~ʳGH=L98* 8 TZi#cd}NJ֊EZ`dΆBO"a+ rʬwy;тEњIt9u}.f cH۴q;-}Q?x՚C<Fol9XP{ŹcO>C[ S毘mW_G adE pN_3Z\.];4"B '$(+Z=|c.N,۠I.7,KD[*[1M`7[C]# H8 [_*,arjP_ 'ó-(.ׅ6(wRvF(u737|m*-OtCЯ*wA) dwmp "Z+E(_ 6~\Hۢ9T>SƄC\`svÞV+W14-C)QyOIkq1xF A#h$ҵ[$t Ao`m(ۻ-g7_UYPoPFJM3y[Eb"&݊6(69;Y6@&~q6uPFmhpieO7ld07}r5;$A,E!C?&UGl:%@)e},q c3@x[b8`DKB4"^޹Wngy;+Ҟ9 ]QKdRb{#щQ($R ?]^ A1(t25|BrxJҴǸQaCr$QThhKR&yL/r4`Q1ĽZ|vBbz(O6d!C)6!॰w1J$l+LhH*ӴQpeb\ #5?pPgYЉr`$?Q8t7陒Hǰ:=ՒὢeըPQ*ZD\Ɗ7i3B`9҃!~ Q%U6sBqnH=cqbPEMLXVQa{x)Qx94GIULiTw `DYj OIQVm]XᏖԃmkǪisibrFyt1٠oğ,QYڊc\_;m{B؜<\^8YԅF'" [,\vBL0x$W;뾍ds(O/Ǥ 5)1=I1{;az5b.iEq+ ͱNRlN~V͊XoGµ h1t*~HKXڸۭ$pBÓRas w6n`.ˢ- E̳k*Cn1cq.lsO]ja(&}0o?.j[#T6p}Dq+ ZRbMDW>*|]S JR"Vq[en3O2J!,8!DzoǝLVYX/{N| 63{W =F@S[7D 1AMZϲbjCpd^PX t-Q#BJl2#ɩc JО]?|#ńR8cHo&^/QJD_Sx|lA\awyt;7d"+b#~=^ijPB.ZVz(屲e3ZT_0JTcZٿUm:>Z#.Tw gň\} A.X(,}~-#䐒5(҃=)O(-( B^Tf!鞕Co;[=T M +I@܈Ft&;A$J'jcElc*s J`>Y÷Mq(fo:([eD0rQEIw B-\ =hi(ӇaJw37˸`Y+h~˝7ENXW*lP0xSi8ЀicW4ӑrRf64,( `p}"eă3wQyaw,Z:}KB'):mzDXbc<^tB[P&%.xp%AY .lG5p-($.N;1pHT#CQq۸xi4Ȱ3h6G305Fxµ3iF}fRa;#Rgz5S&fl{UK.b)DPh`Ɠo) I2&;^0$}Cћ\HV, )Wgv lAqӕ<3A}Ύ-(ޣ<"81`E~ yTF[Kw!sgeKTP'TrD 6jWWytRK ~Zs 4@TM4ouk_ TGi'4( [iq\[nPMc|j[SA9@rD 3TW5K9{sA8sq=cZ})9≰2Sj7iΫNf 1oĦRAl*ξSjQ:7O1>]ցjGҔB1bA cGQDjxO}ԈTݹo^T9A;p9wzNaqI;[}D 0y5/}D9#FhnkڠJݺuG6-;jq%ts낱} Foci~|9Bh{뻞t۶$H-SbȾ?L+ (h`4(4 3n;z'>U/hUSuA"89T]xAYJ$)\ӣ"r<_Mkv\'{\, 0t&9RLrQ+U)D }1=Rn*Tz+%J)tUPoE EV*F^as Jue:Poqs"ԧvv"JQmgwҖ6*(%`mKf =Ralʼn9)f'/ l],ď֖^Jd(}+eV;U).,XzFOᵪҩB.[!4.Bky^A07-RplA[OʆUP1S SF(: AxTW!b\WU'8FD*c 7`l)hWhy&Z^|{K,L4'pkWcrxrc4  vz7B3[(&" D1(:x68ݕzu K6v&nVUAZ<gn~ lw a9-rf) %z>s:Esa Z,m|a DQZ aG4s@iB/(:6_OH.OchwbB$oU2g6)u\B6.)W ~˶N=W}s#f*7lYwaF7v1[ hB8wKz@;cmn[ҲsYw2p#˒%pdžl<1G*6gzД'CLMF-طD]ϼJ^RD=OWs[\;Crp>C_6QiRb);ػ`=p(.zԍy [r8P,5HPװeν-13=is8`ώ֏*[TrZrνf"R ,U)@3%GRV{wtFd\ LIwL'|);cT:cpLxfഡ\iL89`t[V`wsKʚwm22 y c;UxrdΰZ\DƟ,Jvb8B7v0 qJؔ,|P;)(4/x3 \#kܧk^9M5@-AA G(5G!_ ~WTr QEÎpMDiH ^L"`)=z^0dzg;+29L, 7*"lǁ7), P ڃǖ9W3nu`%򚜉;tb7 5EXĘe M0ߧ"g^4Vo>eFس-)LGNΚABc6kMd i7l%Qsd0xVuc:>_P8G<Ňq,ᅤ󠜱_n\X|sa'p^pUjQAA`S[})Út_(i`gcSjnZLB&!yAgwce}b8LA 1!y\ۆ1sXuB-a%O6}ǝ%uC'LM|Јay%@l/ТF=kD:#xPz@߉iDd7&Vrr_"acz]E. ɛT:f $$a|$Qs0XעB|f8TdTkA!;YN|I:7p ^0 55~|Δ؏ l^wheg+K$[YgV,\O*4 Ws;T$*o>؃gd4sdzkOn<؈ O~taX叺PSN.g 'Zz7\3ҲC;>I&T81&@5Dg,+_NԈ.JSBsEZ{68imuPjj&*Y)G-(X jM(ذфF"QӐYx0.J 6k<u2E mq#eA Y#(,B,$ΜZ1p?-E +V(N(aRcXڞשX~e2 r} -I J/98Qh$Ebz)M{/DIsݢVWup]E0N!n"L'I]JB3:] 5sj'_alf75(iNnw:0okfW]BmZ QWP&E2p2 tv;ZGt AT3&p\;3[\Y,)Ң.%\ft+\u ˣefR2;]P t*Z!uT׵F Wg\}^|,<56)̑BO!<1G˽W Lj PL ZPFÕ2C|2{Rz=Y$}F Ȩ/ǺDCeEi3f'U?(9D B?ɱ"c"#ghe`Zޖ)l3zr!ݘGvc H[¨]@f7k4Ų@[t`Gbk&UF@OJDVEF ]7REN,e GPƁBYVۄރ2|\|rFeL x9|e PuKe?Ӽ3̤+ ʆއ%{츒TG { F?0<piy}LM;oޭ:vpKuz<ԃ e'B%/TA20bXOPT99=_^If &rax2NJ1f5Y]QUt_$D%"ef.;.2#g)JAclONWy>Ϝf=c jrUв9` ii Am%~n4d]x:ӣRs!rxH[/ - 8턂>'ayF@: M He5nR&}GEPtAӖy o\_$UeMM=GZR. 1-vŜg5UI{\u @qx V ?uӲ$~:il*DZ_Ev 7r2T_tckߨb1K3ʅ FiL> {%QODti5qӎh#ck(@mkZ 3B *PuxFڌLe.ڧ?`GߵQ@8"4ƎϪzZF]rZ2G4Hǚk&3yUQ浜ˌ֭F[G)F[D'ޚa+ӌAF JH**( KQO-lY%PaܫJu(pu^4x>ZCcFcJA|td&ڡ1!1 U%[hf6J7[HM14fg &k1/O"7N\43'fzcjk*\'qUvgv[eaZX1= Y~%ZDZJPbMJ$o`(e߂kK6# ps=)+]'RZ%^ ZoN2F5 8W‰ʹQc 4Fg^Ǯ19"bG`;4xȤ-^Uhi~5LE'LQl0O" $Sh3eJ7*"@YIA/+l?.UR[o\DXg"PCy.(|X&K'Yn۞?s6bǛH )2v[`(]$X$<~/18]aN-7](F% -z]7jA[zKחU4F(gy gw ChqIIݢiNFo#EA:u myȼCk_ BkIv"_ 5R#a 2V;FNr[cs[Y<$Ob+GZk-xU`%b2F+Xc;{Oz%X5Fs=,%(D=N?%ŸTAQg;EռP3v˛j@I*ίD:E(Ug %=0Xrwi樮Hp" Su Yd~RIVw fE#Z(&bg(I *!s|͹1HsHF[ƞ3Z 3y!XS4x p\g1zL8PZE_B+@ϲGaZg f!M (֊5lKZF)Vd9Hhkˑ5l5ceVUu>XPE"wK9A-Қ"+Ӎ2ntq(g,m\u rk kD5mzn2,XA½}ԣ}Уcgظ8=>'quYt3-W~MZ\ĴBcdk/qX$X!k! ^E>IC'0dUG=\M-pL&bZ2r'IA5%JwJZۄ~[V*ʰK&~i/#KݗjWBoQNrk֭`Wtĵ:_L#=KpϹ$V2NB>-V7/t,h;H2vک_ %[ɤō\gc7or^O3DPxS8WEѢ=>Ln8@]l|؛*D+T¡9K68MvDZg J1s ¡CA9\)㹸`YJ;qf2pg%i] _XqfF,ҠwEP18Т[xf*6;J5 -H)()D=Z崽8/$WՎq{!3M%hUZjG zkjJPׄܓ|iڭDsILJzJXs-Or^ sq&zُ͌ KZX(H=vZ6VȸqqUx(x{Ę}}b@j˂]x S@i^Ǡ4ʏ6ns 1gXs^4أoY+5p•D\Cv.W)H>ș1-rlJZj:%b9"9f H+(n͒*Z(-@Kk' u7b!+d/:OwexeFvI>< ?ŦQnPbK2j˳p%huDE›9t5Wco CoLC$ǨFv7J0Y^[$\0~AVN2TO1>dm8݆W~nyiY&MHcLYkՂsS䣜:\RՋz6FLlh+%r \ǹV[~ 5q~QOXk$GI7*ɿ`>3T:.kuMf%(^QZNcqh*m(Ms{y^ EܷژB ?Zv޿yAEz$y!P+7yțlLA8\f~㿞7S_ϛ]pv9 \QSfMf%]pv9 fnyy3_ϛ$8py[9z,㿞7!v fn]YByɛ 8K~=od6MfnN! I2sf.%$3hHH" ev]fnۓ$ IBvf_$䐙;hf;iN$䔙;iNfݾH/fh. 3M,!YBoxysfnYByțp.y9zfpNyV9zްnfpNyC3m4sK~=odhWm4sIf.%Dd\K4s4sN34s;K UrY*.=o23zdM7)3s8y'دMfT7eUq&m~=oJ[ͣn`Gz؆c7%G7MY:*5)$+zޔu~=onכ7y3T: ɨٯ7蕚A5zdn&s~}n C7MߵzSkjo&R&o6zЯ7ٕF?yʛޔ~}ٳUmį _ϛ~R-CnIt%sQϰPG~Y o/[›8tO 0_/| ?#-ǖЯ_~ru_/t_Ipp!]xG>_0'eL/4%~?Bt@3N?bϤNRkw6 "gIfn'2w+8@'!?/k򪺹A$ ?Wծ+pD3ϯj~eWe y~Ɂd:j[yV'A֕K7!\sBq"bP,1/3˱/L"8]{ )7Lf,"5C_NoJ[7xhld ˢr9M_c,73_1,cYfb,󬖡/˚~Ye,;ej,opTe2T_ծՖeejY4~Y7˪*xcZ꿼Raꆿ_^Y"Re*Zj2YM)tJf)Ըxz ´>ȷֺK~_w~}Z{[}oo<qW3k/7kc/fnq4q+ __YCcdH ikz56ujԗM-y+5ML?h⫿cm Le,%rglƹCB.-}%,jזsK׺/4'Z8*mcF0p[?ikmm_ǹk[뗡Nn':l\uܔOsxOOkih'm0]Ѷ s[ڷuUi yYZ/H?L*9_S:NiU f+9&bKldL[ә-E]?n+˯np` endstream endobj 1558 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1676 >> stream xTiPTW~bE_ +E:`( bAњ"88 Dn(&!-Hcq SQ!Sֽ:|˹!慨5j]ֶٓ;oKvfMLi%KPı sE\\c'gm {gSOx玛b;;l-ܮSVn-RF:?+3[ l ՚\:[ZKW+cՙ Z_֨WwC ']Ǹ`Cjڿ%nh>;L1oTe3X|j)Uz}}_KWO;Jz/;32vK衧pz@_`KƇ0yJ_w? =SH3HxxWr)^X+.:ȝ8qy]5׻7]g񩲺 q`ߝlݓ0u܋[I `{qSk-tp%"@LKz|h]PrfVڜ]\,Ɣ'ƺbf;ԕAA}fl}.Yqai2=Cv3e4J24DP7Ȇ쌤:LrX 8=L~茮 xͅđ͛]%*P UT /cˆcB*&vp#,Pknj;g/7n}؈o55|x6!˯:_ 5}Ėد#Ο*-嵧U5-e]b6}pD)=8=_ Y? >[o 'ӱ7)\{ƒ<[ `4 "LѪiKOUhwGG8'7 MWĜ̩4BJW.q>V$>5@(4 n`=&?„{`;6XxI j(|-3d!YuE [;wsx9M "{ v,f?BfRa;l7Ǐ{YGD5}) Ěm1/&c+wmݾM a=5(4)5`Gz[p );:cUԭ/MJl%aw ZW1-zv?V%?aFmX`ѣWR#𖦽 ,w{FEzyGM=υ@]4@KJ6B =kMRIMLWWWADUx m7CG?YRe endstream endobj 1561 0 obj << /Length 2562 /Filter /FlateDecode >> stream xڽZ[~_Me3 <}7:M̸ X$:^VŤ6^?Aхd,egpƕdʔoo$$$_P6X֟=73XLȌhZGE K^Z0^ !?X3 7ث Mz qԠ/v*"[H囥ooԖڶxυE4͊Zۼ׶5Q64u*x74~^`T;cZ ,Rӝm7M7q앓>Org=m΀,͕gWѯ{fcmZBrw.%\t&\@)L?)5hpܹGn%ǮvUZm 0GKYlW>fm'i e~n"[cpbu4)G.%f1X~Ңh .m<#2CUڲ6^NNCl`^Q){snZ ֦`[|mãR%>y仦#_gt9YG0b 7F3A7x g}@dg">e/`zllp8ʮjflhRxD,J4\ #tKr40M۱uC?0ڙL*c0mYօwȬΥOG|̫^W-y=>-r︊Hov5( 5ŦGpb 1%0\RwK4ݴ8 h}eCT?'[XoK۴4@&_҇v48EiאRtáNpU2+2{f@1Xm3p=P-Be` FoԢ؆BA~ISaezve,K9AU`{Ƚcg᝚ (1A%jxI]  `eڰN5Ăf{2E I8.$x29%j!2a0a4 yekW ;fHTthq?6K0x_#x͚1ȑm[mPVX'II󑧰 ^"G sD)]8Y 1髂@Vjd#[LLTx $.x+0 Dj/EJΏ`k;,ı{2Rهn%2T|-4QF_DJwiY"N[p7 Av]8r)B;$jGhf{ .[s4E|3 >Ą*IVٚ"= ц @]boPkp Yoi?Z3!(-X wB]&Mi|yKEf)kT%8r-I#әTN$ޜٻ|&܅#]O4ژɛB*SC2tHH tA;SZA_ ?D/O<#n ܿ{v޿9s|/(!S #Cx.?z]NM> %N?H+G Cm/ZUෆ(^IQsMNVmWCb1t>'_;GsiQ{OWD3'Woz!3S޹Tw4՜7XPr_[2p4rWiAMи+2P) $m~u//eٗ#Ws _CQF.Rf(ހ5Fpp&9\ʒfH XѐGo&7|d@_@~簪v岻x2%;|_V endstream endobj 1567 0 obj << /Length 3241 /Filter /FlateDecode >> stream xr]_1OT"AZ>lg+NER3!WRS+S̀dn :ۣ/.^a1>]($\tv/E N̤?\x}sy?_y?~o? #j A|.0!\6u^s΅w}Cҋͫ/q'uV:Oyceya`E KF w[0@rD@oaTY&[)F`-hȪ gt+4QP[uYI\f!)͙$QRH}zٰӆ_iE% n<9)-@Xdpb蓰VbA;'-G'XcNBS (@=DO4/l-SfXd!]",7Qsɧ.=\x@h\29y G)ЧT7*s$ #UBMwDWH=Jp}+.W`efTŠ9-k`]gq؎ y2ڰD{$V54YBO;Uk BEԂq]p,Ϝ\sx f1P!{ ɯf6 Bŭqm,UT;<-UA/[9|(IAuXn]@U*A.]hEDB*GQ#BU4StӐwݩ6J0)|_:e"((H(`qB<>̂!'Lv׮l7J;7YJ ^+с,xB$ )pRƉCUܻ˳$ר *XL`zD /fg˱^K;ZʒYgnW'+ܩbCpa5H(]>ޖE42<=@1 ~m R"{@G},NȊSڌ=Rkew"qr0 #;pBK3.DKg ޿ݒ10th" 1!^)zrBQkwu \BCo&:| Lz79Ȧ6(}D E-vH,!+1K\@ nj7H$;t! 33_<3 oq\8 ^3R?>h6{(1{8KʵƊ0~l÷kKND>DH+Y{,ZYlc'Яw~ =765A g?| ȔkfmSdZ>Fͬ_n7H$9ܩy0g߲bq$x}]֘$Yx:gՂwFFL'Qa~] 2XObW"УոS0V()f>Z5|z/x=N9E38yaBg})E6p^Lmq =lKV:KuB%F&6%z0~-v|z߃zdXcy{! Y k/~m#K@j7Ym_^c=k?d*EF%+z@,-ޘ A=O|jݘMƘbllU^&MAк; RC)M5"pAB!k粽шCajMw4+в2|t_|0uacpԬȝmXw ⤂ `5 =3W plFU6 C>xWސ$ΠuDljcsWe7Y5HGY"&mYAR巋.r\e*nͅe%DiXҕVҎ:H)FL" PM"1u,kdM}"=iHT4'Ⱦ=B~o},MuV[FNmlBn|6nZnGt`1Ğ[c9/( O:q=YV endstream endobj 1581 0 obj << /Length 2173 /Filter /FlateDecode >> stream xksOR,̃nOUxMy/[J*0@]tOhYK]rḄ3xΝ9G^p" D!R;s5Lh>c>])f>^R;|vzgP׳?awgkqU@GՃTƧ $ 'b׻-WL*Kr$A e/}jr_=x՞7%{ X(@)Y@=9?h0"=B?IUY:q/&^ZJ0B JI,3_2Vo8GHzk(SaD-6l?~f?2N"ۈ0[ ӀLN );aĴVdcH =$p: |xk?yߜ귣[hmmp_%9Wq=@>dffJxPqf^e9> |uG&T^%F;r69N>^:<`_Yv75ʅ馎 #z_AgdVNǿMR6ϊɫ&g]*6*bJF/U CwfD{ud ߫bUsjߤI =$ԣVYأ@Zy "޳PBX. v<Ӳ@ [-rSԯYY%II }qb CYq%2 e=Pzol{z/85lv>u-)AdD>ӊ㕆iX\~sx/>䯒ٚmS>Iq3=>'zO̊qo&I Ǐp.6c(6ӎ^yq]A&)>/Font << /R8 1588 0 R>> >> /Length 26348 /Filter /FlateDecode >> stream x,&6OCL 4 VsQـwRd?3IFQoiOo__ou렿_k{~N߷u_jgJ)S{п o@yC-݅V"qhy|?(o{:tl˓n~4ˍ&A턿-ʱ/ӂ_}o S_6N'C[IuUaZmJFmuP--/P{DZރm91@aimkB#9BP몳+zhx{u$^u$V2F+N-R7;V^vG{>GXśA2ZMvuc~}ʽ*{zl;nNf.;Ziya&Asg{tmB T`W(%V|Ԋ`o_+?~ȵa/spW#ą"ra=U9XV7ONmAIʱ jXX;wfشH0t6BCϺMXql4 +s &}M<}x` ?ZΓw*k6us`l, E^O,ZZ7f}hCLyoʼx?t<5Hd,"HІ)ĈڶׄʻpN9cahS?ZŚ3.M}?LfLW6E&38 cֺ4|>OL1/KN+]Arr]ĪBio,^ɼ z֗gHya֪Yhaq+8kXN:ƹFtUʍÚBvN8p>-'2cKj(B"?AgJu,ް7:j>=5L==BR4U ;+gUQ{M4'ScV?Rǩ&z'[)q)<Ďez?7({(T>v+z'n{ۯn[W MVEQ[u$&HK!0WjzO:.E' cx&S{|;q;;JE2E=s IGlO~tOZVY+eMs1+fǷB"rkX* }O&kNN #+ 0o^س^:J!ea&nnx[0-`YOoU׳35 beN2˖7&C z x˃r&kXspiNڄ?ٶOy j;V Oxձrou kb eM*xj#.N֗B#bv]Gg`ŘlľLTyEۼt~fuZ&"=e& =uL{ig ;n^:(Fob4rxW%,ɲIAy7].b ,VtCE|= oޖ^6`e?R7*naV<ݼP}J) iIJɓVت^ٔzbS ~?ɕ97j6^$Ww]aVbp][/^dk̹=*9a F6aZ䁜/+mʤ7&=;4o0_6#Ȏ[oQfzeC}`v%l1R>祽P'&C'~ԶHYGAMߎSlX[zl TT=kCX-0G ۸ir 4s#W*Oǻ:@FL]ɓ+‰ o{k|6u0 9Hmd{YBZq \8B+V cFf)it ]vv _td՚or24h#QlS  |}r1XC$uIlN KNXz(,&_Y{-LjΤ3`dYاX 6mW+]?wjv*|PХ+Xa` - ۅ=H̿ɍ`; 5 +o"$KgVZqϱV\}S{2]@S v`4@Ũi`(kܲ@v~ٍͥ:cd ,V4CÛw>O};{lFI)XE3t"VfτOsGF 2swd>KXSp?TO %ڛh%^7I!{J :/'"F"-NVnOn/`d A¨NfZ_2<}Qt_ˑsw_*-ϴ 5{Lbp$\]` c"1V ^P-+KL<<;ݮaMWQ EYǗC!L˂; ps*~ɋ-˔h9l,éb8Azӌ|Vd&Pu5F짡:W0Ė$@ YZ5,rw@zPG,,0ða_F6DUO搰pEu8Ĵ#sW=iYPdj_OLЌi¬:9ԢyaM!+6Yt'P۞/?1m2K)l? 'v%"vS4|7+ygt;QѠNThŰtaH,|6X.n-'%{s~ 00):=/5b> -/ESZYWM'( ૖&r .>3Vaj>GI4ЗB g'iʫ]gТ->hV\!®hуXvp O~؋iR YMyx B|-n3SC` ),iszp/ [%)>RGha>Gl\ʓ')`) frTEdFJ Į/^ЕNb*/OX9BRĶx8ߟb*m$9q`1$`[EI_8qvbbJX!*{p1|HLYC(Eآ[}VV\}O&y\w=O׶Q-$#jk򈋊Pkdn$'V̗^=}ӂɨ*|"^ƛTn-q'(Z_Պtj ѡ  RhLȃ5iMΡ N(.rj7W64:nRXR"'ML+΢rF 7~ 1/X$˗ƣi(>rP-+d~Y$ 3_ә .cJ`$7#QH/K'% SQLd0Hv}%e|h?bu%dnkɢ1 qKbU;S1sɞj?@u6Tpaf_ -t[/wiQ20o U$ޔ@lF * S w,RyKR|'͕fl#V>YqD7^1Q>ݞ7Z|1~j/*XA{xᬜM˽Rnnx7 B߷䶃Y=m6JnOҤj4 Dw:*Y}DֱQHh M2/ކCR۞˨"$/E0Ie"ƪ7p}-|ӑ %_ޖ b~ЉO #Vu-@{ tq߆o#X)=TbflNs ,;3PSob91a͙YyÄ p-d2PZvO8¯PѢO$ 잴hƢDMJmO&>T9E]ܗC@7hp}Q vb؈ \zϔ=NZL_d^^a,pT'f[Tܻ r k6PtKk9azPA' b3%s&5:85:0tWk¢X,8Pۂ!uFMwtg[5)?$L+C/h-Z9Ywǻ:M?g'[XWlhk͖bEn0ީpW! n}}=*! zFYdžȥ.$C I?^eSDm DGmv<@OB 2a $*2b6W|9l_MRh ֈ Ϡ#V#~ | Oʧ\'^15L5D#,V ϮGYW2j6RZ\1GK"%E֠+k65^b,Mff MH'ՏkXaAZ༌n*\~XFk#$K0=1CݵzV3n"3fL5y?/09ONb0 YJ}M-/?lmoKP~ ʱcD/ +|_6YKHXK-PPv 55.PW9 (v l-R;Dsp4$H;(3AJqzZ L%X>(4E1HB)3[*yO0$MfT_q3X<îq:a聪$\QU8k3hŸS*a%4;б2^Pg8졟XWّuG2 ;~L4Λl-h#E!R{q 9Đ 9 Ҍ%OGAHЗ- 0YRg+5[ @xJ CkC -%CTx*7y26d06Ḛ̏L_/BNre'ILC)1^dD#YrKCN4 - p{+ I*٭>C0MPQEr v BDJPiЯf'nZ Kԩ$䝕CJ#7&ƀsXhcob'g2LGB{NM17isB0 *9u">rn!P&,p'„C 8!D&^v:sn 3Aqk-=)&"{JNIN  !E")\" a+ 5a4j j(*$T0)'UH񷀚 q}-6mLg)q|q2aLQ CC`HZD-\Tj\t'mƹ(Z9 ~屃KXPb@{V5poD/8P[? ԓmb Px_l3(oPH~cWt~Vw͊?!J8-̅].6ɢ\ÚRL^7JxF&0DGWY'bkԜ{W$OlQx`ƮfǜXL;4B %I2lɘ#f) O>$Jك,(lot#8>R̜Z)@5Lc#7P5 5g"'\&Xz/sL0nOFB>Nh( ư_ -s4.HջZc9?`b]:5Q9rlcj)dOqw E.n% lZN!_Iƛ[eA>5^L7O]ipaṗjY<90FT<# h}sSp5!*V~yZ 7K,TWrw:sƾL!D2[^62nVU$!X'۝9 Y DvvsGMQJ!x <€CU8GeV$m*0Mϣe%a.b`HM\J( ηސ )R%2J71;G'jw<98<&`N #'wp;yiAr R(ĒIQ76VI}XӉ5#Ӻ@]Ԋ Ä/ϰ'$ 1QgV\ovEN R+kr8>qCk!DԢ8ֵ.#剪XaݖasYRXs)8ucƟX&L;M±4Np6d@4ĞcMmEC8CoDI 4!Uw=UbXAaеvZ@:{[N!RMd:Gj*>rX%_y;GMuOXC`QiF5(HZV9bAj"w$>R?װshq,TvGj:GZ dEI̒QEx߭DAJDID؉y p\}>a}Ch-ydMO  뼳H-:l^]s +F DV/Wr-ώKXqyvoS6wڻO4"q p/ ɒl^]¶4fV2hŸp ѐϱc砘ѝ2t=nHsNM-Zdp^/5,H 3m)$ cb!k8pK|z~dkX<9h0 =tZa.e's.ʔA>}#?a6y\ KVQ{(΋M5X'Ev# )$Y-t#^‚}r8Osn,_G`Q䙳SXx?(L?җnW|Jtm/4&A]k;^? q8Tj!,nc넕x̞ȫA6jY|F/a͍bMI4RU z4p{.O6X%ذ*(|l_*pvy1P[{.Z>]fvRZ04ISW-; 7Vh(< zְ[5Z8U_EA)o4i}U/yzz?V2ٰ~ʵ>_S'Hzc' O%# 7aU=y 粋F%iy,]%5d$#2t'νA! wjé lbGʯk0RG"|_EJ.;RKoi=`z$g nRie!;"?_N>B/Zql GQ陌OGL_P Ҽ=jYl$̺y#0m96,$5b2Vmz%JZߓ}p(2e@-b)-w#F=%) s*iaTPX Q_bxaM7]pQЇTh 3%'[8 9m˸O1wpL -װjLq K2lDsNSX]:ކq: nj$jitgXg{ +"yWMXî|}RF"1QKQO{Iװs*V䤀F!cEJ+'5n f.yy=.J&S__jtvI7Ffٽ8MB aXDjEcN%f(?79! WhY@{KX?aYq>PU:L&Om59kXs=Ub@` !< yNןQ(KʼrϋtR̺giuVSHϰ(Ubv5g3=eX rQZ\ pS,y A)W捠jr +c_G%_V蹸5sx mn&a9_ p Q! 0 B&wKH$$)agƚXYB,o_Bhf@`jh`=k0x Q-`ʩ9 !F}1 ff,GTšP~ߛ;H.aeplIAŗ>A] j5F X":#wE⶞1Uq 84^iM Vi(ݬxTr>ǚ=fjM%9"_ͱ {5,_.T6 vr:/ v|%\!gKD;Gj(zN gxMw /bp,M%˦s?g:Ò5aR-4зݼ+XYղbu^3^^mIa\Ҏ7s "a - 'zt/6Zr  t uro(Ĉsp>6U3?lz.lE$G XMF[|%̏\|<Xdh *SPao{ eռ7D(08B±z '9ΜɤKBIhVo=ɒKTXYnγy0wKs>k E;koТwWY&pov؈I (;<(^7^ VB;[Di+vKq]^:nt^4b眝d&Xo/Yn$YqKCc b~ZТK!}[s#~Kw2l]GzCx~hNźs*W.nqwN%pi@m>QaarvM~=4ZO(پkd%-y PE̐rw&$N'Xu#3"wgZ|隀G6n!&,$^J!<$AoHbR2s#!TWKZ_'7'Hǖex/1PtPt/ϔb,W,aO@"T`JHVrO T^۵^8vvc&4w/̶l0S,r5a, R =オ}l\DKV!g ^êND'BHo02UST.E"std:kXsp:VT{Ov  ϲ a~Bɺ͉\.a}6@4lPH~Tܜ[-}\{H 8}[#ﳷ"VK# Zr{qp bk QYKCKJL: L,Η>}װ̝ ͖nUQgpCVِ@laX2,|-ۼOT&5b9˴UbMN&VT璪{䑚X}%n8$"V,!bLBҿB܃m&Pg 3<*J",_}ه9xVY#NRQ5%}M'"ͫXg+yojpS|{hy7ټ$pRzاy98/1ZVGUŽ(u9]*Kf.UG@߂BD,eQ:T2yR8_ay%y.`z :/Fڼ}ezv5Y+KkBIyˉņƿpZ0ڛ=l[jG3n7A> ׵ZϝT5rz^**]faV85e2}[j6t6cAao gqװ1Xu9;"حlMr .ŵpj1bfЖSXd÷3*rnfi4^8{H؇4Xu^`,6H<:U.+΋Xu8i{@xmޣLFOWpX':Eˢ_êrڗ MA6j`[ЙޕvzT_Ϋa]:4Z>i#װ@"Y-'䨎B0O֏#e|' 5cʑY)Rk|r{Z?ˈe$au?mFbZώ,E #DMTg lb"P&x4ٍ>Of!a7pȁ#MD_]+b0c0GvCkF;%6u)O`y] PaW׽i(;"M2-zk-> !3-./o ʱ@/]ۅO}KB,X:u$M8t7y%u jUFq~2^V~D]C-װ <)"9^tȶ/cY*:s-P*[#T[}IPpSW>:u}Mu4,:2:YP-PAjWc6_,r^5n$]ŠhiJB Ía[|991TKB1P ] ''4-װªrSiPy$Wܻ]}atXD t$v !`idzC!B{Ч2lH6!/| +jePCw_{k? PFV:_H`UON:0V9';6P@N3}tZ5,W8if\3&2[E8;,`|F )'?SO3гwVv2 8`8faM[NV)@cto2οVZ {ڈ c U[,eslE(f(Fc;8 c~YݑuPدeC4KxpUxrohKX.+'F(&(ȑ'2DӚ_|Fp_\%ᙵS/>CĉȴZFHI/蔏]h!DN\vZo%&F<9~`BL@+ մ{ݴ ʱu#s~!n{lGZ6G%=n.Ο ټdnb Z.@,Cư^/?eDLD6RʊLW2=yY *ZA&tW/8Qzj@*`6PP8`*֑cP  (Ӷe&Cc -Bˏ8=%lʱž`=>/b׬K{wha8eد>/G.-"$48KVM?=$o  Xt +u6: HP-q4N:^H:F@ +`\$JQ4\SMg:&{(KKa>9εI$ W^9Kܸ#ç+SϕY! V\{HILb.'V\<KV-` t~r 7> ѯχSV bO?V DbUcPKEܭeۍ( Y}r)Auhի[1+thBkmZS)? q\Q"P|1Wo݋d4j mSg,P\4N#T"=lx"ƭƸFFos iA:X:=N<[{(O6QRNo5Z$j-A{(Wu` OUډ K̊$6HceeF؃~8(,yKq=/P[_>U[c/tx ' VP.JdYG,iZy㴅~/q#V#BxY>:k*< ,՘UOpdkG/G"lU%SH>ܢtm ͟% .Ypo/]4>TPr6bUm#I6?}IA_h.ZW?Aqv%v~:\*f~>(K$C\\އʴP${gR( 3-.q->"W6$p c:jBo}h1A/9řsǁ-,PKB*mٚm-Q="w͗p/&IZ>iRNkEܺ8@Yb:r`LHAf9E%'ɌȬ#ə~Eu n9~x"}r5INj`MUۢ_=@+}iT`ˁ_Mtג 99M/MYvrʟ li!SlCKx<NJ t %@s("It*&FwXUG3|r ~)C;)XS Pb;'(fS钼P|rǬ@eF=xB%Jz ~lj '_66l@k&|]yL9=Uzr\c*9g[* K4vqBi径3,~!2[{ |OWK8js?Vn1X{Ʋ-ڬn!a#+ !_=L^$^;\ja1^1lH:jŸA|V@{6NlƯjK 2מhOx+ 1>Šb N`S 3@Yr:ߏn7]Π|[V(2.N[4y]|u 7X6&Gح跂p^=.o> =ʨ(M]fgCa\O5wЊ_+آؼB-y0 fGRkQk` -zc ^3v L Lv[Hny}IhmY[HDܧu(P-:]6kw.눫W)N5bk?xc_~aB 1YM#f*d ~N#v-n,c,PnJ+~i|cw6P"vףJ,N"2<+rQ [5$n%K&_BȁYU+3gUbxSؑ~A]!pY5L±e|_Ex/MflCrJjR.b [zx!,rp07e/ ~RK6)pAPBMdRCRW}u'ޱW2ryv @ÿ\i5D+f3I"v.Q)v#ֿ}1{ ]lзPiv3ɇ|]៨S\2dc|{K=g, +GYUa6;1mh|ħ=q䁉b|AaS GSǢ^u9V g:?D`| A=Wp<65+u`ѷlA(Y[ &*t%pMlXݛ$>1=[P3ˈpwb!bt́ [Op8^<$LF tQQDjl.?=k*j v^_y^M_qG5Hl\zrUI1[8Ƭj 6)QMBNH/8+A/(e<ɝzJQg'sahHa}?z:QFmD] FP] /l ;D[S*,r֐hxb:%&]{7l>LZEcPNWHBs+/a ߂R?A.;r   0R1esµ60\5/ W͔F-OT\W:.̀z674AJE҈k~g<3 34gnLhqQ0I+9Y.vqБB%R#u | PKc2牊O Sacd jq8lCgHҠ=n@(I6$5jhPrч[q1 L@|NFb;5j:>Q!fUZN;6bmuI6Ͷ=mcɓ| # PՄ Dw%$-*@ k a^ <:P%J*x4(wIt$C\7!0ҕ&<^岂אtAZhB)h@ǩRL^PK>@b920J1й5߀i?'@MJFʸY.uwW ],B{Q"gٻ?|($w#js_pômc%|v!aAFZBiI 5^šs$ʃ}>-Xw1.ĝ͈uN T"WIOVޚ$&*Tk~.| kۗ%!R΅y| @xKKXs`T tDE45FD bPiVz"ܗbݗwR..h?5Խ,vX65bm{ۿ^q:]4=#q1?/RpEBq-'nkHV>? ־s)?|.0a}W:Ŵ8; "˜]\y-fj]'"V} \HX)ueHr)4EgD2yCɻCBy5'Fiމz62Z Pbiݪq M*oz k .V#Ǘw5_ @yڰan[l*B.~cs*!& ɱ\4<+^"V8ArY4.]YH䮤S4 lJ/k>B9"B9@Waj@ѢThkn[ܑ9Ī1GX֩&FKG[G.Jś*TR`K_Dy(3ql+L} t]vF˩LgGaݱjZ aا/{ՋGqC# ˜VMIf?Sr?D.|nPwZnކd.E3fc]ᰉ'Q[.mTɔ 6dҤmd` Hwfe2W+8$cZ{߭I2lGjy(2~A_gbǔY; w+`.M_QK:kgH튀$ ^š6 <IXOz`ZyrL uyuqEMiadn+G&b{#j'3Eyr\h^ag|;<Dj6< (+&Jow2\H<,ۿ%,l$@dȋ5OKK { 1sB# c4JNņ/ڵ^(Mk#1O~TD־'Sd:]LЎL̂Y TnXT`uIW/=ͰZmB ˬL`8F%v \3V^G\983Gjy2bZR>H(e0LJxk5C\8߱B|m28v5?W{dȍԓmJyƮ?NU+XzW҃z"buj*7& @b +q *btq< gp~"Q/) n{3Q[8*Ē42U[}j+mVYnl[ɜ/a$u]@s6 q^ryUdheN )1dB,BFrwGH6g~m㍝#δ,@^0 $#瑌X:LazcVϣ2S@5h˨hSGY9%98v:\ v1V\@O'$q`'tB `I雈>;͒RqXsuV[:zmL ˰!64_:t/QRXLGW_ÚS"H%acUKzNʱ>gBFb kXQCL(*΅%Q˞éʹP2gˁS2 XI\E,Pqؠ>$s +g}:;8HXڹJrյyYZX%|LPևƁڌ;P I|>@<|?.a b1?0= ˟csנk8 -hM=&9;/Yizr/&h 'cMk#Vzb]8S@i|=;-<53q| ˗M@4_Y&?ώ[Ū "&&M1ʕ(jiZ%Ѐ[L "u $9iI|pM4K)#ޗ cv+plѱ3E2SltS$sC(3rY\)igXE5x3U<]ƻJbt9ݑ+i!?2v߱ #V1b͜Կ,(]vD_7|t +mJy貈 Mmb*ptSBrbc*`k W8U&Ie“Khuχ&X._:&vNü<8gsK*;U/kPX\dG^y6.NuH|FÛ#}E5g5E8Y&^4pd&jxAv +IZLx@U= v)+}pk_J,#xL:. u$$8+RΜ׷S]/XC2U`9j28';'Ya-)K>up'mHF=V$>b&7=(Nw(m#uxŲmq;NJ⢰K++,\kNO.ak yѻuE\3j8Re~I' L{rl⊑.Ѽp\G"аSh1 =T3JaQ4  [:O\Kpв;Ĵ\VNڽ VV,~LK)laؔSX/8a AbM+dF|tjװ7.U,: M׿$֑zR$[Vp>U/Uzevvswb`p#uQYh;Vwwp9l$^G>6.p +} MPh\cgHZ5{|b{K/|.r [8ySdVG(0msJ[ŔA3%Ibܽn3@vdc+<KF(ʼnj&T)?q|Ŋis:z!s>H]bX.q(X,O/˗/yV(=O~ӑnz>bPvaœ}WD&J|iR!&&h%χ>n dj|ʕ/([ s/8_%W~#q[r}$ A9ҪrndG=RAaP[e8T2c3?3!)S&:?ͼIt7+͹]Tơ>t u6_w@Sf/̖ {_XjDB/Ŝ;s~~):Y!vݓqww йSJWeb_D[cJבu0_Vu+@-b+\W[Zg+ΟG}ُh]Ƒsbalr)s,o`@.B#hyLϜPjʙH *: w$(8&1v};J+0y3㖇_ db ֘Y8Ct-T)c3 biDs xMyAgْݖAb˭S=XKW˗x+L1tDёf/1l?),;Bهj+EeMQ\&/hև~7XHLP<4߶x^Mj!u*T@CELwʦUjpDi[jѯzy{V[ճGE1d1aUwQEB u{I~)b O N|f%}BEJML<&/S[L fY&>v}ڎM֎7/fK}_h32q'm Q_MY!)7y80kM~OU>RPotHrt\m^ǧC4OGӑ)0'A|:7|7n'>ҷi|2 A|:n$[;v򢳳w}ya۷ט}I5o f^|/K챱+M`vYCp %b?ۉ;>(GTo|]ֿӁ@f>^8m\%}N{0.wƗʙAyy~M?~ڨf' xhy߮7A}5-r#hNF%ݴU9}P HΥqqB{rFT=l6&6A[-'3θ?h5Vzc=I5(IZI5،I߾I5I"I5)*ɴ/CFhꬋ\p{s;~oǯ׿EXb /~O_:?w4~]ǭacM_iP8,ﶰp'2ƱToznh`ݖH:&gw%_3ypJ#d a-#5?XL/@ܗFV`Z>_6hTÒv!d@lCZRd$ɾ[1s'@ndan죠LM6?;+?n2F(TѲl6gi%.H(y_cP endstream endobj 1590 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1676 >> stream xTiPTW~bE_ +E:`( bAњ"88 Dn(&!-Hcq SQ!Sֽ:|˹!慨5j]ֶٓ;oKvfMLi%KPı sE\\c'gm {gSOx玛b;;l-ܮSVn-RF:?+3[ l ՚\:[ZKW+cՙ Z_֨WwC ']Ǹ`Cjڿ%nh>;L1oTe3X|j)Uz}}_KWO;Jz/;32vK衧pz@_`KƇ0yJ_w? =SH3HxxWr)^X+.:ȝ8qy]5׻7]g񩲺 q`ߝlݓ0u܋[I `{qSk-tp%"@LKz|h]PrfVڜ]\,Ɣ'ƺbf;ԕAA}fl}.Yqai2=Cv3e4J24DP7Ȇ쌤:LrX 8=L~茮 xͅđ͛]%*P UT /cˆcB*&vp#,Pknj;g/7n}؈o55|x6!˯:_ 5}Ėد#Ο*-嵧U5-e]b6}pD)=8=_ Y? >[o 'ӱ7)\{ƒ<[ `4 "LѪiKOUhwGG8'7 MWĜ̩4BJW.q>V$>5@(4 n`=&?„{`;6XxI j(|-3d!YuE [;wsx9M "{ v,f?BfRa;l7Ǐ{YGD5}) Ěm1/&c+wmݾM a=5(4)5`Gz[p );:cUԭ/MJl%aw ZW1-zv?V%?aFmX`ѣWR#𖦽 ,w{FEzyGM=υ@]4@KJ6B =kMRIMLWWWADUx m7CG?YRe endstream endobj 1578 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/convectDG.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1591 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1592 0 R >>/Font << /R8 1593 0 R>> >> /Length 30547 /Filter /FlateDecode >> stream xˮlOq#CVUF#4́6~&)jqUŏSERk?_oۺZ뢿_k{׍o_? S31‹>./{[8~TĴ=ώ!TOWG ~ _BW˾ݩzu9j;~د!T˿s67QAMO" @Z9׺?3sЕC_1mK-ۛ0n-O"Yz ȣNHv=hBW[(1ߥNbr=?5yՃg?3mv(=ϑNDSzIl 190mUg'K訰WmoCx!mOsSOSlM{!9!-n[X?䯓F\NjEގ -nsҦ,vT2CiiCrsMzYnB?hiT.ž~K^qj {:5!Zy4x¸m'9wyk?b^D;st @W*%SDR)mI*_0QY& ԥLsn\|}Xޣ¸rQ=j=K??)#M3RF9*%xTh$!Pg9p>{!ڹ,DC-qPTǦK,֗1[ ?y\:2Q¶,xiR 0<[_۲<ܖQjr'Z_T΋ert}JD+rv*+LWӺr?ȉF<i-s/~viN3Nm}}Bu ) 2.{,)^&RAԶYCOʞQM tn /}w.\Q'׃SXFB1$:Re%zFdἙnO56RD9릇,u){ 28x沍qAiHhjz?Pg%Q^0w+*M\rR·~hUw5YE!pGXW Bgy9i1sWl2Ҹ:W#-!٘UO05ϧ9UgtPpq`vʑ:U mBcTq8eۋm{1DdiP>E7>4_rjz5ʼnt_/QXQ/=aPPquy&>u rW?t 4L$|h1Kf0K$e?H9vҡu(~ }!?F.mb ATrO2cK/PANHg83m}sea2u=xN 9WTt§3QI3<<{!rT_>E(tD L\'Vt`J&62 PEDbQ]r)kRyMCވME+f6YN7QcrF5AFXc+Y>Z3`{TKt! fxŶ`n!_P-aQ_IV-Tr|L4cˏ:=7\^A(t=Je!DN~|mbܪ Q\>28/H-]<q亠&_fWBh}ޱu6%u+ͣuj@t72DX@>=Ԅ|qsL h$[v7}&߻;BeSt=m@:sRθ& ) O ֌Vk뾀G&߼e7*VA*-w>so:" tāRF*AMW"侍g׬ ЊgtVCilKlbBKic(jY:+ܯ!?ƧiVs6g P[߄0Ɗ3aᜣS:|fu wP:E=Ks("?fNx#9iw/F534'hhsr^D.;l\ot2gfhrF2jɞj[OlEP6FݴO7 >)ަ\|OަgiIXEtWF6M,9e.j[(|ZsbqCTY䐼%@ o=Ԑ۩v/_s 3Ć^,= GЩw-TQz\he KB3tajRqC6Վ;wPcqc/nL Q]K|͖=7<MAa~UG43֑d @&8 Jtι`:\UӞ.@zhCйo`epț.`a2Cɀ(2oV'CA[e֪4:1!Vrp x#QI::I"LJedd=xzl!g qy\;f㱒pmv՞Q4#~怾z/mtdơbKIG>? vC8 ^ryG9=5^L۞68D^KL|M*?֒er3kW|*TCL G}/8 o>K9DK}-OeoUS2 N~*M̳jSl2*mÇcPqJ [5aԖ͚;m(eZA [-Tշ^C^K9* }VN76k'aHR8/y<-9ů} G!9PC>sS|bh.i6jFZ:i(GO~dKit>YU}߿ L#iyr-~$֛#W<\ ݆Ѱm)[ed|B~wo8BG䂳Y}pP}O`d`O1۵hNWX^&;]g=`mSSZ8L \5sR-Jt'v5^Rqsp"o ftÁ^Sܽ7^MN+%=q5og ~/z\`=s8z8ݿ. #Ǖܹ?BN[0' P!&5KxS 9;ޡ | ڸeT1$ahϗh'>MɽKBMr e Rt* %%H"uQݠ7jljRXI9rm~mr`rXȜڈZ} ^"<OY(iY WKEATk|_ /JJf'$C\P7;*=wZB9K|[) ުnq`L8bcUp춥5 LE!SoU{(D LdGj1t;+⃵kQVW{>C!ˎTڍ-8FyN&%-rٕ~ɼb/*{pnZw3RxUv|*kz>‹ O{߀*4yRZF+Ixħ+OeiOgDckOD(%Ю47T^V(k$Q\b}K;%S>)==K4B 1/~.CW68.6<^~LQ`k1ªr/^9{fc.pE4YY=w ^g`CH:~jv/bBOHoHh>O⩡FZHOqzB=v~kSAE+}Sul ;E>]J=ﬧ+ .$}xxlYX@6DZ5avq3!9k%컃?Ĵy}y&ğVtmPc k(l0 3>F]I$ #9.?+VaKyj6GsoUB+I|Kzѡތ}K5\o)w]/$+ =;,h&h wa@7W.P7 EKs$}[7Lbpa>}z!^2*}\1e<i .-,N2 -|􂊭c͢852Zٕ3nvp9By}"+&\+'B5-I {/hE̅E[RQ_MG6ݫi@aKL25$jPB[*3BwȚǦ|MFa0zcו~ɼ2U&rC>MD럊!7111khX,Wh:Ά襁=7 ?ɓ^sbO7!BAR) =yDm77>vF$u8iD r25`-(\8cQOe;H[V(ƨ-s(R?9f~Op w!O3o,d!kR*v L9Y\gaP`8I^/Bq_VU[BC H W)FD_jno$}HwGؙ̒•sh+/3΅bN҄` j |r5$קI\sbW~ۤ=K5bj^K|Y2xl=sC~PWy,8&zzDMtHˣ&B2ɛG@>=;G(NAg17(eeu f4IK<'5{9jѾ8dvlt;T-.ۤrj\EUv44DbM ӗ8٨ hA$m^旼 kfs]bw8UCk]˓ӲHSb]KO"F짃x$ N# McJsЭ] 5C^ӊl.;u)8PZDRHrAZ+.widGGk^mFkZGbcpdYr$$=]-`CiPwpcx7̰L#y*57x&1h&YG;/_f2b s_IzRp1Rh *|6|#3E6{%9͢9TQm?*Q#VjuHq׍JQn9!+o/6ڠZe/H7䘾iP,k{J#!S;tZ*Y8Iv;ڒsw+bħ!/sa|n'P;8s8bn"*MwvE3Z׽W* 4 ƭj}Kw3Ϸ('+"sPX\ #s9Q9:FNd93|]闝rfsV"R!Uyݾb ŗdYxND`EVx5 DB.v2 .$(A^Ƈv$A2K3n}n ^|vN+<ծ|k/ɲd=Mc/. -e@ W.19?4Rեr6׼TF%,k^ueˏ:6j^~H GALZ E8)SX|k9p4lkÝou,K ʈ"'"׿$c;>έcS&tn;/TWJYVs'4S \ )`B\apSWhGҍi Nlj| ;. 0HB|-CQ~ȽR+ѹEu|ZcO{ln<]}|ǁ$2<%{ H@v( !ӄ k\Z~JbB_EkL`j`pa.oѱ66c-xͦwM^2)nr$ ""Q%?vIqG>]B /YJp9>}]=ē}wꕒ%.v]݈+'HGЧӵxKbc7]M|+u%.] Ghau~(qOFAgja̓:8go~l B9tW$P$N_q.Χthx|f9<L,)=K?z,'iV9bUχFP( \O.piW^xr ߿YIV9LPVcJmGOA!|r)$ot،D}OMPrs̈C6mWI<djw'9P|)@1?[Nl֘Jv[n8ntՀ-9^#\'4c~U9`4*V`J^ iRHO rN }>!Gn|MfZC?Dno;uSed:GDޮ~u!P}OӨ'nFʊƱាhk]HS e'z񅘌9"LC/k۝VwPvKI:;(Itf,Vv>%F] dfMd-TBF}}S*I%^߃/{L"{<ġt{0(#qX҄_.͞"y_3+EsN>OM^# 単#+ơԤuMԄQyOP"6U$^rjw5$&G qKL4jM0a(+q.{*(r=1հ$rVG8o-T .YWNx_-bKB8)7(ѐې,eCla~SAUPc褉|d(^DLhn7QłEtaPyM^ D$z9#t  |0jGN^ UbLRET4/mRc| UT, *ji2x'ּe7 5&'雵ojkfJeCK˻FeX6[0Uo9wԨT1 h &^mzəgBW ۜN6$<էhZh4ԕf}m8sT I!?Wd? p *IS=. )Tˌw˓ 7qi&M;GIfVGthDk(v 5 {%Ҧw?ԱlLACՆ&-h. rJU>KZAkMp76 qZu$PtJ/P-3qNv-zӴ=ԘjCu^Fnkb1HXPkܒ>A_k{ nPyI,X5X8=Ԙ+=ޑKNUE9;(c{ 'Rq(Y~FlSXҵE~nq4+P̲Q?ڬ T9Sn`!k;OBb0Zð/6(TTA9R#9}eB$PA6ԝO5vrrYMܝU>}_jz"@yT Q^(#3XEAhBeF$XAWR9Fqu9ƹ`ðReg30nJ!6 :2,9dU{gٳ. {=TW5`Dk7o !*Êa3Z1=JYɹf\8 `')tP>AS:VS]8>DbŐ{]]'|qbs:` '̥q5MvpFY˱13z=Q \VQxq2:yo쌐 y:%jEl||kC'cXW) .\HxߣvSEaSgp% 24ܮy/n>ڠC߳SQoz`>C7zF3!2O6nurOXu Zb:=Dr9e-pv&Ia'JEiɾjg.>&XEs8b$%g dbNzWxa%(Ps?3H^<罹[sEiئs(lh2u6@S;!ݻ#B[Egcn}d1 8|= [&GN%7n=jZT,,kqf3d[*.I8 G. n=ra?b 5uX-}n_zg|ʚQ^ex0>j' G8 ТaLZk^=wơp1+ۓ=8.h#fDydZ`p@E:a 3w`M߅Ye9C ]HV p*J2 9 OpΠ ̦!g7jL5sc eR0Hg^xBMXҌxJNOk4DehEJSGv}29까9ȯCB4@-!wSlB *WW2eQs=Q-xd{WEIC|=W^DO) W~C!\Eȅ,Ax]FC2!$%=p}28_)94Z`'қ5F_"H sWSlx Z" 8|,.F{T$\*+|u)KM,Tş@׮ \X5 {8<բ@jV+2"_by3J3}~5덙᝭t4m:yP7*?K;{͕l Ht=ƫ BΡ8Q5եsQx,і!;{GU߆)՞2IR~I ⩜xć,;W'7xd#wydG%M4rUsONZ>jQOl;avnwRƋ*eu@Eu%qux}Gبͯ;yyIҕrjNE2<4'GGhly$i N䣼wTt78꿂R:6M.S9Z蹘RxQM y%QQj\ W2NzJ"du{<$rbLuɚ#I>Ią}97ahOԇ6;WPNNɩ IxLapf[6)\c\Q !O?R^a$y\ȷPQMMgȗPZR _r̂}۔SS@j"6U42PN>urz>ΔxAP./E%ua>Օ%G\:Ƞhyl_MӄC՚@mjMj&T1KRlĜcrԕ*Ґ=k.֕lg(*DLY7.Ifwzx5=٭&ŖMPJ:fO+uZY!"Q$5k ꓻ'!e & *z&]D:"m}i*TNvoP#rMRMJf>;MlpE"s'ݧ~ pwգ6 Wuj;˕p*`-my\\,[}4;YJ6wU/n[*/v$vI;ZPPj") 97Q 8tTm ^;Q^8U Ds*4_hCZĀ7>k?C|T(ߠ4gVmEnՔ&޹z{̢fnFy nR+8d-.@jJכJ|S |9Z)[6JBљў|\9 p OMCoY͔{U* "3Ȣ!~ibw-bsO:Ufs80`Pݴ P}Il;j=bob(\·Ҵobn;#ihhdCXYX=T.*:\ p؄ '_hqPBQ|E{A2.O̦ *-V9 z8-6s{ˣ&$6(֓C*zj1r=zKI.{*$8:sEY@K&VŦ' 9檝3z v pz3jKj,jgʡL]x م=TL |Mb߆maZ3 D-}"UXOPum3_R^1z0n[~cō[Eg [-ϊ,R[]-DPN_I7n彳!CV&6޽U-T[U~%5 >41ԬO9;Pc])PL({z0_pkFKC)Kfmr㧑Œ8&r֣ cW RU8{{47RlNytS^bP9H.9n9EAGn~SUmyk'rg3,3GVdr4 Ze#icv6nLY KSq>;_bw%2T 2z̳.߂!_W>GؚC~$gwߠSîNP[ll>o1:r 3] PҖ}-<(7et7={`80#3QFG_TiCYQ]B=#(#UWA7bVm˗k)=~)d_R>rĬ>i^t&c\~%cx U? w\uJ9̥[Zn)r ÇMxP{jH.^Ge5*C s'Πf"=(fƫ{E-vD<%>2RԲԥ{߉{KɆ>{FfdJu(~WPǽx"ToGUM(Z Tc VcE[FB%9yߤ `,Q5D Wє6{%=/TGeɳ hܒ7ގ=TNpi=vkB8UƠҭN^0<{w;rx 9h N4 )15 L(UclN岗Z_F[o^^a=ͰTkדU7ei&+>j 9Ks|@"qD5eHu9*yVa@8ٺøJ #b5`!~B·޸"Β#r\2}YAx&.;ChnNC?^ 7v4TlRvHKӊ3myLTw{;*٭/s=.ZL_&DF;Z9˼|iFS J^HfXy>=Uy_Oyƫ9sJdIڳ\|PyBKJXoؓn/85eT1+.U{ם<&"FC ?nQaѮՅ::P7`yx+傗% Py (owN#BA"__ᐷBz89;a!PB=Y\ ߉JjB/+M-=&k<43 1l1~DeGXx_| ޫii0ǰy8ωĊʢO/loPU.Qz$e23P6 ^>(yc[,MgY6_AQ=O2/C /o@wF.zzzx;=-1~&ݥL֥V?]ÄqڣiZ䡵I6L,`T#po%IR=$*/N\B:˞zGfEБ ֱ쟰g}=meDm'm 9DΚt[_mISrRUIVB@QR+v pr*J 堹|{ 5)$Hg=g#w !叢( ݁gA`RD Ŭ7 O˖h]䉍w^{P/][TvZ)D9 LL%&}2 ڈϼ "^w_\i-L$}88ln{ADZ^+oIN:F z\j?pƴf/pͻHiƭ-~VSo99+4_9RJ5%: HG`)OAUD?fPTd(In0i g‘5mVL\*0S?Lӻ9bYk%!UW$_%`wj ^W8-]ѽ0ɧ9M9q5tfl_e-,#6)|SggXwf ~ fkp]?/>U{h;5hrqvB{JT i!^K#՞_zu-j˕~)Xq'7VyM /Ꞧ*m gfly#:6XCAH}1t'[ic$ ռD>]͒]i8h8rκRm~i7ӝ~} ꅵ_ //GtVG$]Uw8m2yaerv*䴣,Gyvr+ ,~9#rQ ۖ$쒥Ju_BȆCzXsx i=$Ơp_P"WgVt,K5 ϖ4!Ϲ٫F? pe;ܭB+ιp- oBK^P ]e I1̟6ؤNzhR&R3$!$7fW:D]+VjJF 3  pqZ !AbG<[؎0R"A\/y?{<,{Pɒ"^t/"6\Sb9d;H8(&^J<^E*9Il&%lwILcL@lL'om#myil|ħ\_2x4=I [Z&O,NF}l)lk3v#oDǘ_ߊ&ƸPԅW)l*ă0}*.'BWBĀvgg i;PǴ0ߧI-f"\],$3TVg j1Q/~9): H]T{TQr~hʯ$zdM4X/Xye}Uk5~퇿+3rC!#&dxj%b1amXw*IjnHrW:>]UnH&\փWގ>ۉdn/ܗ:W%VK9%$@O7(ݱl+YAHz m~('|nM-N=)պD8k$^n/wWvM\2&EB4ph%3| 2h=8]+zI(?;Q nJ?\(w o-XE+5 /O8g\+ox>5\ယQmu "pJ *IX~ hs]A}3.Ack:|NxX_t6Ł8GA&]dcg9`vNG Kw$ }燡Fg@&B˃-Wm#I|ϖU1wPq/(##SJ*r~Lzw6H^mM#9{J4:ˣm24f2簉n8]j9OȐ[ _I[1'V1dS[ATjR)8,ݐu&t;{v/k\pPC2/\^;Z/W|RD F|)w| _>rUf? ̀fr#Ny2*W^agE\=H!l)9xt?AFy[~~P

83Sȭ)>yj&'3"ʯsZֱt$6&Dhu.{*-ytR!%r.P:$ԇcC}&֗N)F(iq/Y˶ ɥNy[^_{WZ_ Kea!ތݔg$`A甑:z_ۿ/.}۷ź9/fr{% ],;Bl<ͳ~zP(TQ>޽kr\-TӤ[d.̮+q 34\ޭ;--X߰|sT>#⚑֗e2]%./f^Fqe*iH!Wk]g> /Am>wu쬲ιr1[ui0knJ 3r&ܥ;NE"ê s NpLlo]y3lQ-%'m&?SM6P'Wj ڎVC6I3Q3oYsgMIb[%O#.vrYRqfrػ=Y#EM]fsUN.25HM3 UhWe<֎s~j4dx`a3r ceU)8~ b[Uq!䝡 Ƿݾ$@HU" C1J"s""uCȫTec'G39V-Td7 ðx' UMh"(a_"?ҘAfѤ)C[_T>1wZsc9<Pݵ,jʕ38UL"{]*dV*|dO V8W{KLg_V<+M\rc+^Z.u;`ٳ)U?8.X×8hjW\Y[( DnVء€=Z'^-a@GԐSJ _[4O凓YTnOFl Ѡߏڜ͘eP.{lVAǍN*[O j],y+hhbշ6{l7g29`i PɞSԇ=K}wP.o@XqȨw5,8gԃf&vm~FHp4Lѧ?6;zD\ #He+Owu=7)ڛ+bxj"Eu[&&lud4muNI>v#?@;`P+pI{! {=$S{g=(6K z zPwC [M%PwmAȹ P=YzGMTwѩ[;4P)$g6~Lmlr7~ByH4~-L.J"nkoxAW3^simSXk.}VȮ0Ώnn9-#ޢF ܐtjB eq5nirٵz亅 : _e@>S&{rn{jC/#9\ΟNX1q +oH]TUD17 Yz]t4c,oF!WV:ƫ/F}8RΡ<;.]%ڶq(Zl*y^>SM=qٱ.3pҤ V[@p.>8 SQ-s7=k?ƹwl͸wnR<>ɖ Ki-8dˡ+βIĝaP] 1d w҇OmsHu$VӸeTrRxZ[;S/?0!KLOaՍJyJ>M*D*҇*u@I\SQ!rű؃Bi޾Pd5lɼ+KP@md ZxZYCFKgscz 5 s"-l*(y)C1)P8)G]:bZ}.h8p/,+20sTmOME@ LkQ҆pL `:˱ =r*f4r{ި&B?Xy^TZϥۂ@|ʰeHlR0$"0K?x 7Bu]TN`;<0*/=8_A'#)j- u iYoQ% 7hYBAzq4X+ԓ 2HEKbdRK\9s#_P~<|UTІN {Zo{ zEq$r )?WwPENNQfqXx)ArI*TM~{zКXPW&rHBj/^miJ{mMAl5:Sl\S:%e-lCՐ*5ԕ*zS{Sph )#2pcSVz 9?-;/ٔ>ru:g*.7MTolKH.%9t(bj۴_>4~X;$4N%(eӴi b%5#n/:_Ro$_Lp_?Pu@Ү(tKw5/p@vLTvS&o3:Q;o׿FoԛDyM6ec܃l7"k.G8l ,[X;̋C*Yej%K%ac9Kl|h:nzD 8Uۡ5Nph}8]-{8NPWLL^:H[x)N;NI[EpX\5<P8:kXs_)BbpV9 `g[6ԍ.w[gT[hHXIܑԫ혞n@Ҳ|:#dMX޼r5$g˻"צ:/u Jzv5n_iJDA; @q~-VɁ?rUjI4{BAUCF嗄Tq\Q`5e64c;-T4 Kf X[>jl+*g9?7[& IWڴ3(΄3hs5[DܸtG(8Pke9C!ع[9#Q84\c.K:MPS06HZMaF31NL$m50HB [x "r oJ'V`DW-T'0Ũg1q(cz٪|8+Np 5,fCkʷP4^M23C<(9gM%3_Ɖխ5o8u0 >ϙIʛU8 0UUOY*2, 2b=/v^؅O[:lZEʛʁD ד㿖IRcwie8RLďҾ\/ p۠RQ`V/0(j%]j Bma~\厹Mͳ]va㐍3o=7GqIDh"xKטLE.Fi=2V'FSaM㗶Xn]$h'/|#HmfYu鳉;#9[vCe|F8éM*0fth>T$^~:hQzvz%*8%f37rLy𫹫ԫqmb9Ȼ.jJ T*̣^-iqR^ 5?%^dhT9j,OP]257jbctmuuϒi^26 ֌3GyWq6e;q"`Yy~6n4Ϛfu"$2Bj,:/̴$qjp-6_IҟR: F;߿?CQXU\i/a(O1yuч?n:,k+ Vw֐D‘b~~~![[~'(Vا_y(?/a_/KOK'ʾĻV_e\"wh'+&>]rƓO uO\) .q^nIh.VtI6z'>+\sKoDXOK|J4~çKr>]C7I}OZIOWx~ç+moS'/t% oȿF7D cA| ;`g ~ :X-ėB"biZe_e?l !b֐04W\(!ڿ/ZOpH5*_ARV ኝګu>;>mw|or;>\xOCҕblx1Dooi֙it.Zo~^6-? ]KR\uxݮ:o*)AeKk ZR_+Kisj5ʝlo^~3XkTn[kJz{z?ctDzl+TW4OBOEOybOOOOIPO}Oh> stream xTiPTW~bE_ +E:`( bAњ"88 Dn(&!-Hcq SQ!Sֽ:|˹!慨5j]ֶٓ;oKvfMLi%KPı sE\\c'gm {gSOx玛b;;l-ܮSVn-RF:?+3[ l ՚\:[ZKW+cՙ Z_֨WwC ']Ǹ`Cjڿ%nh>;L1oTe3X|j)Uz}}_KWO;Jz/;32vK衧pz@_`KƇ0yJ_w? =SH3HxxWr)^X+.:ȝ8qy]5׻7]g񩲺 q`ߝlݓ0u܋[I `{qSk-tp%"@LKz|h]PrfVڜ]\,Ɣ'ƺbf;ԕAA}fl}.Yqai2=Cv3e4J24DP7Ȇ쌤:LrX 8=L~茮 xͅđ͛]%*P UT /cˆcB*&vp#,Pknj;g/7n}؈o55|x6!˯:_ 5}Ėد#Ο*-嵧U5-e]b6}pD)=8=_ Y? >[o 'ӱ7)\{ƒ<[ `4 "LѪiKOUhwGG8'7 MWĜ̩4BJW.q>V$>5@(4 n`=&?„{`;6XxI j(|-3d!YuE [;wsx9M "{ v,f?BfRa;l7Ǐ{YGD5}) Ěm1/&c+wmݾM a=5(4)5`Gz[p );:cUԭ/MJl%aw ZW1-zv?V%?aFmX`ѣWR#𖦽 ,w{FEzyGM=υ@]4@KJ6B =kMRIMLWWWADUx m7CG?YRe endstream endobj 1599 0 obj << /Length 2749 /Filter /FlateDecode >> stream xZs6BOI T3v7M&M -R/|dAPhr6!p vX,{{sڻ<Q.;.TkQF/חo6P\jt>~W/TgsO翈aOB?e=xB"A/@K]1!\ҳ9E&jֳMbmy8׭^:Tk^Nf5 " bV"@l:M(A $~l? 9ph|^00}9L$b~\שFKc[')$Qw!/gyR8hG`=0_:~y2&DXzAtXG~XpnolF0cؠ#&'S$>>ZI2Q~yo|J:,~QYAHYX0rvTPXrBgF)yG3&~AIIVn@ gYD<ʸF42 @ϮvN(GT!L"@wBt-() aΏ,Q)°pH)6};$3=D-k>BlUд(Dק6-l<&|n,Տ#0 >e|21G0XV YSO>oź{a#n\gGbfH6LwD};P]Gh zFa;&I`[qS7h;[!Q $MGx8GtP(I t"btjENnrWa~MALhŠzղH&q :̥"VeczV|wۧ"ՙDždo I2S$~~B߂I5W+ic=G0b͗r(yƠGz\=DRZ]>dJ\í"^EӶwD1ˀ#G;' M(i rS`u0 K81J5hUNfMхh0ep9iPS6\:=a.eHb>NTW;b86]RHi~{p u෡F>zwN1|ѐf'IH&l@$U Uǰ7֒ : @"t)eTJ|?Tek\it ltpyh{eaiE33 ]JSRQ}Ro> stream xZ[w~ׯK{-rꦒ6>u+&W* @d5;  'Ľ svvt?<;e40F"AA.|p1$ I'K;űoф fhzxM||B)Kdd6M4ˆ "}DJI&<$B:YpaaET6eDۥ@=z}xBG؊OUȉGC$* 4.piaYuu+U.l0S4Fx&W5j&qFK$}oGt%Nr]YڼԬ$* `Ad G#r#PVw؞xqr4H*ԉNUc-Jr,Ac:N|,Yҫ". è~ 0:s&^bC .0 Dݮ?&]G{Pt<ӵ19x_+D;g$6TO3 $Wn }%`/Dl@kcTZ#۔Wv=DzoE7K+P<ʂ@F%uPqy!QGΛlvk#O{еmz$6w  <)G-|̪}HAve9:;k7ڭwʽ^9buWSs 11""pi8׈|;/hLI p>kt3߉Cήe~~512o/zz& t]<")ҝogÆeQ Wy6l>ScN1 HE>/q= ⺞{/eѡs{po`KџX]B3vGOH ԓn݂ `H%L>*fzgnQ{jqN.~Ni{jP{䡝wqN&Nc" 2s?^E<-8زH҅1wqѮ9/ q#Ի4g:[ꋰ\ܝG]uiuh2<0xW8Bx S^b$I|aK#0Df-jD7,iO+H|m(FC5X$N~W+$ǺJapQw+uVq!Qq$7 rIw#LAӾ)`TWFF]ó"A4c*Rti6e@1>{%OՇӳ,Ѡ) JLɌ̕-^6س7XnlNQ䑹c pTɍv t iF !;Bq:HȱfU;6 :y|,CDˠ JOКe+-;d9Uޠ u'I\ _baVRǜbVfe#{%-d>L׺86:4`3몐r5a\e ǧTiQA@ " 5<@y@hȻ;LLI#fQ%Baஈsez%k=j|t"=s/qt#p+`Rw P "l2Me[u~㈭I $S cuqQQ2х:>+$%@]\`iWt[pF$!a#>89?xnu|ʉb0[\L`p&27t m$^;&Nj28F.n(k!MhOI8>V¢H(>  }^aq+f0lK;aiuwэ}Ş vFDЍaz6t ^E ^ /V+w endstream endobj 1611 0 obj << /Length 2951 /Filter /FlateDecode >> stream xZs6_R7dv:iK<7sHD"G@AIuncb,vL~>j&Ɖlr~5l3&E$W"O8)$_^??0q"OgZ]௎o>"YL̅_KZ,"22.x'u kW0r:JcS>bѧoл)3Q:eQ7iMiiZW ޶ 8h<]MUMyU;^uNa !!l2"lک©u[We]ïiu|-J}WRgZ!Vg!A'1W Q15,*7~.eYmjO7;%e"f:4%7;Ǎy]@I@@cw'WA%atbbbLO'g'N( % z*b#0OؒԓL 6;Kk|U*VI7;V%mbtr oq[b7ԯ>['BxTA|9bݣ"ּ\;neu%$JWeqO"bQ7foH't0낰Q7UnV2T7!րº ڈe bl)dK /Dhwo@k^] 8Iok\h*KGiغaI-I):bFjgAx /&Q/+@Mh#E!M=}eqN$[("COdb0 ALߎPLy:.p%[@ї?M·Ol3vq3Ou4CP݆nj<cvԱYmҢ>;gMvc')mxmbn#;b6 D^zkK&\b=kxtzUuY9z`3|B~*?|Km% G b[ r!i/{_m0.YGn@i|P4+PG,UAqvmh+CpӶH#b۱?E0n!1}$}J<1@0vHt [7pg S-s!駮^Ien{Z> DK` DlU6oz_x.Ni7m՟ˑ$MzH؈-IQ]aez=X<+z7+ Nl1(Yu՘: ?6.D:R+N7~j <ʁq5둺 a1CUҰdo` i+YnTm(J>5E¥=VUTsPAq h/ٺց]W}؝k_6GJ'f^$\lIbe:!#nB{I̥6WhʮZ%(hs! ӣ:l~#3S1PMȾۄ?eQC4.Ş xrk뷁X4#C!{Ƅt1.mv Vq7zcy5 T[~"w;"$ vzkۂ"pq$ĚJ-,@[s5oUԹȾ ZUn{X&M[wY^:w U҉Ɨ]$́8eBN[t6oc?CشI~}{\IBbt/r[X+fD)0\716*dgςA-5š@dEnKn k{E,zz~2A悀q'ƈj 7~pY6LӀEڬJYHiq6=WDW9ΥJ/0|nɫk]Yw\$;LR&Y|=$k*'>'mHs*&&ITOD8DjpE)]0 ~e{keŎ0/<p8ɡb]Uu]k_ ^\≝/O߳NƉΨ7w{PwZoa?JO)`}iƲ:_ aCO74_,]7.%8ŦoyR*ϭ|/+)w v29;? endstream endobj 1621 0 obj << /Length 2386 /Filter /FlateDecode >> stream xZs6_K HI9];C-sC JD[rdbbw,1¿aC㧓ӓKF <;;GrGpws=p"ñ`pr9jznOo:dO!i.߯74& +X]nIK^Uf/X躆FlaMG`:w[fqB}N^ &Lu۫b΍˓VLlx4qbs% OJΕ4slIry|W 9 Fs~7vֻ#mA)gDuSxgFII$UDE;0K|w%$ܼQ=Մ8zbo6݄Qz|Յylryg>I5ae99*U#3seE'N*d*f="ǛNW".7~< WBcBGfVHc߼n0o]o⻼X/{#z\$=4V_t򖧺ޛ;jkf_uTwj7yP%^;Eh;Iibzb"DgQ,Ac q.{ܾ$YYE2+q^܇YR.J8ͬ [0>mSA\A8}VdAkK LE=xn řѕe([elN)'xEAYv8s[(ikg MUwaq0X;B#l{9Ŏfѐu ^`{m-tӢz ė,0*;~rVU'xB|B^ML]t;:NE #3rK;M-l,Jbxn]MV"aaIetMvFOkEnǍ}"oS{/Ky-T]?EA!+ ܓ=ĹS&62g&hp p}K7{Az7؂i8N1 qq(su"39L(|[y}SNlGu_񦉚"E8e͔כ8ٺ> P+J֑6xtu8d0P}8UG=˫y1ShZ{|Z^gy+8kob7Jw8.Iua endstream endobj 1629 0 obj << /Length 1902 /Filter /FlateDecode >> stream xY[s6~[TDp!"mluI@KV^丿~.HN3&w#>v|IB@@Q&4xr:TXv('Tp~9DA$ \_k;S:囋wZv<x CTBR4,>ts\$8vk! p T#keĹB 5c8 gM<1!by$,nt9?``aUeM(-cH:f[L~o7&a*p}g:Z,;y4Z݀+Ri 1rsW|6׬ )ȋ 't@1Kn4hEv87z9+tag|W2EByoewy=wv Xff;݂[|K({^등18z),lc{ۍ.~* {c{gǵɢ3:/zY&l#6ӗ A ɗ#l;_?jjDj.&(,6}jm6d\|HnO2n34*AT;ٱE?JxEе7 릛RzmhM VͦR=;.Gѡ~>Qyv2pDZוUDgg6&wO7өIƊSUQ!C:7#|IDD\ɧm'Gيio.z0m[1#~}\^nraI[Tw+qU7"}K uV.w E2~/{fsvԦ'uC`rRnGvf%2?q$\YU5e\ 8WB8iʶMSM31 O=4ºuM>8/L6*YXxY\f$L/fE2k06m Uei2ʶo֮#!]{ۭVϫE23N41?6YaK[*7^M2OW3C]xYyUvyduZO+& ny? _i:eUہW2yk[$TgBu.3وeJ e]:KM^M {Sٱ f@{MΪ]&)po,\2$&&ImA IcPS"P5>bd{~Rl7'$~XᨡgbI;¤3{WޗOHno-*} Z$wp\%[G$[ *B9wx:j_HxkoS .[GI`'yHQL^{48w۰`;de ? pq3 îo~$G8IO G` endstream endobj 1617 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/lamevect.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1632 0 R /BBox [0 0 400 105] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1633 0 R >>>> /Length 23031 /Filter /FlateDecode >> stream x}K$WpEBh,i h3ix#j4>~ Tu~,L__qZBh]5W&T<ԹUMߝnѬ>_jʢQqފQu~Ѻȍ3^ԣS!r=s;oZ{u A{QzL^5G߶c_#szҀ>7|nB5ⲟ/tO(}nA衸G گ!fs;SnNo-܄}nAҕmP _C5W]>y։衸oCٞf\ueHt:X.}nAk!fX`r ׵4wUP԰EG{Z[i U\To?QgVfU گa7 ۵yt)e1.l{X7>w.o- ZՈm>(xυUpxbؗKd>x:ъJVDƽ{o:1[҃J@f<'Gr{G-(=ՉiaT-׬Ȍeqq_BQ›5WqY+*S1EzEС |xjѧ00>Yy^gA( ͸pE|Ŵ=?t,]0?%-% /5\\)Z\.Td05^i\wߛU &[v_'?kN{('QYL<QP~8d4=3gqF.Hpg(*tHTFg]ъ6@ WCD~OF"]To ElPš?(q_nx8H5<^ŅNF+~JDi+Ց*7)Pּ% 8oшE_ $fH/h1zPO~֜\ߒFgAןwlY5>3[Qzf^Yȴ,%XL>c8\$jIzM5 Ss=o)>$+>\d"^We_+29D=UF!粳ϰߒь?Ea/lN^c>.7 Dg)d4'ӆd21zRӝ*F-g~H 9v*-Y]u6OaHdo*adhg9ŅDe$g.Glx>P /Ez#Te0<^RWAFp_\Fh᩻{JwOS{c_0>c_) oF /L ?F3Q> srxL(*|η=|!Y4vWsb%| c8~`L 8|`YWqZ z`Jɧqo 15\)#L~Чȏ&C>˔?eT4^<,2*+2'_ϧ/Ǫ DV6ztGZy諠P#΅yF'T>uˣf\vɱ].u 2y\ֈ&(;Nq]گ?' %0͸&('G)mh"ٯa7,qLG ;FZ ].j8yNjwT-ߤ+l]:E 'Tk[گau`|o ٻj0ʁ~@Z*PwHTF3;Oiɠv6@ WCD~OF"]Tϋɧxg/'ؓt7tBF+cl 㿙ьKW(!A]l43%L /nID_='?{(Fp@9)o1zf3J+# KE "wn%ƚf.5$=!\hd4 S3Oo*dnmz?Q88\˜yE&00\]S6'dN+Q7IѓhFYU6'diZI28FO72_F,(RJ.~vM;S?.~vM;,Gf9iDvnj96ps'2wk9iŇTR|+@g9ŅDe$9?8لL6<("1P_zI?*_ɷS$S2"n~k!!q2wk9iUS|;#Fu h.(=aK`L_aV|?a2Oi[q<('a5 ~yJߊ9VHa_dLgɖO~|nNf\\c1ԅd6;qLFK]psbߠь/\M|Nw} /nID?Mhɑc+ ~g?jRsį3S+q 3J>@&dpR_]DZnZqH<_p cS=sV.rDr2t//syA,I|&M_a䮎tQCDw\喙M3&=)}kk|fj׿[hoơT5;n>V!r#nNȵ%Mku6q'}}6ȺĢMAy[a3O5*\Q=>y\3׷D2U9{+ګ?' w3khYE_6AɃT0C$5̰^}6X g:jXZ;PиuQejhC&u]a6X (jTjDi&u]a6X<~|߅۶ۙ0N-f}}S`kܗ|@;ߎЋ?wK% 0&d|NҸ!2_/|OW' .D% ;w'd|TEE󫸯(=3.ZFef|pĒh1zRwmOcN5ш%({JQȏhPbd4=EJH~Y384r(ӈ ?Vi1z~hs)Dc?ƿpd4diz)dZikZH siEriȜ~d-PNDd_~/3W~dPnF|=םҩ6g~6R&o1zF>zOPŀ ~"6=7 p"'? 㬙f] 3D@1IDߊִ=$N|ɖkSkbFm KF#~V#9&ҊHXӊ(TF`c*(ҊHXӊE!z~Hu|b?0B&e2\e.,H4dꉪ)EZikZG#eEV˱!s=x0YDe~UVeN^O %f'?vnO&Z6q8QVo:Uq.vgeO׻z/\TE>Qy Xy"y¸=|,d2qP]>,P~-|U\1z~hLa3-ȥq:lzFO:ߌOQL>wN+mg2QV!rQþ@2=-YdTƍtwڤm8FA]8S6NiŹv'?e?2'ߠ5 ׻>b/ P $']Od='? U q!?ViAzf3H+ KE "nF.6D=VXݮ5#rA.ҊHXSaqWGh!w=UW!wFٛ<ZuǡPzhD"31:E"c㨯ia8m퓾A{Qz}dݯyz!}b焮jy{PEh. 7m(kze/qSk-hO=Mh6A.#y@7[7րvkf\teɍ~-UuڭaHka Kbo?o2'TqAkE [ M~VW D%gKCdk>H*яъL9y9>MCg8̾=RuТ(ƪP/-8\(jVYxCC=KC5HEEiשCEIR)tO-d;*ѿB"5]aÔ~YnJ'^i@>*/L 78/R踕v{U&!/E7OFqpoCFg/ P{Cg}d4=Eß.ƻ%h$ǗÔ4ŸoލLhd0h9i'0=-W|qҢ/znf|?a}g5UdD=zJS:6@ WCD~OF"]Tϋ! `)dt7o§S2|F~gM /nID_o='?^vgAןwl76Jq3J>@&`qR_H/ZQ} D#IOiUɠvwH?}\鹋@^.rDr2p//s*3(ԯ2F|燓vN~!I}L] ՝]귬Zyj#~R>mHK&I]՝gżϚq2_Ņ_Xi)E‹UWS?ɏ?毾G#4¿ L;cFH9 jk^dZ[a24?27iv3JfZH sIQr6ӊ9[:S"(#"'_ϥHُ~uW6+o #N}!7'*l^PڈKUDQ⾎c􌸛7Y'd4B-DG M6Lh"]»80&P&M(f>!z~HO_up:f@{1$^NN["NtqIQb6ӊ9evH'Rd򩿬tfHa>~0rSB>B{x`?s˜|?_e?gN~܈MJ08FO(V+7;8?s&6q&?$YpSP]DUWS?ɏ?毾ò4¿ avG6 ]QzGÖ V|?a27ivfZq<('a5 ~I6ӊ9VHa_dLgɖO~|nؼIFswC1t g*~юs1į7>BO8~NBF3pGtQಇxYTpK"*^pP/}<4k3MM Ƽ6=g}L𥢿K^DZ[qH<l_߂?R,7;BWFksۥ0*&TwgTu]/>y\}̵L&(}nF4G!~~ckhiEW61Ls,]W\ڥaHka Kbo?~7nm(f-yH3jmkC&u]a6X (xKRvAwGi"u}a4X>~|߅۶ۙ/0N-}A!#+ABFɧ$ʢ衷x. QxN8H2g\zja H@B"o5A^pD?#6"2iM..+ 5 %t ]IÔ4]pͷJmgQVpT):)uGm>S T S]A(xѽlqF+JBᨰh9|6=*g8)QagE.~f,+@9@ßfHG8@O'?gNo;?0h/"{#~ykz4~+>\dPiQ)w;O0a=*no '#!"Q NGm/DNJCD~MF"]Tϋ!&LK'qHw;ӎ)[ճ4oQ*\ ?4AݨُWшE_ $(wF%řgsD'ӗ7zf3J+# KE "D8dnU8["QHɿ$Xy/Hzn"ؾb\39~p9qMYȜyE&tIM.r.4$|2>zRSä]}")83~dd=gם.~vM3/K4Rq Nbd|)OE 2>a1/2秉U?ejz~hs|`S 8~bYA-fohćT`z.csV*GD>QChglrNߊ9Z:HߓisiAin.aw8DOUt#pvg].~vM+~)TPaJ)8 2 \)ڟ4ю cQ_ eAϋ W5]Qzc ĈÙUewڂyvUdv2!gT:'J2qș,B}m3cz&[(G<_WƏ#Sw6=Wq˫u3'tJ5=îkx=ш_e>Qy8S=|!9' 8.pK"(t& 0=?d$κ@>!q2Oi6d4d 0"Ŝ0A?QF i26{j9/qyD .9z ~> ?6~B?߆MԿ_e5j[md]wSoq&?57).|pf\=<1=E>d2 \Gò4Ÿl^ol͚q1SDK$tG[*cZ 4JHF#>DmLsUl43yPN`ˣjRvhs%ӎZh"g8#LTxgsƦw 0qnw8D@~]ouG9.S?"Ԍ~z|/nID=='?ओOp) 8E8#g8̼=8T`)Foh"aHpDbl;\ 鹉>7|H'ZAd ^7e syA,IYt6BFOܕ; .P\ϷOta|MkMunF~3879Fw8|\h]CZeq\7=8m퓾A{Qz}d/iS}&+W{fOaӺ nhEDsky:ojh6A*6OC$OhhiEW6AǕUW 0z8``~OI7szBmרc_nMvmإQlåR5*~ 3Tߤ+l|_Xޏqs;שqFOHGYx3?t U|Co'E]ƛ,ϋhja >tCYX~0\(*3я"S) Ux@Ϫ>f-m):Ntt1ޭ7U\mi 0,l{ݮoD**J*LJj۵4pgjҮaJ,7s}GGE'x_ܒU|L訰G !z,o5eY4KDʩkƇ)'_|]!PSr(҈ L@_m5 %OppV^A]ƛ,OR;_U1ܒ pT+|?iztye?g-6/풞;g8̼=8XT`)J^5pHG[2>I4?A8=Q!zRS]d|.#LFs#^b#~Ú Hƍ_Xi)E"=Ej58HOT$?684&P~'~;;nj96ps'2ȱZ50z^ Nd:-ljg@(9Nd:-ljGj s=t@9#D~QFENHKO ^frHG2j|tI&M7G6㹃# &p 5>@ψk~f2>q_ Tao5ߚp2H~[*Ge1ID߉NN'7|0D#tGY&#^ VX-ƚ]O;M"M"5^2;LS!GwZL&7>\c[!}m3ez&[(G<_ɷƏd/ ~{JwOS{c_->:#7}# RFS^C\F,A8u(ʃ[ͷ<$?Z/ ~ qu1/[Qwi1z~Hu|d?0B&4e2\eZckZA2D?"tZ1NВHa>~0t"i9N8=XKŃ ./s|jO~fj_'x&M$p&Qb~3~]yَ> ©d=nN~Ò Hƍ/u 2OL'2D\qǟɃr;^V#G.T`k9VHa_dLgɖO~|naĶ7~Iw7M[z $v4~?$^osGI/2nDT$AdІ􀂟W)eW gA;4N8ww^5>Flqy{da q28|/R1V#Q=N]aXy>P.E:'b%.rDr2t//syA,I|3go哧7\tp"=Թo7CDBٛ6Fwzk]q?CMk;G78|\h]Cdl]"sԽMku{Ck ؋z#~7Jo),6~"j.QVPP_p{5&G>((^kh\Fn G<,g?Hnsڭ?' ]wiE{5L3. 2Rk-h"ٯa7,qLG Tk(hvagNпI]Wخ t|1v**4P],o ~ay?>{ƒm̗r^u- :MGF3Co\ď+0ใˡ"U]ƛxk]Xυ_-,@A\J&'8F*OWlvgʁ;4λ+F-(=xv=h*ttf.5,OO=jҮSR shB"5]aÔ~YnJ'^i@>*3|uRaь[_ĝ+:%d!l3'u1+xYVr?V:#)gxh ~0h/"q~ci'0=-W|qҢ-Q}$5O@O>cޒ;|rr;D$*#QU:6@ WCD~OF"]Tϋ!G'pݍ'8DG5 G932Q@"iуA7UWߊE_ $]8F*&~{oH|9]ޱq7ӈcgWG2×,E&$1 15\"QHҳyKш?R,E_K^5>?_4C8FOcbxWv}%{ Wp_Az[ շeFRT*G=Af^)OE4Ilڍ,Gf9iD?=M)fnj96ps'27/r'70z^ ٵݴT(="%"s9V|GDDjE9" ~. ~W;2WF|շ=!VfM/n v$F|C􌸛7I}<>}WwO۠¸%Mxt|2H~65 HƝ,Ge1IDiAz~HO_up:f@{1l"k1^lHJiE̮r0yLEY[2HL*d1þ@2=-#̯+ri ƽ+UWߎc_->:#˘U^5>4vqu"t]xᯚV(&~{o2|[>lk܃nIDྎc8~`Li dܲLCQx$SOTL)24iF2} Ha2t]M+>B{x`?s˜|?ړڿxD:F;;}x~>*l4=M~W_}5\Te>Qyď|/|Z(=E>lُZ |3 1u1/"57=?b4^Hҏ8ZT6/b6]$%?a2wk9ig2Q.bv-f7ӎZlEJϔql*&;}xUWcOp?U`k?_58HϹp1GS?RQ#j[DT75 IAz@O~65 ERcL9yy- =3t,d"N/%XDb!Q5.6D=vwӊ?R,sck hˣOulb"'n 1z@&?O?M3^-,@A\ J@r ~ AzP ~rYa~2%gƁ;2iLoAzf3J+Ck G3kB_AZ(jVYxC;ݮkǟH*J}j &IEZq35HMEiy0_҉kР3/3 _TXd4]wf2 >HO' e|³xyCqgŽ!|׌e(d,֍ X畏S?Ob8]4F3>frG|LOWb SŅGvm3D ?}\鹋\UYqȩɈE̯J̙WdrzLt)mxf~KF3I?xѓ^]:#]a~sh!|"w>HOyuuosCSɸ/"TGpǏbd =eJS>FWp_Ǒ1CFTD<6&Vbc8:.pJf=ӷdiz)d.,]A8$_EH#5JE2'/j%GDDjE9" ~. @% AS7?94>bn6d΍h9], S^c􌸛79ϡdB-D"柾)ڟ'15A*˜wTH"*y8/dW =?`$ާG躏sY&Ee?S 8}3>lnA[X$;$E8n8LDe$YXK%~$?U(= ?"(#`-#ͯ;2Ŕ]/ь/KF1`^}tfݖ3jF3RJ~h!G6 >F~$)l05^ꯋ2< ,"~jq[> wl4㸺zPDTJ]Vh6_TR燌YG#d"/+"3oPcsV|L=QO0ȅEO2_]Ke2d"3=K7$Y?{F䏐9^<,2*+2'_ϧg%3mb?OD!ztGZy-8F?O}$c 89ϡdR( C^"~jq"y~r#~j?1u1=-[y FJZCx&Z"K?JhuRӗbڟшyx'Re*dd9sSg2Q"!C2n" > ) 3R9/UMv1lhå?4>ucPp?ь]y|~r>|sbX 7\?4>,b%ctBOF#9~p9qUY9LQORQ. >C$pIF$,Bh1zRSëCo%K2 j58Hψz+|ִeFRT*\Ř ƽK>HOT$?N8wwdj|diL<2ˡL#*i"~+NO d4=?f4ιN>)c?ƿD&-0z^ ^Z[H seZ+dN?ǖ('"Ts/Hisin V5; ?adNÿYkb5?u d!B#!KUDj58Fψy+|ִⷢ4.Q{W=e84 "0H/2৅;ܐb2Zq[ >LdkSkҢ'znI䇌;ش?]܆1V ȈSeHTF/7(= ?"(#9T42pY[v^.U.#^/ˆ[ͷ1a^}tf- 9| glR›;H3į⚏sqSoco5ߚV(ʃ?Nxsg$8PA|`+|\]=(DT,_58F.FDF>@fL'2DEUUS"fbVߊ?RFO)#L.2Yշ#dN>&+#K̯Jk=!q2'?dя|kq8QVoIFĕr|.[ͷpCp po*u 2<84 =E>84 HFò4jq1SDK$tG[*cZ ND:-Ɖyx'R9V& xyX Ezj1྆9VHa_dLgɖO~|n?GbdN>(݈[ͷ1tcvNf!C2 |kqsb8 2 qִeQ-;4 ='?N8wwHj|) 8{ᯚvg8̼=8T`)҉H8㸤اE摨Knw~Â)@Ƕ "=w>QKF#9~p9q:UY9 Ć@(0ո ]1=Թ/D1  eoZŒǭ!}nB~?Y w7mh}\h]CF4r3H~kx`>C gݾ_cĢMAoqo@5%G]ED7 y(Vq^րK9!Y3?fQV+۠HQpXRkGZ|OI"jך*Zpٞf\ueH:/\׈vk o?XB AspW 4FeuLԬU4͕ v`^\<#MMy="*p50zF+Wq]xxqǾKe1.!#/EU$ӷ =e]޲h9 ?4l§hū(k"Q >8H*.Uq) 8⟦-(=xJg^c@UCsҁlpYcb+.6r5ǟB8S'2EIъÅN>i#Ox( h=o(#N1ьc 79_4i˲4{gd4=Eß.z`k()Gc9iDikAz4~+>\d߸PiQOlP5\GM<F9齒5UdD=u ^Qzf!"'#. JJߟьKw#~j.l áJ '{ةc.0N~6шE_ $fHoh1zPO~\'=8FϜ?8g-(=3t,d"/%XL>'/:h"QHңݳXy>P.E,8\d"^We_+29D=UUmXYo(q_w~8z!I}L]'m[u3l&~H28HψMx§q%_EJQHh\hAzʔ"مknqdiL<2ˡL#*G ~|3\'EαXVP_=7k9iŇTR:̅7lf|&k~#voxruq^A2n'*wMocٟgiqu1/[Q?ϡ燌YG#d"#XV 3U]M+>H'Rd-&L #e2d"sC֒?B{x`?˜|?ړQ8%=y)^gd =qXtd4\ O}$c m9ď|/|"7).|p(/Td_=E>578.PCJ~cx&Z"K?JhuRbE̮">OCdZ!r'7>LA?ucMp?q]w0RƏA2|sb8J:q^/2nDTwfg|5A* =S:@ޡq>ϡ g8̼=8T`)r1V.6D=9t{qX)@Ƕ "=w?_z[-Y7o˻ )~z#kk|gnep_;-P猞 = 4n  7qrw߄,!ues>>> /Length 2177 /Filter /FlateDecode >> stream xK4 Ew56!Рkh0}em[4|;UqNR~_S_?;^U^||W9h/?~{v>[C`ݮIF=cW9l/kd͋{Qyr_ky-&C[>}2 zIyj`~}W>ZE1ZjEs,ss{^,w>>&ȳhQeͥqj>}\߳&@n:[ʫ-~'Bbi$6QuԎ:LM^֍ҩt2o}yơTOhA̩=|K#!/η"Ag}9X_ΣΕ{Nbb4HQs>/|k|lEz|/[Kz>/&,ew>}\_JS~{1L:f˹cgTeZ맃u|eoS/kdq,V fT|÷D* :cr"-Y,[>>/&o{!b"N^lHYs>֗I6ɠ'Hhi>}\_Jγ^#Ը ?X&RJߋcJDn{pnOz_:&^Fdq,aP bfu=|KL$ِ^E"AOOr"v g=pzߗi$ы1b"zZ9X_N$9گηYD*η"G}9eV$NcH)%󑪬='Ӟӧu|wy;X$J^s~yiwWHYB>֗is^09K;HYr>/&QR-[>|/'4`DszI Esq})9OɇsV$9e"Թp&uwA>ɶ<U'wnK+;'Č{HK :rH[=gdk8$]k"G}9HEz|/'RϔhYD& ?c<̭HQ2RJg;R5Ѻ'A>HtL ɼuXD bO>[b"* :Cr";g'H& ?cDulMV$r"o8ړ%HQs>/%%_,Ez>RuwژR{?hy6&D ֍cio1:%&_"AG} 9X_Nk? g=pzi;HYr>/&UR ?cr"Z4`DszigKz>}\_J\i>>RUg1juϾ]:X7'ٖ>Kڈ;X7>.1 bFu=|KL$Y^G"Ag}9X_N3kYDZf/~ǜKT?FEz|/'=>ת8T"G}9|} ?͸5T߻qE/CKIr/Ћ+oS?zGFۯg0>@ LmHOL1JثqU>|jK  /ǏYƏķIx.)OoM=Zް{<{ssnv%"_t;MO u:;c۶ضm}Zp?>`k䰕9lEaaa+%~]]mA2> stream xYrF}W-`9`n*WdD^l?$$!& -{ DԖ}47Apg4$@@ a\u*$%H+/"t_̜ 3+q/ _\\FW˗?]\o:_$44o?M$!)EmbbyfД*!R`=;# #{{M|bo݋:@'3xS Ahf_狈I MWf.hXT%ު_W8j3Pa{딮}iZe}.X~Ĺ]]ۯJӰ}Q7(qP6 WF-~BDB^T5F4+ri&wzeQ ը)ƋFSv$a4lꢽ5jrg[w3~z ҥ-`t1NZsC=(7rH A_5wފn$  0ca!U"Ivpk$a,USbc͜0yȔ=J(hjuR<$|@HvJP ZAzE8c61Mc= zQEX6l xju)IaNbKx(ȩ:fڷOE$Ozןtd&o?`YL"TnW 3r™)D|궱)'^/8(LM]ĿX$:h4,R<cm5_+p@@43j@]Ij{D0H8|*@WB0}JB} }m584IR/Ǵu1- p⩿JYV`HKg,nA.,g 2&, a&g#@Ab%L9l@YWcT /N%f>2K.VoCH'C+cVUN &b3'L1縓I<:Shr"Iyk,`:bĂ Y2֓dZCż[HJ=G8xjh0ò%Pl%0{K` y{햕bam5W۬Vm\E&j׊uѴŪq]N`S*1ln,I1hQRךgд oDQC_0D:wϽ>m_#Nr]$GArMs գ4M M>5$|!-WUCusuAvȸs]'^&#Hb&ނ~qv7+; 7#+S=- j tڛxMc@LfRe1A4sqYT[)Ol&R!XiMAizkuWB 5=WӱÀXo%Nʞw  n j^U!w\9.~HB{BaY}J<Ya5Mx 8矲PUC?])pcJ$EJ/:þ~;Ur6s93*"8-C:YɓhY͚ƽowEy2'ivYݸ[]|0vg#в`PGo3KݛYlr6mEɫmܰ?f;~ghgQDz^#)3NZY 7V_8+'ѮK ?* L3a(JM}y0 ] }@2fh~ᢉu\Un\GʛfoUƏmɄ#^囍kMÒ:t n2f;HmϞ#pdu76-Uuao܇);MZ*ncC%8<%N.3iw{o: კQYփ=鬏װ} ?>s<$ y endstream endobj 1625 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/stokes.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1643 0 R /BBox [0 0 443 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1644 0 R >>>> /Length 30742 /Filter /FlateDecode >> stream xԽM5V-xMpSp{}ߋ9un8gJʱ2S?&O?okI5?5oӟy?~h]I[ӿa-6v?ZK3nݬgmֶgܽZLѪ?&ܒegdl5KXXƃpP^')knx*>| κvn]|q(T|v*P,0/zY'@-"(T|wjgᰰǣp@Yx=4 ^x*>qXl$vvh}< ;rvS>O8}~v,zAŧE"댍gAg8lkb٪3s ']uǣp@)eLx *>e|.X ޝ/8x*/JY:|~x*>L(ow(߂(|FDV9 ʮ[鿶No_'O?4>N׻RtN}o#|Kػ {`@3ػehP?Y#UכֿN?q?{=Ah]tZ_<{K)m[Z-̽V☫{l?,:q)t{MUc]ȧlbB2yy\#Cm~6?^{d}Ȍ~8,{ײw{&hŇk ebQqF>9_|eBكwTϦկu@zXIBكwTկH V.>OBكwTavM6BكwT5^$x=m'A3G1 dw_h~i~;,Țk5G08#ku4>Wr;M9G ~y{?i'<Vߥvj_:N(|Dj俅xD~ojw'jܮItKo8?ZkkZ*{ j.CxG K_hp42bn]Bqhp/*9j]|Bكwd7/ݢ݋ Ծu'9~A;QgBwv}cQ%&_ԄSxW Ed RQAv ܾؖ볰uwL81a.+Q3Yۇ5pȵ$3kPxYSY NqՁ],[]IXNih 8՛b"hJ-6pV*n#\ ]a١rWVIxYSYpaZ8W{zc.,Lp ŧ4QmBUKv8 |#ؓrGDWy3hG N˕=DmtX~A$(Q~I8=(OYo;s8ļ#ex~ko^@`%>x_({-wD-&P)toZ#Bwh#ls3nf~$غQڷ$P Y(#\&pٍ@k ݪ~n~ׇ=L d<_avAkqy*ĤxDVP^Z8+Osioݬ0^JuVC߼SU7}{TEOmߟ&kl8g˾."JO A{M ^I+d{MLw ^N;[6={{MLw ^%9~Z[J1oc!^|ow)Д aYy+ń:{/"JI Gg>To,X3ݬBsE۳f<8ʞ&ZLDBEOOm vXet{W E$ Q/z ᪟t+6<.P{SL^tJELɚT!iۻc o`~\/_qa(*SP%ݏ@e :~A;*ΨOQy;#BكwPQ~z~āYHPgT /Nz_5]% Bn~;,Ψܲ{|>=W0Ǔ+o$m Qm k[uz `O~"Kc%RG#j3(>XDBt4j(ޔO~;4QYYe! b)T6lx_({,El^ToSk_=G1XDgzBP1v;Ǻ8N8rJǿ0PT&UGK8Wl C\ǮDHP Ym~v8[u,amG1zeD-C\wnk#x_({WFOEhy[o~A;^QGK8׮hDZvJU[X~;^QGK8zڷÑ8Łv#Bwh2p4>*Tb+ 46mVIrs2ļ#u- jWkSYR%XHP YݼlݦnVivQ4G1fD5_^ ~tWn~A;>Nَ w~|ֺ6V~/-O冱jj A,W`#Zw؍ٲqdB@[_Շux &dB/]n539Jt/TxWL;t2G:BކfS]]2!t=4:3Hnd{ML%Ɨ[W(^mҵVc%c3&񋚏- >c`YIq_r;)2fpt9UqWqn%G;p}<%)_& "Q)L8ָ@8j}ax_({SFT EF<ɳ cV9x_({FT 7_gzy^=sxe_~A;"Q)̧8q U@aG1ȊlD8_Զgoo#BكwdE6Rpԯ]Oюc픪x_({FT /߭nb8Zgx_({FT Ƈe ]*1Iu7cov;G1ȊlD0_|ߪLP}p w ebޑوJOҸݮ\8EծgƊ5AJWKx+ C3\ޚĕ=3*駚!}<!W~}z&Dqv\TNƙg5v>a! '0Uc_CEh=r]8gu

§tHOdrT$e7A3GV,]+ }<%4#J G7t㚽Ny#{/=i#y'AiCˁ.^ALF<ţS6rn@8D$( ebҁ&Xr%zO==6 w_&Ib?zeu3ݹ:ͬyra'*M@Fj=H\f<@P &H. ODaj=6\Bt$ 8ÄO{tѹ1P ;,IO۪V-zxxA x q-] F(z01Жn:Sh7Yp qj]+]dv&Q:ר2JC(iMzf;OdhQ;yw3^9R'_sc[&{Oi[usݓ%I׻MiN@n;򞽿iyA /q߰s$}~uk,#`G1Z޹J]1jB cE*\>"ٳ;Kh%Rf ZˇLHk_ɐNAkemS :[˗An3L}sbq1FDLK鼖Pt`y}sGDh;U/g9T`v߻8k)7g8`ye X5KX.P>dvIE8 Hb"Дx uAQ[gH`A&j#f="B:T>932)\ RL+qzVo;ï'H [.Fp?ao=A,JӘM$K96|lRSk&cGq ujSU@Zhq3%H;)8^M8RI)| >UH8Q6,H#*1FOѫm.:J|ŚLseS0^Bơgz_vlrag K`4{J4:)z|}Ik,Cg/Cc_t<wr~Ik*C.8iܸgP ͟0T/: bme0zh*?Ac4٩^t<,`8-/+eV쒡Nu'S$x !YRkM=];.TM{FO2$Gat&gK0HDok@16TqoA(0{\:.f2Cλ] b,BXD =  LqmU ʮw˺pAJ</24L:6vZXzՁ5 PFX|oUaI,XJb]C'ӓ?Y`8 ryG%e[&OA%Q,ʘ.,@ѱ_HC:K:`/vR&#rݠ }jі宓)6Td?sN&dpU8u=-*\#qPTqt< [76Z:|A> ;x\+~SǤ6۾x8m ȔT8'4[;MS(ebۏ0)P8nƭ1CC.=L}0~ + ͯIm]NX`1'= zDe$x ! ,vf={eIO2$0ۡdhS=$x !,DOc; MhNwO2$0z=C ЊOLwO2$㗴xzv4N;[NX`1͞33M:<$x !Y2J쎁uJ:xO2: X‡ZmqjKD=N}{ !on(CKct Ӆ#)=SZh>&؆ʠYEns^⡳=D\JDÑ> hy9_c3}FEge2j '(^Ժbe%뱫Ryfu<LOii"ZjFHc/F,ZkY/:DL :I&/Q(:RD=|2]wO)ʶܴN`95S,foWDQ'SmɘBRZDv8:N+N+H^alvi)@֞ PP 'K31ɛ7*(guypZԣpC43(Z ㈟\̴-DŽ_uvYRHPJRi`?§}E;0>.ɚ'mqϭ uuIyYG5(N _AMoioiiG0X@;W]hM GXɐAQKM-!Ͷ.QOZUZtbm%GF-3+kav)F_TK=1X4S d$C&{7W\Xss*Dx@VCCU9dma䢓$sN2d)Mw${ $`$* [$1=V<褆 !ڄ"D@Vu j ɰU${ dP4(j@y?sT:;,1trCdt@Bw" !!ҩ$ۿ F$| $PThg2dե-$wC.+?z ABE Fb4i9SOm[9Ѻ<=EV'p`2FSemt^%ʩyMˡg]{u 4I hQ'SmɘBgm}pqَx$a\5w &C30GW9~Tpt `(*S-z'[@"o:>ɚ'Uq6u@8hߦ,ڣ{QylD#~mѐD{n~;1qpp4$n8cZΐ2ȃi|FimG.c) Y.Ȱ+R$Mﰛ=u?!MMYA< Wv%V/F$Ie1Z-Kxjk{7C3SZ׸z0>׸\'`$x !Yҁu=Z;M$FNX`,Sm6*M]'Sm #hn@GkۃNXP,9( 61&ƋNXP,54nc繐 -/M{Ik,C%Z1zZ8z%CkubmevOg3N%zO26Ű⯘uTXϨMP;=XRLL6jSҩm&O72j46n!H 3h4Pr"mKr !#,q٦iX90ߌmM)ʶ=lx^QBOyk,dQV(_;d=tbme 4NVJ q-$#^`16TEyaأh 9hQ'Sm*)uDE! u`02K14-$TFĨ)ʶܴΘdC`V|G`v\8Z#~{7 8Tx8aNqOj_8,|ڏ)W$uCB ( @B`> .|ګ&ڧ,;2JB0r,p (}\o+i㈗a'󐩈24+S30|HBhI{0%²6XJN琿3cnrnGXi=&h2~,vحQg6~sX`ɑ@VdM=-KV^Q'Sm I +h2-(rz!xIk,CJ0 NG{NX`@VM=ߜdh;": bmeHY Fa4t]DYxtW3$x !d%MV7,$CۭѶA'Sm +h2w= mSFtIk,CJ0 ܳٳ' mX3=ːH1 B2x'{=NX`,_vg6u=IJk,Ce?1zfK~l=,` )'щ=ɧ|WsNM:xO2 Z˴GHoosGT"&؆J2UbKn'$ﱺF2j46n!H`OkTɷYL]LV.y{|NԺ=.,$YsQ'Sm~:dmQWZbxsR:Aʵaɳe?Q (D hq: bmCeP*E4JO rEtyKk4*RH•|ڗ( 8lNu^8Y4#qOnr@wUUW71I3Exa\^| ᪠"Qz HTb08'@r8J\c8> X%6^o|o ̠x3#n #@8h_o㳘ZCQ7qį,ƞ<0X@GbYLqM"IG0 ~L,!Ǧ'Xِ5\t82h%n{  \#˅Ԃ׀Q 'O2$kc8?L4IѺb%V: bmeHra4zz/$Eބ˦梓)6X$p`<(FSO8zp4ߏ GO2$kc%zl撡F)6Tdp`,ݯDa.ڱh)6Tdp`,FӸɳ'qdhn=Fӗ: bmeHrq3yNYmK@kыSm y'/Q('_K7d''l"&؆JZW,GL.0Mc2$x-)ZڢlMK>`56\jetDؕjHFŨ)ʶ~rB4,u^ A˛h$iDiqep>\w9Q8Ї'o/)q1)rCA3 $2©+]ZYF.02k%#TxH( -^˦7n]~dϠ,2`]8dV쒡/.Ũd^Sp{6ߵ೛X==V'`6Yl\b~t{ 'f_|7ʏ.ݝkSm I`?YGK)f{~꒡PA)6\$`L'u윯sLubmeH ƻYVsLrfm2_G/:xO2$mp?/hz6Fuk.CO0 WOĐ_&=4==چːwYdh~ʋ.:xO2$\/dl!xA#~ru88mjƿTC؋L$cqk.|ڗ)%kϣ6g l̠E#҃žkz e !-=z/qm¥k^n w dJ̠C'a?w P\SZx8SaLQp !k+ 4kXc+@}YHS\Fh2 =eɎ誃k,|*׋S OH=.: bmeOc0z$ЬsstvIk*CT8&n/$C[v<FO2$Oc0Mك doW]t<< a4\m ޙ%h3=< ˹HZXtʷ"ms訓D){hlNb4t.NG{jk,CezvNCD'H)ZԃSm uHf)n{ѫSm ɤ4J<.|WއW^4lCNyXk~2-O: lMaZWG=~XW>)zIk,)M8%eMW:~Ǣ;57Y]YFrHLy# y$st=eqfpmʜ%,-Hs񘄤hGG OQfw.yG H_I+?vpjӷYDGEwL!46#Vİ88V{0)POs'_u׊] *!W3C53( ㈟[qӾkS׾é] Ee 0oS§АH;~;a0ve)75',}G+@}Y}4 Ʀa4ϳ:L)<[t^bBC Fa4}@V[)$T'X`ف,'SDU.Q]%T5تN: bmeH&3 Ɖiqvv.MeRt^%g ˩yòhM]nrq8uhr1EeU)6Tdp`<+FSO6UW H,B8uv c~U8e/bӈn`5Ib'$YB2 <3(vqa&4F }p1BY30f>U]x8QaL|?ڭI.(L]|x ( ĹƏq}ca7f,ܷ8eٛ7XHcg@EOMe[YfR8<ќD=¶?@څʙ hW4RCKZSm I`Q8;L4jmV%RCkfGO2$c8\ %F}-AUZXѰJ7,6% {k*u2XT0c 6&NX`wM=mh9^z:?$x !,*.dê*]:UjGO2$EȎfdh".җ\t<ːh)!JA5=Sm yc㴸*va#SF%Ll*-,hTN%hӱjtG=+O{{ :,*ËsZgJfaf}ҁ{ ! ,*S)fK|Ԋ#h#z{ !,*@Lе0e[dz=Z:74a;*2XX(-%EIQd;- =9ðٸy6!?X&Q8i/0qajw\wx1/qdhJg&80.;L8eu; P̠D׋i\ 7>>W$T&&妓)6T`g!N'h9ӷקd=mk9$\rs$rmGeX,bRK3lU7(!Y|c}Ik*2(k0:]̚mC2N*T ?䢃k,C˭QVYV~!f=&C&y}Ik,C^ZWJ)o%CGqu`*rg ̊ۢRz<&.{M׶Q'Smٝ3!Q)= hAʹWeYT>)! ݶ2NM'1$Jy $,j8yG‘/B8p8 .(9 E+3a\ C.(n|=6>!o Hf xb6 sy_`/*3#q/noֻio]|}~;y`D1EW C]HP<G:d}P|>Kin e`ޱ<3CItg7ٮMt=Tթg`}ZȄ7a0VSzͮ"G>0K.vTn%bGIx/ŕ=C" \fkq|IFr.[c51]SKne3u^סT F^iqRd ~/&Q'Ot2Ma9;oXVr᳻J7 !Mw$c`Fcs ;=`uto[\b:=$S:߷aYDSƸ z#tЏڣ;$RSmO0,M2>oaҩx>Cyީ=N6G5ܣLyRM8 u&{ò\Z9nWyIeٟRK1V;i=$ Mp2=`j]G2j3rKS%dҳNSmi*K OcX{Kc;Szwh&؆ʩSM==IY6Q'SmIi4#4"#N7߈DKE,j ^6Kcl"~p=$x A6D|,l޵A)6X$`5J2˺1pt\U56$x !YrZWvYjGSt]g2LKݤUn [#|\&g8("yfxf&Nmx~!y)t9i}rHx>}HP KKU KN?$ip>\sFd8jiљ-3h9SQyj vlng)hr҃S񠓜CrTҼaU kwD=[Q2Z}!/ KyZ w\"bΤ$jSpFcs*#^`noS.Q'8A'u ˝E4㪃pȩG|@:T<s:opUG334q5iDj:.ԜuՑijb3N0:@x-7-Jc f&Ya פeBmK< g9<$14Bx{ -7_%ѥ1ZT*,~O#D=4߭g4QS+ez?~ .o|W\➩ VHulMWIt0VQ"{Xpcqy3IFÒ7hsY?FȰG%1 B~AF"6Xjеęo˻!JVM3Hf[nv`!q u [rCJ `cX[W n\:&3’Bt-jU`m=vdaj?PP\r;C"byؐ[N.10۱fMMXKDfv؊N:>FyRMB=K,;i@宓)6TgK.d4TFh "Nŭ뱖鮓)6T$RFFSVF6\:O}d57hTNS/eyaD=T}Yꨃۀ8K`2az'&c)|g=]LFOQf<$b,6Qlå{N!j,>7ہ)}d]QKՅږӅe 7-F!Qy^rdx-)-q7G]:Euߨȵzɳ%(QKsq-sx>$x AYHe :Λnw¥S>!58rk:*r.l])}3wIuzNXP E|ܢUz܋;mKwl)m+Ij:*r0%h}Eb0GߎD|c DBz7$EHtHڎ7f0ncVo\o~Q8oHc+qqITa|^'ԫ,?<a% \hqrAaka|^IL}8&l>k>N905P`qO7]L?/Qb3dM* @NcKn>[50M#\T@9 L3?iW>GA96.(/ ț\F Y6uv.QOR}-W,zd95WXi( % '<tJWlOO.5ǩ=[㐪׃NR> hXN8=yK=oA'SmZ_8|y5 KZ9gVY G"#6XR.-/!᩸S6]uY~1_c3M2853_9$v%1zII$c kq- I.Q9]Vau^`7Dφ2`Iqzjw(>$  `#q.jZcpH(NbHӗLU_J$? bz)wj;xp#r(vFǫo]:/_:zoDe;8ðDrzzpw,Ez.S:$x-7KF\Uf+t^406]l%X$ikbKnu8 70Y3YdqJ|?]YgƿvtJ%F7]Mfx_({iEeEGgi䇌0>vɚ%r3o.|u0>2ʚ'qtK2qB[KCQkV<^7NyѨ QrAGKce.l]'8:j.*& K"c4 fD=t5+JNXP?F8hRԥS?MZ7r 6XN=7V%#K&HYϠRbaH;ryDl3l9>?(_`F;P-k .wȾF"nqet+Uw]Nn$m=:^(P9b!uF"ԣ;X&-t*ڬj:ȵ=sNL[\ݞh SYI|K_ưp:ȵ=2NL[\ }AD=гh:ȵ=HxURltz֙:ل_>>xfS ?($D==n:!H2:d(k&!RWNcFdxy5(9,%M4n|cߴYsk*CTg6nei\WW4nSFoPh%-JٺxH#]fpmʝ%0qJWD=[vvIe[nvylQ-+<.ʹosy@䚎˿9xV ]2VE'SmBS9GTJ{ᒡ猦:,ɧ@ʯlb` Nz>QlS>t^ AѨKftm7H]8epx+A3qav950+w9oR6)->?;{8҅5ang ɪYʢ1msÅOѹaK4LsIJ<$%qozrv?ٽ7]ǧ/ɪiBGR']n}+=Q6D1L-?L%lm`\ZtBA&q0(IU~D=|xYrSh`#7 1I%]WQA D=[I?R3dgѹ#x%,WYEEA/qdra3&߄A''F'X!vP F*5 A1zzF2`D..ck {hbؤ !hbbfaP44ꌈr&N$Njl~Ob.Os Kl宓J 8z8%OWzeok8#޼["qуosp?[c"d>d2IX*GU9[7u}7 Qo:/rGJ&ˬFԻo[.!uRkzebuװ2u 7_,^o: Ts u  d[5DN.:C;`f5V úv͠ˠN5=o̺kX]~dv@trԩX-tz +Km ߨˠN5=o\KΥS6+8I+z\u(`p*~d T8K]YNn\2-G7S _ՀέKӿZ% B'{pd2'Y#DV=$mw}]'9$9FyrKS3'wF]/'wlrYGG*e7WE` .k,zQ~ɍDo4X0[F1G4;\2]4A>$xL^loqU6;3֝d]ᨃ2,Fdt =KouN<:X6ԶO4,80]!Gc 5o<\ (-E^hA@Nmw_C%)7~]nj_x$Nw3k*J!?V NfieoQ~CgrąO;=9aqh{?>-M&%RG37>cl=Q"b{*N'^<]'- 6-HTY0yam%adG4輐Y0ә@Dpq"nIԳrgit;%^dCdTM'1M>g6uX Ev`a5HNb(HtBj K~m-NrfuX610֝By.[tiz15` 56b[$Tàr:Cm88҈X5q呶Jd1DZM'j{E0 WAHHKqi$Sm=:&^/Hd F׸:ɌTs0]KƵf7]{#!rI|ڞ|t` X5u7vN::#9r9`5hspH끞 㨓|~G@KmHuRҙFgTlziwtn]pD=q7ވHw{{Tr ƥAD=tNJf 6 Yeyn6$a5$9*H}ۮ^4_9u^siwϚxCHcť#<$sYK.14pEi4?<ϒrK,FeI$߈ԃ&uEA envuzƅ' : Q ;V)XOgֶ Ҝ?~T]b$'v4*emxN82H!Ѱ0Q> QƖe|IUf~q\zơ1uS_>dd?giqH7pȢ ..18̴N^!' Kr<#\tpщƧdnJ^a'*: A~XFNJ&Z`.)v[Vo:9gwˁc51gp <..):ey3˱'32Z,d'mǸK uҳ9$aF :ﲓ,"NzB )$\DzH k@愁 ZX[w1<!R$gn9E*KYw_]N]'iz1%6c -:}X]RHN4=Ѐ!8R@]'izC0Y%O<0ᒂG Djwdfz鹇Ҍ*^Zb#.)xBvIg|h` Xf%5M<0ᒂG DjwdVzɇ %Z@[aڏ>{0P@vfpb;X_!)BvɎE$eD;%d"s1GdZNDNuuxhw%b[ :iI9H\'_x/qo<-R7wj:`f0]DzFԽKE`Dܙ:fs^![DQb=SDdILӏfk]RGD2wI>Ԙg__g-6e4u 0nbVrɧu癞d\skuma=8r7wYXӓ7Xv=%QR;aJS:C` N|( qI6%?WVF%C@$uҳj-.Փ̉?=W dV4;y 5~d^hNslad%t^IY Ecm5yH\L PtC`3`Ș/8P#G-.}oq^usj- 2-hiX SD=}HA ڌMc3}lH͊:Yb֭R4VG^R_F$4{{OKVeFk]E ;Zj; km6|*k=l9-e& >F,lm;?([#Uڗҵֵ۷yvO{ ~]qx<%Yg٢gz֩z^ǿ K#FG{Q{ Xefzd=u{==E>==G8Ld)fnm')nLCxZm}~6;nT1-Ɓ+v΀]}w]8R$%| ʘY:1 wNp׿Jhͩlk}ִl7w*~\I͡cKX{!D=*zN;m߾tvȾ~17MaQHgk"qeSNrB$_Nm]v=Cg{J#-F.٬uPR^Q肹̋tv2{+Z 4CE7qwn,DV[$G7X$\ҧPY7S DEVMU}tM&9݂|whyk4j g0MrB:;1gW V?QD$h)~o$KWo k\sD=ǐCCD=V3,]@YL2\-zEj[.9`Lw<Փ~{FYjwW~.M)EnL mېOMfwdD=Ly OU~?$:Y۪'q"QEļ*h4rݼߖm[?_2}_fo^b/|lݾľҷ,I>BurAKLy!|=L3K`/e_0cOgͼ8B[;{.Բ.VЮIR$^qnFv[eIk?SCDVsv&!βL7R~eglf?>!Y~TRl%WL;Ž[.?u0 %O6]SZ^X=d:P7%=>MsϳЋ'Il~6\Fv>l?z(?zxmݩW֗znt3D!׷|y}pZf<3E %tNз,HXqe^oYsl>̚3fs7kΘg2=TkYM8#~7Wo.τ3lxט׸ u0)O`l% w H+saGpvʥ3PE{px8*o n aؿ\[Z1n{RN'@Cbš<?#?HSݛCG5[.nn T&7=gxb #̕ʣ[K59)K'] /7 DATsMvȰIt_a f6% _ Q*E_Wl&|eR%nRgrd*Q>1%b'F} endstream endobj 1647 0 obj << /Length 1799 /Filter /FlateDecode >> stream x[s8_GB&CһirML6g0?ɒ|XNM ,iWjȀ?3PR:?/Zg5c Ll70>6m~[A'   eӷoWM`A@rlx}su|ztݿ\ Cq U =QO&jDabv3^v aA(RZM%l;8jDR~,%0'hQ7bK,+ I+hMTz)8O㷤{' 8 @R@ԥk@}mB(5̔=;dc )`#nWlX.m *ZhZC9Es,SRT1ˎND&3fCoԑ¹ǓԟBrwX07o+rVjBbcTdoBqNL1b7#R5X'&Ij58or%L* UIlZxF_2V&u[R#&gz'_W@A!f*,Ju4 1L\ ,ie__#9{4f5ܥz~mmo94oj.S7ۨӖ.uنtʰD̃#QCQE4^yJ`=ZWi(k{ ~w*9Dheu۝uTw;aq-V=͂rsÀk2snIK,gB&g0TП_NAB"08'9*1$BҐPd-/qLd DX>珈>6uĽ <8fCA{M"q+A{JY 8:Yuv^f=B# C=7gPZSѶBoZߐOС5'$QϖSbY9ÓxZ Q` c՟V6a Q\@0RiE1zCd{^|NBS `UңնҿllMض8 r?%Ōx=d;S \l~F"U(8cibFpqN*pԼm"y~<~lCY~'?նίPp2(,T\LS3Wy$R8[~ɔE'0dGsӟ;"t߯s(Zr\3rJx@|,\Iz'Gp]=#)-QZ^m,lࣰB08Mk0Wєk%3+mxV.Ek@j6a]!7"E霕ּKM_yZg5ⲇ&-:`.`p.x(c^{ޟNcFfzJHݣP8vUvp%tap7mMԝJJ!i!<8v^=N2G;#0K endstream endobj 1655 0 obj << /Length 1656 /Filter /FlateDecode >> stream xY[SF~Wh2Ӊ]E{Vj!M } <KJmņv{"k )jѷgel!v1 =Xk"Էuѡ(D]u(g]>}s|z"ۣӳwPRxn9~p>|#ĝw/o`$Ly q{X! } b¡QiV!Lbʬ6RC]n ''!LBAc'sCb4P{gL,<rrzW]wnVKQ@=|WoV~oí8s75k%v!HBx^2(೤vZR#Յ l *1QlvJ)TB:1I |]Pf`kroИOĦ6g{"mi'j q/3If$Dc䊉S{nhWGvU/Iك,&\BDG?ԣk(sY~G.MMȣ5 b^eUٮ3aYRIkWQYfFio"@E2koѩra4K(,+}LݤH>EZ v s[6aAsqqM\12Y&[:SS~KNiڸzo$%JMM/.ps`IH6A95H\oWOPM{ x$-LIZ4#ÇA5/j{viO(z.r]nz[Oz$O7ʷ ToAKTu G@NGj̔,4. HzU+t[Ԍ+``@rZȳAU$6wrZGE"wSGi "XF zT&jZ-Ț{k#z_tcuSsD91-I u}ͪ˜hֳM`û5fyR8eTdɳTUUFӅ,~& c/JO.stꣵ[Voѓe$\O|2n" bCKth۶%0U4GS\nw gg'"Al-nC~wxFy=VH'Ї!F.&4T+c\͑5I-#N](R|*ԛ`E;!reu+R{LYe@P&RC2:_Ł X=?LGZ^58T$V~;b]tiyq3Ě0Qo'ER Wq<J0XQ/؆``,VH]27:H+q{~+a$E֛~?.|+,͠I)Uh&zA|?;sqb3 I5g=Hgai*a~UEi&Ky#ub5Lf"-XHJ4u~-51I6%O" "Mg:Qѵ{PabQtBT N.(Js m*} endstream endobj 1649 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NSprojTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1659 0 R /BBox [0 0 420 36] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1660 0 R >>>> /Length 117086 /Filter /FlateDecode >> stream x;8 (zzQRCpVQ|Y:"q A/?Nti|gwݦ?E~.ӿW;'o}L 81O8d8qrzƀNZzoZS#Wy.%V!͗|ؿ ~awyS|8}CN<+>p?/P%}Gѣ|/@~&o%f޸zެ71ۿӳ"g_ѣЫ}a ?SЧM,}Kʳ>{=s5Fz)У`=Q ǁ\]brb{|brc?ӟ|~o#>0vﮑ3f?b +Z2-kksFOoh|qv$J P^ C﷏5\y>} 5wٿ> }ڟ;h>GsF= IN;BI>u#je zgh$;􋖨?@3; =w .gH8!y^ o|.51&éN̶U &WLXHd!j!jGعXj!ߝSx48'|K>Ɋ:hGGZ5%~ṪO:'bdvM}ΫWEBYJetGwne%ˣռBo\gx޸EE)gb]c Y>ɟNf4<`Y5n |dܛɽٸ'mC K1JʖZXuQv+h"5.4lS^e,slu?= sSAOiND18Wf* Y?}hSң% ?ݲc. G51qf_~?_ͳ 2 Wz<3aZꚉS2-u1tO]'Q p O#lۀ{ͮ WXGvʻ:5B__Tރw/ZGX.1WO Rٰ;H㝉vҨ$p\ir%Wr eAM8#q)|qYc %bTeqc_e섶;]Qn/d"*7UV]mbV6x2+1i]Gp^z*&A.#":2Bq*ﮣ"yc+b2Z6|ڇTl_&dCwn[Cj}CxR@lhТ 'bR7%#vX[SHUnn*=,5@Lp8>WqQ;*n1d˵r?׳ױ%w\d{c`}|xzq"n~"Qեtu6O?jScc5>#xE(MX\0kc]k~ӛi)#Q *Y+zNj&i 4\C+Шa9a&,qgii.x<>}lC"ǘ16_878vp0F߻tA[q|SI 1#="v"ב0-ѱ?QsIg_*Aɏ*D_ ,3?[;ZQk 645GC?4Gi$jWiD'ɇ/'wHu.ozޕvuI m]3̩#Zh`~!?ռzq].kZ^i]b}mc= EO!_[FVNmaH/D\h}XDl]^g.q514pvY;y _2W8}ia~/k޻׹-{Om^9ߙt1_ѓ;N*y)>uws~ &)+S7{|m[[\οW?{džWYb*X#35'N>􎳜kĺ(ulw ,TYa'Zrih|^cnS^u34ѿ7g(#vD:@:[|ㄪ""Ua*_Tʼn }mn>6UZΈ+z$~3Hg[틦=:b: |`(&V1 'O>D:~{sQW~؅ر֑њ2:]7(vϖUHAx)?Qk>G,]3?(K!=>c?<kZ L?NhӕG"^⣋G)cfjB t:/4߫}ԽWҼa}%ٙilr?_vYF9G^iXmRbo&\hMa/pkʦ|hr`Xd`*F2`:*섲vBJ˸^ZjaEq0EP Vw ˂ZI"*)|:%=nQiӈ;+~c}'T{)GjRz  oMadf@Ia=B_h#Z{rȠRiC{Bmk)Qi/? 8gﴟ>\~:ʇ~_3qV}] Z BSwU @j͕8[cBpFs|O_1OOW"Sd%= Yj'[\Gp/|Ml g7FKZЁ)ږ*3CFTGDc~ơn"ʗu;R*:Stk܀z)r rmH'J1( RFR|0/MOͷ4y?^6}* 8O=߆5sYɤǞX5]NG=xe@s+jqS(b绲+hR9w%k|li OE-qWԟ?o29N{#'fG{^- ܰ1x@6ճ8g;U/.p;bn3>;"w&g5w)5 5.N~-ew},oca6a8 o i_xSqQn<{p"5bqw.]SUGuGWoF# UY53ʵڰ SbVUu٪.+rvY[>*Uȁ}.7 Iƒ"EOzFvAbUXmUQmWV *k"*>ln+{nH5 535. ELs eU%V UUZxLIZR>,^茽gxA\sw*~3|Wn8 *nL#O%=ל7=7=)jsWYPF@D<ڏ-5v vKWÞ$+RuǜsĤdRU+h '" .@樂%L@@d#ͭԸ7x]2%=M,>>7֟s yF3&cε]s"q-/(-e)5Bqӽm÷1rg3(6USDN-G跌(x^Ge:-}ǏhzlxCs~+zfGϤ NFż{QʖM'MetbD!Gc~|3|EZC<⽊NF9KZSԎV9"~,G[&xJoch~+X?k0k|m·/a0/kcQJMUv^t޿ķQ5H 8;jrjЇ|_$9R(KV ^u랲WL(=)?4J|5x}k55{O?GZ$x|?/|/#?M&_k!'q]~d Z/INؿI뻛qYOGR 2|Q8/F?D51N`:'"Gܬgaˌm͗ u.#w]k*sJ sBn ! n?\FH+$v\i.n&;1׎Kdž>_ao*4ٕ7{:]Lo+a)z=t*;Dݐ5_ʞ9)o Nx{C!E>cIUSГ7zDOc*Zz $3{t#$9rTQ*(z>9)(k>&1 b}?>/p|-QFѮWs`NJN<ཬu2w'Se|ԧG৺Xʡ:{YM9Ye> T>cc|_g[ |Щޫ2:9Yj?9J>آ=]ż>Q RX!2.޸) q>G7|//p26=_ؒޠ'AUS3$AJS.J~QϏjlM_ѣpH'|/ۏ\=j G eV'\J-ĪAfd3V}TT KG1ٳQF̃ېKqdQ|O5i+h/ Եf(@K^ L+p'1^+zH&j]qΟGMԠ){RdCN#=ŹGu(:yoru'3Pr= @_~$>p? '(p<@~)? ʱ1XqudLeP")j~=cBu'aA 3-T9"QiEBb՗#N3q39lqr۽9Ʊ>i煪Z51iE/&<莙Y!~;s&G" CjeE ;a4[zղWc]CF ҌnEt=ŭ[KkUQDʭZd>;C9v$+^x51ӎd=B' @,%uV@8~o[vųŚ'h`oaz7n#>z=i{'TU0G[(qx@UHon@z_|CyhUĺ[݋ol~K:zyߘ;2ه&n¡gXc@ NOsb$8;1ŸnjԼ 'rBNPޮ?4ܫzW S|s9G|rxo!u:0~,qgkNI4$g{twQO|Ni5|w;-FeQHZXwg!'R)iJ[y.mulW5[/ғL\u2QЇ, O!O8~%uYۅTo|,(=6q_LaX|cO|QS/|V֑Zǡ,d;_޳F~M{ '_,yrm5Yky@b 5vamy}aouG@LsfK%Ή?Й"ECyV71 hQh/?Rs腒|ÉB.G p|d4`o@Lɤ[4^<ɕs\1AHbq+6fD&S~$"a\$ev &ISQk쭉~R$a_y);O٩Ҟ |P2'"W,a?Thj,YIOHCꎬ~ӣ.QR^`3x~N7E'i5FUBo> ̢Fγ3:_#0u2e'DΌGi+uP/)?Rꁢ.B ꪬ+0"^2M=W9O꯲,V&5"_86cMT`TuJbT+z{Y;U 'Ar uiYi͊j`@ &TG^쭲k/y~~ghOd{ fnWȂ%PGє<@^UBD+'i%7*e}(;[=n%IUDJ1jʠCkkb;v-bXkcGż~¡^RkO%uBu"TuKBFTȪA6S] ڣꐱTq5|xӈo6N?=Du_T3i^g] SG-(IJ !jF5:9a^?M8^OqS5‰Kq Ś꧟u\ ĭ(=ZJS}TO]s|HA'ҺʋXC?{.xNp]DH\c 5.֍:'bnWul R\;EIcVO Tw>ޛ9V5VPITd]-NFŃ0~MЫNrdeBd♹-:%2Q:^U*ck4DM̢ۉIut;ߎn).=i׉N{~ Tvxۮ=sF3"b[GoOۈYF`~?,uLF Gi=6!yĿl.c :T {xs- ppngGV"VEʠ LDʘW`qi]@5P/[TlmE|[Xf`y CWn!a J#cZ'rPs+n&rXdsmrW,|b&¥}ŷ]O_x;vMZ;a5J z]>7߫p{||oZV~6_ }WGC3j"cuB ى:!*"a}Z 6g Q58+=kCb!?]ϸ? UkC8ق m/+'Q__T`*E\WZc5_g23.Yc}w쑐 _xF/әG'+=}hUwC(G$yϥ7qkc^yUK7|%= |39>_ָ:<|_iGIJG|=n;>_Η| z~sȕ(G?jq?^ՙn?簋8;V'J?G4cCԣBnZ VpW+x+vWGW!jp|^2~3g4C.rU|.>xЇ4Q0_c4Zi1:G9C@henGuMm^Q1:6ZW1 )g!׻y8)Qۚ5.o-e<9"hXy#gQGլqyk'ϸWDO{? 8%86.+pդu&+^ה xqI>Ynѥ*jN.Rkt>DDmh]S}~:=M3UQo TMQE)//"np}:>g}r].O99"׫GiZ5)[^WsU7\dhh+Hx4 zQA5?nhZN5ft=#J><)W<ϴbXyXB"[ƴ!oRR~ąo(5WQ,m㚓WHF/vIarz>c!MMA*#D قC9z1w]3~"$)|G*w)1]FzDPS<>:Q]q\6ͺin'X6s]~˸VQ|)5N)!riw;KSP39&SkDF_ea_Wkl5~TymQYےz Q}.!iILM'z{e]6{i^ݾ/q~zӆSxߨ) }7+41#N٫fTM^w9aGouY:v^VJrEzľv^5EXN+zWOi=wt30[wNu|rV5"%m&W9<=dGe`L G.'rw31̻WbDcxsD'W1lUyqReEUڨʙy-Ǽ-FI[Jڧ[޸Oңo>4,nѦ~+Uqs86_YyV`7NGJ_|`?z!?3ם9+Mu@/Nlq3r.9Q2Yfg Gl>_6O8@rĿWW9[cN)EY!{e-,W*E.kRCIψ?N'r2%rS)BUN+9Uů!JTlF9XgNXk#u~)t_FVK89Q  |]1?TO{CP7݂e(G8JuO{}xDRIqQ?Jiȹ&ỏ2+gM7@~Tz kE~Fދ>Ov2+geo3wq*5=5~"4V,ӫԌT(3*| rr/=>IW8S[o(9D|i%+ckpZ~:Fy*בs}wx5U?㳾*Qad,Վf8ov̛r? q6,Zcq\xtָ˳ƃ~Щr0i}o$L k\//xо+4 bX]<[GYM:zuvʔ+,rembgzF0={,#4ԸDu5'򋿭A20GHxՑP]}P2/]g:]P&'ָ V_Tlp$QTW<\qsuMlUZrƽ!t^!Q[)kr^. [P-pW츉ynk\WlkcIF:w]XKxѩMYsP&EHğRd9?uQJ&XcDa6mԌhLQm3;/uHw(&JJgtt`,Ok',#YD ʑ- k\Ԟ/ *1S^Z},pzK JZ. ^t›E\{CCϺ7D5[ޙYk\Ɲkӆq.Zӭc{O~8ۂ*V)y;U)_UˤTUY`o>bg7U%J~9<7ͣ4󊨎51׽9}BG៬&~VyQNR_dU:ej⦦Ȓ*vyC1_ѣޛ§+|h4w^ܔ%fyVsXGXYMyd?+,Eɇ |yGՒg'E5[GUPs 7zHͻ~' }(z>q j7?p}/߇v{)q^:8 %d*UTsUpRSU*5U* 'U'5WWD[}T5Mw^|s! %nu_!&K{|MCdg)8II Nk%鍨dK̈+a +U:T[e(W~e*spj9ϮqO|~w/1-o\[ܳ71=O|A ^EWa]>#U^'j &|KG~}|'O8O$?4ԸKh?dn3^Z.z$m#!n͇znl-{FUCR%6 3xA_F (N|zs^Ӑ;1*z_?\N=IT'*&Zv>=vMYry:8TJZ]Jgk٦38"aԭѩdtfn3]&G劙sy6*#Wsuz]Z{ktghݳHR>|gO{"era5ss ޘ+Ol+|@0TP{Oָ{<5YgyrWw>]&jָC%Q;{^]e*H鏦F]FwdQG뷩_l>MQԈv}^xĝku"I|?^fT6Fl4S]IYWeM=GedGY"˚aM߾V$>~ Si-z} = |[~҇N |?_:gP\O9ӏAhxPF16Qg)/\Oj@=^lj4jzOuduLNj^#:ςoP879N%?"/- u?,slApXT'F<p5[kOYٿF&5O=`lzUHď<71S纕8 ?|~o,:|X~ #,@޻zC[nن>zL/Xr⿲,̗Y?YFzCN#_ғbe0Ժ'KpKyNV(륣]ؕ>iϠHP艹R/qRSөD;zcq}(sU]dz/GeCPpgt6ʛj' DȆïUSEO?GK!-?uHY$УTD?*N4齻=* ] yd)bð71Ƈ[?UEQOYED~]1)pwgo曲j^RH;p.+ i[S +zc47A ucvUrX/g%i7O~ˉHOg)%cc*EdEƼV3Z_Q*d1=Y{U̷9 6,hqkW/җxo'AE?}ط~ɒ$k\y;v\_|ާ*Qeɚ5 qd;N.ҍh,l`w䖨>%h͟E'*Apz'{F8Q53܂;5n58'kzk-8o0ɹSPf[\YGoӽ%js}}n[x6f|p3;dR4Ը[>RP:kȟ>ynۼ[ Ԕݪ#ufzÞ"nyk/=h }G:zd-7ky̖q.+KM?J~-dIdi~SFUMdNB~M ;EI~"#D&MsDJ?>E6=u~('Da߁o64ٟ|Gy.B~zr=/d T͡QTD1 o^{`ۂ!luT^R:/JNhO_"swZ/u~_ɃD'W(ć{ Kkvҟ7=_Ցw};lw }> }TLfh7Qt+U#2q߾xoQU)񫼽DⳚbׇOkch).kEdq\y!'R{Q_w}UتR>2ևZcT 'Y/?||չS#U(~3rHm+X IX(8!'r} @yCE|/%=ϷNʭ:_~~k|K9n~#_ɠ+:"27<6|ķV}Ghxۓ{Dt*¼wu\D i[]Gwkj܅qVDg'tw!Na+[Z$znZch[ '>@~'=WN>LQqeA,"0E۵Kz r1|KW8>ۃ?;oZch齈7ب0S`2^n{;~?^{B:ӆRytK!-nW!oz~|$= ?68ɶula[PX1G৘d;ݦg؅-g b#ʇU13QsCPa7}OU yݦk}KC ~m*eU2S?UJ^A</V=F5wuOXN7'șt\ѣ)?>ϝx)M~Gk ? 8tO%oNm-?~#M3/Mt?s>zRc^?ACG\/|/r#!y?']rQ_Kfg an}1bƘgFbj[P9dw ks?)N kchgBI?Q~󱦧g?mhX_)|X\EQX5 $yð7eU5s1_k\ҶlZA5Fr~޻w|hk{M[C7_qNy|%>qb??=:uTez^xWx=SGgȃ\mBӾ~P^g/jH~ڌ֯gMXVU+ԌsױZWkߵ }$+֐O87T|P'VQ@R^Svka'Q߬'֚;UVKT]bקq0 _}I2Y%oz6o4)*ŊL݄e/n ͝NMCK:'kr2xFX+62hcoZ#5/k\ 7!f|PⱧTSRU!g]:nxGq e )C LMC] |.u|{jٹ9kQ]kHI8ϢVrބ[ZRP%d)&3%ģqCa}9n9˿rʿg.O_cd=UvVe[=-u6Z~m5q+t[m:- |Cކ1_JKؿE HA? r^NsKVp̻Eo!{"&O8g#$on,5&42)1 ? T_*[/||SWMnEʪƑ$J~X$FKzq_#=ETP7{GTY*(T-lfb JFO#W|LzIMzUn ?yu{]7gVIzXUjH׻憪L*n*LnEѓn9%yޥMVg3wqn۷*u5-.KУ9QUj^h?5*s0YLuxo3Z?9vZ(Ɏ~WaոoG~%=S[÷C@o hR홾^=݃ĺ/k4ۜTPYɢe5̼U)-{}[9 èίKg;%Hf FOjZUP @)3{D﷏!\B$3E)j,s3 Z+x+SY4Ph'nE!K}rxȿ8U"wC<&'|AE}ִ@qZԷȺ .iRk}D4yOEE֔AKZnhE+OZBo!#}==:%ʼnzښu\ވB4H\jwҭ ĉ6baPx/ذj]UR[b/XjVEir}(@[Ґ^F)+*'NYuM)|Lc冫2VB 'jqRIa`_qΞUJ^P~K97a\'[!yhyRq1;Sxj1Zy3(E# R tn<63]_G5^J볺&EOP"A1jSJdEYK]!AZ^.Jave90?YU^y?쀲$GC=VV07YkφTELig5 5.aW ճ7UXv(> _xP;tTUX G[$JN/H6S8@Υ|@[E]D5p-h@/pK$?vʬ5eM@\zuM2vcejD,+)bu桽a܈hՑ9yB*{`f= a76fm) h z5,{snΝ MW6a(AC Qw ɸw^x{CIݹP!VSJTAW3Vޝ5e'E5.,f|60ߟ+Dw'5.WRr&pZ8.fb~J+"Rc¢+)c٪,H> בz ʹ;:Ox/U߆~z?Ib]Qkco~+>mo5F=szO Stu+o/]KA#n)>|[:#Ty!-@Nba?6[@R?yH|<$=Dѓg,(>Ľ@qTj U-nST՞ ]wUcxG'T @5{?.iqOVΰC:/RH'mYAG\rkx/$rK&S=: Uf&jhH7UrK+zT7<9:UTahHX[Eplt+zWo#i񎡟uGw{Cz |8ݲZQf wə=bCr4;= 7F;4(nGC/MLbIb\7i?7"zC'_P?ė8)rѿvCאk]|ZCogRK:V|GӷM8=vmAo0~ƃ/# O(x'AYyn8Źq.t>)}G7C'_-'*$= {wd(0-XZB~r~>1N{_O9s>^yr>RA+ڇkMrq(=KOF^7HO6k|.tAgz/5'{c4/I缒VUYn_ۂJ\kzN"!= 8=?Msߧε_9kjVTj^G`X 2bELC:$C FZ$iU6Xcڔg?r׮(\DE4~<ŗ:h]WV=[C7 GQ(|`_f[z`%=_N) 2_y .Q gdJNH/IL3񽓠so1k sۗW pb}^@tP*m ҚRL$i.Qnj iy-ߋH^NHuFڅݮ"|As*N#9!kk~;?'2/2/< TUt|iNaO-|/eDOO~#~V>ǩJv >93OqfE?7Vq$ zFoRt>q$w)QUEg[ƶ?ώ@b^”X* ץZ7*i% dd$WoY+I;1gwz,a?A:|~Gѓ>+z~_\W༈S9O3陃?r8jx^/#;sasaa݂51k#s'ןONKOk\SŞw o>|cC8OK?oB! 9F/?eץ"OL*y8O?\q5 u~G1||i9$oo‡z Sڏr^̿W\=}z]ԫU_-*TL kUk]nF'<+רd%4S=&'koTH| Q7*+dS8rv_Qn`y&n4Tn*'^ѯpΩy0F~qsBҋgŏi9 5p̰;>_␟y)4Tֱz-RǺjսjIzR?NU]+NWkhYY7a*Uo*{,o:-?tƛk%muG*Ջ?j^3TV:UՕs ?yÒ}|7n7GJnӺ`}M+~uOx[U=QͤwUUE*GU)9QQ(o{D1NeCoqr(CހT7 Hޤ Ku#3}GL%n [//oKnҀI~z@,8G"k /,isy5lRgY:kpXSQՓ/(2؛ꖹkyonQ>uuVNQ;Hcloy}=?PGVN|9g>o<gDO% >IoV|j+ӀPQ_ :dl?'#z*zKԼR'Y9 8I'!X_R:oC7zOP'V~}#K&쁯p6>{wйU%fC xЇSSc}9$'Єs|Jޔ|`XY T<*}OAgAR({E*pCꛝ&W7iwïⶸi{G aVWUvJTӍ1В||hC >l\-7ln}H1ew=ļN`]:?+׮|WlY7ow·G?}e x⽂^T ȐTF_yUѐ*#P9u؏2"y^1zCԼtzeSpsa|J1Al,Jxz@z'Zw^o%Q"?drMߚ2jw |BSgkaW?l跿,SY =eCğ?3b^>C@n*_m^ƺ̎UҪ&;=fw }༈ pWF/r5F4TX_d['+m'ƈː߇^{Y/ˊ{H~zۘ?.oW)\Y|S]!q{JQbC|PH+Q]T4+1Ǽt3?D/FuZq5$WoK1_aJV_Vj Nk(V'UwTYK~ >U{Ez_{7/9B Z,_ ĥ+C^hbNUe5)¬_Q?E-:|OqԈ_V^Ǯ94HȘNReTӱMUoU!voP~Gu$*?)OӼJ~z%ZHx-)%\_%$w޽@*'Ůt֒.K=+9wS٘!ŋĹiz7qIGL  `ZSbMd+5_ªi(q뿥% ̷e^}"7E3*~XJQ/_ _ ⏻3F⌚iog/(Q*VԷkolȐA)@Djy{R<)"h3éR@T0*qU*zPjUfoCŊ5aQF> ~*U)* J닌Z8K-u(UHm3_A':]:KU!sadE1WlH[+e.5Ǘ8;*nFq/y~ooC;s&PL#lqE eҐS)ҀLʄvʴs̼Hs,\aDgN714HRpВ?T H뇅KOmG-L' >OاnXC}Ky!Ðp 8H/OӣySU$Wo"==3VfD20^YDCSZk*/˹s^s֬|*tAS_U_kYC-XB혪zԔvSՠ:bc[8)"4<߲6M$+H7^U r@-|d 6O8ʱj~BnV+<6<#}eVq]6gUc%>&`4dX*Æ-[x3kgpLO{/w{=8S/Ks]e]âSO PX2%90NSY_Ky:#ς9vUt*>O%j|;U>Z H+#*"<ȿ'<8Y-ΩkEZϻKָ{tz5O ~HРg |_5aaż5g 9W gHj`XC\H2ʜ*?%陛>̨R/!3=F9YCN1ړ#;6٥'|؟/Iҩd(J7;aZ<9gLٔSny.(zyƯH#臞Qz)w<7RzU)[Êx5^ m78qx(kci)'{I{[п =-?8oK `_Pn >`Z?#?zOQwj~ݒE+ߒҦ_4Q>q.|x1.{ۓ^|Ɋ#ݾwAe WTouGлyo)%l{u̮7 l{[s#qשz)}q!wfGmj}|gF}V px6 dpypž;t[) ;ꎰaw7!8VlusI'+l7^?qݎrC;m5.%jƳUg۬SB[RB\[{T!wpT#$lݮ"ڳnj뵨@e5'ۆc5.ͣ/#"3xD'9ߦfo8?\OJ>k)kJ~xP[sjEocc_8JIpz}W ֭jkFgi \Z1a%VmmJkFsi!fц q#SSXܗF@;oJg{B%0592nqYUD7V&)U83bw16I٢%x^ݘ^w3\[ÙsOf6!U9sTU!YiHR?3#F*Q\ELEEWK#O6{cbڔm?{3q?LoVntdoïL6G៓g &=a-u1EKűYoy7yEm/|mCǷRmA'$ WT;^؆?9QSt|&=}'6ŷ>> |1Gύ󚒞pxB~SBJ=u/m;dZݰz5!NdJz􏭃l :pXcϷ8<8a%~q*l_ٿoy?p{$U׬M^x﷏rNծu{hq,}=k^ x2p|`.pЇ~d]ɖĽ:aOܓSKkA=Dۓ(Gy-e{lb]Xv2LWoզ)/\E#cO>ms3}X"x$) 7jl`.5Z"x$5␞eقh^o>h9TX{}uZ6a6%Z>|^#.ZT|qB;[>O oSrPyrdMmu[ϋyrLLe2Hr;MF4UF2\j|y죂7>M̷OWZ%w>y/ܖ >6e폴x7}0+brJmM_=_f*}UskbMJ@Gd=y׉mgzGWͣEciAKy9/-3-6G cn=OA{x-|o;;/|Oæۓ^MP 9Mx;gwQkSo{EW0y Cz|a#P?Se2;./S P2^ꍐ{3@7UQ;ثIUan_ ۬Z(Ga{g}q~7|hngR-b x5x+^_:%z{^oi=茲i'plv*|gsOViVȟ/9s׽ᾲz΂gL 7m5U V+l\}zWԥ _y%N3[XU_qY{9;v{/n;{k 3~B7zHy:OgGXGiΫ/X`_\j|FuWF(Hݞlr-ɩA*.)m[夭r_\covv[jdqoeUv~{:2y!rL/#gz>~wi1~ wr>_[vc3%?<|o{-zl+Ɨ2kܞyjΨǹVCy&}>jlK/[мKn7r͍BLw~[M>ve | ^mC^sƿ%x0VpxoE_;}R2TG|x212 ^ 8pTഏ-WDW«8UA4Xr5+xwYcZUX6J2>vX@_!kixA:{F,B %.%B}-vlw[Cw; \ʙ&{!LX̓~Rxg8aqw;{-Is6䥆zM~]2 ςW%q0Z1/wkeu\=u%KDfJ4سwge4qp2@LT7pkDwENawop7OdUʁoʠfb퇯̉58oQZD@5j9>$A;^ Y9W!*j|^;{=zww$[{xne/l DV8$ɴ$6ZjYҲCjJki`W9?p1TŹrl\N_ٞn$ѷsSv5iӳr~V.gQ:,% "*HvQuOm%懆E~K|W?/ ;uswy?jN;J+L6PNb+v. }PPW[V\N~?g+ߏ1 ,'+m|;-:e>BhvYy] u0f Yfy|RWh?vnt6H"BݨձMr]%/u5xLc]3/ w_4@IS>4}~є'^Qyw^li~=+-g[/maiGH, Z6S3pWlfm"I^X2a]T1Zq ;9Y4wղ;y ;MX:/٩րРlò yNy@hV6(3fSf7<e]^@YI%s}>:GT6(>ɴAcie n\QW^mN(j>lf'et,<~B(&f,5zAΈ)6H>f:B]₏t :#nu Opt8\`#w?`lʮMd'ihbDe3Ihת.̞6)0{|aΟ8S\Q%bS_rHNԩ6;aDr^||n=[Z\ ~_! \3ZAggZWo m mA6SLC58."c(;iu6h}9ۿ@Y䥇 yBmDˊߟ`7ZWNm(hQч<}#0<߆dб;x/},+9 .du^<6pmAߢ}\q+P8jfնf`}Yjn<.Sk9vjg[-v8ndqs2Ҟ縈xSXJhI"^,>ǼK֧/ SҝdOb PjyA斾|,,>Y0^{F~feZ 'ӬzAр>m8mP='ܱ5CZ6}j~}vgfkzCrJ$YO-PvFZQc=3=]QyaY\Q}|Xsބ%&9Bf}h%.گd`).t gZ^l2,#nK +>Z(#N7Y%XHzU$#<,Myq'Zyǘ\Õ ۤojd7G`.oۈA|7+Kԁ}zSA]wv@tw&]<oIJx-3m1͂'mޞ<>߂g^oPP.MQ6{l~s8OD&.Cun4[ lR0қvAl0>4I~['[5xS]Y#+. VLvzdpf׺Myy*ok}y8ש$xln\Bh˺%4j᡼DsN;Ioä?Onzct>-ykyҖm{zS \ԽtV2i0wenwlx"oƋH[@,7ӎ%j,vMW'T<ϛ YcHp;aQ|׸e({'k-RDȋ,&r9 4`b;>w!Zև`תخV7/pObA] $CaA4Uo6h/-bkqcYCjy້|!;@u\/7ܻG*V5%Gn ۹کx4>c$;B.Eijf|R~}Σ@΍l5xjp9T lɉRD[ֶt/ D @y,aw٢ߙCqƽ'|džTMw0Zjp\{} VB-C( w͕/~wK?V0>P7-? wj-|F@~s?9F\;\o-}-FMzCbouztUk*$PpזQh(pY^n6bWY6j2Yn#e^dYW _Xc(A_l{A|Ď系#ws,'].n@ƃ%<'`!M]y @ޓ@O7 nm٥&~o˩K\ yUۭey]uu\/MmAq W+thoxj~: r;]`Ud݊mAqGLG_SЌ?MPF+3lrv0P ٛU'# 5{\vnz;RBHil[@qa?fܜ3f Vq0@8M@yHp[MV+&̼b3/[ZEmcدRv q>`%&R7YFVYp!DzF{~e9,[a5Lk 6GΊC:]axԲd.Ky|fsjmĝ#~i40iLybtvU,A_nՅV^r qˆ}|S%ވ"j&0jX1T9ؓ"d ,f'),gp$wp՘o@mQL7z1i7&KmKݱ?{KyBi9#ػ/ +mv7o7+VζXX]f?cufls,H :fd}4[(78ÌK3(hh̐LJfCkdxcsHg290A;2GO)(9QH62ؕ=<=\F-,f>Ӏgra k%uɼi>q8o!09woAcbaҾC^VQ4qvSy:WT6/UVw9Զ`6 vn9 /sf'ݮҞϏVx~uIRz v/ׇ6"Cm7/uWx2mmamYў\sv3Qb~r{~Tx⼈i_au']hH3<&OfKhڿin27&(0_q12Ȼ^Rh];]y޿]@]!uZ9uѲ6Ju/3962]^g4r M u0꾹lFc>̵xOfsnCGZǺØqY6\yӘMoQj|N:r`l]sm7l8%{mƤ@9@3 H*ɗ;L)Xry=ᅟ5^ˡgFR|t ɂjx$Vmhw8a8O`-r V;ف ]&j AڸK9\`9GX݁ø9@8G-g Rz99q@SmH2 YHV7ÇΛ2\&(qL|cxtbN/]S;W}+/M%v@ڸm˝Z#3>4ţu]_6Mx2;Z.mK;X@[ᇷ{Xq\]].9I؂Ǥİ5y'HKߒX\!;yFo3ܧ6WSiKͤ#ͮy8R ΆX2/o9`96A6  z:U-!S95.Z܈ʈw);3b,O6m jxF0i8yHlѓ;Ȼ{f^ܡ*_bV!(ң65,Q)9@ZZ&*7H,Í(;ǕQT٦V[vh'">D"5 $Gr7N~u܀V(Uj1m$vڬiۜZA%e%Y0&ŕl[YeBqLg_{lwc^L-E^ 놢N]|;V /q4Ga!XRQ!m$1.ξwqh r\ڰ?(뷙]ClWipK+/kc?JS)Zx]qY<|>o8J] M1rԬ]緙$/“]#/t_?*д?eU;!k,.̻dz"tĨ|܌,k]*K1oހNSZo4+otK)U|Csvk#z,v_ߔCgr,\Es CmH.ۜ缜Zv8`?u..!rpN?VmȂV83ˉ缘^ܘ'ڃWyZ˕E_&x?r},s(~ ,worHxs]D/ c.֗`qY6o~#x ?-|e~[4ηT_w[9/3鴔6us'sϗqn2[>'@:ⱺ>w-}> 0^Bd|mDެ]3<7x$sw6dcڋ۩`wBe7K Ц1cc3%M}װu Vc^ej.[S&{ _t2K&37Kc:%:@^+A]}9۽h1^ΒcN3vk7PhcׯUy 2`%πGJZ˖vBKy]/^=t/HAE|E)-IOA9PޑNzXRqGyS76D`tbh0|pHkGi9i_2=2yݷu^~^QSpuчaXrHPh;O]6D}7\'Cr,| BY#h=u{7ʌwi$?1&Ȝ۲X ag9x%UxA[خZYՕ@s  /dI,#8 !ǔF5D-js,F-,eY ͺ\b=]릑k_%8-DXv\Qr QP fzABIXxY +,d"%mHpոACA6F#: L<{rsֿlb"i{6v `c֍ev>T%֫q0{+leme.ûy'لdKf vªr\(;E`y›+[5fƳQr=V)^٪r%iyM!4YՅ*Bs<]q<!jh9ަxx#Bw=6 uyR$?{^,<;bgLG^ٮUQ9dN]Wt3#r^2oC{ۥp+KȽ^";Pw+{=@_Y& k-P 7pq!.!{x_x[kf~mGj AN}C(#v8(&*H|N휅!pg'p!Z ,jl}i3&'M.,u.[{Mp+k[;K\'ɹ!Z#e"2|gZ£ME~/ccEE|\27ӓ3oXA.:kix( JuPV/[F<0Qo0v[%P 7_Y݂uSVN}C~%Ҵ++;z1ZL/A7_) a#K%(Bx*N+]wϮOz۪UfF s[XKT w-hyqōUSA_ +51Ihm7q '\o\Pv$le7+k4*XA^"4VHZ4lY̚ P~m+8Nm]4 vZ`j DbƳdoH4-fl;*%A35yZhk B1A6aM)D~s|จoh{#u?CnG=4ϲSp+˲ǛZC:d:d]nz]@ohA[TVV#7QѪ# 6ݺlwdkJkT[󺢼*^WiJ,g~n^.oOn]xN7 jC>459{1ӕIt\+?q0<.;" ȳtDـ?>JKfԮFꂭjink4Ku:l &w{0-v1'wGʊ[JJw]i/&w9,v]";cԌ=3ǝ8nepTYS"{;M1|oɩpg )Q궞q!|\>i)+J"3Q0NQׅA0=w ljűgY'i}{6]_ MѨ<`M;\8|M)V"nlSk{@F#2?T_ <`9Ca-+\Gnid;JFv4ϏVx"Qn(zU5mxk/YMF~cGuy36hY|iTA3Ԏ@+G/bmoA, ֖zsGzLk<ÁxRh.=e*CݤWvS:t/`YQBBrj@To uwX},T"uQPgQ59yk; ĵ3RWR~wݡ5~n]X[K`)rR zzqAq>.Y<46</c3 m&R,qmԤ@;‰8R Z{Z;wDΚYjKm/I v/5;5²E>j\Deue'aeVY~Cg&..؊G5OYv~Dl]%Hd)#rZK$ f¨\0Y2Qت4; ,Hj)L.E^V55M ,;>t\> 6+ۡl/XK~QbYok}_֬/

N꽵QXldiY1{b:gsZ0;vIBEg]Ō{\:|NgAD ˨5lo%sX J̵]t\80b Bby"Dj/GkH>{A%sm*b^a3"جzy1KN:mN 3)yi5[H!Mp8ngfaTρݢdi:yHqșSu!ɜy(۬=&%T:Zy@}u_5ZM>u&M;;'Ho񴉟(eб5/[&ΐe3P~ԿZHMwl⚽WMo]" So慽zN@U\@qQS 7Cz7L(1ťz`i_~v.M{z<e06͟:s=rH5\|Z++sBI>q.j*È)@S".EdKpGy"B`aj6o:0>Ϧyq&[ey2vU?AF)Vg$97|jGif%NF~/Y+KX>+Kcjܿ. !PdO:uwO͒8-vlq;01,;[Iy/fzB~RF\_Xyh;dsˬG̜vPx؍xحx4sBkj0wB6kP\yOV/w*4>q ǝ#.x'GgfwDbid26xd3_,c{J{ s`̛Yga.2Jy7 gϳ{5PyZw߫vS~.@QZ7XkZ+ͨy PZC~րu443X-V*()Zk@Hx`; z8ysy}f=9ky avsa2 ޳KvOge:eZGcuj} J z po;mws%^C">/>f ?̾d8i-F;eA[Zk$r%&wkM,F,3u1bs*YYⰨ}λO@8 .8>-R8 8,q5~z_؋MSoB}yX-zutWz5?Bj)gb RT¨dR{yo.uKqV}+Uv V얲<MRZV/KU-*>}}8({/ѽ6qbT8cs8Zho_]ͧceZkPIe0"'#G0Opװ"UZfw,0.:.kj~P֩`Mx#yh;I{ۤ&&9DeOǻYf{JvP-%5o|E:G&@Ǜ&%&H}a._%r~EL] ڽ8}v뷰R#<.pf7[՝D}u78@]ޖ {nU㻬ZweCkpsHؚ+Z#q' TbOb:dЎqv[ox { 3Y8Z$r!:3*$_}j=A[k;9!XDo3* ON!mn%P=|6r?`} v~O5?{ì<=S{nٺig8D;;iKZlEfqx`EwRvf=G$=b|IWX7[{*Ͳ"6;Ep&Q%l{+["σu*oeV+ByuC+ƵCr=pU{Cn7aT/ԨٹSܩɚDBK o9+9."4;kJyWɩ y{9e  6Bܢcn{lvgÂmAbGpmBBL5IM: *[o@=  P[|߹Ħr>g{>."L"hg֤gPuf}Zoo6,F$ HeڽP6kMJl XKĝ[ePl8Wb_h(6;̦gi!*̅B 2!v߭r'|cf{ e\V߂I.`*#81a^Ƶ)o(k+wj_hC/꫕@-@d՗DZz?ZS +wCwU?߃ΚE18+Fole6 y+DpᡂMndK8@$.C1Bk&V@V~(pV c+@jzcF*G.ZK#YID Y~ˮcKrײaLʂ5nW FOqm|e%zͩଢFm "xCb_Բ"կu* m&qe=P׹Gi;Fa[3żVq7a7`:/wo7M6\Ju\ U Wp;vvx6jou$v%e.Z#̱x\ïY~6zU,} K_و ezH$P]( Kdg `ƕA٠5Y%C_ԅM%Kg=ZnQL=^~=d9ySkyޛi_egnw\q=(v;F{ ee_qQzI%@g gVZ7uӞ 7_c 5uSw:qZ7`ؚ-.,[lOvljCAp3ƃֺykZo캋Ymcq~y[k;[kwvA99R(m\\w~vFl}pc!,UkNh\֓qA%~mROy MFli3aPZ;lAe zf*fz !`nn%EwAMr).=69; YͰe,Bg9B"(-?xüO.%F'-Mgg([Y$ۯ0[qv/9b9h\)Ck^3+{8ʚB4);=@d;@=߳p/<AN~/&x0S@%AAPk/"2ʇ?Wu{3ٲ\}qYonT@yV!LH rנ,wnHu\_u(g.EȦ,bJ^p|(~+eZ㜍x b \-FSF8omJo;f "&25_"%:hB.dMVx4 C-O`- |u%nw`}V6q@m =p0kJ1#A;2Qk}*cEF1k{p;.c%}G@5KojNT=548ɫ!)gR~O4׊7XDuܝށ!n4y E+ &r%Eۨvf=xC/Iখ:#m89Y")*9u][{j\bTn}Gn9‘woz'v."b%E z#Fw7:HM⎯D;%fvehͲV_Y߇KJgC佂Dvo7{Yl9;eߡ5z|nhbprhIp8!WL<8^f|*T w`R_%|D|+GbP0*U `gO^Nt'\ D6v`Q[`V3 %LekCA1RQ[}w\g/q\*w%"/Pu oxn w`T_M9#RP/w8.=PT.Y6+V_F_#3[%U̫EZ6an>q8.U:noR@?Õj;a5h 6m`ͬ#`kY\(:o&텎Ԫ+Xu;YQ@?7\5J pgAo&g_."{)"3, N@ D,{_D,<.[rnpOi@]QiT/sFxȔɝIr}x #6g% OBp9ZdMQ\sx_yAp@2"vRaTZԀKJݎ!({YY@B *CP3"5꾿Ͽe_^>Sݟ37sn]3;֌`TyǵGZ1/@p{lJ@f$sw:CΈ &qQngTEv,@όj; ZkCԺ[-w!*ۗj _MMyN^op|]p~SUϰj[BO;EM)8'x7gwLp槈_.yO-zY}|R?VKG#E}{ڤ%4ZրKX 9.#%șvGTf! 6^PC2c2RwwZ;;("(`%idiyv\ kkk/xT58._ܪGwo(n@ܯPsZ5)b@8.%h&_OY^EʊQrvs@_XFn:Ujpvgǀ__Y_Pi 5:.f!"?~?rYltX86;UC5=`kop>?֌`ƃ@kbq\ԯa6m좜?mw0p>YdC#$!ȟ48P}ݶi6guN bfP5v }^k  c)|⸜vʒzd)!(~;lu뀽0 %/~k;v"9j9*_939BUeS{Mvo+N/_Y+ wzu& 2Hؚ{аkdW/zHVș$~B<_}O8My¢Z$F2.^F}j}f9U*yj~wCx"#Lq/ۗbRP~&k[#TM{1U,hwvҳc&rM^xPB^ث~ZIB\2P.pZC/"Vhͩck!a( ~s2!Tԃ"@Y >ڸ֚d:W1U#~6k-P#z<o~ǔyx}(Ԃ~g6(톌nccY}j3eglAkm᫑_ՀP !pCA׆ֈ^E^VR*T3D(EK}-g )&Mlr) zD+H"dhɭZWQtKqByPֲbXRy#6ٺ„@me3>(j=PFy[$eX֩K7ʍj'p'm {A8BkC[Kq/_ZJ"n{W,߽}j:; ˪Ta̓wqgYZC$*"cOn@ByyaԹi9."$7K䌬 [ě|2&l󚡅5lo}i59Xv9w8½lP1`a-Pge"q &=pق/y0 yT-9. 4kN2>.(X`aj{x"U7 Bj3*xșw^ckox\*"Gj'R$n;lrn1{ }L7zn__l?jj7*ܾ{X[Mv9Q__NqU?әq7 Zkz7[`*fj=) Vښ݀&˖X֩;ݍx؍xvÌsFxHp>~{VCN_k pqzZD36'p {XhˆVbA-~ @eA6٣ɑe1&6_~۾g+~ MǛ!n;t۝P_ْՀ[J~r ]Yj "g.[$&YB &M.tF{v%ZdC-ک0V@haV݆ݨ&J@q{jdъC=zhfT˻ _7 /Lրy+?)."lFP X`è=ΐ급l`ہZ4+[TϾNBoO3rc~eZS~Vl¶=tҞZ .G8eeO.p{=T[~KMb @6Q;`Tg :Ԣ4^}%ֲ7u'VmF@ͤikS,  VM X55|e8iʃTL?({#hjq9*h K\o& <|W;EZAY Y1)U["[A)llr;6y֐uaRbK5y 浒5yܯ~t?J?Vn}_אˊ~<(hΆ6U ˸ZƃKۉ.xQlyW(*E8|%fWdİk{~{j&["CYvV{a vd) o>iQ6P,.ߙd~略j\kbZaw [l|}14YIM$Z[ G:rxwRgy蕍_:.1"ne@8(+kԼ77_mrԧfe\a@8."D:| e[Jz{3_D`ծuߜ/)D N5 k{d}SuC~uRْW~=[LJy/w}{|~/ޢ9Ga1OK[| 9dSϜ9Ftφ"pa>̣ Ga1DA7w#tyTåZʖ~f9G^{?N5o:R Wuvbޫq(#ZVp&:;z[sp~keүr=pg9=_wỵG<~2-$yh1gqK}jYdC~6>oTysU=H쟁"pcka}UIe:RL?Û{w,éT7qxYu*[h #5_ZX-qh{g$9sx>?e{]l~8t2[J-{kp=L-ce_C wggoP*F )2R##Ksw { "jV{WK(~R)N|&{j cz݀mjAb-A;Վ>wb Hlww)gpKrxl~9"P @ ev87߸{K|\p ax96).ڤ끏c ymoY&JZJ-+j5T8n,F7 6/qlE6봲K o^КSOuv@./0V¢xX`gV#n}8b}f"408HAG=>*f\Qպ{Pg_r5>:C&qg-D42(>mG*NXV=_}! so={a=2Uy 9cd; eJ87YYZkC!duPJl =Lv&v*H]IG'U;]K}в<ǻ dwJe4`W3DBY(56`kf M:̛8qd:[Թb}uvZ{SNϰ3Bq1YI5@'?5'fDV_R_?9ٽ{'"?Z_퍰~DzޚlHuuvyZk@8 3. q06h6?߯⸐eVS$Zs0jnܪ)&hՓ%V ɀ_n/(q-l|I eC\xW&9Uy 3Nݮ <E6qLj>YjSMvXfh-e>bkux@\ˆRT }Qm>n`լP%Qq1\OF q? oM|W &PԱ5&к~_|g>U'݅|cGLy/> v0|sdynjj=O b DLc V0~ ;B=P!\Sa`w5:xs#0+{ap9YySU sTL bo-V0huΠJ{l\h^a }6}q=M㡬%[;;Zu* k{r+-zb\M^n~lD @= w증J̭vCIx=y_pĢl ek8cM7q8x"izTгp<5rΔnTޛ9K(;Vgg:Dž~(g\$/#lCS{3_w9:$((Em/z9O<"@o#`u֦6|?fJKovRBZ:;uFA emU8ZQ;HuȯqF{멃V&}A)ZCbm]@9`nZ3)*H\ eP;/<`korH_V=<}eC؁&wne2RH0; dswp0v gd`jGn#kC;.Xb-jQfA*%>+kg- Qt}@}[RQlfn@k pʯCJ#{q}5*e|l>Z7}82q\qN+- mgFqq,5xn+}*b[}{O[6Ydl 3p9ds~Ӿq\g | ^c$j1 FT\q#eG+8J~q\@E ݩ8EL\;A y|- =[u(B;tHF 7rǦL8gꄲ=8;=>=:.A\;&KpsFW࿝Q6J{˖q,kK| 3: y8]DA .-QGL9gmOGtt@G kxrGo_3%L@5gE'7b3d )Ŀt\,bD-:ѶJl3w(c[aX~ Po e+TԺz9sR9P+N{D6J/)F e?).%>Rj9MJWn~V^#`S?<=N暜d{1k}Я]V-JyXs=\6n3:j˲LzZ$z>T] + +A] 9l[a6j*IѻIo hN[~5Qb~ EhysYZCb6)`b=/`;bcS&TuuZLTZj+ |)3h ˵y-~u9]ZZ=KaTGC~Nq!.[ ekq/d[GqȺFV ZitsOqat<{P`ps@YC[v-prWq9do~!A?Vk@@[q%渜Ʉ/̲8c>+3od2!URv5T圡&Cov5= ̸}~P+j>ZkZL3[dz0l~V;Pwk }3odp@6Q["K__lMrP974#qeomcZ?P;Z37~s.:̢@6j%8+&/2g{8>_(n.!'?`t5c]XV\Q Ajjqgv7+[ZZ<6Nosُ6χx/@!9K <<]n\C )˽=o-ko:-.шV/e6J( ]gtíFW>!p\`gd c|q%=5YA ?%@V@`lQFt.pvQf0ZbO^ysYowh<VZk0F\ۇ=皇\)Ds' Sk+G~Hy]%:g]66糯T\,1|k}sl26v`~s7<ԛ/~ҪqaWM|}TLw87 SWfƍIwp%"=jŧ)nLj Pw;qЬ5t jY轤ՍZ^87%C|SҨ yy@=~9U?uNk-ـfe_7y VV/MױB!Z. Y?57=;#_]`hoZH5[#'ypo 8s.Λj"1ۍ3gl´TMugYK vbvzk8b0 َʈT9/>|ͱY\R|wcbknr&Pg8s6b*gZO|Z̪4.'<2g8nȧݙ$S[R`#&q13Bœ5͛|Ί^&s<nI'qzx(ӼgntX<ƴ6:šK |4E7SsV+VYz/S8#4@hVqd\y{-p5A='h4|ԙ) D([YG+ݨGA\\s&(."v(n#v $ 6EPu*}|&~e!lƯYc. >H:.GLWuj⍨q뢵N!Djzp;3dٴT7̱ըjsl2~HywxFtlGAs\Be Qal@;5Cl#]dK{g]X>ێi~6CPbTZp!_.]K:Тvl9Z=X<`%+8Cf e˂W&kU6ZK P#q us}Yқ6Ys7:ncIz80< R_zCV2d Ÿq%"pQRj9]8}PA61RA` o Pbk e_~pzS7w} R~),B`/؛D!uyH3]~?qs&Ktn%VMj=0f,qs?ɩ{N~koI;@Q&"~_daxqJLjmSj\̫$-_al9bZDxexxi,A٩A`j]7<}B Bh}1$Er|}{|_N_$7vaڭ7nF][ʹ@M%3f7C.wݒ$^wlA &m2R [$ kJpO{Ln _yI5Kb$X:{}Wn_{Zu&/"NFb"J#(@q_|tm C\F CmFGw{[ݰc~؎9RPB~q hѿ)Yz6492 $\T] a7UݴAnH5\ÛE0#W0W|t#[Hڍ#[2ߙwK27OnN0}znۄ&/Jqy9Z5x7f[8o̒c^Et1*c=֡`9f|{ BǘUKGYe6" ːɬ{vKI[@7u/h[?D5]y^]6wCք^p;A:Ovqٟ?]l>2%{qխ'+n_x߾{iݴ7dڍj\2{˵r"s0ˀ-%ݫᖗ|g=j26",^ÝqXxS@*&f|7Aw} NZ G 0iadhi = d;./=̻ϗRnj70](Y +4ߗ|-(.C` D+g0<;@^{/dr rK5wMV4OhӬ~0NL#qT=(.Gi(<-tڊ;98[/Wn^ eM^P[IVVWw%,OPw72,͸ ;X}3y7x3wfц/aY{l-28q6gh4!-ɵ@7jn=+ncGd 络㰳2E.[w{)pzsw@6f -պ#3 ~Uv6VײNS=|仿Cg4!&>4"4*chCq<*quZ/ɵ-m Z~b̂z<}#HX"L0{lf_}t-e[*l6Y_[Q8c2\DHcЫgyfK׽h3z܊[b"F[3CPpy/}M:ލ#q![>w}s[`C2}~Jlm#j :`U~TO6$=4]YҜ7ϜVEgഖ2SJ6Nh3fp⩞DPNC@Cpؽ vdE4j1*,c\Z~;G?T:_y*KjN^Ӹ`YqQBqd CZy|V8X2#WT 7}Qts+Ǝ|SV(  7D@_nTeSyLE\^~qQ^7;xjts<-!T~D%}4BnOs;pݺe<(ie{$qmY7:P)Bic uT .̂aKV{+B"*mQm MG^>^'lpͳ0GiZ-N^T[Q_~]P4k4ˌS8,p2#Or+. =:;>n\qɼ-*6Ŧ27uּ&  0@~21*_o"Xg϶a͐mʂx["nX㐕wkXΠ_gElSxzo͐n~;|,<7r֚2p1g=`J^B>*"ϸtDC2p\x Q\|;b3&uS+BjH[%.>>9L Ak-pGqA-k k5ƭrCyzኾ|'~o k5lS2R[ jv CPn^6+B^P6SnfjӾIMG5!F\.YsL`uvcoo7q\xn٢١/,vSgU롗dY-V3Z7unimaMp뚝ں!%;?sV_v6!tn\ 1;ܒi| pk6Z= fIߕ eeWÝ>~밞uB:ϟBoq\D8 j݀p{LfB~s%ZB8k4l61p=wh-hAPdܒ"BQ95jfu˶CHmun 1nFd:A}k Wj}t\aVmVa09_Pp*i\} MZ$aݽ-ּ[~Zzkm:⊵%Ggf+[&ξi#~!؎㕭g^? VTiKdY4{A&=?pӪ\,iMieZ" 4cu ̌/xor\hjxX]sx(3 E@eW*XiipF.s]+ʗu'~O.;y]̟B?Ǹ=nc,a6᱘Gr6%.AGO[dc egmB|x|9 [[B{|,J2[1ysy]ٜZ8wso0t~ ueaXGp]Ad^j:ºKwI!y|Ef^7[]. bk6[5P?d"k+g#?el9DeqȄ5Â؉u`?VT.qҕ2e ܸb&\oeӄKQu3֝r\ qcdϫ≯H(>h"aO 8.N0]ݹ瓨Eo~ۃH6G؀/|ў|ӛ%f>K:K,]-deXљЋ@`Fr٥e}d=J4+ejh]Ven+nөn5[]Жou}nxӡYvD wSs]}>g}.ۑcxP{kΗh{-nޖIgN ^txl8Ό/\l͚ xec(i c󦱇Յ )!{/a|qo#8OlO$.՝D #;}N'( k߽.vz.قV6겵7ɡה}hMCLK/œ˝IrkqYT\U͹6' M+Fcyɵ/}[>tQ[yDj,r2W,1ŜC@X+"n znOlKl?RZX}E̯d?rN|hd.<H+ tQxqv:i˝%Ge9bKxh;.G[Iv,u)3uN-EG׾zTfwù4M3F;|Нv${:42m^aQ{ƭ㔈V,r$"Je>ȗ`v.+nx e?ZlA-V~QQswjo),:ɰ.i5WLDqa7˦%qרM @o)[^CGJ7=/=_ Xr*G+%ezEl.OԻ/Bo%eTqo!WFln'CȀq9Kx˗?q6y|ه@qS*RQ &C qkNbHMTrK.uS7c#_#xEypaN= fF~Ԣr0=v:B6ws\@Byne*[Ϫyj>qX~6@mvWm3R7a/Qe:.GhhEKRf#XQ"~ gflxƣf*ľG, j/Kc0DO?1u =v+j?1cƨe #>sb FFU"c"|cV 5qrS/d%72[(ZQZ@Y"$#B|:8+0Ä3S2gxA|Gu6طxX40YiMݭh4,# x^$,ZB+++ۺ'6;s519_H& N\ NXZ@L@2q OCgX?9aٿ=u:9&UHųPgjH;VoA߇fw*};>\|ʛʆw } Luʣʌ/ë~2|fYomPV|^!›pzfs`? KA.iOd-& Os|;Y9 4#oNBhz6֥gXVe5RhU:ZFxG1Tiw1n+h$X?:9ùN;g7?wv9_׷e */wj9v;oE <ʢopqy)rvӟeҽ eiԅ{TVmZœ}Q}5?uSw^_ww-o D@f.nh:Zqᮓ tp.29\F<<^x0.$ mkԶx A+dr>z]zf4| X/[;4WqI [v¾~]d*O©u*G(wnc;G~D~9)?C JoI?c|j]{F#}-cV.y9zKUݓΣ!ymUCx:I8vNl;ܞ@s)i̗χFˮ{=g}u7׵wSvS_&瓔LFo~vۍ,;}F!jx81p2)߹Tu5a5k9)]iyd1exPWsWDch6dmS ZWd=傺V]7ƣ2QN[0nij x)+PNyXbY]fb^27ky'u`vcui7-1-6t#`S}=(H02!y4;1Fy &POʋ-1X]!%X$]pls>)[dq@fn.dXڻ*9Nwddx|(_#<Pf2Iˆn@3@Y63b#u6##xt&9gnتnhP>lu*`-MMУ g쒭4C'#s Zj]]f5}ϟV}$w,O}~>—e8&F}- i#Mc^`uT|ć,X^k3N~$kZJׇ$n,m:7w?NxMn%x^| @ rWw[<ђǂ>Ue.gu[ywݙ @׭2A]$'T'M럻g]vdϺ䉦x޽}?Za[\"ܽ试ho>Z;І5 2|V2yaXOŠEw[C&Hwߢ oluխüLi-q( Vr8ty NÈ C88*ǂ1sݘ7K 7&>qK[Yl5{&"i$Ϧ8=pX@],1Aq;9”sh;+]T d u+<4Vxx߾{9u;:AK BLM@]!pm$ӄ2 =CI7;ej%mmƒu Ҿv#ͯead+/TR")|  P_Wm4I@3/=dq1} p>7Kj"36#_d^FOw=}Ȱ6xtGEo>/SW0UB .ɣJ62!SL[EZL2,pѾnu}zSm??%۩럓)ϹoWݨ6EsnN]@KM@>%kqk͟M8B\vQsnhBnL2tY#6έnĭ!FnW8#nWKܾtOgj]Y13,e<(k/siZ~bJԿŒ _|CeʔvzyfUieR{OeyfJy{|0ڳȬ_[hof\0#ԿjQl.;Dtٯ?pwXqE)MO!l ӧ:5{OefbG2<ÓZw $Gwђ/Ż{ohAػom(-uoPV/QF*pzݲ+qL.YVVoDi: 匇8}, gTL,Yͼ,BfrLdawӊ@ yx9txNԕ̑5#D?y]U [07=BěGGgS{06r}Y>Z7Qzves`L@a4QGԿ/% EMn C'S_P6w%t$ NC~Nos\@x~SR'i&oR*)\1mea3n߷ie:n|=Bĭ-`u4lt)ݑyVK#&^vi5Y0㾵_Dž[v->$d^y7nFM.>$ew?޷~}ȹq;pFy eeoc[k=uGeจ]- b+ km#3uU'8+VgX|ǂr{X 笂st/<wKHмC[.qLJD%o2̸L m++2X{K}e2f}k9u`Jr,/hq|lylXKEtZN. xݢuOW˥"Df>xT,*s%W~SI,XioMxFF=GU߸ަ8)N۝İ=r 4&<mYw'268ȼK GƆ^. vaoio (X\7) ~!N]V˪[]扖Vu7]8_610j6Q`Q~{zU>Y'Ωj1_̙hZw~\TxO]Ɨ]cJֳ^& yԅ'c[qо711 ZS_V]^׭C}\\qZ8ԍyO9qVNz<խ9^Q$,&sw4N9(]?>!|;2?`d?q_nd@v)^s[v~/uҕ>8eQ݊ۥs3;Ns=fVMY񐰟3B^wI]eŗI3_úeqv\c懪盪曨oH7FǞib-[+I]޾c`a/ =GK@WMMWMo~a-# =?9 FL|E;۩Nﭧ>Ϫ^<ɂ3pY6HlWg^9j7p|/ʤP.pS$1=Xe'5z9]WEmPܯ}&gY[>,ya^(dovPf6:7_E[FgYy]izհy~odTO?u-oC3UɶOznY߾O1;n'p;'yaA2ihtsQF.ElƵ2|"c[v`7Jr:arlXckֹZ7VZJo Nd65_p`sύDNF:済 RzR#Gx<5?d Zh!"E1XLP7X"f܊q)`ߒ2t\^عuT @!E?6`Z q9¨Źh ouxq\o^d06$;51r5Jqg^Sdj3[ Z{fXֹ 1գ=ςKc* 纡"^sq}QxoA/Y1t},Q+p$έմpA-wvh`Toj7+ZZj,3MWo$j f\xUGjf7?Ӿ[ Q[˴,k W eB=E*!͐+w\g de^ aCyE4{qK.x٣mj mֵۢJ%e}۠ݚzdQS'A:.zj Eo!sϭsɈ_ava)h1ja{1Qx ש H&N}⎮"7%gTV[q6tZ˩2R"Pmq[: ͩ:kZ^'۬պb!CVd82䡬ˠ|.G= ᄲq*`焝. \s/OJ >5n.긛UܑqepK;58콁^8DqOxഷ N\?|1d( oyFepa af'­ Kf^8'fRKLMPv3B*)*k N=/Ĩ3nW6|IYKR{ܙ%B 2|"eOjI% C? &f;@ّ* WL7I3J/u:|㯶XSdn~S6F_pyTC|PR jQ&~v7yAc蛭b;Z?4lθ-1R: zaIDh퀲=@C:ym?l+&/oMnL7Ƀxa~ 9SuBhysmsV/?ˏWB<+n/ T:u wp3p./p 7nf y3Re!o q+ oq-@l5M tԲj S[L6gZe-гw;7ĸ ,Y A&y 5n+9nCN". e0nl&6DQUzˑ:n%/ nmh!1//Qi, 2teYcY%$„{$}2>"m6s#B6nd*!&YjI֔VV8Ҳܣ\0 ȶFc7IBlǭ-u;t< R?p;jC϶-l?zr+A`<2LYbokź_Aj/÷͸ _}}5.>۾oN^Dz>| NB;VuOUd Ng%iNk䭒zmoL{ huk7Cv yǦ&r"MJ>ijgm~pz3FnR?M-X!7m%\-Ҳݟ,*gnkf_y*{ճ3DniGxr>?~'?#e{np2vrk!լ܆np-p̀M;Q7F{x~;oܡՍ7g 'b&fnzXk +КZ m c 7a(4%{F}=1! VqgZ|VWA\-Q| k/r\)lBoY-ݗwUsSɴo˭6&}C/oz_dz V~ߕ9 yCzV9q۠gk$<>p5~c;؏=ԯj;^{½y5I>ߐ [}+2q#ѳ["hM۵_ }HZp :-΄i}* R07Y Q/Ւ5d(CWn)S:ra֠-VR镩4jݭDKܒ<=tNq6P3^3q(g7?m̿)xYq~T_hڍK=`3?^m q>s{Xx-q>E, _ PeӺĨ0I }NNo?])B1 }%ƃ&%|gЭH3 s ?3 ԯ5y;(HpI?Ϣc ycv?'~IXy9)2껾Vq߁ }gQ YP[lлûǐ[]ɛ Z㲨hJzSy-bPV׍Z9!/pwCȣo\^.rsyQc'ہ#KKF@[HqBqU2akV)tyy4t<dֲn*#n0Z,9g\x.HwM&\ƣu쌰Lν }I5yTmM6-wNjjkd</;^V2%9Ó6.ޓZ߫?FЗ.?ԜJYld~?/T߬z*kKw ?ZAǹs|=y X*rE&UOJZF-V_ƲN|*=uBXV޷9oG}gn(FF ~ۨ#-Ӊdݚԃb23^f@;rZ9,.ΜA6EA}U{hWc^{7zr߮LY;k*ިٻW6m:X +쫅>чԸnB[a=4;FR7NxP~B)'@u9 bioO.=_NmbuZkC dDN8 C3 pgLgڄӷSbZmy6QNVkl_ <lF"섻 "qbyy ɤqy~m6&GhPuT1F^YA2.߮|N5Y۬6oͻ?'LC 7Ä++p!'$բM奄߿LDT)f j#xDҠez0j@mgb[ɣ8G\#(>ɓVr/гxZ{VT<>ZY!7W[PKb ͘nF3pBf 7GO }xTb͢E -_? >:U/Ǩb1腰v5*2s }Nmu7;_F^akZ*UFd௻n064#@ݽl_ #B˺??O_D}km v5-sK[xNFWԯXY]ylGw&\qY4yf;s[r>>[[[>rr&C>ج}:7=^S׿? %1,\^玟#՛۾}3oܻAn?Z%Bss&yR7[SYP65խoq]UзB_7yݤu}Quu*'xsc1=P1=:[5ūN*YM67axo'ƅCCN6pY#kimHL./-v}yb' C9G8֝mX$1e2>Ov޻qƣ궪m~c:[~bTpw6aԬb; ~2N]=?L@K^Y7Y5jz*MV?ߢ\*`;H\gv(Z|6೰ JjgQRNmBpgn!hv1kgfjv )jFbv[ $- pq@^禶INQVk@8ASByeDVT+Cݼ ۽|xTG(`"0k|wpY{SyoCO7nw0!X2͓`u(k'B\l>$~Ԁ ~iɂ_{V- EߗK8.'IŽX=S{%X© yC|nͬ_ߋ:aG=9Q3p4-G8]yO|qpͩ!sܖ4F_ E#~CըQ!U \( TE*\u[ajE4<4 ;Vͳ6--v]2i!R*u5gw.UJG HN]mBӲJbb:le|^ĉu<* dt<ђ8MΓ KYתN><ܞXO+m~~F"^ ηW}JhKc%Zt+39\7;us'vH7jZV?Q_* +nӢ~~4Z]yf4UUs.1ڪeYԝlU/Q\Vhɦ ;]Fh\t0=د/6[-~)kWk ]^9h>:y{=̊^*gfj@uM2ĸpVO_p !u -uѓQe&82YizW!_Y:_θ\1=qڂ{lĩ.A։<>Pܮwg]c}}ǝ(9]5{[{ :~: xkoOFM^%GSOunE*mKI}O$̧Z44~x2D4<qɪr rrA2qS5i^f-d}>J8pΜL4culY6;'[vğ<V"-q{jUG_,Y:nj4P%X;ye<{yFh멆[!WEzdp,Fl X|?\f}:x:FFeg^RaZmzkFgWHu\p eNMGj Frb"5k8l!0f f 8װ6@ enunuYJ-zwD|U~ Tۼ༨c~ozŝ2PQZ7UJq̓tH*ƕR#f'^ª Ξú[Q^ WZˀ^ոQN*F}kZpn|}e`߯Uj[%Vf.`_U5g\-;[V?z!ﱰýnКɹ߂lmW?mFv\Mz-dvigP74Fy4QT*C DK0^-/nTv3j}p`˓1o1KK]xQj{3o~t.l>ӊNXzZhbf<(:ʧ5(/;< \w3m,h{9[Au]Z"-U[iuex^WTfFgrF𘾨[eA4Km tw{cu{\Ѥeҗ6rh G ڭy )VNy[y\{CZ`^"@Jn=dTC ;MIzםm* U4t~W;O_OxcDOxM۴M}?S1[1r PWy%EoUrZj#9O=]褠@בprK5eitj#ҵęau{;+X+=j/yU=:^{K^a4;v(}ɦ9|'YmȦ=7f1ecuYNza<Xڠ\)?4hmy֔Nx+%ҳnm㺄x~Y&:启媗J1ݨ,G隣,/xc7؍+ Цch8L9%}TE|&pڇuYh X:+D3/TZR̼623_ކW̗dGm\m5=u|&M'⎓$eW3}#+x}H_7|)p @׍-A#Ho+7js--nsZ[y]CF~m+r<KFc]vA]2SFqv^QM4#@Ko46f9وF+:љa]̲0l rVuڠ;cyd;߶ѱ:6lx^Ǣn#-fnt֗ mnǍUL্R Mqؚ$MB ZnZ:P|=5a]ixr~me d>R_)/˧D*31|ȲSf SqU"!/=@>V#sjUsjѪ~&Y g'N7ki?nNcWY[Β5&uy9czKe27ݦ̺X]jo3X; V.fn=Y|9Q!v.0=᷁,c5n"ߥm9k|. 6iuǦ'NGe(ؼ+kkK3 lS-uh? k$`Ӓ0tipNE!ٺAvJ)Q}s65̶si$iŞ63\·mx;cW[p$P2 q~r7>eQ3X2u/Xֹ-xnqg8.Z*v5VbFy,# 7?JjAL ?Hqg쁽^oe ,9bf&־ZE $&2kJG=r3\7pO|/g7sݽ v@7O\րoYցXz ϭ j~dxCV)]跖c?_7 ׌[@,n&==*q|MhӬ΍-T2G8iٸ_p Z-m(I}}O}maJz2 77ܣus;pCz#8=n,<@hP=z}l3n^CFXkYaſkV{X}K~jewYNe%dޙPnN%ꆸQHf/i-6C9W6*Gءl1-zVn!Ƴ|eBYd=s<'r O DžwxlrpV x[gF=kBi~"g*2u#{p}zj]zۦam5Þݾ a͸\"ֽv`e]ކeAcn@&x#--b9~}An5#Z fh-~vبnߋjzvò [Ƚ?E?md7?HgF_P6i(kV֩˛(#pݶuFF +3n: zVwgQ_/+.o {}i~o-T_8Bnssyq hbT dpKB@(2pGlZ(<߃n0DpXdm a˭EB;;tc}1`12,Ff|KY<֩n1и,|r!Wf ʶ쌋_^ +aTf^V x,p+?d([B5f;+MBnNԁxHnwelϚջs~#x?30s <37nݿSjQ+5[6T"n:&=S܅qOq[f}}܆]GdKʢ;oga0ydMm;-EB:Z*$@A>#os$,j1.޷ԧQ R=[V@J8\e/="tBKQ588bd"_ʮuZz d:$hȣ_:Ċ TVGe[!w <^'5_b#c[WV#T6AZڜ5EyWrdHިǒfO_[E_;Z7jmέ#E(ޚA>njz_ujzY~+V}H:ͩ+QWSK/r6q0ۦA:/b-}ce'*TsYB?/'fZxO2C߇_>m? ![s~ks)PgET6Bh@+}P3ؐ9 95Uo=~o~mVZLF /ss5HոR&9}3+H{Xm/5Μ=F>blB= uVӫFh nXtu[ 4kmO:8[I%_oޮ+}~S_ڍs]yѿd^Ͱ_x?^~ 7긍^~ȩ#hΞZEס~ˠ^|>׹<ȫ=pD8w_[kL;iYD7;S"ujmqkDZ{/FҁM^gSJ^mru{Z$_?^^NJvٓ{fS N' Bj9g`g.3m;ڪw:xT՜i[Oƅ%[&K5zauLDvQŬgZOICwf}VOvO<ЫPL%\Rnz\h\uKsAֺ=6G9_':b+at}j3ݮ;q{kVvXǰx8߷nw!y1\x-  !cw015 ,e[(xWD6V0g:ex=FmS[Nڼ93FX:x>(lt|kypkR'΢$Q:~F;p*Y2iFoEumF@ eQ7vԫX__4nq CZgU8ksPInL<0y@65S{xqa g1zSKWߧ@ aq9ymл$81A^~kҧ̴쥐r7+7p8Z:,PQs^Wu^+OW o<\_lB*cbs}րPZ#8eDX_݋GXⒼ{owT꭭Tv$]oyE?}qxef$%8s*{9zӧ)n@8^pwȁr,aQt˾ӑFf~a93.zz&гeU s4xV#-:&qu흤c/ί;t;S6.tFR\!BT.z:6R{T˟I:$_'֐֦`ϨIxЭQF 4dHtIu 6y}K9(ʾ{& Af{8ѕcߟx&si}RdH9AIPmE|&ƼlgIfiMJ]g7itF+y|jgT<牳\ǥ ?x٪Yf2x@ߌ0yHz=:#L#0@Й/EqIpj\BZ8*%GE'4g=}'̝us΢c|A,l?Q}_ôZnUEfF鬤wcbMǘ67u.gb#̳:;3Pp!Xm >{'df29h߃l٦s?eiÃΘ \0:s=*ʮDEA:ƃ(7Gn+𬯃ݩT:B#jsF5/kNؾ5d<@:ѾF}_,l9+go;?^V[[N2;EXN_so e{ՓkYߞ?j>Ѿ?^vo_ oԍp7رVX* ξԿeO9O _n- $s{R׸="pYVW+bu]h@+=w8IKuJh_pb~GI7|{(Z1 Ξ¾?^k䗨+{{qam%P w%fΆ^3ONDh\N^)RK$!.g\}MgaZ.sb;,nBc3 7ґ>9Iqҝڤ!`7^;2&Ʊ6!)>@sGuӷ0H1+PwBS6}HuNsj/f2%JI ^lkYorMHeV}a;y]}'^.zȓ o[Hrk(;Gd,Z8-wg->mtS;vr }Ϲoڛse{W)> -mNihx{3Bxk9<29w(n55=="rN\(Zϴˍ9"۴ ҡ5?SG\|sV[|-V᷋#r4jٺIhLݩO-/'w9yGQy:XZ #`߭U9hwc?Id"8]ó|yo|6*pɢ;!\FC0kNzY_o;DsZ-;AcFq$~BdܡLZ7ϯX5 s\ED )֦C/ˈg;9BuMN/K)rIβOR1<#I+Wt/=8#(0'WSkøЙ&Iǘ9rk>0)mXIU"O[L둥qA˶r+ov 9XkY,GNl40<}.<$4yfd/dd5ɱ?(|.q av3B \meHZX[( F:gNV}Sn=߇JAz+yWqzy/8!צI%:&5ĺ$879GY-笘WOzCWa/EHows t=a;ǐԐ9hmjCjIjkqѭ@2' ȗH m*[|^_&K<֊`bV=[YU`l}1*ZLTGI #VqØTM ř 7sI2GQkgGR,J=J}wmnd%Sw.I⟲'; 筝q~9¼W4ղyu!kQ~)__H'*p5g3[wٹg,QU +w9Oż,3k,zƝ!=d13O+ [Ok$$"OܩM ׳jߢ<$QrxP ~^Pvy6^<'}vF|9oz r54*y U,~Ob x۵7s'qfVk5,~|qZ2V69n~GF7Ԉk6C٩@/YTnSݩV1P],[uk(ohqAVrdZ7=.,lǾ?^ ^vp+Q[#o#ΪV!IN9D,a5Z_.W 3'ӾS\F-NዛN~ ;I I8|'aR}gZ}ruDϵLxиy2Atk3>*G bq],7ʍF K44k@Ⱦ24DYr:=䚟m,t + zs Tg;|w\᛺Tj=-$Yu@MRKm26U/4.1Oe=?}-R?/o3'#Q4W7G瘿02otpq+qs6jm3WܾԸ}@؝zܷ(YCQ Y| e]FTn Ң̃^lt S)_þ?ǽ+a:8qݫRz5f_z!~Bxqv!c½PW#sQT•Vg{/=SDk|-BR/z2+SsF7!Ae!&Z#~ !ZlW!jljm)#ZOS/"]hw{S.[ݽ kT9sEYCR6F<יRI7>zxn=e_5Y,:_* lz8u/?oTo,;SkL%\^oIyx{ǻV^ K/,o]Ͻ8 3KNN3z[^NngZFFJul 8s>b@/rvA+ou1Ou<4wɟ\g&g> ?Ij4_Bkgwɺ~Fj3$R if)VOy O谢J)dEE[݅fn9DMď K}Ӿ|+Eoښdq?V_LJBfuTτ_D L\P ߌzc1zUֽ߫E8砝2TDWZЪ^gPg@e[U+WŬh5ڕ K/T^8ݓs9GEB`Wo}6rzQW#^\\{Ҹ>`"ݷы\r2y|5~O(iFMċ-;9J|pH N@n]Q6IKR!C/ 6:us*yUG~oCvc5;Zɛl}D%\ٷEߩ_Llc= ̊]Lʗer3!`חigkAmڡieNb0XݗeU)ZxY!?;FuMG^۠vKcZw|n>wnHoC/m_qhUTHᡮoL7uȪH}: bf qwID Hrtk.1, NcF}&p Oe=lo<@#S!hdԮk†>\.]R&Fyv#){N^\dc%\snyALSq>'r?GߓL~GkQN%VˈG5XEdymj4mjmYinm?a)e+v4(9_Nqɪos͏EG}?^ +@ T3L_N68{qSna[Ź;-P~ Pk+k%N:>zswʂGWΈL}{W<\Xo<$}+y$u*PFAlqAq&HF8C9&4 /R.!ª,,5(EvS3m7dܕ+rx:g e'F&Lڌy9ȵurֵyDv{JmZze87bKf9n-sM7f-5mQ7xw˒ayyи|R{k:C5ο"mʠ527ixs5&Svóѻ=Ӓoto5~ }Ϟ<!G ^mH;j;oPx\~(*x,5x}"b6Y6(!FxR_Bazl zymuum!{Ye ܍^uʢ*_|_8ET_}kn}J>dF>B{f]h90gA[ 7u'+R7uQRLKY8}Pѹ;&l{nB⎞;n?bi^ C5rzދBjGHwڪXWtg-3mkl)F\,3H=譼kS-a;J\f(~QYvB n0 ; o'$L77%ډJ7!9(4n.9O׮{c9h%mVa$u*-IN ͙>KÑaސ[e5[ ۈZ |5w}I[dglR[_>Ԝ?zyV$_\mACng+)Cmg!I:ԢJ+#mO-͖k?]|wg6~ T)b{xи,*qNq^DZqk啗9oLyI^-߃hGvpֱ íWі yA$7pmUbܯdkkW >~;iB9Ncثؠ ƻ2OAsV#f[eK1}V=E$ڎ/~O#-)-.ȿYM nmG.}1QG~&~!ҺCmy6F ;$6f}Oۭ ~2 ^lv+f?W{xku3v@s\5DO֭Bo˄G:~do]RTLA嗽ԸƯ7eWRIi)8^ @'88OU3~R|߽$@kվ6ȹdA4 P,>]G}Y/ҴEリ> }˸U'٘lR4/VfM73 [?Y^fa3?C/p\ʉ}]Y#EMʫfkvkm!71։LZ8VoԚ`w0<▬e T ?٘}GOSY o7g\Wϧ~5 }"vlce}18ն~g9`lsף٤cjj?WF>AZ[t{ȩw .a^}M4 dUSBũO-/ 16B@k +e^}MvtYACTj{均>w4n@^,ԋe1䣐1fu~|`߯Yfs96{޿jQj}q-,yN2-@̬63wd_TGjWm% [,IjmrYqZ~x*6YSK nԷlN79ݕb>Rvo|çjpo:Q v$Iw\$;7y.37VQǤoޕ.7|7xxC%9T/K|_Kf#‼!9pӮkRn i20nǽ+}yX4݉E7qFpF3eUwFwrP=&U6DexV xVp!o2(tOxBx/k~KuKW |dk4|$qi{{V[;u%TR6*y[ar8u'(x!CpsaDh?nF0 T}-?x 2 \~I&C_lTa:35zmQp `9.#l4aYTjN9nmonVluYˑ YkEE}֗Zll^fb|\bS.\Bѳ!*aL_)E?3'{}L߁3.pH>xyL&L_|q.OkAk1ɇZyLhuֽlpu#]v?Wz/? ~XoOkb'4Jme?˲BؿXɿt̻?)>0d>|U'@'.O)?&̣f+gr {-;Q/ueO~>ޚAnܛVD3UpW9:Y{2򿿏 ?|鬐Z&6JYU酲{l,{0t@e8tb|P7\ 1Q'C/eKf|~Gtfc%4g1[s~ OHQ́)υaVxܢtGq؃`^ V?P2 GM%Nё,+yL'cZ|EtAUD ˈ=Ļdj$x(>2'5}*lULDg yO7/͍lm2i}׷)O4n"?L'lM0 ?w-Lnؒ%\ǝoX҉}vnq2GP8dɧ]xɦ0/4j1'7ϻq-kB=zRo࿂jȹO< l0{(z pk乗:e2&y};P6X}>r?QDQ^7^A#YBy` ;>_2jۓ|d=x|ة?>>:1?^.I8kR675+C+.3~6BϊMUVK߱Ԯͷzcy{=qZl] ? k+F}7dvݎsMN&Z|}}P[|wc|mt&k뷆t/~L?Q='^$j7ݴOK2$—K҄R63d»k6X/#p 8v%BlߏLʽ(?NjWs[ e >"6yckg^mmkd`&*ķJX+Yvu^Ȳ!xVY%B ,ZI:틫GĆ%.#l~ ƽz.5jNT؎AW]sG1ϩOmvDwdPv#ͩn oh5˯@r޷9Ff^f5JGJ=S~㶒.kT8O,Z TKxbjr-~_)⾷_k <_m}c{~zAovz!_d:ݕ٩o8ijʧ+NYi-ɱ!1==)<9ȓ- S4&C&,fL9 >a{u{?5t{_8n5^ϝTRs}Wz 8 TNWO)-N{oї)tڛ8| ?Nώ;=~)§WO&Or{wڜ? ?[&'K俸g:ڥ v~^ŷꌓy0!p|rL_; gzfd8DTlF+ʘ'p9HQH5S2Hf/Crj\F@t,N񭏒2,潨Yum tз^r QĈ.09c⿃NgISˬՉ \مonb׸kg "Xe\ӯoPk[[8jDmۨepЍFܝ;oH87.s\#+Z pJoYwe-K;Zzx̃e-g$ۀ}QlueNȾf #d'eF؜ډ^u_5oa>+~!xm5ZǯwbjeV4G]q}}kv.I6L|iQWiܳS|G73gŅܘ7Y #9 :EfX!'j}R Nȡ8LCS~O$s[U?r2;Ƿ`[R gtʨtOqeBd3*:ە%tpb9Ě<LAnIp*1d[ѹ(c6G̅[zr"hz*,)mYSO,A>HIdioV219&黥> /&kj˩r{(*ܞ; ]p=O|bq\e=H"ڧ4\qӋz{/<^٨o_j'c+=+N]wJe?_i/cgp5B؋oV b$=YϪɯnLKGxdAtwՓkr5.kj>ѱ" H%+z}/\!Oqi7rо|v.7:Qj&=XEo+~=B/Sk e WZ7e%uͬ3gJsp@:ϗ/Loɝޅ P6P_Qq{=}E-{+T}^~T9^^G1H~?2ˉY2_HiOog8[(d [B' _ޱ\Ya0PQJ_{'ޥgN~Nꄿ%z+gG%+;_ig>eޟ?_IΏqƁAU[ov=w">uPA/vo^*kUQ~tOp:=|#;?킟Ft_D:yB2Cu"7֑ϭRb6)ϷZXN( }-g~:{&Cyy ?!O2~2sr;]o@Y>'L?^\+~#?'uA*~2O3_؃U}:脟''og*+'g?p"7YV]מ۵?ޙ:k 8 , TOhC?rtZy8u;~ܟ֋'Pw}Dޚ{|c?sH''|8+W~8Cn틳xoc/v./}q3}8dt ?!ϓ˻{He9|_?YCx%q,nx?Q'x#cf8!q$ޘ8$S\ g&p!pz;o尕_gr8!_pcU}~~'r_W*2/2͡\d||#.>jvU#Fb23d#-YT*gUd.oI\#834gZL ea?^e!DYθ_enw0<{|NoHD]f?zU9yƫΎR>f<ȬW/z9և۴M2By:3ǁ[INjwWO^}BlѺ%>ypJ{ Cy}!@_]fQ8o| ~O|"/oo_N7v͎7ʛ}T61[e1PZ|6λc Ηc}QWopI `e/}:g8ߎ(~2l;byKei.GHvCa<t,-?0cw~ջmg{cIMp;vxϷ |򸧠~ͪNq}Ҹfy":7oa eyba}{kġ+CGKy2'^d내+ 7Gw%/k*+[U$CG^PCTnexPgg=o~?'v;o|*ezyWvޫg΋W@3`${k3}<4 p>z: nYkl!_We8!އfna:%s?߳{aoqݙ~3}U|p< qdUA_GY~fĹi*ˇw 1qwGq9fik|PuwHo{^~%'#)  c'EFpw-.e.53ñ|62{"B88_[pHn|2 7ǵW<39qm8dOqKa:˭&v yeďb~2n,O ts>|^1W h? Nys~rgȯ'3S^tE1R~B?GwoYL؏yʟ^?v}?'ue=&>矋GgSdDSσW(O>U}||S^-rΔ1yVC-rg!8?' 0UŸ6~t"30 "y>֋EHq*H脟_Lj_}?o~gJLx~oϓBV~_qFq}Q- J^ɢ=W,.oU- Et,ۚvƷxw/0eh3erzF]?˳.%]aW]^uE:VmOXUNN|&[o) EWnX|JXBK5i/{#3Ni{L_ʲkNKA'6(y|ڛ_~<5;r ?[C$݄ O>7w1|Jnҭ|Mg< _?y믲n)QٸH+vde~]eI׬~'_#|8:%eB~m)4:Ȳ49ipo8V$OpMoOc;Q7Nh֗,5;]ӇuM7d ƙ䰂.u6d=[7uhyYC NːճfYQ,?nE,h:|:_Ao|pNxƑ<=v3@, "j(dAdrβ#B훲}k&S'Y[a_siat^[`Qsc& gA$LiS~2>L/J|WpH~zhYAa tpvW~^"S>PN]Y~l|۞E`|P8;;>, o'O?\>{ v}}<@p֣2лCuӯ,wKϭK#OթrsljˀӀs}.LG|tGCڭgEO5yN"9Je~c<ׁNrk?sϥ +7m% '-_~s=g:9<3 >Oq3Td TKw WP/_ꤗʯ!DO/,.Zx}<ޟ k8N_K7^Iq?Yy_)0IكNxUS`r%?oR}!y;' 'ȇ? ;lҢ 3.O|f eJE~f/3sj_'3~2"4Wy,5o + \ׯfa~|,3ͻ3s#Nf'~&L|Nk'=߽C&7>HoxcovJz(gZG%Wv=pߎWoN8}(OC(3ٺ2/U>oN? A?m w|O<o>O!/oj Nrh۳?f$;6ix^Jcɼ/˳UOK脟leGyǯdAΈY?q~1>y+Qno8^xyp8k9nրS^7.wA_pqLwcTC"3}eCq2~]f'{?o~5o; u?$~\1FIϴaO,ZQ?*F^/?yG~ërލyPu3NW8?wFqSCg8m,_'3dH'𿒝7+? Wp;څ^~rAԮ5AC͇>(_ȏԏv"o/9ǟ??,4C]x|5~OP#iW#ǭBjۈ{:rqWFc t$я qWݽ08}c~6U{[!Wp?z;|smo+Wva r}!|^,.ϿmN?.:˻<8;ptWHEoLoS?zg;n?u%=_rX!rhCۘNvUaW2NNe~*ܯ~q|Ry>OZЯSXr.ܯZN?. t>NHNJ0|\4NS'|:g!j1*Mxrt{{ˋ2d0Bu6xm;q;g<bIfl'va#l.^#?O̞$GH:K'Z̳Now~;ɬx<Nԋ`G~l'nlMa^ދ4iϼMWxdXco% GU':&٩oX*;=[kTv\ᷲ/bĤ\#*E~Ɂ. <vL@e%_"NeBXgm ֝OE=ji+F}_TCu7ݩuus仹|l 6ψ[#תoj 5r_/E#hogL?A~f̔koj!#,Tv?wj!P ‰giu;܁rQnr;VnCm(YZ7ڊm5Us4V<(Z VPEPYFC]D\/o4VwCPw;VnG(wX+wiN;Bu!*gX<o {YR}#zN]A%Ip+iOA; J ؗn-9 6)jwD!a{¾=8S>iGȔA)3$ر.C9 P:Uc;gN/iMw꜊RTqRTiOQNPUP$:P2kHrE.8ŕS_)A$ńXJ(鰜&Qq,-P̆T:ˣ qy8sz8vD9N 鷔firoCR.Ŷ0\NE|,DKrv(JG(7S̹C$QZpHF,)Y@1NB!!'k,s2k9z/&eerrHdX41f_)Y9&1SsH b$qNm)ϔ R!/N)!U!X?f]stýN"8S܂N83RiJ^Y>wS eT9vӹCs4o II|GI,:*Q75jqB8sBg`t2Fi!}tCRy=X,oN)3't$t:C3ZJ?7:~rR:g|ɩA8%ʥ&i񚀡).'=8Sܘd56k>^56$ѳL講N9>nA8'9G8ɽkO99')7d),YM  #A| \,oʿ/XCgv (BLAr0 m%3 aǡ[2 "/4abJ<[ƒKaZDpx)$^H(F9x { JWCͲ j%l 4_!KQ K#@`Cϋ`s4 ֬.:"a>j>6ɣҙ;26>ОXQcpHR1$BӣZ,]g2^зhO&hA۴4kyp$\z1k{F @olqӆ'H UNt:AiwBǂ̳BR4>ʧE *OBZuk"P!3tDZ5oVSG 0- .`[skޠ՚o f5X s hL:Ii{9[ έ0w&]@8ϧZw ndgvqq|lkǫ}cgA'Ba4ôso ̫:[')!)Kx,c9m|m,'R`O(G>+ o>!@z,)]pIM篱JMw,o=zdx3$]];'>R'rF c  %N Gv ,u oK,vpi_ˮU;vqp1ms;=h{?w/>.|뽰vlIڧdyCpxfͻ\m~zXb endstream endobj 1650 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NSprojP.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1661 0 R /BBox [0 0 384 30] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1662 0 R >>>> /Length 14969 /Filter /FlateDecode >> stream xI,8+y߬@cIKР&僲EAgYe$ >I<_}zg,#-g,9sYs^{yYs# d?VAn] Lj?LP;}ϲ{.^gв.i1CϽA:Oв p*Vh <@>ˮ?s΀5;|)H7%aީ)3r~.LE(PiVSZ(PӖhq/}|T4'^azs^g>϶3TWMc=c/~.Dk6)/הTN4[kD8<\(>{n%953 5}.gb(]:ʆf^>dž䘮OВɱ~ּ.>= @+k֥@{b D͍!R:-v'"Pot8*@mσEYI䟛֣Ұ1o} uA%m_2 at1NI|iG#Kkl\8`=Ҿ^bО6m;)}y$yzX:Pזϙ4}֭i]kLuik?Ӫj $ab{K-E3rO4HeP$|E+M^ sԖ6ne'C[՛õi-#b̵֡[4BGL!~bK q 901O7 H,VtD ݦgEUՀNWnmi-y2Tm{EňE10}e`h׷% %GaLhhyzCL YREZ }Y:%]”h/ì̜?:{s<>x*Aѓfy:8wū(ߒm{1' nm$=U4, Ƙ Y3 2f&E.`$`hJ`+c+6XhrAƿvh-}韄E]+w9)^ݿ~)xdmZ-[ JIPU&PYǡ^<%KcN#Xk\Dk;qo:%R&]ݗS[FPrYPe2}橬rm"OLCB]DӤ9C=mI/i ڷht%xo_I9Y{ P] ?dvQ[\K V]I#T~/h9 yU?_%QT= 㡋ӾY^yIsrE!#qbZr` 䉊{y}*_pK<l2x,Om/Jb#\[\#dkB*IB <Qam95[> s[̥6o9)Dd-N]2pT6SXԺ3likP&6N ݲIUMl[.p}xfO`%afX][y#V7`~uFu'PRm+ф_acK7˲,;X4k!Ԓ29@YZ]K:=eK,p.d-wN,Zݟ>޲豿e,Z>>?y^1ZaA1"0YD(6=i.\M(q)fvF%jYevZWΏci詵'wۚv>t4fkװԞ#vh ^:&uf5QƎl۾Yt`fݪdxQ?D!9알=ɼ fh" G.X߲MW uϴ>BI(Cq(_-xD.&``25c:8]K뻝7qvND3QU _ъ/D#19*Ogr/6KH6"9Yٌ="кOy<~Y S= TyAxě˚p ň-.%ow/6v)$DC1Ah%2bҗ,I "j-͜yQ.?3Țiblp<U|ߡ`\.9P0US]zQD3@f ABmQ1"ϧQ_=I?~Hī, >Lި/ |$eaiY[@x[ \UiC(A;nӥkQ~ɯ$/DW|oYZ04XDP[ &*)bk{kȽBZV3VthLCd+eF`AGm~%8;carbWo,FMgknQ }bs$H߸k_Bpr* y68}\>-%Rx@J0RS~ 0)10sYAl;;0ObNk&M Փ%WB@BX"IӠ\@2%z3-Pnڊ箩ً@(%@PSR c=W=VJ|$]%\` &\%J̰{ QKx22k3)mԶj2+$~.Gb,,A7\Y{:f`WB7c:_ۭ'P]O7́֏NFƔ%,lG*J W}P!7鏴Fըz/0kzIF;,űj2z .e:[ sk-HaX.k a""[D,K 㬮%_.p Ȗ@f'Ř#JuLAйRr>5V ߳:܈{-6cʎ0;:Q4 Ѧ e5 'F'VOWG:o3ʙ`Z~`?¾c-j PGk Y>)[M`~Ytx4I|I2~`RJ6]_}3XkK%n$LU]u[~"($']@t`׀6v% suB/Zˍ@n$(VbHu̐Ej'r{K;[F@_D ܦuBPVzࣟ?Dђ-X D4!r4XߠO7<q*_0ܸlMi 5UJ?y1 A<#Z pc;a[%å3MM`$] O +*[J$oH3ߋȰԧ~CMx ,AB@6վL&ؗ#ZZ'.K-[L{Wsj sk_BjMJNd-v*e|)7Gri K>@?-^,[ FK@W䁾xKWޑk{/>HRFłEk2Ǐm M^&Q/7A_{h%(L*?exC(Zrnɦ ?^o(BC:ҨMqײOW̧s( />{ (b)>k4lpD2CZP;sQpۻ>l|~r;%Ɇ tuI1Z:]]o!vks;fZ, 4o7_fFQ#}IIPeJ*:X +Z9n!|: (O G.| s2m2@-qO*TVzh`uH+kn$W锝 ;*W020iAVIrx{MEQYf, YRI=!wtUEFa S8,f}ٳtm>|Q?"5f]w mvVַ Tחu.#by1lRo%d~_qYŻꘛƞzO8)Yd/z5^T'9'k& 9K{=ε6F_~ڦ uӞP#>P(4%**P ّܑ<rxX?oAs5HHSܜ߃eVPZZm-XTnNn.WfŒC/)tt8ZHN4龄pxjOF=?2z۹hJĽv=j˴#b2mm1EKrتjYJ@S5E{YZaMS.mozme3džgZ&\m'5˘PQ=3F[(QIM(ŞI-A*BeaB3}lBM08dT؄O$FP=ɤ$AdU'KPl8tYG PBf\s .,zd˳[絅6 y\oZJ#reX'D5}M ӥaZӍH.ysN+?܀9a7v#e7lsQWzMFDZE"r S$ b(G!lgeaATp-mC Ew8|HlUd[<k~(w(&iِaA~=ğY*YQutMe撻tCs7趖o]PaPoh }i)'M`Qtbk̑@M DϢ5gk14Aġ[^=52RBA=x՝'TE)o#+;R{87+7 3$Dq-Pk2ΔSU~]׬ ?@].Ju+S׻QDdk7a9ﱩYy3XU`wBy z#~"lFD5uS0Se8d˶XÒ2rƫc{y`<|*Gq ЯsȹOQ;YI:[teu\gkbG >Z\:Zq0 lzWp؉> w97a)Y4%k E #}/=oPA4|SqQ:M.L{C bNmݝӠ(# 706-e{Jcim-N$S%m;.͘sZ^YE0E^ʤ -e x(ַ45W2Whz oHZ$P(҈&'kbr:/5s:ٯxȽtʽ,`+}[@ctt*$zdcȦt0*ªO]VF@t /~Bvm@okȦ[ fP#U_d>*L֖Y) t(X7`I-&eˤOYӇۢBڳ7ͳ0l[dA%+t +ߢuHx!mWRJ2rkB7a\Ch铨<‘5rG~j(cU#fBj}mf|K1lchOunOy...wgCLwax{#SBۤ 2 ޲o1,Nt#mm,6*`2{UkP-h=y( xJD܋f[1i`R=!kAIU›W2"z4JmKIK. ;x[yŠk۠h 1zaf S)D"#XKlB q4C>B3{=y-ъǰD(S Z[ yB\u:0dYβqBQ8!Sܨ.-n [gB9O߂Y޺K{Q-B[=KSa8ZH]I/e<沄pz/C%ߊ%>F *Σe=1©!V]L߂%(/xϷd(9ZpyIR d'~k-w(n[ 1kFrri ڸȑ VU*DJxRQVJ$LDU}H+ ue a/2f[g$EM>M iHV"Vˆ.j)ct7["-C.ճ"()c9f)Cy=]|@&5LIrAi-=ZQMwon~&?*VWvڂkgER]o{ ȑD}i'WɅ )yOxyiEeLO%v0MM\5/FlmC^d _d=aԦ|#K,*J~M7˄]tͺQB *GB|XZ$ ٳbxM-7 U58gy`w[ k0 Y6i2f)ˤt2]3jD +[[l3YD  Z[1< TFD'U#zF.v@u%7Woj\}K44C~0rxO[OWycttXBr7JX0ѷ&-ܠb-c: ĥjm3'.K~O˰b[cu Maa΋_biC d5vۓē/4@Ծ_^7OWYW䢡SאԐR䅥~UCm# Du94-W($xEw]:Ruz.+ euUF]lJx뵢_qezRjؿo?p ub5]mO;AYs׻˳g~nh Qv7 CQt;^hiݴPb%O =DThK7uzQUVp2aϝP ԖۤNP=]Y$/[ԁrxq_d;7}FP?P]/ET[}um<R[8 jla,0FP>~o熡1Mλq{$2|:#Mq9"--f܊xqi("4*%Tۂ:OI3׏T \[F]n-̵RtyI3 ʃ)X^ʜ?Wi+9Xtyso됒# 5I)Gba>2$n6$D8wпP9AM+HDj3XawV^hf_'?rZ=Kv횓MNokwICrAL>JH *ؠ0QH7cb s!uZ @n6{$4uݠ=AݕEI-C4ܺ[g~FE֓Y<i2qZNMZbm+) \!S)[wrvm,}+#Xw9>#g!h|VڠTnIem7xuYPŁn Uy[LQKx#hb9TZ,㋘O*[$>Fʫѩn(G42ܨN4zZhf95yt%qͷԋ״}梭>oe(rx_ɉϞ7:"n$ԯAl0$o tkA+i ~b ܁0ld.mSUo-NJ)0NX% r&reK,f5F/z Rz(ˁBc^|L9WO7~"FR/M #A4hͧq_fR.}n}pl7G7$EA:=t$^>^T~XJkBϞ=8q(%؁T\ }M%rz %Wg^)uo&Əa W-ޗk򘠣tsAwF pR}s[nVl@)w>Iֲ*eIo{ڦ.t k%{f9C+g\l*/8ݙiOЧߜ2 rDtl\t+Ѧ}6ҋWmSl|bqi9)ɵv=Ҷr, ]`A'U NXqo)ܡhjiup ڀ\p!6۾}{UR>m/Ln;)ޖeלT\|2:uZ#l'*U'#Jjvʺ㐺>{37chKк RgM(Z`Nb4(=?ʛ׃u0w>ߪ4@>T 3RzVZc6MYƪV-Z$ϷQzmZ@vzK7gxsvm=ܼnBb&XUUa0>-AycW9jz#&p C>aũpm@<_ւ7wPxDqT݋ a~hg:mn3ӳQry^(jͷI@r7ީg1o)]D:*Y#;xon6]uv;:﮲\KNj6;Að30F7}z<"9]w} l-&<$^hsQ=*@v.lxzd=伙uXCh~cTVOl!{%TS뢻+-UnUui C{R4zʬ@ZHM92]rMgpKu_kq+Q^bOnz;7 v'F3Y.q}®iJ}?i|Ÿ́XT#jl0&He{!5<-Iid lۮ[`UBeéBXzvY[ȥe !K5U =6 .Lkx."Zut ŏr%U1U Ç| [ 3"g.kK$|]-?1mܮk /+Yzrc[q8JOPr7 d$(}=ܶ]{ra~:4?' Lķ.߰1[bqBi__͚G?9a[:~}[kmڻ'=FsZk(.b< j`׻5O:]ٯ/f+^UP}a#Jc\f,l 8L8A>\\m irWu#-¸Fs ܿfo>2΁=(>+;+Xr2ro׆a{G})H",ZcLϭ %w-lGYZ*cP/d&$?\q#xN%M(go=ro<|=sjU}1#lE륂NN~(D7FAGtͣ|< 쓆aV(h;Jd#PiwbSa!E{O{oU |$&PE}LMQ;O)@gUx|g}; >ݕ_wWYĄ@Kez<$+Px\N/*:=#}Bo[v\;p͞-{~hyѨl⾺ yY[V<ѬN< 5an4{M׌Zy}||P4-t' Z{[j ꐔ[ݶ1mFR#;0K lԩ^Xm7Ka1KMܵ^&J^-W0zÅc_R2_3~]zRgzG}9cÒi:.x: J#?@r%6.ˏ)E<#O?> P7lh9n{cF{ oS@޲% okw>+cA]J(cdlP4>j(imUx:.ާXvt <ǿ01 S@]ݻU?>  /1voa|(PoB4` ஘6HU E*NuڮnuO\(fg <;r12Ҙ>|p@ХiqJ "h7z=*I1tU}H ;K.Eiqх hO9SkrA̧ B8=68lJ[Ƥ3M۫RͱJ>T2k#hd1p}߫nma4BvZ,hmuUjTo)R / :9++j Эp@N뻠p'J}NEĶU r6ݳ$duZ7XcӁ>]Bv>dm jkgs{Q/vo?)e ۽טnmv wWo=O">^^{i/?0z | x>C_WgJ9h7-|jt*^Ew,>iL1T_K AyD'~4I,Q@֬:MѰ_ޠ/@-QE.P׻Ne<3!%bbT-ϒ8~unb ^D~މ ,9)ѱ h^GJ'+YWahwO~3u?:sk;ʃH .~XC=xY'JH]'`>P)зW)>>> /Length 51876 /Filter /FlateDecode >> stream xK(N_ձ^nx)E櫕G _ygo/~nXuozGx=ay%3C? Wl4?hmo{APkҚg [ϋZ68ڸӿȰ:RСwh>/mm3~}~ -u[~B+}ό2ZoN+ V;}}M_NW_ ta W`8[l~>K4d9 w< -\~(/z2F 44j,hg7׆~~wuݞ /??OC'R)OTڀQP")SM0w[K#gL; >_mB;_ұ|}>Lq{T} ^%F=_E$ivz 5.\\|v}|A;X_D#{m;~q||n/sMIbtW~;:>X_8L.a}qǯsNu@DgԾu9#ӥB?烻~Lj bXVƲNRAQys]oc;5cĎxsxy=ˡ:- UAZlyNGEGے=?߯v=+˜sz)5߆L6仯9k߆t$? f]yu)agٙ1A#BwmIUQ08){] H繱b'KUf%fOE^\4q8|}SgXE\dF (fPوoZ.,XgWrh6/)z"S `+/X~JS$߷d'9Y ܌nJ=KB( H(`qj>f 7dbfy KJwCR|~fOk ?/Z;㞜rb{;u?,;1AyXLEMaTg䂔Jə|<ljy{QjH)C5σyS=]56(;Ge)lq5ւAy>Sx<:fs\<2JV4Bќk`fVNXh;FDk«啋c#bhJ]Sд͙\^@ڍ}?/n i l EZ]v a~w VVeF KS;?}w:z-~/BF8zv6۫!lE\k,i_7rw}y׽ F\Q3^z])TQ?ٗBz }-ޢRts )`9 8q5TU4QCiWvV; އEZ[BO`"f_dPYôc~mPCWb܉0j5$2+A!SCyHgOIxH-OI.0>A8 {@CP |^M½7Ż(Ơ!)8Y9BBPuj1Hljߒf2oIAdũ" @q V3Mh'AӏF> P]D4@DZ%~w s؟ZsXQj}k :,x bgn~\p+Z9n Cg-?>0>VtB$Gm;st ~8Df-$ }?u\[m,o'AiCXG}9X3-k73"`Z٩Vvfծ;`Ƿ^-qۚ.#A 6it~DwvThn߸. ~#n\_?-iO\@XRXВZﶦ^8}Ͼv{MT3gʴ[Swhִ2ܚI/,ED]^u,U suhuc@O^m?MI]ƅK:yO֛^v2n jMI wfs+ [P3j]K?pv~od/俉cݙysc]m).oӫQ:T;tx ;ݥ(/euNn_ڼKB+%ʫ]/yb_7j#ۊw~ ":C|a bFko` ~ޞ_~~`jP*8s7%1 xgp3yh4vÒ8;BwG$s;JZ,8:%Fc;3XЯF'Ϯw*0naJSq;>y6QLۻ%V}EɻP#ez8vJvǁ3ώvRJ%R)J+ڊԥWWS؞}5Rv=: ]%^ޫ.؇CLVE͂(REZ74 x63a>8݈Zx Wӟ.'594 9Ը>`"FLYz#[ioa~O{|ipǻ ~6>]ڛp>[V—hgy_[玜8[]Ynܻ\B3>8ɳI%Ԕ~ @bo̧֟][Vv\^!MTn2 HsCw֞US<Wl)0%b>Jc9v]-xG^'-G*)_>1݅ 'YF˺0ADuI@iTՔfIpyp;88[ rϛTʘpb&uy vJWJ57ʡ^%ᙺxf ᩑ+hkl^L\(#.HLal vT{k&hvUj2}Z>׾oo!ю9"ڑu|"zE6o~@ծ%ˬTbҚ\%q0K* ( *س rJruRG%ɩ_FkOЂ& qsU]wsDlR} >Nx}4aH}ԆϘ0ϵa<>cO wcYS!1d`w99\:AS}|S*ѪmP5ܺ>kνֻ{y (h#䍻IN@H-3~@CW1to|$Sc94Xm,G1t4<"8^oG<'XG1EbKEnrߪ"} :p%Cyems$'~~YG:@}!Zt.|z](2Úݖ'.5CH+^ )QkWw1[lĩG=P2{#e=jCfyK:Ծ3 Eɗ(UZ7GzXv)+v'r2'Kzu<{rTJ|n_V{ ~@~"f*xW>DӊqQ5 s3vvA_ݡ!7 .fu0ԻOJBbZvw \vw"R|4),4{Uς}Iد7@TFKM'ל+rń@=> @S@\s, "v\@|θQ6G8{{8JEc[_]P8w@M>U_b9yzj#j(20 ۜ`K6\f~$mE.u5f6rşv>AMxSNrB4|hDFu7il44 w0>;S#qk%?rg[(Iv=TG*@E;Z?HCݷQ!.!"}C Hw_א?iHC9&_ҩ8gpjU@d{oӄ;(3jDDljfE\>E]Du0wNm4`numY| Y_QER_3VE7?!MCtu- !Ha|^S"0 ?=w~d43fҺ'xBv '0lI?N|6O NשόOaN tZ5mV*Fx{ex^h&LJ-@LfP0([55m7hJI8~鬜t_4E8i/呫5J^2kKהUCgZiL,dT8C-žh7 <܅%+D33Fe7ͭdRFB:|PN57$| 糋8³6| TT7 rgq`.G/Z䨛3ih4V9Ok*V@UTt TV-9@֯I,G]ز&%A~v[d >!]:D84) _PGJwB]I%O :IXV%ׯ<~K~p$iN`F2ǧf{?3d@k< -Qpt.Ƃw%9Б]KZ}^rqs97OvC%nF'˘[Yw>ce0<1 C#de-EK1J)T݄}6~e`[OFي]XFfl;Oř' &L(f5Y |‰+/>pbֻ{+R#n)JZ^kseiY\@Ei~o&*DrjztO\t{[DmyHn`83=Tj+ J9yMڨ ˇ ziTg6E.SMAeKq6uBSUS.īKt/Y+]zJJTnJIPS5@R b#@&D"I&3-o))rD͑s~?Q+Q^x덚B~:3)6 CS5dU.2OG°`u V,Xb@ W| P' ,#b"*Y:U#D0k%ܸEƜ eD-[$-h4fZg7Wj)R ּ@-Tpʡ J}Q$Xsa/ںfZ%%o+^nέ1zAls`"Mbwg 9I93W5PPIUg\)6娆!K] ^OĆy >2M5 g:T!yʜPKO\}IA D~|GFyG@{gyQO Ghr%΄~AP?~}/@woϿpmXCnX5ͩZUM9 YڒDB$$fQ" -1q!gʄ",|;5IE ׀1H050Uj>`tWPv[]bp`Ye-;r]B䚃.PsyP/+r^q#-̔Ʃ 6Y߹_6?Zƀ14}P=GOs}"M/>PzWPZx/8n-r a.s\"@\<{"2d^uTv;*6u%ϓuE::E^u^UWD>8j$]*O?c2S jyn}qfѣB>У^ D!,Q* _s;6B4ǒX;`&S nII2Ő >,Lb埑dW{HLi @ѳ "1$*3 ewnKD|Z<*,;Ƭ natz/Ox<hޥ7ͰZqx;.QͯߎC}q4Wr&s󣈩˨{uFN(i+x_aV:ҺMloln__^}~IY^Q*ӵrG]W&g];,P,ʈ)gy{׉oK؉qM=۵_+CIeA]eAj`o޼EF>Tc/Au-ø/swaV60۝496 DZzfWM @|GZX#}(.0?A /0:/'.氇 Az5rzdq[ƄsܖX#ow}!!HûzÕ!iB` Xsaӫ\ eqE' Ë}* mUުSLMi&TpulaHJ:?Ql}X>!ρp| @ZL٣V&%-sc ;pZ\}= uWAEv'l[];NA%굵..Iу~$=M梤$FI$ v{Q6C>>F w~v* /k=^"viTVg h־yRp|^)>!F\X1ҳj 1kX>Mye :%<v5xZ/Yqiq7oZx"a$MyT#hy6#ުZ-,9b:ZgJ<`6>nN:Ulygu6K(pH؈'jy>A/7:U%U—Q+=3W8BqnϿ)ۃ}2k;lAާ ґ1;cuы/S8GNES1ѳ,irXYJz*ZD ؕclM`*4m&${<d̘0r-/=jI-pYU?YQcVOŋ'K>G\yK^ͶxH3Zw6Átǻ)e0y7 _ o+Is}iJK- !cXk0m -Nw!Kk3s}5'Wa3p~o~=D4E|l 7#9IZ:AH8\$gq|EOAwz~I'$"0 R /^TfPp!ˑD=H(zZ6KLp8.K*[: 4;k\Q7 e2>L˷WO~E7n]J ϯLǷzf696#`gŽQ`4ibmIKJ#yaiKF2dnfje@Jk0^9ٚxI2[gR:Xv(F4i0X%_2iEq80ᩬ5ȡU5#~-`M9 z/c+OK2UN5||]=t<3. k0#JSTr'&J~(zzw$hhE2,R0G4ʯd~*Q8]trSVu* .c^FYCe_8GP2XHU05c A唂u۠h%':?HX㢿uY8Avw[ùcTJxk%VSjxz]?]Sg3x 4AxkL[;̍KŤ0x9D.Eq\f1-E<,Χ0$iFbe(2N [b0OLs9 P/32828}񊽚+vkV.-W>KcH~Zm_>S*A Wp8D+wBI1'И qj`4f1kA[ZU^C@j>4 j<~2'n$5U DވTxa {v(!Bp1/+Ƨp+v$ge2^# 1jtpSެ⼪3ܦ1QR'HmNNHw)J:Gڻf+["- K¥R) <Cp]AXUWy9liNni|ndk`k _e:;Ĵk 8Ĵ L^=]jgۥLu_]])r: 0iX4iPƼQGSg1gN|eY٪D(RGi- RR; r+UH@N==wWwaM)5z#a}[:gG ~%O= )09gl;x*fW C()-q#sdF$Y`gg{99P1'1:`t:*gkm2Kwy0?WB\dKֺWmViK'W+H HWed[6 9$šS8O$qB0ay]90YAIh%@?`k _ ^!^R]_R@kUmoKXps4C_jF]Ȟ#tƩg=qY/{fg0pȔ/uaZ˿^> V\pf>#ph@-ytI9|*S<ώxtymxɠhO_> T!c3|:6@XI&V )0v6|{Qb}Y&9{?[3)y6{FlC>u~Q.we:D-)@v s SdA,zF~k~UL|x->Uvig~>AaO>#c5?a2(=m Zgi⋢=?r_IJ'K]}vnî|zg-Dph¡*ioIzUa5s{ǔ^^mBdfפzeFnbk%z jub<!'C3gPa:#ќտv 2_^r"O%'BUeT-Ld Jqt2U MF5 N0ܹBU,N)})I𧇔!K i J ODVR5;BVj/E8$"U|ذף [䑑 [ذ^0hs:^K2 rZkQlc`]r! (?qHXã%e"[v×D-ݏ% 2փ{?|X{X|>9GO8VΣ)sQ-G ,){ϟk )oa^T|\|as!vϕ֥m.$Vz*-?,M t%$\^OfrA§U$h!8_3afwdSf4ASx&M&\8elb0܈.%[n:w γIJz{&苗Fق}?_(ZZí, N oZ؃ZVoouvf4YcoJ&L9Dh쁞K_ d ÷s%ɉ[7gI;}P^}JqG]X;j/s9 HGr6\Oٶ+~hԫ~4L$a ׶Bo>vތK"歺~[ъOr47rJV*|#-RcG4,(1fVxp$Em5Jф/: KG(h f"V+AhU< cGa&oZ/3L=;PfZDf٭k vZ(@?ʝuU)uGNB^@Od@L{kjF5oUeH5OLak+B(tơ]{IB4-YY ѝ% $*:J/T [q}`}ZǕ烱ꉍ%Ax J_]Xs~x?Mـ|'ڢTV=0#$Pϱ_G\HWsvkٓʨݚ{+<\;Р3Ad){Ud*_u 0S1WGDRkpOZ{4phiZjE8ТMau-Ԧ2|0Ķuk&zԻĶAzitc @uzn:0ʊ@+=\#'j#4c6yYJ%"_!=l!inQ e&LoBY2,S czPR<;yl 3#1|h>qpPȩ]T[!j-Su7ْ'0e'\>M&Ms4) $IiƓ爒ۋˍ\|W9" \ Om]ƪk+wjaD*nBL/s@|0zC ]^V/v$Dm?XvMRgf'F~bXآH݋dҾԖˠu;(N"/n ~p×dsqrh8)j+,+]z?ڒ`c $H: bcCKLjy`å*ThhIA:ݩB.sI",>jF+CiU)%L?PTS@b]SM֣b%=)BE$d-a>SJ( FJ3EUR-w *Yk ʱ(kDI57WYHa5^_ n_u"ܾܭ!.!l hz*1B[eVi]]Ѫkhz1uIM4EŲ{cl%^Ҵ~١?'+rl`>֢H(%SQY$1Ms4IRgB WS=:eKm#|ER)D"xP8T7e.8kd xfϫpl(?ݸڀa8H'^FH}ptIÁ6/n9u-n90l{B0(TH:eCʋ4 N"D-ƕH!P _52((x*'K`Yc['JdGMaj7 1G&?C hh+1'&X~EOY(g5:^#r!ہ:&lx QGkC]l2U,$\Vpjb)ႭDǑcMhFsR0#fbT@$pkUށdc^!B~Jnh%0͆uXڰV|i M~y)9q(3 BٱS?J9pއ(kg?%ȁ8B;ic8P9VejFc8Pʍ7_/׏kx1O$|Hx% p#s,1, !`$|I+qh]0ZzxHpmDE4B̔D&$*S D]8peiNb3^v[rz!8Y |VĤskٞ'>* a&@9 )/ #7%.4< VZ:d%ֆ4 rBTa 4Oq 372\ X(Dn0h0HHOv1$e1(6BsFKu-1}HH$uhxn'Ǥ&oP4W>2Rˑ׵?/ R8J`=7g'(w\%A+ k+N2bħB>2?c ^]uJ>ϊ +eDsGaoe6ᚑ B늛I+ɾpR-@!.J9:ĐY8^nxQJDE#LCYTN(/ (uPb ~) ?d>ŃNc}, t;2Kwj*xJ}yR 0|"t(- ps 5l. + 'IOAţd<,fj˃6w˃ftk| tz-?B:H"7EԨFE05Ł_mlcPR;GCza i,pZ$J> t.}&0&H>Z 2lҊՒm [g,c朥1/ 2~'(ߏ1P/Y?gBv^-lolIb[qmc%=n/.vSm{e [{nF ab(G D+ p5L=D^bSk-[w/lhS odct_{ڢͤ~={KNzz1 oNqG^ \Xgg٩eH+CC°%֟ $ziHPaK:m--}I%7u./ P@^y2zsI1fYgT'%vK\PwXqkn׺׫_.E™\fBqX8+ T8+ (J5h\+ Ӈ=BO?\ӯog*  k*#cDQ|j]Pn]OB$UWIdK w, [iL$0Rwlh0/>iO w/Mb\6EXvXv8 UqJJsAX5\9D.hkU CgR(+Ϥ#Xۣrh#Pvq_z cF>m|N3ڕØnlze v Kn`,3^}21C2+)lC>-BLҗ旰nr6vCMIK<k=%CEU &9Ru]E.Y3 bXv:/ FJG8@x IJlsi}~ðX*G!;&PMjÅjCO:tH0"Uo @nռ YbC (HT*qS)"J"T%,9o7KNv8JgKhS%ՒtVâ-٪(*ԋ$~%<ucد 0@ ,@ "6\0󩡡*`cXtjcsy[2J0g&Qd/`@Y- ,T؇5/i TAE gڗ* y~RpvyV~~ cPοsןuTXנ׌pƒ&HC|0 0_wsK'\`MMKkr?Ҟ Jri;qVjWi!j-Rj/g&P.:@R2 ~Œ*؛;l*Pr >Q-\'[[R 2z9sFO^R49؈YAR.?uqrB_y+:?%$ [06Z, Xm(A˧3c`=aueydKZiݽx=`ȹo.G~7ܚs,(r _b$S' 5҂T~,:(\R(\ +pLn#3'n !|H@ُ$/y aTUua  >6ZhKALuK͸T[ 2vk'9 Vr4;Z#5&bc!i.:zh_cxWtw%Rĥ7`JIkxw\1]ZRĤ֞AmZwAf3)2pxV=>ηC7 V.j,C++J rJ;Xl 0Ú; Zk׎z_*?B0>z bNbQ6Zt D."G^Հm…@HZ;D֑Q;.S d¥9 ᣄb''>VBtF+#\H gNJ>!(IY jӉZ!RX* r* R ä%](k>94ŇU5_|Yؒ|lnRV:Aq@P-mgt#|)t>Rud=bzƙ9a^E` +J09 S(kK@2zP~oBEQ7DKS-*5JB"L.'Ԕ-e)(5QCgT/e峸E4/ k?w҄6N>:1s_CX%-ڜN t2(Z |*fNިGU#=/ȵSFEnᚎխ#;)}PLLK /Q!}V6zZ"~Oy|NiҔI@8%$={Ǡ#v{#K_fSlpAB␻J{ܸ5a_$`Q.ޤ6G4%\nZ " SuA* 2$',;v.o_5;CS_!l<3UldS릓ove`pśqt)5. 1\JS|e*Ax8h ڛ@Bq9d^ploU[B*@.ۚL\LGE H\+L(Ja]<)7QvJՌ"-!E-f*=V m9+mwVe/YWZ)AfCR/i3φѣRUZ$?\LT,i?'+۹"%!uVuゔ\~X@D`,#(?ٱbB{~5H hw9QoQݍ}Xa}CmXC%,wBI~NȰrdPNJ ͩ͑}ϳmZAxLbt,P* R";iQ:̓Ad+&ZȮ䓌w^2ӁGa Ɗ4l: 2s-@AfsuulnŃeNlK~ ˌ d%Nҙs t@e*rg I$ʺLق"e[>ZbrÖ]uՠp^3bXSE m nҲ?Y ݪ[:VY9[Y}ez{Czxp%vwytKN *m!fˋbw.ጴ8T}5`#\`'8kl1|Il. ʊ{l(0E߯$&'m~%4?w,ͨ0hڽգo `y6uأrϾ~oe\];Vk\mm/6vt5&dm>'(YϠ=:q0V5eʳ"yʳ*`iXyǠḷ0*?Osv=E]xsc2F&~#AܐZ)?wd咞ߵdߵz ]h1##4/6IK ~\` 3<#p%o\맙͸} *g=̎Lޔ)̢g*Uw!IV1uD˲?L8{|Nkpx afw lz D0\dSS]Ά ?ja N|ﲄP t*NIDIC'$[HuvUkޛ*u>},rS*Sln*7>v"rMԈI F> VØ ;5abJw7ޏjKUWNpk).*2YRJn 0u., &~-XGxus׮bHjl/8#;%!IR#4dh}݂7IT nR G^{WBv+A(,3.X5uqu0s߹naW`W9PlaFe_$GH7׏P8TCϏPV @1@/& M\ƸG}1wfqwb%SOqYkh<e L5]XAr;n>el7?cn~U1X.M Z)C~&bi%)ҁ#x.)w")7x̅ r##UTr|i+(_K5eskFE@ P$wxaMj'q=1!p8g5ѺHZFpC1b< =zG8:&[['H.E{qD,Eo}Q4Eaҳ%TӟaŚ LeH!D=j VVhN+/6pn-TvӫԯWcv Ӭr;!_|P< T ð쑩 È{EeQ ,Vpoqt%L~#Xc{qbc>рl:Iܼ CmY ޫzѧ0wX\5wI>\>N=nnr.r,~\ @F&2äga P&R-Čs q@B܉5p݋|8s+p-ăݒXL1$2x;!O`[ g9Fm\uHE6n nQ᷶H-U!݄zU;k;~I\;KvUu[]/Utv#pA^Sx3=($\ASeFEfg':T^h +wzm8xAӽ7zuh'ȼi>z!R;Sh49\:Ox؉Rw}9-i9ܢ 2}ep<&5?$],pnIIcyҌ#Tsoa{9$r.u@3/АqDSjwJgElB, #;)bт89u"!T{q1/ };ae&Z둣Z DxQ/^`<+X:Zhf V6D$z\wI @`tca^f^!y=KV%#X8sXc)k Gj(|p&o`2~Ɲ z)bM\1kMf%ibvMϩ9aSXvru沊4:ZV6NCu4T"5=* )0eb#E%-A L5,.5nXf2\\)_X>TjJ^K?Q~;nGᬆL^U%Դ5SvLN5EKN'5$DtV6צj׮ȪI\ ^/,hg$%"ybHNCd9k@V?xVsԏB Q`\<ѩ -plP-d-1 ^&jC>(|B,vz/sp8[βzBy+0!M!g)eGs q]ŞBO, v'3kG)a!ˬr9}0u  pg*3r,[u`Fkؙ|R^WJ}y]b.? 4elaj+w@={O\ S+Ea6hfQmJͰ-&0L21F,( hG \mC)~`Fθev9qe3n= sWȍ錧L r @n@5/'WCz ^r ܻ* leN8*4?}If9d`6I0Oșșh"e`Q(wPqp`| aUq };V`Ww8[Qd{4 Sĕs3!܎<cϑ&0)1ڼ;$GNY")u*h_*9<%/@ @{*ú:Z}<3R|HsJTJS{ؼqn &恆0|mFlalڒ(*(b`/T},| g !b褤aN 4O7 R&|Ҹm~11p9ٝ,P\A¸Hi2%GkŐjgY\庸k`cK(=`.ΖM6!j Y{CXrS.jlSEfMcYXUl YxŋRq't2υq>KOӳE9/1:NH~~jOw{qE wmЃעwDBDDLtK-, [DSb"-Ky} El{(!hҦ̜9le%ِX/%r! 4`XhHxJEYf_8L鵀PD=-jY○ŞDA>W.y@;fm*ޯieghFeh,m %c=S'1 xOkɘLױ:j[U  #}H:b7|IExjau颜ett6B$h.o +1%'3bNvYy= ߴ;|b7p6:##B8GppPs_8&+kpa"֫XMYr]X pTa,S۹.zh;rkm~A:eKXKҦ1Үy(,mzj7ײnշT e _le2Qf ޷W[s&ཋd ^Mjy˅MF_C G͸b·ض|`p܃w;0ˇ6@=gܷQޟNqY &E$.ZTf'A&ߞ~$ x$g+A\ kčK8#PT1SlZVuJ)=h[#gA:S;1x(F¥T  KD33daQrmJMf0L>M tI[9a: P.@*|ak׈u'ns!;` "[t%J oM6jBy$:D֜ Jxz6_Zc=4C3}VyZXgF4wF>EF׷ MHg C{yƒt;_C`]=0yʳ;6ϝݠ<^?-+8}[;tiDokdDȹU΍|DD~}|\[, sI u P̖v$\F.cvsa8 yg)]~fM?T`6]01H>FKu6 AvjX*ėG/&" $ki)Iiqj:N__Fi^襄$(II7SbYz(vQ~o!8K<@ ;K{U->`eZV{ H[9A|b`5C-[S0H0+a`Q~*"zg'ȟ`л_xWAp5ƒ^~c~~J+[θqLH2pEۚt8ܖReP$GgZyO6a2aaEՠZ.S _dsv)j_.2F?[n{ޖ2hwϜ\wVVv|-N0tǬkC+[v4R&T%Nq*/ȖJ[5@';@Savi~P2֕6V@w)jV<\Ѝ]y"5o6Vd4 (%#~=`Kx=蹅j?_QkKֺÊ]iEwS쥚/Wsy8*uyq; fSfPC.y3-"z6{!1!Dp<'ƚ`#!&bf1v# 2@MVf!] *Ygg|H8xR$>֕:tv Bay{5F|>ܣƶגy̛p7bXrX (k܎.ٸI?5iv^J|zx=%{s[rb?)G$k0pEW,7՛wEu|n;zn;zn;znr|U\v9>dOQ.wJ;6Q]= i>_oM{Pвw0Gć Hc0EStrOTަkl kV`9rk;=`1~,*͍qUQ kW IRzPaȴ]!B`?o q} Uܛ%i }Ge.~ l`NaQ9۝ I2Dz&,Y5^E`%ƶwva+Y/U<r h$a,a=xsA3^4\{P0V5`yd{JWN:r1ݿK8 8Psd@#(XP v8a& M3O~M|@2jˠɄ¢` Easት=\=XX2 ?d]2NYvo6ý.`{]n=&^M5; }eOC4=Z:8B7[Lҵ5t-%gtU\>X*'4r?(}7:scf@h/YWR Pկ:eLG*$Kz$kv؃ii""b7X0PIG~2'Ž0C'Ž03K#s3K1{$"{p:n=8煶%UfI""`:"ᑠlȫ"&mKFk[pn#rY4q%x.c*\M3W EL>ÿzAeH<ʨ+:( 0ғ20D@`{ā?7MH(A`D,ƵYq5w^uGXL֜Sg6i$']8,g"L# P ʆ` eDIfątz{>7˽ g˖e ˖i!>! 6[z%7iW&_C`+n?;FfÞWmsN/%sJ#|2_~l'\B>hw@4t}(H  fhjbf}C M52h׬hHfwͮ?o| t߶?^FRI?/}?1qKSҦL?p{7@,o}n{rlm%d+* `m}ኴKV`5T!nʪQHwFU!}#&~7{~-ˬG˝%b"S۴uDwmOFO~|m!{p9y@׶S%_wW`%\̭NMV2Hl]tjO9K捜C獜G=OXz fh$|J?@3Haz30T[cSmI.?1ps3s@?lGs 9Ժx)~D ;4R/~MK?%z`uT-莅THW|)^ ʹ}=BὯ'?B%'?B%\IZ4W!a%lC:}.>z#d)Ow.s$=MB4Gk\ ".j8EHH;Q؜{Udxd KK+|k '>h,,Y<鬟mqْU@G4z CќYe[ygXCJǮFQ(#KOl7OP!GX[e֖8g Y[emGiRWb#4i@1BfP#o? $R?yAMz OimO(a5q 1f+!Ly#ĘzOvV'{@KlVYΒ}SjG|U()WM3rOR>C)H|B@"驪ɑf<if8iH3V]SĖ+&=`>hN}axZ4y%j.&X9-`{\^O*=KDL`ITI"QHI $DDE]{]z˒b%˜dɂ5Я WUUtxL6iLԲԲ$+וzu}Olp`]pP/v~xTUJTUv . PQkB&8 ţkw*x]&GKuht.Z.*x] \Uв*u-FNaT'˳LYU`, 70cI l&B(ONENm`O +_GB> uqJ|BHd?<#oB&NaI28)Z!'0h2N*c c3Sm$J5F*T;r+2ôzGMYN96T38MT>wQ5yh1қVʾAto{˿2 " L( TmQ!C&87Vh5/N:^ 5^:n^EkKpka|?WA> 5~*2#0l kBn]r+eB~c/`g}V$ˤ*B >>vo4g[Y}*]7G D'oBV#'rdnkrdus/մP_B RJ y1ݜw "NBXCg=Ċ:"&tĊ:Wq%q/vsKϏ^^8ӚxyPkEg3zy\ep$ͧ>F#t^l@(Y_I".lJ-e 8g.b M{=A)&Dً܁1wf:lUIzfrؽ-j"sVYE=Pæ[H/9..a3ӆ ˗7pno FY#\vwęS.SΎ`=[N`=WGc/1{%"[r1j+nRe4īV5_ܨ9,a%e| oj^x5cITvw JyK=CR?^ߊw8pWtNu97o8]"&5K7/VnfL \؎.[,O{JqyOtSCI#:m9N4Bá YNBǬ;u:=ܓBIQ+ٓIq&Bq&B10j8^[9NWVcҽrгGx wLILVg_Dx׳Oa @ڳ/+_2Ȥ,C  6T7kzVSRG'iQyDA4iDWﰫR)1z'8?qiOO`I݅f8ꃢN汞NYKP"m6d8(67JbEE)_[K7A[7*L%z"&AȾ䑑ng/q&@陴;kjHMyIx=zV%MRBH.9A[0bHw}aPk4bdDY _ֵ7:WthfY&bOvm?kTh^/j8B,!p/:CXpp$$O;v>r$]͍#<{DOiy,SMI[!7BoD1CNoD(Ƽ߈300#zs 3 /BUǑOo*ϰ-Ɗo&H0sdž8ɢX'=IGa`S|}jdfK6krxfw wrLMy7aTo GA_Ìi(G/RAS' ~j,I"tjS)tj2SS^~` EZUKC(Rw C^ݐKv;2p])U{:m.wQZO K)% |0#<#Xr,1-nH"h$Ψ-1%BdF)X"N"Ux= 8, O-N :SI="i8H[) M31hsb4& Wokp_ZSpzQW[ڼ]UEGy֧ٞ0#wTy97{QnM|4@Ӽ1 <_C+&DV/!"\p=vg|>UUuA7ٗ a:2܁\Q^o+=4dqa'mC,-&!:Lo1!7qDMv)g0]#G`9 kT&X*TF'@e)'0'M ϓx>(x/3UB̤F k#5'F o#Vϟ6-XMc]m0R wҡe!MDV|i}[ =5>,ac*b; 髄=$LDg,>5뛋|@Їt kEK2Ӂ>ާoWA}lWGsRSoiy֑.s-gze_m@}JQV&.^aŘoC %WbzїSXK>y uPD_>O 7C 4xDɻ, 2ª12j&Y[1'wCxGrOU.uN%@)'wYS]Z[x7]0.)χբ}q/ }Yo<uߥ }AMV`Q%B$;Ppq0AkdJ,q{vv`8p+*^{v8,X E]|}5K/'?ehx@* o{Ԣʩo)_asG8eɌ?W.]6fv~zGI.]1_P~ f)B!SKˏɅyY;iUjZ '/ 2y݁&|<Нȍ}YH-jrFZX~^tiR\BFכJF_U ?jTVÀhD;1y;(-\&UU R<\hQ $up, 3l5YB-%J0I\7"M3.bZ^^uLШuFNʒ{N8{3=RB*yyJ=Ly4kZXB=zo|L,>7f`ʣ4fԬ0e+E@^r;dxY j`|Oÿzs(d!Tȷⱙ*aC !Kdrp)&PlȟHpgF#Y?F[pր/o >1|(1|S"TsfI0(1,ʄ\Ivr9yƹA=ڿs&y~IөL7 KVO5'd?=ݫzrִj޵B(sB\j椑ƹͷ͆m-:+9"p+S^xSN[gpŸ%wtZ7w)uz?s?ퟩE7frTH]P}<q=8HLL 9HN\.gHͦj\98ن[jD;EIw \cUYj\(\+s\ >{_Bc,ݗz:߅w^ۜvkQg~׎GuJ{&#h2z55-8!_ Zu\t*z%S \ D%lG60U.Z3W.\;۪8_w*>ZmTZm92SٔM=S𱓩6Т^f#$d,j9ɂBb߶5^L/Z#!|CڴL).R&i.S"YuJYr~`u?h~Ĉڡ`G!_.R) =Je`Ph*SzA+ޣ&j.@+#y R@<qZgZP*U~gfR@;sX~ bPpk7MΣQFޫQ(jׁ+̞vk:o;26zF:ZWYcz;[Q mbZNk202&VrsIї4jm''D*"=죏H$t C':%<ª+p1~\ = *ɚ ~ v5ӓ4a~c a4\^{"1rt3k4A?̚`N|c&ƚjV9ww9 +I~%oۮSFALwG0MKTLns]}2WI@%ڏn;<<=:y^M) Q)_: pTbd6ˆOG{kG҉Պ~?H)|ULR , 0 jsCt=#ԅ{FH+JF8;k#-h3]Ve4CU&zC kS M= fS(^ym3 Zo_@ܜ e٢hO[d3Z3Fp횔BuC"dR ׭HLIYʳA_,[0Y i3$p]ཱྀ?l&U=3NF[mYό6JИq#O=3Os;q XG~f܏y-2>m' [7\o\0)*< B0 \z@. j1))i0XBs0x,eׁ'Eݒi*C ]T0햶OR.)K RqBgI8H8i}_{EUfGxR 9̩ICZfУ,ʲ,FG#b 95,._e\y̗EƥQ7 $ͺ+3$|i|lfۇy>#Qzn~5OgE$+_4lu';>eYGÞ:x֛1a3MF1(&Z/%Kѣ_b"d"=+TpNo;3hKࢍT?|ޗ+ =1OrlA%Ե?=1}nYp^U 42Zox>dh:VJ uZ ZG3֡qe>dmiI>޵ǰ-N<nr 7q 6뗭E7qToOG.G|:rG!<ݫи+o<$)ߞӀ߿j,}J3W@"Pt'ėݚ ګbO0mRGgfF{3{{Aߠk<2go ='O`(XJZo}CwV{g~mh]hKf1$,t?|l@Je2X "QRUC=|H96$׾=.a;]湰SEԊ[K_h)ͽ$s4M 0kqW^{<|mqҬgj]r>S#|9/QfccDIƠK䉟{\VQ1wK341 0KKvingB1` -$. mzѣUҫQ%^ܗ)1)͍/FB m0mtCn?!3O$of"Dh YTZ4_SP?,XRvAdž4Cc.ĘFgL&6uϠЅŇSg,>U1j5|a4q!s¸ h]QTlީWF !>e5ȦƺM^0 Y*c sGtG)6-IB93j*U~MұbٌRUWjӧ?G;D y0a5*T6Hr<NFOfR N|«eHo m6b3yXmsy6"H`F돚UD%p/S&@Cf/LD({5gF: bv^Ϳjc) .Oc Qzh_c(mQ  T(vr# S0npZN5-3%x>@#z2PS(DSـeM,ʏxm:T:Z%8y[!t {>[XнdtCKr1mI=5*KCm3qQTnB誆Vo%FUYsi^NhF0OD9fRW f~誏],f~dW#s]n1J#mlRYha6[VS:U9F^F*xTś3fv3jgGSW6ń5,k89lzgt0>֫"Y_Yԛ/~K3Ⱏ1^>RJsWROR&Pq*vS_L$~TzKRtGY Uzc>b*{L~O+AoIGrNe.3mŽgSӒX j!R6Ye:N)[;q$]%p7on.kd`ܜ,oYLRyB#:f8aƏ:Nm4H4p3yfMt}oXU{7׬qC5{ K$JGXr9FydJrv. )V]ыo5 ;eatnAv'>z_#A@xfM:K-yM]Ę2]YH4Dc t`@rH)H\Vj  kͮ?#R#ֹ¹#SryXwByNp$7/-}du˗wܽp3bu#]E6-Wǝ+gǟ\ٖH7J Y[TkiW^ =k$AK/;_NAI-Nͽ! }n$gm}+7DsԭN%XAǭM2܄.cM%whoY<|FI3#qFvFP5?̨Xx T|jS/O1O8hslv0LC,/n 9G ;_?R9X>ٲɀ2]2hUŒ 3Ex*R9WDO1ȝ${eMϩD},{6ej=kί܀-rI3_z4zd\}+3\F^Zci 4ҿv3̨yk$111A0J.3P(N/YsҵBB!`rWMZy|1U59=7wd*T ǫZO *ԭ4PW~5(wAvo+]P m*77/»eݼ@my9Ekf cwAJ9" T zfs1@B7wA=+0P:?_E»/3U#!] 3 u'B^.6 tK3" U.b U%y(wA}U.*TtPzoy xZr uZ<<{UZ:xj#ie UZʻ5|?W?V?oSz|oWy U 8j^*D B]P{]_xtEx5мJBy u:Ҟ^WNֽ{(Wc})hƫPg᎑z^Y$GU«P%1E«P%;(r"g9(}Mx*$Ӭ5 endstream endobj 1667 0 obj << /Length 2848 /Filter /FlateDecode >> stream xZYw۸~PRKsi=3nNK&EǜEYL|/n@R:O"K.pA<2Gߝ=?%zB2BDщ2Q&'ɧD)bQDM7OʄTI|_o~x;. Qi5AJ5bT!S1Nβm'\7Bi I*%s֜dvU1$,T?q1:3E8YT6H6q`A AK˧ډPT$)S3Qg Ea԰)4#S.l|J"dY<'cpYO P &Jڢ]mGmAF4?N 4iMMC6D_mAՆ?]!۸ W\nXg:C)BMTQ닝$pB&]X@>^b9w/f&ќb_r{H` d(¼2{E]V1"AaÚsN1ZiGbjen hVJ@ܸ{j]{׳e^.zS,(r섴 d6cdz0:Z!EG.:=UHСGrՂ*խp_ZB@O`r(#sz pcŻ@_x?AY m$q]4N:KK> ㄐ|(!y,nj6RI #U:54PY7/(IKU5Zzor/߾wKЮkyh!THf=QC&h/c/ҽ5`V|ip|iۨA&7P )’֚AXG+Pnĥ!_.Z$(ŗmW@N{rBXn)GgeV J` kfj/АYo6R* A=g\otG]?qzyิYρL-cK=6J=A:<6$bb n*kxOUrHd#j ;4 0 $oi;OaG4[;\fiqh:+M1 9lQT6P{{wҲK ;{GYb\n\$2Y meKkOwt:_}~#;:IY%h>r\d;.BECPt;nLCPS& e#n{@w߮gs[Z;'Ňa!ͪn"3//ǖS|GNDހ(+U>T@ bD{FyJI<o֏8ct & fPdNʧ8Dr:XM _mک(ZϏ7N6E)ۺVmJ ּWߓ{z endstream endobj 1553 0 obj << /Type /ObjStm /N 100 /First 988 /Length 2286 /Filter /FlateDecode >> stream xZmo7_oM!YN$ڴ?ޫ#:ޯg(%YZK:4w p8ׇjPB{ovN^XARF(ersGČ= @bdE!<3/+r+*HϢ0$v %Fމ>YjY锧 $X.\e@CO#zg󦟽2C Ged<2Z%,tv tQI X4j 6k/a#G04aX5!LX v,`!l8ϡϪOс:X,8; ZL.s4|{ lalgim;|<K)K> 5KH>VF*%C\ D+5$;A򍐹t;2Ap6)7|!r 7LS2!)_)lmIEwkXJB#;Z'VBd'zK 6[ x="[;۬1 ɜ9P00!rI򥔋FRHX|͒ ba1`d:t;],K s_2<\a&qK{D35I0plc- p $k6q\ 5cM%[V(:cvCzHۍҚM_ϛE~kކ}@~<꧶SԚ ҧ- m'&Iο;԰Mζ ͫnisIﺒ]97u.vyY ~qCOtS~zfj=VEE_Z;1\4Bӥ-b!5k/"eh[֝ :Q53%?$n=_X+Z^ӚzECe+3-Dw }B8j0D峘[: endstream endobj 1678 0 obj << /Length 1908 /Filter /FlateDecode >> stream xZsFBH{hj:P:1kp,GO,ɉ- 3@R󣧃)p)`X]`bi6l hZgAz8V2xѓ#.'i#gOw/{}bpgBNIAhc)rdR @ǂ!jAGP95l b* 5jH4^'E:۳ِ!!x. ),_6,Em ̊Ѩ l lӔ~1lxƿ)S$6[HF׸ f! Frֱ~VVVG$dTYrBP2R˛.`3guIr)8C=;E?I*eb-9S P1k@hYUM P"bASdu!pc'sBc)JDswqyo;b /_͓l9.P#Oj깲z /3oh&dW8)V&.o#"qX=&&P$Rv)$3*uZpHp6t6Y7i(.m*@te Z(l% OM98 _{ldڒA>= t(H 9>ޡ֛KpqT֨gtvK4U"/PtTdEušD캈2`őN `7f+ir7Yh#2jf$YΡ}VxwqqOݐ7WJr&cr\i2N`%꠽ċ Rz^"p3/ #j~ԗ;CETEvXH]ᤩ=ԂgQfKS&[t;aWqK.xÿRŷi JO_㉷좓uap)L\v61!;X'B65=9DLUb'~sk? o"w.KYJI#v W#CBu0}V%7]NTtx(v}Ua-l"˰:Wհ'?3EwLPvqu׿PCȢ~:XtE\ϣv2TxcYQgji&,e5S zQսILPKNvEmw꾝a- ZfR$y'MJ> stream xڵ]o6=BȓŌH}lK mХyAh>\Jr #)[ri7 ǚ[藛 Yu3BfqDX7ѧ? deMGSe8 7}ٻo? #rz1+&q>q@4E~`8l 4 oa}S1eIy .9l]DA`G(+fp)5ke h$#ե&p,94p:Qb`>d#xاUrnx*yRscuc@=xŽl:v3eLLI,SpݡB3Dı9- 2@:4#%u9˓ vizӡw^K|A5/N֞}z9;VFX!9 zduYE?<+ t9iA]Z;` xcd;IS㰺FT&PLj x~[c>~SZ})yWRROrwZ˜?7d 3/vND)GԮȇnjfA3{*d }B:gu]׳/V[޽4&fqA3 9ű=+eƑ]mlRg8+||Yf"hPO[gkB&RCM$M. ><[g nxUjTza/qq%88S^Fxnd$# ZDvM! P c&mxQ$F\o~:M(T_9 8*F\2H|՝DXk:ن /xk /K22iHF( mgW Cd#/1O"83 -DS>b3MYL@#tSqQ%mH՜1IaCh֛D,td3Y)f.)lzBԺDLovBy!<"MԯFF);M5]Bl=s\?4՝z4sZS 3F> stream JFIFHHC       C "  ^   !"#$%&'123W48Aw567BVX Cst(EQRbcgrDFSefuU<!S1AQTq"a2R3rb#B ?ӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧNӧU.z. .ABl\1=ߩ!X1g:Ut8B,]kv)ȉ&6ONwNTxg%D]}ېHd,T',J~LA%Oɞycby˕V*YK? ֘xL?6Eysfom})ºLS}jvw"&"[4k X :\63ðֻfФ$|'h`y'cGӏuN -ŕTʡeb(p2 msE4a~|QZ[ l?/#JՒH5NyLvr}!ĐtoU?yg~>o+S\VFvN;nFKo5ըⲼ J8ퟝ(rXr;' gϾq59녳O\m0_VW]B̊aN]ǐscf8qAܴWvRX}4pm2;`KYϲ$\K͸[jQPHÔ'&ywm m]-ZLdOڱi:333ze/?Pm/&ev+c(O#+;8LR2,_GUYR?1VJǨ,6ۍ[iBQK3Q0 Y`Lg]y*w]-Zmԣq_,%k a ClAhUfda3/s۫[?:Ŝi{ڵ܁Xl[h&kb 0 }"g7?[ޤޝj-{"?-ZDQ$ H@( (11NK~^Z!cY$!G10my;xq1? ]'ZٽO(Sj!/U,DdM1;}"g7?[ެjnS^Wסrb:a[ɅD6?ydE1zh; Z]F0}&dx*!@UrJD Hw~Nln᧑!{r1XdUR- &Z cUA%o_}~t{~wWghŏbwKY8-#ڐᖿ>w3qKrQK*gpn0F`b|acq>1˅,>+qų@cηk q*E2gP؄38؏W5k- )pX7C%|acf^1g Rh7tn}"g7?[ީO |:/Ӆ7]IGNl[0d {+óhom>A_aP;-Fg @6M<8&Xc-y;xqG3tڵ\mֵ-ڵ{1Ԙ LI>1 }"g7?[ޯOVѵZm+VGR-< qگ-BNϑ!{?8aaSMy;xqHչz?⭏t6&ՈyGɣ  Yap̈́{qͿgɶֻF_ºuZ/ CJB8(Y{uמ$)FuʜG>W ?+k Ae% vXv Q$DYX!0N4[xik}N޽h\F˲;ݮ CRw?U6<4WۮjŨQpҌ< aKĦIDX EF.wT9_?oLBڴ7t{+ : |J*2e^xbX^xƱZAA.Г ʍ1:nmbvJPL,sfC0 :}oYx_? ~ՇB&Ծ9=<}-<45vw}[?BޘNÏwH[!qc.HGuk9Mɺ?3m;,#*vN  o;#0 "nwr;QaFe`$Iq"Nħ𮹹]~{e[ImBP9 jţ#9,%X3?AY yIbZsZU9L܉n z$>MY*R|}OԵǴp}^kկouUv=-6uռh# ̏y3v~_ O#_gowջ*}oz~o_}4[ΫM|]{J|SS$;'=Мs,bX1è&+V'hMܯ"UYc7^Ew"y;xq/=,Q)bv5V--(E!Z k!`^9 3YV*7vEn[ץZ/VŠS*G-q HFSBh1p]^=j+@ֹv[SvbqÉ#J8#?l|^{ln᧑v[Fnr.^s?l68Amqicǿqu{/ssmx=h؋ &~Hye e- WcwO <}]V/Fun#( )̄QNH޾.UWZIטlqb3B(`$%`9YZ-<45vw}[xWsܭ_cL͋3]GoMJef+xC;MMWL$ . EjwZn1^|i&Q`L L/|e!9CqnoVjf9kg}JѣMR|C=vCcEם<O9|?ŢO#_gowջ 9} z(6MD쌥a)BN#D!"$1qI(:nڪ5+k#n8٢,2!HIg#fYscs.[-cuURl,b%&=fBb`.X6pFy;xq[u[fMj`iP w̭ ~~ ^i@j7WvEn^;UȺmrjhE`q %`L_le8;J)RZM5a!49%c+dӚLLtln᧑vEnB_D^k9ks&"R WFH92+hmiٯZ^5{>dv"GFxbA3 b2]iuTZm+^RvLX̎rbF4iL=)gO#_gowջ2#>}5~B׮& ^ۭ@M$!pyx(Ӳ{/ssmC[T_;E{XmQ L@H$,f3139zxfmͻjM4i؜kU9g34 \H0lKByO#_gowջ+}ozgз$=ʻNafѥYZbXnxZ@e`\㭣U΍~wwh&|ߺ8bfC?=jln᧑}"g7?[ީO EĚi$u5,6w90Z&q(GS-DWWNFȧe0;q8qnoVjf9kg}JѣMR|C=vCc4[xik}yҽz0jc",IZ;;VcMf!O'BRAS 2NAݾoVZj.@GpEx59A+)O=FR1)Ab1!'8ă#+3ҷZ樯hF֩FջSYFR') )D&ln᧑wvEnUv'Ǿ=no.Pk KcpV"Ve NLf0$c%|9*HN.NOfSDDG$~{)U3rܘ%tՙN:N:N:N:N:N:N:Nsv=\өv킶mXY65s,GIF8s{8stlM3\iePOdFX sjIwbY E'tb}%J=Vz3;+yqɻ`GŏUXFhSb"䝣s/_wo Uk+*}8fyZk8S-`ygHЂ|JOnM9-dSS1Lc&j%:a bJUwAWw [w=ߛ5 -9tyw HT>IfLUqP?;|` +$oYde@iX!Q^ݫ¥[Krs3J1TYc+1 ުeר5{&v]:pvuQX3RpFL1+ }gf[ֲ*Yq[.x&-1A[j4S+lx\yAD1%_O:Dַ#oRK1dAEb@d2Q Nc zmWGKzv̡.sAu{ߪkr5)XySOq.,e&[ "\M~xp|Ů:UnYlTqE F5sa  p!}2q-QS4~Dj{չ'a@:ҁ*YΌHL 2#Ch^|]] ~r'eo'ȼYaC8"ov!JrUh,nZrVhX Asi6Z%ӠjG?i^ DL!+9UwnhoJ݊?)5D&3.2Ac u5H=œm]X:ûª@+*,l cX1v8qprԕQfƻS1%mF1a2c(,AqQ3մNDַpg6}c 9Ă0:8&! H2B(Xn6.Ta6؎7C& `W`q^^PZ22 l(nhٮms=C[m2L5oaڽFG)bA Op"m 3xq,Lc-Z^XpVY~A=fg5!2&"Ge=ʿX'%V\i ^ҝY# ؓ]`NX!!(JU_%{Efmm74L@HC(3Ks8:hGOϨh %c5.Z783A 0Y$I9M]sHJb3%kM{Yb Y!y;~9lx^.+zfdz &Q7#+v!A=j[[UPU;{{fumrm4B8D) ,0c2qcznJm5oȋ9W=Be{cW9`a*dPn0F`c1|cew e5vJێ6h q̈RYae3LW^Y\5jͰYqJX ޳6NÄ~Yq`/i 9+,BZVUUmbOZڽ8Gel81B#cc3W"pW*ߺMfQ6J.IQYLNXGĪe0Tju:x潽vq8kת#A.i211:8iuv"oYS*aP!2I%k\,jgyut%ȟՕ7d"gq xX؆%)yM9ck5rUCr'wqk9N¶QZU\wyıf2h,kcyiWQI <޺3!#ɂ E`uU}OqW4~M'Kkd9ϊANQB$1Bc!D!'B2[O[ Zu?uj-҉odGdb 9Ă0<ā0eA%F26z|i;-ֳ9n)XY0 bOY1)H[E}OqW4~]iڞMu[^+J l!Hq|>|  E`;k~Zr?-XSDZԃq|9Pbϻ#}]$Sgd@AE x]u]3gЩѦYIrɴ2XAZ0aŀ, ڦ+,klW"&b`2G1 9c1%9qg3ֺ']ͷ-NJ;[Hԃ#NYȊOq,%ؐ7W^_N*F?ީSǪik|Ʋ݁WOz+2;4hdnp{66$ˈ#FڹMu8뵇`#ψvp&QSͫu#/ aNtoLGJ\u=MJjfGcr  A\M~;Q}TOUQc]R :.b2&>Jp7{GTU ~♉.]Ƌoor$t.̻>̽{D %~2,gZs~䩹a 33ɻ#PBk;MXq7i'zdۮYa!uJ pIR,ӑ⁥2~hyT\VduؓQf$efPq,c3NEmSjPq-ֲ |g kD %FQxc]+t5-Zv$S !E3aYǿ#cmkZ;6Ӛ)CHXK2^28m|cXY Pj[ׅnl.)uD!WDxX+}`T,?coI_֣PcKXwol;(B^Gj3жu5[D D X)2%0,M L`SD` 9ܫyjW-z>Xxj÷|M{lr46 \AbIӄ3 1cfYPbBa֟ٹ>[FJܐ1襘 ز2s#A1Ќɦj.0wM>" fv$$I]Kq-GbYזd?^9FΫM_)Q㯇QikY;&Yg7r34#LYD)Y}~ѽp*K Ϥ}o=/3xyLQ;{s)`]}: kH %5o14ٌbbZeـ&QC+x_q Une=^FAZqx֖bvQ}a_Us}Vl6k jz3ݭusvٯ9Gn('!Փ՟(&Ū/4^\!:0RWp !2EEɑBr(,S4_K.,V+Y3c" 8J9G3sZi: uFZ2F#0TSʶl\WF󞨌f#ٜ_?PҖwZr$l*ts8!%qe,{ތ_=jon5]IcLֱs2Zω  HxL(DD877/MPɜrE`;;~N2f~(yi bHIY#zy{s_=v[^(Klp<3(%Mͷcgw_ʭQ*j'l>P;Mɩ=6E5"HKC@"(j`,1fX}v|CpZ7Q'N j|庨/E61{WP]ӁD9QR|\{u[kحWAXU>A ~1ej[Wr?0_bn د/͉+! 4p*gj~-vnyKSڴ-}]\b׵0;On$HHb,VJAgוEkǿT)KR%ݪK1g DH)K|qr2%չը j]izYećqK\̳ñ`hxrӊ̓F48?&F8팆9f9"4_=-5Jx|/n$qIg,f g8(ENU= u㩰bx|h X#3mjoŐݚAɮAѯ'agFu>)$?@r {;BմmT'x吋)z'ĂP1H&V`{W WbܻJFrYTf_c"'#UmŃ6;XYlpI׉*ZXAB& ϻjulܷM\7{RfBl#* efW/;YeavJ!(À^5b,]ek!t<`bv3CrC 3̱5?0?;#ؖ3(DIJ<`Re8fN?5=rv=}h |e^iFqʡLVoDL= Ċ\{ޫ{i"# &O`1r0H%)j\ Ώͬ5^^U1ԇayVAH%@qo]U>/45}>EZb\vf)ҜK]C!sӪ+@Pr/ 5+f)wC8DG޸|H[@!# &\/jg(KNVXbU9)h%D-2PqƹWZO^ ?i-D{8iK>f"))g2MmY>eAͣ.~ b Ґ\ AlG0]hȘ Z 9[MoKMyI[h|U㸫Id .}ٶ )t 62%+h$}UnjDE0_S~vP|j꘲u4\UDy/n#҆T 2E21uqWʻmדC=EXNݦ&!a/h0,M<i푀,i6G" vFRRF CĈc!D!'B2@SӦ##MV𖷬+ "xD,BcZN;****+kb,8#b81c1uկtzV?oŹ'fUrmC3SB$u"BC`~ O)a>ٹo./gy;;{ o+~T9#_* cUsa#YMvݚ5W#vGab(z!g $1x9#(u^y3k|vd60lH*,ʼnm؛(")F.[DtJz+qR)(\shRS bs! IH$9R3+iT-piաQ)ZT- <˵VW)BPaBR2G`0t{u*]&Zq;Jx=Ӝc|218: s,nU=7U5[}l(vEXf2*2?#9 i5]u٪T>MQPw0yI=Ӝc|2180zKTqt-eD^rG[Y 2w,֙[Ue $a.ѰŁ:?C )rZhvݽ3Dmţ?Zc`A"*u;_o[gN貭BN˰&3?iEB2(Ipˌqa=OZ­zWP<0i`$kd9F s&hSc|U](?.e:#y(Tq4 L,.LSiѵ[i{RZX< r!I Jr%h2Ϸ1+.̵SÈj; 7Z_[E #FhLRP? .}>H.'e^|[[b?Nwvi V-BG2 kBѾShndZ Xq0k00UUzs[ҞZ@S^77:W0IRFg#se|ަo|=wHT=@)% G1,1?w黄Ӕ Fu9R`_f' D*Xfys f[&/|^_7_ߐOowEW/>r9l^,0! cĥ9O?5^nڕ{lZ%=|aCȬP dB`AmrZj Կ)]_L>cˀ)1[})GWC?dzwy!U/O܁uѢJjQD01e0Y (x_gױ4@qGMG-m;bϐk_8 >?tzlhmVu^T{,ORvCa g8̳g?PG.=gGZ61'gwdsR\˔OIEGgԾ<Yh,![y^6EKDk0j&կRv-J>㮮> cai Yq^!hhHO#(Ɩc K2<\/+u>h^7mo=׾_յDGy{̼ycpU/-j ԴZy_k%#[6/g18ᜄ~f ֨5^ =U_Ϲdc1WycS}ݜB#cM\7-ݓuI~J]FzvD ".!a~)i9(FؘE Ɣ鶂+/Ok]e\M54u9bC(bPeKqg:>{-STq 9 k.&LbFy䲔c21AGh{Rt; >E%bI"P Q4=z^z}Фyռ^?g׹Cc6<1c0x!`FsP8_Mֶ|%'ٷe{]VM#MZpY3$ ʆ$ ?i9$zO}K˜JSpgw DhR8Wk ljkWf-WP)Ac,dHC #誟OKTV5+S82F1%X3gqz,x#[ЭVg18|3(H(Y^9!yiָM), .F)b^@? ,'9}/lyWQZrznҋM|:B”0ePP2^ZDQƠ83CZjziZ? _^o,T>Sl!{9}땽hj %?,b7\L1Q1 8=YW_dz~*Iv?.U_ju%_?ni7`L2d,b1$''Wzb=llAj  (daQ̖PEO IW`fCEs7mw9c>i52)b!39HVW`3ʩ?nW;查k:ndiyaxj,+yϜ'#di,CUhUWi:U3 Zvqo9̌$crȆ1}g&ʼqƟ{UNݯ5heB)+s6or8!2JDcQbsV;]^5Z? 'Կ3R> "hUiiuTh^ LR3f!%s$IR̥,+]|T-|>)[wJe9-8F%R=O?Yk9OQ?;x__j(yj {dl{#;1ڄ<"|Tq'2}|(vSEc6z՞(l#jP]!w8!2UϐN*F?ޥ[ouPeÌ0".!Dd1Br귪C;[nf)B!>̠6,c&1<3lKs?_퓊ѥWVZݨ~*_ ŚhNG%)C浜bRUJ%xb)l* ooy߇k#n8>,2!HI_b0c2qczS!Z }:lRq}RWjŅ&+ُ\U1Ȍv1.RڬpgICg\lܲ=~^_~ڏ0VIK'Q][8V8uأblml^nrLٝf%þQ8 BŁ c@^"#x'7ZVj[<ݨXb`i H ጘbIJSd=Vִ mZu;;2O/e\+̑+R pdpSWWW-zfF9)oci &b%,&  C||Lճ,E {_=Zϰ}?PerYYkb c嘤!]hmNÜZv Ϡn a,cY}K >9(KdE˙4oS'8C{* nJg4`ox+35((f)CAc +L={4hmg[vRطoMPGͨ\~ G_/_Iz{]ĖZzluh+g2XĶ X-X!?qiޫr}>nbXJ&P!>G2>.*mS-ԶX݅ܣH2;oRl%ÔcȊDbE|CzBnl+l͍u 2!VU%P8 #}-~h;MմM} sEcN> ,qH#'\ hNP}GT^z=24ݹ~IFfM4,D3alӖ}1=oͻMJW=r. Z_kue\v-3YYFXw䰡1MYҺmfߨ2kvsڲQyٟ=Id-A`zY cðq=?r"r8uگxI|i+f\Pp 93i 68!YZ8U9NJOo9QAx{KC!,9~>/9dqU-kyWRX.+7Zpeh6M(?~#,#M^}ݶv>?WJ6F1ah`LA2E4OF9|ڷoUQܹ%X+`BD)+Zv]<`2* 1fgڵn,ܵn~Zk5ەDR&X\3vDulF8!cSC^l\ګ]_تJKQL"?>0d c4Hd9REj,v6^tug ;*Ap?V<,sg֧muT`[eĢryh̒%0C G6*W~ֽISZn_UmUpY>a+1Hf8&1Xa3 s+j}WX=f}pEExY͗}SDyE1p&jǦ?aDwx\W8jrWiEO=FR1)Ab1!'8ă#+3&j7>\0t?ḯjAڱF;,yMDq.Ce0LҾx?Kou iPΗ!_'I2Q GBXˊRT-SV4?T6g |f cy)BQ!䉩@os,"glV hV8Q&0?&bgie9CϟƤ$#R<dx -A8Ɂj˙lk?/}M(Dc!C!K 81E938OVK|s8j)m09=IFḇ e 1!ުT}mCoKqcGǜHQ#:# cz=֟f~ͼ>r嫤 W#dBlp[1ZRC|jjS(l*4uu[ WJqԳ``U$)\q#s}bޓQSv7U`le LL%I Y"HN3UqǪ#kyyzN6`{m5:}yYl,%$sdEȚ+!zmBC JcV(<^є#":mT\#5W] 2̿X)r˙~v,?W3m\7+P|?c[bq69Aȹ(1s8q$]횆:?֬6i@<,l.sbJy/hXmu xjK0JMMWa,k\sL2blXDDX!1δ!'W5>ɣcl1-lMc ~#}YS*@q0VQitJz?;ȳ)BND)RfD1Ī)%")JRi^$׆~+ Ƿ#GU㦔VńD$e0,GX):g&pGU=>x(j5զG91˳)L`@&b!qQW~- zȫJ\V*ThTegڶkG#HasKmɘz{z(}^~V/ٚ}lOP)͐&̉I %_W`O>q_z7|/ԏ=ļun7|kM.V&qeCE1VP㝫Ok7gSgwgw4, 9PDaeP]yXM`9&<@ F<(H/`a } ;i{{nn2yK8e9"2BYug5Yz6jיWӭakXF-BhWwk Nj laD$*M?TWgP o<+̾"PW:a~Gi=_յ*s'O,# !}A8f?-Uugm.^s>)ΩgN91,{gv1_9`}-ѯ}jr̲ls@%\o}ajuQ`5^OO/>ca9&1ȫ0pqriklK ;]1ӭrrgijW*&B)oJZll#L%c9}1XX@?H-9G4,mjeI,H92hKnUح]Ӹ]nfjJ1,!1c I9O/[oTov1i(L=XxʩJJƢi qF!8a#c1t]+-K-{[2BHzÌ_\`iWi]yKESqX(M3 N^3P(xJ9z9u^߹ueiJ@!PI23(c%{gWt559aR&VX0IF1gqne/ϧka~~Axq1;?oF0${cH4^wkR;tbɧ5e;P 2h_ DaUg81=t 7jMZ.u9n1FҦpU'/(yϼ%=ywoW YcGzD_;qobN3ϟ2`8Ózkl7 Ul gfYSt mpe8ZkDcU^o:-xln}fJqfy/t닚UKVx"b &e6U/o >\k_bq70ZK@ P)P lRv??1J˚1?yv "G1˸ZQs5ҸAZqΏ굧bM:JQdY 1s<e{B8&: %zӶ3OX nPvFõQW Ej9,r&82`tk:&xϪjk_(ၲGBp0&IbsBVToq2Ɠy||})TwokvI#G/ɗg0|kľ_YW?zFqu輑E|N֢ŋJKfJ}؎s~C3A2Y"q@zHN.UtӠtӠtӠtӠtӠtמ t f,HA#NsF8391ei)1ByOAcqv0J$eudyvES}.K1>Ckb߷e.9~` !1AHK8YQO")=L4Hxgcԫ}I,X,TD[(s̬5cOڗP}4iH﩯&l 9: Vq HC"(WĞрav I d9W\9ES̺i9 [ W\3Oō#iQy">Ir}pe#ͩ`ƻ- *F( o8kj7mac6Xcy!1B1V7tC<'os?!3xǃ/Gsp⢽MWe؛={n+儭q4  y$0P_iij[Z򽫺vfv\ض$ YM PeA!dĀ |)P E'myJ7`#/lv;<+iƵnx/!LBy,j]ZW9z&㪢i\kĝrbkw۔c4ѤlgGsJe&q9K?S]Ìխ8J[4)jM3d,`qDuS6Dl/-{"3T?M3+`~Y𓉊cD> _&cU?On]T _#hZ)0'ea9pTQ!t5SwoIkNY=u!C .#F8F"?qܱ/U'T)ag :6q X. 1!*Kg[MǧE]BN:bbl]]wGȓ17d%g/"о.QmUɫɶBg[))̋dBrLN*jG93g+ג\\u^4'(1Ȟvi([1$W&r|Y*XR &+욵-kVTiB fJNuj*blQSQ\eu5ο/k˻RafhXgEd !upes L!akMկx\ֹjG7s_U,'-q ;ikx 2Sc|2pnSh{0+jگe! ha1ws$PzU29sC }e5z[}Ki݄a嘅cuYZ$!abg󔂫az/e;i˪PB휃+gfZ9ģ1h\9Ҋ1F?l֮jTcf`=}<{`R29N"d#`v F{8ڗnxsY/J*nhbb7ǝO0;#~05q []XUD5<aPm,B'x'TOmb1ӻwl~ƶHDnbRغ /9^PuIYj>xꉵz6;J8NF$D)fY8?m"r?'.-UkٮXZU,b-x'?j|@qo_e;UK_rN:0Tg"!%͐!yBϪ[mJиao\@U:p )Y4b3Y\y|qcpΨom^߄yV'vvj֌Ls4d;K9ʦ xJqk6ڧxg䌙ÓyB^\%7[^F?Mu#\)G,$5l5|lZ r]6;6'< 55n]vːʶOriI&sFEJA ! Ƕ.㩮iW>UȠV@$$2f }c?O2[r;x8Oc{!t@XrG/)E^ɹ\J0?Xe"(M^y'nj=9[<$UT$d^ɰl^xu[nܫU;a ZԜs9%I9xnjR#H9 VVt~EG,M7Bgb_l`(| Ri Ǻ3L뷍 cT3M㹃Q&0[`_A睕[wM ${wī /&W_&qy5W8o9MҮ}+s/Aĭ586H-I[dg#(<~1R]YnN`Y&dc!FCq)JbTr ߕwmU;2fXw;S,~4pr3$pX)_O~vncNXmH.M^RkITG,Dk!-/siIJm Xq) Z1)![ccfp/iVY3&z&\[CuF^{~Px(#y XRx1^MAڗ+7  ٜ; b0pe26 `)Ny\zNl-7^Lwm*g|X-zV.LPJih1 r'ڿB2X 4W-;q=^ L;Qrc,2A{jMab XOVދ>uZu"M\Ncۜ\AE 0E~HRr ~h?j'К(F2F i'ksU~?K'kgy#D)xs R3!b# xA.%6{r kY9è64! iUdB8>4 l/eٌ^Lj*Xw[k[G}*jªpd 2 8Aiwt 3+:{!yA9uW(:-MV~X|qm||KUHAY P,@zI׸юLJvj{,MgE+gb/fv5梶y(2FSdՠK76>xS]Cw g!@vc0|C |౟^*TͻVŁNF:$y̧9K1O9^"[v=T ߈v[LSZǷrjɕ< hpVIVx9cpҾʜ;)wf-ZnJ,S2iL*,G>XbǗ(eOԱ?Ycm+`LH4&f+yLJRO9um>x FkVyÏ>Mu̒;BFq,{񌱜~TUM!⃚tSEh0ZXdo&K2j01=kL ENqpTUjZf^ `*6$^Ie)g?sƠr޸`m^mR^;f/7Eh2O2U2ό&*ҴUKn/%qg)Hs8YeJ1#$'(cYe&Ѩ)~կkT[LɜSys0L_"`HfyY{o.Em#UW_"rsm8[X %FQxcz}qi+'bB\cc)g9ZڶǸ'kvM`:E!*kKU !dCs.r=vZϥ@Wi k3gs yY2F4BlZ]#3]: z]¾ZU@b C\J2Ċ͚bI"nǮqոRo9zf4g vb1d&k.d潦UW\{~a k]g|62v>"m 3xq,Lbg-#ZߌkTñ̦O5ȃ__+3iq>E<'{Y>Q}oZ/گwIi=*kvW87x2{8LG**RZ)@_7#;±`k 0c0)#Ȥ. (oZ}ލI]v$#FQc G>rA \c݇WKRe*ް`jUlhs(`Đ!rյ~po1iMVG/{v8C>ŐNsPuq͍o+BRt !g#ڽ #.I0!hTdGW(RU~XcX[w?U7w @$^ (5_a8 Q`uUzUӏ_?k6oiiqai#8poJ-Sq$gUj偌uQ̤<+!zpI%G5WN^)c[bq69A(1s8q_mjཿ }q'Y2*K=X2\~^|Nۙ^8o|z 6r%#n,@*n1~(qX/|\O}k+Խtҁ?4;{Q|g!?vWFkivj~.ϓchT!Rf0t?c:}>D.'ҾKލ굕j^oi@˚(T3힮š껦akmme(i>Hsaƭxh97x`tוx_6-g}Vin9Q`$Y8.AM0bs8XSRԗө%x;a5D"% g 8{,Uk3Ef?ZklyQ',s07{Wi\tUoR^M}5D,2^,LNl|"H|VY4a,Vh!5q2}O.!+V8fMa]yj2fRZeLƘg1PC5Ne-=w=Em_ZFl]HqH}0`4pH4 &!rzuE.ũ5ڣǣF?{ f&1ٌ=Q+N? xүc`>tIic uVF80,L!e^992{-T>5Jnl.w,js`Z ,8sZgZ-?kTѶk>핚KBX@2ĜDp(aNVmUN\٨qslRW ׇ%}b)C$01x6C2fU;UWݣ 8ъ'i rv"7x!$KeWۧ 1HWcS_P\&y48)8q_\{ێm_?'BcwKN_Q qO X%Yk(Ӻ:n-Ym  ,2q3Z?T~Bny~X8/I\H^ƧF.4~U-kilܗx̐@>,&)8 #=TC}~ejSrvH}QIƈHFϏ(v09  \=qw<9hm:ujB$~׀pԘ /%Q$B$A,G܏\.SKAmn:ѹ :ӯ& 1`͐njtDJ%^]?R+h߇klWi>`2GFHf3Ks8:Ø5|KQ»>_4SBB 9"i\B97%E8*@D#9X<~4gr|5Nݞ36Ƒ! 2k[HSMP#rS^=ڹL⫌ˑ6S붱-'P]dٗLR@D. PRW Ɇ߽`V,1"lL< 1)'>˛r&w-4.3;as2ڲeu2 98;ɏ/^=~&u4"|:=զ{<$] l| "~9sO˛~̺-O{yzVs^,^ۯ$ʿ!J!r{K}MfO s(_VF  }DM#DHN 9ۓy-w.(>+=$Z$W8Y#4gAK[YεֻeEyn5-*xZ}'C^.R'd$y4ݮ4oa Jk+.Rl#)L?fB1fgsZ6w'IW}q@(yB3ް,&($89Uegwƺ/^ Pkܯ ܌Q Q9VuȔ>ǺjY4P֫2E_/ WX50ɘ @6 WhNfZt.l{3W.P,S8Os>uc |x MOjйÏ%|uvfJb5Rr]HؕUayc1jLkW.E}!'v\ԺҪUC1ը#Dy}MqXIyG%5}MA}ߺJ)7on )^kad %` 2kO,JfFUګYmuNZڶqτ939tys/&NSZ}@nLmL&BhX CUkH 7[_NZUKk,$E,*%0UAB4XG&|,<֣HsԞXݝڍᑝu|Y"1/8'M]<^ @d'Q^O{SznJM^|ٴBso T,ݍdpxU6@s  U陝odol%o 8㙘(;E#iAm$ B=S[VqWN?>}}Q%YiPBQ!5ɹ;),*ގe8$Z6D3'4ZKcnLH`1SrK4ɂPi62%Iz6=[צXZ|T :(J&LZ4 e@b\Z\U Mkv*߬ؾ JɆ &,MS)Hª8Ck8JxT=5jR0o*Y CYu|BGRz꾚lv*\PPks:%1Vy8'e&ք&!/5 E06)}PNx]okQTr$]i27 @.WJyO9f?\<{y@۟+ӯkr2m#l@?!C׋ k[,Nz75Z-l:Ћ@6T@Fdk[g F3e/5.@n/? :6- 6UZQ,&#(̳2|ze5V_xJ(lc6 'rJsӎ$rf!M(V;Nn+ ]WDDcJ`e/T'!Eq+?"]G2nZC6wOKqjA7oj:&-^*3SjWn7O h* "{>]țvdW'D気LLe1q\һ>!ܹM%@R"-|IMI@|bJ?tS>=j'Zjn$xZ3HF +dpm^=-7a5Rsq:WUK$̆ AcQȓD )av%//c0I9V=6R\{Uĸv]ڮq"JPW ,S {boҶ̶^8o`GPb\],JJ)1"Іja P_š8whrߊu+t,=k<^قlpqV>5UNJ+..n)/ ĆQ4Y(ı83ɦYpp͜uĕZUU}} HSɑp F0 eݑP'_Nw 1{Ӓ\%',)nۋ6lg)l\xՂɨHU7-ϯr=}SQ5v6lԔl)א@F2C8l(؆Ə\V_k6b3/0#f"Jț0u=cW.8`Ry&"X%zWv#E ^MM+6mIW}zi1]md/+@X0;q"#?+8g=/iSnF`]|kwq i#2ɩgga2B}-qy\ۆX/޽0kA v06\ y 5((4 uszϪs?H\:XY;w,66,b6b쿧Ɯ v\oa3c8G=3`pt_P6OY/7??VUNhvi|mFxV,Vxcdӗ(bx|SZ# +\ƫ5KCD`5q&8;'LSUaC s^{z;{]D5s$B+a,Dg?3 s Gjso1r5tZ=f -fS{"SIKtcsm6׾hմ<,[.Ke=8FFs,q ey6<8W52R}^A֖f=Eͫp%ĕr<rJ.m 켈SmU8+Dq BK]!0@3䭊ugGoj6:SU5*Nr0 PZṇS]ơ\=nihEvkv[xg1:,CLJ2mq V]7_ȫv&XLU=Z.]v25$ǽÒvϜwlX1eeU^1i`I7g㑤Vx@JOZ3N1cjGu=y^^w]yZ:I69rp*"i8IaQrQq'25~._u da) ͞#y,!S'&ȿN_U|r^wV#*mm@ )3fa7'x%#]zmYOΥ~dIudsl`8 rs!f2`km=ӯ%k CafS81 X pq,B}-o\/Uʺ;gu\8f@ZE /+ YG֓ڇ1']|UugЄ$%W)~3{J.Lf(ʽl}Dm4[Z5Z B2 FPDH "F$!8N1eXqroխkShF>?A1\cfBBg(!ڿ^X?N?ou!b=]X~ [J0e& C9g>ڨ9_BڃqǍv?)fSTw\oUË}P-ӦBd# /`XyS%XWkصpޢy+dszUVQOX/f~cOXaO0o>W\tV#i뭵Vߨ'OkX@׬EdLP1Z9qe!(Q9>=7poƞȷ&{g^L6VNfTZ ;C¾()j7+Y#ʮOZUF Gbi ɖ 30=W"VK&994M*E0 2Ŏa`zsNQ?Ew DZR &Y?$T; N ㆵV}߸z\z ̦NJYر}T"T3|xz_Sh:U\bMO]`qRlD=v,>"4&qā\kաv _,h)y'62DX;bx|2»\>Pg+0L 7O8Hy|ў ܅/dyԿ mrU/1gXldKj]I%WjwfV6Sb`GZY1' RAÓȖֻ+ٷZWBg RG 㘗,^ %1FFg @6M<8&Xc1g9璪Zv8[R{~2*$.RVn$=1(֗".Њ`xcuı>iCOpt0GɌsJ\k\%ӷ̅fD%"+%Y+1յ=WFWVҵ~.]VT!0t)gzz|?+G l0p5xϼܭBӟYQc>^;[?HKC3М, 0^?4 W{=#86WI^Yc[bM 82G9(ı83o5WN:N:N:N:Npʣ}v 5zKw/axbeE'dsbR}|~=&p4Sk5_!h;msP_ָOgr(ȉ*j{0q N2J?V>յ~po1iMVG/{v8C>Ő/Kޙj4ZQ5:j1}Z[ lb[̆RE"!Ș<uv\}/:jO@_HW`S&R\x&nb1}(igJHbg=Q?5Q3LlbU:kw5["E[;&,1M+6\q03!ٯy>!F k>,+G-'kYksF%᜚F]bp|V\[5--yU*h##d$BqJ3 r 8:_PZVȧ WXyAҬĿ e(g%F8lH5^o,ޮƮQԋdb䟥58l3"MOi;n Zi? $} Nx,~sH@@PWzۅcSM~c#~6ea8.=Jڪԗ'٩][]n8٢,H!%FqfY1c9T/qr9Lm)7u fױa\Y\%d5#H/XlgNp7y.5@.txX,^- SYښ6"+O+Aljas (gyΕZl9P>}x끕^Kl>a{)33H`,NeRqrEY7~KQ#fuJV]/N&èpj30͈My:>qkTɲ^׶KNq`Y$mź|܀c j)%J?Qӛ) *d I5AJ=|5; =,,tӟ8w`lzrsiQW[SkIEb>8J0@p7m9#G5zu!+,fe, 5dʨ4*~ gJ7owP(goM@V܏3$C1 BGKMԯQlYTYm* e_jPCg1rso.Kո;U~SttҝBEUdFE:G x8@BA|{Wk(UESǗ5ٝxf:\3Y\Gka\Sy \{Q8'J{aV&GZ?|v fb uʾL=f^TVU6~q̵DdT,(rH R17u[ӗ9rl;˴mv:Q3ML-ӳ@teFs|wUU)u-eNҡcqq1 R:l%ҵ C]Y[G4ztx΃oSJ_E`:t5Io=] VUfki_&\{v;BYW4"`]1%6 iVzo=qndphvl@]TXb0H_ۇxÛ5yڝcZo8/0 %)MvZ_5t#5)^Lc$soqo P׬jC*5g0J%K?k/yCP9F.{ɯ18n#'♆ePi,#J<ͪD7WJYYƬd Βd,,HC(潘@p/=oAD۶kk\[#ēY3dHeDM#R0e ,ȳk|6ҥZ}H\{bUvD _X2*ɻЍ3S;NA iYkG6}ub10)# eb3]F1]9b+Qx5{8ʕPF0zyN&aChFAL'$*d՛i/ڰ:DFH ""8"h,Mhg1LYhr[n; uo~.g`TԍNr};,lͤ;rǮlxo&vp+Yz:9%U`bU^B;M5jհ6H|nI~bt1$z2N!NFd||5ZSJ[OBEhOgS8U XHdhӯ(Vnj_wcyJgCHt&%eXA*%$Xs0u/P.4-^ɪGyLGB/9 Rc1L0GCkLbfwpN}UPB4h"-`7' /J׏AIK{*V `uY)? Qg2։}|Ifpq>Śnhkj6yU_WcV%4)㏧b}H0c3]N]2+Tt__TqnQf Ka/d,E>Yf꾝YUkYK4*L^0Y> UM%G^i!rqɼ#)0+8\!p5z6޻ 6%/ɜ"H$V8JR$C٪5Dt$-yTݥxkBxp'%#ud(nYǮ5&Ω3v;}}} ߒC%DI0'`FQ~ /K\suqxT0q*,J5XPEv's"g(#[sgJϻnd⯠-GO|{>g|7{yoߩ=:S(߫)2+Tsр:kh!yZ͉B' m~B Yj/{_ FL S:1 ky;ޝ.+F.y@ |?>>5ګBYo1'$bʪ,Q$Ea&8%s -Ս4aBS`i̱l|8rB$FϿ0*9c8}r^}OnVCxxӏoݾ|u=7Ԟ^56M{׬!T̠,Q1by"^з-#~} Z*J$ v i%` rfIk0˜p=^GW|-So՜E-"Tpmm7 @HC(f3Ks8:!. 3Ju͝8DSd7 FK5s2ZBt;TPƿIʛ8̶k0,g5j S3n;^l<˭l:CvҼ BjVW SaW,NWΟ9d|L~"͂qؾ,K3Q*Nτ2& < Ky6Qy>YoMtv}RORflsF }92~u0=4Q{cVmAVv^ؠ3I(EY"Yao^?;O ]>:UG/Lb쁔?!\R̄cG%X Z8sJIӤZrwAk|RQ` CV%1!Ē]U>/45}>EZb\vf)Gʓ~B+`{rq%4s(;ωjǺ𿩭w~9-*fKK-VR\&!#1sǻ+|mXsdS@z{V_ R[̤q`<# :%D;.?7kVT7LZD8rK6a H"ɘu^ջ7kc=b1T;CVTBA32u~:fqǙb4ONIQqΦ[V|uL B8DQӄNsD%˷ɗzsjMu5YC,[ Xs]+|yM 1%Y+LgaF`3yHĐd2,: sYrstJEMXhX˩SՌfPb.AN$ 21VntRe=_֦ǀK*-umW}+`֬>Ae |e2AFY%0\)|uj]J~䳗bF~fL̓1'2O̥5)&vU ]Y$1,K c Ó7}P?V>vwx)1(D"N!O>>RY9G]n J|r 9s%\RssGoN@?'Z=/˿/ W`QO[3swixOYs)!059ˮ$,K.X~8r?}3ncE|o |>;{~׺z fUAf"ڌ`{G}o{/o+*gF| 3m?w~yAwd92#Cs s18 20S9Ku}kK}EXѵznƑyMf!J8#8N22 (AdS*?OLڼߏ~?n,y'z\mr_sRn]P CI^Ҝ;,xe,ó}t:t:t:t:ެ,~ wۊxlf"y܀``!wg# OWy=6d]Fvzݔ,{$r!p1aq.h{jf5WDmL1c3ɜ6uKE~*-.y~ V`{sry]8Ls)ͦarHDbG!$k`jSiNk8M-(غNL) bBP(D؏Re'"pא+Z5xYt}S<)aZ'7s/q{Էw2 D $m@l/Š,C$%~^{5K]NaٵYZ1NJÆI\`*ķs*f8ǰ$]v 9T\[]]d]btUH[Bi"͑{y#jMԷnxM$VXpvX=풰3 ;pt,Myyc+K]b4b--UFV1M0t~OZ A9 BA[輓zeӯ;ߴ)r[@iF"|с&6X¾vZkMզZJ$lVd2C1">9 Ca.[]GyiOoAռ3w`t5/! K.URk~-;[jiƪj5cx|鷘GӁ UC ׇWyy`M;iXGW_^u"?9`aTɛ>Fh G$" moT n5E\f[Ņ?Ӌ|%r&>a1b$'P!q6Tof+nخUfc*deTʝc rōW|P/9J4ʽSqV*A+4*Rp;A,A3 `W=?o\Dv5M o$8gU[p뾚> {>N0 󞸿+>}-QMU{pffFmb¬j[Q >0a&&$^E~Q'5q-k詯9_IiR2׌fH %^K;6fA5{=<|ïNNΫӶH =9oA3 1࢔-0qT[3pZU]vYB: J,-\3d7[/J5~הЯ,+vk uE %HXsi2 yB^]x[3Y/Dގ&\!`Ǵk@`#s~5^Axbb{.2^l$s/^RVri<66JLs5s/FcOUʶ)l28Ɠf]}@nfؒDNO?fHOx`0 Io:r%k+ P}}LA`Ā ,c`rwC }mknq0lӫnX4Q0r?0&mv蘶Vt ;GX*FZ%jT(P"ke 8q~гƺu*+(,-kGby)qFˈpe+W|ETh̝1"rn:~XAOO:yR{`6)b;>[UA$b46f[3ԴV&a"rkAeƜ:TY*G[S4dg9Ta5kS#gוh/+5wSw/ uuʡrw)–W,R3b )Y= ut66?&ReS6(Hhu#&ǃQ)utSoRE{_5M@Q=&)'_n-xf_rnRs2*UkqW UE}RW`ƕW}I0 la"<`3C)Mgӏ d/r8_7Xj*A۹̓*J1I̴Ec"U1cqş6mrko{Ũ8)mh&f gmUPaLb^Wn]t]Zuekb-/!#1+%)fafdcNch=[Op=lKluǜ VG#d̈́sM8}Gk^%2'9lj[zD62'9똣f~rZA8C6`w}nV0ذ&db byOu^~[_v.,ᚽⷘ]{zgh ][fTC:< hIK$Wʛ~a[֓lj;E ڴB: j O$"FĆFԥXG5Le!+ycix4\VmΟO^Z(+яW# AG#$hEWK~/=Z}ky9g^d!^rFq̦c3=P~Vr}XzhpzU&Ëkַc50V1gXa )0H. 68v]Θc[T5!3tj U {)/媽0\S{e RM]VNdLk.peS SJn"[ת;npNr-ʗƯQYAZĠlզ,⩛Ff ] 2 m'l9Am½ZtO'$Yic Ps&P*i<Űm۶P( 2dPX0Cy e){5|oa=~6%x֚Vj{6Ct j.w%c6Vc3^Hˤ'"}N`ժ[4o$5Wl'nS8(K!z윅v[ƿ%ClaI-VY,@y-q`cbmy<ֹ__ mʣ'W)[?lQl ' U<+0dskWY6m7`h>Ϫg2}CX[$$BYl몌k݇amVK pꖻU9{~0!W!58HPE7,q,2g\Vi#6g2b"W6 7!7854xCxc^P-k(,!YcgEƱAv V]s9Gk= G ew[Zavl%a|γ87!&T]3DW>>5-i_S|k7 OE5(K3+$S Ee_&ObXJI$3)rƱ;>൥MUEDUJ#o ]RpA,$p8qs`yYrL޻jŨQpҌ< aKĦIDX t9|ȴUx/mDUs.˒pP剡N0s|_ ng[;PصeF%sUZkzM TѶU5>]ʕ."<~(G&NJYfy;׮@[}RC]yq {M,B~[ E,ʘ`8y(_߽/Є!J=|23a$!g̣8uW_Vw٧io^`^3/3 ˲YeTU_%{Efmm74L@HC(3Ks8:JX՝ڸJ^x ]:x_YM0lRę` ),Iݘ߶1Ü?T+:.윳_q6'LLn[x1=!ay!&cV}<3ƚ+NAsQ'bY0'd%)@$ YH|ױ;O\5*6ܫg bOGۧ/+Y %;i+kN&/uդ :5 Cw!jkM1&MߜC[g'5[U2Qװѿ٭-rua8k2XShv 2Hl8JCM=4Ҿy'oy rChm%^*:F]zz;(gN}eAqy۰it ϔ_1YNlyzI!J"=yP*g/bT\Ci%F=r^BݓbR@kYCʹP`ay-;mH[,0L~aXFux̘bQR3nOzoG|r]Ķu?!p d%Q0F=.Ϗ6ܞζ3.?,,^1 b, Igq PzJf5 uZ6vV6lއq"r_$cbyCB6;f*Uv ר-s 730MɅ,r~CbGk[݂msWjɎoX w[{4ZWJDŽdR2F *T|wې9dh95ʲYm)kF!jn+yв#R,K$V;0h{Q5 Ql6 if| cFof@f̳n@9 La{Wԧrg q8ې55*]{TJp㱋dʬŻg }븿_ոiڤT$6\m%+ LCõY%'8GcqJ)~vj5}d,VFU@†x̝r-gBx_[Jܢn/v{LoDŵ B1;>MN4s}8d=7kjZ^)NɬA ڍFBN[βnq&Ҫd[-kaF\&+_{STװ]`E*b|6yPW^+ IsdmBZ.f!ZԖ0YL9By v)xj'hzȤ<:W!/^fZNB9 OgmzWJX5 jTF, &M$318B"VJXu樵" lUڙ tT*^8>IY\g?`lrVQ̋KfO1몹O;zsd#ae_t%ƕ_ kVUTmoJjF5dBsavNιVSPd7yo/réd@:UߘME5OZH>a09!3qb+-d͒oZZ)ڑVUdM )RBfPqƫYw5@XWm-t5Tu{cb0 CRlDYܬh016ҹ}Qhq=2ņf@HR)[X5b(VHIWzطR1n?WWgNh.o/12Um@ł*f?GOWATO+* O]Dx{'nCqU^jt=Ij%8PjDeW!֙$#lǜkVCo>Yq#.Zpwv4Nѱ͒kNR%^(̄K2k|gz׫-6+bm J۹Hn|eHaR]|k.\ߊ $$4aP[1Qjn87^umq PT$ܵݫhD9rV`w2p,Ee pSu֘.UuuvJ26f4X$ TgUCU]_ w[ڶMnVhB ) xD*v^Kٿv yA6MkU/]X=kfS.<0Kis*)n8tz}ZVIHڳMF"(š31,&#>ֶef|a}5OvmQ,d\ӱ]18r"*ȴ!bH)ޭngpd7]N˃gPQ8M^ aem|XJVzxu~SyvQ/kv+ƚVl,*Pb E Xb$'.p?J.(MV~[-)a\>sk!)@3 U5TNso}sqQ<{6jr# _*v-_n/jRQl߽:5.>B"sZpzg\d,EX(ܯ\{>!<-hpa5 >{$Eag2'|t0Mj\鷑y[)v]ej_eٱEUp"qZ֊f8J]Xi:z}/,r߰kM@,d(To^׸daEWb-(D<(=AizqLuʣLmԻ{8аjLBFep^ۓUGX(:]rYf5!p*Q:\){E^`yEpp=mU{CIkb}%PJ+U12-2LK h#sG0RI{6Y&(l[tPXAAHB` SN-w z[>:u[f`] LP kW?kؽR7MUT+n#&K|iQ $c#^)C['E[+[qn/g"Uױ4P lwi#4Yp8JU_3P~5ӥ'@@n#T|y,.rH-8L8`q+s_ro7 bBkd\HX 5s2nR\k4\[&rʪՔV% & 2fjV5;QU{=v%cesV :Djl><5zg<@,]\˜X]~gK^&ֿZ YB1EXuѐY+8_UU~*UZ>v]/+j2o$Z"*A3!%ԃvND.S]k9+wzT8^akely;h$y^X:tWR=yŠXY߈Y6#"-/6i90|嵏=~x:W7?8iD~`h'HE8nx@8r>]Qp&ʚ{VU}դi 䭁͋yJ5f]SܽqU}ŕ-Ft* QvTXxdbQ#2b=]΋RPO֎vΏ]d5تfb髈?Jl';X3O Lep #mgմ*֖֩W';Wv @#DD~l|I9Lw 94\?0` r hJZ-w.~n:z#ԓjvql^D:WP s^ L^(R_{z}= -6򭹉~PAB) Owϼ;^.?6{!҄e% *.X^ȐY,1RU6ܝαg фJkF 8NbfJK XnCZV DZvp٫Qo_ӌWE=o.lez%lkLRh=QYyf:¯2qC &RI_0`>˧cy*d֛^U4!@~K[`j`MxBy#. m=NkM r3Reo`}] {pI2s6\6[r(r%&ʸo8 fʕSVϴNñWf18p GKdH=m-j 0sZJsUd( r2&| Džm|qsƷ;ŝ^ǚ]9q#J%rlCb5ϛ :#Or!pctj>J䤩٢m8ݍؖ,; sdw.(,3ۇ׈Fr>]wPN?jnz5l7[ K+dBYp@!2爘R -rACiڗ%55i*m[+5#DRd`B PcH<?>źy@y/m6rWp3\G A% FJ,$W׭Vǎ?k5閗yhJV^&!2<| q"\Cf%n ZLJx01bI01\\<9m늤=kW\DJ#H&oiICy'a(WrrO&PTMxH}tvTUL+:H7 @YQ})qn{@k@>*aI+ 챁JPo"@N/y h9Ҧҏ ^{VUgX(9ָ;O8HqiܕElq#0ֱZue6 YDFdׅ,B=W5wIi=7S\ojqwG&oe(vpNo޾Ll*kZ~M[)0#1@2N#40A F^Դij㯷ƺ६L-fkp{LRe,HB |v5OEAZi(^*)ڀQ0Z%*199 I?NMjp-mƫD9v%{vF(%F \凑¨WG;6y , JK t#K1Zf?b" C]V`kFY-,GDuG0Hy'V.]o[ʪ |[k!Iȅ1JK!'2BNs)JYd$huMy+[o_i:(,]|EdِNxgcK3+m\&a:yGuð fsrg};8C():@ߴ~VӦaց`Y֛v5ٜ K B9a˪Bsk[*Ug]y?J5Q?W X#.h+'Jy@A%[r =ϙsG($%FXıEzd 6FDgUj K ~R`~fG8CV_#rڼPsjulb\ta2HijJz+6U)yhpaxQbpsj17 S?WD 3C>#!F!O5QU:'7W7J; N=` &˂W/=(k0+o][TEXݎbصԃ#CY+C fSM̎(s~/aP!)4 N0<aO%ozOWKquyԞRU)NA ޥG?iGB[QeqW85d&u=ZFiYKׯW\d*b|)˶=>s붩vKȣ H"Xg G9cgsUT>꒽\m✢ He#Eq,K38?7_.>UѲ6- gXXtzU-}߳,?T@U?QUzHN._~*Iv?.zL4CjKmO d'`d $A:t:t:t:t3w/Mj[i"&<I|C3޹ =+׫CkYVS2cnNle"8w"xJ`#ԧ&4q4y`sj-܆S BWJYǍcuqhzQV﮼S\=VFwa<+#8" 3`8OJH>h1jff11]*"#]ύ=K_ijk(UN*9{+pbi,$C䶮 bͷ&nzMn݆n,FEͺ@A<8%<9}CړZӥlbҪcA̱TYI/4<!,WN< ,/ W@gV-w0׵;aZceb"rNkFhx "°nVf(QmmgMNH䪞>ܶ{7%_;O%o bG92Qs7z/>[?:|=۷ga9 OMl yTՌM~afX)%9 NY#zsAU.,6a&aqpKc3JtlhxHׁ})i UnjY[ӑmZgQ}$VLIO Hf|tM>nk|It+Sm5v.R^{Y' 0$n@=|OZk,p$Z ?z&Y9K&?}'[ްrƝ&F;L0%0Kyr+cе+ [䆫s:V[$JZUq>y K03DtMKU/QZe{T٨YTPr թ3:DZz` !a qŜmRo֬YVJ&+$&sY.V,!Voܱc[u>,Ur㕪m;Z~%\Sۏn#Դiun)Z)d$xf.C5%R& g?q7Lvul/i{a#&, Z٦ ɑ%[BX`d,=ɛר+Jmۄv4:Aذfl]ogIB0,θXåxKoPڝʴ^l UcMhxG䬌 fV+5!5w8 ay3D3lE& y, f.+aWP,%8zZn&u݂GWK_ޯnM`}#Mf8}YSa2MSENϜpNkZdj-xF!NH!MSB VQ,* 4]KI.mۦmkk-[u,%+=u/4PrN Křnf5u6޵Ȓ t,_O,b= $^z~5b+d6H߄j h3 R?Hܭq*Mjy"m8&pۈa2oQĚ,,\{'^oqw=*Ym@Ɨq0&lÆÇSxCmnnQl)j䈬׫؎#y=VE鞵y1~8(MÓv֞%mN[,kz@.d̉[J'Wb kمF+vDmmLe+u \̍_aH$ÁXbZeٳ;-MQu!_ڶ wHaf]j t!$kJXԧ㮡똭]"Q-T:Uh. ebXUuaJQJ^T6jdέ\Ut$rUWay.Ra20b ڃ gU5N7/S5U=Q33ϔDtJU{aضQa{55XABڶ&1+&a%_Ev ?hPYWj|W0*uؙ0"g,Na궭y$3 y5rn'oZ"1;-euԫ즋fh-V1'FZ s]M`Ysm+&DbdZνnNĔVxe1W[ֶ˺l6TB8P͙ K_V:M.́,hYVv#`=|\ʘj j+V@]N?+g;9T5~)vD5T9Y$]c3b+Z-u>w:ݩymmJWVG=% HVѤm4H8w7nv@qWfr--=*#U:ƁjtL|gu:G#V9~d䭊 J>h"[Pj̱x(ؘdA GXj2jZ[{PVӒXo+,رenDb#x0L\_J?i|K nYښjWD1mߗ<;  ,Iq.r.[)8OWOl:Z `ӳ́*eX~ a9lL B$>S"o)_UmYvՊ7W6yqrA!*NрE=Pg}|{as-y5Cj TDqde5˴J*PhX+oݒ״Z-b퀗T)\-8lMJ_+Z~>ѭqG]ȶ5)ΣQ"Xs h)'́$$ہx!=>l?wr%rϓ [WrA[*mWd^(H;j:^5r~ۦi^+Xն[RYPF,A"3JlJ;sdgKϾ)OT\RZ3C96{$` a&.|gyTYkmj9B*5N%'9 [+/?%c;_@]kh4f ӕII5 i\(#P$XDm4n^{Z4VUp]ͽ?iʜ M_ PღH7 yŒY7 ?dҸl[hMIկecKy6DIHa" !Kֶ?z{:]הxKՔ,ߡ`UGg7P1ʙπE7,%k<rk MbGi±rNa. a(\/&\>/vJȷtZDշ Wy 1V΋-ț̇ƿ..#F ށ/\6uI)JUP΂ف++0(3  "a'8pv˥<Ϳr<[jeOdap&B7tPT$o0\l][W\UU[ZAra0O~1vp'2̈2,.px㓽6qVunMmJ׾Tدrkdx)%Ny ,.p.[Q[nHIslVw =1gI7/b2*ߵ Yx}?]Sk5Ͱ"{2²> 0q8/,.zCEhɼk.MW#E%6J/1a&;&W>g@+/'8sޗZV5;7vcS6Z3c :1 !NZ jlܛVMO~1XyN j FHDH>Ʌ͙E/"˭^xR-+xקiW^yedk```Cr7Cľ^# BL|k{u퍄+4z$OE+E fvUǚ}5vnP"B%ll;_WhAv!qcj9bj^@@żm>R25e\*!1c2tp^ 6/ht)6ڇU@)܈L_:(gv@"Ɯ,Ur|qXmZ[%,AR1$c<` 5;i =Woy'8CF[^/^WuĢS 42C, cЗli5z pw>a#Z 6_]e>cdyљivB6yMӎw_mڦT ;ᲙߋD1~<@Ÿ)gj ( 8K&l2WkTqs 8ոnr;ōxv+_,f\GJ]c=>i;+?6 6RlEcA8ɂ"n1lJ+[U.?{p{xZZ"R-%f Dsd1VUzDa{G޵zqʰ,N1s<cc!@b}WM;kl><`_M[#L>7˷C?BGIXn٪<;m:VUR?Ʊtm~Ͷ((KpsQ3=M^^tQj;w[ckŤ@eSRi?He$%a9G0}9^JuZ{]cGVgKax|#H FA G= {˿p]Q5b461(LĜVgɅ!M%ҵ*k4g\Tč4ig%eҙI{RԃR?b+!~Hpe)#B;%5q8bE&pf"f`ho\oE|[r֢˚gJ}1(C3g5Y^Q1]S'$VZcgW?$GcZf <+D.fB&Ik<}T+}X,{|S.!< d$8K1I{B!_wW,:Y=>ї;.8qǜ&Z}6FjpDCq (ڳaKFm1 fk<[}xS쐇hey^k&T;1au<0ɞ-/#8ZL!D!D1Ic"!JQez{^\}Nk_!(HŔ3!ăB290ÁGc{z_Rk]+RW P fbbU |Xke*V.(5˕[ARMD9 (H "F$!8N1e]}UL#܎Z?!X )? =`nYlgXFR؜œ'عU7`‰KlV;@bUH.ETL yx0yb3i?EYƔO| Vijjx{Yk6 mi:ѨbH Jluj&X;%|e:~ɹrSۖٶpS Y)ZJ9g ?3 ɻճ5# ׁy:pSU#-AxB)(2" !2MuukKFȌ__(J.IH ~6hʻBs*?x,9|O2 Ӟyc|YZLIjz |0m34ᚣIrᡬAwZOo8FFn;(PYxJQgs(c YC!!*[~lV p񌆈$B1i̤9RRin[ϦNJRq5bbKl9Flc|UiY|TU_@ Gv莤̞1-q2dyx3 "UȿN_U|JRr kCM]@ҞVSB2m#YآWc Q ו]Ӵ6Zű$ir WZhg,J $KyJ)ښR\aEEXumw&@c1B1#1cYZE+hDc"̤! 9)I!'2BNs)JYlOǟrXڪ~_w+PC~֭2AAjK&.PQQe%j䶩vKȣ H"Xg G9cgs_ZEZvfݎbv'M#CXjǿ1enyT\EUjYj݌e2IGg8J3A,"sO,=s3D%E'hݓLW;{~j9gJ}Iq.#UZ8ڷb2Gg8J3A,"sUq nQ<Ʒ", L$qrDט,Z9n~iZ iNƤ*k6bJfH2>N vV6wI꫊?,cq| eWc.뵝0 :9nV\Uۺ:RW"g O$F+}Wpw^?{pܭ,6`"'dJ7 4ozv4&Xf(fiu "@B!j'woM;܃ <;=/cm%Y*ɤI3A: v>IrkԌmvf;KK#^,HnV#bbe@PtG^rQ[ ˻L '2+ I̤G.a۰Rmz]cϼlΧx}vA1l:&ÌBgb&P 載šc`JR+JdF jP!8Lē6iW``ݱjVl{UJ%ybFUge3 1k# q-闗S\vT];K/k*T`Awx2¬#4d .Q˼z໽Ñw ԶXi)ܩ,)5)5 Le*0>7M'yeiYk[=; "4AX;&] lG!ȏ3( ],VWz(06mdH-#96E9ʫv!Av![v r5Ujk#Zmg4DoO {$D0W'YW87.XRm~)6 ucS 9 rV."i )xx$~tۊOsM\ɧDҧ1V8aa1/Ĝ͗q_g'!NyR+רh3 3"mEYrX~~Ij\v2]KZ4@UZc]9X-' <?9 YkG-UxApKI/F0аc(/ IvJ0< p>u&КAZV:AJ*Q#&~)ʹ˧^b4ِ1^jMcY'lvWmjZl6>]:@k4YZAyN|'1M7Z ro5 Zhuͦ͆9@V mf VD8b3$}7@o6=j[z7e,lH\ ytZVe´Uզw=YNvP/ke:TSmܬ vg=Yx6]gYmJ-ZpN4V0tLy{I<)ZTԎw;MTcTcQ2č@un I|`cd p#{kcy^GQLl>SgW"v0\MIs|ޘ4ݺѝu,҂1W@fg"H8')TR[Xװ+jg:u%^[b9RH%^(H%*~Bx^&Eνdu+_[ J_r?i6Ԃi+l 9wP=~vTݪn'!H;<03Xps+N~a9y;yzD+;lmlbfqatq b8Q0lzCft~4 Y]j.OM\a:˂lԭ\<)1xdZz`Gv79e&zۆ+XzOJf2I6%1'PŖQwѝ\Z{c=c7l5Ee^`+0>cTόxRwOtq%K#hXabO H ]3ԋ˔PkgwЯq3׫ +LIE!=eM(Ǹ"_t9Uݫ}H)OWj#AJ7R@#$B1mF~vJ捫4unuz\XS߽p9ͦ2W$Jc'%6'!Ҟ _h~R a}g,k r~ 8N)?_E|w詚Ώ7 !pD23` ڹ &ô;ŦѦ-IR%~JVY!e7 99% ͕xL$꓄V -S6%jFҼWPE̖4U R9<Bq'GBש((xA[}#;ƞv,@ 5[Iಜ%b) 9Կ8c~5!=QdveKalor2b 8qas^[7]k.̕o;h\c$*#$6x+^/>bYdjv+%M ـ(bDR^Єd4UMQjz[Vł;kmiZ2,l g'dpGyDu;y.p9kGVrfZ>%ND2"$F̰FgΟ-]VXծ3MclRY2po9p_p_:6hvZ Ü4bb<&aqY0]#Uv[ž[wlЅkC]U&H(5bsgP>qRF ,i,xx 1}E=wGbg5Wc?$qt4 KLqGr_-gp[E+X[Z/* ~u LG 2aF\i0NaEZ۝+aRuy#FI 9n;ELA0U' yϴH>>~Zw|𧌿+ߴ-??v)OS<{j&_I6 C]P@aZJt뽣)N`H&I I!>4^_֢6mH,Q,.e(WZ$lnj)b1%/hyJKCꚓ;r4:b5 ı %0J*! QKgoj=E5݄cN8GXrS! XzޥhiZWmBԻkMƻFIX̣(\sg,,#iitMl'UQ;#)E`! 8Aq"$1qI(6^hB}yǘ5UH3vFRRs<9DcRb mWw*WwƖ9[I @f˅ dq6JdH4=|>JlRJp]ӽ6\+l)>e=Y_˿q4Eۮ̸NqFҦpU'/(yϼ%=H>̼eml?و/?'gspcc۠}7543+ 9!qH3<֛o6}sE)Gd{$) ~2A ?zDRu{oK7 ` F];,qڢ^fcȖUCxZi UXM!0'r r),VN1m,(tnw#ڱH'k- Ӕ7#Ԫrï}vR^09aۈU^XC!sa FY1Uim~_qfBnUAuDc<ho̿\!W\_hnF 8 H@ެ 6(=S!^#fy2[$$Waa ڋu^-g-BSJ)JPb WFH92+z8UlGoX5<s;LjDPaE:~uyxss. ڃx:a_oy'99+ޙEv<M mZ&?bp2}1$%Q`=\qmkZffݭTo_d9jR)g2*>Oۼ˫Ɵ?:hğWn0Yh<#p (p _SZJ5?r@{ jc>#$+d팲3CKa::Dַ#oRK1dAEb@d2Q NcӠmYWy)}׶ 1SKb# L"3ax1at_P֔uj-҉odGdb 9Ă0<ā0eA%F26,(zr0kfWr `i_4,Gˑ%S\d ӧNӧNӧNӧN7p2]!үdrl,{7sujj>Eah)Ae)F9c R1d)f1 yE~99Wgk%)ykUYA$\0c"?|ƚ>P|;|FJ; *e !{(LSfbGRZZMltqWiC$#|<ن=`nܓT(Py b/Q쨆]e 2gQa\ Ñ!(cgj%/olԮ7qD X-dB#F8̳,1םg9[KڧY>@Ҕ+fSֹ[^kĐbelO5']Yx+Un5m"i\~7 j/vP1WZCG'<G͘\0dURA뭞j-ωOsZG,䘖}_ڗ87'5HkB(bS<8Hqaا_au͋ C6譯D/j[Ps3S63$aƬU0Ut㝔жtוM=݌`ģ1,#/.1 caU8tf0 0HJbeZ<7!KrگA۫]+HLYK8™ Ts4`,Fqy[Fjm߳Gmv*u-|J5*t3!W 2!5 =HzvhVsW5-l·Zf{Vj0կ=nP7ͽ``rIAUilн;ibKkQ&m *`s*VٿM1<0bpX[y-ς֡] t98A+k/`,Z-Z˰S6}iuOPՙ) [cs);P0d3[$Q]bE9uPXWÜUm_VFkԾpko²_ݿW2 թ#EљRb9}zh]['6, D9q#iO'83-1W*vJ<۹v5.jΡQ= ) PY4K 3(g@`V9 1*]Ԗ2-OJ*%]ogO=cnlKTfbIX@2bNQmGڋVi<~j[3e.EՉ" }iF&"!ih}h ȕ*f JmuAaaYb3 K{s%eY=|M{꠾7;W*J5Tf^s1"LheS `,p}ehKUvQUXL8F3__TmϯYՏ+_vl(lV,pY.C&$ ɗ m_!l5JƵ'ZW{6,ڝ` N0'jU[c:pv1 MU(#:(œ Av]oc2UeUl9ZBgcf Fk/hu%HV'FYdxP1.Sr.ܚ#;6Gg a_!lo$qZV.9Jyc3=2!E܄n-C񎨆 @f}ؑi2mT,VV]gpґEiQ5K^ڶ67U4#96<~tb*b 6&\&Կ|4;%hmamiM*8ySW)řc(5"Ȉ6f<"d$Yr&A#J֍&¿y FuZB FֈByP" ]]VVD!jZGydjՂL>FFM̭Xy<"ļQd[)xQλnڨr6 햵ԯ|*xQ (aJ+C\{#^od+[bUa9@w*ٶȃ8C\DڛEpq2CE+kŪ7ykdbZ>Sbe`P8 .+׶B,jZiDikU(VSw`Y+ qLS;2YkAhܒEOYUѩԭ Ʊl8]b`_5(ӝsYC_vțNW4neMOs 4%j>,4oY}LYuYg,\PKJ%'JF GۘZUҵ ^Ѥ aW4ɗj3H̹_klܫTux۔&/.( tit+ !<0= Jvm0xY`GB'~+ [MYAyCkW״ʆ_u{Kliӷլ[k*X䷒B+eki.1T8k\-c lܫf/TY 5i~ͅ@xP.WHS9z] +gAݼ wg$dZkL7g7.Gٝ(V$icuz퍹W1]4kfg ~25vǔ-[0˚V M f^,gWalIпs`0Asa#gY]v$W% ek!Z#~qnL0#iA\ *Ѵ9%UlRZil{Ν;+Au<5YHQ&O4ZљϸuxmGnGPlcƤk uH26CfKe+nkl]QmKGf-ٙfG!r vyx[x:{0.Blq+n Ch4yO1;C> ^2!l|}eh}!%]E ܫSZT.@eF ,׶/8޷ViagP݊б3Ujdf*Ul(pԁbkj.-z}NώmBZm 7@vs^(yHP4Gy\cɺՄUҔu ץ[kgmld~XNIĬ"MO x~NJ ;NqoۍkFR(C5*ح7Už T zay;zJ:IOSmk^­_K"w&L4bYȑ z}fѴ~KYcj.O:܋a 3,S%nIL>yc`#`ZB&,rʐFc /y/PCQ]+C)t}lƦI7fֲGfK2dL':r r|iTGYd*uZ[%C#.h5؁'Xf$n^ӄc'UOMjz|ZV%lIjhr WZh ,J $KyJ=2k{zm⍗)螺 !$Agȩr%bD2$j?X\_5\f}_gnۙӫ[DZdY4IB(,Fk}1hkc.s_QMMm|2" E%1$&2HNeGTl[%[*qǪ;7j#fh9 Ifzolǒv@5ߣcS 4K99g2s<-[RƶxM h2G9(ı83|TU_Y>ͺbS-LT_mޖZcD"*аpDGM2F2ϼ7UMUSWXخEMdbArc8J9s83gWYѨ_ x ؉4H K!"fg70B;JV '-z#bJB.T1sXX0"䄈'\gȦ Cu**+kDP1Cq1G1c"VKڗ9ҷ%=<"Rg,2f%F1nѥ5l9UD쌥u$1BĈc!D!'B2ڻNE5l|D쌥L! 8A!'CBNe)F9ڵz%rR?;k, =|d#P̆kr `d?P(KTҴz(m}&/r@#jX@3Qx!$ ?KkgPuP.6ퟍ=eN7ī!aD!rKƽVFk[jQr%4 >!(0̠Hx$d#!lt}4j^L1SUlT|'-Wa,SA/9\> 8/3p ~w:.c(&+}'O e_ :8<Eq:/ /ڸўw`?-fFYrЇlqGӦ묃g>oVFMBŭL5F ;s Mv,Î| fs}lu~yV&Tt̥!UW '-mhIY'7U`l(Jb`!."HLr1Bp̡Wiۂ-jLk/ kX"Jb䇴< JN?_TV{~_՘ݾo~~=%Zs:v2_s\Aڃɣ "LD$_qRsh uѪ1jfy'9Jr120V (++9M*DT(#23(FbQ 9Dc-5:HN\fW/Sb1bXIJx 1)2mo:8'*-^:VT']yUT#7me(,%(3a9SF1,! o&Ȝm5EHWA{p,+ G9̉8A I"!JzLORZ4]~ͧGٹԼ4ߢ+Hpح ,7"$,ҴUKn/%qg)Hs8YeJ1#$'(cYeܿ:@ޖ?_Oܝc5yǘ5UHUvFRCs<9DcRb iñ}}͢:xҫP+ cx̚$0SLp!`+eiZU@aG³ҤJR9c,2f%F1Wo5WN:N:N:N: ;S^y{V㛮0ibb14]*c {']_PM*]Z@=-V23$׌}ɘc͝xԔ`Q W]n]` >0gmCr2d#1En;:}&ŧVƅg+i]>~Mca߀n CMك㣗.rmtʝLG{]n˒,O+ 8r&p#9~MZ%V fH׻N%Be`ddjjG rTKx^N5!Di6'`ZjZ Nч=g#e[j^Ѡ|ͻ[)UZI&;$FBEuD|S{cw锛0\IЊ݋£ HLI5;!zqP٭k4\ ?#Ứe"̭&TRq,1aU%j\,/.I1= `YX4I{lԒJ,!V`ioQk7fJ^JSq }b8E`@axfx_ '7p4 }*OkM͏* 7 :5 f%,chҽ/*RW 6RaUhx59^#1 MgӎaM>ϭXW ¤*J 6:"ϔk:~XNޒv5+;;V"^S2b tHG+dRDk5.BSu켸1~BcuT~I  e(ƪLUTTK~$Qyyqz$+@͝L% C557U,SY1{?+=GYwMj7HqǕƳ,YWa XZRȀR4SrڌvMםK\+ ۴|*NUerY(\Ze4*9SmEABM[RUbJwVXbmjYrg We50V4\8c3Y\ =,J~n;޿ʞZXw1QXJ L˘,FQPvmiLy3nе Z$լ׋TQBpt_YDjӁXrt[yDG邙F[哎SrUUWjm#&uD_ACR}5 A5)\eVx#Se'< XFeR n Y̼Z0ml]y y+Dض!2TrloUfSL+%9g=VزUVBp4j0 J qcu5 Ok]9cwW }ƭ;  ! j6gT'BX:jwMyNco5Kw :YQWVUQ3֤5~I<vT1#lTw[^75 ;|2t*y:p0 ys-2lO6Mp_pXXJøQ5LucfXLAEkz>=+,:آ]V\\f+mJыWi<˛{_K.Ǎ#F¹:|q6ęb[8EWCjc-S{;RLw+j03ڞhJ  Yrט5 U+MBxw+WJ,TЬuW4A|F(sxm\U8?M׶ʷnN$OIحb5tvӫk;!&H!`ٜS)n?椸`cVRJ%bVXv*B1`Ib8!uMºK;ĩBkS762'dG_3H63bkg/Ya^O MqboRlܤJebUB8d29 UiXx`k3$JԵu9Cv%+fHӱ!$)F̽q%45qeXRi5uyK~@bs1Rd\VUݾ@[A%LAmVdpmZnaixp˵/r}ֻhmyPwptyVG݁OcGzg^xfR Z1$$^$Uo<+rʚU]i nVا%LS*A`\ȧ5Tfc)'0/S[^iM)cncʁ\3R,CxJk+˹zڴ?+v3N6DDj2z-iu\ZlG¯8tT,5396m輪Ț(n2:E/WRYX­ڐ+,"%v-[-쿨{zʺ ~m7Ծc։/آpX d#֏s){οţ2P:/Sbc6;^QfS UP^˖.2^ۇZm/l6,yFm-3XXX#, y1!bF@ӔwzfnWw_כvk5/O 22)tb& bfdX$f7^8zf~R)/zlGoS* cO0!0CJ<;EהGyz1dș40s֥9L S2h''䆁ƐٴM*\}B*-wM5l*.[! I`ffM~5}cp*}=tn6QsiXXA%+CZ*I1 TKJWukۅmvE)֘paVe2I_5KOFmGn8_`װ>2ַ [zi'ܢ\¾ə,QX,Wʖѿr.15;>6󣫭Ic8!4tF_-*dp1gJ{h]5P+5 `eqE)J X={֫ϼwrg'X9jw5mq'i8pLk`9 o&Vkz> r(:67 ]/:eS`X7a 5r Ҩ' WZ_>zR֟rӢZv]4zW~"s<&8o7r-Cֹ>&uiKlX͐rѭ˒8wnpbKXUU}ETɔyE5xl ^8u^v4ӄ7.Kja' Dvˑ19%o~E޶^Үv=gIRڀCa!fpI$)|dy9Ü4.zީyאw LUubIO7\e4Ɣ9C+ %cYebbhBf_aBw!XE0ϐZ>50x+aL|?U!ht;urg@ J"oB ;\Ȁ=|髊/(y. Ҵ}zƞutjI5JN 2Lr "-ʬ!2T ߮f>>KE+͡GN 7/ڴ5*5 NYLDc;EIXcN!ƚWt] :UNgILouFD~ ByI!iM =qTxIU6z}5i5P#B&kpckMu>Sp˴ sVɽ _I:!B>"E)B3.9+~5no2jJ^^=i6w3AvVө$ 0dQNx؆*=hH9 p8VVƶ_,$X.;f^ryn[ϤNi}Et}Z;Vk )#)Gg PAe" =Ro+?e;M ]yg!Fqwcيǭ'w~n?*iX|63XLx4C#|/umW=im@,K#gHYY c; [Gm^JQTw^ץՔz BF,y $9u(Ɇҽ:ʿ;W?mw D? _OO\?/_RB91C{h4j/&fp1eU-U_ɽ6FŨm{pDC1r0X3Uf̋"JjK2!foO+ES?[a2`bc8 $8E6?uΤjQr%4 >!(0̠Hx$d#!lUWUAM7`ǫdz7˅pܜVidc|`-ҹtj'0|3ʘ6y2T]:hzUWk *mEeZ`;#Fe`.b8@qao6 gCmɰ˜h T!1~2(L|+xNkr@[U_.{Efm6& &U!dsQ%c9qgZTN٩][\q`9 BK8!2̳cs=s-G#T䊭5]Wt/+Xf#䅿Bbǚ. wZOo8FFn;(PYxJQgs(c YC!!ҴUKn/%qg)Hs8YeJ1#$'(cYe+=6j^@S>WWuBiR%)FyȂa@r3H #YiOMQQz[+i crK82,8191Y}U[ܿ:VTW,Z7.7}yǴ}ahץy'9Jr12jVT']yUT#7me(,%(3a9SF1,!iZU@aG³ҤJR9c,2f%F1+J^Լ (WVrTJQPG3efPģ2Ar5Zk:ʾdz7SUU=]ӧ@ӧ@ӧ@ӧA}#jy/^%_SA< ,'۷̱KˎNF#g=3e8kuXk\%Ec)D om{nXK>݉G߶yqÌ7T*.n|!aqy5BLN[TE2 !.'ebþ?l?rԪ>>nn?ƿhfqiK6HO: 턼aC3e0 XrXQ|8y S<%FRf\Q!.r` ۇte8Ϸ3ɉbr*|IM8[WIKc<ٯ&vXV*K؉c]6M(;HL큢3^ 2kUW6wj:N15OXbC!Uaszq>p5SS^4m*q#8Ln`FFrHuIk|Q\h2+(i bKט9>B<{Y][[%7 }=pw*~b%l;,ҙRr`S P_>Xܸ[6NrS_E-f孛 ̓]Zɤ촎DQX@+fi-"f6iT*e}:rV ELuӷ iS^g|gJR(s|Y>V_Yiqj Nva6fG,5z 7$C]2&X/zq>xuv4DJ*jp/J!h% `x#$C#BFM-eЭvSZա{5X.v'b:q+ Nª, 'b 8&H76uU)z# lۉA 5ȳ#S)jD-4a`$ÀjۭRq|s^]]TRt/X>wx0JHR`s Nt%zJmqnMˎ).֢ưFuU!Ē]'p3=#cUsuMu}r69bPnY\V`yyqV 60Fp4ơn}^8i@U#tpXuE8HΠ/3⮗x+ J}[0\ɟ]vҸdU}CEs[ 2NgrŕU\kcN@%->_YZW̑ f̽ v44' *VvoEh>gxXB{Z$,5Me"!lV*k:Wr#l#,"~ čE3 .%EBE׈Ӑn[MWe5Mo^;Ÿzhl1զUA4ɝx DrYcDԟI)N/vmtSV::zaD $$W*B Ӏ679eո4A6|崢 0bŮ*i3 0_θz h^w8WqU0]I/rZ=g=|B0{r}Szl 9yV&J/@Yp&D U*`F7v Wm-BVSiji^HqudԊh$q0ͤu];d+mȫ6ikUqVZz/akngj6ɄxhFͲSk(َY n)z (֒6-ۀBH56pbʖUjr^嵹CS[kXgFx׵#\2UC'a!Ap3yM};>5]]^DZ[TϪ^9X@ ;Y@3ar S%\zd"7e.ڛu>Ye\f%rZ1e|)]6[%jy'wTZ&k 'lYRw_p$Uz9ZߑO{}iPvtMPm_ *`D1>_$%e펦_9 XW `)ՕL8tLL1,I +obA_^S=A.@uPWn/[vl|F <̄}~ gݧu܍QXS$6I.F]  kW(|';T-nUe;4@9RN}r$BZB_me"a+% '!qkO,0ꚟƽi2 xy`%܂Y$Q0X44}.߬q\^\*Q!XY҅1P)]Q|> ! =z/i7jƾ-Υk r4 TRbjP_yHπZtܩ mk֛ɼEW@&q8~'J6dhAb %SZs&b4>*淶.JIV{vǙHfi#B3H6^1Uz@3VWʴ7:uQwgncmEdlGD?U#r>꟏k m^:7V+bvuW`.M05Xakz0rմi;<qm\֌[ ^x P͎F }hc9SŔ ~8-橤 [jÌlڮ8|RyXIɠ"C8P]V7,;U-T[vp#b^xs>2<3E'; 'I|7+q(6XYjׂ'\Av]Z;U> W/;9W ͦ8[\*aP4mhhfBi8Q,Yw>qEU*oXYTm ̢Usėrfl׆?#k0e>LV]wލ)[ְC,b}}hb&+Z*~l$sILdkrܙotnS :ο{6A;*݃\ 4A˲MxwնX_nJɍ]B%*_H/;$*!r0_(rui5SjW.Vª'VEd+6s#ha>$ܵm?2\$췯ZJ[+Pp $,ce~d_BX_QzúGFҷ7IUMCUU˪ITk`BUй|5%^k9BӎZİL][_Lze: u$I"NAG4~;S5[Z /%#gh5ˊs 4I6ure]_+b3 .v%g-^]OyTxsnR{ĝvado'vL)Z՜?K n4g)&֭JAwӗQ lh䬶 5 @䅱)WG+2Q1R2"̋)xd,b ;W7zvHFA1 ( yd켬 ˰kXPGW},TWrKqn5橪o8ĹVNU d63[Y8AUoEҶ¢ͤlm]޵/bIeE'p}:1G#a6N ~|^w|?8e(58gVT[e9Sm>6t>g&/!"Z)ܙqidpDq56 {!%Öu_v[(ca32j쵖l&`G4ᔋ`N<ԸWX+={oWu5בMRY*j#ڝEu9 @⏗15z/v̛CJw 4UEa3`̢CG#~şDzs}^r4y$zzF5~̚6îaЕ'֜V@0r{r mI\aFf1VIIZ$ 1/_] CO4m\/h^7+: jU%Lu LQ]EM9<6{Y66p͛Ӎ<+0=3N"$2yv sgS]|3f sN0$[ *XJp ◸2Mn;S[TQ^i6uVahL8(vG$"Z/ UI 7W}׫ճD'H2;g(C]/PP\Uv]ii/_u aeyiWԧa1ˏz}vT0 ͺ[X~ZXRz݅QsgR& s6Rګ=.o<ѵ٨mGtр.j+!=XؐFM $H!\뀋5T*ˬTc"k!j%IQn;Rƞ1; r^ 1;K)b&9#bGy<žyH%blNB!9`+^UzNt: wU'֣*VpdA>kEqokP\5u[Zi3>z!ʙ"ˉEr"79UMWe[uQD֟+(. 3;W=I^,q{>=}FV,A k SbEp y)_ioޥ]EW֣ڀkAE7kLP2 (LXcfR5z>u7+m[3_5J池Ly]a rx (Ip$b'Ymhj,*qu8ջ'_HDAy] Qݣ[#dH85!mz[kWudTꖎ`8nnIc\$>z W{5]h J٪ WycVT y%8J9(qZ*ٓ(M.zf2lWR2LUfb&Iyś5_n51x{s{]h[+ 1 @(5&tTtVZO2њ\.Diz[{{*):3,RNq0r@d]xf9_exJJmwƚ'{U_01˷p ss~+g<5ai]e+(㍷Me1JXa J_ \"PZsP=ph)5*˕vVvTfAGL+ Nɻo-Ro+.n采bQToJB@rEjՉ8qfY#O2fxONowojQF (HFULb&GXy3Ё0HHer>_*Ū*1n5HӀe̦3thxÌrtGwkeƯ 5E>v) ȕcd=qa1i%A`ri:O^SWhqڪ"l`R 2qA;ꔔ*kzvPjkڍvumL>9LP y}ZCh˴e+VjqHCX,lv2K91^-~JL֟U|>g-lZ4iJQ(g~Ncq*&B)oJZll#L%c9OͦFnw]Kױibϊd*ȅ'd1)˶}>suEhsu͋ yGn(52H\RTk~GxOF{/G2h8{F%`1dL:J#jOKIlziU0}q[ik #DYWdG9{fB.0AQt',g+hycuwǼCX|KO6;n_ެ-6M`oO0bʮrCr>Ӝ9= "J'W-U]sK{5u 0C=LdD|$boı2 y㒑Ъ/5+^kC++*% !2%zy(aWu,?l9oIa֣GJ(cwot)SOVѵZm+VGR-< q҉ztWm.լ8G0V{$)R̳uj.vqďմ;_Yd[*08s«-R3"\Fy+WlhmVu^T{,ORvCa g8̳g?Q^կhV=v%'hx('1<M޻w{m:mTai]cGļψĀqcMmjꝢRƶr(m& $s3Qcq=V^}g'?N}θ{~i{^ޖ?_TR~8r 8E5Ե)ʣkp3+3TF-DWWNFȧe0;q8qViKOO^ ?i xhqŏt`))JR 9JRs,kp5E} `EX6Orj݌c)#e(x82 Ar]UF/G>ص}=^Z3䀢\vxvZYk}u10)# eb3]F1]ZEQ+ko|e!LD9 (&!1DH2Bpc(8"ǕW7cԽvzT,m{sB|wW{=#8 UӧNӧNӧNӧNDҶ-Uua9n*B+=<9TG<:.ٸ5wpҮCYKbG=xxG}v:"ݜj\nя&;c2}s.>Q?pkɻc84kK%!4Whz΁u^knu{ŏMlg3x!è A,)a{ckŜmk 5-[m ASUD@l>dKV>3`I,`%}m#zJk 5${(8cരbT C(f C1qvS=^ͺXΡD←N dwLf>M0#<*`PHHu 7[RV[KaDCb4 Mp{`PlHigT&!%R%㛃:MA>MFV[.# :hPZO2aëD|]lnKPN+}Vg8NMaTᓺ`1%!&)$*Fձs~UR}kRc2x+e=na ĩ^o봖}m?[mղ+ Me,]$4QRXnE I s^4 7tZyE61iEqk4C ؖe)@0_H(6scUsW&nl6:A`UͪR9)> Ŕln>IHm&\ObW*MUQ mpm_-4; 2k0}FqJ6ۺv[%aw▾+M +FbcenM9xʮzS3eO['l^,vmg!e sDdT">'j=Roۭu{,5k(쒩40F ̭3Vy'ǪRSc.&X^)# ]Mŝh2 '^e)IǷ!0Cw4dhZ3U 3䀚En5Лiد^5ٮr׵.ƕMVX"y̵VIN;Փ+!g y⧑28V|zbqjT+YH#K;ӛJUkM,8 :r7%\;z~Snug[._o[~_cJjA[*dID/`r9Ciܸߚ}YSW۶r[HzԖxm:Y.(  tZK(!h%[PN531{ZYIg$WC0´ĂkM`@@QQqv OEͅbݍyvh5%E_Qe3Pƪ9+)&@A)\qHlI}RwTz8&[p1LV-/"͔W͘Ƽ'̝]bNT3Kl;A[F̗2b%j G |G{?x+l6CaP c1$' A/+]wP ~~f/hnPeȯ]y%4{gXjJpf_Z[ypOq+]m%ٔdkƍyS3jQc̏S΀ܵz[jkB&*vⲊ͙ī5G`m"ρ9UE$Q{t n뵳T:ئmY `9k0I$9:6ygōĝu;DjVhoKDu0e; \ziԿ8z {W-Ogb2P67 gdm]NIE!rD^x‚ߐ䚛% CdjQU<#%$!n&$}?@vVo*;ftR_dwc3Z8]ȷH7Oqp Z.b2jao0@mtT_;/6~pZzr M`f R涶r3[^&h]qIieR,]" & M\I~H<?JQcw//kqq/8`"SY@]?AZ2nZޗMаK];!aZnfQ13|25 ky^LIC8`UJ6fR -eF"#0U9$ĀwҞҴEٹGV5i5] Tm,}[fɡ08Sُ ʉuz~InկvcJ¸R*vf+LӃ399G% K.r]V\yƴ0ѩrm6q ŀ5S? 0j$LĦi?zXN=ܪw=OiYWH+ir7%!a8I/{bhZ/l<^;&06N<ע1'C VD&7R>t*[>^\TWC@]wa{@\TB_ &vO2}T,sv q~sn<9ep##ZM|~@4`) p]omrn܁G=x^Dyy(FA;B1C'5e*TὮ·L퍎.:>X 1;a:(u|.ݵk^M*u2*y)H/iLJ)MQ/)&B@P9TqKaUeAJӆf0;qa5s b'E2eS^a=uݢhؿJ8Xmx^#Ӷjn)VYYOV`^OO;X5znm枆2ah5۫ xC`pIS$6=|$<ų+ļRؘ'mr:-S*T!q tL+ ܖoQ W!n*$lo k }A!9 DDRd&?w?Ikg _ RºI2 ܵW O-;0}+*TWϏѱ.ܨh.؏#o! w5/#oӛV:Ֆ60$2XauGXUXɒ8ʌ6{nh9 G)c)d Vx i*dQ"2Geca)TCo ݐnj3)6 w-?oDY[+gvuFϜśK\1Z6o?z2OjNJw5LŔFvL5ڴpə*2fN!+f몿pYյvy͚S. b^L\*5PyA3nˉVMq{UoMsfCpZQT,AʹwM~Tjl+Kh]^#_P?yb+p#s|#!sxJۊ=hW~ֱ ŏscy<\bP"_EbU5Q澪]VX Q$P09YW0*&~9*R;k]CV& b):Ag>1G"4m{ծ._׸Mt[}}[mUKBSxdsO0d[rǥM88ۍh{W&ek(fb8)< E9ol§ .DYv VI5s"r7k:}? t^k[F+**lU c <gyX}濶i=ǿQϺt}a<ߎlq\R 6^eʼmv*.=hkOXK6j}М"ƶ1w{pA h{AGG5׫O1gX S^r/cKXb&K,@1{9[:ۍU_:)woSp]C1ƚ14 \BXfcc3$$Hb]eMjY+Nk5*6!b,ȁ:Ǽ e,mUH1ȣ0Zqb+dZbb-s`٫Q\iWth mEeՂw1(]sqzǪk7Zm f{N⪹a $"QV0K0!A)hoC^_25L&2ώ3pc/? 8[qj䱪HۻyjˆfRQڔX&0fc@p[CӏWʭMO87tK[gq3"h}]J8EfY'KG?U_AMP`+ ]r~7!Ef3sK%[6>!J@o7ScGԍsd9RLxXN>Rz}Xc0U1F+!}_4;y>-=əbMB8enXӝvN1$jF8iX5ioLUWDof,׎pFDR|qY,HH:rW%n\O٩eEt9"5U8\'soRħo&oQ;&|T 2 !%/"@dA1 q(~ZQ;9(5NZO.fF>XCZT_;E{XmQ L@H$,f3139zƤxKcvTƭjRUIɦ.'_khX*lts`U8Zcp'CIQ˸!ϯXvyϒ.쎑FBTQg#(-1[8E_ Z~M[O 06 +g)$gQݓ8e8,8+t>c7h^_o<~?~7ȟgo]q~kUg_R}]alBP8mNJDDd9ϴ&"v'4U<*7_~Ύp-ԍA"X"X<1lxH!.Rሏ%yZ[h6w$2 `^LvFUjQҿZNvUo?}}%۾S]JdŻ 06 |e LL%I Y"HN3dο~@k q0ڝ򔈉2shLD8N!_N۬Iݽ4r (uflk&1&XJ#(JJ=P#Ȼ ֗Q*!k .{в͍P$)&1V~\֊ͦ4C{{B ( L / W,b9'1a,c-nS74u57TX x̎5Nsp#W0XKq_O<ûZɦh7)FOgvC!Yqv>϶}:Lcjf*|˴;q!!j4,ԧ`s7FKۅ܆ug@{ߐeOP*^b(:癌0aw*lxHx/LjtݓKSϜX*YqbQ^SsNq)n PJx[ #R&s@s)f$lN? ,ONb5Lgf13J lL)vx[4,W-Q)QY*GnyC5ڿ^X?N?ou!b=]X~ [J0e& Cuy҃qcpU֧R\ڳybyY}M7-BeN(H)!^T&J84B>! ֏*ߖwJ~pMLC:,^,N@BHVr,\,1˫7ݪg'Uj\{WO_V؄ǐoZ*CL%Eie`xD;[6 m ]=A. P[91V򞮏Ճ^wpe6U*&`ٖe)' OъI1qj[UE񎞥N.\tj\Y>8 F6<9u5Z%/ɖKR~bJRrAF$Ld~4Vm>urd" ( T`3x2< 0Ic O4p޽AV7eʒAnU!q%X4V!e$<I)tZp-~V_ X9a); ůlHDPJ\fqL!V"JAoƻ2r6>@bU*lVnM{jGFnJ2F*_gD/ɛƔO^m.ԍU,ܸ(: BKJ8k W)גGEC_%qdt׶T\\W 28<'W+>?֫;qǼk~?rvb "S@5,{-<y8 K5Cuw[ݴ'c[\p JHj%?-6@U/e[^WC\QU v§aѭ6df&W.+Rpbr`9& (D*oSKWNEeʞ[5^iְ<&)a83}=&jKr'<ޓODC^I}a@|xd43e_dj&-hzm{(JSVQ[Yf3.i^m){[V+]m<1a18\^VS-Y8CA `x_r_Pڃv)GG{ME 0Fm'Lħ1$2󭴊Ғ OJr,0<.#g39w~6?sN״o=vtƮT h@ϩ'AŜ^C.U~USo7 ljؑ aw0FM|--(*X=3/ MS-ƴ-8Z$O(bBP=YqrYq`PyquzBؐFMVuQW |F#J2,{Oְ;JGrɃK,9YK1Y `^E7m?_m>.n5mWp#E"ss(<鋆,}u<E̕iZ1<>7MG 0u^}]-c>d K뇗s_+W=}Deo^5m}vZtUUaȇ`E8,Y=NknWܐB-R&ٶoߺ T̑`)0Y#ą¯+|J?͢˩Cǵ.ll4F4+-+^"A!ȥXr&XT\ˍsnTqv63GswmU pQ3l dU3jӹyI ZK`k\v{Wel%ǔ(%!زHL3J֝cD7qz=% od[\gc2 u#E)]Ymɖ\w-W];LHYoݓe"5u^C_^= e6 ZI|mMA(6m1然uK7ciC_=4%@I{*a&q`9AW9pu=}a`5*\N^V\>~F2<䗊:ljxfI~* ,1myqGd5$͘<%!0DcKD Oc aYJͪ ,GEC_S3D5aG\A5le`h9Y hezߚ.C睁z:Jd` 9ߓʵ~?9`d/6UUZ; אYZS1M(7Cb0 Yɵoh\O׬ll76~U}Y%  ؏% JAհ,.k|Z_&RlJ$MRaF%ZdpēYYV꾛YԶaP wXmQ\}&YV*8њؗ&SY}OJklgtqYn 9$piʦeB d+DR?u 嵹HSk[+iο+83o 7bĭ/ 2:XS~s~@OPVjEoaXZlnU3 )j3,2fM*޺Vj]_`8Z:L䊭8 ݆ 0C>w5\{ƿ>oq|p97HBxA1(=G٨p]C [rN1]&]2wDO Z(r4naa;h+հlJu!Z`ģ.y}.z}f{gfUvbloYSix *LmRR f@2sMܴzM~z*'\^=6 M9U $}Y( (\6{ZVRoLtސaX6)b9 ]#1 ^_Q~!ҝv 'bI3ITщKz>V @/9 ,.evoW[r֢꣏,ӽ5JSs,bQf0kX&!c뗾\ik_M^ji>29$!MjC߈Uyc<X "FysYuNQ_QSFJ\C^kM)/?5=@bÁϚ1gEV,|N!b*C3@qw ɼչn״S`Zzxxº.)@ƽ*K>G5_[e]V¿o[R)dǵ;X3#9RgS̱f<N;x_hnݛ+ɛʫ I b" L` 0`r8EGޯޛ!LO[ڵ{gi@U͆6Z1bcq;C*xׄT}/Gn=-JFP*)YF5фc)[&RY`C)D'ymZ%n4GgKr~^mrYg9Vȶ٧y1朡"{ڻB dX@x~>a]*Ќg|,^ɤr#$O{^ _jSi'K$s@9c04# _ =ErVוC4 Wjy#J7\9B`&8s!1C;ݿIԎ֘O AІD3!G #^"+EoZ}j@Мof3@0%PGCa^ߝ,j.IUyqY8W݂͚8%,,w0# GL_ԯzsn\TjwWDǐ&%` "lkj oolԮ\f@ȅ!%FqfY1c9X%Nը}*w7ۅ!떾6\^BRՅ7U$OL¼g7?!?;;ߝ}NRf-(\)sp,m[xSZ2dAD 2Á&ຐ4R#~ǶJ bW,[c&ࡎ%)y!$^=йpGshHT&W@0RnG Jt0q9Wh~?n}j?ρz<1H0:;?D.@4UVj4*߈UBHqE5yc[} ԣuZUc/)83.R$I, ӿMNoɪl!'/QE⣄@}^qou(i|MhOZ<V4E730e!0cܭ<j9aK!<~6PU:'2 gk+xYLYbB\ccuxiq;=P{"#t93CG?W#+L_.VrZuwx֚,yTI) <9AkwD X XZsQWdiedq(͌H=>Uim*E(W508)O#̠9f9#JKE,0})x\yh.xs(xx'R\o}ajuQ`5^OO/>ca9&1ȫ0pqW"ƫ}9WWB_Y[6I/y{ǎ݈bR: w,,:ܴ/1EiK9|j%,HztW?Q_F`[VfBz+OYeh^b#?S6_gYRʨր5<% $g yZ,3CK*`z޾JJmwXSD?/|ɘe8B9^N~wwi̮ͮndOt:a_oy'99WNNNNN#f⽀]]mf2fģ&{d> SrG25z9P’aVurYY#_!aUf18*>E 1M +kAKH#ȫސ򚼹)@dn||H.i䓥YqS cacLDԩᅭR9Mf`m#V(eՔYq)|ȭwщnu5Zbq(}&ዶey)K2(!!.?$" [qǩP|ikS+G V٬s,ไM)JE|refǺ}GZu\]7ZqX5lW(,AHcY.1"bQ-fL3MQW8%?} f=~UOgSYOP<XuyTORRμf<Ĩc Zp>qD l+u_v-C4UYNDԝe?X|u,p0=ldA9ML S'ѹ {9mZY㽞-K=V)"\2,rxR*nv2»:ֲ*,ɒGU9jAaD2&&'nN^;ȣަ`2G1 9\f3139znP۬]&E62^&ccbqK#> % +?[mmcu^Ha H|j5uoQVA*WI@ %)6?ab&ǚ6- . \.^tRWHb,&dqJP,};D qV5]\-1ѾbO؝ȁ q8B"oޡVΌ6`u ;QE|G ,y=Dp6ǾsƞpٻgU$AZ3Dj2-BIJL_1 <Fۍ6L|n%9.k7ZEަI%Qm]Caºd~4enǕ-qשVu국-]tH8)M?1Y$i͜cf+9nCc]z+h6Woa)u0YXh XC9!lbt}-Kr*ہy<.ֹjy$l`v5QSrar¶g]$+ [}_1dlhR$q,RUTb 6#8/oe飉?6*bhC$.N Qb"1 Fk,>x;NOS Spw*V:n)~Rilc70U*Al0H ="-gv[+S4%`Y2F̱(,( S|OƜͻymN2IRGPhU Sal^4KQZn6}H3ƭg0nP3I8e%FXF 8FΜ+9H@Yò3Є X|bQ/ܡAk(杵jݼ Pp/ KgcfeFd0+{SC:V9*ʟ`רhdKyב,a(LW-pBV#qe6̯n?xZj}3#O`3}T Ew`K|qKp:6)s~M; fm(,ҭ1], 3\?tFmSosZ>^ҮGO~Zkp&L9VV]h~bf &' 9Nr/n@F k*PN5/\ǧV,Lp!E%Pr:pg8qUTFʚ8ѓ~ѓ|e& Y+"3`PVkOXM㵽MUôUfJV,|0?i 岈}| U]s@]U%' -bJZgjż0,gCv]ݺu`UuEzމTkPBOHo͑Lm󵏇6W#F[x8ӗS>af\rFǙ݋|TL甙,f Ad'jWV5Z>+Vڷ嘭r@P'!5 ]E=Cԕ|\k0Y"l WAv&:WNl052n F+3xU|ܔ"}t׸pqYʠ2Yh i{(Wޓ*y̜\^F#[_hJK2@IJBf8CC3ŬIXN_@o_mMܽ)6+dŠ<3e+u00wDž8E-}5} # X\XZh`K.ɓ8)1Jk6DŽl#4Z|6X= Ȃx3Vǜjx괞>W>˭WXV~L6,d*KV&^c1Vi׸[b(]?n+݃ɷU͈-AJ"l9X &h̼c=HRb4 uui| (#BTމF<2V\sԖ[jjm>ݵқ'FMQW.`lX FYgkaSXk^5E:66\\/U C}љfve$ISeq H>I\)c4w<W[X"+(p E嫰:MT0mp9-)Y8sfxfNAMMW뺬u$,5H\dFA/27*$;]{xMQr~L013L8#O鎦M]zJ>f1[(P6Ƽ#DL3 hxIb潦UW\{~a k]g|62v>"m 3xq,LC5qW}5ng5~DVaWhk㫹<i` u9HyisBbz{׽,ڗV ג"bTn 9bh+yJ,&T_uj.!~kg'eIX__|ߩ26ybd%D,h- r;B0eB,1 @ b0%MN@6fUy,;l8[ `8A0'2̃)N8̪JٷTNTa]Uk*XARmKܝ, <>(fS05 k=(8ҹj&sVa~m'H4ӱbB¦: w,,:ܴ/1EiK9|j%,H_t_l>);Owx&O(D](H-A=:;!)U[{U]X-fiHI3+#v&,cu%TYCgL!~Cz}7'$* L[5Z+wMvQ}1Zf#'<фro$3sO(zcQظթ-xA,Y Tx) W>ꮹnD>1[1TLl0T`fEoFJ9gq^kzt97HaJ{]Ze H5M̘G2hK0q ʛW$ *rF(ބD.Ypc1נ1'q3DBA->6ݨVqĖL̓#ʼ"3#&] s3[_o5*E@'̡2!a.К2,I)h~[iS)U_F?Iݡ cA|c,|f8a)<vnW4N~yZS}rF񳭶.ek 8LL.k @^$q\ZZ %FoCKWl8Y:ܒ2<q9O eFyOMAgm;c]vdugƨDCU>5.#}ErVθ)5k>Ӓk1QEր'ц!<'ߧM@n8B? EB ۧ^ uVQ4&2 $1EL%` 1Prj[V~" w1fRS̈cRJD!'9R,"z{IoԴЋ1@Of|U˜~bC[1,p?sO>UKWǬNRqˌ+66V6e siMM7-VAupUz(ޫh|Z[W8$1F',0U0OUոF>jcijp! DCQϿo|ǸeNN__p`0H́BwMӯObx9N!fmzuXUHp`<Y4" +h4mg|l[UGf0>n;2z*ͽ *n/hZr-ȥ]%%*eYx_zL捗a/~hj?W\caɌ~kh.lO?GPo,i>'7wOhrunJjxh1eJBr1\@$2310@bpU޹TEO>? )0@"xG~<8 I3J?J;g7v.ڼu,ǜ{A!9 Gʼn1 x# sii[@]DwWXʰJ228,Ce)b2,1jtZv?U @V,|z C?~6Y{=iB9uҪ ,ETg;Vc((8#9Qd2 `A+rq .;;íc*PJ(r JcEHBR ȳ,֣ݛw}o˴ƷbyÕ_# g8ʶgߏVAjuj-҉odGdb 9Ă0<ā0eA%F2W/nWKK  ʧ {Qx&]{bA( y9Ͽw_j|oyow~ϑ?^O{}RGĿy bxg 6,(9Z]}P{| ,ArSLB"[UVkjo:զH(-W cߵ6О#*9,\t>7/!ԄL?|r{xG CfjӻV3cpűKr>+.q=)4LN]Qeߖ(ӺjSr#! 0 ,kկouUv=-6uռh# ̏y3v~_ U4[ΫM|]{J|SS$;'=Мs,bX1îV[IDj.ڋ)#֢?R˿g~G$Te=o٢#qCfJXͱKυ<d{^{i;?z&O d02I>V=|sZгy (ٶl,U`k֪RGǒ~0Fl>FC +?zFquʾdz7S]:t:t:t:t:ty+жADNkaN98Kģg83l9zt1v&<81驍BsR{YZ!MU[wLajR wQW0\-KgE\zQSgd0vDR9ǒ!9f,l/Q~m-%ז9sd$;WrMAT}%DFSQ'/|f rAgD)Bu|9{?ɧm.|ѲF"͕c1UG];u^u+ozkX[٪L;=1O@ϴ1r +/l:a&c1ox ]*6ۍ$X˳fDQL30A@q1w*a^6 nsrPqZKQy"9>3'\x3S8ǖ9\[M+ zT Kv:FHA{Ll2L!ͳ15ǒxox㽅K[6sQcQ9bkKŚeC,C$$[nd[j+QVSvQf9ϳXYOc=&@Ly 4օq/|787wURx+#Fk `̳(fmqSҜ5rdUkx)}B6֋Kȭܗ&&LqJT6I#BKʩٴ:> yMByq;%PpQ΅1%Qb!a@Mi7mWlZmf6;711o\XK:z9%5]C69#V)m5mnS,1fll1pb9w$As=^&-ԧ2Z̪OzT< c>0)Y@DĥrƒN:RWlSn8L?t)2s]G5(\eG yC/ALquZW]-cB2d ^``By. 7z=<Mokg!k롫l(OuSu UX ,f"$ny|ydS P޹%Mp$Y__v*֑Vsõ | F י9pw]qFov5ٰaO,j 0Qif" l.#-]WٽNU _[Ѵv/ 27VDh1,eϘ<c.IAu:k]Ey5V6E,tehL؈YM63&I}z֣6J}gYRͣ!"B9_& vy^hٷuIW'S{fH9HlM[* wakt^]ӊ^`05%o/Q[U:JsA,KtIZS/WN^K(<鈍j els *S@&QS>4JN.\O nl4*K: ! 0bc/1!0w;\򍝥ѱm]M#_+*;3+4eX8!731 Lr[*!3xό7M?.<+FR\GĕZgrʃ 9ǔy%xPmS^NZ,Bu1/4f9g#Uq8O\;i^>@>r'S(u4ϖ) fyTE2Jk}jiC(W=>6 2d8*>am6-$Nmjb21f yrFy+q=|]*-}͚ʱe:a^֎r(ɉ0 #PpR\Ѿڐٴ>so[Q$ ohXnd,,N2_~RyGC,vIY5Mn.6h. 嚶JLL6EbE,! ڭ6,Էf;eqfR `I?X.lz䧑?aWzy?*u!S)OM>N,Nsgbh$hL#c`f|_o#Wƃ4k @Y 36c?!o4knz&\~29s*^ _@c`r؋VSkM.mxD2` Ey v w,>C) BJy~fZES{!DtXk)o[W EK d1X /g2`f}[dM݄WmZn1vЎKdE֌# .F%])%*4:[>vnҨlcEX`ֱd!b["$}h riZިͥ ڵؘDucb2wcȨQ1 _QWSjLr?XZ;&`zR|;` !ӱ ,ڄsb9_8|a.acSJ^k$=sx(NWuT+aRvI̎r5U q x̤=g*%q)R\;"WfzLE`KZ@ly0|1!z8jv[ 33c 4l14w7ZmwזZWԵ~դm>9ڪw"V|1fc$G:nCjVJq{],`S]͔~\`c̅43 /',qGC V;5aqQ{ ZG2REĢA O'AJcӍDQ#c2lj  7r=n(5wM{D+=vaZl%Q\J8#<| ‘Faq7/_j r<+&[Xvx9y!,.Q\i_V: Gj;N6cf|v{ fXp{Ijq5իNDɭ6} 9e DKȐ&!1DH2Bpc(8W!o_|~jlU6,>))+͒g1dRC>qC0H PMT<|v~r#ՒϷެd`3LT/}bmzUq\L1⵿<Ė'1 &2\`a͗z6u5izX&6>sE+ଜB/|d X$un>}|[c^ C3Xc ˙1 ?r g+^p )iO8-Uģ,H٦,ę*Sjosשl*Ezv(AK: U`O<%s,9I#kuTӲlVbΛ]a:մY2Bi9\094A.c=-7Nb6 &W˓$d),VI3iQ;6? z>-~/wo|>Oivy;'*vqNam$5V^VR[3n8r6+dɡUr rsœ{kױJdVT2f% 5baȸzsd]q)ģබvJێ6h q̈RYae3y7Sڹvm~Y@5+% ,TVFP#V s=7F/PzhjJ+[m[AjBO#f+ȱ.mV|!鷕ه#\,_|E fCKK8}nYxOPѺ.fuN.K_7 gQa6,5ZvHxΞ>8"g",.jҭxccaFv'&Ԝ.$d}яl .#B1!|GV׷^GZ^,HW+W)J¨9aps$ J_QJw7^NFqf[ٲUq#$F <#)g921bqƵE_kNě*tD<Ȳcy!8qLt݃qB+_cS21gI Kbju^-ErNJ Ӯ#ٷVqwLEO%(UZ⼁m.W!c"bXf<C2!s2fR ޚS5&]{CdO#\ Jhs 2I.ǘDjO/9+ (p·ZUZ/:҈ lX[x32}Qy)qKqCDd Q9g G8%qu*Rr6㍚!s"qB1eg81=a]\PM܁KŚ08wmLfYRL(S4SezӠtӠtӠtӠtӠtӠuNݪr EE9_NCµ22C?QbPs q(v׊苔g2\]nq=UFi;bpDF䚢rqU5 ͺOY 5<'|DCF,؞?,ׂp?7_.׋jڥ|qsLɼxTj^3/d)K0&wn{㍧ط\syIҲXu!.H1i^. <ϔW8+~gSQi>so]3j歑TF1QU1}Vzt U[;:@0OIS,Lq#,0bsLW.ķW٭Z{6)SciB5&d #8g| x=կZ}o=Ei[yȲbYe$+MrJͷ|e8XUd@2К恠y$3 t|O.4o)^佪SykemGR+U$R`XVXEڭ摴[.ίk㵤z6T4ez$\CVž_LGiV X܍ڥt cG9q d!'fRϸuunYk-weۏȭ)O(X{g_ &i(c9㽦u&; MmWBg| M\D%uq!ڰd7֒fٙWkYif9 fa1݉~\g´i_^me}t44Yg>"*T˲ؔ"!BN'9a'gTM:S.+SZ+% S]V$>[c1B{AyMOZ֯l]zkv+ڤ,K6LcY#^ݘ3ג(/t $i-t }p$Z/K +C YD"akCytd-msfmH]GuJJ-E#©"<۹9A vqP̂mquRy,Ɍm )?a`"j: 10'"ێhHx00K ?yӹuSlm>xW%ely@ml^ˬoNl83_5m]\38Ular S>NV=Ӟ!#g? UjM-VN[낎 '&+,TaWk 1)ٗ +UTUjw6K07TnP bcV ᇰL}(`_%iwt^?״j8VqvHBeiT/ Jwl FʍOqo+Xh- `^.a s;3M%Ign ڊy`^,#.66ZRSUHX DeٮDDbrdcZzmG׻v\KB{Ys}i15F5L ^|gupB0"t|X.XfWw7?m!R|um4DCgCHBe+/jCC?Cc&% Y$ H"o@Oh(qU}P#vwx)1(D"N5O[\mS<[u\ O*mW2iNq7r0z7 gy!B]0 (ȘBLVRc<@a̶[[[5 w>?2|qaE 8P^U 7*Ռ`nj견|FfL8I1+}3qv] f͂Kr>^hV`! _16v=ĐI_'*jV!0q/B誝9dK"ı>+{9`ߟTB:Oo^"=5Il)+N]W:ҍ{Wnnۤ]Xѥ!N͢xS)\Z4h,~l(р,?'|YO?jױq;݃j9c0lL'Nj`ї/#bb%P̘9U'߽UiJ/\Od0ƭ5kp?-_*Y7h͗8JڒRbKU2IJbsJ *%'[!vie4BMMEF1 3w9BȘ?Byɲ,ĘL$YykwQܙYElmֿЁUٸ\3`d}REyL[N5 MlƵӊUb#kBL9$Sx<4Ɇft_<֟\~.j߃|KPnJqChGIF!~*Iv?.W j\c()]k>i8m[QPk?\,JwlVC,x/;M_@t.ӹXaEـiVVؖ69=_?Q_F`[VfBz+OYeh^b#'lJ-UҹVeb}wPTÐ~g {!ř%|]ޑ˞2n[SvaXreolc9: e&Z{^_q%a*'5;"`wA\+KPM7Aں#}.]c=?r`{+ ~,BېVe!K2@p4RH~Q.VHZ'tsPXdp U`>H`"OI m4{lbl`}#XC8$Luiȇ/;Bz-uR⠅ -A Y K<#kI@!gb|l~sUU'=.øzsE`˶KU26C3A G"AXJ$!e{~N4@?BVC[Ev`v qJf]&#,x)!!`E7.20u8~u{s rdI''6V֟}:fѸ?l5h)P$63`25C&1< ,9!Urd]g:YX"7р;ynj ٚ?v1⧟v1h [MW) ;aK[id=jmAzfqp"=Hin~=oGo״\VMq$j?s)9BP#,Q&u8\-Vf8z~+Wbk N?e OEyJ,[ uuUi¾BB_fMEf۟ig[zw|eF?յj-.]o[G |e!Iȅ1JLȆ1 9$Bs)JR[  鳵CԄm}\~8-2g G>%?3@=4տUVUW:8*mmkuuڭsKbؒ4v9f43Bq%\qg%@<.z?4vHfxk9s0a9xDEm^gLM#i[ugǃĦILlw$X/MR)O/tG9 we];*ڪ++5,klWi`2GFH1%X3gqׯۊuWw؛e>rry3$H@%3,#G6NLKC78ǻkPʄ 79`Ig 0/B꟩+*=FQR.4&ּ}Rp15k+b0m|'f2 T=j4sJ8,aP$q,*Dޗ1 (cjDZ`)K8'jOoj?Tj6J&+QmϚMst(>5_?nVXU 8&s풄g3dH^dz7SUU=]ӧ@ӧ@ӧ@ӧ@ӧ@ӧ@ӧ@Nُ"h ܕX¯dͅjֳXG %{$p`lJC /y0l߹bq8LNc2i]G8 #ub[2<S9(,s$+i.9+?:iZ\;z6 Q y bS)r(2c4fBMR^lQl a;r8="Xc%Gsløߨ}+u>h!MkaI02^ؗr08 ą'˳}d3vTw3v|MQTmqo+=(6꾶6բk4!Rda$:&v L= fR0EpQVy G1OT`Uۆ0biaX-L0AO!6 #2Z3d2cD1ġ8wk'۹Sh0yojl@eRQ(ف&sHjӄv.m{~}\9LrX2q,# , )cq,}#`i~cJ %?Os%K,HEW oko9  h50"-Z k`^`֯!3@xӝu&uG6:@8@f"H +f&caacikw{({z]q7N3V]g K y4 ܽ=tj"NGViYF"cp3@bs4" ̼j:2rao5utb6$]Go sJ%LI^a}9j4RF^@l۴ 2NyA$q2#4BM)'l6ͻGs[3fNɓZ 9͑F4LeU:uImΠt+zu68,P,q13,]!NA_8!,.”8ychUk>q?`i |}^kcs=ň0{ (Lj;>MW+qJaح/ҕO8H(g>0q &@NȜT8qae[v[d̤y-6 &$,B?7h"=-w0i iWoIH)fY x7bݸǐ4~=>k>cnU}lBK1&TGJW=S%u$SOI 9ӉrfI`V`5h&jX,,LL&{bpV歫8tP;]uaeI^ql  Dc!+F"k.x]JB5q8va2*elŕNګJynDt=ⱷ2٢<Q5 C=#q,838Aљ)ƛer5mif"W{[Y̊S/vDeh!3kVZ/6vVj!DJz@}DPPfEc lJSsɴrZJd^fy!cc0U74G,,s=\I{!9{W˶/j"up# <=f^F<1b8g^X㫭awu޸뎹"Hʾ4ظ2hVK$Ҭ(/ ?ڵܹ}Lm:fuġ m&\I Ex?\M˔|f6}NmWihʜ3tbYhfv1(lY(<ĞȽ*)ʾtPwZ:Z*{3;¥5oOfnel;c`xBګ>WGa!i$ UTc[[1 pwJy =ΟĿsߗ{Ma?հ8HoȗS#%ƹүU7q^#W-R{i>ec(Sc12zmY>>q~ͼ>r %\V> laiHy 1*܎$7[ MoXg8!(/O0?5j-UҶ~m.^]YΩ!}gNXq,{8uLu[~}>q6T0޺=ο)BA. 1JEr s)?n;?>9|? ./ga;;'۟64~ikNFKYXۊ#u3B@@6UMURWVjXخ6qCDd$2c8J9ı,g83ƾ칪3kB*yu d*63 luHͬPQ[(G!?(,5Z9F]S? wYhb#9 xW9$L"#ȣD4e,b"\GQP!Oii68e? q,D$ӫ^7rWo[C8F0LF~!UD֯zvj$5zS0lWIEKH9B̵|?[[ w~2|q(E)ǜ9ګZj#==u6hh/WL8Y`qg<09FX=)';HGEG0ϒۉQaKTzh?LTM[NVϠ`0xgg0"#6UW>Ϭo/x|Koo?j!_>gU6/Pcy}U"~ݝ)ws?_ShVu՞z?:H"vO{8Xıc?\z+i)*ycMM|>+/l:a&c1ox :pѸ#/6oHK:c~!%D 3-Aab<xۍk͋oZĞ"OcRlK q(EI(m/ E+>xss x|>t:a_oy'99*cZdQ\b Ըyp02QI1bbyˁE3,jޞ FWiҸ?5^ 1qg񌳌VQu]6u]W_n0m9dq&@X&r2ͦ?DZT㍫Q% vKR;D6Ny7k^@fۇt6`MdHX#g6#0Z&Vw8S5)㭣]mJZ*x5P݄g)c"̋̊3jZ]޶ANF2,B b bs! IH$9R7V0,^֑29D;*#%X%{0<*"{sTLV jE5Suн'Y N98{H:t:t:t:t:t:t:t:tsv=g\iֶ~ W(6V.=,?2 ,X}"б̄0"c2$%یaz[vɉW ᒟiq mFu[r秎'ψU{Jd<ѹ${ sS2̣.>4+F[LF?Lc0ԧ'cAn,1"mF(gƪ-=Aۭ7]0*Ma6"g1 8K{,^2Lc>EʜK}Arab)&8a #YgW}.z퇎[ds`1Wo^_#P0A]_K ^zcF#gjZQ7`6feU9>23"Ck&LL?xXSb_nMW{+%퀅)gNX?LG?颟@߹+nu\4;CZ'MktC8 E K3 x1iZvAkN\=MJIUcis(K| oh|$9jc~(Թ)jMCW =mU@̝d9ڞdCfLweTO+>UŧlH+T90Qz W?~Z/b'بˈ3 a,4[`'+C{R{ (J)8%g !"Q!s&C?[WhB?}%Z>GEG0ϒۉQa}Rz55 ~pwcFA`\,*kF"w25d4#ZYUd8/V4z*pJ9ĤQL u .x^JkuyQ(+@e&k0`,{=1%Uú:}z[v2÷sd#]c, 1 8pF1C;IDtMl'9R)J<_hRF C bp8Ȅ$FRcwѦQ=˔i*iNI7 3ۦd"&|d x q@ҪMҩm㳌|df$cD1판$=dKyjj9Z'2uӼC+E{qöY؀!٠>iUT?RҴW"cfKFlfYb28&MRګC5Jyȵ8h a 3!90KH69̻cu6-K%`uq MK3aę |R%\p]ǯ&tq %`Q/TlAUH&jb;_s|[Uu_7AT9_Tm퇏SD2+6Rmly`Uz|"#ra?c=?rOW<{iv%yA5(R4Jqήns+{0F5Ȝ6]UT_#I'73i؍lm ' s,O$^(e e7ȿ_UsuZsRo7{(@ ԞR9i.ð,` 4W^ܹpTi<䳰ʆ!c3AJdp^ے"kϭCp&BzIY ˽qqs`џzK0l$l4_&@&zycz˓>?Z~WXy;e헷} @[tyh9a0[ f-bfmzȣ1kRfbiMODڭ6r%KׯW\͡< q;N]q,YsǠ-jꝢRƶr(m& $s3Qcq=UZ6}ʛ eԄ^f⡦3]ĊlQF1^ e^EU{OKZpUף!Ħ;AY&̱Dc):w nz[G TbY6\ŪChBR@^X'60DG0i#կSNÐ~W`xҎPG2exFkmSUTb5+Gl10#Ds83ꪩķI^nܕc[bM9h0# $lsQ%c9qgzrRqs~^VɟyL9g2,9 9ܷ\6fucW:/H$Sb%M1-j}Ep eRTs`EZZ|X5I@q` R C3(0ۈkp>^M:Y,U+ƍzV|N9G=83+e 1+uj $mj`[e5e(x82 Aa E>U#IVϑ{Qf~3䀤,vygf7sS֡: ) 7v5% K*Ś td=݇*,IR2ZMfjrFeqfF}C!ޕUsdd9 o~*Iv?.;H}DMk{'qSh7)Fd}K,?;{qp=ͫ'gOfv_>\+NVGY E Z_Pz4QAPs@^vagE`t0*P)3h30s.*7b er k 3k"`s,d) EFc㓁c|!vY{򩽣~תTy^{2?pÌ , {EJ5Kw]o`QNrAq` Z%UwjPRY e!H3qq׫lըVJQ{v+yf?:Q1{9c9ı?\ ׄ8_E{CmV@^* ˺8JQHaX%9},=WD6uƭ/VKҫ&q8ଜB/|d X#OuG@o1@^}`ǏiU!ȪHJu/K46bqE/ -ٚESRc)LW-I20P&MUĂ>I6/_W٩?*ڏ얦m"G2Nv0CmGqOkmTE#2d&BK2erc&e&a(1A54\Jڛ4|a "L ESȑiqړq!_2~s|[Uu_7Y3r ë<ʶ~&öfzkn&UP$ V11 'T4&;E )h{R`@eO$Gh˂bjHB2X;*4^7s9kouoͥme Cӂ_t.jXU x $UZVR @rV$d!3 c$q6\ʻBOOF,9ec(Sc1Eu??Oi-h!ĺ m  dy K2um+8`wWU6!)ϰC$.BR϶?9`uZr5[uu-n\M7_|^KFeN(e_0eHc VگeUZ]aT6&3RֲZe++_A,Cg8k05j+pmn~e|f2a+c&`1ݓ|)()h*#rPْ ˿ {Ab DC:]Uwv. O>W(RU~XcXx9בO8[vn#YPbrASg9V\1HA#^BoZ}oEE[ ȲbXYx$oMt iٯZ^5{>dv"GFxbA3 b2];SQ2%PS̈cRJD!'9R,[V~" w1fRS̈cRJD!'9R,Pj:t:t:t:t:t:t:t:t:t:tn\\ \|ÕRd*v;N 1#|}}dTS\aTc ؿw&.Xi;bf'wLfVWpϨ47~)#qKHN8hČdG,G%W@^uꯋN)4_M5SO?_7٢{{"'45n65\pU\5H bt¸ 3"dĘ֚n5^_9SNRp/o-|J"CE a@GB0:;׷%i/m4T:Q#v,~8sg%z8_~C1sEg `/6zt/kvOS[۷(=V pl% fCYrBfNMu\rغiV7S9]i'Y#g=W.'g|{?ڮX{mrjOa)ݐa8Rc D%O5nk[;&"mNQy!ܞ>Fa"V#:|K/sʾbXSO3Po wһ?QWrF=YZU͇CȫW$0G˛MiCQb^@Xsa0NbXd`խ千Y)-'|uf''Tݔ=X8qLIa[rWΟtxҎPEIy2ļde xҬo)⧙s]Ƴ@j׎iq圳fRff 3L2D̥9g1NY\7wM#p1%s,9hĎ}V rą Ľ"h?ܫ.^Cõ\\3\E΅O\-A|51&M%L'riWVsX1pҬo)⧙s]ڙ凑?WGy +-1 tPZ}^kկouUv=-6uռh# ̏y3v~_ սt(Dc-?a)BND)R)"$BIs)K=_\rغiV7S9]kShVu՞z?:H"vO{8Xıc?P&PvtkPӻ4cF3t^k6 l$ 3D`pp^r^6ؽgN?]ᒿ !N>x3/p1C^kUM**y;xKmcrmMVX݃kŸ`P2 ФCbJfQǝሖR\BCګpZ 5.+y&₆0D>.iy|YEy9*YY`CFP#/H5*չzst5&HG;##:ʑa0¢sMOt &cyO v8J O3JX lxYF1rև+X5̛~˰Zes[e.9,N}~h辶=":o6ne.|I|t&%.Ns)sXSO3Po wһއUq bلXm[nqul1fV b#1! Fp_/|A/Xk|vRr1> #/H5*tb.եF\ufվX#|}S~7MC1ZUSl!{9}"qLIa[rWΟtxҎPEIy2ļde x`~_}JfwO5䯔jϿפO^IlK/o?܄;\潦UW\{~a k]g|62v>"m 3xq,LhAO[vȴ$,ښeN6Td}K D3(f^+Gk؟VZT6giAyN+6ȖB U&|rdJfwmOVѵZm+VGR-< qq~Mm_]!7?{R#20D9fXJ0XSO3Po wһnhO\5f,6oN'mߴY1c#>,{% O%z{^\}Nk_!(HŔ3!ăB290Ø׬/q3m74qM\-Nݟ5+ytVb/aPl&dB4o\rغiV7S9]m#U\˚W?Ϋ=ݟgO|{x/H5*W=to0񯭯lw3|ueNj]bd$hy!ٛJfwjf?G ]l,)),KL5,3b$k9ڽeOOUҵm*]~z$*b|ԔGeo|9z_}JfwO9z_,WUa>?Z7o=1p\}]uo`5%^⓯1>2g8P9 2HK.sEmN^|%]AmbI`L_le8o^+K?E{[NkCnUD% pXIցcyOț5Zngsaw->@쥁Ui|ѸBx1=K<1..\rغiV7S9]kGiկuֹ+Qo-^`!#Rb0،pY#8ؔcNAoo"JT]V$scV,`3 N>@0(i9:|K/sʾbŨ9wWZfҌ< `bS$c",BNqFVeXSO3Po wһݵUSjWV.FqD XdB#F8̳,1דj~IkX+;AȹVЖ10Kq9{dc4~Ds{>5Bױlޱ0mN͵X("d6'wNsyay|K/sʾbXSO3Po wһUW'UHWߖ2`$/~5 05=L3y^kUU,7#xkil0CO M;JC>PdrҬo)⧙s]ujj>Eah)Ae)F9c R1d)f1 +JҭW/ r =<"Rgf#1(Čp1ezL[5꼕[ʏ-{^tQ$% H9,3!sQ 9`~_}Jfwi'*r?%V?_u0F')ҵJG=шa,G!@|K/sʾb^ޚMdb{KdAڎymL5\Q2~̉b 31iV7S9]mao_e~ %%_6,i`L>Af2!\{Nѫ O-o62 bR0,F>K 2B!8省n;o]m3`2xG9Šw Hc>әIs_}Jfw\ܥhzm>.UY<MTe<9boASa<}c)c.-޾4JͰJ|dk<*i~lF17>Xc>g1sgĽ"h?ܫ.׷ {ěީ"u+atB81V:ZFsIoJfwku^\k9jTJR{efP$Be2A6Y[iUZ5QPAq$ӌݴvQfc1!11P17i^}hEANq$eݴvQf1gac( C /H5*cyO> stream JFIFHHC       C " s '!"1#A2Q$3a BWq%4RUVX&5Ch'Dbfg(7ESTrv6YcsFeit T !"1AQ2aq#BRb3r$CSc4D%Tst ?RKrZg^ppVCծ3\Z6s=RB4 %"@Du:p*&Zw-6tO:=0 H I @!7KWn+khn:a2SIJFVFF#!EIaS$pXMԭcV}A+J@ۚ#mۨLrżKt՜|z)ƓYʛIU_۳^HT  c bf {ԚzokzӖjqGV~vXr(}_ 5/<>dO>6R:g CNTciKi#`2p>AVNJf#LEWUDX4F&dyJة@x pNk?V\'rIJMs 9!GXO1gT,FZgSnQoRИ1WFAn[9!ޑ_Ӟ\5 lܥS)!E16p!W|"*>G0Xpjy1.l`Vka4U&g6Y\2bJ[M~^|u֨K4\.s,5gD59iltQ uQƾ:k֐zƬԩ*,trvu?gxb9dmMHGfh5dH,h>#Q dlv؇+' 9w, 85ZU-Nj^4!GO&hѐ$J*Hs~vH!^S+tG/YNt{)9k9;$1(h|*?95C;RAQXk/I`*;V2A ,Cf%dF,U ~Of.kz3yuq7%IfX UTI bUyC&)!D]5XA+ѱdu`>c%vpػ-uS[ÍV-Ӕ4h֚HKg^g mU W^=OW ]k-UÆXɲiYBkLc:QO.P{#Z7PʋԦJ?׷~S k!zo4'ꍣ(h7/Gbe-ڑI}5HmtD5mu Ň+Lx (UI@o!FocC]an%ݾ(L2F/ ^IdLm~OV~ [)z;3y棒098/MBl&F _&6WMNeẌ4$Ia ם".nM"&sY$oOEL' $Ug,Wiᄕ "ERA*x΢,2;Y$4w #r8e>n y9z[W 5֎@@<ǹo3UO4PkxWH`#$,Y,r}.T{{-uzm {㲯Mpp 'tIeĵ>(b|_:د>gRnk4hb;$`8M7 ^oQ'X,] Z\d0RZ T0խ) e0"0o0ʼ9Kd6;/M0UH*K5A^.B#"<1iaFi`T)dsu#5?3,VhaftK]5Ih J^?}bshd]IwۉVbnKK?T-˕]rz !C:m4ec  ;^v Pa{i#W~ONJ+ s Z#b MGH.tєi`[R|(LSЫw`-R:~ш M-5ۋ闇W/'@܎GXkA-[+Y+)]ƪK$ʭ9]BܫӬ"`: Thf{K32PʬHb\`0&2}2|lK!@5mEdYC2;VY(mW:7=Aޖ~_ln"fDUxb#! ׀+/^؊&ᴶM'ܹGW%d0|hU B?H2;]"XLԺG]uP`lhrI *^4FB-^ !QkZW#P ڇO"ӿ"w&j.IHZ2劖;'jSIZb Du 4I t@o)D Dr BngeZ*zC'njgbI۴bI;JrJ%)*uGDRm ,VI٢ J+ FXX,>՝jSZ=@љCJ dFβJ rs%.Y;1:qwjѳqf&kgmy,@F Ĉ5Ig%h1A@B 萃{c[fD+AW! b@Qftc}-5bQtfÑn+Y J>vƛfe0{D!KWu["EWg4rGӰt fzUYW5)}AӸnh]1~|]ӆqjb9Đ$m!:c/&Y6vM7;^ir?.ݶ_3oP vwRiwcrvzҪLd_㤁QuLfQ"7'$Sl}EtǨ%p^גXcgj-ر2СSy?].J$ZhZ!wI$DO:3:?Q"&?!_KFIlg+n)\DXTSVhf2߅j[pmՈ[axf"߅jӱ}0[M=<Ռν]wrURRc,!sZ`wwyRoFޚ j}O2{`fv˸F읡]sYTu -z3jKL>#%kLIUme`CJ$@W$t7XN[ BSgw21h {*ؑx@d݇YÝT :Ez U9x]q鿋I 0`/P.Օ~o}J:\PMw6 mL۴9Dj6&R '#:. *nk'nP!9bRpZ%zNz"-2?[2!Q$.ʛ2RD=Z9xVJ\NGKIVoNK> 1ecH 1ƶ˾O~k<~2H.%kb$p&j!U% K4Ρմn*5o#3YdjX @Rdu #i--xKt&#sҴІQ<]KUOu#92Y.Ek6rzWQWO Ȍ TuqC}K]Z{/(iJa*ŋ՜U 26`][A(!M S1gfrlRI,l=חB(vV5ڑƋ6Umd#s6g4Gܪ1Տ7|9Ov;w"vwlS fVr5 AuRN9YHtyW >zy_%Ⱦ֘|VM+nVvݛ=U80&]}] ZO5fҤä9G&eVKSխ-i^h!4eJI A#ϥGv#^p{O/g#/,h3⬬ݞ>d{ ./Yj>i-3K;V[U$•lUeU2Pf}tHL6SWGZĂBX(ULKXdcykzrd mKQC8[sBt#Ot/τZnΪY+7:1>B1l_FL4ص=/ywqjr}G#-#SY 7{w^кwugP<]2t.I"*"Q\329ֽb-FO^k0]yʂUl+ c^ +ǣ_⽟OUXMWʲ?غ7 :}E,e0sf`'ʎBw&;͸# 0("~KG9rxd$W5Q{n6lYݒzP4ፉ*to P̈́X~`!fI⍥vTgG ;v|ȃ'ߣU'2s#Zxx/_ڞe?'IYv \Lv/IZgGnCa6;%mu*ŇOKg=ul1 LqI[>VYƋ5PŐ/%tu`vLtElWP٥(G Qd[[<]O؏@O{kV fGKcƉEy9 ^BKM% a?l9_t5xG.*՞5;ۗ􍘺g%lVCnN4c"š;+_-Lq`1PK[{\MOFu(繼U4NQ\q]/ȱ?":rRkp Nj&a d1 MdoמôidL"F62VD @lv؂`ΤÅӺGKe2yvjR',Q);*;zit Y7=I ׂ8QL':0 n3]E?%$3[ҹDR fI-nCFCH]|nS rXc,i2C- JvnzꏹB 5{>_ʖe ?ނiA;-ӽĦ[؛n; qvFd`>r-`O~:*ET (ݻ6(o͡ѝmjPO_Ov9lxH̪sMj w)zw÷ԟ}|[ma.?6&kny9:=ƴ.) A4&r' a/|Iˉ\ku >R>7톰`g?BsanKnC_>QV8wwq"&Ba@E#H*Im]5EhϓՎ`gnvۀrۓmۑ'<QC)C{)"nf AX41^nݱH[2ΰuFbI wB"|*x,/L31桥G\c-2(Sf*2ǻ.#E f>{J/5T>'gK x9~eDFJ>rD b{kmO/ݯ&KʆP=d=%Gkn**F%6ޗV ?y<#H_+&jW?%QW_޳MEѼ樤^z Q& X62VُOv;n g?њQ5 W(k#,7jK8P3vf U89w'd>}A @Fm? PT9'{soiB~s4D]UU-;^(ӳE$b! bIgvQےL1I!/>C(|wy|kˏE?(*ˏE?(*wE?'{ Ү鼜9;}-VٷK^ [0; =m)M_5fCEΗTsK$B`!RHY$@۩Im&?q]+ո "väPGa#nTr;8֗VԘ/I2*IQ\v*B@r8]Dqaa4Bܮ>8p@)j'!^TI#]&XۂP^\{$yxHm\︑(x=G,1}xz<#D?] '}k0',tq#%bIi",WtK6nA$FAg#x݁lȂO ;j-7u-c}Ih^7`If̯Ȃ O(E}^ 7.V4[] >.~dZF{Nӹx2o>#(OAbZ)GYݕѐz\twFuKK]نOqwY^5b&D HXm;BiPg<4] vrK#R)[uJ[:(t*SNO.ӓ[7Wޭx 8Etu`}g(rJo`ocըxBQڇ-NjybgQb "w3+ũ^t?6ռ :1L KNf *$2VYJKػ34p8AqL9iEF֬-yM"fHI0 X*WVTמڵ~RO&*7Q毿d+=rHCsfC<ڜvf^{Y"؋ZU"e.A+ 8@ T70[-CFYulzYf+՘*1X(-U!p&v?S@Ef G m  yAi_QA1U;q2ac˦4YӔp:NXc$HXdiČ@Ty^:~\&[q:>u)VYJLg!.ڔFWQԛͅƠز47H'/|AtSJi*ƾQ(iV;y/oNf|]juiR2L~6Zbc`~2ss`[Ni0ymQкa &# kqͤ2ΒU=Xq],dޒWzM&Img>K3-Vq[>BڦXji)oq}j*asLfnȶͥ;fd>yƊ"N.މ\|@Q=#(mz%k&Hwܒ ̮]ƞ I>rY>cg8RF;W殊 T& i{doFtqiޖ^7g7pYM xVe_/n9 Xӗ^WmjUd rT+m[uvYr^5)B\QOwEy[Z1qqKĀ}Ƿ~x&M 5sJU v Эlp$B Dy*7p%QjQ-Mr$)Ѹ ͣ $)d5*"%UTdpf۲A5iUII K1~p)]I& b\QV"it_TܞՠHq`t1a}:ץ.>߁_k4^ذƬq6Sna$)~RUZ]G*Y!1H!Pc6F7eyefMfe1(Ij G&OV,W"?+MR;fB Ƽҫ3K37bJBdr:"A+ 2 ^Ĺ$o6iXo {mhT=Z[5XJ5^g)`fBLd =S XY. ޿qQܕ%yC;w{?!% b l8>ҺZ^ֹ\6Lm̒?]c֝DՍEp/F븛 R |aH[ /(!vI<ٲgi"MuUZ|D$"UHfi U7c.V5v«9i!I:}qEc IV wa]=[gLu>%I2b-'>TiY vgJ+6/32?YsOGj]J2z&:y8k4N|s0eXC0P;f:O3hy`[M=Qh<:œd%''uk`ieԄn)ҦArKf] THQj/4A Wݾ(DK:kb^#WVd_/e]ulĽwFGN-jQI3t.ɏꕼqӲ,_d~5$U%IvIyE t KLtx]g+ܣk SN=%3s eB'mwUJ_LKd:·eVmg=NFi,R[/^Q^)vUFBѬsy^dj<4sk3GbvcFFFufv*X}%h0z+¤w-Z|1, ܋+K mWIcT g=YIV;YZEZ`ībHȨ(#Q'8x5 )՛*4lݖn7+S:rۥRPH5%bɶ;s99ņ(#p0#TKbBJr[7Ez1jU.qXU čq⑺@>j,ɲK1G$8e;Ne])XlxN >7v>đ(*&w x9T>mC,W)}Js30F  FRȱ$P-$܍g +Jl$c8fF^g$3 ЁRCd%BR~ucN4/!,ʸzϤw DJdW) eoTj~k GY&Ե(fRڵuZY:v2`[ܐ*xiNќn; n+ra^ㅾ%B:r8I$ FYר^"RPX)>hWr|_FtXӚĊ<7,aѹayT(!@V2F]!&P݊8ΓיM4jr#;pWS+2)I$$:qF~Oz6SO.*GeznL Ōt Blc$ I C!j(ՌACjrH^[@et֚Jd)hlU-?ڳǸE:vNEd&9`&][\l/jx%[i0JbvpU}FIӫ.ׯzT)eq9e`!,;W!t:C?SuZ}JkQi ѱR؝ޓy(ϑ3 U?,e%_fO6vv\vYBbT5~g}mJޔ뚳+js^%*OzIdF]we@;I,\o>4שđ>+;$4Ľ7A#f[(%f&~{ d^)ۖ5zZBS ! V۳ŒiYdTUfUg @^\̲Ǔ&·*u=lpI"d2, =F5~ܪviۋ]iY0Z` yL{G0뵈s`ֻ Z߶VN^$+C L'+* 4O Պ$C0. l9?Ӿ^]tb2b?-&cCUK zV{IC}]%TŜPTPވ{ʿ"еŒI,O?Υ^/@ _Q\>`-GFܷnw_BÞs_vw;a76r X;nD=:].Γ׽eQ=bddtR!8y#rMK ϻ˹G5^1]an 0f ֧гj)%{w!+%]K:Vws#`XyHBC*Kuk:sX9ũmS*I?TҖ - 3 sӝGZ;sLC73X5[%AWڣ᎕9^|5sk8j$ D\#@h qx؂ho5eD9n)zq%z-cŭyvza=o~ÈI}葉Qw<],oF}K%I؂HdR]ryzp}ql&?#:bZwoPVe+5 ؎@U NwY >ݮuϪYw&5^YVZJ"h&h捔T/?I9N#!cڟ/ֹXgw(#v۹A)8מ~'d{8 pҺVm=vDe^1KW.j!!Ѷ4bHdDR0 Z:ݕ^cʽb'ȎZkF@yJŶV]vͮC7c!YiG6KyȩɡyVƸ`z%6H{4@*V(o%?L<^ʿ2ǥ flق]G%jwOO_ܿӿ?Q銺{ -jM4 eb@rZ'rާ}F8%?řb<;x;䯠^u 2/t7cחz ZCVgO2ʫq'tm#2 h4}&w&R~+;6?_@?}O)kW.u/KZyZ3D p;nQ.址DZo\:pX) h:8T\. 2- IMA+dr9IDRXĜAR۱qZ:OGş$Dd.1+;#o;wpݱ׷xО%r|*rVLa̛VqJ%4Q LiƱ4l~> qQ*UmƘ}SbjV?,q/֥M]Sǽ.v =~,U7qGT-Ƈ3}^.Ӌ*j Mz_ SVgZ46Q?YZY0vʅ(=~KQ Σdܲ&b&UmfbӾi OZ,wVFXXQeO{ ?K7O;Y+UmSPbdQGKң/ ~ «zDi%Su2(J) UX*/vzI1}f['J_۳V̐ɱOi<49Jr|M尭oE;vҍ5WEu4e=iӀ.,\QQQ/;@5iSƩvJX٥B~jv 0~賲r ]]-V,nS%L ˑ궢"ɹBF&vyrrGJU?F 8:dVFB? aΗ=5zDq}>ʙgۆ޾~Ӿߺߤ)>7I{))qH@Rc !ToGGQ{^NuZadza"O)Աeeo8 y%~k]_/:n-{"+_];s>Q4bMs-lAdIպ;e%%OǰJIzb[~G 6 qnZ4﵎i Zk),FԹJ4d(Z;%TGสwb~?;\yq}ƘrfGĨɼF p/h ?!c׻ ɮu ?lN۰θTm0[6x/IIS1lVB@̒8]} sW5) ׈6oKpJ0>*p^fAm8n=Ḏ3td.F;(hXdʗEbu4s^}ⱓ_of'T6Viw`:GǓjLd9;1yvmI<2qbbfVc?OS1VՇ $"$t^d'{C}nz]g8L}~P^ 2x{rԤhK (0M 5K8pku^(_LT^Kn Iٟ[ēGeP3'|0o 8*HSy oBoIo^>JŪ5aJkv.cre]ϒBC->O}+s-QK#vxmolL}ˣ\+b4rC"XA#H3˕۩Y݉oܘS}.~VAe]݅PGcV657)ȲM9{մG6}wT /$7?.Zg3'!3j]+kehE,g^78.Y):ձ n}At]:)JVaE%P#B:J;%Qm2>q9c˟om׏=ۏ/JbgUY4$B2h!^jX!v ٬Vԙ9Z5BIB'{ʪ~h3F?q9fq\zޘNQm꿑~E&&_,H]f~A<Tr[`X# ![m{BJ5qzI4;V[Ybl2ݝLa'h"Wim-oܷ KHM+ؒ ^$Cfrx4ڱb@=DӘh3w"1}WpOuߴ&+QlGj'`zF>tzW_q,K:rdӽҺ~g$ǵ:DBZKYJ#ѝSC1ݯ.iD*f:ҲL$vtPBc1QC@`lXh _gzn D$s3 U$1eu_%Au]6{(#-9.ɒ8.آM,sYpY<||20Ivfmd+?!z^s} ?x6$'uP%jsE*"ͼ3Qy-o^AKRg9Nd6iѡH\,ˣ4.J>G#G#o2id;IkĬc5㤶㟉$D b$=t+^p_ 9 רl4P+-f9{sm,(8@_Qj0e%:N74c/_uw"Rw SǗAJ SwZ$5o>l~-b wF62Ub}s$Qy0b8 5QyTf Qfcg<@XFbK?rkSFZÚ|l9"KN%)qC$sFYBxvC$^o{4q֐iz/~;_dt\YyyutXcojhv[i-rfd /FMW^Jl᧦ش[NK9dfޜҙ+3f~T-p+ IBHXm3Iu'3Զ*P]}RZJbb1-Ȼrj1 񖗔ӼdٽO!kfhGo)a6:8̼kj]lN0Zg>(Sy[U.8GJ8'fσnd}t֧.N JsWU #N ܁+hC4FLPT 0 ]^&-Ƥ1RZ4A۪ǣ U|<t2P{ky S)ez(]Tc*NI2y%wL`~*!ҝ5E sWK<1ɻ+OpnXNDonNڀq,T=zMCtZ-ڄ!eVU`H@B5ݔWB]v%ikغ9cQ񗤲N<_c-I#Sm_l8wb~i"cn>$ez'P2b\#a(6(Y-V"MMkIຏwPޒe[z1ٮd[OSSjBX1@U:$qGqU-0:R|REC,5.粂:]kbxɥF}cWj9bjihrⰯf3*@b;q4K#HB6 pQP-+$%SQb8F573w22⊒DGoDT#&S= t^cf-{X$9z44d|612K "ٻMkDtzoY;Mcum;R4L!Xeb۷4E0ru\ZmCİڃFY,Ljq;# 'K'PXu i;lv2}RƉ,6FB.àX^]ӛ֞Ķ2rr `4z5HU;M,=+[|g42/o#c3(VG]&C:5-a+=3Vhj/\ȿhu3)R %`? CGߪWQ[myxG ܵ)xl0*!,냀fgWȠz#ofG$0Yح tK>⛷)ELڷuHj= Np0zٕhb a=[nV4IzE#I^xЈ'TܴҀ C.a34s%O\V^9:CtiY԰Ub.5wME{8(҆H_Er271$sFю2@g2H(ʚJ ]3/ 4Y4 iԻc1Ɣ Tv&^Ei+qkY+9;5 9ͻ&9+رnVReC1.ȞN:}jl>OFLEnMdڐ'kwq.J'5sJz-֕tmݱ/v;Vj{bdY䑪Ey)XQ#@ k7hG|LظgG쭕Ykʈ#$Rxey4[;GQ PKWoyJ2Ng5|O  VRnuN5cs:r[x,}8 *-( (xb*+jmM-l;vHe3ыZ4LoK2#҅, *CZ{_[YJFJf;-brP+#0Yr7 s3~۱&Zөx,oMfxHY ,AX2HJ{1i{\ Y {^ kh A :li`)~ٍ]'ǧ0n؉dR[1YO2l[z#tZ`IWKӭI&uE׆sֈHr4hd籐Nr,j- h#ު@CF,WZYe8Wl 9-$t8+(rikFBΪI ۧpƂG2ðxSʭ+N(Ϣ\Hcs>{P5OYv?{rL/wofo=m:ӏ0=C6> xkjƟ7ʐq^~il\Z29VվZ;-*TN,gH"[̰XiGٷmS:"z 5R)ֶ?zVD%[jܕKI` q)pEmW_Zj Ē(;]hzT,mޜd/wR.YөSHUR9FBEߏ?aQ8|جb{o~9oñ ߟ吝kWusZ{K)U69<[ƜY 5x1  .[[~IA]KyV"GnJ C I@!='nl^ @'wc/3>0be !tҔǪp¿-Y|u\t4}5ZԅD;k.<ouZY+-5f(m(kJ$YP_` C:I1fldb0TmB ym [xq1U7db6n_wX̵{iK3bлdpV͹FTq‚Ҥ-l> f0{AK#mD4+t]A[S&QWu [Ir;0BUO5 ۄe@l/*#Ie }}X4jĖmCsBrH)Fj#R ;:;R~jSp,RxUIn;)D%Ii5Id )V`O#JI$y`۩į4jrU] I$iڵbD(Y4Γk?zL|N7 cy,rڑ^MeU_G>@>pzIz?uv^?Κv .wôk@>`ڞ+tzkZvj{&yI!TPf@ۘ7Ot,~K?6^.>{H!{);"w]̿zRj sɢY䓻1ŎKik&u Rʺ&cН!݁uxwc^EYkJ(UftV"=r 5G>G#:˨SJG,3MR tFJs!:QlKG+ƌc dv"R\6n|+u~:'sN+~/R3LG.ڋ6YzlNVh9}1ZTrYnYD;* m~FZ''yݣ஛.weT_V.ӡv̗0:BJdmԻ'!͂>R葡p$PcvU _ʖ?f5X?f֥vQCV8Pq>UTW ͬڧحVVl?Jxs,wJe.>g[ΆhȥNcZZQ 5bP - }K4_ƫ?KԮr//8ً}KȒ6eLhCpƵyqݾOiw`녺UX鎏,$Z}c` xB|,˸H s=lB)]8&`ʕr-bҸp[߱ ߽Sz-[Bڭ:~  $zXն r\ *llh3IA Nh3ɰb{i7-Z yC{qtd^`NO=tq* $zBO|D|[rsO pgW=:+nۆ[b .&1*\;tW,fIXl#*33,:b $ 6 r8^Y#T;Q5n;L4fC*"3GJk5H^i ZWNEq͎AT /=)=?Ժ=Kӯ1'0$,qȓV4ȃyp䜃NYM H5:؈\>N-F;#xY3^ q#WCs*a=AFFcԨ(y% 4qo͗` *s:@(*aƷe*OI7=܎It̬v3]P+$n_Rf.ňرۖ ^z1N+|f+7&IX+ºrIo!Q9>>Zh MQ_h-+$<@adui~z5׮\M,:!@EmslxQv< ː)`uZӆ/4iĸZidcΪTUjK7 z96^{ilJLl@0Rݶ*ѕP6ɢihQ Y;,F#FHb͂TSuv!yz^\]HE94 8FN2jtQ/qv&~, 'U̥O$N@#v:?{A+fՁՊ YkISrt#&w#_`CpN\FGNJ>P{Z$}-zy LwmbX$w{lf8sV$'t[z%RvE^A&狫p>d_0D#搂/Z=$WΕGhS-loC[ԬabU'򓯿W7G/oTmn%)y׽36J|^zR6m"xe@BDX* bOY ͎w&0:׻p8u7$US~)+;GjKz̦HG>*+hD&Xd-]Q-$@(v]b3K׫bg*PH5N;0 #w*Cx ?5ORid٭E(cW(ݙ@$ԁƔG'4_rte`%K+9k؂A=h)vK%n^{'FI&fwfܳI$$b=bct.T'b F9!Hete`@ ZSFk./v&<4?va?e}ˏ^:rsjNXSb8AH 8ېPǍh,AAv¾w&$/:Tv,f@fE:Rc$d&ID!qثY N:vS ڍmCf=$4nkg5% ^ W&⻠I&d qǴmfz;ᶫZڛd2Itn٫nӷ!\^Ē~|I ؤaTM~˶KZKX~$B3[ʼn&Η@vQ}b;G 6C]3 k5:[Z~ڽLօ֐ƬRDdLۆWq@fem#f|k9F/#2i"(Z=^]R_ۉ^|=#6Y[HA &GT]|~7Ab8Ų8 ʂK:J4-Dnv:V~~NS46qb@4TG.W~%" M6'?+>#I5=s~-~'DSƤÍ 7xR"Rkj'n ^NRt.'׫>,t$X޺c!c*;/,{t/GZ O9૰(kjiE1cvH£|*7vUk9",IauTAQb>0|T)Ej6Yd]ұ:{MO_+s-c}|$ߎ}.j>aZxY%uI:aIܕYO2<%~^LՀT2 =1FwI݈7/覂s|ȩKn;rǐFv$p!NY<əSL̄__zmDԴ}+;b7hOusf/Fy2=ibVV8T?9'W/em:2Cc{?6Թ_Ob]RT86*x}@bEm1ACvb:wOjLtNJG5?yV@I 0aV,{^ufw+A6o!И.v "B,n{Apo=-gP7nc3#9 :1PNS,'b;Fyc&UӱR z_!%eE fāHGwyz^оk|ռ'X:շ6f.,ٞ$ c`@O@;Xs4fʖI}eݮxzPD{} ׾*(~.NϪB=ڣ'Ĥ3rU᳘Y<푭 א4UF#ZG9qӧN͖?S, wT1*09hz XjSgٵr+1XOs4@QB ";]~]pqreT MdSLbXH_ TXpÖe;Ҫ;+y2 tHک._ingO-s=ˉ>[&̜V30,KNjByΪ]}e  #" ![R;TF(O8{L}tXҚ;3l.R.w?/b"ed^Z)3N܌d$lw W_k oz/c3BNޫ̎fJ &K){5xV5bDD&V!y5vP?oƃR^⏉ u#[J5r7V(*w I])7䧋TG'R$T3 MI$g+ɒHUpmI~ϴ~训eQtnk_$be^ dtx։vuƎ Ku` 'ջ\1IJ>xļr^P\Xc"a鶳-\ת2f^Jl 2>7:E)Ā1@tCdHmzKj!x̉d.J5TAZ U%ә?dNtLgy9) I=ibJxK oJi*k Sk7hUc:' ڂD#02X w ntQeIsybZ)%S:*[yntS72kK HӖ`~!x4"̽R0TLv1 ٕ\ f%uo&qI_o;wUe+6=A6v^>DPXr 5uz5'س*v"Af=RRť7Hb^S[Y_Dް(R٫5;!Yʱ,a$˝#CG*BwR6F X4xӾF}ѭK/ZzđGQn"#hؿrw]dHNꊱ޳s1[Rh2^s[>@V]YVT:eQU!]4]cFz1/USKٮ=;ȥ:^XñN e7% &~uS]ոne^k:qC0\pVkB,(-x@QsFÙEy'`HYnuV`g!${ $4, khUcqd$4EXrQVDIRa>{hU$pbtz%쥬^\^ǂvAfe*u0H^Wn_-.n@{'z喩c![?cj5Gue*)9CJjy%ҝjU]-JZ+xѠXdI7"YX+ C;bԚmAC+;{C=tGœNtU5?-Zg~1CR6bvpp=f֜4Leڐʗck]![EEcm{.Ů6>|W<8I,O$",w#4R=aכ:\a-668UFee;>U}g-)lc&lګ`` jk's|8TJ5}mf~zf_},1rF$;)P)@Uqa?ѿj}%HYdET~\H3B`AT}0ږd3QbkL\Hv m'ҜN ̶f36pj(ȳ9fw 8" bU #+2'Ll&ӧ 5v"0hBm:G';Lx2%f+C*r:WL{D=ս24N px Z^$Hj,EqN? $[LQ~ŅZvuDVÅHFi I)m۴ՏGuޕ]GO\YRs0꒝f2EcYxpf6QԍfUf?ٴЋ%n&>LfS4^܎Ii8|(Hڶo>Mexڶ zP @n|޺ }ygS$z/q .CZ~Bj"ۙ9KmԫO#S#h뜌3T'[)%/{}2 IUi{+h^P0Չ O,w>9d$E䷅oH4{nY=.[V|'r" *2-t5:\XGw68@T"TlXmG\X̠u z*lZ 6,610VW4Y1ػeTwbukϖa*ļc#1P{f]?+ºd)zvv w2.fd7r5y|Ig=+dIpeI$&Bb6(Tu~/(Uɪr6_rYZ?ͷ{_ {_"T[$3Q ljջi{xuvl@d&i:N N:I,;t Uv#CsS!+67V>N՞ٱH2UU(\O^Z\}-kWnqXvWfsiT4FTE2u^|H樗/t|=KOOXѽS*ֻz/Li#$FDԲuqz-\d~^$uvq/Tc" <\Y.Q>)k`UJN.jV>6gNTQ\ȡ4n8< X|$Ȳ})%~[5I@)dXhXw3qi{1blMkcvȮ$[vi}!\鶩ܭ| 0CNAGK$B!d5MgڒҞRMSS+.9TF% "F&ypTŋi ܐ*ǩiwk[YG$@ujmCUJQ:3M*]/Ceeu,y2)ld&id ǰgpcgNR; k=q˄) Qv];UTmA#c1U8G"EOAa",iMqxN}-+Ejp^$l8S")&nk7m=iI}G .~Y$kiOi>E%ۉh""#"Se&j \` P;t'!\Yf&$XX: $Y@qT8.WQغihG]fVC$eӆRԟhތtNd/؛c=?+,*E#0FT#=NհѫN+7zaRKI61FcV^ $z1Jw/Pdt⒯kX1 %<'n!eF'v494M^@٤E"]&\\cg dB۝#(yix){T'U>+ %1r e? ND +*o 35OҰ YX'GU3\v؁-XohgC /PPlѺ[۾dh1xufr DQB],|޴};kUzCCB:IBFލM]hNC; $(A%7w&c]]|rVfMSy|#`2Uײ܊S2P=|״M~ xKƆ-Hw ;l6|8j;M~եs^r4$ɉ-[nÇ c~oktU)fK0t 1 Iu#<;΂&3#a=V.ar*`/o&J0@/ӰoT>FEZ7+DF|#K~dL{ 6 NL\]c+ e$(A;z.Y"-Ajk1C+DѨ1v;y(6@(!JsCV({w XL8`%m)36sX9&ێćdX)7NGGIyN'oin$߳m}^֡nx&-$#gh`7("X9mȑϑ?׊d\ 7dv+G~¢7ٍsԻb~uP4PH °9*Ǥ.Z\TнdZUㄪL xd2b1Xwj T+$*BF(g*l<WouWFh V4N:Ժz[@=H>ݘ 2CD@@ylTuF¢ O.O(9Jh6;5Ό'6k_~?u0`>BTd;^&+sB'V.k+DmCe%E22pYw#FfT}ߤ蘽#ޭƘZxL\ȬV68oMdlϓ8|z*oßnanMnG]iMCjˉb`Bk;Lgz~#6;[z|n2snإW!wZҚӧ%5e[{R8B޵,}Gb[Nd#eMOi4+67^i s4qs-MExic0 FEU޶J;CI lįG7NԬd,{Ν;$궓^ʷ?ܾb3&&+0k2+^4zt1,*d=Yߡ6`ݕns]۴Fp?Kw1G~><gL~%j,Ը6rw[Չb7V*+ +φ'M"]Iܝ\25&a*(H2 %@aH$*w;YpHi?#iWR~F9r_Iom5fG$eX*YUGZt _TKZd%4:AlߓZԳ!(UQI qƳiޣHR|nמ0IFX*(4޳y9S[OCV]pz-%ٺvkh#.rPTGVW(hY jTŇX܀^53vS bAb:L!Rit?.G""NCӚRBt~MzHCkcB"\'q1/VΞt O+Dd8ۓ;*`=Ot7M5N?{OM+)סk+){5{ nE ]qLњ$+ňX6~of᧵?Gi|m9Vv+̍R.b}N$ Pe *DƲK"Wq WoNj8}n]1f≓ 7fbvI'{55UmٸtE Hxevшf]\>+`lv &WI?[視 >dCO-cYAز8INݦ|hڎ"|& -zY~T،_;.旽FtwYesSHZǹ!gFiKq+϶K-;zm2!R9j$PN7fUi6<_;d7 0UY\=[cz%_y_~أLC,EQ$T܆R `Tȕ)RkV9FO`փKX eC[ "ſq! ?m3бEX3%nHdܐHW` !ӧ2eNQ9&w@퀡\ȖZ{΃9?pʜp؎ .n*F9V15dh:=`+ I#cᔆ (~i>Z<\㬎|%,><0w;oҿt 6CL%*âʦ0#bIR2* \0cجd4/usKf'+td4#q 8ɏ_<0N -zU`ÔtT|NF#MEȀklnYwj4سjd-(fe|̑JGHB#n(boԯo@bGIeV?I"*z֤i-!W &*=hW WMH}'"GBGOPA1"wJ,geDl"͓V Տ]g?,'g+N-%gQf)ccY Pz20>oJ>pbEeɅW>'CMf7Z57NU+6Gw? 6IUA%%ž3ڞOҽmNXjX"1 *[r OZMm*[Fǐk)7$phOk+L}rMżW X%?DtSEGGkb~FOY'(J'Cj5ֺGםS&ޤۻu ̦XM2Y2[P{Qu79KXï`c`=Jdr3$POi5w#&.oi%LV.ؒWpZ#0N#?R#Fs.AzQX` ۣGy\M `Do#܎Z"DAS`ږ- vQ_X)xnJڛ-isߥӵ5d:FEdX"а;LOt~r6tsT{/Q+8`c dA'ҿXU5*x:j}30Q(+J$XmUfU$ bkSK=͢I\4H{es͕=F`oiaߤjM7&vr~}=r3ӬFSk*W#9vƚ.ɋj֌s!=楁}M7z=ik^О}E Fd?[09l^沭g8-!^1+? &]@Ylv5u4Xk}*ό\Ov].W]ifV;G2V]fHcEYC/98M/WVh~FƈK YzLUex[JI Rq ys;qU;H0OhҚ_!L~/Z992 ebByo(-1n >.[: ;Wh.l؊M jr$r5 qֺ{W%qɆz[Ocf1`PK#:/pwP031٣RIpE[ ;]: nln@umT:]:_']C+NԹYKQ'fIc^R֔y#5b&@6,֡[Noj'KO6FD-y_(G9k!%!hzcBDSV\i庁"dFs+X)2F%Rѳ3%C/REil[8}̐E4ՔTBG++wAb\}S(`C)&MWH3b[cDzmFǨ SjMrzu?qYQ*% Kea7YsNh}AcZ)|ۗ2ivVJ/SN=1_b 9t;I,ᗙˏC>]*4I$`Wrl^`.8|5ltoǹ={ypǪΘ?\Ņ;* 5Pj/CǛc9՚Xk=+Q@i-2ʅ@1"1bl71OKU*d1XIac_'<=||/E<|xoU&=2^\#kCBūHEZ\W<ѤpI xrqO\)hVUX)s_"$zzw)35fHs67de ZJ(ES$on@LJ3c8nK:SIնu6%Y T%2ƒu%rn Ѭ[0"(66|'gSİkJήe )G̤…G`t6\/JcP'rGR44afy7"NCwI:9:6$ˎ6XdI! lj2(ptma:Bz7n1Cg6\6*-]-VĈҨ)'lIOCLчZkRG4%KE_BsRuܞV:q%ZG݌zn*N$Y, _iJ.HeP[*TƎR#IOq.|~gͱIFBrXRӠjg;v+UCz2X?NZWG<0E>Tɼ38B~*c۲Z N hs41||y{ښ:5;=.)wNK|ѸGyȌyLl}A<xӸXs-CrBEyǓ/]vHsUDUfNjGd';LӺI6B)!݇`trSrpe;W̄ϨJHw+cuB)$*kkZjlFbC[ֹ/2P=xjz,|2# ۍS!Mt6 "XueX=䒔MfK>GSRKF[0ͥY-|$fR,%Qh=}cfe4vhquy%zHĈ4ܝǒ&V,9Y$HGAl좍sd>u<;r<$jGqFf0iI ]¶6RטӹLcfrt0rU۽nvUNw?ƺ=ic3Vz1p,VZhɫ&Xt,}"JKg;"/b%RjU`M/jM3gıI\3[<:2θ-mVeIihē'c{3GD; fy_KP`F$,%\܄I|9(i:Hbt#"EadKZM3븦L%jWk[\*1IĻʈ fZ8M?osi%ZU ӂA2v2Ӫcf+R52ݠd?>cEs JbsLEzG(KK2q˓rNNBv^MyDѳ(Z(y9d&qi,RknR$cRӉ^zf0Dҫ:v{S^Qf8T6FG rwWe-u*Gx#PaJQ]otY>U]4MUPrձaӺтlQեcPY fE1nXЏOO],Zō')<|YW `uȤ43>FZm_}3 -Y|Pz8$Ehؙfُ-B}|Yfz5[^C\?J(+"LK5緡0o9cWO[H%es`ImZU @.˼Is'4$AIke@nlC4~hA?2#Uh2nAVRN`c/{[Y$ Gn9VtVU>uEZk_間1nm3ۻT¶>\x}Hw(Xu;{'%,n=*5(Kh#5I?,r*G!/`7WaZ_e@kv(0!%v R_ 5R(W@ -zyk:2]P̝BMVD.VYiBN;njw\^%>hk9/ڽU2%)N(VBSq(U, tFS3}gyF'r͞B+v6 t~EE#rNQ([蹴NstI\--Iiu^U[1Xi$R5Wt|o h~ӗ[.F>J _R `Hk^=y428/O10M%D;H8-hKX~jdӽEuOֵ盱4x|\6/НGPظ_ֺ֯PX]%ҙdٲU翇]}n'4Nzͪ⊽6k8hT,׆I]lTVu>'~}++ FLht!z B Q-ܚr;.nfO)[1J΢-[[UG6abEJbCndY4M32ղnc:t߁8 $/(`ClWui>u>v 엦JNni"Y5Q>jҎہxh }0#oqn՛IJiGRwGe,V4AW5m[kM-!,r+dO#1 C2sy~]gԌJZ-IoXe^ LxW`C} O&:|}wZ$yU@,ı>I$ZQev?q$/;%{>b;n2:-{UAMf^h(e(ǜ<0C4]Ϟ(-1'KDڒ4ILNy'[#.VQU{]O-i^h4q2H%$G]džRT w?U}t ]Sb$>vkDFdceIT3#>\8}%##bPjlin'H: :QF.D:3_3V Ry7c@i8e1ŋO3U`V, Y^[,|}5u'uYr֩#3LH@W$썴u:[56+//;͐%͢^ z^-y;{Du$"?夣/I#XdjuG'C 4ookv: yZāP;CekZRAx2~Zf[,T%Qjc չ_oٵ5ԝ[ZFDV!Ka)dfc.ZTXޝV\JD5hq )'oڈtNfȤaKƿr w-XaVBj$>,~iBd[{9jj|N.N-L90xl0 ̆s{jkMRͫƸ+&_2W>O~uƁ/ ɉi)'3JķQeX;ŽSzSK_O ZaB{+4{nO-. E~d}IFDž,͔O5E@Af nLɧsJ\X8YNעB6]mJ sLgGJ׶)ӖyTIܱ+#ؗSM,g`amԗo=i {&>s,䌅4/H;(@q6k XߔjżȐ׫AD| "BZjEi+3+#`N62̥9WV!̻nfkNleY'K '`28Ҡf>OUxYzܵ2l,(cԨ(y<+/vZ<X08<<[""զ=@M tLʱG*cH#@ʙ k %ŽT M>zkAZdHPocLrnνun{]BjQGZ#nDטOc7#+AM{#_a>\>?+G2n;l{qگr;mcXXJ_sZS׺x=»H3IĢĘ>(Q#WsFyX ~“"^nұj-aRH{'׹5ݚ I>i~ҟ''\;k}|2vxmoel/A:CTʀ<ݵN)Ɂn#awlA}M^,xL>I&:MoUOZ۽m%^niMAuIY\BrhrvQ ϤU(Ty NtHTkNT\\qjQ!c-Fz]v-)/_XO 0?#6A,lnY,#J>.j_u2ZNE,dzw%0K &D۱>qޏ?4|a}DAw.uө ?C("5 O*é@E!9*+X^-L/ۆoQw? Lv8?~[Ӿ77KҶr{WkonL|R(= ܕB~w /p{3(2Cܪx-Ǩc 7Ho@lػ?vs"륄iFz+ȁ|S,l!FiB>u!'蕌_!kY6oiP0u&㋳EZ1u:qIAI۶X  .k:cVczǎӹ >ʔJ BM\d}`cWIKNɧp9wLq:۞419Ȭ9pUr K*EuFɗ.jVbs2q~j~_= Ph wi_ i{_B*ҟ+Q!YaH$ڨfS /-%Y849  ٕņJNw|L\5fhue43ʹ'{PolԪ(F#PF#{-~u#28Lc̩9mbIhdFx8%PtLbzIhmc;&JբA s*gd+"ar5͈ѵ4fe}G&"fXd r5v1 /Ek'*OƍR2۲HS%O,_J%^mMՊ._Crx94-I S`zYSE׊@=5<R#,+ _H3E$Wg4;p3ݬmI$Vr@VjEDI$/RgLc1=$pXdD> Ey2G"@%oHhTzʶb|"*FG;M:ܬcseeX;AY4),,+D!wOk->@xd||43ӧ]:Xjў+-'nX\w y! <+FױTbꆠ+TepU vKV/`y{HfIxƊ $>{ڧMn5B̖%qUiKR,2zPk=Y̎.>j O"{Ib6) +$?)cڔ1B&V:@bKnk I: 5<$ĖȥM 'P"r!!llFYuf/b)<Ȗ'/+UU?]<68(LիSZ0z.@ZE2+X%Z ȼ'F,\1K R}`I$ak]\X nS-ȋ43 X{&,sRe#_X{3CLddavh$F2m 4nlS+=u^V guV5U?KS˟˱Sʠ+t욡2Zϧ5sBתrA&NI.hlp(ĿYcf}d)bxh^ 4}۲TW^AR=TtFGUdnNj]JeHgy<³#+ܭz3 ,ȇhkDt=Շ=zimxAlыmcci 3;LUE[xa!]rYPulēPoL $wꫯSmSBҝDogb;KI"B.XH9;NE -PW[GOhjKwzJT#9" Jǜ'ĺ ./}E+tڍ,fBqqaN¢,"ʅ#/#M)eηOV&#^[v@jF&wX͂ʪ_O1IpQҮ$&%P&͹rC[ՠxPɖEޤ\!ךWn[nhL['dYgE7)Vdwݔfc^e2Y1hYNږSc dY^4fJﳎSUu#ۅ*18֧sV1(7#f[-^ ?{ʵ9uVYe89Y/V7#*eU T>ydYJU DGw^>ȹ6ND:2VB*Ъ,MxwuNmKƔ痆Z1Y06=&$`]$)=ݛȥQj}n>q$28 Y jXeXLXپ zm7/e Qͼ#N,gx pe" #<b> d`QUPLۅP:m* [nejUV@cBn#&F'J /z7X=Smm3SaW 4QYR'$8 +kWgu=+OfExjkl{be*'qyݤ!;!4S)st mf.DɌtZzxlbfqeqqsEfxؙc(,Uyib>)bFC~Yj݇>6^V;}!ݒ+-;bN)^hDғK .ͨ "Imc)C^gD$d1e4txWثk.jO+ѥfm nԵ]hY/XܥsXČXH. 5dvM6]v2A},f27<ݯ]Ykay-#ƲB$"UBn2|йNkm=/SYƥkSWq/ĖgsVk D+j aF+B*t{WUWGEߩ2PRTpgQL%,YTQelDvZ$*u1`ΒoMg#)LUXĝQG:/vw!Vgc.#ZuGF/oqc>O=6䒖խcezpɍ陣ovYfyB"rU[,+Nܗ\ku#OcۃhV.9EYSͣ,1Uuxj RA/ 0DW(UM3ubz꯵EՋ,Z}gӹ⁜^+@ٙ*gK%j_e=;c6O޶^yg % Vv/qr[r[FRnklMC5׻o~Qa㛶FiB~B@ OEj&l.IbQVSQ2L1fV^t26H/_V{¸]WX,(ӥ/`Kg%{&o`N |6{5-jjfUfBРP:m.mH9 ꮺa1Z%<5 !RK+799qJ`UpX:V?ۇOQyI }Ҽiu`ĤFUѺ=X^7*ejDWA$㡍\*X[D@8}Tu/,aΕs<ѿUjWX3@}Aךp]|vaT@_NC^nyXL`a|xd*+鎠5%lԪ.*8xUׇ~gDxqe䴨 aс@#:~&G:ڦhڍcXXiaDT+wb2} rU Ŋ]+ݱ{юܣbW 4OS{pZ*X 6^\>?31g);uᵇ]4"0O{Jebd{{MDϬaj?׊s,ud[k@E  _oaNU+d*~׆^E:ņ J͑@<j1ߊZ_ u*}{~DF'&?{]B8 Wޘ<~b:TדFk y*BbdpT"oelr"ZX>R++VK*Ҽ|g$ <4Cq3USAb:L}w9P}\*~+Rx8KoVhFA&^eF66"6:{#J{֢6Mja~JY_+Փx]xheci7$c`M.VAx`Յ˔nV]#n@7~[ ]p]KUΚWJr*~)P *C#E+͊_Vץ__YX$}g'#93<[qCHtE#@B/fsxK^fUMyP {+]O!{}D/.T=tE9(IËoqm_5FF0sǻ$I92$fIY;*}_WY_7w9ԑI.p8f%'ZO TdhŌLI^ ̉s^DŝUw7|8VKHޣz3Qۆ:%*B=+Fi0,(Io讥Xu8LvyχsM;]zC yccO + I#Ѷ>H`|н5V?Lֹ߇~g9A#9zh[G_FOڥn^O^X_i)p5q˽0VO}DqsUvڗ7=7wDJQOء.uD-uv,BYgSfkfBx3pO/;v{R?b8&R>?w;P~k2$S?{\O lW{ K~4b27j g"?sT Eb' w FNMcza1k+FgP:Qu\,}8y8sZw@P+rۥѬGJH ՘H}1QxUԧR$x:]8cPQTP\\̈LT9rS$CMUoܗL3w^Jo~$,t v" >T.|0fqlNk}xҥ [(y$;Xs䝶]eܗVqu-ԕ nV9"I VAW[[': m+OKݲa%S:8p.yG ?1%ɘy>Ɣd6Vң]}$-kMiA:ǨAYrf<^5'F0Z%v՟+%EU+8GxI\fk׳gqǴfڒI31ZnMZYSJ;\m/h0ϨSjs=4l6YJyhqK:ʺ~ƞ1>W+ytҩf"c)yёH4fƖϼƎJpE<&PѾCOEg{Q؃- B,f]hG)zRP_ l1ndm=ܔ%LnhYLPى݇pGxDZ+CԽilѱ?#جEyMLOKw"4=eȃ3$K;j6I,˻+6H2-v)MۏC$[7L?Ƈu>N>^}7 qW˟9㐰_icL4M4ekF6{K4o^i;3AܥIVեT(2'n=qs'9seI!s,h0\˥ԁ&>X b: u>BaBnuoQ:uH斝Zy DRHh^5'6= jlf6@իbX3E;VsZ:K)I& a4dPu^b9YϕC,o N\6S㴆-ԯp}5EP\^COKf V+7N V@e1M +$0,_S #YA HeR}J* #i`C+zYM@bj]IM+^i[E鮺τOWQ爊tܕԺM^5ޤ)c39Nj:C%o࠱H%ɵo2֎V PhT~Ӻe]Ru,E ȭQK`Tʳ)e5ΞkIK~V١0%]E9^de)Q~\B$TD7f nK,9zdij7%]vp=(F&kf]%qXŅ/8e;"bE':AwJv7C [jmAƎӮ Ka#Yc+<<`QVnCjfҬ**1}傴nfT1DLQ 4>/ YYn* VBIdXA!Ƿڎf!~vCb͊*v&'b~ܞ{5naGO{:w'kMYr4L գS Tg[wMU4D!j5u6Cv7C–g4u#g$?4,!l*Ӕ(eq߭gJxO daxRU{)F.:Vzq >δ5qJkWqZI =ύ0d̆iKcō 4dZ-A;Q[`< рsnǟqj:a![N3$)ޕl%9F+Bɸh}D!]1[Ge9ȫ[VLh^r|k,1s^9czoP ] .IOj6Y.G~Bx%e䧾$csN 'f涥iS\MM^F^?&!L裆ͬ=H MOx#etQԝj%:9Gje1)>Ҳ~_̣x&@I$}DJ ǻb c?*ǃ`M#} WIbuN-4lc=K{ҋ?B)S vYΒVY$I`V ;{΢-,ёEƂeMm Ip6R3.9ΕjE-Ï023i; K4.X}?9uOM?\?zܰ}GJ@b9 )IHH$QīoP- ryi5'P,26 b ؼdʼBB=R9"]0\au?UӚ75lzMr{(y8d[,_1HUq 99s+dǩ9UR#D}L@3.g;%.]rB#c(fgBhE){%ji[߭:wkWn|KN#?2l&*JZ PWfz}Jժʱzm sMF4ʪWYu cCۧi*v7+,ݴ1,T7(׹-+]W9u'MY*jXfhvj[,*Ҙ?K捄 Pom^$N5ts;GpiM ,ݦRgO6u45RIt6qfw"YZjs;Nb,oBFK4Xsa2J"MCLn'"Cb$[]8 BZ,e⑍aO}yRg\44fHi%}pX3nWa%dKb1 ]+C8u;37=ZRXWWQ;TO{Vn ZD;{ 7" eJǎwLRϤB+?5E"yrI:΁U Pgc^GXj|i^6=`gV7ećĢH̼agKQ2Iq؀kco#>6K|yuLUWqrl$E¨yriJ /u|xI YQTvSBt9Qugsj0%])H_-Az vO ZZwı Yɹ7}QrGSmYӑ2G{NvrRZށ!go4&K^r %}c'ޯ.33Lu63ȡՕLrn]++eQj|ޚ+k]MYb |JOciC(;BfW _mZV0CrlV8eUi۶ gefbZvIC) I=-C%T;`TAWJJ`ӜG|^ų0#IDJ>jWɱ7u('tg%NaŃ3AH@ߋ =CU[ xŴrqBiy -xm[X藺kIrY\xH2i,ovxM}_[Y0>ט&*`%UW 2FQ?oԞδAkj:iS!"PUďrx%U'@zYIa_9܏&ʍ^lx-(Hw%,z(|w,͌0}ڇL|}RY;sWI[fkmz'mUF 'QzwwNؖAKgZ23-E[eL= 6Z݇Lܪ쨠fw༉eNGg]ez  b{#^ +1;`0}LR 7VڦkDxLlRҊXXM۔ӺGΦO|w2[r^+8WvU}˾즦hyzPB5wO.F,FBوg,# p6+LeDGi/NzΉ*5"կ`dgiw`H셗tYfVҶ|ʅ<$d'¹A݋uKl{wˆ)L,eӮ$*(8eb:k ׫xjnf:Ob ϤW)!֥e~Gq sOֵ3V$|[ݹ$+q $*qw!p4sgYkr_Y8UtQnzIbՈZY]uv`rdA0f`5cQ%i$j5"_o%ͧcDDPE$!)`.6X=Af1Vb͸NVBP^Rvij:_צmZήZgz+$Vb#</5 -Ðnu'No׽LfgI.>+)HB$Fh_JV sʚK~Ήd)dQg-"Ɯ1It-~c*[qޡ ږXS'h+d3yUc{`n2B[rwNnz1LDJKvFqx@]\HҞѥ^MozFJXK{8^W\f0gu K[ 'K>x>{WI{?%A,Zx+{v*KIcVwz"a_ɥ$'%zXb I?.qX}=VTKjȥ7Z͈~O2ٗZ'ï}R {{oϟs?=zkk,*Ma؊x!12]eQ#ޠtͧ Ԭcea3RRc9{B5E/他VPnZH|n>\`ߛr hNnT rͦXq^U;MOsQy^:rdnՋP+f^q264_Eֺ:VYMyj=[qG"jCD_uJmWzOkŧ" w*:IWӌ?Uَ ޕR\kqՊ+#I..z# FZw7|<|T`@IˏdsoaG"Ƶƍ#kc0?d_czwGTRqzZEP$V!|mq{QPFgAebQ^1ĻZZnW"^R11-#|Kϧ>ZĨGKjZCZ*xV*6.W=yڪ΢=&/jg$bJbAeBysۄ{,i6?;,.X*ٲZ7zʄ>jHRn:jYhtkV,rω_ MrѐU2 3"-~5'TiOhY+wj٤I%FpCPQI.'OJ Q:m{=v yg74h|e$ Fqw\5"7`sJ^|%OKRv$ 䑷o. C^0W0X$p+BF276nuj3(u5R:G%VҴ*Z9kO%@FeW5N+\sIgϻ|v0G}igk0oK|&j,jCY̽/%xL_$ZZ,BːdpS/;3%e\֬GfHẉ/ugtY4ղ_{$"V)el*Rn), ~يI#gA`FĨfR\6J9l$2cD|q+'#fqZ)-^#T>??xQ q!ב`z?E-;,uKq(G=XT&[}ș7rn;~#2wTK3qvbU_^[*٭Aid31v;+i"UUw'V12+~!)=nպ -AJ)q54I(VP¹=$@vhqaċ`x9cfP3EkӰ[bUFV<ѣfA'yhi|< 0SzMJ.t;VFU[t:io!klIBc!/E=7i=ɈKf9l%WUb$#?eSø#;6/3UM2zEBAfw,9qr\*娚ΓQoO(yIȒhj@.;>7/GpB)i5LskNݹ 1az^t71t(h=J:Gl4%N$|(mypsJ]B.2|7SiJ<+G$R)]iMՁ<=:Rg_kk]gVĩ`2T%[DpX;UefH&=hNJ?5/A;S ĸܿ@+ ס<_]gg _hl+FT$Ҭo/d`1-Y}1[:S5Dv-t•ysElX, 'T7Ư E^`Hݥde2H_?܇QG1CPąxҼ︾-Y1+$s(q PUP߈7\bf])١<tKP/LE$ëp¡@CH3vRC0 TDU:{ My{ ː8jAG?1CqK]=]/p/\L쬻.lxqd<1BE_k%}#\./k7J.^7TXA[5=q׈_;fU!d+F0qQRrKυ|n'{o<⭑[n*Gbm/衧>TKJ021[!&y@58HSmB[EZjڂo/2ځI"1/$Ѣ,Gd' E?n,~[1d'$QcܐT4{=XY-m1M1E)4Zz2no3˃1;q!rwu]̛z`Ӟe]>kLJ7Q{1n[~y?})[{:hQEq|nIxk[tBI 2)@Ɋ,}TӴ4_Qs?~iohٰ*L«vS7 !tdg⫨c}lov6?Ou?JWz_l_'Ue+f$d".¨ <`!nJ}\[6{E%`N${Y3&3@"6%~Bfꆤ]XkIܱy+ǻzy_wrv܆C/ Uv4ClF3mCkԍ'lDc^Ag[TFv,ݦv< ݏUo5igy_)ǨHe%]F_ĊhZxXkΎw'PV:m07]b?鄘 rBr)[Ҏ̱V1'%|Dtvu OK=pIa#t.fe!ҝٞC%}@@'Ԛc1swq2촎t:ye ߝQcTcJodf3XyNt7饚q&&r3.K\EET>tb,xн ~lYJ?gDĶ.J81uc1˱+[s]1mS:4u۪)d2BkUw #qVt|ÌfeAFi`}'L?XV뿸ӗ_5y2~lқf8$XȿMKJ GM˼jޟ(c"GrY$Dw*iM85m(j(1qG[i'OQI~/jxba͔ϑ;\i1NwYUU_f=K= SNh .C5Q\ٱ'Fzq"́ );16R"Qtf5E_*e|lđ$uTb?\J&}ѪؘrU>%;qV,r -C5/ N YP)Y ꀊU8Zf-\ObuƉsNS#[Npek!-=ӹHܝ6bq_VK/Lzu'j9 kJ5o yZfxZWajTF{N̹= {X=:,2xwUfi+qJU bMfkdt5փrJڧ]t˧6'zrѴsV%W83+Iɘt:ML P *PK'Nt'oӝWpi7'՟j\5Ix-jSXLl;:TM?KYu <ƎyƱՙ3S ɓC6+YXO4mMOesi-G3XHc:FQiW+sYITft&l:nΙ*χ3͖tniQJw<+$hhЉf3#JYlvRx#)Y`gG#@~h*+ez z~E)n2,ܓG71K|fd~-oH*xzCER7ӽ)З,>x?n䠥(`e[؝ )a4y^i]FwMd$6q!VN%{}*)o4ɴ).yN"^ePF ޠj 2$`wОG~> u7 5|K.bM$yH&ëQI^In[z4jOTأ6P gSio$r5 (5Ւ(ݘHD$J^5.2t1әyaz9 $s*hK9XɖTBP[{jԖ,KuIӛ=7y6F,,xV> d<2=Fq)"(>!ZY[Okz6n pu۞jZ ܏a)+`'ґXM} 3' UᑱӏĪJ-mI*x~J)LF";ј9i{QfZo^v{,Jm봾j=:uN)yx!NqQ+9L݃v]mH& m:Tu+W@Е`M0܀zN;QGNꄧORX$XaViU˴eC8\pCz9c5zoAi9z#GM>GUb$fWi v=E4Gp~u7K_;MdoV9X/ 7%S}zQw{5TSɶ·l8/ Ud$_7!O%i*Dʚ֮Tk4%ޥzJ!.AjNqs#HC3=CIZ5~hkzYLRm N:VIzQ}&fPXe\Ӻn\+bS52)r1C!C- )CYUUR#W5mcUS&1j}kq$Wc;F`{k<||c̬ itZe T=LD4~\}iLmd޵T55$Y8@!b"]si:zNvYjrqK,uw KN:ąq!׍6Se/ؙ㩇dF<ٙUՊeߡ:OMūYӌvv RCގ09:E 0 &Jʹ7o,IP<8]2(5W,:!qҮQ~ g,㰶%C#q0\ֹPGE=Xz\xO-+Ź\`t9N.u/%r,kRxnsf=݈F(s*-clf -OZ.j`*H%k /%IR z`K݋2Ҏƀ={"Xd͜5ie^WLBZ*ud]˛joGtzLk쑨uKlfGi Ii9[!,XYлsN>P`KG^Ԕ37s<{wc±@/~$MAXiSU+Q,WDՎ:*@'Z*c >y~SfsV$gN hw޽/69,J¬`U(`7*:g]i)꼆sT࣪5&2gf\KYӸ3#iYׁeplg/5#8I 9;)d?,9GrgVi őò.q8ҟPdS:…3D@#&pËڿIMbZw5RKdVhPO'V =T6b;W%!]Xo.|]FN|K35b7du{NzOLZft;`9 ՂNXZ7e\1_c][~ud1_dbk M4[O/N A׽`X4I^9Wⴒ^# ڈhNը  7ItHij #Zx2pfP$*oE2/ϔfxW/'Y.T xj7?r9"g`^!-Sԑ´ov(jb5ĸ 1}#I 9vTG߉A*Q t_t15oSEީw^][9̙9ZH~NxF'~~Sfn},կҭJ%If#aɕw#rח$E)uyb̭ 0jQH>`xz[#:jmJݟQ"AnJ ݍ;t/U!H%7̾)L[}-^ΚM^h vZRI~nʮ5LNkn:c3KZ,Xά2hÆ1i.~IC]9WI\A`7M^jRacHd*SwE c"^k6k)z 2(齫$Hϙ[+*ȯoO.z]&xH3N`r:kJ`هY*; 3(ٱo'I5{{޽mkmߗ=׃\MeY\l6z"?e]H 3\#WH۪(#O!Æ#l(@̖5٘pz廎B9lOIlT!%ie ͷ2,>=^{jrf螶Ki"q)6emѼsm'>#īg BG9bďbG~Lduy}Ev0Pֹ/V)IW"ٚicgP; ]A;Kv)tˁlnHnN~?t]CpʻMˆTEi:YS%~ji(cssY'gTy-]Y0C`ȤǢ~jj]_k[c<n\I!H.X5Cf#NOl[鷃݊B  nIĢOhb#zsYW-Pꥊڰ0Q`6O#HŹrDN @\~`p k/}wӰqK+ s![ܙnJ6Y{T1?39sHڷ[cz\lM %eVc;V?XC0 v]Dod3FϷ6/jsxOĪ; 1fBXCwϴYo 8i֙oѫ3.#Z\K -|Le#=q=h:i9k+̝F2oiKCog }٘6Wz#OjABCUkJb2o#%3?%69eF7#xb>.]!|¬o`>~\Om3 nNw 8Al+Zfزu䓉Ls)/oSuٝ!tFeFwAuV(A_JuCUOsSɛɗ{/50fTwlYeHI噉?:++Rz׸lY1`hWT(}F'Qܝ$>FN ,2 ޥvRjxzɠM@[: B 95=ϧ.JJqp̪6̝K&?.|;lQ뇸,֒)C\c輮c)dZx’6wSf?o>6h1Mž;n<#sǷIV6>F#V3}Oh/U]PrʔiҐI1b%YJim'0چFmc!`<% }.µ}+@}Jv`Kt'&KtG6&3Grc*$a]QDetXמiMǷ՜:#˵0rdžyXl]X w"YruC47}F UgZ*4ny!F,mct//{N$Ҿп;J?GHG7B{մE|M?j)lIK3FͳxN7X>C?{] vD+) 楊{FL$KtLYV 7f$EwU29y#8!q-G/36+=] O~xA 2XyIB1ڍY0=HUҾ+GhIN<*)p 1W7*\C*T8YbR婔>&Y,CxEI;ndjZ`z41`?ަrKOjLz{/=Rr3NVv@~'-ي1>;{s",, 2JNbRjQ2ξ?$]OqAjˬ?YiA4ͬd7Y7xH;40g!2+(_ &mDhާH/Sc>?S1T5ۑeG3 W&]^M"h9v :fm70FDډj/I>[uZ%SK?iܼғWUZ6:G-KPY-9!i _V?|7Nimf;Qz9 ILmQjYR2b!],K+Ns+o9, 7+uzuҚ+b?3LV[)Ft+'ټ~Zu@:8:Y_M}h/ý{ NKKŽ^5bU32-Idl֎J`WZcP8V?פ}1_ЁlOb[X9YX X #hgvEv>!뷹k畡 ]tYc[g*j/rž9PtK0j})'`˛JFGW8Y`nB{k$lW$I$h։L̄$ a讞4MA++gz~GE[ԓ%KPRỐ4ܛ- 18=Œ7P.ykܮr)ImGzNMb÷fbƈ!(S7:fb]dչ Y$rONh7eoD;~hXkhZK%zf0y\U͙Lcmi|6.\Lfj,NjՍHIm6z!Y?f`8eU]Ӡg1&QVCŽV.dqY|Xbr%~#Tk4I'ŔӝLEr'M:e 9/#c3K(&*FM y`g3A@.ʉh 4i#P7ub*]y⎽x #K0*<7Ww-IlJ݌s@Ob%ipl yrQU{G"f͝~?sfv*}OҜ2#>T |I$G[ea@ pYd8J$EQ$l5*[%567kTIl(c=#9FLA0naFBq6yky~)ng˹>}<7 ?r;m>'}> 8/3dV5l~, &ɢTmrE]lUmdnv5hBwZP1!3936nIlO=5ygC$xb6%C0#/] jO4T0VI$,F](U#'c'I+u9?ghzm~y'rvܡVҳZEgʴR+G*.20 .NV|fgJ\y~!J` ȗBz(xq{ei2Krz)G,+}fmS, m>(G1Kµ-X ]X`Xj,kiK$EY|WH#eq6pSB-~uԲx̏N4$33Ko"8#pΖG|J\ :N s1}j :2Unuyb`ʬ\z5yZȞ_f B.CW^7ADzUT鮇B8O3CjSܒ&cb^5Էj:fBHo ?4K4 Mtr(4};z7e29,e_%# !3 M pu-XӐuXc/G-zT?jP"A$\cmv:UǜFF:;M,lZ5$$ThoeWWՑr:#B}@z?Z9>Pr؊Хʤb1~JB,0zzU`WQtWMQMtj3D$Y,RMS8I"d$䉢n+1vp-g`U2=BpXMpʲ,H?,͉5L?_T\LVO%Yj,\ f^3,[LSCWzm|!D:†$FU1,jē`9"GCh,fhiңu歐9Z*g1HZ#L(y\yn|.v4.4v]IJX2,qV]֩Yҷ]=Toɤ%B%v99uL?L{! Yψ׋38ZGF(X*g o S줊QGVJ/.` ؾCqxL[iԂ +$XYH YLzc[kgh''UD!mO2cΣyB[3S=ZѐQرXYH4?" Z 5D@A6 Ƿ1 v4"ݺխCO%bC+d/+B+0G.B[2uC]>f掵+P8/2j\?m[}Y14eB(Yܿh> r IKqX'Q:^3°5dNhʕ:7ڎiⵔFab!8ڋwHT~_-.Jt윿c +>걈kB@#_5ëuZzzbWGK'ZJF̛?\]E;>1XOg!-H"2,dm`J6OOe98u2҈}HUѣZh22JQu2F7k_Zo1O[rc)ˬ2AGA!j$j f4XU:=B_Ohޏ;=̝nWG%^p` JJUJ4w2=m=;8#]g|xbKcbfN+vd,na}Bhi.jZSYL &TXc{^"ɣ3r,F{ ?ח;չnu<;cVHhF>leVXP!6K1$NAOcz fp=--YoQA, >L2j,MwuRD Eڙ*#؏ޚJl^vFѴxQ{ۮ5Yz [3^́$A{Aƣw@Ų쾍ܕOR^ȹcY+Q itTT(Bmd\-yHg\Y\+ +hcz u6Y9 4Xt.(TmWAj?ǂYIj̚}j{2Eh~*W5Hg>eh²&C/6t)F`!>{be~jVkV McU채va]cH;v՝<ԉzw%ԹfJ[+JI7Uc'#]q>6JbHd=WP@#|h}Y/t,*zY -tc!g?458ἷrC Wu-v-?Ս;QZD>=*V$JWEM.y(a]{K/"gӇ2cKrY944ltNgN[DZB\4Y۷5Ps=Ȯ\eZ#B9ȡ<+<(TO V)"/jG=ON7UyFCΨcUR퉯1D>URwd6 cx-ya|_}PqyCS,kbyf܎U%63,8򾗵6yuZ9Me{TK, &z;"yUvOf%Eջ6l##*b10ի..CM9x)uFܱl @B@sp @X^Ud~֚OR/#˿~*܌kY57c9m!*ͤ} %J,hr4kFUlw$w j 'H,uSCKf2UI5eWaǀ$y ,Z~}Ù[O=dZXfESVM)IӋjKuj ؇mJvWhR%D]7ۓ{f2rڗc>B) jG[;>*!ΠԣNoaP@ `$ڮ,/uZnJsYAvνӭ g}cOIhVF"F̦,^;BV8Z?la٤ju6:=0jmOM`41ʮIbkFDA~x4.,ruO u\yke?m'kfv1GMt#3;Zq@ї 䘌A~*2һM&Cؕ_^vvj)Tƈϭ=H-=O^u!)v{3fRHy0zA X,%xim WwDF zZobZV;/i$rn\1~' QGW^hWZ()U0eG6ŋ!IK@{XڙS)KZrL;Ǹ3T 61EݒTE`>%Y,iSGH04V͐g사V@/'Hd6;iee*1~/|_Rj~exllC[.,BbսS]X w*K,xUwo}MMk?ҍ!NŒԳfݹ4RHXf}[ yc$]<鵻#!oԦ_tp{#)ڠYd#xSc`x"3ȊVIPɣYw:"H0NEt޼z7~{o֘?~}o^eN^?8Wh2K1cG(BHDkeY_{._f:#崷I`Sy@lTijI, ksĖ)$c&~AEd=LwڏWiXcD'KI C 8]vPw%'#.vzIB,[˒DVnh5EQų* gw#%̯PGf3&Oe,ʅ'7fkY Gۖs[AQ7$y$lgŜlYXo0_IkGGt!gg$ :e^'=<]^MUh~4iʶK“],#FH R~ g@|-'C2 9DRlIO-;l/n hύ#FbGș צ$ GXR ̪IލXτ ϴއ1dk-wC 0FX v,B\+E~kG޵O}sQ+#vhzѸȫoMIRz(,k+P, ;Ӓ1ѯo'{te1gKkfA؏?{_,dȒU;Ķ}j>-x 58PTd{b:cXnd+U&d32wZ%wޠh%`oRV RΨȮu7rVT.X t uޞk.u".׵Z֠iXRҒ)heQvXv \pX6$Z8)l #&ipGUA-}$QDx+b5{*ٿ w##HcR6UNP<yk2R=.霕y-j>[S-?U'J~zp49Pu՚pp90[fUaTTӜPD:Zj-n8ޡ\*Klr|;EUƚHE`mF/ܾcGڬQkvnsiM'p{3ȱ& c1g6^:e/S1[Q WfD(T.gڿ:p9)We*VuG㡂8GVKK BX.m6g2d'/7᭖yiwxif }@#?vqc:uҽG|COׅã0sqa{4!bby'ࡷ/qi$RZ* ,֋HI/4,8JzE5,#B$?sk^tZ)iYC$8 c$m vn~ X sZܝ[6>i2QVC&)W5WCG.SBVnHxx'z[7HLwM$@2=Eֵi$ i2`!XOjlLeIXnx/ZC6%m%?v>gXH(&QLpXv? q])s?{9.e[FExPk |n3ڟ?bT^D|Veܯ\~RsU=']1۷iʕח#ҪIfF2w%f"X&`XGsXQ7'@Mn=y-}C_GJk1bKoܕbfhqiZ(/bXj97Gcb,PпQ/jfv ~4<4BLӤxQ؞:dV$ ՚pg\0M#r:>uh˛tQCƋ׍ 1˛uΌd5sѽ7]&GVj|b!dIjJ.㘼*}:_V7kw}x9)p2–V{2Ue!I9!,o)[SUhjzԼ.MMY~>w%X&Ч%xUX}w7! ,IpZzKdĥ@ i^5~smVo } E/䲖fa$'qSVy26nC5J>tBvY81P߲eb[xbKĆX>LT6 wM=ft?-銙bcF{҂5Fgi$(%ogf4\F#-3g?OmLӐ@^-WhsFf(2@mPD4V"` 86A N:RN<z']Jk՞օŊSݶmvHKlǺzm-YDM$fY1˞*JRVx*0:oBlOG-{y .Y$Ȫ&T$s<<KD<0`/,:؀ r?[Ď<穙/N{&Iϭd˝aˆ>LCbJ-ȑh2*mW&zZ+_F ӚXKoc^т7tZItVUhӏˍ01=Qf'1vlTt/Xm4ժX eG,~>hr}_uQXzX)+TFXVUrWP XY5<ӖV89 "s$5:ɝ.4-}WEinIreGuW]:SoM}k۵oAw:K'XJ_wV&`wzctײM\&;St48vTG I{+%$lY"82ڣ=YME9N.vO {9 v@Y>ͱj^Q5D\!g1YzIңкl)`4Y27$2^,j.#8G$ePÃNK$+R/$H /}B=;:1C) ɀj{ZQYvN䕥igy7B:e+u? -aEԭOc;8G$^sH$="j@'PӹjE?O4&iWPS;odJ72Éٜn>oTjdx(!n,O BITB20Sߩ>ktRVIvĬb0X$38Umª+uWg2ZjY>2ٌ|t1E$T+WMe;sQ!ьՍyfY>RZ]#E쳌\_"BK9fm3ȢVU=ΔDp>r\f[J M,@ H[b6'b0O E D@d_ ?LYG@O+@ˀ~Gzm& {#?N?"Ŀ9n?nzZOF27ɪexh P2th}FĀ☐ oz:aV cif@챗U2C^ DNqfV<őW̍22[n;v⩹԰Ē4 l\۪߀Xldx`_jaI^D3ۢ#v c gXWmmJj0ƍ1@DL"bĘ^#Ya$S݆Y|ʛMb8]+"G NiFvk%eϬ;JVE1۳rD3<½ƕ5yr+P\kGqc.RʍDRkmA;'I Osܧ9{U7o%86 H##'׸*/Wh1+zC1dI $0:d$Zk~-Cjɓyn\ERI'#x3*R pc[+TbrZ[ ;):ɽhBJ-;nܾ,OV*X:ՠS ᛾3nU 3ei$X5LkZ)lH[>"k WZJMs߃!Ds;>f&jUvEP 4,A/a6񭘏p/ Gֽxepz 3>v_(JS*4xَI>e$$i;ь43|Q&b)?RG$k Uo*MaU AH'pt/rrQ _ЭNFayϓcUd ;;:Dk9JWeqmQ~62H$A",YIk%G#Hͧ0xYb4|yʴYi&f2:CH+kސS d^1;8뷴Cj."KH`aG.LdHwvj +=C}#j(s{W@F/32,6Hf)$QD,s0vv::]  Wrx8L&5-6<a[6]#O/o5}BISm#tҘ.BRHJexU]eLTΜםKa١#Ln Plqf Tn+U뾰&葨ѥpREDU3Fwޘ+o_|Uej#y[:hYwEO՚ B%nQܝx4sr6>Pj\JN׫kbTسK!#9,bt! fQ'ƺuӨV$h㥎m` U*1ⅷ7.Y&Acr̵:<NRcWFlaN۫TqXۊ \hq$X. y#{Wq |})nNW3xA* M(oz]&߬Ok>:cjTuGೈ 2ʓR;%ci8m3<зk)q+ht2Iؿz2lTg*0z§L寁:_%230;+,@H6WLᱩ|<'HL+2{#N˻.4q"+U"(Z<5t֐il҃aY|DZv_*i|Vsx3y5QH[_AZJ6qv,0"٬?!3ZR@ҺJj|6Pɦ5u<0%:GV ZiJ~ka}{ k9&UfX.O۠WRJ{r]͸4xkߘaݑʏ >oEIȑLs>@ݑvMb}AyјH^)fzU\zUOz,]Gk[U<2aq;}'k\˕ 94$;:AFrkJa^ߤII[L<āqDZ7Fumh?`Hf@٢N<|vYn||!4jhAp-[(C;qf$7 +T`j]5b)2rڲsA` ?x8?iE6 +o'xK~(wj'A[j3+GGrz{ic:yRkqMQbA"]IŐnAbxՊ S*+O`hYzU/mP֎aB8~.N@e˾122b 5,Ou ]&x\4cn\@LPbLo aR|VyHx=9m&wT6j"G<08۶cY,b;NKV"sA:ec 'Q%MA&CiT^*w+v82|d^H)3QT r6w+n)f 1ZHfJS'G|S߸]Zg F*Ym#HT(~ߺ;!iw՚;5 MW%&9o+-K~grMbO_+I,pXz@ I;j"cxjM-&/pP{.I K+[%Xdniu>ysn4.VHVQcpe$xeVVCGTw-KVefMVfc?J>dTs MZ{P q7F(d`1ؼl-yjnGGN u$PGKUmǠ<:2𴪀OQ=$IWUp֧C%EiH$Y # -]ǒ}b47pWfN7G+pvGjUegʇjDlNl!Hacy;BSnmf4L̎lUbAvY^ . ܛNS^MΪ0\B6J pJjk*\XGOnG's@$z!;$ Q15!K#ȭ]1;3+~KV@zWo,M֫)m!9وF~u]!:?FՃ*p7b7HAH+oly~BW;=q #c`IN{)a" j{W*I "GmԵ'R-J q>v"'Ȏ6o?o |\ےYպ#}ׯ"1I>IaF )d [(NN̛x/O#/W b>J k?,~rP|E8`(w!p-:' `Ӿ6ۄsjWUޏʎaFzo}Hս#ѬxUd^CܘUina ^Y4=cK($ ;Fsm2,u,{^^F݋0Fo;؍>Nz Gml+_%"Yg"F=G /255tשXv/\َR g 2[]C z5o5]4u|`l`Yb'p)|P; X(29/_S#q2n81"EYCB2Ȥ;[W?LCK_#Ӝ%ɳqaY6nt1ڞK5r!bS$$IK[r !A'#ݏqmv7~59CifPY6k Dx/N0uQo_>2º)'C]5oy )oȄEdD Y ʍlp|gc,@,86؆}!A%鞥!գ2ORS0?b ~W1vwq]~\Qof:URI> ];8w; jGS˸~Hʒ+va3N3Ez:MךO˯Fw*R  ˰$i͑\H}i%uGfi'TFfA>6 !j8#%JNH4͆D7vHߛ6w-H1F_4YXPI vv?Hs%jS2k}>c\֠,61WuNOGFC8t=ueƃj^,{eUz؊~ 5^k&Li&$m HKZui`XhtCjw ea5 < 8K(ܨܒ:u,xwkDeAȟ ۙ=SKuS޵F+IoX-p) #p7nE>t&vE|i2OFFQZQËIIkV#סrW}]M>Dsyo |yF/\ j_|;qKy>!>;;uQ*k~4k/W|n_+=8f#ޟ><} aա]J8]L.ǐ+rImw q:pf˥5B}M&sWu78;=Txsepeϡ?/4K!ׯ.9!Xm V?y F9"VP#^<& Yy(I&,<͓Yz}$1X.ٖBiN]RBF_(?.+Lպn#+ƲQ5jN4y)5Y|-z ޼&/\,v[{븫ߊ՝I᧯VG#r F1$p[&BGh,Ǥdq Io%5ޛJń}AjXX[k0IIDyY1d(uK}9_g:V4ܣQiLzIH5xHۋDhT֮#S;D `[Nޢu}M2agƕ0LA)6ms"UW0W4N:O3_9HYy)$hJK-WUZ1=UEwJefP}B.OItҾ !6K Zbtj1VwVZLu4V䀤>3:f6ld *]D6>, =UD%gLQH" Yg1,ZCEO!tEi($~(Mݥz~r*1q,32vR!%d^܊ҡ5ߵ)!75wA9\Fdjl;#(mIgV%iؕ^q;6q &8r+%L+tUH4{= +qZGw WUlZ_8D[uq3架-{5<ލ8#[9afG,  R64FiR-`a1$`8%9Lg٨t5;|,l/.5.smŶ-V{;e&$mٵ1=yYf`()^SڐTڬq n[ =hnЊոu&t1V^LƤXX lݶ]$EWwq}ғ1dʼnIXi( ju5 Rsa8[1bƁ&IHЗR?;}^ -Cӝ/54l-AN;xLƯ=8vXqՊh6QIXKgRj<ͫKd}D#T1bTs<}8ys6-b%&H3AǒVZ.nkTԚPc.q0;/'I'hLqKr0Gj'e*&Һy݉WPGGo壎GVNf)roX|s?/s5{ !/e g|>\KZFdnGdy4aģ; Vo 7?}]l;X+H)YgGGYs%G2_Kd;Vx6>tɞQn tN!o`=x,^m||1ɧR,WGr4gR4v+x*Wr?_Rk<vs-uh*ނ{(%!sthDe<\nH*FޱQC_MQVo$m'`uvU*J+SGO^Y9#: KBLUycenؿgx-y]~~s-kTA g@v5.JdRۇ}]O}oQa Ӌ-NxKjku]8,6n>փ7VKiF\M$ iG">] k{Mnͳ1H)v#v<"Vj4LO4(}=_$thm5k#47DWivc0X)G9RxH#rt Iuy]:ì-k^鼤1Ajږ0M_D`!pԡ)ۊ'l6cJB U& t#MÿmٟcYDk ߸I wH<2_2Q?fԸtU' /sreԮQ.G`EVԵ4^M$0:BNHԽUٶ/K^]!؀#7CNtYt>Ha߹^Djq#b5+\U׳cFKH.1VmYp;Rӵ,"rd)\sDXf_6):\R;d 6¯`xq̀?fpnkzJpGҚG`ƙc_iO[#AVS@_;H^:bzg{d%k2v;Ey s^ y> }jOXbjͪ2f7,hF;ÐېGwCN˕xg#۴5>0bIh¨3__TzpXX$1c`}#!mбab 2($[p $ լxf{?;CjI+tX=Fiہ7:'TTsz[!1LـV=1-z}_<$65,.CF*Q7BWrG\|A *kE%pqix K};w^F Ox˅|@@ :/ }[ˍ&eS@:K7Bە$yEM*x R4N2 Nq+;<9]Mن )V[Y95uiTKf+ltk%7¦(ཧMBjFGxE\*Y(iW-dtKx@ k"6) .Wȃb7 ϣ1izQFq||PDWV}pHe0B suc̨I㲞Y|\P }oxI:"R 0lrlC9 9GTsL&\(y.CyoaZ u_gZE2 6'rv 9rZnXjb5K%G,I< *6P7u*ء+ILqT`ۙi'o!v'>~YhqfXSn4ٞ=ܖ">@>#z3y1|%j߇EY`kKva7%\djNڎYOzfb]q.C8 8meT ~DN?NLt9yqziف,p޳O":" ԩxnt,i*>c4ֶ!i#{,Iٹ)J=|Z4UE"IMl $[YxJϑJt]!Q.ɐ^T_c25VW/ܻ1k=lez_HXe-K4rوט٧jIwFUYC[,}a2+5 ]bU,U'wnbZ22MITAFˤRl ~8EXJU$SUaaFhm(ۀII(*o 7X]^Ê bVEa|nWqh, K#,O)f4*N"h5bIdhة dr+ 0!OLHj@od"4e{+[w;R8і VQ,Ʈ5-]HE9*(X>i/|5ƒ-608)dFX]Q€W!aYѸj|}k֤<Ine bA9o+i$L)@95dr7 rH;KLh" d]rlMUOc1/$9D( ؒ%]( lx)} -e"A:4dRH<xPIoRQQSamOΝIb6* szNΤeMf{>hM,ٟTnLrdcD7]z $gT( ;t(_ A/ikR|[UҴ6l(U#L3IVTyY(qB#RǺ$y;t (Nj9gW}L"B@teߚ)>6o-7+NaQڒ3 o3}b$n4z{o$hrH!\cdդȑ6{G03&rwxR9Uˢ‘pmV"Q榜-Bagx7hCk^WRDkoٕ>#\ P%ʛ!{= U"6R|Zy$+Z}ꊟJیVI"ZV_NQpvb}baНS7e.7Ebd3ocMesOT˹-qFY{?G\Gl}o,|G'E5}F}<Cbo*&똼:'NA$m1S% KGMnqٗ($=L#=ܾxe;${ʲ1FN3o86C] hFGc|yz8˴2CK$Cد&ےρ̠\;֢uF+Nbۍƭ1˝iZF}"{WƧҚs <5Z5e=f[gr7HR=W`}4?DNlVԺ)R ]ѡ$`A<ZV/cJ-IApW%sg$eomըE }bK7&eP['s䟸}Uvd6ö4IfɑPޥZ=C0JA&d*/ΕL1Ђ*Kt=a^ZPN" vn$momǖ;՗`vYǁAgc u@N86bV}}X1HfεnLre $_o?o$ $hlG'ERIN%F(VqswǏ>)O S@v*"ǺCUGuS{=[j!"ZWZ;}J#t^9 +ޟoC#;9؀Fq:3%1R6DHbI!6 zn6xiLvݖE|%'?UوGQonGat\\pN<$/ *0z M"]/8}:2+4}i2 E:3YQDYbqh$̒2O%Wn*Ag={CԞJ7ս-l|Lہ*ю*"Bx 6E/*_ðo++gAj-?f>y([u~v l|Ұ{|2eT߫{K6fȘ,)(F`$j~7da*ӈXi%Kef]ڮSe5E> >wQ_ _}KzOT;ծTHV|zEIo|qyLS`RFo}ZKL?d-S+"I$Fo7$k2Ѻ8lfC,y[M4ؚ 0 Z֨ N'eWZgWu_Tϣmԫ0xqQ>FԈA5kR 㴵́b:2wyiيH Gz<+؈@Mzw%&o)4QrqUIw+qµG0V?hi5v1k4Q;b|~vXN€l@dRB6Ddm Cm=#7GTMvڷ6G {ݴ,ZX#;&(daIN٧ҽy'6ueU65FcX M0<7,i31Ir*ښ`&6 l$LZdMp:/[pBKW-LV헤%"+iV(ɭ4Y]W|na4D*?P5<5a3vk*Xfu޻qbNKu":wHb (i†2A-v9$۱h,;v!EYkj h^x{b*j RRdƘ#B({_^Pe,ޒKRz1ir JWxcI]Ve)HxF=?~hɯ]s:.WNJƌA'^5Vd?&'c0WIիНf~oC-%Ɗ!i~dUo&H Gbl_4,u6+Mŝ[a0TXY-ѵUyw8f (mbQ!aȺ% ,|6rGk*}ݝq_=Z3R[+1VYJz o+TJej"[3( ښ_TbZ,^1B)VI ƍ9VyfXVO2nX.a,`ÏAKQMزO>cR=I8(z; mebH&dtU@ }(dieix 1a#yUU3>1j/_RR=fdy2 UL{VڿPj,^#Rej}nV2T >|6҃(kō^K!8i-5QzNcرa"Y#{=oQ9[\O)E %U7xǾwje@霟dBjH9mrUHTx_\N[QWj!զ|9$H얐kr@^ãOҶdEJ^<J 柶.WXը`B-Y:cEu VuNl4΍j-ge%_%)u7"nöˇ,nW#n +ڒE[}|K_ޞCXi io#L^ʿWw死lʅ3Qi\|cHKzj؆XVIQV 6e '<F6~LȐbEnI(>3̿ioifkYUjMLYHaؑo&fݘz:xIfu$cen$?B?헧!*[aXIB>A?}}? Zg/6E%KVc嗚Q,d;: '};pl梊Gпd@5~L/vd/DZ # D(a̿=ךsEIl.2Tl}#)(Gҝ*I-JimgS(rňR6P"Z 57392B@+9"7>%YyaeFi8S9-k(ܸnX}-ܧ.M!;+D3O~0G5e:[A'1^Uor F:1ȘVЊ%,ˊ Henhgr*F]>}2U dbXRIl[ ~~i ʪˆBF\k~*+GjD* M}k\ *%2d$6IE鋹g%B0M+TlCr:hQ=ڈfJQc#F5.wWl3Fy"(2:?_cҳ]CZJ;$ `,Œ-*?&EBZ,8عuy8i e*7Io,r2ZY */[hE&هsmKbF=GQ$RUS~  wqѠlM2ec"^*[so2qmkI+KKxvD$Q#² vK!He c7vC\*W$vyDfY9 i HB;c`r߼XN7%V2+V3UH܌Y\hP0,HHzHFxd?*vcu% ZO2}*I܏q=eF;o" }z^~4Cqԅϙ>5KV7gpqC~`%C j[6%ZZr1ݨ6pGޞ vLܾZ? ( Ֆ+Pd]o1rVhn5`L*cVV+-`QXЪym)Vj\KiX.1ayrET]r`K ڱ`% d@o4>[(6?Z<*Yֹ{-_N<2n. 9U;{o.i^Y7vETi!@UB@(bU[ߘ[4MQ"rHQfbucΩ"Wi #pEV,Tm}ݚJ IJ{)}@fqA巟 yד8gU[/Cܱ#60!F,{g1sF̳_i p"͐W7aJ8KۋN.[ D*@R@$DVp; w +|ծmJ¹Mma$O)7IG 7܀Faeu&c2z'Id3da$ϰfNEY9#ڽL`\39%-$Ay&(LEF\O3bPt4PԾd>^6Tn'q$gs]p$8( }*n^Z^!Kl>>=IZWtK@I%Q[7rܞEƥ5j)`7ḴuU "H,)-d E?KMžOd792W"hf^v %-|ITBLFlvr؏GK!o;{HF5&VEhga;+9coQ\OPSek"(ey62ʈAHHay U$"4 B t*I!q !w$f>Ŭ\%ߊbI>*(}޻L$VIܶlƳ3Miސ0`}~c/k Lm\s{ʳE1yb{8u ` |3.C2¶~4K-$eG94Ud r| SvG:'6A2 & b>ba;$lIŽ׭KJ=e,[1ö; 00,o'qoOǨN> A;6'd,; I@AoT(d4K䢊B+ ő4qLdžl7rۨ5`B:CQ)}XbMCz{jSQg#a,~GkUd[sUO7gmDlo}9%x툧+: k 7F670s$¦F㩑G+qo!So>F}zwWO2rڊyB䅇ҎHbHRƟG2FKᆴ_-|B0.CK誧wҭXڽH .c4 b ܂8b XH?>0c +=>X0INCCbjԱYf9$us!KApvƠ[?F/ݿq?}LcU1@8 H]ֽqSGm;w$ȟ.7ۉY2u+fԦ ؟)S[olV/}'orӦn[]1\+|u9(,FG01pvC-kau,ñ+ʰrȁ)m*G?ʏf9dܰ V CֽW ΋]yO-VZ"~;Vu SvnEΈcdkTq]ѽ<2(+u.<$qG喖8-ASb'agŖ`q`_\a%O*ўQݓpRBG^UmGt"]o/sGCiٯ+J8P1mt0> k5ԙHbJ;#|Ml\3uiv|V=0R>]Y 6hMOEIԭJ&Xfnp- iio0ѽAu_Q5J_&| fXQfgUXȑIA5?I*֫ol*M􆅷bT P#y;QD; ZZD[h]zG H9- eJ@aKi;̬μ\`1SFo{QmVޘ58x_2K_J6k(_quEI样fŠ\iK4i:Q93]#S,?U:9#/s qpʼa=#Aɘ"sX:{JkP1sGk2si_f Τkޮg$G+NFIfdI<Y7y.:@Ñ@ҏ1d[[`j:>P@LȫD ?b~fjngIߌؗt;$&(qX؋+s,Xo3.Y7Tc/:I. SIO`=$_~0J$H/b&N-YT$^C MJT׋,)|L:EEHoYo+s1BUC)RI(mTNMzMR%m$5v݀ n9_ڔ+U_#0hc٦r'QuI7)V#7uf<^N͖ҽCI8weəLGb*1꾼 Id2+ɖIÄX,(U&3/mf9PLM5ުԔ2zcVgnm,cm_$,yo1JVP(FMؠ{>/?H3nv5E@P1 :vF饼IԷ20㦻-#b𚰇D_V0lFlZm,GPRuV{!,cƵӎ̋83Cje^ܶr#S#@@tVuj58:I $h('{y؃ #zҺ?Ia0XKS,lCvjcJ&Ge{wQH$ۮ薮*M12O7B7Es"mY(c\pC!2ڮ=ͩC;"{7|ۜi?Bv Tx ADZ!(J{aCڒ/F-6zO1#Ix-Xӽu'5-jOXn~;$i2;`1 C o0X AXZmn]tk%x"śha_Wdq ȫZ7ɲKY$(˔{=3{=J3O#! n(Gӽ5N˺1YuoP2KEԺ֡+B(1v@nЭѝU a+)UPydFya噋$Ozj?'͛)Q T| j>A@no<{v&Ju贊/_ ^ BJK+  }%2b?][}֣ $kIDqy#veetlA 1S.[g~b xe*x \f12l@GP!8x)}ZͿ-v.H/ȽGP[S%"2#N.6حOJg&޷R3ȒY[ij'0;*{:OOf-QIpvI&CN8 ^ EV(xlu |ȗhv$ ش}͖ V]ع4[G[QVQ\ARyr䖌g KBj-llXF/F鈐Q$uˢ-ϛl<rg*5汕[[$ym)g Ze˲}D܃*İe#jӵa[ggAM d|0#MtU"q{cDF Ygˤ^{#f[画 1_WVIIE` Y |0r ?iuy#W!Ԋ7b^giAlK1=yR+.FUcNecy//Q(]gՋ\5z+h3lw((rrd2b ;* ]('OCyC 4wjɶ#y4USN/S%g1tVB͋ CJňXA`D$'at-E(e+̘<ѷpC@eU*8PKW]Pji5 D; A$(ȲHIcw YJ #Hac̔ıSYķ2$m"yu@ZB"ꍃjK{orE ]6ji­˳#KMY0fV8c!/D}jrRVl*UK#%pM )RGfB3Tb0Iq'Rd1!I[0I<]*hFH,lrWi5Jyud/ا`ےX#xdi/-le31C.)Fiv&k9 5vA@Ƥ NҌp:NõI@ MŌS&V.y%J)YحV 4؏2ZFU"GF;8LlZ/ΥRex`,qVyʼncKr5a/]\Le,X!sKQ$5.܎jyhtvf_TSM=wg;S+na)Pї ZKi)!vemI"@,7;(G)XHZ R鮫BH&/ڭh筬*X7W|vHGړ)|.Cb:<]tatsYlA޴$۩CE`Yջ}\J[ j/ȢI-Awdk,2VTuUPt` ї2e,inW!3 59+Q5O5FHZC!1Ey3PL1֨+h3I)'r|5eOJn7R 7UR{0?S1ϭfHVԍ ĸ[Z5%{́V%b Z+$ fhFW pfC0s+y.*?<ʥ<WA35G$@$I Wn*{$@9(-ت-^8H,I,kv_kp2*I HMPF"zQZws60*B:To}]MuozVwPzov y,GBiY͘$I#mZGfo1Tŭ#p-7r9ecۈ2X2Ԑ&S\eMe2 5 ui^B"տd#Mj)OW@#9q,BEK:t %I7,K#0&Un &v7*~ԭCrad*qfTxtjVY;̂t2v԰fG۸)Rw_%aiԒGj?7ieЪcψl}le>k̶qZێ+Vhd1y2@ q "0FR:y(p;bt %2zX-kү_S67XZYv{&d2s@H~Wm{0!i Y(bK(oQD8V_M gk(g e؎ BKHF>W="Cn6^hIJ'n)d$d)'-;m8CH$Pn,.N<(/:P%HZwe}lu.5Mѹ~bX][k2 [)N@9c4V1s5hňkʪXؤqUC3j>IYi.~J2e4<$܎vnWKi2nWue傼j Z5.)G"V@$u )%IѨڂk&%c"Ӥ.@^q%[GKڎ[]-f)bix:ln|0Թ[sR:Mf!V.Kx6nB?RM{ / ;+|iKMltkNq:UXqjV #q![jOFUz;O& :jv@ mVD +K)> Y~bf&̼ՇDnWLzt0^zXȥeiݿ4F!9xфқxHbVni PjXݤG'9\iy(o]I!$T悔-jvOЪ L}K]GrTwQُui ^k lQ2C^49PM_JJ|i[1q9yďgfv&9BD?rI$ϊ[Kc!ںI&* >!7m`qX#ImBvJT GA{FjME(˼nLwB;HDr*ȊCܿSPe%f2ة&I%tap=H\#^WzAwg7F'!Kn RT N@`R8ddA߱ku1Á%IE%EȨGL=do13\|<%ֱ+YexTKa@}<9+lNI3q%cHo)Wan[HJe;:Qۨ j Onn6"wyld9>?ޏC0yKgYup?jBꑺ) xP6~J"B2to P9~HQo;%%[r!'Rlrw#cyd$XPdQӬm7[H 6̅؝hyp2ВRSԸy;pׯvd#h<ݤbv$6OĥFbؙ Q<ra{Jbe 4z˒ բ0oԮ}Ϩ2Ng1RqX%@fd3 H[Iask{[>L= MwS!cp(. \Sv=*PsC$Hwy << #ZTqs"ے+?&7Wxq۝#SckWnex,_V1$|[1o%sG_>\0qoD,ґ FUH,ձv7p=$W2p܄"嬮Ǟ< ;R|,@غ Xs<-ja-qq#Z,-sSeSQ aj};dQ\[eG!>N 5\lD?Qӗqz5"/l'v$pRHZp ]?pjt4K馝!2\sKrUّngCj=u3^)uDRJH"P) \o3yx6 Wa^:spIwնՉ;yo.>{mFuR_ԩСլetqIc*~Vv_ LZ۶ӺG+9ڽv;RȚKw0^cv{Y+C;Dӡp*MAc(#i!տo^{ֹV[$eJئ=UvbxD *L&,2Z[]viNUHas.wuVF@5zI1u_A."xy c%J)Z_q-K!ԍo}VH!ࡄV@6XueZJ702ZvgZ.d?q M{uJnٙLX:Seo'#.b%9H~X0 5À E"$R{*5USpcɏ;JHU Q EXTBaj:W*__)k2ũY,X.#DXᓉ.pO-+xo 1Zt2_Y3dlyifV;V1^.G']S$R#ufe4s+ndf9wi|eFCFxtd.T΀(!6hVʠQf=(U [@^4ޫr@C3 \y=ӹ y܄1|{j°4u/$* t $EE4L֤{kXj9kԧ Ƴ&A1ծ"iXDhMNVXGo-q24|' BfYl*eam+ NidXիfuXd81UH0ܢV2au5imAǔij0fr]/Dx*w}qV2R؛Kjpܷ#cj5U_6k3q/ǜF _HcE")6k?*6y )ԥ {22oԺd}%tKխ`\Xم}vqGQ!ߋlyzm?4Mo!Oᦝ2rȼ cڔ,.~s$JUQdun:S69&܃Od2-y0b_nTjnВ01G:I@ID[OC4ꦴ~+:GF[-;^weز"Z~$7Ĥ}}I&|vlM G::}I)ڙ_sI %ZRƇyκ#RPPgtb7#KJS]Ub)-}5@(f'&k@#޻zcG>~AUUTDP4"쨋|6{z]w޽Ǹ]wq;z]{k Y }H:AbV`l٥Ghm?vG3k޻XfDaX?y߯H G y_4#>.֬,X4@e*ʬ0 'km;b3+ oXZdZuqn:V@d8U-Vej.-o_BnU0Gw+fe 3Y0N"}DԬmFխ:rB"C"kd ZW`$XQ4@ef$*Ѿ.ȠpD.a7/10{@LwgX/TnZ4Ѷ ! w J URXy LrK(,n>?bcA5UFdjTNϐVUG<*'yY\n: xkuQcWEF!$CRIfYO#G2N:UVZ &wf 3' BBXR^M7Ɖ(@ lX -N.j} -fBʉQ_Hn "A V{'xM9/ %fNk7) @$"5UWEj*B{ȋ͜Ȅ&o*HoE)V0\"#I.Uv"r QjIA}ՑUTp!A$YOUc&{xq!B)gjE^kbch"V]U0+NfjZR˜fBfE-DT`G"0q5(.FA ̿nl%AEezIŭkI3&ii/)I<_T[0,~}z *UK \*;d9,w|k*8Ut31wi؋#N&)@+nNN,/2)f2_%72Hhw&EDweS@9xEjad/\$;pXBډC9rcRV16WOP$f=čBp/"D/ ^T[b ˜^egZk,\Sw:֞U@&Y98Ve8XX/ݖF! !XRψHA=|ew:#%dY~B$Ó>نDw-_I$m_+ idGJ "VX2#lw@8vXոMjU,VssPbX6ݿT}/R*)jM0w! RQ xVH݂Ap{.ڵ[ZgϛZF =€!( u8 WlQ뿕6w#$Xx#Ftֳ]1CؒYO]PĀ#\DXѕըG$yW9uEUI YT.ÀgVn8m_msIdĐVK׊4lAYEnČ> *n@61s9>F|iP5کf%5p_7c+z+JWMGJ@XS9ddww-)heXjfH$b$&Q< 85.C[6bh2ld&pdPv@݆ %wGm2R$>J~E@;ji0Nܚ'JĪ TCcEYUu?s=5j%$̆jYlJ{hx XSIbGYYgi"yd]2) d3sT6ēT"=:-fA٥T#l]x䱞^7/C޽4j#v^혢g*YגlHOKg1u!-R魉oDwad:w[QGku_- L@j 1^TUu=nFHM?a% K&{x\tR4[IJWFc;#mO`{14o<߹}|An+}%L9U-A,6pd*: 87lGBTwikd1jeRQ{s~UodF5Ū<BMǏ =?.m|~R̓ystrPWNIAn!eo2YS*rwC|.9n>륞5"Z=X@+w; Չ 2 R\Ho6mmǟ#˓g (=^Ɯ0%6KȚҫkP'yte{% a`ė+ؑgܝ|1x$kކiwFbW}mvQEH*$~%?ZTfYmb51MmŢ "zW>KvY@߹G%NLw'~'˜~$GoN"TfW ObM# XFfe(|CDڮ3Fej Wf=zȒb4VQKbsO1;;ԵIԐF8/<|7-mRG{e,Bbb"v|V> t^ZЭ"]{{Ro1@3W5!J O-=ZK0 -/ccUI-򤳩ocnۮ7qWe+lnH?wUF#@b%pI%wq"n<(;=]){ _i uvVliK"fBeA awKUxA '''fY%CB')P !T=|A-2&,b8R1??깿N$IG!6ar=qȊʺeO?_3ycډE/$;j:w]v+ɪWNdvX"oqe؇7F9=Ú|7-ﷃ﷚k2 E`Ko@=~CV8ғ?? 9']o$H3d8`f"Q6x|tEk;>/ui2؂iJby~EUjU0K k rCrVePOn>+$rCRyl}KpL߇`kUul0 쿳/\#K+ϩeQ!Q,@k/jJZbFĂ#ڡ[V`mq>}Fj!#y<[ <@`x, y܎[nv\de~9 brvB~(Ūعa'‘˹$?N_!, F ,1݀?W.Dj&i>DT,ώ6#ma|~Nfj #nl;G|,G=F Ya?5e*S=HhKf =1ۘQ|px}գ/ Rk oTNP Y|e,};zw~zA몍nRj}U错iq@4qW6l*~jݞAiOisD͒G4N0/C%Zsqfu&my8~ G#Gd_3w~\u{lm}~;Z{WF(M%nF?B:h-4SGW̉>|Öex>,v1R DR({|gO ɱRBOU|`=n`jd9*Ve$MugW7VvQx.ß-W.Žj詚8ڼs!:E4jfjk(FH9gG^{zynҝdkr%gu9dHu/M-_yU|rƍ jw:ޞTR֊ loNjoW˖Iw+$Ċ2uD?CHۗ;]o<,Z؍MGR@,h]y8H*0kWy5 ,DžNڐ[4UT;b#FpYtuNp)Cyg5TҷC56>.X l!oG1h6SBUFY.ZO~UZ$v¼<9M! q#gQnTWJUŰ#|Rn%4֨kP!A[96էUF;I3Q$sfȀ=2+54A_HK,~ Ք,% 5[Y z d퇍%e^ lɎkZHkn )rP٧.퀣#{1#1.~ci6AtUbew% G OZjI!XIZ4PQ8rcYQ+1F 8+:4fHQ?4Hv䪻G#}hA6vמ˙HՔ($V5kBLZTԏ#X &LEM4NDpWb8 oY KqldtE~׊<}."DXB+|kʨdiJ!Dc5cf+vܖ0qK1oFh'%˒ E#"»>c\nWj]2.J8S#^I.$?7 age)Igܐ䐵iOmϑs.D%P =IH \I#4K[SFw3:DafMM*an%]7p6Z뇦WU,K={V0wP,ܞJ+emglM9,ycxJw]cJ\l9y;.̀$5~OeRwHgwL+&[^{OS\-`l=dhAIl97ǐ8: Tsz]K-E%XB[kK%>?( Ѐ;3Z(qҼqVRzֹ\W$miÄGN|(U l5` xT8;L IDh#6MBjG+,jYI"cB0P=hFzm9]޴y |Ey4쫴AJO҆HJ|W~bzm2Vf;$s) l A |,o# + ZG IarzpwI}!,.[#b#=Ț,5g 9X/B5oB,D`0X/_T89Fm@ܒNIC+e5]ibњrhqӵV-eX1#z,oҾ3㬎om+$UP{)ʰ#EOv̲; hJGwㄼw޻׸w=z]{q޻z^w޻׸3,VdvMF;J$NJC.n#zG'|Fu6<Ʀ" ^(Z*3vR41j,$}|F{]B55>#ԋV+ %6e"&2BW'{M pGw#Y <ڙګߌ *2Vk)fI/c狳"$i2ijP g^eZwba`b%Iֱ w:ZĒ'~5s#Ʊevi=c#n5+H֭+$d[A(F9C"ʰa`? `&>whg=̑*X+.^>|iN ؀»"݆IfgKZg7lj; x<@Rq&vXͳD(i<Јx3̡D21zZ*-Xvwq$yv^ɖ#+AF^!x%bk[SD=*Q64J ! >Y$_lpR&!9 4-+"? ?66e:lblU{S *A=z+ߕ.2s! ڎh qUK3VqbBY/2Aʳ)Pw$i69 ]xcQ5ĠwgX6ec"$ʼ!pnM.?Xhj:>'~0%-v;#G,'71PNH('POd~\)<zE:S3s$,f ?Yf"ܸN(mk|Rf>TݕNT.o*$UYq(]`Tm0XZ^b*vT#$J|1y?xZc9*k4&osB:l+!U!?= 5cl>ɔ};9m륿o+AO~wap-BHK0/2[[CKKǍX(a屢7 '@`JZ5շhbV;c֬yᴩ !`Oݛ܄9e-$k,!匟ye;xEh[-4ң<vnIN-1Nrކ~52|/ C؋WيwZi=j߰J/R%P .f&&LO-MkzPo&UY9-|8_+ZlKLH'o ;y-S?oų7Z}ϕGI!kTN&Wo^FIm Ϯ%HЍ&`wEWl6|zCb|4B聴Uo2ħΌǺ]Ķ_l|Yae &’/q҂|3_݆4g@7"EOټ^?cR7.֯$ҒTr9 ?}u$uf}ݥ$H<`7mo"OaFVvQLN%؇hJ>R]ۖy;m*t+eOަLܝo7&?x>77V)f 2CkVPv6 o;}^Aqcf.c^X$AI㷁Σ 'ˮXV.BThƂwDE,xEczWȻ!^I_;uFm牍\b]ȝw˷T ,Vn$(]q*WRS#pFJULdQΉQ["F!?q$ muq<#$2!(QvCv}b>~Yd9<|DPT/H><1w=F,jT#O {pGTn> 1z v]aFoV_"/q H on G4ΥTPfcCyz</(j efo];;x~|yd`unȂlhHR?|=hrՋ,we_=pi!hJaG6v22*w'e؏LV C&6q?͑ɩ$ZD ,sljOYe"~_ӊ%C%㒸&}"?;й ̕oG(KUrv=^\872&2'+P^@rIc~D [ǓE|),Գ@*I1l?̋J&囶>Cm&H2vV\A;zk'SKG( e[)eo*~Nm#\guEʀ2k7=#o' &y5@vo1}n~1z8P^w&<[;1Ϩ fUQrYm6GvIZE}$0Cxb3cjKIC}O? sgI!j *cI j(uqeRX{y 7oU`=Gz$=Fu #pq;-ԩ~͒>ǴwmЙ"Zͬg̓) Lvw4QF;lI+j"U?eH2T.)%ʦ,|ʲ/$ AbRl,:pXB7H&cr2VݟX}& h %W_ wga?qaG o+=4!;yNU&xc/ke1eTcLBƉi6Lջ/Oqr:,O*šqBx=Vq$cOݭԐBaU`Bq vFč'm7$E*mՔ gOW91sT[rmomm;)ضaI}Y܂x\ea;4$݇r_ Z>[LM,ǕS>(BSIN8ƅ.ð]ςpż;=m?}YC3l@徯#d.Jsqc^Ժ)evUW?I foEtcߩfvUgSP#x I>ccm5G.¤ =<#㷓`|ܪGTK`$Pt(v_|~ЈrB+P?kv5zmcNSv/3weYRP|v;oOv^c},gw-,J =|K??zͫ||;ks#}>1Zgx]Wfɫ#ab],eiljZ[?2~9N=ȯ!XObu5:)V%IasdĨb4y6*srܼnI j(զ,E~J5P-jmRωdE@kZ̝?z-j`GL62n -bpYOm#|@sVޖa'x؏~ק^vFmS66'b<>7zdPx]^ץ]%;_xUC/6 e6;wǙ&x,vae,>-v?}=z8KUꜯ%R_m<#s>Osovmަs ҲӏtgU*ܵsYRf$,l;}i$Bw5SΖi}=Mɶۏ;mJ:?c1 ؆Y]grr*Y$UG(;7bO椻UVjχOc5Xۖym ȃ1N[0Vі |E[Oʼn|x 5W[(B>'I[D&vZHūw.ɏs؎!wJxr#^l1U31cBB ([2-Ghi!NC Q9U'7.&s9sZ Msn>c,tf>K5ZJ,YcM:F`%+HQdP2r?9GTbeAO3d1(W촍& BN+1W;^ -%c_{;b8M̮UQmFқLGm1Ł bBu>CiG^uvC5ֱ54Kqxb?ld@gq6*Z>{w꾍n3KG±H$#XL]&#Ȑ)nNlM[k&s čg4N_W-xT_4wFL"uYv@T ѺO=՗BKCZKfY]$HJZua[}+i:.^sM=2=0;*vx1_ D% ϕqdg&'m7'zنd \c&2bK)e QX3$ңshxM'ؖM\|(!1 xP $FEo36zĖ\ Zy1V%N,:t-F,XxZ]IQ+95#s= {C^⣷@fC#y$S1Nƻ68ce`g I,ФqN4Ԁ21uHڊa{hzyP^Mk/JeVߌU,ſ-WcK[ 6J I=zvҺa3sHd];I[YIcr@@̷…~@vOSyK_.h5Ca~#SݷdxgȒPXnF`7e'G Qs6n* 8'[A^Zib$L*R "ڰX ⟻We뚷Vt29|ջx:b{+&w’#^2 =K^kJi^lRNN^x,>U:oKrպFiE_){/6+#(a#rxǕ%Ot ϕY:2K.vg8x5 +Y])PtթS0cz}r>;QR%Y'dgD*:mX W}:8IMrF>/4 uU hW' AYCs"]SBw{`Xp >qÏ%b":4?Ơ\6FY!Hء;,u#(Ȏw`$||gPrG,K $BzAb:u1!?_vw36F\ D Oڡ? *ڵ8k*@,C* JNǭ+T;ۧV1J5CZ18U+Ib<`7H}ӟdg_T4`:A'ԑd,s܂*咅b/Εzܓd޻\g]wq;z]{޻zw޽Ǹ]wq;GH}EdkQHU&Q4|grB~;Ǥ>72YЙbȿ,~4e}aE*=U#Y=t!O$)Qhm޼;W)¤-; ,q/@9k_KzFʚI,/_ X ZOP\i40M&E8 q gDvGGe7oٖI"[ fT2ʰۈpr܇<2޻XUMmkMjsA7eܫ'MP6o+}"!b5!mVm$Z1ǃ`%rv䰽" y,궽RHk߇$(i#Yf:1c9g+(R"/_%6poR觞͗yHaATu݊tՐә!T2B~`r IH۳Y;M]В@Al A=;Y48tALGQAZjıFP0BOѣ ܄O7/䰟$MxAWdR w?b};QLh=YKoYB>G*_B)br(a" Tb!($#'7I&*5&-X`,I$DLQU%ozDl 4]naRvڷ۰_rղ^ j)RVtfB?r^;z5XrƒI$I,U䅈)dMwamXyƶF[ZxU Uf )f̄>@RV'xa܌~ Qv; Ix+3QPUHH,)-EG}n^Z)pCHG=xI;]Yv&CuSk,SYa &;1/GS)_qKTI7 %` nOcdx,U'&I'؇*Soc,Ő)C;/ aq^'BdccTLI@ޕnW@`fchvԏ%ʷMF XjzrPH G"r𤯕#m_>q5iK^j(R87 *hvEgPy̲׋!BH5jŢwm]#Ǫ26 ym Ԡ8;,xB_BF]3<."waϘm]޶޴hvibk`X͹M[q)6wy?|E5#xz1_՞m5ޡV,eT@Ig8xvh$vAcyeXy^I;Gr\V9,oz*ۗW6'Z2f6;>G<;36)$ CCI :]A5+pR1VzTr|l7A?ݣR9L ܛǙnodYEF=/~YƫSOfNO>>s0s/"b'=ƹI+GYrl<; x$mfXעG#hmu!l|(QBePNwQ;fjLFz$t*_wq78q,%r~y>Vh+/",i+țVǫ"|vw;!oaIGl7;\n߾}RUf.cmOZnIVN}O ֜P:]7'C.v>c46-cf$徹qN6O'L5"]th>TϘ].\uU|IW/yR k k nMZRIk©ZI!CEmI|s k\ [Ufj?ggy2禛d۫ #xĂN|Vd:㞐vX!ʣH*AOZ7}~2w^JE}d վ|n|ՋLW@8dzlwܯ]DW|VH Tvq.=(5 YL~Qmkhѥ3:ѱ;͜0Lz"}2?AYM5mceUvL2;h,LfydEh;]3.a;Ȓ͹vj}Z'n),Uda zu#}{eP #v =U ,$6J˚4JʢH- g5oqQV4OJ|ITxj2#~Hacσxunvooo<9lY_;^6a{4K#P\ rtQ rv .<xpoK.=c n C駑|`] ;ۀʉ]4 |%{8mDj)ゥFjFe]/VwY2UY»鈷7#ZDԿ3N dd/eOqnD6;6;^ %XM̈ԲTl c0co/'ˎ589qR8oq;xm&0<_C?=5&;L.FtE⪙v ]. O421wl$<Q89Kjھ;ڨ4kM憫8穩ّ7@8؍}cĭ!㊕!?#};o;q$2*ҷ+dm~g'@řZs"dE 2y;H}pu{v?[moUz5c䩩՝7p }s?VֶIv*7,<+>|;C28(;G%tC)A ly$J .Aؒv&qƌa~duoQɄG-45l]3v'[O~D\"1idN|@~;;8R]xLs<A;}?XKVj&P_}|'a7FO[Ϫ,qdrз s Ff)ГMKHߊ'v#B%/{r,Nw'>@icTRN){߁uP.|oUorf}@ITy 6*x݉}|/k`n{qmU 8hK+h8%#m.m’HؓS B )7"O=Uۿ6X$Wo?Oǿ Ϥ%59Dneűv^[l@_ًMю$eeP N&?n6]=٫ANK^nF4,wf;K;F(i  aFh.$fc$q%Ri@=ȁg>_ߏo/^NcJMV?=C#wDL͹=f vQaI-5`/o~-yr5O|c:Wc'f1L`e;UmVG#.>I&͞7߄h?{6~[oڎO\מ nv+.?Gcr5u_䌣7VRP&~=/{_۟ɧ;q}o^l|s(4&{H˥և_3,D~j,gVП%4{َn=`J֦Or*dVݷ#d]۟:)@Z5\2݊0)5fxm4?FKa x?w?p:ڗ G+R $Th 4U`UgF *~!Z$cACgo",cJ::p`חCnrcr=DX*si ^+e@Q6}2SHØ8v̽IrFFZN1.κTe:iZxm/حr6VhFzo[,_'bS-VH=Ao]䍎/tƍֱ%*é7sif 50CٓrcPNG|mV?ZҳHID)(e3rHpO 4 LJN5ycYC=qRv(!x;;^B8hfS-.X2s5[3ߜ|+F$!O3FHH) Ϣ%gIH/j@| H-xˤXUSUHɱ$ SPnXdZ9e-4q%k,X[ǪG82/$J밞wI ǟ*K.WJ8dkSG;0$`v5[_>ӫ69%zp`I$TUEmb6yh&kv5D)6H`n8R|ǀx4M‚ We'O=mkoum3*GG`ShLܥJj-&u *c`>ǸK̴_I<&+Z[FN9] u}XZaqbh|a E# P aK/"-fǒc ޗ YZӲA6:4C脧;fXBQ1 @IKEAU[[J/1ہJܝ}l$hP0itb q5/3y# ]²'PRdv7tWN^=`>.ҏq>pUIReVyKb>6؝/" Qq}} CqɺJ5V+WSGp ޻zEqw޽Ǹ]wq;z]{޻zw޽ǸH}|odg/X?_ӒdmIm&W*ە~ ,'"HA/9$2'U߱I׏X=AcJhX4V̙:BIf$#`XqIWPtJybbIY}I!nzZjzA jL7zqݱzؙ9 JA`SEh$'NK 41vCT$f$9TH+ kch]BRID ;Ug Fw2_*IbR*j\?4 , !<u}*/+#ӫv֥*\`nAj5dh] ;E1goճ<3 _`vdgnqWƄ)h^'5JGFS^8[2T'G#xM3dW!v|4ڗ`w)`R5T}{(a{ vya'9}EmW}Jv; <}0W/fkaf28}$ؗvE,Ni7ne>ujzhG`3G(ȗA`,Xٞii#n-Dyo ̓lFdHaKcsXyntfJ#-|ËR18qSqIuC}GP8?^č )e ^7`8|2;m}VgkEV*;y1N+4܃FܧC-^Ee,k8?T&܇Co ňhr F.}ʭt^`&uh2 ϟonJ6#rNTI>_>v `n~a'VK1,Ao"҉+oe`dDY܂93o9\r{/R=u{Ho yp>7 h$q{iP6[s2HYNBSX#>@ 4`nʻ~C @LdXZdF7 wnOG-t#1jlʬ$ z5Y8˗䄦KHHc`cLOZو"v1!6B܁򠀤Ky~ EDTo/uߩ$j&5 d H0{ 4R>r ɞBj2+25!Y!23ܐUv$T3CRSpJ̫w~JSڣab|~< o(K67; >͐ؼ9&; V}I7Qm4GMǷ&?oyJ?{n?Qx?OּEu`/͘DZy;l?OzBd~2]UM}p@7ԿX(  Fvoէ3I}[z"`v$5#9y?@gߑѶX.V-$w&+/W,qGmxl%jUbw-$zovJ$#O0yD>>H>x).T|KtRj񅙢uT h@P=[09jFXO]%|w~vPXIo w܏ϟ>lP˞%-и$tJawh߄kC1@m~Iߞo}))-H;_}mb"ԯ >!zɱ$seޭiRYw0(-66$J͐QK(b;n6,#m_Ӕ j :<'#ϯRf%i 0e[m<)$ɠ|@Xk I7X0M$[Wpe] Ŵgm" W_JGi4o`7 hOoǢsCBJĸ~Y AꍊBX;qEo,2mX4oL{/b|uYT_oˁM,2 2m b! i/ UcL~LBf%xKrvypt&h.hJ-jObB0?}ǏꭼV +).Ez!Io3pDP]1 4|A}YVIeP}_9#S+ˋF<7֖ͬ\KZR[v$u`S5-7g! ذ%^ImR;l ,lv0gjr)rԲ,J1 yԯ3>:e(PC*!^{D u2P -l}<)289s#baVìѲ*M:;%w7$P(0qLܔFҎ; n@Oa~ -ca~6Uwp v,xիx b]K>c"M' 1?]~Vֵ><Ͽ⒛3l7;> i[Yڎ۹$tovP?1(1Yc#$IJ/0&N; ?8Y v^jҮca^-_"L咽,=_xV?u }%vb|A1DQ(0g*vwr|(Cەhu>2zƫKNtbFn-clMxLJ[VDu庀{FC v6{v̒)ī:_!*~6jԆ8vE`UebAq#aG鷡5R۰VUd nC6#o<5$(01Lܔ$Qq߼|>7Z.Y.LF2]tqLX0ޖ`#᥿ˎbVi<+8z~ÑB?*7#G#ZJU,@/W}MWG'—y+]ű n;7Vn+ac*IKMˉZuFsɃٹb#~ْm*y6~ TyLQR94$WcǂN60~%ߟWv럼6\>No|ս+*5mm SP^+~g?o8.-6VVYU͗)'4$ 1mԁc^Q/Ņ`ɽO7ax#=+Y9hK υ% p=\~`_O臋C7s. MeRB,Ó7 =VkإY2ʪ]] ?p۾׈#oiE* f;$?]ϟW"rcTjǽ˅bn8¿/&VE];lHlbw;~ZJe͠yo L*bnōɯ ߢ4QFյ'rams#`w'ՙ'8GBŸ -#44VhmWDzzU)&WS /V]O{zWO}_<|:W"%[Nv?(X *HAh7{yq=1!ˁtNIgy6$kffeR?`YwJwܾO [~Ā@ /|~o?QrJ9ӽ,ՙLL4XH'v>7وfZCM~;v'<Ǩ dN*%Qo\G54muo+}+FT~+m5歠3U‰UY# Q xmzL^)%ywh[lHn%w_x H}uHԋ s] i}MOzk? $K4ٓD&CCaCjjp#| HI[\E2Bع>T|6;x$c[%S"LY~ɩb?m+ }C.LF`Ah s/kkQ; ߖ;ێjWXΧyY0-ǐpy7>=GEZOR$s79/.a7aǸNʩO~RZv))PT^=إbIJqߊkhr_Ҵvt7|q[56nwo,N t r2u[;8EUyu^}>g_߼=fxܹ;om mn8>jU0}* l#QHs]̼%b]%鿰Urzץ0tAN_$$H|Wl*^=YskFi[S<ϧ=Lf^f2l27Ygi% J\\ß,|̳T㶘}<8dhb}!˄[F-H}i499B4u9#1Z3iUz__pGFRZEHR4E*뵗czB=5ljݘS[閎 *Xu$rdáj={J418|RE:-e8\գ,(RdY q<^lIo|U`{Up'*d "^u;MAvjS,Rru#ozn>\3[DX9ӸjMYyױc9ѣal adr>@y,k,w[W(]F]Fo^Z+fM$GV7WuYِ!.>W.fj-+Xvy5F WZήx6 w<0˃' >YlXv6JEG6"HѝB^|[,IUtV.g|ǎ4fn'V5U3:OT.r[e&C,7puUa:Jшmh 9 7]W& zԭ4z0*lzH= 7Fl۔6}9!d2QVpQ n %NE( ̭ +[cxc,v҈t1kApM+ZdX  #wRM,t֘4C . Z]ܱf!z Sil[%E%P⌾ h<R1;đK]#2Z:ի `2pJٜM+Yk"ayfy 4EpRFSj-9]O.WN[L&+-2q1DF@hΩ(.Œ_< HaӦfkHV /ڥ$ w#}/ `"(-2-F$P5.3%<$JVbId*cy-S|eMJmB~STb>7Sӿ?: GױWh/sO&Ae. G<wU18h/ MBWOhutŞj½~ͻE)U/;@H4sYȜxfMXfp@O=L1ǐgPhj>"DbMOL oƞK =T+N0OجݙR⍘ ],XJrMڃvV_ߥ:iD7k$3x]JQqSf1bLT! d[U8CojRdMW:D31JsC=|)LXt4r l qŗ_72M7ajuHZ0`5tX .΋MzX+ 7-9"&VdrH<[9Z7sd,h]]3LlI U%om-&ϔN 1C㹀Nq5,7d9rHD˙c6BmO䭚]nTy9H<9 {"XùVĝI͋E+DHfbPr,㗏,l-S1,H6v5=fӾ⵾9\F@j\ ]Wj 4ibC7Ě1I-h,="i>1_5WHӸ|>捒O R*`gYZqMB;ȠM8~gqZԸ+_' sd* kl\uqH@ `]YlQw4{IAYb5,J%\&6zkvVcz]]wq;z]{޻zw޽Ǹ]wq;}q%1SLiZ8-F^]FXpSZY{R$ 3@|sVd.v*MzPD~* 6ʤ'oC'|YJ<>^XUj2RF>D2qmr${״k0=y yp8{˓);{ ó ¨xgYi֞J ]Rqq+VȎ4`%#ؓO,KS U*I>4qT&iZOW2xU`J|W^rPGZGIb(ؐȼB؇1";XlciЁI%$D5lSXY-}٦~%C["rb9 O,e]6Q$9UGX*JK^9$rtB a("TLbsX䯔r/,[웲ey09ܹg+@[&d+vޛO`ycKI+JsM86쭷^Q6c]11|-*L줳{u{GI5jtZV్} [r#'.$]J}A}_S<E+$m=|$B"G ܔ'jq1HV>I#EY2 Xu`//VCS m[55-aKQ`Ll,9Uv@<{B58i*P27n6fHaEVaOql?WIem@Obޥ*s,G!@ؓ%0R<9@}ƫ*mMQ)/OK0LR7FRI=F&e*w;8<6Yx-|tPb)f,w(xAwφ+}Lvt<y[[ ^@/3^[u(dR-hNMY"fX(£f"#졔i elQ twz/> i;Γ9P(zJ0~nLg'!P!;Fx irL2 nPTKKȀC;|JP׾"d.ԞW72ؐMvIT:-VXRvIĀU~DH,A<.+:9CjXUvX0zm m>!%1+d\Eچ3/}[UjVZS#6<0$lg->{53aV%frc`S7pGYdfUM28&a G`A>y~[rN=~U}l}]޼a(n8~M\?pϘ;UDH<Ȋd*|'[Oj(A^G/[Ĩܑ6_9ŁUܤ[lVۊU]Dm_{R4qǚ+4Kc ncvϏZN10k#@NZq]o|y=+J9aH_WVv312اf;U%ˎH}d;E6S((LSϏWC[K2DGzҦOCտ7cifb0Ɗ #~6?}ףގh!fQE$+<<&d;  G)4 3)%ƒEWE)ȲT;g"1T.ȡߔMٱalc:ڭo$1'mF`|=,>z#< A?Б$v>wd lŷt ݔ#?v#?ÌH=[>@"U=@w&4m.=If%9ޢRXDv`A_#qpWu+8^&H't 0xܒvMWT!Ͱ{w7eQkި"gwP}LƑHtZI ŕAiB>CVSG),|<ꦪ'!VRv^$;x e}ڡ`;2 .Dw!bFp S7RʼnK 3옕y om'ަc:CAM;au܏x眠nדBF#ʏ]or8LJ GrC^ Y.4U2-9-ۓH m xaȰtbM9KqfmĎN>oE+m)aƍmύOw',J od/Q#+dw_u;K.i+J8##[eܟ} #c\2V"qъPBeµr|y7$lO,w#qx;}_Tg0֘[Q"`xlv;>S̙fX V*z>#$@dm@z>#81MUy+0Ƥ5ROoxbM5yH+dg |ǣ2b -j$0o#mM `w =]7,/jxXٸzA K ĝbnbA?thc긙w2%AyXٶy؍GbqYTZ?PYH>,}%Jͪ%̓lT/ "C0PXEH$;ۤ8*=qZ b2-l.;>ca6kiz#+nh׊w|E 'E:> AymW}v>)P%Ȯf(Sr zVfo:[FPAgij/ǚ m4΃ŊEvZ'2;}<ǹc?,A\c׎YVۋۚu~*x ~崇exCq xW,O-* Yl1c&mN;4V* ߈a6Qd *&FVdQP 'y ؐ>qn_)GPGQXE񑃊-jo H=Tolg'Quadpς|)xv7oq'ɔ">; 6|;}1^愖EaU}KBo͟$ 1[j.cU_>\[_{uz@O#av7YxHCne~1fJMMS!&}[Fgjͭ/Jrơ۔IUw; $bIߚpcj_(c5Zx,$;66?Bm"hPIvrNv,Ynm,E,c,vFN; CisN;U׹ Ģ,Jaݥ,Sְ4]v-Ybl;=rv鴕ڻN"4"+XY^z/cu~7Gu D<-GaQF9kjkas"̒E$F>"@\9#V̒p]WQcM(`H5Kvud_ђ馩%=ի^DYԒGlC~'`I kWZ9~T3ZkMg%Yْ'@*w{ ,ט EnF(ի,Q#pAwK 'VN4rGPي9v)4D#gac( 4eFӝ:\"[Y00fs DP=bdNV)5g讙V(03$_|4[h[=+WnHZ]dpg0ݵkVYr;1$@RYQl@6 bXr9dadd+LHf! ^ fɢÏuO[G?!ɯ6*Sގq"Fi+וx1ؐHWx1N\G=ɑrT+I šU[nđ nj{Ӑ<؜CLU@%6c eZܳ1E{hnfg-j^&vfxUlC6"}#,? :"`nl"SQ`T4@ЭVLޛq穪t,H,׍aXUDW0zDj9siG/fÍ]<`xզ`#+eKnl5^XJܔbX" XY^Q*qU~CO]7旯4[n>#qBe-f<`Uf rLW'!$PIYgOv|3 ]$wUБܝʂvDN$bVaq؋˙c3FHc(@)ȱlO]U2ڃT\%;ZNm o!"lPfHh#Q}X6_ORz(IXXZT2^GYwUA"*Ka);q&wvL0Lu3y]59A1Mm{br.Ufx>A$^HnV7_Fa8)Wpz5r: 5$,>gV9XQ,'9yY+]orʪ 4Ѝ[cO3ECIj02uNZm9)hL|3"|_de@)޺5k+N̎, hs Kr Q8b7z==-=67h+ջ-J[ 4\'247qjE~YU~[FS'{?v{m*TX#_ od<)8SU,k`u@:` >ޱG-K=&^VXgQj(Ոِ8n#ٽ|&vw1Fiz|@Ǖo1ēlƍ`l $Pʥ7yzѯ c#^\Ũ{rK ^%&^+Hv:Tt+ڦ$ҎuYnJNMLDȭ'2xV1\zxΞhn`n=,=v+Mif4̪djh.ᣆO* 3:7+߃%t ,s+x.b<1uss ifګ#rji۹ݴ&H#LL+" aloFa:K*Xɳrjs ˈYxlٱ-eC v }!cXkLt2 CZN% eWXjWT+65)#OW?'321+U'Za-+| 15W};}!8'|K )MرrutG@hbi/yflmoCrhz ;Np"^8Uβ$1ȱ1ݏ)\toDޫVTƽq ȲYoMـ V%iHҬk4*q$i˄~/fcy@?lKU9zֳ4J^8kA2ͳe*$!n;cKǜ-i('VXc@MkY^cHoD4G.6i+Uk4xh@0B?(n@'iz6 )K_#idaDWXs8Qf:p(m.n'SaٝT6 `_čHᵙھ6IW!8$Jdk~_>T'ЪD=vDuT$lHޡ2@;_i|Z3FgJ#5Ċ(aD}y4VR&jܦ٦Vr+*I." FdfЍ+2#,ZJ9ϳ<"TCFwC=x-MP-`7WQDnF(8V[{`+8r &,BŁ?1_-[ 5,zx=q]b,6JtdvVq>JNeMZv%GxJQ]9;3~iGRj 'IbHIN*W+:78F=Vk,+1\=(\e J7Wdl[w8!:~#|vW $O9iD($Nn`<T74j-MI"fת&fY"B3>T;$4hdY$$&4)~:'z̕ ujVUfM^>"ʼni4r9G 6/p7,#@(PC=*Ls{[^ێMIlt-j5JEe6i&9*40>" ل^h(J#vIRoϋ1XVa 899BwWˍԀ4(W,בYCU+v>IP x2 kF'_m!@%W=p%Czoz~gqJ,SiQ#Xk$/( H<|,{%YPhVG~'2TT0%ߴ6f؞-{*xĵs"kqe44lj=_o5cC $gR4J Ք"3}LvϹjď^T+Q%iEB(1Ҫbjگ˾;HdK%.W"3+6 6*lA;(`}QWFtթ#حdV8 Q?`@lJnPq֝(5cU1p?n|Q8>BwFEϸ5 ]&C$q؞;>74_KXy$qUrob}7_ 7raGVvzNxCjc_TOY Ը/EZF$;9j1vCQd lR5gw `Hc^A2#.I)gpߤn}#r˹${%ye K>5WiPD03Fr7YէXmgNM,~K񃛷 p>=*o3牚iOde|P!_[8,Xn}BH1 ÅPlB5Q#SBW㢇/Ϗ,bX &Eh省,T;r;6,yobjSŶ}O)ZjV1oG; ^<~g1v#BjGMbD7=.UNj Vss"YQFU\Oa r끢G`u\b@`K X ņ":h6+<:B4:4e+Ȍ_1kKopV Fԓ#D }`lkL½߆BwXl۴ wϡS H-f5.k$ߺ<Σ _Ҭ9 =4=G/WYt+X{eo2b03%(@oaE 䦓 wM@gL~z266߸7!yyeeUYJ<UM#lUHQ r[ v<:wՏòU Eț#>> g:b6EYno"Y#u_hQn#aIOQ hH|d|}Կ?Yn"7roא2+bJ$<.YTn8?HcNIN_ ZjY*6q>~ q0LS3X9P|T|#FI#h~KcZIF?V?4;oco=zcソ+u¯ '[bb+rN _*Pܢe'W}!9b}7aMQYJS.au$ l<;ﵥobL#!YHWofY\Di8gU߉ P(-\mo^[/mә>M E@`$,IImXO(/cg cE7 JI ?'g~*\9%'[ooј9q87!?]tIa/AfxB̠dTozCJ |'u1[:M`s)N sQyܒ;o$2e`N>(Ա +R8fm._<o߷=y'䝣d^'bmU;42%S'%M*@OdIR>`:ǚ%\?N՜6&h")gr+e'v +4|4^w>޿fUU$(]q mVYVC$MjVأǼ;<_{x# n%|ؾ,aV ̆D f#u|U-Fs{̢%3Ȭ;G#רfQ;c09}!A>oWxLG3uP 6,kdThK}Z#wS|xkO?+ZYeqwm/[*+.01 PbGz+^$9#͈~8gܟ™Vzm.Nbaew}pr&Th!$1X[Qx6$jް RZAbT *5)XGaCWp LzS.N{mm={L\Z~n|6/f֢2:LJx}# įEٺƖSYW`_J) c0|'o\,,dihReO޾{~|EqZOd$O bZ]e54rr1I،VkNh|:nsyu/Pt Hz'h"XUE^L^ _@5zem(9 C֊#20~*? ̤ kG@rdq_VtO VZ K *(΃fR$ ɂ ?{@|cvlM6lbC"`T}*N=hr2[,B 1VzX0&i"]>~: .Oe; vX2kOHS(BJXu#Lb MCQ2qeKcI񬋗aW.wUtr#vIjt:<_^iL"\U7D͹0~#p qas8lOrT̥W" $B.XĚR?/Aq`FCrzW2GJgfeV&b*NOJzSd;;5&e"m3IZc"F 4x/pԺuP :YFAa?zJ߸œ/$CzQiq~c^!5x)II% ,qIꛃɻ*Y4'BS `QDd wvE>#io?icSRi'Lt֡%M6r:Vg P#l/m~KQ;luF13*' %22 Q ޙ|2Eg6B6Odvd5-Af,l~tשzz'`"jZeRcǸ^ АfɰTO*dc\A,񕾕BƇWW u gU ˆEprn&q 5 fkqWQYA%D4׵ZY9b'E09<Zo%4,F{-؟ RRt~*r1՚V%A%[=Y7vBXU{g"#ПL姾 S#w)^S+C&G,@x$ù#XFBiZ4jd]L(s #0Ԓ`nKģ}+ ~XDȀ5ʐdۧbcr \9qg%NM̶f|\5{9)R 0^9ZO4aHBvz 7c6еS+hCE32K^>~3rNȒj=Chdq0ԂQ4V$i$Nm$^%YOǒ2bBjHGc5Zh,"IE0>9Al ӦŰ-i3մ%RIRU f MEĭH'3,H^ ]9|u,MhYcvN Y f8GTNSܽ{4cNkajX2y"bft5٫(w~ R7򗎧6]>[TԑUTĕdD(Ȳ)• ir(]+`># ɥDq-{Do:_R5}]{nT8*rmTI(]N&3:ȝڜ7ps-,mcqcTI^ѴrFmHT627QMk]r"ZQ:z-aeHp"ԒAmQOR|~[YqVt)"L!1qfv%]X[ ~a>]lJeVzpMXk55}ZMvn`#ebxcR{Qv-܎IdC)Vf_>"Oiaf;kr~ XDZW{/Xe0s%kUCCyZm$r{5L"2&7Ejk+iun'X䩄VYzR&0B4Ҳ7ؕq&2h9|bC X6R50)f.d` 6uJEئTeeei=]u}':9j6r/ g"dbvn~[N6v*-kR1UW#'0#E{1JWufvN)4Y5(ZQ9Y,('nF2m8ݫwMq-=Z)(3 ީn;oX@*ddpG7D0 iP4De SdԺXTN>fwrNth$FT@bd?, Tb 6.6RbD%[fVSA Οʦo~jl6Mhث@2xvfp.GoZw^qE ꕠ鬼4_1$D4iN*.x#hR$@&a`BRAgy#s#HްьGnūzo,fӖ4eVLe%x u&Jl~h){-ٹ$C`D. @ 0+ZN7QnTfCAP:ebjQ|֠ jE !%B'rdҷ,CWZ]S;2!YR~>Mv %Z}>LMTbFREա_fSYʤ.æaWV$ux@jc3v$]ftI#)m@Utu2QCYoL$dU{]Qغm&Nؐ8{'Umiԯi^|irؕR՝v6q)ݭhzau6^זy~+mJ^34䖖9o!IY6(PդF*Uuڞ-=?CfL>ms5X(ΒI]G,U2 + I>^#4(ǹd#f`zh}%NN,vK)2y ll?/l{h)&K6%=n{̼K3Kn]5*V8cޮ҃02ڬf^6KP}ʇhfgj Lަ s$b%>FH®6xj&rfhNuůggw`ǐB l^C/W Wkkv6N{l3<}dR:GȞLFTSVDL͛9\JO, 5]81جQqqXף}6B/u4 4nx5 ']ulA{-C*d)d~6>"l+Oێ܊8h^dk3,O!W!45VȬF*H:}xVXbXzkHZ|5ɒD1@a 2BP $1`7_"+ڌl$ARURclnzz%^ӱe #b@+_VTqSf?{x`$|ZfS텈rȣX8*\1 6eՋhl-)vLB)ر6FKjdLĒeېWDN޳];n䮅#TlXoQi>G :~ѯ{-qfޥqٽ{(* Pr.cUi NuhU~a_3=KJĝ-{Ho^Jȩٿox'X,nԉ[J\ $+(W̕ljNұcK|V䠕䝧p"a i%.ѸbʼHo!ݬQ)[Sv#FBp<0GAҥ0IenU2Q4v޻YxVciq"y7-[V6z۲*1dI"mM1 LĸyqmBG4"QUd|oMmW֋w"w쵘2 3e.Xӕ,(Jؖr2v'++ uQaX%<2CPH?@n‹`(|I6g^dp5KW-Kx— #o#@,@ K59Xl&6q2GڙlQ+{u!(>~#a2SOR%s5j9+-FӤdK#M;L [ @Ua}GSXڂwʓ]'v$5$TffCG1)؃1ٟ]Sx(T$cP8( .=5$ Nv)ØVKqPgxԵ{)J{r!0`FqĎ S5j=<V;SIULb$K.KfK EQrl{1WE*v*5(6h$Mv܍X̼Leh⏐,1$܃A>|p#.>.1e8c|(K ?B<5[k!`ҼXYֺH"!f**UH a'V\xn% M,O. C&~+&:@@=n$Sग़]{*Ē=#UZ9g6Xɂ"'<7$3;}ؒHSѩj]=f0KY%/bS(!%g)S`NLs[b]ɇfĈ L$ 6A򥸥zM[|3,^6Qjug`ZFp>s`vZ: (Pz|ڗđt-}7gȎz:8çiLKHrcc6_G7(~bLՉe+Z'Hi{d^+ȀǏ6 7NmEc{̷~*5,AOPF%6C! OXiy P`/NԱއ_ cDXGHzT+ꍁӰ&}(T($|uP}CP'}, Dj yc)j'n(޶.bI]#*Xbqc8j;Vkk6PH;`yVPYŎH%@`V)07zT9JMZ\tyP9,Kʃ%df1XHF"Qg̰ijcX,}9uv8ĝz+ 6&tG9Hw nh+zf|v->Ĵh;+0cu_% v2竕c'bjE(1;HAUh@o1dbh R ^FHl (^zI`<9+$y!~z]'>VE@+vvf ƚ۹odzqu^jczu-rV>31UIi|yP_$|y\VV2jk%R$IPn[e]ݏ"RjB8V6"~%23Ay܂Ylxl 3T{C =U|kfdxV"! #b~?;EW 8Y$=Ifv-;p|nv$> \_Շ^C'l/ģ$IY7XӐ>b^w6:XA:vNے PxKf?W1])&N<>CZexIBXTRBahp*p[>-埆:#>NU+dvba$٥6w]WU@vXnG ?W:kԽ;ӎ촇LMd 0'r94cN`wUo?79bĕᘤ2ˇkeӸ%$O^]9at@i=+Z6kXJ#EKHI&3N=VszOքݯzY*rA>CKR5dUn`S$Ѡ.2W ^27BX% yIߠ >{^WSWP:ɏzKPСIbiȬAdXıfF?s氺M+c|N*Rr9hUcjE%J)a4 u1*uFzޤ Nzз.vt0(nq2.sW\4Bj{~j-?u^ٖ/iLxm]c#2E/0Fed@ȣU$4DJGa}TXG4nfb@nwp;:OzoLAcvͦmC;5cBZ2kF/2`4ryKd}uu#M5FPȭ~20XwvHvd"Hw*>j[ֽNSeZ-yLNhaTXAK1aI{P+K] fJ [9!s6.qI9|wTكbxTwG@e1!ɔJ0 S xk,E֦iB4=8~u p̎wj$K~x^*׭PJ ܂wEgQČPK+S]{X{KZVi1& _j8bxbTky7?Oa=j.k-;dԶfWia&hjʊ.C*+w䤜5t ־tZ̋74d4b#n,E:x\FVUidVcikO:~_P.8fQp+8F3]1/}nw^Wqf3D{Y-edEg)moo^>T3ک4)~5+BϺ _3EP~/%kյV6m9mO-H$ݤ$lR[x>k-ۺt{2]龧Va̲ dB u4Oiv tUc>OzQA4Y[ {:7+ad6oд$񸙭,o ۍ&&Y+pa.XU譹$j5!/W{ZN*EeC8Ezk@ud +jH_Gʬ,p\ &Gi]N(җMf[uʋ?X"EiG89ЛwJƫ;9fQyH!lnM\t8J(H,$pwPtbHiv1PFn0j;N49"wY;yMOZʛ'.J)c Dj޵~=kY ~8a1kj{5눞BܻXV +i=OkP޺ v%c cH"Rr!$"aBNFF ϪQ&>Z&Xj EEbq%)ii8'JIe02K !a[U5O/͡a$Y[R=şyiAQZ͜]=b2#3|n̮$x6VF1>1&#ZAͮxu;VŷEvxJRCa^;pe7Y&qOh1"u{UAL$ƣc ܄}/g'R#\]6 [9k'FI+U6H_.cgkR*o5BЎf-rgar4h`^Bl -;WȆVlxd%z0f]\cmF_4G E7$W.ѕc`9{R񺒚DxXeSNī^p]YUn_27dpXӹ I醆Iٷ.tċJ3 ;kWui۝[bΝZlZqi#U^Je*܄{l_|ZK,Bړ7'ąb+mJ&bn A_n7;_s/cgE/> I?. 7`0 +{@=#\R^T✆@ms]e^Irtj#hhQbX!9w<u#r J9 ^Hid&+ 4#1(ep$Pϕ3DhdMir=WYd"9 }(p11>#1ՓYE]r]ؗvhԪ8;~?hqU6ԈKw@'q?;kqUL IlzVJ!br9% ZC *7)d8V.V 9#q[C!tyI*Fz-,rD %|zq/ )b_(=KBVI:X`vފՍ][1F*SX{nۇEnqgd& ܶv =d$͎GknC&6ڔfz6j*jX+*EVP ˜les2erSC<''7gHBI H\cB3Uk2#A9 2!ټ%bNT8붒5<3Ra1=[ ɔ{_!IpU,UUH{ajJT ܆u]]1`;x$$9(#"3Yxa! ,Od<)ၞ-L=OmbH^G&6_ `R4!w\nB;"Ѽ*V-1$rNʼY(߈x7񥶱B8 J!V_r yoN"iMH&g&7Q$Hu].]BU Qā|1:"ЭrVf DciPo4e> lE1krTij2ȬqBfN?H[`@<rpnޗiE3,dhu(NǙ%4d:=&zDvbKgR9kWzfeYٔ«PpJ*PW:X1@cmI~;]G5by( nCo 5Fevo `HPO%(L,4Č%vTbX zy_+`GuE7Tgk, =3~c 63%~{ KDA(Tm@t홷#-: b+e/IJoKIm #9[e$KY°#?"d$liY#U#LeIvZ!jpmE#wyߎon=5 tEDQ0mӵضEJ`ZmkU18L6>c7 'Snf.Y3ʈ/BO4ׯjLo3$'3Nؿ^3HO!I,>}'<b27 ?doyyzKwK#VuREqႸ F>}OA*xxtؽ5(X kTn(wjľ2 {w! 1AQGV⬨TIcT-ٓoCilT,%REZcN̉[8 <_a5,M'8?K$ǹ,6c9gzFUHa1I>TcT zS Hm`A a^$ƽ+l60ĬT&7[) @?=YJjTiS˻VGzuq{2ʽѨwskO!zXQMkIG"撶D?GZQ&I%>#1 F,6ArfHrv3J?,UB0mFKQ!-5Tq֥[XFUY^AXhG 9f$YdA/(撴FB@$lcpd؆JZֽh6b[ +l!mxE4e=,lI,ŒsF#TvK zic#ұ۳k:I2m۱Rg1FBSy*EI.'' m9A*G2;_Ghw1Qr;gFK.w`sč_Agbߑ~Al%`l -eW_Ku뺪ۘP /˵Sy ]5]1MrH.n M(>E[dI aWyF>9k:MI`Zdd܅I*F Ƭ6 "+f e{PR #HZuZN'`929|ͳn"Tx. L Jm3 F~6bbECYK,^QrkMո"^jg1,~7~<n〱=GZ5sk L9a4S@cslf>(P]F2lFK_\vRe]>U#*.l̝|K❂%P;;nХc5M@y˵İxs lyJ;7BTקH bQdBŃn+<ȸ!B=[m4A+Zht4eIBK1"7YۣGJE u 48 w#w"?124 fMs,T[ 2.;J7#c+#uq(] ǎ1rv>>ޜA"JUfRȪܚVCy0+mRc_n+Ȁ{ V<-$Q[) P yqHefRC%>bhܩbAH[yfHV~swJZNdۋ_oZsIz%a m]SX,jmwj?g\H]Rg(ƈ-;vߵأW'4asba; .1dmN'cNCr|ZAq{=,߁iX4LW'qȓ7|!#}\p0-A6hS}6+vYpcTŃMrM<2сDdǖâ^I{ ҳ'%,fI`Ȥˑ:&L6Ӫw]PZ ldGfouoϷ%UC!ijyZZU pIV'% 17rX%=S*c 6)XY'Lm5I$G +)F IadDUi"?HC }CbH@liږ]al$.?DGr$y@.ǪLS/ҢXV* лx$BMǞ@WzO%~O"Me[ܢo+z߲*QjaWWY N XAظgvI7}2X{9)$l9B<"v zD5ǓeibEN}><ӱ dAj*x@6A"3Qؚ_0kj^RO!KZmB1ªbvL@* Iڂʽ =5r3*272\Ňqx쮶-~PCWs/7 Cs"*^c{gb  vߐ,oooU$X Tk^O/njyEAkZhdЮݶ5|Nv̉]fT1إyc+*8!I`D6Q&TR["!R7ccp+Y搮-AFqh6'`Gm?XRS/۸ %y jZ *T vˢ4{ =mz>)TJKK##y%A0-YffYbU$2) *{wZh yWDp~% KD:rþCLd}9C(M̜3q6cţ9˿x ymHDK<܆*u j;6X Qd]ymcֶ4"F7Ѵ׷#4kMrq9ԩY(j*=VcR5#pŹyUjXᨭ횱:BĶcNG^:Y'ɶ!y 4h}dQ{xF4IR 6{*޿N}Kpk-'ôi[FPcѸʩW,AI]sŎ8,<*!#O HqxQ$2dWb|I?SLy(dU^ T oInh58E$@h @ul֡`F:{nѡz\u̒X= ,OP @1Z"Y;:MxƞGj|iV%NI c 9ݔ﷝gʙ-jSرO?a`~em|hADzH j/ >H]:Kzo,젅$Vlj߶p>[qN2qWd)W<"? ϟж'Q2I׳$2(j̥ ܱ̒>.*c? n?^Dz~*I_4MQC1$OoodK8{ְz3nU?# 1m{..׽RY $a2:{[.%N$`fET!_]2Ӈi˨ F}aZMkzhp:)9e*,6hg[S7LxHNRh vVP:_ΏöFk# ~wUjcUh^5@# #a'zc7Xe޲nic ,ҹ[-B1Bi I$:K^g4WV'N՞W,j{c'mV5e%L% V$S+ȭ+t z}|&_+,)O9 z;3h=XJ'2@d\9&yV \Q|uoMkF"VF{_z\H.47Nu+@(ixcJ4(r^n1Ɗ8B<t~lF^{f~[J⥟&i;V#̱D,EJ:TtM۵(TN԰^M]{>6jb" +MuNSXYf)jј"pB\9hP[jtzLrlNťʵf+HjٵJڒ%T#+Zc]3XY^}8C`Ƴ6fTLq5G0OQ,<<+ҒFO 2*A-&ҲAlP1w:In =^gY}KPrنL&K5i,B" kiwVU12nv\6ꖚR{x9*V gUf!$iu%|i I~MsjS-U$9ܒ"v޵db Ae Uf.Rޭ܌d5k4iŬdznaf]xrAPwԦܲ3%M7ݨ҂ j*F(r*ٹ V5{%v@qg-ѭ W=Xk؞܅b*F ~44B-cV)jNJKIm^Ha93:홓j[p;ʞ6_ée`ri6=6lm+eNQTӎN2eT@RFpg^Rg1ZB(TWp 岁<5H2:/Sw]bb+Ȍ,dT c=帾My1+P,"kR`;Dk1^.a숲GCJ n: KTq29lEjd%c5cI#27? 2<>4ܑ 29|ΝVdj\ڤ N}A*%!J*YNߗ=]멬c=  P1j,#`[-i[HVFC3f5+N߄qʧhJ^2/ p> *da[H.6c;׈J,$s:nk;Ư4uX/^Čj괗V2 ^kued{,0? F 5`'e3CEv o95?$dM.}7ӑ;H<WEDy P~fDҞ]p?̬k"+2^YHI'&e_y%jԬ6OlEGj\qyj9-ETX]R])_)-{UeHj^$*>X}M DQ'<;_D~scY#Sb L$$(=(5uԌH=$G[l-BpU25Wͨ&CS (Tc,i @ Qq3Ln?F?Mϣp{?iЬJqz.ߒĐK>~-GdHt̞r{cSUܒNDOx2!@HKZr+ϲ2F>9U@6~a0] l6vo O}dx#`~|hFSX# zPҾ>uY5$>ܨ;_>}0i1IK4MVوŀ'}>tW@Ea(A㺁/NbT*Ve%;~^^st"_nDh^‘;~g(j,ef45xX N3l>r ud 51XorI!Y bYQI̛!ܟZ5n9e,BhJ=r+$Z ` 2 hsڛB_\^ܤRsb0Q:'q"}EVDm㏕4ٹ6;XuvJـ#ٵݛ%_PqGحF dWK2u⮊WU: c0\wrG 3[ӼmGvDbCMrTcV$Bx̻1x?u8j jIRyķ$_#OYK[,{xDA~ϵI>%HcR2&Tσ}`]@97v$Rv',_sVtO@"$QdgK>{t<^,6ۨx)NoRA؍o^WQau:qr^ XӃp'N!sZÚK鍊Qr9,Ř1¤[x@ߓ3LWޖz+-$݊̂ R2RˀbX[cǗ\Q޾"?u.hHd*G ڇ Ck~f.B(pAݲ܊Bx oHnI'ROSuN I0>y1z"C::,7pޟ>~,,YN 6F1d+tpIbPI<EJ ,0<c.6̌/Dyw蒾goφkz^M{3;MT93*f6mDrյcd I,VG߂2l|ꁳ}بeu/It?UځKن$.A <|pKrgU$Vemr!U~;4^GNn1Ŋ44s d92>ۆy<zhUccFLЖĬ$`w;+ܩ 'r$xل/m /c[ 񗅕M)nVR|LDR obR|Z;8|q1slEКxHc ` wcȔP>ߏzA~^hltfE^7amѴDMci7"H#JTJjP4ę#tP4Ư,$|l8z.,ӳS0e1[*8#A#F)f#b$e#}Ֆ^;Fm>~艩O=0K={G'?*ݞcpG.'o;!'Zc"zKr`xDAeXN.I.H~RՊ7ag:>lumMUۃK vbX}d]Drr  $k׆y-/X1迻O+sUi6g{-ZQs`-J55{G"a2~곂_soUl`dm1h#<]>mG~o˦?/w~[mq}ؐr>&Fm5CLb@3 'NV;=֗\K$ s} c,Xה@~zm'% WH[j"2.KM2rk%u>IScsJb' _А7f~mAZ =+:XU+fiq܎!$IS<~V2E MVod#9(H=&;;J'M#4ʱF;6|hTy XcE ЎM_hk Pߖ {]oeYl&%گ L6bzVzLDtELpxX{xS֝G 6D92F3Fh%Ǔ-9zXMPG⪓H$+RsC1\X-;?q"?Öm^/Shb%u'fTy?}+=>by 1Q20Ey_2nHI&.8h_6D%UffMw 7bq> ţo Itɋˤ$1i6YqL-%L$XT *\`x^\k8mYkπwm;l>:oG2ۿYO #.^ u`7'f/G+&"p-fpʨ  䫗&)"GY) 'VG8YeE=h*HbxϝW5/iR)"G~?}Ua>n2}҆r^Do2RK8,XWmx[Ҥ@`n@eze'T_x2TIu .1~?lfLR%*/K@dI|vomZl*Sn]ܒ/;OU2:.hMG,qJVJw )ŏ}/fJlޏ!bm]l"D[sܑo_ξ6܉\,h #oV 1fABΡ"vT+ oйW>-xY#Ev#pwjS uSf*&䏷cҭwga!=зn8e~E`_k׍ |NJ RY5Oj_ !"Ir lLï3rA/ @_ueE]t&°ma-OmfTמ۝;hW,XXC^x%mP}}ǿ֓VE.6 "FIXH*YU9nǂ>7L2~hO &#)l[sbw>v>1yN(tQvsPMXbAf]?&S,I\"{2gv) '1>쪴+{5~WƁjvKտTm$#lv%TU%̕謍^&'mz2`AuiJ5jT ~Srh:YzWcUQb6!Sn̈Jc&h^K#sHa^꺔}1P 3ʟ5 ?"6jܕᩪޓح 'G^=$gZVh 9@ĐۓϟAnꞧ[OF$$6f9]!rDKQS'+%4eɫ!Wq#(K ov "o5oĻ}ؠeOa'+!;nRڏvg}%OQ!}Q lB(bRH*nI&=i7sޏ{nƩ\m/zͧe:^:q$H+*;mїA /0u1`HUѱ1us|0*5= |HvbV}+MV/E];0X|M<bJL[6|ƢfCVnI⠲ن9,5/ 0\:+ZiIZ{!v=OܦG=q}R gxgld5XtiR{R3KV5Z1g-jކkUz|4,-$MGۆA4+~`yH:z(J'RZ^YPIg/8he1ž:~ ٌ6RfggǃŖ9$s)"@Y2 s$&nVt/Jͻe p\e0A_)iI'v;BOi=j-Hq ߉2Vy{5ehDݹG=7nƞM̑ɜBљ`Clu.-948y[ 2Ԫ/B(9I 8 |P_`~CwV΃j m1zJ^ұ$ǓԸlFyu>-ؚ+٥AG]4usBe5>Fn}OgW7S|sx3) 4[-=.h4s_2-!w'"FUHHyYCj*i:G_Qd{}B\j\1dh J(,-ix C~ZAc W釹~zOߔ\~C_`ym:*8ienDAYd&6ֺ6Σu;% g)7f2h[ijUnS@'f;zĵKMWI5qzUi,d#4i, N5fKA4\G/MkDfRomJw<GzAV[#H'aw"B$ے|$~&$bv9\2M/^{U:}Xd*3րY&Qv]RL嫍nG648WIguhaEU@1oN1Ơr^ gr6ViԖ8# 9:uC![R,iڛ =eyel_'@dE '`8jVe wv4n;tۅ`d`/+thov=Gz&GVֱ5Z*[I&:0mY 3FMReﴊ*mZMes[^ŋ՚>N!-)NVd2A3nͨC qXDx h}[鞶'JٷG#NyMHRF1DL̆/7jK>>lf1r{ X%dւ Ghv{0ΟZ5FER4 PFy `c#F}ڵI]Pv긷?CG -y`aRzc*dAINʇ\n[%K.ըsӨ՚% "FU`!,}Ӛ 9fX{jZZSdž)e.Dp~# QȾnG_"xtel^W$Zh-%?rDb 61|M IlKA|KHhۈU% gggf7}yRr)\Q^ZR6912B|5M~ӗjEzOqs8mF=椣X=./N|3J'c 0󁯥 o}GODaj ph?h3C]zhwg.|8jxþxpN5i'1KbUVABC%.nOfݑhN'y&w1BF;$q1aPMb >(#itzX W/43$tJ 2Fʛ!°Fy$o_./F:+[;ȕqےJׅiEio@,`B$bW,lŷK[dZ,eؠsSqJ纥{m槊Żox3Br~I2h$~KG=Bbiknp]A"Cf4.Z:T08ٟfȢ^.K+60Ub&=%䇌opc(J<50]Uj!(ܹc1ڻK%d`dxUUB,coVڷ7t'[6oo3Nse".IN<{[߱Fڔ;29?f(۾(H# o_FQIS9!Wקh5ːyD!# @_2thXںc7b\V#XQ k7`%eF c#S ho;у Uea035m\15QGPDo1B|>NR7o5】 ^3&BS̰!@C{豬eEYoHe Cۏoط ʍ ` #eP$ 7aOU]HW8?鑽)җiZ]ixQfnPts#+cyog"Vd_5,2]`1t$ZC{h5~O:M+t_DtONūc&O/ݝk`2s#xP^~:s5-߭2;F|.kbipb ^uM_ k v3eszځnUh*ٞHΡ&H?7La&4ر:{0rUdφʱ}wp%#bcQ[\& [ӨQ6tDsOj,qzE HOAwS'WΠ1 Ue $(NW@;q/#}M>*?5:jQil]$4mG݉C$:;NVJU3_E,_ dNG>Vf|0EMM&Wuie5f@KrKUۧ'z@ѓ!䇚J9E1rq’UXF%FQ> Վjyxa m A+jGFBOӧV:8ND.RڧΧ-qAb5iYH+L࢒2PilmiZ,^岕?MnEݕCE (,ň ~-z.Ջ.>k yt^͍7?$"{kfiI"BЖY;F? eLh[^P͂5UJq/gv~+*7ivCʌ1aSF:M#u`izxYͿeHpCa&:\b6VM ;Xqk9YƻVӺ2sG'>hvO9pپuj?R1LLa>GN(AmfC<錒)e פ9le|OV5O>1өB(^VJػNnֽ$*22s/c}I:jjX攟* '(!3oV%FN{0_w0vQkgS*xv\fsD5A <Ъ9@Z Lj_nYp]G6!V8WFP;}hh3CCәU.׭5dUf/8~꿺̸hꮤ%8(4tַ&icdN9"+q(#bwdTrStX#Ob< CW]Ċ{C22ax"pŶ Pt x)G$Ӵ;RS%PI,߉TǓ8=1+ 2kJe jXA+cqk'Tumm=5]-ۊ4@t!_ LIBS;R2fZ(ؚH;+mNjPvO#c13r;p|;ιdZcLQصl׆PtZ,.{C WFHJHG%dmPX/^3ҌOg'ѽb}-$G]G݆EkGP47 .R J)ʓ3}L/}}?f~7d5Yf> ]xXIqJ:4t`uinLj-wc55v'ֹ-+U}d]te(Qp~ۂ6~k+Yc]x$ۖqm 6EUqj IEu"Y^=,)#r) ~6'^5Z2LG]F"Lm1|@%|wؙA#Ȑ,+Ỳ;^FhSr<V (`Jb]~YaeѝʖذWRܪ{a?LKIpjS26sB\q#P w-ZnʥZ?!H *X}N.i]J[n;Aɸ$ B+pkȃJ=E&<*0jp@PyۧR1vf:–sQ.ۗf%UB:?Dֲ4 /W'ȯŴP}DOnY} Y|UXXZ8;6уŸzi]ejM+yx0 %׏b93yٶ~azO 6j`;}ھ׽p^e&A4FWI=O"ʴ,(SՕSg妅d1W딐Qg@`q`.kq8-yh`cF v#,<}䪯G?I9-O齣$T3ؑwIC{gL}݊NQTeBeoU7;muW7 į8P/MXը} Q'W_H5?N^]Ncx^jOY|y|Js+O˒x ˰n(N˙$kPfqc C-tU%X7zjtR[5Ѝf0$ #o pwй~K%zOWWcmRkaI#xu]ML E;t4kBP{t4pMO(Zxdt<ئeqM(v] ;zr>bLvjER_6+26v!XW%1p_sff?rIL3^i >1L=RA,D0H?i }/="ƀPvC-@2aqF#AtgMG~/ oTtUmG<) jYΥ]?V,1c̨cYkQrV3ڒc1pAP"!ؑep@bc3i+[VH8ߗs6m?}gѳ_Nۦa#oBxO`ȇ—"l+Fk 6 yX][ nr2Z6;}ϟNZKNܐVYq <3#]E*X~3m|zن/S x}/dOvfmE~tAkHPZ"vܓFEFQt5~t|f[0fb6B[5hcae+Zj us'v/&C$Vf*Oq%齽 gh#2ed+f_.F㗪4p5tS-9mx$`.5dA$MVMV d0ev*)Ho$y?o'y䵔cWJo檯g'~,9oh EjvJ0k~ lNb.*я'n£+ÙٜRr~#rNnOՉw0I. z{(zn782d A͍HzAVv*C&#nZ?.\>;xmz}kӍHךjLT8>$D 8h@y] w3Y rĿ`ԀHy!G#3'5J+ڣLZ+Dґbe];}?r?G;x;קO~>yԹ 1R 5; ́Ӿ 4M(8v;}Cb ]xZ2}8asW2K Y&ͱKy3oE<;XމY<ᅭ4u.&Ye`ƙOt!ᢰRڎ?񎙳 L\xr Nŀwa.+MSv{Ҵ*QcC<@AbK333zljnc]H^14Lhݤտ;mnOѹNJx.*-$udK.ÈBx60ԙ R1zq՘ Sc @o'TqK(֎ >}~/7呍qFŝ7EY}8kmtRߒ F:X'9y}L ǻP8}H+J)[̂kF +,+Osm1[KrWN=!L@A9 Uh-\bUtYk+8Mwlb n"@+Rqb9e<3㳂23UHaz@")Y2Fnˬ+$<^GGO\=gNY$wc`V΍XzsFꌂ {v(㴏2@ݱA z:z{^w,IH# Đ lO$#-I"Z:1oǍg$IbWGoz,gu"J#̰#Qk>y.ߐ1;qyo #>tQh-L*"EPwPJ}|}1NQ*Ȫ"8i8N;>w#.o,`&bӆO̕ x\>2M{\{mG3{###R9shU]G9w6 7ԧ wO0BcI13"mIc>]:^4um<WLܖLLH~?~<*QsuM[QƝvQD}DX]hd.ϓv1#M%ݑ˪]cU6װP<NlRUB!IDn,7|ޫqKSe5ZБUxI"lYOc|a3L߷ *+iq9 v,7>Ap?_$AGv07u_ 'cĒx,7}b66A=uܘ6FQTJV$,rnv$v%WVqnRGn"H%]џK0;4{֔tɝTg]OB̰{.ƲcvV:R\Ή;}5Vn8լO~/%Bo!Hf ̐C/ZsFо4F_%-=?)F*^iT$F.7:FM͠,_r;n)IjL!-.̅*`I:rџBO$lQBZ$tx,j_qAe4EbeG=d;Ȓi ڌMR6~K"ޙYzږYueKW$Vt[6E~K\ԡ;,ȓ6גa#4 ,YSC֘z䅜ۊxhT^g9<\beVd1P%㑗# M]EBjɣ̔nuB 7Qay,K^՚_!el'V.Q9lF(#"IөzG*l^Τcu>lf8iɌ~UvܕyٓvvfSqWwx#Lܞ+kZE5J` {j8Wrn.~HXm)lR/XyLK߆jPRW8jɲBLA8(oA,11ʕ`< E/q  . ,.F9?c = Κۣ gfad*[ee"2<,XP:B(_ LH8YI {m2_-= YnC,|/O;2M-x4QK%@FZ3?}K$b]oR#wC# i5! G#0%6e",~`$#upUYIᑴحZl ,Jcc&t q!P7#8Y7FG"*H_9 jeL7jد #jH3ٰwBD+#wbrDK TS2F>>K734@nP'{L}vVK{w0."*`:RP(KRAw+Bv,`PVWIdq߈5qR[U$c+ɷ 7s^miQ|Y5Z~ae8c}@ / 7R` 6#iE_` D) eV@Au[w(C,`cxN `Db2Ėr!4Vr^hNS  ʞ{o;DiXܞ#+8HuR5kI&rIb.dHIY&I%ܪG:MyK?"|* ͑vNd/ ztru<-q!$aYDOSyWE؁B!^,L'OA 1 ԟOepV+n%Cq,QLl_X^ٓi%1X]y|1&,RGA4[F$X<B /1 db} {FU Wh_B;(E$) "J Oo!$ 2X$;QM6qqI{vlU)eMgvLC2,T1W=({ h߹jIjc^7|iqX.Oy9"v#0kK`|n.4Ur׫ ۳]8hXEd=MwӽnVOp#~O_mAÇhAN+5i^9q[S Vq&c2HSşyszCr8xq-c T )"NR2~\J"11$VEZje4:V/_ןRBVeAY"@wF IM,.r*QI#P'ʕv]ٹA¨Fn>xX l=߽z.x*`iT,$uQAGskz+Nf'tX-,.JªK W,m"iT|QUOG6q$V9Ʃ#"K<=ccDҘYX)xWr tDGQpǩ~_Y:]zSK({A5+!*.ʁc GpIP0hHi=%]_S2)iW;K4x*}ʒ쮼ca KϰaYiX1+$3dKւ)ؓ*fb]Bw"H&Tب,;HwM(;,c2Yl0wB_$*t]Ob\% !35epHeqܢ?{g:ܧ>7?bdTWjx Y$X(Aə{0v}f6k=;Vzk{ߗcnfNj4X#Vm+vt&usF{ꦧBW:ޱfReyɯpI kHNb*O`c}ITÎ3:cwblw w{4 :+~GP*Z4msJ"K6fx'iBʱv@w +!ҏpvu1]8ӤI秫 {6R$i2MNco710Z;eゟN8`Yb &\nuHL"O 3Ei#Hf$9 }-o+2EZ^-E%#˴NUm`s8Tw4UJ8(*W|6 ܐd2qr d3{>:V0؊҄su(ZWfeBy;7 ^K'Kx,pCD GcgRX}>1BL7Ru[Kx%{`p؉/ zًy{*WR&z\u6˚j dJDZH qexriOakDfўie/tSKvjAHJǴ|'vpN/Qn c]!k918ah<ߋw/`_,{` ^A3 SH5InW>}t8psOANtsvVƔ\d}=%eVhHYS[ӎ==5=lJۄrQVjP.ϰLe$1d)aKS3ٷEܞ+^j q8(5, J`\wHw{_ -cC#+ex =7JIX~ mj@^ZG;f[:1DX A΅I)3Zٕ4̉M++OwuVH AcA{sU#kIdԹ @˄?t_Ӂ:C]VYBΫ_z)iװл(o4잯ꮜ5'>|֣gu"Vhw,Xr*Rz/V? :=$^._#=ׁqYM Ju> A#~[/ôJ)E,Fᾒ,< vo^\BfY8 b$s+uHS x؏dcp Ā}qw6_妗ăVK*Z:ɷrcb'vn nē$=Kk jykjsOo,'׺Pͮ:[ kL-gXf+mщ8Wwͤg/*[ns7G7r;<.ydrL(05"ۨ39dGΝmiYk᦯Ҁ{NhEqy;8,w5M̺I{`C`+;U0zfJdgM X1Q{<ɹVV>5rߢa#Ye?ƏlJUA"~\^Jp*XxR5ܘnvr@stPѽg]Ej/nMw9pvm×}}X+R]ӨgEs7ڋ- +Zx'3>o*% evLjUdǨ_>CE~0{T4ɮt8i"NfG=*6.\lL zQI7:]J y*Gb7Pm=D3S;xf(޹Z]? 嶝f21m_Pt߭lQ4t!Z݉*9~%"Y쁂+;f2X2XCȅ@Ԏ WqP6G\GX ;"O/R?FY(jfyGH+sRKgE(}\Y Y'v$皳Q:GUyzW|h.xfP]K)26>rtms:B }$nݭ $Pׅ# ,HOl^٣^ UtYUuoQI6uroҕ Mnt6ltPjG1o~(׃/ːϤa%A6jLVVjrUK1ik,^u8V$Jv6?N|#Nqo7oϗz]E{Pk 6.qKYv eɜ ̗^#Uє%;;p^k2K w "n> ,Ke2U?9);O'Aӧ4sǯh:+ Ya_YRgoAh&0\୼PĄP)jKVtVLq$,+JWf?I7aΗ$TM*0;H-9}:mαkɒۧjEaٵ̫ YEP]`bnHYBDZ'F7rOKܖ8&]^l;I$RO׆ZY{n6rt}.eoİ{4z4ۄXep7fP=j,gE7-)iN Ϫt7u:SKVuLyl0IA4@e/6"|;~؇ ~>bm)lel cEm01Tv>yg.N`a`+_sHKPٺQ-uLŪFA\`%N}b^{ǯ=i}U+7i~zVxؔi;dlxrW/B$ V `}nZPJ+6DMY6zY<HVFX> /6O F'kjl^{r,ozP3gt*=BMLJ۟); ϫOLt+O8g A՟ٜLDXÛZsC3׮?c Pt# 5kuh~WE12doޓ.a>|;L5:sL𩏯~f8UXAnH+G 7nPwXVR hz 9;'TaέjkC$Ҭȁvx ?z;MF50ھf_4ai@WF*X imlmL_J8nW֙U0C,k$mw{hs11nAgrXI0Pao؟^OI5?7֋c7fm1VZ]"8X$\qP7Қ[Lcm: ,ꍩ6U0$TX2dDD }{~oqdFKٍ+$&v6}H#2~.[G.i;c6ߊf׎<RK&wq}Hd<2:Is9]lFSn8c-.>>A9~f.)0 =A%G-eУA_v[-,PrXY/A.eV'!kPlfՄrV&YtWݞKRSYkxdU93+Ih&xw2WZ ~78ZW=k6!٨=1JV w VGdC*vT%7&xQﲬDe!UU!XT)ң;$1M#k{RM#l~>rO.m,FtY3 D焓m QhQi˴rrVE-b+I-E[}"buz^IV4Oj )__FEz]{1 )hwHTYcخ>{!;NGj`I!pi_'ksԄsYdvfG8ıj;֠u]ZK |Z]b`ﺵ}@-AݸóN4Vb+;Pjepu4X9E% 8-,J۝.$$hzMϐwL\v[Vjqsi"N$ו1jfWu#oQҏAdp?2nds}7&iӡK=MJbHut@q/>tW= A 9M.ҳ=.e&ZM,q[ʭg/aGvE$C6,TJ-X 圻۩ǻ!7_#Otf--:'\<т8jՑ+?njA-arKW|W:*$43-d+QfS4ƭU2<lD=uz>#N"mG5Q7nƝG5Z<**$׏RXhHt!:秮+3z; M%"LvpZ8Yx2{`Hxg ́MfEj i![O~ z_p,ym}pyilY3L{aUJ{|ٌO̫:Jaf-#"|"L>H0qՕ~KڒwH%@yTK-׵3VU0.螝=9*O4{j{57*/ay%YL{/g]iS+Q3\5LG!9=WWJW)2HI -GNNZ ސ 4{(n&[aEf!t+`|0|΅LBͷB5jdj_ Wa/6UX$beGvrE`4R c\dTa5{8xTXju[fܻC9(CշmIG 8܏&,Ik6l?$ۄW2↦uO'ǤKItQ"YmMj=Q7$靓,+wLk5 vOrEgm5Y/hߚ{DL))ʖaVY4dbUJq/|Sىld!kܺGkf0+*8i8UګX8wB ~J`,~Fe|*dr%lőg[vovCijv d# ŊR(03Hzd;kBU;jC$lWJEl1阊ƛm}L 261-rԱucXƜx^jmȌ)j a"^B%CFtf X':=L̙T ̉vU(vAwTTu&+UԵ:3w(o"[CK\Xi̛mN* TM'iEVu6FYEV3"#~j#p I`?"eR$,w)VK}tJ4w@eQWo JdE٨ z/ tVԺw7NrRQz6LbZOnײ8)fX3U][7M3qQVҦ3 9QTĔgJõ*- #^8 hqaj/ RM%wDY7.#B4#; =H]aËjQK<202Hyvi33B,#GnmGa19Da@xu;\(iLҙn=MbhI=eXi]bS0heGӭ.fҟMvX_ KTbhdʣvMfio!i*nb[RQ4b@HXN32 FIv&=)qpKkNW-IlbUioY$uc"Q:\;9JʖېF Q}.4f?uρaU9 /rk4b׃ *7i|݊.W>]AFM"dY^u C]RgGY>9q'4il)/ș7dG`ޚ|fw/WS :j4Jޫ~)|Pø^0{{K(fzϷdƍfy;B,W:FPhnZV+/(nDVAS%Z}d39!cb}>ۃ_ng4 $ ި;(jdG ڕ2μս6ԚS/s%;GgLO BdhfGiJ*]@ߛWE[rXuXx-#)vo;zgEegu1Z*mIUeFvhP)##:ԍm)2AR6:rqyv2M,lÚ{9{&c~K&x12QIQ07 OK)fk=K,as|fnueqXrlPrt892Cո/rE-ء3Z_3DȁSb.*EXubLzFG|W-Ez$mdHq^ٗepdnh}F._QtJkAYt>b$`TSY DQ܃OL㬴voO.4طJz;.f`<z%UR'IQtk %T*e*kM$!aP̨ /QuW/ Z4w ߊ$jT峔&p^^{5MIճezqSU龣C^+'ۏ'~ XcI1o[C 9aUٿv=ТP PᴑW,l2 QbV"9jaV/szFoXLeP^!UdJBRkƩHUdBP쾮tƙj5kTgձ4jL{m$(hmW:'Qtm! 朳s5gaߡ(ucY=_ #7~Ҙ푟&&Cix`rYNL6$XC[t-aγ27q=Q@^Mm%AݯR9`xC@~O!o dvW-Okad9G7EGTl^M=EAZgB`,[]OZɌA5TQM$ 䪉IB:It/@aߥ?Uhиܶ߭BrW֯k-7Xj%Ȣs)*c]Hb㌞hlLFJ ҝ# ^2VZ9BdR+ʖ)وv29L aZ]7yH&AVDdZOG@&S-EQ;tpWq18UE])鞷Ȧ_Yhv9˱+:+$@3!Af;?Bi,7:̸9teЫ/, #r€t Kn]{{2碀+;r/$AdnCM2U.Am (Vm'/Ϲf)VEJ6k3@Ų5j`1lًw散zmqia.[hb1HF$E_e!W-%Q,ZZT#pߖKg!G%ӧreXpUm+F՚aT=<BF p}j4\n?-GZü2d&$l7Wв-V?znׇx8%P+kd/XV,n*jmdlw#-YeۏNDHUP4 ai#\lH%btzI&^;Y5 $C]J,,z9LJ;L52 tQ={iz17)) ZEB9ߧm?hҽfE9@ûQ]_m"qd9+X XmŎ\\֙쥫]Rd^Hv Aq'vP44C ]W}HY'AND>ҏ1q_Y5>]Tڇ$9eecߡ7_N׮׺^<{m^x0ɺ lJ;ssS=>[9Ȥ꿤+-W5(;w#٣!*zTev8n,z=9Ge}1|KI[9*% 4Q&X9r1!}*,ۈM/uz a`!f"6]f (yXVv ^Q3kQlm|^CXZ0?bqr2gv"9Cm⮇Abr2XnJTm7olJ*+ޖ}/W|h3#67״8'O$rW>dZ=_!U[+X!^{qN H"yr+vȫ}{a0->:4@QW5+6֗g;U@E:$A&9\+qUWZj83*`d7zQ6J89#VO=tS^uenH9cbKvO6I^/'I_*Ǣ8lTr'}wx3jM&ۃ+Ɂ>fdb$.j66!PL> oofqx^u$f5hmUX 9b0ݸٞH쑂Q);~?`5NJ[ow7ݛ u4IW[ TE%j,nV8I]WVE D#e`a}oY%i^n[x[1RVH,V&IU YH$zqI pW zYU ,bt7+ToqcKx7׏ HR϶]=bVTPXi$mv,rI$NZ[GG2}?)˴lO:[ӵn+ILN`)FL|Vz没N%оK,FٛVԲبYv1@R2O@Eb=IZKPE`I&VIU$5~39^jX!r@5< Me7;w:d1o}/$ڞV2zh-_Z"s܍6N lgڦS\nǷH֥<67Y&׳#Mt eakh Xv}W&epI(GÞĕbT6Ug&!vGTI-e^o"}(nyW2|h؅xc}džySD0tt^<=Uj6ܟ>>1wT1ؙ厥oi.WVbDhdPvݛ`7bw$vCE{'V2"O kgJ@ܢdPZҴHjܩ&K 6H%uoպjvcLM5g5dnXcSm=ɗ)Q-_[Xb$ d oA`^{|f'Gq7[iլ*WR ˉX0 B/l)RN67@%,Y`>%E_ w,Y2ڿB٢#Zi% Ú#( Vb:Mqd`U\MUl%~D^ P3  h6^Lfja͒6Ơvrv4 6}PS!cf*x擊n(T?W2Lx!j}'TM :twօ_П?~n߿_OɊ_b2#5s8!?Q[ 5K}_tKggMrM:r9ܖ;1u85N'Ak91,VxO*7q 1Kץ|·c2Sa/!_z~* 䡗:7A.Ns:<7]9v;q<|D:"ݽA1/WXQfF&.i-^rFQg4%=s]`>pq`_MedtVn<_y(azA 7c;@+z'ڮaoKjQHX)ڎkʺ3v'0&Rпr|ަqt/hOzphsrbs2$y)Kkdy>D q_ Gl^hېZeUD-ɂ)b=i:sxj,ϞK%}j'k[ #!G; 56Ξ./)˳nXN,UjfR~= pW>5j=˲Z; cjIfo67݉⥘|ےtK;bb{nߨ Yy4D Q`8Ѻe_߇O`u>\dy &ӛ8D2>3m2n(bnuӪ:-COjhZ戉P%~ ",w-X^AcYvg^cOOwƩ٣ 9C_k9zh˜qr,r9hTXE'RFJn=8ng jcRBgZ\ Ir p9bxRGx̠ԗ`Vh,Ew*{v?cZ4yW~19*WiuWSDշtaFo [-{?=+C%a2f>v$_BW=f64d᷃jIȕtIZ c$2b7zV))dZPQzf,ÈwoR #v;#!a뫣Je`$`Iɠl_l쌀t.PLiA2EKh:@,*4A-z vU(CJ;^͗pڏ#IcXD~y$ %#?1cW2T]S8ϛo%ָ/Y؋!+j#ƛϩd5,sv)5~䤡$'W[ kM$5Df"XhLoVil%4< N$Ke^h1I1M 9^K~MhKTSi]".rNVhSQ21,N,Jv+]UoOOMxTr[Ppu.ⲘE3|[L~uQZK-!DS{Z]-̋O&WV SL4@K K@%E .-}"b%|}3874 GO+ֲ- k ΤrJӽQ>`sح{9cY[ 8 pJ!=24-zTP}*)bnZ^Z=>`P+q  fri|MJ#8K3uX|)`XCqBt6FHgtvBNMZ{)bU5A1U)',ZfQOogbp=BֻI4ӯI#2c ލeaN㼱s34JNjKH7LN!*te%{na=ٻa#NE*M{gDrkCzÊ cg3fu!A q\}Hbbdx]]1>5ld' bw$]ZJQGy ű3PyMCX1[G!J˳ PM`j֗]7ncnMVYRz HtaX##[3j`wN>*{ j]ѫ8ܧ&lO})4Ά7b AdĆP4ͷrw(!ӿTtoXUj!xegci{?:|~4eyBRvon#Kmgz8۹,sZN[Sn- KR^^/ÓKze&*=u"i%$$MX6"`3rZo 2TS/-S Ǒչ=;(qf+bgBDD㴤RGʼnjHB+uF^3Eȡ2ĢJDȋ*@o[DzG,75pp8b+$6ZL[ 4}ig/*cba+WrZup>J}5VJ{R+ XH]}_e~j3.K]OC[Uj+?YغN EROPIz=261uF`L icɲ2YnHRTvf1yD!\&JQNaܯ"OI xBJ֡BB`G1PUAUn+WlU-#ȹ Sf0S])O?qeXۉ@Wewo@14=1BZ9tD1ZR++e_Ev3.?:?sHK1o򛚕xdɉf.$&`CI <JQXh*YVŔo,0rȢC+`Uv &^fZx =#01Fneȱ@*C\K$ ٖ 9:Y⺷Zf[Ǣ|2hxk jb&MӖL`)jbn|^8k1˴dDbyFZBۂFgSskQ5%k4Vo(G֏ReHl,_RiZ8}3 xתa^pɲU1B%a_[>fŃ[@; 6jcMNRkp@Kk]J@F2 ;Zi-o=[7(SOZ Xb6Pnd 5rqw:U! .VIu^9:Ib5Q]c5Oj)Vpv$lcH!.nGDHb¦f_#]3Sb1H+D_0kBu [ɼ|>OThfVk/bx2T ;1qh/]k[[rh "HiNCJyHfI_&^onxk(,]XyZrM:g"z2 +n TtU{M i: F#Mr!y>n#1ԋ>ߧ r-4 bE0@AH:Be:_0r(0ڍѳ6lK5yEzRiofrPv.U^\66Dt[Q͸mbC+-QlcjU bycbRʼnO3)I#0ӉfK"(V*=~'fJ$i(?7}RQeŽ6QUaņٚrEc4L  =*PU3*!^819i$1Fg< A í5j\b|Y.c3umY{= Db(=+]ZO\[h2Y% OS#!⻐Ç- l"I#g>V<%fu.ww`b777 M^c#YDѶ9H1 uRv :jr]YN^lH ]qm/7v| W?qV=Y9yf&@~ DL/RB UE '1Dngf`5 $r +;.~/!)!PWNn$IKYCIj[!mP167ZkFu=H|vf50A4jp2w1SJsV}\jWxީ$\7x[EH$Hգӵ a|32w m9Xkc085.$.TId%v`̬ O檷q WrO:ɡQ1ު{پ+͢}ֻ`ϧ5 PٳK=JA&iSlq#`ĞgUٲ2p+r.!i>v_p Gi߉]O鮪c{.<ױz(V~K9pFT oqᣰ-ޜ"rjqYK)$=Q(m`Gp@ ߵ^߇cι!PBܒ+!16@W^??X6aDY4uM! @nD~|7ZPKzs`oEY"PK-#$Cn PW}imwW==zܜ:>kU]+PzRu_ nm2\~`(7$-H@Woޝvp3ZjjˏSb*ve~ޫn^=%Z Tj27U[Wrf*Y F8 OCޠucBMrQ}E>NXAa{ ޷Yrt4֪rbGI.r PJz^DJXԬ~1§^L_G&]D,O'o=( h5[EoZazciSUNә $qV)؍Ԫru#pi2>۟ÿ-y~o~VhR|n7<[ ^$F!UV2Y <}.2z{/н%l ^?(C XVMz@z:n㹽7 ]w1x}~]`>LYP 7f$'Ϡ1̎6lru+C9ДQѼ7nO%ac-П~3/JFmu{Gp_%+&m"we^fj܇Z cy|}.SD&S!`WowяM?ڟުUUza/M½⽨]pU|ϫ{IEoO{|~Mnzf&?7( MZ0kn(:p҅M#꫺ὄt;z/\R~5]ԁrx$07{nXރN]9,12MXH՛c %'t?j?tXRlƞdh2&u }XsY'8<5!Ev;pbb_ha!tf}m_w8WNf Kǽn~ɂ'{F ϒ@}|/6kORO]1M]ݒ/ߑ_n<R &f[z|P?n/Ogy̌9OP1 yї!V:x/tkuV*)fK0kRd : ,2SrV]ǐGBDi_g]i܆wۇɫ';-}kAht],Q$mXY=M|+F+ɀԫ)rF([NԆh\egV`PRߑ'sH)6VZXFGü!φ2Y\";g؁~KRinx?f>àӱs5ߖn}/Ƶ?{Z2l*]2Ƕj6K. #oƊIYK#τ ːh"w#ϲBC;S۷nT I,@TEY <}A:Fwm+g'w~Mb ~N%t x(* u螣S,>\ RT!Q x ブ Oh&J́\*R.8F6NF2HTd 5QĮB[ +q<=VV d&*>I!=Ob0h߱8~D؆`Աivvԩ"6Sk_tkOѱ_=-łSwKΩv*Ev w}@3 ]M?u7+ܞ5'C=6WC^yW"ظU-Yh1c&t6#jƆUgǩƐƯMŌ<ј׿uIpfgYjs߫ٶ:Ԙn)##q~PM_ӿxmdzbuA+iBU(AʆPC!5POOb*Ywj}ۂpl;庖ӵe1;K VNĕ"^iqYbVFT"g$Q>L~3Ȥ܌r(&u;QV-"fl;T#oүpP KN"^y)T/HD;}(rp:}{&/ih:N% zydYY,+e PR}j\?U4Tuҩ2ta+h^vo&B̘敂*Q{MyN62kd@6K"966Ec-HEd_A~tֈN_/Kt#Oj,"l7IM*`K[&exJdn9)+4rֹ^gk;UŮ,Z=w!;^S4T//{+b~{gw!^:OiyXF+RVAMӯpjn{VX}[1)䪐c=ꗍp,_% +\.`ʁ\1Xc]؊|`i.ӧfzƫaukGCXJ)AۚՊ( +pN*ŗxnΊ371 1C1"G,q<@!yD,eu-n +ŠqsCg/F.\UE vdgifr < uz:֭XM~6?A소p-<1A('y5hLj yʲ1e2b@:0^Ljg, ^'W÷,|o;Y^ƱQ{M`_6DXfv{1e,!+?_4?Fq5la:{/ hk۴/vk8w,D9Do}Mc$r稁\Wҽ@;znەiؖ+1d-9KJB^C2TGX3LŌ1iEg]D]?8v[ -_bEh!qzstϛ襨M h]E)?`AH,[U"A Ae;U.=Oɘ-S KE5mmbh 1l@FTb9{V1i;i $熴 h9UݕKAڸMdt%y tt_Qn*Ki>_=EF?"U(Bafr-GԜKQCJ+NHIV.to0_ 8(Y}rY$[,@wQ  ;$ ׬ӸV4d|]c59vq%q%+fHiȋRiw9 gQNz@iKM&i)Z9Ե?3C+l`svk32'TM9(X߱&K ?h iY~X%>B%SBFݴ+EUk[r|cRƘ)b$r+umGcg!:_׳ <-C`?{tN1HDUQfz˥ގ_*-Sd8Zա0Xp%An&GZfFlkXsLW5zv_YlYeD*ѫnDJ5Xi>+ӷakiǡo+y$uhޞ& Dܔٖ8yP4o0f@ʩHEܫHg7IS{ jZaJë2;\}\<[_"!.42DwdmCrTZ$VFH1|G+!֧Ð͇`ߌ+O G{Aڴbk7AHbM`PGj賴iޫim{deqɾ>4{EP!^rf6SFZuA5554Es\ 6 FE8gC[.; M-qjfj=UnSjyɛQ] h#UiXv}Pm}0f) @z ?nG"ʍFFGG~HVuäa}9[զŗhRPH`-aBw~vAY9"3֩3>k'+p.C^ I=ŤD<,p+buJ*P-8x{xŰ""oIT1w'rdi]*Yf5_ZKX?rW^Cݰf@,;Lp2!3rYCb!%NQ xw,Xh~ӴrcmH2Ln6ڗ ƴ^R>*ݹ$PձŋƢI#*Q'ѽ#mE*neVܰ $UDA5po@/!5*G+^`T_+%RCHԑ%0i~C^~ItpZf)qAxl1,Bؑ\BR(Ĝ]nDSL]6uSZl=4E03CG&>H*"kA7&=.z!c)~3hzgyk+7xڦʛE5E)11ͥxnG97sؚ֙ih摕[55C/l ŐnHے*`ꔶdГYM,pɈx㌇c,`Grrڃ$BM`ʤlÒ50+ r)`CBȚAɣc4Opa8씙,i,#> m5Ӻrٛ=y;dH+<;RrHMY|6~EFqsnȍHfg'c3)Ƶm+@aJIG aII0!L`{܋*Wȍw6<Y}=֦-j_tNIy 0+,=A &RxvѡO>W%=E%֭R ()5!6eb&P$%Hm\* 7qqV9 RٷS-.T1csZHrz\#X5ΟE%.?QcHlݗ#xr"N!"Yg 7bjf;FGK5;,0IxW鍩Om$;FyF>1(2ZqpV*C+b!yB;rQn7_v>SQz`5<˖,Ⱥ!NNʼ,V*kqwTCG"FŷNjn،zEY1e!ew MC6uS4]/yZG H`S C1fgi No߯ZsLz ~gɍV9]F I :fAr? kvc9("ő XxMVeURk0OW!NbКiOQ8` I6ԹX#X B1vӘ\Oit7Bzz x0{feQ]#e4Qpf{GfS2 Ҏن8f<@^u[JcE3Xe6Ԙ\JynW<řtPτFF!Z-*=z_pd2jW'XL$5"X׽2fʣ1cܸĒăq;TH۾%VuL++S;G$ VVVhݺ?^p r=kيF5]VvymXsNc~Y붂xإwu[C~T@; L{mě#R+?ӂ0XX0 `Fo[vuEf,nؼtҀ$IE'}p+'q=u  })bbIR6 4URV A;ѽQ^e8= `grJj* )<Ȳ"#;B8.Uy)ST敧xqȃ6XaFH@- ޡRB%#H?VlՉy>4Ts+'n _4ME֭nKVˬaR!XKr `ׂIv!U?uO&5}Y8mQ[Y șs,q#%a.J;Wn,A *Qtk{PX:6"K|v $Đ1%{rpnE}A#}մjk_Of $_ ߏĀ~;}`nŔRGnrv$f)ے%LRRrʪi +>G;B7m@4SU)*W{19 kG/÷n?R!U٘Pf{R /(da27B^|i$ҳrW^(XRGacd0dcHή֙%+Jֵ׻ }LwmaS(#"$k}Iѽ\A'1w-K;W6=$,5uXHW` تX5U"&08ygm+TePS3DxYw+j.y_`}&y| P&RtP%Ov  .' 9)3rV+:+3U2[-ȯH]у]!?PkoJwN|k{J15? f;Mr P$+ w FH?IjZ?=q L4qjmzmn)Zۓ,јԖ{d#B.wLk}1±:<1V<+`X&Vc2|Nd0l=X_n"ZYv^Mѷ!rC{x^ՠĂİkZ0$L);_lW&}Kj)^Z1wS& H'. ]+/OsFz ?]!H%$Qv[Ev oaY5,G pdEgUC}50vfP{bFBej]5= zԯ54*l:vbYDP +FޡݎH:AzvM;Ӗgn D˱RʽnuVÂ~z&ԕYl\7I.aُx*% ["1 ZY9cDl w=ء׮uvK$װSi\׊~ښHWu ` } ?rճvM5דum0Q߂,R׷#G<4K0.ukN]Dj!9Vr9ΣSпֿko[H #"=*:႐~`L\I#aD:ڮ w"뀿ݶ+F$ICTaҳ'ߑLdtdi)yY@g `ʭ]W4ǖ+9b 㓐l\AEhsvuWGcRf5'Dž ^$M)*ۍؐ_`[[ :8-C%AI*EHG,jN(NIOb~C)?g_]8e/t[ca;_{]EoYz;%nTKNR"!4b#IbXole;]fvi87п KFAi/CrԠ|ߟ~33>N,xJAh u{X*zE+>&6pv;K_pf#IZ |.2!ww,IWv !kњ֝ӟ+WQ ˧"ub'p)RU;5q5z'WF9nMr]*Y9B(A}B>jA!YjIDQ Qt6Z?qލp9O _,ԂOrD6@Y|>itɓGzkp6"l|^Hx`⻑Tv#$ǎPf`~YZ_Kv-,TJLIdkn22f2NmI?̀*,>[x+Ǎ:>R< lRvoq`p3iNhAt~tLZ/Qz㙔6  7)*9-w٩ck|Yo!uUQY1]ȍ۲}cu&N.뎖d,ԥIK7KeʬN}/=R9kӷޱl] o 9' d.]u'daZX!aȎd4BP;*JXz}|mcQ_xᅪ;:^Yص9ӭsu*GdR)Y|@}Ӻ)>C_) Qa+ZXwَ7+$7u٥j>v31"ǔƧ׺ɏ\ll?okLϪ5=NFX{_{|McuQENE ܁ǐ5:4Oo }5ړYWZh(e(Ǣ+O E;ݛh7\2Z  cflȀ>4{Oc}ʑ=Qz-u;XO`- ؆Wr7~@31 ufq:#O[yج njr/#ҧIX6|m0F5WofKoZZg#ʇP$f,[HeiUNŗ]o{2~ [W X|ͼ5{ó Vdj5m/OԻ'@5,籺~E3Xjs$7 Vڟ_ZS+0"~KRLT2ªfOff6&V6g2/&[x]AQ {Pi;uu$?u^ nacT!K=j"x*kNh3v.Q3wgb~ +T٦}wC56iDi*z)qu7FZos=$+jgd+n"řW!X#:Tr <7X]Iֽ5f>k!5%U v.j n+,Gƛ\ #et[/N*m;չ,5|ehm46E-/.AK}m-m+5iimtQPPSxῐy 6Xb #N(E$lDM$RdY5t_*!mt!鏸Nb%X=4mӵW[h\D{zq5Z5Ir2HfR[3ڡ^"O,#GV[SHҽ_c=+KAԭչuC'k%o-RYM!iǐy  4Cj Dz_/=MC4T5WbNAf=z0+ޮ246 cȝOx#=KU|)M=D[-G{Dֈ\/[u ]jM)c+z^ĶEmxV&5%ֵ#Hŕ$;ݨie:iskd&Vܖ顋a1:SQcWw?Gjh+FLJbRqKXÉ lUս"EEMޥT } ;$#p4elYR5R%X6VUي#O^tƬѺ.{|h׊9kh.dۯ\$`^+4kEDwе-7\g!/4Ab5dX[ܹk!VZIf3n`>{08,[:퓩:6Zh7{A c'2KzMhz߈ÄdEzֵN/'N\-L.h̕(%Q/)$Pߖl9/Jc?opz'SKinc5&SpW!;4ܗxAȈ/X|<9xWyBoIh< WnRL˜{fbzٞ{fXsR:z5h.J F+,SeA%Ҵ;i[}JQA+zElX\+3]ȫ۽k}5^K Ncڹ$X8IgfWVle6,Q"(i~Q \n'Ijd~ۭN.Z[Vy8Vd'|vOPq95WDz=ҢѴ.aJ cYtO'a;G$G3Ga 4ޖS?QbŎ: 7A]܎ĞY%JWثIv QTɚ,1CgC^Y}5>\G/׆LH۷`D4l^Y9Ue5$P]赊3պjܽDYt"F12Zw2RxVVnMJLF 򉈛RSԹ6#d&ѳYcq \qᐢj!  h4iǧ>AYv>6W7O`%iR}'r籯0vHDC$t` -ՀiEy"ݵX>(B:KS;t|i>:ܒ|h r%Ni X PvP%l=IXVc#24G#F ڿN/Ѯdj5Gf _; V~N6;#>F;?'gGi!FAo݅UKy4Jc#'&PAc ݅as}O/}^+kJRO-yWwa`=I՚WYg^wb4ղ&ȳUH~ }>z٥ ػMCO&F V2)<ʻ2╉>(RcpZ)*dd+ԹSWFÄȁ\3+~\G,^.زEV.Ԩ5d:F^E# |I#Vls7jT6Hco!j=7 7:9Ʋx߹!"-AѴ/%6_+,͑ejAZ(PWUO!NLN#"r1Czýi(|ʻ >˪#Sh kPt}=*{ͷ6 Pd.#8>]Rm5VͨWa+,@'&G쬤ٳ^Ulځ!83- 7vkfwHtO4]U ʑȱ(DQrX%)d1ZYאGjl`/5=-/f#R̩,uqistݒՉ0 b 1&+-&_ 'AiE8pďښ^fh˱}@d$GD ,RhY'f,d%_d|e'6ň4:}n"br|fRݽC3#d~{O*A;)Ic܀ފ/gdL::Zc+V҃Z\jT[~n{4*:gQNLxI ;Y r) ]wY$0nUXoy8:(桋lv*HX lQ!X?x6jL_O.eqOBu EvbH抜#qlIn<nԯ4lvBȤKm<3|XWVGa2/#A`aS6}ukMf_bT+G#8c$~@ ;zg`<ճ*v_6hA(C]FTZhΚ)F&iV*ު֝cWw CfR)cMS3Nܒ(L%E$2BQL)kq5.tIk-%J&sx\~wڥH2ѩYR(K$'6j[:KilXk=LX$$ mqa2%:79k-KkD[2 H!%&h;jg*L+vd1H#NIOgb8Qq,~:+t+/M@?Ec0H ;әީԖ5 խ,8GʸFc (gkS9RyҰy}ѺkkQӵ{V~tF#؍6iM\^;vDH*(X3g55fiI|G3_b[W۴LcuW ϣefjEZz K$,撼U(~FXr#P*G̨}v,b̹"#R-@ B>n_'w!`) 99FkEٍMVۂ"˰âL.67ѭ5x3 Cn 4G)bȒ$3>:G!#_FڮWpNd0I4o}#%0v{_hZ9y5pjJƒ,F ܙ XX|Wd"A$p5 P,fLLmV1`H7 q P% ֓y9z;#yirz]}/շ_\|]ՋvQk/)Եe#'C$̢ly ї%eTX^ް7\!&?PR-ȭCX2G "UEUHU;8H],d`?i`i)=%+Eh6RZb9Ra1uܩ%hz)a~Cm.X<ʠm@v_)2TZa;ZΕUCۊ̜iG+c搧 3DJLݱh8 ]Q*`-{~>NVlar5H,ʘ6Eee!.2ꎧ3^Qk_«D?[&I^(ȂYy:$ɒqX9nuFq$LFbTZ#)P}O娗P[?·`8I;:I$J?$+kt[+ZWT{ 554.J6T-G80ym_!j~Ә7Iicז,xpL{d@>+ɱѺi,B(e-<} =+N9 6P7mJ+iǷib2YQuMf+NPOqGqCeP ]'x]=c=!r4M-uU ,uRΜiܕW8Z˕ pˆͦ8UZƂD#jV ӕ8(xfq#ՓuSMMcӘ:BaX!6ĂLWsՖ 5;Q0Ywe0ęTZ8 X'H`6ݷgUXxvJW@ˬ@A@l _)-Ql»Ã8qrYKM:#k/8?#72aYN}bea-឴eglv 1 k,3D⌮6LH%M-ƍw,. 0$IkRz8'*^荻L\˓D|˻MbP$+JGll`|VX4Aq+s9>A0_Oc1Q VC0j͋)E ZI>/%pő:kvm<@ؓmNsw^hJhVZ,vUQ]:Y_Dˤ;U&#׹*^ˠWXIXnܬ!8׆X,HvEs-E2:d2U,qBUqu n# %=vY1҃hܱ%S)#jWVv!GD {;4QOG"йdB%4gQ)h-.dWSz硖Yas6ƌylKn̥cЪ'0>!]S6=j@uIeךLiFKO<`j UYXq4SA1$R̒/o Vs_;D~2߄dwxw?9oOmmϮ"JJa@R8Ń!V,JPNI4,.'5}-?FWLj($ b6XY";V%NAZ{ũ,هd" T%^>|1mZQM5d5׹ 'B8ef@X~y7٭{O=}7,1ڑ/9l+đebMB_~C'-Gu$Trw|YE7c\RsfcGSӔnLVFVj!L9)*3DJ&}`E}tc[#28ʂK9ж>y`H ޺uX~*^tybc)h:CSXrH݊PRGV)F I̠~InTŸxsx'E,) B8Hrhl:WnJĘs S0$*G( b'&7MuwqVn< rʚIcB$VuUYK8ߘN&}Molz9n*9hv25vYʯ1ݘiZ'|.Q>}Sn;l{q)"[~t4ZcDSc5 ꯇascuΐbҷBvGC/+FFrA1z\At^?5dvhTEؼnWb !u)jo , RF֤Ēbܘqc⥸VӺקJOvO,#wU`ݚ=>&ZOm&ţ SF5[>b/ұ|eV=K.Oځ vk'y8ޮꕵ-3z_1@^1f2YO}k+s-y2;qn*̝;gZ;ucRSK$:JȳҧdraGȂW&ɹj?:̬[%rTEvP$Y_;?~0ztMvjRX!n((ݙy$҅ΟslY42OQi2 PTf6*;HN#ԚKAc%hο F{S] Jܝ(eUTPUENKk͝Eb4Y:G ؋v7&ʿ?c rHd9̤Nu__Ej[5mZ/V00y2D6JF>lw![nLBcCjޘEDeK}?&+$xuIMN v+up|‘1dҗށx#=[^cWz:UKSH<Zni+د=hg.G '? =]hY1(eC XHݒD5JЉuhwCif]־rez/[y3)%ČG"䷒63Ы؀>_Ӄ< 6#͗u!vJtk'w5|7^c//egEu`^6Ďq\V*ѸU 75o;ǽnɂ't 7fP7>I{GvM| qWgy<'^\1h؞ J+S8MEKHNt;o˗J#i#G4r6,Āsح_ߊ),l*9Tf&d`?t]>4֖>K==>Zdavߌ "<-ѿ]Oփ7ocӽ[Z$J͹P̴V>LSIH6I`I#S*.Z& &00%ٶT.u'fS7Onc&zWsw_Ԓm6γӾ-үjƣD=i60 zy2<<蒅HDrs`Ԏw ȓWb{v]QM=c4ErWde,L7*n6;zm[N+Qh[?T&WW 94)K)ԒyYM(eqɸ1t/6зj,욾cuo[zit8 1M>@`}SS0 i8y6:-ߩEǐ+zm[N'%Bi:Oի$d:Ǘ&Ŕٿջkm֥Dƀ!oYo/ \ht/fXz} g;W7UH.pd+wW ~Wf?SqIoLuv&C:+$N+XdeT*c1+(эPUτGӺWFkcЉ") V$݇#g=ΜtNjJcGJi,-R. \UXsoGS>l3e!;X@>~屺;X+2T~kl?_&omPys^_%a3WRqُь^B `t?l_SQ*dB@`ǏP֧"&Đ'wk֏/2|SYw!O5@W܍]Si{tt6v &155 )]ב y#bV:u4ͪV+&g0f1j=ӆ0z='릥t>^-jT8$j(Û/EA#ߪj** OC؝kc`lƍkvHQ6>NaⱔZGҒҬ[V<|%EljI&>\2dh:Q{l vEm{V6e7WS;!N4hx%__?K Z&/~Pltx2k5(;&7H^!$(,i1~U9m[[Pй茽,MeYWNљ 1TOe![[jΊj+Gk+nT30<(gc}bSGcjFKFչ;TM7;5?ϫ2i,73˱Kر/.cKeVc?a{V==NTuFXVӒ=#МVZp.R;;D+Ee@'Υ}RggiEĕ626i \*)UO)Qc{{DORjrSt-w!VHEIëH"yUa6pPF$֦e1bA;z5cGc.VWF(\cYƆK8SڅOO9PeضYuX;e*bY3^iSc / *WtHvB9^e(CӯxVP(Ëe% eH,KKqEеnꟉꆙN'lj#J~KE#K"|" dB%1!ɟY?Y=($oެI f`׀h-Xԝ92YuC Hļd1(69f%={kz08~nRz4%'0GRZDD%DC 祦2f`l]K\~ս2hm|4*TC)gs|~^wYSӍqJb4Rk{%7(״jc2J}E4D3i۪J6vߺA˞SPAẑU豽U x(c:^6wYۡUZK[lܞc%hQc+?{:qމ`-Y72Y=HmȁqbQaYӵEM0Nw֔ K/w*ѕ!iyEv,hKI4N޹:w.&jzjZ͏՟ Bx04n`##B0%t!1S;(qa\dRTy6|blWrI>j`q@ 10}rG4!<Ҩ5B"H5*i*9~IKBHU~Z״hI˺oH} !EJj*1.2άTZقjt소q<5l" >t_/Eƚ𱯨Z%Hy#1b߁y@ .,xqY S\k`HېVgw AˮlLlAMkuPjtF猷9Ǖ6V$Y0$H)nRxKrx߂7agb#gw07ߪ0uժEg+ 'n+4cV' (XZ/.k!1GVd=:HdAvUwV9I&=;V-9iaJiPnoxƫ (J/yefkLIJ5E)gƁSce5ɿ#2.UDoB6JjZSX #L:׽{JYhC̥BW!y1cd |bkiӍ+O(V+{#ntNH/%im$dH nSR]OrR8e0e6-,%(efbs%q/)v&"rݞܱeS~j:)e+մPֿYqzrj*r"t} s#mtmZUzDA٬وX:'mNI^#^&I #J{Sg1z_ەc{P  ::⚃3AMߑ =oL.Kb_X "ֳjYTTbZ K#J1p~J`ƞaskˤ5.m J\QoapRfZYOAu6VޠRgf)JE<չİn{ xQe5R9PTLN.zXӫI &NK^1$PL DJf11)'pO/_st<0iddǷ Tkil J`c Sfk0M2z/ ilVf msZJw 82 ## Ĺ{aړ)ZL֝O6m x_}Jm[T)n3[iZ5L= hWqbHeR$aZW{= {p$銄M,+l&@Nu}*5,sך"<.:Kdf3-ꌌ8u%⭚oe o jSS'zyGWo+I|-ȯ^oWvjZR\Iwn؛;Y^?Zˋ=!jN͡M)&EXֽ-9~^' tWIfƝ>:WZNs8شNJd, D焈bFK*tҊi%k&V$vݎǵ༮_$/`&I[ZCJ{j^h:mHY9yd^mAkfZ\1~gۘ"@i=:ʾ&0[{9e\vyH1Z*Ye|Gh2O^nTܩtfk}$h 3/< P-u%JQF?>^i t"ӿӺ~%2~UH.HGzPbxzWKeN5I߆ X谲<ɕUd { WF>Mڲ@`2M>Զmr&ihNqLj2vkC֌jTߣ}{=bfehc$<'CD(+afE GioQn9r+/0őPnwI]U,T43= :Nr̶F-%&HG4W쮐/'Ը<^JU7_Y|w+O6;iwqԭ1cKiب.ukeیw6k( mƫ!GYeeOwUJ**9Ƶ_M`znT!4LƄI*&V# cG[LZ1\Zy`ajoUxbiv+U߳Vz1WZTqnObF~E"ҋb=NݼuO2eGN,FA,Jm5=cH 9wǾWʸ9@2t]h#,~hV Azҝgvv:^K%K֬#WI+!*@*> /X}#htu کJո4."8kb9 q~̢Dd& CF~UtVᭊ ޠHX30$bw[hoGeFFK_+@qqp zL  UB^u}'i-I7N)Lcs%f5 FH )jq'HilܭB5lT };ob:=kՏ*4OAZHʼi,6[Ѽ/HuZToEue9*yC>m$O Fb7;fr@Wu"0= P#m+O{iXєO w@%$cᔆ .hW-7Kg+RiYckw- Y$%`9U(xʥqތ`ŒkQwbcɸU S HJ?e}ˏv.XΎm X;JL(J'ӺWZtfE̋!KQv։B>ON ĘÖQ ,uI$䲁;r>Qb}gi&7:tO^/2"\BFSpd4-5p9ߓnw÷_}|Y&ێ~\xm$H-WG:hyE1dnԑ)_=ƕ0j'ͮ6)@V0NVZ2Ę`t >C!~[#YXGa~Mfٷn˨~,<)Co-Zk8˱ݚq.9+2Ո9GϨ:WX=7[,~lFb1%/E*BʽǚQ*r򬇫Vq]hx)g2:!#AaSMdqTc Ӑ1u K6V>fKNli.@x`Iq ik5}'i-5ӊSj[vcY Pv ) Z*=R$]z8%wV1_emoRfB$?:yNͬ0,Q-_ZDuf OīnN ѕNZo˦ܞs!R`6>GCNʷH(Hm'o>t56,2Zc)D#d(*RB.﵊zY\S5.[ڇqbS+RF1e:m|JZT,{Fb;<(@y; __lCnno~CAgo.Ev#z_jD,oP}j]g|o {N.qvuVj:v-;:6m褢 $1L9\8x%ƕ.FŲxI<'mizv*Ԟ=[ie%%gҍcl$1-#ː8%?_??兿3M.oS| 2 4`~umڋDt$I{XۂP^\mu А<#pWY?&~ẓ['B= j ءψi]׺ g^?q}^](mM@j3nsxc۱9#7w#]jpk0XݷeYxW652UH"Wۭ޶/M׌*친BlWMr֮vI1ӲIvV`xBgX4wQ]iީcjZSFnŕQ^ΡؤćVAWI4mV ݺUlhvQ8d4/h[ىڙ]ؑAclQ7Modi}<ת =c(PZYqu;-ıUCw>?÷r޻ԙ[Muo#;f7Z96+}4bNZ):<7_QRr2vfێL_4s]N+5:bxJ}fv3(Xq;6 mV}SV;Q~InxFʬ%T"Kx&1%O7U&DQN߲>!O?kkXF?u;$MÜnI(W)J7%A[n'y9`Uմ >> x-ASPE4*JI"y2H,IB#Ԩ_@I`pt'b grNoߌfKX} 2Z}MDs ǧ°xϢJcsU~-mc?w,N/z:qC5iO H`S&mϑđRe7*ijl+M=xh/qχD HE/SX{gVWZl4HUol #n߬y5oVzi%!"O6bb!!8#`#%EӺlU:v(exgNPH ParUm[m'&;#禲,t2I:.pFĨf~fuM&j.q[qC& Q2H[RyuI$ZT‰"ډc}_7՟n?:j~ME3c^t1G(6;X|#c%l$nWf?I&+KgO&8O"޷D,M" KwD~;3!=BOl˧,":`DA&ۃ9FnFd\u b-?.T  5q$G+0m%G/Z\^Q'6,i9*E,jX^2x4ݺ_ i쵃KݎQaKI v¯>l I.O)ec(Ж3,Fka{,HUF>NBx\VzyYvOFLmyp;K$,LX{yd'iN͌/kFet<gH୨\Cl3YK@4AyT?ށ#!;)7zK_"1~ƅuF>9lGM^LFx}R/eidV:;0Ufhqzzy4.Fj茎zyɵ)N~C҈BEZY^~5Rkc2HsZ[Pj]DmOOFv"Fqq (´H)a#_5S'Z g'%kT`CtUyԞ  =pQ}C'0`UvP,~P4nNɢnbx?,9=cv)XkRX=iSFr|x/k5n]vJyq:4 *Msj,;)5khk3"CdHZCkb[o5 W31֢I"IV .P9 XVCB$[ȊWҒ7u}>qx2DZiJmUV$(*m=TS[&юrMyL?j5T]ܙ8hx;ZwDi2>1 %bMurznNFIR mK$ѕ0TQ5>p?6#ڰ֥"JDY;cT<7BeԺOêzF}um]МbNEo#Y8M,h " H@^hj5+ tߖŕtQDէMoxJ6{q_x@6xBm[ӗ8h\ j|7Y$@=dU*$YnAWLJZطRfeW8eI#,JADYLCrk91qX?GBj'G{b2ZRv`$uv(CH'P:g'%ʕ`ztCZ\eJZߊ! 2X O#S?.31?^8`[NRY{Ȥw8PZH0-t7T՚cB,8łKVK8e139/,icYy;=ᶡId$zTe(@BY/(n{z)-^iΫяSaP&? 0B?rJd\mZUYLYJwu҄tS}9Ԓ63UЋ58d?%9'א4`1x3ۖZG}M[Wx1ZڞI{|)1Hii"YgǷ_Rj\\~iUIk%z~;Je픽<'d[RUE FƫvscMaBH"3fU7WXckWfmFH5PeJ޵eWQGZd:{ԝg*AwI*'!bhy %}R N4V,h S:1yL0Z!c倘d2WE<c+b^ky5E,Κ”&ͭY185@+ X1ĊU~)ѽ)s۶v5oQ:GK,2gpxz{_!U2eSzNuQ dLjunT*Z'B +Ag:,4F"+Vc[zGX.g,0&kqv54U)ؕ侴<13ј@A(=>ޏ^USaK6(Z"-Ƭ>OAUDR&)TҞzGjpKų&/'8ţ]%Wa`Ӿڽ,"՚Ry/j[HiI${?EȾ΋B <&tD R,XP B~ao V6,Uh]Q 7^=lת LV[NRjshbe\I*gPSgkcij]Hlə* I뷺 OG>2۰ZrVPqJF{qH$ܾ0d{oOHuW6'$֣:jPm)&-׋t0ɲ_r ({F` eEW`ƲxຟşXt0Tzj+D {W]bTk)bywݖld*?qy2L" !HFGAwK2]F:8y{MAyƢ+c'cZr`̭WLre599=JzU伫re2EgB(HS)= CSz)KOSjyǐy A1;q{mfN$Q;@,uu- **InYj%u*jjTD vu;b;1.S՝*R65,Ss+,V!LKdqmUneeIsJުiKz9k qZo;=&` ~$ӕh1nKN& Z|61򤣩0"8#nm񦷥fUʠlbܐݯc5u}kejג}AjЧ?S,H(x)Т EhBj1l>R/:|*"&/l BzH^5|P$L}6V]Dy#& F{;9N_[Jհlmv`=5H 䴝yC4o *d_O۹[/nzwQej&)bN"+CHF1ZNX^]Ed\ޚ+3Vg1%z/jq}иw9'}#UNa2eI gR,~(^`12*>Yr&BU,S?X.Tiװ.7%cwHk]bgTߋKv`A 34ZC(Vo6gOOc1jH-g%IeW#N6(/&ȣD-]-{I^ZaqX)c^i!bU7#ƆGv|mK ZSmGB;8>ت2XD|Tm!EFCu/G0*ACYWl`Ʊ1&L^DAljduR& :X[ٌ# PM{E8Yw.wMMBd6.grY ZYKX iI-7litGMzXZZF$ډ<S3 #vofڿU3eU! ė^%RXWs+!,2IK[qdUd `+ Დ#iBLV'z5Gce&kT|x)ўݭ=iMA?K=D}7crDjhdM̤Վ+k-Ia*FRǛgxcmxkə@PSNinK3 URUjčGK&2.<"ɁKJ$fl"~ !&E"j E<2p5=$gG oJPK?pc$=Mw#xC+BF$F fnGm_B ; 8T, 乓4m,G`h$>[uG+-)bf-]5$QnW:?nRljM9Yo LhNY(Σ8WO#z0aꖻsid26+DAG+ !cSݰj9kRLnE}IimZ4c0A Ҋ,xv$*YAqs137@_I yڄnP(r`QaS.g v6VP/XNO8Y ;+2= 9QĐ^7T}llifk)7in,frpއ( ʨ=7O>*~Ujt ٣FK건9Hռ#f('{Qz_ Dn+ْeYxmqpy1 _IEƪ쮗ﱦۉA%Vqaei%]j%ܗ:OU/>gi2?VWʍ>wY8݉-] 7Cnk .KnqE,M!%TՕ"6,1HJ,=aG>i1Uzi\~1,t+Iv!Ɋt/SZ4܂(,{qP?5WD &ZW OvyZW1&Ɍab/)BMgEM#C612dAWFwbd^% /b[^mAmw^ ~Ld)0,$zo[׶_뱐ԫӏuR9+0*"̓0AK92:ox,I="i!+/I&]<ֳGЩ}siaHkQ031\K3AbXk4k*Ȗ1k"w4gBm4vR팖K[b|vIbYٮI$aU13#E-@ ei[>qY:Eg~# /my>[8ݾ Ed9멘ԭ;ʋ#50]ԛa2^xVcɃ!,FĐXC܎?9O)obvX aS*>°e*XnEsthYu K,QQWVւ(S ʊ8(D* 3j\|Lܽɛ Pեuk=(:>{g_1Z'VIQY"Otee  }]= Ì~sz/kGC+&ȣvhn@}̌yʻWMAtcz5J"YW54Sp1u ja8,er`-:܆Wn%M"VIg݋;1Lo?Oэ̤/\be?(Gbzyvb@z dγ$9'Ak^qT/nNxU(/˵-bm ^icqu#=U-WXp{?iz3 n,/Z>=KzV69n[vQz_|[I?ڐ~w`$2lwwFufR :n(*ӂ(VJu<[.+*X9d#YjGo¿N |QU?$hʍ^wVJH`az-=5~ME78y*K7$O+-z/ߖzo_黒 'Se?smv^kVqF̵(-CVҬQ+K-D#<)?Qe!;)SG#ԙ}/VEygeYd !O?$X1kȰIxPhЫRjXaJU'` f>&U y'?hf4az342.^>.J]`pC&,Q+1;$(فʠIp(᱿}if2s_|.G?o]zw=MH_sG)^W-%c=mr~4P}I2i=kRjBo2ǁW$s6۝};^u+ xD:)!UwmPXvoQbNz\?L^$B8cdIXVU`ۂP9,ʾyScM-tcf\xd[_OJFW{ݽϽ vrT*BC>)t=QOz ?K1K#d;ՐX+M*>nKE(Y|n `IP?;7нqoj?-ŞtWl X}]e,(d$h24HΫS7swX'5ᡎI6h=_=H+׃#iTEZD@y$77R9Dֱ FJr1INm"ѧK_C\++*O.F8#c(iQjEwlitS~HWRuۉ^}R$hduhHe AA{_WdbLo {6x{SI{*;,A>xS{VNsc#4}+C}UQlN0zܽ5gFF.T @b:g0p08p'-IywfiIf'vo=Oа:ưԔFiK9e ,~E'vo+1#%~Rr>/nm}ߖ-Ƈ%>GO5BXDRf#}Q]Z.C%{QC,qBGPIZxж~9`Y5kGyՙ>Q`»q`YwZ۽m%^Հ?nn;Hh{3q:pΡi\]EB/߳2A udx8IY2Ћ*aպ7XYkK^.iY$dhRR)19wd1޼I5іvzg4IW,=cV2d(Cj#~v_Op{?_r6 ybA`Yվdh Dq{F ;vebmT_1[BimzYc'պ["F ۛ3Q0@F1ypKsd1ys N-{̸K)i )X1SDV^.cP`3kz][0$7Yt=aؿvw#M/xʣ|v 4V~5v-~S|CG,p-;LoC)'%Z>Mwَ)uLXZ/8 7s·=Ϯ:xiAdB+T,oaDtsJGnME$T/B+ܩYdI^jV4Q6KK̈CNdHeB CYeKG/}KQc։>;0d-Y[:CK˃[ cVgR{NІhg=)CW҈54cblL+UiJ$szͶB4^1e~C-^ctkɞ18|O",˔挳GʑHX88ْB9 *:/ޯb`d;*HvZ$Y%JD(glRv6XdPO ,dlW3[CN{TqWEL T&F$ ^6A A<|vw:[y5WrYEv46jy|\Yi7~ƚ9Z7U9klZxI2{j ?zI5z1UBrrFI'*yMk 鞤 K_fT.FU*Y\rwXFǏ$Hqz4#6JbICHWp+pMQ¦'֣H43EZHjVL粱\Hcf8 c.SZh\\(O.xC0RbGiaX1uMn>fEK!B]z121UxX|f*Ab5Iu/-ҌoX~zZs? 5cIĥqB;hyeTIM*grwE^;.VvjJZVbt]Y35{uXu{qb14#$J;+h zўꐰzN_bk1WKTGu0lO4s(nHD "4FgUr./*SVJD4E`"":sJdյ2ӫA`.܉,bh@G5~bb)4; TZQqo-vYn<2؀8-/,Ps21 _V`לrPO^h%,ӘU^SUP f]h?tjgDOimjbޔؖ%VXH̒HTGn#HR7P5oP"׽#;MO!>bI^l{O@8^;/7AO&V{II%*`5eqVUdnxI^L~gbe(cf& [OQl٭@gϚt1eO 'jj*;"@5#b5_wZyeͼCE(` K؎9T/YKxKt6O#7ǫەYv; X0F }LBX}^[z ْ:v%]Cm<܊h,C :.tk9NH㵐ٓC *Ia6~x7ZgmQ)~5&V2O)$^247NeD+N *]r+MUU0 L;RIԘ~:MI2կ ֏v!*oI`%y]=>% ꖫӹ~So^L=CE"Nſ 1k{Inq~;N;Y) n7BT(,˿i9M]Z|%o“7>R{Bxm q:l78}i7:ex|o;Ieg1i _n;^\*Q)ul04`@<}#H.z8xP5ni#PHۋ63>9y%yRMHCBC]27U6Ã<4#:{">?UL V[t:KZ\"KJՂ't@f 7h0ϕ) ;}fn2.zI!"ոahwQ\.)R|N.C%pŎ}w +ӄŰO9%s;sx|7I5_BWO)nE`.Y8I}r,)] I`H:DnXV;֖4fs_Tch5IUZ$[]aie$N56W'$F&dYdN׆^Q?SoOx+RJYe3!ܢc8JO;u3IZG%wZH#G $,9}ui=9MA"%qbq %"|v3r%duI[SaO2.g=7?}2+A}2%Gst|gQz5=مw"Ӯ2ٞH^ۀ ̒GKK:;WLzUAa?u pGQ/ Y#I><@$zWDtKcogt7C>2'SSCbih㯔>JJfbqkP5u`ڿEUiJ^fW໖w"lNg擂~::/{QHÉ(ŕvw2O 1_C0z:j+G)4'<,U1^VË4$x׍wqX|+8L_5]@U$=Oϴ:=R .Y4zNVP,{Gj5^FBxxNԜ]=K^KR)+4vVXPT伐6GP[u ߆a=hM5<ơ/Jy])uA CVl_qp% کakP^{ӹjХ4o6{Qi ݙL{L2R,<U.nh-\jEy6f«ŕmc WZyU$II枆ܵY),Ib$1o:ЍA&P-^'d #K) ?"`Pq8<~ 7[˹~$?E8xnQ$[Ki,(ig~zD-JZ8d2MraS>%W_]5^J#aod,˰ylX7Ixppʑ}[;>]+8R-ZY@qJҲX39ERN0: ~ٺϫV-WS郗y1%]0@[f|K5%v`(Q^{1$44PMe* =@z6/O=8=c4D]1d,?6@49,l^  @ gnJK0:%qc#A\HA Y63އk V3CcV6F4{rn@u$0 #oLg0|֘?b*-N|iC v:lXܤ(mWC )sC>NdEMeRE좉N]q'QK$@򒲸 $1YX3}$5[_O?{Ο0V^Y&;$JdH$Br($I z]{ D,k~XGMB{o|9yI'?ŤCyg3L \ʊPجA nxLy*oۯPDmۍ؝gFދ[-6 i o;GLri!䯤1$=$e b5Gj]g6WcMRHv 2Sf]ǂGK^dbKJWSNA%,͓s /6S1ˮLF#}RFu%0y>k_c-K<;ܸl@=3q=ߞvr㿎{&Ԛ6/GRl|^i%IkI,y)űDک_~:ܥܾ< Ma >Ct[MSqtBȍU6\^@:l?c˿VL1m3J)4+EA^vhdi+FÛ!+u߈?̞и[։/I{f᳍_^習!guL$b{bPeA~.`=/YMKU? XakB 2l#w{篮g88fOf5eJ9/g*xnysq[?BR@|h0b=NÈ0ܦPO,=JkS.(%Ұf"5Nɋ1`ŭ:4Ιx+U}'R*l؛b~RX[n$ Ѱ H <}M)Լg[Kon4Ϲdžʢ3B?͗gI% ZԣQMiW{O߭muԱЭ@Z'(#q&m3fy#CŃ8^אW-fj :NCN= ۞0yv<пzNtcT%ބ%زv¿;|)fZWKIպot@ 0 ;D?MYRceIvJ]y_&K]]J-9(Uۉe#2pWeKQ>4MwwuqW'gr}q+b <83N_*;K%פֿmWf)EEiqQK$ 1G Q!  I*ٜ̐DFQ4UӺ#CK+m!K T_[@=]B' zӹqprㇻՈ.By)oq\rv;(Ag ~d"G8`ܷ%]kbO>BQyIzo︍;7_R~-smc?w?EoSu?Y>vZi$G=+m/ ~n~jITs_w\ƽ/M0yr"uJ).bAðc>h'cdVTC'ԨK7i1OXM[QY$8իnݫb+\f`Ж^ ݰyLEܪEU ((ɤ tf`Ν 5'GcGʑq hܐRR.6;fkEh$q]Q~X %o?{W#l8L+*F 2 wN )tTtg+#4bOX=}٥HC21VDfT)>ۆ׵gXz|u'Pm_9yLX˜Kvm>JlZOQ%{:=,hOx}*BGE?>'A_L82JѦbXVKAS_#ojGOO@{z`Pww/ȺY#O>Cfb.][7g[!SnӲl<2(P.nXs?̿~Y֦?0G8i19|NM|(h܍KXGء$zZb9Lnc\++l||V]ZG~S1u>"ɹBGۉFۙkX4ST13:' lYBIsd%K A}۷zSbӅq!UI7Dl sV+lL} QݥWY/,r lx4ĎV`{]KԼ&~اB̳ >*H2줺w/)<&kW㱗bִsGه$Oz+? 5X- 9|wV{Na r17ĬkÝrQ[]xl`uX,oeƷX_aqK/Ըm~|NOv+3.1qذfPmֿ[vꗦ-;W1\1G)G-XwFvaĝ׺ 9ӹ-G{0]jdG.R[vFȻ> 14Ё~G&9yZ,ML;ء%7|pkQڛjn.Cz_^e(᪺mU#TVgfb@UC_XO뿜ެu'g'g#oYe|4f##K j*3CYI4ӤHre@Ԓ~¿o{O՘:mNomߖLŧ}}'i-ӊS>bSf,o#{Sx"/vwMm(=-<5[1clugLPF;ȩ"VNoJ'%Mf˟5j{R|Jz_2|kx)ܝnR ;Dۗ+GD|}|\[Ҥ(E#Ā %kżV0N 2`Wq>`+GvLw#́M;_p^E$b3B@8]} sQzs^?`*qa*E,p;?̠ ϛ:dr6?ecS-?%ԫƢ9#F$mDR0|ֿ[ʖo.-EN/.ՅnjOeېOrf0ȑcv~ӡq;0f#Z VjbLF\$k)LwV:-DŽ/_YgJ{I4'fX<@Fv$,i#3,avιnM8|/Ø8Os 5lI4b`Ehʓc}d.$}찪j) m ]n/JjXCYLR~޵K_QVKGzbxTK NKwFusfZ˭bg ,4v[3K1 Q.59ʉdjٸքfnk/&h„ߊo 5 NJbsh5JЩ/*xlv,y }]ۀ8hgu3k]M{tlh޳Kj [T 6"Z1͉*\Nz{e|}3`bhGO1Mn {k<.ZSY QݮqdಹI2zNΨ^ܞ)J^x$?m*B$!GrTYX6M׿EIJ1A#k{~Ul?P]&ٜ?vJu_Mz}/O"F4bbd] CcKT={[K5E-wlf+ݬF{mErA`k,y\44F&fKpZZ_ur۶ oНˆs$-;!^]Un\VBf77|i Lə*VccѧrQ<1,*UR\>&@GeO%VRU\@.Vn7p)>yLS5r2: 1}DY(;[U^fw}QVfvwD|͵/P~tJ#7hM7g)~O:SdmKfy. z'Bm ,٩G5`olգf*9yӍ{=T[ke2 Y'M,, ݷ%T{'c6Qug^=aԑ*Ǚ6U@D 4'rHB+-@ظ9A'ba}P;C@I#6EyĖ~௬~cO+˨Ajjy,ު"%5sg@#*39B[bO`:5Ό.iğV9#uHՓf+rM:]?ө){DC,Cj4́H];,,f~ЄM"YUU }yn@.F3bݺZX%i4ǥUx;0Oly9aVNO3h{Gp 2+ZC /r5C5=!۰_~4u#CMEjb.aĿ­/y*TLeW=׹{VK..L+ #('XÏ3O@lkӎ=H}z/'yW%cښ yx0F 1e?D P+(ҙC{|r̕czؑq,**Ÿ矴lKU[:C7Cz:1S+ҳ z-NxW.j\۩Ѽ ]&PCwԪ}Ԓ{=)b+הI4ΒHZ,VP[JۨƅX(%=F5*VV&=XDU(V%Zk3TU J?M:s)SX)A~ʖDG 7gO(sm ؆dc~OC>|7An3dv!k|3|Bhد3[/KjdCܱBlPE,eq`kG kKQWֆ%XL}E0ķ 2 H'Ym<êBƨ/4igZ>-CHMP6bJEKJI2pbu^ήg%?[,գ:7]dPJT)@wso}9! ~L@Ix>D6l3y96?&w v%',čD,6Ore&~5T M6RXFsI%<;ޞ3O˯--[9c5iݚ1@&JaړmŖPddRjI+<Qi໼(}o(jW4J;uC'tWrY}lUA#X@6%G4d`FR*l ;: rgÑlP~Ɲ }v;|`ra1kMK+-jbTFahqBTgֺzL+ud)-FW96J.clI"ZECnBvxQd1zY+:+Jm6܅`i{ߌLE1h Na]ˊbMHT4^s!U,u5xW1Ǐe!cG^ZB> d^-|:N9VJSw![`DX&W5(S!`A Xs8ٴH.櫋)>C<}cHNx8ѦnOS-`4)?~R5 "M͞4 ':Eq{RKVo+uQ7ʱL>.ܙ'g٦a:cKVDg)oaF#46 7mV0wrTs}8n\^''YN9Zv=3 >Jy~*jBQ=coF+Ij4PJ&_5$!r@40C0 +(򯺫}ÅY&*Iզ7wCbm-;ޖœ"I^՛IZF 1<:+N0Wt-Cҵ4yXZB{PbUۑ>~+cq{k"9$WqbNV yź)+Xz!>4]^X^Y1#BQUkbt^¶ 0'#nvl_f߮nm1w٘EiR%vXpmE 1x{.WIᓋ^Hٔ@?4:JtaI)Ԏm!+ ?Cݼ6N\܅RK]mW q*a;"fhرgauTw=&VmqZXcŝ*]Aؕ b9 ?Q{|<f )v;i=u ? u7Iqs9pv21=\gt<~JB P[qNc/ih2+-QELban@Cdz'ϷjLשuXeƝ=]3CfIǓ$t9P0~:yL| Rv,@qc:9 ÂJҲ I+a#Y `R6e@* S cC2`O_E5sFdhJXL;`%:%7u,܎J*CzEI%[vp#OZ4 HE<`(v^e4;-<ގ"dNZ$1xXai@+\Y_z dq9is&M3iaFcg_msKɝ_O|2|_˸ 8+w g9E3 .O!czΝIB'{ʠ π= >ӹfe: bz XշUg  n1m5߱θwmb6Q]:) z.{r+[?/|>*(Ƚ;~%۾Wl7_ʇ{$~?H<>?YaU'zZy6n;&- S&Dju6oU0"A!*b!;f^1aRU,~Dhb2%+pgU>+b([D'9 j) 4b^Ϩ/. G#+.ݷ !:7uMk Kg06&HT ;}CVkǍ*ZKx16;nv]ԏpDGڊTbd٬U۳u(X ̰9; =a[ Z9|0?>H^|lpIT̑XAHT*k~[b{s,bt2cKVkݿ潻^$#aFߊI$U{RwI 4.P/$vyf%I'S=m'3d?zi{NS֖Nu`>FJ:/. yF~y]Nb d5Qm0 mxPm\'_G!eaTeSv$ řvX "֡^0kޓr]"om'NkYIY6Gq`?OisL? Ck~lxŶ&i>$b< /9 c5і*b}H7;qE.Vi,/%pőNDZ݃f%8bO!Ǵ\:No쒉KԸzU}S=T +Ȩ XڗGu_RnϷnr;~[osFܷnw?[9]@Vqy!EK y] #Г߅|};>mhU,7_wsW/ ;D.ˏE?(*msK /R~k4'r?e)%x$<1$7јH)dz9RG1Md dž,x03k{U{ =.uy6;rO5  )J7%-an $sF#de AAӴc54NtA/]4?WʇE$}˯- 1bIcB+OK$Um?m)tۯEwrRC#>G 7bw򓯿W7G{g_1Z,[0?$SEIdE>UѕT\lX+vknTFMtNdB䴖ӸK`{٭#FHb RUNmL_=kDs[yN߽k2{nŸԺTg~5W76B;膯%,nQ޾;K2,`.V;o݇/mK9I?,:Fz7Oz7J>V~;}F|TQD; Y5 קnOsp64<ݛ<.UI;ۭ޶/]S׿ӽv&Ozj n)#'`Cn3c> Ģqp i"̬oumwE?'RgEU߱[~%^=÷J~{[mnv˿&r' D|7ItoJrgzI=hB+,*(thf~z3:)I#ȠZ@%B}> stream x\sg$\i2<:nL.ӑ%.J$>dKۻ\Hb'#7G_ȣ4R2ҋi0zStY4:c|Ń?uO?h*i!ÀP CNG2s ;4/ޛA.WIs+4LWi؇8,p"%s Í,γ{iͳ[L7$2YdɅ3/*S6Oc ĖIZZ$34%_tvO]yÍv ƾOom*2 }R7<2i`/_Aح|eۖto 86$ qcEZp7Ӆko$,O`1&7+Zͧc&6<-؊C nڼH 2dj3վGߏmg<.,Mjf;75ո@"*-cs7+E$A]>5S`Ro !NB$PҋF.R(;͌ e{WjLWۼXdw &}LGh2̍n.VTX \;ҧ6JyiA)6^ߛ@Gb04픻6 нpk߸r2 p-9@l#ƒK>cl 4P 8 l,ŀN=b meJ3] =6 Rɠ/952 uޣ\|SĊ*MUkCQ@z2S"kbV?`/\cR\pi(nL @ qLu#7Iʚ܈35TZ⢕1 H : sSNmdP č"XVkE85>lX974ƒlckpVs8Ep2 6|iW U2qp+:z}~Zǀ&B f&~&BE2_ CC/dgVHF5L0|՞DA+#Eΰ.+,cĺvOi"V3}#upş(_zw}BiWjIh f9 ^He]f΃PDu3oQ[fP-q#2%z#WS 787i*Q6n8|/Vi1w0⸊0i&fyVW†CH^h3r[B O5rð=t "<4D;eSp)2juVA("'EUҖr8؍F,$2[!s%lw·+,zbH=|CX!X:b M0}#T~MB_  2 0*.B&TU]mv ~aYD c4\&VvxD#bb 6KEVK{36GR[vDNjGd׻;YuD۲qClUH{vU쮝 XEUxzw֍Ǡ~Acy@%۪ʮQє"`(6C-%͒XU[h9x<%s( HDFюWʦ=`ĥnߐ40ȫRβr*CZ*N+Z>tU# %`Qoyޗ!G[}t MxodGdS$Z#_rOVa88>i'!3$d[bUi]e!ͭO羬9}ْV˶ YF%:@u _ؚղ:s D9^[BGGo8=E%G8Rgф-xjZbwpu_ Ux&$,;k?s̸Lt9߬6ˢrwq$D)b]V>; _ oQE?7iL^օT{cPݝBBFܼP,5tbG_l3W\H`c A͉QaO$8U]gf`4w21\.S'Ăg+q8}vM7ql<;!,4ݝ=)ҺӠ}Ch0g{%>x,jxQXcwA,\ ϧίNΈB27!Ud <տ @L6G#ya/x!6M 酹p*Lw3蘸B) PEqŊ[0h͏03Kr:I'8ɝWm͔e˧R^`n3Dbk+ _@/6P57J]! XyBncL۴iOs( (jKi-}?Y_>(=ʈDvRXěB*]6&<_vs)Z|]Xb'dX_-fwKzӝz5cs;i'W;*n9ƙ,$d<#Xd5*Ud+~b.yl]#F7ӥ5_..}bWdnnbNNe^cr\Y:\&~Z'ng`.(\boϏ endstream endobj 1695 0 obj << /Length 1994 /Filter /FlateDecode >> stream x[YoF~djpN$E  uP?߽H.KŢȝ734׃G fo0.=xt5  r/?^{پ?8Wy?>#{5CM5W9S>dYr>46N1]j;jU_?R>ڽdܽ܏ۤ4bѐ@nMЃd4o /, .]S{޽゚]s|/FO/sHk-DP0xp 8?%Ug<ٝ탰vX5rGw\>qVE#êx3crQ%rL[:\Z8HTOӒ|Oi.5)Sy=mSvd6",X)Zu}|@|b"B3!(73:E]>YI.p,r7nOɆND2dPbʲk yjqQO,`aTjTG}7[7}s#vu! 1jv tt8;4!ԾӬGnZw* Xu7[^g4QhBێ4!u ^25R-9VZY5cI\õӞo| :LN d;+DvXw 3mC%ጩWOK*`C$U,)y̏vV<R WӚWPzL1)^g 1 \Ҩ v+z);k:SgwJA|1y!cL)-D&>6) tR\+̉,Fd6H# (SX hw j 7 97=CaX>{;pHL)%TyjJ", 11Ցcٳqg`5KcN&M^i*E5^D] ؚ<> stream xY[OF~W*bOfwWmaKdXTX1/lj{qLTJ9>s;ԾjPp~t2Dmcm4\hvj7\&vO{tN/>]?_]|?*kvDn9;@)š|;ذ65{4} ! 0 /@&Ԅ0jˆ9/ |ד`)Ԑ2-|\/Go(̓$$E;IrV>?=R]p9mNߐ+n|V7 lQN$NrfJ_(>yz zCq;)Ho㘍fBиpQۮN+I,+Pj`ص{="em3 1{p|8V蛮9'\$X86pN,R&C~x<~m_Ț(\Q7l%JPZ`=rؾbL8ŀZ$ 3nE f6 S{QOjYjsM"}쪻qܺd[yN]|\, oeZ]~+yMpZn8e(4BđY\2[~C ^qHEqi$ zl=vs$7'V!>nS6W,O%(+/3dD `8nj9~p4NvOd`f612X(B=M+@s+T6Q0,AXLXj49+ z} nIbjp4ܴ򃞑8c8Ej3L$ >)d6 E> stream xYKsW0"FU<٫kVU} B4lO/ 2%e/"oO^_!: Bz(X#dpCI'UXQFح/O"Fe$R?^^w}T/ӏ1i@Dp#?jF{e"tqxq_܏ۼ1o<4_zBu80vޢN3N2au^狪˭?[Uf&Kj7( .re-ER":/s#%~,5HVn&<+R8|3$,+cpml2oR).a7ۉkzz! ϊMY_}[S_97=78FR ISX9UFa]vB oER/H";mq>rb@H#-IX|&!iڥpTpT|8YVh$9Eǽ3gHJ[B: HGǂ {") fe7(&9xq< xO57QnCliM0 I iƘC6<^?@qkoiȜJ9dW5dƶ@n-hM5 #AH2Jր-c7A -1 / > 9tG jm^*߯}/7>-oa+-X1"s'5ZrcD/ )D0R{ M>*ftLN fj$+"9e Rq[eؓpٳsX,rֶ~+Q1:xjEz[4xvns۸ķ -}[27\ h!2D2Cqi^T])Xnc4iwELC,1 &&_m ܛ+*-2`6=0†o2vf"[֦T$߸Vϯ\iZdZjP4K0]ghNIoz s`n,/u"#j&Sn_>_jv7+7lWIҞRM&tUus/*9rK!FRp 㗔x}ׂu'ƇG2%Lo^;T<~}mr{K!I^ CzAn㍭Ќ5C5ʩ)1i^* qFMo6PA6[a΢b@kY'ݛ 40H4"{e*{OOHO`.q-tֱajSqfHw!8;ܜ-mM~1_h5#!WGfMm&3y_әoٌbFe;sQxt*/y[slB)qbz2p۝븇vB@gf>w[fHBN-z19!->-@ PҸT Vld 'H`}E_sܣ I<_yf+G8y1мm LXS}ggeQҜ*BH6<ucqGV<Y//>>> /Length 37933 /Filter /FlateDecode >> stream xK-).G#8?QS(vujfI<ײcIB!W]ُٞRy{G~&(u\EُmB;h/j:x~K" ]طs݁<~}pPր/B>"Rtm Z|mi8N뺐B/׬ 9p]%y7ok6B> m/JCn6N}Aa P}g"Ky A - _Dm(7p>Nia jNW=}Jx1Zq 2,}mbZe=~ǩ8(({ %qo=N}$~:6XG_P*I^ԯ XkG(v*II`vH ~IZhzI^-l1hN1s9咤J2*i2mF(iN}CD˰(}$}+H8rٳ$Z$I~u ߱(w/(ߞ5r߿M@CDEP{C ^ZaxuuXSIwXa/LcT\9 Aw>e y|3v!ߣNnx^7yztm#jT8w.0&^fTzT>J=85*Pu?Xƨo}k~l v> n/УECHA0Gލ4ՊFj0hQZt* 8V3Ҳ}[%|ip6>* ihn}29JOOdZA2 i7I`F8DNT~YzT1k)uqzO'͢`9ah_E=WFIpe(#2鯵[18iR5ޠb=)w]on+4N⨴#p'hu!NyWZ˿OFt~P 6 7t  F}O J5Ů/%:UA+9>%9%Hom@E{>\kȪ4X(+lhr|"}4=`希4ז ' 5e5ќbuշAA孁ߵ#㗇u{-NIN*sUm}M8Ih8wF)شbϼ4JG89fw"x#vi)O]Y~Q}/\NJCȰ+5(h?wD]Lf J*}5I۬A.[_O:[DǤ\ ;l fqv8i2 vqY @  MMvgDž:Iv:2}6-Z#7xqb|.Sz4<,C rPgQxğL(U܈,m8dOm/ai6l\xIܶ, 3bXuagsO ̲Foc#@^,LlD>ca9NΟyg2ڢLQc]nb3K\up;N}Ǯ%o G>LA<[Bgzn [׮l_;tʈ=48d`4ȚeP^#+6}Mt>d;(El['͏K+s+B0賔5r~{­`N3n#vlӁO^76}m'm)q=>7}_r|U%E݃Y:P~Ht9N$ \ZP$)ɀ]o:\L ~?# tYPkWy?V^8vޓf{,o s>6bp))q@gIE6\85njuV(q7ǮeBwU\@aWh]Ө'q+Qs"i7`Խ)N`YgoddHWFA'=4yRۥ{ʞ[_v׻Ʒ] eK=KC )U7uݹe'Lզg֕{ndXgcX 0/+z҃ғ>\ P$J=jQ%{O t0Jh%9 1 ]Bb($^4B'?+JFu/9?`zyTۋ~]Oa+b[VM8?NL? ŗFϹ35h!fuNH>0䟦& ^VK{D$;UjX;  RoӛmuOs$E'88'g5 D#MhO{77hd:(͵㞗HaTw'8"C'O<hsN\Jr:wWTt&V39ht6q|jمp[Jp$#׈j̖佥F4nFKP6l3deQURM *4FrBh qBPMJ ]bTӻ? )٢QU6O2 {V]CA]*7VrB9W^Ƒz>ĀF (A$>Qw|͋OyU>o6#bmb,aW4.h'0O-ܿ 1-=3H\{޽ mʑ;Eky"țb"oNu&/p;53cQ֓'p@H `l_:,`402dc=Gi4ٴ.ӚŽ``mqZ8iDoU`mlhJma`qm7r@ٝM,q0rHϏӴU_u%e6or0hA#3aF߷7 >z@I Jn^&vSd8Ru.s ~:es(eO3= Za+,hmg!7o^$#z!wplha볙nu>? .UJ6A*)&-(Q+:jf[:]3?1:b[l"8IRG1YS|i1vZ̵0r-aK@I B=R{?t*kd[!]s% K4V==>dNKo"> zGotM^rȜAoꍽJ7L܃;"OSsur(} '>̰Q+Ckڿg;mt$KyAsi>O1b@ekSry'N*(ׯrDy)rh~i|Hoh 퉬lҡ͆xH^Q)al*Џڈ#)}.dX2 &G儳ʾE_' trxܫd5Fr9uzu=1r+LG/"UERg~H*E7Yk_?ndԨDuIV&_ `Ria:n<]/lcN*1-: >e(fjA +'PaHb6TPIX_5 ҞrZUC#l̴S)Ma**&iNOō-QK:׃MXlm6Rt=jW.'pz3OtȁO8k.r 1KtʓmàA]lRzE*IYD@~F=ՂaO:Lq ""8+J>}]m -FJv'P"buv;Q=!;m]0mxZoܦouwg{OU66! ꃟTmA݆]sE9xqܤ(F܎`V>Bv՞̵{*)',< 8H ։/XZ;%G5MdWod_-es3<ٔuTsjwX~+U 7\@뇹/t'Ji،SUY8x \BDLzi/*zvG8|k;#6k\5WvY(y樵~*jS$J\~l^zO/R~?d +F^[x"c#voM$]&;-1NkP#o(xga :i@VGZeqqΖ&k\5,N8͝iV}jXfVPsvT>* @[Zwޥ(jonI430DeBjY M;f Lpm= nDZBܖ)޿SR:t름C2Y~ ۍJHveGo_:L)[D٪7 /fF6H(򰶃̧0茉& ?h6)l (`CO'uo; 9iũh7Mhi}dz1tS^pe>r& 0aARk[1>nc_0b&&e+L f)P<3(`0CL n kXh0a:)> ||~D ;{T1x0f'! f; +ǙnDBCj'|\jq/\%uGLTQ>z'}Nmԏ[46$=U5;tOUfT!fxrGpGKiItȢF76zS `' x Փ˞/k?diSi){iwW |lZK?bl?ˋTCDPbcO8?G"~BB"B bﮜi?p=9|H FX蓧]@9R`n=sȾhiiT0'Py=$2NN I}#S:lMOZZޔ5:T]9J>,KrBb0[AniJJQXΛr DJ蒄9ERb j7WhCfPcRuPU 攴dcX]0KU4{^[j" ٝi9.JG Qrz{?%qS6-մƕut), P=_2ZЬwM::8L!05T6 [W(5y|hFOZ*ypN^yqn_܂9C͎w,^)t7X4$!Pf}R\#ѱW5]XY^٭>x Xaer(whܞ&wJ I/Nչ(VF?'f"E? u,.y;f2l3JAM;6NwiQ|y+/l1@]½ 6qmY7Pկב؆͖Oq4_i,ILO-(t%x]*zrPjl\BOԼR? lrJ v'i"ͩX96 bmJZS+7MʊuW=yk";``~R~TB:3i?2U(`;Ci A-F? Z'`ʕOU+` GS=*㝕,Cz%gT 8=>bKpCn8NY_yض8 AwNa+=(Ż4bOﯼZu_own=r%ܰq)|bJtw{FwHY +^yo,fЇ|'ĤJ"4f-=ta\†<: GMIJ8M~_>r`,3Bi ,E>P#O  +VJ9(. Kvr k׷γBrĚ]'cf ˥~đ` B#U4H؁^zfvSy GKƨeSªŞ*fW,1&@e׀YHDfj 2-bp.M 합H:gk ,BA( |r}8E|PKhqRŅlg>GHvCB~|FÜRj#kn5Zkߵ"Y_P@N[eNCo5@>R;\䚨~!NmEA6 xQ3NpM)D*0 ]oz`+pUhJt{_*4?+NGtq\ak2cu;-iA1ӡspzu<k8t!*8oWQ|iΘN% NGt"l݃$ ~ID0+cȰRu(ȡnNFSlw W0盆;'/.Hki4 ìKBp<qɊV^L & ]0`7fV w> KhCNl1R%*V╅oWv?']itý A) w\^.>N?rZܒ $F..bo{*OM?Rj)^V }' 3]lh 镘Q[Ƣ=Ɏ[>5w:M9MDn:\>tɀWDr}(j;O֬}*] tQ!0]Dq"Ȋ˪!(]u (H2@TtDʹoinyTh٠?LRqNG^Tbvه1 xuf#GF*1 Q=СxQZQȮRPr1T .hLTq"Af ϠFdUD6o2c@R_B(&"0?wl O2],\Ȅ8ċTU3G/~2,˲KFߥB 44;J rP߯ >^#i N ].S}Ux!QQv!@6##}\GRnK (r2Yqw:_ܜ[f˹ PJ+o!R6CǛB+%EBS:>հ<# U*`cSظ6xplatd:P`-8r/ϿG҈s1qpC1F;m=Jֲ&._7==Gm=x+Z #8̸8$Pp{{˼茭1#S.sF ;?yM\lul }Q~I_wZzcNkåA8jSTJ$@gRU("6d#4wWw_6-h>oeE t.\:/oiie=xoBH [_; Xm>vw,7"=peC^Oyu&բ}oa;_7kBG7k-@+V'#D\32J5WsZ6q:8TqTs}2B2rGj'=m3闽#b_=sd/o[|y_f}T nCc蹈qսҵ6Jcpvj~>,e;W+^q=D[Dk.Y޳wK,az?푘z]1 )2_oWhZ |̣l5U=s*A-2lc_vVzrZVfPbm } ܫ/9AS4r_)GbEy/=B/;]O3Zrs3[4ʹQ~C3_=i%˫4CDZjokѣ bX h HEB?QW:iK/ ofE]њr,&P3!`B*lzO. ;h}jۂ',Z7Xȗ>ZuɮT~f U4B&4Z|!-._/p\^P{ONۥNMWoCBO#ﳣہW}Cw':Z0@/ί[ɵ_gX2l~LJ$+3C) /ei()iIo# .z}v\)m&+LO3VhI(OEcV@<92S%7 =>D+PwF$$Uts.% P i AGIDGq B tW`M->?3H_i b$I@ƕZrZba޹LÇ}H7>[D\F}>ͱVTe%u=ॅ]&k0a/vsa翤L-i|&* U\pgvu PXNo܋]lY*Di7ho}f&K4YH • Z4r?<N *za !%~oЩ${e#8@XEPi_wus(=rSh'0>9"Q %E}{D_( ή/BӬB4oH'^cDt7]zجu ~N"5Ty|рƏ$^a;6~tzR~<6q:fıٿQ=|Bwow ~I7>!c >$a_q2I_쇐{n0-:!I^QP' ZO; b@ii%fy=1 &݌zgqRl( b+BTs,-8qFKbi!q w!^QEeFKfm=*9 _ rs]"(|e[ ˪@Xx'6[n/Q ~|%u[ekʰ*/$/@3=mXG>¥&51BkIUbZ]`}t= ~;Pv:& '/<{e0B3m\_6TQ{&(қ(~ͫs v[Ixo Cjb>`oNTj /zXon(`^d*hMyJ؍t|/0~|es_Yv;2> } 4Ϯ)D>olX/\|gZ\`SAMPTnS[ lqe%%8( ,oi2A _R%lZIH.bg/ÞCIA^T(=ye֜/,B6AzF9$9Tp64ӂn:=:kOv~+@UreNY~8/ $b/ zKmع0oa5g}"$$*w] "WkQ*\{A.#i*_d %0 X8Lڈ⒗S%Kuv."H{Q!Pi7cMa0|!S]ZK.UǍ<$ajqɂp8&z.]^6}jךT7Cދ`pEU#XP$ g TieËc@ ? kNuY( 7'3 P yjN'W%'(ɫܥhp7/-fݫz8*"-%c0lͫ3ѧZQWkO! ka}Hpā!AóxHZD(H~>p腞eU&FI@F{ACÝ&&$x CK} W8bs;BpxAcBKSS00?;C/)UV8D OG9)[ eI`Ax utЉ*ÁaPKJV"iѳ O8z8=Sr Ym=5>v.{TۻN=`4QˢדkG O_-KZ_fwcB]@@/xT=e2s^yw/8է@DٜE9<V!Ut-;I8fwESDo{T 4(l;B>l}bXD ќ6-.}cBy_hytT$VIPӂEPhu2j#ȝ3[kڦ&wS@^98W~2Vwyp_:gkN!4n>Vsd+ 2q7R nwl9Ok#ګNH5hix#/]W +^b40Ľ'U`f(&>P*ڒ6 lUJI^0L+)$s'e]f="& Lv8,"92^ ƔM 1$ƈ®4,!q|B1[4A6Gp?~n;&P$Ѱ])B\hwjZ$}0p-K2Id'Yzq{gGk*.'gffc+bb أSu\|=T6sa h2tdDx}n;HzkU7mdPBq!nM|=(q _#PߴuQ5gQat1*oAv}qFV.έ^p5WP2?Sa"xAG3 d0i3ךU=;1;QrߐtZ۽N&v"u ~'ɾCqleh߫Cp [luZNraY vn/{koTy\C5 S֚PM /? )x'ţ< D=y{I8.]_ ʽ}M8YUȱGs()&~FO\3B$N OL2lV袙\ (z,|fGqJz}P4S(^wf)Psbju4׷Ô̊h,cOߤHRAxd+),WCJ.>ҦKpQvjFЂG3!ܣh B7HR$/Xr^PGf\>l0у!)f3*H EI!M8f 3khZ)nl\"z]Jx@8%O~0`>\?0:gIe7ڗn/`_ #їPi$5-@Kn~wUO 7MQ@E^{өUWr.ޜ;,+iQ4(y\ ʲA)8{QԠN~GAQ>l+\^/#DM;ddAyAu΃YAnS1SmwMc9ZUh$)K0PW ][n wC]; ʶAзl@2첇nh@22NHeҴʔePdJT,5ܦhGCy*֕Z穦Q8GUA-5 d+GEk-L+*׳;78Ӧ&̢R1b[MS$W\nP5~eeо?F&6NUP78 @l^J T;mfv(AE_)g,3\k42|gum8lc(1 &QTDhk~$R@c%9'~̌w8oє塈<^n0;G>?[[4BΌb24i!vCGF~pB;M08sqsO8J$gt-ZZjz>})Wkka6"rxO b!O _zP.7Kz(&u΂(&xl |lD(aCgƁ"8:B( ;)w$lEfpc7]w-J! NE&>"&0f6x wQ%ؾ_Up#@y>t'fs%!b9.~켢+}>s)Ιfdљ{4 >>H]mZ_"`lOY @]t%t>tmȣξFbUE#JZ^،Z ܒrykO)Ӿry/m9}"M\Vf,$A&QE8m)m$M$2,[sD]kNaKE";6RۮNmW ) Z!"zp M=$9]sa,D?E͵msԽGa"im1qtWSI Pp@b,8>wXn wg׽"FZhç5V(ވq(IjuLeh)ѐ{mim)/-)_1H];|M4Z=1bꢗڵ %_K6v?(_z> wC|CK8 mV`Rk]`D`h ah;*00y_Ǻm߮uDvőd 1| Nk*q #$-Z!=r-ΰ˸kc Ha8<u@itiD0K+>:Mo,9>_}A +TRv[YM8kr㐨J%Wͱ?k,O^^"(r?'VFqzqYtV`2Ca/iCR63>q] pdڧݶV C l lf,8u8RefJލ]jɷwDKۊa+ҏݥ%h5oa`~G1I!+~{̾:*@W:8M/h\( €uB!^LjrZPNsֱ6D祗0D'":ɆDa6n,a-T`3xv3{: 9bJuX8hKg9-δy>YW\'A<9j-fE?J (/q\п%GɈRüÛE-NfR"UkKXGդYo#SW\r*i;xntJ&NB| YqoXn BOu8>ntF=g)SZ0u A~;5p 4y8O?RN=o{Xٱ ?3 靖Bk,?1PK<ʴ,t!(OC!s|{*VîpQ].5qux?F8 t$X,)LtCaM3;ASYd U}H`m ]@~<*Ȁ"Mmφ6eN.fM*im`=뷭 LXm0dΘoF7SO-^6eΰ(f`HM)霎VXRKhT:\ *IBw 胆EsRm)vKegO']MiN> !=[V^_TUUrb \YgXI9~T@VbP:0grhZ9T| _*q;= WvÓq'[7ɇű:2VR1vυ3siSuZs-V|{k닳?i8}AFIF p*GN C)>z⫓+Md`vWv|,3@yLU_6b ظx7a0i Ӧ by?)mQ*Qa\Y"ubl'_0%AQJ<|0ҏ}UVFhWXxT`K%ugWo%PnPܦ0bnKJ=_Wʃ W~\/ X0kt'az_qFE"cOU{6&oRv|t[ŝ%x,eKR M ;- B}K 1(:2%`q(h;7,M}5Y3lH2Ҫ/BY m+Xe:h*)+?^[6R0Utn,|BĢ\h/I>Y,EeRQX(^x'S :oiϚ\/ P`BmpXoh+h,}Lh 8O԰6hhD?$ciO ;L. 5Oֈayg{Do#_s?!zN 2va7kΰ(%]# W jBݜSl.tCJ695#g u) 1Ii&fLM R0ŢM"æBx(RHU Ή;V)UM!TZ7 j6;Pl*W#جii4X#9n8mp:=qs\pbAԏM_iGƧL4{]bc֛^ Ԥw meܮȩvJOR }Ӊw"Wx>aq-)E~ȱ;|9!ht-r}>.4Rn1.<`\rƃ&& << HANj=Ib&/> g,I>Gl -XF>!#m'(8K֯Mì0[^| BldZt mN0C.^DŹ3쏮6'fg6zJ$˯E E u|S1h.=M9뱆`6{xLCɢIM/ R3b$8/]㰯{3)I37M8ʛ<J). 6OCRgC(܋X5b7Of$@zsE3]q7B ʇ=ј˜-muA#Pzƅ< E3ő1zQb 3V/1ɌPB3L0瀞*5p٢˧pqE|UxHxJ`hcbB؉+6Vߟ|Q7lgHK7ͥ4x4EvpX~>ޜ |2"'(Ƶ)4괷VqM(yy/ |)ÖPRqWB_}a|0 (XI(7t44>"u7mjHe|#Q?+m5mJզ >>?U|G^qS:NY7'zp7TIɗ9?A К>N_Dʵ?xeN敤IDb1r>%dw۶;C$*{Ӯ~C ^vވ:86Q]%rF_-py'X8NAZ "o+ҢH*Np̚aiM[ţ,Zu6\jF=/a韋Dqqrx~ҠNEDYt0aEZ 'YmlN(EC^ޛ&l )thλ~k/*M9ޟPRǐKON,QKHVug`-I$ULlTKwTC.@O blL)tI+Ѱ z-0ub#X8T>}pvp, {話8F,q= cY@ÐNc|nGie*[7H:Hè+}G}_}S&2LExJAA'">3`O_bf Po{iH \ԖQǭ?g*5f*~}?@mH)6*`0[>x .EOkP@Jf":咼 {D%(Ծd>eo4nXԔc0R*T$u ŖVN|N)DI**8D. A•A[i@_ySf Rzt F 'Ek<+ݤ",\l范V  ?2*8e9fM)ڴ24 %zaX6^tYP'$q ,OWA/OiDPG4\w371Xb>DUuPE|K.yU8k(~\0{am/RHݙ]eX=;P]{]Y2H!4lĶu@H|Q_5n/~tX<]),Pbc Oˏ/-{Wx=;*v#19tyxҠWm=?&2\~8I=Q7<|6Z5韗S 4"5 JjR`:a'Qb!_>!ZKl%l3诳3ޟ-i%ȋ8Hjm[-@62[<ԎqM),f`U~NP'-j]@ ɴu~\%0k2Tkh+MKO5Gօ+ϺCTR␯m1πHml!5qH-;۹ceGg0¶v v41=CDD'̣|cvk1"}g(Om6(429LP>09@tB04GM_\ݱ'8 >Gl v.! 5ivpC' 394 i G<~JYՓmޓP+#ک0MOq WV{qK=qɷA%,Up_#Dx#<جU ro%&5x^ow 䂁 k&xKML/ҵ+i/,}2OX~9vP^| G}c{!T\hdn 4׆t cKB(it!L$}Q:.H+̊Me W84Yބo&D/n(<, (tzfwޥRJ!2@Ê8N> =ke3a qlS8,? 5O+zA|xh.o?&8J = cñ#JSތ[5С'KnXD->1nQ_" 6&nN( CԨP! 6b$Uc9eP`=$#PU3d 3vA̓ yBlu:@|LOyͱ Inp(X̒u <Bp [1$'c(:4]?uz:,Oѹf3E/ р%StYG&++| :K,qBCGnP{KV5.zo`AEoe4VxQP$'2V(c'4Q!2ˤ˴"*17ң=Q]y yGKh!1YM$b 7w``*Y$rf<<+-B~ÐK )Rzt@S!*sU iE =&Y~}^oEDIL?AMeJo_-a2i5Ǩy-/c$FaBp_; -AYexL 8@lb0 8AHe 5ol(Y(~9gnpL(inL'\͑3swϦ6.kFL(?̳X86C5*TOa] +6 [4L¾LP.Xe|Y6 br\Zdc㺕 Ð ,& g~zƫ .( Â2̘a|s N>sq}8u׋x\5xN=>#ǮoQ" yqo=*%~9?M -C1;>NPBFh1괏Ѕ9}L VeU`tL\{u#Ot{m=n7N΢,7I' ]#?30 M-lPl׶sC/$A u EO.uI*y/B=w;,olxv/`+ao yI-DPZO}R"nEsAkwyWȈ>]qmԸ1aj>''Ւ9M5dç>Hϑ[ʓE↑Vo{Z|&(rꍀӷ. [2Pl* ʨqclZ[o|KA8VMxtF'zf$|S0ц:JF-Abj{^JJ' U.t!T@$´<}~& g߿MBϫah+mެ-ߔqegJ"&*`)7R'd{Dg2 򡒨s(vʗ3]U\yAaFvr#**/,\)D,һRس-sWugZ޷G[}Yb)3,Z9}hd.d#\hڈWo$%I Pz @*_ꞃQ~~=XRYBSm'X@&x)p7^6bv;}aYIUឍzԴ/bq㠼(9a  Byˡs*+rIG+6 9p1E]u_J̮ 4m]״C ^7dCG |F1,Va^+*+*й&k=_TuW࿦RX>j_6r'cMu$;pÚrgϕு}~Y첚UW^37/KHqk J#Qݕ߶Y]DW,x(6s2{k;`t-jEn.qw6i;#t}7Qa`O\ 9Og D3sU4z[Kޮ D}sΥ3u :[m`;5٣f3 !?dl"2[OP o +"-ڴ&J/*(ܼ$EMBTf H|!`<0rpe%ezۼcXҌ^zk|.b{&^\6CJЮzmYb ԝ}W-ìfPgXBbVVnL2p`vifue+JT-~pP\wa\ry0owD_SSW;"|#֤YNu=Iz(5ᷕ rA D:T"U[Y Oz\m  , t'rQ'>{ |{ADos!#?hU(Rk^ F@m,^tE&>W"Ink!ȓUl1##:Y`ʩYdnnDWσ:),f nxY˗a&Bqp&O2pPV|`9 ӷw%8h7رT3-e@Cx}IZ]WI8= 1^:W"eg]DZ𢷛#`n~@ނP>Gwvyh9এuyED,GBIѶxaL@>|8h/;%Dٍܭr, Xc9pѭ+ߡrxQ`򄦉EzY]PHISIE#ӲbHk;㗜آ@7ݮa+-s?_+x܋Dj)! !'|HmXHl F)FA:a?4J0 {r?$h ;#X޾H̺[h.u8!V,O ~8thZPdJ{7뱴@В͵kAM3BEMw{^dnAw]4^'4Eb+yN3۰=97S۳eUULN4hd2 1){Kh(+6/2 E[WLihi+ƭ?]kᓇ7w9O¬æf rXsr RౕQJѐC0~M9ljz44ǠrcR3E)q& sR %g<()M.GF(`?pXr,! evM}5{Z?T4s׈#DȳyNk~}VEy[*@Tʴr}E Ċ΢Aq-~WwuLCH u#- fQ&A(S΅X;M79R[HaoxsպnOT gֳNmL%%c!O)!(\/[MIډ`\NKͫ0)+_X{.S%E4B ,[U> LsMDJwtL#uYP ;p ƅO0؎bucr\8-TXB#UjIl<22Vk2xMOQV G5SȮ_e&m>C [Wuc :!7ؓ[.-BIfe8(HL *!4g`E#v@Isue SxҏmW.v6iWCCǧ.%Ju!/ %gJ$Ҿy.֛",yku>H1Yd||IpFPd:mrwStS/[7+~gPp'E-&ÇF.ΉQV760ͳpv@7gHNGsXx3OE9dZJ(sA% Ɣ.rLB@L:eR7LCeܷkO/? ':$b[ ˷ Q(NLMK3l_ s pk7ф RmsdGn梋pBxY2 u~*YEva[9 mE =sӒA+ ' VYgŞA;%(@Swj sx^ވ C;Um[6HFN'ŮW@=V̗CHk2ӛtS1B7y ,bZ3o-wͷ14ĉy%nJl^BMYhmIFj>xyFl@ h(qpP)8in,'iiml*Ig+mtU. v 3!S$Dhu_ߴ8( AʭD%SJfaME="l+ߍ֤M }Ke"JsW%z J>iPoqwHaƝPv;P-FD@ۏΩpLI/PrQ#u:I[66/PXQK8EjH$_O^\uL}"Bw= 7]x҆A@>G?m ~I҂܊C" 2lsz .'Ix/ּi6ڼؕ#ڮ *aGqM`ߗ ѩ&jn&DY:ZdP\+Lۊ (Kp2raX%!gG rӌTw'BBofֽCx֎U*D֎\Fi/M~?X-v uꐛ3+11<L&`/&kT_Bdt$ȝ rFeٓQFYrT}1v9 Gb-y.oR! 9MYFn,U*w2?QO/SU}}H͝bss4ݭb[uP!'TYjme%}g6Z~ (mRAYAQ= YOZ>|>AX7>==xos#Q-Ռ! $vrW3 l.lmXF5o*Q%Kz3gmuՙ_V,7X?ُϿGiH tm6)dQfZ&Rٗ"j/$SDXح(PnnaֽlbV!+hkJ-Lwkn4tuUڒuZmބ:۱(>:ʐ@J9iRzWy}dJ6~wn@ @ַ=*PZCߏY Rg2?teZY v#~1MG;_1.8؝qD0|ִ g(SVO(jG\̫iV>EE/ߜ.}{ee!9 Ix ^(z⠋39lcJ+#ä7WRTʯtɕ좘$n9;i;m(Au[C5}K T1'r'vjQza-/&{ I$Qg4OE}KfoM IM~l[kz,ru$h b;ƭ]j,XlHm1jtp/ST)d/zB ť sKC>ypm˄9A"i'JuΘRa(hT*:ܝZآiBEXj?tL̂PR~*~(ޓFF8W pM1q! ]HD ƤA8vi\$i?6PݓknG` ojsdߵP"# `w A*V ˅WRG msE(i!;({˾_Ɏ jLY.@BSoĖ7M"v]߻D=ˤ5KyzU N1eJ*w. ΰmu#♘a|8!T@F풐|p\x,O\\ĐT<.htCrԻw Q*&ya* +j_Z,kLb8NHe| Rv4et䛨k]Mlvࢦ%4DvT8[p1zl_ڞ9lUfD)+6lȃG(Aπeϳϳdy"_I`٢#T2QnH'lFխfgy.t&vx?nfub@bof0vLJH3)Eop$l32o 1qIǝD\0T8ab_ѺQn^ ͝@aʪ*1!kΣnTR2ۿܝjn*Z-Ic_0#,!tYcG6]Ǜ)GUI#7A\لuamд8B t5tdqYFʲsbf[9ReX= ^KeB3xhb.B*'~zAAFK%XoڊyZ^hN '4ӢB0Zv6jqBs@֗мI٢pkY[T\`n""_Gj+K)VH.\W=y{m=t!js䌓{`f"WP(Au OG)ZXEt{0,+4 [ DީW}ܿ] 岬| 6a\)~H|K_N;TQNޖ!< Yk1/MňB;₈*qS8I6y&M~E_FqrucZq=ъ+eJY"GO(UHQlnO=;4!Dd '} 8ar0by8y\"ms}@ev#j3vR}s-UNմ8僟uF(# "s jؓFu}|Ğ"$?S\R`P`}hdx,ÍI%&JZuM{Ynt@WO@V/uVNnٔTK˘sȈI< !ZPB_-ofPILDj9#6I ^M.hE,4ykOyB<\dph hP\ȿ]H*-nRb|m|  9؉\* EJ bpI Y,%i,ҩ+!I{ > {?q7L (}ڀYNhn6+e%:.M.3皀${Pv͆hx rgx͋ g2 XoО/r;]n`mo;qK }#~6=S-6>6=Lⵄ8!`EU ll+ԅ.*0vJds!UY~ D;yX(ULSLZͱِEa,BQ=V])W U^KS-H`?W8QRil]\u;@RL04x Wu+*3c,QpYscy8ʪm]C$۠ۉ4v P=٢Lܜ@mJnNOJb[VAzfq=d@ ՟J)]\$_!ctHCFj_hu6 FVY(%z_E8(?9UCR~SB6Dp)M1Ԫ++,}h9ڢFjyLBQ#wsvR[4t=M~ O `}3/-kC>цm`e?f #ދ7߹5!M_-<`%"4kb]ʢa^nP l>A%DӖLGu5]KlF5\H@[.eJb`,hۏ0<\ suŋ]$c&ʏp/;Rv(qujp9^BFymL|])B* ;\_FLnJ nCML5_yB~8' 8W<7ē\e.d#@V:{1m/\R; %;;vB RNLl<9#Q23Q"DJkzyׁ.G d%_X|XJFlvxT=B.,w׌y"˫^H". ϐS3F'ck\THfh"8w=Cnzh:qɗ @N :ƭIY>a aDIߤƀUː»$?I2UO˷[t~p5k2֓- 0Pҗu:A'C(p/6 xpE 3dcrjj}z10Ͻ5L펝d-Z^cZb[vbjA ZXm Sh4*஖@"-kbrkX%JlLbَ 'cWv[ח[jQ%!snExViQn5-d,._7J1Q3h?S%RYeԃL}_krUCЗ2dl=oP6UĆ)&Z6I/rru~-&c"ֲQbҋ*m E9/e!!PO7zj pnݭl,Ln=$R%R`/pYnXL.jj<`˿S4.`_UB][f]bA Vf"B2QheuZp-1pv${yڎ|Si=V7"&f) }KX5-C暡quq]َs5r@dzsnX̑mnߜˆ1ˆzzQ^),xK= .ZoB9zc(3\â"L)\VCfvR3ɇ8A(C]E3ǂ9zdpHqmh{Xu+ŬG憠7mNkl︘m -^[46_^ΧrhKho~WjnDA^'@pM[oZ^&%o(*:qwŷQ2nHPɷQT#lF!Ǝ,Z>v,XyLw:ui{EELdM*kr?Hη!:Z8΋*ЙoS1rAHgx 孺KlM[V %sP٩+e}L9溧3sW DR~T_?UNJqc^#qD҄6ǞYS~~?kԇ9 S]P] S] QYD_`Pg~,}0WIjcP3.iȉ9B'x(L[f[ZCIy)tmyNCyNPyN]yNjy$;DGg9{93SUcǟL 1վw?9gbw7YaV,+Wf|2\YyxAcl̾^`$yf'5uQaj#ߚl5ylF)맱\*RND4\k$iӹij3ЫkG[kşg>)9}?y|u9Dof4Dx]R˄ kX&2(2_ޒk}oK-t;` !ߚ%h"Zr.8iNSW2PR}'- >񭩾zIcn=̻5x~-聵x:"uԀ=UOxԃ`%NX={̋BއF[n[<ŏ,đ\,Ls/-KK1nymW1%wωr?VΉjpNU BOځ{Yğrz'rΉ?sNU1Lȉ?}"2g;F- Ƭpz9d9=f?KeXQE?99ʋ߾s΋sXU&nRY[͜>9\ev >>> /Length 45697 /Filter /FlateDecode >> stream x}[%nE8ߏn v#s osBLL???ӟ_ۼYigϏ}Bm$@!uh~V A-|A XuӠ ~b_Akݕv_ . W@AePUP JasL+N@>JkٓHx%DZ%>N lג[.dG H#Dا:k=jFzoUa[T^tkѠp\ZWV}Aٷ=ı~qH [_{Qsڿ{]P lN/˰id3 C>8TYhK>z\(XG_P*E^ү8{=BvBfB+z\$1fPKC!U x)EEX_h5 eHUt:2-d)%19ZA/=_H/_ԢLg^yp\FqäxtE)zunn[~z *;$йELcV6P-^رg90FT_TLuy^01ѹ wkPqy2]K=a$^FT:T 0J8k4f(llc6@ijuz1[:P*[#hhFe /У)y_N3ɿXpeMRKvAp0@ń9M#}f#icI7cḐ&fc66<30&_mM51‘ӌ (ڽӇè߅ߥ7zMgg_.Jy9r e b /ls+5Od#Ms4u_2_Yƴ:yfG(8WzbU$APnc<cc-:6ͳA?S-O ~)Q͈K>WAzդ^Z~U;I8r3Up"i<ψ(F_>:#ʾhdDsjaIF.R}q|܆x-hs^f4zș>qZ sZ/,iP-"w䞑V#foB $}=gCF9m#,9/ytfTZ$)* 8ۍuXQha~ȣM}³TI0WT7*V-ܠ9ܿnӬQ dܻ|66~s l{y PQ"1,m,O։F0d^LvYg)Vz&tV1?BΤ 6݈BIG6n'd)c&z7z5PdAs_b QaeVbiO4 ŐD /}l"m؎=˧7G/O.4u9ґ2*V?2hF]mTfLKy@]7 c8p6\"cvReKD?Iq!M^8AMȬ#U2cK0nxyE]?:&dP_ŒwN-kF/SC9\ F&` 5:dcYo^_v%# oAP`݋8{p ("]jsnш~Yvwҕ=nr8 { 0)[&Et>Jg!8MmW ھHQ{hr${hmptn&Mk,;Gm> sg\S~B`ovM ah)?rq08Y4vIwLϊcy>sz"o3)h%{k]eT֕pٰm zK~w"XmlZ%!박/gm8woiX _lQ`*>S&[W?/w_&cM`vt-`ҭ42 z˓zI*6^G[? u].Ҩi9jˋ)(DEpXRP@YUlO>A6]PIOaK0U^&O粁I^`9']M-zx[ ,aFT,a"l$h͹68-&im'@%%&`sڳ4ڵT+>{1D% J7}^&_V@7]k/SN羿Q/AFa#'L*fR6_F~1lu6n2E `Eؕ' 4\=)>>LtY>u&=&(J2|PA͐ ML`UՓJuh$qG͐7E鼃[wn1SDy vumS\ۺBh |n#:<NTꛪ,m+-j8m'iVhwbo1(ޞA+{׹Ҡa#t#fLd*#lq  A6`wű={C9r0 <4 Jۢ-=qvifG7ۗFۯ3IC"bK8i { fLx(]3 zDK74XD~$iC5|i6%VL}gC/zC APs9FjM "lmu(3 |N{ wJFQZ~h!V/$dĀe%q I2C2`[> y$,ٓtcΜcܣp#7iYy5;G,EaN:d F-RЦ{76{ej<1Z5 @Gy eİJݡvse-6+ϡ] GX@ l4ͺj񲂬RxΠT )EQ0E2 c?c"( r8l1uv{`${[Vv >Yu4 y- ֵY#ijE\۞&Dc,kBҜiIJX ):Ǘ3&0jeFCAlpff FGDq߿+v%?PX9*+b* t7k'<2Ё[-s^:.S䕏2uONVm ٷΡ1U&(!&XV1!x-"6,٩#;ܓ}((Z@"l̓؄};tb6`a\ƽ'uǎGfs k~i/M$4(c9:‘j9̔,:H+<0<2>Uؒ1MzW.VM +T-'?Uckಋ|YA1Lx) gH0W 2ȶ-4D6ХTY̅=c18$acTM~gAuJ*(o6`/ V'qe1$4Wӧiݥ.ccSo6eCaޙxn*5]f!GO88JGgg wmg:x11omۤi@r e,GK&IƆI2z/Bk;)#clOٵceu :^1;c ڱ;]]Y4/}څP m!yKc雄7}_f.G ~z , <"HIm%p\箿T&B=p) L4,zE7 w?.-inQgrQᬫJ%uf9 -OyuPFظe.KH<; uVvcD@i';(E h6}Khldǯ5;!W#眳[f؛ +k<,"9$mP؍c{$KZv;tF{+b2: .DhX!8ǀ6H!vd,(4~?/0k9$CK6r:9y28QTr8 <4@(A7ڏ 60`)yBBQcjS=7cO"oAa;p~Rۯy 4Pݧh֡ਉ_Cj+`d'e$kZW*Vݢ⹭ jJXz!ӠljvۈvԊ__SAߗfbl=wV.m91VEfKZ\~v&yWo/U%]#sk%"!p Bez+TUW xTyq!\ϛdq=Ley=:E֢d*i#(oqW>FvbRea-u{l8k0&~L^%rJ%HRhj)>l=Vܴ0L*(9tbZmjޯ_fٽ%G`~t`,)e %s*g^2H&czC#Y3>(lí΅Bm/ϠJh"™{R>?W?'P b@ch^9mbqVeMa۠Q]Z9/8פ7Y%,  s⁳T]osN6WJ}ZD:gqZքJrea Y8"[IT`{y `a}ǀ;p%j9CҍN~u0Ns0IeU ыZi1wXZ҃$6$eQi/PsTAw g}8|Mcmŏ zޑ\^$Ó-Q0jtk ,]aUt1*UGsj(:@H[P۷W `DNH 2sp#nڳY0Gܿ0-%I¨]$$w35CA){)p=A޲]Z%-~I͙e,VҡAh8;ixe WoՍ际R7(&٢ $Demϑh P{m/5dpJpO a`{|BqV44WqK /}`aP'F٠N۸Jn\j,O?Iav L8yⱵҿN+ш":9 1Mn:ܴ{wr*}n ;ŦՃrcGΟޫfwT-,F!7] H42| 7@[浴]IMu=F,2@-:f-F Ƀ޾j P T{g&h#"nB-A=bsj}Tge.( -D>ʯm]Enr]Zbpm'ю#XE Rz*X8B*/rCɌ<g h X rG.fi68Ud7[J}QQL6|%۔|zBeʎ!@tF{lV>D9=QH mY@ @nݎrVmO?\ѧEGA|d]C x/-5ƤhYTu۱4gj,Y d ,q/x|@VBC-O5^VF ~Kuq To3=m>h J j7"V)_F5WS02F흒g?LJ2xmO%W:OiS7I*[bV.lmĕfslXeWs$$x=v)k,ҒM9s|_$t ԯb'}n{+ DZgX۞cq Pix< U7z;Y-*ےt]<R_>b aSɜӿj6aArd{|4gc%; {wjVg[&̧EkIt#kw﬩_O ZPЛ}U}zgtzSx6Gk%ZrhMn >H` IS#L9{t[?un覎DKaBQU}~d*"$KɊNu:G5/JKޅ($v_\]H|;v4Ha _crJKSЏXF-tQ__3\ҜomYif "YY#bḚiw^J/#ʡ{<~ǚD}Oi#t4|r6>(A80/FIrC7<pq>3RٕPhDٓ[.dPO|<*)H)O$`)é%V: {m8- ]dEzEPL1_v㢎fBَHSU^#hC/xsM+5ݥ\K3$EWGDVIxt ;a6zZQOqqVT=jP:io@P?f(Ba\E*BFXDt?12;(e@R̴|z)yD3-=\v9\ۦNvUœ筗ӛ`h]JV9dHZ`+@wJ7H2/G_vq_BĢk1;N]w?A•z˩S 7TPmhi.SdK|؞6!ڍ`zQW{Jrf h;A&1y:EKb\@璠Ŵ~cnlc-Կd5jc~QQb0NB%WMUn 0^\`$NPf{Md$ *FiٛN.s9?@Pl8h"߬4?0USdF59 /A@6-w V_yVv-˭XV Jkl8HBr@( ː0-w R$ۑ ]Vvټ^aT]2Z-9);'4ݤ|Q,Bv+_xҸadNP#D,F)5f9"4 PGPa2"]*0Z4u ux]++aqߗc=<>Iuu^~}4q<!QC(6lEXIZM זr.4kbe+'ꂨ+(B$ o>aa^<3)9I8 0΂YZh,s֬\Kt1C热U?X_, F#^` K[~Q0m HHGn2|873k^n={O9`i46CTN߉v\/*.>IAm[|~aݸ8bn;Cg*BEk=԰U;IEx2`K^y%-6:X3OyF |R=éqA6((DUl%PKaAxN_bZVN[#82O1Dbn;<6wh`&iNUkGgOIJ;R݉66Y t6|/[n~p|:u7y3xzH}RD%!29Wc {ɱa^3(>!"n% U!i>E9c INB6Mg$ ' /w&*˭vBi)R͋|ɀj3wDH}mr8j%; Au(qAPOPpI{Pщn"$c 孡$JApA4e+OXB[vȘmgHtdS IN<_k˷jK5{ F@ٮux`d5l9RYS1h( HAihrTn\5#M}r֜"-̩@D⣈ @#k%f) b!3 p (co& pփ8?vWR~3Yqhp%2JqRQ@?/ZW$tia-PXzX1dJ  u+Gjqop[-'jѱ}B`Ͻ ^1Q< A=bGbF5U^Zg?^dU[Dy# ⹾R|F~qqoqq A ?ʽ~_Ƚujb{HRؐb/u;a(؜xs;ء/RhɿkG9FJUpHH5({"I%|/,"6Rd#>N;k.AqH_DKy&/CC!_ M*iI5D riQnKik_Pgivs=r#t{l1F~˞hQi`3w5ţ},]F7_2G*kνFF.v|E}֯u08^1dd[9hQ~Y筇rlL9K[V˨.%bH(?pTZR50ES|GwUcnM@[$@-}5s"ʄ mi#e0_d־Io1 bT%1&UQzrZP~ۺmVy%w+fe¬+v5C.P(͝TahCh򅴴ǫVruryBmW.fv9}k[t\51^0m6ߝHϻDjA$iMj~Qì @ByIuYcZ3!7E2heuOͮUO _li#i_uhQK%u*Z٨q籙jy-4.Z"@R|t;W\KEP eu#vAآ~&mJw6vB @Y#AePe6[(_eZJZb+^}!҉[ha[DhRAm{"9JbZJkq_*_S /v!ȴ XgUWx!w(\h壝Z_ދ][ltX* [mt>f}%w[Z,9Bp{C/Bbv]zN.qZE%yT]$Tx)*J'FD0z %Y__Y힩YfmÒy#:{aV eD8x#s-SnPmY:S<`l(tLErKV2cX yJ%!s8Rwnw?N-Jl)~lc3fCA/VP+_>v!I"v*ESy76}A/_vVȽ=*`b_Y<60"// ^J-RbQUlPiqSSL%*#Ű#[jⓁ_rL #V/ z" E(>rn8 E1> h٬(cwPKYNRb<*X;xKpfX݀8k%\8 kaR~+]O;YX_U$X>܆ukeYaV UVZ#i6IM뱜\)Wm;R_09Zb(:N`XѳeD} @4ܽQ{DGOBaUj?^Z<6u0;<.NZX{޶Y7plaSP?JWjz`$wjnWķe m \R]v8Ro5yK^4X;'=eĒ#˥q,jrR֠7Z=,]cc%ٳuMurKd*>> + {wٶ!vha뭎Dtxh"qD@6=/ PЖEqvuG|ZPk\_I-/p |u<4z)c'0\i[e]tk{Q `ꮔP1~˗8J W8rݫ2Jyy֞zo\Yd68Ro1ziox_X +&r}B D5R^Au<+ x{[+,.=A$: k@8QA/dU 2,eE`k~MZ gh0yK\cA[Ud]  O%x%fxʮB!W4>$SV(JkWEQ Y{t c?njͰ" j?zuTd"Ô'6fKuݜk:3SzRf \BI@\i.Q+sf%_*RPRy9Ђ>R*~تP-dGYך`>րRP1g?JGD0mGUd_*, ~/ؽ{җ!-5cyR>g턎D k0YJ80'CĮP t93(y6)a+६,d_0U(-ERZi%>DpWvڼh>v+豂 ꥒW u:*[XCM $_"`lkޮ)O %au{(?t[(Gp$E[3e0/֖-]iCŏ},B_̑9@ `F,!^`M5cr?E·&6h_s| {$H3YGW{"Y=%b@ *DwV@|Sv K@ XEɢZ[l4nL ю۱{\3q]Ǹ[G߭IBX@SǏ=]ĆHڞmKm$]DUg_sy(MR"<ѬP,Ȭ EEBoySpNUQ#0ۢٓ(xNwjr _-?M"Y3G*J^4~as՜8d0"/N3t uȑ~ Wv?V? vpS{:M1T|kv$Y 2o>,J+i*76TNwxdVX(:/*Md+K#[Xp[;EnZЭ 2T] K}<{)69y;pۯYDMNq;tj' K_GqV~r'Cu)U3"*ш_CsCk9SgRB9%Τp hHch_T8IW7QlPRZڡ,"!o[5c")6z"m RZ!g( r.P=6Iv"u"E/stLaI+ ,{2sA=UV@IyDҐԗZe0NH)v'BzB^Z-9'm]s -;i,ݓfgmȝ~AV^% DKߥ6"ڢE,U:`WO<9Fs~JӪT!B+C;Q`w $$u>l \@J:Cdɞ>8cdQ:s3z"T.tT'uaIG_1_ަ Cvkr8Gȃ!j߉O q6"71q~&~w,}Q9Ԙ-S>hrݤ Ut^`5+DpESRGxP/C'İ1l'jD]'\LWOY̴~QM*s$&V̷dI-̶\]࿂{g5Hcu| 1XKp'L79$G%;$+GTshūo><#֏4 `.lJ^$c#+ykꢧR Jܥ`r\Zk:'/XS/NA4z9:1K\sS@m"e fs0]BkHȘU-c3R9f^ ko(`;Yh`^?5&ΰI?Dr6A}zPUB4핉|i[A(z"WPʬG+k&)5 U&G6^?{Wnz2yGx MOu$NR0I9GQtz6LFgX-<l'l_Axek약;bj |.]Ӆ[._e=D |B ;|#oL#nvo- l'fWxӠW.?L(&Z:oG=6o5vLn ƣZun*#PLΔ> Sv.LDFًߝͨ=A{LsԟoQ“sP&O`x!i;, dFg]## JW3pF??Z C(z(7ߠ^6Zk KNR0 `^0׃PE!GC蠎m\¿hUڀOǽפ-3yr'?qNBGlggש8/^l[Jұ 8HcdFI {ZINRXcpI~|[L lBѿ.vcm-v"}8'>H QBb_HDB % n§_Bk*"m]wDn2=m$qb{Tgte%׹" N7.M5B(}T"jx@"!'" 'Y8Ih ==.wA@DK8@hd( A_Hi`_'(*FN;6b„5M)(1gS4qU:æ)MU\t~Y1)u.Nz[cGgx؜ JBoOvql3#Öx { DXYwljUℷ,jfX(i-`/9\5,;ONQ\mGDF9ROi |n#m6rg ǚ57_i>?տ F"lw>)[y[*QKRNZr3ՖZa2t, kt,@wEe'6]ru2<{QE?:\;Ӱuɓ6QS [>uSPkڥbHXOIOa;%We۹%@HbK QaN%|w@BU|-|K٢8%O"'kA`[wFW^eAfg437?h#K}鬻 c$/=Zۃ9x2ΐc'J c}MO=[IM6 %L ʿkن%ER^aױDRB8cf{mG07 |u1)]5tvΝaKc#s2 ^5r^ v5oBOYvvF?}b !rz^|%?Nf1׎7+_X1ǫi(E>F}h^I(K0A֖#uSߎCen2.Vqֺ5l (Ƨ>Z[!ԻQؽP>b] #L[cزn["/eMG96;BHi[435WJwlE>#BEkvN Y( QLl>(3M7xRμe }b ` ߧV1j2N6x'ۣxN6L{zwN=^uʋ}9=o:k!K Z`{q|_p|mE잵PC[8]iY)gϊ-c!\0[JE־E6N|YcĬL3A)MщѪqql[q/P*( VȜ]+gIEtBZPݽ{%pGhFꬥSt-Eˋ:zA>cO78,@x .]SNpɄ!譯2Y>~z; D<۴:U':)L݆[^1 C 9~ymV?'\)N@qPz'fqFV=,=?@m/.Y< ~eު J*{MRqMP=ڻ62j/IF_'wj+G/ϲ5ڢlOld~I۲`wTb{}W)P!ۿʷ_p}_7ٞ ۉnú[ dZUvϗ6/ K'A%r3Ha[, w߂ w| p5*3AjS_LWQFFh/ axe-P8/-eiR 7Wsv7jϴqx#a "c|")Hoh NZٷ v|ԯgf9=k&0g9ԎT+FAyrظk_2.g5ؼpI|jK4OIBO4 H(=K( ]Puۜ#Y 6G^3UW(3' yÕ*uqnؽP$N]:oA F MfCDXSԹ}YJ$//<@4zcF P |' . &"FF&VB%_Q}G/IO=V2utMm}HA P֓oUkU-Vl!iS3j%fgy{iad2=jmPLޏl< O96]*Wp*wK\jP丧?.%v|O6Vmr[;(Axf M=? y<7Oٵ ԿصNpa-O\HŽ"( P ")ZA/sX=<~]!\F+i.lcFhj`6"3'%Ǵ]q%[$pqa(HQCts@~F0# K;cWE UtOn1i{KgS-"@_7%N𚐡HuuJ{}“5^|Ќ岯],y f#PR=czc3^S?8fah,#w ?Ph]hKpTe >py!Ո4v ^_ K|BMRHje{c Nf*V+~- -dקVN[-ҩNYg^X3C]gPkǢ"lpAcβ BR/}{˞w'VdJYG& (JrH{I xy/'S_J|Nb^z /uz :^T$r[~]33#G $Qw@p6N:= M,;^~ C_}5Jrhr^ncc`&+VL<=*j=3uaSg-kr3Z _̌˛uHS@bI>"oK[I0RmV{AZS_!6KHyâX%39=EgR:۱4C'8" 1$չ #f;,nD?Ew09O ȧd (%! dB:I|9pEND *LKјIbV{ƌ"iF C-HDcu,,F7 IxFyppP]u1p\vcQ;JЇJ#Je ~&&=OaaF;ꘛHկF*_ǰWT/%#kYi!@QFBz= + (#=F\B"B,9%jֶ&@uA۠DyBks # s;_d۠0K`zYC V n`&Z-fEk% DC5&Ih2Xq/e@U C]ʸ8ʓCD_Y/U kPR%Gቕ]d+c{>W;ᄰ Dt`!rlu=i5.;2nIn3i!2.`AnjgL4&H;Fd{?gh0Y"m WؗA@ "yl0,Q &ƝV[PUWYaH<ӥj+GuhxO$E鱥%ҫqS[[e\&Zot |ETXZkdLiU㓄(RkD[FfCOb İSQJ6=Zdٖ'륡c1l4j%^&7^i`fEAUWm+mD0x gX&"5o#.LIdago{ jՀ!` J:j5~9#cyxMzJS.Ұjz  : !/+\ta+Cd}: -w tU9,0AIIw0NB vZv3҅(k,#~lG Lm_wYbƬ<3ii!2R za-- 5AQR +o[x5 ̞}E dfNw֋՟wmؚښn`:Ghu~zq7d I,\{딙lkoߺMEn;#:+*\Dǣm:|znnEtwrS@2|J{!xv&a9;<ĸPGAnmTJr&>jw!y/ :}4vew$@virgU=K :g=KB}Ӏ\h-Uu6'6C*)2|fR[Y$ڻWvAgCwK 'XiIʞZeRqVyObz~ibΚW}Xz+L.{dEaMQyF{πXcLwTD螐J$w;ւjGSR:~r942-%RZnʷ̄cHelAHQP|YnmmWDfʃ%Xñإ=oWgS?3}TQ>9Fh˳X`O%O CL'(@ܳDatx%JYi?~DRIյ&Ač'@癑cDE5+[='\"ݏ`\k]%3Ti9w?ϓ]+ v528|7jIZ9JQbTZ_]~tk2Kf47AOfV>3,8ñkU0coaMnѮ͖O-_b` x#ޞ֡'h_V)!jwrV)-VKIlFz3]m/I `,/ R#m=*|[2UT_3s6[\;O!@N2x0b:X󎪒Riw,{(Rt$#Z&Sa$ƯX r:KOa׮ZW-mL"BoUYX )EM8y.00?l^EWp Yz󐶨T!3gTfu,.Z`xLx [Uee Uu/ڭuH1!2LZ$!B _TL][`W_n5 ^/W D(үuH WKpu8|Z*9v鈖)6S*Ρh!CWIO_-lY)kԃ1rI1k]`lƋh,B@u2 {l퍕>AGDꚫ\?6p6$Z #GAGR7ZS"3n|ڎۆ~(L)PZ5' ؞Qtl p,D,# |c w-8ڏ{=8> Rm>(~)g 5-2tR%mR=œ!̼WϚ{Ed(m텪A'3&T SG9VGPV)Wh{Gk!(%,⾳Eg +_&1n(du\lk쥂@N0 )X U3=N&Ȅ1bv"a( rL }XΘKMa&:1 D(bG; D(2RKÉ[iW;Ww5IDѸbfO! x9,^r"}'h߂PE 9L)Yl_zvwrkz؝Dtu2 1Ji{AmθHHTac";ڱ{1(LLs1Mfa4bgdWA:ZYC4':KVΉ.CrnS#CTkyӧ-O<jSyXM 4=ҧœ".S adt\kyȫqV#ҐumqnFƊCsz̙ Qh\Ρi6(ˋvУxnV@V@ R/ Zg$kl`t'N M?f'5 '^jd\N9jFʧjB S4VmHC6BZ) @!(<d|"ہ  ̾2 $Vɜ' ח+(̨~_~YCS A&CPXPxl5D$Wv7I41\aAa͏rfoa>Za__uRJwloc5 UsNqGY; 4F<#L?>1[N ZJspPs@6V®i-{Up`2!Dr\6Ko u7o݃/>,T$Kõ+yp0C\i4t;[8m<-5-yFH|M8#z+/=nȳ;Bu% ^x/o( KMCpCogKa⿮株,Ҫ>rRE&}X0#P]jJ J:D1VS,Ps4n TaJawVd,CZIu_#B"'l_RSծ(|4\ UV8,mR,Z^opfTUfUk[ZJ(ezsK^ W3zP+;GVøO+Az+/}^i=^hD2)nUJu B=ip{|xbgqt!XwP`g8wm! J|C> GQHlS,Z>j]lQ9lto䘗{lzI!}A7K 6'f6*અjc!b.戽 ᶜ&;W ЯIѧXeA9qgvFRή;IջXQe{/FK/K2B!.ɏ#͊nqe@C}tsUU(9 >vs[i;DU=䜱ڴJ*l@^᫱ &:,uۊ 51 tOjf3KrBBVfpj*y/r"e;gzޒ0-p1pKü!viPy=Q:y= tGyD]$-[uע&35`xzQi{Y f:7 Rh+r8ozsǠYT=;_/<|Fr5<ۓ{r tTyC0 [JBIH}63g(c ؋@c>Vo{FV@U*x&upY&֧@s USjb)UlI; (\-pvy2_xt:ǢnPo:@[wQBa਀[/)t=|K] 1C :FFo%Az63LO,ؼ/;*:q;y;Rh6cbZj>$ɛH 1[FܗaI+DGb'4oBxyUG!=H5J ' 4GyhF!}h1 }Q7B{Lؿ =ʕɔm& 9K*40Б .H}}-TД-*U桦8bG4 L#Es"=a3{ /&'?T{b. g<FV$xz@\b|0`3 0ߣ0'2 (6jDVB#:'T%eF *o0 Ь]Ѐ;VSU@ҙJڭM>敜 -KuS % kP#JZ|v׺,LQD;;g^^pj:bU"Pt۟"d"(JNѿ JSTDZ>E}ر{3Y3Z$ݜQXVz/?k+o/s# <զQb8+?9AAAKU0Hm+]aД{u W\ov] ^t2RyĐ9{Z1?@l 045KTU~?o1VT %i hҰ<#jT$oȾTιBZ9=o@D:qÿT%PiW}.F!sx[M?r*`CddYi!Հ*ůf:>N,4װ#7y*5%L>mvIf1Y+tQF3٭'wQ/Fcnc Pm^#>8iUH.ٱȠrg}E(Ԉk[mf3b?B=fyXb\Eor4L%oй1K$G|a";~0g%rPINu@L3g\ӊ'FNڣdvbu҃J)c=֫&&])LVX U߆ 5pRl⁒҈Ry_)Et{)RcH/95Y!.#e5m%tKE|ۧmWހz"*iq;T4mdZ Q&5}tݣ:*%Y+:|3R +-ǔ@0uaެq}? 2@ }>l@' qԆe;8g킿P(Um|!U-# ^F F]d .q6ŲY(G8]qif.amb{j{l:o&i G <܃ug`zB|Ǚ Ӕ0Q …@f6f3d2/{yUXn/!|y#6A@۠wFpI%{GܪX O}Wx΄ck$ǨCûouOjEs9)lڊo,eVmS=CTN?Y* 0mG$` 5x#!J=m$6o"~1W̹ BUz, {[#HHdu!ߴu?7.m~{8)Vm'I'hwhyqʬrܕ)X^`񘌶mI V5i:XK\ͧ30Ͽa0" {*=OS:EI D$<[4Yu.%E Y|C9f ҉FHH2/yCQH5b(IKMRj&6{. )eZ vHD}z PaSp|+4:f|7Ә%g%f/q' `GYU|L VOhkV߃睂=)5Qg]AEW.]|S ֢ܛ Q? ^L!ʢFȓ9鬢:,F>?߫_ZƢZ 6zN7 2VL0_9Slcϓ1"(P1wnDUKێ9ޫ9`i91TmŽz|M),W,ZjaqPކ$ m%IB.] fs(`dpf)3=c]̮g_Fgö XIh^ geM45v a¬NF^b:]PgrUkĂMC'csU?]dԌBLsXf: -O:'tqW?ByMst0w֠STkX@aZ0: FDOK-@}F2~RFӧ/i?9 t88j߱:(p(=N ^HR~ؑ]#~] 5S?S@}W[b>vڹwi Y-f ;;rA. `(@lH xk+ |zzGk dL>|!3cZ%I:1 ;bqWKX"\_"aGQ_qr&lܧLHc P ԓQ{Ra{ڼVpkbkBs- Bԋ}rNa9 t]U_8 <޿اAoٜs"xC(%"䨊P bD$P@; PC˶Yb24+Zv{ZBT8KvG3<2fCԭ !UhY vWteP-EMu R$G)LtNNS6vO)43_bV#Q˳{.zT{}wt8.池礇m*4N8t) =ȺmEB 2yhk \.c s{9 O)pH0 Ihy;k%b?=@bM=<\e f-mN(hlrh_l'VW+ݰ$>CX}2'?,?G,U,&bLc(P@Mb]!@>@2CHȠ=)" :6, FeP0M\ުafs*zdj&TҀfef&;Z7Hm2Y1t{1 ?h3QMj/r#-=|Y"JbD*'j|Ԁ\AHG쿪Ө`]rZ6'ZE{HF|c>(yXu,dmfI`A)˂Lp ''D;MӍYQʯۊ^CKbĠĈ EgRCwM&b5mU/V$d~3>Qº@yR0@Yte3ٳ:/KY^hn}ϊ0ROMb2.\R_m< !??m{]A~: ±!HX{H?`qkzeEK9lIr8vl@'h$u!3%WLrneTqZf/qZ, =8ħ􁆨wh?,5 #hwMS gmƙ5,pN!^)Ʊi,Т cm-2jqtfTc6-2#\9P$josQ0[xor>!mH,.gfi̻1評@#u9.ϡ+OIƀD4v>6?cdLT2@ f ;01h+d>1;ȣ Kn$ժcQ#[2@Հk 0RW<UB BV/I*F5Gv 穲!ذ Df^# _LpB~C^ =q"Cx|u3'/O<]=gw^o4c1sM]4;O+1m L41/|yllVBxCS4Аc;I#ɞ͞'z( ԦH@_$)H^蚷XIgd ]FNhhjzws? 8.0tW0OtxQnCq΁%}ur@bWv6%g=bvpL L`#UJJjO Y}K-TrP)<:~[V֕X?fМIB2 (n7,V샦CsN)ŚTBoPU^"$&5.3@TI^ѮŮP*/Nh{޴R|Zh J#6P1󜌻߷_f+aOy 4s#[`* oW .Q:D$QI72=[|QU41-'վ4AB?tSUE"1wS_ШO䁫-@h |VδOe/K[(|Z .Le\n6Cae`%i" p?[=H 2דxvݼ5|{;jI@!QlI8Q_/?Mb0`͹1#lK iּV$9kn@˃#[0h!L%BFnJH*ؓOk+z>np';I,N'R>1v(u |qr3k䮄w@IFӑ{joCvbBG'\6%om*sOF+8#b܋ZL!6 ŴwB4Hn>-Ūc7a%BaM>=kAUʹ),E-0#b3 so,lXco~`6D1AӼ~n!^qncmoڳ2dbu26镭?]6;8)lc5 `Lc5.z嶬ail4l9E#)[Ȳ9N[;CU#7*z%Y4. d7z($ء8`#n q 9T[6@PNQ,%("LٰV9l[Y!r2i n%R6 ԫRK1B;- 21Ȥ|8xU!xcvX/o,1HV ^n~?Or"F#.OϭV(;0ěOː899 G]9R5p5 ,s^`CFB92ޱ@:J9j,p/0l>m 0}3,Dږ`58H{F`ӽ*Ǎ0J --Y.eA.95O!f[b|+*@hI虏LFXHq ҼV%2j7;JX:uQGq68޽G@ҽpn& )?usӮ*_Pq~5iM2 _"ac> -r|>LYK c,2sHP*$\!'QHbDB?=PPǮ UP,]ۑ)LZ{Y^}8 XK ,@X, =~; 1g LmX"a׼]SK=7Rc<sĐuOg1\*n3a;9$ ,d/ckC$&fWt16_- 3JBXE-r\f6mDmUq;UV9 hy,~* >2UZ\k8$/3Zb(n. /ݰađR͛-e?~UwBdsPsc*j0x,ˈ2;4qMd@ǜpM pVqn9J#(|2Õpn\( 0 P D[{e-muiy@w?cǃl; FM<.v^Rբ '\nPZ=@CU϶ mQ|YE_%# @_{_eoۉә)R"_ h'~wHYQ-$~&ywxӔ=7SrY{(֢ [&,|*Sx*ߘ"_ ~YEb݊\IN-Zs.$'}Y%+V\}lm%a:ԶF>i9:v֩Gst?(x^5 "g*]Xkf>U>צP7of82fnČTkmm(yO3(ksx.]Lq:ᱹ+ `u~m^/06]N~ũRd0 oe |ոEPӒȩ;yևD<t!b[{#Z|.zc)'(,(N/ĐK AE-"<:M!kJ(:q*/:w|:g 6!F|g6ql 5ZzI, /E+t]{ r } ~Gs=:޸ Ϳ#{/[ḨX8c:ƣЇu}q( {xnjU>@n{8c{$,D7w1ŋ'H}=(h~,8M*}R-Dʚؕ) Kk>ȱjͺʵFg'w) 1T_٣ܧKʭe7U My\L9JtkACI ,P i-jD9_45CJ@MoD9:F_"]DÐ %pGFbw&?-%Z>V qHLe<"ĨYu7dYE߮vϑ]q%-?KWi{H=[G&dO\eV`'XuXy+P-y ?@>$!$MGwI:M'f L!DSb6t˜hNR`%vVQ$3cFhLaLW -zexqnZ*I0g (N衯^n}=p?hGֽС< FgLXUc`Z;uɱs"Z|؟&UzVkcTfuC_zN)y%v d V2l⾨|R[PtBn'tz8PU<$l㶥SuN&ùڥ(AsrPHRg'_BZcD;b%Pn:*/ഛb|0Hsc1J\5t?]C\ZHQMt##WʱL)}CTC#(x D* 'K. FhS=Sg:2_;}p..[tĊmB f;G!aHPVC# S@RPMeIny"X RT po].\R@a,k Kcp\EwDK7vQS64X1{C<PcOJ)r [)1R7V>9NzyZ*Y,;p5y #Ӯw6!tNѰ*T2;.NO5Y5kO;ulVZ;I [9r~"DR Pƒ?iEN)Sۊ·ufԈNt5tN@؈(R 5F[ǚO7a4ylb@YahBOB+`#25$hIpP6h/2AѧKa$ 7떻͏1"Ww"B?4~sh01W0?ms<-48qٻY;{f `]n$ p˲0v Du.)$ ^zU'DXJTR&^Z)L^5pȣXr38Rr4BFuߩ?N!ٔzn4fuQPةI@DˍTx ]&irmЍK:c: nvG z۾HV$FU:rKv7>q -)2ЫD>`Jl$[6Ƭo6I)DF(ae#vp ׈Lv>6D ̼pf^C^%>cղH?N2!7=FT AO#J-o"|J8"Ƌad (؜1Ah [Ɩ.Yb˫Sy4K鉷! ov'9 ajk WnOQ1LnXƋ'Yrqo/1!>eҵfݚRՉ (II릠jjaeNf2M<0%2C}TH_ %JXP9A+MI=e"@(eЀ\CN}85&g4lazrԳ[lYg_Fn4ۅHuGٞw7ȑTfXpEUI$' PZ7|r%HαّdZxGe9NfnRGHHZ" rrʎݦWZYc悩4*d577Ϲ,iP& t:c@zDh$x.Du}7嬤JG/4#YtRJBS ӭ8X.)^m@CP` {¼8og2 4K"+P%J7A(AYҩ~zA]i)7|ɴP*BHזNP#~Y @MEJ+V"Y碋<8sh%6%SWՎJK|EmHo:?6z}P~@1WC`K}DDNU jDbw {miX.mb%e\s%Z.0RNR֜w#-T h7w\F&0Վ%FD1tܙ!la[H o ;depQw5,xҏHXG48u󃳱ż" #8Ub:5աʒQ eZA^1X4WT  ;NI17y,Z 2TG% HER|Y{눉 #^vl/BլSKwَε8̂SZX O 1!' NUsyR.2:W0*b? Z!kE'NwFރ!TJ ]<B뗱 @!{;\Ñ!C,zeDݝ!-q-8J(vH]&<[l<?tot3P^V`\;q=z45c<z~?AWg:azl\% Hy r3ZXP0wt_b)DI)ad{xmYERr .BVCF3^{\6Ke> y^)%,ֱ e(,h+@8:aaH_lCkoL, Y6!x 0@x|j*䥉РqPa,9P[uȲqE!L;mz8yYX; 'A f-\muhl+6v8;@7cuc,9(C般W.fA:b|J`ydҟ'>\%5PȕVM"r -LPI\^f%P@\.li:cNN)Z؃-nBFKCM^L7`?r5VƦmWel%i ii1-D_>b+q+gCro5jZ~fƁdL?Ec d:+j's9%`^$WRF2x*H~gg_:P<`M-dS=&ɧwاbj0@( 0V뤈fCdfyDj^^*Dz'KYy"~BݳhCjۤAFbD2oy 䑳]Zb.5 M8V?#Zn8/xp9(sFu+(:$oMtG5z &_yLڍtԤv %ߊ3c`]Z~%c#6X:WD//kk5rʿD˼ e:Ex&] zStʖmltOsZg)\ `D~v%QĥU:?$Ai(J-"PM@&c 6g\˪50 +7I#i'Gmk*a7PlkD=%-UHYrl)H"<_[+ŕf+PB3bd,X|mq `S4|96V 8N6Wg(qG &YRKE^棕khMITySLN̽=dn73Oo +اm]-bh]/%Θtd%s.@ , .J3љYĠ5htK>·oaeG2 -9W+X\68^%LIfҴ6#x$\/R55%>uݮr)}A-zso?S%dDw(C{Q+d>7p3_O /_/|a _Oc/ ~9֚|Xk_/;ֺ^k|yҏ*_^c3o8LoطǾP/tq__r/!'*b(+3?pJ`Ki=GHyck/CO?bjˉUV+sm?s km?r`U.sZ,g?O܁oM~zp;p>>rT>QkC= IW^ g~6їɴ%#vo+|} l ZmշPa/ }l`AcT =;Q2$W˗>һٻ;vm^*ˣWm,*^{%Gq/: mݵYm*YVxNzͻckwv?o~cr~>.(EO~`OVePmVmk/v(g}s]}~mh""[4LT/~N{n{'v*.i)g®o-=f*۪ᖼmچFsEg]1Lj$mVԷi}[yVn? Y endstream endobj 1704 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/tempmuonde.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1716 0 R /BBox [0 0 420 420] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1717 0 R >>>> /Length 50081 /Filter /FlateDecode >> stream x}K:ݼVQ+hKt%m[p8{'=Ae & A]c??۶mr]ٶcv}{;~|{X~k^?~.׃.iO o_/[GbKC/_N'k1v}-;VG!crpK1e{aVt {OZk] (+A>c}O}La5T? sEzۻg[Ǖ4Ȏ!3E!Ӱ80 @ñ,?X;a- 0Ǥ#a(;8xZ]H*V,($HE&QIڈdx)|c1u \ < b7}Ml Xav&oL}ϲ }aiNl%y'XRQ@P#36! HXbH!b,Рw73/i*uw0[T 60-N\nKA\/qXp@>t$r/׵b|;ۋ 悥rDGڙx⦶ωta{F "m`95H2y/QLP@Yҙod D&sٮܜұr>v,>@ ".rm0;>a#n2;+َ5A=h}Zw "wSV5{:t؂Əpf3YNf>rN;FM}.~u< UtXCAv j4+&XF-Sxdgq ;<Q+{|r#}P.tN$Ĉg"3fuMlg{ 3v:/EgQCܒ>#ezVPu!d"&=@9cf rv*!m2usWjL8+u\E:wܻE;] m2a0g겭~>IJ6uOz;& *ǀU!ma9/}PX<0SO[_>pB8wjF n>@!JXٖY[Ȫ>ǀuljZFa+U-Uj)5L! b=Q 7k_l ؗBaT M,Q[p&}Rk$oNX)K~^#;ead^#ִ]p S[ !R@JWݏh>gVca4ˑ ̼QXޟTh4ƞ=X[XQ{QBXΉ<>l\'ȉ1tH& `Aj b7R vtN3l8j&eMl܍ɼuEoϣzCB xfaI `pďq{, g_^k HT,+Vbr嵗Wr!EʪSV2Z]-K^9V N,?ҿX]`H &(j>['p{ex3nα$Xg!t ~X+4"]DyDJ}jޗe`glxgݘ[{/]}}4gXO?ݽ9$Y5ǎ#@}!p%ޝd،v.: ]ɻ {r`)+ԓ24ڀ6kP5~{3M[G5 vϑ2so^\6B?^5~RL$S/#J$U+pE,+a6(O)_ :;i뿇2{H L42=ϑ}%lu+v@S aVup ̰nR.ɗ*+ܑf5* X@]oA+(%-gI50@j6]<*3E *ðMϛG OpL2'cҩuJST)`Ѥd-TkުK7VQ_yzR(_@Ff˵e]?m7*D]} :ZІE(.(QLݙj"/p  |.:4HIR2` 18 }A*QpTWP'&+w=L!; w H%goDbK)BUO2 V).FuZ)ML}NJ3p6<5^\Sn`EGH7cp] Bɔ7ASS.0=[oA'vIc;~!^XԴhIؼOr0C+lШ-DBN, ۻmeHSSmxPG>y^t$غN.Y\dyå)aiO }X6#+ o Fy*E\:5wPɫP&@}ZmK t~w`l-B*T@1R#hn_V ¾UX/>'XX΂eΆ ;uħwv9$D+Ɂ BIRyDd•*֓$7 GW+R0Q=hNjdX߻W=%6\<#feQ_pX-5DM}l/eT17E=6t{:yz w>%|rC5Q5P"Hmy@ |(R׏*J`/Pb%s T~zB- +jUۿ9YD' SKIﳋP Ұ<)Q1wyCBTe)'uSa\gkuDhMj{#vkv!EZM ю)Vc@ }-)X>׈q{/ܚ O2`h+uvN-D5qԈ^Bfڿ@g%#t :jD?y%BgA> 9_$ٶj. It$2')>}*& PKE)tj1{7N>ihq~Gb DIV`>"/{OշJ!bqws,@VOndj̳uLFn\C~։ z5s2Q\3]Yr܍G RY LV#`U'3tj3N}~~b;:ZĒio RW; Xo*^61a-`1u0MnR, h9L^PZ!f,nbƶe0flXr> 9'@dNNОӼ70vq%) -K-ߠ8$r5F4xkb"<\lZXJ!b5qsJ< RE}$`_d7 u`bUa⃤GFk+¯g҈ HUb_I$.KJbQZJdQ S>bb+_u4yby"5c3q4 7# c+K7pNp8UU!#[l.{p}EqK{wE哏o}S]3ѫA)yӻKcEډ^6XA2k I2ۙ 9ɚ4A&4K s옽A^)'#p/T> R6`m7ػ,X۫Gcd{[N4uxE^Bꄂ)|F.=S{LcמX.cz)I1>(@`|NsqRIϟ`\ԝ/nM.Y:NUM:N=sCvO."=gHE-GfVFOv{ѲgF IwjpJ NEkG7WJ ͷ'ÒZ.bSJ(ֵaCa 7Rd]n) UD"FWۘv|mab<٨$M\G \Gj&/x[˥V264?~hH莙/YX%I囿z':R؄%1ؾZ{;ƖQ?I=|[KR^6[Vi1O+{:"{ɬorg9A3d ϺJA2ms6-6$Ҙ|HO'{,ReIɸu~~Gom@^N̅ Jr CXc?E{b}ߎh L~T/M;2b(<D'*\ (Y:BbjUX&-Rѯp]K}Bo*) ch@Ɩ֏X܇~4;M'4kϔ"֬82*CI lVUnjT̠= Ghv1hME~w BÙLq_`Ndeh3YjV(ghD9%\3uer5Tߤ_5+lYߎX Ki5 |7I=Rѥ!QPkPYU+D6~"0 h L&ŠYAe= d~}.a+$hp~~s/Q:#hF 0NtF3+pJ׭?K hJ1R \|aMXHlFA݄ΙHF׀u|VO`׫MniZbA5 qbi.vbuCV;=aH#0R2q#O49kOn'񋶣F2d*{lr `2Et_X-$Lh#Ø;DAƁa[4 -;C[W_\}^N)g yQte*[yђ7+QfqZ" vU30=`*;XʱCk 2`Q:Yt/%OC7J8ͲQX,}*ӫP PΠZz/T{9 H6KA,qf.jEi5ȹPއ6 ? (' PX%m<^=i Cdj7iHvUXC5\d3) t7@@h4o]` gSL!@ok͟UiGh/ #qsdNh.::G E7}X[+jÒ XMGKMqdlO{ٝ֗glm+ZqF(a;tF~tm vo]u0Jn]Cܯv \ d)SHr4` ~ 2Goe_3j^8<_W:1c]h[=(7>^*i`o7PV)x~l d&ٟUܔyMiuvyAV i6Pfx\qi~` f{_ %.)8d]v\8 @!vPq.OjVd Ӿc{p%QiK^ռmgF<Bb^4blp٧͖PuX|-o8黕Zpz<>oy\hn@SF,% Tw;1}i UG!w'6"fdPZ:u)fljRW⿐oB-?)6C~'V>7<\ht*v|任'u67:R(=\1ѣGc[tZxe !1+Z潓u@߷sWpj#VQZdV$絧Ě\I~x~_{PB7osл= @x6 |F0ݗuOpyQЋvBa/ b5ۖ:0*|ͩ:Ht*c YPNlPa 2cH&F ˶Rg$JVJ;S.Gଔ`LBS P{- i9OM6DQ3jܦ".k/m͍W:( {X3T6f|9կUlK^CF-R+;*ӣ#Vؚ@ Y>Db,D aa;!*sYU XGqyؔB9kсZ=@U Zjr'Ė;x̀Y $N $nStS#3=} "$GAlѢ} E༱cd텀j#խ%f( [p?n!`9F`DN Ʀ-v'g$cBlG0(j ñe`ɰkZC`ceAE/ C/pdϽچMlpHʢD d?N[.e7bn:uqK& ֫{=qqƥp{x{˷Xg=i6 OMYW=a)Sbs6oG =rA| FO&n(G@Y]<ĞP_Q ~rQ|bp5Ǜϰt* L=aJ ,emf0ϏteG뾀;bQ 'oF^ltF05f|tsQvyA?{ln"S]ʧgE9 AQBE xVߡ$=kpPhCr[&{yfv@[4&,ouXn\rOEh^={(uK@،w/yRIeEۯg YqNWrC斔 Q%%/RK! If !gr! `c d]u#|:NQxdba(܃K o/ǸB{t]הUfu]?mw)`G:\WيIRtiG*i/Z֊!.Yr$rӑ E@kP+>jlrENpa4v)Lj]ظdݳ O Z5>mJ2@6/ dpΞBڔtoI)G_s]!7 0; Lgxmͦ5U(Aۆ?ŋK~ vP~ɜ¦c]fxMãh'nR`s_O _;@i,_nfl ` ]D('m`V4zP]Jإwwh(:?hl kW*bߴtylSBJ@&_' PLV- ׏PI;g6)Mq&=,ZDZʄbqd!"OR|8EbQž>`_=~gw\W1xg+v(VxNxQQ_֥6o x16 (tꗹRg%^T(˼%o~ "I~J QǜF)8؃-}$hbK@+-t6Mnɱ%UďŖzN%߀-q*U&{ {" x?ۻ;B ٟo7x u7"گ¥r _ݍ].+:! 7]ſ-Y:11Q   1n$:3  R D#*i]Z* zDw`\`MK2]0*3]\`RgNĨd`kѥ4j{~Bv$/4c([$D t}yό_ ^ wNϏ=}7.q4MӥxWYc6w5yVn UF$;"rd%+B>6mS9T -F|jԫQQ~={`=a4OyN*aE'{$I9ݻǪ'>U,m#7ob]~=Nq@ D%Xkn{EUDɓJ!M|'!vk,!(rfk!",Bp?q }/Y޻RhTl{u#dKc\ rj\aG8݄IiscSWP0S;λ;75@׍EusʻlrSK Ӂ!rHmgC|#BHҒq0bnĔ; {5i̝~f\{g"lcNtuG)btd{8kEp:ߖ N!b kU 5iC?F,p0L:ztTUU5G\!g:ЪE N^~T%y-fRP{Qr W$ٵ%jɿ_o^\TFm=K?F$NR 6;Gu#V5O徠$vz_vRJ'DA>*66#_o/5Jٴ(\l3.؉.<1` F=C"30a7w[ωY7ΉQhtC^PxL#QrdIza{z]mP?A APCOBh4g(rY^imE4Ј6bqBRkY94 WѓG$gODVVkwQ; O!p?jb n'T.v}U CA9z3E!=/! h[M5D{t!˚dH^SG}+ |I>v\%=4DQ#3Y Θ3Y2v<@!baq.BHjNvLf d<;nښin߫|cꫵ 6Y!:"o7&E4zMߺslB>sf d,BKb@ /ߙYDg; ,tTق|s&JNMU\X0E:dm&p‰(v@(&ܷ¿E+߀%x`Ӱm/5p1.qJQk{0aMڃxўmECz߭DӺ&lJue/P^G|o+t^b}*s$ eU!i{p8 @nVk8g?4/̟pڏ=# I] Pסw"3O߱>&LHI8\ Ime<6."qbGU.ՙ A:a} 1.-fĽ Ƴ`m qPF@~I ˴W4S\^4v#*-o%'V0qy* ?ʿ`֪@z> <14t8j 7wI 1to@5x_pޓnSoí~p{_Fʝӿ>)n_9nё$ ů;袂]W86[#\ 9axsv!"BsB^e~$bQߠVMY~hy_(fZ_L r5I}'ūHt}*z)&28H5Jp(X^ 8&FWQ'C[-[N&RVXɋrF9c ѽeV{AC\RX>3a Ҋ2x0I%JHa y$=m9H0>C7 7T󧒞nù{@򜗴ǧM6/Y"։U ҅4t/iFkxcnZ pOPnUv }^4aƷx%epd~S[znDMl+v!$$0eђy[jR/L:r7ߊNX,&$kܣo)1jST}S㟘y(`=]a,tKvtu#琉;Vdl t蒤Ug9?JMgeG'$h_f^Y=+E~ROHCN -'ؓn1YW!B3-݈a۹r{LVX_5q3mV6k"V*5MFn}E'֗Ρ|XS* 㚪Xh(E g V5hw 0tJM44>UaaR&:?(|s%ɷ7𢡄狡OXӅܯ1G'w0#@A{1> l]*<8n8L(T2@\f<ɸ.B8G@=/H[Ph [|įX~WT0cǀ߳ ^~ů\ ?a2sz6] \T޽b=A*.8D@p K^0EUakȡ>Ƭ>?)Xp X.:< PH EG$|z9 eP4[5{:L.k'bM.C"f s2tYImɧ]8/CP zZvVHy7oͩ5BaxZ~(D C=q챏^2ـXn&(D,~rn~*O1#j*/ErD #<^0G8yK S<2]zJ@0 qou% d7/ـDt E=8MpVy,(Xn7nA6Rbzsz  i}! VtG]e 1n4ȹ[q-uؕjI2-6&AXJ0Fp.\)B)E\Jkɜ섅%( *!W?bnColdچH!:ڸ^-WL :σqػ6fi&BB\ID-9 mZ%`XZRBqu1ꗒN:COrǕBSCKWlĽ1t11wn_P#ʯ ;!%XP Zp3%ԇ& /u?2ostDքĚ˭gi H„T@jך}`wG*X'щqn\Ҳl? ~oSY5S<\P/_6v7tQӄ#P7;ZTDH QW BF(@3t+. Z\nq"P8n5$FR /RHkp2xZ²t Ӆ/xt=?$u^N?Pw!'}KNxfx}BB߀ymwER8 (\wdFeVI6&y΂an0L Wdd$L8A.C$r}̇L;fnyfhs:>د3 A |Ą[yQ,Fjk GLSQGr.hA>"rnLSˑ)cG)/qv s|D,plHnP!50+18ϰ(5[v';"o{…Z~{Tj7RYf ۧ~&1˥M?L١W  ߫ܠCMm+"kDzYTx Հr@2o4BTG zZ`칁W>vDZFP\`<9!UB si|G[>+'37L38N_;W4|?&wjF`{7"Qѡ*"Il${d09u(ozr~Ь )pk@~h`,_ˀg~̀=fO.Q&~q8rʘdS`r\($& L\Zi|A:Qy[!(ߋ,zZ$E&'Bu!CZN))q4<~0$.?J\ NQ4|`[|+Z^ZGSH8)Ȑ>Z .ŨaS,ڔ=BP ;5e}A#{+D aq9Ā#T62֌ _DjRBZV: to߿\ J|@aOPڵ]6P%pY=\uFX/.ODA_@|14:!}"";GF=) 7 X*kO!jǘf[x*!A?k%`Y8(K~&VqN%(bhip.J.Fƥ6HۙMB`OLfҵD0dB 1'`˄* NaBw(zXj {T/~p,|.{7FW@cTRD"U0Ĩ{sl_Jo?G:NG17.C)1$=/ mO>E7׻r}g.PȰ"@}ч6Y*-YI5v*'8g0PN|RL ɉ^/&ۮK|QCĀa'|'B&)7I,6.EŻ.9HސxFOx1F hMtᷙΉD[dZ3Xɗ$sm劋gv;' =Jҳ\;/*AyJ&ol4(?R9FC7bQC㐂͟~T8iP3 ]< $uѺp,Qi3 zw,NZ%lP:}Z6gdY_!R> ;P|.xT{ F |ppVwyѝr7,5m81$ 6j `gȼ( r!9]̉iu(bȿ*$o4%~n_J iMsEaj14Nx a]gv'EzLb+ةo 1z1eψդ^瓶m {B#}S?ٺDVJ?[wePlVjxy ZfjR7gS`oȏ)BX\$ڋH,&؈KGDN+E}',^A!(5޺r 2e"B25r"/,0cMfV*pVMP3I5]/+QNQ=MQ?n.m2Y ~5#s :=x#yZ@AgƩ8r[{$r$ b<yO_F>>vm0rnoy{!ze" /3nѮSg'..>Tܑ݂_)UЎu3X+BVzP=+-sh˦:Q8ؿ݄7faҙ-H `Gb_GsW-C~ǽJ"A ڳ-JhUZ`Wl5XYT~X'pLSU|[P@{_6 :yAk*j!TXh{fBkNd*&;eon\Q]ȁґ>r/O޷F#0&ӡ|u0u fH5#nҧFh v_ȇX"YzwP(uR1teߑ >؀R+0JR :}N'@!J͵>\ݮqmQj臲"r`ϙ&,kq*`3wwan{;L$F}7M+hlWD0x"RJ~"{v?3RY\<0E.*Nd~Ҝ*P\GBŜNg+d*İ%㊒T0tBKՖ_a-ºe}6!vOdɗ .[rպ̗a.闖$J]BU_LocI2 đ~ӱ}F9U%an ML0 'tuY%4M[ 2^鲈&_5|)rkz6s98cE5طl`yr#Ebo-1 V+!^gS ԍ$`lr(Pףp~ Q:c29rDqIh%hT/A}CYZi6Ov Tя{,/!ޭZl 8,s1)z -â36,UaaRS//qaL%%-`U ,B*7hɊճx2מŵ?d 0VQЭvPHpKEjgUkdᮋ}9iF~|s}ԚH\"N,-XN'Dk]ѳr-H A +0j }Р(6@fg9({^je*>i iz`{IЅX8-&@|a$aemQ |UI9SCg3Y5bP [7Yiq0p? cN&3 K6Ul]y(0NTY"J-c&4qD(cuz=!n)XY.fQ ́*CRus z$9?Z5d(`4w0W,p6m k`5chdCN$+a:8lE$-h%=n"Ôugr`BC-SX䨭XcY1J-bQ.PXMV-FrDMGY vJt,,EZ2! vR4ߨ|q.=hVO >ԓ&\bs9LT<.6;s,rߤbBVz4TnJ4ywXhI:dɪfCp:L2td#d"8wnuI(0]wIN*%0u2loE{e9WyN#yfryjK`*pE_oڈU2w5"PS& kkHGHN꣌dǝR nn+k0ҵaЦīAk48T˃>KK M }ץCkTy$ҭ)©U*fZ3V xRdf^]v7̓}!uuKg?toQ^J-b1?mB9XARb+I"I%Y (gx[cx[WI1X$PG+\(OVfKxڞW$z[ްH\MkˑP{A?">y`}4 آ53LN-&o]$ZCR )~ NK" %(GBha12_Z Y<fYcld"8; \8P׿ֱ؆PXIR6N&`5iKVlNK̼:y2&;9KhiMKŎ9:}.IP(0g ҂'wv>fWy~GNkNr !ZyCcp*w8E¸10U~H~0o)s2ŊȢH`jz}&f^0]omLmIjnmE 'OWOlC%O}<įRl龶fP߂i䓄X0uMVَ"ez{eWȷ_-r2'}L$%ٛ1s"jeٛ@ÃN-k.Mۄ |7q1GΧ+|Cs|*92Oм?̧:Yu9}.lׁ$*قT'6zE0S/_9Jw,II0ɚRv\?H@mvZtm`CW)ZF83 23BR%ۣM/Zk@`_}gg !It@l]Piqu("I)BԦPj$PP9Q^:DjTt8JCau2#7m*'[]]NmB*WHԆy2WNoPNWZwÙrO ,92\rWpjFFfrWpjБi%Վ[[W(0hg*n~{gw\Z=o|=]^ZG"_t9 Z:=:LPퟚhY[]eV˲/Vq>2B>Is?2Y4UR6LnM ?m5~DpkڊRX cuUYW;AE,EvԔPbI`A>(#k|=;G{h| 裵L m^ԉi(BXejC;ozSLbQfC-S \udQ;&9 $@(ETuڪKJ-bQaߠ!˲ZEp cqvH.HX[b0.$ /qN##U&;3.qlZ,HC`$Ԓ0X .d ,V4ZǓT.rCq<9 V/mV=+캢Xi#S8`kc^nEU-o0PHC$D9m$Py:6ѩT$C%F(F[4$H0',F{K,b=\~|OӅä_ݖSXKˁSn)x62 a)RM߇VH Zޮrv-zM0V:ZuNA/g{לZb@ WQ g* !CPWap_0e)D~0&XA4 ԾFg9PHCfq* v-N$IQu#k;B>%"0,H#6 Q |9UC*֡D%lju6)zR:7 vTwCAU̠{x[)`A1ķ#M0f#iP-Y2Bc!aտ6 |!Z/fxKV94i T!P{swWJqL]+d6}/=ԿbZN˒LiKԡ88+/JKj=JQk7ZP4̈́5͇Js}XAkrߨ&WǷՀUٕ-׊*K|3V^SyUQ0ji]ڂ(VV ma^ֽM5fW8J^9oZiT|om5PDx(nKnRHZv(#b&:AMR9J +9R(O°d?QFfZ|`L~[D&WԼnL>3hlʨ(+9S}o eXc5y(njz7I2=&NT,KjOB|˛) 헸G;Rοn13c07F8QT:MƲ5=2b,Q rdW @dʻu ey^Qy0p<@x&(\k}mzvGxŎm iUh(tGrh1Fu&Fp& =i{O"Oj<l>ˬv6p˳Ll4 X߳ xBĒߧa*))pyqwP#x SoۛܒJE+ ^;גpm.8U|lr"ԧf^,ڼ`!q.lC*7k+IVbEi5dj68'ƪJK_=!y5:D?K0p%.0VVKu\t8 Jdzq~',OWV}B^Y l/Dd_՚B&#8).a*L"uYH0$HVq5_fZ; b;U~! Ȕ'$c2*iښ)ynq<&7MP{*I)56bU~I^Hݿ]~52x.MY#}{}k%%S#QK~Ιţ"F!bK7)m&+fØ{7b 95=[-Lc$) Pl%g-C EѭC~%7kmI+}q1A~@DB.Uy7|袥 'BĊ[VcL\`,n tYe8nǴ~CX˳z1G\F!bђԞNw@@*9cV8^>PxiwE[ORE>I!]ӫp֢>y:^%Wlf{mna7XvcO`@BV" i7jl[}9{rmEXqJ,Nny=B #pQprmS+U@`ؾۏ1o[ָKO]+-h7 duJCW̞ҵ?Pau.Kd}f<6j +.]+i/`8 .;IAM^ɠBQ |Eޘa%)+G"IJ0 2:D7/ӔfJ95iS<0yȿԭ'A#.=)[ɶǎ h$#x iلQteqzpDF(yK8"J-Sxf ;w%JDi ~u~p*xjP] 0/y:{N&dTgpPKAg5|K^%vתӅ݄)'8)&l8 ^T$-e^B] |& Z UXX*d,sAX$5F,V:߲xrExy,LpuM֒óN J#{e*p>bѥU'Z"&{ _&I 4fRs^+ 2]Ioy&jzqO<5hra` { D6ɨ8aSEa O~i3{=@XpIW{do0gZ I#Ke_˒ G`wFc߱qTj\s[!w2ģ~?$c<'c424v2'tyQQ0zaq =a=Hv>n|E@AtYh;[8yVA>t:,@< nޝq}w3=ngHYk!%hZ|fQ$c27_*?d`h6yi2q,7t޼qrQĊ<.=g 1d|؈D''h79DߓB\L(>7|Gj@",xGپ!1uC +s>.SPcrȩyOt$>$S)xLWC+|Y~q9:#l6')$&Vc1*$F`%< 9_$2&u9ꗬmLCpmys(?fҠ(enj[AѝBĊ}cH $ōtXF+ *mޗ^$ +Y6פDQ6`%o;hf'.:Кb#kGj+w{yjeZ2,d`X@aؓ3ԡ>5oilD;:p!UN R|ۚVsQj/^h\~MF&P<~CuHNF;sE+>8Vb8=UKf}H|_R~h{D4WGDiε|\lehOA\jTd# i߱FgPm(,ƢYL AɄJdUSAX+%I@Sjo\2:nM neI"F!bPh ҿmKˍ5ISF\$>ϴ#{3}Ä^UeT1$1vIQEpA|o\c*2GA67OCۓ_vl jʝ \puBM(IYC؞MI,@aB 1LBDz)8dbL="dϧ=Q)+qjdԷIǵSH#ճ(\p@4E6j%V!Րfp >0~d4J"1ߞeYř;+ º i>4٥-ɬ-͒/uԐyAhΗ%|&< sjְM.gtѩhRMtS%F7g^^Fy$ ľ<SIG|,PGKőQXOLO۲HLD$( yv_kՉ= z rPYKlQ!yGu@ae[Ỹ d!"{ Fic6/ {>_0$ow+PbX{T'D8Dmq:@r7nk/ áerph{Xn"r+a~/v1d:_y}/G`j*O "eaNA}o9FuYQx B ͪg-b\ >xhC++~ⷋB 0' /KA)WuyLwBr%`$3y8*W$}<4i*")D.x{1qrR.$|B>L݀En9;|Q#\oZ([[1zzSO/{iG9+. f_33'_<ߙiR8_ zg\ΞӀ'^Ϟ‘B$\!ʼnMj1<?"?lz`C#>*d~)֓x[Q|./"I.%VDkfrO8{BUX]xCx^wA&WEdTwI^ ?3jxPBoj-#WU.RV]r ]9`J_ Ag@-\O  1D<7QqTlqHfj<I>Re~K"3n v N!NMnJѬA>)82RpWNnɃxr>+2 ЌĐiJ!3ͩaY5?^ZΦTU}) J?sYV>P%fSS`$_e_j9xK !x\W 9( u!@#"VUoH 3>؅4T_( <&,CVn ,GQYTLVH 9TpeeeCc+ȤH j!q8}Ԩ0pʬ cvS(YR漗b=R$$ۑ2Y6ud,Y zB}0%%X"4aj8gQΈ2Y7g* pKG<8iI(}xkYHCdcX OF ꉮ|<}%t![egv~b'Yhɛ=ڰ4qVBuaγz3zEEͰk&}PY 9Ha}lIC} d =сk5&k'sXA?sOP jA\Q Eqn yAWҰ.k%OsTMc'0dg}X/DKH^>E j2M+-ic.;-otb PtiewNuڞ%Nr^Ã.9WsHq6im9w .ft(E%a( edFr `#SފS{A*,e3`+|%_@Jr!"w;6SAHr¾$+oM)1_Q)1d:0xg`)Ne]*PsdgJy̧g7H!h$Pbm _eY"bΫ3%|l곆!` +I iP d)g!/"By1Sl'覞Am ]Lc$9=w4cX!reFR] Û [h8@&,dimY0v ѽmXQ7:`}CKuk*v/7n9"#. V+y}?,Rih)S;bv1&i!/sR${wicr B>kIMadb!Xe;Yfg4qۄ#ql)5&|I1 &9I* u#Zȗ-> BaiqMI`x^fԔ&" _%yGO tsA-@(?:>,^ jxQa-bXfveٱJrQH9#/FԽy&lq}ZA.JhYGR/[|Rxxꇟ ja+1)d+ aauЇ4d2w^ \3(0&§"Cօ/A΁|ʾC^PkvnN,XiJbˉEn9dU VU>o ͣ;>ra~/VDO_y?=AtiGˉJG>Rn`X6,~f$aڇ*FPr.}8Ro ="骦pr^t.kJdqzP'*g^!zz|șDҬrܧ: H2-xx mqg;=rD>=-?huΈHZ[ l 'vx$ js,c=F޼:%؉ >'lGNV;'*I"`{#Pۍ@Ҭ6Ɩ|Y8{xB93ćP˨ݛ b)|f ! 2Y=WcҮJP!` 5`{ʣ3~]W]Dn?nXf1ӄ攔6[?u ini hBD-xo^0HPj(jҾ9GmMjA€Dc4. @Pih“&[3o qI^ƢV h1vwzAQP9wq'gGMW#\$h^g8N?}9Px8{,3EJ$ $OݤNTa\Sz.-ч7gѝ5z]1>'Q*"UPR;<>Dm!Y@J]-T]A.C e;⎪ yhx8R _KJ8yܞn߉BfjS)OUm|rTtJӗU9Q1@LyYP ZS}jv1<.hw!'M6ӹl:2 :ˀn{"$ UxA$"JT PY 挀G{>4X  5 6.% ͺ=E D#dA @ v:Sra^=[7 F%sM2K\[C Gjp0GR%?jw^yF[N]PSTP@mrRWV:õ]vj7ΚX40ZnW ifM vY|*cyN/c<&-W׈C kIE+ {fHeLlZzW6)Ee#:KvZ@A]z4o~j{,}mM[;CUQl ViSӁ#TO6jv.!xYAmP}FS"vAEw nB(d`5Qw9э3^87@ג9 #Ge"qq7h^mqOZӴ*HovgU5IcB+vp;ekQ=:YH#V8$X$"C]U[vPq۶̮?֢| )Ervi|͙ K )'wCz!`%% έgIXjmNK`A5t>*lh:D7^fBS%5 )g됯=P(kMXȒ/[)떆FЫ'laeeJAm<M6$N~4'fd0k&mt,k#f5k#^H!ۥ&q[b35"G5eaum!0 BތbQ}4Jc>P N'֛W㩝ʻ'z!GW &\LO$.r (#J>Ȓiؒ, !e8ւ&tS.Hg6vM' hINb6(\\* (̕ Bc+āRZҀݘ1l't$#N[O#S94a#HV8Ssu8a4='ל$eet9Yޙ@nދydW`}0YarUŬSj~XbY<CWZJ \ܟ+b( H36HRd݇E|py4"B6?/۝ />e1(6+#B*؜$ X;dYBjSL@n-ŭ582)0F"IMjrO<8o9#Wq'z$0J  Cwb"$NqBk{,o#.E"Xt>QL:8d)`}+7!& RȘJa&oڑF7\ϊ2ӡyT ȋzuvi#yE7p5X`XD.0R9'.FiN0!KV#R:"^8`O4h<76UZo,mdpz\`G%v#n<`7E_"o[Q r*+{OTz,3S6*TT J j(^@d/~l&Љ PT*KVݻWR@.}[ݣ(<3tg+0IxEbv98o|(J._/BYF08m#G7ݱ (d%d}ɧ!uf5~G^yŝ)*`K)F$S)h.|OoCڱ up<wFL{b B7*B-1ID͞2(D)c}xvf E?hQg D cE σV =DbHN#&#&E.pq2S MAEai i/%-:[ 5]Qc8kC\F~MR>b$ʠʼn=Wj9RU3h0Dc.KXfbT;ZCW'U|~ImF jJt?=8_nce,bHeiE@ lI Xѕ%T JrS쒑Jf W1a 3䗿*]y0C}+G{a> b b#/XG/Fx\X|2MjT2I}DyK'2슪PvP•{jĭ!f1uz8H+ߧHZ!}jXt$mh]m/3R'FSuFS\4u1Ӭ]>ǑLXr=ώ L2vr,NG) 'ڟK@HA0OZ Fv¾|@eNBcX"~Lgv8Jk:#4.XRPdJ|'6dRWI2:bHB(N2y 5oI "<6WmJ2rj Wq,Js4.'ޠ6h\7tru2ǽ"Il u͋~:$0)6UzX 1H$p{> (US`t%CG`&[` e x& 8Nfϙ{W7uQVT?IKpTK*95}*!AE Z#UVK<eGr&Q(WjTaoo˴4xЇLQr4p26*)fkvІE(V(1{FB[Et5OqH_0F/,b@=P<ϙrX\;ŊqpMu޵_f+WtZl@S5qo5X6z|k-6LWvmS{swNmĪ G-˵CFz Q`, 1ZZŹJY/Jb8|qbw$#|l;,n4p û mQ@ 2_=PjzDM೯?ṵm_=r;(<)o!1 M^0JEkJfg.ww]KL9iPGyuؑ566x0kpRbu \Pߣ]U ɽ9v2^ t7b UQ*ː0( ?^H5'%[Jr #J@sq'n*9frPltxzF.d)0%;OSx)SX ctGC`m9!ԘܴAf;$$+8#D0c>LZ;ݪ )hm |8Z<Fu r, h]OuK}Q,׿cjBPkpBV5Ҫ>[*VϢ<,z.bjLA2V$+x΄gP h~6`Z 6[=+6LОglhϊڥyg}AGS,.j T, |XLHcUXMv7YFݱT3 s>7yХQrpKE,Vie0;S𒁱Kĕh@^T$BAwʨip;g0|H EJY9PQ.XRH&zQB p)sNMSvi;me bT}1ʵdRz>2aXxY/Fg>$#,.|a#dJ^͈ B[|X_7s \oRJZi.3U Vvא U@_G1gv_XKzfIf]IPR`ߔ4!'1ŢGh T[0Q jyH7BX$0KQ^) ʼ!J,Pq2iX|Ds@wqkɍ #,`{D0#M2d2+Ey$ ^( X͋o ZĀ,螺[[-QKr3ݴOFb#)o7ُMohK jD( hQG:0EVfq3H AƁYcN(`p}/왼z (gA<l\^q`gBXdgmV%}6[kdcG4Xⲻz>l鹠:/q86=RVFIE-m6dԄ-\ei˼ipHp޳ $: ;yRY6\^Mu9D&yd1 gGj:uy+w1\+$u)HW\Qğih ybmLIm]˄Fdh/vAa_w0蛎$L[Z<`p` s-`1e=EMS>D|zO; }dt{A{yTTKd ^U2 Ҝy :#8TBuLS %v-8 ԈxR/l/hEbp{IwWi`Npml]߉E^~b)'-~EPO"ڼD7{]f{QUkI{5 @FS ``gjR(9 puzk9ߡyU,$(G8O)ϬNI]Osi&vTKIMt\g{.%H j s#ưfTyepƀi;U[7jW;c5;JPALP|,l`U_@Kp-3seP)ǖȠ\) XEE`$X ךbM)ܼN/݌)k 'ԼΎzQݐMnzR !#1x^ݢ^н?vZ' [X9vӅtN$МZG 8'O8ay泦M$j9Eɳ]H]Jviyzm5-PV[|PMZB/_3z+*-Gl&ƒ˱[h* ٜr@q@"-SuC2;i5b%-A jxu~G/~c5l#WшT [Nr mŸ%:HUQN1͑w<~sX}t%WQ?U`!(eeeH8=nC}0g 3@,,Q&EhJr}G;vpWuPʄʍ(s%D]1@bLMAr'VV(Wbm͗ 8țC"v<[`Ϛ<`X6pI!{ϸs˴ќYͿQ)]AW[ĵ[ C#lqL~,^~|Dz׭΁]Nbt<$AH.9m?staԡzZZGS u Mh!Pp@*"PI$ LX(T{b2مT N]M(xsZ}ClJSRDJ OB$Br5ӆ>~V95M܇sd€VJ:^+&lˈVJ5nԩ scxd"ecHEHoLêp'!<քrI'B7WKl.Pza Zm>fizo|6E6f’zrF#*"Yb}|zaT lmG]{*cB!-b9->rYDZ1q?ZWƋyIjɛmG {ԱW gH]f3{%r=YxR\6 ߥ1̤L>dY;4''SPlf.<*ٵr˅xvd<{ cFfFϿ~/t R{=}0o 券3_4;r@.Ž?t1\dI͈, h}VxQ,^gMB ,5L 6[M9x>;FPwvKqW.|/+\wjE(}n0FsĚ>@1- J iL |i;j9&\H-A=QY}Q3_(Qfu8l- Bc}窉/p3o=bXv k<*A mPaCcigyL$}k񇽕OǺzmec@UxaJ(FnճekpNhޒkZ*Yu>[N_5}hU3A)`hCynы͏dFG>iұ;3(i%q{HHla-IyD=j3_${&a.#{i qMcaCʏp9OZmP $Cs ~͟Mڞfl桄1.iyMSDoÂn κz >HA:\e DLI<3N` ]=v3JNWq,_[$H 7u {v0$6?f;T XiGm:S|Ćw3Kn+-FnЭh+FZ.[^Yȟ؄"dBo|FER@ }-\9^֬}p2fKD>عȄwtMT;7']k\ʔ4 \%[* &wB,E U$ZP%MIvΡ<$kz=nb;⨬m'@r]V @:+wu% dh4h`xIYZ`S`RfWѤ&K鐇vUC"fV-Vi5D\]Aw8*j_|l}0\B]@ݬR xh4(0hLNO rܞ:ަ) [Y_0n9_iPk9E6x -9~uhSܫO):A뗟 EdP/o,AѲ%PwO~ Kxɦ$UQX]ue~Hpb_e+nm2p<, §bInFc;:[xThvP'o3{ܴ<:z ^l堖BO+kPSY<?a3 ( O߃}=GM%A|.OCϳܰ'y ӳir8=1'%r+/HL ņN|,1xT^=Q=w2JQ.4HX*I!-A`g{؊eW= 2DŏOL)~ˁ#V|V<_ӂ<#+f;?Cg$`܁J=8d$^|Od03`ÆimחR##B RMrnFjeG2_Vʑ//0lBR( |ß]lu,IZkIsL,ze(`m=cX+]]\50lվED/k@OHJ %S)\(A$QqBۀƤeΨmႌ \A@!THBJ{jk-< --B[J jN=u.dX740JBI]CLk ՎcVn̨b*ПVӃFcrMNwĒ'AV7ƃ~6FsgsN-5nT޳Z޽aJvi@̑^>ǒ*DW}mM5GjW{X._/׵GW Zfo$R *j'c}Auxzd)H~^k@`fYupl`GX:ځ e;*kg)yD<$%L{Ur_ϊ$-RC(Yː%2LHy#}IΗJ.tjc 2#àZʓeq8-[-~Zy;-IQN}- =!(B6NC%ސ')َzsP;loK1n˽/P+WIo# =ZIԩڷ9j+[B[(p1i17u+/uk߷w!n+_ǀ6izRɐ-]$Tg3X%,1JʁfOIl4 0N]s'˱ASѻ4ݵmϒ`E zq!inTa'¦M6|R'VߣY%ΌJ7.C9_(F%־EEg}_T@ ,؄" Ruȑ "V}xd< ZD[|%`AJ/¾iC_buXdHI;uF4"{5=a%4a"@%3/+ r j/eXUU:z:=Mc(7jbPhuVpk0|7q]*-c'adUXnxJX}GH[^5jut=B1Z~ybW?h7fR}ZuU T+3otBO$RD`^ uvpSgNH<|r v/yѼMIyVu+KE*$h }B,u5+? G9rC ^D_HM͏:h 5}jno+>!D2![{7&숢 ^>vY.CRVe; Hodh/ǝQfh$I1%*Iw~^Z-^=?j'!@V jHAT뗔k$C?oߎq ȳ=UiLjNl$Pֺjf&芒˿mp%ϸN5tolCGwd[~EMF՜ n8̈4;]S,mGٹl&f; d-ӄ,xLdža"_#ˍ:-,8 7 yXtS0o8~N î `<5HT6`ٲ5nOiFujv>Ѳ&++9_7ŀ uYEVDBc4 )NV{ml)`ky7%o 5;Hc`>f Z/]v28åg$':gA0@}aFlT x 󨢋ު8b%f2.%''W*( Iovb3ٛp%1q#+`o ,wD Љݜ{-䚴v4Zp'4hl1U VA/$N,v#J=_Fv/uFT\<]u@ 9'õvÿz'7f]=N>\U82,`/l@d9.^boS}RONT uu4/e}V5?RE_t|ma~ߌm8`c;=G厃rq0s8+;N8|}`-;~YkՔ?ig} k~tkxX/Ó]-d~*7㕷M-zȉ?^y̏?ʻ5]\huʵhXuݖ,`[m^g,z{.6x|k\tolu5)SزskHZc$بѪk163tگlIcpޟxַ.=Yߞْ|ܺw{e [`w `^ xۀ}P}zl.Yߞ{,-F zn{{v廏 gv `׀XښFzN].r%IĿ~%%]d_wV(?Ǘg. /mw<Ŀ~ B9:%!h.x@Qe5|N/?6{?xy-iy`z_ԳG 7[>,/K-j VQykVX}>V"}>7rnMf <̳O}?O/'vfm?MSP˳_'/؊+~.ɫ*.|$o;~<-Yf?_jbw֞r#%ݲ,1^ |D{)q  endstream endobj 1720 0 obj << /Length 2871 /Filter /FlateDecode >> stream x[[s۸~ϯT0.6Ug6ivz3m@IV"$%BaL6[9޾xu`1"r$HQ" M<OL'ztd e4A/]2[ |"QoYCCCnZC..&o4DRJ`<)$kϞe{|Hr|!_8Cࣕ ?b#fG2FA͘/8 8q YD}$%&Ӿc2N=W@0T+3ߟE~W|O<ʹJـ 'x=ރ$5Mgmv|Hy01f0]ݜFI9&!r=2nG6&qPd~EFC`[QYU>PxGҋ/B%A=%'#id>Ib!يd%;7j|jawտAJq~Jd/Mc"Y#<~-؇c_'Yz"/#CW C_} 2V15?'IpgJF޹H]谇'v.V   dM,*=sSl'wMnF[c>{_ <5o,/,jv5:kR`Nϧv߳UeM2@iwOR{@=Bi5V+n7È'-PBD0 !\{_Xr}˖MnZ$ N#foRu0YGBdc]kW6INDC^U#NyB.|SL,]hS|c LVio"/U)rZmnmGO6nϷJ)n\{]L2c~VJ!MRbR`RMG6DEnڻ` B&:9}uXkkAKc304'鴃Qn-=OQ\<19Ho I1AԶHRңRw NJ윸D,`{`~S&h5cY:r\u@=JUL^q$ؼ_nyd!6Hh%˷q(LJXR6"YQ$U䃏lS"yެOfZ+`3I(7O2p _zٵE!|W7 n&qhꃀ䋛%-;JwEٷ$TTS0`Si}ZI}HwEwUIǟS`AסYǡi=&*pý#9; } ֌$iQFe Ǣ26 QP}`hfj6]Dak;@ٟsQXe@+&gQ(+qpqVڇjf#Na+-[jeN1NLK%9V0خ㪘Fn!FKxjI?=$ zPI#gÇ WZGEةhoq #: vNztp ݖ[-@ s TH^Z4J핺mM(X<&!btJh0ҫ"Ƕ;5SIVEU~(MCqX,Qlg*qa>gK3L z] B%R|eT@D}KX aRםy_FEߖ*ٯ.)J:.o2]FfmxqNj=5~yR%v.-7VJǕ=`JoO )MLy\Kr3ײE ИWjˮڬ4*3UwՃ4+u+-pr@46BrR}(k^&A &='4Ôy涏y8HQ #)TyZ&R,jv,/ͪ X›?#N'(#!qIߢ8'Cqs8nw%Y#m_Ds{j `, q&ky2CtPGW n):d.CZhPQV65_P("Րl[H%!0 c]{ZDCVO@ue`.2l%6-PWjp!E@kOYƎ*$5x[uqw=_v9 [3ۗ2sFPl!sov?-н׵KCs8pb8D>V jU6'j3z Ω>H^瑹lDH~=2oIM<> stream x[KsFWtH+r2O )Re].Gڕ@"Pckk{慧@6ރk@޼:|k.cxty;x]`b.ѵe兠N H̄ǿ<{?l[Ogߞ}K^ug4@Fky#H-+N5}"H~d 5ˆ]8-xjCh͔>͚$Q?ɪ$'y-L2yC yCMT7hM"q*@r?$^?-S ̖w%GSC0/As9E}ć_EN!!T&%/(&DbxmaK .aS)"ќn|/'A>Zޮ pK\GqvM|o'Ӭ:fHI{1uKJH+v1s@ˆI~kٚku1[:|7ʧ8HNjz|Ep(4pm0i ^5bZRRr6a!e9udizac6D)3 Tф$YyUx%SI-U ⲦLr3 GsR9=ꊞdž$gŀxpT%|'^c<`nZ7{OHۅ/ס%k3aC۽$uoq\(=(:znWD 35JTK?>ɐ4zY((`{6Kg9kCa9/lĿޮ, u8'UDڑG&E7ݣlRڵ*>t=o!f9YYT-AV _޸GbgDѦn~H J p6 àBt@ *$'Owb u l+y> 9- j5ۼVYy/Ъ*AFTtֵjMtWTj{WmNٿFG޽Q7;JuIl$:G.-m֓jgSm^k1tFں.u;ajeAr{Rv;nE.B1jt}FdmoӋ$|HS{/,\3UsSMي^.Z5L@=VUc&їbs UV>~#?ɳLl' ˣ~ڋJ䓷978ȁ]YwwUDŽM8Ǣ3VR9BV 1fYRavu72h"Q\xqs:KDe~r0ɭ.$os@˷Y< .yl \AXF E~"l:mΕZP3R,*ijB_q+;a`¦2"<um[YR+yĂpsI:fLD4.:ܢrSwRa<5Nر~SD =xXWy@˒T:':a';}W :)$|#D2=30M%5aO6J4Ŷ(ڰOjsD`UExig }/O%T9 ƹE{+}i̤#O}2s~[FPc_2wd᭄O(oI:' +iug.p6zxYLsDh.hCI8q9ma.nk .u$H7a\Wi/D9'7 {djp+iK49p]\> stream xZYoF~ׯ#`Iyf( 3CF>xNS'v ,VWU8pٗ AHHQ&u&fpt(IoFU|9ld߹^?/?S=ɅDӲa/3 HD$EDHr`$uڝ?C),> _~cimu#yr$+L9f/8Nz\I "u,:7F3.R϶mcxWc|ַEܓـ֔PqmNI: dd^uq1;:U~8N,d<ζmUwNⰈ#KCHBl.M[9a cM$Zټ 0C14r(^כ.u^C9"{W/jOqkY[`%9MSwR,Qkx;ypqҶnH5wdZ7(k#_Y ɊJ_UU~/16_ϤEBB)pC!L o@g)@C@tF?Vlpd? m 6&MҠ@|ǘd`_ha3`fd` khif 3m R60-$˕@. CB b԰CSչ}bgP0 )eLw= y~_;D' .k~CA pU )~+–`sҴ\|ju-ߕu/_14Z!7pwy]h*8w[Ck֛ 1Hg4KT[(¾F<ֶA32)CHO)R٠h϶.ksMAi‘S1juaaS[j0ʜĵM+veNqwXUU(<y|40! !=Xlȁ 7wݛLQ|wq,kZ2ƫv",=8 38>al׆:hda&TF "itN!s;u؃ `8NlTCf0MlYHqs`vy[񔒏vzB9H.AgF# !9x79QG[Mb|ʐC]p?ibԌcEgK$q<K5]vTQH` N:&ߝ>cK;<<f?.k+>L}NSUy(33|ԏE@hmP͇rR QWl\u@lgIE!ʇ2c *O©}\r㏺vY@L1V͂eLHZv Fc]3 , =AGs`>F(mIj-i; ? Nn/>5K}5E֚9+?B4 endstream endobj 1723 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/u-bfgs.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1738 0 R /BBox [0 0 341 332] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1739 0 R >>/Font << /R8 1740 0 R>> >> /Length 12994 /Filter /FlateDecode >> stream x}I-R=plH1|j^BH!xBu[gp3DpD~W?=׿Wo}|_?ï|]yN_몉w*څooK<5oެWM23~'wK_|xp-58Z.87u:_9=۹}:>oUG)||aJ8O9x_NvA)D#=wۿtz{Rм灎h||aΘ/~םS9=aÄWu;Nzs5SIHLMB7PjE(.M `~_ǷBݨ{&> V$;*=t}~5`ݯ".x¡D)!ɻRkԭPyp΄!p wvz Xڐ-<?J~= r!z{ǡ!ṭ$EĒx]59Rf h ¶.Z^t^{N7 HNtm4A.пǗ $Bd&Uj1v}"Xb3hlN V& eA?dQxoh9,1>!> 'l#%!棑E^@ l%PX;=ޜo\{/M3f mch6 = ݛ|7$ԭ*inCfiTFD\) %2A$!lOפnǍB9԰=1JdxH zf#M&bs.Xt㛏a ܰu~ѾUHkxGk][IF}C#}7h>WCiV*g'BkɠBʠ$E;e\'Tʲ.7- Xn=mn<V3ìoގ[>l[>23[>y=44f:M:!Mݱ&N;Be3n-A \T,zE`jD3SA&"M7T]ؓwS,GR#h4fr`$=푭B @paClb@:b  wX'%o#R5]~ou,Ґ¿9m cuC*Z�%,``BHB"g\9_ \%[f֘.j GLL ݍ}l`P1gmW(8o+YW`+ªz}KPwekx{R\h{0⡣WӱG0V]N^0ٔyqc3ܭJ[O6_@$I{kF|tI2c IܼV 9B O{ mcB}> mGJ/k!I@;ˊwݷqzX$ ma[@ߘNmM?R9ϋoc@OK2 J͛+CdMZCa*D8gY(rw1HX#9Roϼ@>ܺ&CVp6[IRl?Xea$>z7&0d\NR]DfBÈ_0ŸMks_E&EUeιD57uv|ݲw84b kZHVI`cE8fJ.p@9ᙴmεG+N(Ruy]#@yt@=`gB'r<^#lO˲ DN,CqVK%njz+FNm j,^#\7vpn~9,]}a %RO< W5D6+=Jq_c5(Xs^l,B4 ߬f "W~S6P6%QsA %7 s8ͱ '{*Hb5hI|zD7;4w7Yz1c@ҫҴ~ u蝢w*b Fۖ(NQ*/{BR$Dl[\ya5mTG}rW= h 6kq.8Ж:ZY v 0 \zyqph QE{;۔>gp5`ֺ56Fq5bS;h7L',yN # ^(I-9koyF~ .4eڤ'cN@)z8`t=}"RG_Sjt : #8vJSj4|A²pY >|L4Mf Ȉk)B(GO)|`2 ǜF{}豈3B|# )w 8ϢĶnM;LUJr!$MOѪ

:6Q}֙bϟ@n`~ y9ل䒓\tK tSHGR&H| W}s]XՌ۰d5fνe{Ll_ {:KXaxEљ^n_&WGK?R *a,aןiK̑NDžps|։fznH)zO0L=y/x2zMtEEc*h4tc0`)n7^;T]Oc}eDE4A=65 l l I~/qȊhϹKOn Y!ĚEnCyѨ"'S3Q EFrvL6Q8Y2 #)= e8jBg$N8 3u[ k~T3Ms^n)F/7;]3s6?CC-N>蹉Y㦆B̆N!LM;x'X]\>w !c. 1Z`?C£>fL4StOq Wq>߰a&v2tE $>{'{9#PjJ$ ߑQ&^})WkQF18=dtm0\ߪRlA|( k ;~# +U@Gˈ#"-܀pܺAA$і[t6,v7.x9%E_/.EL'Q0kCzqZ\&D h`:x9Cbn+[G P$J/͚uiVz)'jJ/ύ([NVǀDıKIp3$Opmp ߹BYD3_frF5QWgn0CBFp(ƾ^l +w{WťߪvKÅuIKn@t؉:(6I9|}lL[??U':VO',1Ʀ|rJ_MJut\bljuwnPIhBjs2 b>p*be9AӦ | wv "B6"tH6e3DVڮYྖ#O5G8|د";c, ^Hb~!$Jv%- [7)R8$j~5A.) <,?6n-ధ#GLn;z+=| r&|YJ*VFREi@˒گ+]CX`hMW ? /8xX8uZ],:8Y 8 |C,'" wSkC\F*Fb;˂˜l:cEuJ%ϤMIޓC;f FQ@2d$*@Qȿxr a45;;s@Ӏv]sӃC):K|_b]nQH9)ZP.dRm/g01{b$B~Gkt-N,i )?f,LQnWәmbf(} ScJ <(^pdX#kh scXJz\ ~,sDaOBIi0]M MFDϦ/@W&xK987XK#[jH;#{J1s[i-ڴ+汨ͰTD Vwf?Xk|jl䙽r[m;7g& \U7Qy:F)z&Z*+@vGlz^F Q ruY4H-xOk?ozHA{E W<x:%zRn8(bWKoOi TsYe>a9Q" r?夭,iBr<,hk=]J3t $j ]УΒMYӵ!QL/0DϖfB遆ɱ~5rZrQb}B.7,,{CHjFFV[aW( xU3"ЃAp-܋4JaHCHá+*w5[3k-{ NV>JK8z&M̧[;ؖ͜4|,f4('-4xVxܪ%,p`6 B/zLze#D_Ny>9D*ykRs j(U͊ZP0CTНnyE^aeN` KF^ujQ^uB@ ށK^tp,In p=f$x! ޢfۅ Un#bgr M!WJt2׽ȉXoqelg~*)Q7hwObЩځz@H{FwPЖ?M|+сL,}kߌBgxpE kSCoW\ֈ`Uzs!~\P򒔥 ̪ߜka,Pv)1^;Q)r 爆" {r3t[;Āz6bCa.O3m1)VgժV=Mt∘xK]aďE21WFm/uJ(%_]ʢIr`yDƨ߼ =p)_eß(È-cGTj"[Tt fDJ-*CvkTXmNQ]HU/vh=QPT[1ERkG(Qvz=;l0i ֻN EP8 SmfQ{5n-pEW7F[6quƍ44Ɓ=aA#Q|Ki|3RBG>HƄao QTgOҧF02p7G2̧UV1ULf%W@蟹q=h7EJe!kUgC qf2Sin3-oQy 6̠QgX={{+Ӡ| }dLV9'2|G}yIZH ,z F箔`a]%f,f~t1o8~M<]ns\pdK;^ kO^jnD=͉݃lexx$ֿpw=|g^.Bͷl-oN(S:Ob8D UC kJ (=@!aecP#3%pCVt.YL^g~/h \s3jI~1l,;%JeDp r+/B[َl.>hcu[NˇRmA{[F- 4o>^Ѯͷ ! &vɍ>V՟*>_ ҋ阨-&yhykvK{Mg3_Õ{WdhIĐ?Ht!M\✔@uWdn+z:13So~.7 ^ e[+AU‰/ü.OQ2 s>?}FyɧtˠYo`ZxnNØh5c ,&|Ԯ8T 4Wڿ鱂DqSp@c, -,cvrOeHĿQ؂+F-lphR} ĊV LͫpAQ="ސ9_yO1wls1A^K jĜpzYZ:B$~‡A$| K,,8Rl8THl Fb8ҊΖ$^bRE k X-B'yOB/S?mڒI.@U"ܫ"B*B;)zPj@upJ(]ND6w6bL䦢H('M@=XgX^GOg~G:if6њkE"QmqQ|\ y3i?)ABEABu5ۋC#p3 }.zZvsFkS'B1J_]dg_әb_AckU}~ZAp6(LQ}+vPN*(Q fV9 >oPӒ[Ϭr#`RtTc"dzզ _WvR߻-\E'ge \@TdরLm,'D=cxf&1DW5z6 0 ۹?nn5ܜuܴ!jZ?C+b $ឥY\qTJĊ GGQ̓9k |Bj~ĀUm&Yh>'F-"a#H. BIp׹eqߒz$nr3s0lX)>K:kJSOcp- {P!)CKt_Ex"XQ,fKmvQkqr姷hvIG;4#i'WNdpuv=DVX>xӠU|4t\ѡB˳}]=opaOdN/N|k a#lִoF~.xoVPl*A{ 2뮚r"{*uei4 N(nw^ρ@<.X*R>hmHH R;i6 ᇸ"$,s/}"H4oȺ qGa8I8ٓ*qa)TB:߈Äm]M1rT#7c={9H@ tG!gKLW8Ӿ@,|Eqp&KǪw,I,=p0-{@X-u,ڭv_<^jPƸF+ VwUpkj<:N->+1cY3TG K5JcIfO&՘eq[1@ 3 .Jd9/,STd!Ŀ^l *msjfG]s>M>ԈG/B"iaH3&5gsvcR*\1 G >oX"ƅ˱QVfPF"?^Ӭpk!upF&U!euzT%nKqT\§ p"7jͶb+)j.hqDo{ωopDc0-A'egmQE)ewl9ij獂c^nykD+;I /hewFܓl 8SȺrK|gn*cjtP z<^3҃^8ާ{gPؗzoތ&1 3b*PU!Ԑ~ >@dڠ7I!}7!u!N!]9S@Y N)d D$%TCmɍ9++ |Ns$U@]:F"HA:/܄78-eȵ'x?2j&hF)qokx|cx7~%JUx]ܦ fE63vH?\43iXUsnnKN׆2@ߥ  ֆTzaI? b䎼?Õ쳐ڐG!VYN },SRIJp!tWWm<:,8JZb-)`5[u&qG6׍5V9AJA鬜n W5pi6(">yH5$v]90V589%5$\c,!=b G*֐yWc Y^YC5[T&YS!x)/|Jģ<'TkZ5N쓞ҺPJJϽRK xÌ60/ nvN4kpNc5otTck=ZM B["3DZZ$ɿl-xo-~e-/~h$c@o3>G jU촥;ݎS"ȷ K R,(KzK1W11~KmyPR}ZJ)Q5Իi-WRβʝbJ"-A M濕Vm25{KżֲM=t[2_75&ܨZjkăfHyQ-Eo&ʹRB 6k _KyoWo|4k=>[Hi_zuWUpZՉG@5:~l .`da k3Bg:Fyڪj 8 p25mB@$O`»)֐_ YOAmGͰԔ)͐א)x.XU4W @0L{Aԫ`k[0m_Oɿ>^ƷF'NY[U2$ˏI5H,5D)"!Rb!rԪXkC$5DViCT#F#dw joz~bE_%<gկ_'LZ-w_}UP<^E߿?ۯ˯?,}4@6BJ2߼0a |,xtG?'<Ѥ4ϦyrOY~OyAJjǧǿ{m"M}yγoN56 -R~vdVJQ00ymR?Uj*a2c3=켇}.XY~RR?e;NܷOPdV@666OFnͥO͓~` endstream endobj 1742 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1676 >> stream xTiPTW~bE_ +E:`( bAњ"88 Dn(&!-Hcq SQ!Sֽ:|˹!慨5j]ֶٓ;oKvfMLi%KPı sE\\c'gm {gSOx玛b;;l-ܮSVn-RF:?+3[ l ՚\:[ZKW+cՙ Z_֨WwC ']Ǹ`Cjڿ%nh>;L1oTe3X|j)Uz}}_KWO;Jz/;32vK衧pz@_`KƇ0yJ_w? =SH3HxxWr)^X+.:ȝ8qy]5׻7]g񩲺 q`ߝlݓ0u܋[I `{qSk-tp%"@LKz|h]PrfVڜ]\,Ɣ'ƺbf;ԕAA}fl}.Yqai2=Cv3e4J24DP7Ȇ쌤:LrX 8=L~茮 xͅđ͛]%*P UT /cˆcB*&vp#,Pknj;g/7n}؈o55|x6!˯:_ 5}Ėد#Ο*-嵧U5-e]b6}pD)=8=_ Y? >[o 'ӱ7)\{ƒ<[ `4 "LѪiKOUhwGG8'7 MWĜ̩4BJW.q>V$>5@(4 n`=&?„{`;6XxI j(|-3d!YuE [;wsx9M "{ v,f?BfRa;l7Ǐ{YGD5}) Ěm1/&c+wmݾM a=5(4)5`Gz[p );:cUԭ/MJl%aw ZW1-zv?V%?aFmX`ѣWR#𖦽 ,w{FEzyGM=υ@]4@KJ6B =kMRIMLWWWADUx m7CG?YRe endstream endobj 1724 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/J-bfgs.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1743 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1744 0 R >>/Font << /R8 1745 0 R>> >> /Length 1332 /Filter /FlateDecode >> stream xX7 W \%D|` G|ILbCˑN8󿟞>|Pr>|`-=>21|S|{?/cvm/t'Lp#㗗{UA=O*lUغw7zm/R Ͼ-.p6736gސ  QpX~* c"~;Rp܇U:P8fQ/A:HDNftOgO&XfhцE,YMD.MŠHQk*ʌvjM+PKv=7.'w,e 16=C׳hQQOX9zr8^Վ39ڸz1E-۸ u>T։ţ7lpЋZre%dX պ pH;.>%;^'dJfz`A\k]|AY b \ id\OȬWUVE+b Z0ԚITp9ԟQOC. h/Pع.>(% :ÚDzZѠn `pGO}Ajb`u6*% 78 r?cxLU?n񣘕Oz@< #+fx`i-J!+j[C. eZCE rh=xGMR+ޢm-Z{0g \f `fj`RnX= A_7_Yk~ω<v˳ 6-Z۠XZo* γc;?[3/ьc8 R;\V|Geخ9xVWx@_ы2Xά- CEkx2G%6\5mrKc~S86ޡ\ؘU/U7̺ԟ endstream endobj 1747 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 957 >> stream xL[U>t1־$퀱# (t"Np+mRp_[t[ƈ KDXTe 6L1eY[5]I#Vt &F{ν{>{.dRl>h^ FZtz/&` ZTyWH"t}(v\eܻEv9BnNNP%}#[ڛBtX[Zmsw]4ۅrhi찚J: β9r)e!TtȄ GIB4Z$/PG.*:.e;d}ӲY\P< Hiyz]:/fJmb~rd"n:u~Y ~j,<\y6{/ټ@$g= VamHkh?d>Sv;ghzR\ӒAaH4MתC_]r+̓ $05 ɾѳ#ˣE{eI~6=d(J' PG (bF&K38Xpg*!b2:|ϾݡE.z,=]ADShn{kPN dBRM_iaSr7EzF%|00@o&7#Txe>=}U:=x wLJ+3: endstream endobj 1753 0 obj << /Length 1526 /Filter /FlateDecode >> stream xXYs6~ׯIEQNI2II2Y-Nu|L']$Ҵx6͋"]{|B [)j_ ͐3Pוj|l?)WgJ~}|ֈ8SuVճWOS׏<}qƩ`Hيr1`PEiL–3/$jB„$0LnYpܮ}QXKEJLFZSL@aGz9"Xh3!507ɢUjҊ`BdnU)ǔ[ҒT+w畾*AQ!")cBъT䇛lb6$XTU0qCk w湍[cKIڈcJ lVhIi-f /LoIuM)ILX[:PnmMJ6[{٦|-V`E)*2ʟg%>/Font << /R8 1758 0 R>> >> /Length 64517 /Filter /FlateDecode >> stream x;&+&Q& گBtʨw"!>_J#@!$OOjoSҟV3?q??gyzsnxQ3'.[}҉=j=[ϳId-YzͦQJi0 r’K_o97-rbe/5m&^dOI,״,TؽާQ@j/SDJ3,*rH7Ж\8V]Li+Z/ی|>̣`55Qw~.GaXF[hܓGcƝMIwo5d8RǠuΧzYR+*԰r`-(&岊ԺjyְJ# zRpsL4# <\nS ;"f>޹9RВ]˹lAWWc1^Aej<FlN;E0MS`e\'Pbnjqa@9ksL&;:y> (aB:O xaݙxPbZu11b9Fęh2W̅ ]_7܎3$}W/3t;D4TP u;˖Z =9 -]!?g&ŝkJĨ^C*Vowx9"e Og3Q(VJ"N H8:@ٵ$kI-k` PVo%º˸noC4E6up-m;^h@#ì5vC)]p\k.iEv`-Nӂ*F$dȭM>XEƣ V0S1uEi"$4q?tZzMhQ[v-t%^rk_F-8/{D:HJrc~'T~D(b= ΁mÖǵZj1Hm-uM8XM 7v[0_ā{ ds$5X<؆60G!G7@Ѿ zK8F7Ue=H)([.dA 8Zo'{9xkrB ^50IKDnǪ"rJrahVR{ݸH@tҴЉefe2+MI]A4+$-@3 ߞdRO-O0i4.-Č5*g6=JGS: Viq,O楰qpĈuJ޷Xpo>;xAQ88hd̐Z^~NY\ ALoUPIn1ǰ#ة. y׆, er!>j O.C-4EnA-a3Yu6DhfOBh 0"vL >_PNwzj`1-vJٚ¼yn sL&С-}ͬ E##ZJ`U9loҽ0|nػ'`G չB4[؍ E| Q -%m(0C@Ha\^G7z w#iLz:_TB"s sPp婺o@{*^pQo`z 4V9ռr~9hˡ;|kqGcw^Pna&ŵ8փ!U<p0ZZ!E;"2 U Xl4;}b58aݓQ*; έm]&-do$P@U{/܈i2zK,4~⊲p(|󉁎؋آ4Dm&fgMol9&pf.Ig-Y&8gJss_t90;Yy02b5nm6KxrUlym$ [eL-CC_=s<靓}hSw5L)x3vuI",.QSG#=.G`,.gօs9_цKgz/bGъC;,LH Sh!MEv*8s\z wf~]grc\ ~cèex"Q3?+}('mLz7sWhjq4IAFb1#I˳jA Q8@.HSCKGR]@h-P7[rj21}֡ڳ fa4ms6TK}NluIleѲ70Xw3.:VanzTxqc$8`c$&]![!4=^@j-Gڜ%vbZؕJuJy ҴA RR ]oC̋ ׅ3?11\]21Ƭ ^ wZH`lˮNYι/K= w38sgLXEzMМI ug)+ xIwEl,T)y1wFEpzKipLpXC"iFC2gG8dFK@vB78A tA30 kdXugz]ݕlh&׸}s]x"<7'Th^<7iYz+B;"3Hn8Ή_@ †Cɔ3+VuiyN42e41XZ(5kl\NR,?MqТo{$Ӗ[*dױ_n7k578kqrdI&!'erz2S.h)i2)UUf˧.;5R.0/dhqw2[!/4.cW %Ԡ}=4]=-OZ@ciޟ|>- []Z_?q3hdtQ[TBqɤj?@mdH腖qŜFN_ǂvY5I4bS[\;Gj-@ {ʴPf{: QT[n^Bmj8Ev,f6Ӭ0vݱ8 ;m{s]o'RK;D)ģHj<A\R 1yDkyO-q7 V^ԟ@F^ܚE#bG2[PٙlFb745듑%Zp-Rl{ a#Qȣs 1-^Uk.EzPt-4蜨" En*qk8~K#R[MHӵ 4 BJ ód&T,b$!ͻq,` Ȗ0>Y\p5h@;[6֒[{`njCUh9%,tsTk xX70#+3 *OZ77j1L O+ N2)Ygh( E(~2&~CfJ- c,z\\ ^n/i{9U_#ٝa;BëJt`sﺗNz?NUo0 V~ N&Ӡ{]Aܙd~q0ܓ{ .X{[)]aGc:_#_j|mQ~ds@՚~yӌ<-"w$`ɅbK0Y?-W]|Y;p /v!O) 12]fDY"6d{Ufx)˜{w"dv'bj^ ?Zj-ԒD㑔_ ]H© 6|&+mB2Ɯ^>U@x>&upcz?20 ],'}RXR2.|.ߒ D[3#i9Q^$oqZ]yp9w}x}:>?^BN6_YVO%y{^|?#O@81+C}e dQ_夢 pJBXGQlc#^B`zc8.Ÿ{OZpkb~5_kU:R ɯ1CbFJh <'-͉YCk958@Yv<[`L@"9Yݎ8!媙@W~ DZIm=b!Ao$^&68" QlGӻG}YJ7sջ" ${dw-$G AMb:$w(U4T}+h;ՉS ؿnμ0q0|ܳg$܎hܞqVi9D1En[\i}F5FLz+L-p\X3n.)3S̔ϕ&ߐiR[~:V[d|,O2lPMnvY-wl1WYq8 f`LVpJXʘzԣm>=_:h(o4 ߲ 2cK<3N' E$7 yJ'h+}eIiH?9(7Ns1?`8/讄sS Ii5kti+ 3zc~1L#&>-;ae3a}ڐ>kD:L1uK#%uji-9Ƶ3/C 4o|ֻ)7I>ӟcm̿^J΂_glj29 ;G*NoujҊ!E E!操}u֮%2k=ν|ߴqڞ0ŞEc;賦I.5Vͽ^GT*{[S1OD~OgחoZ}#zއoQV7N;T&7 >rҼ$nm(Y {bnuMQ;$'hM5A,K"x< BZh3rmIl-m@IK|E:!_ZuwY.7U i6Du4h#'uzs~0PPJ}|,6ln2n&4al^ڮw(j\"E:~1ZxbgtCdkW!D4kwH~%iB疿Tz/mKlh}FkIw]͠WY$cvEFEG!&{I8 @hrbgz?A˺V}[5fdɂ23B(""ʒ8N$4gʹ|v$B30dR ÖOB%cTdfeN'mv5뤥*r3P2{3){i;mFd-Ћr _%WcoI8N朵,o: d~CuBF A ³ _F<@Ȍ Z:"ZH6]TZy:wRLd\YrʜBP2'I5P0ҩP3\,3ሎƖ0sPdۋLPlZ+sKLO'@>|PF-d]·߽r9n|^O] e=&:*姚U]..ZLN-Jeq B:L=؄%soz@K]BtM^Iz1ŹV7mT1STvĖ>t$ =RBXo7hIt0塌-k= 2# WSwxlD-@n-]Bi{\׹9e<_}. Kuݞu;ѩUL,6qq%O:8d6S,p|kdK_IKv-͕^ &p${p?q78JŖ->NcwZݻz]J5 ^ڠ"'xCQD,8 sSK0L\^jø%t~%܁呱#g|rWxEmM ԭܢgsb8^[ ,&<빍 A3pCtbY$IuVJf0 ')T~c񤲌ᇊ0:kIC2thOx@PI֐ ("Y};'t!'L@ܣ631D!.6ΝL\N$?,ym]\8NyQ vHL5e1rFgm`#0ƫTk-F4H!Ɨ ]>cBV#̌sLj/c iM^3$ HZT`BPе6Huzu`E-.'EyaTGA d;;QZ?A),lѻ*} >ܶ߈d\X`pE ʃ},1X^Esc!6_+ƲG&TMYKZg8fzlQ =aj6sy˯f. CRӐ-d.\lWxP.jtxХ/; )Ճ)o<ӳY}TەcYkiSG]@#sV3o477o?r{|u`T1^XY$"Fa 6`-$te`;ؤiأ1 Vܮ!&73NG玣=UouQKsQ7jܖ1l%0TrNZee!,)EQy0 waᮆg7"5`zK:o{_-0κ k4 A?\c]T! I8,7a#d:`#˻,[{  O; ϕpuձD"n_&vŽY]=^ {y>ϻ\w v.ݥ}r-8bo?S\p4eF;n`ɪm4ŀmmU+vU _p +l|hE,l[?x|[~ѽmzQPT"1y@.-nlx%sJ0zF!@C^Kor`}[9 Z"u+p?gz nAx+>^-؞xi9]-)h 7NU7҅$ϧNC"W8]6& dnΙsFli#'F>@n#UC"浅,,g p0m3Рg[gY ݣƣ3~UAaK&sc-} :vw]f ;_cKlDGa~_7 KK&  ܏s?H  NAx`i!Fkp֤%ť>34_s1?>YY,NuZ0''|Rki"/˹T[P{O"Zy o<$#{`Ö֯a*b]La.gT/*0w]c@ <5u)XŇڍS#Tu/%- G@mm6^Cm\.;T+Z6B^bşn6kKp%r7 ϰSn^AQF{~Xr9Ôݞv "Jŗ$*)3SH"ҝ165Zyi˵q(W}66"τi쉰3|VVҜ^j#d! ?5݈ .SlF5zz2 W/s-}sZc H]31':*VO)vsb,WcK!А)E9&H^,,&Kt&C:ߞIh|$mb'cƭ= O> CI&ْ2 ):="1Yd4*/,͢ﮰxf{MQ{ 7"Ln)KN6zo5'~rK\=K'R(}|j %PvVX.&5hgTlT9WaQAd"Fz)H=!-,~@?+ryG ʣg|-4yZmKd 'F{!zq >'$E_2A<< D-%>0)i!b7<1򞄼--Z?yFYRe>MJVUZV0~cMr 'C8U'C]#q$99oJR7, ~+g]q᭏rx8Mv0 !;'(gŋԝCb';W]8USek{:n<4t]3m`'z}f[ E;{r/.AԎ1o*va.`j (+d緋kkNΝ"9zS-ƐG?pXL7&n!e(&BusĎ#^"(hss $fg qȲFk}Zh>7MBbФYf.kK=Nx^>la-_bN-9a@[yW@Lo/wDb-,.O߈ `hqb pSO'UHzZOY?&7 JZ-/y a ϰT}>Ca*үfTnF g4 Rg\+T5WݕP1L Gs3ie&S Wc&c<'~fѹV)dLf6ͮ;h$`&\1Jo^1>UZВҸCu| j 48F0ϲv0װS>T)):ҩ d@ȼGd:gNŜNc%6/y<*Ⴚ^4P/q3TCi;UQ+*=2>+s_a) ZVteg#={TnI6@E7Pwpshtvl͏: !C(+:SU? }DOIuɯ٫a~Hst}u8# I*u$ÿhɃŰJC<(bh/\@;B& >oЅ{E7^ .Y0 5 TAt|:P[)l=4ZOMF(ȃˮczMX-Eg ꀥ?]|$Z 諟s9xYu+IEpda _} 388S7y<nQ_twp$MzE_Ȩ厗F6 `^$Ƞ Q^FSCsB5N1Qa yn<>WZ:lJWr`!^{{}[ln&{lTEpvJ 0P7͍" ޒEvuȿ^Z:i~:L@t3Z>̣it.q :[j䡱[Y5rk Q6=&mu䦔ړ~蔘om}p4?$̓B*:hb P -u1.Q~C~NZk9E +LLЏ6Ge%ϵH[a4W'<_ @䎖gl]* T336t~]oOl<2e8 AE-}ǭ%HA3Ag `y~ZA`e#40 -vPrһٝ]p8ꍣn7GEꄵ.dzhu>Cx/ Áю>Lcd12>1ԿKC5ACK-7Q] <ft/[Ɍf߸obҕ^+k8ҫjqӬ=^ *ۥ;645 &I D1ø93 (zV$e q!d k$i@loحhˤ--$a\>og`4Df_dQ_y5`5L0EmV؅oN0^dx]k8a "51JޢvHd0, Y$4fjA* On&^=P IA!xhϧ8uU#, eJ UWs{dYW q1  X`B]Hjw`, :E`~̀7m :L)8`b g`& ^h}$qlmah}Ѷ ȡØ>騋$MakL0#/iⲜ%z;-ǣ-](I-/alqQ= dtq xW|gss.ib­"n9̵8Q8hIu{d!ao*OH:wdZ1ꆆgG<;i.^A.u6\3 sz~6Ԝ1R6yZ oI?d: &Fq lmتmSsp fyퟸM7Э0t[=^RӋ"/}C{F[-O} -wXE`=\[82[,LN6Ek&-"6(.Ez7 8d"k`fq=q/=25'5S%u)V-x~sGŽ"dpw P=ݓ0?nB7ٮ1@'"yHPj 3,7co?_֟A7gd{rޮN cs-opYr!]J\8& 83&E:+@#yjw^4)jo~`n:.߶{غu(9w9klq?>`hqX]n#oF=J/S".N˷u(7iFvƺ[]Նn;?WF q:a^=C/xt!ND d?1(m[7̆`?CtJ{?A{=W 9HglW\+FW8߉@Th)WNðI~5ܣBۚ\˸ELX jyD 1uo),I`֯ZQbjmѶKRw9"e+7#p;KlOB*n2261\ɧNV1r{3AGn;}Pϖhx! Lڒdί\S gNa-8% 秈@ʜDgD g/$n+9 qU֜D a}vNBsT{v^B.G}+WbND1C@*! s $ 1#e|.@5lmqN6$8EMK "YaxӨV~[c?}xp ksy!p+\-1jzVBH|Hirї«H.qDIY{/tHK8v%4a "]^%р+~ [hI ~/u*﹣V=2~HsrØ.f>>oXmP[tMEY{-G #nWu<"77#]Q" 5}cbtXVs P#磮"-vMu fsߐ[e@,G hwJ\M9Mq?r <\wSʦ~Q-یIq 8 xIgB`JyJqŁ(.%B#鲅LgcFc>fl5'3Jiq~׋HE'<^ +=I~/h>(Hj\ Fxv"gE-{*2Bl~q~.4iؤ45lR7M?37i0̇awg4\q|Z"n@Ѝ8ZIݎџt# @{9xGg +޺|4m@',k ̮՗HF"ͽF/R3 uи\2~ϹDձ8pkx&d<ϒv D6=/1|@ m̵(S?rӺeQżz¨RZEDZK.@L dk}\3 gw]v&:V;3&z ^b@KE~izrajz>Aɪj_|,QP=M7s؃ljՏvΓaw+FOct+LGVVw+K!7]/7ZRΆ[?ߐ׬s(hknd+|yOD^6!L?>#Dq)-:Q/?iWO% EΌ;xcQa^C;)'R%8؏jS7ɃAr:tama}tZ>"ܾnWoqy+ePve]?lB\V|"y-ȗ nwn;wU|#_|}qMt"UΞa*O .Dү&}Gzx$Ջo4kߪ2cEߦ{c'y\h [>T IG̕H[Le"ElzN eo2Doe/cS]ؾO옋M"c@+|u|TT mO?v;AD' ^(|LgAO=TZo/˓q,͇ bm^Iޫ HQCAaT⬆!)X%wtS;Se*,{f^{v^Xz_\00M3M?:@h1IE/*hh62 Ϋ1;ۏ ML6(Oů7䏱leT>ũtaA[->u{ nIoCs2!5Vyd^sMzY9LT)}+BAT;žfr.moVRr KMV?ꐆ |1fŇ3=Ŋ@c"^{oH?eMS֝bC9(#6$1KpА.PUc NB"T~&z[_4Qs@)O743tJ;bq|օ햕,ҞQE*9Ҳa SM"՟JeNqF\-R hZy885"viXhQ7_O}y NlIz_G=:ztkhzG45ĚRD[ sX*[iZJ")"8/' r@^yDϲ'Rnc>^ k?o+KgG=jޙ*P2cX8ߣ>A[$}µ*8w17C'I]jeϊ[L-X?w0pIqXԏk@LZ\}1߻ue=\_lSWIGuUPDjk#g[*E`c0B.(DJ9 u]vl(65nݿ@%7` Sx|B] ?X@=eulqi sˍx !GVeBRbЀ2xzw]{8 ӢJD*l2"!`1&b0wbD/6ea &ZDO~VVpe0P_ʡkןV"RaFsPcпb=V1";F[Ả}MPw \Jo = 1q/Ċ λ Q^̙8`2%HsR[IU"̣b}MzwZԊPW,9ή(ޘ) օ"+Rab?P tB],Aml'zYk*R71_pB+jdQ8l~~= a" 1.FÛ(տX7EED$:'en[iK5,4 wd&,"teŁ[94Fa<7EVԲrbq;3cqO:2~2ƁWj|EӪ<؛g`̍4NQq.DȲEB2ad۸{=a|~UdT YqCLCT_( Gq_?0>5^6΅PƷu~ \$ '?:# Wpx&h.P?ǭ*gjZG[LڋPZi߶+7ֻuFrDDdX-+g]$~t@}`5zo¸.fƅ@cu 81S4?Cp'T="/SBg;Q&c}||jc B^L{z*TD )~eH%]$Bi]} i= d%;c$Q&{=F?%P+K _&uQC5_wtbԋbz$ a!,cVnV'`M$pW,wJgm~0Cga0 Fe=jn 7~O'?KH?)ia+$ l}z#9 !>*EJ7gvt1_tb~)_o#QcXXXЭ2tƒ-GJ]?Cv]g" Ys]-߷ Bv]]}f:7AzfB QB;ITQrfን?4~*>OEG]i:m 5D)+{ti%_f$:ު-3x3WDz=neniQ˧S|Sc Jj?vxD6P]\=tvW  <~Xr}"ê=(tժ#ޗZ-"NRw-YPoe.U,It{a?iSΰo#\QY!d10é WNO *,\<#^<;p kgc}cA@?!֣6?=G &>1Np7Y5uEb;>DVC=Gr<7S>?zEMWUgk&e&NW3j )]$re%:ii^Jg*RSk"F@ !RlÀaP_;r ,.g)-+O<6 xeýηkZжt4x?jۻn 9Ԕl0gRD-ѫk/|jb5OO-;EI^&V\3d$h2 Ź$To7C 1  üGVYQX7[N< 3Y^RQS|`Ô3E8o2zB}:N fn[ZqCdÏ:$E֋!$X Yl` #޹(*?vy0t.(Mc iR5T`t`t,yZM&H3vX\Xi(`%B8uWYYΎϾhg_ ce&EE*7{J|lȬbu6Lrʭ1%/ lH1|1.^Ma>E1/gA/g1z*HҵyM0]5eH{LoL!toLR pfLy0iT~\Ӗi 8͍dhҀF ; \sjϢ? 3>oDE46̳Rq5^߬Q9KnQnF>kWS7}*yCZwՠxSl>`}#F<Ksea'퀤'*?FEf,[ Lu^L'4\/N 鏻o L=yOzOǗ;ÝODR(PA [#ۉTYSJG<})^_և4oă"{ؿ?,DX?[A2+P`VS{PDe9XRs؇5jG9+tDw{Pq,&88,deF) !!AqIO;鱐Nҍ>cUl%+b;9UGVLV̻p;~SĔa}ZoOvj8>?޲~w :?>ELU᱾ kP".迳@Аy *}'Z*;Z=j/K2\-x`)fvfYQq@upYJigFRk;#hpDžӼE[zCi 8w 'Ij: 'tboD]]1۠@.Md8)qt p׼&d%Ŭ&t4W*h'v8 OT B-xYj8SeWXQ+q-¦$Ul>9M=zšne&p4˜ ؤY_<[=!aYRSߺ@NSfga\??h=M-r}v šdKӓY?>[ [Oxura/VcHm2? 㗊YwRMb.[Q?{.%Mk/  E'2hjQ. k 1}TIvkӜE)T;q?-J\ǽ7Bk>̹'_Qbwph¾g6΁ucZ[3gKrߵg{ d1s^T/ZԊAN;d1|ժ]^:ߩoŷƍJҹs$@pHXl4&;2Ȏqh{\*ź4?Q iB-q4oE["gfXTp@|fuF(ŮD$[1]@7j0?]ig&0T/tYVO?YKA2&8LB ֙m2}ú5¹sY\8h`#*-X*T:j橼+c3rqZ; Co@m8YRB^\:m=-aTs,Xϊc1N3x ȧ& F`=-R}TYJڅ!Nte"ȳ D8y.fHW%)ғ%}g-g>KZqa-+~[jbχgИLfCns9qrןeh#}JM=U&%i--%OW Mo7 hIft Pڃ6K/o"mL!l$ 1{w &Ms(xM*(uXzI^@0`IvYKǾ (&mH<5.Qm% |\t@&~#n N $(CNIO% /Rm;G^{:t))zj"BFElcm)=lM;pdW N^RDfs`}!-+D4)bw-HM]hwtE l4墌Nl0 0EO=EY͈\DHEOgL^:>ϓZ-"=6؏AitBp}U Ǧ᏷Rz"x_aܠo;ta)w?P' ~nk pȑ`?| p|/ScƞuԙK3nWϮV.ʛ78[8þa*Czm} `oefQ>s]Lg7)zF? 'җO>Jɞ qi{=GgDyc Tp=p+Oz'cYL%gz׿iIjxَJBvǍ/D(]>봖G.Տ˸$XĔ}WdkbSI I<:dD"ۏ=7JH#?z#鼉$~Ic=Y&`7C~6" jq^rO-o]a=)NUl#LcRBb+98FX1x!$;y}̜~:9au"og\-`cٕ^B67izum.T$?߇ ,n-pgϱO ̷OT4í W;(뷃wm Z΋SmcJyr9+Ō\rY>U~?) C\UX/WToT00wm)\3,v1Rt%1Q5u714"D0Ә*f1S! "u3bK]?.BȄ,O\%и'{̖#c}rpB\+A1H9 y9FW' =JJ4*ncViR9]Z 0WԤp'6ѭjvCCk5dMcXdnGW/ac؋cňKhQ'GOJIcۼЫ@eGIPT"zuUEAI *u=n;E\a>n0n+VTφqbnܧ*w7KqS}J504C\eIC~dPž dii`QV͍@"q <1#N8E8ԛF9lK(6pY$K<Xty[{p~8COͫP"AO s]_ٺ?0 819x~xLPsN| Hy)dڠvs\I qRlN8vQ4BT5{8=7mA:Zex6'S _J`B.V7C\5k'7\%|:FEcU&&TD;i 0@x78N_f+3M4MɍX $PH0cY">zRs= 2R1Fr&MWU >Bb0qyQo.oùʛ [ *t~?~++[oF`PcE yh{M桉Mwp=Mg2_7ǫu_]$H0xw'Y%8*m9-+|rm1BS[jCP.8uz/fߔ"cb I6[e*J!bí4V˧S8װ1\ :!p!ʈ&^PP aŁ@q(rhu"E`Ĭ[K 98j =xg7N|F0%e=ũ1)@Gx98 _5 6đ?j' UՅƏbt#B$UJ\,n# w__(FCQr ;Ij/iB3igKFXYEbL b-B][z V?Xr6#Ց 0P2>[jq Iv.3": ꝑuYU'E'ۻ PHRH "01,V[>q@8m!͝g)0R-bpp;o:IZyzTJ2hvF<JE3v[L`R-T˪=, mYՂ]M*L-@.pBNi#A:Z4Hj;l؝"e w F:^PY)AcְnvQ%DQJj!kY^ <|?fp,';9h6+ ŷ.\ܘ{Qp 78TY1ERQqu S,-.Pj^8"G3Azq&XtlXa38%LJWalieӨ\=i?Fyrb,Cb'(UHRU <2ip s[l8n om8_I:7f Qf(z\0 5 ;0Q.@P& Y%d``M.q5 t! BXߋL S H8I]K$rtD'RDm.P; 'p}jkOw}5H&>Y4(q3.լnj 'ds.I) օe| PUm~cP\-xP4e~ 1a쩼B 0aHf=`--`($Cۇ_5"ip6Ts64a%0[ծ7Ӭ Ċ#8AhZpc4l0 G:}|hJDp}7n>پ2:ltQ>z {gn QEpt䈵i9`xB)K0vArNX^,clʦsḛ^Y -E`Av%!$!B!6΍!JƷBkO:0;FW99I}ޥ_¥%u F' w;{Ͷ^8OedxPz]@y|X$b A|]䙃߷ĠE0-bzB:jsd'/">mKVB Y 1RI>]8&Xzf:kTMvn X[$Xk]?hܪY{[ 0ӖLܥ`fj +'6sgAz,Qh2(V3_-IZ*udR/1Qq]f'C)`Pvpe.}<e^%Uݑj"'ȃNi>RC,qt*h6WI;NTIܘ,>pHH.KTN ߩ4wv)FN#wSQνq\CbY54 ic\80]Qt%b.M]]0{_N[ RW3aF(![2m2os0" X?^g۽>.ݔ>ܤE>A|㦘hDs*ϡ!? -贮tVG3o6fH?)GW92mʛM]35Dz1Q T:U\{ ˚Xϙ$\SO/[:FW.2Q@l[ u&kd)j;wsZ DjcoF,wd8VYAVeDnkWSx+gCS[$1Qb1%v?|>liLj',U.Z!Z I|whUHR'YxyhH~\G#2A\ݐԮ k;‹)|3,{~U"i#Sd8nE }YfE֊F[n}u'6 i)ӿ)GDyV n!lbRǦM4?7Tf/2nޢ}nNrٰTuNA;+H[,TT?QI;iҬ۳EYAynޖysnOnUU Q-X8\T_T_)nϱf sQ7{Ţ`ᗝ12œ9c:۲0Cظ)ֈ*M?Sw_f:kG*W^ \}}[xh< FhUF o @򦂮h\n| d UxX`hͺ (V~n\O8i < ij>6_eԴN'6Y+:}<^i_f HBzɞaۉ?[ >-]igxPWo-,~8z,>t?L߻;3%S+1s7|Oݠ#d mЋ$6Ruoebaebi $v=|m@Μն[E͗pv`|m|^MB^Q@ZwKbI:M;8劐3o - /|eߊK򛣼–~swD0Տ2x h*̎-́\? "$ΆCx~-0ז@ۊZůĄoHo?\ A:H׺).r"/7C[;0on#,= ְnb7wF ͔5uCQoAv87OԂFqzf SdtM !MwM- ziKz:0ظH]uT' Ǘvʌu9M6*#s¼)$BJɒq!BjrYi}"tWK7dh)›t\!<}zp/+g+. @4l2#Ҹ!ZhV-Kh-Ͽi ƔOrE&j%^UZfÈLBJ14|SaV7U ׳ KLRכDž O}:*@ow c+VuZZ$WF2ql=t,1Tktլ2X+_ NŰꉱ@,%>wG=+?5bE`P.ɩ朠Vq"%|ӅkZY\v,uN-:\%#^`QNY_$h"P4S4$B҂I&B\y|"d!mP-ar. !7Zª7zi&oL m|AC r`,d#AAQݲ#OѫQvcWFV:A7v@>K'lHE-ƗI6=D1eJp\-\>ԛL074ߡGt$DG6#pTZ 6r#6Mߟ3R|LEw0~u'&o*FMѝ .(o iu5HيCxj~)

0DePtA-sQ+\Zb1 UZKt=;Ba)V6"B ]q].Qy!{54/)4ފ!05FN7S\9Z0C~, ;h~m2C-M r y^bq ^ :KXuP_ {H6*%| ‘E!VvbL1-k ،_/>B;-|y'L7SW9۾R.8 )%NJۉjgw'j@Hm ѯ?m;Ȥ uwu-{9Ge};+^ ( *< 20hivbZ5 Bn}hݍ@mG SBھQ6 (AʿXXnʎ`G̴vZ2`-a& j9!=Ilo:E sHz7 |7zR'or/ 7=skl))TAw6IcM !mco)3& o Z[ Dk a!kRӮzRZID^9 !u7R), DjMd ?13(T)*av裖큠5 ur9oIפ~%2x0Q =y!# Ӳ@QqX7 MDlfyws~5Sn %ZnC /0#l>v#Sf'α,y\Ӭ&d&7҄B7:P64WI,6N%Ȇi.'؉k!Kl8LOcoӸ DzQꐝO?ydty0X8 @QYiJ(S@Fm œvM?뢙Gjm5=L+dyREys۝Pr_XlMSuԾ} ZT^- v,{mA^iOwX ވr[Â}GvibnEs[D|;v]T9B+@Y^9xU09py e="k99 s022}4Fl?!zc Q<,-WG$YB{XyX&HVu"= Z2ef\dT,mƾE@ɸ`;$ Ӄ#@=Z9Á;CrsoKaت{õ-q2Z*m'__WW8Z# gtNd]&;4͛~lGzwh^Z35`xDC& $ S9ͱHX QdYi7H/aO[rG9,b䭇 %#߮eU^bIUN#3x򈫕PF]v$(JMkѼ7.s_mO.5.Zo[K|^a2vl^ee{~9lp=ClRWi&fGfXhHHQRMZI>K uX Z,ćH+ R [ql-Q澷fRS0bX):r9,K=spH Ϳ+HkHOAς;#H=O ,_ =i_nD {,/NCް$SuA97(DА凗'&&@ʶG. \7_nnHEIL4ŻoBp%\/A${2>TNPUx}"$1 #yDK7ˆd9#xCnAw6M@e1RI-eHbKJeT5@cf|m~jdO/҅;fXAu̵$Kb{ay/1S>5 `p';'VvMDu,o!el|Ւ `x!y{'J:ZWb_un[3_.5TSs@bnW^:1 eòDHWHk]tqE$cv9L/!՘] 4I"Щrzozkr9aܵP]񣭾zHAh)в f',#7ާs|2nLbCQ#iC >y2C5F1ϱuWjQIawƒu'(}|y2{LV$a׹>Pk]H~tG !*0CP]tB·?}rfCP孔,$QѪ&x :3Spb_$ M[HJKVLhS-NGx=IC"Zk6~< b抖A#nB.SB6Q2(7;VS1=1NjalCM- ^BlW%ޑBrW0"S-v7M>-@;HASf|ʎ=|k塵sVVi88CģmuwGi=߰Բw&O0_EWz_%[U~5nZy , r6% ys/pY+҇ړ#sHCZBHځF C(2WB3Ju9b6[E)>kV} ̯^LK rS[yl@y9\?ߐe`"#/\ǶXB2,Fe lY^c#V==m!7Ynɰ% m* 62v ).)~قW3Sr B֎@oVvZ( "x˒)u80n!R "s!O׾l^ݵ71D}Z!Iឰ.;̰[ l sFH93XFaI<’ lX,}zwQG|s PʠeMœ6BVtY!0ÃG.xdn+ܐm.zsxU7@h~OOAt$ߛEO).ҝ!ڙRzUWr2кha^\z/RKo9Da2GCABW^M}k#_܏R0aN)|pYW r3^&YdV:d fd|S2HN #ch=?ǁ \4qUYfZЫp.0hfS4{et]r%4"y4KcHH  ZHC!~_#=D;J,bG%2nj!yb/r-'bn7.8tZf iV$:DcGHegMɾ@ >ʪRyA^IX̹p &*܋ Z?sa ƬBȆI{ (!֑̊3LB]oD$۰ 8 e1ncIWɽȜfSni0S0CU~Ϥ YV!u^"C\;|h݊p9RYZ[]} 73rLdPHAn*c i68Hl5WU?ԬP39c5w #M_ 5E(7pg!2e=D+&%aMMDŽo?*rõZW\0sU\PUTYK#CziqYJ16֯7h ׻Ǥ_&3VA Udm%W8-7ҼV+ B:Z5a삄f9 c&zdN/zV8#dZK˃ 7^dH1܆f(%K|]~ J4A[ցNCӏTq0Vs-67<^Ubx,+{u\M27w-ѾyU*nZM>Rڠ↍&U47Lm+VFe Q d (IrBiQe4;S޻CUBRbc5"+NY IUp<ԌiMv.{Iu$l^1l 3>yx|VDg),m)]ppn],߫0G)Code {UUݲN}1 om]J3=u-+'bf;ˠ6EH s jb1o_"1l |wFFvo@++(Ij4H'#}W:q At *؊IU/(بz3|jXٛ:vz;/ -ѳQ ! 2pl 3q󀟠t؝w! X29иʙɺ,(=G:^PR1ٞ:-`=4Iobl`C5DAt87 CmkowP~"TKi<,>_7PbL`T+HA HN0wa&{Op6.']t֮WPs_1)7p gA Bv=vN@;)Y@EIJNNFq #>}EլK]C].ح++7+ 6訙4*Έacf3v^'尊?Fy<@H ؞2:y5lB yHgҠ̬ZoQvOQl8x˞ؑF¦U2aePal R{=ًMbU-ۂf77_j_J5@ꔀY*T<0;EH KȚ@Ɓ+I\CtSx޻r79u&5㤺W7!r;OoXڥ>ңV&TVmǖVЍֽ3hOQ8V`2{67UppG3=Gh E d>$c5Ȫ +mfZ ĹUkcI#rhǴPCxijJ }jOTXyp1.aF9o j 1}/IHL'bŨ;]vaP3 CB0K,S` ~rE&KM(ͅg\/NYZ`j}~2 HS>?Ytn Lފ5;Ց9°U7#!þ+td\kO|ioކtIgB aYWmo81cM; d𸦲ZcQ%.#H1PP\ZT_cWxn}45"?[/fh/mD'G1BA% ۼl7M.3S"RJ4. l\u`EL!,q 듕kT kyRiډY^kЎ~M!xbEd/ !BewCYk[ PЕ.Q󥉱KBFˍ7aIBc G i0E\zl$l(oƷCڴ"!/ͳa GBqBZC/[)%\ "Y]eJ"8os]|kVqqx ,[?Gg8a`eӀʫvJ_-'VW|ao8P/wC i%@|5f*Ràhǁ8+^ 8C#LZ sԚMϫo_ٲ:Ku"o ffjQx@ 2we #˸p[!="0?LoNHY4NڃN ^LN7Av`jShVģ@!+#3*{g-XA.B>@r3DAJArd~%D)K'Rve2IIk BtjF k6&lr/8UH! jYYh+Pe<Y s,q&'SAgUc,Ыpt!Q~K˰2 Vꛏ#~k472'hy !|G۷M@nsUm0G5Ӻ_O";mjWͤ*3ah)E?#ly| p lMw̦5 +^yy}_shE賩)$`u(ՠ/'O"욎m5@FOMN]uZfJj:'5;ǣ7>8r:#3RˋU-䗦}Ct׭ԃM, h&U&.-5 InۺaRs=e$mΈj?O)'5w>H i쥕۬RM>}{y^343~6Z3-(r:jB? fb7/iO[ғ Փm[ a{t3*\ ,v.F0|s }b_0kʊw<ҝTMn"1K0x3>;Omsb|JR`PM|ܞÊ|iɪqSB1 DqȏS2MU< Pxx3)8/|!+@(hG(?RZaWiG^h|1oe@_ӵ*F-zekCzB ~Ws 2]hub-QE 5ﵻmixmmǞ3lN(-5`T0-y03&֤br) »nOn>U8qMN5%8)N. Z}'Y q?Ȧ=é1έqGYx?_!CdxL:IͿo eV5q4L4s zA0R.B'I|dI:0I뿙3N_H6¬a:͖D$0)m ~Đ7`Ő槚W؋ogo1_AZko|?EjH@MnA+BM^/4tࢠ1p NX񚹃iI V0AI'/ (S{Zqr\Ao52UHu /h 9Hu%K])䋪^|[\qף{@N1Shy/I9vp>}?wWNsw-gdSWG*ͭ3_#X .&jQj8c΍Rn/uF縞MN?tP#S;vQlKGKlv6FzC%?գ1nW 6 (cTD>?Qˈ7%y>f8Ϳ_;3ķDIwSj_d~߄/5io{VNoZA&~ Da?EVcl A;823 2F~lL4{DA@@fL\D~P߈ً|Uj=^W (oF5vH'IycֻHfd䛞YaG榌f!٣1W8j0mY[|_@[O=I8*` DV={ T ϻqMF!__ <1Ʌ}45`/_pLp`)7EFl;_J|'j0M|'eR]uxT"UAΡ&Na=p?KW);&տp[rEHHU;`ƪݚ7v_va~eZKsHƾ6t t,jۨm'$ñw-0MF 49$, Ia@5%u!KT|zPA+cgh^5(85?lD ?j j+>{%+t//'DǂSz))9fj IXd9,6&a=Ay 2OfJ6<|+0 a|h1&4s*@j ˱꿩)6fVUI@rH&oeȵMN+Bi Oi2|/̷5pj_OT[9w/nVtDA $y$ 5e츛M&? N~¼rd/7;@V3dVqb^9\;P"jf"${_P{[j20 jeȰ0c&?+'tS,ȈqZtѵvU)8pHSQ?7Hf@<g#y\?+,MM0w0R1l4|v 0J^mBÚ8LZmdpmۂ*^aXZs[qqp2><6[ +u ȃU2/ѝ|{j}jǾDU^U/я{-)o T$p!iV&Z1E3cf.q;J;Z;+6k@Y `tn[F4A [+Psj!!7j5Jk-N)؄6َu s=;=#Szz-Byd%fgbUƥ5qZv[X6[7A58 E ޭfAAL g5 ,[k[1 qM`IҾWoG9vLw]9}i[fY+0ӿX+[VI{Ҹ@'|#8zl~&Gˀ}g,u͖c뽼!6dkK+A)}O6Yd]8`ru,45 ׅU:NCt`')_{f E_(e&D4^tIi%vtt\z9Y8ck5@VK/Dʅ&ﭭK^ ']\b8-BJTsōHi1<h䓠Tœ{{zz@Oӑޡh]c(#Kc#VM "!%7ghU3 ZGyy $|s ,xyI9C3DwvYw<$72oޓWqW/?EJF$sN'7}pճ Xa=`:uu`n]i\SY0'f6S!ZD|i&FS5!x{ FʮFf @H(7ZoMI1DWqHT / 4;u5Sq-:DkAW$EH"K&/i n.+3 ؂=HF7  =аea B,ɖ/)WVn~)eP)+|M5 Xme}d.y|%H(; 5݄|Sj bdw%}:ox>P-ܠnU+m;^7f҆BT 7oQz{if\Ϭ#6 9.{Oc@q|^Ë_ˌ(\^W` (,'k2^K|Oq7;)!$xm[YҮԤ+ib_b<ˈ7z(Cdl \7XZSixp}q<__i  檵#zr߬qIW 0m- T,- !ŅdD{Fr\N˖Bc:A/B+|=M8!_囎N7ҩgd@m~7vÓ mxN{vBہ* 2f>k2Cf*G+3.0ec#Nv @Zw;o諽EN oҢxER^tr3^kӝu\r|2t^?^| Rurr,櫤}De~=Ӭ'~J+S/e[$Kt^kj1{-.!D,K.*[ɒ(>{|g2ky+,A NHiK#4K3Q]O:Hh4X*r fDUQM*MP!ZhyNWY7Ð j8?-~J~fc,IOʟ?e]o%Sdفj=+9>VN6cK831O6l3alQǤ?(cHlTVc7}]﹓PtJyd.xBxjRuѫ&7am];|yC -_fWaEot@(ŵɎD#}<)' YH9֏"xXO"2"n<^6OGXSd ]Ҿ0y}܂w!g\ jZ֒}\xARSg4B 4/BP = q>݀^Bu"Gƽ骼O{Y& HԩN#lC<Z Ȏ:#j*7-;rC^;rLGU }YӨeM!@l[ʿfh'5;3m g >ytl| !j 6c9.5?Z co]Iv?R &2G!ED8A968Sk)aKF8n8 @jB΃,eT9N!KCi #sffz^eH'Z3 yK]|R*G $"Y7 #a/lJr<=gUwzfP1a)LB;TS;]]ʕܚMΙ]r?DoVZQx!K“H/T٧#|Dkqw*u<>(7&Yk2{!$F^AFmČ/$!h"sar Nj) $$O[/_Llh3(_]!.7n` 7՝OLz]bvOCc1܏ck r{f=(3BjSqip=˖c/Te PYkfDŽKc %#! GviZe೷ g^!!Úx4)2"*P1B692fnBoJs>Kw)79;2 d )8`[),8W}v Dvavč Ѹ'mc9r)M #l%&P_46/>tfFPHAZFlu3-c+^!Km! vGk}qbmD+3;*h1Md癮QCO; dZi2jk&hV=[ޖ8}K_C%+/P"!: fg!..tZh%E39&bݦ;sުw̐< tHҊ8=P!t_[ck>#t)[/,5ɭPE.{P{=fqSj"U.dܢ$J8^]w6WlfA&%e^R7ƋDG5׽_}dtrY99@F=L!?PfH ,1Wq\Gnv%/hɚ1|cdio+u0Ȏʚ _ʙl=ZVq MA9C8fB2`aL$rEk N6rEOF~8\^` fs0*9x<#|}vf4%+Wɮ(K ךÅmo{`EjAt}J~>DU=Hjn^dYA40-%h >}3 neAcsnlel⦷H+&2ʹDsi#qKtm}4yezpX)3&̝WRa<V*KxTvݥ|oŜ2Z<9x"DJ6C0Ma Hβ|^|7Oؠ<&W;C"*ߣo_kɔz Mvb<~" Oxb".eɷ\pq.B}HB%. Pnƅ &O4%/M}@tw5 k\k7 :b:PVɧbf3B8۠\|t)r3ej6F!M5KC{oMcҥɿh]e{Qk. me1SZ4%&*B3%Lᝁ'[7%4a4vzV,IxEwְ*3Iht7,;B"!w\ H&deU&G]|~Vޘ"o}Sf׿R`ĹG;I6F+hPi!tDk;܈h!"'iJcntXEډꎋeJ|17 &e$y,z>1 Q(J'=7'tu6Kgx!ղPT[vtt@HU_N"T_ВdVK B7Z!z/ZXϯm^AH-d|R%f(̐Ej q&J:zZS;水Rh1bvxEHbV0:> @:+Nd)2EGjeoVpC/>MF ܈ !p"G^G(Dn LXpUh5ݨڐvL}8,ZbJ1LVlG `}C{8lwhDħ #-рr#^S}+$kDa!hw#1\n\=c9LLpD/7VK ? kqȒ)9Yyәt} M&v_<3#eebZZJsehuG5lds]~pWV#lVl #1EUcq<,ąB5ctD&rͳv̮rUX/YxkG$ʲ6Wgy,s[h4d%Z߻xBl6BGIS_~!K2fnXkk@a5"hw_>bSpm rNHS%Jэ&"&P˿íT_-G'ۍuf̸vv%?Sxp$\J їϙݗ6Xs7~7 CJ Y}=%F cϒ'IJ_=پs>?ctB+9aC8=aC8ˆA O]g2J0ڟY2!a C|ie`UjᨲB@7[c3P/pi2]czƈ%i7׭V!!4~ t( #LO]9(Վ!,@U~vta Νŝ$%xɎ= ؙCŴ̤fhf1%<#!o-h-(Ȼy^}{lW9̡$SCW)*֊,Eڗӆ R$ϹD6-}vtX-j9 Wo_fyxjr[sw&a}&'z `k zʛ L;5Yx-Tx%C.Ñ[>gRHNwLYp'tg%;OOk6|%Q7Ǻj*u?O%)U"%9)dՓP6$?fav,F.HL͝m66p( gXUP'EI1W%1O٠жf^K/7ʽC82J *-\󖚍acoyܨdunhI雍f.? 7HGC~:S$ʼn6_c*Hm]'K֍T4f) =WWq Ku=! 믏Iw0MN‡F%-C֭Tl;Q!ɏ m9 Y\Lˌ(2N p(H<1q"7Z74iC颞D[9bRŌzzW͌*Y @\P6Őj%%%R$TrL7;BIW^E+X*#1|V7%oJBS­ӥrv])D--oXk-!{dX3dsZ !l~Ƅ1BSu cD;rDf~<QuY<;OJxeO]H-Gnw/xVx^{/U H=ozn>Pk]b̮aHi]b[!۳{gX2c'f%*w?S}~8g$S|Z|5TB`V>sV)[jDK ,ia7Bi;[$ܮ|@)kt|0󌧵'j Rh-+wzx[]1,C T} 4)y04$D޴HG{l~} _CndѾKn}v݊*D.hiOV9:Dk5:@(- FlA7,Ļ9 0/IɵBB YWc==;Efikzp,OZf9%{aHql9eK.lWGT>fEM5Gcg됞(=jǼ ǯ&\ iߜF= ##S~)=jqBVlw>uaYXӊhD@l҅F#BX5DJXp=٧=ٱ'e֓{R8`׏<Ό tSG5*s֓k-N{ZB:򯫙ʚ{ȯ'N9=3ŚVP,<CA5jTȐ/]s1a 1#BZ+v/35o?vd \Zc) 5k7hT@P`79vw!*i<w<6Aٽw/KU;Ċz3b]Zw^03duJJYp@kf_u x ໼% } ? "HcņI g #,%ϩ5.b 4.fF՘#,tڔ͠\W, 3m^{S#<5+FOWMX.^5S kkf9O'.3 %]>YZy<`Ю ,(<TL4\["h D]anq@5&nzT?zY߫.q-ZjNqeޝL1agG|J!@Hyx+OE> 805w;5>kFAw<(ƍBvl١ErЂqCWOZ}M+OSdH dZeGFPIͥч?jy ]o~5@ |S ywz}Ux5ދf)WqV֠%T[ddzR\YYr#78T:VY0&p^0fzdOI@qҜFEHG{`3]nZT2CT2" ޕ7;seWGD#i瘴I!(HQ}M0ӝQZni#c3R_^ۮ 1{MΟ!Her:}8;dUnLp=x1kJmepmTíҮ"~A"%&Ric+.[iӋ2diϸmҎEo/-oȸӳSvj$nm6W&H0LzнM{) kezC~pl?j}Bd:YS+Rw(j!Y2a6Z!|-ok6]A&i !DY!ʺuU`hn06ھ'mhГ}ړ^=:e\rV}Vl vV,ζA$uyƘPCѝnwE0AV̐ 2x,4rЂUdas8m B%ǖ,Mv>H,XjGh {cS꽚#ZjsI| }JvL|7|#F *9ჼC-P7 r6I4&[Y*์r*y< ڱX^Ѳ_{{W W@6| ˑӃy[dzc1C{9 H}}tz' Gy:! PA'trYD=ytX87KyN] ^wn(u'@*trQ 8Q`|{XFތ/}ЂG/yD;׽<^0Uf=~Ncɐ.6mnhmĵi*W%+0_bNFQnOnPpr#,T:Yި3Oz, I5BvVJWJR̪i7}p-; yAe;[*>eq^Yj*jCB)+6Њ}0FE7typrM&6al`B"? ~ztտ[a;`SAwCJ\ܕ[c_.{oϐG{A4B-/;U+-BlpF,hUU49;#xFl#`mGPy( jP[#<Ȏrz-kQB@B}PZF7)MIn rF< xH :5jǠv 1jǠ!;`,%6iӈO/Kt\u3H?32! π Y^KtH`N-jy P 4̟-,WT Fd!jP[!Bb B &#ģģccccS 4B  I I:zzPNHX|DzkDH'YwutvB@ ʠ脄Rڹ*\ S^S(ݡPS#Ka3R)e2JBS(y O+J1BLBCBǻK2r8-ĥ|e\nlbϟ]~9GwwN\ʧ&fWO7N-M|AZWϝNqwj"Sqj!_dwj"3;L=+ݠ2{QԍͳLg̝Zb,M]ۦ&tZ띚XoM]ugH&$#2Oj"SZ;!/MMdJbLڶ*&iLڶ7bX K 8&dmԩB BΦ&b"FR 4B  dqj"{D !!D!"B=PIG@:rԂSi4@:jΩ .(:rKtj";5!DY3˩,;ԩTB* gSY>ĩ&B^LYBDSYkNMD_;5lBp]0Xl1&^Z%:5ﷅ85SkَS XȒւSY+薵SYҖSQnZIAMd:[NMBDGp׶c(A- ϩ@!G;GT i="uo7!!F5{i ZP_$Bҗ!J(ģ=dZ $ $A:֡N<==4{}7J:EH5D=Pmj31{ jSQnD%?3q8;=Br:WcX\lr<T_rr\GZ.1r[_]9ݾʱ]t}\nBܰ-;;eHѢ -HR߃=IT ;)H2E(  1) җ*Aָ8],^{\7!bjհ7Y% T!dD&4Do&?j/l&IO2 Qcz3lc/ϲG8Svynm#85ʱSّuσuԙ9S+p$3O$&85ڜbEĩvD:c{2Dڂ: @ZYu(J@B:ej=ڜ:3f T`"L@Jh{'SmjK$IT[cr<H̟ܱA ĩ+@bJiӀd]Zz!e|o!F}!BX2fps#M_B?굤 !O/PJ|׀Ps#.@#\e@2oA$B#sֹL\V +`,WD6X2?֟L>>2x13vSvS+]/N4#M%X3xF`r1b4T(= ~۹gbfK.Z?ݟGMQ~|??|Ǜe Ǿx[mT%h kTo\/QoԣSb|Rz;,-Fi-oIX5R{~L-T/5%jL5囹I Rc,#Rn $OZN+ڙ Ocl'Qq5\l7jvn=m%v}>?Yv2ƞlEihS30> endstream endobj 1760 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1654 >> stream xT{PSW?$7/TfA\۰P&pQtjTX0⣻<*·ؖj"+ Rq;eΜ3ߡQ5'J-gO ŻDX?<,BۊJC|-5)*(6s IK-(,+ݪW Tl.SF8/7_.lJ5ڂB&_\RHV+bI* d%jV|U>%Bh=@J#{$C #rBh!z -Bb.qJBUS/m6KlmNh肘 JRn6Rf6+%{$| dz_aĬ ܡPvZ(q C}} usΎĚ>2ގAbؽܚ t7vJqsZK{N;DXpʔ/O&ζsS*j`#G+ԁ[Ehwtմ4^[FuCfکZj|D)lF7B[V3:ُ1nIGv64$;W^\`*3H|ք Ҹ)ZZ)/;ڍ8݆+=#SxeQC$ ,i7JL| YuMU $ F?{Xܿ%k./t_FD$Y](™;}|2S3eY[4|QA,Nbed,dATs7*ޘ82~bTpn3<+! 3!K$lܸlO/եQ2ݸaTtTZTKu'+}`[ -"~ƅ&W^^qOUu"r͎+)0}j3ݘ鿙6yo*9қ+bG&,&ֵ6' qis" O)Lp ڋW6n> stream xZY6~ϯ0J\k+@)m܇" ٢WZCY#//YG[h[5|3CGF#m+#kh4_l4] ̓۱ &mO޼yqٓ_MTYWj\$Jgq4|fD4)Fሰ9 \ YlZ1PtCBI$$8I"2&p,>HiV?8Q-MWq.msB`I<M1W`+t@kk! rz!6ԁRcȠ,F_vITyTS n| M*MwV:00b(|Г m*eSu/rƣ*U2\!>8Ivq }d U|ƃ&!lyx g׏io;z/eu {yg|'wĝO fz*ESn*;ù&;S A0Y Z zjUOk\O7K=UxL`rYmJW.Бsru'"gD9ZoګAbrkĚ0Mof }9M m-W<5 n;3O,Y?~MP,Dԛهi$LծXXZUrWEK'i *i6;fڐKvOxKqXf8 ߳@QYh9x DsVasjeO]_ARxGax WdGd*Y 5M3_a]JڈU"%T._Bacg XuLGZM>JR7I8% z5keZdIRI'dwksL(; w\zg,1nfC6kG_0$tDyg>+-sM1k9k +eOD-j@Q;mt6WQ^R qR R\ _3~i( "ȠY*%M-%`0aT)0ʹt:&e7.hC)WpewYؒPБ'h/9DdNM{PuX"}v*CؑOsVa_ .+ qqlRŤIӣ2]5B:k^ y endstream endobj 1770 0 obj << /Length 3924 /Filter /FlateDecode >> stream x[[w~P*,Mn4g8$D[ܕ)G~7ݴ/&`03 ήg쳓'̌JgW3gښ 5Xξ+s_1*a\ԏ//\\p5V|ū_}ޗ׋D$ i'y9e8&YXw46eu}vzέ)L?]Y7r&_Ŷb7.w qU~yʺ5b !kS-A s--\݇]]܄ѷ,4ݰݮ\]M[t`i WO" 窨g?o/VyuݬK-"ɴݹ73D}}wo ii :sJ@0V̍IF% ?d  Ĉ#) Xo[ʷ"pGm8 9jS[*9U˸|!_uf #a ,ŶDg E"Gl ,䖀b<=z:.Fgv@ADl;Qğ逜Ёu 7!/#tsԁ{ǒuӁ,'&ʺU'?>|̟Cؖgk>3A8;:;vylqhr˺1ֲ%_Wc$,r3RÞw1+zLͷ&¤HRXVB ߭j"\On7E =r!7Y7$ ^u tOipXq/V3 +WaI͊\2QbtP3!zUj?0}f{1cT"TnF$E;$t!5&idCzD0Z'Z_(ii:G5K֖f4&)d 6]o-j™BKylI^ \5P U64 <BGTB*`Kv)ޮA8\⿩`hE)Wkw,ycme{W59RxyI h'N^r*~2hjHDg-vmeXu[ַ{x+&)CuO Rlb0;x#"MT2uYe w U1n7a1g1eOEQ-kO:ez9Ɗf%Qh &h$];vLu{ԶY<ғ]rz"oa2<ćUA1fd 6){1eN?y^6a9y$0^xQBv:mP72 ,\`ƹ`FM-s55 FVVy,Iq(9(q6okS5C}ml*Qly@Dc➎)^ElJ"UI ďNr>Ve9MX U\i7#8nq}˨Ȭ+Sq 2f3~mXG 0_P)cQvXng@=C̣Kvi$l .A UeP+<_xs%0*51^pt6]H;'&UzO*Pdm4?kC8ZQ& fm !tȬ1Ixڄ4H*Xх1'ȝQ!*R}}z2e␁ur2a  N $GXݏ/F*+0~#W uzXP ^p;G]'9JMR5e_DGM" n C):g`m_0t\$.)fsܴc;vZwNLn|T6 7SkaQ4QCCXFbҭۥD{=~bPʋ^hg٤u8c T3bhX,^>GNv =ɷ!Ik1 λ|f>A{qgXSOs:Ww^njA\;Tޔ\~VutX=(jj'.?\,T78q0Й׶pNV㘢Nݡ$Q'1p6  ʩHCkƼ߰Z(=A«9zL4 nWF\*S0KJʍ;#b{u֠hzs|6z ۼnӆ$lb.U[ VbRքw8k+7FnWy_n G]'mk:i\,lVs#:v%): WrJSO:RJQ=-G996hY 3AYAh*Hf>ͮ1c({[wms_ֈxjsp0FZt~׳Szޝ^> m'7XOͫETݐR Ǡ5_>OA4+_3p7H& gŨGK1a,-8V71N2c&'vT`+ebpt4$Gq h2<] 1ƍ?`F4G P\NmkqV;iΪ#_ . Lq)z=}F[Ww|5wcA)gǬyW){ހeW'ݵ)qJg*(e@JA71;^bA0DXj/Dޤ0$~2rq)c㨸Z=J? T% endstream endobj 1775 0 obj << /Length 3060 /Filter /FlateDecode >> stream x[m8>HjN/P{uܲ'La\I / d[I`:LlYZnyhſϞ^QS0FR, / ]\,A"әlO^z~'S&s:\O:_3Yhx?Ѕ.o/~Yl:TP@?vFP&v5g!d>67fZՌGaYΫ ^q_* }\vWG0&ܹ0JY DH&sĨvGOF Baxv&eZz+tӢ0ʈ$B><7$FP[͋uԀta&oigHc`_[^O)lS ~gJN>g+ fPgu:oL.9\{%?K)K)^ut)/#̘6N?DSټCl@CFX޸FA/& =mAJ0ȨKO綗 ͍X{| `m%w1>fkFwθUq@UYX@YQNXd*tbg&>Jn ܸ\ v{CχrSNNz+ EVٜ(׊s90VpvzKa6 >qN:' \43 JY@ ˌbH?8Ah73 {-Bs`NFڂXNt娅 E9aDHp"buy_vFr\ށK;ufbP/50.C A#m(ٶߛf6M0@n$UMʎtWS/|6 Yg3vor&7Np% XF.%`3'F(7'%i2N:5[VUkAybLCtLEm_rHr֫ỌP-6dׯ-ffeIur&5'1uNd3sC:sܫݡP04c'eE\R)1H26e6৬cy"d`r 8TuFcFFI]+_-]o!4Bd*; *Cr|0'wB"$wQB<^me5R/jP\n^oQwZ8?:˵)Z ^Ky!)懑N%~<)Y:֊{prhV*Vhl _yz+RnW#R3P-HM \!@,CcS)atC(?T]5eEl2r!B1zbk؂vGq@(`cE/|At[.Ҁǀ.6qȭV7-e yN:Iq1瓐f}> G+3@kyik 3rif^,xͻ:+2ݔA4ukPQ6ueG}9{ƴfSv ۑ>9Lh0B8#yM syaClx0`x~k9­tU y."X͏EHэԸ!F^jy zxdyQ"sǬ6V^n{Au?s%}pY}P(djj9j&#>136 il~C\P[o=1XðdT$[kC SLTŬwWakC>WnFI󒠱h&Mq`̤a!Mx-R>D3Vܘv;Tn?5ԫ htgsܮC:5'uu Hܘ?9"{9d^3#c{ Cl"8:jʔ]ܛ1}DVa]:T@s3f =5DW5HmA@>X|Xd4<FTMo7Z~G{){C??o y.Ms}.M~!sQMe^mwj^=8=뉡 s[iBGG {iuJ)`$Kwy֟|1r9@VՆѮQOͪmu!Dž,~|->&U-7j{%+&"VN<؀y݅֔zmx]I4ͳt о|3_ynw< _I6''\n3L)c d$*=m  I@5TF֞M_SqqC㱪0D6fw*c ,ZN?6>ԘsG; T ! endstream endobj 1781 0 obj << /Length 128 /Filter /FlateDecode >> stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ07Ќ 20GVfdlgiQkldaknfu> c A]Ch# endstream endobj 1785 0 obj << /Length 2367 /Filter /FlateDecode >> stream x]۸}/kF)J6MtvgҶYr$v}Jl%֦L, >,}w?^hIn$)2qvym !D E2ca_#W OXcZE%0xgZCdoQS3YǑ'%,D/|!`dtkcxCmpށ RY慭_*˅)W;4ZDwICT~S9yWvOIw#!j D`G3(6 -O8~i<f6kZ=4xYajw+Q8lݚܳq8,'Mn3mN umiMk7o MCHAfHᲮ6̭=Di=҃1OCYU`q1;bJu5 Ɠ~ZPB 8 --5EQ!{O`FBJϾM2 C%T >&<]#ñF2eqس#)~T5ؠ).l ƇE 4S١i\]#,Nz%.RP]L/‡12hDŽ}6ma_1AVZz?Ə3~R<9}zyFsY;[K8'01=~PQ>h7 I1LYO\ؐ?p zC9a9oi|IJ0IUDo 2Ëua{QI?`M7`ܶ>2ANs#c(NNP'Bc&|騁cQ[9z{ q!!`|56Ww3ٓX(WcI$9C~[[פ@*{/HGA9EMxQP} @RՍGK/Q0m3p'9 +C;|rE"W^vS0Z0*Rx$p e%pD @@{4|.y=),G"y+L+Ӈ`UBL\W0ŀ.LBKpX,,{\)&n}p+==On~O58G$m*^sO0PBDyHW,2H=Y(m&#ެEiPBiu&'%$ k0/{Siax!KXp$7ߝ!o=Um,/P~6CGf?l@d8M%E$p‡TXAXB0cJ*I%8CS (yǏlWזpx,tW|vˠUQ̖cyp_u?*x=FC )fŤJSMi{8HRՔ,_R_b *ŸRtG\g1Yvru] W4ohx"w7G5$- +f]`--S)+.;^%9[V]i 7䖹#T//>Ob_|35;$|M\YO?# .>]}]hN$r8S3؇N>D|)bW(9 ap[Z&zK=Ʉ?QS뛉;y_L7C<. Qrf*s2¬jS,s&:{g!bu~Ԏ~k{;ZUB%vMQ# {?LRMUiWGMG uuREfrxuu㚦m LN+J;d\8 g6#gn!_14<4q:ׄ^Ϊ*> stream xYKs6WMO̤<鴉8>mDbw(QD:uN|0HaX|XRƣޛѳL{X)M{Q 7y~ǗAFbBDDR?}ջq xK2y2Q;)gJ) &Bډ%QJUkl?OƁREiޫ1_q#?]uͶ4!0]= ~aC[ЀuR(lsSW<]C^d$7/LWXda?P 4.B'^EIxܦF Ʈt]M|,/:v17#WUSb%B.VX ]WazVUۓW/]L-X7>*]Xuk!wQe>"1!561Et-Lg3=9sALWI+=EԽ'F,C #`*у # UMxZx:R"?{w1DSS`X;"LwAn(%TbaV16]"NB,?$ o@W"Eȼ_d/" 2"7`$Z6HU+0GztWͬpF 4!T&fY"ա]fEggd#8Nѳ07ք\@`eNc>]~˳^4u6GA2hSJ{_ ? g vp]z鷻b]-*ۡt'h~"pj }m:84'?x+f`{YtQC_l7)T@ 4  e,׫L[)hyn^"[ [=eҕ nvօ9bĪc8ȶlaZkeVT._e:[P%Oc%2fDJl 'XcRy-uє L`zLQW]-ovM(,ʔ<& ] \O^= ,"v:%`8l.mʹ-a3;x Mlw>7Mᙙ 6@Nfl*H|gl0W;|5ۙtwMmBЍqwwK>7Ȑ?+`=8|{YDǧ!DC o%[\׾p%M endstream endobj 1796 0 obj << /Length 1967 /Filter /FlateDecode >> stream xYo6~_ɘ͉DJ+bmȊ4KS M;je)_;iNK,Q?YOo^rB)ÐMV&2br|t.9ggJ{}7~~ E}9A(O)H^vVQ_6oYDx`Xm`x70͖ڧA霅REnvFnT>eW`H2/]OiTw8)x)ҳa+&kw*"A=Fl!|ۻpE̚}@nQ(&jl2e'tR"(p X0$YJPZ@GK)SSn DQغz(k?wZ9҅'qHՒ.&)AЫoyR _*|O: N_#qjwWj(Pw`zAs j:*!:tdfH.pJ3"W3*oyU'8AHzewͨO % =JYt.G>" ", @MfFUO EZYČ31!vJ,ApIYzG&adNj(\t֏ `uG*Vf^`5OejӒԺؘFJ44vʡVwe,yы t7ѽ[܂suj!*x~iFMbOF#8d3mkN;JvyV'y5jY0bA4\.zNlHi#uҭ wY٬0"t00a 4t{F[9>꾃ˀϙ pr˓M`ȓ]{}eɍfZ# }]2EqIfD QJ1K3/Ej>@v&aa(3$tOVrI=b]k۲-i (E6]LSmn{NHB)hg@WPb)(]@S+φIćhzyByZFHP n_xQ-T̼ fPlEj6neR͗t5c"v*Mw(p$P3s QFˇ)Y?DN7l>?]v#hJUo|Y1z w%jW! vɣEø ٜ[s8 Qu@-@o|"I,aAp[ș+aVnZ ˹>Q"C5"{WdGcRc>Hg tPs:㿟vOV޼ 81 endstream endobj 1675 0 obj << /Type /ObjStm /N 100 /First 982 /Length 2379 /Filter /FlateDecode >> stream xZYo9~ׯ$,ދ`; sl ?(r֮"yvֳ~bKNV"HRlůI)獐B9gq{A3ĄhA ,Vȃ^+@"UpfT;#8 L =fe"Ip sQ^?bV30"K񘒤LiAD)& 2P[ )u*QQ7 |VIAJbB+SCxBkJC(C m}Hh, !iBTy4(Ói؃o0>(-LLV%Te%lÄEP&͆!-RcD䱊FLkKpJKi cx >79ƀKfx Kf$`Z+KY*E0&j(HѳRX|i2MT#@0:MXsbleY^"ʴp8LTUoU)q5; i݋hJM åoh) J^/b "FI6}>'wD]aa2Spht}:Sa,eqFi`졥)rfd@BZ(m14dB-8c~7mQ 99yq_q[]g3N{iѽb6Y ӷհ<l xSd'JE=gKm3܄RkL7>3>AHRf3L#8%ؗp;MjèjƗu eŋfg[L>XYS ƨ8 Ȱ9pq6ޕ@O4R3lIRܶd.w4Ej;(/6WHq/R_ A'}!ru"sxUaj=ݮT<:{JLfl0ޖ""6Ci/I,ģDآTQ'R}#7{=jcI&nVL># 8iɓMHߗgoK?y-aTv*2c*Wszۻejˏ'ӫbO]/ v5y}5w&47\! A>Ӓw&|ax}7-2)|ii2idҵ1*Y$.V+uR\vv$[wTv5F:2C"1\Md*t|#$4}H[Yڮa)g&av yWkyy%-@3EN!吵ձ%wJ wgl;.6YyojZ5]bӎelUg9ЎuܟɎ'G??yQ>pЯ{RT+L,Sn0 M*R:*o9X)]Xv+d_eφ e@&x?>NކYB8˞v:_8,tـ]pbx}3o\܇e GkeĤg g3,0boKAP؎2/y?/ԙ~*ۛbp\|oprY }}^.W1L[.L\~PkЏ_w]k*tWA:q2a62ަڦ+m&;9욝Cl^Oa1^~Z*Aѭ͗1XbPO"Cq $4 c OkM,=`9l釞6ӄs2­n? endstream endobj 1802 0 obj << /Length 1629 /Filter /FlateDecode >> stream xXYoF~D!њ{Ji7(E݇x]R$͘r}ٹ9.v wُ볋K.(%z"B¸XNj?@,Z Tn'< z+|G*s/eȜ#3^>'e}銅 +@޼wja,IV]rd*#MWf䱺eѷMS*cPxMm]&2ߥ@Bs2pnȴQ#+2gU9(SYkd{\!Ei>?6To wj^t.#R' 76HD?v+N7>]ғ4 4-&8 7 +LեܫGG@n~RAWPTcYf7XX&Krj+~4HWEjXp>ǫoqWM.ڛf~ 6V=*Hy0%sk c)bLQl $tS.`` LnB"r#$8Y_saONK[0(# 8}F8h~92MrunX<=`ҋ~<]3a-ɤ. 3%s+5Owm5G"+7EN3Eޔ[T':meZGJ~E)}i:BPC4,]Bh sXr>N~ @sP꠻O2Y'E>.om@>cy$Dt@hiH:(Lp ?(\QuV¹2HMM* Ĵ.) ;{/j+lt`%]1 G’.JKdm ZʃB_:]rB..K.UՔ櫖xPRfolĹ (1p؈D>uRc.r!c@̓d$yzDΓ̓$$v#,L;T6R/)]F{&/ D2qPQ^9^mI:<ְX=`!S,Z|ghϼ-evHUf{[e$wQn>]_}e;>wRM:;Ji} dr50ORsq>$8 )3Y fa-c_..xm&Ue@d+:-BȀ6ƸnfyEaV{Oh1g󌜦R&5{X2q/P l@Hd.oppƏ'̼%0Mb,I{'ھcS 41PYx d7+6>ȍjx'ΥNqeUb:}h 62. iE=wnOUcRZjTBNS&{]#yd]< M;yKvXQTv+ZW a !m5c {v켩Kh|z$\vD Zc:e2R7?3RՔ_ds{Sf{s> stream xko{~`UK}/8ܥ( \Jw\H\{gfwO>NW\z+jB뻉29+H\I<׿zJ? 08 %Wa((Dz?!bE 0EZ}Z%U,6EaDsG$HSU1)J#UMl:$ .L 3Hf[7H͸}p"D |ë Hߐ'-q_1YUnWJom OPnU/sVVv&i2'+A(h1:霅_m8U*³vOȤ 9 uh UPe@`j K tf_av,K6lO8uWmȻwgx`-hy] ɕՙI=B9|6L6pVU\TIU`<:7J"Hqf#L&CZ # y`!:g_3{oȻ2_<#-ۙpI!NAPoѪ}:Zrs)(*8*PgNsNEORqzGz>^.R$8 $\*~dvj `w.Y/quPh3gg+Hcy>f^G IT`C έut(n[gKO"^Ea4WplQn~r.g-%`-g%_KwS&xpD^\ⱖ$%{ϞάLIND@$b"*Dsܪbbw)UqnKHwy63tnjEIͪ75zo{dg7 dbpE[}3 ڃq0֥fp}awaB=srO]|"9.*gVKL%dC)C㹡KxEf6_J(1Y^Qp5[C;%0aK׉[y^5w&i+gƑf zH2nk傶d[>71[qi\ ۼRu^HX[9S-M._' aۓ)[OIݦW׿|X[e>?웝_4##o~%Uvl=MķC\I蓢WNm㜀aQJ  mY[g 0b@dcڹ`-iȒ$m-3ۅvn7ClC Qϻm)갳J.5~uoMns0a.4-[Xo-"2fYGS]7}}vLWivZ_=GW ?ҭM+S6R6>/E"E-tIǧV7F.Bf?PO2P~-*_a_]aGd /g`J"`(q~TT7'{kvE{!1I vGP\ endstream endobj 1813 0 obj << /Length 3290 /Filter /FlateDecode >> stream x[m۶~BNu/$Lqt&׾u1D5@Ϲ֓4_N$/g_I0gORM.&M b=n&/v\*E򯟿x|Y4|!#6{_l?q._qQϵ`1®ue&ޝ39KK|R|o69}kӚP-D `@C|ly̯/% FK[NEj 0v%I#fU5M7eRex{ȫ,U]t{o!Xaa@:YHI[zUvu.+a#̮>xxͬx+ uYu#;C.M펬3;x&z<ӥ)}Da2KiPt˪T~q`6'fUolBfyd$j-+LEc25f*Vw]@CJ }ivI,},#Z+,ʋҴ\}K!^Qa!|(”z47MHt 㳥OYojpRs3HDFԒPSVɦϒզKoBwase8 A)6[?<Ѷ2"ZEhQ.1qhvvyeWf-r(58 AKųCp7-)}Bd6)n6)'Ep:jt frHx@Aמ34`B'$"nO.g}L?:"@k[BC>q`e. ԊhHU"[v_%}|8Vo %bdc:; KyKJde!k&85X4kpQ6ُ:: +J|ƄYHNf]yY=1cLGU9QԊı8 [7fGUhQ.v*1 6㰱|sF>FCY_[>ؐ$ ®ޮ 7"ŵ+#1e'r?䧻lOwٟ9%=w"d!I̚(aKεڛN ҟtqN3ͬ߱e2!'4CoOw)Nw6E(  0|329N az0Nz$g6vIjL}^J󆑷h~$-:!nq(I$X0ٙZߎ* 2W@{(E6Z̒]&LB0@>aC135M6!vU"Qv?J2T5_M!G}"A+!de ,ϱKL7j@N#] 4Z]3I,67Zuž@İ@r[s\$J'塚`Yo!Z*a2CYJ6.D5諃n,'ifwp Y *[u841qiV{{6F֜Da_iUϽ!x7mYu3_kP.lHf3thrPҀr@ b qk~ w*.?jg6.kweNѭjMzZ>$+pr(H xÊW|n޺r12 1% XEˏxH*D1Un~ʾ[A<3gEH(>^Mcl L*-&٥bԆ[XjV 4\iK&F8{0@]cK?u>u0 . !XFV&[X+ +1dVIJHbދ Q+Su܉ HeOlHn"MCΫ4hK|.Yyˍ.׹WP6R k Sqi:m;\@Eة RqCR  rvg1,op1{=L r8")Aث:vn&M 8]%jqp߫4^m(Q#g9Orrå8' Հ0\dKDҡsdr%{A8D2@O%CW]bpʺX H%hL@(tHw\؞Im0xѓ%UNXO#bبuFqHaևp="<|H[ D=+IuHξɳwz?”a@g[CiSmv 6"M)E:ˍA1(G`!/NGfƽ0o׉Dye, G̞,LgG;4/DLez9qsHLPy7>po\Q`UFˣ|d1:Sqjy LdԔ3r ӧ~Ud*?\MQ_/n VKp9TDѬ?@bj.Baݱߒ JbbMQӹ{p$xuD]{5->1HRW3ؕR1ΧA>Hwm>V(jqu>נ>ΙZ;P ϟG!Ũ/JFP'Hyh& n2h\#+s|ȧ_bݽ3{cFp/U;A;˫]ʣ"RFnnw{wˁXWɣH-wSYխ`٢hvm?f f=k?>lU['|Xt#S>n2;Me!]ut|fHwM͌Gˣ6 |v`gHo癛GX>C-!~󋾨raD4"1ecbF:O/% za}zqNW{=uNոuw`dBr,'x*n}M%!sGP+24~rS2#^[6;aqݧ=8"e.iƋr&>HOEiÁ,p2/. endstream endobj 1819 0 obj << /Length 1502 /Filter /FlateDecode >> stream xZKsFWPĊx<[:$U]j7.ۇTesq(v h@HBe%{kؘx;]65fK 2ǸZA}uէ}Q۫? p]e;6 +Nz΢<:BشeI9b2;M3 bBM誘cf5A$/✗nI/|}Wx]ȱaͤI%Qo$enU˻h$і`gJ0/ǕL\'*A!t+Gh#$~\\̶ٖì#" VNBx83=֢I9FlTP-L7̅IR*Rj+ .`?r~.b<+d|HYI+5p<ϖFns?TEi։SI"t?D,{`#"K4YK?LSbJ1C uʆR~ƫ6A(e`-c!o *EWx Hd^ U(yj$xEy 9@R4r< k ,܆MGgŸ>py7H!C!Ѷ$Z53>ŢT8y#L+N9/ʚA,Yh)/lPZ׏IRdv,'4Bᴋ,: ԲZP1pYnv 2'ԃХ5x7Eㅔ[P[>fCcB%zrZvd)bn@-@b"ʈA\Dm\p_MAKa<4iL,Lt]Ţ{tT6rDQҧTHs$+y% Xq/to: z^Hxnc۰@bn'yBz2PiʫB `D^^6C G1Ԟ .ϞE4a2HkpXȸ'&{* `RZj D8Bѧbi|UIy~pTSkq=V-ul,+ѝJIm/vLyb>Ol>nCmnjvη# 'Lhi=sp4Xԙs^JCk!jWXބ:,zyJ!H މmq?( RGN@RR[D@ 73^jܑ{%o2J&J\fDQooOBО`o8<=(Ǎ/AZᣯA݇y-b_wgE3t؅͐U<><h+=5Ύ6҃~+ ;"~i "|1hk|ez6꺜GW~_~p=K&.Hs MBm-p' Җ"w'W endstream endobj 1823 0 obj << /Length 3292 /Filter /FlateDecode >> stream x\KsWec{k7C*Ul@K $r忧{f$(2%+ ,wW_}fF)d/3f:2q5[;/+nk"i^}zΙ kł׻kÂC\~Rͨ&Jc.Ă9 0|mx-4ߕ0AwiȒڕ0"H7|o53Agn/͌zLʚq}U2quP厎-~s$}P9m&*8veεn!(aBBQq- H x v^oxlFLsy޳#%p "jzʅ3:+|x!eD)KC vU]z ]]\o/⬞PKbTã[OO]%g0)PDAA8\bn>^%:P}F(G]C}ND(zt~<\Vc$4̈i<a$!tSx \)H8aTm.CB n="Û.rnc%r9g1LP@w) /RK)_Z].4g L$8?s 8#adØ{'*h7C7`ICuPD"]|;0'I;}"w>N\pzLppk[^MJ=Pow:ARm"Yt7*GcUJWi-BfTRžB{,mE`n8Qg7cRJuXgjMlYm=pu4@ȵee@QN5cZR/Y UR9@ JͲM8d"'y|NMF"Tў5zJ2>cDV=.GVbI=gM0}@ηPGNPCHS ! | }PDM#K~nuT5w="2wM>Kld^{m?Tc2GsAq@#Ҩam+>~_Y^}=dk'3a[{4]܎("=UOU܎ <%N փ5zWz} j> e@w}-IU]%URlSD0xU.pZld9m@jiP틝JKBk123y3SyaXhCf:\[:R@#E\r=lOwQf̳'NV;ȰDNH||.R.яݑQ %4ݎ. ܌P>pA4,-J)XZs6NNQ L(D QpDb@N6 ؚ^5JrX5G>*""=+xM+s!Q5aU9E% H, {7vVi"H[W5܇.`%hn2 D3k|Ge{~3dy~֦m%t9#"€K ]8įL|m"tNkD>C݃ !L> s条^RЀBW8GJgv;2/oM1nԇQ73W)@2A-Zn1!VvbCYd;+`z0'A2Dd &0tff k7}ς}qcҩOMM7sZܘ7jh?/n&׎[3q#&N[Ct%A|ao֓_N:w9" p\Mvh_ݦo.v^zEj q`Zr0ls$_%~̞k臐Yy%|aM V@l^>sjZϐÍTLdxxxMyRYy,*甇WϜUasr]Vb:$ ?2-pO]duFmVS17qq{*ꘪH%sq5^$=AGQ/mYuf0tw_rJj endstream endobj 1830 0 obj << /Length 2718 /Filter /FlateDecode >> stream xZIs8W$C;rL]=՝ԤsIr`$b<\ JI\Dz ]엓W'g!(..gTervs"Q\$d 2? j\^/>^TjNip*rPl\,4gՕ[eݺuQ-t_ϳr?s7 ˬrU^nr{؄zlRFmx6DIVֱyBZ4|4 M>dl!rP Hwg^%QB1G^VQ(Xthl@I9">cQrPj4G[)dXD˖"f'q:f.c%TR21Tt@|szY$,H(? @Rܰv{Y}5sw&̘JL12m'>wm =Nr= K OY,09\I4*0~T0 (m3\'D2]dR(%B`qIouqFiB*`9 XB8mh/D«o"}0Gdr7eAsqlax*ӓX|H H401DE]t vd [*xJX(OwU"ʍBT֩Tċ. `0V0$3 a#z r1]PRMvH Nx)T*!Y ϹfӶ}Մ6dB)kBU`?5护NCR NAJ JG>iKX @vH$}jF6͏'jhUϳ&Vi4KQa>J.uWb7Ekץݙ乫)([*jU d5jZY,([gv- )F9etP|q3g_Z6eԽ@QɅaEQr_|IYrLEc~swYL} 5{\{(qe^o̯Eʫ^۷nkOTl`RY?/PLE[#4>)DКg^a D -jA%Iո'7bid_oY6nXEVcÊirm .bOY'8Dc1jp?Uki4{}WUf4_X S7,Iʑ `D<0Iγ{)7L$OG EG<`Mg[Λmw(,,zѿ,o;̼HA2'\#nڭ!Xn+OB2}uCz ȅ"=Z4-&eUdCHbmԖ}5puKKt[EA[2{/lC2l&Zv=>wuc*Z% w󆴷GpMzl.DꅯlIX\5B$+E_!~.VQ9@F 8@R"2PĨ90gI\ E3Sᗄ=q4 ,r>^!"s'\~H1ұ^?pMhS(|7@ R";}irMڊ L SnAs"Wi$$hIF)f`DB}p(E{!C'4N#vP:hAB/%O endstream endobj 1836 0 obj << /Length 3106 /Filter /FlateDecode >> stream xkoF>Jgk}h~(zѻCLYl)Q!X]K0 kvv=&oo.^фs,'qĄ &7wț}fyaw!y P~כ7fs)byr3! lĄLp_!6lX4sog6:+6l!Xo=a&iAܤ̒Op.XLpp0ƹv))Ky*3>z炣~t.0xxp\-d)Q;AH"Z,nLr;=eszb`{T)Q0zY:v4)sx쪻=ˑčN㒝{'}Dtg,k,.xw:)@%'m2јLU4tVPrC{s8Fä%-*2EbP4Е]Pց^vWnVc jsQ:m>j)V1!$B0%pO>M͌'tb ]FBJ`NE4SF!93$Ie\]#FwZij98Q`<–vDWkz$s%Ctr|,uoYJ@MK%&>FX!hy 'ޟ=|N1o6M1J橿/4&ɹ;I9W\JWXEtyY7p١kbAS׳@}O"5M@D7Z֢LmaI6n H%h&z>|WHG @_+Lx O=C=ssj\ݬ;;»mv)JܼWfo3`8<*:?fV!r}KpYaw9_ y-^.iHEA~2Luf(nGϳ9.ΑΩI<j4}$3GeaN$6Fr*R`=xݾ^@@T"o+կYV7OGrų$!m?.OOnc˃Azl"3_lSG+N#"quLzne瓌b̀881Xȣam!:ʘzfXc_Y {ss aT,P>"tIb}7'L>kNO[T3!TGγ BC톉_#8#urElYht%@܂!x'Fs%NCІN=wŔhh 7REl\)Y<0 ^vVp_"J lP׳B)ڳ : άkw:&[:S N}󛉖^d~yruTLD] Ŧ.v%γ VX:i2u3gڟu<ϸ/q6+~*V8~h?]$y_+W@.wn/ItL5EyiIXv3ؤJZ_a,heY a\Bl** [=BwgU4`/vc/YjdxR P׹xT<>- Vi-ݩ tn]E Ԓd]vg:! ѥ]v~F\n4 j: 0DW0¾y3_'0o3BK^}*^+D2!ۦ*!^RsWM >IX}lsO݇B[4q.JɴL7 CUHWX.Rz1] Hi92P1kުTuQE<K5/=q{Դuն'flN'" %w=`MW cPizu!4l'=#BMG]qv D=I$ƹ#M)=gQ›n@Gb* %EM=Do7NV $WRL ? yWAwa fL6h8AJg5(%MEfajvnlSNU-̸q ~bs])Z@Pgo=FgYO G*zg6u1RqkRcMHqIpp˛;}X2Ad(ӫTU&2bљz'zCǝw! Dh v>6pO뎦cnޞJmI&DfXgxM bQ6$gfb&uV&MͼV13V~۰8|=-#7dD刐5ųBGfɩT Nl_x`Ζ?_Tr9q_FSWSPΥS??yȋV!AQן izA7ҳ b$0bA9H"qq> stream xYoBOr7bdS`^^^p!-ْWsIzZŢADQp7ϋ_\,=BzsOROQz3HI CiGux#˹&؛DmX=,4Bd0@.#`@XHKҬ D`?_lcxf,')BjFFDɊѦ'~5NIǣ)ZKo64#Վya>u+GTtY%/v`˦egg,0u=Sxe,/ 6)sLV:ʸxnh> QDp8.:-ؠJ `ZitͭH(H;d#,J/ Q$$U>ћo/G/`P2 i$II=lT(~Eb/!ؤa +A3/@JBi7]Yr `~xUth1f룆1Zeف3j)H,Li0Fɣ]ԢX13؁Ō2o 6ҾLBF-܃^gf- 4XC((a:>M2=Wܞp VoK˟i1\Bf;M ռ)>ncQiX܃&YvxA:P>S7B! j&߯#BlB.!E)KQvs=$vDUx0$QL((2 _J{3S!]wb_/~qW5iyyy.{8[|G ד@b ^[n `SkI1J^6nb GdEO{C pxo ږXPX.ΫT/'`Q`[YxeU`KAJ;+z\@PAPQE%־utS[{*7!s<!Tq:rv.hP6<χJ$#$:{E3)e!陇kzB:zm-!C.r#׌̇j[39d_jI-6tnpD{C U4+{?_(n &Hl2r0AvD4ȹBbv/q}xؑmY1ղ?q6wA~[^ !xcu@V6YͲ!B!DG\>F!B•p]6rj@Ѽ{|dPn:j8J61,"iL=\Px( [v>N^$ƅ6Ƈcm˼]KN  WeY%v2BL0 Gr2>H9DUGO+n)}a3&ؖ,u˶:]Ņ,<| yMgkb5P4~H D-!UI!!i}J#"Z`bNo2hf)nJ ^]%&Ӽ4mةtkqJo,l1JRHPC5A2Bw Lox5͍4\Zkqc;oZz>dgKUj{m Iuk{dzy)77 .n?˳Ď\3[q#@j.фᯃdjn'#V>fY!HD6=O&g,0`2 9&AV.ۖw;ߤ}{8Ig6I.9LU^JVuj]B$^`*HWW5L WnNzqߎ!jbL:Hl#{n҉Q2;@7;ڦ-f>&yl>|1j]ѦTÔ6I=owuhbA4>$ {%v\/GN[A/zj=i&l5C{n0ݺR{DPMgQ]HHe- ۵Tqg7SKz)i?lpIl/IM)qԅ#M7Ĵo"|t/]h\C.5D di P7C@;PJ9;NPey/ˇw=TR endstream endobj 1842 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1851 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP  endstream endobj 1841 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cfunc1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1852 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1853 0 R >>>> /Length 13608 /Filter /FlateDecode >> stream x}M]lH'4RidydԮ6C_????ۿ8j:u9rZ~l)kKl?O4+F?me]+Li@9UQQw,Nfoʃ@GݚS01ͩVQ[C0c؏@=@=aI Z οF`;k x0zx-x;{9J! ora5nq>`֏Ra(G vRa(+6Ra(+14֎R0cl39 Ì\f&=c}[KOfa(NdҴ$[ ڏl1Vk>@hV8~,_pP~SVGL>u LI1*[@iHBka5wUl`9~ez`Ux8c5DXn=4il Q+q22Mfϯ ^{ڜЖ:hmMڥNC9;Bɵ:u?qZdI!Xߨ5 \9a6+iKO!URJA\X\sfXyvuRC O"{/ʱdNpʳz|Z6s-\RQJ"DW :67 a`%lڅXk ;V+շ c;G#6FX$Ҕebh T]դdTޱVPuɦxIw%@tw?uEtYFD{&YIRVjꘛV|-$;_P,9+eiq;SeLx/TC͹eGͳS22ZB"&`MoWɦF&!3ˢL tj[;a(~[cA!avd=tt mZ:C! t? Dmg/?y]gQVJߖdEK֯|CJ0!of ]uEOʯ]%^ c𕦕Ʊ| k !NiЏFˢ M*y'S;+`atNZrRWieJB5ą:Tp%WcТKN\CtmcYlQvEou:+V?8,??jq9kMQhńţ{[\ ƿހUDg[B:ki ZGY jR ;8au v%[ is l/)~u!;DX>]]i)Ѣ% qJ7Pw|qXlv&m@ݛTz#!Rxp(?@^ytCyrwm \\wН%%gdlvc__eu#[2O ]ZRՁęމU_{~\kkq!W4 Xtuh.>+s߂gQS>% E.I3eGsʨX .ὶlu66]3Z3P3I/ yKIEzJ*BuoRhk>ruI$;D?cS-B@(oa|Β5LL  =H#;c)' w$s_Tv_4tkTF`W)@t-J#kI(\':*wgǞFcߢxڒlo;3_sDal(wT*UP(wTvvMRO4=kb= DLwd#;9K+6ЈDnn.T1+\.Q>^ 9.flX %ZUv6tdC0^ :Ob\f@]%fL1CJ>a2mO>{]+3}%-C1T^rˎK,L+śGsƽ}\KޤXUHp(|?7M6 I *-;Io{Uk'!Ix+rC?G%CF{5frMuwur,)ݫj;Rz-o{%mo;@!9iT|aM uK7jUbTXP%\ruYTD4%jEcEQhxaAY/~`VR%j\ rbW%Rshag<+6?T-5ͩlۆ;# rZ4Tl`sA̦DW˲A1:5:75]F$f"fX L>OxuM‚?4Pp"fp0Un9$c>fdOt$إD?3\vT{.g|Q--7|l'(7DAt):`,Ac2~]&CJߊlsIL<Ct)J0<|#u[7ݫ*=Õ+=DyɅ}]B WFAdx'wj|*كAoAm#='L,cHJ|)"}耟e|Wo B6kPOz]хꌪJ_aܔdk-Yt@]*^BM}KPݫ*}vN_D}jŎ/dQĐnGX,wdF()U]Z[lWd$簵WtcG @tF2 ?l^h]J@b(Ul38Vݮ׈>Q-Nq:#RV=f#gƕg!:#!ݬ ,A,>[JFWvr8‡&>aZd"*wL#,7 m+ro`}9OC J"'F?C5iu>> KFGddi@!P¤oaI>|;ÊޤOCUo00O揁CVѥgj D~ʞm (sgwaŎUx<}`~ȩ+}w|s+KM2P↙;)'AݛT5ڽW%vF|Pw[m.'³Ac{^U~1{}RBjzv|K`,RaXͣ,4~ '|~4x^qLKj\-QX=|>|W1~)=WK'a#!;V( -fJxQlGUs`{ڏ|!/^Dj XE(qA2:Z.D&b6ɡ2\g]7۫-ՆM:~crNk3t1uc]+Uf#_A;RIR@{#S%@az=CNǕ9yW|Pw u%. ƶXV;!$wDd8ڭ~ۿ[5PwWy+oRcg{Asl n#Qr2X$Rqn\ѥ{8؃: >OtT>uL>Moxz'|ݼƞr%)h{5ҫK>C..6%!,{ؼ5snX)jɅ?`"k/Onw|O|h>߀y y2~@J8eѩj ^0l 2F^f! v/Z& a;%X1)-W͇Z`e5ZkX#|O^ØǭE>啺R±N_^?Qb ۍ[B(95](fo4KlrҘP؈ oG&ІA_80?D&_xRrӪ0A"m|AV|IEm,z#9Vv3gx-fK}=VҟhBmB-akBR C:c 1z֤PTqc \ PwV1l`٤9=G@bG1"> @9~W6,gs1p>rw\+v)B/(GbiqĻ z~s}0 [.-z=JϷ|ԅ-y[}˿=WJa RX)E )l=)%H/aJ}uT*O`~y?x&Gh4yJ}M~z@}|zKWֽu/g]\SX{)=•gQ˖]nQ떠H[Ptq OP=tqJb }zvSrS0AX$IЋlYrSMrlB\ߒ%:L}\y\)IrL0wDx&LkJ/nd{ R$Y +M7-%L)ۧ'p97a9o-")&2`GɹL& "-??܋!\E旕{ʝCx;FOgXgwUX N0:/N*v Cvi770J N̞%(=m RQK7*o0 0d +YPBkSV3:Zݳ(~wNspNAxT>89U) NIasjX?۰aX{`*R<\ҿa u/}Ik:S4Y0E?R?@~*. >`(Q?J)HmB}Ziw{##/+vG_'q_'S9x)Iqr6A]r3Yx8 U%+KW *\SgBeBF}2`S(m>$[r+eH.^L~BjbN}Ne@ &CaP{PCf`qzPwGjn`M)MO2Iў('jyެ)yȣlt C˛5=gen֔)#X;o)CoB,|+2[B|ex,*\pYw儞04}ct4.W7㪰5%MF]=8_#Y ~OZXS /iDHz2Wfk|[nQ0mN(܆ÃM%{ۧNy̛ R7rzvQQ^?Qޣ򘠆@;PC{(aF-gjtZuZG#'nZ'`2D?qG>ZBmLTO;\DxaQV7J)'e-S+ZҿaE`;F5=gVbu/meDQ7+bZCs>ZƆ$Oԗ$OkPמj;_} +|v7Vh PgLq79NjLQ703>)N*2xݘLܘWca #x&&LLx9p7Lx9xSݘvnM!1^79-MB-lcxiz"];d i"jLwE36?..8N$erE&zI7uJo8L 2- -z-!F\Xwl%v4“@Nc6m_I$p#yC ʖA} <S‡% J| [-5n3Z89 CeC!(=h~i͘s''}vL91n߇oj ȅi&A9 J;xM-\ A:e*:Z@:eoyoF$JZK 'PB).^@P6A-S0֨i{Ft^Q7mglB(,RZHC')t/wVj2lAxg©24. ۳2@IBR>/< ʏU%Қm_m_vf^²ʰ,n`5|RyOۗY TL76*æ:N9br)):eCS딃1݇):OxBmZ>W^FRM3-SMy jI32[O=- \k߸qqpx)}~s7#Ǥ3ԻyUeibf ;Z9ec+,C!&NƬ4WlZ6\2?,c4h솣ܞƱ3nv?xǶ6M5Cy5aOS/UTw~'7ʝ}~o|a8Lp]өV0O=K̎:-m{ȜLܘ/YVc n 76m nL;Fpc&]YuL;kgQ7N%мP?(tFگgyJ%Q%4ޓ@Ri [=n+0J~"Yq[y D-f=ok#)ܾêӶƍ~g}"GTS> yZ,=0i |_GFpmW$%)y'n|.tk>H}s)'Mρ:&sQυ|L7^{9 s3H(Gr2_D2c9XDBDq d(ɪg 猿i]/v^P6"I"2o8 .w{+=2tí) QaK.>m5_60"c! ;/7w$=G~|U;uo*2to.j\vV=l8;ٙc-9ԛE1?/ԧnŷU/\ׅ&M'y夓u{S̈́n^}W__g~>O=Ǐ\C;H=͛d;*~!^x[>6SBQqS&JjC? GH d*v x{]!4hZdeH&T2Z7m`f[a^́?y,/@p,nO<:G8Cu3թX*: +:"HcGŃ7[6ʌ߰"m0ky$3~<4'WLf,xYv.GoyV&_>$| o;x߼*t/}ڔWx0ox )$鏷z 񊟼#4Brh+? +~G6n5ko o^qMy[G~ѫr;p1dғN&7ֺQWXž#mpq,κ߹_nB{{{{\3g~fS87P݃uB[nfC />w0R(p$!o asaQ%BH!4E܆i E?YEŹ &*Gub_/"\'>yq3pyk?Ol0S;7eWIͯ<즔"[{q~|q+No^){-w ?EΗWfDh|3cufԸ|1A)paW,rw8ɀ9 x#x+DP; mC';KlKK\h^_p H#dQz8>>?ϙߊjUsȼ,xv:2CK8M{%f72L+ɗ_/I*M$s%s{8 L}\_yD ) ~)|oN7N'((C&VT=*U9ܬ7xEq+L!ÜS _̴F`7 b=<^[=-\~묈r^ R 'I&ͻt'}_ ^T:5}{xcT/$mŏΝ¤ J\<o/:+_Fy_, gՈ_Iߺx֒-NYT~Ǖ׺Nd~r6/y# 'w#l>aaz?C_%=پs9O[;9||b%48A~72ͫܛF/7uكX3hץ;u+tuoy@z?j~dŹW]}Ԥvo=\xgW!J/eO7nyV<;L/cOyjC&@{]\r:}:#{5?>ZcԹe9M9=/ e3r(}~9Ԏ\§|' ~4_Q;Os 'zVf\N؎VKnoNwm_gIi"W׫|K"t2ǯ'_^OgG]O1e'u{Ow}WQU :LBOrДJpٯDt׫1DnB}Iے0k/O:>8|co74FiW)e_2D{PD+=RowrnFɆ&e(9Pwb#0[ .펒]D٨S *zzz襎Q*ޮl` 1k [8/zo(2'aIV@! Cn+>VWd}#xJPw9C2fb}l7{ci< wɮu4lLݛT|M8.<)ʞ҂6,=#?°bd@ހݫjPs#4GĪF*qPwcMnrwȓfT2{{T:hE(UYANYZLz>o)]?zk[R Xj(͵</<.*9] fDe;չi +&j找8pqrف^}.XΝ Ϟpt{GyźQĕJhmֵNr# 3ٞ{S?b[䫛?٦ߌ_tC-Czzf55xor^Cj>:Nx(8'֢ sp EsgpI{sYlR/gy0)vTTE:@0i10<\1493]o/eEgT]yTr &F ANgByɾLPX=uB{$Kh,>6uoB&jK{\ +ωkχ-􀺷뼯Oun+Bȧ[MYybۚkkuZזj|4\:dRੇbm{PtrD\(G(PoqQŎ%Qa#. V6DQ7% O=Է~0ا.GM҆uT!_,RMIRC}}SG^{t) Km-ai: BPS^ ,SAǙdDtwrwmlms˛*KpV]]קlgz  ^Z[[I^ʵNQ/sh8SCq8v5Zddod77%-0K:~|elfYTG3ItGhKսu>Acjt0)$sfʞ(.؍P64Z;.86s 럟i<g,cYt4f;e !B>o "ˠͭK_ǨJdwlœ^؎Ӣ ,:Rm7|w5[)g%Lf'tQIDgl70>nq˄Xʉk%gc'0Vf>oUpx0|ܪ\eթQ^l֏8R^%ΧdڒԜqy;|C[?ocs^sx)0,gFI( S"ȸ-x?okhļX/O:.滁%pXc`:%[n`fw\!UԄEqkxkCV˃ zFe #;[KO Gplv2n%;D۱F7)#>Xu%SRU+T^ %KigPlz@a]4@=PpW/6*T9 3gMD$*Ft[#QZdbe~$%$[,ʌ l26zhuc7 `Cro0Y'_ډ>2NI\ sf&k&H6suhh& r*G1؃З_O($$}ãr ?# 40\~ѳJQ:)ZgO+wx8ե;S%aG Hf>߰lFʃޯ?)^gʧ[KEⲚҤy߂9}{-8}S-hGKg|<PSW](.UNuH"&M( };F/*d^ q +2x^oX®Dr8PH"9㇫a1RGU"uNJ߬dߵ3PwWP&剗oR:ٔ-o? endstream endobj 1844 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1854 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP endstream endobj 1843 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cfunc2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1855 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1856 0 R >>>> /Length 24602 /Filter /FlateDecode >> stream xK-w)N EI8"8ጙp8{ZkHoA??@Yy?,u˵k+-?}Yg_g/ `O>r9v97u$9ww9+2Dî+nT $,:dp:{'t(CKtBuǚ/H8~SC#" |SP& .?UEse?˦EKR/nіZJVꕶC[_ѲjWN,I[_r.0 q r <~؄?lR6__E}FDgKNm|³|K 5k-哟-Yt'=[[t+۽HŖn}`ƌذpB:L-yOOrͧE]]0㓻Y'f6~T6=yfqܽrN7upmqw/\̎΋Gw -d>Mt= 5t]֎h'rsC/Ό$0^SN0>6}>8q^'tƺ. SG~m 6qĻ|Ӷwo*\q3"*[%8722, TIOȩs EE;OM1Fc:ȒOHyI vz nlMx@8F\0(?iF%mR GOzi$Sӿ0iKcp57,W2  -F)*G.f(^iGbdkܽ6Wrn~/:1sȝ3<7y0k$ނŘ#oE;랡wF҉hoTෲ0 s^2Q`8.B1SgCO:K¤?u^t[Hˈ[WV`fbXH"}Ko9NQn#\aϘ}kN7 iXy5![8?ڭdJ8tka^{ ߵso#L\q-XbwYJQ>VK,WuW%$_υ轸y7:k*^;XtyτqqJ,U"KdIׅbnM<׈3bqź9W:{X }`}tv4=%2/[=Kt[Zwy=N'"SpJIsT{]+jEE,.΢Se]~mI/#%IВY\zZ;_yYdHCne nkdEzJG&2KƑZtKкDߕ곗v4W392]2{t^chpTJ $|='ۚk6HOZFaD?[ } BQCs~^,-sC.xࢷF'q'=O|{Gca\UH?1Vwf*I*]˃y4ѝ0N'9`:E{:?xKN=fn Q@qm$KPTkVvfkϵrIm&i*jZtS R_eOʮ _3dSb z\)ݵp"~Tv5 !RUO93DҽwS9 $1j%k 12YUF3$ fi iRF7јED,Io)2~4<'qW#t\I2ZRf~r ?Fb0jx\-G{R1ATIΕ$_E B;Hz;w|8mًrt$1CLg # "JZ A?suiy­XZUw<@q7"A1ΚoM5鐏la?h vV}y'5h}}ӡ]qQȦA"a10`GdZ4q/^>Ʒ,RF|>3爮]}X/f/m A_[>6ehs|k ws))+'u)9).~uOcMKyq&Y&8\4j7[}2{sХae4xUO]g]Kfy PՕ&yЀ3`HH ܲvÃfSn1 Ies&a݆I!z_oV?+|ϯ DUhoXQk\C;\#K"+dž {~$3@jYX$N&b"/+w3KIkށSP|0q61Ѧp@t?(`>3Qw$cxx%͜Q/hny-~p<sHP1 AQް[hؗ9bQkW /\{p0厰x PAQ>&&Z~+o: Į1m W4oP[0d*rd;}ͪ*3l40>wzέVD>`tu>o=&@TI-))](VwG AJ-EhOɬ8=ILcLn~"#R~Vdo_E:X 电D$ ^}Zs)2c-9'=a a'bQ!')^8Ot)IΜl]o܏"j?%n $4s؎(8<:K-!7ǢL@[7f/Ǒ X;OrL}$VokDlkwՉ3;T7{'"_E߬^x6/LǍnff{9c]Gj7SFDMVŔbIEsݏlEOV -1AQް{ Z _E= a{ *~&fiU[H./Gi8ZbhPJ:( #pQӏ="$C7'{l6<hakeOЮJc]2o:5hlx vM Z KZrv`wp XFhY$cq AVtJïcJlϼ$W9uCt^!wڝ Q$"Ct$o-~04^#{eXm{r;%\|_Iوa>r؂*s)r XWO9LaPZrj%d`h~ϣz:zPn[aA-;aJm[Kb,& oc '0GJFXm,&)0eCBq)Zkwkqx,6Q]9tf5 ~Γ s; fts{> ~ Gq쁴mc&ϣ>]e«wQ_nh,s=D noP_E{úr\1A( c¬TؚÂ>xtGvmÙ!=$h^^~u"Yn-dI#{kGKfoo~ce 7[(}sNA)1L9b! lG:މ)k%d~&,K]CfɅ { [Y y09 ҮK`Wr{t%ó2 9ŕa8x'i-oH0ZRO)z6O iW`V*(*}Xsذ!++i탥Empa4(݃~D34 [hfVm͍ \jQej_c?f $i1 /͎C#~<U }nz*\D[msVx+CclX {KQu4xFZrӮ_U8>Vti`Bo։3r͒v} >JUo?%Q[9| J?43~yiud!Q9k!̴NmF_dDJc|K֙\Ibr}^XN9tCnV~<*w]^| S4JC=`;2?πѨf$ኡQ)*l ܼG62-֝fܠ |u.&UJu܎F}CSpm-PcG>1'TO"KcmUf'89+6ȱ=m|ϭr@RA@^24rw~`)gq/+1ʂ]+Y66jB+l37C&md]$(=tHP߂+~g~>E!e̍L~<<[|ARްųޯn'ؓ[#3A늻Y. e)jCSz~6 3kikc1p,܏WȚ1g"CA=@r`9dՈ~-]qmԡ.8bݏ]3㵫 K, —!/ ?eՋ~.uP+hhp"(*![m>m%"+74=ixL?-_OEV{>-CvUob+0(1c.Y±WpյA}EqmuF;{X&u --Ss}+\KF%-2QT ]f?#-g̤8 5~0x}r>ATI7};XƪM$FҼg@k M0N*?8J͝CKWOJ?,G$#<<$.cq}6a?6=$}$پ N] ij9*I= T{BЧ㳒.zG9qw0Oo*?nD1VIWĥ>?%L/k<À؀ ?_N$qNOճR@\IB>0Wzlm y|byB8S翱<:<֨Q lg[~.f p"tgf3&Wx{IVAp"փиLzg#?}F>̮i↲j1g+N|md4%rKJ8{zI2 p-(@s]8y\:@Q֘aCeױH6jd2 8RHWxttȝϑ]f"WQgȻw#yVo8 h7?>|֏rGCS%Xdέ͙X%]ڭ|rC{ݹ.hj9]~\?iU7vu?#GˡVA{{?P>X?vT0t*g9+ϾuR0R;# =r#}z|)I7GQdCv- b)E;9^v'0y(0DP+ʽ %*r̬KPv"];%֠ȼ#4.FV)(.U5 _E;Q6؞|E- Z̥NS /_NLSXYp\%^ NL486TZ`^ _E{s!F?`g?]8I0eBCDh7ll {дn(Ĩ͠ JʠpZ)(֥7 +Mi*mhp toٺЬ LƂQdrؠ n=Q ƚ?rJ }JFL+Xjf66…~DOT88Vke?r|ja$9 $1#)+I~{ߎbWU~g+gMi^>R;u'tߩ'"[#:xY$fL_n$ᱜ4\I۷ {E!\Iz_nz_ q~Pn ;ާ:Dłz 9:W~Ǣ@s,^1OCX%ˏsR> pm0}8AxGœ,EJZ aJ_?J[0{N#@-  PeU$Gu#菔<ҽt,KêG`0; ~/G;d$h\EJLEE MmE3'5x$E- Ϻ"-/t$%'%#Ȯ$!^3-qg?H{(62$#ZN'`c; oEKdI!72T\8Uc_'?XSU`.t /,s,Xdqi =aw2o,ӄ3<ΜLG;ۯzk,@JqY7;Cd ^RYF7l'VrZT.tޠZ{m=. =}ﯗE%.g;dPз%ӈҒ,g Y^,#X=˿ycC)K11I>>!~Mcf{|=+a- /QP{ml qW g]$'#uTEݖc>A@~&q5F,,3X(eh^";a]z#g1y? P/be( aD P}* ق*tls~TNU>or 46`7n@0H*UpPʁ 5c )6JY-Aߨ sbo⇼ yUc?0҇YSySD2+OazU% aR`O9X FТ:E3q>8Uiu.8we=Aؽʹ@.beGJg`G4&\ژ;cJ$} "aIsy)^t|RTVL,)AQnXQ@h7AAsH EŨSBgr5~.΂Z c%WZ{+ӌ-q0~Xc؃NP[䴗_nka7ڗҌM.%>/Y䏢Q7#сT g{.'wvr'XWE ~:f?,9 >9m?MWGy/9Bj'@ů,ffs_vwS v63,rvE,|~= K]\UB/F>d`8VEX ˇES˝Z;*||T/g? j)Z?Rq1ԑb1R2%@Z |Hb ͔T@(JB$Ny86c58M3.=<J=yl/T/ie׹+mniusC ^D jR۬V/ktdc%OqđM"$QdϺ_\P324J<(K^PnИ&p<՘=wy#VD@ !.rTC9y'$t$}#[3t7;w::! 9 'wLw~w"@R ɣʮq}߹|A#O[,CXyi7oetAYq*7(yIvZ,dᰡZgwihO'L mCN\Q_چNQufp¬]*Jq\R`\-ӊŇ`aPrV@"rt9 hT8.X0.1z-Q_xߕķfN[Ô}##xW{ZJPj?d$C ~&WzRoJd)u F.$jSr# Gvm m87!8+Lqͤ-X4(bTkPn څ &(o_E;%h& 6?jN3kg,t+! *PC`d>7+bۼX3 Yѯ%Іn :X= A8a̝b\Xk#O &o3ځp0+BGԽ%^/Q唽Yrʩ t5c]LW] 9: Gl ENCfA Dz/y裏c pB ޒ#Qz͵ b}1VPkxN`t$!KLKG Ct?zza,qʂX%.9]?nlM;7kˊSq;MP_e7z +n&oJ2:vq[tzψ4}J9A KIӁoWfOޔ6ԇ\*E6SۈpPz-Zfn|*lx M9sVD$5(Vt?u]G]I@y18weG/7OI\I2_(y+WqHzxˈCfxl`?8|&4ep-D$;_@ЧC'GijEE"*Y~Qъi_.ܝ*I?G` ZKkܵ >}9[ŢReK j5U >Bν.] \AInAג8VWw֫}!]:?Tv0PrzJTv۝_Yχö /wt~5?ixNq<Oq'Ł 7 !~#"N0g WK5pZ\Zy1; o75ɉdoAsAv!E^)ԪJTv%/:~ꬱCvRz\ r'6:|C#wQMJSC)eȓr]A)DaD-VpQEE;hw`wĺ i磟ӞB681;R+.VVeX +Q &%uaew``7`q::3 ï F.]D;2hoDmРS;典${-Z=0(؞U3S hb7Rx   |2AsgO>ռ߱|J8T4;W?&JO*J>$ai>0AZm7sS*IHoM7mGL4C  F5xW5yw0 ~|g!?9a2]~_ <5> d$%D$0;4B,xgthc8mtQ% wܧnԃV O7V? ?J']>@* RoпE[ߢ-LQ>K;qm~kF1Yv)(D#O=%dE{YBT%  Zt$B-~㟁,*SX#HD) |,de]PsZc(1%Ggq%^Lcuru/ (3_л{/ݟSS]ZtyL_|Εl~4*P ԧ^zJxz2l (<s5"/q$zN0Gf Xj^C5n격_]~B_vb0h'={]IQ$;d薅nL=\EeCu7ӜSa}pPo胰`vUIU ^/ ʮ¹Utn`$'OQB|-Ή?7o#x}+^8uE?J·:V_f^R_Rp#:+ |M7\NBL+i6ax.f}T*p\K 2ڠT`3|E,}MAVp vfm1]%¸3N(bL QNTLϘ> *,87s$W<נ6GX)I^ӓ9<9zfW:ul^dej\BV>!7¹ ȋpD8hpYy^yAew(xMWD&^r P⁅:,KlA, Ҕ!bS!6B߅مׅVHllf)6ӯC69"AuoPT76hlfͽ{PY RXViޗllw[ 7(] f(a=),lx|ޒw ҧ\;Bvg*TAME샨c5W[! oxGU) O1_7VMA $q|L<ŨվφoAGJLvѺ UP'BYH=70=֥x/4m\V}[ҳ*IFVQ_cxVFد ~$CXp:Yp›@\%N] xCit$+6ȗSߕ`?UЏO.-4P(Hi0׉*I@-B$q}S?Q vݺ<ċѡUv9Y_{ŞŞ_oCQ"'Ot$$!xMQK*qO-H L|j28)PEF&0Ba UWүptpZc8YKKPLjE:2,,uɳƜY:ɘ;I\2^z+ݽ 7/(QUBz>6kN=axuk(Gp0uyaLj,d(e ]IO\wŃUЍ>pn6QF96Q@)RQZ QNq۟7@7HC,.a|Vm*Qfs+4%pN(G}lۧ([o S`)4ڨ\e*Qt}t|im値_T^:(+A1!_ (*Ōd|&1*`}Vɘl :ف:Ya̝g*3T:#P(&gp;3fНY>$nL5G_uPFbEd.B0ċce0!|Qu<=CKB᏾1£_E{`lWၺ*UeRR2?4v. !4fʩ!|2NmxB݇xGIDt$lQZⳂ 9<2R ;QꙐ:l#Ӷ'(U#;*I f>I/k TRwIr!r[D̐,wqaߏĈg8AbϺ/+-z]Ѻ] % $xQUڷ} 6(HG, cӉ4!P@TIxjq0hI&Smcs-JBH_%9-) =]Ӆ.is!Y&utGp\Mb$-I[T>s9<Y檢[rk(Ʌi KO>+蹖cHgr/ޕY섳Kadj0݁`{Ƈ+fXugź_&9^,2XL*-ia ֵ$iY€C9+LK~}18)g}A8lC9r6}!e:EФJwd5I(9|j|luy5 S4S7m04L]PJ+^IEYYb$_\Q BYHV_G\Z9QկKkįrx/ 9Mm+r4:3[4Ik݊jZ^Kcc};( OO r4V܌NƒhÛ[V=7-IHJ &AEΤKi 00x=~y34p*%s?j50^j$s5?>yuX0Rœ_=#kom\lS.2cqhH0ΐȴHBȴz̮ꭹI '!*&C͛VpmRZrXq;0H[Ɋ~X7D˜>f[ߜvi?!:(>*Ɗd<2rQ4pbkUd{CF% Vp::WC}c<7aK_˗y&"fA2S} ]2`:`0(F6VfDO僲3`mZt$ܝr%8 z_CU_e\1{IH2pU[Y%$;q) ʵQZru5T}R7蓋<:W417*}!I] 1' NQ G$SD$sUQj's/o!~xo?{fG/*I*+I¸_ɧkyS/+]xV߲MQ'z=_ >+I~چk}#n<8کR2]=j 79Ǝ2OԳlmR'T('-"ʹ`˛e2~ϊ!#~[b[eBx_lq)nٵ;}Ww-t,=Q%>\׊ϕlpRd5/ p"f!;SY/~8cee)8` P7Y@eS}1hn+MQ*Tn 7βv}Vmð6Ɨ$&5;4<E4[Wa6`Cv*i؂] P}hyN]w'kF8ޫ(>՝RB=/5S*TrH`ƊQClɐU0TK#~VrTs!ꜝ:޲PjQUT1B/f]_Y 1UN$5+1X!]DZ#;nХ^>&{˕-8K'u}Ա<[zɓ7?C=Q8Uzw@^Mi_PQ$\@m$TUcTVm`;e7vQO$Xbݔm3F6T$o'b*g'5Ɉ_Va첌]Mjp?(Ky$Bj3.Z|*(9ѕV>6|ӕށ6.8YA7">*=wPQRഞeW߻]dQ{MP@zsԇ Y2m|!z;KrM_O @Ŭ0s7fֺX[{R2r8?haIM.f ƪrq9!_cqrgnoEt210J捁Yl+%+I~{Dl=^)Tmc?xL6'#y,;*~'^y=N9^R_ncOi %)'x8-jO_\g~y/l)/'nm? IA O_렗//9ǃ(]?eË~Jz\Q% s-K{>ZMM J8}[ z~&Ŧp'hp"n-^rj떊+޲&179-'KVpHkJ|;NZ۵OPE-;Dvh.W$תݫȡ 񗅃oȉ1ݹ g#RYKнL[^UKhQ"'m{P8겙gQ]Qe-7*[ A[QAUT7}<" jTB+l[O֖[TWue%hgEoZkfHKXqFwo=;NrŖGS\]]Zd uh R'%eK:\ҁPYc 9T9!I]-VnyвqjuG$gRI.\#|~G2u~QS7O?|)%T369Tp _e^>š%$ >E`}`xuk%e>ɪSCLʱӊDawf )Euۭu,Yޙ:82!k*tg񴖙LRO֌eߜIuӗ3&|=#oREEFAU=\e9?a_>Pu4a_ҙUU (\v*o}`{ַzoRם륁QqHo$[~RN^7]gI /޵70.ᣳW((7j=wH}vpe@qԶɨYI]hײ|7'l߱ sFe^Y2JZ:?/q-c%M~uaslC9!t+wR#vVkpݑ D,&-ZƼM>_J &ǕX"v=۱pP9s(=J#+I~ji7a?U!,[ q hV蹛/Sku) X])~y+Ij-_0ABo7⻚p"xIg^J2^QK߈JLyX'c?t^<-?':ކCJÂ=dO=n:O.f'+=Kmwt$iO\$|KgP(wPεe`̂OQR A|Q|&~(Oۘ#[f4$ /%>#@C$Rc j;1Be-<?yooqb J \ "NI 0tUk>] 8MmՖ5w}i$psE$ObiM .2.NP<(2KzⱤ댫Ephr;(w:T ՇK/yPi[6),=s[lG_i#o5{.$)[9`K lrNn,ѿ>^lBv%hmum^f+~l;/[Bh%IÇK+-&ь$f z]dVås;*WYeɪN[3Qx6hVq0L٬ΑBk_> ePIl^J7S3l%d?^[1 \?F5.9tY>/sWT4gW$X?Ig=lK]|X޾olť>.ιmzh'g4}R,g~? CP/J+!;x?)jU} 6T=Zr06@>L+Ih-"МrRvgYײl sP\_> BGUN/lPf >_r-jCgrRX?q f[}Fz@]i= cH+ !$C1=iF%*IHi?,]ߕ/\BԾ]:PFN{^NQNw9@9/>iÅ1TIf%ZNOQRؓUXf-B܂ʴޱ"72q+Dj,܂ݢRނCc rM!tU9{bl[MܿHZdw߻\9\٥~T#(+u4AWJZ6iAee%a5׳ϻˈ{J-xtU3$Pr|;uzٻ-g^trJ˩ u袥 U;/5PQ՚xs}.CNf]t2ԯ+I8M6͜/H!2O+::KAU'sKXbCopN-^a Nc ak ۻ**uVaRS!d" ## QIe7M:lE*TF1DZAU{D>V_wwg`Rˏ\0=Y>"Ƭ(Q%c &1fvK-qC;^̅Ͼ"_?[nLⵤ6yWS_8]lrvu,n;B+I~)'a3kgo|ktYQocBJZJO>R3TZwqӃ%pF#ޚYu/(dL{!C&˼ґ8j@a=[gJX$ + $JMmV`o´l8 "i-}G!%AB|zywq/Y쇍B(>F!>b>*InieMKܛۢԞh =쇕MtƒDC>4Dƥ}#VXE?U74R|Q% &Mog/2s18_[k9%wz)}a kܵH6bOA]7{]*kB0[HW+R )0`tUE|r&Y7ȡ 2f+א%]*k91eF<>坨{>C*yAFYF Բ-yHLEr2AB2=";xM.shO'o+;$ˮ$oԘͺ"=d'S mZI2nᗏ1Bv41_Y;˗wbqY':W*le2*/X dž߯jVm2"&?&p_\~K]"n*T|-28H PKKn[Qf5^o8E?.fDF*Y6002 _ IKȆcl2'X$ 8n"'w b si` ϶.o|GPoɝй//댂B@s6戆$ކ-܃2,zqY>-A7IsE]61+*Icb?KfH,wNV/x·'bmD K>Ꮦq50$Fg|Ξe"]*a 8RכJ(_>H W}Ud BN)'ro|[7td<ѰGwxƽh;dRl",LJ@UƞY3vZB8u?"]75ӯ3i[g-T#XuK$VJAU&p.BW7M.&]rE>.ƒ$or23HNLc1ʤ+QˠdHa|x-;\k-1ZΟ籀<2롄7\7nHF(ëa" mn^?ypDKjIVe%<`ɳHo564S-׶~W[^OÆ $fSXd>_UJlک+K:]~ Gچ8?>a_>GpX{eAUzd㽴 5PۃKD6I٬d˚ɇ1}#<\H>%)ܾ3s 牰d2J2Em|Rm>tj~Lt;۲{2le iP$eW "TsMDWX[^0;֡G{00ZѹuL(CO(Ч3℞mc)vw~ `9?uv `Vs{l JGY"NLƖ Hޖid1\I20qqx"ugd:yJ哾b:n'WjrOC{\4GJ_>QĻhwU4<Eԗi~ ?cuD$-~_%N~kr!&]*s0P-VӺ`He-سv}lV}2j4tUS0;[[]ɼ;}f(OȤM`{GRzy;е=UڄSAW`Hk]Kk]wKHɝ)wzK'mO(G.}>WǭLSP][ ]2G-N ٴw`EspJ*>d/4<,Oʮ y^vv!<-j?rx*I?!Xqg3GzLA*TֲC[r1=S{B)-:IWa$ĄݲH?(].cmypic{]Kuhnm>&yԺ:hVd;wsG"2e_Hg:_U& GУމyB&Uk*[KXoϳBe8|~4Xnk$ ,*$"GQ,>JX$(< g ЛGLJϊD-HƯ*jv=R m|M|ʫ GgKLR؝O3;\ %S4%l&I`Wn1FC > stream xYKs6Wh|&"j7vtztRq|$:a*K.MN{$hH4߾4ѫg?09bIGQGY. h]%*uɄHrࢩ/'8&(KO$M8(_6ՋZ~00>IT1,K"bD<HIvI⇸ 3e\7瓈qJf+77ΆqdllDZI$_WU-Є&Mr.Wn^-&Q  oGÃ4KFik~sE? Y!@ftFۚz9ؒ%4ּD<0<tj9ƣ,s$Y{hv&3W9Ri4<7' W=xL`}a'XQZHĴ/+5Dؓ)2Ƣ zjy֍a;Ts.b=irjޕQ]qXPv0yy@Xq۔T2$fݩ5cמ:[J%aP6Wa<5[P C+ ` xd <_AFFv@=bӈ;('A7bqҲt5^ $zPw| #\h8,WCz&⍏*x( |} .x[~]@5)r="LĬ’%UYӬe;{(!ykuSÈaDeg ԏԃyb$K=jyA/0wB02A*BO{7ZF5Fڀ^?#bҮ(>4.Nva?vNE |ክ4OOO*LP)'P> bcD.ǥyA-+M+ u1azUS>¬?V;+ >TE])~2ĵ,wdV=ܠ86$C(u,2hz˕cb/=*U&I<.Fh~ ILYXHL=UcllBHYUU1̨(U6<.iFh]I$n\e0JD0d& H;lh AV[ ;pKt a aQ4uy "TVxr)W9Ld:7L$i0 (^DV!(zSV^Kr P (k-$#YR ,~$X~b$Oп92T 4Ӻ,8/wS6%̢V@GtboUEUcx.֐y9+'jGH]-y Ơ-@]3suW6Eټ* So0u6 +1nwX>ao J*áa6Z$<7|ܻyx^I݀ ~wa0(-O]8 eII} 7gr<1EO4&tM42zes3ĩsSia£?x Ba4Y>38eku(?_c endstream endobj 1863 0 obj << /Length 751 /Filter /FlateDecode >> stream xWn0+$Th@/E('6ThPKJ) 0Y<gO#01V7@ rILsq>q\$qKze^0:|-1!p~^[q9&*^l4%M 1DiO$&)ҤX() ãӜ:hVd,d2&Q0-@#|HŠ<ipkgc1Z&Y7mw?X"Z&Cy\4 قB㰄VsN75yBbh_n&o4#X~|pc<' uefӾuYc+ ӱ%Bin~9n"oz,4j)6-׏#{4aȞ01l݅Apk2(&woD$VzRKtd獵=qWA,dNػtRAn<U|DR=*Ћ,`Ńz8.~OC#U>3*:Z5k&WOt ,/Bŕѫ/[gt( 6Tp\,rPCFAX߻ڣec")oѧqӿӿnKLj]Vaj2{nHlv[e]ُ}:*wb^~\ $B endstream endobj 1867 0 obj << /Length 1055 /Filter /FlateDecode >> stream xZ[o0~WD{_،>tSi񰉡*\F*0A*u?~N8$$܎}c'۰n䶍b bݑk2w )MBq%[v͋:?2ExrsaC`'Tb3H_ELEMLc9m>?(ˆacx"-Ӡe5_m]?~:&vyR2OC VqE.n@tMV?V( .>~Wߟ^#&͊D4~lf{lE$gx=u?"L=ٲ!Yh O#E0_Aj"(廄-@Y1J0v5Íh!L(Wd/ѝ endstream endobj 1871 0 obj << /Length 818 /Filter /FlateDecode >> stream xV;o0+Nre<&*M ; HpSˏ:&Y&U&t)vC{?m/.Y} :MBn^ޗ=\S`v(eI"<)O̲/q M"݋)4eC cr`-w^J rqңaW]7ѡD7O:2}^ꛘaD SNZIznYD:%)㽓x\^ 5$B:ܥ bxRߌ%p90\625db*]D_ɗ72 V8qRQ혊>n$=Lǥz^doMxB;B!`|rpApt]"dlC4}mVjlArǡ+mK'6{ :RDX?F-.g endstream endobj 1876 0 obj << /Length 1584 /Filter /FlateDecode >> stream xXKs6WpCƄ#:f&=dTvdO)SEʉ;]Kؙi=x}  ~>irtc$SE RELiƣ/I&DBˀEyQ$xJ2a2Jy∢ГbN(ɂHR"(s (4kbh4MDJ.(%~z6W|Ze`cZ4QК=S#;CɄ< #EO*Z2JD{N<2Ovt M[IyI¯$Ng+%'>GYLX8;AyI㒋G4E>p[UB_//a]td>S?Og vu\#_j.VQ{ZqVD_PEzՍ:`RiW"NidweE]ahe>=6bN6aw3SD$I2æxB@nCr&䊒b^ 0PoG7EYbKp,w+ @orm:wn $uqҮ]]lJt4bH[ʹED0]V 啑ewz[*t-a.o3VKut jg:{=c&ׅ1XaUYU] 23^kWi@Y&JC怛d}&fWzuwHD#tVBHg$]:CHRњqPD7}a߹!8J]9r"Jo/@SOdZBak'~^- 9/6;>!aT5SE~[AxچP_7A'32O3w> 3V7mb}DԻׄ6 z3:#&*ig'i}X }\:}2xF>RƸ1 E-^Nڽpa%dFrx-i@c/LaR=R=Ǘjˁ*Y eH<0m5Vmݺ+<<+A0&15.VA=ix` C _orsWnWf9<\f°H y@f,*ȃwH ]u^}6|+wmJVmxs0uG s.2Px*2pػg!-G !g:ɱ5¬T2VA$ ^.77j+rƉ^WǾڸ\<ktʙ G^S5TSƤ82S~,qĎM?G枦vGWCfPBbn#lOak*%$U;h`pAtʼnqMi88޷ϣGTඔ?2 MlFkXXqg0=S>?h,гhhL,zMi֬V:b|à8;s s^w/ &d/?a^^e9f=<rw*]ٮW|rȡ endstream endobj 1882 0 obj << /Length 1217 /Filter /FlateDecode >> stream xWKsH+TؕҌD\].[eG[\οߞ@4MO v|'Ku&OBDp&(B}_ >qjo-Uu Z;JëϜ:JF1X`ģGyG:C E$ F}NALinPsBJrBu{ UIm>̓T}XSpĸI) A]A`Pyܧs s_Fml+IȦtXԏIޮ2W!&1ac-[&D˗}ss ƥ>ܞz[djm2#!y)˗fiX~SVO8_[w2kd "#?]m u?K{ϓx1I>F|RԩYD]L+(qOM-xc <ɇX発 \ފ^3/xspKpQ0p3iq|\.7)Gƭhx4#`'v^1 !Q%%b]]ArrpN͏ĖCZf:[7hP a ]ڀZ"4Vteh;NktҠ{H=H<[l+&'bjRVcŃ;2v CN'AZ`YWTpe. <[YHfk}d,-֎.3&EKp֔ї<{7S3foڒް$z;Gs#-PXٞ0lƎy<3 93پЩl[8E P 8Azi+xyᑰ& uݖPO(e*UInaiИ X#E mvq-22CM:7m0ɌWVƠGkqUhԎ]N 9HDZ'ʊuzuXB!TVRm=uiaXlv&@4BaF9#D" jKLEVL0CDTt#23hifNt+L'ba#.Q/20a! yGze) X瀟A01P{1*:~(إnR1DDq^M IyU4Dҽ1>6A(Oz endstream endobj 1888 0 obj << /Length 1071 /Filter /FlateDecode >> stream xWKoFWf72)pthX%Tw+%ir)zw9fvR4x h՛ #R<σIj:ςIhL4 Z4i R@>{bu(I'ma!s{"[-rD]eI,1ɃkkH0ŚU=ce%714Q,9h*E,צL < 2g>OoW}m˓ER$ c)*gE.tL#$mjcEBFAjNV[eQs -ӣXX1?JZৎ99H-NV[إD6*470wIފK1}>@x=IK uNH2lĆG>'!cnPmfv#2LL x XyqS>gE])ڼqf<ۭS4h9jd>s>X@.Rc9:J8/k,T;:?5q;brG~,$0j015W6<1A{aZ_އ ζ q\k࢙PtͧHB␼fסW_ = 'm9Щ+;uz6ÆG6^wu?` E؏,> stream xYK8hv@eyjوڝ`4.p c~fJ \@Os r:3O-{O>hc{P.T~ћx? C}i?|K_7_>P'oB*x(}J!DH'qzeA-{v0Ư sΉ>|-~c)?TM_제xnfA,WŽdG5jdNւ.DU);H$i1csA/d[L2g3?d<_Lt28 vpqn;HVc"m/bY@B4ԧy~љz! Ur8C始8蹌~o v<_D옷Ff&:!dHl+gt Iaf^ؒkfN1ٕ+3jWӮ̦j2Ty}= |PIUf\{CSs+%$ήHҭ}*d?> T ppuegm+s:_tHK,UN70Q0Ȣ>[n,n+CnIykyZw.SN^'ffE PxԥcPR wJ9:DN_ŮeIQfQ1pcB܈ t0 _ke(򸰃4-ˉh*.5m'R25O-pDeMYIWgSՊ>(JV2n6RQoowN(/KE"rY?Yy#]&}tA@C%{t9Be2TgaP"NVpI&,Rh Wn35nM* yn k-iCW'ee5yЩ8V`3sg֚k h݇~d#;ڴ. ]Tt0-[“YfݵRgL%Z:~ vʤUU!K /!fEV,ʓ-puSKRBۚ[x8KamV.ٛUP8@̋k!%hgɔ7v%ENuӞN<][ {)`q]Q``1 sf44|א]DƖl5@(w Ѕf+R&oC4/0*/zxˆȼ9껊>;[`% 7R<€-6~Cj:B0h;8^:=`I.h؞Ԉnvodj0^mFw1!XeMG>&%E0VC; ] L8ѶC-Ӣ](R[;f;pL^8Xe_.hna]GaP$&YGA2KPXׅ0(3{W*(AhϪtb>6?2n%vu?K{͓ƀ!א}rч&ه%=!dzXCVbw.eum%J%is9:Ii+Ol5YK~ C-˽M0[,ޤώ"ݹK,  uXʖ ;?Z 9TPFp`'1G/\D{CY}(?T) oe|W|u;딎NCqˉ4z*|V}^vEn66Y_$#ZV6UoFXO_Vu=9#+O`2]u9kvr|~Z;%kexG2g*C(ÖhʖUsO%v#(kJ~ +$B|mԠr&Z[}nUK9@?o ͭ!GoZH) B~2zu5Q endstream endobj 1896 0 obj << /Length 1936 /Filter /FlateDecode >> stream xZ[oH~ϯ* -LmVJw[Un]ypK1)=sVKԗ0Ϝw〝O^NN#C]:##}Q&й{5x TX%>pT97x3*:uR·t=9G8VEBgS%G>b>w$Zw:-@ jW' $4ͺTvV4ZLk8~gb+58Yg=);=='?NLQjVil&xEST.JtJ]'Jp /!Hb7i#sD`NPOūyl`A̖WvRK$^F j?$PB-{K`jV2he@$3EUy8}JY`Q'DܮMf?׺_SvDSykos=JeKmSĨgȯ಴|3 t)5o3 TŴF!V n-~鰿|9Q9P!wˮg'W÷F\zWM:s"\ep@bnj Eh8a0d(HvX CK pG!.߷(y|zlM?=K+Jf[F@b|ih'eꜮ9vaM3Gn dlf S" Yq I$ۡU ʛnLf4T>B/$f$ .E( =eKh'zH%1|F m紏`{RGP*L]Y(aqǁ Ey͕ʋ0 (a]OHkCپWl Kfa#/J<(2C-aM0]C+#Gih4>XͯÓ}+сPnS3׋7r\ -WPM!7߫ڗvmELyW#"L)|UjE6@Z`lsR+j4=ξV*kZs"Uk+`k~rCB=܄J+!l^h&H8EL۟gVS^v{tyeʺVD K^LBr%Ch.*}[ PZ#4EQ@a w}~ʘ|?|b> hg: R7y3ɰdtȣo1!+ǻ\9#r.WH[*< +gx/];=|y鹈&N?9CgIDT;+x\?*+}ĨwLw8pQ9REK {t]IO0\+fT';M4l!k@p@87Ə,0̑# PPoT@xVtQCXd?+ endstream endobj 1904 0 obj << /Length 2795 /Filter /FlateDecode >> stream x[KWH+|f{UH Lz$l,M:CJ.EoTnw-qoýqz=G2BUOў2Q&{Y#4HӧӤσx_7_B"Lwob' 7Ov}B{I}?dT#[)wۧєy7jֺĸ/fRNݕg>]aW>:^]E{Te)w(Prx<>;O (z)W(c}hJe SIpBcڿ]9DS^lȵ6$MSQ#!k_d0"Lh06ͯC|]}ͪʯٍ$,H,m^ ؃ W(Y^/&D tQ58eYXlJ"xcJ}`É`:k6`k1AJTĨU‡?ȏ|Q##I' nFUo ӟ=k&UIJHΨ<u[5W{ Y8pkӱne |Zctr q?~[|,kv)2'eqPO)cpBaQ`yX΍Q 6 6MESu|2(?œ|(~"3Fu+Sp7׵= :!grk|̽.&5@ dË VWfJHpd+ :^EY(†5au-5Ӫj(2T#W<#dt܊_Σ}yaVFƔAFX(!oүu oJ1kfwWjm|Uj2|H0 RǙssf C.K܆Nn0|Q!܏M6mƫ*'rٷVZ3+>{WbQ6WJef1&{ {0z>]0~2˕}c.ZjV[\M,\B!*m'c'㈆졟"p <KU%-@!@ܠ}=a]0!]^QX6<)zpJiQ7)B QQdOb`:L7kQױ$ aLʒz_1N jjGKOsSXn}Ib)Gf ]s4WaH(,":_2$ym0p%\.dJ1/ ^<#4bR>QaezU  ~O?U0|{A`B[Ց [ ۚ%>!,y:oRAEs tM.[}/1#h {}x2/_ϝ0"ad]bbek=CN:?aTӪ,UD}12&AuGF T~4>4UZo)bP/?㏷0]A |_1ޜv obk/ȜJY^T=A\"pIq ``e729nnSJ{9oNC* )͋oP\>CRH1"|WP-NQ"SY!X~3CZoVD4`]~ECtO,P3 K}4ͤ'Hӗƒ'ALu4"z!Pzw#Jf:t 7G4G!E96c1g]&Q UEO!15 }uB i#{NjMZN+ MTxȶDbDn DK "Nj%HYP`KVk:}c @u㚝VN{1N2( ^6I-z-~Ȟ_fMb$M4Y6ANUj~&ǀS|} 8.Ili3C/[}VN~eDmkd~xfkR;r{$Zgw]" -! SփɀHI.G`g! d,c!}O9)+_J$ںX'_{mxgd7g7qX1ͺ:R3׽?U=k@8$/HC$Ԑ29gH`e>s{,nnsԓ HbϿ4)ـ祿sEEoՐrrZ'+huZ- endstream endobj 1912 0 obj << /Length 1511 /Filter /FlateDecode >> stream xڭXmo6_!t_f"R]cpf[Ck`bPl9alK$y'Er8) ቺ7;{~9:A qĤ {?+ͦfA:u㱒gc̏#9iUq2zrK/fq(Ci,fW@DLd68 *qx獭'aXDxX8i{\GsA=>!ռZP}8Y` cH[:T`^D *XZRVvǣG!=-]9GG\ 9)T;'ǾfH:Wԃ|W*KG|{ .K\YqIQ6 s!=[ᮘ "+ULvIwhyUpdUZK>ɖ_{fa(!>D*J5DZ5R+g;gCI;/<Ђi%j^՚-/4}e#lTk g'uA>ĤO,\ L1u UW\$"E5&ݿ!Q$8RWCWұ2EY!1Y >S"]~n,jX.+k!XHVWd,'"MW$gY4SI|sM6D}JΣBŸň16ʾ$-dCǩK] miY$* 4Dӭ$?j@ӭ$>BU*j>o"R0}ni`/gRA=,ࢩR 4FY^T%JK|vE!IE&`_ր poψҢ'V65- W@Y-F3% ׶,xp+0Ku8b>4$C5::+i j А6lr8orw˓M-~fx7׍Vd+][gOiQ cJw3Y+?f itDpԃu ߘ , Kem̔KT _ %m,2o, p]ۼhm/*13\0ܗ$Bak . x'7y梵~7%VۦH{: (ftzUr-6k|b^d4kv"׍Hw䟵z}VN?g)qG/wɋc-7ifC$+!XuƟ俄!$vP45)ǔ P.{/ON{ vr\ؕ;fHN)>$GLwr?6LqwX!kW,PO#2҄a- ȟoEadp{҄ݪ!%u0_}C 9W |~*wSt]3:b> stream xZoF~_oMtw0 ) РAzgAZ=4{YYHQC*=X^o曝٥^(#9IiaD- P)F+n8bFI%gEv$zI+Aw@¥qܵIܷr|VIcJ2QG~5Q&9a8ё2 Ȑ0.ViLS0Id]oͽDauP,+ 11 < OmP uh9aSA弅2PaC 0+a-rV>A=`M<F)S(hȺ?Gl:r'c|/ oV? |T )+׳Gq7Kg= ֍PG\a[k-j6U-K_ddA!1Ma <E *33ŋggy-⯟ߋZ~W?Iu#3y3[-ofɷr2,ϿEQ+ySo_6!Oqq {ڳr`kmw2ae2Be1*lDUQ:jeflC:FԈJ\AgLUagcdcdl $UhK Ԋ+:A3ʷcdܞ ٵFZSoD r%^xwٲ%t[/~++Q}X\]-0}Ŭ UYW/zw^QBo0m7op84{tBC Ԇ XNփO6)]v<Qzn`5[jF{mE9\o b+sw/ܲb?|!2* 챥҈nfϱ뒕qA {~Gz[WF?q$5#Տ8B]WK $%N =aF`S.?r,4DL0H2kω]],66`T)rP 7i87I`wkOP8ti>n|Փ~(?4|uݽikHNkifԁXRn9h ڜ6oXz5 [&0f5IJC[܏-C;$"FK2AZ/%(e{v ga\.xU8P)R(]p~SGuD`"IqFBNJ37kߥuY9ԭ:~;ԐVCy_=эNJv n8 cNrY]m)?>r}?^k endstream endobj 1918 0 obj << /Length 1218 /Filter /FlateDecode >> stream xWn6}WQF"ûzZ`S/ A(bKx~}"eKb;~h6o3CrD ~H,% ff a\` Qߏ"Gf g7]w!x]Q?`ALbŔ5Z…Q"E)&1Ap*@ Z}vP]Nop;[1|Id\\v jc:Ibm(3(tu`Ecw6K0^uImhYzK5jˉPd VjO1B (e@,/r+ I}RJ-[$J zԌI͇C89+ BHJvzc9W\^ +?{D-=\AQ4 ӑa\勬u%en-U>tI㫈 "Vsf'0M-\˧vy\"J[ߑve\l8C) j_ߤ"Ŵp4o_Z8s!zeSNذ ڳ&;26mצ!c#QuY> stream xks/A3P^}p6;_m|[,a= lRy@TF\[ FL" <*t!#gT]$XBHϠ _~ƌ„I C DHwϡmZc_?bށ#5isΟK؆.ېq'Y{|$F kb`"NE–d**Haʋ)V^2?0?2?W$$Z֌ύSQa'^lqrD'IPPXL/BvwAf[7! adzQOfD{Pu7j7H$W[a`w|LBM% əyB|ǡaEսC6wUp9#4aV˃hkJmqM`y5 ?ZgaZby6ȫx{ߛ5>i-bn  \%1 /["!x3:&P>=#M& RA rJUC:9t7A/dV4~y# ra;'Jt߉v)#!A4`m+Ӷ?Q>w fkqY!!FxC=ቄ>\[( m&MH4Bk&~A\g?o@ejJjTEQ#T4&ϱKdz4oe:#̞̳y /mvRN+]5+VF<]ex/M$4ؽ'h-.=޵K#ے,'Fsm")EPc7=Lsgx]QIJ}Pl{=NW x-:N޲jvrRPMOic,ldz':1U]/R}egK`uv?OѨWqlW_Πbҍ,¹$Tc:48" :K4}u̒EWsR>C5j3$Kf> gIiT^_V]̰dD??js  Nᴐ2EH2זֻ̌qUQ^&QnԳ x:]P.o^?Nei>`_mRׯQ*/̏}; }h_~)]ewxLu-I37q`;Q*'o %'J_n dw&iL"kf|ǭZmJLO)AJ} -"ܙ/*z=bq A3]Y2[@@ܲQ'h }ɒd8g}c8cѕ1ۮe"jǰqOk$CkP/('4Nwj^G$dA]oFJ&PP@^$e> xܭ{(T+Yޅf6(J8ڔdw&<)bR,OMr8U^Ozj@>|}s!)g]@|ݼ=#&zk#U,LUȄj/:1^7˧2RHB VZP!p!Ցelj& g(qx}{\\^/>\lw|ZtҊ$p?9*n#KC}7./1>$81)Ba“ywfgʎ,&Qj+E7_o[wL(gCh֠m4 KM6) tFSU,l1ZQ||&+D]g#-™,3u0baPR ֪F8XCX+TGTe N2w?& ` ?J3EE3|k_{wry!  endstream endobj 1930 0 obj << /Length 1798 /Filter /FlateDecode >> stream xZo6_aIFb(!I:oE2 .l݃bӍRY2$iQGɒr, CGxh:x?^L̨0F)`2(>POo%HyG9pȜ S\PNHC5)AfkダQ5DY$NHv sAwTx2>}3t2>?;n 7향M :] sGr}Oڠ1VN!+V(?œߵ;WA.&Q=}TZRqOӛ}}ZIU}x4'%Ih:u֗^u+xn-? 0vU/$nn@&j,th'Ͷ!sàdrp$o!NT Q?-caELoɊhL,-\9r#KZwR5P/I)Tf ,j}&f(h^ĩh`Ï`j?( endstream endobj 1936 0 obj << /Length 1855 /Filter /FlateDecode >> stream xZ[o6~ϯ0 m6a݃b1QYD*q1PdIQ-yuohr>~zbO?y6?x (t]2/'>a&x4f)oQ#z/W3oꠙ{d泀LTftNRjQ,r7 Քꠣ˞I*Ԋ$DG<. Ȗ 9#(Fthfald"Ň'DATzhfy==!c++Ab#ov"hÍv]`K%u?x ֝[?3ԓ'fS63%#75Xaq={Ea)YﳁK7kLfHn)԰1kYbYEr5>Y`ꤧFM(FͿ\4]EæEiBfEidI{](Zw" \c}/f;-!>+ 6/jF4rZ׮X8^0rAxuyDZ(#N OU$RJ0m!"l9|Kʽ&vl]eR!p/>&>\2--D^9㯛WG |nE?C~:.{N/Y B pބ=Jm%Sè 䍜vV:JJ܈3b=(Z:+{2Qռu,ya<Ф@Mt KIh$#dJa"g&2*yn8|ݖ;xˍc([1CI<j.4Ɨc7C _kq|.{]MtF}6IaNuIVU5fQZ.(B 9O vNDI{z( HMd{\0ˎFr"? p$ˣЇQ] Ya)кb7<+2Te&-r8An7;=ԋ1yqnq![d$P6~[1#޷X?A+p(BShMȮ`VB,rY~ 5ISoFo_,`5 Z?.]\:ߞQ5 @ueJUB~5H--*˅i[EuGTzix_R Փӳr hs ձxZ' S=Q ߍy;; .UmWY'{v9?Z endstream endobj 1941 0 obj << /Length 1791 /Filter /FlateDecode >> stream xXKoFW9Qdp '@cP+D$X;|Ɍ 4i3߼Hkz/~:8~#qpj)8"\{KLUW.'\~}q9y;e7cD]qI"dhȧ G L٪L~R^:ȯ+w=)pnt9 'p .7va]zaWW;dnhi7b}18QËRzyx8˗oFgTTsIj{Mwydy֜nCJ%!o*@2vhB{NWT{0 V2gvg "eDW|kKgZZUfXv]jW;}s$Ʒ+xjȤ^y$.&qC~BAL"v$'Cvi&MRn9_Ew4{=N$?9<`Y$VP/fǭ vRcBdxzm~IJpqF:VZJHKKyfC._׺ mP[Y iTP7:vF'l5&SIDÆ8w"șf'N$XX܋rx#EX RCI2'-vi)bjKAؖpOūD+a]1*,jR]UE9v5GA$0, &0r|:[R%~UM#4%vtFUR،4!a>{#HdlX:-,"8A NC3~Ɵkh7UG0QHA=N٧s>h8/Q`r [fES~^cc4gEwi:5", *a((2K-iLrg%pNlz -!Wjk؅oxԕ۰xb3o5Cerw&Hv[QNo@nKS{3]>G4f8ִIp ]=|ϬġccVb8BֻKS ݴm겘G%Ē[5o#+"I>X"H(%™.Y[A/nTä{wwwâѾ*kz~5N Տ#=q!);でMP$Ы^<$n^%]K;faUڠncrfH/>$yAUe#G n#|3 fΟ$?˒ZϞng!XPsV:@G;oY ZPn-he+4&Z?g80Hw< M[ҋvm纨{+mh}?xXddL3K,n*stXr9=ο3H5m-Ŧ9e,v)-E?[U}> stream xYKs6Wp4a!M;}dRӎ#1ST8/^ (9INrba&'ON/ c8DG"u'WM6B`(QR gO/^tcyn,8ׯĝ'j'Mޞ^R(":s;gaՎAUZҬ/!GztS=+FZ\ t<}7/gyv&iYVn37"hil\.lr6I c:1<ϋUA9wGkj[ѹ  T>-,F'([drysac ǘ,?T7v3CڶCCkdD9%ͪޔɼF5ffp1uiU]5vGߺS3X0BQI?!p̵j0Re+l?Ke䱘@_$@[j@"dRAe $ !wJ|e=S+;bBxdGu^@@XڙƟSYZxmHym^nO mk, ;šnc5yS+  }pNPmOޘ'/~eKE^#_}E\cMI*%:5 dRh*u#(gxvc%W.:/=䊆-$>8QGZ|4. >Dڍ!A %M0u%GqS\Ζ"}=G.Tk05tc3sU~Y]Ů>a{& i_x!˿^/ޢ3֑:Rƥʦw!t6 zr*bH7o3W|U]fCb]2X*TI4tU@UIeCTs (z5!^+kUL{*cpuQa.57v3vhܶ;مaP0/dK.X1ڮ*٩lf]%y5ɽ< `ޘs3/.~ybZCj@A, ;8^ S_58{pm e8ߴ  D=@tE`i<,y6Hy`~so ^1$\C6o<6v{.oi8qܔLik\,6;&,k< ŢkfUT}QE$ۢ`-eJc8\H'bq@)'&̪tVV Ad}A 5Ű3 b":C+rTUj,vGZtd/7_ |JhOEm+\ }N{V,cr*-}Ҍ R,:d. U(% _kYnׂw!{Rl:IKխffMaR[ endstream endobj 1950 0 obj << /Length 1686 /Filter /FlateDecode >> stream xڭXoH}}4'Az=]ꄪ~p`SNmCB73668$9 `vvv1|ΛAGy/;QȤ;iSW3Yo;'ч罁ş/_M/`9ig\1"KtᙖE-Ȑ)M>ݵ8&@qL~W4YaMk<`I#U|Wg@Ԍ ,3,=kcJ)75N sąj,f2Р:{9+zqo $xEX !Bwgt`{p]eti6%09q<;X~_&'gh$m%\~H7=sBn;y `z(拥s[Ī4,+R&/gF{֔fi?ViAgxGt2cvu4!A ʔ>~R.vs8L''IX{e]5YS7;v]749p)(0F;08FN H.V*6y4)y ,~AXm%m)=XJy0EPj jNzvLg TtG(yp꬧_H40Z(0R/]JA&qPޒZnPJ8޳b>ƂRBxRr;vb1n,5f@U8wwI q UdӃݍsj8ӡjD\@hK&yS rr;%'E.t)'CTLeJ^;|LM{9h!يm2]8S9,NmV4?TNJ-\'}"D' 6w96z8>l_/$œ4ZCPr m`V 2vתusuQ?E>Q4+Ƞ^`YmAx H Sn@n*vJ2pSi@t6|${_*S~cU_!lW+ @KY!pnD ytgpʂ+t&LVYfȵS2=ii|Ԩq bii0@jqaJ.׎qikzX4ݮ^A?hh|A endstream endobj 1955 0 obj << /Length 1654 /Filter /FlateDecode >> stream xY]o6}ϯ0C[iNaK+6t t$D<}Q,ʊ-#ư'22yx < 울BgY`8\`:|9%NðgaaW?^M'CS 5O?~3o% Ue[bMLMj ,7$򆊿_GY3|P% ~Mh&.<:< 4 ;<[+_NMw=am ‡CAfs]@068A.Ƨ-4#݃ZCJצ8S0c#xR 7-t7Cf$G3:4:we 'rWV,@[jn;A^' i8#P& kH> stream xmPMO0+ (Ldsfz0Q#"ƌZ-m|Qfʛ,H!R(f( aaz9NGgyQf /vMGUYwA Id*br1[;A3A!+v--03Gyz=>mS •=6=25e]Rϊ> stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ040Ҍ *30GVgllgjh 41 5HSLDOSH#8/DH1dVt5 Ҭ endstream endobj 1970 0 obj << /Length 1249 /Filter /FlateDecode >> stream xXKsF+T9Af筙ud]I%$l2ȠeyH <V\Q7 hnl 4%*!)Jh$5F|[F͚I|+\#żf^eU֤m^WFAQ"=I "`ǟLơ<4AZqDz{~ZТr54?NbVy_vV:s">^'TkVnڴX Yg{'ڀGQN` 40i0넁0&E=6/'3̑< G\rcQ8]Z>'#]d ˴}m?5uy&|B˚OX3Xsb 7 NMi[Y[ ksq"i=Dgl&;zQ>4[{.Ly,>Xd2}oZm.VT&1g+*k^́P pDΔB#CCLi]-vWQNQ@$,,ؠ8F)3p_Wz6Ծ–""e߲{ HIySr,Z Sx86Ç3'vi8} j[BO˰uv{  A/wdD$l{F*n+d8,X,Է“W?j6yO u@32m 27m΅K2[fdz"qڴvѺiC;Lh QS{2 ;/C̲!OG,hE~xUTr|/?pepE%U7>RB|'wObAȉhHӄim|D'WEq<,-p0})|VHW`R렆CLW4aoa<͵Ljunot}c~ /T]i5!VL[7jl6kSմf#/QM]sᾂ|o_?It@"Py?"_*7;:Њ endstream endobj 1967 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1974 0 R /BBox [0 0 251 211] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1975 0 R >>/Font << /R10 1976 0 R/R8 1977 0 R>> >> /Length 1937 /Filter /FlateDecode >> stream xDs wN3 H8;"*pWLϛnMYo^[ӵ}=NOC-ei;=7}ivXlmm -C?<4_ڥߘ0TZPemnxR/)RL8m3KSwk`f<)ia3Lđs8^>X#u 4Ѽ=d9DfY2G(iGd<_P82X'hv{r&" W9%v*r-(RLq&Rf<))8)g3KS\O %E5)f"LVChVB[@^c qd"E<e"MD&Ie" D`ye9r&" W9%v*r-(RLq&Rf<))8)g3KS\O %E5)f"LVChVB[@^c qd"E<e"MD&Ie" D`yu?]&"ktZP$,qRF?^SR$,q RF?^SR$,qRF?^SR$-?E6+!pC;\>Npph+lVC$vg}") g1H5: Kh+,YsV<MIy!*R4l攍8B-R4攍8B-R4甍8B-4sC&Q`q|XD=9Bu'E#X!8$Q`of C,&awΐ ,Q@1˰?;V@@I*v ÷\ JlđrIQ)82P.)*E<G%E(L i,b 4QO`sQik4Q`H=Hqd\PT8%E;sٟ늃6t M-ׂ"TyI *"ᓟCPVRTh™x"鈧|k8V K8ۓD?^3H:9$Od1*"3, ~lq;0Δp[Es0K;`<))&>9wxR/)La8f# )8c"v 4Q1GsM܇1GD(.Eٌ'"+Lđre\.2цr-(RL<;`<))& 0K/O %E)lđ"E"yLn& c<&`yC<&aHťH"_Pt%82POlʕx!lCb WɐᅈJ݂!ES#C!G(u 4M؆z3GD=9B%lKL !%&Q@ofCq;gHUbI#P۰>) k:@+quRN<3.2 4ںJW$DžK.(Qy\ F\#Pp#9P2l|F&J=G]I?NW=>L^Lx%M% /2W"r!R0utl: w9^M$:~O=M.b2MxL?cF4;L/`yRy=įDٯ\_b d@΍]"Bw.YO3u?o>O>p;}ۮ۟ݶq:sOsMmCs5)?p4ww޾tOsy'g[vZnҜOs?]z#;lƷucg[~!u?Y>Cw{sRZn/O3> stream x={Lgſ@8/ , m:(_VǭY6 (QʔrYAA 2hhi`a'lD4{[^0fYr<9'9$ HdSoiՋarbk- \Džp<peUtG~!ڰp[8s<|Zh!0h gԴB<>A"K$gȳdypD0idgL3k;O$lolO͝08rwdiLS!qm/jri9\ kuus :1!:7YIXrӳ?1Z0yԤWuUR_VR'y>'Ӈ.'ar76!ZbFIJV#7(% ͏Zsbȃ#ݟ.ϑgKKĀw]>,N< \wnv4t4tWZ>X>QNW5A .d)3BKץtOp޳QX{O[`zsl",T[4 K eqL,!e[/.*Nhf~{qw14/sJ>/igfd-$^MoӴi  * Mo5 R՝?,F.vERrpHHVߡĎ:I-}) >|y;1.T՟cOJ@bht̀e4lj| OJ1(mc _{/.Vs,GB6Ga7z_HAA^ mG;mD%,|{ӅpZofQ]v0t}躅Z{9Cc̢@ EB}@Wm+7I(d5fsȃ.v%ގLUjl8M**()kh|*$`ћdViׅ[Uzc}ߧV#"Րer}L[;H`Dd)RX^ycbn9-V_΅΅1ي(\! ؋9DXPZo42oوru&= b endstream endobj 1983 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 119 >> stream xcd`ab`ddds,L~H3f3ECCaI# L@`͜uDɰ!ˍw>l@sy8i? endstream endobj 1986 0 obj << /Length 1888 /Filter /FlateDecode >> stream xZKs6Whr* tܤiIՓ-THʖAiSNm7bbw{$B!hor֓'Q&q`>86,|ԗ(Cc~zǨhI=y}A@_~{`C;^`@FBL` I4|9?9,+K$R9tߥ*T'a]6Qy>QJ*C8J˸'W/vME > Z9v nx™i,LksGdK;/*7|ZGMԹ".Y 0.kj2!Zӈ1\Eq K\W9\Ȓc*"N+tꀇj tCg%FӏʰZӳ-PG9†7Cu(b_X+ tŤH@]uf\B'2]QlƢ*p2f:v _OgUIF8Jn -3;pfM儥nS:Eٕ.{D"88Gʶi/NDths"^5CC#N1LB1s; `Q,y7|5^ `z2i2Vaݭŧnu7K͒կ;aFIF5!B|XAn.LJhÛѕpE ,:0ZuW'Z&OJ蚌zH&6@}%/}Nb yF-R7qU;:qh( H7֭KKYjJ kDZGNZ!Չ, ]{POgif+DB3$e7Nc;x>6cBFޮ v*Q! |t(y95m\uO(s'f_ sC'Ϲ팞9mk4H@UqFc2@* rWvkE{݇i'Aj5hƞleRvsiqL_֠7%*H\HzLy V !Tžce:&sѝ{ӻf݂PHyOmB-cI7K?0R!@v)8-gG3YQ-{c=;@o{'^ 6be0Qīb}}q/5d>bLFr̢obiK0D_/pUqͽ>]\!  B_٬:ER(v+{'}&fJgD*VSunt@eMEYw<]gA \k&sU㶚F%dD= Aki*ꥯPb]  4ԭΡթ.,G\>ߐnE)L뛞oiqZ ӥI+-@XEPCn۩]Oщ]qnc"[OE&tM>GC#u-OAT:n:[>nD]Zžb'ba_S/-Fޮi}K=nǮJ;v\FzlSnW?NKr!@ڊ Lt)x y> M>a mQ6kbW5*pz /x (,΢[`!btQb(=^ܛǟڱ:|CAB=^j,Hp #|"[p*|OT[[mOZ;PaDobA!|}*َn(/%x3DYb(.y ɜ#B-y`hrYY endstream endobj 1999 0 obj << /Length 2134 /Filter /FlateDecode >> stream xZms6_/ +;mgeASTI*{s/HƝ Ńų`>7'],D:de`< Dp$czw}?Gj޽78zsCE3\`D~:& ɠ4xƘH AILc`hQvNhHyXdzXD?u+]!'Hq 􊰟>% b Ñиa$^?3πR;_ ۳}]:BA2eOe<6Qɡ@zah"cH^ m22 kև [><q <ʍsxiz=^/odBvNܷiV_FwG#RY:,x)f[MtKī3[[7bԻ_iQǸBV GY6ߔ)=b",wyt6 `χ_tkiYrRϳ§|{8m jF\K'hhN&}:R˱ b' 4nV' YN5gW+1x]?FdjGcSɀ%-+pC D$fYg!ڱ ħrjp3 eeo꣰` {q``x ysFis,4|}kTZa JvH_MUyDSHʄP=n,~3*z(I܄RPA ۜnک.¬6dO z(fU^ep(#!bv{>fQ̷3f,ۉ.B:i]# u)A%g@1m)p"ZNIƺ } \dVg 8*Oͻ_DELT%T@Gn"6$- #IO(ȔYJsPWQMY'Xs :2ta@*OLn)\]/;Fnzᷕ؝o]B;+̪=p9O$T_&lWR]'k׷J7WSU*Fx'R7gr_tmgۈ#AHZ$Lǥzlo9*4#I܌ы``m&kZkn=5.cw3^ICr!^x1e׻dMǮPlo&F2)o!O  B@J&bc] ?hKw\> stream x+2T0B˥kbP  endstream endobj 1990 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/multiendborder.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2004 0 R /BBox [0 0 595 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2005 0 R >>>> /Length 2066 /Filter /FlateDecode >> stream x͚;$7D>Es*,^Blղf&yu%>e{_8gǚZO%^fo\~ע7-'T|U|jPdJw:LkI,$߯;T NJ< RӍDqㅈlOBW= 9 wPLL$!!i/W%MΨ"߅ʼnʢbBE 'Tg XXCQ.,N$A dIG.!rʹ H#.\`E*_DqU1> 9À O\PCKѩf~iYfej\dM*֢0TĘqOb7hKH_Ӭ)X} ք1|jJBRUL|Dbw +?]waO$XMRY/~wc HlբD5o À1-!>svbU3qX'"ǰ .,XIUVU·waO$nՅ5 Vek's`UԬ`jxL".1޵+`zL}n 'ggPqFԬ@P0f?*s^FqYX{o; EYXu@Pj( $P"]gLb.Xk( $PDbA(fG@FJpYNl4O_Q#mt †IhR A# @SHVrD{KV9pgZn煵L:kON /飑nOc3SMk1v. K Ək̙ 5I (>TDc)PTS@$RС!؁)>CgIvD: L@k 0*R#IEG x g1vzѾߠ56KA]!,}TO3,6Wem%}j+~P9If)ऑ5Nu.(Óg:I8Njm,JdD8'y⤳(q% ,UTgDWwaQ"*`Z(1=PD pW%#`ŁÆV{*FDQN ]XH>Tw}gRs T컰(}yWS$P"a!¸oLwF|穯`&.7!B U|{2U I@滰ȇ\8dדX!q,Dj@3$b滰ȇ$Ȇַ&<dD , =. 8:?{"$n |G:YQ&YtL*la]XT@滰'5ZK?u9Ej.j }gosw>B T@ 2}ZΕ<^4}7HdP͚HgQb y}}n,J$PͺOgQbun,J$Vm(q>'}7%ԩmwcD|yf(qin,J7ja:{ƢDxw>FSGQ| w]HoȂG1bģzϿ \ endstream endobj 1993 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 594.999 420.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2006 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP' endstream endobj 1992 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/multiendmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2007 0 R /BBox [0 0 595 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2008 0 R >>>> /Length 11976 /Filter /FlateDecode >> stream x9JXa%WZ(]Bmi$<)Ha>Zg8Ӷ}ug^|~㟡O (9 +hh6Z:~9A<0&q?z-ۧvW ԰oq?0,'I" |=tn(Dm,g_>|'@a7_?}ּ}=shVU@Fd*psA?'O0gIn.be> ;wD1s6[f`1H"*+C$@T9v|27ĔzJ"J:A%H\e]/2|zi(K4'Gta>[av0: B@hH3g<-lNi a\sshAݘ_CRl.$4tg:4vu6|>X}f_゚ x'w_(-onjWm(.HXI`1.yuKFMy x =jvj}j![.=f"w勸Py *Y< 5a]:$QRȝtTNYLИGnL[j:gM}ZX|VpխK-iadurCzc @#$ kF1u |5PR>@|.D24'Kv}wVnKt)AK^#EwmJ:7e+xw %yp+v(VwaJ.W ?{f c LŠĞ~L dvFkڕdgEzDF$I6HF"I6.|X I 2=^PT'/o(PU_ǓO-7DIc_&'  r C:a;%Gor(ĠGDa/l߄{=&cm OјK0~pxČ,_^АPtO~fq&"dPA@`PDBaa ^* 95r|.[߃Q㤷.w{KҎ$ @F(OMJKk·gc!x OHb1KIl?&!D7mQRI$zh{ZB^ϜJOvc][zCkz H懰 (FJ˩r{7M2 lL:r ,HbJ&1 a9}5񑉸h,e,rY|8`Ir8qptK?#jӈvA9į]峻e\ `12Rv xLxcCƈH_z[W(88ȩ">{ċn`ߚztRRkU`ɠ,F-D4*= NaHzd>u]8vZ"<ɭ\zꭷ/N 01x6U7Of@4*yJg$O\Şa&|)EfDQ=fKԓ[ >t5{B65GZDuĔjmk[ZN0ٮh )$8ɚo+O)K{FP%䈩靴ş mScݶ-Nyև[s$E(lZ ^d'kZiN1oKJʯ W0 ՅJzEZE7ѧr *մB":@EzĔ@Isʺ}='(Z*$GUM?#HSiw@|TSCߔ8Ш#!0(itLz?izv4 @A@ ZtZ)=˔GL駪5=gDE ܊eZ-a'%tQSfd~h ~cG/,G~Lp5a>3 qrX1UizӑxVFeRD y·ԪyTw-/lZڵRUvSoS(:ғY&AT߉-Eq D=`?k:$!5WZŽZтqFi\gqy?B lSoVGY!%%ЮBSZzچKoPzZ$ͳΗ&dw.%2޺r7f98D{q,_*MD*Rǽ"B"n !h_0&LiGK q'5esina4u-biڝl\dIt^{e&Pί E::ao>SU 0wAơI.=\o j#h TyŌY")IGg-d 0/BI EK(*)x")ђ x0/d)I$d*&diI ϯ6:Ζ@5ތI D^m.g{;1dI:2F ,Ȳʸa@4Qw&_ӫU;]fm׫Scrޗgk۱ntGw 2;JdDRMC1`Gq?(>萆67!7N< ]#1MiIJ؏Lz uXyX=rӕ |UWp'ln׍!4̮]$U\h*lB  0jhQGO# !_~t$_1ɶI3tHQ: IгbY-iM:E8A(K\ )p:ӝ2/=O~\=p*dbK3.l`%`V%jQ";tM-SamR|~#e|a fC 2[ a?D/1uxB,l'f"Pm}A_@^8wd5&=;\hBt =q# W,'s @S?mç;zeKM߾wB̯%PԴ+QHƥШ\!7FGv␀j4v1l5x q,k_Ac/91.ܡr/gJLį%+6 \.۰v+W|Q\56RƖ6tu:w3)[s`pi\g)~/CAً|ݮ=kc]@X Ԣ%eR dRdh-eਘ3|R xX0%Gscd{|a~-yt"ȳu|޷+}~7 _}LRK~~0:|̯+bEL(nuxX|+,振n̄9ΓQC7 uc쇡5rzVBw[ r/2-"}gm1wy;gy}?*㔡zd\]_ +`2G$#$H%s'P"DQ(HF$UPC|:+@1b&z04Wm*RA !*~!D < 8RT{kfX0m1`$=D93tdm*7+cNp4mt9رnBLW}#&\vIvKȜ hlk Й@َ .+AdK'(^YMݭg7wYr{$SPzD̜ʑ /r_ aB-SݻsJmozWxc_X 8hɘ7]@ҕ>4ˠ(]0hM`Ԧuh/ޮ >~ʣ%cV\E=0"#Lb3闆к'AA2hQx=R+T :>\ 1Uc8(Q7;Gwr0)2 x!rȁ+-4BmE!ԋUD(! 2KFd )Ϯp5ˀ@2$Nlc* %՗7@=ksL8r$eoRҷ4 hקbME@O{B2{;}+_tj2*_$O|a(zJS:Z]v8KJї*#UiC~K7x#Y7αUSqk_:GhSJ@c T$_#45|MJ|!he:*3B7UtS-b`_{b0sW+[@gcUtݕ|]uWiRpivUcݡ@)_vPt՘7+Twּ:y]24UG~ $|͍WctupH37O]3?&֗ڳG<'u]wvZӊ_rNױy&nWo]yZگXC/{HX1w5:U |?D<ǂ< *W_J9~Rt,[pݡX񨺟,aޣ@1e@~~CcMcu RvW% Pcw* h#<ֹ̫^8)^D5t}$xbH?ų*PUvlxD^=)['M ^F 9 C/س+A!.оѰZVt쭆!,h3 et!.zC/zUU衂<ªtlqWp(H9Iڕ:v9Σgfɢt\6xq<0M[!=., m=$DžttT%e:\@s?H_8?}-w+ߍK{v[E5m^Q%(UZ;KJ/K+9E/m՜Kc/8Ϋuo\',_*/헅z(ͬY@<(}BZZGD='Jݕ﨩WLM9+t%-`[_7n嶏YߍޓrEɜQ~Ax ŀ)JaFL7)q P&]怵Q]ZR6Hɬ̯%>S_ڔS$TJmz`4`a=ƑiwWg{XzjNsP7&k1T?XIJ[$(+nI?MtAIGFI$lۄɪk:y|zN獗P$ǖZَrOcԾ)qcF-A"g(oF=k6|ic\ ⢉i3o7~cst)YKP庵Zs3TM:sK1>btڗׂF^_NC &Iފ31&]PAu}䯔⋎&;:ՏQ~dtJOӭ[}z(H7cn 5W2[<+]h\ГЗf=0 1C|L#!8xUVL0.˺깗0]@Sλa"rx'TLp?\WK(_02 u?0WL( TUa@CW`e\8+ɿ,wBR}Ir|_R7+1j(+!jg,+xm=#/(z\#on)iM3Cuˉ-4h #ŏ#űQPh|/"eG/n)tCPT?9 1!AGH L}A45].eW-ŀ|2 ~%%)bfXVW .pˍv|}tČR4 0ǎ;Ne^3F%}$}vX7qN#QX׭< , E[6PH &JQ ̫%Gҍ$GhvMi-Ű5%.)t\ (w+Pp؛)˅\8%y5d!Er”䯔GT _A&  1Pi&~Ԥ hG ZG`^ D1,bjzW 5ELzIԆ,FUo|8ȊȸwOr.CXx $|A4F(|"5wl)TK'e&v8Xj3dK0]/kѥh=;#4NׂLBImM[ћ*o%d>eBSz)C$ZP|RS0MU3}K5r^/ub&\UR6z$խ@R.䛧(f "^_+;fI oi7',F[gT")V_G|_@9S9勼 $~ gHH1!v~8FHZH䱝mØ$ ym{~1g@}9F>T>Dg}\r iJu~ U~?wG5P/.CS~d{DQEcNV~1%y K3Zʄt~h{͎ |R| EuH'rͱ3Z-6˾D<x ^qR2_t4Q%{/qm9rgǨ| FI(ŀDmʘ4u<_3M~#z 2OL%gs5F?2 8Ɂagi@sT^Z2:G#ƣGw4f, E*1wE|+y *[-G\=m3rns͋ +x\(2oJߞe˻1e+x,kNEZk1(x ͗}9s(c~/=QTh"%A[&KD)a:\R@okn]mqG>/{F1>Բ9Hl6R1-OC_.ǝ񼐲x %B܂CQr2 "LBKR{.H쐬U{:CTjPeڄ06W`l!ifbO2hH3 Πմ4M^ 9=b깠嫅i=OH7fV}mJDxZRТLΗ>we1a 푑=0Q͆E둒̻b^sQ0|u?ܙQR)JnOKK{^/ؽ|k+DQ/-htP0Н}A h?qٮOidjnNLM;/ b] lw܌7CGybG=7/(,<LPu/e>2/e$yU Ƙc|D—;͑S4|dxsov&;7 7cgogX Fa! E{t9QE Qocȡ5ry-́{Oam>mW?s|\Gjdw֚k2yH^IZӾљHYAq~"YyHv"|"O1HlB'nn-)p7,3$ BpD7TYwn΢r/ܒw}dt/ wu Ux Ux޹Fwb]]t…wuMpǓ 1kYHzub=jFԠ,(?^ƍ.O1 ,O7טM9-_M4jNz*"7p PgǶ5oz4/) rf3C]p<[Gme#VawOztkt,1!G}LtOz{_jﰞ{]@ _K(AO/x/H|̄Jް|f—L1K:CoRm * K(T%x1^wt}ޡ~f#կ}Z6^f2 E/+EK&'9^) q"N/|]).<rx'TLd_)J-aЯwBD]O;Լ2?_Z_EW˶s3O#?HJft.$ҴMWiz\ӐBA Û,63D xAK7Q4+G$ߤn ʸKP XP=ԣA=eyɁ<H6O6镫ϯ^V.zt^5L>DÂR|^RE$.Bim4ODVRGKkc=A=cB5TH {+\w'JDzՄ0O$鱂A(þ^Tr:n/(֭߆)_ݷSuS sC*ITZP|F PRƚ#65Vch+dP/O'g""߮iigM?kNLhk hC1!|Г?ya.ż'sn;  Oޘ !x'o~?j}(χ42&T Cvx>ɝZU:y1*?W\5R?qO|EʖͩK2+yndS&jJuKJP6ju>; DZ4X> stream xks6ǟDp̥mo}$"T.JMrN`X, `FQ9f~5dWb20.*%k KՐIE4Ƒ}?/dY$yg?C'ir~BH# jJT*ZnN~;!RJctSxv#T= z=M3O'B&Bdp֯]SJWD,)zT]ik?mp:/f |]ʛZR*bI3HAȑ@hx)YQ)E*I 3*Q{#3`ـ]A M1u*9%T4PPsF4赸QµvKxF1w6"w&AY~rgN N€Zl7}Y"{ȁCWԥ\ Ψ玟dVꚡUuK(c G>mQx ö+,l*ovF p2t$iN|j'yP%fCx:]^%h8IY" UᅌO?5Wa(a1҂#8+d򴀔_6*g.ٶ8Mb۞ sIg.BϦdM\if-_}Ɵ'ݹF.'cW> stream x+2T0B˥kbP5 endstream endobj 2012 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Thwithouthole.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2025 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2026 0 R >>>> /Length 9686 /Filter /FlateDecode >> stream x]9n(Ք<N&Q^^7BCDG_??֟/~?g{^u>?d$c~|o ]ףP;6 (39:hx^s?f>(o'?< '}pfޤԁ_<ׂs|M yz<궄lM#9MM0 ^%}7x?n# iN\X0Z6ɧW;0?[Sm;h!j OK S5wj (]i5JS͊J}i9El;:jԬQ\Vx=4_*'gYqtLj4(Cʚ{n7kWpY箷ֻ>_3VC$,-lgPsyNm5 (m(y1-Ias>n1WY@ 'Gǃ&S418?owڡt%x͇a<-O|bxO˓ )@?za|_W=9x.re}PnjKU3 hvgCדsqC'y:C2%la:'KdЌ 'QlGK:x P·4J-uls|oFgB0CQP&;9 3;2?Cgv=R@P&s8B tƕhNh>=2jau*-dm#h60w $xۓ{5G(#}.e6ڡS++)u|:t]2$W=l6תqjeU[ǟ⣼e7)[‡VbN4?r@vۡQUۺv6>՞5VҋiPY'?մ(vugN 565m3j: _F GB8bPuomʯ e@dGLjqL⩎s:lc,cpBFO E҈>ԚTKZG/ڧ]G 3YXO]ڞ7Ut~U+6?G -Jc@GM[)~tաRc{zS jt̩iSVxƓhH%5{ ;ζOԨ sf')Y"jGvB׸SIw{ĺ|'}ltf{H wEG'0ζGNpetGFK27X tNC{9k/7m״cuus>7]; >*MeC^QsjgoGgDRMd%2C=A>.pnP| JHPdgI2yϲIiUZ0/;IOH$;P<%{9ϰ~T:4W.xO&)-oOZS l zpdO^T]lĘw ʧeYq kӞt~yP(8?jt+)x@G~gNS Jm;FIQ= 5hG[*F]!)O:Ri'gjSs$kvhvMI>6Lti E$Z6ɇ-hUMN,Da9qhj?Q,:^||3GQ']9#@(O") :@j>ﶡn:xz>ɋOtI7-JT{em4F5s26 ^s󱮱]>hz-llá뚻KlxPJ-H'Oכmmׁ?=IrKMK5zCj,5 )Q'ZoZgz講۫Pkd4Bvv޴lۛ-,'$){'m[lI:JM|֏/[ʤ z0/8o{rwVFw(5vxl12t斾/=%W5(s$c tQؘ|.} ,١+IXb7O5U>DȄR `ݠ)Y0RgNǒ,@#(&4H$5czuD Y9=V}@5;k}eRj?Z9s20--55볨S`FBe\RIV ΂]tC/BЏضSD¹ gB?F~|oIk{ٞmtN;=GzWŌuhA \d=j_ߗzX&tŻe2CǬ_q,kM>Kme@v9 (CxHaA\pNc}_֡iNm<  4jg.'>h,ujZ6'vJw_ jFB񧨩Le[9ϗyK{ُ?|HC> 5x90҈LY%.c9%Џ8D&2f%R{X)ԸIuǺ;KMt v)L2?Q3n:Mx]9 k˔SDױQ[G9{eWyCKEMbp豱C'O8kݺγԍ.C'MF3Ge|x(uO.(ӡIVζ6K 0lžO4Ң썣6ɋHwUF>L#3NYqhaù\ lu\J"XXHodTa6guᓨP`;\lU`!j2fjM욨Q/+ m5QNƥQ[)R5lJcUU5fUgL]R.!8\>uxgGnL=G+o0H*H`Ģa\CJN"σFS3#qp(BX\=v@@z15$6 ^0Hڢij| w*5W}zj~vlSfIVJgazn7O-#vߨ+g^Bޣz~8);-OOB'j:W|upeNzYײ>3G_-YT #~0u(wl쇏PT%$.T|JL~>G9 ]RI#4mmo0۸# 9iْuʉ'GuWjRfo|Zv'GN)͏OL!-trݠ8 M@)MπN';U+k=9J*4G! +y["KK/Ύ:?)ܐP(.iv]FԩYL9 y.ʹRjߨ-dm{ZoC"}Mm1BFvme cd?tmaGѲI>2X@B}IF=kߏ~IfgG|Osdzw`e5~y9bW%fȡ[FUkѣPㅙ(A+K@+u]y<(AA+Jl{ݠiO:z|XŮ->Phj冒:̏ 5N46I:HFԴxvԅϫerHz35 ;v(C԰^.6?jPˉ6M7܅55 u&۬g:7z2`u/?gN[*m!6X2C5(=2)9V(ARJAۑfR9%ֵ)kGGPwtȞK@S^θt;:HP8zI(#` <ƟD6ɇZrV.Y'vF" s ͚u'?Q1Xajm§^s RoZaGTg(Ƨ)W y:L {8Gz)=M;%8Lz!`RuUv(KVi}uC6lѹwͦlLo>tlxvlyJ@KrhْTZT4"/m_q*QR Ԩ T>U𹬦v<y"{~~ߏZX\`ݎݓN꒐wC)Q^tԺSށ:R%/:Ů㘃OҾtcR/7T}N$9Wg$l-{EIt_x*HkQ/'GK5-[‡jW(/|?nQTd^_ M6MrxΎ:ұ$4 Ot_rZ%B͋z됏^u)ܯ{Hm} ^Vcnf*(EFC|(e|tCP+hs21g{qA@CM#s>(jNhZF%Tgpvi&@9>uHdNm]uV$'J;dai]Uۀ1&]v(Qb '2ptl)xxG:V?e<E7`à )k"s`,|EeqWi^! - a&Z輜I*е2o^Ns!jݟ(3W:<;wJI{NmS_@EVyω (s6rvG#jz([εsaG~h?%G3>yOcn>ޡg~g156 nRS*ju½Ǚq?Ò [d|;A37{aH+!8iл2{# Hosw>Dۛ_{Zo }|jëڎj#h%? z?PtDy@)n)#,1fAPy!.rt%9bU5TZ5㇬z:%*O9%XZM:Xa,:dpQ'] Hj.c572 ):h(S)m"_@Gʅ6=;uwR3i9\kZyߦ{REQ5ɟwʮ6G$_W(dƿΨ`Kn1_7Rvh˘dΔeӬҸ #oqrrz#\Zz9ov3fLc[8sT)cQ+*0WQt8wd"o@R~^~p@GEΎZ?Yh."iΎZ "Rnu't"bA"1[*עڤ5[lЁ^?;Iy}V,CO2ǟS]||rAst( 9_X[L,uyb)P6|p %-/2X̹'(A\^=B!Z:<8⎹ݩ~Yrus/ ŷEr{@ Gn+Iڱ6% #wRy#U^Pkd~y}#<9;G0<>՞n]7%T[mU=Gp442\A>vXK{P'xg#Gg+?=tJI|8,ྫ2ԇQ'.P ֱg-F}@b&]9Xv!>w`ΈO࿬@b}wuиP~KSuceY؉5dov kMPqyۭO֣/R7yh\ qQO9cFs?J`j@Vh_)Pұ#5$1|}ڀ& p,%;r<~C>Wľ<1h*R<'ER剩Я''UnTe1{ (N[TeVD=1!n-\Hjl^8M QʥUR*&='8;67jQ Frn^<#`vɾqٴ#rG͢Xj36Ai$ 5"_[IZRԳ+7A$8U"č!-XĖ |Mo-UKk-_u덍lde׸=]nOUNY ( ⵖ[y,T ]Gs^OKt>_-n}R4:宎䣥}EP·ZCapO)x:e:zӳV0g5$B*!V=mzjJV05{1}G xK޴U%B#BgȼGe2%@K֫GJ>DSޅ|RT!ju+ ;tZHbz֟gZvu巁v5<{;߸Cg-:kiW:t>SYtj3!A"JMW*Ew EzR(a&'tOwugNAI%3gkI○ԗ_PkUz %: :k:~Cgݿآ0ͯYOx?סczj;v I@g}k7uoqg:{!u-15.a_-o|ruK_߹${{8JߝũquZWK')_ 2 endstream endobj 2015 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2027 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP< endstream endobj 2014 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Thwithhole.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2028 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2029 0 R >>>> /Length 7960 /Filter /FlateDecode >> stream x]K:n* f*W~^XGz-xEH&>AH)g3:__Zc_s^?FVYF 1M#Ps[Pʇ-~6ko#]#n'+da 󱴑N/#/~M sޏ)Fv[@Fͤ> hudGAǯSFևP Jc*2ώP'ci Wۡkdt~v-mA>{qτR!jZڬѮń_W4mo4J,˾/iBʤd$k, #j%Jٴخq$/EoOבk2xgAۑN6ǡ%^,Eͥ(7M|;d Ԩ'ۍrv =XwXUA];~4.n;vNI#G0ZTScޮU\C2-jޮnz]ϫM::YbS+ny.GSs2R[@oc>JGKN,^tX9,P˩tD^m.!Eײ%|hWFB08No3Xh߼ M}nk+~ g|J}y5biB V'sK_ޟ%.A@U*(W-2UC2UF=J(|BRޒ@aa~-kd8[JOʦp·,s>uVcI+nK[G8R ۞KJ,ag}IS (26~ՎrOߨ-ǻ%Tb;+K>5jΦݷB@j~ڵܨa;@ { |AWFO^$|_cM8M~޻ڎAy3بY<}YS'ƙ_wHНz=d7Үj/`>,z5o:tmIv0|l ESSt?8Fԙvtދ: ]k$5{K5e{C;;dkP*5:5+l<űC'U *3F("FnY"S6SI-oV-53m;>d z{?-|o2Gb fIdrh_}68Rܶ}=ꔐ]KveţEР.)n޾‡HB-Vv Գ2.C'V.Mk3.Xmm!S9Jϡ퀽%٠DQ:9E}yCΧ 5 d|8Je;d(;JdKkZ9̞5cQ^m⹳ԛ3mOu%7?#ȇ ] O7[E$:` BhrY`+9SNC8?Ngz'Ll8q[_2rQ тfHde"`szD:e_,**N= {v+ ( a3%=ߨmNR>L#Yuދ萭aÃ;t~D:Fwj{BJ05@Rt|Eցix0aMkQf_mJ05)R7ҵmeyA>Zϱ>H sJ '芈$Jh>7ۤtnę ځBتR[4ZT[ՠШNBևt412ݣYINposKp:HN]FRѽ:)5bg[!϶fi@'߽@˦ה\S~>W᾵Z>:(N_q!}Ӕ@W=gpdi$QI5{ `1J*$R30ik۝hyuSn8p;0ЙK/*NoΆc7yR6͇=W42szKe]HyNEǞz7QZ}zbS\\[N.#w l@涗'hsG~shN>ԁa>ѡ AWf/g cc*R2ύ|Q̶ Gt0=iR{017́L4VBR%#:S%$ZPZ3ESy#i.\/Buޮ{MI OC/Py (>53% *C:H|)@_-vhH(䤬{?5 A,+"h1ho`e~8XY>vcm*vjmiׅϗKՀyzu)QNy?f?Q=(y}l{e~Ӳ9ZzS_GtA>[;n:t!j8-6'vGK0CϬuȪ`C'k:Ԫn_qlx>%76ub.|ZS +JF my}Ю_kjs6I𙺏P*ϧzv#:v sTwQD6C:@R%U5|Fqk{K.wG#G#[׵ WmGQ=L5Y"*O;䏵 =ݼ\e?Qn Jb ~ 6R@/ `K$ֱR=?/ѳ,/nHu84ug4 Qk}dI0@ FoL;~恔[< pOBug =aY :[{N  pc-YwJp,yW‡N@ʻ!=FjIsP (q޶>էYƛ;7޺7hmW!9Ôyp䣩c$g~lj}wV"3nj.,m)٪Ί9'lHɥCf٘ι4.!Ƶj@kMϔkd$ӷ]Ռ5k|-{xu7r o 7ǑqO1N(ĉ ~v:d[4*׷XTː zClWN^W03QS{Z5ؐ$R x2h$/R,hVfAڦ`mtOh=҅ݗ/]4Ku,?q$H:6iYe>|:g}_F[zI7}y7km]>@‡QQ u_t[w"tVhRzׇ>rti3RXzfj0)Ps7ywYS'>y_J?ZޟER>!?^-9Am3u+nܖ6Nf5О$RA6tY.[V8Jd]gg}]v%mr<Ӧpn~P-{h88?n4"߭_ȕV2sݘo 6}}z%Q ,6} woEX[2Bz\>̊ q>{6ߤ3ԍ+^'ݧ/#8F՚NYb$;U. uKuOTvn)M^{i>_>]LlNe-h!xyw#RޭdؽuG7Ɂd&IzWФ {vr_Şm'cOY)ˮpXE.[cS~TvZ\铕5*_M>"}csiKy}Rb7[q}4.gG [ە9з{ܨpvQuJϤ7 b}wzUth߀M.|3l]}uCuTEtG͋䴧5ZoUCQ VؿgoUP}j?iP~kԊ4u+u( }cO_,}O?oBY,Q@$}1B6J9QqNFY􈡒Jt:YQ t69"NJ2Tªi*dQC*՗{{=QHTϔwؑ*&bgT`;(2,1WuAJjXUz%ЙҎ^˦[D_ rjkq"3`Plus%:N\lC_nr_^fq&8+,Hde(3^"@$Y sq4<] >Z^AiƳnSN6l8,~Zb[t>pW|S=L6}B1N> A>tT7,JǞ:|ro-V{):!ۡ74f+U@jti}ޤvYbD-u7~'?D!b譺kx5RY|5~hm2pv[,,xow9_S"PA^ ө_@Bt ?]g,TIQo)X>ƹR4y,}؜okM %JaU!-F}uB kS;WxY/!qly+z uh\F>u?s}EQ+[w }G =FUlZw|*}!70yu "JRuyu=(Iޟt_QG}@_Q2美>)Oh,A:z> :z8+?{4GhLF$/)YNݨTR \nL':`u,knZ}b8v I4_%{@{Yz!u͟wV hu.}DgC~~'P}"dB%'}7SoA%"̄:^e(.(qu=L =1zVRRARVJQwDQ>gQ>ywT~8Sh`µP'K䢩ъ-t@r,5dLO~PTs74iR`ɻޢ [bV[!oU! [PW^}Խ'Rnue}\GJ?#v}D+EQ\OgBu[%U&3EN^'0[o: [T܏ TϣbUK$X7¬ vdK$]ӯ׫*/%-\Wm ,[ ZBHEڃ[rO)`z `֑س0Nwu-R-8LN.:tv_~j"YP{{ ?J:Y-ÈHe.o.3g))iπ:t(h :*cAȓ'$hRv%_bӼ6HC'Q;Gd$9!HْvHפQZV*hImg{j-`9dmҦ456\7%2؀̭e`/;Mz7\#omb[x'l.~2.uvnewx+_p : Z6igc9Z@7 p>,ѲIjr։[߽ϰ wO&i: . `7jjM^'kR1e/0w`k>G{Y$&~\a}Pߴl4Y~i?P$1=_V޲OjwȽUC#;.[Ny>!>rղi>LlGۛQ7YK#靥)z%2kϙ-w(jkU`!٤8.mu)(PP?rN >ɞ lvnoRUޔ~c:t-JY j:B- !uWojWoP}8oAo;ۥ5__f{<+J[>~o{z3{Ԡ %~ endstream endobj 1995 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/border.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2030 0 R /BBox [0 0 561 170] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2031 0 R >>/Font << /R8 2032 0 R/R20 2033 0 R/R10 2034 0 R/R14 2035 0 R/R12 2036 0 R/R18 2037 0 R/R16 2038 0 R>> >> /Length 3532 /Filter /FlateDecode >> stream xZK ϯK sW@OvPɿOU{f]NO?"Yd7껶퟇j~;-n:0j.XڷX{սbۓByi`]R膑20RSi;x{y1q `*G40"瞖$j1\˔#% pnP#u#rG1D|6 -͢Nנ%WZQz ҆Oi**?@tn^Mk-ڽ6送^%h1j?Yc< ʔa3ݠ+ ivki!$$n9czR #FRkjkm=S7c[1t=(ezhk8L?Oq}.pg d#-u9eO2i4J k [$mܵ u^0bKߘSWdEkZuR 4HEH #]֎:U!w>DF~>:CyЄP1:<xJt№0RT!ȿ+G^$7Ry/6*D0b$pMS@$ Wb~e>"!rJP3 r+(I$s@IݪibSqvM3JyTN.X'@OP؂>•M64FLFx4M^Cΐ\KR{(ϑk% 1~:cy٨yM3DT(ȋ Sx,E)e1w/[Üpx qoѧd!QR^ʅ+ v k: rR.Zߘ]Ap8>i=XZUpΓ!\ԞȠp7^c4ڙgh${VQiF٫µ Yk |Jp+HRD[EK'ޫQ,)/*Ǻ.I,L& dlq ϝTƙ PRf-čS8ҧ 'YŔqxr2":Xį:I.CۇÛß>Kz`br0 n6쟿: Q p~;ˡ1!SsF=-%JܭZ 0) UJ8ܡPt$$E6Oa PTrVr"- ?d0 aV/JZr9$d3L@ob &ثG"=60K f~~56S朠lcqS ,k3́,\VqH>|RyJF; 0({9)MqM6GQ˘XÑ@4%u/ºe`` ǘ`p/GީoGw9KŒ`^#j}Eu1~p$FgA6 G=8 |aА&\>pHXvۊCj,O&`1e=ZGڡcJ>tDC+q~SLr@amy]%=.ڠ(VfV].ֽ|w'CW!1k֐kBū$z̉ Q]*:@$dY%4b *3Ƶwme5rQM=vzsX9LUq>qgyD Y ս@IC,9l0._^}G"χ8gx}gb{^/(ZCTxE]3 `r@Q$Hj~Y?^26y+y* e ]Aw~"BLT`M_JdIRqw*]`$;▊XiCuE4Nx9D!!rLJJa{//~Xp1x`7ܹOD$ܬc#S_<ڀ9wrt9e܆O(.YM(&KEkE|a7D}*~O:!Pَ )@s^]-5}MWsJ#y:߉ }XCx#gҀexrHA HLlGLDLo΀c']Lt=^,925PR$)=[=[C}5lsl֚9lJzl ,-o]7 VHGzc+AIz_d`gFRkʉ}3"->,9hVU>Yx-f೉xzniA[JXQ¹UzٲCv/J0+[% )\0E-sGR;#E=qL; VG;EXRa/uڑXqFs$MsII|:}uOФwuMیZ>$$x:lMGp,m`΋9w2SE(&Fe@ !=:%XO .-"5`yp CPc:lj𱮧uB'뮶VF +i!Y-oG\HZqxy[ך%Wew PmD"k^_Wpo婮%dʠ(-Y!q OCF)/SlŧT-siQ/Hs Y# endstream endobj 1915 0 obj << /Type /ObjStm /N 100 /First 975 /Length 2271 /Filter /FlateDecode >> stream xZmOI_6ڙ~9E+@ ( Bc]f>dlN'dDq&L uLqɄWLiəz,PfoyZ , <@8% "J  @#1( 0 +Hukrd`%Y(h.,d8zʑ"d1X-!Q{M3{DBZfcѦuK(CK`}Q0^GxI10'ʒʷ${sìFRlP(VeAE,·Y| `•s$!LJ2'5uध6 gIC;& 8;/#AJPyz@Cq ;`4UbD*(ͼpN(8Sr,)ۑ ajZ޵]v&OY/A(.[;E޽ciQGtǏX-|\!'wȉN4yhaO:#HOE, vXz}g~ѽZizfѐHԪfqˆtێS|g &"L~u"׸ Кg#aJFP.¿ y C\F~I/;w "fԈ(>?ZN1QLô}AKү˔PwJuӬI%Nt8-ueo_q3jmMsѯZgii+٬&Zv͍FZVm&a5U8󜚻<ҡc/7'GlA0b!-TdQ^w'{*Dq)?qU, ?`= '͠{yo7y?{[FjhlQ1ޝ0I?x=Ȼwc/fc ("*L`8jvLVz}zܷ_-;^W\q,j|)$3*@8m?9\@v/ByEXU;11T㣒ع F,{hEtDPFQ.morꍲOd7H|>tߢ͢|oJu,tx',?#aҽ__gX/gV,T&Me]X +gTTuTjʠPH,A:d(4PU 2"U}}u:yD2غ;j^0f-牞`T1+ F(*Kz[p.`rmeDB~'Y5wmws?s7*J+F`5+Y3BwFpkc|x*=!6yaf8/' :V#Zp/PzJCFyz]kaX/)ΗN%gP KS$vzWI\9= m !$^iM0AQF04p[0^H4n/Ư(/+m L5:q=O8cЯ\HHͮ\18̩ʭL5,j轶S' u mvS+?}w.lucka Xɩ 0=T%׼}_VU3yBnKrD!YO/{e e 91=,TGSy~ ~zZwG*r4\R4XbY_[6x_OIY4BLlv;kXdFּԼ s}UTitRFR> stream xcd`ab`ddu/H-wIL hf!D,r\ ,pB_?``j@nddbOcF7N) endstream endobj 2055 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 307 >> stream xcd`ab`dddM1H3fnn9. n8}MB/?``1̑1$̴ǁ?yػ?λim^4-Ϳu%X$X'%fncd%7Hp~3/?ڽ7lZy[gr#ݿ-,3'ֻD\,.\6XYH-w^s޺V\yr֕yrߎ?";)ۊw>l@_p20~y endstream endobj 2056 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 197 >> stream xcd`ab`dddM1~H3fqk7s7K|w7>뻷s'pALp71g```tg` 3ɰLa&k[󣒓׻8[wŋ8ulGN_xsJ`>Txq~}t?' E endstream endobj 2057 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 968 >> stream xmoLuǯiHK#ChXXe3YǶ0\6E@q+qVv3IHt;g##Ϛuf݉}hoڋv7~tx?:vΊFڀ R<8$et7M)o??}l0-Χo/~bj'Z³^%.9lP]1tO5\(5NuC}􎼴.fD~fvizQwR_?rBnafد.u>hiIޅ_[YW% ɍK dy,Ah!0"`nJ6o>}sas.٤ ʡD *(A<@< Rg ?MxQ~d5J=F>^A%Y w=y5C rc|dk6+k̦ ]&*gF\(|dk@od7~&oݚ]^"#<ٜg0_ endstream endobj 2058 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 323 >> stream xcd`ab`dd M-K-M qtɘf!wU?YyyXX:4任 Yo }.W h$VS;@Ȕa]޽q~%@PdvO oZܽ{E`(O8okWIk )K5.^=@0oysZfOoX]]TS]&9{rs6ݸv݅"ڴ@3kgNTYYɱw>ld`gv; endstream endobj 2059 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 806 >> stream x][L gJjq"T Q2/(I%\ PWt=ZAf* (zၐ& AfM|0sZŰ,#ْ\߼* ?|_~W1j{,B]1n*FMFM 2H#~?+7FEKs 0#/Xx ?s, V0:(b`ʼe7lj*W:9qţ%!&=ܼg+6 Ei( :+ywuQQ_AoNOOǼ*K| 5|{u镲2G9cg-V[n(r-hUs`cAx%73IgStVR84w$*Gf#u'N5_:x3qPQ_uSx~rO*[(Yż@tH|-h'+p endstream endobj 2060 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 109 >> stream xcd`ab`ddM-K-Mif!D,r\ ,pB``!fcHw>l@Sy8Ҿ endstream endobj 2063 0 obj << /Length 2069 /Filter /FlateDecode >> stream xYo۶_C~躦ۀ@ <ȶR%OS{Pȱ(SPtqDGo}{r =nGd.rtxTyۗ}O{|_\r|s#H\53jurh$L]  (! ODI IԶ3vnOJjiY~ye$pEeY+h9Kw4eDyPBZ7 V?SRg7qv|FfrL ҡPI򐓐j]tU!AS %43a~<DLxxLxL_\8M_WO\$OY 41G$4z,4n?Hx0\`GuΝ33Yb=H L8#-:ͷq/A8,hy<^Dۢm}y0SbS\Ew늮vGK-p<"dVQ[{4I\"xǃH_VFD>2re4mKoI9恳H,_y_ID8a O;q^,zK$X!Nr)JYD)طmbd_ᬣDyY#cvf,BV63xUnӨGVt-kllRuJs4Hlj"x}vf .TYF;] ^\oPvn58AEQ$d`[k0#jΙS1jWT"K27BF|FQk; 5&B5AuI)6]tl{v6nȪVЦc:UZ; Twz(\E:\SP#st^)Ah,mJc^t[`p`Y"!5Q'QM};c$tZB 2 کА7ItG:W%W).L 'y[Gmd^wwcffG!a֛$~Q}pol._ ,X$8]wkFGR2?NWNwe]Kgz|(Vm*-o?i:f4:m |p3mEJZ@½7M] WnDw'zT6D[o=`-ؖ:,Akt1y<>m^>{q"r P'Grt٣gIOG8[*>]qwT2G;Yŋb:q *G'rP*MI.W 9:sDnmzۇn7D@GLj^S;I#6l^eRs Va2^й{ڱyjv#(&Ոz}C@~~5CkJ5MKYr3rDN:"`s {>abpsc)JTatW`ًh4`[^ԯZFyh+w*#lvB,O\uRf1[]&7P!1TUtBXljNUQ}6gceF=nnR]_}1ioܡ(et?e%gB7&6]*4>.UϪZYǠfAmftUi[VA-Æ~ߡ-v\,: GkʈςxӞX@Lyqf`ުin:7c/y2@TRv;:ĝx9w]={th+˶fXO8q3_L*ֲ_`5-çHƥƐJpoSd\lη*YK'Κ8"w_Hr;z7rˀ endstream endobj 2071 0 obj << /Length 2918 /Filter /FlateDecode >> stream x]sܶ]'^Ig6VL6:}H2q#egY.;+JƓA`Xuozq\d,O\\ Gq(qzUe뵗N,љt錵sSUHR)5W E4uޡR(Oi"I{.m Yd>vd`_wn$L8 * 6rBb$y.) W\P5!9dBCKQˇ6SFZrnRDH6GDQ#0P =@(XBϑ:\HW 0%.EI3C3%~TL%bZ.뢷3)zG.rf+ r˗hw)ڝTSn1L:{A3/H} +Ƿ^KL99][-837Egi\>0(yXG Ig\ǩ)},9K(j1"+.ߥd`q|Ll^CJ2MTQ_*d72>^bAv1/]S*̳7^A2㽳>7!,h9O)S.jXi=0Ɓ\<49C}R1 4 'Rjxʍ=xG*@@ST΀&ߤtGJpk9qiS1%M rZSw(%^N LƇr8U$7 ~#uPl^0cnkyDxLe Y=M[T U|} Ņ=RB$+~B63ګ1io?7Q7Ip}!$<ڽGmx97I׽g~ !>Aud C͵}j\o›R'{,.llН29KLQ_-N4I¢!tC&^5x5JurO4z!=s9vK2v:EX^]Ic[A]b VyW($f]v*9(;F**m<17悥u*jj؇Os"\_cAL#j%722ݜK+sl3^aדb{MҘP ;>\[{j +*wQvM67jl@7_MdZZiF]5zjA [6M\:Ի!; ;UXa6~T,TX雞Vijbr.ŏy=`:bҋE;jֲfk+M{Řv4b] 9h\ogg!ƋbK.vuf:znй/-o9hF%IM9=́muwC !dLjmW-n YmAFOTjܴu[l߮tVٔ#س/޶e^8XLߚwZ`4*?Kxb$pٺ(8{yU5M^je? οamjX6擵"Y4^m<{}l!lt>z`Œ d+~ib'^gK endstream endobj 2067 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/mesh_sample.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2074 0 R /BBox [0 0 321 299] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2075 0 R >>/Font << /R10 2076 0 R/R8 2077 0 R>> >> /Length 2095 /Filter /FlateDecode >> stream x=k +N)G4Ie{;OqfUq$z7$j0.Aq$~ۭq_.7ߗ߿oks yO1~ټO4b)~/17VJR(w}4F։wg+%)IIJRҳH\$ X)IIJREb';$%)YЊ)I$;pR$%=v\/bw77JIJR4M.z']t4~g+%)IIJRH>rk$%)IIO"ͭ$%)IIJzo߿>UU$%=t4'wx$%)IwڿWϽg$%)IIJ?f~$%)IIO%7\nxR$%=tu3ٔ$%)IIO">'ݥ$%)IIJnvԧ~po>z/lvuwδZ77G;׌p:v^~hc%[ UwoJHo?m/~ _uTkZfgXG_S*Ō?mrJ&Tqy\q%fJBʒmM4ߴ !FGA9 0"hj\^0< 6kW.x @AƱMű֡K#12uфMJBzcʰp# =L`y!u<-?!h!_89nޗD;S+$|رAm]C"'$k5| >gFW" S!L8xZGAk2V:,a_ṥrC?wB#0(ڿ7J0eiGs8NX21Reh0nz[z\d᳆`wZ?^KFrђSRW\-c?l24M׷e+-8 SҚ4Z<`0i;ޣS#0B$V JdIQcEv5d:zHvdy-3L1 "!b{eQ |zx^|-.S  ݌GrJW[7dcQLlij z+{L8 SL#aD#L!**JJԒpI{>be[wY1XϏAF})"Z d2'S2ag290`#qS15Ԉ >VxW~Gbi=Tq2ABg4h :\4@vwFly-4˴[HR, Fq1:?#Hd;Fp%XQ$bc̗$tzwlβE1ߵGlv[ *]11]yiZJGWfd8x*aê, *āi-hJ ?c8>FF!_I6O=\$bapQh)Xᖦᢠtb2hxIN?|y* ؎G WSq"Bݯ e5dž*1Eg|z tV0#rG$聋C<04O{z<Wz6Ǟ~*c{} ݠCO?CO?5ܳO{yQ |zx^rt??`:UҚoFpҠ*rKTXǎڟE u0 $C2{HR "a/ ^^'X endstream endobj 2082 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1536 >> stream x=UkPSGBrLBV룦\ iy$1HARt:3j_SlH9k H"V=ΙoKS"iq{Y֝Y"Epp; -K>\"|/Z/7ΟOz̑z/`}-^nZr!Z.T˅i9 rj-債\Hh*\#QcqSjp6ʃBݧs=TEfB=*MLb\٩?D7. J5jX^_r[r[ly8dCNҷ9 CNwOȗj@&K%Gw#q5(m?;,20 }Y?gd&N&ޗɪ˙g'0H J̵@X<KpÃ(cd |TK^y<5I#O$n^%yfY%uʇE+Eb 詺H[|m]"S~F|+*ť^٘8{}2$7l"b @daIu?|F6}|KE\ɭKk1yKKݿ9;j6dGGW{[/TU[(Gmq%-[" V5}j rX`QTJ&D작?a8cwײ7ؚ ;:<=waףYn}A[-5ykLs7/R%]YY`^ʅ)C+Yd99 ܄rl?Fe ,hJ-M~]NBvEEi-BRblw~FBJqZYzYz6{=Cpr^1 .* 021O*"'T"wa{kaLgϖ iIIp>?Z %6>դm}1,oRM&2(}.zɿfJ k. $HddwT|/% ȫcw[~+Bqx؆ ] ^yś8U9ۜ@PWj>m5[?0;e_673Tǔ~)@ʱ-]0;ɞV,+/r8"[a J <x8Cƛz4>x'Q9$8~ŚXv2^?t3Ȉe%͒&ɑJz{ںۺo=.Dc1\1}p=cMu߫!bSRPŸk̅u!:5ua,ӉI[ F1AJXB*Hfvfco6##?sO`Ρ2f endstream endobj 2083 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 151 >> stream xcd`ab`ddds,L~H3f3ECCa]^# L@`܍  ;@L:|?~{ȰT'%&&s|wb篝;pfil|pfZV@. endstream endobj 2089 0 obj << /Length 2085 /Filter /FlateDecode >> stream x\[s۶~I /MݙigޒLGTGswA4)R(iC,X` V!A$P4PF#d0z$^|ݫ퇌>x^sׯ|פ7O0FDh'^cJ?/4q@P!-y0Z^1)? &E◝ǥAǡ'GKsNR(  %w,+8݋sx{L"J&ZaG"p5瀳4^;4b4gKlŕԇ+ˊ3PKiDTzŇ`L1)4DR9n>z1x j`Z TT*FC>T-0P,?M?j<<8o/E>}*֮/ʊŽŻQ5Hr?.Du=c'دC`֡ 4EIa XxJM=Ƥ-nXo}Y2R4U`A n?]VL',@B"lGb F.e!+< ;r#U$WHH_5Gt25J<R-X!9\D2Ì.L&ڃQN|ʊW^k#ap1TJi_lVN@2.CT{Epg$곐i LXgĨnˆHq QH8C!B5@s[sY4{I@`RĴωjtLwy_J]E1Cw`䤰mf@а+mÌwkw "I'0 q#lC)9#ED' Ӓ?Fw!U.NwY.{BwYtAd T,NL>%U3"r D loF_/ rh;+O 8طPQ;w Lbd*b-/-yšq 2)P!c\klDmu/?CN;j _'~(1_\-O?\sMj_̗q7_5wH2$'^N(6wN wٕn۵r8YXY"Oge.p܍;KL&8lgq4dehu/6&/[.O¦Af9hr٬GtmI`H2gfx0kǮRff^ml2el#&e&&d"Rs&82Wu;6kz|h͐PF>\ =;P7Kla7r8g񒧭e7F䞅0L0B&8"0Pj$I_cL^pd̞m'Byc#O 8 3hh|kgӒP?ssY_'d $=LQ*i*¾ b~nǻ&jB;5;5j\8F!igQP$cύc\h%+T F#EpSM.Uw'Ts?S/r\s\w/:&k귝DѨ-Z qK|t`H:8^ȴ1$/4ܦ>F I/W|B$n[}40 ~hvz;v^efuNKeyX'8|u:Q%:/d͘>1W|Iw7x,+O:Z,+>smVv!L*,xʘ+-j{? ~=M"AYX"_ wv endstream endobj 2096 0 obj << /Length 1866 /Filter /FlateDecode >> stream xZsF_X3L2KVl-Y6$˖ڗHvS6װ|;8Fl[͢؈2SsgՐy~퓑Mo Xـ/bCܼ}.L"TscRSLgsF+n[.nkE}=Ƌ p ?/ldAoܑ 1Vӕ.ʶrّnb<܌j6ȱRaK XD")(CNp{> &oKN)%hG:mT@)7DQ-3ܪf`' LBM,T7!NQL ܢ0¤AmSlĭܧI bf#`Ia4f찢6*b@VRRVP ,4>Z7H uq+Ef"bvopo#"q ꨁ(a=eRN*=\ @BHYnMWkK #ڧTtvXDR{7CQHq\6!Hč0d@1 gUZڗ͑m%P~ C~&Ӕsݍȴ@"6H",-h."]dvmdvn@)>M9ds&*`~N_RPZo0]^fT!(#gX]s-Ҡ\p[ʳ@˭KҥdCIcw浘g͈ *= j3r/Bء,#dss1WeȀ /hJ :̃ oWlIŘ$_HWEc)7~#QþM$`ᢇ%#t0vV cK0ƆO0I {tts *ո _r5syeނ#2[zAV~D=|7M#W`jm$B$-nBsZw#BOdH]L֏>gwDY:Xt7w1Yx/\cڧ7$޲Uy'۬ KZ!{sSM^8_뉻@aNrN+F$/M7ӘElla ?-Y:$!P*P ܺ [_b]]z.;F,}*5}6JZY q^B*z]}*њ ,(# Sr3?:nʤJһ񗓊㹎H4EfH x(b?a%n]JEYǪ>\4ׇv4K(.WsR d7vɾ3s^LVc-ieY*ʪlh:1lS mz2ZCvTY 9ϑ V2PoG94߱+Ƌ[ɸ6o(&BFaaz ^x9<*RԈ>7b endstream endobj 2100 0 obj << /Length 1714 /Filter /FlateDecode >> stream xY[s8~ϯ`e+ز agIˤ<8  5-ز &3N*HGG߹}Gy/`g.^_6C <Ѭ1 팦\ջ?>^ZݻKv~|#^߾uPww_bVv @ Bɬ TR,D^4Yhe+-~ח!Zg$;D %A:B¬A›욧lS&{}g!]07-8Z>$h7Ai)AK)\?   p?tc$؃v2_Ңb8ۇ8؄-qcA|[_?(4k M$e$6 B%>Ap3Z0WWYx.+{8!dxI=#>kkl+VէԠ/ ' @ 2lsLb86L (naL)ƛiG_vi c?]QңŌYc0J~>@D[a[s6-P^|I(ܚ4 `atf͍`b1n7yQM6Q)B V6Jƴ|/U ;4~fuX;]SXW)obNWmqd BM \x>wd(?|?fBv ?a|j@)],C[ Qё⚔G坭-AxZ4uuv5I-OI..At7뙾,ew"hE}$d2IJ] `(: x,0FnOhw$utUElzOBS+2I)p*0rQ>q[1Pj3WJ2C hLTE4P+u[J'7^]Ȭ~XkQX܀ۢ[& lT.:u-@â"Y&c6ک-D>Q@ُOG`LzNY@!Qkc2Rw DPQ P9$ #y5QVܗXuyO꓅X*}alLM|dE|݄Jmq*U]L j?3bbpLƨGʶ:ӏ 3*gȄ6ɰ@7E|_Cr3 / c0Kn^IޗnDxVKu|1?Xy=OalF|G*ݽŸ,ˮF +4J,DjZ8,#2Z/Lji0-K }SlH<ځЌfksiʈlJf0MY#Y`M%jFi`WW<Qj\6ļ\Y&YcBg{~zW/Ƶs?SIK=vb)Y&ʦ\q!2|vuQbVIԆ> stream xW]o0}ϯm4\ۀ 2ҏIKC>hCBG ZM01"U{s9^__4 h\> q?sᯌ!Bxt aBKfo?&CLJ[Φ# Y8\م xt5HRanY&],җ,-0܎D `δ6͑I ng$`v͞llI.D8N<υYqS \"΢&YUH3U `R,HIT]xt/9Cџ*OU1U|l&j'P"5%p" )֐H#B-@LڳjH{%-F5̻=HLi(I/mOEK.T7Dk}gj=қ\Kn,Ә͇,ZaV&W^7ƪޝtI:$]rG.ěu*1|t/vЇu QfjluF'{B>/IeEy0}mS93])#%]vyo(-^,}|ƖF2_=5U)g>Q` $҆t&7>EQD䔭כqU(>ꛣ=WD*Xz*XM%jOX%ݱ}E$ endstream endobj 2114 0 obj << /Length 2031 /Filter /FlateDecode >> stream xYݏ6߿'~KmS I/5%֖̓jm˕oCʖ]{{9p734Nj/!Xr0 4aRx:L>u8RFC'կ?QǫW&"ae3pH3' _. # q/<s`TP&QCjJMUd"$qY2ac|EV0DEF"֦ͶXL ~h/EQhdV˃9iTj3#zN@ R֕}VVKwj>oF fĩLDp7gP21xR󩉊g&Ljڙu([lbH% 7ovc~>SbfjYTqgUJ]Ӧ4{?,n@Mҁdm8?bw֩fhDPX+yib_Fi,+>@D\#*W;T0F(q%fQb 4 I|"iT> stream x+2T0B˥kjP  endstream endobj 2106 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Thxy.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2119 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2120 0 R >>>> /Length 2194 /Filter /FlateDecode >> stream x[K#' >'z&G"x/\?@7 oc@*#__WYy=Oa}^q]\߯?Z>׼ >M_$mmE~ͳh7/-3 !$y(Y&\Kֵd@yj]xz0B'72Ҹ#=:Oh4mp- BGU8kۙB6DtOmB&xgX:J F #+'#ַ),dQ7aEEF{&$GJʶTUu9f*>l> 8`DyG)!۰m1%ٌGAI_ UP{\`DH?5Ugc2~x26ʚ/2]L.d daÊ֦}#;g h/צQ֔}?DW Fq*?賌ʫ *򪅪5"c&c}ݫ=FݸSC46u9Z9[ n2j:nm6]<@ߴC;Dhqjc}dKt L~ةs&ʃ\gWЎy5+U@Q ܟuy!cJWs<#)t7SUv2KǸ֕:X32:༕8ȫz/:f}kv-N;ȫ&?x3jh? *̲ĶY3=Ki(bLl;ߝb,?%hcn.\ W.W%O3" BܡK),zPG6F>xue}4!kv|vHx}Z9L<=Us juUcܕlPsɗ=l ڡsNMpQ/2oZR^JՑ\q L)墷lz;YDc0>VЎfCn54:B2>1 n]:]`z?N';^Su}ofgo|>399eb(CfqNƠ%sNܸU?y|9t|9RǸBvd7!_)?Wy([<=vpUx ;Y`e:l+cک73w+z(C}AխG[WЎpRѭj#{kyF5b{{זdbY䮁SYX(-Eњ_\GEE tP} 11GfC~ӳol4`9q7'D p~{-3AVkdݴPlh΃~Ԙ'm^~d'T PZ7#Ipyy <M\^yz'RtQ8:> stream x+2T0B˥kjP endstream endobj 2108 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/xyf.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2122 0 R /BBox [0 0 387 387] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2123 0 R >>>> /Length 3687 /Filter /FlateDecode >> stream x[I, ܿS 9k8ז7Bo&&` E|b H d '?~>|wQ>x§>?b9Gtb'':N\mQ &:ۀrʀ_mFgڷN:Ɔ4n[\}L!$|,Rԟ3)4Qs?uSҺ}2IroErel_Iܻ$=h߸E⟦S]vmL_xANPTm}HCBSK>CpD/'@o/'D@lNĈ'J$mw# ]|ltf47+&'9ez")3DM4kSX81VOk֝y॑$)4dO)c$^3c$;)gFU5F5jVߚ(sYf4زmGhv26cK8ߔl@z 'DY#˺y#˲y# 'gG% 摽;_ chލ<7EҧaY-h'u@Dݐ*iTiPJPĽG9!jg7ϖ Pl6[ACY0 v(N ƷS)[#>*=xm|HPતx26 0JgIbhs4H%Vhc/MbFO\u^X;#D^.qWkgL:pXگuNNb8=gT;NjwݒG%B\7\ ,9vBL1`#ZHui$מX _&+B͹ԡj{M ]٭vǗV^95!RJ9BX#?QeT.caE#LvJ +m[f +%hXi4F 4H 1]i.MahKwLϬD qq!B\A\D`a^ Fk.iZNA<Er1d'> " h͂jOdAsž@l;8YM#?O"nu1NFשм*v;4@S@[!9Ҿ؝2`7Xc$+]{nj  G2iqΥFIuH s4Rbpj Q$ @\&}wox́d>rAS-T4v=xS,QZ3x"w"%֘ /sx3k}5[rڄU6B>:97*)l޴"Râ)=>#iؑ{d=VriCurF[ׁ"F3ҀphY+Ҩ:r)E.F EI'Z޻O Y mJf/AI:(uUnJui$]$yHYizgzA&:}L3 .3ڥv[Lf\i3?I; 94&6VޯdǞ.-cV}y#k[vUZ;ξYۉaQrXhWB)Δc\&<75YG6Q;M8Dlcҙ?Ͻ7qڡA6@taU9pjc .@hnǴ|UjC2DJ0-3u?┑o',ɡ{sqoMqSwh8H#]>0 mo~$w'ZG$'jp/Г{Q}q Uޛviƞ8e. dwQ".*uDd ٺ(XJ}R:NdO!Ns \<ѯG{T=#)I`7, T:G8ָI  `i]%fc/0 G[ h\ hlEHlv.D:K/YJ @x}m5W ǷN 3PDiL ntI[ĠAaڕI%jW+sU`~@+Mل.H]Ty,j;IEM{ݓ*-d_-:ttyOjĉ_KsSI֮O=7D=ZZGF7ԣ|Cc|U5^Qzo?E5py:ف+ԣ|ߵ!eXEYTF}c2$(nVl䋌Méٱi8u y/܁:^ ڢNFp%jRũjZ,y^nWw j`tC .ӅP 8sS> stream xYm6_a8ܬ$E{.6mMe5m`ˎ^!)YjWvd-My3#:X '/.߰` |`28tXF:$B 5~7s$|;o`fwÀ93|A-o$tG%`D!n?y:xwߏW t.f1rF|^^G\|ce*7Di33oRvdf{ |0d ,KM O#k=D`_/Y>~ 5Y>OB-\K%QɢIѿduvSݠe@O_VJLL*/3Gq&vH(}1IF'fIp(M̢Λf~ݩ y]īLGy^VeK1 ]uÀ;p!83 e"QWdo$JUf"Cp4&(.p"t7CN0Otӏ$h+=藍`$JUWKܷpl~k}.|m@6iY<bL8Ii&+}>cBJZ2|FʏDanH XLyߎK+_hl9 ]O j 1ۗ#F|a7q6F}~hs|4%d8Y&WѭZկG`ăg@ GJv $dM?=*gyl&]apNDH= ޜj;jjHvq]l*­VA2Nze.FmNj"cI}:V@ljǀ6+mAȅęyF љ%`ɲ!NE>1OHDӢ`ix c RʊT-4`:ugGt'UeCJ~fm+~tdt<)}>"ƪxlV6΋[3mQ|.釥h?dĚogOqg#KK\|8Kw?:Ue^[ImHn=1]?@%A$UW-Z~֓B PmB^e*~J@A=]KUm8.qb}kړD~Vq|G[uxbX f'ZHV:\ڍaV*DY5\s/%vxpo؂nxu۱ԁ|xj_’P_sf!:'6տ8?1܎q6 lSIAPQ셄}25٪CwlЅ>`w\i,jHCa) d)ܲ&-UqL3TIM:|xB|?^%4uР[ 9'њ( Ea*u=[\$m7̺Ζ/k_leH|H5&z7 endstream endobj 2139 0 obj << /Length 1996 /Filter /FlateDecode >> stream xZo6_aIn#D}\l[MB,'7á$Vbg-b~ 3 10~6~#x8Jl58#&`<[q Ἷ}wo'p'X/gBEڬB!ՈNF|,PBDB# ^L5KLߋѿ_3?w!Bܪ&ەzz qvPgz"C牺֦%ĕS@(-|E[$Y "sGX'ivHHF 8$p:`ĂK+~4*&!- 5pJ}'.e]"LnFc2)jҋ `‹#`U=qokձbڜ J6UAA=%0Z@ӻ4*Q S0}mY7:Ԝ1:˳%l(ھ]"$F`0B5Sj0Y{={, '(ü0Qٓ WVdHcZiܛчD8@3"oRN}:I.t(}w67 {@&yAY MKA&<$4Iud#1SPBi)$AYԹ&zl} ^,R81v̆ 6tD HdWrO ~.2 BG4iwޤ :%O9P%R2j@% 6iڂP[QyQ[-ɲU25c͒8k.e*.548^UYvV7nOH _cSqJ7 ӛhf԰zpݫ5t|uihc[1!O(sKg}`ˋ8sZ̋B/_ZY O/O# Y/WO^" Q0/2|FLn>>6yngEvx endstream endobj 2127 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 499.999 299.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2143 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP endstream endobj 2126 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/emptymesh-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2144 0 R /BBox [0 0 500 300] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2145 0 R >>>> /Length 488 /Filter /FlateDecode >> stream xU;r } . RgsiE&E|$óޓg06㾽wK{>F뎱n`}pi^O^N:tܝ (&0SI }@j97@~AxY:Ѧ8ALw$Ctf>O ! [e^<.]'lm77[Kd_:ü㔚ڎ5q%Wp!f&b@,NL8eٵ*;!Teng N?jA`bj,QM1nbUu}|^w >`R[ENOEmJNV5z.9A Ie>KE1ϨA734.[o:YBM',b jgQf-N[nAZGK&2%Pa1Z2MxL%4^5d8޶?2i endstream endobj 2129 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 499.999 299.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2146 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP! endstream endobj 2128 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/emptymesh-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2147 0 R /BBox [0 0 500 300] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2148 0 R >>>> /Length 606 /Filter /FlateDecode >> stream xWIR0 yq2N^ aO[VkPTej-%a*??nqߺa Oc.8n߾.6Vff1Fy2a4J\&ְ}ǖr٭Jo|43?G6 "f'n8oQCVnv#/e4p²) K7@6+/ܘ ^wOΗw5I5CiEPP5 .\ș OقUʋ4ۭL7"Ń J`}bV%m-8ME;9o4љ NVDc-X.{vabu[F7ʴwW)҉&+¤y&D<7L kp7>l#XF>`Z( 43`43 dYtS2 кL{$+'E`6V'/FvlcOi@JO.WZDs@=ס~ 2a:0}U[+;C u(*]olߩlnS=}-=I _UEzJ`rOKe'Vz endstream endobj 2157 0 obj << /Length 1712 /Filter /FlateDecode >> stream xYFݿ\0ԕt7InK6Z ]U>ʪC[ [{?OzY q5[Ze5Yϓ_ss}zf;h` ~ˁGJ=lhKג$B-.u%*eS1n۵@##QHX;2U<+ ;QW0Wo;h`Sq%*Џiل\oVChVa _@lܿnO{C)O{ǿ UdGih:14i^8|:O$FZ;SA)K(2UbAkĉԐ<\o><"O=qt@-zYd/Y* 3O\/K((cr8r ;/VG  4KS0946_`<އQgRX5g z= |#SHuc&gb(mGY߁H2rVQQV9ށz IZs| E ܧR6Z{c1C_XI 'N9^x3<⒒]/5(Zi36(Mu!! n{Ð 22}͏jP^2vIWÅ6^J3mDFHS0BH~ V브L;jM1[q`Ӹd6 $;"zPHhR?ÒؤsЦy#XqPz]) 5 8- [bEED`&[ԔVr`r:aj*^H -Ң*;Z4q2Rts)kҷPG0/[ho  7jl+62~R5heT w"A(5A~þ|;CP`Vg8۶kHɜÑ' #&ÕD~.ӝfb3ԝn\Wg"+=.wO Ғ=m"4Q`.<40,GWd4ocP|2QM͡'nCHYY@v&_DWWEf.f[s|3Ȭ}?zEOX2C@d]&eAۏA(tNjXOQ,.?SL}uW D9CI_i endstream endobj 2152 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2162 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP( endstream endobj 2151 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/lshape.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2163 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2164 0 R >>>> /Length 1123 /Filter /FlateDecode >> stream xY9 u $!=>'V7PB|{j_(拝M^׏}wMv3_̿#q]x=踰v9o563ન _Myn)@#?Q|[Q=q->Nz`^>WǏd H-lHxеvp W+l(uKkQMh]3g|e1A=nQĶ\NdjXګӲM3007qj&6Val/Я}0lSidD h,.n]܉5 ;?>@m֠B#j?l5O;bJǚ8r;-6lpjvZB49g=!N;r pU,jskMG}"1KA`]m[D8%!7ZɎUud }Rvu udBE罪"JU+rZL|5py)FYk]+4g6!\ÏjpGXcSr*=Q 0N\XvEFK˞XO(R;;Àio5) X}HC5WU|of:PIhDCcHҞ  oѻɚZxzRDǨi`q>*! UO_[~v^^ %OXm,<zb$&z=\XEwumo_J#9:9sX9rr ! > Qu_e42iC}1hQ^ɱrke4:`s):O2QHIB+ &qlRfLJDžw>. þ}>gqc9gex. הSSRCru |D5(!TZ䮺:Z0bN{ ^HhZ0'UyKMۛo.*RdUsc@;/l揗~AywՈ~`?ئPB>pH?1~gsv c% endstream endobj 2154 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2165 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP/ endstream endobj 2153 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/movemesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2166 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2167 0 R >>>> /Length 1596 /Filter /FlateDecode >> stream xZI&:A[t9ߣ77!#T/~D$~!ػ~,g7:{rCm!ߏ #v@~mܛАJ ݒXsgJ8emIO0&%pBjhQ{Q䅺QVpԻa̪-IiRdڎH]}@3 1%Fo Wnd{-yMƹiϗbCMK0b7$^n h?eSݴf6WesvzC&eO$8,Ð'OJߑטMIZv i5!~I~^K-#n,MLb[qRiq3)g"pi38fΧGMeH=7ɜB0MAh(e.l73sv\ޑ ߤi跣/])X\[SMG]L@{<ȼa9E1#V7$jd6Lx]J7Ш񨍖 h)D-ؖ*/ d"y i8j9P8UK>oL -J4+23bLek- K3Hhtt,]7b$ě#ܿuư^BRESIud+)P*Q}5#(9BZAnlb]M9UΫ<F,*%&4g/[F T:S N9Q˱X`.oܜqL+27[Rq[44z8׎F6\Ύe,.,`7ST8\#g7&E0#Z䣟ޗxsޮ3M_.L'WOd<3eL9ŋ Bz+Qr,qy(+z<s15U$zm[/UeDϻ5pӶj 72)`E "\DǪ=}wq[$ @۞ FP#|mԅW #U ):|j^T!] uɃQyeUKq> 2wL#_*]խtj+Y4JRuNĿNd?) @[dٌS:9 +b(|XȺ̼۵TSfrhj6A@+TP"ݡVHqhE@t.ڥ:uXM kt+B$NT8cx:ɳOXu!SV6$XE Pc#è#=\?崨>7v:_ ߦ~v{|UYA+%ۇmu䳫Oiu_뫶_X\?K_ā endstream endobj 2054 0 obj << /Type /ObjStm /N 100 /First 986 /Length 2530 /Filter /FlateDecode >> stream xZko_o7qw9|.vFo#yc$C3Zvm- r89gRH!w_ r V8DPIƋLD: EL`Iuy:Ak.5!) EҠ$*GWRZq _@+A0^1Zmd .B3uGPO+Fh^\6.;bCVyz_0cq8WF>bcϟO\_$x@D96z_}z8Chz|ږj UlbG?/³|hDEcVM Ρ2* k">sk<1`3Ƈ03@3VJζKv |KǺ> 9chzly1JN\4o$߿":&hĕU2s5 |7ś7"q/gaPdx-`nͰ:)v8978W`8/_q2yFݷCƜU̅M:b2Yڐ(:04bI=/u zdä IP u6~zM(N 8kԜEœ5NtS4MN <ۼD~~p$H,y|9ђraa;&eNYqiퟨL ]/TM* "o!Q-OyEʫUF}aEJK~l=jWNy9UaK=<> g\D٬N cfv1Om8p֨Fxu75#<$&o;_W\vF8_!~wEVcaY= Z?AMW^8/FWZ/}BmO`6|G/rvFLkC}JsDJz:먔-'ǚһ*q)%c_)e|*2JQ)&|9gQS`Qf֏;vg>s|c(|A j3ڷQ1H-:/kߒ 2L*A."cR$h}Ⱥ2 MER":Zu~r`)B-0 SU6kymtuFE+~n QoP(X]x%SCJLeT!ɌD"S79tiz;-s4ry'JqKq:k\)( og@MR;lwnzԆ#kce5+~O6 cx4(W3\NufFWNt^e&ʆʉnyH&>frn3=;IfqLdqzѧ,ȐHͪBZk˪wd16cڳKJ_nydk|ii6+Vx z]kWd8A^5`ߧ+%TK|S▁AԽx@Ҟqw>-u#0*_yE^&_pU\B8H?^X쉌lkXE]!n0BzfU;$a{c*MЙ55"K;Ǎ }>'/ GX)Y<^UG!䦟=F`&|&θϦ9&Yصf> zj/x_ endstream endobj 2172 0 obj << /Length 2165 /Filter /FlateDecode >> stream xے۶]_q_ ƍ `Gqg։;ifhRBR{@WaE~@o8Xm=}7r=GRO ((rN}l2? ˛~3In9"#,%p}oك6A 4[V+ )AsF71ny]>G'7;x"o5>on(wQi[er6O2?S( mj}(]'S6N;WJ[BcY@5!|ōV !)"3`H}d>LY- ?Ġ<.&ꄙ23va8+kg0}U*<ĥ9f\P|<GʍJnekm-Lk'h2rֳa $ 8HyN!Ejٸ<^=q IH]v]p_.,qaV<<qZ;N :ikY:sekA6LSIdGqv,ZQ䢚$j`gvRso`Q![ |J"79 Ʀ˙d<we"DeAjΩ@B؜^,7u)? HCJt a'I0̑Y0idU~P=#7Ocġ#@5&hCpN%WmMTj3ո:9]xx{)6?ƻ0 Q ȇ х(@.bߺhH ȫ)Pgq/, lN k{5::Yɲv"BN4BlT f4q'Es@m|XI.t5'zLaK% m.Z 6Sv0ҥg>x?\~o&4!]<bؼ6M$8ݾ`0:y`~O\='>:ex2'i } $o\f?3Cbϖ)BҤy,A8510 Xv&-xpteB`r89WJdG c:rzP)Mܝ4)D{§v0W+qRMAqٹ6Aտy:\^B^0 AVewMm 30GFiRln8H>q틌Zg"dor+RrAx/"upS^,zQ';4C3ך~"~~.`66ϩ`^(缞9vnJg:f9+=vO>vhhsqIcd/oiSQB˞SDϠ{JvGãc*HT}/`z@Yg ``: G5iQHsqCa].uވjļ_g  f/aGwOXB0DH;Isڋt+89P5;qh{mp`{:  0?+I~p~о.cuw@$e&歩2z@R:¦ťl ESdj34p[i![|ȎVڶ@`\ \]"hPsr endstream endobj 2181 0 obj << /Length 1159 /Filter /FlateDecode >> stream xX_o6У4[4)ivl.3AH%&w)GZn CĐw;ޙ:u^ W9$92'#¸tf yf?! tL$1~~f6|Τ+燒?O6;7/ُP*|X{wIY)9* dQG/n*ĒI-j$=$4Ird"_MXL(]6;ϗ_J(pa%B[iȋ|řN}G![i8M2lyIĨySOZMu 0ɰ`b|f"i38n D4INgdqlU͑aȌO77vntj:L(@XNqI\sΦY:zO:!nz]e_Ӷ͹Ed}bb6k˴ݜd55qO ɞGMEȆC q0t$R3tOZs^3퉍 njUJá"æ{B8,XFpJ?<6K~UKJE⡱ ٗ-BVڳziciK2Tuk=: &m^ҺY/#_FپPZOg0ߪTG\OTdshDd z*Mrm4YҽV]Vl!dKJڎI`[R06/J}ƺaٲv!':Cgw,d5ZIDi>Н|,Nw+<@}a~2BeUl?BL.:a:G5Ctz endstream endobj 2178 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 782.998 445.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2184 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP6 endstream endobj 2177 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/adaptmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2185 0 R /BBox [0 0 783 446] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << /R7 2186 0 R >>/XObject << /R10 2187 0 R /R9 2188 0 R /R8 2189 0 R >>/Font << /R13 2190 0 R/R11 2191 0 R>> >> /Length 353 /Filter /FlateDecode >> stream xN0 E /S8Id f;f^ /I)kkku  |vj "y.: Q8"CYtfm{/hXCKaʷs ŦdVQ0NAI` b99F h_*}MTL> /Length 26955 >> stream xoK'v+KBXɛ}`fx"^EcFfw0Y9\#eP&/"g qE À &, }SO=U/NU}g|>OU?b{ڣ(癲s3Zzں\X{<e뇍i~ɲȶ.~Q}_Y{FISfֳrhOm_y2sߗ+ʣ~&ͽ-LmNxn"!%ׁ"uE\3^aHή/G0`xA%tԭoF3^au &ai`keSx,{Lx(\)׆4d<.x3xx^zOxx罀SKOV ه^u?mEL}EL'.>^.rъ㕯[0x[E/ճ7/fxU4x.x3xWGx0Z?'e4OlKpQgxkW\^0aH_o/(oL޸ѩA&Ȥu0^k/ye,!8Tf.^քWU~>":`'<0.=zIpx{Ƌ0^pEwe^xI+GAURˋUt 4Y{xi>n뭠&fmx;<ׄyNU},7ZqTsYan `kd፧-M(޼CƋf ^*x)ne\ .-+l2^ÿp^Dx=m%q /f /,꓁ pK(Qׁu`ƛ"eZ_ƛ} 6/yAl_\D:\9VMb ,^pCD[KաeWׯu/" mM"70^ -%K| Dз-`MUӌWK?\Ur:bCK)s8>3xƛwB"a}voZJxMhx4[+| X0 Lm EY7} ae\Ի)[G"/\1P6^&>pQKT&r>㭒nEtyx9 izŹ*^_S/~EZ^sƤ[V{(7^Գ3^)wE]pmVm*xނu:Ƌt//{ ڂ^.ֿ֒Ëv,7{Bl^z>zmE=0=U:\dRҾ]~÷ `"]K\, H*xMp;ƋԍWa t6E3 ^D\p`8<:^WdBt?7 ._ŋ3xMkN7.p:tn/}x"6o ~(tda$uK5Et4Nj% m FFwotE>k04+'.7ݿ+ *ޢpi6 ֚~Ŵ .xx7^ E7}y[.+ /Bo.^,L"xo-o*Ext^.^%M& /xmpE¥EEf]iFo"YT7wo{,W*BLx+%CūÕ x o.Z_[K/꓀asQ3ZxQgB;p#7;mE\:iȫ̫ė'֋V7 E݆Q7W/QbhO+};issMfG^yoxi=pGY]@: uMk«ElxRt&r~x n_0 *uԘ^p=YxËy&Ë'o㟯V;KpfE]xe7x/S6k+y+\/[kxK񆄗'>p}voЙ/J0M /fx'\`ױ ^*xƛ|F|(R^\:xaEp^UW2^/BW.5*qr]G.̆`3B^ :yάZ ͕KۣE~l\fZ_3B?^Dm}}dfxeIU^pmg<xZ߀r1//E(}Wnx[xQ]qF\"(^Ze4W^deքqͻh&{n-D_X4]]KM ^\ZFx[8oٖW[?.6^|Bl]y$,rGr_uMGE82^i J3 `xuxs H&"x^^xR}܌%o_"y7p"xQgq+S^ﻜיz}>SoϝPE-CL:"xiַ/x:7Gݬ-jJhu>e9/kzٸ?z .WG pxsRi=u^rN]=%5|F[_x\/m&.pƯ9~n>%6W=U.T!w|}]ūE|f"x1Ewn\?:^uYxL'w&QoflRxQ{V_n>ԉnKP"6-tӖ ,o]*wω% / /- \~ k^\1>zO?":`-O'53,H^[omxM罘OUVixu-W73^_ xUJxQꀫs^+>jxxU:/kVuW^L^1O&^}˺cJx4^D6^OWܣͷ1 Sx:MGHs"}pm-2r7vokku^D:.bŋ/ċ2x*3F@Ư:;v\l-k2xmxukzM@\N xk22U׳WN;rW(pEDamSNrKKy9KmYy+/]mFlFzR1^5Ƌ,xM(u>1Ӡx}ŧKuNjiS<|V|]}'"CgW+o%}]3Ry `n5&xsx r}7”u_w@ĆW.S%Ë9tu/L=+iWnEt!-ڎ%Sψx+jc~ZN;->|l| ǻ v6Fn׿1+_ÀQW;E\}/sÍ?K}xO,M?Tg 3^x쇵o)P/2l;lW[/m"/(.uPo"ŋR&^Dl4^UQ7EtyxJ2^kq|UUTvh@ϲB^9]pYVq|kL?N>'>~8k}CȞO@W0K#\$Tu5EEdK^dй( ^:lFij}u:xAY$ v>ċ~xQ<x|14TG9rBl>\En^yxQ9l6 .Wo}ot/J7{EV6eVˋܸ\NF1^dE؆pQ't]>/747O:\ĹMliuPor:To Quyo^9pwR厀NoOѠCeZx9nWU7'Ń\(uT^I>iyUExB~:(^9r;]~\~6rΛȕfw@Yx鼵:"WU+ʿ/Êg2^\MexU\p#̣msH9xkMxe=Й*u/Eo{c‹2^eywj9:D^{dh-.]<,^9O9u9筂Qxw/ȟFW+^9<ÊxwH_V.x1]J3/å;uz-#*^ZV\f5sQ'ڳ/:bn /tQ^^x 7[aUx6MWncl0F׶¤5i}%rN]=+މoWE\'^#7Wx)NjX"}KӶ-Wnk\"O޲x_Mr%f^Rcd(^̭"WЩxk|!E`wċx㵤oCg9m;u!j<A,kjyxvYx>4>귋\^oޱ6~xzMx톃w1ZG/E=sj\~i~EskbsӶgZu/2 >S-xyTjg{_/w^ Ƌ."x_΂KRū•^}L/bksLELVZ^dIs7:U$u%ԯ8,xwo#o@K놆-#5M̓0Fgj/u+spxexğN׫5)\$U ^ַ*^E|ɁK۴uFx ' \{]mVr?W`xMxWUUToCfĆw1u#2^+缈 ,^:e:mL/F_#%WQW?ùM׳i)E.XQ^\W[>~b70vS ^dy ?>ࢴ᝾,m}CÛ*u4no9%.piͦs=t.W+3N-_וǿ:i0zS.x!Wtxu^obgFo1?WxOE_'ʯ]LuAM/;^$^dy@GEQ=lܼvŋ9xFh<0?W-x/^Y2lyt:[[J3$8=ؼ6r] \ugY%Ty{t PzSˋZ_9"owYϿ=kKp#-G.peOx`x՘pyA.'❾ v``~񎬣@:EtuoNjL*^u=/ dxQ'x,7-x0eG\utrY_s^6\?&odvū_BonL⽺wC`<NG@o r/,^=o?ql z& /`X?$>,{,O}ET.xNE ԫ(}v71>|VbZo}ַ+xg[_}gWY}E螸/SKuyGzWA|=D%ϯJջ* W* /"[`^DX/]i>=RY,1Yë.k/Jpx .u[ZSKع0muQ2fěp>tNַM(nuׄbZKWV,U">{uo Z]~Ȅ *^n"xձ.x1Qݽ$o{ /JӋsqHxtX|nyz"~5[PN_'x 0^tʖNWElƋ".xUE`>Sx+sѺ7<*$r eׅW6b'(YS{uUw]pk5&IMo0$^Wo}bQ˸Ug /Bβn;_>ak$_iV#.xk:6ZWy*`^O/E/Oٜ`>SPxQs_2\_;u5* 3 ^Dm}y{i| xU"8밙&^5o(-nȌ73A}k{/9D /TOF*lë  ^xWMFxg)Mk]\Y\̀~;{z7?D•7Ʈ6ۢCflK9~x1M)]o3^9mÕo^<̈^4j !7/sxQ0[EW+ċ]rLa%HjKpW~ ^~-SΈ T/Vx 5k‹:_eoVu/+^{ewex=]mܩ@S4"&>mVc>N?%6Ar\/W~OV m7ׂ2:>O^EL4ה˗ŷ|@&o֠e|N^^a3e價O:tFE$Ɩb~TT.Yx=RnW_!3o6>e^W -xT @.`@?e^ٳR Cgxp0_tO 35wERƋRl‹:jxL"EZ_^Dm}Ei:lV;ax|7^$!&;}Hl>#K/ZayѪ ^%& T_֟X6ƶo/BոEFY/2}q1ZifxH1ІťΝ;(6vW;u)je?6%ċusؽ^Q"b C˫6W]ƻ+ͺ!&bzwxu{kp^g᳊LxQw:tŋpF|{0zx5A# /J%K͌73} Nw!B<t茒6Rx`(=K<}{_[S'٭\bo\ysY|ݑEWwEA֡3->OPx]SWf ^E%N]N:)v<҆W}]A ?M}L Bo^Qy4?do(BW 6𢮷E ({{Kŋe\xΞ_A2ޱ0^{8^j}O`=rlxؽޱ"YxQ`*^YŋR>gEE>͌7x}kdE (^B{bqCgEi尙Z\dfkFT&.Q@ -x;*}zmߋ:=W|eYyq FWnU؆u,6w?.ZxW m?^J\/bk}]b= ^!A~[/5E%yiqi љzvW{`aqPy:w$A~[om#5KujxK!`^,W;k`Q> LxԩEKӦwȬv+]FŅ&`vኦU+?^LE_B|a/\?0lf6xs^,|V"Q `W~0xeohԉ͛}8o8i /KB«E/J\.Zɺwz1?}<,~Z`5 x9-.}7l|[c3'Ugj}uHz9/3#ȿC[_3R7ެ*W]CUV#'gcSBJު%>}|xbջMީ}Oƶ^E {///6Z^קh02xn ±r{>w$jk֗30^Sv_ +v jH&*w=Zg 0r䲹#^ p\`xjyL /*`^+?,[`Cg[pQ宑'E.Vl/¾*^ sLJ(Wgkז^U"]&wϯFW;kL"^숢"x^H>P{=p᏷co4޼FVQ]w1$&c^D]Eh‹~UFx7~sޢx^Z&͂xR|];^ڮ (MQ T'V /xR"- 󌥝͗ϊowGԯqū2#\_ZܵEi‹nx)e%KU/ #ELWċ]E=tKxxH|\IVZ^`=w$W$:HŋEËX;sn>:U0ޑ0^5iG fҴA ~ś~H")^X^ڮM(8ǫ"V3s!:}0a1xS+\/l?u(UHx}4᝻\;2r򮹷<7L4^EHmxQ ^*`/Rߛ EIKqQ5a#ajƛׯXx_‹9/bZ0קħ$xIcx((\Wif m?$^=u(R"RNjRo}H/,'=uZ֛Q cfrȂu;AxK( K*{{8 mx ԅWp@oEB3^k/uoѼ.)ۯޣ56jH/xQ[+F&-wsP:R[Wf^ ^~ .x=*9ԁW΃g~<&ou㵽OV& o]~=E.&;{XTi}U( 0UoXa5-;0~a]kXM[H3+Qrߕaꌦf5@[kwyyՠ(}\mx2x3"mE|EpQ޸2ß= GNV Ku,(ʺxR&:Z^D 0J_x{xȌ0^JUWt@7^=uJ@ޞ"RuDQxQ1rr茺 ^~F^ԋvD(^@UK, /Jzgn7^W˴Fa8`xJ8&WSM&%aa.\I]x1 $Tga65נ,fx)!ջF҈"[k/S4sPO~m"yRk.7|i ^#_]ʋV?[^[_ƛNEj 'gK0bKp1xKDxQ~s:ņ"ը^y1v^noxRsߘp++V8 2^u/mk6uQdJx:i04&W]\16I*ϯbe ~fGfa0^J]O oӃWCVxm7A|.)TŋR5<?0]Eo!3K"^Zp@CqQֻ ɼXEцs2k7WMHگax)MU"]گɻ,'k$xS*ER9(AM#|E0xx"xw//E_uޮJ`"-MU<?3ɂ4wDl;hxF]xv)3ΈK)&zhf ӌ9&BË,'Ԉ"}?Rs/M4H*ENx)wbI5(ƻz&o'wmD}i:\w濍e>W:-;LV;G ]\r31x"EgѴUy~m?EzkEx,ox /=ECA)bUh|u /kIo_>b+x{z aH_A ׿xkޮ(DHg>(^5]i. ۩xsoX /^.1z㥉,E^ߩ_3x+BpQwQ5$0^TJxC0Jaԁנ7Ey]#QgebwQzm0 xx)5cZǫ279HWuPx+"u(ު#ցGÛwW_j=t=muƋto~{#Lx)Y/%z"aHx> 2xsxLxCQTgBۡ>xMxhΛ7׺7h ssp^򠄶x"u=[[/*x_t6^z6V׌d9{WELp,ezW7ѾBf3}Flգ/0x+-_x#+y6~o0^Tlx_Ίb][5_*ڌL,ܱ/*ޮ ߗZcPJ_xaa$H;J3:f E/xC;70ޢxat6(YxQV}x'k$xC.g!kx~MB=hj`+{dxQA𢮟﮿9-XY4EyxyDQwx[QxE'^|iPցW?Ų2xiD0֔"ocavtx6h7fxQ L7gEx: `5ʈ"㏋9 Gɏ{,/w1vHx!E\E/)opaMu pxTHxf%$oެDX}-ү)j ۝tV:h >[^[ƯoPJ[:'^ Elo^tPx+ML&oEE"yE69(Ad~(o0^_x{ Y4P2ҙly]#mx:h:.o5u"[[oxwvHmr8`H#P2a.xiڵk$`fE= oUkD<4EoSxUHxk2^$V}3^6^DlL{4p@fc],iīG0n7$[C[7^\ys M(BxK6W9l7kP p~mUxf_]#Mx߼Y d9HfD{&;3^/aM<-Q4v3ؾ!MO^.P2^/l|#p4޵y_o^H o74^ UEexx.V!*^: /rIhxi~X&om*x6I닺 /M[׈65x3xkiyϋۯuhyJp#9(2xiv#H˫6ޚWc4B|㥋Hu(70^_xS%⬮eZO!wve~xuGmto" ^z +^? ެA kwoCԂ)*ĆwǨ9lqUU;h<~͌ caV=‹y~͡\7Ԇ\ԯـwـ:׉Ww|)">"tJ+o}UWWOYگӌKo]x `x}k.3RJ5I߹[G׹uJkDM3^ax],E/Ǿ\WK{PJ%l<3KGG/ (y 0:`uwR oޠO04 ( /ʢ}Q$FLOzCg^47A ?T&o屼*޽}q٫ѹ3&Q}mcF!u=zW!74Wݦ ޹#bs՟7rPV`X0RauU,/J\7^=oPa>\_@jj} 5$8tq\p@0V2xURT`ZV66{DQpNx}iyxQmn /M3$(3G-Yx .RoQ.Jxӿ)UxƫCsKs^oz]zw+r:h-Ũ5tĈˇwf̷uYX^+7oGٗ4:1v<-{9{7|q1I&K$^׈"[{o[xxM }DR^ٝ9^WrDJx.nOl㥸>EC޻u|o(⭣_3ʦZ^ѝwQ끎wB4@h~[/J[f^[QUNt^\mox/xmWQ%^zxԁWm+v39sDl?zkr!-ȶ}Q$h&*K>"12l[kdx}k[xG5/_u ֍o*`/RȪxո^U^:+v,AE *^Mxx1MKQ*^Ei/Bo^ׅ|J_>*\(^fJx<|nv1:~\e>M?Js"LcP/ ?UG%<=x}x< m,o]#JeJx>&>{9‹-ՁE+^I{kc,A eRo7 ެV"w^nwLtJcyi:U~(oPaRT/O_A^L˪5Bu]6[汯W+-~老W?şW!q޿IZ"cyE_35ցww*xᵍ(rƈ"=a)E{`qSzLxQ$(bL6^\$o ~x:+[cPxT rܼx*x\Z=t}|5p@JaH+xgOWVkJ^QG{vK.UkDkz 4ז{/ t/? XQx16=HmK=J Fjrkk} ċFgIk}U_ox]xtegγ/;vTl|=x#FNψǯ/Wo]9C+ݗw2*ޙc'gcȱ֋/9nSZu /#ߖ ŴUfN@g Lx_6c^xv[Ov#֗ 0xmvCX޲H.hk /B%Fc/֧/#xQׯ4E7oD7ֈWI_j<-><S˻0{Dll, Q^DL9wrZ<|ۯ o٧h}|t#{N_3[F{_^8OKGڹo_״7^L0u\9OK!]&c3be#0⊘v&״S4.'N-'w!Qx&LE\p:>N|m$Nċ09x0 BL9stFjE^-}3^ӂ2O^lky/yQJ~h)Q >0-m :(wYQX$}3^WSGUgU /J~ú3Ыau֗6O>%v?\ Y 6E qA;9#^>3HE.̈/9}3^²9Í!1V/(^3Z^3կpM;_37L.^\^/J /yXW.:P/X9${WOS4P\RZ_y}"z}`/X6'>iN / [闬Yķ~+_<]R+^Eox^|䶌7Ejǫ/Jx2U$͉7܏mHmt ߋ,v+.vm} ( s{ŇEF ZWV+35r:\/R%r`xxg?UWuN>"&e^:ҺT\yxw(=ߗ/}_>XuywRȽ^^UUrvؼIݯ֥ o|V;uzepJ|}dލIhڰ;KO>(֥:WZūHxW.OE r:B\/]j/ ^όCgEp^YVzE9uBxB_z[^L`ZKp `^ǠRF8O" <lKptIË\"޽>: _Ͱl*{{|~[ Wn5F zu5Ʈ6S .F}E؄W.-x}4("yI<igO"6%[)%tմWc Gۑw_T~JwϱS'W;ۭ4w)s'y\Ai+_؆1϶ҡ34_XWk8LnWS/>zW;Z_gO]xU_ G+{KΡvux*xi5:FҺ>s~UgK/?wT\tQ׍W=)xQ:j}mxkjċE+YWCh6N_8.vZ/?tZ;h e:)oDց!i\$ ޟW^Wvxfq=x~FVZGVN8-vvRNt r.uET\ex9pXNjTYEx4^"ީZ[bl}]UƋ:j$l;}.[>|6o=x1}]xՉ}X^D>gEͳ֍W/J:t66j/Jwf~`г֗Re+^$OLʺrwl\ox /{΁_Yy tB{2n&Xr_`q"pWF`U/JS*u‹:޴%V*]BxQ0ͳ(;}="NZx6 `+ Obq[xQZ_\*K<OEo*\]wznׄWWZ^pVf Wŋ2%vvީy (O-@>J[_x'Ppv ^m}EH+gj`vZʵu5|g⇊8 /TWnW W/w_ϋuaFk}-Rx\YZN =4Wez_\1iD ^z:t-xe=>" ^[k;WK;ן.y>t-/xցw)J$JǚWn3ax>F?6^qF:|ܥZ:eCghm /Zդh>t|"*`_jī2N__KBkx ƻfW-5npxWjAL v~`Mi}t0x?lxG]uEUr^e*׋7WQ[*x֢e˯Jk[f׺+R45᝾~Z~t=Ւxs Ux~q&""ˋbXg t.=Wλ>%`wl/as޽祗FFhBUO{Vsg߬E}~֢r#U?^as(xzx&ow|,u>r~F˫2^.Äwn\z:/ͣTu%EX+}jr;^]8&EYH*d`ꨁ+^{Itm%4M+UN5PETYx;rx0^ ^V}U^O&oi/BmET*,]U( px•vo: 'XoOLV+&2bK:^3n6r}pt /-CYa\7vXYF>7x`W1/EUҹ:ELLxkWxI"*"Eޑue˫uwx9/ ƛ>exQ#\7EN_~:نWVfjeIiyWc}MEpQ&H^й(^+[46/J0J۝‹]R VW? \+xNͥUxGKf$h(O+ϋū¥\/B][^0<^x+}ؚێ>.L1LϹV{Cf5Luӭ"9.X]<"ƛ6osґ#yAl_=&>)tū-7]hȽ^KL@ msw"2phxy7o\H]xETV EFiW;!6/==}dpYP. ?y;·EtxVָ<:gӄ7E(Ox .M뀳\slxÊZ"2< 8 5EK[! ʭdfxViW-EtƄ1*^n"*`^9Y*^Գ3fR /bE0s"A.]2FVsû^c F'0IxQ/ER\"x? cι[<RxFE\"an"z;& 0m& V}‹\W/(❺zZ|xˈxQWe͔݇x2L/:`ۭƋZ_=ėC_/W[3^#OK*^YKJmex. 0m&WIW6Z^:F2"E/Z. /-W^mNeŪCggXpy0ޜe:/ZO,rwfzk;}^=U";p`^sSxp,>[cu `~ZūEBNj!!~Q2^Ƌt/n) ^Dl Wn_=!‹O^xm2-ƻFH>EMC3/e6":^9[/T/W[&wW^pUlK•^Y^*9"e-3^ƫM3ނi "&r~0|u m.cx:#vٟW^.^;M6ӌw^q8E:urpx09Vcaƈ 0Cs{ gZgEox;W. /6E^\ oU(ϊk׉&)W.Sktޫ \yϯ9+oE\Z_;/+. .R pm"?Qˋ endstream endobj 2188 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 242 /Height 706 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 242 /Colors 4 >> /Length 18724 >> stream xՂaE2C d A܈K@pGܑu.#d/(A JV/w\A!YD B 7 .w{>էsVSuNCWuwUuO,Ko]]>Ƌn/:;9pޅKӶ8ivd^^,jWo,}z*qz]W^IuĶQ fB_1̡Ų.9BƮnCNQA:t̄\d4!7d+!s빺;:ddL#d NtkE@i A!U 8&ȮkvQ7(d1!u<'|m.2Zc&eT̹!em](92c yrFb?"dc"dBΦ;7:zA)JO,0 مXKy'^y8z,T!YGL޸G,`#dbDȃ7/b=T!&T6G^~ϭ?$?E>r>]C| B.&B&d6?!Q8:d{LȎ Z'dB=4v;\KEBqy> #fBގlȘ3sXK ) c^0䨿HS1_{q&y&|!k\'d!\HȎUdLȄlTdLOr1B6!rȗO7{qx YEy+Bn!ȑuȱ3 k󁌂>5s*1X y*r 2)!NHŜ 2 LyYf| ^.(3!i А"n/x׶OrlޅX2ݫ{c4dc&,22a&dw}̄쌐e P1rY !gȆy HLT.~BmWd8Hb rWv# 9[2fLc0" q*<h:1 Ca,<{V{| [σKR@>ѩfBL| |irIZ*Ș=^#F*d>fL>'B.!#}2`AV2yXBnMȓRCF>.&]sMȓr@F.̶Ԅ@qBϑ 9]UBF]>O6AF6_´Bni;0>B."BV 3>(ضwA6=f&RBF.̄ #,{g Yu>.s ћdrtHQ(`$?v.ﹾ7~̅]րrcR {'0rY^d0%dL"dy~qΐ 3!g9BF}!Ǖ 9K>B4dԐ 3!gDŽ,Zw9c-/22aن #;dc&,!ߝdb&,rd%Cm7db s[Q'RA7%d$1r&Ȧ_2f9OI#9A6Vo?)@FbX,Kȡ2!χ+ Y}> cSZ#fBNW"₌BD,"nES Y}Nq{w}Ԑ fB6]ȇ/m\cJ#^yodWyQ oy,!OiC+ YE,YGn!#|7^~E}}A4t샌\c o_6 '?̓o,%d\:dպ~t&6 y @uⶉ@|yS@ԇM2`&d9rEMӿ]B.AF&SlCnȅM3m 2!{ 2 샌t1 O^9نx.!rFK/6|ҷW"dv@F6̄m 3>_ޞhڐ1{x)!񸖏Ƅ6!/=> >uypC!9!2@!n\Ӹ&ȇyb} 91 j]B֛GvOˬ1@F&Syޖ:@1Oɪ^h~ <vf@ԇx>!XbeBAnkoז:d<{dbq?!oEQ![À9'dq =un>īu"n?"dW&dk󀌆|LȄ!,o}oڐy,1wC,'A}zI!c^Ŝ 2+Ox  Xk/@^<#!]lk4b/O #fB6/+2B4q}BB.Șw 2a6AEtȡW Y.c!kB>wJ̄x #bQOȴW2a&e 9k:@=eM7+0 9qA˽Z@PĈ cӃ,nDdc d;مbr@F^ׇT̩ wy,sd9OE4?b9u_Șƾ?F] ~X~_17ӛ 7/AFbT@8o]r9dc LosAB6!F!_x/{LJ\zdcD,]ZڶwSwj! 9_ #`CCF,BA,3r>mr\*v;qzrݝN5{o}~0rf91 lB|l=qȾCcA^=GȨ=XHH<dLȉs皇Wv:thb}]Ʋ.*bY^92^cȄG%A=21cJ" u#0w#^CȕW?dLMu(7!ـWdYjȘv1b݂ ,S쑻b&䭦YV.!v$ #6>(dbD9OY cb k\/2\c!O D!~vgdم\w{ۏ92 ɟ!'/o^Kȸᵄ,ng5!oGAM2u*Gu1;PLȁM2%d\^O jy?d3!դ #um 1"dsM kBvD,ه|~v:ʋ&ddL>@F22!5_ȸ^ "0هx|d5fB.AFKۡ W&d\\mkt̄LJlL,dq ^-3ub 'Vn# ' هX̘&B ^=B._SVȸy X6s#dBv4kA&î rղq'tso'&̄m4dh}?0daLbFc@{aXW6AD y_ 1zYNoKYאw.>]iC,!>xp.2foF@(d do}9X,@u yk0Ș 9Ƽl,` `Z#>Sb{~=Z=>Yf;rF]BF /̗هXlKY{83ޥo>11r‹u ]Yf-![p@F*fB6fzkzɘEML b]m !# 2lސT(=t bNd$O!B诋Ab܏id$Ne,{gBkBf_gL>VȘb^YCy؆~k~ 5E;n.txׄlTל?. rPEAѓXf,˃L y"^Su[h^ #`^Ob LƊxM@FKlB,o/2M 9"^!/Y xMAָzx#^XVì" 9b^!/ʇT̩ c^ǜ2R1ryA>bVo{yb^O1K/* 2R1mkMWrzFٷW d$1B1%䭊y=CV#dB.b^OQu} #`Y,`6AF]NxaJ[zFLj,W 12R1'Vż!#3!raz&Y"!7?]Y,GCU 22}79qֲ!!˽0c >PPHb&y=CFr-1!F/MH2G~~Ԅui(bL 7N5?z7".h6'~s]'fdd;&y=CFjaBL:fBb^O\"hퟎq%d^X@F61"b^()BaGԅ #SdHŜ8[[/]|h-?DU&ȹ?CFǓ_+ Iԡ{d]fLc!#`Ɣ3S Oq]'Ԑ0 #^S@q"dd!]b1rx)!;#dBx˻co]z d30I1"Y,'z .@ԅ9'd}k9sޭ[C5!{-ϐ|(䘳֥@uf2na|t]2Zc.?zFkB5am]UĈ*T Y1%b̛ 0t} 5ܹ̄^d  ԐuY"}{ex,pMdqVEB21 #لX<g{eBS3hn0',W0?w巚_⡵^OS|_H\ d̛2k̄ܩ^OsN]KȄu 2h۶WZs qzGOj!ll{psɥA怐rBHbN Y"< c:sY,/1Kye]!?ؓ͏y ρ+ 1"䌐Cƴ+db3Gw_8 ȸ#F4BA4ǂz,!#q{VЀ|Ow^0{|G,Q{ Y& /LxhF̄4BYEJlʅ۔|ߌytLQ2!o'!_s9rgY>zDse3R54 "F'!j)@ !Vc:)tCk?.ur,1rTr?V#dLM%d1`T̩!_m9d49 ?~Tٛ[{f7B 5$ 憌t*dq=yYF d ߞkvp|ȡA02R17B&\ *db!#YBYCF:ANK"F:YcZdf\Jx=[vП!XHbF:d̘J( {dBY I:d~,"dB3UHbvAFL*1r"dW4BE! 0@>zgb.o~iNN!ゐ7u Y<};GȸrQ]f/d!!kM߀#d\T\U}̄!ゐ7rrGOȸ}QX Fu@Y05BYm.ȩY g-C!ۇzow?]nW&dkLțϔr͐1-i5 y7:\p槿\ *bL}S2J Ss ȱ_a$#d ߹zsbYB$B&McAF*fB93d1]) ҐA^qAțR  !ゐ7EȃFȸ M!#9W4 YDȸ Y"F] ?gu=L +d$1rp!wc>%䔃AJ̏Ʃ1> ^rpe9Y Rd̫m1%r_ !dd+ f 9^jŲdȾǥ@F?GȽ#dBޔzxq yynP7m?3썐 ySq֛?c'rWȸڝ'f(d5B!w,ӇgM  'VA|mo_m3 LƊFqj ՅrBV@,#B6B^ ?<~z\?dgM}`z]_\.![#d\AVY] #BŔ KĘ/ ǵCXme!VȮ1Uc \=v?r9BFȸ"RY3Gȸ U\mub@%a"dT!B!+dL`~hȹYƘϐ1%dc.e1rkvx9&>3] 2TQ dC޿4*bDG A] gZ2.yXlKyb!"%d B\m dӉBs0>rlqQ29gZ2.ƄlBRBVg2! gMȄB&1 1"4u9B^T Ϩ.DȄAP dLk̏Fȋsκ. |"d\{xf3(XFj!c^GRA.'m슐qQ)NȮLW%bDȄLțy 2?mnKB&`ȷ;FcCV O1"EᙨTȘFu!WϷ &Sbox&*r`Bn#!"F%AcDȋ Vۉ6BގhsBuĈ|`5y/Lr!/fٴ7F6%}y1CȾjrGO}lB= 6f.4\!W!ゐ b]2.b9Q]3װU''44dLC>Cm|!U7F\`DȣD B&,YT4db䃌iϐQ)|2"E!=ZNȈBsTChh1EDȄY&!d!:<rq򂐳BAbDȋJ!cjBkj9>CFLȵEȆنXGȈ3^O>BF(r HlkoK*)Phc D>:bDȣT=bDZcCw ryhw?]x=&0zTȦc˪jr>=!B..B^t<хRA YmPȥA\\(2*fB&yQ0.'P3m3B^ĪL".T d=ry鏜ˆkxf̨.DY#EϐQ_1-y]L B><yB!/ ω.9'4d\wT"Ħ !/ 3c,!#B^ ٶGN2J 9Չ.lQՐTwK /BV-B^GA2 &O L늅y3!!-;w~_m+dLKyB$Q(b  =r3!/:Q K ry+L#E.L\ۨ.DY#!ryAȃCN9KOȄ(|&Ĉ !/*\LDY#E6S AL%V5N~zXV dLc O1"Ea1u^Յ6<+yC b2ArAF3ׄlXk mԐ1A\1~BvF~au,chy&#d\kh,dyĜr3M3B^Wռ r 0%* 1%dmyB5\f>Ĉ"uCIBWkT""?RA^:qbB5R A6rxh}X~l~( 5gۿz)F) ?¯/ů|o? Kv^9̮!hbȸbvjnoKMEL{1!cjB9kڄYBƼ|}'nȀyqֈFȋ!{ٻj0_=5!+r ȘW1p櫇_Z=̎\8kG2<)Ĩ:?̾T1>[2K*d{A=K,CȓH,o#ͧo3y"!d1cT;Ϯz.}`JI#uBT+r̆'7o~} ̩!Յ鐐15a&r22ŶaF{i@Z3l׭EF"F9}s{\} NbƼ ZB~{/4W6g7?%=DȣE늁,1M;:|{NЯ|./i.^;>Ũ.DȣE늂,ns`-1+ONx}҄Y} [ċǷ3g3!W!/2|Ƅ,>f 8ÕՀӔؐ˭H>DK3 ?M-#"ňl,1?d5 3:yQ9d̛0!C_3' 2 9V!#s1"&7FC>ƳoOzuB0Kr~(ȱ{cDI@F:fdy݄Orxq֩!G 3*d1"z*WN5>4aAF*fdbV!m:d5A}TAy!+yQ](d$1rU0#1 $fdy>0׍ I>Hb !#B 6 zdbq*b<T3e\GUCV>b>#dd;5Q1]ˎ?!c>dlbrĪ\e\\w!-oЪ$2fB.20U}=BVRwx] T_aFwM 5Ġt22b K;o<}VM^6 blC z_ȾRQ1U%$oYG7 `T,oS!Sg?U ![ng|2fLט_eTZ MIA>(jBc1U1#,3!@Fl[NNE ֦,2{j,/j|Ov~\e( #rG;J,_|ٻؐKg-#d=iY) s/4~ʼn1ua&d\'yrUY uqѓs y쭧{ _dL2!`]ީ7#L+db^.ĈUwFȋr w)Qk~ފ95db;d4r[RȆdd<&dن@Fs j~ފ ć/ٟ^_ هXWdN bsdfB.j #2R1 #W{eB.b!m90YUAFʋz1ܽY mQȸC,rbHJb d%/ddœ 2R1Y* sYא}Q=D9!crxzKz/*2xLZAGOb!{k޼*d@V>w߼<3ͽ xC coi{dT^]1 ȘJHBnqdLM%ࣗxȘNpLZBu15f XCn76A۝dT BNș5dw!j628އln7r/Lz@>&5=NM2R*d^XY p A|EkyIc@I2b ɽn%ʵ<SFOHbAr@G<ſg„XO"F\WAF#!d \:콵< Y[/dL++{2r" d̛0Utx]sUV:#B?zٽp;sYv|߄"r"dCS"F V1%b2!{"dlMmX~*b4ȇ~}yk $d!c>sdL ʓGCFBԆ0N d4kB6>y?st]gAȾYˊ W>B޹|ٻxKslo搏=yєGȆyS Y+d SlBjt̄\^ #GP]'\ yPȅ^|TduddÜֈF] 뾐 pMiU9dWvA.p\s!rorKz."䌐]Qiw \^A>ל5KHǬB6!rz!(s)#k,3`AF&&.vzB3d3?5\]2naO.yd !{edqf' si15a+rS5IHLȫt1x=VR}!e֘Cn yyfdd+91*2aV!j,B^2! u4>HMQ)m3 {7zW2YO%X~ Y z,b}̄\NbWAV42hBv6Ĩ*sBFs:bdLU(%d3!gdL]}QPcבaSd:ḑ:ᵞ%V׽ X'L2![jsC!AauS' u:@V%dklh5s7.}{{ֿ}w "C>j@ɽnمX\/%d#(xׄlHsd޾mYСC}:=!ן?Y'X1 사;y"LX21SBϡ^l0@F:ϑw>8콹W0 !l[A"㈽}O(sds-#A dq#&>īeܐe:v/25dyHbfBXHbrzBvJB BH뱘لrMX(Qw.2ra&2r^Y,>ԎA@F]@悌l yzMXg\!#Pc|xyxIJ=B64ġD, yz%t! !@, 9 2R1"dC%C?/& 1* ؎/NHzt ;k=d̄2} 9ننصMs&dcCYE]!1c:ҙkB2fB_dw}LeU dݷ *Bׄl7d~^ӭF- #搿QfB^?8wLqGCC^Le5ɮL2?Vdbvk,'rZύY?Uz y>!Z'(ftZώL Z׌y(u ,S'rGe* -BV@^o+yb4_dŒ X_Ly j1Om)B rS }!yx|ׄBF+Yktȫmm0ϕ%bTb3_3)>fB_1W\ats\B^m撐˩XȡQNpx'YJș* jq{c229BF:fB =&Bl%ղ19ی9d3!gc"r|ʙfCR!"+ddLk g%do-Ah#b=Ŝr,v;CF!{eB.A jCZ d3Ur,Wqv},AȄ!!}s?B;&BTddL*5r}n bDȽ#dG WA| T"( 21 #ZHr k7F# 7d̫ rǟ/ Z>4@˿Qd> TsU,wn y2!B,6 -}] w9WdBԬ +e1{.ŞWo&Ș+sTW$fdv9dYⅫv/9|rdNxrM#L}-QPr/|yM=3!O^ А0c+m8 #fd}/ܮ' ٻ'S<&I(XN z90V:]@&ȶzy ކ!;1e]Y}~Or!;2>#XH,?v o=n d 3C5bD #Y }b6*Xnlj;Bs$b񸑐^sAs=9zxMeF#BnxG@Lc@rUoH<dNT(\f,dc#~@ǔz endstream endobj 2189 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 269 /Height 706 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 269 /Colors 4 >> /Length 10430 >> stream x=mu}҄4iL 0RAP!Rč0ve j@@W62FRz4&Ҥ8s^{̗1cx9}zO>Geÿc,_Xr{;縿cɿg^Zm{) s7̀AK4f!y@&`H朎d hSs7'h(a9/CCV+8@6И9AC) JhnKѐ, @cZ.g @4 r9hHpm1-3R|ƴ\ Iа 4rFP 4@ 3AC҂4li4 0匮А4 @cZ.g @4 r9#h(aݡ!q%3@#u.g Y-6@6И]Q^}[/8Riѐuhf FchƵEܧ4l)4 @_(k @cJng @&ehHVOQ@6ИݣQ ƔJMh~pm1%3Rah 4 .v0h|m0.g @æhvPh9  @cJng l4l)4 @_(os y @&WH4}^3@#e @&h(uG4@_a(og!M/PJ4dl4nzѐ @<3Rah+<XahzFP 4l Rah+1h湞4 @_i(#`ahzFP 4l @C|iKFyYA.0|hJFy,а 4Ls?h(6~IG 4l F4а 4u4$c8@&4$ͯQ2c.(Fw?4Jx~~P I!+T$h 4Jp\Uߓ : @gUh 4j4!!* @gА~* h 4Z4 FOp~3ih> @C}9Wӎ  1h(FKFBJuQ.Bh#h)|АF'7CO/4 1h(u53 BJyAdhb>PJ4d hb>P#%m<@ìRAC҄4L 3h(3މ>  )<@ä0DC4 4!4 w?vK5&4hf>P!͆C R aR@CLh  eDCڃ4L 3h(0)|4,8@ä0Bw@$xIas ǕhH3ᘍq@C0BwDC֙?~ @82P4. !̀C~O'4q#4B ѐf) 5h(tW4%3P4@cPB5R1 h(1X@C-4pl5k8hHp@C!аE#9R@C!B Ɨ EO?π4tC4>v^ 4CC&8 ea@C4 5{4V8@4j> 4^ӂ4|kT@c0Nh vd h/l1W4$+8~>@cQ8@g1hU-R ѐF[=z6}qq 0Vs@c4$+8@#|hloyp^8xh4dhzMk4z5;ᱺ@. 45QАZ6.;7!@BZ8@koK-kghHp!q4֟֯U1hOVF{p@c4$m8@#tqh<@C@$xFh  IP 4Nh,;4| YhQ҄4B'{%@=hmK8@4@=xnh  I P 4NEZpF@$Xm> thl h 1hT@CҀ4T@cАpO 4 (l1h!8@g1h@ag@4 ;[H4#8!ъ4 5~3'VEQhlہ@c аCCz#'VEag@4 ;h 1P٦!Y4 m*?ן~F$48zАF7|p14'VEag@4: =t4%Yfo| qh\Z.CC4@#hδ(! =ץhH#ph-\!hHpp@4 = 48@4z.7hHph-\ѐh,\А46hHph z.,R1\@3B ȉFb0гFg 4:@Cj4~. 4@s]Ր@Q4V8@csGCZmht~. W@3ht~. 4@sFC+hh ~. 4@sFghHpƔ>owo5~/w%h4Im: 4:ۣ[ܣ!k 1hL+\ё5l4Z8@3@C:#R 3FG 4: ,LW p%1hb&4@3BC44K1+4 (4wGC:4Bb&4@3CCڃ4 R-IR i 4LK1-А4 ,\L4#8ѐ(hm 8@wѐ=p Y)@4:K1Wh451hf&4@43FGѐ0)<*LWhK3S 4h꥙ 4: (LАپ#T) l#43FGw@Cڃ4J3S*4$CV4TK3htQҡ! Vh\K3[4d={eECZaJ3h4Y@1̔ Y-~АRhtj7h@5Yy@ѐpFRs pF}T\=htJ5ՃFG3ѐpX )LWFRt h+LW8$p_4:PA!iQ 64K5Ճ!ko @cT3]=h T A@c S4ea@c Qy.4Ts01iq1ҬbL?ٗ)3Q]y\ m!oe<@l&  r{ }]e0fh%ѐx{Uy\ (m!i+hmÀFGhFXh0R o46a@#438h.<.4АZ:@lxZ8Z<@l4ECjCy"` Ue0X Ro44GƬ(uX )5)'+hL+y4F̱@ch/]=OH 1eiecШ=()ƏǃFꃭj@4 2nW@G̱ÁƢhFHiͮ4ՠFyLYAcZf@=򸲂ƴ2ͲÁ{qǢVf@YhH#pif@ߠLlvp[`HaZY6z8x}j"YY8A heî4s/JaV9z@xhAaqeie㰫=V3cj${SزƴqhF4@4uhPx}lYAcZY8ݣƴqhF4@4u!ρaY8A5e,svрF e)e+yhX?5)ǐu ?mzI[ 2Ph8EczF91 3Tq)Iqh Иq=GhH=g/ )C44 S2iS9N qڭѐFhe@ghe@hH?e4;Yq>=@cJh}@[`2PhLDcYF91 3Te: / Յ@CӌмQ%+hL) Ձhxf. =`HGhD}jR'= eۣ!Qj4~jR'+hL) ՅB+(zQhCF ,E֫ѐFh}݁Fh}݁Fh\u=EV0/@5x)ѰEV0/Zt=G4;4^;h+g EphOEphOEpQ-ޮg= EpCT'Y[ѐGpS>hρS>hρS>hρS>\H4+FٗА}CNh<}CNh<}CNh<}CN-hԀQ= 4(,OM$*@h||}ҡt#4z&M.U@kQ佫mzFٛaZ佫,MV0-U@kQ佫@{W 4Gh,0d4b|!!E޻Jqh| 4>w@ h|y*A5(Up4j@4'4eH=hH5_A"]PhH[4Swf? yQhF 4̋o@$huߪIhCF`0{W 4NOY_ϐ@ü{W+<`HK4w@4]@{W 4* x/@4hT@"h|h<@#Ш@üV4*4 t4FGg1h4;8@`pD@Y70$0-^-V 4L)Fcr4إACnςmi!m}fS@c,Јht) hgUё'40^&4rQQ954إBCh@c,ЈhtcF@# 4b1? TE@# 4b iOXAFG1^@4Z{ts I9Owߣׅ 4:*h >~ڷqhtBck-UDxxz]gpht%C~ QJ4$K8@ch|rahЈhtFB!8FG]/4{d1C40t4$-8@cV8m?@c?htǵ}@4htTd W4jxFGwVhHp9gpF@#hX!hh9 h^\ )ن 4: ݳ ЈАF иsQf4%A@#hC+ 0>\F;XFGwhH#pFmpF@!imF@V4$m8@$/p]X4$CVK8@#VhƝ@c ЈhtqA`H#hHp.8<}1 Ihpva x 4(jА48hthKAG qo<׵<`Tѐ@ 4* xi6~^}0hthD 4(S4$?{R@=R+#hHpxACR h :G~_~o @h : Y P 44(xQ48@ä)hHph(vs34$F!ih h4ޛ h Y>| hRh,4{5 I  @!X_ 4$ 8@4@chH=pxCCh,u(hx 4hou)JFChh3 P4  @! W1 4h/hH=p]hH#p\`4[{ Р@ck/ѐj @17hHp~A{>@4h7WhHpMA{>@>@4h3wǟ.O48! Јh4@6sT hh4@6=Fܢ! P4 I4hk438@.Р@ؠ 4 hH=pFܣ!a۱7@#wqvhHGpjQ4=8@.Р@츠h4@ hh4@ cFCڃ4T@映ICCZq'4f!m5 Р@x; Y-(/pdECZFGQ{q^4hc4L 4jMF@X\ h|4L *oǝYhHK8@C5, oǞh9K_h 4r m h9KF h 4r i ۾@#gi(iu\T @h0dj8 Ih 4u+4J#xF[[!^(hZ:@C8@C-hjw@c XThe|F% 46:ciHgNGJA>ȗ; ):hЈSh4ҰD>󘍆#hFCk8 0$РuQ 5#pJ1ht$h|o?ej@-5@c H 5РehH([4: Zy@cr 438@#Nё'4{*5 ZyDC#!1ht&A@#hHZJAցFG(u"Q4hht РuQT4J-xh!q!^( Ze@tv4:ʄFiРuXʆh:w hgFi}4hh4v4%A¢Qމ|p]e^8FcWQ~h FcwDC?Јh4c]`(0 endstream endobj 2196 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1931 >> stream xU{Pχ|AV3\ Glx1DK< @ƀI@ hWgۮ[ǺS;Nlg:3ss%^ |eYY'w/r/8m6u_%0O|_Ǘuv1Im8,]ruغ-E^aQ &:!,;< | `0%9R%iatqa CoCxoя5t]>#tͪ~ߗ~וەOh9rIyvIf\pIeu4Ot > ќ7cq".v*'NhlW ڶIyJ.%±{-u&uZB|ctloV=՘*7%.IE!#;m97p }Q?qzFdY:2G&F..O7އ0]1R8-~::G@LlB@IC/'߬,(=W)kг#-UMĤϛ>k0jmqas+O["HNqi<(q oxi_}gn[9#(yDK2)iO6'ㅘV qHK.-{k7Z (ts%Ɩna ^[O-~(.~bL8s%;a -?¡uv,`OϹ+LioZF 0&x!`L(| Ms`VhI7Idw3iO#W3h-v> stream xcd`ab`ddq,L̉wIL~H3f~g뻀Gw#nbcn#úKG/?Ql|pf?=% endstream endobj 2209 0 obj << /Length 2070 /Filter /FlateDecode >> stream xZ_o6ϧX ItIkރlӱZYr%9Yw %KVn1EgH>z7= `Rr4_|9ÀIWƊ)6q|-&530?hOgB-DT7J95#zVH8r"e+D}bッh`)64]EG3zMg>211) (7 tǼzQETi0=]-ue$;+]PrZBI7&7DIYY<¯@%Cme˭ k\C1)gk.. ۬ԋ- =ˁE;izEl)8ק~7|$@)ͼhi[QP=v=n}1f괸Rh'ϔzh,eB pZ/b; 3.>[UT4`F[V\$؂ $QL<ĵ$E;kHj٧|W›(0{ϸP'.d,>.)>1 9bc/:'6t'*; )>A*'Os^0'Q!&/ \ZB5KF$N)^!B[,{`/XQLzq튓v1%%FPP?DZj h '!LY z$LLb*nYD^9S8Y a(LJǦf-L2ʁ錇/Ƒ3eqG+q\ |^pe1dj*,[a9i^vF9Gogp\ؙ `?l>HLqiOiC)xZQ'gp`nDWl6y!WH̳IU\z KR /WyJY\gq3&3g?% izL":>ÔjzVUcX!r 滸^C]UP՗V7|>bzK? G<plf;LA@u3nM|0o|,ZP1nފw1Ӫ+O\f" UFL)7Gf3-X%w}COjڪ567+Yt+|͎1n$Ji\i=dNPd̪B)sGN[b]U=wDroxђ\%z7Ej,x#܇k fs=﨟Ys YG$]G[t@9sZ>Mb"hu'6Rm%zi(iVu2J/2&J.@WkT\K @Ocytu=!7?ܬ @ZS"+2{M^(3F?M-fyƖn M񔸺aY&ޮЭXL'V`璮m|׷-pxxq؂qx JW @抇lQn)Z2JilQ߄VK\nN.ST^SyʣUlRd=RUluMxQMQ!F( v8}e8*|Ĺ)>J(t@7x0a~? iVo endstream endobj 2201 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 226.999 229.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2214 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP= endstream endobj 2200 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/L-shape2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2215 0 R /BBox [0 0 227 230] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2216 0 R >>/Font << /R10 2217 0 R/R8 2218 0 R>> >> /Length 1420 /Filter /FlateDecode >> stream xY;6 +T:)ZϸIXeR$vdUxR(x;,I~D)?ux)7)}>ie1bWHHT.lm34i@5*Ş`*+?n)c^OWG KwEjb)S 6>g8D[{2j'KÁbGq0=VHBJ(HK;` /$.UWe _ T$< DE8YA u+ )~?wM\lx6\ڍ k&6C A'Sxp~),&,f+ )o'|PJ)P)9#᫱lo8HjՃ"k#*+A2ÈM;v\HHםP&s߈^ V\[;n_^^H IYnt7|QQ Q¼Եw5p5$5ZkA/w I 4ģ[{4K<:nciܻiOdRJG§Ù"/h/ S  "U WkC7RHrx׺Z]t& -*j@T4LKK̋Z2*|nU;wkA ˏ6-ʋʚ={Xc#iFkxyj/ǟHD$W~5Rl29:pi]#+xsb]FPusՁMZP]Ú~DKّmsmk܋~4vcuEظj_;|㾻cS u͙(hϟ0;KwoǗM5MЙ y&dO7^L &;7Tab\_v..t4믪;FeUnLï? endstream endobj 2223 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 987 >> stream x=kLwߗKll@90Aj]R}P[6-:288&c UK't֖Z(*҂0~ 8_벗}Xr><_s9$G$V*Wm~\sp.v"ݲ)CXO_%،CPph'?ZȧiB!A,qD1A#ϓH /lf:GN*O'<79i,]Ve>p܇ݪ9X&Gi鴵 hjt6mPt3:.^`zxt@bVjpJG_;vyڃ5XyڮM z(pR}ԥK-E Ī꯳}=Dpҵq:BNTPpEa.7jf -.ˍN'6mx@ x'ֽhLxXX`RГ{5@7%3(~,&q07:~uI:ч17 Dz)Tz!H$Ρ59CAqH^$B$/C.X/beY,' ūkz>g.qIdm%7G͟\ɆDI3r34okH+n2-àa5N72'h;=z8RIrj O[7K%}~}&];%׋(_;yKAKsӞGEkI=R=AZY^F^zV6&cAԘ{7);Bơ:77 ;ڵhO-@T8jՀzκ5Z)mu}ά見oxŦD8L*UcAL( fShz܇!=;^ %ߖ u'uJ}dRqH#vG<X̛fĿSm endstream endobj 2224 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 238 >> stream xcd`ab`ddds,L~H3fn1g{SG91000&10vDm-úǟl_LڣG wm"hiݿ~+jf- D]pt-2G]aoov_{+>v.)lY56AݿE9~}t?'u\ endstream endobj 2203 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2225 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjPD endstream endobj 2202 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/lshapeSol.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2226 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2227 0 R >>>> /Length 16828 /Filter /FlateDecode >> stream x}K,+k |cO޾K?= 2OFU?B-?Ͽyo{4U$@wϭ/k+*G(6YڸmRphINZ':o%yERMh|n pnpPKJBqd~K&"|5R Ū]j_LϙX Bc;m ϕ* $zUtzQ i aO{gH(byi8&μQVNȜoYog5 :mi:0+^괧 9b@?K|9pZhcEq5rm<6K5lKؾP&d72mF_itFއp׉V bEzEE"l2, K8Yq8[]l,’"o I y1͐Oz:{ 5XB* pNJ%]v_]ykwڨhe7'˜ZN';&ډwA!ɑބ` Ӵvw<#q3>g;v<;;;i VYYP $&Ȩk@Qv& ELS @Eً$@=O);vqwYeb˞/)rRJZG •DݚJYyehao ٶ-j0I4ŚG"o}N }/Έ;b0Y-kJc&Zî/BUAV0ǰFbv,VlȲQ/DcC+f-t8ou\+h% ںH{qW ]F2uvT{[%O=GA!ᳰU',m/x:lJ/qwo }]>iS%TΏӼC}WҾ T=G,Hc }IJ2=dE6e5B?BiTk6G}WwaryEHM%~o` z!PdOLA&Y](]pԯ}%G+Y3/~g/dJ&p9--OoX:`2-L÷#B'K&GKy]mj-'H#ƶb%\^#/b,\v;H>҂r9Q]$lq\X< Ǭ̾9/Ҡ]%()9KOmyDt܏0a1S -Em-^V QϘ>F=M3Ui#BOCBVZiR!++p.ש*oYX]629DlNn׳YubMn J|f3K~6U7 | 4 -a -LHG $߀Zu7qqIB=o:n81M'T1<Kԏ]dn|E-PD#% {T8Rᄾ*J*.i^*Lq>o<-]jlYxϋ8NXFe&3=Nm•L8&;yrf"/˒)(%2s3יWJ9(ﹺl + 1n'Mۃ "ȕ3ͣ(3G;v&b̏+<θJ{lsPJYAnژ{rׂ8ZV6mZBLk{D@#]-h vf~Znl"Fr-؍%ʜ Xe9c^B 8)eCا4R0X)]e  yVrWƻD-1U:gb1/*P40`i`!0}q;L¸_lh@NѶ-x#J [dRE![M ~Qr/aR6A#n&lZ*Ր -=aW;o9RYYd2,t>9]V;RS1|^?Q7R.Ԛ^?؝~0-X['c2RVa O,u5rbgZ0Rz9U\BzaT<8GKF*h7dIȉw|:X# s+@ޝ/(d'@ F5hcXeYL)J Rs Ne0G2dfӻ:/@B(o[-0Ki= P=lT 3B0 }20]*_Afli _A^hڽpgJP{RYwyWkN.ȑl$bD+d#UY 0G]kM9@~ &uݡ ^ih9ohRyڽM Ӵqra0' (e3#\*dCM^*P42f5 g$9d(=y}tG1K]@cؒ+3 b,yYJC؅wbƇ<8R|.A AN&a xڣ#'k]DZOgI|eƂ>Yhn,pHV50EW# 2)#GP ?k^C 30\!yi[ƞ:^$ιI 5u6z9 3ZJFvà:~LA.>#dCKg7`bn QYg^NIu%@mTr;`(t8-]bn{dFM'uOVIƮq!Hq ׽* [ޥ>q=>%Do޴:f[U2m [XDЇRm1@~jy-b$JS E,l\4.BYkǘQv$K㉓˺X#D*y\MϭI+b-$0 iBglQάiYSg& F#ׂ omb+[P!aw.9W&b>8T~ƒe ʏ{_ޫHQ4*Hj]hX0:M1[6v;|F16B]6,L~ŞB>- ކc49>Fo9Du$,k(Ӫؓ1ndD'Iy;$|H&E܌ '3ٴ <@G|mZns7Bf!4g9W79E9P[j7QjmY@6U+;ô`Pʹٺ:]J6o-]H.Ypj٩rJZW 9}Dm ?4\dCl1\,D9_:2è*99gJ{d| b;RIH0{]EYhD_8$?be7Uf;C?d&7nd/jր26q\vPAn-BXΑ9RsXTؼ8h>)h1a+ )z|;4OEru7̬Uk IY+Xcն1\߅z@;ZA/Hlka%>X e>nʣ4Ee>'1y7jp]Z>5`=vXl#eWe yY:}0mkEyTI>0HoǸ=$3=XfJ2{ z%K wxI _ Tx ~E aꥌQ}ɘ aaѫiOvHx-NW^3`HQOׯdxZ> iOr[@C]~O^I.ijwi) UGRuTj.e:_p)Ye"5-S/JcҩO m1!Qd+'lBr" 0}h,E2hǕ?IP%Bvh_:Tj 8~{.?;sIfp%XigpvK47/4QxN* Ńh+PS.UBR"T Iq87v3w_8~VqID?yWv*]b|%~d?r>˟5質~r&tXڨ{%i2 NԼ56heGKzd {Վ˹Vf,wM$yoB vYgO|jNo+n}YTwhEeNYf13+PQ@>KU&T钼,}}-Xj^6rQZF*lh5}27Yo h':$pʃi3,SGH旣kL 7諭OtY39}Psc9(_:5}uPys k iLn%/-T>RwW@J/R+}qU  Gn/!Bݞ7>D"4< !BSui(տ JUK_j]7sE">%<.t#Һ 7iGUW8}Aj/*ݩ[؋()1f"߱滵L>wg?}趔~C?~t*w̩F*s]J?eaԖ>#$H|D4RSG$Y?*ԑ564Xf=W4,a^D6&J󛎥ay.eėF_ z"|i$iWoƗ^DX:0ԉ0:0-PuKZ.iY Fn7oݫPxMpɡ4$5@X𫿒9M'i>.!Ѿ$f ,L堸 x}S?C(Ab/Џ {uN۴Liš6yaz]眝8y!L |%i-$ήۙo4fQB;Oj&n;UkRK z8Q2k߇jee4+ہrx 7}_F)ǰ+D-cZ^FW|L]+ϸzÕ;iE=c(?fD=VkcV2ݰ#'/RhGƉm)k?'MJcm7^:iBs(w)}띬vrz퇝߉72S X8-8d6ᴵUQ{J{A3oh/x|M1 脘<[!Sww?ҟ`{y:ZʰƝ:Zs!}ǏaO|%E2/ BA4Ji5]!w404xd?9=alW34iL{tk:RJ`/-lyIN]|Y郺V|`cZ 8 ]FmWC"|olVrٶxVb.?|nĴKǰᐒ 0=pXw&9mOsή" +QD"`מ,.]kO~)@^{K+@ lf9QI&]K(WK(Ua [9)={&[Os/b.Ă׆*k9.³sExr&I[`/\}w %nV1z.R ;6˷Y7z>{֒hg-9{.;ˮ.{X˳u %^nc u~ǡӹVi/6-5i!bJ/{HgEsʔ`U\v`7]X WAGS){iK2sN}p"7pѓ#""^@zDazUsJdZ1T ZR#3եZk$٥T{wm{-Fw82Z ϚF?CяY}>B|÷P=RvFG]qE#Z%5%ۘR[Xyz6 6q!m.ܿvK~r%K:lpo-D3# 3nTWStJ_lnS=SSt%8kl, 5\xVםr޵)_w)Sá:<,jF4>X)*P0/ZzPPxy =>:+ $!_$dmVz 9zDp6?y)ތnRJiMRj&F]/tdQۥNN8ť;n;a{nTH\-+3sXyf.5%b噹D8%b<\ZYH\.-U,$.t6R"I㔚״Zu:Z8Dj)K oi`ڵɧNQabl4~Kom&6Nm4K3y,\ӑȌ݉k3/YXM"-\}W.FlaRY'cFm2+4f81I eE(ӋJX8\\52v$r!&rEq^<s\$( \| {ҡ@)Cpäafy*?bG(#0/BcWvٱ;`2Z^q?"0慻Cp} ׿𦸾隸.w\=Nv2ג)/6ԒߵnUWUn\K֕kiˏVZ~͕jVH\&+H*\eq4o%g/ٕ% ]86B)o8dw~C_s/&NYc<xGdR+[)ؿ~R <aj7[]=l R+=+ Ȕt!-\rqanǬDui]HF,;;`{&^q84 %Crs܁ ͉ܭ)+xbnƆ2Ty{lKJ,Iś#r Z>s5_uB;^uִ.wguZОjUu(TFZ+t{ogߪ1Ը"v/NK8OG:ax-KTmr~'tVU(v[`R2k. ^@g׾PR(@5"m#Im'?d׉ʺS?kZ#,%@4ٴMMg @8IaʩKs/ vj@żي//'G8RT{י"Qn ]IF!D#̜ {;hl#< 1+qJTbb:3`(`$fYϿْŕ}z܂CwVrld.ɢn`8) /XVf!O<2+i{ ՜|{hGEPm4>țo [u; ovSH_|U\_pvV慧8̓A٫B9bs e͙ď8/T&P^3;QtibbVMzGIƆIyO牍li^(T3v$GyB >g,Y7Lf =}[`h_T3,ڇ^&4Kv3?#ޓbQὠbQ#^X /x`|i{1ȮƸ,>f7&RM-i=wq&Z7Uqq5σm]5gG kb|CӇCtEM>}D.GFOmSqnLoqNX~FU7{W'gݻ&暼jZuGkr\2_1 ތ+͸{ތ9u]|\؉jwK{3r?o^m8`n ֥?;"O~d#G%BG-ꨊ~I'&[Lȥh˻wG[-*Krx)-qv'ݯKR^D`NxE:vp@XhTwݑ 0<.^՚s]mg# =/4|4eX#uv8_*|NeZkQbLEOLůl]DkyYo`F}𹲈EQK L>,0oLѥ[ ~XfnW/!N#؁6 -V8Y6}y!=# gQMu\AT$& rُMy1_=|Z)t!%Zr5^ ɻBNJ ONWi Ę,0xV4;|0#/%|E7 ZI,"eœlzCi˦a1U򘫻ZE^na ̓A}VL$6 9W L6/JHu|,Fi3- O.kpy::UќeMt79x ի3N\i># | ! Kay!{i}HZGusn=&xm>ԏ,$~pޣ$6>|7b2Ȯ [DւopW-Gi_ ."<{kLt8J⮿&H h$%~/muddn>){I d"=kFڶSY^B~U<k:N0*!̝t;,L뭮 pܿжlv&&ޑawmKϥ2;٩/3hIi>~u?rwJ6K%k?84B^]wb -GOs[ڪzfۄF,!|F*ڨ 5n*ˆ77p$ umOC: _qNӴı-%ȥ2@yi8TFZ44NIz?iz~.DmDBce/"_l!-@ޯxā>XƉz؄u{;Xw_# x:O8|}u4([oZ92!\K fxjE]5Jl^'"erV1`CdJf8̈؟lPCZ3Us+p\[W?cEJ~/c=EoxQ_[ ?|ձ`/i_6|ο5ô\Y9ô}EIp~. V(EXOU-ֽjl;Z`wxx, Y S$Yͽku5 d`\ĬªI RCJ66hk?:aEdouXjX"k4`q_"3xsk ^҆{~wjTσi-pVWT(:sa@jW Z_M]~Qv%z@.XsiZPc"Nz5HxZ)T-}B5ݰPi^S2h}s򱠛h#UM_%B-xH>^!5hqSXcHّt+Y%Cͩk8!䑿&(B$\DQCBB6 w7@_ŗ%hF:*=*m&'TI!nG$*~^ԹAu*&M86J\¯4a%k8LRa"PzZ(ìjylu_Ae\A-8<,1/h׉0ib&ՉqMH'.hGA܃-}f{Bƕ+hFFQ`ݭWЈK ZmO#4`oEH^]}P,Ω6J2avM[J6y{M2}[r@ &:lΔ獾=F^{%<_,LEE:6; 6Mo8N% M%^Fcjz*ts}P r/*ჲEØd?VobbMn^+^\EJ\na>0͚lV lY A?+Rh,p\K9Ҩ:ҷ$Mr_Сv))#bWwܶfޥ2f׻wf:GLvˮQ;fN;Qj:ծqj[^Zoj\?miZDbm,p7㐥6KAC~Оw1w(P=gl;82]9!P"ᴍ a=?@kKWi4/:~Q&*QZhGP*7vjsKBiU4ij92&gMyqMWp_ GwgW"M[$7Y*f+Ҵnٛ`2Kn6sLQ <[4^8Ki]`ڻE1=EKq/d6K[i/yGyb_cRXDI,6{Al[Ї uWTNF|7Pb&.E*-[o-Y-WZ0Rx{ٻ%n,MS<]k^vUzG|G5 te,M9G]S^6!*[b;*: S{77A4y\/=,4&~_m3-qY-ճJqqHx?$^inv i˱Ww$bȫ2D\)ΈX4Wh-L}#W-: w6`٥+^:fˠWG2:ONXB?V3iJql"m\*xH6>Aϋ j9bʎZ/.)]31),@ 79.!۴_8-~5Lڏeͫe>>ft赈@(I"? LIUFUUn %ބTncB<z{C >AW~m{u?>}5I>۶&r^E>󷇛9wVJnmoCJ6hK :Zg7Xd_Í-/{(8/IB/?=&}G>pi>pRGT Jϖ0`b]bf}_Z+l/'OdۯTN#a06tfkKKDb $͘/=#݊e}zejoC/qfx0([`{^A?G^>H}_Bl[Xb8 Q~ĬJ3s񣦂NGFNDJ$;y|PA)*gq&L^ pF*蛭(mALl`]h2BޠϏ }wJ endstream endobj 2230 0 obj << /Length 2522 /Filter /FlateDecode >> stream xZKs6WLĩ HdR*;e*;Y[7jșC*$Dzo", ugKU8qLP0v:qç'*3AވY:eS#Es۴m{7<ޞ"Q]dn*aJmD"g4eGo4k4Yl,}Xkq&tjlL#B XKdZy䋌"*YyyʽeCT ` |12/h88q-Em]Z܇<U3XeV=_bƂaN}}NݡܚO8fՏO{c GR4euc?}6{N.9%LqkRƊ(TC8p_ܓ,}sΒVwK$)KUpUپ'5ѣ0s@Hf0;͞Q+jM1/L b($$]=wܞ'ϓϓI$i|0a2=22y}' JxaћI?悒\Ȅ׍&{=oWǏ2|Z.eTNFv8aM E@='BlpH+gSǢE>BKvRJTsa8 P $*'b2!9 5@>@תl cκTq [XT>4)Μ42ppt[n1V!=NR@ .>5A4 _+TjxٚXn(/FӀi,Sa/ p{NS/ΈC;oȕerh)~Zdr38"1)p $)O3C}GəmsY%)2EK*a"ꑔA_tWؚ̼<gXHx- lG[tT|=}a%mt6{,ܧf!0K⡩?R\`;hx~6W[3S(uw `-CHUBOs+vjJ bf'69a[؟iy5-F`B_+ b5k mdfYIZ/]oPֶC$3 <ѴTiy`K{k!mt8dg=0 rέ6+$D즳S0A+֥h|q#S2 ԩa@Ɇ )H ?O- 057L[}r9XU=J)IA&.ҡɬ9` IAծ,_$KR Tt,$k^@j_ckHĬ4K$,; _•L{EL\lC"2CFOLCB)YEѬ;)9VcٗKP?r-FB> stream xڵnV_GOύvMm䁖( E$e[;sfH2c) 93x/W?d)%0ڋ&nW'?HoZ'o?|2>nC)TywZiXWVK t"6o6_\F>wyK.ZCg!hjCO˦8^E*Z{w芺?~4uӂ|_!x=q#23 a&_埥cw;DyJ"ֱX>̩x rա"1}ZQ3Z$"R۫{:LL8N!HX`P8sfZ_9P)t2`:_@Tηb!mYp0E'm"RQ~eX?߁JϧRmA%Rz}&ԙH,C|Fqll -RD)=!I93**XN7%٧M=11C!GhH /g3~Hġu 88K#vC s8#8&~XkD/Tlya$d41O~2AY슎nSG7yu=&XdDXG9 `(2i*_gC\X>o q&vWus\fucLmmJe(2Bj ܓ%m6v'O$dj.8P.),*ߔ-zRF D& Q&ǮM); )r8$GSP_ߵuwK,S-\TP yF!^'ՁRqb%31ۇIl'YWѾ~3$[ݗEW "piz ߯ i­Bk@!"**f*%S|(-(wN\Uʚ#QcwŲ'BdL4Gyd=Uq+F P'ڦCg@DOm֍[PGؾ R." )dt{9_7 *MHON{OP`9Mh*]3ʝj\J.kwUx7AY7頴bS$8K1I~'CsV \ڂt֫5Q+ݿϊKC*Rvpp;8\r1M|!sl_P?EW@g@NCRYB6zCGkeaV z$!~dQRsaboGQ ,#`{ C>@m #⁼\v=p>!bVj6̘13HD&&guuNJ86su FveHQ3'Ar`\5ΕxjE )`8[afvN:M?t$0&5&d>q7?_ aЀOIm퀴ij D֓bW1W ,W5x{YZ@zߖO;gO_&}:'q-BD n1%( q1/HyUBo5 $-'lt͆7u5>b#'^٤?= ((/]F]F/Qg`8Mǡz]@8}2Euwx$[lwEu#~8l@CÆ ݾ~ț0hۓt:hgr* zSy76-}v761! .ݳΧT=-e&m)2y_ӖqD݈P3y3 ܀_0Jl- -}8 0"?Sl< /ě*m0F'ن] /7rcB\p)$3E:?p@}̲YεEb>#Bۡ{p+HT qAZ* Hxԉ29 x o85CjUjSz,9|Op7H_REм 1=d|V9V jOŞ C7)8[&}]"Om0{'ç/ D۟~y> stream xXKoFW9Q)|H['M$M"ZZ[,HQ!)eZ":r43ǙmWgDF $4D)R%e"-˘P:b8ݗ"ER(Pc~)"Nx [yuË$F{,oaLLD{ֺΫE>?)y#NHpϱqa=C /WKj|_7g&)3yɋE3r!l寋l=&qFA4e!$єp;|)McヽG`K,a[laMuA'.'Sݸk47YO8*y ?aWy-"܇ ][:݋9 PƐd]tRz B Xj:sn6E9@H\(((RȅTv nnexTA1輂DC&Z $ Q3Unt}Ahyv|M7)ڸ7޶!NUzhZӍ}'l<+:+v3RRLaX=9d8"K8bJaHHrq֊[CEq^`P%TDJq )GMp>_ƀ3š(-IӐ .J zۙoч Sa}+#(P9̧E"|3I-je^nb vW")I{T?ZM^7ot[Cu@&s 汄 =7&p}yD@"(jOm@17*䥿[lJu4עH3-iԬ͡Ir]mVeaQCG.Cvl1$ FU%P|tנ@MG [= ;(?۴P.=p5֍oL{]}#z,EQA <@5-W}= o'R#;bHPotSCl,Y\oV ?t_V-tDnt2wqMukARhhnPc@{c)]H6A od Ev,.Tms0omD6${Jo>6_$1$armz6EF(G@{{udМ$4'<.˨XǘKv`#ga4Mh\ApՐ{4ppՁڋiH:l]h> stream x+2T0B˥kfP  endstream endobj 2240 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square-0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2255 0 R /BBox [0 0 410 410] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2256 0 R >>>> /Length 227 /Filter /FlateDecode >> stream xSK s\K> stream x+2T0B˥kfP endstream endobj 2242 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2258 0 R /BBox [0 0 410 410] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2259 0 R >>>> /Length 9124 /Filter /FlateDecode >> stream x];M0UGgOR3]ehj_5j8gi];|1v㳻ފݪz.Ԛ1}y ,]9gۤZ[HP9U1K</=ʭp{[ }'O']fv4;t?9=۫Q AyѲZu4R۾že6sOЍZܻ9./Oy-'7 {]_H#NW>b K^'5 9V (Chјy>$!0ä^߿H[?i/053w=~Nˁ>WGz1Y^KݑbwyFGǮmo!phg8SS2No= |5ynb>H8ٹ Oꞔiu/qEER \G}lg5P>گZ8/zcB#+㔾Oz0(u*)O)_9mhOe*;%>N;RmbcZ'eĶHC4We˱UzPIQoS ]zNn073P'9pB 5J~GgYP+kF9$(I=T"l{K UH꺬gP;=orOl^ (-!aTT9 .Ј$#b%Όp 5:a,/fX7'@^WT9_t!@]3"OX-V;܀>Щȷ?i)Q hjw=jʲl{01J5A3=:zM꺱}VYß7|v/,jƧS (3PC P.1ﹿneޡ?q(r{>$8{{A6=ajf;23n>5U^:=ԖScwV% Gc@WjV  Mv&mMM[fw6A@w>G*"X_(+:MG ꬛赻7=bG˦n{AGei&z#jp͍4Q+8-iu5b㐕>E;t~ w{eM. #X͇I`# ?Ju@|#iG={$䣩]g3s k{2=Y=,knΚRd`zvN3Kj4ϡtTEٴz!j8H(pF,r`݋J5jm]x|B|mtÞ (3P+>~2/}Pܫ72flv-^glU ڪt?)LrI欇0=uS5tVA7&m>Ad?xKL }nO27%TQ%gZֻygw#6߈]"r m[+[Ld{o]v%dk YV.Hڙ'eӫȼ}~kK6 vd;kwMABiޓ<5JeЛ$5FTI|XM2{{6Plq APʇq}M}ICsVit]/L*;*(5+hIޮs}iU%Ęs(3Pvk *{u&lT7_^7 OjF>e~m t Y{8t~* dH)cȅ3] ($< Bп Oj-Ya'IniCu_2i4,`}MHxekU*D+tr{_zGwGj>˥E բmj p͗:jP~W`:(K/v)(.KqFwUPo__}Eoߧ@{v][JűoTE}:Ċ /ҏj/}2VE eo~py}YS'oGءEѽnw$Buw^U{/ح/۰}|7T-rC\uЃoO>xzF:VĆޔ~e;6!~{^@=+@gIK[Mql'09-<6(m ٶpQ AT< {} \cyq6&Q:og6M~HOGy*PHy}7|7)Nvh&#;I(|C}>A^{.A_ =+9ռE#9[aZ^w传wam@L`wZ\pu4 oyR*mlܼQglv^G&㾵PTͭ(شMx]pua,dGj۷{X*&͑—)_Iv gdgYh't~KU5ow\NP,"L6e]?m>Rlv̶lws;t7/I}l-837>:jok}3~]:t~fk?Sn@Fm;a/D@5[/79 |z5C)5nI-[Pol|;spyCCۓbMkHjyS K}W.O ZUbGsdL*F@?썟 C{CjZOF'3tKI\ńtzXth\,/gv(W?Bz::%]VzJ :ޜ }_qʫ[_gv1W>Jy,6={x~s[X6qzhg=kxkyI{Qx zQQ6om:[; JCr@@k4s>L$~'r&GQHёG( ɬ@:Y[ć? Peerf,"fUU)b9@zz=U`<&t&ߖfhD,d*P qӫJo U{GJ b  uNU3O\5tgRZz _uIGT~}\Dg5xϘ\@ DʓuS.]oh9VN܉֡EGxZ*e/ABUV2XQUk!ZZ9}ӫE"WEv©+&Rs %=n蚛M$h|lP sJrE%еJnFlEӧ?FlnvL`\㺵Kkh:ZF~?2y/N)o9Dh:J={daT.MX9Wk:h}ZݣsDEFsIҧC= bEw)&j/Jb5|]y*+Wq1q5^h\ YdjgP!TIIR9TAtݐ24$t%7aVMɤ 1,.QLZKO i}Gf5'/jV㸊 5Z]%=1~_"kq(|ZUIk4X)ԫ7iKV$O֩tTWXVeu\`*z_oIJ`QGz}]V1uE -p[)ceIUPJjuմjuSg{W>kE'4i? RfHg8i"pKP0)j Ht罤!1,R lvz-Cn 8YJ -[BJg&uX%Dj$K)H!8~ bUgkD/\2hd;$~.>eL&{IM!5Ec͇Agcu ,#cgR7Qtu2N;}Yߡ:Q7)D钐,"^:7Ɍv}gr'+8|@i=Y֠\:oR7"]Sw6waGUigD:ɹQ=4>+OB-٠lDjNc'G49#zN|, /W%tޝU?rV8{>,V|Fj$UNt)Y?/~VzEk%u$5'yF)%˺2surR).}:\wZy>QKW^ͻL /t'O ӧrI^R.ٗG-% zc]Rz]~JBj퀅p%]M<[ JmTkQ7m!?ۉ퐅yhtt+yw&u0H푲%Hj:'PFY|R޷/@߸2JZ'bԩ#Hs K'i$!,Tǽry#߮Q|8K?E2NC5&cgʙTUԒf}^FKZ֩L[tV+dLI>L/2_=[u]@φDQJs3ljSdfU S/5*_IŌN.OH[ ng{Ez]z^)x#3N40239o`XI__5 j)VyjyͽV!"'sĎ(|B|C&UmSU@1- b~q : qO HtƗJ:CSh 곝Hc|(H~; Խ_C[~|]ɯ$.>rt.Ü.R2/o|y/a=v%~ &.5(ˆJk#D}:ȭˋC *1p0_}- 8gMbCtIb|6X`o,)M> .6>է>q썛Os5R?D]?;5!s3;[OhEsSHE9a$Z䷑NH+1ZizH߀+|'EЧwF0ᾢOipӹ~|BP?s$ҩ݈9-K#1yϿ 1eõء4о"IVJ${w>)>'GSl@y☟N@r :M.5~A'9SvË$6;XMhK-|&eO%lmUR0nE--Pl٫Hj#Euzv5{)#{l@)w` :S!T(6 B[JB,KG:y̯y$3anu&1?jOH@ّ-{BeTi&&0Kd|(/QF4}_NwM^r%^oXw^ $dٗ/Xۛk*[=,KWGٷ{v}@Ch#PKߋ@Țt߫ N_\f`d޹ ]F6K }Gu:ч.!MJbfx3A 2P>_`^eږAoV~}oo>HQ1$+y,'sN+1}zyf_oDsJ7miC}~Snݷ,^:jhNsZc)ljtev\Qruk N:#}AZ<澿V~L_M>zUލnQQ{wsǶ#9>:M|*+J)2>ӹufy =4ꨣ~CYGɣӬ3̴iSymK]={;.oڳ|k޻$>8(A?N\{kF}¥Tɽ]?6Lshw .Z2g z:Đ-,8e51%dݒWq;A㇣>nG=LW;;EIne {۾ *H@Vfm<C`S.}5Z%˱1I{*ӱ<-c3%Hh!fx ]_|.dyjG]r d2Z +'{XJŸsų΄.XYG:0ڳUL8ދO#Iet]?V *LۘHyh 94aiI_h5ޛ誥Rla4JP^bI$Ps|ա +c'''ɧ켨'n|!L]ԋClUY 2lp[[Ğ]_X{]ۛ`>pڸ- yZUb'C 6ݵ6w#\ƪ0":yȘ&i8+|4i.oi}~COG=E'V*U֡ZWVvu(8ms]뚚\Zg̒_C@ǂxa,&g#_fy q:E֞=f7i4۳=}E&"gIё;f#Ev#,ᶥ2 R?Pt~$9]B~ُԮ^’3_gBW{sW)Z#-^ zeRe0&-;bz[!:ۮءwu+`amZ.Q1rn^tW{ԢNF{"YA\1JH.E#1BTApDQ%RsPQ##^rK1U,@ڮL''~u/{h7co,/liɹ.z>ɕӄY_C6Ik{dI@eX#N@K@;hnmv~7gKi=;G>>*>>HghQ h h'#E&k:;;_0nŨyt˃at)r¨֮ ޠ^7t|j#Fo3e?:Rjrax;jyN ݶyrZ9cԻ9z}>G#gԖ::v`+-9-_FkXJ?H-e4F z A;hO)U}d'pb'˿,Ep.! K?)#Zql"^(B;k#p"*R C=,gy߿zGe{XOe!(Y{BP U /&`PDI4~B}:bEa` a_c endstream endobj 2245 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 409.999 409.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2260 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP endstream endobj 2244 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2261 0 R /BBox [0 0 410 410] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2262 0 R >>>> /Length 28904 /Filter /FlateDecode >> stream xK88U l) <{ =9職 Ρt|TT 7Awo7??ܶqO><}n$^8f$!/1%j%x%8?IWw>sRQWYӀwj/`P3%W^d%F8 5~k %Ǚ8 ZIA?WX5^V+A>ZrZIzВO_qH_=?fIB /sN˦˂Ro^Q/߳_9nf_y Iw"&cC?~jf߆ BuYL=>ۇJDR ")^5IY>5e@1Z}hO12h_.zS-3'iD7xf=1c x@/Gc * T1,F с9b'Esss ~ZceOܚνRs Q)3Eg,-1%x_i5n@ >zX ?t;†)WbxHK~/)A>fTIB ;<{!NBK>_m.o=rd'tcNW})JH-}n$x||># 6&X*~>,*> jߩK+W*M4#^sǨGJL< 5%?!O_Ih>Wj^Y Y_fjs';v'5P3qfCԎ㱏%j J\$r8`eMuPvϹв>rTi>L'U Wꪀy?oJ0j!\|45!K/-$~ؿ|d|̂8B_ښKs.%.Ϲ 2=h_#Ǜ;Slut/lCа N@+}!+Mp<Qа]eTQ[QlQϾ.|ZJ%G x}\ۖ ^ЯS0&ek%OB {}δPi>m7*A>vCjZq]2 Ժ5O#L&vvot?Wر}q <ߜjK~|V]q@ĿXhj]ܴg}bǢw`Bo\~`@6` ؎$(h?ǶK6Kjb7ulOt;J_A\O?dogxI񎒀ϭ%ǘ%m֞qBKnѩHe}}G&%mۯ [5Sb󉸌VsaɮGm.kjO=c&s}KC@0?'=j?iXqx%GS+c a'5= Y jߩ9;$X0<h:52}c Lg0T>Va@Ci%Jv 7$ /9_pKpb,(gӑP+5& '҂~/9` wj[ۛ;~Ъ KBj}6|5G4UmUP?n!NB6`>~ڍ$R@;Ss OeB΄.sm=2{yRfqм^53OZR@ٞw`}O^k;TB1>PJk:>?Բi>W:q6+lh8Ɠ߿q+c>:D[ ͤ1Q5M{GZg.櫘#G<6 {P 4c0bD:vbzO@H$|3tmSbl};cܥ$TP[ g gP?-ZH9 _Σ_ gq5ryy>6ϴk uQ'cKpF9u:EiY$UHf0ފDLރϡ`Ω9G _5<1HBEô^ӹ @e%'g}B9}:x@ :9Bo $͇Q&ۀ}C K~7;HpIF}4I \|45nS=,kшe,$Z*!>>O@G)[t@K>ߥ~M٦o%[ 7|ɞ w&qoMqFwf+[j;oB )+kfUB?NA{kc6FMs|@+T/߁ߒZt}3h!l hDFNw$7.CgVS/^P^M`Md;V 5jC5[_Њ 7e,HQMK}og]Oi7R}P{oqwaK16nt7.d|B͜x-#N, PՎG)t(Dٞ7%G:Ncnܫi># $鱩1-"FZc5En<" ky?j?|%O쟽Bi>hjqiv;% ZIs5ݧO#1]FT|<+. jzB|aAK>LhdMYjU?ۚQ t}Κǽ$~_1J5װv$m=bhw@+N'F}/Fos|GhDMM@':~_Pc|Wߕ@:D֝7ugSb}#s?CwQ/-}K7l;ޫu\OԋsN$9ӼVW~PY':Xm_lڎ\NM6*n@!jnQ)DW^.뢚'^=!Z;[BNi? @':Оj+ /ġKG.QWJ\GMjPJ πNZ%RZfu%R)ma20>]UN 3/9AS㜌ua؆!1zck@jr4u| B82cA~q%7M|{h-0Q>GrI쎁X:@4pJۅu#LjEjMV{C. %)a=PR]kb@t(nj>ILYh++yq*#O=Kfww᯦㉖>O'ɳ;QVVAsAsS|4I>gtfpHE9g:btZIB@`$gg<Ov㶦;IMM':خGf h}DMy ZE&}^ YTE%SD M-l5|meb=6q?#Z)2' վ{@Wl0=MTvS~vH/qq.o:I=NhMXօXh6ə6Nfy|e8 /߁~z@+ԉ_IW+ڣ"r}w@ +wL΀-5V 5֞\ZBЎֻXеza+Ty߁C5N@45C:PLK,.ہHB)HC uP2>nI^# >w[)˸X[κ&ӑ6iPzN]vVu)bsђv|okjZ%UR5%9!z!ɺD]S[95@Oy$&d,Du ʛqŕwt"3G H+:DWQ֭[&C59VI"GFy ؒNmy>ѿ.e)CTDvvv>SܓE5I<1yo}PU?}'B:;XK'gn*BOѡH9S}>G چ2hf'C/& տۆ5;S) տÝu4Y%XeWw}^q#_=V;Y]/aNt܉,#'.?lt>^}q\M@KCt,%t7M=}yqoCKu6u1UQ6>|9cw2 `E o6f^݋=}U(4˨U%pD񂌚͆F*xn4娒.|>ݭ6Im% Xjl]SnQj'BBe DS37&tcGԑAGN_zN΢4>QH|HjYVٷZKբ 5P۩vm[98*BMVHZM (>-_lBBVaV؄_z[=vNaКQq ,F*Z?>kw5#V/zT|V-Uk{.UOϬRtzsNаW/袕Qj]Sn֒)iX)%Kwa;N@ v9jr =AI~~Xԉ%)hڭ\!j=2?5ކUF,2F>}=3#;< *MYq. j<hP Ԧy `ߡ]ZQE1,սZՙu/r,Vڏ=zzƨE># =#Pjm +]WL;}0Os9s1PvEtaHjzqnbاrtS-5 %XؽRp} Ƹ^|r.$|up ;ʍ, Q^TxH+ 񯶋45@6{3]Bl~'΂OwRvW >D%’Z,8mQwqL%G^JSSGO0s-$5% ˼$ѲeZ6͇jJ[w=wwz _;:vE+b'4fci/ĿP8>]gAmO[yZ*RkX'+[ ]rx\~[HMJmr}HjYSMǁj4Uߴ?daI]V\q]i zu{M:ˑ{Z?eD[{QâսCmX=uEL~1i+]GZSvnUlh[ R¼.leN3v-YoIdz'W|JՓgS>QHjORt h75}E(t}>Ifܢ xrͺQ}5S®Zb)y0˿WcK.>[j_%,}{`Q -{;^P.A>Yc4wMI|+ٝOGV{/^bc]lܢOh'c =ڽaPKXgOKLÎRPN:3f: o?HXg91vl lOPݞ1 =ߕǼ3ĉ@AEr ,l rH4=3 pf̳0m=Bhحˑ`tAIޢYȞ֡c7{R s?ۚ{:jK1F j=Ga j) Mk(JZ֯>S?%S y+=KPHYlucPqsxE6˂_bʹgtz1e,朮Q*Y`Nmc[uBױ}R;#M|q^<]M`LT@Tu}|q \ G/2qn'g=܉/d|x'Nz3-O_=G|[˼P1z->Pj}emtyB|;-A6`}%>Oܮ0Pu'>EQi#3䇟glkBK>:J<>g5/jW >G\P κ=|Gp?z}z>а J,Y] jo%xөFVޔs}=-%$n8 ]Pp@O{4P mpδE/$>~,O"{ j[}-]S|<0vBC[&>]ΰj?Ι"/.AVbV'N<jK<> -kjYvIh͇j8@Q%*=Fy$ipH>E>:Z6͇o>+${3X_^=B Q; P[yx\$wA@ /mm #l -Gx6GYEe`Ԗt$8^ȶz{gnNjѱc;J M+ ݧ|K|Y$5JEf\a+:mP[5 @͇ڐ [H4dEKwq玭hgߟx%I@ޣd`$wt}{P B獠xctq/T?gA26s =W7)o13r7{s@/ȶַY^⳺iGŇQtS/ ~(1Rjq\ 5C,neH?/I¦/Kc/kIFHj ?AX㞣q }5ڿCUm@*C͕x/ ?+OqA cù1C D;xetzoQ -әƏqo.G~oUzѹPm*A>Zw4ĿqO@tiYf7׹.(Zlâgna+k|ah" e0 ~1mc}3e${A&O'6 ?y'mpgu=r!ABr=n\[4G'#ok٦وBXSeű?>x_j/IYP8b^re]vu"%Z[.S2-n. 5\xŠG( T|-J+Z=cg1tN?tnǨDȧpC -SڔZj,^YTSz;C6@[gҒ'}-e[i:"xZԸ>dqUFSVREb@&߹}h#AdBVQ9j_#GM%F#$b|ZXh׆wGf/=e7ٞ  N>B[{HPPy w>ZQ |ı{`+ ZI{в H?GE-,jIYtA%G۩á } (g<))'{XHԢtin@JՄ3Ÿ7JZaj}B+FqP|/!ϓ>GѾ/cJ Z*>:~uj:>]ɇϒ<|AG9gqf~,i@m> 5?J.dq=/~cm >nd.8>ۅ':JO=\P.W;]WzC ji>,Zn ,gz;8${x58_-~f2v4s }_ޑOB˚N ʒw [S 宨%RS-ۂ3Do*BBmD 5 ֆKpޖԴԉᣳ.,RȨ ]ӅlnQ҉~ZiH{{ H`%KFaGJP72X_ə6^O|Jf6$î$VJ3J`jnťvW휨sBW@_W1q>jX.oĹJn~ ځV4|Nfq|N&gdN$Ou unے# ,e~~1)ϸX_J5~h^z2{zrU By|gA f`&}3o+}?+SP]NK^^M ؾΘn=OϿ9j@+Tgn=z,F]?:~[&Bڴ;ݧhGAV j[xS|lxl5w[/pQ:j2ZBVbۿM;sȓ@+ԹWO{@<~e ܏]ȯ!~QaX<> g\|3;+:d7] 4Dއ|I`[D$0wuȟ1_fSBvo4Z$ Ps( 4+4)Q@نͼd--Ʈ34Ǡp6%訽 taNĵ5)&>!s ӞSa^+Amti{riCdx~HG 5鼇m1;lXOH`+c':/s{=/RHXs 3@d\WPs-cX1gMye"U+h{,uRh-,H2wD GIh<9*{@soc̍9Wjp S4,F↱=^2)4¿Pc]OajdYq, Y eI@ /z#%|O歹G}cgj_}@G}oя *A>Zϳd:9E6q@\OwQu V jnZ/e|hް-/jΝMIG!l|nʜ~Kg T@m~ec)S Q/ xY:qEs'kU "'v9mI$7|K, >\S] smoL1fL]ВO7ý$E^o=$X%gzK-B}_2{zF1C}_Ro85Xy0[e)fj6wpj˷sҚF FXi} ^hH%ȇ냭uC(/5L:g6祦K7{Mڹgб]KO%,╅N=Ml w= }6}pocijv^ o64e:nK❇6?Zsy3,}e[>X}CeA:ޔ ~Q;ʸU_{N?w06r_PKTtnk\BS w=F̮Cv'e/r!YRr;ve5貳sٹOaފwxz'|2`A r$ M8+_StGY3տ.}/ޤ]ZQt@:,&(j~A'nYxiy~pv))>v`Wk6{*l(Suvދ.M;N텓-:_OO{Hջ̎'-;ƁZt;{\Q~K>JBjYy+$F^R_Si/C|l%Ö#-OM ُ/̮j%ә{E}@GwJX]x$>OOɇGS6aI,e,+UD!S1.Q{!T,f0L)3G<xbSnxj{OP`A&i?|':xj>ܞhjӹ j@:~]Wte%-5kqŕ"'N3xv-Kj}jBK>L qtMR:?LKBA | d$W!j+|CMWP0H[}C»: yEə+ ϩ,I%䀹Ma5iUukb6Fzzͧݰ8%[z[%#Fk'qUhQ=w àq炔Q˚j_s)2 5 UoBmzo޻nOA1}O:yCܸOt&*&  ꖧ7|vË6pz;||O@P7%xү{{Yowy%o| .'nMEH7F(3%CЧ3% GԗnQUq(oynvƳhj7 Fpj"O_|l1O;"oOTQ)F%=uK^aҟx3junREYxD8c|cxC ndc˛`q˅{>/߁>vHԉN?O}"֪Y[xmb#H$Ou>uA$0yQs`y!pÜU{O[:UtzNkd00Lt"{ Y:e]fR `xwW|xώTx)H*P R/nH^5]nt[@\ Fl[DMV}A!)oXz=q@+!T*n}Lj[|q*V 5h4]`򝲂{vO+S F@IǷ݀ 5/oo/(=ůrӛ+ʫ/^-W|?E¯[5)g"ū/qd\s*ЊOv Қ Uk v;{Ŀ,=$5~=eկX뷄K՗xC냭^+|=ߪAHY6IsςRyڅ)iHڍF }I@z 7MM  ŻZ4i WoGUy?jNz8^%޲ ||Z}ЭX1(8)Z?],I~/}hj%xo&\XP?U'0qO-;5ǩ+qO6xԞ[΂wjߕ M-#Vm蟄.l9H;Dl9[# m$(͢l+>[3xduB >e3{t=Dܨ(d|jKj(md);ΙvB6'/m;Ay+X¿ԇKgHA#?%ۂSv]k96(]lfǭTNtq*XP>v`$/<`{Q'T5|n绸wFoLl KmХ.4o I|?GSKKoS Ȥv9z.رP 5Hݲ j zA**A>> ]4֠~,N~8U?e+ +MۉhjsAk>dy[4gj:Mz< 5䳨I~5V3ޗ.g1Kʹw?P?LKi6}귀zw]qh@ߞ,~}탕UUOB^K7W>;cjɥZ59xhˁW z-Y&u^OkQXBעhWal.|;MtPGj[|pbR+N:{o_V;~ףa*K@>԰Z_/!)[7#dHo l7,Ѳ%)._g7(!oTL_9<7+hC7^ĽG([K]Sum@ ^5j0 ߓWQ}|wh:A z%ar@>^d# >ߩ#NnX+@c7b'/6nkm Qm[jg' 5Yr.ksZ,`!D)+i@b=v=b'?mGF0,dTjZ%Х Pk-%>ߴ&׽ͦ 7؞ 58Gf>?yG?)>i-5XW mYeEu[ֵ{ݤ A˶)Bv[.V3Ql]o8x<ⳢFcm: meV| 2)pi4iX 6X5jQ^P#LZ¤wjTrViV{?M{fH(d+>5/?, {٧q}PPZeƾKL~DZr!v*> ɉ,eݶX8MI{N%gA-BA{g_, hcT7M2kibAcg&ӄ.\悫ͽ?=bq VZA {-ZB|$V@YPǴ]h;_0LcYcZwX]^ :̷R޹1;s/:蘾lnnBV5~D8~da|?5X6p7 h1_ \we_`B*y$}#;W`M(Ql˾gؗVͤ*Gc&ҿa@+7ߋ9TcLLD̞ ,V=a^: V {/ء5~(R&"PƊ쩻Ey8( ,A>FQDŽ:ׂ$%y|GԢ 5%|]hKmvJJIKm|KP?fG? >= j?˦Bj G"k%z.и;{O{d-( {A ;5[z7o yo yN;J?.V#J훳i:,=XhRԶ6?g.Qy% 'V]Z3nwD ԙr%`A6IǶ Vy^}c& 52.A>ZNt֙ jQٺ\1ۀF;ڜڶ|;ZJжPm$1B6)ڶʆ@_h;v~fܾW@7O#Y%o 9It5-0ڴm,h4y'0Ckuԁ<*PKXr5yHKW,5@vZ*+:d'IrB{kI[dlI}qXЅ?h$[o#JC%Ybٸx6U0`4=#M C+EB6^hپzǨmYHUIV(GvLδq`t~;0̞D %+}YiۼPNM#j\5䣩JU&%^OS{ 3!W&-5'h1.B?l18?4bBQxaIRͣ G5 ?B6#N ZX~QSR)ͦƸ>/8(5ʦkkj#КՔ^ϴs~=QӄF&_ ] /J>)ʯ[,ԇ_^Z^xԦWa=KMoQ{_; `jk|O˷x./} ^&} =e[zMz[C/M׎h٧BzOonz?8-FL-8mam3fwZwC'޾O6*#P?1^@yM{P': 3%x=U;/+cnT;{|_#e y%Fr5~_uj7{ƾ!wߧ%K~׷[uOƕjU_@_E; yAǧjޑO]lODXEoOt- 5oћBb>o~2v ^BcxDlYA rf?*@6d6Z!jTB+&\lG.@6jޯ?4_$u7###w/FNJ6=P^bZKU}lXwyŗǜ nzwztjΰB7I:TcJ)4Wa-3%K8}11&ݱäS@J]th|Ҫr|17P{F¥z^\L勒~NR_@R͋UE &Щڍ^/޼J|'jS]ɣ|""{)WfwmBsE` ͇yYZѲ%`~!EHK(Y1 N6"KKsl+:%GSKK/im=_KN 4ިz[F{{!cǣ0gLȰgdAB 𽄲@n NmUMXP,q2em7V jL3<!?JxAST dj k]_S:QX˄czN^MǎLyКDJzDeIh0DŽNBsTG+-:PֱmMpϸ@+>L;sƨM@IT_K"Vev:UNZN|;'H~g Tɣ'.K;ʹXQ_>>mVSu}rί]kz(rnXVhf=M3ye-wjΉn) &q:~rQP}}< ɽw v ><+/ףG{t̏dt>n.۪ț MXH$4 8/~cAM˦$~vlᆟK; *H򽧂.p}6xm]вE"T|txVĄ|G핓Qaj=DnREN}pk$';OWpyz>/Ih)txQg/JBLOhɇyf_|l9%3Qs+A>Z|<\muu_揮g#*=ZZy_;4w.Bq9ʕ6z$,[o\9)h=#~P[=9g֐@+ԙ>}'9vG䜋wt.FpT433d&!G h|JTt(Cf>{Li>呦؁vHYԯ8Bߙ!}a14VOtj< _絚G>e"1PDžCX_pk~22 a22/ b|YI|A\2)S/g>UH-c+;.ɯL AZUr@eJ*a2J<,Nb=]2V;)}jäV^EVĊڇ~#<(?f6W+~;_2O_2씿Ye{0qdy @+ylʟgZ5~ěhX~*Gwܡ 2 BMkd @[ڀs>RA ORo >ѻ>z<bT-t-)NjK'@ k?n$0+e̙2yVol~^z/TG:Bt[Ωnrj[<[bZ8#;=:!JJ#]5!w4Zc&} Q e D٢K2DwHj3'h#~(o魭+l!ͩ (c6r N}.mU-{h*?A@y<7gQ-t_Aҿ}aeZ_]qP i >d3A>7?S"+|N)y I)"4Qکr5ϷoR?[<*A>{^2^"6n 3=v_;/'{}uڪߩc5Z~ Gҏ[{mC/F&FL닗e[pUȿO7d)m'{PzJs/Z}o6=y\[gMN.K :5# nl& >|zMzx(DӫŇKZk7QjzYw!3K.L0n(_=H|f+4RNOV@m]_$X8V C)Sm&nQj7zIdVsd:©nk)JQ {L|H#Y& ov:ߌ6䣩Qһ>" hɇ^3"u\xɗ?#Nrΰv\<8vwO'P;tԉ-WGB'WQ K}*AD)pW2Q^j 5,(U"O \!_ZvsF-L GѲqoE|)[@K>?pZlaO_s+gxt_T|"{-μ?Х>:\%8Ih)u_p|[Yj#^tke$e-ۀQGT<Ծxߣ'\{uIR/Z{g_{xafCΓYuAΓ :!qF<ՙhKPvM+r_$ ]S-}`MχVyAms )[ u։ IlR'.cTх%joF8mt[DS7|'>huJ wɪA{65% gۚzhI $05<ӵPoV$Kl3謑^H#љ<ǁgU/=o4v\:GT1k%#j=1mڜ.-:˔a)lO{ 3L,2f؝<]cvȠ.|!}u3iZ1x!5Cu>qSJO%4Rҙ'a rD:ݕϗ^Бg (V[d8ي9b8 #1zɜD'f\A蹽#>E<뵥zRх:R|DWDThX֍{5}GQvxÔc[(oh|Kvh Έ|I~8V3ho2ݨ}Τ8pW^9W#qQeӫF$Rif·*A>(Aj:xL(ZNS6םo!>3o8E<|bX,u-2|a} $)g==Jj?xRLz$}%o uQС)YA"P&T&+mI 5VsEҧ $ VEX76:7|| gsB$+P'+u@ ѯtب[V, SÉv-AVbw IEVAwYྷl)Qq7)37dV)37ĵ*8>w-Qx7k8Tx78>7'X=<2.ɋR܏n%l Ǖ?x~yPWrz)wE@^ԋ)`>>_/h/[ff}BNz S8S5(r" Wq_w\b )87ļl]w_tÁ6ˢP2>ѩ_յbg2t1P-cBm~{τƩ-OZ" }ZG05|BSƯLVRoZ[A|вBM{4F'G> Pګ05:]R6> #ʓ}'xE5LV 2 ҷ\\|l k4ZR:~RE8ΒEuxQo֑5es$&VT/²6 QVњَ-êx90Vݪ{zղҦRtu}E?w`A"DbRL}e^dmKU(z ,35xW&xWM=5/v.Cw;8JDNlp}}|e߈I~~4 gZ[og=2^VjȌHVaǭok8n1cIvÝ+6,&h,nUï{l/Ƿ%4;" _oX!hp'=J<EF֧7KUx#~3ku:J|֕ qlX 6~ĸJ#m%#/tkQXV,N)]Xl1VhV=X܎Qvqx?{~3=0`~ sf]+ A_ z|8ֵhX,23Yj=n➂w e0sϪ[n)t||e-BΕ56Z~ μтB]^-^}-s둃߳no5spXǣmَ3vV[Q,oÂq7M`ï@ҜGJ]/3Yz`13}d@LfkjllK%Z$/} BnuQt)d`.BiCh pk?ǎ3?fӼϷ6H{%&9s Kd %F{ѻ[e4*3G%ӵd=v65Gvռs5`"7J^78;-inKhs4o_`H˷@+&6=$&}"uϕ.j$tnm|`iPK4VaSwwF4h[B ƴⷲpL{ zV^krP} \Q04ki˟~rmm{-6߲͌w'VzЪqi=(lDzJ}+z(X4^-2c$`sn7hwS`-1V+"`0"iBF {ޒD fE{,}ݐy32[?š߃h)nv"vP7Op7"e3&cP}zCzaLpbn%V<s 8Xbim? _U'q,#I.v|<*I]ݯZNm7bN`ƢO,7&?) >ُ\J|, xa n_;D8$ +@AK&%V$jE ra];ᙋ@(G˦u|ʑbVӚ]v|-3`$(uݲM E+,zQ=[[qZ j~%iD泱yeaoܾǦiŦ2'BA\U]l$t7޳٧:l?[Mv%܍ hE6.8(wX -07􂿶l~K|B /O:yxV.|qKF`}]X)}SE$IuOEC j|YO_Ǝ[^=F圛fD=48vx#G"i$]D\q@J7ɇ5jmz\etYKhUFϤ+b5#{w,ev6yDhoޮ/&WVe9L 4MFCR@KE f|<"ĥm&/'|%!=wΏ v@]yC=Z"yN,I‡J0g |f>9ՙEg#}AO|JE2(t!2AEJ` `U䉔}x"U}5`vP?>xڥ]<_?ĔgDvt0hڕ| @"y "(P;\@_D Qi !i Ϻ%)P3v(:T3W̗킑=iD`aEVZ"1{їk4A (IEfA:FWt5!m='":IDPyP<8Dqr(%)FaVW7u?YBahH*D+\ >XNH W$wjЪH􏘿r}V*HbL"~F{@anGr L$\1-劍+3=_n"]ddƒG6:z>7Ti}]=YbH>}{@3'饘|+Lgrs7Zg!x1=X%t1]Xute,OV%dmא62Vxي`9B1/{+(@,d&r`V?vՕ9]\o%*S侍P>YV Zn~Pj=QoS 0LƓ'^DV-vuh 5NC22co}P#tnnnM@s9گtn"xXKx?LPx濐9>N{ߠKGpw|p:~+ `A=z_o{nY;~[oo%Lߎߖ P(9~;w?}Ws7y<@><ƒ\PovZfO(JMK|ؐϱ# 1 ۋZ-TP)yAQ">/6)1$Еs~O+@W={]Yow% ]%{pe]% ]% ^% %^% E^%%>J> stream xX[o6~ϯ2{^D]݆ c/Y[ؒK۠9$%Kjm֥0`R;ֽEWg?M._2Y@JnM-/ 5[#I<2=nuNj_Ư>͑0[qTgԜd5}"|53qP**bI 4j}ެh쟕1Z\1=[̌K61<1!]T$3̲-j38 8LSlIfv`ĭ{٧< *lAzו5atW m9c,="|b& .GqWIU₳(_Ņ^OR=J#QWt#u%|Jhq'tS#eDGl}8pEњW>pr ٟ5SU7N!NB(!B =8}6 W 0HQWM]w  T>\&#Y0ClC$Op(e_%祚/ FrOOa 0L::}ACm,T9OwcP-V[wd;=G Φ*n!\uvӀ?kt>2`o՛]V 8Yl4Qxg4P}2% 2e6*8/[5Dw%? D9C4LeH'*6# Bm7 vp)Rj#ŇHF/Puw5)Uu$y> %W5b rY-O,i֔Ӂ<یwE / x9~rc)nNnf|Z=JBnA$ wW8wݸxަDb^<(r\ prs7_/F: |od% endstream endobj 2264 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2279 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP" endstream endobj 2263 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/trunc0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2280 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2281 0 R >>>> /Length 798 /Filter /FlateDecode >> stream xW1 } `3x}!6;E^\?[!ė^K^S˷mfK.e\rޛd朅%kLn$Z( }b)~{xH>QލT"ɬ #a;0\ шdBo2a43YFd>t$fh7(p>aXL!+4A&3F#>5n-מϾK]u vҕ~s55wu0?]UVw [W⡣$+?lac7$+?l;CGIV~rp//$'Z*'[%B Y{OJ@ۈr c!?72βn[Rc 6|<إ$H4Uw %"'Guaqn"@{R_*?vvR$7q_Y2]9RNuHNb;# D;ǿ_{z,iIwWHK6DZ R=<8E>:Ͻ[mlGYu$ko8oy3N=P1w+D·VcyyҒ6b]-X3E\w!Y˻K[heǺZPzIQkpHK[z!'ɲzu i;j riwK7$=?\ڎ{C[O'W߆ mt^| MRaa);?) endstream endobj 2266 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2282 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP) endstream endobj 2265 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/trunc6.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2283 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2284 0 R >>>> /Length 1754 /Filter /FlateDecode >> stream xZK6 >D-{YYd^e' @QJ^4O,u]ץuvW?v}m˺~џ0guu}>cc†!|dgYX1?/#s-nIn K٥!5濏aztʨz}vNĐoKgY6Zxxȿ`[}{R`';Q ěs}IY> -w+}IS6`&ump D6_WzyECoMSqQV,.ndM^`q+z~k*?Q=!ieB~,.Y b ag7QY!գɟuWX7ȋ<*vǞT<Fu$YNk$.λ}TDU;<@GOUߞ:E1N^qs8y7Oqu[qD0?@k.dg@wR)nb~sV ߅yʎ&_'hB}G*Yy*6Tv5VDHSv\<5MVR5+pv^4ԆJډaGjSs1ņ(Ui ՗AÎVg ٯgܤma݉?7g}<n]-nD&_^>nvO~.hB|{J>h" u&_Lt!;;R={s eUXFѯ\<\y>\oͯ4nUج!ĬcμPzjvx;̎R~fa (Et4;f(F@:>5AbTǦ3ǼKv+ 8{<fa (Eձ̱ιzӻu|;W!NP 1cәcsw#!rw4;/'1Zen(GvI%'wjFO:SSΒoPP> stream xZ]s6}WxdӲnɦٴ!b3 גL`d4d|utѹJ3qS: CRBP';:R2 GΟ.w+aYDF}+Pۓ>u??_u7巫 U~"Pq&)!pgxB)hBQي[ʜ?'m+P,($%"WQ(9jj?̐;KNMe HZp# 烋@(J1'x>2K.![G\pm# \޵i.̛U4L{XېS.&k1Sģ('m&*Z{I; 7NT4EɪdTm5H !4N`2.|-DQENcЕztpôCI ;iGʺ=#O&ݳ0ӣОlgzC8=C* -qUW96IEBC@!u5 K޾ ItoD AN^\5461WT[ Лr{ҳ{I{(p{M6GvOo> stream x+2T0B˥kfP0 endstream endobj 2269 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/nosplitmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2301 0 R /BBox [0 0 387 387] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2302 0 R >>>> /Length 1016 /Filter /FlateDecode >> stream xX; o >+z&KH&.rRdA6 ss끄y1}~_o?0:hcrnfg0HҷsTN wZ FR!ly*BfmI|y4=y֚ [ F4kqy<#t}!vZyS]Q B0b%K!XRk^'ᨪ8K&Ѳ)Z7ucj*_T۵G\E^靜>n*aYLt}fFhiTE~.j]R;x4кd4' Y΁MA;)z~۸S7y +M)ckUpقŦ`MMxpk&օUh=X*h`l+Ut>4][VwXŜ[ 2c6XGeokŌ8Yd=VǒEg`ux{wI(rWqaH- jz- ( d WAGD.)*Jʁ~h"/EWO-!nvv_zՠvP>^B:{qzi3˗^%<=b2XSYٻC<駙:d ǔ< %%D~lHmazImAߍ;J`t XVqOQ'X q<(AO~w&z[ km_*XmʎFިHj3vv.\1sU#߹k`[Qq~[55x~)jŸ;A;0uއ|UoxO/{}AwhےL^Ԓ.wh米j _ZmF8* bFqSґu/Izec56$oF'QGT>:s#\{NdvVfIpᔝ}~ endstream endobj 2272 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 386.999 386.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2303 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP7 endstream endobj 2271 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/splitmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2304 0 R /BBox [0 0 387 387] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2305 0 R >>>> /Length 23923 /Filter /FlateDecode >> stream xK8$8U|+ IxzP>;H; ,Z :$p8)hz\l?l?]g|(΃wvmM>_ۣx.o:_WMg?&pӂgĩ'݅?pS/im~qpL7m~pSgg?4^p*~SCxJ)ukǺOq `MSq x7xx'~8هz04,URuH~~pc>K H+qµR~A/_"o:_?؟!oǵnEә׉|i<͌O7T!, 'iWV˻]l܏y4~-}+EۄϐT~Qy]S޴yAs%oZv}{1~_4\pŸߊ<[/*vq!3Ck;/z!.?{ә(y𿻼?/yT pģy`|ES~E~7pC'Ƶ" }>I~`8cMg!pqv<<; ?k>ø. / W).:9{V8pɛθ_WH0^U>yCv}xϏgmߍh:<gmQ ?oϐ~~sGi|qTc7/N|+a5͍u?nEөd\Yvn~$}Js)>C8y1y*cN WJyqG^!^T^^ GL?On`/WU(\3 y8uV74OpU_K}ؗ#7n2Ot)s߂M7n׿G<2Q%K: ?o?L~GW"~1oUx/I!tB34xӉJ~+xަo3kyS^Wj+fښ~z ꦳13OMg?Wq=7GÀ#Sŗ_[oZS7&)wZݱ}~B<07Qˍ:~?!RMm~qv?8RaztU5_W{]'MgV_39p[s#x^\~E".d=E|F_ģJ~2^>%e W<.ո|yxOinp]ۘ.*noiOzә)pyk ?֙;Tާ ^wsȿU^~ƅȿZA9ʯ? WcM'~H~+/ ?uUzt ߭KL'qFgx'ա!'RpF?VzS|M3EYT:G?}mu1>}3ޢ׬TKun{g~*Aj?>+.Y9/@ /Z4C3t>~pL3T:kw˶կ*^xV~+/k:ũz.UPu꟬?tNKe]OR3Uqߣ"z,dG9?/C|  ;ZZ15k7Y'">߃qw:N"_9}`Uz %̿K|-t%ϣSwt7Z2]Cc2hf~FC7:<83x7p_;"y@gzS[FoWPxǷVxBzT`uKqS&<|LOpy>4rNrX S^qPNNs[Gw@tL]tKw\fįJ՜|Gu_UiW7%n>K_-rϽK~^B {K}@w+Y~4ȏ4xXg7Oܧd:o}?uTOu1Ny̿.Lw> !E~_) e\|x~y@o:i$#^׏~~ɍB$ |XCϔ *(}ΧOtCϳx9Oך%yM/%|TDZ ofR1|WT?"+!Iy?~K{Fߠvc78^Wt%/'W9/c=o^u<~)O֥@]РEuu PwM# 0~ot<\ϏyG9?By;*XӉ'Pa:nyyzND{}\[ϐ@^Xs<_;kM'/H'~+>΃@׹C<=l o/N!"ǒ s>U8pΛ)um_ج'=jFQGPT잿\otC/KbqC5o|?k/țs%Ԛ7ȧ'3qwg=!ᙥߕ?cn$aݡaE7+W~*BS 'ےm?(t*k:03 zӚN8)qUɈN++]ћf1*^dgqἷ} čJK"w_ũ/pf##)!>1F _ܸ6?'TEuqk3I5_yo>|''N7 Bռ"EĺoO3B&i'άǛNyG旹.N_DwT`M~>:.x7jښhlYB!Bqz@3ɊC(z=֚/Ƞv/nCYOÚNN|놲ٗSQl>cz{E}u-ʇy ~O6u^:<Mo1c:?Rxc|܍x8ےz0c~`{\szf5sW1sTļI+ȸ11i`}ӔY74fzI˞T*hU3R+^/W Ҭm}cI5Uy|WŞG@r#Th9U`[9;9ύBcZ ?ь逹)'fL؍lJY1T7pƷ`Sֳrt$7tm $)lfkX["!`}kaA|e)0_̢A|݃@Xi-ءۚw`{ώYnL؄ء0B&DuKveRijǍAja=Oa74+ d1]+TOD]M-7xVض]10맪TzP5^zx3t:#d韫Z-_ l0: )7,goKNB Q,sX瑰_fz%v+ypoJb\pO|^\[u6ƅOP\DCp؍BeGőU_}?xǯKUpM(L:s!&)g)9e!+Ueֳafk+SԈaeX {de [!0b&˜bbtUXjϕ}Q( X` +,SυXR**摝",̈́%.rCݱPk: Zh)C78[= т4ϻx{T:6ׄV>'6VEaLC&x Pq+Vl>=+~P7>* ?ПT[ϛoK-&C9;-,E4c^Kʲ%'YjKVƹcFl[CMh@hfb.?egʆ tJĈy?vUjPia"1GP=c_>M_5 NUM' ov RcЭo9♉ppRSu5]R=S'(#O$bB5EBZP\]zmMq8]j-cp=Ƕ*]BTxH϶޿UU&~@뛸 k!<. UR=pR34#L#=/|Kh;g$yTOUG}y҇T,:Ut<˒.Bp\D`} V^Ę<27 A?wvlЛNP f,I1̍Lr̛1@`F,'aVQDA'*~5ZUDUOa:7by7 W(ނ1ª&0x!c傺]cWCmV\X3/$ TtPsCSw3{O)Q} y Ňf,!^u VߢuO_eA.`&ʛ.%kʦܷulF>"7rmB )e$?՘\ƌ߁=R=(*jM3y@q+_h3mKY80߶mfxٕ Pi?z4l*XS1P7[<`RN jJ^Z 1~uitKH đRE{hH?^I {Dm_״ֱ5D.U9ZKw I6W~(NP4;W*Ť67yͳ Jl&;N ymm,/loUҳTm]C34o|YDix.1y.m59I+&53}[-jb r`sjNC1TG(ǯnSdd Xok 4n;2Evj!mςPb$bDiclR$?@93`͚Ϲ6Jnr.#ݏr~jV0+i [7fް"b{z>q@ĻdW6J8`M'dK1lV_\Zr.U Z)2UUT`Cs-ZqHkT1+NJU*59wY|aT(]Hzz Ub)-؛1:? GsU*iQ?*$YMu4n bٍT3ŰJ<H:TȪenэ;1qFV뉉xo26eH)WvӆlzZ1i6+)UBUgPGv[je5g!ظs3tF j|o͛Qƨ1&W8oymyУU(ևi5nqHjUAeXT>b}XTK8!c/>X| Fy@N\'fܚjN̚Fmo[L;@ hBIm[KHOTW$+TF sU6x>KY), ~St{\:m{ Y c>jnN|8(gUH+B`!JYXJy茿O ;(9+NilsCۦUF5!g$O*sAm 4.Y#BFy /WXy\A;GV_[iF$T3^JeM˭m[V#PQH&RWU> ȰcVVVve٬sGx7ls#MF^&YkPa}t?sJBUe#Z/J* @UkXdW2LrSw/fZPb KX0'+3]he% H[̌!_=֔_:쁷_H;?>Vmnp*lUn" f'**kxDa[A.UIkRzHNDQ3n轟j/Hfz”=)(m5/`R%Z!6sϴ$HF=WbY U69T̫>j>N_ WWYb ]KRꚺ!Q!w3T07 *^zdqM ԬC-mo yM/Q~yM»J4e,mPXkfYgT'u{[uhv E͍#N<ÙM fB={Ŷ=&EGoׇ~mܢ´*i=[h36VxY:x%ԉUlP-׶rj(p7m[)MUV7zʲg2\Tr."9]xOx=ޘ}+sS<4FvuP۟;4ǚtpb'۷]T,;n<21_kM}Wjv6Ȭ#"=Oڬ[}(""[(Joޖoƶ5cC@YPxYZCi(Ah? F"B98ڶ4#ٜ,.lq}(Km\m+M) ;DEJ5*F`?ߍ"0s˵=Cm뀽k{mYZS4ﷵ=`a1Jґ7ax{oc(FV7"Ѹ}!ls{sw,/r zENW5&zӽ"w$}*BTϧxE j<[k~A g*qd 4^]SHTb$CTj2gj}Q2&*p8qG^0rL%Hw\BD\Y3U*>Ja泲J1bL{3|1ԲaT33J*R.bqRņq Vezխ%3*n ?9[e_)E/(>f܈;Q(iRU)Qf3e^ˢ?y/' Z)ƷxvT ٍ=m}XD2CsHo:_ ;vDžm{mD7|d 5]f=eW E~[ :Wxn*S3J83KRx8GE\" ^_8ת0r8]zIޅȯ!?*{EݭW 7~@ԍSO_67Uu5UCЕ3o?;OOTUV2LLM__|LJCza-}c#@ EXA>'&&bUWً1{n4?n%2Yrߖ|dl3rŚrjҾdC@t*L;*I*`Y͕)h;L:W_'װz}qW0]+?okTWp6s;ͭ[^C#Pz<4ХoI@F].Ӓ6&,Xfig֔ѮXV^Ѱeƶ>oFKGI4Zv!="a^D/W hcQ|/U:*$:( 'An"^sCh$ śה| |UQYy/zF0"Mg"X GO]LM;/n_sa\45}x@|%ѼGZSۻm˱q5Ph䘈@#+yXQ@(qqhL`\mNi#g鏗|NAAѥN1 6)"ut|k(hR_ILQz$Jx/*o}cj˼VPp6KޭRjmsIf< 7UWO&Ӹ_D-o4:GB_#SHqe?:lڅT(/.Υ\x+y9"r֓.~\C&tWyں;zy>{mBHMYU/TnEsBΧWh B_ܒTg԰Em4L}ҦCJgnJ JFI>:@/1/N+V|WZaV|m^_p)ZMG^w'=e}262sz bW-2][ *v1N8h5qXÿmә04S.R rG+O'HsaGmd3A o RU+G|GG3!d\x>SJeyj^E\ 9R1疉qʦPX-!oFKr^c '=ZȘc(Q5"&z*!IA\"lDjtWXX9ΨHZ|lϽ-ֈo6֞XrLYe*x~-2̴OYڻUVXHcmkqKź{AN4~í Enn3AXs{odbDO+%F2ta:O(6x0U ݏc;t#O7S )%F ֳRzfGF.T,s1{ܵ>o?{ ^.PM"QqyTߴ^W*uM+e1cULUtoZ(̒vC YZF!K#63O*Ss!86}"> D,4`AO5k!I;F`:f:Ѝ[{c@:RN1wulӌt`Ў*T Wb!8-_WtNQ#Ć)Ai.)jJFǔUb4UkM -¬2;NČ U]R̄ F1%5#i/1_r*gDRSI3E>j zr@7?]7\Fgno?W쪯d}HC35>ZhhY%j}վ++Nʢ~_chF)bk''jϞ2}}]Z_XuT{uEA^BO)E.eRDeJ!Tbֲe,ǃDE-bxCɬ)# .0atԄ8#(Ģ0n͝ϚQĺ5qQVUh&U$(dRk_0A]x1c9-UZR*<Zc|)1TY" kaZ?sUGB-e>QxOu(jhT,]=)=YT5W+]3c>uݰt7k+::Z΄eBvfQiQ^ĎU5#줅Mi%t3C # rkBh=h,z?=tZ7ƏeP@]ڒL o1eJvCJ&R/>z m}v&}%H=p*uWԿڞ|xڂę5f:U2&׍quV߶_oup-^W0ZC %-7[}_dQ^Ec*NXVƸ&{?B=bWBeNcZg?3v+B?>Qbox c[ 5֕&y215x˭T^ùdۈ{D!'FġٓmWh`Ucx&q QfMxQ< x&خbN㝎To?sEʼnM߿[n\mQujgKd{wY=s?i3 J@} }X/^ {wS :>gc#b t'l@,zV}EKU"܋LgL1 y(ʹU#51cV ;`BEERjuk6Zi)|uE KVhu>ṕ?5f-KE9bFQuPmCnU9b!o_sJOٖ}bo?" k},r`⹋>Oj5I?7JYyD %34TQ21ɥP)k˂Y8ak;|Qp'6;fDL!K<_=Ѱ@`tűMGQ1xՏ6^Gq~~vD}=EޥsPAemEvn9a̵ 3j: r#bK+Je/B^טħWuW^жK,(W&E_l𢛳~L> ~~'KTZuڙQ9{QӉ'xjJbځ*7 bLp' !@*KgwvКO[HcPm;ܰx 'YwӌB$uhǿ~f葶zɿ_}uZDn95 "@{ٳAƂ$WGdN⾺F.u/z o匋,9.Cl@ "z:ztL^՚y-w_S5Y3ո]")9¬):["ȁ~5áfD_m(Ђx*DlA2j-v*ZA2ʨطgfϠ5 z)d<_83eNz6ASVqaaT%XB??Uݪ02!:"G#)o`S RL-{5Ko|1K_(^Jȭ?h`:Wsnkȇ@=QLb2¼#pUY=IUam06WW T5؀K\};eGrN }·:m3{{"*TD+)%#U˚G^K!mw˭:=Ϩ#فMa}Ez+@af}ύuj vx#ؿ\"#b2ur,ȯ PtP*1m:BR5eR`euRXj, @|/)<c y\W@i'>u6cƞDش0pGusjBnY d}RUʚ++s'yw>j3F\{CNg>()(,Ӿvm۷*o?{QGlH)9K E*2{X99&e=1r ^6S?V5G³<{V*9 o*;j vŜ> ٹ]u,򋂓d3Hu_y'i/mYna-sU,M1>1ϳ+LKT{_wKiHov"~yb\ sZL"ad)[> "yaYϝ,VJeP4QKO^c’S-I3)3**^M=d Dķ0\'1'dfZ|$ʫwG5k>JR]hMs>fot׶.gXU1!2;: f$MNW1o̖o)>kL6`3uMkx꺟=οH83FgO(tPKP}="dּ2fjb;n24&܋8&EϓH4x\H?@xSnUZ5{_*"9n29o<=x?0:V2>4kf==dzK9cv'2ܷ 2^y{'fϥ8(;NxR{Q>3#o>cӿ?joՙQ0 ?|>FVٟG OиGK=Ҏ,>*bݺ}Iō*,sx V;eGzfك =T8 Wzty O?*%?1oyf8M^oЇU"ߔ\&z4y9+PJY+_Ø.9[G|:9q[Եۚ"zszF[0{G|D{/=+թz jҚ ,ۇlh!_&ytW4nѳ.ކ$eugz"*b쭼Ty5OQ IH~#(c-0rbbulR.HkV.򠵟=GQm֌vOQJigMY ꍈ{ nPh;fU>G>H_z^aqy5tzp$I6gO|Ax:IbF3>W˱[0zVb^4Nu9YIݯW(~f~*+FR)]kVi~/^*qʹ./, 2ˣ}/b]Plo:0VIF?c>.ƒo@?5~_|_XQGYqWB(3-WEA~Ɯ֩}5aߵ7Bv#ư hg @ߛV͸GoQ_~JBoe_HD7ʽR}Tu%X8#tݶ*xzF[6=£/uo6am>+_od(6㷿T˸FЊaϤ[ =>d 4MyXgU679n\d;,a\wzvc>^38!O,Yx}yyZZ|8(V|#~ƌOa]?Fd_[{_cfk WcZyֿm,㷿!ÌڏmnNi!oFmw:{Aʶi˶{{xV5bhۿz o{bۿRmt! mecm|mO‹v~ۍFq7en\Sn\]rpqunBWwûq 'G7?{e7n\n[prF6rvr&ܸb~",qnr/RC 1uVQA5QG)~~-M{$^Uu˰?얡gYm 'qnu?wVu߸{W|oZRVwNO WRcWwKF4܎W,vum%/KAah{gײC~o >,߬vǏkn!YK/]{}Xn'96#>,,û9?w_&">6a9b̌-7ܲԐ-}33Ȗ=r?*lРϝ_1sΣphʞ|h,э=h"N|'| WF!6O҂5 E ^9c? endstream endobj 2168 0 obj << /Type /ObjStm /N 100 /First 979 /Length 2413 /Filter /FlateDecode >> stream xZmo_o 8.,){vQl䍭- P/muݻ!9>̐JhrJ8GA1`G+a 79a O"#B;/,bE1)8p RxDX;:Ag`tܚHP gr߄3,+Vaj$7Gz$ŋ P19Z2xub<'e;AK <: bDYP嬰&̡قZa\QF) YJIa`MŎ)G\"xpdx^2(Ei5Hc+RN8/Bp1g0dQrEnQĐUctl֘hM lKj kbHJFq9ī?iL &FJUyo| UYݏf3 I;\oEgX#Wvy}9cVDЬU_>|`+oqx[v渚|-[n2(7C7n!VV|ܻ0)w׿dysⅯ1ٻ7n3^0 ʣtrtzq.?wm>~Dj }[^Ɏ x ʹ3qwmm{пrWwi Kc~Ut*:g'/;wN@l'z{U>SE~jNMcq۷ p~"d>HXQuڙ(u:sZrםڄNἂ1[Mj6 {d]mlZ6qx6)lb) ѡ10 p8/Jҷ#B[17ĽVi%r/M\Sn-폣/&?}\xNLRF|-S:>:rrQ1M[ qeCZ|VvH8)Q6Z5BqF/_'9ͳ$dsq:GXH1"s2yUGi]ݽy#,-~[ 1"z=' d ѯ=dI)g=UZ㛩p~U$[i9P٠u[W2 Y>7Ih$_)&wwzǛZSOS[N}"`,iM*oi~wofӄ?5*(eL1<67(.I&ɯ_H7zkfj pe'p:Bk^2TT2f<~&xjvq;& m$;SfXxTcm\xd۸j~dEv.RМ„Na</o?X(õR >,Hȹ ω`>p?үDv$>A0ABd7&+ m**m=#]P/*^{[~M:w3 wVi;iۇiRsnv{o^LBK/4;_Tevn{ngzh%sFIkAO;{vQpB qxviLqWifBDOHkGm-p9叡CBKZZ|VB#9d ]yhBxaOn endstream endobj 2317 0 obj << /Length 1028 /Filter /FlateDecode >> stream xXKo6W{[-|Hnnv}( ?Ǯl7*$9)r88/  @u@)Y0hU0ZA>!F~x~69S?|76ٙ:7!)iPcLZ-.6G= J 7&P!,{fCF|yWvτlMqq~7j7̭ű]yR .A(aMgYBчic 9T Wɼd]! vh9DFc o)f7uxW]'id m9/{)]pQxb'"JzS|lMZyON !BP3LbrIf$i;>8[Q1獣XQW~LV_ 10bJ ]tn,M Fk!b7Q|6Т4:?O?|XfqifDSӅdq7G㱿&C ]o8&)tC%Nse?gTkfP诮^ F}7X>unIݝ(f.vpTo<@a|.J.Vbfpm42N8Z\u0{:=.mfslyu5~E rnIGY(f+ u09.Dfji'1qZD625}9Llbdձ:HYcſUj> stream x+2T0B˥kfP> endstream endobj 2289 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/TouchSide.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2324 0 R /BBox [0 0 238 196] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2325 0 R >>/Font << /R10 2326 0 R/R8 2327 0 R>> >> /Length 3250 /Filter /FlateDecode >> stream x\ˎ% ߯ ].UdeY$~"]8 ߏTzϩ6<`C$E}]}$/)ܘ@ޫ&*MR ro̜Qj}d% WV^AO6H4@>cJ p"r395$"؄K0{ U6s$W>9 $Zzh$% Z\H'0[Hv3؍f $n9!.%xmQn&vH"K9g%R ĮΑ.DB^k'Dr"`'5DB;]XNQ4|Flh۾2ԓwo}6pkTf kCk;˵=ՈzRywT5 d=8>tzm[q{f*N"s!Cl$16k&]2~ĵQgګʢEE=U^([\hmzr[t)#pmȹ/Be5Y u965Gn@њ&]c@Hjר!PL6 _E6u~-:ۭ!;ʵ~tw.VKTfLW}f-KŮtH6y]찆SCC30S<28!rfBhՠh.WtRxYː DŽ!w㾌$HNmR@ׁ$d'sIPWB01$!Uy2 {m} .X]m=[ % ʆr(Rڲmk@bSRsY'è"OֈZ v)&᠉[=:@808U<|_1 }5$b2Q1)JBV IDrfHʫrUq1]U6K' *@y!i(s}8FEP ҐH* IZ`a%K6VǰAAenhcXFc1Qq: +Q*u ()YUIͮ:1r;{U# &%f0g8iaKW5'OhO[Ϟ#6 ц MKZ.їQZ6s) J>wVsIA.LLjע/ˠ̕P;hQ]KI(38zADB7jz)TBv+\*>lWH^2">R $!9 ЗډrNXcю/q@/ b@EP?4d2 Ł$HY%3fvHBe!v "+ CS~ h0%䌋hZ(Gǣ =a H -;r&Zm`6'6ˆLLÎ uC9]{KWȖ^yW/^ g;M^x wȅ MO0p&z_k+zCж2Q4F{84'W'X 圖HM/GO9Xvb\+!Rg`=^+ 5J9f 4ǬX%+5| <#yHu2p?%XOejBFWݰY"swB-|))hjBJ .8Nm}QO/%?o~⫴!|=Q/ftͻ!%~rV).9BOdM<6qX!һbƨo5I% 47q(dqBJKl eoo/^=M7GzM>S%;'*,ⲥ Xn,UDqO$)t6Z|y9@5RÁ9RкnIT9pgu«=/L`j`,P,{PNS,s y?Hκ endstream endobj 2332 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1722 >> stream x=U{PKG[yvay2 %,/AaFeUl4$`D@%ŊR1]PDQJ" N?Lggs{)ׄCQ/@fJJc\gb\g $mQc`]K1gkXqlXs K9mVQI#fd2F|o/FHI0# aԓb|XդKKψqqݼó0L¡>NP')LJԧTu u:G}NslpL8G)u$Thjz_sC;120+Y KDb3-]=q@|[ܣLkIjIVŜ D&.΄Hl-!F7!Mjև/`{^罊o0ьs"vB -,"Mr\Ih N@uWee0~}@>|;Q|hp8+.9|x@`:":"= @6l+ASU7t׿(f;|%@Bt!1}`ryis`}ѥ`|#5~m\ha)n fY jm7T*@aYڕ^s!~XKXE<)Xbݍ,t|N4vѓr7Hz#F<~Wk襧&4N=+HQsKi*Eo):0\YTMK[][ݽ/AK=O*a‰Ƶ֍ 1Tf*b4A"G JO C~۝m'a zC)EP " uD&, D %䋅[k{cc^&a|.Kz-*bag]yYiE~8_`e~TbIOjR}ЙA(ͷѩ3@T(8펽ٛ bb>2:GFpa.c񈐇I82#,i* g53ytXACk(z2 D$,)-JY` IjSUv>m>_=Zg.pc .dZ ~V*wokTKԕVǍ@>g8qP$ @L;/Pu4F/\/J}fqz,ُ^G>3C#=slNH{QJн)sE4uO9Wo -L GwQvlzUmMqÀڈĖ͇-VAYۇ/S|/*+.;|ǾC՟j\>)K瘟KsǾ$nY.]f7($o'[E}].ãWlEI?A&J^^N"|4Rԉknr㈪@]RG{!#427>UM H)r[9_p@ endstream endobj 2333 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 349 >> stream xcd`ab`ddds,L~H3fn12nn9. n8}BO``nfezwqQ dbߜ݆}ɹ{]-޶jƥn{)\]uηw/=J̕vu$&W8vY,1vy`%ܞiՆ#eK,^=/iZĜnk-ݿm'O(w[ņm{9j~zhtlϭ˩-.*l鎞>{}O:M[y|pf?'o? endstream endobj 2292 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2334 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfPE endstream endobj 2291 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NACA0012.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2335 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2336 0 R >>>> /Length 8416 /Filter /FlateDecode >> stream x]M_???g?哟˟yc~xm?y;Ta _TVcB$y6)4'ў0Js:1@/sNm+BJ?L>*I*&0avI ?{b=.!HCW@Mv|hȖB(.[t̋gk1Ã+-迤V5AiA]Ls!e=D@h*$==cVu+Zy0дυbV9JĶZ!5'kۂ['z!G a Z͠:3WS@] >y#ĤyuYb<-%]M 5Vg<- _~gv~+T{:ԡ69; 1 (ejڂA/m+0($+H+o>~ʇ R 3Е>{]]cz6/caX^5%?#$Fٯ۔7x l~"2gZ?u`s3tE4hNI+otEl5YFl51Hˊ=0t/Np_= u"6y=gzy#$N 10y̷}xf>`] p(13IRV:rz&ł2.1{Rm GM7* 㒏 an`/u]]qf O[FB7Ԕ<.8P >~\{8xjP' C6% ~z:zK}@5w9m|v(CFѠw Gi'ta 7"RcDяaSpLev OdԠdGb7u:A7̯s|#ul{?o|AB˦ OfYd6,q'y*͜HK9?.2KD:a,cb5g׵B/gxoF= F >E׉ڎ+H~ЋO"_Mo uwc]&NoO6ޕ·bTDŽwE4W lls䟄9X`蕥gY^UЬiLq\΁@jHstNGRm"s V> p{ A12:`sa0ZOp=x؃<Hbw qg96WǏU~QU,֎5 xir̒\Fף.PILa-K%h6@VbȠ'2y:OXx0C rڢw Qr1?hSe|^lq豩zʀՔ`C< Vm׭1SD=pN#!2qCcVK]"C}Ee0G JoNNG0H}Bzjan L䌐9oc‹֠/& ڑ߅ݦ˛M~Ӏۧw:^㈿5pO?)_AB}~F/lT5Uo]t=։-8 Sø;FNXvPk \ U؁G)1yN84Hi$DV1{*5cл3y| |,_'bscc??&/vEşLV9zoBLYR$*Bb p<œy_U;4q&!@aq 0\v-Sbg}Cm uVFNkl&>Wb=ngXچ*VR4"5M㎟ >hQoia-i,ߦv\㎟噁X) C^*)VI$4nM 1'`L x4{q;'A,_?xG OuYN =d_G)Uc?/~ِTͪj=x¹>?ۙAfә *JyExLѭl&*KU I俕o4G97"tt(/9'a!SIcs\Ʋ}&;B%dyI7'u%1Ăgq@:JH7Ws b(AJ5BE0p\{ u,7G`?K0 0.Xq)>?BoU[UKwm &RN,WIϷ͊rIa$Sg:nqz':ޜ  D@@ Q+LN9 ir:Nӣ@Ta m2r0ZE>ʥj wX|;9!aMb~mH"W7Z'wn >S I=YڐzӜ2hDETW&^8ڬ8?OT7Ah<'Zrʐ#](1$ @3K0<#x;NVgϢqotDŽ c[,|s>sjn>W}s}uɜ:KoDBvwN xgaѫӭ euVT".P;ҐJ.r1ӨܲmFj0 Xww2}nD򩖠mJJPq{ܺuV; m'F[yWϝ2(ە ~P^]Ou=w{\  xԯNoꣂ?rAz ]:ؐ8[7h#ŮĬ6+b -m! 7O9:ioLF_}8}xCԓ#ԉ*J>ӬcGS6{7Ec\ l3nw񬩿to [gMKs;^[3yq,`!h=6PdΊg43Ëù4R= 2:Li.;{mu=`hЬ@:YeT:p Y]!!֨gr{loWRGs:!e|9sNxSi"ABj M0ed.Rhn1}f{Y)ԀvhE.jA+À8Ea*GO2nn6/*#~GV+_Sѭlo* xY+0:Om6A봩==aS:q@#"u=Aϩޢ=]ŇFWmJVMXAW#(iw}yYJsb$;5}ng퇫m^yri#8.:ϾR\h+7hNSF r*@W@R*OZr ,j ϭ,'Hz]"6g=aq OhEڴUw|"f ( t6mW˫_,Zd*2ߝ\itn΍L[^}{=FrqflO0Jxwa">l1fuUi<ӗ_ ;0 VjU[:MV`݂@C^oFg_K_c_}\Ϳ3Rۧ~>~悿߀ۧשu\T}SހۧV<f_:oS auj{vEn>(p/`8ӳ~FOu8C.ǁGߤ;;] q~nZw8gx:.Ɵ_w/=)= ?fw(G/zюH):,>wrg4"4#输qȍǁ~}/O\U씅}N߶?}#o><;!E _HVFw/zBz"EScԗ7~f@O?YNs{,~;3~*p }~hC~~]y_tb>/-' F|׎ ޏf9kv΁x,#ᛟ8%"~׀TA^PDZ: [v0?<Yc s:R+ +0"@[^[9fȅ!7Lv#ɀAr|՚z:iE.g_cu]h54]\jԋOY!;ó<pN^xnM>kwsKZؼ/n}a{m^/znTTEr'វߧL%IAz3T8goup6 ?'a*hMfPs- 10Nё65tSg&L@NbX2>Mr$,93{?+%Py>pDž4Z "ZcW@G@G&Ef&g;.%=;K{g蝽nY^/ ,cY,_kQiOPg\n }j]W78bO<Gha=?Gg?+3@{ @n8<{'3y8{G OFx M w ؝ăIUs1g׸AF`Ng<놳kwA W? }?#gNA?w9 jx8gwSX x . ߀ȝx|_d@cYЩ/-~X&Z|׀k$ 4e9n~;=bG,. xʝ; 4jy]O* RR~pTOm|ko: #v|[xL^$?g<X#~ԇbu21M,q?_99m|1<:7FVjg2AT]_U``/.2d&7{r$z@+XOOߠ?3<臑Gx~E72?úa'ebxp|z@ |{a[;_faAfo`~?,gO}1 )~Bs@.p0Cvc.cy){C 3%>yB8~Fˣ"z~CէE?sgR~ O_aeqM#4Z>Ʊ@c݇։k~~+)AP@֧ľBU Q˸Xsꯘ>zՏ A1{ (5Q~yF*i1?͡oK1ŭ__at_#Է3)z2/r7`OiwpqQ617|6j@WY . +,YEd@|}rA<+<5' uY{]^8 =W qS[$da 0>CF6mjA-հrw^Z6 X ǟv;U77gg]'7?5~~ѷ_Ro_c!!ƊN> stream x+2T0B˥kfPL endstream endobj 2311 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Cardioid.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2338 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2339 0 R >>>> /Length 13338 /Filter /FlateDecode >> stream x}M ݼW+Hv ,!LAN~ {1?QFBB]w)?g=Y?s{](gsi d_y߀;q]Cƥv?'%Ӏ~ +z&|ȷBgM>6kOdz7-Հ;ƥ7Eӹx_2 ?_` >x{)g yX5Wrv?2ſUͣ?|p)s<]_x{)wAh ω5zqO|+v|y]/>3W; =+,++?~x'x~iޗƽr||}4:w>#0WFeyܠߺ6 Nw*ۺ=!kqyQJ؞^E3I ΰrf3,&I.tdiδF ^trp@V qER^a?^2hu*"*.V|G...ruºn?(T{8\as腭(vqM=PƙpSxNq%w&̕5`]c[e(*T~qn+к_pzm׺VsJ8zg~*LtC7 yнO%B8$UZ޴=`=Ei]hk@u]3KAuy>G\A7ZRgi ;>Am_ zP wǡK8xP\C7~ٗÿ8l%T*a4x,jv9?4 a+OZ( ;Nosw\r&;XYg`;%83qV|رyT3$Ewz;s |h;.# #oq~i_{h;.ڗɹGA_hg.wHZ|m;+Tל-˟ S2~ST$_|\ϟD:==++ ώx兿ҹ=`о竲uLLUf?m{_WGҏOK҉|~N- kJ'yypOqhPN內ؤk˭z%؎gr>z/Eoۀ?''|A#,~SѾ;~+>+<4WkN /<`~ƒ ǭ9(.hg3τsvL٫ .;~)}̨)䪼/f]qtxpGWC[Gv^һu"s1_ O?:cR8gD?)+k!o-_-_3Q9OhG<_ѣg]7x>!S,Tϋ΄tx_I'/KDO(/vE9u: [yq>\;J7mY⽒u}ѳ}^>+:/ș;i# m/G qΐ|A3"):u};NkU8Ҹ*?AjW/#Oo_sEƩϋKi^V~{Rx`zK9|[+i_Y[osJ| {#vƀ~׵3a_R|V//ɭw/S~=j?%_w}/R8g/⢣oR\ Q<r};dϣŁ)+;}Я}SϷ_gϳ:ĸjhߗ=[ P;WxVKLQ(2w*3sQGKN_S(zbo/|p_gK5潝ۖW}S;B{?}(#?)qGE᧻+k/;B ȀGݥA/?H߫w{dhߡ~{Iڀ;|.˻+<? !3??%koZۏsA_ h._G OxvҀI*rg]:iʀҞ=G;ÖLfW~3z6Hϰ. =fO|~+|ϔoֵO_Y7݀;{$_t|V|c:yb.C|9ډW ylt?f@sؙ7<pG׼25`vg|=?JA? %£.)'ߢ>$ Zb{]nn): (u_~]WWG(9I7Q~ƒ~'~8N>|:8]0gHNļKWqA$='yg^ho觡 F2[F~#@?L|AY<hU -GIK?Gu~Qt߀ϊNsG "ԏ10).~ޙ(?sۏ0?~4=t U~0~Α~ƻkߨ7 >֟~)6+>gR;_x&{S =x2~Ҡwbߤ񃞒 ZO@HOI/RdgE'=?SG$ڥ^+#~7CggDm5i>wp1:qrO[_JID53t>AN^?y؞}yPHλq983<<<Z{6һ#?ש$ sgKD$C8eWy8Sڳ<4һ\rQvD;ӝ3:4"ռ(K'<75_2C;/FyoUy;7ߊ\!|p?!:,smS ;tRt7j;H?7+O%Wh'~ {K=3dOz1o^23 !1 ot|Iy2 JVԋ5g}*IO{wt}ɏJH~B_~ zzw;C ?y:TxI筐 y#¼p3w( #x5;7_1@LI yRr9I&e]ÿ9^ثD9]3=?g%?Oߒ ~c_*Wy9=߹͑ϐlw<kպ wuHVvL)Wn(Wz]I׀A{^]>P5woռ+dXfZ_#R^vctA@|>~%/9}[5}%u(9m+׀`]+eh݌yW)8_d?A[Wr nc]B#6;mN| |ufxPO 9;{1O{>/㸭k_8fz%=J߉E /ߨC'?|+Aguyۀ?=р׺ZǕ?Lu:gVďx`/Zu#';7+RE$7Kierh~Kn]_G|AKꆧ\N yt9? 8wtuzyl4.o]翸ݖi\ߺ>7ss:3 ky`>==#<}_[Q) ⢒N7GG̋ ο=?Ca%jR:K9릪; =Qr0丹Wgz/<9"R[WHM*MQПu; )/Ӻ ~x.qr aOwxч q<x|)'~\GqOjC!gIO|Q;WzGyP]ͯ/;rUV o3 Sn*a{#B#c>7~_=0Pڧ 1ʢ/ QE6w|~1u}+0d5y׋]<H4q*#2>&޷)'?/1jݑx o6qNtdg (eo~wwNTL?=݀9/S=߀ ~Ƴx].,Pv&LEOo(~CWG =G;[ݭrDy hv@u:8Oyˢ(u]!~ăXܯ-_SuWVBj cY".Q/Qe\wUz89qUCGyG xNQP'< Ku\׷ϸp}ńv@ {q~bt'b}QϾ?/ x)C7\嗧OЈ;X_{];0~%=umVm c_})ؖgzʇW{9&@__M_p?T4μVM/uW?l$y7ui Dբ|Seܦ+W3}?TbC_*F2\ȹnwY`\r8Q)rdn5\ VRYȵRxT.l*LуB.ʽzS{?5ux^8rj7 2-.lŹŜ?ʙV1^@NݫI8/xwEa3 %dx hr5>/ 9}=A?`^ ռK<4n@к:3S65:Su_MՕq*}\ݿ}X5T~(S/px_8:?JIBYvGa~Ǜ:4灞S9c#?sC 9wI~ْsDcb~{f9e9@Lq-1km̨'<~h8ӏ2Q]lbZ?-  ( |y_R"՟>la@:}$prl+p?[^׀;M#q5[jV0[0In ܟq}kE_ᱮHvG|+!̟|si]{@m}'R|\IuZTAEiCBv ZRy,G34* 2dP dm?ۆ'2AJu}kG}#8^c궮٥vXWs1`OL!mI!΋5_]WJmmn='TA^ߋ6eSaor {l8W{oCsuQ{{|2']j_߽ @,hQIv@N(M:uǠxNK[xp%+\aQ1&dM(E9.˂!=˜CԘEɃ) ?;Τcy>zxMdC|j$+ӠZnY )G|q)QXcKՊR>du j`-`%)koUB~|Q)_ɉC5TN* S0e9")rLUAT9 ?)6P܅nG.?y~UcM7 ̣UNɃ7]}YLӝhDȕʥ&y+[ɡʽvP|rfpk.]}yӏtM~ߺKЯ5`(k}@.sQa<֪z$j^ɥ 앮UxO+ӓl 7yVqb€^)B/~EEz*C!oJ_XCtmw_8J/~מX=a˛̹$C\R61`!R_` cx"O3"v(cbNC#WΊu\h}띲wO%8/ا SS'O~bHŝyţ Z*ı稁ByEeJ{k#oWiVII vX#3Wg=u"~%#|C+9K̗<uT3iWźR tցwh?AOx>Hw(P~)rksǫ($LJPk+ڈjNϨηyPJ֔l+v*]! f(:+lIs?T3: cBcwfǢ6|HyR>6<dB j, 3#Tv A]ĉ%RzthfY*e=kͣ}j"~mACm1Xj`fMP"-c<- 3p>ava(ֺ17sN` *'GeE.Ix]ym02Mqi@y~^ (pG&_~_H֮^=}jN֖ eiᔴbkZcml/=ăs"uOQ%ă5/5{=rOʼW_A"?~K=4EĿ}ݶ, '㫧tddS7s;@G Mvu%`d/:~90Wd=?ؤfs`gĔV[t޿Rv|rVQwWU'R95W߲!i(ay}ʖ*[Ww*q'Vwk׸ZqG݀OW-Ŭ+zh\?`:UmNU[z|P+e\5S*}{T,M*ưPp\vE>bOQWW)q#^ X| W_~ƵU#' Uf pDzt Q^}?# <ć[(^.ȇ( QQgEĿ8=נg̻G#|b (?qb]﵄_dCoz1+Yh~<ܞBpE5 {2ΰ^O]5/țkez!3L򏧤<Ӌ__˨/9Wz^xy)'n^uA}CED7:tCOBu#P"~WҠ?He8T~X4ء?c~q% L!lp5<*pY4O9iw7?/lY׽qzx\˻=װήm^"M8BߠB:pGvQ|/j ! (g`PFz?"v?BA$`d34NT2)2{ B|m=5h-Rs5=19K#z09W;Ld?ˋ9q姥|m\[A2(s+l*J7eNXj+-hg7XP8l9#>#rwaxn8ofo-5;=d cjw3Ƌ8c2n(Ɠ3x&06̍ߐgcn|9kw3PsA=n:<+um^8_Ȅ;ǘe,.@HۓOg8l/J_^dRVr<;YGzZYe%+dѺ z~Z%Nq*Fz[Z0I*/ÏC}`];>P;Wxp&-ج6:-B㥅@gK8ERtU [&=oJ`>P hS)Ysh1W(# R4?H=@ 7ZaBH9JߐY6 ebH1Ce?l'8uTasL{IxlA^f3hSJ}+ /QITn€;o-QBX>kl3_;3ܨ2eL0r4&Y|u=E:5Sw@-w9|n }`]wS=jM[wާOǡ8;JnXΤ^1 }Nb{;zZo뙓?l|}oD rцHl\9]5m=NW`D4`IKJsEݯ4hRqsGz"^՚xȝ>Um~t4H5㜸6=a{ $ު/ގƀE05mx3U~dge\uvAoMXZoe]G?oBFd*'aQ}^:ewW*ɖ{NBN@ N`l83zk;1G'R/سУr|@TPX) YʺVXlՒQW"qM4`m kW$4I"~cBߏշ>of|IXA/+ń69%j=ߡ /I Փ/pHl̃Q(fo:4ߔ~q&<7E^a>68&١hyH{ jN_.؉;N@&:$kәzMkI9cKϟ*!(!T0euS݀o{aIJ{;t/_6 ~{vMBwm9)edWW}ח%-_v~} r.+M MŸvow4iXy%0F5د4A,FEhQږ^X , "(ous ^(#RNXx 5HQ\d_j@ӣދ4 :}XZ:a61伒ﱃڐ Wxs&K u<2Šmh٬~Bv5^n@wIi " s%,-,6"rˁ,Y WB|J! > .`v,_,X&Xϳ,V/ endstream endobj 2314 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2340 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP endstream endobj 2313 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Cassini.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2341 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2342 0 R >>>> /Length 3855 /Filter /FlateDecode >> stream x\KĠ ) }!lE^~ FR Tt&/oBSȆW*߮?~?_g~-_]>뼋UsSk}K~凜^moB<Vk?o7Ne#tpk6.];:kz]?BU8}GǭXyRLدؾdC.}eR){I岮kmJel{J7BHk&Ȉ ,DeZt2>ڵU.C&vT.:;3FE2(H**UHba 9ڜY\Qg>A>>k{Q5^_fTy]Mɗ5/˪fTR;r}/5NǭXFZQpvsŧ$i652g`NPq|˙tЗ}EgY`>-#?>/]{ɕYm)G6c3@?` zw6j{hE-Idl7RxyDϷqk}ѧqu"9r)Hzdž"y~+vyK岮[B: ﮋ?hȳqUۏgWo}qv\5څ~J'g:2Z"{w zs?̿9X~Am#Ilj7t.KS5GvAGokTyS*'d]V<{qvAZ+ʄ5“G]G(tM2DL)lA-F(b|ve}6& /;a{: ̘p;I:aD;z_=L۫c@̜Cx٢Z`%e Hv@ h9CCt?#%ҝU  軙PEEHZD5.Y8I2rԻl!orYWNhd2s»~27Ϣ>|%6 ObQbnZJ7"r7]5׮ fhAARPVL_Ie]$"v'ypVo Tot)b]N-LQNhM}M, ~FQ96tPs<6>я7l6fFkqm~6[/ܢBvYƑs8%冎/ <孺T&CH'ȁ9־t2SXސwt@L>մv{e 3qBNNX6 >Wſ\F't/BɕVЗ}C[[׶'Vqi|.0_wH? (?R/rֲ ټܗ=`{/a0y| dB<&NΧmG /#j]vOYu'OG#!mEP)Mo-_y}$΄>ʡgivG(X]څٝ̏9?` c`z%3 w u| a̵C6[[ 拻9];F]7{C9y> eHͣ|B Vq2 Y`O\(ݾy{]Y˖C:$:}rP";:>Zahȣ'AT ўhhDv!8ء3:e 0NdhED1f q QCsl?B6whwK{ro0tN,m:;g 2aCQEP!f:# daC4A1&änIBSL0ؤħ`&MLnF(g'L$!m -O V0j>bb1zl!tDa,2U++œ!}LÙ/w"ѳ]xv ξ3eLSOd/+7zE19N8GwrJK 8(i E蓓d'oZr2!q;9faVOMN.FZNa^lr/:2 Y6:^=0iOYi;QP g|.P#Q*Qs !Y/;OV .Y;\0u@t4zǹs_B^7^g.?ܩOzsrg;9Mw" ?ɲ8>ր#`Y5qA$7+$Ϲ=wx.4oRܹ;. K;9^٩kEFΕZ 81*%;qQ):{]:vD@{T5p3s53烨 $X .(c_+ɾÅ1Tc 'ީ]c: | iC}whGI;:f,G@!rȳ,SyC;7 w/J4Ǩ(-;NΜ]F.=I2'4{w;Y+ܽ{E7\8;qN#܉?sCte51P:2(;s/Y /ff1zU)tzlxp<d\a\7{fѴ;wVv9-tu+4wݪh8>dZ_!:碳ܞ"UܺQ/0%lC8tk[פn]V\@_.~i?+Oy endstream endobj 2352 0 obj << /Length 1733 /Filter /FlateDecode >> stream xr6$U"@qiQOzL8ɿ/I&Vmbw)ںn˳Y->k޶$k($ѬutF(0*p,$ "ƀ=E,hɀ g^_ /uBh~FxF-SS`e ^Fc!30]- -8;}78<lzd{`_\ppa(`K¹;u@=,Q=̈I2qre[βڗn lUT1nrJ{}T.y 4LA`fLfq3I3O qB"%4?Aڃ-t=}I# HO+s$k~Ͳ7/K+kx8vY#K]I*TSAB_VgWIqOeiMOr]lQv&Qƨ,H!pämib3~ÀGD O(+-4 {DBF q_ej>:;$T\q/fl F/*iKڃ^'c=JJS`^tQg||L>zY9%)ҏ5TΡe8q!B '\ Ŝ elάHCh8qPDqCMT 4bh(v& @r3p1F@u8CMl8q4'iTE2|vnObm3ȍ{2]\ݓT)7.0ωr3程8i2Gx3 :E-OzAI^p!͛/b <zPpMh.2[&qQ[;LdӁ.V"fMmN > %yĝZJr|)R"ɬ1(> ]߸T;;2ҟ:,s&{Ɠ! (9h\JF+|Ҍ9-]XQ :j@p-t"we B#5r$\ϸ[)r$""K?j'15M2 Hp>L'Dx G\ ` %QDun.߁i 74$\P $ `vʷẄ́J[)w+)YHdqvQ3q/A /-(s]X(jʝcX SIF%nĞEV"wQn[E=z;anvf$^^ǭz_gYTBlEx}Bj K?{ڃ";yMwѮ.Mʄ*AEvR:M>-ӒSYx){> hcA@|7*+GUE]P-Ex}*rTȒGnr%EJEof fcq̋b8ʇ}_:[y[W8=Xg/z endstream endobj 2367 0 obj << /Length 1199 /Filter /FlateDecode >> stream xXmo6_!F R|Hݰ|Pd˞_v"Ȳ]Y(Dgy<>zczoPXJ =<Gq Gލ/IDP+!3o3_v.h.jZVMut}/@z`RLP A,![,.f҅h1l`D-,eDKnݿE" >[djF$`4m3?<+#ApXşe/p$b" ZރB)g=l߁D<$ d1BiPrҬ0*q^dVo˚Lҁ/Zzp1 $ߩƃrcXC$ dwAK0/&B-j#\h΢c8vɺ$]6_S,&QTo8PBn)7,qg2u| c1gk@zEXU¤uݥG,F/b!7su!9b!9Op*Hq>5-~>eiըNle^9q~v(3猻ئ/ewI7pRV9.XwwQ:5~]݄hUmqH-Z`h[~\ 'G} hc燆*k\nAU_0UJ%$a g)CQ-yL S2w$([hJUq걩ju)Q+P6}߃-"ײlAS铸RieSWىtSv >G0&(> stream x+2T0B˥knP endstream endobj 2345 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Bezier.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2373 0 R /BBox [0 0 202 116] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2374 0 R >>/Font << /R10 2375 0 R/R8 2376 0 R>> >> /Length 2249 /Filter /FlateDecode >> stream xZ$+:\ߏTah Ձ@dύ \rŪ"9л*k9r 6o]۴qpnO>~DGJ{4P6nڙFb)3+ӯ)PI: .@p7GHСʓS &>n- Ú m x5v(rxK#=x{l Ae%UtV7'LʩX1LC!]|س }maLC7 (&bgb,] ;%写^ y:h.3{0ZK+(i'kOA`^m@ p9A}=:ZYJnk &墏{u0IFgS$FaU7R@ ?#Luu7Qn}}'%x[Hb{yvBWAepه u 5.t wrkhW54Ycsy ex62bۙ8mkL"=yCI- ]Nc {me(* 儜HR`+R97G*,| ~ Y$,CسrD0x],DZy.R%1jb0ǂyu4.Td!l4ª4d@"]rty$zQvZlcP 1CR"m6fo5) ,AfA!  ޿x*ɩn\2"g$ l_E, `[dj!V>0:(K%(kda>C'ޖºJ͎\lTR@\x Dx&[/++pKh[#{?p H-#EY[U!T ꅘHѯ}ΐƧ:+] 1DXfx+}A4æ&wFATAp@CA^5|UXjUie1`XD`7.Ǟes*ǧ J s".2H t| +SUI$h鸺t=IGUt E0I[XCkZVatLtOљ2ҸN^4ziՐb|n7rU5ޥk ui酣A<4Ń.W%:ַB'X$6<"R̆ 6} N\l":*Rȷuђ'E∂BxV<`0z!<9RPIutXg2>\H~PaJz'D%r(ՔVh:'¶D0Nrx^CR\[n`%leBl|}V3a!5"³%9AD11^''Xxe'h®`En3lӠfQ3`*ߢ ` tM!9[»1ƒ.+#{iޕ: u·>[=ϿY3mgw}[. s|/NW4hߟP>^𳵎&h״o f)LNo2i볰q7OmM<"A|~1<9jfحxk;fsozLxc=y =c%\DzcNWCST즃+Jz:4/D~cK 3#&q['CE'a cc?lM,Ӽo1{tki~19̤2gMֿO $Poyom>NvRnep.hL_AYd/!Hf/?F(VQm_t,W\⟾1-71/~-dl,RJ\H)U?l"97 (8F)LϘy fcL wC7%3vtRy [>&?[lf{ӬpXj }B!{"\>-ƐrNДHMB}Lq q >zĽ݅[*I պR.͑MXgl˂chn݂eqPfACE;jѥt"^PgyZ3ZZW !gLU̗:&(lГX C>~pV;N*G4 endstream endobj 2381 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 747 >> stream x=]HSqm(c45 3Sk;!edm!3ӄ"B{Š$)4#HRaDid*B7Exy% AHqd,[U^Pñ\ ڭ 1u;kß >bèxU.bAy''ZDYOZ‹xL|% / "uksDb`h>l|c>ܞeɲLPxpu3_W /'{ΟN[-JPBzE>ǚ5 Vw 9ۜm 03UvӴQ^Oz4r.d0nֽ xm&ˣؗaz5HBK@%P\RmYIF98EV{ZfȄ!E(.S2"K"J68pPa>鐏f(PX;ZgE> stream xcd`ab`ddds,L~H3f3ECCa}SG9300030vDv|w=kk*W(vV-7I 2~;Gw*ߕV|<]>rDW~Was{vn^9ZjmY[c/[1ñۨۮֻ <#9>9>74<ՠRhߌ;9v|0Yٛwg^}{u[7p|_{ njn6y8|y endstream endobj 2348 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 203.999 64] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2383 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP# endstream endobj 2347 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Engine.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2384 0 R /BBox [0 0 204 64] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2385 0 R >>/Font << /R10 2386 0 R/R8 2387 0 R>> >> /Length 7245 /Filter /FlateDecode >> stream x]q+&V"w*''S)%Wه@/xugRp5<~w9po~}׾.?-ey'q{9ᵆgzDKF8-ҼMB'u -=CZ~ҁ*^2ʱԑKz?+,%DZbҒHBkX' -X*TrR_9KSw2Xz2%̑=7G7ՒC\8S4}Nk꘦5؍ySu)2u['Ktӹc|:,XypPbv`rRjT[q qX֍pR8#gܢ):4H+T cl8tK=vŇ4扰d?qtr4dĞas Nud NF晔qXENŕL˶4EB t"buD@eDVGTLJ"ħ*fsʖ21s0?m er*BoU~nzvu! "O$ -̺Lw)J Q Zq)m|c_̲+0Unf87cs'*R.3rC uP2ur>x[><XGh[ϐ}]8jA{3Gt3i}A2KԮ,D<1f - cOVp|I EWqʢbuP$ Fnq Ó/4զA.'ÝqO ;2H;J.7SjI9 d}VEX ϧ!,Uޡi+˔Fv`-0(ax-ZW%kU9bgkڻT8j޷t0衔{T%6@!!V"&,!9OCcY!cΰdcNoeFe$Ou#MVyݟz c]DH$n¸yo/ɦ2.-!zyWF.L.KBc9\PW.weSCb֙hZa0I\Wb;e}UlzF_ț8 =5!9s8AR8 A!Z׆枕,bt2l7gu.,B LIEȃq*P!*Ky;qݓIݧA7'J8HfHG(z1võu/ }eGˡt5IALxDGI5FCqIkD9bYô$:)bzʓ?O6 N3{4j- (SrƏgCwIzvLnRzRxѥo^؍sTImA%W8[Se P8֢zۧ8ݞ,96^"f)Ka.T}9XOPrNY&$.Ev:1vfYqn3٥chnvTX\Rxu"E#B!͸sb QZHd C)ӹ(aE%sANPG)0y0MՊkN- ޮWPb̥TKBQq+AzT,Mr|q$ |, y8~钍 ߩڢsBm(V,/(̖kXO"U<|3aR W8%2kDj߹F>QbԯR W O()YPS$CkH)[@fZ NF8 яVk֗\'I!z(#ܧTՓ1GS.I5fmE (29؊cxQ֭T GHcn\9ڋ#^X1fF,`CiCy]MieZ흁.0rp½㥌6Z1f AAY3u2:wdCaM"F5}~RA K-9)y/VJ4UR|X 39AV@d}Gw)3s0)Wp^мC*ՁQvr !H([ZY)#l p+?Pă UX^sw܏ʡ(xh/hbA+BT)xCU.GRM9{qP[D 纨v+ Xt\0̑<"cU7*Y@ Zkm XKF fJўZsqu|u'Vٷ2XSL$>]ń\]j$]3<'G2MR)$a3JB<¾z,[;Fꃖ'P6m [ [S$2jx|aO$ߞ(dֲoMሌ2ő0۸6+Jۑnȭ 3obzS^y`vґS[l?*k9_vdm׺*w8bۓ_H~ԓE2m\R@/܊|/%E$Bc"Ex>&n+BӣGe|9EqZu:\ 㞣8Rq/Ɖnߦޣĺ7T8SzH'%08 @S>(W">Ŏ` "(d|a.ڧSj\4± <_HM, bxV8<=#  ҉B4NsL&+ yPTD!; Qұ1\o$d'L7]?HW0+Ȑ " g%GH ފ H'1x02+`庽GxA565HlK.!@cZO3!O0-j]`|KMPM6C F(N `H$R:[a&uzȃffH$ lxBy0ֱ'?5`C[8\80KQ| 'T |N-"­{">XnngGr XM":>'%;}ɑBbAǧOo@{K{Obay&C,̓)G-emV`9#" Np-ta4Ѐr!",Ž8¨)\,֩Œ;8VXBOF10)|Foc%giZsqK/SW!ijq5]ʓGD6 eHXM8PbhbAMJBMÈ{HLfsJ{Ŧt%F&k)T鱅PG Ƕ }uNOZ Q28@ Op+8GxN1Ľy8ʹzJOI/*?zXBƈs7$8@3R4!N>#8$#ťQt"%nAZ87BBAe M{x)q1;W+)vΆɈYb ѾU/ 1㎈DxaDԒЭ`ͬWEE#+8[mxѠ˝BT6[" Y%Q _cV~ԃ󓫓bSsgp;0޹qUSH{IY\h dBnTߵ8(܀r 51G12N~b4G$'8>ZbQ"fRILjı@$(z ȹQ00cR"~R̂xmɸh]>MwPcLf!P~(J_DawbI|q{;/?XO%?W_~D>x1/~sem~~}[qdl_w:Sދz-A{YO?|DO6_Н_3Do;N4¯Ⱦ;7k^&$?~{_^DN}mk^Ց-Ec>Ow~Pg yQ{o5ZȞR7d*ho剥/n̎a^P6 2sɶgg TONd;9B%?VjTU$z-m$-4mte\ЯסO ÆXm ]1<⭰c5/ک:6k&\eϬU|ك5Ns} y=?bO$sjob_lcXَ/OzW'nI̛{f;3k~]_aD7}~]Pez#U`y`h:*,[25ZybarZpz7WPXR'2ZNt"1Krcݹc䝦<04S,[iϡ~Y4 جX6h}`u j=Uחyb&NIUiT9ۑ4GFs3fv \G*R\CFTCsTW(T-W"smCmv-c_uu[rSgsYm@}]Ւy/|Ru'i#_WLMuJI//?; Hԁ??~ Ejִ:5ίx=c<)O?~wmrk#xۏ|~Zøv*/J<9o(W5rAPo+,eZ5IKD*{q/;d]hY2kX=Ic]]~V%m5.̝2 endstream endobj 2392 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 996 >> stream x=SoL[u}} JaYJJ۰2SI0buLP AQ0(CS`87DBB&rι'iV<Ox4y>@a>Jx(?1q2T"PtGgy-'|OqZ^IQ'}n/@H_[V* %ƩMndZ?I> stream xcd`ab`ddds,L~H3f1g;SG98300000vDkɰ&ϴߎ|pfk# endstream endobj 2362 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 261.999 202] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2394 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP* endstream endobj 2361 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/U-shape.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2395 0 R /BBox [0 0 262 202] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2396 0 R >>/Font << /R10 2397 0 R/R8 2398 0 R>> >> /Length 1999 /Filter /FlateDecode >> stream xZK4W8b5xn HPO˖d%[9dWz4I*+_o_R6tn fܸJHʜԔ8#(=0k5G[O8Լw&ԸR i*I ddS1!GВb(z&N-!qU`[d(iC2q*͘]HO ȅIrCd qK'Fj!Ȉ ʹzh @ r HƐ %DࣶO9ڨG>*3L.慳FN?,䌬fg_b7C:gJ a|"x 6K9ĄFB-jqz/N+ "_Uftys9qXHǹMb(lEh+Ά3݃3 ,$Yt89v88lHYic]K$t UEFT=ÜdVq]IzntTDحy ! "鍢 j!Yi2CfB! PH:TJfTr. bR"'R~G֩ MO 0/ƇmEXfAJI8u{)e)wxvV-Z%JkE,ĺб)z e:&:5vT6mNgIjz({U$y+J *O%csZ$8A,1QI* ڞ9op\#DI~P3Bc- a3Ի.  K@Lj>y ZkE+'R: GV{{pxC\ IRA- :Vr qk@݅P>\R;:ꕽe[/|8\R[Kb툏ee@bß;ʁo굆rl5et~֤o>|"/mx&=)}Ԕs*J,NOxu|p S8R}.:K|s^z dv=%: g3XjSjet=C endstream endobj 2403 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2136 >> stream x=yPSY$$ONc4 ( Kl@^2" 0b"8(Zգ}Z\@EIbDK@QDK-vhjno58sw s hB5ϰͷ}2~2:<}G # f̥try^K|VW 7/%P~T ؟ S⯢?P*h%)`A OHKVl^aYO_>A&@|O%Jcqq(%ʈSD9q *33D W:ؽggڋU,GW,k;"I}+d]<}a rXXPZw>} Jak/ݥ?Ϸ&l: +)%1E%'Fsȡhh&DScU (n&#@ BE.UXQ/s1Y)x!`.$LG39q%iyg߅Ȯa:M--mkJ٭e$Ztz Npa!(@(JSTqHs#6}-fPb^]u=W*kR˷* kH| XX^Rrf4Gv7o,yrс}Yy s JҲwKu-xdqkx&$eygFwCs:<K~~^Z;B>GlK4˳˯t>Nz`mvY/kϛ7K/!P;MT7Miv/۱M#pQh~l]FFDI4{MtB1 V{ØaweŹq@lxzixies ,r\z#QfLXtX׀{[ImXSK % &vHW}~`qD$JZ ȍ{:AIoT]%*مWγ3t@X/wMB-4?==pҦo2= gmn^V<:545TS@ ˮ룁[}$"YpX@i"Suj]qSQӡ ag䆜QQa?FR솥6J2O(*_yuA-h^>Nr>V!>'^e7Yz-O b99rap_ݳƖR*Z&#e`X#kO#W=@vLkK!j贍110"4R$;3 $Y,Na&C endstream endobj 2404 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 125 >> stream xcd`ab`ddds,L~H3f1g;SG98300000vDkɰ&ϴߎ|pfk# endstream endobj 2364 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 182 168] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2405 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP1 endstream endobj 2363 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/V-shape.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2406 0 R /BBox [0 0 182 168] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2407 0 R >>/Font << /R10 2408 0 R/R8 2409 0 R>> >> /Length 8627 /Filter /FlateDecode >> stream x];.qWlx%@'ĎHؚ@Vo]Ui.6~Cs SO?=|_ױ/??u|繮_|0-_yWo>ga:•q4reFq,isNgcs߿YI? 93kCT/y\r<,KOY’0-#q B8ϳ2׉C5q4ufZpeZgr*ٸ:y߈(s3\g¹YsbEmi=_Uızg,}_~De4,I$#*DsT!!LwKZ$*@ǜ"QҰAιr6U1'aG 6_lԩ1Ge=d8X\Pp7ţt^2INmܙ,sV>%4:H4P϶:4sb~N8a*U6z>GwP^㊕L3y e{Npot[fis'"dc|! k`kE ϣ߾8v(>6@ax0NmCz祣$/Fr5 ΍s0 uc2cˆ*QvT>H}ƕA1QA1a߫uodqi6b_N0TѫYO?3\!'\OS]kpR4m%;`NR񇈱 ^պJ]I1r 7(b>?*(*  1$*ύ7f-:RG(Cs2+F0"$J3RAN6UY#ؔ9Ո\8fljSFbpiVlJ5M?\CÔz֏4Thİm$o>2밇rD9N  ?ġvޏ=ḏ0`'c b<gGC =NxSW﯄{r#2g! rZF[GH~9'VbtOaj{s-xEEXeZzVQ9g&;%!#jMB^2 xFSu&H"싏j"j(tP-D\,E^kIc"{N8ETdEe݊.Gs6WWqY]֦@RTgE"CgV',{$ц̰/&Py'.NxsjycD~85,MзK׽*]M:m)y +޹ J:#H ki#9217Kh8G ]qɁh|5T;( *uA1Ox9l # cN`.Gskw;@YPPD.(rOCQ']H24s 2` LDx\X"MFDhժ#tdlj:]y螑i|8#c F/ᑟM-#澐aҪa mՐF89?9Xjt`oLt85-܆K$P؊?#{"WvF7IYʕn gT``egXuXi+!WJH֖XLl Ig/#ʶʗֹTO!GԚT_ AGRNӌ^ïw' E |J- L^ȭrT3}ݺ}uvKQµ b(RZ*H|Mm;ڬVUOŞKRMw 5N/ JM,b?"E@e8WmTXȑAgD81}2f2 RISB&ɮ2Qh1 (]KsLaʭ䵈-~=Ѷv!N7CbLMuyU}MM9`\2avq1YJ2&!1$.R[K DY2I5 fo"7V#^m4BbX asSnm,#ʙ 3'pdLf~j)&NڭZmM[K(qlD)z]E1ak5.0"\0D&R'6_5"2* .rȸ 75i4ay1_%DaX",RQ6[ ofU3J1bmh1ZQr 5" "}ՐO뱁c *(nTjDpNWQ#dVF2q'H鸛 dp i` qhy&Ocm[\ zL2ᴩ,ePkſTlN}=wFȉ/#M D"C# 2v&:AbJ4)@p6i4l~H$ۓvH/C{Ĥm"G=N|}FUK1S:d~rl2^PMܛ>J ^'X 'L$VHU@+Tor7m= 5jzvZ֩);̟b2RUh]dY'AnNaةc(VzaY4BױB5jj|C!Eb{P]&9pq9?edTj%ɑ).Ӛ3dbwB\vIlmu17,boc~/_ΈClٗ#sè?P4dMei%D04 *35`ml8:($qo:4;zb7PhFpG"NM{E?8+9S ػt{.w‡Ȣ+_|6E\O`4̍rg-H)Y(K:>b< Ɠ܉cT?_mʔs53flf)ϷdH H@L0tt ^mHPUg-}/iT<_FuL}k9oEv_kڸXbH^Q9T?%ij4еpbg\FLM-*irO)M Cf{m[PolG5J}*)CL1!Q@T&rGw7g%yc8P/,&y5m͟lS0Dzףu+{ TYN kXB6QhCvԓS=QC*\~qHfjZDnBQ4Qui\/]f^珘6eO3PHDr,~zӼ0n24,$̐4.s (G 3i?>bSK+X^GBb[ĆOlb/sHL H.Nd\BlI1 qOI. nH _ X§_cr<$b!U{3®v*\Oze_@zDH$j} j׷Jwy|/t)% @-b!#o;n6B﫺9=SH&hBG-Pʦ l1eUfKQSsyM?-H!p ́: (ݙ_pe2Qf;FC/ ty˪D2Ja鰈#w! )LPCT:;B6c8N} ǟHf뮴CVPu"r$Dl=r烈GNo=jo3 GlZ/l$Rfx}H 'WR̦rT:J΋bc`!#,ԥ,YQiq"Ԉ@UVAxO5s/<֏}Ken 63C7BcoSqv }X g:̉' \rJ2~!lYm(U5T%,R{z<4CjOF%H\zͻuj-kbe(Z*#-ꭀGN \&wHya;LFXn0b'u Wٻ)JDtU3j~"7`H7HaG8؜fz6RhNfaڊmW 3;= aҥ0_ ;#D%=-J ShCtK)2#1` Ҏ?G>M-Z Wƈ8 $ۣӝa0RW&kHcZ֑z ɚ hb&kvkmMO*;A<70%Tatar{tX3# Mpɮ#gP 6MsWĻ1 {#+P|3)zة2/< ̪sJT2.Ub@b'c^[J3pR@ '油m6 rwn#Pb2}u7rt'nњ@#d"!)CcVjTplԠ< %Ԩ( >"Р/~PDWH2_^[? {hUFV|%dܸwYqr3CX 8C߲efPS_h&vy;9's"gue` T!*_փgW`o?Ψn⺶wi_P:d\=5N\?,mSa[IgnZ쟀}ڢC;a[# Av AzOծGԁD%2Zjm1|Iۘ'KM9?-&?Bic&F&7>S or/={զwlƇ C'ƾB4l/ ᚅ`J22$lۈȶ&m0lr#9pwS+e%ƾ}2 .+ szpqM WIEuFu'Qd+xZ(Rjy~Bo:4oA8Lk! aMVgYE!w2"=M3E +>!B!^K%Ο's4V]x"TrnUt5Ot+@V Ȧ 6yg4Ԫvvn*bC/sTP_L)_g* U c.~@F27.>n. R+ex\vCZ$.aod.VݞFDiS di5 2;<%bjEQd~WEhT4 `ʍYV êveI%!Hᰂ8|/tX K7k{6B5+iww3-PH4퍈/Ąt` JK͜wqsՂю6G%F}{̌qS2ҩO@FA(6;R_~xOlڷ_~bۇe׾MFɴ{ǦLo`t!sl[kX[@= kHVs7g[6Hf>b>!hJ5b+hO-Ɇ +)q1HeL`e|傦JM=8+~6F6N?>QO?z׿|L_׵*k^O.-J/_~CŞ"vtX6 |ʗۅ+S?巩Śg>u^NӪDj?CJm#vKn/-2_5k[_oQ,6lxO$!EGe(>/ endstream endobj 2414 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 883 >> stream xhArial5fb   ( (   ArialG65G67G73G31G32egs12LDNtmU7> stream xcd`ab`ddds,L~H3fi3ECCa}SG93000:30vDɰl1M{XTo߼撊E~t6-Zixw:+KD~g8B\+uW.ޑͿId~k߬ݺaN95ݿf\^ۍJvs|g~k'X]w>l@p20;m endstream endobj 2424 0 obj << /Length 1960 /Filter /FlateDecode >> stream x[Ks6Whrj“ !I:iuk{$T"U/B,` ]|], v;B f ww;<&ag8E8>IvDa,no_}^.[Sͫ^w|P ϠYUy !܉AP c8Z`.h4wպiAE&KۿyZ6@PC6ɚ{|jB񷫂d!X*۲eEZr5CΛxor /"QR7`1XєZA70s7ՋTR"#4HL_Ka2Wz|ai  *6lT}6-,F; ^*<9D Dq[ySWwy[dHKgSyv͓kޭfy?e7vѳ6۝xV"\*HDo)\Q51O%]JqKX5ךBGd||񴋴u$I2s^wS&/6v ((4^AOAH¹Z "qXB%Kv2]-r*J;X@=bky<⮊J4j?O8zYjr(iĚtvvo7~n^.eE1C";ɸZs=70zsbwTƞg``:66\  S@{耄DHjp8z!Y-"E'u8xqQNS1α>mn+eEPKQ7ҹy-huKLT׆؃h.`HL2ǒĸBV$<G1w?J4] v/nL\'cbSw,-@U4,(#{rVI2!NAO,2@>rǏ4dJ q6vM>%LLáP8YHdYGZtH׉lftc5O>C0ҨIu ,) K!Ea*^Mv!\d+K> ےgV(vG ;;c:Ǒ:˓ɳJZ>WU.N+3}nzZؖymw'x/zXbysJDEIP ׇӓ8 wI;`Ui?_8c57 _i TMAhK0ߐ١5Rp Λ4p%W'M^p8ޭܤӍ(Qʨ"Qv= {uݚ%쏷)E›"!:fzfqSۭt.V2a{~Hgժ+OXNU!O{V\Z+nV3aA\-:ˍ jB{t$FkcZ=F8HݛK|%ZrIPrxأdnXM^.,QY+f!3b&"a-V&Q-ˉXFW,J &cKLN FhCKo$.4űN`k]c6]u1}{FSV8egvs4(O=3@I-Iq"Khe( R@mRߐ 5v2B,D$;93TbLq>ȗY'%;3$֕4e*&:Jn귎dX69\?n4ndY*VJ7AX  z2C6qOF(Q&)scIYvXVgIZc j扭=Pۧ:F3h5V|_Lh endstream endobj 2306 0 obj << /Type /ObjStm /N 100 /First 993 /Length 2427 /Filter /FlateDecode >> stream xZmo9_oۢQ: 佹m4v u;C~=_ǎ=vj(|GJ H;?^+4i&6FZfD&;QXzkao(MNxNZa &r|@EA(-EB(D-f5IW% RXvBZyZ$:`&N&TV(<[yuD.DbM/,0DOiW!WIWhz(Qx "GfFV#D0*"X@DE e0@DTV1Dde"Z^9Bt*i=U bTb(b4:q)ٖc<I*ς; O "-IئЛx|x "dh}P|Ajowȷw)tKBC^55L="3Ц52GK9%޾g]W_7"2o5mrR 2}vV]q 2D]`.>0RF .p&z&0kr3Ɛl.d6XɨͰjF:~3H*1B01&0'h(Q @IȮpf̑4=r|3{i;ϊoqU6Mw wolAcUvHFg#3DP" A!>O/+![EO:8~/nAk? DHl9hw;A!^MI_'Bo$"/;^Ww`t[u ]Hpn7o|mbsZ688`FHv_$LJ߷lͻ]uaNǏ;^i}s r5)N{ # dBPޟGIUj~FMܘj,UL=Cxj+`_!4B\)7}a`{G+N]Ѿ5y~]ynmun`hx3ľ*?PWĵk7?R3ki\L[\Dž޼߾+DYH[͙*luׯ:XDRMĺYPˊ7*qY䫺hAA4bZ>9;99%{{h^zm(b9dA +ue7^QoѹΑh U="7Pwi F9']еľ!Ǿ A~Ek1o^#, 9| ·b#aRNNVs#Rz\*@asл[sk2\t"/x:יtGMc4˂uu+_= ֍'? K9+|"7Ip⛊`tUן"VCT"Jp`0fs 7U%c[y'gn>ۑYɭ3hlR]6^n/M_ƙsrC|r*Y% %vgVd{Z K8H45@%|XOY;\E/ў\D 4véN T6?sԉC?k8gs`/>lut q)d eiN\-$lIߢoQ-a%ip9j4;7Ƨ}P4hԠ-kN5(oQG;S4*mataO:_̼ /ŭ,-̠vgV*4w̎^.Vԛ0TYPr Ce'?/Jr3BԸq6v>fQؚ>E.UC&1sUpU7cM4M2:} &Q+}ԸbuY ӏZ{D9c9(]!w4 CejF9Ս\v_ endstream endobj 2431 0 obj << /Length 1975 /Filter /FlateDecode >> stream xZYoF~ {qTN-'(M5PZ%:\v;{Q$MKA[0{|, 9z;: X 4R%2U#Z "|{٢2QKo>麾]u]wOù~}3m#蛔Ս@4Q`іPgaggwDRD@1F#D \ń|v3cdZ̓H(F\j-Q_X'@}5LɶOYl2dIQF1Pul>%>e\`k%4unK+h!7рO4ǤI:Ou>Kj~ɷ[7>e aqAʧkkҜth_C5K~+\JwMo2J L8~HehudUc3v?`{\v`'Jh2IQ$ۆHYDIA`b0`>UZ5Q7J_tt0[&}hk jOVn6ܦ1ERu2ϩ> FPqkğ8de=F:f7H"5g?HY}m8- /czSe.PRjJtt2Φ4Dfmt᪫ħ6Ẫ /,NWcjbR_Jdߙ (uS1l+e6۷D %5̾bAb+3C!S] Ldut*sT yjj}KѾ5-Q.Pţ4ni,~(u(7j1,/_Fj7d˱!Js+i"\!a;)mމ#Qfnu2\u(Q$t'u3 endstream endobj 2419 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 135 167] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2436 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP8 endstream endobj 2418 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/SmileFace.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2437 0 R /BBox [0 0 135 167] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2438 0 R >>/Font << /R10 2439 0 R/R8 2440 0 R>> >> /Length 11790 /Filter /FlateDecode >> stream x]-q+ڜ!fmWeHY QʠdUF9k@!h팓R!>?c:u>9~8m׾Ӽeؾsk>|0e@md:MKƽ̅lx͟Ǿͯ#3R$~y78_Kd4C8}H Je](Ec*-s0L[H"q/m8}(NfR(IxZuaTI *nb#)x@>s"+*ǕQ:W Z)/?zm5#lsW4x" =r qA!UU,!H%͓b"bu&KЗ? 8*1X@LɄLMM\XT&߰&:&\o`Ѽhb*p:e;ǞFss1i ?A fdzlE^>u kPqLYjC0st% H8["!gshh^ `(NoĠ@UZY8"2 ˶$X:Q3.v\ +* 9-Բ GdAH Fe)l(_&Tr q?hZ2K{O.P0!ai teB2mXB =5uKq%+-R=EY..y/-BhbCRԮk|&mwFW2y?0wrKl%Ft|ުkme1HQݍ"4M5δś~Ra֨q br9kUwqdR$ _~hwݿ#P 295+74]smiA[ݵ+<bS<[>HQ͂ɔ%(r dK8}fnO1: s&.3 eV)M NZ- Zؙbwr ޶ֵV69*Qwr.OY1y1%=,(B\OMT"RY_}Q6$? r 1ZM- /ፑtK64,rk z\mCWa-PA\'ݫOYffʻ6qXd+W 麂ENju MS 6n=ٕy+jP,%iۊmN"BKɭ dmGh %Ԋ=${^14IKɫmTHy-\2.3Hux=O &z]4NBo^.l=7,A --"ybVI^ٓG!r{,ݨ7,Tʙ:t{f"CCAf%ȴE>@}kaQ"mT{ȞH„.j%6'Hl&¿ 9e ;RzQR4#.Psq[ wTT~4 hpHFJWZ_SlwL 3BŖ!{,I۬N헭+r`@j\%h$ptG<Hܠ6;B1f2ܿҏ_J's|Bٔ8 gBǂ^~6Xυ{ΡA59eŇ@wPK*ȟӈp履83Gm퇱RI[l ߝh[ =bDD;DPZӊ8ƏݹmT43<|?`Ǔ=}@[06x<*a V!;h•9EPAoxn*v\~%:ŏgહ88qt mێ2>7vE1`_9xK61UrKa;i{mc.ADtS6{ 4F"4P3(;g DlYҜgIf#B-|Kx=`,0j4<+N@Fx8bpţYlbwUݦ^z-lP!#-k.ɒ ^92ECߴhA $=/L*koY;AƀbH6g4:t 3uW#+c s]95K11qr|򀬈@Mvʖ俷Ŷo,'#pv!u7{l_ Ri> y*z^Ǽ/ǿ㤥*X; bePešZTMٜ".R<+{G3vgvw U| +۬UۖC'16ų`B cK8tcH‘EIE#x4q): S= ۰M6:I&z cS'&N/R reA˫~OGJjf=v{26#vޙ&*^foi[*ٿߎɦĺi`߀5K j9 'O=$p."0`ub33E:ɼ/3tc{g|sAl H$+zᐨ3-*+ !A<&E9G{ .{f@~Z qC'M^Ʀ icxk]㖩̒&r~Osyd2 K(Iao;3lhB¨ UjL( g(Փ0%ND:NM_@NJ/[G.Т ]*{>X.ZgʽFv%}zUg:AD' q+gHĸ}4sH1/uV8 x'-zh> OVbJ<}wSAyky,zykΖ g"4U!qZN {ΧӨ;eWtP"{vk/K s15AAo8e<Gcu*ѓta"dj؝U1]f2Z 蕇اzSrʑa$N r7[1(Z虜_5 Q uݖGqX^C5/-G)"9Ë)v/6j6Gۉ  0 1P O*t-zm Ɣ]aO֞r*<å%S )X KZHkyL!+CD"R$ҜTHjr$N*JӤi7uCZ0+zkQ23/T:[?*8{^B$v'{v3@@VA%`=+E8\]܌3#ȯZ6e8k |%qܵ'AHtq^D)~kg^Luʆqբm=ЛD^Q ݲ\1z-t/J ̠9Cs3+e9!NXXJ*4.1nfP,oVj ׎09MRdm`]>%t[Cªq~5i/N9c^}#5YA 6$I[_`'M8YS.@S0A: Nf&4%ioj+f u[U37HP!4@}Ă# |\4=<'ueyp\O5e1ƼڀaDh0D1 V@nJ[ cojg0:6jg@q)Ьt4ӸXHCDYq52!9@෽N 3iBRa\I; |BK~-kw`$RoʵVd߱+>s~ 6}J5佅;b3عoU;m[\P$0'"FW%u^"5d9Y!>0إBu=ĵ2ƙ]igq՜7.WW]s|)˜g؊Vw.OE̩#EĞH̘Zh W<Jd>:q`4({\\RI*ʒ֑Ч ?152UF$V"5ۿ0+.d(vW{м?$*@T㨊2;3("WiVITQg QPB.4zw3{h~-KT~|8\tj=;HuunЎkܭvʥS;"1[aicVR:.J邍3b7 imꐤn\3b]:P B7@C-D@DhAq4˨dDxY`j.y69/IzMzC[jhDpv뿵'pm8<dwPZM8s-L8􌓱B y:$:fO{ IE®{&pFcazڪ Vl9M e,S舔S:tM@lG80Rӫ vRsKd-nُN*tp!XSO TފQؑpޒ-XIʉO7cRG 8IR#2q4U R&fP),D<-iY%B.n&V@Qp6`)0B/@O"_gqzjGU{pufG*Ef%)Gp[pCW!p`bZ52Z|D0%6!Fg= %&G9*MʏU|2n9 ?48s{Y47e7>m݊ CtC+Xbk[6oA#2=]HbPm$+=.zKgp)q>/ 冯7]1a*R,e~\ M  VB(dsz-q*vEM4˓LY.\+93;\Ȣjb鹒[T6Ϛ~GEz T Ṯ/ &S^=j%G:-P8>;DMq.M`\F¡ 1cueUArlUx!dA;*L(+qQv|vcT3*sG^ 軲ka " KTюC9cw+.V/WsA/G,x,8g `bh1O=%\]9# "ӗ*[<#Re$( $PLRB/ڮջ 0 D咮vTt$ car,FT^K/LeLqn#"@BpV]7Y!Ogi|5,T/9fPZ*)!Fa\Z\t!Olՙ oQE6QMn[T* XQ FԐr4d T6X&QT٠ %gDjĽV"hGq#{ ( D"b 1F@&N }zUbklڌTvf<7h)Z̵>Rc7n>R{˞w“\ r5{/ (Bd~!r;'On_EŻ]qq++Rx,yU #Phj #-Q DM5`Vt㛶zaV̜X+pq xbo [AI U~CR?Q0-#3i.Fs0WvQhzA>c+^{|[:i`4,,(:]E6,1BSKq/p7'ǘSgVPmeQ-(&2lQcׂ^g)ފ#jI}uƔ!Y1S3"DZm̒$*@ APʩ9I{O_ d#Icc]"j$i!ӓqi9;L]M^ڗShxᰚ G4o2 !Be18\\2ֶoO4ϵ"xL`ž*(p\JKXID.L=y)`mP12 g 7؝ȨD7x"˪ ZQbH5 H+y^=9#>*5Fw%Jq\9 <[̓)_aT8xXb!JIXX(AN~ m02{bw0v퀀;S~_adϔ߳nn Y0Б-Fb dA[[L_Q4K%pKG \472FӢ("L!gů2BȠ|7l JԞ"3V֮Dj FxWBCb+2ODUc- 4rԽ> O_FȯР'gINiijɞ8Q :fr{ogNևduw 2@-N\%_)A $'`QTZCx9Iv[)_$=D) s@w_œ!2J9@4N2+_("m$Nm s:{tT;B fUTrg"a>I<_RD| ad @7#DWGv Fc+ @+ hT -yPP9QgDq9L =j}T ;G\€5[=C K!}x3Ox^ RW3mVo;{"? $e d#ʅԱ$3(jM8Z`1R @"@b#5'LD ^nU|~3 $9Ube:3*@ZQZKVZRl\m>ms-I@┼. |2}Tno:1Tv^ʂKX^ZR[Eciu$zk(K iÛj4n^0V<0H)Ջt))5o˟{e0QLl%=r ui5fWQQaHlLOd-#7hEIIAPViD5^mqJh AJ 4KI~1<ٮ)+Gbx'1Cp/K2>B:g }&sX=G]ē:Qkn.9D7\~ vACƲ\9JYΓ\'<4Rg@lspKGzϿuCI!dxBMDo4pyL#oWTzevj\vh߾qoyDgJfMI.U\V߯KGp~Ͼyy#;ۺN-$buzPmYc퍢|k_;u5ifam)n G$qh q\gӠWmÃw/xyUZi./e/Ѹ;:㭊 UVWsuY"[m8=@;eߨ~R0pxA⳾o#'?xR~E!A.mMuJlb_ث˶$ä};KX۽t}굜C*1(cГo~}~N]籽;-7] ' H*oy{% щu!;zT| !asHOtlyctb-%BȞ1si3Bb,'zvzu|ɀL̑)+/)utiN[6>*E/sUO8?xa-*[}%H }2ѸLz9DgigbVAV5B {E[ߩqalD|Za>'Su\J[$RO_w |^C9Wߪ'Vi G!mV]Xq.0pŵ_7=Z/Wfsg"2Ue~fL?㯷\?~ßSPnG_>XB4|-֣Ա9߮_㏿}b7v%pLvﶥLk.7z:Vk|dʡt~{b_㯿_,__F{ oWN'3r2){{977-Vq=y___{zk㯿ߦ^\yz iB_S_ӰL$uy+ys5Ak7ʬ;}Xϑ4_s;KIr֯أ,y%~뇑_?}5Z: endstream endobj 2445 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 571 >> stream x=]HSqsuYòR{tʜb9t&,٪ s^aEIRI_^h:2ъd 4"@E]=<u`ԧ1}_6b/hL@ĄhB1>Q㰪P |1fP+~~?DŽh-aYl}f~M2͸1a凫 kiMРe- lя.*%%, e$=(B9Jnu e#'F3N@UZcRy$wՓ{3 QPXޞ; ͙|WN~ ||hdc&ޠMQYdjL8l7SEJh{^쑰\\4_zhn$ $!)dp/bln:0xLp&x5ëΧM&bP\ ȥګI0u"nEldd<HG뜵ΚBR˳׶I=mL8`A>_ endstream endobj 2446 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 131 >> stream xcd`ab`ddds,L~H3fqg;SG9100010vDۈɰU?Q?]_=v}d8ftd`r' endstream endobj 2421 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 240.999 90] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2447 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP? endstream endobj 2420 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/ThreePoint.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2448 0 R /BBox [0 0 241 90] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2449 0 R >>/Font << /R10 2450 0 R/R8 2451 0 R>> >> /Length 5523 /Filter /FlateDecode >> stream x]K59qnT-faہ1`+ϷT/esT6C>(TM߭/?n|_sv|Bazs|6X_B3 iz Gn访˒ڦ 1l(aϮZ>Jvԁtȍy 4yNƭXSb(`_CwpdBmc-֒d9|Ԏm]mvv !C'HFofL[nUe3 l r2%W89qȪ7Mfp7؄mL# ɜ]AP=cE>ٖQ|03M @S_peDR$l3;`Jt- HiEzEF尳FC/fUlg*RPv?':JI."^xpDZC 2c'/ dK ZEPV5ZlD?SC1Llvop@s帺p8gC_f98R_!wb?vuLpKVm8{[wQ4vy}O2a1ՎwT^D䁋-T`>*d7F7rȐPH;l1Ni'NBkU(FdJ -Qti!N {| r2XY<6H?`Jq6U6]( YwuKG"(S[)+|FR}u$3&.L0:{-󂺙'8-o)!Nơƶ'+!+ i znP+" 0c`ڃ LPJGwvelc;;U[KzF>cp}PYKx@FӰd-ndTUVU_{9M;lYԄyR [TY ZCO PU@xjpfU]\lf2^[l۹=" @pm[ 85p|eEz{Swf1Xۗi]['`: ci-UJ"PaWx+wû՛(q{K'oմ9sPc2S?9 Wf%vWE^LYH+An\6LFf9"r"ITiQTq/iGm"}}?]k!t+AV=W **!(r|3;&_9!Ƽ%6Cc2֔p  0"nѦ`; 6C=P,?_h2o:|S@P +\H%RT2 C}-$%aR, Qs!J!BiD$y.lDQC !HR9MK~,ƝJG7Qe0N7B.Hc." *Ow$YN|2"TC4ʹH{D 4(Ƹ0[*T^V"fRƤ%!$& Tƒ’EE$ $.~Qt7I44I19HΞ>R;{?makhgxZfMCq\Q> Ђ#f_tTK>==jG^V`^U*96`"=N߹5~+OZΆ92=5aff'Լ !T  ƴe*]ȍTґ(@5]d .6 OࡋP$5hX+U ״cbtsֿH K&"E0$sR(J4q։]zOaN0B$3 t&U D4:L$"}-SOπ9𠅵;ė'j'Z$|_ޛ rt0' LxGRr 5Z(Udt&I Gh 2Q{ KI^O'} IG$Ik!\/̨CZTzk''uB $t{\(ATZγ_%Wt馓)NB^FN&V@b)•^"۬eζpS@Ƙm [h]^Ѽ'N''g@8WϏϻ.X=#7C<Ⱥ3x62sši7a !-n + sT *NZv)b(xR`+әƑx;RGtR z{A"V$[ͧo,(Vbwp`o\\p8tm ri**MrEj0 .HYZ)W -gYBPW9q<ËXE{ĸ[j RH_R~J+:˸|^k WCD-NE'F|sul`SY$}Ά!KR[_0K NEa!J`&VB,`: 8b^ԊXL {e7&5bֱ,^6)(_Ek34q!Sv^PM{w9^50ƖLNQnAiXa}/qp"ks($ԙPi621Mqde" ˺BDu־)JmVaGׅ:7_PPjfh E[Vm\H=/$l<)Ttfـ6dVt 2LFN0t5"20YyIfBb[C6\lYlKbEfwUJP?QW48ë]PH 5(Qb]2,c} M ߣO-e 'w'ef;2m<[[8T,"dޛ8M;وH!RE.r1MKBm-'{Ni 2&Mm6m%&*S=KZcCU eC-KBd:B-k*nTYJE"s9A 3ˉzN@"R)T+ɒӪx*MB"qPK# ^\*D#($L !2 ]U\"uɐ M_9ΔOC)&V!1$QWF* *D[s3 ,Oؕ}BBl Jv&QTX~\rr DP^Po;ڡ'xuScD lŷ;}o.3 &.nkO=T].=V>,+bC/hKx[zLe[_kwwE# `_Ń 3Jp4Ϝ9)w(] +c"o]O/VfO"sLJNo Tce캲*6u70a&]T0#fEբ&MЇSP!%7{]@hS  pJ+VnU:?ՊDG}cpE!ۧT:˄6Bb[+Md%}UjSځOuūn{'zqáXuϤ]GWz\SiM;B:-p oBNVoӫ/2x#/<寉}7=Bl9ݔ kVϹM`֗yI"9s*4o }|=Cٽ~>OOOSq~c}׽_%wS-!97χs9o(+iivS*Q3cgw-f&lz+cBK:e9oJ3vS_?}{UrT՚T:7S^{ 0dM nicZ`7fl6bx'?ҟHmR&)}l7"k!'^]K!7w;}!],C > stream x=V PSHkhb,ZYP܄Ev C"(Vgۧ+R Q PXUKV[k{':f=s-XsXE%۔);7â9E&LGL|oxtos ^͑bò$A__xG6+V9:V׭nxqvfDN;#2.ȅ2"#rcDf\];#\͸!F7GE8.bw&%~%ik2n2NYBG}K*PBUDS#Q*Qeq*Y9iN&_\1Y.ff;)'Vwwɪ+7Kc,c_p~`2a}a}ZwPBW_T"!b(0VyrHV_lG٠GFŦʿpƲFh~Gn<"zBTK`K@wW2\)^:Ű QyC{YsKll0k3^dxVCoE?۠Z"t$tDb`3AL-7 fނ%U >Yj-H=Nx:C&O :eywZx`3qb3RΫ,C-IP|P6oF/_{hy!Tւ,9'L! 6db*M`6:/x> i'Z2l7V7! z󣕏VAjbM!K7R5wj[ngx0kt˹1I#wzHhHHk Ō=vFVqZaoIΆ@7}%?;?+z B!1{VV8[ak{gT Th3-;snÏ0\֩=tRW6Tryb{h"l جg_k_*B@{/tdȸn^Ŧ{4zyP{.܃u߰"i⓾Њ4azs_ѻ̱q0Mhѯ\lڕ&N<Za%;*;Kp9\:nz1Y!aǛ!|p uȷH"0KFO 2wC6 KXj=z-Dbk𒍶,4lg5o<( OxFh9t IGd=W=QLžAVѐ9CX|[ ˶R,& aIڠ SxOէƴW v*C!᱌ZO|\Bt.M bUqm99=K<4Ξێ/mhm聮YɚRɡI;ٯ_(_siA_^Wz{z{b}DYDW1I >(x۠ΈO qVV)o,o< u<@5Ȥ}Hʩ:'##u`;uOh1-9/b.1?$?"vHIR38@YF4)W ~<$7tc9"JŜ]J9=#o5큜]]ehIGj hd hc)g׌;D>壪;df]s[;qQ@@ϴeoBYgXŸyڋ<^ә>`AHmÎNNK ɦzs݃F{6ӈfs ʫΛv|K9DNJTis_]Ģ  Q4($/SϪB%o:Hsgʐ%9:S^=~oo΍Z ֟7oM6t^Y . U+G⮗?^wDi={W@`~PfHf" ?0Y*:E-9[Esq*%&?Xbn// endstream endobj 2457 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 125 >> stream xcd`ab`ddds,L~H3f1g;SG98300000vDkɰ&ϴߎ|pfk# endstream endobj 2464 0 obj << /Length 2933 /Filter /FlateDecode >> stream x[KsFW|d3HUʉSgVeqITDR&A?o!EHc7'AO?{j?`1rpv9prrϤL(~0)PlD3Y|. u] kB3]*rp(&JI9]gSz0Zv*WK|^ӧ) 9. XS+]Ө. B\^7FgwA)弨fs)ix+)ArŔ]\q`#A~~6ݖ2N.*z9r ƍYʔ~Mq2 M1/kpS8&Ѩ^>jrH"<)E˂9.S]cE0XYኄ_{UI4A`#XuTX[*\EGeMevRb{bQuub"yq]Eb5؞Lc'l!gZB! $wZ [ZSk~OZ_cLF֒ia!E2k^bq1O*ŻmxtDsŪ^7.o[kZCCt--Hi%j .Sko(3,-@n *%u_!lKk'Ʒp]P5ԠhtrDrJ)~e c)8K19 7OG0M袓ަ5ceYX~DV_le=^8l,=-b.*/6S,0S*#`,@}GHC'$ m]=/9vJ-oVCw"fKW'`JJ*5byv*ö'LJdV[tmeyzv3-Ab9|!쿃߇>WrTD#|]w_ bdJ"6y)ɮpe; "kmh>@{ -}4p,tzyw#Uڽ*+m]UrAyZ2Y+u ״z[]Wm愫θw]E~yWm愫)XF*kdHYKsߘ. |3R=u>-؄q8h=2m6I.z|m*Ɇyw80hʦB11:ÅEގ* jp`hif.z:EHjѩ{-6O,YҔ79e񼼊۽w-rCt2A@!@~Qm0كʂXW+Rma5H<444Sx10rftfђ" ~r}M2d2A=IR(?c awd&[R^;L=4zĭ/q"t<wo4m[ ŸT`2jN=vi;n\~zvοMaȒR+pbw42S'x|T]dS]Ursb[qWu s,ɳ\>:B(vncw/ k}imNb]u3v>v7o%7o?W]a=S>lWfŎԢ40n٨ 4.^q-S Q@ \Qk.f`(1 ԛLL !M#ME<P~L3_5ÍxǾ5E5i%ŖnЈbn-ʒq#Jd7G> > Qzy;vh;!x.(4;)K` t-;eG{ "$jgx&Ga:gDVOա!Cmmk5#wKB3{'nj<3Gq7$$PY') ժ8IZPlg7k> stream xZK6WHF"ȤT*]{@+5&)_h")hFvʞ D[}Ԭ8gbus2be n/fȜ")ۊ|'[vW[7E:pkeɿ7`Q婜<]ؖlm C{mk0 .%4um"*Ӊ&mzޛzk-J3˓#{c9ԇ+wpa40"s{C6;"Z'eݔo?|w2>ٷGOgނ^lmVs{J>5(QdBs~+lt8pt=Um kT}*kU FGR!)۪PQ,mCa'ߝHcv ˣA/Z3\"̩־{0<$ 7PE_DM.9yB{ c%n0ÎlS2̜W` Hqa@Î r+Y~'m?}{݇@t0#tA^ϒ 4|2#VG;Rsuc;W Aбe,}ሇ΁TnO=a^U}7ϫ;+T괷z} g?*Q?%#*;@aYiaDg^8gfe@ %.l͉qJmFy$o 3o2w'ŝW)Y R$ft!*{kpZ~Iʱ:B_l(s lwؕޝG&{E= suI@ttkaȳYd;0MSDq-|U$! r跾/B4S}*Y)xf /<:eF2)iȷ,3<.㝓֥C|wT{g@-|ø+45@gS'=H֦1V+%8Z(vC6iT(bA Dyj(dAƸ |%|5[8ҧ$Ԋ |ʨ@"  P7lqiHh/Ϭ~i*zh/pu^xKUAst7s$uDj13 sڧ O8G{ !X\~ʮ+}a&c Nʟr8ŏPd2>0BKe0Pبʡapvpp|Uz::L% O`dp"fLJUix\Z\g'"j$h9*z!GIr2@IH@ wΖ:C˾u98LLAY^u@n(+9~쥂1^2ً1l $?| "^I2~$'e,TC'] |%X!< C{>>yԦIXMVDvY<3:rL`i.?M/,s$V(b NԅVFU6o/E5zlxT_oczPfg ]7bTCr52t:Ad1au@I (Ul\5`X,N(q8KGqT,KD5i #ia1N _z/-l؄paR)r+/Ex 'x K-R |"`=9qRR3%{$hәϥ?3Y&(<+oA97UhQ1A?zwfԌgtHt f\d ĞƘȧ`[P-毢r鋇0C}Inh1+ؘ?wק>8~fx^ϒ:@cT='$l/t* ih, E^2CiЂ5EdTl%1|KqSh|T~lrf\za|I'1/?{\:16~B?kCU%E`Jq7"BNˉ*NƆb!}x̕Sx]q(rSK2Z4v3$UƸKoqo)DR1[o5?FDoh3:?ҲkecrŴ)ğ+%t%]BA^\W/ҬxRЩB Ȍ|rnO)E5T:yaZDeBT^ +u6^BUG 'ҟ\ 2RLabpTS:f e9dKZTə<=בy%rrG͙jzy~ViN plr"rX+\ED'\j1+xz)su?f;y6 y"쀒9Y8>AdCn%)ʘ8SŜ>U8'gBK@JNΛ 0l[Ja*F^ΎUSpy!2S[@uOS"@&.  la a+%{Ke3 5=P@'.g]ne`Xz:,z{erwh6O7whf#Wzvv[ܵIB4s1;٤}"׋L;hz 4gvprc]4<ݍ9%^,@ju3KgL*2.ObzsCn,|nxZgxi  7hp endstream endobj 2487 0 obj << /Length 2687 /Filter /FlateDecode >> stream x˒HW8r ]d0; j[;# _Yz!wٍ=RV_e]WzE/8W`0:G/Nln* /yQK *7 [ۯčSUI(v17A їAi6H|.P'\^jxث.ksWf X/o\"#ǩ?̄rG5ڬ5=i,H:UYM;w_ Y1D9tؗR2oOP:|hQ`~6д2Mm~L5<1CqxOϣت]P Fy!Vdo9 CFX,|W]H a,dvl{:*pF ~69F"[Z$dc=&cݵ3X3k<#Q;!Ҏ.Ϙ1q T|y}^>qVvh桳CZ ^&xhXN[tv *άDTey;?)iykJSg Y[n$N3<X8*p3uj'l_E^ΚkG.mݓܩELfedX[aEJmE x2QZWp9#'"F[;4{m7#)tjS gm9hd%`dfkM6{IDY",d",= K3 k APP봜nk;aL)G Pg͔X@M DIoi)!O*&\jB. Qۺ=QJ9{2{ A[8jpSCs+S;(ofR)C{#G? + e8h@) ژ |$i5 OX҃ 7g\=rMgzdw-Mh=U U͒E?il6O'pF E8AJos։~D%Ycݳ?~9or>Ƹxoա< eˎ97YEVf:/ ~Б|Z-=~5̓VNW/ǘ펶3сe =nI.G(qa䲨dEG0tҦ4a4I6'5(XclBtDC=+wRU6fpi' G}՗WjqҪ!7j鰾HZbK2 9Q qSџ;g4ԑ"e`j+CXv:VU K&9XECk%T ƙáT93;֥}LVirOk}L7HҮ GNS&&D"Qz8^WcwvU9b8'I`ڣGir&Dsޫ* k]Q5jThֆSt.eN}[!d~0-zI}^H%@1L!5M)Z"Tq@$|' .HsGBEW;<@*OHS;P]~Ow )LE,5XCHz3D(ޠ-Ci'zp w] LwFB?3'mL*!cH38+_ TD냛}ea f> bˇ M<%9"_sv<R(#Uv}cp?aؗΨyVn ܆%3*ޫ:7ek{[7#:8=E\%_4Ύ 3N*AFT-7iumM34m{RU p/hۄ8\:evŅpl z@3V1ouu+C6~pG8$-3sc2A*~ҽY 5>^cKQ׺519V,/C9xGGqH9o$p6JI/;SϊMc&nD rϫl9&g#JB5͂fu$/A׵i6>m(_xY#)tۅEta.OIe=^'GCf?cX=7S endstream endobj 2492 0 obj << /Length 1495 /Filter /FlateDecode >> stream x[o8~_ڞITuwt[۶WR0 _҄KhX@d2|ϗ[xkEVgr}QVk"5.'/WMnRyŗ˫/wRW0U(#uO,i(ś &8YWlxPCxDƦd45#d:aNF"Ĵ6 ?HԫwDIÇ 2ad4 rg1 Fa4VKos|R|J0Pt0B5YDH S=7ax4 90phqh!#o0wRJsrBus r01, :] rIV|q=h<&UQgz&.Yr[Z"FJĺZp*DCJ֤oWm|NK"jÞG y.[3PɈLȌЂfnL;ceBj`Hwiԝbߨ/!W%e+ʞ~LRT*&;$6ְ[3lψ=)Y _H:5(]縅󶼮5G# /̠pƐ̹e62jAmČHs}od0+9I;7}#%goeoX\YXrd"/7R*=ld)Qb>r]^\n JzqVNO[6h8NmQ />œē(8ߏܤ"FUc2^`>C!E"7|LwD7e_ZMlKk=$t WPWP̲HǮlXQۀ^m&@:vauI\dz Ԇj]y#Kip8p LVv\hi 78|ǮToPT ~j)+5> stream xZKsFWtǘ0|NRIa`rHZ%^nJӏi:_QE4._|GՌR1-73f2Ud\>)?Y$t,D%)1dͯ˷.%\,dxv۟~xs|/?#ީ@Mg)I4"\|y`"yX$^7;6p"/u tQ_VyUou]SP2[QقSc>[XꛇgT;N۝gxנM(.y<HeD*nn$$qՈ;1<KRGX^ۏc5(HN &(WU{G~BqYs{:"l7Z;w#=ZEhI$$kV1[a;x3t)D(1P.?w.|ƾ<Ú>榎DgYR:I#D E_0 s(5+%#?þiDvU̢F|a^*4zUI )A!} 2+[] tmeffe,P59e"rO͗":-v0cb$:Q($&0}肛$RWgZ}.dYԂ6'D }OlN_$oHyЈ=uSIB.IRNaÞ dL8 5 q1:٭/%lMO.[2Ex$ M|]3 XDd,m=%'R%^DBupXW&`ц6peeaiJ lؚ:YkJ)::벁:M©ğqƷ&d1Jm_C6!q"A"ӄOUVg{꺱ܔ:S=.<^j0Eu $;Z @ܫID8K)Ϻi!XA~9Kޮ`C4K~SjyZft*KJP/6Vқ?=x &@W1|%a9^ *k/zCpZ>NSR IġS>}V* IBq8;4A'_\HP :Nў7vso71wF ZHas7CL3jڮ1Cػi`DHi<ZCC{|hbUMUSspqG}Q"{Z7U=Is˶ńG|m8M*CZZ0fAgdߤss{iU9t[#n^_/G4`070W9xvmnv&z,i|WkNx3g14 (Ch]}4%(\h;noxvz]gE~nϸqt mjTt .1B@i{Rxgssq` >,&{;*_+͵ٵ9 Ӥ,uˬŌVldx+9Brs6aч7|KN֙ oCk-craצF#rgkwY땱tDnb?wFA*dWJiIIFD'$kRv{heeo@0Eߕ`Hf$qO'\o[KxW6+]MLg`N*PDgs,!v Q>vhaA)"ɏ3[@1sS4eϩ){NMY }6f .IU|lbKH~ _8I`#w$$k_ Ob׮`ODEFR<]$RXHa PB1pn،q[=j ?@ͯ]evw2kW?--v(y/1BOx\{V H?BVQ6p?.CC!PyM-z|BIe4׹ *N?KCI<3@A`f4g/NmhZF 6\ڀ~\+]$8{J6`GVs=SX27IG8IzpDf^ڵ\Dd+L^r?ᄍG|"_#?@br\逭ڑls4 X+:;UgQ+}te<+Ewԡ,' iB sCnp捇ƃ~zvsYq(u~7ɏſ0_ endstream endobj 2508 0 obj << /Length 2434 /Filter /FlateDecode >> stream xZKs8WyW"AK8OnYDdk~6Ӵ%erpfb`htu2<}<cDϽSSQH̻Qr>R\}|$\2`0 _\}|O'asVSV231ZpI"d`GMgCq>bȶVL5" Gȴ푃Y8Hn:zօ:vjR r)Zg%E w/b$"5 Z_upH`4[0PC&0x T*!n0`؛n׳8+`s@dC]E`A|vC4;{"q5{=x{ d z.+:0О_-e0[R(#*p_ >Y7v8þ ߍز" |O*Ԏrf 1jJ9B}iP?ūұOs~Kmt\"JNś¥LÛUڄyc&P;nn b BV!M8x5#iJU,?;\$凉'җfS]L{#DįsI=ӨZdDDm$ [o83C-0rp(ւV gJ~\$Wa }VYA &z y}c9ȥ<:Uȼ*Y^)1F tR7+`6Hw,Yb|EōGhx1;ծs!9F,PF~?r]{6nu2p/d\g(pUC"%B+“DJN6[=RSSy')$~{#lDʃ|*j%#)#HQN"|;~ UUisL<<6v[nNo*⨽yC0[]B9`3KK&=SJox`=>Y8␞0~UX)K~t0eB8:~H ULg9min8驺϶vo.S(k8BO3qOl tR!RpA'X!J3%;֝nG=?,P?C?6MMW]-s/)+ne$`lO34##_m. %$=zVi>z*iozj^sV_Տ{`$93Ň 9\iE*丆TcSҥ?Cbl ) g56.}қ.۵0 QycC< p deCd۽ N;nYYd:vub1=Whs v|XT);ri1ג'~HqXmd1:>/v!Otߘt̆3hF p)jF[D맽u ~:*CXWSY8)Ƭ;Vjjr@u endstream endobj 2515 0 obj << /Length 2283 /Filter /FlateDecode >> stream xZmoF_!䋩澒DΝ@k*PJK+8TI*ovgI2ϢRIq\ggfy[,ճgp@)dbAq5o=fA*6]{zf8Ly ǁb_ÙW?^ԛ~ӏ3@/8xʈDAD"ŔYj8J '03b9 O7 9>NR'Y'OَKt'=fDzqwg1dzwGF$ݗt5*8-䭍#F7@`I#b$’$-o1&>>?*$\|zz$-Ϣr.'a33|T%l5y~6[z K1# (H)QP T߭[nC Ctt"1׋$OD_"6}qP3$Yd%g,J΢tY`V%Q;0W??(u9 cЀőp5B(:[ֻ`2OcC7_RCelR$KGϵx/Қ2I$TşygfFcH3o)39)^of\QhT Y$rB5 |M. S@@\+HvJDyB,.pc?Ë}Yg[ƨ4?@`8=4Q89bg*lT1g IO:C0lB].cιʌgL hΓN SjШȇsPr+#^'] ǒJKRQ2S ^~;$rTdznn0׋,T4jc__i^ٸW6jr" cyqa`‰Y\kLڮ]&C E*NJ}6dIsEBtx9y-8BY+"$J}KU׮K cE(t@p"B:\*brx!JC T@8lKѹ L "&AI}ual `nG`oocT.x̄4ԝ!̉K&Q- v{VfxUa ½Q SP1"%`|yRKQpTIyҨ5[/.ԫ vU; -)eo(AU+U}dFm|=>GPu0ϷN:=R<-V (6  _V8Yn$v;!єF,tq|lY7۰*&\V1OvS%OqvmtgtH_  135w6evXQKut`֝`M![̱^e"!6%=؉;sP'Pz]D͠.JZt_cLq(f!g;R\G}_b&+8y'TSNvvBλVqHYVx> endstream endobj 2520 0 obj << /Length 3226 /Filter /FlateDecode >> stream x[Ys7~ׯ`iX6܇\~V썳&V>~ɑ4. Ir~vj(Ɏ-Uif0D.Ft|Q3b8|d8KУLFxb4^xx"^WˋW_տ~z3~w# kJE Sf2a )/N1v%'Bly r{4n1'?_9|gR>iZ5ӌ(*G8kY\\o@"B'Rty3?cx<672^*,yWb"IWX*#GõN$\DH k]o|`} _5Wmw~eW/]\m-.< ϡy~>^lc`6㌫..7@vt+! ;-.U`'!BfW nֶae$ !ZkHظj|%r؆za?zs|}]v(V<ܿLo\ٺn+1'b#Φ5K|[o>{h'7 -L/'F*P#Jm@iz.*0pû-V Tfv2\< S1Xŷ[p]M84t.OeKTl.s#1A{;5S%&fD<fUbk-W"f2O{MCһ Z.BC9̊1oؒnBW -F,@`vuF*InMp^ir%KZ Z+ʱ~*E*Xw]Ryz\"+?}x2/ ڀ*3QA0Mqf)Z%<mOj@u[#@YJM7,Z\x=da o)YЦq~*K0Xg~t QGu# ]Z4tx?m3t,{EBrRYw@`-} ,P[2)Ktv > կ[VZdžچv wYB;_ $\4Qeu)MA#+$Vj&?hUpĐs&55DW-+g wf],v̿^E{MS;){Q䪍A,G\-p9z,alq=VNHUz濲v+^OGe C\_

!B7YÍ;dgm+/jXT6غ'vp8\ {^Q~raC0X 9Qʣ!UmZ1[mvxvv k7YxM땎ncAzDkƹ? -.a > DKfb M;,=F?c$Fs|.< AV%>p|Jm O)+UÇQ Ehg:fx0fc`n%|KyJBqޠ}uSgһf3%є nz)ϒR`XuFHByPl48u-lI VNӐgϒ^6~a|.1T̋na譣cz |(ι0 n] -l !QRϛ fݝxwZ,0 -8HU[T6EJZHb"u-4Gt[ٰC̓QLLkp]Ү퀤7Ϭ)~" ~q`}: +q'࿾9qq|% iAbxRޱxG ˜hБtj N~ck¨j65)?#^LT1{li"9>iW0ﭴ)`{-ѭ9=0ѓ`AbB8֧bwy8SQccOV{Ћ6w+\=1ϯ,UM%?9?|k@dUv4odN/f=)K$S0+x@jT") 4?z<^G1 s Bu-tYn"dB!K]$孺S= 3mhgɓCDCЕZ\]olJ7$KFm?/ J,}UAа q \3_ce+|׬bףEWDK:"50vХOXp-[!-z" C r&A%'ףBkC[rq_K~&GuG; _A3zC[G0ز;-d )gi{(r!$enɓӅ2?W5]1?PX˼;v詢hAPRET= +15u({x!s,[v}u1z_x''}=8ɽ!)_n!yPXRPŲm.mYPKL+27rZ謗U4wϧ}?Uf endstream endobj 2517 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/buillayermesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2523 0 R /BBox [0 0 921 472] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2524 0 R >>/Font << /R8 2525 0 R>> >> /Length 4150 /Filter /FlateDecode >> stream xZɮ%I ߯% 1nX@@=Ҫ9>vШW8Wy^㸾׋o~}x>̚ηy}Ku`+߽~}/?7^xշv'o_ ,VyX>>{U{{/|?o0ϗ/8WKڗg]qUog=F FZ1b{p_ %>!gk%?s1ZD+qLR\?^]Ǐ=ώ3s :W{SWkoݵ8-eĀ@-x a~BE"f;w%Bfrx^_R^>)O}3MW7Xd+'6{UȻFzYsv&Y1}: GOW1#΃aTܵHT /G[.}KV.*z +=8ͪo:Gm9eV򚟲ygU+֠?:о+zR:$ʼn{O|K ,Y])UVMj ǩ*TW )ә”@)MۧElZ]tɝMsq';Z2!ĐnmEAUΟ䤅añ{/%A*n :UH̃q- ~Hz6x 녯qאLNuv=Vh=hXV%ڃTZ$EJeB%zuMթoEӌm:G0XJsK}-y*vb U=tl-d;cRb6ԑƪdm %)lqnZv̸.{AN=F(*XH{t>;H4c&T>B;Ãj g9)L[N;Vjz;e;SzN`FnEBƍ~ \=6N#|)^Y4gr}P*K tOdRd5tFVm%톳h1e/+m%ʹ{UơɇQ8i<lgh4@#Z4;b/DKP=fFDS_jQ]V9jRF3"wfP>6}g-yŸ>^9ܓ\&esѺ@]{ :1IɍPm<S'bF,x~ qq#Pb:E<89xqu#i@,XċD,x%bH/"]E<_E89ވEF{ XdbxXd"EEV;@,ցXxghiĢeXTXTXTX@,XP> l* `b?bQbQb]ĢRĢ^ވ2; $@,ZXX@o"Q&b/to">x{#Yr XȜb= bA}@,y<H"c~ ӁXbA@, bT'b<z#xŁXˁXP> "́XbbX`Ib*"6"V"n:7b"ZE`'b"bbA?xt8xp a, Se,-)38j~rc$0ؕewqD=mbB7pdb,7$ ZZGv*/YuWq<'IT~AT<,K7`*I"0qȝx0fXr ڍa"˜0/{lo1&vْL#rn0(3vh/c} c62R 2@0-ˁc͞@("́c)2r/N$7˜/fMo4#'9 "ϻn(M<;Wq3^u%f#D衣/ДhFMܐ@4V@3M%y};W/6@46wILb3狡465$o uy$y!$nflH`*6t-`rXlD x$G 'BNbH %EO7 ShHY <篨Qme9w%%iJsޜ:Yf H߬ee#LJK? @̫k6QS'_mi{9/\ $*`ET/8R QIo:֕$:쌪Y̶ЩpӼt!TE4Î<3Bh9eO9&jq`3{?M8>֒cT:z,!ٗx5rNIоo;%Mh]h@.1qh/@$x'X9X$샛YeIuK,ql:ҟ#xۖ3^,iԙ4I^:25 ja5xOԳzw! ZEC;Byl,eҳ'{jcGm{n$r1GuǢ<8X–v f" {sMs5˅ 7 H٢s/b;063'%֣4J˖(03>! [Vz&љ5 L%:9v ި^|v -g;=FDq~(QHLr,=_dpt%h>r=x2OHY݆f{}p|/NU-;Fafd򄿲 e~Rr{5m _*/ED4{&pD њߟkĵH_DTܣs$9 }d 9cwfBJRv_ЙR&xq[6mIx3B5HOl_̘(Yk~3mY^}h[uW߀oΘc&5Q`\L}f8kNoX/'3^ڃؖTwˀ&\h6Olq/a^Ng? r}? ߌ7_}ס) endstream endobj 2527 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1809 >> stream xTkPSg>sm-4Jab8]jYD\$ %$$.p\Dk]leۢ3n[ge3a?~ݙ>C~I2,WBInAl駥} 8I0w=BSըa OnIKexXEI0@#*jWʰDKUMLZ(IBq*%zXbOXbX4_S+XAQ(Uļ'' "x8DD&CI'"8"x-q )|,I^wUp\pW/ S>*:ZcV%xQ zĠLBp/oTO^*cf#!i 8<_bY;'m+|}P7yUj9mnI/˯NՊv`f:,0hL6(;'|2L&HoHCfֵzUo -&K4 v8_*4Жh}rnhvBa.4<\W`1[}A7gОu|/zAh,uz 5-FCզ`oJFgYth,Rd-%U8Em-` ŗ_;ToeΦ=Z@ |#B5v^c CK48M0XtꔡF47Jㅋ%h:8.Գ^>E:zQPgVKcen^i./;lVB wbimFɓB!b{u;BK.l쒶XlPl֎ӗ=jey:K6MBAwB[X{Vo P׹0(7-cl̄YzZY^%J)z{YO[&ihC\/O$8"I[sL)"~793W.޺/ v[/^‘_`TfPKk5(F&6+d%Xɥ"p2>r`cN8H~ۈDYq">I`5vyg{{M>UYǤea4$sH *.$"p݋>N(\܂!2WDA2пnFm˓B7:YaF:ƪw\s`EQ3L+ 瘥-0%8 ; 28tA,s;;9$m h-!XSe>:Oh5^죩# È6-wLSaYGkGtiP9,ڌ7ab"muΏЫp6(wWW#@LnR >}%fd2ٵM{N}R0h:;@:{nhb]{z-2uQZk1@oőB?1gގhk2׃RDV=!gpP3/K]E.*耷]ߒ-ӝf;=oȥ4LW'Zxʭ,΢Tz٫Cg_3& endstream endobj 2534 0 obj << /Length 2697 /Filter /FlateDecode >> stream xˎ|4Ȉf? {1bo#HD$R!)TuUMg4v$cf/~|ūD"*D.n\dEI.nŇPۿZx2͢<-EyR2]&*Kͯ?Ǜw7__by/yp_Pȅ".^\"fv~"c?,,slpR˽6µ^V2[usj5luu?>gɯocI\b߻r_W,)5u fʭ-3u5-ᘝ@nH\H[@XNG,Jz9]?!u9lLcr=)]U-mwC Tx~eUh~({ |=[X[< "[ZÏLeSRda>- a "X 7mqk$E%H}(vulvfb6 v jر*: lSUL6 C[}OVw=[]qi @yvE!斌צ&i9)ktqz';_nU |51<(*"]yg= &{Kw|IwLH9|$=بn&SH5s2f"R}kq*X0aaf룶 e9bG2XG9TIڕf?O^EK9iε|u|NtjxNaguc3zQڂBGϥی; >ı6H#,RYa垊aJf;-aghߝB̄ /wϦqCū+_usGJF[q-Zq uliz4Q]6ge 3|=r(I^s۵6׬)<ߙ]8әBœbH?G:L_C &g1?#9NZBG;O z`awȱ^PQcV-">F̂LYr IGj@ҏ\pՏ$-ru>6_'T-bYQ &W➐ICFi/VY,!R\;YU-lC*F^U "JXhK!/AWb"ύO8t^D1hНXpJ~4XvprD\#ڝ*rW7@p5z{-W[Q/!?!P\Q?ye\ .c7ykā\CZr= 2h#YNNM1VXNT:c981LA(D(|F$yi$|Kהvtk)+lάB`>i׸slv38~WX+<rKG˜􃀩eZ?XDB^cD"Xs$iEdU; Ǘ11GX쀰KLr̕ ])^8h:MTE2H<zrŸމe=,K~/; : 0=cJQ2Y;aSra*sˁo$صZb¿3Yԭ$*ނ+>`KA,YaM!…o9:a]~C4܏GUQc,=eM (zWi/~{Â]Hf:*P&>T*Ų,ʓQ{7O&za}ۣ˞}wfC@O|UWC{Sx 0c팥y (MCd,p*, U'<ݣ}X7lhXā/+LEi!xl}}(1k/Pޖ 8ϕә&1P6}Ih u!aAЊ9hD>; RE\lUŸ@D,"P#o?fkTz6)Oє TjCebP/h1rG<^.)SFZψ٘ 巖s!2mREp_/HGhSp/h͘p~'Ej[2Igzr I9Ĵ,%t)$tWN60a .MIk RâfpdϮt3jL)efD_ƎF8jӪ]nBg/|7f k6V柹rؙgMm̢~7la93N">-!2 ަ D=?yET2u,sv][r3rozx9Dh5ߪL?^E⽫fWY*lP'?8/4QQ[)(ee|s ۸n#)ݻΔ;ܸ6߼5>;Wg7_7ݿſ6+  endstream endobj 2546 0 obj << /Length 2007 /Filter /FlateDecode >> stream xZ[oH~@y"[3ͷF~nZjY)EV{bc viWa<>>s9cܙwp͋ыk!ȷm:.(s:ik#iuHŇiQv(Nw4S}1O Ur#b{VE0_z #N:;>H=J]dS 1nO{cܝE:;90D7S=B}dvd!rTI2B$Oz`x5@4G:=BvO*D__rS[ͫQy^)`c ÅX9)'83oY};;&f[RN;;f;RN|ݎ)Ckkq^K#n<؊r@`:n Em}|ɢF\G@_֟6a*vo]^+Iw#FY"3M7uADOVSؒvO%C؎[E>~qX!֫jqX<ݬ+lx:ӕrRUwe4 ^_?CYYfi6UcqWg{\R8{o  "]KBl@(dwђ#a߄F*JjxXMnVp;HӨ3Pp_o%KҶ>y?N^gsle@Wx!})x e@8N6ק6yՍx*|Q-Z MZˡ\2(Nyʧ7QM!B&JpM,m %,EZ/_֙0"2@MTL(ٲFܪ̔fKzυj QW™:?W(90ľ$[RNFk؋A쀭S߿kal~7ۈҨ P8UXwj %aaSv4蹥X/( Kx^efTa@R؆t0XKKT|u4]T%ɲ "1]i 7u$Md^oi7=]i47.GڠklD/6L9 MB)m\Y7ۚ׏b=wb.U b<ζ>S_ΐVU%gD @1FoTJ!B5ăY-Ҭ0R; Bx+.W*BS,L׊~z}}[wIuZsx׉Ug稜YOX r M{ˬqmB?H6&np]H~[ZQsgzFYF[U"tx2p\m;=NM6@)%_3U(&~_Մ}^<6y7BjpVA'hQ<n`Ӯ-ü~(H~o Ɲ.0vn)d!XVܫ@w9v k*jdn٣t[<Z۾ #Ǫ}C6&BTC̢XT,YEe&$u@x a>mp Q4M6fѭ^*f",݃s'?<{jM1 L= gg*ORHjleigIp5˭֚ƵONL7L-E:AR1 XS?U F96@j-lԾq8_/F/} endstream endobj 2435 0 obj << /Type /ObjStm /N 100 /First 997 /Length 3021 /Filter /FlateDecode >> stream xZ[S9~$Ee+5*,04wL;m|8J9n9т L KD`*7iIDEdN" &5iaR*G9&P- ,3I +@DI&b2 OfJFb#Q`! hK1yb1*MjL$BWfƴm`Z+bƒ^HA459P^' O"<1?zFu-5B>0)dPzպJzw_7o Q+CB_Ct0>~5 q8Cb{QgXܖ,r)^ba.A]?#r+!.e _;9oGHpXtaoEg~wLVoڣ|bѿ_mvѻ|AYUefW}La6FuЖqqӎΎ7kxZ`C2]vؗ\?r~0oEs`n$[ꑌlkBիOe|>fM|z|t.F0G[BAE,ѡ݁vD[N!)=} 90t%~ \i3j*"M /4!j՜(Y7/ʲv4? "ʈ=uVbCw 7IJ%".P*eg1Ks+gD˽(SרskoyZq#GuYq sxDai@S}'@"!"WRJ'pY<~Zt҈\U8NWMu>^ߏ:7ojh#/oRկ<[fMLlZFJrTƓXnl)y'5~_0*dﲃlBN֝cDž\&EmL\QqFs#A)ʜyyMA2)6Fu<##mq 2wwlN E*qSuГ?T/MFpK>YХu6&-y wú s5/>q^,XCʍ>mgyO*N ܃؝(-TOqL&QH@1]Ȝ`9ҊÊKaq ZiciT^cK̊Xj+kGkGNZ nE4*FΒEvZM#5LNiOҩvf=/эQ(H#}(1&@rE7iDukA@MٴVmď\?q9r'R^J zM*&:L,2jZSL,r Ҭ =נ>o0tLW-tAQ0.hH*mrsB1na D!٢B>584~h2.DRInQT}t/om=bŷ`]ѥutRmҿ25:UDePiV#$1 BV`q##򈍜gv,]뵿Û|Wu82GivK|xk4?=g_urϩ'[rn)Cvwtˑ nKzm Jf﷤'wiiilnCDQ_PG:xiqE .l_ujQp|KC^zg P?!,`qA''gx]?9sN5H#RCdO"cI7Ɖ0kg2˳z ͆(ݶ;yv<|OW:eY~>6}5,\hjQ"Yf`繉tCt;Oms&]zϫ=w]Nt.N2I ̦T j9e8L{9|w7Q-\(ҁ P 5u!YH4?USH;FdtTnnJxdKtIMeWȞ‘PG#yr3M#ٚ8ɺd7jImS xTnhC`A6u7LݜwNĐ"pRvn5]5~0M endstream endobj 2555 0 obj << /Length 1025 /Filter /FlateDecode >> stream xKs6&ŋFԕvi Y*Sh:] Eb(;>tl.Bf~{Ky#%x&"O>4bT@i)j oGWAAV6y70zD̏CGǰA=iNdawp*jU9 /\z?{|:aMi*"nݽLgm ˀHy1er;;2$AnrF^Pߤ*&`a)5Ԃ@̪]Sv_UHݑɒl 3FZ0FuHfV-;OZۙ1JJڡEV"ٷ'U yc=bpROz[8jހ8 .t{vLE:`Cy M,l l<]'b:4Ʀx0 E9th1 a&{g-IZ60ak nf#`pWϧ_LZ/,METrQp|bUD7@!y\Pg@)#P:D myP]H;-;Um(By% endstream endobj 2541 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 599.999 599.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2558 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knPM endstream endobj 2540 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cube.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2559 0 R /BBox [0 0 600 600] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2560 0 R >>>> /Length 164736 /Filter /FlateDecode >> stream xK켲ߣ$9L I M_d³혝[.,@ #<~G1?O'|<?rw5C;?tݣ}?46}O~{^kv{HڪGZ=-7zNm>?hҫvmO;oKcfܷ&gs>-+70w>]?VfwH#O(܅Wx1],mk4d >{?_ך3-,'3w:EǾPtjh̹:ToaK%kv!5~ΏvXpŽJf1Aԑh_}l~~g<1e Ig$ZUGy;?>׶献_1VZ`Eml}֤Ӝ>oto_FvJ[{\n~n Ms NbgR֐wgՎ<٤nwWlIv׵)-bYbWo+s+;`ݩ勞:_U|/)2O:mͧ+9 1d WXM4tn ?9稄A BϏ̸chSv]Zkꆪ;s]NLO/x-/>8 c^ݴ= m=G_4Yx9c-_mJfyys٣[b.:EZØ^E?Q*eVgw)ⰠOrxק빃r\ה8_riZ~{ "3qlRC xcbWߴkyv/ pbys! Cu+rYֱ '$fj۴tqɼCjDjF]ՋҊ;2d kR3ΉS4?~o`E䕥l|!8k8Xqe^GV4 Β^% w)Џv:j!g[ߺ҄C/nDAu &g8ⱑ9Y3 +8&[QL^hFiz?g'Sp[['NGx%\UBV7![Ɛ4q6ae|~X5rAZO+o /saN(#ZX=(=}yaGyaE ՎY%Ṋ\܆!a-c|29i|  gRΐ0m pyҩDhO.cfm!odntޤ!L^֘)l8u_'?~w5z̙,scGËy7 ɸuvS/ps+mc\P٪Fkk+V< a_GPQNsoMuTVsJ;LlNg!O3K} b+պvd=yJN~}tRqӴ{yᅦ~z7UCyNJ}HoLͤō}kT5}|dcAo֗HRoDT̂[<xT L'X|U1_2Ѹ)bOd`\o69Pws: K.铵n︯[< }""Nx^@O׃{X^cYE NC'10`p KCUq,@ǥ'{5g8=~tV%|>b dJ!wfAwleg?qqyx\_'5./)ҡeI2Sҷ&DxJ|/ӕ Ur7RTl}S/l [\[):X)'koM/H#.ktemA$'^|3A6Sշ=$`}DaAiyt KtBv0_떤n܆m[jȦþ@x7iB?Y`8ob֠mʘV4!pX^tkpr$jDZa*4S1cR֐EJD9O`_Gk_样e9lB"9}׮rcK=vrX4wqӻpLBςmMP%hQwE36D{%8# j֩F(UIAdsfkPOUӵjbY)PYɲ [b,Y$lZ|]*T׉B)XY$."TG-6F+Cbӽ9 vPf0p z MZ)di H1x>)>'z* O<Ct,O pPh8b2@9]0}TZ 1:4t"\} pb*KlEޑpǺ/QER~[dhɲHO^zxɘ_2rm;z&6s׵C~}&ǰfCd4# :eB|tѻ:pRЯgwLkQK.WhYp'uW>XڰG6uj˴N-,BN_p3@n$mq j-?COZiZ/NCs,>wRɖ4ؒzߥhձH, B 8= '{E8HsOn[Xc5= v2‹'9q[(8 Xx6_d>rp>EB{ɯ`[-2qt$&f Z&9s2?=Ӈ ^B ' [(8IdM4y9}emt a<IBGܕ0'f JXxpdҵ[3ĉ԰(SHo.}Ek*tS'N*& {ܵ IPMS hڜMw8ו[t絟 jj`οNASiM08nNwԲ<%+)x - y# W|Ec0?4*Eձ]:ワ`i}+!\0t,,b漺d9gJQX% "}ɡx a # - ci7[4b^ºƞ}|@Do{@v^fߤaISCsmY'WAc*˳D.ZtoӰ(-k,`QQEF#NbQ+;x;Vp0=rD]Zu,OG~B|B DpRKckIV( O฀'z"8j&J8@,0u ؓ O߷|(oX5 wc6ɼ8ХCGb.m&MYLV6zX/kN|>\kTj 8A7y&BBh+,bgy+y[ˌRtaSyζ в֟n]H]^mZU})q n-U tVʗuQsoH յ֬ƸYx|;CͲ,:^JNwZ25spui{!No(:Ir ez5p izvmsڌuQtضyF顟YkbNYܜMah% ZqBn0ĵ 7h?Yԟm+Iǩ_/JZmO@4's1q>0돲jnN?EytM>XH%ve?YQO=J_*?auѻs=0q>w̉YC›.k yUhzXL Ao 8(2HN!1o P/U≣`~pO}\9tZT˸:IFXL}vzv)s9ܦÿ$.o ~U`?S7fӽ_EtQ!2.:@_>TħBAohW鴬5"o-{L=ZP\,7.] fa= k{b;|k& ubѓU :ֹ͞j(ȹH_A; ^l [V7taǍ=lc&s߱a sAgz,.D&k+V,x RG$Yč } !8DvNa~?8E͘\ǘ}llj)O2HsS6+'ǘJWTRdL,u*:{OcI+OJOl _OY]'i@V!Jy"u1~BmMBv}>r̹tqHhkC.9?݊U9by*4^gsp~;a o*gːW3)LMmҪ܋%&6r8#2'O,G?JGvlSd?:4(t,@;'!p,[&}zty9u?EQrү K>zmxuI0%,Tt`i[6"tKXvt!N6eFʦH6COYBвDןߝ _``n U6YxtnmR#]Yc}0`9pc+SѦϊTWXBUt c +ta7,7M'03Ұx5̅ߨYzPN,TzuKD\lt+# 8s wc|dݮGECp(Tk?^%{ K_Pg9N{ 묡Z0͚HȻNUܧ-8lAۂUL T?1G}1 LrShkvJ؜VF`B@ nuvys~Xٴc3)x9gu$O4C4S:cO**U]{/.If5 6:庭Q QO(phJ "pH,utErVy B֭HE`ҫL| @в?ZZ8;EӰg<2W7"&bsdA~Sc\ɀ[ cT e&%B}mbZ΅8ðQ̬x:.Pg#Qf#`9nR|`$l2k%t&^pOTx'/ޜ3s*#]uCy"8"R) *ZP h$z"+sXX] nU04S3|y~VzDGXVC@35 gE Ꜽ =Mx$+5e<2Z̏p/ ~}ݞ.N>B<_t̘q} V"h | %?e(oy&:6,Gk#Ox"n R_n:C8Ŗ)vD&-)2.~yCQf'M9:NWrmXp{2[hMz#ɒ`); %b+Wz{2t'Ojw6/ĶEe'6qAX&<Љ/2'6c7ڵaIS`ݢ3 +~:VT@78߀'8`Ƕbc{;˂+0ˤSK` hlUC]qo7 CޤR( w"Fsj1=_JTeS,R۷zz(> epM%!>c`7@˨dOcݬ[oPcwxwPaGIXrN{'gS.+;B5YBo!|`jnN4%ߐ>\~,6󵟅'kE濌ӀɞzdZZy_GClY=U:6B١ xk N){y69V/nwLV@a a'0Wpro^௣|hw͞hU>mjmZ&{FS,] b<iЯJq>0.uob/(JV "`66N|fe &4K8XX}|& ~ jCm2KI9.%we+@Lb#[rȘ)Oə+}s9ܔ;+,:kjhad$2A4,*a]U]QH 1`2EK#8'9#H*/mKGgX\+ 9SYu9õnu!Ci]icS _UAٺʭ5kd7'S]ld*bGf +KР,D3EfGy4} _ufLq IK[%z`n맜0Ѝ@- 04${:&|]~RDeT>pǕ=guxO)?i$VKEBKByxb vt2U> ")SؠE(439jL(ӷsZrr`֯SBOe<՘~BKR޲Yp,8 CmDO`;0ߩl*leWŮ[K wZgiJy1(zR9Ɖ\[>KVKLQAG.,i5!NKlV}`_,]eU<V 瀞)XuR)AJ{ǚ@~nJ"ՈkȐ!\sOE9u@23?_Ih74B(vdYr'~'kNeסvCZz_E i" >w=ϝ|? ௱rP`0N$GG!k+/<.8zH@i@xUJD+71?S~9_?Շcdy@J<)ܶ?HK 'cLwWe 1y {C}J$m*7-[:ГSd=\Þa,oG2 Ϛ{RA@ (R nrcNs&+(8i3 p \0䂷iM١4 f}|Whq-BԒ&4d Չ6qG+WAm9)_ξ(/g1Sn ǽF 0fjy&s4v8*E}]ˍ.+ky W弭oXE\6@` N7F+]@V4J"LW p$Y$3iA&tw/&5q@:sFY$ nm4{_]I#Ұ -Pn^)v>#tqzTC?y~ Afm y}qCNzNB]شr }~.B8:f}9FssSz`93O ] : B?nP[H4_K^ʜK={4+״2 ݸR)mc\`֙5dۤ_8W_w5mGeLֵ7H-D"mp"ϵD{HL:2#BƟuLx} ӳ7ʹEmKwGy$$ C*gTd-3VP&r50'#/bХn zd,|̼ zM:-f>&]g ,HqK!ZD]Y-2ZY%fsክLW ]a|GgG7A\9reR㺞0m fG69c:g}pVQm<_o!| Oh2&fH !)i -]e퇭\EϹQvw\1¨pa8{3};gov5EJFk;&<{Jݩ⏡cJ6ޡ z6j&d'lu0_kBȦ}EEOe[69ZubSՏ~\vrl6%%72-r5j"Nzjư4Tb2eP|M9Fb4;NlAyJ|׋3Sz!CΓ:43Lju+oF2U;RȎ{)I 5h@(x_ʲÖ"9_,c@nGUOR&  CLQ)DfjXZc,AVYɣu(Pvp'Imc2_ZYWդrV}CJZ9rīz̢NĀua`ߧ_M/t4G^!rtKYubnSna(YMhY e0'"|KnHԘq34׎ݭw)#k`1ƺt}>l՛B&ƞ [($a,)l)2 kQqƞx%rz,Q5cQ9O!x 0_^]|t[c x+}P# drN`>ge_T=˫>[&EP2,#WaPJOݕ,Fe)گ?h~Ɲ{KcZg&Oc`}sJ6LZ_ʛ&\{"(Boad%Vӱ@źjg,ܱqTiZ>피< >(jFS}lSe,ev-`n"8Pp9+A@&ob_/@a,:z;>)9tZ,\WtR^p.UU'-W*eQA#բ +K_%2@j&B5h ~Vn 'S/Vss3 1)dBE WB%ADoF5~u{8.W}^~yLtO`گ ZQ<nU]K7&noS]}% LY?H7UɕD\fE•|[ޮC;O@>3er|\v~>jmVpݕd2T뼽wx*@hii}dS8@ +niXa @Žxt9D}§4NJ kkZ7NҋsUonבINOgS0d]bBb>+α~\'eRdU|8 ( .(6DEut`u3n.pl<>A۷T>y㡟ʼn-*Tb܌MCYK.!a.K -N%SuqT{g(މdt-DƓ܎4yfq&Lʷ6VGކ1כ2*n.0e ?nl{x+j:,} >' DÈk}  ֔˰$NY[iu CQI4^ˣIwNa=bCW:`T1P>s{kdt /\epwww?Rx|6BiK/4,)rA&'kW4Yp44V2d$kv@t"z{Nm|hheצ}AH@ZkG?)2[LyY qY0`F=c rW?G7m'uK ގKBx]kO9գΨxDScl> Mz*xl3XpX]kcWC7N$&,mie+5gi=)e=0b7TPmOB트!-JBZ n-6Ćw*ƨXDC%HZconf$akU)RҫMMղ4Q87 i0bF"tSidMU*"!<~{8KDW-I+Vxzm{oY0VTUM]P$'pfmX:E dۤ27;n)L}g1)\̓rpt( c|B7^ 0gNkoݴ s0ؗHnVBh?ӁI_ImCM9llc7B:ldBB+!BGo&; 7Vh"6E׎ F.^n-sVDzS1>ч+(fy:6 Ъ(Jc*ΤYWhѴb=uNka˸(62@#wƤ@le2 +k|.wOIno<Я#:O9n;\PiVJ+,1)iIfޠoE?njkͲ )o9C.ܮg$X(pW[y]a8\3[a-5,x{ח mf!RޠG77Ŵ֠XO*JMtg?z*Kbz 1 DRqt]4ɑr{WNлPIy3m8O2ؤ%ѨdbT[@^99g\>V u*fV$mRnڤ ChY0_,b[T!Eg,WŴ),{{ًpXWbep/*2m1Y bz-m TzbI2C2}8[ݻhrYlޫ2+=(R?ȩo*h]Y]le4%qN-8jn9>Vb~SWWkfG#37qONibzLK5+ܗdž@S՗Q ݋a5*Xjl<($pVG*2ט!ƾ-9nkcBo{$DhHOKto=uxJOƠcU|P./(|mQMɧSl*5cOgO%JZ->QR&晦?^j5Ռ=I+:5iQmq=A[ybk/yOP'L)LT$gjCO;g(R- W{ y/h+'R N+J@'Z::|Z22ŃT_ǎ誓o)݇gs:a46PbcL- eP0*+o5QdS~e;,@M\7V-. o$EԶQjbk~&a/ޡNSژ*ևĹXi (L Nc ^.>kykm1NVBDw4#vbM(",݄n= h8AjM@ϥ"h{X;΋G{g)y.;Dr[ |֢Eo9P^P)M?l^COX+9t&؀pGꖊoQs@CrF>Eq AM:W')98m-uP:+׉=p9d 1԰ <UQy)z1yA'C] U7c;O ;VJjH忎NB7x7Ffu0Uރ_u\:y}}{L/v,h{NcEI)Z ӭC?g\&t떈'-q+D_GuNsoʯylU'_CLe&ҫ*6C[QFk\m\/pUީVaO'r,3xnFuekusƮ=V^;ӏ@)B i4O<: n`q#KhUˬvq׻?vN`X<*)룻hy -DJǨ92jJm^)*0yNOGF]_zlj %Y;KY B},r\}9n&2=S85B&kl-ޤSڡߺ24[?L?T1yL(GG93畠\L-gQ8U]<Lq OAWNVŸ?surЫԭT  hҒ-CAal4%ZK e%a-/tؒΪ6ȓ ~C!S :uOqO5k ;OpZv5o7Tef "rO@!rP鉞@646tu<ĻWOzl =[>9zҤVW Oŏw{Ѥfi(~/;,Ő'Ȼ%?nCb1شDP*[ؓ_o`ŵt<ۭ":!4don[0P  %e+IH6#WoK&T%3D43@@Ř`֚Sܗ9ӑgt\}T.[ttb ) S\:/`])3]Wh%[!8m_׀r>vog*$r&#bkגs>KE%]N[,dACB+ẴBG0[F(j2{ϘeɃځxVrc!k7O;s]efGzg]eu4fWMFv(JرybEy2|08ͽ aY`Jò&WJNl]g!W;sVywH3S-)!9XbMx?5}9B3S|V $n\ TBUޗ /XmHZ $1lh)>ۧ$P 4*]0DTpL!P3E*TR|o"aDP  GIzK]kZp, )_n Rs8!TC5Le4\}ǔeJ !3.,e+8[j)0)U鷌5M ̿ Gi OW͌' `j>7qGXYQih`z Lav>>b >آWEEɓyf/-inPٷyݮX횗vͣܩryH o.ZVM2-1 "bN%- ^qk={w!ek3V8Kw!ܹIĈ۸&yx7~RhRT@dv@ebi$uG)7(!aL&K)HBCW@:2|ÿk%voSgtNc?n [s8/y; ./ݔ}'r='}Mæ}nb~z͢' Uq_aN:9DeljBǂ˛ӅT d#CG[ɻbI$mvRjyA,xrۡ_o!|4//:GؤIӛln| pd8 (g5JK'Ȯ(&+4b0/*ѐYHV/2'{2Ns D-ꁼa:+=mNgr|>NY k-]YkY {OzOw"<#Z ԋULjv79KO7V{ -]ڲsU`j j΢u&6-MĶ2q2檲 =t\<~;?) rֱ'ewJ Iw!jεj7()ٲ|tc-N9φ5U+֎YY媜kbeׯ~jl^=KR^]u|d]t׋3(bO[O(aR"wDX9hO\}ʘݮ 3 o?IA}>wV{Kfx*C?O':cPģ9IBČrɛS㱔TvͽQ6AFb5) ^ǔRHR]e@Pq]e{@=V ~trpxZO {8$ӳpFP%U8pR8ֲ\XbCl||[c%-kfc{ PVgUX++h"MVQѥu"|QZ &P腆F/&hZ7$Qݐ\.}N\Ŗ*vD,̶Q3G6V;4MMS( =E+(*(m _|` տj )nH@;W:#lk"P}+λKdKŋnQGUeeixMaB-񺮊L6]pNנ-meY]CvB9p(}]@`+r8܁e E?k~"6뼀N(4A氲rMkL)!Dg w_lr MۉT1Rt'EKZX;B˫Kl%x,GùtuC9 }h۱BX#Gm?T*\꺝Tk1& / gcTPHP%ֵmufk+(Ch c~c)RBZku; +3PPHbi@҉O@"8&Onӓ{2ŽhQ/PڎyzG%J܂{Tq;eY׺^@,  \|WҔs,s=W,z&QZE{NbMxfJ4t Tm awC |);7m:œ#ַK.h5K` M?sg7*J6m5.- = 2;V 8b:(%2N@1*[F g-e">qZ䙏9Flu%D?Ҧ/ 1,3cnHۚqʹbEǮ54$Б /IXKmt9I~4 "ZH^S2_;URmb ՜mW꧍Zp2Lv@H/üv 1Ƌ.5}[+lQ7Q ݌j-[ e3(v9=/#U p AS@qc+RzG7WädKz12PʸqdLZw> IWL *mɄ ::=i&.5>"z!Vuq  p%-M '35)ͫH)#̐y5WloLC̻O1oURk]K. .JרeKf<47i~N~ \yInI'A9bJNeYM q|]K 1.zL&< Ow04BƆ2Czui|j&{eq,F'=꿹ay ~S!/rdSm }~5i=>- = ~Or鉖Du)e,#2rrR$݋Jf?+E1U_ KxPL4]hVbl(Bi-ܕB'7@k;= Dsm" f&OP\]W ;y˦5p\^BRW+:ѥNUR``c#Gr[ԮF2,椲++[_o*ߐ ҬS4ݻ`/ c+W{2~KY=b2$1[n gRoˀ+{v}7,Cqp;N;}#4'Wql341,+FbYo܎Z8oiwеX@4F$ʠGGӑm)=4%0[,fC)5$Gha'uoj[<Ɣ`p t^"qq˦y*KRMXL 2)GbnWuVrEo(Bc;cskp:j.(Nfz, "JkAЗ=JV WY|47HX;.?/-P+rD=] D_Cc郌'`GZ--]?W|.筎c;g:Yy3Be~'+[[c+%䧏eMz4DeqDK85V<&w ?_[--Z 7cun` o 0KgmBJփ`xGx2Tnאַn !ID%L%h1m4Vwy6/iVoa8.( -]`Yd|Cn>p}3Xv Ɔ/td:.=܃(Aܓ(D@ b LI"/x$cz{Z oM_GЬKkMߕDwjO6>@SZzس .G2(d0`9f ,ZYg P -K_  `#Ӱ V bѓ"ƒ|)87AQnX`mxco"6qFLc7XznCi~LU&Riݦfgsq w+UMH4^{>.S#}ʋvG|+dx$Oh zʯmO@.,DY𧖿\5 KGBtx8,c 8+]f7Ai7=2hw&ůAͳ%9s`[w(GwM:1GyV"$In~:D4#Cu=<Y&?d#̱r"UG^goExVs=S\nA#`P4LŘ3}\1_=93a:Ծ-԰:gooR&Bs {XVޥy{|g+Z *E ^c9 t?_[k@="qj"EH:5,W ҇M9Yb|Qto7Xh ŏ+BX)4I;tR'+Y`"إrK+DO *t_/ȉU,yEʹvŌ/ vpvpnX.CsuiM Q'(QcK[z2K}'5}I:1fyCυkKK[8zn9^$_T+)Tt)bH'~_:;k.ߚus pR 6k JK g!~C.$] JEU :n}Lį䄖% rϯ,.*NKYkz2Jm.ϸQ(xK+[ zԐ)@$YYvU)aKTw)Y۱tsZZ]9H3KPl*)s(qU⪝g}?EcTqX( ݶ#U;L9~V²V@Zcn1KnFĒ[7G },t[߾!F<$ӇghiI B<J^ Qg^W\#P0sF-fMD4_Q?]\u̾ pxP|~/{[50șv7$yϓHITH; œR"O`9>7H9B!m] gt%AP%3O=O`=0"nWuW11a]kͼ1\Uf% Ki)Uir!g|WxOUҕ(ƶX&y_$ qf$p0*B,ZHNJ{JZt5>VX:ڸ!.CAw#IW5T ^U" jx7[@ЬasZvblibCς*T=#"loM3ϻ‰]u3IҨa9G S E8 i9LnU|&juJڨ43㉸Klabςu6s6PuɅE Zu^9'iB؇Ÿ6~!ڣV𫮖HzȀGNZA&l-F',C} Xlo[\)ZoyMlƠjqQQꦫwv: "5!ԁ][r<W m}T5Rp:xM!6\"ȡ_~U6Nktyyo6/qIH]I!!X[5j!}׌3Ez —MZ_r!1|)\lJ}tKM^GyĞּ9|<8XO xc|CQ׫ .i *⺆9LkM,kxOu(FЈbȾg#ts ~mRx߭Eqp\j2Љi`+g )xwy!&eqdp,xZ rX~ B=RkL:EaNYO3 "yK1tw0^K ן//r|;;4`;]3^>ɉ4O!Uy)z447XKO٥= _cWvߴbU!-ݬOoy$V*zX(Y I/cYt8z}m]=8ArMwm&DPe4*#i=< Zh6,jzT"cz$0AYRCw4)q0f1~!cRؐ}` Jt5 gAimBg UQF8;93BʱalY Op/X>둔<%m=.W&AlbO|a Ko\ԋGGs 9wx ==Ǎ`ϻHܪ`DPͩl('pFߺ,}PI0i8ŋfی=1 Pv$ ؄nV(EaK@8ݭ!I]7HHd'͵#{?>CRG&DBz}2}_OR ] \;:Ȋ2U0Y3u,IQܔ6i~W N,kyW7ZMZOIVy]?ўv= _yF*uY MmlWs[7fw.r5'YPRءbCq 'h_r 'E|Ӵͅnw?Wn47ZkVOo/W})9u-WQκs'Ug:]}j]Hɓ+ }=G39Sό:|a-ĒرXrkiqdGŭ쨏Ҧm7$|sv- ͤՃxi Ձ!U$t2 9*G%[j,o? 14nh +L?^9edڨf>HwA}[ Me2}**̝0f Hc*Uzm~F{H# ).bHsF!y5F:6K<O&-\.}]ĸ!@*iM {T{IXuovںvtKgCa{`=p^ لqy%VSFVS{B8(K0ԂvDE'iucڬrmQuԡC1)Z rw,R b QEhtS}N' Y(Yռ6Yy슁KVXomל ڪ'^~{IXMI.ǰ]7KzGJ#M֯m>C~{I=+1s1c~{Iq96\ԎN*O/~ /gH󏀀]Xoiғgtᷗ[5k[vV z$gۮX_'n^׵ӻbm/ð5'+v{cERw>'44rrvrV3xҼ%NubTk+km-#4G "-̼Џm7&E9kxzEE" _ctWi|}OL%bSS[b 0[ݶ?L!W6'ytvuнϨ>}0 33DHΟmُsv>>UO#n78=^V v9`QSFCl~ùo8+(94c:e翽ɺ9 ޖT7 -Y2:fl~6YqH>T׆/̚67sOى.):YILrS~f.u֛Tx*ҘO9ҹsg,3HMkzIz^=!wtJf'KVOuzT5߬vyB)6 8MЎ5lVj ac着Ѵ W5VlBR*R)LTc޾m+3Og'KsMpkqS\{I?#4Ե8r\O&ýKL4ܘn U:s6D[ v%#Ox ܻ=H^&AEQQyhI2s.0?ݛTѬ 'f\/0YMDݣ£Kx٫O$+yc}n9VszL}%Y Ge)}IP 6Y0^YnQ9S~ iXwFOg78_ULVF8mFD뚜(SB n&s7kF5U5=eU{quv1Z±WY,T%3>fRzT٥2[,uֲZ6^!}hdI[ MjzZBUgֿLnC+e,t?~q]׊UFPQEXFpf^IsMjR":4So/鷿mG֐e}K!o9~鷗j-m&~Y0vA jVc8VK?lb^]ɲ\ؠxM~ﱆmn{wuOi}4c唕OfRyGK[eIwo4^~zI+gx7SG"(VDL\sE3>U vKVHT4rRC#+06m] iƗ2˜5^o!14>?{%د>?Ru)b1,:VK5{Vq0Ftm.R)m^\N>?y5nأUTܬ^zVQ{M>?bu yVY}XM+yL[}TI.tGUc{a"5>kZ} w _`]+{6vg^{I}6CWo]5n2x~^oAN5djIM**)v#[ߎٽt9Rd[?t,)M?cT-U, XWDP<׭ҷtޜuX;o/^ߔeU^x[6~x]O޼fT-KWVQԊaV?sv S\,l$Uv۔/}FJwJpG "X,tWQ?vS%Ԯ u+ѱnT9#ft u޴w ֪] !NV&h%ꮅsWR:Vt; o J?6j5 :+]J{1?~Lj_i[rĄQVji4z"^xє3?j ,:w+5;*3 ޴o'cr;Tt㬂 A)UɼT[-ikos!1gsgg⇒8;/ӹuwv]}k^"5ߺX4[ p_\J/#cP_[.0NBύXQ\Ԫ}[ ߦ)jrnS%T SҜ'`!ϰ}ss~KQ;b5cl-t)JKj*6lٶ=ZeS[%o/k6}5l{pmڌn\̷1KKbV^{[ijje*+5Vʋo"/IǗt=P`#7m8jsV/.Q+^~Ҭ7p:̃3FoTߍo( gWf:|SfW#Oy%JVek[6Y+=g-.ihc+e|\IdȍC@:DFP_&{6SWGL(MȭxI=$QS[͇)m2gS#H(ĔÎ ^n1x /%<:|ZP? \)Vf5_| j4$t=}.chQ±׭5:{ֻOw_ĭVώ_~Q܅VRKorm 4=+JaT@B.Otݓ$qI-mklvS9_TF{*Y+C.8G|\á9J>k^bdfr [9u(IHrQtFS ʁh>2εϞ J6$#4EJ_'>E~H⠸CeݕD[\< ސZ 4ۗ?{w=|Isn|Jk#@(_l sl)_"2 gv6A@/̩DA&V~U]D{tY xo *x5{U @ A!PT.,JU`˯JW$KkEKvs[. G))UitOZ#P{ށZk涔yBt?t)L_F'R/ &^>iΓ*<(MaIYTx5+A]K@ \Y@%u br6 Lh fAhm9KܶZwoh#ur{S| Ʊ }FQ߫AL+^2WD@Qϼ@ֻ"{V&a+/l~Gk#u+)Wc+U#aVih#17ir Q'"paտ*Y'PȞeQV8 E@!/Z+|/D,oP~hխ sl"@%D&Wt6(p'VBŁR)3[>]*1Z ;o3x$` O\z'{ m͊ ٪E6ܛ;R=@!;;gSr?N0cI5p5gr4\կ)6jvc[]fPZ',U tl#ſ>S:t2UW޺6\K*wKqJ2iҺ6m„Eut3Y/9Z_IJ#4}bD5J6VVNNQ#7>|jڊ1# F64O`N*c5ȎXKqL%P#3{X~<U;}'ҴXn^_)?śIr1K6<*7.Q͙MM93I&pͶ >>K?j6\mkqZ__n"9CD{X2GO24gV;5)_)Jpm8=ʎJHG#29etP)&C3f ꏶbkRpwQoowZ`ct(9᥏=Zïo# <ҲF(d'Ny:a.;FQV0д<EО<27czXΟINQ!"})}ygc 5JT /S4¬' %Ptrizl Ms5KULOI ӽ?^_+wY8-$pm8'<3dTP7dF>maessc՛ْkR*'H ^s9ؚȫSWP\{5q/)}PU(%Cjyn|~ La?ZQ4F|T+Lִ`&F0}v­_nŸ~J;K ,k-<0 3/ ,1~pCkKp/]cՁ"%HC(%(RSzlJFXQɛ&{%?L*ʳ~"k q"khf?X{pz=#]9bG HA|KT[9ďބDq <)pg*CFc' !yy !{Hx_r2"h^?r\FtK@!2u:&+DBފbD5I-n ="Y@,$`q{Fq#}F~BUus"+ )fRDpᆄF$+q{v-u,εxfRS2[ׂC|~XD,S5="j(f9l:lĭdZh@x+H!Px=fFEQ.~ވ:7w zl+oLzpVD/ B16Ym*t[]{bҘ^007,!Pkth~ҷS;"Pl# H\jnNS4]w+(^IG sir)bnpbm;7mX®<,1N=^ ).4*KyʦU_7$4ƍ%9dҝh&Q?wxBdPPo|k$~ +=u܏ M\=5~\YLFcblUbg-tKLv6*&T雖?}OnVp]m[rhIe<<;$?gazlKWʁF!o`8vt)O0Raƨ~vMd#qyy$I, 4]Fo vBk$v]m|"mƊ;KyZk#+C֭s>p)Msmޗ(uTL+{6$v-WkMՕU*_IO-юЮ&:F䮤p)U֒da3ĸ&?O&ךΑkl`eYhq{!&iZIfV(+ pI˺,irU5a@#PH]YS(99m^YQ,ܑF턽P.[#*~IOKF}׈rSnPCq#&: o#!=I]sJսgO @99dXZgb3ΆBk 3hьSiEѵTLf6i"W7J4r]FKx%ktu9t%u=ȰJrqh H"N (uNSx6]2YypB5&cSɚ X}ڤ˞xM$f+FS{ q-rťVV}.a}w "nQgrsu q^k.)D +$R C'^EVIur"%̕ӥD %u@'}S$I5Y;Q|AB͐S%Ү$^}[k#ߵ։E<r68\KG1"] k?/{ظ~"AAkɅ L7/ZGͩo^ N^;KYj^'rmU-c] Y'amã^ᯌU1!Z[72c%Fa2^sa.,="̨RFk3?]wT=pԽ[}l2^-kzeVTͤO\HV?/o֝'pcg]>z{D͇sp?֎k{_;TCQT޳q=ucɴH\|d,0{}t8;~G%@Qqt*4u 4{̣Ygn2hDgsrg/p緯G.1sq9s-qO`NzÚ0oIG lgW+o#w6D.Z gr>il[O!{ G (W=l8Yv>}E!䯜6!EbAc U.y 1 ⷑ Q Eogce q+srm8%7Q$Ap{]߾m'X8`{;e6j;ˉ'T@K/lV#9-Z[l75ao^Җ!QDXr-%7E;ZsDsD_kkPz;s v p a"&; utV5&Al3rǰU@; v>?#=ME^>p]bgIç ݛI<%]"pp]☕˵/XԽS\|þP4ZQ`USW@Ə̟oS[]"y$a669d֞(![/^?8|‰>ܲٶ oYSO?̘UC\1=g`cvqoEUM^ISA_oiiiu&yB~t8 (g| n>> |*W>lʵ*Ӿd6q2:P^SijGKJa4>#p\F'zz{Y/>Mi/AO\,B (+ pH]5z$cp+m976\_mg;pg ."]JVmWFK <@хژSKX;dT㑰+ѽY. g][)7"4ǑG cn^ʤ~kiɉ|EQSc %J;,ma'&n㶵~~ۣ_|Ԓ[IkixH׆2%Ur0>Yx1Fx6M&@\-iu01WDMpf%X],j=m8+u_Q8+Pyϣ"zK2 OA+ẆgdHnTggW ^ + pR#ˤ_L2_l[tsFLR8Qd7C}hgBDM r8wF9Zej&-gJeme{MJ~* M/w.{5|!+6Y )0&]1O*$Èѽ"Әϡ+ Bw^8 Upb8JƖ(bYQ`USW@ྋt"b)B-iPW(Ju^H>bVO-H,u1D5orq阄Bn%coX{_[{?y?O;-"K/ϩ64?kmS\?>P/7ØJͮFZ'ё), )0+ `.$99u=%Z^r4$0vyu'T@ƃf1kN/) `USW@pČi` }0;r3$3wy>R,4]wdID“p H 9 L͵RJ>(<V9Ԑ93">îE p2ԑ-?8(Ñ;O.a}[Wy׷q10>zcy,B2mVhgHaWt:c#xq@rn gEUM^I{sfJ{ "M¯jc"k$p rztG$Ig{$EO X3$쐴ҝiYpbͼc[?NeOX?FB 3)64/QB"Ja}D)w=kXYRbeAF(H/M(S{?Ma㡨F m8{&ߧ;0|Sqm~R* PӚLŵ>g[W&{,)'T@ާn8lj0eDsI2^{92pr?ݒy]0%~@sJ̓L ʁJ ҖZhF8Ue隩TN~~ף0ڴGYSYMC'Ps5@Q+O^| 'Nal rͧ:Lj׭V{G3Ԧ$& {_ פh =~̫ǧ8̥J_*vXmn3!qEʪVGQR*"& zM1&[=nh#ʻêI{W(PEUWdcJ[Eޒ* pV^ ^xՍXZJ^ڬ}PcA}ྃEGԥ/T kDS d.;9?F@Ÿ~OI^'Q_147D;t)%X@um8=3Kd5I#Xis &VvXPIqً8H(CƶXO~_Y.MJY)& i=^C SW^= +΋nVz$Y@($rau^J+OAVK&zÍ}^,NbRchDFj)9cNcя6`]HxQ½m9^n2S\K Īծϯ@Gq33z[GͬZC5YR`z ^]ˋqDl%32ګ+ j @0[*^0lt R~\Q_/7Ht!(TM]Q^ R;EFEZm[Q`USW@ë,M//Np}y᛾,K:h[ٷG}A 2564G5ix&# ґY8wl-/%!hP{mIJ]!pm8X|mn\DEdW=ҹPUmlpφaXPI )5S4]oxhD'VLY_JޢI{S EϣmPZ hHpw:~@E"MBqi}b%D0A D@?z"I'0uk XaxBd`gp=֩Q* #y(0+ `}weG3WTޯEZ;Y*{$}Md/Y}%2F{'(0+ ` =C#RS׫P UK^#>4|}Hk/{M*=NZ424{2o#Lzs}'})Y: gYR`YSO$/=w-;ܛ(,SZy`j =*WML?g^Mn}/,)'T@^2֣-1CtYh0(V5{$n3hGK{nA Ԡ?ئ GMA#KO(7 )0|FFrm@s t~kJRvP%>IݸL5R >fBX>dA*Rn\fΊ(W@/3R͜bl~V1ڤzGj ZLYv9;r_hbnԻe>M(0Vn{q9-d?|0x׾k$`6>A焪]לKq>XzOcw=97(>ވ~PV}_/ i4BN2ui'S Z(BWhB`R3V# zg8QԮFl{?1?20lZ )% H 5 H 3B_YZKi9 ǷlY#?NJLG>CHywle,%'T@O5 'KȺjJH4(^|(IezD f̽@갽6vt/+ h^Gyqonnި%x(}%,|?豎DHôa,*.rx7eWz$%Gk(8p|H_Dȃt€ƥOJOҘkJr+OmJ+>EmV{j#0jN>Vay$X[-AhUSW@,2s_YHO=(^IT&Vġ|úѽ@y6#^ 6vT}|q-+oa7k[,)'T@ڙWu.լYjxV+ p{:&Ի+E rus!l5SgEUM^IZ.B !;˭mۦ3T `]zN0RC|m[oRY"[Ekgl#)ZxˎR26\b&ɎSbt1jUϮ<,Za{bVcA0R`X3WFo\&M*ȸ´=rMH"2R 'ጳPI_rws"HٵQH-V|. De:TټӃnV8>FK/J=-Plm0@!ۏS,02Jz}iYQ`USW@u<`9);k,$D)|O=Vy61FKTXWu%TYŬBK0X%5 HܸR!k7]4z9F1m7R2N޺o36; pA%VmH jOp'>K(%C4#6r(xl緧G.n$a+' W#kT `{Ϲ;jϊ~).n ol;Xֵ+܉6X|uYR`Y3$ٹ1-]dz"S{I'sk6]oT?ɳ%5 HLYZ-Nz"֥Wx+ rW@W9\riRAsVkgz$Y 3BQ~)Q|ER026s+9ClT.O粚D0\XU aDCkRIc/{CŔZ!(+ pߕ( nFw{!hvVXz$TxK_y%gQ\g_]|yXx籊m#BJR-*עש-)'T@zeq~|P}я8{` s*;'8w哰k"@uӬԭ8%B<16\/wf`_B vO*4Dc|'i'Q872d1GF{:,&/+ a+n,`GސbH}zR`X3Wi k*͢ $}Z6[5M'(]Wml R_lrF·LnX-l @oD0Q?\L NV/$tfQvy;N;Bt#f2! A{*>nq"}U9Ԫi6tAH*x?jޏ;504$`2I[&Si'')GTTZ5qʱR7 s)Z0j'gDQ]H+ܖKWڮ;w=5MgEU HBNo4K@VRŬE<jyͨy5Q晳t㾺YCE*}cyP 9!r;X1o|UTn*|)'p 6o]<%uzWJlΨ+G]1X'n"u0~QLI~5bh)44SiQ2r*8TQAGAX" B7Kj׍g}8Cl5{uq>&91݇Xvӗm笝9g盷(`kX,m ÝO|fu °U`JOCj_Ċ' gl޳ 9ջS'Ɔcy!u^wX* pӎCLD d{;Ȯ?r].Y"{pDA葊xm<at餣=^-[qƒm}f[Zh#{,Aꗼo,&,ˬbU=t҄˚zB$nxE@srgk[< =9P>}2k&>/))ːX~$vxʸ*}:AZk#}O3ΐOIr=&ۣfmC?6!Lh,{qZk"@o to5Ṫtgm}[L Fs E@4_zz $L>h?4\WSHRw)XHHMco-Lڂ~.?vCٙ+t>JJ.PHs-wTXA-)'T@A.[x,FSa20ThLiZUT3V@:ehά$MfVۯ۲Wmh#GX%h+\ɔVv1Cg果x2 H8ptsv xȋZ N~.B1i[OMm_#?ɹ!T S`YJqM / g˩8Sk`J#m)lUCb&jTA 5Jpp8 )9Y0MV?g'}C\t:ՓYv९\~=:4inޚTi=p:f].e^-:`816-0ƽOǥ%K^{r]l&b)g<F{ˡ?D"=EZTxދI,)=}.:F{hyqA .4<aJ+@iJ $Dk<{?Y-MI)+f-xjΊ=a?UW+F2x$m˃ Mq({~~- l/h9WQТ^Qkx]ձ3E,k a+_74_J6\r]F&O6>qNRz?eE3.>YJm5IsХ{JIaf]S)1.$M}@M%~^d+.;/zckVDKwY$&Z+Pnuȕϳd R7Ɂ*;}`Iq{O_VJ".T4Q3_gl.ے\y"_ON1:Mh#NdMRIZ7yK?w]?4b!aM_=ڠԚ{,Бe]ފ0W@1 刈X헊ԲG+ rW@1Ibz.N7׿=+Yg:94@Vk`'U>bV )^]XqEO{'D.f \X.m"@ 8-]>hcXGv򋱍T{mns?ѭ6&ԯ-s{i)rŽPKFdsYyG[ jEŪ r6٩:s߂dfnOh#Ӟ6H^>4a}x6t9d TKʪ4r]'%rYEIg8ZR`z@ y0P.3B;yٗſ삟/]T"evn_dp6v>a eZe|]pE{<6*~z6\]_s]6=qVщlrd]{F7ktryt(En634eecv 6 VђD`4/a'}Ԧel+VX:${?NP.|6a[ ݸxL;LOul푗G{3iEӡ SW#?]m&_<meJlKLX gk4"eDFkJu[ XYʷ,2LBs}d6m8M(r/UUjl#}.l3"4Ƶ7:q}׎G 5]mQXaQma}^NF|v=#}['b/ݐTuk,krIW9&}?ǪYp VUxI^gۑYjc7!!Aypmw5miR6)"'Nm8y gYGB>wyw>tPFW:sCOϹWu,Rt0-}}nΒ˚zB$/q-q7n=iD8nm9|LU5N]r۵^|@PYx$LzQCY\A;Bzĥ=c7(^I{`w~ut{6/_lgDQ}Wq(/ FN켶ypF+ rW@N{nƀuMkЯD3}W0~z5Ρ'H Uפ_[7 7e;/-䵨@XJK(+ pb[޹2-=!˞>kw|ooz.ma})'qm7= -3xʄ!L^OΒ˚zB$nH^ʺ^m(.:[ylbr091tϡUJD{/y(ﵲ׭KֵYmcm,³%̓&7-,nmCJa#ޫ+2G!Yܶh#Ϋrn ~gimI"v/{i<8oxmŬ*BϹmûvَΐаH[i*Wˏ2Lais ;#B\ `L+WLDw|7Q8 }W@gJ%M]}ӄQvK ,·(tR ѮBbQ9+ j H_E@dg[Dz?{qvrhBѷd$*)uj]5-)'T@pC&Sty8M<6~k, _p rf=V=(hT0w;$7tD5Q}-cZue{߬6;,]b6l%~$uX* pkWpAK]p 0O{u̪{%@ ajG>->sGK ,k 38}q08;7n9MQ[k1 qd792_uM۞qMr`EY `YSO$ Ed9X޼h}ޥV+ p8*w[MRΈ ןb#gEUt^H 0+)$4 (^Iq)>enÂ7K`-x5Q`0ΪJWV;%{bbgDhz T,Z2g_Sw,s.%+䨩ȔEٜV5{$.>66$AdL/Bƞj 5lgDhT3]W#S99曗>ԴQO&iXV+ pΕw0m)~x;̶eb54ޕOa{5{0qb iZU -)T陵9a=,qؼBF$Eg`USW@യUmlu\Yqi^tJOKӍVXz$?r:ڲ:IY\U{_kV+ pO]ǛvKe_թT>oړgz+ rW@F,yPJZUg"aSF@z$ٟ1n֟;un*2xy >1|<ފz&b0t蚵?nChHazFCFzw$~*{$N'8$?2 2S^&.KSTVXz$"Vk{ў,(^IKYoorlegс)Ĺ¢ފ34V˖ԋf[tϒ)gKhBޤ#;)78jۺՐ.HnI`;p?u-(%1{1+,p;ajXvpVXT8+o7#d;3olYfΊTaf2k1QE"=1sj HmffM[>[O܎UV+ pg:YdH̚&"cYQ`USW@eaʺڳ;km|2," vsVXTρӼw7zgZOފ0-z_ &Wg|P/Xx# XGX\ء0&#q^`[Q`[>W2 3ad(\gObm5X̘oF0zMa˹/K5ӌwmSl^GCBÚz ̿W&"x;6x=вA _Ƕ.kղ2 H 5T+pz pȢ4B3u_ۘTKUuy gIeM=g.T"Ҹ6G+~M#*w9Ի:sJ~6{[r:,3yJ(!.a܌}hz$%z+p]X[uHkX*nb|H~9+ k7U6(,>V0,U:4HBdb' ˵D "V*hVʹۗfl#%>H]yXf?NymS2X* p 7G<8,c>i>*RV5{$n]mi:teeŢԮtw='VubgT `=6Z ?jY(V5{$.q1a֦<ɪ6W֦p+v??%_9+ j @0B]fmo9ױGt+e2 ݲM{;S`IeM=RƜ%5 H.=Jǫʥ0~$CI"<>f˱wwk#u+&>vsUYNK!g;iPbpJ1żZR٧|)cۗH-*EӕuyHѣ׭^kɰ.-^j&,U_&$N\|cP@\-)m1ZR`z@ yX(ʹB *T‚訑q1ܪnexΊ7FF$b&3dfrR=H|?=e_g0`cg>fG3x9̩\ o vUդf3P1 S/2\J'@!up5Ai+aL.uk*p<ϗz׃&v{6\Jcsېh&xwqQ di/l_3whxHۥ\mZ\Ϳp}- QOY pntf61FLV6 &!+>K6pjL!! m~jޙG8pj~G603Z$%{?<+zO#gJĬLq%;Eʼk3 o)'efpjUq%Sg#lt]yXjs[ۆi\Zj/( v0_7 `ZTRF͗-@)a'SxBp!?q cV?:g?x#-}\p=GN6\%VTu"נ`6(EO{Z_ Z̲}ףgO,^tMf vY 3{*C[up"%+^(6[)էAB__@fsB\EX+ ygʂD]PkE>}ܾbqoP,k6+Ĺ; m8hkk#RZY6\:m`a?ZMk#K*1G#|1ZHJҺ#?Xc\,B_x0uex@2̀ӌior!m ~"drHX}E9~rpb]Y棝&TЦb8^{il#F\³vC Qdqm8\$lFRsy>F{z'eA&C* 8u#ȉ8wE)QJ ۶F:޾}=pv(灢1 RS,YHbI_=u(a?" 'D#PҼ9i\|V$)mh:]u~k'lȱr$0fC Hh*e<2zcЛw @qՀR5`}kOQ-.o4T5{l>"OAY޷at,vnz[j:ït;ʘ2RUCyq^sJ1q-5X>/> 3r<1X@?C4GթAM&On/pWZ`-?hbd{'4ם8,1rb3WhK]Er8t1rޞp vqO-] VíbG'EcҧQ'kC+V?G-<lU6K~H*5HEsY޷gepE?| |,6R RJCՐھq/@J}t-Q1['L O}u _}ڬ}E$-"{3gi'y){# ,^c~2v>]ЉF*ipJ@z{[%9uwp} 0/SC c,|ޜ|#Ǔeab彧i8Vgjw^Ϳ;m~mI>f0ܱ/I%Ô{#A.{K"C∣WoPlIT({|cxŗ'Rgi9m̪rmjXGk*V _b{g2/д:d(&ъup.6};_f/yP u ^4nyk3 ȟiC3Ȭ rUXʇh [@4d"Hض?G>hI>rI3\C H_6TYJ +׎@M إ¿F(Yd:FM@&/~Ru>InzCkoEߊ1rKw:Kk==iym+v\0b}踉%=܆;zPs Ǐ%Z_[#SԅۍJ xYG>>7 xٺp's۳a~P&l H k 1z1KWx\?Ю5cx]VRG>xжGR! +ɽxn7Zk1$.{}lٻx'T$U6` u%og &xh$sEz D$ԡ9KB7˫p+ H~\@(Y<`Sp,GX(^Z>{;F~;mv=M@.0av`_(vK*>bpK\WDPȮHPrN.74 H|hqMLMGH^@z4S){Y|%ݛxYn+,&^O283oU8nwk{[ VKUՐj&^k $Pjl,5e3(B«#iᴅI$^wPDjYZAs#c;7|#(t2-Z {,TU|Ilh3.y5s55Jyٺ>Eu-q@M/,<(jDxuD43ܮe퓼ٚݺ_\֜٪9, gNeofOQ+aT_YZEqKXq$H; 薵L i=:&9cS?7Vey=@l?M7VLׄKg*RA1ro+rejtf@ݻF+Nxd =:&9^wUoǷ׍Zޙ%->jP4AŤW$v\̧rBV] [ /ϡh!1FJ( z51cdiJl!K{SܫKA{BuL~txʉ B .1wءbҫc9 sdžŌHR4t eqyvY9>kPNyTa9Yc9H$KDxbvc[WJ-1톷YCO9.ܹkힻRN1/yP ɮH66޲M_ȲRH"\wv5=Kfkyzȱ?fP?&Ev- V0[)Ot3F_AA;iВz_%^ΌYrEKHo3D8Hno'ekm0]ʉSp'zFP,M=9?ZB/a9̀Z f2U~][\҂fkx4ZC2/N4,Έ!Ȓmwvt\ ӭ 5cx#ɒO ǽ{9H cOIb4DsE/vf6ۀ~oSkmh5mr!иIY)6Tx#,F֑Eq\ICK_6 E4ZI#Z쵌؊rC9VI,xh#SUEu=j˞7jg$M'T$dzG:W' 0F9N0cmZ"hzAFk Id =:&9lNa Ui]n[ $xTLzuLrqˇ8Mw w<^~kpd fǫǍ8F'Og"p<5F'k&Ѥ8~#_Ќ V|mgBW%뉝py@uĩW ¦rHK]ET IIJ`4p̱c{>kW߯&d?M#^ű)*1r iQf';quv 6'܇#[]jр=3ַς48'ZZz5E& g/.%?"i=:<_CaWmG3"Qb_cLc[m>U׆o} EQzD_ѾvǷws(jHzuLr<;Oniv?z{9fAI]~xU+|Xy/S^}Gܩ xsV* POuHIc({͒CƶN*&:&9^A2_j)L9^ްԢh H6]̣{{턒LV:p"3*rXϮB^:Q1rOm?f-HG+QfuC,WK$G$hlH^{5.Zy I#gA$9%,Pܪ㞏ۣ!_ˈy,֭~ G%b:$h5>k,MƅsWئaA]#SԦ辚ԮYj\QgZϛU*9d4Ac38keE*%NzN.q tkqNeW4b(0(jHzuLrM$E.M@ +:KRfiS/%4͠hIIp j-࢝Uӵk]fEpҧΟ}8hKNrPdg[[mӃH"!Ѽ{7Gr1r4 CdIAfq`]+.z%$M'T$Dw>.FfXJ8142aNLl3FO??=k#ߖC.v|T҆R"k U_-M6$PhDtYR *&:&9޷+~8Uƶ9/|hlt.CJ'DTC%r1{S &4ge^ I4=:毈<35JZ$ErM fETHxuDoAI†5E3ݳR,&],+2vuPe1_[/kmJ>NjJ A&p\/2-GMP5$:&94§fVb\V'[G9ٹ K4yjvm.َhq,M_-ٽ1aQttd3N]qEêv CX(H(iMa_R#4ֈh^E(NMױ@_3FcW6Y,Yڷtn\r+ .y+N _^vedr- {r)PvbR+4h F#{78U:KYe#S{IV~ hߢH 9 =ČqO]6 ixgŭt9ݘsD{BuL9W2ҡYpk4LFDά跉3t9)Kn(jDuJ DKӀ{}Kp)T^\aOT(TƼ< %}k? YĮ! ״bx2aa4AcyKޟx\Oe^԰k-7&h=M  jk3PB*K<E4II\fKR39^7 %6O̖i<$ɯHm4 }9ַU#i*ڹh吐ڪY$M5xp'ẔOtF/4(惛t|ޛW$B2(jDxuDoߥ{\=mlV6e9T II7Rghq ;4.u:#KfmU5L-R鵻#cx}&uK]G?=CdI: 7 \E҈ j.WǤi3V~#JszX}?yd 2x+wm.X>3DmErdZ*qYGn.,+kH~Dr4iI|JB˂6]IIgɋYY1棩C!W >*FZEkH`9^ٵִl; i'T$_Nw*f"*U5wGF$ŏ[=;i ɯH3_ѸCB̡8ZeoqUyi@AɦMՊ'Gj¦WOr\_)7Dp^/ }s},W~ρ׃$hb$o"ok mi!ȱFݼW6ݼޜiאL5)Ci FHNױKbpjh2R>~%5VhԪ=R hܰ'% hܥ6ǟCUpTp B5NZ<ۅ?C+vMP5$:&9^9)!P*i[v^TYcDPȮHԘ} N~K?_(bҫc45Ap P(%7m֕px͞F)؀ W$N {'=6df92+,&xsØH_E%(4x-ŢhE;[ ǿS@|rSh'; *$:"Y-* IY> dwDPHvu_CYkG]JV3sAM,&xx1TNaDBՐjhd׳lP)x^C/C GԠ9sk5mM-ՐjhAMNkx2?`/q/yę!v=E"Uuogn4ֈhxwB8{6➖@Rn$]7P4AŤW$3z:~NuhsYOU\B-S+YCOIJ.9{q|M+XC̸61zH#s3z{I=d L W$$x=IQ&)o m4҂ȃjDtƷ&H `'=59DPȮH& MY'](gt_Kxޠg],Nɬr,fհkGyԱw|--Dڄn&6WkYFDW#  J^-XوVc{wⳄB9MP5$:&9޷#zrM||y)4^ ϥ_MP5$:&9޷/jh5\z&e$Áet^(jHzuLr<\Q;Y^Kҳ *&:<[߻U('_vt^ma<(jHzu̟axZXBh?\B[,$0E2~h!1%Loe3](ec iEj]UGET II=p~/ʕ_]ό &]-pB =O1ϷA4ՀxdY;e%:%6YLHrkUvlџ-&^OQ()ZY(ΰ ᵮETLzuLromwy][Ihᙋ':r jDvuDrQ*!!;ӽݦ>[%Hd]WԲdpz4[v3F8Wwy;Lu;dWߴcxO,ڥdy\r.,r݇Z33Fj-yJw=H2~.zJ15h^4Ac5ZdrAX|"I6 W$1G~jYt/W> w2+,x+Q榭"v٥.5kE ?_A8hdIN̻$ pjF~'^"7 *&:&9U8;"Ad;r_J%*wÔͿs(jDxuDqBcޛ;ަ*Ig9^G)UWˠE|CdIĺq}X.n ycQ4AŤW$g¡g,k"ؤ2zq/`#07~hs".|ӊIn$!tqzPvybł,. &xM#EY3i+|(p=qNč uhQ4AՐx|LyrT3 Bd*HaT:ܾF5-fsIe0l|4cyk)VیM6.|)Є یjId*!U|riϯ{/uիAA5$Z"9nrJ%I-Ќ:cReE]ք&=Dp2;qW+q eA"o-)k $!*J zM+ޮ_4 ]-m,8c7 rrj48{~#zhX_X!w5FjЫnUͧO*Y/{Id 1 f"gx&m}/{lZ jDvuDr4=E {C$(>7bIIZ"֢hII7P<$6i%I5`m*mrŌRv0Kg>FfK}bICa7&_,ktJ K:8=÷9CdcD$ I^ŌoC`&a+x˹EAc*\{ ;Fe<&j͊1/NRNRP5hl~KIUx7_7H k 1R n.%bw#+p%+\ {UX Tf5xf/rd;q./#Xs:dm~3F=\VzRsp[b糞^cx .{9^~)iWu@TyHcW| PoaF$Ժq yB:/-R #K뒸yiћ+3F'kEm"bQ[@LG$+#ڮЌ1jEM3W./WGJ3uLP--gaT 1cx}l{:Vq iL_Y<c%<$e$*w#S_;+hդa/|-V;1,zwJ1׾r֐jh㛎%\_g _>g|W~= π'rs(+]Bl [|kgY!yϊdqGĔWiOK;.3 W$3PME*1nɋ6xuٛn?'&D{"ft?{݃*ՈjyXYTCZCDN̓h &^N@tsx;ԏ #_O3qOe%n~9mں#C7h>>5y1r(^pBnڒ>Zc3{KE2H k 1iI㛹˂Ðw5KZETLzuLr<t^IݚKZpԎʞ-,-\C)ic+n.w$= i'T$sGnp&d`kQ0MP5$:&9 G:@?Z[/9h Hf-e 2\G<NOQo#{o{S@<5F=~{nm"wUd# lMSӶI V\:?;cDYCOI7L|㹐&oOKlӻi#(0$Dn Cvϰcx WN,\9qǐ MMХf\+(GW#ҫc+ HX;$ xzd39$I<9^`FJg #nlxjS&y@uD=NMWOS e ,YZr,Mbz|m[dcne]/dwWz#Id =:&9cF,4QK YP^+/Un~%HSjnrxi ɯHfTBY^>kw@)(DR9^61=_ @!'D_%#mi{QCcK_rf~u׶k*I,W|_/ i'T$cu pJ" jydY_8_[~iRWv dXb&puh}iQ޺(kN*{ET II޹J1Xx^'PS'bQ4AՐx:1_|^C@о 6(B«#YcmgY|[V}KGSr0V#k S^9|yh㍹F5"9(3Cy<9Qiڎed|$=CXZĝ8Qt[|ݶ1.z4YӸG3DF0FD^eT8H` Gyi-KnFCnT$'_ڶ̀ȃjHvDra8ۙZ{]ok9v>qEvY;F'; V2~5MhH$<^3UpK:_H/9CVQ.]y4 lFĨHa4ݎƊ?.ӫ'Iء\r>K]g($-6Bgcdi +m:2hkz6GGo=D:Hy!j]TbP^z#[% R&QܚT`?V@4ͽKxy|+~8<ܓ#M+\SRwsu$LO-8Eʛ,&y@uD4?Ɩ\`O. MP!F9,p86@Xi>aɲoqD9wOFNĤŤf/ʹzrt9m4_cdi].0xe&jVw4c/Q}EV|m"30p]8lm$x1tI/B "D-ΌuIq2u'e~"RIVfZ-!)MOKeULIyuPOjVt*TQ*V|TW6 ՚J;fm9^uj-i%NY1r?dkJq -L ?Bp̤VͬM޸3$볯s 9^[:϶6g1h$]gr9W5?f,M^[W- ?ʂ4ۚa$Flg9KqY\h5Zqg΢:0cx]b7DE;`7㩬/:!_.qzcuXMqRr1TL1Vї;EDxANPHKAMR9Vo;XC11r< s]QSIɌTҽGvѫOppچaHx*0J13_Rs{cTYY쬡;t@YPd?GFGcs߷)J} xT5FOQ&Sb%t&xfE{(']xMIYÓ1s%gk3iV#K ѠBUi]>-R3i f/"7=21n<`N1FRh -aGvd5Bռdu)i3FgWIݚIqޢ\"6PYR | ¬&ˈ%ׇL*r`G4 Oxh^wfa/3X:VXMMjW>ՐI#0g_m49MrCF2b F%]Yj1v/sM:%iTf ȟ褅 Ljdp**7@iTk,-0}DoRŘj4h'Dc^ڥAORciГ0|eG+(j kF<|,h Av9?޴^>^Ν`7sw_>nLY7yuov#bߩ>u)dԜTv)>07x&cP(OäySD)%]+zaA1-ʅ&SWq, ٻW1rH`0 5-!s(iG9_w׭Cź ;!:xěؘW*;bj?OnGhWOL|$ F\ikjŚ^?">ŇlDu-h9ԏHopgbs"Uqٹ+;/)qhޏ{o+x[W;0cx?@Z?eI}?!櫗?OƐ!8fe+Z!mAAE2r׬7d\{[MP5$:&9Ho/Y_kg8"K/ͺE9T80D>K pqp/:n/= c}m;xV}BLlFAf Nb? "rUq?#ˑܕ7ݱLGF -g/.Qa)Zr P4YYMP5":"YZ׽N>^Ԧ?|̴MZs(bҫc9~E]쌋DdOw,Mf av +p?-<a,O]x F~˞Z`c+Oh7v$ϡ~d`?t KSW 5}^[%Y,&^,mʮ&/\v{3}YOR 'B߻"|u:.5H k 1Vpf+cv7,' kϦ=_1ikA/ w뭇Lț# o;gf`$%<۲̶9[g83}=o zj H.&+.N$M5x"D1H{׬lX)kr/@`٢,m>rCO Id =:&9޸ ᜻DN*I=ӎ-OE)LڣI1>(|{6@#kKzdJL&NhJQ_vqIndeB+$EwuF!(WЦ#:sw (jSj y"ޖ{,1bW sġhtf})H` GS{eAƠhI9Y~M"yśԠ2/WB^_ z>p|گTW; ~F#kX VU8Fוejnm) #5FҎM%~2*m!#&zBuLr<`'ONf=8feI≬&A^oF7|Ӣ˂NW;a5CX]7}i\lÝjsd9ǒ"[u1Q!4i-^p+ FVCH#GRCos{?ݫ& ФAQqu&ҹb6Cφ5H CH6z8\~gf1sң&!r>f770cx*rn.e;W$Z]E_eƀTG$KÒڈS$$L8vh~*}kWDPHvuDrq:xk5i18Yv=Դ,H3خrϗ3 g14tiX{ζxIb{|o)D{¬  6'P FP,Q'"/Dw SD$ 7(bҫc F>." k'ջ8-`=u5"i^'TqKP0 ̪(ՑJzM6P4AŤW$r[7:܄Dsz|z,&^Ϣ^vɪ+i#z-}y4` c_d8DCAeH cOI7UZSo?JoVlȒ~?3/)p9];S]{PH6S|Y kI\,[IS)Ό㩬bhoxASndm-$I$BEj4^ݽ%?U 2di!9-*bf&bbn Of" ` Z!iѨz@tIhWlň 2xF{!&jBBXM9˩%Xcx?ޘ w䷊ǪBf,#=5Fm]_lÐ)!Қ@ljB'6!k 19lbkgX={#M4TʠhII)蚺bvl[k}^}X[>t7+\$ 8D `1#XgC]P{$ETLzuLrm27q e9Q e|]K7hVET IImPE^ZJ3EҦxɈ W$S₆e3Vzx'˒ʪuxf+ x5?ۅ#KfߕTMQDcxG3jx &q?Q؞rH~2}iطf@M ]1XaAYCOIg??*cE-ST1r{3xf;Odhl:i" 7VU&t1r.H2ru(56cx7>JHNőg% %*`4AƞPo97Nَh~do^#먬.Q5F'Sxvhq4Ҽ|9.E9$M'T$5>y]z]~3o5NDIVS--￧tJ#gaUҫ9ާ/tW.F-^Ij8!u#EP^y]wᘌ`?Ҿwhy/ ZrcuЩ(ٰohq gcxz3Ԁ-psޙH k 1'Gi$}"_/2%ET II"6{PAJ[PP4AՐ4{4^dw3ٸݍ7kKYırŏG>iYR2ǕO /^=DK/?)Iĭ5e7CX7 Z7? Ϗz}0|Ͱ8J 3Xf~q9ud Pemʋiy*(MP!Ҭn?,1{֦a,ӹ}奁^35f=ꀥ&(?1n3 ,߹F޺޾i oYE?H`ȯH6؆ofBof-dj٘m($lvoҺ$L|.ZsZ#3޴̽ŕu{TW294 kʌBL6sĹ-?mR-¦%!#$M'T$'2+"EYTZ#{[ݏĉ4C 1cdilVvںl]nL/+oexd =:&9ޗGSiY$A::F>vt_"Ȳ?^ *][6s5k8JrߟCUCҫcy=z3;O lFɭE a,MNnM]RI0{ ˵v1_-*C>[Q0n}g4 R|k^`.)]|v[C^ FP,-pyYoz_GA4Ոh;@~{yQuQ4AMӔ ) w9ܱ1vIVT##uIwD4_o0`cBc8WOLy9gUT O!a[4 8\iC S(Rgz~I4=:&MB؊B<5J(I2AklGM@ȲؑA82r}tIiʧfDPȮH3/u%^(ĴETHxuDqݱk*XKfjAIcxR%X*v9:#&i_qhD0ScZ!S0%"D]--tጢ 0-E-xPETH.eo9\Y;THxuDF_lz/bc2~h!1_gf48F,σt %W5|ŽuӶ_bZEYmU vkw4i ɯH6‡CIO}'=:m|0:eni~{JkWܡE{BuLrqG~?DM϶ْ^ww.0nڍvmhO 8A O~$M5xu[%z--F;-ۢ< :ѕ31rOO~[HIp_*^V܆A Bd5"ZY <(H%8U.r4Z|ÀȃjHvDr*[]ZE1-v1hQҫck2GTdS5`Ldz0:FpT#Jh$Ǻ.-qRᢟ+\'9d =:&9ި\B/z1rm$+hԻB)%IH'r$H k 1?5^;p}IWK{+E&^+qp& _պMP5$:&M˃cw yg;_ŁY{'PHT##O<`OXJnix0yNy-g>zAnQ4AՐxMCW}_rn}'l'?|% C~(le &zBuLr<=0[<0?fs&6}`#Aq)A1+ c-&zBuLrN/8G+CJݶk@$;!1t jk^!8\"\d~ʶbSDTC%} }3ڵ~ o@s:E^˂ȃjDt"STُ(f2rB $)-qUZ@5":"9ڷ /[s򱜡@;P4AՐxS?>[痳7qȋ`~Y\_VneM@5":"9.n{ϯAUfu C8ˠhpҫcҴǗ866*ܚ|1Xkb,&^S7w]z; ^vfc^A^AUCҫc}%tN˹FG3 jWZYIrkMQC m"ɮHH;\UM mzhMP5$:&9x+hH{Ql)~$6jtdWK$Gӷ~>o 9#{=%3Uʪym[E4+I9 nH=w f(7S%iP4AŤW$ Z)w)p83r9Ғ ˇc^(jHzuLr{\EsQ XSmk8PHvuDr _Ѝ^ YA6hȲ K ʉșsCV7VA8UX)сhۙ8Qd54(N5N5Nl}ފP٘jȉG{8DZPWqn7K\n הWX##}[]e?<%7q<^ђ'SUCҫc}V=Ii(%rW Qd-gA4ՈhߟԬl^k5u &^SM&yұ^ *  4Wp8gf&{dߒ7HCGj)^tބК+iKvrj ,:4[Cɑ":-%[$ӂιVì`]^(jHzuLrNE5iEQJ&*D'eӣ%(jHzuLrȱb1(ŀ/MPu': XJ{c ,c-$W#|n7wrr߶VHf ?~_ZyM`cV\z$M5di`/~{~Iv|';xMFNnb^c [GY:Z }'Z2g )p΢hIIzYۉ9uO;pH9_-? ]-{oIn8 ur5;dj4)F yLHGPde6 z#X5^R}BETH VË}$^֚m% EPVĀȃjHvDr$5K2%$^?b{sOS d\ZMP5$:&9^@CI{MKŞ7.urEx;ET IIbEGn/7 W*Ԡh HPY0ۚ[;څqfp?~sӳٷeۮVeDͫa~{M ~t2f E^+8}RSIYCm%8(htJ-ܹ_.+*/$GMhƞP.8I'J)riax^I] {%(Ո`*kW ބeGȊn"tjəv^W,1U[;ӒYG 5b(>^'ٚG.\gPZ](2P;"v5_n~k>hUC֫CMJt>ceo##JWR*ֺDIPf%FF%g^%{;j<&.]F&'T$,ݥ-P! lƮY%(ՀpdQzDJ~?TkK; rtŽR#h^n>IǘT:ɮ D<H=@f`BW뻩Mhwݟ}ȄFndpFY}[%=ZJQ&'T$ ?h˄NɁ+&KM/Հ9[Q&Z5d:$98,{?څ1aI U ;A(# 5^!w)W<+#ߕ98ӯM?T BτϖL>{ W5*DW#>~4 ڦ7H.‹J}JR_2r,jzȺJ̅Yy 1MhCvT1lnepf>nZ9ΫϬoA>3*+p:-rl4'rM:U-/jH^1fZ 9X hDSiS@*2Nd(S"TCQ/Cof7CٳLnRjh^nRX/+J "ϕ}`dda}LF%Myi u']yZ,Mv4S{(_2r@D4Oyyh;4ѬT$ w-OeF.XgY}m rqG:$e "r8rB,qצZkwQbG 8 [j=WI% zHVJ[ Xe Үz9DZbǡ 8K*'}C5Kd&I)oT"Z!_EV&5p~2R<]O9!Ӭt!Vj{m## dat{]+9[W\IzBuHr8;r|{֥J}2b02r ?3Z'ٱrhu5S@12rRH E\<}}FVlF*IMpي4YФEpm$Pt~<P+9hDPC21,^{iϢ9gB.+jy%J5dZ 9~텛,6Fg(75m JEшP>ɔeSCS/̱9KF&_w_%l΂ g%E dangcc+֐j`A 5ut0*DdnypfԢV YI9PҎk[Pi!/6;iȡ Xfm=#~#%tPF݋v,OQFZL'uk-ع\J=LYwθÍȪ'6BXMhCñIV>%J~l>vфDEdaqrwXYl0 /F b0&s>JchUC֫C6N=!T.7wN{,[9#y(DFlW$cXBZ_Z 6wf;Epޕl$; nЉRN8lc%#P3 d$a2Bak!ٽI7O*A)A&5b: 9ظnjL*m|} p{ȁiQ)r>ȡnflεPi'Do3V̿2ץG~smlEy]-,6-iaĭش?5O.X F%o΄yͽÉZB.sr޶2r VB ВkC(C7;a~-DF&5da~Z [eo(ukKhm:1Oʊ'\vh>kFFLBA@Ζ~GZZ,L*m(cH_! bJwPt叓 "57K !8Ov>SjjDW$#c2,u/\%WkmMb֫CÍ^ɶQDՕpaٱ.% HaW)~ٴNJR{If#V֞|OOAFVsl(+*I8mwI@x+ֈjqdQ;Q{ע>g92WyڈZ4Ѫ!!ƥm}phê9[okeda2XQienjcRyN9DBm=p[2ru{ M ܿΉ՛ߎtoy^#"RK'΢-lP~ c%#Z ) ?3P#cGAAg2OEf^"'#9p3ur=]\yzx1TRyWM*.2S> "r4NR63e4QP2LxYH_zhVFx~/#Oh ,{ tp&wG Ӛ ww+2:Boj.2W JjqY<+v͘Q0m±6 Gj;R7SwelCΔX.11.IϠIzBuHr83edѵn$鶞)F&Z1!F/ϭTxek>q9\:.q3,RZ=yȡLYINnO-ٺ-+9'p,}m"3e9\N*:#" 2Ģ?3SQ8ɟNiL#(G%넾uI 4yB:{]3ampX[nA&" )néq V#Hq-2f8^oF*Pq΢] IHRW-##/1K9V~(#2D<OJ/wLddaX7^n$\#JJ-٥L-[=)1ז[Z##Sڳk S`HsΘ >ʡNa'˛nR$4W! 18 d%s쎥2ݏcBby V^5E_2rn SKo@]Vՠ_d0Lxs5˱c{}CoW6IC|ōbr4h5%>k"OUlT 8\t/8ZFF'/'K)A茀svΘ=C,A2#{!D#"b%`h`=ޭ^(aTi|~4x I4eҹz8QPd4o]̾驑%͙RDxsF.+0;~7)]9\"'Zq+?UR'B#ΦUA\{5?Ph h\]n”Y =o-ҹWje(}EP}rK[5]{ܶYQOf /.+&J,HdB!c#g})҄dJhΓ#Oy?%'qg?ΉSfDPz OX7H,+.}(Y9\*ҙNA iDP:=" p=d(΄׶twϙ8GG" $-holih AҴE}RNKy'mu]8?TDa+}Ȃ{Sbp:ik~KFZ"Sfk'dpoiU=R[xdpUL޻uɫQF}iҡuYު'> *ci4>b3_DڶMy0;vmed4kS)Ac$Vlt0FM'WM~LjPTy));h}4U,Tdda<"_*17ƿ)[]㵇}t0E<9фPvT_=.mEಽ[7QsyB4{='9y_ZY%'N`Zf]϶q89\׺66hh{##8ʆܪr~~qaepj)2 lt.#"o>c_.=̷2Y9\W_]0cI=b:%Yw]e#+qzDPR5O8--gR-Ǹ?⯪ at)`}US VuX 9ظlIRJ$JºKsph(# S rB!6^wK [cgFF-]N54tKo9TxcC9vn^}z;#nBʛ/qNifL}3m&Yn ~X􌫗N x=g;f F!6$^[|іF4ȂĵZ We 4G_͋?2AiQ><9\`9C<tj_׃@ L ӪlLyvˋj|ӢyYPΒ_"W\-&WA>YX`Kv>)m/%"u$iɉ4B5p]|i.F קsTd6$ۏf˿7̈́sr苓<syB4m )S#xCuu##Mw?͸((6FF@yP>USģZY## J띳zodpl=㿎1[{^t:!/K u }ӊf"Od#*dFYN3q^28&a;edp:5fF[σo&<-I-wooL## 1 pFl;?9`%1 4J!+Y☯YSYطd@ץ #8;?H"OX\$̳U NJ`0uNiZ|,v_Jޯp[:۳ | %J;Qc;e5^?I_!*S/}UvMK9EL[jdpݲF7zt[v:QFmhMەXu}L="r(U:qÏ2NP:K_ܮ%'j|~?sZ,sb4ڕySnc FFF'ZںB)A)p_D`zzậekv -FEP$< ֡k)FFnގi&5mmb|U'lG3XqdJj7Ԃ %iT'WI$?w]ҷZJ4QȢ{ v5J>|&SއPTunQ U29NsgۻCyZpjdp֕O9!L6zVuGzZW##^oՇڋe@l'u۱X'CX2u^YWNkz3E(=}dғ2ΨC4Id:k'a*4i3{f 6mR}"\]9# mͣMjvu@r>G?H+w퍄.%53$[$*([#?#t0=_di퓲dq .AK,a}Xm<}f , L}e#I>A/F>M68;k/ LE>ieJ+؞x/x1t~Gx_Fϓۻbs)]uŽ0)Ί--eSìQ'dp}p:Xf1y[8jHM 笽DhT# hEUv{aʺ*nHV22]iJP9VRm>pldp}vLC/9\7CEX'i:[ ]v׌fZ`Y"3ORZ՚j}211Z41ib~ՔP|ܐ5|KgN0 "zUf#F?ep_ *{n%iSa,< -^F&5pk+զM,;ahDPnV.%0_\m ʺ=J{(J]lh,hg_'ho5qadp7<:l`Hyk1ۨ#9.h 0.mz̓R/D|8B8LGV e8.0rӀ9ӯ]k:N&լ'TOq:nL/יwKF=n6~+QmY/k"~UF&#/8b&Ѧ)eMߌ1;3#\]9H-{iȫՀja@vI89teCzl⓰C]]!hQFXqNw"xnv+~^iG^E@M 9߅)!Ɓ![0V&Z1!uĆ!Xo##qqI˄|&mCw]95c+lDᅏӎCZOKyiL 59f*x8[rqH~MhƞP;,>rxcR##` ' x:5kžt?/ꎩ|IV $ê22rY^.Nj]˾KBp8@{jz8raP2?0_]M}Eu5.ep*yK8AOW)ض^+.g &M4ko]dx*xe~C>1Q@i>Mjxu@Rv~s+6"r3fO}Bh2=Z=w"5I눚綽xVKh% ˉ!{Ŷ+DdAҘ_ڡSrsepY̯G>gdp3q!mJ E_x~?ax+2gri^ckQ}N7hDW$U$*~@C:⋶+lW $=zȲrmme/=Jpmh5֫C#-2ٵ"Zgnz`j=Mb֫CÅyWN ]?3g+լ'TBX_6m?zlmXuOUï۳hUC֫CM Ʊs?~lmgf/7zA-ڈȡd!8Cle4g@(#%?JcCȡ[ֹ̈́<#1 }8L̵N0rGE(W$33Ay,KJ|poTFFUFѵFF̼"5>gM.p%sG?mm{ٕ6*#4k !ᾷEP3h~hku&MՠE^.Iz& Y^E'm>ө!ȡF>)O uA޻ʎ2r͢oV}/@4ќeD'Tivsh9q\pfuB(Ŀ"ozʯ[ܤZ-F?Ke0A!!z"uٹ`}{ɇmX_w`ͫ5Q&5IvPNr\ `FNn5(2Ӻ.ś.۩` N=Qq¥@G"nvТV YIgVDRwԽ6/Yz_ٶ]ex%˪ y/fCaFC/ɶ^3p6X3X=-(#sK܎3qcmm.M-ԔrraJm-fVPr0, ޽芳ɢOn5E^n0 쒰ϝײQ " o'y_g@lqױp~0mC_Veep}R^BR"c(t##Z(`kV02r8"3IYPƠčU$zx# ˪O7K^/uUȡNq|>ĩ]lq}ȷ_gDiZo7!EՓ)aiXÑE_qȑ2Ofrk؞u-t$͹,Z{>2rsz\32SF,WPC."gdꌎRΤ.%?%# C7M%]CZYA+v2eN~ۮFeY0id#MjzuHrqI m"7qy-l7˶vV&Z5d:$9͠p#k#ad*3ȡU!^n[oK&՞oE(N4-|8^辜J|Mݮs9֕i¤o2 ^S,?oKcnv -"Tʒ3cd|U~n母c)>u-$LA^mϲ4Ja+Րj`=Hw?D!)dh^G_5Ǐk%d\G:2roW\̚Nd'*k6jdզvaJ jiD+ڐaTRtu80]\r=镃=cxMjzuHr8ۮ7edqmedpꥅ9,}4Y'Ci-"y!zP{Pnf !*}y)W[]y%̒[Vcgdp%ol٥`:Au[̜f =:|a|{i+Niҵɲd) z Mjvu@r0?Znֱ[YpѰ2r}'{qa$L LA~)Y" ~ؾb1.Wz{ȡԒ4 ;$;%[yA[mem(2z8%y٘pnHȹIC#sBkep vȡd^u;ӡ46!H 7_`#eF&'T$^&VtmSddaaEJ '+e'K 5˩zukNPοnwjC=Wyi 3˫gҢ="-mMߦQ$_-l'5=NKhtcr{َi53o-꧟Żb= %;s3LqWE}GPXmr'T$ޮqKZFԢӢERz-SJZ4Ѫ!!gH8W~q,|O."|okծF&Z5d:$9qZ҉CѢڼdp{M(ܔ.kWew]IzBuHrַ銫1Yqd%2QD`Hҽ 1fɪ]!XsT"4%xpҔ+EqF^KVo7ẋ݋Ȥ$;5 ,## l%}@4Cʿv⏍>rf_id6j_0A+lj*qY-hՈda}RGbN[?Ei ^g #UYr   [~/ ^7F&Z5d:$99} O!$.0JMjzuHr8ms6O .;_ UUc~sKo N#/[>Z=τBWY&M4cOIӒ0F\u_ ?/F&Z1!TqEL$k׵]8s,GJhUC֫C S"2%WeJ "zTXMhoh@bTd =%?i:.p$_o9ۗzӃp)ue~!NFW$9= =2rA.v7'1~,zO{jzXw$ Z2 m\-X}ŕr"r(UJiwVa*:9\ "akgKkD:6M'}H Z 22#D8PA- H%(Ո`YWPq%k4U!uєuiK[J 7Tt+#+yUY%?sˋDPyHx#{oTޏ۾Ĉȡl 5uS~p`i&UNPpOߜiab,tơr Z4Ѫ¾?DZs!Hn_BmN[5Z4Ѫ!!Wa$.wwnuۂccE1^, ey n֏8`΂n1u0uXѢVH3WKd~+wWNF,T9^^2Χ̧$~*fnyPY\F&5`:Y X E:#^ (F%(M:M # _|މi9%J5bZY(NjU_/f"׍ѢV YI' O]\_B/f_%J4QPA^$ {4zr9T?<8[¿ǎ2!- 3 kgnZ QO4cOIg_/ʳw-pE-%#33._$_~HyzMhNCҴ&k*Ƌ["K.YS6J4Q ٮHa7si _4R!C@h\iFR ٮH﵆]O/>cCbK'<^k!S#őC}i0Dv oZ|0 <#Ӫ!!F;}v?On6:nrqȱG"r(M\4gܼQGY9ںx\R6Ŷ4>".`$>mzK-8 -&}iX#{ <;vaGnOB_O,t+N^!hYNv [}wXڄZЎ4@k쓷_C?Q(r>A.Ƅ8`ky]-rky>s%# B+d,Pp@ryJ); v]ʏzoyyK&2ȼJSuei#h{):N s (W!̮tyok!_o.fMjvu@r˻lJ׳ P_I\N6C.&M4 !i^pY%B`ވȂΡZ6ȡ>rIsBv8o"4^uayJ^XG}v ,TdW=q=S_MjzuHrdVcmoO>&Jy]-#4)$VI)'m#̱vץ^iDFW$ {]I> 9si8$\QEpߣ?"W`2$=VRI`Mfܒxu@TN(D 2*x5[%Ў}V&Z1!iJpIw(Lʄ? bGQNr8rd9Byshj4N6Il'ßӢV YI4NBF֖ S - S ٮHfW WZ k]_i$X D>d[MhN&N)&n N0]2|ߎ86%!~ZբVzuHrb}%׶r#1fnŞiDW$Xyy+I=V,3CV¢KZz-hՐpߟ HDjΘ5*Xs'tJ5b: 9x:Tq%T>M⤏3NU +ށ'~z[!2(Dqzrfȯ e60lFdLRNSo7%#{obDPߡyp"sKK 7 .36)ֈ`ߧ8& FáIs9)W!Qh5\*BRChhUC֫C} Aʋ8C0͛+=wh4ь'b^FV,kYQR G%JVbZBCj Mb֫CҔ=߃aPJoMbH=/-h͊4+λ2V$( ۻPԘTG-hŬW$\ Hsc<㚯Ey]-L.wc LlTGG F${/%Buc)z &O'ҌMb֫Cé`9ҹWEB1y{Y^nm*ĥekm*-˷ˇ2{έ'5aV1fZ 9+dhy$G ]bgao+lW $HNs[׋xu^)d: 9ւ{;rEWu>.E^ۛ_?vhE=bmihUC֫C} ϡ\obNRUz-{;ʲZ4Ѫ!!i0I4B! &2y9p:KMb֫C7odC;6qJ,?6sTe%FRt8(:&BLc?Zp<ҢVxu9h t1Pu$=vvsI6jD+d: YY>3]3pK [KW,)K1ϪdGK4Q&5p CzPʖK|@|}ӊYIw۹4mlwt]B&_&TI$FlZ Vyɯu,W#r&>mL"Rly_H-MjDFW$ S ې$I.ӊYIX^W0}x珴l\#ϕ~:9jDW$rq;;ߔQReppݎW-hՐpr红ObܭCzjcVRt8@IKZH;{n{w}lb\Jjv@r0U4-󄩬 pX4\9̗yj`߮4/snwpv[ddqGcٟE^Μn P+i(VPk ##ZX%Iк[jKg$c9Z{U-[MhƞPntSLXAҿAF_Tw]~c^#" .wKl9#9X8x]_xi$2ȂGUɹ(^0^KFXz(\Y2|6jdjva@rJ= [kc7ik?&$-hŬW$^azW)VW9IrO{B`hDW$Zh[ -限"M w/`TZQ&Z!Ká(+?[8 hL(7=zTȫoբbFw,+NtazB## J)С {2hddpO(vIrr u}դf !,8hS)84[VF_W^ݒ5K## \f_ҷqShNxKkS9 Iy@u@0s뗜PpVp*dh^vd"NG>ZբV YIg aj> '|Cu]lJW2L7K?9O]nnbC\Ql?5X,QQt? ?~a[k Mjvu@r@<y+䁚GYyn!S#őC!19.>&$hAL;}iAeV&Z1! \.Ro/Tz.biD+f:$9 KN) T iNPR k)!X*=1"r(=݂f|j")߷ix灊?cG Fa:s =nL83/i[A&Z5d:$9',ɐOBn?bD 244Z,$p6fo؋WPR/H1D^lW $s{?e=;&g0~tn'>I?&p赳Jn%# E :#B2Rn'B`ͧtJFIzBuHr8bDl кkpNEph'g*vpp|HiӢV YI7޻tIl,Y> |$k=vH=ȡtIf\C)]'R3;#|As1oE(W$ Tgh6.fլ&vpEOMjzuHrqLlۻrږidpr*7-iK}v'n; N~XW7FFJ)a$j!.6[IWtoz "0T St.PnwFFZq/'yKFm վ:V Kg_X/]JýWK[ C=kk4iYCOIƞ'oeh3Mhu$E5 WJ5Z4Ѫ!!FG\w !YkmATdpxxQe!3IZHFE(W$3)uZ% =KqG9㦋Ci:iP>ivnp|VL*tfusCLz~Yvn-)RMddal vXe jYFF׵NAJMI4#*3{RceZ=FlI.K1z=$'Glo+ӱfr$(ITVGէ`^33Lw|g?ȡ+ky.OxXI-胛?/[ `bdMu_~nd Ąw"(?l"?==JC/*؊^ʺ˳[QDXP}8陼lw#ZO>g)[dbQ C*do?# 9`= mO{' 2S79C*+^gep=Nbpf̈5pL{"%7S]E/k}vo#T+#x ҘmĈ4x-<_OZ3S_2r8@6ݑ]TBȾ,?R%O&T9k&12--##Z6Q2D; #c_dU2e4麉$5_2r8ٻ[7Bf5x,k15<NVox_.>p%:d7hlߗG5.M떆Hj4YFF4K3T*؅W-&k˸é/%+`I., q+?ezpAγ~_(߄PZdn*ly?jDl$ ~/EG8cx3 r`(E1 GYX*|n\KFםiヘFї]J.M9(#-4.>O|Wˋ2rd%Nvo?n'"B>|Ijes\\$O j%p\)"ϧxoQF6߯Gڏ/,/Gjצ|O"Lϩ9g޴TsB9dnTjH׷55 !`)FpnlSE"T% Ɠ|H,riDi@>?Cɯ٤I2ErTН #xf/}>+R̼mbn} NbfG!2!@K$/2siddarҳpJtҪ79TW%hC+(Nh0b=#Xi4ON9߇b]0wdg^hdp] 8PB#-"w}NK㵖)f8 iZliiwPéV[L}bu[,뿉W=e^ 1x2rO>KM}+2^@WVF׵p -Y/LZ:QWU࣌{zu %~淾A"wBz]P6F'##,Wtȣ{׾?3d?}>xrt 7KF'{XlOWb,LgppcLvd{AYs[ٴwkıLF&4@3 ,Y 9\" (gNv6kdp+#l8%C=x'Y]}1g@×9-$DWi ĸdf3!*[ d ~VFFת,UcEc4 ys9+Mp.xRR/9\`H:L cIWYAFM DzxU: DZG5x[12r8b>KB%;U"Kbٵ5[*gE|wAA"/Y6\ɂӌ,X$MތVŚKc~U-:u1WGD- ԶScl'飤$I9G􃓳U9"rnXEƋa7!2r>)lr=IidpSY o<ا+%60M68r:B1ϩ4!n(aAU 7CzmDP:1%DKEfdp]3&@ ơg.i NAzhTQ5m?Z2.㟬:vnİ)i%2q"rbEj5J]ْ/QzLLFX$sE2۽ Lhe3N5 I6R*/|Hs*4 ez1@k.@|CztBUNъeU^ۋ9\L>a-ItjqLq]iLn8:fO]1nN(k?3O̤}C"?&NE`?`ºplJ8Lꌒ.|4L?N3hl?KyPg&_ƥ~9*';\U)4}>YcD=挥3 xy͂C}'' qtggI}PCRGK j ("Q1+$W1c}hdpŻ ֒ !Z.hNg~qa詖Wڒ`v fgClSG^ץWTʿhe4ĉM(!S+G>iH6 }rPN*jk$mdp}^YFL鯗,+}SzZ_ܭuB6 34dHl֞)7x4ST`B 1/t>+iB, . Ƨ#,QuCP]_NG`)0ޮkԏxmFF4 d#pⵀ}V]D00qRDP8w *5+ߊحF  vMepZ7r.ٺ嗭N]F3/B>[ <<`?tbbQ>oB71},λ0N&{*Sl9B"mWCG9|SYTSdep] DF(ޛҮLg~EV;f5ep=<;hʳEӧ_'K,y=J8)ՔT^kddadhugܻZ]j;L0[++<=(#vg,k7X)\֍rZ)[jRf4e"RPt~gտh^k4tf-޾|?#k6`[m[3>6I./o=ʴ0QYuMirHJr9?mG>?xwIYkC1`"}4u)oU}w"xҒ5@aW$I`} XD`<^{%u;QiPư1f?1@tǭY¨#K9p.Yt;Mv:"332GbVPLڼMLܴi n N&=B:z32r8y߲L^!.n?ƸE42rL).5ΥPV\ ugpEl؋zG<.b=h6dZCRw>i34ƃ /t;5&=S<I&<v0=v.!w%.X49+(W!W ;iP?tkœt%TO#npra}s*㍌,pE%5 е};\KSܝפE:+Q!\p\E|iG5+L \s K|QhDW$;k;8mU=a5Jb0!8[`{w{-{3Z FW~[qu{ց䓧>f FZd.}L2%yiX#7"+OB(FF'G ӎ t5éXQܑq-_p$Ѹ'$'>Yܽj&M4k !ጻX;feMĩ\"'jBfeHqU#]G<E{LE-"9+;}G+r-/ˆ9!s.-Jy9㗋?"SyT|.V&Z5b: YX_0S?,=ǰb ch^N;I,rǰYdpU[Z`girvI!x+IIzBuHr8}'ṫ|&IKC6Mp^+f:$9) ݯi|##؄(y-2Y'"reF 5cik)ZBH0_,jxrG82:6r1ˡi[>̩mzdo]pZe_bMiE1\2ܥޯQ^z8r(3?k9z j a'"=>]9\w$qIU '\qOZ\#i_##p'nd^аݎ%-pPbدHuE! I©G  .="r(#U1N7L}4ь=:b=/;_U:}p Nv1+r&M4k ! vd{m SFRv@r0[/gn2@[^BVܼ#ͻ\AcY\mv}ǒAҤf =:$9:h)+&`KhN<# Rv@r;b:˶ϲSfF/9s&#vҪs9;}kݜe=7䤜m\&M4k !$휝$ bpџ &w`37r`< UEkP顑km;v%[pma}@mnԎkz s9}ȱB'nFyg?5mx} )h&*Fmkw/IEvmBS0˭H/Gr,jV61~$cÇW^Y_lol#Ksҏs$:܅І?WY̆@ 6<{֬m#-8)# ;b\L}%/nky48r^ k*Dͦ&cۏpM/Н-2S=GꁚOꃟqȯ{w(З_1JzDž$((2v-%ȱ>V\Lx{Gi0K T\R[zR%!=m*-B:e4Ϡ(@W$dz_pվ9ON}KzW9^GØ$&g>UgVMXd,F Y2_{Vd]Sc\D|W-bYSOI7v#3FiG#r/V;oW]rmd=0Ixz\ڍ+.󎾬;X y0$#ƽ@8/=i ey?r6$vJ/[e/4H?W삑X\s !k 1d]&VhE4[zePA4Z{BuLr<Ѥ*Oz[uv9+V;Hگ^Xcl" h_CsYD\xm=^AR'T$,N>OeJ$h2jؓAE֑E}\غ|TɑRG璃CZT3#.w fKȳm#Xob˺rN(mdi؉GZkS"P,0:(9'"cZΙPFhj#KA`mDQg)4-ǨFx/#dM=:&9.휸"D]9iЖ& 3(lWG$GA }ea-,lQjzu8jhDv|~D>ׁ# +yđǥW#?/9]ПRۥ6r:dzvh=%ꔅp*v/YwYWAR'T$9~=%g_j@vgAjvuDr4 3&--ll#K_-KLܩ庶יOWpc / ؠع}ssjRejN|]ȴ)pAHfzuK_{H0c:YtlCi.P2mdix,\]j†S(g+|\֔jh`DAhփlu^TMq9R^O^$)FGZhqW\,nŸO>=I7& 4יAR'T$dzSy5Z*U+V+l]]ѤS?k:)֌?^]gZi,%zy}n,}k҅"C׾\s ̯zR ȲeObDdx^<&eZ9֗7 nS%M[U)%8Ul]JOǶH 5x_HF.\Ud%^_mx77~pWbYciz3(lWG$G^f|!8Lvp~7l#TMYg .2:vv#n$6r<]#"MX^m9͋#Q?{IO};4#<0gZ"9wgʬ[kFp&)݆,Kc;.{vfBK6 )@cB*E}*@n:i2CM*a~Otuc㍝Z! jv;Ýc_jW_[")Z!w4{9IfP,siԑέy,m++cAQߦH !]}064ufĒ_w>pj"^|,,]6r<PJQ]v6 #/xI\f y`|<,"r]_mdieŽ٧M &^mx}^:lpY` h 6r<T:". V<M?_+^R[^ =l{BuLrc%enq}H/e15X&Wߛ] ;k~uDr-o/N3FUUjqRgׄKF3G5!)@cg<z07TwBF ^TD~#E6¾Z'DAY_pRѬ<ܡX^ 2mdi]p۶'ӊ\N>{k4")@cRx*CK[V咪e[FV WˡE=E}QɕGPr֫cg?sYg͉:gs؃US֫cCyAW;G/6r%yc>H 'TnjWWpՙ>;2Fѷn|Ypuǵ[v{ηk5")@cu7hɫ?QLf҈!IYGݿSasr> +#yIA[,s-V_z_H 5*RkzM>Oqvc<9wdfHZⱉ+>b2'z.U_Ŀr/+_L䑹'T$Rf3lWw#uj9d;ڑi"RK\M-s/ծ6;O(BIܮ W% S\.X3#C){f3#b6>5v+Ec9䗜j#\6npAl{,{:Uq 3sYSOIǶ+Q]W4tnQf^p=/HJH.+!y@RTG$Kw/ kȉr>aFlH/P4}wBtQTֻև?T]r>Ec+H 5x/?Q>Nqˎ_M9wqJl pĎgۥpU )@FZo 1Ϣje?h.k|s> ~2pw .YG,TMYI,YZRʸ8$6eޢE*g:&9,?qu]Mt:m|vEq}@A5eZ"9/xܲH0Pކ/,g jݿOl400c~ᄘPjxuD ADgr:ɁEŔTzuLrSRm*Ѱm%Y+VZρȃjvDr4B  ln6MFvs=S"k1p_2_-,c!tCIL¥OX;~g+;(Ռh.P'9V~O̳ `Z^o섹߈ڮ}~MVni4f]SQD`{BuLrwk.IhIz?en8'BgPjxuDn=&oY4=U/Hq|?egZ{TMYI(ET5G4ǤiMAeLCU") d 1>5:S3„Zi>~ڈ0/p倢U3ƫ#}o1zۡ.ٶD:sAq{T^)1w+wj.I ^/},Ƣ(@Քx_c/vDo% ob_muEW$V~Njcle-͋@A7]-~kA.ɳ2^3/iQjzu8;fry fu)?f0$D!IYG%=ʦ̠-Nӭ6OZq>%E$+ %BCwx D]--ql˱%>> ]ID:Gڶ( P5e:&9$.x$AՌjydY;VA~7KA\{!t^{Kr &-- grH0 @Ղp_ 򠚲]-S蛑'E؍ʡ3EQҾØu`o$oIƴoղœeEG܊4? T3#}Oe%4]ڝ ~~g @hH޻PA7eE:;Dg< @a]G f.QM!`Qr֫c%NC+9app*~!E")tqͮu B4`gmGf68ߣRƫ#%$"Є$YB2.x@Q)1',%%!4-72.`+oQPBRSvH#GnD$#g%Liٱ4~nc?f~5H 'T$KĂ C?l,~=V|EW$bpCXڹҩ%Ao^/sSv7@޼m=7?ㅢUS֫c%C&ImCXy9UYT3#ɏ-9Zײ^IZ@$'R966)ȱxE~2ًtRok-bTeO<_bՊGky%^/&C 35J6It"Y.r]K8i>EQ)1t<;jźA\L TzuLr\&xʵIyDP(61Є<ŵtQAQ)1͸pW۶CkE΋;"lAQYI7r.j15dнpj@"G5uȱO_7kHidq.BtV`0)WG$GK̸z= =Y#jk9ȃjvDr;lrO>=;=o-жu v 6Yi-\7h<*fYWN51$ȚzBuLr-gɻ4!rUߓ٧q^u^էrH׻s?۟nLW#;5\ҩ׃;ܥL9^ׂL bmbAc9ѐME֊g,V:6H 'T$?L*"<>65PTb[f+qdŇǸ% dM=:&9gμsW*{l=GjLEQYI6r z}aXV+;EfWG$K#tIODX9٥ 4c@`6VE$nܭQT,Z9%g SH6^8$>Ch9@0rH|CW[V-uZiW^Z$c%|A @^C5Gpe0naPjzuLr<}p T1\Cg;mdiOL!eFp^ϮUyh@j\|Tf{!)@c}w~yv%a\~2yLS?jAjtu<,KATS.> H[ٛ%v1mx˪pqA!ICzr `~uDr4)G@̓S8 M4RQYpixT|3 ;WAEWz=FgTq'>ڵYK9{ sOI!>'^>éMu`دHHq3w f)-$A!a d!9u#%\]cQ՗NֻQ[7Q[刢U3ƫ#}pX]Gۋj#c B1]@]-4LEPG mxF\[Y{C0JWԹ )@P/mY\lޠ9'D)90_ o׺,${gWV} HfWG$Gq.G '2C{:.A F'owƛg_M^y޶n_T=P/1.y&V Bc b0҂ PخHf܄(jΨ,mI{~υ̢7Yԏ8+c5WqVg|/dʑtT޴9gǨk92mx2\lO=qPǜE0ʴa}*Ѯo~x 2AkmבERTG$Kcd*k7_o].1$قȃr%}NɁdkT=倢pYOXyPMٮHf=[B64otW>"p_;FGF'cmu޴>e G=.ռ$\y-d<:"Y@N4 `*^ץOFyPt<*8Y^yU^ EfWG$K^|?dz6xpg-i?el`]y8Fl%6!v'"a8|9еH 5x}'cqCX6};KNc؛FFP>['>[Wߴ8H~@ 5c:"9wW#$p˵8ƚZBG]*s@QҌK:<{c)5m4mxߜiG/Rn\6Mq[;aY!8`W9^K,vm(z䫍/s(XSz:E\[/w5 % {:C ryHp&&}|渧,{/r" i;ɤF@Y. /{ @ 5a:Y[͐0FdiV=.dICόژx-â(@Քxv8I^쁥{)j#K'̧+%01昧KF"E.ȶ r>#HG&iu>r%(PK:ѽe#dM=:&9d1i5곁m* $Mi'S( P)|y[@D-skd| ,T6O( ׂ'¶%\tT7b >eIpfU|x~FQ֗sgȒzGKi#SRA_%8 2'T$wi'.O>&r<tanϙ0}xH yA6rsQ 3Y3I8@8jc9 / LCъDm؝{.Ej Spv9" k 1IeYvq-r[ZAQYIgNzTK- yf ,} .8=dGYj) 9]FחUr$f(rH&2-mx WG27[_Z,T$+W&R9Mqh"RK(p;s0Pi5NL$7]Ws5?్/sm[.N~ď:d:0)}K ǔN|#B/=ah#S,aɓnՎL9̅?{Z-"ZĚi#S'( @QS @]EG,ճ~ݫ:E16LY}@[^KD@91!{21.&BL@OgS1 'ɨ-.оȄum3e\0קDRKw =QZާCG=MX}*OE=Ka|Aί1_q>DoDxq_ZC9^jd%|յ6rS}u3Z)Qݕ l ɹH9"))O>sBFXS*{<, {qG) >.章^m,m9YF>G$.CqCyo px3ԿXm@A<"dcYDOY܄[kÀ Xzȱ;9šlf#Ha%n@!W#hG0@!fV۴WM%lzn:k=niŶ%vIhi.nyF6Jc-8J" i#K ht S)i#3xnC(M9^1֭Bf(ۼlg x )zܲ@m[M9V^a) ;7>MXҠOإr:s^A.ԙ CNStI۲-%^mx}}xP1Mhs%[NMyYzQT%+r` "@u"ҦHNE?J&WFOM*Srq>^5=~G6'?8E"cwYaFRLYZ:jʞLaϴQXG[=>@ aҏ229icWzLz֤$"w>*۶.^ Zm/=.ˇ> Iqo :ՆP! jQ5~ํ`F'k)d].j]55#TF'^^\A* {BB$i#KŷI޺޽\& 'uS@~ PZ 1mxdq6ܸzFm]*IΪY14cuй*h/bVll#F9@t/)"x^)>#x.2n"O Q>i99JFm?#2ֳXnQx b}JA`y>嫍wc+tv f:[Ћ#F0/Le ?BRZ]:.)6rČ q Q !ׯ;8;0Pp^dԷ~lYZb|s?oЇ1‰'dÈ_߈-Ċ ,RRr>Ťd"3Ob-Ͼ*AxWwq;In>X,csDzCFǏFkxm#붰.cȶ)jW'J\Τz"xlMϴuʒns˥ T/LHo%z.ȅN% t !K@ĩg ?ꔰ zr ҾЦb}-ܴ}^_6S&r5t򈡆U B)@ ]|VYى:"Y. ֳc߁~ƻX4c%v9>BeϺ ڧ&'C`?#[2m`  +e`U k49T> [[S&ϡ~%g#}>#pGegc>g EJ7;&2jrT!/m{ATmMX*rRďY -/KOYZtUX* A2mxj(Erz)bϡ⸪l$GqI$|Tϝ6YULHvK:t}r,G~Nf"Ze]ݾi##b?oo*B!FQa>̉z}@z1#~/C? >ِo$mpȅxsq H:TE!>/t0F9pebaP?');C_9ԏ7}2="A|Ge,3{l,[#dymxrmG6T|HAiMXtVPE/vqY/h8`ٚ P[m9^G}yaX~-#}E)kelZ=M+yB+dyҁmp[ZU{=P?bD"}#U&|`;e7R/|x6C&G᫖'ev S"%pP]K,A8.'x,6ϡ0̌lo*͖%s8(c=tcn׌ r=^,sV.=R~C+cPjzuLr1RquokA%#,1J̔rR)o(Jٮ3 _v)>!|,_2b aF! #M*Aq2!q§lQɣ: [%-"wWgynv N^VTlDQ)1ݱ{ƒ{xnM_6 a=0NNߵM_ 5[4~[6\ W"x 8< qU\9Ǘ蟧N`@jvuDrrf<-+9<_e;8a 'Ku5mxB ,rD$)αJڮEvW9^k]hT:<xQQL_S6αT`lK֢gwUdAR'T$3r%?jjЫv,h56=i# 5tD`;~i-'^F'GDǍe9&:" 6ybď^H 'T$dz{{W]h2mxu3l(r{׉"xuuVwKsf i#En|ģ(zO}E"ysq&6r>,{;^tF')UVv}t>vw?ͼ~ H_-;RZi#ǓI&ZJ[A1GCdt hGGCXI镐6r=~g @YF 6>ßx[`MٯHf:I֡ <UGyFګ!>тG/<^r-d 1Ü>ᒰK ٢W$]4r4ɢ(@Քx3.nGۣP!<.nggs I2:ku"%9![$˺7;-{DQJH6MFv×Oi#Ksz9ٴ1ICsx;,:H6>#}&<?E3`jn?_O{VŴ7P q́CY'ߴ&r<㧮hM].U>Oo%c9V!ջj?~Vk}v=lv+w˶\JtYXzUdM=:&9!ayƾn'զw[Tb0\k}ȱ-F !E.NwV碆\Gz Z$c98786r=ײ,yK2mdi}A RSe)cr%eI2xޟfuh k5iw0U8ʂ5FןxEoRv]7j#UM^/dk=6n <P^ʹz,M/F'^5R9v_1H 'T$rgq1M6ʾP,8&+O(y;oepW$d}sq햸<(Ռha,ٛC0'^ U]`p@Qb8qEnvFҖPq򳂾@A5eZ"9.+ i{C lz;zQ91jt^cL^yB?fȌSpU{5YesT^D+F _;*R.Mb61$[Y[bϴu_|<ծ6rQ^xaq5 Ac9^_ \Dy^{W9^_6wbcE2mxSɻ{nF#{iXdzlkKo@&&'TǤ0YY׾/~~};5}~f# G_ UיAR=:&9^b),\Sp?Wkt>j#TMYI*fSvl,bij7M.Q֡r֫c%`rN >$3C`YiyNƏ2|1q,w/m:$,X+הj#K?lS%izу a/NӸR]/IL.~6r4c5k5lukd襱m#kZoĬ}l sOIT[4E<.$o5K/fQjxuDC=nNS\F$^7R4\;סi}Dk~1HjuE6ٮ#cy24I{KI:!1( P5e:&9УW8P"H[rpXתyA&I.yM"'wD8)~E# pI>_-~SkPo`)b6rOgk%B*7_3YafBBJɗSIP;㭗C4b+s~8!Uc ,EW$K| Y7q]&f,/qQƿ\ @6\Θ9tUY?US֫c 1 RQUEȪ$52C-MkDQYI)b'3z+Rؘ/dDv:?ȃjvDr4]ձ)&;^UKVv d ,(gZ"9ڸ5 ˾a-(|"/nr aNI2LqOI?\vIsS,^% bKziPr֫c}Bg&lc 󲷹vڤL/yPMٮH6znR[F>T;b9  WK$GyVbzZd˥,,DzKkI ^{qE0 cՊ<틦XDq_D_( P5c:"YzW2ٴƛQ~^yFs( P5c:"YwY*hIZոD(̘# HGf柧)Ѿf\VT8 ɭ&*λTamQjzuLrNɝ'@x7eqy4 jUS֫c%ʛt&㐷},TMYIavr|y+]!,LgzABrvHJ[Ӹb'AP{5sS0ޭΈz@uD9ɹ<}PK1^,MWSIJ4АB(/wPYI;qa W RO(^OWF5ef v7·v4Iux<N/ kڳC\kx(2աRƫ#}{(~R|s횐%*ׄ-K^S EW$r")p?.9#TH)|"CWWX0?Y;>sn/W޹S=8apG'k,9`1AQB?yq?\$u % IEQYI=H\ܻUʯif|U?-WǢ."˦e]m wšr֫ce3I<2N!~͗+x1le]I)_<ٸ}f$`v9GUHџ8%ˠ(@ՔxclNݳ'cdߍcJ!3B)q;`cjp4$V?nFT_LZ })>RTǥAQYI:̵o搨m]eѹ-1KX=|7ȵ M>r;R3( P5e:&9^qRO="#k1оǝܾLjUS֫c}w|.` \Iw2ޫ \bߴ,:#PخH(QК )u?ZުC( P)ҾguY$9\ʪ8B^.r`*:bhGhS`8q YRGx:­o*5Mxh"%?D\llδTv`!m bh k 1|;~HC\ Ԋvb)ghϷ([7tPV<45s7T˒;C?ƗBR=:&9^b?"V-Rq随::-< TH䡽ثh̐i풰荋$tiPjzuLr4]_)IP/1/R>vm# hs"( LK/hPjxuD4WlN|{]6piz1< WWD-= Qc]>a sOI^횦rxwJܓ؊oﷇj6 .ѢU߃m>p s)qFi6O8E4j5eZ"9Zh)#u+ƝTyG,TMYI2`,gąXnK|ZƢ(@W$K-wi ⸗๞e.YEW$3(BJ#G!hYg-AQ)1 XC z0t  jydY Lldkv99+X,,MfPv#+!dqj9n}XT /_mn^1mx15a5~ut>wQ%YSOID9K׿^Y&TgQNh-EfWG$K=f,˄/o(}rir\οsݡ")e h ?RG.͏P{7|(EW$K)8csiI+=CB<[BzPjzuLr<= \)tԦC3G9%hAQYI7@`]z1kY6r>!%rw@ Vʹ%lȯʂIJQ)avy)$Țy@uD#̄IӰ(䲢b0F6 λde?h@jvuDr49-d.ܬr(K+aio)#TzuLrcq8AL2a7,t OF(T#ewʎL%1mxDp?Xm`/iuV&l25@9*X&-e)a\bY6rڵ80);>(45E<ՙkǻc9^Sl$k¯KƱs.OwY8DA.IaTOSFma缫Yll$7Ac9*\HֽL߰=^mx}Q@u*8;m~}' s=V=&r,=3(=_HuԠ E6TraAyW/lTMv6kN*ZZ^G[ȟm[eڮrI*侇ZY>Ok"#W9eL,k^ hqN 3mdiͪzGuwՋXFg֙YWZ~WOzc죸xnSWܨZP[t|iH߈/=u[PhR-m[6r<ۻ_}̚%K-^ L#VS2mdi 1v0 / r|V^uQ1i7sgL?OsjA= R3x_mq+풷5o?D/O4mdil=aAFǟGQ깈n˿/w#,{f FGuF%'Zqե&-g<6r!'d.^SB"/gi0ͨ6 (1$$E@kU@-޴ AF.ĕ`ڪuחWE%9d p.|lRaZFFmK bDg9d>4xR{x[f|v:cJKe* OBWC%i-illATxҫMe~Uu[c{F{v%gҮ}sJT)eq\$Գmb~tyii2$3o$TYЏo;w|+_QU]7Q6DGVoQC{_UC2};ARx%ul$UF䏘Y>oŔ,6ρ`oӹO9Ѝ-eFaA鰐G&25zqUzhTl4W7ٗDU8x/V0RsY>9z_':v`:i9Kݦ&޹Xw ԹSCM(8RA 8އ9ԏlЫ{NQSUVmastT 5(*dGyz%4wN}\(\؏b -P"sQT X+ _^*!XF-$H Q\t<*`aD憾wD9}ޡ{[]W%<_ۨi5抔1'or/M_W4}L c_ 9K jQ\TuԠz0<53üT)'˙.rM]rweHE;2z6!0;`zޡcti s8'a;]%Twr=Q\_.*c; 2+ٜR\,Wq7#<'a=(w]'3%WGL6mx2쇔ٺ"]cF'./ FƻD2ȋ;[㈌/3O+OK`C)77n3@_|QEv>WҙO}O 7yn+| F_Nf4.i2}=nW\]mt[o5TYku)@6?dpnsGX&i7bkOȲ3;*©r+ %uux.j{~20!@:P`.C?I.W!^$'<ޕ/Y 2-d MXr"Xܦ dHjn>mxjk]S*%u&s{EZ U}/֏KSEJ~mRִ tnz}OhwHz[cnR=%P.w==P8ÿ֟D_ +7E+y Ľahvp;w7gBH +A`yNϡ~<|O^t<_SB9 FOȩ:lO Y6޽v=1643DC<}4f iQHv)(2wؤx7mdX^)3bCO9VbNN#|wGTgԁڏSWER^9C8MXϞa-Zl_іՏWq%46c2z;­Znreڟ8㉧;C-.9'-!*?_QNI2xX?UFa s~ebOOZr}M9Z䧵7o糬Wm#U`ޯ|Nti2)?^ ; ^JbjVޝo9y'2\G{O2ƗFqFۅAQ)1!wi#p`r>F#O!E뵰>8Ǜ7+`j/ήV9-+#t?Ễ·lZdu\9+xa}l^-1XT~tmJ&:kfW2$)d#O ?F x a}UYk/M/N0M39MIIa#Pv%I]~TCGewh{lVk&$e?e¥D1mJGRz'ƭ?~yJ߃* 7.(Q>0JR|/\}9^)/u~kG`%Ījz}](ƢAtlWcf'ԇ>jmUxQ6T@M&8b7.ǣ'6pa [MljG:у>myY W?$C:t5PVG/Lۃ\q0oЄˑkݪ eIh%ĪŖJ>8UJŁ.)MOvQg<cˊ1{  sKtp;j0z,= ZYRGIwMUI*=6 x b] <]Zt梄<<|!j@W88i zSWzik? O %)Ǥߓ^2z,,c3ls`%Īdp6n_ގ:VC_z[}ZWҌWr5 x؃Zj˗dN|Cl,:T=\4/5h04/Q~s ,{Z&NםW`$h]8 uu|]:Nfj+l8mƛ 6>x p|y9 @m}ՖvD&WcEIP†ÅuqVvE,XPSoph:i [9l Y^>Zנ _gEQ*MnRI %0AmOZd0;cYNf쵼+ߝl;q(X *%թ(l]: {E{Md]돃\~qq>ۧՒ;M?Q}}Zġhύm2: 2hz) {4{Gbik;= ljq6ntg#57o?,#dh6ï sjf~fKE/O~1S?)Y&<`%*n%U> ݇Ifm~J[[TGIbD:MϢiM@ہM^ nO6 8'5, U feݠ \=zkjkeG6* ߾MeI=ATҰbm蠌' Z.IA_vV!c 1һUzXT~WdBOV`*0*1Zxz)˫}U٪(K+!V%DqNcHK覿0ƾߛ<_|ڶM]uqMo~2MJv4(XFK!4 _r*PtJJI4ͣ愐?6H- 8$yucpTXLe j݊>y"n"m? 1J.(6ssV۱ VAhϭ#g 8Ʃs쐠R8<}JU.zOzpVA?YQy”G}2hGaL\֦wtz?_>hv~mKwMԫMZ{Y=fr^k uLG}>[ـG]DN2*L<09W( %!TopT X_Zl=rN]4/c0[[kz~~_0Z *</24t92)UK#ZX]lU,XPSoLl㰲`{sl l-c:"1]M5+yZ}hK=<=dB7As}a/(6߷\.=uh#Tn~J‰JA{^)lJUIE/)7X%}(J%&HjPHdϥ1k`- ; ;]þ/{=>+9$;Huh@7XK$3 %9ȅ'+F^diGj  "<^R7cl˖t&tge {ΉeT̏Z;r!4rCOV.a9WIQQW}+6)Z b;^&* WwACC?IUyDL[U|ZAbVmrbUR x _ Fd>*~ɮc6a7;A4I 'U9N-G7@]7aD2=9Ho!Q'KcBm7nO'kGU ^Q|u=kIәk%߯B;"嶥éߓcUckWJU/(-*"P.T0/[xi׺T0bDIcu2.Q5?IDB"[=(E{fo*x/*?zV H04*%IJ$bfQCPL2$1wy09lVG^}9|ߞ Щ{߷)"#!F% T 8O\tV,.jtsZi,@bUR x АtMw0EU )GVd,1X *%%^e+)#حfYHQ.(6F&VA]SQk<]FBJ"t?^װErC)o/g71/pbUR x %ބ2(z+$= ֨UƍY`$hTRKtpFjZ(TR VwެXK UŻNtbZ[ikIg+!V%_ c\ZZq[ۊ\e$([btkmom14x& "VXT~1;zΡwNeq/Y E/)X(y h#hS2Km8Fj8ʗG%S.'r؅țff]_Na4{Yk6. Tӡх46f%eFEjІ05j ^fuK67U NعRR<JUIE/)g:V,u CZhM*r~^)ettA$?D ZgbюnW&e\O4J2/Q2&y{fERSSWz,nֶb={W[_b=a;5QBD=4_f?޽:a+q⛉D[F7 EV'A+l{"4Q^"6xYM~l !q@TP4onF9.)6*( A8/Ls(lVž_Fz4FM&r? E@r>Dp; m&Z6ȅ4DN]H#zP[IRK#JunB_msi^0&,\6 3pMnŭiyr GKm6nRIxa))R ~=Y{NJ~-Q?Y>aVvg66 \i9Jm c63M^hu}o&Fֱ Iy#A0NΒӠRMBRߣO_[ :>0]cC=R0z'SA`)@>MOyk"IK2lL߸;pPt~ϭM8w)'UYY,C_ebw u5 x03N 98Avfc/uyh}>k;[4&`РmCG ~urQ6fwDdyR8)UNb8 _PF}?:sg$4R .`)M)P"B 3Rv"%练C_Z)-NNlJ&ޡS$jgIן"L,f/1 h߭F~q8`rHN8Sl9 T`0ЊX_ #(TH f!;R z]Sg5Ǚǧ= 8d]}=&{i Nz/I[0œDܐGQKHdB$onp)2Xwnn%"ѯp?s}T~x3pǛ; 7l{-6-,Q_$#dtK$: 8d4= ! )t#:ǦJR jYp&feEe9^q h N,Å({ F)^c>yrW  o W&x/ۗz n_+z{ε?%4/{TnB~KL D쒺=c Wb]Տ;DMEHwr8THP\Yd(zaw*1`r[$ʥtY1敒e #L1;+A¦09*P V5Q;^X`4(CA:w+7ۋ~kWD=R"6 nAM!do90+!O#ON$>S:~F"@~rEIo#$9{&yX1?)SIgՈ[wTdʿ4c":Ml?T#FDRI`Gɤ ,6E_LSrI9Pd|SDZ$t)4­ &wNeÅOW: 2hѤ>}xJ,^ 'kDlv 4^x)%KL\[}C*V<ᝉM'R·#Y<#'\;a'iL)#:1崁6gt9OLzMCR4_:td(%3Ѫ`Ӭdlrt̰8)8σO13gBٜh|xW%A3LJ(D/$x;>9=gGNe7C|7m%,}T+Ϭ66%D?/ݪ-:d*~{?uzXh^3d0@Rǃi#?g7GpJ~? <\JJ7'c;˾SϠ率tAٷOc:p1U2mu,ReS %C!%l^rZ&S{zg&볙蟡]ml4rfZ; l]aQÍB,S((-u:{zhVO ݭ_VgO+1?լ?giV~A?UXvNVXhv,XPS/b#W2~G6 1bvױM[)@fx 7ꈻMb=]`Ӛrbl!*ڝ31K!'/;;]Nq`1~;ocL|$ՍU2_+ܪ?oh68 XMt.yQuoP6SwJ˼yͱaZ3~FC!/7zMehjo1?w۳MswZ}y.s6D+| lQ}'Ju:osA^ Z+>Ҋ  x Sv]RapD3-g4<Ų|S TXzN0 jju4Nnu\O g`eWzksp!k|;OD'^|2`)2~t*j8vg{(ØZRJU.zOq&L0@ѣ BPLTQlbx 1 !{NvJIύkyXR lk!*Z =ZM^ ׫nm~~(W+ͤBjW#9nURe%9>7 "ڄrwI^ZZ/m^׸{ U1buʜ&WcYPvP&>`|K S2ɇa=hE(s#1< XmggL-WIϏl8בgPi'xZJ0꠯6MK!'~]kV ~?qžhkWL~p* *^]}3 %\tͼ,wĩ5 'AGkPyԁ6M]V?wgy_׭MEIFΜZWل6r0U+z286u7`)2~~䫋WGh9Bǯޅ>_tſB!㿌(:ж 'K Nc| 7T"՟)4xa٣8 }.T9,k3dc m~}k-:K3WKHms0q4f)~[ebx\ x G422|idl^MY{7+腱 0N"vaD<xjo4Buzf%*'o TE{ɲ#%ơDF4moH{_*Mvsi/NX#ЅPߏ^:xj"A%$kԦn/O]u}^?ΎL`^So>bIANa%%oy:.'g~J"X /tK(+D"3I2] AwLj1!iיURMܬXTDZ{^wA90Y&B= ^RiXމ}J8g}"za^fo N524 xszGڮH6nR5{4{۰H# q?rnRTONNND4d3hjp;< qqG>^GH`V9͵a!v腲n#7؈y5xUv+m~jSz-YN˭Kh6o12ƐceLN7q8"ҿ_lRZC٦OfC6!Dg^vU$BeEьfw=U03,t Ai]^EIpviy|@SN ss%()gPb0s,:fy;3ONo"\<8;kf+ R;$b sI%w.J+ǧĝpC7)ěl Y%HQwYO p@¦U%ىm $ٌ;A?^3=61rvO`շf/{2cZXE~-n womF ""&4ְgNm+Z#+K@m[  mz8K{SߩMUl)&ڟ5 *pQKÄ6n5WJ"?D*Ilj9UvD/ )״&) $SpYUUFk57$U# ѿih* zpB+*Di롔T+ԭMZElq-pc=罪ℿAEq6&V)YԸ`&'gϭM(vbR8B1+_{lhV#E]=wd&WcU@NQm'ф|:J)q!#Dr/ۗ 0m~ =k IZvmk|Rg<;O޵m~Q<-Q|'!<))d"*RkJS] &⶷1ܙk$M[ͨ k;{9 m4WA 84 j (Slلٲg"~3CNPĘ߈AZ@B \ɕpAy%z<~;uos&_ov*r LFq]9piXuěcD3=T?Iiė)f Xayy~&ԟ0v3jBQj2" D%B<Iu &;0úˈ#u7kdZW Tswfo 5(9Nu(Tkc|<)׋\N&& ŀ兌"g|%'$RxTOP8>BoAc%c0uu(dHJoӆTI4xaHUn3i3 iB^b4 5#4 %V0trF(yFXV8 ^(SiVp -j' F?)D/I^G"a MՉM&;Pb00nV8^h#յ} BKI ^(L\ {J r^r#P" e$ԊH)LPAax#XD쒓aB8(H!1be&9m)P^PH(R 9F8 I˜Tk.Z>)'V9Id$X}<JHV RNXR-Eό-Sɭi PIUHjY ͬzIA8æh;=L2a}#j35%J̲xT NgLiajp$&TEsm qȘyvNS|SՄgy6G'XH+M& ]<7GN޿_踔f$%&jGλu&ܳ3Tu K ґbLZ񕓒HuIRa^}!zIJX00Le&v#;\K> }ϙGTll@:>ŪcR]r) r~6Wc=ܤxIrיLV7qzLUY 2 v?usf8sHfsܖ>MGS1@-s 2aS̖!-"rɽ .|D endstream endobj 2543 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 602.999 508.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2561 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knPT endstream endobj 2542 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cone.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2562 0 R /BBox [0 0 603 509] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2563 0 R >>>> /Length 185809 /Filter /FlateDecode >> stream x}9渲WQ+8" pZuOsi8zFW01dFFg3ؿ?kc=^7}/+_ k/>l?׸ϼq?~tB-+4a eY\tWU-Cq Nu-+4m6F0萟14B  x~eY~Og]wj]3o4? E}qBY760Τ} tYG0Ph[H2=<tXS=P"q,؀)cN lC2f?k;Wۥ)}ð/[[)4l-iu3ȷRd02G.M`|w Epi1Bi^Wl~ƽ% hj(<?0K]zdIH.Ʊ띛_+aΡkm=Tc+ZW%qkYYTŮ *?vڧg”ZԚ8jsxiޱ:Ol_rufV#N' ,V6dײCq Sp 3n_Ji]0"W4@ $FIjي?ӻú1^]g'iqF} k'CX"?_NИJp}@ph YҸXٻ]Z̗W^c[iO1{p8t&M-X4 6ˮVߌ'1:vx92pF9nF[B ߶h@W&!lf͏aƏo懸+qqE PfI5?Hܶ g<%Pi_ :=YSL?od8iS2[BDv"Lk,mLNgyV $3Bi]5޳3n柍gtQ9NϴN'(% Ϻ 5,-9; \jluEøBsqR K>L1K5Luհ o=uka! LJV'Sa 0̶ocm,+TG%mFVkϽmЅ3j0 ֥[кj3T%]?`n ?~&gw_6X^_[5̾z-ZUc[Sjk}z=TZW-[@: Pû%h|}}J$zN@U %VdT`3٭Y|,TdxOcmJqn67V+DUm\ 6?|9Lm O]cB"4t hLl*ۮzЌ~f<}XYl;+7ϖU`U< ])e%V$ 4lɣu܂J?ɼcc.ٳ=,g:8==TjۿNo 5rO&'KsءДr)ӣwdKVh E:x}pK,wL=t{0`E@2= W3R7azvBp$54BvvkZTw){Ke=fNv!HOψ`ٺCjm݌>r-wݯQܲQ̞u5~Q7~`0Iɛ)Œ :Zj J1pMjI d}^a(9jC[[8ٚ)5X]+徫< 5~ח'O| }P nkz\3/{vBlʂKjh=q^On"[jkm*2+tO.O`傺_,pyպghئ9PPID/ƾ!ʸ0S{؃eYUal[)}Wh^:K38^,KIo|R0Ɣ$>\ȂJ5xBL9 sTGO+q敖Lx,+6WJARE+AXLf\a X'CK|>\Ih֛Q gVMBh![]\ = +e`Q4< zP%io"*+=g/b]XV Oaft~Hmr&>ߤٕ`bvgӞ`ig&za Mrf2D aVa?nY{IL$I:s:"+&(UӡOW. GgYGcm҉/E87$KBj1k Hh҃S҈m,2 qBjrUPajB꘢SuWr) ѡCŐ)T+~jmmo㐐 I^4GfZ};6y=WM4x_ky"DxbNwTkoeLPo~pg'{J>=;^îhF|w@: f B?~ݽQZz&o{qخT3P+Zh_|5ǔn_xX9DahU#'Z4 j4 АUo -k%ѱ*8[GdL~9,.Z x6j_ }C s_$E @-F"caW$jeNv]-m'ad4-IZdNta0߹7aYWWpcT쬫K.i\:}c#Q=:CKn1U_UG4B8ԱԛRLkAuWĀk,9 JE!Nxy@έc(tq~]j_o*>: UQN~r[سxZӆH:WGz=-bQ#I b0"#(De$-t R(+qX::MiEH=mJ跬]ekXͻe'԰T:X%pgh»H^r\QK #Ӯ[`a_)E%.TM, K>m2Í#l>$@^'v &>t6%S[Hɢ0j#o)IuG"I 8qRӉ_5Lݸ![4=2v3o.c?< UY =ȤkYS^͝.mo PFzfCׇa0^38`1\JTOp C=)5NCuqT#Do\Hel(%z$HB{=/[Is\U.)=z*^} wCh4PG%Cq&}n^U'v[֣ZC}Puѷ|gI(A&3ϪI3FíވŲ?QPZի %P31ZNDEg'Ի΍Ҙ p0/:)}mtMG_[܃kOD@#""ȐSCӥU4 ($ꚜrQ)x:s@D}(ņ9 vL{WcCMÅ42DY( U|eu b)S8@08Umyfa [$[M g'{xӳt cOmeNNP;0Z 2l%հy]K>z @/TzF6؄\<|F ~pD_]_ ,*Z [ݮLeՔd"4,ʐ(_JlStBPT}$W`BsXKrHtd Ę~ҖLwr0 )mܪ;iXALh(O҄XҳgKabFgq(Yh:7M)<,2pnXҪlxЃgGnjPȅUyl~vļ.Ɔ.͛B~Kps7RI3SyƯތ 鱮Ó l#=JX""-C;C5RD})YNL5*wjUV8goy#fWgZ*N*a z ++K1"!a#1;G'{s4z3S<'N`G.)_U͖-GNp>ԳHe| Ff Sیe8! "ȾSZ!hf!-Sj,X(D+,*h62X5}6EN`\`x*]NmtYzS)Q, n QA(% t6tcj|~K2:\°PA$$|K'ijW[ >N6L&~?jfdgH:G3O_iRCXnNXzHۖ ` 4]r:FҎ ISsB2xR6CΡwHwʄc uIU+G{yJ4D۸'|1( $Qi&)F[ѢFMbe)!QXll+\eƌ<=GY`cVjRC-ۯRvg'Իj|~^j&/5W/Tjk5X46EM;\Vh^gPBp nꂺUQ[z.#b~E~*$zyLկ#Qa+lO۰]rI$#ZeF߾{E0B0 ᾶ ~xTo۟L*(&څ;}qLăm$PJkjr/KKi J'ׇgT2g4l#3~\"JLѹYPY6nL77h×)x HfP MHWʇp4SW(h?ڿ-+;JT)Bv>k[_&V]m5<LredмӪTCIGh]3^A $jͅR#kƥ3({vBO{zj.+ѫTw#»)얿Bc*cuY~B,<ZvC8I^V&P*ܲؠ5k`?P- FLfxS{3ckC =LIcQJ!&33~(dn'vխ^-F05Pͺߓ(:HHFz*H:JoOx\~ /+A%ynN#!ˀ3Þ 8s?m@:-? SR2"K & >&dSZaW29q}5o:uŇ:z5B+$j @E[KeTE!PCۉϦůY}wK- ']7ZZ8"$).6v"oP ضJЬ+ %ϴghSg-K6B ] p]s 炏=:])%-ךGѥ̣w9~[a%f]h/vos eȗ\tݯ W59ݑEN| 4lNgP, 5ۦ4Sx%9ߠ}A6 *tl}66e95(wyUDŸF$S~ES+{ 5yձP8*'~2wXY-]3w& 8 hTTXN7";HDteQs4bc;?NᥲEm6Ȗ,yo#*yD8EGFb+*, "a*,qbW!BjD.AumnV^05lkR˹H-\G]JfT5OWJD3ʘ*ѱE$Bz'MT`X A )e8zׯ I/eœ^:BXGdhw)\BXn"?p?ЀxC,K-Cn5zݐ%-P*N#jz,C;^1ХGc:g(D쬫=-jni^`[ߖgg]Zd6+|)\VͣN?qӻO,'"r?{! 9Ic*F)NicBoZc u{Lr^MyX_*|ŢwRc.ur:e qNQ[[FZH_ޑDS]$k Ю8B#D]`4_h=hX,p悲N BiVye2skّVA6V9Rn/D@  H2}q8;BT|J*b|LLfº#u$*ՈW2cnuw# o]<|p1:L'. zH|k4oez>e˸J&.mS 3[nbXaf=e}|f V|n6C^2<׵߲H$h^# &]"9)iuo?ފ̷Luu7Q(*+>1 [xl*b\a~bl3S5AC"وȍG` n~4˄l%Ofb-RLt!5CIlI_/$(7~j,錿px:1 dNO-ƢRYkhf`asB*uO $*M%ȉ`] ,OPhªcЯ> pλMo&soIi`Imztm|úZ&>x; Kcj ?;d1ڟPO\E#t|ZQwCEӔP3iI3;<<~I:Y(Y~b1w8u,aπe |"E|dUY#TJ RܵQ6MMnn(ݧΥ^fi4#:anNw%BBB4[*DC!Vm^C)_ȍ[#+ؐns=w8Yy Q ("c,8[ wYh#{U2X/=WN2lJ YPځfWp/.~ݳ: F$1 R<ޢIs+wQb@qccX ~J({5_ E@b@7$@)oٷTB@3%ܗ`&F."$]z;j\=kCB(Vk½m>:iX6 ;l -fyBNݎH'-5TUκV˖ZwV떪Mzi H"'! D3SSnF >W3j#mO&k"rka&5;QT"8;$ >Dpx M7Os4Z0cZ;f#P:1!!a5qm۴N YJXdu-T]c,TIaJ͊JdGՠ85Zy@iDHzDR5hJN)<,mÎ+{jWgWY+R9L( JP  va scɨUB+u=l5K W,RWBLݠ鸬ikhTs0?袖/NcHϷBIjuK_aNRJj*,? |A!MNr`}ekD8A|JKW0g[rk?Kٽ0+B{%Ќc 8* 0Q S кCdԏ) 9&EofqY"~t6}<>_ < "ݡzrUA(%-)@ zt2M&|Gozv;Zyz6K&{Yit.ՐZW9+%d~%uk<2ƯE'pt(8 cv]p9ePRj4?a0׭,!FYV:`>kG60v^{:{MA ݲ7OlW)Y6nme!YnG L,}v0[oӼm^s@6#'KTlШZl}QaRWRM]ܪZje!OѐH h" d` ` 4wW1O~kh`d),~osX")?$ ~=s_mNNfqK=8 %c.&MA:K4Dޞe i 4ۻHK{eNW h@`o2s4IJ;o1 ziwdN`|cc0d"-42 i@!C ũN ; r\hQثjQߡupݏO6~4#OpKϗ6R sCh]g!dx?n J&9'<:T[Z>UUcr'CWB70ݶ)&ֿU&~:U`q} WV '>X%>X%K>9/~ p}ʙcl8bH&hPxm[C>%SqCe:I"1[[hB: YWZgd^ a`@pYd*5;Izoxe-9ϣj=E4@ІMHX?/s4Գn9^=;_rJdnˍwbuݴ2aM2Gߦ32v DL.Df9^ߗȖqYEtQh.e QaW4a8.XEa~o( 5M!n:$՜l>FPiuaz.4nB tj !x🶜\3B!VD=z +bs.@=rȽj 9@Pз/ y1?n۶T/׃){(=i_9iE"A~p[mEKMf-[`-|v@9w/?Yu!B_Lh4^Eb MK͓ٴ8`LG%].Ib(ᴇ.G >κҸp}{={vBgJ{deZ۲?`2)ʆD6`6Ke/6bSfz_1-gNT5$!s_wlF#Lnܥ?y&UɆ,4IA2!})^sݛMTO.ޜ1s }.R᫚'[3o1lMI 1qJӔJ3kqlOaĘS 56-::"7b>Y$"QYqbA]I6:h8#1&fVDcFI}IHT~(#Cj9м-1l1nlYM<&(|@Yzo#iЖ9܈y:4L G {()9P]I laߛrhYbwax,H7_lxS~5UL6Liߎ4iwp0;sVyXS+1{liAwg`,Ʀ682`~}RY NݶtM-@IJ~IQ^JE ,A~#tzR޴O'r˺$58fnv](%A 5}@V$q()K E 5kLӯ# @sќU 3` J=+K6zP3 G a$Si iGusZk1s'g,Ȃ9DLmʧHӰ>M.A7mþC"fzqW#@fvM2>qqY/B=B6RjޭUE5S\qa$. 0ٶ$ָ",![^;TCzM~MA@!04^Dm5svyj~pn\l(DK*[Fmg,Q@5F"Aw J?$ȳ@̘yEg//Cې$q IpUIݦEVdB.jO4`P$(ZWYY&";S(!rYV3: 䮀JTcMC%U9 Bt1i,2\Ρ@`i"=U'Ċ83)MDR݌?YJ(걠(I礖C(F%˂LemYhF4A:|"Z"nrl)!NHs<XMͷ740<,`n6!/K?BXi Lx~u Q!(6=7!n6t(+K ~TC.Iڽ0JlQ+K%$ӷ#eUhrsRf:‰etUuvե-; -۟qݦRFMfڦ9,~z-qX!K$&FgeE`柮oTzvBg.}}]ݵ4=i6U.kZ򾏍Cd<$ A44&% j`YWKz \Nk@nቮ,^"`6Å 1\ox9π ^wMnrPKԮ;PlK,c4]CVjG|vByz5{ vKI12QmO-JM7W4kqC: k6rOdžCBTLBk525~]U+'-H YzGp|vBU:oFYnab.n0V0lf`j=NО6*͋j:EƘ M+WRy6k^EYi{Zop&0F/òGi.e A췯JC`+j)2GCtOQjxlXUkϲn.xo.V'!ݮl/@w^R*E$Rd|v7Z7`l:[HezP/5\48BsRX'DYZ)|dbLaCZ]ZIik/K`S&JT=uv61{,> XT!D#UwྠqΑкn|]E=j}.ŹJj2Ȼv#70/ȕAoVINKR b\(bp22Ɲ#LayD 0 l!߁zͧ2ύ2 K Ty G~ź.IPhiݘy" YRv>5W$&SU!(J]) h'IKd~E0"6bYƂ2Uh~n{¸} Fv/)B@DY>ċ `3\t==[޶|7%LǠkóBbxNepJJ%6^ .-uCS$lmIkri7<PhH ݆WVrh8>vfx5CX|o^VqkދuI<[)6cͥ 4>-cݒ " k,Va~XWN觍%}*aVwƖnqUS$e>sk$ 8px 'KԲZGy8#gYn3a7'ސvǴvC($ڔbT(9'% P@I$8ŁcC == &$?F#!#AE WGm d,YWv7͑lxGݣX %hj;NJ(aB_ R gK^I|ó@T^ʾׂ~CЂۼC|BPtn!-)8z0ve!joZK0 Jwv%RI XT7KRtQZg.(c9a^-hK5.7.2-rIgl[ *hǥк8BeI8Vs4 J+H+1LkH̒ڐCbzMn%\S).q^ָ6ۥ)8X%S]A˹oG߱ό|6٧2 h\JD:ynlH\󆄡t.Oc-QZӥ"w4d';; y5hÓ%Khm$CtBSHŎi<{=)5 _q6HER-|ߺf9E @sِ/|-ME],S1uv.y; ٭5n$PhZ7k0^b4q1G1g Y`%ORRjPޏHj7W27< d Z+NxkB>/AJÔU2t9n98U nSX:hW5=z vkO*Ca-'օ]}w"qZ,ipn'\rzBN9JE0Z:I__yR;4dtSHé/ ק~4( dp:p)9 Kp2=ڮ8$5 tVRloq\z6-O[aZ:q*Q5e R4"LBܞzPCb$>Mf?dTԍۖyE$y#gZl`94$dpmT;`kZ'T eYQ,Tc"K/eb>RbƝ5pe;M0nY\bdFmH]@㒥dΪVOck`lWkMebҶ.8bݜI%K 053:1ؙl cT!3bN%+fe0AcϲFfveB~z:OyqGU$ieUM v ?PΠL_/T;JhuusT%f7"j))VfӛVAvj@_f N<V[n ΘTQ11.1B v(/'199}t]#yXo䥔,,VHt[-W)rT-C1[DVaFpu4y*f'"BL36dd-bw":B)_xlP8\YBlqmSu(K5[*a]Kk߶D)u_K:ARumGd&I!)+5="mR') 5O݉ *@*HXA*n!$ۀWD3RT zO)R=OWbZD%LNBb b- HY4nqq~c<(X0T~^a8U  w ǒRZPmw,dKd(%It-&3!(P'ᚄ'_V]|r> vz7 5IԆ%*a%k7H+?xWNCTZҐ5q+&$0ЃL G15_s o[2 -/S(6V<+嶻iLo|tB-`V;*1JB$VgR6h[wy\#`=1J 4? i%?$A@c?eSW1Ff /Bq'TJkuP*X]WiyD *i9 ay9%%WFNׄz%[<ȉ^.6ek8`jL+kϢ0%ޒ nKg^x?e1"ҏUqSzerK g,f/<={]?z xq: j2ϻO8&V:tw:x`ӺT#oEh]͔1fس~) rpt8jWXT'ҺTc Uʄ֞WDƝ;bbW%Ggͽl"N{*8.ɸ kP^/,~y$ZOÚ:^^3+0ěۓUz`P]  UWѷdlY{TNh*+{i G8_K]C}`vH<"("73֎OL_.o/P׋]|' D O'w뼯X%'Li L)rښ+sI%vMj>P4h?I : Հ藄$@-~BAU;\N,R]hگB\쬫%P]J;)S)1fe\&fBTT7ѾJLs("D5DVW9%w麑E]Jkj6 yC K9~Ƕ!N`H 1z4 6Q4S : "ؗ,("yZqjLf+l`F ΞPsw@=!کݒ*ݔ*]~˪ԹG֝?j LźЯo]j5Vg;ik,sJdoIxQ:%KC3LFBI_yҴn⸒f}>%W!qEl^iɮe 3]1&ʊqQ 6n`6KO-4JjET0_$2F-}\ں/m]k@B:en[ Kw@HzC줉PrVGeB.V1賍 4TN%QS10^`_X*7H% F귘!=K0.AYB7Ep (U+W2ūPbRu)U HU̧]?^ɐpz!]4O\˫w`u}oٴL+ L6|JAH[c`GߔA+ ^u=0')/q|PCy͚i+d2Ǵ=6XU,yo:^~azN茬)sG'zFa](G|i\_z \L iR˨EfU{`Jby@EhTHu2Q+0qMڊdXC$ێ qrHD~nUZ/"R4H쇥Jm~! nl]HU)Fe2]ќb!˺Bwzw3QU )X&yƩ5(& @LUr}HIe.eAA/llfF}[c~f%Mr_ES>"Ulۛ 9%FoY @PY)Oi] ga%)jWifdK%kE5Fj܉YlBj]&#AD!ƎY c8,ZA[_ %2> 4 L]Zi~K`ɭUißcщ-šٳ==[z6>)s{TNd565Y?,VY o_;{JEj TExa? eAd?qy8,<b|Q3>2O2yZ6K/,P /8`KI *KPDqO\rH{S;8hyѯRHI1w?L짢wq9\x"aJr~M/7'pv&_lp߰o|34٪57y6.l] f ԀߖmtT?PG7*mPyDs_"SUOyy_ԯ-*d[[0˔2آάbp!.%/GD?w%8*(*y!|ɢBc~,8r+ aZĨÞ]>P$w!UM~ 1Gk^hM0j@Xu!ߺ"G[.5:lQ~>*(7@4Ҋy}7Β}d7BA"!CH Nu< g"2JץL#@'HA8+&AmFm.u3e`&\`O]W*RgchYeëP_YB-߉ ť.,mYVXWN4=01m_pc՛ɹcC3GK` XWHzO[w!߷^k|'iz~]-%S]ŝPOɊ~+Yխ>Uhlj7ktLxIXc9B4 #`ǶR:@Up[f^ Aeh4ޏ"|L-$Qγ{H($e Mlm^FgK; >33 Te%Y@nIH?%2`WZWjhиniKrd]3!+p߲WN)Q5^@/p ҳR=ޢ6%͍mW"qJJg߬(_Z+: GS Sz >$ԅRSqR>B;Ӗ2Q#y)^G'Ժh{l0"bޢFP+9az\*+Dd#)@iP,?5̵(s$!%᜛ݮKSg'Pz+ ?9#x.Ymn!WyLɹ.2nEuc~KϷPSѱ_ڋgn2cˏB#"qL M|%*)- ~a`E1VdE4EaJ}p 8ľH|4l]LG5W$iM(-J!jR%Y~z`/P8@ TeP"25U zkDEF#J4Ţ7 0=m`2RGFAuwr֘@zASr(mYu$IvyiPүү|R,UziH2jNxݣO g1l\Ex<{d}@|3MPP8,H$^o6q6o(eqegH``6OZ~T*yn5Im$0MW"یvn۲HrȲv:diDjb?>pWZw7-͓HBU=Xc*tJG'z ]KZST}zO0} (HHRq҆HDhK [L۠]W;Qt=YBO'2((¥M$E;2\Zn?TIezE$, 􆬉sM Y[ٳ=mc7~j'=;jZ͸klc'8呅~5 m֘&֪IBpJ$!p#CbNo>oV^_zk>Zٳ,ymj;*U=>0ɾj;yMM/T] r4Y^LY(!Yt~co|C͔fɧ#3(P %$ *{M; pH~f 8xLh HLֲ{,X)[REK3TP^=G9)[`3 ۷yiBU.͋2^̩~ . к~"?؞*Pi!D.bd_.d[d0h^|aUg'H{KoEfݸw^~YVs5mmnD=-ls~m,5kq-s\l$r;*ץlu%Ohokh|.*%iE˺zgvf#5.Yk 5}9t4?.J%ch1wZA;="EfىrYE]i+̟l r?νƲݴb!Ms!QؠJaWO-/@\SiE?]vqĸFHd{KY(yPikFtzFtfUNw!vxkBZ% }6QV-Űh){L㝲SEJxੴTJ@07YA83tD!E)jZӇFtR6i]=ls#'V.2ښVEJyʎ+@h04/1jLe 00?=㭴azic݋9s'r+c)قkks*d1VԤ99}(ii^RNT_4dd b\@~6tcQpT"9R,ʞ")2C plJCEiK.~>⁢_ߥ0G.v7~vBЙ#m-Ieᑯ.Pٛ_Mv(OŴlNld5PUO0&/S+H\ f 7ӧ;>`2QIô.ğ;ҹcɺ'>V%ORFơ52^ؒv[My?;<قSB\+GMAmXz1udH `r[˺ ,eʶZ,ӭLx `HT+4Uh(H/me4#pjVΎ nitK Zb^.0'҃*ak4NĴ' iw$jНSy=uY`.:l[m1f65RctŸ՜4F&`t1$&@I Ua99SF*Cq( V=1>Y?ηeiY4oB9!UkXuu1-un;KXbbP@/߷?^81HP?3͡MkOSهu1 @/Kє0c)X}FJ0W@.m/a*P:I)f#g5mY9<)_"ܾGnc-MRUE<4E ol(DDcl{wN A„t!HaBmxf f]i;G , ,AT,+aS|~N-U>{\%AM6DieJj7. 8WoOY- 5 c)+m~%J)8++5R\-䐶g jDwoN,}tOOd״v܃:b0Lw}B!OIdV<گ ]tUr]UFЃ.~)iC%0{'[lz6=|՛ 0<hܙj jKO*@6ʕ@Ppait.0r|G [͸$~[85/X7| ?=}djq| GeȐH,%h@ 1Wfuxr)0_݃:*]s۫Z,!P*Ŝ#̯(=p|dT΍}~I5(QӲ)BxF6 Ԥ$:f\IjQS$4N(LG/* q6S{E0t_Aitd>} S8q 뽔  Jҁ* Ni  o|<ü]C:dÜ=;a5/:h^zvBiWz+ S3z}Qͦq\n$~ W<25۬q!0$zR=qڗ)~)ݲ'7Ldg"AH LU7HCA@3IZXio+4 4X3}舠B=&H"|=Pƕ1rG"WRV3Z}7WA f@B"VVșY@j=Ӥ'g. I ?JZ].sAeSjص z]N"PY+unCl5eNNKH!fDn0. dZS2٤'W  V1~{ŷ4.hug .2+3pkS,vp= TN߯,HJ$z\L=Vw4ZdH>#q3-G5)2uU?ƞ-)21aʭFde0 :jH*WV$%i7)) D+TͩSZy*:֋cKw,k!ÕNw>"Υbݍ6b 6΄fbU҃kڶ0wT F%mm Vծ+3dmh6K 4!msȲZu TNcVEyd(֘62W,cᐲ $U8|$D%4n/qdzw9m|>?$Sf*c]$ *g0͠>tV$%Tٿ ehK KB܃8S>;S*PjzY|r$1Kax^ME."ױkH:v1ƈJd={(t^JIPPD!"R-tE 0t-$gKѨ:Sޢ)֛MLUl&< gVRx2xQi]͍1 3IoRs@lj-Iu[ޏKmY("E,yE#ղ,6mθL޼.t !fg&P2/6eSM=% I3[P &{W|v0'}D%KwE퀮/%W|5}wg]6A=ƅ*/w+CzYC6H.8/D!l! IMi];ߤEX.,F0;R'a6$˛`x]H`>,p\hCgiVcԯa6Ibf:QLQKt*QrKjwIJ%"SQ.81g+YĀp1'(t"_SK׾y⚟Iw @lL쬫]Óq',˾?Jǝ{ucRv?FrY6aJQ똭,5%&{H"RH \, lX26Ai-UV[嵈(dE]$q K1eµ;kU1c+1 ?i =b ˽z342~~g'O: a?6Hَqd̉Ȇ3+y'=_l|BQDR6ɘJp ܞGdNtЗ?Z鍣NwqBo@ӱy Qm̠DA`3jӜ٭G9 L"J C3׌׎'\.|?QO+amI}*|THW!<]QgS.I% Kq:QfRsM^Yj—1b s_aȾv8 *#AO4ii&kukSZDFuvk-@yU 4qXc am@\NӀ`$upHN (1.ߍr+4M=zi4i콰WUPBiYَuɄeE ZI%@%A/UݭQT - ,gY4Oz策ΚBaj8wӴFxzp*}Ic`8,+g^G`1]J!TTcSi]̦Rj6u](Ewe)W`8Bimy0#mULKBg~]&1('C`B+@%98gNKmnsð^Oi0{XEj"IqmRVD<HkW-,絊\A:b1wXG(q8G( #7JPalJkܟ§PSՙg#AU h>L{ ݗVXl%lk;P%'E0H>TEZ& ,8P ۳s`$8vŵ 7D6srјbvXRʑaĝ.ƆdɫB 㽟OOSWK5CoCʧp ~rwK4z^[,;F1֤Ϯ)snS+]/M^IJqvboML 4o],F=5.{֐o~k~Szk x]/.? ՏH $`Sx%ܢV$C*4/Z+MϹ2HZ%!sN~uǦ)lǡjH Rcƻ'̽>Ta|߲E^B<~=lLh˯(HyH1譖Z]6z^Tړsh V/aatZ&U!,wTYM-pgbaڻ vEm"A(th:o1[v_v |anY܂mq^kr,ixM$"&7BcT\Kt:%#v ;=q=B/}8= nqYEbigٛWҿHj;r&Mڰ\wfwgRiukZNdMvgxD:ʡEte_=F&DJXZuׇ}]a8.m]ᷓB5:elL;`>~0*6%-N*&uxqv cε* 4TBXdMs5դ1R*yՖD-e|heFa~ڕ&_&:jGDJO /٥֗[Ԕ sfIj #N1DZpI,ǒj6x폮:kK\z9RL!Md Ke(υ3. ' I*~ß=h < 4 hXpVu+WS5~eN8.,1iLv&//HTlN&}z0O)wH%w %k QZ?G8Vb`3d@'\l5:%Q|i䁐6'%43D%|׊m5N#&[m0iC7洅K5ͼ(82\JRhhRS~_Zei[iK&t S&wMP8*<-wg a6~ _%h DZOAb^R 9p%7Y~ZC53R8YyrHst=!ܻbJQ/15Z.7=iWq)%Bz3 Zi')*qŸcβ^h.^e,[.e3)^MgAniLGdU),۾j>&2sWRB$WвY_SENQ[V 5\F}^&ǵD6FLSwgTC[|.b3uᅧmSdE),22]#t{!ʽ_X2VbUxl|׶(}q1D~';Ulh1J6` ڈHqVqL pM%)I#C1<$AM.m3h+?% 7] 7hn5Tḋ+fHUsI=_bgȳr*6W\__S2u+ kW-=\ c\lI6qjSe^=Se !qڕ![eqۖ܁'q#/fmKILgZ# ATn Xl_ T7*ck },7CYɬfߐb*q# o$MW>f(}d!'ܞ6wor) 7LX㱙K̝mcm };T:X)K d[^ae͒Ax~uA!HQQVÃ+=*WxBج1SB?WaC8N;Y=UV~d?6Y'y%RdUi:)D/~7>]@\Y x4]e]r<[A>l*.p$!`A'HWúgNa^uA&Q^?¼ۈ `,P4k5hz3RlQ: kج]2`Aپc;@2Ymsx#V@2PnvN 4o\"alJ^>?ki,f޶VF,z(7mg_6z8Bʍ%hnka6m>s֤M_pQ͞6 0պlg69-F~x#G?Eʍ!PyUK %,O% Wt~ N8'o /ۦ$=UM0*Dy#\ӺK#B!XT)kVb=L+ ԑգoL0 zQt&3dMOs|v'^5PMS3ˑ~t&~LEܶFLYQn;Μm&YT21-S|Ls("f.]/.K ,âΦ>-Q"D IRA y.?ʯG 2c~gq]8/VRmǾ96ʰؓZ[{~579L8Aj,Z'Y?NADI`DB/2~)|ŵ }y'73$ }>)T'"iO gRREQJfއy3d>g|0^r4d4IR(YM٫BE$%m%3CYoKmGFT<|ɱeQ'Le'8в;''&7HJ:F1-SfFB͠W#cJF Ed$|&#󉟈2-A*Y"ُD_+(Z$ 0q:kDB+RI9!: +hJ"ZyT\ 脧\x}*J¾\Jw0֬ǐs0Vidaa\kT.,MJIFL "AeRM TIKye݇s?R0˃$O[Mw*{kaYj!*O4џt^-;wo?FSЉ&<1hy<}C 9پӹ#o3 {{ɝ,,_³~>9"[,\$Am{B.*Eˋ(7@ǫONaGJ13,#(  hMEjD [Ue_^9Y+|WAVʜW;S,Mp_$lWt@#Uw1Zkjt#N&)!"qxH6z Bwjmd˺~mh_b)FZ qmA &"Q#CQ~d ʶFK׮KT@D(h:IIEߐ7>Y}Uryޫlݒ;Iρ}! Jv RhPCRFSئh*s~qYldА@H^UR 7iP*I)I:RMAn/La\ 3|3!n[IMS'nԙ?6KGyBBpMJv%)?0Gr tgE?FϹ2j_4M?|ixKr& o5-$=pZ{4FCpz<ݥf˰Fu;Oce(RƫOjRn8 kcT_vY֜2(YQ =+ \ӟ WģKjRv-&@[wĂ `ERa[$~t8Y,Ig36,{b˘c*_W4"TnZC>JFPസvA<}TvmɈ,8Z]_\4AR k9-Ӝ3(O!ʐ3o KJMnQ4[VֻQUʫ"- Lʮusp}W?n.N܂!mFO̚=8X%gYXMMfR%pO\C|1P ; ! QW$(h'^ȹ}P0q\€0z#d?8}w[Dp%.L>xnn%[tݩ~&b 2n$K& d`$-!YY`'y]kEL$yU!ZÂ&`.(U*$Ue_?d~X3{6,Pŵ<5>G |,j?*h% $b$OEvSB':~2 =72g Q Z2$I70ɇN[HQEZAC::]TG.|{*BV c8jҹmc2 >kKOg9FS械U(0Ḡjᾬ\%cOa{X\H`W gfIK4YԻAz>jįux[C ݴlfg,%7zغow};XTZbjݱ^)ȧ/A0xThC-*qqsտ#bуiH%L+C3vVt{)x`*[et49GM8ͱJLN75p;cǦg6oH}`{&6FbUNj= P&hdF9rCHr>&uӝ6m(DyhXpQZDbC@(`CB%B_؛1jy-00I[6^Xխo@ mu¦]5-.? a_1;*5}KO1b1!#CSq+2\wݾm-}jY),6:"iXRFFp۫zDwδwc\֢*Š/1zoZ;sG< 62.MU0_.,Jtea|%|E3HSiQ_xF(v]"9~E6͵9&b7V}Thg ;fA™84Iq)V'BE>Bsؗl 1AITuqʎ{rD_ ְ-o [^_/܁)kz[Ukr$V+@ղı!Q9 -ղ!.O SIMB*z$Y cm}?},cq~K:Y }<׮L ']B`r4  @qvr`+MhtHjga(!VUR}^`Z ϥ z=QonD}*p~~n׼Oexеw\wv8 k9ha$AfVl*ʲJIV~T U\!7b3'_30AݨGwMH jqbL+a镹b6_5ů*]N'榰#9j/lsʉu Lfy:4]ږyA| @獟_HD-"$-9ZzIöYB3l] EPHRR)lncqB/zQ$FWuKz,>i_S w  Q<[>vxX|"IXʂ!uH,@-L+AI e&ƌ$iJJNvV/xkЫja1 DNG $VBbPZ1.684ڿ~;bZ3ŵ ݹuo&尗<P|O_B)7%X('Msn m\.qq _ҙV ^pDFY!Cӭ>H`6af09-IHv;}bt} P@1Lگ0E찚bIf9%C?x55F,]C|Jd0i:2-f0%8$֦/iyQ pFg9/0 c2of# \Mp$spvu7uN[ax]ޘRrYF\N<)tAҥ3Kf9:G q]HaPF1L~Z1t207=/Nhv<\`ZȪ߱ͮ 7zvgjb~~d&AEWsbԕSrk[8ʭ">hם^BJxCHZ1 *Iÿp%ncNsB+Jo"Ӭҭ܁~USonc~YPక6zjvn|(?Zxq&߽O/6S'YE[S28r٧}oD)sBӀJ}N.DZ:F[5b+6%@p*jn]k(D~+v;^Ec@F=a-_`f>bYixO {Pu /d|^7͘D&zV%(fTDd`h&LIE,ɪ0IъXW&m$|:FKzȻ_˿=]H>]yB3HTn@EOX ßSP)ԑ;0lUۯ@Y-9}s4Mbi%acTSNv*wwqJ;$ G1-"%P"PB",5'ބ,iS0jrkŒVůH=xS Hy/X]|hB;=<2pxTaJ1~jVRB?Cb!;M>z\_>Xa73xΏq}~/P*fRH^;Z5̏=睪heLVF/a󋈯dOm[8͍ nMI:1Yc[\i9g²VCtxQoRuxXy_UEۗTl)M)J"i-bNr r$;]/LLa>T"[IRGա/3m" 3 *% ѬU<Ą 7QE4`E-'":5r7̕)BJ>?uOӎ\ktY%)'ԚÒ/]m|.:`8:*&z⩟}/wsRy5cԡdR@RXR˧xso!%^iHeú˺}3d>vT&"UOZꞯ0OM׶v*_huQetK4jR' ߥ!d'7+""HE_GGk';Ɯ`CL);ۑ W⑝08 % בFΜw&!`I3d8@2:ri '$&'h`l-ǴT-B)L"#vt!܁Oi+!#B~/jFGPCT"hF h43R;{\.KRw\tnX KzCR*BhOa*Kŵug^N~FEE(H\Bĩg?IN.PJcօ-q.:eu9ҋln %8:i;rD)AʑxLӞHs8ՊRsVr&CܳDx$Xv#Xb~ם՟s_/ /W\Ndyrke{S·70X\_ιUd\ooX\6 8 ;¶X m6uWU (]*PHUQ#`X& ׂ T_f8^z5D8+LD# ΀B`64n_]BE.%Cuc,.9H L8?ڴȄS0y?Tiz଄tkv%bLitpdY3%$DdL"y`!]# %dĶ`eokuXBx etU:W,D;:>$$8Զy8k]㷧l!IZۤ,7" ZC WƇ>}jXMD)L##rƎgi[]~k$} ;\_0.z r Vq])êpoɅ £a_[c\Rs\fz8f>l ΖyIg ASkz^fGxq_`DzBM~~L 6p}TmatN_gg1efD_huVب=/W$m& `MVglu"48kC#& ;ݰ)RAe#jxqJC|ʡ` UFPg89vR{s@ƹϑSVi% Wۭ@|16ù1#{+lqEtR ,t̃Yc?},ߣZH#|r ٟb?߄ǝ繟hޏs|X?. X}ɇˈxʇP-0TY yU(v9ZjC\d(M2AHڗ|K aP_|j$ͶD m*N o-ʗ^0h94?ү`7-iA3`!\8q~sO 1g:V_x$okoݏwYk`⯟y.d=;KFY'$*|YNFz!]?QeA*b0+@o 1T_xd0c.wg9LpuٳbG,KDXLJi$gT&"~ej CoȈ-ɥ^B{Bx^2۶!TCY ’pd"9# {6VBÑc&Gy,tAG4iF\zVBLˬ_O7VV|BxN섺afQnۋ9*| m ?*L5E~5B,=3Gt"yc R( vQN8 f/~tvnBГc DPT?JReL%Se hd+U3kr+PR(B:7W AMHnaC(C5$vzà K*pw\_+!ի-Ra̚k/qy%Ͱo{2i:܁`V"`%I ZY'ϠI k% ~YS\*{"u\O[[v՝s~㹭wn a"A7ֈ n?ѿkeBЅѤ4mM$`E@Tď9|1^s^sKbkW-7Z6wZkmZk^&B=C_IZ;[5V~ᶝ1TA<ڗd͔ѩ~ӯUfFKc`۠Hv 4#&PLFj-aq׵-*ު^} >Бb4>"˦VYI) Y"/-;ӬY}15:*Sؑ J6xhrSsc8 [l kW)gPfh ߣښ0ca$細CtX\B?!n8>P]d4R{*s6Rg9R+aa?{ 6{w|R<\DJM8ba[0vaEWRU?Yt@=l,@oZ23Cn=s;w'3lWbe|>5}1VJĂ/hP.0狹4GpUb9 k6x1B-:&C*OKD[K˰55- WpRZeYYeucc78Д(*_-}lC+ ,|BOSg~SZlZ\6[KťX+bsdShy-HSѺD;pvX+N߀0R=# S|je@r3[c: u ?ܗЂBdrWAn3RJt" +Cx?D#|'1QnPgXUo71gMuͯ OLu .li;^Э)IÕf%T~:\d?8cw]_Ju;PbR I VOC3p&@"]ZX5#b]{+ k:r^P$@pW4,ӾHs~mkK^,ŵ ;x=|2Vcp`I5 ?*n2"jdTOE!@X$S^Հ㾦IyҰ]$9 3}] ad6&I *1&&ſsWU?U Z?,M/i 9`` @R^t6v;kv~HD凉I Q"u֥+D>뗽TzfG^7"!.H^pt^%S'Nso{uı>|HL J%PM# g$B+퐸c~m1I" Cݯ~@BC^cDC -Ȟ-Hӈ*Fc1*Ë~6=e"${NK" 4AR![2}^G>[G@h$tk-ޖad5 N)NXZ8ְDڒ]A`C>RV[%&W,daIhjJRAIoBXKn+;|DW&G 9 4ھ!b+U)K=f_"H}kJBjE(nopF#%ryM#mOۑw "戣kիٓs=7sNB\b 5G9)b WEPgğIX-ntyD.i\Ʒo9[P2괊hPeh[8}!EH@FWwGxۯNiLRăϜu'8nMs~99pW!c1L)`c1psu,t4 tSlf,pm wu~ }O:aؗ"@sXU×*q|ّ!f~p-j94hSZtm2N!2ckkKv&%9fp)<(HbeEꢾ1uC%;UF9g«:oWXj_huqMa(:#FIpFkӑGg"ƚ MHoM(M]'g,໲:͒rZn5)wwO@iTX¿;$vswީjwa;hG^[xE49׷l#d{$2jfx>>űr r.H/LxJn*X~*PKcE,ShR`}TE&Eө(sF[p-NŒyFԣp@HNVB8`W*4Y2YNŸcKPؒњ䥥܁w*[ooInݱ͹^ jACUw1{ch30cMIS~YN)[Ib L>0Mi;0w zqIA#̂Sc2 1/^Yq7BZ (zD⋐P\b0r;hy=Ud2ϨLg#T8`a鍲CbA;77.e5ԷGm0'[afNG/$;,o]NuYܛqq1dO*<-"wHo(Jꊘu̾ps[Ӷ'PъDp*V;H'zDb>0Gr~&<<@1 \5(dWzYV3~ԭPU+]/M[Sss5Ʀ+ӓ#P"'BKGȍ[ L708/$$yL9oiwLycSL[G(%s(f7˴ZU.mί$C$>Nըߗ(r#QwM=;z07d3Ϧf2tP=4jF k6zۯ?ۯA 'WIrdb蚪AK2>-]&1^ӯ_˙%l+ wC&e5VNO,YV8}XW_D;jth:O8W=SzQa-\51"!tE$m_A#JIO{cVaeܜL*)-U0L;]m "a(#ufb7RFT]=Qf{ޕ}">yAl'i[!-Ds@` S@tW@tf8 IgYwl=̶L '3g[5KT1u.'WעZ R3QNQCVU;3D0a@\h&-q!H%M~}]x-(E oqضRKzɄvAGTLr`gK  )$0F9?HE {E.vALLspt""ڀ[v>7Gػ$/A*qBU3vqS@@$I`K]6 Сg)(f4b"$2CP\>oltsүLL+ON*+TMo{# ֟hKc|U.2w1sX]X= 1&oK_ KU.`ѶGz{CPygGOz2*YEI]aٯurɵe >z5?TWs>^}Y[DDO.#6Tt?ʗ+gEun #_OD;/9(~Sq~"rR֑p 3kG4[Rc.,V*`1s w&^M @R<Ze-`Gwp ]j]e0K'6BO.B  tD2{< `jL|0pYD8mћ7}4,jIj)K:tM?TcHbb-zKNQ^1*lˊKxSQ/iIvIk´Q%jm m;tLo/]/ 5/MTlsS>*]OXDoen,ɥ{In^&H@fF%C{2qgɐd*\1ls z3+q/ }(ض^He#Nl bwlmT;wBHFij"GkD> :WaP_;>~Ğ)u*VhYK?4K2uƦv`6桉UĆҀ&"م7!0aH|JUG|Iq"t9~ "&bAmO4:'ZvRRcYt?GSv ^V)ƮD(2ŖHrXdf1И#LkPaZƥcC~qRDtGFn5kZ6&[[_|Ke9~FI;aQ뫗{W6(01G쏰1lI.W-_r+ LM½qʏ`i]Я[V%Q8M8I,k L(X>`6$` 2D*j ρhzkްoEL+Bа&2)YwX!Gܚ%gMaOnO`c H_b&atbwQG^E<7 ´C ʵ2y +^Hj0uC/K1wR  Yt+ FNM"p8|y0*wodB+׌FWײ8̬ulMaJOu>mᒧ~MT8lWu-? >bDTQ/=)&Z?[^<zIO+L=c<|Om-RrvE$i;K$+PRRZk̢4&Z6w`?H5]AV?(+Iu 7,ZJkLQҍ{l4m3Y׮[+qUEަbʇrKp9N&"Q0h8Xet%r x-\Ͻ-s D{fI+ѿE 5`9gjܳ lO (zxaw!|2e39Tߤφ0FO-A>y@nKPE/Q_3F)5)\`T2 %oݤI LM;bVz[-اvQfejx~WK" _~{s| 'B-NĄniI¹ekx6VX%JVfuĀ29) w_#__j~Ik[p䬠fLh2ewJ߸ N42(F }=;ߘaB3'晽jadJ|UabB7Y!0)Ik ~&U}u $t|T.xőچUxQ%/ !J:.->`8Ѝ"Ñves6(C~W J\´Ȟ=]'!CC,HCiU79A&8% ƇE'1Tz]fS/y̪ L6OdvZi}p؞s,c_`¤ B,_!@߱M}?b'.q~U5s}J8ĸ_$ѿS 3N}<%ĕq奤US;>W/}qTPF3b YlHV-ˡ.>r$泞d0c%&oʺF+)HfW͙\ᕕ V׵\Q,*L&d/܀J_ Jt'8y2&f!@cDY% 8<3. 𲟮ʷKmԗ ,-i w g%nwJ q?L[VG āGf=kx KE@r[3xYxJG҇iZL̾P hҸW6tGB=#؜C]]\_+~BogIA-]/h3]b{L>KA㎘ͱSXHi hj-N䛣D5L@TEA!'%S%U#`#@Sm[ I.5.'Ij5 :M" b5sdb2Sj,v͵ ŧȉ0 ;ģH|q,cNi<ﯺvA4_5c96g&~G($-HhG!$H*FIÛk2iXkeejD|-YUAFvcKc@P+R0]q~NsqFP][i 8ߙ6@B"RPPJkkvsW¸=Ōڞy ; wp:cJݖ`?z3؜BӋ۰.ۙߠZ-}D`Q\Aˮ/0_/# a9,\˰1aQ1Qr;G`wvm\ݙeܗX_|2Ф0:V6ôQds,~_ߌ!ywCpoLub[-9&_huQ&2q_/ #IXߴg'•1r7[zMHԿ& v4fQE( #gXujR >4VwY=c4FTV4F6gv{p%y4.^fD=IquZlfY!KcQN^hp5H?;WVV_/y#t㽭漷|ׄlm.Z6HHx+';aσtUTTCt9J}qj[W1!U.a?9&CƦ_f1Xo9HE>Z"Zi}5~n6Q=+qM $t7>;xQIHVm?7zvH1DQu %HQhF@ϋ"K df#k׶-^۲Nx^kKz s=pr3l#GAp CAaelȐЈn] {<ɄNGptv?cb7#Qb)z1fX+^-{ TzAQU`]8Y29W؆! ޡzs=?f-+蝝p;|;90N00oY &鈤5&N%J1WM Hᴰ̋稾۱f!6,:4~Ӎ^!;GWֱa*nN83♇g'~9=UHPIWL]=wn]v.MÜGWFGZ7GdWĿjcs!*S8±[Mlɕ6L WoLz`X(+T$ҒD5%40XB/ 'Ą`$I%PT%IX`fA_ rvF/f^^p)G&T~##!&2&q'b*bEAArg)@rB$v7l_K4HC :II0 b2jxqk|e#) 'kl񪕺БVBD}0b ēPL-eVd$y&Mm>l&!2n0655Iؑ'1]U`w{$SS[\͓[ HMKL\A,Y㳴Дc/+X2PovA-k r5 _|S9t3 +*.%2FnRJ̲0.&9Ƙ9io妶6׮[ʴe `rBkM+wPT?,k(i+,pNˇ>3h391kovA8[Xk&6K=RNu;1vn{}{G8]"ҫ+:ܓFuVϬĸZְZ4A3BۄS?1ӘˉHS窣cFi_WQPAAIJP0]}hꤞL7;BW~o=n-)w_\ LA]J`P(|mN/}?څ;;v~'2ȦaRuxVɣ缿lnhL;/MMlj@-̯Zh.&E R +akȝq;Vݫ7OeY^B<䠵"?II~Fڦ&H$̦K|H%i0jBDd/De&) HHxMi%ӝ]VOdᕅi:d -_%o/NVivs&A8wRKBiխ-Gcʼ E—9&K.7\ su7DQY._zϣX06& 9NW2Ejܞc{'],]/KsOOs{z.]+.¯~SY/kϵ햖bl{%ZZ&5 h!%Pk B{?%DNYZqG%iJ^%0 XbZ}<,)(5[`Ԓ<4:3M>)otJfY3 XjZžX\~ 5?C읅u}%/@Bl/AlDLT*fI*+eZ}Ү25y7DE,jUs/ WI0HPRY6,z{D-itu^rMc'Կ8϶-bN=C0/d| 'nkԿA iټ6s9:Fq3CZ-)%駼9׾,Y8Q8]9>-gC<+Ĉ =]6}vA=W-/!b/D*J5R.c19ph*Y-9<Ӻęeh !p?h2B$eV¯- ^;mOqk4)ʄUUzk|i%'ammcZVWJcXL2b.%:1=SXrcm+])AUZxѯMI^A7FsӀvC>EQ(vI5w@$i@8:| 83Uϥ z_uyj' QI[4S±Qyq\fv IM8ΪT:ZO9SS/;v@w*rxmn]/y]k?7ǮqB!Q[-?H r S(QN W?fy4G7;uWˢ8Ɣ88Uig ުmCӷ9wvAaedbGG2&<|臥4 &0Bad\:_hUX K"2Ϳ*]]p[:Y;chȰbTS ;3&)V&B3W , Tg4c-V +h%kz#(?2G]լ38u}c4v5"<;ΑKQ(Pl?Q;AvF#Î3M¬?e_HKyAm".}[Rn#sY4ڞܩј`R 2(IO?5Ę jڎ<:/= e]/4 hMwFWׯ55b"}S_F bo&%@C!:w\| @ x'_:<N9Hi@:s症mu׀0Ae]""M+M0}O[(LH"Rks0 #26W{$u\&[w']QL9ז%+4_!֋c"ȎA@}]ʊoNU =bA[aϾkoR"gYh0$@BA43M9d:_ϛ3Ԙ;0^Jw5~f~ LHK 췏9¦jA@:(L<,B.P TIVSXú3/0aV[SM&7c##VmHEu~ 9yԂp-GZ6=/|<2Ryܝ +9,OsP}sL\,`sEji\w? ۥyA8LWkd5v~閶˒4?0꽍_/ωU=="$Lp~2n8SxYD$̬i2:*g?vz|h~@N=E0UK`K0:]@#'"vi$P]R-? >b߯v UY0խv]o`!FdpJ%YldB7xI€P@!,vJV(ss hVN[* xY\do*_ t?E/(3M@xV39g"?@c57s030bJ6={\~ P$58xvz9yh6k> iw/4RD&:h!u+Ϡ3Rq.09HYYt )I/JEPe1(a/$И&yh͙ HqHhew4s# r? 'P۔:ϷLxAed0&4%^(J]M սy9 ;71Q^s.( 2YC&?310bGv{^y$䒐{ض֛NpSm+m(ONGw5eJs2ɋ͊IϚz0nM.^fk"g۶VWAA%1`]s3Kz3vpF=^RJZidBlomw*2.B-ĽDO<)Ը9<*3M DjNt#Q攑 n(%i.L,/8\̇[bϷ~ cDKWIb5y,y*5\kFg9OAJ[{F%nZ]a-N!]X(~^ Z|U_FV͠˺&Xa{c~8ngTV!V `QT\u߬;; {54&USÛrୣi-giWiLWTRF@ ?gɐcI7vA?c/d&Ioi*b<m tx1PjjD . oĞⶬS :{VHKw2"Xˊ$o] ء(qI\(Α E|ݱչrX^sU'''ЭZ)-h'C T!ڴ]#f~>c.藖8C[$.8S*vLʴpT /wa{DŽh-w'&yAjm D9= m\-:Q(h 9WAK*2ԽeIf-^rcdIHW~.sO&zC8g^$vfbL;Ee%`AdTLd f_(*r o>K-lq8la"ØOhpzϋAƋń;м:%;K|Dm4tGm3^)4ˮ @E"ٜc:|ҪLad0]_|v<,&6B7Iڏ8{f~IXÏ7;Xŵ ?'/uQF!"(%ZJReu?\K 3]s~P:l AKQ 2{Oᯞ9XvXⰊK ˀ?἟™B"\\_6C{;)]/}q\3}40>emTMfLʌN# Y,)]Y8'OM纄=^ \Ģ|UĊF I5ךxfv= 0ߺC(bK8М7‡oicڎeևote;GGX HHelh01f9-,(:h/y^vCv,$M@,4B9BTkB5-h !.qd!5VFKq#[C>#)5sq.+qbN7s =ar0]_%P֣ y̓ۓV8e:sdl@G>}3縌9ARa1ؠoտF~=9q- ˉ&!_"Qt[MX51A/uK~Fv>#=SR/ɶUQb.ơ9V2$f:XֻBnEW[D< $ m%HM9GHUtsf^-@ :o^MV]!Sv+Z~$SI$r--)M艫౸2.ö nFQ Eb W mm%.q$\b<:cN2\dRiY$xW0L^-\1n nЫ"=BJOM*SI41#.*nHWHی+f [YNEm"]~̾M{-_W'>mz=G2nP$v ПYFta ʊC2)A=7 ,R@lDquY𙊌,=RYz<݁V1\:0Gazd1i@J1}):{ Pǟ F&N8 dJ.e7x;]g=a۹g$OߓO"V>zc3!#&zmt5Ȑ=qΝjkv)k4>et GjAb(c'2r܄z\kq?Fwik&ZܚXkn =iIH^oj<:nly,Y5P =TxwqQ )X奿9_#-3c&eI/)S+ޣV/cץ!!=/DJ/oI@}#6=y5^r}{l D˿dWGT|k={Cpof  7x@?8t_|j)~bj!'2ݳTJ%G۩< ?~1cG֣18˓7\T,Ho[J~iY-CmIYT]iǿ0OiHD<ٽ3hI?aGJU{ 2(TH| *eF StnlÃ&{soo)&O7iTAZmdw;B<D?Amd _5UeD]tw68pzj,lR\-a_OI[ i[BD.-ydJ0QvܗuU߭P˿Mkwj ȸz<rhz7/B}gGv0N/ -.?1줘I jiAH!KR/~f_W!m|SB 2n`[/盶W7hlIwkKm2K`lQmš'{^Vrs3.}cyz_k 0sf(.Ut[9,Dдvڐua99>`bBP 5Q,3G4$H6vÖL'K4yelsڄU[etDׁ&?0D?n¯=3_<@X5@اmf)\~gL ݲxyoyh R9ͩӲOh mXNV\?mPM@Q KE~Qbkj&TRB.f8Tj:E,SimvS[^M[w|Ok+폋qEy2Z C6A\J,e+0/6v$o댲v$^WʎRH}"&nG DD='2/‹"Y"5`nD@b6h,ISB!{ь΍I>BO#ECdE}1](=ns J$d<.Զ,6₶,, ߱Co:^xs^G_1seʷY"ܖ,IBx\'ck D*~1*KXWlQ~/=%^ @3ppG[d3\N̖N$6dmdW>!kjۏkMGM%&BBS'ɀu<34ctwp MuB>*@PQFW 29gڷ=%{fZHD2ɩ f MZS`'UR%3_̧ʆ.k]@`˶e шSd`<I|%ݜwlUZq+N9n3]WQu>Gnj/?k-Fv% l \EM) +ۊJ:fJ~a JaU*ߨZa[:1@AY=W0書tS1 9)#=%GJkH+힬sO>79ǖv+A0žM\t~_[< gi@ J#O"& vRmJە( D&:uV82TQ¬SQdG$&e&dҿ么oNAXbdW 9E;"(yJ WM`S ď|*fJY>%7oÖwմ6,-t%$H.~MNKz21Q)@WӀP$HQQ=agPӬMOlhZ2dp[˩ӹ:;N޳ H|dZM6FL$]N%K0!$, 5΅&1,$&d|.>{]Kɝi`Td4 6qtB9-MU`v،۶ӴOgJlK(`oBPg?A wqH#Y1:Mwb[:jb~]0/‘Jp=Ip "9Ҡ^ڶ5/Qb> zu[{+ޓY<һMEjN6dIRa!\pa(&@ȝg_utob:pR-_ TF|]ޠ)!lTR@U:*4WX'UqCpT_ mUvo䚶@a _H#D\ *- `0yE`0>!cI#?Y|v2>#RpzEC]ZTa~PG^^&J飓4l`drΒP390,:˙Mx춉_k5}jK9H3sm]|gqsۼE6YyC.} M)?yee?l~IwEII0nߞñusqcQ}7ȢML %@V"cU\m 8 cOfĭ-ufAB+p4dwxLqr u˦YX?<[Lլξ)2VɏP@rJwr *%Ci>P,۶n^a=?# ʹB~'&qUD1?@yS &H8 MƯ WVFKjyu ՟xAx_2 /@{aw  -xeOkza􋲧Ib(uG:4Q~=+\ vtMLdqqP6~ҴpQȂ̒(6.-6lN-t/ R}B^6Qr6uSSH YFذ>;-jx,M[hޫP Av_TĘyN?q/haQ]aW]|oк8h 􊯜:IgnĥT)a(Hϼ7RSnDnd=m7UiHĵz,k> ; =cKj[揩ӪK9\@Isqk܁6 CL&S [!0MD t"2_ڨ5eMaMԅTM\Jmؒq #%`hS$j qƿ@vͭvd(/ѨSG4AR9 K &s)Gzu:&udE1%:j"KTAyw[]|~__2U, h0.Y|D')hy!Op⺐m mXۗMĕmx@CΜ`*~,$~:r\b+b6`@y <\vK!Tž+Pr%74毄ky ޢ-aCxtcBXIDzv_^bw<\ zm9B!}bhV ;[!+}n zrb .k"%_V@D1p 3(͢DԮpAdzQZP@;I} eVp1߻{+6k*M>)=. ;m\~3.WT|#mpab"a3DRrlu'z{LH /ԧx^aֺ0!( ^alr2W|"ifvIo/k| "kٚЃ @m+&ͮZ=F8!{jXƣ߈ԃ]rW#HCa<.&s]bm+ 2hW\ *߇Fpjvv|vOLClw2ܷO"闘Oþk0ΟxcGLH[UB%MrRd|{zڏ{ .ωU˝N`n:Q(Gta. $C?{gf#4`1riId# 6 ci ƚ26J߸0I+ \t5)igԊFtruHzi_Soh+QuEQKBOZá>dw`pun<08L¥ZSz"ZdcJT~1:K}i&iRTC?1W P\BjMki0粼7m#g<ᇁvf[Jmٲ~-LWҼeTpIrĩr/cXE[t'$Ξ<5bkD:" -֋_z<)/,=%a$#S[b y}* ])"%O!Pן@q?a: 1-aS)潹.D,gPۊďg\nK7?ƍ. `DA 0"M25;mX 61ɨE(WkW, ,~<m!zLCcܗ+@JDC%"?Q(;(ii Wzw]^Ԑ0Krc} ɨDbg,1*In1ƇN&pnR{2R>Mš D;{]"5I6DfRG+Vlk0l$z{F l'۩[xhY1-9ͫGϚql0"oc=?!-T LR4)rpgyzNjyjwLl@3 9f-YKiZI0c9 niQ?S/W-@ܽqΙ?Gԧ6*2" LRѧHO^kpAG")F6p :^ʷ|3Un w<7ӛsU}#%~ygWı}P z^. |"wON^%Uuz`u`ݡ/2lqݚOO}1&IV˞H Q6eTRS6;Tl|H焽N8@,Q!}jTr׿ŵOFd }M}4 44k<9ӑlSК!.qnKgA51mG5;dXV?aWŒ_G;݋/ 'ta(Q$&<79u>sں)gM88u.e ՜N*o~y\{uj=,Qי'5oh vcX5YZ7FF054%"WR͹}KsyXNBZ( 3߂g`M *|,SԾp̣$NET\"%i.q\uU*L<9-*m힡+ڽy XzPg!N?5FRK+F( }u#YcK{6!̫/%\KA"0:scԟ\@jxE&?9{Xݶ3̶-@ӫV6 T)L*< %\ҽt6tmIhuxӟiM+\\ ZF .X&.]P䍄!scc?vOFuEG*O/ն- 4/UEXMqImH$rr+n5~L -@K*@E[b'qݗ(~f3U!{(Gc+'N .q$+HyÈ1m'm  N#6Ta^%,ЪPpYYRG)$]}WjKJ/}85f?eHF>NCq-@ܽ^⓶ ŽiXUh?빤$O N=8a).e#3bMSlUT"x5q*,wn芶ІNqqcnٴtSQq  xvm(f8vFiL(e%uʊA$}Uӝ'AudFQM>kW,M9ZgmQH4V?*e\a@WL>!Sz[95 hSt]AWaFhHRI| ='VnĽݚވ}|V)55F .ϕ9uw[ ϩ 6W4 |,qgcHJ-r%E^j;9=w&,{z7i m3AE2UQWQ:7K`G+p]U )7y?9NmjmϛBh m0||9@J_]7|ʠIL:6cQeuSTWQ1 9gY-@?P~5~XPC X"(RP;MUJi CJ}?T6m➱~QHwh ; sBd;B,5KEn\~.{pT)=RTH B,E_ IJ0~Gk#2{\a 7DlG +z4'4ѥaŖ`A/>F4|DYrH %lųՖqNtwݴ=5~a&MQJ ۖb[^_DdSyIrS,Kao򷳵+eo2:{;;\Kw%#,R{UZ:*`Gl-4j+VU,d틺oZ|ĺۏLSr5> JҬZ5(8@S7$CsqamF i ،҈Yۯww6rg&3%;8\8]@7M\Lf0åX] }=]o-1o[hxڶ3 d^`~*\#K- \([9ݩG] 6-_g//϶qQ8BobwU]!z9s\/S hʘg.w[@\?붜n$ 8oZ$ %@d)\b[?3F>]_h^h3O?>Ia IX"$o;i0OwzW4zx_%/x-@3<abm➄q"nūtv:nMhě`^K*O&7bZ廢Y %]@KuqmR=,EiQo|ײ:)kU"n,HB5I$F& =_{ުt^lkt7q&ך<\w<!Ml .ѷqޒcJq9E?zD׎}ᘆWsQ?Mj)T k &GgX8y1r*m A@zi_ x} IP>1}p#\Z}l&jRyw5',yγ ;-8fRz0-\54Nuct1pa;(xqK2BjUG(`~qq u銽z6 P{etޥ`I( 3`iOREL5~ZCZ2X7'㾦<-ҁnn+VdsaKS=7_ ܠF`UN]Źuݝ-ݝEW(0^/ |(윟4l_'L@?`~'\A);?$#(IP_?k ENt쐭!3WSA$ZH5Zf) xLL"d %]*SO/IPv{}r⟿^6UD #)WM\}{$*4@An o?j2 qش:yw˿ܝ&Ia6dK{·Rq\?dxC3S7i IcL a4[FR@ ȢB8qo3q>12{|$V Tkz}L>sO:~ Owu̬[H W!{[gܭߺVj'pPoKdB:vma[м}PDϘb"y=PtF:7f3wO]!O ,Bֻ;W;,DK=)y ǒwvǸ8蜲 &kӏ"2Pژfcm`cF6S?UƿA>9Si#N]mpC6rU& .n kؚ3qP6.D ^۾ea?JHBHH&Y_gE"1q*ERFoafM\\hR?sVoD|ǹ:tImh^tM7z_Җ>kM ,  CWt}g@R7}Kjfj/ 1Bxhrwl_*z=US'x &2xq9;b)颏Nw:]-AiQ(ɢʎF:1[+J6=ch:ﵽ{r=.2qvf?# Z`M}īAFjYuK|>_[m>j-ুI\y,;o7Θv1d9Oc:|GnzSeoJ6mOBB.<j{iI|dH$* yP1{mAL{U|/dܧgzLf=ix,n^=nWo(ŔLt>{ݴ |7;3)EœX۞yu@z^. Lp6|J{&DDr+M f]ܝ2li͌؊+}pͺgOFy6(wUI:3lHYk|@1e}˪+g?wmJrĽϙzi>2j.BK ZPny \߉uLDDܭM6-g--jjltSjNA?rO'[X{YrsXBy =8Dh='W .i "ZlMӅ>d%q26q TFgC&W:Pk̟Mz#^Iʛ!zT?u5[*d4.6J7JF~ȩFHK]8kȤ Iaj@R}'۟d-dΫ=K]s֣)Ab%\|ʹ% 'a9x'9 k"Qw1uI1I*C2By).J$V(?A Q@eSezKƁeEDڄULpv"JB]՜{_jEB!M'DH&zf!A#osDʇ$ϾL&%ƤqV)evG[6*6-'&tgPb_2}nXJa9hio-F[,HUmͬl뛞ʃhgd(1rL1e󖟛o_T/6{{9'~*:U8?! ! IOy0)\/Y˄tO c5Hc=,GgR9sÙ)hLԬH'oƾ +7c.\.^ hWG nwwU[;tl."In+& @kPwPJ oܚܟƞVS< #J}-@ܳ h'MCQMZC]cܯ`Kua&U,թMҞ߉\f4} 'Ilbyt38Pwn̳^qi!1Ƴy'ݤsG3Oǽ=Ic/}% OZm/m "?Օ y<ϚYy{Btږy㏣zm[ NկLڠ4i_''4آ-%1?H/uA\n4_nu2D9p3P^ɤMχhUZ88~*7q!n/ 6_&ď$}8Pq[sȡ=&) i91 h \bG@[w'g|ӅQ  *a=ZڲC΃)@TqR:=4sz'!'o0s<. VZrCK^5Asy̋.ڸW(82N"i4eZpjޓi^saí_7j'?٦94T߽30yG _{-tB-tm78ӰrpgBatzrd_G5G5⥳q /'-_9}:0mG92#͇~{Cp#{"ɜ(C% SlkZjm4=+\83%Kն(~2M2&t.i6nLImKցuK[9x%i O Ii]W[;'%2ݹYM">*d:[J!; bó a}ܛ^>\w&d\ґˮo0:,gvw#p:'"x: iDߣS .e ={DO_;gims.8?H/a BTD}y*R# =>R"Ւp`s D!DԈEU@SBp Ib."[<ru\h\Wd[;(tqǞ._{Q2o\1AӢgT'@sTgK⩟2g=i+FKtmtež@yW~ٔWvVh 0T߸Fm;g#DP§d]DcQOC?F|X돭E[&Q,>zq'qKLmޱQ;M׿K2-cv88ɵMwꀂ,]Ө= pEw83NYe>J_GsLЕ+\$cg==qsWOי.f`x8[66h q hS?ן@>4-rǽ  O !4,3DKO3jS۝}օ+)np}PRDNON=5:MhU5м1լrYگg8\oZKU Nyw klQ9MkB(r>y%Ƴe~̹Ӓ2hO =PK4-}"f*\xf8S=Szc{Re۞)*>c@mš t~L(P?|1e=+\(e bW+,R畻i QJ)9y윟K6v.ǔ='`5'=,͚{3 toFvp|TLNn\<&i޸ hL5,&ch{R|Eԑ;Κ6K;[0Fp7/ mO D# RD;"iI&B`#'/W$!_//]oSP@l rBO{v1]n{::ߨ^ ,\B#$5xl+m,ĽI)Y^YB6m$Dc̚g@QRa#4CT+`i/u`J-u֞&+O\Q܆adqnӣLVOVIydC ; к e4{%xE抔qOSbG ~|NE4+\Lê|񚤏Tʮ6Cr9)FV}<"_)'E,<19,ƭz,T: S$$$Hˤo2y8ΎŷDvgN6ll "׌Fx-J;+f >Y;k?0.IE2/,tbEaZKI/@VcE{mZ7-i y+GK;L&zqGivnW 埰9!٩$X&. 4ȼ mLD[H:/  дl+|gKQ^4R|vti\À,qIwXM)dLfUCuc>~#?'1^!suT`_fJ$a1 ̶m$!Hl)3ksr`l VWDV2C>cʣ6I<8{nn6ne|L3Ŀ}G7mY~ɼ[Ff*5)@f-Æ+MWi~,]E͈zx1dcyzT6}}|?i1O-9]Jꌮ)هo2.wZcIUMB_W/SL%Ŷq5ݮ1Q.{pjt8(X:!`m[bE4! K`>:mhpxD=#.v~;_[^<. ]ýqw^qdkŻ0_EB/a\T"u< :78lB^ݫ#e8swƀ۴)7<M-4 v ?Mg<WMKC͐W .i " Qs:DzS[G_%.W 5+"b$=TR4qOn T)IJhK*x2q|Fr蟍9ƨ[,_Z %]Q7*zQJ[X -lGoͪlZ@jfXK^qMvz ǟ/K]$Gpݷ3c֞;ަ<7HpmIhSn0E"}A(G4%?U`΋-Դ{nteRm6cYӖ΢dPiztwc50XBn. yǿ= Wmq?[}& w~{Zzz 5weZ)W(:~;cY|[ & hŸXx\ZHX`BQ#i&p?o+:zjW 2@ܽûkgtC%?TH8|5sHd eOX_4 oTަQvķVeqecZ[+j?5wGa;smY]ٗ}! .@WHL'+6BJ>WZDm7;tn-ϴ'Q+'!vXG2nyѱ-&RCnP# fŘ8a m1squZ뎮,5.?qqt0{!iwk3-^-ZwTչVfcH,yM2r/ b=xE]8`Z oD"^hu0r`7MF)Z"TGS`6;{Z& tv\sDO&"۶qkbiMⱭxMѶG &Cǧ06sfޔ 5`? ޱLYgXKch#r^'j.0) ۈV̫9’ю;y8A@zi_ ^65ҀY1ӗ3ا&Iz);) yrWڐ{9v7+oYmODU;GBRTpHnt,PW1)KSRt#~3帥6g6\a|(atɘ@$-Ƥ}$3QL*wȜiKy9}ݱ/Z`(7&/7u2CeZ){姺WT+III4"Ud@-+}di߽|>U. +*H0#hJNfs!"^^J _RYS '% UJء `v"/DMt{c&>Qđ%z_e7GիYw 2qj,?b,F\sģͳmuE[P[āIjgwğ,j "dmN<.\&i g7"~mc,ш{?[H)=kS!}yW \HOnV-bIGZCⰆa̧N `qO_}g(ŊBd~4N |.d e'Z:_眞|oRei8GW6,xay{l7ipBK@,a]˭i_'kG{&>5(qm?+̏*i;#;Ö"'+MZMy[F7`G3$Zc] zYhw܋`Uz-)%M8A:q&q zw~ԳK 速iCc;=f]2+PSWjvR#ɔLR624mt(S'y N Ccli{!a N#*ƙd0˺_L0pJFf{п؛ЁJ5VTWC#UTfŞ^2(S+AB#٠!h2`37hT6-25 ;-@3V#~P/ȉh~JN^8{3m{MiIM[TbumăKSm(?'!E{3IHcG!r! ѱBVsւb̦R^vL,0+"p)8`fD/n=j%@bLF㊦w :z]D^G^=j r1(lWa0K\ы6Mv= 9aKǏ)Kt<-@ܽn+ۺ^sKr[ uxon 7}-AvgKZur!^C􆾘,suϏm4i:ĹsXg4~-Iq9ĸ[SmqNasUm 1m6+nm}57XE[81ަٔ6ٓ؞"iOuj 5 9n)E['eW6~Ib[Ķ&CxmlWq58*_CpMQQf a_N 7]S"ZT1TREGD"NOvSyR%,fwƸ/O:}P~%&&2[Rp<Ɓ@̅/:h UӼ9y|n˱s냩:@m /*(ZǽjFKHq?N?l60@Xђh c1Ӡ!z+jEQ6/ӾdȾG( @wA x(6BrS2J'Oh鬻k\3d#QOq8 i(Fb]`}ꘛ] = mԳ<zl_4TAC }xeb]J p·Anpcqy҆#б{xczVn2vz/_ߏ> nWtߒ<5nq xFZh :^9u263ǙwLE}-AwWkWb QJ-g-, Aڇ~v IjBUO*i̪猑0ciF+F&.E1myB"'Ė藈C4Gdwu:3>z?3$|j<(q 4>8ǟF$jMZѿm  @) \}Q!w1˙:H>O ' &'WДH?z}~Si uН%w=!T㑂?<{pNxVSd&fDzpAd8kYmm\6}6fm_ܝ 2O˲IuSv.3WfUbTN0{&G>D/+ڢJgcFͪwO%!9NyqBWM\-RyX~VR35uu:yA/jmىh+Uy^9ضwUGI !}Aʢt`[Eї: )VqF=Lf֠RXxܴ>,X"fJhvMo6&KfAKM?J~!$aL&&Z幎[ *4Wؾm_)Iz^[я:sעD6o Eт@8׊e>8'Ɲd;X2k$Vc=Imo<5y->CGn ~Ed{TNVp P yJ\tiߙ537OʉkXI̜e}z~F$L}Lۣl] DRw+\T𷎻+MdsW%[)j+^2 OZӰMH7缮<]Cn/\MGkYNl) BRF.SCt!eU=VٴWx+Zڰ<ӸeE[~//0KxSr#!=5_E8/%D[KZ@ݍ<GaYZNÚ.&ݧXo9_8$DK>?R]k'JV tKYGo- J@0x ~,@,E[44 fW n?> ӟŌtQ\6..z~׎tiI|9N2/x܏d ߎpPZX _jֽ4㸯XRK$Ct*^Da /@_(;3[SpwwًG6FzP*4oċ%?EM}DDh b QO?Ey0S7I <`Gy--o^W[tUڰ; ni)`.Y:vSՓ>" N 6--O"ވw^sYQ|ny*mAWpC qq0;msɃgKW / wbu6S߱ߟ ^p1/rHt3~h}6,A{n-}~sD$]uYyi/ΈrF㚠tjSU>%|^#.-trHRʀwX0pc@]9B͏WBJLDRH]}H,܃" 6xd5vLz7?*t75Wx9@?~-VCU0DxȤ>ֆSYD&cǰʬ#I& G̵kE|#RݱnC%$0!.HN=ӬJۚ'zM6`pEUۣX(+=; J@DVBq]sşv&!َgPu[vfӭ>ҭ^WjS?'Ǚ*+|_xh^)nZO Wl|=x +3:bنsI !bzLuASpPe (U0. PCҏUI"W0atUo*hc딎(^\^FmOaGEaxc[|3/g겝}~^׊IFEtk;n=c4ԤOluW H] jeFɻp.E0 BL$dxUS 8#UV?4 P&[$'K;v4!?tq( Ify){+rK.?@5ݠ}xnp!{W1 hM@} r7ҏOq>o&M㇚cm:qEr,?3sp1Zeפ|ZҊ^"0mS:2S~؊G'tWvRoIҵ9~~ꧢ?Õ^TXluYmZ#xQduG~Bf+~ǩ̲qaۅ+f8$wi>ʂ.A?ƒG2)KmI9faoǦAs9$>~~yU2a*-@s|l2?Ƨ "SK?vWiq]Ԇr4eLAɫKH<+Ҡ_¦/i_^L~þh1Tr<{Sq% !.de􋀞Y'Bn Rg̰ ~-bt5k]hvSUνp|&_M%7>9\<2S4`dI9[`sѽGSpϦt%h O̽&9;Ig= )y+NL_xgXA@`%yy8sx1Oߵ7d}yv Vjg' f7S4֩]-lrrQ@&g-Y V#) ?Czuv{_W3}Nv[7[ema)5JV_Ԙaɘa}6QL"BHD-I!X#֑ 'G| vNІ(?!"tƒ`Y"FX4A[`WPZ[p L֩YmZmlqSIV0%1sOBV ~)!+)IXԴ_&sAdEO$Ǿ 0@X5p2cV`o3 mB D^dIPt{d*(/-Q˜I{ust@@Mܳl5%DqMVi:0.rH.QZ7Nj ,XC]궯C5VzY܂=:GE|m;j/ڛ}|@[i;BKI)T!e$RlꝞZ`.\MRp{ClIS`ݷ{DRX;),N_71\ɘr0UA珧zSRӥSl#ԋo;m֏N4|Rƾ 0@Xv=ݲ{cgq˙uv r B(iR+\ Nȧv]Ma6'+e:6_-3^`@F?S-}B&7ɂ(L>B06W YΠ,ePK\Z*)ɂciNUs4ďq> ,VrO ]}8u<¶h us*?gUh%$hGӼ 3h wC_>E*Y2YI@hBt!q{jTm{D4:|&K$UIi#K{;ʦQ-_noW2)=\yop!UV&| m➿in_r;73<}m(}OfGlyyɠ .i "5kHppiLtuBSk]^!   pJ xiؤljĊm/Z':2Bĕt{U: 7Cu\(0p.[u\=ߩ66wC`7\3'\!G>:%Z1}OOx)A4˯ş6,_~jQL_1!BwI/fX=yw=qwN=1[s QD?R*gJ3#V~wYe3Ȼn|K T;%CwGPL r7 4_t QjSpq)VuX%\wAF{D ,۸[*7cg;,v^=~[#WG65q͓>;J¶ f+`T |4w, #CbfŽh&:~񁣌++ 2Bu4Qs]uC<2Q{lsYp}$E[wE L}Sh(Bc ݢDYV b {0)ɻ+( jAg}a/ /d\$URPp[4ˊ^pėUާV4IeIe}W 9nRXշĶ[ʾMNfyeuɮX<|lbk7e>%b ,gMW(n 7m8R8t , ˍ_dVh\E>;M6y~iz *O .;i%mu$$`A+ t?'BհpH`oB~1%xuJyKѳ Ƒ6gr\Y-@\j~1p"6a((IdG3)mhrÎm^sΪϏÞýso 4O,2rQs[ٲ"ĪR-šL/@ ShM5)l },Q# |5a _?1 G!O ƾ / F;hXN襍~AdxaË&.F  hNQG;)ôV3[Қb-4'mfԮpAd.YriF{f&Yi6ɪK ?G$*r-rׇXzQb{D=#Mym9?(-@owNE0W z $9MS88m ҺUO֊(@;I:ʯHRaSITL{T䏵7\& [p5 nłXu[lMs&KzӚ:6| Sko5?Bg3] V9?LuL0t}VDhy/E4O`,=: _m>uoe4G<~$!&8^ ;6;|hmO EI|bM6NV GjD+21P!u :jgW]? \XD|+P6=[cNf3qn~6xISyPJ,!EQG@-'m^:D z]DjVd%(bVwuwm4c@kZ`+;}?//wB'BDn0ө&5㼻z ~<t?I4gSH,9n 7/]$?w1k+k%Rʧ@%Sl$)~=n-]nTra4d>G,q -w&]ڥܓ||H|ٗa6=y) 0aB>' Eq3Tk\yf#D.J4%]5}~􆄷J7<A?-#LFOz#~׳]3ތŅmS>gOc/:L[r>NqmGO: q3#)"fF/ 0Fu\+% _2/Itk{wYA`J? K]{(B;iܶՐmcT5 54ZWN\*P P;dGDm@d[FőI>$|quE9D't D%$t-Ah(.bo߄F z&\qxE`$:};6' X:/G<=zOȗIE>Mfȡ= af[6<5Ⱦkv b(*P(Th $Z~\jsuO?^f'X'OMma\ oL@\ l"V֚}es(AEse)yLYۇ29_ִ69O0bq#:.rL lwj &z/!y/10liTg YF 2@swXRd?TK ȏqTo`I!V &O 7%n2/ r JeXFH85f8CBzqW@#)UKbWNz+ ̩ lFzܐ,NI)G G HQƽ%LDZӇ'(s T8dF)z'Se~Ô=GA/ & .Jܞ6HL?/zgx#)?!U85ɟ+)bl.zf/R-nR?Z(06&aHc {gە|S-C kkLSo9SYs6%\;D"UB+!ϵt\5Rhjz^UFڸQ-Mj` ӘΆ--|Ldw;Ie=/ Dn6$,>_`<9H 8I)Ap[`0ۂÔI%Nw}vqWrhٟӂٴqZ`nn?}}~7*u[{6y]gWse|6n7W{[myYy_Ƒ/=ɥ:iYu:YۺxGzGŻwu7]Kb`)E@9.Q%A5vwehvn@x Dwg!4lt<%1Gq,-. +2/gUF -:^+0Ao'*8&n~{۞St黸`qjX _飡uʏ)1Q}Ma)f<` Z$hH Ed T lB`S-tcİN,qAf<̉!lk"~: L.&|.u-H6II)$XO뷃*rGP(l?3DL)Zr;[KX$#;C>nE!*Mvxj eڞ.~ ۔f׶3T4,C DRw%IkCW)5r.}99wܸ Yc,A)YlY[E fCJ>A`T始PޘFRؑn )C!H]y:Wp(ßLb&eQHP$7}엨Hy1Xݝ%AWͲsØKjnj-ɱl r|}]-2?Wu!uO@,^5!wv$F֑ hQ47|i}})Ic~Kdq[(z፵~nǑK%B'v8- ^ݯ2V^0su`Œ{`[j?Œ\o[X KQo4L - >0'Ɨ6$/V†uc+Դzkq7wd $ԷP؁`t=%tR@xkkDs^b"A80PQEﭑ`;U;JKu&gʦjEX5Þe<#H YY@;bݙU0Gh5YcSN/FZgMҍ$ I7jEXVKQSPo_GAzg`-_Z@]%I5QEŇ 1- $ Yثˉ5jٟ;4Uq]r4:.y 8loP B`"ɼZџ4`W|,8lZ[pƫgf@`8d:,2|`mݠ̭7xH'BR!n73O{$FP 2U3:\n1yZ#T]"Z*hr/N`.ړEoSAq^]+,'A)[UR Ѵ/rh͔gїByC J-jbK?1]Q:Nݬ$zM+iRvX,o%y~&*p]S%ZB'A{_eAe$PXKDt)BsE>v]EMQU"@ڛ`*㙥N%5Qz( c|Q#['ɒmבr5K;/\_Ssl̀,Vk) ߚL2QFm_,g ;䃓lq 1!ITHB@C Q6yی _4IQ])7HxU](*ad&H(WAaT充o8V@'D.=sdq~4Fe_/HpLuL]!8'z i(1pTDNң#kVKU vHc)]oE?7Qvl|Z@4,~aoib[BC tߙ?0ا=} zs<iEO:[$D;aGx&_H:vKJrJ\}l+l^c>Q~ι]%$aSV) giqV>};XsM=sW} yƹ_`7Rz<# ֱԲͨ/N| )6\0$+iˤ"YAŖRK=%Y:[CuDU\fx9/؂hc7Q肵Ð]c4p0Ie{yχ_%E *ik[)ݭY+]OEJj$Bzӗ<Ҩ=pNnˣ)g5݄ű^{R<$ЍQHFr5*6ohq;ecvb-%ƳO2G`0s Bc!TWAE.ZGEEu@td d"Ax.|1Q铯OK[`f+Z*"$^:as#>uűP~0ƟzLeKW%#Unh9u{c[űbZS"'*T͉1E"91&A@?H." /{A2U$%%6>/ Ls4VOi86"oJ?˶28m 1YYyt ,ok6(c8h^Sc`݂jKLC:\;R;7mr݈&m=ڋo8v$IA6XX .ې`aoD0EW"D0J 4KY K{JhoJ_]~IGON"vD"ju3"Zw ih aV7Y* 8YƎG?f;|a+(Xcn9'~icGl=cq~6KXyGpDSQRx⻶m+GufWܧCN!رY82ǯ'a% b .-G^f]" 胑_kBFz O[ëV6nJ$2SMjqĭ7ʟe̝ݦ\꺟JK(|%5"__9"yY[xxJ'>Q:mFdv ,o#7#6VDNɗ/q_woq 0k 4 ՛՗ v:^OJ6LZh%񇩝B&T:HdM&E(2.{İsk{Ʌ vV,7pzúB#V 'eڬ~fҖ qؑ]EGkȁ/+,PBpY8A靔һmlUL&-\th3ȮK}) k b |ML;Ge՗6Di KJh[.پYAJ9R"`FՅ4yN7<5`%%*'u*w\`xfm98ۻhUmI 5N+ReuN+b-YlrÞa,G=g:/Xsc!ڌK:7إZmoxB@D[{?(m ,oO>O-xWO+ vXcf[m{}W?7?cGWRg\ߔ.}on')x<fW% q||!jHk!avioTce=r,+.C|"!ѾU[?~bv%fF哧6n2JKCb9]O|{tai hh9bj/м4/(eq:[+oſC7BTiRP$bLaG &5f/6 yk?vgRaI433`B4˂2FIũ*9.B5 Y]e?bXG ݫPњ-izϩI?z؍hjeKAn׎op&8[JvQԺ?fwc ~C%=fXƮNj`&7~*ݓ:v/cXzJ!D/@VΠd?*an!\`RXk ]8X4q?"eW\EakXct(dD\rn f- 0Cv裑utTN}S06=V܆pYN`J5P?fQ2 +"i-[ﱻ7k^r9Pi@y.n)Kc|]Q27@ApO|J;2>09a~BH7x|RLeؖ76îh]նZ'> 39w v/\K {o5ɍOu*"zh-dK}ft,,/g 0cYIZ,`B-bu_)P@S}w0WU^hCupzD\3i 0@Cx]J2.{OZƐ&!cF_ÿ"#]gVP6,`n $M oYj(‹ݚ}S):(,fƦi#)aKҒ.f$I"I$\LZjeS ") p"J?Pޟձ5Ԑ?B:U(`狰,F22u쓧:fR ֋k a%cQoyN8H]S0=lI~3Γ2;cFvi^ )C>L1ͰRU=_ԮlO;dgWb6 wڐo*'󪱇;K/D6wi9&˃0),K7#NXޖ-&!Ÿ=g=㘄0@(g˅=Y@F]X\*f7&Gیp/J Pf q "#ST_ZU_iXX[ԧ=uR碾 <{46KX=֧}+ۼxZk/h\?5?W&eyU)eqpDID]apj?ӑ̞wh~o:eEM87r |x 8q#6~k[ѰSOhYmڿ"k~}T7a ,o>jQވb[o#6e͝EJc2rNf4vW|y"l|R?ģǯYY\UwTXm Bd P[BQӡxc2)},NCP@>W@nt ,o ;, .H[p#+:X"`c^9:;uxvg/0r؆k|uOt[ް݌ɨKuGD乺KѧHBm#5*_#3YYc g(yߚ9_O` cwkon9"V {Vz(}t"|";)5(ZA }̑,ۓ&ϒܣx Y.d픳#ʟm$)L EQ/OPbo !3a12ÉQq `Aw*$ SKX췟ST랔t"&4^h}̒Dd 7%@(ޝ6х5LڏµK-!Bt%ԝE G <ľhzHO ԙJt~J_Dd_yēLľ>9TiA6P>]@YkvyZϰOؐ^4>{x b 7Fq}M#; ߱Ŏ6 _߆S'FjDgfFDk׼ْ2);XC3(̵k,h[aK-q]rpԽVMҢb"BHo8͉!<$W8aPg8 U"6t\]mL%/Eٴ^p˛%H~Q< (u^*/&*=P aRcǘAvnXSnKUW/ؤ ro #Ga_+.0e4W{9H/p.FE wܴ u'n:2:tU>q'K>ff)PhC%ӊ~AIRIHƯ =9 [zG,`/CJv[l]X!ĮBa@5e:lWy0/ШZ~`MF]X/,?S6i*aݵ1s!e>t7:B˜ӉU>iVmԌ6|u6|>'ڗ?/v6GR`?xF~`5msElEþC+m'?ܗ|8a]*h[;Ǥ[ I7zZsS LO|q6幣uhQ7uI_`y]!,Rp@֡AtҀRrHS]Č^%fx 1fھ8vfנRA+ $cއ v>?@<,K2NӚ:ƘgRɔ 8>k8|ܾEj8RZJWMkdܶ c궸Z-25oAT@Wkj.~ vmjjZ8Q[U(m ,o:5Yvֿ+&xNyD7q+Ei%<䱷~fĻ"x+OJi6Qu*c _ɯ GBmcrR D7P{"I}2 [QEiEH"due2ЧLz`)KVϺ{+Zxܟݰ[R (3ar28+4XA{݃ ]}mO^|d~MͿ=*zEa2nʖ]q ;WmAm}~Q` jt{zKzN8j Ij3vhNWf/.Umo'eE]o74NLnˣ4.l:pW0A`ΑQ>肂aQoᵽz[݀( ,ouJ D!T3嶧a/Rű잇϶e`Ob4q 4+nLN;d%#G[9@8$Q<~@9޿Z&i G0{#10AICEk՘.& 4ƈ2֗rF$jAyz1!Ġkg%H׊PZШ\aV;T,5r+sL,grj.FWd\hIYI&ՏP׈!q5pytyi\ҙGnn*62U`.ZWQSMɮq )exo N]aϩ @t GNX`WN3ShݭG.gz~]sǹ,4k8/9ޱ30gBf+H{grb8n[s5:D7`>{Z$i (mw'fkck}dqX -~XAE/)HHrP!XevUD*)-?K7`յ{$X[qc0qԓk=7(>ҫ{\Ü8v]#5Q[7X8Nwuuv}}d~뽿 b\<^6>0˲֡(v h)F mԈF!Me1KAX0jWIM~=%(N@Xd={Hb5 ҟV)|To>,N:ױLN +E(,CH={c˄6:0PD!2^Y&uX=3n2v(x\6ďe9qY/Kr5ɨKֶC%v]}C|YVq߂$l%FT$NER)7:PaAla)Vp-N{rķzXc OpK\"%2p:V51FiQ#.FLc@ >6QfJ=AYuH gO:xcj&=d>K; /,*ςh tIλWWlݪo KTl o0(ۄ"Ze85rfU6Y8B1ESQW UB$]B *HI FU)A[Dk hW=tuMƌB:y/ދR2- _coYͺ5󕵙J̈+u ²x|48kAr5Rˬ}(d/3c+ukbD3=H:N⟇a: 2.P@:p ,o{(%?uPPŒt 7¯җ6;3á֎mcHĿ- $Tr(Q7u)_`xfO {48Q,)Q7u)_`xfn'$ !5n5\-:2Ƃ2gza'3>d"Id=]Hd?)es~Ĩu203ѳfo$*l0Xxܢ]7kp[jXe^4a$ˉ(O_$໲sDŽ ڏ KXRe_i-vc]'b ȁXWC gΎP&JX^OwT@,,I񱎣/q4 j/_L `GGufM7fެ v5n*:- VIuՠr@QA{]Yj,mU"{J!e1-u?}:((TY5q] LΗJCY{ xJM@RsxV ETsxyH8ZZRR틏RӶh)ajlHTzmPZgݚt?*^G?ݹ~g*ߩ^Yڢ_ arQOMAT[f]gbe^aF}~!w?h҉4S-6!\m}r evZey FY9D;TZdKYxv7?;nv|MQKZQPaaEuW;a~6x'0g,<)tT3äR07[D6 J1m>j|cHecGU." C~^}skOalțaO5/̸yx a:F/T|X.~(m ,o{RU`<ߪi $E˗Rqnv=zqTI*Le`{I/36 hHn6-^\4?88J/aK.:\`xfO:f2h]yu\< Xd'Vd$D( D.qxkBF:iM $8p ԊJ dӧךEC7<:00љakc7}՘QsYK1NXqeą$ ӔaZ?hvDU$/:A1!G.gBF VeF49Q贄p| ev:dmxS0L4%?$%@ JωVO%>_WQ>z4yݚ=i5UO."uXsX 9i--t֞?RyZhl,dB O3˸R@X򴣳‡9ϝ9Wls*!? C7·o# -?9 ^^ 9rTIY7SJۻgh{Nz]zEH~|5XUfhu%aSJR ~ I8Of_lFqԵ Q+lg57o|t:-X; l&*%I-R5ڃh {OZ)Ӽ@jP-΍%ꉂ~p%r?1%wI^h_*=A.v!"_TQ5߆u^z*jM[D6|/ꇂЅ6T(0K#g^w6ðJ[.|[0P"HiZia讀l+M$I_n)ߦed-nSq;^7+޼ɣ7; TJIRRVfDKtxlݢ<[n,#kmXNh56<{8v]zts9q[AeD61j)J5*ںGjBKpgHEBh+J(l}1dpBWS1|m*7y.i(mX0?5Ꝗh7) vٕw,@-1Hk$&f4Wk]wU6 &( V1 kD#/eDpd^A.`2$oj+Hk?sSl[O8v]^b _Moޜ|ɨ@T5s@_|fӸN D4Aب1iom"#??LDut)s_`vs4Kd|1g#coԣImT`®b;f" j/M&(AMv id!..HSF!.SQa 4v3-=s k鐴)73醒78]/",$ZUQb5.u|2hK"Cb{mM (Q`PYs\53Q:w4v)|X B_9+c&ڨ$Lvys9c?y=2%R3yo=~Kq13{ԗ ]x?WwnMY%n29VU#fd}l cЈ7j!>4gt6O}q_Yo2o|,$) []}bsn _IvYZD~A}$EP,7Ϥ˨d􇑵IZjKYmq@!/9ypuTڎ LB4bp0d g X!D8L4Y>t ,o*s3g뇛Ln(|8|mAuBfĤ> S+_o<)#,t T$qdI:Y^BE*2;@撢>M?n[mh.9! }ZK0*9I-a&.[Ew e ߹8ױ$7vц! m;Fo':ę}z,_oA_ڒQ$}$ŧ B H"cSb00$faO<\;SNyp >YSfAי QӖʲ8Hj o0KXfOq/USthP࣊(a5Lyݷ7mF&C9C05Ф!!R?DX`E {u)3 z@ ٪JT&KMqH5x~nUsO=R&7i9HbE0D LIV>H-neB+"i"a=#d:&OSb4Wq:x얥3OLj`8?4p5#gtEKRH\f e3(3!mžȵ#bZTawI4+e" `pW VkxS8W܁JmPvB*~{:c!\.>-lKr2g#vHckeϧgAju1iלrK[ZƤ6ѫ=QrՒH_G:#:e%+(U7pebӚ=/ `H[Lڥ #T Gy[%3[[5~vݶuoEZk#Vw $7D}eA'.됤F̥V!DMF(@A 0$X:JJmi>0(~j/bX}o^&K;{l> O44Jse"zB0*dF Ve MP+YXiv޸:05Myl3״ǻ4q' 5"6>fƬڐXjX{ Eβ&')`rwO#Eͱg%X'U#]e]u>cn$̣av iuvSBQK Dxi / of~ز~dWnE,>|$';_%f={)9&τ,M)Bɧ)#37$gEpS0oH7f@8ޯZKS;PU_+I`FIٺ{?i'jNT5lhI1QR31q%:OWR2$}MRZ#ЂT 9ZA{b>$c;;/X,|+[eD < BFd47tu LϮ~T D2mB,ř_DBM!/faj jQ=s81m}M 7T _>/v:/2L.#oΚp£xoXFUIiJ&`i>xP #Ai߄[Bм,TXnRgj5Gc2=v]uEnғ~Hͱ^^u~߂#郆%ǨkO9v݋ɄܰEW F0EXj-hM~Kפ'P⿔D>kNr^G0IoUDU`2zB"YnO0#1[{:By#~*:&>T ,u}AHضyM昄-naD,uJЭMI]|e|tKrNo65j ڠ#[XҤ9 a%IUC։Wl^WkxYicw#&>UdM*hB 'ȽRWW (bKMf6.{$4'RiZ||FLD黠iJ(%{z$kyu:69; N%srP(J@Lt}b=g%:em}~?9"*ԠMN*etlUi_Ra$J(m2BMC". a&s-=0b+ & hWIOFtއOkHoPE\)%VftZoi,jWv)0{@`lػve3(Zv0B)QapGǬ%9i+uPv.hlAR i2k]=dM<\s߶*^qs!}'$Ȍ07!v^1BþCR @MD[ML~VP]mj* Jh7ɮir;Zs| 1GP{iFoŇŚ?/(yEAAK[Pr%u"%Y-JMQk3˰dHܘ}=p{).kIEOgd}xk=.̛|Ă|]1l jAD JrDGw g!6] m^^ߋۃ"0Kj o7u P#㳽 %M~ЯIN'fd7ĺo>d,۴#?$S3_NV7`=H0Fj(_b􉉅(*"BVr ⅧKv[0Wۥ Q؝a#i_O/Og^FO\>|FzM?dY-;9fʃ|b|Q(?!eX0I`C˖d٦6Wze2@6xę,dw8B VyjrjYH&օ@ >ٱcǾ@3]LqKn3KorT1|/Dyv-s>4HMh( fֆ/6Wv6p>yYק"tZ`*Z=]*25i23Lyԓ!0GLHn쇁yV9grv4Qܓ4zYfv͓ YY[&P8QN"u=(97XȽCGJ岁-!3 Mja~IZK-$t*\9/G|uc,^/k${ oVr?GG* qS_UjWn&M$Dtfc+ap%ptxmRI%k7T,D%AI"Nɰ!M^9.`v ,oJ*,k>gScoD>l}A/sʎ_؃,x}l e:st6خg1ޑ%ޙ1׃݊'x,&:c Kj o0|ӏOoq*0J ZB,#ױ2ٲpZWongWIUxb3!+p.sY8j˿}O`݆dҟK9 N]`JFDIj(gI f@ r/(+cNaɸi5("&" 'BȯO`*+0c7={:`qej$*mer ZC^jA=ӎ˾67nKq&NoDRЄ͠T*~rYĴ&LҊUhe!~ܲwY4.BC!n.1Q(]1k1W T0Ⅶ( &)JNFpdlrb=v9II I6ۤ^a%⭢I |#wPpp5ɡEv $OE J:+ 3p"Ϥ<FPK.#JrE% kXid qVᰑ.KK]5a([h-IB0HJJ`bgL:', Zw>c~O7+((m ,o E+ā 6ȗe_)GH "*"Bjv =h|R)!@я@uՕ7qu[bb){ꇽUTۖ"-Yٗ$J@!Fa9,̲G~Ƣ/V>tih 5_, _ [[zARy[ z_`~pț2\`xfxK`pхX8Z0&zT tWnF-2 :й>x#"P; [֣n8Gyہ 6V9_%j &a]a NdU~{fc$87|4i)Birڰ1RK9.L'[Ur{&[Wp1(@cW m7F% -ӟ_N7t㟱87yjXcjLtԍQ G57QalcLkSɦ0;%&0NKp8"m9b_=8[5!0WtgԤ =E M.4m&{75{nyF^l, \Ch9foj_` PNʁD< Ɲ<)sݛT7<pX ;$YyH-H9W]pq#rt1x+_!͟ P{>U AEAF4R;*b Plт4U0Ѿ.|jiK{ mZ)!(!565v)R[q u8=G#KWElbͅ%'4"INj6i"$EvI[] *zvqHesR',}w3M5R$Kִ_,+L#c͊1El)~T~LF_A6&`_Z(Mv7S꾵x$5< 5hݛ5s-.`_ :|ۨ9uC7X噆5~ci+z~*`ևiXquXE.:D(:i<4 W}h[I)oEMGcIu5Y^;5VOԴގx*g &'m]ǘ~avԛWߟ$phIxZ 'a1 Y.@l/$_ub#sydsK9E<"i}K1IUq|O:=OὙ"e]|k1I+sw,&~#{2 Rfql K!lܫݚہVcܪEwvjTfZ#* /^Vr?g`>ˣLu4*k*:Շn~\׍c7}UzyXcwkf3V!-A:Z&;ƾR:8t6Ad۾ji@{&k}@a(cM}D*T` W* :􄊘8vfBT+huw¾vVȋi>xXk*ӦA J؏PtR5ۯL^ mR&Mz΢(scƆpk+Wڔ!X)qh ::`-A!i/5 , E * 60htSIIt-{17tuU]Zn;CE/YQ?Zq8,YP![˗m?(PRr>ilU[,j1YvsYH=DIp!9OtM y?iױ ־ Z@}nubwY%Gv$r](~,6MQi9[b9@=ʦfϞۛFD@h8!E>mK~hCSr4ř.ϵ؜ U~ɜ5qHWKn!xYA[G`nG ̪`ڽ @/{fS~ťj7OB|`*WBٛG+>8?*\{lN^?iꅍ]RpwӍ]ч-6zekX| VRy:0&n3qigdV9]"R@)ʊX'gG+W"t_N ֏_{>vfFMw5=0K@ӨM3D_DV0{Z}pH21y%zPφr")+.89p|3'ˑegGE*4 Cѥq"]0J%Ī dRאyIT%aÊs,djo_mBF`4.U,h,HψbM?vwk.Aj MBR]2b/6D*/>5N$PooJU c) 54j+,űmyUcdֳO5`g>?MlL`9Nz%z_L%kM ~M_ Aoq@em{GT0xrì.Ya3<#Zx\sv0M1nAy3^A^Y}A7uT\ѳQ󰇥0jFA 8)ޟ]~=q"̮;BQG$(܏Ջ1x$_< N@Z&5sҬlړem3\q!ggPs\Z^܏GP cX˱w"'n@Β! lBH皉㸏gf w9l^( scO2 vX#2 Rk=1 cji-ǾL>5{dE6FeT{d&uWixh&٠32f+[l۰cah,ߖ{ jGM3n$/g2a1\dk¼l30A0%MFVXřooy!@ Z Ir="9&’u;#L$!IJLencbcb@h̔:T$ PO^ sliηvFiD?(ڛb$7Itl0 .`Klgv Yj❶4x !=jAF /.^ 0Lǫݎ4Zf9M;75f;3nڶ^a9X\7pZGf{8DXF nӠNypAI n0$T"‘'i)u UY$x+P P  yÂ}% &3GU #ށSiu ۄdLoi+VO_XD 1P-yc|iuA Ԇ`0bplKƠk\j@幂o_~EJCz[cgSa.&ڦ@xe1ă9ezjބ!kt ,|5<$ 2f2 #TsSKcd$3k@2A-KgX$I?,\I@Aڨy3{v1/ݭYg ΰ,9cKUl"HN3Ɓ4޼AbnDNhRG [g-ɳN]s~W7s_R!!5o隷ܷi\-9븜)MW4+`k[*NOӉ S$[ q[3pV g2*iòBGŔ5S7\{q_Zui\sЅ٩O=AxDIj(QHaɥ2MmEv=[6AGpkڱDBH&X!ʦNX\p:zcܝZ\AT Ί@yͱa(v@T2 ,F-p9ލylaf&&P۝rb| i _r/rז\LrJ11&ա%O@\H(/D<*/A ~^^K%BrMP >8nΔ`t:g ՞ @gM N6vv,~li z܇gئ{ch𩣈nl%>BϢ%I3RՐnދ^` O|.29_k)͙]H; gvJ2 G_сF?č#湎yvmUgyC j !P#OS؍UJhVrwX!E;yN˵rDa>ƈd9țC3\ 8T#ënnUA7 s_*ؘUOQ!đ$K"SS$q-!k(5Z{qMغ' [F 38z#5 iY%L/SLl8;la6 c`f0$&a@X-dB$2;Mhav #9pa%Y H)4~y&aNw@F0HÛ]<<}G†!131„9J>sF)!G{*FnȗM8HPBUP&s *i Rg&,ve6_`xY}%IOPLLjz_a_}4]- >d\6C#YI֐ƀ?4$idDTaX0? "^NLL! < lyo,4GCK G{yű\TފU֌nPj V!tx~].o㮬1 +$h5p>!j'^1Ga$,j_M'^ O[,} ,چ5{Yr|lDa'! ľv3\Tr_s;"p9'Jsz< pƂ/W?@sx?=/>!¨KzG%$GԶ )B?ҬQ__[xlϘvO vW75X))jR飆BX9vݳtL'휼ur {‰`R-0.]KR<Ѽa]LK`íV("jQ/ EG7D܋v!/kT͇4Gl ]'DBV>3)$FHa2% yM8M̟閞9vfѣҎgBU41ys (Eӑ2d^a:X%"S&ב]$|T xn87UrZ/0yeXUT/^\{aYj]s_a  BG!'d Z F)HM| lVvNBpZ{fj̦ ?0;<\mpӚޣ51B]^*,Nח2k \xa_&A*s] uXMG|s~"=tUtqڨ5۹@P)E0WCp"UJH5mM$'h]{:+ d Yy|_Bp(6ω\`j7P7SWJ-]A/MaA_PMѾzf݃6eb g4qog4qo3)#An. .~Gu&;Wxj9ӣ$W۵e翘kIe%nn΁fDoXdm (Q[^b~NHLw6ٙPk$ðͨlr &&"!5$!:0}7/U R۴$_5 Xvk+JjDSNı,<7cp 9z74-_~x, N-X (NcY_bүS 2MbYl=dG)%/,ՑQJXb߼/VO j eLii$iS h\hGէJc&7"9ğP/?a8/GFOɩx_ i){I?^!hEK3E:),4~7в ^ b?Pnsm^cI0$i|znJf,DC jN##0񍢔liwg8]} vN/=p{s>c7kb]= Za] a~4f=?-yz5LV8a"EVHъ2X SYz~ ) |ThWTQ8P5>~b-|r*0Ԋ pxknmX?m& kx͂4nV4-J҅*1|AVMEJHvhyDg pqg N۴%}lcפgM}B)3I8dj X|iވ!Ft6* L"Gm,2{l? T^HMP@$(xְ 3+/8x.ޜ%,ozp'M tz̡Ƕ;%̓cx f3>jC*ϐ, }~ ׇ^dy/J9KwoS{t fi⫪s󫥝ϘjY{a M'@=uRoqpAeö3,Ms'TTEl&7l't>}p*.)gP=t!yC֐֌|$>9t G \xz尾 pq;6/vӲԠ,ggj⶚ǃCV߭X^Y9ݱ?%r"(h(]U$-b]mH?Ly GIBJpZ|E<*ǥ?Zyqt$?`9\PBJ FBO͇7`-Ғ B6Mq<U2yΩLC0/NK:!uﶝ'P9~4an m̚D $InAQG3UQld7eVȳߙ`EI87n>5t|%, Yt/sxIN|4#:Kt8z2r)Ќ ӏtWCں$ )`Da8+ΣtS V؞wa v{XL˯N۸DGj04'!}`)ۦZS8$v+* @$A& hZy})7v=jgK~m T'9H!Ӟ<9&y@x|{(bj%jzi(WCyc'JSJPftXjh%bP |R8!-Z25l9BLϖG5ńcI*ifƬvq5it\HC`Y?^?uԟȪV[%G!(%'G=SZn T,bDؚHl9F_P'P>Pq%9UcwkH”ohgq?(]>QBM2+kz !SZRҮa< '{C{z[Q)`Ծ_:gf֚nLnnP._&-rYS@,ӫXn]95liO ~].c7إ(vhТ~hI h-$ѱ}=>Ncek46nsge@;cY|`'3v\]Cf8'UPs 3\e Oї$zW_)̮zj(NayRV>nǦT~ז.#6fׯ9v]$ί&&h5,zQ %`+y?WZc[j&^bc[Cȴ냿0X8*#/ X`txi`!zrEN}%Zm?$e:=믚eun^|mtCPx! LSDODX+Ia.bl*8|`Mu/M̸`\jΠ坦: qޏ"4؈Yq9q}_#bI<*kIUr[cg?m"A(+m  IzɗEVAT*4v8y9-{ڈGED(c¶̘x+q^[vB{mJ,ٷnG U)FlR^ vVv){5ޯx< Bs~|B+N-zr8B&ά+Z޼IZb$@,F 2UNܡ鮴D%r,M`1O^ش9OjZ}oJ*%/QKk =7`D( 3SÙ53zi/I/D7v!]+g!ٙM/ H "$ 8/L1LO¶"Ж&iFq4|ȾAM NNr"Gҷ-kzIfH)QM~bB4Od7v׻-a&d:[0ݮ?Ny\k.^3|*~H`< LK$:qxvE:HbX:?$!bAWTWٖ鄆9, &ltY3EB a\c+9 @LJ9۟QZo vB8#>pYn^5)eKW_WO< S,WJtX Z Dk*J5%_j,W߾` ~9;DT)̮!{\; nhuAtfߒş&jY-n--I&\DiY%3tQ𜝐_cJ'uORH-U@ӓ:%(z/t*vNj"R4Ј'i,TBFDz0-c y%A8#?32J5Qt QI=.v# ^U\;jw\;_ @`,zC欢u1oV,[FW\;n -<45 ;FCU:$vB4VژPȰxa[\;_%&eϾ{|0rs }1 P9D2:g'*1Xv2zg]ϫ .l5| e1xB\f(+1F3y2kVYI@2F=4V&= TҠ4B{`Z{ebsHq\)ޘ df\hbH#]X&u Eى;=9N5;sj^ڒ &2`aWPb2PZ*Ʃj"eM_ vVM܇m-+ vbT@rAlF;C%|W$C$(0ճ|IU0H'2@vN?W©zM}lRk#{-5/ol]"ߊkDOJI̒D[z[tBd'0)/ p67S|sb71 [t[Ȫ#mv^9)62tUtʚI t_A ~y۴1CM4ι<_MC[wW,T$dڗss%'f,ܜZWB^}ס cXF?0+aRɎf=F8]=V.8`6 c3Իv'I4xNSHLV'*Ҵ$_4V)}h}.5Ĥul4!Y34;I x4)mW!dLh)"S5D0S$FtV\D,B:hϪlΒFȜMI>quUUfLFo1}3'x96^NjZz>d_~YT_}HfmYkI&ZIBWяJjdH}Q+;p(lP-Ŗ-;D#g/)Iz*e"H>':-uCtd3qDACso'tKCYfU-@$dBFf増\NP] ڏhZ|b5@ݪVޗъv~_40Re!3({%1J&^`_Fпd6 #:*17 rZUD?C~v }qG#fnoòG ͔2:ɋ~w`×yT~0tLӄ^r1aY Aj^164hS(z>h(do%l#XM%S|HYv{Fq~w%vB"5Hqb1=aZ=/tB/%`o^@C |()(A4[Yڏ[!ͫ/Ҽcθ$ҳ:j;:2#>l~TNPb);0:-O1CATgPۃӐ've-!iZaSgYO%lOw;7\|GyMe#m_O8`@м#VY  wm"g6h}?ƲA(@Qu2O%tHYiD/ζa. _@KJ"l$J16r{ 96z~Z:ӀH% .J; F:BiE¶ȎVo;g#A&:cYp_n,{tEdX78|E5s/>AD8`:YIyRԓM2%`SZlQ  Xk&֌-"i7 ]j0-dĭBs$ZTYrYa-v ܞXx٢L5VjyRnzQԤ_PM^j bTiݚONA:H&kk`UH,Xo#]^O9]:NCކ8u۝ D tiZ(,` )NR pZ/{ϥƏ2 I2Fɯ<%Y=յKuf>ټB)Q=%ӏff+Й(P6 CY*3 _PKyaRpF7*lXcc^b|438|sFFw)0/O-K*Y )h`(UԒѵdS5`É}!^)OFdqXߴV[%RW~~qHQZ S 8JI s\rVXŔ6b?X'(`O-,Tdל.[oɉ8hY_L +ZIM@.~CDhoEsТiLy][;Zi\2m5/i]Sz! ! ۷)1m2$uaʘVxe Y7?VZzg$ 9?X̻+T\r%!]I\FOGQewKC9B낼PS MmCrTh:_wx.wpubƈHΐ-wFE Yr"r|vB?_%="G6zًD|ybX;"["geL =Q~/. ²^njKzZvJ,buYuE=Ӛxmb~ׯ+9z Sw?')w'N8k(Lݶj#aQ{:e. sXf:th% zʻF uyQbћC+m<_QL&ۊhr {6a 4.B%1P(b ut rQ!.}v@o,֋dRߑ >0RX24n]ίU&)AV3; wnYR4 QN"ӗJE`{gAj=o`i Y+Fa7$Pv(fĤI-b_2kl5= tuBipm߯q~M׵u\ y0tY.YoPy}ηxRW D!PZ丑 "`y&ayM}}e"2D%$jr1w"43"9wJdǠJ0eAK0$irS q) "cAkVH(# nH-a8Ff-hǙi=nvB.׵>=ZN藢\4LǂIx>tEC-İ2LH%dTji&]v{hmE KҖswL!T[]]jC!B 4+:Rspf=󜘰]ϧ{O ҳk1:pgʿqh$ $I2KE $pF$!b嶰 wV!C˟zHAx0ZH n=deas%Lo`y=2{ ;nMi٤ [I– yy:QڲF_r. -1粉s.:晩lLo-#uP2Q'Ivt,%_ԾƊ+ |!tȖ(@JkyO6('M .âq]F -\]Ųy!5M$~Ms C(Ѿu=OF }bHtKjmFo5d6w\b V$t#( בva-5V1b8̥jDrIYK.TϚr-zC/b@}Wq(T RjTj5/'k'KKK'!9`94=}|g1G0],wP/=16tB$3i/me 5ɽ]GL}%#:4LK1fI70 bvbtL9dOvU-oEIͱZU|xY7hq${OjbׇJvh.c_tqÍ} O\U%P:(g Mt5IjsT05ti.>up|"ڢP2eρj,~~B+<$v ҳq6(91h)R$"۟ E00*a ۞9 n=G٨K[5/xYF+(/ Vg}w "zXz ]B_>4uc-&|)G3#ۍXMa7o| ax9%MxkLej1l(P( :9C]%Y-_\<S;Ř]Ko.PSJʊkgyWuly0*[l ;uJߝl.A =8f>;ԏmKcX߿HXAQ?@4AEⵀop_1x_L׵ +.e:D jpBs|Pt4;O9!A7?$[ITE RQEJB]K*:)wPƧ%Fe&0 H[]mwU⛘䳢b("=_)lePk_O/vB4V?E<7__;_\l -4F%C/1EZFtK^ 2yDUT4LھwhiOn^xm^LbN~sl7=>YDTX`MrBnZg?#i& wF>(n>AU/1zJFxL!Y69k!1WyشⴈRqMƢ"~&vs%?tL8!_w'2y*:\mxfV5M# I46%C ԡrƄ^?@9F_ n/%,ץ밊Cuhk'V6L` _I.Gs%"yKH֍KZE0@SX mܣqC Dvd\]#\NPxdmΨi.rjV9S(0$FÖ@'NXae 9m,ҴWd OJ7IkS"zqqX-ՒCHTm(X>dbX^ 8&JEa amP(}<֮fOK#m~Nf~Tr˖*LkyOy*Fኟ3#m',A+m%/8 وO(PoI.~a"q T})751x沅YZvvTwXUM^Q`o?tk*{4>#yTc>c?&kke^^"" 57/➰2 cK8TaUuqKlu7X-JKW~~@V)}F/u8ړb6X$n2 !mq2pL]GuY2˘]?H03l tiE-N 1Nyk'Ko,"df𚑯k'A6.C~ P+֏cӔ( #1 >|VL.BnCX}9XĨ e`6[Bo>`Pk;TGҏkU 7[c!3j+/7pka`́5YǦ, 46l׾>=9*Mᚋ)XP6M-}l,%^62<~4_zV:GҦZr"b&aa~G U mC/eZ nKvݮhaZLKDY.2FWP[Ѕ;gG=/SJ b2ҤdNC ̆]2y9i**M:dk:xV:͚R݃Lzz=~ GRO`WX$=^{3++]ϵ]2l.vsbҖ(UQV}M{\sn|9޷eG%:!%T² *)CCXß:cI5NW gXN(I AKd*zr)_ [4Beuq Cv:7e PDSW p-eRLn_Uܾ:e'5x6!ٞ͘ɖKeъܸ-WsKsۯ~/ h6 jV0hY4Fp[Ā aHYygRIa}۾6F0FHSC} a{\"> o`|ssgӢ+C2;7iC5s;̄L T8m#`L%K,S)3s8XY]4֭j(!.wp .OE I NTQA`XmwJ=>-KpهAutJz+Jz-z]L>>%G`R¿eD')R3ҷWk,cNfJ l=Oz>!P ]\ɑq vJ5NnOt`| $^M˵' RJfUVҸ%hIx[I(@1ݮ[X3-H.O!я:"eVb'>潖⼷MІ /v˺炵j D j֭#\`3VųC Q:I+ipƠ ʸNpBPDg;F쾏:: Moo2'@=Pb@a9/CWt XIHV"x2nceSh`mg $~U~y*F JRռ5 a!e#f@=`aȜ$.MVr \J_|8z@a{wr@1Z|;s}so)AZS\**~0 # w#Uv-۸z >@%L}LHUc8Ys_x@쇟t ۷U#Ga# $b#\QG6wN[qL^cd1._O%`i<_@O2OUlagv/DKk;-}@8u%"cL7^FY5g_B}Y$-Io5A'g @y" y\WeGEφe1ݬ2b__vR {}syڶ+kXT1bff#5 )GX~14JÙt 8!:pTu5[E1Gf9ڐhN,99o\ ʓ$'xC-!d!N kvUH6KJ=ڹ͑Y% ^{|2t?j-H쎊~9L,/ $Sq+ccܻ~\+ 8(=NJZ=ϚfWX9i4 ߡmlJì-0^4G5b6H@}*X`@ `fݻWMf Бb<@KM-AD? HH$iJ'Ė0q,ad bb]͕F 58x%U^NIRgWiZʂVJK{юbo(ȟM MԨ[bNw'ߑO=lZݧD{5FͽEE=L[7u>qUlHГߧX)Щ& ti5LZӲgEr B<2=D= !Tj;xTi3?nb(($S+PLYtS^Hqŧ@C}Κк5OTv[Ʃ5AR4#atTmEs%ԌJ>:6(ۂTK~C…>kcl" jeLKw줪m/=/;CZ$"OE !Y˓z(7AǓY6ҎVϭ+.+!=$<3.?)Ѷǧ_6==qL`ӒYhR2&xޢH$Rufl10Αd-yn$ ɼ%jvx ??f?l 'L!`@pJJr^Ïj%}L:2C cv8!ǠCapQ %S˚1 %h0]Rr+4BLV-RAΊDq>^ k'㹲XLl|%۶^^~ƶȤ\};-i qmQE[oKT'hSڃ ohSO3~*"rLܾ鏉Gv^=ٟ=fAdMd\6 -;I%Ch D'4Z÷?>b8Y6$2lj)F?ΔNaKѳԉr !R-=s/%I9G%b4QC jͰm+vMQwJfB\@eg+B67'i]v~XR8F[_gGJrgKhBX̍ϊ0m!9eiUeoC!uؘ&C .iz5)TML획uXVK}>hq~i~46簼z];_%5ff'Lm\׹%8 rN$ _:youGǧ} o$9dhm0XU#v`h3Nev Ib [m H%#9T`ɀy)SONiK5LAXg:5(4kh;A#q*2 #xe(Mɰ%6n_y&|E~ZPB}ܡB_0b{xO~Z' ` #꒭!Sri+(\!ue1at Sgr%Z ZveQ\nNEDeڱ^0|h~BD^V^ᙑvYP^$$LteEv![Ë|bIbl߮ >vBl {7;:V$*q'2(ވ0B %*f*ۊ7O8oNJ,1/ƾ@/yrF5*Qy#͕ev&ѡcFMYX&RrmVo8;Wl:d7%1Š[c0z t ? ?[L֛J_P{-0Pu {]) )>$9#5ΦBvЪK tƄ׳Kb\#<戗WмDXk3؇1G2FNJ~`{@+Da[< !1i I |RU S$?)!,jHLf |/QBB --eg{D |!}ш i_(##ZM_N./Ѿ|1gi(UNMvXJq Bh28531ԾSr^f@*ۨB_5XBGl4}ȴuӚYz ߋfV|nӖ(rhK$"+a5ށSfN#?"k,/v1b~ӣv骓 =Hny\h@Hd]z]/ z/z];_|eMP<EQ6*I(HtBb USy^GE# ;߱ZՔ "8`JdkHI/OJnyA2M^㚵<-c!//*/|[׳z//W 5"l"v֕9oi%۴:Š:f  AM eoJ'F c95ߟ䤐>FGJtG~{(+ݓ1eQ`h`qap߫,v1{.<]Ȃ@IP*)[ۍ?z=gy=hXo$VdA7RXg.m}1.Ӷ1 kȒxT=S%܁%/Z8T"|AX^PZgnp̺PSyՔlM]ƙРt:4=2SV\ M dXutpYNmvc?*ŷLZ@iLf^˰7Ž{%+`)L<98MVP.*׃F0# лѻ,Y 6[r*7I"y%S{|q~Dio{s07D_deK9K-zx@sA]Mk9Z(js #&T9x?/.#9N[I1*-jbÄկ]>DYGEmq9(ϣk{QIǔQ%YMTҾRe_gGIM^E=E?Aq!#E0ޱ덅A͋$?qetZw+]GchZv?yB̶2ӇK͸32isCoIV"C,KkI|n۸, `( g^7fZ+K+"!2WAFVA1s,1^%ahbᘔݵ3(xFA5~uHO#%LRʾR43S7@!D#7 w0ER9eQh5$ 9=%UYl έʁтGŒQ2L0O/%4{Voѣ`|8;ww-yή/lE>_3%>rxjv{t'J!!!>>|tP (rq[rwh=aH}-؝a6zTSgkX$LX|I^_ZxKBWUӮ뫘Exnd~tI&PG)/O; [#N2E|,$#Hӎq'~n2H뷿8k'QLnµSE!F!TD!ؒb^$ ){VבY3LEŜIj5[s\ #K0N%>jDssHJ:3F4=>`bG?)2Ds žs ?LZ쏻\aЯ|7p˺c7LPk륀>mQP `zkZDmJWxU_= ֐\h  `pb7i/1w ZQ1!{P2l툆 > {6DXFqWV@~%mjeeH2R6leEpHC4;|xNxzz)%"]Dq@p*oJ0p` F̞kO/dPJB@;L! e:Ymy:k{*Zr?љnk+>I)PbD{ &?)-+ٵ bŸ7y99-Z}⽷xU N!R"<<,j1A{5Xr ~1O XXn#MLK'I(*DX`!,SRoz-DڛS[UatBbvh]t_*IޗNu%T0*\&8u;LXs OZVKq'2Y!=Y( 2pѯMir* qHfaRfth3NMpJ|زU֭ubv.5{^„!KVЈGQ-+ip ҇9$ѱlmoj%"@ʩC)Yߚ4n-FZmo!-?}V+Ҟ0(cxxB`2ɺ5xZͳtx8Xѩ@2W bCĉ)ܰsaT|;A9=5ҋ}0Uk}]vnﴀAMIxϻ.[:,F|-Sh;״GE'B.Z]IjO=:B+q$Zkǻ}62[>$眅 $3mAJ+;T2>7HOPiCt~DTdV\nN` n~"-!O>ŌN%\,¤&GOt†(CMd/d1%aH b0 [׭'}CY LK@Pض@!>uJÌ>uvl[ND7/y^0p9R?&ʒs=;.FNJ=O0RZ T$*:!~X-Kx];ߝLt!} y*8w_*1wvtQlbmʰSTY5bb;ƸrBL*+?vf[ ժF GNug{0V%SodJeI?V+~u *HCJdDBd%PD"ٟM]HN-̥¯axt?$m&K(E Š >J (2zr4ʥ>#OZ P$ h b Zީ E25K K%v ],@eN}Zq% ljBfFZ.h6:k^Bm^}—! St , Z> &ha!|B#e]vz|94\ҜDZ¯Z_~0 :Hr ӿW4BMB(ew,iHfNŵ 1ﻩcўJraѐϵv{9ݥ~\++YY?+FTkQ7\ L;O51 9 t&~!*2FZ=|[ iX TAٓGroCPeg3:j P t =o !^Kv~D?OUW;;m͊i_d^Gi BBUuc?U~&2?kj=k#on.j0L5Q4[U*vX8ĘU643 :e)xagb}*3~߾ l. aNY'Q1Up|a&Lxǧ[|g! LX},%ZU)a>wì}舥?0 # ߍWew6:-]z[yȐ DXI."ͩ64H+-NkEfDZz:QHj0y }QT%Ll"?bwb*}H1KD)2&^ ^DC\>ʹvB'zWww&]\;_kݮycDO*y ڙ6჉TFؠa[h//.sq=3|]EFEv^c5<RoxIeK^lG tH "X4 6̱4ӥ>V׵ŏ45 hC#_,⎖k~`Q/7ЖPt q#.I:*Lb3]Q99OڼY!r{7CX #8lEĚEЗLc !RH/T؅@R$>HѰQ%-ѤEڧ)AJX45,%,|oX GwSl5_sVWeѲ6E _0jG7f+UqV٘8/~纥 UFsorf6})z9NsB,Tl(g7G)cZa=g#Gԅ^*.CJ?៲_}qu{W{<6Av6$7?>g9#рQ 37jf,p=deWNa}];_jq>juŵԌsuAЙ10,Q0 )Ӕl.뷥hc*alS,JIa܁N2aީQ[DK,a;曶gȝ>0TxJ#i"5PsO o'[~Yv_G["O,ݟ;~!?.oۦȴ.ZɑRiӾۭ͛nYn^ AF!;p˺ɕ2 ]t$#0L{ߒ@`~957l-TmD`1ZC"ȑ:q|GE+ӃOGND-9G[*GDz~[Q>UF L0(ci2Oq:{0{dBT`tެvc.vnwug׵wD1i/ q9\²p]0qZv?gI_X=FJUM*jrnK6?8z7Q5AQV]kMy8/#̨A;TAH{pN*d@3Q5v;dj}—Wk'KwܦקV$}9tt?cWUZdž; AFP1λ{Og0:6~e&X6:/.)嬜g)M&,j'S߫6C48M#Ra9,^N藖@M)YQ1 yuzSֽs,=~o-kٵE%ᶙo;?Gr00l.>..eK (R1Y3fʎ?MٿdC`uȎ"hF )UpCYmwLxNG7̯ZeQW"Ɋ5I,OM+FqAev:P\A(J9YWcE7:IaBg-<,wJ_\`ACI/ -,L CۅKބ.%5Ŕ2:$keC17-[*hʞ\Uo@Ѷ>8 1XK;4Ɔ?PW=NFV"Kk Kڭm yPO% V, o+ʑ̴;<|̾G<U@t*ad1kJ0z;"b\ .Uh ^N 𻨰A7<Ÿ()|CC3 p,(zVhM\h>?kW<\J2z AslLroJhl]*׳X+ekݿfO960"^NK O`~'Ŧ;C `bwwܭAe?&lb{`3k4'<+HWfvݘ4FX`8k$ИZR pX19DV2 =\g0v]ByHb)y7wMe KQe %XAjZm@W'G)>kK+aZ&ͰsZnqxm]#U>F=6E9:-fNb54:0x݊H)/#7&R3s"">y_Zv7(z/CLHy$YT#ɲ'J'}w2+7ß/\n=Oԕ:kvALtܓlEuGf@aoK(|"5 hUT*F??W^Ol^!N1_9 shdK ڋJs\z@"}Y}uZuXH>C\;f(C=gK1uiӬ_lgiV0^KOe=HۣM-^ɏ֩wcKn)$a[#GZ2=bp)lHգT_4p#>m4k$XxVjɋ/*4gJ?-5!\hNFiN$P"6 c{ +x];ߍa|x ⛪Iz{"NQsI~_匣nGJ{׵VOcu^NwGp5V/-Y d6wHsB@JE wBWɜdCơ:6k:lb2xg|tVSR0z<)YQ;"ʆ~Г#_+팟uN.\VCHuAc:)XY3n`ث[ ]::*6n[;(UV_pi BuW"Eo%4LC2+ۛDUS! uʤXt⋚]i XoMseޮe vBtnwLΗM,eԠúΛ_pn醴;$'=9F*LuO\lZgT/0SqO]و&ap\.h60=Dݣ2GDZEx2nn:UevUf~B90lm31ЪRF/vDYĊd9[o5R[d)dj8MFv ( H)H$UfIz Qu{{RI('C1} B\o" 1g)k~`^z_:k쫰1X>*u,Fp2k'hEW&yK yM]$f( jpr"i34nBqﱮn_:>Os4N kX?9 8k?LUڅqI?"i< gmvVO/o4_~:@;Fq4Ύ" gd.t6IѓSjvb=K5RHS2n ~Ѷxm{\mA0nUƝ)‡ލqǘQ4^e(OKk'ӷMc @da;Y+fZ5%ϭu/_z<%ܯ^Y=1TٓNNkf?PrUCb57H+[x1v}ML {D ݐlgD:ʌf@J*-$Bx3F̞z)MomH>MB2DNi;0#~fȤv>}7-;ʢy銒`+F^ wPijX`\D2<,Dx0nז4Kt2{];_jMՖr$G!ŵMEVTRP#8k3 (-qX -u[h+'KNZ.&a)8z (5 wyT݆fhȬfA$hZPMWKh9>>)BWs~o7vWUA}];NU61"'U4.,2];XyZwΥVZ_kQ} 0OLܥ#;PСwy *&ݐ)3 Qa$ U_pIaƃaoiBazУ|Z.R>~dL6JMF_xN2a ֭OV:^4ai.ß\9άTb,$͍[窊p%R둺z@\nS&#ESBFuh*q,2~}xЊ|GꏏŎwL؏r0Eh$ ,%,Cȗ#tm᳊M3  ቩΡ&D"&ͳ |A1C DEDVËVE bu7)=ŪgC3)[>;Ajf94Z '"EE`aD/9,ܑ /hubcqJleϲckrLZ SLl[u[:\S.2vB{lJa( oBfAIN1FJHB T'zOPP vqЯm׵^uFEh_GJAƂ<\n/d>[ _WNޥIc^pE]3;.Mr8 ?H-¸CE뱟#r$)420:|)hT*%xeLRh3jcb ϱu~,UTTTxATbF +w& ۃ4>Oq=suo-A~~CLmSM?`~ӊXQB9C%nDcm'#.$P/aebW mf˘B5}%5;y$$lJMEؔb:!H@Z@l HY*L!5^x8WWcR}"&cոfzub"\1zeI޴u*|EslGf%ˏs_#!AlɳK <9_hWC5FQCC_HK,\ؘ%~L8 UYBLZjwA>ԫLϠv(tԺvN uˤ L@u$!v8}X!_L'ZW~yF8OS}Z`byKЅƋ;i1KWzMSvB8>Ϩ%ӶD*+(fPD_ sVAwBrʴuhxz Z_v\~ؿY4}|wͬH0l*?ФWVo X\)UxB*IgӵrV;P7NLCQ>_R̺E _*7:rW}Ys{s)жX|P^z#\)Dm#B$kߓ\Q4yrzIWݣƻuU-&5 }eCO5?u~4V *fb2V$,.CHy~5M0)hEӔd%{u#.܇kE 5ZҔy!rʊdRAS}/O)zV)KULKȪ\\9#-.2WC Vkۢ~󒣕T+`#$m!pR6I%ģ'8/˶'FM?u}~u'W!|M _Jq3(kFYdyxH3YK'JeY/\+VڲF/s,;ŨDhD$lvHtDNdu@1Ǭ@7IɨC;R XF(ҙUJhÅ suzyͅ:KA+EJK.VyH*h写)~=cи#, 䙠`ShZzH@AjB6SUNHn{ +! QOWT|^I{ LZyFe3-J)R/XZe䩨Ỹ6ﳥǔ]E j'*;q@HD4hQ3b/yх~;-S:G w `%X!o]~m}w0Z,*D(Mm$5[~M˨8H9T0:In|5yPׇP% l(d cGx4j.E{q#i롒S*4.8V<{Ϧ/"/XY16I{tqVVK[N4"~S?{"I$bRXO<|6#ʒ!J*LL.Jq@nxf OK6Q/t9auR E/_>4' ӫQ8m9W d>2ba|CDYM2,F'%q -,7h/Ie)e@1oۆI;³WC ]gtRwZ=:o>ͲXr6pU,- րZ?1{8mVJ˯Z H/-*k ~L1VLmOT6}+?4%Wi!/p 3%h,={WR펐LLk_YdSk@֥|\!BBu& fʠtcJ V":'"BA?B/nƁEПܖXBRwKwURMs-ph-15anp|G}9HE'éN!ʬ,qJԾW0N̞,;W#~QQ1.V2h=Al]LٞYD[ /ʸGSl &H皁mX9$w~Z-=R%jaqz,95>?ɶCjpQy3lMK\Iib2([0蚹16[xzvn;fݭ2- wq%TeJ\i199#~E~PcR: r|)!b(1bN L@ N8v[ !zxF-$*oC3;´&1()d;Rl(Ù@<~vAwOgOI8{'g{bg([/JE9Z=mAdX'& c AǿvǶF4d0!f n?{lªeyX%eCF VF8PL%L\%BnYf5#x5E Q3wOu!a:oVic>?rrOI/ B.Ppa Gx' ~ܟPػe$8H$ECsc;h$Ѧ1^^W#"x,-CctiY|JvE$4?λFC0w%bwJ@gV#fҧ~.PO níVҔp,@7'Z)'l" Zwv۹.Gw,n`զq A$զ('H5="Gv0>G\ogA *@hɽתb*||d5 ۺg>bų A~+4Ba~3|wv7oʷ D.$&%bʴ^rK(8?h󥄱J$ Mh(+brP jPv}btjgXh5A@؍ o`Ft tvQI vSm"BMGLoڊų u0}98gTX- >xk<)6C?ywr!KA }A v(NTdtXI&q(q5Vv߆*Ō `L&c-dC-n= 'kzNf7 <'C> wǏB?'1; 9qA9a (5A[BC.saXTqV$bt3zJ/ '/Yr;|%369'ճ $w%(5An),rguwEk^t"7\c"G**MPDդD@0e ¶dNiVPXɜC$)Pp#bg@+hzrhhC2R=`!j ,03 jb屄wpK 3%7cMI 64ȏNMt٦= Sb߄ YeݶRmO5Pq;1eYM#Ol(-ڟm[ǶFaD"|/aœDO:0xU2 {/2V G aJiHp=X'̣;Ⲿ+aB?"F{ ՈHyMY x>ْMg{sx6Տ.6""Jf6p`)S1S"Q4l+]PLҧCYM?ȢҨuEFdF!U+EX$[AJ1IBZ"i_W=4NJqsy+ü>_k;N`v~'D1~oux7FZ]|woߏ]Ы#iO oܪLt3#j0Zⓠ+)x]dFBntmX}2˙q]k~ٓY#*n;nޯw|{h8}mvf5KCdyᷞޗ-mS X]?~"h[z."JXB6Miwb8I P G/3*( *A7ܢIzc.u4Ί]f)ߴ8+-`ٓ^N%kf4)4[zcֲVuC-E04HRhȞM|? T;}pb?7}ǻ1bDQg03ߕW\(#kĂ{K"l͚B}~[\nOD{&\ #;(AמwaWϙ\h2RqZ*\~|բHċztӀahԽj DNU\-V2n<#qB>~1_,! d;sO. 44:3{mvʚooA8(6._q;l5 [ dZ x]+)lMB$| 2qU?i s4'Wɸ ˠY d"_< k㍲>= a8Fyo]Ocь٧ozjxZfՑ"Ml0[D,q헭ElxvA1u2-1rpufqӦi7Q N5_SF*J)1n$Kd_Odo-N)mP Sس_i/Qӄ&YgAس;6( =m.9ڢk>},] H,A.KLVqʢZQmUv f~=<\B@&!P3c'9( |w5.=a@7jUR)^5~UPX~'cmU:>h{v#1HqIU࠾cO$N;MYLngJKn50tƼC]L3rDt8$#Z,z1L__ i[oP$MK0qӴ$iM#Eӑ3CHZŋ4: ŋBA>:Dh4 CPW qT-\8QnEpķ_ܹNaʒ7{V)ڛ.A!-el#9o?huQf2{AI5ɸtG*@BtpѤ> #$AlȊWoImx2骸g:n`ӈaû ̮PL)G$o,`8ힾO< Tk=cV m1,U\jy+6Z]!3C>+lE]v˶&iA.uZgB(RPyD] J|  uꟛH㶕ʯh{*jqkAn9)hЄ9#ћ$L#3 Y,F#<~1=?xb jf{iyq"?bZ7`Dotgp<6Qm6<"؁h614.{HVعųuU{GXxU x=TXLI*w49Y9Y,-) |:[g%ttZ#`xIv8oFlf =SqP[R߄_ukcXCYq9~AB60Q3f7&OJ:nhl,s-a _D/a/*{E\"L+kT$@ky@ kylFFzQZyEɐNs#lCl[unat SbmN8\K]u}M!D3ju7CuHWYr׀YuPZsڲŌ-@G\F-踬vڅ,WrZlݖNyc>$S0qǣm4ZдaSNxbTq  GlxvϢQGZ}i]mg=#ȺYpH zmLVOy7DՎҘETs1Y׈͏Bv{4BxFnjKEi]"W 5b;}K V1FbC\,< >gt:."?ּ5HIxLд!35Ov>YЃ?VnڼFp_<vq&臱1eݎ#)c^!iX84HQ?1?0zX'S2B ,=ɷ 0S^c c3C@Lj}>`^6F)-JlxnwSC 0\q\C$HB+D,/BC5`x9LE 蓴f{̉͡'b0:O~nEZY;w}8:"{A dFYb+^_luA;T~S$]P:X{Xq_XYƷvCyXE$Cߪ8m1۔5GS&Em'BA%ަȚ$28~{1/ x#)_=q#AeB7y5 F/ffӾWٯ IkbUơFqO kz Ah^24,`POanJ aɑ@8"W/Iڧ7.i^<ߍhR-ER40I94tdCeϵE9SqH+()a K?5B;9MJUXr"%r[jg٢؍~l['9g`61(M! 39 3ҲIRB'N"UlRTIV$:3ZJ62J)KTcG쁖Ba=袵Uϒ'>((ԍ.ݒNRu۞qbŹ X縇+6J0\ՏT0~@[+YBL,+M7q5ReK U#'ڀ1FPaa-͑!0EȆͼƕc]rџMso/adM'/Ӆq5J Zb[cz ^t#AbВb瀛| J"3w2JAHΘqZfEŞ=h848q3 /Ǩm#&OݨN-aiJ&S%~NNq~̌hT{{)'ӈ!2J:0-~l-Z*4J4hy6~#lJ&%]:<4F2Ԡ̦܃T*LpmYQԁ# iY4GU 4Gw>muKL ]|m TDۓ3!UxM=mxUFGUcO0QX"Q%oHg.g0=RFW#vGdfSZ=cX8(D(Zvv}9_)):z 73 $fJkZ綠뷇M`^`k Y8NPKɦKYR (BE $0hѾ+$X*"F* LFg.:^ý͌?gRC`hH!м\l: HAy"   k=R(P<_K K|HEKxâ7EmwXZBm}W<,DX2 hi.\СfJ@ .뒞U˙UZ+]ﱒxVҕB3Xku[R<.Dg1Q3`MH Z 5={1D[Iu֐2t1ï$ .ƨ·ca]ix`~X1N6Ev})K!GWyϤ=71e_g 凤yTӶ'bB4l,H.fђjM+52 ,0`(!>o$g]-)y>3>oEd2ڗ~ϩ TT7CS|,ZD[qxQt,f~>rcϸ@dZt"._wuܾc;7jGc@bh2Uy >زki GWOH 1 d3Gf?y-R=<ǥlx|9366g7vv[6xMٚhW2KF̈́ѹ[˛+}E\mEp33bxnD}E!bo]jWGwet5A+/wM&*kЉ0_W0vӹ۹>FFg&%}Խd;VÛ[^p2+7.hfdvS6[ЍڶRԶ'7x 疓4Q|˿wԦ2N<9T+tI#R4U˄_}$)*VX`R i2pf(l/, Q-OY1n]^t[{;jxlѿ<%AEEk$VVd"\LA,2Zr3xx|UL?i ZnÇPw:D{jS Jf'ؕv7źo " Xi" o5VCtiכ,hFڞ<*f>t3J"VZ봿eF 'Df!%DH&'A|@(,r7X WH';>%L[y &ޠ MEĀӬDM|UʤWm9Sov@PϕP~cIE@}$jV]@3Х yJ.gPd!@汄1[_K#M1 zT,.KӚݗ3~+ԏ.Ձ"Ą?D m>?i7 ĉ5B¥ˬ4350),q9(WԊY k{hbQ?lH~E#J`Z+ wstf;bIZC;:ϥP?b[|;EGx}<܉ɉ EśD)f9UEFwE#Gҭ$6TH"M*%M{ԖKs >RXrL=BCCPb/D~J &A[ ccM]7Fyt'촦ߋg3Wo̅S< ZӖr5§#nXJ#さ?#%0ImXI3_n,HܭMNd(̉e&ɆboVaݢL%x.A..PoP`Bt~JT[)z0Je=*kJ *K8L".ED VF sG }t_h{`E@~u dD00||'6XZ;]Y $wöɧH5v_cI \5D` O3;UCS r{يvVFgo&Ǵ,O&ŷoحBM`׌~i6|x͐\Ve |o|dUb#]¶U0]Hă.Zw%?yvP3zUG}ߠxr6R[rǍ/-9 DyJ<[Rsm~O[ xI`?Ec_QuK?"&a[\TU>L,&QhcMkYeK8K ' zes^(<[0;aARY2mO.".g=2n{9 AZ5@Rd !Ѩ:Q E4^sѵ:c )f)AlX`hF101$Z$!/<.b*vb&isW%jĔu,p&']Z]bLWQEwX˕s0|BQ4`Xa hG}.*BL4 F$D愭o'F>[.6YmGNj~]+;{v=I`xv8m(ݖO~!Jvz2UZ vZ $6>Zʖy%$haދ:#y,t[c%="0@œ^$j AoP#%:>ߗ7{qR~0l>_SpFcptD8 vaFw ,-,Wxgf&5*[ӎk7IZܽU co?5B'xmxJIK=9[?oK㩲-d˄F{h{e;]3HV m+ՈnuwS`TEi".L/r_ bpOo;RO]-V j15¥[K@H)%\!Q:=S2crNgKl@{0wDSDn&nv+ׄ,<{=nO 7uG 83b;AcKavPcDd,aloVwiɶ"TY<*)IͻiaQ_F4ݶipMNQ~mJa+ч(V8UL{f%+evY2I',WInz^#3/s 0 JAWP =.)xd9f(kMK>$k\ɭJ ?t$@#.8#\bT{6iغ04^dOa|~sJ{8V&CS_dfiDv3B5'KEN59 b(R&hŠn;+nq/U1`u1B7)!9`|ͧG!'=ObzW>'#J0EȄ"9zhˡߪy̗( R9P9&1GM@+a{FH-ÇIseoT iRտ)t%|`EA/Q!MJ]n_4 l )٢,;זiRէOTgbtWZpdHڞ̕FiZ{O_>ү)—!YB.~$TG Wg*' >+^i߄( ⲬP=n7ŒTmcjY([<_gi Dv);EkT\05TV@tNS7,ƢCLI!I+*Q=wgmݗǺ䰟!Ib-J?TbHfF PU72oq]9JV ~<Aw$zFaf d[Ek _[%lv@1Vxd9xBN/t[atPTMR cTrhIV2I#t33F Z}y<.,A`L.R#J_"/?ž%r@y#: FKÇ훷5|{Qۋ =4NJKǘGAI[&HQڷǫlͷ< xvAV.ƴ6Q>3"`ƶ(>#KNP5{(; VQ](,wӋDJ' fa{? -d5Ik6K e@#i:ZT^Ϙf3n@)87< n΍P,bcb,'}R 1EVa(#3UDocM{sd5[O!4**zK--Väp 4^(~ֱNq1u^Y6H#c\yJ>)#I{HİJ[!_dl5}suv}b.v TQѸVrٍq[n¼u6C% F6Y"7&P?P2+AOO?Nv_ⶐoэS Ayh:"er.S\VPrmPKEƦ閇 0gY$?52\nʾ{za{ ٶRȶ'I [D"Hͱ<$KI3nQkKD$YY`55kj~Z E~\B`._2`g"0(%c$& >cA& 5L BT݊ӹY9G0)±a%.Αa8DV~Mfߑm|GWc ~$Qp5xg/23Z?B7Za%Jt<^;:do~JVq?lr_l1mg{LOo8ų ݦζVc?'xNc!VRFgX/qKQ_=#S JiS a4D,3YY]b1a  B9 :9l3MUZ4o84== ckBݱql{v#kKiuGXA) 6gbj6ɎZu"xrqZ5b02݄fi(7H=G?Ee> e/~Ϩ Vjzr0b؎blC6e m4!mD1)_а`gJYgo 9mA­l44 Fq 9 54% tW=30r { 7Y 'j'  (TγbSOugmFvD#,h%nEG6kl5b &thfI欽0^M)@GR{6^9 [U8™ЀsK/wWXLb,"Ũ$룤  knHhbclVPVA<.PKQ;yrA7BDo:}xYɶkLMȐQV0ُ: 3_ɼJ?4 cHEH BK9aIC~?FwHyv8# ~4șC!S.KwS̓7XWK**#tq67JjQ%hbs?9sJVs̜+"lIQ|+Z@jNZ$$}LF( _kzsz]r4J܎e?|FN`8%-UhH'ĨUq3\34ъ8v#Z6}G4n nq>1sYvv'FHǦ7tjPC9۵4Aq-ry{6zլ*L4q \s5Jyظ})0{6lڌu{r&PJez~fj%{hL2ZJ.s,5F֖|Me؁c'>ك`1=g*ԕrap*tn7tz,Fǜ|/SA E)|9$'jQ"2\Ui6l#٬q)EeWgn[SܯL {NIqXU  G`e떏 FOlмAગ;|sωFVZM]EU(j#)lD4v)?, 7 ϥ MW\*9<:l+lTՁ UHӑP>H4l,? hDkeM|Rxwb[YF-EحxvA?~#݃jHD& ,/>(yGi[3C '&ac}3F!l=E6&H;HVA>-|XZѦg'`t/b.))lshˢ?[(.Uw?nN5#(qlSs^ SSy<%7Ek%zA-r Zc:]'^kun食|FOn (`6mJRN(9DC<SVkӒLh:̻W8:[W7ۥ"zV͇vC3оcc h+ N1³6QƵ8y]xd ?lA㫐u[o4oP( T-#|0\E֦a32%Kbh:b. #K֍[B?lh`SFWUHv74XB= )N.˵\#Š@zN#Zۃ%&V*KCGL "z;VL%Mat~#eQ0AU,@Ѷ (Ȏo->M 5zTcb"U3s[̀=Fʭ+ ^D.D/zqY@Vi ^E?3\캅(CmYZn_鷎s>G6P06ncR؝wyj3xK> gA *Q4#=(M'sSH$)e^ |<zs핏a@ C͊RV@௧[̑!BߺC,*"9u[ c_HȢPU0=Xyu+:!խtOLanYG -$N2BbQC ɠP --E5WUOpSy%\_Kaϸp8,:# x*Xq3B${$O㝉b,$6E*%G\<]G$+;Jk&A?=w1V"hDvZak~CƬ&atj5{[}#݅!WMWFde?@oV ][o?*1(㓊;gWiSz՟I~4ZgA>gzʹuLӨc<ApłEEE8nufnv1[v.pͶtkSF^n MBXPxtN,CQ}}?@[r1Ay>="4^z FU`97b$QעLMq k r/QIf$ j%E dGz2CM#] U@+Eq~$w@ٰZ[.ExXM·!A %&kw`j?VZ> stream xZ[6~_hlL4ݦ$a2Н0k.^%`Sa,k::;a[/.]\~BVorq=Zk꼺zÏ]u~~ѵ v:W^~y{3|(1# C_~OqAm=@qv <7Ƞ9F5=(lV&F_#1sS]=ܘ}.$:N' mٛAEa|78>qqqq=#juR%TjqnkbDm*\0@$s+\x$ȗ Z9\@ZݙRny-4dz *M#U$3] *w*d-gylW'vSSXF:>N2n8ѽeN\b1md9ݫp2\EY`iKF8ݸVR€\J7yzojG3 5ݻ#!e_˕l>6r'd=4.ntAAZXYS_T#sS1K%AZT눃w5MLMtT.i΢܌4MLE6~&F?..wf(4LvjxWFd71[f "xDk @c\K| 5 <#}B_(/RBR[_f?P {KjldQ(>}m|)ޙox4*lC̫BĝhdE]9lD+lbwÈInY$Peq7lqschoۉ`, #F5ۅ."Yݧm&te8O9/o2ʕ80(Q9Y8Ѩ::u"; <Qɜۂuv[a.@әM];U)G#|B=z@4q73eW2hdFN j'p(L#]^:2Ј 4UUj_'%?k[me^M~!ӿ6ʴ=;݃x#md.۵/bet^^,Rq7猣Yr'loĉbYGn3#v{&7N㕉p=Vq9PkOHzS.zs:Lnf_P&xlXSu K2/睸\z^.YAE endstream endobj 2571 0 obj << /Length 1601 /Filter /FlateDecode >> stream xZKH+ lLO!a74؆-? gd.eWWu} IXzj]"B%k"iT QJX 7a(GU jb޿umuJ'w?ttҶ>)Rnn9 dTv ptS3ycӇ^4v$VK_-E /X!tX"%E "DXQjF0>+Zd]-T̎G!(Ɩ+__[.96Nl萟Axݼ9c/tUۖ~ Kw 6yi):ԷYe}Zg s0v(hK 2>+4 k4@u]#rqn:jo!ҪlZy.l)Ƀ&)N!8:_w1GfA7Z̃_{yW.X{ӳKZAzb18EByQ.1!pvz##uuҤ}=,=0a:66P~CЉ=#eP43/2(t;+|OigXзq ?l4\l&E^P EW~w`Jxx!EXy_LyFk'p&%8d*Py%widFo#ɊWirvl%׾ endstream endobj 2576 0 obj << /Length 1415 /Filter /FlateDecode >> stream xZSH|JNg G)Gn1 dtWs4n"*1AY5_jtx#F,{u dХV3'> stream xZ_sH ϧW?{IޥM;I.Fy=bBoOMh@&3ر%J+$kwޟuK#نAXT(3H7 A#aQ@i7.n[mFͦZmaER>yqsqefß73yǩf#ۤf" nS 1fM`h/M )rcL-KK#=d$$ý$mt$o?IO[@`v羷>aW\NsAvLSPs+ylNT d&xWii 78g$a,2!)UBH93jsNޕNN_#6A$ S7AyОS!&UcQmA:v$7j 삢0}ӑ) s9@%=04R eG8K:QG\:E쳚'8ȶlM$#+h&h$Wk U+UdSr\hSeu,' x[lSYA%UN>}O梴tQUMݸU@ :Swv @#m-蓈1PՔ;pZUAb˙ U SBȳ(ai=) mb\%M Yw,qC8S:s솭d#;ƭuwmeR^JnQXgWgA=k'ĠȠhRu٢]|8au-rG7IWARNߩ=ҪL>Ӈ:-\gq7EU1Cmeu} wtD3WJشkifl{o{te_h o~5l,ԓ9/p%B x΢1?c8FZU [},#@Vca*1s; N^%Cρk豠1=>Hy#_h~Zoy>YSKUX38aS$բw(gd";IΜcN&7TG~8 JXE~^{75t(LpΥowVT*gHICרmxXL| d#5@~& Fs䎲JGU?/29'v/6G/]!/Ǎӧw#j오⎾K ʾu6@/]ڞ_em+uJ"~ ݬ5:Jo6gnq8qcB柶oRXoxQMU}m:*+k <kr${ˮh@A5jZ2}]VȰrImSo2ζ>_Lw>oԁ Lp@LƄ2@QrHtcgV?ƒquM_VHKX3o6]vF f^*}'DHHT=l2z; endstream endobj 2591 0 obj << /Length 1754 /Filter /FlateDecode >> stream xXmo6_! D _%jCkvuq7 >(6c V~w<ʖS5Nx/ϽQ"7GOG'g,7FF(Q[&UMoaBI">?$Jf_OqƗ/{=}zOߟM,_~xFt[oL yB:bE.~2Y$ZLj $gu@ ,aarr+lO$<>u߹-O}W'qr]VUv(kGŗAA!M(YP9vDٓ7W.ӢO;8 hȇaQJBON&9 a2iP+L10%ҹ`a:zwTg,V,N.V*^_@(UU:MYs\lH e_L!Ey.fa%t&J=w %iRvISt*4K׸{a8N767ُ 2`gVT3˅ Lh'z=G:\Ae}x="zIaq,d{CNUto7 t_u*8XhUsG{]7R3_B~8Dn9-}T{plVԁ[7Vʬכzn^D>rq>j{V2bZw.;}3:ǫg7rF-ܳﳒl0Zr3CC#2DqӺ9䕛 C3iW F3{Bv[$H"fsMl&ei hX@jOb"9$cƆ!3Y0mMϮA/<߭;Ib*|g>[}BBr4>6\jxzH ա7%Pk -hA;5m^799*RIpO=UQӼ0LrifxU 4F rN[,e|LWcHQuOE8%e$ei~93f;rv/kGQ6ck̾1ƌI[w+ #3`dcFӨYtYfJjL?Yaf ˻Lkgc@: Cgrt>(ƁX}xz>Xs#fkAyXY[tԑXC!fn?grᦅ rpտlo. endstream endobj 2586 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 599.999 599.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2597 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP endstream endobj 2585 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Hex-Sphere.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2598 0 R /BBox [0 0 600 600] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2599 0 R >>>> /Length 99648 /Filter /FlateDecode >> stream xܽM#;9U nhԼb %ɚx:{oF# z j) ` PQ3?~ǿz#8?k߷ag0 ƨ|}T[c0D?ͳmwc-TڇG#tmΝ6_ f{|>82#S+-93_{YqN-˯qjѭ^>uk4ަ_֡zK{&:,CkaTz aIƒfs2etH{V fӚ>k12uC9Ymـ8^c"^z܌V=qwӵ|D9}Է¸=Hܧ^Tl,K^ V2$oAhqjzE28AۜQᐧjNo眠 [IkY,x} j͖e9ID@8+'4gj2? eI:\I: OC̟5m^ü=qdwg:=Qtk t۰q?GYg;%av3T3**ˌ2]ɈQtDAF?Ɵi5 i5nEc[aK=6fGׅT>I6mk'AmwF.MlHʼߺ6DDmggc,<戉BSqe)S b(JgD$CUfUvy$qhIh0dsp f!J軋>#q kCP[~- [9F/MtKrIZv[65/<4 ױuʠhT=ܭ}bj zH?mH%9=p},ݧgx |װ-g3F+wg%GǚF&\rq=VD?NF8ōxg;ꅤ6#}l tgO1:N FN$R@IQ8}<~I]jF{HN`^YЀJ_n˯i?EXk_C&,z`ڻc&u:(ZgJ?_o"<.!qϘ~w;*Îz]Ch',&iSs*Y̪r ziԩÖ)ɨ1*K+4wi[t⋈^^?azv"o-)i6!vpj5 tC :RnJsO1M4[iQ1 Y,YHFܣ/a[$B =? 6,FiQn2 =1=1.h8a[ǦķlqTKӰ)`xGEuorj1LGL'{V6a'v$܎t2F<֭!'NCO!6) H qQ_63.æ6DԆVԷvY}\mf!m?G2!ӜhrT/4-} 6vV'\lص mNө -}麊ǻC4bX⾥uO+j"D5>[7EL-?ytnڀf6@>uVgz?ܯKAyli}_sȖԟhٳG0]>qz :L|u ``-EKFN3Ƣ|Evؒ2EӗQo S򗬎wC G>=>u _x3"i2&R],Magw} !-άP@Nɼhdl3 j3Դ"򀔋`Vr^d/q]Kv@]ƫḡM51-Rϒ0TEv}ِr`r]a%9I91^ [Z u^&QCУ2$bH诽rQ4wZe`;ZZzSL-NGN/MmuuZV=Ii@bJ5>v/q '@ݪPphöIhntfS⤴)cJBقh#JlݕUf( [Zu!\Âq'gt$on"b&QSoxiso{OR1ߩjd3Ps1~. nЧ?\RMl?js58l%Kg^;9 ٧Ov|;ݒrs1i(b[qϪs;sȃ둍0JȞ‰ M#[J: p"iSL}Qn<.bպ=,cE=֘46昋JaD vBA#TȫU; YE%\Q%ƮA7 27a#4F!;ieIDdz?O4:aE1 ZZF+Uج=btX4d["qwq8X&ԝR}[g̬+? &߼/T;R 3`i)>q(R. _loɉλ*; F @'KOrͤexK23FPP@A"ጳ01} AZr6ҝ YFnw ${t!`h&ݧnW=aZ;%5RrϘa];3aK>\!i,WƯ(E@c &?tUmIɒa[K>'ATYOsp+"le73 ǖi9i<.:>SF5":x05V9L&ųN=u9lx"}4p nIQMF_6 > }2e}v5Xg.$Sn3 <5OkUk^nMCwHȂ#r,=TdCF,*&0ß9U ܀:ї"1APOSQ<ވ!SH$,>^"24SQNs 35̑(&I V۫HpB2n^OdXi qߵ"oӸ%1Sv9mqr0c͎ d j8λ-'nlNm)9B5naܘ0V4V}v岖A&|z%/jiqPP?@@RR3>j4kOwm$7^nٗ\헜uh`<ށ՟rj;0L]99k1V"Qأ]!z/҆IM<#it\ +HgN53Y]V1oy18{> )+j2:)O؊䀈5rޘhg1m+F64+ /#FZ"!I?`!rF6" `$Y?рzPL^o4{*\x-vM|'Xa-&FF2]S\7(G2P+,*N1#>9 GY({bɄn s4 _ص\&W ̣XF ʿT$1E*JAL@ ܎˧I$Q9UaJP)+t.=$dN졏UGL99uqc^A>}*J54ᯋ"&xo=.tͶ8&uNQw<peq*eV\I`sClZKǏtt?k8 08˲+ RA5O5!L#vuw9x+v{̎kIԸd;յo w@Gan{qu Rf(dJb&85DQ:iLMD@-##0^* /].2e|]o~#ݳBCBو xVrǼeBk)b@?we<Ԉ:F`{b`̖'m /1`0߄\A}l3Jb($ L.h2lSr6Hp1Au\EF^Ais E H0و*h8Џ^pJ=e*2ASnd.Xh ZgxE=4lkyRˮ!>},Tj3j@jЦи@9st yʨ}[+DX/?g:܏%8Zi[ٝ+DFZhrNK6Vc@OxThX IqmN]ןuQ, 4Kl]δO6?z4D:.AatNWssOڳ|ߟH[Xy: _B% i#8% -ד˄C>xog7Im#-˄fASt,ge$YE`@$jzkDL-.ԁ"73+(LΥ bh? 14BOa|"V3Wj`I$z_ m,vWm @X #K\-r57lSmzMBق5t',Ӡ1ES?efI3Omq'kb(ɟ2P^Aw^PPÜQu.#MF?|-E6„6Wo}2?ގy7Lp N%Jt6N:9OI5G2 4p (HY٨gܓv؏`qLs&=D_(~T8<#J` XC P%z^Ɵ^^PVl 46~})[d;wiN}QWAGh!D\실۔o|T#M0tjx$ u;c h=t/*YRؘB5Jt!3Ko7M"=t5? ƮaKdLq&m,fNV^ĩVMajՎ:i%5qD+ʽؚ~ʨF PYo"բ~;1uwP" :xBhvhs~9+ Q>C %IЦr.f~\"+jє-}ouwW5zIYjAvߦ `YOA5Q`bu$Ee1&7hi$7܍* WuF^ky.yfQ,adqx6"n:iEKvwYAU:+('&T󩘜#)"*k F%coie3.kl6pMeYZ'(pu:-ÚvD?YDaї}?gK6z%2<}8P*ܤ5dTE c'YLs{7\{>}}]aKT=7N6%mܧOA]Xerܞ j$51L"GK?ͲXɽjzE]MuNJGm/aj>):>8c;eGu:ĞZ@[NHt&HSe,sxi$dF6 `2!4 ػ"Mώ!zFmԲ0ad 2îIeF3 TKXxQ91?B+(A"anXպ(קO7<e \v4('&` <8c(yb]E&4(푮ՔTJ;!*w8iu*v6mO͈01:ܪͭȐ@:VjLn J PjץV [O͈>uN(u"%(i{Ҁ<2jZ ESW"v$V灍M< wPޗ円e/Dm_:MnwVE&__iZ}4l8<#@'Lď,lRY64,P/2MIpi;@^0T0$Hxl%B$UO/$uoO_ȝ2)l_KJ~=ѩ$$Q#Nam!}µR8غ(MfwT"/0T"0'xO&Tԝ$%F0>Z$.p?OahI)Wk3Q@} A:.G# 2 ,}CD6]B 8tQ!H 걥1EVQm rY6F7{͚Ґoo98CMHr;&? KwZ|Jضt>q t? 3=1{jH3Ne?f0"Rp?Ɓ[-qMs9Q?93ͽFKR@6N<.' 5X;Y窱dDC|I#JS Iݧme D So? YX+=#2 LaXڱ$b!dxywt0)\jiF> %ǩ$ DwF 8oj фQf]0ѩWq_3&Guy~1%rj,phs'> _>pYWng?Ip&7a,2Z>ܛ4S_7iA3fS4T0ojBha/&Qe_tE됾: q k]sl`β4Jt5QΡ1*f"){gk)tSF5}}aY99L .j)r}d~micp}P0D9;j>ug~._}ZLĪXCFĽ&C`WM*]5gi?IoE] @M\5uI+Ͼm6O=:,4g-f<|e/z/4߿ɩ/&1ʃ!0ZqQ;zv/͍k:O(mHJSxS)1UMe3Y0 7ymedLIW^p=[Ф/r\dq%_'K=/iC'nO s3 PYDf u1Ա Wlz9 au ;AZ+R}l$L#Ӌ ͈yzI8x9aM:\QsmNGbɹ2,^sP[$L= 61wi0jc26KMPNbbh_F8;=ed #0CX}ZDH{G@.S]C'&FlDO^lI5>ֈەPvM2﫷lf h>[2Fؘ?ܘTxK&f!^p>rH4. {$߃k~wF4b>*m7:.zP# ֣4{Az\ZJ@ ᮄ .sTcHa}w03 42iJQ|IF@B.—%~J yLJ9t>-1%C#yI0^JNьK~/7FcDٷuq>u-lna/R-L#`1U$CstH6+5_4R={V& qR=K J)Z(>up>CȥsToP:EwbSqjuwI\~\c<$.QPc(cA0f}|$J;0dkѧoȗ9 %MDMTFx<\'y6[W, o2%BT#qc %|$Y1&)8$伌ʙYC- 2j 0̘ \eT5RdY'H9nc(5"}3F6 0t"Ns٧iVrlKa}cr-o!j |=/Rn"u'a6$GhD3BhF)"M3C_3`A$6t-v3ʹ@0X3i=[EԩR6swz,wQ tB8D8}+6E@C?BN2U+3qۧ+݃% C#hJPaJ?C\ˍm [3 N檛C[(Ӡ/E-[ Is^ΎѦ(:c^:6?-ր\̌< 397:y_59t/Iib0ߝcI>}9 )U ߦM2iXELksg~g /؁g62 mn?\,phWT **{S(Q̅;$]pbG~=W Xm)-fKis3X4|n7(Ť3k)T  ?e%RP3|[ \N ysɥeY5u3P,L'w|?a.o+'q.`>epƄY]r48i x-T#0tT$0skj~)oc5/D,XHo@s5^l>eT# pݩdG'yG$SF5R̀:G7txlEm̙ -Q>u^9\.Ï p@&\vDrd]024dx!F4{ (`/ u&-GKL;+| N*4"}8b<Y41?CJza ׽0izx\!3XxWE,jK$ xɨ2]1\F0kjrEzMt-. O$oro?c9Ci}-ӷqY_-T~"L ܂.X+!jQh$~>ǘ9ޡ1 ?|N`F6D]rs'!쎢㥉r6}R Z X14^֧Da@+'Ն٪qЦQ6u/XiSz-)8~Jw7XF+' !uCn}bd7C9X3.6 &K9da'TpƘ7iz$FJF&OF@a*^6Vj 7;@X!Yx`qvaX0ݝsfh^"%CaБQ;s)}&EzO¤IMꁾ &0=CFm/'FQ.UW0h; f=^#!Gg4}0FJD:gj@B.{&ECߦUd!xv1(DMBcKnxSJhtџ!dgM"،Q9vv2 P@Q9-]I|Ќhfǽv?j[,lhSo昡r@Qz=KKÖ{ԳgMOix6Knx8;ƀ`c@0:|/,U[T^!@C#8-0Es}niā240b˃n OꩵZfLjAMDBaI!j/iĚDʵQIoML{;U}Ї Eic]&&ufA,_[-;LN׈vR;YS9Iad#f Rq&2n{RO@(긂B"s͆qOCQj.qXRa@{:&2iyK:gA;lYFWXk% F#?\`p;PAC&w%vVn/{Qf; u,Tpj`C|= \ӨySeuH_o26 j@9u~j:njbZj]zS=Ft9%"$|M1]dG"`y"z4P6 ҁ}FW 0EiX/[uXMj166Z"Q&t@d'rx]uϏz0埨΀.Iyl2 *Nq;cU9֪F6 b< ܚ(>}Aګ5KDKV  1HKbh63q*mel<4e6eIKb0]UQwFu /0ґ";`䞁,Mb^},lx `[EsYXa>7p:*fߚ3`\̌Il~90m}푶G}j!zT-iϐ]6.KjKsxj*6v߲4)_ֿAP bmǝk0l39q]qmcxrBEguuW ЧfyE-BzFbf JʳШd.-T)NB"Q:I zǣ,sdzrըq=Fǧ,L֚#M)Z>P2d0|F^jZ50}RF8KiJ"t++P#'d<[l:ڨBB)VT5!TEpfѽtxs_M@*(xAqr<x?"B38A?i<mw5M OTk̀#UiB@Q>08Kc ^DBBԬ&mL{*\zC )$=]R}Kb}O%imtIG}giǦDI%cH 3P__ֱ$" Z^R__Vt]4td!c:pщ7MՃ,wa Xt] ueEF%H>iՊ1]DԲ1ցo!:cz"Zt2"/U. ڣ)mȶ&!\ElRֆz۲6vdt26R`I}| Р>G6@D`d&cfö8i[7XU[ff[ 3N cH]4^2 mgF=}Ĝј$+\uf*2@nN?"(e{ZJH0m> thXl@ (yf&vSPk;f@tBRaRaKTAlP\`6\:^Ԋb(fDic@ׂD[:\LqkdMA2"v5mL(^ⴒpNDd94~O.~c]"&# 0;2y9̶oÁzd# fiobgUw$sc-r}(|W_1fst 5f}@IiSdx,u&;JHNwA=JVaksjo5qYUJxHMj>_.TPzBQ=GS3 )2Cmp}[R'3b  u ]6򊒈-W,t^]ub,wQ Qg5':ffL\R\!psadvfQ  z@g4匠b흌75o&3Pt'v|L9twm[n[tj$BƺO B4dX>u[?F)G4պ} 1Eflyh)]TTD(WS˝Ǔǡa 8H>E~ݫVԮ L ELeZM5^N&mLQu.c>u%KI-:.~ LkO k`8\MSI^Y}JG[5TDfp6;`]N |Y0+PJ qrY! I@~"ƂrjX؂9zd]#|nh2p2q[>jv4WjtfEa܉ӟL829=8RCfr]_ָGD+ Fӳ9C@xeMՙc/0Z2^FOyæ5]R)(wsGO)بYSv*j`5]d}9 δ[LbD](]H$rh6YC\]g*_d՜QZTVـ(h_jYrqC1MGki^ 1JO@2MsyK֘\D⒞2^iM=W;<ҪK7iZa>u\ I HUA=eTӺSURǒ[p҄Vt] j:1e=4")\@W iML37nC~mߠ.$? aփ\aܖrW(F6 ` 7y4XA|aڀde* 0MTCМu;.*%|7X H p#5!uh(ܘ.`S@1ؘ70vcظ1i"V 'DLXhv `Z/Ҹʈ^a$鮟L, 8 '5ǢFcZ;Xl# ֙g9a#=@񳧾^d)3ep?Pk)<$FFKk" !.*juUIGHU }Bm:5Dz=>:K3#|Pݍu5 ތ3x3thXv=&1kuʲf 1 zF6 U`[w4Al 85ukN>g(qdd*<*K/`` F3aRCuCöֵA@>}zW(X!#4 :s2'eؓt:Zt#" )eSZ?V_u:x KL 3h]J#]m @#o᳾`ˍ} ;3N a N^! k\ 4XNh:H/,T|Ӟ-q;b/z.XM8FTS&歪nI*7uS"Y6UP/-F6:'S;19>TV`*V<~tk2Ƒ^^Mb2QC^J+ s- mdY -H~7!|uH^ٳma 1XW~11f܏֨5"؆S]REou(XNnY$l+3:G >u[Ym^'_ɝtʹMjv`#8^/bݳ^BʨFPUa&-qKfA0~ )Z}NZBlm ESF5:.|ٜltlÕ"92iAc'" I\|Z<}nT-Xo09acj-i/s ̀;|ˇ|X;U8M}S1A9o4%}ۛ}FDF6` sx ?ʷs_XzR?B>A VFC40Cf+>QC =hP!\MUZ Z!4I—IRF(3V6o<2acȯ1 |`Vp^^(sI0 F6P lHqW-IΘyyM?g#|mU#@0E8^B>͆A6^UfLewK?2T3rrxu]DW$g_Is:@w5s!s豘PN^aThd3Ћpr0S`):0Vo͓4.Wu@0OhV ؔQc@*| UlQNϱQ7TScSVd +g@iSjG+AE x3 1UKD=;[[?+]rq X-Go,*I7yQ x틐3r_eݣH' OG Y!1#x#-d } } +@06yPۆ{k6dxe8%8Q>GSMmk^9kg33q+=f!c&s9 t{UI wm4Bi uz|z  W:&X2S=/*cKY!۫;TYXd4e_u1&M<3`O|D{ҩ1bD i|nモxh$YiJ׵IW"\d٠ۏ\~m mF;qnHNvpoڥn^o;@˱01&'*-X%A*zoTOޕ|^ mGGzd@+a:xPǰnT┞DPG΋2[h6Zim1 3wƔsEQL³Sj&2Qlߐ鱈0Sؤ\K,_{!EO*4+Ok]z`rcE+',O֟-T%ډoll~ G1I fuQȋW:xQ#qc%k0=!ũJةjVGtnwXެG6hU>gsuoN#>)Z(>u\nДf0⍟2Jq[j&e>,ŀSFy43(㾮\uPWʨjP Lq sQ\:jOiSUn*P;gb:S6Z!dl*cy1b`$dO.?ir jؘMNm |*FC_08u, JvK0&ʄQѳ) 1Ĭ2r &H.S dZvnMuѮLSCkNk5g܌%2dA5lDrF%ҜAI1C$!;*U{^MYH-9ME7@uƀ:|̋nGe}T@_tn?Ƌ AA:5gzd_&eõ QmZڶ5J #퇍~azBȏ;5Ko`ʬ" e 6Ū7 )@ư5F3"ϓ5r-ф\R W6%8ZBn; @t6:%$}FFSj0l0h tiei_e[ǂnd; ]hIde3$(#P$h1QdEP__.*̊ӹ(2fdlZ ̥iV&_dve󙂪Z\95ioݺ. f|q>SfO%K\afP Ә{:zd7 f@4ױ=4.nP_96eʛ̧I0NbO ,!5h.Ft |.A5 `Wپr4[㔈uT!>~-RrB=VvzV@a'3yS:V zu#M\ZDr3xL;nl䌧{->zGH;ibqJR=6qL=eTVY.yq*)x,@/gՑ&}ވg{A-[6- 䝌 8>{\Ncdͽத샻6%n\g!.)$kcIpe+Uc;▖eZ0oOAJE)9 v)R\&+o=l3PL+jܧLCd%17"Dn){C^?K ݊e wά250z}0 gQlrM rȃwM{(TH 8H0r4Pfb%mp*LvbĦXj;˙ٶȰ EBOgf(mhVA`CIS}L$YWI:D鑣lM2$4"fô! І|KӘ)S7XLmk oj hǍ{1'^ ߤ(Hӧ\,PRaXl4n"O515%5Ơ]ԁ 4 biܤ@n8%"E°1dZ.Qx:T@&Ǝn(eyw[2ܯ2j@fw ` ٱ#q0,6=V*kDk'ݛi8˗ #L0 h+'2eOY5u2PlHHO'm2yS ';kiAmOՂ w7Ϋ2q7I~ITX\!O]ȗ"袚Ċ$aUUWG0T(TY 9Zm*&pH 2ke/`t/߂U"gHqAH ֬D$ 5v(ig6M\fN9{ LmrU#`Zqfh*mM Yu/*fJT˪z6 7uCu3uTƄ2JFժSQmKhS!єm=/riI!aHA0@nmnK!t4ճ Ğ*LJ#N'tٔR;%Gz0 {Z' 8fzZK2 ;6YmjzKh=ݼI^PY0"UkcGE:WJ% cgE:VyA\UH3>hC P ^rߗI!-B! X}JX1Ƅ$CLEZ4l|f:}0B∁a5ǜK.Q\kՍYιhS. #b{-[ ל#,VSOڷGM飊ι=؝ZBH 톸nX2vuE (k\53Ƶ1ԍ9opF ij/v5mc\l K%7Co;;Gb/8)a6ZN73I08rDl'2b4A]F8`^0am.jmliu_S4RS!bD5a \joTquW$rK.7\*ԭB1}X@M^ժ[1&-:Rqqo^lQ f5ǚk.A6ͬOk7ؒ-p;A'mztWPw@G&͡0?)b3F(X2SP]B5vI %M2=|J&M5Ob{&0ޗFTt֨XtqJJOѴ:y ښ \7Cz.fR@GX*Hǖ'4(ԈN&t^8G6`` ~v"x,yKߍ.Q N_#;H*491FB65ǏXiޒ[>)MUTb֫@ܪpDWSF*q]Ag\,lAn=eTdM.z\i۱iA2>mZlr.WSF5_(Vϭރ4J|ʨV{:-=*m6gm*QOmMPҜ39`8;;1-`TaDt2,غɫ -b;ր>c|]8 9#kd5&Un6qÍ$ pĴeR!5AU6}VJX1+.3pm3T€)h`xG]ȿx bYEN\Q&$]Te ,'S`,'5itf"#e;f6uDI&:?vRF=ѳ?D;^d2ί0>m jDd$oY^VDf󟰋@?QPvQٝP\ḿ(iq 2 wO|P!} g n4mIz%3PV5 V j΢\Y`SGkZ{/OF̙۟2E{lU䠇^>1ojDh>lЦWX [>mlh^5`TKSGrɔqf(EOa}j鑙(6IVq -h*| Z c6Pwj ̀kޘar{aͱĝI(.|b5k^.}xWXDwYs5>];JcN%:.9[XV@-[lTKhME a01֭2XccぇuVC2L8){evZ [16m~tsctkXD NJ4֠\B3;r kAQX=?5|jdR f _mS6a+.]^z$ (\ BtE/aܔ47I->&scZ_ U=pa*lॵIt j-Eo/4‰ OJ8"dY jE%-ХI֢ZDEL=Ok~Gl#PEQ~;Փkhgsi׳<ܗuq0)'3XH1t_ap>N2(Rdk _MH|1а_V4<*uA5 rsHm4y-+(Ӽ9i4&/s8S{Zr&ǰu.&{uj>0 %))H<^xkLCBcZd5n $ }=c@aI {% uOܵw5Pg3vIy~9M#5 }ڼD5F-S/MqT  oI >V .m';o9](G3jӦ-2z%mKfI[ti>_G1՝AocL$j1Kb^y=GMLf98Tt3&.#+B+\ڻOI^Mq 18RA7Y%nsRnšVF6 ` Dr{i}%jwS@Uw9@ YMV  " Pݤ P݄Yٟ\U"[ŔԤE'eAfkL6;b&k S/&fH3 "zYp!!n]8( =ؚ'@脄2/*Jm{!ݠ^1Q巁Rh=҃ Xiq5jA&~P(]Քzf AtB98⻄ (TyrP=k8Te^k.. }ĩ+GzTi'N#{̋&|qh^$Ћ,}4fWBOރ+1A —  ft2*N)\EٵoƓ^YHy"3`y11̹$W5W;FCu0zpdݾS4']@(ZfY{! LYvvInE4o9hhy^`zm#ڇEf1-#;E-[b  ODH!SRH1ԥYR\a!7 H#|VX@6jl.iT 4+/7;gՒ_(ݧ[~KTnNfЛ]_PǦ͆LO̩epR@( ] kؔL%0,[a[bv}dIXy yUd \iĜf=R4a#=Lvrz5rsxQ:HC6t ->uZuՕCQE52 5*c@[ʁI+,9xIOը>.`AnCN W@Q\2hW\Q9\Nf{F9L"um;I2ܲ^ W,mjd۟>bDZSz]ŀ^Q?~^IWOeWYXP+^ǭ`{W0T\0b#;u)P7<+mqc-8&yR z132?%ͧjt<iaK-X^0Wt}K\ OܚO60XbwۤaY(wOVLcx4@'ށƲOmPH2p}Zq5jcXel&|fQm-,fZRbqZ,E֨ UK e>GSp'0a``i lE l/c"ԛCTLJ)dM'o{F9)2)ō%Z/deDt+F6p`Zt21\LG˸7cQaU#}Z0Mm*: tnFi$b'3Xv2Nlwrd10Iq2BÜ fyws'3PF:?CA0 ItH L&=J(7V,,shu!Tr S}y*cż-R@͡SU.)|Y;ߒJ'I03Ъ/F #3KZ`+ 9-)[O~F\_Gנa'}mO_|_'!74B1K fq$^Eda:c8c /ÎB@0#/Fbx)|P>"Pw.HqBf\e650̑qKt_%h_u 3X@Q/"K/qӨІwL Lmt^AFS’42_,pbkDm9B5J`NU@!ήG6`ZsJ)Fi,:XEw_>5o{}~=i1ڥu4;_qmtMGMl,"Am=PBVUp| As)MagjkH➈=zqS0ez_ 5*1kL+}O/f'WhaN(_ ,٘,rm\)i:-a5yC= SGNqhk6l1:.T2_u_#Mk6a?ݻӻoBFtLJOՏ*1EbqX$%M]J >d@_>Er3/*Ro_Z2-fN2'#Wbo nB,[6m`nF)π/. jн7z$04:qo.Uo, L]q6#윂M=7Dſ)顜 D*ct^b7Fuے$|b`~cwwBb-ʉtz~~ʨF#@LR՘$=Y0琉ju(JAi>#٭Ie< M 8 ͞SZLr@vED?eڰsթ:*5 ψ4|t%mgV0fkzƌ4afA*&ی UE* j@4(z۝\پͬjd 0094ԍ-Kd0L)ʟI0: oPjڵF8?m^]+QQb(?HFȞԵŃt)GSUkь%3֒)3$Ɂ (+.T0{ܴζ_b^KBkG7|a닾nWmNB 3P95(0*{%ɀQi݌!]1t%̫Gz+V.}Ρ~6AB9*$m8FqK!mkn@X)8Ubd2k@GUWT >ml Ϟ)S3I}1H?.ihuDٚaun[(O2K9F#F B O4*pPش{IQ\ M$0=c~-i9 "P,ЇCTK5@N OxkP9_?(F 0PQ?WU1?"E:Mo}# >ܔ ",B)umKC0`50G|"d(% 5*2;YyH)_D^@$8_Jӧm61{ d g˿qkS#VSVN0Pnc[d2 vDV ~iպ=ѿ% `aGM%`,{ļ99\i;)O2&=?^GpS[}VIKƚh+N7iߥX mƼTe_Î/SY h}f8C 0+3 zg}]Ӧ 8}ʨP u5P:Uu U;E9jz-Y/hp6à twmV[]6x^he^v5"pyt0rA83)E4YNI0LkB/äG6j$ %/ v8tE&=i@ݢw8"ZZxdNm@xX{obg!9'QF r4NmDmNn`P`6}#Y&Mމdk_ yhz/na ĩFKN iN(?}&'{kr[V 9w |7#җdj|ۣH=}ʨVK.qBp CZ2?tD f)>qCP/i[m`8հG75̚4?ܦ=8aTQ?ރEQhix Oܫ"I"C[ ߘM0P7 =UF %{)M3@mYLjCVI-Fp0:U reKeKj02)3֭֭9'ZD'Zbs<G6W3*gd.zk8foA?>eTlPCmp9qJ>)AdSLO*-g (cW+uvprAF<%K$x֗@W^GZ|Ӕ;ෙ=~F$04NOcW q8SaV})dpvÂsRxNf@+sLl{Suo^*3`Et}tRH;Tc3H 3}@z44~eN;{h~O`M?-5iuTN~7;6-`Wjlh!XsI~k8ެ3ŻrϽ1(EoT}HDMc֒mASFN/:bQЂ3y#}:uGӂ0a1aӺu?nL7 O|tudL@h2®rT, zpp;?HD@dz)J_q݊|Y@H:yv=.GUT6!-*|W["k做?T O~R7.Oh2#bmW"f5w1PA) ƪP}=l)3P9Bk`rmBfX|l),I둍 rZ,,Ǽ﷼rT4̓urF'~C-Bwٜ$xo_@vYx tWN-Ē`XmcI(>t">\.qYF ,/8pX{yOr`͗b'uZ✊{kjh(EaL#ڰ6* `Ca^o[lfQ4ʹp3NbZ՛bCVښsLTg8Zq9{^E2nH%&3PntbkZ []ɺHnԏ$|IEh.ۙӖ)Ӕ ~;Lzdf^_rvlx'2q =uj%!>Nل))*5]ҴmmrKnvI*)`@BolB v)|)gi*?redV?N8OB Mh9#TMOliGE =QP\P)tO]:4V=š3 +rf-o\iM2&U53PTOjRi'i 4 z$HH!&)&%U"jm%hbd\荹5Imc*q \G)nV!-M-mŃ $`?E ȡ{bꖠfh0=H=WюάHs5%|D+𰫪Sg/jBIM@h"]7 c/z31Q34ħBQd^Tzoc*m Xe^uaTy#ԪpyKZbؘGf]U_SK l j@@N⅗FQ!|4JMZfZL^4}oڨY^?E42|š+4cͿ|"# OTtL=#3вk/9! )xS@ִtn#qF7- 'm*6ǨmP7ZW`HOnwEŚ[!.[g Ph)|vFޖ!@v0o }[cNi%5pr"`YR<G6^O4:Q)ۈYwdq=i>q ?=^ReRm1:ދ,JCX! tWU;vUVGK vﺋl0AarawJ3xn]}GH=yd>X#ԋ<@bWC4EϢh^0aieK v_ym&E`>LjJ+3|Yq΀XKo^a|#e0-8ɮqj&]@}dc>H Ξ0A]6[x 5.ŬZM܁RU&-|/Ҥ鮟$:H+*Hky0.'TmÔ+%8n #hV*㊘{ʨP4ӦeW9YnE.(;9Bם֋ ɔ "~$y]vfla"{0=^kB4hn%oxO>eT1$ ne )<*Ou0YaNc_Sy4+[k%|$/zo8ƃwqg&$[g~%1@^2(aoHlm,Ա>j/M ,mҜ0C-8U3Z"̔70Sg|\2JsoI~^xb@;Z8@Mbp?Pa*L _;Ͷ tݟ JN&MJԞU(b{D@#%-(5+ xh!$NG8d2aH6A ɈX Y^A63uX>Zd,MS]el{d"R*İ兌9<cG6*_ >,s)']{ߟ4QdSF5FuZ\҉D:26{#w ڮyLبtzC1\cBO ~诎ͩ[ׄ`})' %*Р:Ak `6.V읪hi +  +G`,MflgDX"`ס;U%` 6k OVP<mwЦƘYz>mlSd6;R|'L1c&z/j}>FISj|L>eTP/uO^q5i8'ҥkZZG՚=Ak2jb5s4@kS/ BLt@O6;$lE1{śo/KY}>Zx ;ipMCYn[ȿJ·_lԒ'$3aEVZG\};j|2{->YO{yX A tw>DCE΂d5 a馬-gs07J0وA!8_Zh0oJ^Ȃh\r6 mX u,jSe;@_r35{;(|`@>u nu?{ԾXӟjy_j&U賹Gy4H >5 C&(E$M/#m浪_{MMC })'$<怞߾E(m3@lf0;1@ 9{e _1oyؒ]%J[ᓇ^l- yfm-c<U4|W Xt#o&4AZ@ E?bqCBASS:-a{lmm۲*n(SSP/O@JK"Fѵc28A 0?cj QWR3_~Z^>bT90#_ӥ)&Q+114n"1*ve]t}ĨVX2S+P5SK.6g!_*HZX,=y1-(Ihuľ؇S҆ڊʃlcXbe5"9N5ę&J `Wفuݯv߱;W+Fabl5e(k_ Tx BN2^NznbE8a)Jt0͇Tiةh@0p R7Prt$vL>ׄ(|r2j{g g JO7XrvDYױ aApS^nu>S珵G|Ido1rl]Mv|дps|!5YG ;6 ){3G4pI’dǀ݄YFG7a¾]WڛKOϺC~),I%xb}(Q}y3U&Ic̳;{SvǐǶ N tl, ֥ DM<_ c;ad7RXp^:)I( (#l]4WXm٬+ i47A FƷ䂑>iE4&h[hVM+BGVw}ji*A}^S9JE7OAy,vTZgRnzChP7=]JSUe+{AZgxKA?#*l5 iXԒ ! Ֆ (HKlGC؏p۽u׿dIWeoFvbԉ#Eظnk@KBG24ûsF[y^ן:R#J-J>J"ہ@I@3$m}Ao[~?' mIT^1Wfl`G.%f$7bv(X96# 쨤$v\X4ΪzPW/N}-ygk ^6Ϗ.Qnvo[EI#&酟jIQ 9[K>s8ֹTVq])c1k7/-HF f6,b3!U7B.3uɀC d9 GRÑ+G]o<[=nV"lFvb`&i< ln<Vdl?l'zRts~03X.dEv9GL#|0},fbF?q/eic_2IDHoZH"Irt)Bot31c#Rq-˲{愸6/!3Lj@B G K4W҄la=1e81>@;ȸcxIh mj-,8:q' h8,9:`lN\n F0#V(I(> %YpC3N:ӑ Ah-_&YYJHَd5>rJb#+$m+֡dے74O^n/3(;cR-Qڞ+4b3s+NRKӎۓ3l"-[W9ݡ.Dӎw=2A"5[5 ڄj<\:sp8nwB=1`ZrEjJpr/Wjt6o/!@Ҏzyz.RՁ uϳֹ欬qǶ-rO;T4RnRBoޗz5޼>2C`*vUVXo G b 製N8iiE:%@e34۷td g9Mg~i[̠Q$u>.xl?W lvlƺE~j*hP^bTg  v`G`ljdT{?PN"Lol[BD}I}r:<=@>bT&96n0ujB'1ЕƮHHHTo>ݦk G b-;FLrm5 um>CPQ 78=jrz=efֽXa z}PDeFY7c DoGvb ZS^5(J;S(J:_vq*'ǝщY=Q \Le"2Q- CI,(z$5J15f%yDeD! >,@?n<_t )Ɓkx?ཥInhZӱ։X_=#;0mt(i<.c[R>TRp" Ž x*ctja}B4!J!ҖYa>wT0*6-[T&M7nPWa[z.ߩW):rR #Fu# L< IfpoG:VH37} w<}۔W*T[lp>_K&n7jr,&KlU5oAv5V G9 lASV (hؾ}tAL#˖t.8.Z#1@ضDKt X6MWط$̼!lHJX@J9@Ӂc݆/U_P=kG{o{ۑ )z-.Q*m"!xXz$w劲5m >\Ӆˇoؗl]{IyM m>\wtb1^1-RC0%)5o(+j*%$d#;?[5w<˸e!8Vmݟ.;*U+8"u7oq&^dbzjv{ߔ頀ԎrN#1vQ&}Dۦ3@Ejt&1%pl3Kf J߯d=+魦$[8dΔZndPFҽubكr.AP9jUT;kՁ oS6 ]hUř7}S\ؗgM)ۓasWÈNsT6[y՜nO?36#;;~g񵜜 ^"1 8^\:wa {:i+{9=O㯲LƕG)8kDQR$` Ƕ:ķ{ Ŝsrkdn!7I.r,?f7יm9K-}AWu?肁 3Հ s ]F8PZ(֏m,ۮ3w!oLK&;ߣcY!fE"C\pe2(RG ӕq_Fz7HO ?p&(i3p e!U`gs!/aG6:j;-4#ffW^x($q*GVƒ+YC~nХ,%QX q۫ "jhUny d2ldZzp e Nض ˅P!cm H.h' hY 5MRyM:59w>3 h6hxqr\׽(vPG |lۂAzԕjj':hqabK~N˥3f:oѪfAW\ piI8~s.nI.s%iSP-8ǨnBSU} PS o!eQ' ^rۑx,o<]J7"|c1D=6Leۗ?zƃ֡-P$&HBS/IJǚ[o h q쀬:bV$u[.* n3O Az=xk}i]Fnm_#;y1'tX%X19XXG'z$Ea[t뜖p.Cٸ )UKwzR#1ylW7Jƺ}A& NiD~M.t h<@Fr u/֣$Vƶ-壉`]E"gl^(N[s,u9۴ϓYTE߽=b#mKo ˢQiQȴSZeSyO#FupcR`$C[N ¶? =rg4 ExA`:8*w_*0?-9-G}3¶ei怯n':ĭ'w.Ec[-TI }dZ+VR~8!Aȉ>r_~ۉ"SVӰ,phOp U&|6H36jFvhb ~bʋ2[5E G|j7 ^$ntɿt+R'x9b_zm޻)ӲqmeG?˗VOe-U&߂4N iSxٴ Ḵ 6NW[N}u )6XO~l]2KzS7! m ]zM#b&ɫ87Dw07q<ϵD1^fx=לߘB dL 16!IaYy/v*9+Hݎ Ə%d@U 2~`*!TR-&5P?,b ?Mp"@w4/l7 J~I aݺ0)c?>*yi!:xHaQ$7=ceݞ$>bTn*-i|,-o-qA Z!acs-c?_Yp~:m+ސ8r8^A9.^`5 ; Nj'Q}~aW.!s`ha]n3اn o/s:է_N(*v:w_@ހ!V?k{+//Ew"o?Nfd''f$QqM@3܎q܅m,7m `n=;BM`LP!$*XƝIS9&$By䚣;I=!֞<:}dQ$|"l d~;kEv{)2À?D^S-<[TPg3] z NNTsj gCuΣQw'Ἦ?@FI msӡ6e+HEGR6IiVLXka@lμ[RX`EN=kllVZ -jdhEotEa[>B T7P{} ǡW,e;fY pn {Z7rF 7eMb]<+И2> xi&v=ݮ,CB뵴>1Llh㷿(. ҜS86.9e{b 9<oz>y!B ~:⛫RnEHRvǡi?d!?^ N2v,Я2=f wME\3KD4#;W1I k>8g-dE1壅֠5EV]X(`BاD a nvjkO@yl? PXb[AAG)Bv܂w bɓ3@Φx6b{_=04S'0M:s{Q+ϴeCڑw*ηx8/sunkS}0=;u!'YfL@#!jؖtluW 1v[#BMM\Orxhu`}CӒe?ow!gw*[fsQʻ${8䙕g?, i{P!hs fH26-Hd~B=K*k?ֻN3hFvvb䑞һYz-Bw(cwtj˶gzE6q8LkJ81+5uwO# %LlbK`qCiJaqK n@Z{/H'Ǝ* px\g9|ךzֽŗf!V>K: Q+7i#:_ǎ0q5:\]O2s^vdGh^`}D byR_rZGCt=WtQ= َ=6V{yzҧu+QtC:pKݼO X}0|=?\ݽ_1nw|n _~=8%Z=@}VxfZa H $,5A%nB[T"bc>q=̇ٷ_4OKZp>G'|Fۑcu"`fM̆8@#u|cǶm B〄 Fx+ٯ̷Ï#WsNFvຊ8^yym_|džQ^c(n֠ yP<PBywQ^ ㈢CZiqƹJ@]->^r&m<l씇UGrf 'esu-T$`[>໺V\cyV.|8&c?l.{ƹM.uLfH]ܓD#:xpY)x٘b'B#Ǜ{㿇d08DgDp-`CL U>:"),%(}5yN _3 !l% [mW^5?nfb.T ЮU+tXbsF^3fl$:r.b%!孌ug6׍ONKx6V 'M#Fu8VºVKtbmSNz ϧzc{%ڷ#ffdˡ_qpdbb{*J c.~uF>DF"w\yL~EW!wwJ&pA 눙rr_kZ=W]mRA)ԈǦy}:q'8[Oh>E0];vgB_3o>qe-,¡\hc 6D!ctYq!7,=E%_'p*#`F6q̭c9"oP:S^"xľۖ[emN̠7XO "VY:h']nu8>jBi*f_wd0 .֭{y%L5<=Bx 4 Ab|mCcZt[ÂoCK nvͨNUhl\vD)ڇb)S3J_is%ƙUv]aumGvcD̗Ց}|=5AB+@]sg"Jeo3ʷp 'AGBz_"hD*Q6iT' &4׹ĀC}ی^L2Ow9ɀD^Z}`#>ekR[jNFm|PJgDJJBG[/NڏЏ7 Fq^{|^5qL0\[eu;o/Ne!,QV{hMH:@@H4DIwo9N8POFeEk&W֠ΓAFγ8|4D 8!T3tRS'̌\"<2ѶKM &ŽohoZɉqX^sMG dub2[Dh W1ظjڋX ?) oJECG-yhRƉum+\fdO` Ry[PD%ݨ}Qm?,:X~y2^avd; \bֲvV҄B?4bWm?iP FU4q5h@A%twh*ײITWdF{Y%B8%r{={N&Uz}1{h`{;, tZc]ˋ.\*fbŒ &6j JmnmxW_9 ƿ3<"A['J0u'Z~KaA,=6픦q>$8gP1_&#P;y:-k|>֪JQpaj{'\~IDؽmeqk3kJ,3Txx4J?'&*s>ϳ.kIq_:{/j/7)9Az?hD/;_ (Gm%nGv̋J‡tԸk6l]5WF6)z&uLc]܅"^8uL:(AIFwO"s&J*J33`f`?EL~A^m/(RmYd1 8b}mt*5g_ۺn/d?LIt[1&b M6. oeZއimrlȴa_+AU\g4u{].½-T (p.Ui:.toN?(ǀF^ *Q9o Hclڪ1xiJl7P>"=cf᜝k=|{CΡ~}^8;;t;\>oWLRS jsv䢊A}?*J\u 2}(vŤRT[OO/`fTyec( 4rۑ\y1z&W{wW(8\@C"y1nƾ%KlQNjxcҿ7XN6Z{ƺ lcS$(ļEa[2. r{ʽ G)&-|{BA/box&bK<χL\nE :3tPd>z' :; 7з4d|mjNѤ}nb1~DDt؁yI\SM.i`<@j .?\Ii,P;U~ z3qvB$@)(xwnHr<]lqN= c]g/IA+荛[p r Yu+ւvI#F1XZ?ޘڙ vuK SQt2_2 A@z+ioYVj _-ٌ Va>ZbqX\ӯ-,1)69eS|>On3plrK1 ¶ݡq?={fU%Vf'+Ycv|lcL*=~ѹqO%[ːOQrہ}oq[KQZN%Ŗ-A!Tl$mY{*j\ Y0p1|HI_ad}6 Owԫ*|dff|soHXSj[;M[z7R~V>L_I@Ɂ$̝QtHWլRWRSI~[)A^ȥHjEvJ.q$lK1'%"_ICɼÞd7qzb|ZcAМFI^4&MuBG SȢ$ F ip{]JJ`s 4X ˚8?%j0!jf]CЈpm)=\\aЮՐuU2 &aƑ lMP Ʋҭ IVNY\ٶB33ޣ:x E/\Ur`hbaZ 5qS:#s&Aɛ}Lܸ)$b!]d'&0̜ 1p. >U{Bo7ZNvE'7D|U^.w*y:^:gգLLRGO@<"[ PqK ?Kf=?f$st Z|fR퐣*7^:rВrk37 x%ī]xFG秿{lT3A3Z9VKoVH}RVo zf!5)^׭ջ Z3n;.33Fd$AS[ncƪ GRM#6Oy# 2 zNf`'%_LR{K+4َd.@ wk/g ?A=Vȴne2G)|.C:rºncWq%^!FQ=ɂuibKTz\/8MxĨAX\jE#VWzd$]+c(eӮ{& L)RWQy< /Ml>ܔ2s8kIt:9cݾ䭌_4 n\kn1#$|upiEqW|X\QضV%2psA*):(ɵPNxY)>jϦu/X<yҮ<"l~ƛ.ۗ5zj[HVrPHzW ]&KUN1Zc)Y|r#)9# Dw%F3/T 3mF2̠UqUUˣJ0sit9.tيi;A2f{%cSNY*$G=NrJ:(L+`'N<+@'1xT4:JT!jeXJ2evf{i")Ka]^,ӇJUsl\.S/k"Sϱu>kih,x;%z:ߟo# SUA}zhHv bJ x+l{?4ylOmzu3%r̮UY5e" \?\A pvFO4Wr*s!G}6nRν"O7.a|W4( edX* ~3yk T3hmfTn#"*!߱ [bnv_ktJnKq/}Z4 DJS~yj6b)M>vreT5u<;)`R( e.q_KF]*{B~۟}-EsXE=~+a]9~ʣ8/%v͞n3L3XAOw9UA]P_êJ$@XrF{lUGuiUz+:ô{1$  V D-[y㵀91HDVr 73pud!{1 &vAync*!::Jf9{R*彏U<˯~1~T\6ʿ#,A7d=^,7׬Nw{J&8o.,1'4*b$FʬC⯌N%H]\k H3|¨`tN<]HZt# rTgReqwG{x D2CؖlpQ 0,cEL2O\J"&]-P#A|;?yk5K/vUaqۋQ-vS )!RH oy]P4 2+ێ N+zZ5K?`W1®+{B;bFp~!Q\zOaUǍe^ zh|]*W^}Z; (#1Zؖ =2,% Aj+NJUi>/Ok=l-kݜΦ(EGc55yzH7Tw {#y0$@v_J@HL #I[R$Y D4AWh$.KUk1 2If\G3hf/vxًzt@*CUQ\䣀Uc/g܈R{-K!D.2t?aNsBy[2oWи/2WдZCQ9ycVX h@ ވ@ZՒez8x~N;Y랿eO#!⦕z%b 2SW 쇚:iALwϭ%iƺh*:;}p,GLKR| lkз\C nI<}t9\Y6QS >ʇU, -Ʃp VK}T1f?D*ebBXZݐN:?!fdR+f<vfBJsF/8X]*!ty-~C"\ na)%~-wӶ}"u.fڜ"S_l{B=#'q"'TJE,KeVȯڿ (;$/n I~3hF2`e&>b|<@ JOyoOn WehF98Q.4m!Ro_A*ݟ|AjQ?¾޻2`/Vp!2cf8ellGz ?]g%Cvy<{oSTp3kerOv 1qƺՔ}aQ;c3M0 0J^o2RHӄQ3jJO)}.7Mtn1]Co9p/t5b8)g[8@osWK_zQBTx^ByO =bT (%)c9u/+|Kyʔbbd2Sgl沝TzYTC&ұC$ulUou:_z*/"Ŏ6(e;b\*ԹX2corST*Jk wVph^<(3Sd餲k80ZD{8:K I|Evۑjt_9P\H5t0-cau[;k99M7"[ =!@/M-n*e%fĒooWMA] ,hN$\6i4]w$P@fNe+z ds՚v0Mg G]g9Hh툶܎H%.W\g4yl!.'e;UO/a{O8J/ʁ4$|ξl-U>Rr#;LF1:SL!o)`õh!8Ͼ~?XB@d}Tffn[vCyS^ew&᤮mV^nu3@dl>D"67]Tlvjɉ J8Aj[|5~]wzƼNo=e-:+;ڙPof_L=2LK(1|5OEhuR8̝aH`p'Е'3؏TO+NY B>2U\` u iG:OwKq'.JKJɐlL :-۞*^du'kyS.T"flLȸQ,a '7&Ѹ Vx$2kglo}K ОQ0 %[)bƆi Aj[ :ҘP'+TJ6V^K] EݱuL7Wm)ltvΝIqme:MFt85\ס8Xs=-Z^6#;\D1f,5=ZDlQ>qQ*b$+ƨ$`LlG:!s9$M  HԭQL뾝q";e/?n-̑Km8:(?q25^ޝwwU L,7Z~{ 07H,\{Qv0%V$zʂKObl\_!pb ƺ##1AtfIqn5_goB1D^XG: [rr ^5ȓQ⠰|/S GQ Z:JSY Az-ю,0U" Bz/ƪ\OhOUe QOPAWSt}vG,\<cm"3A/ϦyM`}|ElGv~A3KUK6M`!q/FqOAB?8E6 u\6CbۚQGB:l qg8h3$p F3 JPhvEk' ҈./Q*4Q?^)?v(RolJ>d.lA]pe~]xνOAӤ2Ͼ"wCƄCQ墶)F!| pOɗU W s/=et3%ƾ@c|]zeEV/yaԬTC;Q OCم¶lp6PH,[iît;Hލ F+~٨ηre H ƀ[ꝯ- 5 +-#롹nQdUWRdUWi"n$[4 􅶱Ԓn>az?^XN۪; P-sl )t>N'ެYhȝeT1TX*J`tAh[w9Áҁ !94=S<8(~uLZdӪ ZZc5Wvd`nC~4`]8 n9p?4d :_(QS%vOk DZ4#J,&@r{᪩ڮ*ƈD_+跪&1Y $KV|q3}>GqW\h&q2H8JmQfl!%QA]5Qtܖ7S\Z"I"#mFv V` E -_]ut/QTS Xkr8Nw %uBN["80eM5FܗOm>|_ ;t;jvqIl?%gg͕W^ Hg0S|{B/a:T7A6 .y0_ri T^Qazj}?$[eﳅڱ*+.6do5V6Aqx{ꆗGr2p#LfY \ NC*;,n gLl*RB|-?>RItO2Ibwh^|_Vi+"4?I2 3#Z̀n{ B*VI%+T3klkQgu*UWY M>#B'A SFX5+a|VP^Jۑʟ?RH켿teH5c #^"IdӔ"]:dIMd>$EharX:NJx~v1} v_E$x׎n+7y9BѪO,sgVsvϯ"ngRkۉؚSvqսtWVҔ30U~{p,t{J#F1X6ؚ!=YTZ^#kCަ,krHl}DKLd臞:,vx.KIa 3E*&:Rk?MJj1f#EL1Ex@eftƯ&vJrqנ̙wv̹xR@g< r$)ֆ60nRop J;k(H5}eT(VFt# ,轸\_K\vd9*`'X~ZR[8Q=rиNR_Cǵ>bT9+@ b<0-(OQ&:x{:J5=ՄT=EQT`~DNN!H9VNVܜ=\dyMg;oG 3XGN"*O $^N<ϧIWf;]f+0`ּDTz)\}ю )*җpj:+7=5;@YcIJTK's|=rxy:绕G,/Ihy<'m0li۷G 0pҔR#Yd>F%E@aI<wV."I<}4[vص-fM4^58@M@%n!U80\707.O]IK#FuJºes |_M.aFw۱(&쁅(8^2WJw!M:`imn`c=Eokx|^]Ȟ|b @q$O ]5iGB (s)ܣZGH<BIe_F{v~|њl/6)LРҞÌ tZ2;n;83ǞȦ# !|Ww㸠mM^ږ|Q1붑ovtʎ˛/֩hqYJ d3Uwb@U`>g W5qfaA$Ӳ1jAǶm5;@R:S1^֭=1kSݗ_4o'k?'zbn$dr)Rmʯv qJ|tvC@L$j*OK:?a2IxĨظAY >NqO{o k \,krPZtYC X4ϏFH ěh_>vZqX}FڑψZ73¼*48"ɱ04Z36ep|Vc 2 _+^sѿp> 22Wrf2@#m >9S>wgRG@0B(IBB'T]+̱:Gcd\g\'A+u3]-h,zóGಅuv#E%Ɲ&ɰ H4[tiVZF /X cTxa߯b),c()cyǔ.G 3Q 췺t(ZȆD׵̅9e3˺sE|4)n 6^rد68^7pk'Q[ۑ<7b9oWQ?H+F9ݒa8#,8mvjn R<yN0/ Q:F3:VoRջ[MAƁRLPк$;=֭''g+[A`Qqwn{[ĭF#Fuxº)إ ˊj00uc(ܽl$%6Dr7Ig}(&^:[ \?bT4<4.%t<# KJ*,^bo(`;CV iCO iiVމQ~(F2Vb+1aU1;㴊M^K%~&37TG,Pb}6#-F#Quޫ/ h`NN!yIp*< =-*ӭ<y͟89ϛzv4ysم}[荩tq@c'7p' xsjN֎)RX t=+/is=Djf:?vd'$fD$?tU.&,!gq~K$;߄:pΑL$勂W/JN r4G[ډ0'')eX1IMHA-إ^(JJil:o ^Eiv>g*Xl3ZfbaBT*.&Oy1j[f {RT^dpV. ̮P價|+yK/ }yy 9H^ˏ.-qxJj¸幛{qB^z )%fGȩ3BwĖ ϴwO͈" )y-ES<+~X ~ĨwXX;ԜbRۭ&MVPt L Cnj `F(p3@CeKv ›-h xT>^[fQGCȯ(Q@Y\AsEۉ&2DnͧqP1# k-7ѫJS.nZx;'k}+ҿSRmvJþuvPW(GP7-IiYU;2!7 3_+/˖հ5tZV0OIQ%ZrCjT0Ǐ"a^j^BVGr5\ۯ%^Z`fRRXg*ܧkZ_uM6CL^&OS>!Emd=n/Pj`!%5R3dþ١G!l' lnOA6fRn.{/ռ k1rKEG3%1(&|X^vHd748;2)^gRvS_ERAH4U0NC3QjLNV*䩒ђ:[d)(1t+Wx|85 cYx {{uI pxޡa0r]<\-/Iw}XATau' <1oVt^DkFj`s%Gotc8 b)& %QQDF$(Ovc~5/Fl헊ifIu /!&foi;]},ٲvJ­C\'|hK,xpڵcɖpa[rMa|#:ӋG{쮻J,(KH͒}h]*@tUiSmƺj1@'s -jQ6Uضa{+Eq%Q 8@@&+J;پ%)5ƺ}|xoN^7ӥL1BQ=غEt!T& 'XS*BJ*Kx nZ(N@zuBBF-#AdR"7Cʵh_/[}%ָWq1˸rx%A:*d!` />zӎ7&]bOB DPi:7:a݂?g;QkϦ14*pX%\ N%?|@˖׉xO]o;*FFm?*üTņ8oJ܆4;n{˔|^p1WXGv^\p1~$ > Q+PT#+W)^Osʹڲm c "^U yZ>|WJ>N+9l3ؕ5'2-\aI`1##&kwʀ;8W"'u,G[ -4T]mGPG<ݻ|=̇'o$= < ײ̇U7J0Di\5Np. eI SEzwcgG}( 7x E)Q ŏX `l_S!-\*T~|RHLG\K3jrrmaxyʡUlYZ6۴>wa50Ƕld6-bs7M{x+w6"6:_DDL~0։%"WGg3bGrAcΪχ9C7op+)"&m:/\dOa1ֽ4:JVmdyDq%=7IiH\Dzt?+)df`q6ӽ~|c׺~˧IXC nkr&Y yW^f G#ߙy$.DIٝߓA=$%GqeprV Z j7_j~G̱/"_s-aرqY|:NC 0]4+di)!(̀[IsdL 9 1d7AW!7oӼ&hy?LNbi)ϼ3v[XJ*Af8>Uӵz|srde:FZN{ #t-,!)+Yׇ.ZTLyU˻7q'\D(bFtg[ԡcʔzu؜$'#-㭹 d8p-8d6uf' P7-%Uwд"!֩r;m))j=ycE _==TCL%4#;}x ͻt]:TXAZ9>TNs-k[uV@SW"rl16uFp<=YhD?4wlIp^Tғ]> >#9w-HicWw:a]KN{\b(y-+>v4}MÅx0#TYJE`#ν>U)AmT38ק Z&˱qoŅycbdgQj(=,H:#sO*Oű44@pJ 6ߓIw`HXz@K<兰'w;]|"rbΟ␰iyԕ m|"7}(ϚJ]lms~96/wj;IfKO|H7L.`g hvRQuSF̭TJU8 O-BZ^oOdTK-㠧'I܈"nۻ=1IPw"PYN&Lr)7c{Y~~5ю}+77Zђ'Av7Kr:?Ie|vphBS}hy'6= $BN9xB9Ub(b}'!`ȩ#nx/?%1wN}૔4qKo|Ҁ1([ȿA/LA#a" pf8P7dÿ;LR!@C: -b(GZZ`GN$ɩur]W &soJьѱ ^Kcܭ>w;<R)b8CcD."BXJ}ji> T535C hI{:*NaU^MLRXg5s>$۹'Dg5TnP+ c^ gLά6 P%АhS&&jfB?n }ۑ>bKZ0Xp,׵5 YRvV!r+ܺ!pa)e oL_D(4DyqDXon-8 89%o]~-}/o7H>WIaS϶Ch걎bYhn 00h'oBn|lw,nY s\l5 Yb?^V Q;6,"?w.෥w}SV D0bEYɞ4y7t32E䮨 \+Iq"3ܾhi۴jl߭|@$Z9tJM/)1yh{] 6fkX>[5 M@I5#Jlf<,9ŵ{ wQ1 Ce-` k=4kl_u۝׉ރlz+6Zqe8͗W~/[$_ŗJ~XB.~)XVt,qIN8FWnnaqL[%@e! ]d62ƶSn@6.^Q.O XJqm^İӂ\z>z+=( q"<ڢJO :O{hlMXMPi?ދv>_뇞G( ^t7ɣ!Bؒƺ>xw޼LQoA**3=dM検k)Mx-^ugbjfJ Tu" M!eK4"uMwsNj+哱 ۷:yt<ؾnh{/oYsՇY_-#;1N6;Gz}&іpcbu9uLr,G%Oֽgx8'[ VcBظ;߇TceM=|鷙TؗvK)z+v#HߴPSbSŃt^ #Fu :WѤ93'O@TKa;BIol#uWëp #f/Nt-\͕LLf\.۶<һ?/vPX)TX]匌Fa{x> | ֑N%s͋_qw[<>Wv`80F@saH!ws) <%WMߋh*O@H7Y.x 6`,9(g NsmkQiIKԌdzT(\x+<X:‰[@K]CˎS0}{Ĩfn4)@Q-X0j9\S)y#t,~Ar)Fb1l&UB|C}t?H8:06י,C 1HX&*Vb%%ڭR{o_CEn>ub[B9F-#;Pf1< 58vmawew;DvHkd~RJ--d3g@DFDʝk挾\dчa+ޠA/w/3To;"J><}[{+' (e6]ʖL#rF  8=vP ey>5l )IuSHqV(Kn˗gWr"V`{}N7£lvcBN)UAcDS1]tY730H~{x$)a kYn# |Ĩal\2\Jv(ε 97PG;۶ܟ~u\[Eۤ_ s })f pO*лjAX/ f)u:N]oYQD^s=;]RRt\ ̪տpQ]ĉ=bɌu'Δ@G;YF]`1n!TLLflKۙSdb L0VW PpV;";N >_j:ؐu(;ugr*3XlؿmGvbˀAU`I]Ϧ哬9F_T:YE{E'|59e]YY΋hܚ&@AqY<ܣ`pb7_*?2=~zW1&d$|j5FIR;64 Z]( >iJ{Y=U#ˁRZKj3G9@ H,"C;I8!{ϊxH m%+4~T^ l2jІ)yO`>P3..LѾH2^Y\+!Vc d /FRkEU¾g3Gr;]jx,hq;~v2JX>IUxݟ$aŸuo{~ͧEXK]+pF)Hm ^:_t9[OB"lhȶ׌C6l⠿sm?Co}GQ7ߓhpб 1* ^BU`s%1̝^j .Q E Z7|?TOٺ<- c6 J!9|W&dQW\$ Ϭ}Yܶr !I@:p )ذE֤, oIv3S"~\y 'wl}8(eU^>{ knZ,QbH[o2D[֧B) lƀn1Qu|ܺO<쀭ʿۑ p13 `|c8Fjiug\p^b{5ݎn 3)= Ü;"t3W-Z?3oƅZFZG=·.~%K8Gbt_(.˧ ۴s=q1][ָd=?bP`b ]gG0cKgw ?O11J]0X֠V2 ȕRIBbp,l;b7@Z usXiF{ @n\SDS9@PhGĴ }،t3 v}*|.~^eK#Fu@&cR>b9º|ˉ(uE.`.D *ʒˎaIˉ 6)W2$  -ar 2l7)m8X%vjG)d>Cof`Z]uWs=>6趗MqᅫsT1 {Xq n.[7iU)c=ΰukUba.łm5m1:2m#Pq{f/Wk(8ť+ǴDnzs:m~~`xkq|_qe^B23سY qYe>a-Q+Yb@wnn3PV =}2edӥXoRNF]kB}ƥo/3;J*Qth7f@JT{yٙ#Fu$u-TnLj²]jjF9f>/p/:?JM.kcim5׌#D.5C~~xǒ1&ݏT͵ ڗ}FģGzZJ /{uڎd$ok\y-/IQ'1*rȘ".)pBeRW¸9n |W9iR&v@Q"]ºeJJqK09m\iIi'xCrj8ƺew%=ƨNj^ub \QWrx+ "\ڥ~j[aI;l4Zᵍu%o[wr{9Jpr#*G"6%#Lnp ړ& _+zM,%b!GZo-,^[q=qAdFNi-GsSjA(T;ys^=;DүɝDXj^\|~\/|lRWgPҌ{_a/um&VRwMf`ۮ2t.K~qX%G zMU{j#>BO@ ||A:J4c>Ϡ:#d{c>K$#`#EF$dL0JBRp9*_RjOb"[=r[T<%>veϽX4C d~( aq۫l(Ry+# ~X aauk,.*dV`JfCMIm"%\ %9S/L*@&rl[`xJV"4[j}cLz fnGvjb/5 /$G(R)pZ ;L& ܹ=[򧹼%? 65eQmhmeBI9YTR-aɪ0MA(F vA`Q 4„!)?_zq\+.syKEiWVNa<kQF|Z=APf:NU:  T>pʏw^_`nGm"tPEN)#Jz Q$")eey,DұO6WL1->}cVozr*68B}y@.9,fŽV 1uݞ/9?Us6cE5`3f7-9exymkl_U%` ewVkl[8}sej5-Y p CSe֭Go %d8 dÁrYQc ^m6D6A}4!e-_wM`uǹ=e6r2#;\ 1e  %r\[Z.0MA,%lkYst|9]4KՁ8 (u <\!،V~uVsP A(ds8Y%%qL̠c1 6;$tw!i^9Io8;"8$Tp;`dsĜ.ӕnA5Sp I橀g9nX)3~|)&҄9)juE&o:] PTvR#de[ɦHnr8O0q/u\[fα!̦yw.UCRg.#4HULeZUhheI*&e{lb1~-Gꃫf׀"8'O5A ;K串dQbهFóVrHAl;oD\պq TEEEuA#HF ;[1RUb۳ 58|c9/p`Yd*:m<(Ĉu %DQP Kl)$l"bB Q=!i"&ET.^ Wv~9Dy[E5Uf~ I/vj7+TdKn;ioTf]8-Fm:nŤO85yxusP@>huSZ}H IgRx5z#O3MXfn!:̓&C]],y^kOڣr(iY,n^B㱂_ r@[g>p_:\ S6sFy{Y Q*K%E ߷ȧM׺-Eҗ1؎윺3ޕQuP,*2Zc( }= .@S|!h6cA`ߩrԕIV'j1k7W?Ube-4PNJ5#;TlǕwINJ|(By3E wЉ\14L\ELe|CQL= 's AN^+ϪqaJw3ŗ/ǭ~)6ߠ{@L]osqZx sm{ы7hՑ5} gR7i$Rm]'IMZgDuum}&UqHv$LW W9M1,HJBr=UaᱦeRQ5St~vG{,ftP^SV"?roae;7'>k{V\$͉ebv :S1*I$J5] `22ôPyK5x-\{ýsx VUa}:Nk'c0)]#Etk46wCUbX(ƨNy]/R9cH%un|:4$3X"QÎq؏"27t*;Ql79HH, +;pp%sc*8&xq\2Edb~B%|k Inm>+Et+gn/k>)l骍r)CX6쌁<05~jAuٙH:BNvzsOǍ]Wu8q"IxTA28Qt28STip( (@ '5w\J{b#wpV E2؋ˎ,;Lߠ{ȎOʧܦ{/~'m.eغdͅcJ%,өx4~8w-d9$?r?*~,Nu^AM09ND5F˪HRhk?wU20_y)6?ѰgCZ-F ´. %+0 pLp6VY\{uy,WwveQȘtpٮLYz7.-.M̯o!z?-5e%w+}ƒ|ZVs<9o.[ِKC ;k5t䭟˚yTsc^}6!YvrƳN%EtOuK-}1xjRCy=BQE-w?]Ge 5])׫y㟖5kFvR7fv1J;X-tm"mka"yQ*5gƧ/r3wNtۑV^>ᣍ)V]]+KNU EA;S,SOݘ9BlӉU-xz@v2;.0Tʲ=O5re-&}B+CG=!v*׫2?3(LD9_8,jf1 z`1dI7쇌 FPTcU_!U5ߥKVӷ*ⶣH7Y!@B+` 1/}qa"A\)cC*| {%ZPt s|T=mxrm.[L,ػ2יB,N͝>. 5T6Oǥ,uUQٵ V~KdF͕~f;mYQeQ_im ;Fr9?|dttZr\;ݞ``mN\r; f`hIRnQKAծ]O߈_,Mۯ].Q{Ct+7NhyN%/ptvq4ip ɽnL۩8Ue %ۑ"rRϚU$x~V zMHbj4H M 0A2qcmqA)ENA]SRQ˾C 3 mk{M)~OaXEzeA>tP9R˴vgVvt<6H](k|>i9V&g:lX63IA;XA,LTe[_ꂾ՚!mGr[ ~j%RyE뗅VSyJ!mX+b*X,ݎd VLqVY[)^WjrIn|SƨhY+J&?h 5'4m(@(6la єG94Uz~idat_Vw64ˌj!2w щR~tGORO`X?`?oRӱ%ʁCUSs\Ͻn .=:^kEY<]%2ᲀش<Ը}<;+-$ESyUvX2@yw+þD6>Z+6ꀥ2_U_zst =h (P,@&"t_붎 cUgsf_Oa˶4{^T&erӯ[iN6?;T =Wv/4-~P- !z>4 :6(EwV]s*?cc;%+`cW߶{NL]p}ߎ(h7UZɹr.ׅlJ ųY /*K)G}='%ZĶza^~c:2G >:[GVӌ;24[$:*sKWVzā_pX c@X-߄s"@z26"*08:1q ==Ne;|:ᑯX>Ʒ-QYkLbURdYkLx4C1Ӳ3JJ-lQEQ]\D 6bnr P̑t'arI%Db8[>QQi%JN m~auSwka2 is[:l2FVBIr&L2.t}t%~g&1 K]9w@K*DZdV̭!(p>'T,: b??[.<f|\x(Ke?7- n1۰Ą8B^fx@U\@Ca\e$]] TlB}(PؔxvdAE#@4*a:Eb(a˝ <'v@~Xb~-,,u>z\gN=S6Yku޵:,=q=46qY>zO+Md{؜;[FHo8=A#Z5c^ASfp6p{e'ّdSd zAfdJEaD/#diȰ+8-&k(W$poYoC$6rQoLxe89ܫT,[%RD]fR( ') AރrN4!5̸S53#6yƨ&E̎ʕÌmX ߑ[ ʅL0I0b@| \GQپF59xQ NJ =E4ZwqM5VL{ G:琜*ÈBw[=ڪj@myOjϫdNZG܁?j?xwVU2IsKZ}OFJX ^|{#ֻYdLjLd2#sgxB{@Vmu1oGu*j1w`n rRAӤ L:<9qh`0*AK+4?%Н28U(Q/g%gp7_\IMs'gq%/p<ͽܦ!ãӱxvnq7goS A|pvmǸ"?PЫw3D1._ueY >z84P{KMud% n> qz ٕNJ48и+ܲX P&t@Bd佪4kl0[K躄$-9[Q)nlEYhܔg[,!p^]'ZI/ `+ޔ|!@N՘R W"F8Q^ݝ6mS2L;7S9P/JcltdF6j`V;gjL$0ײHzVC|J&9gO!UK 7%5 Ϝӗo`op&FpQѬsh]Ьܺ#ZSHN ❪x)d#_f 'VƵ6o"_SѼV>PI`~(oOeqF=p4TAzȖV!C}qcr 1ͅU)PEt;1Wl4f9r7-sA# .Შo%Z1BfN1C`cW?e$AgH >\MT G3j#Z8L ١ZaxKrݖ{J1,>^viTSi%%&%9dCw:XHoO%D|ZLZuK|Wa6p[~"M۞U .u{.}([ˋlv$ynW]ID ruQ; x%{ԿhO,_ )eqe7ۊJ~#춞,bn[AeKI 3R -}izQ`IH֔ZeY`Bl2+,cz,%7`F|j Ury1{9Rr-꣔@oELX]gj_Osx! hvL tPdA> (EO-\.4X 똲O;Aqi.fK;308(0ܳ)i9vK!|b~w;U&?\FoH|ڎ5; dTyPU/ Ơ$ؠPbɢ,`#Np(yv:q (Z>NC.rYlf;#/t~뀁fda_َ;ؒ8t%Wt(@N})疠2oNַW<;X bR퉀ʟd) е.>` T/^WhK͝+[(@zw@jJ; % &2PR1͜V8YC%nَ䊹>as>m\ k޾dIk*CĽ ñj;u#62[7ÔlwntH\%b-{tDj^ DprTY|\ȹ?47*IG>{ gg%警\iYYx-3;k[-kU6~wy@< Ƴs _&9N cyAh *%׉ Ȏxje9LvYUJk`![l >^J}v"z]j-9:{i;Yt1-zzB_ ɱ+/+8/ewZ lUĐZ`MIRO+ɸk+4I3 )I ts%ɺI (ɛ+G4CK6t2ZI{ߦB)ܡ䔆x<{ئ UYqz~]^ 9?R` gS~rYTlqH@֠? a{XtT@njs;S17Oӧ*=|P#_ xJˈ @#ԜZY5މF aScuUY#L='wd6 ;7?>hG*,)i  'u&T3_b"veW?uUJIQMn߻9|B?G#-[:# Ln7kۋ?gC45z=o_j89e%}tΒڭA*;Z!B72ojG2oh5p9t(?r~X8ifp7@QMPosKĵӦe& nsNuê" R~lGv*t;5+2[K|Z;a^w2z(Wt'EErdSJ&N x^ lB}-s?r GT yW^j}rovMۢʲ#'FoT0InvGI>vަ{W,tO4(I%wN !IDI#V鍓!-evZʒw֝_o)ɽQ}q1E4>#R&񌲷ӷ\NXt]aC2;f<;λH\R&]3"]mCX#z2ң.5hFv;X@n9f$bjg?!cz.- ˉ`M|xt0(YvlvR]fh3`owT ffպΔ;p9]jwiJ!}3;Wl[gŜ_r<@?ԙn45g7W-`_L"Q=D-윿^*Nz:yىp>Q$"l7նxb/e-ǿ[T 9̄,1Pfv ve9E*"cbY0+DWJ<_kwR JVеQjS2I:ÍA7J4!DSrWzt n({ؤĶKwtX=_q-} GTS L9BpXכ O 5Ux#!V0gIqhHY\_ n&Ҋ.j|vj%ev(ee P@uNb jIM56#{tVP |iv\j^6r;S<6Oԗ5`M8&ff(lFhٵš:5n#sVW!hj1dU;0>KmܡTDv&icv0&F}A?%Zjv8wgfo di^ދ`r ~xhZ\aP~[np[zrVeȺ xO3ȖR4rUgx3nx  |~#pZ#W[V}7{5N p~Qި:Zίe /uIpȥԏOzr~ l_ )G>m & D)q IbȔcҒd_!57]6L*q(4҉f4w{ظu+!\2tSC* Kqd3GeP) >Gx43${vOqs|ji Szʼn7?dWў.zMBbnkw18=#cy \tj1JB$vDrX6g)ݶ`F8Q*"x<;3SĺʇGAJ6Syƨi%bv"ibem:2/js@SGT5`R\a.=m$گl9;hh=6rOY 1 SiS'{:.ex>Tt+a9M݄qnéQͱj `is3s#\3xvVnl۲:Ac_πNnzeZ ]QI[D[ HoZIįrfd`N|ue|s?c N+'PL ~ԘB*PU;SN{-NwTA.4ƙ'|f9S-%eb^A ;XimOrsm~/_m+M$AD8Pp?#T ȩru*>@ll'7AGI)JRM\_%NKI؎줻FӫjwFtYܳjţ؞z`!X;@F6C ZIIlI!8naDRmEf="kݯłm7e'F7;N( Onu"8\9E=T-5@- )i+R3R 1?+-<ӹSs+J<~{ ggb/4[i:ڴr<ԆeKr=Ul\zBCprl.[}fKy÷|<|ʽX\' x؀B5d3 _<7i> rs[E2h[3pحNMlQ$ *o aelLCg]t/]Pc:WG}yJKV7wx*ˢ}0%OJ"$ʁr3z916j P* ׇv5ͅ/xyn%,|<4?$]tB3}vьShļ NBnV%.XAy:^%RmvXRYi- Z|mq1Ӣ+fώ[!8p:-emZ =v"Z%KWQiΫ2h)<Ȱ*}|,v%+䌂G38y#EBhH3`nHi?itB>'vNFܻEp J_zz8A~% I~R ": *;DczG*okar h2JP!{W} [neQ5cbWb@e3?SXɘdz%4/ _Q)a, &\h|nR4HG}21!*/n0$VMB'bv&w&(*ȹ#mbH#h6PφF[hSc7B~ʚI?i[M.fQNYjx<)η|D8 JRL݊uPڼFdmVȒprTO^aApIh<6 ^(k&6}l<;-q̭J`j?.7䶚0O*E AS_9F#ʶ #P/8١BU\ǃȂ䍃Vhp^  BRz;R6&&;I&VA"A\@:׉_7U UPBn?'.)\%y)vMaqV!dQ@# avN7o*! 2{.X;h;a|]fH@j=i[Cm[2([qڲfv+s&5 :(fײIg+Z5ւg*܂Wi?% H](ToέB~-8[!p+W⊙5sӜ/$fdmw7v̵RLm a7vQRetv!Oǃ%o⹬ C|?_bqS'NlI{faF՝_Jqc-3O+svg{"Lj*NukMVC̘^e14x¯w$2-)#f%8S!g8lVs2ksعFHJ-P6Ftn%[~)/$湖|6ɨU]2 'w\@)s^qytNb ,%|abuV+8+=0) 襴镌`(Jp $Z \K_+Ee ZխfI xZwA`HrlJ/^Qq$phI NqS;hߩ0VrgK:˹lE/aK%RAFM҉90w8^! I_/QO~L|kX ev lTٵ`.q^3ƁF1('8e\"g Ʉgh_V!6ƶn2=?Ie V$ZYͽ5aM$%nJ'SF@ʸ\yc{ٖ+Ju/g9rvڎ"T~ˍ )ZUᯱj:KÍ4%gkAI};1NO^l ̃3I3GD+O8{{'ԤP %uJB$nfȗӭ*]s]F+Nm4b٥߫6; 0V8L'5B?2<ۢ:Yw21bjȮPrR=Ad8} . 2j83,t|i:zb+9a 6?\4 J2i@܈Th*S΄ sI75[l\U$8e7E"[ t'_t6:(tHcnX+9Y:~E \gz&_/f3+o'O}:7L<דjaeM{6Ԙe<7e˖E}?|/usb`{tzyD'j<5Ωubgg¶ c⿔fIn?cTCxv$w[I+-邨H mwwJ=_M Ņe_Hg?^O=2$.VtNpvҼ ퟏ(w靏񥑛M~/\]EZ-`(SDI? ' Pင32P:O_7j>o!zqۑq[Q&Ƽ.Ai~tܩZ逓2рVf,l&!{yki|8O/8K89kϽ@nGv;k h0GNS#ɐhWU>VK"vQ*t!>sk0 i *@٭L߸ڹih"/fj:90uSҙA?2ǃN/Vj?L 4S#No "^/ 6lx#:yWݨQ˝3.nOjUM!7@gD)8p]ĴeV)ُggVx{Bie[?l4 D)SrsRLzFAcUTggMF0\̩ R 17-OXI,HM77,|7-+;H9x[n i†KG m.\c!pʧ_:俪$.O&4 PH^b-2(}ˬb:3-:$`!Z~NUE+{%eH@ԁZsCtƗy,g>&$/{z?u[ #wz[%.=ߺ~m"Ce teG5ͷ%Rh j2&'FnCZ1b5ɍ5w`Zb/%җٵ~T4X@s[]q- 3l}P-u=0%dȎ==ĩ/,(y`c\@1>MKf w[>x'{L:n B 3OYs$YߢKDdC4#x3[|Я!qGkkভ_sS֮! Eُa̝{TR򌯌N޿oy[äykoCcQߘzwqXlIj$~C։.ୌ'T Gx=j7 R@p,DzP=TVΩKOv7m $r$x]!`qYV+@fvk_Z-g&:$DHݡLz?) c592Pad [}V@iǕ4,3FurIbv(}#ÔQLŌJ;,*3<*&dWl}O'ޚnz68(.|9ԿM4 ~2Q<\\x#ĮrB#ܠHj: :YWw5w׷n׹miz3ŗy^lKbv?o[L Мm:mSBz T/QvOmӉv(p^uItc݃愽M@YAq=Vp+B҂.!FQB,l H=(H jSBH)y:jL8PߤQr6 !0dYW6I OC?@|L5w/A D,t>g_A5;IWO@fRs @|Fd꣛N71Y/_kRevJĺ5skŭF<̜)&H/1\ ,i85USm431,:탤'M%V :wU[3ʮg4ِGBtQ0R)](̬~|Lӡ_n[8֝Y4-J*&>_Nk@/#ǔskh۠|t L%x+B1 B'*-*F*K N?KGF*.UBK=. ؎{P;t5YlC|{K3?yK-=cObnb vXL&|<-{^$&(H3V{Fx'^Xଃcz*¦lD9ry/izMv7O&Gi?gn-]i3wy vM.4_nꨀAN2lݡW CuxLΤ/!~/ Zaxv&-xOO?Nd~<7g #s3Uȶ"7DՉS/1ɠ|r̄O <; V< kGzr[H:t17 oJ$Uvslȹg8#-i2gdU澁v9aު, 'F8鼔%c&B;x~בo+98QqxsP= O<Ѡ|24L $#|EڗeAֿ]\_RHv[!sVn D!۠bv3y.eRZI)$P `K)GW Xx/[Mn^$ F>i- D>> x|mS^]ε+H}I=cTxv+@Nĉa\v|kzwg1yUN3Nbo<տ{P55I R!1mS 0D eAuk%-e&cM0ː:^;/.)hFS*㦝zM.] +O,TGA/]06w-גSmÎg;QϢzٹ, ibvfj-fX4l1n3IUκgfġN0Z\ bv掶-kr,5٬()jV5B; 7myH䳻lC RxH'ߢ}>PDq; Eڣۏf#Qi#X{L؟&w֒j ֢g1toK3;/xټ~&QQ9k]8szfd'7}M2aJ޸cSY;]f'=f\ Jz,}>i'|+tOf-Ov{2nY`$14b|tUl̖F]!E;h#5d>\0iD?cTGn/.XGf`Օ)9ZڄQųɇ 90PV ,Ri|GaҾ'"` q76I}k/Pc*̊Kb*3j beO%8@D?i~5(r)?T눽D5z~r^%yRMʖFS3Wj;{]ʧKE'F?mAάٕQ"h@ipNu.ؤs ±B致ə/\$A]hTP[! E:'-#Emb?FJ;Ϙd& Q騘w k-U%~$ ՇTўBͩj ~+SB| !89WGw֔&o#`:[@jpEV(Cw", e6O ,"y,r*hv=cT'SIP|]#C?'R5fԈ^cȇݣ|kG2#J#ڞT֘Sb>qɓ>>Z`f,s~D!:WD?-{ Nke#* ~<ֵOt.x-޼LqBךv 8\,ٙP1VL`8cux\+Be3ye`>9@^7n.R}`3}l$ iAFŧGpG'%]Y(kڂ{_29P%@yLVky3mB=4T^ry}O%bg5`:m1 aBR&"}/"n6/`sڌm>Y ηr3[FyT\<]WvߜD;3_M} X'qVci>%ލAaYC)LZBiU#Rq4gT+;]KK ؍>H1(QQBAŸ?d%,ߚI Hp*w^)33;pk:0\Tcu3AObnRhKܴ8!L5p٥e:E>u>ԛC}?,i>O٣[9w8S{ K9B\XPty`ehs#!lK6"91W]JLtrY& 8F_ ŘB ŭI0X7t?fhVC،DqM=Xӭ|jOq2-I̷=SW(R#O*l#X٬_+w *#W/{<$gV\/Dk1DZ >Ჴ-R9)ڎ쐼 )si c~I;m%x22G-|ƨ>O 6nt+Q# e{EG'>⽉}7ƤYF"Jn,K{MjT<|, wrʭ@;д3PX1ݝ$|B,x_*Sg k~ّK;XNq^l*מ=CtSs nU_]Sː#$2?scL\r*O fč2dgg`{*&W>OUٰ:OZ ?+f㞸Wb n8$h -A*L`GRX#[HnA]Ps!bD$Hܬ5f]y+<[%1=aL':"} p4w[CmE^i ŸRύp \*wlx$`[B\B36;E?.𣢟#Lc\Nt&p[bL@ˊr|t>zj#`6EȷLB}?^ a|y>+jf vQIȣm/[Gmr-l Q KKl/:tαuK˰d^AȐ<FJ1 ΝU_{guFԶK:-dap ..U `:*ȏ`׼ws]4 O8>1jdpo:öNAܖf|KK\YJzu,QzCmQ})$5@ (GFi Z`%ߒ3PP"̺篅֯3oy$ {ƨl[uROJ~@<6;$-')iEjҲQO/QS;0l d{kU>U h"–W'-gǰl{ho=fU“&tz:f̍eީ#F0QM{4Ol/zL쑰|QG΃;pאo#D!ȕp5/D=TL(&c/,-C5#;_qKTEnB 8A2엂=`^^hIܒW~c\TݲO4/-p)m}6[$;@1mIz4x$ )a^3~2Kk wb1GQE$` `Ie/ըx;7|Gh]#f[g:,*A0z5Á0_'ơEczB&a>{څ2G}>omH}ֽuB(p,9[HEk)#I(3}z3좃bB>GI;i=to܁KS&"{2);yɯc"Y?|%)K<>Ċ{)S/iVxƨ)f4e.|`f׆-#k#=!b+IH1K!ǩ; )W0bh7Q!<"94Ҿ|;@ 1`n?ԗ7 Dlu -44B@X% DQĝoQ(5 OggnknէK|4F? 2uXxmRM R|IJC:pavd6 |΀ Nl*'$Y6ܒ_Fgj6 ͪbr; MrU`u5uXNl3Fu]3a; E z@c cam^=z~h WQ)H⒈:1Q`/2<>;Mq8>F~wt@A ) )ɚ /O W\& f\RXAx.b_K \Zz?-ն^=T#;nLA3 4V}TF2l6XЬoCj6` JzcgkNY|_ۡԿ'=An<޸*H*yBer|N9$ʿ4?fA'`Л>Y:룶T?8#2\qʫi+bۘEu<;u&ESC m!@xz4}]c/0>&6ۑpatܪy<΋mD#oUҨW >S3d C-6wqpa˵Tծ RU4<]=†wXg[Nܨ]F5K0e6{M)t I詜z@NgDJ_ΑOF𶋖œ7mNxkGì;QTxrɄ 읪eB'pgg~q/Ҿ]BZ4 ks\H&eF&h30̹W>ӾW꫙2ev+m92=ͳqGg&ԍ!7KBi?G}矷?oڮep C)pX3TTxl8\{nͤ57o|LjZӒb<u ΡB X  )?8sŝ_1''o[x:.vAIS;\- _x: _G=q;6Gю?Ei綔 NM"5RsT4M8qnb~K/3? |179Z_\(b&t_r}h!c)>u©o?a3o`/h"ޅͼv<r+c i"3keKe.fDv;pN`{]z4f6Ϧ,`c#ګM}ӌ|Oun}~_ _rۂ6}>2ÌpbNH sK96&? oyp;i7B!}]<7rpbz ?Ataw iLc=UL9KlٮEf%Ϟ{pK?ԗxZ5Ah^y8?eb* V,(meÆiЩ۪) ={&}m{SBs> stream x+2T0B˥kaP$ endstream endobj 2587 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Cube-With-Ball.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2601 0 R /BBox [0 0 600 600] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2602 0 R >>>> /Length 962642 /Filter /FlateDecode >> stream xܽK뼒ٿ8#%d?BٹjTT_IIұ"3ˮY' A?-x˟_v;ǟǿrwo{y?}_)Vst?V[uiYsn X_nuY|Jp_?HkDﶦI,aLcۦߤem]3_AqH ָ?ssǟeOtx{te=O{{Sw1Y[=g{|8uqhj^oG|OCYv!&mHo4ƻz':B@Reď}@cBN+gHZ#|zGy]O;O{)eVo\kC;3ຄ~aj+Wo\zoO?Szc.}E?ct>\ec=\ojx0ܻ}dўO)7CeÕ|jnӐpSA9S1һ>Tw⸤v%AoxJoڬSjs[ө.tؓwiKLnnM;t^26U=LWStIec)iƌd1>3|H> @-͛ $ohHk ]j}|:Ee1}YgX.ز g`\7ZNi,im%~)3~m.aꯅ:ɪq/k3v= 6VO{ C{g*:+νEֹ?riŖzV/\ wΖ%nZ'4琅u/麚+byw_-9CE4obo*Zhx|m[ nMqaj-y,ᖎͲຢtD•omi`K[Sk6W9,}{Xze~p>Ҫ#}t7sYbL]6ᷪwсuFPt=zSz)v\ѹGڜ3T ț!mL]ѭ.stq#n [z삋Ӳi Ye2r絯8*@"ĺS`=m$y҆AX7א* iƱ]EbK_ /{V|"8A,EC*:T O>:_pŖz5yy27.g%{NXg{R\s:I2Oi^@Ѱ.KqQTJQpԆ%x,^_?F~'a-`wtři ݌26k B5i( Cr&_c3"Pe~ Vj<*n|뒪{Ίsf_}})iɡqbnW]׈轆.g5s -:<qGOkk:2Fwgo]gt|6`u?41^ֲe͑מ5NL/4B2zu 93 =CTux,ܨL 4W4z3z~IoOm[سb#J񰂡b<֤ס%_PYߺ 4,c~5EKvI'2a >b#>(8}]#bKt /}q2tgZPCxIs|w]YةJIy> WF߯cW?Ct7ïk%WǕkK-\"OUNWshӰ1؆v %PSS@tJBh '^9Vճiӊ6 O{E9p%Hopl [pztc.iqX~Я\^ű^e#33&c aԂ}u\z⧟QXlPo?& )1f`!Y3DH!6.gsphj֫#򶉅[znwgy劆}{|J77X=d[ؑթV$(jen/ust:I^~*v's9r{!83剺Mp.`ޖ|FK;lxZhYo3ܱKHG9,{+#d"4 = 9`¢{)E&`qJNp_vՅ;ĭEw@3Vkr.=pZKP[67C\Qw.[V4LcYԈ Z]˴ڞ}*>} ;ynQ0P5*XQjFX[0v@1BY6FxVlY- kG梵vQy S- _#he}cWP_H\o ljL`^G􀣂o 4|tfT?@yHY zCtTƥv OI/)MO +t!i]$EI_'8?=ଷ>_9:YTq )iOOi k'H K7ivk{#"ȗ.'}QIo3yNv̋U?aвr|5x=2 9 (w\:~4I͹uWnвz6g|+-ZOςV~1q쥸La?n $mc'iW3!1<6gcV~aCxݪп|1>O9ijA~H =4/Ÿ`еaٸ"*e~D񷿒4e8tYUvc-&eA=S  ?XIyM2SK/VTtN"{0 x 36e7c7$vm'H303]$ґmy@#::RG_#8=`GNN蒾:Hmn7 iOT-]DYs.^ ͯ4Tf,xa| 6N>>թɔ +I{|ƟݒEq\?X3LDٯ p0q%ʌ]+rX_}D/TKl ]~Og%C(P8/O膘P b| yX3qC![ wеroG;/ <5oSMF?:ـ3U65c`3q Aڲ0";K7+=su^D\nFRQdͥ>#a&6rR#jߧϔ6^:YsVL{t75Bi;9:K SDx,i7ЪZ.R@]j[M.' uU `zO$ N0~qYCג1:jpOZx/K'1\8YO"\cx]ɥ΄ƥ]<-[; `mK614>P *wU"DR[QI-kb33[ -+5c졸1FX_2U6' Ic =ٶ=snZ{t*Κߙuk]+dtz}5K\G)5[σS՘{A%jU^[B4BMP7ran^|C駌ԾpIK7{`si` x߫7dJ hϸN 7-^ޖzHHŹHFxl2P?G5#Qiӛ9+GZz3JϿB[[)gtetu=`Lɟ8 % 2ۉVИ}Ne?Td%bEM :ƞvsIzg%~-h>bۍ~ze\c`z)覒=9@fk$'yCKz6Dq <%G ׀t;x8EirT-L{čm"bx4CFN-]č"0/ 3FcIߌepT[/0sKo|+%Y~lȔht' Ey.n@!G(P#Z#{!kwZP&3Qm ,fTW$?T-|̑Mʜ-EծcӁߞk%ILy<ɝ-9r:uPtN*9znּ̯R ,3{:~V^OwwLLNsWJ2]/ǯQxHt1Yo|Y!KۤE &* 442fCp-ɦ8q/`ܮ-3kfNd6S%~LZГ,L nyNU x鼧w $)miɥ%-zL'q]w"ЙeR bT;]6"ҧLi:]qe c:3pxٯ-|OrgasP{8xƪʟ!c|P耊)TIy`@\Px^m$m'B֋{f51TrpҸH6$KGݒ 1+8E7CS]H-0ª` $oT{׈o73 j9-wL6\wf8~P_xK7QGNz_=x9 EС=prV(Ԫny1WrrMaؗ\9oƔԜݵBhU*G8檾}iʇ>=K* ]FѷFnT #$4*^ir>iPӱT}*U$9=-vSS~ ~e5 E 3{bcdg| GC4j~+Fl=QeUbҭ85Ч@'Җ@!s%Gl0 [h8}%7yU17:` #Cŗ6ρ/':f!5Ls+7>qU\^ͨXsY*B՘Bz^òy}beWTRyS%ʖ1i@::J;_{HQ2~8z#LFaO4hb.Sgw˟u[eVOƼd0PKdTZz3JO> 'Ou ξujPS1_7ݮu=L7\|hYxcM.sjG>WLs=mϨ݉^Ø=='X=5=U =~@X6dn AUء= ۸9?w{T@7, 7_r%_Z٘Гo(>ik i;tYSГnMα?"ܡ!ÅѤVwPǍd >GsIzږVыB~;5Lwf ~:# Hz2⭣ג%qAsP"p0]9M\u#V%BKz?. #&pT{; .wiYi|ź{s9ԥ#. 58qG|Be.8a/nxѿcΪ _Ԗ[&[D!D pBЃN܈!^N4$Ƚu4ZAa߶z^S_QЦPY7Em*$]EٮTƠ\BZ8 q;YluŶ5A9qN, XG'R,ʻ%)heR.ۻm\ry{-S`Fx@| /]3jHN9qBD{!^1d5Ie9${"ռ)iOP TYE"OXRL @X[JLUq_o>Ej{2ь䤌jd iePCڜK~ qd-y3f`No`+lH6H$ȕ{K%[yXq,|q/#=5SkIe559n[#S7WtÌlXO{BYgV?Y+2"g^Ud^[!ή( YaoAƕ /U" cj2B۠7ypnejrH#Vvd]:80pxgqy.݂Q' K/MrCNQ{WEP|JH& 5աZуp*HTSb,%u7()nI7ۉ˖ό1:toi㽀#NABq$C-@:M4wi\>FT 6t`̎8UҦ9+iEDy[U0Mǩ|rŚ|jo PMgi|I#[Kd+fvgK7CSP5Vp=7bK7{VqIUe-'`JF}րu%Ǚ;O1,Y5J{FtSZ\n`DG#\tNXqk~n?}$Q#6azcoYX}sjdI>ІXX膎 D#Aj`=rQn(aJ}OoSFQ}Sqkx&:qwnf͛ ~yګ~&gӤKifڙT܅-+֌\€]0p8$A7t۰Sby7jxXG ?3E(UkS=N'u@?ۂ6au/C P1~f¦:5-C=Hq}W"D蝬H|ÐLDO$`i#N9lXTmx7Fwa6V"J4 @vGܔ5f.~I7ʌƎWʣZɼrD!Q/GYSHP^ u@o]9W|&D T)k0>c~n[U8[36 f!6-JBb[)kBMp@ -)ת!rFwCWy2e7@]JL;R #Fݸ{jғXQW0ܬ@y &F0zОVojZYD.gLcWs!Hȶj ӭ1B#lhy@uQRbcc2גo.͖ -+&\BVP"%#/YWnITmhFcO> JOYyctԬ_HMuavh}3p: A%N% Nl‚930^u/zpҪ$I;Yo(m5l"Et\A$NaS1T缪)o m٨lm!!VkG%U@m$2DN酏C\4gYI{JY , U3D|d9 Y&JؐtNe̊n,O`%1El E~|5ՃMnz1z'T *!}޸@,2| [TgEtj.Ndҡ4bj˴>W G W G{N8)EI-- 觃]mu3%@CCoؑn T@jɲ.r~Sْ\mL C>8 IP[!RhTkb{\z5zyk\ GctW͸ l"e9/D4[avWLa~cκҘCʝkf'HݐCη䁌 -;6ܕ+MV~ZZ5ysx+v b)qVp5rNg XZAؓ*d d3)ec՜ 1FzDNǑ%kgM1Pr[Ӏr>~qNZ8W'3dZ~]f4ƶb-(_E &5)f/\D6$^ӭ{j- ci E2䛛kdnOW5"FllK6$BWb-94##_+pUHbV<0/ ncl$J*+Ka. LMiRˢTWf[ٯ}75W2\,"rYj}k`ǜnd}gHK7{6dt/ ֋fss\3~5Miomh-1gĤ?qcEevG6^` /[Nbs- :V;`4t#˃pn])a~nsh!pB[%z_; ZW5ćhOJ)@hXuP< 7R p2cJ7*s+R<'Ձ+íyZV~^T V#(j }NW-݈{YX}t[[Mhrıg#-]BYX6*F/, u#W䗙aλjF(8&|GL]Vϴza!&%KUW碐H9* Z9^'+Z ;ۅ r č`@ RuSp_` [[a|׉ jwN|<%8]zQzq\p+Bw elT7K8][r9TPRlYH${ )eQcCq k,Vv>ǥaqF4Y%fRes/ޒ =]u.>!tk[DRT5j1FwU"f'_Az1`iv^' <;2Nw6 [V)ewjOjƔUmԨ=|05FH3Xi R.FS8 m{JV4 NBiWԯݎhYoƃ/Kyζװ@-KA:#%󧩼Ss7uN@obU[MՊ@c|Sœ@NQR}Tp_rҜ77n*_U)eQ߮Uu;=:(S߂۶Xmo53UU6P1k Ӿ.ƘD"(r x0bct KD wtt&mtV237M6Z{҄t\jy+R(;Ë9Zxmj$+-1<[6eʽ| Xovʺ*j 5F&Wpy2 3ƿ5)@QdmݝPCWYYAfM# n2kWp25*$*Rی^eF#ZQE:uކ^x y$~Cl+-$=Fg1kz.!ƶXU 1C_ [|G%J/M= 7_ P r20*~d?. LH2FwA tSR{ڣR[U0+=2ĦTaIμYLroҢe5Gzx+@pa&P B!'U YEh#tq#ON2gܕ``5y30sP 59&2{ N C$v_&(=`;]8@{&u(6r q HQYpT]!oɾВicu֨ke0W==eHġ`x DqZggo SXpVaF'u.}^ޘ#eR'hh;ڛ^^Dhti\8 =[ f鿷39DRf"#tHkmvɀΙtܢP%eOv/tY7!*kQ[*%1E,XplTtq pI%pLԒd4 "i'R!g8#8BK{Vyv̚_IcJAļ3Sx/\^o]ҫեW[]97x?CPY%+*;U֤/G9^F6XqCs7i5lChU۷MV]@!cstfxRZ.Fۺ-bS6O:X{ WHH5uL{a߰74=m w;Q4o+u/H3p5C )wx-3EL>~bj/gpQES=hψ ψk(> ZIDWӔ, !V%XDtN@YmJ4UuR \Z{ŀ$b+4 lИc KC.E=b$u1z+G j]A$_ ӚHw|07#EѐdkzH<d8(=0qHX`Zd$5fMlDyu.]d%`غ(!Wq+x֝F>k 间q%.*zoshuJ;Ӊ:!уr~y%@S8;KdG6vj_B*ce3p^J1-Zyn̕lL}A]F&Im|^sܚ !iibKFK5t- ,Duf̨'!N~b`cB)JjsG`BK{"PZpPCq`BQ^WtmYqum9,rr3y PMb4.6q& \2Xm_gJ+A#BG `̤MUqbeC lH!%ls0#SAYT^^z8&PMضDwCP7{>nVcE*KJs ̷9KQNNf ;P.;:^0xe+X# _'ǰzH٭h'>mGthoG×X|})}7m*:zg| ΅n/Wy-S:fW@chU?61ݚ6Ԝ4aV6= HdžtP<Bϊc|V:g5=1Ȏqb ó[)U,d&h8&sO+WkׄX0hwF,x,1F"a͞^M"sH7y:һ@;9juн+=>)`O-y/2CˊܘghR5$o 0@ iAL<|4B0}Z0`.i%@~&-Q@ݘ'eR9;ʜ> ɞ4Wm(4$$~LZsjOϸf='ps LRk)xNc_W@C;c;+u uw,3} soLUK ~e\*Im vEY +Eh4'B=i h8P"F R@h};kZ Z [}i!k֯xs*Nޞs7𴫧ᓘ_։l|ySA4dDFuST"v߼γoK]6B}79SƓ~ i*U1@*`Ig~*8X\QDN.^!>{ =M}.$=gRDA1EM <2Ә?I){5ӹ .BƯA16%cDhcoK|otu{Mh\̏-,г(|fq~ whUsx7ws]D &؀+sY [0'kns!Z"쓆hC,{ԭy{\([8fiMtN]dh J :DKpwWC_Z&Ȯ *U8Ъ-3:^]B md:\b PK6U.ˑXK.Vb1@׮mgn :cϩ Eajݒp!."H faeKG8F#+aa/$1Z*!(1.bej_h>-U{ya:YVVʁoNw>=QtFmz9$ 4Ɠۯ} \*H HitY@gI ozFGAh#`KP5@lua`d'۟hhD*jnjit.NJsU),ȋ1P}a<4 p }&;X9]2ߵ b( RW55?c"5BVeLث[{Io>I|% Ťɺ(E4'@gJJlE +G* )VBhj=`XI1 Iga4# bK){Ji'l}u٣8W./0uʞ=J?PE[L /GEMȎ$=&R}ecmDǨqh)o+QIH[$DH2q1GA'RlBbOA]1,T 1`jmUe\p+J4a./u0t(HCZgz΁9` A&O [ znXij o"6m.J߇s6UUϱMoEw@ۧ~b0)WZٲ7fp_j_*= 8K>IM<񉅀DL(*,G8[5~Ho}$-]HW am6'sO_6c9ݘ{L'SdRB"X/Ǐfm/Cl\f14vci.AχR3ڃsqa6'45Q0Fh98\@ & : ~[9kse@9[:<(G}-n:̫ߡʎr]x>P_TmLwPP㪶PT遣i,+Ҩ, | 6ľf 6D.[? =b`SV,U#נ{*4lXtT? ],^7uNY7CE5r, #eX'QDe=a[|Mc'W Y;Ѻ|zB0Z t:eap١Yn]mD>wA5n'>VTԠnGK.7< PHViKQ&nUO,=V1XJ@J&dZm$bj3maշYKВ)ߐY_y-|s⦊C)GRJZ3FĿ_-q0.,:V5=xxP5o5Ms\u] *'j@Q<vPO Gvveh$bچ(9Ī5mTv{Eߍ ~dIS M=Ѓ8ۤP Wݦ%:P 9yD,ǮxT1jeWYjD’`X>>![OȁgbqU!([@KZnԗ&]e>Ț7AQ"4jOiAE7Cjw GŻBx0f+g=ܤmC;3fKW[Và\y{9`%]dݺUI@@vRA'-=<A^m򢴫el m>| |zT`A̛y, #@Y .Id]Xz酥6Xȴ6„}OHT(ʲG'cIЈvOЍ.ɰihU 9P 馬c^khUEa)IsLo] QhUGw3Nꦒsz{hS1O9jP\=PV:@PqlqQ9z4 oQT訃yŨ=P Ԋ-Q #AqQdf޳b NჾZiEgIyKk<, fo.F6a?{.)04B,TtϩDWTOra[Û·C]&D -"c}H-PL!ݜF14F6^#"F utŃ͋Ϊ02GDC4魼mQ(*+I/lU Шb$vcbӴND%Zz~CtFc;_^12z윰+^*A&G5,A(Vn3V-ۣS`Z2,˙]`jp3W}49޷*dWhh"Bnt4 sҀhj{yLx6-,uײunࢨX/ԀCZU~nVBFռe5wbjǘP[vS(lX(B BD)i@Qzt_ehY3fp-FŹl >dsbZDWP?EpWݻ,/>|d;{os{{{QIqCwMv!ٗaot᧧Oke/.ln ұ˖ufpӊHצH7fwHTa+{ejU;ˆ6LH$_WX>Ϭ* xhiPyAFdCs9 ~Xt Vq[xS2J{hYQڍܼ-ͱ]G qP _X^wT1\hִ^Ö7lGiѰD9W;%t1Vfjbq"i*sJ?ņw1@A(ڀ@ըl=LrujQDV5qSVV=o;P&Lyל>#^"Hf3biSZ쬡emzcsB5B5m˘rQ"[)g%OVhzlUKknus6?),QiZ{`›&6HnaЪ0on'IyA/B9@ Z5)@~t'֪_@-㆛LƩ-NB'hWg6 t紑]SD;g|$EuYH ~ޡZڙZesGy²=֒X\ WanT`[P p cJ%t.4! KeE$:JL#.h&=Dag~ctc{ŝBYR8,Cm-0tCӚɒ(^KAG3f )G#m;1'bP]ɕMH<3([ٸ'ǾHcB7R;s$7D#WcBecp Aw[Ȼ{qߞo[ wsy46'0_:E4`=ͻS="t XUm&9l$nE*U*-ݬ/`}.R{l,{Wk,nP 8-L"`)ӇOt]n]/&n h^ƱF{au*& m{1 <N&d}Hïo[wf/?~{J#~ ]SBΪ6iӘ{%\Jt#1+&`=1@ f%U2tsx|.|jCpW>c#MQuCܗV"< N 9iubI:M$NS5hU[Ei\O6cE=$[Od>fmxabe?Q=pwrUiJDYlKX R=$dLRQDSV#yP-| LGd1X!,\IRE܋hXֵw/'BXU=Lal{b@2%a䭠ZS:mKގSJW+Yř~Q/*݈T(">%yn7*fQ@ZD^nf k~Ľ#Y8f2Ϲ7|ݏp?iUI2Fw/D&.d0)3K/ H&?_ŝ~9%Eв4f`ߧ:^vڌ.61*Rrv*V)XXZ9fJdG)Iw/Y~҃ڻFz @#*53nXA)Vb;HKWZ5۟. J,qgsym?յ;j dmEb^p 1(ԄX@<RVܦ]5? ߗ=~ D ;)F봻(&Yy}ʹ &|_^*%<\BOL#9k!`GV=Jg+Zdsm٭c&OfSYuو1=ʜTj,Ie-|m)eLV.QVǾ߫aU,i+=kt1O{f4IL挎Qok _-n[~NY>B5IIw*./$\B nᑮhN1d[UXހ=oߞү"7,=Ғ 2hLoeZo{cfa.zIb#i T[PJdkE8o|>wVʖ*ܜ'Bdy"tɶ"!2k<@-UGVb1 @ 0QX5n(ûr&x{[2A!swHSMA5$.AͦX L =QlN雠IZe;ؠftSŬbv)̒VfW@Дg|JQJo"ɟЀ^իQs;5IE/+*zijQ/4J$~tӰ;T_|eJc?U2Jr^S0sǪ,ǐ5zZ|-V,\^daug28n3A TzE U7|:P1 2 9́&d(}_n=b_slVZo雄H||oxRU0ꉄ.EG^\x7uFw>6EL3xYtPUNsFJt:TJI!hjcNUYi,Yv+mDUA!7u{}>+Sb%K93pzV/\IYe.}xpV(,~/{VnR<a.ӆ~`We:m@ a}S:u=(^ UտJJt+8kΡfxD +$x|Y gU鵢Evt8Ǽ6gW̓&TpHRPxI FL`49҆N+.|TSŠ^D5H̡fn]s#'h+*dYM4'G8tuq:?Ew>$PctL ʣ-*(Wô4MUOԺݪ\x wA"r`뗵Sp /aT+$B!҉O&Xأn R_ PVcey;F0e [L3&oN3s: >, oˤ>-pO Mr8z~{YNl'!9EC:mg8TX}e0r.$]$鶛X5$P\AT\.֖Cט#IMLⰃiŞͪ;v҇4JQ(qU/̶DJx2=ჼ6UAT V&)*JI@xO*v5Z*Jotf@i%rH-F%izVXsl;l\'$cZ7'o-Ԭ#3_<״wNٟeJQD`ݷp0XL &# ~MYlglShlG|'"VYȭ鷧K7ָNs&Gh̺A(cSS5j%~ʺ0f'ie +kP5iz屑7oѳћyeOe֮@[8- Fi;Rodmdj#w%Q_8hTd2pD$n@w/ťe`;Jd7#PW_? dT?0de˖=K8o;e=tD`ΈK F .g -6_M׼Ƕ^g30+S8mhC Ad@ծJ9`}G߰f{J]x[?nl_PT!W*Ch]BI! ϡn:s(C= <$84$ 7S򽷓:NŹ%Hm8ܧ NeCO#td}<,ٹMl#71dK+*eV ?MةfMb[C=EX˰ϸ̯^N=a_nr _Loף5Vp ~[]7D =GQ;${I6_ZmevRo~SDߞωG4;nC΀F7B)"Ց1 ~eMV:$o~Я!0kcΘPߟmޒٛ |P#}YBJ'hiQe^IEEG1hb~NdqF1ד: !e\i_ᷧnq[U{h(o~ZLvD!5LJ.|CIfe^X)Hj뇬SkLj.EDa 1 n0վ̗g7ł|PsɕIMD']SR,ⵊ3CV ʑ@A`9wJ8Į Nd޷L"#HwUf9l;,yH:FV (Mc;=| OɎι3Nuվ=pI#To#̀/*g@?u4?c6WDbh%"%jRRf%(W<蔐ZޕS ,O_Wթ{ǶzoiÜ~{nzQh!u#~:~3aPrHg *j1I۞TmU9!Kv( y˘گ~GY텲e:{{.Ϯњd0KkwFTo7E۔ݰN?lxC\i+=+ppHkNŸ2*Xoct{>MM}۔]VwF?" z[RC?,<.'64jK=hS9Z#aWB]&ǖhZKzhjJ$ib)BW|BH^lW Gú;~\|e=?C) =kR_#C+JWR#M*3/\8J]w8[ËjhP(˭_$>[X`Qk ^\E]%]~ S5hb 6PtZ JG4a]F 3: `JYt*m%Mn{㺋q߈g7yy>6K:'鷧 Vi,н>&O*E֘g〽6*d_x6bЪ^DptNry^]U>k9]Nʿc%;~~{J3|'nwo|7ʪWiLHg֖f*{\&(P@~TmMh{|v8+1U욈9NVöX(s'7dRRVs/@|}CcK£_x_We(ᷧ۶[w[Vy\ӌð8Z /um[d.w?%O&|{pL-iﰾS5 <{ctD>~TS9.<'H+^27cQ#m*H 4{y5fpS®I]X=:+V"akMpMx!),7a1(C0$`z&ai (35̮\s tH 2zeP .HЊt)SKX;7b=/ }ɀb޿1Rs-^RPdD@< 2Hi+b/-AHEufRVr]Yeˊڞ Tͧoĵӿڥ aC!$ ^pS4X4 HLUy {BW{| Bŷ5Kk=c$BzHWM:Odz1!GmLՠLh|GPvێJl'ٙ"!HEAn.ZaOZk P>L[BLzTbBC&t7<),ePpYa>{bK3/!qKNl~IΪnbӊ7H [,N oo|Gkg;ߞҏ%+e;I2ci5`pr=~h"VNyLq(ZPŠy 0>_S7lQn٬!G#Xpf`_qJJζ6C݂>3Fe)"R/t.=%=71fB՝Sݗנlɚ3p4젇M񦂋[mk&:Vf7JsҴE;voG7lʄ6A?VQX1^Ko9e>fJ{T 3vk3oURn&+: Y,MO ln2rfɧ̭Mޡ'0fd>itbid[iRU\SDA{c ^n/b;6RaKצF!|C KG{#XYf zb=cf3.~@)Z#keоDf=Lfv*6< yƍǵ&UUd RQZ,:,<">Ör G{^aUe-О'ef(Ϧ͟ގ񽒿 ^qm E09F@6'9a$Xw٨nnM>{tk&9ߩnoS]O2;cdF@5 IjDМ[ZN09I${ĹiQq(aqgף~;g&V)'-1%8>@D[$ al DLI)M1O@^/l 1$`Et-A7Ұ}J)[V KXӆ5s4| l_FyE\yq#;r-Ij+=Z7x`xqK! Zl\b|FRFF<(J$HcTH$G_"1qb܎|>n?z8~~{Jwȟ$"aܿm=oOd#k!չ!^չ)du|Ν6l@ų&Lj2g˰<#[ G'p+*ɚ,s 3[Q˭1>~U^WZmUy"Ee[7&~Smc@eBX LsV@㾆s ?=Cٛ>;dN=cH2=[o8O鱉sˮ_w(d/VF$!IA)V22vwC2QcOv2PJan?5ؔakgzה\~uYB 7I|ҨKfbJuct!zFVhJl5_k\s-!|p z9Q{U@1]x:( rRv QaKG`9XӖ]+hGaP[4m6d5^GUnٲ +J3)9IY=m[5pTB&ռJ @@}MIm8O' z6 NFi{liZnYQ XQe7);tw.5Uʦ46K>Ú.lY$6B4k&1:#5sŝBϹ7^ͯ(8bSqc~S%07LZѪڌaSv3~{JwxM8a'~%IÄW\bWGFI3~ mg  numE Y7!tp'YCN8X 7Ȣ%C1騈J~+;?߅'QxxTNXZ͆?8poIBJ$8Y}VϔN Z:V,[GJfvM!/UL9el3r dQrz(yq"-+' .%$RAQjxB"wD8'}>j)jנiE`sڻ!$`˃ Бh*!MJbxj:zVT|+@`o_uU !wO3㘴QZf4ו`3YV/S:h^:3އQA[oS[JCj׊Yktʼn n2q6_q-q\M;˛uzK]LBDȘ∉.byo8O#"}=6f@5r1,W+k[]~H'B[h&sUDzodU?5VK@-l&7y4>oO<}Sq is-k +U9 H:%B~n9Zr{xCkCZ=1ESb(ލ:an*Hrb+o_|bϕOGB@k_'( ])).T[ұcSh@ S{b^) PuJ5>Qq̻Ͽ;%-гJ'}aXw7܊-[w6CB)&Y~)njNJKUW% ƇW/kA't$^5$4'A(xc4P9dp 敩 zGILL}m?Wo W `b rZxn;浇w h8& Zy M&:!KM.BbX]c]?ɺ%1ݽ{Hjx~{JU‡w7ջQ~-%Hm68z< 1Cϊ_:nިZ5?l4/|Q&G'L<ҝՃa\湡O}YNQ!jms_z[x @0WBV MxN%L'f-vED=SApk/SAE!5Q3S6NEN=cSeh"E 6Y}ܓKg,WT9<')|!׽_I-.ec%$:Dqgn~ǽKEˊΘ{UlB+ M9nZU0 iCA+=%-fH˰7HSeQ`vs~OVs(sw96 }:YINک2gfʀK4N_eKNwwf5R^yڐ&^0N阅V֌+"nb 2o pٲ[R|M6 iDuc_dWD\ܠE5Sd`w@rb:ClZ_5]ޯ3W~?^q{BzJ|ݾ0t ߞeC]!{ N+0䙍Ov+ELeģAm&< % j{24\J3:z y^_ƫey-Z:W`Ra&Eb"[\}2:^P-IAX?Vpk$?Gsk1>@t}nn=GjQsYc BX+X5 ngOrgd YߑPfGG^W̵xxڄ(m;[|DX4bc`icgS5OL7^gt}F@֓*]МȲt`0ҍ<#P.EA8QYtTa\x K7` .! }V5s4i4龬*+t+5Ȍ4:Q:حz꿀~G?R`ݑZeZn*{J?#Фs;DaNa1G[BUhg? "I(Ya%;a R)K1kS{XTxT`op|e#eq);mTH&y瘛5Iё\ s[c>Hⷊ#e{#`Xoyg76҉<(-bVvPA sݜ+~ؐ+w|[0o~"KeJJkM5ߖj16ލJxn4m^q!Ò^dG`fͳDL`]vzh7f@5?'6͢lOWlԍp ?ۃ{'I VSrrrTPn)/kPRV)q]3@㙂U'[ Z jU?xMaݤm.'”À*qXE61(q{oR;Z8)+ @nċ,&\ë-m:uEkIgMEzغvT[ϑ]-;-~g& + o]nG RN::X^yKrp7֜K"-+~zJ%Ql }y~?T`yo=c)`9"/%xRT &DS;~dHOAl({-HNNojl(Ws6H'DHȉ@hĎe}.m9>h$$~4FE˲E|S[V PWVlʱ0[~C"2xY4p-;=l'ͷ(| "@O[<}LZp[먖eRޒ6e"9VnK_iX@$e1i0ρ{ QAu)#%=Z /zY$,d N5aRCK'VcИrx6-w{LP"퇲z v{_bݢ\Tf׋timm5ra/~{J3uAjppYnoO5> P&e:Yr`.ZV"  I/k,| /HECc "K.5tΪHlP͒[鰢j}IFYLU3$8UÌx_ rV ;cp3RƾAښf9c k]Nu7MƣԮ|$% (T tVhWf[SF)l֬X∍YHf c qXZqX_-t 5˘Pa[>wgQYiЯӁO3LB#b-ha/)x=ުVt:>ƪSg\nHI?@+-"Ag![dmukRhM.Jr}mfױR Gk6"&nxnPˉ+VkN6ܻk?stk VoOmOo&*noO,E-U oU﫹Ôa #ۆyݷT}OoOY Nc?+q)v+&2·Y YnzV{oOrsp ҩ歳yֽܪb[s\7Xr'%8}H(2CCq١QȘS(ERTUY9z'!@ etJN4bR@dk]!ws;fђZL mFpwvbǞM(|Qi>v%QfVgz[M9n~6>FQ^*>Le94Uh#:ӲctcW@Xtj m 眹>Q^jnGܬRߑƩ oy^g(;aƌZ}p?C{%਻ "e /U;ꮕܒc9in~mĻ_I1d[; th%s 5j#% _$_ nu?LG:t). (Wϡ% V]sۜi o`%}|w*@&q/$`Oo)E܁#Y{$vTH|XEӌM9֩i-O2QRn[=c:ks}h'2rSrzo80p,۳u \tҎ8e_ئEvBm ғIsΖ֭ZIlvgbbi dfͳ'J 0x{ *jz[ Cl/N90TnJI@!tj yGW;WlО|HF1g@5*tRXԫ|yb_0 9'+xyD*ߤ m`TԁuզADh.ִ*5,m o/ioȐ6~^gⷧ2dLx#7՛71ultЯu\p+t"Qw+N3J0p"}2Bcp <ХU_ %@/ee<7F/S;AJ1%-) m\'a_YI|jy;2>v[b?t*5 _sX6'愊L ,|"\!Gs %zϒIi"JTe8{F| F.ldtfpq=A =[v +{J/zeD*rVc%H+}C= m @˨9;3%?\(̻VɡF(#]mWml?P$AFh}Ni"ѐ ɌIJ%V+{""4 (p&e@7k VBsB3zGśX|V$wRM 8$B[h?4#d!*؅{>x;D%uM9$+P'b6+A+)<%Bx >H;YnTɦt`_i9d?qI'b=Ba⽪~G3H8%YR.]5۵-KbB?6tpC/JDzM@R%J5PZAyS?](ɧ|/J1g{V/9OiOG UB(*rpJkm?M=q> kYR4ϕճ׸ϼbƛaH[8d=,-9os.p֬MϑB{ 0H,"RTM[ o+A2pvfd&d&_Dڰ^(a)=F& HyN@n-RLQ΀&ϚCpMw4W *z!`3]cNeǼ]ad+"OtM%%rLT⊗4ʇ.$02$6'_Xc$מGkKTش\usLA1YmU[4bԒDǷ:7E[fo%VdO)MXo{,huWy7}LuO&qXQ.0 UJ)!uSFqDPgfLcϫ oHwܵ"}c FsGΩ5י .,0 [T^({1>-9Ld8}c'!b/<϶1c)+ "e,C`횃&䤇gi}0d&Ֆ`X F' HK{,tmwz<7!,0 `V-E#Xa-w})!"kaԩ̊|_$k3<(Ȋ%QOfy1'sPat5WT9 ;4qgj ^5$83"v ѽcG&Z8:0C>ʓ岍?4T:TEHث?A$%\4>ȨbWRzYR>S-8=_|)EϚgXL)eB=# l=I 2O?rU>E{e1IJ 6Pow߄Mݙ3T*}x? 5>ڵ z L e+qtHb\^OlT1zC$JfZNK>;hn$qF]$aJҪRF%H LLN<FBe.R7.%QVuֵh0TM1]N *r:h]5]WPHLl IYg{Rn 9aׄ^S߭`Г2gH f50BĈD+,,ɤ4z& I75tr 6"OЍBpMx+4jK##kLO#@@ϵw^N: WP9"H@  .T" XkL׬KEXȏ(cSڬu5s'XK Y m;-#(.@b.BE CnXv1AӲq#g!M(呓&Y2T®N4˃v1V8IOY@* x=Y,ŗ6Ha(TL(TrFKܞ)'%%Guat@Xxc#ŘL$Dtm؍[US&6mJ҉&w&-˨]_/C!.-$TlhQQO"G=1H9$A WGRuȇ=A(G0->gў.7pbxQRG1,_GQũkZc]{{lugxnP~wEOVetR`X=-7؁0wj@vw $'>2",h,yTFa2XJ*K |SUL eW!Ӽ8V֠ ZdC RLM^m똞R̬--oiGp̐6m `%ۂbJ@qV[HO0J tt1MU вzw[akP9ķic6p?,1FnD^Xz%4P.5Xp]CO^X %!bpJ[sFj82LjTgFz} Rȴ zmf gÖ6 .=ԋB0X,m$9*QC=d[{w샠{xmhd꼾'+0 1g3㳰=[yĵBSgeW3]o'Ss]T6Ԯ!]"ƅl I:Wy;iM98B\pjvס ~af›ғYӣ5FPkz֜ TVƬ.(0f9ZЋ挙.IF=0'Ҵ@G 'E!del&jƙRkJMY(=uiNpȿ0ikge֖y;_]wW3C$f'?0Pib!H%1%[MŦ퍳5BS;{Lm:>+oYק8y'.pa`2M $H1(3Z paXF)4d6Zev! uH`$T$?% XDjś5)1 fIG}k_/X.k~끳ӕ?m =״_K]pOҟS=㯜Ps1P-uΏ\[._0*|{ܙ؟#c8/k/ k$xKHQ}7 C!kI9>?#iݷQv>â-{v)S>dnE |0WEu_#uc3b{bV v:oճf%}= 0f쒜dY?Q{*$h/>X0To<7ORGhDԮY,ր!^s|kߥe_7G<JV+5G5*_DK \z5a)zo[b ȻT|ZJޠu1>gnW =/cpŮ\T2& )$ֆOA\<@PȅDX3Rgs"]0B. b],H/  c XI<鞗'4sڣ1P{}s߯cmtWYæ`Y'<9 ad$*`'rSgԍsfgz..~P>sH`L;_Upj淚~e\F3+TS. TKqDNNyJy DKqJtFUݧ=hAELet쾶bU\G;+,bE;۵ ňΐ0or!d5@@yR^ 0@iK QL+hHIҮsKcT 3pBwz$1*O!X_!%yD] ƛH|B@z1y[&FR&u#2z\%oKiA%TGiDzZZRE iVZEᇜ$`1.ǩ[%֫tUTqͧ~FiBz_Hx Ѧ3uh?gJ#Kܰ0C,3c6`}n ,z]SDg8X(vbtR/AAض4Yǜk `5VWm `^mw96ɦyLN ;1P>`}ՀVeċr*w,I+!:FJTu }Q#7czL*+a#.28klT@0A`3u3i*wE8h `5MmJ,XE[mØbrDuHhi 1GJ$D_$IIaIͰ%IIYHZ9vs}MbNe[ՄeaX]ˏK߷I` yޮ֒qn!q]-* 4К2~{6_̵ f°{e#PzN,u5'e @i]jqyiI2m=r' }"CGi xoTi_҆+-fiYat%FoH8~4M$K~[3ڰoM>r P˱[|imq)+^j#~`UBP?0;k~?|Y0w>0Y}b`z$XJde× >&DO'B'k"' {C~OlS*`f[7 `&,è.ǫ=H&Ћj0cgup*\1?9;dz%ˌ8$ֈ ŀ !~e;wְ92DxNMN=4o"ԫɖ$).oɖgU@ "PA'׋D`eHOF_QJbͽ$dx;D+L7@o4/ Օ;FfKċ@%lTC[-d6cd9L03KO0 `Vy4 |#b~iLc 4:s 4Dqq7Ű۝%md@;lއ.~{װr4ٵ):]}Ie:ö) F[h Wmg.}>̏TD2?XqbK 嬠ɳyXv\K|e觩h2t]rQ(`Cv>$Pi,>3Pš39t# DUfmv"%dw6n°:Y"*ӣ7)#-nd14z| Op0r}Oż{^u@zI`Y=%0@E|Lz6d#;5>r?\~򋬯B~۩{pꍖ6}"ng,{% 4B~\@> ACqi'k}V ^:*ё;Y3qzi,S%Y!"r !ZjW\Ƶ{g^5!+m:]?Rr٫.E'W*5{peI^s!+x6tqfQ- bǴ0:=AQMuTDEh%6,1ry< y+(7&#rF3C8ZKZB%d2ò޷%"!*-ζ7ɷsyG/ Ɩ#ۑPo#D0~hb(Ԓ߮ySlpܮtc\ oW=a*mY>?kg aIu!Z |[iVl%٨CD}$u v$tjkOw=?caȿh8DkԶC~<-Ӷ%ޔoQ* e>Z !gjׂ0g>]%{S;Ee;`;IGƍsʧ 2#P)6~<#>e˘5WDF?:E/JmTj+)^ 4+kytVK\UR$T|Z9eT sJ)O%A,ńP e.?S!*!ucLԂr5dD##DlpXM\80+̝>AMD s9A8A»U9r{ VnwwIL+*KR8ZBvs".^_LI ] XyH= Xfny׼ TF }M;w^: `WǐE*"ՏyuV6b3EvyoihUm Q+)Y%"K"xõo_/21mXF+q)W`|l}(5R!4Ѳ7(A-L )ٛ7cn{L0>MPrc)J56PZPXx\CceXxC6g#=/%x65arܛj*w5g/6>5=М ~BfKs1:,+^4qg&!9 -+M%˓r*"?z }UcAN4#=,,wr~#rH4` 6^U{p`#05IDTra)Vw) /BSÅjKVqQ,,,y3gHX`F6Hj0DilS$5W_-rW`y!, ?hfC916uCKiL!b~-xg5=ҒN-x{,q=K!al_dY\@L= Xko(!z%O HbNLh{CtAXh2b| MYܬ-wbwa]-3Dh-ILpع}w\y<{t'N v,!G Vj?sS$IR_w =HVtY+>r`eEe¤x,':}o _jvZ:A<ҠU@:Ic`\e"\)'{}yɰ,vΏgLPD7%R80xhÆO1d#t.4xي6KE@` !+v;=_Éh+H [+X G\GEG yO}I+85kKzL&*iЋm*sڎJYZ>49Md"N } 4)„ĴPe ڌȴIabz.%Ft,عw /e;PW5K]=6ά"ZTӆg0zsԼ\=6!{ƚk{\1Xs_ GtZ=/,z\pf._C6,yn~hLM?2OlL3DjRݞf_l#3Ar.ISMu ӄL21"zDx,t<9[a| E~:SL)N[QKNOeUM3ֲL_R~*]c'#}1Z3qGK+=^KQ4XrC,v_> eĪLǕr5Ok:Ϗ`Od#Ja/IJS,TF?2]{_lQ&%w]O>NhACv>)dqT8trwN>SPw7ד_ YJ6+~ŠC"Vs9$7. ܾcMc"8AH$tH-tv)0ؙ>;H\뎁t?0Hf{ƓY aD]p`qYfM{:If3^H.*s:wh^{1,.} /F?2U_2mE ‰Lp6x|64m'f qW\>V(@V_a8bSY#F1` @[)RN,$L^!e.]B0B2z_k `c-dv{ۋXgL^ly )j7~TQr7 gmBleURbeYB_ȔC֝-t?.Mopŗ'!x^ⷿm: k@ ID$GH+ uN`GH(-k}[' w *ҁ*5}[Rqj9{y[r`ԨiE Nv`(MM_ZxtR IVB`P},ɻܺ!0k Z^4Pëj@>f%Gsz"Ѯr<:CKv~&x!87A^?Y Fqe5]_%6`tzv؅B4-UE$!<2YŇ_RԶm_ 6Y-SYGR2G㘷D!Xm؛r`ZP; R~y1~=u8]Q,im*arLUu $@0ZV2."U\TE PPaQ</aybN %~?pds.PC4P?"9G*{ (V=$A0B\N @XЖ3E+@}R/Ko3-.'bёƹE7 A3] +uvi-eBY/K%Kžz^#~#gW{犱sTLƢ-'vH_o([Ptf`~:gt?JVAhOt ZxĐ ?aIA<7^QuX=1uʩЋMU7JޤL7y<.?)sz F|, !<2.r#2[c-Jx-k **hn"C rjJaMmP,U=ƹ ҥ;]=SΘ hd~b0D,(UAR5`uqゥ=?4'+Z\x<|`^j*d^{O z}dԅY 7^ N3|IY6>hѳ"K8` Z{}k N̨UQ}[{|=ҌpQUS{/&&P֣nk1#KzvxƄ@vDCvA ̝ӕ_cˡ*KYN^"׼3?uB= ^ .{bb:_i$0Þ6m]H;Sl#1q,V\At+Hj_#զƄ zyo0_"2m{hN2 ofp~y1̲-$sb/T'T@ @9fM>.Y\#~NsjP*hsl5RO{,awL~ɘS.2k_S.eAN k[:2)L KBr+Фl&%Mq]IO[F11H=ݽB^Ry~OuGzNOY*ӊ Q{)8A$Rʥ_ P(Oņp`b)&B%Ⱥ0[I%BV7Y("/ȩ떫prJ0\ ovզi~2ឈ"T;:KkbjW )N2\M90IU|J G8^#k Oe״^wR{ۣkWk/击,( ZP܋&N=".nE0I]'J HcN(A9̉5 :騀Nxډ6s&N4 'RFk`ϊm.V`vNPJHώ.?&p^~<`ڷ4q|:W i,9F ݯE[;%dZ\rBm( p+ 3V[[tl뾐J`i+d\U0e J_jF}e u(`XA{G1tX۸z#}?Bm5*{cj!zLSh JE\f, .*gYE\{VvCTZ A'8IKL"qtkXiҲrwm'{^c sm+&ɂ®<*e.iiW_: N|0T'a%>YRp*)q*" 1D15]q/8Ewdi/_=7d 9>mkjBCgǚs9J$G)lҳT L*ZMkjfC;cM) a.& "˸BOu9|i-L-cG1f1q5  1vb42b pv?j^<]G鎒A]jgnkņRWq`%#mHg#Ź^X0mmj5ݵ(1- %nx21/ בy46ҚGJ08XuFg'y-(Ǖh[) nW%ݍ|ŬԸY>į}>"l|shկMa!h˕v14&c9jFv7kp{㏟rO>VvqbwTqnP aٽ.Ƨ,EES`cT/%C^A<ѝwm_AU StxFE QL婈_KGtdAjVѫUD^$c?PCJ v=_դA7z{ BDPQ~r R6`Yaq5zIԼ *!9vg=ٝivN2!bC1U W8XQ)RY5 l?'^z߳X( Yu1wWM7-ݬC打1~ VY,XϢfTd G }: !~%{Yov̫#um섗l8]8c>@X!p vnto+xar* QR*k[l3˚)PH e(cԒRi$l<9N2Ge{݄4-^4ItR+ "v-pCi"0:􉃊=EX!{+M| !¥H)m܋^5Pe ծDڕ~ W81Yz qj^] |pNseJԉ0)1 y8A(xkKFhyh!JḐ۱ʱ] sU(&xZ&9Ђ0!f\lTRjR{~j_gWd$7c/wNYgƞ~j*t`_|C#r6ulm(t}|k|yBA>e50=,eә&=L^cCS py*@r<?4L>J"6%!f[ ƚ-?0*-XX1n9g9Qv1M!@ÓYdlYߑvpMW4 ]iyN,;yr=;\AvZm2O$j b>,3WP Kdtj&߳2ЙL/8\GM{9ij?40kʿCR2c -: `">xo Qý6hT阚㵕_.]$ ^g6k=(}Jp}墱­Qi'tD۾ubZӖyVW^xwRFc=*ng܀k+OgHyw"n  X~e} az767o,ht Cr]Rx2Ca 0l8Kݞ]rh `nzU_h\h;v|+vk L:dܚ6PCaa;CJ(^[] +ZdˠR~p1ʉkXLl[/N X]MUuCG]pED:U~ EQRD d'%j @C<:@7QҰOS-`S|}[11mz}( 3Ao>lA DjS_`UBx%-25B߯%q_)N0v[UKk$IkX~5r0 W?5idZS[XnwjGJ ?Na ZDF/|o{٧ \0R1hV2H bPíAʛطnr*_N\&鍱=P ٖ)톄\\tg3[U]mF/tYbtخ3= qTgw`?s8Huc֖Brm0f3mCR@_aK[-V(i(*Yy\e`KPٵ?!6CDdQ8d *`QsQQWje׵(zGr(MqCt-+Vk/Hd (.W *[+0A(czw.ǵ}P3 *}1V]扯^}6H!OS%M(uv>:QD?Izd|4A%7(l7d6Kwfx>T<DoGKFH ?B4!򔼺XJq["uI*ň%̹x)iHd8 >B}"eKhk~¶W?Y֫ZZAUnIv5F=D"+Q-<+^3?p$YM@}LIpDM%Z+msDY/ dK4>\CΜ*e0iќ Ϡj^nyHW82B:4ix~lͽ' 4' 0a/vӲ_;{\:>W/.{d:ݢ{dCzYX{7X 60/H)E4q=O)N2MXBuP2:,L@5M@u^ED/_ޞWtW=]]aÛ0jD)9~ 8kiEqm:.}m DNTn- :j[W,,2kSEyR'sQ5WgŷŰ61DfD1D  S4M_+\Oh!{Sj{H2?. qU3(q,%*0 ;+w@? ڷ=hLt{@+ i,عX|N ͼ$Y<\v˘nd ^4\_]'@Cpfa׍^% Qn#Yi䱄Q̫1)@g ų*EBzɅ#K {({=`UX38-;k2襍~exB];=: YCJ}H'Z !~e; $ÀR.1ya4xwaWK %lY2uJ"^=+pirkU k"q GOQO$^Gu3Ͻot޺=m锰eo}>"a1)̯H/m,%!։X;L'T0DOsTD#WW\#N.qga4S[իG'ޚVBWh Ti)D]F3$!NG;ߒAVšUkďYO3P,vKe2e?@w_*dd}>%ʺ)z4UY/nw!];pJ~eSC!N2\W[Qj^ p0: E*V*?%]GqB@zi`h!?LӶۨc7umY[6\[ H$š#ݸxސ(gm;ۗzRKDeSOF?bG.NRq+`lcZXLv]L5}O- e=!y"IN(U+oi6YZWĶuMm,_cvإ'~/p][#ݶ>zD_šf <;(;;.dXs_<9PXq2u@;(+uWhwKT݈L|#?Nt:0 Yx]^>u/^<+^4섗A~ p>CƩe'%%k^b45tn}0 ʽin@}--bZRoDQ>Lu@:IcSh6 >I}v]Mʛ#Q :;*pW~'LTnάz:$nS?'I2wܬv'xZ8~}f}lQ/Mw-ӫIK~ )p[MhpQ؎̬]&̬ LlH3z2.?0Bb*]}HC0 jDv&ɄX#H.ﵼ,^=]'F)\`M|yB•*\sXT"Ehʁ :y/ -V%N ]Ἓ ";F71Э6,2lpJ촒tX7.o_ޏm `\؅ta6Qn{dTHܿi;g 4T\ Ŭ-x37Ma^O+ƀԾ&TWhD'_DJZ1a$b5O:v́ySMTB~i7i7 v,صϷ&u[MۃЌ>24*'yF;P^Fwwy81{uB ;xD]8s#o!X7%)gS_v ԏV0 ͪ Y}Ga~3%'6FkI58&XE(nn `>QdWTO9%}LTǞt,ۢݺح?qٷ;iu[f3Lg.+IePY RȊK5 |"zbGT (vlQ%w6ESfpM^4|˭=ܚaM9j2V8Ü%Ϲin7ti}|[gѾE%/Fp=|[Vk!! m+a)v^֖]\ڂ7{#7wx5mlx*إC4Ч.Ƹϴ^k_W_ǥUeS7gvv܆/dzܯ#ۢpeWacc{Nt>0P񦦿y m4!jY 9^>)\n`_О<,@{`)Fd|9|̉PkO`]0AYui԰RŃ<}V^Y v,ؑG n-x37/!Rа]/ }.iMfWˉ0>HN;,}xFZVYb4_#U)~gWN}ny@BǶ< t#c @݁rqF%^"%{J%[2{pe:g.җ?N8b$Q$bi!C[U{'@D$z-tmw%ȐTf~u_ٗq{d~0 W81c)~66 Q㤊O+c;N]{Z{.WתwU5RW.CO XrH$""lQ̼$їJq *ަ#kY Y,&A6IHk0U0aO(5h= Vt#,kAp9 r'PbF(B:\@65lEnfjŸ6,zkW֌ HH%%ē4\JH b7p@ʑD, ]yٖ|:sM<\S-{v4vgG7~V$xNt?hƁHAN.F>cplrS YH9&dϳX dj,P?0[%5XL3GZŧZsmӍLqmtNH-{s5Ei z$W !]v)4DT%3>P =M$eEnᚭ/'٢'Zj {*\`_u ƺ\k=9׼jg0<Ԋ4=!-1g"ǩ^=c9]Quusu+3 yGҗ}/}R"]HQ%\5#&y([͞N%ZE!}vmާd]y c%vɗQĔo1 -]3}}3*7^BsVjlp!$6yLQNQc5ޝzoSFBb~,3+#1e(WsUK +mc~d˰ƪ+Q񓧢 %@! Őj5-%1Eϋ vm)6H"Day > 1#MY>̐z}CTvaA?1?gZp@l(<.>|аK Muejv@ήNnn2on.c|[tj^1Uoy_sL* diFJhIVE!j<xf5vmRyyݒ3Y֛h `q$?N xm`dՄw ab7QI1Y;e,ymY¢f0s?wL8[# +"7u}v<o2%x+^ `Ɂ(E!9c$>gص}ֱK4/:-eDPF=r0z;t[ A?}UV!exk:Kl'OWV=#e_nq(_8m `_ 1] aǢ-FqEA_IQM"Dvl.e/w?F L.Eρ74:0zNkͪpc^~ˆ:\gy<߫:ם3}"=̓^%̷772y XH^$,1P+ڨ)xshMu\[$Ilvן6n)9~43I)3$g %)窜%UǼ0sz;l}ESHQ3FۥݸjoY_qm"sʗZ,;katufi==D$A !D׍9x("IZS%gt\' @>~OKH_!s'6YSKg8^_[?I - 5&Fl>׭׷)DǯX+XaŒeA)/NJ(+]œ><{uH`(1J =C槚NFO(G$|>u,CkRdY0BŤ{2'7>If3m͆zr_}sBQR䩪~;ڃ`k~v}թ{}DuUנ*P+H$Nȕ>-}Ӷx9q>щ\wuzGqm4oC0>Ż,5g = `^ !2ՕUܠ9͌O1T# it؄fTX3I]&X9]1[x *)QSU*(nZ< U*VPTXw{Uz2j-2ٚ7FS oXu~0SMB4 2xB c9$]rVHmX̛-]ZHQzkD.u['&TjRn[q:f]E[z s觹ܳ%\i: At'4a8eu).լªOV4nGFEN?kWxczIଞ>54#(.,k bG@Ey{[n0cĹW?v16yb9e\~"!O"v./0쵮g =+`>]v؟)+Y5 y5͊i>VXu*+´RAXY;/qS>-ikjVYԮE\Tm Xdyb 9Jð's= Xs/yG;טao[ lrK Y 'EHi5O; uH`.jQiAL so~h\-vlMW.p[%ُU{mOvFސxvDkp5g8_t4#>TtM_ޤ-YVc#%k)[qJq J*au:L5VS8R6d#{.ii74ǐqB!C W8ٵ}en>2Ud^sf{l%J'`q'\b:-'@N>4ݗM@"a m5w.+Hdz|nN!$ FXNŊ/[ȉV[sBQLSQR 6a%+7Y yzޱn>gݎ(^Ej_`x_^!{ ߐ[ IMqދƦ4?XYBxa"" W8pIcZN߅Ò3Zx# laOrX^4_>4_^O)\[#Q!kCX˧!78ُޞkNM6ᶴKbQ޹v A-\ɳ~ a|S!`ꍌ^KòrhU+%P N#5RKҟ0U[= { T?3}z !)/[]@¢JIrpx@Fܐ ̍pS<G h*[+ۀ9u];I;l7F{ғ Xr]7T۩q5l]tgN^: `Wh4]:|!2̱C/e9vI3\ sŘcx1`Gސ}96?2}#5(6 q0}~nSWޒQk]V>B [?: yg淫kz94N]CE5 &jɍx&0x+^43BdGO{B@zX^,мC_Hdg'X3ݒR4$gg)b9E5{iCմ'EjE\@zkj !^zuhrZYs|1!ow+hqZ.mC[83pq2vd&;n}ʹ3B#)P a0l֣8*>nc*إ^XDE* ϗ-(߀@~ƨs;t.wR dPU-@]vqGI$D=,,AG=r-5f{1wwPŋ]ymGa\boޖ5}uO.@[T?2Z, kοQ<ѧrlJ=;q^a색;36FO}Gu8^c ӪC(^H㻀@|^Cz`2\V(ӌ; vk|e|y0 ơB*=-[5r^A w][fz\;="u[;?]Tۑ[a ~V1W-B$XyV"mu.wI9Z%1Oiͩm{l:;YMmzd9d6˘m[yo޷} IVi]/l?rUoF9'fwvJPHb$ݱx=1+G\R> iW̃@1ƈNG{|F;5m*kY L7.r(_Eo M٪߻3ߓ:2W9EjX][aj7MkEO,VXݮoc*ֵܶNB<)1`=~='hWp?CwB S@]5@U$V\ ]soWZH:pfM9$ӼFnO׷ѡ FsF጗ QN!ʹ*u@Zk~jLlfذUٗEl X). 7A9:@Q %fxܠ]o'Lm"+C)nb*ZEG]. 2ĹLD3cb/ř[QunSUt]BP@Hjl;찅 bg&[3嚶~uBiJH_g bGa@SH_+КP~LPdޞgޮަ^fn進RBh9C;=BgV5,Zb'\e=u c]1$^9 Q?.D.8f2mΛ9$ +gҏw0$r*)YZe]m)8 @##@5!S) ŮsdQpPҗQ7;'}X^A|y-ّYG߶Q2ry (nIIy8e:^G9ɜӆ8r'YqXQ/<`G=ּ4T1\WŞ]-FEBhY%L5a۸!G& ׮U5-޶DϨ̎9w$OXgp iq !krUOT2wa{dQ$F0efj!_$TxqM{>zHqħyR$=7\a  ˱R6_+У9`8ޫu٧RJ^e?`Ȋh+9(HO0jOlMᬌN%:B&(2NFu)J&"l-tBw)pXOZg6\6g\mXRPPR phԇ[|e+oqtN^PjDin%t3QL1I*j, Lo_ B%G2}ӰkbIkU*go9Ob;zfTBXD1Q1`DVo7"?myKPmeR;_fRY̯,̸wA~ <<ޢA~Re89 *m"CYR{,0|VLfko4`sY"i'i|4H`bg;' țp-/&vlXbx$@^'JIQYʼ4 Go+v6EA=21ٟge):6pYaDmF|$:|YmM[T =ya_ް^ cԕY068R6v)\v.G" >5O73~ ~.o4/A0m^%[", DB%j4gku6h.`%0 ]Ҽ[DחC=my3!r`t{1N茬βUzdM[?#!AG9’,v㕞 S֨YoY ̅XQCD,.b;Hӯ%uX!huz3c [z3 h iT؈po"gݺ TSҋgWl8`e_E_YL$?op\nTzntu2\`TAN8DԀ+F"9wt ˶)J0Hb$鍟]YR`ZODa+p&kx%_t4?(#W78Fp$.)=LIM[ eK `uz3_ljh2ߖ/`js9VoSGD6h-kWxRRTۤ5qGFo:p'bQ~#/\\`0ʹGA;f`|--SE[FLօbΰ o 7#eU^1ع1| !n`MJ-TeR_ xk %$Xyۻ~j/V{E-jkشEmT'pYX9JjA΢ޯ5JBI/g2:{WϻAJpnHZWO)O6M-+Q /َ+Pqmg%0HI6?^v G\O',He2K ]Cծ5ݻ`mOfT|X[{ ?[h^}9 \;='5FNǗ`rMY .N4|HGFRfox0as#iix@`/XsԂc q 38{dG%?,KDx΃-_ Hhrx:RRr Ac 7xFΎSS4OϖŶٲ WPԶX_Ne#X,Ga|@- Y/i2Ie,"P?ṄWy94sB#P˚q۞$6iW~,M[%_IeHeWqSgiJĆP2d?_x(jt`)'߄R|XqѤ q.*2@ FaBv% !pkxf"Nj2 aZQpc8zbL]~?It޻ qI.ӳF0 m߮o96ᆴ=dn ]Nc+$ 2'>Di:` Y w<Ɍ9S3kv\f|oBxe翴q-RSaMiOEbt{#W찺gϧ l*UFqfos=OyYJ`%H,on0Y@IQ{1mʥhQ5``YW 4Cx߁&&H&(:YQzn,#-r\UBMUs=e"-;HQޮަ^ N]xʊ+AΣb֒ޯӾ-y oep ^oJ9z'o>WR sszygH5éC$Fkk%@c #U{H,ong?}|\=bK5?({zq$wcġʢL l^ҳ+%XL $hrAM$L+'mڢu+=I=xs97moOM[nίs㢲0дEVp܃RD# vˌ%ҎS`¾P]h&}qMD Yn+<ɺ4`_<|J e45˹6J&j4HFePͦ#`"]{>B4ߙ  Y~ /6/v3:읇]T Ze,Cfqo30E@ÞHzp Aj{__x݌Xalle:|N g-Mɳkȵi:.$-'Sat.kmvYP|&Om 7O560t%CR;8/aצ7ٚS}+2 {>mTMKf.ћtM _JFߴʂ͖ܳm*1\F^V{H\}윉Ƹ`g/VF8wdOsS9+sֹ ) S [d ,b^R%=q"+O|5?U?]) jj85'b(pO~e{ !@M MMc] з@b*HYֈ?$b@ ƷSNwreCC-[ΒLxdm\KY2FQ/Ld@? zg[etʴg%~E48 .[4LszI}J D%ؑ0A D|,{ >TB0_,h*>Q: ǙNI_ݔ\YDŽ9ߗp@#&+ ԝW9]kvmx3<Dp5mʪ?V.ALJjkzZEV~</^(|wU)˲妽Z{mƠiW:Ku]ukf)wo[Cu]ޘAm0:#%ys]W3cG*gx9 1JJSgrFkd U$V<#لA8J$Y, QsD*rHLO2kJ@Gv/>`"ru~cn݀!"m)˨gEJ3tX$_ZHnW7xF+ .pt k !k]za0?\*+_7xF['aS_uqZ-+^!)3XEb~*]{s^>EK>9E*z+H>`<#`lZ!:GF׏0:X?X\:-ŝ&2i_qwVBo-$Or &J͎߁ &HZ~n LDAh>;vzkТ^dk-e8Mt{òb`:mX j_4K~kWƇG1/ g)C"J\Qk_˷ %[Zm7y[u ExL[#W^d~W}ƅ]"Bor]aA8 ,jGCJ,X2VXݮo@]/Mohky?~ ?%LF3T.Q1EĂ ش댓n;pSvnF-%!=>8JuT#0~m5m :bXMXd a(7ϥ14&nNg#\edp08σ<hzI=HA_]lF'Ik.s-mp[Ȝ>#ոY oqoV+epi2VNI0/GP1s:d4Qe-_k,/RuT^bT ?CW(2%roe}8M[fHKtPL(ZbD@KĴXξq,BPИRy$'4&*4%pV*U*DL9wAƧ(͇+t=n8zLnQӌa}R)\8»̃ժZy ۴E.gY+pn"=Pnu'!Ⱦr]E`Bf\s ~f eX;zJA 2Ȱf UMo_HA+4`:J B(u_DvZ:1Z~HԴ(NUkns3M[?3#k;l 5yC/vkYo o9Ym$–Hć^Cbܫ+N2|a˿P$KȰ2l#i[Ebu{:1Z~ͺ=SN u,js޼dME:xw9EoEp^5 Z?{rOhg-@4j B6{FEKZEr;EϼG- te$ 7xF4m $}~o9Hcv ^vHK}j ƒCLRMsp34oY̭_5jmWG|(K(;2ˇEHBV>Y_^4.'rC" [:>4Qf;%pDE'RL^U.덕-jq>Y$[=~\u-`85K%>4>~&N+vt(`ϡ ^l;RXeuܑzR88.8bu^#)$=yF?L0%Q,[ y܇Ex#UMFG9de?&ϱO?B_8á3uZٯ#UD!h" %WKA\] GS\[Q^?5>$dp֓O[C-X/|`0?7v;ݠsWVXV*/r l̥F',j|+8:qCrd'lݵ>U.4L+5nRKd =L'(vx"R_"}_#=hQi?-hGՋa:lK2HoM@z^XOΠ+mH!0#(~|Tɞr,">zk/!v뽿-x0E,ˣ;5?s'LQFsuGz?+I?WLW[$1]Xtbx1~v0mnvDڊGgAY/i" V<#U^Ns_gY꟏R@G/B޲@%Vxǽ{n&d 4Kr$k^Yo'g, Uᣐg`M[zŞ)O*q- %v΋Y׺3ƉddaWݼX}[Pǽݦ^W)a]_dZM:2혟Pz#S۴E𳃼}-!7.Bp NG@]դedW)hˎ y7~:Q]dVSCfNqi @Lo$+{ұA&S*(9b['U_T$Ok \> d!DCJ".rŦRĵ! |Kep#I6l+/$S #)C KzlyDCψmS&M?ZVlYҡj *+oGk@ڇf0w/)OT ?Z/ Fx$:RQU{+XdWl,"-oK?.~9y뎌Lo i<<:o\&(w[4CV:zY38jw(ȹYd7.1α?* ѺAd @^": +t~3NkGM; ҲU \8n6g۹t\q%ts1htcIT;Sut>'x_?x3v\>d2r)hK]2KKە)33{[oSj4F%[|7P2=\AZVC,!X^6B)  ޺ۚдEVG˶Eo:-i1lTpdGi"U+U]•i-Ǒ!,krܶh3l ;9b˂>2_>V+x?i}N":k`ϯðn"C.u..oU`Vi uT򝊑k_h Ŕ`M F^3J""~9 u蝢_~r^P@PGSz3VS5@4巏$0d<rX^D[=vCguƭ ^Q߭ :gGXEbuz3.א^zJɠ_,,j2Q:\~,cCg_de;9U**e{Lqgem0m}wCW> ߶E˫0 P;Kt7/Co#˰tԞaziODZRv{r5~%~=y,yuvD35R2c[kGO고bDUl-lt *+({)4Pn订U`*++o+3 c>D6pęRfN~ݯt2_wĉɈk|F.zw]$~}Z(M|p~LL> zM]B.A!;Dĉ ^2X"X`T}+2[H+Ou& Rqﷳp|@0#c6K#Hq)$2xX )`2A;zihRެ 9 <[YPnն,Rxom५s_~?hخ9bZ=b(G>nI[[[FbypgjՓ " ||W–ݷ&u]N6FSF^aX\7ĶE3b`J/-2-< QYq&l"1}Ɍ/@a(b;y:e7 <#HYt,O:obB*qr٨LS\rA1[?j9n2MOŒDzZCi:ܮ 7}@P*cٳoV{ ` AcȖ~lh9풫iLg-Rz)ݳ7yztv̝g g,aq"]#<_L~IRB/X6_6"~gi˃.Iσz|J3f01mT>`I#LatR8XVkZXz0)]Pצ}( ^^Q/%2LȗN%W}g*v9dq/* k1auѯgZ(Hg:&t__Pg,(۞6j:sG[:2D21?Ls$䢒;seGh~&c,#]W3޵&/+sԦ^s6-tJҸ-Zt%в3~x|\wțG)'Oͅ\^Håa͔4 ,295 \aH#Ӛdi5mXy%qиQԶEs'kۀ%}Ά0W҆;pgŃ ֐vuitH p%M0kX}(:z(9NLi㩘O)XA_%#G['PAY]kR<, O?g` F3Y0=T$n֞z/#=r̗a>̵l \n_? 9?I#I~HG8@\-@=ykND6[ZCm|So|1}Ɩ`3RFjgi{@ض H*!9#ix񕶔8 !۸ N{Y&=AJ_ g 9?Ci2m¼~TTb|\ҍ: E8iҶoq@k~6&{ɿ_dymq2݌`1p/jDy|DҾw'ex!hI,JO!6yg,u 5q؂o0A!ȇT#?WGk%5d$YKቾ}olE7%8]7?ԛ1YC8#'Ls5ѓb +p̰D!"">qS2BwMJ/{k$MeZCكyԑb,FyBr.5rsSM["tyT恼m?ȼrź\M[nW@^ַI,ȎN-> k'hsBg -OBEO~a$ّfﵮyطܴ`9K<"8p^f+U0"nn,;vHbV_>ZW"O*?D!8*yqY?.cBr, oߌ~Q7qIInϻM\rHx﹂,bID$55i:-尀 XpNli u˲9% is|x~tQ-1iFMziM^kx[⍠:oGnfU# (&ctI[h{2:;qXMspk8[ITowzj(F(qɫ!,3MH ;g`l}.1]98h;\uXF%LMȹlԠHm,-:cdH[? {""2az`NjԜҀZ ZDkAC~=޸uO)?J!IhըrW,E:e%X&@T>05myW@ 5~ߖBVj Li*ˆ)ݯ:Xx+. 4~u2g/}]Tμ-lmOƾT1DckB`u]LKpJP6's MqcƳ6)Q?D mt>ZTG!ŗþft9N+Ibqǟ_x=Og[_JeΗJmlKLmqʟ5}hVVW&nj3]ٚ8Sњ;aժsO" _G7/Gޏmh:gb|%_UE)z{>zUQXn}VHUOACss'^#4qdۻY DsqSv%"g6b?7O %/\K2M4#&_Gфh#o;69&֑̟+˒_IJ! Df}"-z-`f7m^B'Vsssŷ-3K7?e0c=\T0%Ksy e0xk!z+h1D)-@G`0I "y_&2O @_,eƨ+wq>i0T ܪ,~m^m#y(d5蜢Qǽ(d`{XO&K;ꤒ$(6b7A󐚷 B'ʆ6cnBڹ@S f4YϏ5\$tTm@mH[`mmhTlZ`LJ/uO{ޚnV^iGvAFi!xY!6] JLkmn0Qd leL7˷j0&jH?nާq^<@3g{eq7xE04ZW4ĺ-C~MviOp/5htc7;6[DEђ~?3aVKm"}Zj,n3"<3i*<\)2Ǖt~cnc%fDif=$l(H0$S<4 JBdJ(XΧ* X윔 >B6fpsF\.G@32l|>Ѹw2~ck?0U}sdȢD$rM%٭7IE-Zह=]r~O'i_&f ^*pS |#"yz4TOLe] 0 4)WP135W vv/4RGlYR'D?Pʊ>_mjQ`.lTE~u UQ@iO0fXDE2P0Z5Cg;@ƯZ Bn!*d*DjƽӌISJ^eODϮ:ݮC]r&6 $~qm'n~*?dow߷Գ 05dv\L#}V cYk޶hޫr~zgǤYL:o-1iʦDKo5| `xw?Xiu0*VhAKG\W$EJ ϏIr ;fj_BH.R˜ᮄީ5 a4yj" uB )aƇ Qt [ϧXx}JozOjDc oWuf4}!Yg\'Cә+|c$A_G]H)R~u!`MHRSڶ㹫s):b;gQh#tyԭysEƐ.1w҅D'v}'qAXr!^l'V4s6yqz&5Ӄ]H(GӻW]u-(*TԫL'a"  QB5i)gu1,{ n̖ƁXpqE{=Egf$3OrT,Qi~RUo>AhG6Ed/13I\tuJԳW #ޮoJEQPqQ8z3Vr^:K$Jqb/ R8BR8pRG۔s$1mwrAO,f=\r6SRc-owPi[ z̚əcTnZE5nydh \0K(384snb0_²Èm"klڢuדsu՘V7gϦ-{WK>GtJh6E2sH[uNt T|S]T:pSgI8&]l{ ZeU|V[R 7ӆ6~N N6K k=ty{c nk~σ'?) a?dn^uc?Q*-_ %zNX:!zg(GֿkI;y=Z=iWKAr{WNq%;v\Mkf/ye5I"W^XEbuz3_9F\'65MAS[0hVK]%QuN 13xgfP-U}/Â,5{e켳@A"߄/¸#yjw҅#8 u}S<3m&#y6km"9ޣەwf,D1Khq Kiӈ?@7pɎq^еz^sZO7ZA蛘Pϧ"𯈘VjC˄ߕp3h v-&$])c.2ΌDyx鼥fΣ˸:*Xr<Z8YJP"z@ YAHD 26ůCnf0MI&XtIu_L偵odohm|FGVBI`布NBepL2 E5MQi:zb SڛPgg0F OH>Qj* d夹̛18RʹEIy0!9j,O B>`yp'?̶ ^bd,^4i'<{A\:-Zmӗں䰡3 lޛ/}>j'Orࠛfy=Ai\9M < QvoW3H'GմE+}sR S j u9Ep@yʹvJYMo(zǔ(" CRPr?{{A|. $SDJ8~kIGn9b"0 Ѳtٶh(-op-#<2[3Yږ?1"!AFtgZMEi,R+8cl P\f. Aw}X폑HwߚeM Pb3 Z1'T'ul)E{g Ѻ,K`22]̱g2n]o"a!gsR#jSoZ![xʬuH,on P^B^!T˲P|-gU.dYTYkx.rAi٭C.*RG(Cp[]$^15Mտ| 'pquQu-sl3 0@c}[GhiHRѐ@KNvGߌ{d}٤tV$ʨt -0937<윢 K<׊B:~dL[?3,˱f@!K?`;঄Em ۸ ]9a)*i8%RD,~Dy!0o8kڴE.sFԇMٶH+QRTǚTo۸Y t_:̅:)hq/մES) kt۠9t7aHyAw П ]TG JtZ?PuHwߦh:C>3{=i, 6jI%V7{ӷEVCo&捒ߧKޱ)3xsZz'a"gف &m-4d,$)b- 9N5P8ag:!m:҇iHD59ǘ9m;j )?7u+{ôE{_3[m{}}˯閂-c{y}Ǫ oSs"½,!?؎$ĨvJVW G%w|ۉT3;^uS?IZf$_"%)vt|q֗[z7&mW>fY]gf(b:%Qqƕsge7ܻ#+SU*HHӒ`Z8) vAi\ޟ@{2~zN_[i8X0$@|19JbAKa^kU>2})sn , 0BEm_Nz;G EvZǺmO1OlMM=}4GJ¢hx)u<#9>WV+JwyMaH Ebt{1[?1.Z$X?h-}mKMDIi( KEב{: +g:_WVA-P0 _f PTe$+Ctv\Bl[:pY,o-~MW)~r3ϻw{l.~]<>GQ(o,#]~6J_9vQa*&ۣ!myLyF^϶IH9aÆ'Xy@7DS\ZϲF94B Ɏ7 $'\TZ-_9x#=3 jL)  o@vd*z>T^@ fBi߭ `7*REA+F//I(/u}D WL'Jkm\ ySى7UN俉χ{ĴSKY!yQq-8y+ǘmJ3+Oۊ W'I YpOrҭa 2A3"`]GS\]U\(!8"6ʱ5ڴ=Kġ"Y4[.enfoIfH a ?6bƨHTm1#:G%qG%]?"᎛ƷfWjEDԈ%#Yk]Tmrw%%:!<|crM\灁qT!~#W/I  Ma~~;ƽ{04%oFѧ#\bf0fΑ;S|DWcpH~{da FAWvЃK&pnC tU\QWCW r_&V{c>`01ˉ:.דґh3B uM:~\B4e`=ݯmƻ^eׯZI%XWQ;~u*J9UB)cA"g# eI{cQG wI{A?=lX8w "D/KJ#\&MRЪz=4c"wn幫\-ưo#C۾dvGjd*)'GXHcc%L>@A.Yk-w~߶~f=:jG.l\5H3 ]-Ŭs*ba_ɹEaw+%Q$Fb$ TP~Vݗ 3`0~`r(ře3{zGЁu( ֡JFt[ kx;U/cͰzʢjNζ$ǿSKR~7S8v%EJmJq7+&to&XFNf+w@$ U]DWQE64ZKn0"W"#(J~*Jlf s^2m̔T!RSDYBM q=WT!}Be1IQlg$pS77<p@=%j\!j6m5HyFgz'5зȼ2:{B&|VihOu uczrӫvmUVPX^m7/de!it4i!!_"znu%w?s*T,[oڢu<^ lyֳ/7Zƹ0=Uva={{ Fe;șwe+Gv]~y]r EHr^ 㬗pkr|zH|O-i1 |Ҥ8HZ`faRKr|JU$Vov:Wi*{{!vIۓUJk ]e5I$&^op"KlUjTr׷)l[zc+renۢu38`@dEqYJJV<ޞopVǪjMŘ` l< Ĺ"?$ShQb1Xpg4l(IPT W~0z zrhUgs~:v>0?"A%e?G_S5}z_q~$rfVn׿9^$9HOv1?my#=s.$y"A cgD4ֳiF_sʀX&֯@x]DyW)Ǒk|\Uѵ*Bt+j"=VV`jBl3UV<$9>yԑ7#KK=I6bxY$BM >"ja6b'J&c:'HlG:!@ 2Z`Ζh?>jq7_6^xsp_KNQ|TY))Km5G Lܦ!i"hfG !\=kKBN˶-Zs*X=qA?V^]zKt˝VC(L[*>]aJ@șb-{jzn7,+珎)gaf'k_' 8,P5^ء78Fzayuc3a5&bg[oYh,mZj-o߶Kd"E$ v+[4|TNmrj^3cs~3&>s%#P5_ X&nW7x rңi YV?]G-E Èo1ez(R2$'3ayfce<* Ѻ˳pg~NRВm#/ SO}~BWWTBQhnӹ7$E!?"(jo~Zd Sy,3v|\ PM ŪXc޳Uv1B"1w_.W%A 1s6vlROFSf!pm̢{% G@-]6(M8ǒNGPoNO$b⇱/F#=Z !]Ƅ-8RQ#)w\+~O)ށ$`Ҡ+ci_fiSGGc;Ws]_Kiͱ i9ĺ[Op[߸s7TG_:[ʹl oWJ:{({̣e4mѺ}FQ`( yI3*/VskZȥo[Wϫ#wt}[=%k+|}K-H!뽭.J`DJW$TI3cB?+#,Lu2YM]Bu6vemO01-ˑ'!Tx3y, ik|LƟXGn~=_-Tr}LpoF=׻,?Q B#' y7X\}M[m#Uiu{ٌ٠3~bE`u}Xmc`ݔVE>b࿆|iZz"O j%UI :HXHnW7xFs>D}g>>|/$K wvk*[ ;S^vhHĨm8=kx;/2e䑾Y]LOҬ]4m\Zb~Gi>Ty]S0"|g>NvZB\Fb%LД/lZDccc7,u%Iv=%| Ctoڱ]Vyp;9.<_ 0\SYbIĒTMzܗqTYo9l9!, nD?8;&NtU ۤ}la~ J9܇ЭS(z| #0s sVX(FOĴQ/ă|R|:,bغ6USOTNK ۔6 L0'O߷aNE6A_s;s{M[5PWخ-~>q!E ʢ#2MG ywm8ZBHQ?\y8`,9bs/FsQ Q04LzΟi"$,}$E]g?+v\:(_/un%NeW(•LlL䉤0P/$)!V׼u[ -#]~L˞FzC )#0(a~h".bO<հXnxpo< @-9v&<%A0'iJI|=heTL[nybШ)Dg)/NuShG*;CMCWT \4UZ0Xҿ蕋 ٭ h4Jؑ & uiR4LLB"~~j-|L9 "x{@,\F0-qj ;2Z(mi>m iZٟC{&۴E[HX :{,1죤{Gǯ74SZǪIctmMGtaɞWʠ=`,#]W3_Yv% ϭ@u%Vv/[VnΧljڢu+o߼N8?L`švXc_D-\W3`zm?GaY1lzepqn+nQMaVGn{(Er% g-#(v `(KYH@TLἜeeXHnO78Fp럱} K +̈́n"Յ?6Q.eON%O|o[?8}4Ϡ )䝄K$WrK8|-u'_49ʩ3*pdih'MeVXݮoKB-AhA+wr0de^JCV jɎ{]{8cP'\rkSP__4Wo nIY,jH_5Yk%9?`HUQ|ME)oV͢Ї/ގ޽H pV( 3DIeѫlS6j>mPMn,^ `!rqT"!Xޮ+N JINJ`Hў HݭS KZΌR[4[Og9*A#%iϓe"9Kq6d;ӦI?K OqGp8 8 ŀ̤b"F~Dռa986epFfI.4*4S&;BsW8$θʠ|"]XxEDZ"R~hCSS9ۨtG% }9뻵u0Cjop(1VDU3Yx5RE5 !uzu![XH,ongγ"'KD҂咉hbm ~_,_n ܛP\-oo_~˫8$C\lUS`ڢu{å"a"\-/IWl\2HΩF^L.P<V1M%Gz0iT8+BEmK)ĴE{6EB7VӜT2"(Zs }޶~s1-pgM[n6pMA𢥖A4cØ<"qmgnG}B᧰ ibi)ᚥ?;V@͒w8p3} )`8LVg%Ka7Y7xؓ*= OyOyF]ߌ$u+:yZtVWmXs%{̻\*<4i"$_uo9x3tNk/o뉾!ěb{JcqwaSx޼OOUS+0b%jQ2+["g&lXˢ XPemJxE gٮǗw--O tB!̂G<4c:VyX]|o<(ϭ[Р]=`ic/_ UU^7֟Y~%DʐB)Ŷ-Ygr_S~G$_ jM>ir S%hВ פݮ3=3Ɛպt2F,mPZ><%1T_`]WYO_]T7a!+I5 Hh'\6h9kU LXأM|?gE@ u;/aʈ$"yT+kEjA8Fi$&-`c_/!y'{o;,Zeq+P9A kPMCyځ/jZ|^ ^oz?;[}yXjoLI&'V@` `]WYo\tmBRS}d PvݭumtƌZ!J_˓3m^jj_ j51>a(Ƈ] BW@֦pǶ~+7a-˳Xw!O[/1036bַO#WsyUL..7i4xǹ@Xgrڶbڈ{oϫ~l J {mڷg _@L7M9z~: r>!Eŗe fHTB 6Ȁk)ar{O63A'F9ҧ̎e9t)OUzYR8w`[Q;`)9ռ@2y$`P.0 (8c\IRINC{#nƯ FtE .b'XrKіE(BK_o,K^X-?2~*]yGjWUͺ*r 1r杛 H_e ,'WD4qDDZJ:릭|!J5d $#^-\R{jʉD4$LRmr?Ȱ@H~<}PLXV4m<s]_pDre[(+tM6[Qh~DLC_{~[vT#շlGi3 o > Q  bNB H|b9_dcRk 7؉3+ 9(Br\.WDMcz5~vdf|]cC7kh K :KzgB, < "ӹF(\@-lڸ ꌜ'9Eido }'=>=3vl5ʮu,Te|Zgv2m1$ort3k=zv &op~.55itm[/G;͓F}k5Z=xڶ~_bIz?{ -MaI"I%J=0|c75Y1 ]߯X}f7%I+"橞uAa, ̞ dp,mkAt3P:!C}:+\Wjd\0Z"OV= T솠k+g>#BJw'X~9@vý4"V xU}p׮3n}'=X{6|Q'=3 s \%ΓkS!g!r`>ϴ L:1US`YYMO^Y ? h]h]gXՂ^V>޿ am|RlW8A>*g'Tgh_%ngUW%]J<}g&06fTК`bOwuPiV>DG>zNh"i8isUoMaH6~ &ׄ>@I (Z_EԃZkIڠYbBO^$ptQ\o "W! K+8~'Mp@M-!hnd¯ǰCW y'uvaBcvbY"ѧ/S+77Dkw&w/8_neEDe"Q\ Փ;R>/vIx#:ɑOy&*1I/j9,Wc/,,|+xVœ Sfu̴~%1iS֣rRْ\tנ,s w)ڐι馤,2_+2ȳĆ4+cT8. ezR0]U!V{~u+:+륀=,$g?`U l`#K|."=njs'qN߰TM'__kYev]!g?{/ѣ$6e ='TEYRx0w/nG<3Plnwv6c'߉K<Чf!+h:qhyC+T4DZr+|X- }S )y$/ί) `1b3 O.ۯ.*,'^d<fd q-,t ]+~"O7d-YP:doPR@RSX7ʠEHT!H{fJDe8*9R?2RV޺Q}MFzxC%Sq)3qE _Vͷ&F2?BG^EHFwܜObkÙHĀ{Û]ux%nUn|^Ky s 6tKXB 8Ga7kȃ J$4ű(ruv6VXeW< ٝIcxkZX,~r[V"Z?8tӧc\X LMf}mR$;֭|4<FX{kRVX1=t%SiqdSa+1KqYoy~ `"dkۖUV{~c +9h*'}BK-]uiA ف>g~0o,Y,jg$-{rAf `Dǰ wi[ռKqu}D05 5#˓~:`2r4/ρ*+ !]Xb6{׷mOEPxSW( '";N3Dh@`M{j3xH+4S%Vw^l&*hjEK+~+vE t><:-{[6sZ2Cܷ3KRBmᚻGo:|I@ۇ`L H39 8AR>7VVqa=m ʮ3x+ԹG;wH-rWas}˾g7Zb]g,}owij*$R_yB ^_ + 87Hw*03ϧ%/`]g rD["B"B%~9m)Kf<a2q.2ݴaC[nQ V)+l}wX{-5IS\7V(kTЮX'(Y)՛i??P}wD?{TӗH+ǺBzǩ%q3ӻ~]{RPʭ~Oq<b;''6 צ% woV \NL%D^h/\[l{Y6d͙>Io];jtص#Iz~,+r7Hd{X4쓪-zӽmź-1Ʉ7@)cKKXh_\e!u nymVk $Eސ%MG:qYUS"os}۔Ν_l$O-E<[V;EQBw,;xo8@o!0鼠/m+H[\JlIIw[O+osOg\QLA߭^~u_Qլ,eǼIk8o9*Q;GPvZW#u~wc{nѵcVbg4]?ry_V Zm@V6i+'Vqtu3E>E8ѣ5`&H ^FRMAbHb&_Ȅw`%iZE[:]t}E 79ek1sA򘐙TUJ(OUΝ-x~ٵ8ac)r= z 7RF*,a^`0K,+"95]u )=hkرމHש#h@5A̮+d, :Oi4$|-. -H ].;s ڊumizJ[]cxRi|RrunTMT+/, ^2F.? L}A&ɜYYo@D-ڵ>[ FWRRy¢'O8f^=Xf2xǷ#{:!"b}DPܨ k0ev]!gy+="`@|Px1S%*3A夬]ŚnPJU}]|:AΪ=g?s빡X0z|`z$=2x9Evg ZxZ/??`UUt)i3p-J-)tr8,9;J^^!Snw_uk64ʮu,fx_/ ioO^ed2Ȑ}6t"P ULkhw&lqΣ\d/V X/G3E| ,c-هY{k~Ԥ' 5iXIj{k?P(I1q`qZ6.w.h_]<@ G%4'ygY[tm=WYVEjb$,o Lѐi%8)]%DZZ(ID%€ٶ~=(,򢰆 ]m5ђ MңN+;}i%Q+)7LPUS,*$bQձ\3cDBX?{Ia!3Xt +L)ă 4oS/U-s=,`T %O1[D)0mź(r@\Ws*QŅ<, p\!3*phcu2>?,+Kw ȣVG^|ȷ꟭d=5 N,LE)E+]9޷`슈e9?d%ǡ1T`iDK^D-0~atZ}i"[™S&x-5̤u-Bn\@<}^mO\uN-\ۀ]08~l 6++/z~C'C.Rt!X kҽ %+pĚ7 aYF"5Ԉ,2 ފ?waIKrWt!jaMJZB ź̗כ 2kœGMob붘-0맺Jm+44)έMsVXeW< ;+Wqe{wm~`l`jɩpۂk, ]!gqhoNB͙~f~l1h2I7 {j{UwvtkY%+d,TwȔ"8H2hpuHV2o}u6< (qK*KhTQdV?qʔP}l NB CLӹ/d ark<-O w%lܕ<(,j5q$_#cO 'J{f|9E2<>tSRrR~ۥG@=D"ᣵQX}[{/v8nb7;w.tOʲ=?u;HY"(rV.9~5"A =efzAg r29m'EEͥ|o,q"L⺨K"QeRTQ]V ubzpzG(?$( }jB\Hտ_:=ێ3k>:C^uӵPU!V{~,Id֬\,ih$v1mzW+Ʌ_hY#InaMhlmRyD p>HoEU:OHp˗> c*AyWӶL֡71r&3NWȌÈ=@U_s|_i>c>TU|߫ m [`ńqC8vQJN VmyٳRb 1ʞ38pK2(JQޕ>5mH2:cz\#2e!ۨu l¡y)3uWׄ5> "BJnE63 |!pXBs^=rJ73~u#'ߒQȖubsRO۶׾QU&aj6۶~튻FXYE_2V6GX̡,dKΫ^2pyB%_=W^$A}5_R%ٙX}9TwNaOHU͊?{zg'~p)!UWžѲ݆0FF*o6zݴ~ :8 ZDJhJ8]K{+fo|h_MKe`HUŢOO)ؠBP!(SJ.qnmX4Dʲ@[nY WgA2fd 7,2{.X1BqDѻ%UNk"ognz3 #$BuךDRG\4~8@2ɦslgm=ӧk+>}H>QܦY& m;CKIlg,QePj Kg{y߹U&<Ĺyc aq:H TJ<: :&UW`A6R+Ǧhv&P0pEyJiCM0P*"q˾ m9ԇ{sNr7sw ݿ+hћ=o*'ף)z#sswC~%+u?k'>Te-w |VfВFրۚHڏVpNmwǭǶ/wL׈՞+vm6’?'r0^þTL[aWg_ yXL !-([s:YcsHxd, { <qJOV=ZkiG*~ VX:X6 7y%uZvjxg!o})sժF(E`{b^X\ b\jsV=T]iQwaYE4IUP[!s'fU޲VXW!CWTuh3bC罜Y9OOTa纖t{ ,5hl dOjQIAcZ4JNIrѦ֪+_< y捔ۧ y ̝;iA)y{~>2J{yA{?pUW֘4JI JF: U"5 {*1!qPAYC#xN*B'ضBugn<#GFu}ʕ`0m%SMJcaUCۏܓkM.p9q Ϗڊu (GB˦;n4s]RVS^q'  fW:psl<- ~ W|.H‚_V\OG(29**"sALF$h>xH8__籭X-j NĦN>)'ʹnvwXf2x3;a`4aB/(S@uZwlh*L9m _=I:IU:!bWj, ̮+d,74n6)ώ*d{s:#6n$'0%QBS%f-Q6Ko}qCSԀ{ZHX~Q;<4jFFjDB\]yKD>+\"i#mG4<`c@Z@׮.V.g"i"fadlXJ߲w@4cYev]!gq `NiXl- ~}Ob%L{|1[~] kWx9̮+dIpZ #1}Z얘2!=w`KSfW`I:6.n2H&Bӡ *Ø@'WȬbUY sdJܵ/+m2V6Gl RdY ^TI5Ie{9&e@f]e}U&NVβB~?Rw}bY̷7V7ֶ:6?端%Tx yߚJIWf]X?6~l, ̮+d,gDe{K-O~m g^#V}LJ4$-WI&?wZkY%-J+d|)Jr  VG(_V dU/mź=0#$sxF0)thc/R)(^# $e+d& msŹ>m4cU 57Qɝ;QBX) 褫`aeT~Tm9{m۫\DXf286.V.fEVT,e+]FZ֠?N:7wU)ƲK28Ҝ8kG 1g)^TD: ƂPI!9@Hl4v UXLOD W}# Hn\v>*0WA(}YR,P&FlHv) Rh%YMC~c[Rho5 0tZZo_i*e|a+30"3(*WT^P4̮u,T d05bB7):!}Q+x q:~ODo|Ztg8wڡZ<5rXb=X}mGj"F'i15n7iVL4Aw#@ sFǘJfe.^'b)^&m,{&@vbԩq -|!D ᨇK,5gd"a'cCKB߬#vFؾ}z7slorY#4Xy\~ Z(Xf2x > sruPyf [יhR/Оa%]WT4#tȌkM9frp} Ή8Nΰavc7GdUXAnRXdZ}99zںRh`w 6)R6 }@#Ujr7g22mn57r.Ӷ?鱭X:?/x$]lpE0<ҦiL[Ź-NhYev]!g=T~>mVRBEe"ő~ifFyї-Omiٵs{ nK1tm=geZ3]۷T'݃ -MGCx>vke`D"i"YF>O͔xL$߯/{R)vS*y iש^р[+1H1 PXŵ M""T4Bw Zb=gp,(q-_Y1IN**zYq.uȲM{Bq]!QS+3/#U6m^Oa*IM"h,Ē <_ GM 0 .ޔmn+A m~w_#a}~9%+5 }lh֗ Զ;$1">AR+` S6wN͍X؟aF/ϓ8GA: 5Vo"5tSVXeW< K`A0$Wq߅7m \Jtю6Nuo,Pvc m+W2 ȡ0 DHGu>[qo>4pdQDJJ }:&$Vk#ؾ >߾]}]?xz xo8v @b̺@n ۷_܏.QUVj}ᮊj@cZ>}338k1.AP?/B2Siȳ{e堎+dgorCjz=בT=2;pGB .ikOܶF>=?7*{~\ 4$CR,}? N,M+|2=&c>I1ь@ 5)G7][#3mO9O)k -\VhZB߽#l7XZGu:~C3}۠o#DuBy8*pO\$͂ R@Md Nlpk 87!Z8Rk"d~G$@! q`9#9ʨQш޻v%Tx8uڄP`#8k gn[B, < #ބn*ᾥaMN$XnMgTqW\: UVմ%y=± avc7쓧.4}57:5`muG3FeO ՛(zA}[M&AA>DؕQojPVXeW< ^R$e5{>=ҦPON@ Od _ 3k>O~+X~r"{ %]I!&~3pc;V:\ִƎm%_!#ZLT@Wj3GAյ>,1o99 YBt"V*r@өl* d"SBX B(BH}%g'2"utvdL< l_`_X )s-bHҩ,MJ5\5 ʮ3xs<wŒ ڳ\l>~}O!`tC"s%$ TӱXf2x~-ׂB,',Jq=o*eizDDcxnƁEb2PߓGa#xX+ 5Ld,$)6np>`T(ֱuUZbIb>>6GߙP0Gs&t<{bQb WUdefǟneRsvئF$J5e,P:@ a +CKTF!/^cT/(.nFK'ozJGu'mxlȳmOw6-EL$ KEY?S5&ۓs}5@(.eVZ<**zY_R&*R~*Wg+nȹA_(l=?,;JWryHQw̑S ouDwư?cs._bJDhZzs+q[G;emOX߸ђciYҶV4z·{׹.R=ߒꩭ1^)ѬXq}1vR|iQx^Hb iQb_"8o4mX+y<{QhSbShYefVpeԊ\񙳾N]d L=ucO>r0 WaP> mCHhRJFgJX>U-~SvE !a, FUTlPn' ;BrL`ž+P`g:Ͼo|d? v'{_]/5n êmU6#\Nȕdշs{oKY[@`;e9euzgAk=}g^v7=ٴITV-ۢVKB;czǶk ף=!;7ՕX*N075*h]}gX}2S Wc{򪰂\coZKή]vj JT[=XO =Nu@~tO C?Tayauƹɞ)\{m'kYev]!g?3س~jh'Yb"=دp$%ŸOkK']"ZeƓƙ^OifV~$SmŹnfwm^ŦQ.KNܖ(u;FK.Bv{݃rA)D5sƣu>@ 0O"VF !F{Jh+qxޯ޷o0 d8*8 V[Q?ZQ\\>kGߝ~l+VJr5Nhj܏aS͔_QYwSrz#@mMt=! E)%yfɁ]넨_ɩP0f(cVޙՌ۰nƲ;KK"^ߵEY?3);pL_HsQz`0{A+t;>`=3C=A2ae.#RWDHrU'X'_碩V]>~B=W>G&UPN HA(i+W\WHi#1z_B\.~4-&,`HOtC ,-*mEU#%7{kbnqt2?meR4{'\pStmźz07ՆW4֣y﹂w>1[ p(k0uq}~A/`ݏ-JbBΝIpEfZ;kN޸ }Mi8k_[INLX1PaWG5>c.I͔ I?PB;+aV%/Xf`}9 0pW-}åVo^m !XRr,{ fDGp(ݹOm@S$H. ր.R;+3^vKVjOj*^sT! 4\+ EQ۽ڔ lnzZ$~Kw?3*h;[e:MF,xCY6=U/T=7hԈG/{ji%vvoPY\Ә"x xݿi0"WG?_T5'Uy:9;5~]XVXeOuWB'ܟu2DiZkKU6>Kqo pvA#=}Iސ3~`U&#c|®2"m8峞…,3~_:KZֵP˴V!!tbD*#O,PeS _E`x̣W E#В) GT]l_G֦9( A$&z}zא[ \~mpu - Wq%o;S"$]uT?X/IE&"U$  x[NBHmжOMknQWEhY8t{pXޥuInu+b!ηנ@DhG]2]!gvA1)eK@`IZO um p>wR1E^m=߯V\ \ѩPkþ[ R&t֒ Cj ʮ3x3q'zN Iϱc-tsxi";}ؗ*5[#9紈CMW:]HYv i+}ʹoucb[K\)ٮGC$)U n d!-A?WNqhP@H53)y3-h`HBR]@WK:P>>.E(Kw MTϲ[iKkk_nfV[y#PA(;_(ys\qI"A"7spƱ47_(#jn/ 7sش/-`θUFOIs)ZCO2)k.h"ӱ,5$Q.վFB2 +!{MVY9>8kYev]!g?S"<ӷqfPd|(rl`*#<^لj H;}|"*ݧ-`+}XS$a;$̉5O)6EFLӆ=a>X[0D LyLɛ~$JTC_Gd.q/Ì~v'=jmkzhjmξwmYm&bAQ#?}b,,*dž>`{fY窻s6uG^m,X׎)ZKZnV~hT -ly2~zxiӃ3|3hŒ.ppg o,-ukV-xV w ]Zi]llSёb* \}{@'sHkd5_2]jpmr͍}_^cO1ck Ð>M1]ǹUxL۰Z0;5Nt;dXhGk-:+dFoZ_\jo}HV3xrEI4}QzPH v83&UUUt\s][ʱ]:CWNLWȔs@z Zrn>CSHO q͗噶~߰} 6z5O^K`jlXb]WY>6#@ZV>/ݟ]um5nWg?d} /%_[=_V+׊(h}Ve޽ZZk0^QCiQux x +u~<ƷoDk^oioBKʦgoBG} x}ZO,؄pwIDJ?W Q`Z>]$%>rQw]ֶpͳm\7~O P]UNA WQ]Y5$R77GB ܆IpP*ߑ$ i((ejSb~f#n9$XtwLA8@ ?]OXO 3s}K]2Ol^9Yb]WY|@O ,)JPt،aA%V18zo{{UF3N,UNb ʮ3xr\~ۛ٬H&d6,yDRB7rFUhXpLD4eYJVu0 ,Ğ/~71k-Ew&۳numRkAEbC'3 ےjH~\OvW>$3]u:KDA jd &S]K tݐ#m ֹֹS uC xٓ~տmqD\4i*ٳMжqMqϤڊu3ZAEK!:XWਭo8-qVK(m=dwЙ>ϙLVs-FU;Znw\bUEMX"m%%>?wUkI*&WL{&XNhg;Вi Kח_aiR\֪=g?ٷ0Fm[c On ;όmtsLRXsTO,5_X9VXeW< 9&<Х>{s!y~xw-=p!Xb}g+1%[{uq0*\սB>``q0 B)6Ճ](hTqZNZb]WYojWí_@ %fھ}@O\~kߵ2m`Ź<{^$ŏM5JIie>h0)P!@LQO6i>'ɐ>L>&)__*y>wfm'nۨXQcJWk ^'V&@$1Z#6'C{!ztCeT}>p s^y"ALʣ;Q X)3p73mxi"!+y.][nvݟHo ) nuP#>r4\!&&UcʪG) L} d>L\$!Z?i bԯ}{У,e[ kUUv1q)R+U.˲֯ Kal**zYoX(^qqE7~6ͰPDgg2n2QSݵR7cUw*FD߹Q^YށY\b`eO'9*TzZ~~Yk5~u,U䮘ۊu^WjJX sR'c!*&^1^h@*1,C*_i5RpMj/~֞iy7USҳNXE A!(w aƗ>DS2yPRh\,ċ@%LҘZ sV֗t_>AWN^P$vduh:Kqo0nt}!앚TQ)zm 0zUB=S[ }NНw@h˶dS<܂P?ŇiLd(u4̮u,nkGGB{Buևk٨n+=e ]9둬#/Hb|R;aQj.~=\VϾ6-pY6dk{<ԁc+d/!d*4;I_;ό)S>}RdpwBByB`Y_,D'u@_WJe"ɰPq3*h]}gX|bX]F5Z0rn#߃e?&9 Rl,g9[S7$v{~x s=#Y h^@ *eEXJL@!a rꋓpjl?\I^~~VMkP%*aHc[?X}\ Wz %vqgGUhezAXsCy+bp\1a&QS:;hı@B$5bڶkM]i*ew]5](N3-4"Ԩ!|LL| 3y!apP b?􊗩n-Q߀cSMbNE2Zi^f) A(ΟkYev]!'GiC h Awd!@VBmBq#xA$/t;Q-TBx#сn6N+â=Vק! ;_X[xT}Z V$$U~::w2vZ GY*[4ވ3~wzb].+ysShQbU2R cey][nyD6 >c(!?Z+lH+%+UxahĬe!u lB:<˱m ´Vޜtc$i95e ѻiȔ0t>[M˺^k-6n8prBUQeB, < *Tv#eG_ K"-҉Bi*WtưavcqXdjHVwH}h+6ZM=hН̺bZO:DZ[jw~7*XZV/m^QBvrũEvzŻ`ml+w}FcSy!vg9 ߿['.=%/ɴ ^-tawڙ0˞q+T_"ݍҶnU jU'TwA|g,WWCD.KcȞ%Ґyju;[*ѳVXzY :}F&YZt,]@*{~EmoKǴZ-y~: ͜Vq7tu UV(Cz_;` FcMX7 <৩5S8D8)Lsh7G ajC)Iʧд}aW 5XUOw&rjYBU_U&6i+׎t.aVSgG'`.60o F{mk+/ vW%XyJRM_mIN}%Xb=X0:D1|oqq,qpbk>>?$1|Sw vsP}:aC6֐Ō,?2t* k,DYOu 6I;sl.uD{[WzhzֳPYPƩ<:: K:}ZW- ֥ZʀM. RScmORP}~q,| U u]V~=b &CB)"z}vIJGQJqk~xXѭ |+6MnR_qyL[Cms.yd)v32 CCLUB@X ڸxt<;zHQShx.~V=Cp80^_bmNkY%E2xrIb~Sh-iȧOZo-d 1ʞ38p2P(TMUIb^i{; *=̻ 8DžG|i+gwFl@Aʺ!u9r(W^تVR*j!E#TV+E9_=#s1mդLʥFHeX^jJ{e0X][O~@x0i2Kxn>㢏뿨FŐB@<>ۓz_<† <mGXJQۅ@ɂi8{LMOA|PωF|,C wEF@ Jh0_4v{Xb]g,7.WiRjIe,Y4ۺ妭ߗ-7ۘ6s(`gUbI-!8 ´ԩ,9}J&k  Zf7lt}BGn(٦u2¦D3av6~υEJ7tƴC,FTkִ7Svmc4~V@k i|6[:rGzQ_ 8A2GKb{_dt?5CFRj pm#&8R)ۼ>9B,JTz6I@'ZXb]g,񔳡*cb9"J IJ5@!xLCHY1sgf}By˨`=o@BLyt~=3z-NЂ4_{F}bb. V.Q?Q,弍uNwʴ [ ܏Ø2} ܢ ^uD^J{@?$ª;K< :,~B`F O:aƴ5Զ~ը(o8/T6g>9^f !%GGoP>F [Y7hqG Ou$:yGj"& 0~uٔIe:]9VV#V]y r"C[nE:5%ֻC(*Om U`d "AN ""lF"O`JW`PQVt=MFd 8ez2y %Lχhat޶ⶼkyK!,ҳ wm/5mx(7B>:aWnG W\Z:u .2I1Blw®ߗm$km8uIv}V6V"KH8鯏ӻ[ݾK[iHn(xO-i$ F8k}2t4q eGwg&=J ༾T<؎ǵVϸi+wԞdخ\i+%1!Bq">~m``Ѥ0OEY0E]T%YGȕb00΀.`~tŖ禪"r,Ur޳S4{ AWˁ2^!,&vHu ɘb lf Yܤ+|jڊu{橺 GRw2CUU]!g›L nAg`H{4_vώ+x;;bRP@Lc؆~_ޔJk6 m: Y^C;DQ$zq"6P^)][{ܕ1T"iw-(WwE;A=C;1KF52[PXuNJ]Ui9EmYJJ(vk-_HS5Z($ٶb(ʞQ8e*e~ Y/[FThReD4Kv)5,nI-;jeCX jk .G ѻ0B9 Am)r3JbSm{ߣxD?O7scYVS̪:ô0O6)9j%L&Df5Yq̢jo\9HmzwLO?BExy:` 0/VM--wb@ Qc`@r!LU:pxP8=uυg| : ]gWq4$Z=,={q.tRsN+=4}e/ pٰ!p%M[?=&˜>J|V=aWV[}dϩ|n@uFa wrR6rT`ڗ  '_=޼P{}XR%V ?ZIBo'"RMWBg  AsvIgit\M4> @[f̍@]!^av B5yggA΂::MұUj޵im/;lǶ~(Ӥc~V;IA=5U$lr/${sǁ,辏@ƀ[s5 %͹({D1CKRrN!zU[?0**zaTogd9=# w(S2OXG-AxzViA(aUXqm{zg"|ogyy (0*7>`wZQbl}Lְ#* Y!B9U%68SGP`2Q!Fub I,UzُZmOYic$9͛S okD $<GH4#0+"A1mrqpDΏ|Tw|u5͗ZTyKCٹz<Ve!u {9_3 ]3}=pqX&y0&yV(% `v[HK(lVRwH^}ŁTX)qhȩg_(\CSN+`N.|+a.O9`r4oSq.';Gx c޸@UҀJXDߑ7I ˏ820[ mIK?ٕrVT^g5TۭTl-UyG%w'iCd#iEk*wCzzLƸ\*Q}RDwT&}ev< 4SFwY{٧yƃt.T5Q2*?D(zѵ Sj?fR E=I$+#n%,$ӍO &kkkp vz{\Cw6q_2kkINwЃ^qsG8öFvoH: <Ng6K`Ҝ0+r<2׿d4Dj(QHe3`DuPߑlcJѺ!NAmRotBk="٦ BoXGL& Ñ}EKoE 5tNdA Ȟdy(MB[L٪ ޳@k~Bz2NxF$- 2 sH!wq9% <eT ;c7x AmFIvpQ΄*OXߠ eOY~9;يG6_ |p;4jϗB/*+f5g=Қ2ΡuE|c+fH8N&V$8FHWmzRe#ٓ߾U5+^ckܸksHNMS3q+Ó38 מv~Cɯ`Kx`MPQ֫ݏҶlէmh:ЦQ\eFC[ʘ̴Oss,# a{J{NbO(ЇvYբ(ϰsm:zOY~n_蹩W17DK̹_ubkP~u[t`+~%P(2^ˀ市 H]WI ~:Y@ә!n4L{ [{fn\3zcj쁍W u DJ8(xrr;4 >_^N Hk'[=` 4/2>UN*kσχr6 dž<Ȫ 4c"E#U[n"C[ZD$oThoV4 g5OZ7=>s[z䬿po)Fڊv25P1R\XU,2.eBٵWU{A Bv' .8Hȶ]}>ة"-oyo9hӶQdEM *TaYᔮR`R,ݹY?y7 u~PsB\zw?_i9.H%.cqJi}h^VŰʞ38F@N'piER2|/!f⽷<ۛa=g?53Ϻ.`[db9zydT({گhi>wuG\P}D~jk-,w=$/bJKq,' 4Rw כ{/pr׷Vt;m(.r" HƲApʈrF4ݛFѺm} k,(?YV`5T4P{ Qyj+9s5BQrpY(dLW&Pۣ G^XK ٭+Q~W\qFI}Wx{BC fZ7E*La (zx%~ѹbm+>1ȹ r4 $zG$6?эg G{UWM$bv=R]fzuc$%QgV^1Kwmr|ȇ3 d#m,bl+_lgrO@@l'Ke< "5"BeZq6 pnK< ٴTDzkƨKJo})$XTm(e\ cnh֔:v2-k,CO[zYl=BEmn;Aj4H`K<OCzn؇xl+'}i7"]MnhclUxh:[Mah0w#pa빂 *V~ZZWQ >YP.)~Oio^Q\crk{C] xsGФ\]kOQM+e e[ZA bތ $mx RL]/e0+(+0WmfcfAzeUlW.tr`orɤk,t8I{$uɲ۾d7O6)aYei쪭[{@} <Aç#=[1c. du^m- ʅC[? {եxYn? 8P0$/pck !u@|2? .6]a-G!Xf'zQ9 2hCDZ V±H) O{7f3:j>3j mő)P!IڭPWYME;|MNQ"52.hH8,T_#i~"a1 ]gp,\ CU1L/ES҆J+Ҿ(2*Cj:6z^X_h{}h+'/V(uߒ WmŒ{<;`G~+:en%dͧ"=O?6Sbv(}܎agmYFƯvRۿHz^mvY;dB{u666Vf'u')\1} loF4@[zӎ,,sCCR}})?=ħ<'1%&'~C qz>iσC韅3Ȩ}x; FY!!ڊɐ7Ǧe6"H{e&j2j6*Â֎%htMKjbWw/+R_ }ǒTɹ}1*]o0e/%Z1<ұadޠ 6o!:-A/nawu~`U =g?hY$Px҃!ͬԂa)mlrg}xI丂IQQB]!kZܮMv|g7l1T_xT ~BZ\!;I[X=Ë}R[èg<V@.g6 6~Y%\SBI;-*ueВ|@ WET|0B's[nꙅy (H'W0zH0m1 8{K2Mg7(r$hs*w7/RR =9̕y{Sۓk| B^jWH}tݫ3q5'y\ FBdfXUUgv]O纶w`(7 0- e`#7-n #ݿg!C)s^JzϏU(y-q X(?M[*V{TvQth3dF B^ l@-!7;W#qt^8s>^ d¸$mGJ뽠֍LK~n3 A)!E57t"޶VKfK渀F~o 1Ac2j̝hCWUpxTI+L=Wa ;gM6<Ɲ9. j.$0͟WKo?mh+6hLks[mJgr&_{Oc[n2+7O&SˆL }xd&nVzцPzia-ʈvwj3<#=A+jݒa6YaĽ, pojBٕ4}e$i*C}ә^TOSйgЎcSD<`q*  ?*&{ʯZ$P:0%vt/eU +_< ͟H7a }!Aݴ atf˕_`ڮH {j+e5CvCB- (~aٳӢ¦z)$ؗ7*l]i2a][lٳlLR T\2~OH!PN1r!=?K2 C .{Rr?t[nd{.\g2:S$ x< A_OߩLU!WrHFOrB `PԆ-5P K>}0 3a?"DC]ͦ@fȦyUu ITH¿ql+ߟY=zB&O?wy&{U : '8@=cܯU;YM'M u~R7:'o``ڊv9 Bd"5QR @P- eߺلSwnD4ccʖBO0NMIc+חs-C?+mG_i*TZ8,]O>#KIdqzD ' ڬH)mgWSvA{ n]q+n{ EУEc]z}s$$o:zNRYWqo;%UY5t*VﱚiI 8~xȇ8]s\SnHhM"x嚥唚4`]g,HXՓ~8eQ0 0#w;00M@, i9vm6Bk0=KW--M7>{7&$XBҊf j<:9zx^YY,/>T3J>,HC[?5,qOy#>WASbiahD\#uUyꈊ'۟<#|?qX`2V\D'oڨFwnG1`vZP]E?_墧oRrv_}`H#}{_A xc+Y7Ǵ~p_ -AcP$lX ?]1 ,*՞4 WmtFC^KBXI.mu&fbXM,륊s 6(YnQ%PVhVVŰʮ3xkܣx^yvGSE0Dtp: c{2pKZ LSֈxzS{F&[jcҴWT|WX^vmӔh-GVŰʮ3x7PCW9ph~duĻ6nY9@d0o!?V_*`'{h+KRW\\kD4n]XR_ i6F8S$6#G>$!RW+u[?# SLg~K۞i3sE!zbEQ!De夻8+bfO ,ɰ,2ãJW~}n+Pd`>U:sƲE=ԇPûR#e1, < Mq;t r8#At[  X0sĈZx`I4֓gD#-Ь\M*~g"6oo%*of`]?K8yȉW%GN&,zcf#@z/%T@Pd;VqӨi>?f(8cn_*GmrCͣ&,Tx?qmaX#ԏon V=?m"Uа_n}USX2vRm2+WC|e\8pFʜb?g]w3,o=Ǧ c8  xQ2:+1J^nr?ͼ%NkdVYvgN' yM:܏,?'wS=@Mŷ̍#2\QHFtV)f4Xպ>V~ GZUZX{VP$!gZ6 8EmWO+ :_57|կJH[rC[WZФ$=} mr_2tWci'䏚Esq"A[ ,)4J.{/WmEkbUojjNhz)?VT[n ΋9K~A1_PPm7:jlF>NrgyE9b~=,c$rRw qx`1hyD_UIޱt 'a'p = m{iL.J̦E1خtʅa4z{cesHi|T'7:aFLfrvd$l~/p\Obj*کڰX B:)'o͟Z;D*hJ޼+.gD V+XhFc+M7U㡝U~ª\ 9E[Coh*>bXf2xW,k]X%mɣO{CkRN  -aB~0\ DDMʭ]@n1ec`tX.jۅ*+%{NqmfT/ ~"TŘH3Eω}O&=gCV]bW ,__/ H]A_ql+=u%XSoa nUyy`Ղi?M LcJuK\~:ᄈUvܺGi 2~p/Ì"3[JG[QDjĆQVŰʮ3xSc ہ.{r$QWޟ6ʮvi_}k! |ε7k~w^}fOh3ڳ@YwdZT(M#%*PJWv k8wzuF T*/߽gSQu<m{ֹ7-3>?z 9z7GO~_G(E ^y ;7Yf9k:ECw'_b\ba>o5q>gmj}pdpO@t&ʲu "t]:Me/) MnIFO^&M7Njb]PI1Sf"dz\Chh+)\b2@?Cɢ^B)'a͎}`" a=gp,~Ⱦo+5uݙa%+Zjߝ{ڞDӀ4;F,}!.Q:%Iehw\1B"b,1k;7 kfysu!Ux+YDsn+'Yb:?i}OiVL)EzFl ⹂qCȥU`<V,Wt#Iі^|,Kh(CR~LKݷ 84:Ee TD}'O&2Iͯ7˼m#4^ܸMPESo,` mB1-m,_v+i;#wr%P= 1tFa]g,q]8j9 SU8WN)BUH-45-a=Xj_yo{~5 'kW&so٦ѽycOj+ڭVEV%S ڊv뷞̭!O+>0zC8\XX+Qrx>y>MZ8#Yɨfޖ8/2^H4*pK1{R' FtWB᭦E& L6|`==l<%/uvdC/=VӾbzXC^m2,h]gXl9:z9^R{E/ZzYO'hT'h4% uPI 1#AKCOR'WlgGDG+I 1pW>8mU =g? w{zJECDFl88/y^U1 Ns,ϨGωL^'|@R$\~蟧w8slJ"i?*0mzrDa tJ(^qnmz_@m][_C_NYtjaU\"qQ(*ʦC_l^ ț?E>:_%#wـuSZ@hpGNsGI([V m0A|sٺL/h3n-|'#ٯ\UQ6(|)g: oV&s禢ueUI:bQM/%3.Z+D^c(&puw8PzhEK0ђCbP;0˕z`alxɂ"-F}_ܷV07׻Ꝟ87Wcr[%%'z}vbAљY_KXMfˑ}3Q'm$(*WV{y#1j ONj0ܣN(( u H9HZ(3EVͲ7߶'`UUz ]`O4Dό5 a]g,= r`fe/A26 tɪV{~:{N8m M^0B_駍I;[P *Ho 5{O{;0. 2*JG٣#p8beP" _8)CVT]e)\D)1}L>m*him, mEy=':EE7q {ʹ{Ls_v>UJQ9$ttn:W@ɗ672MXmJdY:]/%siOAe*wL-ns}mE=7}t]Y5loA:HP-M=錟35Ĉ^k"u/'uV{ci 'VK\wpt_xSev]!g?=̪p*! BvԁG՗lBU#Pxݿ '>$d93&8Τs>G<_փ%Ar[abh [ĭZy C[?}!. i=i`-N}3dpfL"t*ƢnӻUmH SPեnVo^5h/FJeN?9Wt g6fO }90ȥs=jHim1OBy&0sEwo#Cc 6<AWx}UU6?l2iO=r@05@=,WC<ևP{lt~rV|~M5ujkI`mz_TYogT[?S<h Ҁ֌%H)Dz>g]Ix|wx.)s )HxO:)KYrP.'C8{Is{̮+d,׭bzيYAdm306 2.{<\ƪDKm֔9q- =TZbOY+h=gWk^ k^^ObD5S[+4嬯TKOv]CL4cyAD;BXci0~o(=P BŃγ-˚=?wYa۪L 1ә 26SǞ NIh]g,Wvay9]*b:zaA1OǤ& %T5tH2J [;`-1AQcT uEp(2NcEz=1pBӎ+l73яKD>$Wr[ya0}ȗ:Lg򩭀ǷvY`=M;I mH$Svܛ/k%bzo<4mY KfH62)7OKTڹڨF3F[L\O{r, N" >\ՐڪV3x8EVP6pku]tZ:T-H\-xHi Z`>k?Ќұ7b k"hF>,<2l_wrdh&u&B}Wa\Zu\U1  bk {5]SŅj}áhZ.>AXTeCC ?#7TQÞ ڍWqa:fJK暄dn1̤_[;$Ў&GHdN(N!V 2ę)аʳU1 EM@5,v/SKt[~G l"҆&",0&ރ0O-´c}Ծo@UzDgK$ivg.ރjL~Z3aikdsy]'aM KLITkKG`,v~*cOMB#GF^إt5S[?5٬uHe5u~^peIxݡSY2< lCHۥ2 /璜8Vt[ޢq_<){a toÒ-_gW0Kl LѬ]eb!<1ߎcȫlWi\8q~)dMbVw͘VĢ[Өݪ1{[btBǰ m] * ~|\N-C[?=ͱJ{~o"}V9a1 _mWZ΅WrZ Gv9m~MW&zGhϢ;g#XJJ{Y'1yqR5R;2ڴ#-^Zb1X5/ 3MnC%^u]k$4\׽ۅfP.{veT ;c7pX E/A~Yg"ujLF8"ok;V%cuo0O֋lPx5>dsLe1,vSi =k G3\|4dxO<#ql(f]1ֈ?oo)]~}ؑ?N*&P_y8-( iBËDɁ&< ^ݏk(;{ =@+,0| 7hn*ډ_NR1Hy Xq ^"r$ &ĵ,^oY gbmutba~!cj=eZIyU[2{.hL?-%PI2LF\U\;7y\zs(nA c\ރwn|b-\ǔqˤG5򆨃d$z{G%dJ0u[MPK- ]9֟R>mTUC12MAY*{:X[)^t1y1h"VhBSo >#g$ H'CmC 4~7Q&MhVjӯxu[ "i2,aFVκW٢h5^|ThW' &2ZfDUSd6+~uS g?^9 vywrXx"&dvF\2H6UzI*%ݹ2< t.q ݡ~mnc[4g->EoINF Kbڧݻ+][49R%*1s_A?; _RS$T& 773MloH!}l) !'#;##݌aY`o&S' ãMŦe99_nU>WBRWWJ'>C[vIE.xpޑVQEaKإ2,m~RSTk$M9uϬEgbT;+yZEeY B~G*>KGG?rk31у o,qՖŰx /i>K&Kd@VVlYv.:'MA9m=Ȁh ?޷{3փ ~ll@qUŰ̮+d,7Mx$ h^ǏL\g OJd RD*%JP"'U yMY2{.hy])W)WyBk}xՓu[w(lChϗ&*?Ax{Kщ|/Uqq䀻 ʲs E2dSYyE+I6owZ[Gg:=0ɟfKT|3}((1KXZOE4/юGU@/?'=wƨ~Z!hE}Zߥ)\@R:ZI,ů5ғ_[ 1âvvtW֮(keZX޽*$EF<!.GQ鶪V[/U34)]eX\S Q;Q^禢˿QHZgʓݹLٟ^}3OŦPFjO]^Ŝp ~/ abVZ8*MrrT6biWZWdh"n /q kjKn{)v c=)@ R-Z6K (]dG8gp.<{[5U51%*.VEkH _B"F 2Ci+JL(D Jʗ|b U1 ! i9jyr#3{.Dzz7yp8`cuUsA될*Uvq` sAwd11Dz<=0mZ$eMZ%.SK CDY2Ўu#st{nZhVO-/yl3ҶqTkW܏].SDvƚGz&C%1T[>qYV޻gygJIm,a@ǢKEDda~: _ZΨqJavbc]b6W:J#Џ,U[6\x6/)Tpi;Pr0 8+j`iA (˗": ǘ^y6ĩr\gqk=$ЊU[nrKEx#ԉtgfXik0:.`SNn7ׯ}9X s'y%1qO!&پog[R] x)7>Ƨ?*zsitQ?xV[\A@v=l#i*ک';Kz2_&mE*̘O 'ז86:1ǶT):gvwV6ٕ'm `al ,8.d JG Uއ J%DȪ^P5A]Fi!1ra+, o9,ȥ[wW.:X5p!Dݞiwib9&Y4 #W+k]2>mx9K1c2n;v*K?: 6xl@й߳ZVP dlXmXy~_أ?Ck4kKգl]1~o]UhJnV Ԙ.N{*::̿$A5S?woI`dԈf"kRB֟>UJ8WCvn0i"Jg !T͠AkjKf=9$BKO~ۏMj4E/!ZaJE`ѻ%êШfhVc(wtVUFo( THhnU~j+'ޅbW*gS=g~j*r5%ΆV>{u{zjOY5KwRè㭤w"N7gʴXfV6s-q37o'i0m ;Oa}D𫋳Ey,c>OYCA[Mh% V\|+>"5Vt]űiOQd6D?/ѻ W~loA~h%?g8}NUT$MU;.ҡ I.z)5boCʨFwn͊vljO1I?knU1\gp,M(a'q)e2>+j4騇ɦ6s^JJaS$K~6 VO, 8߇ &|)p\!;2$rQmoUJz6YErPc[oJxM&n#pp ߐɱ@d}?[ѳnz/-nZ==8Ʒ;[a7mVf|\oydINj0" +ͬz4GVAr{=fo d-U nSOXq[Xe~Wk]0ӵm|F&|: ?1bLb@ H:⒘(u*齁+3No!㔧8 E)RyC";4riGOU&:~YېiTj#Gs!t?--FQQ;bDQ$HPRT|C[vW߀bl{۹9>f'5=V [G*AD5n?)GV笽 K=( z{|_oFS*MF~]4bR@_zba V5g 2`%jK68}HC1xv$n~ <-OS#A]wx}+3^LGֻܜkK^c(vʟ ^vQM)bXeOv1`fGN! wj H"S'j;]Ul37y{~rD5b3QݾG`Hi;}QiіŰ̮+dY敇˗'ތ >m<˲&ɰu2mY(pXYd+Od|^I#i, K @i we@#"*5JNb#B<΅2A#jbXeW< ,k$8U!+whK$KWAFy 7x9Lf.}(Âv,6~ZH1׸OIk]+_@ݶbx~ Tu?y΁SLhuE\ڎAޭyl˾QnpLrп.u7KVo" 8|嫾*3 f~O6gڢ.KylZUTg umȧ_G)=,߸C˥*džGR%QJqJUnc eC< 鈎QmVO{* KVL#;VZp?)y GެT>Y,}>?4R0Cc%g#Jɳ Жv]Xhn+2"\Ϡmm-u'"תZtNdN!f;g<8, +<)U}Gbp]29 g>¿Ϥ4ʞ+Kqm.׎-M %θG#  0;Px Lc^Vp~S(T ?EBrt$! ̮+dKOdዷ#M4V뱘\%f=LVZ)(P֠Ǟ0X9<*ː+ɔ=튩Ja;L5۞`h+S$}#mG2 .Bvbƶm^(U#- NgbXeOv9zmP͇4̑kt4R/3{U_Y& ?rWbܩ2$!'p$vJ[2{.h}ъl'>#4c3PF>PyI6GAf.L.qaX.xw%^ q!(*/ i{ 4S_3 v:~.u+Vbtxϵ^x#PbUtle ;Cn?`vI)7, o'7%gT,uE-ٖ\iñctUR 05FB!@"8_e?0*:80ڱ(lL4D֩<‰<ݱ}|`>#|HX>`n*+i. )љ@6PL2&3M~KT)ʴe1,}WYo>_bՈz"16n=A\~K2;߶=^{mzi(ځ,r})"$Br%f%yYW?l/Ϛ[mge=g)fL緺Y~XMgPbpݍ*(-uZFK悃-;)bXf2xnF-oe3,8#+<$,gh!d|d:^2#r ,1iZ(x? %8(U 0O Z-.+4+m\] 42VQuڥgڝi׉"70[w 6IXzGLY^ sr~zzXFMvtn;%*"/ ~lx%U9E? XdUH|tr b,  Eэ!xۀxҚwe@M ll@^^d|`ԏ:O!^pP, < 9?(]n?*Uvn)KtbŜo+Gc$rNJvr;1 rSUkK;;~U}G_r1t-*fjbϮ µ EP t(Z񀪩ڼG:U)Bʯ["#gVm'R)U XV|-Vcp vs jDkÂ֎.hap"G/QM3hyJ:]{E}b֌~_ "P·p ?;mE5N50&bXf2xS }f u÷9)F> !f0^z,CZIhPrD(ʲu Ov(1Pc0d"m`ɴev]! .jՑ|hD r.U1|g,F=1c_:!G-7 h[pTϖqVF0ʞ38p_xQE:j Eg<PQrtX+dH %;Uf_=HY`SoڡTC)^^a]g,7]U>ͩqD5 +;)0)2| 2qH5Je*:@S[?=@'8rQwUnzXI0A `Y ?_Q^84F&Qh4hjB/KYH?'"zBu24Cp,ev]!g8ELDl 3rhq톽<*727 ~uYRplV[HJ9OBVbn\plko(o@7SwUZ:;KXy`Wn힎xP>8sx=)~Is=4MFQ5NB -m  1̆U6%i[iFړ̖!lad`.ͪaLyI2{h}>xJza _5ܮ,탚 fP8KVh^cٟ ׅ>$ 8La~ۆ@(\!;!#X.4TXU734qj%h; :7٨FwnJB[hZ1*K Em.uY n a @a+fZFRYɾY0}V Cd}\vE}ۂ({RQq6$-ٯιnO'Fyb! d~e)}/} Bl'GS@c@юSaxяs.Z65a Aa.x\l9AU³,u Hn2YLbyV͒ LͭY{I^U5[$wrx;FdBHyPS x j?hf:5՜5k'B '!Vpm2DDcym=k6g/m>Գ\*1=%VVOij+ׇCwԡcka}s8xC+c%Y.`NXx`J7;cyJWL2ClӍXiģ7zV_o*5\5NOT9^cxt2}aoJuteY B~~ūxهkh+>R=9zYfA˕g۽#&$_S+m.'\B8da"  12^iVޛdۮ@bS#ȥ1n@R$:tÿ(mV"@Dٮ3nY}?"*WF@7pp7ZKu6'ir+rr ~pvo 椋;>Uc]@aV;2%05r'~^ޑ`;7O_ZU-5īM`n^I&颓TJ+rr d;rd92b7{y1:fBʴ.'~);F.> ZcCg${tRI3"?"_JM)#6uޘhpc_;Sj;N)"2CaOFA}3DYH0Y<^/\ĸ+/_8#ͻL9X5HZQ[hyaM;6z΂Sw|9Gcg#eαm)4ej[ʓyZ4K8w}=Yy cgH2$~al] i֤=kҩvפM*G Z؊>7ueZ ns.yV"jO4[ g euw4`wo.7ZgϽ)e |xWư5$4̡u$pDfLˮ7/D$^o7sfļgCmx~/=Y+rr ~Ìd qx,ιpm>f8=ޡ/,QJʋ@wg^fB9[?i43w9'Q5H~zbq< |S]=o:\q 4d~%'׉Kr,s < ĘN]Y*C~1y1\~SA)*CA@2;>cIe=!'- $Ne罡JG5SE5׾ΎƛqzwrOay{3-hΔpr?S*Nr)lNkHhCgH4P2x;yrZ;*WA㚷ftj;[G $ZlneNP+Ԟ=utg7P\2UnbH:7Xc >zq$1l|18~znWԜr,fD5 1QAXt'd!_dj slzF K Rs^+KKٍΊ=']?m׏MiW+B&8vfX"*G*H; n41bW~WiY =251P{$N]a=J+s);O*mڤd[{)VL/fYW "dɿ+w1jNEi%99 ~th !{#h='}1azr,Ĵ<46+u׷3qZQ]Y+rr d݊$MμD駍Fq"nkћ+֊X< 9h1}ȸ[ָlﲫ E~{SFgC$$2?95uLʹ'rJ?Qeg%Jwe~bų(k ~JLo4e~02и8ж祲Oei|LRUPQ8d*e3ZxB%~uO{ `G' \$62VXP< 9iei+eS=rwZM]W `-?w8lwR sȰ8l,ɱ̡'d$ט4JLצL WHy81h63We~z^CeP/0$\)0 QSB`3^㰿% WN`l?Ks`r ~a ݨh~J䦑Fe>BPLe1o@KďS4X4fv% qNjՏ4v:W˿rЦS KڐPܞg 1TWAIje`D/ɟuVHteqWu˽~v7H|?gM>3ɑGxeToǸz"3e~g T%@ل%Hќ|? {*NZx+󂪁(qb)øC]võ2ۧ [MrNm e~I9{H9p> 晠 Ȃٲ=)"jt;{W;M6.z)"R#N<᫄Y8kg)]SDɞ6cL CR[LHPCAP32F6xQvknE"$ĉ#dΉC'iMƔYž.̢ҫ{FޕRRq\K)%9rygʗN Β|rPp uȇۛiCM;ie8:\> ځ'ɲi vdN@4S /{ajneW7SFW>1'pB'W3%S)#'ȘZ'^B6u͟۶"2?wݛo.%JXr^texWr?Tʀܳ6Vaa|Hɠz|&MhAH~Mhf(`;"(Nq$WO;3m mhHѭ͠͠"͍_d_rwŎWݰ\>p%{Y;R0q/r)yUY̔uko{>2Aު+#ko5h$EP#I4wuE>pJ.)kEmE_Z]^|Y``LQySDU;# fXd:)4ʥ/pt+#IC)~|VgkZuG뮌}mtx-!r=!%m74#bYvZ1 @ƾ"FǨxF9>}j[yW4V3x ߮tpC^>]g{5E^ڋ\NIȰZJ=+u w2.nX\f۲զ[{..hxUB2y҅_SVw<RI5ejhEU՞oAH=f |^K27Xy^˻T6"Nlֵ2?U@/.ۜV;U2?? A#(7IQ̉oB xeW{x, P /@E`NsieE BG8k#<2[r򐌟<]M: w-aƯ=pL6{(4IZ4g˒m rDfZLNؑ&v;'D)2v#[FWhޯ# mc:칒$"b"/pAV%^=2/l+ǨZv'<ۯ ,ƥM6͜fm^쥮o&qܒㅬGZ/:EGCоץAN9#I:9> n=f9~3YC΢ġD릐sĖ #ƕd8UpeyVaUz0yy<AI?s /$fe~o,m8Itt9گc[T )c_qfD|o λ륻)#We!sv.#/x TSFT32ngvaJ6nԒ域ȌI,|U>|QMC9I1kި7=H2Qmגh-RrTPGx "G8WIʶ]*ЕC䪥]x4"(GHf~Dc]+]̣ϹDΞ2q?p$F\`A61*]X>n9S& ً;vodžgu|!Y]duQi 9 /s5Ư53X2kZkBdm@vkƮAzC1wC=\1֣ JZ^;Pe~礚܁ukSF+(?]Z z=!Lwi;&' 9RR+%Ob2]r1FF9Twn@Rr9p|2sB$t.O tY$A'vJGe-ɱ̡'d$+eX_iGYrH r AdfKش+ ޞXZ峌XAHn5+?g30iu{f́1v{R,NY f8kte~e&zY8׺n^n֖uk !ro0Ǹ@Ǽi si źx1$0TGObx*fyxn︮lP݄G@ `։Qn(7;̕uX033NDv=));?Nmrk4 M 7~~𾅌FTǛⳟO@~u]^wH˳k-_&ۇ+V MP6}bѦ$ O,QH[FދA\[RBȺ!tVL7%S{T(spxז3X2x9,N35Bݍ5;T)#qs#X״psm# 6HH ̭J|r}J20mG+rr du") l,V5˔5Qc;ItK1udHj+GQͱ-#Qhy W!Ɉ#^::|ef;Nw/x?MSH[F͌u?` )emjUH`苴AU8 9h0ʽqaR=SFz[ ,T>A׈B{yb2?xI~A_p(I$1<7v3(w|%]mڹN }r-(G/ও#)Y᫐qwhdI~oiRe/0e~n!޿.^wRnu)L{%99 ~C8`WC.k ǹ9`k@ڽ@9w3 YM&K f+<ӕE䧢dj,x'Di?z?AkF/8B"A+w |-˨uٮ#r{lqf?$ 8w{?7ZfÍ^XJ=#ˑڳ#@ Ѷ//LECXً ;qfnH܏G¡r7\Ar0wHGi 1 ՟Dkp%Zm7b:!.2;qWA%TF- |FcWFf}}'3d};*&\Ib9%崩DY[9 ٴDŌ%99 ~ie#V>"}^;>5.7|{ *Gj4筟.u?M$$X* D~%?P^^ũ 8#W>RwTaC³:_\^P̏z2*: !BEhpn#-ÖzϗU%g7E~à9Jl!}F9#tKO`^xڣAa6i;SĀUy,%"z,ԃƓ\~*Q\T!1dVWFS3fߑҽH\zܶӽ:EQl6Vr*R=^Op.uL?ce?Gyn .0&v9~DĄ+=~$x'zd;i/ލjM/Lk՘ ޫz4C!@CⱇH/ ϝ!*c[06,q*C%e~~8eW0e| Dɿ|{.6eVeL90q*p9F9RwG7{lV+#9ʂd^ʳ&̫4ncO?!5 =%8ִhk,2fJE:g5Xƞt݇qQ]N4vfcfTP1Šv7Oeb#W.Xywϻ|A1w=;M]dLP˂jNxIRK ^%H 6oYK"YgIe=!'`jo,Ru0\?%w-:OkY їuOIN"OX{)J\_-ާm9M.srBI*:/pb$(zB("NO!&vD vj6-#+8iy7*bn2uDb/L03uȃ78> > f,NK0e~e4,Kwi_JϷ13biix yS<ȉS7]n^;ߎMQ6L=q> Opw oX:e*r|Si|ܕ隞NP9J+V:ٱ\*z= *4e~ѯ6Jh[}=Ծg]52g=MگO˺$KLul i՛%v@㖷=Xc%`>:x\t?_{bͻ'utl]_? dVq2VY>]{{"q۔i0cLK& Fش6~^MFryqrڑx_YDGWW/8_@k:Oe&43_Mq@cxj7~8ҧ=ץ*K\ rCa卛s'L+ ̥i Ӻ*j駈} l`ar_6NL/(e.WS7;Kr,cOI[I -Pγ#]Ia%PeQ$TW2^/Q{=N]C5$:5zOS]e1!99RG7CeMrլ`?3z!5`#gpn9joL0-ݹ?L\}7*@|? Bak^Ӳ5UkA^TZcCOI׬PV&ȩu \EiCM"*V{O?m?S1zba.ْHK:_o.9V9T{O?c\9H6OmtncmwG\7`jl9iNKC @a`tExNz^15eK6~fP83s0KPA ^aTt=S)!/`-xirlz}!KZtxsMzf) UB;'-TfcEU՞/0=Kr&ar ~?M;mAݜ,zq_23`7V9RyGnA}v/=6Ӛo˭u?eg*XS V9T{O?,4a7*&ϴU(GQDʐ$!vm/L$4kb7ga_&|T\"/yt {ݮmX7%5qSQ"7p$2 ~v ,~'zT_9d#B;[G񀋩*^BK(U @B6&kyF)0TG?1d'I?!h=70f9YE"f1> 8w!̣sN* `M1i&wʌ}fZSj=PPɥ}4w1@]2kcLU&*֍f3eOrHçnrNN:U/x|2 Vj+rr ~v+ȟq+`1 ?ɃFjvR(%kjI4)#WNo݄wE Kfig#WwF-T69aQ,; UL3p(quE8`#gp$f.L\oʠ>MAgs%a4vΒzBOqȰ?Ţ^L(^GY5B0DAٌN8f":j=.]_K=2oIid/B;c+BWKL2esInOMWUWrֿ, e~ڴYMzGXJ7Z8.SPWY׮ѻ2?E@%߳n{~~9iLΧusbǪK6sz;Lg9շ1276L樂zgv_{#)Iz Jpcp$v4&6?mz U;%ӮIz)hM/N*"tlz?kDnnh^{mA +{Gsٿ_6JG3&2?Ѳ2UYc!#HVƣh-1z}@8 d:/ }~h)XP<@d07 aWb X*H^&WxlxNZ.+=;I̷ 7MqXePF/zGLV id2=Q͓KygY,D YKr,s < l=e)e8y8oG5(ܱ(V(n*Nzc^7]#4E|8B/D\@+3.q!еC3)hMSt$_Af}?}%9g)is*AX{)hE{3x'n`28*C~زN!_; 1 ՟m ZmfX=kxMg 2?i%Lѿ&6B-|r8=?N6ղiѶՍ۲[2n$蒢G&(mnJom/#&Z0ʶ(5j:E^fッdv]ejv1ij5("kHhCgHf' ex_2 m~kÊp gӻd[F#ΑԦȢT[B*+ Vj(#~ؘ*Bՠ9kVZe| {Gg,ɱ̑dp$OBRʾ} I~,#kKæs\ ܫ0Y"NvaHg| ^.djcו9gW4ZcCOI׬Yj]rY+u5r~Yw!k QVi9swO*cv J:~`=e2qZ;Oe~%:tzѡevRClq巹2kN֨$t $Z28uwf~c"2G[IJS|I <͏qh-VŠ\`%Ϊˎ1+" 36Frjl52?8YMJw> v1WKJG: ̡'d|,xURy}Gݥ3~OV-uKKWF K~n  } [J} (tAGn0p30$K:ida\9 ~͊!wluBn8!cD~ 9V3x ]N,]Ƥ\2{(#3]yLeIUȊUKf]W!1X2xA $} vwoJ|,֋'}%+'QUrV'S%>P Lݍ9V9T{OH:u}CΑ;2&K^qxhoۭ%99 ~NSl3^umRvc) @65);T]j^0Hx_q-kPEe$iR$\Yr;,wUs=}2GCa\gr[YǶڵw֒zBO?[$E$4,ϓ@Z8%!C@LZݨt՟5YH[5|W@T֊+fǺ3}5dڴP^YaLYM@\=Ϯ~nvw,#Lͤ㕧&yl:wɾ<>Ɛ?#[%߈ؚdԠp8xNH7# ?S-K(w8z/|ڦ=ZcCg$S+*V&3cuI.$^9V3xi ]NUug]/yvl`>f#p# "*sKpۋF9RwGC' \tzltok=%2U:|I9/HsH%K#^:xnC!93Й>|nnL7uHlJM SR#OK rJq!8oc|C30Q3o=a$ңB'dɗ>űs5Ef5U*d~9kfoȱʑ38u3 oIW ^Gcwb4ZH3ޱ3pˉwj!99RGm$'=6wz̊ 5*F _p2? ~}^Ʋ2gpuz -_.rOp/r%[I-9Y*%U.ai#rr n6Pe[z0bhj,RSR4 |VREi޴"*V{O?$p魳3\tbIoKgEU՞Ηi3 ֠d嚝7T̒X05k>-'YT2 8̈a5iȿ`-]>6?3 d-隼X"HqN˨fQ/×e^ egS#`;y7C B&H}H"@htQϵSz_ $[6R,K;s~\"sXmjUL7]򦊕$Mێ2Z|L7 2?{i*Ysp5α\9 &J;yVխN1$0G֫1nKC siDTmބ@(tTkϫީvSZak5FQz Hi.;Cc}v n/_ͱVXjt<>i/TyɘG͔ eˬeF:o|y j7PX+:e 1̑38s\@Y;Q'eIܖAkCgH&F)癧w<4)]6ݛ_w]#ֆ&RqndĆRmWaG|8jadԭ9V38uD|WUǜgo ` iyy?̕da9>.ImnZ7zXwoUv̴\w6TL|l [xl5I/ߡ3GhOn 9p}V+jJh"[*6$ngNg׿bEE^ld*'xƠO8{e-4/ӿko:Ey-S!|D,2Hqoնך"I`,ts1Ւ.+|-r[@6^ XD0EXcCg$gO녵a :6.CuF5R'} x{Wel-^PsD;>65NBYaYSU>YϿfEx#[@< tvvI)s9swVѻ+߃'Sb8ۮAJ#GI7~zaw[( 6Gvfm:+#ٓD@˗| -M]S\{jƛ̶eoǂɞ_Fv2?1=ġ;{ሹ(CE\hL_FW"Ƨ6+(E\O4Cp3gej ]Q+aey}Ɯs6X2x TxG+T3 Qz(9]B.B aL|EXtXԃ)1* wi]8Wf"Q,4e].Fl2??cS;KrY"O?ؿw=P{{y=\0n;7By<ʒ́@$<1(/D~re~mrS]z)r$$7IH._D"7մRt8#vl&Jp:fwtJ}g,#WJ׾-(t#1>գ0~^WFc1fabgϮPjxސ|]60GMMVmT[e~dWFr-lR}{-{L~{5~V͸h;Q:]=>I*z&*Bn Nױi/md[Rwe~Ձ~R3 ^usnemKa%99 ~[u+\s`,$q0i(ȸZ+rr ~'p!ϣU1Z<}9{bܳe"t'oz!$n4!k+֖ͣ׫u֬tVo|o4y}?*7o0C#s)`Âe{E(8 uѺ)9HE\1'd7g?8 տʈY i])9~AL ebF8pvpcz6pqJ5N('7E q"ډ{B=M9Y.e^OC?Eo>L㼏 AztJ=Ɠ2;fF1e/L7xD{A"/LD4%>~b29M4ɻu;Sʰ)#k9T*=u_0<93DBJsșI#upuGr`e"3|UfƒzBO\+m; Z^ߕ6;bօu]imV#,.?)e^E#S$2qֶlFAu?20GH6n1Y걮\ r,iglX%#Sķ]נQb lQ9&vzQ< _9Yٔucs?&,W (0&hQ\1H\|nĹH#N[BXFЋ]?{Wa-㘍tŜzm˩á~L=Lǽ7/.y9qIrX8~iE?SZcCOI ;٣ :(u;zSj.DS< m ''Y ?UcXcCg$3P%9$aAx Fv,)0x2rn:3hJ*f@`-ɱ̡'d$cor >b@2<@iȲˉ߾x]^jwI;Ӧyb:Gs(¼5uGן#D !:pa:@6du@ꇏ@WlS2G_y`pޥ ɘX܁ʣO@X"Hυv:D/b$NjT[1 }c9[.i#.nL=qoo? 8ES}e_:K$s0C|4!2(͞JBw~Oّq[:ےx /J%1~u dXqګ ֵaՕE8yēmG[ww2g+ev?SG,p5G1cT_~zF%ck~jlP|^&\fhEUTxx5 mCfCOviַne < b3#X̓&ݻc:3Z󙭣^r2fRYKtϼJFrU*ƈ:Y/s3 ԞxCD^'lLUUEUJ})⊍:6ϷDh[gcCR6L_|5Iem6y=/Zv5;]e! <ݥ<[4$Scѩ2}V>W!1VXP< ܅{Pruydu's/|"_v [5$2GW;bN re:Qqz{_ >k 5.VeQxZ+#q? D!5!s-\gf){CˮmHz N xS{#3RwjS`Pk !Ʉ 5E^s+]vt? ˚jW.ebdE$2\<$B.Ɇ?O]̃s~+5 2!=+BZ'jZT>~'Re slza@{kJf8ʁ*{xRbҫ7e>D^~T~Tvܐ }YBgGň( ~Gj$]6Ķ,'@^N,H_Pv%iWJml yɂQhF,WG=t4 /;=>^J{Yq- H>K1e~89',SֵdOΫ+"4Ǥ{CX.=R)LpP7ve~f/T HO 'q>d;J\_0!PS<+T=,k*ooo,#릑\ Y'8 x7`Խ[eln.uNȲXz _fWSyO۵L<[F׺m7vtں/#;b`vTPcvꗃ{q*#dM*c`2Le<ߠtPu%,f dS'dS_oep켭FQq'S=$D%4Q%*ߢdaր~{cxBXGiQW{xЍn.$%fu6Mn0#췖X28umTI?]c"2%U΂ٷ`?# H/dԧ i/(P= qrIrWGNVFQr({= F(;kVvPp~,xg(֑, uye~JFۮF۔uk3JqD,UUȺ5#&ratd>O{:* 3f?2'0Wݣz&E ퟱ|I+~@0c[YiKJPd—M3%v ?W@lb)3o`XuS/=[zg{Cy.UP:q4LrYAQp\X?,"8xyʨVXHɺ ^u-A)颰wKWF~z*Ϲx%L]"kh讥۸5#43pɇQ:1D"*V{O?Ǐk# H?j!<ᤏe:u^*g3tOdULխ Q՝#NumS*g}SD)#(Jfsy92gG*c sl 4 ASO! VafI.Dd[.7;[-9 Μ,Yq -$IsѬ{ђzBOd:TJ (<xBF}C{[~iPn[޲O~*xnCj-ɱ̡'d$߲_S1& ̋G$cdSRP̀PAѤ]`tw}-B֊=';l?ٳ~Hd1 ˬ^rr'!,s <(|~vrrj\oۦu8qrjyR-meRvGKr,s < R7Ĵ.2=`ұfjۯr:#rBugp$p3$ г/`m91e~o! @9Z |ݧSwn sl "k ! :ipte?y/p 1TusQKT>M}V$2O.`H[eZEfuftqX!XF.OYHU1SF[_РN/:j]\ys6VZaٟVګiJny^+6WX0*g5ݭ{zO =j~}tG%Jڥ_յ"NmPe )0xV`Q XFךo6W7|ɾ=7I¦~נ<:2:nve~o[$ZԽSV) UO 陋70JYBrֆu/Lnz6e~mWIEc-e~홎߾n pY#KJoPHjXD%;Nՙ{9H f?iq1Ԗhuz 粪%+G+Z1)慬d=Zf6F1CDĦ]AjhpHAHD9mDy]",m°N t"Op~V뚌4b="\ۢ/{XHob<}$X%៩='uiUz#nt[66#s(@RA#Q4ﳏ$_0H2`Br_iܘ t'n)m? EG5 41,oN算6{Z:CsD7=bn6ZP< Zɠ Ep-,8wpWv#֣_?<$l;XN֒y@GnvGj<Ҳ0+x bF *"+ܦ pA"e,_ԔOj.wb H{2( R o'M{*lQ$}ҽNmxX2x&]+iDu[[r 8JƯ4u̹sBdHqo`T2$IJ7e~$/Cx^)"j#nhzNGt5ewBkp9]M~ζϹؕ6S#g< dsp|{]Ldar("lS}%u51p_qLlcB+B+,[u1#kCuэ=lH/(e=wl'z\m}hE>}tG;$maTɟ2_vGxz&1Mi$lՐ-#3]QdB3r=褙Fy!bH DnUuN8["c5 m8\yf2U?[ ~䋩l%9>ņ}BwI8nPL㑕&A^ZZB 9&z38ٍ Mh)W2̔\x,]|27HM1yCW)"cUu\D nOP+ <nUyT0\iXp1<.s b}c'a2dƴT+uϬtG.LN%뤠J%uX>=Y2mbN69:.[5oo#[v]ʺ8 vO Ŭ<=7܊ q0DOpCm6c7a2,Y&q{yeK| >Iłc\el=#ukdw&gPOMf8KȞОf;00qFGG$ *@yoӽ%8Zm_$e\u ] e4:A4ܞectm̺2h-:8YI?pH@^Uy2j~6<J{O[%U'g2d?9lml #͓t@ D2C8<`VWrL6E{Ϭj47X*C ]7Q3vN)7ÕS 2;˺:^JC NWjٶXe~ν{촔ʡ;$-cI3o砙aZjBwzkߋ=,k;˸`51e~؀& j+bV 0sOM_86yF>ј5P79uc4zmfOG4+sNzϛ/ul˱fBHn'y!B<%"> qX2x5+M)KE"W&OFSO8#lLg aXF4ѻ,:R]Yg=tr [_&B;cWFLI˪Oܻ׊bڹno%SE^%d 5q9X7ίBHAH)MM鱗jwY)rA"'TK5C>zSToONRHj/Igb4xmM[cbWz+E4 hzf",R/L{.L>'i')89R}_54{!BXE.4xM:{1,¾Ǎ7В%UNb'O!I_"Gj/I7 . E91gÕ,\*xi ]ez}05U }@, A!O5| |5|=~<ԏ}v}Xe㰩fh| Q$8-K*f Xݚ8mx*3wjPrRQ"pN],AP=/% U^ه쳑EZ {Q^ͫe?<$Id4P@)53tPF.uVGҧga\۟hUC23oFuUcp ezӘ̓u{vz'; {?A$1KVLИZ(ћ-Fg%ńlFs? LCt'xlt'&#ʕcg=XIhYO R[Kia41#zހkAϼ6lYmZ;Y= -'h{i;1n ^1M ^[Znc94E!x6\D>ןΡ];W.g<Ir$Kdհkr]JëSդ#7PF_XBD/s3y^mp%dZHK;ˉ*E:Hz' =:=%ԱwP&g@TG=D"IkX^Y֤$eНz*#Ѓ ρ_{X.#8PgIr  s0,'+ 8 /e)Ekl7m8G ezHW:ae/7@d~0]rM҉4t~?;}rحS.u8Gg)˹b5SxNH&e[53XD*z>XXikz/cL20kd4j~ I.u2jf0GEmY;;1f4_ϞP_yqίӵGPj/MM#(}<+ `jSx*"'-uLXNb92>}mnqg*[no("j5jb^@ ſ"-j(ՓxE Z +;qץ6 Lt]w<9h+{ m\2Y$|7}"-BFo>H8)aSI-8J]ùF4l'“/n E s;l[+]+I ʽChht(%Pv\ ` _"~K }p꜏@bA(~dmo(@Ϟ}#EVX]#gxzhpD}jX,L4ZmҢE:gȷfE?x]FL}3/j~Jg3?MH>๫tEĒZ&V'Oa*s@-Gjzb-L N.l6%lWH TpT]KسezA!G4/$Y{{IxVo xvRdg ez}fez] ^v~ ^PPFv@ΒsΒcX'@^r=s<+e(#{ [ WNfY -=r˒In~bSC$=%:Tdr?^8  Xu޷`幌@O])$X^lwy΍ڔU-{lr 5UYr5f r2X='#@K1f4zb|j9dʌs̥5DFpX}PFp(#DWEXRҐ!0豔b2Y=fMuH8'AeQF&޼OZbF/Cs|Q ja9ܿ|LRJA:X/:sb}]HP 4 ̷8qGizK9_;&Rv^woxwCa L%p$ʃRf5Jyh67ʯ7,#td2^r৺HO|$(l[$rZQNbsJ#U"P$fr$P"rl k0Az마@tRY OMO݇fc C;h_J< (bj8$9%@Ej1ےc0C)Oe<٘S/05ꘕsĪW`{u j_[p(#Ы5˓Z׬Zmi$]@J JM?Giq(#FXg*y,66vx%Me4ZN&Hk:"xxߕGAtp1FTk]Ŀy&i䈳%R}zdLsجV;f?R.2HңY{TkĦH#A]@AЌUȽʖ 9SҞO3#D(pXESү|'1?$_vGTY6"Y)rJzZ#g|亷XuK}4>_;F#gxR]RRúyu,y ŨbL%W@ 0?ۗTw„^lkhhvC$Id P@@^'ACD!D& T:9>{mr拯F@pB? 8v!8Z}ԿN+wZ"f>Pw ڏ&csw[pP~u0mY3NFzbZy %Kz#F)9-T"ߛ|i@s!d${eRY*}?R?x+wynq?9 ߱VLXRnJ;yiGl/Y?,bdj9x`{hN(DcLԂ%2' IdaϒعpK wCS-%F8C_)|B@j+bcFf^5rUo8m~'9┃; R=R{ͯkR.U>wi |=~L?`|,OC?Ix;z(<+޽bǴ\FW_;[O޻eM^w簛,˴߰gCc`dN\!I۫9w{ډeVzXsX.poÍ0lmU'J2ʍ0Khx`B1[dzT|}SFgKeGjU^pEe%ɑ, (Uc|/s ̤lpFɋZǪ:+ETz"q.[99^Gr-]z:qZ)rb$3ގ1^⿈?efHUr/o _ SFV.&MAӶS:-y\}̈+ˬFdL`v<֖-Yy*P։Ps(r&krL2QH-A&pV_TJMJ\9%!l)"ВY%<1F\\~#{̭-#= GK<"òHU>O;?4uTy';9AӉl8OܯsYKwZj@2p2k^|5(ihK|aPGy1 SRwo.e{{Tꔴez6Vco2k-.-]?vYIr$Kzh:#.=c ".mgOز9GgIrA"-&Oh;E W•榟M2\9--)j:}z@ )"6<9SWx$Rì1%TjC ϞtىŰF yRN7jww{a#ꀓD,v-˾P٬_/(Я.Vόc:s'}yg3bX(UB$z|ڠR'z0NS^:p4i8@Voy (#AޞL@o}i80(rsjM:96 5 R7shzˌƃ36"[!?J1I uԴ i _Zy<ĵw&:NmIu_RىQ^+)զW8M2=bs̥R $sKm^ǔfz5yƢwre8lmoSFV @R:%PWL77ė 0UL3UDć>;z$ R >%BMrR95B"  =vpڣo+sB' :~TsAiOȑ* hvGT1ìcr " ܢŴh-ؔ%Unqoƶ76r6t{SFׇ;b&-灌fIr$c-$3ޫS"%7SMj."F NX nnn+BtU^JJ]dO"Q'}o ޕəw+;ox" k I4^0^}Ny~,= k@sOi .u VkHJDw=ݔgDZqD+-ǃ?9#AP<d79{wpP}W F|8g.#kqѿWe˱\s"Dʝ[MD띣t$,U$P"U~JϬ6!# mչJ̏;&>'IBq!X-oХ$CϮ{VT&Ȥs#TU#eB>ώ[\y4(FQXFo Ab[[bc}.s^2=9> .-2};g.|"$-#|O?[՛w~|f%j2z2 %r,~am^ [#&OkH#j"Y/~<_voYE2v'="L&j*6Uc{n&C}k ! fi4@vY\BH %Ha<:·峴O[ CڟnDI9-,Z-jzM`K,ԛŒ8Éf$ɑ,S^9*Yahy eUBD[ L^M73a2=3ay-Nߔ]n+ϯ!O8Kb S*Kն X*k"c [u1yx ezq3cRt S+@Ke#/r8w'@C+]]l:^LHŻubUf,ȟUw@į%v d4juK~ In8]ՖT^W!cX] z)<w.'~;\d^cז %.Y\M?h-3]"J@7>OKx;xƌ-6b/~7U՚Ѷ,¸9B (֨14<[70!ǧ1ָ2=jH1D E<"k %*ُL" #s^{o11  -#kz'DIR~;w/9$="O@Ob7K/z^gmx>e ڎE/|5 9M$9%@Ej@:ԟ!;1:;Ӵ9`#{>;<,o>.$~I)3}dxyu6u)"z&ʄƸ/q=BZjFGڪ7eԎEF;7k_2^J[}waYLY5uB$.V}8bcG*$uW j؀N lϑ}0{1$hmexg2jU?> (^3_*"D@OGy4'ez^#QA?N?ty`SiEZrZRqF];j}bJ]t`&9ɧ ./ K:O1l jJ !q P˯eZE{z>@'cx>2Dd} wQ搬DOĀ Ez9>* hK@.kdy$=6I'q8FL R:* .E+8s+3~+`-74oH_9P4E^YxV*V{Mv0+xbXhL}.<ktw[+)v Cvv4Oo'M=bsVF&^`G(ƽD 3uM '4Qhw>6Ђ%F}1UZ餜 Ho9{y KW=#7 ezgIk{8+t7;2mYIz8mc#H(X"GV+0WZ$t _d{S[lE_s'j:H-x^wT62֋bRC#\QںC MFaFo@ULcU2Ѕ_Xqny|d1X bIq! SK$0PrIO/+a)g੍#&DX-=VlCǀY)rJz8&Ή E)驐ku?HlLQLBU$9 hE}Mi- ¥Ӻd* hPH$ JrIP%"֞׹Q#2ez19j4+D׃`u^(AfZS3#gβ}t1d.#3'2dY!cÔ ְw_D8sɓrZ nIPʅ*.V\@U>N۔EfSFoR;I#&ݓϽ!~(_d1.{M:C/Hp݅A1zZץzNI:ԖTj=/e^yiFX4 Ls7\`H KUCV~ۃO5jyaP iEqO?gvC zX &  b%K~oH{{Ņ;waAyk| ؐ I M?0٫7RAF69"`8xVc#Qd`ų&.8q 6?b(m@Xar) Jڒl;owѠR'FI\B~hhK:! P(!7@rq[>i @XzQ I3R\$ ʼ+"<1 R?R/)>5g/nϩ!BXEȤ'e4پƣ)'(R~A\תC!AWZx27#X"P$P{q< ;GwPh$ iAW$p$GD/H6Q#[-8s<@ҵpv~96e`ԽR!F^oZohW SF'RGf:8]2=ToڇKHgxemj]seRU8h0@u$Y \븱#,Ž)/? <$[FTuUw|fPFzyc .(Xl!ҳTPϝC=JSPA@A$F_Dƒ9.W15;e,U:Sg,#Г;{^ydgD{D*W-#Г R*[;V)ޖC]oq.#R~T/sV$\W}lܱ@ b8YSqVD(HWHx VNe93=ӳuz:OָsF/״V@o[i"Y5c~\;(l@Opo$@{̢ }zUfH$NtyŒ -eӔU["41 Q5zWct,Vv3Ov.ZkH f KTrU|$9%BMnϟ*"Jge졌@?'K3 &RaKšx<1!6q)v^bEs,fN>^h}r=3J C*t>seHai,bݲ"u|]߭QiN9N)NV˅1n2ZJvj"JRW;q}mJ$5)#fYw;&mb۲M8FyU`{ޞMJ#Y" P$6=;s]>5I1CpolcZL$/UmW#ζl:.o4Y=g\EU7+W> d(#GeJ#<:vkvk䭞ͩ(xC(#[r[epk@ﻆ,I{bD|sWFc8jѹѓfrFת{wqT ϛs计ڳG} m *s޳/:WsүiR@j\-%*i~VP0&|;c癎9Z3C#WNX9Xwe)]dloK!mH#YB-$г}+5n xuO\&t޸$(E9B%RwEߖ ˩ ^Wx \7[?@YcpeB*¦n5A?ŬT72iǂBQLHeSCRG.hb7i *}u-Y^;K\Yոd.+WL_1Je謡@φk _Uگr  ]tičvѥk/.7"ޢqtf{}T;]іFڴճˣhUS7y;Jj$ɑ, h软_kȑ*UPY F5b½@n-)V¤̆-oɗ•ՙk6 &"A.H0I?vdwm0Tc Jh:{rb@7叭)8ukÃӧ`4HHɪM ]g'Ww+1"-#IŘQ?jН%kZ(n)U" eAxŊTF/4G>齡'鄯gO0hO8uXc_WcIX 4 f'1B3j.sJ3}}S|eZSBC 2AΗWUJ.njmedóq;uM)1ezz\;7p9@d[? @K|(EP8 ~DHXfN!Lr(#?~m*KF(jl-o\UFD挤i&G.m̘Θo>vB:t+S^ݜų"o7yk# W-@)C}mqYa8̏@ )k]j[_lNa~h1& yFۉ>SdCv 1nv`@#8uCsGH#SFVͶoi2其^wU3iGL Id P@@o_NKzoO\a{UȪ&e0xF>*3̼7eRMԔ#L%-ZaIFJ#UB$å'B&LmK^Ha=Edz*E}3"V "_NF1@*l 9&*ք,qcW.䡌@/~I:lx͚3)έBndhr7<4*Nz8he8 P.2ލMY%{80W󚼿9yP}E͒?^ܗ^eJU_a:bzZ嵸kZ"G*V{My@8 ϊw,;QκmCPFWđ} ".:a*"zvN6cvRip|:´@Oga3$$^/8u'@X_@˚?M}k it`u 2sm9W:K:>@ lp @;g YV@Á9}I~x ,?%KԷh4};uc4F"Z?=R1)Rl2=kOcgg%W}jI u';i#H(Ucf'jp*h[@TWy`72TBVbٯIBد~PQc64Ցf|H3n*u YqӃh(#ЋM*;dK' 5yl<9Ir$Wl&cg|xJIH0c)#C2X,Ȃ\"p;ntJ5>Olo+ЄЄ'1 $cFzZIr$Kz8 KT2{֎=z7C 71,ͦt`÷(60>@`a7 T맃!lHE!& LLǿr#/``(on!Pa𘘢d^ ܂?I^Nj^Xg{\M\8hH 3l@i:}ʘ%ɑ, hs'glORg~SFӱS Ɔ)0VX4Xqe+;S̍Nܲ^NL]:)"aj[k1ez{\j1:|~ά@5;`xy%o ?~?ɅX^(y|oc,H(XBHnKZ> ^~+6ԏ@n̆cٸb|zw.sYbN+SbRC6htA-bAvfy9g9 ݓF#NL'=)z#w}gfSFW\)k©ͥoΠ4w t;ގ^x;RA4@odpϿl;I<߯K+ósK-#=!]v==>^{L7wd{{.IMCǏ)?ѢtKh{k_~8Ml;t["M8x>4*ɺsiY.nYuo˳ ` _"Z*Ԫ5מk^U[)rb$Ѓwܖ>]A{; x" U'7?wfW)rJzxx_Jlxj˼B-}z8DQ$֭aJb Ժ5qJ^9 &##zj7z Clp=Kmk[9R%T{MV(Hdơ)I:&|x}{A^}.8\-$L$v`0k=+7P=uk܀⁈#`|ə+@<&0CpxIaƽ׶g/BJ9)*v (`@Oж 뎧RE<2#(y8KA1Y~9[9 Nw}+WنR@On$iM\w;&Ŭݑ; ,TðsWZ(.լ7ѧ]:08dVӋG~OVk!SPFC#%d_/Ք,IrN'6c{$گD{V1;+d5&6ĉ31z:eݽ*w}F4@Y?#Eo= H/GArCP$P3YFԼʤ2jEfVIu?GR0C\l:'Enޔպ,*C=ԝ$Y{C^-X{bȪ&b8<3nܥ1qհ>֫)dYF[;/7_<8[rnEϒ>1cPAzdK%J}X){Mx;M#Bt mzly&\fAbߛo3)1 ֜vWƒd(#Ћ[cP]O}e/4gH;u:&au *Ɛc(#6Wj3& B`/p/ VK@Q/h"fзs@D#'! Ӊt yo:{Kʚ6io:j]Jae{an,gJ_Y)av5뚑eXOֻ@AyH. H7-ÊzKgs>f(V2Y͚ul hhұk6 ^.Xx4>H̷PPHS8(֏y\m%B?uagJW9NBXPfzFZR* hK6+G]49/Hjj^H^: Clw-qU.N+E1OPT=R*jOT{Ocγ[x2xIr$KzAo՛;pd68=Q1 4]@7 ruBv9zI&T:豔h?!࠘{y.cځ< 2zfkvɜh{>8{eS6@ZIr$Kzf T>8TSXNe |;VS)0׽Ӣs9p{C:v=˩jPmTSQ)˓GX ub)cth,C(SFV})A܆+EQˌ&Rq4Y\d!i!X?Ǔ32/3flk(YW{ TWtbYL6uv)"w{F Ơ̛ݨH\{2.%tY=kȄsf^kT+z}7dp UÅ6O1 ̟o Ry.N]MT InJkLf2f#Ρp~';>mEhiB߁7zm]ng ~i.9LO@g3dpUbV{v =_vqyu!64~m04!I }VUYϘ , n(2xyݼQ'ͻ\)uOAy%S ŹF ($ն>?bkr4dn뮩xKv0$f+õyJ YB-$sf,a ^͂|_n3DXeIv$Yth9B%RwE?voי;n\Ԝp~seal$FP.V@mΉi; 3sJ6` =TO5Vz*z* gȌ"p1Êi)|(c,.z72HP 4 ̼h; ̃ddb y9N"US:rYc-O⒛da#]YJ8|]f)rJz}pX52W;539[ BB%Twj'rGQ)8;A˹j"Gj/Ig#rDZ^ilOY:}4+ET ^@@NPzR`нeeB5G.xG=.Y4懓Bۖ%ipV&^05<ȟjx Wt>j?k tc?9R%T{M_OF߁-'@tobYPDj.V|XrUT jӮaN({} ݷ_1c0,YIr$˛ hvP Ψ1cPFW<"5sGz 佅⒐xTIn7˱^K]$;"*U$Pka$~zVm x=Ѻ RH Ѭd:KzS?1s3UZzVP.V@#r+!3ףm ߪ.1OvJ<*peq~'TZZ'ʅHV/V\ɸS~C.R%Hg5%*y O+3oܚ)f]ns^`/N*5i`'Dasc&p{6V)=!Q׻R-J'JkBH ~ 4EA"$3~hHLx)~*g{wLf}f  P*M0Zca >>ƍ{ld%.#ꚴ, `1fruo4?ʱBh]MLlȑ* h1Yv%9*j8 8xC兽3tؽŶxY+ET ^@@k{2U!Zá Z4J eMk2ߜـ{fnF~h[65-}O| ɻB4H@,I.T\BYK>G㪇%ʤGumĂ[XEIwox\=d՜ `+PAΩS+ET ^@@/lFYۦҨ 2=ib^kߪ/czj⦌@/l_GScϟ.y7$y_WQV5|d XMiXji p 7ʼ,:; L>%(ggW^A+E S=Gsgl3BԘK–}, #D>{.61ޟm?)m)@%5c] U"P$Q<*-0x?j/ۏы @ Ͼ ʔt ƌcJ, Ygubd}5',R6wџ3O΍az~ As*/~8?0c7j֎YIeN:GuVƼ^:(#Id P@@~'-b㽔X|v7IÌz x8d"9ދb,uIQ\,_P@OΤ@ۿ$AzKp3z>ک/~L 2Z~{Ω.^Qyua2={r-񚲆oHW9f, 噰#4t|.ͽcȑ U^@Eu}c8$-ќ0Hj/I7D%Y<5޳;p2={X&JЭ)T|([lY7!fJ#YB-$ЛО:b87N( w gl"Ձ2P0>޼W=8Y~>Xs^vo̓/%u-vh V^Xt,4-'d\/5U{U%P й!Fލ`@ Ń1zvGߦd>`-@|480B@-[d(n&-DຖgA ezO#X[T\_dY(~k ?rUg&_@hެ0Dr 7mk_@d^o5Pظ3_bpW/^-PD /sUׯA Rntzi4HÑIa)rA 9bRjzX=mqd_ݚX4TM'ƒivPKvڱddOAyP-+6@W`FFĴA)rűػ=[@~#W͓҆-H#Uޫ.F< }< FϷzzݱZ(eٳ`W:x] WZbB窙Ե໡@%Au5m.˺4UCs޻ ջr-b!s+"ԗH(q$9%@EjvG?.N?IVq_UO^x]\ej"GD.Hfyb>zRVOyJ<lRά9R%T{M=|W_kW%Dj{ۇsu]:bm>+SY9539R%T{Mi_Ly{o'S7γu\Fg ans?k%~tosr?x$9%BM=-ie= ̢_RڡS;tN, 4B>Б=(j6>!s'4j0>Iԏ@M4t,K;I{cI7jvv/u;}R}iV*AY\k9EST7xhFojvI L3Yā `_S@K\0!vj&{™Y|4Fj&ij6'C{LYJwj7^  q޽p⼹uZ"Sڪ6RH Ѭdh&S~WL8QBp_ZMr_2f_Ώe}!Oq!ޏī]q9R%T{M=kBYY)Yo3 ݦ)#.rXlr i-$Ox%4+,H.Jx‒pzӀM(N~"whO??E~>c`HWh֞1Er1H ?`+Id P@@Duˠƙ24[8t:d/t \t RƐi%ɑ, hŬg#EA b[Du;7" #v`Hl1Bg7.g+qVSF<:#2kM)# ,u^v.uTk[eKH#YB-$г{\m0h.(ּdKa6GԱjۯSS:x|/H  \)h p5~[fēqtgu1M E?OkQgiWs0\F9 mZ8P_p8.K!?1#q2(^ۥ"Gj/Ig\ytW eȉ-G{RHP4 s ||

z ߫B~v9:$@;s{'hVg [95 Cwbڍ^BH"y|iQʢj*#;~JX(֏#T%]U$||Vj&޼J7.ڍrj7.0$O5{}6261fJ,&Cq';҂bnrn$EI]Lzzgkȑ^@@NM3Y*$zo4+"{3I4);)׵Z,B;AP(Vwjf2sC4c.#LAI'*\DnzȔYQޏ\ e _'oX?k\ !@ .уom>g7'9_F |8]L|gQesH#UB$Л1Nq8A\s6I.u~C 3Se?4mN̂$ Ym4EAY{2=:Vf5J(]W#:l^zgGz^' ;mnO'NQ.@O:iPpRѣV2ic.U ¸0B a70-}\[F׿0Wm}?C܈92_|!>bQѲF.F cڭj\#$/|G^F5̖艔?f1'|sҜY:+>/\6*#'GZ̭s7[c7S[eNã!p bz3F\q(v| E0Xf@Y1ސ;oEa8!rJjb|:vq$8/HF~ B{N .G1׭c\D{75e|o0wۢW-@Oo*Ɲ/GkZ~w桕--7m8MP=;Çȝdt'e}2V}0Hb3+XE&ЂK=;XZ]FfEzMRHj/Ig{}jИO>f]Agȑ* hwzOu>NdXs)5C Cc!)U#?aLx+8]@R%T{MrLƸMk* ͮ28'TIBIrDHK9RMX[#Idzsh*+D5@IH}psf%}t|%A"t{\?%rٍJf< y< =HX2^àh(#aqrR,SW2~)h U4edz{6Zs[i~PFV:[}ydit%9i8ܸ8S#Id P@@o^vquŤc{Tll H?(H8'd.<[|O?Z@=@ EwHuar>҂r?͝án;B7sRvz>'~_tx󞐋/ 5EZOւ~:rОCGA$Jj\չ>5}ez. HA!%m ]zj*@7xqz]HSFR*{CcLgPۑףı̏z6- Yc; bU7Fsi~Y^9 -nk;&v:LÕ47@o!N8. TYFSDՅ$=i0{R-Δm=@{O㞰_HSPFYweShVz2o m.}NkF_RƜ%R ꅱ z~@^>+2Pezu?6~u;k{Zp_Fow{wU2}j~HqF^aoĺE#[jt4HeBWm}BZMvs GW>%p:|ئt"9Tc|Z~qC$1I0y\ћE`-qb#d P@@o>$;Փg]bҿwnWIC8"HFjb x{Q1=^*8%WU+H(`*x^I\z\CWLcZޫT " d-?D!Ub%fV(N?7RxI|Ϲr(U{,⶞8Xބg$Sͭ5J#UB$гsf`P_C7 AA5;J#UB$3q) sڐ$#j ^@7=YuI`l{>T@iml2EVI)7L#çh<k?nsb{t(2C0"nEFj&A31!=i젧@ t^sh ۮp_xo>7N{jE /0<`^dm)xn;~᭟ӿ};gߌYAlawz7Nf`y,ZpNX8-"ݱ5_SRqi]fs MUI1uƫPBC7bV!'a•!Sm."5GSAޓJ <'_DUf=?YE{VngӢm*EZ:RF48} ,͎Cng {.ah|Fj&^d<5nf:"V~5J#UB$9W<8g֭46k* (1_l[O^!~Z)"U+ڦ@>u t\FV^,16EA+"q҉;ABZwJ4=`K>lkBuTFWOL|Ϥ:£-9> N60is|< [Ek䦌@uU~ֈ5U=edw||.ahh7ˌL;lY yٵ5x]쨒͓[d%ɑP@@w!K]_ tPF=϶IrOY6MY@$[yk͕>ݜ< [FV\Wp-?SF?pXPL%V_͛`0Eefv9+,w| 5.z|)#)ʧfEthߤFpq};>z"6+o <̂R|jTezlֆQ'm穌@Õ `/%2zHyґ9Sd(#3t ex 9 hA4̾4%kӣ:!W\eZ U TwU"ٺf_c}C4ȇE!$7yiKIr$Kz%X[,9V_>{~jRHj/IRnk, LbT'[ߛebjeeB5GeX`'~c=˟p :8AIR? e*Fʃ<ytޫr`@g[ٟeN2評Ϛ4w MYc. nWT!%VG[~Vdu.#fg[d}ɁXsR֔Χ`״1ڢgIr$Kz00b;CVB(TBjpxTz=u}:=@C3z;w1bl+}Vvwks2A|-s_l!n,.j9 E7[IEZ(уbޏng@ f2j{$뼶d+Nuel6KTlmrc3}S$9%@EjDq%~Y8>sϵ+TDVIgKٕˎʭc=igIA<TQ4GePo|"Z-]QAeg.e4+bq6imcei,w)#ЫJױ>PF֛k]=E%n}$ܸlY59ޑe¡Z\Xx%_>ΚXxusDڲ3m팙z5Q͖XWOޕP*uVV!ՇHfIr$Kz]'߰ĵ*5K~33n5F:\_o?dQ#wNe~&0CQ؇oo 3RXovg# ,+wQ.!WC\Fp߽PDV0oQݹqn,#ffu;R^F1vHe Y6 g$GZ(IWVUq!W%BڲC+DPzd~_{:M'E鸷QT ^@@[V3f4mipY@O;ў/)y!sB!O9h%ɑ, h虅}` 0F 8mPA )Y=z_>*,brz*b13_ \>0if.8RN|wҼ_-HQ*σĶH e_ֱ!D\#VavF$vڳm@i_jP;,{"-DkHY?4))ܳ2qwR1KUTn8#$h {w@,]z"[k:e!'oK}i0"׽HYˑ4i}]]zoY*_˕`I䩌@OmD%Y'V[+ýU edLy.Mȯ/Ua9ם_}V.V Ė赖QO#_[3JFɭO5꬚}KJ3pL^zEMY*i>1#>I>vyO8|(AgJG̼\L d,rÍڼq*S.&}' 1z_l"TE2~:z+y"aMK>OAqGoL6Ir$Kzs|yqfnv mMV&h\.`XNL(x I4BH BcKHԘ1͡@OvD.rMb]/8h2j)[7Q(<+<UN:Q73S'4\ kHCdA,aY|· 彛Sx>/GhUh>߮;eo˶PI>t0H` ڶ7![{oo: 6YbXH؊Tfȑ* hٲֱ1W䡌@w-/d_DHNcvs* dShJ=QN.s_W%L9蝁hΈnun:SV`γsPtd2߲n2'9 F^J#YB-$3|]1圾_3MY{g-6o.҂kjq 2_Vs]9w[_o}H]$g`˖\=T9e ~j<]gJP4 f:{wA)fIr$Kdx.zs`Z$ăAhO@(P 3dZ,P\~<\3Pwn8 d6)?N` .9!? ܔy9Ѵswo^΂ߢbI< ~Jt/Dk .Zݞ_:.xLW^-t*"Ү+\&y!)QyX83;@<7HOr[ekrܣ>wdߵ)F Idm[!98}. B%Pu=ZUh$Wv}zj?r"G(TwEy;E^鏾B8Uӱ$իA"㸶惱edժJ,RsH<3aŦ"^ӴdqSgLeZFXH4ׁEXHBx㟚GUG}諷LPDF'yENolH<2? ^'[VGg{-") L[YhQ ZPfj;JFQt|NPI\/ h޺l~NذD2w@'FE#1ƗmpHN Ӑhi YB-$7|J;xW6 bQ-Ie_/]2W+ET ^@@o~C-lѳ|tC "ZCH0*ge@oۋNZ#OOY{&eM՛J&slʍ܂u7^{^9N`ȑ* (U{o}}wuڸّ`p&r=g,Z1ECv:[)rJzQ&[8P[sjjwZF/2!}n/2J!8dIB%RwE5{L`**j(eYwq٠fc~_7Z aFI!]w#,`Av\6gi<R%^lJbqi]ry#^d=kaӵ;>t:+8h_yf)rJd^|!@Ga٦=9#)&R9xatG}mql%KlK0WEgps2ycF:YMr^IN+c[Á3R>@v5bgD oݻr+Z)rb^~J̷g Ya*wFȚe(UB$33g MةG||uCo6w,ET ^@@J اJiRZRjg6V&U; ]@@B݅3PMX&q#po bȑ* hZvSՄD*OS9ͩW#"tp8i8te=!ڮ FKXfM[`%ɑ ڠ7DéHʣnS#L0!yNOkH!HY|Nj ^<6<ץ׭d&#zfet"G*V{M=Nx p| lfr[sEqqϬo)vuFuGwy{w@]o^!*v؅zs^ |AIn`|)']Cp/^I{$y[2-zΞ3)̥8=]VCVw >ìsqL|\ \ÖiJ)lH_&$@7&F5׿;fq,@CՋ %#L&d&L=ϵf܂R& =ũ=ɱ:ZpNF[R[PZI>> E~TYkN#%KuI'Y? ֶKM+Nt)r NN% O7o2wC=w»P1gϸ8/c9w5x\7*nVj&5G +um? *BEOqJ#qc4}n-¦hI;)#O: Q QwC˾ZDz,WCkenS7^2qTG7#IddkEQh3Sr7smƹ^xz~Hwv+S0>Q=;7>vg9V̨zKPHǪ|m/g\sC:ܼqg:iT7phT9~>|R-#VMV@š;W\e`x#1?BAj/I.#B2}_ }.]]p6q]&H}1j/192={;ݟ,(&M ئPET5 nU+S[ni`un$GZ(Ign||PWCq՞Ք(/0&GepLÈ5 #X#e `# 6zÁ@\Yb}Q%E{x~k \7}[fܦxUŽ̚_*.9S!J PC0@(a`q׶'׾J*d#C(i!GlJH#UB$Лm(!@xnpRcdߏ[g-u%:&euR5H&CVդHPV5+T.R}6cJ-qm=1!$F14x2!~O;9etEԧ*;;{ݲHHɪE֗⩝tf[''YK a/8#ܳGL۔=)`=?-ЭΒ`GZ(.b[%%]w;cQ_L'%MBH ԾT׬ wK)_秋x >+ETT^@K4ߓR̽ 9ȐkO oKȑ* h虫%T&E{f 5C)#3sò 4nNB& $pܲ2Fj&|/D>O0zu-Y2B1L|,5i–v>ͺ̛22Zfn/4(OnO72^Wcj]XuMezUHaL;}V>׋ s,UǗ4ArCP$P)Wnrh/煮@U3y}u.2>g^y 6]3CLd'1UW{EZ_.AR E1EWep9vHhqs νil^2.U(rLp~Ȫr]:_,0^|PFJ>s=G[Fź}9Qܧ0:CoǪfC58a@QظvY6*g?ty!N|ȴqW,~Ś۷N^GM' 'w ~ǬQvת |L%7<5 ?Y NM3z`UEVQSПr(9UPFWoKĬ-@Hjy2. g`WG??jGSFddPK:xd$ɑ, hi]@`*RJ葟Z)rb$гk; W;R/@*\H ȑ* hpLycne_`3?_@k轟ɂh"y!@ +J$Ki' ^TPm^ْ·tv$iȑ* h5d\4 ?aߵF<"^"x^"'8OCiUV˲uM7 {'rr%R{zZN7n rcxus Ee^G \9yhK+gC9h6ʧ෯(ι߷ʊs%Z4joC b{Κʧ Im^Rrd'wug J~J&ϏT$9%BM(yI} :ڧ,6SfBX=-6xl >Du &r V\ƄwzB;-`g#F527iX%w;>yG1JIVX 4 R:gG֥$6ၫN.wЪjein rTؚKumݬ.Jb ߯T d2tyZh|39jaßGg55KTj8 E9|zX!rJzdul*L Ge|aZ9R%T{MHSDV0 ,tT2e(mx-?}Jt Ut보?tP/E|ZxϳIJPF'k 9TnG(+LPhX1x\vYW3PG btBJ&(,04Wkp05Pړsnj&}=$?R=B ϲez: -K*#qvzD_ާDEܐ ѫ6Cy vv96 jYZ3CqK#Ͽktx*)#߹m-ͅ<=|u3c`UҜm]vڡdt [/SjbJ5i2?+=%pZ 3MUUmj5c@ksR c˾DTRRGjO;SFEAVxK7)#-r5Qﮝq.#.nكAx+B}u:mEZ&Lo<‡1wezvu' 0 Ha3gQ&Buqi]˒C9ہ'cLH΂]!z}` 3qkT/v˛>){j#Gҏ*~.Y|zj 6zhR?k/x8uDm"@=}^vn0 i0gAT$~{,: xP۝?n }&YdZ`%hOM52wMNa0>2!3\x@vp)6bm ]#ZO?cj޵ezdܴ 5Ŗ0Wkp ez+-Z0o݃6Z#3u*V!YN([s^34y@i6MVڬ# Ct'(|$GZ(I~PO\eJpI6:0|n7o$G/GV "*;6,5 *m/ڋc,4"ũ Jк4PJ{}I/ȑ^@@/d$.en9kV zm#ETT^@6)s+g, j$qvDEFIvBVP.V@5ńGp< EOE4PwqHK=ܽ!K%HݽpWB31AD9Id֋S붤uH#Y~^@&6 X;eO"n MЂ{v&àʑwg&Twe#I.jhm]^g/o8[#cER8aVaԊ$%B$XI@s&`4xÖwG2sVZcŷa;d zkKK* (G^o0R027}-@~{&{6!^I5JT4jq0<>_)[0J/ M~1h uv1ˬ Ϳ=֧[H{ l#8w2iֶvr[G:0G*)=#|2_ ,(2=eJ1q CPh!n1®+ omx ezcߓ9KuC8F0EZtVo63͐Y"uݝhf>w6}A~<Ѽ\AcFc>:cD]4])Lس^0R_R ~WG\k Jp_<U] =Gp*I{lBE$pn`4Ýf8fE7/ ww}6AM.~sVzw@n+P榧n@OY0vVvhV`T:Ŕ $ ,8 Fm1{ 6!Yr <`'djxN׼歷\&Dg ƒ50SF.tP IwAKn/dŻ B 1b2rz h}2.ufگ&uUӕ2=vܖ+ e#3v]#-eCU4lg V~ E#2 A#ݑ?@[jE-GsQWGuNaI% Cw_F-2l++ɷMs1֊1<2aȑ* hаo/Y-ȔU)+UG0^6ze"Y!i.KO@s(TS~[BR0HK4dg*z3_t19 $9%BM=cfΣ]'[DWg1%y>MY:hdίg*T2@(a.#a\, f\`3MYw9[WMS~~U$W+!!J(O8<;FO'*@8q-neoG1.$7klmj%zg.7d&cc(HA&wC@KMa_%i^F`Ӻ.a?yDIoĵyMۦp`>ąEOHd, bwxo1Ay]7#Y-Hϗ`f[Kl!aSlo5~@Pɪ/32z7Edۘص uIj5kR20 p,I.Kq"=ȯSoezU29+V6P@@o6SmlZ%Tرt:Բ~wge3tҚ;͍-#Г'GnOdݏ3_c!SDe۳D`,x4S i."< HP 4ɅÆ ^Ir)ij]am$ɑP@@t)2 9mkk-#քfS Yl #tIo}t o*DKW0ey;]W.,0lLVBWTfI1ezidlPB|z[9`Ti8$9%BM=k$Wy-Al׻sƸǀ^l؇sn>z5[*mzJ8fIe`r^+Ζ[ (dHa6 AHP4W1p,tbRyߔR#!rĴ 0r ed"p)P|Kbb2`7nȿ~ֱ@K&AYh9Ukjz*}h;~2=1U4z4m$@K= T&sz|%x < cP)>C,$GD(HV|ް qAfuno x8J@ЬAhO*gClyp?I`-<1\' L\Vؚ[w?Ap̒Fgϒ?^\Q4 Ɵ@v/1I1zzz)p͝|&A5a2lpbF4fљ# ӖU8s[$Җ$3xoĜܣt=8,|NJ#ڼNsp1:]l="yߠ~Dr lR KH Z ~9\9WOVmޏ!ѥ9BKҥa2=]aYׅEd1!j+̔ՙzIJ3o @zo]PJEkb<Ŷ@E]8ʬa uJpzt$9. P@Ӈ > CL0۳e{^ԧJ9ϡ⩌^fLw)ɟ@QU;s"68F cX Xp'x:`Wٕ{ww!jOIFB:Su9sRh'J;)#? 8rÁ0z}xg\u=\;p3֌`fsq7N땣=;)~).~)́mwIA7ΨHfxRe*_uGPFuĮ_3(EZ]F)JddaǽWG}l@2v om_̦@gV' c0^9BPFyWٲ\:My;SK>w&2wgz7%:_T]{΍sl +ux'v JP 4}́76q#3Ϋo&!rɑy&x_٫ũUW>{?VpȒ=JH%BM p/hg ~:~NHҬ24\*vA<'Nij$9%@Ej%Չ9:.y4Zf&g~^C_DzZXYa%ɑ, hI]u,R粩IqM-5m3RHj/IgW"H@nћJhMl!e$LM̪?f@mt@2BM?nHjMC#Tύcezf~۱An# a0d9:\%BM=_޲\^Ѥ Cbn\b0cgyݐ_ngzLdkLEȽ&Nmey*W_VLr{AQ thc-PuE-ߔE] (^TʵU5[)#{;?r@zO]? jv6iHɴ[ܧ̿xHYQDt}k(#;_:֩W;h<`gT7yC^_.U>r #Uhh9 sgصu$q- q֫HU_YaR[[jF@O-Yжum @!Hz&#%&mq_LY!zJQ{gFd$_"|VwK=wKij$E5m[ZMcY%:u8::̒_B-ox'"[ u%d+D~+/^&zb Iֿ櫬6suؕK)> D(TBuH6L>X z1p)>J/%|"$ 4_\rؔU{&hZjӦ@uKk}I YC{=k@2sߋmPUh*STy)zOMed$ďPVr9F\%H`(kWtEHMw&1P$7HvnRﶊEEZvR(L\82jԤ3. )S9!w!pw nb%APlI#$)~5+g^gpV+M%VWGtkw邲BB%TwjRbQ6γ"u Ho>G7uHXM'tV{V׭uC;HP*7Qo.#fc 7˳SyrzGjJb<)QQ;Cٷ H9 ӊ:.m2܁\jr]j2#Ir$Kzv 쾜{f}e."dfDP4/K@}ZNhsdZV;_tlڗ}z¾!cwmi)TTϻױ5BmϏQ' n i#qD-DV$GZ(IgJ7|ˮdO}# la/R D4BycOSغdG<W|قPd|?MȧTx3Ѥe]漖]QN3fArKjA`vB W|Y:e-hq~m >Uf;gT6 LO9w^c#$lwQD!!ԦyI90ɳ #=Î{3w!zFY ˡWo8f$2GOXG+ET ^@@W?$rAnll3=UyT"Gj/I4e, /s[FVM$|[hKh|+7NjBr5ςH ԰oKڶatI Zwv1[:  `$BmKd$ɑts~~3 ř nz HIJ)"u{F-0 9[{^sBSU  P*[uT$q> <)sĹYo'B$IЋH(NR!3i֌;VwwXV - #q] Id P@@/0G\yL VgZ0#}l{\YkǺc/.f=$,U$P\_v 1yދ2G~th2\2י FEQCE@ ezYww]w7N9ae%fϾ`X ]f5%`(/˸# [ )W }$aʴ1!w%[Ph\eJB_eku{!F򞣑AޑÊ}i<6h_ysy[ćC1)qhY{36a&G@s]ʕ}GΧ3ILL)#H(XBH>: - jGq(WLF [@@ɚg% Z,s{-s\K#ۖe ؟kh^ MFJkιPz]j#U:Vmy\V!{ldz}Lpt頽iTCY%}gAlJTi8Pɑan>9$_,Hhh-;v,GiQg Ǒ8Yc{s9WfM[FׇcqTsw`"ZXlsw3c=e2 O}09 H|ܢBGl~Y}0iXA*TyEjZq1Ĥ0+[fJZMl.#7: [ěY";7Wn1[![hݡE^N;cHj߮MxybQ4E9G0ez]2"V0ɖKh;cHAiz] \ ^ZVjL a2=3!3cEb&ۏIZp7)9Nqַ5u/gN:Iu\D ɞOV PTwˡ(@q~C$,U$P 6]FO9o*age97vXBC}!,!6l2=}Uپv1Mez4u+sd;\FP6=$f^/]y0'<@jMSsN̔X wĶ_S7] .S0ot?3Lpa6܍ ` _"|s1;Cޖ۾<@eãx0X+!ј2Uz_hQ .]o?=#'PF,Դ8YQּr'slx>̧@?] P*MsIkpP>ppe(BvyKkϿS1K6ûNյM[,Ch;-#CvծĹxdxazLPOiw[#]TI<^H%cYe{ö:y=U!#|*O!0"97SY5e;C)4$on@19gXzgXGE'[?y6SckWMez IPS|&4Pv%boGUp!\Xv̀]q"wxb]0@1|^r2y] (CނlZDWhc]l',>B;k& E}䍠E7^ASFWE!䲣s5tSF))^ʛ s~ۘ2PgBdA-0U{۫ƴB}(#c)@9Kb9y\N2u]ҿ Dꊱezz>4/9$a:Ѭ;92k ͢vhlz]3le}%qMK-z.с9OᦓmI.SL\=7Xq/bb9VV25+hXК:VE ^VG %&;g 2 ]@ч3٠RtJQ1ҹjY8}ˎk<v[yj>:d)#\D%?4|T-G~è_φ>nVcVEp2I3o# BM؜@\QUҘvPN+Id4P@ ȯwY [>ծ= ` #*iYY),G0 j/w70|ź7uswbqOK̊?x#buI׭J&Q(q 3EZ73!e>Ĺв#pv#y}9ߵ{F7~o9tPofnA{1@3.n 3MCfgި)LOW ΘFٛ6Uz7qݝ9p04HHɪ9wznKC0TLq锻wh4~D=ԩg\$siYBp*U-Ԕ}te[$'oγpZ˾Un^\'52b1HP 4 #xfg Z( ԢI;H-R}ݖi{.2H(ZˤEO'Ƥy{y΀tt2 *B"G*V{MȌ8K,Cȶ}>Q418QQy)tQks274 >@N9N_Ŕ9sA+Apb,జ_nuU*vLDI갢K q*,ET ^@@ϜیA:뵞Kl>dv]`<{<ƶ)QBb+/V͍k8۽~rΕbqnqn"*U$P24pt[ l'jѠBO L/ը HP 4 OT׻&u:ҤdڋGnMP $ngR萀R>Py0*_qt&_pp0FəH>HQO{ih:8DF/]OEdX5FVVvEYv]QCĦ$,U$P M^`k_>f ^$ΠcV_[nM P{0zԲ4s^+&vI44͐a* (U)Mٹ&? AX4 Lwara`{ y{F\Wӿ4VCן@m˨sl J.Mc#,ow 8@1S⓭$9%BMTaM0cx5[^vߋ=1Fck]d0eL 2?bYl~>*]7k!S{Nn[~/2Ψu!6+:W*CZE/iɢ7+ETzеgl.a@ƔcoC F}n'l`&뿞y YlYהn-z )6f.-IuoV5U3Ȗr d$T:| :cM$9%BM={,_i5f%~Aߚy [_ ǯvJb eXaB-ۨk?'Y2d6Y&2&ZOI NHn2 -jlĉR%T{Mxd%=}Ul|M_ٍw8^!rJj#$YotۻAC>x+.Ă]Ü9R%T{M=k eWnײH}z[)rJdCr'#ns^=3ӚP`k_6` sԿq6Q͕J}w ezf<)U [ݿ+ Yk%ɑ, h}5+}%s;s,ao@HYkL9+^чd\d+ETT^@YE3/;OBI؂M!z3<Zs~[r\F5yYW4)-!ׁwoԯ[FR1dqD)c#Nt\'6^Rb[{>^zN-#k-^[K]Bλez?vQ*<4#DFz,űEy(ےw02~^uTo=i)#BcQɠ7=yv?`M}V9G{>C$*6s*@5Ir$KzyPo]Bx{{ ܖqk%K@} Y 6̔Aכ[~N+%C)p:;2*󦈗@Օ*;.$4jfb޻$>11}(M~`W<,{Ůn@-y? p~=k6 G25KKix<=F/ڿ.] +qX2`F&ky)ܤLv]+C^ {u::gȪTgu֧>wKw<-O[ ޙrZ^$,U$P쓛Uh%i-c.#Ы-CV2:}}ϿO.lcؠ?&s HZ(Ig\-X(Cl"wAgFְtYB!pWi')rJzPܯE4,;EX ̇q;"\>7{ͮ  ~~metL=-Vގrwwqs]SAS6q$|?w@Nr uiRn, hS\8- 0C6O,PyQ]G^(@M6[K"Bd.TdU[Fխt>iju|ئ*[v@m]kvqKR`JHHɪa?SHdt6oc?> %B$P{4#zݟwcm_L!c!蕇nkV-|ptz~6>;)#_QJ[D5ߢL~ k{-ĹuU\3{Q9R%RyEjfC"d2= p/"2^a'b9wxj8 f&7,GYduH9Pƶ~*z)n^鯪4Y+2m91bwh;Ky 3Sb;LK9 m<Š'-Xz r~e! 28f8A YB-.ơ|ܿ5Imf=]h#b .y ezi쒛5SBvA1:1l ` _"#Q&[d,2=~KTCV7$c--M5L(AjOCPFV Y^XV# hds;|XC\>'/-֏b~PF.nKh~^2lwKܺ}2H|b2`$ɑ, hoysvhr楦N A\>Qߕx0iG%:eݴDco8_oZ1@ M8Ep|'N5WD$On,PJfԌAs\g_) 񦌞ΫS~լ畡"c-1J 6ezz.$֙ +& V/#>vј%ɑ, (U|dKp dT 5'g=Tqy-ned7Enɫf&G6&,reD~ (Lj=K#YB-$Л[ū}}Ψ>o@|:ge~mV[2׏(lV[ Ӟ:hO]&&Sꆰ]67Bqe"\'pNukez֐{$DK֯ϋWV918-\=$9%BMƙmb`}Q{іZLIp_H虮-o&1`6)-S,ۙdʭ P*ͷ0sm8J|2.5gh;Yձ I~tM#V^*s<+vOB.MHIa֬zdE?tgc¬{,W=MLV!vO=Zү|HrXEiKov^6'&}zRPDjR[/Ȭۉ"J}N漵9;Q7yez[d;L~3vn=,|R7޳b>#鳃WH#YB-$32da_zeko1]>A@2vy*"]1e4+}9;p{8֏Z2C8"uJ{;,osiU{դN;-j+҂;?Y4>QsO{M Eo }ilmcd|J}ӹ? ET ^@@lcD.`S=WЍBA=b.#Ы}φxVӡ<TK@OKpso4NT[{J}o~/kc׷ؘ ,Ѐgssg߈{~AFrׁUnsY[h^xSW<;m𢀗h0^槓}!LJ3 R}Pl2j"~4fd?գx  ~GnS [Er1~.Er}AEZGw ȹ$3f.#&W̞s2bsC ut"ߝ/=7I&^۫a@*NkK2 W-S+O5vα71+OO# ͌|S,~DjQǺL7 Ez0K %PnuA^@318pߜ, C=kC& | 4|טq[F֢Cuw[FVZ؃gO+G F=e7~Z`Ws{B.f/ׁڣ(#rauQro]?at)c7}B ڲR(@UwOf$ɑ, h詹<…AZ $P WYs]ۏD\jw#׏<%$/ڣIemʙ%ͻ&',=9aTҥu:0u0I#YB-$ЛM}살La̞3Kbj[u~z4dL~7fjCB ~pt5OIvr1CڅRư݋L}A+] qbc#p33GЇ#-xV<-%7w+oqV/-#ہbUFhTeADc57Uh9h $q/Rݷq?ihPT%BMypL.h3<4 qO{y;_SL~Fw`7ǏxϡX\/[$ ݇6]MŞO@}]*VM5Yo_J-粥Ky&W<6z ` _"ڼ2B\!ȂP~@e#G|#>Wɨ F0Z}JO+jVۇॡ@^/ݤo /sZY킦$x4[$GD(HV}sb6? `>pJ"@eI㴧mI-ai<ezfThr'g{ǗǍA-M{gط̝ѢL=oׂ?{ ~:O fh.Ow=ڦ8=$ەUϖU{z48W0kg\Gd6*g<뾍\H륓!Fi zZ'Ƴ~ۉEB /{{W2OF:N:%U轮\zkK2jZzl_qUwEkZTDLⅹ`ȌCP2{Mgdz"MTfIP*@Wyy[˿:8vAڎ/d$wTm(XE?ggW 湭\t:aȪ'}0܌eُ9y;] j5+I9-ٕ^jj+9LGSFTMD.뱯U}hO!wEg xߝumfΧ=HfuF67#ETT^@ZpuYh:˄b! vmé/MP5owt*ԥ0 43dMcoGQy/71,%NOK׽h̀oOGB ɢS| crP,~^5~r"6AGŴ LD>!F/0}d6> wQ9{Ȣ 7Jb]@%.o%ph.gx(FoЂ"C=9cI.{,S]1j;"-YM1!h >*Wߊ72#X#5 Db˗ն\s9-Hj2!w$Kz]9$D4ո,ƅB.Hfkz=>'0 {R`&"߲~["V3n믬A? .jU59YI̾lZh,-w ѬѰ\NNwuF p奢9)*,ET ^@@oJ` oǩLa0$PHה_=ߎlɾ sZ,jdg1 hg$9^p 4P@ x^ 9-Q0xGS 4{ɽFgFQbÞӮH.Qؙ""l2#.e^ۅNTGhp\J#YB-$o9RZWs#f& `BʗNo>9R%RyEjzpzg!*]Ui8"'q'2RHj/I\V39g{s[T;A}w]1{]1W_15”dr9a`(cY.sfRMzccV[:&͈M z)iNmblNNgZd*2Ir$Kz}2(Kݽ.>xK`V}v1E2H#&Q2p/1āDX!?B&P!㼯GxԐyuɸՉ-"dqߔ>lZDeM W9 #X#5e߯f Byf!)lqAܝ4[zl|×2$GZ(IgM$!f!ڕc)75 ͚_LU$e[ S_:d"f0ɐ#S5# Ϊԏx]Wv$ƳRX)rJQh I&滤#(crc;\NHo (>k ETT^@G/8h.=SDU,ҘCcb39F<^}ב )⾳ѻ]۲oIgny2=CxjX`wE~${uB9/gz2?K?j.1qB VF|Զ@ Cs%8L)<yW ٖ$LW#:9R%T{M.5 haq!Lke],-i Q 6_]awXwU²"ްGa<|(@^,΍|I_ϳ$n{k@ʻt%Yv]WDيقe!m(]TG$EC8ii]cq©"A?O=&hޟo$2Iŧ䤾 Q-#U'?=!Lnjl#gWY`0ظΖ?’O/ȱJNkṳ̀V8O)(vе;B8[Yf۵eCm[ Q~ gwٗCUWl+~?B^r#b:2J$@#8a8\f/<8g e@7V[w}sKOȞ>s%we?nj^bYvց=Y{/k0,khpY$64_knz5{;#qJM{U>S f\1 뾦3:@f>( ɨHR)zŏ25hCg@7Ys{Ob# Yد|աQە~mWl.G;>Ҩz xyܴC _Xngekb[l;|H힜ŽOU&L,DLÑP2qOъ=7 K a*$5-G60J۫2ÎE=+|N-_磤9ߋʛ ySMITڐMDt$WE2VZ\}soJ/qS(Ibjek|ΑLM o϶4ʘVnٯ=֒Z{M3(Ӿ_񻼋lJgGM0 x --y9|4v8&qZSYXsG'b =[-ěښ,ZgV׬Akžba%,Uwfּ9@nԜڛ{n3R3ߒ v_3.\/9r'0`o[ 9:g[{я\e <6dKX`,6e%kSjJ\WUHҿ϶n~>xqTdU;V{oCM+uTa9+ksie!sħt#'o 20)#IGFn$}9OV&_&Ctl|m Cg#2tG8 &+G }Е\OXKZ#rr @4Aӹ:K*!uwq)\DwjW~m5f+rbg@̴uUn@W$U㦬9V9T{$N@TnOL|zxGڽ{nHZT1ne[ZsM8P `:8I8 35bhs13Isf_i:t[z -#+ׇ1~$a Na'=~ )3//JW&ycvm_@M,[I[SF+8#e؜oNcpvp v3`rp̚29Ͱ){DR /_-tx{9氉>*hc“ޡ_tR-uVu 0i32\8Gxa$@Z5{xO 'soB#HV2wT|.[ xXu6'D`PX,rLz}=֧plgAfuV3kQOW^9̬f;;hoA!bWdw2H|Cn;ѱg*#2T>7fe[T1R[>m:5m,#odkln.zv x[dHf{9(; m\0ެ%S-]vSù?,K9V9T{$-zlZrS}d5nibug $ʢۖzF%lUcȱ՞髮rr pװ}Y%f kzkEU He: .[tSҕe8p$eףKtPV}WN%5YA'd7l};7W\ʎzݶޚ2L?z,\%@VO<-+v#-=lp@S?ٟDٖ.; J qn2$ 3 `sp{.wen_/SFk;9Zwcρn]l߶_"sw) :e< ,e$@hޡ+W"-Smk;ֈƺ˧|ӫ7zq V?ڳvOgu}0(8.N hz*`ȱʡ3 pcKk'H;RmqajW{T?PHȢu4&/8J5l#d-+VW!,cfxX2 p>sfnƟt#L/[x~#-|NA_\v+G`^N.0z =rj޲IΥouT4<[N~d.OE>_I9?Q1}uV&Ϋ< :zEHOX2 K9rs#Fj az%#=SFS+x=:n~ C 8o+%cG $WjjK3ÀcӍWϻץ!:2қ<.-Ky6@S75VXP8gMq>{`M.h5UEgPޮe+?q5͖ A2f`l%bUm?e^[c:6My䂦Bi`ß6ܶ˄1]^ՕFLC`ޞ"9=Wl\,i,߉?r!ر΂ڤ:YcCOȀ$MK.79BeY/ r'mK.mv{oq$p+G܅K9Fd `d@r}<{B$[O)# 3SlH>XgQGY~\f gLYe$W*PczV3 ps'"Gc3Qq#/*CwImYx_|_zXx˗0tА w6_b=ٖC*wVa4?f:}(#Nx Mǔ/ŃOdͶT?o}?8?X"ASY+k t*zL.@V:_ݜ/ ʐRs <z&~f}fWղrWOm$g7(m΁K{1zcA'a׭^91HQ^i 0 :;[PF'@7Dkc!ݑr <َc&nM*ҥl7NB^1rpJg׽,%Ҿ2:0 V~N yes Krw 8|{ <{Dtp[ҋVF~Hhɐ|yM{Mq֚L—GgsY]i.SF3ZNj"ӽjWBQHVY~3tZKr,s 8[sݭu PF3o : , 0 z[|+g(9A;φ9T@Xj( SzQvܧV/"*V{$nm/r8*siYL&\FLJXWl |dA7?~oЙR|yyQNܙgWv}ۅ)Z*Zᨔ-ʯ{sLِ>,j*k5ufbYn2sK킫o2Fnp'{yY]8TF'~9/8CPn DW6CQP>knCH,Vi'ZqrV~-@,u91lpx2^ݖp kIe=!r_tX"KKlZ {Q^i}iΝnўc|{.Gߋ29bVvr(c|pQ-1Xcf2 g ;XyvOOMvLwSءMco +]%kuֳ%99 @0\>{ Y:|tHֺ ijmFZS[T[M>r u4e̐;6y R!KUf<6WF!rh"Thc28@G \Z'XItk$:biu 4kEU՞IˢXv<+_8]U8e.FF9Tw@݁]~Է^!T XD\E.O_c#ug%@(Bڨ|@: V ljϞ_2ekv{I 2\`*s#C}ڄh2e47ِ0H 2]?w$m|ZPej? VG|h jπʛuF~ȼge~u"<|/{4jXSDꛪ]n[ȥ=m." 9svpl_r_|cNmIכ?H X$i|52\?2\ m>ηP?/v3e8o\N&ݳ_r6ہͽM$ݖnm1= J-|'a e8BL<-IY4篝HPDY&C1$4̡츌 zܞ6۝e.#eA>d\ M`<$wNuxZuz 黔QFnO ͒1_/i&=GLRMpϹW~Iip}lOq*^0K$N%͊߾ձmjylP3neYViӡg]x963RKY|]gZ%az}$2GHbUx2a+&1|W/!>Lx$9__d?:3v]dž 40lU}}'":xJT?zњF{9޴mRzE~$<<' +?ܽavx~(9^,l`I>(!LYHDڴ?%n]X̘h_sJY &*F4qٷ>^{tSDҦ :~R{'=E)loYKr,cOȀ$OYu@EpVN"Uz(@#Wz0'6KP}sI3p$%-ieg+d L.!(a~PF{& z}%*XF2{P+M<Es龄jSM"Wf__S恘C'RF Eh6or"OQfМ֍%PSG٪1V2ܯ-@\4N7=RAj"m-}ݑ#tb`B, >Ž~Atbg@oH- |B^ցhB(TwO[@YrFh-e8r[+rBg\v1VX9ם5Y􆔊nɛ1ʁ3ȢvwZZ F3ɥ },`/"vэ8f#kmbȠۣ,ɌZ]SO ',rglzv ƒzB$ZYiO)ï5"W0Pwٵ.Wۄ@wWWSF3ɋ,lY[d5PkP-β\¿4fX :s44WyjgKK\nGO,+uyL $kEU՞IB9ZY(ne$wna*(Z:[YT`(1*oGÙhFm(VXPHOpV[J,=uזh&z3@/zuƝTFV{Z}\jd(#9U6M>z/"nI,3z2!99R  x _6g<2e4H~Q~=m.#7{5rA)fprñwuh-:8a.R%2\G_4>M Zwpp^_`d}ĕg;0+2| @|wƵza σU8 /sso%LկÉ<2Ên+q;do0(Rdpxb8tK[;6:;kkb_qe֧N58+|=ÞUݗP {"^2U]4X2 pYՓ Ic9f ZLZ_ee ]~ȋ]csNXƞIsgv[)Ρ'[O9A:Y\XsגZ8׸ -ֽoO"q[aw)'d/ Kȥl󸗿x4^TJ eXK빌uҪJe\Ffm=8CUset-e1ɰA՚5ˡ #iE*1(|.d+4 ֈ(Vw@<}ʏIVOmi2e u9V[ԛ.;1]в_~ .-I:5~JlbeM{,yo]%9V9T{$e-H73__md9V3 p`ˈ\^Cu7& HSmp,`})BiAwO >P+opNW{Q>\ikgL +1)uc1ʑ3 `Aфکɏ̂򮨽#WjwE μU?󠊐GZ<ζ= RXOS:^ssh*aԃ 6UPj'xtcYf!\Qz]T9)#uIٓkI1)te;Jz6B~mx\\~t\,æU;j{AhH8S,rGn}lOJ~zE 8*]N,$BGS Kܯ yn sly Σ I_ -Ȼ%ÖqʔLKbRV+h ?I\6tZY6p/Du1ޠ7##":$!;x%99 H=]<Ķ{tE E*bcd@Qq#Y"A*Ao̻c>lVgBLo|䫓tYE/UIzv2`-ɱ̡'d@RqkJ[9XJ(Y#vPRމ zyNǤ:ӡun;15D42QIud/j3,#-<ɷB:9h[FE1E(kQY5B:L6,P!Q`,n)mr*[12eda7`/;$ޢa򖘴K`COȀ$K V84 V`1 Nj5+ Ye(#oү%v0ktv|[F9VN*L+Q9vJ (uw cIe=!7 `k~u 0Gt`]Wu Jbk-#u z~Pu q~VoNHctW)#7At)9v },#yf14PaT=)%$w+mxU2>T~@ uj8pBrPGh Ժ_]c7 {?ܕ+F_Nͭ9V9T{$%dR&#ge:T"Zq͟2VXjπ$+!XpSĖ>\j1\ {]'S/#;=#6]! yl4G. `zylEU՞IuF@#o/!bg@QsiH s37zx=LهabgtJKۃTR5e8oUY.UsxR'&'dM:W-Mbe3 G!#v_0z3.ڊ*&y5Hn;lYq73J $:żlW&g#yҸo,v.kLHKr,s N=GuH?h2v$^!^#aR%VǍd;1N|RŎ>,Oя- o,sۯ2e~xܻdbm*!G `L/LGXc#$ 3WK\`)#wMxU\KҼ$)=I:$Ͱ5TzuOtlBJ ,ۘ}e1X3h ~SQhJ]WZʴ>p(#D!G$D^uT(I-#~UvDD@yedF b7@0%+i<-gX3%ExTLYt=ДW}?)# {*F,x/Kl=e} ²wg/H;{7sՍjY1e)#4_oppV{F6!̡'d@LG)2iT ʥjUfܳǞ3LcCo>s-}x E3XLR^v9R{8!n)LJC\·O^."Xf߃˾G'"sH#b+3eܩN'bD`fsU-Q9KN#¿G kIe=!SPyG9eHT%~$!H(Ug(a,GQopsB#Rh5‡ڃڟ7xv1IxNDlLg/X8j{Geyx$]uɛʂs>¸ѷe8;zQ C~FFSFNe=0t$v ,nY<?7m~Ɏ.GjGzsR"qGapݽlzJ2\eqp).]^JAДs:XƞI3kc(A 'C{YI֖NTHrƉ ?[i"|QjQ^zqi"֒zB$vZR'Byѽ_7>]=LS>?ыI hlvi7wيɒy@?CEvI3yg[9~w9e`(HrϵpZtt\Èp}r.{ZUdCiD #k(#+3d~ '=4z:s.Zco_Ut:@̋ov}^w43Ndh2\"^1^w0^oytTk=ZS} +{5"*jπ$K/* A_KbPlΌC"yJ".KeMaOM~YlIe=! tG;`X2\7ɎҔuU>%tZ Nj}Sx5$2Iw} ULqçƜOMnn81"4ʑőEt]}1O6{Ӊ-9V9Ry Y4N9ijps$\uiȂ$^Y?F}gMNJĶ A7[sX2 ID;U#[Z:$mzt?`p߻J%W( x L 41$ߕI.0.qJBr)D"(-'cgu˟rit}rjL\˗bI_ [ja5VXP&/OsUͭ_th\E~kEUTHriI\KL\0:aŌ0oHEώM>zZ=S9&D,Ö/ ^fm!D,^2yvBYf- `62Li?;xІ7Ά[?WhnL0kV˲(߰M?q,#5+a1c|ս"4ʡS^93ۏ6CX ΃(_<١NG[F=ms8}*tP#jVZ4?۬C?e8xAn=Nxi2y5e$A 6enQ)bUu* c_= O -B[7Ʊ.^ҥt9vO-p*.RVm2vKz+K̜IV/.aޫų9T@k~r^6]ʼk)O -qBףuH{CCG̡7U8M^ݔ[H*\.5kH!,ɱ̡'d@ޏn~-2z 䳲mIƘ}c#ug"It%{Hi]4B˳9V9T{$μGniuj \3ޤ?<ݧ=d4c@I;NcZ63X) >V3K]˷\W㫖㊱$2I3b]z&KcD/X+={7 8,6]|i;nW)gfly]pfK8:$q@QGwUfcHUTD۔k7Prjeځ>SN3r^r^[Ɠ-#N7UźP&$ =n ?V' I79Qkߚp}`$-<#ցqWEYd\}\ dipS~Z맬@2ZtQx{:Og~wtO3edat51FO5wg,LGPlew&[fLs23;g.WͿ)C3wY{׃¢za+Ʃ0`?IHȢ[+jh3\Xۦ~uXPΫwsí8Y<GWھWAH;+4fކ^8} ^\F.ؖ~d_[3uGޔyWu޸'zvq$]B)Ön"S3/+[9dI'c?}gm=DװlKf}M 4PP(PL< ~u4t$hB0" +qgSLA'Wp|'އ7u|S?{J9 αipV}Xqs~xi;S7R{ꡌ;ptBP1 H@Nh&r [S[IZrhz(j49R}8(}2y5pl"W dg)DfDp[6FF9Tw@_,Υǟ8ܥ7Bz86Q9ee?1Tƪ{֊= Qʾk@Q'oy8Q|7{2Tr&fTW.q/c&eje]= 8kvB 'eY+X"aO+DPYKr,sdas8v!v}3}å%\{o^B^ \/Y=Mkj̛3%,?s~ݺ }k|Utgj"*jπ$UC"ĪUu֚vaF ZD*F o?X*Lt|: 23LwHq .25ŖAzxu5q^PDjFUZm[}\![FS?"癈@Uy>*6'}7)#LRzJ*w4剛>)2r57f:DzwA0}ZX͏̏V;r*P `EӤw3M%z7ֲ[+rr HybXF`Py,U1CEc/@K磊W[qq+r1ekπ5CYSw rB~|t{T(.=+6ENo95R{vU-.p\Nf}H1-rj^uNInujgIvD[ULȑgul9ClZnU1IɼP@pwvP/V2__\+&`UJVũlzڿV9T{$ncqGwEbxI,L~\m9s#՞ ]5ϭa߻R[vf*E "ʵr:_#BVVygGe~K׆xiRࣔY\?ӾD:)m9j)6ߞ)#^܏3EH9 i?omwYO~/)/[Q1a'jzCCJ=_C\FeT$t /srh `r kpU[Kr,s iqfʥmY07\ol|>wk16*o˧lopCyԜ+=Џ i3"ξRX4 ⡁bf_׺5tKK&'{pK*_j)2rQI_:Ij)2_r*/m/kEU՞I{_dIH,"_}goXcCg@i4^ϡ)ޔ썸.Bs|ߔe VXP .]%E*4mOVXPYv^*^(eIgPꤼ X>u"g #`ż ow-e~2[F꘸[6aCF_Lj02: iU&*/]*8: -#Ic +"XBAcopޣj2 >t]ha^ >hO"V5>~p(#"av<d{&Jis !ϩ*U՞I2\U8~s,P wncQ՝-6_KΨ0eĕ\%!˲rU݆Mw ;/=|*#ɞ (X#}is%RI-}x!5@SrwZ[3w"*jπ$3/@X@=vCԧ2\5? *]TNuSz By!-| rtbW!ỹl%`J@\WۦN0SOm]6edaǒ|l U.U}˘U}l$2)ԟ ( AVpj>[~Q(XC}p 1Cn?zhJŠ{՝2HR@ L#ʻiXL(uVse/Ǘ26e싰 7kXKr,s =-wFt SD VPشߖIvڹr%$=U,ɱ̡'d@s@0S$b2ck:&etH׾G7?d]/3ʟ63'1M(!( 2 wipX5K #9;η_>yuϰe?~/7/l$2Nڣ:2Hi%T!i˵D~!K—c2sAk(iFJ*guɔ)2:u-Km˦n;j.}l3!NkP%{PhIz7xؕ "~n2$mxBv]vX_CJJ^pꅙ c5O(ryd+5Nmou,|PlHDC# 8>wYZbcHPF%zB#] kl[2obUV?F/C8//]*򿜠n,Ahkui" =z=6lg|*O!#J 3NU 356 w!O^>i܎MyE>_\1){[`F}K<׋#j>I {kaDXk֪oAh8$ EO/xS<50Xb0/aH0 RH9d=b@Qґæ.H֓-mz`Ey94bssVKX~)#u=> g?9A Τ2Ie.+쬣rmX XM`/앁Z59qko3EVSo5ݲo{j-#ɨCU杺=.l:N|Hmhqyr|)nO,a6aQeP4X2 VAoLX ݚ` UU\F3})c-  j,:pP gՌ JpW1ytUq`+Ύbϟ2;]$J:[\Yk7/W,δqA茝,תkK¼_m*rL;'p]}&w Q<R~Ѣ5 -ˉ2g :b86qn!^:Ч*? H ƒzB$nJ2=~qT/vUI=b֔pSYb!^v8%Lw$Q0&zzgtD`uh*Œ'DC^0ݑmI"h^k]\{Jl:Nt<>FHQm_ֿS пyB431 8\Ζ`9-{E'v/,N:lPgҔ\v_0TDRrrߡqk+EQsDzRh4[G5Iݗ82)_h&ݮ,xXɦ 8zE3e? 1}Sb{K1cOXQCZ!@0fБ%c7<ҝ|v8g@w5@G9P{pqTfx۟18~Ƌר[bG#U6 Qz0@^,#&+$Eܥ Wi{6"Wh;Pwvt=5d:]ۊޏe8Z1fǻjb"!+\LOXU/"@zFԑ/; v=oHԃBoջ,#(0xy81_b6x9WKZ5VXHdaV \ ֐+gЯ(У[}zfOQey,/.K6h>E>+ζJ|ae8N-Xv;)#xjIC-Vt%5$4̡L%; !MT_w]qM?o?߄@EB0`BB& YR3XnY˷W| rhI){_vv07FH0JiH/)הΤIKե-3X.7Q V紵"*Ty YBnm!*wE.A.0ƈ(Tu8( ;!PD&b 5_ZLC2Z' ?G)Je$b{K0دHms'4S\Q|$,Ocvph*jπ)?Xnfʾv{lNjH/(;CSD @OtCuX7խn\ ǫ`-ܹ]+eٸЪl> }\9H9( SHH(eIτOs9hGcș~=Oj>3wZ98NM괟:6H֊= ͞0M&S;'1%$bﻎl "Z_oUGkՋq{*5! 1vc& l-Hj\ݕP fsH4enŇu+X񗘭g),Bc jwGz+[&זd+Sޚ#d?:rsXkb?6 fP( |i<:{\Fk6c~Oo@{0yMsr:O\F2ֵI|}꯯'k >m!1I”OCf>CNcͮ2UDeosOMlY>/љaݨJ][f~edaDI|LLqNmD.]ǧɼRk,ɱtIT >mGl |Zn׿)әP70T_"*jπ$M-+z<+z\8#/'C뤰e8{r96&|AASX';rL:S{75 G08Y b u$2$3XY^|`Bj:#(&1ҭaWycxáWWKvc gKێR"IR4c#g:ˋy^.) k<5`[υ3yP=J֒zB$[MKߗn,!ZlEU H%N>OP?r|c"-.1quff ## çsAʧnx(jȱʡ3 p52`zӰ;Y=9k#g'Ɵc9D)Ϊy}Qr`C^rWaz=fSBQO1+P{җ#u떽/w·#WS9V9T{$.2! ]ZTnwlDhCug $@}?GI:Osr#G3cِFLqFuՏH@ًrsW:^GAi=jjZ% \6HA^0emfXF>Keb[4)# {YGHoWDs9P&z ^kTp&"JCQqeXNF1ٹsj283Q NRg}݉ExOs eгYuP@!%\'p`3"^<_ohߋ 1;1}N߼Ե!}H +]/!NJo+q\<\GU>Uac9>X2 pWɣvlݶ1"4ʡ0,(}-Q߼\|E)u4%;69̊+ju1ǥ(Hp٭;XcKv'd@+t[`+ ZlA4V7m澔e٧9Ma@A8dABʪ-nԔoJek$/G]kҟPCilNdYuYn{O3wF䁷Hu$R?"OJ*!C$2I!8ߤu=BcT1e8^lGU[`R~s =2…c'@U np>1oᏉ45hHh>[Ys?e3#Hj69PtQTKGԅnUinOH ]*pJNJׯ8k\"*jπ$͛A9$"g!k1WShET]"}ZeŒM^sXU~8[YHd/B>)m_h\.<Ң핀ZcCg@_l?˦]8ATzx{Cv`EU՞I;y(>/MO̔τ@ƭG)&Ho2 ps`ޗJ3+<-vxMoö8uf` TvP2=!ĉP﮵=ZxQ?jqfYIw9/s*[ӥJ=y*ƤwU4 zΆ@pdQ}̂sjJ7)[WxWz18==/%d7v|j_$v#[$beij^C$U<-u VXP孎]&vhb+9vmr9H fus?AxoX17f;lJp(S \}^39$9(4@c: Zi@6 D v]1Ȑ9R d{k5|dC^7n4l<dž/ݚ욕C@O+Ec3&}=l'2\> $ 依#R4*YM]0$F/58|Q̶2eAh_LgmҪ`|.p+Bqv,qJq7Z6nZ'p8.rP9dB8+gꇬ錦[ dy_pq+ΗwPF#GNjU}." 2߻}N'`bh. xOAr KQt=E bt)qh)]CGλ)sDo!y-#Ô8n?9"xSueOW=cɟ<.eos6&YgXq`аAul:wo."@:aDjmUOʞk]7]t%(Hz*!USTM}ݑ%EA^N-'SB%$LiZ.G1[/pD$3/-"h9frrn`w?, =5okEU՞I3qUEBO !beM60eS3Һ:[4ftvdz0qu e?/))2olr2e_Eg@a-ɱ̡'d@j]V!w%5] +C>2Mxr]cu8u 9ګ|,1ʁ3Ȣ90z!fNU,Ø z!O*U`P+3k ng$r_)ld.Im\KOUOQ\jȘe28LPa򉚞7Z3jPk ᾡxkFe.s{'8Pw0d5ٚM"Ԅ\QbUHkEU՞I3q'[U7-p>K.Y֊=+qUbaxP}m;9Ybq.&;;OK??;lpA*lPp 8wLۃ;!>" WzE#i(#KQv[́ݫ*S*RR~S7 e8h.,yDs$ޭ_[F]B~jqօ6Sxǵ,`ŽMYu[.pXMC &feO<`es-u.^{QsHpQ[y~4㍯|q AFI-r3է))olIe=!Wϵ⭐*88[\- z^XôUg#rr @a(ڑL*7pwenzpRz^ @zO3v4YЁ+96Pqrv/h1+^$|™@rw Z_ Oy\>6Ui:wQZ׺= ' "f޸]329vZZ\F/@ I~Qr * gwGċiįx2$_yaD8u#+ +Kf0iV Hv a=0̑3 `:|-'oG 8BZ emX!,ϩsW03䮼pG kv,soZioIcgBG^kV㶹bUb)jPo4.r7xhK"R8ܖ&g}J"]*Iǿ䐑3VXPnU\.da||({9F3 `ϞxGKd-:ŅNѪlȱʡ3 p=JѲv}ҡP<DZ?hU8F xK^߾V-oeZ7񴔭Ԫ¯Q F9Rw yKQ簄וnKU(C9oL,P/6Ku-yF_k2/_%VpʧRp9V9T{$N$n?|sY\\N]ZVXP89 J]s#qxD-ɥ< h>e>[ڽ6pf2Y2c*ic>墛KV@%IpnW38;B=[jhٮ /i /ΓR٫I׹OdBQvYo&mrVRђh~@v|YBKB,qP{ZķP;c#ugt(Ɩ|%)W?3#01VHȢ ecɞ$c*D^҃ \\Oe[ "bR߬ [%Qp;G ՞I]ndu훌4Qn%{ъ<,zїH#)|W9LWbZuiJ{lcDQԝH+/oڟUbcaCg@x7ƿ]ğw+>SDZcoP `psuq3Phs=uW`zyUy0Ve)Kp\#lζ kDˇ[wrDMA TLݑUiPuQ 21The Ȯelp{,{y3Aq5OM(扼9- r'JBI$4tfUњIJpqB*kEU՞I{bԺXR %=_"*V{$n<`kL8Iquo)Sy P m*u(9|0GG b[?B=1wow.겖z^"SDzz-W|YKS2+e>t֐0GG5.SpzG.frGIGuSSi)}-T */_9CmךJδwdㄐRndTUـ {"U)-El%-tdƒ2 pC8- ݯ;h\[ka pgzsܫk;i j^-f\2BR'#4dm:QGո4@ (WW'j,ɱԟGU/ܣ2O=fc-4Mȩ V>^(?Os2NFֵ(L&NYK$0ҎPi_P[s ~{/YM⨞9 HܸeFvM-k+ƠMp)ق2.^μџ^ [mc X؈ - Yg,vecJN[ m){}ݶ/ⲻvj"J^GZ2 pjP^rϦ99U ȗ·qoNCthMB *~&4:(I>m<ֵ[g2my BoLPv\Yjx5g2N+6S֒zB$nl !>$"׸29 NVpQx[i\mq5kJ-%9'd@n;hHaTG5Y7eT~]_"MxS5ɖFe[`xBB e1>(0F=5V֦fTF0\nve~%FĒ,~%/sO8%+# S,l*zuHkYK<-#XWr&1ɬ|y]'H_D.ESv:qD95>3{j1mru5Cyۤgx:a]&NƒzB$hbT>e?TB9V9T{$s/<wq9 MWZʡ3 pθu=CnMNfYי3~ڟJ +)VnbS&Zhίϭ\.,lr} E2`8Rd;5G<Ǵp_'W ܍~}מq0 F@yqR+p{,A .Ke Gp,V˸JfpE>FZȍce`{B$goMeukMS` wn؀8#o3oFVD#7(Rw0TlT$lR`P`%mh2<>mOUO[_y~us|z^+#iH $hؠ|,NQ`Q/d,PP%H9T) 1Bm{N9"]~ywE(0c !aqRǺ o(7W }4X H?~慍bNQux te8N2,:kURJW%Q*x('(vr钮9O/GŝL8(Bp9?8iY+rr H'ڛ]2(ml-ɫ.ҚxJpp_re:bU,>ʄ¤*/OiGKTn$?FZ54xB% nY?okjrhpvk9/YɄ\GsU&^+%99 H{2J,"ύˢ%^trq,_elȱʡ3 p>%uS7F*Ύr#oOgYz;-;.Fu/%}d`gmcr0flZL4쪹t^0$G~Szq<rȱ_Ug['\Z&`凤DjP;I-"~ĕ%9]||{Sz~s* AKPB|G #H:EWaG`5޷S( zVε*l EdAk vCh.5.N$r2-tٳ=ϳɥ9U`z|yN] wJɱrO~ϑeR8(!.k_=s$LҦGdkǡyNFnLYdVL,#*3Zj4dWF+2FU?FsâS]1,$2I+_o\-}4q:1t"LǴߩt F@pdQ7c>Y.ϵav+ޮ ; io]穈p߸pCH<,Яy푺Fx 7pW!?XNsW>W,SDz n B)>u9)'+#37!v׵d0@Y9nW: K@ E~JZq2rt! a&Lp{ b|eUq{HnF2\0Lc%ˆ0="y6F_ %_, \RML5Kһ_"*jπ$~@~= `@լ_MFq7)_R]{U&Uf!VXPNf]eʬwܡGTLʝAeȱʡ3 pڱYBi-ǣ gSDҦKȞ ?~$"%>D7yKpbpX"u}DSRf8qxjE>P{b aH+W&vg^&bc@?ӌ{OE_STf'ښӾj&qgȱʡ3 p7 .TFi]X=g}Ǿ톻C&*Y>UB-+~7X2 p%U~WMpLle]e2†^f7KENa$xpe(EAa^ZF,,B1zNpv7@ࠣaG$fܩuPF! w2\Q R w'X Ҳqʹn \2\.Ɵ|UO9fku}3 w0VfPvG)zcmJ7晔E=t|# ٵ?j Ț2s4$e䞦Wf4$xߖPL4f߰w-ߕj/GA< :Q;t9e X*йWZ*u-f,#='28{RǴ*˦\]\7םvJ<pVFEU*)#)'7˥Vܡ3nSDz%l[ ȂȾ:oB&T hF0N'3i:ϕgݧ]gZ+N- U;Bj[ѻFpkPsg~kjXT.7++=&)w˛(p*Vr 쨾=d^g0i,CĽ4dKU_ٜˆw.?oMygp>?g$BʶV< ">y1d1?IҷğS9dJݟ!ox!aT-,jiss{i4^ZkXͥWfSDF7Ý-t&6c^'%Q`P8[.h>̨v\=ө[Kp:;I~u;bb&a`KF { 8.]v"3ђzB$ά@\43Fܞ9#&cZBԚwc,"@n[\~Fd33Qug0vv9R{8ԸEOS$O u 6' 3ޡ'r|[>|沼""5ma1PhaXa)WټSMܷeRb,[`)r&ԽQgW*~~U3eR"q\m~]L}{O?TC}¥ /ZsTi-ɱ̡'d@pxfXH= wƛ2\oG2uuCRr̥Co"TkQm9Jދh>Kn,ɱ=!ExYK#(hzRFO`'&փ8oNbXCѩR^~0%nT-N:rCNisԿ\o~߰ת"TU?ΪL .+#5'0EoY,oFg!kE9ZcCOȀ$U*խq]b~*lQ5"4՝-67juJ}̕S{ Z1e6pMtvr5edawG{@$NٍjWtntX Bj%%ѹleg˕\@Sn _XCRF gd :)g hIUupY.k]HWY p:* K%"*Hi.cuy&( V$opo74 7?p-x^(Ÿ+(Ɲ,s/4 }M=s_؛7%5"3 Fݑ1(3FYxZHeiZ/T:!z[J0o{k0^u~MXd#y 9Z eSdž筷VQϿEq4i* 2)OHДڣ0P?<եc.ǷyNN`,PB@|aۣj h#$ þ]1UzeegGcn=EֱKI_/Rc¾ZDEą,>O F-l+x+cpcɄIem8;iuL\*?c.^c= 7›|W^C.$2I+A$+*k!'x^2#0gOr[p$?ɡThS|ZgY;fӮזX-mŪISFkߧ}U9Z/+8] $M3dp籌ZbLw4bU]!šs4"DS03 @IʞRm|%ڕ=Po0bqfE;Xˑcд" ֡Rb9>ֲ/Z &kIe=!g q׈9B5Bzaֿ`Hnl!¹t/JWFǜC{aR9 9`s2E\ޫK G3ZFC `nLsoTC%2e.2ᏺ%e.CiI)[.ͥU rDaGmafu T W|veYnn 3b{Ɇ[L*p1cie:0'r7a7MI^R=k͇;:\I8Usϭe4"Xg s:ʞm=5e?)#k+Ve=C ikڀښ[n_Ռ 4R= /X/E={מ`u1%z@=?iHCq&'~wî#[S+ܰ+Mj ǩKr,cOȀ$] F#u4O>r:zWN4&qCre/Ilu$J] [{=<_!pb)J(RԿD;[<Xd8}>^>ƕr,qz}a sR=&y.FpYF˗{[ީ@"SEsi;2Rb!ߩIg,9*^|v+wM#q>) 9+SX*c $"o:)k8΋.,+#[Y4a/J$5fqژ Y*)#}wY2j(:BQI~9Q>Ν2I߁0xI.~Q 0g_0rFǧ9ەrTf9類pu,|I'@V̡psQh4j(Q2io#pE3Cz%Kts ή!Y(ѧ}v;\]n;}=*ev˯4 ?VNJU?LκdC:5fkIe 񄾰_+qX}=ۖɺ K6SHv BOs̩JcKzd-'۽mIML ]QM-ɱ̡'d@j%^?p'KvIzE k9[JVkUS}ײ龗XO]g"*V{$N^glYٞ#7x8Mv#rBugO8OhPyLr{,$QQWߗ9xM]pPO|ݰls/z9p1ÞYK?9zMdI*u%ئepb5ֹǬa hn⹦'{R,h>нc~F=2zca7/Y$"wI0ۢa}6;p7nS5|P7#xq}_? ?9"ko=_p;xg~dw%3d[ש%%ps{(#}{:/esLHyo7Cenb4$gB1u9^k;V{bqe+n!?{vM%6l.֐0H׽gZJ` V/Ǐ@;8&݁Q^',Ou\αKl [:_uM4eda}U#DǨ@\2>m9L ~p.wl._UNV{3 +XF{L_q@xsqÝfx]V<]rϩCL{<kHhCg $&XC/>U{ʔr)zԬRG,\~rkҁQ3MեL,֖q[ pSFU7\nFEX2\x)RК V"T{ýҥ!/sx,#_J}2\[ 벦ˍ\w} 0EeW4"s=oHZ]eN`s8p ̼!FX!P(lw;[}>Zn}N}N\;q?%l];Rݢk~F+rr Hdyt~e\ZظF- Oޯdw={@\mTQ$*^eGo,EAIvj&x: FHKD"cnErAJHE{ .6;wfICjPÝKrLjl9hCf)"@ KLjII.Ε|b-ɱ̡'d@\z`B._c<Wx{suJ~]rY3U=zP *E)YSud N0osѫ!Y2DR"D'0gŹWvt~ZGPFt7ёcq5<~y|AChk?_ay]ͻ\i3䲮x!RP vnl˹uV7pZIGuQgdfP&3ԽtedaҀyYy5Xa)3efǵ1(9uYGX[ kme64{ 2∸8V=w$F<<9^Qfa 2EdAC?yߔFH:yw*UBV(Bկ9f 0P2GJu&[Ė_0"4g8[Kg;|kś=i^x';峻\Ĕk 6mY]ڐ\:A@2vÅF'ݻ6Xk=Dpz.!QXx@nTý\5~=XO!x;>Ba8 !ڄ"FϮ$Y Uu7gԸ@[#̻]~"2Cȕ|_@;jٻU#r|u;X:}u.'Ȕ+;38$3c@ q5,ja $3\a %3  < `OAQ[5qRN2W%38DH6x.2\2\kFTPW^tyy=ءiDWq ᶭf=fdbuF=hl2>ڋdHޔM`aj-'v鲓V4]i~q J.:ZcCOȀ$WN,57Т'SFkV*i(<8eֻO?ew[ݓfgaSF{0KQRu =/J0lq3| a%)$r ğLpPVKa]VT vy"yldm|#.Lv ~T'5uKۘv9ZjTSo:C[ Vm?^%9 2I{.Er<2B`Ԛ#8=RX`˾*2zǔYko2f{]Y35[}.Q EnUܮ5r>+^u7%99 H<GC# 1?hJ,8ˣ!s" _À%d˥S2P,ɮWr1#/SvS̻_|?=82<읺 w bW7RU,*ƈ;V\|\u [*+e1΄@` hFNti9^v1sD~7.>3C1!< Zl4| ?{$>.a^^Uak[F(asxմıknڕ7&)YaV.bd C<21( JuV ֳn9Z\vKPv\H 'j ["DIo5\ݓ2\{xy!ZpiSr{!oꛥ]x_xB̸X4b[|/2OU(9T1"Q9V9Ry YX1ZJ.ˋZ^k:9V3 pu֣C$2~2we9M9RQV Odn߱,L_xb1Cx e]J)"@%0f>=U)#f`Z8i6[XFkoxwvR;>`ӱb˴ϫ:]ݶ7mTz2P `i{_Js{)#' MR2ֹD/hf/= Yc{B$4O9Mm,i2SkZgg(# SG c8:ַ620[{Ҹ|lY)?UF1/tjڙH%v>wA~z0CG]ة9d:2i wsw\|%*(QpopG5cl$fQK=l>"h#ŚDA?u"!a w,uM|u9X콳P4}R{=1$2IkqD""nM=?t 5/Xj}tƶ| @F_7 2ԯ |8q윣 ,I̍cǨq H3}ǽ@~PD ,Bf~wAT l_HȢlx<TlD]Gyʦ9^FH B:]WL>ebup,9Zo5]vcV A1خ-̈*ϑܩ$2+LH+׻˖ꯅ_zId M>sޓd*y V/irt&7% !M s`^]y"<췼:r]4y Bˤe T1ʑ3 `>eM>ġCu&(XiIG$lrp5%޾Un{)U8 !_"'gEK5H0mfфBipnpGy>PGFy_: X9_VfCuhNP `%q`Y,ZJU'kJ#\Z 9"fnEbH5┦ugʡȱʡ3 pگJ,nSnhS !/G5/ĒgZf{eJȥT"ݭwTsStP͈8بq+]yCf,k}jw+[F+pqfVN i@bdš7>{ |6moѿ|j~;4G? +ů`,_R[Oi,.J)H%4(ۍ \O4c[G7>5s7wߵ,Gum%L W<9KLfH72\#[ֺ~WWFQijy~v+cJu/r>JY$~A*q?V: P2-`!h<""v*p)CN G#}'G6FKC5)'|^ss2X) D ?V5jt9_)}>✋N_o)~*_"*jπ$ CL\uN']l=>LJqKiߒbpjOTLjP YTK~8$m۔ȖP~ uMvw<>-Wችa?X~|"42n;oGs5IG//i%e%{WI7md+:A֝+ ge!Ye{-r'ÿQQC/isTھ~6O4$:]ډSYn Sg.=/0NPdIѬT7L*"ʕ3 ɗEtI`%r`EjF>#۷-!xb>xWr-J?@R,s 8lESU]YLT.a٧taƏnpzmU2fUɲ!Q??X{TI,-K'A;ܕ"Ga#Bu1QlQgTõ^!/"{W[7Ct[K5e/KMd=8FXc£c0rnFF˗#쩉l,Y0wQl0Tbk^vWYKlN#~]w-=_kJ0?@Ec,wMNj ~1`^/%YjLyHg0Ou ]Ԟ-e%^,6׸Ow7pT~SWwF?,Iq07QJ@pօ4Ʀhgge`xTܓmJvۦp:`s:W& 9l,p,1n "O^^RGڳˈ:!oӨ(M9ms e88K1 $0I1|g 4@N#5$9vZ_ݧ-Pp,#&I$i+OZ%MķXƞIoG8~Or' 2\dS/mD6A wӧthyEve4ĄֹTNZn+{++-#%$ 4¾:/Ǔ`pHxq7A{GA+-Op }r+y^**0$F~ם({p6W W౰u+#5{?*VW5mU߱,*a'Y'=<@lqb%϶/n:Dgfe'_cɍ]~36ʖf oN#rʄ V~Ƒ{:E(F0yk3&2ZVTFU$C5qtuJ2V'r]2?2z1nA}RfiQifyjiJ/m:NG$2GH6nYk6%=}%kõ_KmM$]5K1e81y;o˹=r⛘u@GCBCWBHjKwkEU Hw8`ٍwo8gGh[F srƈ;V{H4+Z ]Jm}~dgB$Voaa=Qή}Ǚ-A0Wq)Wt,„Je %6ERY˟ }lz!IHpL/#!i HBfp½\ʃ egXq83; Ҿ0si# BYY/_]}OmÓPZM[;Z#BX `vjqژ&gJ@JC)Y' F~b`$XY<_k ?<!"!3&R⭅w׆))#5ˉR'VsKpIjȊ-{>M~Me20edPO=c.cp21H󕅂%61o;+#3yxLtibt-QWqRIOpI nri8Vr" ʻX _|cHaԟH&[y NnuWkL|X-7Ъ$sĹj)W=((;CB=[9]"Kjz۔p2\9k\V vՕcq5Gxbpvs,4]O)o8jjjv j#1G_$vC39NYU Ir0d ew(tى,Z:\#ulMҴf a@!"vxhppZE[:|<] u؁v {[FV~UX60ж꺏(R]]]o-&L)^ %R.zimuj2iMǺsڄj.ke.]Ʀ,qTiL!a՟-f^d//'\=]o IEv16L-Qw=n<"1@%tJH$AN* t>" NafVǢw,G%ıVXP tY [!i(1q|\ ၱ"*jπ$0b=rd+WA>]am8%1«?m{ wݽI0VW"=3l&A F5Wm|u2-mIMUTb`ȱʡ3 poޥ/ss,`tީe+7n*E,D٣.|Hvkh ^j 5p{g@?tD<5S?E+7!"JW)=%9TV9+rr @0qؐ[A-&迹ח=ˆ^(.̋ˉ0ӹ`HhCg $o5?Ge=?/^.Qor;S\>p,+zSy 1̑3 `seX1_r*9=vQԝ%blr$Yҷ#+rUg0vy@u}_v9r0̔)YyoteQҮUV29TK>ĤŎ>17ra;GK%rܦe2_wߜfwMeZ9 L{eۮyێvl>xSFS&^~m*纴LY*BNFAEVTQXjujB) 8 ԴLZ;QXFeӕ6wP:54W<],FﬖWƒzB$n,uZ !~!]Bjw?oe^1P2ԼSƄ*"*V{$ntK- c;,%rUy?PSF oVy wj|ǬRr'M"9뗹ޝ%99 H(?IQ7G-&#')!#u/-.M,BF.[Yyk-#WTԠ͈joMn% 4n`3T= mBӋsLڜQS{\/mY1g=?v)# {&z*?soL0e&n=$bRIJ.Pg(f*u'ˁ$2I^v@ھ{0" ~w cыr9nlr*"T%g:5}4(NU3EZcCg@=?a?xH Z# Pw<o|5b>H/񘦌,0r 7ɡ]j3!}4jbKLY/aL? 0Y=[J}_.Jzb?k.rƕӵ.B֍"*jπ$3c`47ZmNOB@gŘt_.aF>_vdQ ݓ]rl` t YCXF3bd5 :9Cp4@4;,5l E㺿Voc 9ڲӶt!gc5g.-i=t7(.|Kʅ5"4՝-=DFʾHَrx8jhEe 8/MU"GeuދO弞)ڕbZ!Y,7в:Q?CN'ClXO&тe#FCΊC4LjE@-Tx8 l-ɱ̡'d@^m"7IBNx=䅶E6WB],WVLZwεmvN *jπ$so]hR+`vvx96{ѬI]2V;OpQ^]s/ݚveրcYINGKy <.H:2дx Elq$k_BNt9ӕX1J`oZK]Kr,sda bbsM-JxŖaeBZ "*jπ$ CO'w`va7cN`KЎO<ۓPA,ט$?,F-}Oan,ɱ̡'d@lS'Mm 2I溏 @qKɽ:moc|B lhdCAcmOWwgYbw.&= A?DKH[Č{gJpa@ag>HHMM5<"~H17H sv&Ѻ=pTpʮLaךl1ʑ3 `ac_%>#݋V չhvEssڑY-{O <1{m.T8ЅxVާ9lfrx\zx]ʍ>⦌/7T&»2"9]sVI2\[FK2œi=5͔Yn?Gh$ w~V摷BG|xB1|QezIAJsI VKZ/|;M26VT~37>P@(ˋLZY^ w,eܔ"$w*[ҝ,8GYpjD)#a>}|.Kչ=S+#=G, R[206ژ٤veand)u*kYjUm%nkFWV&Rs+duXqWx2S}L]uObFy}ݤQ1a%N{wl,ɱ̡'d@gsPw+*{+Ug@TYnX$m`p꺌!yxpG 벌 Ak w|dv$^KӝÈ|z+#[۪uzlk߮FPi{ꦷ4I[f 0Hܔq&|*Ew1iSNz½~dvX2 p>VzݎNY" Wq_Eoȱʡ3 pcGnj;D" I ZDk W 4tӂ *0u+# ,QBL`OYߢpsD w>Xrz?]R-gueday_A|cYBCXQ\ZRX`I.wpkLSY!DJJzq`Gs*N#cAtB M`={Q=Ɉ˂3:SY7.q+#/Z,~[F+4GP? ]ZᝃHELbgTJEJ,U֊=gmDA{/1ޭ'$=,7J2m_47~JjVP8c=AT7 {S}^3ap]Yu=[47 N9Xc{B$nm?BP]5I Zƒ^4D?,^v=YyPk}OB)ȝf/9[r-wܼ]euVXt Hr:!SSw鏛} re >S=䌠%}-S{QC⇣N&}zl|m֞j,(W_)s#Ƽl;!'o)ۮ̬5se ~>_ה*j ?6loG ޡT#$YA -s ^4,poտt 1 ʏe[Zy B[(N'Cs>aT(Qr՝40 ool9!P+>2jWs=epm2FW޹,TGdo"Q,̆er=!2n<.LˤLсeɐ>~6M m,6V-cL Aw1/_{]SY\ nɻ=EYang_n&}9W58hټ_p]K3gCN')Swz ݃=Ρ+ F] haA2b]{="@%LYbʞ'X͖RH [mch2U;y<}^,[at159B֕Ԗu+-[=ܫFhlX%O Y 6a࠺##lai`?chʚ$wZ7E-Te {E9~g-^딄hbSY]ycṋ0Mkb* "XW"% >lVr.u]K쾥[*ˀ& U%qTVl:en(9j[^Y-%;M|$G.4eSdi+|¡F"5j!*܋JMW'ؕOos1ϖ#cԭ@9(֌uQ!kSM/Sm:!83lBnEӧ:|h~'S@%c a<'fA|;>ѥi9>m椽$Gn2N;RUr %:xe6, p]6: tgkٿm)MV|Z=ߑQ){$@Xh鮭s 8^ W؏䬨y ;U\|Ϭr>Ϯkz+Aloò6RR 0ar՟40liQ^ |{uY0ƒ-ɢ<3Exr%?^WPKnjcvVe <0k1,|(|/9O1r 8:^@q ͱ߁rp r /q,bs*ˀgfܮ5Z>֨ ;Zr?܍Qe[D/Te@ш,Jiv Ҫr)ȈJ' 'r^|qFYV^^ݚڜ-ƯZAi=ӲeW|$:G m8ϧ%+h =2{8Q7[4MI$:J,"MZYe*jÒSZ*頒|AgiUr՞W.@jmHdQNYDRw6ԌL2̡:$dfE]2%OIF)g\7F+f%%*]Gr@$t1xw `3bizwjm΃V3քr/[UIl9 U qY#鸇FwlXjÒss&mSr32ʞy^=˸=2[QFuQ-uHN'-j]:e4՝40L ;;VO o+v嗍8Ƿ-<˱QFyԟ }T#cFboe|lehj{/}n5M?VnB `=x]WyִH-;j7N6|2BJɪ`OF/uFzǹҢIc\!!_:\u4:!:fCQy-`Y`p[G &7(W]ǜGHU-Ƥ|%4hifB VٰJ 3{G9r ̟a]u -Brv|u F٪sR5nN3_7m֣*YqnTV` VٰJ 3ƬE4iN"Ң 84#(ć{Ss6粬ax= MvLST)z ZV8e zBd.m{L-CڹnrWYWep. 9޹J5ϨK>Id1qد|"6[M#eYÞ{ϝ(Zǰ2ce8Az nUe*N ЖCYVg6M❐55x4@RHک!E43Oκcld~+.0 Cuҳ[͋iY2G*VU{dWO̺UsUzVOT1R[۶An.˦nGR9݊Sn=ʊ$Xd m,_O0NVł`m' 9wF&E;Y,1r4[)&~օX=T%\~B/-&Ge +F2M 0e@tYgd o6b:Z!Š>nyZREyC\?ToSTY\Z=)=Az 8KfVV:TW=g7 ?%?V--HuG! 0\zH Bx6MG7 "3l~ ;$y)EO}F:2{-H4SKups׾epYmP㕏xN8ȑ泜'X@u]3UD1Q m +_ pWU(jY]zVICTb?E"QJ)ݟqw,0Dޏޏ}8h{diosBo va?>%T@)dnHQa|5OQ!}_u,KĚvɸn!>,ӬG㾷[}b+~O\_?eOVG"uG_O$H< 3O˒h[}2^ew_ca>EP%VRUqEʲõnݥfQБyu) xuuqvn=N" " bl ?0LH_D-Y A`ŝ^3+73bo&s eEKISY"I A[Rsr8`΅bm쏥,Ld5fDe(᳠j~OMqO\5`#z5eQ>kM bj#=^5=fZ$Ԟ [ 6$[mbjh+PQ/SR0I6i$ټu,Fnp_:ov௚-aџT 2tNՍbdnT]y*aF9t'C f)xI!_]06d}y$ --## (У lkP(Ql -YM9$㖛ۭ) ~9Gf©Q4T0-Ld4}… o.h V:Z<F0\QV0 \SãE@FK2 7&p%Ad@%To~$DN_CstY0Pp:Yrc^:'a tpt׹Vo({ܕ `\OH̀;˵YuR5/yx ]{M~̾M0Xf !Pqz3ow߫d $riF6#;iMn>㼓ae+ŧ($`IL^ol->I-_8UO09U 敯> !j2D`gi"Gft4F{hslrj\pGό|UKÃG`0O67t3֕{,AACDPުWk88.˦Sw_"^n璬!rE%4C/ͥƏ#z^wyb= 8Y+,rgGV45VCq]]e(yN̦ 3T:u(xx] ,j|?8+ ԜOEM$秈̋;#17|qe$,T<7Ś KMea\ï2 2tBY30\@D){ -a\OH̀3ElXqȇg2_3zدT$dvX[ָuZ/&%OIlꆿ U/uS2^r4ŀ+哢a IksQT7[ߛUow|7eH2"7=.*!N*r2Z;[p!B!{f ~Fڠ$Gp_ܗ5Ie 3_aƜhK5!ebOm 8Ǡe0UbԳ]wR6VcXõ]I6Neu+R=F%B<X slɜy6eIW$XU*ޚT|±QEAװWٰLBQ5ɛ8ql]c-[dfqӠse Kj1vd,D/%2lax~c2Bs.f%@Z\'&龐LGb,ʀr̹鐭FG=B<xpjvBxBMn^dZem})gȃO0)N5O "bNDbѨL,[Ԋݚ1V]$2%>{@Z? Q\gw|ݤZ*ˀ'c$7es')O\鉱\d3'Vc֝լnysxS屾Oo.z-ZcyÙJl1p/=3ޓUOʸkh,kX7"^29]y,S\1rtڇAmAqqi=mt<+;xݕ8}glX ]$s^0$sd˟iʪ,NK-s 0S9qQ9yy:kṪF:O`OHoƩwٮuW!ImX-:~ްGf &񋰅zKQ8گ(q'nSB14N5tP[Ci 2&J=blDpJwi4 }aߺ0?iO&?Q{NL 7o|/R.ˀS UC#6VNT/)k6!,Zlm\OH)}%蔨wvo1VO?,v0a~s.ʲB-o2uY)`1C:4Ks2X{h:s&y3euY3PtidRZZW ?xjz2xC=R9([NΧS7L5h!eKZ*‹c6 b (ݾ'y6%:ܤ0rWP͖V~-3 $?n5X ^5GnߛI6!r+nzޭvspX_OaX?* 46(؇F쁢D#h}NPٰL'$@f܁Mֶx(榲a,PV{7='m"PLmsW3eIc-xu֍c][Xh_)bFһpc2%OI2-^SYUfc;X%w$#=q[[ Ud6ҝˢ@mu/*VU{d~y>ʪ@rqrn(Qr՝40O \xy}d~>8 3  _rX(O'{[ ]y\PpD9\7|4~c{*VU{d+9Z[=1Y~`el;QCYIc||Kz-nY!+]"8*:zU".j U8%g[-uY|᷎=Ŏ^@28:8|bi+J|l >c2|}o~݌oDA1.\eLx(((tBnB&ԕ -q9ĵK 8 6"2!9?Wd\z_T~˿RL*e J= 09T4d@x:@ijTI:Ԛ@uHpviR _Wm zBdعMEk$]/̹#&KKP8D۶-fhi(F@J_iS.Q\%lpex,kX7e0(/:wIŬV4ٟta LWIly k Efuؘ,a\OH̀V*V};ۇF .*V&$5uPkVvYc2R޿k7 UQFH/#(?}\/)O| Dك&^MۂY}9P}RZt>"ݛT?KnRW+[ Xi~4fÍkiz6V`Bm.&"Ykؠ0䖨rnoQ1| ӆN™AA?ҲY" -n.ˀ#+%J;Dy+L$!K om8}|gNgN:JmɺD,BWNX m zBd4E{Ef9ch(ˀ`?~fPLG9e.yjO5o@!hU[TYCwUH,Y*Vx CZJz]IU;?p4NRJ9a 8{ \cmоto]*<Ť>Fk=,kQ)FHj~wµ>;coUA (&g$=EP:HH.i~\Wh;M7[fH;/%F :Gf9?u'>je6K]:?+>S~ȧoɣ<u YDzwUt_,p0e yV9iy1 {(Ty1-zbq%#ň\ɾͻgGzC҆@7p.ʀzր t`B?,N4œ@G'z/sO5+IWm>jZk_ZнCY3B3 oԿ+N/lGi>s`-02 nHYI>fBqɣ/yKڭqAyI;pE>sz:vVPt3mN?f%r+)Oب5s xtu*~`e{<[ 6*0;Jl+{7jLlq i1GGE}( V`YT `!<9ƜhjGPٮ?=,Լp⎼y]`{ex^` Nu 5K$V9xE̸vk]V믢Ƨ?[ 'u6Wc7 gʌ\,kXs=.wb_@KQ4 \M\렿0i8Zh׮]-W/?N0(1Y:*k!X 4LաϠ3jVi,u?wb*w[QxH$,!k#!ke /?Fu\wtTGC\ 7Xf2y5LVx:rY }V M72ʛvS@7Sw禋BM:]jb2ʆQԝ6 ԝQOD1[N'l,+T}fCֿ q C,=$ӆ􁎁8 SsRјPL"jY+y̨+KmN{HpҳDʟSnSPSjU:EK3I0.#QlRfd`#O֔Ayig*\oj%%-Ve/ql|˻:V n )\iA^i)+IF2 8߾m*gB_pCu\5ї7@ ^n%; B+6?QפS3Fy݌tP֪m , UeV,rPpΠ HAk e5=Y{*;N=LPep}4ޱƣ6S\&9iЀ.w2,2- ҫZ$܌1Ww^gvϢWMLDZ\'[YC  Ӧߣʲc;KB9JЭOBy}>~ʉ,kE0L3v׾>~OQ >E4@X0H ]<p9Y&(z;Ev/[gh`Ab={Gsl;wϾOWepli~r=>þ*S6-05mqW>LeprΧ(RHG%,E"*T&T;u?u epCMW}·7l.ˀOيC>B{"M];w.ˀ㺀+ζ-I*ٴFo8)%J/xgqmV=hYpPدާڱ>sYj;*cp!?ؽJZ~Ilc+'3'Y_nK\{qX䞛TK2[N%!AI[f23qZ(?n=<)FaʚlLe] !-~.[DQKSiW e =2NZi,j=$3G}*>;|޴e6, pN-!n{.`)ujn"snU6 %S,2,s4UhT#>n;ZKGϖV2v)ʀFsP F_.^K*ˀ.|^dC01Qמ٣_z0Sւc-}-_Q oץajlX& 3m(dj: ѡ,픲cF=$CC?epdܖp!Š/yѥ[a ?v-F3&>B~OK U8%²*y!V⮢uTX&BfSvȩ\r+_MEBe%l"TQ> Iqi!a|}ݯ1%C7w? ='I;b0vo-%^Mcs.˯BgÍ.梕{XF wf%!&5Qm:,Z\'vf+GJd!qC+ HYz:,;8Ow,eDۮ+ 8}>m5riCDt5D tm  &X,BݡR:= 'HnƓ_ :^[|lwk=()'=I.[ &˗s%K =A4(ڔo6 -QF;i`_+9-irC+-ɳsh\Đf$yRʷ8W1Z~ y9++U4ЖٰL'$@fuұ8-hQeD4,mc~ٙtTv9dS]WY9K9_<8\/+#̗\7qqOYc6XV/G lO0rQګK]U8i2Bl-W:N).\;wl25"X& 3 VƙIɹ.-[(U6|'@fIǸK:$٬YNȫM/iSN,>d .2ma[췸Db73q V$G\=jʆUr՞7o1fL%Q:Y;^CY8rg5U'/qsLٶoWy,[feŊ٨eEPi:n:n _>*OV[oE oYqyu8fܻJBNAib %DxPD%"RjWWkF]'/)dS5P8B?pn|q5_T]r4;maߴVxYpktl@ʝ3qY֗tyO 2 ^N5p>>!G+}{,Nܞ[%-Drwq7iQ٤uԟ ҿC໢xQK ]A Σz7Xj>e~v P5YVej5PC~e?`j?d,"iji0Þ 8Fʪ։_ui"g@ f)9^J FG^q,eӹnn 4ױ 8}hA2DJgMMmA$V%.Gm2q,̆er=!2@SĆ-r8 QF#WIlG:E1dC$uE?4 zV2Q6y`Z!띟.ˀe·d|+gWnH҃S^n\ՖVMHCw~h#[y<0^OԘ! qY`(MŊ\[ƋPہ oAmõKgۛFgҖٰL'$@~ya/JlѣwTfT5_ 5+}N 5(>>l(uɊs-xʒQ2벬aθo!t|덫F0tGBHl6K sʹS{9вߖ[+e*>Ge4Jfy e. 7"lO`\5'ˀB,f q?HHw}Ss5_-  m$}KbFb0ar՟40lvv1AN-l.ˀAm?v4\5QMSʛz* p32|(x7w,4~bMMS5No!It+1%HcVġqmǪDpX"qIC8jr5R-SOԻjߤt9-GVCOrS~*䋤ן3dJ?2؋%?0ʦw>)lj7| Ub8()8:Xf[#j=&7gW vs|,YOq&)Ne/KT8c ?0ln) 3!q[2UY`+nu\첎- Zk#9$hjY s:4 MA([Mu}1SǺvFRÑx|;P԰6m =2f#xmhp2j9ZS.p/x.(h0<=c]glPepcE;!Cae1_'9O!Ubzdm6JF [7\KjlX%W p=кo|R:5ct!oXfr2Xh*VU{dX乊ܙk1-.Xk[#'FfIsw7#E@SqҞ}v1Glk;?"2%WI3^ckjsD͓|e]7A R5םY_m Z D` tsMF>aRό`=2?}\SPj 9/OGXY9jgMԒT@y4IyN(*Z vF:n=kGw,XyݱivUp:9-Eɏ綵+]5̵j|Q7D6Xf 5 oKm(:ʲλ|'0e;(Clhd3@iX%^[|[\%|[Vo@e[|X-YIeݯƋq/T4j~laTІ `j;kWȽs24;*7igH;sjp@hEe=Wuz*&S-DEEe O.4 q]3_-O5eY8̄[E zvq4لRԤPqEl=>z(Hlж 2~P?VJq!E!%>R-9`\OH'7&+X-graN t;X%O Y%WM+:l*UэoP8cgbW?m =2<&S#栦8-;2ʆQԝ6-݆؋!{iH1Զ{G]iܡ,kcD"3nڜ!a3{̗0Q}\֨RL_3ezζHse[I\Mwugl(8CY\.ߪI}mLƜǡSWO*/h:`*v` )өϥ.B|kpɥB$ rԟ,N+st4ӏGit[޸{G )U6 8Yj&ФTY HCZ 4"Y#W8|k I,3x~4J:)& %'_2n:ftVٰJ 3BCJͳwԑNMbvS{2n)K}13չApK$;侟qzeKړDoGkV_ynMszJ׮ixκ?P5j_mgdtJe>ygҢ;],Nܬ9WX=Á Պo#hq[՘i`Ǔn2`GNԄ+1=KeϚ~D=h@ˈ>6i_˦Y5Zf27L *e8睢B=)7ZMU'-UUI]e cgZm[XQ+Ӑ@en)9no)3W0< E"P0".h^Wk/ ʡpt]e!< ׽õᆤhLvz|nQt7xfݚ^ʆUr՞sw҂# ߆)ԋ2L' w99\;̔Gش6U~U1ޠeyV2,{6zhjZ]jk2<3B!mΈBVicxLn,N_aT˕9$eQ&Çe̦F'8 %ev3?(g=Ɲ z7ЋB|,_/O0/N4>[ԃȏړWT%)yz:;j79Myzm{P;?]ԫim =2lhBfv] Ȃ+3ʻUόڲ~h7>bh7) rv5,A qW 3Ҩ;i`شs Ar PB$a2ຕ y0_S+rb#=e)j wUC-[uƽ~Ď+ i4+Iɛ^+7]az%E=%q5.ՋQn`cA)d8!M5nUf8.urV͑k+aGi*o_!.0+._*Ʌy 2aoyTPp|fWrӁs]ݿ7I:+#)ϋA ӫ˴F[2a"&7f#}r7bRx\(ծ|om\u' SWY U1~qt_rt"z\pTY05.cst$\N?=fmL#|̰:3nFځ|S̺@7圵 i1E~@LKq4^(FLWgzƭ w&Xn!ڐt աM)G~U6 8"$]b}2q`# /%(lXjÒ7|ƺE۵| 2{ 1 -q?=oFHଜ|p(q3+ )2 v(xJSI,kvj#Oĭ`8fm%n~wpgoc*G-CZk>)5C z ۷)aޗT1Wo';scNe\e#? 6׺aq՜4.1wIXUOScʡ_VٰJ 3\sZ3 Ì2Ot.a︕¡]׆`C9-wA̋b$ɺY2a,Nt6v25` ik{G!- I%X9>ql8T,\گ6 E( pm0z F iAPzp8_% v@.+$q,/ [ar/ Q ad0x`L̸i1O?こX;fMX7U7ā3&N5.M87"E heqnr(c8k 'G?]יF_}.#gtm =2N7l VqE?K2uJ -ʹ\w{[/f+H(,'*<3S)4;S(J#s5R3 I+*v-sܴ.Ğ2QJ4< Ml y@`0\m.'+M.a2)?0ʦnKqEFI9D0}%J֠Qjwi~` =2NuQv(:_wƝ;٣^8{=נ"“^r.-3cj:DG[e*y*O&/q8_hsS)eRnbڈ3 ,J 3{\>*(Wmq]kҨd/!]j*VU{dޟ+O0!"_E@"@Ur(XHaͅM17Q1W8\Խ앖 c7;|'kI&f+ԛf,;E|B @T|?zڊ.ˀe4K'kQHƲ=M MVٰJq2vl S~V'I=gC/pd4Õ^ҫ04EY#i/dCV<S45iYwqse.AZdPOٰL'$@fcafnq#hmE;wd)[OҎ:ɨ~lvؽ*Xр˺f޽$-ڵ 8\޲]9ㅋzKcu Uy7 UV 2S!2Ώ#^z#9!bqs0P8( Pxeۤ-a\OH̀K%_e)?Ae2N<: [lִQF;i`|p$``N(q8/&.]Yеe6,}OH̀ :RMN}Xa} MFRCYDѿWά1~mkםBfjaFnYB$[͚ R`;ūAB~&6r՝++ϯZw±uQ7[ףOm =2[O[]*+X*VA7j/'gr(] ̄=*jÒVZ\WY!s~` +_ p>f66 8_$ocH%y9c3ϽT8_|w3 , n v旴odTepC} wŅM!RDPAVJBU}2EA2s9g7rHUI*s=@e^c}}#6%{YWf|~/WpDB(G5.Zݨ dЖٰL'$@f3ē`uPZ{hilsY6?Fg K. 0a ^׺Jٵfl2Af;ѡ_×4ժ`j϶󞍄)\*ʂ3,,Wt#8  @"~&F`8C#bmKr*֔V!ΰA>Az6szB6`p/p?62#|A^Mh;j]*T:l{8猒CCS@GK34]/>~PeY7klU}jz2W ǫ_m=!o2'4x}.]Ԟ4. VgrHkp2@-Fe5VMgvޚF*ˀnxqfS`=Ī &QJddi29z=$ޘT#z$Mm3VHzpdP I tF mw>Gɥ~̺޵*I1J%+;P`졦ȑAx?evz.Sq2cߺ%CP{DeOGR6oU ٢̹S9߲]--јTYN8[ߌzNļ-iS@o0eAWTChMlQD[j5:kubg45-ʓEiptœؤ_ƅ6TB51epL)c4Ґ8I`Gb-hAei=6р]4"R,_e봗)\>aD,9 Fv0øAu2P`h3aS~9k ]/S._< n~{m zBd\_ D:g̀ Zn2CU'KI]SL ;ZG0g6rҬVgLKr0C}Uᒭӽu|ØʲO \Lu%&mqLZuWV fK,a{Bd*uƯˆu]W&]#co藓v8cUe+xíh*}ל4*F/ ̿"=&%f[5s:peo7 6Le >!mal\7>b4:U'?{_,d{<^1 7s?4i5XY Þ'X TSR2CڢzuY05mTjlX/>BpmI\O.UVVUsP0 {ax5n;CUY\L|3![0&l;r'q`hd3sESeY^] BW$F2mm( 2;i7L9 ır5jRnC+x){gݧ]#kK 63u(Zg{$7iu:)ˀf?:y [׍<^85]9#sG{bHٙ3"9 Wcug=+U%Fl}%?"2r|/KgM{%2()RnɯڙA\ T0ar՟40{#x`hX~敉f'3Dv[❽?SNܯe %SpiG}旀=xȭpڟ -8yxNQ'L`\'@fu܎!λoJkmT7 rHK@W{WVٰJ 3pMn !C>CYe@WFDZYyF M3G>[us \ BLDcYY""#Me #, kNʀ?/.Q0N--JwQ\ҿI*_s`nxD}\գN(['.ˀu巷?*a\u 8ފӸ;WCoo}PKdv]h,az@`ְiLuuZKsD>h(4i&m)ʨlj{v|]~w,3*Mw{&PHn<}(ˀ A9JNeY Q_%'Knx΁i+Ҥ2Ҧ\;2>޴H|\E|4;yƵfyj7'*mqh sJm2e(yNSGvj\*l%Q@ ;bJqaD._B֯;=[ X!Tv_mPcQ ߑwRVٰJ 3p\t;o)T\6eh4NU,վK]72r5^jfM2g/[z}}JI+DCN0Yp8`2(ĵu%Z, )I:~`eSyxj7CN㢠t:=Pji-cn;aZS Q@By4gmץ3%責a'$2Ua6YQD B%Ws]/(RٰL'JמhL/&ϙC6So57/7VVٰJ 3KÝ! 3gN2mmu6MU'wCS=W6pl uoo;O%` H|\Lky_[u'= oזˣqSmEW/j^]6p*ˀk Y&H(IN'.HoCnɶVH4 lY, ߖea!ЪR,#©oZݩƗ']a_|򑥭/. ?e ?0}|!PBBXC"NFZ8 kH[>(FSw`<П1WÕEު 8~}LZp ~?J]X87U4Zzb\/EDDiUf\G?!(З.ĘHrm7,xJ:NqPbiRᕥwBqUF,?=1N+I etW2d5ø5#lwb/\QTw4(;}b!vhƪ̾&3srIn" u"p 9H|dVFy W2IJ:XCӤ?H Vݸq{TY:WHB‰Ms tLSl?u,ǩN xmx2Pg5ڧqKK7t&iBxa0zP.qgb 26_$Mzo?qw댚J~Mn* < ܺ@&%39&d7O(ܨkS3f<9 '(sqP4(& $jQ+1],<+am'@ds*- .ukx@1ƦQrw潭5WϺW`;YAQp'e*!)u?3u2e aeC祋Ucѕ2PRo/䵣'V .] to3<òޠ1q| $&Gx1cۙ8{qE(f$L1ֹ5fOjs)efY6"jˆ~St `V^&A9ŴCt]Y7HnQ4yhobQ![Q vOAW Mqɐnf\iVm&Uµ_0q﹯_<çOݍH䓍F8n6j_G/}7ck2P8o.]&b4X<t<8-5m;.+ -$@ 1 ire7OaLߜ W;ZMYk59 xMAnEAn'A=5 ]wQ0PC𔯧Id$ϐq$rlcS}߼1}ReH,jt]V(⪽(́%M]LX4W5i{>ϫc>g.VZI# A[#M =1hļe7eUXaY<( o;vN}`@GG}ܼ^a퀼|K [I&UoYa@~\ ݁נSn{%`HyV\X[eQ#|9EJJުq^N4?кT׆n.B]@/~r p[6l= [ߑ&P|3J0' f| mf-k۸:_4U~ae5+BLa eq=($(tlEEq;Đc `&h ⪽($(SBF$puzj/MUncwLndakABIlWv&qC m;qqg29iu#Eir:2P8v>=`L,9XkswR 7Jp7q))O]S(ܰ|KϙgfcX(όu19: Y AWEA"ݧ<}FվGe/ XN~817soIST3ьhuQL}VGhg:+z5+>Ef$n)uZEi,):LRk[8'@YO"/Oe|RNYUO!DžGwyAGJHay(+ɊOU نaM<˩ 9ԷAxݩ $ #7vFe]IDz.EPN-.pqӥV3UneTSu `+UJDX_?o1S'ﴰòPuꋽƛCLe Pq!8-~'6f'I*I$v7 Sma(hW;vS{8PO>Oj:ma3,TY Of>?9oG\.8]į 0t_~hq;wϛ&+ьcgeK+0pz6H8yZr0[cOBK4ڎ'ݖ76%:(&oed@0Iu [͒@m]nc{jUq^NxBq Jg꛺q*#+ra2DnN?=&浡p QrPGvMFMS(h)ٝWo n*kO$&<{oh-ka2G˜$6t okq?)%뽱|7v<76nסcX">y:Uו.1kl5OQF@ zBQHP81H<Ɔ\F ͮBD(3hjFW従*F]OEA􄳷!>Hs.p߃Al7׾.QQ&4*c"?#8c1,鑈,ܘI봨Mephu`x|8Qd;,VQ 7fQΔ]v)8k)Cţ$ϵa+$eQb+O2{#6<@zMsi̭Foɞvٓl*S+8~ nLNɓ)F49g@ (?yvrr©,@wy2Pģ: RO(ԛЌ3ടL5U]*;&=yٓ+[\(zl>FO(ܰBZo&xUwo2Pv iKB!8n72;)B-i:"wJ"cp.㤥, E!S"Q3|,B+d9Bӈ؅ hWE@upQ[j;S '>bӹjMl?voQ5YxS' R]&HWh|@vD(rZ G747>ˡaN MA=Ot=r嶔V/>MvlNlg &eu,¿úF8(^º(Qڡ]{gbˆ;(ظQ6~0}ȋ>~"Ŋ3ohkqCS<)Z(I2S#Oep㳮*Udq[YpW!^mn'Xa{BQHP8SKĩ%2.NH<4riUq^NUtv>0{ԪQN_ɹb wXB,̱w_cWY>b 4QU4pߝVZa嫽(Kh#?oq>qrMepC Luu$`z9:2(%[~~=MǠ ^!&g6.&WV@f0Gq6f #UH;8Hh]ϗ-mN_VId4"+0fe9s i(rpb H4I&$ u &YMw}$c t؀v]%FL^J]vke/.dY̾|!DuߙS$pttGso,{hw -Lo5):Zkĥ $lT':"Ƒ74M>©u#K3]F` b룱n}"N 'naڰ/ .(.IE Qu(VdNfEZ 7S ZZJ %;Е脢Ug> "sb DEL0,c7ޔM"4ʹ }u}FOM†Mv'nkt[p)M}!A4RV8lqN-'zJjUX˓aԺSqFKA%ҙ^S0vkq\͉2PǙd Od|swgV qù˞zE u{%)]7~%e嫽(䋧jJdO[(O{qJZļ;fh|B=&-,'2)n\C?D=?BF =cH2>HId/,t.xF"q Qo^=a/ǚ+9<}ЯdShSP(ri{;ϠwEb5P(1K kgl͛ؼivʃ"ibKHdBep1XK OX};%W+YI9zNx9m̑}{xfNXaY<( ~H]UC,Np3ML6fGg!LgIrqRdӦS(Znmyu_wvq ;2}I*,'A@Q7S2P>hU)73C!_b*@ڼg9aЪ+S> C +I )=> Xߥ2PEEGj_ǮEP㳣&0n2P>HR1 !^.eO/l0,֯EShNn# N[[F߆X}ĥ]V ) •VGE k zk/,$EWֽ0F'5ҕa]^5_7ZF-8e5z2UpofYYO_|·92BE𯲂ڋ%r,p ̐ RP32{삡l)C~TjC^ht$JPrpw=K(<FshFE%Fg*,: G%(UŧH?ߢ\?~ rSU]ۮb))<ۇ1THVr K#O)p.6!b Z 7.;|q4Nepͧ$LD婚YfGI-boӻ(3O~!s`t?A2 GN4+oN"_/SOͷ31/ Ѫ2P8{4&W4|~d,6i^x>#N2BT2y-{,ꥡi޳OƁSGtFCf] '])a5ðx/  &wJ{̉X' "/m ⪽($(Զaj j0RDJJ#xщbr’x~ccϽk~Q +7Ig{k`59`5Nst$1,'q6Fn nXձV7Fj{-{昶чd)LzS(x"JlO~T GOjVXs{3:zP~P&usU9n bm㪹H(=ájHPD+7֕gI}<:#Q =J&M uT 9nGlK wJ01}c8e1O#٣Z0!W@J 9'-r^,I){mn[m,"45ϘFHxivu4ҤFha"1t# Nz*j//!0@Cpm)wVABn|j*koEcT?sNk׺@>f]c!rGN9sW J#ŭS "fT4r{K9";sn_ 퍱܉WpWV/'9eZBlLu{O(N[:\Ko?F.7)k(ܰȫQ 4KH_ۉ)禑8,n:G7G1^۲L Qk'm<:S)#U*+;Sj"qk7JDW꙯eu]>RR}qt A=^FX?b4 9ÍLnt|LqS(7P9ʼ9_J/[lqR5z ,w|umӁOfsCy=cjԹ7yެѫҍne aۥiX: [\cE:JӃ;iF(h@HktԀG=8b)jsyl%tw$!)%ؒN'NhD#ʻtfWv݂ -7H@gZ{fNa\}êx*/ Fݞ_:JUrkIrO ~)$bjVU{QHPu^qt pi|fjm{ {pO `yf4tJAM;/ S_vb;0^9Ľ**ڋB‰sKsɈQLF:|~bBCf%۫k(˒gZ"6%sgo} Jxx{:ō(+EeQ8ee g^˩4ぼuSf<.r\k(T{cݠCŠ\ ?%TENjlwZa)C+}n\y}䳵z{X`,ow/E(hsX }ϧͧ2P8<.)" (WN$TһrJs'}͕eIuI-s~wz8FKf\aO*&i#V=CM)pbb"FdAvTC0 =I [lY9y ز`Dw~sMWS(s &5O=ДsI=f$/|&ʙ_=2jcPe?'LaҬ.+ H 84c$uSJD")0bI((}|VxVL(J5v"^-ϾEQ}^; LBHVϲ̼Psޕ=q,[@15kiIu UQ"cm|'~t]Ŵ,}.,"-V ja4.1F g n6Mo3sw oIu?8;7EǀU޵)5R\ug;7H$* PO[KBr{d^?dPUWj~@+IP!;5(q OCK`&T'YWUb1b,Q*!3k"Rx@:]cWMd{ђOSv#ܗN#N"N"P(v M4l7MP"Q/Kz8H#-]GN(f"aZˍsu9Dep+` *E|P-e aZ~k0!%":HFHJ.Eo<;oN)`h@CiUoĀkOSTE(7]%N]~{U4I(u(E21|ǭѻ' xt\jO/Ac j>%XF#؞ _a*uU~2_%L"2F]'D<Ƶ,z~ܙ{(Ђ'vf8vf.; &D%p;)1'l N|Ԡ1KI:^#9Ia5mX<jcABуx Cg(}ŅLP!dbW k~j*NSnj_' v {6i#bJe^qX\2P8u {Ҡ9n4{"P!iR$%p75i֘Wܑe?279"@sJY?ّ:VZx";;=SMQFpuY#9qwg_eeaxj}GWb1Sk(den>#2~I}/nj,ݱOi>&p|}"ǝ&^Q '';$E"!!Rm[k?䟬 +;zV{%󀢀 arŔ]5Wct#Qfw}MwͼW7gݸu^AC Q{Es2P8aZ Ÿse`8"}Df-Զ'2P52P}yD"Pkh;O-0L]'6\ nԵ^{Y>gI4㛅N K%&%a eq=($(6jbm\F`84;a{s dSHypaZ+ڋB5o:״(zHy3H`)r'i eq=($(n[n)c-GO+թ*a\d*D?JkL`XPq+7egO* N=_`PV^fcV#0 I}8BBkO!/MeV6*āD[4|[?evVf:*\,OfH1M;|-;wI <>#֋|8.w1~E0RMfذHo{/&AViU:כLwˑ[zL]@ъuѪk_7E+V5$jΣu=^0i(1X>Da{%5o{mAt~&uRzj7I}n}g"/UF4D9SNcF~ep|AKn͚nN.K(3a]H)( KB\9o\v`XB _D`z{F71;G/;"HOtz"a`Q #F=E}f_Z|Q:"$vj(׹lW] "|q\YDwI?-Q >Sêj/ '~ǙW([d 5A|5r #j MzeSlv4%YrWR*|N*)@VBTvP&7%b&8X*ʋ-5т~pɓGm=q;zZ Sa@F :h; "P(z^Io b[d(/r r7rP#&%=(92o[oJW zBQHPy;Ggyr:BC#&GƒO꾅QtL9!SQ@P0:;qT.Nk(ڕΖ2-sÈZ@aLXD%wsvtٯpOQ 7|Լ}hyG?25uHRpZj[wiUQWo=D(1nmm8Gie]Hscsd=@FQsު$hؤie@x7x 6~>5 #4Qy?)%ZȜ0mT\u cNi^[ -))VxF`.  g]s[k,sL(OEK[WE!mFJ`Zޔ6jrDMبe +0p뜀:#NsO]Dx#@Gւ7OԨ C 5 "eD4(&$"dh>Y 7Fƪ@`1۰Lixn.Y 7Fqpr. !@xN'bp#yD݌ aA=,\0/ w륲q-//+'E4h\UDcM$6)u77*Mb/nM˭h Ga> E(%u&9Dw2c?HsR~T SnL+mS;G4# *f2P1W<4 TT 8?zq~Hsx2Pۮ7GӦ2ދT0*Chnxa_g$ -7xB 3a+FnAh ӱf.߼k6G#;Cb2&Jk(>U亐?@NϠ7K~,ϡN6,YPy\Czx){A&9^p]}S(ܘSK-h3Mep+=2a#;dMmJ#s0:g2P" U; /Lf  LS6;Pi9i E!A׎}Lx!MKT ,%KJH_1wIY9B‰'gѺ H0;84)&3h Nڃ'LJ hH`l NGŤX`cir=Gl՚yA,:<[GVgD3I(_/IwIWb]KDALsڝ1z1tOJTDA-%@WEAo5J 8j1ap Q˼ȩZ&{qL :F2;tܣo ~Se>,^o筷̐Ky7{w GUQD x-SjӅ$k螒CV̸(ngJ%, E!\~ EϮ(C{b-s #3 ߗf#9%}owoZc]@D9odN~o}gNp(8i~ {Qt/pؓ}+%"pMMW+)}alj'ep͊dEui܌ s(#[ch= 6E(Ou_$0A3NӴ˞@3T>O@Zz5Q\]ukk1 &:eY\O( 'T_wv^Q6>⦞o oQ__@}rhݫiQ 7:ʙۭG[@ڢq. cu DBS .6Н&M։ҭcb "`o:mϑ>1}Q ֋wqL(z?g';MSR _lS_A#8^|--b J?Oev o+ΗO"<z6KQa{򴆽s1:4b Nwh⩺HHTeF_ EH)t >\_% #0`}R}A\MyB%OaGfNLCњ3¬o|O0YnXejXb=m;J+0|!ܬ𜜮>)_mQ˭( mvGSjQ:='6-G[XďMR MHOߋVyX*+pzǶKnY.;0Nzڥ=EP}!;7v,!1Sc ~. ]}Q0XAh{v:0i⫷0P y bE0f$oYO|$K\p% #0`m

t_LYqƓ}~$*ڋB9 !;A-XuĎԻeO+0p;T܊BVsb8+rJ#]`>t{hZ8j?\\1jb8[(H:ʔ Mt#&{j[gg!&T駠p( N.ZwI#qAm?#<\81ѰE(N-쨝2z (-R0:<s\Vڛ#^挈8#lQ6gx&˷<._|SJH7eѯ`Egccx& KB­g9gz}w1 7sHbflWg&bǶ91N"E:u3eOep/˙yVO$x JCR ޛeuH{m`XBi&֥BO Z@җE+%O%ijVfP"e?wVt}c[ZaU\9}FȎ~&BQ` j*ڋBµQ;^xTABWIȌ5_e9j/ iG! 9j16m]{998zvh)"uT'I:qQ*Prm%RRNO&퇡C{l+RH[.R =idPlgGK ʟuf^:]I %uu;4LW ipK#Fn՜ ⩻( (X eXFc].3,kNF|u to?gi|G16bw#VYym%Ҏݝ́C5U9/2P8*يXv"hmtJMƅG3#v/ yҌJot*,,'[?~='dKepχ F[ΦzMq SpӢp?V'>epmUZ[9@A>L? [{'c_9ݜ/\B:CZ '{V%;;5Q4!",ߢ~nt sfR59~yCJ3Yl]>9la12mZ<针ϖ*ƁNzD6ոfcڰx/|02ˠQf}h]g\9KTG8 frЭh詔ǵSSW{t|h XŰ;TkJA-_(`tŁ2+ϑN4:^Uqܐ7֞0ǴIK0, E!AG@>h V sMԾGjz RGuҦt(oQ.@H*=JtJZ=~A&H7EJ8;=Θz4md:TEm]vb⎐zGh#2P&_ZD=͑dJg أ(,=($(wSgoZrRA>dd~) ,UhnU蠑yȌ4Z2P8R1fd+K\Z@IdՓBD(< zT鋃_krޟ3j$B@! `9#tD8j7v=Rgfx.4=E}bjnB+{pdeJ}Ƴ!h⪿H (lJ8:-ѣE(uP7GHu d[}"3m̜Ԉ2y'=XF 7tӿUO0Zhكm "tCKU Da)lj*8pEb-14ٻG?FD4@)Juݧ2P8؂v+ļ'.M0 HZaY\O( tT9qwV>VecH0]`83ob8`+&ՏsKDW1(1&whjU[)-"qGMY XR(Z">o=>O)=z*S}F{KTһ/Wܿk3nD ~81XIך+S[V`XWE!A֕ҧg/+.GG\EWVp9}hN 0~`FG;eh[YVʋWFFp1s׾/;6~ ũ H=B‘I19 =tɇm. ϫ;0y2P1\PP;^&.= J*soa0k?6s?B]{,{Y ӽ:tfΆa-<wWQEO]S(ϸY%kȞGm>~_mpa0{@jluf8^2IHx1*AM$p*luaت2P82'mybI'L}X ,h,I "-"FD$-F!B D(Zi&F>hlLo+eQ*|uMepy9&e vb- 9w߷d-ة45~?;Not: R!Np \Mñs6U6\*GeKe y`gzHP,f{PsE-KEH--FZaU< Fxii5a&6eލv#0ս 3,5|Sc e_eV H0UqpwfwgBVH7P}v5r}7UnZ+QXaY<( ?<0L^8nvCvIEf:Xھm~VU{QHPՋz“IYε8 N."bP)%*xߒc|V(*aXU)ꌝdI8}j`#F^HE1Q4ЦIJWڷZשܖ]`|tGdOr6kW%sHsN:m",$ p. -,'ӍC1tTP_a-/Ak\X'm6*m|@1g{5EQf Ե3nvQ\ sLB1W.(3R8wlFw ⪽($(# zDZt7Xmjb1o8)F EwSSj .H6Q ׼BrqEj$we j[@>Ō{\̡sFQu K(&&סCmGC}m,O8R *O|}ڡ86kQ˗`XB-_~:ړ>q]S'y@Z E pme(Ngςw epkт}szephJexFd%K!dQ,ǹ$(H-Jh9O'j"ٿB֩kܾ&֏L=" HbFA6rU]$$JO7gh'iEٞns|y⨈˹QDWiKw@ڑZ:Ƭ^v{0>..pA/jyr q;o=Lj:8B m4SvlAϓ<] VmJ{+w>[-[dEPLm-[2P8+ʭWM,W:2clӶu*kk†̕ĝ`۬ce cΚc0aX<Ӄn''k zFMӠb_8Ofo.]M/aU}8([_dO8]Ma" @†g|E7m;+>n#W!E4YòPnuE~Y))o.xk(:pb(keI1Gך5!+ȕDtأ3{we Y '#u"Tv"Mޘ&i iHXaY<( 8*Zr#RksSNQr+*@k#ZtрV]w)OHh\n2P8T}C7&ceIu7B-bmg1ʋCck]z>S %'P=V_Cdܩ|7>!l~,<%󀢀 a>_32=OѬ88д1]M< 8 IHDoA+uFFVv`X-mS?|˱[HA׮6ؓA'n٧{Y GV~@FxW UagE L!3-F C4+ϥR G|G 3 s%N.QِSI~4EB9ĥ/%epqW5_=yQ CCSrin?ùZQaxzF~sw UQfg ߟȑ7̭P( $]u;9c rNJ$&JaL zBQHP8$)5 OB #Q1]v䣧2ۣ/CuOFg*KlG*;h"?CS'sږ*dL< )ŇiR}M?=ViV_e]487:no3\z:Tf'u֏vE{bN<BH{fūt\yvM"f zBQHP#f 程scX`zbUs8Pjs8 c‒y(X.+c޶fw߼]牦y4ζ"P,ܯII]Ӣ1Aokui2H[4!v}Oe`_S9hߡ^yjUvjSZzrs76'66gzS+d.g\yft+-,Y $j6wdNwWk}{i S~׳mnÕ)N|"-,'[KL kOq^^Q ~̯7 K0,}O( ׎^}-juQwC/sȺg.s{<DOF'e=6oO޳DJ]5ʿԨH"mHj7}ep}qlK4#+%gux Da_ ]wQ0Ph}Ϙ Yf{Q0w^b0sEڍ :7bGnn ԺEf[j1h0c&]m<,"gKT 'Nu=՛ uѻuUu,mq.FR6%BuM=Lp!Oc1e ws‘I-G0 tFV`XWE!Ayc(#<#W쮨Q٦hļsmYƍ׭J R"Y%y$ld6Y~',r_>'O:W;8p+2B{ fuwGoÙƸZ@h!_kkN7U]k-O-G>EP;WLF+Z,\ Mǯm~,Lsx 4g廖s1>6؟.v0I4ephY0c<]ΐe6k=!ݼhUw וVF~/C^K>! CEx >JgUP<8[-~aus@H"^DNٍ#*+0pDOxۜ>9}8j7c~Gڑ7BFdSlADg B72-u'aUq^n\*]]6vGHJ}[78 ޒ&xIK0, E!At,s+iݕ5ݯ+]S9ăm`Sy=;ݟ؋B^Դg]uj8Xl׽~Þd3wG{{dK+0UwQ8+B3Qo5_T+͑W#FUw@P0=r\Vز #v u%󀢀 a,<=wn*&_^e-_~)NOZVYB;1GyM|Nɘ34[iUq^GD7=7+Z0zvJ+0|k콲S2sy,rnVU{QHP8sδ5svN;OŐ֓89n|ʇY,W‘ ~;@T,H#FUw@Pa7יg̈A(ڃUQUV/䕎MKs~-2q/Z}ޟ޿*⪽($-*08ϋRj_)`}@=JG`IUz/>i'NCf@6r'Iw#\2Pћ3G EHXfClV-=p|9;=&O.va/͏VVGdcS(z$u"Sf>\)KyÕ;MoB#f{:2V3651M1M<8nMwi_=Ժb* &Ez񄢐/-Lq vaUq^nuH"ug~##㝚*q52P8LJNai^NޗQz17yX?d eq=($(@kky"#,k(ei1[1kQf z輖9>+~"n Sw3y7W"േ-z1i={(_:Ь4@n[>Bu500!3gx ps/ tpad{YyLl Cӝ(/ ԜUGjHf辛i5m䫻HM5gx_kvD:g "9q1^;ͥVU{QHPu˘*ez ӹSlT~n՗%-KfwJE+} "1h6sD":;4z?aoZz5=ލe.8T8% hd#+0tp/x~E'/吿a調( ()9F=IJYL,Lt Ny>ȠZa._rjҠIYuJ؅| u֚2X>xwԁBZj/ lxmy}S_n|RY3D*. +futx ` ӵIEPE 9>٢DuI\ZXaY\O( _Djil# ҲPL܇aQ137Em*{w!G9a3YS 5~mH?+#)\-_<'Bß4f>Rސ 8.@~}`\3%t.J&E5 3J,jd FxBzUxU6F`k~m  zP_N9Kp[.?ͧx>*Q؋2PnuLO tkxJ_Ywu~DIZp5N1F^ib eq=($(nf|ڡVݷgj(waiۍNogZq꾛ywOR@cRqD a|9a0Xc)4Sw5N}V6+1GSy:G$N=Q^2燾ӳ&zf-y"T åqYfHp\l!COXXaU\0ShoE6rQ!T +0|μȲb=\A,i5+0:f'oep^MCJ?HM[SH԰_74yq*>Uj-8mRcFTM.S.⬊#bޯјw 4mX\ Wrv_w-{߫]ξڋH+2UiD|̆Wg[[`/^41#ñO)c3$Qp ?3@6-e((B۠TԜD9T듨=epܠslnIm#XcC1(f"`b%T4ٳ8Z{ |~JlߜڞkG_[0@V DlKg<őһ#T]z>}P^0)\viLFR ['wJk01N>FǠmZ8i [eT#&l$N6a;ՁjDNBt<-7|u< 4ltEg %t6V(nuc7٧[pZͩ GBq F^TqŷZr l;͑szB>c%-bDNs0x@x(p7i k(ܰ 7[aug ;_u o̷+ :x[0ҫ*J$b_SX~ +vƮiRv S(ܰZ@$$_IJ4bt2a ?Hy+_aԦ "tQa>y3 {"گp`epe#{T ''&fΎBl`/)0rEG1ޔUq2vG|Bs;]q`X@ƴ]:3)">ȭE AcP7eӠEL@Īwy;2P8yxq'mƋƛ1iX<[;O5[l[}cc(@yxbM–dr̆J4Nznx}: zBQHP8חNZ7zտR=IZaU\[=3H[(Oξ o)]/ (xd(JYB­D8r9G` ٔ>F\3Sq'1Qw M3Tx>xq>@ݖxaa_l+?rz(o%!.pp &0cv C:!=3:c^p wE`ŬMⓜq|t|8?h9Tv 7-5MX, e%x\Zո $YIhy9ygBwy1+.C[VWB*kV;{XƬN3ϱ^(kM˸zB߀AuF@FXai^n'|lx {7UV` ;j/\t1㗣ܷF#ꛔ4mT\u FެB O)T{m㪹H(::Γ3~5"P(HI ڐ`XB9G-~X}[:V[gD.R-Es'ϙ4g^8g"qѧXeU<49qK5jeu(4\MOƩ"odPSpun+ ve``hmQd IHAҘ/+R`SH+u{j /^r9:Ǎn o/%{ T3lq-@b6$VnFcW>wq,[UЎc,W|%Tyc;ȗxzGH ~zqX60.'ߒŒ0 A2S)V1ˉwn){L7,$p>J5+Ug#A|@H1\DEќCbqq}s" ɕ7(e3!/<^V06a_yֶA7Dm3AU97-ӸNWt{w+ֻtVM*/՞ Nu@\xs:bs.#OIۅ =(Uٯ/Zx9 F@7AvkuuB84oK O$b9_1)>PAa,D4cU(&LU&;"*/՞ Nm0o4'<̧͝ wZe0-8?TFק_0G7Fyxk(#3O$veҋ]!t$bikyxoIC$z{qJіX곁 {kqo󄷃}."_ivWW||ѧ;Y:=:4{"#ssC2Ұ֛CUq^a5Nu 7eE9F ئCxTKOIb.ˍzvZeF.hum'~H6( nͼ欦^JA QUdPj+rJI7&|Bh֗]885n/|Ϯ;2KY{` [ePAE&w鈷 XLʊT{6H2zTUNmJXCDmJ> ߃c}-]51Z$,B'(HxȥClXì|ʤR["ҠFDjT).z<>;UFW)wK{_)+Ő:N1?%HUlr83#Vಡ;`nE߈v ~dr:aUqfs 0u.ԖdfCӆ,}'2OOYXYvLq踹 C|j%i:.jfS@ЇͼWð);735\nxC4͒ O؈-^j}a^zYaEAl?Gw ȩAd1΄h*xP߮gzH2bv1nF/TԩX{oAMӬ:zu- Uq7WnX{^?.tp(ggԖX'd$S3}!T R*_7@i]F)ko.ēVJU>}6_>4zi%9y T\*_rUicTq4U"2n2ɑ{yV~vUedpFmP: edAy|n %u߹ J\pKQC8dtڭq PHO=Z+5 .K]ƼPP22DM@POl2lx qGt31\Y`<\x*/sf '?}>P;g~Ghcc_[1È2:v ^Yc 1bb k ,Ģ M-)n^gƠYc'9fK5wNi3eiy޻dl)I_JGe>uۮZJOeQ`ɐ|-bVS+y?=J~}ٮBRUm q ZE[G 0*7m!!9ü JC -mn]I%al}ALwx(=} Xz pLʞ }䠏eSŒ YƑA- ]>JyF{S̡,s'{RH*+{՚wȱKg$Sdъ 5Zj3cT{6H{aiH}9=}$ ;$H|8C\Sn6jSPF[A\E>fqKn693B?˼=v/}n}u~ aWz,3l]CqXLJ/q Ɛ _} !VEdPO8<%fhm92ϭ]Fܭ$ Msݽ)zjC\Ԡ\ιN{22Ķ)_Vŭw:/y4In4Tëz[ r#\'b} صb ʐüR6@20SVĪ\ Xq=B[Д9Vڰ=$j}@0G #Ledp 3F*ʢ[g:a,ɱKOIW71qM &N.#۬d 7-#ЙAv|6m;Y i 6~}x> 7wC\ʷ(PѪ"_:*#[j$vTb.-g->||'dO#uT1>>?gˉh^\6qЊͽyl]ώ ~A-" !Lϭ{1^\8ʢ])-ex,wbvA,QkdA0V\ sp r_ٗ[wGIđPM_mt/풂+Tjܱ4W\Da7r._Jy,L_,0.vb~ntF%W)I@;VXڳA9.݌s+3<_[Cc1+ָ;äbhSW^Wy<;T.3h>X"^I<1K3fb ŀk4]DYzFl~QAA^=%؜c~Ð.3g IN!]Wɱj ?Cc\'ewTȠX?eC8; >Zj,'N %9y ~QP=1S,]_px:ʙ/ e:'++rJIÔs.M`TnIb.#k$!xM? װ|(\2DCf-}VU}zg.4l@K~Uw;Zc_kE#礬ccN},C?Hj]BX l?s\tJ4'I#u|ED ^k7x"Ҡ [{~ޟ,m~ ήhѨ%o)?6)22hGu`eJ*v Qa-Aǘ#tCJ;ݡM w׿奺Uo\b**{[J̸qqΩƤWJ̩屺N5RtUI_> 73BX ',Qʰ*ȱKg$+YVzI4yUχ̻=^{~0Ec]."YɄw&ڛlt|3m&} 9J .8Nqǐ̀^eξgqYE3.d:s_f B"' 5 gφd GeַY5/Nis+E* g ,1ʐüR6@2c Ciq gq8H6YݐNedp}s;v9 `K]C"o)ɸb;2*_q|Ix;5Kg $ (O;edp #+3Rr&ҿ[;8I6RFL.*'nK#x|N!Vޤx0 {l^_ujL$YK္&F啺u9hr.+ԁjl~K9C%:G v;N=*g8NnhfXnɰS3]9TEgm\~&?{Pf*uzgOVm^#~9n$ e)ug}}Ɓ nǗ^1"-i&}95ruYܬr)my,X5oJ7 -d Ccų6YqVmJFȱKg${`NnЅgEsm:fV^v9))sHyoYϿj?*+|=ErQ=v}H>o`{i9ڊRy6@0=Ya;@lI;I YPq0Ҡ HsU7gڳAV[!_t!(ׁ{:hC&/՜ j0XtsDg[9uOȍ}X0Q Rp(-&pdAcЖX'd$sZF^Dq!??20ٷ|/'w, CiXWCgS 8 m}v1 CőO4 .'YΧ228|I\_-~_IKg$}@^i9=PVMY>!C!k[ TGD֏MST tjxaw\228i}ecvdbs\md {?n(T}w_޽hXtLR6 MY ~uj'Lz)", ]'].#{Z _0DHz٨{} VBd&.20n0,i:,fԬ(%qJҗhqUk*#e߯lƏ:IݑStr̨ʐüP}68ҨiW;ɲ%+>t~*" ]퐉&ӄ'/BW P3^J ^-z wedpz!"T3 h(ЭB228$ #;*!4edp+Z0 (9JSn22j\"0#:oN;}b6.{_n>2r))jfʒyk"vmW-6T|ՒV?OqAȠz[@O<0H"2(ׄoSᭆU?*# T?Ct8BTiX0HB6ۗ9k7ઓ/qsf<$!;SdMQ?ΛX<> +gM Zia9 ?-} qcMZ!~?jn>\~0`Yim!p"xU Moɠjϳ.m\r)qfk%^ɟN{݋o I"]mAE++rR f4f+/O~=+Thݵj%&_ZFܼ Ge: |/L XH4_MGWE f)um>J /IqIhr+GB9l?[\-ǒXYR}y u|}3lIFu7OJ}R8~Lţ(] \9kKr,מ \Qֿd[C/?VG߱2_tת笠3a;]BGmF.E8z)q Ou!hVc5w>#>e?q@k@.sq VR ڃyHz=Al)#khknZ.v:s n)"b^=ۓ5e$3N;hUJ*mwleIo |({;$r; rJun3]ZԑƟrkG҅'WGw&]s̰Ε[캥ŮP[wҪXFZ:\W:&KM>WYgyD!ja Ud RYv昐{-Șƀ*q1rs)#ߚ#U3ޒWUBY}L,]$[4c0Mm\(O>W%}z3ٔheHOikt_iX"2訋լ ֚*#HutW<:k22ִ1|HC~]NY9}Z=!$WaG.K9*iY5GmF=+1 UgtH"^u l$N\'j!=w p(DCoo6N^ln;Vu_<.#-q]bв u KClJN&\Wz|U#!ge"yevPa-nMR?6_/C{F&zis7D6wTedpb^2bu䅴.q23Iїnfl,w񌲽r9F/+a-9җWX{.$هPF??ϣ~C\|㸱sSV㖘PȣRedp?wyS +BPD;M:QO[c ppq̧v.ﵻs;"+˲Ie4@[G2ǽn!>?PW[c G2A};3>1Z؋*#9vF~',t DL<[c,ɱtnA1<vNntJ:A R6s}[cmD l7ug #۟XavvsDR5Sedp/gn, U7D^ԥXN?kz$r Vz2apՎW3=b(/՝5Oʴ/otYHKM"2(%80˲(aS.#c+a.qZLesCAe$b_ WYUedp9 6{!aނu\kzW_oYOÊwVq$2/=!$D[SdRqKwWedpKmvye.ޣ&GuC+n NԑNͯ]a(sP^q%rܠSbIk{^r Uʐޯ/.OiPf3Pwt.iL^r?v%"n&csc$@P u}hg' H]Y,Ԛ5|VN.2u1k̾.Ƞ!Ê.6V5Zq_fydol!vmO\FWeR:!J瑋ƒp:XzV'%.ْ˼ldpuqaH]oIO+߳˹hpmWGxx9m1Ԅ?9-sJ.S1E =޵˟nYH\OOFvkf_;)#b?mG!'"nb|RN$&cȱKg${x| XeBݩ++rR VGUŖ"|>}ء ~Wb@Jww%gL#O]F!Ib0T\Q!ԏI X\AzDj?i/й2Ұ ɼA0/"Ƅ͸rdJh)x!F=ْK/>!䏼|s&Fڤg +5DfaHX607[cjI7u8r?]io~;]99gLb~,|Ƿp0^Άd RY7>\UqUx{[TKIP>F86يT{6H2yZAbX]EbIiv;cGU7 ߼3%=*C 078$ʥH~\AL<W| (~:uyG6!N '9F4 ٍ)%UFWK7KwaZC~p@' q(͊]ޚˎ^RgC]Cܯta2 ^]l]Pi*+b++OȎ$|:^׉CˋXY+&+OȎ̉zvb?R-Y\D$ա!q(M7uֲS^PF+D) Cp^C.l38~/hv+͍;61%9'dy%1%e&K'1hUu==Ņ3Lo`•TТupRd d^$锵9V֞ w>9;*)놰Bu0+ViJ>$yxv#$rIowd O~ڒ>$EyS S A;Lzy*_q]F7?n[ي+?yDמ WH*V?|F(楻zcwyi]_W8z?O>ɧt܍IF K oos뿋+9 7JI8?@{ UFVdfdȾ̝s0b8o!fYM0]4eIe^zB6H28a&$ }ZLO~oeaYvY΢c92sSsdܶI\cDn# s%4+.8Ykv:5G}C!cɫé΂FqĮj؟=5rhBh{P`3h`;ySJޔqwḴ@wb9Wmd6YqP}ZͰinf)8%rl4?/g#G&` KH՟5 G7QJ]k)\UDEU1}ѧ-9Vyldpzxb#\{7ĵTsn228~Jи>71a6 Vl9!C+{)I"Ş~‚L>crlIe^zB6H2n5Ky/eY2Vkg$_(uBV nh3KW&c_Ն-k4|h2щg"2(yP"nUBW;CL0@XRP`S@W @= ?u;|ઌ4L|[QsHLJ5Mcݍz r!"%2i"FNY֔JkuBk3,,3fx ъ牓HCyzݸkm[9 @5`Yd2{ d(/՝5 lBWB[s _(g]F'G-G*Be}珟Amu=ncFB~F=8ǻْ˵'d$SC.{[~ )ǖUn1 .A.5y@XX/8 p/]FWa&džEH78$Uܳ'uQWiedp7N ^yNj[[ edp)}Nt);?Ke|B=JZ-6s}wg:j2iZ-ɱKOI7/Y>2KZ&ߑ?dڒ.ߺ),22රj/+P@zUuSDԇe8݄ |cC\L/۳w]:r,WWjRm}w20΁X[cldp@og^dR-\w1:+i|OsotXɇ+g~9xgOOԯêwmW0&T)-X*gn9VyldpSr$GizS|pe$mG QI͎GfK.Mݨsݢw`"2>%ߒM5|5qWwi42Bm~tFlf2SmvReauu4xe\zǖ<WZLNېPICZ*# DZ-".l&RsT7b#\S^즉PB[e`soӆ22~6~ӘwM{,!օw&߯U22O|gIVǻ?9[~p~4I#i\k-h^2p[c}Bs$!<<.a𮼺4L[b/ƒ-s,[iD--qJK%f89,.rEq+Z0pVHVbZ 7,ʡ]mZJe-ɱKOI7u&U'9IN +kir̪ٵQ{ CS t?"q"qEϖX'd$S>4dWAc%6"q|Z"*/՞ N%Vd5ź]% >o9TL X7b /5@MI1!Whs*# 8ٛtؤrdP@+ؒo{ܰ"3l)Kr,A-$ޥJ ~7ܧMt͹VXڳA'!pg`4 ^6qRA5Kug $UGGnSD:H)#?d:BHuV!9yld`w` ?qXfì:wQCl쩖)mPĮG׾5\F' A82>$gr >Au3SF}ٷ7WNNɞx|G:=/3K%:]m5WڊT{6H2) 8*Q3W]nUwPwϕ纯S,]oT8K( ,T 0VyldpΓzk8NT*zVfW$!E7)(6:0~8R#!iB l)O.Kqq޸>v2[c vE=$~׼J NˬXj銶q\,if|9ېYy|qo%sژ1q1C{nʈQ^:ki|r~$7 "2(<&oմWXO228}낤yQ~HW rUڒ˼l~"Ԡ@Nr|-.#cSlS!NYS (GtFS\cPx׺Xk73~[5F%ژ#J]>\]Fossb,;H\By(}3s?Rqʒ˼ldp?AwN-ph)>G-üc}[yTVXڳA V'bJ2Ұޱ]f =j(# 50K)" ƂQ:p~ǽBo.cE!&հ.#cןQY2#\]+uڢc 9&ȼr% L8t!,*ù N[c n('3@0F쁳 ]nB0#9ÉDȮBpӨ-ɱKOI751aQ^RzUf^V3>:?OJU>xۿx:JS(s c)# 3l14~ 8*. ~ͰU58yNBb"2{ioǽ{GoqR>$DW UFןZ<.KlKTTL̚[vuI`.'&^tlx&PHHJW*nv$:GʈQ^;k i,#-Asqo8j%(hJxܹw:0ʛOMCvl:&ƈ!P!6 "M,I/--xv?)d[Lc 89^[f!W]|eg%ZyB^AvR|ɿv-0AVr}'[)-}<{~z_ Jܚֶ/${{cc޸1ʍkvMAp*O["D!YüT@20C -qu?YDKe6!weY69Vyldp;q\$]5ø;ή:j P dVXڳAq.QE,bUdMPoY6T6*Ò,ZB"J!z(Gi`˿p-RncƵGeRe>O]*Fp9'V٣U/٫:kz336#_ڳQwPA%z+ WGZmuM"eӴd\.w}\^'cjm{^֓cS;1ĬX'nD22'6cڶlo NzպsM2}`7"ϸe<.ܥr<p`׿nSV}g9 Zd3\ÿͷp7.eٸ}gI^ŻFx$2/=!$s![6^LG#5Ekfγ!y+/RrD"<웹DW67^<57oʾou"`cT, Nֱ}~&9L 'NSJlmQ8q7Mw=OR~N% ('$gmK ITޭjUY*#k]jw(\ PC{tп@V_~E[-^h{U.\|?&op$>=d(#{z.BKj QedpˎpVd mh4y9.8+cq6t+;Exq3SmH*DV5V>J.Mdͳ3U^ &%UU2B2 +Tsv$cc(G9QӟeaWzS%R2;BG}ػ8'b~|X89Vylas}%"2Η@->S%nٳY#GV5ՀzvQp|4USVgfzWR`pJmSB`oX>6&ߨ9bX MYc ג ?*I)]|6وRw6@2y}9t#WcXBؙ$PLXx su\u-ʿW'[^pH|(xeIe^zB6H2!p9qx."|oU}{YVum^'K lIe^zB6H28.pPF}|_U^{L=#/m-W5\ꁩ\N{]OCf.p}]>IV ݄̝GlT eIe^zB6H28h'.GꡂŬ!٢UT9\&4X;ԫ2Ұ9~ 6^#A96zpǩcIe^zB6H2yK|Uq1(\_}c c)z~⾜+'e<}" U<7 ~·4FAIoYwe!q_IH"/hFlpM2$kHbگ-K,k_mCAnmڮܻ(e []1 rc228~{& R&& b]a'FӎȠm6Os.'H?ڞk(#z|3ȶu*)~u,/վ1zxMʥ miR ;1/68Dq,:8 hP‘-eY.>H"ʋgp$2a_t+ ^+ӭ22(WVE,1+Oww"<\܂U-5G >zacxR2 IH#P4V\W0C5ϕkQO-cl>wW Kb<$4=I eOU$t/6"kH&?bϸZaU5D7ZMrBV±չ3rV9x+*h \0"}[u"_du??:^{q.3!:k+rR 9FC8b0/tbGŶe" y 69VyldpJU~Z RKC&.XcTy6@06>"6%A{&lk2"hlpQlc P$hN'Ԉ?_Ƨ}9Vkg$(H|/-ﶏ綄u@"2(5+Jhpnl;冣'Fnf3yd`̵OR3}h6@j@U6V˪ Ib=xaNTf7-cSedp99 %pf4-%Pyz@%}GKv%i|p_l!1SFZ:gnx,|N))~H/&H% i8)Kr,C4!t76j]?tÂIw:Tf$kPדFp jvrX^:vod.# Sʺ+dD2C4p]T`lA9)^O9AL,Grf}`C㠵ղsXAIHۑKg#; X Gd*+h|cwPF׭0I~V1t 1{V Y8jnU\J_xQj|P͌edpjb* EL(ϟ$\*boFG$2/=!$:a :'b.KH@‡ʛz\edp}V/OB&T\{%88qk(#7M:ĨŻz7#ly>< 5F TF׻P:%,u6*q_ܕKr,מ nGXEҮ]esD騬|?56R{ⵄ})%̌@ꅡ6\VN-[ QpeSS*&&yެad@'MCWb( }WBojN* I!+3^}L mI 5o6Xy6xBL]{\ZIR|qHxG|t]/%4j%h"_~-|܆{Lz = PF$@Zve.~dG.Ԟ5 jpwm󗦕5s;gb22z rT.u[ 5?v+Ahr)Irkŕ%9y T\}D2}ʌwQlnW"mM=RŞ"?Z *#9?KS]j(2vcu("Bݸ$2/=!$tBa 8dŵh^!漤ۤ ejYL!+6~V%M >P Gm.'bH7mIe^y@6@Ұe*g:Ku 9q8}񹴋lsX_NvsͶ|`bt(#tSY(JXHTnq+3^rїiu&WѦqpWcG5gَ7X^CuK9-|w9o_W $egOYc [ᔑFQʊT{6H2 @PND̲Wv`yHlR%Yǐq`Kg J/Ci{bGJ,!)Uj2H[BJ^jRG2YhDb.K:F+Fyd`*OنO{Sƽ!]vF TX=!$Wu>#*2Y)# d"-{`6hI3 [ju4#( H[{iOLc񃈝 5$LݶQnkkze.v8F~]mm9gB]#E7>ccNT_c.ԝU[XK/vQ>yUy奺ɏ(G+ t{{(/1k-}nv7)KT'{y˱!kWiNaGIlj2"*T 4lF =Bm.#[6]۶W @XT'&$[Gi"X۱R/b2i*Tћ-;1mE{Ulj_;d'E#7[&S&[wj۽ǩS edp]nmpRbx{f wQj/Z>ڐa^?k jQip6}W'XVT4'y[$G(mxq$o ~i_dtO,ep5G2gἔ9 ;Tu+} ji]ɹN-tiXiRꬨ{i(#OOE>Tm:wY/ڿeHOg s29M]s\._ccUWi7^F֚shvυšURGYL8rNB% C5VXڳA`݄Odk|fu Weܺ{D$;Wx~"*/՞ ϶׮j!@֕W46#a>3 ?7)Wc{?ۧӟfbI\P .4Vyldpr3o#f *y66"kTu8Ҩ>Kߴ)V2$F[7H.+R-qN}cl媪 AB@!6zmW3+P'#`h H5ٝ椌-U5 bG6|SMbGQ)±&2Ұ0 '"A/ ylVy8y/" Mo9-HP9x¢TO?oK9gm5u^)u d5Q'|]F֚|X[z2Ұn42CHsԏ|Ufirv.ڻ>|܉/<W8(sP~=L [`5x=mvyU+"*/՞ n]l_e*XIU9ϔVpK$r llWI:q228iWbd5CyTKL!ݯ!mAbw0jA(VRqiۇP\;T &G^2=mkA)"9dN58 s}Pj$e47aaG.: v4qZdRHҕ=d~s&<Y;|b2?Ԏ iT!g#UF&;"6DfpWwg0dx!M[LB SPFo]Y2=Kpvfiu~"q;3oOedpc&T#dAշedp7ƀw s=_P#.#Í㼑Χ<6G5cHmr .F6{KL5(WgsgݾC`{ǣ4 fpʏegz_5 )%أߦ2_2>d1e1 lIe^zB6H2eO<^"?+6\FYǵ GX4 +OX_<+4z {GҠ r,rl%kV"Ҡګ}Kg}T32nWw8?edpꪭ 7ikxPF25Sy)eou^Kwa ߑ r>pk?XޚWC͊6 \GFYR8i+ 7[Xo [^YcҠ'd$mj  [5O[?EZ ~2}._͊WKr,מ 7(CO!hledpCq/% q6:%xH:d$R!wz0+e%7~Ȳ wW#p]ѿN >UjEdP243Ѯ.1Z.V0:k 9`.-'PshxԐ£xBْCHU8mJs8,8#H1V!"6gxGde TjpGaPgkeH0/՟5 l.3 </` xH޻ .ٮz`%~-}'xDg͂}tGRKJA)̲F|9Vyldp 5v&ACg75sc3ȱKg$#O >㿚zl{/m[ވgc{ȱKg$ka#lG{o{4dvLUU^=$JwT0~cYV^d͘]Rg 'n~w9b$> WV hȱKg$SI}K>Z&"/p1:l#["$m7¸}g\uo=dkڑvG,[F2$kHf[g,32'E_r=vQ-ʐüR6@2yLI`;)IҖX'd$xa{OUs?+M-%V͋]İCڊT{6H2jŴ7; {{ {p { C+SCĬi{U/a{z♍奺qYc[2\%\VҭexǕ&~/Ƞ`t\UQyp[%cԲ2288⵩˘ϖXnָk;8s?R@k$~^oimIe^y@6@ҰaPѕ[44vڊ| ] ;2upxԔS27δB.|9DZ;% Z"t@.ǣ;-j&)?(%9kOI75$~J* D"{$"2&օK^(:ګ_c|?{cW%H@z] NbO]3^):GamZ* p ;;Xx|h`Gm8>>$;>99_ogRYvN;)gS/Z;;L 6_UO񫜷#_d2^ZFV)UD#Prjj4Bڹ$ٯ˦22 o#T3qx5|fAw^594hD">XDϴWVp?EDzrѺ?g(s3Npp{%.5 /xbq?+FN\-[ Idrf98FQa ESƱh,wCgCf㰎wUF'] ]tBj߂3"[/ԋȠףe!VٗRi`AUd RYe9 \6%eD;mz9AiOl@_а.L> f8l7v0T%C;M[e|rRZGJ[?3\7>22Bb:G`O ¸@ą;zRoK~˧T)J'=<0Kr,AOfO縚*OƷÀcmrgyGIL!92"VU\FW栥HFFժpկjώԖC4p (=ܩ_2VqFuX/f |R22)a)ˡUiXiv996ȻK(G!⺛HzMaN ;NZzѢ];| }p;lAZ_VV؉DR1vln 4 t1Cn25TT$E'GgPFVc|%[UWj8!tUy/$b/K{n  fRGLv-#GlCD~ !JcǾ&a2#P' ,NZyWV _ m*=T-#:L܀o]C.ZQ%wD͖.I('RV ]Iͷ[e%m†#-1jeneHPه0[UTw\bo&MI^C$o+p],DQsoy)AN۷)V[F3[Q-g,>>S8"y4Xb-uOِüR L_$w}jZDS3qOF_(~VRS:鏗 Vkg@ഹ-=DPJ ݛG9ܺ$BVX3 p {}io pSRkepHVVX3 p ߃'LU)-WrsZȱKg@̉x(K<y)ްF*EuKW#S1_1r]Ίƥ\}8d%Pԩ]F\p'&믪/9xKoN2#s]R(C9Rʕccetl]( &^Wv}dukn~޻~]۷P413V~J˹ ϱ~Ze%/,J2z h >Ƨ2]"Q YdB^'Y?KJ' gz۳9Fy @җ0T0 /I~*lDBj΀siH9,w\>Bgs(5%y}]rTzq{Y#BTw@B_{>u5̈́?eS:$箔֊T{$ndnEA׹[D e& K^_3cgK`^9Im~2,9Ánov;vՃ@t!E]7rfʀ=pjD9 Ɖe 㹄4wl,];3yl0x_u207{8XY_paoǦ H8-=GF%eV{Kuڪ@ U}2^ӭEŨ=)# [>UHA:zD'$WH汁ڗB堭* K3HbSFVGRԭV>q(#. M:y7yP 'YV֣ws7Z/u J_-"@)BuF(CuEܑrKzRw904zul$omMZf{=ⴱ9#[㎓%{:e3U軪)LC*vT"j @0%V}Js'^]+l*#ٱ$wJd=OgKOȀ=X>LZ^0v7 `q& L{ͩԸK3i=\љaЕ?w|PF{= eQH{2$gw.ͰCF\<—2ڄbZa:#ˇp6?: O;*iJjUG-#}zԤsmk Ԃƪ.V^aCU̫*M~t/ϩ_JgqY] |rʸrGS4cV]JC{kEU^=g3HGp{Vp2!T_奺>7YZ4.B*ƵMZcW*$ 3 tA.mu2;at2LQK:{ˌQ`L>[KD5'~TO\|{ā/gJ4:g#BTw@ U9֒DbkXDvXu.>+Prsvϛpvw:vɹ+2{]99PsDzX'd@}XSf}3tY /ByW S .՟H|Y6ˆqɛANSYXɷP2O|͘~C ';Zr[>KL7LnJ˟ |+̡oIĉuCr 3h,LQzT9OC)O&+rR_f?@*D;_t:GnUkWG5uoGܿrݯY_%KD}?Ֆ8(8laPoLy _oO_Q^.!xyȊhefK?q ,c`"}~YѶh)׭6VqV4Z$aΪs6zF24`ݮ%z_{ #v.:Ig5q0 %+훸6ҶU"ia18;_5D; _*?TY07η:Ͽj^dSvIwlrt=ؖ>ViGa\1 qH(J@Ywe8*̝QD {)yFipb lel+UC7M]UK,#VȚ!DXcI1E9(|! ]#e!+!mꯞcuseO` Hȧ4\rCܻ62³K@4V4w%9kOȀ$mŮ ^=̠n3+C+ZԋLNV4\kl'?1~A>;]ɬ%9y 8g+2q[; {tV탽,csXŀGKr ph `֪cg_s|%Uf%WĄ,ȡVuesBlpyf g,̶28GxvxIGw$toK OgglLsB[bqHzUde<{+seOaR ` ހOkoI0X0e`EU^=g6]J|Q D"*vVX ~ 7Olgf>\:"T{?|oקȩvBǓ|'M%>6',W Pۊq/~(ԝHfyxAXKSH_╼8gRߛo^w"z7FPF\=/f5p쌹 r*&Rc'||m]Dْ˼ H)YQ,]]7aYn- pU F:W,㧭( P л0lSp=  sH0=HJ8?X~QYx²JkENq"Q6;72Uvdg\?(!Ӌ:㞽K\OpG)huJAeVZqP4׆0'eP#yEaߑ(DF_s=7'U|7rK:40cEU^<,L_L(<{aF3s壒AG11Re5Oq>2\=o1;OGDrh+^[LGrk*G%rDD\?=%9y 82c7<#I'rF- 2*]9O8=tc R ` sî1~&R;HTz% FN|Gv[5g+rR Qơ2bcS\"j V5LRHc[泶r9^>$oMw!1I~Vyk=4›d*KĬr)KD [)#_${ho/tY\][S~'A=,Ck5K,\to 2 ,M4/7>R3.9u k{.ÓIJ~52adф:Ne8-)!ꔳ?z|'`zҔRv$Ո'OfFu*ЯCGţVVk=-*BܼA.(}@SG̎Lpȕ"9_BStIS~)$2/=!׭Rj[JEʬ"j Hܼ\ -5l,LHTxh5|A'p_̪fKe)Ik K/R!{TC,wls"RũUԻ Sr([q͹͝cȱKg@>#ޟ{bU.8NZ+rR8g2M$y2M\먪'C.[FVW#8ށfP{2 ףo|4*g2eڍZ̮͖۹ſ9R7 T`[]dɱ/V ,{O4y ()P~MVr֒rF,qeW[=w9V5!ZcIVg|ZU'ԿPAڬT-,zoJ||-ATu# P' `` ]T5e2{!GrvMRD9Vy H\k&wfz2.}6FrB/qB;Uw8ʒ" T}*XJ7eL4Zcjπ${PW_V" /VyUa"sv}cDhWGUmTPV]kR\%ՄskDhVw@Ո2+㰓yՍnٻ^9MY:bxLyQvb𦏅'Ӈw[P#5^2h8Gwc!&!!S]zU8c΀#9K$w/^bx~sMa.c7}]z9p"*/՞IKTGH+17g /Jss+4.AzyAWٓ2&ᜤ}"Is2\ot.H E9oN|x-Ƒ{xwwIe _5ɝl9c4j5sdfgZOvI~'{Q9뭙2<0s\of7#ep,K Ҥ==&?Κ$W }r•B%J'xΧCQ" 3'&8X՚(1cK p9gX5Y@AnU5 Ikjipne92}~sqȅp&zlv?*/՞IK羪=gW;i\F?<4K7Ljjvҟ?$r 83nBY0'rZlS%'Q%3PXa렙L1?̀"1,C~zTKH?>7 '>,sv8`ΆmUtƈ(/՝-6$Z)J5s).e;2rY3s=ߙr넱\d =8oAKOȀ$Hz@1/Ynj+R9s}dݮpVݮasvvE/ogl4Hj6PɣO8/79`$r  f0ljq$` dYs1yY1 D9f]2bTRnqQ+oDIψ$Cƒ˼ H\݉-J7P4pXe~ּ7B(/|0o2؏qӱԌ#e&|Җj"ephƑAZcIPifJe$΁oN[+rRExYm,QFGef+rRug!!jFyPwѩnnp•/\|*if1+ugFQKAلv-YcEU^=7M~2spmW,JiJ-E3H`WumAlȔdIxˑ3[xcU%U$B\8Z)#0H7Vr!áEuqn:yf*# {[jt(D#Η|zkcS|a gz7hBPksyT;tWy駱^eL >ӲM7եÅ'=:pg[I3H!3XdQwrvB;'c=ԋieV7Y3ݭ z30wLq"_nCNV1}#3[)#7 5Ǯץ7՗c,m5~?auC2%dޅSJ^LC9+%^\p57hܞig~KOȀ۹5ɵ4+,3oD_A1F-!]i?ֈRw lYSsBʸ2 o0 yXWie!4 ^zrT b pk]+ubה7ÖԵp:#vͮ俜W ErMܸ08%9y .a/M]DYߗLcf_ hȬQ^;[ li8܁Ukܧ.T{$n^E4r"Os[>? -j̿^l~W\q \v]e 01$4Dl>p}9 c?1cq9qY {cگ*=% ,8uanw%9y zOY&}o tkCeB͋ ?Ep+b~/2ZxJ?Fr۽mtbIS,O݌zܴFFylt{8=rn3%(!Jնedaz7UFU"A%}`lcܧPF$9",C&^2qZX%a{.V+$ FF|KǓc3Svg=Ax]j\L|sZZS[UN"2ҩZcjπ$K[eS:#qkFSF-ɰ9*ua;܆2\HZz]{@k=SFgS+u`VĖgp+Ui^{~y_madK*q%&{gl~9vˉ7Qo%12[ަVHePS(57RtEZ y!pשO 0iCN|ۼRҮ-ٔ[I5f¸c<7,s܁?&uP:3O$Ӯ,2Ŗd=I}"*/՞IcX0fL;"rerPlpbÞ׭ #i#>]o)O%O|zk{:V*'*Ǐ(qNkFy:*U1RϏ&v0&ͺNa]5P H<E+?PkJBD2_Z]Өu9Vy H4 x,Od 9yr.Wyj%:5K ɕ8YB1Qfe,L2)2*$7uԡp X3 pݸ@JIңsdD%eӱ9+}ȱKg@JV&WԚ=UkEZ8sʞ1V>,ktQu ʝD+Vy HH;GS.u{4\%w^[9magOcp_žx \^S]# Z\bCqdq]%<$+|}TF{9}CT-뇮A,IS^SogЮR1M3. |홿eqxWA̖$wj ln>42Q_mz1q|+b kZVv9kIe^zB$ctܳv}ożDI;\$F6m&?lgSD?áJv EJj'C)Kr,2 p7OU+:S#rs)#CErl\-z*HuMڢsj|w͑ŸLgtUv+5Y[ZcIyU.B8Y/)NvS0Pz٨EY7Jee[Y+rR8esk6t}׈5O_>[}a0UKancy@Xg:T:T%dAhMi_VX3 p+EέY9]9C ,V6R_ģ2֪t"*/՞I*Nt[8ϘHZ3 }?{$]X= yYB4?fKT~ͮPkHhV@EYU.eFR.NZ"Ѯ& q%YYLI3>8il=|Ms䝾9[Oi<$ a.{%!ex]]B*0H=#ҷ89+B/e=S&8X\N)%+rRů1E@xX *wǰ_e5S#*bm9Vy H<0mPhvMHr.#7mP~V&*qۑe85~"1RHppz>^cIe^zB$Gh8=vW\봿K+8h`PzXŋ vuEmNSBR(yiT#D$x^PFVA]J< ⍑X!ap*;]u=U#3l͎t򴜌osҦ(; *gy +#ӻ\ŸޛgCTMuwsd[=<1oʺccBwN~q.)-QKT}-s-~VlW=+uk>;o2 3S&^e829Rx?+ae8ةiA>IBT l$2/=!~SC>vX!bI}iBŃyz`J-"@یPzeH2*[F:Tuѕ;_U;T[2ڭU*c=׍0ä : 9@dlxZy{38Y QT7Oߗ=4UXcW*$ [H))6UJ`AQpnrz%?cW$} w04@P"w Z,~k'"4-Y\`1+ug$d.dIi&v]ep2oy ']"?WVKu͂n89zݍ֒˼ H&ƻYq8HC?r.IO䁡o'VH/R/],f}wBY iggbY9#1IC,?Dz8K>qmZ?n=mYKr,2 p+'f)c3 ̬Q^;UFw̤wsiI6sЧPqizmꎜ--o p75nFٹf%zjV[$k}~[ VlHDZ_`T-ugTDZٞq^#ۢ-)97q:F|;(m@f,ɱKOȀ$ap<_캮LMgZg*#YV 3{ :U< oвdǠb,ɱKOȀ$,~ɦiŇ |J}MHؕU9Vy H!>y{*#unZ&_!vɊRy YeNYvXFeQ!K=LL5ŔF[E9Vj'2TOf4$z4HC8{-#{ֈH[$a[PF'SM(.np0CvgENQaȣHYVȣI]xKꐩ_JQt+ӒzM`=!(U^kI0 L%_!r`Iș߼I%J/r) }v (IfVP-]=Kr,2 pS!{˵Nn(^LÃ3r͉fpv41!IB(Yp[2K; ՝Cu/|}Aɹߵ)#icg1/~CZ]#BV\IhrHY['t3̬ά5#g}v1>XS'CcycE&=Y+rRy [ݥy)NܷlKSծg]u٪k$AjBnn=) rv2$4Kg $yo`te v4i }J%HJzXcjπ$\37ޝout:;ú;7VX3 p `>tOp }jM_ggP|IL:7P%u,ػZ;gykǔq8V!}r>uVߩ"*/՞I[icMռeߺ@X}Ze2gnnd<illy]g kEU^=04*^kȣye_{eȹυ+epqnenŻyܗ$ -IMYY.X+gc{f+䡓d]<\klpnB8j9 -X˝/l 1agDe҉)mzrDdJȂ9hiuYtJMzge=0'__w dKA0 g9g$4,{ )$VX兺3Ƞ/Xz̞CËڋֳ2gv)t})sH,.\2},} IJw|.33.} Ҿ voS_٩e(1*^XF.oDeVcv!j`0؋Ȣ2P<`ILÁQMYX=ZpX2_#K~rY;7*]B* =XKr,מI) h*Oj)SbMNS([YѸLxG.C^;zMC@CJKkk9Rhg/?wYͬoiol1VM 7edas񵹴q\ws enUjF|f3sUr %Cַavf8ƒ 0A =R-GWBp(ܽwe.9Fy @={|5q8v?XE<;U^<,l3!Li{F&8 XҊ2# pCſQ/9/1 lhlE7 t l<*î~#3`gbevp}Y<=CdcxzBh2 K_HPkv萬q+ `ƚz- 3ߏ 0!mAnG]j܏oفWZ/qRtAk'6M8xb+?pm H?TXE'H(.8V0\Xqompf}O\dh>9Tö,cO>'3nj#n{H0ml~[|hCmک cSFַ4c8a>;~vhb~ǜqB%92)&@j{%[F,_pFg8Q%T؞.h6$0ԟH;"2Բ\qQME>!sT߳UՊ;2\+]=i0V%=\j[t-nsfT.s!mכ1UzPٱ4c<5ez,'D\|gqS/Z t%u w4֒KO`HT^#Y~%E9:c5N֊T{$ndh)|uGnP ^уݢk??E~ d;R0c>3 3g^9 :'By˵ SS*/՞駹9Kq:xs(`ʎb> D5VmRM*sE\IGݼE,}*`Nd'>aȱKg@仧~W{*9BO1eda|/&֦["rh(O{C>{oJ2O}w r(9s< qsq4 Q8j#B#7O;=N`Q, 4AEj H?@W,؋xByMnzkaURևp z 3edabE{ ZM[TTs20ӡ3Fc7\>@MP2#_C~wl}pǁKqK>p*Ɯ#^¡׉|nz5vM8J[8v;k18ǝ1rB/+uc{vh,@=Mt'R:~L$$]ſ`_;_T-#_lÈoc:{qk{+œˮ/,s:D)m(#5*YՋ/̓gB^_ۏ]$BK5e]˝r5>S+Ze2Z"(8*2cgZH,("{]6rOP{^x0Vx8iGsUM!ejpSeei;&6(OT#?0՛1[F;{xW%3~-MŧI(f|6 bkS-#*jC[>&[>v%4-*4#%'mZp+ЧSe`]3BUځZcIV"(V!sGJy+CWdޚ'z6"h @6_*L; 88B5tvIv݇ɔAr֊T{$lW+BP6tt5ԲQQ"GйȡȡTG.hk`'Vr~4+^ت:mn '&b{Yh)wXǦI ɴƒ˼ H\+n~.91ړ1"4Z;[ lÀ p ji~~RY8.jop͚XVB5]-LȖDJIġI]z-JSu+MY¶ö!oXcI:&^yȫ3/;WM6;7WZبۨ; DdGi͖#s<9n|=b -5VSF{xO?'^n7sN%"a=RuMv4r:UW@X^=3^^ l&2v[OeL‘ 3#a[6>lG;i2t;Ҵ]2>vwdnVgEaQ^v}ܝ%`irּ_C5*?Di{UFw؆_Y'i2X#8q>:y>M[q 3>}uQ',Yuq?d-Pʹ՟_peDGw*2z+%UdӛbQ^b2y[ަZKr,2 p'3i: +"iVV'g.lq9)j-ORs"RY׈:cI;4 x_/643ʫ5ȖϖMTit=z\ 4}ɏ3/Naܖ+Wlߘ/ݘ;L(oD{J{n5RFv.v:ʞ?z>SQkowpIOe*95啪őE B. ޤtֽ!"q/XZ$$#~NpLA _69X}ۤ8w,+d / Wm2Ɲ?\Od%c)$v+$ ǹI&,U-˔ims!om=T?!P ͼ$2/=!77Jnyph^ бyn􁏖=o4ճ=eg Bm(+AlD?};8L$YSfƐ0/՟-fEeH R |PFo{m,f KّzlMlSi4ۑv#?xL.>v9rB4QH=s>Zˣcx$?C|Wʃ,?+'ɕc?=ZL[5>0U~SiڪlYSaq2"(ԝH[6m2nnmzahlmJP )ʸxG{Iw>llv!@AA5/FPiC*:+L[=Z~.|q3TFStIkXO!-ДN + !n3ͦz|{TFz$A=e< y؛FhʹUwDZ3wS.LGlhOi\]}Yd&}c;{G:~8ScAfnT>KB{rC͕gJ=-O_^Duu❡wй6 {89!+%"<*Uam{8)К~ݮ8h\~KNgZΫ_*/՞I౫ {o+uICt#*=9~. 9AP[nVSOܯA]XG `4&%Mo qTPYā??X~~lR5|a$[/yh ,W,ҧYZa*J_71UAU$©ϔ=^>oVO+.tñxho ɬ>W+W'|]|پ^(#kEW$+T':QP82Xq<Wu*EdAt^&۲Mc- k9$%9y ٛċ|HQtErx5m{SF =sp^6k|7enb<7ܑ.}52~x=e|3+.{9yF Op9 Ό|ڢ0hIXMlٷ,*woĢ|m(sg>XOU99&98f Nг|U!DP~`̶W>֭sͪS 9ZK7Fk^s~yA uƦ2䑴`]`ZP+3ZX/Q8~FIDcHa^?65[ė"a)ۃ+պg4#@Q1J_dOTa%VS#q{&YcI3 į~kz<=[)#Υ>jCG>`Ie^y@ Ymi gxЪZbsF ρ2gfqv1T߾YyjdbdG/_dz<%9y 8.{y v<%0TCneDPNثq4r!cDQ^;6o_qL7+eTү2\k-ҖWRU+C]^=[4 ӚYkW-#eXU0y"ubSE ' ;#SDj5%MNQ,Դ) 纒2\Ä)20)_8=򅟫~ +O+2@WhM/ABx̽AWarI+#Dj(/'Ss_XOƒ˼ HΚʴe(\QۣB2Qʦg˯7?*4ۑ6bG /ib7~VXi%P{V23zG.S|F/c~I+&y0'Y\NH_|ecҵ*8R>XQZײVX3 pՍGz#AU P&mPea*03{*B@qTgUnqW/TZ:uV]*v0ޔwt\>=^w._/\9_&Aw(uEX;+7_o˗=%qL⬋(<^ӛrT-WOv>^ ˙73Kr,2 poNpWbn( gpߔ-x˿EF8ԙ ϖX.= , ?|2L @qf!)?g2_̎ި>/$۟m42X樫Lr,I\5S{&jEgz5Eh3yl0,[ ot9~.}UT_rԷg+V C15LkBpզ5niRpm@"jrUc[YsRɗys&']W-eda:pDէ愛QMsD"|S2奺 #ٱyѥ3 =ʦ$x1"4ŧmמfNϛ'>g5X7Ꟶ754Xr8W4 <ͤuINv{;qjzu.܆ِmP}w+ɩE2p5MC2CF|\wmF* oYLDR6JIq)U e}u}(`ʾV?ep-Fyﺙ.]|keVWڢ185%;v,C/%%9y ym&*7/~9yp8&Ap8I0\  r.#y,_H:£!KVYwn)ţ_!}u:R6[D߅U䗶ϲ՗O<#š=0A9R`?poUvLzl3_(?s6E &b2Rd75խB:2M#hD#/^v B A:^;Aji+7ωH?up` Et=Ԕjx  mwnʾx.%VղW|T:x^;lt"~,~ $C{. 7wުn`sHfv+jVhΚKI*O22ڣYx/w)63 `3LdSnT Mqժ"}ݷom݀@ cW$Mӽ;RwDl| 0A|T?cY+,z Iϸk/sLAeH8KOvE:1"4Kug $͋, 0 ?CGks})GnwUE䋏p^U_4fXV0eZtbbccyg ?;ŒLO٣s2C[qբU N{ahpCjLN}6e8λ2i~uIxJg6E(y]??-S ^N:ɟL+ok=lduҼNXӼ9T#-c(ZFZQٙmL6nn5[Fs8uܞqYԹJ§ bқ.7Yc2 %t)v!8<`j{K=XwG71$нVg7C죘mGYmWv Fsi}O5 dVf&fgM-OHIm]Vw$=oEZf%ro܅:NQk7R1K fn(îp) ^51VU{QHP jSAl'<`!XU.nS<òPnm~e0gXm'W6ȎI<}ev==pq}ܖ>EHX~apĥ;d(ܨkcVuHuY 7JgHtj{T=G/3B }G$@ᆛ|bW8(k/'D7RM۔ihaq_$_/*f "*hE'p"yjdp#gp&\"Q0}_9WjCKyMLnC j(Z -CaTr P,&Do?Z6je|VɅ_lV_T 7~G ڝ~=/Ft.즴!.czQvkW= S1[ eq㊴qWIp^j Nb|/br_n܆K(xͳ-%x~S 5G|E>#B‘jHytUYo\2P8sswDH̹2GbI){;)g23 -X,)A{h$ѷaUq^t'E(c^Ӳ*ˊ?3.3bO0c ).ДufBNQ,CJH7r2P8Ϥ%%%pVA)x"]rSb_YԆ SŠ0xr/zwOw~@ƶ5zß;74Skui^)>TRZE1hj,, E!AGI=_ |#S3~:`d;nBKA$pmDb۝>(QWqx-n;`G*>g̽nν`j&BoxLAm^xêj/ 46x81,Mp.O+kke@2{]h}C0DE,1mXm ~B9JG%OQKMcw#CF,'[>!oH@Y@xrtm63O:(sW n|5YOOM_1W<)?N1Q5+G%+riU Y"PѶIBgW/ x$Μ͜2f$Œ{`X#G։32P89}0$ywSeE_ mb%GAtAlGW8)3"~'YjUf6bh1/ }  VA:g+qdr&ok4B.䧬qBWOD:mZ EFz %wotȾ&&Q_@AO<ʒǍ_2Aߺ̜k۴VЩ*`JԙH8Ro7NNQߕ0M<)戚"^oN `0C327ͅJB T'Y'[m 8Mqٺx~T G=8O. ܺR _)wn$㽶K=#q&ɶ:i߸lgTn["_8͋bڰ/ ֆ.ù ,M wru7.x9x:Zb]Z(a}q_]-.M)fYhDf!L) |fNd~B6k"P~ E]]2P8U׃t76ټS_cR^:%?-mlIK"> :1!J*[pj eq=($(s%uYa:.8ID9:ņ ''HqC=6Za@~|0Zlv{,k h;ύ5NH@{v)vɞ*j?ATˇDz-p0 ph$rc~o:ChfQ:XFoshY@ƴѱ3;y,XA#2Pg/h7-({£ lgFiȝ $DM5އNu9Ե n<P遡?SS(hm{l_uJO@^|>#8B8urJtXGBz$ʫ=4Hxs!SQ@P"w7<מ-Rj?] -V0LwE@)(l5Qˆm \i,k{pPV fKV0?D$!aW,%pdsso"P(c~j~ 1BnLrOEo3Lepb3׹VG`,Ibwor^3vLrv&"@e6Q2PaѪvkX%NvQ _Xtf_%F!z8wANIuòPk܄7a#0o^ XumZ6256[0 Zu,0B:?(SYnRoVE A>U&:HgдBZ<aq_$L.;=-`Jmak M)HSAhSB5׉)4Ŷޓ=х>:Lo# AWEA=o"7OJı%$q7 v.H+0 aow9~F{k<ء/*ڋB­~; (cLLqf\]ao$t˔…ʃ'䡧kp @OE@ObW;1\oy@ HL(e aԾO4)ZqA֢ $l- #>ݾ5ӆ'tHi]-`"p "bSn/]$w`Z؆o)fl;aY 7~:ڇ~2$,GvJZϞrA͠ F‘CG`h+D FOjȩ4K8!BP<\ab|8:Sb]2:n \7 biJ ݼdY((LUIBc}S(glBu2ʠ4kUy\V'XZn5D_v;Hֶ* N|NsŌkj=AD'|҉bG6,鯃Ѐ^Vz"I8t5yr6P?EP e3t74Aa9-G{aDű󎦮Rȼ, $-,'k/q7II&缯,+ehOExY2 ⨹((& 2ExѽZxjQ <ƒ4eQjV'k$ʈ20Y<#( ~q*s۱rzqR|͸Z ?( JM.i0Gdj{1OZHwyF$||zd.96dEHX;~jX!LL)WC0u;u1^= ,4t`aAiUq^ZlEZ lQIG^uF i&@ļ!{zY)1n:Pr:PI{,,@}TІXKKڋ%yiO*[gǙ'/@-JviNτaxb|,*^A=p#OÈWVV/f@ߑ:!cYjZEY%^/nsǣ1 W/P1SeR>- /1kzCGv >e aQ:{R#sN @C*_1\(%WZ5, #^%R᧞R1S2Ǣ=3%:'3CV_;2Ak7`)KQ)Y%6t(̀! )1j5 @ OOGjO/@F] !RW]qJ[{P%/J E!T2|HܕeN/[ہc_@F܌cM1gM]VΙ )BFFtwS`I;P"#=vJO&@DO O==f 3"P10V"3 2P8" tImCX\oŗ@7ǝ2Vs(ѩar\h9ŵ~T#2Pr"Ͻ3`b2`3axi+/-٧M+HkF:-Щu!pf߮ }oi8. 1Pyc ⪽($(cwV!PDe߰FJ鯴d*ڋBτL,gj}7?αZ)/ֽX:wJ"w1&WfBZaY\O( }f0kz+I-2nZF}{ٯ\}i 7't2Q ҜwD~bsAɲ欻#H1Yzvs6& if ͊@*}ң1cpsrukOQPjJ+0pȢl9dъe((?2NcnUDBn 7]9aΘ?.VTu85e(7:諊ףuמ=!%>Jxj1Pr_QDPl- ;dj eq=($(AݟQ-3:ïE Ahy!}A3%tuص$`HRtLj A%@|T1K_`&{yʳa7|熇.pFsmF{@LSFܡLE3)OwM ]kï]!Ldq,32L3-졪g'*MUCT(eeX45iS̝u"m@WE@ b׉V$J~[# Zzgm3HK}*P&-3"QhC.2aJq%cXyZJ9YjxL{`a E!AZ 'b0ӡ@[o_QWѻ@CQ(Ǚ5,s^ԡ2P8Op:P_`H@dǙWC0 -`UQZp׫HTbtQP$-nҤ \DY6Q]̊@$tdWw?id_:$EoM;{s>wl UVP 4L?7Uu璘;? 3x(yBH$`ya~ ͛SV6#sꪚ}ΕlZII>SuKǻ F`GE@C8]+2S=4 l آd "V܉ ⪽($(z@u9>6Ƴs\2P8;RD;{qs.@#䰢AEYjh3|W'1u[7W]i1Ծ^6u;7k_Yd_l ^t uf[A_Mevw=5)l;3a}t<\>tGb4Y0Njg(԰հ^<#ax++LV?osh.vrWx0/e amshOu5E^@+XpSq|f>{2PalB2Pv덊I焋Y&N)O&> 9Ckxb+]E'\k^" E!:? U$ 5'yP}Zaeaʋ?4=\up[1^W&뢏ɥ؀4ڙAڋ9hap8-qK9#`7y Ll>vLqR)t=WMF6gw&G֧{SG!G IJC8PehV`XWE!Ad/\jG6, ?zb)u<5D'[-_X(>1U|uQ$ܹK!c.v-Я}BVU{QHPKcK_)5@KBljL i^~}-=˾Za#{H}ou}-4J^ Q/`k%곋՞8nF±kGUKiWvCZJ'|e/y%0ceXs8E(I9 k3>q*  w.ÚLж5Lo18j/7>tJ2Po/v!m=d;zSXo~?yFoiL*(|=23 nt-wP=,?AbܥtnC@ºKT;6:V÷-gsOWƵ B!Rg"$lj nԶhS 'v~C҈$]"0]./UѷOA I7]-,'[rΑ-e1:_Vku#isoAᲸB5z8%ICІāD#/NggKJ喲FR _0ͫo|/26982POFx.o1kI] ֣DI?3圩m>.|OepOKl1 :([:DGY 7f=ue8KCWښ=Ǘzx=O0n)q2=HLg2PQXv<OF]{.Tz&- N:)=,RcֹI՜iBٓ]EWK0, E!y%`]ݷWWA%Q`AQP(uh+s4QǦ]#P yR,4}0:a\ML)⪽($(ܰJd1QVzUyQ@, /D/Ŝc?<ǜ榛TYO0n@8InD? ?yj :1FAR{0 ,uޠ퐌Ie^,إ ϝaO_epMI^DO\)JMK#~1hW=OG~T ׯ6䟵oCj屶+j:?ĨDSݩΚVFc3#SWW9= N="0e(ܰ?Zm/VxTEep4-1%#NL3^Mepmqk"|.25jW%ĝVI_0?mS;g"cٓ ( 4Qpv珞A;Ef#nN-VCІU@PscUXwn;]K'@xZ2T-K.ʐ75=m:5MwU>q􏋇 +=L Hj`khcŵ}43П9f! GC'7DM$,-#Dm$2(AU43,켸 VڋBInW9o`ߎQS6K=6T&$ l%obVU{QHP8z>iKQ 1X_#u&};R8LZa嫽($(OxzCgI.6 4m䪺HHTmMXzkך9c^/RHW{QHP8G' {=ut*#> J=x\u,S3.B'?V`XWE!A퉏:UӰZԩ62k$&MEyE.q:4u%}[B o*WMjPn-ϋR8]/02Nq|fiڰ/ ֌j[UfR{VSu`4p]W0]6#G!f!介z'HV\CRZ= nXwjV|8½\/YP @ە**$@!4/"q(@ Vz\e&[qQf8.p/ӼBR2sz1.;Tx?xO0|."ibE)#nלfjq' i7™;s"@@FgA ʈ>"PVoG=߁w{ ɊCd RAϵXO:&B8m'|&RXM'T"}'1zD)ydl!LEgt3\p V0wMOE]tw#clS %[<)ެaq_$lm)9(Z/Q^)ep4([`,S#[/*=DŶY$'xYsL `DJ$Ix}/20eg-Z nO^#2Ճz#|Li%pzH!n GZC02P8@uv7pb[L@[8k, E!AwLH@g~ yBقD:P4yκ8 ` N ƾ[֔ +-,'stl&L>fFburc2$6ဴêj/ z#EH)BFNq,Ǖ:3c&ҧHv~mWI9KL(uZ;|vi$J4wE9) KLMr:j7;&#dvrș(vs,\[w⼐q3E Ac^m~>@sXlsX) Ϸh2ϑ m>lG Q ?jpiEQ90*<$H cimiL.e`*ko*َ_ߏ %ʗ|.@zKZITM->-=:߳S(ތ<oSv{g %[w{fy[ŗ?䙺l Ԧ3&3ܼ ⪽($('=Z9Q_M x=>52'~7+@F]ţUz]>fAn>|1MOHXig*gXOX@)4mm]hiHk(|Cf/w ƭnv]b3ėXǷ~ﺓŽt',=($(ґc~bAzZ 6MgWH}*6a]4$!fa)^|o*^غA1"<ٟ4Y'E*0ĸ~$@K>WO>cBq"@_yͬ8''3urb48\^qlL{.B=I%{cܖ9.4IjYx|hW W|<#Uq^1/hC8$u5EvSV`s";jWڭV;aH$epb5e!9P6wq@J&= ؿ3 {br~S*Q{&\Ljj^` A i@"F$]ŴM,&玁i*ubP|;|+SEye \vyCto5dQO( i= ̀aC.[w2P8y&H 0~Pi?)jؠ/.&S<òPnHs93&;N6.@ڃS@ ztDI#/6tT^$ VkfOHo?qRg[@ᚓPn=:K±g/C<\md`r-ѼE^bto¨v.Q&k$a7W \6rvbbW| _^'C&-,'3ؼe%;E2P8@ǵ7R|#o%K8 fе9{tŗo8DȭOYl+7wi+lmT7Ky#Ocr-kwֿ0yVig%㙟2ZܐDTّ-`8#܁S Ov̟פ%prh>9՛#zR Ǜa 7>H\*H܈W+9%9C0%;5(CF9m"Pg KW~H]@Q+4Q}]ڈQvO5rO##B^Y¤cvZTB e:@H,=CiAYBi|;86u=_bW9vso1DH0Z)(fGgqe` !zFjJI# wT6F)v#edQ ,YaݽgJ&r=&e_x4{>G0-`$ Lp,~ҎQ )@ ͉tԕ /o_-,'ﲟ)^[4Eq杭;::eUo*⪽($(x q bLdJI3b_CQNj #+9^Q|&lɓDH 5?J ܴ;bUT^$1qXaٖ8% c4pV;1h⪻H (2F8Ѳr֕)3SfR,ӹpVķ;,vT/>S$4C_0*]ɫh^ZM\feg$Jm$,4HߎFaNjq1!SQ@P+[$o}@;flQMg P)+;S7qɄsbֽd>s}ŘQ+L>ɷWuDҔ YW˷\'qvۛwlGd.s ff{ oL-(⨸ 9bJYzqr8pNY-QcR>G<%LRRH`!ZcHh 'frꍹĻ~\DzP[cv C4ES^RVGfZ~ihucdy+9/sҕvlqFLOPՙbź$T訩Q0sH\AjmU\"{p-Nd(y 6B9z ]mivj݅kԖ'UXaY\O( =JDG tS^=Z:!&}v7Hrg+0pmKG:Gb.?r TV+`)/#ϵ>R:r'XOI DWLiYK & 74UO0nX}hNҶG5:!m.?3*_w#Iߖ[<j(oǓ#KL)⪻H (ziE,%lA.5X):mr2j̸ephNtH 4iPc[b eq=($(~:$i_(mQO~OYBG&1RH>^;<׿eW~ 6wuPJ~|Zzh H;l@0pP(M/4J|z* kG}KoKj4Zr$"39SòPP[E B}V~ؖϪ$惬 ߳uw4BQuTߛ\Ui6m ⨺(HϝA*܈J8a7)iչ*㴒\ug)NZaY\O( Z8jU3~L:fN?OkWD.3Z Vಫ zSEP9TMuy!xl-ty|  !@BCVDs{)} mJC /&=>!2P8+WYd;d`@bd(r#^pIS Rcm(xHcyV?i eq=($( *٢aф.VNR\.ugy]t2T'\E'T@iəE$(⪽(Ӆ .ԝ8c5l޺\!^@*M {qZ݅ s hNm|\y"%5y3*ZQFB9oA!h⪿H (x:)pL=-) "Qt^BMêj/ ' 29׺C7nur"nßR4)nJ 9ura pGfv?YO(W8hNg;6`cbZio"'?%pzX`5f"3` 9[{r2P4 /'ųepl hjjP}k5Ϫ੿9a fbQSJR7IXaU\k/mZn1u.fBMI{[nJɋqPg6^%iF7e&"'-,'ӟO>A hP9$mۇ*C'u'!-}O( Ǎx#"1<%|PLHLys3ڀ)āB>T6q&ݟSd$mJM Zo'o$%H=C*c=l=p-v _LǬә(#UGròPNnŮ5/fE6<|* h=8a?>:M[wcCK  Q˒Ti%ljel-,,~BqB=}W?0DB腥h⪻H (1-4$vzȥ,8Z.KғD* ۼU`z/ 4 9.={- ;էW=@Yf y:SVs\-+B03Y:1S)zŻ1ܮ)zBQȷ_ߋJ2յԌk#^N:Sfg86D[:HLP1!kC 5V#0`F8[fY}3jU!]U7~„ᶈ0Vs]әŮ$9.Jtȏ^,E<LE<"z{(FX.+qOhMy &p=5P{ߣ"!$V;Xį}&#y8[Ja仭Vm-U;яpwA2hI:EY)&&Z>E CE>@:R{t)^&f)*ڋB9z6)1߾mnk%`+itepKx--zxBw%,NWGj) 쭺m;{,33}9N6Ʋ4EzuŃ3~.@c~;2Go3,EPgx*KuuÌ9^wKо42V}KU־-eb$٥M|*3-7~ ]uQ0XAzw5SBytS{@̅?Ίiebν+ Va19 # 8i SO( Cu1rFFLºM^Xa媼( Ht0O`̔n<$PբudVwv L.Yu=n$^FѪipAcH@S+pc!N6T|Ir "}<+YD^,[oz)fyE Bޠ0-t9xG+MSV/ڽn.VG18DD\{#tiêj/ Bb1 K8,a(u~γ R'VA&_òPmg?Mm=7%+C5msJ=VdǠ@iVYWE!A{|:[DGֽQ8b8uVU{QHP8G{[T0ٓRo8ho!*ʋ{Ql!@h&Ƥ̢խ;2P8oM88bU n<1'޹?ui4K(S_R 釼p GfܢdSuXbE]m1ðx/  ֆ ΒW\&П4Xi)#OELZ.? -u/ p{RCb-ݤg'B>òPwm'.|Np70YD6*āDQ/3L=p2#" ՟êj/ QZ"g=Ry|(k%yuqmep̾V;[E6ȡdq#r%#j}ثWY zBQHPَCwtLn|^k.+c➕z''w" Î&RSi eq_J~IFő߶_a2-:]/?B3 OQ֞(xo|Fٟv@ _1I;2Nnt!J_xb`XB 棻W["t%p]ošk oG?q}:fs['#,~U4mT\u c;En]S(g(}VS(j A툘\de*!ٶ$9=߾IK0, E!Am;trX 陧y$G*ڋB ijnY}NQgxfh.Ҩ.h Hq57Z-iB$7dֈERhzѣ~gܫwa{5H䠙0tR hp{R+%'[wɡ/KmƖ;R)ybCV80ZJφULNG=C^b}2&˗k[;v|n *f_3)LoLf3V>@巣`CTVU{QH446!FRDћ0ik(kKۛm9 qUALc‰)ƮuZP^`<#R̛)nòPnѓyd#hH $#Qp9F'yg63X˿F`.  L{#7]&̋{zTX AW5wr$NԈGfZa渙@i `XBI[;*aI4#(vQmJ; +Ά41V5եMz1f yr;#OY%\9J^A;|PZj|P8]P3dvDFɧB6,ἾqHi?w8XX v(I=$&c}g3=r'gMqF,s0~r zFqjPXaY<( |#KX*{#νuj=R#a"X .kg~'2w9O? S(]=5ݽ׵zsepǯROSR_󈤶~XMv8 ^g~>Fe/w?r!#a . MRb⦣~KqSċ뺂8zx2w,4-5xn@C ]W /]"Btm/}MF/w u& 沈,+##YHCV/)D#Q1[4 /_h\ijfI((C0I{S12='Fӿ,#nHN<} cuOn}D%v侔3 z͟êj/ h {8 ^qC__47êj/ ,Z u DFOը.gO6Lbo$ 'oO(pc#$:]#9E}&@@e5#Y6+eIl7y ўo9'ͩ&05hNU|;4d wLKHl Jv [~9'k~IJ8'2JN&O`òPMu i>Rzqo9j/?=n`׾:gKJz~ KtH2)R9y~y4ӵ$ wNhѩJ{ ~ŗqxkY8O 7ܜƁ, {Ij%FBCZy;Ec?Uf!'$1k=k K0,EAta4)a0[Ki-{63?_Y):\ė{f%6"8ijU'%=;g K0, E!A5^S $`=4V`XOEA}>MMM4c&@Ƭ<@[1Ҏ过B R=W &zL 39OC(@†~y3Шg̈2P& -!p!~i Wp 巘5=$=p:þӵq.sMVXaU\[M!S9Ӵ|.{pCx8)z^"KxFn4ʱ-. KB­c(-j_+߅_m|߹ $ltz;vbu=]04#.O!@. K k`2LJڂ8 |Oep㧯F023Il1*-wO_@F]v4%ߛEj* n1NbjN̼g֎B ߊDMjr~gQЫ8 `LIr(68hٴDj{4֡4\YnE}XMHPq g ήqpe/$ 02ik! 'F4nӸep'LvMJLvO ܾQ{#.RAid(/ŲDN\@=s(y{5V$Z J0J+f}!@z+n/$Fn;rYY 'vXpCT F?)e =_DQeY\O( '2I$RYpA(4gG8#I_@k 5]v9ہs^$ju`kZ!:e(C+Q2: έz z8YM uNn3,qMH6r̉%EkWuO]ZZaU\['Gd8 t&JO{S@:@2P>P$+yc*j3cepN HMSF:Ym>S63B58p<ځ~?2 j-Q4Ǟ@ֆD!1[OMXb^ݠi~m%,ěGDep1ƟCƀ{AזލDڇ<*T_~FOY(:j/vo«GJ8_BM^xָѯ>yVԵ|"^\A i֢Vʋ- ! -7-mZB7" c'vRQk@TIA.e=I 0ZɌblxWe arxa"_Cl]7Lぷ1tTߺ< K0, E!Aڶbe[n~JQt?eoY{qF$L۩~t3o{nxH;IqJ"*ڋB-ҙ&Ʈ23Rv%ROST ުP`1 D4T{鞯 ]a:@c\Z}b`N#dtPH(QiJP'b,%E3]voR3"T 47N>s(!Q;`0ϔ7<1o iա?owvT3x :;<5@ͳvN3S+s&vS1*c}yڝm%pG Z0Lnr]LIt8{w OYaU\ɸiIF]#IC'epc}1y>#FKyozH>9 sV6b EAAcpSdp1NS{#NϭN26?waD>Z2P88*/֥:C}F|uOxgyBW| 3I8xDp-o O?*C(+?ng*tz}Iv5r鎤İ7މ ⩻( (U\|ibFp  w&てEj d-y COk85,!p&? 3fKb3i&kKħv;;o1w&5ouMq\jݎ IuFڅaރ2PfESa%Tb UV C=b5)ktCiomӁiu$~fbkĉq蔖`XB0-rp}>-7$Qpg]E~\k(΃2z!FbOvp@#i|<q|;KiUq^nrt'% C%ŝ0K&2P8g#֥#vM#C7,%pD7Bl{.>,gC۪,cdO ~k1cI9IwKhsj`zzJq4%hDiJUM:d\_ пُ}Cw:v\XM?}&dM.Ai-P‘Gջnbk 犉2P8z `4TORm/&@ UwԕZabepb~%]ەcJQhNjHX2iK0, E!AĻv1)6أe OYxn/>/EYCQ,{ߧ}K£1q(Vf \;Ȅf&# ]g~ZADc>Ә̅^131dݼJ+0pzMSYݙ8 90%`K-?盢Fk-LFQYˑ+@$nqiP1,@ #\sќ}VBйSSuY>c*;NTT: ?qoh[(}"4HdtE]Fh s(b PX|%'[ ߞ&V&Wөc12btڌoL5@n쬙;EDn1An &H_c^T~ ӸJ8 4(A )/8펴>tkM$ZN/Y;4TFΝVzKNISW}ɛ+[c( RϬEP#D1Ֆ[p7zmz"`4et( RTC9vTfsך L 㷟7<̷0lJ~ w˳"`֣~!2\2k(S))6k9.ҁtֳER5#No(xMtaQQq"PIcR2k}2 e4\&j[jny"WCFQ.&uInvMI{IGV$^M ⪽($(ǝC8ߢd@ s4Ү@+wuUYim7;5/)#SS/ #F/a\13ob{;ed>I攘CVU{QHPe+_[dJҞ.@<- }&/nc{30wE@B{RLѺ6 ffJ02OP&QSR bU}6U+! |tHްkovs7lak&Ϲڸe#G.(9K(O.hg_sЅ 'y\zr=¡vы/"d"݋0\ g R)]n#$ԩ*2Pu4}W2[.zIoDu,? Lb6&xXčw-jNV>xsM}zq*+&r"PW5<~Uλ)ZXg1J=8@WEAKFy ;Ro/#4̃ɉ3kZXaU\#+D6 \KZT#P&_8w@ycfC?e>dtI bZ+b+-˅&bQt&ENK-YXaU\#+Bޘԙ%dLﺋtlG+5 ?Ef grO5{ !FVb>Cld:!Q$qVF~8F[}:"o_UfbX FOH0"CrҒ6H{2ӷ7?iwũSbhχ>T"V+W74'Df.mw %FOhM\$J'V5Ú n |Lu\ άa*4NRs7ai{pslrH["a>v]_UK(g2Q=0rpI}[@ᨯ;ZR?jbhxߣep~åuZ4]9]Mg/9jeX\ S]VKF$=}sO@U}׫s=/FS}1k$L'`۵b ] qϕ,.L@:[76+'Ebh0#H1t0d\cR.ZR*B&*rԲ~b,!SQ@P'Z ٗ7q8D'oLdRYey~O}2P8ܴ9 3@Bؑw2_䠞;1u#Ƭ pSj){+Vru!eXT9Rh>]GY`S0iVyu4Q '1ruP<ʊ}y8hdκ=\i8Ǵvq^B :>v `S E"@[0羶ʄ+ N*5y&ᅬ 1]1j:z!w}t3wCU""l\#.GcdH)&)3sj eq=($(\s&\^h3k'Z ,^(6  $|Nǘp! HI!M#WZaU\[gB֣ln_♿8<&%c eq=($(yͯzny۽-%0qQ5!Sgg+msP~_8`nY 6:9璘>u/he; וѳ~L2u]˗|5N/M 72%iv ۀ` NͿQIqQN2i-?%*tk*Qi20eWV b*O쬯ƒƲP \9&]kSd8Y m=vz sXP b·4I>E()ĹՅVR論*=dPZb^|45`ƹum,,ήی{]nϓt9e 6ᜍ1j\ȗpp݉Wz[5]@]|{ˣ *;qv:Cm%kg`ZK%ި|<>PbدSλ}іXA,˺ZE.208jFlcKGXMZZ,3h;5b!0$+S<{յM .V20s*[o?=v!c3#!~cߊmӖXAMEkRڶQ{ e-aa* R``L(vwΝ|??Cm°Hfq,&2;1||uS@vw/H&M  hغ['{30/X&CGYFP&p=}E`Pc幓)c(︚F0 nd"e`pwQrEﺳ2084GC%Ԇ$)ܣj˯~t).Oo*qD9'%$p_FH/7A^w$a xIOe1Hh=^Ee>EI^.ó ض|k9)-3@^4M9 t3oVKp,k ֣vDv?ـ;wS>~WQ[SCB> $;:(eY6>^ s?lٟ O wZ|URI-/ Sm`'NTٛr%85j`pj ĺJhi j?k/hTd[JU\xOLc-酗GD]:]M!]WګA!Áis:?Foxvxnf_~ݲ4Xehx~z%85ja>ZTlb{qmU ^  naKGpFHzJعi»]v)EDzP  N":G&QWkhAO'?qbYkTwL#'=P%85j`pvU[ܯTx Ԫ 4,vɎ; ]}<&`VKx@0kKd}'UR'q .1"FI[NYF]38j*sY+ wVbNM?5=PY-NbLj@g20꛶ 'ru6CChڔ˯e`p2~Gظ/ t︚Hy^.{ IՊ{~%85j`p]V־a"Y`.c|r'Jhpy*E˭u}V/~={3}rm>M%cNe`pca@MO+L3jÉqD~ 8^!!#FioGד.F!p_Oe?wNm~W'ߢƺ(Z"D)Hy'ϧA1AUT^{ޛwgsShKZLlϥh{5櫨=o%85j`pp2| rPyy0PNy}`Rh}/e`p}` 7Xwe`pmiu$J"e"S22ӟIY6Iʲ 5sօͬ'G_; n4Sԣtꚟ䦑'`sS)Jq`Nܽ4wigp8GYcYCO /N}@K-//1-&o\^£@,uҠdPo`O @rbH+nOe/ck(oYdx!Fe`p x'z)TFQN ~ѝ*ܰh2 Qea6 .w2H#%HBT6t8#.=?ϩK/S?$C/"2MҖXa# ۦ9(1.NS^37z(֡MgK{`nZ8W [4 x>\|u)T`X9Q~)J[<5[:n%^V3_kk2wX$.$Ey7崴YzyqX*e =$j|S%1~ q_v208nپ7Sp9>]A.0tLF[cYCO Q&(g 0x- ګA-mi]tH9ZA遜vy9 VkrjdA N{[7W߲}N~ >!;gm e =$ hìV\=yD%`0æQKDүUWgZoiy74혓I͍a~D ]NDq8)6EbY/wϔϬ,'T}1N}TG39$kz==_5TBb4'oڌ乓?2a'Z\2؉Ȏ2#]#W` k``ܡ]梀6%*_HӍ1VXj GtxlxFO&Ԥc!)mQjpQdt$Gs$ٖ],{` X \gVNʛI:KԲRz(Tw5@0'*߾W?$7;sO!OVXXEW`ϝުmaF ]:LcEVC}D J8ս@KpfQT RM6w6_k?],ic,ZXX蠣Ѿm1)f/_H2j`pkY/6˃&1h@(:Ye6$+G%CB 0=rXɪ,]~ˉp;'w/$,$.Dqr4& 16_w9qګAE:Px+?.fE[cUCW Syl֑{(&?I=T.0ʥR;I [W]҂\9/NNa u.6dd (}xݻ& j'D='×ic~~J|=zb9O1 OC0ƿ9F"N{ t 5.6vVS8Naz_ (΅P-~oگ7 ;Zq*KyBt= e\/A!]dnG3 f\T[vAre{ rWKp,k UI,\G@0LmQj``]>U 1Xlx,m$}`:cT#uWxWL_c0`JVJD+2%JL%K*Dךc7"cJ+tԮ]q&;w6*q`s(cFvϨSe`pi*Y8[0M6Ѯ##JcV;v5R{80(4Et'b fDa(P =!D⇖|bDzP  N5sb2v4 4ro9{@Æ"!k&Q ˊ(]iEF\<(wS5<΍έ4(:jmʢF* 4dK< "cXP :x*].< v_'\1 X BHɑrDH3208*CF dN!@ÆљFաU87ZM)MZ&X ]R**DJզ d7 ::wյ NP'ISKKC.3Sܻ@ټ`Ue1_bF)e?a<}208qngpw.;208m򴲗tspo2 r>>;gT7~FR},rYT7fКσӥFї"?h#֣Bl`c,Oe``3x0@v}v1ȳkS*iY|rP܍EXUJL+WK8J_"vm:H8Ў [T+~o> F 4Lu`Y.)|[r=DĆb#"<#"8iTnΤ#;7rdA)l#PU>޷Gxn|.< 7 L_s3s=:=tVƻg.%8'T[=r CqY^Q)Fcieq|"T=VݓI scz1&iwIX>yֿ/;1M<1Ypn.`ZBM3x5'W|;v MB+eR.rj{S*05jaK=1g+אRb2}ipzDWa _5 ,ɭyoj]:#kp=k'j;eU ] jǥlLĩ nL,4q#12S8%}1s208]( Q]vwҐV|" ?۩ a _5 LozvOS{dsڡǮ+{ G(*lILF?&/!_6lxpܑ7tO  zm²?T^>Q ]5 lD00wKϨHe6e wLuMe`p|XM;Mc!ME=0 ,?\O>]d-϶oFa C'\;=r k@˒Iʄ?Ya"GRYoBM+nĐ;2n'/Lk"~fNZIS[cYCO EsrE(E[ȏ1=D24Ki\1[uť J~zi`X/#ɵ^`q!vw:oǭ8ϋG2pu"ϛ""Р"wU.쥃\'"O.14.0 -pPV| B*A(޷]֏WKsh}&}Te>y|:ʷndJ%iև7O|GeGjڧPjypjIzB5H0qbQb:7<@o!ߞq1pc1sEJKUShmw ]VbR>P.)M wזXuog$ThM#xMHlʍXҕWtc~Qf>EFktXĤ?JaPFH=qQ蔸mtgc@n©H9c2H+o]G2u`j9hTr7~lAlL.iWcګA)d0';cqv?R g,!4@"OP :J^js&ɚXi+BbkK'tǿ78mhG:!'I\PbSGOD'iέSj G];mOF8G]7*ҷ})$h,'TS 3*s#Y,m,'TM&[("^`* jfjwq.U ^  ,O.RwwUɃF?oǫe }y0LEMqЦZ3g.gYɚ;w0ϦC"^;ra?tJ9ae25 }ְCsY -Mu=Ge>n +7+Ԙ*F9T_sb99 R43]pkAQe`pz-汽`,/qwC'DzP  nD/5vT7zm*F#z쑸}(Zuv aqQvF} !9U52[fR8GRKAqLg_vOp gmeWOmSF/BV4٘*7uEAjY"Hq}xhHKo⮕%85j`pAݧl/V™B6U.﮲Ǫj  :L:wN?0% xi^g%8'Tu(&FY̴>9Cl0r!a"ID) :'ƒ F'I\৭Zw$n=)$ S/෩H6dTX%85j`pv,1^4I=^DbS}mrON=]V:;yT^oU :aİ~?r)ؑ3P| n%ED0sC$|!ҶY{aX9B[1RY~y2 1u g;} ϓz.lܝŸnl)L`.|q چ YDB5 æRmְ[ZSVŕ +/ēpBQxOdiV+oi ʁqFk>P쾓BBZ5dlOI<3+Cp kjpQ<{q *cH͉/tt q0`208rՙ:VdƊlQ?aY';}7riXy 1 _  lH|?E'ckTe`pj"6b0kaywT]xy?A iWvP'ϒ{#O:,C-;lo@!tq_߾a)M?9F5 _ks2p2٣T~P-ZxKvI;GR7ZpCѡ{" M+ޞ3THLKd*"VX ֠zo5[ 8KgiOP*#F0 ʜ08, ϑ^IBZo2.}| ttʝ=W V#-=W2LES8 HU@F/=Phe::gx*tUtݳm(SPSJi1L3BI*@Q $z]E{Yav>Jd3h2̗%47'ܗL"5ɵ2ʠdMG{MV/l4'|4kM`.4+T;ĬڨXqV}KK"rZ6)"ԗ  h:= {:}0a,EƶcocwU<0|1~v\7*Ծ'Ne~߹3;ާDM'& v ._^ž208n ͢at]B^} ϞyʬB!aJ%85j`p3cc$:q KpX]"[v 2zfEnkҁ3h6kXCW y6n(Y.a (Р=x#ɥu F|uy\-GeMD %Pc4NHY~QC LR2e" aFZj#ráQ߇8ʙyhN&wkhXԋK}M/NY@6:׿FX$ձrux{u]0ooC9,ӂBZAZ73ҽ(ج'b۞sQy_ZګA1ev]Iqi-LIͧkSW  RSL,L9IO=almc,Sܗ\MK#to1|tZ}tJb4)>=8eUe`pҨG$y߉\މTUl_6p%>Jms0$J k{B5H0uaw S;G;Z>/hcd4c8ݕ(Pu,oh0;f4.oGfJގxΌDѸIĖw1YmR/|!q DIH{n*WJ0!8`20/*Ϗ*Y={]ێRe`p.^'q?SLfE,OO7?Y20w\G':%/k nF;#ח$ " nXa*Zq>Za~"0/@m|oEm:ĬΈA'LHo&^Z9K%FUsuQYDM'2]jw:5R<#y1г"X!c(Se,ov]]'_npӳuwe$)ΛO3I| 1Fz;%֐?x$L8OǪj G _bOm/;wyGTGVx־A};*l2o>s=Mx[\Pn< e ]3÷N1XabtS ʂ`m[KabWzM톙4] G" T|Q$H)b L)5A|e]ezB5H0m5 _;j_T@=_s^p][>]/x+_/<'>_ӳ|KrƹCy yioxcA2089J TU'DBBtZKMBW%0}2RF~Qn/IEf'|zP]ֱ#GϘų˯V/Hm#{Gf&#%Q!򡫰"v3 ȠF`j``'-IY ~Lw5iZc%w 3$t7Z'_ zac(mwi<[=Ǫ,@߰=6ph\/u Nެ(bdNdo D+F@@2~qnWfvUa3giȦzdy?X2շhC_'L\bt>K$Ov7Gd۟ޝ^I;* KF4>6K[.avkWW  "#2q9!Y8V5T{5H0eK ɨN)Y=lft@"׵m_2:]03?3ؼ~b?S!wꕻq!bWwigګAeOγ{pT8;5JO }+/RVK0rz;ЦUG*$slYfa^b)~T~_VwWo 4 H\IJNqD5Zد(Q{i 6Tߎm'}Dn=f*2EnOe`pj+dȪw>q*4#> q뉳\|@=Ox[y`Qe`p 7B<-+gf*xOM?1$wxũ 4l&xTQǒo!we*,8UϑR_%؁'x+MZxO&W1 DF;ӡh'L4NRO220n0Q9ӧrKt辺B 'Fu\,$(\p@?f|-F]Tҧ\_+UF`jqQޠQ(fU =`k+pjj`p&yL \Tv.85 I0Q j F~OTep s^k[8s7= uRy,(+)ehj[8%v_l*$ ؜#3?h&`LffL f*myH2^B9s=t 1'MkzB5H0a#r7ޓ7!\ ‘TpJ, X kYTi&2×208J۷\C,\#B%Ia m5̶R[6pzs^ccm693 䙵 !C\ ۓ}zvMi7k'MjeN0qR:!)B񳭬"txb#vFo:2yZS8zķy_]d208VcK_(]7~{={* mE)7EW:x&ߤȳ[3?[\=i06A- W:x$ !9'wl&/E>~b8ˁ B۔d#Xml©}Í*>ķ~u"h_xλ1ri{oC0xtO'Fop8V5T{5H01j'k[O0=P%` DgIԔ4]/j.wƎ9_0PGo"ֆ` k``U6Qr+#G2𓏳Z(@ڰxVXP ~;֠tE^[Sfpz $z;%Ca)iG6 ;bC] fw!3Ljn>dNc@CdZnؑ# 6`I4 9o{ˠ9o4̿nfyĤ`tV֥ JlЛrT^쒭ʤM RG{&XEaiܗQJ݊6?XS9xP͹6kj{2@ėC{^$GuǪj #zAvPE݅:$d:hHȊzxҭcNT7Q``~! Q ajQ0 Oؾ:=8 V=qO͵]MGAKHdT/eNt1ȩ(;7ŧ]鷢.aՄU;[UxVea4mTc3l]*0y:tlA teQ[=q@|Ue`prְ\q!Yb9#j S n{q͘D3G208%jqru^Kp,CQ_ O"A2tn,"; 208s(+nz$# 1M}]sdyίHx\e79Csm7KR0 iW5'Ya> Ie`p*Wx4Vqt8.SYz>{woa8Y[1^&Kp,k B.D7|]_h=/i!~Θ~U;c8t(;sG? ƠwMe`pij[Y6IcgDtx-,P%u xA+(% nV8m'RTYc{B5H08cWu/vqcE[(iz.^*Ig?G~CǠw[]E`}"KD;#iE1 \m'^hZ)N55rZzB5H08 4f@Hݪ{?a`Ec6ΆLv+nli37չjٯe`pcru/&{1䃢nhb`.ߛ?KdtttU&*wu4tywIE=3xh7e e =$2otKھ.1mtJ 9{?vZm -ιGe`pc i^eؒ%{q \=E镩M{Ntuں=m{vvpyw׸3G$"d![4n)hyx?T[cUCWSG΋f*)YaTh n,}/BG8;f20>{jI1208:2f_/.+̣.8FV:/mè~0zNzuD Gn%85j`p]J_p=moy}Ies" N10h'CP>;)t-c+xJ 깩\Sl`REzNooIіXP 4%| R'jBxŽl}Hh+pjj`pj@;i'79.\1V7R{c?%)*tdJe=}*[Ǥ=x F̓wf#@j,kTT!>aq6a=Xx `c 9<`t Te֨vsSe}P4qpzjMB4&DzP  1S l#FSDU@Wg`,;~WbIt;Po5;.SSʼn@/r(o9̕,Z~e/앆rbG\;0{ķ 7Vm%CI$QHxw$OрL?IYc{B5H0 w䂜ьqs>Äo}e`ps*+\wrNE`Pj(Hٌ_<;\KTmy:gBjZM,:֞ȷq|ɉNʝx%85j`pPK8l8% Ĺ-ˢx',w!QGg201럜*d9.N,v#Mpy%DZ4Kt0 -fñġ kqQæHV=W͛%ΆMaAu<j/5߼JBR&1OEbM]y 0@ [tEGk{\' K@ ~MzŪ 4LZDyѫ4h.K؁5Xcmw9\@xP(T)#AwC37{QڀO42P{9nuZxwHKI%ZH:ܔ# itYx3l۴7.FKqN3&0d+ee'Q<=kWW sc|&gSr +B1V6Rw8ՃFtV_ږ顪 Cm,!lBg]7V-\ږOSK]7&y0a6u7*{V;wz./*-'T3.Z9Evf(]s .mSHE2x;W"t3Sea2lN! &mPea4⏛eCqH?n,†Q9賹6}0"avcwjSWd:.ORR`P rk jA?e+-"r@øvv bb;;['~?]LVغaT]xT7*(D4RS⟗]48WO!0f -k Ǝ:ِmԹtn{󊢊t IH2*ECLq^Gxiĭ4#YV _Czd3ܞ񐛶q F|ΉX9 3%J$;Lr^5{q=} @~OVS#]ȹnh5yqZfW< Lj"2˶Gۼ3P0q&NiU׭Ԓ $,mj.-dwo gɎ{۾؋Ogӟ~h+[W\W= ~p}/"3)9uʡythI;XA}y"Р7`q5#FbmU9FPp|%/vzDislәTT0];띉 p8t=vUf(:ǃO\KE Xa‰~?@kcB$N'fI~3⃙JYcY#fY&)x[}4 j4c͗!h&|5Z`"c10]?Eŭ]O e=mWCpo K1V>C$p0Z,p҉,]gċ6颗b5J Y=Nvpj_UM`ph#m檁ȤFFxoYNvC'mjG"l߈rB讕8V5T{5H08JYNVGue?4}8VګAђ!E1Χ3]c$n|oO=VXP ƩI<,mLC0.)r]:_ڽ nԕ)vd! _8HMq\n4#+ BF&^PL}$%2j`pQq6tX7eF%g t=KLe`po70J]K'[d2hpf&@^NU7.!9N 4Koyjow{!x'Td?Ъ'rWsOˉz( uo`2F wVka|2Q~O%85j`p$&* jMq1Q#eLGy8/Fxǃ,=y^񘑑1/kgszT>Ƕ4u-;*޹Fe_љy(d<{S{%8.yB5Hp\O,8gp +jk",MCvɍ̹2Q:x)SGe u7y@5@аHO-*Iκ-uɑ)= hXd)3[ ػa> |@mB`PGxw0U.sJ@fyWRN?%H ])R>e+Kp,kAtw17b'tѣ 4y,R6*3|t8o{ÎI1xG;\i܅|#zh=蒇^xy5ǰF~ Xj7"?f;+Iq7뿉^TZA-~(qt8|[RwaB*v55uMH>5;PxQS^PS`ǐڐْ)cwB&Gqzf8A5%g:Ǫj  o%(SL(U^2'z/,fvs,e8,i8!P&^`/E`P4h_ I17%Z# X_D)$H9F\WB7TBwWI_2o,T7{mR6шvd%h${ v:(lc\xGg208iL}djeMlhmΞͿtZ(k.k~K42?Z HN{"}8O<{Ox29 4$w Jsg:g esf(J5ƁFqEnJbR#]%oل4VYY1u{ N tH;7o"Ҥ>x  W<..D\fV ^Ri]7 k u0Tїx;vB3~|Se`pRTwFgu\wOO#cKq_o#LeӺe5Wec&]y" ]M'f7Fkpx_20I:Am42sZ 208:?o]bޥT ߈<[¤DkRCF-|)$8.eؒCZС^ob,LC`)k_3iy*Z*x7Mݛ&>jI 'DeB%MNhdW_36Aԡ'z0cL_nb~?5oC:B^gބmHkt208r #z^!N; #]m?w4ntmTس]]bz=qљbU lWHUo @ǽNk58~'Uxo2Tgi*8b/=`u-zHN&Is6NN:{wRo(=IvJS2)I`Rn/OJ;s+mSA>~h%':xRтbPUь:~z0k{K T|KCŖWC;=Ru@ /g:FES`Ϧyû ]TsoYi^.qO\/4FF/oJߧC:|o[OS?~?\ln ^9%6ZSӅ1t`?? \H5JԐv~ca -q|-#1ŏ1Pp4-*3C~mZƛBY4|-܏se208y Jw< G9h&MfDzlKfn\)lHM9rrޖwv!z[Ɵ2аUtADF>;L4LNq 20Q'fI8T7eԅiz[T珘fQw5#Zʾ>썓qlbm2d"01۩>Cie`pⱾVoQpD'ʦue5+wcƩIH#lczNC9V{ip(*W>KIHĵO-Rn6Lx?Ej1 |AW md3 5*@h]NdNm}#$+߅JwޣXQzo9:NDb51VWbNEF(V׫ IwNVXj U891ia<>AŏH {<[>˺$~s,46ZXE5ҏ<ke?QY t>#y 9(YďN+F) v廗3s.џn{|hYeְf-}l]e|YkS!uáDiAHkYCO D]\v؊vd{Us8E?blheG38ug Ն5R5@?wf#a8V>Iw=TX+$SIt#‚N7E_|. ~A-Mp ,*w.yYhдVAsiq\A[ҩ-!qmFpa3:NHg#WCdmJƟ|nm Dym~͙Su8+.VvtGn9dN_Bk#?})h$egmWW  ZXwŭ3|ˎ1܅FǪ 5'TWI2-9(Yٶ><78Sw:f%AǪj 79 (8;QO?t*Ty5@05#NPs<[j6|xNʲP \q9semxGB=1u ܭv4܅b vС]ण{pm`%sM;ygV ؟`Vw㲂Yu XHmҍ ]1Lx@7e^@|}tScdD 6cV] h~8i$_M4-z_]șlY$Y(cmPıN'_{3;;20X;&M*&oǒgscrU ێ5&4|ЩM!̪&rv{F6`v@㏶Ǫj #jԐuvhnQGxAE4FhG6f9 oOՑ1V5T{5Hpe|2H-,0֌<Ǵछ]VXP 3GetѨ,% IlXn/ LԠjGfIZ$LHǹq Q`r[/Y$G96}9"?:WT~p*-q¡sƻ8j*mXp9ɻzn2thfqmE $]a RiXw n8gc#8&o:a/'\cuj*ev^c-QIZ׽2-Xj ٞlh<{(*VV8c=GB'kj|6pd208n?,u8d_$0D5e,G}aea&EPhm.0\u-e_h_"OLJY@ mm ڇ+]8ȸ"0(,n;UU=J(XM7'͊G6Jύ1nHP;^;3YBB2j%ṱamT#UW .⣩jc@Lx.j;˭20, H`\99g.;~h00 2!u Ozm=1ٶ9U- JSߣh+pbW>~ Of>Nx/Pd [E~+1 ]  ^uL({31!"Rv/AN9r<]N#F Kr:8$3wAL4esFd8)\oFmX7g&r^ VPYeau6Yy5hH= }g~Z̴/wѻG&PK ڣwqsھIEH/1)9F51&L=Z&lr'BOXqϼH%aj"Ltv5VPfzHmUT^ 4l^DI0 Ƣʟ+ X %ۖԲ+wDO;lCңPCJξ^0L6m>x0;)ŢOdOYQOEW-Bʷk47]*|u [BMw QbQ8E'Fep&d/otBBJVA;~g&WNoMs8?sFYxjb1$N2q0FY})d lQ2?ル-=[1[R".B_(AmD.K޼ т7,4xrW?Vuʀ)o5#i3ԭE A>uMepxNt1P/՘i}kW2P8p% 'TD+$[1^Ja;^3}!is{Z09.dCKx|5CW{QHP8i_Xԋw&oG Kq)2`j1\{CY7bLz-v!g^"e-s*, VBV%YB:(iOrcs(͔H3q&˓i; ;w#tP'i\\9Le aMQCJ,j~[@."ٛ',ke6.BwD=MYR7±њ0.mWnR AD gRuSyw*^ϫ7]&pMyQgT^'{Paj[%bhp)h-z(c}QA&.73'u6I` qFƎx*:kj:iL YŰ4jgYfzd$",q_{lEJ9[筬Rg09WgJ8Y ]s&&̩ _=|In0 kcgPPMCY'[k}v[ݦC Uep~?!ϯz3~FGP.:fMϡv*.<ռ8GG_n*L򗣳Ď"%,B- Oo4Qd'KˡwI~XI5@ښ}W7pٱ!RAN642X*9&)._7M.s.G7Jj/ NP{Ɇo|/|װ-epC*P2)n?Y%4sp2I&MSy87l-^>SW WLF޳_(2P߬EE~PaX8h, E4 )?Urag2 a\ٱW(*ڋB‰x:{s8惂b 7bK^J!U< [-]ȍs0q3F~Nթ NL { NUA6J7&4<3UJ!Y\-|K>W5 zҴy&ZE̸IZ)avM4nhܮ6n}]quD/lY\1kZ RrZ+ͷjg2ئ6s.| 3{%Ϭ`HW E!Aٻ0  Xe* 锄Bd~epr9-{%4\Ec~뱁G?Q#SՔW=_|Dю ]@h @+̈ґ"D54PQ cv<l]/,'C"  'i}n4ͺ,^odQKMvrϚebϕgqӌC3.>ScYS(P }Hv55m`MEpޝNO<olzx0=ILq\J E/!E :EbPkrQ{xa74";_,k4 쬇fzmC3e!1|N <]UD휉sSE ƌOF== J罐CZ( uyv#wcw)X@'X""P(9o2q wZ?QF6}{ i*.z -.2LPSCI~Z$&i?7F##^:@WSR/ڽ'0ronz٠?'j.c#B~ʄu%9^]yyZK'8zII0$p)Cx-Eo-: *XajQVܖfGsK{3\ć[j]R4Si)t9Y G @ƪعGoG" ŊMxme1mHGzTK nH(U/Iu)Qf;HgGj|Ϝz@Fqts: JgeO~$vDs;ؐqH=iV&z'圡%@¤mz;Kx D_<<#~l]@@*S"7RF,NV_GU )SUڋBEB-RnEnD"hzRQwQ8ub[!8Fȶ Y #Xˆ@%}k vF5D>тy0(_%Րl:rpPC0jF 4W/h⪻H (j+G=L7| (Oej+G2${B"Wvԭٕ y!pQtP5,ra/EgfE@ "SIWrv}7]5ƉqA'On:ʺpb_ߵ[_W7(1/'M=PG璦S28u[KWf3!*6KF9_@1H)0 az]&[cf4rNVA}t4XW=Z`^oax~o&Qӎfse#ylp0zaŒXGډ "*"hz9:>6)AHKx9bR["P(B%@c/mLM9-o2NG &e\9: iEbbHX fD tT{tR`HWE!Ag*OJlj=z-yjVĹ#a\ }z$(NeSR`HWE!AsϚbH;H:_Yɵ5tゕ/-Ue;_<-GdY5I*MJiRHfs@T4b-dڒU)0ئxY6~7bs F= Fny".S[,sQMs_RLuubj[)[D[6D,M14*v*|nk2fR![Ɣio#pسp٤*ռbE(_7ק28Arw_ar4̗9nTeT:O칞wWĭoY>eh"+;h=a^y hTaU(,^-V=x 트+UT#I%E*3qUǏg7rؙ=ӆ|V r 8Ԃsw-X\ kRҹҿ԰\Qj+X=lȎMe )Jڙ]\c[ʎBW{nwR )#(Kr[=׋++%ŮU9-`HW E!A*\{ OOIQe \SsTr9JyZ0]nt5d>Fb܇-b|!mNI ]}Q0XAzJ6%O d~œ9=ROep/+gzЌxPE2p&ǻzyCf|ɣgse2S^DGk"PQSl_LHȳTS ϓyfMlzS0/]d)>;:Kb%ς_cR4W]#P{d&V1fqo~(Oep~BVT"JI1ivM3ה KPaYd\|aT[6W{llhzٚI/.hRU{QHP8;L%6^v<U3)cdC200M'-^]θuL[ )o\Oʀ)āB th80xwN ZHhvF|3n{j1o/F\QTBSYbKqsz N;9 !TUs$gM90)y/)IӷoB/ >"S/CSΆ"H$@@)i:koda,=ԒvmqV`HOEAhbƈ+މڸ #O|ck͵cƩvr޼;y}ة΍ 66b'%l[ں.֯`HW E!AڷzN-U_벺 Ύw-xَX:Qvzv%klcLRU{QHP׍9|V뒟ɉ].zm`lTzVW{f]-\%P>\RSyQ@0ra>^]Pّ]dޑ+RJ)0L2U{QHI Hk럵[ؾfO{?vԷhRc{ kHZfoq֋wݟ4ߘs^4[e^#Wh⪻H (rHR)=ꩌ&3eebu,st'ǡŞέgbE\^$junW y-\ n[ϋɁHnmj":67d)Ξ B j($(n[/rt+_L-"4ߩjV!0`R~Eӭ\~$SڭTT'7@l^|1sN vAf@XR`HWE!AĊii9w[]Ev2Z ^CnINe atN=K*ח)˥̀d$*p?3-W<WV߷}tS/Ń'bM9ui;+<$Zxj. PM+;&EsqP!W)0prG\>JD}TVϱL:A<=KQOv@>W~;*-ĝW1FyɑRH!Y\-[FK}oF)ZRm{B%~2P8ld$/@:|S 'M1ecP㽿1mcݯ,G:(g茎J im.c &НtqOI!U< {na45\ӡ iwNVo;Ӄhӟz!I7K5r9 _ +O+mȫ0n?%FQ'c!׍ה{UR[yvFnR`HWE!AcQGJIr*INtN#Ca8OII0$pkDWF { R Nu㱏nl.g(#)E{B'N nԅ.DXv8=2I#)ep/v61auNWT/ 2$bQ,ay甯 |m 3Z. Y;~IN")@u)B Uӊ4P#cI@قD?͘KL\QIb)E!Z]2{^'u&dPlu`׬o <\4y\P QnOԫ*OI <{S}TXuQ09 QI!pIdz> , 㞹'wʂq[l }wh {\qW}ξ 07<.2Nf &)0pmz%~ĎD:i[TI2)i$Z. mz?!\mwh J3grS7I)0pr$pbuH[ҜugÃδ#tx)Ŭ=Cj/ G+gcoBH=k0EnCW{QHPK'4< 4i)mCj/ 'fuw^bGa [2~__*ڋBwHbU KӾ3a6Y." E޲@À wj]088[nr>Qx*- ԁ(9,|<Ԝ}BPga{^eH⪻0P69bZ "8[1#q boxmN,]WJ!U\s)z>ybvhj4,#|Cj/ $Ú[(Fy(B BSwQ@PeU׈m7F"ħ =\x}b0A3$|ЬЎێ¿h⩺HHԪ%(Ju8>qq7Dc5Da)ݧ7CVm#Ngѥ"㍋jRwam;3U$BQHP8Ǥ':'f4j4 œ}AҦprk 8t4xGy>E<9po3S0<KI0$p"GW>F41ޤ>S(\S9vQ{LJH nZ2\ YgPnjܙk;#[÷ Y1>^,ެ+Ǐam=B`HW E!A}O_MK2Mʭ{?1Cs0wH⩼( X9@>D;Y'p“Lq|nR`H.ܪ;`H [S.eţ m,VP2R5hv=3,b޸u 7uf\tK 8N*}N&%,Bɧ)n#Xf>O׿7?c#8֠RSyQ@ewOJ2+JI,7z0dKDL"pdvb겝dwb)B)I;]*kHZ@F'`$ rZ ye(J!sˁk$cLnw:Z^Tgm(Qf}PGP y|zk* _9藒.S^cS(hsKd@F/pko && V#u/nώ۳A>\ꇆ;c@\É/4sUgSɷlkzom;N:6dcJjgobE }>01SLH!U\uDzm05Ȭ@S<RڋB­ˣVy."ciF%0`O4-fIO3Lvwmp=v^G'{m4ljv4ٽZ#!Tq^N ˳SlZƚDek'86u‡Q<{ KnuӒBQHft6m˜;72P~ù1„n8RMj/ڷΒb]Hj" 0hvQI:͔wbEKtЯ+a;f>ޒR`HWE!ASU}I$^dd!ܘ;UCx*/ ~=D/)S{2epCuᚋ9o$n|%!п-1e.i B"`$ϐz1뢇D_;WmE@ZA:x5|1CR e7g-н2{7Q,W7 L>]buq[.fb #E(̼U2P1+6)o)_cVe aV}õF1Jy%~xh,gsGusI7YKԴLgIZp&AY LJn)XF_FZ'x_:V^%;}HEbnK~p[,ﷳUUsRM kͩY1mQyb;-,ĭY_M#9:o(3)" WEbR/obyA-; 2P8Vuɋhc$[J}jE(40lhuoot;L8;e tcp shCx/  "pQMųYx`B|KcSݍ oYFax knoF퍋sHs-7bDICTO :#{n_{@\;/EPCCŽiŪ(?Q 1:#Pj(0“[L96&smx-y4ޓ9I)+}NTҚpll[ Owhi٩$-EHA&E6 FM/i>E A}mW0Gz2/EUģu[IY_4ӳ|"P(J#F%϶=ۭ_[XF] $lgµBuI7?c+\c20"eDz:3(I*7-tߪ,c}t` .+lHrS5mq\`-* 7GI;2P8jڕHh ĵs7̯&@ue8mЯ\πf1y}~oyHWtDiZ "'yz15%4( "01<ˎhutQ6z-gxHzWPޢb`0Y-z ΛB~$h|Q0W= ~E yeS bJ?V|Was|؋=]t A/D: I0$p-aG_Od~ Տ?k\xr]$R@Fw]n`nf}8w=w]B%ʪ)jP-!*%pnc^a_<)^}䫎đ?@g));不v3Ӧ9ԃ4)=mm+pPqwwD)Z"Os0lIQ 71(o6<,eptP6 -ӊ2P.JLL wYf ZNDĎh|Ⱦu`-SsM+>|@{nL$ZTq n!oȢHclYLݎ;$ؚI6o"P(>3-kۘ󍷤IfPR?2^)3" EYvƋiK;7(MBL'xgT&/[|MϣCx( qR2|bA9򉉙xepW=g xkf8j!Z=V (95 unFKse{'Gu AbyV}U'9q).18| SQ@P0:0.3.]zx{cy'=HwLS CS}Q8(9s^p }s[ŀr%T-t[Cj/ ׾cFʏd 9ۓN!T LB;ώ{ZJ!嫽($(Կaъu<..e蜈5E(8t,G<χgRdD(OͿuqpCGaPZx/  ju6d:پv27=vOTq^E7BgsZ:M\Q}$@ .48^=Cq2j򓿓F=&H)0p뮍!WR܉y!YG2P9?obH{`c9ٯ`h! dqPNY,ShSq pp8(z UPq]$LO#pUQfW΀,Lu\ Lj_ԩoJ;%:z\%2 !iӮzZhWYJդ~F&S{1(lڢ? H"EQ+JrW^ۍCJ!U\[G~q>0KsϚExL\`HOEAV5_:S '}4=5,RH?$BQHP83c #c:f3=z҈C+2P8Ёwq@1e(YI7F(\"4dzL$G (AA4][u݇/6zkH1J#1MF}Z-)/x0;?R{3]("qZI;}8bAǷD'| 8n᠔d I0$p PkrU~_k}?]3‰YD8v^Ca\m}@=̽ ? Ls {C-9Ȁ1S(KCnG`ek<5#>fMj5ptז/亘2݁{X3Iab#~MyubGd~5(~*X?T_+TPݓ+;hf'TV,\+ӵ~~Βe PH]H.\If!(Mr_wʫBʡ6$BQHPE~/ l$O0_{0 'G<`HOEAwu/0ɍSsʍwh 8*WU?(cK'w<6k.64 ēfCj/ 'q?Dׁ&~~b0 9zS]yʤi]Q!BUw@P04԰?cLvS,#*ڋB‘cKtAX{F3mu"]#G]RU{QHP8\=pt"Cp(eJwhAJ!U\=s%Grl) @D@) 7J0aot(1#[υs.,ԗY%g-諿H (ғ.f,zeQcƷ*N[U2{H(ѹx%DD()@$C+DFNQEfVOvMsb%9;w'p5֋fޗep0)vh~kPzAd2MKĿ5N øwё?z{depc4sb}m@iQ6oT\,N|HKvw/bdBw/ > JJ!Y\-kf>Z Q[s2qkݑ-0RU{QHP8ǘvj)4co1}SB&QHo0Q8I,yWU YqQ(X1aՈFxIU5½`9 H"1+jWPӽCгtg3YzҜ v6k{mlvs$W{gRM }F'Mr52Y7v q՗~565Nt>uMep_t+,ͭ,ZΫ$o~]yzwdG.Ta뤾ke>nyKܪCv(  ,I]/p" >gbea$y%Q<D[yѓ5}^<|1--|b%A WEAI3q2JT`҅z{%Y 7-Mع)v+2(n7(70Q 7D)lp˽_6H9c.LiwY 7))p 7D)"9E(ܸ`\!e, x\d A|XEH ՙN [vwBJ t nBݐwCONe6auqxj*3~sK(s*3q~vPGNz/t^qԣp;Snٛ^X@7L,UU枿'J}Wǖ6|u9s I0$pYN'$AKhGdF[A?Rn'%88V5ix0@] hՀ,۩ n%'A=UׅսEGK;4-FPk(O9yRp8N| 32P&E9H<+qXXD(\+c\EkzD4f'ҿ_AA&y$P6tg?ro(jVy7)FW2 (6QJЋ2óKz]O-X\ Wa2ST {hmD;'3Q '^4l6A~lo^mJ>>! dqPNwu6"vNtt/cL8x"GԼT(ҙ&FpoO h⩾HHYr$"k,s^N7;yBhP)Z. &>B>0睏~1{2w"u By@:>v5%3Q {1RRbQKP=L@zV7"ca JQ r8+d3Ԧ9PρLH!Y\-kw8\o\M쉙Bƥ#>;v{==QCj/ '~F0Kfv)䨳@)n(~*ğCj/ ."Z-+y|2P821UehĽ>Bx\ #N~-NO.CƠI0$}-[yhR/T۫s5\9L cw$(З/xJ7WćCpBH!婻(;/-:T}3/-L Gwods\ndi0T>=4TR i( HP1qFjojT矒3ͳb&^qzȓ e3"OB M@laV]@oY%lE>/gKӯEeC|] ޫ+0ySRo{w Hќ0XB j($( # ڹ3ڽITQxO7+\QN>*"sde aNq%z]i, WJ!Y\-SRhӒ?:NzCKa(GL#R j($(KɬKB !RB*ɼ$ZҢ@fGQI#jeU]@⡠X#kX0 FJ%kN=3{Cx( >8y[Aw^ $l϶v?kyv\M$yX<)ݨXƶBho B j($(c#l7kephQ5MΑ<4R)=LC 󶏪20scT1.tB}I IWEAVcn-2>Xq<ޥ$?+) AlVd~ǛRqT[+m-4ų:IMj)tQ6fbڥƇ yZjճ. +<ɯy[x@Ɛ8Mgn;i%biz|BG:],%-MGzB ⩿( (X{r) iBZ80 rڸ%д*n{VƛG3<Bem?a@9 l&ɯ棙x ش? 1SUJS&6yE)2pm;.lKDurdD},SIC"p;moJ^2qފN{K)*ڋBI ujo |BlW~~#`iVLZC\!8ѝ "x#R`HWE!AuD( -&15'ެ[-uQ{R`HWE!Aw;$JU&o g:[tI WE_B^CΩ7-n5&; {`Aq URnYIk4OqLMMxi#nKb|gHbd+  5SASMҬXC-_h_u8[^3@؟]2^B_j/XړepC>4*_IN'Ed0G=:P7x1Y:Y{kqJliQ2P^H;g-q8L9Sq?2PzZ"]=j iqu\#U9q8Ѫ >E`l'L-:Z {;}[ #;/xŭȺ7?y*dѯ!B xQد!g:)$,BIsU=-Y5Hlв .SE%qb}68اE1E+-##p\ߦxt`ּи0^vBF$8pVQQ6~iSf0 d)v,52P8SRb fgp2SYW!r4#TǶ"P(nrhH$! LJ<0g+bd,@Fk3J:} P.S(ĔOddF/W{r2K±E/$}ys@Nށ] Y'`JLag7݁þ%GH!Y\-[3Mnށh4'fS6&ɒ#<T \F^Y+lTTvP>e(\@*6}0IgCȯe abQ9 6sgY 2"Mz(Pd~13z νI"VyV ]$lU8s\~yep'ob}7^ !V`vo6|]<:ìhCC%\Kb߬epbHQt (yߣ͆r ,ĉ)UWȊZϞ=Eϋ߇CrES!˵O~M`VUjW4{Cx/  &x~f};ҡW?ov3KVE=5jbTT?9p XK7e@X5EPňKEp)},Qϯ:ڌl^`zAC+.{,ЖG72P88Ij>Ks&+`OEAć؇/̣‡^̒Wl۔ LShҽ6Y \ '[ȊdY/sh3AqQKU>aԛCj/ L>%ٷ ']OB!82[3NFw5qJ)퀐CZ( vl&rnXp-5bs.yňJQɬؚk-jcK.'[@ᚹ"i@OaEjަT]ܾL6akG!x@/i 99HUU@~-װCj/ .r+IJ8NX3x*{~ wKO%!ZU{8P(OK?HRgmQ}Nps.<&fb^V&oۄ8_n;:]7imijdĸ3ٱcD<1q|n䄀O0O-qXjk~B j($(#8? 'B4'D iq2,2 W\icu)͎ۃv!-ep] Y]'_&XI<T P飹ͅdقtlpɒ(*g>"W35NgD}\l֮)η9~I9af Ft5%UX"Ѧ'z$m5mjB ⨾(HwcElX帺Ϋkxa.ԛsZ +l8'JC ӊG8ҽU n\V/ZI&ͫ){aBmozT%@MUMlTuxed$FݕOg3r{ԱӑjDUn-epMz`!HbrL-NepQ+\JOEA¾U9`*~] AOpQX^UuOI!U\#)<8YwMe4-^?)d'vm&0¨}L$C_^KsB\U9;)INQ{b0J!p5ojUbַ qA:y˩q͐R`Hj/ *!sCTfMyʥC6\sħ(hSPfdGH\ǒiC8/ t1N-O[`1zf.>& (Kepc,[LqRzEjJj;Y&xdcp頗 Z2I/3 I0$po[˃ >#t4+c&pʶpӥ";ߓd(ܘK(69o5m.ev(ʖwO@ϩa $1M1.S㘸4׬,BG5S*,zRTgHBC9ByG=i2gz.ʵ5qN7e;eh5q w& [-qs1m!&ӳ-y(cjyhGļC,r`GE@<3ζ;h#ss=МEyK!BUw@P6gRz0c6 55lJ$?lژBHxSKyI<%Liu[\w8<2;=[Z76hyz00~_Wɷx̨sh\{ 'Mzfؕz Cj/ so5wE(gU[ Cb7KL1z| nFp^owIF_Yq6n͎ʭ[2y1~'1"PوhvJk HiWQC@Q@d@aUtPOS‘fΰDyߓ 4S(c($݉Dpo֯H?4HGulHwoz=R ɢZeE 'dG-h1p"Չ@J tڋϤ8#Ŋ2|&ё t7ba4,;Ceh#@Fjmv=]q;209MHj!Q@rs:US#Zxj/ 4[gQum}`yFW-TJ!U< [7 Ѽڀ^qȓDHػb]b&w،zC`r'I۫Ѐ I0$ aiJR"ϑ0̵YhϢiORU{QHP89HMDw=S{X( {4ٚ5'kgN%舁g2 sCZ( ROKFE4 3܆[i'.4|FBvӾPJj/ >жx0V_A/ ©>;w良O!Xk/ $#wQ^ӿ2PАZ_gW ĥ-wi<s]>h⨼HHw_ TENQҟb#]*(ZG@woGw ^Qr28\ 9%h2P8HRiR`Ikg B;aj}a]^oaYdux0{q0uWjVF<+Tn}*JЩz6/kOPGӛ#Շ5H-bpkdql4#\-pm3{1<. y@MaѦ|nhG3FFohΔ5}lPw[/t8(TuE$G΁Ef{tCx*/ ~Az>[QMȭ5~DlxGB`OEA^# =3Z]9v] W׬衿h +qߓ<}L@wH0NyVA0`22sw4c2P8h`NM|bU~ gq>q{NR i( Hz@4 <3<%95#A,3lM@{`C)':Zd82ce)I Pc({ĩ͸qYG|+I4Igf`-QWmoz(c}XU$)_OX}T}wep"q&ݞ#ܨ 3bgr|ӛ2P9V>jGOepwQF6wmw-xr'S3AuֈxhSCZ( *r#^6Rf̎{ qۛ҉׿Fq,=½8 dŔ ({]$Ěu}}q܌,:G z{wƺ*_h˳vS<Ǡ1CMdp:[7$xR}VogO_Dsڢ3RYv/g;ihQφ-Og ?="T:9K /Ai*$s+48%@^tů5#`-ֱޥ |\>WD+0x9]غGdM9)Xc{⧮ӣc}I2P8ېuogoKB E-^xb"픷w)cZcu }ӧh{O VL-c_ 3 V_knLrt/f{w#@ON,\tOFQ#vpAΩ }{+-YH0Ƃ,[=w\guN&vsi@FNKSǾv ;~&O!);A~ &~_IRk@~0<1;1f+bc#}R '?:[5=J"Q/ս"] tA aztCZ( XwAwS(59vlo|)E\=ҷ֍y3ԙ^쨾iQD|}%Mg#(QhNsq'秀|_J!U\cSMtD kڹ(E5e^n8B[tyx>K{-㮌U] ͈P/UIp]i-t;j%>2SLep5 q;(c9];&)F )CűG$Y2P8ڜ RM8jXlKT$d qdjK#EJc8!1<(5C&@ឣ9% d0.u[:/jN$qNFrZw亷)@X˖i\JB? ~,&%,BiS'+㝈ywyQ ך(-6mBg] 7"#'be 8Տ ?d(ͤzO?|XQmAo&Z~9N'5R _KωA+ Eq0r_*W[*WLe aZq-*c]TCC%~3|ӗ> cS򺷮/VԄH&[ƺ'}Lpl)Tq^nh[z驇;*Џ 8q(dQs;83< ;wBnb-R(IoJ33p1ӛqԓ}/0ݥT=J*({4l0а'K0LQ xi5WJ2-V?y44y AЂU@P0w^m8.*pwkeAfWlKc)CZ( NkJ".hsh_x&8R 'AyP \G_l7R@$k4, dqP0K!3Gؤ(VF3ͻ멽XL% ;v>-d 1WJh b9DK9Q {;B@RQENgltY@XO(sوxI*akץ%pzx!:Gw k`nԫx-(S+y+ާ,[$ٰ?3d* 3$햠.ǥ_Q>U~S k31yHK0, E!Aǫ[j]q]5,7Z"U x߾{glcaq_$l]=eWS=d}1=xP/m[_{^u߭`GE@gGewFdu(f"y&η,)ce\t}1 T$@:궆,b/ AOE@}rg\e Z 7tZ~zOu{ɝSuݝ5ƥ ph_+ep}$R'worc P9\.p! Y>btA> Z5%F9hBe!H09 GZP~O z<6fif-0ڛ U;nG':~AepEBlCaO^ 4OiCL}_ȴC6̫${@z[9ȑ%駨~HOIx$CS8Z4gB)yV`X|p&C骔។x 9Ѡ ^@ZV sl6KzdkYz=d}Pwe( _32jziS<5cty0Eef[,sqbVnI,/>s,4\󑻘/YԸByWgx?ᴣFH<)Rq#,- VS3%&ӁzBQH5aY;* /Fb$44I#p6A0UҦ)g~ꍘv7}Mw4]I#`.rSZe&p9E?] PA }e2C{dŧ{*]_rW [ D Vzq{["JpBVC0 `4\':RotkYfүA}q9n҇'w $ͬccTt3 5B 5)a C0 =SheRf^A< ZPuzАhNAYfSԍtJ~'Ȋ187a1| Cl V -ؐR@[_i ^) -~6kJk(VE.[Es4}{!)n |tL% ĭt%òP=9wV"c'gʁCuRmL{盓V`XWE!A<}yQ뤻&FUw@+-T[-dW :$v`M,soSF+V:1]2P8nט}#.I-Xy#]P@bi{~T לu̅-j?4W ǡl$D%-, [1FC?P n)8u/(N}O OY :yf G4ef̖`XBUٛ2g']g- n4R~~^Y-m>_0Cɱ+T}K2z)xR AM*p/#[_Q"zQ'5븰@H%4R]93/E Aω k%z˙n"޵nD (+g&w"Ya/&P;2pY2{H CFv%LpԡiD(v!/btĊGB)3E~3@W-!pmB8(fۈue2ϨA:!l_AxLJ&7߻U@ 7fNk~X8>,Pݵk'<(hn1%Cm&}f Y^(޼(N^@F[lK yH2PhVJ6C\z-_r\\ݢk=Y{@\-_n`OL78[ekvW+Z 7&zR'Q_2P1U6ӓw}BepcGPbM@줠}󎖯;"2P81RQZWxE~o$i4' CjW_f]zc 5)rvd#:ryOe Q`XPNd8L(lr7p FcH-28[UZaU\kVoV;~C>z~蚂'|u kGU i=+WFWjF+QZ<~Wn"`L&J4-#JYҎ;(͑O8EBQ¾ ƈLM HM%[6,w>'Pٻ(9_h 5^gR^t.@[2넟|rF 61'K;+ř[FPH?SʸkrnTu#umwzFJE uE3\BIg2Pw.ߐ66|*,t=( H7_HR;6WXl. *ڋB-#B9&LugJ*k(\ʩSY":S,kcv2Iks <̓)_5Σ5Mi2P̂<4dKG]s1q|c,e,9؏ æpMI zBQHPxD>&lL+A/3(\2#W3S=i46Rcn2d,<58ԘMblVѹ>~z*#67/)X":" Al{4 e-#qg"薞V]gy ܆1Pz"P2P8zsRNQ(7[㠔 oe%0fI139?^G3!0h20Ήt6By?g|t:`Vnq[chk4 CԱOٵo!Uj;s%%c e a)&_v%1cL CWEABR8sݯ~E$)|RZaU\[ή-f}ݤ^"}s(@,w:5hӂ19&(u 岮~鹖5+=_zisLw߻(T=O'<D+w=TZ^W7"߼.=K ʼn_-u+$9t5LGycVU{QHP8=)b&NڒI1R896Œׂ7c=O,_YYkZz6vVt9rQ$ڊz;{<ݎ-&o[?(_MOugϻD1^ݓ'x{UZ;w"-K:I eEh;OL/iJDGcڹ`%pҙ-Ey>\7lg _ H%êj/ t/X֟Upg_%]LdzJLep.9wCkGKz鯡' 1eh jQȶPMmeuVFv3[b>\TŰ.=  "~u&Y7R4~eQ 5V\^iuw, ;qp@qͷLЃ)IMz`Ü89/ģ#g х{5i󀢀 aE2iաr9WPq>~5v-*Gƙidm,CDSrZ$S=i|D>߅ܯTJwj~ze(\saw[($ʟ/LaRp+ɕzƒ=$>ɁӨk.st2Sz@<'k_[ڗ?oJ'fߐ?ed;Q7蛶#gs+@0uM|bݫC,OZ .:D;\΋v_k>g¬pͩ@$qJ1 "\P <%pU]^(k}qo .p%khЦs_ >3?YmڛݱO\ GHD]6zz({I;d$co<0o4vL6.2Q򱌶xC3)@ƸyX^?-Ԏ*};~gSꜾRX|Moh I9%u{+w 9&LK!*ڋB}پ+)pcܓ!C6'fSϯT;1܉.+lzuOT4gy I..sik7Ư;!ji';`fگ0@S{l s(=/밧%Ą Im-:$vzɬ['+n=W eWoe aw֑F|+r tLcFO>>z2g nX9T$6Xjg29{qf.U.@{tLTM'{3#:7Uϩ 2P8:ܯu1'O|b4Qdx!#l݅ ͅòPn{mϙ>c8"# 71\k(h3LILo6L`gc긥}wX~=+ӕxEX)m[?2P8 -=8=q('N)@jg֤#ܯ1e6;н0 zjVwUbszS EΙ)&d'um8Q r-2)j Qp|"Ѥ^Z +q{+.bOd\Rc1LE&p-Z%pbSB](}\gzW\`XB­#mylr o<'?EP܂@-x<\z(K8GL}GGiV~Wnd nsun-#evr#a4((&]^Xai'f]+ ݓ緔D p?stCm^@۹j/ GJn+&couš&V|@ǠnU s8.ۤ+:y s͌]E5.{ek:hM#6ve +0pS/3d({7"=)tm: 9Ft@:!za95m2P8tX2Sip&*,_ZO0ZW_#ϭxαQ |98;QMgAepC2ܹ?۩ $lݭ#ϡu^l4h2P1|w9H×rR!@F] BSW5z4`'|9N{;ho›|owRx5N1DX(OTaq_$l&A(3%_xJHv㙘~$3uQa=^5`OEA7ƠS>1tƣ;UR{ܴ9 Dc :Nrlآ lWN۲R:ϗ 1_/Rl|-<:Ѓ;4>>bi eq=($(o`F#NW^H$FvwV@}M8zSbESWV`XOEA12C,FLRf0}@ڈOe \[# LU:ѯ}EI9z`y9%Nյ&x7EG(>ZJS> 1v7}sVǼ29'D$E`-;4Q GMsY%3"x$ FmwQFwKE8T"P(2:Nܹ9G^҉W_P+"P(2J)Wq)PmZpQn~ZϳعiG$ dd4@U+nLZ J@&:'Cَr$yIK0=O(DySmIBy(6.A@Ps XL>a%,,'5..;8^UE2ڎ ip߇XK&Ӝr*B ŽOxi"6^<|y)茵2X2Rݔ«VU{QHP8~=2Gġ0]"+b!` bL,9{k<8.X2P8>n_NĤ`ێt"mE}Z@#Ă!^BRO B]͂P'_&tP.-,'[{(SaYCYk*sEJȣv,BLB,]bc+%Y9Wn9kʭɍіn(^`ks2P8~tS S|Nꟽk18eCh0AvQ X)9{\}imi&-g[C!-,'Ӌj d^'iL+@@؄2*:%+C]O\-,'*K6V20%8YOQ8occoLZa{BQHP܆q)m]#]@x{wo^hy-z~3ehΖJ44J;h)zlA%@Z3_xJJ#92P8m_h:J?-c9ICUOXN; 2''Sqt*Δ蚊S޼V`XWE!AACGM9[bExc$ n+9}f2uasiڑalL L$snfr2:tG!?}]~2=c2Mj q1[`"[6s(ԋCr\0>vlH1y0` 'JheA1 &r'ytm! Ŕ]q]Μdz'~C60* S p ?Soܻ Ya/䥂WKZa7]Ў 1rLgZ0b: j31  <ׁ?e]yE v'@vC^^Z/Dn=O0eu5&l'N/be]CWJ{~N?g.u5rų"|x:dӠ Q#VȦ'i=׀Vod4tu MWiևH0ak8ʧv'MQ1H\>Hz2Pnu\du}=niq@:s ⨾(Haͧq"@*]B قU53̰EF @$BG uBSe aP`ѿ-{9z&KW[CQI4+`7eHizE(_| uާx FľXH`X(|uiٛ5qԨqަM k󺹣OU>HV1GLӜmJ?|Ҵta#ֆ;zF}]'Gn-aB,'9ll4 Mepv%n]|EyfwR ͸3؏iVCeN;H;qO@{J)k_uݴ[[u?n#9B/ҙG,jC/KM)ڙcyt۔] v_ ?e_ 뭼DZȏ>q4_cU4Mgnm,<$I|>׎Ipk2}U+`\bCߥ>cd>E2t$>M%}mOuǡn)[H 8+) 2PVW-)F{df2PI'<3)4k÷tF࢓]lAkBǐJNӢkmٜiJLO;^hoZyTy ﺿjއO?_75Vůo07r|&;_وn{+Tz߃IMB7 Sf9p;k[Gԭepse`*lE(u-^N(@SQ^@dmQҝ#g\rrzedz`V`T=e\|ZM?i/NuKIāD1Wf{>-섿kDiji{hSbi{\\q{{n.UϼTJ[Qe\(3seXWRDO5\)Ч:݈.#^D-qY`EYHSdlbnBhI [uU]nL/GvyD(\s"+7ʺ~8.xeoLOnYqxfLio1  j<6d!^UV(bix c7&;?Z-xi(ᴫ!h⪿H (ch*@Q4zܤ\ĺEViH_-epc5OwNד[Gby. 2"2[AfHtʗ\@x|c+-=s!fL15b;vD$e&eX*)+2Ug#!<K&'i e(fBlrrE#*32foߵY.QlC`ېFZ->9I9T06$4pu 9NXaY\O( 'qܗ8 g6I SWs~], U<%%Lm@0v^PCѤD44 ⪽($(:Lڊ"6 l6&lc)I'}5:z*#|6_$lmKl%\7;a0FOHа/e"La.y@۶eW\ݸQI)ḩ?[:t۸3k, UkV'YjcXc̨N@u06/'G0QK`aDf<0ų݉bdՐ#aH mA>Ry=x}o=5Q8p!Զxeff *c E>\2P8ޕ{+5;I5_)o5ðx/  湰QGd O!|?e&kv/O(z$™ޤu)*'qSldXOOl}MN?[?3ςt(jt j?&C4m[Veg^)Kϥƫ} 5^-kֺo?fT4!ϝ'--4B UUSltm[6@¸yd0Ε27oxc誏A陃<؃S@ oR'5EPl;f"b2{% $r*5~7S틌ݓk_D4Nʠ& b<R :^{)|-et=[p>M NLe E|VVZXͬ'Y:^Z㢱EKjr\Zgh %f :y@0+Lw+m$67wo+R ,7Xv%5긇[@Wsq=\H;fnfòP1j|t_iScgOy *ڋB‰D9|lڄպ@Zwy~=џêj/ NTavJ 2XR^;202" ۨ)dBmTTkߙ2 2X0Oc5ZypÜgX|Ni E!A֕Gf5 H"H Q 8#c*Qk(plKQǸSW C>z_9iLV/kjc N軌%D,׀x|i+B XzO? Ѩ'`prEߍQo[$e,33{Xэ0 \R=¾hH&-,'wI{]#2~7r xee%:Dcmx_iJ-G4Gc%%F}VU{QHP8lki5B)H_lI(HC܋'1.xf/lPN]&)+2S{H 1p4'k,)4>8}g$+⪽($(ܲm.ߤ:,LW4 OaE3B±#۴3ԙΔMSNн*2=$dMkne)nKR+Kj"H0ɭS%3;*^|F]v]uGێsg4mT\u cj/)wbwzuB41ՖV`XWE!AvIrf}"g{T_GT6% \Lr%4ַ2Et>\5nU+͚f%zת,{[vW ?m ݞ11-2< g"K'm055uMVKy@Q@vUrz3RDd*+3 H;Ƭv!DA kA^>ĦmǑ;bVU{QHPuAW퇮 OP]t &]]4 IK0,EApP . ϙ)g68 6ӘgUjj T^,,'~8 ɬ6xDQY`e·#@<3KyqTc ju9WKCyB1L?5OJf Hm3ZPB|\"r1i! M` a8귄0L\L#>n$t4XE([W+k'g Onep3ם#cr$epjkV3辧"Pi:U$:dd̈2)M%SnUjPIS n%RNb zBQHP8lU-)!( icbuN/nj5+4t1"Et4vd 7ôNoOe83q+RWpo[5ohɥ $HnZuR>^EZ 5 cq SHwJJeP#^bK(pP }~GܱLj@2& v {нĵޣ-lj߹龩 Y|*Y=Bbe(x~}w<{J$T=> m m2 cF=}TS&~{ ~{\J|𸵯:P:'}aRB1|P-jϷLZaib'ú']E9E-i*Lephܭѩit9K̖`XPN6ASko dŋ2Pa`% oep& vp$y#R% AOE@I3pW7JFWa;/$^NN$B="71I#_DǔzJjp3+9!׺Q$6TaQlL1nk.,~f-LKGlK5;U^xBN7PG|QS[ndH?8%*[#._qó/5 fb`95fGֈ4h3&$*ڋBZxjҽb]-|s:*FLcڨ. &F4ӽЌ[WU42P][`}9IW\f~rvoG>R=v@oDHw,OMFߋv2H/sVD.i+2,āDyJ\QCz)]zkܥʿ==+޻};tT v^oG8j`iWgJ3څ w N jjqEG1Nzn>bzh]a|>^q_aQ!iis*xj/т3i㸐pn4u {"y4БEGceq%>? !9ipL αǝއNj,K&=R=Bi;aX<kV4q]NR3W M0<̡Na䪻( (ډ=ݳ5^ @#KI0㗞҆+/3eKp[{ .0~9 wtzd{sOYaU\[z|isRBfn?C8| _:A#/) 03W"-,'v;%YFV|xcʴ!%'|aű0.p5>aTm#>twVMSblu%/7$e&+RK`5u_4 ȏh磏QFR 'Vp]xΆhֱFĀ VĀcKl" + uՊ~uܴ`RZʟgeOZdDLQP%bI#ά5@.LFWh粐Et񅖒%*ڋB9ȰZCZSH.9 +@D6}hO6:zxc'i8êj/ 'ZND*hBE y#r.:X–Uya&G$xq<9(cЊ?XUs2P8neXVxnJfO*ĵ=m1nx~E+acJWm/+v탷59~}ߟpB3v>+$p-:')^EկGWK0, E!AѤ>KyF#fF^T7r‰3oƁCJoٌ9s-1g:2 so Z0 zii7Ϻmq!TV yuj| r+ARzw:C%q<]1كW2`?/ZPn4>2lǤ'_6,āD'z|#DШH꓀Gغ<șW*ڋB$-˷-fyQӽ7+tFJp"{h])A#^<:j7Nqvj; Qݍ|DHޝYys ΢ Nz_O(0<f8Іq Z3]6~,_,#d9"O=q= s]}p/mL6@iUq^n6 A}{02P1췋/;p#[@qOܮD%Ed-^۹$ $uvʁ1:QeiOXYi'P,vŶ%x<"gxTr9NV`XWE!A`y4KX~@ڐ6؆ \蒴k(cTfK< % b%^[Eb><"Kʞc3~!XrUeh-ҥsyL O ~)ZtR[kӣS(sWmpi1n^V}?J]ߜl_85S 72>ZƔ_uD5ŏ6e_ Z8\A2òxP$l&urTnL}BaRRZ-g/oA>S- <-3FVZa{BQHP |וէqAZ8; "fkk-rTO0n#:  J KD Is|}. AWEAu e]`9C^g>PT>gTW7Lg=6)f~>u#Oݖ/OqSUZJلu #[k$%t"cep4^X|uEClmS<5Z_k{xoJIkJ=7&.$ȇ}CІUOVi|  Z)+k')%%3}q&^J7@g:D7O`XBZy2iÅJ#l̏a00t8c|i eq=($( ǝ kdZʁ.p4_٠,G&g9f40mzӫ>g9ۇޙw/k j1Oc)5!vG_Nyŧ<.%pYWb`k ;~nBk&*ڋBѼʸ)e7=ΛdB?u rSzF"q Qrj:VI\<1:bht#`ìKˆx:Kj]e7'<6!E(1|{~~)ha + P^ҦY ǞXbQ4Ip-1~!H+0pѣIڢ*rn(GZhq"P8Q+pPw[Hz.UQ@P09eKLg8iVKR)LS* ⻤sC,OIK0, E!AV_&6#"#ћ1_܌zd*닶2\_Ƒ#~әN>@#qm{B_!ep0v돽ga20uK49){kqY 7yɰ+e9{ GVO}ztrkd[pxhO^}B3$ò~1 %I TBp vHߔ& AWEAę#A1jd*˵Xu] %TWmoz" ~Al, $ڹM(=|Gp1UQ@Pe%Olq ~D(XyB[AlO=|fK(Se=j_tMu=epק̿> :OUkwhW aPʭtAIZTna_l;͢XF_ɰ~z^үxxzO(\k60I(L{( ZM`W2iU%p'#$oN*-Cr*8X?ۛ_9nŚ1pن ',,'.L"EӢnb 3MUSV/2$s_YFڋ^Htփh⪻H (WXaj1&jMfzaqn3SsT엺y}E-!޸?kwk"no\RbSiuKSDs{x4GtN4@m;ӄ\[ο& 6*=W`{B.qpN2P8~j͠mvղci WO=WY J_V:zH{l3`XP$l>#]f'oioF Sdu`IpQ̾͢IԢaֱE%]Ho'>JΧ2P5|ϴE"-ZEki;QY 7~b|N?j!N?)r<)Rِks8`=T 7Φ!6 +XfM Bɏk 2tm]Rf1Wr4Z,-+l>$o CGET_$dy8hunlx"Y9ٝ2gcFY^Āg4v&K0, E!A]p -2/2m+@h拌{/;2V~=hKB gMG]/gb&mX@^ s0 9<'C=BrqI!(!/mi;"(qq!i eq=($(JQTӌiF*3-_Ӟ3_%2 &}<8ȩ $log%4u @!+؆c\ S(\HZ_'3nfHakYT'5/g *-,'UŎ##Gg缮htܙkDVU{QHP>1ub.\bI?eeszj7Xg+LA(d:*% ?H)]%\[E}]yyAh_HWs$kj[Zj/ iPQ) .9lN(H c5*i#M ⩻( (ذJlH% k(Zzߕz+l!E1q_`9}Y@Zm碵E\ 'ReF,'#W&6L7b;?w|Md}T9dh?k/awۛ4~J@vW\Ng(>V4*#~\+pdWI>X ?AK#nQ _c8j EPd &*MW@~ *FJI +=V:GJY!IW$LONjߜ>{Tyr#[@$ (wABŮK` Th2m諿H (nO"s=[Q;T"P(jn A5p EkDtQ` {WBlG!Lq/:}& myBGCH61z uXE c'Чl ⪽($(Ýkq >ĄY'uQ3 ⪽($(GF?b=hL^4N2P11P I3T9sdOyA,O g+?~Yq2M y_IWյmRϑC$\91Ŷr$7~mfQ V`oKMcV 7D:| jjGH) u-s,v~#<TQ0m%p>1w-bhQ M"VKJ3q"t.FQ G %6,w57"P(v_N W-yé ne[3> uOJ7 (t סɁs/hbD)IK0, E!Aqs2^6e P}z+GNbĖ)ţp'l[aX<as`Ō!LB_.  }$%0*nG\2"1͙|4.@Ps 'Ii}pvߛ$WVU{QH0;"%$ B"_&$2-׭ǹO/M5-S(\ğ1o/yS_.\~ .|`|K0,EA–֩ EK]Y9FnS}YflbZ66 F,-H|f5ð|V^ V̺2}ZZ=W^ 냌:RdÇ qǸ|>j Ĵá i-D &9I#0`Y#ljׄo,b^51׻9"VU{QHP89!wt )#橻hǛ-C tR=Z +wB: O"`'vh m)@1eC$Ґ$ !'>)K6,|rV77*˕O+}m^> ډIM^ .?y5bgʴd 1:IRjî8j/  N9˒n:N(SQo~NI ,j #qȷ7 :T 2P8Z]P(9,LD!y4Y@F^c$-~ 1ef13oZ:09({c7 *9TE\X~&sf:O'+6M9j71v ) q i3:Om޿)%΍E,q~8DDTn }jpqƶ Y GVMbpWܥޡu9 9':]J$9!&{VѢ $u7i,L f[7 'gf OòPnݖA3Q~D^i ~|wv YY+Qx7J@a9EԚOznJ[֬bI1 H@†zH)<_uF-1VI8ќ ȕ[9).IbҜڋ[fHȥ[bH-ib4iR\ Mtb3]x&v`lvLx#݈#iڨ. :[0<bWᐢ uox'$D^ 1#.Ꮨܤ$òPnmC-:TX 1t㮛{. FD:_}|!h⪿H (X;3_wޔSq8C_RpYXӐ9| ⩻( (X_sVpomcM/}I+0|[SHTӬB9r5WuQf:c(6 hB~;$@'=ҘD(T3 ;2Cwj.2PoΞ1FU"1}›5쵺x~ zBQHP8ᬣw؝Nf:D ;v:21@? +0p@hj5Wjsl|}?܌ w&AN'\;gzNe61* n%o;ߞ0BZbǝF n4go}2ςz%:xϋT GOi7KM݉پ;q:@6S ij-닄]w7_&Jӯ*.yY)pCIߎ7h8с# 9#]3Ц2Ǐ}uL}5_^7dk-B!40X˞ ^E\Rg)=q++8Q 7~T?t8wˣ?Rh?G# uM`XP$luM}q|ݧ$n1E>4.2P8raElȣC߸BaO5,cX?\;[QHFyT ߄޺csm#iX:&@_Cf_ םҺ+2^)rgtvm, ˂7wh$~e aV Ikwpe`/QrHЈνVtO0unmj ]1tW]~";ɸvL lgT_kގmqɬ`'s_W]?rێӤ0Ti>]04/J<;/f>f uA3Bq4##Q_êj/ Sv%ײ֕k[A/I@<UDңfo(PH?9O424ҪH_J)04Ati}i:VJ&"0H 9^p4]>t`|Bmܤ\MK3 e$ndݛ @y677̼\oq!39Uˮ\W ꩿ*EPj[X|w6{)榽tnːs(T~mр >z5.zr `J(C&W Joc#Lqe(Oרj-ދ^ӾW&zN.'d24\S婜VZ` 8j7otHځ|u.R'wE ƾCjJڗibdhLZFr\K,xӠpG{5c/)Ƹ'Z?d(=v'ۈ".FtW` /ɓRFa`HVOU)T?$9yOi2gP9+_QB*-QQxsvqҚ'AP;B`v{i& X}'#D̄ǾH9 ̜ -Wa輁SJ#ztQd{g"ZR~?)rvY\(L9h=zER?\Q4!fiiQJJ䪙 m8h:OuzYޠ 7@%h>~2PzD8r%1bKym;~/UK(߫W[O"&/^X?VJi['D֮ +~3yc h1DK@9$98g-,ӜfVJonA8wqf (ICYR|tnXiz-(I5uX;s.H8<-e HhC^Uu3D(=yg2x'"dUXwo8Z0'oAfH%49 ^ P[sRJo3i͍;$.Q_u_8Z0{Q ]>6dq2ZɛO/}݁@*|Mht~UG<2Pzsb͝0Ε <\@mFps5-%.Rfssҷb,~+xp JQbL3=zl8"CFt匘QRIIJ8,"bqPwoh0T_uĉ_pw0~e폘KKD r+ƽ-?;BIV/C)AA/p8JVګҴ1";oӽqb҉g)dg96ᄚSg5L}o,wDɥʤ$`0lpneGp2x~>B6/;|z{gnl]duي"Jr "PV1*MV;81QVަi.eK[*&O0$+H^"w:CꛦCZJc^zŀg)kšjByڇ8!1jB @YJ߸%[Xu8+1 d|΅ U6"~B/g j6hyK97IB jP|玠@љGz%'@96?Y^J$p` %7k=3Ӆ򟯇q1-wP)B ꩻ*EPjG ςC^*n6F,hӑ%e;zjFXp=y˼Pe(=fmݙ0)$7~K>'GKhY'F@2 mHGšsiQ%jGgUxoFQJ>(!dL,e19YμBiP_ae `Ä-b7 avm}~ :b-00X3[KUOU)TۗJu`beEEC{dE6-YF!FJ"2+#Mh.ǀAE0(!>5Xf쇻VMO$Ł;i! 4Ag*f߶;P/ߒ`ROlF0ybchZ2RDRل?+Hw_hVY}eLXBoΟ%Ȣ 4 E(/ݧ0D(=6 jL7K渠8p8Q:D 2|Z@3Nsv1^֣yn ^. arx70PfAoFp@YHV<𐾍8ޞw^@߸¿X~RfWcŽ~d(_ex_W}ӳe(=_uJ%PٳUDH%= wUJLz2i_~h|Kahg2ҧ2?W5CGI<ګ(s;Ú :s;j싧8g#!9bezz8z)04AmGf߱P}|?tx< &NAj(LJ2!3' '!w'%u5mR7𣌝ޭm).g/ \s8ѻGHwO ЖJy>1S8:b!_NݴVSTVKdjbzZ3Rv_c:@7ؐE j*MPzrUKKDXܙW~>G(pЍ){#O ^Ӹc|~" vxxG.ZzRVF/3?4s(#ZpPIL= 2QsUz+p@HP$Dhh=wg/G]G)r.r̓Uy/Նcc9ph%WR -\la\Y}2K18ߞ_H`l?HYwya);i4KGD6{(qb8^zhpGrѷ!J-=f8Llخa^?78o]?W ͮ}e;x@ͥr܊>(׿fU­옻Ck -J]H!k*MPzbs*'FvEJ~!RS|Zlmp:u:9p (X'w\>!=W ՛ЏaG\"؉sP^d%ԕseXf`A*X2Pz|ULd`%oKsa`@2Pz 5~[R 1%w)`zuw7>ñt*eĎ!G0tQJj\00fDoGw$BU3:x;^Ƌ]EYwoZgE7aP yGr(]B>o,q!rCidD.쐁;F~$ҵK!Y]-T JOtPOeJ,V ޔBuO.$b%]TsbFmo}q[:( {@e զPX՛P;]9M\b,L[ "mB i*Ej֕nĆ(lKe!{(^h4`}|#AD?e"Js!/#N8)Sx ~ kdl?i*4EFnw蓿'dFX14/J%E@TOu-1z0li/)NGYRm B9u- "@Q]4' nGk,!Ȗ3͗C`?v״iNg&r툚E|t/M?Un5.vkkְ̮ARx*26Kv>)zLƏi~T_}Nh3XQ:?/bJ?2vT;FELPJ!U]W JoiMwGL<}g5_ـ2 te-_|3Yw& 439m8sƭR`HUWUiWA3t4/L͈Xٙ'~#qdvE"v]$$fl*E3D/εqۓ:L4TQ5JW{U˟pwX 0p$̌F"BNLs6k%s? k(ym HyerhPui)$oeqm_(Y~{ 6wOl Oq.N@M` ׫t[DjPs|޺趱{PHJM7Յ"ؠ+0@#H:1RS:tHO̿m.1~aףJѳ#hꪻJEPjYᙃiqأ?ZKUOU)T?/\oHq%eFl੽` ,161e {mp nF/vb%w8Ebv.R㸌2;FACEc2$2Pzӊ|ģ,f&.crI{eD|ye`VGURK0f; )?QE)}?>HInbFsN)ZR0 r]JGd'Y9 ޜGĻ4:dX^mYJoNiz-E6 t%fNI Ӹj2Pz@F gƈJ́v ` I0$4A9&FSzCKαgCPWi||G""fzZ/uo^w_y6)04Am}F$/XIDO /!tON6Α,HEقq4)D.h@ kEA3sNY?Oė5T:R rA| @n p]&'?ԏxsJ %QJ9jSMgQ% [vک*c63(ZJ >fLEӮx1dQRmrrs$QQ&[.v^A+谳G=Y( RAǂAE ~rt_ĵ|u2+ANl$wIl$nZɻnCU,x!9&D4]b|߉ BoGQDZ-eEuh }BDA®$էܬ0ғҒv^hd)z|(%NQWpV!X=WJM㘀I;r]ӻ^-%GaWȕޜ-7ŐѡV]M> ̷ADzc5-y}().j'kW7VC9 !/\4(7Cqyfo(ʫR晌vMT qb΃4/^壤$a^-'7V 4`t (͑Z lo=,U{럟$2jƻcc-L9AeֽLT5rb|C~U|]G\mʞ砤ttm*E޺oxKcDBO!E0!?#@G[#GfêC""q;R_nڽ1 ۤkLz䞟IVRmDrL Skݵ@z2%nHBHzE!䨹*5JxM(s.Y| vt, ; Njڨy{bMtx=w!䁐R`HpM`}*ftޔb[@鍖)[pn7ŸGg:~J9ɻC@U ~OFsy0Ε\ d +R v~Fr'OmNjuZȗ/\QFE?E]'Y" = #Z*i*EjDHݠ6G9LPbA|OIKήCZJ~mZ#&"yut}řrT!T=uWJXۋ} "Wj+Nh UD{(-bb6SpЎƽpoKCZJ-W[qcׯ~T#+Ma- JȲXh&<;G`nF?(7:`iRSyU 68kw_ lGz,*Mzi06-%vHܻ5 P$F2Pz"cQZ`-ppKBt F,7-lyto ߲HI0$}-T J~&֝H0R,ޔFh]$x`D"ax<&=TŝOr'd-!8r=x7Ƅ;-W=WJk00 xQ%)-<ƣGf`+2;0BnB"ܳN|>8Uun/{(=5W/6sݷN.n|#yފ2j;rooI[&˱98sgCZ 3$ I$t0 s ,7}s?!9RK(9S!xZH ēqQ !-ef/<9_3Э zx0T;ʴUNܳdHYٛ Ɓ!@**J0 j9 9lG`ဋe S)W֟_qP$ %-Ex1/} !X=WJmJ.urҧ"q7- !䪻*EPjۀ'ϋ7A( w Bpj曧f|; [iiKR,d<5PY#V'Rc1Gc}3EOS->"uk l-̾/WA(/exDBϦ[@a[UX6LJ f&Xh⥣$xIٴjӴ&aHmqQIk*D '/R{ၝƌ@齳!9>G>-3Sn9r/(&қ_L,[ވ* O`?YJo 3DxJ hW#RJ]a{՚x@NQf ( É{4|#ve ʙu2Ib'2{f5)}~i=kBLm -&ǹY$-BރhK;4b%z`"/ B@P ="gb(7&)[{rԪۥ[Dרt[)K'gw+WUOUٹ(5se1 k1@r_H!嫽*MPzgLGK}ʊKWi=0-o(jQT5p-T]uWJmg#a"nXxMӮᾋt}v yx8`HVW UiۻGm/J Qfm@%#uv@?D|ЅduPTkfcǏ3:Sþ'`eWL RR1ؽ|&6& }qm7AЂUt>iQG>eCOhFHh@Vy(ꩿ*o!#^)cN#H’'tG;CW{UD+ aAi]="DLQLhg(R`HUWUij v)=+dZ!t#T v >)Tu^&(=q2i:nt?קBe(tD42lުx]> Jn;x__w,ƷjUD VN.Z9"~F[h:x` 9'bJ 0vo9 [0(\l ןs]: m%yGB`UOU)R.0 TKAK55R`HjJ޾F!?>Ϝi퇝 ڷ \JYky%u,F{RG8!g ]B%3Ǖ; ]hY I #o$2PzSqA֡M*[YJo2Ucn8c2PzsEn$2pX2;=!#|ܬ=P'. / t@eˠ3H]sZ攬#A>LUhO'T}j_hQ 5&͇l̙BEk1y('FY:Cz1< xQRmkܸIi[H98`>Ιq^@EFG"υb?UpP@ A3Q7ԨM'] <0zBh8@^X12RU{Uv{%%V$F'dP 5oZΦ5Kp=чF$ГwO"&hfB`g J? Yǻ SU]y !F.i(ZB Y`E<0&1O=W#<[hѻYCց9 --;̐Wާ" duP&({43;VW $@کf6Yo(yPm#/ D(-C t,7Y1]G0]A] \]`2 4DBb~-T]uWJm'ŒaVF)|>sbwQJ&'x{[RJϳJF70 3M 4iK`PY.RB/qp8J(9Ffп3`Sn׼ U`$}$=yN, 1'aJ%=sȐf(w̖2Pz#:J@tz"Go-7|]{(7~Fm>r&̪gq Y$̻0‘ȗzxIE?NB )_Ui _QHo=IwU.eG^ˆ6Bkk {r[md g=q ć2*Lym_W-x1Z@`28" ޗ4ϺaQǍ1*ef4hw æ:٠%?[¤m<<(?  3 ]yt00}"NDi''D )04A"a'x?'0'R,Tڥ}DӛE|]9j)04A;/YsOYFDaKHvYERkpb0NߘǴZ4K_2>@G &lH :-CS*AIퟺJ\-|#!k)&e9w$BU/Ālň#F(Ǟ_5 |j[.?X !fћM ̝oU ޔ]|'@./efO]E 50/}R,ŢIL$W7\|L1JI)3jcٟ^{H%< eQ3Wɤ`K}SHco>X0ADH%콋Y^kIgvT4in\ #ks9ry3a+/[W1 $'@R#&UQs}Hz~b7cbt&蟙ٻPцy?тضO!4,{^=&AT@,iy2 v/ L+O9̣qKWlfUF;3Hܙx3l  UfʁPU7W+k_ 5,Bo m[~ěo4$X@+&+ڊ@iyx5BKy9ߔ|O)Tu^&(=i%At*\kLk7v\H)'6xbJʛ.&5ԳPxb&d F{)x!k9+gcFzR߬ CzJ W hfeJB_~V]}bS˾q;O627yAhQ _#ګ[~ɚ _> YJPw-0Ѡd@J)ŏ'"bo]O%2Ĵ0 B΢JȽp5FH!Ye`4P=UU?jvFoe,zL)ĬD6A Rթ?J ꪽ*MPz:̛oOoQR_c ؇orVyT(c\,RJO,3gmՒn۱дmoyʍs{bJ·rⳎUBGI}IrMz9'^K`.H]oUjàkހ2Vﺽk62cJxd6w>%JB爑(&YRMn0 i{?:9<\/Xh+/?= SUh0B8$99`-Y]-TiDְ֌; L'/א Jat9q"#Xve ƀclжBZCS0]CNxUF!TV\:N9| ʤ5ݛ!``??v|naûxRPT]HݔK`n'|j xE +}ڡ XGAj*_I|9mef->3Ngί_@ͷA-NMBYZTy Y&3_FE?exY@LF5z ڠMe վ+x.|}Ő箝Y䝉7s6?2Pz}9W;}gz7?C',SK(7v/'QJck+5#ĖZNYl"1_=K IlSW9rQyj =DFe8!^.IQJ*z/zc0ypxh2k-'+plvB zO.K-.gokX5RRzTk8H/4B )_Ui&6YF%HFv[/c#5#Ţcp<"zY[]`g &h8wc L#hsoKA<K7c9vǻv -w݄R83PȅvT#أ8"yWL_>M& \k>nROthl=y V=`ׯBgX'+т9bth(m2h:Rlշ$${bM+)-@TAyĜFMRv k~ s=&?0(o) ٣.RtGЯSអcߡI4^{VQ3 >G>흒(L=iS豳H|߯ ͏*m1 WN3XL#?ȢqTn%zw x.tJNOX(h$ƘeYt,ƯAi80#Dٞvcwv௹ìk-_3"sqjY jօ"ÇnY,E u;>D%m<~p J|I$@ؙ́ C's %@5py@j?Og^3Q( W,tX$QUz tc\ңcY@_;BIXE*o:y('M-0#S,~(u#F@ᰮ # M ꩿ*EPjw EG̳Ӯ=Ι? [J!U=WR>Yq}sJ();BSGf %%q5@^ SқR'añToֽy}4cuԋfW9'75"h&&uG,Jmvv)ʭr*aruC`/ӄ zTːRF ^JKy0_ XN1G䣯y{b)Gs0.?KJBpe(~D|KAEG@тM'O쩠hmh*&#cL,ƭ_xe83jC{G2w3OQ8ݜL(t#.a>HG9KA}Յ1KZR eE \;" x'DžfVwM`e}\Z\ :X7P.WVk×Pce ] ۯzSxEKw^JOl712Byʂ.=!}g0ɂ4NKVW Ui.sPְ+$C~]-ntK5И3=qb>;7mP ى5,6%bú'чpFvh RJWh; Qel2bZD?^LTgG{m2PzS*7j*C0P2jWt!6<6CNa0"(R`u_"(5H؍=I'7~4rTY}.GgQC.mNK jzH4sdzSZS7nR `WR%c_(>\ GfjRF^YT:ن iD>!%gfN[gy[eJ.C )3%2&n)TjJLփwT)\4wwUɜ!dfxsk-:ō[y($;\DHꨵJ T\x'cξ_0Y*ZbzE ꩼ*Ejw+=u;R7;J(Q?(ѦA! g9h)R]] c/*GE@-!$;^I!U]W JϹi4B4Ѿ=KY}B*A/SJc٤BzrEx2=Yu.iyww>0R{42PV~̑ Y)wˣR ꪽ*MPzrnU2!ʗaN&b0ByGLH`mE(-DŽׄh9NˁŤIW9_QDK+]Oh )04Am Ap*ٶdδRJOtNS\xgP]8Zbk%#Zk5yZVԓGSҹWk23fu^ HϹURPREJ!U]W JO8 8b(A+@_)U>_/'ePd]Ozaj7b3I0$4A^CШqQ?HTu^5&/R;̑ʄB+;6)04Aw\# 42ZkF5wB kHꪽ*MPz"%E|sIʿ9@iu!?1]bݤq8I?w7\J!k*MPz<)B^He|Bmh33^ql9iИBO^n=XȦ4J-7.oSᛑjy9B:/!~]oK'n?CS{UzOe*id~t1қ֦31lbꀼ`KJsigG:sqRҠQ`ay O &ہ%P7ao_ t!d}B|G脶y#V&h!P]"(59S(~<AG(I!U]W J*4;I!;!P-P76B`J.@Xc0Ї $c7Gz(#hQfCwPWߋop 6AhyAtI^\lԦն7HI0$4A''Q'f6c'ԇ8ۋ@iEZ΢^C;|ߢ _['%Mx -!R`VOU)R_5 })(}RU%QH{>&(07GAe%?̔ Oo~iR`HUWUiۭ"F.LJ0|&5,2%-DUTnYڼ%}-TTL$ӁJUѦ~ܪ*Ԅq/ЖG~f; eNZ>,$kU0 ƹ̺2Pz<%㩍[lGO#y,%'-p㕋|Rf kGyV$VْKkd:'FQ i z@(F#JLEv` cō)ꪽ*M;ͱ0cSg"|两CzJ>1]9V-Czs}`sn~h<9}c)ǽ|bN9zQdX(ꪽ =PZTr-1υ \GGB=2 2ǯDOfg@f}V/s) duP&(=itGigyi'+ooJLr,a ޼q9'v WU%tLENO=7#P TRyv+v,CZJ^PQM`%qwvF?ϳ] ꩻ*EPj+I{RF^q[m9%6ϺEc= R'p.^-ðI!U]W JoR0:;!ԗx~_4gX>~gd sɘk{2C].޹ MH!Y]-T Jo6e!\]LB ]%{T ޜ'O2ɡHeĊnE~ܴ»(OQO=-XRo4(`4r/6ɰ 뵶p߸pw euщ6Yj(!W<:;:#9#&ܓ!8?<{a I0$4Ap{TiaƩsSE Hme զy;\/<ɖ}]Gң΍(xyxVܠs؊@iCyh}QF8VJo~U ~~OHËқKaOe0< Krܸ@p:;%}BSix~'àjeN,ww "z".1 shȦ8Xfk)]?Svn낮mv<7;;-,cfR`HAU{U_,~V,s<~ઈ2Pz"A1;,z11R$.ˊ-o[JSq%RTz c;/G6.Tu^&(;Jn QjOoRwq2()vxs4^5(h$Kz>^mSa{dߣh .2)ZRIwxvj9%MWc~3pkRJ#Mbk]hM! "^e@TOU=͡|gDnבcYu1uMS$yhZLF#U ު@)ɳ DF:;_ \=.I3hC:JlYݬ=a!?zxnnTIv"!aBOnEw[3fx/D)Q] n [S0<×z@5 %χ{̚[NuCqQIp'T8c3 qpgwP)04Amk ϗRGzc>>>22R *)5mJ "^ #@?JDďgnmc_j̏Yw&У71sDіAR󣤾v݋imY.!W)i͏Q:={qAMYOB'z3aMkɼm}extehKXQl`!qlEQ}RiDͽEf'aLgyoF۷R9}+ Hg Asƭ  wF\+c7 =_`-5o?ꆋt+f8q5Y< 4;dd2P7Uj٬KId81ح @d^ $(O"tLo$uqxn:F(76tCă60rW HM!f]'~y9舝"E2E\!?+7Ir01)Lf Œ!<~2M,pMu TH v I^ddë X I0$4As.4Bo$kL)' \Qy< )ZR1/* m%%Q{ud~gx,'mn%R{uЬq]L| ӶE<CjJ~)e8fB@^nlw<OK:M ˻kCzJ;D|39srbȊA @9?NgLIʵ{㽇iW;7!-hv4g=sа8H 9,B ꩼ*Ejz'OsrcM8N 왧DbzB 9w~Z `%11[kYocNpd~ٳ+X3X#LX3N;ɖgPv[ }pai\/ ӂ%v "׆[׃&VJϱ-ТgZ)wy.85R j*MPz/DxUGkGI:rjs+i!~&C`abkM|Qh6%i4NQRMn~DH%<skpVb<F3Cߒme}I:mg(S@W2^ⰴ|RSyU ˉPЉЀNz3%?yD,{h F-`6A"tB倫?'N1u82D(=x$L7ojXdQM,y͙O-Ƃ…,hPX$BU]P c+9~0uvV&uI^m iGRBLS dK" ΅TJ!Y]-T JOv]hn0 vFoP:~CIY$~7 HM)ܑMhhRfV5Sŧ\w*_e1 ~6֒^ԴoM wkE2PzprGJ 4 ð2Pzt;qD{<\}қRð˖2@inWw5\]@š;Kb\v, )@iA>{ӗhbWoUjX/4y}/Ւ;rǝN|NCkWv ֜\yf&퇡*ZVBw+7, 3@ )ǠCZJ~ j Aؕݚx}+p{闥 k1)Q&cMx (ۜwIH- O{l)a_ݬ"]Bߊޥ*+QPJg1~g^߁ڣ^d?w2 qI)]fvE]Fl"e!XQ R`HjJvHepCBPh1nAxxU !0AVe_y23\QQ)x:m|YRmPM2={(Bѧ %4Ht_(nU$6n5qr;\.LRp|}+)_Ui~BaRYj(qyj^ʼn#bY YJonStҗaO?jأ$?lhD6Wu{Wz:|a 'A)W@%e8*+P =`1: FBז %ܷX0H}<5A~;Q0͝! ۳pEC`HVW Ui_*e iyL,(Om6q/ǕIsDL܄7Laԡ!Xuxd_ /`HZJOؿAoU=~ ;f׻#R *#o8*ʫR^3pٰ9f-7 ޔJ}Q]\$]B ްPD{rki掏@Mc4cG]7 ! duP&(>cڙr-\^1U7OX$Z)ǿDvM!c@0t:CjJLR_!e'sTmOL&ĵwѝm&GC+@WhIl~ a2uX  63OO9":&i2Pz,xRu fMm>U9g9Z0 4S]K xGЁhꪻJEPjALDhw_Yfc-HX% 7(!VnPW~Wj$ z&k)qsE6%_ O-R`HUWUi 2as%wPae=ac =a\PT;|ŏ[A嫖2Pzι'v`';3ɒ]l/ SU,/Cw|@q]jܮWXHOvi9`9Zts 3R)o-eA&Ԭ7!D}2(r9&e뷭тizbY{h0O$L@71r2Gpar>vj-T]uWJME15p W8>w!BSuz ݽ-OuS [v8j+ک# *S(Dfͽфh 3"gUiԙBcg!+uQ2ҳCv=H@%3}XԆDV  AV)<=^CQBOtPjX_89.R]!%+Ǒ6VdRTzj2Pz9s)KI0$4A Ӵktt2Pz-sIZM+z;YVnTgr»[ Rpg',a(oD8;CZJ޾F5߮^lω)wvEۉN ! |2Pz@GON6سwlWFII0$}-T JO 0%#G}+d)MjF|"}B ,ߤv't's;{c=iޜ2Pz|%BkSc BfeeAW;hQ:ex" M e6@̏- 8)62`d/! kg{}TꐙzcV$MP*V+G n#  #&0P1vcWh׋RhDJ)x5ljDz)!9u1O8NaDQ` c+$Kɿ4ĭ¦4L@ L=B`;&*6vdEZLzFz iQ"K)_UiI49i ;i'O^fcIoPm90ж40G)i{ZR/aĉb\Fyz[v+';y$zR1>!ҹ,$wog78:c{ZxO#Dʘ3&nEQ՟ <1u_G qtq 3<ȑ|~3 7L}$R{'w.c&?ߑ{Y@ rۢnRaeĹLM`tʂ|mD~ R j*MPz\y 0:$ B0AB0=цyh>JPu]"(5B ÿc?V(Do;$nͥGL҃L^_U`iJ>d0_J!iҳ]czmæ47rr#=d, =kl;ց%ګoW:4wO§:(ShE @фfLwH2a `Wⶐ3h 8߽bT%(8(C}t",^L#zCZJ _f2PzX%Kb]m O *@YX9Q\I=0_QSZ+pGpusnLDΟ0{Ɉ%TT^"Hm'k9LۄϏ.\^\2Pz)J@ ySA!`JھR|n0 :o3sEFZ%&Uw ٯ$mkL5zPb XY_i.4zVDRkN c~O_ 6Rkh%H` $"ʑbelo}hR j*MPzbidK()'Tޤŵ ^E"LpR[p6QJoZ>Dmo0.s ~?[%RP)`u_"()鸂Ep\\YH@/CW{U# mXU~Cq#bCTBd<ZOc+5&oxFe3wM?[GLv(~ $62Ei$2oJ<~'ڎ2",Dee !vQ @nF85 ^%W]WJ0;͛Gi/-d5 ;Jzh*V>< Nڪl:VUhI򌖛.9s$8MSC? 3Kξ,vUG+9 +g`=u 7Tr'"gepUVXP }Bu+*xkB. (/"$ڨppYjڛA0q"ԊV_ k`nΆVY]o j#3iDfZcB7#+/UT>goŜ8vJ{"CR"G5jHO oQq9+=:[k?:äǪE*oFK>ݟ33-=mUf`p_r@?d2ߚ8箦~e^9xH}LhM&'*Kp,[ lwo)Zs*oH9|%hvm efpPiIbL)]!m>=JŢrJAșZyr.Ήڴ%8-f`pj؊.,ȱ8ݲ`(&z R{cgq"t YK`syrѝ(b7bI/vILh ~犳NsŜE*xgϫ<]N&ќz9rb9ˏܸ|'zi;ӽJBGw{E XcjڛA1`qw)N/=Om3m:@ƪjo g><Ii$UȞB̊=gdt!'qW/xbCl]0yx1ƻOM&"iNTk |Zqq?c䓄Dz  nݙ!s&[ӑoD+ {U4ά&4Zeh_vdԮe~7:N+V9WW~'wv_©u-ۈ8~MHPVD$G~>|wxMMځkڛƁAz8]:R>$4x& &Q 4 , AX@Ms4]n7G[P QJYj8R=E"VZ7֖Tx8}4ɛwQhdC ʹ'׮L~8U(JXhӰDȣ,l'4Sr?Q45Ceb#W-ʛPwtLxyȽ$6^(攦r-jڛA{+'"~qndWeIkF2ryz\"(O@ @UbTɻ>OxtbOug&zlOXA'l  Q^=i? pW-:FHo8n<߱&%;7t:} 1]y3(X1[&Éՠ6E~9~) b^DlA^gbUW?3gokȩ ^(:xx3w8T/β\R }wWē%8-f`p4_9F>A؞s"9m@Y<w0;ڏyWC-T@00ʷvjawrȞy-m\NxSns[g+7ľ 1lFv?{faя=u-6`mZq`PGNDH ,ק7Nl R- lL.( .+U i2B0*VQa>[1 'OkM)$k&$X}joPu< F2i'flf%Hk:c~yt~ $s>^d1]A8ԃӆ,mPNҵ/{x rCV|zB3H08qAP=!7ɠ%Nkg?c!nOCsk}:<F(zg?`G %AX*襐?US0:)R)},Rb'Wea'>y w=N)$v@ Īa M@~QˆPKXILv,(IԔ|%8-f`pK9AK;wέy^ce`p$do8I+zT/}DHb0Q%=c9׻koeF#}J>H;۞'~Zk1}VXP PJJrBa0$9/1;kgA:jڛA[/&;!쑸[BbTntÀ20H5!@/%6|kO~8FS ]~Q#VXlS#w3 4lԴJɰ~w 0j)oil < Hk5ƒFbj%,%KB[Q;[  5j7`yZN):ئ3CtϪS829&Fp;L`;|gg+E`P]r<)J~iLC{n2Z*N'd$.]ad-c'a<=,=g.2l\P_r˪m Ϲ-oGvYakH_69?75CA" Ycsdgc%ͺhKp,[ Ԩ}FP4&!_گn>V70asv U5~1~U1 I - "ޞI9`C?1%'Q%T}kfŮr|c{B3H?wa{TS)6Ey'6a$R`j 8h3Jt2 NLv%~&!aOHb7ڏƗų8fw"Hgܭъ2:FYc$^sxWy{ycfk߁W uv;꘳tI{:tCoOK7<~R(:U7*%CH+UK0L;oL)H](,G.HvR9j/kO埵.usН|w,qqg?ْKU!G6;WKp,[ ͻ BaaNK5YsFϘz*v݆ʽ趥=40"b$ô_DɲY%8-f`p]Ψ~yJsT,X^@P& W1jٱ`;w8#k 1ѝ)MKaSxeՆ>C^ǝUV0=vN}~A~jڛA#jxMbb/yRa*?  boB*v<q 1ز& n.?'ץmuń'& ,ʳmHrayvRy7<:te e =$2ٗittALz;20 3QiMeі`h9~45^wǎXw1^OpcNWqF$]-ݱѣK|)fs&mnkè20{x<>}2: aiד%8-f`pj?TNO`ހڂTG\^N#=ohڥӮRsMA>VDUȘm`^Cg-[]:5qpӖq;xڛҞS +vJM7 ;wG)ai>` [``u6yr4X&ms<=uI&5xכ8Rzkl'4n8tuHצCF.Sk am O(?]`936َ'~ Qe`pcoNL:R=2htW z#^qc` JN..2(`,z2kB7 S~"vTkMe8E!?|N X)u)3NzМ@jb܂aφi!kHOseqA7i;{Z%|KZN,p`9,{&n۲;53*I}FJe.RC6ZSNF]B([}T[.lw:r:e`pt1CÕ^pDc4!r;fP؈|x20QWɺuMe`p8-V-n]s-4ZʇTqgss m N7ʘU<AgZ柖m,&4hUw'Ձ8e5e`p f(Iw/Woϥ NnE+2}-QA416ы} <}TelՏԇRUQ,Qe`p}理JCoh^\ﰛัԙm硟=42R7^jKp,[AOK^yq,b|]aqK_,\KK]dLƽDa tVL4j e =$:i<`,rRЀس20ĝSn ɼ%99 *Kp,[ ଫ)wxnh\IUvc]2fॸv U3WU_\ 4f(qQ32aV3i-=$\^\}}g }c)r@.9CEe!C}n|ˮœT|r87~Hlv#%8-fakR7Yv̞ 8_#"$uičn/١Ǎ-N,e e =$m 5nAQYU,G*͒xNbJىՠ~=N#S̞odXM2DB[c$Y!gzPV'&5U X {#G6C,EߕOߩj+pb7~›\d|b0|+G X ֩q3T=I O^c)pkE7Zy;C M@s3cQv+A[c"h4 }.X Nbw@9w &p޽*d5\*{߁U7 ]]Ք%8'4SyP@oDDo E`P}E[S/Tَ. ~GP#6(hƱY׉FG1glj/Lwn&ݮk~CA)JH4 ^ 6MT8zNjH^M8Qa#%p@^i߳WO]"V=P+%ï7Za .8İrqwAm/PMV;xhϊ;xƫ* t-6lw,SELP q8wY>5K9~P'c1jK,L?سSRMZ߿[ƺ)>8% 0u )4 yw ]eFaR+KRbB'f,'OK=;kb4II]=;拪208^)t+S֊l:!_T9p "wg.V݉l {j<%NI>#*8$sd);#yڵHMփAB5UљI=αR208>"͒|D; 6aōap|0$ܲ}bIC>  }|˳eP,‰W!o)Sm7"<9|r?|JΫGXAYF^/~u.+[ճwҢLEk/lÈ\ U(et:^o[bw $|C)|Җ-f.Ь}8C$hCI;kٲѲB_uL̗-sO}=X2p~LvKGn)3xp ºaY]w300iG1H=Y%ϻ[VaIfe`pwq֘pH&,XO7wYtMRKKgfoљ d%ϒp-:% k*Ty3@аu4hnc#cExV=\Qw ԣk˸dJٛǤ4o 'AX^Iy``\cd8!;u:'G0؜2UrO9![<ߙ~M]n|V|}@Pms4_}3O& $Ax棴2kBu7 []A4dnRR(B*QSx</\M[v)3oRvʛxXF9'}Ys\npJp.8{E͏5WC9a4hy=6o%G[c"7 :OHadIfchznɟǪjo jT;DxWu1HuX~ 9tP֑/ue&k]/Jx2?޲cpU3VK. qO4}U.r2аS~s0RP=& ƾMNbݟ3um8af``(ҿ㪣8SSWØW*kQXAT|QΖw-<^LJ(z'@d p20$ v)f pYtafTG\tq̖Ij¼.O2 TL:7_.NE`Pio~}<ܮWjz#?tL:D|w-l4 >{Oc{(@{>H/I"Р1V-u%O4#e.>sR~"ޒmI! m H? s{}Mq<^6~s9Fz厪cy>0Cyh=DrVXP =s״Ld ^*R__* $ܰҴ*.9ْ.bv/ߤ8Hz_|0e`pj{k*VXՉ}*Xg!s{}BRe`pz8R1<FWCp7GTݣZ7",KzM~ KӸu[g㱍~ώ+Gר c&l v\YV5I, 1l~~ƘD1)5ϑZd8VF ? }ףD&F'jRnNkZƘ#>J痟O+ڛ9] exB4u)SaО4=/U^".MteOaF>ly7x ޹w?eُ[GV -1;7ewx|>_w\;1ܒ849 G /~4J}虝4MDBtTޯotAȖ2s%A~~]7B~,{i,0r8#.P˜iGk; 'U_|72CVH:?$dy'wqo2]it\֛"mקh P8nDqRV6A }x DTF5z~|^G qS\kV2 ikw|9ujWKp,[ TWZ!$s.QIC[d( uiRTN n-ʣ&_o(Ի̬pPU-48 UG5(!:hqP1@׵k:Ρ%8yB3H08`nV­&9 4L5]JW#J; K.%t"Ŋ9&~\%8-f`pZ.p0y!(JpX_ų aGB[cB7[#wEQf]bUSՖ"0(zӴ0MJ;)4^sOz${##y$J2T8BINL5]+T*V{3H08 nDʴG@aZf_lVj4mPpnc=(:*V{3H08GC|ܣ(ѝO#ϝΒ2ΔJ"Fgкx?V6Oh >wp"Gk"C EUQ3'pR o J}&S}s/oT̃gޯ.^l64a:9Hfy9H+eZt%]ǝܳѥG.e೮;?=.Oc*\ -tҰxW~F;Noו۳c52Cp_kߝ$TFg*y+LP޵vi edVbO(BwLĆS;~ ,8U7q#; # d.2,%/J\kdƳ͌ӽZcBOh m[?K:Hbi5/C!wA'[͒+V_/(i(ز 7҉4p':9˱W Fs\!ea<jNunAF3_yS&c=ԖXA `+VX{6: qg*V{3H0T4d='UNb)3rgEw *y]4Qq۞??zuap9oEK~#%8-f`p)ocE;2KBcEI\7J]#6WטSk1V|l聥?ѤDv8(a z- j7I[ A0` Q}u?#7&i*|mK-OMwi(0vjA1 |t;sѭ`.\_mjM+s: Ɠ&̾o>7KU!G_5jƁF M +B6]' PATCoDd;MP)cV_bZkմN{$Fl <0Y(vӉ.5V-T{3H0ďӏl1qDSҏˉ]&RJm e l[7"8uc9 ˊ4 Gl'43kzO h׈%7ZJByRuǪRZq Esa2~dQf``L)GrlDKGEGUTʻ@Ut'/õ,Y̑s*^`pzNVq*fTdOLȴ2uT 1lF.SHdT+U1J$VsSe`p2P53N;_cǘ\ $21A:P! p97켗@{r23kKp,[ OH{sjCßSh8 b?[@m*S*^sԜeTI8%~cR\p#vl% ,}3b؁kڛƁA σ90%U}nt`d5tFIΩr?&"RO_MAh 01Fղ"7\[q,+O+ο҅'/Q 4 ,2$'_ 礝{8V-Ry3@аu> '$&cH89$5ݸIoZGOT戃q*դ.ӎ.G& #ds&n+{/8Mn<˚mMƛD>e{jEV+OEQCe)[L8q:s$K$ 9'N g**p ]tw=NKjE-KáXGƂo^X4F.)_FyU5ms=EТR1^t%CX}0-jDY)RF]], ՟ 檺T#q̗2\15{^ ٌpd'+X^VBq]S0,S:PnHcGB++0Qҩ**+ITVhLpO׻ aAaߵ4D z1#K&_Z*{O!|"oj[[gnƝzL,jSxNq^1wC ʥפ?Φ89-{QՖX7"|pOΚy>e`p0&; :C8<%cYa5p";2)/>|} 3݂8- ca7\kV&iӴ倨&bUV[ٖ^ܨUkfTJn"z}v1.}?g^>j*G4''+(Kexp*΁ s?E"c^>( cAo>=#fsh2XAj]),c(Q^1kd]  jm\+6zF<EtPG}?>2аaToU6|eUS~xŠch*[LÃ^}S"a?!f׺Q:+̴1MQp8v-P{380a>||ZySse3j.~Wjʛ@/0;`Ac %N~6t$:p VKp,[ ϰȍV":!d-˔UL# 3s*]K%e`pcРP)vq8 G^m8eoIk ro"6U9.DÃ]'p\̡c"7[tD#u>iҺ nMXxIM 7aUea⭺jEUOd {~U|Uns:$y NFyWib.u,zә Zl'4V-=,`GV}ӾurECLy}׾zwOeaVj; .4xσGo^Sә >>O,!8-R3@00,B DTѕy{^XtX2 tfK$$̳Ra-tAK]EOٓ|̋4H}ہeJ̍]₶zF́>r$_1Lt%8\yB3Hp'~ 'W+FVʋ;Q-b=u5zP*bαy20jfb 208>ts{Aad a.Sݿ趎^L9RhCǣYqQ Ig'D-}cqBwc"u78tr=Ë)~e NWZǪE*oz^a-/<%;{&.\4L@s&[l16VQӮ2gqRS]}s$_2%u,GtӡD&!3VjoQIEp`2?"i{YM\D||θ{!mAf; HYc$GV?C?$4N 6}UT_Uɏ!9qҎhɹ <zCղdXJni:1u(g)1'Aϸ' f1i=/&Y6iz x=XxIÛ#8@R%^tt}mU  y~yy$NTSWdjڛAl t4jf\*HHǪjo g79w_6UD.eazž]r{<{ b̿x@,: 'ZPchKp,[ "A kf"H2A,U^E-y8V-T{3H0N̼-̢lF;]>`F8F-Pu38ШIj3vV`l{Ug3a#Q_,R,-_+.DE.@ܜ<ѣhKp,[ lˬKR*f \S}ؙI\q]O)q5Yp[\.p|:zi]5t#LM9Ut)s?%[ߦ27{?vy9vC 208~z 'q(5)xJ_عiumܯBMæ>Yc41틔!8FS$9=mp)sVZпP~+v#w#`<""e Ta 4 l3$̓c _pre`pScK-[pݷ9y&ώ8{ȝ@26THI=CI͘N:r3IN8,/ ac z,ioC᾽N4"oX! Brhu'.e`pc9E-i+pޥYd嘝̍/U\h|F :% xi;fb?i`[Չzt̿Ae~o Ŀ8;m. f%›d4!`*YR}T.S),ˎ7p W5a%,y@xLJݼV}*M ?5"OpUnzIqXb 14Lv& DnU*!l VLpN*ŎVw?_mS}D[>W^!/ZoA* \a5MPEkՕ7Aay Oy~dh> ؆%Z"?b 4 $_N;$(_BCЊi253xoI(܀jQ'ʛSȚxjŊl#OpήirCE 7ASSvHFY`fRs\bt1Nuزn:G8K5-ēcW Q1j~ $S|mx9Om$AyXE~Zw}P37'ƺx+Rw'6\Fyt%8'4|$.&D /D=S^BiId+'5ZyO:!h1wy'?:'bCqnO#r]1u(xZm%>-˗{|S;Գ_KR20QiG`ѷR"pq}<.%&RG>!ˉxu o`~NoOw,ȯW=tU%9YS-wz+Wjjeb2X0~Zʹ_v+ɢ=Gړw 1Q[yGi.LY&m{|q3G"Zbl]76&>D&(]u9dt{R#}'*#+l  Ծ8"}V~oEIWPt)^G/z@\BLޤl{e_{;FݫW8+Fuqif'߉dxGΩN;_O 'vZU9_qϦ@j'|;H*=ێueR'`X@ehwE.~\q鼉VӘjh/~^+ )@gB(T/,>sR /1jvGo:y(nKzcMW@?Sg:~ڨ`lq} f<l䵔~m2M *L3kλ*0.o9 n0/f8djU  3e3u|:O{aD&< D9ʗ O20_wl:HwZy+mU  .2NPȥ3tRٟf3"un+L^9hAkc#i6rً 9v UǾ*qSlcӡ Sh猽s̡Yʾa"xNq e̸U&MK֖X6pBl-jԄ'7aϙRe!獛wIVkFǦK#TyOuV˱=_>˲b(-,NpJi$Rs\+"u*( $)O.HNJJaQQ89<3KF1|y蒣: k.Q)S|oyye =$ܰZS*uQzHYcKPYc/J&x\L)S*\B ɘ{tq➾c GcT>-vB9-tJN6x!HqpK碒\.kqQ*M>IOlJq]{4zJM 8 eįN9YHHw_sh [\VX}j =Webxo?D{1ݘsӷGH2QcfUHpKCN)&.*^rCR݌釤{u̓.vqso T ~+"N9- l]yRM`N0jՄ:4I4Fo|ifYn?G],!]GW EHDJ,[4Uwa]>)ʋ=GiKp,[ =N_6Ɛo.3i+*t*Y-J 9CIpLYc"h^;|I;}i>/ŕץKqsA *嶎jG??ә  n|>V|}`o,ʵ!{ֲ̎#nWYOLE/v!twnyCވ $Q?{'[8`*Z~jُ=NznXbZ55jEFqkFls܄RM2 JOs/aVnL1a\2['t[*DUVh9Kٵ5kPk\krcſ\}ݪ201RV*H2["e~@#C|3~Cv)WhDprCHp.sզrDʍyt,D!eHHU^@^"DW'E:AYiE"OF|Csؓ3X'>h]%:QlLt44uh[ڼ߅3.C4ZZKG0zdDt\h]~$<fO2Sdzǭ-jnd#j5P{4uvOP7]+;hإLkF=I YTP8{nWR*U+ne!2޽ZrDӻ*(ӗţ nL@V (ٍx3qWe`p{8}LCa{6vwv'Ϲ_ۧ6:5Si@t@,~f 8&e#pZf``ʅ{d?HS=OQzO20ng~m,@2_C)C?5ASo՜VaT_#GufmEok6=)E#z[xPl__ŗ.;"mU  n= X"Ԣ|*-;.E>ʯYe>l$S'oԍiXZ3g!nZG*VqQ2ʐ4!~G.AˆbCY,ڕ݂ C-i,to{0KY)tǎC2ޔ8VڛAk v9k@y2085yON/qP$+aoDW 5U2>Cpx'_*¾z>u-VXP ${YdOk M%Þ'mvqS!f*[w#ea?ےc=Z2/dx4*(R$Yd^صPMϻ>{^$ ZC ?c_Ejo <N9ⷫQD N5Ol,/^]Kz[E)rkO_Oo R= |%}2pcméb8Bqq}c{gl<>Ċ-ǻ rC%IoXLT%>:QXڨn3`T]ıhjEl,˿ 6Fm ׹9txޑ.]wzN6fѨGA{V%493c|;S&Oea(̋~?(Gz>Y,U+G]9nӏ1RBsth9ۅt#crj ZcyB oevk?i)Gdjny)5HLŸ6`N鰡0,"QLS*`7L^6bbi3ڽNyKM7.g(;՝n }|Ey^" '˅ukiRq_6^/Uݍ=SaPD=9#cWRH?\ ekRXUJRcڽ /IC1. γzrlA208n?t Ӊĝ)^y{֦<֌n#]oc"7,HѢ70; `*~2ٻM2=x&ה>Ǫ}}*w&FDž*RuM+%ONAҖgs 7yvk;iUYSdDz  N2jFџbЄ2k"U7280̰/ϧ/LIWk*N Fep1Zu1(o51pUe`p߸($|I"JE7ڱ˦Z 1lV;[1AVEnژՈIzt*V{3H0C౲1xr $\`la?Oޥ/rJHQT44jQA~2pKd=x-]A&Zh;}] VШJxrnT p/B&;ܭ208y,'Ap:EߒkSgb8/XA +1JrB =^4CSbUfa}!&u7MBDuL 3=켙xIE`P&ɪC"eW/*7ʉšxtF IG#W'>$dtQL4i;2sN2f`p{[@7q`}R1U-9y+Ǥ2shݓT'M^KRTVX[N6Wo~^wؙݧ20Q-IH0 n%_پi20."-dz{;rp20Q\`3O .1NUE`P*y@-e}ox'L'+I+uo%orH z6 7V- HZz?a6n'mU  NVARsSQvi{L3&byRF2yW)6*s1{MrGKlYabiL<ـz<.mРYBD(ws;AuQġx"IN. 3gk R".)흑#]hb hC? !Pa/ڙ$1̔3Kڮfʶ1@ͣVa8:r;PH 6%M%yCanR)XS%qS=zw71ؒv~\Ǜ@IQsISK⢣h;&tK>jAiHLHzB3H0 P#773r ^qlL9od.}8{VB|#F@@hcnҚԺ%AD$J+AZy X S_ē9hg`>O:Ǟ9rջgj#Fя΃a40`EW3y4*egc0 PA(v^ n)>g>w^7ȼh&Jۊvp# 'G⤐MSF`Z``|Cf:.v:.z:>8B..zgvȶk?]208ס;^ympB?|>!WszŌqϲNqFHxJ'mS>(l=QJAWU8n:_ /I%H՝.y~a ] PMu?ΎDp =]&wq!q-ΉT 4uǪjo ~e6@Ϳo1ۗ3+]3k#!~7kI_[C%pl 't QFȋXi 3ܠ#Ecw^osDz^DJ7Y^F5lٶQ ]#,!6M{ה8eLe`pDPKU2yP20-ȏ%.E'T&}RL}_ '}GS&20R}38ШDIH4P8 ntY{~8\O߹E81cZfq/z8] 1lىa܆LsEjP20e?#mXFo%4_Mea1B ߽nTݧǽE`PYa cI%SI􈂵 Ntp!Q\EM.J"0(B I͗3eV+S6XKy?WC luG2n C:O NIOuDЉm(;;V/SU)4[-G+&%Omz\|dS: <]c7@[cBOh V^K+LRSx4r{0 K8U9KpՖX 4lk4x{绰l208ZUl+jTXq(Rll޷if6k־*n+biب8,7#5͸,h2081=mA|g.&ϯ.{FYzB3H082U=ɭ ~j ҿtF>oN pFrȆ*f/e6+ܵi+pZfa=9i敽y5F2089\_?0}q./x_=BKjtϢ-l'4S|ArC)I*̤ A{NUVXP 습'OjW .sX$|X-iWB-.`O] 1lfkKDi5@nT)_IdX1fUǍSgʊUN#l7,\%ofZ-l'4 :u>I 책^ݝÌ=$\pFeL3gBySq:;2ǨEnu6ۗy?yV2,mU  vĒ|Q)X-. %$_9-B]6j^l'ֹ gd23)N9Jcyp>i;}qw9x!L!QXSҩ2а5})v/czY ˱*88 ײXrMTr61P$vb"6AJұJ eagRe`p}>c6[b&+rZ;sIH%)P) ]w300 |:+wbmL D.N7ƪjo5c8qrPl/YoHm'6 o2M"~]-"D, DJVfS"OyBb9/7="HOK$=YcB7^!VǁqW' OH7jݢy`mUsi#OTĥ/̏21"`P+ij$8[jǽE= VZE5&rLM۸e`p\FW oIF.u5^?p$; C (Ib4qE`PA)ZbgF7mRwe`p )Y~)Zu_^7I'p+s\=l}o\9Ћp#WG/}]h8φX_ )+>Pˍsn_꒎<۷4h4foI0'緝ͭSLX 4l"tqe-J#uG^Te`pr<}6Mk8w?agka>j%&O\d_Wj֮Ejo%F^H`M$OoN_Hy"cUh$X]ө20E2hCpr3I"0mGZT *xR͏~{XzY g >MX/Dk % %Ѡus `XΊ C-\ [o E`P33.'Ğ(+ì-,- 鳴|tN|]̨;?N\Dv.n4v ' 9ŕ>&-;2а 'd%rrP=UIc)w~201d*=hׅ {Q͹!̊vѾ:SRFm~27=) pޣud 8u208( j_hh$W hS{g_CW=r_=Hqy=cILAutB =v=} _%W?cU  N~Ǖ;_h٘]/ӎW\`HbYn{J=%y\ $r0!Ra(̯w2kBu7  v*#7b0cԂsĻP䅾(.WN{,CwACMc- MM7g8* "0('KF_!20wժ%U=/J#MO'@% PAt{׳e|UD#:Ϙ6r)3-9%_zJfrV;ü4Ubyޘ{]{muW_B8_D/ 9*^ n|!Rf=dxXO*dY'<-2"3U.zPvR&U75|lj 9i4L:x?6rYL*Sd*KpApC!E]O6RKH0 #NFS"'ɩG;ʯpOp*{j?uMP8^gڮc]}sXv:ynE n]sFƁF-K"}$fʧާw ̭x\+Y"{\TGu}sc8#]ӽ6Q1R*Ty3@JOCEEgLJ q(Ϧtw7b.gSϓWf?'yé n$uY|L EB1Z?"ldJ?_1bNK$H̄8ľS^8$k6;zߕ㏧غ Qh<''{(!ru HCabF៚d,lX6f vH:͊(C &,%G5jb(8a"?~s9ԓYl*uᰟP|4]J+nԛVim nX]ls7X0oz2s7ݳN"돆WnDZ7j&ƲZ <%R85Oa(,,ò()]r9+ 'XcoL`pϴ=}SQ'86 >s":)PMSYMDi&hZ` IfVXHATO|yU7tor[Jo{n&~N[=ȑk=-i&w)Ш(smڴHM"%':oS+Фb<ˑڣ!›i)8ΏGjyr(Y8[s%8-f`pkPTp!6~xaSea -{OhA0 *S G)F1pR;U7j_@F]aЈ4ó@?[9pJE99YKц-aZq~iSwRaaw=2"1qWFfy,,Lg{2?c8d}.WυHf>햰?55]2L22etVjk6EXGnsތ "/um{$G20 bѩP[^X_)|#j%8-f`p*[~q] NI޶dܟA폴}y;TYmBh <=&ۅҮof3I";N"*KƧSݤ'z培iǩ,l'4m${Yq\Q@$Aթ 4L1x̞)F]DOj󓟘D41f JoxW|e)$\#˞G{ҿH!5:Ӑ>pHt]S[c$z51ym.cҹE#Ԛ0ySُ XHUNn {`d$5. u|&$dž [|7q7FjKp,[ kAC7B7rȪ])ʥ 2701چOY>3n%{6 QVXP 8ԙaőHρysSj$r+gVbzեKVKHߕ=}pL+ב|*8V-T{3H08TX/&KAjM_P4P/ wË!Mx4y\ jڛAE>G¦_dtUV#pUuGeY4O7('!¸芔r+k+pZfa`Cj<-wDJ\Lp4!HpLDp|1ȋPXAUf=D/y83[ߖǹmUf`pS:}kJu&FFu?sH(3l20ߣ*QJun4&aXA3,͡ (GVXbǫgٗ25#o(vbhoskEМl*΍zC+WzW~<~"ܕgݨ㰧/*OrB|M̯gض֯g0_rYV$ܺR SZni7R_ۧP$ q[gFV e&0h NHɍ$Fo/SIZA"bTA.YYx?H2-zNJNFWy/UGVh_*g~yb͢ऋ[?҉REQn>IGQz"d>~)Kp,[A`N(Ahkُ 4vo;"+.vꕣ Jז륙 fഗBΖӻ>~@)=#h8"eyl3:lk6ز;qg>Z|UEuG py8c6:Xn!\T؟tYۡfZSBAȝ*2L1Y.U( 8&f``@ys{p׬_ʜ7Ku!od<8tdYԩ.$-y| .0'}#=\8rɁO4%VDz  NPH%q;Ѱ20+7ZY)-}}~"Ou3 e<:VIܱ/9!GH2:ʸJIXNkeb+O>UiRsHYVZ|,3T' S} 2jF"Y*EVHG5m ]k6ȍ,) _N7ݷ#H(bDj#F-Tw@0(q9``kр: |@&­3Kno콌M4bzg+:(cC.\G--'w!YYi,3YJr9Lkt)8 78,6ZxaI#[{"~`^~* mCԤuhC#˚௧I}Mnֵ%8-f`pKǤƯU-q],{wߡ*y0:r&DB|پr20e׈[/{d*CKSVEm Z䆉 R7)S[c"h~3+-%̆*Wx{i^o\LWzDs?9ڙy ɋuDz  iEZrK@bU;PRzezrKRu:׾3Yc"hfhDH_T]'J)˦`ϡ|[0oQ<zB3H0q3-y2NhHwrZ˅*=Ͷ,Fd%:''P;VVH8-[FQr z&#I˞k韍aHZ}&)zowwr('2]g((Ʉ5Ag ɠvn̹CIٻV{ "\لD 7DL8VڛA9BjDn)g(|C _ !erM:D^ZUG//JP(ܰ2cmsNA{ w c4d?)#] k^d j_i}+yC 5ǰEof[gM4=FH4A|k+\gtf̉VbQ6^BC5Q$cs/:[c]c-VX?'v"U=]]`-{۴[208S`޷\w[oZQ+X}:{e{ v.M9n˝ju1a=pUnH.1C]yK+C[AmgVe`pk%d{=];M!g#ɛc0:֙ [c"7[%6̡ܯE=GR5 ;]v4ѫ =P"m e z/H˛1}MNIr~wu}!n2^"?" y~+Ւrbs( }:=6OsvWbzWq#:n\ٸXP9*%pW#F-Tw@0DcU%#nP#׍s+r;1el7Q +nGRD%820[#O;&zuKhy+KfJdO>Zb+gJ,`T2"hAB1ۛ~9K&/ e_{Z׻~aOu}I?ZՑM Dtz$GE]7l>nF+Vu3x_L4_ç(<  EldOpe&=pMX03y(Vw@?6cM rGb!FV d;:?Eܖ#n%D[cB7SÙtċ ϭ~IW\r, n*{YN"©FLS+}) ,iPe6ejH2ƫ:r6ܹ2][8Z$'׻={׽3sd޲`D]VƆ[}xX[cBOh K6?|+[?O# i7(8?HΓHs7N!tt~fw ]6ܫ XilK3r{0+E@[F?mnAϐ2ǒ&"IZ&ns8V-Ry3@аg.9sbv?.E+Ɛ3 :RF)}و)C-T@0M#Ϩ[ּ?csEj[o %wu208QLN}Pbҡdw~1R(HVsNfϪAƄ/z.3oZ.cR@#`;S$BT4ep-# $vëIЍY[q.S I n"rvbU  NL?wDddSˎw2_6`mZq`PӨ<%'+pB7 [OMtQsBo1U l_:4ƶ`L}ˆ I]y2uNJw!\UE`PK Q:ub$mHtՃlm-[_Y^._HxZ7^?e"F\Ɏ!v)oϗreuߔ| 1j9 ue`p]g)z4* mI֡ŵPhd1U&eh-3}֣# 5HD j|[5uBWG@.|Z<^N9Xoxtz$+hC-T@00D>yܭq;ڣ,a_4IF5}>ʵsGIrE}g- X~J0CC@;sz:OL<cH,_/R{n=G:+S~;^\mr;΅Hq#$Jij}Z:r79]Y\kBOh <3sypjn|8zv.in2vwe+4r5pQ8ƪjo!~}ҩuh SPz Cyd1 E):8Ȋ/BgcӢvU $Vĩ N $8-N|N/Fwr>x3*`ˇĶ:ȴ%8-f`pC}WYe*w7dAh+'%0ÑXS+zz4[XOV6WYV?6iD?ASРxZG.2mU  n=$,jOHpDUUGVH!p}n BS&6ݷ L‘5~9s4A'4_ډo ;"wER/V(ýSj%hKp,[ ]a>lZT|!T 촔di%Rz!)5$xTܷؐ(sS3?{›=-l'4[VYvnŽS*eaq.&0hlgf NHYP."0sϬiO k.jXAiodKYNsI iiQ&ae4)8JNSH;jtJ)>1R[ yG?e_aC91ИDSXp}Wނ) 2 9GO4b4> F52uي|ו[[ŽB'ŏPw[Eo:)'+c(ѳOzG,l'4%aX P!N7oJF?Dv5yIe aa~ _|fjʛl(rvb삍zϝ} DZG-ӣ.G]\ȌS;ͽvzB3H0=;Snp2E`PqDy@`/>{/8:q$"%8-faT1^:r7 Fv?c֨En|G's-A)-ӎ*lQ2?*dGPK]zgp8'x.?:GRsC# Z7P7u ^ 1  lݢXpV© n§M q u.{Ϲާ| ͔א=d&}y{pv`0 ^BIaLveoFU欼=z7)ab'KfeI]5lƁF+ A[!&?֤jc٢OrU$W"/"?e- V4`iwѥoNCkؠ^fؑfNA|ӫdDo=q3+a}\?bW|F¼{3ZpO- sƥTb3.^e`pDgy~oPqx+eW&[mUJL[ B?%wO:Q EsTc\]#KjB?vsE=.*`+`OFh F~N VxVvt_zd20aP&sQ/2~RNX:uLN<łu1<x?o2ѹu:Ws9l_4O'RDܗqӊ1؝ n<3)sm@8ѾVϥpH:,߇%B1IDg#+U4G5"}xag܇K("9?nyō=#6i0.{P[l۠~\F]u% .ͷ b• y01gZzۿZDr' u{"1mO KRc oVOLWW UOBLg%$s툱ާ5$Qlde`pBVwjo'*,SR]ZdI3сiUL2xtO %0WM;?.z *VljViX=|G.~8Qǘ"+a<MgF}>Y9^)Kp,[ .S6_CX"ee~{ՀV *x:n ྅(5R4"0\vʻwOo;e`pHQ<;P2fƲE 韧Sz=ȡ!w*vqf֮0\z2R\ғT5yIZQi~18,^֍GMW(~^%!=Lwqt"!T"̮?ڜxa'_GD܈zvn6kZlg<}gjA nU}Ӝ2LK^\?];$^rw20'd= ˮJoF]oē=J=xYsmBR}Z:2Kſ7=hY;Q)0* RfAń* )~ۛ}e`pŢ;[9Y 4L%%_ $]؟D=^8lmT5@3-g ^P Lw-{gEHnMi,Me`pZZ&Vb M?$M"-q_1_{jKp,[ 9ԋ^8U9ӎ_ze9m8?Z[c$Yl>\+|8DQei X Ȫ:=[bcJ+ [EddZe  nZECi&TWƚegJ[c$,Nz@׌Ue*˒ϟTE1IOt#~ft2q!.ڙ(N |=[#fI6fVW26$Q82GYe 3aQy6E V# gm֪E/ҿ[;Өzijս'souXDV n;% _tM>:h7GSd+L `2xO d'֑҄m/H]wTjߞۺq݃%vibTF~ǤNZ4.ɢ[He֨Enew̹|<Gѣx[Ƅ|вףpFdٻ}*넬kJol߷z@Fc, d[dwDjIHc[?pJs_ۻ\cU@Zx-)2@Q=:|[ŷg%)[8V-Ry3@07y#g=G)4KQ'l[Ao #(6z^p?M@JOAQ 4 ęg2b .tr#uV ϑ~eO2;{2;\95A/ntCub2U8&C!%D!lTFtNuDu#P0w6ش@ Kj#CO1RqːW: %fSח"0%'nEz`bsCF Sԍ &*[ݓG|*믾^:*!į)ϨCChb*ӌ)w]`2 gH?M&dUd<"Ok6T]z.]=m"7/ dDU}&;OT݋Pya$ǀ^'|Um=t9+jKp,[ "_:Q {} H|dHWBwjڛAab?:"p5{w/ww&q{XoUoȯ~.Beaݘp:u2i/Cݬ&sXA_pf|[v2weaوV4XR 3~KQs1/,CZYtrt4^'i( |LWEBpbw;( 7$SmwS 0Ui+p[4ju ;R󲛛RSt Jܥ~^0 !sNq~D3of24_1*=0ZEG晝QkC+,P²2{ ku5}6LXPke~aHbMΘT'~+tY뙧5[j57чg:xHN9+1EpX?-.'\ $ܺ4KWfulٺ \%MVS㦟JfvVXƞ  +8p鸳Vmׅy˰YQ[cB7u8yy]ůWh|eKΗEAzN@L@Pmu4԰ZP;:!Ji(]f^4=z-+I=qq)x{upKSҏ+qkqɺLɓ@49|k'}Z2e`p8U?/@&iuo{'Hzs.B(7e`plu1Zw'.}"JzT7=N!l#Z #E#`Fƻ߽x-!Җ_d fa"ir#_&3FNdG_ G#1C0[nenYԈ|so敍z|}T7zn.ȴq+)?2z]rmYtoNH݆Q a,G<208WÈGρc\c,2/FҥK~OkFlU&[i沩 }*OVŧV[" u\zDe)#q" toB(P5W)qfnr7۝Ew2ǰEos}سEo|$ّxPCqDhxlP+hb_xJzQ[:L.h7) 46]ǹy$3ơ:Qb*UQ94=o4=ͣqibT7 _{(2jGmDI5ɖYÉ1n̋~|[yaeBƬdԺ?kvպmٔ).o_6 ^p^ҰK<ߙa.?=n4S7WbzO&WuPdGp-t4=Ҥ:˭E`PK_?5kK݁4|2ki PvLo]t-_P53P'`U7Im!-]/YR7δΞɬ`:P CA ]РI҃^'P=*c8ccN9nnL{ 4[?x!!O\2(,r:+3 <вs9 E ^V,_q{/a4_o3V8Q)AN PM3i`x' %2ӝ'IVsmk Ve`7@9\̫"ƖD7Z$y?lY hX7 !X|:QL lʫly@p^ޚDlpigl^|O ·g[+0Չ <"! ӺF`j``R~\99} ׾CBif:lz͛$q Iܑ_2͵2kX+3[bѫIR ICQeLcmUja(. NʦqNoG=9q%Y$#ɘc͆4C%Dim!hrg<ܹ $[%7ӬbO.jONf.edAg5yC\WXaCC\l/y; uA{7M3<%ƲlߝYT\sB7T/2 F~'wgձY8 ;>{ȴϼ[pX\=*Uoӣl4e"0>[ qѣF2;/fc9}7el-xtH4[3cm„rlŖr#T6K,2%~PT=cA<rrmoLPNnF20g~18'7 ImT3pMPxQ4z\OFՎג粗/5 ;ːhːC%XX8 -ԋL6w,kYG\a } Fm1^2!C\`@M-2*u`U <cJ?F KGǪF*Qf"#rxBlm7:e_+|b, u\XKm3 \JnAbeh#FjR!@;%ߌI$˺4HmU ^  c'WRF6^ş[_WY k8ڜ3 #{=@;J3\?"Р%!6%Jji!\/r_"oVYH,ab{NqoT $u'Ǜ;|7q\ǽ?~*8ƭcA(׽вtV$+tF!+#d*++pjj`pv*?³7a4Rqgf,~09B=me;EbF"\ޟ20K*aʊ8WTN֔ΚJP"P,Us@jͲ1T;:1@ĝ;Ԇ\[0m}Y>l.5OhP3ڠ?tҵx~cA>}*sϥ2nHe% }lcVܼ5S;/i܍) /Epu$'fSf甐ir}_x僜w"J cfט.2 qo˜9E:׼&V`nᳪ NP7ngkؐ.[Tw\$U6Vύ4?T(?x~R9p/0 gBc'7>C"B[D*Vg^GG)])n'R!Ed*0w.1Q˟'Kݧ^-eEyf+whf F~#cn͖rŒ2ߵ339덇0rsH@{TkY%2?kuנi/ evЗ$ 4,п3ʞUhOV)qMZO!?O.AbRYEL[cUCWs9Ky8|~~p#1yyپop5{9| +@ޕs/8+Q:JVpRz ֙m沷&,ޒyx!Չ5:wD#$Qk 4I6;Ip㋥ ' Ӷ^t?Y~"%8'TG[P9NN}? {|b@UsXH\PHN0% bs?po>`W4 uCeW4DDռe g`dYxlȧX*l%r]'ے?s"=DN">\8=ƲYf ГHhtM{W=4g#3]9ʦ)̩qEGbngە208q}PPnC|%цAs|b'NH/[p\%|LҌpw"0eq06)](&SIs7>VnsUXjEˊiɒx[A%Jiph+˱f l,[l >e Qbg#a.a[*c< -l=/}D!>A wozJ,G[TK#P\җIV{(TGD)'~څһw Ŀ4z5xeaWC]ߨ\:Լ*5nⓎLv9$"OpM~%$"N y֒ɫp^K+#pjj,GDAKj,mUj`pZi);}. KFZVsҝy [a2Z5.Fؽ N4y3w20okBWS[\˲5j`-Ի"n>ͫ,:4P_o5K֘Btk1 Cilt@aV\ͩdEW|-39s>!h\jE1k{-c|0epXaEʟdD"%gBBMHIMR|ߎTڭ=k̖Xٖ+E8`Gf wM8[[ƞP \n*zζ>n{\?.3btܭBK"{_1 טcX20(-ŵ0/ҥ<.7~; fgC@Iň6#:` ,aϛGyBhd\E g~H927uU?T8U,v&Lk0sܷޒ'ɟʲg3HNNT%wzB5H08/ 0uKI07hijGƮHҟ#şlAgn}ͰcL,9@“S_~bކ){vӇ?{Fs2COE-|\OW Z;Ozj~,ijhʋ[A9C\.,-B'Uφ,@ee#FRHx 3`R\ a8,P{^l=E&oי#320gOwNX^$kps  NT2>kҧJ52wlB1d^Sۢe`p׸(`j?C$&]֍9IFlFF-]qH'ltͯkQ:AK>wle!s=GE+݇NTaa\je֨ ?MU$H$LBOd}V{"p%x`T =qw[=;z옓.3!ZrCNk'R$?' .{.*Orn[GLÐ;'s 7cBo< =qvluu_E+d zB5H0׾^r }?%u;.՟(ᎃ|2Ǩ5qp= Impr<e({o 㺐tx"0g]O 9庄:ve`pϲNea {E2085)aepEQ䤦W+gjiKp,k ]vd}[\Vxr[֍6ts2Zj$Qw%4 9Z+ʲ FχhQr0.I\4{DT\ ,9g eaY"4YW9MD4rg֖XAބ.yo&\'(20w0IkcyNK0je<:ObfѲu=:?ۘ.YVI.m~M";q8=G{m>gYRITY;Ze e =$\I ϶#?JPkmLmU ^  N1*9M&Ъ8CG)R{ K\Y\M̃,F2g\]Ha?'ٙ$ GQB[i+ګZAy2LCy59Zי/8'اBivQSUlƽ#g4C\ZRk+dc9 xO9BʸazR9r;$}/WtNϦte"א PUmb-xFAQ7+k~I.(7F#OAqӡW$WO J(3ƹ7ԊHG犥IwIx U8=z:ۓYG|2½]}gvC_tO=͎/w}UM4Eu+N=뤕N*%H8tG;O/6gMPvM nMe)bX!X9ImU EYSJ ̧1jBR7H.$72A{\3/Œ#2^^/*=]fff灩!wz &XJ =#DCDzP  n@w/f&ߙQ4ѝ։Cɼ2+t$BEbXF, MZڜ>3iR2а>S/=bPk3mbׅMBݖ!3b+f -~/ON83crne2bo,uq3{_\[@O~TA?f_2J"o$bml&}.X -GbiM\v@Q,#{J%^Hs'ݲFy5oCGy@W`MőE<8kl })(L,[;20nߑ} CJ|k Qm[/-e. \ՍۄV,V"0O*?S:_;UA@a"A[cYCO ׭Kp].CneNh+pbW_דS YQNj?P`F*G' 6sLF,B'EAj`Ozt).A9\z#Y 2аI_7F=9bOp#6Md?}Å޶e`pR^*,Ñx{Xr9JN^q8 !Pn\ bVfCp kj``S%ݶ%;q>Dc\xr;&k0̒/^ dyk\2а o%6Š Ab;t[i׼Xq+BxV*ued\؉O0<520>o;U8_FfҖXAɖ)+WfL^9ۮkL{2@U \dSګA)mq/ 9dA?RKhǪj c/ۚՉC5C5Nc8Qyz1GݥSYBdKaxj5 ִzq>/Ep6= A1|0q " HU@2[!ChX7p|97ai OtJ0ngCp kj``m6δmdh㧍U ^ ҏXХUĥ%^4׶"dqIǪF*^,kK{=ao~^bswvFqB@ھ, q\;sOc j]jG\(z^!2AC+ؘG[_Pj_mIC_y:j:9٩VIO T:)3,/#V?]9?Ǖem> f=.Y8Ӎ23H:DK&VXP =}zW7v5MϽ |'^cq(#F5Ru8ШT1Rl{ILM2메8F5Rw5@0i O;jW>״ Z_4*C[ oNn?taXm3& oӺu]"]3L #v>@>n?պ ԯ&41Cg?8CPGdB X$i=7y0}b=۶@I,#0 _t)w} Q;vn{KHh%85jaG2;TAZf"2CBo xVkrf1'Ti^+HKf(ZX.bRWc-5}{(23T]o=p`{NZ,֦Ǻ0wrڿ>}m-o 2z\ow*KfF|Z}oAO\5}a^իpE*1uN XWY P,pedd:ڳT\5cb%M'^ v,zl[!% Qz΋6خeOr%kDzP  n~R3܌,x}'f'%FfәNkXL3 ; ekUsdRfY'O ()Գ1chPo]F[ki&VE`P%<'픿*"06!RיsPe`pt 5NͰ"9bɒDrxۡ< A>}!GR0161NPcwLAQCIKe'208բЮR6zut>{* 3#-Ku+B;Tz\uA+ܴtdǹsĽo4T\d;a0U\ٞ;=3ӆza'l/tJD vClgD23tMdtcJ ו%85j`psaȁ}te`pt‡u eajwqnۦ.)#?/Ά嵼Hw^ߌW4ȏ|L4ʉ 8Y~47. Np&t!N[{KDHW9Tx8!Xj tb$ AX%ۿs.7faMdCn3V/X=,GS)B 6)B?CS|sO Ϧ&3VXP =ҨTn[ˆdOVj0 f+JElNid 9Mt4Qq>`U ^  .09%?O9D\P,Zz> $ܼe}sicpCc>_lPZ,_wkl }=c\Ca _5 y|c#u1EgpO2vمd6ǨF5(čv(Ѯi@Q'o=γփ]Yn /cLDzP  N-l!ɓmWIxcz":?cU ^  NU|ׅ: Y}VIx~cQj``IeNܲ8AmX%v}V^D2ɸon%8~`j Ag  hz{pkGX j߹4VKM/H(0ӱPB*s5A}9OqSvefc8if&䉏T2ǨFݴKGN`ePMo?_--ndʑn,wVFv>~㸔,扬WJ$8 vS07F ~ $ǹI8{dGg蠜!uޗQ>F`j``r;zQGrrI_%LHNdc*#F5Tw@0Ȉ2*&;v@nα1qv+ή&NQ4qrqXcUCWca\E0b4F$ 4 SԆ-irp'q^3'+pjj`pM,K!Itm* +i4A]cF 'd"ަO2͋$T/XcX#Wۆت _O,ǯAq饲|ݲdI}Me`p&ސAyIܔnKep&'('82аA/g2~O?i!`eCΑĞ[.:.tnQQߠ MN z9 N:Dȅ$';LFv ,37S<C3VS j 4NǙ4c{dt疔7| h00iiO8D!e|3PpRT%v[YIH1vk^e ?Z]Ƅz+糴"DoC?'Kw 1q.zB5H04Ryeel^"@C?A^ muޏ{Q4:m c(3mLHtpzB5H083cRMoM/"re@TSoW9u !,s6L}"qNx[oy^11bҘGRnO5"q2^ǪF*vrkZL( |m6kitF94*sC=뛢؊` 3q'#AjQǮ %1ĿH{6Y88Ǫj 7/kYhS4D MgO'e`p䮆v/ڃ2 è5a;&('gڗ/No]G]NNHw1ߛ\#O<\pgw|=[\S^Z_JD*Lim e =$vlkN*|, jݡR%I'!v&evs:96o`\'oi Gf1=lGd61bR=ecREb~_f鉥n&^5;K1&0xXn ]^!_x1z{au5'='jbuuD4M qts IKD&T?eo>:[Е2088U3\σȐp7tD}[ҚLm920̧YwȬ;,273v*F̖XAiEny{@Lq''ڥX-^3j!)Q' X[ꞈTU_<-C/ X t^<:/\k fQ -;;ƪ~W] ),X@(l*uR 6zU6E.W9筤(~ʎ|z1-tE3A/IRBrz(GmjhԼl6'&m=Qýsm;^Qi-:dvN-6%P2ld~CNF!620q6٦(ӝCi>6ǶUDqhrz% :ac@n%`&뗲.'1L)ꏼePA! B)xV袹JlzZrOMЅIn况7zjhTCuW  (̓{1kq.lAH;G]h} nYaU|+C6þD5 !I.ǪF*z,37y!0*3K$$5M[cU#W )L/Br .o!}H$ $Z+ }/nٸusURQV!Xjhr6_Iz={K:[;]]wJHW)E|IchP_U~o6P|$dι$ V*QW#YzĬfqAD/Yy 1=Zѽ{ڒh6kGe`pLe?y8uZpF8#O\֦*Nj2JMYh#_ÑϘ27Ə1\p )n]Hr CR~SzsY7Kz3>0"0qͳ$0~&0pM65i\!&Kp,k ܛ{mPc VoQcQc&I_;D IM}*ʙNwK#zV~Ϩg{\b!=g{(VVXS{5H5mJEb$Xqjw%;.רNf7[sC/ZIϩP4gcsgL׆QtW|}<-Ǫかe W>m?1k$ P7Oȼۚ =rR Ne`p% ?YG^>՞Ȫ=- ]]GNGVe`pij?il{ e`pRi/R\EZلϬ+ݕUKmz^6Os=E`P]iut\{4nr{~ȸٞ>=ɸȗ{trXio.6zZ/۱e,k E8pWg e5ULwdC<|^I^W7> +O+_2!y ܑ?_VJӉ IZʛ'>Ӱ7m;B}d;3# d(ݦ PUtTa!tRa=o"_:/e=B uk*ߺ YhZTOڧux|[o gA/a9%M#^.]H2KЍ./ %3_~TY9-" >Ӄ6=湳&$M IF5ɚ1/$F9Bge 3>e֨~W\5 fX4Hɂız ./zB 7ql퇈:8tNwBecܕ>åڼ|JFS^JS8* 0SK۞Y׿9s)dry_K䋕|i20HI.S7YMhѮU\{;DuL_&Ck)Ck oAѨwI2w jwo ]gmsIOg#8AH7#cs$ȱ'rvN@T.1='ObVg_|- K -@š,T {Lٗ;HP&5S0^D 2208|oe|4\ȖY܆208Y0kIDWFķNObCh߃ZSi+Kp,k 좟e[;K+Qp˃PQރTtaoNu]8#O'V&" T] fjuta*S#օ Ұ9,q~0"56i%IUmtyo>TWa7KϣD3n{]>Ze&s(Tg7 ==|]+*=@J-'TJqwmc (Z!;Fd #B3A7Vv]rbl.s308/a~.' 裑~ ՁN%wn S6ף+pjj`p-ji y#{ګ!Χח`3a婠,K/H%]7`20Ϝ|4pJ20?YTib3QbGs\rΆlaqmQm:)ZN6{)G(;W)œSp  ѱ[CYC"{kƽ.\v>)‚/V: 6C)X["=~.~x5 Cɛxm{720ߒD]]UjsZFU<#*3_(ʒRC Hf-'Tn(5F dSG|e7xK8T]fK9>0FI`Y Vi)Jf)师@tf+pjj`pNNԑŌ9~4F%{HRlrK}Ϥm;HhNg0^FI9)~1bN[cYCO w vB)2H!)2ZXRjw߃f]72 o bV΋׶Y4Zh>n sc4O 40 +xF*eN>cT#uW uhd=8f|t:ګA^ϙ)%j>k1dx3"w:V"vTOw $GAW*&g"ϋtcWO֋pagQju9}NGy 8zp֝:N;Y$8M_Ը3DPBioYv0,3ɟäS(da6UTlS#}rZx?L+f. L)+  ÀKF~ 1a _5 L9epPi%y>~ok(SsOe€&)P-4]c[.'/h֯I&ו0tҀy6k YH[+Yߺ .D-2/^)>St^ Y_a(P{5H0OqqCmo2aM?u„pzt^kqzs}EjuiEBd'U>E7z?!:+ˤ)I[Jw w-;#3.'O42i]^8( f]?"oυDzP  naqhmo 7#Jpb4v] 4ϙr!ZǜM&E>1vؑ|A֖XAX+uY+0-_ϣ+7kKhɶ-#wkH8415F]dOo1s`|%9.e ѡٌN 4>6K{wѪ208u$#$A$u4&kMcO‰~cB;^yЬ2?ci]-i͵lH~Q͒UIqXG1~},g-Z%MsY6OTOh9:QߧM:R a=&8+d#A3V/JE_U׈$s(äV¤VEoNz\ūoEҒ2?T&2M&o#b{a@=&P|n#'Kw D()7^Jh3'"-Fje[&q`k_`=yp䠂l\,P Cg en ~Frt\Fk,>jzF-a}؅-q.YK.l?zDS~fc-\1ie`pi͑iºU4E. kN HSh-Xd|W'xMT^̅kVgk } #p 8"1#[Y]IV>RhpB3bIrV8V5T{5H0踰89F(/kPq\ԥV(F?1k+x%S.Q 7 \8e s$O]Ba'h>U{d8;u.@w!vY6|c}yܚc̕Wu螄PTq*U. POtDZ%cY^*T&x ~C2vTe`pe鿋۞>Ue2аntl~ń#j\ '$h ]30%Fc\t 'VtEVѬvi}Ȼ7;]mۆ̹ N\nQbơ|o(bW]y۳6&( ~כ@ǭ,b>"}bj8uGW-'T*qdd_ya* e`piٿqIgz2!iGj6?y(Ȳ Y"&?nF:qCP'DO[q4=pYq>3e( MHphk z^)@*R' 2[ Fv})ؼq>;ݵ/23L&0*]/+ueWӖ_fĿ"TJM]E mb288V5T{5H08=NyN=1+{m=eclx"/?GKZը.B2}~,={D3?{rUG?e䂬_.t\h.ݜN0 -5IY}"!LJ=.?"͡B=>…7wKf. xK9@`Aar:vdWX" {s'^y6TYe"i],H-?~.\%}/--sq7xVdo{exYk @7vGjoZdii w APB+-X+-3tiD.;0ؾ) cfHT9jV@Lw<7~` Qe`p|yX'u*x !%qoc-vHAKs$'DђqEɞvF63;ѻ(K CEjif\ߏ[{|9eY_vKq Y(WڕQnʇ20}^נgET#o?{VmfU@vfF:티ދ뽈ꨊ=Ȉdo(dբ{U\IoY*$Y+T޽qD;>'ex ݤ컉!*ˤ[ȆwtU3!^C7W'}p;Ia2וn'2e3ګAkuJɞ-oO8#xΧW +}fq3 " Ym4W,ٸ13S0 G6iiKp,kATlg9JT6}^MU'J |zY$lO#|\20gpg^^6>Vdg@ 4O0D9:#OF7(1QIL, { N!i\(blb~ʏj)z{$v13&oTua:3ac3~@nP3X-e&-r`#~8__̸y x6&E*T7dmq,.FF DIrAI?' a/2&*MnK`)ܷߑnD1.)D.V+BVO*.{&bmDLoj2ncg"OFyphaU +H+ tYfQϠ%9\᎐&Q(DJfi\ZS2Y3mȡLqQ3:P-J-jy;bј>ڌmTxukFS!i!w"i:9Ifr{n Ɖ%XŔ%85j`p濸q.j\UG\#;Qq#[∛0!>PNz^)ox>q~/QC(lGS-kp1r{Tnd/o6d<epmqGmq\ICMR?kv*D5jV%m%gfjPVXP 1\10q^`/lHwqm[r`l\0F9 5sey1cm 4G/%%-Meǩ@IQ05/DKonZ [{.;]F+.!Vtq wێ_Nagh4|T=?1AGs.p^m2 aNy5 4Lnmq*wמxA_ޡ3) H !y!cdz%85j`p:gh7$bɹ6,ape`p<'WmJ.7GToa@Yc+%]_tp|}lڢFj3 &0VaϠ8oךs=_Lvqd9x'u?zqI+)ÌE`PφPL520>P 7 Uq޷ɗEE 4}ZH oɱK^랂]\ҍ[߶)20ʀ]e'hyR PUl\":uNi|>3=mH ю޽.{HHCte#ae.Amta,/y4G1;3?ǝs׊ܽxq,C2pR"0I DF4l8$fZ K3V.jR3=DdTi\ 'ݨLَrfނxōmwdKJV pak9gdMĬv}djUyDPz"*1C#:g/d}>FΓaT_54׍ use=|&.w.鉂Ʉ88wwm20>;f.NkĹ 815};ǩ1ːyj-]l?$h~On=Z!z>Sh]_w_Gb^0t?Ɂc#ct84:j_/3F/$uTVi?*Î`b-K'O;CnPYɝ.=;Yc{BTo׽ ԊQ(ZD{ KFo_U9`y%kKiF l9$yyڲP  }YLK9(k),1n/cܐ.u8~ϰqO ?wzqX>ɩ`/z'tBrgν+߀i8p]L:F6l5"1*䉅=Z+2ߔ<< $\+͒{g_C]F`Ӵry/DVE-D=<'#RW܁\{' {ZB|}.$w|ab킣,Z@5XcYCO gqsE6~Ygs=oI!5wd}X<?xN./jKd!WXV1+˪Dk5%Dz.;Ռ,Jzx}oلC?s 'SZ~;zv@0MT0Cu?浪w:%8 1֦<*c87owwDk$ڹ vp#t O NAE,M.ҙE!LMYcYCO yyжGC`ZB\MsO}?ޚu"Ж4JQwmXCW W~l=ם K 0[)џ- o./8~]o`]5$w QD@' 9IcQw` e nLp>0Fē<R8/GC8F?ۅB7_sj``7{"94S&GQ Ч3$.%8.yB5He4l.8\떞?Gv-FGehYQ\2Pv=#yX_\gq] n¿y<E$a&맵~>')Ӝxf^w>=Y|x1?Ph_\E"cVCmzhE=O2O" k[(Y 'Wm<=9#'?Q*uΑOBKXRGO-ڡ;)ZCuZ6j>0LwU@tpd{5cNpnGYt\_wljO0w~anBәqLǢx~bbi=Ed%ّ ovMatRDVWUA=}ƓCoa$DL+wBP[@UWUA<wzZkki~V^$Lyt-bu]o$ ҒaļFRZFgQJnr̳37{Hҭ^ī.2#qX\-'T[z I`nd4l-@ P.l~,뉯qE߄#ĖIvvfH2 SG"/RKo TjQقtrȴ,_H5y8! b(XQ6'aQ]LȸqQg̳6yڳ nx'iک (~W?,gɪ-Fk96/5rrG 2P5뭍o4x4]r%Yd(ʄO;9|b~Tfr(W8:({am=<'LfO(\}*~#mv%?; yLJ;z̛|[gĞGcE쩀3#HpT6BGk7FZOwE88 {ehPnDS$ZBA/*-0=>`,-Eۙ\WCۗ먿c/rU>ln2TAOh*`@WhD:3t r3按_Ɲ2U(av|:"CLz[.̷4"}$&sbȱ^ECjvQ fRSK>Eˡ;t8T_v8[+p͊8a*k8iC>5b*apYNݥZĄ.g5YOFD~+YڋbW&1znISV/M#C)|,r7NdG߯V`XUWU!A֠-ybglٷrj9 j'>4m2mT]uW Sy l&zا1Nq ;%}'Y(  zBUHP85,"[C-T9+DXܟ#v=rL;tn2 Ya8YSRD91%8Wi g>MF*`ju1=19A~^ix(vUXaU=W 㗈8x[IhH=bǒX琉@UOU@J]'1)3ě6/c7R8B,{;MD4Gf"O0$Nbu5^PWhY@RjH )`-)pV`Xj ZHa/hdkRg;$ &ڪP 1h]1v`qg +_U!;$GtcѼ#d^-^[6wϔtWJ7nl/0!l[0n29Ov\#|0 C"P(uKƍ^nݚLӧݔ@V I\>{) pʵ%{ x,",_7cKh $I~*S$3\kzbT*-]:D{!:^$~6ä~[ CmTF9W acgl}-2N={A~BLWyy@!,{\W'B+׈q߂ĤIۡu< zBUHP[rЗCb"‘?hotA6e(s~GAN4P˓O--'Ts +VLIƆڠa26ӎʹ~F1L!096O$*IE7vϓ~*{I+KAV(+ظB0d҂շO%KH 8H'p5:ҿ; gwk'?"*Oau_%l]-wk#`oSLepɍ\CK2l!hCWU@(n0#X3+b3٢)v%3G]27m|۷c,-Okqpo5ä~[ h]w/;9Dmoz CAgOlZ@zc]џ܇E}jęoխYw۰v/t:h"R$&E@fIQl30!_oaL}gnUs &sY{Z0* rm(y}{*bQVU{UH]Nl]gIֲ; nG\0 Sל^ӷ75qeQ=h\1;Rᦪ2PaWdyVezT _OwO(ܳ涔IL+mlBZMq)9s 9RPL{id@[plHBܗC0 `rJhǷl;t`ٰ$6}{Z`e0:n4@hzBR*[L8uFl,+A9%RJvcdd;&w: 1 f6hJ(_Jd?_f`Jj{0ZA"3'(Wq2py-ڿA&H ?Ag(㻬(wDp0,_0}}lLJSF`}W] v 8Ek6K(ЂˍKqM;7"a\b8 bԬepvy u=*#@/rz+ WWc ۔6Z4Z2{>tx~(g=VyJ<^M"勤I E))@샓 o8Y?JiTzr\oh9(`#Z3 '(J@epc}dMXsne{FYzk#nؙ/bv+;JscJ]IE拏prEt$GԠCF~MLk`VRw  ꨺*H:hwbC93"P((1C!Us8/vgF{u\LHtut`XVB-Ch}Zܟ%]<[9>Xkޥ]D[ʹ 2B ӗ$G:)B/p ?'$c6y[.Š8VC0 `z˒z1Nbys(hAc"JK{AiM]=/ q&ih9W*q/3Qf,#J؍b֍SA[!:l5'Bڔ<{ @!Q+&vsd&#X‰塄 a~FHH 5j|'(zBUH |`8>MBߨ >}wc5{ZchJmdP@=$d!ߒ0o| :g0,XJOpwUjd":^熿l -%qKPDd5 bҍRf4ּ $7ceƋV̰t5C҇AVN@~ Y~׶x%txFs$&e9=[c+_*M^a#z82KUOYw:jw'>1ʘaMF( k#/Wq3<#z32PQu~U&(RRmF5CCW˗DPiY?=ě[f:0^QKIהb #0`%B% q[MZ4Oa i˛3)g{\VgfvW`6*闆r wQ6Y|nusGPW'T{OW: Zx8X{kӉZ #0`d_۞93!^G y/@E>VګB‘Uv*p(p6˻xJH&z b>t1xE:k5E-apc=N/ttǑ }GM\ +_U!AE׏{ݠ#5V-f$mCVEG epvŞT팼IPA-ojIBK?F="$墧, U!t㥴j*:R,Q 7P2'Z_SOeZM>3Ns}vg]y`]Yۖ9Wtĉek,f/&3qyhB>nȜrϸx\sR0mX]W FFF*t<&M k> #WUAD޽SN΁Xc{JG#3 mݟCڱgjo0ðz  &NJ""pOAY@KڅM9̔K w~3N]}}Urhh~NM;$)DIJ7m4r0 t%aP Esf>/k({s:fJ~;:Z GVJNU)=sόe`}]ʵ9]nt{gjAΔ]Zd&\qMͥ6ʎ'Zk^v{_qJ)XEV U<;=:1͈fLSj){tֵ αtRzRŨ3GȗxM)p^Z=ٗ؅ICfM6+8-znw!2Lj]0Uaʊ5J#dt-F-%rV]?2P8yŴ{ _$CVG.#y**;W\hr kcHoɑ:RCW9qxeAdvoxٙ=(VC0 `r8nCxw;  o,٠#5-ȱ۶wiUu^nX!*kI(@ &)\Ȣ1zUVF#J\?+Fp/<ݖҩt?K(Hn Yu11{/2uAďKe"2;t|X~O6T'"҇bM9!^ǾI+0pÊ" ɋ5oڟ* aY+z!Ls8Y $كHe1e# 1Fv@qKv3u$c&k dDZ)D(`woesJKd>җ9<.{$'a)Mm)`?L={'N4yQ٪HQs "P(1NSSjrvJ7R4OF9\sMeʁSZaN-GvV)̥k]PQVګB2RFЗb4p^eobr#35,읰c%Y$Y+9OGꞣ~k-VK'`ݚd,N)!=t|g{l^4XzemO0Y{WGRPl&0%LTXq]x\_Oܓ Kn_=*$pr~͡<2Pg5}4V#q'h ܨ4o9 $6d.f]ᡡe am~."LUv"N$dlǍm(K꪿J (0:qk:׎U &[&޸qIܖ3EQHnڔtO5..-׆5}R*BsByѷF pU C*ц0 ¼3n)Fuvo$+ "j\R9i\ew +0pjUT:; R~~٩|WDV"8䊓N<;dK2CjGS 8[H't>ڧ%6Gj,̝˽[ń-Hsʪzs":Z ME[Bk\OaZ>lİm2P8ʉ}S¬-Bq=2>zf9t\0 $'j *\3VZ~(#+TCelSL̤f%@ᜓu >LZ_gG8ZY_ncDP B#ϩӁxʏUVU{UHP׶0,ДDisv/Wy(AY$6j$GWX!}~oDK ꪽ*$(ܲr^22"Usф9Y!fӜ='s-B L=(K[RSK(_ˠC]]{FfťnxZ -E "rcѺ6aQuT]$jufQwGo x!qh/,@*QXWAՌtDɒX8j>ahk!}W_ 奿H_И7ߨêj =nRJQu]%l=`=QF dw%,Ek(\> x3h3eheڎ.SreJԌdz31S %&` R`B޽lZ] X/ܪ򳓯~qlr |6m*qPs<}zqj&ޟS,pz`Gc؂Դ^YUWU!:&qQ̺#:@d}='@gvu$ګBIOPQl!r A$j,I8dOUW[jEƍCCLkb/, Gtu+ԤV+0p+-$d;EV!_z-gV`Xj ~8b{f= #~z]|/,jZaY]O 'G[r ?[ 8Ӛ5ǽ[}(eOK '̼88a"^~K0h?i eu=*$(sؔ;"1.Ef;FZ ꪽ*$(O-baޣ0Z,ri5yaF`UOUAqO8/{hpD,epcLmL3aWuѦ)]>AMH|-fi >[YV7Cw ҵW+L+W~DHˑw+$^!IcE"Jh;ut*kO,yzb{S(ܳܶm< C|T 'zLgؑme-D k%YsZ;ꮆ9&"PK_t2+74ȳkugp hM(M_7 B8/D(ܰO9dUBd'E(LӒ`6%z<(3krM VxEqUIgHIgҒZ֌oRv\:7y.-v ʛ6D؞{#lY=:g/ ;OO]SLB%jDY@m-z6\`Ul 왧Xn,)P3*C )n4e4-܇GΒ9l"ΤƀؓaL)&v$l@TOU@w"_|w ~ia:đox#A/VSyU@v[U$iNF9E+QEM1+^N4}E&ђ#0vSDXIfHQf$џ[OչO>=VuS81O{ YѦV1=q*E*'jsM $GGوCٸto({~{yl? v3" ?8'9"N/و-FxbڷO&?_7|>9U˗A5f1i1G͘ D&Hez.+hNX h. 0n oHRsKm˵v-.y^,nRD8o"a~$,'T[NSQ1BsΣb20靹$JS9&Wq4IrHFCSeXVGU@)<WxӰ@ڥ_qeۥd4T[4O7!(IuL Qpnj)RD Wb|_-= c;<>LySPT?[@UWUA>2p+mdAZ(ZO[@8ShKbŵ 'տT 7OQ=EPyb]5/t@nO:'3ȋfGxne'`?vD_2P87,F1t]"P10 BkP(D2Y6>+Mex\;jC]TZ+Sr3!5L{yY>ƓTcTϓcT'daa_Ll sQ[W0E|Q)LvG|DxnčE4Ey,{V }/-z[OHx^hs'yȆWepo?d15u9d_ vR#\84y|dyB:̆nf F#K<(ݿ={Y \IB +} SV6wv/LJ0Dc|9"Gs +0p3gNL&G^?:^(Zx9)+0pwCg>lPTev~/=q-Cɓpܕ/J( ЧaiSPS{uJ<]#Ǩ$N]Q 7膐ن@s&2P8EKMDFmMiC-.oBZaY]O =f 1U٦ڔ?ens#Č [Sk+(blBM\zZYi*8ˎ-g H[IoyF$!GȺ2^"{cv؎}i߼}yepl06 A @!Pybu0x[h쑋r-4tׯVKxB [}]JqcX20?)ugoDh: m2Rs EL6a'?X$?eŝ* hgLw6*s6"?:Xɼ>" EaX]m{ɇ3HZlN{)zZշvAC;\$ %0ݿgntL-x)j>l ɫvN3Xj)C[Nk azzXPi% eY1PiaU,[ ּFT4<Z@ t UK)XfZVzQ Ϧ2PP-ƄiE(ހ QMvrHBQ לBvl4~]NLl'&'o3meJ`>p(slp35VL@"l_aGX>^+GuOjڮzj ~&mGs-0µYOc}]e adu3V)gю{)JXa{BUHPu7*Wom{؆(VYnw5'"@xaSK.@sR^=y9L&)j0K*tE2 KywIJT/@9Viiz`Z!b 7eՉ~|XPG08n[,O -PJ`0*.K%!Aa7bYc]NP1 $!,'T[@jl=$yP3#M|/) 0xhYɉ%0ep+<8NNY 7*fHϦQteۅ1f(q:fkfZ"wI~&39M`XV-ckɍ]ݧQ29& 4Ig>-ӇYi"e"`XVB"P ]jvepm{h6yf(hq5jJ}$`A\_ڑ'3mU6xepmЩv;gΖe^ n<1ƗUG`6|m>4S};y)&blo1>K,e,6 &-F`#!27菩L ۓ{#n|ϳ!6 OYFQy&8nϓ@jo'g4mX]W [LU֨i?JMsi* F(y c|oHU't]ڽkD9"ȭ{-AB%NҘ~69->qL`{P!l{AEIf~&rs xXy6FwёdJ\Յ]c]@'l {j]Q fa;AD}IaʨtkwD<Rn^͠/BVK6O09Ϭ*?J[+j6*vQaP8NmOI-sG-}nI6Ss8P(%ߛHSf>nt{3h<8ȞhXZaU]W[=ZҸZc[ -[f^-ֹu<Թ5p&22gݝRՃ^52P89>1g<us`Ł 644NNv@} ^\N7njQjFyS e;pÐȌm,lg 6=Նpk4P_՛n?|^g*ԬޢO GjoiBoO9NjCCxg2grO(mY Xj]mَ $u]K cC`i1SAc-kjQdN'8Cv]V O>>TTRjSGSEWHҘZ @b7S>:(lj'}O,bYS õi9ͥ nLb1w xe'MF" }qt $ AVWUA#/璧^"%7 7&`j& GN?5ȁd(y{r]u>fQdR"s$Zrk;0 8g^Y rVE-[2Kc,0yxaDE(\kBdW_D6 lm(,EPbts=dq58Rqz̟'̟FI$zQ hv}ȉ2P6"Ť"A{:] бsvDtԹ@Y@':.t !Q ֥.;nAD cW×sw{Kv sZ,Vxۯ2P1"݉:efJtf5_^D3蚩MC0 `A{Ronޯ8~*|D=Vhḟyoq, ꪽ*$(uX:TʳMep8y[$r,"-I,>Ԫ' *`zJ}'օ4e(8d@ n,{hGx:O b0[OCh7! x%}`XVcGknl9!ъT 1q4<ǐz\8J߉R%A"J0G7qr/ qg< Gr6#iUu^n%Ǧa~.s @s@׬#~2=QEu)Kw@b|2&)yZ@3SzY (;"o0 ×Uj-ZJ3uȔH#h}8j7YAhǯz6`gMx|/ r QSߥ/SJ.a 6ޖ#sw/i`e^}ܴasD"PC9tvL-|_M[#Viy_Sata e<* HB9/il4eeɢ $w1bwz0,$F]w''5Ң,Lİv%/+bN|^J>_-[/MbJPہQhY 0D GTb=EP㹳ԅ32ƫBJgJRxF^NO ;LQٖ/3(cZyr-9-L<{PAz)oR>&'òPn}cз7MBd:.avpP>[L~3DFdMTCdqL:*K\Wk{BW<8^]6 W5#7ӂ󔁄G{;r"E@UWO@||O'ep<%-mg>EP/M~L(TNoZl]}\Kʻjo;S6Ff++/+Dڙ֓Ku﹌۰9H\%4 o9*B^I`VOUA䮅H"ip.ڊ=h2P>tu*y?; u%օS}:KHraVYp`|L፾HLs̒-Ncl }/ʫ5w6xRF!{LR&aVU{UHP8cߑxg㱞N5@ip\<:AJ9H*D 9:UI.lLIBzZ^ZU sn ܨRR!sn A{+]N8y{(S кTIJ-&(@^:2梷T.>?m5)N0)#lil! s^Sc ҳ([Hl/Fcx؈@xT,zpp|pj@S<0%o⋶:ŭv̶ž,w7QįBlۖm{8;¹,RR:P;,!&h:kRZePr[$Α?'wMl{=Pkܲ[+VLw[*NR6ڲg(cn\"/qzȾX,7`6xð+^BH\;mòPN{]Slס0DSEmNnc*s|t йjO,̦NJu87Uw)#ۅt409 mhss q N2z(lSh:VE;EN { \k'pL%,U'si-=4}9j7onh Y&69E(\Z[' R!^~8– Dmi eu=*$(@(-/(eD6 @~h"IHᬸ%KxrgaKMỎ)=A= #*?oҁtjOs ^ ~@Z5W@Uo 9Z%GCwhF`5p@]#`xu6ٜsI(e調* (k6MfSp1O}Lگr7 NNB qH"B):DEtڙAXr;'x~֎[pN:3p2Pѽ8MF~|e ar:Ǚ1i{-epAT 6~490%2udi˼x|3ʧm0;LK?f^>go\6`ٵLEHԨ'$oO;5A\?Kf$ˁP,;oF:,k9cz;yӫu-|o)9w⮋ ftfcS깚o[X`T;2PCt9P@_H H(fT(f"a ߫P 4N#0ޘjGVx'^N.pg*b?J5Bj|Wn hUIǾӑE]˽t@])u>]؀āB9jo{H+Ǚ=L8ݣDOxr &>K+0p{' ާKW(M<>TFFTDeLuM*Q |` ohm% E(F.^T48.p-Ktn_2P8ZS'Gnt~Q utplXDOi0YoR+{X &͘~'޻z􇖰*u쨻Zv{I9fعӶiLe aXҮ28ZYq"pru^HM:c P|7n3ň7/°z  f9Sd<2P8n{gt h6?3N)\O91N}E`XVB9;{DEGrpI#05Hu'$&V:*sD,ep^֛1&C<^ %~?4[Ǘ'[gn+Gd}znyvVzZ 7Yth`` CKI̽;9DC&!CϙZG[zq$LLdt":Z1uKԂ0PyynĔSnD ZEFj܁%ePr#BIhEWG-`*Jva䪻* (Yn 4+Fq'A%##0mT]uW cx6ڽU<VګBqsvMnU֪@傒xhs{ 8J͋+ګB­[%h8"@ej-Y@m~֖WҾWG>s'quvY$HEY "8 +]U^=A_WړRs3Ry7G.jaTjO1olb[o2Z1tnJ GN=LPh}7'&I@BV$8XFt(@rr۲͜ѥ/u}(,}C 1y>@DrzKs2*Xϊ86:jR~<8ňWW L瞧FKne5{,iv <x zGYqlZ-'TU Rn)+xYZ3yrEZ@54!qO2hluOYaU]W[F"Gbw葉x HmCD(2612b$ QB0 a eu=*$(2"oz_hܼ&kHh;<13RWlW\i#"Grq0EZX_|?64^A`4 6yp)v*[ ̰^",pҕoiF!H.ٛ!( m]HCB4T G}\vJ,VFI#!&ep/m=kPEǴ"PQS+:\f $l_#BIS_y$.ww%7 x6on UGgK +FvnSD |SkwT?QH1m]D(h Mb%(2\^C+C7wt%p[s+V^4ɠ1-Оޤ6ݎ ꪽ*$( 8K7yv5\s(xp,:h-RȔz+ A ƽxq{#@BSjARv7+ݏTݥ,ګB j^۫׵h!먻b&`25o?p#)N3HKi]~l._ܩߨMFM-fxSX. EIS0{IebT ׼G "ldg MPo(hH8" 7\JG^ӣ!@.ǫ5~+Sٶa}bi8-fSa e<* H^S#Hrn,e a˽ϝ(ҕPEv}HigńV;vS{8PO#ooCoE1$'' ƻVǸ@\ګB­rB< ygQq;q u/OSEc6S"ڱWh(k1@)2q) >Fl[Iˏ si|VU+㴄%p;[Q 5r NzL|P`Q SjzBUH{lNJl<[rKk%8diêj_#܇?T 9vK55akآ~"FݾVi2iT=UWZO>A+#hH0ɋi8Q4y2P8@Q딒sO|sc e<* mMR*J#r;'Y+j!+/ګB±Ս`"DZŝAk^ʘګ)pm%9I2@giu{ӝt,ʅ?gvrgLEqҲtbcš6Q6mz|ZL@Y҄I\LΩJj$ ?ϸ.v|ͫo4ߗL(nsD`epcMZ[faB]uMY;E=[WRd8D!=V)(^ÊR %&E3u / %uRj$=6uҩ%󀪀 a"%_| c>z(h qq-֤V&Ŏ*M!'f{ި8%RkHZߕ+_73t*F"3 #3at[ގ= +)NEɡuM\%LI U@RՄêj ~0>v1B@X e(\*Lڇ(||ef© N |O"h)`]M+L %n"dfGOepD2y ;wGvfn&]5eeӇ/bb zBUHPujH If>gm/#$F*h7K9oD^.=>r'Nϑ(qP,@ؙd&Kԩ3}Fx` _,wt[F6 X4F"ګB­raa{6v*@x+qŸ}"a\7.'TGh{T5f)V_t|b._zۛ./eaSF‰іТ@ LQߵ=hgOj%Q`XVFNjMB"X )Y˰;5H2Ҹ4I"BU'‘Qp1)l42P8<~R:(˥F GϽ;r9/`ICACµ?n=TIaHzyh &Kôl>Cwf}oJPޟ@f:8&1F Mj1kz2OZWۡ*jCv&jU..%>j*Sa<2>qp5Tf*-%pê? \̐'x$5?8@Kž!Ljx޹Bі*S˗^ȸ lep9n< }E @H=GM>2D Vz &^*czC z (sl΋(s`<=LޟVBVt1kȐ *`NóҐf.檓epcz>3NsIJXwEWB@T:(FFuwi4/^@wmpSګB‰H/= |X<cGYq58DdjGm{8pi/ Ew`gkpm@TOU@Ȉ~񱷸@?tScСsS@' glAu gܔ3o ꩻ* (Y%&͘XImE_TZ0#wVګB‘t)廭 jbyyDҁ*H+0|W#h =bHix9`ip¤jJpU!*Q?kl4FO^ƙI_jN%SY:_R,/W2>uX/zغRV\ y)C pwg;UT^<¬6H&[b9)i۠CQ +0p߮oͻgE3-f9M 4ݝALaQ}|Vn1}f#.s9Ro)+5+BGG]1(59/>=[W2&;Y@ ~OIS w$jݦI]x J89b3ʄuT&rL;ހ52xi%@ᾇղV|*aCk╕JJ{9J6<k(Fk/uZyQsVgV-xAG^kuQK9QUU-e adEFf҄zURlb/='#4[xa@*T TW^b7o;nZ?1S(\\bHAlc%qgɐ1sm/fN__wG.ݧrmѥzd%k,@ƣs<s< uhDG6㼘7 (kN=j썎jf~/@ 蓽`7y0\?h0XhBZE)gUoq O/sQ6j!7X]|; ̣ޤۈ2_i_M D1yR0$gMepb!<> 9#Y)Idذ{>vv7j e<* H^M xA-Q?µ>Zѡm\ jm?9 S)LTݏL,:Kik6Ѱ)t7ӚdGc iSN-)4Gՙ6c.SJYBObfSVvjvo2ڽcIa?$ Vp;O̭ꅹQji?N >ۺ?.6/ǃy2rtU)o$VU{UHPJD 8>t @!1*4퐻Uh =N["f,u=qhMxC8FB(EIr?u {:ZA}i|zͶ';^Σ2kDQ :}?cS2;_wQ 7:MCBV,vtx̝YO(Ur0xnepܙߙ+Bi\GeuH;oR< AcPsnt9|4 },mE Ac:;KeM8Ҫg[bR J.e`$xlcW;Q ׾x7q\@"0kM(egֱp-R:rn^ t@];*<:y}iMYRgir\Bt:(i\h}20=CtzgE(\X13Yӏ(ݖ#$[tKﶹj lŴ";- zÖ+]Mn"9HK0, U!AM^o/gߒm; #ۯQv4$U' )b/? Thi+# 3̓7iǶTmk~hϛOK@THnrO @ O"0Q|dܟ?$hUFd8\x5PI!p]ʌ&~)2ՋSFkm)|ծ2w,M,he.%%$2Iæ.?\97UѵtWF9?txP/C'7ڹ66ҹيPњZ울+#.vt)ؓR"vcZ#żX ~*=*%Fv_1į."Sءtv=})"@i'܏\^:P{/w &epXOpY nhL݊<t7]NPI )W4Q]>U]5n:'BĖӻͼ ])6>yrMhp\MJF eb%:UR[O=+#4_ڝ4GX5a;0RΠZMiƔPSQ^Jw;k/=GAԔ=_gHݍ :½Cڷ7lI~Q™U8˒îu.|+NZcCOȀ$3+:.Egp`_uch:\J70t+VKaFNwfD: Aͫ3:ք^SF_iҁEY3 T*<Bw>ikHh#g#FXLf\'xoi+# B8hUpڢ;rGGYoc_2DY>E䉅]xs\xO>}&[Aw􆎃Zc#$ lێO:N=9ug=ܧ0B"/|}INԜ2冔]=؜P\I.qҨPY{Ѻlmy0wfoub͉qp*[IE[˞%}Rs-LRs[CB>[YTٮR01YшPq @g粋9cH>2_ЧC^% E' EQ5^K:\]j.aZ? ϶ FbkEU՞IkVzZǽWQl0%wKrƊ|I@〿W`jC!'. 9j)E E+7 ~4ȗƿȊ*+R5>uTr֒#B;[ LvA{=Xe_vBO%x!Ɂ1qcZg o۫wH57"v3lz1|WW`Ex.ˍ5Y;+#H ="Apx#H-IcTHP?Hn"8*LJ|t)#iݣG]ngh^]yvᒨnjEiU?v[cN$箤K9'K_;Y`{B$nh[DY".etڽ8K_>>vl2rpp( Pn2^Ù%xP/okH 2倴1mX}:е9䨸'nPFӹd,.xT#6]KԼ䦴[@D uh'V=rH9=eȂͮcjvC)"@5*[JdnpYf KVMs,Y8i[JՙDZzZ+#=3Ƣo S]XtWFkһ4[Wݻ2I-ʗDŽ|mpX `ωIJX~iX>h\9-F7I|GCr s @8F̉Qwݝ_];iqvk>;/Xy'O;{<.PI?w]VMYP?"AͫCv4G樣l,#0D %֩Sܘ׵dg Nz)C5R.!g`pEy_5knpϡf׷_ϸd{~'}c+]cSRGŭ?2\kԎ-ꨣ`jpvtp{"w)dp}E\i!KOz h2iTE8Icxל{lmv{Lfpz8u ݊^&UTHf~uo&ˬ(` `&civV/@Q7D= !w}s/2\{x2UVn{8+h,_N'DϞcH\{ePp1C>$ɅݷU&IbS/#&I;$cIe< ,̎f XW^ f]}E,!U㱰X22 ܏j4yB~(}8m{rؗ!Xi?WK>b˩n?X>d1:AZLpjX*a~aE/3gY?Wzy~n&Pk+ w+Ϟ: |iavԦJTU0U՞CihyHSlӵAUW.l6E[rLw`.kH ;5K4kb=T9V3 p.*:Sn|736QWx,/\kybFۢk,sC("AwV}.a6w@ܨf$dtZE[nڻFiEX>^ [Ax^ঞ_TTKtedav09IJ<"t.?Y#YG, F/YuGs'㍙/?owE* jo8>" +b&/o58=}VNԔ3l^k /}|i?4@f1UM(3K"wY79x2wI blq)^J(0%J'rVJiUrܲeZl+0wgzh50Ε#et &ռ{{ {3.RV گ!LCRpQA N%nDiHB&ؖZW^y8\Ɣ8a}fJhң}4z'd@Oi||>&O;9OfՅkxB賜Z94hHaԟH{]N8<|llq5:8#;IV^w_Օ4+jwƍx>glHV|1WQ D-Op*F>D#CgCzsϏ7(^k>\g|(RƊcȱʡ3 pNj~d]Ǣ+U{Zqt2.m,yVdU5xP=.F|mV5Ⱙ嘹'tmצ8LxpcIrE@需]FK?&/ƋJי<ͺڭcO\@Dv`>'3'47. "Pq2~W:fj"1NvյܣXP8v&Ǩ$ݧ^tO*xhH ԋъ<,l|i:HrQ9MNIhINn tsUypUȈR}e1>Е/os{r_)M*[Tr{=j2X7mk=2\;~!C"tpJ1PooׁBt_v+#uq T8 $.}MK^QW/^Ml{ i$2Ͼ!!34@&m5ۄv{zI+!;&]24Lyvyfp'o8iz>jR"\)=Wg)tJ88ۅ$n$q-b^jFu)FDȷ9"nθ\i+m0%1#um/Prje#mzrWFjCtr6ДQz3Qhk7r2\ǯg2[rq1{q14uI,q_ l_!aT-,.!F)WuZ"^.CK'1Nc#ugy^uOuoaQ4Xg,qy,TwVz SF+uq@`]Y,Rs}w]`pTg~<1]O;te~ru?SLLbi6DXoײ)QsVђ|+9Lg[i4XھPD߶Ww#m=}+^҈oab*i+ۻylǐHpdQoSJyڰ3 7Yz'Ԟrizf,ʟXoWơԜھaG/frJ[WݕfSF>/$a"D>hn.:&cF,#W}Mz[jK4Z*&r)cDQԝHïzuU X% N8Z5r.,MI#kpXD*FgY+Ibqɴ,ݱ+Q}{})>Z$<Jephӹֵ% q:2\k/OCF{t,YhP]n2^{ MVGw]RQ#+zS. ޔN3dbnTteda3mmPs~SUWF3!f﷉7W}gBFC|WH*F}(]ͬ \!V~g w(gbkbWgEE~U9?UuedaѮFw\9'*=sKӋB $pWX]N֍M82֟-w6qg} 3HcךKT"*Pu ;,iF?9h,{^B@E1u<9Ɗ=ܯ_tכ6ul%F|3,*p1t2+rr Hǵ\8=p ǜ5St*e)Lƈ(GGl^RjkO!srg1 ՝H[!n[t 5K2Og&FF֝-e[/;o=&A]v ||?0zq~t~R?'ǡ!h{G+FH03l{rnp˙Xn;%*Ɗ<,l؛H=j(TϹ6׬F 1K{ZXkrw ~]iy_68U|DD@яQҘxܷר&(\iedan5!vc)*K*3$teVskE 2\mW+dP $Op>) (<ፍۃ[{n(#V3lM -g*<$x79I"P:W7pož.]jnx1:R7<2 -4WV%]|ahE>[vatl-Zm6lqXS֊<,9o fV^m띆87D(W!9V9T{$.Л JGm Xc#gU"~K2SJ+ ĒcrlqJ>jV66oPcX5!`&'5n,sXecެ{:KCvMx9(=.۬7e0X2 p[MDw["drBa0 ԝ=D |v6;3a$m.{Yi_XcCg@wI#{5N0YWz Nό?`COȀ$5':gʍJ9᭲_dJnbug $78ȹBq2g.sbPΎX<۳_uoRǥ)E}**ochHaԟH?G4'0M/D%]C7$|)Jz x Ʈ|Jd11"|ƶShi6>{.rO'ص?icXx.Ȉ|FpM#$9UfıK鋀P ʋRGeQVWSF%ՕW!r,ke{9H,|9psP!d(/P4 ,e8BMoQ;*oE|c>,j|7_g]gI$U pynycK4eH|bR=RM F2PNqZ6 Ak-H Q񳭥{/28m\Ja c,NT7W|s}?cŪdp) s?0"4r[ l'" uR,'n}ycl,G1[FfZlym-ϴLec#Ti=4F4w-d׋θUР~uwLɳv/sF ٛ.=O8%,Rtl}J_$Q՝-V~<%;}+$|2=rW޳w@ȂĀ85nI_6!R$aԍ,/7+{viqG?.T]$2I3 6±&;ot\5e_-#WUqny='P[2i*cј)9' ,ʭAa[ZNeq}J~C摾0jp/ )7|q{%V|>֌Y<9Lʻ+]P&,u0e6ҩeFȸ]]]ͽs|>z[WFk=[{QTi®Ɓ+(f;dAij/ߕ=>=nIy} Jg:Υ<W>͛+qޅG|k?C#F!myO+92=Mya8eA `e(6Hr&^h(ws_pqsR!oP|֡'u2&`Nz{S5ĺ6e+FӊӪnu@ Z(5^e(P駹ݗ?ޒaaRiZXF{?rpؒh?|fAPZx֞2TK/!# 7zX0glZ1qSϳ7Oŵ-s?Okuek *JN]oʾ.缾D1T:me BhN $:ݱ ćƆPF_!~N .Ǫ[Qn;zɎ{nVEp_!8WX淀3>eMHǭ1s@^ _UgYΧp%plN:_?O _e8_7%ԇ_w|S."" WvC:Xc)2 }5: UfRQJWF+N4eЩPbF[th("@r _uT׽E(3kJ 磬 ]gğ$C/ItJyuO(1efL$mfpbkvpdcGqKhp3kLψw߾ᨤuUً@^ɈjƒZ{~gO|kzs3F*WIP~tFEB22굫)# k(gjȥn"S× 22(}OG M琌GN.n(C|r1fj5cb@tM@ti_ ;RQV%~dK#˶e'^ݝ9Qr8wd8_`<P\D&9w)Ùs3^NxB9&arZ ԞCLb~Izԝ̺2BqrP{w4 [y]E?oN:f|BX]p-E˦Q2E ;vV ƅݑ]?EǞH%ᒋ9]"9oQrv=f5e8{"܄k8Ö8m.+lZ +*R*k`Ie=!,IGMX 3Ⱥ23_F|}68mkIlFπ1]Z8uSFр4#Ҟ|_ 0Ggs?EE1sL8o'"^j;w@X7oqCk iӧCbYM ?T#:̔{iXN$_4|iP'! Kt 4#<E`ߋhqN&5*;}"k;gS/"5s vzW3c#g$VE~e]zgO!}ɹE1so٨i)q3;/zӶaȱʡ3 pjzkV3 E~/ $ٞ.L8- H+rɹxw$9qV)Tʌ2rsY?ǡIza+R>l5f/>X2 pLrFޥ[ 2=Ljf2X:S[XtZĝ~ 76uK{cߕTbJq [Td:KOȞy/!DCvM"}'Ps ߵ #?!e1]&鮀Q^-I\8E^[5`MNUR{l] 2|ջa~ Hm8eRtedaz)eOo9QWUOQUQ1:,O|u˵OoD:cY>•Ω6+9;k9#NضoH9BS)?ӯMb!9Ȏxr~#LgVg^ zs[~psA, uuǹ1 4f$.G+)F% af\$ ZX 9 ,Z>^yV)#B;[ 10UIT{i^>w )kh1ѽS=Hs-rȬو{B)wƊ=zXĸ722xμwˁ$2I~$zrYϚgo|¥|KBkEU՞I Ӟ.́RG5*oVSr|P32XH7n95υ}eеAn slq䑙ߕM̯8.K4h+SNIUgt"*jπ$lB=! _+% 2?VZr&c = _kXFI:O#GrkŹWgg];7>H9s?ܟKVXȞ?R{Ϻ]Ow$q wގմHFFHJ,z{H/cCajp͊i%}YhXŨ2\d$YO'XX?e'7v%kJhQ&If>:SF{&Y?X2 !ZbtS о::c>RVKte8{llDUӾI]r;'NђzB$X w"S zV©fȱ՞I뮗ck23 #%d/ҚD)ٚ0: WZƒy@ YX3:5RW%~$q q+rbg@;nEGQnɄ3MxLVbi]}':'*jȍx‹cKyIoAY|}nʢJ!2Vaw4A`Cg@վVvWA>.$*r &|,#Y%e-ӻ܋ ruz*&=޼μ3\+.?zqjϞ;/eϱ2I|':mJeqv 'NNϮ;K"=!wS*L壟X`t><ʍ'zqnx)=.>M5)SMԞ/]ٹXB9V9T{$N )=ҽ9|޻UdesJꤳeWVj=XjF6frZܩw:wO:wtފѐ?fE2Ozaoș/`cy tpyBrlp9.]RI'u/ #܄T:y'ԕ*g)m,Lh[F#3 wpao51֌Y՝Gh·nkIr=md!gpTӮ9WGae,#[vyݙժȼ8{=7\$^ͯ`Ι~՚ZO އ6۱b2B_r:P#i*K:˷M2<e{fZ^dB1+>*q#?liQΏZhp%Y-5U:ؽtJH.ce8X7fg,<'1hU/5hj9ˈٮt)# +F{&Ũ4'`SF֌bsVfD<+# Qg)NU+'6CO71$2I+q΢ -j^Ȝ(jk6H?"\?DO%gaX5~`EwkFԴkM,+j`EU @:ٖneT_٪py 97BMx^*5g,#!{]6UUrn\He`Ǩ. (qGƚi2#' ʯ0N鹏HGR`Chg #OOrBDr4|fԳwDp՞I3 LK0,ؚ:=N߂<]{sZEO+GIR=ZEdAmjN/EU+SF}dMI{CөHk+[D}?{'{;~o_ko7= n-8\L$_av*涌\B^%v-k(# ӎ7DH'ۻ܊n|uϿ 9`2 ^Ḗ[ 4Ēd D`#ugS+Ol[$ 'KXg娔G2->ъ=7 +i/+_0y˜ ̤H2yA)?Z9YDOʹvnו z@cDKdn$cM0%!+YǭH]&PRQ+Uv턏PFtUK"9^ԱC;6̑dκLi,ߡm]l!͆CDrby7G+/;P OϖޤKM-fD51l嚷p!6fO!5@ؖ(=^z~s9)#F|0,dBLOpQ nY<5Omw%ߥJe1eg)b:oЩmOSgJp:x$ۏKpe^D,_wZ!Dt;*]t9WX\UݬjQYnHemep6uݧWBG!߁|!X-Z ^:!x?4h\= V R{&zG)Y?Ws}O>>E`ÒYPiE&45#N5@v +caʵVXPV(d"]JKC.}"L]K <6عme02gnȱʡ3 pkLlJh2gX+rbg@jxu֒g]$- i?`BI 0wo:M/S97KօMVv^?oo`c,|*n9NϖQ1T`~239S;.uWƒ2 pGJn$8h,H$ѽ'ͺżmCWF{.l$LTJ?w*we~&ĸtRm%a|{I+ʜ#D3T2Ϸ}΍e4&i",D qh,#x&?%6eda)&[=sȵ3.L#{a*0JtJՆPF '1y+qܹTwSP $Mxt=$2INx'6u).JpypfW}njΈ9$[\~U)x_O$$2GH?dfh%E{Uǀp;T?zQ~?5Z_{2e,%ig 0Jxߗ+w9T@ۑg;' 8kiŰ\ 2y)4[^e[Q'`;K{NL5/v~tbW>}1w)rV8’.9 ׻1qF˖f+an w$)J1ýZ2 pFҜePp@?䑣9V3 pG 4^K+NZevoPDjz?ʷnQZQ>-#V&ȚVS@>0θIbX1bQ'7~,6%5:뇸ʇoR2\qmGuʎ+-j]מ(^n<1=+#b6'}l*h.ƻHR:ʪ٭ƒzB$np&*6:(GQ"YrFkvs#՞ ew\91V%hqM10enF͝op:yqUʖZ\`SSDe]Oܩ5O5a'LJ$2I3K.Y+55N51&ҬVԔ50Dx$\Ȑ5vg¥xBqcymbߙW- S'Q zچ ʅa ^3nE%20kJSR9|-^9iՃXs.i6#eju54ڃnz Gi_ȥy,+%5ΒzB$i҈F<",%˪yW q 1;!['X gU9e FԝAn`HeI)nƊ+_֞Ih8_e ]ܖ2-֕L9Fx#{9!}`Ƣ>T&E&{Y?QWFGtjhquwǽo0H |d|6]>G8ʜkк"*jπ$߱v$8FGY2UYNG֊<, \SҊd3(E1i^!T-lgth}v]iXϝ589ε>/;8Ee=yދ4)@'\5ҫzhI.z 9H1@HeEƖEf4Hyi1 6;QX^m d|R5.H Jw/C1/v-͙Z9BwuÕ՟k^";‚]f;ٽ%O^^>\2&5Y+rw`4켫̱c6J'k2,g)Zdzt[&VXP8;Ì t8Kۉy{}5ɨE*apbg9KGJ0hD)[vmkcϧ20r"m F2o  _XK̠uf﹜0=T@_I6SFk^gZEue4`KdBSѾ)Ty")y=&QhX2 p[eނP]ȿ qCC^FX^vAAOH"zyh]ICƧqr203 ԬJLlQV1ZJ?>o3p9T@ظP`̸CN̸Hv8{sͬrے[nmOpom nhjwC\6j\Gtj͞2'j|0,ȕ32$1VOx!Ep#U^nkL͟sa.LcEU՞I |K5-P3 OQ=I8o:ifmΠjy\- MKY@F#B;[ ~è HHK)"/H={w+}sywluĉ"#L~nGڐ=`Ր<@!Z± {9I:]ww>CVZwl!(ѭEmKT d*ێ4cdb(bMiDW۾Jv )q ltM8+FHPX$ȼ)Ϙfҭ6e8y⺈ʉ)HtjjyM-#龀9o՛CG.>eZyᮽ|Yh2\.`Q.&JZbp>ɱ.պU0V@Cۻx}C&*,F_tߛq*λ" vmj8)#.ұ oXoeV85x3|]V>+.HǛ[gL٥S5!&ZG"?\H(DB!Q&>R7=eb$?joUA`L2XV&{۶GKt=ZcCOȀ$%' cbaNC܎y6DmഎOn_1M -!2N9;[L5`1ڸ֜-陕ilĘ1t,iL&9{ lvϚ (f'Qo常M$E\ѭꢛma;[ xZx362XzYz2*.}I- @4&v\-Mm}(|<}i V2ub]=7U,ɱ=!7~fz %uII)#ܸ;H5<㞞y\ʕz'/poinݖO>61Ǖ:T4VgV`iH̾p}mo(i"'x/*9Ysj܄V#=9KvmǷwL87G8<ƈE91<ֈ\%bW2XDO\FlϯdOXFWkJ<ưy[`kN[UhOҙD*aXFS';̥luIףdipCC8/EXV1GKOr[U-C9oöVv:cDQԝH]~c_P) wO> _7J]TV}V/2!QǼ42\dK*-P@ۆimd.9ic吕XHw%9'd@FgH  *II y,!vpNFSeQcFdGXJTәQɵFqH3R n4ՙ8+o+rr HWH&c:^EȾRLȚPyZE(:5KtQy*whM[}(Vw@8s(q2@kz1e8_bY܂^`J"LI"ݣ;B=[&Qu4p`ݪ(h 2ݓ?H.[IER&u)'e+rr H-\<5& SF OggAgBoS"933$4̡9fS(#Ω %x]Nê L5FF9Ru8b#Z\#Xy=/H8S9KCC2N㉗6a֩sue/uؐ\cö]g9ؾ2uKOp>Qb*5ӔZpeP۵ӑux=gLOUVn=6wH-S&W |!: s @Jup%d lU%7PP `J?[68m}O{o_Hst]$d:Kzn|B,Ȯ̴eY+IG({u[2SG*z+} {#6m^ҒпH7WQOi`Ie=!7uʽ/zݕwRUT(m+.ѯ7#,םFKٺq<7=@gjwDZ3ڙ1a;}E8|mܐyBGq yEۘ7KDi5+rr HrFfgS/Qgԝm/iJs)O |`\pggEU H\`:VI*k,s}"*jπ$}/izd&O[74q1#yZXT–Uy-xԺLqeIb Z.yqkp֧N-z&u aޒk0xߤqHj'BVcQ47_lIx07w V6HJ ;T"VlӍY%"e[ˤaԎ tD$`r/={I7:Uj*Gp[g# eÑyن"T9;M*{uرSztrdb .9M/׫Iݐʵve{ "ִEUgq^ﲥCBX `{v{^;!AI7 ނ`?"*jπ$H*b.\z% pF3yc&RMa>כcSFku~/1-F2cUry j:r܉ԛAǀ õz  EA;y_Xݘ!sYOU|vF%/P `QRU,.C1^k>X:C;EP/.=%['i +ƥV7ȵ *~ nȱbY$!p46檒}3O9OrJIe^ludJ{=Mj$EVӨi7T*,Maf46Z{hzSD*PdEV)ݟp/ ύrjNN F4R.)LD?tNo)_$1Gie<.KYGdFlsN*sNpe `j@2~n-3X"T[mmyQ[t, f3@Bt齢L,+[W9+# kzZmNGue8{%s^f( ,w/`?[89{m@4MhҗQ֍C8s?c#ug1ȀxFm,?C+GW6bZ:Nkw4Q 7j[$!^E-#SW1w󤯟mD HOݍO"GmpC3K_)[4PF DuAxgk)#rh/ŧS7"~cuzv%99 H8'`  dY.=ӺOE/zmo{?4FTdT5\"TXcCOȀ$W,'rFrR9|QCPe2c.l-ĖޗdI٪9o\Dzn0}e9vv9R{88%Sd9e+]rBс볔Ro12ݘغC⟟n~(AcHsr+rYZkKquPm__FI`^Wq2\(35٬PUh5e8*-ˢ>BiN) ϥP:%99 @ȔrHQjrIDžUNr7;+rr H\`}(#]{z1N:jf`#-LږXm 'egy "( >ר&3RHe=!gq)[ٲ4ȾLrX5#7xB=ϯH&YG]w 5ʡ%^r&;cwepm3ZapW[SDnj/A '1k:ʕY$LvԞIn~}O,z%B2BMKν.v'VHlG!y+)F i ά\|5A/N|Mzd ,@Q| ȡe@r'-6U>F"KÄhOYG & $bБ6f띭n=8Tg e"t4aYSFrOכ";4u5uhȑ1MRwl,ɱ̡'d@'^Jq-!Ż6/'\ q۬QԝH3gk 3;di*!)oNJyx=gz^O=h}z^4cV/t@ߕt@eBUVYX\-#ݓ_ \s<^{@kG56F2ep/C,)=u\!1hhvenXoN-vߦ EKpg:y8$ˀi{Aj:OI\z0;{/+- U՞"J{[*HUaT+Yǘg)o:Zc=7uyIx(ɠq]1p({1bR?K 28\: .mNӶfBN$ = X|Dd/I'bq5B[_7JՕUBqӮpǟrq,Wz Zv|)EO֒3m)FCr s @8a)3Z^̀)#6T|iCl me8I{  7Ja׀=Ja tr~Y{*jπ${%%,"9;\OeWTzC)"~DDH#B;[ \$9A̞v"_7>Pww<-8aaÔe2-\)ijյϮez2[.?rQ~מK=Q[%sg#I.T2 SFS?$Hq!d9-֖گz׼>$2J&i>1ӜY~IP>2W7)# C~vhQeZ\8h ^Lγ.JM y…th2X2 pYA@Y: T=*pv;NrttM ݛTUg e{cCHȼqɉAn8<"?%qu&;d D&"ԛ#y9Qj+ݯ#J3Gw}4$4̡.ʆPH+f,"W4L6>SU%%:_/sdpԨS_ !ҥysvUBO :|u7~6$ȕ&e RC0is9-[R.eDK#.Hp&?Ƥq7mQt?ω46zq~Tkr @w>Fj$RIEūgȱ՞I3IVLZkj4]-5*V衈|֚Kҝh <^Nv(UO{f"RP9=c|jUщݫyhs%OX.^.#Eqt)F'%| p (%1N;4^%|2*cup.y>w)#ί{Ci ;##׾c$}Y]UߜRc;Y: Ylim)A8{ 7USFX."+7^H\ైU^\ˎZӾ)X2ǂ#[FR0o˨a !EDE21]?>v. WC6P=]v$X2 'D`Ƚr./+P/kڟI6?6 ʉPG(lń|UDr0@piK2u7rڣޔi5WSիw2o|cXW9V9T{$.Б *7$y#Nm~ڴ==3"4ʡ̏X9%͗;K'Ҍ&kul'ֵdb9X2XcCg@~9^;DeqoX7+w_զ%jj&AJyΊHpdP>bJ E&cnܚkqk oofo?5Q_CxB W_߶6ĻDcæp Y;ϼ1X$yx } 1̑3 `S̍C>{wheޏ^ H׵**g-<?Zb8x%~ڍSל}'s]<^dc65\mwcF2xBڝ?ܹGm"?3UT~QΕX">x|ٞ #^A(=@kv4TfpZθ.V5I.Ymh9wNT'Eb%_ހ2|hBϑB\%l=eƔUI ^ Fu t&LS&_MPyOp'i/ <p:*gw"C$UOEEFD&W5"4ʑőE_pc & 1ML{`&3zcPe]ioc2=#Mmq%ѩIbC)E¡-ijo?-/@j& h8XW5Vqx-#֎0ɪұ ?VҺj7Ti =ܵ,N"Y3†؁dT6"L@m AnA#CÓ(NJ;v>וiWF&YyGIhS̛)S|=bA-gpѵe[ I>(@Q.kLfFR !r u{ hMZ={SD ŋ P BEjF`|˖XZԈ!n+ET ^@@/@x:W2C@{ Z\D*Ge@XZBiR_axԉ([Uqft]DZ|UUX v=SŀzC ['t= ,e_F_FXodױ@dIoi0?MCF Ln!`DIWód@K4kuE///2=$Ҝn2 I ^f5$a~O㯏OMǤ0KHbt;v(1.SROU}Y̏TX[p3 XO.ؔ`C60.(!9M0zbY67:`F1b%Tw X<t{0iG|R36?˔rhaXAU[oOPrZoR\Tg8vfvlv8sR;ENFF֜Ud6IԪLY5mo Dj9%4mW|JvK2=WlD z9:%NE\1AOPP@@o\ew|(2f^=tO̅-92g VdNb"b%DW5Ok7'G(sA cO]E]`l,VKvrN-mL_7uZIr$KzGdZfA̙Р"/?Y wji"YW:,=!a08* 2p0HP 4 g Z͉AZV7o,#Ѓ]ݴ+,-#k\*br$Keb"f̻~z|2ed&I̽ӤM@/L2ޯ? e5yi#us}26qk'Dv&LY}8HЩ$ɑP@@ox_7AvL@O-X+[mVOY6qGg;+ܮ̇zԩ44g꩛]^MC ,bl ZMSMή'+ h0|OY,]3FɶX3sl@p/B@Y:.KucֺຏLЧ@j7Umcoʷ8f#g~@뱲rpܻ ` _"We!ʔAM= ݬsKRnG͖U{9R:1en5q2KB|wC^G^e]]nLSF׾"m"Qis1U{( /k$mxWdn|Fj&␧UKo0P%;ۉ)#FbWGo+>vNvߥfY@y=h$GP$WK(ЦK8:ƃ赞 X{}Iҫ]3:SFVM/G]2E%~-#kuP]2LU/?uueo(lGc*g]VAep9c^봐Z^=\VD>}o3p#2=4#@\'z3QjMkIml-w0Fj&)i4;|hX@NI|.HSR}n&Qv6~s? ǺwV m/JE{*1A+dCPp(k凱tӲ'30 x${fX#p0BYO݀oMMٹP[FrN2*ТQ~g@,pyE]u0C B,w I B,9A2ݯ65#B/XU aRќ[dt>@K,k`&\g:IWF|]̀π,Y@{4 $K>d\$#(JEv轾S̵jDie=9"j<34x֐˭;g˲l)W^? #b3 (0ϦgI|v2?ky>l°9-jU.n8J>H WKҜO\^! ZBЌcsv$mp(Dh2e~{q60@K'>SzTLVHwE<{Đ>p\(zb<$~wp=(OrA: |B@"oa&P[fg>Tt.C> $~_d18? ewak0kѻ$qjm2%hz= 9m>es%"w@*ml4߳Ox,~y NƟC/{QrL@nnrOz!|kYf=QGك`2 ꇪ\$J5 @hT=*@yC͛JHD!dt՜rvG G9OwTjtw䛓滅+K5+T 'np0vcHޔQw{vd2JV߈嫝m%_P-ixtZjO9`:홆]^}l^#}DTGXK5+qq(].$ Awfc]~?Q0R~G A 6И9tlO3~+k?_U|wOJq}?JdgN"/}b/ ݍ=5zI 졓(i|uMG_ JEaCo'7s=nUllu2Q绯 ¡O|bav|feyUSFN~2_`WQ'WRU6R$GčsCc%ɑ, h9aɝjsOYڃ&ޡ҃YAZ)#г+q[S6>Qnӄ2uƂDpRϳwyH5FsĿuΠqY4&7(DP]@@6efZ{IyD /PYt 6Or͓Y}g<]Q-p98[OֿAhHn|wv9SM,^,E[F'02W!WXOQv~TSh s$k֮Of+@i^Yfn[ ?E̕z/.d{92=ǵtit#D}jz~\J5EdZ;3^]_E Uu)bR׊%؆_}Xv}/|Pe8wx壈ѵ$Vn)rJz-ijyTsˉ7bt  l1T7h)#S[2 Qҁ#ѳwnخQ% &3 տ`WZR08,@Oy} u[̃<[7]^]+S9 WuXeMZwj -K2bdJ2(H rxSFVpb ^m/i7)#־_?"N(Zr?ljy]#Y-G D R]* h џ<,z!`nX'wj}7ʔHht= j[ثZNXF\61x CH`--ǜ3K:ʘ;EP0Ca)reDjwpF\VS<#4]6n2jvB<g4V+K<_u^;`hПgHiIur@%vTJFL?zi=4Gu^9%R#w&|ڌE1BV?'!HP 4 !> N9qӮ!"?'Q䖏=[ w]H'7Ug$.Oez5e4*fV/8$*F0EbS[R 8|^ sDoC\5T훀 W~aws0\'nT];??6൨ǁuzŜ5yf(D* h荦` :"6HV_[41 6ϗj6HZ(I0ofV\"Ot{N> Y Tn"R߷9SFWZЕ#V i,"к;4x4_-w?O?uezOdppZ]ovez/Go!s]1w:K62G%Ef?x"m7x|ꮛZ€-#kpd[ֻp/pSFV马H&J]W=ezEuz'Lezml̿m3gfdlN8;ABX*gF69{p.蹦 M!3X٫00|9b\edZL[ű>HMӟ]YPף켦d LzMlALb'qQF-{?{RFacB+Idz,DbC1>'9>P9zth,e[j"GD*/HVmA35{c?fB;A+`ع׈m}%eM p\& F}%_B-Fo8Ciⱞ8MR{X}`Fos ջ'u麖F FZ`t za2Y8|P S,b[>i pdv!!8ن@)lTv'dQE)Rԃ;w@>Ȓ^[ dW`|1M"\Vj&N6o_YzR7Y2 l殃JFC#aӘ!dΝ==kٵWeٕѨFxes豺E>)wX!Rɋ{+h7,1c.1zk\Ƒj$9%@EjMha,I1\G,u;-?z LbCUBml\9:^@#Bq 0Jq0 JS 3u种> U(ֳWר']sx_LH!<"RDQ)حO]uTf ΤуcW\wIvv[(H`_@@M *6-/o92}˱RH*/HVMU.y9]?}ӽgu:5RHj/I'R&Is<χv"9ϓD7_3F@X4 F .4Ϛ8D& ߞ>P<]w YQ,3XIr$c-$г)mY|wg޴noOO/@CH)-' S \߱@ͤΤ|ONX'2j?5*˩SƜ~0<ĹYV@hT2 󎏉Ϙon?ĊYHftN=,%ss2V{"[9Buk'쪿H7ez:BA(?-WȔwhnqJbbhٗ)9xs(#H '| wLV[{g_^H#k&ЙN sϝќ*0Mߜ[x(#̉H6 8+}KJFjwcq ^z(Ni.m:Gř]0jc iH]SF.p*Gnf?gݍĊ=Q"}.Y}zd}N_p {ĝ.@%6P{40D\<>ӱ+#fuWq+r'ݤǷCJ~/_ƉtƫwA]}H s2?*# i573VuĿfV2JtYqmP:Hq]@f}eO?2:MWIq]يRu֌]6/ukVvk$]"m?^jndJwUJc@.t#<.+c%2vq/ LC@ōF|'\53^)>֕YSW[=n+ET ^@@OGG>߂=.$D:T!o-RI:p y/[=Y <,))R8e@J^i/Tz(Yk» 6 "iSFWv̊;{ X@"݀7=AwoR t(p>I~HT%F53TP$Eq&"C?c40߳%kYlp }#:;F^8R((7;YИ\ ;^p$7Jvr1!on|V B}V3yZ̺nö<$l?mTTFoJbƮ}s[㵺2&jYM*o*ezZpR-4Q&}M>,~aĄsܕ@n&2nY.)ݪcx^LqhH#U"P$o=tھi<^d1fϨ16:ƣ[w ~!  }K^ʖ5^RI*tCezQ [hZڮ )Ȫ=تPMd"~r@޿8w혙3ظ)(oN2Ed^AĤљ&h I 7XFsXs[p ?Å`^ v[Hrr0[dma`tR7(Q|$],g\}uH" r$Hyǀ1x}7P<>j!_Omw:#"gJ},:kY⥵s'ʿ_ұ@)#nMQx#$G ?DId/4)I׬!0"Gj/Iפ؝,uQ==Zk"G*V{M={b»&DnY?+bxƵwX::ǁ_mP2!Y*-*Zuak%e;;k=+t}_,}݌ +ݽuYFX 4 p4> !2ڧѨU!L&fxA#cxY: 4/G)#jb=鋎2ezM*i{U&O{]VKk$/mgSe{_R׵}7}N\;s$GZ(I7^y;JETSF:(_S)zj$EIW7Kt*}^@ ɛ<NNFez^w &\: %zIdj$_-DY;ʏMeMg[,r|Z2 lh\BnK{(#kr;Ƕ/^*;F>1@ .׵ѳF#;a{xR}hyŭm;V !B\lQ]l@.6ѳ^;\R72=5nIIq Bh 95^<* mc]HAFUkiHA~B>W!1ɢYJ;ͬwV&]qSn'F&} .Ǒ ʑٽ-X@Lk!Mse J#UB$)䷯-;8Kk/iVX4 EٓNݒ޸]7.5W& |oF"YaS\9U/l=|1*?rQt>[s}Uh\EZi!?tm2|_zSSF39W2~މ\Ծ/޽W&ץ\qh|H^J^St9R%T{M0dtޚݙv"0.tÏ9B%RwE@ )EMM;`9ckMpݳJ#YB-$3e!61)$~ӬGkOz\my4#R-FԤo|U5O\yDzZ)rBP$fuڌ+ , ]I0R~:^$I{ݮ\=YZ%"3X+>zȑ* hj~wuO Y-7cPl8w 9%RElU̔|ON=KԎNLN"Y5}zn> ]ˋa]O{/|Ivp"GʇN|N(`Zk,YqD1z:o浟$9%BM\_jseu,5u[ugOȑ* hhX Q 0( }<{9s/yѢaojfڗ",- C %?t&G-ݘ,h>I5*<8@> =-|3>9>`g:gxj`/p ?ՍDğBoOuc2N*;HKZ| ]?3bw,NRa0m` ~r" y!?z-JMKOc9@OEt~_ hqSp{M!YKV[HP 4ېL*q~)tM'6^~ jkx#ET ^@@N27"xg|1j޾@Mmסڀ=^=GzͻZ* ox S?+;s̍zM@wZoYZѐ]G )wa>s1nxU]֨H7*)#;b-#ku1J]H&0 _ B﫫843n{Ciy?jg=)eر:1! Ϭ4+wSB]\ 5JZIRX!BXEq@Y[QOY5eqJ > g>u"uIFIq-|q!2V%٫^7RHj/I.^?S!G832_RvyIMcȑ* h291A𢏅A6rXΡf}B0Pʹ!N\q‡?ݼoyi $iϑL{ր, tdz,+Id P@@oCad-l9<;SF]5tJ]y"a;.{\^4&Cl8aAZY8e^ÛpmuJ#UB$3859IƯ{M}VǠr+ 'S.]w'E5==f&AކfҞ=㶾~5̋xy[6}@Hwz} r'C SB5G r[u݁suG],5o?\MC4L=gfj/0O{mbSJVё`[(I.^As#ͫMkתmDȊ-o}eGʑñmіUl\ٸDeZE{=t0- <@@~j/J;#}5(oY$J#UB$гfe>C&@oY:Ck f {M·JFeprۢl^k.rC^e| Pp\/d:mWUa_]紳zy@ArEr4 hUT ɕKw]ClVβv=ctVP/V@-2cݢ2~Y3cJEVwrf;v`&u+ |Hwp 5!0T:#RM6ԟ*%t&EK w^y iSlK4XDa9B=!$/ Q@1=CYWF&k 7..}9Sudp6^uR˜gdl.$GZ(I79ѕߩQ7t~7CXF׆$֖Zd9i@k$8ximC_aOⱒJ!ƆU5bh>N&\Y ` _"5H+%_{0"6#NJ$1웭N}VsX2_ ]}k3I(i"wuei%ɑP@@^=ϙ:!3I& έH@śMԠ+){>WQ ]OzrMثs0ezf35I8MY+,'tT5]Q$Q5ȕPh'Cugyh732=ms19 `S>+93l<]nuT<4-Dׅ [槝(y9Ln74mYNd(V"^A!)E@P [e0zKlxuMĄ'̸g!^/lܻAݕh@ȗ$fch$vSFךR1T>F mPic*HZ(ǽvTl/U¹NJy{WFVn PƐ-Gii""3Cΐ@ȹ.W]6'2zo3 86(+f&?:R#Id P@@{:(w+Id P@@s?_`_c_(eu_'j'KeCJgJb F GBv2!)my=-SdK؞M+d]+Mqo1G !MY|Oj|۩CϒH:hO$9 h,b=33e՟OpU9R1*v@bXwMRIdD l,w Q .ڍn6uS[SFgo]9Xk/NՐ4ךxjdeIr$Kz߃+jbN?ȸ2䳲|\b$0m _XhC]+ ܵ55 aG>!$ɑ, h}(#ovIkW8g)ERHHɪ(뎵vݎ'fC펭>Ɠcǩ9݆] N,#rBd=׀}$,U$PÞYύVgw`b#?- )lHX'ĐNR/+ߕGY[H%jLGz2UGhnEvS:]+$6o١)w3HP 4 -C&N3;.ы4eNvJ_9R%RyEjPAc0X B1xcR&YDHYGCg+bP)7= |ɧ?E!% }Zhl=u,#3+$f:,FD4G}O'~G %& cPD/H6tgĔѨ2ntTPԎ4PV rmr=?+#SbݮB$V ъh=N%.@W*[hV - >W7B.HfV~9%f̙nB>CnF mM&6( U^@5g n/r۵֖2H+OͼhJ#UB$ЫRe+R֍[қ.z^@@/}/&7kvggldZ5y3 dHnH#Y1Y76 KEQQS21<{+H(XBHf{g$m`^B$Q=`<\Idh&2Q"3OGR@YF=>`tɬiotipuitS)ٕ=ub^~GquTc1ǩ vj1ix;ѫb,`s.# VXV;*VoZm|2><3\ ^yׯ&<"*U$Pxw_5ukFs1KC'D(T"UGVD?mgaXl~ Z!VKU@_0Cu`2xU'ra/=t`՗It%h{u!=Pu 68/Oۢqu諾i[*o7PVI"QcB֫mVX4 ~Z g*Gi^yLx\&aǓ4)~0FC *"Gj/I8PL:^FA׵3V%' V?J#UB$l-C`LL,ÁA<)10R/@qstd_prDJ֛jcYGgQAEcYw#[p㭌HF9޸?"ĨOMh(#&Xf*X֗'gIoa@I)W2?E]z(^g4߻־Vm%ɑ 5P@ڳ 07;hpsvC&h lmhfQQϮ@O_P0dIՀ=ԉҰ"63Zf:@uؘxJ$`C[Za2E #$}ЦH ŅXFwߢt18F G2UQϖf8ȔU)Aa12FfAce"N2MZs YŜz z{,"jB#c_;Ptuk[ bi#*z8v~BTкBklyĖYrn&K4t!瞉Lt&d!d}amf$9%@EjqĞq7h}O@,ɣΌ98TVb=s=gטPѳڝ!DyJgx7Qh}T:O> Xn: I&JLl0:/.zBMǚI-ټ=U{oQ d*7ɤ[Tgay*v6е>n#Nj&^j,4(Bkbu;d.@WCGN6ez:''缄cV">%!{1)v!h(л^mV}Gu8!=|@iyϓK }M.w|,b6SԐ;oD{\ K`v7P=R=WP^ ~ E>w#pX"vhrSq)9ѓрÇ^(TkԼ[Fb:$]%1ѿļ߱3 ڿkVqdDFI-G!ˀ e}Yuf$2{sc݀4g *"Jy 9`gZ/=0ezM M(UnC|*_*%A6nRc-_:!㗛2:"\vȋAƢsP݋{Mv!rhBDS85AtKM`Ti0K #(˅cFm, (4I|d{3굦SPaK6 $c-| n}0Bj-XD6SFפC*cɪP"VS5ح"KD=Fմ[U.}^`#KB): {9dy쩂5[>~ ]yQ 'GAV@af?RyЕ<8i[dtS۹7?Ncmr/v5+(Id P@@7: IF )ߖ[FgnnV`v-cg^Qi\cN8@{AmLL[8}OpS'Bpc&cSC< "V-.i-@ Qn{bvG.vj-},#kMY]K3!jA,5R澻V] (~zF }@!GP}ZRQE6[X>D,G0!ϥs?k/Aw,Ǚ& KJk':E7 ' N@(c|v'EEV^mӱ@O_.qL8d&}ix~ `ow.\t=`'Id P@\ǃ HB^#:"JnI Ch^s@o.lb-%b_9W6HP 4 =5#ħcDW^mSr7)#k?鎂edm*m{ BlJ:",nn J7M7iqr== 졓-12KFdUN6bGv09zY-#{2?Wi1~}B#N;O2p^iSԠC(Ylϋ&8Uyiۤy2rxUn9m~:AYw!z.0/L6S.+#uFC|/|GɀCUĘ/0c)Fa'QT9i&ʉW};Xb4xN5Oݷ?ezƄGN۶fG q  mlL7Ǐ)#k_5~G 2=sΔ 0.DwMMqYj&^:Tnιֵ=UPb Ԇ="Ht+EJgJטaTHr@au!RCA k+}Z'~ҬCK&tl@M%W3<\n`F9`fȪ}Ӷ lqTWu ~V^:FArKjad`G,DՇtaJڅZ|J@F̲M Gdi&o7Hą<_uڷ%TjsfgɦJG2RH.t7F|j_L;ï߶l`''a_M+D(T"UGV%7 2K\Қm,#7NU ^=X!"ۮf5 jo7sWt֏:Md(Q8gulţ6+ތK>VV*{liy:{BH CD,0g.y#j޶`1<Ht/۵;^찁-5Y%UUüXaW}#DPzdviC&N]ْQ#!Nމ7zf2&SW1>ӫHYԀ:ȢdQ6tUa;1wSDFtʾ]W;ũ]!I],BuU6]/F;C$9%BM]oۥ}d0P ]"ݯR\|QN[)+w@pXDC`:嚏ZS[J>ݵ1xF_8F@ݞèՋrލk֢e|XO _v[)rJd&~9-XILԑٛȇ+CMzݰRHP4 DX>^4q?ΜJa(FX4 DS7.G7\ez^v#iY)rBP$&B*iץTPMrxXPڡVX4 F[9wxKBr7a:XGw/A7t{簫1:\ѱΖ;׬>اyy5,Bq]HP|9-pߋD0jPυX[ؾʯEIB]oc]$9 h ~zYx@L^KRE߾snLY:s@(9!'ݘ>׉ aBio%sO^\ $KmbWFFpM:JķkNܸ2={}8 w3Un:I]:݂p9\闸t}Og\%2=@Ԓy@yw(HnjwkuX5Zo4ycq z{/XX'ry:HjwO{븢z%aPʲiz*M%* jg 3K I=r 31|@X4 Cp֑EgHmSTOn߹FO2c{ 8QU$@z?BgH4Fw qR\y (Ƽ0>~lB8}=s%J$`lY4Hp+pփAFlߣ+>`״iIB|t^O)RHP4 V#?D_zry}'R h1#n:rWHiwpqBviÍG9A1T4aa\ZnH=@g&ݒ6??+#>N2z(v"kLCF)'@^tNdEN3Fvez76@{w{kߵXь^As0lMQb^uPۦBP( rYmE)wiW_ӕE$&ݦZvnPDVż"Ι®7.#WbuX0H0絳$5t`ax,<^WArKzd+z Z;$xX`#2?ӣ+#k@w[!KVK^1xӯ7IH\ [dkeg0HHɪFe|_;̡1Rhwe:ˮgq,=4,WBg]+Y􀬞.H#YB-$г"!3B;m[<+rss;>ϒaY', (ϼKR9F*j$Pq9R%T{Mqc|d>xpxT6|uh'F3ʹ8*琢H@bv́t0ӟW.a[oD}:˖ݻ@7Hl;w2JjG"rgwvez/ Ǥim"XANH]KE,R-lJ3T +RK2j9p,5̫͛1e䢩}3cƳ 4֋61ix'%ߋJ1j!KNMRd SB T?ЂTJy]#T>/[HJ_ua*!8p|ſwBW?B?Om$)Eu!0$ߨ[(A uqL˿ENPH]/uz9u@m p~] ׻nɔtBv B5I A4"hIB3@fRg'IݜC^T`2GʔA?b=Нe7i [5.Zi#8+p\8t]^`5?p6f}2˄?;*R#Id4P@YV$ʖ~u8ɯoZb~/َ@c^RsV^#خL9GO1ed,[O9ϓ|4XD7~̯sbm赺Ƹ33ݡC3oU3߳>?+#{~㐴{{I ]Z"ݞlg`v[Ft[os_O9b\~7IEZmLyoז{TK׆;/4ށdk">PfuHrҢ\#L;hk״\C2&W0[jbҫeVy'}GZ(A<F"ʡp,gw:;^x1:Ÿ)u|Z^/NDnY\$_H-DqJN8Wucu]ޭN2h!j_͆pf݉$J *xУ=Z=I3ue";",)W2n\,SFt[50s"9>sT!_%7 cAkÞhJbȥaD r+Fj9pWFP.iHFk-/@>nC9ÏES<ޘtKFKD6xwHIMpy"Αik7D_:$4q84PO-/vezfX}9VaY %Ny9*OռB/#A[Hb$ɑ, h g2ĥr+Tٚ'WĤv Lees,T,?WWO˩֐2`繹mHO%ko L!m2T:Nk)?5=E5mY0&?ٝ9"VJ8J#Y" P$' riIJjU>KPn' 486H<"Ic՞T#UA9`R@Gj/WOn1D!-lw  ~PA(iK^:=ف9.X8NN:bq%7L)#CaX9m.+)H}x?09 s5sfp3X ?#dBkC>0D=5EL7HCH|ac*ܲ Á۫XhoCRP9˙5Zb5_5lc<ƔU3 'x`Dz l> @H Q~M9PȥL\f0/0yu$W;/ иEظ#ociSDeߚu(b*\`+X"Ps5M~y*G;Om-[}}D. ;dȑ* hEHJxP鰥W;.zY)rJz:-ymN;^$ak18K5 m!M.dn+|eoiX13ߖ$6oMZp3k i;tO+!Щƺ]'%=ZBhlȦ˫cF_Dm2Xv: VC%F͗P!`q.{8LًIΚф\ 'Ģ?!7|G?~ɀy,I'2o%_$jN1oÏoAE$9 hq\ FS@Cv֔ޠSrQT=U ȓH s2j4]{#`px7rSF=9;̯T%}u gKoSN9xA@.5_!%OOQXz7W/7)i[77XcCOȀ$>PG2+_ƘfYc*G*$7лTI9j/ *ƢֺٽTm/ݍو?NVZUhN>ѕ3!f`'9^;xUL_'N?5LCr s @xjntM./51є\/VV  V d(\WW ݷ Oꋐ|,Ada%86/Ozt{99:?U2O"/&!%-$2WF#(й5OΑuߕG}CNG5t:>YϮc&BwƒKÎOȀ7 } er{0Q\7Z *}r%dbnڅS ve>KGG;._M02&< u28{?G_sBOrG3]AoDzNT1qqNsՈi6l_TyVXP@g๴o0Fēl ch1Dgu&8D`&0HtnzlRM5_b,{dT# iplP^ɗbzPh-F[jוZ]Giåkҧe/FlRS囔Ȕ8\R',Ik`l31\` l΃[œLc,*ڮGgȾOsgEKˏ{8?iMܹs;cKr,s b% ҙu1 QKe߻x#cEU H:!Ϥĭ?}s|!]\؝/7ճl2iU\0e `.߷{ M ɤe*DzNwsSGH:s{e$so6#cL~ L_b?Sz qN, <'`䲧8+H/)'_ {e#F>ceBq1tL+dnurE3X$IM!vCW>s3b ^IDnYu/.XœG-m:_1 ́L>Wkf*;@T\`|̤cs.^qYlνniu7FCux.19$vƒ? J:!&rYwY?^Y]E:^Eʶ^ZcCg@6e߂srIt- ޛ]v5FHȀd-iY_/6a[^dx 0;ߡEe7@$H:ЯveZw:c$!,F{hs<'m#nlYB?`Yҳ=E(13@&2Gax_YBqa>5Hwdՙ²:?kDw9w]ۼ0u$P($pL23]@,Y0HkFǡFk[9wl; "*V{$.:֬!Ўʡ3 p˖ O\-,/4Բ%P{ =$X  : mױ{{Yo-EH,h8BK_%{Hxz ]&T.[̡t(1|>Ēdtȝ F qҍ:!S,Z'swI+rr HLG:w|V֊=7~;8vҀs\ɴj\Iuw EdA`lPHPN+cʸ_D}`hmz.OWEeɼ,5K#ݣϿ(C'wgFt(<N\iFkD`}WLp"!L L|RSSP7dК12tY䤅ץ̃iZk):d83o$J%\\[w3ە^g[o7e/۳.bɯ4ϯ$ɛKwqs5棆:HÎ-cd9>`x>I.MP-!_hCL#%"kVW!0FH0s[UIF">|vym\j\s3e"T m}cаZkt5i͑ꢴ=-ە/6_f&9t'#Ի.?ZcCOȀ$>IGǀ}gYOSD"Juܫk/ u8ac$ 3>HιlW%DȔ)r;t^"*jπ$$7oG>u"N372r,vI]JQUn1e' y93/Jvh,_<'xFςtUꢻf!YrW+X*jπ$ yjN6tn:1Vnq3a:]:q)9.}I.[۩ђ O geFК6uR2M,a_U=ݔjbsdqR=ls`ᮘ{N+)){K*b==j$QOFٱKr,s 8ۺBU 3 ˈ0-#ǐg?DѺwU:6n\wa$ 8XcCOȀ$"@_^PG*Vp\\9xux+>}T^WN2\\MMs?j<ҘCQvZ)VVIג$KkT)aa[%$2I$v#w0J|iHmpOT$s(q+N ̈^x 1渊f^cK~l nG!r&yOP;z.VҬIZjGj N7ot,!f,"@LTBzt5_֮]+@pdQkR瀼tK_҅ʖ<aK(;f+#I_Xa(٭CxւS}+2=sf\12Xl}rlL\cj>.meM]0ai}(!Pξqz֐#Q¦'ۊռ[R 3Iek9XNV^}o9v(_Ԅ,>kx "ϑn'AcBT8Dtw-V&f/. I:; "*jπ$>g(7zIl'VOz,*_wp6#\ܿ E=VD>rIÊI22>Uz}n[-# {ZzUGW7kZ&Ïj*ƕhU[Z2qm^1=9}%=KCi sl03"AU|FHWFp(Hi6'>7].Ǫh/tvhIe< ,1_Fl=#4v&*,e`#ugթF%L o Vrp #ѹ0^ws"zʋ˜fi)n2%99 H6F?D&HPqWIt'c䗹b$.;W @"e+rr H#P_ And궣sdޜ jӟ[栰.Y"ڽ>S\yB9&2 Ϯ 2?\tZ)ù ( e~< w@=!Sm!{Vn8SZCxbG鴿6 (dB)JfŠ2ti,ـ'=~o˭" V3ݰi?Wx^@WR;|Ss*-%W*iVI 9F (1G+'`s AXPj*9Uv>dƞ}.LNd7e.XcCg@X:iY7Gc9KI,U ?F9RwxsH:6Xڣqw[&2E*jπOS:#TC}2t`Dh5g #v&6j|dIY B4* 95gGZǠ "=j}mZUкq˪nȱ՞IqXZw8תvRz-# +/1M@O90B_KӥoShMNSiaZ] SoJM՝84XͩZqD2[[F3SP9W_êfIgI 1̑=P ]2__Uc=ٔʉg$ܮXƞ_ߠkGDy{@OèwE{7I1*,*wn%*9AU՞IÑȗl}`sUOi׮FBCe>FJ2R_Wc[ǠIן=Ix iV{&Zs1#m;XcCg@1 w`YdsJNoY-k6 ƒ?ݭ1$4̡˜&r 24N-P{t=3QrWU J6B05Q^E=S@( y6qk/J)2\ED*V9^y(6ކ%'hÉOU,SFkxچ{n%UyWq6kkgC>[M~{k[Fkz+\ߕCrEzf4_~-iz$2I3`YrXWxp.Jʮޖ%MO@qXz˙eЬ/5Mcі+q vtdp}3rW!j/m[{-j9cl$2I^pP/ VVzZu V9T{$nZ܅硓&o|g8teHG"\" ^}LIIlNϝ%99 @0HB{YILN%'7lj {3`^T VB22YEV% p+#rr @X?8'69Kἐ5n+ur[XcCg@{&ͼ:M9[F3sqXx#:x[m->7<7 s]7:TcIe=!76Pp"b%cLYWɖlcrfKUr5@mQEVeJ:c?΀"1~j(}.$,Vdv5HPsĊ3/A:Nl&$ZJ\Ա VXP/Ofdl`&^r~ԟ'LTn;RH CԀ8q0¤U՞I\eyQ8In}^J4•q(K0VXPq0mќuQ!` hy^ V8"c.sXcz@ YmZ9\Hrn@}ZH# ᜋgZ|#gg'˽މcl5_Bk[H()YGJ,K *e8ⲳ$59 npv]mw>$:)W=S&dnzenػ~- @_~\"Ykw@:ݙggʎl;&agwW Jř?)cHaԟH'j-»Ԉ]8oGU R:PF\n# ~[\lWrCO嬧x;O'|T*Y{-੔U$ [n=Hu@[U鋵ySk0"l,ɱ=!8nMr322[%λ`QOwt2KSH,׼m`9hr|*-VIPX$AbKᵸ pE_R)x X?ZXJU#u.%Rp` s}RTy?/X@Š1rRTTl۳|te^\VH̹&5z=`V/LzŒy v1;g37/LŹ)B2 4G‘pf<@ k$ڌ\pm.^gqmm.^zbpf-:_SHnpDOv۸XJBm4k;>3edP?jI('x,~ϘL!HȂ<FxkO|'ZMQC=T>~%ޟ1\_;>VKШS!wO鶵/R/G#-s@Ť/'@*צ5mQ*L5jҖ>SG1"-peIχ֦4)bprn6Kc\6uIɶ-#ɯ"~{ ԕڣ<'|'w& <= Z<,=eeq١E{J[OM"%qO? MiO)~?z@+oWFXv)`+^2X]7Gx]ȂDJs&9Z3)d$jܿ-c( |cS6v[мT"MPFmQ^BhxH˘%@(E4'Sb9g [m c[f/ =z%C7:# !| :=V5=vbSҸFj>cB 1R%P="L]do0EAwS-2l!MH/lGx"ucTHiT~924q/cSxk8lS8 7ׁ|q<o-V*VZ W)T?0"4՝-=ePp QU W $ue,ZHyD`o_D/ Ok\B#k0ҥ!6ՠ|7}/MSgʡ3 pߝ\GvO =OFLU9nP3 7oU<(eO4P `߃ rY\"5pڢJCu-tyxz,SZ`EU՞IȯɁǯ쐡AGV"lrCyG%)|3d5NF͂)*t>"'ZP~odXf\2?zݍ#1oB0DCZRͷ's @jˮe͌0꺇G&`;ť 2\`r`?KKTR;YOo,ɱ̡'d@9Mz-M% 8=W@\4qSMw\;ʵ39r?< pg׍nz,1eGDN)uGEz(/=|i%IɤjWh2Y.7T†gt~zXCL[y"6?KnIte8x:^Nw n+1Wڱ5<]'na82r\Gҽ&m- 3#Z/}\T==gUr3|x!qlL ҵhцƽ5gzQKt:N.i3eD.D"r3Ƿr闍4S4o?+gZTfxE5X2 p ă7:xK7/:wqyOgDhCug $l:~U]KV'jՋm܍marx8o%]ZѕwO%UA~+$fMCUf]ʓ hȱʡ3 p=p'rTxRL{YﺣM%"ijg4Й%uL.۴HM N@ȂwdypIya?z˄<.祛P3%{N^HVj#QZֻ1!0ߵf"  ^YTiգ~/"*jπ$د޲ :3~)T*9'# QInvL{F_xc5yY'0mCbR]%tj}8\u)[38_! ȨXC5XrLr,"Q=Eb"Hqv">uјQHX#6i zm17"*\/$9;m6_.piVZ(sNc]:40Uu䃼 QDJ.ctVXPbe%\5z\H"P{`}~[qdBoj֠'e^ğDT5j>([MS8)OkSdevhY=1e.jVfd3scm sl0"̵WEQ(;R{$rN_;U ^+c}"*jπ$׺j,V.淝8 H%4n09V9T{$.8Ģu| םhtnUQd1*,K]`2m{.(o*2)} yo{ƙKMK掎$2I34^ 6aW~ѕZ3~9A6-{%q@*6~ %99 @0X a>vF0 %u'zIߕ3 ۸<'"t'"Ou;whѳH:ϺL➑C%3s4jG3g]?Pm֞Ld”NG[E–0&=ʟ*6Zu: j3ElB!x=v`YuXWFVXHda=^ÓYƲT &+9 f+rw`4[ {ԧʁx?U?>;Qe kUٽ t5X2 pC=2py͗[~e;x{.ӌ[7M"9 Hի^Kg];.fC5" mtmD&EFjXF^%?sHpr"OŗcN~53v=D܀Jvh2_gֽJ{EөHn7dqa%99 HuRIޑwft~n2ʯK{V]! ]0t~%Q>XKr,s d6tV&9U,q|$SF-fԞwsp6e~Jf۬\z-)L輴}Β2 pc]2|D l ٤:]^9]Md'Է0# OSĉH zԀp SDXu' ?"jܦUҷ]^1T"]w[ByU FQ>epӼ2<ҬUyӖYhmo֊]u .t40Eӥ#۵դjȱ՞I 9ӎ߽!i>'}f{)Wֈ(Vw@m$4qQCQ4$ ߗciLȚ#dL6nɹ8rvl`ZIHKB^륿8m='v8YGl项_K25'<=8fʥ9XS[9LY۵㕆QrNEgc:A59V\ղhU2!F~V`DXwdǁPXC7?zIS52v+4#.FoȥZ^,nm$Tv 4e8[]油hBVCYX3&~@JA~)/-W=b s?Bi`B?+XGy\ɸxq4תuR#vDFnqQ4gwqNk7P2׃9)Zr|,~+qD]܎ұ$WA7hZД&GWَF 2\{~_@P-x/FkF;yRWFku9UK2rBϸA帧]t*2xz/yR^Px[VVjxlo/q@:)#0&3^+ DO8^=t6. )4 PR}+|?J`CA`k-% U*0"UX#_y`i`\ 0 Nr1ylcշeýےvCϤ3u+#=R-j|[l<(km[96nqReaC;!N\r1[j@7r%߶.R͵i=k3XlyG7F};3#L;\,GiYI!ȱB~*:c#ug4CƁMOBwuYM'!|'&WYhkqW;Ki3HZ=k>]->_>rl>=<@}%ɏxKD }g01e*.(3j"2f]:uLoF{}\_D*C5_OCPw7*1]uսGPO1ugչUY&9JJ]*p+VXjπ$cJ4J Aݺ/Sˠ0e8ZA %EZ"XF~]/^O\PFVˣ QnUNۗ-tX/]"i?1#G9LFQdHvUHT1-zNcO[Grɸ{!\ e~zeOt$\ k틏5C4c~_Uj'e،ci,RAe]ϭOjU ERSUFOs+1R~Q<=})"@66P;Tڞ`:uukX>B a6av8R:t4X?ߋJI?5~V%Ud[?ra,#lci~Z+ gz/d2=e^eBmF/eFWSFSuc1^t:| '2zzz񜔫}nweDst v0,C178Fj[5#) {دT f~#\2K}Ӻ2\D'ҥuW7#e-Ŗuml7zc>Dz" .,Y@&(eƊ=|ڗ] ؕ=jъ綪^퓆2\5/2kR#WNfՈ+ddMf1e~XͳZvgpm[@۫r5xZ+#NgKݚeh\ehB`7ѿKԍ 49SJoy1P6lLclLrj@eB}JKy]tA c>D0a"ϝwaaY;ii|g`(l:똎+ a/+<ҋ\ cx^P30_ ) XOMj&<|$RECDMȱʡ3 p8`9 %ZB-#UJ'BIg:Nt̰"vHj#'4u[}-#/3\I_WZ[F8<rNǽg 0q1O›$†<,Lkl+ɥi#FN΍Hn CbF=Ћ<#ڳI: {RMB W{W5U T(aΈku}7637o NRcY̷]9J[&s[-lJ[V֪e$]EKU:QtTpѲw?+#D}o,@ eħ+sJ"؉Cr s @)/;nJ l{ p2v5εfC[f}8 Y7F0H0(TAץ69ۭPFkXu!cOLq2)܎'$ b(A>]Mye-s ~8FUQ_R:l];w4]|b5_guF$BH߆DB'/Pmh`ӥӭvQgl[f>3VXP8Zm;e(DR?tV^KO^٬Q՝-LL0j0F!靭89.Oz T?o $A L 9vO{[Ôw\7*Q**.$_$Xc#g Jυ=y ~qg+ȱʡ3 pZqfJc+>ՙ/7y.^y[.sƋx|{7ҋ, p1K֊=̃P 9޶XUҘxϻ8UſsjL;@pdQbl1=媉iL"z uIGKhi5{x HEBk0@`|ܟVzaf.Hc.pQ'xͥ"]:Q\cI{ OȀ5?oYUr~4ݐګAϋa5iiOׯ ~GMDؠRs絿;XYbMQQ@nZCj#QcU/>z"LHl57dw[#7QK'yr{֝.,ΦP5U M|gʚ3EFܸI ΦLBg- %8˻2\tAljU!\!tld_ ۺsZk/dwHmOw(XWx Sx} }MB*y$7b.^6ѕZcJ}?>LdzF//ey*u,S arulp%g)\p\ģRe6G+# ؏eg_sٖ~u:5E`W2 U3 $o8eZ\;?5$4̑őE eZDƭ, 4x!V'V(d qicI>r #`4Y\?Lfϻ$!Oj$:CA:cƌu=ng}@ T]7\f9K_SFk/Ȉ)iB%Pd, *H~ntzOgnpJԪ~WXkؔ## h?ݓYe2%]?T>2\Ҙv R[Muϭ5ZwPMŗ‰ ,$bPw_+PION0:Q˔?_6jVU/#L;.9 Tr̳`f5۶,_0ļx9r6в=e6oTr-u"ՓepmNA%NtTK!EYj6bdnۉrU}ve~dܙnfYft͓{]bR57 szSgdm|uS/%Zs,%]Ph^wc7RҾuF4>r(ė& OV~6gաyE_P/FH9o/ F=_Tu,FdEvBrTnACfю 4&(G0dH@j䄭a&L^Z !ܓUŔٯNG';+83\1:@Vժ/Thc'Nk-ɱ̡'d@l7/{2d~BM!x Djw .0\y̧2e@ɰSCOkgEU՞I G H;t/ 9r$mnL8vӲmyslRk>Rzufȱʡ3 pCg툙YD,< }7OQ)'UV5D e8Z^Xźr /?L[_LF؋p:HPhȷH"ie~ôe uap/ 1/]SD1~Z^ /8Ɍ4e8<;d ĸ5&vk>/Kme T׽~lsy$HNOiVi©y^CAnGx 93>O3DͳmZ"˃dP$\ae,|pO|Ža KݪWjBu ;1uNtؕԩ3mJRdleՖYk szðqUl2[?u:2״Y$\l˞$,% 0}YKr,s 8*FyC!#@~0@~,"^~- ,Qr:ww]NPGR^e Ib64a AacB22.;$A渴:Aœد-u{?9#gpQثW5bLάXCO 4k˄`Sװ8c͋3)!}R0c]Uh8g|v@Q zq8L"7a]K+u'젢`ȱʡ3 p=4>EUHkBhZE)RϾ voW_7N''r_;ܺ }&|̧b{u{שYZSPrP4 L]4 |L4~n?sH9Y̵cFTd`pZTC_W\趌$Nq@ݕPF#HvrXBl<3v%Jn]U4UJ%LFǵ ɖ/dJ4Zt)_)_q|]{(ir^oҎV:ܵ |3Eĵ>2ts`:Ǜn"X$şn}Y]تLmB'sZ}oU269͏ʻ$gSݹ2=ޟd2s1o̍myֱDۅϹ_0HtUeg:}ڷ 3LtSUQ5˼K9T@m瓽yʥQ$iZ@(Nꃧ8"r/*Ƚ-#q0OLue2Udi0Y7{&P%8Mu){TG-#Ѷߕ۽ARWnu)tQWF+=f+IdQ1f:FC.&d=䫕Zf D$̒rW+֊=g"0],:'Uݔci"l%ͤ]J eVסEVV*+SF0ɷn8 펎dKn!w _蜺l$I|5j.O3vegZx:J/g{Վ{2ܳ/7u K# (" ϲedavpEv9U\c6QbK|~Oٽ,lEF|¥C)#,yZJ*Ӷkn8`c"I`z",_X?H 1Bvpؔ8' \1' "gu׈:O(uʧ^9GX6B>mL,ɱ̑dy>Jn+Rټ2BV1t@?e? \H%4&ϤX Hcr>V%;Su5x\C9V=5:(.<ӧwMm,ɱ̡'d@oSS7熼zCxPf֗p| 鏒m02ޔm[wuec(/Cg\ñR&: kIe=!g:w{js⵸ @ sGu -!@hD/_U#}ƙHqaJE,4f d\O;a`5H?4'=2O9TޭVVЮyy]՞ o#rzUä{[rJQ˟̣VXP$ q(oHc|NƃH//,D9ݵ)&T|WӮgi&I&Pe^CECXg"#"v*ƈ(H+UYA!kZϴ '(Vw@rR~t6UTX|N ?Py!:Ps*)ouoa]T/S!85cVFˏ5 o PXh{av|tBWFԞU*Cc~+25ݷ dzKU30* T´U (/!q?wWVdf0DTm-1trA!XcCg@മMCZpV JPTƈ(Vw@iuO2zyȏsrX2R8)\n _! O̓Z25hȱʡ3 p4V" X F,f '+$QSuz ʩO˖~-4dLZcCg@[2hq|W'캭Wsv׹mp#ex[`@ZJDU`:Zc#gs*.LǤg>$ E(Q0](,7|W(tz{'|.\KJv$IXf-7Ɗ=<Y nA:I'Bџ'V9T{$.&,ʢqϔ6 "g@UXFw=Eˉf*T*-7ř`,_O^dM{zrf/3r +۩L%Zc HO6JYEjZn!f%ʽD7yh[vzhm?XRr7ߓ)d*lźTWFa µh^k [n*ȏ1Ɩ\&l\ ,LfUݜk7ʸv6w ڪ{iRRW>hˑEr1udI20>=`v3xGWFkW6|W=E({Aud1u }z|c<|F "FOԇs&X$Lr$^S5AeB!!3q&K 7_qQ7~OѶVXPP|y K(u 7` @RCD]; `Y@#5r^}9fUa4ۛ5D=4 5w@Fw kW.-u(ou=pr;ϼyBPoy:#њ.⡷ȉtPrCwMWBMwI\3\'$Ab%xn/C; _WnNɞ\Nf4 m)7c33'X ( ڝl'7^EM }cGװe)&λ7Fy@ Y8x :)>=՗;g؊kz+cEÜvܙgp2qwNo; n'Ե@epjnH0'0U_}܈{ߕyl%Lc\2Xƞ8t˽Q{%/I2CPNFZeRdiss0*:nMB¶]G1$@3g %M~䔯k_Wg-,{Sns1k^ޅaɈ]zغ)I?{@ڟ*>8NDbNчůvky~I1zrGN1ĤKNR˕ w,5T2ڒͥeBGB9jӪ=ȄJޑmM*w4"(΀#j{I`t}*I{RXQ}m8\$sb9ְ-@^z<^cUC6ōERiإ12\#ds'ه%=^J>C$2 Hxyl53:uMYPOٟ%fwӕg4/酗q޽ݬn[F+O6yѢcb :kO AC="#нd[!HrrBҼP77vũ-Oc'Va2\jve8y 84%s9~rkuqg{;=[܊p0`E!qm^2 OFuĥ>w9jcX<%#)E (!/={j7xnΗT'=dj +箑4c4Е.K7S1C&!-΋PHn a0B˛[*c {(V-"\覌|*T*9vcHݚl{u7HPyCA%xaL z4e8:-tc񓆖Q +Cˡ^Kd@j@5y'CUZfL駈%+yzߖƿSXXƞ+j_˦hm8p<&t2 zc5hILOȀCh䵶&i,{$.Q`;c7 iL{KfzhE(1¨7may{ċBX1{U{=|plh=]+S䢕Z8[PCfU.Yx-z4U+U*IOV% Ό-!>.2R!&Ege%99 Hܷ?8BWRyo:0 3xxB$nj*V]#Z37՚} F=< U۞-# q YR:ZҎpاW(^*yR)"מx[,+ y`{2;٢ {cp. u HW/&84@iP5DŽ$E.dŷԫivHO&mdpŧv6D}j- kU&uTǥ|% Ƿ'e6"+HKI_gwedn nJzcZ AiSӜW}Ԃ2܋gT*g,޴17(KG`p>C1 ' :Fj[nMYX3ʌUmpjU!xh+ @53OWm.^3ky0!99R L_` 1|TYN.e<*65ڐc5gF'^-_ȏR$HopIVq)woydJ㈌B%~'/h.grj?NI<\TCr s @Xq>\Ӳdʸ%zp94{n.i;709V9T{$Nc?_(|<)~r,% Ԟ=yNa6IZFpTh,z #__:PB=!.I]Ӧ ]J5f9\Z>Λ-#35)bH.ǠlMWLZf,9f/g6n.P+! ƌ5GP;A9 `H;мwgOA\"7P>>@~2Y+Qy!}n\3PH(EzYɐ^#dCd9 }ũݪՏBeJRԬשK;5bdr<(O8snÍ/^J4HnZs 'Rqu9N#ET zxJ>@E)"z`(/dJB󴽹5i,`ŭ3edDCM'(kIJFҒMM^pV #?΋Z3RKxɖ,bxH11wA {ۺ,UOYre7RHP4 -f "C}_;Jq߁DHQZp ^Q)Fu<;B0W ET z-oTvB@w'> [\侯{PW@Bp xr,,Iv?K$E .xdU9R9T{MqS0 O G}[̤A`@82i_Ή\mtR&j$xvȢGs(\JCǗG7XqvǨX {"boiaPqEzL" 6luL2 $m|̬ߕvǂbW!W,6Wod5dzº2|"4eC|]F'q/U=7:0%0%厒HP 4 Ɖnϗq &U76hߌF44joNf~>m Sץ}3![`~Ğzׯ?jFWPOXo fB80!b >#d"]lo! q&10uy`4bA{o;|`.!&# :<@ nfS)ȹ*9 ~w]+fs;OM@&~,;{ފ!BH ԚTYPWh̠CY1FP j_\S{OEXAXȟ GFaBX%)y9=Xb s\ě2?gE{u=5Rt2!X#`Krl `՟"Z5͜2/Sq0;~;^`eYB9R9RyEjf#%-Gx4aHh٭ϠYڲ%A5sxv7=c FW-_Y5A*)K5PV (ҾNքfs'{$k3<rJ2:yuF#IdA@]F|o52'k<ȑʑ3(U&ܞBw"]^18%/",-d='ɴܞTEW*ۖ5)c)}Ұo3lv6j }l)М0wȫezBε' SZmhX"2)$ޫ W J tqA?6sW7P8 /ݖ(\ cp^FHVAf >HGq[*)#3;6a80Ҭ^/'1+eAj!&mǢx֍ھL^Z(7fSFg:ltTג"ԣ73ѓ{vRHjϠI7۱k[Ҭ C}ܪ,90*ƺKU#Zz5ze\HOwXΣ]uo4?xPʞAbhTX3A.ˉ#N@lWyN]kT.o_ԣQ.@h X)S\Fj!&'b6E&ץ:.S3^TSͬ9R9T{M=xTteq4 9HW7.to]K4r6vSF=u/^]1甍ԝH;,|c @1y /3:=6=ra,ӆ*Y*UjYT*u-vez ݊].tk(8́n4u<'HvbkYj 'Mg1@PDU p# zߝ\z'^~)zP% | |`WF~rw¿䋯Zoݗ V?mծ! 򾍦>/-BKoHh]G_[Mr1).6stNO&]WFL]zd9Ic%98(N}(]K{Gm'(x?x n@-)qae,U)ƟZIr$s zOqC Mƻɍo[~dq>JHy]O§X`Fjqmڵ\R7&Bfq,hhYDՕ٭MtFky 5^Cd IdA@O7EQv=O+~Fjx?=v"û.-;)f9zMTMM=zA>{LZb9l>5\O1OTvk$G2ZȠIפF%HsTbHjϠI.=T t2Rͳ@k z.0T7<ڳWC07ÏogD^bo /+<8@8AH-kwNE"}Cޛ=Kh\Ϧve[_HkɟZxz0nZ6"XH{'Ir$s z9bËw}].ym5##ugP$PWdipCqn+#k(!O!s=U=EZ/}H/7s/uILeSZ[7uX]5zƨS/65uDAęW>!  qғ$fwa'+'3'ez:f*GwLF}~#Lo% 6`m6%r)-#Ӌ'3:-12^Dy{v?5uL>B/72̙nKjWAg7H rBr}  ÊC$JÍ%+T;{fbK{8Ceަѕ7z/ZgiNƔj +|h!H*\RtCy~W᤮dLB +w\~Tf'8,3nvمOH1MX qF" k]Fss>U>xccHU*ە)s20ƻ_[7Nl~L֪}%wQWo@N9i}ƶIcW!c!!/J%3z2u'㺦R=H ֖ctVT93NVBSd.Ybl%hSFVՔ6-[!3z/eY4ssju.#c9J$Nmmp^NT%[$G2BM={K504p"=Mh4C3 qxM|EAj=(E]:$Geʆ2h=p%o CZL!3fg^f<<C~蜸5  P*Zxpm܃qTڃbה>y%Y]omXbPmoo $v=Ђ 8Ƅ7̓e ģ:$w[ x04@ひZ*ýh/"qSFVܩ/ qcfwJNz%)#g6x{`!>tK'S"Ka`NqzE-d{tRN^ZFU2C< wAҍ"g,7xfE]MeVkoWϖ釮bjkom@s;wvb#Id zNgʧ\+72a${'_ ޳b~Ne!VEj/(o\6yHm"_-=k!-K^AoLC0ZVYU;)f\ez: #Ls?ڑ)ۓa%m3Uj2cz=GI{7.%>-1e.|WCk_y[+ʩylK2ңKIavҡA+/{RǬ9H֋QLswR1ͽw5v)BOkor9*{%ɑ̡2h荇7Aˢ\G<ϨM;eE x@vdje5ռa-sQ ezᒐ \٭hw^P*PsZ:q!|-7J2O*\ Uգ9R9T{M=pFHnP΂7Ր 's™Fς~.%<9ŧ{ڪe۳TmWZ+"jv# 7KF(c8BvsG3Ih׋KҤ / (Hvll8SFgݵXjG8_/%;(H`ԟA@-?w(U/0b-॓"G*jϠIg9ϴtK4\rj?^`tm>onȪi$x#+4r=]ѻEQ<+?9Vsy̑3()?>ֵ5МCVJ"՝"0a:K7황.9߂canZ3p^9ħ 4dYgIWK'K ?cmmcb9LY5F$lNuv0Q 7I.K9dImŽ;Ǹ?*jcOmfC<}t@vdj =@/3|}Y0%GxrGD})By?p]~Rb V]I!(62HGK+5v`Thڤ26y1-Sudۦ"FmiU[e%ɑ̡2h6y\Q!v9hpe^?7Y`x-7@} 7zj✬PP՝"Z`$5 3\$|R v״񎘱{vß{RƹT:g:셡##ugP$P/'e~s]^șuwnjcu$90*-ǃt͐0'=32ZߓQRv:\[F.Hɣu0BZؔZ/9(T"ј{ܻgDvi "Y&4sUUm[-^g#sfGW$IGMu^TS0q]m4ȸ ci٦݀xs/ s?Z3<[?e/k H(s^9:x- Ke#A@[NMS wHc={8L0hҎxjgg4rmSdJ!EΩYM޷A8%Vpa2޾ $iaF%-l6NsR0.ȘlcsZXD'VR" EfT>Ȭ-r,"TdfNp*Ri)"z|jjvc >赺B0'jIH7ql[ӡ'RV0m>NK2G7rO(=-x0?ſwӝ 1a Y,327s C4Y{Y@gɑ4jfNa4{s$99BM=)iN{s2<v\n>&9)rr z*rwjUPz|tttug,)uÉ#f dOK&ν9 V̓FP&GjV@kݳc>%ثE^!Tò2OIJ3q^G5ȁd z.UNΥ.N>? 7n!a H!ʑ3(WHMnC|x Ao_Cf|㩍$;Ũ1a *9y;zؾ?J r1Ũ;_}|C1 pb5BV ׺<ٍNx%Un?ǯ5|!qSl)URzVQǽ˅՞Aӿ,rz6)/(O?&'f;q#IdA@p_<.ggyOkp_wN |IZ "G*jϠIwc[#dr OgRDZI0?"G*jϠI*ITs:Zev9垡F;"Zh^eM*MQhFEq!.f1S5ToW%GL ]eI:.k{Ir$s zC±{) p c1 XDZ \%UNs{WyM-0Jg{ôRCZUBZ[ghEP Lt$y]m5ezm+He~uL]^]צolz Qn4$*@{笠;#}MY-|SMm&9i ז~AQu"!rLe/W28Qn(2"\z-W;Nr9gxK0{Qe4*DEReTpӿj'RO2jm,u,L ڰ2jOj gy4gUb]^[cCoP9۳swZ# @48(1_ 8~(AG]K0~>fmvA2kٓiv4 S:GôCx<Ĵsd;Fם^vy`D*@tC8'?JK7whgrjތL@U ܪd:&b؍$99BM&ő,J]'uI^ڗYgȑ՞A@NyCV]CBDuԇ5ͯZ[8* .sԄ^uTF@Ov[5j]kxXR;r)´4??+#+urp١LCl^ [i&g=EZLصGJZ:׳Җ5"T#gȪ٫29aWI]h[ hC-OWsFRH@X,[4eiIMŒ[RL7cˬ[-m_#YkuбvyO)rM{),A D\PJ#C-d$2;1.Ps*ZdHP [C`䗨dE82m $99BM==y KݻH5#kH#=&8@3:x{1 ˙Y[%_VMwռ *SzrpJ#=&8);ؔΠdu4e7w#9 `Ah! "8oRfƆqFߘ ur]tLc9e=)&떄g:Ir$],A+s@RekMRLp+ET z8+w.J 2]e% >虑ʴ:4񖃅A[2sǔMnD~ ~a_7:|; {j-^`"zV2W4IӁ3(U 6E~F]ybFq,?9㒧]r)leTPXG&.1Nx\|wQ*F?a^ @ MIεJ ae@  `p,8jTucpxډu{^;a08&- %"F(Jb4gN2(rb9ZADW](AdžnZ3x SRn1-:TG/e;At= ;vEl/ HgN!L"%";9Ozԉr`I; ]`kwA꺱+#{Nlu-sD$O?ʫun&}Cs IA7>~oyd-oO@d")jTՕǦx4Rme! uwc2:d jt=}LUގteW鍣յvuu=ezel#ls6K 5[7WF/dw(OBl&Y~C 9Ǭy'MNoAj淠߄*xJjݔ#sWIr$s zfx1c =Mpj@R83HrCsjoHP 4 C]|Ŋc%q@(tTs3RHP4 ww8'@[ailf}u1f^WG:k*>[+ET՞A@O~aqY{ݿh .%.JvyT21%ߜyTQ=&^ޝeוKKڽ ՝A;@h)$DU*OkjEz/F=&^`*{dUⰢ0#͠FdHp@_Ma+4@UBȜד?H-l-B]YL^&v0\YOf}?D;'ZÃ25!c*A!1ȹtv+''?Y݀d.MrYsO,2ӽuizM~@>]|Z ѳgl@C!fȶ yxF\2J*Ȫ=?|^׫/>xtl6 TQsz/|RcRiݖ$G2ZȠI7~O_u-/n~OVou$^SFV nW,;'1{*O(@XJ {,Vj!&kyZMb(b#= f,:g{+{"詐V%Q{w9R3h>>fȊ.* Ejw 7kM~HRQJ:H]s2]i1 L.G#&8%8Mr%;O>/zJQUՔ赦4[}'eK[.H#j "yGmxmmE7 |ئx \jVUG9U@w[UJ#=&\tYVX47bg0V =>ۘ^#6-b]0 k88`CG5tiN-[ |8+ 칔d5U`#DPv[3uB'eޗHI8Ntل ezs)yB"58Y q);7qmɼ9Po=@AAsNߨdF3DxV*V{M߫PPga8hL1Z:0YOW\'W&w:yk& ȑʑ3(U^&{Qnv%7w0VYk"(P~!E HBc3HyJ 27WBH EIq%B;%EPI@lH"0u`ȑʡ3h9wCLh6}(aSFX^G2dؖ".12YxQ?"x>b NA63ufY<ڳtu_j~\%QAA,P͍yjB>'<]Ѡ0:F(3C?0b(7olѕ =;xjѿ"AJe hY`ﺳBWM߬>h1zy6PN+]urM9Χ2 ##gP$Poclx au:1R/2}$CdQmvRk % w lfu)Lx ()bVCJ"G*jϠI&C%I69X61&vo BH6Ya@.#y 1{:Y~eTՌdnu: #?"~ht9KuKovK%FCÔ{W-.Uyj%ɑ̡2hǵ$iĔ(}e\:i[kres|//Sd %dZM?L,Sqm3ҙV}Q%;X$ԫ)! ;9{l\6rg->ƛtYSPZr<w{zHCu)rr z)l=n]ƞr59"z3(Ic6 R ,6 K)? A Ѡn({ ]ĖUDOd:@/R^n2b6zZ-|E^b}ΰ(6G *8_Z*J#C-d$ ~޻VF&REv?އ9H#Cg$'2R,CXilt;\mNo**wy Tq4@n$̡U$P3;shjm0we9ù8󼋑cƍ2eۑ3syE=I *Nx5 M0Pg mj=FIC]O7nADjO8Fq{$ɑ̡2hdr=W.MFp^\)9R3hO"9xcHbgjfX璜H4SC Re0J#C-d$SIh-ѵpA ۏL4q8}./JEQ(9qѫ$8(w.(D5Em-!sϵ5uTj؟~:7D{̜sV~uAv̺xJ ET՞A@o5KZZ8v(h~ɔ5)Fb)`$W8SF\N7 Z䦈@ف@d0X7L$B2.B4j4Ⱦ0c> qpC@蟻_yߵ;D ?Üo+ P @ !/C2jx-uuoeWpJSF \3i4Pe o u#5'"/H< ݁rEz/Dx!W%6X^wC _O)Q$c2mj~bDҘ9I+SF{c0zBIJ]x:4SVgȪ kY)Z# Jk^~a7:f)zD2̗M]ZZ9D«d&:o$̡U$P lG5h|Ԣ<ǻ)d`<6 ETTA_4}!eƤcl fN\fnrdk'e>c֔YSغZ/`++~Ń=J~i!t6_|sw@#pF ĔB4ś(}֫)O᷑$G2ZȠI7vRE|.O^2)Mc`|3hRs? {.@=6MkĻo'ĮZu=]c"r$PRM%\;"2:?ҾK"8W; dxd򮕓liGIr$s dլ',tpMOrc @*jϠI.\`@7YoSXKȻtVor`ȑʡ3hcH/=BgWHrW>t l!|YAv^X5PNrW2WXb@Ћ`$MEH!DwzI9þD n#IdA@ 8i.EW蝦@Ŕ<#[,Z*mj"gƜJn`H Ȇ=wو'pe=A*jϠ野~,C#dWݙLuiRHP4 BXޡqlF3Ly)eqƜ4L]Gm" ڊMҵfR]t2x\A]0'[i!/6qܵܡ^4ބWbvF^轿[.7£$Io8ǫ7+aEduY]^ޭbCn my$#-#+RbaEZ} ~Jvt{Wa*wT/-[ %:}@dm7ewk+Xo+C-d\_Ax#pc]̃8`R(s,?nGIr$c-d$гyqZ.韙"نxEswaD 2"ppkNPEKd"G*jϠI7-ti(Ҧedct-߷ӌ ;n>#-溇{d:x!>H%[;::7HC"IB\0rIV@+;(]QMxA;p;⅓TٞS㴟6&u#IdA@Ϯ7 umvlJ0ezjζMqos7zCxǰ'$Gp`V8(ʑ3(!U#;B]p}k@HMrb(xF}OPa^`lп/ z=K"׍$7T"zz^-1זBe4+z!we(T ?/\>29cF_ Nr^O)#) _>bȪ'Ra'}aWF!u`M +aȪCʬم]TՕ^ɿ"bAKؤ Úy ` . HMUn=ez"|S1 Zol@(C*y. @6eӋXF'X1C~_@1ح׾ o-鿖Y'=?Y)b$G0ϠGVkm .90K8WY7e~a$=5-!hswjI FX 4}y\C5NrNtY˥rdczRcQP0V@|ȲeS1{'n(]P҈`PC6$@*TyEjT4LvPcL!sԾعTT'L5x:8utvGك! MB;J5XbZRޅC0,kȑʡ'!_S{ګ2,@^x>+>u.r ٗg$N:d =jYV_m?k%EZV'_TwN93oSA{gUITeȪ ]Vo~k ; ~ɎZN(SD]b~ Dy{Ņkܔ,Ðn>\]?ed՞sqAs޼\FLS(NTқ"X,SkwڏfeqGUz( J[z(ۭLi;ΉH o>07*1SIN=w\aC;jPDLJgirt4iV@K zcƝ]Loڭ`lES!z=Lځ觱vN͝C7j%t Xo5*b|-IOzu)g̑3(}_cQCc)fOvv= Cg$kR!"RPJ@oC}7kNX4  .r:>u Z?чf0Rw^0 85 ol `*w9X{vt^K,RHP4 w\{2MNڡcao|k/QP%U$k #.ppl ; Ugs}JL'' Z:^yb$w7$t~vGl_ٖ-ke=e]+e<"Y5[I'O*{F-v?Cx:w & 4jEƗQ3J{^@n@-WfNzεdu*(DPTAHZ'،:/6ugoyAʽ My ҇ B/@|@CqTR0 uR#rV9TW:9RHP4 ]C.,}T32iF ezvX~bYoSD:UPZ$,$99BM=A6k%K:F꛲.nh- -ϻiJ8H݂.2?y~uhc)'ٍ:!Q< s32OKpRgZSc) а&sҁѯeQv]JX]lo6,dWBt`y^Sh0KΧlEr6"_ݵ@ 0r"Xm@p8ҌK-n"*n!ia0)`ֈ$SF'R\-.-LWGꚒ]S[@s^[ [xf tP(pP(?mUX^q ̙]L#rl aw&xDos Ld^IDa;5n,T1Fl@rVJmi+#+ SkB*#P{J@2:?y yƍ;-Ђ^ТKصE]j^WFg׵i s.JC08[d r!XXQ #IdA@QN'cTs .DU&0 0ۥkTf}!rr j#-n%vvr`o[j,gp~/#4hiEZ>xߢ\arXs 2 DP@I.welv Ջ:zHl4гˏcFE?xy1IS$B ͉듷|oZ6bsԕvy#U ?e ԟZ.f>8?'#H`TANuX1`KWU籈\*,'bً E,;7Y^h7o.bYl%۹O|XF^"t^lo&␸eatyD~f9S:-#kkȲԥ?*2?6>'OY6$g4ݽ/pQ@#qHV"/ 5s*u-lxMj6EebBcC̉4 Ԃg804[P2B8gˉ`$j'W{r:{~]~|+ӭL莨tUzylGYLu]Dj!8fe4/g]Toq,!姌ڳbBY դSF.aLf«-.|$N?XYy-u%N\vյו赑l 0Dwq'ݻlSG n HFяs-G4D :TgIlxᑓ^ڣEx1eb,R4תZy^j)_% RjR=2T'g ⾀=rN1.!G!vDZPȟ†OM8d},)#{aSV .l덭/ cs`E~tm=eGHW+zj\5{K#Id z`LƄ)1RSIGaɭ(dl=&#UZx rxsT zzվ!3Sx~l5Ϝ(- ao^N݂N:# +gZmezi`ZѯDHA4FZX=.'&na(?r#ug &?w ^f ' ݏBrB+LP՝"Zd$N+ZVFJ47dHʑ3(+ c2r/xw*/2O,kܬ$99BM=쟵|&Tr_l+#г/LbW1^oqeN0X~/̪}4w=G%PvYZ3xK P*[ξo`:wuﱘKv {yW*Y@O A8ћ?+Yj"+O#GCQ;|Ձ=j:0F;px1Nvߍz_3tcE#p,"FfIdO]i OkBC/_’mG,o͙2=WOR˅Њc!P D 7f$.md5sK O^#@Pl^kQbZ%-Li[FZ!\\Qq] BVj݀qxuf0NV-^Q3ˑl>Xl#0W̡P@M <}%Hd;fEP@Hcu`.%6KIfoAhvw t)#+R aɄ [[bPPڝYez}֤\I82={:V 1CXfWjNPןA\4:"2:m]f9lez~Mᢌd U+gsDsc@kkyc#t)HҤ"完@وMEU~VA?B8<¿OMstyӖES| n 8;5U[RWM]."-7󵞆! 18 A p@M:m7J.0?q8盜xcYe;IL߀  \*{>2NKܲ LP8 H#Cg$Ћ&-Ћ ʽ9/>C>X`[h|@kCmlټ>S}'mv+ kf`#ϊodgCpS{bQj!&Ɉ恱`f l♳ o-"%-ΖԶ)pڮSWZبsk`Ilwz+Y;(dL^~iubRըHPHuo)״ ]ԁ/s挫j( #aY%:'e0HP 4 3MiP>#ώmĻb E)!8p }11+ JcR9T{Mqs@aXn{[5!]֎;SـW g iB%$99@Ej\@ƇdKR _ )ތ/HF:Y2&ɂPL@"bbEC 2'.3pM͏6)5tV:9iP0GϠH.yx[<^g^@EtPKgȑʡ3h֋S1nhd*d-{WMY6|Vj!&@$cnXŮXPrhJ]лB(B?0FcF^8)4:~Kuǘ2&9TsmeyZZ]+z"dJSWWFפJ3J;Uj^b>2 sϠcƨFL%Zr/.ͽЈb W1FArgШvw KIfMXRLÓ[N ќ{8]Fo+1 ΎA4 Zl3:4>;C@\<@9!/R%_ͧ4RSjw)q~cH7(;\^QȸQv`eQ7BTn@B 1(-͖M:f/^`Ϝ #͒.CkshҺrdew@ﯱ O LCC ahcmİ}(_lbIdh}Mל&cgkTG\ oI#߶H#C-d$;?=+F|y/CYL9]|B|/O;q-9 *`$|z2j(I/X5_5׼yVP51Kg훺6e2Ԭ}$́ڳU#d/ V[-ۖ-#{qH6Y87BN/@E,Ls޲9?e1$V'F!rr ju@,g#ei\}yn= U$f{[0:Ѡ!^*.t[bX5@=wy n~~K^rmH7zpײ8M<#]mzӹoYlZ7yֺҍhڴcAvOصɠsr^P'NeƷؔmz[$L6))z.Z9/|{G=`So@AނLk<"݇ĽZ)2nH3ȑҌ^@^AMdu!f?^œf;4Ɍ kU|݊/KJJɋT**F+D(;[EK 'dOC"ISlKrC(2Z`cFϿx("mA Fc&g0)ũ{sj8y~Ȩ=c$-QǤewtk+#kRGڷ:S:gwez{8I\z^*dۡ>HC疒z8U:Zg:Ӹ;Kn&zɄ fB9;n CCnnIXu@͂S%͂E2j tYG~^q]$92h荻y@I׊ͼ__@Bg*Bm1Rm;F+ Xih"$RԞA@^ϴ;>-2^z{7m&X=+u[_ pNHN͠3ezfy.l8ˆ"oWmGYNvli t~yL0Z PWAEQ;"TB$h*B9-%r߮xvځC9δ԰ PV{x2!y @YY"I Zp~=#-/ s; IBaB*n r㤾C|6M{z+#3Ss_$r^_׋7jf̡U$P'31kOZOe~mG,WWSFSroZ/M#5 9@=RKsT?!pTljķ*{A1ق`KgURt&4uA6] JEn4 ZO7Fj+PE 3" 7SY.ot^sC$Bʡ3h*/ul= 3NFP|qx ~^zmIAk[uDGS⓰TvtNEHH!etdizn*nyt>Sb \#pBU^'4՝]Yfbypg??< +t9?QWvr b%v=DƝ ~C{6Oߐ#2]ZX&&XoY4ڰֳ\7aUHҪR;*+kٶ l>"nB_H= Lۊtrm|;-e#/KWa4/eX?yf*M7߼7ЖsYa7XC$'᣷@ݩ{lkM Y|B"L9`̕WԵ̻Z{"Q/B'ԯM<:vA30E$.}?uſ7]&ЧGL,.7addCf:A2G@i' #f>ZHj֛b[02?['/9m)wh̦֨x:mZ0*+OX%X_RJHe|.RN%Կ$.챸(Bi!s^44 XA9$ V#{bS[jZKFO<޵er!yP'Y(=qˠTkLZy>+;۰Lݪ4ezɬ,WFjk~(W/?f)J2RCRJ%,k ?vҗ6YY%Z[ӶXOG čVXz3ߘО*Hh C[n>—( b7zQ9,튬0/}+~Ix ʊ$!n fdX8\.jqY1Jk&P:-{F+pxɾ[ Bw(l)IU@j'(f%FjXFB $%٨bP r}P7只{M#eYX }o8:CإmӜ>z"UTVщ:-_KzjWanڲw}R)FXUƶleutl<$T ~ֽ`!xJt&}jc_B&ȈQ)TזOG4%$}1yƵek#:AbZh}$e b(^4Bזhmۛ[Fy=3h4@SWoȜ?Pgs0)WTn1v}p~xLܓKזj~,/;)IȰC9L,.pL6-X$dtCD@F.-_ۣ},g[(L=ۑΔ:?c}UNmn $o? 3^/mOmC8o5}ڪg ~(ݷgE3;?Fr?*^xUlV pᄊΎ ,VX]/~ǚVWIJqdOgL{,CdHWHx֢T.V ~%ڞk]l¤VRnnpa&/p6jXRrp5&K /D0~fc ӣ,9= J1٩ZbպڠV\kz1+bƟ"8nT$$cL*u{>ۯ ] ~`@a{ ZRmԊ iVHH$Vj:iCqm}M_w#I^5r[T!4+_\Uk7.˖Zdb]2x5Qiy.<4Vc 1B0B.`S#ɩ:qpXTJ|Yu%X>Sΐ#w:6ݬiV?CR_No\ C< 07^#>[)wieCۯ/ב`è$9+V^L d$N"Ѽn4X09fZ{أ1fe[5L-_12Hy ƲLPH+5׵BɐչpזχOZ]v*_35JrUxe&W xf :ϳIUc))Wz4dXxf7IZcZUK}Mh ,p5*-9i C[җ}iTVD"ԣ ~G$۴& XkHH n1, ZrjlU_xrSktqZa; *dp]?UMFuQLBjo}:fAJIKP/%ޟʖbjJ{лwh_ V^3+ǵeqS,%?2=졈zFF BS t#Cp=S"~759L,.̔`vP+{i_Vze4bt=A6S٧ڟ55/ )%W)ly;XEj-BU@|Ƕ{G{Hٲ<|ז/~`3bϱCSb(w@+bV*Vr R9%4֓"{T OMӵ| \Pk0Q/u^ɀuq۹jt)*WXs} +74U3)c~Oq>Skž8WO"-h5 %5\Z`Ф(4-o,1N󣯺 Zhlg%Lu <"W#Wbe#oB |wTy{ :l5:~bVb؁ey NyeS "o/EG^_gR( ntV?SFBTB2-?^ՏXN(T+!Z̊!q_o9 Kc(z~Lzmy)NMSSV4oLqޓ_^ ~yJQ&*gb! 2B_/<_2I9 yVX]/7FǥLVc? Iq][/ԊEmK]{6BtmsD:Vٵq4(fH&N4 p.;( Aģ9^Mi|'jصN.l t>Y(%9UV+i lӤ) H/ji3ŵ}):FS@E'M u*J6ZfbyE.pcn87_G*LA `R;X: lnPί_5owb+#,V_xe@J$mV h̓ ]/pT.G$ +VD8nfقa/e4}y neUO1Fb%d0ÿQy(D`$``OB -_ +[7U9 <ẇ/H")Y@Hܽ1\#\#C(uTvT',DjpݵeVV\5) F N!1Rz? ez&?2tOH1\۱voFLU)(Gƈٛ'F9} ׽^D w@5 [}4D ŷekVR.l~-[Mx2x5#!$*ĽMgzC[2 q*[I F^۲wk={mڕ[tmp1\7Nn$_aݹFV [ToWqGҵe\ `46t'4q5T+A'G2!y+CyW4ҵe+}Yv[>-#5W-rGqNΫ-fmG;M0O;gL7ӭD/s/2xjS;;XsӖ-|.y!gἵM2Pk8_W$}^(I ,rm7iPooqNnp7 ,V*":B"9k ;2#9ri&7dL,.03mZ9e&W8fyΌqx>rna]ޣ~$1j ^2WHwdi6Dt[^+\1=DЩ&I,Ҳ,2U}+ᓛ8![PUV?gn+phuRx:?֣/j BZ{**R"([fbypg?No}wz/bpmq_PV?:%זl6>* Ke^ ~~,Gi`M̛ wiWVGԒNѪ_1P8 ^> 1MNJmpgh\Ȯ{f A+t <3;ogR1q{XB)32ؔS#)Lu2P%pm M9IW*/JuJf)2N M,3ͨ/PrNyJ^'<&ԃ!/d<1S}tZ{L/&@ }MuÞKSQSo Sv~8دJhDUh gLkNB}@r/Ӳ/wPI&Ŕ3A vrj8^ιtuc[?5HLׄƶ侢[p"+gELs Wuݍ2|~IB@P^*F2w &Z|սp))Fbݞ`K/x*rjn&$hy`U@yo OKEno@o  &0Vመ$~pbԤ#6MQ_ݵeֆy/X^VS^VA.?0 C1E8XYfbypg?7W>5KS!IEtG{紊ut./И Ж& )~nGWuA0P8fpkN\ͥƫ#Ef.)CVU&VW <3 {O HeFJ%Xo<" 2tFiB)iJ2ti5+Gk*Y7ޡ-H|T0mD{lNÅF"K~):Z,k VcA>)'ҳɒy61 Ϯ-?{Շ+I,7k 6{EPo_{߹Wi+orHV.*]#AFL,.7Qq4CA1̧X-WTլkWZm:k_{>b}<}umd?ߵr_WQ<2dY2yׅle")'H6()Bd1-6F^&J@z] &n{ә|EQ POO0Q(#PtY MU\8\xT ^@g O}FA>eeD)Ӳ7A[זVG=Gc`[B@]S-s_ffe*cٙ_0@IV sJ$kqԨ~-2 \0&O`*i <Nx;h(pmnmV;ß9! AbwH{jS= S"o秬r>R-o|זٝ 4B¤)BU44Y&UДS#ąmo3"FcOQ 9"dlMC9Ԡdb_(F,6V Af<'{NLCf$c\eb+j4mv?4`Oj<)()E7x#ǹZQō3F2ɶg>MD|@^fژA7ukż_b2Wi] MS-^ƛZ}T َ< 7rsNla8-J$cxv5{Z5c[Di|4aO2u0܎?YځC"%9RM搥li{ڲw {H=Ai$f4$ɀXa{!·TwX] 2L}<3TGC%> _Rc٢(euJ'J7} ~L@X PT \YD8pކ`A M];H>bB +D(;ʮn6zyYtymKGM~ML쁁s,lh&Mj;uL\v-{rsxpM=&z֚>4/G?=$&0rS 2nKN?%Х9~s=GPwZbDTou'~+`}qQkϔL_g{G)O[nM}}7ՄgjW^m!ݞ8qVέy'ݵe{UFH.W7Vʜ E-d ^جRpX^+\s`\|1%=)ߝp!F<;[^Zëpm si"9]Gņ2Un“,BS4:uͦN)sX^+\h,#X* PKR~OuilXB{Wf7`yocf:=,gCdóŨ- M&!{3p?g}_N*+Z" :L,.7bnOߌjNR<Եe{8dcezw[fyVuSg y ndt6&D"#fJ2`=MUd[Klj^k#WUף_z0/^&2/+RMH q9j|7>_IJJ||HRYjlդ3}[֗HiTQg?MZw>z~6|CVYF6@1Lc[?Θ0#wCSUҌ!V% \TiۢtiD8>xxo*=GȐx!&c1aPz<wJLEUŊVK}R`!cjĞm(ʈhyHA-[762Hے /$a \'UC7amqfSY33][?[3Cg!0(<$=X'hh)p Zr~Eb*^#2іaUXGGU9xʏ)~O8pto@JDx/\ QRَBcsVT뭔t.ז[%&Woo+QT-ҩ{L,cW3~.uFiWzJBb{-_`moW7z:'\[Y?e9yM-۲w!u'dn"M?nN(ԃFÌWel۾TeR٣B(G{!ݥ_K POGw@B;:,=Ӕ${|gy:P$X:?#!Xk"zDae]{C2+t <35Uc ENz!`=B6x`1"e: Ig&K@LI|6!m+xy0 #_>\R ^A  ڑL=!ݤ: Ew-wo?RTUxώ3Yfbypg?]WiIe)LTc+:sݑVX]/׬SP&UܾLB_8U%_)!Wcd WJr*=ʖ\Nu]EU&VW <3߱cvt"۷e~BzP0qLV(D ?W'u5&NgZ M}?L) eFc !767òM"8 tk!R_GE')ƼSbrkQgGMؖJXg ~~!"#%RP`=}eI#g/Ӻe@ ѾHH0eN1.vErɭJTU´C j2毷z >aVIt@3ZK~$oU <3mQsPHCNu8DCS/p Iٹnջ*wsm>M |XIF2G%=v;RʳԳED$3hxc7|b>Ks78][?;m/dAigّ~V "9'-ʴٸm2ӹ(v *+'SèV8|';X@1%pzLq~>SALF_ @טטщ!~j|U'^'Q'R'], o=_*+Z_lz<45IFBiztTҦk 튽9ꁾкssb_K뱪FSZUҮ-ElKH:ib؜=T%+ 9~g nw Iǒkx-ⵀpque^ESmZ ݬ2٨b"o2ֻW:a۲r@fy )$~ EscWɱmsRR(c#с$D27Ӏtn!("-)P6 %60SV2]/AW(ðSv<\ubt~cn+Tr^>i/Am_EߖEāU&)зeJ%|aklo)< z-_0V}kkW+L,4Ta:!E Da;b/fhM+X^+\o~*rDPs.lIɲTȸA ke:fQ.Vռ_8""mHf^.yA"(A`e xfsZS I:̿VK>T&o ~ ^y4 ז[[+Rwx5)+uF~ `dհ7H{q*gl&B& bɨ}VA7 yX^+\)[DD4LNk9J ?^; b(+jU%g9[NeXc${[ltVXz3s^*+j!-=9F/ϊ1/X3eAI%(B@ϤΒc>.J _*DdOʂ>4e{ /Hݝͪy,YK8L @e&5 *}bȗnTM]dKT1wVX]/x2:bc, "JT0}_Dӹ>)̷uTb2'nvm)d0bb흟e0OaLڲwkw5V ZH]p z/z$2d+W;՛*!OCv,v`i ] ~tR(Q0"5wu-_ٰmv/ss{/=cge tO#pÈ?f?,8a![GR #L!~'cuHBG Y%q1aDpe "5Ev_#;ѻ7yTEҪT}l1 YBݟE {֒~QQ(+u=um,$3DJP)ga56UrV<&2&T@NF4[a ^(6Ӯ%lys@S&}H}-' \%DOK*?LgMc&bk~ߥ*(w؍P CtC01!q$Rwme+ Ӕgy]a $;A[4spb=a|&$%匉qʋ3GPvץ긶0FiV5Z-Yxfs2znUpRA3, l}q0XNR+e+9CdorF NwACWu5N@Jg#B/ }yL%c% CT!D7Dn@Q/; !qz"רj- DȻ[fb$( 0=r,!dVzxݴ<=S[mY+16š':߂:< /|1M1΢4z10G09S#=#tuMqO? ǁ>}++وiN~g8oL;]ZdgZTo.}vo0\$ng-3] ~`%W U]I/2Fv:#%dGڇH8IlؖͤR9RvGg2cn8[+s&E6Pi(Q2dZ4 Ώ!Cn37h  D9;Eqߖl>JX$(s!DT2m ZIYDzP VKz  mJq(ZZVYlZԔ4,[ebuz322}@%r)!$LҒ(XŢޏEW_̞[IA_ؖ2H{Q@+crC*릮Zbt8=o ~t%D=hɞkUK]+][6QV_ n#LevVCh+\\=mZ?4¿.Ǧ4?a 2{NL&W;1`5!b,[\#*AU:$?ՕtnB c&@!eᗅ8d}}m4t"᯵ 熣^/`\W?e\]* @ZzgOl>&k]][n4( $r2?{ߋ2=еe+k rWDhJZ*۵e{m]Z?e@ʳSYt ڇwߖ[3.+F"II٭Oֻe{帶 ~?Vg€A4J>%%gQԚiQAeOy[y`Z2eҜ:_1㕡gGDqړ}S%nW:j2V0}Kڑ IJ%igTSc_yiG- W'][MU֏KėW:r~cՇ\V?MJ7R_˼O%y4ZqvDzYdzQFB*4+g+\Vmqhީ=:[{FG=-{7L+td2)= =tk2X5rH)+gh)ԑjS%FdǷe>-}0HiHhxx_tBeB)ޠ/X,'#T,° C VX]/x.!!} R][xsO CPNXfk-ኌiUy+KP0”|ߏ!,$ ")Ռ3-&XJ?RnM!l)]PzH8CK&A ->|i8Ϋ}ˆ<5ɔ+uEmژ.EvJdLe"2=7?BXQ;)2O%c(w GWq^) IԽ1B„g4  CbDoVbB)aMiàjd+@AC ƌ2lHQF4;;f m0p ' tݐkY_* *2'9F?;P[YG9 O?x`u@cXJKcԬf Eu{/F_e,q~'`Z!e1O}EPghٲ6ҳ,ٸY ^H}|>j~Ԫ-ߏ{gyD<٩F6!݄xڲwk{whBLYH +ةϛҶs ~mk, ҞRtꆾkVH`,(DۡU *a&%c4X(]Lq,~*@d*r-}cj"ז ({l߅82ͱ-^Zo땷B8'ҕ<F/{/1J)9{"Ue;U}Y%o@> i~ts?bۗcvw{CtȷKC*gc\uw`%s<3$daU4rl60mebt/{EGbB`j4mkM;mJ|SS̭4\[nn]T8ú,_Z ߯ qeZ":dux\)Js^§өt]i>-ڲws}Oy_UEpSVczBd!c@%?(aW/: 8MhdYE0t( R `$jQF+3ِ \_)c5L   PnuH2TI*6p"'Q|iC1v Ydu| %+ek+Vfu{%\[^ȑea=ꨛm}DF:esk ҴMLγ(XF ޓ"tv8ڣ5t4#;E8?== -4֭L~wNIIP&I|?n-_)B ̾F\[n(KUoǫ-_{1 WCPP"\%$({;Cz^ӯϕߵefXdYO֔yYLS^H Xm@vXƮpgq_I1ݕkx±VwHZ=}um}FO&[ =Mo ޻R;Bٗ X 1vHԳG':`G(6y{PLTzLPxfb2$(n9:f{pLή-|~c&3Y8(K).P+p?-}KT}y{2xA|Z]6)4 A8׶k5Ļ0xw2rG92ro1#WK ˣ3e+c 2kI^tS=e^uI!tT\&R) \b%zOrÙ$<2 k2$r}iө[wmxpd6cc5O&53:Oy$C1 S03ekVBV M{р:=,G-ZE{(/amkǦ ^~S"ĀN(b6#A`Jw(U'zR0Ʊ$K nyX>5'14âaΓg3mpY~#2x6=XMSv;L,cWG=ho^k˔_P2Wg\Alj[Ut!OKҺ$H ~y-E,zn̾-_7S\bVZ\GNg;LCjAuSP?ѮE3 b_/sqNvA$2AF.qF.Vݖt'Rl196nR03$)NRG]II0޴*$EYQrvggٻau6)&8C݁EѫE0G?'8AȔ&F]Oͤ{]V"~Mfwml&Ix6gb?g}0 VC'J_ )n: ~! ;9(Cd@qEJy8dHMgݺswT׸Ϧ@=qF  c^8h'ykKyRo Qpp㙔a2ByYe#zR^/jp!A!T9끍sk@e"{o{2Nk(Lς3}C[?*}`pRc@ 02qjIy}պ ~({pB`j^~i+G=m܃cs'$w9L!S\}?-0f'Yyȇyfs=tFSv}1CE|"2O#]O{]iՌ>UUo6z)WIPv*tA[] ~_٦n5kM;4TϩI4=,l2 SlnUP darT~)+?jA48gKO u~cfZt;O_ !!7J[Ÿ`?'4YOIXGϵ#WFc+syU&V{  (޺FB/Xz<2vgAV0kWN)Jũw(3%Fq#G|(ֱ3xՀY[K=?ĭi&AɌ(F8LDq?ty-EVo;ьW xrlX?4ˇH8pH7oBtzd|ӅHhF OH;ZEC52%0{R}T-u5^ /J F%p~6Ui 'V7m*>uXK rG׌Y AryWr.{$ U,3.;?rsϤ Bsh3-> kg]BSb] r"A"Bd)y@_za΃B=z-0V*L4qKM{MmcVF{Α'6MM&CJ _&G {eίXA-@}0ʼ>oZNyDŀ,+'ιSY@~tү7 t}_^i=PYGrL7ty JNAEhح-]3>BB4 Gy4Vaaxq&Kk mܼ_:d|hVfvv6>aRskFcݡ|FQ[ F\1E#YMcϺ9'pro,Q%CD }:&VJ>TT̗x6n&vmڥXG:hAg>w_5CH| 0FŸ ָ˵CNMVoy0a;fJR#-Pe5b5 IXf,"`"@i-W+vm{TR3^R@ :>xBK.uԶr1te][3hK:k˔e@ål0yHXÎGy3#]t֡ T(~j"PulFMx/4ЖYӬB1Kw)$[ 1sC6JExW+ӵek} 쬌5[r-|P%35 IWxP DUPC+c Ԙ9$#m3B]k*IuZ yꭾG׭kזc//u*+LڲwX=ٮ`T%q&OHma1R>4>|e&W xfse Y]FV βk[hNRTг{ҳ{Mo ~g¹dcBAc0"}_)9L%=)s2|yd+' Xg e"_/Ӳ.iINݾMςŲ _ŒI++t~cnc+FtmԍHBiaYPE\[P24sub_z_z80"+\o}5S=Ig]2T !G1h^aQn%v2F0$Ipche+U$U&VW <3>5~c9t_ >6e*^Ц9:x+8x ~>,}{k4][2;sCXؿ (B+^rAlcXQpD2PD]~mszޯ;>M(S3²(iUۯڷ3 2iy ~2)#EGP6^vmJ_I4-5y*Xյe #*(m^-ʮ3ێ]0(d"L>f~Sƹi "cT\P1pl6p~~ a; ]LGQN6+2׹ 86јd{?ep ~^) FaWLH 7flծwlfl^זGgy9̽*P7#ʞ x,.pm>R% !j(D2)' jW[ W Pe`O0# .!z.Ff@H"EvN_}wF2aHF`܍h! { ݾ-_R&nQѾ.E;14%xb"t?+h%T@#6[*R2Bocix5ߖr7G:ֵcd/"ᑣǔ%>Y@1v;Bvj0m5NF.V/F<1ǒ?r؎:;/‚#ІהotymGW "0J0.GE4#C~i)N(`|0`~0Γ?gj`G,HbckA"D +Lƭkˌ6=&M3EskU<闻{ozH=lB9V8=w/'A tő6s{rP<-_0L[DKmmy-],o{Ӕ&G (4kkaYT͛|:>|f4"_/{/&e'P7 bޜ߸jabrNtlM{VY[BH%vt2+r w|yy\P Xzo2^΅R9,CzQ7h n8J+BȐJ)#Ek πLM|džZޯY9qK]T%2Ƃ+(.|_uZ'pVث>mnRϺ8L,.r,G$aغ6^;P4dup'XY.3.X>rx|d#0wuBymX+N\j\rwsk, 0BHI4{ĴiYOZ,&5?25XUp3j7t #]kvĨ7f>p 'QI:2*͢B{ 'Că_rk,&֚g)[X 98/`|l7H& IZR~^+ [rnR2 ~e15@"DYߴ+~rd6,YU bXϦE~n?Sӏٺa|25M_6C[?7J-玈ɕZ(YJV{$  i#:yZgyZk}KVZ[;Jt~cnAP@( 3vMٙIl d֘.βvOk?g5"EtEbA2+\AqFpVtt@n: w \,f ,$SYn RGu12B_o<[FbMOqki{r֘n)gtDZҪBGrYnh3F"n+#%Ys αɕ} ~g?1G_Bw?9ۀ/NƱOa,gh򵯕JgwUP<!Zc:}>l~.˿LDcANjʿ!aB!i,b2B};S -1`蹌)Yd\/pJ8aL*DblOe4B}_1>$i8oSjEfІ ~`j>Gȿ!Y}awK {V}qQwhdRriƷbFRSӜ1HC7pbOQC]2M(aHJqǚȼGI#?pjǰl{L2_3>Hpx½(Q#[գk˼ $nqX $m"|>%YbIׅ ;_+DY/Ge 1!K}h1!eGLoIQ!K[ӣ i(<1< BB6Yu kjƵek;?9P,P,eZj .&9)?(Q(ў(j>nЙdo28)X}m$TuoVXZDrJR[:n .S&l՟Gf4"_/{/*՗7*} $|SD I4+ Q2 KΓtG>Og`אr21]_*z;Db7=I1Id|>B01Kxta4;;z?<[dԚrhشZK*=k׬FR >RAk䓦"^YA e%zT ~P؛$ɘpbL1ݧv9' ]ϩIQu>c[l=KԇZ#౥EjiBXYs#Q/Xf|'T -U&VW <3|yCaGa l@u~oM{KtX`f=Kh:Ll@emThͷ"?k.=mҩ޶i_N%L}_ /{wF C<¦r 3G$QVO /pQx]I!Snhb^}"ox띫7^>5C45$#?S&0/@F7 >ۅ/y,wxqY(! Egl3#^ ni$/xJbH |nn+z(R-_7*9fkv%$ A Ev-I]!. i%FB(tOzZd VSw~cf|}}5^-fh t~Aѽ SE=]ˏYV`]iTb4ua,ÔJ#RDJ.htD do׬3-ծ\[n\ xMwVӺ2  #_|`BZ&2cC}:ݶy9u/۩UROD⨒s?(WAD5R-SQGb,٧=gAh9b9ג/k$ ]OG\^&y eX~6FBh9s l:5R(ؖ/0R-y^塍?r/~jaRRxH`'_Nۜ|mm2EJy/X]ѵy򵀕F*c?;}Heu/#1"C)#ӳӎ4Iā V3DzHK^& VdjF)@o&uݧ>W+:H6YO"Ms*xHlґUꋛ)V U&V/7b4HAh2H{g2 m<3 =P 5/8B&ȴ|c'>Fbc #:|u@:H$Lw?hm1>ڡ-?}QZ~J+rhQaTw$/VW <3e6KFjk ͞ґ<EW=@9- C2Yw{cj1&9-En ~wꘔXrOgaj(lv(g*A#=on!U+ז/0 ٯ% +T>h:l5mEWNŹy-ekv__u)o 2I(̾nun'҄3Yξ[fbypg?.``pxJ]޻"X>ie!^}&̷+N/m42Se.LkƗeXP/ Ɨn\duڠ!1t^~zMӴ;"G=FY{@Ij#c_C~b}OOoU <3PJhr*KXOd.Q \+ֽU&VW <3o0#BR{ ǎσ;'rPBNE!͏FDR36Z U@iҦHG?ޡ.KQ 3\H-z=$uс7}| L6{iIkwVX]/Wj-(*/"<[`$1 j3"j&;(>]ׄxo5b߯PP'}&u$SR'gwNDRP4XaaLB4X0Ƥ^Ca䧆ssT^o "S`j(țDȱFF7T{B!5ALlʎ#<ϧz/gEeCD&+Cߔ1z2Vi|7=]r$!9-8g)ۺ8Kzf`djnMV7[+hU <3وXPZېMDqkBt%~8H(?'E+QMI`3ZX~RN8Mǩ ~4cFo꽣ߞ}u]R aV1S想 \!x+#R~! Va(rvwcN (hp- X6 VW 3`d^ÎE+gc"I21 }c7J/Ԃ_3D@O\_.xKYR˙tj,3v ݈0%!d#Wsܠh)ds0a;fp?j 6ЇgŢzγGTzIIte&{ 8:2|z0>[Dwb]ex^¹?ݲ9fk4y; &qR1t>[Ե ^rxzg PE+}S-sY$00#E A@Ҝh|wN%>F!_i!CQu=!SQn[eb ~3`_ Yxu2NY4hҗC (ʜ7(pQ#w<1Zi ㌤ҊA.(G\vm.BЎ댠ϦV; elk$f!BmHM/ԩYWm5կLVHa%+-I+`X-i#qז="9$ٹ*~d^#aާ{cÖqmlDHk*F$!+k;aeomoj2v/߳o2e0d$z[Tt][n̡\LLw&}NX͑k@ΩOgM$?yOSN K<_jЖY()J#n[_L -rmٻëZҭ][ /s(f[-ٶjv[ ӿ_OYZ:X. ܲwOZ ^W>iO][6zcIکlzGy) )qA[Y'jF&S8s}fmזm)_q+1ṬEz{*ѐi]m1$@±o;&m.M<ԵeslQ)Vn.}XYMj ium ] ~V΅V?z3>61_t~cn>0^m%mJ`~sCK/\6Dŝ<c }1MPB\"qa>,XFb5K)$AKthq}Uf ?}K*\?8#qx ٭$*?sx%1TeSOٌr&ɛ\~-Sit}=6 t~#=ϔ= \V/ui]'xpT߫^%JS r^>_.=9'|I4{of'a1&D:mg UygXh!!`ɶ=$?}ɵ R v'{GBy@0~1L!sQmUVqm *sʙϠhW}z| Bז[8MլEY5/ʷ%Vd!NEmص%} T־+M_M[a})%!6:\VfV[s-[zt'R_gN ܇0wyv_cYac_r3߽_4ggUNxD^**#hnGȴs;/Jujp`R^%vXq|NF_a*tpi <>xፘ4 t~TOIHqQ0ls.:4Yb\yUq¤-v,hg'D|֤3Mwa2Ѐ>~фAwVp~<+zFmG*Qh9ҹ~~Fm w uiM@/"D{1{ 2>CӴ%{.?$t<3Du?1L0~{GHRIRi 2:kGgU <u/tHB4 $6iZoK͆y_dOF_NfUB-?ՒD#I{1WE0Zv”>8Iߖ^l1dW۵~5״Y[/ pזϽeTQņKM >:DuۢVY5vg[T][?7:DH=.Ӧ?}P1*e2+\L/1 f O$sA;`/"U|oKִNugt4]5mɻ{WN3ǠGW?jΪkK_I(fXֲY9>.W R-5L Q9YɰQ;D,.LS'vmi87+[S f["JrRߢe2+t <}d1^+eUHYQߋ(x f9Nr˂x7͵qoȋ/{ʛl,j.3pMh^-0(7{%[lPk: x$BMwU |C@weBROjGSz׿[ArcklזOT\[@-_}*ե~UޯoKW@_K_oKW8Z% 6y~ӔˇsgJŠ#M Y?xjFh>DLuܬJs=Z*<}v̽-#Ux8܂u{&y`ai.d!]Z3ײ+D dž\Ō8D]q-tĭYt;niݩF^SR16QLF@JMazIMԈߩ^a%r^PM'!%Da:JV8Dr?-vn~ k5ϻEB-t<}[u4qPD[."fP]9=AoK>M}\/*duhEVnt~GHJW%ӷ%gaHF}nU)OwhM;poBDEj,aхP .aX&b o5ʥ4 Ƚ8DA;u55sD\Zίf\A0H82dw t~QzBcTA}lӷPhay~5 T6^CxAStm/DvlsHϱ)^ff|P$aJVߖouQ1`Gpd7a,+P{”ҨcNJuo4R+|*d纗EmaI7iz&:Ϥ鿯ptӋ\lהEgSʹ!oU <G)RJqu^3$+%4B}_14$I3aEyKQCvԻ xdtd J ~gn!%v6*XHy1*;?(>Zs$*2``Y_/:Rr_cr ׌-9^2MgzD,.L-xbi5"._&qm ҨkKF+\OKKDyUDI:U~=WOG=^;P:uTC,AW=یg4GO"r,뎼 |wb0O?yBN4;7LWԺW/nʱ1/Ϻd%BzÄW;&piCv?h*TyOSrS_/ݼ,d%qpwyx/#W`/bc\^u!ywMAB@j+u8?~|`{D(!f?yyXoy'<Ÿ L#ʚs?\0hRuUX\twBɽF=mpg%lJ'Kݣ)}tt] ]~ ?2#4m//m}BFj$Iл5:٦&۰<z•ΓWO\Q$|C(+Zl"*Z|@WԷQ8eg^p4X/ppn3N_ O(يZ,}-ekIEߖ[}”+Y{[^זm6KYAε%YO׻$fm&xa"W Q}<3 _S J9;C&=^I{Dձ#_A=_\i`;xVqm YBγܨ;Q;Eײ|}O 7H~Fl줞׸Zr}WW˛זYH0V޻!h\)wwߤ;#,d_4q۽Zm m +c';OL5mɻY!uFkW][?Q۵x*O |uo}TiiLc(E (FX C>Ig$G޸nCkޏa.|z\i;MGV?~Q <2 Xg"6m nc%u6K<~Ur˙ڵީ_\ԅ4$kK-bka{Q޷f;O1K,n +Ò;V,DB&VRlUമ-Z1*,}]{>MakKo\X⍵-sZe|J}[z_dXkΥ2յ%/ֶ徖\4T\[zOujg\8?0wj~};gީS&3>rR6HHDzטH S@c9 h^Lܖ|KsWM[zQ-[uvhtO tZD#  (A"/Tv36x3( |AeAgFڈ@ZzR}w9a D=JU"| N(,*V-BW3_ID=Y4AYes*ahLFa9:*[&вG$tm,OL ]~>!hͫZY>: ~Ӗ[b/n+;ז۳e~Y̫- ||ls&q .tIi1Şkz/ӣ 1"_-GrX{ =6*Xx&*GP&O"Y\H0W#պ5YxḀnj< S G(‡NM,F&h֑;rgg'Ե%V+} -WӖ/[x = ^.4{Iȩ]}Ϸ JٮXj 5L t_^HE1z4Ef*Xu~DuVXz3wx<^& S4{!W9rj_wnݸt[Ca W`+P0ヹA겡FO~:cg>RcRzfe5ݛOYB=Sm;DH8&pߝX,*`_JrͶRU+Yj<QM t@XKy^O<[>_%ݫr]⾭9Q7ezQSk:cm^ØCӴ%Q/7iD>y_g-տ_,X^+\}}]Zu+)Ji8~ӑ:e}umڛ-E? TS 8Tu*8ז8b .FJLf+vmS~i޿>HhpZm%^hW[ $$`؜*|)eeO`0`9^@ޓ尕{߆N64%.pŴpB݃7Sd-_2l<-s}WE&GBW3_҉V{%la'1X~[(Q;&pK>Zp`%%g)i qۯG%EdbFdr|N1C ƃZ[D}[n/ 4 le,|]L>p/7&ieڒӢ., jLF,+L0T#{͝u|[XQWWZIC7)0+ juVeOn. -Z~g?F-/RKkCM`:RhCU"V/pLޭ5qOb=ce{*vx UAI$z ADUH1:,ֶ-DZVt]ז/dKvkDRtm٫uv{]½.QęDD yxFe=9ƹjKG:U+FvQĊC* \X+=U9-iA%!Dz\oB_=J:a/bj8,`[gH wotJ'cD|B[ WҺ~9,G:22ˌNuX:v2+t <2gZ M]WMJ9yr0^5yhڨ("93ȩ%3GKO]z_Bo{iϬc72uާ,GkZsNזMqZvOB0*e14'|r^! N/kd7,ʟ/Oқgx& !@#h?̢#3Wy Y mo.vnW5Gbѐ+<Vq|Ɂ] ${6 u= UzO.C)g oGh'Vk0&A3H}gn~ѕ#GDslHw aeOv/$MDp L@ `\30(w rf'eQ"FW #UH ! hm,YM$]~/,azTepmy?q_ridBW.2MSz0puػ^$|l/nVF3>8KVE IkKޭ~ObiVQ(>CƩј3\)l0ZI[CT*'-_%Bo/_\Mj#OS幣ÓK,m09> arX*6(-7 "f!3D Om+jz;Y3;:ZVk3Lwmɻֺ/ӄ'H ^+{Bqo^H F z|%֓"ug7`] =wQ~PZ^YH /X>Εofm<, )H1|}1 lmۼZ‹F}iO^!P1-B8.1{ hb1؜MmGgޚX%buz32:eԟC~oLxS$ eF{+4%o9wS&bxE17>cn[Ӳܴۘ%a/V6 emUZ4er-Rr_^oG^VNr3R][:^iV^4x=EεÖɩغUXiG8*si3Aװ–eE#o޽ϱ4ߖO$ɣg6תռLJfazoQ_]ǫ!ylhR6V?ON]b;-r^~ ؄!hڱW[ahle"W8&.M3*\Bs0@U"VW <(mז4%ْv.Bfv88  j/:' K k*oKWKUx+V9-_Z/H(5:L :l)8E3 &Ĺ8/7aw@4Yddj$!`<'5vH>rwmɻՇ/0 5уEy,^<~ (\ Bp!CEլ @/xm~1Wo:7< V+BDN)qB<0ʼ{2iJgD$7 o-ҾQaQ5iGzS^I1H9?]X)*-W-_=gkbA{.a'GNKh~ /M%x&t(Xn ^%-Kb1- ŮhqR*>ZJזZ-^{76m lƭ[Z7-Nu ":DK<(Fd,%m\2huYf} ݐ"2+t <uʁSj\F+-vm *kKg}q.b+"?Ǧi6.ìZ•aB{ާz*qӃGiɟq<\CRqc&Z{Ә)\ mk3"2+r wFaF{Ҭve%&@q3HY%b~~>g }|G.V|[=yf;K6i{՜:+2UjՁ`ϢAe5-(ic=V2r,Y%{plMvd5mMiK] `iPJ%(D&d`!G|eܴ\q+9smIc.j1l m{oC_Ai$߹y B$dQJ @(e'8LtziMO˽|IJ7Dh 8s9Dub aA% lcejE4YvmUXGe+\DY,Q!;F"5?߰ P%6u#J]HT!ھʉ7q j1y' T)e9WN%(9H泛w+jeWaKϖ8/l&At EOy@i2KDN{wp4.1u$q!Iz=4-QȿWu[M'[M-Hk*knfAY&bypg~FqP\(yxU{ϪFYݕn%zM[|`R`^#df,}[?7s}ib[,^p3Ѯŀ][&bypg?[c]gYl40*Gp:ggn> $>} \L#HC7%`Yo  ''Wx8F8TZzmCVE7J\+!1ABAXw٪ޣBY9|bk~[~PUޑ\Qj[xc^Qo,o^zDg"8wjsvIב^H szDkcAu] ּh W]QB+{,{]itQ`T`GZ[x>HF@$m8k`ܦt{0 <| mh\熣ӥX䔠#qxNgS%PЏ6Ho N2̕sA{" EL,%B_?9gC$|Zn8{~> M0VXBxH Z:W| [# zFdg>tx r0#䌩gQg!^{,T47%&GݽkK&wf$T@Z=?cꏱo3{}J+ȲoKgw2TY=MjZrqqh}'1\lyD[emɻq$ݧY5AJ 2NGh28?m R?IP# 3Ģ]"/jH:ws1ZFp' @]:ײiKHOx*}E2+m1L0 95+%G襘oJex`P\K@' ¶ UëSB_Tc*;Ur~[YB 5gw(=Gw*U[KُiYi[옕(nH[ucB@ R\:k$)#sޯ)PX~dسֈMז/mk_d1xjbۆo0T C%kE*hEse=NXäʬx~` NNV#Mgwٱ-PyW^F^ז=2Ds ݅Zs+9vdShasp,Dž0q/Iج]YUh49!maú~u {ņ tߔ(KX~jk!,gem<]vE>Qș%L ]~ևGCD`@b}_ޑG:V{m$r :PGWL̶yEdV1[P,<זZ}i1;kx9WUDIOo^&g{9؄+9}=Y=F:)Ar|~g?-ɹQ22r3aeY%buz3_鑭V7ŐҋgEٴ6X;oY͑SuF$S ׭"p?R(*LےGf+t=:H"d:FYiKVE[U@PJ@Y_?Is#9˘u聉`?N/p1rUQm/5oNՋ' .T5gTF9X%.=*$$44e8 5GSYT1[݋u'O\8j܊շh>xB/8A\!=H>?Fx~~8=^ N8I!*0TguP ݴ%V/*q׿?`(aDgn/eacMFb--!{X^+\?`lS=+>oqӖ>#?u*ViVYז c=kdQ;$eCAEvOb>/),MI25,E7MPϮG)[k^hܤ٥BD%bn~H9+*^VAIG2haVF;GZc5N7'A|z.D)Zk e_Q ]w}tZ]/Lg{T&h2[<;/~;s&aq#>Rʿ'CiBS,!&d,oPT0ҹRi$ Pk6D#\fJ ~g$jZ*'!fxȺ6DK"PK~_K~a9,+ ~<_/+#hϲaX^+\g+0 U~-UUt)o@: $\ve@'2—T c/ e1RjݫU^Mm hE@Z ]G=lHr}MDWU fϵ-%ѝ_dזZb5٪Qie_EU"+c<^Tƒ)ܕD-|ۨ+zomE7֢ȊeWwZ f̊AlꬸCJ9j*HFnu SRS 0vtH1z/;7+W).} ,? 젷J }_r^9E:`]Iޱ. x$~`pW+(mUk) IrL"f7VX]/pL-,x< V|1do^{شawhT>5%m;Bw(6w8gƃ*<)`5A. *f);,-DZJQm:I> j].nX%buz3_wV3O*eĜLӔ-B(kD Ӕ+?(et,s*j-{^V\L70E^WiޯlB1z%q_לr%qոt[&b (2auk kK"sVR"K iuȇqVX]/L갘@CXR2/JLFsZJ0 Q뫘iWԢ`Ωp%O-<Y#um8~rbi'j9X!ޯZen9s*kKޭ^ o*²[gZc_igZ ͙:xKzRo޷%{u^R\[ڗZm[~_-TjkU^s[ ue:Dվ[ {N[@CXи:KfE]Y60 rW-#LlE:Tz΅A*P8R0O]XEzA) m'SN ;2H6mɻnYh\9^VE{ʗ/ݾ)yl3@$MYȥ$,][r^cJ'!!/Fz fY&%# s@ž-FM2O׉o{~bʖ/vشϟ, }[nnl" H'$=F dRx#;NY~q8ĹeSn@?ܢ!=ֲm}?oumpOLA_C!ن)Y}&V^{Xٷ4B~]SN'=We`{ uhzcmld0 ܲ)[][vn=FU"V/pK6ŠxҒ N^YR~s}7 +/ 4VWʨ-ygז ֶVWӖ 5ʻT7&08^q Vk e|6LJ? L;7Pjcb<)x9Jp="L!( H"Fbӏ)R>!#еI\+e}gL)W}} l֭|Im1Z zlΛs,Y%z~ԩZރ-@zg,Xj QAzU6y;Icw_Lwq<"VίZyɟ ÒeSזO1DLdcזn>YT#o&IQyn5 zmZ~j΄Z^/!$ A5$JȨzH$>H G$X6NCϳc5BX*:,gg{Fp15-V2aTƾ`3@M[:9KB$|dXu$ .e'&4yn.b<2RDߖz:ӱ~^3u?m r(R}; ECEán9cڏ][gYL;E䊲ǽ\ѳ#A}k׶5-`) :?-۸L"\4e_$[(+a5\lFiKΫ>e&ՐgٳxjiHQ{2.z+]z>~0gfyrrg&bne\=1 fƩVYk`2'DPx&VɏW*ɘ-1[Fzr*μvf_吳{-SWpgVxSٙ w;kR tqkc-_4<*Y0)blK崲K,uU"VW wp U[g?Jb\a?/PFs1! .ٜ*hg~w/9Wcϫ\Gi^T$29B_ϟ'Nmg\fyEilg;hWPPnXci# YBZ1?"]Dfl­z³]/MF L+Y&by}w[VV4 횇VUuEC?S{DH8&?Z7.o}t@Wtm t+tz⁙C'fkn!0}Q$Sx̯'CB*T[9&?YݏUVx7ϟOAIc=iMCI!Iݜf5m/X*]w{cDmOS/՘!J#2 n,1 9nLLbU O<#'A@1HV3ɱt~{7d'g fTk_N̍^lc~jA {NTU3=6-6pHoU wfrQs",R+hX=|-N+X|,1TK81I`cvճ gC\uLzԇ#%btE1ΗI<]G^z'SzV}Eyhoe x&+q;%VO{r /y0~(yr(*W]%_eOIRMF]/pL' ϒ%ѣGA:z$ %oŖ \:Մ,f ZQE똞~;}z`įj8x DBr0_G v !_4蝆#O]ck(Yq "O*CCs].+mi8Rߖ4RWs4)um j_Ey 47ؾL}no^W#GB)I!u%Wbl Noɣ+{}c E@3NapWu}ݙ{BgxPt>7P`UYH#Gh$7l"D Ob;Idpsq-TbK_"S[- ԝ ]O~oH{5g{3 hߔ!7,zWp}+HBhE`c?_/[HWB7յ$*%!vVu=r+Xi.[e(I7CšV)_77۾Zזi@\cǸے +Iр*YfWwK~>2Y4q_f/gXj]{.iqx9aCX<@$(7Eu2"z3q +D8+ QXs6gvˍH,V;Um9 ~yҝ=SM\|mS/Ne7_(v )d-m<}x+"3pL]9U3ǒ"PqA'kŤ({&] sn/1 e *wm Iq: h]YeXt߉HߘuN}HߗM+5wh^-_geӛYxhZ{o2UAn᫿u(˞jcywm ج=f.t"U-,ZcaPWeS8:L ]~k=p񽟜MEFN=A.$]kZS"z8^u;!8DH8&~26&frלIF U o~jUĉXca#chsFоz\hW,bڢ֫K<NG5m l Uȵ%JJi#X@Y>d`X􈱍xo8X q z ˕m\-ꀙ Qb_q}iK|=~JoyTYߖ/cfg@87RB eoL~_B`)y|ʈM5z$+~rCFk IC>b V{F#E+gnBڒw{!dj\[?\'0~F:GTlA;"GF}ػ}pOCb -MDVŐG>#ot.Y/&/dwKnđI4>+Bؕty]V2J ~g?!Xg!'$Kv"okY@OgJHjd%6gC IGk-\k,0 ܪQ/&%u{H%*RfC[Nx8do/u/607%m IsֈT`~cNLZSn}~e%uKԫoKf]X$h֞KrM `ι+b3lZ\[箾RX$J*mSӧTNjvIΉh$4'G}WŔb>G|lh@phAT۽m 2:V狁t&}DbO^JHuYL@<0B\>b. )c"4)} `"Q= Z$pa7hn+(#stzs['0!Χ\hr'@ |t:L~uVR0o{7V(s$[~CļStW`A7ogT~sum K^8BBʑ+\4Ms/:KG:? (6>R:Pt+^=Z }\BG_ќRbZ("~AwXf!"% lLhΦC@'*겣1oRq%٦doM((*=u_ YﵿxDPx&_3 2bIyFK*Xx&S`0)Qd ,MX4T>7ǽ^G?/{ć9yBP tPtv)g4'#8ܷ%shMcm}iKG{K}H,a-`H^8"CRPo8?i;Dx5T{+bTWm3_$Ur}[n5]fd4^\/tmɻ|YŻ|ycS_ˬm{%,ίCOȶC EZr,% @e \bbL#wrF:m}]=~y"H/N(f8al.6Є! L: +\m(M\L8(j ,O. ٔ}[nh^)h)* UQ)m۟'ܴ%`i>2c-T-_}!kLζ'q=#FՁ!y.tY*c-b~5ac+,S#80)sO4 $y)/f}mҦ-_?^\ѷ%S+4BLzBQTJ^o^Ӗ/ߕ82zMwkKWgM_iG[#K*[xCKj\c*F랍M[n:/=iX*:uY+soK-?_OJceAPn%vh"9['6m 0czoʧ)W[f;ܴ%Ϗ$p tAWZX=sJ@, nJe"W x&se:午ܤp1Ylr?0ID2ԏߔ!% [߽_Lp}O{X<ݏԞy?25IN_bU@/JH4B[/+!)5eR >;;?|\5ZTV<Ȧ-_]4%$h2+rCGJg04m ܴXv'_u4gߓGc0/8RFo`2+t </iFt**Rf*\ u~cn}9BPH{ms b"++3p $PFcUyR(}][z Qz/˽4Q#Da 9 =܋)^&PU&r~ !N߹ɞ׃lxeU~ w>-yړm?KWYfӔ~mF2CKېo}+0is:smHr(COB3NLUr?z2zSݶ9w̓o=O"NOu #Ol}Ӗ%-2l=&>%u,;CQK>nY[>a}1oف sïp=Z>ۦ^z=VKXXԌDH,M)vRSp1H Fu F@rMiwonJ-V1@;"Gz{ן5wuωBh"~5ыɋ|uo۞^/m֜ZzڒwٵLl .rftrq#3Ub~ A>KZ>S}C>6\j3J TttaBC )/%(hG~YE;Ʋu B}_%SIu46G˲D֮*҇%9N:ii)gr؎"o(ykɋT2Ӕ_䬇+8 , UR6h?}QL6^+dYЕ6Ժ8CA-yJ9#40y*bvs%PR- G7FJXEOqV1c;{߮-ZaB1V.1\j%N ?w\0R!I\g!~rP}+u_&µ n;U]c4 7JhtE_^6nymdW,}\rhMv8VXz3Ż?TZ`ElWT#N9r?(PcQR @),"/-ɩ:!1[-g>Yk1+~5 ꂡBB_/pRٗC(2Y2x,~̲?ϔ2$y+ջ%prG R ~ !CCOE hd §|u?{YJbMHm [ ᘜ[љcu@l SN58N -.L/2NLl/V:9Gs*E{Kl{^,-77z\.+Ѳs I.".r.Z߰.J}_uT$vݽHjjFvj; -l݆i.R%uX8GIv|+[)5C5exO~~7xeAVfErwEv׬y"#ь!Xg κ4x R$qU1S(8p }Fٗͽ\pJ2?;(!nVߴuGu۳tXBj:~g4wS O^,${ V!wKCopc%6n-i)_<\OB$A1*z#JL/2=dF̜dP"7|r1 Vl>$X^AI瘘e+wlڑhR  o5޵%V^IDޚmx^rmڜ'5x|{-O势+C ז>}a*zd[!lזZ}Ȍ25#!rcWHɍ԰5O^,6ckڒw/0/fa+LZӄh6phimhk,2ۣ+Z,V'M,z%Q[9B[w&TT@DV/L{ه` Ê2-VP5pݻa~`Јf@ߗwʣ?":Ei3$[%bOQ1܄sHѲaR t 0găW*ìrO/R3yu-ہmQY%ڒwS#N3s =ݽ5WSZ {bнCR~=Uut<,ֵ%"BW'uyE&Bb;d)ӹmJZ7Mlh̜3J(~)(QĹ*P$P-Y`:m5 2(s}x.Iy[y{4ɦ-_= b7pfY%醆zzW¤+ֳPΜDk.6T皡4(eXyr=f fbkXT')꘯Aq+ADJEt_rW9>siKWѬ"j~~)][d٪t2Z*X˰EU/:OE"d &B VzC`N5e qڒwLYb7%#~uDk0wzxyT/pfe8xv- |d#r]?M eEtpt pyWNU$!ezE9툖XcVV'}CH귭v%*Xx&sZt7OMX)R|P"~Eʵ3ɽ]ܴ@qqcPLP+ᙘkcd8G3j?fiHFD ?zGbQx0wq{~E3y1S 1)/c嘆J ~g~4H,oVMP{y嗯s7'ѵ{6$\٪Pfzo v̸Lı *`ypg?[{z Zl/K&b%P g$J ~g?\&S9C|:4? EkqSeU*QY_Y%buz3_V쀉Я%gT{8F`oB &irqcr럶";\6᤬PJswhH:!jNBԜ~ԥo:m.kѴ%1bx-dBnMs,}4,W1 ObN!<)[P06-o9IޥΜ*8H48Kw[Jg |Spk\V>v mSO@zh%-׉L2nw_Orъ~Y|8N!֝~OVE(ww^¨2bŝr#&<1CgEYejh7m -y.H;Mɍe6D Bj,iޓyw:|8ޑZ nvhFw`zGyx2b5"/TJ׽>8E!Rn1njm Y閴m(>a)?,sCĜQ@3iKޭznW!wU+yŪgzOSN!z3m-Գ$yP(0@/<B. Pw|A =\Ўt;sϡ aJ*u SO4 {jW숑V:B^?+= a b'KuŊ\U :޻eJ$Ƶ%IDy mvf>Ǫxq?¶C>Y=cey}R.8D,.pLޭJ+SDBoHЂ+;45G#֟"^aɄ.cI&YI- ظd"+K!jܵ\~] PhӖ6Pjro@mD&H߇ivJ/em@K*KGIe rv33Z$I}2@e\ѧ[XٳŴ}W~#a"XL|mNG2fDŽИuhM! NsM)-XOD“ꘟ)ݴ%𳘸|ʜċ2- Ýܵ%V(/LS==M;nj8L6V[&MqY \PG ~sk>Y.2 9{G,fѮ4$g)ĜY%bD+㞭nBVOak[}[? q*‰|%#-Z΋)/_ Fk! 0h6/,dM[?* =gٟn݉zFD2_}YdWN p]6J( Bf|k%1)u.x6:tg7m՝ɮX UJ\ĴEϡן;> 4m =ҵ\Gk;_Ϭ/۴MY߾|>%t)}u\[l=?Tk#`ȶP^Kn f4+:SpQ uH}vE,Gpz+D WHJ^2n&C1&\L%6۱_s_"rYzMpk StT$nH7m2ڽjIf6~kejGDRH=Aܯ{C t|.K U޷N-C'mފB_oI-9` QYZmB?@:z);Q٤ΐrݳnJ;9*B%/nZ%Hšh 9?C`ES"EMzq]3=Qzޏg_ =H5ҙH{Rο$B(m[w""_-;; sfR "&A-!~+ r]sz$ޕ>Xh͂{Er%=yWrC84 N0СJ5h\}me0SFn@F -kE~K )lgݫ23_c+dr(!%"pu=}6~2ڳ>EY`Gƒx-%iu($rHqe2Y )6XE^nhR4q9=6#"|}6MI=Ym})LO?\{fνap"tH (If$:lc\*t%I1ovݝ$)uJzIoR IW ϟRとhunX4[muo" xFOw&`Mp7oS/#4%MC,LjX\XYh̐ \eL=[ &ۗgJYރ ʀ4N酸ePT4OM[y ϭ1˗˗ny4c0"o3s EG ʎ_ih7[h7=0xkCPU40E7yB{5!٦-_;hgWL&?$v }~b^豘HCu$}sɄ8Y-}wrDWz3')*qδwK=މ~oz:H\}p-˅zHw/W{bgl]֔-xYA yY[>WmA0;֋buKEL,EBX,c=J )㏉0FG<#%x2jﲟʊ=K5c|wHD@=93~D} nfm 9Ɂ;\f-DH*6R%%e_tҤ;J*=g;JX1 k~$؍B1hzwJ%5SC'I3:Fwʏ؟V蔀R)U[Eo;ڷ:z{TtPZuNU V^j _SETUDE'Q^dCJKʺ1}%.Y]ahIS3ܫ{#}V3֯cxOl"Oͥw?mk}o*~nUH@,' Re9fxJQ!(A: S`,is51ݳiSTf C4ẳ<+dwwiw}U-+ZcDkƽ{TX\UiiUjQQ#(;cjd!t\qۯv6XEbeb,B)_A^ *b[/23_AOBTc28wxȺGI^,8Dփ-)2 c\!G*p#mm ϼyÖY"9L4EԍEW=X6g< .Af"-\1/23_{,I~Τwoy#@~}L̚mi3Ogi|XϜO%KL,Yp['8XJ;,RrHzO=Tofj>hU`Ϧxe'_J蝞_?`Jm46I=Ư^n/ͧ?%'%TLY2&=EZ+R.g|Y܊6XNzG^vF\Vn ͤ򎙮H[H%C}"QB4[z[T˜eI2K'I>Bѹ-XV8z5Ϟr,*ggtYKT*>|*=gjue⬙"ÆE .oaeܴ.?)Gg HW Vܐo=HiKCմES+dB",'֖ *WHGض~zFw^M'b5f#Am/da\!+FBt|tTr hitrlSIU;`Up3_ 4җl/9'zﴱ{H {ߗo9|߀uZ'D}[i;!7wح±N:|8?7??`0xUk{~_5<>Y DVY;AX>2݃-㌦$x?R*6ϕT.a^[s(6MeT Bg]p//T=y 'S{jm"WE·T5bdע5/GSCٴEK)KQ Lv1]9K]bb.`%rPF(>h BF_#F>))ͧ)LoQh;/.EqLܺUM=GٿXI Xy#iw˳{O_qL%Hn"]w:foO5mbN֌9Y+|l%7|jL*I`*=g?Ð"'M?ƥL:8o"1 8Fps= (;_+QZEmj4h\਱*1vD/-$neɱdZ}K3N [~U0} (Ы^Go3A97?w^H6}hHz+&f_9k۶~u z)/{yM6ed"}j0^QIRIv~i '}u-WVMYشEVcT`!:-m }6t.ȴ_|N - 4m?m)A{ZsH94b@}IT'tZDPVu9;Zė2ry[e"H(}IDӱ7fo L6_f5rL:vt1yy'@<qp?ah9GH'9L9k蝂#dMl* xzx^KTHNG`ڻUݥNt``#ub b#6H0=&{Nܾf'%gb{։+D xՇ6E=IK.mI[-Ǭ`S1)k.,TS-Ξ0~5>Y9o}q8FFsJYguh2{M[?3:׼mF|u5o_;z=sqځ_[H V`.X3Gc?J֖e%mp; `= \t%J$Jw0xh^SDN9W:+6m|(]ɷJ)ZxMt+: @ © yS6;;@_)k®9s{U`ƛp%Rժ0h) $sGV+cQ1[C CB;0t] [uqX_ᖩ K`ِ4iMHR4TH4BMHI+I0=$ fY,&ʐ7}v-0G\ue+FNhZ蝩l\ݒޗشE쿫,%FiWgw&S(m_Db$Nj4EKygr*}7e]0`#yIπ#}< /*،*zI\:|#0 I.]S^EXduL$Z2mMS43 ُ,n% 1*c.,!]Gr;شqP%2AZ&F**0B8'=>++4@Ni ܉js&Ժʸ GF2\D e< S(<'9Ȓ-z>J? x$PNj,GTR"c%xFN,VN/V^TI,)e5il))^hH #;퐰iJ"3F$+e 9Tݠ&ƬU$V{~5_IeNnۛG=r`N}Fm)͞PR""u9c?sT,-9wYr%/9˻|5mY ɂI(%}DڄSӝetVJԱEiY5۵+KcsQmkep]!g?tE-uV{j"efǶ]Oˑ(oXF.&:D6]Gq/t.J# =%Q vs7~jeX3A++\UD&[&êt/ige,u=$JTSް99~Qo~I,+i-Nˢ* ^8iݦYڑNw[OpL#q0m'ݚ,J>{+6miVuY0jۼ 鷖SR4=q %{2:t܅6䂅⠡cP/}:񯜵l&LL0>an(I.; %{)8{{'34e R Uy) = +}6WOp~$\Ϊ|wV?L.乀N.?/{'l@uh9 ~_}};sMh@QZϕ_Iժ6~o(ly7!Q8/B8e'I7k.3^\YXk"e+Eչ+0ˣXgߴEwkʭKYcg5صީb2g:rߦN"9cPs]tyǂ+ y[t%m-o$f# *l&\9_ udҀxQ,` _:KR";&G&.SOp\nd,me+V7WܬzZ=g]\~K~%8\!bmSjԕ 9!'W9Mkbmc;s岻j-Zjq|QPq9R6ܜq'rdZ'|+P>vVVi'hҝ۝jUzH|g}Yi?CRXÏ{B֥E!mH34;.@##>~"B_ /T׆\WKH\qRz&L>kqpJwyu܊~Ht-a $z.%I'5)Q<spScU}PGq@ 11^gȫO}bm6D *qʀ]]ϹF71n&XǝM%F}UoEb<}pfNH%9 LL֯j+WHka]RASvKpQmcn+Pu7ϏWm #'4zqwqmpF iBUi]vSJ.r$?"Et%]M^\:2R)zH, <#U^TO/!'%VxFqHWu<]7#`\\ީ̌- tf/Jso|L3w ܡi~FoO"9}堇fw2K8F֍O +jo^Px-_ [J(@(Pz$K_%˩5b$ BˡQEI{1UĘ\04}5m"G{~BCO ;pr>fXj0{xcF=Gضh>p:6"|L,9t W@wB:ʒc19<+*ʐ?~xtMjO{MJŭ igj)lٺhxX-٠7CZ,@+d"8bΫP e>mX)/dǔq_L,!@RjGʼԏP#C%o2T^ $91*(*+[\RZ5Y= ɟx>׽F3h\}m]& +Lr*5;Wy <ꟼmJNf+<ąmlH@_Amǂg5eF$\, pyt\l+w?WwKxF'hzf3U:-})˘ hQMw0]5m|{kb/R(_ 0,J_Be$f>x}SZFB].E+#Z-o^lylPa_˘.)-9fm9}miwtWNә6ka4w'F{q#tO[Jzv& 6d^/p;<?4[`fnOŶmbƺ.BE sFU܋)"ah>UXkn<0bhDZ'ڰEM $ܓ";­l)م}KScQpt/Z/5Wzy{kZϧBm QQDy"V.p X(̮wkR2B~&,f:5 d٪{H/JtAK(6)4]"x}zV,op&HPJGr)ͲԔ$ 21XxF&%O_t4iqf5^鑜y}[)ܮ)mYӴwaMByk!J#t*市@%hj6tb'2H$q-40^IBϮq" Bj2 D cgUfje$uUץʀ~PYmjnϏH |-0~jϒK-% XmMiN+[UO}ϞSs3f&2rJ ^6ۚPiY$fauh}|HP$$O"$蛅I~s_=w҂ޗן$GX3! U, -_Z_^3t편y@~EYD&(tW"@-zٳ Q`&F\4@p$!'rO/hq&q51\>odǽ{YdшԖ"IĴtG9ܠӱѼ|kJluMzXsce8 'dNܰ*2}Z,2mXl|/Bŧ#ixS2bw9ҿK04F^*z&-ilTJO^,B^,O˺ّꈥMijё8ڴEV:һ2*LN۶~Rw=ܲi-O *"dXwVyzjNݑ;f0,YoXf#YnVu ڸ>lp|)R_X}L޽\yF}S!%N]O+ӚN+Wt" xFVk=3][+~ޕlm"ڸz/pWKE@jbZV 9T}:{k{(ᙯ9n0 8{+g|Dm+ 2reR'y^P ,}Ww}4| 93f 9c| T%j6z Qw\!g Lui\'G˙"iғeYHƆutڿ1unp\}\V~-go*_mVLkǞ )-jh0apc7CYV!{Ơk 5z9ȟ"0f.|*=g?40_=!\ g4L`Up3R=S)MJ_dM9Zd"M3 ] HYeoB"yxkZ^*bL4'C=*$?hH1'm1Yt"{nsl,?+C9ztavDY#CuX q`/^9'XU`]S-/eoQ1x*.w*gI]ϒž"/\c*0:[#XXl6r ʷ+3x!a"%R$؏c? ?+ 6E08zdXgؓ|DLv,I)A5 1p!_[r*o}uEfʵ.֡qB`ϮeRuVXW<#ٍ3X g8'wF\jQ`\5-y-7j sh7%C<lLYuA+:PpKtz/U$V{~1^;ջݽ iHɢ׌uOPQsZB2{5h<]ıO~%wc=c=GgUW&+]GJE& @P'г_VBd`ϩ;AsKާVxF*Rp0d;cA?$Qt}ÒդL[LuVKT>dH ӏOQd x t| ޮJIS%dh?#4~$boۢug>LLޯEΒG.i̟rW$Fe򘯣h5D>>RTeS! I)kǚbg,# +KtMS>BT^Ʀ E";zvWn/X3%wknQ鮂KU* !@K>qGEY~m?cMGHcZRnK;s T (sj.fZsg0E9O;~l;-Pr%{}$he{Doݒn4_$ 8JmsHOLx,7bSL@b1U 3R.ܶ,Ӊ HIlYuH}>h~ cUp3۵|ٸ|iƩ #'#[r"[૶ Ɔ #B`qcl@Z{yt2*r:|G^eq?Z۴ELFAPff`ܴEVy}9τ{~5餱B TGU|0J2kq<xgn6x^|V(R2GM"h_EkmՕ^i+s(:5w~ަhR͹I6).p<'JD7 [ͩXFb\Wu5'NK˴}]*j|?Uτ1\nj_g6:#Y4EJ$ܵ!Mh 1</x\ͻ_if®UKf,*=g?;'Ƚ>_SI+{|2VHg2Vm; cD%ixyV_v1_!WOLL}e>#l$vK%Ť()|4@6 <Ϲ6Ed欖>OٸĪB{SŤfÈrWWǫȸrBs'YEb=g?& (dgM/r?=< < >Bs_ʋȓhڲ^6]W qf(fozOHٙGJDg9CМU NTu?I*1E FR&T}7mjiϰ %W`Fr*?k@˸\/hѐE uY7գtXq:4>p`- a f^<4[zZ _XLT&ϯEH, <#iNHc;B&G(ǧGHMצg mN5?)hiCKk.p^Bgǻmb/BA{ %^i@Pee =S հ;%a |*QhδiS#׌ikl&)p 8/ch%phxA~S9{hid[/xe+e*$D k:SD&KwR}͔+݋ ۶~[3)!w Tƹ2W^@:s2ǕgN3 ~ut@r7wBױ"I0&:*%i;yQ)Ж&޴EVaϋWPM-_ڵE'ums_%-d_5 Toep]!g?ǡd@Lهm399z[2k߷> (3esϹJ+U$V{~;䰱HX:2BqP[4uuBj 'wNyչ9Cߞ9~׸oz"dzLfؖcKJLL!+Ik*=g?;}YRtDB)Vcmw_>AI shr34y-zW)ɳ̉X2`c {kY~d]4d*+xpiXz(%A7 N(Qt_^%̴H8EmpmJP%\){V^"5FkU8[$Ս*V)+J\%{`*DKͨ]gJD/4([Vo U%co13iP '|;#s\ҘFؓ0$:3YƜ )?6eP{jVe00CW#ucII  N q`=}[?ՍzDLE2Sƻe6?'Z_׷E𫑙1aU8reIޏGcJ[8s .)Hz61-_|,{G !3?N-|eeq9ԔmM\;6^?VZW6m Ьa `MgvCg3k[kU| m;YM S$!yO%rv=kcBP3f~2GXFx%;ʞ}GC S .Z>B@!oF`jW7Iܞu]Kg(jt2,"ェQ_,Xyis5ǴO.nwD.?М`: ctu,:HBz9fA-@#`Tٖ$`Hs~S eb"RIzϠ:z@E*ΝG+w2/xzw:$ՁL!!9g kUp3Z--vL; jcͪ*nش{~6,`g"s"()3;~F[aI6ʵG̅˜do3w!@z5_BҲu^ ^;2fAX M6@}dM,_39ē@L(X25L nrR;ъ2 d "h$QB0"DFP= 7nMVyH*Vw ։#?K^ixAqb-ifWfؙ ,# +g·[*`J2o'a '߅%R 7}oRim|e-W-LjdBcҷ\ M[FN%ڥtǓGϞOk#$v{TD@'"y6\ED)ֳ dF$ae a6PÚbH<1諫i5 _U~ĸ}ӏƊșKkZ^5~ɒv&He.[2RNpEJo: nFÕyT+Lt"" +FƦb<*閪wP|xUajR\} GئZk$-fI];bDo+l`Q˹T ca/ vNA,6Vמ2=^+s}`HBD"[$IJt]S>ygzK #1 8FpX,gɄ cDB4;i_?58Y+Bg:Ggdm+L|2-T2~SqXMrHɶEKG3[t"ϨpZWNJQuy.Kj,KVȜMuG L(Sg73+je%+ТbRܾ4٤22( $ǽb$ |dL}y!_qN5F/a(ҟ7FEIaq4|*3(U$VyhݪU~jREvlU$VxFsdM*j9> R'zA˙^fG2V[JAKNmz4JY:ޮY*o;@9_YF5aɬ DKk3f,?a+DIuIfJ= D" 0'ziz:w7m[=}kb#oWM[nu ]HVjSIb ~=.ZdE0e.^<ƒKvmp\_ce'=]G,eRkfô_T /.r_nv͹&8z4dqKXE^蝖:Ȗ#S,T-v>b+ֹlPbp5mŖ׃-L`)G>kcυͫc,#pU @tu6/X¸s\PKqRv{f^qJAFi|O?Yt KvmѺ`|%DRaRN/Y4IJW5-R0RDJMeP2J<}%,ˀHPԣBLģ3'Lѧ IS>d/Aa9At P%YRu3w5!VҥISkh8x[1J5`[&_'e,IMK5K=Rq6q$d 'c&45 ,Nܕ=7ndcGtHsR7Pgixf">=ޫgyj"WG yk=mޘ)W},=,!/g L( ewNp5#ڴEo͖ڞf0:y!6Z8Es8{\7L[<wX;BRD`$OZeW> + k_9"g!'z`$(BC'0 ()Q%r2r0?YmѺU#Yht:vEyG؂7\:Ke³ș{}5onxhYT. By@nƯn:8Z7~ֈ}{Jr>D7QZQ[)[ۢu3OTώx]{&&Yn"a2LۣކoX b>cB &Tf "5|9mY0髣-ciˉ*ziqsDy3 7#<>Yy g.Q(E¯K|x)~933oHe$u 㔇zjE7mR`@P'xF|U^YKx~F5tZ3igr۠FAuS ޼R> f$Vkngk\ӴE+8)S-o,2 837mnʑ3Ȩc9eO]7n_2]{-[|z'su\YA՟5#wmE!BTZYWc=G 8VUT Εzy 6 LɣPHCT@z-_ yO_Wr"+&MZsbbk)iWaR_nC4뽫N]S0ek,hDPּtNlֽ'|*Yӥ~esOȠ a}8ރO-k=Aフo=9%O9")k=ZmgOȠCGO u_bt9"s\3OO=1^i ^i -߻iPYOWH-_}aǪD/bN{2ɘ% cs$BrtKA:d }= Oo+u-OIGP/߶2bzUG3P~,b5~ժgsbٶ{ջy?a>Rv&~)i,E'U03`(UV="ߕW:>xF7}ӽϳ g  .ݱm5ҹ#f4hKvQ/$86FOճpb A*FUĥpt -w-C Msrz{zhz|ZKHrju/*9>U ~Jɔ?5x.m֭%F`q[ޞަ^ԿCJfR7 ywG6n$ctPTO @eSEԲU!]~,_X~riCIÃ7!T)4D}BO19;Yp2_a]eٲ68$hxE69Z~m'eT\} Xt/UvI{y_RC5Vb\e$sѺ9C~#h9TQ)g,oRRd{d#ukL?)𵵻,mir4ٶh4iRz[muW{Z9;XKybFk}w ]{i;j5oyK}:2-&D !dDnBCe\dL -[̲6 ei9v{_9rQ# }J9Eb<}p})POi <%TZH6o"{gߦ!}i7,]Z%X&o!8~>lѠ}B^|O5/*cqVHY={#`\Wi){Zj6#~ aJBz"&= |Gum^AsÇOjׂ68+G1||'hGy IaBvB#M" LIZ-i5-yC?csиDhgҰZXNJ-k!S/JH_,=Hle\L[*tXnC5[{._ztr?r G46ckjo$LhIߧt"/yF1v=_sŁ`SmiO.# >8ɱv=tZ`q8}{^>Fgb^JFWme:U6/Xxm579 j]_]!@ujB;K&D֡{MNn\XFbB~O׃)/3lXgıܬ"MHɸ!rW+)ƽXv>bomRsPΏhK$`dؚ&~Ca>wjf ap53p6u~s>W,AC9k٩! qV"HF,Jq6CqnKx?5I10v[ y!7^j:NCR/-"MKxᝍ=&D#,}Y.vKւ;سJVflXXP SV1P ML6/vi>` 9u qڂ)H<%%70" 4HөG%Sgb\r2+1 @g} .m)3Ppmߜ^3͚dq^qՇ >Vh.W&rn>~zi|/^} #j^#[~Zml+˽x_AP>RYDLNoW/8s)S :;'1|2mwJS½y?Fy³]dҷE}2zv$x{zurNܗc͋qn,no9eφ9N8AZZ6@%!atr#s |ؔjퟌޒY)J|մEVg^cιXI6mt`"_qgʱURf6XFbB~f^ ˓es`d#zGjd<~̙w3~~OjXFHLaAfAP)ϴ_.Ѯk a紌w{횁Fue2>"  ϥhFnw{#~)U6Ube)<,\v& [ ;@Ұ{eǙi:%t#8eAj|Mgg?}=Xg`^eTGs9ȝ igf۹]yCP*{oPB_V0V2*Z2σΤ "G==0e^㮝5 6}!{[/ŵ=a&br]豞8B<{9I U Ra);kS A`ڜDdrD.'lphhOKBXzA}s7څ[ ѣ:5XEy8<8QPsoHU}2cYSxBy,Y~,aXRXq<=6)s_TDϙ54`2>jzH ]p'^i﨟mVk٫q< X~`rȫL a~2Ѕ)[:կ, nc%=9x~B;H4eOOXHcѺcw Vd. 6vUlO5Wwi/;^ 8TSɼ=Dg|W\%vح Zm*9u}&elئriXo@W;Z("ޮlr g26 #?FDI6ǽi=!jkX(o/hΌbzC̀}VBe%T֓c["9 9-\g߻bpx!d×e_}IW "*\ԋ#9qbO{X*6ErA4vs 6)MOұKe+}O|{{R3rp;_2Hߚ~y%Մ@硊?I=MGz~[.a7 -D+?$39m95L-&jB@Skґt8=`DAQ$ϽaiC5,dDA,\蝆BfS}?kϯVvM:od'!Od}Sh7u4 kc @[Voa1򻧥` ig& C|y7Lv"{Ux7s3j!yV,f|GhX,E?K.ĥ:^J. (3R`FӦߖu-"j" xFO(Ʈb(Xt+ѷа=e0kY0sJ9FEj/[*y_~`JԒir@m]*ZO.EL\ *\+bxւBˑo]W+kNMlnf+f~@xQoAG4D%O=w0!T+*cW:?}&c7rn_?/9eSD`_U$*VX1r<#*ߥ(Jڼ?G%:eA-UiCm"1t/Zx?o[*@i.=L#VxF<-#>Z}Yȕ}|\?Z})F Kgaspٴ<$.VaY~޴E Zʇi1uQWZӑ^=67+!?_;4os!0@?&_%!4/ph,*KږȜZ)kB5]Pw\ӥ%D-ұ/M.q"mdrVKxB2C6tp?/iw:ͻ8K 8lH+q;NZ髷"[@&m_[W^i# A޽5_ZzfICG#:@"1R*dS!1RUr)&5v]5mx R1ri!f O֫HbKiLo>x&B=YT^P_WF#n&jWl"+uHQtk! 7jՓhJ)=%KxqΎTDdDP!줩))W2q*uspHHL ;;RHR*2}G+?)n|}q1-.1:.՚{+c#/W\y"/SLO 8ǷMJo֜uuB+IZh{.DӒ_U:JAiWS:Bƻ5iV7w|G@|ĂG ?9^Qw$ad\˅p%%]$%sbd+y%MRTL_3S" rC )"g"KAƌ. ۦ9ӞN?0GcG7?dz9@?cQaG`F'Q?N7b4Hny|ػ7JFL1Q'BbU/abø?ӻ?o2ڙ%X< E>1"t1\}!LFh JRmhMv2>P镟luPza r^c% ;ZN5\Z֯x"%:m mF^8a%YSW__YH][zW09]qiT8m HP̄K$4YW!k4T)ʾ-Y3nLFDߌJ0|Wd#uҟT04!Xn0sa(9Q=yq`ԌQ9M#6\Ěi:\[t]L7+~mp 8f@Ynj3i>^d<5oE*<<Ě/FFA8Q<,nmBrVKʱ f'u:k+acҢci+n:7Tf~SwB>*{k\)>F5@v{eiGQܸcvFNg5,Tu?]7*rYyGѣ$_9S"q`hmW W^-毨?WEoe¸G|ԯT:~FQjxvoKۛjtE5YF^1ҷX3'.@һܪ1Ve9RH7HtI}dBތU$V{-l9oQXE.=0ySUd-?;qR[I۸woaFnj@AB#k/*;#UL +d£;{b5_Q Yo<9Zye^hx*VR%p7GM[&䉁 2F Xj?dMsm(rqMo[IޓҞj4:բp('ğ- $߽~ޗbyQY:lp3cƝ H 4۞M~e={M[גgO:jogCX{DPܙ\6c\+pm3@y9ziYG,)3QNy/0ZF4 +g`0Aq[fC26+_<#oOJ 2=UJiiP.S ZJgu3R2Dce|q;H¤olT×&qbbp]raIb-['.̹I ea n9:4UtfRTrʱE)&rzFJ9H?L57i[52=]TB}[뫾G򻛾6&|)#`'U;cstY+ކhZ&ׂBjM-CJ1x( D?NH@NfnZ*bdS)% D6,Ydx(鋇G2GA hfX91",=??hV0+|&.l&)(򥠚] Y&`(`$w{ʋ>Z)$+IQ(Qkŀ'l[j/܊z%kyشE{Ob3۶EN%ߒS1ldڢu=i[JO/i֭޸"L.7~啠M[ z'N-_a`a\Y 1:r uQf g!vοHn(EbdF(7 a([ r#Q .O.  B&:|XKMĥ_H)ƽ]?}峌Mʘimk:`sHXb& ̠a:.Dml )eT4._U*p%>wzDB:@1l".L2ן)yQJєm9U$V{~6A^A V / : Du"YSNCU$VxF"PXEk6W"Wq PDX#-Z7nӅiE)E]~1jF4:yɐ)P9-0:wٯ@Jc|42$`S2?owwQUI3J8j=ɣwߘdSТqȪ y9SiD{SًA Xy R''[ik\y;c hVռ {9/z:thhZ-r{3aDC_:Fpǂ `<,?ꯧ/Qh(lu[mWd5;kJSoAkZZ{}8ZB{8NOa1$XTzRjJM`(Kv U vK8QjVy%+/Lb=n־j`W~WЋL56voU>ϰ`|j6RY&X FX~:mcg1Rfh"Q IܰP &˰dW3]v?"* n4<5 ^+S7HXqw6oJL%0d< ~*^9k$!ς-14gյGvT?c Uh0 I8a >UrXr@;3J!m,Qe}Amʩ8B,{6g|0;(r}B}WL ?(zɻ_@,=c-PMKZuⓐJKrNcRE9)AS: E8]z 1@`  daO.uX~dpN:Fn<ٳ6r>HX꟨Y1v5A<~WhDLDG2] x2 25kqtۘs'm)Do *_3,y-Vmޚf_ebJ=P4f"^_3QNKq b69;B`G'Xztlf]lH؎EBp <&5tv 9p  »AA"I >u)^Xz{zUU8Kqyv`Qh^<'%-Ɗ{d+l/RKӬc}12qG"bbn<2ڙq:oSRa<3^h-Sv/҉K;IO 5ok&5-EVK$SH1=)Gɔ? PLFhL g12}d1 ԵV5oFϞ;9XIbBVx)FdȾʺYZs:1~ )"4'lԾ?{N$!z0Pa#/}R>M1P'Xr|BT4zP`XS<~l7GTl7Om`Sb`s`LwEꮱ뮥.XvD: h? U/@+UpӴv c+&i<ؽOHm 0j`WVR@ĶYIӜVͳ*M2#mE)Z4E>g;J;0X*HCO]PMҫ%Z6ȋ0%1X臙t{)h醙|puqlDDU2xD#Dz4~x ?6\ñ|`@`*W@dVF0$̰ƫMfˤ0o#Њ_fsaX9撒J":DUߧs_1|zΔt~߁!w*8]ne 4]/ȧT}K_cǻl豣6C$Gɳ #0WQ[@-!sM%TUЎ\j`W~UKBՔ@иn>߱HB ALh  P֬}9!yJ ?G(V7.P ׸X= i[uTWi] ]%O1(A\ѓ =4nンvͻtMXFO0ogR2cfc[x:+~fnnK;b,=exGE)(zlǔ%x!a 0?8^ũ/Sd"Spç9<;1ֵ{8pq׾!\:",jָSQD dol C0v[g,x*Xv1߅i~$Y?){ӓrӳK.<|Z% yp̖ŽGC@vzL;Kio_<2mHhh~ܙGY Bc?ėGTLatw`y `#{8r孝0m̢=?A(#<,PMX'"/4MCa=2kܞ^cuWi`Z׳i`W~W8܏#X_ʳ mWmbwXktîS"^1_дykV>C}"Iv A#JtKPdrWC4 "e'2gcH35Xf_; hƟu$1-Tz(.S1r dA qv? FԱDrH JRGks^u,22_oC4Z`gBk F@XbϷ[JQAu qw*<@2ܪH>ŤiwA3]LqE^TÚ6v劑<Ԡ#xɃy/mݭfxzǺcNs>$FȘ^Z< Z|Tzi;=am-)"m.) ;*AT%3 ݰEDKÏ!Ѝ0Ocb%b=2j{ȉ54|ߴy+cg1ԹE$6v!^BK q>#:ɃU&QD%LGID+%9ʺpvCAO8ّyTs}CX5Ԓur\)G?*}.g㮷==d WPaZM X;oI{&T [PBkfc^0`=>==];{CZJ([)FP6 F:Hk"lSn8y~B}I2Pxf zyI;?7u<$S+JȎ.VWF U(cF|%2gbT: [da*xT\0iNHXcSc a;@ c1稩Nd`"cg؎\ʨ &+P2Ph${֡`ARv8|%yx%ׯ3vG#&i"H@(aCjڼ5/Gp=7$S`lk.0}KO'~f-!z oia # mOOz: ,=4oZv2p)$dI.t=MHu.1%NJvm`W(1!yL-X4yY' @YRRrZr]kD)jֲY1:ҐcC0mޚw V3U|ԝ\1aNO B2=Yf#bئ.s Q;Esy G6G`קkAih @ DPǣ*Bx~[cz~Ui` #1bbl Wߊz5m-Y1r?ըjiR.?%U:c;MWȉxr O~3+01=qɃUiͅ88jڼҿTiV<H Ft<%?ư*Gy+cbLQ{SӶH kX `%UA<b^hC~ؽVHB`-` RFx҉*{ ){8*Em)! ^@+a1𙌀LG(W`) ]1E(ZqSXıXaơZ !,zt6(Lk[zc2^cGm|g =gȨ2TjG{3k8{rtƶ5=?λ ▁q%AŋZku=3Χ}׾׫<إ^ WJRQzʕjJk8%@_Հ`NDU!+Ԫ20uE-@E稗45f8A[4J|(Hڢ& bR>7Ԩ*'o@OKO~!o4QO挚[Qrzc'mNPx Dz:UXz~ڬ3S 1vj `ʕ녤Qfj-䚄Qjک!&RA 5Y?!Hib(艤$.Q,NT,Fu%n r7ڛLɰ* OPY U޺b*x נ^o@Z8;GH 򤗓FwCyxdV^2N Mt򜴳;cĞF5ۭ+ SsVܟT< 8&/fL\+NOC 'uI3̓Io 8B*h}?ZKm5 ](-PFԯD*_) iYLE41n2u'uvz"vc]QDP£$!PBWOLDROѴ& qO۔z'6vx?ySuoǡf߷ؕy!TYU/_ l ͏Og4@E;0I2ߵ9QĸV?+jáYpRb~ͮ hq(րsk/ h1 `DV?L',Y7cfYf1ԣ06Ys1cb@.DW",?:aqO̠P&_\D~&d~/5&Cta[ME줢lt0\%0$7!.Z r\L̂BD1 )e ~[?[f7[rh>)7Whý̩[Ocpb1IAC.%a%W'oi w˓^N݁bׯc'>ӡ0bGi#/ӊ%n&|!m6vi#+VU=^ṿyc aϲJ$R UN;4j>"͖Udgď6Koݼ>Ca{#T2~6O2X树`3=Z唪!bIW"Dp|8pL wOI1c&< 'Aơ4^at"D G\zp/0„9+QCa)0P/ *_!K^2]6zL Ҫ^Ӫ ;FJWx°. Ool%ժqexJ*aI"F63h,QE6-e_R*hzQ^\CU]UZÓo.9=~%:כ|{yI;`gVC{GӜiG<,8=AzIWp`.圀TsHsi{ꎈ&Fw`9hS cAgbd@Ezl,!x=W%buh񮮪̓]U}G*죊 ^QŚyM7 K Gxy|2Ϥըz)HZ٬\b :C =AHFCڼ5+t;RS.дy+rI9=ZUT._>#/@$!\rG7 q0℆dnX ʹyFhBDF*.i|:뽜 &Y[Ɉz+=*L&,0}ϥM_KXXHT>YJ%N|R&i9 Fqu 4jƚ`:QGUNvl`5ecIݱfj~6KvxIhx3R+36&΂ .6 qx4fat1"q%4UHŦXIj?G%prfHLp Ws᪸+.ElI;ӌyiO1.eP[9";f<ؕ5kޞ^! z-{Ū̓]O?5GT{mM?:%_1eNnkw`c^昁ue<KL"Dl *DtOڣT!0}90{6v׾^ z(r8 ̓]ue|+w?5Ĕd<~{c^OX :JQ{L҃MFSpE%VN9T ED rd,9L"Gqf<3 0:Ev@(SqJt ; yOyegᑦ@e)G0#LJX. +^)LnypAqiA4,CL, LAl4B<8PgEۡ>"V-!VSc;r,=-gQiN.-!bpYC(mDz9epޚrˌgL 'UFwDjڵ[I1)OʈId;@8>jp ǣ0ǣ$=hGm8m{zIWp`}l>%OYa2KMVy{gqI :jӮŪ6oMLK `t\e.l /)bWTd4%&kRbUl' gU485hp" Eol/\P}> jv8mUb_$2L ˶-1D XBIXAW%\IPIj#&3NX&;k&V(3)v̓]EOK^{ɃY 4"}3yjQ(;$`!3jWۃ?P_گfFDvG2+gͶstV'-K=\ٓp,g1tuO>QS/_"FW1%괐]Qg4NZfKG,CvkI54mЧ<:cDuCҚD?E31k?YH$P5i:2X1mL$ ,G# LwQ(̢5kgZ,a4VfP9mͧ9޿~v[HJ$dIjxj{zIWETF80`J2O1 #N񱲟Dƒ<Ʈ\)'B1tڪ Vm."z[xSj]dGsZ@}^31ƀэ!sMO8adv㏔R6fL&HK$aVf}A"Ȩ2^9 WUlI!(+Dd87^B1ežpIݑvD:'t0B'bz2L3\CƣLﳨ:y䤱5`ֺ9f.ez5]mkWzȣLpIr-s{9CO.U^.8G} !9 u*6  J @DM wK(a9RTոm[[2bfadpmꦘ1{>dp}+ /cCa2Β]oxUcz!1[D4r& >Ga!Rn@#Dku tw`T\ۤ?hI*ԵhTum Ch+I@ m>"vz9d,90* Uj3=Svm ` kr&9Sx ڷ ?Xy{.qF8{qGm`@S},pA+-;TΞiJY Isj#6l[v*Tc?+N1M :߇iY{*^)G݁%O_~x87Qgȡ:%9Ï/Ӛ :ӟ~b}r*LItWeQ{"Lz볒r,= ~ uÂIzVn cR] ŗj*&x'ʄt7RJ(%`6nx &G\IP7"T\c󌇩/Ci=i4fhi0:-!ړJf8ՋU;l,*|n0:urR ӼKU#-_ .BEWƮ ^`M#+|j( A0{5 75mJPBz!h$dp84DMϾتdvTOQr$3ˆ+ͷ X$Uϭ% t>3\ycexOA Bt庁Q OW#iKEir"/أ=c=at5T?F_8SR.a , 8Qf "3ѩ>)fقu^X$bێcfHL4AP +fet v1vAp b#-"wZϴ=1t|br]R p-OlC3ᄹ$q@SN;aiXHj$\*KzX"Y p^휔Cx#@ꚅF}8dٞ\҃]Ow e݈2c莩;sTtB;"`/ke<ؽas~wk̈́(UyK"eYR6Yg"桤+– i( @w{_F_sebM"r.jM##=߯ =:Oea4d *kjh%i{)/Ȉ%fGz"^6O:&HE;-}6cJch/(5 4g’D]Aoh"ʌLzpv!y ,:ACˏI&M3Acĭk6}\#ҰXW/,zN;ӥ$ԔT2_*OH;>$Ʈ1?ǔ|7m`eO>q*='{F>+\]Z .2A"՘ߥ-\L3OJJV Ъ̓] q_$N0'/2j#am6>ܛ:{)+._eˤr5==+8`g')gUX?/C_ ,Ѷy+ns!cMt:[\f nmY86m^̼vp;X-+ YgPw[#,قJ2c/}7+8&ʔ޵ ) p煃m`~hQSTO]M}2RP`1n(wD(ya"ƌ+B Y4P>:I]}ZW?t ?9@z¤2hDWic^yȲWs5H IƬ#GN*%z5SQa9D]x6vWP7YX~n-Au Z;Ri-zlƕW^m/ wԪ6vyR1], DT"#ꦄeXpfygm`e?mS%C3O9%BtljϺaߧZ9lp-,عH+[NO5Kt"ۺ٨7Uoa|Nĉ{iN.'K˟i'6qiІvZ^nEQ{-Oܟ3Ka_ɖ3v%AJHMOݽ@]tLO&֘"ːjȷɃU ~CCd{ֲ$R>pQ9{t @g?g 2m'F@Ɛí"RXl*z xt##EijP/럚4ErNCvg<=&Q:,=K5Ri`5G i,6v-<MJ%o&뇺ór%$ȑJ6H0|c,QkN$,ܯs@*l/bXzZUjeqje1tfΰb̪. _ &)~mA;EV4` :MY^B= G?jHUXJ6L{{_ݶPa2bw[#~wL}!je.sڙ؎q3s12ʮx?)y*ORsO,V> Sb{9alv0W}>?f) gBc&oe~ W/"\ĺ-Rwλa,$ʏ?ȚJDT?Z.#2j ZsT9 ! J^q Q%5K.P4 ǭk}OQ#V۲X+d?除-EAXGAXh EA*C"+g^d5hj` 10IBkoz~cbZ\Üw 6^"&DӎؗXls{q5TW*\b8aTE3k&VAO\gjUy`aYK"ʹCOm`GJyzm`X!۞[\86ob',bb ,yJYa n5Hg:u?ζp N#ќ?cV;+'tJZ-"PY:-wOB]7yʝ3I`47NX]>c^-G_a?GK-]D}whvZZ3E*BvN?KNkr8MQO\3![yܧCϯY4#kZGboS;tu3·`AC H/) }y}}dL/Ozr ݁,1B<% JH@4*%a#:HΘP#3eaD#Hܴ h6Qykvg`v,.EVhJaԔº?֭]W}!J\`,!W!aJy`!}aB]lrI'Ѓ>eC\d)c6F.O"H&YnJGR6@%ÕU:7;VwGzkXk[N'[zD0Pge#jH-q(+QI$ ޛQPͩ: k(Q,L+>.媌(ZeAgcwkYDMXGA6GbbH 'C;XT >tcڲ#`<ؽ-\tx& 7Bc=mOOzjWp`4#\~.j2EEHUcl &+kAڷo>,=|H(L"/n%a!ѺRnQ4[Ae`)7e7rU;ေ-q}f'D3|z䔱zw_ǂ0mIؗ%J%W!z=).ljyW/[1T63h D|~r=2~F o$Qk][M,1S2מ;cU: aTc+lSUBL;cMŦWꬆ+T4IX51Q,\HY4(*Nc,IiZmc} [x`v<@Dm%:GI9"锏Bx^fj\1̫5 0'"ʠ{ E dFe:Iv4W3ĥlx)Vaa7cK ?8 PN1EEs)@DLs9c@#fL13cg1fӚ5=5}Qy0Zw$.j{ ޓwd%TyZY.g.zڼ5X[4#bKBP) ykPʒ݄DB7G#^?i/r>fhD Q6#&pTb)=mh<ؽؙi9w-TmC~x>?H5mޚR- b B/"DB-}^H!it7`V[ˏ-m*[0=l,de{I;0 k""*䅔XBPW"*+K f4ڄu:u'9 BA^)1Cu -U'3ma$[pT$XȬݙqׂ_yoI^N 4,T:8LB Z9CQ`F]'\wbK$ps/{ V~ PV&*~ƚTᑂO\m`s 6eYۈ)iV(\V7Dk|P ʛsQ_АÖ6Sс `0R(U0 T3`Cj1)L;U;{ =jA^56s ><+@O'];b_sy:eün;Ui -RklG>WmyԮqn* ]d!_ZdUjQ*kop;a ǖ^E^!c o X?2<$QC %#E6B!O,/ND^;[V@0 ؑ^m0aTJTFUat8\sΊ%>ke@+ fʔ31sI< ;QF儲[>E avvPtޘ-jt\=D9jL^% 5k0fG`oZ=̓]r'z,&Ԯ#LA^`xP?;8ɃU^D1QƈjOSy2JUY؁)4-)]/`<&oco{z_]Gxg{^ SKZV;oyvrdT0\MFyL0௜M ȷfܗ{m XUTu^ ?V)]sXlJZ竤wbQs-wO8)(fOonYXOx0_DLqӻĝ? 0d9LuU*"j 4&P.yq<'F+(fvŘuP>~E6]q5^|FC-kA猚 1{fGUm>|:RiJV>ٟN>x]qAB@r从5? *L!HKkTAZX';Nxֱ8FxU౤f͑y\3uR16vH11ULCXKo-䇞6vo%ok s{@Kd,Y[BL<*PN%Զy+ז"43{"6vo'ۄjW_֔i٪+ kR L 4"VRd^_5j^k|ay+hES$ Di(RG 6O ;>xLjv+eKJu<{-޺< 9#NZ{Kj%0Vi $L홳y{hX(Վm;o3Bgߠ|3Pp 'bqwr}B{<ؕG/-~^ .Co( ?Q˓7l1ȺCr^V(+ͱjl,DtJ6jx[1$NmS<l;Q`n"'֨A #4#"l%"$ @& L|Ha3AfU$,m ǼNMwl^f9앃q`xn~J-*i{BEJTiN1Oh'HOqo$f2τfYmų&atZD)n ۫F zyK݁vʻ5/+E.M > (KDE{Nąr4qLp-/cy?Mrg7ITȠ-9oj:f; 53RZHJи[;0iCtȠ@vCDv?%K*%n?3OyyhRp;Aq3i`nT4>y;~lLʧJ+H)0>s°`L\z51j׍ C+@v?VEl%RPZq,\DBE1?K 8gT1J!zWCU,ķy=)o =鯑V< ۚv|O{a*wI;b"eF4%UůebQ$PEJIw'[XCgE (P6* Wp_R#۞(̓k9Ra<^)z-QU4=!B7d2UKyn$)nvR qVI+Z8HP!M|m_=ٜQY Y$)kDi#-<3@#sL¾C{r5/䱓쬕omͅ7a:6L70c6LEbY,e̬/!@ӉKM/i$b$Myn>eř@؝C _ZykV-1e?A8dO5c)rAObI~f8 Xvɿ/<ؕOH_>%etK@#gGQY>POy}Ǚ6mk /UEoE$a&(R\aoݘ^UވHkg=*/pN_^;0>(wP: Þzk;Yl1f<ƌ@t쥍r}f"=AZ1HRmv`gKL#(겝<䔱z03'EPFWsxXZI,e*VQ/#3M$!1Wp"2!|;K w,`@e_#7mTPVzkZҫlsUPy  5_%I3M)0 cP-~ #cdfbD 64N@uS^r,=AbZwSBw b$L>V(33q vغ!!v< /[<&pACp1`?A#>PrGƃ)Ҫ^WS/chSo]cbߍ*?ƘXkg<姘nG<>EM`u id{<2z ?V ngV૖Hـ0>+Q %u>kEm]Y%3:+͍]]oxJx N~0|-ݣۯ؊t);k筕Y t`ENt8iP ATZ+Cēg1xPVI%ܗDOÚ[ Y93ʪ) )N3dHkJ6ڞXy+5 0yNPcWV1?c.pˈ*lkU `HѪ[<>NVd"OJ^(8W~dIVgsisDLcmQDT@qG g qwUm6sΔ (MdF~\?{֧m +u>0_P1? ,5ZC$+vMA=)443mfva]Ocǝ"^ý~,ϰ z@w5@a%: "=_a1mZp=zSJ8Bu F{UtN[d꒰jg[s6mC9ɃY/- O ! 婑5@pn[M +gʮC2G.j 1FRѕё1f&R21{7=L9J'?1?r1 2X`b,".KeQՊok}Y{X7t10V ..#AI2H؀$E13 +4z02~`l粜Y N N|ο0CuKݟi*F3NϴXc< #?LVGXCu_DyeJ#7 3ƈZg9x,r󽆵7/M^r,=^!SGgV\ľl'<8 q߶'Xzڮs6>vzK<ؕ^[-W2{M̂t`ZB\UFoEW uR|[ Jp_˓^N݁PTjsh.I;d~{,y բPc h2:9elej*e5"(#g|T#NŪ;F̘z1W7mGO::axvZ ;ImaanޤO -"Y"T$+[dNI}4UIGi|T:k@4H#Œ̅Jd̳VSTm|G".Q?b #gQ\0 {DZ'(lSzJ.HSG*+BUFnmxUŞDiL/+~+`ڗ [poOQy(c͗D%6ڹÖ᜛smPU ΣR4v%EaVJWnc~_L\{"̓]Lm[᳛s!2m=6L/,  u [ˍOnV\̓]P# _ /lO`mmexqkW Zm*kfN?a=[|H= V]J,D҄c/:o ąZmb:%(v9`Os򤗓Fw`tܞ rp=P&}XSex NNYCf&e!ε֍ 0<%Ife` []&8ҿHKR,阾҈-ɏix#5`Ԑ%Uh8T&$]SX Ֆ/†Xzkb0̑_]'JV>34ѽOe|G8.OsIgS<xq팦#]9%Uٿ: fMRfL> &UIO ,=sq"ϡXp_yY1}ӟj׎lcx&}Xk =+nUOG]e[:Vmu,3KN.e KմH[AN $~]Or e?,!  ,Gdʪ,3 ,PdʶO'7YRN瑧,ӹ{LԘ'*URo"3zH|j;!|y(+h!m&hyD,"LYźp(,x Jp⢝5b#R,xIV9aOXr!00;{1P^$i*1ksO1'bI-$i-Kk ䷱sMk9~u7Is&ͭ%OAmEh`+ДzLwD=蟟k )C+"* %gVvjaəITo wD pHpX|v[oGz;|avIWi|:E9B6o$Tiubuj:·1ǀnUЂYB$>h /H"NQ +\􋛰l77P)bdAH 3GcァS^j8oJ蹇$4V _[y%d,Q:L) yfLF+d5+im?u CGħ3 I<饍҃{31&暢DQ|_XNTɷ2% UGҏC-:ZU-yy֜Am`U:d]#(D1 ,QbuLRTW2o&,rhnq6-Y-B*azz)p`Y2_X2]P ~t~06=Rֵ}BNhK~˟k{~*%HmuA u^ + ~X& UsoaO^t.[E QFvSv`݈L|n{r?mLw{ 7睹pi؎kQg^jvfq؂t"_(Ӻp"yT)c2@uA/A݉TaupwnYz7.Jޗ2#G~+i l [K=M@`6 PLTBV1>+ VLH̻F2/68!%`Bg ~VYo X賄J:K6TL(Ai\f{1+I O҄8K[hP P8_@۬`ܓhr0cj=|֥Xm[ضY~ I;w`YiNU߁N͡hIc^\UMmޚ YLGVHg`T6"8.kym:x !~9'q`1Of~icrk<ؕ+.Kjs{M2I^0']t$2,{HB}ba UtKkP61R&le=*`aI)K{x#&\A6X>2Fr| wFd's%BtOI\&X"?xE*wϔRS6mޚxdC`H?22r0⬫Ǽנg8o߫iaF3OϵPݏijz(+?8@V;DtEwd`ŀZS[OT#[jڙT0c,~ƮcJk}^%7jȜH3 b&RcƮ e: R `* "12$jZ(1m>7|X`Z-mRHh#44ԲY2V;\6!tguZ<:H`H^:!_y{յS҄Ҝ_ j6vwuUeDėXq1uX+Vmx#?\1;ZPo2ҘP˜*^yKg! 9)׹i =iI%|I :@_s2qRb9@ZI":ǝvAh5L=1nƽt"t켱*}P0EX-P#Q16#i`24#Ň!B&,$!ELe(Sa0EI xسE3CxACj'H:ހj3Lp8m[/fwïM'FY!HbV UǶ5'3MSJl&VkEc)H" 7-RTVg-mW]O *P.b'W'8c'Ba>NPy8zYh/W@ON=.GK)\劾MjnYBQ+ICخJ`ӓNKy9.=J^qhTs<~k>}7 U).8Q\ۗ+s+ȩF0To hh}`W O̠g'4mޚB.4V ʔoӴyYc$H(+F2`/V3[Q 80,wC0.uJB5OȞ JEc׮yIDy)c@I_9V=>b9><8vG[WNG{ml@!IJjҠ^yH ok5|ۆKڐxϱF772s8ՖX'ms"(]{v2;oRdN4:4m]ӖIb*Χw`55v@ A##bjCVc qE䍱ymi.(Riwۃ"J=~) -&Prkx >X|ւD;i:4* 싸IۢФL>h$&H}S"{2'vVy3Ծ!V:8?CgQXDqY?LT8rTƼLD$-`4K⯜?vD 6K i c!ER@Jx64 : ؃YR_/0T0k`+V|"+r&ۇ{3v-" "nj@]#pRw[ PVK+cST2z@mHYQGV0ƥė-lG֌}Bgz~H/@5Z3P2*b;;; /=dVzv]dc"L>襺}֒-YD0Hnb8KYjbcg^O +lTbN/hOBDǺ~LK h7xO61L4F2M1FLqFXz{{͡ד2Wd࿠'XzkBs2d$ C0m+.t6PkgW(۳OT|F 9)Md 80 ZqyVk̓]Ks!]88QYC,;k#neT uI6ĻQiYC@Rn@I6BCURnet5JEw)5j+ȴ3[ [+q5Air@,CC'An^  %$0:hZ1+ME+xOuIU;6Zf3?}Z$2:u4crVsnOX直nj6v)a _h۞j9ZAS0=_%,j`f?z9Z_/1E bUZL^SqGI`ws7maH0 m$+[Km%ZBwQ<3.hYв*Zֱh ɜ`ܰ5@ CpfF"Kۥ?)%DZAF䃿IĔLgE|7RntGvvX/M޽'r,i{J>;mH?%ZeQ WP-;oSiQ#\Y`8um. S TT5 ^R[+ aJ /e,ׄ pޘh>'[N ?#` @wwTo#!ŸD0~3wvGP!$I8*;ki{gمi]*Gċf_U ŪNNYCfv0ِү7/mO:4,xmEi$+\ƒY8烻ˎ8n *NqEȥ*p *`,AT회3a]e(saV)l S]tXz^zS%*oTdUݡnFs'& ўP/"gF&*1zG lY\$ v1ZeT3GaB)i](.|RBhSZKRZ#$_7ʍKq_钸olf_<#Ʈd}rL?cbF)% p(aŭ$ -N*qj`gn<;_U!ܵ0GSi%ZXB1ˈhZ )eӜ7+ZkOئU`TjW5 {I5] u!QHDtw=$Y' *ecǟb2(e۞ue]UqY#drwkW~ה?Jj`}+W+lYo_1nir ijS=۲* SaB"5[DW@h"ʫZ4("z X0SCbK|A84at;s%8L[ifV˓^N݁;{Be? װfD.b#ڷK&s +0dŠGg\Ȅ Wl`씐JtdJ Yo݄P"AA Թݟ&>VM~qH= _0VʜX2 :y줍2[Qyxoc잜5اb0ZSQ!>N: ƗFϞ1oq.H5@H#M!HRn#*c\owǧ=mhu ; 1-t(+8R+i `6"fH &lB)LH bO60M1AT )R% ! c;BWl/tc^0usy* SXl$0Md4Rۍ-*pU|&p*x^ @0U : ǀ0 { a DݱړT/aB(mfS\PUm9r &u IS_@͍d1[~9uatyCEf2 r4)MV%\Cy[xΓd$ D%yVpCcˉ g3r?e@ z;ldzɲOÃYW,6Ϝ:lH:l-/39BKfji>%Ҥ-,WoQ`.l+w60'wj岎s\IWp`Φ% O)%vt- È\:0#u=7QJxP9fJeL՟{'XrY}pY=Ud筃WӜƢW3dq(-&0]^[L SNcWb EmNJn4襍˳Vַ21CHzۻp6䔱ߵsJa&^ bHF59jx 9LP3l+Uyzg$-ȘxA"py^v QӘ;!֔uvR~J߿Kv ԸLA,BnAb+5O@@|pKn8[ )XM20ejUMɺ 8>ՎrS:6SxcY''AŪ!R]=j- #Kӈ$2|%nMy,̓]Y}""kmu(Pp$&o>SB\6vÖ%udMXK IH2M1eyOT8%s 7՚k ý$8rTkK{sO Y)nfI'a\ʍ)8;M`rܰnu䱓vvcÍ")0cNX:ViSc}JQ z9Q Zz晱T;{Y)qQ?cl("cJMSZRbƧȀ1Y|GCt!RAwQ]_5'X^Q ~<k @A 'l-@A>T]N![| !6u rư^r,=صξƒ5JL0DNR'`dx$6`mCH?fcibJD ap?kuUWogإ,iʌ.I0/SޘIsFhplúl: \")O-Q|(aNbF^Xk֡PwV)(p? WT(M4DמtF2:~i;ZLn>V zi;T>zQZX`. itLydD2}ST.T"P 6|ju+ڽbe|[ +K ]W%lPfoYSiD.mJS؟nIF<n V~g^ lXeQ0A1z5U\d1 v'o5=0_鉙(QH:Q,LC1ip\[/~±:k;Suf!zr*XzD^Y `I%j J[;Giڸb&[dDbPt!rSjϯڽW̽n8A̓GČ%RNL}^C^K |Ԍ0xהv']),ՀP(3cEr ?ENzB wDpbrQK G%.$>1"* 3J]KhE;H2ީg)F75ֻH;XžR;c߶tظχ"9;(u ]ea~(A ~y, Bv?4/S[ޗ$Ku>A[r&!r%@ٿ2ve,=ry״(ȋpv5" $4nGA߇Y\`(D/B"D/1Hj=cK!QHZ~DkS22Jj Y*AKT(4Vw~s$Sȷ.k֍-0p[` [ܯ,_5}o8O/.xŌ#|HT#NdRax|}qJ7|ߟ^]Y;)ok*435.kVv%GrZ#"raōcߧ6.4.o6&4xޱSQ:aC$I*!T"MRmp7~ D Dj>iS,7x4g+öopy<Žf)ٖ5V#Bi_^[ܙWIjoVaֳZK $*8A{TN!ՀrN\"5 dR0].q0'@ҿT鶂A6ǘڲ*\%.a-WovY39d<۰N9Pz¶p,/Dv_ vKO[vf?2C7T-o1nvxnA:@K7'MXd/:O8M~L'ʇ.;OkxQԳ3mVޤ év_3M['\|EQeꋨrmԞ(FW̽DfP {A2  /#[+ٛ.'SY3vfԤ)tCuILduY=CahLt%Q5{6s%bmM-aSgbkNV6#rSdI S!#pȘx` !g_:LGU.kn'71̾'ga(?tU){ik5Kά[n"hl{=9/Y<veq_OU=er.'$&G0wG 7"BC%dۉRYsh /@)nx\/f[c]wРzz.(s.('dOuG;HU7C(Zjv7ڽܞ0; Ot?$@0)ھBP) 5b:MrDڎ4!r#|ti-/XI! |ե5#ٔHI"aPf]`n(ߞv]+s Hk)KS[JUuR!%E(J)d,5F.cqour>@Chh;93+,ߛ½`\½~^^;昱pD*(Sˋӄ֛qeLUJZ~E9Oߊ7cǶNJ@9nHMbX{LaU0H;Ff,D"Į,q{L,ӏM?[n"A4SC4[ËD| 6XZslA> Sk `0L )Qj ~2ksNRRiZ)A1ݳ}PLmΚ LBf֧Y,Ҵ wdrL11'2RT'n8`ɬ) v5j ˺U݁OըGA4꿅t$)Ҏai #Ҏq:R amCZwSYM-=U1k^&H`BSߔ{zHmuҶWN $l,4(HfEFN&heMW~+}Hv὆c1>.ie^3:ĝ{S3TEA+̯$ΧZlㅈ{Rlӊ C.;=[ ڝ%HCYK,nz*a&cFj(i-C0(ރB@Z)3n wPLOtFz%PjUF p> h5lM̧q:0?_ShtܩʔwTwqIiqET%`y͖bwZ"+Ei XbK|&.җ)|/]zL .hm}nnu30v RnUA^Je4 i1tz9`&,Q,W.)cbfUBdFFs;8F'emHOJC! )ȘESa^`fNV˱#y ožA7%;n<`N-?s#SZ:OwP89SHZP @8v0vW4& 9Hֶfà %k^ &JEå"S^JI؄/dOw~hc]c_GYXsLqK%LX(U"RJtXI(EmXA `M=o֯[U 6@n=`.5& ]Ra~3rZY- O !hY/ UTn2X$9֨ vZ.]`Uhi)HmL.ȝBnFbҹ}GNSG!I bk9]9o GD?Y UKYKB9xm8kU].ϥlƤ=0ݹF5LWu}Yޒ&n4yT)D7,'.}TZS&l@Ձ* U~\ tIz~Kڥ_5:UPvLne ?׆"`B6ƌMJf0?tF-7;G rk< E> V$0 u1D~2; ێ=PM鄖GTѝԴ[_T̮FiEԱC鐢=58!Ep XrLMfVa,V%5V,b]T´^g TJP*SU#/2pEE0Ƈ1OaT VE[n#Eh@< K`1NU eN\Ә7"§ouqyTaSda9XZ{LQuQ: ah, 6,j&Rm%@I]w/Ҫ\PXI?m۔̂>^8?f6)܁~ӯ/MC$֬r%*V.+Y8WDo},~ld挣*neyomB1_DT+c)qT ¨Wa?S ա*; ntkKӭ =BTx""X:qþ?A9 Z* / Z"A%SXs؏nuBRC aբ ifE`·4TLxqu]P iTtp1/J"m, Y+Be)lOEW)mD*e%M$Z"8ᵜ> (J4P[4S/C.F)=%y͎Td^,Z' ap0Rfj nyۚ^~tb3y)v]9LG#*Ukn veԘD=@<7b*Z%v\AD0dޡu(x@g[e\ޅ?  , `vs)G$kmA@;`ͰV tAǼ!Jm#)#J`I4C<3О0*csN5mZT3ú!ӟBke2AaW` X)/Jȋ,;PAc<>ObKҠ-Wxnw W\F32 w>#,"`$\_8FFȪ>WNZ$(.wU=Ǒ=>\A*V`-;?ܬ}uԾs52BF(<@m3 .:Ĩv .P6NZ:ku21%z<t Pݞ`NÒ.|ޭvll}]2ib3sQ4.f7㙬)'w+׳ĭi[@U" EA'!}.bXbD A/\}.zb-"X7 "O. qdfpZTHP FA;rD2c#+<׫b* N"6&+UNJWF*{`|}y#'t[ER' 8($ok{V+%$sF6b@a U;Px.=e^HQP :*}Lk4Kzd uC{k7==9_vy䐑]ILBN%$(yPB[́^yST?'ݺۺZNjRAI5(?1dZ6g!y$]n=|)Fn$ZDP [}Ul8BZ? LAX$w+me5t{;܏ P_p4~ߌP3_ aI;hlLNh}O|u,?AIYEٶVެ͚-rMк3Fܼ79%T%(K民Q {c'Mno yJw8;,3LaEhE̟]9$eGzc6(X&Ip)O~RjNc& $ "W)EbR|0:S0E@[Msb|As %P- $ 1UpI W$hjO6 JXN~zW"tȶ|ϑȤ/N>e]&kz0<ϊUg(Bfd@6Sp61UY IB[,)=4c^Ip]T2WŠNgjF=qT%pT?DVS?M%C`م! LArD/)iq۩-<+~tJNXK$hnV+ `'||g aG A'(Wўa0g0x%ϡ9g|-Laܧaq??­Zu,V8`5T jEXBP0 x!RB~he(Y*UBA\R$vzǖ$@yBR!xaBF@ǗOop2. Yy\ssZ#|ZCϽyH"ce eb0B6HίŕG0o+P`fccg_"BK{ndQ=Y ERH @H]I@Hc-\WwW.^ͺ͵˚uoDo OބD&zgfŽYvUM 'dxuƼn˶[Q`D6ǒSCKV LҏQؚZ B5 ;֘"kw#;ˡ=Y҄ϘP].V(,Η]dII>8UVd@(Eb,IQ(@0-#VaQ6hHh Y};By S?k6Od D/YeȲ.h;Dh4TKH1Hr' aeX]"mm;y ~f5!S-٧ FByK~A= Z=}=b/)A 7f=T$0)v8܊:[S94!iܬf'#5T-.hi@GG6$a Z7zcfuU!:U_Sˬc¬IM[3^4TkpvP(mM#\T#3^ 9M۵N#83H/!5F 桡$se?;T֋Es)?ndoݪ_C?풙k}.MÚnXZƵ.kVTSZ~lz~ksQ؇筧?mR -O0(5hFi,ݦ!ZrXӠ*Y\`xi\\%K]`IhZݚ9Ol:!\!<(W%#(W*JEYGckG׸WKIr9 $; ۇ-4pؔZ vzaM=G F@#0 reQ+ս!Y *6Lr*Cr?3zD 爆adp%S⯿oX_{~_ϖ7{u;c,E:E+@Zt<5Ka? f< %`@v2:"JܪjS-C'$4*D d_d@]n"Y=}3[j2Xv60j5O)M)c֮T M-U\v ǘDݐuuފBCvQwF@ W`FPN$;2Ը 7%n㫰4{I IސtDuL)Ť N ]%a~2UfUhta[|i96sX#IsՌx^-RO:!C&!X̌&? -ѐNC-RxaZ6呂iFBrtSJbV #vwBv7)\S+DDRDªMiZae䣗@'a[yx:|l~Cg*7𵅝TYv%WpfV8mvhn**ŴMvJ85˟*ʏ 㠧5; z"@b='l'-BՄ]+Ǿ̿MºTW7!Ma+ 5QxH m ,B&=ZA񙒤KQf)cg}l㽪`! gD0ǼLnN[,j^ pꕲAxP$9OO`8ǘr 3eȨ@y xD]-8#>1= Ⰸ7@527Y3[PVğx`oL{k4H#*cU7 ב{U]`W֤ ӕH#Rl#"܅X$ <%%r:fX>J:,Ki6 2B~l) b7%1,sZG y<e{jMmyz1êᾄT;*pr(|se an--Fi`yQh+nkWF![ѩ+$++B {o  ~;HLY^=$Ft]n\w>H*evZ;9[,$9TXzD]#4S&Bi*1Cqѣ`?\i[󪄙 з s'Rat;!|O4n(`-Q")!ھE@jcdDFGml[2j˕Hs~c]յ ~p4h2v7`M]UGk݌µpozu==KxqԘm7Xo#螖қRdatOԧK;&\R 2]Ǭ'D-w-B5 j6HVR_cAKWWxZk|4 ՔKd ơ^4Z"~X:&,avAHIK /]ݤ=Vٗep.9.װAٯ*µe1'+R[; 8Ϙ+gQ'Xrz6d]qY渨M-;nE\'9j,~P)T,!%%pi2}z-*U)lA)KiҼaUܧm؁+^XN"Dn[OV0Wr` RH mWdQV]ԞF,gqAL )7aS2I)lU%FVׄv#R,J_R׶l/O{TJi.)U@(Ph|RK\)6Fo66@PaSA&L#.}9S9 L$I$PSܚ]ℽ:?K{-miol˕0}u޻Z@e#6Xﭒ0)FȯЈ-$^ آ,F %T|rҡ{6x!6wQOBJ>{sáҾB9@@C-d ,[f%:ah!JTD|Vo"[f̾3̙ SvW|զ>2FC6Q 6fdd2r?=Y3i?d^T8{ythe=-hO%l8o>aOٽ8c8~ +!|3/V Fۃ|Xޔlq}Tt ޱy)w{,VHrLTO=4cR+u ٣pÂtEw~F( S0Oa`HHz;JYf̏WI({f,|sӿؔ+ ܛog,Uݣ+Ο]~Ur~p 6;lq{]dU|2z,2Kg(/A }1PDp瘌_\gmIepq"^Ms4#r})YK v=57-oAvMR]y/Al@i l!eo#edNFp'cLM amŭ~=GʺT_y}%碁$aEŠ?"ਤ;w:]Jv#䩻f < $+\:)|> 9aM! 4UkNi$`%`hza'eÐ]W0C!g( mEECtKrysH4-2wӳEw)RIL[2};HG7#xT4R "xp$?K`u^Kߠze89)c@ mCoZ-lGmS2%B1e6ЎOрO|J]7Siw|sa7\S7} = :MeMV_|]rMEܛ*D"r]{NҀ?]yF)*e.]! &j&y̐n :je! ffnfo?jVuS2SҹuX n]1;ώMIKV2yY 4%϶XeWH+7O H6Ji z~=V&lS54t2e?7Vh?/3~UX ˼5JН *!7 4{t9HgAn$[~i{(OLKkg`_i+ځ k>sƴ-w1! 9N>CAĭk ?2O@9 w=ǩ endstream endobj 2613 0 obj << /Length 2790 /Filter /FlateDecode >> stream xZKsϯP:cac]>N6LMC&Zlf%R!)?&n4dJ)פjs4~| ۟ه7?,޼ьs(%f,(b5< soqac'ϸeTo|+ J"01 dO}UVϸ~a[$IL[rHRĞ~~ğ\$qA⥛Mq)"ﱢ U6)zַ"B2kط4VH+J{0+ MΊg_|.s AJ&t"0j)H*UߍV?Z(2R?uQRZ@I`d) ) F9~~=?퀴i>ҷQ[?[~?jW)j3I}L=hn $.3 eZKaLUMTpس^ޡB!P8Cun*E$ hd)~Zqٓ)l, $$ifr)"xI n-R:3?b_]B2ԏQ4m\7"Ý;G-ĨJXA:qRne-uE3FuƘdc rq[ug%">b E`Gĸ8FnG&YMd$/e`8n p+L\\-Z6r;<#Qwlɒ7N& *B!:VẼpW~9 A"l~),/< YeծK~GViY ZZ8A(|jEdlXR0ZTT3`9׍tPh@.grt7ewiF0uoG̫]hV-ք<'C0wA,Jh{ܦܘ۔ bO(֒5Dk0~Ӫ*LXf0i1Fqg$»=%em}Bsݤznu]fKL7Ks2QZ%g Nr k+]- (nLװ@RC2`~E>hb1o1c,Wx`́gu0/MiTb\S 8h`fqxѣ#r17=i9lcф8mwc`ÓeݕR țF^#S1L[NEY\0C'HQA2h(5z})BɢJiѭWi'mlmdC50ʐ`J@Ԡ 1%h엵`1pG ST!-]bDT*ZVRv`8,k.zD(PͨӭUQ6MpčjX )ԕu+@T"~Šڊܡ'u[Fk[ɺ@Ǯؓ@i+C cǤ/%(IcH󥾢5.>89Rf;zݜvAY`'-TU]d_c*Ht6 ppEۭmi=mg8eSg롃U׬f &ݕ<ޫ%~x:7a;]!J+Yu|qi.:M%} 7ƞ"Hu'4]d.iXST'7ܨ GƏ{\  tkҌbB5Gؔ:իՖtnxw {,7m\ֲso=v3H4IzS* Lc~[}!SYB(ZOXJKϺ0C2GS&?MKPJCH}GdDI;+f:I6 +9I9E08k)ehG|mQC< D%A] Lq#q&8`:Ʒ< 5qM MqǙ"F hzI['补y"h*a"*lP8$,zTop*%JvLL@)T44PppDb_2ƱC_q$IѬGtrO=Ԏ2J΅KARCL_Tt'<]ݛ)>#|R+St*7frFgW9 "ؾ@,"02}QÖp Zkp(#vXE7 VzMUMsx$PznAyY!6]r%7_CVWkzZ raM\$?<_o3n }}n|'} ?"ʸ,"Ka 9FC};0=fYT=^S=TY>ܤzsï}}s}`o|h4# toH?joqEw'{FJ(x&r?QOPoBk=@ J.w-zmLq;R~:4鏔}Yv4HE9MtΧ'gRU{w~aNot endstream endobj 2618 0 obj << /Length 1971 /Filter /FlateDecode >> stream xZ[sF~䡵ٳj2tin҄v2A2Ӽ=ewhQѓ ,x#30ǷC\q(/1ųޛctώzo__N{<;por#jt"oNJ>VtqbUP$D.ڞ\NVQ8#irņa,Qf[ L$` :J7QapéݨB , I*m/\ >m@|JyH7_U# @44OjY8i.d;8K).Q37{JiF+ 2` 4$=,)Ǹ1Q\eUVx)=K2:ˋͫ b-{w~Gh]zh5X:=CTkP{馍pH}O㟁C-1}(KI?`@HO +u( Qte0kQDY> wk0;:@!>|iQ\AXLnNG @bsJ vyrx%S;6_2wT>.L>lM&s0T2^-n֜E  V^2 qȸyEC"LDuf:]A]KV6bz3mPhL KUQ:1׬W)<cA.+2+3EMEkW4qPp*/^;WCJFCLRЬa/ w<oDYKY/FL Eqױ8Ѹ@DZGPTRq4qVٿA .b#wqI8nnθYNU-p,i4k[?dl78"zUJ[~RĶdX̗h;Q*Wr4)rk|wPi|2]m8αG/G hx,(;OOH"|8Z2|ʎXFq,S`\FU;.oZSヸ3}k 0ZYъf /PL||[5Zr{t$\FP6|k7ƚލ}}r!3-_.HkXn`jbZ#PFEt4jgCb_<%}E^ Uk[Ԗ"@6h_jlƲWv.R.{sKh%QQھsh<~ݶFšy+G7Hm-}zJslWvOV]X9-+jTu%s[xg/CXՇ "j \m]d)kgu ܯ@%gE ߍD;Ov:mWe!M+\7õIU F]/.eMzz.ƒ0>o>!1MNB ͔V<]4}~c:B)lUB4-6/jeywѕdIg(@G0B endstream endobj 2625 0 obj << /Length 1925 /Filter /FlateDecode >> stream xڵX[o~_!ʭ͐ui3(`5%Zc%9$uv&>$s΅ΣC}Xh0Fbz p/p֩s Xs~zpEc&Sj&bzGO;1 Jxp;+OXEŊqJ*LJ/ߣǏIΊPC'!>l ?[Yu[Dď×H$_o+ !h{V_?sFWL> }NDh{k acVs! :,>k>ѓ'rlX)N6@$?] PH"κ}>M@-?uoQ`YlFU>"fgW\c͏@DO@i1 u$ <#-[<,eܲ[uTZ&)5^II~$/(|2gPn+r[ЕU 4 wXH8AH^xcmS{W1$^E~d Y (ӯum7…M)dPa-ޫvL !u/%K,om@Qi'MgvL1W},*c&]aOO+$5J) ,Rr̪ą oN#x'ƾ.v|i B]G;З@^H2p dvOpiЪ4KCcIg`*Y̗fl q1-v$GK;ܠ#Cj$?gk\gu}ϙD ΚA HQsrDaNU;J)J; զ1՝eѽY+%ت:&a 93`:2 ;#}3Q_4bD2kV|z+9+%hEnr37Yb}kGٔUك$6v-;QLqfOM] $sxڻpȤ Ÿ(̳HG8el~ZMieEղ;ѽr%:G"߄s6=mYi]6 endstream endobj 2629 0 obj << /Length 2305 /Filter /FlateDecode >> stream xZ[oF~ϯ֚̅K6]8M[B!-QJH*[CzdI <Ϝ EG7#:ٷg/^xI(( h3I'g?\:F$`/7X4 __.|r Q#x$ /8ӤPk}yfdSnr5%P fhjD2AdhΛmBhE0nf] ưT J.z^W)J0FѣMZ7UYAv4P>ʌEiRrh|6 Dl2R>M$:#ӣH05VvfH0rfXVȪFYȯ)*^[ewmʠ_{`CbʟC{>@7 }eJjAń0HE$Q ?MTfEtuTFy? {v]b#VbzJ=++ۼ ˧D[ v`H>I5J?J FSMS) yy:Y2;--F_גcגYn{R6AFd+o;eVmQH*23, %uuƹ>][԰ZAȘ6 ilTvR/O@Ht6_7}\CIv d]j*i]5r63'WKI_]|Bf vQ&*B&gσd0lMӄrA鸋'=k}Bc MGe۔VUV/1PqR/yyLXՙ$q]m974Y^vVVLy@IjAr=XJ% {6MOePr9S6IjwcY{8: '(G8jIkPκMֵ%~D v_®W `ݨQۖ˭Ho9$=ֈ%<9-/Qz)֊CAIKI$f<_}9s;[=oGn8~*7'1Xq󷥁~9{7Z$ endstream endobj 2635 0 obj << /Length 2342 /Filter /FlateDecode >> stream xZKsϯP͉%xnRک]Tm9>P"d1Hٚ_n4Ȗlk&@nrG#w^9n0E'FWQ FA2!U2v<=6>w.qȝ?2; SsLqz/E,ӆ}*B&]r<]ש' Q}AhjIB1XćYVOY'"-(e.?֨00RGXf=¼~ CPÏE>[52_mtq}W^pch%88TzX0KuEfI2Dj9"/@F H' ˙#JѼ?E玼i1f{6r%f̎ 1W h3z$ۡ `%qJlgOrY 6dvl=L-^\xn,}tAĤI"-Ox>}Yf⇋Ѩcx >˟F@IRXyeyE>eXWKg{I|0=ID$[]<vXɝ8,O ճi\$4OV0YXZ9hGނ[0CPl$1C4-T/}0U1\ʻ(5u^r#2y4%ܹI*[% z&ЛG& UnBrUUH>vڑ)}L90n\hm  7'p{uyl $A~mM?ݻx^0(PCaHYz5})HuBǑ hvֽ젤OH7F"Zʢf _.j ~w.@ զ C8|@T&qҨR׷%cadܷfqTR% .Z FU3rjy`K"nU9[Xfˠ-iCr%%A);!^$UL4 IeE6^b6%u;¼>ە.1p ~Kդgk6ZP P͈+n*> stream xYoF_G 5l/ CZZK@RqofgI4eٲklÝβjf?p)AGeuĻ&$+cn"ҢvohU_EFJo1qD2p: Oɺ@},).oO`z*]MV.|̖ 8'kIK -Iֱ~+'JMRwEˊNj$.# #t)^@7Y~eY}f\yIMk)O<V=l_:xKf *Uuբo(0bJCZW< tWD`|OqN>u|RXxH25f*SsWS]u9gLUFPcrY Y碱SL]a\g5Mm!UZ 00<%ŕ48fmh;mF Tjq w}.K<&k4oC@jװ@N[S!_4jSyW֏L/0%Фӻ-pF@f{$bwbYm+zIJȞ VM (ܛԚIFݩ:*`W'ɠNRؤ}m!p/du4 ߪ$z~y p !TC#j?l ݛ֑t{ Ɓr<$ ?ߟ"[^y\̙3N‡ ڻ3--`ˣy"zDC6!$"9=l${u[D+@[&5nO6 eJ"Yjp5ɩ|06b!¶1a൫g]*|Va {3:jMsp570<݇C4u(K GYAEe̿JϮvmj\Z3׎9",~Ф#- B D2T D3)7upij15krG/+FtC{A.O&OGĝB& <#-Z UF? )_7P0*/ E&!>Co~;CHr!5%^r, uVtgRp)Q_zjjwڠ)v;+|!50Ž*pQ1٨ suSjݛ1˕ܔ4Z{V0Ε+Nar{ύ{ !N4._jh]ȔwJYf "ͽ}_@>] endstream endobj 2645 0 obj << /Length 1701 /Filter /FlateDecode >> stream xYYoF~U#2{JpZH[B#E"6fGĘQTd%l\KeJCR#@:6ud3U) ~㮭f^ĹzJpͫjSY^ŧ@sgxwy7y1^ۤr 1>6kVub>is]8.62=cEѩܖ;1x"h/x(<6NjmɅc;[.C[QSUaKGowZma;6σJ)݀]\l4\v-ʪ2PեHVnɤ N-K$r#rUHzPG._V$ kP4rð#⻢IwF=+#%o*d,ux|e&Ø*^̅}gP9ůX 8FViw< *rVSBTv] wP!}Jե8?iO%$l5`Е3bͺ}(xL v ܈oX wT 궔""EJȒ+2#3 q|1?`u endstream endobj 2651 0 obj << /Length 1897 /Filter /FlateDecode >> stream xXIsϯPDUY4p+W%/L&UYj[$B2BRȿ>hpNE F+Ͷ3on߳xƘ-7Ϣ$vgt`1#7cؾ_ C'p(Ώ~O?=|f3gP;/>J7 yW-ĽB#|rU?98\0糦mYX=~q=>T 7muw{{8\;wXS֩/Է`a~8xCx]?:Ay[*kn@V }~,QrCPgJ ,JZU7rCkCadza_(r=?Q]DQ /oK{w,IYΔkkIп&1eMb+٬e*_Ó{[Kc`FP4 ,+ r%~o|ЭhF(s*!FjkSi-)zMXeDRY&IU+QlUIZ5 H@b[sZ {WYJ Vb* D%*E˺$^^"xj)mL.Ƈe"AY#n6M &A; ف$NRZ&qʓOJLKl {0[>\֟ӓPVG'7.W._ K"Q >bS xh&`GC6{%K؇qtmXj*|Jiwu]YDއxTnNH FAxg%PŘ쮸Ǚ=P}aR#]j-mZ|Y,GUX{PCҊ\PL 6,vֲfʊh//wp ӛ 7 1L.ԭ"v?[}:X#6)~WUWk @;5~C|leW2q>~p2=gh|<:V>̀{(G/cj_+Th8:k(T8N@kHA5e &(Nc1݈X?$T{ `bi!-sWdWʹjwG6eTMUrwZ3Q$hQǞ:i !,gװN]lt{A3쫵tNX::֪1Oj`bY3KŧvI9۬ rP=8LaVb eЎe$ȿdÿϾn}Xu8 endstream endobj 2657 0 obj << /Length 2079 /Filter /FlateDecode >> stream xZKs6ϯPt G2ynjÎ*EZEVIa@Fh(=\],~8OIA{T0L=)QLĵQҐἱy@+AUu\sZsYHWKޞslY_o4oꅣ1 Rª=%; x z]KDD5nJI3ԹWqn:]E`7<.OqiIl.ݜsٟ3gcΝ_?EbA {uRAji[>h{c dhh Ҫ(5Aw| kJ7np..t)(YZydGҮQZDžϭNS%^eǽ(5 Jͣ]#8z \kCb ~lv|v|`nT%ۈ]ڒIkꙜ8˹ݣE{R2gE֠a( nfe5*J,V,(e5L9FsRCj@'sp)qy ˬͪiQ۝FN.MwŶ|a${M>{7䛍= 0}w^ V0ve&.nv _ܾh}b8%@DdTjEZCh)X_ šfl׋;eZ"Y1Q@8 [#6ⵅAr|ae '%H{y5El=8pU[ӀK-ui|2 @n=ߘHF|p:sE(#;˚VgU#D(>Q\QNx\D d߁޳NH' l> f523 3fb'Pff^ d=TNe5)tv:ݦW=:&] D-y屌=rBAő!D$UPP` (̷lnm=ѾHUeQ[87*ct.^ξ9`A8]IcFDyxHp݃嫑iGQHBr+X#!vVR GAK/sPRFaeq-kh֓#R0':>$:>d`7Aͅ3HPę,;X_U2-g֫,W(;>dq|;$~ ? [ra[X,/똤bj !O&`/@'Յl&uLY90vwdƸa%v O%szE[ݖ3J\Fs}ݡiie`w;nnʖLJ$LJ^NI0+A.y`܏.{ֵ?ʢI9 sbwp -ʎ endstream endobj 2663 0 obj << /Length 1954 /Filter /FlateDecode >> stream xZ[sF~ϯRƭ1NGui4֤q6pQ( [V$#V䰜Y N>;[d0d`$Lx6!IG Zͷ)~~yv:y7(1F:kAF'/坓wc .6|R|w'%L6 bWiջ4bAc]8$Nl'-_X}s ip5sA(F@+~>ְ)+? BqK7.R kp3H0`9/OqaD}B`7!&L7:<kq/"L.~by}Eh.E(]m' MlhYV0@|$$bW`<nj@y`P|r'hIP(sG doCvvb_ˮDR m\ z&LKc7Lry9C<0̺_Q 43Xe=d,+R浗 .>>1yz/4 * Q֤"  %IycO2 /+0SphAy!h0SI "GDmfv8G"MhSZjG+ѡA߈KLE<&tU&d֝$w^Pڌ/Rl?~|pPE}8͠~'RnY+Wa.C o[nvH9-ne >*7]YuzFfZ9xeޗ[*sVdoq,)%_"1^̜,]OPTI]wwXYXkڈ=3+km|"sM4~'*xQ*Zxax_'JAygH Aݸ2-l$9V<47wQ h/O֦th̭YK]G{k,czPurkr+V R ٚTأTUD1*b5 ,?="-UEdM~γ{#$nH]K>KfNh3E+ȝC&// !ث6{ki_79$_,ݦޠRa~Dz}p `[Zk>P֯w OT_ x x.ĢҫYSvRf޹E0k#[kR-.+:+mKB[N!69|XrcrD-nY !Or^R\]䮐@~_vp)BF%N{/)>HO99AӦz+9OS&;ġ'6MTN/&hTTJ[%m-d.7 A}݆#/PoClHӆHo؁A۪dNMLR(jy_įT?ˆn\g|&աbuG, R}X9<N EF 蚵Q a&Ru64M52Tbw5y:7#OGo0Ҥ ݙK(Ii{CߣI4j'U endstream endobj 2667 0 obj << /Length 2549 /Filter /FlateDecode >> stream xZY6~_'iMapHJŵv[=d( #"esdk{OQW Ah4n|n l&x՛۫w{BP >L<:QNnד@Gd?gsFA7w:ü?}ǷÚ~wI.0"DxjZbK&zQ_SJ: PRW #C!!Io;Ս<.ӯ8Ӱ[ :O=s3S42]hf Rqdampz!1XmOi,P"==rʻ$0WS hN<|C?tbn F٧'{h=hgQI0`'+y ᓦ(<0xQrUe^_<*Z\᷿\;pe%V."-QywM7.j*WЊ+ef:DTڼ(e<XOļXB7G4CI%Ijp#8/JІlO3g}Sڨ|vs >Zn93x$ݪx~3 t3CqkUA&/e *է׈+fGET݁B5ם;5bT-Τ>&Bg߬vx[) ^}/u_Nz E.-Cr#E/1V^jwMZB/rWޞF^p~/S֘_`>>&jыG-VJB.TpR:6(N7 ZNM" P*Ap1ic`n&4߭,e^AK֩wK앶 rzuUR+B>3ESTTDkxh HuIol6կ,MY.(**:m)WLRƅ*V?z:NҎeKxi`,b['yse_UAr=ۛnk0TY":\>GzHXMdH[U`U[ fJ\2m/t-J,Zۑ^]'C{[dy> v3`a_XI.4S\FˎhB ~"8ًatde@Ҽi3ݩv']чfYZ/NjN 4]`x$PE]svqҶ*y kQjZdxLw,}Z$sgIlRtJLy""D;h!T6ÊQ{d{  B1&Vg)Fi:(2\aO>pΘ~p3XǭQ=` w#)2è|HED[(dLQ쐭i£\ qs]*O3]AyTAtw`Oyɰ?Dҵ|8_#]qꂄ*h6Oh>pA( :jHdm{F>s,D 6ͽ~ 0 endstream endobj 2552 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1954 /Filter /FlateDecode >> stream xYQo7 ~Z %Q(K6E۲|uFucaa`9pzp5!kcHEuv|RJQu,tnvWʁJ:W30c}G$ PjTJ+L<%FJegޒX2ѕ*6(*L$T118A%(F.:c< Ԣޛ|T1D:MADt8@o<ևY)10jc'yTxJTQTeUs@d:EL(N-=#٫ sDD1$ "Bs`if;ƛ:% ʖ5U-8UB3!.PI "u߀dR@oa쀰m GB$YoX8RCAa¯xɣGja=2#{^"< G CcTh5zB0/7%VK(i ^Ik*cO/œ'Gfy0 گ~`f2[hך5jf~\/3I}P b&B,_^]ͰɲW6WE}~zydl~̫ :vʝZȠ'-zL85Eu/_A\r3ol:뮓pEMܔ=^%>|G 5}R￳zE ̉Cβ\gj(z\tv3ҔZ bc%T%o]~*ZYuLZI.7OI]uv$zⲓ)N>Vm| Ҙ9>!ڴ#D[Ѿ+טb}~ M$! i =JlI"͟75%KRm%d 63. :xYODpb?h I[}2z Lr0Ycٱ}R {#Z$O> stream xZKs8W$m$oqtMy'U;;jIDKHInƃHzD8l4_wă~~WoN!(Q(p@26~80*&^~`F~O ~ׯ+lehZ5"5äbBCĸg6dIv8*]"@B4e9doA"Bpf`&xLajdyP\[r2ThNR,0OIǎśXuhMJ_VO1f]*ܬ &Pvddsl`,88?əJ$H4-^CH!6{HZ+P^h&*)M""$i 4 d$<XBʰ:l G}(rG- y twopm=ʀWL=2!QIQIz2G]ShGla_1vy [&[Z9Fd P,٧7C@vYOI4Q⼻8lgHޤժ8cΑ88]~.m&̆17y= QtjftvS|1vaItOYtZ[KqYY*(VLwSgPDZzMNȱ*{|F$}D"$ Q#!=yvL:'{:Ӗ8MuݴySC@a,>4}+ʪ}quQ,>u܊ߦ(pJ׌|i=%[(g<_}yV[pu?(,Z35ˊ嶺Tgrkq/9f/$ߩH YL-}K*Gl-!@qj7]fV UHнW1O=&iw/aɈ]'u^ʶnh.@8l@oIL"ْ-u)Y_.8"sbP(QāC}%Y&IΌ]6w )@Mв+H뤴>4+6".0"gϘ[0faDw9D>C1'WK~=6&{$P=9[H])mrJDu2{߿aS~ϒlI' :.])f ˞`$OlC"(#(~5- `Y,7:{9(M~ " S`]IJI:L:>,^٤bTN'ߢTyUaqǴū=9E](6{iR@0BUyv29w#!ᦲzen]0]$+L-tOUP[']dsmi^oh,ƈ펑onִKɐt?)2^ [˾YzYN8{,cU3>zooa2At,|DXjfɭ料;` ˫WWP< endstream endobj 2687 0 obj << /Length 1713 /Filter /FlateDecode >> stream xZ[sF~`$7 $t&q4sD͋WS Gj'{,U1 :{v;jS jO^N^!hϲ6hFZpl4|S /;5/Wg˫Oû3|ף?ؚn}IӂY.ےXY:jokz3ʉv1Ն/VAS*!l9 -xIO02 ||#A'5x6 ɵ30IpArʬo {u+ugICnһ7m0a:jMy~'P$Ít  -p#*yq^Vk Q+崐"@!WFdY^rf(,]_V&pզ]K|IK(ST F_!˫c2+{ yT4L:͢i\>L}[̃c5!2>Jw(gkϿ-Ldde =Y?Wki8 Rx\"YLEbڊ|Ouv3qL3iljY%Ӗee<wT~D߫;ޟJ3q"SQ` {,  ®y]:^t9Kt~XQLp{Om\ OYqԋ>aXGaaDžBc|/q$7'BռrK[ׂѳ:t^hny{##mD{ĵ&6jxs88ɿeBbuqq6dW*3>J*=f6U^R#pm0.Hγz3 =_Fy:8GSǸ 4\@z\ 95R? W 9O6G ]Z|^ɍ;NK><"E>J\p(g endstream endobj 2693 0 obj << /Length 324 /Filter /FlateDecode >> stream xڕN0E /fW mA@J' ";'> stream x+262R0B#0˥kag endstream endobj 2681 0 obj << /Type /XObject /Subtype /Image /Width 322 /Height 200 /BitsPerComponent 8 /Length 21608 /ColorSpace /DeviceGray /Filter /DCTDecode >> stream JFIFHHC        B>!1A"Qaq2B#3R$b4%Cr?˲LfST5$ N{[˨ X+N+^ֻ{q*)wص{󇵑͗ъ-4 ov7EoS3h>}"fD@;~&K ȋXPBT3Vw.Aυ =i]UԪz}4LBZ f@T7سZRx֌Xade )B.oFU9,5i^w,O#,M x3ET(O#)GW%M,uiHŹޞZMSTVE +F C4^V]G}n鍄SPbKRojm>4C }{fJ|IS2FmsnIĵFе3K!' NtN\z\14IUKKtp 'knߦkbe+xMa<ZdٗӶa GN^q2AckÇ'#Y@7nEt'5] ξa{&zUɗGwm2s郌KCYDcޠ 0s{\ӊzIdX[)Ws<S"nT@9&]kW=MRcu#Nm*ҺO8XReFeQ{{oc%s\4 e[EAYMi=Ԏ{sy%y_<ӌY>YO](6:ᆱ(?uV{_YK,SIq!R{#xՃ#zE3^ #f܋謗7̌H),BG$ D'*DŽRAVr/I=O8W[4لs4F@; <6[cΒ zBl=dԲ-C#FJ'75(Eۿn"a& ,6G 3:FP12O 2H"̅u'8y䋖G rIqD5N|b{q_%㳖:q~{m< 6oqGQȌb.A#eH{4DacvvXnOeBh⫝̸\8*i:i"ce }1lX̵Ub@By;1* Ev"j`*=8*5=wG"H/b "}\jx !O(RY m(JHk8!9Խ{JGO2L{*tkZ&WJ"=zg13*nű;霹_Tum;_l|3t2Zf WL>ِ/.q s&ez>RuRk*slYFs]3atfsjj% ]Ee-Qy}WKTkEM|:rWJr!ApF7~S^E"\(#c*HjLförGjd9fEΝqql2g oOg--2(RĒ2Th 6%}Nvނ\6&8#)%D mC Iy[+yo'{FY@6 ;zcfEhDorn/oٰaiZꛖ O8UG0٤1KVd @7ߜun]a&a1>c`:o3Ǝ)$ q O#viLux^.3,A2?]QAA_:ku Q[o6b(((I4jEaz-Иb)OܝaC 9+7%D4OS4`kq_CǗ/̳<ʟ/ҳV_:MKPQ`mۏ^c:(Y)yj: bOkYT0R;Ko1ҔҳWT+'Ƚ~fRʒ_m? s,Ɣ0ȩaPZ5[M}MQY$ W*G,F@c $ݭs˚$W8䅳_qhyR|mGdX!$ȉ7vt.'3K\ȀYr9$a]R3J݉&p,Ic\ҵj-# Ӕ tXo<'g:!T k{wJw7S%SȮeʫlkqpӮ̻6̫,%DXFw*cN**RO}KTG>S-7L%'PnY _e̲ 6n{pUb!\yì&,%r4I66ݱx2i|^FO3ӲBaLYA ?S34 [ԏ> /JzW4Z$k`.zX$D1~޶!z&A~nqm\moj=*xM $O`v5+a+*)#gpmqGvtEYɕt5Tљ byk{bkC[IMC*g1o␡  382Jx*<j1+JG]z4ɲ2l)ia!/+x,m{k Ƣxid`C6omWT晊W#3Xi7XßK`)b-4/UG[/{zwSxnѠXXw[4W[{[qsSYVnor;⡛3PkM6;qaTNe$EFRB+/;؜ T miȸj,P06-" *IxpXGnWkaveQY>o8+_cʚSSR.\m7"{$؜C1ƶ&ƌcO3cߜ=t9WU--T 9bm,뎗[IuM T*zHn*PO[?$@ɺzxjz4$Y?*0g` \cL5)^_7QC2m`M 9u:PR+cV3I!NKXj:xa0x8ih@X*pIœŽ 3b2anm'yjTx9 oIΩvOđ@؂l7 \W)L_;G+y{,{}1qɲF|:ꗂ02%n =n0+~RWߌbIS#GELnbI;{ %*ple uYy`rϖl0i*BFXZS<0;1BVXnIxcZfuq^gR"PO'&ɲ \$-OmiJ QRd oHЃyƠ.mMF%HgB2FTm6JH1]v?LQVO7̺It\LUf5p$ZuK,ElQ3_چ^WqS;;?M%e>s[OXкP#?hkJ˨ʣƘGz8Qgs涹v{}.v{܍ oBARpLv̻~NYsYK4S"Bdn@RX؍.34㓃 ¼ΜѣeW O\LueG*4;b\s\-Bn-~2sZo=000Jԉ&)X,-p,-uل$RRfH^XHk-poǶ RFI2)!Q<:3qܝ;{W--T ͥI;1sYv}NcH!Y X]Z<\Z0(L$x)3$ER5鱹7q|Z^I˨)jh[Fԩ%*-EVfT̩:yWHok"6o`@&WЁE,ziUHqvq#LMMK u*Y&)*6,nֽwGS5ǎ9'şL/Ӱ+qʀ Ɵ6yW+v'vbnIWZƎtj ec}2a8nZ m{l/~!q"޸4cmű$\q-3s*H)A^y?8sxiz2yjHŔ ċ1aX߶;I}9.dP53MdoC%$[n0sV%hCfeN{Fdd4sE.e:#܇HQ}>E 'PE;p;- z>eY>o͆flWje`P$v`.\߶$(R|­&;X _$rl#M=0Mu,$I}:WUtw裁(^cieLwk8oE}%fieO 5=VXQaג]/k]TbۜJecdz `ʾ]ͻm7CI*|J- yt7 ^̱Mie:o9/9OHOA͊4ELw[17)nm||UQ=eDuS4w7fbnI856VR{'~{c (&~ =vǝX~qB^`0E4,nِ{R/%=c`v ƮͿLnrMR 5<)jKi "v u HkNaCK-?*0nl{[<5;-!3m/rAԤ5鈠cIBӧ;[kqE\)$fMS#,Ǟl6)@WgMɑW̪ʿV6l<]|1xʂ&4N6PůQ'ˁꏆ%}Y13f1tPA]%Z2F@<ءfYNk-Uul1EmQT.y?O\*bDм,co檒 p+{G!L0 P[=/؉(A$?UН J2X) JxrO83L?I}:_R.7}Y,0MW%yZX\6Ѯ@_qҴQHV.=Ϲ1*< F/b|֤zhLmQ um@k=j`o:30 J#ba}˳ޘ.&yQ%Qr97Il R4qia}1 jaoAųJgmKa/aW#v G{|} f4=4PO{zz߾+yBDHMI=3KL}#17ͫM#KE$-V.E2hy厑i|H2rEƫs t#<'hRxхG]J.\[?PEũilmH,AɍŝR@QRWo5^ޘZTBn6< $LT%;?7rw]ԙoEUy nq&n{s~l/s1<ڧ:fjS8v0E83cn{Ƈ~cB,pV[e};<F䓏r7˲z<j:8`bMUBќ4H kz}qX"컞Nۛ\RnF8T"tJ s5\bJa~3VT7*F^0QPr=xs3) RN$r7[{u< J}lyGWAQb^dH_~HxYUCQ$*iLl؞*j7@fxbv;~:ܐe3GO䦄B9y:gGfȳ_>θl3gF9iNw<9oFO!\+ˑ1  <*n=yDM==0#+;չ&|. 4ᦒInv9RfrVfS!YPCnv 9*Zҕ%@$ Uw<^pL9!NOmb}~OKW2n/<>g֙3fyKyk2gF"*Ё,*M)oE75-h`#PB9]\u,kT -Q۾=pEEi.YΛ[Usbu]JkeKT52RtDof[}0TO fH6]?YMR5=KPA_f߾ŶT ̤J1C t.ge:K" #{3p>urj|+d$u[-,M'XU}2 kjV,uV6 ᬾឱ8J 6bNj[fFz{[lޚXhZBJ 9]<1Q fw iFc4OEC4F]`ޚ̰]Djc} :&i`:`tGc lUzz\BU%:*TWEG;ۛ 2isH)rY ;H2l4܁ֻ)窕9*IC" Lh%${\lu?S%VfRA @ V;y &x*_cj]efBM< &*om=Eg,&ߎ׽Ĺ=JxhG9ᅩ@mov5uqF*nkyDˣ,KO msLP$E 4PN}Eʃb8<?pydcܛ.}ŒxjjHiXFig,'k`'s3[8Cen|sE%XP)EN{_3Q*){{SA :`*UҠGF$  mS_YK]=KT=c-B!]'܏l|-leEߥhiE\RTp.eEJ076%εiF,ߋV|%g+hȩB伯3jhzê $U(l% 8#q~H_X! 0ַ!-AXbp5}qҤ T2h ȕS;ia l EES1% m*Y*e-Ÿ=ؒHEƑWc?L@u2K!#.Ug!LEI1'BIrFnn;uor_#Xkx8 sÏeZ F4rFT9j'5LHloCzS-j ꚗQ 4H٘1܀-[0U<0r_ gs|w贫#4q(srOd/ WORQ!fujgf7+[2ף#dX .Np.ǽqͧ3: -=Υ,m\0K!3Lde[ځ:8B1bIV M_Kzj*e*֘شKy]%O+mO7})4 (b:x@,G %!X 9Olx>1;>e)صB덲0]+߀ĵGnPN1]cUToOWK!FoۜEP% 'طk u/"@I ؖ}Lh9#'g;ߟ|T2sZ8 h+ onqgsZzsRȠ_A0IT4=*33i۱~m7壧a!C^yo`0z8)6Rr͎ieb$dEyعn_Yo>_KqX6 |`;qkns<Ʒ1') +ia`(cYnsf-|T+M-np~iSȑ5<.V $CNpH6i/Pf]M"8@w$m͸'MWә:I0 _ zj*6O^$i6YH\|*||aBYBĨ9g016!m(P !mIiѩ<)#VOj(Q%c+{ޖ8s S# KK,:2:Zz8ISNsw3h*4n؆y=Ee=4 eYW}zq P%T&2@<\=p WS$i:<}0™"'hyOā9ƟrtE9>Q(lֹk۹7_KcvrKM8 K1$ʥΫ0U$J̰.ȹ@cGCTL4  `#%;kի~UedJ ͇ZBF[*%̪t Gv:ŋw;cz*:μMzmv+k4&Ljʇc6׎pubݿ'4t-=*}K"Cg:I'[ྟƅE-2"/8;Q;afPDБ,`GPtB0.EͪXcHbR/ᮡxyPk!Gn'`Ş>,aླྀ4T5-O,D+XU{ye"=|MՋ 4i -5muFeBHT*Cs\0,JσSI[6`E&w67(~ɩ& m73Zzklb|0djzQŨv;p5wlӧZgFєpwI#c,%ս{wz::51H> 6:diOop?L$ 3H7Sc1;e]- EC?!Yޟ-HWT,OCǵǫs*[IUV%xUba迄>ψY+¥Zv|5k,Bff+ öƥ⦓#0 \0a4էˡS s\OM2у{57k&I攔$T-}lHؑ3N'35_H`;0 ^>oQuʒ"kjD MQJ[‰'c Do kP~**5n\s?_nؑ2|5e \e> ꖖ5bLz* d*2{^1mZH㦅-ߟ_cGUlu>SZLHckvº)wzZIs{ n/n 52:jwZA,?p><Ե2tZ;UFOmG=7z姧 Inw&؎xÜӥ2|₶Q.ĊKFɸm==-4yY z _-:3xt0J^h ji̞;̤9mdpN[{<=̫jfT[Dv'klf^I~d$,n\4E\ȔRQ̑X_kl:)) DWU/1$a}PR%-aS`A?| T)aNa1R[Ȓ"_>Ave l r:9sO "4eq$r81ߝr=qU_L٦m"G P'm$8i:] jHj. 7b{as ꆥy2cP|2nU{\4ifb9HCIPn{w +r5 KDuhb,x ~_[{]g̞%Ha;acuUM4B78y/au}k5T*h˹hC!vkq0fP)d Zf͸}=G%CM5<[x)$( ##3JBIeL6{ !0 :$j *#zjjZ}ܻ0ɱ;>V:,TXۋyl8"I]JYkҫh]htF*[A6zqF2NCK_k}jh> :|s}$Y#DV o DQ. jv+vn4gM1%4$SL9m>0KΖ&k}J,FX(s޼#0U<-}vmЂ#^X qzw($kK]:B  ~tCO.kUe`d`J _}M++7Nm633KE%$^,Olfi*xp |LjaCh}7L , %^=-]l~:t龛ܜ// x^" *i[Y*Eʺirz8傖KF%u+!NwltZ$NJ%X֞8{JϫsN9*iLji < sy-EhPFYf7cŇߏ|Gdte$e+,$l"k"A c}ü;ɒ:ںeD" ;v>"͖'g2Fȿ۶*?!W$:uo} `=y 2,,\Zx~U5\q~+8l25C ko8v߼\5MM$ˤ1j:!Aw85&-FKZI _ UqH=xϡ8tHXfEi zxy|ڷmG߽awMAɛ h1P7ON1bs؞ x Wd/񞛛,2TcH|bv$csϳ N oɱf;zGPcMRz4C\&/ ǝ"&7"o:Ѳ:.,^b/Y]h9M1=@Y"Vo.>>J_VR.y kk\sz$\ ȐNWRX [[ ,0&][* N!an_WBVچviiig"*x 4#O{MY +*\:Tw>޾Y7 nHo۽)j2(e\+Q[/ak\LmYZuxZh妊9T4ʊʾaɵ#v,rb]~(EQ}nlÐŶ9Vs%ecHi}\;zݼX ~W-{ǜPКZ8VMu(]arEn̩Z6ͪҚ }vԻ6ܝ7TRf)GKTtqI3܀EKR6|L)I K0yusYH"5>Pm} 2ΕFuPMK@$XnXnO,ҙDngW0au w TNmFi/jHQP6ctQ 0kuG쯦 mU[A<5aзw$0<=oo`N ,Y:˓عr֢?(w$,b9cu'tKGKYA*4tkgAR>WC0aEt={Q z.kCG5R%$}RpspŇ)i:j8 O2[Pֽɶ(VK]fWS>udmW;qǿ8t̙]Y\ޙ VTmk{vŠ^jic*+"[kH~p\0m5gKM-*Yꅭ TJں9L 2"Eb7#h*Jȡ0@\6>EҴzRi5\=1&]Wx1ͲdB8Z{*k %|k4fF M%*ƪlװP7ۿ`腣GQ"Ir/e%{^{q U.`M<)뜻&~nmG'ϳ5˲-,)TŽN,,Ա$ql-ahңQPM*ϯtYf,<6m{y88񨖦,K|HC(7 sY Ij,9eFak.6p jY5*NU؟VX2hǭj ܓŮ}p|jJ7F̻K7;eֲ@g>S!aJSL \*V<ܛ#>u2vYǚʱf:!յ";[saSRTSRʱĨ#WE umZc|=zy9rh:¤aGn  :usV], Nܓ=GS_SWMVTC2zub.8=C `Rje Lޣ <2Z(/1S$&9Q7c+!k)]摋 hƝL@ (9ZVSq$ B܀ ItT9--l Ne4ܑr\یu<5Li5HPTt(ktŘNDdBNl\_~aRf4rfA0ԯ%Kw6?{b|j:꺯S+P;q,\Ϊ2ZZjXY4bYnwm|diZ=C"|ya}w; >](Ҵт$(-kATf?`:h)ԍC6mG󀛩Zhdgxu+@Kr< >ye[S]5Ҁ#Hs~E̪CQ d!.$8d1:065F+j6;0]E Q]O($% q튼Tʵ%>:147r6l$T5r%>[G7o[UeԕP:INC5oT) 6٘noao{* BRb>fkE&k͡V%K 7 &(J/5mV'dD-!C[am;b<-zӤlU#F͸Srx돢Kk:?0&1J걽ܻi6'`-$1T:Z/e2jؕ8]GY2tCSQICR赨 :^)l':L׬2L#h>Z8;)hI@Kn{cWU&LPHjJ.۩-mr?"+sM$ыDCglOnZ\.uO\-!ab, ILtO0S cImFsr(g*<4*[~et2W(:iMe9Y֙x*d/76F%xKR3YͧYd \LX'YLRjtg.e~YFC"te>[U/QTڿ#tGP*W ChrOQ]%hX {{kӌAM6e%fhejRcd'm6lkYqeYgZ˥H_eӷp?+*fU]fHYf۸4<1sm2ZkO0u\QS_ef@ svg0\};; C]سտ*:c͇FV G-A a߾I[SM3_T8ff51ڠT<5`9P~yMUep/QM$1%0@PM(3M!-e_1cm{qk|U)2٤,ffJI/Tr־' hh੤f%@j~_5v`Y)n*i8@i6E3!,l _F3imC妇•[o=;CH'EF mn8(hқL(q˫3)T[fӤ\bԏ4ePLu ;I6PR Hql\_BtruN<ȈId ½<Mww/I [D*~}O(ԽUY3wqMBĊJ' Rta endstream endobj 2684 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 595.999 420.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2696 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP2 endstream endobj 2683 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/leman.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2697 0 R /BBox [0 0 596 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2698 0 R >>>> /Length 18837 /Filter /FlateDecode >> stream x;,A*ޏݭ!Ȑ0dE\8rA&7?[:h?Ò~ڧ>A=X^ *O sLSSwyIYh6A f#=w=?85=\p ,Z:}{!h?lo4FϜQ=%`4y735| ƘzlF=\0XEH `L}%`r~K^9;`AR ,(<N!NfR)Mo;'bC]ëO#)as)]DY}s8yxhk|ÕQ=d{eOC:k[gpe2tV")z@o:kUgV2-:a^!/vDۨ;T#3Z#X(pn' O j+lh/i]^]X4&%?g2=ݰ'x;8y=VsuWF3㒷= p 8g'tpNZ9ٖ+D:_W8$?0eŊV 0q8;hVQTWHtP m10?V^.2|Oʱ13}n(ÕQ=d@zX|`bk!zMɿIu*I Cw D3} V4iW#Y}sb);NsՐD(tD[-~oC*JO9SFWFQJMq4\Ñt~ تt:IMhFGFg@_EF{uC!R·zw@~ eB9䥳a[)cDy6J+ SDf9󘣠BF8 *|7c7uP9K[ $>],5]ׇ/|[ K0]"^sVs-=].((xIaFK.9Y)c\-|F;K"93^$gdFK$qq}(AT88HΠtFF'_9B|πtzKI"+ Wm3<"mV/i>f<嚼@!#i)PpF« gq.oQrpڇ\ FSpWܜ>n\wQT|S AZD@ /J{->f=sn5/IQDUPgQC0#%<3"RyJzyEJr|F]Ehɜs\R74ÕS;d͞)A8^)*(+2(hJwϖU[Iy3?TM/G M8{Z$I(v#x"93 A[`M2QGGMXL<s pu:K"%tJ{Ǜy*YtdfsާȬ0tkYUIA^m:q{$#`;@>A-oӽde 0ߘcF%fJNA]=L4L2\K?"wx@w Tpb3Ś3 ֤w]N_Φҁ斥@ILKO R@Gg*\"wdI# VZd3.Bk$tFZRgITIҀ<(ջ%X,l5 QmNj͠'%%JL: T/it/tb"zu&!<ڏI% UqP )' 3}m-sLD˞v Trpçϵ 7>@:|΢#:`6 -ͨD_5G6jegg`9՟R P::7NO:!,_d FVھdM֯\QB3^ȥCמagsp@Q \GnNK @F`A#Ň +4 S Wz<-J 8F'DhF}:Ox33 ]XC{@iM8,aÛ'Ý˃/uE0! P Xy-g iI\FTR%Ӑ0E,LG EnhBŪ & +TĄh甆m/(d ߨx$", TWF̓ J?R&&;M,{?`+GUd@QɄ AB/%$z KU=z2+v^ ZijJ/%ڔӸ5/J'yEߢA`F"IzzA/p0=E*?S.td+\.]z8+q³x$:] ="iiJ{_$m!ltB~/8a_fl!n ("If!anj&N;@c_.%;i{6[.xWt,4K2,8;(BQ"d;gcՃ,ޯ!eQFևD`GIZJ ڋfT^vpǼm\qR~p?SON43@DyAF)rZ+{"2E1 H@SD/Riٔ2pM Xͮ4Z ŻIos /Mv},]ZMKF}D$O*_.hjSN' '9ȠJ3M`K9:v˵Р$B "嵔6!O vQMpy-6F J=T0( ;qSu E=Zd( </0#QQ*>(SW c@ $cz@q&PfF:*\ {d~gH.|o42fMۃm0ʨ2QG`FK3S+.*6k+ivн+:KͰYZ͹+~'~ ([,qk4 2Nh&+z@ff;)?)@Ը'Juª hU+DJa>EJGY/б?׼~R5ۣ(\D*(-t|L C(LH r :g>BJ#Rd0AJo}[ߢ2=au)Siq#:Ռd,Y\p\!4 3^=pjf^ϨJJsFZPD"9ep5|+ @3#=V?EԞjS9(Q8Wr)bSP$TtN_Yl7ѡCF>d~kr\r#?Xq5,/RǙ0uBZ4ͨF9bj/QK;Q9ޢ B])ڃE;H2RrTGb4-PQBWX˷llN}kRBםwp2Y*پHIlk~;( K ㄂VGXilRPMcc2"14|UjEjO(5>qc!..Y8@@ V*FXIHȩs Zl( ^ E3B% Vp&`>A τG V>] TH`\rQ-gEǐ.f+TU88z2䭂zEۘ_[uxYgS;|]b{5XʷzK:dY)3"ʲj.Eё!1#PG&3"^3Wq)ڸ|2'QA'$ iF̰ f?"U9L5L]96(0a2`XΧX -G I)ZJwB5@ʟ6G 0MAGt_s;jL<^H! ;}pڇ v%=W:^JXZ-6znJ h_/`P[Uhz:Aꄣ[M3*^[:#%3" >Œ?#ݟF`EVZ'T\qrKFk[$@IJJW0bBtaWmJ$TONtVpp@62:P&wu`D5Zp2T?әs#"@VJkO>ޤsV5O uY/D|S}\{!hs^5^a)R+g9eD N/01mg0ݏ^ƃ]6*;')z|SPEa"|<::A$RJ>qwC ̈xICQ;MA)4Evva-z.AVҳ_"^kO1{hlL©Q_X. %is@I%7HM ]DɐRM TNVIw4G}ʣx"ezɯQG-(ܣv8ݻeJr]2xnƞETm҃QP5a\2_LiĨJ~l fM3nm}Dk;2n9\L/}3 ׬S;AFԲ\z>HyTR;hq1J|,kDP`WE QTk 5c{NUKx#* /)3 ́GF>#֣=\4}%,b9 ʃTJ';K dM6ηdVě÷mI"[% \J0UYer)Ԣ)idce//o y:ꌇ=mtqRRG-rF<\ /+̯-5(6yrfgo=^!/FmՃBZ`D]H|ky=`w]٭` =C&ʁ;j`?2K ,P O+jmctBJR`v`= FVKujoi"}@Klh OTQWD @ ꄊjA?!a%6[U31W&A{{*!`fEfȥv\kPZ o_a=X$U Fv+/݂Fsz?H{>Iڃ|K%/pABq3 nlGLbūLyW?ެ ׁnl,_Qj8 =T9)AmM׃A= Wzca%;oR錸54#`HWkIDF x X[w)UMwC|%02yVʓI90!zKʌӞ;fZ\\mfQ,.$8؀;8-F́Yhk czmXB߂oh# [ ! ħ|kH,ha9`uT GE S?d ֧D)}ׇEvQ4Zh@,B=Y##K궾YգC+SX xjXXwC,kDlN*D܋J 1~tkHnPEJ;jvLj5r|d:p^HQ1Ru/rv[Q]z`Rm*CEi'n"m'M 0vjӓ|Lr^݉7 |)@ כ(`бVQϒؖ@'BПA#ÁRg#(:ADFC//@ F|Ǹ@i&(uP0 KA[ajVP S ]u6:z擺<ޓ7P{[H`UPj(% GX§pX20pUC51Z.h&Kh7:}{h֞=)O3z:7څHxj^#TZ=2#TA&*SRۄגF*|TJ}_jZNACUPGyhXϧyh:3^(kpFfTz ̐~ 5 Z@Id)4iM >`TAɬ*bt:_|;u$4F<= ze**N*]ٛ4&MM[z|=Ej=V!@V^` @\-"Oo)}IQ$ו^u!J0Z)]/^laA[},q<:nPXED\ܴ~Ϛc-oE􀗀OIsReJYRȥBGSGX l1e)HKf0+/|¬ B0#i BJR5A c EGQL(f`FZӄQZ|ߐ,b%YB_4bE02%"Madd+Mb34RWnkSnuֶh&/!é ;yZ%";G5{9d4r.MgkB@q*^D2!5YjȪIQ$UkhdޠZy_CQ0qֻP;y/uX6Z!FIRHg]- Z5t1+0|`}S T5zTW(~T@ ŎEck 7 4hF9~8ȟ,3Ee;_%*x \0+ ᫄TUJ{Nxny==So;.w{-^_v7kIG#^F~aLF dSqx-kKP:(@TOAmph@4'QrkJOx8OOJH\K)eݓ6 4RciʨdR{B%)]j_*-eVodHpn֧s8p| C 6=[ω0}Z9hGz0¨FoOP $Kx/<J|F&_[Pͭ| s^Gi|1apklmJk0/VOaqø|iM|&*-z6.߁E,dnim|-"&[g Nxnh?u9(DO:uAጺP c ~ t7)x7Nn^@ !ڞK7D䋝:_DCpOrQms{ܧI-`veQ>i>*Y9zdI~d#Z`,[f+myʑ/asЗoO6V۾%6:Q+!E$'ɻLffUiY2-v|Mvpd 7CeЕ- ǸŤo{^s+\Vy \5GS~YsUGÙwr`S-%`FE|T'ODRS+hZ[j!N^r1U։2LE:b"@@)޴:hJ.ГfA\{DžT ['([z@N3(览1uzUY*GG]ibi4{bB`BMqZԀ6J_8Ts_8э2f˿&o j ^[>| yݻQ_vQ{Ymc6oSyK=XRJNB!UCeozx:K:ͨNSbGfBed)/ |.\\o{ݙ# ! +^j`\)LwǦOiNkwbK,P9Bc؄z5s`,S\X"pr|tVD0jQfD:hF!4##!:#*52bO䆲Fm)`SDyK*hB*!BJZ=_ld&W#Y Q+(o6麖ׯx5QFT5 ZC`,Ƀ%LNÒV3!z 2tBBKyf;O% G/׶%AR( muPA6B{l`񺿛2Rȣ"K}Lj):耑+!3}>ml^ݴK4={MQ=%peZ^Yh.@Uޥ{Ru9j:{W 9z-%0,5 k[F1, lj&6{yك/Eaԙ_/v 䄸#Z=d@,Cv16 [T *,CԄ% _wK3Zw_5VO gVDzK`wFP8NrH w\&^L+L+,P'rB,@6Ïm5{;1=Uĝ|} 5(ΦvY )1 cJM7"+djdlwPdZmwnM}f|Kû.⻻=\Ԕ6~cu9 lap@/M&Ysn*Q=d0ZR^[nmc((t%pѨ3Ʌh;E|Ms&6-|UMhnUu*\`9#}!xG+!m$ +L2n+q=dDyE656o{M6>f^Fܥ6v=ODf$d0-7^uq5}u .Qut}A֧ ևE1|kq# _"ZEAGaz4^XAZ}PA( iȃhAQ= ;Hɍ̍-5(E\{B:䟨I^z.c*?y,`F(9D4OO9î巽|qW;2<NC*@ A,(Tz{] T8ȋ+a'f 97`iy+8%ВPG,:ԣE{hҊ&$Ќ˰Fd .+_Tg"@IJIX㑥" -~v2 WwPp[=$Eh:#K$BEž(UJ/^PudhTJ U$Sb-a5h* .,k4  5 ֪'p'U&I|r2$jRʹzj>|WfҶU%חoY E]Me<'IA)if ՐY+է + 넊V1cfM+2kT-uڿ|C~D9%`,Y!%w]湈TbI5rB3FNtaFK*̨!b--ZxޣzE橿A7B؝:],/%Y(L:<^wUzP=X7E<(DTRQ"mGa6lKBE8AmWnb\J5P`kTj%E-`+R ⵪oD:M&gZVDid Di܁GŜ֧$gw'TcD"L4#`JgDzyF_Qd #*#}])RZWM4ZIb5h4oo˨VjU7exc.c!^2Kb<SuCIj,FT3א>e$9vdKT&ѭƻ(${Sñ'2P4kr?9z"vr#\#7q+Ye\&{!t =)mGd4j*{ ŝ,_R H"D\P*Tq;RNe. zPvTL{yRnN2iy%(H#T8O2- .j lZ1%V4Z: U/)p/elݫE=ttTۑkN,Q4]!azV(too=?}hbЁU[@ d RU3zj([R1@y]'/ vgUrpUuZk2yůZu(Ie!SU /V,eɩ?!y79{.>&)TF5`Fe*/M%lU3M,GA^iiU2*kLU{y-+`r[94uſW`p$.z($X*'DKZJQVcfwP*>RyLi<CXD(;zCe9?FxwPL&ay`B%$/(lZ[4nci.|77^PxB㺰=v JVqdVk@ H!UD决@KAJr֕nCy~Rۙxz20"T`B=za@F${5eJ239u"T=W)_~KY!bVd ==ړI|G3BzD?Ez)E^7tA1"=@hV21JHdI. `ުOSI+IGwAk38"PQ 3Jm=@ 6(fS&!^[Nci1pwJ+C)u`/F -4TU5Jx M͊Mv{BJFuRNHhьsisu- lo;9*%{up~IQCE"F#ADbСR)&'xO erOclprGY+s}7QTD#h3E$f%-ЍŢU,w~$kD^5ynV3q> !jOu-msAG99M,m,`h,S/ GiݛoRxpK`R%K=Q<ǵtxhʨ2Y:OOZ7 Dty8J`*c3  8% @DL-NP"FZꗔOTvЄ &+:/z 6tf$z`Fh /h"^ Hr6t$K6 KlVKQ~IEE"VJQ?$x'RGf RjgAcF?oBKZ`3X)["PR $E@6*&IRWI×IkEYռvo1B^-eK s90O7GOX& j1Z[I<V}Ř3Ý !ީUAm2=*擲@*j괩.P@uZtHQHQs"e"Gyvֳ6l9Ow[6jkG@'YYyB%I z pF?=Im-ґ{i3$L6rI?% s;T"@鼖&i-f}HѨG:q IԻxKDjݪ50U? g`JB5rVAFݧ[!-MeRJiihűp.C)MͷE<.c;<ߩE<ň'ʓ-zo62j*ڃA5h;Sr|}7AAVվ4ˣ%<uJrlKʐu0yDHoA/]ZG~2h=nXTO㺗,-ÕQM4lS)pyԚzo9*َY ;S"߲ *{'i2Zt0yj$AIZ2L6`ʠM- 01=T$}mVԁAɪJѸ$nlusL[i>23h V#[XW ?ݔ$FlU7{"R =mf0j6gϻ-kT:ٺ}[W"K*6;V<{n*f6twޠqX)a,>k2`P{Oދܢwre*|9/[by[ab)d6!Փ4֜cCOT>)>pHIrlf3#E=%G|^m2I|qQNOo{l\[ORu\hA#w} lsnCM[a٫kkXh =!%?CAӗT`{TJ2&S>I"v[/s}"λ L4rim6kx<:5|uXx<*opQZ>֢W0x^_|5I"(قLCܦ;N@JfJ)$fh^27p:Jʱ0@r;8wLyHa؍zwS, %:29K!n1C;(r"= 9++j\ V=iLXZ{ e3O4Iq1gINA&B2j CO5Ũ*]ٻ;ˁѣ8*L$& y장 z*f9kq?rgSLT& C x=w3f:켙"9I,gJYF9}>J~b栧7s ZغAtȲ]Fl%ki˄^(η@:UMwY; T $1d7p6bmΣ" c1JNvۘĽ&dK;dad4iȔ| Ϲ{,Fu]>g7Yi'uԷH0se c[ ZapX%4UfmvK nvd^1%n.;y@ #BT"dܦ8-Y±4j. endstream endobj 2702 0 obj << /Length 2623 /Filter /FlateDecode >> stream x[Ks7W𶣲jwm*6Qb*crd.I)$~pn>&rICO>Zp99v΄]a[/J^~>ЩuUjzQ-եvmb"8 ^w?Vm}r)_M/ʇ=[orHFnW B@HǙwDOP!M433d F઱NLo^Nuge^vJn+ǤkiUep<ʬrNI{,a2C _S}c%Rnj"ts8K}\$͓MOT7ֆh==n(767rF/;9l6ǧ3m1=DC fk/ND[T}ˏޤǣ,p;|OG 6*މ#*W#v/59Jgޭc}|5x%xT;D/!YKsfE-E y`ev-;0tK,/m8cq]VS^X@NLJᏍZC\f0qv}LFG.W*mwJoȡ+WuneaA@żWJs{EDb\gN慆AcIP~k%s% K# !_BoV9dO)z]U ʪnZ-6)L3s fdvȡQ ?3zz8pU'ɪyhU!vZ$`O$RpzF R6,g.{B&d]ue56@.Ƅ.@ߛNq %FTul]5{r RLn+wX@V, xR~ŗ&IutMMfC%"*o^-߼~,Lۛ*瘃81y\щOOQn<:Omq}551?sze^= 9?3RWJb.‚QsݻE H^r>t /xNj#LgY{8pMIP]KW)@HP}zHT(t``ɝ(PN19('p$2qc5h4Hӡ#d,)^7HjL^t0@v0q09{~&S&*Ǐ\?Wh7/_ ϕd=/i MfꟗF@դ*ʙ)Jyi X9/ B T4<( <"P'0gpi38 P128??0K0o(`GM| T9=jippc`LIUq`:8xJ+P:V2kOPݪM*]=,vX^MI.wjRNgmbw9wL#τϛxv À/9(\ ggp`N*c  =Fث 1pInð̉ nldNhV..`o9Bδ>Ԅ5ƙae@Mhzyqww͔|eV3n"Pާ2b|MՀV9Xlxc% UMi:}\7S]7D<{FʆWR0ݴH墭 r(r|+r|Sy9iR!9OEUW8l.pkBU) 4^9 J%{V6Q˨*#E`W&N,tGAfhڡw̺0P9U-2Ho?|ծToFx˳C29YIDMĴ ~J 9]J=RD[Nwx4tزgAoؼţ}9kDdfH+z߀.eW" endstream endobj 2708 0 obj << /Length 2726 /Filter /FlateDecode >> stream xZY۸~_G>&%rfZ>Ɂg\~@h4'?^urKB&DD($OޤDѻ/@U*Ƒ&FcFe*h$M_ϓKw?..p$#cAvi G4ÿg 8:Q ßIf7pû_GGHAkgJO0m&XAʍYƤb ~+ճ*&czBR[X EyĒNݳ7](y(SUŤqXH(R1DJ%≫)~mXQV \:+7::L*|)yl*ѴUeXF%HV䘗r-DsR"1:$2jt}*$jʖyLr*6g0Hx1;&< ЛÈ괰ɘs 5x ԖYUKVj may6٢M]?Է#\}}.lwUu6+Hu7ӵ\u4Qo@\[Lx{V: p많ElʌX^laly=S{Ey9TVf& -(,-j IqV)H4S^m\cg'Sb5"Q*WCzj=m5䳶3G-\{gu?wz]YLWɋz-}U e-r;B"w gN]*D \RL"B/dq=şb=/)ȏ M*uT@0}$*ńN RV* 0\ݷ?f߯}g>4wϾ-<9?֎p**O뙱Ԛ責ÇżX4^Fd+?CuY̊eK-:Pc{LAFcb߹~Dնt&O$Os$R[1 ɋMQvN7 ]j<@A1P:O\gab'(.o X}0GҦSH ٪P1u^x* 'X7U"h&  CԺ?­4em[!P!NE¼g`o.wȬEb.4.7MВ޲=R" 6/A׫Mp<6YF>~i bjYƒeRkBV֔C&!,=&&,JeX! ^3x0;cz5&(iԃEJs]3J="S :X;Jڱyǻq=j\ 9P_Y{,0SKE~\Ae< *k]gWs59 .W.}K}KY:>6MJvo}:vo;&VorVT#t _9B@Nyr`^?2̓P.<9;8ʋ!fQ^P^5=82]^wlW` Z:WM@| ;峃C˝ts] d^YHf4QFc$-lԁKsڤ31_ 2fO =Gsv X S-ֺ2eSc~5»f5}ۮą]kyV`ͧL-e%@YJ.Vvg!}rYyh,-Q{r$"LzaC#wݦ? ]A> K֢1xOm$[^D :XA s"g器56Y9|]JaΕlB*EhĘsfK6|v)qTii~ di oe  ;z#`]Ȟ`IAIG0Gv3iUݫ;\-l(Fh@P{954)"!p&|O܊G#0Lrw O+!t7ٞi̹b咧K>tŒG^g1W}*> stream x\YoF~ DfA@`Z) YmhY"H%e5z1)jogYjG~:{dM$(EDH(U vc 6ĶNejĸo~Ia˷ hF W} |60DK+D/dBFRB!Y$rRIDŽI5|6,&T,<I>'gl9E 0CDW TpFmEC[fXu܅znJ +׃843 QҐĸnkPC;p5ONy|;9Rb0{ WU#idU֕[IM"xU7Tf[ @%a+RBBrMAN}]&J!>N1 gO NhM7[-[5 XpEk"AJD-$$".`*LU{~Yg:)~,n.i%bA]&׋RP%q3Bqaܓ|2Sð.ՕBFWHZ;5zn[I u#~P'HkN7" *ق\/øsBdX-#޻˦ɴM <@=ZJڛqUз'CtV+ р'N $U AK,~E_lz\ݳfॶ {  0hj7K{T]٠VgVH-2IW }%MK""\# |j%1ˢx?dH7ER)6[p(6ҶGxĮ8Hq$HIb$$u$I;6$plY`I iﭴ船eBDY6wO,׊=Nq>oxQijH $X5f!D@,M#}S&!`XW2ƫlJlzMJ5Iٞ{JMj2LBB#J9;lTn=ƃ#IUsB4kUsd@C_v^!|+Q. g'7ٗ|ނ90a'r܄?gR\F8Z[1eQ%joWW3[ꇲ99Z7wW'ȝ :7#HZBD?.I 7,1KL'M#=e*h{^þlhOq&v'T4^ L KӲ))FjCa6 @3U `$|tZD_yZҥϋƒ`l (x;!,:a 5OoCoCbd`R|vvĦ^/QSg]nay3fJ N5 S`4zcG(J]ç){<?T7ےԪ9H{V"h. f㹐r8AS$VВJ/^'DanS8~X^ 'Zz o I`OH`p;;оSʙg-jۖGh;.bW Μ1-X#:8ic|l=; endstream endobj 2734 0 obj << /Length 3171 /Filter /FlateDecode >> stream xrF`vHJUY]2+$X$P,A6e+ _oj@={9~5H/Lj z0 ~O'0jp(b4߾׉&'#y/ogOg?2~ȞѰ)0JR W@:RiSDpwy8IvH^]9|{Yvb9H> [1 Xae( lMZbbZ+rSv;.ܿ].|ׁAtKޜ#̵gDR5 xɤqVc.$4(g)\ ބ#l'ʻAV Gšm0Pb9+T-G[N@o; *&%IV%_8#4Y_Qi(t>]9d>_mvA#\ ^j E5ޡyx#2چ'HpNرAm\,#ʼn%[5.C5PpIRuˣJ:#/OA7.~ys~x7=*̂`sC鋂}#!X9 4A)j1>d cn`yFt,o#Ɉ daPRetwWr mt'rA`e@6C1)NKh%#%8M $/BKmuyOzrBp Ġ_>Ph_y6g|UY^a7O&K:`xr0?]kvbe_iV" cr tRC JdNBaw_.7;YI֫!J_!c9H$PR|;f+$B宫MeғO>uTQz~W_I=Wz_WٕV[@Y5K~'p+%İIrg9UȢf2Ob%bxx}67xR8u#-{1{/nD!vU(j2[~e= i ̡Cs2_,o?߼:6<䓫r3XOsT).|-@%] S!yfI-|o$Z[TGw%xMJBeo &5$G$m^|mn8^ҘUnΩr=nt@>?lE gm=mc+盐i1%\+GEĊdLTLgp~r=_/n?s-`}λw( Ljʁ 4X:‹lmv44-hdm"i(Z& 4Er`L8u %j ԩR.F[Z#pyb.4leXuI:D46kW#"M2eUtFMa7gD-# It~L  Qf5iH~ʎv$c-„E>K s1iO--B  O ^5݉VE#ASF·Zow?B>;I@7i=˩$Cei=`_xH$[ V6mŧ{xDGgEZ̳"/s7kB7]unƕ_޾UZ3& &:| P 2`oJBy.i V8_h(ãAĠA` #@dtqu}’Ee 4O҅.>U*Vb lqjSZ~SzҍTi}{xu3;=`V(֏Vַǐ0ZU۞|UM_Gǜ2%ЩGyC)HxьrOƿTD8>!&$)l^_0=2?4X W=SEo;~Ԫ;ں?TѺ;U4HqSxFG5D\QbshıicQܖfp a.RȖ$67&yƏ6i\$B?ǐU*{0/c@w6W= > [6i+Ԙz0 endstream endobj 2743 0 obj << /Length 3300 /Filter /FlateDecode >> stream x\[o8~0`b ttw)ZbuZNmM!EILYn["y.<;o<:%X AF:_ (er0>JDHI2hDhĨ|j7ɫG 7*Q|AG0&kv]esK^`:wo7_DWeV\\\[w1+DXC {F"EA#͆ct%aYv2X쇗nYBI}1-lȨ4 Ytt9oPiCZWkv=,-f4 濷2͖|a5aD@ZS#=$s*.H1P(FąiR5KMApnQQG$6Ÿ̈́`8#~=M>2\OI۳yfoLp%@pQ>A 3de_nR"r:EDXVyCX,5DJU(Yˢ8Lj>We ab`<ZF-ZIC("i~/Uڠ|Z^km6µ&$ FՊ˹8!5E!c$ 5I{HC2Rb$2Gr]S-Š P|H96-fRk|MAӔl)00 +QJqؖ`(C6_3n m]n0k;%Ec`\RRGa!ဃR gVë)w[  rc. ڹ`\{..ăr68sVo]m /!b+@f[[sCQ2`.(Lw00Ƀ钂 bV[p; a/ `'a `؟]`:ahaPGFà!+u8Е+/knD&۰ pmb5/V{l{J)Mq0b4]a4Ni8!FhnKO䣧l7 ܓ^Ԛ>>aZ]p>$pD3<9 <| KRd_ 5:q !N9uLqx8>XclkvA.4bRo!v"{O.}r(Tɥ<;{= K]6Ycoԟ/ϊ/0g9Ȱq-! 6 ?kx"#~v3-z[NM|E|,~v_!+蔯 ;avZ?}v.(-_2v̐Q0 w`,̳Ň:..h4f Ux^^ͯ&b'pyuw;4CzK0hy L&;q 3Jtݢ;GYrp ƒ!6e.O)74y2N堫q؁NэtX|8=LQi;]TulʷW=sku•fiI2Rhw2H GfFpf=cL9剴mHQjMWבNp׌fbjKw U3ۭ RlFf AN0qbm5FpMZvZZL0&8 :2/7_QV*-jEf2qHnub!y: t2pތ$@벤^euU ٛ·^ܔAyA05lq -q W-Ec0)_tZ dnأ`*eKk@EfuѨCI d_"~<|Dmhw"2F*m,8qbTQvړr2g!$:E-A#B*|Yʛ&a?-|u=@aȮejH#6o 4[&HLЧ l0 uÏ={v(^ʔ„uWEw }_RM3grXnNl\jl8( 6[?g@"ݥYS$ \4[2ɍ1Ő#Se9ia pYJ1a. A=]V>DHSɿaV D3]+3ݫw7Oi9"ôQ!^&Hmn60~U ~_aYƳ.=kefW}"}ϊj5 j1%ҿꮙgCVCfzoq}<{ܓ&.u9HrW682|L\}2[cv!QBal H0:ώBxѽm/^ k/$I0SÄCSIE=L1KW2$|>=ަ=PaGץ NG s:[|kz|5w^E Cy(ZAGB{Wp$|+}O/Y?^K?^ve=oUBBCN6T}6]/-'h3,XN6{bH8:;>L2[U"6k++/>ӓ]!NFRŨmIúZ]9VL%∍NS($50]E;+2 ^6Gű.nΆӓT 07tڧ;*Uj SōfC0vL}EImgػ$ïbNي"h=Ih[> stream xrIa(a 'I-ì7 anugg廲2g՛c #mt6ш2^6zM"e*J %8?>tNZFeSVGI<#Gw^acNI١!e hĸA#1nw=|!&@&1 7蝇/I,'a88kNz ޜX "  A #TQ=|[b I+cSnD I͛Vr՟N] v׫|8 *\v2N3>|kAD").rł> #K{"#ц-D" K,S>d 9 ?8.JDu)8B0TH`hR$0eR3*J R,*m rVU>O4.7+> dA0pWa [ONabf]:Vą(@h7*C(ĹH))D1!R5O(aˣm8c@⠭ߢyg˙S7v.7PjG٨y4gl$r P2`pnʑ^/$SϐFGB:tPP |D+|bHxx*尊Fap~ Ue"M8#aQ!G)quiO)K$D%BQ0JEﭨdz!h dBW"jlwL٤]^eJ*87DŰ ,|XGùǚ]g74sb2"!SB6otYBv"uHeEU:En|B*w #2{;')@2 Wfw3\nwFy Az W뱍")IqDy)lMz] ߒc+{ ,fiM*4mH;Bץ̏"J 6KR[O=Ew.l`8R&,gY V >P6laC$鄠F j8MxxY/ -T9J8-lXZ֏W9 ]8LU·bTDymK6a0~u(\:0l+&ɾLpQ$p+ډ8'PXqISri]"U.\ֹъX!;v$w }.a D?Q.@@Ħ?CB_,.jB 7  $kJtSA? R~P '\έVѥ &D6J$uْ)uWӖӃ[y*xET znŃ填I)QJz8W!㉈ $!:0"A*M-uJ{^)IF[Jm#F"KsMQ҂T1`k}L(.qbPp{?F)q@m]d\ͨ*E7טH2Ӕ 1A\STKUp.nχY4ΫCz09keiOݰ?’Yvݼ~L -18<^_^Fٗ4smŶ,¥.OaޜmsW-Le]]oG]h\gW.'Xa:<Ȱq^]' zm]2`*?~webPOڮ ӂ{ߚ"NE?ur|u0,(cRۈKx"drxq؃p~\gv&m1q|Y;sE +}!wKKRxa,Ujíxܪ";3V.8IW3վ$y}"-Cf73WRhh@TlUmÔv[ k!ϛu#x=jz}Է?=}Gc3T귝Iz\0[SryƶN)懚%*qsÉf!cR + ]m%갃tvLҳ]- 5bF:@l2zju8]CGs7/OtOb@]3 endstream endobj 2765 0 obj << /Length 3150 /Filter /FlateDecode >> stream x[K8W讴%fIm2l6;ڪLj[5cˎdwkk$%S63= @(޴G{?>{=|-I1bᤗ^bR… ǽO}M$߿Iǟ_}ݫWWo}x7|c|ryMCRQT ZL'HzA_% <%Bz>,9)H:!I$ͼ(=YUWxE+{ x9q3OB*b68ndb],KGTE[Mv#)ߛVU6jL%[S~wʶy9p4ܪ#[/z5/nh'F&W<[7݉kwy_=}+¸Ȧ˲z`I[]QN߅98h{:s7j?BPPiP,1.7 t dFfګ容30UKe9Xۍ2ܳ? VM$MnNp(ݯI^kȬS^:QYa].pN,lj:]V:= `H_oc[>65ZD/. g4Іњ"$;WI_wfY9;¤Ubm`t: 3a8BA8M<;ʽ%KZɦK=Cw1Z8 "6B2`E{մ?X B͔/^hyVVxjK^$0C5#d3πqS0 )1NS@_Posߣp=rgKēV\S% _3ny`TOi "Ԗ3R2zc_=h+߇m نS1= S1 &~a6nBA\|(q~Q1V {B](cޔ2s/gRCVLǗ Yj`"A` $Rn\jA$xɼ^GlڭpڷLW*%ddhhV$L&u,&& ɗձ< ؊M0N, Db'Vd<쾣A`uOE{Kh8%Ij3YƿQ:Q4aD*8DLN~ QOl"p5h4=5!s}: bs@e/z .8DTFg>ԣ2ݻ&љ_ӟlvH!r+vXio\8v ,Ub?4ps2=~)(C8`,E6$Q[F44PysOxps/nec9Eylp]/UatwfAF{9`=^.w2ZTIg\"+ؾIx%b5ߺ >e<֌2l0hau_ ?<Ə ݇kG%i[1ĩ\W 5FC(dXN 5Hh&tGp b>uf_"9Ʌys.C֕к|cO~[*Ϻ?ϏjZyYb)5]2q70S*7 ~ʄ ڪ0vgmQx|Kj|kLLtɼwX UἭk\?0 endstream endobj 2778 0 obj << /Length 1835 /Filter /FlateDecode >> stream xYYoF~#Azm6p(P(KI,%ڕMC}|Y=9[0ia02OJv"&CQ4d?KFX>||о;සW>{@dDkÙ68=r E|՝ /K(~\N:M1"LZ&>\o}$u|L+u:jI( sCl"5q";8;oN@Df4M $pRw9ҫry~,9AYƝtUfVCl<9t9stM Ӯ=++DyDy5_wa 53BGsdzox2;/qHs?RztȞDiHx:4V9= 7;k)\B/p̚ޒ  A\e<=i%e}8.4^"bP)Zli[ľ6Iʳ7rDńl3ф"2c*qjD(cNЦPb ID ' CiM9c r3R<~\!AVQރ'28#Ԭm>)8D%%aE킣j:dj7 ` S}D d=mŪY ƒxWl53d#iH&U/;Sg_l ؘ| DpwIi_ pȔ ЬݨHN)ܭn4]YzXGS4hɀ 0*kD::rVsKV ׷x$Cc9`9bp;MNգ7oJbyv]mM?4 zy`S (e  Bޣ,QW&7evP\I&v5(Ȼ^K\DŽ(Yu"gDZI@nOxnwMacǬ6Jv+h ZI4\ԓl8golkr͍N'SY/֫ȯ[ebYy%,tɺșG!l#-~%}TM;ǂU~6iۈdkZ)z [=OurCPy!TyU c%T_SwhV5evD1D '39+tx[~x(#,ܵ?6by endstream endobj 2761 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 506.999 217.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2780 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP9 endstream endobj 2760 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/P1P2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2781 0 R /BBox [0 0 507 218] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2782 0 R >>/Font << /R14 2783 0 R/R8 2784 0 R/R12 2785 0 R/R10 2786 0 R/R18 2787 0 R/R16 2788 0 R>> >> /Length 1238 /Filter /FlateDecode >> stream xX=o$7 W\XEԷiR${"?Ygjb!%?g8_ʼn/Ԫ-(T X?Z&(},[Yr0 p2?_I;O)ᛟŢq#'eWJ1Df=k hYf;-j3^0j(-Si-Ix)r>@KݑTbhǥ6rsVMrK{ +a^~k}3ԌASw-uw{,hC\e c(RV9qUDL@C .n,FPUn4z6Fʬ ^;IB1e*9Q a[?v*O .ύՄيEڵ>hdk MH$[ŕ>sԠgh0F1DGL5E{gYLU2]7[I-:^ ;|U1תI C$\gi`FPAUk@X2؛@5ϼBZaYVӊ І~JR a3hYv&1(G+[2==4@#nF"q 3?q㘖] k>Ocr07sd}#d~Gp?AGɓ9"qXMRl#a`1uC?!7yD%vH{OE>fDWo:^M+mTX% 9̃9"6 eM+s4J &K- NwW6a'cIfaR١;RvRviA m=N0^cG_/|v )v>GXvۯf`ֈf%}y5u0&_ R|<}>_ oUQC0cֺ!T> stream xڽZn9}Wm%rofbܱkK$cؒݭKw[,V:,L0e_g:jfTa eYt`RDA+0g-O2b3kI|L:Es#fxG+EVL-dH3BD+bkD#FhAdJ_)i6n'TtMGEW`ZJ+%Z6 S:/"ܼ4hE"-Ӛ ҡF-f` +%g- ٓP00 ZC;" h4Wwb 1fhth<Ԑ,ՑMb!-i`B3(d!{' NVVxfLZJ֤ HKab$!2'Uhpe1SKeigl243| B `N\!^ѐ Lt3 Ob5ZZ L&A21ic̰ )1|ea,Lƣy>e,;;"gk/E&d<N'$-d_q'g?zb[<+COJ>xxRy"Wruxfk[TOQ]FQccgbW;#GzYlYVڲF(bhA4?9M?l4iUy}̎KZC\}RD'vk],Ewβňo~n9\ǷnВӒßVNGS$ր0GJs%USVr 'AI6˟&>!grhEM~cݎ&IFb0Ä8ϻwo}xO!}9;er\KMU>%qJ9FGNu\jz5דeT0|oRYnC/RR--ǸK^ >a"pTf5o{|"ЉQ ÅuQM%-{ܣ^;@hf/AV6h輖6n:0zvjvCGq[8q״Qn`7J&8Ls*I+xkS.žmjcva&qTv5"&ՏVRX*Ei':ʻhQDk3P2"[{5;]mUvrǜ611771sz> stream x][Lwƿ_?V+ց2E:%F[k*[ Cg)A'Rd%C/KeYw=y.<OKlAdTqQqEVQ#3q rM"~y 6oqPEGpYtFᦸUJDIH"%%Q"AThxw"Asy EDsdYC#E[8#C2*e,!a( igJn'6Hkci7?}2 U~oЬrz BWB[È thn27?z]> 5aAsɬ|6}2:Z9!TT\كzN+PX lMKKwU;K80Ud)Lʰv@+FkP"@ĝ@qD<{o?] XZ(0$6C124&o#up9y' @@ۨiԗ*h>\QHf צo;eayZj޻0a6_۾zE˅M p *4!m*R^$AĀ endstream endobj 2802 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 212 >> stream xcd`ab`ddM-K-Mf!9k7s7K|w7>{w_f nlhg"r\怜kd~uEOX1v~ͭ'8L~g˄ySN1cItYtMOP]ԝ_{ njn6y8RQ& endstream endobj 2803 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 884 >> stream xmmh[uoc"t*cdfBa`fitdbZ,YۤmMlI_nlYJ]lHQ?˿_$8GF(L&{it:[ZnnjR[&/n+rl~Rd7 2P*o!; dz|U= JYM [yCVhlP6$L)!r-ʟB4dp Tp,ews;~t7;(<ό5{Gpe(rT#ّ472OSߐXjcQoA4ZFHo#mT5dPsD=F>Z_ec|8!< !yyo9ld {q|J7t$SY6np1q27?cSp4ls=4+V%HB ?8 |ynp#pr)WJꝛ"{S5rnUcc[. ֠=b1Ǹ7/S#P>11*[^4+ (\" H $|Q_'z7߁gGg3_y1?UJ-p5ς#Zxc]mXV [榻 gYpIl"ħL@VC a>NFx~җG@ۋ>uvtC8yټw$߯] `;MOux4R0`=3=cIx0Q K%v"hə_!Aq(" endstream endobj 2804 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 322 >> stream xcd`ab`dd M-K-M qtɘf!.k7s7K|w7>%s 00jc6cHdXDow/wnn'9}S'vNh>7#mFluuEe3z,4][yٌ3fvO1aK6l|x]~j^J^Fmvw~w鴚~_[7﬿ ؾ?a)]ovݳ[fOZ9=c;}23ـ% endstream endobj 2806 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 659 >> stream x=]HSU72f%Fh#,%33pBmrB?̚+r.SQ)%$*>2ʒ>?!8w΁2^ ˲sEy  *pZ3@ _ƫV H[׶H?#r|$~(BJV =z/0^yek,0"w|bϰXe2n[:Fo67np{y X p'w R+uFx%Y 滖Z#,L]> stream xcd`ab`ddds,LH3f}nn9. n8}w7g00 nde QYTwu6nm2;unjǿ> stream x+2T0B˥kaP@ endstream endobj 2771 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/P0P1P2P1nc.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2809 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2810 0 R >>>> /Length 457 /Filter /FlateDecode >> stream xVKV0 @뤜kX!  6/>x]TXd'!~oK| 5~$ޮa).)i{xw^!9E`x̔T VoQctӹRey dw"P2%TnwP4l_3;F?B9" !K^yXbT"A*VpػL:^ɕ=J܁5Gay}E*Bv ~V0RR1dۡFȫgޱtOK4G?;h/Rk#4't*D2Q%K6F6B^=Ud^?9ibG]bn1/Yg}ݭW;:*[ߌE-{w7k~a̤z'RU֜zM5[k+06<9%'P^` 4V endstream endobj 2774 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 292.999 240.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2811 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaPG endstream endobj 2773 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2812 0 R /BBox [0 0 293 241] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2813 0 R >>/XObject << /R8 2814 0 R >>>> /Length 69 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`didg6213Q03P532L!-\~ endstream endobj 2814 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 737 /Height 607 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 737 /Colors 4 >> /Length 13586 >> stream xOmٝV) gub 8ΠM$‰@ Ҁml @z'Ҧ y 8 =('D !>kz9{^k| g[:Ϟ>D8T&2pL@e"*PD8T&2pL@e"*PD8T&2doFGp`_">l%lr$rf&Ua,D8pWG0*,jKD9z %D8(D^rz%!a@D8Ln_"hAϔ f{D95ƲD8!D9ge]"\-~0(X֋W\?(`/Xp$ep#ep"$ʙŽ1kcInxD #;gFND Q3X9>.QBgA~h,GӔ(75 @4#iB|Ze  X^N~Ip N4#©}%m OoDc9qžEN~Ic? 2by-_ۘ('?$JX35@M®~q=3ܷϱ7'?$Jq ϙD]{mfEf<'Q2'c'S+cO?%c3=#]"Hteprc$&cP~yDЕ!)ɏ ~ AW 39ɏY>?/Qw\- |Fg yF7乶6nj/o߇_G1o|\83dqW[~cP\| Kq6sc¸֟>wa 4Qh]"_&ѣwuOs|"M< DD8lOLjψo%k,pnj||"E"a.Ƿ0f+>/]"5{pqLoDD8wOfLb7p7c3`?>>'T'-D̀zp8F[ypp8fƋ2E8'%Y$l!$K{; ?:"\C>']Ea\%/-FDL'¹FƵ8D8箞nFp` >/0m|_p` >/^0,<}"|^CG8&GϟՏ>j}W/`~A@/<}-͂C>^orzq$޷"Gk%ʩh|_f!S/4%œ DM[9D9% DV"|N"<(g~p`+>KPDs}!%D^g>or3<-DZπ_ D|D8oHODxD8(F|_ٞbOzz D/ DkYDC>'0SODxD8S/.m ޯK[۾kN"9zZx""|).ʄ|"|N"|<}z;\C>>'>!Q~\%G|"|N"QC/Kzr!g0SO %\C>>^<᝛={ Du|?R3E8%x@Dy}!9"Iq;N1#FyRQL'$9U0=}Onp'$©*JGD7r/"9p-ʣk_r/ʭ|"|N"hz})E8stV p|k_n}'a1~>;g=8 #BnG ~.cD|D8C<p8Fc\s(!^#!߈^$©D=x"©,x|¹?"LGCM1"|>"˜ZD8##™H?և/(LGCy"LGCy"!8Up(zp8fOZGfzDSD8##™ho#cD|D8i<@1"|>"^p8FG3LGCYf8>"\SD8'#™D8'C'"D8%8>tpf޷w9 Izވp#¡<NJy;OO?yzz hDxT3RDi0e'"|J/^}lT3R D Y> DO x"JG(MKODD8 ˜owO>p#'c%…1=[ DOOD8UXD@ffw<SLIOǒ"~?4<`=xCpD3{ %m DOT%gZm[mDOI3$"r"(g$<SLg1K_"̉fw|_)p#/> 6:+orzv$>/v=q/©J-͂_Ԋ[^dx"§tʗ~vǬ=&©j/k!JDxQ}=e<*^^(,EKNd =k׾v;puD [U DOi'?/K%ocKxF_^(Z'-EID',59:އ(<_U<Sn3Te{~'C#۪"|Jf™%mO2#ig:"_%^(?GODD8i=x"i)-EyzoD<><T5R}u"|:=D:/0Sop$%x߫w{vF f(*fΔDxf\;%ʻ >%tү ϫFha\ψQm'"|J"~FMmDGy)p#g>\g 'S0>>%tF('FƐ"($=!BOG3#O?[0=-.N#ǗG"&Dxl3GxOD8Ս=Q>N+x"§#™(E"k-pd{¾ XD8 x:B[DxT'c3 -fąLE&!iI7{E8UaZK4!8NKCODDx"ݞQ~=p8Fhngψ:D`Jr "$%D F%>.^Ǵ.p=ii5"^#|+>88ĉӚQ5CdOv)Hp'iMuCC1,2iAPKQT}QD8-/>=eD8-vFy Qj&cR'"VDfS^E1YDӂ q* qQf,#EW^z 3DFS^e {9pZ=FT^c=·=D8-6 .4zDx#h/%iIo@ᅸ(3KQ%GBk"||/D5kQ5Nk"||/D-[=|n"Fp;i@ᅈX"Ex~0zDS* qQf,Q"QCbGc&1jxqeR3f K'E8yf Z.3C΂'"~HF U^F pRZnI?2jBDx,gF\Ӛ/Ͽ]yrECU$c9+8{ErNkDx0U|'51b.)0(Sʈ}!d Do ᱔pzrN|?7 DxA"< pZh'"  Dx!փR*8''wBo ᱔pNΌreڈi=J'"|^zpMT\pKQDOD;]܋Xr#\3(wQ&=m :_{w=3KN pF%E8=ud-k_;:Qb-E" .q|/YoNwF'"ӝQ2<Em9qqlEw*ϯ?\ˆ;}!7k{<ñ<-.)V pp{ӊ?OD"ˣ)kpNm#Fx/ x"7˽ ]/E2z>"P'"|Ŗnfn$cYp8&@U0/D-3ܶ(Hr3J&/'J'#RZz.>mgķ0fdvF"<lYF'%E0 Nk#^ԌBo0[ʟM"! im= ̀b)J,2E8g{BZ*x"7ᅈXD8f=xJ Dx!"<D8}*_! XD8x"WDx,"mx"WDx,"pZ̧0<%\ExA"<yD8x"7#<yNk"<B̂bgLZ2 I'"|^EC>Nk.|]G}!7ᅈXD8ᴖ"Ͽث)7; DX|wQ&\"둣<'; DXD8tY"E8B$cOҞso;9gNk#Q~o<`'"|^,8sQ&-%0_ |"z[{:_! ᱈p'i)JZK_! ᱈pȗ"5oFyp]}qy9|"F ̄$c:8 Dx!<D8-ޞU"|^EC>eҒYD ^EC>NK"<B$cOӒAXD8$C+DxA"<lOHK"{U<" |vF%=/H"!%=/e'"< փӂAo 1 Yp8FӊAXD8#iE WDx,"ٞDx"|/H"! iI WDx,"pZݫIԐXD8DxD"  !@bxD8"CB̂#!_! XLjpZ!" cD8D ^E1y' _qp1^E1(Mwj'#ū;"<.KQ߷~xG,~| xA"<;@_l(! Dx!GCC! Dx!"<G9[D ^(XKD9KDx"|/H"aDD ^Ev=Q>'_! ᱈pXk|#g{x-hExA"<ec|(YD" F{yl"</px}(E WDx<"^7c/}!" Dy_Dx"|/zX vDx"|/H"A|$=a"|/Hb) !4 $RԊVV"<x} KQBu/^}|v8Ÿ8D83yDx"|ngg6|ADD8317D Dx<"Yq. CED$5[0DKDD̂S0'GCxs0Vx%j̀waC#QD"|[0D1+RD"| _{v}7IDx"\ 5"<Bd{xF0fC[_! 1G_m}!r_! Ոr_! rQD9~gDCyrJD2+DxA"|^`(!4 $B܊D8 ZD" #`(< B&C<ݯ}?~"k"|/%ʁFqm"< B$)M[ZDx"|/Hs6Qǵ0D ^Ta/9%D_! T'~z2o7 0f BW$©n!orFypD823!tq9pxa"2"|0oCD~"<.)=G/LS]%'a?;9ᅉp{|/pO9ȽD/DSI[D8g)J]#z>|apkD>>satqN9p̀$©%Gs{}|_":%3"{k=%2yT,o"{ [E|mcN!©.xx(o} UOD8'C+z{DZ'z>_|D8UUڞA{07 Dx"|Et[N%|~3T7A!E8!"|~OO[SXKQA;bp#+Dq=*(0Dh辵#|{ c ؽE|"BX2\=4opՔrLjϣ/]J_{mi/{;g=8ՉP̂q"<"|$~"Dx("!t7[ ]]SEqvF ڂo|"Dxݍ3}"Dx8"!t73FŢ(p8Nw-mx-gb{B؞r<)xg jkE8UpD8'»xSUONU"<؞0.w=p'» BczO;r7zQSG1S;/;P Cp11¯epjg\IU"<ljn{ -K7֎ɺ뛿K"Ɖpy.ljOsko2H/w*>7{ӌq%E׷~c8#D8UpD8Sx|O{"Toy#=k=qz{7MpjzwDp!"{[dTc<$ljp!6{0n!©f*e1փsTCp Epx"QóT7§ LjpjN51#|OD8#9u-%*^OcD8GNZ|pj =";pTȬ.?&©)H ":HkEP!9U(|ևpj5"|D9E|Yp8NsT8=;œlF~@q"Fp%(Gr63 ljp1o{OZ_ D8c{BJ-·<D9"wpYpJ)­nHϩ;p8FSnfC|D`{B8FSB7(P<cD8%Dp(@pf޷دÂG̢F'B|<6. H MSR ߷[NP¼o փ BD8{ƵpJ{cʀDy_*G/HA!9KռAU)wa'<8L[QYVl8*D?.KsGq{[/ݶŖCDNp~cz%a n_v_ߜBr(d[#\ 3#MM{<.v;Q}[tCS[}梜SmNX"; ʙ3gE'tI/+SщoZ!8b.BZ(f.!ʉHӃf^ g(?|` pzbBLe(όp=!QN/7]}XbB>'$iAӣ6L+Rĝ pIӫCW3|g pv ]֝3|co% rދrZFJ'bŞLfD:Q΅'#պruV߉pMW\7itOK֝^N pF! LHnK p%o"\3 Q':1=Rpy7YW0!Qޞg$8Q0!Q^g4מ7 \3#A8sw1ik`@\|3Ѣli8KpPA(N\CL( ĒfALu p5(l!bO^'ތ{osmKE{nsoMq/8De‰#Fܱ%7<&(IL68IŞ -'hmK77N3Dd]9xaE0=Qb}^uhB0#{M u@5Br4ɍr7F%zK X$V̉-{F[v1(`"ToyxI0G|{ۣe#{Qrg{#x_;nsgKQzT?PB2(ķc=@g ctϠ 0Q0D9@C]o"P{̖ ̖b u "62@pW0PӞ E]Wu nLC2=!.wܺsGm-3إxK p)|H_{\1k)~c@sr܋Ayd* 9@A2coߛ5o%y"̞CQ|@' =o@Tְw֕wutGG[\k\t.= g/xÖ(?EO.y1@ x .QAy8D9 .J`kJċ f 4\P(x!{x!(8l9E&aT&2pL9ۀ'/uk}kW0z[=3_[xŋѬ^G(ΟVnp &¡/ k"*0*p[B/ m4{Ck[nxa@e"*PD8TOc endstream endobj 2826 0 obj << /Length 2321 /Filter /FlateDecode >> stream xZێ}P$آ~a`̮xx"}5E[}NdSjJ|IAXU]U}TѤGz?]utݣ4RhӬWMD6jE`ș_۫._y'w[/qz4cw(5N!IFR%UI]Ɠ+K{dJ~LEpv89y^[g3r^W%fYң.8(_23JUn96DzZ@T }6*BΞ53$zm%lKz#$gFJCB "bmyVkF0‹ngVIK1dfTRj(MbIvdOgVo U˴ƒ QT+SE٤J:7;dT iyb\>b"3na:o uЈ0τ^b<S;& T1z#9< +v&$uۖR5{[U&kg<%$n /O(7_K޶ "ag/yի=0_ ִR.Dz5JO"'R$cc9ÿp?be`rw} v;KզK=rOCz9dsV$g|Ĕ/:ȼsud^g;6ӿ pĩM^dDzUz)xrWdA0R S J@XlE`ܮsO`h4 FD,6J)`v/iģ!J ,ގ31+Z3Z# nġx3Ŏ_')j7p5 :lrZGyLչ#X h&@n[~yww'[5 }Jέl{fYX&jVM5I}":U;ԓqb6"t?%1"x7n%wtyo5bo_wvݪ][mQ2Հlw=ʔ _$=PSlh#"` 6_<u 7rfb<='r b%StjO {Kh2ZiƢYrѢDhG`PZ.rx:[ b)uʵxo^8jU;hIyrcCq @@8MցOճia.lð75iW$5`-^MSfM;۝ "ڪ]W@"|-hlr 2X['ݥTR2l.B<^IŎ3{!9CQMkk|&TQ!U1i%+I,˔iw$bک_ݺ7VupƭN8Gu}2ԃ;;glsΊt5_"ߤ?F_. h endstream endobj 2818 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 559.999 454.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2830 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaPN endstream endobj 2817 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2831 0 R /BBox [0 0 560 455] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2832 0 R >>/XObject << /R8 2833 0 R >>>> /Length 71 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`jjigl715133Q5352000Wq ̌!:,\" endstream endobj 2833 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 748 /Height 607 /BitsPerComponent 8 /Filter /DCTDecode /Length 124283 >> stream AdobedC       C  _ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?(((((((((((((((((((((((((((( ^뚞u֡jkiae M5R8PYݘ $r^ *_<:.洵ctx5%%hī,a.2GI7i>6uk,߫dجpV匥u(s.hii88ɤ*5(>)| ־+ou3TӧIީ}FOM50tG ൺ'K-O#-wzrK{ݕml]qn(d_ƿ>- #L]iujϴg 4g+s UZ)/=ٵ);Sp[o^YJO!x_eF>MB5>/ |l@k&)?gLn// 4mU}a|5EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE^GuoxVL@B,T@81Zc-fYqt njъݿ$m$m$?9쬧kOYY-^YtETVI$(Id6/?ksҠb~l:zd\(|z኶L$+0ɐƒ~ ^-+躾ߝɟxYpc:9}7~od|RN Rz-{o'W\#Do^(!/{m ">GK1y>o.n7^mlm<\9q0"rֿCx^$a#kuܷ\ou6|j_>!kٺ}mWۿ埝'l7}:75Oi +yh.w]1|&~ձ𻲗 |9?b)ԡV:ۗ'jN蜹C}uorᨴIHǝbKmJ# ?~EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ωI Gƞ4~ͥ[| 5@6@31UVaŏh\E|P]$wxy$JxZxNY%4s1-YُMUvM;2^݂+}ݴWggW4,5WJU%kK)|0r\ܷm)ra}oLžͯ o:eZ\Ks6pu\Hsqr3(ر@I cW8FtO]kzK;_<#E-A*w\f=ɨ'o4}txs=aԬj]8ծi9J ^sWxJ}w_,wvbF/p^h'Ӵev8u4,Yku";'eGXWjqii<%ּ_Wc}oi~ZK{dY"} E8`A#|?^(tOhW_i5{Hov4~t72X0g ~NjTjџ;_-UR +iEi٧mvgsZ/>-xK|=j^y7hj.̄Olv$VrSEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^5xIE'Ns-/D@jS2KA ᙑ3=kWY?=dDmK׻zꢥ%~>?|s=՗)-,wzڪ,¼m5+GmI%'ş~4kp>;־_5l-XF︤Q b0D ʹc΍:=R~\/տEdsa̾˔hqz*N0/r_ 70!W4(!-Tneev^Mq`h%},3+(zM]+i_(u8rTN]}SN*nqVliܾ1E1 y6Km/P涶]Sنi\K1lމHG韝EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEOGh|>!`Ծ 14fc$}@U t Y-+/z[uk#1<]ᆃ߯$/]uQNe֋+/iw[AHIYY Ztr#$Y&V[?@IkĐ TcʉD\8U3$Mb3>i]VKs%0`J4۲{mz$#񇍼EN Sw6% kmiX֖Pg-8`C$(i%CvcU8frU@3+W񏊼5 .X"ԵBMcIfcBA!C8$N:ҽ<.֩qݴ~eO,VVM”%6h&Wz_Cǃ<kmVG!kiU g8K7Ė>,5")m[Q-,p e,Y(If$IV)䖉|H8 S-ۚWMԒZJ$I$~.Lď][I[-Uf[m>Mx᷈wf(Yؖ>m6k.[E o_K_xO׃di^g*y-RE c eP 䜀>J}OGJ0|!85F^ԕjY-oV;u|WoΟs;9GqO~ROSh(((((((((((((((((((((((((((((((((((((((((+?ړGe?<<7n=6CLA"<`qjObWz栟W|ޖR/|EQc 5uQ[JK1>ɥzg3Ng4]C:hfPjZ, 2{k7N 07㏊KS)ʔ) X+/'OiM3I?'/7]f6͹_˃dsx|I?-n{{ ~kN۫kku_i &6kso7Gl޾4<6(((((((((((((((((((((((((((((((((((((((((+F~7Z;40WA̘<+_6wv^p"Ƹf?u iI'e~/!\x~U7w棨u]Jus!IbYى,ĒI'$sTrzm?zPiSbI+$$ItGꚦjzj7ZO%4S;y$gvbX$I5"uӉأUwJUGsOwSfY9]Ԡm^(:O1Q/?o;>^gF>g '>_?ߋO3k*aS;a ᯉ</ߌX% vSUxW,UH3ַS Ogye8RyA^ɻ]dH9 3~?֠Gω4b%WHm5fU.UH_}{^<~3=džu[k&gIx]fUbJdP)EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEnk%ewS|GyVi%g}F 6FcRO=ZWx 5k ٚ9/$S.U dSŸ/&_x'^oͨM;6H{t~/+iтԦ׻NJ){w~•oß4+zIg{07ټo:]s+~3<60满 FaU=+ @: SP2u8zUpp6½:v_ 6ekg$WP”*0.F4%z6{jUzg/'J2Nړ}֒/?(ּ 84oF5 {٠u+sh ";7MAGBGLI: 3OW2/>+{Bm"+KQsumivŷ{Z?*Lv (QQ*3h&j/?7ּ 95GoF t&i##Ig@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@VӬ B[ Xin$ j gv<* $RTiE+I-}NufMɻ$m]ίo9h7Zմ wvʯsu3]`G5 M~ן'Ŭ&"$ FyvՏN)Sx\+k]_h*l2Xf)'kA>/v:]˫/t_跿~Kغ7OHDӣ㉂4nq_/N15MwSfª"i5p6@z⻩@5.REh+ci {1[qzR嶊f|n O INT}pXʸ\Laۈr"ֵOzψ:Էw?:y\FY $I9v{*T)+B F+Wdv]8oxZ|Ezƥ]i.f @8+ 7=:s0*~ߕR Yzj'\&m|>mbT5lf22FXl Cxۘ,w}S/痺j0M.ekp潵mFTK$/r}:x&/ReYagmkq۫7&^cLr4?H?<6(((((((((((((((((((((((^|a>^oE[mlf.@;-}mP@%sPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPX"-R'5(l4K̷sY!BY$ h"od7a+FNZ$얯C_ÿJM/-$Q>]Ϊ7yn#CK3),OƍqaMa[ alςCJA8jJ$GĕB/ݏ/?+E. J/=%0' 7}e:ܖU^UdY8WaVhZI$9O7'&3 wRj\*55ªWu8h*nNWx(aKG]CkldOFe?)-(I9*Ur7P$'SM^a7p]u%VUeJKdd/ra6W!-fݘeE<ؼr\|BgLTwS@vBW jx_<wNfE֬% Jmk*-WK3OTBj+wmt=GT> ./4$.(Iy`+J J`( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=|VcW6 d14ږ@zիYq J˹xQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@p>$;ᖉ>^d+e A e˸*#sKA-ڕWWWijwen'3a~ozW?AZ ޷w$M4m"I}r_,f'_&g54}LNZ+瘞 }b_ zE~}|I~Ւ42l?.]O6t7s@|'[qkYj k[JBy1;T,4X8.n )989EGY9CߊJRi+duM3NM{QӼ1/uJe,4R4ˁ+vsHEdVueO_BSiz:.]iƟt7jaPPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^Kc/>7W:5 .nٷ%y)Q)H ~?Ls$[݂~{zGGy5em.쟩e8Ҫ5h_/]ᯇ֖-پ{^[ǪvV9ckD`:x_o;/ğ^7hg(Xb%ڋI%,1̱Y*X\'ӤWH/Vo̿ C.d9OxSZ} ehrvE2[ۣ30@I$K+,HxE8frRANѨQzx ۃ]m Sp2EwSfQr=+ 0JјUg"H)-l/uK=7MQ yTDPK1$&Ad\B]JRoDݷ"z槧h.ukXYBMu3T8wf!BI$]_+6mvoHGGamܡfP`Lnln=Rsitȣ:xJqܦԓ7-kl[j?Gc6,<+iYLëäA%eIP f' ‰B|oo%ONsVLjs ʛ`E>S ʘpE>S¿o8^O\o.t]4kğ3FTe(UAz 5`91?u;NF{/:OaKB;A-w3Fm7f75gxmQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@"5||@y믵[wnݳjyxQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|WVWݾ3 $ rϐsGax~MD;jihK{VOW1}_% g_tiw([Zh [zuk+-sS\,B #~Hx_|Uj^!5}!{.zPP~+I;%Z-Ӱƕ%h3TÃ^8hoUa]Ёf½'|P,~ 'Ť/5{G%FTQX;K Kv߉`~Sk0TM&{߉:Xx.f;>K=.[C>6w+HnV4eD5w0ᵕ.2iꄂ&SJ턂fxQ:@jnvBAYsua_N_C4?>nu1lvmݟhv.η5!;Zֲv_{[KrN GyeMW;H|/e߸#?1<6((((((((((((((((((((((ē}-wO$\ƶ7r1LJoY9 !3exQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Wɿ?im6{F`Hs1#l VVv7<[t2OIOwu$OnWD2UkS/ L|ZfN3[xnrdH2(VZP%,_%Է4\NI&v9ff<$I_^ufTnRoVݷվ|J1VHSTOQֵFP5 亻gb$1,K$I&wptFeJh*wSg` +Чx*N;m8ƦU\ ]oU]q]lU׃]cxPns]oU|#p&½O'jg7$ki~ڬ^ǎBm︀Ǣ<^8)47){~wVujh?L~>6]vVSvfSo"=M7Wl퍊kg'ޅ~<6e}(ipVDqTvSVT*NL+*_ZWcW`mqsoͿݸm򱃻+ӇѴ~ANZG~ U>~fUc\Oh>|m($(((((((((((((z.]jơwƙkmujImx!KIXqS"I83[sa"uztcیι+Mc + ©Ƚ]m`x]nQ9wRf]:5NNEA^8Fª:}+M4Uk6Uu<h*A p3 o?0$o>uNN_t81ֻSbqUԯkE쯹0_,>igShOOG]|w.q_YĞb[FpA#@@TPݫKxQn-_wONz[`ZS&vBw kEYjS%ŵ夭I#u +C T(S R(4WM=i[jzkZ.u|Z_Lk20d9GV _χu'~мS]B,,΂TF\\)FyևV+ W^dvi٫ߴ.i~&7[ jރoe {q(R5Ż `TlP`xQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ COڟٟNп}W1{~3v˜c#94>5Uψ5 ]z:ϊG,m;"M$FW (/ ( ( ( ( ( ( ( ( ( ( (gNŸ tUO[+5 pWm6IjݒMSgee=e^z΢h3*I$qDK$qwh>Nd{^Hgڳ_H0A) " KVtݏ:uޫqjdd!U>C.?Ӕa4xmfMGT$(jNL+2a֟) eM)0Ȧu VTÿW) eMҝr `{3x:y<}U[m|˜%Rja.[TZ{5={|G"\^hO_P-*S p|hh+#fNGt<6(((((((((((((((((((((s㷁Yovse,y>nw}յmW_u=w]oQPy#Y$IEPEPEPEPEPEPEPEPEPEP\WwWoux4nI,*A$#K JUK1_G~Yc3e<ZboI+J)6I~,iώ-|-Os~%-4+QdIwrFKx3I< ӫ^2N|mBxNL $-C$EI"HdG#F7nYl3i/WfߛM;wo [,Dc[SUm]'94'JRTݭ?hُ}O;)4%nv_k2\msD@&Qsoټɏe?|-rmMwi;}.}CK,5.% 1:2\Rz6׺=xsfY,L2iNRs:mESj/NY7mό~-~?m:|1#g,EOy_mFKs.Li?j_lVZmCֳ[̷-ԇi4Y "69ˑ^O{2 U+(kJ{'&nSo3܆U2 ^IGv)YCKW ¾ڟ﮵-4VOxk\0EtYw·]׋>1Z_jvI6z%ȷ67Ѹc:eHuRn5iÙHS5%{ZjviTL=YЭŵ(M;44iϛ0~_}ƞ|}'Z,hRy -c68^T("^j;Ug5NaUzW}8l*9p6MBwSjTp+ 0NUV>\3UgOjh* p7@3ZuP*sp6S c޻3 O|+tZk'͋K1-}M[-Nƌ2S$]5{WK.]>7MY,&.G%` 7:ը$xmeڟ) dԎ1V eL:SQ: Ȫ;!0\;)+*qQNAYrMF\&c޳n-,41,Y!F7%T_άmf~7 s1R}muzm=Hk ү#7TeվpʼZ{-&Ъk$y ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=GJ: ?2s ڗVzǘ֮0ˉ&m7(((((((((((+7!ƺٴo8cRFf*8u^_{}v$c .4oH=e'*m@7xL~(Qn33mޭvW|zV_J<4(U/|z{įm&|ZV $p6U&̳:mWDKKxC/`KTkޜWavRS֖5~xf44 BۘokX 'M'<-ӮcN'*ܿP=K?~'l籹<Jtۙ,s<2#cr%(V"I-.}uU1Qceѯզn۔vwO֋' DŽX鷚֑y6zTry)y \c,p+%J߅~"*h)7 ?mN [wr:fT0f )'qzj[isx>/˚aԦQ{#ZZem\Y_hߋ_>ayj%4mf)<qO8pooQ_ zBZI$~_w?"3í>K\~tMma$+\< WK0S\E9#XEyc"F?zH#nR\(>2\5({Jzz~lw[[g̖׵q4q c)ʕXqvzio#BL*Э|sH..ÛHmxWt)Fi1vZ^+,53*q 09zh p7©:N񝂪3 PUY:Wu8FUGp5.UǷ_JxAUϭwSf|YAe~v<_zweQ3˥Mv궋]n{?տ4-?R{;R!6ɓƨ2B0<~l5\ Yr ʟ4NL+*js ˔S: D r*: zZ9NL+'ώOi Yq[*Юgf'bb ^5v0H"`UMʓ^OGֵ۲g|㿇>7𦧥p.wM>ۈH'h ?O ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>Imv}Wܧi.Hl4yfrM-DtТI4( ( ( ( ( ( ( ( ( ( (_#'Di.wEmJ`@8;#\y!A32#yYoC'j'ǬWʹp_vaO^X}TTUZ'T[Y͵+ml& ]^gʋt~|fώ^ mw/&KFHhs pv*Ofު{l˽w$xOr EN.$KWng&o|[SѦִ @Ɖt}$mkPHW\#@'j"cgN'֪4,SJ-w-%gd 7ᔆ`F x^=;r,>L4*4SqV|ݖi&=#53|0᫩'4"b s"Ue!C~>8|=#o˅pd8eݓ.,m"^2virT wpܤi=GSωjG'hTcʡ.'_/-߆gnzfzkc@_k:m+:_\2j7&$y-&QΪK8ԯ/5;˽CQF{ M#YݎK1$O$ߔZ F*Sj:ֵjơkͭwvsҿOpV!;[]<#f77y{lg=h(((((((((((((((((((((챣}ϓZ6ݻwݛ_((((((((((+ߎwYZGoy,+A#( IE u ڏYarXSީ-}vv.ËI 0iJr]E/I;E4uo_ >xKAPC gO-Ԗ[FgY-O$~kVS4}>97jP+kl7S]یb]8ٕ2i1ؘI*Щ99yt哒oN7 e:ү,|"XFHBXD~\9ʊց}Q1~Gs&a[078JAZзC\҉a]>k-Vuk}U;4[mt!UA#g pUhKfmÍaeӍJr$gutMyG|Yx"/>gsod˹5%Ǐx _~ҽo<.Xꃩx\pĻ@nc*ܡi-g'~{G >6 ;mka,XmDaW+57/Z]֝㘭#i.xOԢUycH:Yk]]U2wkU~)pqÎ?ڸiRRw{.xmkuO:f~?/ֺ\MVVrzD=*ˋe nHF׈_Y]X[Ko}m#E5QNYH`AA)8>Y+3ʌ>64OCZӮcOK[ ZfF*Rk2AF8m8FaU{s]mTzoTqNW}~~׾v{`gݸlj:g>jԣ_{KW?ja/wUiv=xV'L:D!3k*qVvSVLg;!0;):0A;a rsUuBaYsdsڅ6y9NT ˛Қ e>˩Na_ӿwMf/ϣ&nﰻyڸmqۖb#VKS0Sqtysmo)ۮֿ[_MrOT8U 7/_7AoWg׍f^d[Rm&HԌ*XI$VD ( ( ( ( ( ( ( ( +_EӮl~CI+ oт4p7:|ĸ|wZ]4_qZTVv2\4ު;F_k %3iw^ ,rNfIω62nnLȏN|I_|S}R}G_e3\\UUPUB ^2ח4o%Z#/a40H(SKmm|s߉^-׼wzYn9n/+*"TTPUTP.+jq=9J]j@z檨UgOOʻ5|¾m:(<iFw ζfhu8ZP8B_ݡ'OҊ?Kw-ݨʬmb֍;%*~eӋ!{jؗ▓~hݫHeYK;ŧr#ND2|y'Ö \[KvҼP\ZY=M-Jշxlzzmm+U3/>#iw?kot{x#œ.QmHf](yd8j>K̡vTu&D7$]}[eKWIO%me <3yޒwdQ\s;j^_i3?ψ[h#\q6g}ur[ mد4}WCҵ2N _@K #*A=ۅ7f>~WLľ/5 xú;=hҵI,mo@w# C8"XgwBfUz]mRq]n:_~xmxw׮`DGck[+)'/tB::9/+) ,PQ茼l+JYw02h/N2IyOJᵕ6|e9dLzVvh+2aQcVL皾[7SBNAYsW) dM8Q;!05\e9+2nz$uV YxgG3gYKȾ/#",JkkBm͏'05.׉/eITVIE'v/_+KOݹ>LSZ̯ک%dLWCh((((((((((((((((((((? GW~F{.|Bo]ni/v.=Ρ1f[DG((((((((+{Me?47_$z$l2$NCLA#<`qjQ1bWz栟W|ޖR x.YEƧ,_E+iI:}/K?c3Ng4]C @+4?uBꌥ^ TCRԵ Zy$i$F%ݎK1$I&#NUd7y=[zЄiSbIhZ$Djjzj7ZO%4S;y$gvbX$I5zW]8:#TU]mUY?UN&U5N&Uw@~N=cP+<|I j1/f6?+^~|5Z1\-ۡ0\ L ;L |:L&µ~~sN&R¶ ~8V H : xEth%,7!~)'!˲e8]6v`+rƟ7̴Hij얒v)}YT=~+8%y=`3f)?g _7*/wIgn|WUqidIdu+͡CH|z7GB:_kN>^U5x? |%-׃$CSd1Ѭ ١/emb9=+Gu_Lд?UԮb,sX@QW} } ? kZ|; Y}zy.fc7 e9$kSN>0gѧ %{+XG cf~fl*oN E_sl3qWn.⟉'|AЯ7K+NyU‘4<*1 /Nj6=LɜuNaY3rV\Uc ɟ(tVT߅>S³&ȡD1;) ʙz(puvBA_?L3D@xFIgB|v36؎,ƕ.9:)'wӫqmh_?{gx߼\Ωs[[^i.0lNmToLdr ,( (s*<)fL+x@i%=GH;'e+X|RdVKVIhvrܯTt-oe$V=-~$^~iy,u\벫mm$זtjE\;A F6 7QgxʀfN>`'i= yn}x͸%qIٸ[JiqXp8%]i{jUfiOٯľVg}}sOW\U/7d~j6*N]v_pTqX/5TڳQ[YkKiħfZɭxclFxL *^-e~WWޣ]u]JOsq#I$1%I$&/RYmնFM()$%K]5MSS5=GZֵCX'fk:nO |)xktˋ}a]L+:[$|4;WzmR{vf߄fI-8 ~J*Bϑ>0~?~}O? = bén3l_j1Q3j۴|aknSЄᵕ0sO0J7;a { dxc²ZN}B>[pYS dL*lvBAYRdf½G K3M5o&Iʥr0Qe ^O^˝`FG.%=[wt_ |Z&߲"{|G/nnj)粞3C#?ּ_x?Ķ_c}qbK{dhMJFRAA#( +|i3Mlw+"[:88%x|eN ?ٰ\5u{%Nݿ9[1kž5]/kU=m_kOO/c/ͧ4^8mjHwL/+CyI,Bn>\5 VP.{tR2c6|=мj wirdY\vmIDXx\C;GKbp:ԍjomRC/ Gw8/̓94]pOgh+8( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?g h^9?^)oi^%OҼYG оCxk~x{|aa}Kz+?tEiׅqikUh#rmᧇ3𯂼aX4xt i6wygig[n o5{/dP|a𶅣^xž?ltm6A=ōvVClm̮ҙ((((((oį>&uY[iրI$T3 B#5|'A7UrZxoO~\5Ms=}Y|Ho4随~_rX$վ9ZHݯ *"XS8ܘ$2n ֜l~UgLF vӁ`q^8ƨUgNuq6UB2r}kMV]=zm8ƫAUqwSjz^e13G?FE#(U \/ɴ%ſow-3 I|6!f,nϔ";m+**UB>҅j]m̾[8)e9P//kSR8Fkz6{p> FgYDѿ{=/*q,?xw=¬Rg[Zg3ՁpFRV 8JA[0H@8AZиr2 օz 3&¶aa(V,x)0&ga9k۹kqfaZзjL[ օ8Ʌl@kqFa^&w6zeˢ]KŕmHBST#0m^Q9ASU{bwdmGg\?g2䶚k{ZK[&I7զ{7Xx/Ğo=x7Zu YO,OŔC D&|uԚ߃O |DYiIME\)&g0xZ}\h֡fm9X\M%Md֔_WP/W_~s^m[Go,ƷX[oME;Qy y0]~̰5W QN/fi٦ߙQЫ x8ukyOş[]/Y+YqB%:,^871É?|S~k'k=Kc ʛ)NaYsaMD@{Ur섂qUvBaYS*j']9dM|l&²jL+.a|d&b| )ojg/L[eT\#q*6c14i+$?s*f2_eh%-ORMRh?)"9b ^YeyR8#R$Q@$V:Vcm$mIn>I(A]]O*׆V^ڵK$1#I$R(cI%8GweUf㿊:7ASyH<27qn8J2\qU6J[7y' EF8zuoizw%M3Yqhnx7r8f ~(k?/Ȏ:+𭏴 -z94/v7s)H+R!i۲r#9 +/Ӆ7ŧ*2wℴ\JIJ ԊI0Z~ ಽOotgNfWfeKweV(Y]VHHHH׽о*xExRF80^|Al%ۺ%xoľM>éd.;F6Y pN_p߈/r5ݗ$vV^NZMپDuvu¯׎~ 7 %h쵔cϕg&ExB\HX(z }U_ aOBϴiZŤw6]7 ՆG!EaQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@왦\?-!_nᴂWk>YfeR+[y[>N#"\X: _ k^(iwo~ $>!/x4t.{/{Qgh`SI#8o?o~!|0?b',aRj7K 6JM$qEvxg W?orӬ|Uup7q=IbBkj#t"宊:]<1i6,r6A`4e#eC)PP@Q@Q@Q@Q@W.qY I<**T:QJKvD%RJWoD힑W~1xFT Qյ9ŵa =aNYϨU ߚ0|D5u xwTB=XgA?2][Nkw_ke_p,37x7|>Kw5]gĚǿtJk _Hɥ%e z~ȵU9UT*'5N`ZFª<~J&Ѫ~N&ʨUgB}wSjVd]jWtm85VDgϏLkE~^gZ+a:P=m?yG^*zV 7 hX5H 7\Aj8=oƭ\L?i-;8II/Fw跱߰'t]kxgS |Ѽڼwֲ *K Ol Ȧ0B`.׵ ket{ɬ/mœɞ'1țl:ʒ8$WV^ zu"f+gfѫ>TGx^-G_\i9SzцTqHzW$\aV-q\`Z % h[s.IkB湥);l&@5(L+Z"0{y>8H+b9iEIk\ҁV-+p2n@Y9 h[W,e)kj e- xk 72<Ō\|m|nln`V[cZ{g.vӳY>gz~IM-՚zůԺ~hKkݩ"'- ,lM{~%<5uȦ1x5S9݀DkČ"i7HIF?g|fQQҳlۻidΣz-x#r˪ZIiI+7'E-X|\a$Op&,~..yh!D-9i W :}׊4!f4a^O y7oU2_d]UUT;y=W%#}վS{I^58o? xjgmOL]7I g#yVfKeYE1梴+=Q=T>S²9t:+e( Z²fSNw ˘dNL+ GM.;jM3Z9qqYIPb,Tdb~1,f:Mv=e++GiV):Om.׮${/vhu|%qSZ-sBlK[RKVLL6YAŽƿ/]Ia&Npy8k'CO6x[GI+[;26z?ʭZoWz](KE dڍH Êm_]Om?H44 .~^!dnU fU.U#Yٖ;DfH-Xa*DE4D 2`A scpU05$ԣ%x|2J-tM)FIJ2e5uU>ת?jpY^k{f3Ii32Ż,$rG$Rr$k@!)]y_ m̱t g+5=Y :Կ(u]8''wnkyج%NZ[^xkt] 4>qEy |7kzuɾ9.%t3_.ujXjǻҦdΡQ1WQ>+4>xuP[[omol6rRI_IcrEڜt3EqWHH2AAUi)ƭ))BI4ӺikF4pӳ<ou847Zm wh̩sk2ųme5%h# ( ( ( ( ( ( ( ( ( ( ( ( ( (Ŀßo,w _{ot?+y?0;|DGR<((((((ZmcmM5!Eff<IQR(U*I(vމ%oEF2b @ϭK3H]$~RF^;A/:F\}W.bb4nk 9ԠԖF*UWMwMY5۱^.w+}KO_"pU)0AV;D]^O|imi&1D-%r. WF>QZ4*c8r\;[1$OU{m֋~&,|Ew;i[_KuBd̻gː!^6W8pszօ+P1 ط~8aZ"\a~iL+bݲ1\$µr 4H+f/6?zgLq+2Ӿ̤j ''uB׾±. o<<( _,F] {Ldڻ];8_TsTq)%7m/%t[2>6xg$𕼐kZnX,̔O&+s־ǭ dߥ5pVLQ;) ʛQ;i+O?,KxI6𭤓HR+Egeܟhd0^d1 pNr5TnKռ5E7Ro{[kx_2 ݷ:BG,m~hO [:%<MÐK$M+&7J$TowfڈDU+/8qVcb[ն}\QsݶZ$]I]mxw~0ͱ4xSLO΅ge$L҃<$ҔM,(8re+53%7cH)x S L)tna)\)gic)X)SSRgeoXo$m3zu a=0C)*}<i<-7y*w;I+M'R%V Oi.x?F2\[;\_JkƊ3*-I Ȩ.U|hX$~TK>&wV\'q~Vk^2W|4nu(BPUz5vCƞ k7X/k>ciCf2 E>dbh 6<9=}+3Fp0_@[s'#9CHP7 68Wf3S//w%m$i[E$q֧ =#|[2 G5K ^< sor/.+Faɜ׼?[ZKctxyS,<.w`|-#,\SͩJN槢O}](^OVʘg;_xiڵ΂}u$+sk{"̹q#Z^Z_wcu Ŭ4 8?Tqc_ _{_i?%kcNdR SɺM}ܠSmNI薈#Ilg[ut[{}ĺg_@ 0nKIyj_|L|Qk i_įp$Ռ`;`'mD&N$ Fpy/A}^U-w{}m\<Ɵ%RZߥݥf(ꟲ^L|_$C%߁UthIbmDm ԰yJEko_yxC5]v[Im<;:eʲ{SjEN0U9&U>E/Kj^0xg4bK;}讛]#~~ t/s飒] I }7#T ?#ŅG#kb?Ԭk=7}jjy8n^d]\m#vۏ+ Mi-6+$̓A2񭀖+!VuY48DX(*E qGQh +R0-Ro290J,a)'v nIO9;o̓IV)G0h_͂hѧρ=m2;[ {8Rz34/k],w+;]JP.Z]?;-X| k/7kyp wȎ,J?d_?O&wcV;]r7.N2%YX9jҗ=ߒVkJqݮ(J*<n_>|5F;dŹ|mtya #YL -JI8#_LIհ7pUFT+|5g8uVJo]읚2WI'+^-vdX%mi/tˉYY&yh6 #)+F<ފ((((((((((((t /ڜ#~ kэ[^C\ ưEyggd)E'">` ( ( ( ( (K6^xķM?*Fine %@HPH3| %J[.}#տVI3MB S:׆~ftUmWծJңkTgf eg._Zտo04STK4>{pK32|sh{{_YmK^w$f4y 7kOR5O+M`⻩5nUr1]m*/=+MUP̃]kaU^<Z*UY8q5P΄jnjWt]kUwSQЎ5B}O!Xϐs[R=FaU9v@pSY T4ߕL fGoL>&^4'Uӵ Verp4gMI#[:_hz4UΏVRycdn\3dmNZv'Ȫjﴌy֞TTh:ڪ11%O>Voqrr|Kf )ek\i Z?JW싩[DmFd7)zQ[Ym/_eX/m'uބIч  `19uEOiG[J-i(i(m4+O[|x:O6yhu VfTI6g@2Ú~U))0v1r 3-F2rNJ[җpš9lRKzԘJV ^(0iJV a_6 '-v3V듵q*̧5*;sFiE7|d NS_?7gϖy?hٻ˞ vw!p|,2cAKrnc*'kFA+-Zr;Jֽx]7\ѻԢ Brϛp4}KgϘF?hٷ̂x7wͷ|n,2H;N2q_dAq _,om$isEQWWGLgat]qF0 <(((((((((((Xӭ?s?Qզkf厇82;S&;Wm8ƨUwAWu8U Wu8ƨUgLWu8FªuJX ɏwS'+KUB<~q6DUʻU kMcP*zUP*yUN&½ RSB׈{]sfsr'~?xo5WFYwxm}!6YE6} :ݤZLe r& ׆L58\+ZY@ɰ{,JAZ=p1 ׁ8IkzW,% x[\Ҏ-kB iR ؁ڹg >Z>+qLR ؁#r:JZlC'H+Z\ӉV\Ӎ̤¶aqW,sAZпc&YR gKj]Ƚ|ȓpCciOh*ӕF uef#ݦ٨&ȏex=U;RgjOԾ<^~q:;wc8eYVvMJ$R}I~4kKG4k>Z f.x%E>d)¶#<Ft3w )`P! mec,N+)): =߳'E4QPdd-XvERktΫV\ێRJk_s[:Y_xiڵ΂}u$+sk{"̹q#myF ˟*xdlc;$RU ;+e FWjP~YŸJ״[ӭ~Glתz+NƟ k6ohVՍ:y{Ddy-Z f.x%E>d)¶#<aO&x%Fq].N\˓ VV&;NZFw坭{ZnwkE勐xf>mgm#^H|lA<[Ȼ̌Mf۾7G`\w8j:)6a)v ilp)JaIrqJw)`'=zVmR ; ɭAGƺ0FqZQm(+;5f^\;nk%fe_SмGgw%;d}C.vSbװW>mc<~>0fy_.6)+.m%nҴ'Czy=WW=Wu¿o$;e<-<34eBF+?&VKs W+82480&>_MFyz-yRK^CV_4 {w0# f"+Z-Ͳ&ۉ)z( ( ( ( ( ( ( ( ( (=F񧂴{i?_hZ<ۻ渖FJ ( ( ( ( :jynK-66 %tv,U[xp3#Y!ږwm&⹝ L-1]X0 ~t7ko|B'dQ&KK6I=۪*XXmSAY;37W=8ƩVD]j\*p6V]]sUX*q4fYׯN&ʨUVOAwSU߅wӉk\*/9]N& JUY:⻩5PUWA+MP}k6PADwĿŶrt y-Ѭd=Õ$)!AN|}[a/\>]k{ῆ/ȬxKxA2{+FD>yfw:ctxKHW6m}&Ufی9wJ>&?X:W2jsƟ%<agGqWnpzW3ɣhV+oQ/|n9l݅эxZlq7h(Ztߖ{]^ i}Zן;?/>_ڼnhX(O)3:ׅi@[6xrΙ +p1rV-0ȮYR+^V8A[sJ&aZ4$ 4e)kmiL+bfg X r2V/\sR օi@Z9s L+bW,$µ~yYR =p0 M'_eUFGA"g*zi3 GåOލOvUJIZ)('.z>Q|PQNW]߹~п'>5[RN~wmV]J6 #ljb_38GƝ O6 F>ppvld ) 5*;siE7|ڒ%8KOZQv}WYs5oρ-u}~ѳw<o"2C[nXe d/<2|0܅ۻʰ둹rqA*Ux9jҗ=ߖVkJqݮ(NX¿=ԕ_>H4}KgϘF?hٷ̂x7wͷ|n,25+KCM/̅ X}ꢹ1N'MWiNvU ۻJKFVr"57gZy>xd%]cS?8.%egHe_4\,WHHS8n)JӱO_A0M“֖`ֆ``uSpaA` O4 mߌu82)08sRz34/k],w+;]JP,%#_?7gϖy?hٻ˞ vw!p|,2_iMm [NZ\.$T߆;Xel&JvRVU tZKN0uqix>^ΰkvD@f<7$G0mky."O8Jgp_ZMšN:U%1r x}3L)qݿ*#SSY+JA^៌^'v?vJx/'x7 ~~,-civ|wM^_ODSoZ/]p'y#<>ӝ ߗ ~\Fw?3#x-u/_m/rwm (IUbyY=*hT\ܩ'%)6ɧ/oa-F2Ga EWNyl"?_ڟ^}0nu_)` ( ( ( 4ZPH;]6zy<(y p\ a~+~Xxr4}7ZҔbu o |~kY^ v Ma2Bj4`LP׬]+]_j{-xdc`3x<^.nu&%VIY9ϋ~%x^ߎgźQ QQ@TUUP@L8UT*(q5T«u]hUx]maU]9qYq5Pq]jVt={ƨUGq6`UT*;Wu8FUfLu8*U]kU]?]mU=+McX+>]2iUvF6FXڗ &{'-< נ9@Ulxm^zW4?jV훧lE+>]KMqsr>fIdž EcZgqsns/PǵdڲWwW>W/&_sj΍)7#i#mQ_BָL:RGUg8Ʌk@ $¶!a\0`cs,L+b $µl\1l+^ 9湥H+f83R օ8H+ZL¶ qr&V.r4c&xB8f-%&YoC-Lc9#ۜnCےЄHF UZQߤy[gsJ.Vk3Qn=j?9}iֺ/Uw²ëäOP f`,U‰K|ljR]s,<y%39,I'9ZrUJMۻm{BŶp;]rv2AY}WXѝ{^״gYYIJ%ZZ f.x%E>d)¶#<ؾ!]CMgL0A>\*!gkmnPvI^ɸ%MFp:?5z7 ρ}{:eAeg7UTTUXcV9#)JV<ޮl- eX{c9uGW QŵgQѸ=%ex8f9jC|[N}[֛usZ]D4:2]Bql| uakhi:ٮOiq"g|a,w0g?F1_ƛ(fR<>u}z?' <{]oiD T$+80@E-֞RK֟E@Ȥp~v2k:?T[J):W[ť:kGgRn7~ES_L|I ^C^ѥՂ k dx}`rk"R֖ aoJ`﹋RuPc)(`(ŽW*Ս34I  A@9@`CGf SQ)J2V^]i4R\ea*:Sf=} eڊ2"BȎG$q,qȶ/aHWPY$`yKg .L*!6ƚ`ە ;k'w;$d&HҌR17|a2 2{߇׳[Y.Vqc|UUKIU8c;{|r@ד)oLR  S 8 甮a)0íU%0ISS ,j.b yiғ ;[bL*TdB˒wvKZhEkݾF&u7g>mv=Kɩw>'h־:&#G4M?R_BFd25^Ꮜ^vA?>s]0\OQKnݕ4>xuP[[omol6rRI_IcrEڜ~{x%f{xwSмGgVi%;WMH.ua`GQ@TPEPEPEPEPEPEPE{'O4@m ( ( ( ??m~t(Z]- g2 aPpw 7)pX<LSiߖ z>i/)gT1V_K%%iw~('BA UlnJӭ[S%7lB8\Hb~|zRZo$n4X09ⱘ<^.nu&$-I$yݟ)>-{~;׮3F*EEQUU@Ua:U9Ji5uq6UPUgONN&Uf_J6TUMU[UhIp5P+6@q4@·޻U 5LuT*\ ET*/_Zh 種Q4`D5B[:PfrC"Uц G I^zh֟iuie3C5HRX  Ew?m4?t:[ ]P kxqHG (S2Vnwv_ߴ^hmEӭtOkiae )}2qƠ*"  _nk )?cmW'༸|yF{nЁG(%v\ (Xq R)ԚK[JqjZ9K-WO]~&#[" F᮹h`ELb 'G@0 ,~&|5Z?L$¶ ~8+^mr&aZAL[ ւNVJ[0A `n\Ӧe)l@ޕ8V3H+^sRaZ9Y2a[7NkqfV-,c&nkq0 ׁp0 Յp2l+bs\V-+P1r t|E~#|x-DJ@$pت^rKJK/$S]=[kE/3/io'8yON fE_ _hKU߳fYC$j>_X~D9 rpsi$޹gr W,cl*ʸz,cr leiQ|mH%X8A X\UL G8%(ZQzQѸ&M5()EQX[_Wj~ 署O=QVWfV{{VV(YՑH9bx9B%twmy휂|08HU1*pFFN(KW;$d$HҌ8CUw.s{0~| =ح,z +8*ʤ ªsnŽg^Y7HRSh& ^)`$lU *0#Vgi٦M5iф䭩{K5=SӵQ>x/hf2IC#ӬZj&gJ#hsԱqo[iRjz|wr2Y׮~և׎Ѿ4xW/'~X쵔cǛyyf̱\HT=(0vЮaԢo oX P:pi"^A[es!=^-G$SZڤdNpx/xnm&d^-Y֋slIEF^o_?c9H\w?2RuEsaHH;JV f S‚{CjQO%I"Ls[ IАJdAj`j9)FJҋ3qM;]&jQR,L OPZ5j*Zjop ":2,O"ؽ.;ɥH?xAB 8HD`iƚ`ە ;k'w;$d&HҌR3d~?yix^>m2wݲ⪪\H*w1[t)d/OΣ}yH*2sc)7S;!ZyJQܓRe)좃H)2ԷsS g'A`ÿ/6"K˿{u}F_?5@H=S]O8񇁼[N ' ֛us<4:3*\̤qld3 FaKZrPEPEPEPEPEPE{%OwExQ@Q@Q@/S5=;EtCX'kqƠ1 I k O~?iDx6Ad;_UqUK%\+KG- M͸?'Bt._-Sw퇦׵߇>]?^gVM7>[$w2K4YrrYI$OZxs^rVNRmzշFsN6:33cU9gkgmhS_؟+hO7_g%蕻r_ 70!W4(!-Tneev<LOJڶt9kp9e 58ӕ¬,kq9-#޹'r ӵ)l&gEI"|` `1@9@  +J/X.I4tiFIJ.2d*u?59l`k-OFUDude9#X9cE}e º&#lÐ^'˓`p ʵB/ۡ'm~(IN+7R)(Ԅ9~w ρ}{:eAeg7UTTUXcV9#s^Qc zѱ$*[赌e+t_m|Ei`Q־woO~ĴKMyH/]p'y#<>ӝ ߗ ~\Fw@ڦ}1k;s+* ' O'tq_8u4;(5YI.W?Sk/?j1[?7hs4Q7-y,-p'ki'6(ȥYA{WVJ%J\gMYii0xީz֝u|Z^k21WHGVJ PO_PݎyNi zVmcR (\r})aWoQ| Fr CGV SQ IIZQzqvn2IkMJ2JQqc%qz_a3S [>mEZKM^љYYXdGVFY#88Y (Rty4f%ɀ9%X@:& 8Xr'mu9;I%{&4jE6eQ$GKw ρ}{:eAeg7UTTUXcV9#',7[9;)`lRS1ԙJAG-=hS Bp*[))NH[JiJW o^['+la)!9ҠR qO-N| fݭZm//wq[ۥmSzG.H&?9⻥us}E#t{يmk;."$LU-Nm/e~d׀c~I' xۃZ}Kgooq G=wZiwWY__JRxrYatˬKǺiB:^mynPk2ʡ RFpGiX,қ NJJ;^-٧o4} M TyMMmtW/|AkZMφ%m>0]g}e,-.`2 BrYI]@Q@Q@Q@Q@s]#γFo7촗If_n [{c?)᳸ PPEPEPWoxWtxA|[-@ $I ؅EVf!TI~}MRӱ2?寫A"<'ﶩQ}{9T[~Wy՚~f? 6WA% h~BR]7MIWK%-h!;GŮp>]U>( kMPkMT*U EP*Zh U]y>N&Ѭ«2}kMU[VeZUYVtWm8U=EwӉkVuqkVuWm8ƪ 1]jUtN&:zuƨUgOZH ]ceT*']k^1?03gD#xWShr~ kK*5e8O ^%OD>+x]ym!=B;ymCنWf 9]@' yjFeZ^қ_5Wƒ]i0k^kZYg}˂WjPAV_"x-l-bU6Mh7Cyr Q+QWf?nn".V+7uk=NÿT~(|6Sú协leoL* 1HT+ iis5kQ1lgc& iDRZ?5(Ʌl@4c)kBkqfW ׁ\ӉV/58+^V/+P1\V EsN2 ׁ\Ӂp[q0kD9yD+ZLdº=&SlboH!p]FId8abjƅ%yIvK]79+V(Jމ65xľ=vM<ċ3Hě܅]25xQ>@>7>ٮfI&%-e Iss ˅7.N %Yý+f>DS9xry=ѓ/k՟-U,voV-[987R[ɫi-lO!Yþ+3XjS^/=qq fO 9aI&Wf5`Dqh((((Xk@}zv'?qolq,fwF 2dٟcg$xfI%,޽d䓲M+n/~}| kϦŬ~q}$M$FnP>5`2?A>OZ e x;Nkp0V/J \µaqy@R ط|dW,c&' $µb+p1 r,L+ZZL$µ`~iAZB"s\V/s,RA[P?ݮiEAZ W,e)kB܂+PFRa^5ίt_z2OJAL2lB;o4[[dE$E<ʓ@#縼5R"\:RMf*ۯ?O_^m3Ğސsźt:R;<ټf%Jkk͔ٚ˭㖷vn@ t2W7۴cU8)x)rT_+|r7?E)y{ķ >y) =O7H|qOqXچL_[<. r$F:2bkں((e-h媥MJO/3aU>E·q5PO#h wӉYN&ZDN,V JX u8*U;]U 1]kU>q5P}8ƨUWNN&*'jeP*ET*NJhaU?*h FkM[WtwSjVtN&QN&ѪU+MP@G>MmF8^U=ؚ:kDكkIuOZ^Ѝ1_JnO'C~Vf?!(Լ7]ؖߑ? vˍ]CⰜT}o>}梁O|{ :SF$~ӻ򼽞OݝW|-S8GUiR+^4c& ' H+VC\ҁa[Ac)YlBLe-BsN[>F rN2V ֹa'`X_(9 x[\Zڹ hs2a[9YR+^pf.W Ձ8)0E ֤"VQ1^6~c>.r[ԝmy9ۣzo2r=ڿQjP1:\}ɥs-$f2s>g+FvɥBH \9&9éRa$ǭr7G4i3ҹ'l*r=kp9g$i$'$cr pyi t58Usڹg,U9sJAZvuNZ:QXTra8 .6]QԠ֪8Qk{J2N2WI$$IiHoxSTͪqZj66%KIR*ȌHaXi[][IiQ0nl,m Ryh 9*HV$g,v6tvۤJ2m6mNTu~%֋-/v^IXԸ%?{FХMw3*Ӣ?qZg)QqdkBW[ÓB]b^3=SOnaGfY~ FYCgnsq+rjh'MsQm_/=7()Y_kY34M_9_|%5kIij ٯ؅A(BWk)9 ^Q)oV-/.4d:dd*TA H [qU^%~M;FI((m*.h=>ֆKxCZ~˪ZUv&X9"' $n:)мUңcVY,m Ryh 9*HV$y= ^**nnɦJM6 5NmuJRn/=G.ľ|EB{e].ckYi<7#9gNGTV-$2:[oqyH+DZJwN76`Μsһ@U Ɍu8U=?Zh 鎕N&Uڻ5XUfJUT*vSjUt⻩U H u6tv{2jSs,U}uu/Wo| [L.#k;Y-5H݁3f)8@PlI)Nz5i^+l4J^xa|Ifّ;7:~b"8Ky</5䣽;=ki{r_W>ǧ+n~?|۝gb)@ZYnZ6ia[9iL+Z\ӏsµr1J wL+Z#8+fkq0l` dµ~ƹg Xy@L+fۭr R Յ80{w\0 ؁ֹg H+V <⌤½/KB.[۲{ۀT SN9'Np䟚glp4/u5և|yFO>𦙥sͽ6[܎6_[F Xٹ^$<6,YD %HaVNGrN9f­'l*IZNi*I+q4U|$sNAVLW,rAVϭrN4c\XEuk&8$AVS) A58|Ele^M5fwRMEM49;. j>.kU49cthX2K $R+G$ņbMWKM& ͘%$O-$%I Ē'F3 KJX mm]7w*M&ۄQ:Mx_ľ|EB{e].ckYi<7#9gNGTV-$2:[oqy[< 9) [e);RݎiL)t1OsL` Ppce)]ԯٚ{ | u<: pkbʎjϴd挓iaov}דѝ_ss׮۫"!-Y;g(^)ë+XhZ{o~foY!$ђ*',tC_ۂ6ΞmTbaJ MrKn:%۟ ~"+CvF晝vy&f8XӉ9彼q}.< is-NjyU^Gt\_ч_%t[~L-6}Kkα!#)h\0 ronl.#dɐ2UA H k %i+M4՚i86eM6(ם))[Ofh^%ּ!Yx׿e-wFG,nKIa7xEhYY^Yɫiq0n,m RrZHJ%ZNf&*nnɫʔJ2mIunF5`QZ//{^W.ľ|EB{e].ckYi<7#9gNGTV-$2:[oqyNzte>ǔҞNAIׯJ# L*ͥqi5ܙfG|Nrp?o1SJ'ewdݒm+NJTOdm z՗O]Z=7E,QI<]hn<'kayfo&{VÅ2QGf^oyyS#9Z*S+XZI{Loӥ>qRvWU9jsYOk5-DŽ>ʯqp5hUHEqD0\xS–[5j&Ե[@pR19?Y^U jo1ZEhp1FM˚[F+DmFGZٵ}NKK*c%#4V ,b+ CISvwWN٤LPZ*Q{O|'ƿiz[Cigg͍æx}OK)'Dk)_[BAY%W)IሷfU?| 'Vm[ڝ֕u-3BA+DeRP PqҧIIu?0cp4Q%}%u}|8l@ rΙ ErʙV >S޹g);lBW4slC ȮYA\+V5(&¶`|⹧ 0h[,bViR ؄U(Ivz}ȚYs5HHOCf 7׭#)H(yn7c L)9+7^$c)*{[>;>kk{y n0pHk `+G*u#{J-JYF^Ҝdfnk%fe_SмGgw%;d}C.vSbηwG;-<$y_o^Q姾._g.UkF瓔PNϼ-](_[UƟS]Oh:OlG_3k$iwu^&o&e=pݲvm8s۽EU,MUVm{7+NWjӠ=њVIsvVך[[I?z2rO]`2M!*O\;q#`i+sM-_4UzSzƧEY=~Cվ|ZKfIxP&J$kBpc0EvUolk7C  n7)S"I1x_h`\?)s-%eov kIeJ\^ NJˤmbںW-VXx_x{VBΫo\t-xĹ\Iү~]lG!Isz,0N8\,mշտ $~˨*Y$|a#St!u-n,<%KUD[Wp,p\k voEPEPEPEPEPEPEtxk^oA[zu}y(Qw;g$ > |}߇> <]E{ioqOVWT`o[L}Ȳ(['(?mMÿ='_+gm_y|}?P?`C+bo۷7>$'t'ٿ,}>~O M} ( x!kkR[yTJԌA8EJp S(4WM=]Sꈜ#V.Iū4M=]9ou9okZm ivmu ų]JaՇ~& m$IWѵfs%d0'11d@pͼ71 xZzŽ.)_fGf| cSgv}.)_V=?6Ǐ~%?*u?)H[ɽ[]H+47M̰N\('8~Upg{ؚw=7vN:{]s<ׇBh֮W{\/-?}x> K%͵Xȑq|a>t.OU<:zcN&ѪUcڻi52bU Wm85S]lUt]jVdMcT*]cUT*:Wu8ƨUWWu8*U:]kU}+6UBm8*U^1»VH*}MPvScW*&~NWsbo%~xM>|:gv>spb!noޯɾ_%?>wo/iڼem>Zc1{SjcW,+Z{k+m-Ya(:U!9W-H]YӼ^/T=ONִ]FO4㺴d`$r) @"q4(tOzgZ-Q"['d1 ;r[xWf? E'n}x3rq]醴ע%K/z^?ix:u>!iZW HV.vas/I=&זk؃Ck d!?2B>ƍZmʽe{jן=Jt_Fɜ_?ra6W!-fݘeE<عT#9漉ĩڴr58\圂,q9+YW~8ҘUgr $9ZI;wI攂+:,朂#4sNAVBFkp9®#yI4UA\)ZI8Y ұ.4d2g  NC)A TPVVU;I_iNQmJ-8-mΣ׉ukV^!uK]ѤG$RXd9"Z9#wGVVe;7jT{ L<6)9-$%I Ē'N/ GJX mV욽ܩI&ܡ&mNU-(ngѾľ|EB{e].ckYi<7#9gNGTV-$2:[oqyOa^E9Hp9=i6sw a%E\8uR :rz*M0˜Ij KRt$a)398ކ!xk6c)'֋JW 涚+i^+:Kd`r#A5*0#Vgi٦M5i؅VTfMt~E/T=ONִ]FO4㺴d`$r) @"?츎T! .]H9 pbvX97g8գ_JURv*jFFRz֚^{~WיrM>|mwnV[fZYY1R d?&[0 kS̰gO/(I6:\q3M=n7(iĸa7+-J$/u.fU׽bKo=wÿLjZY":NI47q$34.We폺4|{_C;GK˸MEL|ܾl ?/EQ[ESnS{JY%d2o\*t߼)'V_ϥ p?6>l|O6D<=M3m?:3J 4JQ74HV8 "8j( ( ( ( ( ( (=UF |GAkV~eѾhʴbwٵ(Y~<9s/~ {p<5 ZFӭ ˸Q]I ;>){~+?_#տڳq;sy^;(BƍGZOmCn!iv䚍H Pc!r;)1k.uq̉_,'8p8C.ͯSj:]-'ks-p]Tu]wĶz̏U|hI>_N4k(Ǐ6< }O !c{Q|oIs% ~#wx8{H.{/wWd̳. ͲJT`W_fRJ0x/xnm&d^-Y֋slIEF_t$WNƩUq6UB2ztWl"jWdq5UBwkMcW*滩U N&]ڻiUUgNW}8U3MFUWOA]lVtwSkWekMUPm8ƪ u8*UwSjwjů9Gg?YG^icτ:NʵO sN"WN$/jZ¯-~}}Ωg4o( kNzHŶ*S%#mUSڴm$no1/_W?m=[G>i켟_m6s\~xB P?fZ\Ӄ1o~8ɅlBYD+VVŻ $µ~9iDŰhdW4$¶!~+p1 ׁY ցsVµoZ e+k+p0VviR ٷl9gH+57:o%9y>XC XVNt{{Up.y0M螛R9Vwo[H/9+Q}K_;1"v)px/4"wģne^F95#ad=+qsNAVL<$9[I: NYH*HqZy*?LW$sJAWC\9YGI A(ӐUkp9&f9gri$R,etr k7z9E/,1k-dry[G)]ܞM|)7FOER BBRyL) %+8c NL徔7cH) *RQc ٌtTJV+WZk;}G4Ϫ]>B" \ ve!xOx^8NGᜬu.;89]-$ dZI۬boz |_EuxTwῄi~.ٹZQNy"kpBBIsįCR5FӼ ɎtqZ-: ".8˞22|Gn (fhPKDidIviYf/?kV|SKDքvIY+M4až%3猿|/E[yq6K{ Dkxml)%dM t>h|VZE~\Ўu$bI%$I$khP4chT(SӍ1V_]4m9Z;M"Y-љ gwfvi$I%I$mj((((((((_?,߇)кg~q|o2ToƎPQ@Q@Q@Q@Q@Q@yxCƛt+RlȈ*`g^>c`?z-?ZKڧe8c-ί,E;O㤺nz+{mcܿt_fOg.Nv|7~\1py>\O;X58 n wBc fc1\'§:MTO6ޚ|c*fAvvzoJRoK-]T/ot_KͿ5kg|-'ڱ[Z^\%[ďng1 UppUF1^&>J{^/ :1՝}Qӭ[?~ s~g} >-S3YwxXc1E`F;/s҉K'cօs ~Fkqf2a[?Lu(JAZ"dciiL+j8JW ԁiR ٷz3 H+^\ӁV-\Ӊµ;s\8V2t\Ӌ2 ~}kq0 y4t|ޞKO7ÿ߷'nd%1"P[GJ7G5;sܿi?O^47 OOcZC}oyymfϷyWR Hڲ'R kp9+[G Dh<[&Nv:g|+X zA6G}燆 \A,^_+V~xٿ9qtӕ}۳oLM&xw⶜|wi-ɶj + .tg[:_~gWqzN.;0qҧa28B2H,R鴴s1tCh?u>_m6 {tV~^R4C}GMԬn-/{'LFU# 5*R&+B馚zW|/_kWu= v{>ѥkYEt2GVpEe)JUH 9]5PUfOλiU 5NY׭wSUӞzu8ƨUW׭wSjUt=N&UwSЊeT*_OZH kZTCug][]A iߒ3,TFoe-~qW)%ǩ ۲G|N>?^uK nu=;Uʻ,tپb7y;s#qzDq{[xm^zdW4/jz5\Ҁ{[z;-?_j񾋨xj$Xfl`Kci$WSjR_'vk,9Zu%I/;j}jdᏈu]?_7xUeh!fZbܽ&pM 2 P #Xլg{k+Ț)mF*Ȍ++  [+ThՍH)-]5i|miz:.]iƟx/hf2IC#X`a$RLVQ(U@M %w_"/F y9bpQJiY4u)IkR5S:jZv>izg3Qg]?:|^kaRZl**{4@O7<[z6R3R~ ?Wc5^$s^,r&S~?ixggGœo;PtTHrD+m CReJKM%:3Ak=.Uo|^3=$6bڿ=z_ 跾u[ꚎIoROuuRwi$KpAo^8mMfC1|Icÿ,Vp̧Xt*gS ~)VӢodY+v]}7/K>wSTOQֵFP5 亻gb$1,K$I&EPEPEPEPEPEPEPEPE}?j?eyVU,A[}I\}bLy˸|EPEPEPEPEPEPEtNoxkƾ?[u Xᑶ)Tx[wgceṴOjh]J@s$-,RG%,&(w5+[ X9 +:LRϲmNUgNN&Q}8Ƶ«:zq7PΝkMPc:aklc:r'Խy_ ƿjF׿j~5Z{Tº @׍{瑿g庾8giʝtoSN$;·'o"통yk5sy^fٻۻkc9__~5hlF[~܉{/v~m<vxi֏/ݿskCwڵ5?vh"_[w6|y{l݅-ZN +)ּ.kp0 ~G58JAZ~( 0Xs&.A[=+q1V,x\V ؊ +lB5(V2p+P2 r+Pf-kۿL,dµn@+q0WiMsPKm7Q㐸鍸E$y^J2}d-_\Eto_7-)F6_qLͨwVf( k>ŸիSeRWkե&MY]2̢; :V_݅n_hgoۺ,>0\j~=LjŶ.|E.4$nxfB1@#I?SԒxo y|3[mhq,ѣ#ڪ 76M`w /-8җYII$RK*VK NWN;o'eKD~<n|#?oG{278wuœ8!gKet(#qᅔ?fS_h#*."G$Vpm{8gjjv62}K,oʰ ~Iqz8n" p{$Ӷ ?jW:kxKRn.<{Xxe1}FF n  O4t27~dӀs$6d9׆XzrY]ǢZuz].Tq_e~!+KveOyM./(x,vqXǺv]VU1x zC]1,BPWJ^-{)+Żvogٜ>|H&5O7JUT*.:p5UBzWm85B~UN&ѪUJeX*+MUPy5t>v> y-~+#l$%{=c&͍K~^8_׷[Zsܿf^ ~ O_lM}o~yy]^ɻx#Cǧv{W^8څ_9\Ӈa{P\k|~m9|HF_ .m<۸Quw%{|?<nKuow]V_W#^?<O|n/n7Ix_]rÑk+qF2v ׁJ % ^ H\sNRV YL+b: +Vkp1!l\0 ؁YŘAZзOʹ0x$r&2VN ra^4i]%T:=>/ 9.,c_Pc:WLm$w+KkygnnDNO=8!%ʩڿ|OqoFTWi)l]6\}ڗ,|5{8M)>ǥﵵ_K zf/Lb5H#] 5=Z=QqKm>~WJU/|E/I]]jsz 92lD$JT,'fhъ"I+$I-KeG_W%b][tVG|EOn5֡#N>faKL)(#T}X><}"huOk+'{8$M2 GWy "ʮ}fUG %k>_ᯃ?uQ~4 J9gnRFeE [rIln!@Q@Q@Q@Q@Q@Q@Q@Q@Q@U|-ͫ_&dԺpmj\L@9@EPEPEPEPEPEPEPE{߃8Ҽ'S}Ln^ŭ+I2[BHP1Ffy ߡaM+C|Q|-H?i2lotfM@oS$0@<#z(?,W"Meۼ+?gWmݷ89(n-紻9fFXfP"$h"8VԊdi鮩GW:56Hhu Veg.%W@0Ê?uߴRo]Q?ٰ^V6,TerWU,KWGw5l^ƣoWi{Rn|%xG2 }SwfwnŚ(cN$Q_x|K4;Gp |o f|5zUױFwٷxwwd㫲Q~Eo|_3>xJY.mw:ƟlD|pc1_Az|kSU]qWu8ƨUvNp5U: q]jUtnm+fr~Pm?/%CVH/كN[xAӄF +pF!C˅ ۫ᖷmǤZ-IWIv3 %N#\);Tb?w9O-]UtUQJջ +,5z˝v2nx.Uϲ>'\x+׎<HΑczE3jpO2jF~ey%0-,`Wl-k%HhֹLR ׁkte$t58XL+Zz e+k@kp1 ؅wiJAZй{,c& r&aZ@MsaZkq1nZз iR Ut)r<ޮ$g Uz$sR W,sr W$sMZN뒤Ni*HqɮI朂+q9 )'(Uc9J9' K&ps\)XWYCRi$W,sJAVNG58ӖVNq\ rAVNErT)\*?l,sl*I'r xI朂+iDZ)nhvڮs>k c;9mqu*ldKJKTӗrQJ -(<'sψ/@ҭ^eՍۋlQ˥j,$0FP?_gHY.<=x:VP {->{A5 y;I$i.<-m |xGU{xG)^uHgiLq #HQ@_EP ?|g񝥷!ni^:͗u]˲OFdJͥ޺Hv堒0ay.n*Sǿ9^EvmnڋkYmn[acIExQ@Q@Q@G|Yx"/>gsod˹56|Z<w *l)۫fi?yyr0;{m;rw=W=?kmn\*G}vyeSy3 Mczo9?71@M}63 ˳l_#\|^WyGx+Ul|G u_xJ /.G{tS#H11HFdH澆OS\޻iU yq5P4R2Scy~m ěܖm2ēO5cSck>'c~Z])-nj`!*3\YdMiG F'Vn1d9*%hI{Jvѥ)jm(-M;oS(~-UHmou s- m20Yn#.;)~w4?E}NN}f-TKPbdX"'X'8PrTvvӖ+݂[_04:V\ӺT%{yQۖ1Jz晣|9}+AҟD@.EtgwZ[OD4x[eiGGh$;m:k{EMݴmy_b\9*Rd "uionzܻ,],Eݣ$ݷ]7W^{_#~,|| zeϦŬNq}sFnb?οN#Յ+q1 ~58Il@{W4a)kB+PfNW+V58ɅmB\1aC\ӁsN<+^;\ӁV-rV.x:fRW|,!Y輿?.ľ%|;={{.b(Xjf[ ;B>?\]|w.q>,x???-fhڮd6fW8qEyQ@Q@Q@Q@W_?&Ʒ^2}'MּhVHiq% F;DiE<)%(Ug>(MGqoW`:]ɪBpO5xݏ{Ҥ1hK4HV8a$I&8QY@O jhs*߄1Cu;t RM,ѓ~r&Co5+\:~iw yOc4[9a bĘF[&j"yJ( ( ( ( (jzkZ.u|Z_Lk20d9GV ^Oe-=V4$-1^cgbXd,A#XQ궷Ki!p6IJUj/{ֱm-[?o*~/6#(zm;)7{s*9Ư{SKg~rߴ?:'WS+^1\լŠ.GH* Ա?k}!Fp Zbn?u.[]%lYWXdGi$6snf76na6a|1 {]z M~Q:*NMޮ]+G%,5҂:$ߖ:tݖۘ_/3_ZnxOm?h6ivvG5ǒϰnn<%d_7ğT?/k_:^ifOM9l:\g) GcB>S⧀b?/ZͱG<>Flyʹp`E~-:׻i]yf/*UۻqW{jnv?iht']'M/orٵ .N3kZ\ӉV ҹgc&dZV\ҁn +3H+ZrNAZ8j % [Kx}R>ǥ[ {u2Ϫ18ӐWWj:xW',kͩM,q5,«kl+wyܩ*K)r[9ԗRO_y 3h4zyvKW^qݯق}w}uR}3L]xo(x]Ym$Ki3*mvSM [i1?kue7G. nfp;or !IdfpvAiJ*NQ䒓4RJ-6iuIPJ40#N~ɵun'W熭 ^<MK>V}(42!f'h]?CX 8%yu}_/S/K}ëOI.l|DKۅ IR-Jm0@O mz}}c域'y~nckeޝZ^iO)c`YJA3(((((@/*S6'7ʷro.A u#0C<_U^N22/;-]W Z/' L\jz)ZEܳGdnujdNCni+̀peª G_iZ5{9-7wD? ,Y/oI]Q-^N%R ^:I/⯷|xQ>U1 Gyq!b(5 78ƛmQh<ۣTue,wRy75:ki̴I鮱7O3͡ӢM)F4E&i.Ui!:W>0xk/xI4}B K,1ȓ`9yR>xs\0 ؁8 H+^L% XsN&.A[8ir ׉s\V/ )H+f+qfaZOJLe h_r&2a^1/ '4]!zPI}vY~o j8>Oǹ~_)/[B5.(j1\j3!߈#I8J3 '<$sAVߚY i)8\Y*ҿ|4sJAVVC\)YY:d$}iH*IW$sNAW@8I圂+r'<i$8ӐUg*I94idϦ:W4cRaVN:+YI/C\&mrN'4hHr+Q9+{$~iw>.Amn˷;Ax5mWZzwgݛXLAG,W wB6.Ք (_B>p ( ( ( ( (=𮝡Xީ.A^&F`[:M[.:?j?:U//j ,.&};l,i$Tk4 |]Gpoi˼Px/[}CB{ZGn)3]\˼ BPw( ( ( ( ( ( ( ( ( ( (*~|>mmO{}i2o|)+[HՋ*m돭 VqM}o}&դx_&>׿~տ|s}Kɣj ϶j 2nȊ\0~򯼔Yw>h=+q2{湥 0H[޹0xq8A[(JAZ8kp1`nIL+^583H+~Ójvh\jsn{EUl+3H^^OOK5^״]GYnYLQ0#mi4jfuWeRXrZޥwus]_HOss!IbYI$rIyC+p9 )'c\"rW дS:Iw] C=zIc$jh`GKvމj" F7Kz%-n3{-: $B*vv!QUU$zOMo?q\Cܰo*m#G3Hp ,^;V _{>_Yes4Ąk o#fNŇ|mxo1{vO(P?wpd{F3 B՝5u^oڱW/qZ=_>uqYNwrDNf$ I1n!k-8E_ >+࿂xL.kiHy p[hU ?cf5zv]g:kO͔-mNm6hxCso7k%[:'wQLď|[x+[_K= [Qq /`ѬiVY-pLP~i~ߋzF&;k觲+#{ujn$aݵ崭ıE%JŠ(?L|e|LexMJx>!T-&M"x#YD2_ es\5W:kn"/gwb$X2 Pڏ5Uw̋DlU؊˵(cA;w1,rI( ( ( ( ( ( ( ( ( ( ( ?ك㎑MsuekVUc5lJK) c%KTᇫV ƄI^g֕ }G>aj|&wC0[;DV9_%wBV~) VGzQ#,c)lBg0h\p+P1k@9\򁌘VMsɅjsN L+bݹ$dµ|L$½4|GD\/=I2If 7%_n9*;1)߄|{ͪMWri512F]yjRCG/qn9:-H9g.V@Gr4a.nstA K@ mGe$|cC?duHaռYpnb.J=%Hfo894}_*ؗTU˖~zX,Te\:U-i,^Eg+r럈?ľ QiDnϊc,s{6I7}N[[k|ƿu+K^[NZ#$"]X+<αFGؤme!X, /mJ}]w՞Ҍ)ASYz+v|mO:׍m.4/Ú_4Vigg`1 4{[Vd({(;\O&e]ctd ) Ĭ&8~!QVi|1ۥ?]< sYNlc׮U͍eeiZ;hGeI-?x;13-&;b\I$Yؖfff%'N&2ח4o$KEƔT j~3ཽOlNVHVfK{tffٝI$Iey%I 9J( ( ( ( ( ( ( ( ( ( ( ( ( >ΫxgX/$VRkeXGd{PVI{JPPEP~κ|UNMU5MFeNVo4nnbvK{IHF %z~ >)?$iҴOx~+XmkB+ǶIHn$m@Lb=CB/QMD񮡧"[kM[H-gӴs.;@$09(=5?^|Foˬ\̷RjTWoK -]UA+x[5 nzTiR4i%i+0I$Hq쨬>Ҵ3χc 1xI֡淧ݕ}L Fgv xLk*Z°rPUx _獼9[&O ؊(?Vյ]UwSuFKBf{bK,K;1ff$I'4P}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@g;O@k_o۾ծǢwAݵۏfܮw^E?~η}~y37lݷqqֿt{[)۵~G0ks$xg·"k5Đ^ٻݷsc8XzTʘ8jׅs2VGz e h\`W,c)aZз@?*YV\ c0x8L+b\*|6έ= 0 f >sx.y/)?rs^R/_KKSڤڞ4I?w-[Zm$G$nRBG ,Ӛp2 HenW@1\)ha\ֹ'R 湧 ҐU+p9ZI=z$sMZGsN',e\9YYG8\攂$:@+%r'=^g; m;@qx&+S͑!WVM <~dž148/ Po}m&mZ=Ԯ7e Ο0Miumnnݍ4xwu xfS߳<S$>^YGWV/ڔe?|F֏,|M=\YcʌBU~bIx_޾P=I3ׅmֲs$vp37Ȯʼkl=5pQI^SkV74E%O8S{Y^Skus?u6{};g<%8? !,lMKkm2B*^$mĸOjK/YiaeUTOkItFK4#@LĉG~x?M."*^/:zŵRZ+%L҆+Zq_.m7lWCڿ|+i:vb:o4q*j:rΫ0/znn _cxž!Ե]Fwq>T]K6UFO@kQT0 QI%}]kԓwgʞ%G|g^"lF]ysq|͵Td ?Z|] h~2k6-,++Jp!>̨ܢIOߝPI9tQ'n .UWދqi%]{Ě>RE ړ[ȒF9$ znhv}c[Zİm (T4PQT I֜TնmlQV[q_^/֯|Cߵj[cHc4E8P$qqƈ. ¢ ( ( ( ( ( ( ( ( ( ( ( ( (=V6s4ږ_z&q DH`|w|Iy-V^ c^Eg^+yeh7FVtm C1@5߃|C KX]~A \Yi4AG`nfFh4~ڮa'ᮧ-ºW4O60?RRYx,y $PAB0;Ơg e[~YYKMkqwq";ϵhUdq>` (4W435;xt/Y*j(H[M>E,"Cr!(u㿁?_>hZOg_[}dĺ&.d0Ē]+(( ( ( ( ( ( ( ( ( ( ( ( ( ( (/+|| km۟\lys.-p_(xp6(;܏и FީIvVv7x쏦J:]}g./K5IOuozΣח`2|-|]g*T_'#ցc&`q\0!|޹eL+VyRVz3@[8JAZIr&RW|oxP w]^$f->]ǍFk 6\yaqT?_+w{%տ4-Cıj{;R#7ɓƖ LBBg97C g ~־%;(MmhId c!片_csSdžorF,OQFմQ^nOW]M;Ѣգʾ8_u'YcqreM-]hU;ųxZt;;I  "`,7) bc/ھ4xp37_lAw~]^`|M?~Rnܜ׵ݮC߯y'ƞ(}Ɵf/Hu_nOۼ3 ߵ7l_U:,~:ewo.Uy&,(TEP`Xpl$2~E>'䩖R|qU6nKZn/m L|ZfN3[xnrdH2(VZP%,_%M~{ꚦjzj7ZO%4S;y$gvbX$I4P( ( ( ( ( ( ( ( ( ( ( ( ( (?C5__?*ͷ<Mbn[HCa.42ԉ&_:[xb"Jy~'qucߵ/ k~oM[kUXM=OFym_tRy7pF]."( >GCM+-Y ĂM?5݊Z}S3LVfŪh~/sn)-|y6^PZLڷfst- \}nؑˡ@?~x3Qw>74_KnCk]R5Eku40l;|:]:ޣqa O=0H5٘*I (U/|wOb#>%?؞t`EnK{tAf&-#sg@,$"OWO}T++M.`".f3;4obY(  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ߆|Xy?e;˪'vs}#mKV}˯ߥO(qqZ}~6>#J>w|9'ٟ%evsɯ: ׇVA:強lpgLqjG۲Y9zaߟ^+KOV>L4ܯ%g[RN'ڲt' Ny(rԏSr H<,sI\Y:,sMZYjiH*Hx ,cr s\) h8җpI'l,sNAVRNkp9 (8U>R,Wg^[87x5>6,u8&]3Oh䶒)R"TAk[߀~?$|kljN|G4zkO]a ¬6qTyJ8xkQϩ{X<:BZnK$gul/Z.Oo,/~)oռ9?,Q:i%ؿg/?Nukk{]/~_ Yt[ Igan-l-aDFC>"Oe-ƌW糜jV8+xKҊ|Q5VV]|Qᯇ.L~+GO ɫqB[MfW'+Uwek>7 ( ( ( ( ( ( ( ( ( ( ( ( ( (> ;?>OLҼ= ͎k5si[o6h\:c|S??_|@_>*x=[/}mgKQ-/$֍¢ĩh.A JXR?.[w(VxKJkxZo5 ~]Js6zܸ2ZΒFckYJw ##:G>y}GeyQ@8x+2h ީwkn׷B+*uw;e̸(˺hO_.8>-_mW1][P[};Ngs1&P\]HP [UN~~"v<NFRkic#,JHW/jP@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@bxÚ7<9 x~gӯ<NjϷ6Dބ2T3A浡ZxjIQi٧uPN;O?`W[k֞[ VH˱h<]Sq_5_}:I|dhMJXeI9u)iF'x&tG*TSּ_x?Ķ_c}qbK{dhMJFRAA#g(W0^#isJ&2a[0zzL$µsǥsJ&2aZ&>3[㌁Ј-d+7mRBDO/ˣQU'vKD<,5j?_$~.~(Woo⻯#g_nQ3#+$0* Go TO.k=c( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=bFitKkhΣsyEwmj|3GdVxEk,h̕ *^>UwzGßti_ nER63h8bykKu4r)ǚ>!|B|al񓮹umus$[ &P@?EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEu~ džu[MbgIIdUeb~uUZԓL֯c_mE`%{*K2xS임Wvˢn)7}>[a}֟vn']z{ xx|Yj2]=ȡ&DሶfV'xXs^ܠtI".q\bnIL+Z#+kBǭsN L+b0:W,% Mc P5;fTk;n * , fA?9Q:Z/]dH?3 z{o jZz,o^]Y#HmiW#XSUS{.=G\.5+U$iG3$XBN4R_q'djq?PZìxU.VHcg5ff8IYQcX'<*=r',U'RaVN3\ sV t=p)[Y9W,rW*ʾ98ҐU~58­'58]Ӓ g NY+NRYX`C$DQI&eކsU/iz^jzvZO-4S;HAgvb(@/wM /m3{?<4{XLQGޜڤdO>wkwk__m"|DZu;CY}5#v>1eý%uVYnnn=&@( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ٛ@؋kZ?{][mto5-7KA7i#fi6EQ@O4% Ox_ >t4}T_x96l ӯ$Eh0"ym5Od_+E?٣i~b ٷUC.S3/%%y%*W_I_B?law};<ͻP?EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_W >8):̦hm0bX0 o6:|Nv2{4^$4c_ڃ*z5?mm-}{GU9o9w2rPdȘ[+iZ $ V2{\1r Ձ89\+^58VA^ƇH/~?ښIjbu7xjJQ%{ȎO'i:tW!.T\_|ZZO+KY[&D_ASQe{dwS9VNAsN'GCz4 X[D}>6ޒZ"7Bd!e"D^b74Nt;wo%tsOcvod>i.kXk?Ƈt|Dc?aUtEuqnLvi#-k1kᯆl+k3^I!isNP xx*tՒ>PVKoZ xƟf>m]#AIOt}&MWþ;dK4d+nP%7r 9 k}o\Ե 5:NY]QiVr *ʒ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ;oSVk>O}{pُܿo'gQiG˞ o~;׷tr +t?}oO}oy{<3/;6߯9{rgUs\2JL% g 0h[+P1r0}?Z pxo8[]xk[y%F-K B1g ,^*ԟH%ҔM8o;[-gZu|I$DU B3H ??j:F>~,nOF~G%m>HG̩~_?/OAң+A9x>XTO~> ώmeIoh C&<7!EKOϰ]s-ZѿE7 ipIf$fbYI$TU>xzj%h3xSZ} ehrvE2[ۣ30@I$K+,HtNR(((((((((((((((iC¯;|=+oߵwxRž71 YZk4wdД|O fGYX,'(Js࿈~)xf;C i {U̲Y@\RC忘PE/ï}SHEul1(D:ua"PTy r>PݤFOt2J׮t{V,a.%@qsMxFF!Vb;~&HmRxzmYyVKIo.$5;id^8P~?t*H-^"΁[-Y;IYd-ڊi 4V~2^ymV'Bݙ7n\ovPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^w:Q=:lj<;i^$1qm$(V`Bݕ⡂PMdܺRPd4}֟')|7{\+ܰ,!-$W ?H\{W,⏢>X_W4e)k Ny_8AZжH5*fAZйrΙ?:|AՔ) .³GUwq^._|:?ǭd)Eķ}SV6>{hxOP{eϨmdyjOζNiKa$kp9.VN4snWA8UrN4e$S\9YAri*Hp+YɅw7>#/xz8D'CkZ3-Lj@r}BʧT-BxCշKoG|*Uߌ^->$H$umNqmaXDO{{p~XmSsC;*o_z ]ͣ b'Vd$m+#qNpdXW4%0x%*n[v?ױ U`AU^_5mSMk?|Si7ڜ lb/&,MӴHmtX-mj"PcY#ľ%ּ_^7j.+:ƐhqEH4H5XUUTY ((((((((((((((((>5|+Bд{I-5|*_Q3LE/|{ |+⇃_kj^}>ScI.'#:YܦQ˟((((((((((((((((((V/_dg}}.fYW0́ f ʱM$?Vҟkc5핞].Dڡ6AqQJOp3K'.qInvNwwݭ=U9ŝ}_5q閶0k_XZYM˂$(j!IP Ȝek֔R>ph[j d¶`|W,c H+ZiDL+پ+WxxX]x>m.n7V63v۴ʾtj5k=lD}C~Oto5گٷ?;>Oov01ޤ:gմ~:$sNAVRAȮY眂F8ӐUbgr t"gr w8攂㡮Y@眂WÍC6%׼Q|M8̓9"~yT{.F6u%n 5=fYo )=h[jMs+ɤW;?KL#W" ɿº\(A6B"Oij9|m1YN^}F,O~W}ߑiwcϊ>) >x*|r 'Su Fܑ1<)nEy,isj:ֵjơP"{ V>aurĤ2"s2x-SJiwke_>.oڏfg^u/2m3pW˨X_&GUzL%+l[iŘH+brN&2a^G:ω/|])/Guwf$mR};FW`Yc]B'Lt眙iekp9g + +p9+a$ 5R:ҖV㗵r4mrN69g I%r4~|iwraic=ζwC h'v/?&|$^j1nnGflFs 3_n2|t?G);`3Q+mebS֤R"[Tc X2(((((((((((((((((((((`:|?<1{ھ[ѿ4q26GSpA(|i/? i5fXš_7tgMlj@FH.P@ac0_|p$h "c Ʃs䕑cvV2>}|3k|4u;;ë~;%l$LfRy<%ԥxLj.|kC3OW|/n7LwMkyh#}i>Ŭ%p{d(޳z?>#[MDTԱ!j"0oW Bs1: ؍㯅+gãZѳ:uژep$tr댌/k q5vVQkm-~?[З,}%;~ asXڤdDk慆xgw.UtY@L+^yL+b<JWF_| ћJe]iqhjYL¼,}|F't+5o*Wǔr=S #?,'.)9Atxt،Q6gHǩ9V\9 hrJ'4UyY眂Y4U|'l+ρω>(ֹwùeX}^tYL$mۤRK3*qqN}y˲Yn %I5GWocπ_3;Zo uO8ӕImre[ZEܺ$D7Z_-;ZXihZll4ں:;b|2s5eC[t}=64dNJKhY=_ǏE־?>,f4Բ{[?en,}SXVAk @@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ u OxN|1y[f/n:?+Xuy<%^'KK]j+{Y=CMO>˩;HnO|/ >1yxPjw~%X%Z}{9ENYKP@J|C]/? jL:z޵}4i f{mm#xmY>BZ&a!T (44[U5]3]е;;[Ӯ#,&h'6H2:VR sE{5ƫxZW5zO1$ a 3C;(']t?;wWf0<#n7O,wE?/#YҼwMo󼍻:.>HbCc?h-5EY/'ndhi}JPkeޝZ^iO)c`YJA3((((((((((+O-٧?c澲̹"M_|!E1 CG?3;[I)ܶQ&խމ*L<_)L gcΥk:4>o79%d)#5[(Ljr8iJA[IҹgsɅwƣKDj tYo(U U@ !IpJqMrv]mLmO< {Xuj=׬ s\LHʬ8$'=+;~>.qe-.Vk=* 0[-0FX%ؖ<8 XRg;^Ml/zmmoek$0ٻwg$x~M:h6W5mimfg E1Bı 犹D圏7I!zNiV뒤NikpsIZI?*Wը|OgXO?֟KeOrRxH_"C$%#d;[Tx? ~KZ?K6 +_X?"ctTʬZV^FbN'evW':ua򓼾hEJk_[ |4ҢKe|:Mi![tWKt:((((((((((((((((((((((((((((pifxz~"oqoo}+NH$FQ{x]#48HWe%uVMvU(xS6o<'jWde-:[C gi|+kUY 8U [G|wzkq%|QhtM%c+ךTJQh{}*4v hEg7YMcŸ(<qjXYhsc!mK I@*­iY(c]jGyϛ4P@Q@Q@Q@Q@Q@Q@Q@Q@Q@G??U_|i%֙kc ]lfwܡ<.%pvPXw_T'|7KmN 뗖6_ k53̃ʐ:VF+ &ke|ki|)[KWVzÿT~(|6Sú协leoL* 1HT+ iBһ')Hׅ(I{&:U/^x37:k:Mor(,$@&{lrGՔnݫq9 I!ҹr s\9ji_5(¿FdGPU_p]Ku zV&{alBj`6eŽU]I 4PC-ͤz59Tiyv[]y'/hk;_"+ 3TΚH_m[i)~c᱂m|+nm"]ldp ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (=S"i~[?>͖e>oOjp^4[4qZkB=?/0X8&h+ơw^5-{Bծ\F4ho폒֓͝$FPAE #nX!W\#&ҧ"q31\^4p= cy~mV)@_xcyu=Pv7ir>,mG1FZJK zu̱g@ ODž>2|?E4v_ض#Xy{ n>]5n/|; \S7ﶟ׾S'c_(O5xO[>?~Ghf=fchۓ t \^p1s78_Kc{~7ھ1.-me459dlKCfpMZ xWOk۩|Z*O;(PX"UT#R8^\Y-[%noߧMSV_7տh|g~8x~#,ֶW@M TYndXW"(Xb(᷂,( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (: \V]񮍪Mi58˩˹Qa|*6J [_fҵ8t/l!iPA9R#ya]6YD,ԝ🊛wBfn|abek;M}l}wB7_cFDR8xKKx_g4M# |M3M,3{iphmHȊ/7cQ|})i_ |;<|8i-[x'lj-J[% 29.Mo)sdմ[MZO/L?Bn)dYcf@gFV%x}O+?~+F57^/]w$ۻ8M¯_#?d  n͟ɼNcWB>*C};N[?q2GQ;cq,)PF¯jay.O떶φ(ZL2#!@~ |\u[ƿܿr~cR>hsN&2a^ux8ӴIRm Fܦh+";7R{թ9y88J=ԩwm{%il%ׁ>'#šf6ڦor84}ncڭcpdGfy㜏 +'r',X:Ρai677ڵmkegM5R8AfvbP $+F.FRoDݿ#y;-{K=sSӴ]N5Bxm,,i*Gj ;@$د skW㞗n;,WQi u3h#1, >LD?geKT{4 -O^E׷o]K|5_.eg΋k |K- ȺƦVL(~VIgs-4=u<#I$r^Y]vgwvvff$Zu*; KD%Z%c؄,v??~"|D/x[r[-qmo3H1˩#V 2iL #L@bg4#>aۄʃ2(;Uk?KݦY}ռߧSվxkE_ůi~*W ]KqyMޢ>K(._0`PyxY~ goϸFG؀*َ3ⴣ 5hA(+%wv]u9Iɶ%ּg_xķl}qj~ZEi%}v8PIAB$*lugR Zdg`hvbP $+FQ$mHwܽz.]jơ)W_ٵ}[+}ѿ4lNʱh_~|DOO/}"ڟkpk -nahY$@&O}WZ{s5g̚vs]LPEHy-f(~| ^?_ +OmЗlo=K^Ǔ?gfidQ$tȐy>Y@2k ejʚh{m^;Y` %KdS!Yp)|Ek%GB*:RWӳWOOF>TGx^-G_\i9SzцTqH潛 1,VP7l/T0h唯tr$qTT8TKL_O0f}ͷ6wVd/iZ،G,|z7) |FVhw:yŽj_I **fv!QUU$yY/MB}?ͷKV쒻0QY(A]7[+ź< k>-gZu|I$DU B3HdGVu~[> yuA$Ws?~+Wה) :B&;-o'8< 0ѻ] ?O mA,&FMd0N0?4MSS5=GZֵCX'fkGNyx{MeԜlv3 ]>%cY۴/S~$x_:U^޷_ jQkHQWY"Mk|8$=mGW/oL?WGgy>Gyy{'(ig߇ 2#J|AjφMNӭoer[$V{[c Q*33<=9g{,|e jsm]N3ˏ~-6k~E_4t"wHaLjQ~r@42gbP?x[tA?x6bю .uLfR2BeV2X?yNҾ"A'`Ưk mOݺKv7Vдm,qʱ(sĞ?Ht_^{}* ONA<IFHT]9%?_ )k Z<kJM˳&~Fی|e^xg׆p+Ӗ+V;Sp^_5ZZ.G ߘm- /2].@zT+<`7S#Obן6km*g̽9ړ"/_ZqˮJQ[Ue%۟B2KeGW}O<ƿM|3{_|is6km2f̽9ڳ.o>#Ý+dyIK}:H\M'ʈ}`>@>7>ٮfI&%-e Iss ˅7.N %Yك>c.xiujEQLꪅEݥS'bJO.=54UZbĶMݼGk,,jV(B. AV ,MF2(f/|cPbF.I|Rر/ !^|@ItDCZvy8Y}ťF 1U+!@EPEPE{Hm43מ>4x<7{ZrF"6s1ƮΊB)oxKOSmR9#MhM%5JPXO)cERE 4I>Z1QŴtr^/<32,ʬPn(9((((((((((((((((((((((((((((((((((((((((((((kG3&/Yo,]]CQn.8iJKƒDX׻2*` Jkg;srTeeIn-URgu~ϊti |W|X9yP)mI-dK0[S< X/_>ic$:$LW'g79l1]"rmJhǒ"Un5 M7ׄgY-Ad ^e`aV"DS#U|kJ#K\xnJԝRAw`ܤG$sF" ~Z(h*mWLռ#ᯈ+[uK t X0H,Lz\{+iA'VP^;;Ku<4m(\M _D_ WT?sCi~?{6~05㎇s~'MjYEkUo4=u=KJk[(&xŻ^E}mBD^jX %Ro2HQb, d(5q /—W mgIdm+RvVxͥorF$rC#7e/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?g][J>*zΧixG|*2iOi7d77R;XII#r=?¿ oxC?4O iZu?qkWΡ[ym[7DӶZ&cn@_Uޣ/mj <s>?i_Ǐo5xN]bePҦҼ}]ldm"r5 \((_}U~kIu s2DB FTq(O޳z?>#[MDTԱ!j"0oW Bs1; T_J>wMo;hm-,NѵeiQVO2 b}q~뿿GOO$j^QsI=.#$茎+<~='UJa.DPHX,O&6ʤ2V@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEhi:jfjwzv\GwgXLOiso0Z73\A;_=ժEωB8>` ( ( ( ( ( ( ( ( ( ( ( ( endstream endobj 2820 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 543.999 503.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2834 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaPU endstream endobj 2819 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2835 0 R /BBox [0 0 544 504] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2836 0 R >>/XObject << /R8 2837 0 R >>>> /Length 68 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`jblga7503-@PB%+E endstream endobj 2837 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 747 /Height 692 /BitsPerComponent 8 /Filter /DCTDecode /Length 82871 >> stream AdobedC       C   }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( l6xWMz!=Enis*EzNC_.^?b1~t 719xZH}WҺIw >]>;jJKGm2bWϺq|V4w31p10AӰVG=:]_>=|ku}N◉ ]CP.F9fd={u`< SOfß۟zYezU?,J< #|;MV?+,,̉t~}bp=")8%lxrz rEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_w5oO [ȋ7ϗqc%,u|N_j+~oji^#ϰ5=RkFVv[Yy$kJtjh# L+RfZCBV+5= эkL)D*k\D+Ѿx |Og ]Q^7fed6֯#2P̨{:3ʨW?15ۛ^\z6BǪ>~,ߖfS[?4rU| >5yGPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYaX]jzmM??$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (OGgyבB:,c{K_1__pDY_|>o^ ^@簭;hk -##·aa7cߡH+Z5Y3٧ZpG޸zVqYHVk-j­ ¬F:uyS;,C{yK^0W\ |=k~}FKP7f>gMSOGFܲ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (k'] EskH`UwܹudlaU}l*y{/?Y0T5KɮIn%cws$M~ׄê)E+#͘RF'ڽPBaT{jA]u> H+bdrBks=:Q ҆>޵)+J8Z䜮tD*r*t¹j,GnrTOgCM*[$(_W~p߻Rc^ad1G|A1ɥ_Wx-u-oE1lͱͯ:mz>|ATi}_YW|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W/xw\j <ɧڠqoZGvڻ\+[C<^Z⾷j]vP3֑xjA[XJBVQ\z8+jJ㔏FZnjztE,caVrA?Z`XcejS c`J^[ rK'گ܏} 3yOv_-"Fw|Gv|ۯA.wKa*0+ς(((((((((((((((((((((((((((((((((((((((??<&#2wB'*hfOᏺ~[K5 ΓےEYCWX¿Fl}K,or_o{CGˑ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@WǸ~0l]s8nvK|7+z;4nKqRri<#k_pY:Iįs_sF`ױ=WIk \+9&gao[qJgN[P\2RVi9p]´#`6nڨu0~C\]3ٟ ^^~ҠW7w7j鉀V Ҵ87 Z yc_'|O ㎭_{JlOpWqvL+H}js+鯀: Z;vNs:rJS|w֝TxkO ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((Wh<7sG ȿfҷ? 4Gmw۹w}e_ {3+~("W8ZGЉVݜ@WY`trGaitVƹg3ݡo[O^9(X+b4 HZi™\v:TW^Z?ja}cW+s7j|Ĵ .dY Ip+U9%Uh2n[̗ܻW~vTp# O¿D|;fnadU<ֿg6xqp js N^eCA^{SL,Wj)_mh(ʪ(((((((((((((((((((((((((oм ö6"ڦrC}sy?.6L* {dxQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Vu3Mz&g-YcR6$A< " 1~!#&]ַv%} rHv>m`ɰVNbW st^"kB7a]5> @+'chR k^lCy&zZQ5-N%ðʺ(P={I@"Tu ؇yilC.=¶]C+U/+%w_ߴ??t}7H+J((((((((((((((((((((((((e G4#w?}iMz-=0V1ܪPP4PEPEPEPEPEPEPEPEPEPEPEPEP_?QE,q&B$*Kkmۉs~ϵW]fMk_ѭ~cp*+ߥ WItR> H+=q ކ<>N$ωg5fKwd="qb"AsmraiH!ΪФs6kMzg^WOioғ> B]mjǿB!]%;;W YGVQcן#:>GҪ&± 삱0$艌哰 fI[ GҗS[ ֩evsX՗g+S 6Mhl~hWj~α?\Ρ}88v_¾~+Z^u^r+Ht5T8UOּ4 SIgx#pG?{?W39½ھ(((((((((((((((((((((((e? Z ( ( ( ( ( ( ( ( ( ( ()B)ϝ?uM[)e A.?ihxO/xsW4#\XjG*Qo{D#p޷> @+\t [zןVGJ!]ydwӈT6p$&`gVL5s˸VL ᖗ b|_QB!_S'=oh~]Sg+f.J⩹ jjGבTW?Z OzkXwC^IW};B>P(((((((((((((((((((((((WnuI?ޏJAUXh|8ŷqލ„m@7@/|37V҇&g-~͟#iWUxglc#`Pgߍ>#fxᮑ$:F/EO@ҭL\.1n(?i_u+D|7{Ɔ{GǮxf8E``oqcM÷-J⿎Ww/Fg ( ( ( ( ( ( ( ( ( ( ( (į37#ʼ/ Ya^?+mD<~ԎJ ` 7 @l+J5){@קL}WkeiVv=u6?Z+=6*Ӂָ^Y <֔JI1q]00Y[Bt#AU$Vq*֬Yڇ=?Ly1/i?f=%|9o uk$[/%u]LZ̪nY#5s㧩(((((((((((((((((eG5j++<Т ( O}Oi-y\Fp$GIsWBS"g.Hs~vxկeᯆⲱhu\epTEo c*'8<_>|;#kʱ{tۏ&޿r J|-Vtʾa%y_{^ƻsSɂ}>e\ָj [g,Ws}bHWt W|')uRx ~<\姈4XYfӟb6ynvtZUO #:/`76ʎ̟)t\V>W1[P@=z%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@S|A4?ُw xWG O%[(Mv2c f((((((7o )e|U IMw9aN7mUfCBҠWƯƿ.O ;F1xt/yU{3s.I qNUWhD/pՙ +<[sD,ZCK~~ÜUWaEj~jz6mO=̋vxUI\&_U[Kkz~cuͷq<[nUk~CgVbWp>wϞX0N?sTjA]ƻWV[/*_yQ=RAְ@U98-Jkw-BLĂ}kxsU']iT=MS9%UYaT[9%UFTiz›7Ui'Ɇǫx/c8n N+wBmzpV0a[~yw9V̪c0>ןWsaZ1wW_ Kmˮk!{_9Nꔿ|qʘW5PEP_ߵW]'¹̒Z—Io]+H_ |r'̻|ZqpZY_gf~Bv^S+8ⱜOB0lN.%XL+Ҽv7kȯH`B{kP8 ٭[;_4OѪܖK"p'ԧ]_[JtC ]>_o~7aTɳhlf;]UU} tW#WlpMqUT m?J󪠮Nqԓ<+9*D+c޸%;ehu6W4sϔBHk݅ψ [Q/Ս;OOȳ_iS'<1,L>S *˿(Ov|"O?X-ex*̥&}_ e+WW?ƴWk_`tV͝JW2B^霢yuJ{PHf?FQ{8{JZ.ko>*HMm[FFkX*LI ϕo &UV4 kvrOޑ oڴp*u9gUizҟS[0Gyv|U:ҷS\zOƾIVS\0a[uZopUa[PwוTV]klr/jlrL+{}OOo s}y7ʾP~|Q@W߶ǟU~>MmYMNng(۝tM_QY/9Fw/1+~0Y|ukS]%?v Zxa#4;t`ct;W$}W[eqp-P -.י\8{Mbϻ^&P+Uxupuo W?Ca_KjV^JJDEv\N*CW((((((((((((((C?(6 %dZ4IZM#XA@=Q@Q@Q@Q@Q@WN񷍵-O{݆YSOhLb|k[j ɧۢHз #m]({({35}¸kc{W%Yt:: -8\ 3\5%cΨ[{ם)}Xt9]%)mHv:]ǫ_#*A^js[K4muJW7>_}W ^E|E%I{mYv>}0b sZR᪓gN#\0}1~#x~8,f];ŞG ڈUk%ao J+S9½D*J_d{y~x:A^ci8f^?X2h`|W;U/[AXŅQf6 #c` k+@-Ѿֵ[L*zjsT +vq`ڄsH*8QRg uﻄ*$<$}pt[_iv&U;>~a~J>]d y-no\5L[+Ϫrnּچpzyuyi'Jq+ 8T+ʬpH+2NPpu.F_P|d(VlHW-xs|Wf +T^}ݍ{qՉ$(QĀ2M]:s?gO܂  _⾻>#]l6zZJ&jUgwm~<V NhLmrkF tV{W<a]X+oWMi'q7ONy-?W:ѦQT:VU+i{ן34i{7$79i<.lL]A@SEPEPEPEPE {L𶁬\0hUsga mPI©< Q{{濞W6>4"ݹwYwlEorWB~a\$y ۇ>qL+vs#{t\UeT+'&e#Ϫۿ)uDjLt9H󪠮l5a=N0LHU_^OÝc6R=+Dʯ̏,[_GET ڟowO_+PWxBOVի8U0b಍毇fs*heU}I>'T+$]߀+hT& HU)[ WD aT[hUfZ ҵG,=iU*қ8IRGXjw;\Ygd=p&}P5#0ۭp"[+Ψs0:~U0V]Z NbNFp*§68eWן 5A2'i^[)dv\{u}%qu½Jӌ+ Cï 'ͣXKLj/F`,B#]6j=SjmW}>T(H_ҏنG4{nMc#4·dt{jٝ4{@6c=lºKnA^S{o[t?J⫻n9y¶߅yշV}MyLUZB*LUe\5a_H|"5> 6vS(UO8ya0kQۿ/+ O ( ( ( ( ( ( ( ( ( ( ( ( ( (oل7Q X!W-]j֩0д1,X_k+a@<@Q@Q@Q@Q@WgL|M^ܰMZ'ۍy>mFpT9?zjW|=H*L\$qpS\5dqpc\2)t6y ۅ#knº+F<3V-N ]?rnsڹ-B2n߅qV70NkI+gRG]/Z_m'-W,w1??;n,g&_r/+×Tlk^aAUd{wk{}Sݹ־FhK ݶ&K ܁ rU2 59PVyLo~5V9e ؇3sH*z*S^Mc}7PQ>o+@wcoO⊽iԦ|k1L;n<#cϛ~St_#ڼi+[}ծZWC vyNyt6ּ3+r++bד\Z Ѿ78Uz K =WVԡQ{utGݾ:0<ҀW]RLx'C4%yvMvI6o~T[v3O} gUWh\wpqp;2_+pkD*ytcpF\(R]u*Zq5}j++̙+* 譺yՄº+^yMV] pUl+f>ZWTv1>ˆU m*T'Z^uU3a\r9qT)a~x;Ė+ANfc'x:h~WO [+ ( ( ( ( ( ( ( ( ( ( ( (>_ 7kT.U$_I_-7Y;Q@Q@Q@Q@yψQB[FL-2K+3hGDO%W,8I`2~!׏q+jۥro>g¶\8npMrKTpT ܀ֹ$qT ݁NkG lW40VUWqc0ڸH+/~$7.3їc? ϋ2d~;.P6[Q3gҵ-Uwj*ձUlk`Q[slYu0PI}j, Һ }i[U~#{To֨UC*k[k9̼}`lc[xaO|=I{C+rٱڸ0o\uLۜC)n>3WCoםSs ܷ> ݋-´S }lp t6~նꗟ6w/ݸj|,'5ژ~~7{>o7˰Qs_4)2 # Z#ptDڳzU׵AJ!] >UpW}6 &z+WAeWuZ⩰WAmkά6w>m+˩L+j۠ng+Q~6\U6&!W{"b::baO=MrL{G_ ĩI_l9ߞ:/+[<$+zB(((((((((((( QΓ-x??c>>?ZvnjsnGh(((+ !o|/!9%G7 ry{~Swnڻ}l/gjL9bxLe (3kYk3aZYM ٷHV] rVջq\8jw ۷\R8+rF>#a[vW 9$l+z2V+vݎ+A[6Jg=WYc&r+L~ <xgec(*t+~_Q*8ĶMdVzOp_jytG4WCAPjs*>9UGTr*T9RnL #h.5$m?gҸW[_'3eV=MsHsOcn p۪̀Ҹj۠WPΠVݿ߯:4VZQ5q<~xCRFw8,卮o?eeDl0tb~h kZk{^{^ɮ&Ĩ(Qkk,e!5jΤ@laf\  Tw9;c8?j= \bkիf]o\h+>SbWGikt? *VEy+z>J.ZqWT]W QZEp!lezןWc6*S|4ÿ^Tn/@j}:W1?X~c<wL+((((((((((((M+ˡXJOn f(( ( ( (k^jvndӴ8 7E;fnx6Rsc'rx+ <4Љ Ӈr+fTVG4 ׷#a[EqLVͯSI ܷrsA[ptZL+fߧ\R[P_rV'%0[NItYt]»*mCq>"|l*y/7ִ]R;>X_fX˛ݗёoXiBt_PW޶ AUaP?J՜ #Q-IWn9XTG< Y@*iR~-+v"g*ߩkd}Pp^j/pxJm sH+~݇ZH+~~Ss > -WW qڼ9*w ԏW8W>2K]/E̵zH)_m[M_pNC?S?=α\؅xJ 1ohp竖R c жqi\+n.^N(VݯVyt?\ nPWIk+ϩL+6V=ڣ ڷ.iѾkp޼¬ָe*u\5v%LD=W,½[I_D>ë/wfCouەWx3x?iG}qAEPEPEPEPEPEPEPEPEPEPEPEPԟ条iz»]7|YmjZ1͡]2Mqws}w*ƞ^0$̰Q@Q@Q@WUVu_Zm9#zݼA!D!)_6T{8]|TW)+F>jj\3Vr[pkG µ 9 ڷY ׇҸq+ns+n0k ܏ҸµR+jE gQkIKC.7M~mB_*M5o?Z?4}'|wNڅ|}+bT+V@TuT-ҶG<~QsphyV=MZ9Y hsL*u9%Uy:lTG,3+״8coKL.uP^tfb[V qHL+>ioڶd[u2C}kʨs+vבT_8~ DurXG/k8G#}rGqazWKI _ZOaNvVPWgC4rqSs֧n¥S\(Cم]N,bu;hVݯ_¹R+EqȰ~Tkpe Z¼ʢ[n6l+̬ Hz r/^}MaWC^| *U\܀\Cq-Zq ,"uF+#Cم~[\>Su*8W:_o0~aMB(((((((((((/MҼ]V6YYZmmmHa5R8WPtPEPEPEھ mgAS/6mKF+/؈nVGApt2cs_mڽ9@5 S\u: ^i+F;+J9IV7153T =q~qLV=#a[uq+~%CV=Ұµ>3a[p1XS+^ɲٮy !]~~sH .׼'i{!i?7U? {u#/w~J~8gS}Bf'kZU*£1aPG,nhaU۵Z9Yև4~ь¨7JqWnyOetj`c+{؂*k~擰=B!lgұ[EsTA[W$1 m[S9jڰ޸kL+czכWcAY2? ^#&Ouoۻkˆ0zgc!*~Tx^ԼUj#5;M'ڙ苒N(\.Fzd^xJh+)z9PUu jm Wi]}uj/OαabOҡw ҆vD*w:kYº[_\D[_WTnZpTWIoy6 ߵ? j5V ^3ꂴ"Tܖ?q̈]nL:؂kFh*\$+]FYym`~W_}ԺL$ڪ+SB(((((((((((ut3]>hz֝mj^6/,/!YK!ѕwҿ o>4?|qi0yu>ɵx/S?ieϒHw@t]./b=vIa6T i݈H^J.ؕ (4>X9+V kKTi%V8DD,Đ~П8|WWyK]K6opG"滲e2R6 j}Y~FsL+A8*a&ڸ%0!fy*IV}nc pO`ٌa[wrA=Z^Ous:SʫM¶ҹYS`:rT8Vz z 0X ִl5a$f7sH½3SoW_XG?RzN{_Kl6B-KVux۠zS"=4}?2XBBð*Azݘ*«Z9dY [9^J*h{RzHVuW LiZ^^ ؃s`[kk)[6>{o7WXWCjq2ztPt>WGju6 ϟωI_]%8IU3?yo2T~]9k:ÈWtn|TZ\{>Pr{]+s՟YJ!ZiY3ՈU~#;Z:n>nX=[}\h+6]= ۲ºkj*[jV=EyUL´: ָ*B >aKUϖ̀7JcAN=MsEYHx\_xBեt[tlM;q0u^C5-@ (((((((((((WTuK])3]reƋuoj3ߏ!e{i$iQVU4-h;yk u+m>&T-y4Qk7<&x8!D4tk᮱m<zK&-›+#dyUc?fkg XsA[t5#AZv= ѷof2 l#@@/S쫐>}_0W~L˨h:MYFS|oow0qYڌ/w%ɏL?u,*Tsn!W~WT ֵG,s U@lT߭iUJ9WgvFG?#z([ >kn۰kZ ׁ5A[5-+f>Poٜ ᫫&}SďG4?C6?ܩfېxv˿ݒX*|1>;_)!_ -~J'*jQ@tLY9U/p+>Vӽ6t*uKcZJu?QPu+~ڹ^Ư`ߵqȤZJiӫWWqt^eA:y zjlK Џy*w Ҹj:aNN\RŅ85yW H_I!kȟ{b|wloeXaq>0(((((((((((> i^ Ei_^'^lߪyW6|Š(((  5^+;mtҸHsYsV{W"7ZLk}6AE߲7cٹׂJW0)2@*1&g0㞕3R Վ1W 9% wG<UDujŘM[UfBASҏVcS gpSy-EXC4 98_ՉUaµW<9k+G,kG4 ؇WB{]ՙۭl~գ0{T~g$o{VoTa hiT=M*PrUzUW_?B{:[u5:k[b ׁǥsMbl\3 ݳay oڱ*=+[-«x^ zgaު3}kg㡗@STԵBVկRmLL,0gu?iS +FNNHevq}MA8:VVu`4k¯UeztD+F/)#!] EkF+\5CWQe\5MPWQi+̬K }kͨ? n^UP ܃6iEWPUػ}kΪfpUSC\ *ZdW$J + ggaWp]'L.$:_O2PEPEPEPEPEPEPEPEPEPEPwMkw ( ( |fOIj۝QI\F[(oJ_hL639ź 2ARхjǃ\u9*L+f(ϫ㔂"g-yH+J8pL]C|-kquO/zqWM8PSn'lO(C\wYK`jiFK j Z9]1UwTIV= Y -tEa+z|*a4V ZDkA+{¶ <V2 +nݳF!]C/qq2CkY(YQ2W_D WSWș srS[s̐ᖯ.KXY>N}pJ+*1GX$`C((((((((((T>OjUmǤCkGjњkmp!D]7үNPtPEPEPkz^g5ޥw*mij$%q`u-w-$X W{~ɉw;wo^?uL2~zζ +B< 疆5%pxk)\+f\5Q)i~L圂3~u/#s #k#p!gn|*j*];J4$)ҳQ}( 0Hѯo x~gb{9uu&S\95ynoҹd]-º8W =Hv ?ڿC?GLEnM|UO?: y]OwG2e~Ørx?|Gҿe>AU[_CFkDa-«3aU4sH*ճAU* ]7nݬ+gRº>*L+V&#f+bV,v ׁ Jn@"@W` noO+/ݸWF '~_Wv+p * +ҭ~_?\>'E@GD*j 3N)S P୸TF Έ k[_\]»}'PysV,+\UFº^^T ¼ʀիʪ[Q(y7$+NyUvPo¼(*} ڼnƂXn$)QԀW觅ohh[tA+~n(B?1MtdPEPEPEPEPEPEPEPEPEPE}Ib^!> ( (( +/^3%%dV_=ܬOJSԙe*v:mv6nb. ~5ԾdIIm#{R?Q]O*ݥ]\$iTo+R?oh}CJ(LfTڠV*MTҠAR/Ji xā$R\b)P +O^,n]Ez+Ǫa[0Oy4 ´qҼʊ^TT+@ŸU26Y*3AN^Tl*b ͧ3E/c࿹,}_gԽ+0W׾xEPEPEPEPEPEPEPEPEPEPПO!u 3>ү^wNO)43,RF~d[Z(( ( cjQ|hoi3I1lt6W~]TIJl_5zPHWuҍRV\V29*+><ڕmɮ ¶",^WXR a'p*ǖ}+Ϝ*o(zѨ MԎ*]W 6. mQ* (T݋@½7CZ|NUO^*<>kK+H+B\9j6>&(tP psѧpZ: [򜰫}#cpApvEVw+0C \H?J }~VVN_֜D1?v_%ܧX /_h+͛}S{Bx}j0_SBփ Tg4«S9^ 4[U!|}Pz*UTAZq7%}kܐVuaW&,Y/&lGlMxa*{ cĞ Fڕ/)? @[5V@@;F6<$(]ׇ W.Ͻ̷T 3ְ;j u1HCxhu4D!R/JAV oA Yn;Z:Rڴ:vv+O5Ŋe^Wvy+וTop{דSqjFyu4 : $h5V)nHTifŸ\$)ֹgaUYSb&lWwIpQgSl'^ xO \UUBǯ><(((((((((( }GuSN=:Z-m,li*G.K1(E{oϬ?fT>5ǒV EO3K R,M!@4@Q@|MyTs:=x$V;-vϗ} v}PF <8=kkԦ695`PDYWg)uVvT*U lzWWSʩX+zOJ2=kͫ#UB,HϘ*QzָfS|\7hpp›Ӹm4\.P]-Ɏp>(Y´X]->kHbn\],xF/_]s1X=l|QeKG]>g=zNU_x[?^#umz\e⾯S_hWMֿQ*jу *yTn0ҭ)T׾"TA5űP *qPPUJ ցY /xf.ѴV'>:UB<ЩzÏLw=kٌl|~K[PRWLcp ҴOQZ{F_^ȱC>D^?W:ַ<.RRf*eB7VVgD7 #cB߼9q?0}y+b.T]B5T2 My6+Skc Ud ~ u^"}k} 5+Ɖ:d~<ߴn߇!_^:F7 8=u‘3 4Wg0x G ӋW<[vvQ ߮ÎwڍI^gc=6tۂ ռַPֳ+G,2u=C-wBs?iOݔOԂ6~ xFoxUX?co2g79ڻv|ACkSrwp޾ U# VoCUSt9$ F3*֘eWՖC]mqb%XITjf&EIW\&޲?}x_x_+a|+ʫU}+˪B*ZPRn$kd0J嫸‘5@ GYW蟅hh[tO ~`:9~{z^´鰮B(((((((((g3xVzV}ح>ѠY<˻[tޖx_Q@=Q@Q@|P|[MD#@T#G8a#F X[Z(IW.,53)NIV+h4L!]\{04ee/^MJۉ #_1bhNޛد2[|3S ?eGܯ;P6&Ug ּh*ZkRiBZ΅;Uhkc^{BԔpv{Uٗp^>?*=X)^Wa@YxMod䲧\֦p'y{W1|i/iN@+?h76&ӡOMdom7?ͷwPˈG#*g⽝Ok}Y ڒ0aP ҄sL+oG_ՍcbYU {^Koo&cgh|}C/~y2Y>U҉%zOT0ASwFU㭶7J]ooH%yxpU?yP+I֔3@ԭQ*qGSXX^3[=Mdl" f*z*ΔY3h> *eI@+q_[jV_mz^̺a_dhjV{/Rcº$>2aVS jlB "ڥ0 1 E1确y_@sAM*vTHֳjBpy;~s-?Ϸ~ $xi< ( ( ( ( ( ( ( ( (oƙ࿇ߴgI]+_Ɓ^=3Zmo;^sCp>0q"]:!@,@Q@~J*\~D_ڨ? 7?#d2¾2+a5)=B?bO|`_*H&+XV#qpۗvͫ'ͷ<~kG>"y=W¿ immxcէ v[bmwE؜e|cViK >++:MKIlu;8.ܠ iT u=}O^4Wρb1:('HnLlN?qׄ3__ȉ_GWJ'\N+s8`j7/u/~^ASץJ-^VTn{\Hk_f}Y}ba]q,Ir}^)* q:V>g5킢MZ9"TZ_Mnt*zAV)Gs`QYXN՟CVb x*V)ֳf *JtjFMՔW|-R]pNv!>O33{H{@_XЩםP]ךƸdd5"n-«_c1V`r>W ZAῄlAѫ_[•}Ϛ{}[_l|Q@Q@Q@y/~ 5K8ԖHPă|ӶvAdoUfJt^0|/SW9|^ |3-WQGz+>b5ݺFM?!+Q@Q@Q@Q@Q@'ZNJ|}dO3>i7li@>@W? oo'E-d >XGmu^\5߉~<5;,Ң]\.U~fQT$2YeCx!aܬZl|-oes61ƗpJM((;*X# ŻKfTY33<޾W~Kym?M|hg;kڟrO]s@z{zB3 Ś޳쌂iGCh*D;qW~MkfZaU1)1{TVhh (h T^Kkͷu|x{9lkG/P:rW+tm{WK_E.:¾sixf7ݯ_#kdxx?ɣW[¿1Ɣ}nս*^ba -kTmN[K6oO0]Q6nv'+֡Cٓ|*=`XmC}3aWucfھw_eW+«lW$+)|AO^Q )#;YN#xNԂEB5AR/ZN4m¬T!RVFV*͂Ġ*MV%jiw#}© W$_+}ο/M~k>_cWBUY*:Ű^-XTrl*\V3PuTuXQP^wTm7B"GvlT ȫ^ 3^ {}_PEPE%Sx?uҬoƺֳK9\M&ʋQ6ݑ\)#7?_~"yoGgei3"n;r/fs35{SS37!s~=4{?ռk]m|:Gّn_+R^w:Q@Q@Q@Q@Q@Bx?g/Zص}C^?'v.t>)8ѵ8xي(=nxKF:X%uk[kFFO;).1)tyZƟ*|$Rsw7y_:F[ZXNwV`C+6Zt?T%}\eQ@Q@W?<&ָmI}xyogR+{xty/\gW_0eoχCkOpCOO*p<:aCS [zAO]RXHIt!O,PHJ~+|G}G/ ~o9'za\ޭ䂺[B-LX}\wJa[Oa^ ^(F@i} a9XiP ~j؝}F[x^AU1 x!oÎQaV)3XtYo ֓: ezVH rwB/J͝()֥Gpf*eDMBV'@S50pii}7?Fq?މx_QW};WZHFEyP^Eq=MqHTRu"XUy>s̾Q8ª54Qj *{ BQ>}̟+dQJS,M/iBt!_wxO6>!+[Ӻt|wS:9~e l?~[C~WצwU -2+khY'qB2YF>{5|i 2x7uŞf3Di7GM(?>/smHf?į=KR5mBU/&/$k˧i%]%W^a_c "\f}1n;,O5ںM"o3;}n+$ ( ( ( ( (>ݯ6tW.ïPկ>^aK* Z mכgFQ@aZZUkPZ r8Ԓvƹr#\.%ln.`6m9ݻ޷i( ( ( оf+uy۰]1C'q?|Ga=/_OZ ?+ ^,f>__9~o} j|v+˯t޵;3`©|E{~|ۦi، .zP]4?y &Ez=^5GaXv Ocae3,@3$*cjĢ5#+fx0 : :1 {ԳZJf zԝ*ATڳtD*g)Sd5Tֳf*zZ 7 ((*bta[zEp$Յha_m|?&_~?e+(z_/Wc&t*6\ ,X5=(*);V $R*9;TTGF+4Ooa*yoR/"U`#_3K?_k_NaҜscm Z}&xuRck6J7$1˙iMy}@ʱwڃ;mk00mi:LV#$Uc7s^^&ʰW#|-qÚƛx_:N ǚ>WHmi_7^~(9ϸ0(((((g?j04u?XiIk F;Vv:?υL|~O۷o6KSI% skyjڕ<{g :IhݶȏQ@Q@Q@Q@yĽkN$h<#s-xc2>0ӧ}8dmTw2\7?ءTu/Cyvk9H:jJ\ќg# ɔ]U fj@HM tHM*Z{T ҶơP(*YaS\E9V(8H{:}_.όP[~tQ 3?ʽ@T}Qv uJR YM~Z#dgyd~}zֽ4WSم2)8fVa+YgܕP>orևkXCu}Qd_jΟϟUyb/Wj Zjm_YV"U /O5ygj>VAKB/[q 3UTڡQ t,!RjϡN lo-n= ARTRPXQ\V*/JR (^l{?aw_?މ?QBpM~OT\Ug'\)nJ` D&\B=MJ ;? inj0z5Uo|@4yoInY޾} Bܯ_UP|2)+/|P5 :3[v1|j?/x{@j}!U~k^QƏ ^m4Wayp1VFSBÿ?+L׏W^YAEPEPEPEPEPEv<|Hk~)լ[)+= A!8>;ڶ|.񟊼,%:>=e%uamrbtݖFUi@]/֗ ꚟ]h:g4Iu(־!M$??iԣ{طOMvW3(i^2׭h=S9c}2x[iwL2/_6#:Ӯl(isk:֝Bhz]ۭr-unWfY&_J(( ( ( ( ur~RzuM_Ϲxud~Oz²9}y~nSJ)Ca#R ؾlDBnSzU; (5Yf,on`ijTYkqRN#d2jj Cnfwq^*>WSQ^tȢ皛gݝm`OFIz5}%|=qlOݟ+ǟ럲u}_C?OquR>!Q~e#գ09Hzt˩H*z0Z!P/5Q<o^ #Xq7k0B=Esֽr: /MztwS…qs]Еt|a*t=#>©V ATMޥ-|7J>…T*uRΈ[Nԑ&mQR΄az3xn=ftJi3!S@T%AVEL*Yv usLxRf*EPa]pb0 ˉe=n oz?sq]tG_XOW'繎uWJkq1W$?5=;QYQ\U /0SPa^w㏌OM2(HvTpw7'>Mr~#Z!(8$ hj""Q@Q@Q@Q@Q@Q@~њG>!Mvw7wc[w({<4c/m>h{FA]qRISj)J¯p-Һ#+\Zn"`:aU?:}24FY֌[VejŦN*:/ՖxBo{_Uy9O 5[ZGWj&3M {ាTgU™` NTI|8/ t}OѸ:, "lg=l91aV+ۡ3gʿڽ9RT^{g>SVI٢c*e]M^/rf}٥#H oץM<0W#q"0kڲ=@yZc]²bc³hST#x-"pc@+]e*ftG`qЎX^u: 2u͢:0*fuJzH*JP+#`(5 *JV+$֑H*qm1}9wOѥAw*rU{W_>OϰP'_T-Z'T ҹh7j{]F*jAPK4W;[hokԿEW/;W|>g>?7⏫K'u)i&G_RM~B>r7WH)CV;t9 dV^Ϋ{O>hkwk |xmd)+ͳj#es]¿oxg5^[ˍtҹyjX0h(((((?gm*ⷎ.+_Rմ{ ( ( ( ( ( (i]gE%g11S$rQ|'L:/('ЅO JqW&vֳX$!NN+384y{ψV,/@] Q+.U>ѳ6 隽 Zg@UwLdfQzT2 8ofo+WEˎ? [nJ;3[:Wa{ΞP(Pd-/D4U-p:!_dخ<9t]ݯrG`ƽ^YSMױ@c\q+١!\<ױJ+=zvRX+UCѥN¹Һ tt Ɲ9"mcΙVє.?Z4aY6R+YE+g5=a++)ڥq RtD*uDBu AB^Nlj:= GPRZ;J*c u#@W`U\rk [T*K`J[ uf ºWce6mkP1K@+mVR{ܿI #BxzΧ?0Jxy:Rk͞u R©7jŚB듨V^}cڽ{ ~4L1Ta:Ji?v!_|Uw//xd}R~e{n_idpGPW̳}}3@+kѤv҅°&Vȣ)k+ CCAc>E7)?bFW.*_옊C5\ EPEPEPEPEPEP @~ ~(mcb^jp걻tH÷[;LJ3)@<@Q@Q@Q@Q@Q@W#D&҄rjE?} zyc2&aCi~yֿ ?&1[Ty ӆ6'5xj15ʐW?p?tCH+dL]0gdPV|] ֭XIV*u q TlYAV,%x QV>U ^2Tӟ+|V5lv55I ]|!_:Mtx Vu{HeS_ps^ ~⽚*tt ct#޽<؅fMֽ;:+ۡ#,+^+^SW5v0סvtJ,+:]q5AXtS[v+"t+U+cVkF*hHW%H|CHK ȏ*T!VWC:azЍUTZNPaN^CZNPuD)֠OPtIYIAARW9:&*RaVHSk" ҵy Not%'>0X`Sn RUf\尮30ufnq1}٪ag|f:_iP+7_|Ak۳5o.V.ˡg?y WHWm.lbL bwR`:MBx#]? ޹w?$笲mV"$*&$+t ׀1Fm#@m4mUWm큖f=ʔvmQ@Q@Q@Q@Q@Q@Rh+OOw[cz-?KK GӗͶcCu *gvPtPEPEPEPEPEPEP_G|]{R}@3%qUa{cz[ٟeFW@S߭z[gL12;V, 쎁\0\B<Rf nץzΈ =+.pq]5 ę3>VD= +Ul]d;UU!^{xu÷z:V1  ڑ ޥ :3!VSGS?Tޡ*uY3;[n7 )3xH*QS#PqRT5 ViXbjڀ Ь (+;Ty7n?w%|e\':c Q}jx}+il~n«+4 Cyں_xjv6!o]8l >@+.i;wGL"q/Jp ĔvpȰ Gi|NX?۴#eÃ%ۇM抹Rd+ ( ( ( ( ( ( (oxо~uo?k]yF3?7ڶ^ ((((((km~|[^i=.ėvKۧ$%<}qr&̡l~˨nI`DQnty6DV#ߗ:*xuڏ|WPck'5gT 5 )ojrk`ۥmV4xZ(*zS^:bF(*2EjlaQ?QT,)֩ zo&ߦ"e5x}\kuU_6lSwUً75!IcۦMj?Ueoc]zW@Uv);"v{4sc8Ԥt+B0vxF&pvqzWdM+ezVD}+h3F2Һ`-e?Sl+P}/8{:3 m;w]^SARiޓ;2f *ӥ#xYO+4uD*j zF*u4NZ z՚pҰeXTg= }T+EN* R>pץs u@(+<ͭ%]p'W^VдAEǸ|7)f4>0~,~Ж &lܑm?r-ˇc}ݿwe׈WWSO55K4Ϲ$>F7>CYI]fV|w5t6 ʚNNkbM&?wvB!YձTmxwA|Uh-խqXXuH-2[KR _ |GͲ-V14Yo3HrB+Ŕ6)!teQ@Q@Q@Q@Q@Q@+T^OmBFio$:9cNpB˹IT(((((((/oXHQux5Fa]9 mIrڬMEeuy9& ?JYU\ȭy+t);g?C:?C]10@DNgʹ5!Y涑zVZ /JqضM֬!UM ߽[ܤ>c |כ38r^ `5[#@C +'ҕԮ lV9B?xt<5|/SfYTB-xA1 %ٍi 8֝ G}a_+p ?x׳@U9׵@VU?Jt;bsױ@W?r=zW5x0+Х:+^Q-hN=+;=B^EuDp+xW@I?Z4AY3/CZĠWlq}wa >pֽF|R i:aUĬ_Y**Q* ;h[Jk4n1F AV*M¤)蛾v =_cST)&cz?޸V GuGCzaL:9Te^@[AeH0z & ~[3t^NPV}lt#JHetաO謭sc`k+]8O9VMv+ֵFZ\]iXF(ier' ;tUVc ˲S}2̫~\ӵ Ngln.+hFXB#Gvnk$?b- K s,f~Z̟I|S~úZ?gukdRKFP#g[|%BDZ, 'lyw UǕP_^Ɣ35Z@/ Pۤ6 Uq5}݉VjnwR /׽@[ft^ Εa\^-Ψsz4¹ۑ5 ]F˰VuD ǔwb;)d{V(+D+{X8q _{0q+ Bj}Nq;T!S/z(*Tne*K7UT#*w bp+#`5 U,)ՑAV*MRPQX.R*ugV>RNSn~lԥNXTx~OP.կ+ɷj?ܑO~iq-l__/'y⸂bbsl*ڷeg.k]ΈQf ;V5Vsv҇C=²<lt@*!N #^O Vf]g#$9$ ͏QڴmRWf[P? o??‰2:3$yKuiz-ܖN4pGe_]KG|k[[Ny^faYfiFI-Q@Q@Q@Q@Q@Q@Q@W?T-/ɸX1${_q&go7Gƍ?Hgu+/XV1]nCqZi^G }jz4xKH!Y$3:{ԏkzT6= AU{7=P:`?Z ׭Iht~x5QW;pN=뾖ƌ+^=k3P+l: uCA:sEt@±]h~t=`޵0UIW#up׭#!VWfΘX^ AS jYԂm+`caVUs cvaz:4AIR|56 rt?ZŸYb(+7lM6ZmXs|w*dp?A\gxY.?K싎ɸgVtc<ΫgiR0SnX n2>_W|dz5tW;!T*doP.9EEg_A]:VSֺt*uAM#b^?=_UoؤFnjݚ@+ ( ( ( ( ( ( (>tKSi:=oD-"iP4:R%Uj(u].D"$K+o!r煚9#Fenh j( ( ( (6uM+S.WӮ,Hnbh9ωtďLp֗Qb-v3fO?R^O;4}s :GׂjW]x6A\pR3])*kD]7V|\V gO!qVdmctD;VU3¬` ֻ'pe*-3@׋/o&iM}Q?2<?( (w^[5ḾW[\X,"4W'K?:45GsԀT EzNP^V=zԧcX5R՝i+c"*GD^#P һj\(5`YW5zc̿-k¹aV7$wix/|t ^5+y3gџ^aSGSF i*t::VlUT3!VftGpD*uRΈ=z&*UY H'D*k-ͷ zc\Z@*`7 Wkk |xmd)+ͳj9:bA_|#xoH𗄴}3@!-l%y9,Ĝ$I5V6$VXRH#u4(((((((~7fPx_dbNA^mt邿H(db>z ( ( ( (_ٛ6muM[&S[BoG cFٵ@|L1ouM^_c״-[]K}jSe 3l&'LII:߃oxCߌoZx[},juf~r<2uGe)(m[S5KxP&řxbtߧA-֤Syw1PeQ@ᏇeωW7MVƯč7(!kˍ.2]`jwExWƒ[gT_ KKh5)m"B]Y#B <3 ?3 W'/^{< J\gg°.rRt8S7 ݫfhI ?k脂?湼jR6ҵf*n⫝̸*ڑ&i`n46Qkx9{,ҘW]i~Q@WKO긁C@أ:6xV{?XUc#~p߿_+ tfuluѿze0V V5R7W?r}3^#` 㹫 \WdMB'Xw#Kp?U+nU<\^>;^Np :I7 : vG`ץK:UXΨX^(!SJu@*zARVFVQ9zhj¯:摥žXtث\*ʠXOBTʸw4*z@/-tYo'Hm]#W4sCGv1 ?i&Ӵio[?__h~Q|[<ҿh+߃Ǘ mֳVћ_?K?C ~5V-;Bu@V4]p:qѫ'Tkdw ˸+0 ʛ]:=wD@㠮 ?ÏMIGXhk}$(˽TݵyXʷ~̸~W)AEPEPEPEPEPEPEPE} B4O,kRÞ 9pQlduvTn&w2Q@Q@Q@Q@?S#^/t 5=:G=2,> [c(ӯ?h_RⶰƓeMOʒ$+5xiMMSz,;{VThc%uO-YX2+_Dgdk`?bkn~~tP@B7/uɥ!m 5xf믙 c4`= [/Ȓ -O/G᷍-a EDA}8DP#*Pj׶Zh],z}L+6DqؿtovoVj("c?G|('7@qF__=/0ΧڈW^k~W^=0(<ڏW/rZ #5v֖5U&ZծSd^5 VUVZwdtCpkS^UN;¾dԴ3Ǭk_vgO[=㷑j<风xR+LTrlhvZMkZ]̗?f{2xv#ΙcDww]Ǥ\PELaq6 u7쿮Kb_oK[-QgqUhM1yM\_у[W􏥇POݯc5Q;`7CׯDXw~j{q {ףOL+0Hz4A\qVXW+]4 ps]5+o]'Wxv"j}VYܟu=f/zVӥ$t*}ڃ^NR:+֥(*tgT6 vVLSV@U\TL*W;аk֡:T  Yu8ʐ;+ίSٞfkrz>_|WxInYwDn~y?Vq?|?=O$S^]"Ք ξsx_/>Ο$xP?:VvCV%ou@V${ ėq ƸXgS;b ˗U3!XQ;`&]щcπymkrCD:Em(82I9V]jq^a_xEPEPEPEPEPEPEPEPԫcv[Ҵ5O Z]\f[M]:;hpֵOŵ!쑱@-Q@Q@Q@Q@Q@Q@?|3x\9?:1#I,J 1Ə$FʪE}u⏅?fM^oMbhBKy7WN-/nW.JyrR4qMzPi_oƭ3Jt \ºlxoAm+NTP,5D+jʅHV`J WT=GWKH&y8P,|!U4UW((>>(?_Ɵ2n/5{g}'u7Or<`M[U)խ U235L ݫVhjt*t2©5 Ni*hhg)o\j-?Y~Q@ Zh@f#0k^4O"5w+/q+]3}rW5ݵ\Y\* O%C`ÂWO^MWDAYZvp;J+u޽ z0 g^#TpiC@;ڽ¹סcmDwo?;WOxyfx_sJم_i\*+VspC:huZ ֒:UWsKڗSL sosxZq\хYUJFYE8(*a rѢ I#7y8-fgV)TBD6^jRy+/EZKL'7gbb\U[i6K6eV8;0ৌ7XMkz]mcO8~±H&xXH*˓R7+  \NqOһ u+ p9lNcһu Ɯg?ZNq޺@VL㧥vҎU=PUk->W,.kVUF[XrOWtNoe!oFw%{hd. @$Qڥ}t\`d PEPEPEPEPEPEPEPE} @eЬǥj)|/ |n - Ğ.!,++8RIiS-W5'ĺ[0g[l##l2rv((+ʾ)x9A 0[*J ֵPReB+Ft05e| \Gj/Sx+ѯ@_|#b}U*؟k]-G<]ЖxG-EkL [Q rb^ 5?iP_W s4e4kk{;y24k Fq _fJޗ7WրUCpO~a;cVtt}k٦vpyשGca\}^#h`]tkӣw :z4V ʜ ͘V۵v@+4Iq|\tټ_mR > ZgJ B;Zt ڡ1 kv W%O6 \J X$^ fVPT6沑 P3tVh_Ӎ9jŸ,K}p[;;fkKO*R?)'Пt+-溚 Fڑ/ǢyS>6Rt@>?{%|y.2>\8>Ӻ%o' Wˤr9])°{~5AXϥv#шVo]ΪaXw0lV4~zIklu[q)\4 ct~MUy#_IV^#(+޼‚((((((((S?;K #6xwAԡH֯"2y]\mvʋ1@ ⯆|v%[~γkiږ;^Xjr&o>mr[e+|(usIƓ-d{{-Mm. >E/ؖ(|<č?!c/' :- G=A&tK4 Ok>'{CRmedo'LZ%;6GH"@o 3Q[P|Ϗyb[\ UFKVIS$ x;/_|yž) Zx8Wif&kA^m[X?xs! ?/7-齇IgTA#İgC6x."4{#Ie~qT}Ne2ՠ Ey}C/OƽjtBM׫HVKJte^0(ݾOZ-!~3K<WxfpW,?~Uxv| ~_E w7F;eFs0{v&R\m8gGۂ\D+}z;is bzT »];i`\k1;+xt wsDVǧzX ;cKW}8 OO>AEW^_yl@o*U]^"n}(F❆ڞ}5y#Oqur$͹ĒI&΢ ( ( ( ( ( ( ( (>3ñkZ]ݞ&sLccYM(^h-l|HvvB̊P|=.^4?x#_o{dgn0{ki}HS̎hPG]q[x{ߊts$Sxk۽m+inN.lI|_&9.nW* ,>8#uxdR.yg֒y(t%_&Cw$Hfk+wXV_?|_5{ogCexȳ tynnn?4ep|aYF^*> 4MB$֓ҹ>endՓOp(R|J|\1 x3V3:χ2 }5#.GK&|PZW`cR׵=W]w[EAMM - kҢ[,2o$ >Va|fooZi+jؓV{f"ba_3|wO%s_>3xBxwY.5[{M EiVU>X((((:TfvmхeV+L҅x{:W|/yS+ik9pw ~aeտ~OdB/Plו|XqpyN cʝJ9 "[08mRֈU]:V& AhhZT+XD(+毉vm/=}K/p*{W/J}0TɮH뺔D¾?g~2A>%Ӧky#K}NZ7ᔆ/'|j>U WΚxm7R/67.v7@YkxOg~[+W H>;@>ױLATߨױOcd^κaXҦt@+zt͐V{קLAX7 +|kDcWuwWe#0)zW!W!SG]>VVң¬ ֲ:ezVlV^> + U^ sɛ9Z^ 5"$nkB98`*yG|EB08a~79 t+ʵ + 0Χ>bB~7?6s|G{+:͡ৌ}k@64=.//OmlE\ҿy+S:SSTGɮT5 .]H r:aX7+]p=huwFԻs<}+BX7} v7;V{Wm(Xs5z4wD+oc+Zwu;Yb (Gޞwdke]ʵ:*}(E_xsπ4/xr%K8obmN쪉n\sm]jx*:czAAEPEPEPEPEPEPEPEPE{˥!CִkRiyay _T(ucUMG\5jwgb$.ĒǭEPEPEPO 34xsONs qFK4һ*C q$2ƑQ@Gx+⟂?fNx3◌g)q rTJ$7[T3_ebX<+;hZΑTώBoe ih~߼}4PQ@Q@Q@Q@Q@W5oxG/Y%_wyO}+2qt] _~5~Fm3PlV_*_03us\_?gP+쳌W'-Rh}+^Cm²OZ9Tdޫd"nORVt!ȤVсu "+x,+ߊVy9? luY) U zX`žJ$GxGD9<[(:߅PqfU~fkԧO O/ ?Th59g ",ho]'.7c*zWօ{"gxC'Cr*gO)˒W I~gD@;U^AYrZuD+~[a?Jivҽ GTn;u2\ơ2Z[7)ڻGOُم|L&(Y_i\*D iҥ :GdBJhV# ­'z͝ ⱖ fjUW"`޹*'CYW &8#ܓZpsLcWkH$+x8aȳ|xt+nVuԗ>X+l gTѴ95+In%sDA1'c Z__lkh\ڇvm_q/X{JI6O ij:'kiV?_|3|-5;~̟'~xu&5J5]pBfO'fO:h}^P:?Z̈́ ( ( ( ( ( ( ( ( (O٠~'j7+m|;\ÔX2H-Q@Q@Q@_Kz/c xA;yry6w;ES@g@k_ |-ËQ>jYRQy[]G<ĐA[UQK8|JdP7fp&?eP#eɧD)6>Xfff(((((((+񇃴c~e_ 4-1*x~ΡfYmҏ/,}|k0jI7yR̒Wc2?-|w%x.K3V!\SBAY1VlGLd*sȫQ: g0N+7 BkuxLb!ϰᚿPW΀f1?A סB$=Ww z\Xh6IP-ҷ,Yasjye\ (Nt_:b!G3P*3U};iE=ZTe^cl?OױLV-VѤh ףH[`O07ش,{*<j:_1'ۜ|_*VӽOC!WWθi{3X^Ψ]yD:5}"N v4Z(~-SnnsupxOc VՋc{T00*bRZT+i6 d01Wg4UƟ&#·g]";@ǹM*yu*7H+=?9Gi r^OWzӚbbqswFjR n۞)r)N{FONW=vf(i ff*P=[Soz:?4{OXq,]'wW|`z4x')~ύ_"GØ=b8QOsIˈĺ> TrEPEPEPEPEPEPEPEPEPE}I7֏F!5m%4{kD-..7[Y#u(/ C,K}f[{y;hxf{/,*O47WI@|WyaܿKgo6*G'l{W墀<(((((((uI݌w6lۼ'Z0C9qxJ~h|W'যϴRIn,1-.xv[/>*aN7דς,o۽Ȩ+.hUNH+*H5ipVdD)0U #tƑ8ݦϚ_ mzt=2Zտn| U=0r j~)h >^vw,/oƲy NERԩE¿jubS寮$i.]y3XI$@PE_ƫmoceKefnú ){,ohEWp=;TҽZNgOOֽz[P ğשLVwatJ(+ 89]sp,_Y+>YZZ>_++Q_ZϑURq;3VB;#UOQ/zLt+B\:"~SJWcW';)D+i4 ߁<3趉k(ޖMݰ73wjT }++;QӬK; k9kNa3*^Χw~DYEsrЫdspOt^`R2WyoJ(L+=kOVkz)@0|*mz $LҪO|eni0kЋToBx)~~Ο q(Q7ծ38?C_MV'pQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@,x -?f73Z}[[}fY?}6bfEgWhh5*/\nu F|7@[#6p5ko+QXZb==_wg[׼UηRX;CC$m GFʥr+Vx{5K Nww,gdgX`e^((((((((+üc;(Vuq%/p:/mW/WV|~k~c5ȅ|⯁>Ⱥ+0n &#?p|W,kcLÃlx5ՓZgv ŚvV:P+{~m 1 eMJ遼:c0kU;fVֽ.gv m~ k %Y:6v#_.S[S~JGlBKשDV$֦v+z4cVV+ѣ9l ^_Ro%YȞV`N>_oaL>+0UzWq堫Jg]0lvG` ҄v@*f ´\ W4a#vz5Q4~({ ܠnDk]<)+o\y^b|&W4 sYO*(+ "O <_⸞_i;ЯʏgK~Vݻw?5JlIk4 ( x!H'dE* yq_,|AKْۏۇ88Sd9ɫϳ_emJ_YW rneO̧BQ "aBRi|m xSTyV`I~^OistiXL֝9H+~IXY4jٺ+dlVD7տ>_ 5m šD6*=],qɬBxrS h5 ( ( ( ( ( ( ( ( ( ( (=kSjVoxC~O;}}n*ah{0i{o j0xAFs Z^c˹q G]`UhG( ( ( ( ( ( ( ( ( ( ( 5Wě^3< *zïcN/,hB׸u/=C\XJ [ɋ=dӇOޗq+ocoig/WKo1n<+%ƪmB|mW' OG2&3^'kKFo?(iQ@ie!k)TQaæ%v'PQ@Q@Q@q^?PgmZa?k20uNx0_ HUoףKsU%WG҂eWLV}#bu+ѧ#ŗCn+hhͫ(}c dWWœ?q~ ~^@Zp }BhBVgfȅhœ汞GVqcsMG Mc#v~8\v4›qp#^1\n3+ bq5ɋk#UB^F&ƐWПMMorGyFr .HiyCaY~s9/uЀW_EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_«OQ8$8vVK_$I#5a9@.@_Kz/c xA;yry6w;ES@ S#x|Ѭ)S71+eF;A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~{IuM/Kgm~q*_WJ{C`4]JwD*Vks!ZG[1w շCchn\v6H+P&zG$VH^\WJ'^]B; )D+U n+?;g^p25|2¿/9sJױxěu}\Ka?slEqnjl.:;ئӍWPEPEPEPEPEPEPEPEPEPEPEPEPEPEk:kiֺx,#'率 H4Px2O?ۯ&Z7Q.7Imnɲy4P3IJ4(Ծ ZoZ/RDXmn6kWg)%X)4PO؁OEt(J𦗦x׼?PGyxrWS4 `?8~A2M~UǒP_^񎇠x/O*d~׵*DGX$VdK,c$4.4PxwZ ѵ]/Ì:ΥsȻonF"\)cq( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 8mo!eg_Rܚk$OZyk:G@*GҽZ[q ȗRs?νf ƹ)p_A~ȩKW<+ j _Q^^ޥ ԍ@tȅ_!ұѶZ'\W4=+n}դbDqqzףJ'Ir~z4xr7bjWڿ_',>+yZ?߽,cNXaѦ݆_mn,}em ΰ ( ( ( ( ( ( ( ( ( ( ( ( (;?Ԧ5D Gu bv#aBcw1gʔxF k_\x3OuO_Yk~ m~{L&0u~+G10ƞ$5^sukwr]\m.Ffl""}_@???/,!vaE,+H5omWfd?bo?پo#7@PSx[1zŻjޝ^6,GY6ZRts Һ®Ulv@+FVr; ssI +RkkR:ֱP#һ@;sW?wQ6\vw]Z3qUBCZwڽy]ʶvKq+"" b[E|?xI}/G Vgդ?nnVV.5DyUCb|?,»#Ќl(> (J( ( ( ( ( ( ( ( ( ( ( ( ( ( (!Zx]u[kv=L24$vΌcs;0B3?>7|fѼt^1ڿ-utmhͲ#c]6sEf/*Y>)g#uMW߿}(g^l<|@o/.Ui'7dă $>$|,Ci6u鿤@:F(UӒş>Mo\+s޲#UI5bj z|MnIǘjn?wJ~D_qVc}Y}BrN ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ռÝ2@g]{Kq_H^̪&Qh]>VV^(OǍkV/5_umveh M.;TFM]#|xƱ*.BO7/?sz~}_y LLgd^cos𡿵|gW/?&~onݟٺ=Sh-*}*񎂚ooy]IܱI;ﹹT$H!gwuTUY@?YZږciZjҖE-gos'cWGs'ykբxUa[Qֵ ]9ͮ0OK=BȲk)C߆ןqnӾ-khZm}b)u,ya DjhlҴ'4]*[4OQlb[xt-R CMciy=Ͱo/#| ǿ5+o׍ kSm|;OV1!e% * (ӏ #o ǐiu=>~uM1/9}EϵԠj/WQ|}'Dݧlⶶ>40[P#yrgk:uƓJХ*xcZ[]ыC%י&}B])gœx/70~s/-WVXVѤ";%mf3PQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|3?L$UğiFϘ-|VaK}OWa`O})=؅gO:j׋acuzYk0\O򗳀W痌/^>3ϙnv9-_}?4kcMv=v ؂3ۥDh3n&t+7^N's}c'¨I!<+1ng]х wP<\K]<,M@jZeP9*L7 #Wcm¿R?[+!>ۺK1&VQB?eߺf|H +~Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@[Z/sT,;?-?{skvnڗ#;o(lh_S겥嶿nΓ{MOʎ'[6yqJy[STf_:ψ{z?[GйmAwm,v1 y & PƫꚎj77uw}{+M5ŞI]ى%Z("((-W5'ĺ[0g[l##l2rvGX/?"3{?tH.5MKr+VmP.#H5wvJ5fmz־%wu ut+T{wrVgϙu5(]YE=}wuQa-Ms{oϪyP+I9Bs޺9f(N Ÿ;W|bpԐW=q/8[sR|*W5q&sNr>jչ |<>-Gíja{]Md(Ϸ?6ͫ_%T'BqxPZ.jeP<&PdvVy@pv 6(((((((((((((((((((((((((W@4sCnl5 VkI$࣫CPP|t^9ܨ,2?aa>~ݻb(kW<d[}.WUߌ.'ۗe|W?VY6Mm2Y@-xQ| ?u~ew{"u+8_p5u$|hj:\kVݍM ֓#xFGV=( ( ( ( ( ( ( ( ( ( Zp<"l}){?Dy9ooO[$k_WsbJ^*[ <۔Ѣϖ_lCz_Ѿe_W{j|w?W9W>ftvg=?MH626Q $X`F]?]{:OFmu_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@!_]^:U> %5[+Kak,i3#:6<] xs! ?/7-齇IgTA#İgC |ң}>XvtmPc <(tSZ)w%ܞ:ݰ.\ad6J!Ř=uFkPѤkV[Eu 2Xn .AX ]5 y2Əѝ>jxQ@PEPEPEPEPEPEPX>!4kKn/-%eƴ}'uP+ƾ2 կ>euuʿ/}&GƵ*{8~qxT]{Wyp/^XuRW_C؟i\*M"EnfjdP Yx PaOx3+r6pͬCiRZFAmmjno#ߵȍAWįK?x Jx_մ_d1i~-'u{5ơ[\ L35|EPE{??|ba+?Cy~ um vҮKI?xQ&&$8Ew/w,hᯅ|m6áqH>]XI^VZ&}2Ȋ@O|Nw|{?m-|HMFYj6 /Kl=ErMڴWExEQ@Q@Q@Q@Q@Wt_~Ȗ52GA۠5؊~νC|0G?`v[vO/޿[ۜk O>#>}^WZN5i|^x{Jpճ WÅzƟJvesT+ǘ|-oxZO'MSɵ׾1fU~fks,m<5?kW7/tO$k6MBC%p(%cD]ͷ5?S0:caF;ʽ(((((((((((((((((((((((((((((((((E7_ WS %ƒQ|5]iky~gnzo>P} YI~*ogM?݅_P5Ox@f?g Q5֯~N ik YAԬlDz[=xn_:G0'(ef^h) ( ( ( 側`H0e]t-w~^aLM?g~\bG`Vkn%~6#ۏ޿8_ G+BfWBt6Kʃg͏'?H2:9\=028Z O*v]-BHںc ʚ\t]VW ə\QאV=ĝ+'^W=s'Z5JGV~*kɭP.A~'z$/7wPʮW_*nPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEz |Xy޻NoqX*ζ&$m6.H݊ _ }o6>> kY ?w4IV KsP̾\LP_O#֓T'"Y5#hN[^y-̷d$4Pj6#S5x;^3j^!ηf,ҮLFWϘ(v@gs-oU .>sT+%S\gsH+ثZ=7w4Hf#46E]]N3 Rr+2y{[8a`w$KW~`wQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@=- &?]ln_b"O~nwQ@/J*hjy?;m#wyco-sQ@ 3NmD,>}O/}웿}Q@@~ֿd*F~fٿk~?uy7E|C__Z_W?Ai{gϟ5tPjksaXNVR3ZL$Xt=iڢ|BC']&ڟj5'y#hmP|a?⟃z5 1nC+YYL]Mu2QoQ#n|Z;S[ D}SPܣY#O+<&/"5eq/9𯁿7*? S쩮~ϻm߱q'OtGEBq_2']#*{UEs.IQ'ϕo {Nc+Z/e<-;pwWn+=?k')BɛF]`J9,P5:3Rg^aXK]Q<:B멫S5B{ޢs<)+ٗc?>7Lu*u5x3 /²|_q2xrޫ#ZTW|#xwGtx4KȵO'$XǒM~1Zu*;ɞTQRh(((((((((((((((((((((((((((((((((((f׿hO^(gxȿ&[:xñ^][h5s;4,r(U{8ǥfV/n>W?\K=ߗs)i-DB%yO>FV~o_ѭ]_O?ݗ%H+2_֦rD.d#n˹k|$jPVTC @3+ΫK^+SXz|)a^L*uS<ʓ<ȯ0K[SU .kCUBcO|~xkI]"l*oLnl7~oUYKCTNJ4W!wx?NOt-Wt9=oBw=(ǐP &*(((((((((((((((((((((((((((((((((((((((((+ڷ4dUGB)_«_M~$>Jcosc}o5NGAhY]l~uO@:7n.'>Sد.| O3 So_yp[:AYxsXU?XuGظQ֑W^_K&Djկ_pW7'MJVֵZۧo/G!#.i="zQۣK|z^4fV[2Z̳.M?ޯc 2 bj+JMCK 7¿5wnCbN7Zqa{>K~x+uxrFc~eO5#uBw,ǹ5#[Qԯ>i q]bQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|`+ܺ kbGr\ydo`7nUU{) NU/zc3w׽ɿ(ícZѼE. 7w6-aiaդA*k9?é/>Ҏmv 7|B*L+.y}hF"A]LXΡgK4(gxdd򤸁aY[;b+/[zlx ]kϭ|x|Y GF! si3?X~_[ wy/w[A_5>?4~]LBھc'oUM1.]k+G%EX@߈e?;J?RZ\[>55g$j"m#VؒK$q𡿵|gW/?&~onݟٺ=p>9QKOOxPj>gljt{7~^3wޙM֊<3zEX4tNkG o2ŝO1.<Y J(((((((((((((((((((((((((((((((((((((((((()].]w:qz4]cmGuӚF7neFj? rJhjqQ\ƺ5ա[euĆdH $DG ~C3P|]:?_ ik A~К/"%7,$hR32ux7O{]x+km>SCNQ忹U7)@> >!|p,tvO [pA`&\6 ,ʊ/G։g⋯xɧ]j>,B])|"ZjX0É QrʒGo%ʞb>z ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (: x^|OzlWn峺܌he;)z(׏`&ho05 5,|Ym@o"S(OK7-SK|1񏄡xQwygoY,F'|jMI ]UmI@mB +LݬYxJ'-θk$Cͺ1,K=Cw\x⎉xZ]7eA6v7IJ)?fⷧ_޵E{՟/ h~%>~/Mm4Yd.lDț?#`1Ŏy}~C(5:e5%)NwW+ۿTh4 G׽ײ g* q G3Ni_'*Uk G*U=W ?T4x KQQ FƿUj_zkU:7 5«R{_.©ѿhZu}pNCGԿ to o* q G3Ni_Tto?ps0+[~K>];Sմ?\Eqiږuq4k G-3+q'FO; d:Ǎ`(_x+.חR˨$bE1|aaTw}E,="\Pi&*Moq_p½KNCGԿ/k G*U=W ?T4x KQQ FƿUj_zkU:7 5«R{_.©ѿhZu}pNCGԿ to> stream xZYsF~ׯ#Y sN9D8ÉYT<(K IֿO`xad8ϮAF 2Q&uG1ȰH lQٓ?P^rx鿻- /?] O`>#M=79FE ե˦:?M;\ݠ.Wg.=zj^ iF_qD+U-7ˋ_ɼY%DS>ox18_( @Vy9ē8?PP%LCbRZrbiQcPO=vYLuZdf9e4UZ?bsY`-3DL>TQ:9?`h 3[Z$k憬^>*+ͪ-n>B 2`p,,y S: !\Coo:PaՁR14 F)#](j2>~_ ҧԗ/{T}*Cڢccj\]&P@aQbܶ\bTd_ZupX)¨7|9w 1.t.\F9i6=ݣ* :hSnzM ]ftx{Vh_b4s )יeP33f{Q ]C'@p*^aK\l,R3T!WP":xt֑ %GͦIdbNtۢ9QGD>>ie_фNxoͿTAp qJHs&yȔke2SZfOio?޹t;æje2Ī endstream endobj 2842 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 512.999 585.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2859 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP\ endstream endobj 2841 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP1nc.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2860 0 R /BBox [0 0 513 586] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2861 0 R >>/XObject << /R8 2862 0 R >>>> /Length 72 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`jhlgn70330Q5ֳ4200j05205Pp Bl endstream endobj 2862 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 563 /Height 643 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 563 /Colors 4 >> /Length 25532 >> stream x}Gpw/Z "l(,BFֲjUXQNLqV-ׁ.?Xl"&n$DQV,|"f "Dc#{rs}9gyg晙gfy:s<@^'1F3k 4|Sk@whק{|T3223" !1?>KX3CJt1= 1+CF3@:b*S!#Ԫ f4 TG0CF3@+;bȅkPe80ȋ0#^L2e3+dĒUAe3T a5bu1Z#d2fn3yq͇2Œ} @\|!fk3-n]q P|cVe2Cup͇2?=M2d1֌e<.3fk!#l+37Bl1d\p P<ਅČ1 .y39_<.y!jY-h!f80 o/&2bUb 690Wf̘2@\ fIXoUFp`.2ؤBF*#1b<.3BkeF geq^f1bK+f<Θ"1Mh1dD+2MW[L P q3We\1#3Ex9bCk5dD1sj.3!3Obvz/G`HX;fnVe_" !!2U$fr/C`8L8}ep!^PzSp`Pe b 2 CĈBF2 2 SȈcFg( 2*ftʈ>-&ǧ|BfUftnAР\㩘!jPH!#zۗcFp̧7OGРu\||Ռ1JO22s*sp1܁y1# r[̌z`~IA`M\3fĐŌ9-[LJƌ h.T1ZȈ~WeĶ34hx #d'߿ )4f(gBcF4rʜOՍr`^1gO|E?: 1$#̈!O΋Xc<0OygJnj h tbIF6*3ngKF3ԈA 0 2bUot{z3ʸ&L-(yLР\36ǰ2fo6f1#pC ڈ13%!A13ҁycJ \@!feĐC1c{(%[LbF6\- H1fFnjz(< uu|JР\L٢c.Dq22 b⊙Kkƌ h":OǬ#6БBF*I$f 3-fbƲ[Q[+fA p̷ C d=d37͟}Ʋ]Y3f{t^LE4r>0RlpŌ3c/3fcF49ABFlaUF2WLTO2bn,wƌڸx#flJ=feˈ楜1k!fA]\<"1ӟLzȁye|vI,9cFJfxF 7+fSc)gH0dClP\1h3[G{͘1g&Xƌ`<]бbf+!#G̖n_1k-fA\DX1ABONWGŪks̤eZAlj?bAF^1_[:3j?bAF-c#>Ȥ_]O!#re _ w|'wJ~8@Kb^L73j͸:1#7=fx{I<n=s3[LbIVLwJ1#13nUn1]njpi1s1cKWtK盓<6zv,v 1J1#3ncFY!/=f.Ll4Iv1#hbmA#n"fWnpƌ_ ˞;cFKfČz1#)闬<'uƌߐQZб3ft=[>񕏮i bm!p9fWqŌA&ͅ%fLŌ h@̸3`舛4VCF̭_ѵ49Θ1'z϶!hG̸3R舛0CF|t}\2錙Ȑ=ƌX]и71F̈Fbܼg߿潞CFl9fL1s62JAe"&v,F1#~3v (fAcZ3p$d1UwX1{AȈcFxn,ߘM_98DcA7k !7k#OLZД>;fAbƮѕb&n1sqq3/dD1Sb,[M53vƌ$htF f±*s̿/>>]bF 4:[ܘ!#?B3j1;cFGРb\cF 4C8?+BF/!#֊Qz,[Gl+d1S֘1#2n/)dA#!#$fJeLČ h|!#ƍAДBܰ*g(ƌ$>R̈-\(LY*fylXM?ݯP2}R*hTȈИхN2ƲŌbHȨ >=bOlCG1BȈ1#!#je+vA3B!f6)F2c;hUai drg3.[X fN1-b15{ƌ#͇{d|1cz"fVbQCF4yn31L)gއd̖c-\MG433LYCF3c%Ҡ1CFeΘqM2C4͇%yn01S6cF4ٕ)-LX1JИ!#9fI3el7fAUɘRl)btAc rLXbTAc >Ō9$23ɦD2ۑ3f"D@LV^2BŌ1S1#>.?so/=:}?k 3dcc 1sE|?L2cق)QEdUj9fk2Xn/ s,[Wz,[M2==AsqV7LČIn1)Kcf!#$fA3/$f;>Z5=7ɤbF̩ 3b$SḦ\AC fLM+cf3bA3KϘхN2Ʋb\n-L~kMnj h厙- f&$fRDzc'|c 1cRЄȨEmBE4Q Kb9ՠ\ȈVƲu] A/bIV9M0seF 1sj1#\A33DzU̸3 2" A9fJ-Ōjb&tUFN9cFG4{dI&bbF4cY2M 1s _gvM2=l<̼A-J$ɋA81Q? wȘre1:dƌW#hB1oin,[3y||ʭPҘ!dQ?nj! leW$1d.de131uB"FyI32˘_} v.htuIrм^zQSDz-c:b&\]b&Uo1ncF4'~sBf~hv[f1LѕV8 LhL!f!f"h1#.W3̍UeA31cJl4hl!#$f쟆Ek,;fI3394{$]"3^:EŮʸb&X$zMԠq_N1b1c>d"f#fr!hNb3bKA3XP1cr̍I&sY&6h\!#TEm$o,[339m$!d7(F [^X팙I&yGO?a\ĨXvI&bdKL,d4+4µ74b̘nrM\̈v41d,4jIˎdzx*Ib-'3f)T$ f{Y5'aQloVh%c6/dJe+cWd2Dzb,-'3J#FM2 b,VfZ0HmUL3KDzmz % "njOX.X fʳЈͿ)3u3 hNL2$hoX:mK=OXlsduKe+Wگre"h1 1S1Ӄf_5}똹S)=?}閵Ōe2ٔ_ure13YSQ:^t4*fbr~饇ČטY1V&$dRVmT|ɳX+bf M$2LO~ Xe囫"2JA1J12rLa13MqIИb&ͿYƌyLYFՕIykLP*fe|y .B"Fi=fb3Dz]1"&n~k,[Ԧ`LI |_ļ+b&RcAc{u]52L31!41cJ߫퓑-e+!0)e bm=4"$ fdyoLJ f44ͿדL1. i{$fRBF396kLIVZ&fڣM$ fJj 1F6tw4j4;C̤JД4zȨ؈ VnAōeOS_!g f[NCDz1.[L}2hҘY1J1c3pKM2K&|cʲ}4-dz?ָn9b&1NeĎ`qM3l=n>ƌl󗷯c[~zL2J AˎVƙ2DzSΘ Jl!f lA̤K{_CdRИ2h+fn{0f?VQ5"Fi)f|\1"fI9M̴-\Mo#'[2$tzd,͎"f2X1fely\ˋNb/7kwfcTȈ5cf3K"f`3dұ3fBLJlmUFLl+4 1SGSɤ3U~mqקwgOwknjϒ[P)W󻙃&$f|jeω˶>1.W3u3[P1hl+3?b:035CFY#hbƲKD;f\!3XO$ӷi-h:4]}13Gӽ^Ss73klV?s3jX<}jc>9ƲU쳡G b zN2 b& 1%Ƶ2svIbft?e?fl%g̸Ve􏣋X,9ƲG!f&vUF3i)4e21[깢g5bfQkR4hƌMl%f,[9MG;+4Ly y|:f.s>K.h^|!c~M!LI&%d f򷎇33[U(hBNf3e׎%c{w lb`U$_1H33[9hWeD؞?sɭFL4s!>Vluke_ܾJR߅M_ѣ ~]b&^!#2__L?s(fG31J 3fBƲ[Q3fB,dR1Fdp2G S8<BF)41c)71g(wO _Aرl%m3pXd,[/sx`~l1S1ƶ_-f%&d,;%bbVq$2 5$f|pVL4L2)L7n*ͿLOZ4s+3ף̢cgiĨ'/9`MΘ 31B`3t~Wi_lb&1s ue!Xv͈13qm5rLc!b|vL:%33>9#F  =f&ZCƲc3"fx?31Ӏ1q%c9"F O,12Ϳ9S;ɤNc1N2I̼axшLUiҠm,[c3)cK72)1cc Xv 3f>΃ߎ3*%, A!f94fre֌l5$ǎbc&Xv1I=1o1; 1b.bXf1#MH̤Dk,;$f$MKc>>1$SΈ'JŌ黃_w~3[LtJ3mY3"G4{ϨL'A;cfIĤ1ceΘ1cXv>o.kM$2_iOLbACij1#bbΘ1Dz}g:b.b:s"%h1kM3zܛ+2Yr\3&ؾ*﯎iJ̴A^\b=fԙ2TX\3fj&n7꿿n1r f3ȏ4)gh 9cFdn1"FeqLKKyn1 bf}L} Ђ cN2Վ׺11uJe|)գ1$353A4=ebFI^c1czxzi3o/Gk~Z3d1AYMtvM2cٮ_Z3DzroY1S_!#f1#B3Ʋ]LXm4L2Θ1LL5}\Sb>3G 13MH0mͪMٱЈ_'dr f||.h34Dz}]cٯȳL2e܂"f7y3h~EF!f3ƲODZ&Ʋ创eu3XV W7=}0Ɣ^1u/qDbf14BΘ &f,63$-freѰ*SqF̬jS3fDLL̸&^5I$0IY: LE A#f*FXvLEk,1Jc8z Ǎ3z31)1d,[C̴k qC̬AI\ƲU̼J֫nj1cٶ3frM4MɐČ1&3eƲc#v\(I&3Dz>7̺4cA33Rc1*cEdJx\8z bf] ՠYk,vƌd*=1_qS:d1G̠)[?<ƲD_m)=1-mz;ջgU?bf} ՠ̚c*f$b^=M2bfn)u%f 1o=?M?O3#fМƌ_X }e&&ft9Dz‡*3}LČ[W!#jмg3XrmsL?+2o,vLXv!f:dvpI3n ՘:FĘ1ccd1s,;R2Y1m9h\+4y!1:%Ϳl$SlbfUcVbe]m!fGLX*#|1sm5MlIb&J̠y[sUFL)csMe#*#p]]#3hޖc&f`m-&3keކUVeZ1S3d1F̠ [\}+2݅B3fB&99DzlUh]]u2&bfD+b:SFE"浓},5ɔ2>\cVe~w2$fuw@̠+[\]QaIČ,d1f2#fb XݚKשWw?m Yo/ b&Iw CV1I&[M26bf|UMA413Y犙2˻o0b5ɤ137ɔ2Ď2b2k fti1#R7VJԪI%/3&%A$A4mDVe3$>=7ɔ24bXwUF3I fЭƌH lnQ7.ԉ&ן3d1Vb\!#(MX|3&b&f,&rG 13.bƎ9G̠{LXo/ɯ_X$ӽk]M21PA!#V&fB`[9&_[L2;ۄL2Nf,6MbY3d1sw6~.;Mh|.FqmcFL2fi,Ubf3f3ƖF$&̘mcFN d[=ͪ8BpgY 1al=fD$_%vOߴ L2eE cٰ$Ya!#s/kFavŌN#fͿI&3&ƲfvUF3Č+3o4QI_^ޱ~Xv$SXt2c O`הY C!#]?k1#\gO/N{Ve\1#B&RDz\cLn/ }ITBF32{vA 3f\̄N2e+1c 13Uab1~BFOm˫3oߥohr3r?7ɔ2V_rb&Y b}2CFVv3v1:V8(o;cXv+!#S 1VcF蛁].$fOIx1LJXF3} 3L7r ͗v!#^w`H63$bDz؈Qo-~oAy߂A.l9fČk[ںJ$Rz,6LWe̘8Rb1]NI<7ݠQ|EL(?zn1+*d3 1HC!# p^Pi0MضcF$nWI&elbOQ:(F fжԐQŌr<[L2&f*cTn-d1s31{*D ,%d̈!fČI0T!#lbfcF=+_1g1bfP!32Գ4L3flSƲ D^8D̴͌U-]B (&d\㉙-??-!M1cJ&b?YVe*e2"1a[!f&4dd\(*frxWg$hl?ŌeG\()$G3,/K-B "+f\$fz[^ IƲ1߆G%:(3Ln ~!f2*b̘3fѼ%f,6H2:f,[Y1ןE2+L!#}Uf!.&=fR&l%f,[Q23 1}3LXGH,s,9w~,x4e+1cيoGr̘Ybf1s`129"& f~vA31LJXX8ʸNU L!#F/dR"FiLhL2)%'>$oU\ LnjX4ƌv^Ρy8pLqtz[^yӏƌeߨ?->d+8MeLGl!S2b̘XoIdRR'/ӾE!#|UBF3 j ] }_l:˰}O:zIl^L!#\N]q1987M_}yXOln1/Jg3} fPǥ4WĄp N&d,7 s,i*L/!# {LJ1b\4m>hblb]Yn/ _(Dz~ 3i唶/b|3=Vgق&fXdYqGX33 }HmC"3g̰31LwL}4L;wn)d11ӈ%!>Wb&3\R3m*z{IWa 1jbϘjmvSJ̄<)&bbMVe\1Sq, 1|RC&%bBϘc&pɜbu 挙)ve ro-dĖcf̊RBfIĔibuHM3<V8(}L<#fB̬$6dR61c3ft3!0iVl7L{*3L_,2KRbf̛/=KDzCnAq-6*>-fbf!f* ㋙x3L6z =Ʋ.^11 1sm1#z3 f* ciLj/f&l c[5dAy>\z!f*(q[)mΘa\&dڑ9^CF3!f +y[)mXM ϩ;vd_{ LL7w==-1JL$1s3{z̄<1dA,՘.d1S܊Ll̘;%fJ1MДV$bN-3= fB"33M7c bb&e3bް_ EVel{eɿ9A 2qŌ>FL3SB041u Y_z̈Θ!fD2s㋙%{c&x"f/Un35fzA 53T&b\g̘BΘQl_{{eXȨ2b3f~*bRbFS3fΰ:hB&L1M̺m \C̜ fB,cF1rƌdS)11 1b2"L13Bbf L"3bRcF3Ʋ +1l>%AsL &Wcjg4s\zpŌ3# fB_̄}`.GĨ ČD1SGK·WFGD#fI }|y̔sYr`.gĘ1s4LWeDl:fr͛oUL(=f1c3bl:3LUCFSB,QCF3l̔ '?\KFz3f~`JL4q^J*1C̸Cd̬26OXnMI "!1c1 1F!fʫ*c;W!f#fi%dlϲrDL̤ci"h|ˮzȈ.CF3T̴26qs`s`x9?>w/W&^Ϙ!fzbf\4t`~vcFA&fjfUF$LX61S3#!dlBWn|erF1-2V&t 1S*!# 13zbf C̨c L1#bg\#fB)UČ13acf!c}aT9c>ly~qj3ibUf3fy=1#B[S'1cS+bb/h2VƌMBl!dVbFA3\2qTܔ8c>XBF!h3e*YQ]b&L/ai/obI? A̜#f[-dg3azWdabYF+1)b&Uo/,1f21C,k_vƌt<; d1soUኙ g矘4F3>fż1"Ay1#b&UCFc">d  13c":fJ29 fYpL3fNbF 4@B&km"cF4LNMʈ=ًbF 4@zwʟ8NbƧDĈQ43L>ŌoEFt`5d1C l"dDO1c~4yc捖伝z!#3mOmOaM^fL1# bf Č뛎0i142l1Qbf -o0&*gA T32bId8c&9fDA3zl&dDk1K!hT=cF e AC,UȈԘɽץ!fR 1Z363_5f62f̴2 A3)7+)fxM3 ̫3!fQ+fZ eA3{ƌCbF4L&713LUcF44 jL!#b*34Ԫ:퉙!44 JL!l:h3fg4*4LfCF3fV`3)4٠yƌU!d5{{I, 3엱i,h䎙L?$q4{rƌmc!4LaWeDx+fV!f3f1 i̾8\6BcLN Ěc 1v/["W|Sys/ MkLW52JACkX24cMŌh hFEJAJT:则oGKQO c2a_QcQVb6)V,o_"gyy*k:z9cQz bf^!#JČ1(LdI$|#3_ˑ&3b)hyLs1n6fĊAC.헩53cv+P[NΘiߜ!#q42"g_XbQV b&>f\5]̂o1efȠ1,,d旟k"dDew3b9fl߻)W Hl,7ѤM(o~<茙ncFTbmu*oo3:ѺDX! c[Lv݄$ß*"`eQ  13W 2E4 *4uu{i:Č)ύČ(4@l1AǠ >0ϥ|7do@bʄHb㌙abF bf ft2}4)3kJHbTO!#Bc!Wet3f3Cfbģ!dNv{Iƌ狊3Cƌ4@Tt2/j͒3f Ō2  /9=U?leU&Ϛ(ftC1!3f 1"4??%fn2t(wCF4 jVE?X5b=1/O=1sӃfS1#2 1i:hRΘ3ٿ8KP3h ow?=_Vح#db櫿kg AiZriGHzȂ~l0Qzӻv󀘱1d1c ۵)ł!fPc5uwLbQO\]]c{[M1&5fO?b$ 1B.jD3uCfY>`b޳zF;B&SlgW!f۰-P8 F̽dz?Pg(kL~~yE 1;hA3Cw?0&dĸ1<.f? 3^We1s1[f4u7FcΘY3=ɱO>d1#͛bvO.ܟnx dҬ3gC ?tA3R(-}^%G1NR VwQ|tX!f!#ۗ1bTϷ1/5OgwA3R̴~VBb6.]Q}WkV3BF6$L{?:dĕ3ZvUo&h~(v%mB4bv=4EIȈӘȋoܑtzꝿT!#4~z&1L?Uf.fBFܛ1s{?{=9R̈8FKϹ}%AQg#h>oLJľ&U1#^ɑbB[1cj1Y}UF3dIt-6f\5KbfS|S yJtȃ!0]]'bF2W_ECmX3n!X~^ZzSqnAs3KO^3Md Ů]~g.c cMϝbW}}zp>2#fbfk c31!#>I"!`*f̈QFyqûc3X:7͒E!-&/332Y̼],hUA.h~M)^O]l _-fBƌ݇߯eK2jUF@"FbG_..73 Fn+1S1l${ƌ/dćۏdorI[WŃO3]Č<.b̌r{I3hF,3e 3fΓ_;ѲͿ·*#i&b(2A+6.$[ЄL@3]UgK.oVg\`w{;D`4\kWYc2+3 u2"fi ԃLn)fF$.\ӰwEK_3f"CFY_:c;׌90Ofk13Jb !1Ou(9h|2!#$fT$bM?;Ńï_\n5f_cI“,)hTd ~RǴ@W1$3F3|o4A`T-\#4f,L+b32m%fF A@iz׸2"&nbFŤL/Dy-IcfM#1קAb&c(73I"T܁yVcf t-\$X#1{EBF,\&do}I4m&fF A@őqs=]c>v-nj4[3|aU[f{Q^7|Nl\j%=fc5rb6k_(knj-b6)U3hc;0wzխn1|{I2pYbZ81a[s2T+h3bF=.ӈ13jb.k^P^q,%f>Fb\f2cm?:-CF3p!fo!7F-Č.<73 |:1c~ qAf+1;03qFCF3!ff Y!h6dЌ3 s13~b>[Y&2f r`z(w1#\鿽hԲV̸bE߷Ò;9^44.db;kH2 jZ#f|G! }n+aXA]̄gL/  ]K|59b&f1;쓙Dzu_b.Bk!fl/u  4#Ō1sBX $3hF{`^13ʦ_BkqaLAg{;)z3ynƲ?ѕ>p#2X[+3?M8b 64݅=0Oz2@5/56톌~34=܁yicfK ZR̸^'fwF !M5fn1i1sZBȣQ{WX^-:f!S3K7|ΘSϷj 9ٗ[L@|sUB-!fBLB @B33 PF1wns0b-1fq\O3@G\8}1CԺ/ ͽ}<:7FZ闐AOzŷB3y~PYyJ1CԎi}>}-̛.:|ȾW> P^͘IQB=0Un/2U˷``) !bĜh6083f<$jZ^BZW|؄>|tLŌD !Q38c;c!dzj\0Bk!Էv̰KbߵcK Ff̤k3 !Q-"68s`1CI9E{Kn?8br1s@!d0:Hs]Qb[3f`])yrez`!#ZB[Q:f SmLk!C`kbbfT}\8z`Z1Cm3L/~ L-^"dU5̽O}W0ׁy7X9"de6Ƈ-n6$bڒ#fbK1njpf3^"dqz?ðS !e n'G~N Ц/a16r!dS[rtDfj%f][7@|ԋBhLL 90o+1C~\Vo8(wƌRk/! qnMW#f>Sp1^ 90V2@=|} B+3 Џ/n}ʱe)WÚ;0FȈ5bxǘR4lQWe ;܁y%c33w̽\l܁ybfK J_beyyq9'F[!dz0B3Ahb(3fjL!b|Fz)1- !5E %pk :+S8fo#_bcht~#/4̗"­FVfB<~#El̸Vkֈob%9c&%Bh?rEΗ4Wb;0oI"?b1漣\cل =PFvn53&3fޖ*!Ht43 n201;5f`{%\qہz&SߗޢL_B.~3rL2-B?LF[Zv`^L2m(Ѐ͒ͿK72@6C& !l? ly`^h2D? TL%"O?\:n)*Cc`]ō>*CP f@3S%B1lS3S)1C3UnM!d3Ri| U%nJ !l1`PqnYh !a?&L|0k="wҦb2uBc3s[Ss1C;`kBcfӒ9-_y/?3b;`t[I2UB0-f2o1I/{GB;`@n/o>{ָ!d h|1cf@;!wQvg{]˻wm>NJ_ A 8H̘!#2۸Vc!cC51S(dl`0# s-f*M-n*fc55 ߪLLM'U17626ܚ?Hc!n*$fr!c72U?*1yظ← UH 26l( Uܽ#5C&dE$$8rȄ<F?6GWS Xlɣ/}xM a~JbpQoLJ@G|Ul̸VkZS,*GMi)flBVoZ30*b7FcqֱCȖf͌3&]榔m}mgmu V7`-X1|r"nPd7&MX]#f@׈5bt]#fF@4a̅=}5 AF,?o$\RnVa/X|3ͼkB`|r!f A3X \UM%6fF|r1u0.e(k 1F3k S endstream endobj 2844 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 504.999 443.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2863 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP% endstream endobj 2843 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP1b.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2864 0 R /BBox [0 0 505 444] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2865 0 R >>/XObject << /R8 2866 0 R >>>> /Length 69 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`j`b 411132Q53000R035205Pp Bk endstream endobj 2866 0 obj << /Subtype /Image /ColorSpace /DeviceCMYK /Width 737 /Height 648 /BitsPerComponent 8 /Filter /DCTDecode /Length 95360 >> stream AdobedC       C   }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?(((((((((((((((((((((((((((K] ojpqu6p 3 30U+|62hP4I-[z%i6JZ$r (xo▗xun[;m|#I j;|$O%Ҷ`5'k7uKՊbp_֝e|4ږ}skmF=mPG%T *B4hBvzm.Gɩ7$=jeBW(X)O+ͫ*-gk_wvC.bbh}|aݜfw23' ^/ K>k~֧EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_"|S>3!񏈓& iO }vQdeZ;jyusZIP^^[tWW_Ŀ?8yMTâG:Ec"X\21,C.2z1ӳE|uSMYm_ͭnb\9͈.i`p0e[ @Or7sjxR ɿ` YK× ODZdxA= 0Vm1 Wu5/MD4ʮ` ]TS:*R-<*(((((((((((((((((((((((((((((((((((((((((u}cH4_]l* mQn`؀2;֔ԯ5N\%w"*T(ԒIuz > ~^ awڨ!/c6#1`(R=l8xjX*q۲wm4Z;o۵W4Q5WoNsȨ`Rb0orgUi}koe|3vU﷗a^]o#2(Ÿ?߉* _s>)_n+zB.uϭxjʬ~B(AB @&g@SKPݕH+|98$:Lf *#'$!+3-.J__5cNGs8;);BH3mTRGCGխ$s <@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('HoW*׶Ndqzc2"y w& &,7 2,=6m;+#ᰗU'vZWĿm"]?ftK#5}!"n`F+ O03Xo<ʙ/p]ޯMnkW&'$䐧e_(H3ڸk9t8 s^_^D^DϢ"T`Vm%` eQ)R2>lfZ >b c|cՊO@^D=8oWfQRV zQe&%b+Yv8rTM/|?ӿM{GQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xoc-ߵx1- -ϖ~uXIUǚɹA۸W?7wgz몶can7 \|Uei3Y0?ʶ~Vi{?5>ǒc~pഎ% ӭ}mMZ(<=jU}? U> B E_ /qXJz^QSj#`y U}kN碗@k&b;la( X+RrV8N#2I_H8'Ҿ3qԕ&}$q[nݿx#28|e->7SYY]~p+ꏅ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( _|wFXαcu-oDR(wTRpϣX֯Wg>'K j~^W>&|B<y7<敀؟/P*N 1PHQAԲ~ `*v ]~w#©fpC˽ OH s{ՏS/cmvU*rJxǦ+UOv E-wTt**4S(Մ- Cż-%+wҔ]>gTPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE{Ǐ)V4]BK5Xm[ 0../`J4P@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@| A~>𝞩/Wk4(uSΝGQ 4Gx1[)vwRv}jc3(ӽ::˿O?{ 5OTR)|˃#c0@UTUP0,>]F4hG+}NL.[S?iYݰ[[UU_qEJ> `+nI-PT\z1ہ޹gt(SMR xt Vmܤ͛-TC`e$ɟdl(i Yj@P6ӯ]夿:u/&>f+7tݞH?|>*1+C+ =֝G5Y]vdJ3֕ S X٣Sr35YVҔ+}ͯlTqKWm^PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|'/- >jf[ ;B>?\]|w.qCUs?}enNs%^j&`SP%T/ ( ( ( ( ( ( ( ( ( ( ( ( cXꚥzmOqqwu" ,UPI$I%RJWoD퉴Wg#g_~7j;b1H9#ʷ*~~V>pnn11g9wls ս:mNo|b * ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (e?g:/OaϬ}o/߱b0}7Jk;m6vy."̛&aXDIB=v!zߌChqM:iXC{Ӥ此Qm/yN-%(gO;VS_ |}SP? ]O![K}B]bHf[ -_'u#( [It WSе2N-/4Z 'I YX @PEPEPEPEPEPEPEPEPEPEP\bW^;d#;-.[t d[o(^{֞"\+0F__9z~Y+¼Տ`TR ٍ@2SޡT<㧭qΡS)McepXUJ(ɶž:tn$3Q'b +6" eY J* )7bx g`OHg+'6_*ؙ ={~WZldWe9#ҾWFa^ɸ+epy?_k`K;}{5kIyx?W|%^7Cݏ/KcXsU}ho5j-gW ¿A< ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>|-kv?lkJR5̄Gm Z4X;DFP!&w2xMqF{.Le 72Q;:n,, d P//u~>^x[_ѵLE4!}ɦ[Xu-r.rF@V|iOJOx᝴ֹaiN63=SE$Csɵb21@|B+8AX FH"gEY @I<@}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s-o _.9g'lkd3 30U|=\UXѣiKD vI%N@gm.bN7;`npHiIV5bI/$p {JՖ^_zyʳ^?v5zv]څz 8⼺zg$` *=8~PJpNw=*TBQsfjF995J+CՅ<S'rPTvw) P٢V G|T6*P;mS (PY I=ȽWk׍sy|$ћlc䧧c3Tkcw-$\xvU*#pP#PQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@T5 &Uom8^E+xK;UTI8j T%6 ?i#ƖOovY[N|Ԯp˕`-Y~3Kkv릶L;|df_%c-B*F8MyUgrWA X^Uz>C\U>CҧL)łzݚNj *1IG6)gP }IAORARP٪V zlTT6RARTR{zM6=LcUyk|ɨv᳙~Ut*֕W{w^G*V8n z#c69wL /D>ϯj^ÒlPzq_ B'xh6#Ԛ5v G{kXYݹQO$V^krQK۽wz>~Jͅt((((+>)|=zoؼ˂v,*A$ WV4(Gr%}ddq);$?/%~C?,hnDҹ܌$2B?Y2wx7|+];6tvF\%>i_-S[sL{IwҴ -' {J>ΔTc=:\ڱݽ[ 'uC Z*,kkvLUB@E p3~GSOEZ-=N_Wkĺm.rзAhZnG*d]l0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( (E,hc8{saֿdq%wnAf ( ( ( ( ( ( ( ( ( ( ( (&A> YMzwǝ."2acW^ Ғb׺'oWˇZB Ѵ+W궍X %) QӬ{F2b+oZu0CkV-`\ 6Ӧ JܵcQEZ;Fs]־)~lJz=FC4f`Vm zT2RSf- ǗeJbێ=^QKn_֚')վ>]yMt}F`v|JX\Xԕ½ABaQ=+qҹzޏ"p{gOJv8G& |faut!duY+1Z}5_TW.7arJG\2 9ˉ{>SY+KEmz+)Q8ɦ5DQ@Q@Q@W;o]^ /Ú\&kvƹK31UTPYT@;aqUcFy-BmE]~"|gOOűK+ភ1:FH \%Zr+.~;Gp~y-_o%DIkxz s:sJi%g+f(((((((((((((((&xgQ?fٮJ j^#9uk3.w6"\ !k&Y%NRY#(((((((((((+P|*iRm_Pӡ[2EL $+1 |h$R/pi"?=T^"+K3:m~BhBȜח3+t#zcˈ`mWimo)WshP Dr+̜B ΈS:Z!Mֶ1H(x()Y*.AOJRT=yS'` ͱԔ&솂QbA^!DϨ-VBJJF=q_UPu|/:xe}4^Z`~[<o|+>)2yع+QF!^ϣ`zZLlsЄ;Jr0sƚJ!]60*Ln5Zzv26isa^f-\[h2ʌ6<8{qGG0'+FqMZjrӶ4d9'p@ ( ( ( \h]K/ x3Uz g!0GRV#19x!(Wj]p{xz8zK3ߗ]Ӟ2 xO46p+\vbWYe׻T+tV9 ǜWݎIZ . #s^5ws9]]3P(˖ke8`>54n[6:ſu/E O9y,O>_ݽKzZ~u`>/k_SQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@AīQO[Hi9OKQyaN۽j "Vr<((((((((O m4 *BV9&vQ+jUF27($exnJnmozds1tp:ҵ_¾hS÷q/|]i->wlEm۴,N1OӮU'&;koK;&'%/^2Em6y&Cy%[vB %Bx;.~ꡛFV"^ZTPeX9dE! dGPEyɦZ2SJQwL*Jc q{1%ό-Fn*ʠb[~T*oF z.SS7**k7dTTpRuxY&soWXs$@U3(vWYpVQI/Dpҧ,MKw6X~".\m;|Ҽ)5%+p#9³ZU~^%${$oF&௶+ ( ( ( "; <+B/=1IƗf"%pG,H߮v1SYn¿<mdDlp}>AQq{YKUIXWzd"]d u5XM?IaU'޾gR=(Z+j*Ǵ^=I]j>[ ؂f ^u]IWIet3pkʮJWh쌊Ofs00M?9e;f?ssP2zv;W>SĴ-՞+ۡZnM 3 ( ( ( ( ( ( ( ( ( ( ( ( ( (=F4hGAum*eαqʴ{wٹٜ<(((((((+l0j9'Y;yk'W~HHho0#_ b񏖎uWg%|CW&׼I\k~%/mfhPg ncUQp8`*J 1]ᲯjM_WSS)$ e}G#åpb香B&܌2{>{S~g.#-k[ 7᷍MKrp6rIDb}?GעMoP<?;{|[xoX}/Ú\&{vƹK31 3*$}Z*bjF%y=6 rhzǯZύWғ65@;Bf̧gsw`(UpE 5=d-6<ڳYrH Wߧ5(#鲬*]½/O(> H+0'x&{T࣫ x)FՎR>m SKe$ T0j[* jX%v@^H2cAVf$CiJ-s~,K-*M'j?:i9L1ЕIl$yrYX=y__5IVV M@O YVLl },*`{?j\>4 8_1v2cf8Ҿwevrg| gn?C_;yu32tϕ̨sE}=WoZ&t[)MQN0?7AN+ﲼO0t9]i.SY+Q@Q@dx]Ҽ/~&n͢i_\y<"C$Af©8PITZqyIX p'|L?|P־!]lLI=:B'bCHWvA01okOD2$M+DG^Wig~B*+A=O|f*>,"8kHQ@^uGÕpXdCpw%Ip܏Z# M-2i^G=k14!oϣ:n]J?W3 *dNqӚ*[5E|~[y?gS%p돜 ( ( ( ( ( ( ( ( ( ( ( ( ( (?g h^9?^)ofZ_Ll,4}BPXdc<6}xɬjǙ#5͆0`3Ҿc25e^[i ZZ{g~e׌xxtzgn%ҧҬQik}#+W=_vϝI(?p?K{,j"8s9e;(QPҳn]e}vv|,jX.mZzjv[A^kObe JddGήx8{Z3R٧tn0Rd=ºXc^MI;:j(*ՒJ&&qӭ;+'Z< TRAKRI(TRAR/P*J§() )60#C`tcAKHaNQQ&XTb(+(j*"Kڻz9O?:_|_O:ͥ/Wid)z~cWK\G)?ƹ++$JDp?A_7=q t|=|*]uևxmub+WV:0^"[ u+Ņ}k[U_/4.7apvG\R 9ˉOR W•ܰWp^^|+h+ثNp ( (_(Kp:^6rd t~sEb܆ɾ_VW/;G5y9Z7a_|OngԞ9k~!R*#2Bmk*jlm{ON@~Q6BH+A jMt4Uԗio\&aZ1H23r͉+ZB#\5:\+`{%X]zuYo,-`d 8x؋xsFFx_q&M*KwXSm;7Ӯkl~ӷVF$ƶYĎ`̫12r}-VI$GWͥ7+;::n_X縷U n\݁n<3f1vq.{|ugmU% {HF[Y u/ ]Z{FD'oG{wӓYŸ\M^]ۮ%:~?WVVdu*pTk8Ԋ]5vaHi,1RI-Ia@IRXS&RZJN*Z11 aE&4" ɗ*J|[ l*dq{(^+t%S*iI4. ߎ]3vFe-[zޠA{Zq%+D+t8 xz+•q:B{V?.1U{] ?yKg9jG@C־{cB{W+L gQd_aʮބAWwV[]{ɿD[ςͨH+Š(+ /Mqh%sx>XʦY"s[֍ kޓ.BQWa_͞=|GgǼccfƻ#E,v*r< 0/gnCxO_-BU~nxy+x,2Wknm<>laZQ`5Ցb­a{ rf7% c57a+B9yiKAZpAY I0F JҼ|U;x\i}?\:gg U ɒ#w,stvT=;ZZT޽s|;~a^_FyaEPEPEPEPEPEPEPEPEPEPEPEPEP?hYߪ=~V,5K~`vlxQ@Q@Q@Q@Q@Q@W|xπ^>;oesʭTۇ+ (JL̐(,*C ZnRTQQ&hT0+6+;Y_ng{]Hsׂݩyrl+Ǘڝ2l~-Vױk ؾǾ_32Z&:D;Hb23}?l]M4>ʅ>TW.УWei]5< B(n8@<+=ºKI1G5Huvxxy\+Ѽ-c:>^e9$Q'85jOO$ݷjlϋh^-䂊(+G #-JNˀsR$JcY-mnE'(aV܎^ɽGZG[%J=BΒ"HAгO*ipXuWY#T>,A^ Z;ci= neN{{WaEu JOFHZbaZ16 \3+b\8K@Oqי^'^_I|,fEM+1P.:'1yX* Oi$=l/@ϊ ( ( ( ( ( ( ( ( ( ( ( ( (>ihR~̿F?xb&{^9-uM]TC%ݥľlC2Q@Q@Q@Q@Q@Q@T5 &Uom8^E+xK;UTI8j NJ1WoDl~ߴ|AƝ*eis<)ۻgR4{cad9k'.^}n6Oi $s_Buaip4fzpS>ԓ6Zq{V}©s;+~".^[~х{~ 9a_8<*v{/Ya$)ծ{֍(\9Ltg!WF˝2kKb.j:1|nP2;翧XarM`8k|?$:tGqG 5H&GY(v_/S\F)BOwNnvmcx"?Js&yZLꄬ +&DĘ5`s^\iJWjW{ʾ#Y-{PzJOާ*\1_\eikyyogWМAEKeY(I¤A)>dKI +k3F0Pp?u#a|7\ccWS7g8ׁԫɽץޡ^A_M?/(^+\~مzr=:dW}E(+\m󘚗BlzkƮl9ҼV ؁8>2Zt*4º{)6>WWLv6Rg_-ӺgTy¾>#[rIpr"|,s}OM[mhͫy$+H _ _Xδ- m_NG;3.ǀk6(SNKQJ\+ռ]=gŞ N^M}yrcXs$@U3(g-ƔGø{Y=:2+,U~ǃ _gKR#dy3O5ԑZY\r@sI$JU ~#t&dµ!lG\-C.++NJ _KkqJH؆F 9bs (.kuiJ,+Ca4}3W`KRRA.ԩʟpzW1 BI{>OG'NNt]$Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_' v?yogdq<((((((%.I<-s|RZ+[xcU璇ZsBkMˈoq~QA_ߕч;Vi=+'-OZ,*/v=7+hZIq|¶8P6Q|˅۷ e-u*KAKkmzw \c=_UGWZwD:g:~5b^={ƾs || &A=zWfQ_;[M.ՙ0M0qbP܌IwW䵹T?w0iIמ_k'.izƧnAc*\\Mw]`iD]:"BDluLS~IJ ]0^ z x+u_+a)WK^p)&ܼyuikyyoRk§2⺅Yzd05e=FMC)KR^ 3Pi#G&&}peH1?}>YKn*\i7Hk sI}}G5yyU Wcvc>Wk,+D+ӣ!w#'{tppMxU銰V}1^Mi6] q'םUnj2$ ڶ۵y{Itr3y5ևXußjm;xXwL+/tSJw.H^yI 95~j5pit_4^~l00n8B+ G>X_~ 6iq&Vd9.8K7|vʌH,NX~'sNF;uib#Ok\g?1$H ( ( ( ( ( ~/GX\Bѯdqܪ (A¦i׭eSͱ*eoe٤MS¿kZT/n/5;ɞV[];%XI95m Q+%8saVa@*rQʂJ˘JO> ǥ9T8+Vމ%l¤U 5 \'Bx, qvًZvWV%պ[5~k5fy5;'*󫫠Lr$O޼CGa^MkJa_Fx~mI5MpNznt¾~ş.agB42N;_SU)Sn..fj[W]ﵸeF`8<z-^dc! 4}WN]Y;WNGV޺S`T~^*988aUZ4qVAU) $taW~ 2˪=|Vvc[NϨV|R&Lgrwq- !rK{}=ݞM|p֞hYT%4t&UTǥ&fҲf*dR)ʰC4 HԹ8EJ+Sl+z BC4`#8 l=:rHǵ}(E%y]c3Y[%w]+ !WQޝIh}WA 4wN۵x> M(wIN~U=(-XpA^%i!Z`uҼ- Hp1Z1=µb ӥpT3il@ S m^ee檂 O3^.*:F*A_E|վ`7[Ab3 U >|ٻqj.M$6~}咐W \|m8g|uk+D-$kƯ.U2Q 'ev[!I  @edwLY|Ҳ<%|EPEPEPEPEPU5 BIu[{=2b$R@UUNSUWK|{h$m/} E`‡r6ee#*cC_pQ ]_oE:Oi/ >}+ܜ=.+AW=8FR>6 k8PK{έjxx:dnqv!'k';P_'6%|޶QxY`$HdkߊP+n;pU]}1d~W[&%h½?C?Nzq>k301^Fyk䫫T>Æj%p4ى̡{q,+U4y7Zmٰ|/#g쒊*w~m]~{W .=E}9~JWA\ԩ}k\] ̜n z.B ΑH٭i*H{B˞{զRaPPQI'Q^py#FZv_-־f5MU9mH9Ck|IN+_vUei;=*8#޾!V*pijpJ..VaR >!X^'K-I[u95ٗזWM%v 5ķR.g.@dWZ͊*ZͶjz|;F>^oc\*A]ƝP8Ϲ15.Ϫ$H^;+9ڢ *j#+Ϩ+VgZ㩱-jD2 ӷl SS6y5pCJ+Fyu#U/2kq sdoQW#n_i&麺59w ω rod>j:O2<Ӳ!e£DO,lhox&U&Et8OR4)te$eO@IͱS?]iEX+ҭU~Sb 0Ijy# vMN.H59D(?`W ubޡ`/,*%TՑ!S)A)lJ :VOapfm\+V#z\Wf k`P+osnդ-?QatVA,s9Wc5Wϐ0ڄmWT3EqWHH2AAN3]4~YT@PEPEPEPEPEPEPEPEPEPEPEPE}V:ߴEæ]g#[0A<O&6ʤ2V@Aே>h_|kp[ܺYQhV`E,FuP|=mOZAxNA'Ԓ(tES33(0\@}Q@Q@Q@Q@~[Bh+F cP.|C}esٺ[.(#&`>߄rTe-hR˕~?›8ӛQF4acXJGNNd֐Sde31Meҕzuo舜+YfAW\AΪ{~Z.xCR OƲ '(T\9[{wZWc̙^eub+ӴI0ׅ[7^,8$c3ẾAX-IM6>J2J=cn-ᏍW7[%;B<4$}kAnO"RұIfKZ=4Qbz?8y+@2GOOJ"dwt*d:ОLXVcƴh*haP4\OՖ`PHE44" N[ .j2i[̚UZjQm R}6]??+~'\ocYE(FC 2S+q1KmvU>qJL KZow_^iہc?ھ>G&WXEɯ3\ .Up=F0kU7B6 `\5ՖAZpsk͛- c\UR =mVZPHqؖnzєVճW ]L%L^]hX+Q|aNgtW&|9}KVm}% kFe2\*@ݸ'K7J\ҚI֒n٧~k[NWhU뚭A34Gؠ((gOҧࡇeo՞ ڣMk_^ߧ18 Ӂf'0s~ȬQ8PA׭|zw=:jRW9B:!?\w4SN~z*J͂ PHP*)jBr9'JudN-j\^',F*iӎQvJ®[M-ӑӟzeQn*}e|_|naCs*Ӎi7jn )]cg9xkMk(5x7XZ ?`Vkpe`cy8 ]̚GJ64t{9NW뵴Lk+2A:EFq8<+ɜZg`3,mAb0UTtvN[VjRW 9@*ݸEpG q׉QA_ 5 mŠkY>M6zqs׹Wk_>8yz5{'Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@'?P<=z(1+ Vq-񴹎_2-BQ_,(I >!hg߂kzŏkzk&]1m,/{jk}*Z$9"b<꿻|gxվY+y^Xj2I)fMA:PQ@Q@Q@W|p| q|B`_6Cg&u!([v*8p.Ṯ1˫9(+\_k׉uۯz>ZGO+$}Y€xW\<0cJROUU(6\@*ܞ־oÛ={=>vSha*aٯ c=y؉+~*f~!+H*+5!$1\w%ukfrAWdy:E&={9a+c*{,<}}^i|;cƝ5NvnnݓU۶IwH9nN@R1d׎Tw}3Tֺ|Of;~GГѕwuZ6pItuω.n ND{׿JeeR&˿G1q)Z~{tXh_ c]nt}*AZ\\Gu"##jF9C瑀W?d\ҥB+6_~noVmo ౙwWVSswջ%{-JG`>O20HO$՜fvйN8jj)Z]pH9WnS瞼חRw:q޹e$ѢAL-`Uw?Ca`o-3̑D?2qSAZa</EGauowfvNWn&\x&=: |U'ZUgnhޚ^Gٿ[ zt)S f+;pd0|y0}]gE[2*һkG򭢴ZE%]ƛx x9^gC#LԎ!zs/K*[zn3P}ϥ|:*W1]?+ kVRݿAeOPpN}&%伺][8uXlӳҼetiy/o$Elwx0OCc>.Ii/81Cu۶Kuwu'kLU"0g!x}n5_hY.EZ6)tG5̲,LxGJ~|5Miv :$u}={[XuVZ偞A)@WTou)5\[m4k!i^#oIj6svHG yt]}O_}WجCQƋP acHc8UT@Q@Q@W'EMޣq =1-x%y dD]gZceOKu魑^;+"?}Lk+EųՄlsu[ۖ?u{#6ͨe4=]doKLV4vKs-ptisj![/E^$ԕWy%yG3 k6f§Fy`l8^ư5upsʏsKc]FןY]f!zF'#'D+<"dۏU\Vu~9%Ҭ ;b6[6_aIKuM_ Hm;T|߱G?nq־l|S*&eni`C_En)mnx&рN>W?2mb13]g\BeAsڷL;Qa*h*dVZ4L*:Q@4;pS7 p*XR ,UGz~UQͱ,2;J@6Q]:mYL0hZ\$#U0+lASO{myw2mu&B&hя4/cpu SPv{$oDa\6sC$<9VS2G.zx,'ӯW~4-ĺyItŚgoqORsOTV.r?y\SUd>^_ֺ"j(`c=kf*?MS卂`qM|b n1u9'*VW4AMInPWxўMws`a.zr>8~`_g^/1J+T^ٿ[4~yMᲸzں}UܚѸ+;s+p]jM,*30W8)wt?<XҬm{%bɻ%vm 0fRarI$Z\`At:CاIlYNAxb9SוZwGd0]u74WW6'̥C .v1ھ[sH+x^ dGG 3O[8;IjѦikA^GO?~Y+*6<ۼyӑ5 G%NΧPS^ImWI뢒A^X3ܾ_qMփ{ߜ{cO0UF/v/P 󠢀 ( ( ( ( ( ( ( ( ( ( (='ڟQΟs;I_9s{{ٖ1'p J ( ( ( ( (n.o^n-"o.cIt{5uLG.(l]]Z OU{EZ֩Ȭ $=͟JoHF59+V4 JJ e69+ͳ6S޻ͫ/7XҥXZ<dl?_2y?.˲_]l'7QH)ˌ td¥PbaF0* *d8"j5pkfd´b±< ٵb@n4rUA]=e{+-WZz'#>|J1 ˋ1Irz~ZY۽ ,Q@9<''ׅsKw m\^|L2j7Q0 Zdrbi*b~`Y\dݟBixg'YovW?Q̒S~֪~u.vo?6\_f 좕 <3Jo8;͞ksl*!8YJWfXZλ著2q#;:^UsaY="_}W~V<,rxnքlӾ7ZhvZZey&mGZ&{#H́{tq_)ڭSӮ}Rv?'lۊwY{,3ӽ)Y9ktrXSHWԮ:p9E*ZiFH9CG k_U>9z %=ErT}NF7FWgru.Zط 2hRoJ*!ӸW_w >8K@`ZLl5g̘Vń3)# ?^kNXjzo溣؈ꖜˬ^G飳Z:rOIi8>g#j"_ ݏ57PEPEPEPExÏx^&MKj,QeS,K ɭzѡI{v~BQWa__zω/G^kwd7`P#ʈ˅#~[f5nW[_{Pci-We{+F]s p*l)V+kh+Lj-5l[V$P=X/l5IR=eh%ѷWv?(+8[uh&yF&KltVZedX21ڱbO?N1WgU9j]BAgk}⤚EnʙB!2y9 .zwϩQ>;tkU4KVX1 wܣO|;8!/Al0 Kr}:g^%J]t>b&BrX+7*Xol\J 엛9q*6i&o]hZjǍeZZ9te<NfRѾZϹ7,ʯWpK_+; \ # ( ( ( ( ( ( ( ( ( ( (>ֵ IhZ> _%ԴLJkBב[(S7qG;BfO-Uؠ((((+{ EMI?:~f:'mY@aF?pJ/MVqשwȂ8-'}m p^Qj)" '㸋7|ޖOu=+bKsNr{SInݜ- x!:N K tfr*dΎR$ #KNY#ESSFӒ lkXHIS=̖XM7Nutwk-kh|nu™>d|4\ޗ3m66a^i"=?\HV('.?wQG 8̆t凗=m~z,^TuIJ.I߽Eu}5ش$#n<`gu)8ڭZ׻;ZL%Imy4鳝¼QevP~P qkj))wտFT*M )M6]ޚ^^{1ڲ^7F}$v_Q;K'7o3q'fKˇs9Mr۾խ{]Py&ydGO`s 8X*t +/=?3p5G':yJNRvVWoWM6ܬ&~^u3h)ҍR;cH)]sNjS6BΈ$2g9YBG6Ψhl*k:"=IyS:kWugk+\M]z.@'?|-"9=k{5b(9ţɯe7CJdXũ-XN-NtZ |w⟇1z yKKg9Qe`A."+FInYQguʢ|VqjE}/o?+iIsBPmFFw傮[gE{Xu{7w+{͵sN,STaeaAi-8J&֍=§ ( ( ( ( ( ( ( ( ( (5x/`?u2|Z_֯m?2yv 7qXPEPEPEP_%~?/(_hW>_O>86>c4¾l#vpM|Һ>;XN0$ R{Sl+CԿXJ1ҹSGzR^VIj90HqgOZN %\'D)R d5&Ѣ_#ί.g`.ʨStJ\u8A[6oS֜"m)jvobGWV'CR.ٰZ+2d@?)OL]6;X+Mr~[:)l#e*^)0@XBIyUnFV x9T\.S:f7 RcZχUcg宧\V \d+Ϫ`Wq8 ,V :SWa%tؿʠR!]Ux#|J՞eh wxwATKo,b]B3~:*p56%$٧o/&9eeJpWjk+?)h¼ H'xFYeauWꑔjEN)ԍX=SZT+W܉|9I}~s ̲|kbawKI-~WA_`x?t۝'P?,vn-x@w~w6++믌-Re][7O{nbW3T9&%? u (ajY,*EdI=XKW!YRVmjf֡V"Q"$i+PXV' csCzt·\C]O=?yxs+z΁ d?|1n|5{_Cۦ,$WV+eFX Z0Wr^m;~!^id~85z70#PL^WZI$NU_:OF0y`v]._so5WU_}e~I\2kЃ;²%Rֺ"mpRrõlUCֈYաBz4ӌ0G5e(vS *)GQM!I?j%r.2=Q,*tNxɭz&b-㞠~ua}YUbI3#uQ*F{J^sz~r~ǒ&¨*6<z 7c]roP9m [a(X+F9ӟUW펔%Qt4h*3x|5msRޥ%pRiH&v 98 Kw7~mCzQw+9_S\5A]'̼k"Z+>Ua#?_?W1]݃|s?_1[ -*y-O6Bb|>ؕ< IP>ld`TX=xUR^Gɿ!^-oW. sՊC"x-k5^l$`eZE~nΑ#Y0p3Oo$εsa3Xh`<( Î14ԒףZ^^_\C7|jZcX0YP!$^s8'<NoG-ok_R>"QGU|6lb)*0 S>+b /?u ٠ ( ( ( ( ( ( ( (🅵^ |O BKӬԋSȱE*F`9$h_>$h_>V|y N]&m*~k%o駱c3Jc|,QE1PEPEPE'Od!F?h3kkV ٓ݁ ۃ 08;$ThW^O.ܟ$B0 ~8g=>͂KR_kw[/wESV 8s|¤Q9R\)P&(ZLL*`qP7 }#0ע2XUwٓ 52Z0`jg<·-NH,:+vZce:+pU_Ϩ'5bcW> NNNxjpM}MU~o^'epF;(=̷kyK%N$Ӏ++?C#s:2iz;=~mhj5Xi]atq׭M=*l+a]07U}+xd©޴Lª>j3LAQ6pqִh* 95HS *E0 ).j!2+D+Hg|ojbXT=yVэ̞S?j3)V0~5w*]_ydŹ,ś澭++#j5WP2RvaT޵Y^aX3Gu5I'p< 7.kQJM݂RR)ҥKZJPU? \T6u+r޹+#o M yzK 5ƾfip3ۿ_19*v G?_1yPVm^%\+ HzzWY&.w o`e) X(܂O` ĻKqwmt^Z{1Qj{oextIZmZX9s.`#H."KaR*&ºk]T\~PJUSAcb ?v~kTiV˲Ň*NxEـ ;K>;1U= _g]^}W֞o]h׾ཅ~JY,Lln ddSυq8 b ֏}l 9((((((W/uYKF}*MfVrJ ( ( ( {/|4۾ x8nbDǖGc BY$aw[k%YW;QogmmwƵNEe nnLLF:n_q4I<.ڂ9۫o[(Jp6y_]踂AH,dJ:P&(RlT0$*J ҥ¬)OfU9f̤>&hp6+gU+[%ן]hyXkz! 1|Blۍ$c>Wf M*°51O__EhyV# .a*&ZAP79O`w6P]Z'a'` cHq)GRU"$rm£E3Z98AJ:aRXNQ{*|RΪa[V,뚮iwzkZcŧW6c1Z0ٲ'RV Ct_?yU~x"<к j:}͙$Tz0yV+8սWXhpuUV=۶_Mb彺jCo~ȑ”) qi @QsX.*㌎rASqO*`H\t3r ˨o;{y'L #jNZZ.bѫ}#Ž!ӗj!nc_s ŹzQy a^xg.e|Ihߏ|+mIա7R,a#a3^ [86X躭Wv~A]3((((((_?,߇)кg~q|o2ToƎPQ@Q@Q@xwϏ 'O/uki:2THdKLB~-8)=VQZdNj+Lv< *_]ŧ@eb1s"e}m&ׯ} b7Uo 8_GjW|w ᯐ +ONtǭomJU#'YURZФ«V0M E GZVITHzhR% ʭn+.kDG'T9t=̤‘* c&ZY:z׭vqՐVD$flOvy«?j G4 U=MP¡|9EPSj/p_%Ъ,[a7^dN H+9A"]g8K–j 8"2W7 c\Z-?u*.ut ӂ3¼䰯C.ё_?ZH+дﺠqҾ_qϨWUm9}QS`5=1_=Q/XW^%ӚtK.#lFW`:ڳi)=B ( ( ( ( (^&~|3&YiW_jZjMۯu4kKȤxE+2%TFPPEPE)x75?Q6E1NA)H#`d3EfN;GMA];_ǯ~3ľ&=贍 AB@+aL 0Uvb࠰ojO)nRuW$/_K0LƁ6!@P: - ( r#40I rdH*UlpzTfTsYUۀ g$g$r2CTKcljJߏҹ&:]>NB`y+Ҵ)1"` *Qџ7_D&Q+3E=5 MpM~w*9;#?ф^&Ye  .f4|&NA2#ʔa^VLk&}J7 {V5ATX`jZ,* uCaLnXֈSi(HM!+D L(TjdkT[7"Qp3Uydt5ѧvc7+&, GA^sέ=Bx`BLTgK q@ 5H;2 AMpqLqn%ӉAMc|a߸T B,9;4zPS*ps OjL *]qROp;cڢ{\쎁]ܫx5B^^|A=>_¾{}ZqbT3+FrT[jLWSϩVgTAR)޼jqM[$WEq0MX+V_h6P#vnۃ--oU.R ⽜]tZZ[Koq.85>ǚO㪑V کFJV I'na)Zz|{УsN+B cVVKP8]@2H\0Tx_"vaSKZY)2HhrCs,ۗah>/ּmOx N,eȂ0@k>\K $fdF3 >,Y#ߝyfҷǯto@x:ZHCԸ&Iڛy,IcU.y[~\,0Zt_WeX!EPEPEPEPE{Heg?',|=:~vq$>Vۼlڞa@EPE>- n}W[= r0#eqX+׎on OĮ&_wIWtV'v /P]tQ}B5j> ZIYn2RBg^q޷K')x}2}ks-K:+Ճb±PqҺ͐U^boaUj,¢[0l(5I*:Sv * )ժB \{.7S[$`WM5Ԇ rFG]ԡfc6Z z.3>S_=[H+ѴÝgc_+[:uO˷|/+H`؍:{*ڼ$T9Wucp!7PKop3=lW^SMӵ~W6I)v}5[y&`4ѭNP<8c VRI뾪}FN5I=w׸T^YQNaNPzֱ:< d{WL)m¬8+ pVʯ)Zb8kԡ-^\4efeAd_C9>7U$+ x3rlVMc{m*e#|#XT29 ΊR}ZXLFkQξXWGO>Káx3Eؘn)ZSu,D3 r3b@Qn'WVU;ɟOCK  QA^XQ@Q@Q@Q@Q@~Ͽ}CU|rNOiQy ÖϽ(P )8 V6Ug~٭B=VhTDq aEPEPEPONIKR =§8&¬! *rx #sWKhe>?qTWGY]zzV=MhAUS[ ;¢|.;EZDr *$)HaFkE)8 fՂc}9u,U ے9۞a*;sߗ.A9uX,?3Gy7 M 3e|n?av5QIP\HDR(**r)@v¡4(2jQ?P)Fy0eq Ò#GaVrՌy TvbN)T&8843daqHzSzOTq?#cyo+T`k񑱔½#LWz|;C 뭳v־KT+D WWR)T9f \9+i[Kv瑌u~=|Eb[޿[\r\ѿyl}]A9O_}[Kf _#Q_ieU8.:z;Rch]h6UgH,@rk`3ʵa^kiv Y?ApOd|6k+x+=ݙY5Ji18#o8cEyϸ.6Oa2dwz]¿s-oi>mOI!羜yFU ?+Zu7v}b(((((((;]| t >T ۭNkjF$M AeaK+1@0Q@WϿf5_iZF7~\236vo68<[x ,T{u۷`ό.;so Qh0gs\,e`'uԢt R`rߍLHU&'qj7[Vbh4Z3*Pmni(()A PS)K%H: d  &K g5FmZe4ccα9悺;FzWEZwD0+ĭmIfPY0~![RÌ[?Wů39jSjY9__z %$ \tX/wm$@Nu='ņiΜ_}A^ߨ?0S n0=9v{tW=:=u7c;f=uDT'\ƶ*[%UG]֩TmҘ ۅ5Q-AZ )CZDH)b޶LQ^yU8ªWcS6Wxƒ#l\㩸Wal gcϪ¯}W @F8k̨sH(6¹d$A ~V8C0wV,E"=}cj]wc UѬ(/[ڭ)를+gt)"GO~郕8T4gمQ}?JпC*0˴Y :0W-,xE7pl4+9n. RA;O# }쏊s::Ʌ|b|c|2׺vM?4P9D'nk泼QKD컾׳|JA~/|bxgW6YY8f;"]#;;渜L2?}OZ1QVA^\Q@Q@Q@Q@Q@Q@wA9Ť' 5-J]e<7ikɬOo6phqvnJI)⫏|CO5 +s?jܲk7X78%7/(cR;g-;;-]+O&ٷw#f Ďnnb|"e(9ҌFS B+5=~#(L|3u;hǚH1#aAQuA_k|-]^&/n'vm<;:eʲ0= NٙꝘVQaQ3NJ 5C J(((*T=K -u wy7\0;ξW0,OZ/+ڵ?Ѵzk_=ZzK>l>_BYA>í{G-XV5eI]q:鰪-ѵ+S󼤆L݈%s]Zn)$~' GnY'Nm{j9e^wߗTRw?rʤ#$Ww- \ ` ouEمRWD67[T#AUf@z$Î* ֱE0լPS1Z1ss]!'u:KaY1PryЅلW9}s>J;UdړsFl?_AogE?mQZ24&sZKM=tBAQ75En YQ2JhAU**qw mR DB4@Gҫs=PTB%:V dKr0TJ*H*҇ivv2*d>sjl*G:a]N .:Wesv'%G?6G__?VFR+4)^]œq@?|v4껅\8WQ1^lާ8?D2Z 94çͫ%P݈b0_HP_>xE5z&oj",cym6[i&he~aeI-q@EPE8G|Eg|.{\3y3YbbMwdqIKre-WOO&ϊ_;V'Cć[+kV!$pjcXʓ[xƿqjD",f?2&Z7 "Fv*]֌хqtPEv ZPEPONTíK%ꂞ8fl*0og%c9+Yr3Uۦ;Ya$fI SC+%Fq^f!6)u ͟(0nO^_ ϐ#+{<#M߂u3n?Zp:\^;[_× ^>Mn:J: ¹c]tCФ¾QдQVkheL8nk-j [E;~c/-VJz|<~FWH+]sҽ:n 2p9jlTd05l *ª;}YI@PS}+HAFOj(خ+j&JF6XT7M|^h~ZSʿLԝO;}WWϞTNyTMMQH*S$_4ЂU )34T_@QT@Re˜Fhʣ& G Ȗ.J8ҡǘmU|85BVvaVӜPuCPK|2ykGCZzۊ?2Ux8½sGl z31Vۡ:|F;F: zWW8e; fلOsHH)On>RKVzsN(OuuFskb%sqSޥ.Yy[|O5K]1i#  F$䀃 ۹]7 ѭJqX=U~]Zy^)ҥ)KE]l_6Gwohpk_ *_Tdmn# m?:*.rEWgcE_uoM'/^ZxK`m4W.bDέXȷw߳l($|c\GoṶo1"<~Nv UGﶕp`u>|S__.ZҸ ( ( ( ( ( ( (e?g:/OaϬ}o/߱b6>$h7߆5]GDz)BdB &M' үu-[?<o4),x"XVW%>g;w#'ğZz7藒ȒCuFo&t-Dʹɦ B e( ”7`g4(AE"1&UūHdԲXUHg#)] XLeVu+ӊ樴,º);s XQV / L?w|>;!Cp~t[qW5|6M[c꺙M(W(NF{W|*9" k;vSu'W|3WM쓼{qW6qd[%O q<=- #7V_ x+D/5b;eKK#y#C$hΊ _Y=|)m\[3xZR㸼 $O)of#$c fu/u~>_KgSCogqVJ$5Y[K,i,l.*Eτ|#kG{}/zT" K`vƹ$NK31,ij331$yRUd7vJ̕Q@Q@Q@Q@Q@Q@Q@ %O_>[ټ ( ( ( ( ( ׼?J|OXj?N-mwaXdpT+Wᶽmj? kMTD ~=f.ܾ# Xp] 5+c}[x·[kt6NeD%d\m5N;x)(SaN r8RTyZf¬ҳfl*6N;ɫX+Rհ;qXTWG5Et* ^}xSFz̡WѐȒRRȥaS;?|tS5y#K iVVA_9x%g, 2/I;I$j+drޫE{vNf\kpw-p;'}[|7Ѥ5 (2O>t’Ip-h<ԏHCV/ Y(fH$c[фW6C.Y[zH1m:5_/O{e#aȷM VWvdy0egRWG^Wז; ϗ${W'^Q'ⷅY[?\I>e;AfIV2쪾e?ݫA;9t_~eCy=^o Ac|KFokYU~qp+l_B6->5g~ˢ݅p9 k~~+{\h>m9,kIU5K;%JN] rcŽ.Dt3ieXȗZJwww/nXm,T\~Ȟfn&j[T3ʾj$,R F9B-;oL˻o- wsWhjj.P Aa$d.げI,Y٘WG@Q@Q@Q@Q@Q@Q@Q@s/cF ;'N'm -v* 6PQ@Q@Q@Q@Q@Q@Q@ោ&Wÿ_Gw_Zk6˨y6O3P5u<#b9VxV{K]GWk幸Y LRex`-;б@}5E;x4χw?a@mwk.i imRIa$zY-Mpc/oëx-U-W!Bmn3B q`b%w}-MU.v/LjxZ]xcWm/ +x.bު[O "H@"8d_/1=پêf7V{.,'8u|UⰑQ4;?ueCe윹̺-6{._=ӭziVt:}햡FTA%H#8#دSQQ $Ӷiz[ҩ4௵ܐXL^U/8JuG+\3q޾*/`jy$z6*]tٷV{zZ2)V>N*ȭAPMmv6U)h`ztFڐU] d\Iϵzzw1\7U3_Apשʝ}VpҾ4>+7Y5v {fdRͻʅ>?Lڢ>NpKr'^}`TUB ֈH)E1AVHSZ0J U򢂑1V W% (7TOQ@(ƂAEd)1t:M٥G_ZiWnT\;zs޾9&] "HW٭ԛ<ջ³nP+;oOLռ+_b̗Uï*| |ĕd>UO_>_'{mgqQ_mW:于s{K2VG 73NgTŒT)$%d||:smze ޵@EaωߨD;ѴN v7Grd{buFM4H 2XoϿQ' %wϣik5ŭn >.cG$1Y +mpbBAo")g,4B{/o;_>#.!][Ы QM-' \F >>/>ſvq#WhbdmnwfMcRnPJu ( ( ( ( ( ( ( (&ēkOOtkƳI/2-ީ6$jF[vɕH,$r\"FPQ@Q@Q@Q@Q@Q@Q@VҴvzikwx 7xB qHUrvD) W//?1V>22m^ ۩n KY4k@Ro*5r{-?7/~ hoI{ O_ٗ]7dk.yc2 h^״=ZK hEǃ6Ӑ2s<'װuWZWnqzShCv >|>5;MV/A,&YSX #Χ5OlU|KfmR>`_sEci{*\20ːu'I8I=+鰹 z}>lD+fu]:[欗P6xI!6Tm*GPGb+RSJQwL83])W0հsYbU9#塜 cHh+rLe=IUR:ucWwwaHPYax|6qK2ɯ.JO>eI^{>U?׫B #L+"<at\+Uߵ}zt0}W]{φypPclu1lWR1xw+);|[tӁ뿩2/nY~n+V>H^[P¹SK[QUmB54T ͚c=05f'98־GI$z0^E=IgyDi=_axmoeʂU+-{WV6c)WHx㙈 y$moGX[Mܠ}$vD|7P8]ZKtɿ+F#a't\ss^&zρڻYN3쁤XUF:DMT$8ɮ"q+ *]tU9vSYA#ӭz c'`[Pz׽V|\f8U9ߡ*)+5ޱg?p}2xϽwz Xʔ"|a_HieT9O%+?QX$;FQ5R%FhTmҩ+֩’,)AH@# Rw  LSSHpS{pT*I)Ԇc4JTSpN2-8$u<6XkWVoKLh2jB4{yE .FxAU H%@,Ac(8Lj -wn_ml]KfU3* vyC54 u-VsU$hWc,:f궧+Ŷ a5s$QYO-da55Z߱w챤z_/D~gkڜ6ZD#nUe?;~x7V?i|l}?x u Hz=ǽ2 '-a}~v~uYKM`lGbQd7WMpxQ@Q@Q@Q@Q@Q@Q@Q@W7@/??4 j5yP:Q']&hk\u [d\0:%_x8%g1Sq;8G@ -^>_-Gทhbo/mBN.^PqEFH=<8vjuJW_cib)ba(Iy~*Hܯ=Z2W 4鶕(r=\}6.½o RR !SN8m\޶\ΌވюH#QI(]УGyvϫZPp:2̯瞳ϧ#^ү v,L}פ7c mNjCWF#s>25ܫ.yF +Xzψ%:Jk^Wz6.t9RyWz=VG PaW`t0S nQҽOcܥ+ss?+Ҧ谬rZ쁴XV|yuA\0:MRlHuSC )5N U +o م`]I:Zޡ\6O\Z->TyA\.pc=kۣlNP hoUYS+`xTd#J/]KGY|՗-|@T-!FHV+D-TudSXwT5B ( ȪD7R`d{PKH`֕TRa7pW/Ӽ/k21F@$yx99Xeѿ./?Wl~xF/5E,{Ыv y<Ş)|sx7m?5 SQ/]O#K,*.v;UB89( ( ( (=Cƿ>.|8ҭ|8IpOqei{+umSOܜKçCI[׭ ^s׮K&MI>ZW2_W.ych}ZK#m_-(Ǣcjg,ɨeU*붟8,T$^/0uOsۧ[Cl;(r ag Iښ}ǠOZr3ǿGx+j:"JrfJ"".XT*HR^^x,='S[;+]B"M>Ʋ+^ < )䴞XbW/,&<-4z5iҔ*X1BaQZ+@ALjLT {2 ktziNV aEx)DXvSr}lM=Si6+J K@W-'F>v#Oc<qyVfb7Jθ֪#ծ'xG{@̓9v# @ҿ83WZO ?yݵ+h99> k{W#UϭjUshUiaT"G~ 7[_|a:߃|5y,+i+-ľT́nTp5a]R썖*/,߱_|io?W~ փ=lS2Q®uK C ]_kߵ(.*m.+8" ,(4"mXe#5N?~K]YVVx_V^M{s~tGڀ*噎3O((((((((?L.uZ lFAwpAe5q,2©孼'.c, @Y[iڮ֚Đũ,+Y$rp(4|T3(((`?B0ѿ?iw[vw;UH7! wwۼw$ػnϝ>.~-xq>g=+T*KPXԮ}9,˖ymnMnA*W|wq -xR {;R;x%9YvөfAvn%4P?/o/H5G?/2}>s(`|+hV>;jo/hDeiX%7ΓblVF Oڏ%Εe Z N>+-"e&$H#,Q<cr;56VPо֑۬-xn}Jh%pf7W2!.Ŋ)aImRE"WR0A3jEjٮM&¿>"2:O,e2JF*v8_ӥ<%ji`]v?ΰWNSa^I:>8;d³\`LXU23z3T™Uqҝ`aX*U|2r:MjO=S:E39A0Ks#Y\+RpA`UJsN;rpvk~\.b6:[8C9 2BR_{xf:~Pgpǡ^=N³%^ JaYrkŦ!]֥t ˙סN7%b]ɀz^32r 5}|WaݜUedWMX^=ϕ̫宮"8@I$fod~uV=f]v GieG2+rO0+-?p#N +%_V1\h 95iS VCw aM a9ͻ1Ņ0UrS:եc6S P  xN+O B lrM41gw I=Kj*be(.RvKv0.OrKLr9~w:]s/cn1-^+ͬm|ZNҾW5B$>9mv]yzy[M+DjyZpI&F+hȼ/2MOCeǬjVWvW_Z[I)%Z&vKL)TFGе/6M6ZzΥeqsee{5rUidbK}I?'56->M_PwYƭw#7z"ml1 k-. l~?5&Z) ih*ku{sc yxo'!ZV@ʋٽv4>IҴ{-.b$PUUrw{|W)Q@Q@Q@Q@Q@Q@Q@Q@Q@;%|Ygh?Ϻg~h![̰/o]":PEPEPEPEPk/bSCiھ&Ͼ>U>\ɹȸepFh 3[i,oUݼ^,aGy^i*^IdGnI$(>,|Su[_o>wfPcKۣ6;B(_ |'߆^ 񧌴y4?AEMBbi'R5Mc!@AeKW:[ȵ{sYj("wxo(^9E Ey|M]m[{<ȴM&H]<[H>s,Ē9( |7-F R9UQ nV>MŸiagY5R{itZ[Y7猰2/+⋸pz{WNGSaX 5u-QU'\tZ&lTF89'c Lqy>6xiq}3m=xz}r.uGW$cs:1ʻpyGM,;MyyG5BȾa“=0?J&˫[ʰvW噘_Q:cX*k>>+ƞ-s\ #$[,Ew`j#60*PNrW'h b;8 ܑ˴|ɱUL6ɯI9vh|IǩG9wlqV"G' W9gjZ_.[=\Ν߼GV #WYr1F8jzW=:s^#=ӭwS6MeM:}4h ˟^S ɛщW5z^L& ON۽}7Q(p+d{׵N:Wi=B 04`lzrAϵ*Poc: a9[{",a_PA 0!%#P񳓜SخT s TjT.y&l3 cV)(< ݐSphR NL*ЛGiw u ;`+O 5 ]GQd QHݕGrĜMgZ0sh(ށ_8Ʒ$(^[}~T 0dcrA;|R8fsqq=lulNHz>/*eK} GըEɅuJA€QkF*xүSwu%ªB5U'dV6U7;s[-M³c֩1A_S'wMJ=_ږ(ڨ4Ml'vp]WPG'O||k^|@(6uP,}Y{yWDp꿶߳_ l<2#FYF g;Q+yiƒ}8W[/ RV>X+aEPEPEPEPEPEPEPEPEPSeݨ~P񇄴$K]zKfaB6S4g2Z@ PEPEPEPEPEPax.qx+zݭ^I h%DVֱO2fH.9>~J/?dϋ>+xơ-'ZÚޟvTo 2X5؀o-2ݬk @U/WÞ6Mloy?2C4R+/b( [VuWSuNQ.5 y瑋,1,řI$@PEP_:c\w!Rmn3{a8{\ 119je\&c䖱WΫG<9xJ+qEcx #7Uv<VT${UT{$QAUf$j4u ˸H֒o( ?eQko[_F{ ?PԺA\|s_AA{\޽j]ذYV h/@ +ѤN+㯦+ѣp+žy5Qb$j2{zp+p㞾t!k#մBZ?Wk_3k. v 8`{^fgWeSVT AL#5qDɅ!q֬Yj')PhRPIji݅-PO4,))((E; \_acj,8$s1FWs|Uu7om;n_5Z}.Kw(c^ʣNI&W"nRgxel}g^r];Y ffswf,ʣRǂ Z <>_R޾r鮗h8mRWpL;z`Ƀ p9GLBIyo0oY6[명7RI# + 9]'Ͷw]%GРfSSףa7E-]¿^+,((((((((((t /ڜ#~ kэ[^C\ ưEyggd)E'">` ( ( ( ( (<U&q5ށOkmGSY4 Uhj;Uu8o2V&KUgV{*Zi߈5}=S΁f0[qqg ̸ۣ( ( ( ( -_C"xwF|*pç tL~8-L4kkvz4e^JTV oq_[\ۼ3!HR 9zG MuiշO31*ZL+ή+Ԧzl+.Aе:cU&VWpx玕4AUiVtqVWgT#v{>"p9⺩C;hA^o^|Il1_ERh} *<WVXk}a[~CƃisXzO+MBYe<+zqK{!R?~?Ƌ'gو^ jyO2gM]GWZQVV jaEImo#&yͳM [lj@]c9'<<^]^o~[n}-:SE^T}Ҭ/( e~#VgA\{wO+QFW .^ N;sW:b ǜ^%dU°xR¹^2^``9*^}K{b|e[t皬?C~ײ?;+>iJo! +}j^Q#<)nM֝.»Ҽ{*Ղ J+vLAU+P a=%ZR Ji'dUqM!6dQ@!5J$&p~2@Wp"{xXc~G'ûtWw|ޖL.og{IX |";sԝi9ԓVO\:v^MܧQ`l.0Gך%>G*-ttLg/?@>Rk& R#ֺ鳺 ʑFMt&tŅgKѰkh ̝޺itց_D߳).4i0gTfXX"myN >%%?k%w]?mstWEXivPKV"DDP(5 H((((((((( e::}σZkXH澓ZŴ,lic +(((w>Gs燣;4 i7%jW_Xk}AE8n'$1@_ W6HGt$5&omͥ/2ؼauL[kxR( 'ƕ+L=Z&o΅K K|Kobx&[m=U-C p!\ kOo~ߍ~-mMhN.-D;Jcyp\s:@(Q@Q@Q@Q@W35s]]N5UVflݞ`?\/3y߮$k5~]/euJXv_NֹC)+aA0 N>fU㩭bkN6tAn'|Qߏҷuu u 9'}+ѣ n0`?}N_IOR^\IbēCDZ@ha_?MPMĶW %i D7$]y(C ˹ܑ1z*~WhPEP_xHյ G*̰'v1ɵr8"+"T&~6wC2 P}4,M}V[s¹KPgNA\ȯbv 8>+Ӥhmy=3^W3zC^= *J^uʹg5Jzjyr¼R cis:4$_n-GnRqi7hTBNJm7ϰWz4>Fde76?Z\yiѣ Š08\zGp VQ@S`։R eQ!EU%q7`Ub.ڡp>*;4v2#oc{)45^^<%GY]J[˼KfE|}w-M,ĒrIIsz|[3*y}W5uT(e;q1爪;^eXu"w}݂ViҤs+3V4Iu+.rq]އT_&ox?G+#[V|km;_l{M0^%y6I=KHd4P:h(|F$?_¾4m> o3mKLL\'f x"lHS_Qhc(i?*s >jEx^" _ xzxbMRKxI_Pt*ѫ}P/tW_t B.oQOy$qEUA$L^ 闾;U1ikO:0"Y@% If@̑pgv |MOoxFԾ*j~u&WjjW3B,xQ@Q@Q@Q@WdžMj(g;b Iw@c|O`\d\h+R#zw:³dPgDXU ^kx+*V`ϧҽΨ+݅a\J3~WT#V-6{X_@,RvG'}v]OaX`v^ K+}W<3? [yFHY6+05 NFl`WLmN.rIxog~t=;H7$j4lUS,݂ɯGVnrݚ`aEPEm |RuEG6 ٔXGy?? {uIO{.(սz/W'Քz;?WFrp:v\Y B,g}{4W-v,G^s.\ҟ'OZ-^Kc8W' 7RpA_C=It -ZAnzxhyWjRc5AY?Rx.C[,˹8ey#UTp8kHy'&|iTnjGZbQLAQHF**U (HAQ7_z dFy (HN*!p ?'c)4>fv]|g']?t9FjX<볟Ks\Z׍R흊PGa(amwX(ڪrbn_W#o} /uTkW$r2d"!un].U}NN{s^U \Md:)+NO+=L+ rx?vSMaX($ZrI$;)~3|ޣO5((((("_uPMw/ PG\8 ihOWᒷ{]UF9RV yޅujwWXݵyB9ʅEiES_yVi*r;y]`7b:n4±fֺv@+6<膡Xw[sc<]zTap<ӻ> OP6}8`OEVQ^8х~6Mg[^&$hJ&6X ]VQJw+@ ( (դVdywʆA<##^+a#KW}-o%?u%~_&^W}₸ؾ}NGR+v{KW/v1׷] S u8Jى\Qq؟!v: RS$~_IBGd¼S!#ӟ|cVM_½~'( mͻC{ 8h.aH~mkdox@ֱD6=)0b FRj 5DQRDIRl)j \cZ y|H *>?ϸ-oR_kw[-7x|wxkeEywzdp0d眎ƽhb F9WvS CA/Yǩhjɭ4X / ۢe:YS wutֲ[o_y5zXQ <_ S+ufGGֽjLDA^{BT8z]~]Ē9NVW?p_CJVG}6_gsxn?nnPB<3~W{ ^]]W_U!EPEPEPEPEPEPEPEPEPEPE{'O4@m ( ( (>ŋ5,-ĶxKpuwBaij)EK+șP j^ƿ:Ě~)'[FaԮnͽL0+fDZM9@~=Xޅ}}bkŖ6Ʊo:Ȱ\%RLS$y_n((((((+ڧ nбhH[%U=8ltqiQ~1#n68X%o++J9+ĥ#hˣ Td= o@k|U3W;t&x<Z= KpCQ'=ӡ+yqx}& XP{ #KX+~׾:Jоh3]Tx$=:1I/FvGkpIj-݂:O t=" +m'H#71,U,I8_=99[m@((+voL[oO-a߳tGF>uSǯ?5sV3i^:/. j0WeYm~hJQ_g}U A\X>XsЄ<_EWIe0'Q o;a`DzܸWϦHlp՞^QJXN?_你lM@cӏ^sT$uoKuoo 3v eGP_gr_!Us_id%ep+*#[-l(AL'5IUvZE J0jwaQ1H/`%'iS:3,j$Jr(-[{%ݙԩ QsJ)]In kx+f'oA?)#o76]_ezG'3xl+j9v_7Jۜq޼55iqӒI{xX(SH+$ lUΠx )h>^/!{]9$E,O+|@"pt]Yz/^a%(xG>xCG7 lkI$3K333I'՝i:+rxBQLA(7<Ē7ի:c}OEgM/}M.W׈tQ2FM/`(]K u{|3gaW=esĚT.wl4gmYNYھ9ݒ_yۛQ _?b];ơ|F,.,1qwd]H#}|#}*ӃAi]Zj0~өn_5zEPEPEPEPEPEPEPEPEPEPEP?Q|GdPx+ C ;D@ ]ϩ+%<"Ė+wJb` ٹXc@P_^}esׇ<[OZ5]΢v뽤|>Ҷ:bU?M)e^?Zi=Оr\=rL诉kUKUuyG:w^~BL{;bpA(TUŅpw;(syGu3ѥW)xwSW=J*\1 =uav{Xj溼-k04tG ͪ_EBEO!+xNRi-KtGeaP?xB6 5yOWj¾ݮŠ((('O "\4$ o󢁁+(@GWui}OZJMIꗕUZB`xZH+9»zWH멺WZFR =~]@i>}VY E{Z3X]]Glc#oO{gZV< y5>ۦ5 bBМr<՟)wg1\H)riSjaHx aQMh &&NLT@T,rjp$)zHEm+FKՖ'GFXum_$9x8*2W"ս^ss4)hzGOӧֿTpVWnee\. Vw9RZ=]}m~Ue\̮.q;ן}O[ɱ=;s>&P=8.TUNxcAVCagmcq!W,e<+)B.r+D"tᵏ kՔn>>Xs(8g؍#,~1*+oyPWuPTS 3[\’ʥ$E `)4&pHM]={5م|ك^0{.[ T ma8= +8h7t|na LW )|_$Ziѕ)WGFBŦg # dvQE.Xk p|hܗܴ+χ ,l4oYYdi&ePHTYfVuRz#J8Hэ5PEPEPEPEPEPEPEPEPEPEPEP  wQ<x?Om{cu_liouqbDOoizE*My=(>5о5&~9< aeG#-$mt{'4d0vwH\jwIEhm+><kIkoyz]-y.=F>OъX^,UįMqo Zdԅ$iA$is[xt Xn[M:`TMJJCχ(xFՖACZ[ݴSɪJ*!#:۔xjXOV|fC[i¾fcR`REGtgk{b-ΛH.cm|9/?q6R𘗉QIn_5k#5^ivo_'+rSߥxtGЩt.J=z *t?zt#= ^w0?1ץ}.gaSvl+͵7 !ý}<4m?dt3"&0h*T fܪeTO,;1_定Ww Ư5 ( ( ( (~3X<%[dK{@jYQBC'n>i9*3jw]^|W_Dڽ > Uq8Z*p:oǽ}^錂Y(ZsWx_, q $U>O|=Vt>ׇ9Y *9'hyYe Mw_xKΦ%~UM_{{+QL*#ֶJȆrj%Bo;x|wBiq7tfVϓeev`d5l|k~V4 j¿Hk5 ( ( ( ( ( ( ( ( ( ( ( ( ( ( (_?c_?q_w>cϗ7cMxQ@o:Ƒ[Fݮ5=BL2sys$p@I"ZY4"@GgW[uc/-|?Pi-k9\Cc\Ǘ3dY"2<Zo?/Wyo'ծ|l'PwfMۼWyQ@Q@Q@Q@Q@Q@Q@Q@W9 i0oRxgC&r k*>ϣ^30pZ?/_>jo4mRdT8@ Ut-Wu=O³ |ջvkOz-YC:օ.;po`:LWݏ;zg+z>˧Yp+ѷ_75M?~}[mZ߯k kʊ=™ZҚ ZD3OjD@W aՈ*#jl*FI 1o?4y5[4v_jV]^^晾(bJ"ZyΥ3I!®B};o_H="VI$γN}c+oH)e=xְOS͌Bn%<ׯBN!\ܸ== P b{zZ* +d+Vό_ Jn`auJ79} bQ@Q@Q@Q@s>3T,;ZC*9'zs^voAbp5>VW֪KNA_.!Ԛ,`+Ԣʑ{-_O=[ǯz|_` 0{ ξx7pecʩg8#8}J6¸S]ňBh?*ڤ"%EkFMtႽKɰþ\T-?55h bS$*2j%X<դJ a5iv έ+6АRD >d,xHV?^F{ 7]_O6~{,7]_O6eyr>\{WYcq2by>v?̳No++tItK m²*T9IҴ{-.b$PUU:RsnRwl H(((((((((((((@G¯k'<]綅{ۛoXW|;Rܬ|B3pv"|Gx~ķZ^Yi~%2Y4 Gpq&wKtLp9@=D|7-5>nMo-;6e h&-M";sohsEx}ƭGBE0xF_lퟃPnα[֮-yݙ%Xeh.%s Xh^BۧOM[¾ ʺ<,,N&3c!RjBѾ/xC.X ^4&Ss4@AgN}>Ҽ3lMKmmvy;;o6@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|9i֯*L\I~xôa<9-KX}m4?=g%dߠd$g4^cD1!s_eF.  B3})~ dv p?Z;®]ͮu/3 c?eXcP@ ֮QV@SIM!6٭!DOzFOsV Ją4Wr[jaX|}減+J]躵KĴr <ҭ%n=Vd2H^Lc'=vaͫc79+]VK-l7bJXvtIY/v³݀zԩaFVӵzTiE]c?R+١H;^gu8}1~˾$J q4VFmӲI jcOKYNY=V*4 %/ z?t7Z([yiGKUH(ܔ?Q4}#Zgs$ALq쉑v!*p(e:xo5WB.Cx2A$;\ڲ\k;@c7{mJ@~8cn=ϊO McK&nǟ&i+47pPH e$Q@j>0oG[iV2-I-Wb*.(Eı1$~((((((((((((((((((Ob,oq9ۭ۷^?곞:k[%.^A^_v7#z+ʪ<W Mz= 3~Ng &B'#I[Y /)2S}ý ՂxNᝋ 8&ҫ*=,,\?Pdzw 2B'H¡59UD£'5U i֭+Vb|IrFH ^/ъ]t˻z>]Z|Mr7z)N[_H飗F֭O4cƿkI-h~%VV#')ݷ|Z%*SO U:ףFU³.zWs+"׻]h+ٿRǭzR~%>ځ 6E$,i-7ie*/ץ 𗄼7O osKAkcl$Iff%ؖfbI$VuTw=DUWEY((((((((((((((((umW@twBoNPxgK< mwU==]<=+[o~dBDOeCxD=B]ſe[/߱'gqg—u[oƠ1=6Yۼ v ռU5~x -'] FD),W۲|*i8ڭqEOz|(| K𿉬#үQ#mI%8r|<_x) ]<@h]EF" bG(J88( ( ( ( ( ( ( ( ( ( ( ( ( ( (NuO둢BfH f*pp{ +:5{嫷gV |~i+`|Y#qZNq3FUR3ԥ :YFߘkt]hאA\ NZO$›#U1^D3lVO'$&¡f+DaQZ V\ŰhHW+>VKGG_^S.˥ͧ5{/8Ì>͗Ғ?ݏ0l)=5Nz6AU=աlhs!4 WJR)D6vnI8 Bb@{ PSHF%<~uk5) hB+;OD(ߖ$ S'3jm谙|i*_WyPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE{#Om4h(Ꮚ5X~؟/xjx^Toݭ`q+4taX9PJ FI@~&/(7$?lv-ONW>Ϳc#Fq??5A?h?Q@?}+% Fk: (<-@q^c/ Y]m7QIGgVyX?/mOUKx,ZFI,s 4H@M=WLVOG = M. [Kh׈FdU,-ԠVsmWS~B?vGxA;1o#FMx_~oؿ'Ѯ߶y{<+E߷̏vzP@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@G40C-I-QC+ v(+4]_Vܺ5ŤJF*pN2 ;W)nOWW¸=aVQ~k_J!^'@rrJt3_eҽugdc+ ׎H Ǩ"U=čW*'=9\Q!PV cg'T,TCa\^md"5?4pX* ֓esj+]kZ={<[r75N.͵-}|]=߈iTkR?1l)IPlM&Nw aMRWb>=ӵ?YMO p @7L"m= EKo+0UjJ叞%~~,9z,7to}k3\ȉ<lPܪ7iz-Ewzg妿zsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Z[jz~wki[K-h,sPp%FOkޝ=B_{M*6R,YC,*B (NO[_Z=y{BO5!Yq뺝ޣ7]j4#YdbYݙ31$I93((@/ŏ ?YK_1il~oo&2hoWso j[ K2Oi&lZ;ܒc yw,xCw >˳o~=MQ )h෽mLfhPտg_ҵ?w~]An)J)0CFIiQ-r@EPEPEPEPEPEPEPEPEPEPEP_[ҿ|qלtZ#1 &PFs3_Ajw ) *IZ&z^I*f8U9B]I%oDمJRm(vމ%oW ]m[Sri=~u_y/vѽT/[8ڮc0xv^i.}v&}+i?>l*p+f2OnaTvH0>{_/ChY$X>KL :(>ip˼q]]>'m{8L#vWoW/*:ڼBVg#`,_$TܠnFk.eel.]kw|UwQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x+ßxºi.N}:y`fWhHYXhъQN2Ѿ/q|?7~-i::ŔvdGbIX5W\/|kWM^v]5/O| 7|#ʿ"i xB j^0<~opͨ\ tȶPDy2%YNP!~t+S* y.otAjZYWT2:GČFY<>(((((((((dtY|7lYmZ4=#<\ҚU)Ko?[/)7^|8*: [-쏸Yy?1sV.jȭV*N͞W!UCv sqRK3FK^a-xU b1Qum[IjދP TԱ Ӻ2?\Cu3a' OtWWqa‚i']Y=޺lVlq9=xlYJ] jh>o5mZL~2RT#} 22EzԲXITS?gF-/E w! OԾ+?G?'^97|mV 5PIs>o?V|y/o,ֿ0֯c[sa7(9HQƦ&[EE˰D5]^koV^A^\hQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_(j³ify_mcFԾo%f.M@hC>7N5{KV]5D$-u(_Jү|%ៅ5nq %7>6U YZ4 Ss$W,g+4!@; c්~&O/Pq =Ʊdpa:KuS#!@||zi~~u6Gzi&%dҤ;1@0Q@Q@?l'?nc/g}Vovy\{yig]o?^iĸq}[LidTTÂĪۤdJ$(3}?>ѪKP!#rfQk#iȩ#%Bv$|LW!=5ŭn}VZ+BOqyo,R[>`մW@u= ].oNOxؤKU EPEPEPEPEZ& k-w Fq"q狏s|5oօk_nw $ >^~Il+2l#c~S9?Tp}R 5}>=ːWsN"<%Wwoͻ$| P*V]ݾH+kt'HW/đXZUcLJw(,w (%:̱)/=붲GYeWWي~z](__ b?W$.}gZeAL2]勖ԗ*~&Gީo`Š((((((((((((((((((((((((((((((((((((( 'Zg⯈5o[iQs#PD]=cW4d Ȥ1v3]u5xjBW$-i, &RCDE ( SWеu=ֱ֞'z<` \&903с1tѾ#kFXjV$]A_;o⏌~;o b/.Ԭ:m@g}#X䒨u\n(F&>X^OVV}ok9uOa*oW~K\կoF &K.{uW nLpf4 Ѱ;~wJWh%_{v}OjNuʽisT% DPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE~?|}*upFټ_{O ݴ}Jqd2y^T׾|h7?>(5yw׷Iaqyjmik.6ŒX4(?k/>Ū о47ѾxO>?|A]G  &6)]|FVz-ZqXS?hK. ĮP@O+?~+F57^/]w$ۻ8MA:?*F ͉&SM΍@_Jec'kZWkׅp!=>?*FI$Iff%ؖfbI$8M\eYW.iKwhZ$KEmWoo}YNhZeޣ7Y#(PYݙ$F}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x[Ş*6cxUW/eލsFx&3.dpuo={*&X&h5'Wd/T4 @- (?/|kWM^v]5/O| 7|#ʿ"­OOE;~ >uۣV9-PdQ=yQj%b4-dZW|KmKgGuOoQh.M^isډh<+p@8Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ڮޝqݞa3A=xE!Ք2A(ᦾ,j_ SHZǪ\#_A| [Z6I"hbP N#gǿ+/_i^vU|avy>ForY@OكYмGoql|N> Z΅ko&-u܀5}3Es˟?S7'?c/g*koly\7yoմW@u= ].oNOxؤKU EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE{] ?>(|b|-xW5 ú&Zڅ]JHy#^]"0PhO~5_^S//]J ?Oɯ^ xNԬȳ.%fYlnYdHa@xWqH^mCQZK xff6abRfA ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>|C/''_ _c6&ueZ;k^6{BFQ㉔;<%" \Zɤxi]"C`/..`[W [Ea?xO+oKᏈ,5_hxc]Pk$-ݪEk-2͹"o,$9(/7[W?Ö!\ZWß5=]˧o_ӠvUFERcE,FHEP_ _G WǧS?@2~'|y6~&;Px;ƿ:mt_ cH.P;ytq#HIwj`(@(/>5|*_Q3LE/|{5q /—W mgIdm+RvVxͥorF$rC#7e/ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (p ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('Uf߁]:ޣ#֖z}-> stream x[Y~_q+x**S.ZN=ppp;ϯgx߯vs+ՄdDщ2Q&'7۩D]ϔ$732}5|zƨ[_z9{7_|7nuL 0Mp2C'D!Jg 3 K lZޝk!澜ܲ~ww~92dB02 Hs_YazF.xT1ªC$(d#Vf`9JNfѰ>7HrڞOMn>P&4a}Zu%CA2Dj<5Ր 2+6+㝵bSt+ݸny2Q3ĵX^ 2&@~귷9v%zEr]Bʰf3/9z zf H0$cL MoLykA[Y"`"{Ήrxqxȇ!Ke/(ffHrPafp3>VԞA X ,Ȋ;h?we fQę#a dBDL\)b*ǔFCbiFnE:AjY/!7xp?*gM(NT9IBѱ a39DMm^23&i:gm{aIt"2Y%b`41Md&w47!0h! wi6!D?\ bWVȅ:_D-e`BanQ3& )p+HHIï ?ivog. T_,!E, [(;EvD- ؙՊ&Jmv*UlHUU-P_9 ~8-i2Ƞ;ẜ/cEúqme>FP$78߄HU#F0v/8{Ou[nfo$D>`Kk@T(<,ː@:u/:Jx!¡Gi5Hv|P.,:CP v.O~r?x{Lg8я~-]f_g\9G"r1GTUby$H BHJϥ2aɑ24/,/܅K{#z{,U+I$18,SP2lc&;&3L[dQθ%Xf~~Եu@6ܳRpbL20늌P5{yȋk;DwX$ j 3 }'}2yhfH6Hs \%)WEږ6uh?a 鐷XSm^FЦ( ^.RGұ@$VR90uR*4HKrRbsRN+q^*iQ{9;h>GoK\i{c w0)}G+frD qU*1G頏|tDZ(MJE 7`ʹCņPLj!48Ez^R?>&Y5 "Olpg^iH$juF)&`oY1sLf]ճ]{A:g5jZ ݌5(fJE GM#v7ǓmPuF 䲼 r["鄷w^5J顠MNu%K߸`^-V- i!| fBp1NC] ѨQxS5Mu^d28"%K}C V d@b4<ڂܸe&FO"-N4.( 0$vsH''u<'l2س|r Wx]Q2B)uMq,SA /R +rZ18M/!+>v@qXJצw=\pj`$HH ivtmά*ԨڧelyGg+\ UL#<7Xrf&.Vg`+jU33 mfq'G?eO5M㸻[?Y. ۨceEu61۲.vRk}R,Fעӏ?]uydc(ٮQ`L{`qG<-`Hw={Pvjw׹WAAk&i\?7 b0fK^4S GQb[ld^*'1"#ɝetO 4ZnIr Ƶ[|&$P$ 80 u?QBG*]S+޽)h? t4z -|?CVLf9h/|PbP>zPOg{I'4ވl>{~w7.Nh/9~. 4"H.ݣpW[ɗ{1,Or*ܡzy?3S_ϴ":_'+z&ӣXӲOW|Y$Ϳ~~ endstream endobj 2868 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 199.999 220.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2878 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP, endstream endobj 2867 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/RT0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2879 0 R /BBox [0 0 200 221] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2880 0 R >>/Font << /R10 2881 0 R/R8 2882 0 R/R12 2883 0 R/R16 2884 0 R/R14 2885 0 R>> >> /Length 428 /Filter /FlateDecode >> stream xSnT1 +|,HĎW$NJ@QAE88lKg&T$㷞C/?K=~6FM)VBA= }{] ,Zn :J2*OhavxdބiZ ‰U,0,Bⅷ{&y rtX Qr-I"xv[.Wl3 d9]|~x[p:mG>prVkYU4A1C.HF+iU<{KG'(;DZڎ)_F1iA(`LZ+*Oc-CD6{r;ݽu>Df?Vs'c߄vԘ쭝vz6f̄N2|.)If? f]}r endstream endobj 2896 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 682 >> stream xu_HSqfHied#´V0r9tmMgf:э׻[ꖚSǜ9 QQJAQѓ͟zr1&q@D&V^kj*dubayAeQܟbD; 1~"$@ ni= z;>ΦsYi3=s䒂nI o1܀a ̉3XDi:*l5929!"_(_(w ,Cb!6┡\@ @ɳ(qar0o6wx?G73Oxaz]󋁵@ֳٴo&,k}mʦ[PX*ٝ֓q93KntrEYc橛ᚵffJk Oah񯵭և׿|wof%zQX"JfSg|nj6vM$뾹h RWN.A0vmt@B+Z~J(mhf 2^? h9TRJ[3ԃOt )hzhP7 @ IL8(7#L&WsN 1> fKHY𐋣/hvCzqJmq~*0I01ҴLLzRG=C=Cjc3XK$1ic6I S17EF endstream endobj 2897 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 350 >> stream xcd`ab`dd M-K-Msq qtɚf!]#Gk7s7K|w7> 00i!c"cH%5_TE-ljnnm gvϛdɋWm]pw|pf?' endstream endobj 2898 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 254 >> stream xcd`ab`dd M-K-M qtɘf!Sk7s7K|w7>$s 00j ccHS 2>ff5mIvِdnTn Yer..ZzA;X> stream xcd`ab`ddM-K-Mf!9k7s7K|w7>g<3 00 C3ؐȐ!/3Eu~deY߭.D tg~Xp1p!Na)a))AEilo{u셳|,U nnf귗oƤ4.w]1qń^4{+9Ȱ~)l}+'V̬8qs.?62aԹSg̘<{=w9~wm?ݺmASk&Tuug6ės'1 \< ;~ endstream endobj 2900 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 325 >> stream xcd`ab`ddM-K-Mf!9k7s7K|w7>, 00F3ؘј$t{xlﱽW<}?eoKeoT5GS,twNZzIy̞5{ gw6}iegs,n^ֱ|{ݿTKVnX^>?oiȅ #wsdd?ڴqۧ>}pքa M~3q'1 < d endstream endobj 2909 0 obj << /Length 1603 /Filter /FlateDecode >> stream xXF~O޾C\ҔD|p8l޵ VU՜]<~3;0x`[$b @@( 0.C?_i2(tX0 lrx?$8ǽۗ_Go? + ÂB@ BFpE!!Z:,ysE8P@q SNB5IN-R:Gv$"_I$a;\X0 9/N 2X/EG ًobmH6+AG`ouAMX̨#"I'{ɷI` ,#gkB8R/?!B⽣nϵT[K|ɦ1֨13?,+KnTD>z:_W:Q|$ѣ|h܂_﮺" PǺFe?DؘuHleV-kvvb&QjnS_{."O=KpdzS1GCdyu>߇ɝ nsmY*J_֫Q'E:/l,=ЪK+( #;$vdxe!UC]ͳ4Igw Zd~c~^:kr@`E3b]e4YEE: j_!@.>YA) -)Dp^<87<\s'hۜOs<]]Qʫv.U^̘9Rz7ṿmWI"jM Z[K@G3Fٕ)(YNa X"hD X#.nq #$k{5x E1ur*>ZGc(0-T@{RST;vSz [a>p!* *N->eُz渘e7~h)feY -f%Ia> stream x+2T0B˥kiP3 endstream endobj 2903 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/onoldmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2914 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2915 0 R >>>> /Length 816 /Filter /FlateDecode >> stream x= {+x3YB4I!$8˙b϶{um^67חt}eo9.ȭ_ώ 1y/·cL%*qIxbBz;e^@l#3B۱rrX 2G7=+.)9 %KJZɥd)=țIﴧ˗?V@ vY|uJxH FHЮb&)4]lBJO ~Fgvt߃Ď-p : {ݯʯTt-Z V`ACAcCThazw,DVM^Euܤ|K5&102|-Z֜cH:6"1! A'BH Cb@rQ"?r~R G3~E/&2,@?e)a%D!ӡ0$󮈨0Sd@nh0lr[K `h,.929(*S$HTpry 'l7+3HƊi  1sfU0ڰPSV5٠;*׃TԮ2WcRO#1z(z&zdϴcT|G܉M=&UeaIUZFlRU=ZFlRU=Yfڤ[,ӗQ-eM*m5!I ٚLMNKyeTږ-XFlRikQAV1} ۤM/v endstream endobj 2906 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2916 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP: endstream endobj 2905 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/onnewmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2917 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2918 0 R >>>> /Length 1836 /Filter /FlateDecode >> stream xuY;6 g},ɳI"MTcR$H}mZA}yO~U+n_BF~ւX_9ٲAԓz99s*vʧ[H=|$WrmFH8p\#!®Te Ǡ~^{8JyЀn/jm%,>e 1#7]:Vw[L'~Sڡ:ӓm/zcm ~ j|F;i/2j?}(.-u'] ,mL,ffJן~|ISH)*B%Q!vؾ-3ݿ h'J@Q]O1VtD4-hjT4~ZsGksx67"6xDU R!tnC`_M 7X.E%*!MJ!yuQ(Cq|Ke7tn2Y߯7wC{E;kR*a3d%&+NcLiw׶6i[;hZ#'6!enjmMZ JʋZu#hã Ds?&~F!_Q/ Efy^EPt̄ssaU8LwtXK|A8 S M+XJОծ3uxǚwpLTiڷb!֗ٷG!r dm 5 䐑V|yalЍm/ߍy+,h,/7ESX7wW=wW =z& -dAjb43`^ŴYwYQ5Lg_+zݕ0;8:#`T,d@lUIЂO C."Mt4 H@:xHv, `RPWVԀȚgD4;ܺFF7Ȇ(dj/3E\|  ]Ϻh!E)lmLKũF İoiNO _?5/HOQ9#$|!ʸ&uvwMIuEH.ZDR2D]y\HJ} 5)Pr^[#὾q<>_&LsaS2{@Hl6|QcNa!2O*aU^w>،_'& <\&>DȥC<bI79^+~`G]mswfƬoe?̔uִR1:bo|Y(ИAչֈ*R_ߐGxX&] "cKIukHJ+KIlr5s-d4?( ƯcU!<~xRu,> stream xZK6W(UY0$L[Y'Lv HLQgv Ri& _?'tÓ~I~ Kķ .\OkJҌ CH9$C04g$c4&C1T ;Җݭ`%&''/jXwmchl]|D(ǂ.$QP A+몁QgRHDiggi:"":d.ylyh= sa]œ٣0o.FdTv> z\{3uVH@BBvS^f 2r/c.SA!\1C C **8DmBΰA R'D`h=@y;U\7\B{|2rb1'<!:k׏?9'H~[;MF 1J,Q}" B!ͤidVDx)sENz0B Ku6uFDDIS3S4bZǍ2KR4dnjRIgeP<Иa/l12 . 9Vx<8c/|*~-{0ѼM1D  Dy~gx ,=^b &EENCzEVf Co( \XB[շzLXXbQFSF:nU&OؽC|'l!1g{m*[!TR]/(i?·8t_QGݘώU ,$z삞 @ZAነ$s#.NAaƷﶭ.X GMxo'JxfHxfun"n(->&Ȧpk|P3г<`Cg݃Rp+B|oܬ%6F!X]so.]jlݮj<1=CߣAw\mf`686V -\;4]&?rCc`ηCumj#F}p;(VZ1VYʁ_ܱys8ac(`[,lZ\=u7bk:UճN>u5#]Kn a3 a&Y0'EaQ^I8vQ!Cg!k\q^s*-_;=uY}7n<nUlp>:.Z>6"Nؓ3<@zSm>mr3e2Ơ? Z{. ؁Vԋ faZϨ2<>|ɱ, RXţb/nV<+ hP1HwKwrX=D."޺#cp"%Cވ̒\2"DRLLvBo0H_RM4!mgtDZOK!= ;߫hڠqΦ;.*D4H{] S) 0b!t/B6[HZ?ΰ- T?j$g3 :8AJ-PSb>fKgN.Rjw##ȳ-_ty2d0\X~SO]DGv!R8B.Xᨯ4tVPqS 掐> ki[j qGQ3qw]8}WYzwÕ뻛mޚV%f]nDk{u endstream endobj 2805 0 obj << /Type /ObjStm /N 100 /First 985 /Length 2544 /Filter /FlateDecode >> stream xڽZiO#;_oez S:TC?: TO(>ھK`DDa*LxNғȜē .T,@fR(%AY &0DY&I";P3i' ό#.0i1,ZB^i#:ABM+DatenZx`FP@AY,( H ݢ9 2= H@-@xm4 64MB`!Jl!s #l hdQuA0nj ,fa*P[DIbXj2++i $3+u@yҞ34KTĞ4 @F4m75,s@Oc҇KB`.&!Cd^@*8F@5vc9DYlLGHk y >X^3J‡ƈ:8QQa>CF!Q4kr`ɢ"-GX[ZC*΢34/T|1&,t"䠬}wlwЯva,AI-|߾mnEfݻ/v7<yMjL'~EO;vC^\]4lM/*ncvs͜Z~U{gd'L.4**,XrpVâW_l]!{߿*'7 &h̭~PaRnP^=gQsqJS]H9#/UVJnlop>`Y\ݗ9wܼ!dk>C:\' 7ű.tY7+-|_ʈ899fni!rxw0qq`31Ij؅#יzJImD"[ӸjƭHLzF`~D78 4Cִ#N5wE~&hpg-U&BTMGYv8W5DNW8qP!L⺑3K)vLˢ< mZ{(1x-_?Ӿ'bXB11½&%M\lk, z&[˯˯^[kſd#Gtb]ԱTڗl5Sԯ#浔9 MP a*׃pW냂,KJT,7%&> YcJgWr 5Fɜl25sO\jܰ}H8#RP5\K_suK_+f.R#L>Jb8&vBun?カ%y Huѻ"{*-4EJpas4/sn +@)*ZmpXP3a'!>("dH/:npOh.H̊2qÏ 5 +:bщp+0:ǩU NQixhY 4\h+q, UBhGU{qȐ?'KMnɛ7QF-\xZHj`0U! ״kk,cVVHQ2Om>(vϷ;s=BC)LE9bdqCRsqY]S w=-ۉ4"D =:A tj< CWCek<¥hB :j,Cjyx~y"\ 3z!+";:>id dl+Վ5D"( n1\bCeW=v~sq}<1LSNs|dz)=( Og s09.VVN͘*F0"im, Ck֦`hdfa;o+[?V]ԡ%~1v0NX]- vrHAeQuZkS%%^N!+f85Ʀ gdd"0*I<}a!)rʸv7*&֣ZaS(oۯ G--2z6BH6hb¼S%O[Sx,㠪 /J1x\uU8K蔕B:m6Z,`Y~Kϫ7BnјDk9R$#g_ hِ .̠Mcp\ Md^'VpmtKKW諮pQZph[}|{2J6Y.)#L5,j6Q=QLF**%_R Iz81­9VFģ9 endstream endobj 2929 0 obj << /Length 2421 /Filter /FlateDecode >> stream xYo_GX3DPt{IE{kz}PlElwCʒÍ?|Hdz,,Z̖Y*fifl+⩚{#NZKOI"MDtÇW4vWE_.fo{GC &z".Bq(:ǒҀNKh" lI y rUSU0D^rC? sU.|_H l +U~;6!%$&6|ƾqzpArCW~7'5U6QoBȵ#oXMEy6 Q.1GEsC9 f  A =܅4}J_͝w346P[j" &)@@uZ9}PM3%X޵l@@c]B:W e. : I{1"sjK /jL#K0p6&zhtEUN7'P5%N@v.Pm'b@k-= $%\C#X_> f ~ r2*Z5 LVذD=\hf+-MفƎ⿢s\+4SƲ# 7=(@&ۃJ転unoꋿq ʹ3+FZ XnG5$chsĦM߼z@AبVFZ g"a=A OG+۾\٘Ji<1d* T0;dr'EU:eiڽ7AEUӹփCG3 I*02_I㛐PJ$N@8˄ʹXO&yn`&O|Yd6=Æ+UǓ:#=Fs2ۆoN.Ū+ b]LD}7ඥKԝ{T 0rͭGڧ5eHj!Ҝ9<{@jk;k|hz'N@%C1%DVԅIds(V7csi4O.w{-O8N°p_V7Hpgik㖐jہxwCP{( JuWRu۪)޺ ǃBr>IdpQKD`{_?Juo+?YSlWP[–%}U;y:$y> stream x+2T0B˥kiPA endstream endobj 2919 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/fastInterpolat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2936 0 R /BBox [0 0 376 273] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2937 0 R >>/XObject << /R8 2938 0 R >>>> /Length 59 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`lnR027Qz@`h`aQg~ endstream endobj 2938 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 376 /Height 273 /BitsPerComponent 8 /Filter /DCTDecode /Length 25342 >> stream AdobedC       C  x }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ( (S^-tKz^2W"^iYQ7;"ygQ@Hn#_";[]W \>[xVox7]'۱4iC_ OUǏ ~V9t_NԴ~m:auOqWR'Gm|N&B}y-UGU //1>=/W¢^-xP6oo:|kQU>!h:`{C}j+8cWGtGIuWh( ( ( ( ( ( ( ( ( ( o|Z. HoL)K-*E>p ʪʞcopK|35|J%?- YcӴv[t!]rt-{Ex?=#T` 6PaD24ͪXEl2KOmc}YI@=sGմizn6چo՝47Ibu%]YYYx |g?m 'th wM6 Fʲs+.뻮ḣN7|-66> >z\VX4d7{GWgiR]S? };! RYiwZd+n﹟2"S|;%3RYꖺd+p﹓2Hߴm;r/#-1zf/^߿.]bywLg?Ku߇~6|U[\5(5""DB̻:6޸e ( ( ( ( ( ( ( (9Ox.SOz _[{!yeD9Ey!|mu_|. p m[;ߤBwLn' Sc-;Þh<4;K,,,J򻻻35uP@;i?VT^kķzLw}nU;!> (<ƿ>|EmA?XsXƺl}GG;ѕj?B)Əu$kZ+~~ӿio 1}?>GiwkAnnus{ vEۣy,gfG>{sZXԮ6!M?gFHo6 %x7Q?2i;K<'A2Ftu߹(TP@P@P@P@P@P@P@x-ZZk~{7~&Z~UWvCeUIneO1෸Xav%xŬiNZ-:[LbyUas: Rݖ= (8Ox/Ln1][Dַ{OGwkqtgUeGmtt,ƚ< (&k Ex-Z(ݚTwV_.m?(h ( (W]d7kvD|83xNTz[,fB/oDxuaxN52(pq>쯨y+|_4?xL[?o>veww-r^T6RZ2yDP4.fi~ sCm ;;ho!uޒJ2A@P@P@P@P@P@P)_%ߊ|i=/@ݙAuwY[ouD/4<$7_/a.QA+w?u-{To6#j u]OӮjxztO4S;oT!L;3Y /qxct-;~nvo ;E,RJʊ:::-uP@P@P@P@P@x-ZZk~{7~&Z~UWvCeUIneO1෸Xav%xŬiNZ-:[LbyUas: Rݖ= ( (  v0~CN>i<mdmyn#13*Kk1Yw`h (<<Zu|@n, s "LЧ{۴}墵GeʙHx 7+xx/ᦣskͰ$RO۽Hr@=GҴznvv1,0‹"5QUUUxt ?d53j?Y5jIgeH;.E%_^ַ|GmgZ#x‰"CQfݕ""RtDdD1}:?I 7H])auWhWXeExUі:( ( ( ( ~6W ~ 'ڎ;G^2\}%eHk#ɸ[YJWM>IwxlZ)/Rk {BwO+@-nR7Luwpٖ&r7;;(k5[q@@@-⟆^>%|1Ҵo2|{_DƌR -}Ŗ'|]/ǚTڍ7vWW ehz"^imrΡº:;E,R,O,R+wP@P@P@P@~JBEJ$ ^5> B( d\OdnY 3;uu ^~~ 3kthwƟzȋ?] S}R_|E?DUx~}>dh w-:> aa:?};uF)RV'TGY~][6{Wm;zt+X]ֵ}B;'ivM?}reYhVA懨jwVw3,B%ԕteeeeր7( (]X*m)|d 7zUP@P@P@P@z>Kt=NЬ-㵳a]Qڈr^8OԿ|b݁n=ocٺ)vywj~1дvMd2BK SE*R*+ꮌ@گ8k>ZΥ;j4.wvv>-;PKu$1jV"^{Fe*%xˡ.t;Scco?n/s|li-2!F}wήK—^>v[ xTҾ','X𷏼'*JZ/˽fV`J3:tK߀%gn;YZo$ḇzm*Z>W'nӵk_ֳ>$Z,mk,й{qnVIڼ)Vk# +K75 o@d3˩Mc^Uh? m-5O|Bƿ-K^4xcJ[c3<2\,Ql( (>u> x{j7>Y?MewzM{{VP͵HE* (|scҵUe} `<.!ܿhʈMn]wlѡ jR7Ǻ ~$A_.g~ڍg7o :#S#J<h ( ( (<K|rwYS75{kSq)iU (@/ :McJ.mZC Ωt&U/"o'j3|mxW%յޝH+D]bAmYԊYR)W'1EKw ( (>X!Ꮙzc|%_0 _Y]E"~we7vfaPǫ?މ=K·ߌlaYt漳uK0"UQ%giHTvPeh_<1|'O<-+NI.#]:"Wpawv^G@P@P@<~;ߓQl>aloKb+,fIl}=P@?|JNotsNtK"Q.m8WtdthYb%Ybp;l~|K&M'Ċy7g9b=Kw(@P@P@P@%5#LѮ!Xl&E۸;>>Dߘy@p5V*:k++9/4GDvWP]ёѢ)eT)e.Vv5WĈ[7&.m.]lاݵ@:( ( (mQj[_}>yg够ڷ:P>*hcj,6!wi~x~xPԴ{֖T[ ϽSI2:2if3# ɿ!SǚӃoh7o-uqpý슀<~h#!nXim֚{Ē}g٦v1|L 5P@P~_P-?}@P@1B|9+7a\H KM4N:2+P oko>׫]_Hb2"32*ZQ#Nꈗ@@P@P@P@KCzvf,8P>٭e]]\zP@WSwtCZķ"=4S,VH3pK@j2~ZVŢ]i{w1%S2A,K#b7h ( o x=0 5 Yai` &coeooHYB {t򪾡?ɹscj>tQ$xdXdexUIb'W]C{Qeg"[y"KYuD,vBapdیr?e<eό4+ZEťΓ K,_f4>UuGPX+{|t2K–lz_tlr˅YY帕a'__)i_^1ҼKᛝ&uv%O ʓ!heT7|ʴTP@7Y~4tOU~H^{{(Z_i$ MP@x^։woxsK7xPiݜW;]*>Tq h_VU~wx Pþ+fydZ^3kz7@P@P@~%:#Վ3Ca$t5޵7/+]^%ete@@P@zjhWv֚"_=6mi{)|^w:5zMaäjךzmk7pEi>xai("5"2>P_47\mCBe]w:z~uL43ă{;o?HGu^Q-nt$/mҴSJ??5o+OrZ2>%A--34_%eߒ %?I( @yǟB7}݀} @P@i:VjzZZi,ttb0A^8|MS_mk^&jkEk0 U{65ķ,@C@P@P@ u/oh,Jf3Zj?>%b,g9|e4TP@NwUMgh4 ݞѥ|2ޏ6^׼S`hO HGæ\U.?gm<(m2nyeG$" > x?!?]oPo+:gp/̎UYAϯg/+G[c㟃C৏5N0nb[={=x~F C'=ۭ5M:/7Ϸ%DVϳLbR;j(o> 7^|K{-փq?L7,_}wlnT( ( i+*? h]'y4N&l?l;2KnHhV4}[KmhWY̳Cy 'RUѕZܠ ( (%]v0i:O-,v}c8@K0d U@>Fcǿv6/ ZB֋ VRy}Ҫ].egWu0П~|c𥧍~xJ/nvFoto%$ʙ>3*LRD*J'eQ_P@P@'#]<1oJ '[%վY|RʬцGe=-_+RԼmǶ3csq-4_\x^]gͰIcF>l6 \l7\>> No݆ۤ@$.K4R,2N@mP@P@rw>)ѭ!V,Q&c*9Q]ߴ>gO_5?+-_EG5[{K(nٵ7"0#ѧUw@ KDwWSڏVP>2YQ.?C֩ocf>5~|t[,? ³𕖖&U]u6y^FϿܛw˦j_mtO<bo"A?n(֭2&eDP@P@P@m i; 4<:^)}Wɽdvۧt@P@xƚWo i O֮ :T%3|-4J@f}e]wI4ZuB^2)e&-W{dμ5D׾2:-+jQ{phK.yfviQ6D-z_V/'tƞ hkf{+y_|[n7"-5 P@P@|]_[_CxrVz4V5ڽ2jnȢcIҵ+S:PЯOf]ૣea y_V~ۤ݅r#$.,S#+4RK:N@j jwk:olnM[խkXJH"B⨼; |-~>3hQkojZGn+;t&{F{D˻g*4P@xzOOk '-Ztwwh"eInRXQݠ2ͤ𵦯}l KqIQcGWڻy0]DOG`J ( ~_)_>KTnaaFl\WLHuǚo yKnPcoOwďK_l`ͩK7Xbˆ/6?]?6tîao! ms\CO%膟)Ks  ?Sk@:?.u-D4M][i›\??6tîao! ms?ho%|$j%׆*[%yv#/n%IK >-]ǝs>&i%叝0Ũ%w-hkKKy]R't.D)qge׏ m:{?})fo|W6eΕj |EZv~5Pcw7]vЃ;/?k_ڗM',s;[OuQd+ڢM7 (/ ϥOw/^kAx"[=>%XYYpUgP?Qدzݏ4:Lz~ڠUg;N7m3(~m|M|\[i:',on6#H"Vfڈp>@{i3&ZcXxTFT+ IJHhĮe@mp{?n${ˈ56Y"2P$H`}uQX=UңYvwIDReHWE(<'^'_ w1aD]kz[KMDOw劀>B<x/~v hNkh> xaߴLo y; ~[? >$x_ïPM𿉬!m@ͱhҨ>.O o#k_j2ij[}ZG8CEZ, 1og\hiwGq 9bsxxlCI^g?N~*{? kM[6\$Im)T+%n%wSq}eԹ~^}~!p.],$tmV~x-G~"h o4;QB,PČ"zg”<K-sr[N֗6zuO_ʹHIXr||y'+d|ȇtR[[Z) .x..Vh((\?2x޳x~nW2ʌ7MxUhMP@P@|.t}g˟/y J͗kPift͵=x/Ox+_m.!bJkwnؖ7y%Bv);( (8O^6~ ;E޵y $4,J_by#`Vᗄ<5KK,/y wZ*IfWb*"E}jc [4VFg32iewv& (K/ |U[\-Z45"#*ʱ̬;fg ~Ⱦ>vְ\-¿Ч qeͰ[nUM~u~_M/e7Q|@ҵIo,gY4 ol8gm3(e?d~"~? UYK]+_,/L7֑O#:\E?el?G~&>AKσܭhͺ]1X>I]~ͿX'DFs<ި>(0}+KzmaX[kgac ((QUUUWJo'ٵ]?I6xNE-7, ,l_-a>=c߄_Nx3G񍥼6_e\:[S56G"sn\NUu_?.#ȸ359&/Ěٿ7/%|04R~ ;g^*iuz e7ʷ].vE8ӄmLqx[b4弴]-DAKS~35;[vuɽki(Se1>[Qw4*cG›iZ}|'O1xWusZ⛻ C]I]? ,++niP}j;][iRt{Ff;绻uUO3<˷/,Pu@P'7Q0vГ^";)|[> ( (%u}KS>|5"lSmFR{4X]%XgT|JĚ uω66qyG3Apq^4Il /!qEo3*P@P@:~ݭ|-a)ƝYW?Wo ݾ59۲ك_~ |amC·V/;~ԙŬUEVm,W76mR+hLJiDijpZRDK:e;'Ef\A22Ż),.u@P|dᗋM{;7u"Zeړ^m 6UngE |-*j:gK,-?VIbұ$Q3lڗ1O$#4>xWv=7ZA W :@ I$f}ucqevy?kz,~ȿwk?kEsq[FvtE䧝{jO**av3h߱#Fe^DӠӭ8]VSDaowZy4@HoڣDק45|yrTt~[S>Z ?kٷZOs-s#i++yS-}{/o iQxڕ"2|/s26\YW#Z<ʭ)5V2x> {=k3Z_鷀3aGWUut*ꌌQXUno#H+Dnj~x.oE!/Fڭg&KWM^P7,h+/ D9.mt+;km!Usv4/ώ^GO{gu&y3n _(P@xzg;wV'R}>;[liC3/9y|mWm@P@P@?|JNotsNtK"Q.m8WtdthYb%Ybp?gzw>*[^iw3%V;=Ji\-hֺ$+i4WKu@@P@|?"fVu[yAh$Ckj:u`>W ?gӮQ\[ًVv sD=UP@;Uϊ>"|S%xUo;G_fMZDUUuw|>>/s} `VVv+yK=۔m5)ExtP@1|V?fS_|R?_[+hO.(4Sʊ]>D~D7V_|'[Co]bk};~ {{T,V$6." d$ɳ7[|]Tf.[ٯRk?U&ѴmVSKkvOؾlWwJeW}R 2~܉^Ea&֧/w7ҿ ^Z_;:j tSZR&YbI|Fu߷#1Wn_ot'G\оM_ e/e[nPya+٥tc7*+yd[9e/ ߇uqȚ}nn;&|e {0|i;Mb m2*騏ud̢[d(e}I[~\^|@֧\5Pm-ZѥYfamqYV{!VA懨jwVw3,B%ԕteeeeր7( t+x#Y!i."k"GK1FYѭٱZ ]] $t{ot:{%5#}YӼg? 4mw' 7 iMJ : f(̱,2(m|M|\[i:',on6#H"Vfڈp>@ӎsPςV_'O:?ke?5;tiU%6sl%%Ë[Sف߈}# x+ToBxMS*jI̻egUvlhd+Wrջ^ >1߄ ~ٖ˨:e<3CRc{XNq+-O{YCP4jO 7?_}o<~0Ӭku71?+žtNB߽<Oω<xn^[Z|^X=2 /Vմς>w0mS}?TgL3/Ewy DFdW`@=oGҴznvv1,0‹"5QUUUxt (ǤjL!6<7,4(]cF[yKf[blo۫? (h /M4=FPЯ㺳f],N+++/@zxJsP; y.5 ,EJB")fv8y'j_xK|UeN^ж˩ۈ["4G航@kZ]+PtMm N)Y KmqqK %,C83kg +m޵nn4!ػkS~R_43Q5kusH݌0=f/6oTҦ+5zw?YQ~.е] Mk_gU͍ŔYao[KIYYv00*x<)-> Gmi VҬ/u Iu7[h4X[XE{6YTzSo_HG>v7:&"幉Һmn+Bo^j, | ;~-tĿ?,ۭxFDin&2p彉78s|lGqK |{w%+Wĸ&e噓j$)LCm+Vk[uy_Ng .WrK37闚_>%k⛝&Jm, M> cl( ( ]] /􈥆Xe|SE*)vaX0|1vĻ/ψroK[[;|H'cp&xOyZ/ķr{M|x{/S  x#Fmi."kwӏK0YYѭf߽y* (|V?UHӾ#ڡ;gӵ$DKq-7O\J|9e/ ߇uqȚ}nn;&|e {0O^$0UW߄n<)DNH75 Q*53[\[5IگvW@mxvL|-ӕ~ݦh>ul=*LtSKn5adj G 1>2XDoHO\RfotŮ.4'co״  t{4sij\7rl3iaCbѵ'@w?⇃?^ j\i`w|]YUwtP@P@|xFn-l~$xzuoYK|؞MEW+mw^KO\,O5;@7M''<=MS:"]i)=+0 -Iat?v;( ( (Kcj>tQ$xdXdexUIb'W]?# |hS%ľyZK/,1|5Y[.W徹>g>6VO͎ ;7γ&}۳i"m>lDP@P ?߆5[hOuI[n"ޮ\*1M0~xV֖4YMahv+EJ~ͼerZ|SKxwM iƫuou^_fNGF v& l ( =cIҵ+S:PЯOf]ૣea y'=WUѮO*_Wi&gu :l-4.W_f-nd0āٶW]d7kvD|83xNTz[,fB~Wnj?e@ s7_?Xx~៏^b;OW/m.LaB3VVD@ Nu/*g$?j^~_hjFIwoPOHj_# 3g║F#\Zdž.,fu[NgQ巅v&%/1>=/W¢^-xP6oo"([ljÿ6-łE)<Һ"**hko[_Z_`xK׾ P|_i_XSAkE֒&ܯ-,n%Tf[{׸ ( ( (>u_w ᯅWu;SR]oo3~G0gDm O L4|U𨗛&^>eedDڏIO> Y?} .៵w~m~&)+??ej1.B<1qc3jv<$-.˷|Q1(_-j6^?5]{߉ޖ"i]YݕW4/? tOX\lFE͵}cڀ0>(o7㍁)9 ( ( =_VҼ?jz湨ZW py%w!Q;ހ>E~ |֠ ( ( ( ( '{*wK-xOr荳r!P +n|iY[h1(Kx[mR%ܪH`>lgعGd:ěK!Xp{w}fj=$ <7gX$~ןA;?]7~,R"P<q| XŌμ;Kq<.DĢH?iPxKWu~'ll#z[SytDUgvU\?h?7t x'o|BY-t߅^?Rt--5Aݕ;kǖYZ$E |~n.Zdž,n<:t{YIWNt, |Q):Sºkwc׺Ŭ}Ǜie<,. Zx[~ ٗ6FggpĪ;>w3/:=+6yjc\jt*]Y]' &m}@P@P%~еZMT.LQE +'{*wK-xOr荳r!PG߲/&]As,6j0ޏk>E(xTfiKOƭC]fo_F%{cD̷{& p (ž9>m+FѴFT|>?i ͞m{(|،nkguxY}[߈jf%ݑͅtVٹ!iR[bGu(=j ( ( ( ( ( ( ( ( i_KKAqVyxuX~vkXnUKha" (%񟌵xX| {[߈tx%ݝGVٹ&XmՒ[btF(nm4< EUu[obmg {xw7%mö;\\JTP@P@P@P@P@P@P@P@P@m'TԼ]oP7 g5ދ+k&+"b%?ݯOiN 1mLW,YWTӼD'ռv gzIUwlKkr}Ȓ;]@cr|wl<}ck=6Iy.obJ poU{@MxFj]OniŚt #K&L2:]^͹o}K-xc-;Þh<4;K,,,J򻻻35uP@P@P@P@P@P@P@P@P@P@POaA>?m[+_xv+D`֬ͽ,Aʪ3x<)k'QxFhvwnn/;ǝ.-eO/S >Kt=NЬ-㵳a]QڈnP@P@P@P@P@P@P@P@P@P@P@P@P@P@ endstream endobj 2949 0 obj << /Length 1548 /Filter /FlateDecode >> stream xX[o6~ϯ$ëDú$֮ZclɎP[ruqËdQkC"!u>bg`gӳkC A FQ8yH">|^֣}h޼^\j:~|y 0,ɾ!.0"B# :ַ(QvO%bܺS8蹲Zu7Ec]} ϳJ,|+͎BO<2UjnWDu'Ilgs;#]f,i_VMu吗 C(X+C.˗/כUj;)Uk(E aa&ArNHu\ yy% %>u 0vOM\Oyzbp2<߻{I:[|Bn{="P|2.9`·GK"dCd71Y)_D$lmZ]q)՛12"Ǻ{0?ݶPEZmyj^.{2Qp[c<_}m\<@*j,@jP

t8fQ{M=Nk.ASh(<`L,G60tvOX^2?y̡hP([C)䈷tGU.eTO2} .{{018MK_CIiR*Vd{"}aL793o™՛Y*^VnUN&/}Q۩M#DŽ3ko>(? E8v_( i(BA endstream endobj 2942 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 595.999 420.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2955 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiPH endstream endobj 2941 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/us-ug.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2956 0 R /BBox [0 0 596 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2957 0 R >>>> /Length 48041 /Filter /FlateDecode >> stream x9Qd%{r CNѨO/͊dzϸ珽=@ |??_q3|}]m|gae߯'a~bG3 :~~j?͟my>ۄ鳯e_?=\<+\|\cT4F gFF-gq&YqK%mSp.O |-:gmޣV_ևG2cfxG߮>pQCy93w 5yBy7 yW]޸8y2`ŧu*͸#j;>F}L];r\ b.1zzH <v˰|p1 7}gn,@Y˸)3u>S9Ù(tm so޴b;_tft9q = xP6n{e>'zzb[>Lfz3*ZrE_+KMȿ^WW!˄{LkdM6}06\oýÞ *xg4g?3MleU,¹D\N`kvB1G}@[)."(@BM|67 6mb_ ߯@޿gk&(K4ô9mfB\D34Mk`=_R)7ؓyy㵸[Φ%Α]/mcnx/J+){PhIui%d[z(Qy%>D v\lOmȾޯ{J,3޾reN %ȘF*_aY ޕu'&R,eX]`YM_ZX =0}i/.BU9]{6U `v@cH `kz}łe4bLP/1Y4\['n\DH#FZ,f U5׮M%(QIYif2hm#m"uRx=LÕAw9jq #rCZ|cXRrbZ]'z߇\/{/S>ZA֡OaiCak['kv[(%:VBWK轖:fOq;iޯq b>_,PMӲ\*z \Ƌd˓YGlQ9􊪨/]RH^}1 lX!]hët_Ƚפ8Zl] oZse*R(Zə@\#rAլ/=1nKZ}2Ile20> Pf;/Bol3oZ40$Y,N̟XSYir]:\}^JHa}7]Th̓ieGP=j-zXWlj."Tf ˱&}gS]@Td/Bŝݜl&=^|[x-O{mIzx?t/?J, jo~vJ:aZr۵ʚCm#D,zv/zUu͗(=ui+# 곮bLl,as~@+p6J|8d9[9g ha ^as{&J\zтM~29ӼAG).ۖޖaʄrh] }SJg rzeQǣ6P/zpدF{%>{E^=(CA7H͉~8ČsnA۟ ]TVqr4K2(j[XT{jbF$4e~pEd X ,96kcwb**ꆺwzv0ːwa^N$6Owk^-Tx,b,Q,1ʁfG!@}5uh9wUHzLYȷp9M@@l*P/0.EǷ Pq('lnO#D}?ŦJ.Ph 1eZ+/.aVJyLŲy2/ \XT)D+. []>{g*^P+l~/0IgeW`J2'ua/i9{{o)[[WXI|oEIC"6R@%RXׯ󔶡JV6\uj@a/@Z3/Y0~vHW4)Q}5u"]Zg;E8}A~GuZ:}lU@M8ёZ){%ԛ"^lȯlTY%VXE'\Y4_i6|A崊:/Ä7ӷyن@6˶hRV#L5vA3^cӏK.RXyT̈y=P* |؆ Ǵ |Zqd&̙(.3JS7neՠGe j K=Uf>?2nބ'8" xm\eJ *9ey?dԵ86ڵ;abm]T? ZE^Nh3Wҥ8eyY\h;xڭnB=HEgۏ% Xhw>:/}@iʼvn728"luW”9Mh#z(Y+{e;=@:Cޱ u(Yo-ܒ7֙7na":N6nŒ"nZA^t٦.irݚb۸.`%G̢"|/`GSpǽ1"1{N![e]Fgi /iF2[g5W|\)R@x?,W4ݶsX6 ,JZTq=}6ڥnt@W~GZ9JNtnspWܾ;=MӺCw:AY[S6OmJ!"ܓ>t:xesjUo *3VhgznJ2D}6*xe&$mȍBTKZjɑL'eٿ6`7(~_|8d';A$UN dVLU^m=zehn/ ٯC7_9w]>=N:.tLRoRd/ ]qܒ9HWm˱g/@1PL)=)g~<%>N{ U<XҢDY8-P/K{1/԰1MKӃ/htP/ƛUIXH?LmiD)]^?S|/0Zsi`֘.Y 쩋c H| '(LuA:q f 幻Ie,n!Ce^o+&^WsEèkGj/ދ6᧶lJWFa0L\}l@m1E4hkr^? ^d/ʢ$^^ >Mc})uկQz Μ˝O,Ju(jk;|Z%Pz*TVT=Spqau0.¢5=:CՠyiwV,-_ل0w]2 =G/?hoCF]\P_88`;TU"'[ RK~ivA?fE7T0WU~dT)W)Xs,bl8KSNMfIt4kubzľSŲh_Jh%Qz*o+;0 @(> ݙCU*VFe6-dXX ݖ\8N0/Ԡ/l4G .lup2*옂!uAZQᝐ4 ;8oFrI&T^Q`l+Ӷs(Ԝ5Ay5npk JoSTnev9DžZ0젲DTA5.84ⱺyQF<^ 葺=uk֑~; e˶.Ē+z@_e5,A'|&w"gN]m1Gzonڤ*ƬƟn`űn0 ԟ|Y sX]Ot]L[sw.YsQVP;o_Fm}i jBv,1CM>vArw 3Ȼбb&+U$=\.|s]_gN*27&Sg?*⣻ p7"h<ႋAeFYWu:D `C33;L\]$ %5tV6U)[Oc1MݲIiVZ:vT:6)7V rU{ > œQiyMHi4;`𕀻([j'1+o*<hλ.sjjګG~( QZH_4sK:<.;Rcjmπqw"~W :o2aۛ@pNn<3Qٝ;x}òʩ7_]omDj 2, |p_QvmHM%N)S)>i^BS[3VZ|IpUj]2GB\8.]lcվKٱ>C<_. eiz,i-m&= CgJ2q8k08œ^CM]⛶HM Ϛ&5VڦI~F24+ ]3 ${/gTV0iR%} qJN2/{"rHV7LM9I%ͱd- GML Tl:yTMw^=M» ~.u ciQVY 3VЫ5QB*k\AY޳=͏> $.zk|w.VW>BLj:'h[s#b\3cI)ow*)]T̉^IY+<#$Mn>T.>j f: TzDW˂ξ Z\[AKL(Pf0R wTZcAnryAlsr>ړ5}kIōLu\W(=ӆʓ]PYa*ݩ毻kً9xS/ TJ>W;j<7gt)pxt41cbCUB)F'N^0BZwI sEGqXl>T*^I31W|"6PD,-4RWKPk? PCepg&NUljЋv (}?M/G'P $V&ʫ/lR-yRUJjP-T6縑DMna<^g7qf@Q{NRDzx끲_J \e띊3&]F ibW ]*^}}B6u Xch0 |\+d\ּAim#K&s٠-r/AԆ5lCwY3N>>OT-$ 4$ϔ2y_<+Kzuuᶔ6I\**a& sc=+ :9kI.(+ʱ/4k e{0nFuA^Cs@e=^^lMɍS^qy:%׃Xdі2KiL@j!nZ0q7=PWDQ{ yL^ I~ hPݸ(L5J8'6K1$^6,U1 TAv3U̓(ZPv<#ҕYRrj"_O{Z^IAu|ymE(WGݳV@}N'Ҟfko~40;4rEL[WqNkucPf|&ur?KMb USLUt}HLA}9VՕuj'kK ϵ5vPVؿ ,Nk(|% Xćx&s|s7Jn 5Tx]1~n9gC]?Y?́r[:|JP.q.ֻ":w>s a g0qTxD_N=oΡi9s܏9Cs kb94g$֗܏{:/R]9FxN60R?L,^ʋ kKM~y fekh 8<[tvbP޸#P27W ũ˴zQ.%:sk)K1>ss3B,kp@yFz1\hx_XU~wQ%,ћ`Ð'|зx).xL+/E P^P HU>Ȳ\Nd-qiEUuyD:~c\(>!_V F l MURrT}K`eR" 4Jp)M*dGdRhhP2:klD,{Q3-64R ]Tª~LC+o:)1QB[3 B]T+KFW % ?~Pop'B4R=k}A,JQ 1J\@!rM ` iԬ:wQBbX۪E# ePpS +x).`+ R ]Tª_[7?.qL&/ P0hL x.Y&|X9>-!|QZpIb@"tQ+P0(<Y _Vx$S0rY5$/6yJZ(]Tūr[Pks9~x{P+B?! |g5Aqf_\t%mL?דE/v]P~ӊN@B}Z٫\a4d/U4i -ik9x,k2cҕ!$cID>P.toXjvWC03:a*cdg_vCtx6{|^,:?{52H( o\(eL.ycr %Fv1B[)_+ gԫl&OD 5\  c. ).4 0]P) - (S|Z<,B5㴿 ^@yFĮ,%zBBygxC j@iy@FY>WQ>l& ˀ(@! 4JWMr/PR}Q `8~Եfa *xAXb~$_y!B "ݰ&4 P0WªS(OC&4 PVj XP/R1Pb6܂/|PP# @0ŅKhtfiG5\W׵ⅡdLbz& ]B$P0}TfAU r/ g3gCY).dB GD3-^bbL ",*ʬ J)+Ue^C l/to\ד*(Ϭ%P+u'cu$5; Eּ}&zvkWyK D\tQ?jlx,i 9 NO Xb) d.3ud> ;LMaإ:[(+5ަaWu+p`vN_cS87. TBq2͂&lUJ9 F7 EP) YK-BAGE 5\:?EU(>$ʚ)>u}͞RNH`@Q_(p1\<` "4ŒȂ ť3Ӗ12tYGUDo]Y`rcYgB)ܧA6EU(+rnVKnR\ R XJӐ*>*^Ib6U B56x@(.YPrLt U CEr | tɱ?B&4 P0}T+ILFa b)~UcU(>aʴ !"G`| |UJ6Կ0L/jfOe>ˆU`DU(.ž0 ~![&t?&4 P0Wơ 3'4P-C,P/P0(}`y _NxP vIG(Dp%DUJ}KS,N~ET9:WhKÙgUMy`OyQZM#+t +?Ü'+HF3C3%M 5~r𱤱HuK2R'X#~a[9Cw gd&fa }Sl 7@wM@?{[ݿǦq o\deM(>%:sK(TV3xQVQ)k:Q%/y@biE)UB~@7#NqpExeޤ!eπfO4AӈUZL KDU> s# $L 󢏪xeκX*Xvni ʚ:-FYiČ*yir g3heR\i: KiTT+KL&R()OeMV\;x1J^V`(XngJ7/ ! 93t GUh~Y0Bl3Gcy͞Pʚ:!BwQ%/ P9,P1h ǕS0\|'! ,BQ,1mc B(>Eq͞5-ŎdP0]T* ~ϦCwtP܂0p0MhZ`Q,c˂ [M f FicsEq͞` ,BYt@U,BQ 0/UC◁Y6#.fL EU nW+]L`ߪjp b,̄>e1 ]>(|y _Hx7Y,# "6;cx+ΉH(J]+'2}N(뚾"4C%}}A!'YUP= +j _۾HtP~SkcGާݪ$D#aGzufA F*xeޜ\x l/lJ GJiȌ/ ] ~!b!_ >NQ,1TV0L')7uC2X(}T B9(=K6Bɲ(wt0B *xe޺P *%D.L*MìkUʞNCfT 3)J @qG$]fA *xeqmjaJrፋ!5suRP]g/pQ%,)j`/\.Y>VBEMh@yFռFiez6\Dh.R bJӸ GDgR]6JȀfO)eI@yFռ4FDx@A)BʢNRiq`^Q%,0 P|B6xB(KjP0|TKldݖFnvLKb2PUE fdkPh'reQ,]TK ȇ>X.vUr B R dJ G`Y(_ Cªyi\bd7^)a !/x,iHJ^Y_*Q|B=#u(CPj^Ulg2 bM+%"D`!BáWL>%8ּ,Lk,S9ABH.!V $$&WPxr$P r( R J@ ӡ*ye+2<]4/ }+esc|G͛yc1zz,pM'|+6sBF8 O:}2ڭ[A*02I4DI<@~SWFX1z- ,}'",ͨt F[Y3K(:ooI|"CjjLPWQB"SԾ,^JtjkV "B  URJ4v'.R@oYT*^DgR]よ _!@蔦6 -7I@RA o (̈(da63Ȋ>UHDbK#kHg4 2P40Ox(P n#x/eLKbRH7:0}@U $_H*>Կj }',F? VSXP>f&= %?ؿD@ȄfU xQeT J)Iê*XiXb@l Rº!J aP Kh#mDaW!ѯhc )LExB)/%iP@4B ofa g.  @ȄfU xq[+\JXߪiP.&BHTKc,̄> $>UH,(IiB)˽{l[>s88wRzoՋExt&s]s?#Vtce:VL,fR" P<}ԏk[(cӗr-$ܹHx(.<. {ȑM~ [)8DŽû pgy8#("P3WW ũ+4 R W)j`/}:'n#6'C U2 f&O$ 50>JӸ*x%ޤ!ˀfOł4 Rt ^@yAľ4=Wr'ˢLh yx%κXprPhfXhP/u=Pt1\2$ÛhS2Q(.IPbLP$1`JB $>>`r,txh2 6@.ҝqw f;rèaQQ#M@qEwڎ&fZ ,|Zx+LgD\~1p2ҧ9oeX^r7'sSpY[YtCFe밅7B/޶uR_K7㕚T^DZp7eŴw (] R_&Vn>Hi]s8t:L

ڹg`; 8\{0ݵZx4y\PYgOk]ˊC ˲Y•!jU`}4fxG߮ /9.µQwO5=্z&ynޠ`H~F7JpW 7RGAmDm#\4C(Z$_0ܗ@A-}e)F7}`ؼF#G3(+qw':2kkJVŇLsX^67oi~:Kx.%,^D OVW1zul @=jMs3͛mͨkaЛQ@ݪ"D8ުw6F.qi딇sڷ3vP5ɶƐm*DYeKڽ{.Z21/<17 GW >uO%uۗW.~c'P c /|YrfzWUL%˰8=!{z/4e{=WAG9}E=تBeH0;xBcݧQ,XF9( U9i @/~/Ob#m܎h3tqƩP+yPczJTbێ:f6iGz 6F)J{ ϻ ☳bk?ҹeauZ߇\/{/S>ZAV{ʨcap\J?-0&['k~h5E5w)h{baXTyl?Y~կ5[m{wP,2 VVnevGw@+|X*Pʼn`2i[}=}ȁKE ls2Y |9ZHp[]gZ֝+xBRqR/PAxlys4h-*\Ku_==A\PQFŲWfچ7K?XW,~.Ai& ~Wx/}4as(ZSDTQqajaѺJoo9hf@G(*xGFUHxj_?i3LB[S6L¨ G**y_#{f&76f0A5M4c6ˏr*šW(05$UjϔA!'40&ԇǦxQ{űCe=GQ}Cuu ~s=8-WFӅY7_㧵oe]wL5 O3 BeѣXTMnCz~Z)^N;EW4жi, ?ę^aIle20> gzAt/4wMΰ/rQ80$YRw4߁q5G&HX;[.X/2*{4Sj iؘanzlq,ǖ;MenYPW5ǖ>Y6U,еNEݜl&=^|[x-%}t_d0ՙ CS-|s㾍7?;%İZ2*kY/ T{;?=镣hɿm>[v >NveM3oO2h>db:0N-YlsΙB-00wRsO>׮艱Dd$8m4/tP%,$mmK;%)^vyjq՜CtdCzd->l8{,EU׼woC;ȫ@AtGZZ=ιIķ˳yW)0U'E3 ^5dPAI,A+|8%pZowXB|öoϾ$JE^-Txߌ4b,Q,1ڤ}/3.gf<m*mm+PBbe0BEa4tvMzEۘoxѩ̝< gsk{!3L*7@9YLpEK07$cVJ۲$|SyAd]ŢUW$a>E[Ohv*^I`,3FkM}p鞀h?ׅ Br@(H{k -M:-1-**@Ρ҉j+zmPܮPh(i ~U0V̍fͨB`{.Y"ÆRuQ%/^E^,9HzO!Nwb8I9סP.+Vߍ )m"^,c Q)F@q{ BW+[5Jx`T7LIbc }uQ}һT!jvЂ m0Jy(pk6;ϔQ/:|Ai(8ROU tޑR3vjNq6~E@RyQieFIFUCϔI/y1ڃyDxD qw,:HT %}퉀4 ^VjwnSmLYpRw#@_NyDUxCe?!jK+,G:RM^DCѯƫ@5_* )i"A,tb j?TgTz!5|נBstBEO-CC\WUVkQ3%mRċ\ tJyFU{P~PYsB n0#KA֡Pܲ+V~0R7zMxЇ1f]Q Trjͺ9H'88|,vX[@q BG+[5Ji7R7zMxs!\@:Ϩ׶mҿ*$\nݻq})v֐a:FnFύ\^`Nh0^{Zx"*PCD!CJUHt>M3]HA( }oQ*L0P6ytZ*PCb?S̕Pt}Qg(WB [3JXB`5)֊pCJUJI(=Tt7VB#m^Q=@_xezZؚEG*]gJؤYk$CK9= GKz8'5j iDjT(56Uz;ϔQ CeSzWߞALFM7tp'BPjs?[ E}gJ֔t PASz(ewPYt5ߗ!M ֬@0g }fUl)kfQ3%jJ9/VDSzWJ@顲Dz͢+9%wIG/%DΩ:Z}a ş]6^[4Ty6NreKپ8}A!s Ig*YF=iL7E- >]r}<- L^[كĴ{nU^K5>f|3/kuV,L .G$GgY Z1 5&E_K.ڨ/PcF̴4 ;ҏb>ZtwA97Лw'[JW7IO L+/(}O zT6yݠ{_ ݨAaᇦ^kV?@ԍVgJ *9ey?Ȩcϧm~4V-Bm]T? WC/@eh3 %KTqVQPn##C]| \LӉ`r3tÔ9M(w{=]jH%V{wNxievi؊S:޺n-ܒ[ϊ0nr !wF{K s924{1 PСgbE#wYh䓾-"Pn5 .`%#5Uu,ڝ{=QRZr7r!60ܟ4}L˥,^|R4B 5ԗk泜_l(EB].z9E]&M6Sr@Wc D{fU"ajoiYu F)9^&a]ro3UUfw \i2>m-(n7(s05cw*egנ eZ>;YgTKZЀ*Kt&3\=D(r(nG^Y%9ZXA-*UgJנ mez&ʼ ^|YS*${I -0\[M_fC 7WRW+S5iOʤB`5B[q-|V?TTŋ >kT%ѹGk*hˡPW+Li ٤J`6BK_ =YgTkHL*KtV&pu{HˡPw+,GUz+ϔA /td]Q/i:^>{,yGژy<,mS^/DI W2W S3I:`Rl0LB / gbe^P/ =4K#@c 8{fU,?Xu F)]^& P 5eL*Ktޑ&p?wj{aP FyPl+LΰM f)_^(4 uy1CBPYs.sO #R)9(n5{Qhaj&I_&U3ϔA /;]13j 15QUSz,ѝV%uba'PŅ(m1l(s05?T(<}zZKA'?Ċ< N1mLRS EOZ [EMTx(05&zuwYI3hP 0tHgbbe^P܁Ce=wvC ooݝ-鴏s7Ҍ-j" 7S9va;ɱ:)~/J!3ez/ ST֟K|"L;X ^YbIw6*1rsF mXZ?LЧ\^V^@s QY_l?Gx$`=j\W9%+.K:N};mR픰'm_RJ|tz*>Z浻˼wʊ[IuZFlXя4 (.:3RDPy) TpJ}E7dON5M6;.Ihcp ̶Ȍ ^/}>D|{i(h1u o!2!xʔn]&oA-J"KLam :  p`j,'^^tm˰p $PuŁ+@Aq 0Xn5/ÞɚϔI ':cL mQpq$Y+ڊa^t6(JUJ qYU(tUm6R6y,Mj8ޗ")Hˌq$Y-ڄv7 E> ŝ*%Mj2/,Lՠc`LbP7LipR|/2a]1X.\1YZ/K|vZ=Qz_Q%̫@X}-[T(]hƘpۋq$Y-Fant6n(JzMJzX oq,,L *wVA3iRI^4uyd>brdYg,k8 v!$S)kP8- (/GA?S#Tܔ]Vl>yRˇH_: ^*$&Oi`if)0 J[`^xeT6{zO˥:A8`HD<<*x ;O;H!.H[.n Q&C0SiEI{3\.:iku3r0PAwf0.z,1yeXHݤm Z)M`(nyQL~?V)=S.x)C`Ktz 0z +F3;܉цE V^<-47*gJR H.dD*xIs T!1yJ8Ҩ";7I B@Q-ͮ*4).rn! *1CeqAat6]Ju/xlml]wL)\kC FJtzFxCeSaQ5J{a.0ȺW1ʨtfv]L}`8z\4-xUSz,1h&@~NnCqo Pܢ+ׅyjw;X|\. ¡!];b}A8mQG9DKO 3NEI3\-:iu3pM:ixJnt(?z,1yukP$Ewơv@uQR\?WRxu&J'en( eF? ^,<{Q6$t߹r=Td$}UUnˇܑ4pg7gjkǫBy-x;|*^U;v?/nݹ+EjΝ? $qR]1C %Ru$YΪѨ@]^?S|ژvGpwpA 4Yc64pΞڪpP}v@YS@'SC щCìPD@>fgNd^Vkm`/dMgJԠ vKJuyDKƱIey7r|w79rPGV;&^xe9ZII3jP vtL@$EGTkg*Ktcf{ P˔9:*R F?T4 j?^Ye9ZA%A3%kP‹v Dk#%}'~%:ȡ}3\;"uL7BZx(s2U}I3W# VJyF§~UHtj Qv@)rq3 2?+Kgl= ži0L2}}/=]Q/O*KtޑCmMs JZ;-^xeZII3ekP 6 Z@v2[/=T#p (<(nvp(nTkxa@heI TF)]^(SP3Sx rby : 3Lt#XkQ# O*K4Ёzz@}pôcۀY8z2qUj2m8 (t1+|/ 3QMGHɨ: #=TgSNSvls pUjߣ YGg2'whnU@JZB|zPYO۽>Uô,3'|29Wy)|zWS޺3dV <9*y*K4Iv<>ZN+Azy$   Y`2N04&xɑ 哼3rZ<12|(05\#g $sT_MjzNI~vC Tp!@ i>n{v0|(0<'cwg5%;cVfNJtyFUZ|PYf3zv:.'#eLˣjG/}B(g;Ж7:<,ўJ`S4Z|Umm .Ǧ_ȐQ;ӽ )| x7n|rAt~~ f%s&JWjUgʴ.0ϛ rƁ?~==EPr)wYouoݨȨ|*VS*PE1o8{K= 0~]?O3C! ȨRji5$͙`nc6q?eSSY:n2s4lT V|_uX_o@4QSQz*og4/|_h/;w{ WnC#XRsMGeXX x&jy!U@HQ|ئq9GkʨWlS G{= ߬ Zz'| |2N-%\7A7 TH|a*Q`lχ1ک{K|QA{kUEV<.-? g_F^5FJ-KA%9!eqK|8;/qx@ ~jǣ)=^<.h]wL\k[Ӏ ]y eQ/n-@^~dPYbZ|)>&vߣڱiDyJWF% Ƭ;3ٸJmo[+1M~hFϠ`A 9rrAC9j@ xqtϯz{( P!iB@x&5Ň1(rZ?ƥWF% on&j\vϵBNpc&/ {FZcC;:Sn|P/ڙk7V|.8+qڅ|6 y֊b _xсɱS:M b^P/jau04:BbǨ^c %PnTkexaAlVh=S>yc b^P/jlu ?4:,/cHZwT4:Q o2*\xuܖG*gZ#/xcP\3҇\ޅCeS||]S|xQf c@xeT`:nWu3eto-.*tr NQTp6?6:B |CtFRZ BACqk־%u]GFqFòlIFyx2E Ҋ9Ie,BPХR"G7[:j =FpC\WrVԳOA@^&MB0:/A(qUґ "j)qjtC>e]BԂC.qC\U~4>o*\vުSpuނ *)jG}яPgFSet3o\(bn(*P.ׂͪqA@X#,MV0QB?sTK/H*[6@F(taj(pcsJOFqRDOnGSrNx4iA~<mn]qU<?BelhSFtBArVOA@^&^0KPХCTTHaS;8&eP2%(݊nt*\UŸB* a~SfGY`t^P%?Bes@ s?_;:Gx= yۥ:v_9@efxGer6AaHKߗ#25-2ThvXE=mP6 Kɻ=dF3RδX<w%_[ \uh~[> /<-}G,젎TRT>vd(Yv]<9,W+K?c}{O[=Gkkܺi"6VQU mg3 ԞZi*@^yS)G3aw阺*J[uRDΩwBo=B乪SV S=8u,8]4lx%9B~sx.Yvx>1:H fP-ofG&^߷K@#HH9Ki'ЄUλEKFQrl<{CêBC)Pٕ7i|D, +O|S 1cn&a:ւ[u vTy/!z^-P1h7J&|Dٍ\:͇:.Ө=l7fu99gN+PPd܆lP2P:T t(w+y^C* a~ŔFirdX@TjB_JP6gKNlJGrJ %#]Ҭn!!U_]0J>~ "&Uҩ -=*AAr*dơtP^2ҕQ.L܍5ۤξ HA u?@Ѩm\P^r0Nu(3"$ p6.%f}zkBUK_* XTt*P2s+\U$s87#|-~$}CsT=e:GlѲˎJ1TtJy.te˴교tfHE\(YzSKsTKFxH(۳`a '&Id@D[H:\s77kr#%E_o%:T¢mq\hDa *P.R4EVT8¼Qx(Z:՝9r+,5 #$@IGd+\-ir6yQ*Mgt ?Be o 9b\P2P:Bc(/(jw mq("|M6i/6;sPIl&|POnzzs<>T6.̸8GCȔͅ:s ҵ(G8"2S.#M!/0cC(qUz .NA= 6s?aSr0#bML( 5s]%ZZH:s7i!XνNJ@ϧ“@ s kXe4C}P2\3WA.˪Q P(puPUjKwEKOװ\ !@ϦǬdBWF<^G'aSybB>x42ÙWK+tf)T )5?Bsh dH`(P2(  n2%YZ<:s77ir#YN|L@tUX`XL|7L0C@;]RAQq9V&EG"S7j.8oSGe8{S_.PILėY^0aA A %#,@}^t9e]%YZH?T82nx4#IC?sTK&iH*[`<߆}m DQ:@2Gs'8])bѷތ2M]6i> q(LQ.Lѐ._#T`#/u aP2(Jfh.teKݐ gC__ɇ`fcH!8s*tɱ \THa ,{<:b(\aF  rYV p5MFi.3.PQGljDPp'Y8r.vR醞6"| +kj:{*SOx~JnTx#TPd+ˆHKVQIģSήaxz]U(3ByוS ,M:3#e㣾y~W]g}^+s.if!Eߟ*+ʶ圬!z@5+1mKߛ#. &;rLugÁ i99 ]`UPT=V5~ڌ3WAOe*T-lQ^U.,|{VXVc_cUq<Z]nʺY4TꞮ/-Z~)s-[C?>CW[z3ힺn_VTtn 0s` }pjt!HZ1F_>+د"UcQ99o1t&G|ɨWҬTx܉W:J^|wXʢ^rtPAQ2B(/(i;JǮ.TnEyZd54O3UANQzTH ByHWFT_rYK4񩖦J׾/*[鐐$ZK"t KF2%d~L uU}*%>; ]:E/H"I* Źנ0u?݄*h#-p_J-Q.">P* "TI iByHWFdT^TnE8X>U./*[%KN:d (Y!teK6AMvIrYK񩖦Jx* @G, 9D܊d@Tԫs8|*ͨ fY/QS^RKsTK20@9A:'"X CDQqYRc[)| !~SfuȋSs`Qg樤hyPP6Ɖ"n:dOwp!́](dEP:u;7jvě/@' RWwENQdBXP>BPQiQ`|n81o*7K^Igt-m_l҃1#KS1I:D^tAB<؅r^GgUrM^4TRgBQYP 9NY:T嘔&B}6=d 4"(Tn 6;s3Hݙ*M2F(_#T68cӟ6 .MJPļb/|Pӫ+7ۥd=Pvx7Qtj;eLD素:<J@kOCgN ֚X85:Djv=ʞvU߻=_9^z缕PCŨftdy)1,7P귽SN3(T~Rsֲ2ݞ((dbѬv?O?٫ׂF{Wy AI7_^0G@!~1&YJ^e{46 > !裿PI[8 BUC;'9Ί2LoY@islT([r45&o%S4&ŒN$_EV+-]k;lt=ɷ9k(ADnDq*νڟ>!(wL73/)9ι w~i&smU8Ef*%1j8Ψp,s4l]M #Lڕ Q:\l^eCr"ʾ&7(]>?t]f>sC0%لN*Za0ke?~ Mf* 򰚛]z)nɳw4_^r H_qFё?~`{iM 7R9_u|Ŝ,pZr./-9}6铁Fwm N̠ 76^-BJ61OwKDxgK=x253Ҵ+r$[ Εޖx$]^0,cw+;*|'-\x 3A5`Q~ sOdm$[ ΕޖxZZY^.^xGfT f?IFlqWZGCaܢQ~ ~ m$Y Εޖx̝WЄ u,P RKk*,y8b^wO-$ǖYZxhou</%+YP̊Qq\E0̲?=@+F2ɍl= 7QV\* &TQ/%]Y\){~4 >18`Q~ gm$[ '..2 d)1U3jY\){F 3rW o"UY$h]`hEMɊzGu5@'qU,˸$0:H3gui}fO\m鉷KS'`XSxG뽮-\Z#T8+s<$cdqUbթI+-=vi$տ .U9U寮*[ŕAK`tZ12ojh,,WL ݨ׶l61 gyk%d + RJ֡MBɜ)tP::UyV߭nVxʝ9ml+9G_T+PJuvP2nP2g({PD &7C+~SNa4J, Ri}gujJTͤRb@fI9b4N: 굥 U9VMXVy+sԯ#]LfM)?2WJc(L:Ա9Hx\*ʨA~xRT1oީ3<Ϳ?G;> ƐBǚW5$Bn0miѩR&J; %Y?C=Y땮5ʳ@7[[u+w挷M3ĨFb89 %qFS:I(JeNJc (jcpV8❺iؐiYW3HEe I3㻝rәS'~DwRmv Q gڊLΌ!U5Բ6'd _-<ɔs)5V9L2}W} mG}XNjr. Tŕ'ô\G6sptݚs(-GjϘ4%s9'{:~ձ\qFW[ou (/cͶLۃ*Qٍ~L unm_KW/k//ǹg q(uȹd nP忽6$<YGQArʤb(@hpʗQ{p U$Q{Ϛ3Y81vSZ3Bj+?UJ]栎1shssi?mt ydx u wRM`C.x;R%{F^ ]W$њVk?;J$}t%UHq<馟<=UTTUmh*\9.7t7XYw uZ"=r;q Xh?s[޹H>sEo1xIw]_]+K]*]c¬~#t{O qK{j4I9ٞM{}6NqdMPv54ɚphN]E>e͕_Pyu,_X]*ݝf 7LoJPh0\%YQh~C_'rory;{0ux> {{zOPwݳw3LՀcnlC3%aߌiY;9X.]ַ0mj|*VzA!ަ$ ׋n#vmg,I6TX7K#'vH*EGi)i:cΚ +V^ `xIz&{WwG`[esOɹ@ջ;µ3%o0[Y޿7QI1u\E1#ʄ:x)r7g~WNesQr@Csd`鯜9}ɀ{?N|oK֝ЪLb P ]6syMNj١lHW96C2 aE~Dmd^K{]Yd^h9'FU%c͆Z_xϩҤ Ế1`zv0+y+K~Zn ]K Ld^h973J' 0p#]_E=OGVtv;@Wn{sp{?5n\ Xc[dtQ:M(yEt!\ߞŕS\tvt@;?+gx ̚xI gLo20dVdE Ƚ:em(}%Et!<_©\tr>{NmGxjМ.qNq`zU8$[B˙@%6 _6ʒ.jO\|r.yn-y݌IVI1u\E_W%}c_yJZ;K7JpǾr ) r Gʱ#k1pNڗUR D}k! UJ6l }Y%d`|lMRhP Ad -6NA!&,d.cyJ:H, A^8x2$l0DžrK=$FD$UJ\0'~╭г6i8>_xzY&!0fp7w^Y &1'BUVf%7){^i!! T&!0U !9Fk"A$ ~ PY0i {iIQV)@>5РDsBQbfbl0`$JO@ UJ(,ZnG0>d=@*-| rh[Ր8j8=T*M =ܣMmmDd=QfJ †m~]Xם`+* zU&Pɸx+w6SxjTvzz{vT*2p`1Ȍ]{b}2f1[qA~OoPՌAJwma"o\ðWwD+5Y%GOA[)d 2cwUX jF.DfW]&SAn -!iۻC{My u~J,^2ѓr uo*ucH&(7wU@4ĵTl ҕ-J+!5װ"Le[H1ԅ ùBETy7Cl V^ځ$WJWȿiSw diE +;P%TGcyc( ,މjI7%k:DoyP)MP͸)ҋԴ f UbL Zr!*i/>9!(d * ,)Īg 36I׭޴ R!MPeKLoh|w7Uila৽F5 U:YҾ1[WK}w^-y-Snbso$cPSX@}3H9/$TTSm3*dc^X4M@YWuF8TiX\$3!!'JW'y.B9dJR x QD@uǰB%L d yt[vEq4ASu ZmVXܿ3`IZeZFhM[SP$ߨh +3P%T01QO|tRCԝf[5 =}\6C92d|[4lH=V\٣*^ia2׀|Q ¦rMIvCP"E w*ă|G[\~[h, U7ji/߮Pd2=`NAwNgޏ U9,L箉7: MEV^lPb2 UU2!io}]b6*@e7Ҁ +)8AhS 흞$W;$5HH *2!!(vt4mHXEGdJ'DTiJb@GeLBxM0C`tAN!9E_&"~2{u&1 1_0&Lb|A1*]b Kl+v!0 PdBҎXPrcE=0Lb\AF!!'JWBUZq C ?0~\Ua X"ĵIL UJ}lU6u2T@Ar!9CB, HGܓXb6*$(-F 0`o\*]bxj }o~ ƙ. BBOP. ~bnFnC|$WJW~qOHgaK3P%,@nU(2K $TDcYY "n$Y9OghboF& -S33ɥ=[ jFeV l+Y[ 5Nλn-+H&(s݅[I3K;5%lw29sku>31ɐZrL#D R)J( f쪠*8^% dY%\ cTxD2'ΉʁQ6* TF!8.hȅQ@ $x\%DU*aǨJ1 =A1U JU dhn,1 &9.!d.` {a$dT%U2N!io.QfCClB&1 O d.aFJa҃N}*])$0].U>p{nD 丄T9̨06-2g;,uc =`~1[ȕ||U @ i_<)$9.!dG[`mE=6tH ̪*].$++872Q6ZƂI+AѿW*𜚚^Q~V@[ƄJ0cT˨*t㖥qac p%}d:M'X-.[cɥ[(g;"74K QPLP0x+uPD,z+2Hy\!U36kvXeh\q+ˈDLr EB2q`!I{rhA5Nx^Ya=4 9t:^#F'k{=3~K Zt뾧 ^.rgubLzT;ʛꞻnNB0=V:imLZg$Q TjÐPLPf XB)?9d#_%DMXR2)Ғ,Q$Ug4}njQHr)BH phH,?)`Y%Jxdʣ !ԔxR7kw"߱UHD lB`1"p I{%5! w/ H'K2ȔQb)vvm]MgM!T2!1'xV]z|[~[¾FHeƤI1UXF}mcszcB>_*RNA*-'| 1KÀAI\|Q6H M$@U Y]SO]cTN! އRxx-IRY|E*3"U*,Էdzbc3dpe"| 4JH /"bQW3:U*,ҏG$6v}, VG",[@ʄ-SA;Z(3J2$% ވ27 #_|G bgrތE;+dғUxBLy֩je Z Ije2&Y`&Y@ըķ^Y4"ȭ.\&innZ#Y~0v~tvq"9sku>{~u{?_a *]Ec*x= v M6!*] [%\cY,>)M9n+HR;+2["2JU@0l)zZ"$zZ%d`v56UœQd[I7%*mCœWA$ĖȼQb)vMH^d?eXH bUn+}_2 =$ˇ.fXSq UU*,ƠBUO38$-aؘ*]`V%T}H"ooS ?FU ҠU-Q A4z[K.9l# W'oFo\*]E[mP Q`tcp!Qb0}7p+H\D KeFj\*]E<aE+N-7[NJ-~ZUQd *fF?$ X!4jU*,ت22MqL /T1WAҎ-T Eurw{ 8Cwk:Dgwp!QΙa_(7$P%퀙k$mJh&(sdȖJh wKT=!jF1a"T}4!! }ǯs)I!lmF5|k,BB\OPdς&=h"]g4 Yr'`(be$9d1L03$J W]TPd M=Efm fBNGb|)Q!ݷۡՐ8jKI D"y*T%{[UES+ pH v߶?CB hXֈԲr9'p:QM+T*Edd3 K UbTvv߇?w1*H2P 造u"cXb2f1s<1U@U3+þQl+-TI;Fr+d>~leUd1o C "Mv\T-!VB1EZ q}Ks n&(xum;I~_K-!iwovߗZ,Q%6#mO,Pf2gNgS'L5nx:r~]dbte]ّ*@=/XTq I;Au*ukH"&(XƭU ]rVG}=܎E&KE`TDS艦8?!1s*!Tf\BBQ.p I{qeԕQxRNT[l~f kFug'JW2J*p iOHA3gBB܏Q* Q?Ae=L <nCBW&3lWd T+[AѩQ"vrTWH a}D{H"1a c ҕ-rH~$*{eH`N%`cd)(M-WȒBg2${te.* f -ŐP Q.p J!nnhT+[OTAja$D,:LZCA-~Jz SU"(n 3Wq`t!U0*dc^QT,O{&眸AlZa N%G;Iec$H $U<!K2%),\%*z Jz S!*|h̄ab|tv3>U8$1M>h\%yiV-(W*0:!1Ǡ0M/P$U\%dvRvt&y*C6!I!E2AI+ ?}nC =%=)eRUe#u2 Q1zvn1>ޏԫRJH^XbI}\LUR"9C R I; fDUvWdGC6wC6U8w׋C*0M̓D;3R)>ѧ.VɁ ل*]!E9.$VX]$FD+ 3@[:lHvl$k3P%T01z\/#Rt09ph5J%wdwH\w@o lH=˦I@hJA0a`hw]A.L)f hJQk ]f RЩZ/֣|6zj@u#/:!v!aщzkGODD2Bu'xo&TXw>ut$,:!e9pz39z u]ӎqºPs m`TXHEIM(^Կ\{13º~/W!TXwdPa݉*;Q0MD}~W3*kq)N> Xi{;t{qڝs>^uڟ5 t t>BeqڸΡT/]PɊzU]Pq*s%duuܸQ3jý'B9z09AQx.r9$j>>Ρ3Ux>́p]X@qM2n`%.r(!9s(> stream x+2T0B˥kiPO endstream endobj 2943 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/vs-vg.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2959 0 R /BBox [0 0 596 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2960 0 R >>>> /Length 17548 /Filter /FlateDecode >> stream x}9,9߫bV [dQ:2}t1DFw 8?_?美gۀ-?gY3]|r-s۠v۲~εs6ϟknظuM Onxmgަߣr|stAg4[{܋\>/ ~m{u2ogS%;~ϴ{O ,K%̔!()YmZtZޑzglwh.},mO2tkn,gZ`n4V2vi\]j*qoϴOP6˼m@#a'le9q'ۦ`|YV7n2k h}[>n;-$7s\M&}7Lg1Qލm;_-GoQ~B\ckE *D2۫ OoΦM#:3Ht}%ikgh&}UI]gL65xϨ,l hS4FѴkse1=@9 ͏ï,1>7~9K$CM^G91Ӵ6Yl1#EG!dnEق^>?W\uum$OL~4K:*.IcbmLW? TCh} :#kiij(t#Q?B>Oٲ]qB.Ws_Lep/v]r]Gn`A+>֕0 gпԲ5r zB w+pEZ?V6\Z/S'5X~WTd-  LaAfk@E&q1c kV$:l.:\h!P[nZשER˅eHICuj4uBmRV2=! ?kb]~iS)fHE%zхT{\=XGrץ Fy ;69) dƖM_PMV۬<헋i I6]aj]z`b]n_!Z׾maV=t-=rAovc)BK)AN-Í־; c@KH³LO .,Ko8.P^0 HUcn= 8f'i%5ZF5pZ2ᴵsЄCZW*J_:5V/n=`t.!d!yͤ ЬeIfsztZ-udz1QHͲruDz6BJ\Upy׺{^ T`\>(O2^4I4 ]xdwJk R WJe,<}E_F|@_ij]{o9\޷Sj;wPޏy{ˈ!|ٯn Ueac|7@)|Իg/*A1(Uqle l̀>P dtw^ 5~MTJ &@s&ۇ`cq. @G-s %\?BfCGOH^{9_QiOV= ,NO į~ǵ^aHDJ7(SOH b4Q:CϨFm*|7dK]:١9+7FT\R`aeBPRMg_V&ːryҨ,RUc+M/a=g zxcA4cFe1[h'3&}HrCpBYq#CϽUǀWy{mQHQ^ Z-mm訦4%Be_MfCCN&A 7+`eDheQ˗]C] 座Z>Ѻ^[2$ 4^l켖^h)M(QҢBЉJX5nF\ξǕ% P1Mu;dY2-Wչu ~Ffzps>^@).N\(s]=es߭< FANc6G hULbPnKTOrrDK5@RĖR6XT xlYqNlHp$W&+*`\~CFgK )A'{uZx3p6 BBQ,BT$"TIrS,@2J#p}(7ޱޭEm咭Q8hӍcS|.&7epNu_zI.|"Vyqmeb{[1mqCD<[LQbUpQHjlhl8Ao )m^%(6Vm@ZcLp6s 킍 Ch[t0|ׇT &E*:ߤGLC[]ՔA:yLOdпeCoѴWTf8%Ӟy͎kgY43<}A'0h p&}:ғ7TA+s,T vKSR_(ŔNJUG&a[Bi /,x4`^.Ơo4СxCa,JZ$WNiy{-~W iR4?Pu0\IC-[gG‚hbPAO{!sh.I[Gs#Fo::/`ZƷr PG{8 ZP8iHw l k)No8Hkx봏`VLg>wEs_3QƁ}2vT? ذFHI9k"7;tu[{m0R` #ꚒJ_k]jB O4]tb;aEG*{aO{uӴ,ߦ k9`v~ݯ ML}t7J^<W?H( %x_2#%Ef/&Ba0T>KHBqOgyƱo&~U"·}۴ۼϿ6qR~q$ :Z~%soU} Wy1 Rf8ާ#)PYe'9#fîB6z+i *P? '9FT*]t~xɖސ>ğC~ª`ĶL%4>%TJ'nq2r8Y[|߼*Zh8BILAO'+3/2o=~QH~n|ƮFwCT4B+P0'eYTVVzÝ2r` vfI?zI~!󖳭I/*Toau9F5y;P-^lil6,.ȗ8Kq W%2|OT +&nD%y(z*Ö]D;}, ^*PNJmȐT]!wI\J[Lİ[L[TGaxtTګ:ؑϼPP/}W&i2Ej:P=B> ڬǍޙ,/ʉeӥ9_QڭP-Bgӷ18lGB,s?볼@^!*-D-6cȡAwdWԟ8\pS%*!B*] "@8;7ZBfҧa"1p4Чo N@nl"?*Dȁ3Gw-P\,k ,~*!I]^v轶j"c :hcP;оIk}3%zV*h@G}2۔˥L2~SGITM/PS BMn{>Cm: p7ПU ô~_xm8eitZ*9rI}Jiգ`ʴnJ36Ga*|Ta5_u7vg_,W$ WA2rDUv|Yh ;-(RQ= TAﮄq{L6|63a8i/r-@{who1B$z #$nW8mw %̀.l62)%rח߉Q=4dC|UiACm)eDk?E`.}|!g]2b#ZNX.{N);d8O">Uւzp"z N:,ԊNG!t8t(=L-ܫ-+[>zYI6[8Cf5 2^x/&)9 * ' TA7| ӓǿG_LJBjT>`VkLH9*uGƪ%$I|`/I5`[} Sw|r'@AWRF*Ыۼo<^\X, ʼn+MGdnHB3diYCR84,RPh\&BxXIJ Cg:To$h%^*Za9(&-܂_3 ]=VJeXtT~^Kn7S-] ~AYћESB [`Bb%*+\6l>r{bPE?T*)\C\QPE/˥Q2i_nN|5Nv9篛> ,Q% 2bnq3iV4Ry7TAojH{k}\`))!<]0H vBՐ _+_ƹTfuJ>zDW$Y|tj4syvA<'."eX(pXlx̓D8\bCJ?`خ_XUWi ^eRH.lshP(Q胃˙I-j=zs1T f B:Nd t紱:w\D*24EM^XnXnRPqJ2h@1|$rx$mǤܗA?HV^4q5αImB'PA;*P?*I9*[(nR UKt 3}NJ Qgjæ ٞ~#WUB&3W<#h\*u";W!qmᢽhH4fmnlq.:;4ti#id?i oҳ Ilg\?@E'uXkTuuПLg8“L\f%suw8 TWXڞuׂ0?)+Bg)4mօR[K}6l&UZU,:k"ag*˛Dajޏ.!;FFQ\)QmÌ㋜7A mb" T7;raT_Hh~#;qQ[m6E^Ȟ紤)wu"X!@-. ߐlj-M[!yvm*OI1qɹ͓fgل<)"қ M)yb:: u{8VjR}r&LobNWY; f0o/>#4BTh+D_N= 9<9{!|?s(s)4s 5s 98H>'h> /&qz-P+>GOTZZtئE_%Q>"oKd/EЫ{Lwk'<P&y6U\CRP?o`/@%% M˞.\;pl.o,RGcisCm,gZ`ʶnBq /S]M%UӋ2ӁFh;u/}9q'ۦ`|" "'佔nn'DBJ1MG|.z6_H.4`ȻI O4e=TΠBd-nq=-(W֩f<0Nb?۶5~Ly~&Z. Т@}b:~)_#f~\Qywno/&o [ 8cnˡ~4Pp+v4- @"-{߶8={1{tkQXp6GMTᎳVbJ"u T]]t뗏gIqRp 9$ [eO+AB~P?]qB.WѸ=%Y0 b6<"4yvpҭ43(zJ~_47&k2s/>R"l/X -X` 7BZV4.^o}ѩ jvy>J|?6oXW-N?VLJ "/Aɘl%.MW?A:69гr@0-FVBkuhe|drU2-`X~EWvw`_s2Mh2bVOb|BK)AG7ܸncGdn+B}"iY PJf<o;)ir~VfyV X_O5x~Vfw1"&Ώ$I TRhBtPл\.`U3r t?W'B(~Q5V۪@c>Y`3(IJ8>Y.zuI#q)ߠ{LGnlˠ,3CϨFm*|k=WP:wD>k%VV]&*.eG&~Y,CYI2J=VE4ď^Z~*X9QY y HgϜOfLf#օ|_PV|2f?5*zf@MDb;Xί 얠 9~5QV> C;ȋjt'?4YZ<F9E-_ftS/IP{P륱e/ZI/68ަ8^l|J@+2^H&(aiU nuK,TW#{S@Y P1MG,Pܣw9 j8ЃK%9TUZ\;uS::P`hz^1ꂣ`4the^\&E1FOq'9Чh`g듋UH[>zـ/-R*)Y˲ TI+s4ۜвwUfIJעVr֨N&sl^v1 SG~ǾIR8E6ţ?#ӵ]qLa[q\?e.r%\:A,maɢ!s܇Ŧs۪ HT|]rG >^~s^>9ea+b ıvUg&TҠ']MD[6dA˦pJ{ju6;EeR8OzҠX18gusd?w,߲' U Bᱝc8{ҔurJ7}1bձ6hl )toP|Ҁ *{=RGHXxA I8[i9S ҭqf#}_ vaO y]է|Wqsh.I[Gs,umr E/zȡX[&ާί*:3? .a)No胆(:#~9\TtA T3s;"X|z"Pq% (^&JhlX~5xsff_`q: Hу Y7epW 䥜TהT=r\^dMN! @Iq!.[:I1dF8RalQ8s.ə,$vrGo:KI 3ɀ^.ѣ02*FZ,{ViNSGEu|&3։Ub6ҠgL˝EdT=1ن ^M7m[ O^lϴeZU,ikmG^RǫEoO%z v{[uU*8$ 9^DE=I^rJ?d\;((*ޘ{-@J\38#t[߀0wѽyDv uw݈29Vʢtī2U_/g҃o#JcGoҝoV'L=9:V ;MK зj]Y"A3H>9}% !}I2t^{LmZ(Ro&Ԩ[yڔ6dM H%IQ_>2WhnC%U,"7]TP]9^{< v"|N/41!S<]!b~ɂxa\[/kH!B%(nP9YFEnqROuMkMPJ XB\Rx% ZUM!XÇ7E*f PXmm_PW2Lp;szI:T[{rzݿ̿Pq7m KpVFeOrZn/%~}7oSz|C2Jk7ep0y/+:KBP!rE?>{;5$hXAzY}N/*< C,cssVb o y)3^@h0.:]d%d.wp)3/@M>v)) Nz]V !DrU_!2,8WIJACH1M} PE)( &s)e4"@wkP$뷖aֈK\NBR*PJSS=K7}*Idи0,WL#gI *tߴO|s7mGw7z+i *P`DB.LW RTzWs!Gga_0b[kǿTJ'nq2 B6TEK^S3q`1}ms(<ǞjOWf_eB+2Y{2 muVprFhec<͢:TBUzTT7)SE=3+${uI/*Toa}}:7?/v%]B~7mY R |P旞x)uhL=_UpBJ p[!bdIy<SD 8 wӂm".줴iچ YiKKrͥDńc([L[TGaxtTګ:ؑϼPP/}W&i2Ej:P>DQsa9}"aYIi×^tIJm@V(RJ!I3o}X~@☃^eg}7RP3DZEf 9=~ $KߕvıcKO.Uf#*($!=mŠ,čsSxU,a&?]$.̰S0*7}oho;soY.H,ywmss7LAU=/Xc+T7/hZ̻ț=5S Z>Qo6r)%a2_.T~R'լ7 '~ 0{:髚0ei1RU $ >~Umeҷm֏.Tak F1oPY]2b#ZNX.{N);d8O">Uւzp"z N:,ԊNG!t8t(=L-ܫ-+[>zYI6[8Cf5 2^x/&)9 * ' TA7| ӓǿG~ɤ!6l]KMlH@ɄêRgzh=YA"ʷ $]8Y ٧@\1,}Ƿ+K'@AWRF*Ыۼo<^\X, ʼn+MGdnHB3diYCR84,RPh\&BxXIJ Cg:UɳWli:=F3/xO]D P'psq+<'>z9Ć~B]@3q/@Pqˤ0'\$>$&RP3ϓ[zvb89~/!tic+U'tٹ Tdhz壋*EAݰ$ \0dFcJ?H,Hj>I/~9hkc=oOQ.wT~U:< r) TPݤ`A,fi bqyS'.PYu+W7XgUpR6jO3ޖM5 .-^(X**S\ I 9޿##-/!{C ֳّatR5KxpS \f5~Ba`=j,DV>JS +/CTjjʴq= $n1I n+ o=_Ieu:8{w iU@+_*ɑU%0[s7J "e-ac*eп"%ui8?wHu(2%s?agI=ǟ8/I"Q^T&̵`>kFzluzseTA*4|!%X)|F7]`W_C TE+s4z)QbpSK1풲R-OYYʁ+PE{Y/<ɼN]gg6oI!4z4_#7*ZȱNꄾ8J96MLg }WB" E¢$`eojjT2%P' Zڌ|=[Lff BuQ2Gōܸ=N 5aZnJelai&N&[$@}FҴ~fA< ޤg![  ABϸ~0O.2.׸ֻ35?V*9R?BACiڜ Jm؜MK&Y"u֣EΠU7öբ=]Bx=vTύBW٣FsԹR>چ+9o1*K/0D88KovGyèrќ1BG.kKw$⢎U+sm}=b=iISDC[\@!e?'Z +B.\[U6b _a?j;8w:s'͎2 syRw%|q3D67|pSD!(Zuvuq2X+TnqM❮6וv(a _x֙9՟jXe`yndFq @܀ 2Th7P^ B [ڍB/$4|F|Feg@vA6B;,* mtThGUkBHhDm6KFJSЎ9 h=P@m ur >9@v, Բ@m5rjnon, TY"ajGcő9ʗzH;b;D57v:~C (i C}5/ C-N/]vtcGs߫Vv2v/vWzvZig ́ Uh@$q ]#(C;OjP|rIܨ Oj@\_{b3;۞AJA8(yR#:[@9yOΡtf2(T@ i [`@cF7P02-0Q 001oa|# ^ ib@ [Z`bCF7p0+0T1oa|# SlF70(0<1oTMaI4Il( Mb;DYh!BQv$C&Cih9&Cih9&Cih9&,4JB́44 BA44qDCȡ44JC΍ Mb3$4s Mb?%4qDCȡ44JCΡRZ endstream endobj 2964 0 obj << /Length 3777 /Filter /FlateDecode >> stream x]sݿB}&'/M'Mk^Ӌ'iڦm6ÎwI%53 .zB'=o0Frjbp'g2f0jq(b0nؗ_۳ә:d:3go޾{{v~swg!G|$R;[kb 4Ԋ,~BdWխ*x!/)r6rב $&0%*W~3V\L6xd~R-.yW~S+bU8[17MDm?Y|w.wPx ]:&+̳ypݮq<&_!TOS&[-e LJU^V5Ӂ(ٺ_}U |1 /^5%fOZ[tKUkT0g63kNݦ 'ֲzDXt[௶G in/o*O,c-QAĐP7ky +LmY4Ghp) `jO$15`Y4J+PPb-0lnGo7*[9QH0JWIt Q>fA\Pӄf$69]0aԟ%bJQ񀇵WXs_{rSH|sE$ۓ~KxH0FnqK\|?q㩓&#X.0j Dٷ$$e &$9n;WU1RhT] x]bw%ɕhf-1Z_9싪Ԟe%sBߋ,@La]4dsW)Bm>X|(u*J EP C5664IX5ȡpb&FPiAWg2phN|l#l<ݞ -ц=sa^.˕ QQjRmͷVk]ͫM|+ vo5$"`[DWC|.%>K*S:J!RK_ܯx?s11mḍ;b݌ԧi"pb1vjOԒCeՄfC[O7ނ?K(2])HWj"^( pA|%uEZlkoM!ɺ6Tzv;9at"AنCLv1OxAdoJxH3l"C!unQ^1SF5?.N!zie!ݍ~#Ic&G rOBnȞݠK3zby|XwX,YS;SxWetNwn?\(4WXI[A/cD*;,"=ʩHMnH30EPEѩ=aSXh+a oV;<[}Uv|zj^ǮG *Ar6R5#}yrj̲ uvQT/~`Z,,r &z*U7!PGH P|o!Q&!>I!~p v)7y4%>mE+nMv^[7]To :S5{uԫ:~ll)WQ9 Cwj4\F`M ̷JN'82uÊp0/Ne{ѳ{p. "l?dc8kݍ9RvS yjd gOP I&vFQ5Ĉj~Mo X *Ӳ 8kj. L0hBhmxHu|:Еa,;m`W}M֋30-։.n -iZO$ tmR$Eb|Ͳ$V`XcMb b;QhpyZK坬}]5~W`y Uc#BBC!&APK {ˏT>?KeΏ! U>cKzWrD$|f + 3-!.rNW|@zJib13&Mi;`rsM/O̶jӜXn7견b=sA !+y!3[b1{J lj)ӣջ30y2 ! RWA 55(ae2x1P9GaPD): |)(:]*}NR=}/m3jWs$ߙ貤ӃvO *=ڎsꉶyfO^98U틯 ORi-i# i?%rjҵ ' 7vL#8;̘8܌ء!g^4c,2^wsQch訁 (Rc;q!7~ﰳ{\@q ,W݉pOZz7C?t0QkdlgRVьt_pYvb69%*)}tw>U{QV^EY4ߏ.WE* qPW;?Uu}|1󮾣q']<.3e)-×ovq7ajQ9_ϗظdӖUZ7[XEmBQwpL.ʩ&Mu^၂7j:iЭ N26` 9E{zw8>NyE7d[ky,iӳO endstream endobj 2975 0 obj << /Length 3111 /Filter /FlateDecode >> stream xvί@|1rZ-?T'َėC$p' 0pקZl%FP6(QNjG4Hɂ@@0Y&TĐV48WO_]z}1mCE5j20/IU@٭U* YfF(Q= ˃}`,Q!U  % Cڊ-q#h viY옢D1]BdUx}ZI|[=!`}qnIEƠI{^U:F,s&1:a&j:p0Z$yvI,uZ[$lL|`zDmģZ7h袵b_cX}m,cD'R`|bcER av6UoYY+[zT"ouF.}0PLGoE D* DQyPADT Խ4%J]+Ob\,uvh]2pZ7 W)I nyrSHA*Dg4rd#{k5B˫I(Q`79Tګ  0BIh ˍ#|x~|Ul"WI1RX6:[z޿٫{4=6'^B'EM-`*/tH/_%~֗l{Iwbz.,Hy2M'gsH:[g2M~-$+hb,Noyd #N{/3 |Z:::n˸K\+]5,l(+[5(qnNoJz q%WXS d֮W? ~~d6h(QB/Q6AY1OZNC}6X(|}U v}{vg$`A :GM!>28JCپ٢s iڡ1GقpLj^|Ԑh汯]"c~Gc D[ %lPL>+Fl[9^ l¡b'kKy ^u:/ЩDz-*o:Vu Ѩ*JiVrhjvSj 5Mhv4p?2s WXAV"ھ)mOM0/.w'Nl;hN0&>0=Fl55-}lVSּ-~8U cCcK4lUhDOFP@c>1o'=vl^#Ppʠ ufө0> AǶ? ;#7zt"R;CbP%̵[vM]­Y Mg:@ Fdh :v^\Tj黸uz~ȩ(7,DZ: w~7(K_d3N|c`Ӻcܡ166*;P+>=͏;khݲg#ZRl ?Gd?t?H2}fJfM%= \p$N'4~}=]tz=3^qgT"VP}0~= I,v5#B4PϿwnr ~f0TϗKP{JفGuUsL9}s>mmEbyy03k99<jgSuu=stHm pc=Q?X9fC<`#e+7I(8 hE`UߤX>: T=Kay /1I.*' j3wS} >(+wTyzgI/ض'7|7#6wmc8 wK=sJ |x,GO@f,COY qO;6ga>cCTT?W?5ǁc{ ZzG}QoS; 6K.OjWENԮ X꺀ҶóTRyR=] E`B踈jcIC,q%n%ݕW"lOU|nnuu^lV<oGUR׊A> stream xZKsFWtآ6$S^H) ,(AOF,}wW8gb\Ϭ1!l6֝}X";\'fV+ 㗽Żfn1?,/hś ("u1#EK~!*RpfDWjLJײWkd֜Ӓ1Ì1TlG*w!) !Jv[.t?EKF.ͻ_=N}Tu6J)r1uWo_i}1f  [:vJ.o \&zJ%t^)lwINCM9iX&E6,V@*=$JdŰ^ |oIpLyeB8R' )dlqrִn瓦HAx6 / |W*ϊ MY&=unyu N Fi,(6(}Xք]+|.ljG|w U"a:cxGwfj{a~M91<; q. q8eIax)!keNXK~k݀92GnuddoZg֤Q] #@s#E[QܕXv=qe#CIBGLzX |[->>-c٧'t3wa=MAM%E0z"y4g8x〖қz&DL8egt\8t|?%f4?V (!/83mmMIhf6XZP! ,V2&Ӑ5%ugyp9zNSP A >b)Ĝl5i_CQuStQ&D}\EQv4$: Ũ"Xn/CPc٧VF$6[ArL]$[)2TfoB?]qd>p}jƩ.䓹8sSAWfP:sb㯯1uZe )'wڣe1(bos{]'`j7'"6!_ڄ8ۖ ƛV;0- nO/)/:dah^__?m~{5)Zkqn~+@o}iaw+7tOQo}/swG>m,s:fs{rQ';ߊ{Vz; gJay4,;@FF b.`]|n p(DaA+OPлbT4w!%D>]DC>*fA4ٶЋHkuy{ po |< T +/8>)ukV:l99/ɑI||Bc}62>^dAvwC#I~W׿ӐogUSVY+ AIF؆Geikf#?|Tg1?qzOaWض{J_tS+{C~³P. Ωt@ g$ ƤI7G|^2%H =37h/ ĥGZ4\@LLp? @1 h#̇Uy["޵;;@6-(&u mɞ}qVvŧ1aSs1i?F@c㱄o\zX7%;ߜ3fart&# 5Hۆ\ccD;Gp!-<:蘜CUJ! i.V})&Y|jFP/8 =&Ҥ3]K WFUB ִ_Ĕw)3mR +r fm.PH U{W.U }b<4]MOw }DI(u NV֧S! 'bԦl}na#F sn:tytYZ/WmvD(s_("<٠RRt=~6Ój"9U!X-gʎc3OW~Fe^]4$iB)H;`v GZaKhcAA B0lS5[>_ kfupvV4o50^_/wƏoa}Ěr{97DG{ l3 B=@ 侷nD G![jfYO 5fqw)CBbўÁ"byo endstream endobj 2990 0 obj << /Length 1179 /Filter /FlateDecode >> stream xY[o6~ϯУF DQ`(Yv(P,كc+'liEI&bljc=sw<4݃P+%f0 :JT+0z_Ioǝ'ݓO*IHJ@+m-ϣmXO *b6J%1?;=<\FWs>8vOGTQpj" Da|)8~/?BFK߫F7ΚE=( Ӽt&yT\ /)ib5AјY2^[%ApȊb|IB%*0`|Җgy"Z@)#*</$ ⢄? %A1[`N .y(oVR]Q e%H١ 4/ 1?S{<LW|!ĘA:2 2N-~J[績>fzE<҃M W]>Y'P}bKz`"\G\{۽kv8fVĉ2k4\aqߢf-*a&OGOSp10Mg?>(k|1<^" e  ~tuNЩOSotǽi6d?ǣh>ͫ"eҮ8HQ9&sCģ?wع ܆\4:7DpVY]GV_Gw`n. ˏƣWD 7.|"fE|l͂qF|V*QjN;_{XaS݈MZ`C 6M{ &fk6wjv;D싵ђGK-y^E^+싩/v#|mbm_!DھXkbm_n_|wz endstream endobj 2994 0 obj << /Length 2292 /Filter /FlateDecode >> stream xZIsܸWtN,ĦRdgהӇTl(55-RՋlW<,$A HrJ|Zx4O/6yKF 9Mf#IGR+DM Qx~3aQɑLc~\Dq*M^zjr.yד^`~#ƚS%B@C!yUQ{a zTF͢IbLUqr3l5=4d')V×eU+מիq1no^e ?l[]mʺZ{+6T_)0d JFiF4"\M%T:t`Ь"f6lsfjfЭ:N*6c;+혋wsqlrYn.ս W̠;ԏ,tg % <_.gUK1b{atb6ʀzHev;4 )g2sjcY%[ʀO7(|vDY-Dz}:NG P>e d[f? yzl=1l\<ǰqq$g_cedbˏAK\뺪iiH{m5lP!t _Nz|{Z&kf,W՘d,6wZg1!p+39uyusǮTKR*4-uWe57/pzYN84 ܗi1_~ #=::CE)&о`jL @S mϴdBI{͜9qoV%,1] (Ѣh~(rl$j 5@h+v5/׮1ߑnIr1Px"XCv3Uy4&<cNڸ|V!!owUH4$pͽnP6}bo&0lc€18a 9`{`bI'2  ,D˘ R${#oM e|NwtB߫[Y޺En45][I"'Xs˶f(OXEpXw 1LL[TT=h=[#,vr[xͲqu힟ƶ踗(1, .d:RQ;8G9IKws"uXĢ˻KpǭJ$SA3H Hq!60({a u0n(kFkZk_`RƠM_xes 29ʖ\A VmsXLvJ)Thk^^2ҩi At˽Hn/)Ab .CNYO3Ԋ0 U S}{/˘w0 64g_hsr5r2^伩/;q+b Q|_p EX$8ދ_[3 Јc"v,O3}9,bGc"cQ󼘼` endstream endobj 2998 0 obj << /Length 4417 /Filter /FlateDecode >> stream x\۶BT]mċqmfn^g:yD>QwOOvAHQ"mxPvM>{'#ԄRbdD20O9/f*ӗ?'jY>}Ͼݕfyy@Q *508Ie(ЌP|n1M `͹4uJTd23OFaxCp-/T馸t ta/],Vd;;nsp7_6 Rӭ't(v뽻\m"j\;7Hdyyý:>@G Ҝc03?$㗭HvkE]1];.\Oto Cn}>n^oox jyV  ' QN0nBˆzTa/(~uEtkNCzgiv5$5eHG=cbJ0|I}%(TfLj]wZ {'vm=`쉧 4.W xP0h>4/nuc"O3` (Ȉ( !9N2YEtȔLiVeFu,},خ "W?^iXWn{.s~]nJNXtJAɹg6;C,4EE)0ܥHJ˜@_xooCQI$= A=quxo.8_i< kp_5``i"okRNgnX.Bro['bT>v}\gA4sTOi^s# ÉjdD`5*wWi<mIq%Wء=\h=uOo *^%c,EBu9Q,*R],&jT ֐w9 ς8pw=}Pf `㋙&`9ܱίsRNč͖T|\Ҕ|qxg9dǵT^Hd<N$BRD"jJd<#eJ fYh}!?Iт:Lia!Nb@:џ]zTGIwd*R֧hU5.,G2`K[HreI$Ey 2JY8(lBf:6zX`D"24 +Vs'U6҈su26uhQ9$!h]+VZ&s/@嶚Cᵳ]&U׶VU6bvMe(ZȆ4C9˺wKъdt/}{_ܮj~! B/b_UzamXVr5\YMv򹍻='5`dW> !&O"|4h&Nea+1Qxۼ4Őz3Eh1 M]j´dfv^6 zz2)9eTrfC-Qi8⦏8 {VGa>=K`igI IΨc2LR"mC8q |"3 bLZ|C,H%!.xKVGը.&T{*ܨ>=TiP)墘uGꋈ00:u2ͫ^k uLrN#jF}^Ld`1{)G'smxfgM ߞϜɾńgO7MhW>;rxg[V~܇K7ֶ f~4njM7 j`*2r5R B UCݝŎɴK2ԑ-m$6[)D=l]d3HehRòOLM;=2 PnQpծXtyqae?qatq˕ kuOnVtt#}_ւcY(<xҋJ:gJ@憟C~IB@XHÒu466'% a:dz0LZC˲YCEyP}X}c oۑ?EG؀6{1u+G3. `%$8O8k gL)&qabfH8 ɗql,]Òwbs \w`(<&י4& F d $ch`Z#Ou! u'B?-=v|ו#;lЋIx9%URCX8[CW#]t]ntiKsI*ɯĜ NWnyhm ˂a)1ܪVVZcVRyfjeogI#9dJ){ V+}&wtܠ`ɧ*9Php*Ǧw,5F2u.DCT]:CcIrKY+ͺVDBD׊̶ 67 JrGT #=3Tёt<̚up3D A( 4chPdo' @SŽ,+ jҦI+CKDD 򻺍/14$uU,C*b1r(4:"wb5@##QW9AK^YX]|ˏIFAz 5N`4 H5O8e1VF!$qT?Me=5 t!Ljwh]EwA?G]4LQJcZ[^>f1ˇ,,` ㍹Ҭ+Į3(2KEGdր)-*FfO+eQ0KjKNB %ߞV=t*V 9NCV|Cb:F?|dmj#n2PB(嗦cx8W X YדOP%oXvsҕ80w Y<'e^-Ax `5g#O ;.zL6IB!8SM#]e(N?H~UoƋ2]ɔץ=3^A(o}/g)ϸ,2ɥ{:嵿Z)dگ I)QպtiWZp O3V 2V QUX Qg^B׈'j~(򫳴/?tt`$nGyψiց1M|bPsb < (b^9DpI$} Vq4c.ccu?XJp$2tA[ endstream endobj 3009 0 obj << /Length 2032 /Filter /FlateDecode >> stream x[IDϯፚޛX&X|"A0cglO"崼C /RU5)hŗϞ)QY!b0,`wHFuJǴ$Z dɾ׿\VRJ+V>yuw?~u.h Pb)ir!\Dތy&%@c D=;9%JXM0ŐJ&y.@Q%d} GNixW$B)VOΈ\prLop>㢹k̔Ko Z@TkK ˻g/h1+(7Qxz[zsn+f aødE;0ɥl,Uëz g)Q&Od*Eآd!rR` U뒄o.` Z'yXSN_GB%fKF|r.DEC$|YOۓۗoO)4d17{I(f~ ep?wzh QVcDlj))jj**a ϿG(L"%J )eѡ\#l$P!m4Ԩ'wAJ%0hVXu@[ 9F82D ^3]н`|N;5@paru?jߏث=YK4j!ij ݛ9,b#*U[b"z څy!EȊ%I7+7pٟ@0m(R:'<,'D2B%Q"g']t0Ƕ+wN J~]@d\TP*- qZ'ɽqLSk T["!zֳP@LuevIAnHƈթ!hbԦhEKR(;~ێ5m6=?-H>~lb1eh Y%f-BQnռY,aϱM%lgRvZtu[8w>7V'm*|"gJHcؚSlU,a&[R}[=U+=Bv%LXQ UOzVkRH]#U~Ɣ .b<:-$lÂ-/J_݄n +M-XQ^pP%nAC+p'.?BGU<76,PuvP/xfhR6"`( 4{/-/*eA}w?eֵUM[|9Bz?!یGw8oR8@e]-]-qȎywyig[#K#JCY9@[$7~&v[WqDrgls+*wG>)3a0kn 'wt1Mh1'PxXY6'?lMr,4̽@vis~z.[r5AMjm ۭbw..PX]㶭R@XGedd"߽:AeLrd=+JΐZ'~Ti0(:ʨj8݈nqQ4qh LƔ@V% apJ4+v&js>g:~,5a=V'CM,54(A2ʸ-CuM]daC-F >͑zp4q>;F}Z|2hE57kZEr_x >s 3vyv(e"pF1"'h> stream x][sݶ~8yNNI&MTCԒl'dr.H"x@BY],vq%ݽg8}?1jvߝ^ g zwzH?W'/>?|} юJE Svgta鳛g ~;shYAϾo_(~ꞼI~~۳o22 TI<-nyDZQp?!H9xDcn޿_ȣ IceDWaac#it[1*d !{}uv,Q*T 냨aV` *;`Q~㷄m9W9&BMH=/k0K|cە"D8 i6_adCȈ5AeI+r]ܽZ ru%/hC4ih1wLBDzo!I402B~CȈml~e7`zkX<4. !L3τ`t k_e&%ܯyŖ&΍ 0[\AkYηP%3*(̔>J2ǚd66q^r2[lY 1!dd!2addfdoLfrPY cH#*\D ?enWd.AqkqG8/-ϭ5:!%o JjW ̀h `e‚/c2+L\䲱W.[lY 1!dTFKe!!dTYFi|+:.u.))F.9S@ʙSGk3 +C0M{6ZtmMl8ʸY NrV8(LOMzq ZFA|BƐ&%*1$'6("W30GA-&D8[=V/bބB:Wwy]窛3{(&]o_x]y&h@7&^ܐS 3s/!4@x?\4 ##BF$2 Hrֽ515WaӖlpkM' {DG#d؛>``aYF tuS؋! ꍿнe nzGy=BF e`ݔRc\ݔ:lGR~g!¹|GDz>BF#"^DDV%+wk00`pkP2᡾3F=GDG׋>!1@QYFa*ѻinC [J{JlQKla}uh=nxQ`)$\ەtmt_08o02 dD,7DCpսoXCY^ha}5ە>7~SH. `o2>## BF2J|! xmֆo?z>YdդgaOo|j^{f')\UH}j֛ S꿉p_F#&}w~޿cv$.o_vФqa[S83 c()ÝX_m`8"Dr v( kpEP}D(f&ZxZlX<-3n+a('g 7 H{tlQ|Wkzt$ջW7//ELKbU.[b%ϲvq,\Ɲ{1p r"KǮ2OUw n랺;3 UQ[AC]DtKZzw 돘 ;d]3y?I5 ͗u>FO bC?@`s{tw6?;p20{"5q,hqȀ4t.Y1Q:{U3Ӵ|tP8yx%/Wkbc'ɫ]2GzgWPw_0 Cv]ߞ1߁eMleNk?:=nuUL=Wv>\zLS^\|ݻXY\z` eg{ {?l ^Z#ZjCLdzLoOrhh_vBfx? ;ݿ:?T%u-nA[3 \6/LHuVY pW-v8}3P2\Dz-{I1AĨ=-aX!oq*~hP @Ը2q?m#k`C\-r׬XR2y'}d`ߙ 175X(Јa?_ yN\,r!+ ~̖d&q6eBJHvg}O:L0P11@#ch88Z?MD-/pa C2vʚc+peD= 2 qfqh?U!fM?/ĹLaZzeh&5XibتsP53DP~Jx5ZBeNx^&zɏ)o 2e,n2eeB8u̽Z>t_v0 }|Pi<&y9/\W3t]MV'ݣt~Y`d~#^J'\_z`_ Uî$ \_Q~@B$JU[45rH.P}e['T/ :щzt3w3>/[ĺ/mf)+'a Zx>&U!/>pEhto7gPbp#T|cV'myH)"JXU52d%Ͱ-3"{"dxW;o1!#f%d+SbO>?C-ٳ྇bϺUQפX ҈'#gqڵ[DYnQJl{b/Gμb ͪ9 ?!1q,ۤ@f3+_v=)չift즧3]q;vQaa ޣ[f endstream endobj 3019 0 obj << /Length 2154 /Filter /FlateDecode >> stream xYYsD~ϯp$d͡8[a U-b+.CDZ,<$Z=}~=ƣ:|vv!(✎fˑ#)DWQz-a٦#C`cȾfW?@T 7+vW/g?kfg""#Q L)UN_I8!:,DJF_Y.GE+(B"ܘn||)lMO/5 |LeO:.}q%~ITS|p7~N֤b<^Ln)Q<ۏ^feb1H}T e@uR;eRcN. /YpB3W2ow=zJ[`8.벼8?4/&ٽI&92# WA-VxuVE~MIab!/o6I-k<z Άw;&x)'DH8S[3}xX%%M/%oyiԮom48B]4xwi[q|,B59:t aOnº/9ߦ!yiW U,&YMW7V}VunhGu"J"NX. I]"RkXf?:!WWK״\ۻ]nWnnjXH2#>"BXx6&00qdn]D0+H2Xd&(,Y[iUZ3t㭨[/}* AW׌E i&0>ޤQh4P8cݡsJ-HյKK)8ĮQ<eR^H5TbLA5o23B&]߷k Q-7cv; my7Q%=J||`fhXB~qqJT"Yw>/KDyN`sk?xcpPCa>/=?_/͛|Q[@*$X HeoKƠxGDϬ y/kq9e{4)eNރ#.HFD+܊"&X9:tn l(>soX;0*8"\`VI0-k(D'B$h3t+g vZD{aCUG~ONΪ9'$g%==dK`VNV6>M>Csk ț==Ӷ|57? ݸc=B3UU1 _w7eR-!p7In;% (j mM&Czs| ˥} Ư4j4,ηj-X@3ǖ5Ji#퍓mz@'lsѽΦW鶜*{O>}eT1$Tχ0|=2Ǽw}@q{mgx\IC(('P\!IƇp/$avj5%9lH&2mRm8ƅr!N0 uUZ$X+:@sg.Eέt=iMLl0G$l&M^B_ 9Lzy2yl%J0-zћBA)Gu(2r0]m0#54$xh$t BHH͚:pG2eǰU(Pgj_ )a- 5xtASQ`/q00PHPP [{h-Ж B[vꯣ-F*qSԣHBjv'!.B endstream endobj 3027 0 obj << /Length 2999 /Filter /FlateDecode >> stream x[KsW|"#s4:(kk:*'{ŻtclykAc|i1OG<:9gd.ǙqpQ ?0Wg}{@p;s{s8xk./^K/oW[軗?^zwPֵ,h_(ǬB#6->fO?2G'0㈡<(N2~KJ{_d<&@$e#7 hq\CXEhQl/Dna499uݸ#n}&OKVl*zy8?;>Nͧ :Y!ս1\{Q2yF@1`r-{C$8^3?TNyLG Η/}Ъpl`,a r_ q"n|4X߅K7Azyܭ '3%*_|Ք9G΃dm8wˠ|Je?~ Jq~;Z_"-WS7q)I"]Ԗ/PtXM5 cG1 rxR?{-2C! AS)k%F5Δ+>oĜFJ21$ KhGEڳ`)/ͯ3 xoɭBU*7讃~U6-'CNQR*eRQ9(L&A:y0&BKeNm$J*]Ѻ";/\v HV8D T.2U U7+WMǁs++!Q_ՀBٍ8zyy9tXX 7(]ώJ\D$Xk!9ˀ8;3mq`X&9U5DbEy ⛭wcr hU)H{~4$p05@@*Ւ[# (O8%q8* UkC3 Ѡ?o'Rjdlxlm5U=tڅS&Ue|=$zL BgiPRkA*k 1:iKWl8QDJsQ2d'H~<ǫ4D R8C@|J( % +n /!fgդbTS6Vxabyr<чyGpqg&\WNV796A~[Et;kAFRm)8\Lc(!b\)!kU:Y=`E{o/ ZS/+,͔ԣ4W)Q=~JӘ>cP}8cYZdtɎa =Mc4|h z&6eo$|eC|~^_ OǘD6IJ؟sC7 ` +5‘x>ո6ߴUtfD:9M0g /y,Ɉ:6)NT)ǔM^2kb-8{j4}~YU =SQ}>K:E *-E֚8wJ\Źt4)!lk(r ɠU9pĩ ($DLZlwTl;T5Љ& 4m98W)ۑ|UwF{a7\ pXRGWi8P' u&ZXNHeqZXhfm7oEmq}lxɝZYXe̖lӀԔ]PAimP˧!=P}Lv >N)T>, c!C WQ' BN sPsV:Lb-OĹ8& '΂Y~vh>~iI%KM<`(hKw[SgIw"e{1e 9ݹU7R%RU#noS %pX|"Kj9 ΤRaQP5D*lg~Evܵ?"//l!nBSKGR;$S@^w2ݼ7ެܫNF-) 2S(F`Nߣ[0\lac{cY $*Nx2m_L߲3o8Wkdrw0Áܦ<^wC$MWh5oNS=~bdE/3^i89/8:M߻vk` a掞~W r8ƍl'TXK lW?`LrXLC u*G ]Bw h~%50~/ԁ'rT"_p1i(_kFr;$=_&_7 h#a[,mEFW.<}Ctzn*wNvlxx|`jxw :v]u*"K_3tseTkoS?|v4щރd5/2߯#pA,R[XuVL͐Ѐ+/|,^77(Gw۠j/P{ji D?  "a/2z* wp2_jN:/pYR endstream endobj 3033 0 obj << /Length 2311 /Filter /FlateDecode >> stream xZ[s۸~ϯP$AҖf'MvN-QJR (כ|8Wwý6}ux=B87]\s}Q&zyO<1Ȱ[\o~^|}#W_>2P}0$z~ ^*d{)= 9ͨgD=ĸjq IևIf;^?Q?yrhCވ sE⅃|`ߏ1rAN0z.rsP$|WqK-I}|4`=K$((K.(Lpeڝ3߉z oRՇŮYbmCX gO~AWdJ})ә 4n`R'ǂ@H :*QQ %E\eQ!8.*yXw3]9iH*V$UKOJsÎ?/nwDet=peٳQh \nx)P,Q@hkKZ!P,yKۥԆ&EnPe YۮuTL>e ٵvt7X7]$)1H1̪z~}wM89=d͂.h6A[B%> ^ 烠֖ϭ;c1'>D(f8$zi*PL3}@EeZ#̝f vH") X)J*9kc_$^y5 ́ 5n` |y5, b[&yaTh/&jRT- qf}"f-p4^kܡ?2W۩:W]wbߦK[yԖ#yZs6r V r/>$偬@7" nJRZμ!}#"g~V1=G[E6q 0+5=n#uG5T-|+D{ Eb qf-Z,ZNK kV(%_w v'B0׷.ܪv"V=J=$ }-F1F[r,K@]agI!mh~߬::tAn>0N*ɖ+(rA\gݫ⚊v>*^<˭i;G?5X=]8 v wu룎47Eu&9 W%"l<=N&h?263"\pǤbKfyܐoyDKwyEd=k} BFҭy :$8Ps &{䌓׶X2>{EsĚב-. XgFtFN~poyVYk)b*4]?Uŏx8itYeH] ;>$ZMYuߢEɎ>fҕUx v1b8b&N2sTEaȏeGEౣ1NNjg>qŞٳ,$?6?VǵodC ReBe Z7ӍT u:6$=8[EǓ,]e2l'&= 7[+=.= endstream endobj 3038 0 obj << /Length 2821 /Filter /FlateDecode >> stream x]s6ݿBj! ryIk77DYL$R%)Ǿ_XK%9N{3BbX菮F?Ώq΢ H 2F^ȸ`a}㝜9᝿yO{5{wOK[7>_8)4wgOL:qw oJ"?8oROärW (%r0v1d"8Q|M4J8^2ivEiF爵v c/X9aN`k8Qc#*o K  tC>,?wp}.τifɯ>W *|&\@Ej`wȳ-<򢊳"@3- hy%k"#ūiY24iC8[(bQβHb8Rm )̷tNu3QK~OB'9 y0O^" |c$->78ʿs`.9 M8J/tWUb_F ?7k|ߟY1Uk~| b)uW1w(!76<3zn`UK/'yI3jHojE#u2h@E"d.I\:.^ϳ D `-Ad_ OdLLp?w3^!䎙2_^#?IV0G6._Mdr0C, 7blً"TCka@"_&!\5Aq8o^ 4e۔CNO^8JA-LS`)fQ$y#(,ǛeE&q0Q5fQådژjde*mxϣ+.} 9mmY%+%·fh,l U C~?JPc,2ɞ&8 S1A؉6X+%3{p7 Z& "jgB1&X1H#F+:x5gEVB\bܺ _>Ӛ%K)hԿH2A {"^Gڶ@%%˴JI hD2 f1!-Wp/|؃ld\%wbEQU͌/h  ]t9N46LL}+ڊ,(1,R0(uQMY[PK5#&zrU7_gk2o9CI\k1;* ,?8F;]/mwAdq]6AxX8Q@؅G[MR#ɄW65`[P 2JQ$w(NӑSMsu[Y@t+K+ %7"p8G+Pw(BN٦oIUdH^}H{WMe0XZo`.pqQxH+ "v!._.R0Ғ7[.ؐ pR[sdc(!ІvϟYb-=Dzx[doN"¶?LMݞRû5A$rk8`Iex$[skF.wrvZG1{KiP>߷i+Phi/ͣGb0 Y*8|f4]]|G3Au_- (aPG-k\0zv؍ ڢkX@= W !:*4v{B VYXȥL 1KTm~Jnz9hyz4=:a75bKJ|r G15 :.Qyog>M&2&`xi3 ^24y+$@/}p=xU:_ F~(oWu@Cht|:lYɥi+8ّ2(TQj;^_V'W{tY2%v9L]-Y&EspbCö^Ѳ:da`gOozS+[X-[88_~bԆݹ"xJ & I\ $?m v|kYe'&:Ћ#wpfg˷~#]A [ζ (C>B_L endstream endobj 3044 0 obj << /Length 2760 /Filter /FlateDecode >> stream xZoۺBfE(nHw{]AX-zI>XNӻvhTuHΓ΍evrH.uf ǣKDpfs5"R~2"0&/ߎ@'׳sq~9] vg|| OtZ:1nY%)躌W!4=<*ie21h^y6].l/Er4?eQxҵ_ϴ(co0-=tv캣 bLFqT-lmY6' QOT MW4yد( ފ;ɔ\U.!/0fĈK׌ucw IV[۬QI)]zDI.vbr8LBeQmVZ$%>AlNQ\\$yz`܌sv]Yxus 6@d!֦ gm6fsd8/ oudŠ.2g>rK jPց,Ck_81DqOevP-räqJgVw聓}49Y oS =(*F^r!g'E{@GlC(<paM"(5D,"SuC+BV)@T^9"n ;< ͑ )x:k UIJr(Bg1>M(@+HL jP2am]92ܫ$?7FrY,"@j2 6(UBq&z SL*ڎQnzwamba徏!GA~(K1jTUl"\sl0#-d,`R2-syɀ:UҾוi j 4j ٧`H>c9,/aqQ&W~//M]6 ɶYt=$JV&~WȤzp :;Ǒ\l*N p]L #69\1[)RDGȡ1"rݏ%{In9SsDL>- Re/.7QAJ}Il%@pL%B$n.(hDNuָ;3U욐zC,@wp5h z")R2=LR~SOszM8SBRy>)[%:ʺU)RFY= $O@Ļ]b0ul$ p_dEɷDn(/)`FoC.:HЙ6L:fuI80I'[;¶#X3dˢjQYS)QlC Ym-%=UN33ȾAzd;a:٦`Ѩt\lM{Cwg;GuxujDRDy]HZ uz| 0ä We()WI0| !wSJ{aCwݝCD,N{ᢛ˟S|=SiQ@  w? O'[zr>;dmqV ƐQ5t듫 o֕Ϛt YvV'W{Ik=wyK^Ur{DBISF`Z>/Ĩ*Mdm;]$вCc&NxEnPHaֵs༥]{W;c/=-+IACU-^l*x@Jy,kR@X~~كxfyP&S.@!87B[O-W_Hl VBgG#GKzTWFZiw])>Uߺ>-teK]pud>Ds:uq|]hu`>=I}iA ]Cި%;REc}_n#P5e"?y.Ǣm VJE]w-hH5}c@Ȫ(J"S弎d*ƨ m,Ru .pw,sSe馈Bps"(W&DP YUΫ .i:ᾮn@4ƭ@a}}ƽfaoح06)?in> stream xZ[o7~ׯ[(6l ,]2m-.Me~\q45J`9C~߹IPB'6 ㅱA83K,lHxVG0zl" -  r+x <÷~57<ۨ=/y܂ZdxxX"Ѕ~<=>.A802 cD 1z_3QI (V=?Fn~"@yi,w]Lqq~(fn *263n< x*}7ͦz!.Eչ>_jW~zT9;4R`yې/AXoH1 n[!X{y˻wVèd[dF~TbUXgrT_7Vv: eܶ#m{8qK.t5fX,FzqDW_7l:uTD>ⵖA:d dFKg^fu.Dza*2u9f'C%iCJ[ߣ9p6&%LapdZ"nU2# m]y!9tDMp@i  ^Ȇ9\+9v̅(pIvvS{=S{*@Ԓǔ0ij,ÁKzP [om! Z!6b^fDIz֤5}H.\Q*A!d?5N{nߑRgedx[ .=VD@emɹ4)F\H+d'Ud2>HⳄX@Ve?HmA,GI=|b5B Li>sR#l"{_%1-pǧj^G|UhƓzDxm X#zP :9c[3Ǘ+ ?]`G>< 7 XPi"f٪am;@#eX[aHʗUxaR W2#+ZYΟ2S؛({K?V+ J.e%:?i/*[O)+M~HbG&&i\|&J<]wsj"C>g8-`םtGiGþy=(aZY˳]8?ney"?[E_m 6.j֣-ڴ׋m 7׋%EH\8 KHsBlҤe\)Zft20'i\0A:88`ehO;8,x#5.S P@jx&C^X/9_;ny !cొ+1J!澾āI-v _)P܂d'O]ɦXlʿP߈Rdl+6%k5Śɧ67X\ow@G>t69Ђ1Q@Q ( }j=.z[JńfOco(R 2Ǭ!%t<]_[s6OɛHUh5a]Bft~P!-lc xߖ}&-A !djf26_e3H^E`Kݒ"L f5ǫ|UZ)pj nzϯ*y:N12977 sT]v?ϗqR&cj`x k ChH\$zO{QÕAEW "# d j;+ybeìq{"w^J֓h$uԃZE2]C @UY)=c \ٴ+tzB=0A~Bk~ "I.unYh0h^X8ຆnU 5EYg*}TeyT۩w)cJ-y!x>EYc8᧲5u#W0 yO[s@;> Ƨ endstream endobj 3053 0 obj << /Length 2367 /Filter /FlateDecode >> stream x]sݿBO"%Ηfؤ.M6\mn Xt mֻrYè5vvc;:(;:2 eiK"`XnQ p@>nn W/u߽}_?>*dWϟP`(~ާ!bzm}[X0id@[n6HTAmt;~4;%#hV%bDH70"p$$6 1 )2 -($LhshX@0'Pz9]%d$"0,GX ̬q4ڈ5NXbT0Ę xd]НHr 5>OMr?hh5*DL#^W!-(Otwfyf4>@bcן0UTB "!`&KϬ5ĪVO`b8s 57&v폇ñ2}6]*~ ?7|9L! K|fR4sa|UsZYLPsHPaN(اbNg"444H|{.`m2Z?/(^וEU Uf3$jgzi,>Ykr,/e 9]tm1'#gQfӰG[(H۷n8 Ay*%jsT<7S ͔#Nn'q(+"VѵAP !cYӲXB!Hzc^1O !uoBl\fi/ibOGjn] Uu':Ɵ$EXEx1bż?tA9Q13ui*/!KG`OI&1 |MW}JD?djeA*.(+:c95͓z@aJepCտm\l4!-M!%2s}i&eptuty?ůAq{g=n{@.dH.Nmޔ)Cf-Mah&bຽ~eE\c'1%D2vE3y,HYMk-LfoefMr֜ Ҕ,3O2?%G؀TL_%y<$ 5/Z%F4k4. <)Ty-T>x.C^MJ&.Q7K ]Zvp Q/4xFY:a卣{]ϟ237b7>h.a ە[hYbq%M~EA{mIrGҋkzN| b]L$G! \]Y,)",Ozzm%tu>0^oz-r)~d~ͽW Q?[Xz5-"aKyҖnI⋳B/x`&Ӊ>6o#?bc2w Rtm-ZG oydwnAIo>Q/{t =W&g-ڶq7{^mZ`Zߕi+Ӻ{n_U;lUqXeZVw$7!ʑ< ջ8~<B)c 39Q:AnZ&,SُJ&0(V\PET:ظ!̊/ǼՁ9uCU̡xw]ɔ`ȝ:]<z,=.I6݀Э@ܠaӣ[*$ Z٦s(?@R*KбL=ٰج: TXWo<9I^oW^@tSn~8 0ߚcD#aDL\ؾ H"ӌ F4͗\diKFE 5!UG0?N X JmCUTזDSxvM&|nd]2L#xo5m|v!I$7>E_\ِW6Ɋ+I-N-L12Ն^R }@K|_R .z*BXm<;z M750~jb򝄫 C՝ @t 0cXȓ.O4{zU\n>DtWݽu 2 endstream endobj 3058 0 obj << /Length 1250 /Filter /FlateDecode >> stream xXKs6Wp|d_JTԜv:uHYI*qL*I?"ؚܞA7/HڕkƵo`h| DvG:>qes!*x2BqrM̲js5k#23 {\.~$/\~:8WjUr|gcvs_<@«OD@'e?1L ςRmJ Y0j@RhtFaTϪ_:}=Dg!@oAyZٍf \eQ3U6 #hPYhzI\ /z; I 9&-6eIEv")yo gV0*m}`?""vcq=@0E^+ǐv#4T EhZ޼gHuCL-QHZ-Hd;X׊qsz &6N59Ϟ\jИLx@kf;4fb9]hd+癱[ug ͡Ptd=Q]aw(vGV `yk lbt"m;z-wWEظB"38LOۇ7;XR=^GAZ~,{ĵs:H^}qȪ{n ]o@ ,cmm-# H_\E[!? 5c>][.Cm֟]VGOzg kMgJTa]̓o!"k'_w`d mikiG endstream endobj 3063 0 obj << /Length 122 /Filter /FlateDecode >> stream x]10{bK/.!"DCtR4ЙMKJ} \Ou>q{i/=9mW;wWj6{Wq&Ccr :15,x!} endstream endobj 3070 0 obj << /Length 1868 /Filter /FlateDecode >> stream xڝXߏF ~"/.ag`pթjkVU+ݏ.L6 6{Iӗ cY1{qs+E0 'mfq0[—I:gYv Ћ~KTwa,+TML ?5 Q)[|M_v,[:t/<>t[MB4uwB;m2-f5^l+{ݑސ ϺlgjRhAekuecEJ~䭮r Iy:3,IrfKmuIN9K= 2=CDa$`P8 em޽|y*WrQ1^1zzAm4aXQP"ZP=,R3}3D$Q2o_T$N6l@퉙X- f@mxՠR^V/t1tN}0O^3%%=p6!{X }<xlmVmN4_ȩ/RʮCfl+@2`S֖2elcUM헴g2b9noal#QQ'Ϸ/!Zʕ$F]b!R8:azs%{+E8.q`nT:(m t:+3ˆQe0=&l|w^dX/ya'GSB9Jd f5n[Uʹ=%JG ^Y7uX3t\C@91csƎī+5к^AKV"y$ZXL$DZc񉔳HGyڎ:wAtaGW_YGL`KnZ:p~;h!hQ-,+uuՇ5"yCr۶\++.EN|hMנg\ǻ'g@%LΛIc b&!㔾?5 w4DX!j( 7n:X 1rq!%\&djPۋmҶ(D+T!*鵮, f$LR//[/}STgH$G57"*B C6D{})hiCΈhKmiW@6PgS7eW,P}~j:nʄm^6n*%-7ڜO@T<  v5odbhL/֮9t KQ iS5G w-½q80ees|m7 os~:q8oZ@S*o;qQZCG\ګ6~*.Conx-Uz[ox5@:x|T[aNbwe)b$V5z7A~> stream xX[o6~ϯڌDݬ{HvPt <2m Ő8!yHSrۚ-,Qw>~FwN?x$ `t'Bh0/ _ahBIRF{߇cFNL8Ο_xpBoLW..bj:\'S?&$ 2})؂my]ufXEha65O9}_?{ z/WC;\mSN!ԥo78|S`UӟU޿I ~t85jVm!h37=  aVJG7qth\y5,mWݨ~WL=NR FUcG@zo"(6v| x׮j{2i{NF]koUTKLʊݞf-͍j8Ayu]O:eȦw ڌ^luFmۼ#3oU5tpcaWdW%0mJ_Ba9i@ 왽fE*>ڮr.4/<ho*f,ݺI_ گ@U]cWA]Ȝ2q8@p _aYZwଡڙ ^"Ex0 &ٞ܊*›r~M b?^'"?#QҷsU٭Υ ą=a)T>AeVatQRid;iY./ȔYQ%eWyy|ݨJ7cmkW heՄ6O(a\pfT0fb R!G䗲i ؛m޲ @r ܇, \3nybi0訔DxR祥yf0n(*QF){H2\_ZfMzmyVc*=v&s'q,tV -JP$@lq_BBoUj̸z(v!M ՝`Gfi16UTULscRp;6.8FUjJCjI+zAtKUjd+b7/4+#B{" ."16!v''z앆^3͆ێNR9f_v!쎵i:6O;a, zaں[b}567JbM` :5^{4XXءd:KGƮz_s릾%hY7]Njgl9SKڨF aneL/w}O%Lڝ\N04x ƶ}v?'㔽UhIa{NR`y<V sg>,9#'P&3*m>_A_Ő endstream endobj 3080 0 obj << /Length 1082 /Filter /FlateDecode >> stream xXn6}W.l(R7)M/n 4m1QZT)NDIU/b@) 9#Ҷl맋Ż[h t]ǚ?YcaYz|8U]Zr[Z]uܠcAvKi8up/6[eqCDvm"%;euN׶%˜˛MBzW%U|^K(:lBMx% A@nKԳm]L_C 'lMSkL6㷚dfק.Txcmc*.n9I&ںXfILuX'&k aBOrW @PUUBIDa%xU¢&*|C~ܒ?"^Mm2:XFe\;R#D ^ipu6F">v(L {GGy]ƉhcB@5Z#EEb-jEoɤCcr]„{*fSv$e4HM?]IlYw,'95YRDQw3Z[Zp Ef2> `c$B_NJ؄9f9&˿V Au$9]J.赐axpcX'*f :83k7ŶDF UOV8ݔ2QpG:Jt+)vU8~il!hA%!~'Qn~`Y 1[A&{]v`\)ի!7G"$?`dM%˙H%{|;[xwC EP4jL*'F#ߜmovqVUαUo8KS>dE:.mmIbgbd_\~؟Y/ID6k{nX"gmRy7O+QU>7\6X8~d_~_ endstream endobj 3095 0 obj << /Length 1514 /Filter /FlateDecode >> stream xX[o6~ϯ !),k<5 ٦-U>$KvnVbR9y$5r9B5MMV5u6,mԦZW&v10!fjO7/_O^ l l0ݾo:x0w /]!\ZqTaD=tA1ņ1/JCz@ iW;oF*`JUYgL;~Q_۴'&pm^ >,Rji۴CrO)+v;D4g d4bؖtQ$٩W/Ƭi0`ןC`C ǡiD!vUt˖X4[] @ }A:a8쑉Y*eqB~Xp}/^s7 "{1›jڋhT5Ia\q;.:!sTU%ŲLU ,TUEzgx>)]H#s}z zU2r~eu֍++$Vw0Qo(YP^ϻ5 0JdJfQޭT"(JZ% c~u 22pjy~̳`ᧃgXaX endstream endobj 3086 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 340.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3099 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiPV endstream endobj 3085 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/three.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3100 0 R /BBox [0 0 341 341] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3101 0 R >>/Font << /R8 3102 0 R>> >> /Length 14693 /Filter /FlateDecode >> stream x}K:r3L)Qi Нa0LGUzmU]8{Iŏ"Y,>/? W~ǏmK?g?>[t>,oaymMißZI<ƇaP<<,=E!6/K,8 \)A0AͰ40W+J^\g ΜRj F\Q,sLSam!h+o=> s4ԕ DE(:Vْ[g3.Qt\V([LZ^g\F`YmTP4nR#4V^Xhz+a.6;s1IC_{lqI3-5\|r#e*Ѵiy~o 㞕h=Q,uKWG-hW'ܷFSIZi[xjÄqʉk<̥z}~B=V IړS#GHZk'e*Ѵwy~Ƈj(̥+W+3ZWh]y*I2m7W_|xq֗p];azq&$ikON!ykmz֏j٪DWkZѺX2hVgZѺTe/o.Z{qA/.siy9m[qGv7s? ?M|o&3yߩ+}m9i٘96{{{ʛ>fB7 ;^*AֿJ=Le\Ip}ݧ4sHM,{P\Zdzl", Iw358%$4 4UOE?4¯x.Yo[l@ ޘ#ΏÐh 8Z[f35SD >MFJ6E܀YI~= YlJM IeOXblX`DV٠/4p-L ,u@kǵ =P9.Sx-;Z!%,RdQV`u`=.ӿ.k[ݼ_F/ Q8^S~de&jc0#Yx~Q.XM~eSиά,I`+SC n mM1'@o"Cɯl**,wHKgWAwdH(|·VF)äI15L+f 8:~W6+.rwec=vVmƪ{Ԍw~vr9{+5p[7P>S{ʆCjɓOږW6}un% ZLtI;~ue*IX O&O驳L!5dfD42JV)ƾ6Lz/U0]I6vyE'vm@|dvtlnnOfKT-HIsm !!/8k4I0q|H70+^jDUy?pSkPyt%痸u;֣Ё|j)M0|e 2Y8k i3$P6pӧN+7V/S::A0 kmP 22aJK5bļ} BWpCQu0Fu&jdQ;cj% ڊy^~e#oMO W6e*rd5ӍHEl7$kco( %$ðy0gԧCK͗TJдQXՃwʥ~ 9XrT矡g/ V~dRC[GV_LVqXP{X"q6o&5dS& GpR+jPLRQfQNdc=d;LFE}LFE(< ڏ7n/,gQQ &g:a~l eEHk,sjyAƿ`aCf"+ Nђ;ǥ]ܩNdȪVL‡ySc"qOd#Ef\X˟Uuma@{(\:R8=-4Vi&υM >!B j*L`a$C3X1q4"Zb FsD"oxoJB²P@TrhKV;zfF VC6*@Ijne5}[>j*"`Pܩkk?)wU>jLF }),Q㎭GV9*%Y,j~!􄁈(}\_L~@.)  mʋE1'tlZہQbUSyf? K0߭RGo t|ӨmlWUe#Of1f6;!qB+Zb Q.kE.}6ӘLo/hnCIh`$Ixi@e#EW瞼$Id%)LF>&d#MO}lLW,SZǦ .ě1yCԞ_`wơwFEYhe\nbjjnk(&FeGtXVSݏ5Xc d("k6vJڃj!B864YRTU-wՊHޯVJl|7I&~q־Fՠ8kg_pV|`-49L/ !HMuHF`3gw2et.N72(2b2N6:qQ- (m=rS-,^  &ƽs q~+55I6tU-c{=R0ɬDG꣍s=EkRD8("颺X+fLSJH,r(_9I4oIٕm^B:eK5Xb[` 6/rVwE$h\b=>j6QӃ6>_>th$ɴPӷWq1AAy>>E.nF{F=ʜ0(0( 8`Y"ĺ*($\>uQPߩX8XTl㐦yj-t4ѵ4BRZ-׃KxZjga5#n\]o h ?=nx,qҬUV>M=k=QQWͫYTԝ&? :.V3ZZsV~gtf2(]WaV@PL̻Gֺp: gv ٕ*dOS;zx)2~k4b-Q`:lsD9f>bL֮9H[ ['0r8 3 .͓81OSd 0| Shn6/*F}IXI()GVrJQ1[ҳX=xj=hE| kǟtcиqB(s9TVP)}9|62WXiyYdXÁhiF)UҮx\:=}[֒yh8L~g\uON`w {4JŨ娽ݣ`MK0|IRIp9v ]>V_-WU`4K2cnB>؃Pzro˭l+൰blƽ?ʀRѕa;u bΡle}wtZijRұ̳K݃ェƒFQ!;vjYA! n0F7]dP,;QOE6VnFG]LFG9xWZ1A6ޅ&tV,)u"8gYKˢ)Iwo&Ż(Z¨;fR&)$GrDp iC7JH#L.  go۞J]ْ *g=Egj Om2i*d#~_d0"{4. kG9ꯍDa_>2Iҷ]Id,ʠ}lԗDi .cΗBiøuIP L6B L6j sh0 H?V0`zXR>MZE8X74iW)09ݳUu7Lmn&s]JrO0pJ7fM;e NW93i.tt*=wBeJ5Eu9#i]hlY+PFtQ f`Q/֦I ޢΰxf"6+QZ}n,e66RQ BB6 ?ІkLd>m Y>NSv]cwu{&C|)I@ '^_sejA$bFF 8g*"n ;Cy*qXD]ƧBPL \k66@j&_r0˘6jK4+&I/ZM%$і~\]6F1_XMAٴ7eӾI眃Z?* G^%˘ޏDw^ `lS&WN*]إTIh|Z7؉,+].s>57`. l*,L!L3Gh>~]ҡajg~gAep2p3I*O@OSIME,=G;sg[':uD_HZz[ur;z.%ZzTHZzϝ5{Yŋ?{q8_OYYSv}|Ж6hȑ3y>rbE`ofŒsAG=t]_NfbKr 9,Y~5|le$`?`>L0>p$]4ۂqLAϕ d$6.T2IKY%s1)蹒H y\o%tf!;xY ~A9N(υI1Z-8kv-=vgN\c̖?gͅ>8-t1CjVK/K1[*m"zZǏ>>nj^pr)$\h1/UtXm?P+LBϕ09F݄Q\(z vr}9O17g''~?c4/n̊'28|ɨv]:mp(%$-=A&Q9fc)s!2Sk:fpLΈ.Q}#XC@HZdFD/~f>_csK25fRk%x];?7g^HZNa z|0@­Wu`)|&I? |X&J? ןkF׉ IH?C9jP|_yS\m1ƭ =|nb[{{̍|3,:ϳ o?Əd:aU`<#i4/lGs<qL×.knM+z9\8[i܅ Ƌ_q0d0]Ǥ3CS'w $~ WHBxmu$tM\CQ7s1ۘnf7&i@JڃIiw_yi`zvg'~=y+gnNK7> "'`W£:TfSuL [į;4 |>.,11P]yOL {ZMt0@1~sz&'^u}8@,if,dz,]9ڞxYf" (|0 %$lBcPi0~:>Ej..:"N+t> Vbe 幐4f4ͫW^` @>vn6l܉&6>|Pk( #BdDžٌ!=J=<ƪ^ֈ<8_[3LM?w#țXÃw ?FD";~6P4H~ @_P$-=,/?OֺYq>4&$-=l;/; /2ʍ2(ғ_^rZ1U-!i^H%ƣ!8KT_dyCZG5?0X>2(}JDKQAfʻ@ѵXB56ehF#jHX Q[kY`򋫭r\蓌f\ubQ.@-yy.eJ:7ZO&Ml&+?Xf^ S]\F˯Նw},̯WFxP_QT TƔf,>ϳ򎔫4aᱶ4#TƔA ӞE_{ Ӱ`^ic3eޘ2D<℟ЇT\eK`Ͽzr3f-X*4A.epz^vOh՞.s1i`if1hsU/*fK<{6j~!d I6Υ|9P9仚wQM!ێѱ+~̺+1epַTj}M:rQiwi;f;)}7S7Z y3T@W+jí%7ے.=[0[knkj;> ~7CC@{$qA =^W/ů}En<( ˽\HPeZ?xoE#65W6#._c0^hFs#.]+$+݅u n!I^j?P;ݴ | z.υD~$7 icW/VDA928㌄?Ҥc腤Gz3(q Km@8js05A> 8IC1?a }xD/$ =ǎϻ7T/heo #$ =[}9ϷAo"7!ϵA",=xU^({#yo|9j-N*bFqPPX-"{,&hB7:ե ,.'qݺ*:wQx5.b7xXj pkZ0=7BUTGA\I>j6pSaԊr.>ߔ!PH }>6p_pe-e`źVT[CL9ռNڞtǣK@q򈫝RL]k kWV,`60/"pռ5Qk@J27 e.r8*E/e]&.99*Cޘ2CJ7=P޽GE^B$(nLȫR]`i}Z1Hh}!F-CTsyR}w'\NQe&`M:X#ְ1%.,@_R*-ejCC85zaM7Wz72*emRۦN i@3{YfzL< |.8ƦG>КWqoǡ :^&[>#TƔA֏`ӈyi_>JCy7m&F#Bu)u}!l)tu{ڦr U2ӥqpDN S]P;nÆ/&wEӭ8Bu)uwǪ>T2XyO zR֚;3T mt`TƖA#|NPpt4cJx>0,]["Θޘ2(ٶ=sQ0w=Jy/ePBPP?dgVNx036lIYpX#YK?1,ѝ wP3x?)&hWpuVTrZ)s㖣{!V4-Ъ ֹqUo%;& h+ ե 5Lc=b{OkEJw4IBY.eNE֚ٓD5K&].e}'}Pswut3$ %!ޘ2Pynԗ_l022ziâs?T'z1G8B#՗?[{>p|#V}QOl|[ĴEs"o6`1e8m}GpSVZ )8to7 ]62hjư=lT*& 5jȢ +HQ1ebyh)q8g5i1bl(A/z'SA ~WلP£!|:E(6=E/Vd*oRy]g;\vebmWPK(`QEW:u>aZq5W֕_36YA.e9=S;$ V ӋRRYb]|ӚE;'q<TƔA?;{tc=n7j3q-Q.T2f:}?4Z=y'G98Q VeWA /c!MwY`gLEoL8֊VP^ bZБiR 2^=SkơyGA; fF[!wWw=7;R;#7ґr#.-$K{'wC\q$k;Czugt{;fĥ~Dpq A~eVn#F2!\G;^Ƶ1~g*yZL3KLH°`&tVnO޽šQb}+]?c?O#4߾2;s`Op#$ =g&i&yIŸn !i?1YtĭLpB/$ qn^nј $+8B{nL }2J g7Z$u%&*Rכ~R]+vJ Bޤɜj)W.-F}5~uHuI;a !NeˆJKD߫HMbsj7 ~Ȧ6V)$KR7Te| AF|xPcԂ+^YfgM터ޒB-0Q[X&ܴh8r `UрU.efߔF-Z+TktW3a-D>iHANFxǴAkG2+/A֛zE3VT+eQ_F*80h`EpA\qRSaFn5lE$dil݌Ub_^1os5})ݷteШ63W}n$àˊB7Sِa$(.2e.=|eg (ܗD1=2>>MWAf|׽u7v7GlvZ ϓSc7B%<˛enDsM6hc*]EVP]@*]g?tHfW~V\g՜UDʍ0]&}p.nt͔P)z)11$<+,|oefL>vV\wv2bUBeq[sO"ۖ\bEnRRI}vdVۮD/r 2DuuVl5"=sGkas/Vej#X5&1JX{zi v7D@X`*.hÝ>2cG (XODA'=IYdH{GIY?،cY*]1"&9s8Zojֿ't$]敖 U] RüP2Zs⓬1Hp 1hK3[NuK?N6Y $*uU T *)Ac2\`mY[D*ѶjGݴoh@u*j"XECjQO-Oޡl U?S'wgL`~q|oo?߿?~O?αi3omJ@SE<'ϊo:7jMim]MT2JxK{uEEOǟ?5Enf-;ױuH%mQCDji5᳨TŇ]_~XtFm!XWCTijB] %|[c):bUE$ΫZ;|H-K˪Yy)N[Um]dY(Ry:my!CͪV*k}-aAK ߭+XG=j`qE88ۿy`o;Y͛"~|"l*΢T|SNpZ/w|u>q> stream x}PTen a|” "sXĨ#Z bAі4 +~-]@7$@:e"tos9g>yIoB$"T*RjK-ڙkyH3o3%"O][JL dCZ;Qt*O>_:%sqq07$?;kF[V"ωt ;+G-<2GN+,)r R2P/A)ҕ*dž^>}"'3H H‡0',1 KŠ k†XCGXr>F\'fHYINl11)07E<}Q 4=# cWl<4ϰ7bW?=y[Un2A|G1c?_aO <65fC╈fD8e*5"i70EyR5Sx@,EX=zOmwǐ?\B6]W4ėKd-CV7l%[wqA^aoHX'ף$~)(2FT=TML@>/'˂:Gy.1Dp~ѫnLGfdI >QHƄg4zn"S(B{+w8jj \GqOmVrfeM/Εן#(ȁ|M*`•=}Mʪ_h6r(͏7duE4r<=0b?|xVW0>R݊rU`իYGZ`:^:49y5[ocF{ppZP$G)uW>Rv*Nk!j\1ecP Ck䱧 ;/^m6ܜ 2 mAUۋ!h UeD+?N=!5!LO;wQ)KOT#˨ygwЂL&[4B>> stream x+2T0B˥kiP] endstream endobj 3087 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/threeg.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3106 0 R /BBox [0 0 341 341] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3107 0 R >>/Font << /R8 3108 0 R>> >> /Length 4731 /Filter /FlateDecode >> stream xˎ_k>DJ5| `m(#J$jpwW"*Ʈ7~)8|;@81X\p0_{F*0#IqI1 9H }w)p|%Tt B iI[+\'p0([ 7`RHy)Jkp X=>mӔBt1DIHfg41$KFhGĤԘLM,OLEdoqxdy笯uo>]nxǯ)kkz!>]|vbf>]3&c~R6(FmR .TZ-ïU҈aAA3]$!. @"dxKTŭ 簠FN{9Sr!w=26DvA^#|@%ÜʜA?nD="O9j;NZj:N稍t xoYޡG)+E1̺@3Kg;3"0ȹQNm) &AA ^mpfPd$RH%ŢffzI +u7IEe/*U<7!:BM::g :)Gi)Je!SlQ$ 'f 7:a EJ ǔ?9$HKgPmu5](<@cӁrz!olTTE%J$i,,Hg)g?*s29t*&ffD0H{6}dΉ.7<[m36u ;P393P[Y %WleȬ-@,ea {CorOc^EcIiLP$$0L!?k$Έ'$znTv- m\RFҍcvRK&Hgnq+NbV&},viQI*dґ "$e6i섰Φ>] #11 "QBW'v[e))7mssk%vϸ=fl'{3 8xrR)E.ϸ a(n7BZ8aݸ_UMG|0+ zgPPդTt~ ^ B bLtn/.`QxA x=d3Z3T\ ŜreFk֫7"mdvi 9YR$@CBxRfq֜[+ nÌ֚;oDrЌr"6d)7褉1Y0HD lpF /LFhR^]෋&Ƭ6.tcDn.7|wK2a 1zZ ]u7p)E0jLXm&SN45К6tґ1,h`J0J$K/]iMhE-ٹO-5%9Lv=ێ$x%9$GJ)4͉eRHKqLE3#4.8iLu6./ˌl=IkY(#֨K7^$@E;Acjz<a`V&}'[ROsf)K6,FD#{J6BI?Sw.ra4#11RŲ'w0o OlHx#l(^QlFOl(. IWLn`,u$g{B loOJ^aV9&["q f)cMlj>JHkQ$$ċ4h$qNoQJkiW1 zD7mL# P!KɱAR@ ssF+[DU/o\YQ2!t,,XޔL73es/؝&w˔켷K.?kR6{+RJƀ`>ؘ2oF\@|аیɲ%۔Mݔ2F_?!n`G'm Gffli6WmRnsvq|NB&ga};j(q|T7͙%;6զ]D!gq1dx}lw;탉s0~>8֒MfQQ2opgF+q luoHɕu9(6QmF-f?oG#Jݼ3vNR4Ϙs8c/=6g)}Ԥ yahgFVYoJuژ]~l[ZGڟ2m- ¿qZz1ބ?rMċggVn:~X=u}1q|`5utZGzgj*FLC+,!H~FP;WW >`5kD*[2/|6vXګ\Ǫ|W0zƓi{#`(L;˲ƇZ>CDp o?Nzn!/NLA|]{BjisW#Hq\j?0-;?~ΒqhO'T1VS##o+8|ԹSr\(F 'Oj㦆$Dgh/@qg#%ٳx4&dMЙ0 *9P8=  H,U/|MSJĂZS$]8^d5ԟeN-C^[X-zTZ^1*Oуe!'yEȝ4e{F_{;)O*@=hwfRAWQ嵩'q\PqP\Uj`j0ٴS'QUB0턤 g#* (:.Ыd鬒Df-n^zHzEju^{4uJ; 'YUΛOUu_ŞM]NʂTQ~WKBSMS#+5_"Hn럲'{N '@=@'jKU#uw܊ Q NIP8UDў6hO1k#YpG xbr 8\^s%M-]P2;0>fw3A\;2aAt W%&/A~XbZԲm&mb:NB33N>{=b^vLpg:3HJq:-o;غRi]=ez퇭UVץpG' ;޿ҀP8BJ-~iVpM%j"Fr'O߲gkuJ5!U}]qग/B=(GYmck]Օ3rherD7ށW*wP%SsU MSê^磋)1ôk!\~Oq0##cc+f?WKjig ^{rƝ@=cdۼ^?=O [ۋo]6׆-.*Sk+f'Qt_-{&~ k ;bۅq/0\7K݃ժ^_?ӿ|_qBuѹ0Ʊ/)%;$K|ZWǗkyyY33W`a<@MjS3؂jlm ֱC'8aak 1f3d2]qRJCd zVt>@PƮdٙZupG>HW%НXd Jzlb=̟|؊ju|; G~8Oԝn㿉)_m]Kx&f(W{-N6K=3j>@rv0 ?neSH6/ 35 WH4+V+0QA~:_ cC!8BBJּ:aacZg΃"R27闟OrZEg8>ȵ.zx͢N> stream x{TgىA"Epg +ZR\DwO'Zmc Āh%U@QQ!B y9=<$IS(9iI Ko)əpk(gd^%ZKHWtUf$ԇ?|WBt jgx:Yi{rd]dv(Re"OT)sTٲlY,\L7a럐Popr"sfgOD$!' /bC>a@HCFI&B0QBŸA̐"٬ӫ3)@."Q":s8!^|3^mq۲<ɻ p H f/EniH#8=x>^hI[s2R/C)&1{.I_~H3ZZ|.gM<CxY(`ˣt]TQz˻!Ҋq x/(*2mlBV5ь? IOc`| AҔ?D nk:؟@[SSK&Q e(J0:Pkii k 3]?w@ԓݝДKh=S&g)>?N-jy#·F40uV`GN>Fj!h$`?T)tGˆHMl1OzxiJz{[Nj`vOK-+[lu6_H'S-g_hjFVUA6s剠b{&a0 w1\ً0(ȂG{4$7aA/Nhs]DO:4#i$/,4r;SE[́5`êDbDжLzwx y\%s0ܑwJo}fֽ91$0׿({ 1>m}:JfqpA&HǍ!FG{boW!Q o”ch=oh~BAaG15XkWwdg% B iXe^>up vvLi{^l~ߑ7H PD-H͜" 9J/*JbCuuǿ]Iۓ endstream endobj 3119 0 obj << /Length 853 /Filter /FlateDecode >> stream xVMs0+|,-;)Nt:mF80SǤߕ% $v:̠E>>G< r:v3`tMAԛ|``5,#&0%$("f8H{O)wwL˴U7ȏR  :qMk)n}`> stream x+2T0B˥kiPd endstream endobj 3089 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/likegnu.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3123 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 3124 0 R >>>> /Length 137 /Filter /FlateDecode >> stream xE1 sUq$ yJ C@kf=orV> stream x+2T0B˥kh`U endstream endobj 3113 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/hsv.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3126 0 R /BBox [0 0 300 225] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 3127 0 R >>/XObject << /R8 3128 0 R >>>> /Length 60 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`l`R022Qz@S : |@  y endstream endobj 3128 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 300 /Height 225 /BitsPerComponent 8 /Filter /DCTDecode /Length 20829 >> stream AdobedC       C  , }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ( (gQKb\nHhj}ƣS}Ú='ޗ+]{ZCQIC}X ( ( ( ( ( ( (7 6bn7|W [9Bx_*Oov WK3bTi~/nkxioabÄU({'7M㵲ˉ?_c,(׳|I|+m|F$KU?.ushI`i_SFKaxĚ R4V گ* nfL ~L }xp8u=Etm ym^<㣦#:Pu{-FMnl.#q2ppP@P@P@P@P@h za\(`ݴBjIexxkGVu'bh7<{4WtvN,V%Ӌkx #3[oc-ψ_4ffZa_M,n=R<<0r."J|FG[YU4~5-wCV&ܻ58^pm,}ng<> xNk5+SU~[MFW;7 Y> R}<8/rxR3ӴO>%`uaȉkўyecoCQ6gIs6%4K}&Fu [U_o6Ee_\WR[+#U?Ht <5:ş}i5׌_$fk)xCMۭ~i~gb8v7o ؿ__M^#ÿ陲?g/ʟ_[L*O3ʫkӴ5@6٧oھnk4'K2=Ob"|jXePh&Xor{ʑۥ7 bU4yuk9 >*ї^լ#vuM2H.hv>kyySEz-3:CQt-TCUa//ݮgY[v3С`;=L VF m[጖W?ŷoUX6*8ԍEaԎrCVBj ( ( ( ( fpL<{|A\\]?DO-mc]s-^ S%qn_?? i-/>|6xn&wUh;~V-^+qHyZv9%Ʃtdi]X#nw9'f`f0R劍435?xK἖{oW+G=W֦V]˶s/e< /eYvU **ŨV|e҄ǏZU+m[mRw|nEx;)kEr?V:yV>5noxcgĄcA=BAtmo\1ȳrO54`^_| 'fy~.Ѣi=*ηIk^?s#T2~ŗaK(>!b5%.i5~~-}Wv+~{>]uxίvP|d,W/,Z,*qM?r3鏅?/|{oy_;T,"Qm~6' L LpGl~|&mcVΌo(S+[A_v99S|VgqN/Fz9(Z( 7xV@ ( ( VE3[xJIo-/6fXЍy=| 5(ߘNŚoz%nUW5bV!e5Rg>o>/Oz>5 .bYHiei$UT~"ݯ^=[gxL\r~}~:K>;῅#м3Ѥ\~]ZFT2Ge|;&γQwI~/wÐke~v7#[p] l>/*B9j՜[45[o[9>{4jy_3oݚ, ~ ۦ[|YGUj5w͛MΏZ?j~%H.WѶu++WW}!pNgS{4y+ƾaCY_!dZ1}GJF>7P7@ -@ gڧ6H!O.?m.lݱ} lwwe>|v?_/ǷsC^+td%Z @3om4F-쭢yVڱFs3}RnfGxďn;K5L㑖ey_tT[fTlLoV^OX]/Sͤgxz1r{XψKź1am[iVT]>ǻI$jOOu(nMiv$#08Iu&;k֥Gi?.Z|7dwvrv O7}i}D3WqAtfg1*tOkx8gy|yz{:mk9W;4/wtG5<Lt|wc OuC5}wsOkxXS{\3?3qf%͝꥙pdx8-9u0=w~!-"H+i#iٺgUGo:0|8'vfhz6P|;&왞mܪkygu_g$yO ׃qkx>kڷ[|*dV߃t% ڽkU]˹U0ˉ>ۃ ތVtK-6[T.-JFۖ']+-}.7!)6~;9U^ͧ;=Qz w\🍭O.O7,EJqV<~EҾ@% Ao=>HPh`e܋&ߕ}7PyKkɒX𗃖Vcdoo>_%w˯[S %cOƸNi[vϴ| KVsivCXXFU5 KI`A&z5qc9Z׆Cjqymŵ_7jΤbSM)wG=J>w+[-[ڻx |Jp}׭ w?c5pJ[{嶭½|]j_؞/8 #332o# k9<\طOBR̨?z_ CգIntRH/w$ȿ++.~#kpFxZ3l4:3w;?M_YxNoac>ZnIn?h2x4ݿ39U;k-ؾozx\&c]rr'vqn-w-u_Kgr뮗}j\š$p *f{ řeSmue]kbP3\y]cE5չҹgdpu╡O݅hw?vmXt'5 sEK5"j$K:ƤɈv-j_WU;"IԾ^UX;;^WV7q5s>^MXj|&/^}^knxX5}sqއ%y}yu#a;/-\1Ӫ*9b~|I7I<a#+_=78wu4&f ?넟 |W# hz/~Sn;Geom-7᳼5m+%Ag t <}o`Of<1EiSmh/dqGBGޣ-c8GO96٦hi:/O unV*$-_UVԿگFeR}*~EN}~UޜqZ֭^k'X8C|Wgcʙ{&>G]yȭ)SV>cχҜm#4]OeH{!+p,\yqCb">OxJ4n'圣~uYc(N߁u'#ɘh~ x,^B^":nA2AoWE,KVNZ<(:6!vqk=瓮Jws%aPTԺ|UG^:j uUe[xF\0QxWGy}pϞt4^jq/گ6O59K̩9[ϒ_Z#]C~g$ \?: >?j_馴{ЙCQ a??~µ躳tOlKr /;o> [xI/<)J=w??ۘYk&b" OZr}.~klQkjK= MOYu]jf4j][Y6,/ MS((Ml-6m Ǧk퇉.ĖJ6ѵͲ96Uz'czu 'zTiXF MonO?Ež(uuoEn*n}h5K1*w#мYjZ^#}55|_YU7/ͷn40Y_Ԙ܋> xj77u+)m2]Ml.yv~㰔UzSZ96z\wSI/ݱ.'źɭQI\\\[vTe`g5Z3eԿگoyM '_aA#u 5V.7xxթK=&Smla;[isi uV`pb5? NV.l!ct׀VOY|A}׵'o/[av5gGJk|CK҆[/=/÷%Wx+Uȫ_oJKcѥ9=T{DOHiMn(jO&ǻccPb]j_WDy5և5wtΪ;W$^9uiDgw͓tq+k\5K V<⾜`GD?I[pϒ|ś29tmOm甞tm$njVUoOۣf~o˶2\CW*嗺Ry <}ύ^ J]ixNk|ȳFۣ\\kԲF2|ss6 'kco.YVUjnVzgW\N 2^~4FhŦ _>`s?HHo9omȹ[0{UyI4Q?mT}ޥG4ݩ > E{6=o"T.u/!2kZRnNW4^Ge͜W:)3Rh?ګ-LfQj}8#E5.~}k"Ծ_^kREwԿگ{hhNMK_CVpTy9lԠ_z.Wg!-Cn.|эW=s+3PjRRW^z9Q\_|z꼍l|.3{WRc籔O>Z_l듑\*R԰Uz'KCھGflikh_>ۆ&̽#jρ[> /Ɉ\YKTFOE}{̧GЖc[$'W(sl&s8+K㨏&9KQ=dfiW~o>-DjΊsFx$;v9KCzX>[:O49ϩǭsjR9K W,cK_KHo$j>EjX _s\A+^җ#+W]o w/V~#mi~>r?7^E{|_O=|^~g>|;d5>\)je6ZP~{zL.}hAseqܡqMRj<>e9u/puᶡ|E4{mWʷ8|Au ն*?r:.94[Y習O-mFi6V&XyOOy:^i7z &i[j>ƶ*KsW7W y5鶎zr{O_ O4$_GӸ/~GJF}IV=?oKїK㏪?/ mvUӽIzqGߺ_R#'-_<hKR.+wG~G3%?گN=F.N2SPWqEѨs١OSl{t 9_WBRj_WB:uN|RwュZD{|t'ZxwFGIZO79 ̩ikbK/ٝĤcxtmޞ+,6]?s9/aσw_K&-{֤>#n(}' O-K)ykHIJ{˭>74+O+Zr_>"l,5gFû.ッS}L>[0Fv>s uxW–7,_IhncEs?>]ۿ]-wIxnx\,Ʀ"sq3_^|x;K W2N*t{TH?"_JHk:_ }z]([4*ǵso/F]?>^3yVUsN%ף?ݯCܴk |}J_Gz?WPjiQ:լijg)MCRg,iu/WF'_^g,U/ڡ NiSRjw3}nFWZ$p06kbw>JB}-__ix?|}O1jV?f]_ZUyJ[n崔{'2xص?pno#E/ j|1q\Ƹq"ǻ"s&'_-ԥƏA$ 02o Am.ߗ栣?x ëj7+x\^k&ֻnE1Wf`HBΡT<*mK3ͨW, >y.,M50ؓmxsg}"j▓|5S]Ϯ/jxaӴ8uxesXxcVT40Z<32&+zb渘N|S5UU#~y^q}rJ:LŻ7oPש_?_Dح$UM/z#/c#OS]B{\6j*|к?^m_Z_g9|ԣ?qzףmO5)zX>yxkemV:G~Ggx.ZhmT-L.z4)#LzirIk^i2\zP1WԿگVN9;P>3)wEop~36 Q%^!qjW4y5B[\FlWȭdS3ǭF̡%U*s[#̯bVo\ӣ\]ŵ\q;>V`σmolk'Z>%_z.h{^ '8][u3.1ew[ S}?M@z/ڊG#o:ePmK\8- .~rNjSF?j3\xcjW<s˚ly(e}c(#t2.?u? 9O^/#Ht$pz]B{\6jg#'o6/-[Bj7y^WS WԥTpז?a2'zy;Տ~<>xQi{GPjRRuW}N7UҧcAޯNY2UR"_WN& zy$_aэ<wfJd9?گ>Q<ȨɫW$yU)O62\".2yW/'s͕+|wsIY_n_Z>)l'~h󗥃LKTt |_Ng:ܸ,la:{,;! kvh|k'~uACu/ #kC6MKH=m{ed3ث5~GCM q*|,|H?Kͷ7Bj5y3a?umoj\g}o .>"ߜSh/0G>|{>x6ԮuLCF0/30mKSsɕ_Rj*P1e 5/ҧzy GxOѫ^Xj|wu1CJd:Nq'HCN EWje̩LڮiDjSԮW5Hujz ϛW?!:ES?uʖ_o_OӂWGӶϛ..,OT:7[2|"_xIҸ Srj?@ƷjӾ?K=g:ϩYE'ԿڬZ8U<;%(yj_6v?ڪ"[ѮRf2`u/х3 2udʲ_WN'Կڮq!4g6={ZoZ줌<<]Կj* 俴?ڮwnDVR 5U(|Dל}P8L+ @M[Ϛp"rjc F^]Z͇xWO?QJC5ӶϘnsF:|פd5Xo+ЙpѾ3%b~ݗg>3G^[)tϑRjh)>CF2GgR?arT$M5c*hUs8^P)U:e+5 S#$3z?C_G=ttFkʓَ;}z7jƝϦGX_~ojjRWDԖMߕ?D|u՘80џ2>q::#KW}CpL?ڮR0l/"}K32UN&e95/t kP?iQ{oZ餉GD?D]?j*D¢8'H??ڬePn*P8L U:c UpΐyV.'\/?ڤGYomwzo$z*vU_W7|?SB6 +bPׯ=|tF֤!۩j_7o ܄;k?-^Zzk[+w>oG]XmϕPj- %"UƉ-ΡtF 6uƙewԿڮ!_WD!BMKoWd#bw7S1zDa#P'73sR!U.&2DX'4;VN'5ǻZlLK&ΥmeG)?ڣ\-}G)ƵTL2#ySO )0a5*4l(E w#[@€"\ˏ!vzUegOTo)h}Ya]< =2:N8>L}CRЧ"UƐϨ]1lUiU/4l&kn "wcL <3 gVt鷚51̭$J5UVa^5/o :Z=֢xFWUVVVݹhHh?کhɢujq3q%T8Jn~bc*cU2Tbsʑl^|2V>Co;MӤUJ3 NԤ|wy7QqB;߀7ho[ z4ՑYڂpu0t4Ag??'෍u _>m[HnnmۧZdUYYZόᑿk6N]4"~?n_?h%_d_GWMO(Pȟď'.9C A~$9wQ_d/OWM:hg2eF &T?d?_>$o~7R~ |"k iV6wc %xOeeeTjzX 7?m5ivur*\գmMm}~ooQyL4-릭;csj N]CP _RjTErUF ~ ex xL[kOIqT3Kr↶}v Nm}ҶXW2J?P0?d6a9omUV PߚV}v~na`5ƸU/ih)tcFek2@??đwy_[I[ \ypnjMmex?MP;+=7̻T  x1nז6mhmMZryw_6> oG,,1JP+?߲o_^7Ov/J/ok}u@}i~covY[Kq/UWJi fM%gjZVXip\,ʿeoXW>,v`Լ/w^Z~~`X1|MѾѨ|~tLud_2&o\#/~!"m24m{o꧔xr]5Kɕ$}4N_'q3NUF:aWžWOh ^yW[{=>=O#%&fU~f;t;q5׈uxܫXOs|JF>0 ( ( ( B3@Km7k(U(c[/̿-|%6>)X<%h3Ymusu5vDVxkmf+R_?g/][8Omd_YV@sY鶰YEmi q[AKUEPE-P@P@P;h.! Y uV@|\}~]WckͬxMgXw#Hڀ>F灿h|3tK="/l}9ᤒh6V5oW)K*h/-VB=Gź܏!,q>̠ ( ( ( ( *( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( endstream endobj 3116 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 499.999 299.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3129 0 R /Length 31 /Filter /FlateDecode >> stream x+2T0B˥kh`U endstream endobj 3115 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/threehsv.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3130 0 R /BBox [0 0 500 300] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3131 0 R >>/Font << /R8 3132 0 R>> >> /Length 11048 /Filter /FlateDecode >> stream x]ɮ,qݿK{L2ǭR A%Pÿ"É$n c{ZxOןc(_c]u._OiZh5/Dbb?ĄHC^$&*L׉nСb&=퇺$.2|?ܩ# _'KNj:5Yq~/Z<:k3GY6f؛G__ikZ4,_c2R!ja+̤f!'x`R_> Z|V'VDs ך>(pV*CAeX;R1$aC闙vRQ+W{j޺^c=53~42D9+qBC/;vK"D$/mn/]drdXNpucdB?%{̑$3 i/"ȶH*Gd J]lVHuʟhL' zAR %(UdQ"T 687 sd|6gWYGH՚<6ܳFocqʥ hW0$ I,(#l$#10k+aj qy,9fnQt(H駙QlE)P5b{͜=FPOx"Xg i^.o&G . \q`-D/z]Wٹ ~MXͰ^;WE*{'ґ iol bj0/4"uS0h?VUأwntVKs{܂C4x82ydUD/2wspT7:Au@]]Ұ eR"=xqo@dF]7u #qC)*7=ظU78rDV=g!8쐉0g A5 1ǙR^XfDвj5'I,5H&h.g\Lد4  r zb̈xW]uQYy.i=!Bϑ%z:@"=\*Rmi!*y EWĥm"GXALDwH +W2;g1 6尶uUF3 2AZ8E:ȴг Uu4r4BR=2*6g%Y_xa}ToNX4oގ:u_12qFK)/XƠW } Dl0m%+M %,4Ml6 !i "rg4sTO"^ʪINe-GU=iɅtr] ݲXV {iNgH%,] ͛VW|%f8]7ޤ.9y] 7+ϙ2'vָx}W_ná""pZ9*:p h7h4Uj]5?@O-b5qffE4Z"(zݪhW1P*pcl r蝹\XȜTyxw.8Fz8`!@ra$i6|.st`}`&)Ww{&̜Hk|KA[}.8n_YlUj+ S2j0;TѶ/tDxn(Yo3xceS4Z"ttnxoHGjcBifi@e5IRX Iwf!wd;L}zWW[Otd6o'$m5׏'/7{\wvM:E+do'\ys 疨ASB$TB@`KgV>.k3 &QP p=Ǖ }y wg& >dcc<CI$r#bNSz 8j_C@No *cMt7:=4$4*`:ӵՇlt&VK:}lv|hC{bcхg053RЧ#ӥVYV-ʑSzZw5 3@z~Nvv0B0q߷|^o6#uR#0E53!͒mN:s]!!%mN3 T*ƬfNaSYAt#9`)ϒ`2{}l2 Vx-zI'&X1zu &βNV`o7I*6jkuX*i ]2tkę^5:J:[Er*7֛DHN㳷G9ƪQ=R۠Jz+[hC{RϽM=7?{^/t!YPv_F7aO1FQ{M jk1MQ\4^%`g,="L}I챸&m, {&F&Q`҈ܒ6) Q/6)BIzhJq kA֪/THː^/"ARJͯDIȉ,^M}\-I`GN#+9<\<--ўF y0{+ Na> (R|3QcjQtAM{oiwR d !6YJ݉1ΝfUv/2Q:YŠ7gg;Q1*JᒹBUhnRHnb8`T2;"^ɿQ?(9U,wdd[ 6)dny|oy۱BEmMz9}$P{smyF13>ӸI@!+B`h0]y48%N; fdBV0+c(*E%1W2Q 8cz1&õH?wg4נ)(QwTJEWwuVC=2F8pv]g gUfk%>QĚ``89iA3_vt zcFUzj?^{։P=(ѓhӅY~d~*/7V/vYU "Le+IsLJ_[0oAzMFM4Pn 1t ?&9Fhx8WoSm 䴰1q8 G~h7p~N]+ D-ZJBj8`{љrϺB6v[Și$.,Obia|1{*."@oāi@D4 moίӈbvcI8Z`@SbX=?M, C"A ;^ƳiZ ٳB %1Tٕ yIx[%CXkSx%V] Ks ~SXY &RqP=R0.zbsep k 2^2D^u$>l]GXvM:3҂vj|$Rxsfߥ1mx (GХu)m|J}}BH}LN 4޾Iqc:8p|Vy 2J𔈴=%B%Sj:";}z^_‡qiD87%蠋H3v& ir)2k 08SM[ 3*x.// ݝlX"y%3~DUT1?9\[ž4q{ȋGX"Q)kօ( :?L\r.f5Q_\Ftƪ s-VOHb3kq#G kB_ w>2 y".˪ F%$B:@6?c>}GCm q.anV+:L5sީDipͅ01hd]HJH.YDɲ1z:azBx f7I]2GW vb[o!D4kf>m!/J>Piۡ BUl44t{[ߎQv!$q>*/(~5>Lε$-žvFʴ!kjqCMl7eVh/hiQҩ(߬nBִcmZP~2)t?* *u"T(Ǡ]gENzPW>1[~rUR){0.XqBX%3}ܧ81CgaEFnd- -pZ@`>3PrCe2*!p+HR+{PzO2'R§;Lٯ \CBThMUzvα4ֵ]ms2aSLɳ;fP$>|27B) $ntd-[?t U@yh@* es:5I$"lg6I@*Ÿ^m!.E G!T\HL>o|z윩6rvW Wz!$]۔1SF ꯫Jǚ^2EX&ee )!G-U0G{^Bǿ( [c҇=$8]Y\XLJNpN14p;4A-‘~WFYZv]21Uu&N2JM.SjDO`EU !>z5;]޸3jj|ؐu'E/pcM x7& T"QH P/ans/Sm@V>! dEX LoӺ ( E$~APlw+?=I+<]7\zӺ 2Ȕ1+(j8"r>3!T6nJݣpm9% H~rcvX;VZTqiuC{Va#P.%YMvԽ,Fo2n9^Lp:th@>{O:bzށUOM^ճ>)yI{lJlD_d™6YD+~[GD3G5~f|0$K^+;jͅU> !r"+T'?7@)=ݏ%t]օ?Jd!,9ːfN͉CAB :x`y3u+FFSZmBET8ތXvLN.Mjw,kB&M|҆LX3{YWHf7x<`W On<340~B[6LXWh fSЂs瑼 2̞F(oBXimR+MY;n%b!Xդ"l# ,coX.)]nx<25ɾ7pi L侠&٪?`mH-#$P<D{=R e۠u(6k;b< jF!c`񴸩5ks{W$MS[?$!/z OP+r[^a`Wo?aW-/\eqU'ӼiQ7!cFm2>^~j&wzC8Nw`xzJ$6Q}IT"T`5z Z%'#;BIrV;y؛Y133TT`̀$- H=/nPB*A:7\EN=q 0|jl~LNN+ 'US;Mξ=^/=GzU}eױZFs-08α sTzb$%׮CApV=_#Bu(i(<2uzǘb[34 +VH^{~"^nN)G[ 62=Dz?;Qx}wGQ[qhcRsһ07}:9(+ޟ 6[)Qc'x *!8FxU)p(wTWús'>b.zAy@՘&IA.;,I9t\qK6\לpKwDIױ4]'r+aEoӷ w!d Ai֣u ݮ!n׍Vz{.)d!e9F6np=M!HA."q*8JԮ/b2sIJBdp? s=f;0i1:O4@ı:D37Ӆ=pnw9.v h'-z;!^r4RYRoIbHs2e?~ %L~ۥW_gF tyZ8}+~3RT>m;<*gcntW9M,\'Bq’s t To3 e9-'QMA=,cCKBQP[=. wݱ?Mdk8\ /Li媳 =S, J_\oNn.d0J{?I8gH; \C4G!9 #§"DZj 9{p򧣖Y'BEkc޵aNGGjΏԐjj:zF^z}bcfeEN,YYymx}CY=D9 "cPdz]<{cr֯c7+dpܿS8:B!b'<{ b$*/d9)W1AU{ t`t{ ˋZNn#MfnRcbvHۚ8)F!Ȩ3< 0dkNP68V4!3j`hƐO/b(1&$eŽǸ+ަmy'Nȱ # j_AYؘ"mc}&y#~!sI {R ; 0>]BrQ{\ym3V0Wj}Hb#ga @vdN:$ۻ ۻo8V /s;_d'eYź6 [0Dqq4Of6Xy=$1k̲&06m {w۟Ǎ=x_1kW-㝢4+:$* $~p<+3l#@`+^<~yD^~ R[p3Gkԟ!졅ntQZid|>$~5pt_ibкQ[y'6ϯ~__e*??/?~O格Fv^Ϋ/A5:X?`,߫ʇǟ?1zhSه='P}86:\C`Ua7=ʼ }ȼP+vgaN //S7t/2bܦG2"xv_ J!*wp}/(u:o{Lj0 sz:]8|_P88?`u?_=&A;vv~vq_ !|¼|e#Fe%zRg&u]MQ.f:.ڐ{ԕRֻl#>vZ=6㈿nw-6c*e;{=sL ^1r:? endstream endobj 3134 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1676 >> stream xTiPTW~bE_ +E:`( bAњ"88 Dn(&!-Hcq SQ!Sֽ:|˹!慨5j]ֶٓ;oKvfMLi%KPı sE\\c'gm {gSOx玛b;;l-ܮSVn-RF:?+3[ l ՚\:[ZKW+cՙ Z_֨WwC ']Ǹ`Cjڿ%nh>;L1oTe3X|j)Uz}}_KWO;Jz/;32vK衧pz@_`KƇ0yJ_w? =SH3HxxWr)^X+.:ȝ8qy]5׻7]g񩲺 q`ߝlݓ0u܋[I `{qSk-tp%"@LKz|h]PrfVڜ]\,Ɣ'ƺbf;ԕAA}fl}.Yqai2=Cv3e4J24DP7Ȇ쌤:LrX 8=L~茮 xͅđ͛]%*P UT /cˆcB*&vp#,Pknj;g/7n}؈o55|x6!˯:_ 5}Ėد#Ο*-嵧U5-e]b6}pD)=8=_ Y? >[o 'ӱ7)\{ƒ<[ `4 "LѪiKOUhwGG8'7 MWĜ̩4BJW.q>V$>5@(4 n`=&?„{`;6XxI j(|-3d!YuE [;wsx9M "{ v,f?BfRa;l7Ǐ{YGD5}) Ěm1/&c+wmݾM a=5(4)5`Gz[p );:cUԭ/MJl%aw ZW1-zv?V%?aFmX`ѣWR#𖦽 ,w{FEzyGM=υ@]4@KJ6B =kMRIMLWWWADUx m7CG?YRe endstream endobj 3146 0 obj << /Length 1918 /Filter /FlateDecode >> stream xڭXYs6~%TmBHt2yZ$y<,{. EJ$g<8lcfƻ_GGKsf ? sPXbf೪4sFƅ0ej{r8euۺ#RW-(b.<2a$$~j?ID'k=x*7>VY1[Ä{ Yu}1Zj UvU8<~&;ONM0 Y06ku jM~{fiPdP.Su~`FQ*^jij+'yo8I{!*њ9?3%''ݦ|]\%*}rQ9~J1ΛM<,MRqN{O5v˪ZePT&ޱϵy_C7ƨOUmyN\-צm$X9XO -r¼~[2&2-xӍXڔȞ~WtZAy]A5Y>wٹ}EsL*kI t) \gNt*UlR};ŅB}Ca}cEuձqEygNzaxoϏRŌZ[tagD$Լ;gh IB=ǯF|4oXhVR6R! y+2D@+?eOp*(f PneAit>^'Scv})?S@>K)1R"&OSnn;Wrci(AB&hDpGih/{H7(/'jZzWQg] l $AWBEwg>mѷݴiP:Ϛ̧P mUh%WkLI61Wp?bmEaK5&neEtX {@c´m> stream x+2T0B˥kh`U endstream endobj 3138 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/gnuplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3152 0 R /BBox [0 0 504 720] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3153 0 R >>/Font << /R8 3154 0 R>> >> /Length 547 /Filter /FlateDecode >> stream xWM0WX{}EBaVjxo,zx^JrIrs|]mpW ^. zx x3\!u+rmG.||E-[PZ1 . :*P.9*v%BEjxhbg 7_so6> stream xRmL[e~o/^B7iP b1FZbaQCh:32 l @[dUۑ!Ng\|1BL> stream xW[o0~WXy 1qKղuK=PR*!-j4I44m|oZ'AÈ`` 8\P#з9p?o;x}<;=ڃ] A|*ȴZHGn= ZXn ]ĄaҺkAg>5JN C4m}q ]8QgMWH_ڎϱDiL8]j5ua3nPL 5=xaVc-U{{bmXC)! ^1VSHQ"jbm8SB-Swf.O1MԴ)N~h͚މ9F7G%ruFI={1ݭ֐330el^ ڒ_5T4aoid-J=aERj^̰5^x\:Ma2BX8 gcCTVZ>oZa³8RybQjo {Ÿ #`BH endstream endobj 3143 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 255.999 202] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3163 0 R /Length 31 /Filter /FlateDecode >> stream x+2T0B˥kh`U endstream endobj 3142 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/medit2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3164 0 R /BBox [0 0 256 202] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 3165 0 R >>/XObject << /R8 3166 0 R >>>> /Length 58 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`dalgfGbDK>W ^  endstream endobj 3166 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 1181 /Height 1181 /BitsPerComponent 8 /Filter /DCTDecode /Length 302335 >> stream AdobedC       C   }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( [VҴ +SuNN4y.5 - K,1 $PXr p&d çeӵg0a4g$rcgV*)<ձ| *.:XrGPΟɡ?૶1_< R\ۛ*Cz݄9X ryxO??t_ | Ή#S%MӄR}zT<7%ZܺʗԚ/>wkK*M6][Cq̣>\e[*̦'8(K_ŵ<;ʩTSy%όnh/q6z278UQscd¦iVv򎋻EG^#8s:ySv^Hs^R}"ogkqj>;'Oumnᑦ֮Sتn+T *mW2'%݊v~EढaEBRzi܌Use|k|O/WvdU~qNFh ((Z$%H*2C8вK 1 㹥}qu{=77K^^=Jx^ԑF"y_)p$Ϫ';K5YK']<:M…Qi =4=_N>a}|Sd[Y?\]`|WMn;]pt:&%4my{pN](U}=5ddҦo+'!u2Zgo[8Sp3M :sҷwZyRk}8hp QPbG>Y]VOѵ]ʺ 1/wi |!aCwuoFi/by# F0J!;GLsIp ƂOu8Y;?4tq~U5/#AU/~eiէ K{m|C^G2<$ow)V\);qh4ub0pI4]SmOiW/JҮ5߇>8H.]CzN4(p#' :` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( S BO|Mx[>ӫwYZu<ɤeE2FY@ 35_wQ.Ko h.n"6ÕP + d3eteO+&-쨶މ&|W+ /O44BxzW"Kqo".L]._ N# ΒN_f67n 'ЕER6$Zhu6x~U04(E2Y#9f$޼ fXמi}|eЊMb^o4oXw/6Y]@#G,+^ao C f{xdu!P zp/hgitg A>5i4[1/7gzΡej:v۞qCOB)_|͡K, *gRKz9K/kf1?T~?bGg??.?t?z1^?g+}Cq|%Ͼv8чR/4hkW-?15#9ֿ7/K_[F|_4v9i6yװR"j?EH.ˆCDov{+ wP,#p}CHkhƗm=α+۠Z8gf+Y@$9 bW 2[ExXVte*m/^kyy t3\sK{kwvIۻ%{3.T,2J<{*M'vգɸ侌s&<{xþ?ӧ4IH!IՊB6 M4j,+Tv9nK|2WW󤝔l5{EJt^;st]<`"r,`vcɆ)fj׵^~}| Qѫjker$۩e9~Տ/dӥ|C|M 6^pY[|<J\dT:3:jI٧Mn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (߲m>%DZ]`mVf*(tg(Yu^ͫn40xWikk| ef_ "tԾ"u,m|7D}rY?t6DW`NK;x~,U!I7m.Gu>   /XѬjE >Ң?ݪ5u\KAy62Jv=I~PuY{(Ӷ\ %[TޭXnwjyGƣRyVKQ m^&FC=B1؎vqUU')Ȧ[wWU kAʵc$6ћvi[x/0Eum2ͩN#!33 9\np+y:ptѨ>Um|jCՂX&۪vW?Hh/\O+G@¸"MZ5Evh2Mh+8&WaVLíR5LmWU}OӬ|{`p&}|n2VR{j?TԬmx|=SK,soJ4!SƤ_g {ֶ}_JIM5ݾf>TG,9vH2dpr+z8.{Nۥև7-f< 7n3~YũZhfiqh?܆=kj_7K&e?U?vWJzs/$˖Z9M<$VXsoe #eVJZ=5tC\ǙayFiq %8׏2WZKk+RfMjRgu:% #82O]uZuWkJ^T$^VNJ_ˏjZy?9y-fĄe\+".o㪶-^ٗ PR[!Fg =vX<wcۡ?g{C?唢wrV|;+[{zTE'#JI-ykxG6oℬ1W, =*Q*?K32f}cio~Ucs xyœ\ ԋSr6XtRMv HDi6ѷ*Ub1,ˌ *Ԡ;R۶vwKI<6"zr\t-bRN.I4龥(-='P5Ai-͌O$w+ImȮ0*J`Gw:^_m-ջ7pD^ 4ZZҩn^y3`H=W$Q&~Gs4^UTvPby~,N7UbKmbk1j(RL%I4j.hke~YJZI(՛r5ПV]MQ`u+B帹O.{xuy!R˖e_3kYM7]wc?A*W~]1NSEܱ&y.DIͶoJ"if s odA!R}hTXAOaa*:55iڞVbP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@8|^f31Iช}GuW#2VIF $x|]r_?tV]|=jvv.-fltI(%\,OܿiZ:;4mz>mvMVMn+SzO緞}Gǿ?2jZdž~x}.%[{(^g}rEqqw w4\,-sB*{<\a*]NT_ui-Uz%N%~馻jCoj;(_+ Xͩw t}ZG&#-mʕb3Ys6➋MưٝEAs?%:|)tӻYkeޜ{Mq?7U%*R_ͻz= Y&,[+%jb{hzk궳_"dh@ $ aV E{;nTw`\:ne4u̺>hQi5$z4±Gj*4LèE$CYJ߫~(%[.2wm Gn1xNwVou=odҥJ9vN5+'vqUIII(ZQmr5VooGoHPtvINS=4BiRbI+$$IlhʚwIUI*l& ۓb3a D-b]OSaR䚷<ײNf3k:giXzPx>$g$*塈gKDs8~eb!/jw=d)RjRQBRIQ[cp(yVR*ҩAVWthSa njI;>񖗌2W2JKf,q})ܤʃUr0FE;35K=, m |D/xpF)?cFU}'mTxxQ(ZOǣ֤]KŻ{Y.Zm}<.KnN2Q8G!HiW+{~]V駩c>a:!~Is]Ŵ{.dvq['ӬW_5 Uu]=%#ȍvWrIW(_ /u}ZVtַ|P8<Ĭ] q}wo^XmpY-T&SQIj62M8kB?[m fdFKYZ*t~O>kFI+O:|^R+nhV-uSrjSoMD ?TA=ݫf7*9SLs'B#Q*wRڧkd csci["rK}1Q ucWew{Ip<\>wH*ӂړa-}xM9 .;Y!-IaN;@4ҽL4V混wo՜|\ڂVSJP\k,_-V>]S>m_m~ʋzO;Z Le-ܔ FSbYM7]_ws;1םݻwVOǗM;['"KBLƿ 1!풱t D~pS~xm[xIFn,յ'ʒzi&v|*MJݚS潹{ok{]\8€ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<g_+w_^4Ҽ3}VEȱL 昤R5ia xΏRxӵ19"_ſ!6vR'OU9%?Y4a}|яxNWdvӕKUgcd.zWW_n'>+xƺ2fkh.@PZY$Zr첨]d|ngo{Z< 2 4ͺ]y+/o zjU{Y9+\ϙn'+O8s6Z_C_K G,muʒ8W 2cIPIf%$\^29)srG',zFH=rŎU4J2^IA岿ne$o~5JTXʣ*m]EZsee՟O&aj#26 c2N n_N\^^jm֭8Wx~^/h.j.+ GQ'=O1W'`)`+Ot].ޯt叒U.I9;^8+:tܡcܛu1ݸmFx{VPRuUm=J=,,J.|Uʕ{j{*h7G6dzU$d7ـPasp]/V2j'xB>&$NSNbU$5sTVOJFW֨+N&FRʹ_Z ӹI5tUQvyr\l=TM,UJKxzVc266ӅdE%W_Sw䚕6Y@ͬ^d?B΃ќ@XnJIv]%L8|ӡcp:?ˀ\*nZnVRw?UzvW k4@ G1a.*Tm!?fћh8oc1ч6j4N-d~n)ioQ7 1KV.VYYggk68B ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (;~?g;HWOO^FMXՙľRg\,,l´MEJRJ)]In6voR/_ⅅ~~[ž2GVyc0Xls$[CǓ">._QR\'zxZvi1Ӧ{kev>?R5"5ŚiڝiXv/&#D'sef6x*qbSޖItV^e$^Iޔ&IS7Hfvx;,gQ\<U II9O !}N1wZ6ڲz${RRr[7NrkƟo%_G=dgƏJr|Nnz|AZ4J9!Gr|KrG? mdy%FͲ: pDQֱ7JCbm7ii 5ݟt9m2!fn#8)*c}uzXK IsK.4Ir$0Мqr"";}SM%wrXíy1]_I`KgTw׳(A!C18N [' s{&ݾDb1|=&ay4]]i{^e](YSAt8i(ZRD)WG"BUԎC) $?%(':^M9&M=s|<*ItqVQk`ԓiS[? 6shd3 {jӌ{_Q}ޗfB{)E-?J+k^xw%Pa*u_Vl8>㋅3["SXT[b9K]u)˖1;.i8\pNku-n{:Wm{k4o Ͽ_t,~|G8_"0x;[-Y w-̀$HgUj2ז 6^&8Uxg,3JZnV۔ړUj'fŶq[{[)͵KrU$n_- |*c9Ɣ'?vQqOi&#ᲿeZ8*=i_ I6Nhrɨ+ZO kcKlX>=6y& w4s<B_7=nOVYcG}8ӗ:澖峽i4?[ {j,x Xmk6}6scEpgԼ=Ro΍߷/"̭gUcn ~hZ~dYb\qdSݍY'POײԇ 穄(9M*AޤtY5yE b;fvX**87o%KDwS.˫iNVOhŻ"׭VTSY_ |[.(?6/*;>g3Z2?a1I1\A*Ko*I#`FAuwY)BN2VhVzqJJQM4zѦcl}s*[l]N2I :he]m4f1sBP:4%nd_YQWR(~C6(s>y_Zeߕidٜgp?*ږ& )߳kggiWWZOFOAH\1FrRxJх'gOK{?;6)&x< :)GB߻tm'fҩ)/T}c GlI?/{3ڭLZ,HYA&xYR(A}sN}_OmO[Y/l÷f,JQU%58~_Z <^>mc!A2g>b,#Y ;OJlתzn[˜V&z8Y;J[7npP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@|f?gσ [ Io/u-UFp MyoK+Icۇ6+TU8kɨk]tΫߒ'>< m/uRS:6chmTMNKs0oO*$z=#Tfa2v[/|ϣxCĚYH?/nduY!7KҘy2Ѩy|6ecg߳ۆIjJrj &:447dݭdՕײAmkakmccmk6 DaUTp|NJnMݷmӂQD2q:"2MkmRֱFEZE57/zvXZ}` vįyKT bftdsAwt'MݨF:Km^·ĖYMm9Ag!X**H+%V=5jih/ڟ||~"w;{MKAXR䐸Xm՘Ţ+d BBcMY:ƥ=ڊu}VζDhՁM#E(@AD ݘjQXJn4MݭTb+5)]F6sTݝdvZ}hieg;31,ij1fgbY1$\UTuj$%I$I$ѧQQ_W|$ֵH(FG q ;+ˍVF T{7Hb$>ܕlgiǭ "+QǙm~[/PRprkF;zogي?)cI5hm.cvvN( J޾[om/T_/|n%Xڂ;`4:$20B2vZZp.{>(Ɯ}TK]>eb+nrqpk]okhZ|2=Žڕ,\A_.{y+ U IIʦ{V\`՜ahE{ 1wZ6ڲz$wQ04{%)'u)^rVқrVzj:Wcjj:Ƨ7%YK3aA' 5I^Ri%ݷd~[O JuF)$c/5AYBDTo&Vetfxu*tS\}mk瓔{$ǻG V$i4M5Ml1PnDbR)HURETZEMH"ڭH2RjG1⶝4yx EHX"iN*1yH2r$w. fOy:N#T_,>N5kJ.ҋ\m[*&7xj: 7ZbYlg1"TdQ e%NU9ʝ_iSOMI޻;5Le8%Zu(I&(YZ)H Ӓp6:GC[zDXᢐԿI ̬0v2ֶ|V(ꮯ]ֽb|nW̰Tܶ*RQ-Rl*BQ9<uoZ_S|5Z~6-jZ{Zz;}P|EgCDvi2 QH̭rqh5}RWOˑlU%?ް |-*s嚺B-vyX/{K{`axpG#"jԣ(/JG0 UХS]IƤVʜV]4֍7qvBɭ[{X%R]HQѝZtӕ*RM5tѦ50|uF36ޥ3_N *OZ3J/eY~]d^\NO$iSU\i({Kœvm.mo㻰L#`p+9ѓHF_ )(ӳWN5Yj.oph\Mz .2Z+/RHD ?x$~ FMz4|*OJ٧#Eū/~JK3~TKj0drv*ˑrgÞgx^/ut't}ֹjӗ%h_VkJqa8OFz2U1lw6u׵[KѽuZ&en]o4CZnzZ=rV:\ҿNq"\EmڥH.H܀wr>VU$)4kE.dj֒][6i1p, ̜&ٌͯ(~E%"Յ伫.Kn(g#Æ+*uFkWnzc0vէJo]jqm9j~te{V|c *DQKwt,P8;r7cR9{LMIvII+ѥw2kS5*kjtM8IͫBZY%M~||@(,sN4R %LB]J[(ZJ.<_#3a#*tH~W{Z/dſ |_@v=Ɲ0vƒ.#8x'T2ʫ"nOQg(?<%JNMI;4i] ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ~|ߍ~)xJφ-/u["0'ߚbHVդ}*?8|cInf?j%,"|L}2VW/EF>qk4Ym6x|~syI)R[w3zE5gu)&U}Uh|s_i~5~&x⇉75nLC}C-YooFTT k;Zs;-N1z6Z}8HNXml-bX`ApƠ*(T| :ӕZrmvնmgN $Vh*x׊mk(ͫ\X)x00U%ʣ)6aQc'.u?rT}V$xqk8 -Q$gA*YYX^Qzk4M&^ OM)EQeڽi((FQzHR"1U)DbR-LTRE֩H"ڭH#ixm?FK$qG.r/:/OZxQ׳C{Jӏ1f/|^1F}ɹڭovvr:o7&Fp*ʬ41>愷_OGqm??-ZR N׵x]sBV\𺽔8qn|/k>ͪ`\Zݳ9lBKZp|ЖMtn-7X |Ԫǒ- ׽e YNq8GO9Gt]/Wmm6\H]’`3F}mCW .z3q{]6x 4¬Sjm_͜ 2D h8I!1q+S?;Z^o6}楮ĩmy~z\ے{ɫE6[_iPj\ O90UG#"f$v: 7Jm[림U)X-*Ў"?JJ}nՒb97gʓj5S:A{岸Co-\18beR$d.qgΏYE)I-Zy[>}u#J)I*'Iͽ-V0swj7u}͢.z1nQgo -ȼ < V6^x]xUj齜[lq8xz.ܕV\7ouNkU#Tf mĻi6@x#|D֡*q֛_.殚ny1{mզY(J\=+߭1Y~ѥl72j5CN8ʓOn`+{5_˙}6^K`7WϖVi%N2wnO \=W_t~OR*{]5u YsFM81RR?PDEeĊUxc@eeR%jҕ2ZmIiuFM7 L3 u0ؚiM+NUi]]].zrזVWg93xRkLϳ:2[EQP#&cFI|Kwg_ *r/+~>\ӄvJ MbM3RꤐK2L.@0rF*4(:4;ZUaq+W{Jڿg&S\[j>Hjْ(@TWt?e[_&Jן,-|O~m.UNݽR.2~z^}ko_+w;wvv{ǥ{WWq[^WѬ1˿rc-<(x/^)R2jkawt3[)@;Y {*JiABqnRb䢤tܒN-jI]<|jsY&ݮޏNZIo׵犣J/Qyaܗ=Dܧ'9ГSºըOTӻz/uXI)dە8 jsź+7m];$P$Vli!g M'.&CL!5sZ 3u?%TߞΗӭIt}U[,QQf'I^V#_UsɶݕEф(BTb%eȕ ):֩E+DbnfёQҴL,Z&mSt5L|C{G5+h- 5̇%$nG*;(a猯 i9=uUܟDN#-Vm.v$D~օE$RF!%[9p1>X,QFY2CtST`+k)G9I6˨K E*u$O{7ꠢG\IYLHLHզZ%ZfG5x[DٟSumH6ɞ2G( $Wv_uFZKtqN2S]hѽ}e]hm[ߗVb:db;Pw˅R-w*x,newݞvJj+ʩα4Uۦv 7YR [6lwVrɂTu$A qVW Qү-M5gǭQUMNgvFBfҥHR+~jFEvHH|c>Qקh/|̖(#;e7}+m+ZיAviRVیi7=7T\Z|OhR>HUZ ETRD*R"hS!hR9[é{p̖ZH+p !'0YmnW{dcv}EMYGd?EE7NUvU#ZǚN'̡5y.M4ei]dK+I @+]z8ZSi۳qv|+`'^)U+i%d /)验sF!\GDb)LR-HR-HrZ[uw4p$JR5% $֔ԪIB ݾ«*dn%mKvsi A$:PʥuP2sKDn 5٘Տ4O݋[4ܷvG,q~i8$֜)hrs4&tUp0*0}SF7Eʹfխkg#|m23AVTu顉W4%}$?TӋic[J\~I+hJ˞W\gN,ѯmeK6ŷeC*k!K#`nUcS9KgO||| ki$ReHV8YS5dVhYʓT#zU 5֪:utWӿ+<0 f]Ԫ%YےFRqo݌xFqk%o.颰&a:#I%'n r u(hq]ߙ+5'K[8ɴQɽ#-F'nWN4~+O7FM,vpXЀ^kȜxZG?ko]ƕԒG8s%&S:eOjl܉Bܗ"@-GP[}N& gV\YUj8ex^u45m??-Jr ׵M]sBV\ѺN3e4}S-fsѰ7;[8 eeYGZPwiu^6npxSJ4o{_fЕ,f(ޝeIgCug&7qȏʜ+*uPNN2]SѮ'GINu$vwWOM9; X3w]Z'L5zC;XR(1#І:#EE2J{-j'uj5ρ.RO=v8Zj7߹}3G&pѾ8Y \Р ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (~2~_>Z896̔<9~&wj:q5_24jwiyHHppv7cG6)?bqO[?ӕ&M+iL{4?#w8=~mgצ۾mpi{֭K}HS*Wgؼ~fzl7g]~YG.kjJVTm}-moN|]#O|mloڵ]1rtvmTA5pNbǫ 15ЍT}ݝHԩ.Y;tRKQW4ndah^ 5(/tKK/$`Q$@,PȥRtlUb*^kj%)R9^ItѢN4vo .=oo'˚sSn?3û~U/pqğiI [2/.3YgюUݝ_ir|WQIFoM{jֵۖ Q+;7RN1$s#e A j5PjғM;4֩iBќ\dfhiͷT_e[+Z=P 6SYt(BS_×o~jʯNRa}&|켢㦝Uxo^(ͭIA˼JeMnO&;P같v7\%e/ߢXǕ߫1ҼrZXs.oݶZ#CCׄ|My.kpv(hjтl 4jw!e' ^SVM6즭*mH =ғM=SU e䄽I/X5]Wst$ʎfɕ:3XhdTt5*:{V&y?x񟮑o3Ti7HoN_Q˭(}׍٣}^?Q^2gWh4R h4R+uI):R+~3E"GV]ڭH#|#z ?ǝ{mn@HGPmP+"I#Mam[w}[een|eQ0U^I>klĕU48;7?Ѽqgnmƛsw7ٳ'+lo=+.߽{xeZwW4 J;fK˹y]>Tq,%RϱxEyGVhE#E#?z9>kkiY 8zá$)jq^a/ӆn",7Ql7*\S2/rKJ]N4Z/Q^_1)4UJE4GҩH"RjDmRJD-R-HR)Hմ[}Z!xKow -$FpH ON,}ԎۻJ-%6,*^ѳI4'N9qHTRGTZ/Yxb/mjeh t_2tAI&eK[/c9bސFԭ+=;;4L_[ :DdiֽQp5%A^.JK1{W}0>a 1J94OcTyW8&%$Ey$S`*Y(bbkMhcp%Qc0mFUgw;&v&96Ҕe8NΙ}nĒEq*|S0+ڟ0ׇ&htWҖD(ɥ, ܃RT1zTdR^ͫ%$ʪS<4%f0wޓNܗڧ7F=j h.$|=Ʒ؎M9gƎGE\Rbd,^MƃQ^J|=S|wNR|l^ ҧ7airTU8EE(1PTF\Ηi4~:hݝdN@G##PBkGM4z[p(їsEsBIJ7J+U֦Jl"+Jg:_|iͪ[dݳ8܎l ɑ .qikM87 ZV啯kӚqc(ɦjm 6mqh[vk`ovpA ʳ^ l4I.ѦsgHU{ONhJϖVWMFqc:*j:>[]J;qD :0dᔆ(jJV{?5٭}SG3X)${)E+(%ѣ+Z[O ʷQsh ;B7 94 }J*Nv?W}gymdqz_U8Tn)[IEX}{:jc%R|ZA_ '~Y|)K{(:嗵/ߒ}*:r.Ṇy[yT1Ж{uyV!hCsd߻/'=^]س 5E˭nx/ihKٿ 3;ϗQlwoI??df?KGZ+˕ʓvR6HV5ycxbpXѥs 8sSѫ6WW{uajrU;]z4fN ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+_ ?Od!\=EfKXd+HEcEJRJ)]In萛I]lϊ5o,ӵψ59.ZKfU!"LM,I_:G7C 6O-ա&zEysI$$7i^_ uQ i~$G[{ķRI+vbX$gy/Vjw璋>[tV0rkl-fN&NÏez7ǦY-][_Op $*IM lCry()B)5ބaŦFI'/: W<=owxLzֽw%HVWLv`c-$# * n6S"TT巺JrNmTa|vryg|Y4 ^|c~Zs2cҶB &).e`H$jrfіn8I*^unoQWvnӕ8i?|Whھu3ҌnkTͣ"ZmRt69_BEv: 'Ii0,H0JlUԜc iIuQv2N/fTNyj+^O{5p'|@|x§+!+ s"̡1gL' jOI\F[i7+sB֥ ݤu;ɮzǎ<ykѯےzF rpo elV~%I^Z2NStc*xלo5TnzGxÞ*Pƿa{.;@(Y q =keTtNM^ҋ{4w415%4"Z32hdq14]boʖ:]Kw']T1 ,2 RmzfmRr[ޜ0rzKZZE>{^|R)? P6RM,k$=K呥W ܅ U@:Q%I-QWI6vmݝZTﻻݶoK]ZlՂgZ]LHզhWdL"3E"GV]L"GV]ڭ3E"2ԏ>o ~wZ?XY`6I%* 0R%-/=k?"?Nmͥ{R|봥NZ14*os!d:{ǚl-˩cdVv[E`Y򷬙Qۃ˥ӵL=/y&+5h;Ӕn\5|bh6b-8;\8ǓOE6VVV[ƱC"EUUӫ:u*6zQF8)$IlZ$h))4^JE)U\ũ4^\)R"hRJDF?jbԈU\).m-,thd!*x AVTԖ]PBzrV*Qiz4ѦGϨxO>EE䡍ƘB͈gi ZO0&OI*Y[,U,P|W'φZs;]IvRJU9ӝX[[yga1{S8Rb>cUѮtw-n$RDWO6 dWlĀΏهEGW֛M?I+60%Qc0mFUg_$웵qNTJQ;:]nBEaW>a>a oO|YB,l;|[nhέ6Ԕ:wf;\kWy#K:U~"€,*O;G䛻ⓋչA$uޓ&uܔycQo8FjъW'%>Xj<)2)Tp&9#(0Ez50Q}WfOWOC<<Ԓv}%dR[4(OZW%?RҾ\MmVq fqr7#8eV]b=5xKu4It~a>Rj}ZsBV\ѺN3eZۼk>ͪ`\Zݳ9lB(+Ji]WMŦ 5:sFi Yi2v~uJdfjuŇNI,9n#fh3\CpFG#oi]ӷKg~0K6((vjGtyMIk[ݠv9fi!QKGg!L2Vv? ESľI-ˢJRmj)H&񸼣UKA-3{(E_A9]*FLJJm+]4فhfQ]nhI?vQxj/}wwe׶:;[iQ\[̿4rG"+ckb(;IB^>Vi3ǎ]C3UOvkmh?ilʶ78Kl[VG"\\~19y'J2+&=4ݿǚ1?4θ{Ur/Mݦkz\)_D|P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@X|;s| tF0?07ѷYI 4h`dE,ne tf%Gk|>W#3:~ SKwC6eTϥa]- HHQok7+\7,fi+j2j׺wRN ZR:].7{h~z]g;33gwbYݙؖfbI$b5quj-I%IY$I$IA6ZlmjwЬ/E}v"K-h!ܙdDH{|O.,N"QE9'ggȒsgetʵ; Fx[#s%%&6Vu) )2WK$⭜e/nJQ})FSRiӜ=d 3<%_ )/? ݟln%fhieO1bWӗU/ߖ)(7azNQv;ZgʵYq-)j yೈZ*8 BFqr꣒+˰s10Si9=U'bz#gQSYy|-yi`̫6 o1DBJ\ݫ6)kT) iJҒRrrQb0t|OWkie徧U"WS+Tͣ"jYMҴL2)uS5L"VFE9L,C/ =SU!:Qamo]VhpB8;:4j?fJY4#:Js>KI/I+I|WE|OGl3Y-.%c yhqm$bC01,VWҵEܢ:MuZ)+>VK*=I҅}4wm5ohMap0&:}/Z>+^ihv^ Avmmq>T;NUK%LT%Jr#uf:< uTe%$G X Oc}HJ2^jQqkM4M3U`>vQɮVjVwP>?lO<h9ӣu#_ɡu%ecƼx2SNm{I{D3x]s'O˲|?eW N& s89&' MBv|KUxJSԼQmvp0:JxI_z4 UڦDc\)eޙhw7kH-THy'N\UaW>a J90O95*]wB̹N uI  9#C X|C_ poVwS|џW UpJ4JJWUIFM4&P-k =V i2*U*2*2 AZt+5M5Mjѧtz\e,e%ZӳM;4MJ-'i4lY*cLTsiڟ0}w]?g5ߑg}qҺT~}v0b1kŻ^׵g7@]/Ii5*]RV?3gbI$$sOyJɽe+*hZ!eXO,#3Irڛӕ&moRm[F,di#Rʒ@xeHr%]`TgwM=iZ4ѧx-<ƒQZku(J2WdIkI5t:]Xqb;#CΊIr-Bţ|iN5);Ӗ^/-训$d2}LDeGMIiuv4ډs-e9BVMcZN2 ѠH;6#PI } wyn2@,1/X;tvӚ6[4F?(fUjeR/ijҺ$ԩR={䦥jZRp6{dPۉ*8$3~QBXlf?哲fݭqkH7vXq4ZKj\ҷNzqJW+SM7QhX^Xv_i]YI,$0$GV5ԡ7N\d5g3j8jjp{8ӳiOIwsm?ٵkm.u`nLU]wW4%}$?TӋi0XN\c~YZ9+.h^ɧF2V>ֻE͙m36_8 etYQV4%]$FMju#V6kӚ2啕QeW+gSdj[%PԮKk~е-hD5%4/9He򳑵l <\֧nj.?ʟ4_49;! nv nVG]SiVi9͖Y 1t`Wq0]dRU*/˖1q`FJN\,z-t_h:Vmɰm1v,I_;1^#RU*=&ݕۻvI/CgTe fΨ2qȨ:`ʓ/Z,q\÷wړeCPCC˜(${8l0Xj)mjJZ鬕]厡NNrUymkI5{G>k2͟#=yZ>C*m~턕`p&4Z7j+rG^hvrW;-K)ּ]zl^kۻltH nYr40P:[:y[ejnL0ʿĨH)iz{ir5kh||c̚vgluIXMƙ ա>CI] \˷̉D58F߳vr~mK KM,$oONemn\Wd◽Es]OllK+=KMN'dxWGRC)A"r*P*Ub8j5M=SOtrhԊMj}P抒YR4R+<>jFevڴR4S+4^jFEvڭHLթ)jHL{U/j#E36i&"K "{A($)H+?K M*UJ鮺3f65\UDi{E6w+x#w͎I O}~ĘEq8p f&`]Ĝy6\MA(7ߒP5b5eYNx,,iUi͹JV۞rs-徼ޤ~+ާ<6)$Yle%HF)61*B3Ęy~6btf$NZӓښGW˴i ^B򇬗OD.e*pVfimີ9fA$sDE#! \jh>Vd4iLn.m.k^߳8܎l.]QZexMsB[ɧKM8&3 ZV79+.h^ɧF2N>캽sf[vk`o!]]q= l4I.ѦqXR<#nh=9+>YY^5FQJlr$ R-׍渵o%HuaW;JYcaJm|ZٽTRO]Vܺ&hE(|*{6q8=%ii\Xz|Ioyywu̇`$:D3t**EVtMF4enX=KOݗغi8?jQJbeNr|ӄygF6;\Ӗ9 \($$B pޮ׻(jM4枍hЪӥѕiM|kmg|3g[xٙ5[VӼEnbHȅ6hϗ%eY\<ԟN J/Wݕ;IK3\-CEݦ\Wm/F˚1j?7ċ+%|%|$--䶝R1rxDvg)*iߺ).?'mj~s}GNm~Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9¾ЯS_i^ŖϴVVcO2iQw;`$Pۇ2}XrKgL]RV"?ka3Wγ(`R.wM=Z_T٧-Q9{<*R}-TMҭ,^X"?j{˹Oq+LevgcyDZ'19om[۲VK<$b'VM?E屃/[ZtkMZ; Los,1yW 쭘lU#OYIrӒ^jVl>]eZO5>K[ּYo:#Y,YgiG{v- LFG[1jIˢNNRU8I.FNʝo#t_|Ej^+լY|FȖN2d䞍Jr89|hzҚoYJuA3 gLaMC:*jp=uUM?7a"D.,D]<3F&޾QޅYJ7ki'=[iFjN*Ng7e?eMKƅkC6Ccgm`Fl*$rI+Tb%Rܝ۲WoH즔"eֳLLZkS+D͢ğ< [t}Ś]qF{kU,쬈3ڠ+daMPg;>HW7$'&VKJ園}E:xzxQϒ5 ^th&=K֊4L0HA#F:]ciAIJTFu`nnX"㈜JOi[E]ZO|cְڞo [1mL}oG$*ȥ7ƹ# ZtJ7YB>Rwm6+\Ϣ4u>)F 9?T*O-ub|#Gfi<&Nh\rYV&*4/JI4jUu*KKrN*-sE)])Ҕ]8ǖ-wwhz:]Imy6m[A.c@rp9$quib1U%RۻvI/Dz4aNT)EF+V_iԎ̨{VFё|My΃.o7Zy7G'gީ?ܦQkc(4ֱw4/>~=aR=3˵k|?`Ye{_;xbYBv_d%ba983*IS;hnx5~xUYEY)wk_ (uZ>xL4{>}3#F9#`9ՑpYX?*դiqi&ԓM6g} D+T3M=SOFz5rEY)*ewHLVFEgڭH2EVjVhԍ ZjEvHL{VFgxx' Gssu)}:{yUc<񮥲Oʶ}̶Ts^+գ85RwSǘq#ߴoʔ$cӚjT}LTRxBm{Ox~:]j`Cω&Cy!1Xl.ve䕭{j$rov\܊TBqey8;s\wp|y㻤:v[Uǝe6F]IՑeee` rb(Utk+I|՚iiM4iwtTZN-ii4iMZjHS!hGRjd- Rjd-Rjd- ZJd-Rjd-Rjd-Zjd-RjgKuy hv7w@@&Qdy pMa y}|ED#~產EFIltkԭԤ҂II.sm7,_j gDD=Ek8_] ] %FX<凌NG/y$剁MxStֳt{IG]FQ^˚v^֯g.tq>;Tu $2H逿#1_N>Uxl¥魣$3R{zy])r{Tg:n3kE֋Mɼ!'/x\|p-1EH 0F$0,̲FO6_mb]aubeRN*1Kti2]wX2YuXe5/>Æ!17bG B&{OٴauQ6b' SӔ$$ӷ{>n0u0cR)񒒾o]Vfڰ:i01j7:w[ i.ln5Ԭ-дfB‹@+ Gú%ONXb Q7]&16rKEo"$٫9N&PMm%Ogp,STaeaA:St暒vi[*ե%(&wM=SMnFHbk7ʣ| ?/4M--.Wκ̚9-( >NC=YKeZmAZ-y79M;psϥ j)˚qcNѥ;Fݧ=+=`/j9qz^E&an6#]1(bG q/B_0_Ċ|\um֮O<<\*TquWghUOT}mEBh+&UAbz3iX)I[e&Vlݢi/|Tjwp{Rr{$xfYо_i?${"75 41zg? nsW.ǓW0LΟ_~j_.~4'hsnhjGY˫6ׁ7l7#FjLUq74%}$=mi/L^!.Z,{_t֜ѕ4ndӌFM#SEտ5MȶFmm0!]]q4= l4I.4\d G~(=9ee{4eEnFΦKƋXt|^kMM\Amnz G+|*U iԿQ_;g>zTU)ϖjBOZfך6`ewv~ ߨ|6Q~š0r,׆ BXjі~Iii\KJpox;w>"7+9|U.屖FЪڮ !(Lhda, jO=q6%IUKH-說*;i='1ΰrqSV7?1|mX-)xMk"G]I5iDiqn[okO-.>3s9Z~?mD9OxOj^eզq>[?y#N; V&,{7ҿ3g̩5}LZ4{uvd̽>⯎o ^VI.:ғZDy<֎ d#yKHHxgŴġaѡ7J7K9FQm(u%%Vqz*MEo/4/Sף8t jʝEg}}1]a~7O⏅nl=V ;gJ$R)hU|+=a%ZE8/u(6y0e5:*j6PҬo5=R =6'E("@Y݈ $&*51#J\&I]I%m:c$;/VO,gQ2&KiL-H'yΟ  nm0Y}f_˻n3=EqNa}C:$%+^*vB$Y̯u-[w"? }y_h_g|ͻ~}w{)aq)_o{kwUm{qVҭ¿5}}π'ן~g;Uzt9'-mc^6}3#F9#p9ՑpYXR'[ZT+Iz4WM5u(ӌjIM3"SwOiOF.<>ՒФWhԍZYR4S+<]jԍZ]R<|k M{2JEcC j-/ޜ?ǫ}l?栗1oK{ /LiFNgHO|ןO>.U#eR?>ֳ̪zC^2>JE>JE5JE>jE)5JE>JE5JE>jEwOxAj/Z㵰g1>",Rdi/`ق9UJwO(R^FO/cڛIdQQZxKKhOE)W d4pYI\2<eZ =iԓ[MNhcZJ-J2WdI$w;]ĺ bFAK[UopD \;no{/+m8)/5%xJ2ye~qK+kݺri;q=1ڸ9SU53׼o\qm[^;W`ra3lf >΍F]JoEvi5Gp\E$%e5xK{Fm8]Ғm=-/|Q`vxsMBp-GG>$rA!fv-G7Vӗ%W%(ԏZk%缣A{U*Ru%ROG{.mGZ0' kLuhbS HYpDp:űfbUm*i[EJX~ ԟ운j}iI$r7- hڵͦujls# 8VX"8>W^xi-Vm4Nx\2TRq2J?^5$iW714O|wcuᛛ[IDk. .-slI%r.ܳTFJV&.~{tY9b0r&oW8%oY|Z sFQm5WwOIQUApATVvi[3ե^hF9)FI4Ӻi[ђyy1}E k\tE>G9c % ݤ+㞺|<<^ ,cלv1d71y^s0y^s0y^s0Uq:<jV"ϛJ 6?򫱅SXy;q/B*凌Nj'w/wt{IG]Q^Ϛ}ǔk=aU.as "9y^s ͥ?m(s{{wb]ь]رisΟoGi=##ria}Jm/fΛzj)6͛5%ߊʰ[kG0!&IJc̨dlaJXvQjI-n㫋RoI/URt+hIޜJќfۅF$$%-nɬmVLg;]|Mv!]]Cp|崻tI+MO .ZOKi%(m~slռλvݼ`_bj~HO/gkzχ? Gy1v[]ymeZ܎N]V7sjQ7ݯQ(fi= OF_Ŋ\Ҳ}Z麟\ׂYgT] :km}ܷ5EEMbsZ_o1둾&ڻ#8uG^\&5[R\Gfҳ(a#I82}]b4Ԕd,UhDݍNv3ew2-1u}NU(o-RvQw_ _VGWu嚷FܕJMH4F7wnԑ!Ze8cՎ-6מ+]CΜ}k{o]ɽg?/~B|'fxr^iUt6g_4-0^As)48x5WYWvw{J􍷳Wp 7X^jM~:ZfjvwgXLw9bIWFV  F>DР ( ( ( ( ( ( ( ( ( ( ( ( ( (YM+kY49UG#G.!HrWk`$ffUS^H_;?"sT|RRkӇO]yqjEy9etX/gj^@Hۅ (UURΜ_J=UNX٩rս0)'S^U++Y]a<5]iۖt9-ľQROG iC2y[kC/:dҞRU۩UH-8)5x{-4_$}QYZ^xVO|AZYX죐8rH;ZYgUt8\+WQz{FZ3sMC[y+.%x gTeMC:(jXCY eS~׸>o?H鎤ñb]?^7O Lu{"A_ɸ0pvK+) ?/6Ojֶ NI*`Fϳ<T()WNpwRj3笪Svt]TT{i5ܛuvl ^KV<)vM|cy'*nKIvnf{+{.e(ŸIyGTdS/jH2)^ժdSxZ)FE9"T"Z)*H2)^բdSxU#hoe #D?5ۊLٰvaKog"2ًQ괧%NJ۞0/W~s]%=R=U2VhVx}E#U"Z))mx*-R ^-}=3&P.]ʲ2$hi?* |ؑeF8,r梶i'R ;7n.i?rmT=J MûO嗔׵\xz3\=崦LUK:BC2@`K#͍TPR%gtvi$%Q]x|TkǙh֍=iMṲu)/jHHU)*#E2VhVhԍ>Z/KxåwLo}w2ZI `G?*},V>q yj8J-GUZgC 7ErbJmB-)4ޏK;-@|9ѭϤivYZg"bXT I$יUש+mOEv۲վ<-(P쒲Zrڲ:Z"Ȍ>JE5JE)__-IgzY~Q\2 2RAi"G,io9mRYS\M^VE>i*)T?쪐7ʿwܒ~V#x1xGB)B{U)BթBU)B)DПJ"7ǚ߆|mwMuK)Zu,.ʕvcjw38U418zJK J1z$z#5ObSS+6+E%m%F<9i>K" $!xEE.@ 3{ ?WQ%*n鮚_ۍ8*)%{[]5j;ĺ [yş,e-@%ehēqTNxr35"isZ<5lu{Pe1ٳc/C+A;y+TqR~QKWM6g7.\[ߕFa/DM&8~;:mR?~Z~}Rg,7#k˯J9bѕ/N^VJDu|ǚZ5bVwnեկhW)<8$u/ N'!K-$Lbܿ b~_w/娭*q拶STE~\ḛ8~x5'}9r_u nKM'>,5HƳfYtkk n@ C X+ VnJ҃}xM=S4LeGFO%wx.򄒜V]4֍u&Y?̾qJUAҗ/b(wRkKOfm^ /+O^KQN˞8Ҽ/M>]UpAYQCUJ#Wo).s^n1ijs9`jJIZ{97{$ޏD{=/HѴ;G`t#s7(U\Idk&*wmm5X:0VZ$޻wԽ{V\{Q{Q{QV[kMv{D,9Ibb62G"0`Fn/g]bX]IuMQ[^]I>/7jzFQ\ǒ GrX̸9 $rgq!IB9M;8ɭ9(ɨr08u(WIUvI5u8w-V8)K_p㼿j\8GG0J\!6h'@*0+) 5TNJm't֍5OFuc Е:J2Vi鮩GxᆵnammsfX隚lfwc/ BF}b:}&>;iJ?ڔ[3NY9NiF_)1S+~X{*yBJj*匣hZΧoR>!Э=&Dg4i1|1)!H 1tUPˣ,4JS+'g]=a/z~{QgO8nXRں甹֓+'(^gaj!ʦj2ltJS|-2$є}DI L(?,(_GiA.uitOW'ή%"Ϝp$##]I5vi9:cX\i`7.C++]XVRX h*a*iZ4j香ՈOMӪ{Sjy_j^Yu kʹda5 >FBfWp㤧*vJVrrPO Idt]yҲQr}LJn-NIybԧb1H~96ZquhMk(KyE~2~(P|i*uM.?z_J /Y5/i:wyo5rË"t'\`sxP/e+.[-[jp~S~~_~8|8ݡ_26Dگeu- I YLLRlTW?aqTqcJWM[iꞏSQ uGAP@P@P@P@P@P@P@P@P@P@P@P@P@P@hV뺝i]j,ZAYdbUK31I8ɯR8D%7=NJuyi_|+aG@& /q%:4-ik&'|{c$N eUw34uﶣ'|wՏK!_<_^-uDG6s 1Q| " 03ZXʮ.ni&J>I5KJroL^2ή*ntq$i螐zo&F ֡iw6i+[n&kKe ɕlȶѪT*yXNPnXA/7d^&ٹ7~XAšQcnn];ZmΏz&|RY+v2̏|Z>n!&O_znV9Fa5=Z,4KK XmmXaApƠUQ¨ gZrRNRmmVT[rg; %o^O=OSC>VՃ,>v%P_ǬXS|˗uUm)F)-tLaZSY Pe5 ,%C:*k6uALt4 iz5i[_ Z `Ỳh7)ƾ2pNI4J25VqP(Q]1f%*|k Ft?p@;LO͵'MĘ-Fe0S8?%Vun쒝ZwV>go)EhZe_z+ty{i eb^Fgcf9j3^&ի*iF.m%FݒQQI-V郌Χ/umWZlj>>y'.%Hr5~FchQ6U:nsF-;5̽IN,ȝNvjS>&Lj|9H!vEq3tpԞIV[iM$NKᛊtJs䅶;?~%j~nw MPTjZYtٕb]Jc"X^7#(KFӌd;F5iʜxөQV喏pk:2'H2*Ihm*H2)UdSxU#hȦ{VFёQTc##Sl/]VK.o.XUA$&hS4b94JI-[oD(');$q_ 4{еk7ύu.hd"a9NvӳhbiE< )SC)'u&)I%Rsn.(J5hVRLJڼ%#S+<>jFEWR4S+<^jFefڴR5R8xZ[WI`B,m)fEA!C3sgݙC ޾0oNT$ ;.x]{$jE$eu!jrrUMi_/+|Oc5ͬ3^ZmoTӮ@VhfU$ $7Gl: jQdNM4Ҕdd8+xh֍=MhHR+<^jFewڭHH{U)/j#E3.`ލ0c)bKki,dr UGV!" ;c/*?f)ԨEūrJZK!Ҕy1k*i'f>GD)Ba/TRH2eYiڍ7Z}M1#6YH!A`ZѯRHե'EviSMlيj`Iū4M=]S<Eξ<qDh: HeC2hR5]ȒX$kyoc x7E)j[rKNXͷq1N ^xJT&׹'{ Roޔ_p|Wzd- ZJd-Rjd-RjdM Rjd Rjg|?~3m-̺oo`c1a Ɵ(28%l+%J=Ԫ]k:QNQi_ޏK8.nJWꬩlvejyyLO1|a}E>bG>a0sa#&j1&KmN;@ 3VMՕ95kŸvkM͋3*XQiEI_k٦f8XOxUXefm?ϻʅy]A򝠍SՎ*ciFgni=gy_ʖC :+NoOrN[rtqıx>S^|=ME*!#6[l+swd`K+bUepR8,^3'Oד**py$GeR/,vG1U0Nk?uEZΛTNrST*PW5in{cCȹ[L-ќ4R7 |~' _% iuٮQ}$Ogq1s5$tI.MuH򽫟_+ڎ`'ڎ`'ڎ`9h7ZvA=:A%Ą7)Dī;$ ^4v  .TҚgg$֪mFR<~ujiV[ JIrME44-V_bԭ#52Kx&FXdIRJK 6jIJ-l&f6caA5M=Ӌqvjtڳ6Utss p0Qüj\>w<|Uwidm2Hx">U̲PgU["s?aU%ΝڻJ۶<"kR=|BxuU4vQNR%9E)7JsRuYt{֖úpɦ"GL'hgl&bJ<WsvX6OV8TҽԣQG(B7*SI®IKRZ8I25Oʼ *3lKլ|ipH C+#) VPAUGSQT%Fz4֍;M4sץ D:æ4MjS/úsK~m$S2B>u .YBmi+_vM,]m7ۼ~Ӕfx|C⽟FI[Ki%itQqoE1>o?#ZCz ʴW~yQV6{0B5e`6)7V*Ku9*-cRuȜꦓ6jPV_"h=/;%6lR紭v}+7 R5Y]i%Lwq+++H Sja#W-Irϭӵq\rU7K4|ѶR=,GQ_tFex\ [K7ǹNQ9cXsNC5KkO1OF}w_:~վixKWW2C6/-Rfpȳ6}4/OKq ۣu_{GP@P@P@P@P@P@P@P@P@P@P@P@P@/Q~,t/ A0mVd M{9VUVId)8 †YBXD%տ.6yi0bh.vIK⿌~+z6Im ~M|A ;#j2 Jc7jAFz|-4Ԓ_q[OouqvqOTYzn FN4\`;hS 7H *u¬}Rn]=Kwwgԋ)T%{55y[}ÓpLџie % ̒ C}vRZrn0斎tF_a_GoKy_ xOK\\7{M֣3O=\,xDQLq*vQch-$&$4sO5[$wn+fk:wVH6eO DD<%H%JѥNxGH{I{Z)MG ]Y]oMz>iH>Egk*".%@$rkbj+Tw۔ednINW#: *zT3 Pb]iWzyiOqus",P$*T)4JI-[oduC]x& ~x"Y|AκV Y\5ım1om42@$OF]oN)ԫV'u(TNqoʥ3;Ŀ_xtIUz4f)IE$[$8Pq+{U_+T~J)BQwRRg}6IҴ+{=2b$PUU|z1%Z&mݶmm24իmz?M!x_+hټWcy.o_"+f/yS{yuZS$;lwc:c2ej33_tzi6aeY'у,R!ȩ"JF\Wi4MJ2MQq[Mk+3W\w/5?H~K[ CJB#ڣw-$̈́G. =p=NsOrTr:FZn]u=;XӬ5}&I.molY2I*A E|zpeF\gM4N4M={3M]Y'ch̪{VFNHZ)E7ڴR6jk/jH2YtҒG+wnMԬ Q7ĿF%k+ҚIZ_eFPoh}R=52کH2کH2کH2ڭH3׊~!x ue"|5HO$[B"N,1%\'V]Ԫ_k:Q%NRMݏ8΍q;{j1i[ޗqڼ>c#0sFaRhZw4WA'R l2)G]C Ataqupuሢ85$N={eOFxzqkkֻv9:jǟ}lp@I|HdPbE ƅ%x**[gR9'y^榗._<&%ޭ=o 9(KK+N2T[ >9ڟ0}aW8 >a}aګr3 >b%MO>&[Bӭ/%D7~QSIaVe*Gx^*/&)(Sq:&Jz?zI|ﱥcFOΥjSMp{e?p5˹l'r8,gF_[ޓlo6sD2ekcQ)98WS*nV ᣏn"N8*1ub(Jiw(FMLm1G4Om0kWeOk8Ct_ _vDTcu~I7Ri.GVr"7tCK, 4]JP']LE&H8`ALEJx8Mnk붧] ]U5ZiM} *6EK90yTs1/Dosˠ[EdEMz3l"9vFr7N-1HkK:ڥZ<jIZRY:pxǯ(ڎasڗ0sR0?j9yxcUa[mNrPI!@>~3*V߳_ᦕ8Sv)sej/hQK94vz ]Z[E7<_#kiPKޘd{v,PCI W+ M)5[v|BI KꚏQV˖\LRtkd\--l(ǟf}ufm+_ª<ɭwg.!tpԱ3/vTlQ%ۚTNd]ӗ%9sUVJ;ܥ8[7̵Qak9m,"E)p*0ʲ 5R7Ni'f5kqSzM>ȼXKh_os][Ov7e<ņm^<$ːv]z09).hMrmutz٦OUtb{ux֫i֚=vjφe캕Z^YmC%v2hTcUe%(ޮ$JJQ6դMvkWNN\ I~ฮ'![`1]ꊪEtT@PKx 2OK:qXlSrn}yweJ3Fm֢GKF//uT i0vѣ:#eI#l U+^gMb(z)[e-u7MJRnOu-w&Vu&Xxn-x&7J&qy8.UѧWOB!ZEtw׼oPZwowmmǮI,'-5T ,H$6Xh " ;R.+o6۳|eR/oO;u~kkB ( ( ( ( ( ( ( ( ( ( ( ( +4Y>}W e{FD(M=<5'Zj ܼߒݾonx/5-nHn&:%C 2M8RTZ[Tyl^_ֿ3Z4 1:CGDdP|Ax[AM}C-&y0DIjͅRp5[ǚI(]+N]+ե錈>{U<7s5Eշ}D8w!1٭P(il(Q5 T5s\NS+s'hx5j2ej2ez2ej35:~[L~ nwբ]R4S*UjFg nRoYvv)QZgz4Ԓj|G3Rnu-| [Is\teX;`Vk^2W|<.u(BP}%iKhHR+^բ ̺}YێGB2ɩ4|턪2^[˫Vi-.Q9*N\_a/mTo(zC_7zdMW1JdM Rjd-RJdF"Ȍ^JES"0)r>/$ealnӵm.bl ceEd/ ǹw=0W)G{sFK^sEpmIFq_-|]SI>YEEkvjM7(\ÚtF7:ni-'nݲXlsFv,rcpUJ\g~YZ׵+Y7v\(NW{{k~(kv|iIJ+hOq)d-RJd&"sZݗ3?P&\j*1b{3]&J1Wi+]2!Mrv]mt3| ;BY ^XƫqlXsL5ܩ0q$U6F>?V; (Ӌz )vYBx<%:UZsr|km{$dL'Ҽ#S#0UsFaFaW97V:$,ҥYl%XˣOk#؆tO-W\]*8FjK[;5\rQŎ:5h4-W\o_viY+;ME/kZV-ktgA2vMDUє eTi%^-5:0xchB.tK4C`\W8 W1\fj|SaR1\ >0U53.>Zy!zBy/|/~훶vsəա>i_mm{]eԫjdrZ^ײ㈿>&[ G5~ϦyL|%faVStRGzofUJ%Rffsi5ޝr}[8Z9+w^9kuj]#)ׅT6IH\#TYF+g2MaZKdnj|ӓ<^Y#QӪkXNx?u쓒ʔTBW|-ދi$BʼnQw 6Ӆyx"\bk҆.y?w;)E57Q+U&jI|v=d*{9;N zU֚W671[ѰYXpAʝD(4i];օX*ZkT٧2ǕQ_0*\/G0?ӣ"kDZ[DO al̞@e+KV:4ҢrG"*{ iFMr>nپɽ`٥SR!0(Rc+ǿ᷍SOJz]Az M8Q,@c\5GJr=?;F-jd0j:tmbUрdu`2`"q*a:UUij5tM6:ЯRM5i=-r&wö$WXז,sB@`efF vcj`{Jvi4M4ҔZMrbhYzOM6{[ݾݒx&m IcP}G! h٣ j\xM5jZJ d6w]Csr?֬9E,5Ĕ ڪ^['{zI'mE|<ڿ?4_NpP@P@P@P@P@P@P@P@P@P@P@P@%~ԟ&GAb.]3FCK'ۯ# pȅ&'8(d=mdy3 a}dV]_O6#<:x}Czwj Ue*Ʃ1 q""Ʊxfyiҵ]#}[v[gUc,MozVh+H_Vݖwm':\x{FKk2J LCXI Rp_j|❜TUqi_ ҅ϻMAvqNOo**84׫VXhu|K(V,vI$u$bqqUZsݶvVC VZNR{}zn:W$hwEe#9L|JqV(7UR3.Mz__-^fq,w7yhieO1bWf5/ߖ)(7azJuVo^hZ#"µCGLdNP Z:#"ujv?M> xgkhټUvc ٞ\g?켶bW?WU9*vW|Y\jc2ez2ej2ej2Uz2uj3g4g\j:nO4[/~Yb-.,41e٭|gNv ZNITH)Kq4^mLx{QűhkkvwLw&fGm]qd)(ʚ˜_&,VKRNSWr|SP)榧*=?_>_뀃:1;EGR6,jncZ7]hZ-ז}yI%uw9Q/ټwH 5 bqЋQ]hau/kRPs*$Z/+uFt x{B𯇬ɠhPi6c[‚8{̈́UbI$q&3.j$'d);ed$tiB;-V*FEgڴR5R+4UjFegڴR4R*^jFefR4R+4^jFEgڭHLVFGx7pj/7-wHEժI͌ 7@9#t,Ht2XhJJvd_(J7veY7p(IVRq٫]_ui4to^-vVKmbYT$ YuV.tcptMcpMʄT'd웄QQjST12rUjwN2`WvWx?(<rd7"ɧI%{ ڄ9M *MvܴSOXάI)SNW/.^:f >iJ2VZ 5GDb>JE)W1jdF"Țj"ȚbZj|ũ4>JE)45JE7/}{{xòAx^3 {yM5(xHo6$O2}lN91I[GFq&$ڌ&rS^J4x{/y+Ť+l|Kc-ͬ3^[JmTӮ+43($)dtttv6+KX.J-tM)FIJ20ظbciM4iT2ڭH3 C|=<_7D֯B|Cew"TclLIh2'd?N=' 5𽴓)A]/;/oV})4ڕO{8jN˪#x GF`+O| >\)}Fa+~#?ƭ[wG'+yفB {9j~Ny8R:i5FsyXg>;*dSOq7K0W{ >r3>qj|s0ڟ01Z66A~vlݳnpԹsJU5[w1uy|9o{;Y9߷{i{Z=ɯM<0);l<<^mk*{eB%f2С 嗟9+:/`'ҧ \VISpQRs8#ڎqg6/.hZ̭4FoKiy!/#}>v#GIURIQ%SIhF,W,97#h%jy8܉oc'|qu=-WlS+|r̥0v\# ۝Ǖ^W1sG0saOjvuIP̌HdueVWRYC)[aU0ZN^}iWM4Mlƽ:xnUt[jkT5fM4xgRy/Yx͒EQY6p@Vp̪SQ(^~VM$w{Mmh/3QjE.%7iF`< j'zο}~ {OAbV9Fp0Ha_:Ro~Qk7ut\ A:qJvkWzDK.Gɧïn'`(u""*c-ש,t~]'&ב*G nU.*rG=>s/Kywjօ˫i1qn1w#.U{9.KN2+Fj4ڿ,/ ZOKi+]_ui4։57vOnm%` SKCY g2!Q3N';\i-ID%x3nyҨb/dv2)I٣g~_.mxFVLvWsz@eORԧ%h+/f-=R52'vdĶםrZ:-m6:P6kkG4lee<2H A 8ԧ''tӳMlC 3|74_ T_|?u&W%-2[0\){ui66KLD%GkJ8*(jr%uhKY|aym8N%)>Nnz46knjZ6y$SE$l#\k0WBw++丵ӳV}]I)$]eG _N]?'ŷNէGؐ%Fo6-숪rKGZ~g3 QkޗһW\ѻpmk(Jpɧ'ɦ50P@P@P@P@P@P@P@P@P@P@P@P@%~ԟ&GAb.]3FCK'ۯ# pȅ&+7d=m[cտ.i?>ϰOHǬWʹ WĝgWΫ\5ޣ[e7+mX3+ƫ"DШA_fT,Fjߴ{S^ZV'y-~WKW%x.JV'y-þ)P&K~D1I߬Mr2"F6؊X~_V|Ӻo~m-~&۶򤗑_1%oʟ{6ۖޓnj)%+aI+zz1Y3/F+&wG KϊO jImf94.]~a!cvd1Y ZP,zYmGßZ֥h[VOi-Uxʤ`Q[JݷUߕti!R~2{x;{˘dx L2)S :ppq9V mUj+KݒoUgN[JIT犩f_4q{G_iX`~#떊p4]&:aq,cn4$ΩSiRyT.XQ+v)cxrKis''mÚ=[nl4t-Yƀ(31{XuYWT=&ݕۻvI/Bi՗=F}^FF"·JȰP :c"µCGDdNP6U^gY7wR,Q[ĊY݈ IN J.SI$z$նIntBW? 4/3-^ϦXed|M8Xw2!gWC.IJr;sޥD֒R 7F筗Cו4ɕZ7ɕ7ɕZ7ɕZ6UZ7ժ6iFao}BVW,UH*A ]pcZgiN馵M=SZld'BȤY2jY{&"Q5hhԦRMJNY&R=W>|䗭lx唎"VhVx֊FegڭHH{VFEfHL{VFEWڭHL{VFEwڭHHU)<)anaua2Λrf+edtwExѽaSQ J2\dNId8HN5f֩5tM̵W犢V?4nGh!QcH 6?z[?X6&)=]ܽU)#){5!O c凧?jytSwݴMqr\ũUJE)4^JERJdF|ũ}S!0)y޻SFc_>}VU4֑T(6b;EUIama1q4cJ_ۦ۽IܢpmԦs^:F]?)oI+FZr&i~&oh?iukHo64~ttm.Up8\BJrqvqvjٮe L1ZdOɫ4X gZωہ gX$x 獏;Ѻ"bAr?J1k'I%׬-4h&ss5ב6މzڼc#0sFaRګr3>biQ;+7RNีdxdt# #VkԡR5iIQikT[4bX:uqj=SOtTy/t]?֮ N@g8ŻGH3J0O ZxzUո.TԞQޮ..;^ayiO1j|a>s|Wz_ؿG}3ȁl|cw'Fݧ~{ߛҷni:/an׿gcgqJ;rԿcmmn/>8y>s9x7 Ή$0G w"Q0I@`Buu<%g BnDQ/ÙI(G[sE)^.Q|9 )QiU{)YwZn2mI/ v~+4XC<0^nV{I+$ 'dѸxL]O -L<5F|2[ExZQ}bZ3l&2 %>k4CotQ>q >Ü+zֵ+eՋi:쁿*F2Dbk衞>g?!hjuQ9ZU_OVn[RlamW1e'uPI6hMh.tڔ?.oyr۲INUrZ:hfM'cN@ӵz kz*nbr.'X|$.-w<r_iLit{e2̫9!m򠙭~Hq8$7QZ*|.+e9-i9XK٪$ OxJ׻kV{SD#RWaKv/E (ʲN 'S^u#u%ގikum' ZW+WQy1u8n_?_[kFJ'5HǯKj(HymQO>j,Hi $3Jt\N֜4%tMVe/au^~gܵ0P@P@P@P@P@P@P@P@P@P@P@WdxW[ŭju GjL^HF #\fE_n PM}bK?3WS2|q S[N29[ާ ]pkb]U+8?vwJ~#"\>c'u+[h +[5˗0 lֶ-IӸNO榩+y7{ikOLRfMSVڹC-% VnSATqN[ҵOZ\M>j=_PwS?Vp7-,'<;Nh42=-"leۤW 4QVXJ+)v\j(҂ZIVRP9/r:$äEɹ|֔"ڔUg$; mtx1j-8Q pE nq<ۉ0Ry RңiV䜤$(Z>R\q9*jZ7zJNͷ'IY{6Ϥ<97$`qZ3m{ ) }$ _18:jJt[ީ]|2i_j5QTSx=^+#V% 0aZ2,+TtD aZ2,#Vm1aZ2<1e//ye5]2-d?DcvMkQ^[/-\ZN>/%0Օk3bz{ڵ|EFd-d Fd-d-D-Fd-d FD-d-FgWπm&ƹ4x*1@eh$[ԌF!6ki=k P_ǟfR ;7n>irX^h?- S\:&Axn}1o;(u駊;Eqo-͜fG&-ܴkCSXIUf1RRrN%?c*JOOodOׯKc< Z. gV%[Dw\1 \JKHĖ??bmV MJqSvJJVIF)YTڥۯSoCs?_~UG &"RQuhoWgо*xszѼ#xsOceKAvmEgl*M~#R:ά]k5JދJj*X/i&rc|m _x* c b_ Ȍ|Tճ_/"vٳ?3%۷ٹ7W0=m~m>>[洭7BOo*߁x_Ox_Sbjϩ}8k?4.~F׋#gY#X*4Y?19-B-ٺ˛Pq&QZ4g)/DLyjhb?+A@^>xu.lݳ3T1:7~ʿ-,novEkY̅OAf7@52%&#|g?Cn~U )Xi4T*}]zR"Ծ;Cӟ帳+Z}3ζӢ-#|2G"(0iexl+>u YiQ{J-];Xy%^m۫QMzfo?/u5YP\7)4X*???Hϊ.ԍ'+fk^ ))ENFCX))S"hS"1{U)y+]Q|EejWrIAH#IɎ7*.sکH23>b5\)}0UW90K>'-෽cujB?0\R@*7]ʊ ǹw^[}F Eq%F868\>.֩r-J/{5h$n.Q}2{6Sid Mcu4Nȅ)6ppPsST+[2Zuk.NJ5#(>[gMVW:cp >Sa51|sSh%W}3~OԹ񼚫g+dhn 0sG${mm K2gAK*2ۚJPg}jj5g[IJlWCW18.a9E d]|7ѬDa G",~_-$`07 y7>iQNlߕMyVkqqPa%q\aDXEoޏ{m W_"$wk+*|[Fd`1kRN2ѩE]oJnLÞ6Il4ֺ%$0x_ē$7 Tb;*heU]X䄹NQX*ԬIXݤnmC9j8Q$W~$~ͤ ZxøuYu~ɿRſWQݭ俻xO=;KQߥ6^n9*tK%[|t"$:|w=V+ mqdRcuDܻɮ 7u\hI87t(6Yb)XӺ}kHSSw6죿56ފ3n]4Rv{}rGGC|\pTҴf킢kYAc1HΆX*oo4}C>úӅH;N℺;;+i|ZNۣ>t( ( ( ( ( ( ( ( ( ( (B T^MZ& Y7k,1,PM+C6ĖCOɏ˰WcW%ݤygɰu1ئ ݒ^mե-$zo&T\)QIYE .$DQGqjufEս[?s"g؊1%.hɸǢIhoVlkxܻXюHdzx=m['B^t):,q <Pp3Mר:IWrnJ)pm7M;sJm$r֭oB?Үfy|7U4.Snz<_(iniFzeQ'ȺcO%|[K5y]I'ʺwiovjWQp~uVS}ˣtvN Vڭ{=5I-vEW9}S}yY-xk@]V!༂EŻHpYaC6c*NU0xN_QMŵgQzJ.q{4݆˚}>?͠?v?kSto{E ܨww/-W{__ۂ6Ξw7(FE.~ݸ薊MW$`?h(+H#omh0!$lW7(੬CJt[ީ]|2isrMFZ(Q>{IjIuHQhpaZ,+T4tEjȝZ{V7{g\]HEH 3UTI8f*51#F\&I]I%mrv[? 5/S-^ϦXed|M8yaʷWl]|C^ %*XutzZIJ^'dRR'UIGez|CɕZ7ɕ7ɕZ6Z7ɕZ6ɕ7ToOǯWcӮQ<ߴgE? ۿc˄s_t~}C/>{i~[ۙ_XFZƝk?M+] 4;?w٫)l!^{ 3w/=5%_( Yf~?[Qߌ.+_w,'e֜ۓج5ssN^[>mD>K+t IJ>)/L61k] yZī-ֱ&}.n%3L.i7ԍ PATTkBqI^T^PFe]uצ7ӭsc~..O~!xCUK=F X3:qAu]] SOʛVHL?J)arZ67fqnQ_,˶(Tkn}8޾RQH(N婐4ԍZYZ]R4S+45YR4S+<>jFevHLoG㏋@͔xSM?.-42w@Iڬ2./gr_>ҋ5N+OgB&RrPRr^[g"vg@ /;OP.ToZnc_M3XgK_,JU(+-\(ST'! qu*,GK%/K#w}m{ C_6w}S"1{U)DaR-LR)LR-L|CZ_G¯?Rt+Kڡ|fª({>(1a1iӍԜb씒WmsTa+ԫJ29FJiV:`?^>[Vv1AmY=sYkZP.FYTNSWI+$,ihќ◤c$jܨuR`_BӄvI,._-y3vځUt\MJTYZ;(էMYi7v#~l=r;Zzr~w>VO뵴!/k}@X%$ɴIeM({|0jBW%^Ή|3ķv3٭յ X.]$LWJhaz-Ra1c(jVr):I*ҭZsNOSc GVFn6RRh9>I{Q{s?^)l&<}#^w^yJBg8`{uuқWJqqv^I308К馯7>tsjS#0S)LTW91Jc >Fa+Os̼]x{U)/V֛ m3_i3.&73*ƬfS$[˱2Q*rnܵRn˖$ ܚT,R3)a}rIox]oiI$2lۋycscjz]mIqowk"8 VR ^EXTԕq[M5fѦOcЧZ5bxSZT>Ɯ >0Osɾ E~׾$h7WWvW;GqD3ZFcK99k]Y4W~^{I9־=Oɯ9}8y'җ0s>(𵗋|?wPx Y4sD$J:+@>]*M-dW%}bz3F26ku}}$}LF}Yjz0Em PKVX̪H@KmY b-3\%<%JsۥV*pn׳^n^u#<.u(pn2Ѧ4\ek[gg9qj|90Q>q/ {X,gJjʩEqMе f֭}TwXKow3Vh|d9~;SXhΤIF(Fݝ(sS38rrظ:VqmIYrwg'.Y&Μc)sF+kj}ú߽}W[կNDH hZ&*Ν(et~hܯ\,5Tߚsw+Uȣ+ic~D*"!RK2RC:xP WVzV[k-څ夒Y-$Xkv-[o /<r%9qVH;*$EiJZ_TmF^Ohնw\Aӄ^D*\R%VГRnJjI+hQag)KkK]^ۭSOgg$75tfĭ%$I!ybe |HD|*q䰴X5[ Q}yyU^+ii򺔜m%.J۷K i0Z}XZSI밪@́Wk$u'0RsA ZqJK{^ګ2N2Ҫ5.դ]UOf֍^8Qo4jUו?\z_~Ɍ'L92#W_BB2Ozob?3.vϻ?<7_awKk4)V?aSگ^V?+;]-dڅ.$ch2 'Fnh[;G8U/|D]j%wvEZ>չ^Vv/o//t4o| T<ZeI|/ ,C/2*$rXIve.W%lU?oi)-.emd9~>&^/#Kvl/MEi|Xҭ6r ff0tY"fi-uGgGy}"}$^f]|ix 3 ( ( ( ( ( ( ( ( ( (3m[J4O]u;M;Dӭ仼/X 5/$*"fbq@~-k_{|Jբlisct*\M$~| !2Jе~;ř>Ɠ4Z7ܵzjv=⇟c'zMiM:wUnf>=+*3Ш+FZc+M2e(B )PP&ZzL=\MEJI6] n+{XQW['Ȟ':eVk[i$Tѩ5g7juiz VSo=mY$iz;b42;y$3Lc{HCV 7H坈kcq4%1[F*F)%#22ju֋]EtJtEs]&w6xm2\4 1&3$h 2-ePXeOYQKF{(9JNvSm$۵nі&mmMz&&4x~ui!ķ=u,^JwHha~Ya$$3|d1覩E(=#M)k9G9JKs&t"H╴rm;jZ",+T4tEjH3EKe +%A*C6c*NUpxN_QŵgQ''M|MJ+t~k[4r@͠?xv?S+xlQBwJ$wrz[itۼI)FF5hb?%|/=;@7]$OT<=moaE* }$ \E*|mݥuɥ5Y(t*R\Ǻ}l%#V%EjȰPu1D<6*鐸m'Q8Xr.ɭPC(g-ٸjq)-fN;Ye^Kϔj&ɕZ76Z7Z7+5gfi~&&~?݆m߱cc%y/>{yB7~_m(sNn[^WJK}=thߌ> Ķn~Pߌ67So,&Gyyﷰ9ۿ7xk_[sjՋ=W?|p}?Q43?{-gc/{a2{vVy凉lUCV/Ĺide؛l\sˍ3b=aas{--tWh3&Wh3%Wh3<Lj%_Ljqw4h~t->wI,ecTCغ9R:qJog^XEpl˪<=[kZ/Y'qiPH?oM(y0K\YV2T ZmQxsr1uTox:4l5mjFevڭHLU)j#E2AZ))ğO=7JKk-!fU#mM<13x'xSjW]p7\^J!ffg,L4k9#97^֋ݧB)$bI$Ӎ;W~μ^r? bY> 6h߄NVo83Kg2܅%m4,M3}Ny/ZϣQZ\WhhBcNK ?c'qzz8ݶf_4w)jS"h}S!0)Da>JE4^JEjS"h}S!h}S"h}S!h}S>w<%Z>kt_ +}KNeTh/;]dP$rNiW\ewRJ RSӫ(iͫN8EHhG5'PZٷZYм'/= iUwhZyv[Ko y#Ikvl8,>]^OR!t/uΜ:$֡VwjB:*x%V>jI$Ԓ{U%}˒|5+K?h5VA5HgGڄm&q2W\ƴJ4*ZQuqk4\[x__FF<۟Zx tҭa]H L[G-ܫQԃVo]JnNg9'OX5)R]dR,Zk۷:UjWyr0M6l2 W0ӕ:$%uutMy;E:U)IJ/w_z4>Շ1 >b>\#0S)LO1jb$bw _\ x?^h0!4&XB7+ XmaE:iϕUW!Q|NVypO5VowM%(=)z9} Loy y[%W99o{;YU)C5 ۚk]nz^1sJ9_+ڗ0sG0GyW ^i=BuI `KYTHVDhʊ~()(>Un}ycV/+ԍ9FmyV-7v*riW8H>qH>q<9O&qay4s>Uß>#^wZ^hb2IS+0\ wI֩N/E(є/vN FIkT0ukbiFO{;Z)-c̕Z; ww|'.~D:v0Ox+wW+%R00,?WSq e"tܓnw$>}}GҜ"G ^&\2d^$h82wW9(ڧ"aKD*"\4-JMlx'I*A #uPjғM;4֩M=jEj٣E4tiڍtH]3s,b[LY)B|inO.\+pR͜XZ(kꞒ󴬔= E^#j-Y&EEIƤhOïjm_JIOmr6N.v t~N\yVݬ&{kG4ldu9 <j!Vt'(N5i{3RMI]3S? eˤUGyܶjpyi?=;^M}z]ߣn=" T~k}y&OY^E3ȊC{D=F:__iNZל|ѥZ'-b?v{SXѴBĚu䗾]J#Y$ go0\$gUbOgWYWh)*dۊtK]TJ^Ejve?cf?Z>ki1֭,sp,XSk"x <`2k[I?$jVOTv>pA@P@P@P@P@P@P@P@P@P@ fv⫯;|]$޺y#YF[Mg~.ν7}m:/g}?#/JY&NrO^{>kOC_gH)F+F2w6=:[XCrT2LpĉF;KRAVME5u.Y'tkATO K [5D"wMJR}; 5rodè ?rh~ҲY$"f+Sx|<}S~o5eA;-|ux*Ox5sojˢwqnhzWM;iOJ~!y|i\A0lj7qP9' |׿V>R< 7}(>=Zm,T4tEjHP :c"µCGL$d>eV!ҠEŻH g8 x%\<3(f,e]Iʰ"3\x{WŠUZA;lD&H #bqF'MWiNvU ۻJKFZTgIsUPo5=N M6'E("@Y݈ I' כJLEHѥ)ɤWmIj{"MF*_ 5SŲ^Fͦ؅gftM8ybʷWl]|A^ %*Xut=TMi%){taIKX$8;dZVh8|1#$l]5߉~ɟ9mfnv6=pmKꏰPߗJ庽ܨUĹ}lZ c??Ks;[7?woc)~[g<&0”n}oe͢t|5Ooaöw7 eva,)՜ۗج=ssKrj_ >Ƭ_sV?w}u{2Onw{wMظgv{0ۛƟ=5nk3{z|EFd-d Fd-d-d-Fgq?Ӿ/7[[ Fkz!;]~`ަ2}/ c'=Q8>t_|ܩsh}9T$Jƪ?*G9ѭb!u čtžTPVA$r4_\abwArEA[W,:j_NPmO?{z[ cԴhHLJѢ z) Z Rh-LhVxzVjWhjԍ $>?،\^N~TLW_J:Y-Wl*_ȥЃ[m=] uۻRUcZ|.lOKB+2کH3%7R>m{ᩭV0Q@rXM)qєc=3:xPngO2n iQw(:u#x|KUk_'{?'fOxºt.muc|6V[[Va2,y%$<\SYo8(J֔ZћRMu<C\JFd- RJdMR-LR-LR)LR)LMH2&کH2RJdF"a7^|@&V].=%A$i8LX|2?*sB٧JIF|8 >ac/_KÂ[EψhYKyJQΝeRSV$x_U5ʒ[뱟/K|AaXd-R%O}ylYwd9N[?jٹ:aZriʭ%cNR}\7]xKj NiqLmob% Pl0WC q^v;/uu қWJqqmji$tCGz3R[]4Fڸ>a)L[KxsW֣-Д[6T@ I#|" ˳ n**MҌjem="qTJn[Ѯ=Sf/Aͯxs07fV褌<7.J7I&iҼCm2g.d$e2H!,´eYKߥ_"TbU{"1Xcݟ^ZݻFݙzu|>/5Oq}is*j6ZC4wsjY*zUv}UIZ)6s))Rxy`,\۳3I%mlRѵM;]M.s-,9#`9ՑpYXlM Jei+uM4M]8ӌjIM2׍h4iꞏSabg!\r%X\r8:)ͷεd¨p \ ^W.M=½ ( ( ( ( ( ( ( ( ( ~hgُ!eYVPډ %ZFy6N|4UutszE>nM)p_,F]ޚ)춍Ӓ?46Ft#MӬ`Kkx3yqUN$_kNIU)6߫՟xE\ei+mɽwnMhXnfH5OuzR׺"42)%Uq| Dε0Ukv4'hW+kͭG VSuݡI;9=ڿڕ䂔b˶^ $֦r4A=f; i$ut 㖮gK \7G܏Ҕte yiu5o.HʛO)wq;/lmml-mllmb"UG@8WVNU*I7vޭogNV&mݶmo5 4m dlfy3xTҭ[N bnRe)\-.jKn^wqcveh|’F"#S&YIe1re^WSMJ J2N/D= Λv%}w}z9 tՇ8Nhaw.^PѦ֓k8NVW=?|P=&BޛhΟm_%ݍK47PxF]IH AZ+ЛӌiMjzLN|:յ/ G5 GW.t72fsK#[MMʹߺPΰԿ0PYNRJKsZ)iSM)IB?:Tb_5ce2@hHޕLJ zV4SFdlh;*zh4Ʀ)/I}PisEsggdoLnv%,f{/~Ue^iqI^ ԧ5'rџ4SR:Z"Ȍ>JEE ] ZkM',o67>c`E '5rEӼWU,<5?Q攪ҧ)h}bS)j/[$i[זV{CC_0v)4>JE5JE)>jE5JE45JE)4^JEjS!h}SdhMC.UeH#<kl:]K9)E;J-4٦ԌkBTZi3mVڟ_wSz!<*jQDv%PH )ypݿfԚK[ʞ6NTIEYakͧJd}4]ܚi^=% HS#1{Us La1Jc >< <KX!"g-" %*w "YNC>_9WMV~ɻrI+ʔԩQkT®ys>әi%%i/l y| Ũ`Qi5-K[TxMܒDLJ2 .}ܨTյ/kIEi҂Nܮ1\(bi RI|dߛ{L|_sWM_'v~UWE _ʊdI.Ȼ.ݵ.iQu&ӊycV&xuYNkg}x[ #tFOغ2u;wvm:Tudu  q~UekݚVgSRqiM3mn&Oɤά^w1y9΋ Z}c.5 :y`kP[hCȱ4SS/J*ٷR1=.bR9O.&*n58t4{]u^W|-cJ6kh_h7fxʎtte` ^W٦iFI&((gU,D+ANM5i=x?|ZtQfx997;KGQ r3Y}W-`δ˕+tJ⚻Srn<,&gAvj*zk]3|jc$zQ^s _$Rq|j9Ü2z=sƎZr>m-ͯ_h@ȱpP˖hu-e?g8§,lݤ%-<rzDC_2{ )QrΫܮJi;>|e od?J jmwOѯVK,`/"{{KX"pUѲYI ZXzJN3M4Z4O>Zpz4k<=z{JekZI+]WwJCj][ݪ %{:s Xd5Ji-"/zj9k#ZQw=.q2JGÈ濺4>s3D̊YsᤀxX&X Ɯp8)wIw*ij-fR''^SE/)[zeh%𶴐i^UBy^D_%%"RY\ϛh7[F09>/kMZi-{չ$z{"K ڗ0U.D%]Lo-ztyYj/ ƚ4~r݄9vW.*bKkBPvZpI.G(s+4_F5\ON?u]Oz%7jཾ|K_-&k&hĵ&pw/WՇǃUYNUKy fOKVơ:KHnoki)?eS//6zFi^$n]j\!wǹ# #:ʬ0x\]lh^ufwM4ڔZjIM:IY0xizeg&Q kOepQv4DDc Eon3 :dVzԍ/I]ѩ+MN^g_}:_Zu7Ԧs%[ lioWkyÁ ȬNOxOjTi7RviF4%x'̨])+㯆8ni^\ZgK.+_:]g :,sC>Us,qxI^/O4i2RWGפ0 ( ( ( ( ( ( ( ( _<c~3ܫj k-:VKZ핚;[X(yX#YQI8EʽzxjnWh3ySPv{$n&/k%~x{Is[%l.1@!(!7eD#<ݿ"sfXV{m(WcW3IO=!Y&qOW^K%znc>:t8.%Xc$(@$ԁ^"S5N\I]jʪs{(۲Zok Z P:V#߼] (Hy&U~EN.Mk=פN/\W񵈪K4ԣ)xUN4 /ÖeA"G$YeKr$3;UU0Uld=RI$좒I]Wmg**m+$RьRUm$oVC^s0hzVlhk6vSe5Gm6rx^qB;O)=תmԆGk`?`#ZTi˺"kޤU{h/UA|3Fӏ=qZǘժ:a"5CGT$XV:a"µCGL$XVh錋 ՛GL$r_ ڥdžN( ,%?ǟ9|dV*qt 7)MŴ֜Y.X?-#go'gd6'OՏ4Wdꚴ~eVib-B[pjw+Vd%۶^jUACAI>Fa*jyM;B1mW7$`gnfe{$]rI_JvuC?\oVZ5pd |Rj7QJ]ű#8R*Z:1rU-R5JRկyK?d][.X~*$?H?__|FQ2KF2CF:KFљ*KF2KF2CFљ:KF*KF2KFљjͤwLnUiWX2r@2GZ2깶:_A:ӌwsvɻt:)˙WPW[_5ޭ=3[ F[۵,g306X )fMRJ5(F>{6!;{IY.Sh5 T%RѪq<&z52U5uk_r)ȏKo,h(i~rRS,#}I,⾣#K-g/QZn} F h{#/c8I^z(a;TȌ>\s0S8 W1Jdf|)0SګsoX7-jwztkb[ir&GVD`#s(X*gnh+N N3N-6ieZEHϪOtLdGm/O!ѼS^ L6IBj3du@J!>x 1S7Fo*Gv9*j_RͻMzzhgˮQW? ƳǐnIOrկ`]18g7+ǗWcV𕞒Ua㴬&WjW]]yWkU}Ms3zͤxJ3I%Ў[[k!gX/n겶򏠫ٮe6SKHN?x{R:|ѩRҋJe(G<)8j҄Opz&g=\i76K-j_ <%uXXYMTk;BWFr,sʊUU YcF"\ڼ(IJ6BIߚBWZ7(B-dm$K.jҗiI5fI&c_&`ɣ9ɥ.q|9_$zQ.q|j9+XO0h?͢i-Eʺ ˲vYgy5O/팵*_ߢ&)J$NTcѓg\G'ب^R^RI˥nI/\0{Ws|9'O|y4s8M>a7E:~izR.7Foq%%2EYըA(S'mg))^}9LmY)%NOWE|1y/|=Nx|Glw%2J!P` 0KYKߥ_"W5Jdy - nnݣ7=xC_9wsߊLK QscY2Λrgu!9wF*mWRjҋ3qM;]&jQR,+ӎ"<ѭS[Vj馛GCSViIsq ĩ⥴ao`ƞU<7$f 3CifM&KލۦSr8*EU纲S~2I˫qv"%ȕbr!G|][ÚEѕ'@E I#|e WNS.I&zKg$%x7z3U˯޻5٧}w^CG0ZGYXȶ!-n#P@B]Lo` fB[Λi/z|H.Z*]8Kѯ'ګ3{WkH#K 1.G?SkUU?RjsGoOr3$֗1XKhU ~J;l/ y^c/iEuRTe*p]r/eQVވ4uŭ$j?V_N6/s?v#}WO~%^lbO4J :'59`U2H Hj*F)8-4ӳMjkTٜӳVgYy]%n}#<bHyɟ;e+ĕ攩RJUJr|t秥[Jr8TO[N_4iWz.h.t7ǹ# #:ʬ0y

L; typedef L * RR; typedef Matrice_Creuse * MM; static RR f(const MM & a,const MM & b) { L * l=to(a); l->push_back(make_triplet *>(R(1.),b->A,false)); return l; } }; // Fin Add FH Houston -------- // for Jolivet to build restriction jan 2014 // t[int] I= restrict(VCh,VGh,IPG); // ou template class RestrictArray : public OneOperator { public: template< typename T > struct Base { typedef T B; }; template< typename T > struct Base< T* >{ typedef T B;}; typedef typename Base::B::FESpace FESpace; typedef typename FESpace::FElement FElement; // typedef FESpace FESpace; class Op : public E_F0info { public: // passe de l'info .. typedef pfes * A; Expression a,b,c,d; // if c = 0 => a,b FESpace // if c != a FESpace et b,c KN_ static const int n_name_param =0; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const{ return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} public: Op(const basicAC_F0 & args,Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc),d(0) { args.SetNameParam(n_name_param,0,nargs); } /* AnyType operator()(Stack stack) const { if( verbosity>9) cout << " -- RestrictArray "<< endl; pfes * pCUh = GetAny< pfes * >((* a)(stack)); pfes * pFVh = GetAny< pfes * >((* b)(stack)); // verif same FE. KN_ ncf= GetAny< KN_ >((* c)(stack)); FESpace * pVCh = **pCUh; FESpace * pVFh = **pFVh; FESpace VCh = *pVCh; FESpace VFh = *pVFh; long neC = VCh.NbOfElements ; long neF = VFh.NbOfElements ; long ndfC = VCh.NbOfDF ; long ndfF = VFh.NbOfDF ; KN_ nc2f= ncf; KN *pnum=new KN(ndfC); KN inj=*pnum; inj = -1; // un set .. if( verbosity>9) cout<< " ne =" << neC << " " << neF << endl; for(int kc=0; kc 99) cout << kc << " " << kf << " : " <= 0 && kf < neF); ffassert( kc >= 0 && kc< neC); for(int df=0; df99) cout << dfC <<" -> "<< dfF << endl; assert(dfC >= 0 && dfC < ndfC); inj[dfC] = dfF; } } if( verbosity>9) cout << " restrict: Inject= " << inj << endl; ffassert(inj.min() != -1); //Add2StackOfPtr2FreeRC(stack,pnum); return pnum; } */ }; RestrictArray() : OneOperator( atype::Op *>(),//atype* >(), atype(), atype(), atype >()) {} E_F0 * code(const basicAC_F0 & args) const { if(args.size()!=3)CompileError("Bug in RestrictArray code nb of args != 3 ????? bizarre" ); return new Op(args,t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2])); } }; // end restrict ... template< typename T > struct Base { typedef T B; }; template< typename T > struct Base< T* >{ typedef T B;}; template AnyType SetRestrict(Stack stack,Expression einj,Expression erest) { typedef typename Base::B::FESpace FESpace; typedef typename FESpace::FElement FElement; KN * pinj =GetAny*>((*einj)(stack)); const typename RestrictArray::Op * ar(dynamic_cast::Op *>(erest)); ffassert(ar); if( verbosity>9) cout << " -- RestrictArray "<< endl; pfes * pCUh = GetAny< pfes * >((* ar->a)(stack)); pfes * pFVh = GetAny< pfes * >((* ar->b)(stack)); // verif same FE. KN_ ncf= GetAny< KN_ >((* ar->c)(stack)); FESpace * pVCh = **pCUh; FESpace * pVFh = **pFVh; FESpace & VCh = *pVCh; FESpace & VFh = *pVFh; long neC = VCh.NbOfElements ; long neF = VFh.NbOfElements ; long ndfC = VCh.NbOfDF ; long ndfF = VFh.NbOfDF ; KN_ nc2f= ncf; if(INIT==0) pinj->init(ndfC); else pinj->resize(ndfC); // KN *pnum= INIT ==0 ? new KN(ndfC): pnum; KN & inj=*pinj; inj = -1; // un set .. if( verbosity>9) cout<< " ne =" << neC << " " << neF << endl; for(int kc=0; kc 99) cout << kc << " " << kf << " : " <= 0 && kf < neF); ffassert( kc >= 0 && kc< neC); for(int df=0; df99) cout << dfC <<" -> "<< dfF << endl; assert(dfC >= 0 && dfC < ndfC); inj[dfC] = dfF; } } if( verbosity>9) cout << " restrict: Inject= " << inj << endl; ffassert(inj.min() != -1); return pinj; } // Fin Add FH Houston -------- template class MatrixInterpolation : public OneOperator { public: class Op : public E_F0info { public: typedef pfes * A; Expression a,b,c,d; // if c = 0 => a,b FESpace // if c != a FESpace et b,c KN_ static const int n_name_param =5; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const{ return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} public: Op(const basicAC_F0 & args,Expression aa,Expression bb) : a(aa),b(bb),c(0),d(0) { args.SetNameParam(n_name_param,name_param,nargs); } Op(const basicAC_F0 & args,Expression aa,Expression bb,Expression cc) : a(aa),b(bb),c(cc),d(0) { args.SetNameParam(n_name_param,name_param,nargs); } Op(const basicAC_F0 & args,Expression aa,Expression bb,Expression cc,Expression dd) : a(aa),b(bb),c(cc),d(dd) { args.SetNameParam(n_name_param,name_param,nargs); } }; // interpolation(Vh,Vh) MatrixInterpolation() : OneOperator(atype::Op *>(), atype(), atype()) {} // interpolation(Vh,xx,yy) // 2d MatrixInterpolation(int bidon) : OneOperator(atype::Op *>(), atype(),atype >(),atype >()) {} // interpolation(Vh,xx,yy,zz) // 3d MatrixInterpolation(int bidon,int bidon2) : OneOperator(atype::Op *>(), atype(),atype >(),atype >(),atype >()) {} E_F0 * code(const basicAC_F0 & args) const { if(args.size()==2) return new Op(args,t[0]->CastTo(args[0]), t[1]->CastTo(args[1])); else if(args.size()==3) return new Op(args,t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2])); else if(args.size()==4) return new Op(args,t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[2]->CastTo(args[3]) ); else CompileError("Bug in MatrixInterpolation code nb != 2 or 3 ????? bizarre" ); return 0; } }; template<> basicAC_F0::name_and_type MatrixInterpolation::Op::name_param[]= { { "t", &typeid(bool)}, { "op", &typeid(long)}, { "inside",&typeid(bool)}, { "composante",&typeid(long)}, { "U2Vc",&typeid(KN_)} }; template<> basicAC_F0::name_and_type MatrixInterpolation::Op::name_param[]= { { "t", &typeid(bool)}, { "op", &typeid(long)}, { "inside",&typeid(bool)}, { "composante",&typeid(long)}, { "U2Vc",&typeid(KN_)} }; template class SetMatrix_Op : public E_F0mps { public: Expression a; static aType btype; static const int n_name_param =NB_NAME_PARM_MAT; // add nbiter FH 30/01/2007 11 -> 12 //add var MUMPS+autre static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; const OneOperator * precon; bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} public: SetMatrix_Op(const basicAC_F0 & args,Expression aa) : a(aa) { args.SetNameParam(n_name_param,name_param,nargs); precon = 0; // a changer if ( nargs[3]) { const Polymorphic * op= dynamic_cast(nargs[3]); assert(op); precon = op->Find("(",ArrayOfaType(atype* >(),false)); // strange bug in g++ is R become a double } } AnyType operator()(Stack stack) const ; }; template class SetMatrix : public OneOperator { public: // SetMatrix() : OneOperator(atype::Op *>(),atype *>() ) {} SetMatrix() : OneOperator(SetMatrix_Op::btype,atype *>() ) {} E_F0 * code(const basicAC_F0 & args) const { return new SetMatrix_Op(args,t[0]->CastTo(args[0])); } }; template aType SetMatrix_Op::btype=0; template basicAC_F0::name_and_type SetMatrix_Op::name_param[]= { LIST_NAME_PARM_MAT /* { "paramint",&typeid(KN)}, // Add J. Morice 02/09 { "paramdouble",&typeid(KN)}, { "paramstring",&typeid(string*)}, { "permrow",&typeid(KN_)}, { "permcol",&typeid(KN_)}, { "fileparamint",&typeid(string*)}, // Add J. Morice 02/09 { "fileparamdouble",&typeid(string*)}, { "fileparamstring",&typeid(string* )}, { "filepermrow",&typeid(string*)}, { "filepermcol",&typeid(string*)} //22 */ }; template AnyType SetMatrix_Op::operator()(Stack stack) const { Matrice_Creuse * A= GetAny *>((*a)(stack)); ffassert(A); if( !A->A) A->A.master(new MatriceMorse());// set to empty matrix .. mars 2014 FH .. Data_Sparse_Solver ds; bool VF=false; // bool factorize=false; ds.factorize=false; /* long NbSpace = 50; long itmax=0; double epsilon=1e-6; // bool VF=false; // VF=isVF(op->largs); // assert(!VF); double tgv = 1e30; double tol_pivot=-1; double tol_pivot_sym=-1; KN param_int; KN param_double; string *param_char=NULL; KN perm_r; KN perm_c; string *file_param_int; // Add J. Morice 02/09 string *file_param_double; string* file_param_char; string* file_param_perm_r; string* file_param_perm_c; */ // type de matrice par default TypeSolveMat tmat= TypeSolveMat::defaultvalue; if( tmat != TypeSolveMat::SparseSolver ) tmat=TypeSolveMat::GMRES; ds.typemat=&tmat; SetEnd_Data_Sparse_Solver(stack,ds,nargs,n_name_param); /* TypeSolveMat *typemat=&tmat; bool initmat=true; int strategy=0; if (nargs[0]) ds.initmat= ! GetAny((*nargs[0])(stack)); if (nargs[1]) ds.typemat= GetAny((*nargs[1])(stack)); if (nargs[2]) ds.epsilon= GetAny((*nargs[2])(stack)); // 3 precon if (nargs[4]) ds.NbSpace= GetAny((*nargs[4])(stack)); if (nargs[6]) ds.tgv= GetAny((*nargs[6])(stack)); if (nargs[7]) ds.factorize= GetAny((*nargs[7])(stack)); if (nargs[8]) ds.strategy = GetAny((*nargs[8])(stack)); if (nargs[9]) ds.tol_pivot = GetAny((*nargs[9])(stack)); if (nargs[10]) ds.tol_pivot_sym = GetAny((*nargs[10])(stack)); if (nargs[11]) ds.itmax = GetAny((*nargs[11])(stack)); // frev 2007 OK if (nargs[12]) ds.param_int= GetAny< KN >((*nargs[12])(stack)); // Add J. Morice 02/09 if (nargs[13]) ds.param_double= GetAny< KN >((*nargs[13])(stack)); if (nargs[14]) ds.param_char= GetAny< string * >((*nargs[14])(stack)); // if (nargs[15]) ds.perm_r = GetAny< KN >((*nargs[15])(stack)); if (nargs[16]) ds.perm_c = GetAny< KN >((*nargs[16])(stack)); // if (nargs[17]) ds.file_param_int= GetAny< string* >((*nargs[17])(stack)); // Add J. Morice 02/09 if (nargs[18]) ds.file_param_double= GetAny< string* >((*nargs[18])(stack)); if (nargs[19]) ds.file_param_char= GetAny< string* >((*nargs[19])(stack)); // if (nargs[20]) ds.file_param_perm_r = GetAny< string* >((*nargs[20])(stack)); if (nargs[21]) ds.file_param_perm_c = GetAny< string* >((*nargs[21])(stack)); // */ if(A->typemat.profile != ds.typemat->profile) { cerr << " type of matrix " << A->typemat< * pf = dynamic_cast *>((MatriceCreuse *) A->A); assert(pf); switch (ds.typemat->t) { case TypeSolveMat::LU: pf->LU(Abs(ds.epsilon));break; case TypeSolveMat::CROUT: pf->crout(Abs(ds.epsilon));break; case TypeSolveMat::CHOLESKY: pf->cholesky(Abs(ds.epsilon));break; default: ExecError("Sorry no factorization for this type for matrix"); } } SetSolver(stack,VF,*A->A,ds) ;/*stack,*A->A,typemat,VF,epsilon,NbSpace,itmax,precon,strategy,tgv,tol_pivot,tol_pivot_sym, param_int, param_double, param_char, perm_r, perm_c, file_param_int, file_param_double, file_param_char, file_param_perm_r, file_param_perm_c);*/ return Nothing; } bool SetDefaultSolver() { #ifdef HAVE_LIBUMFPACKXXXXXX if(verbosity>1) cout << " SetDefault sparse solver to UMFPACK" << endl; DefSparseSolver::solver =BuildSolverUMFPack; DefSparseSolver::solver =BuildSolverUMFPack; DefSparseSolverSym::solver =BuildSolverGMRES; DefSparseSolverSym::solver =BuildSolverGMRES; #else if(verbosity>1) cout << " SetDefault sparse solver to GMRES (no UMFPACK)" << endl; DefSparseSolver::solver =BuildSolverGMRES; DefSparseSolver::solver =BuildSolverGMRES; DefSparseSolverSym::solver =BuildSolverGMRES; DefSparseSolverSym::solver =BuildSolverGMRES; #endif return true; } template AnyType SetMatrixInterpolation(Stack,Expression ,Expression); template AnyType SetMatrixInterpolation3(Stack,Expression ,Expression); //------ template void BuildCombMat(map< pair, R> & mij,const KNM_ & A, int ii00=0,int jj00=0,R coef=R(1.),bool cnj=false) { double eps0=numeric_limits::min(); int i,j; int n = A.N(),m=A.M(); for ( i=0;ieps0) mij[ij_mat(false,ii00,jj00,i,j)] += cij; } } void buildInterpolationMatrix(MatriceMorse * m,const FESpace & Uh,const FESpace & Vh,void *data) { // Uh = Vh int op=op_id; // value of the function bool transpose=false; bool inside=false; int * iU2V=0; if (data) { int * idata=static_cast(data); transpose=idata[0]; op=idata[1]; inside=idata[2]; iU2V= idata + 5; ffassert(op>=0 && op < 4); } if(verbosity>2) { cout << " -- buildInterpolationMatrix transpose =" << transpose << endl << " value, dx , dy op = " << op << endl << " just inside = " << inside << endl; } using namespace Fem2D; int n=Uh.NbOfDF; int mm=Vh.NbOfDF; if(transpose) Exchange(n,mm); m->symetrique = false; m->dummy=false; m->a=0; m->lg=0; m->cl=0; m->nbcoef=0; m->n=n; m->m=mm; int n1=n+1; const Mesh & ThU =Uh.Th; // line const Mesh & ThV =Vh.Th; // colunm bool samemesh = &Uh.Th == &Vh.Th; // same Mesh int thecolor =0; // int nbn_u = Uh.NbOfNodes; //int nbn_v = Vh.NbOfNodes; int nbcoef =0; KN color(ThV.nt); KN mark(n); mark=0; int *lg = new int [n1]; int * cl = 0; double *a=0; color=thecolor++; FElement Uh0 = Uh[0]; FElement Vh0 = Vh[0]; FElement::aIPJ ipjU(Uh0.Pi_h_ipj()); FElement::aR2 PtHatU(Uh0.Pi_h_R2()); // FElement::aIPJ ipjV(Vh0.Pi_h_ipj()); // FElement::aR2 PtHatV(Vh0.Pi_h_R2()); int nbdfVK= Vh0.NbDoF(); // int nbdfUK= Uh0.NbDoF(); int NVh= Vh0.N; //int NUh= Uh0.N; //ffassert(NVh==NUh); int nbp= PtHatU.N(); // // int nbc= ipjU.N(); // KN PV(nbp); // the PtHat in ThV mesh KN itV(nbp); // the Triangle number KN intV(nbp); // ouside or not KN AipjU(ipjU.N()); KNM aaa(nbp,nbdfVK); const R eps = 1.0e-10; const int sfb1=Vh0.N*last_operatortype*Vh0.NbDoF(); KN kv(sfb1*nbp); R * v = kv; KN ik(nbp); // the Triangle number // KNMK_ fb(v+ik[i],VhV0.NbDoF,VhV0.N,1); // the value for basic fonction bool whatd[last_operatortype]; for (int i=0;i fait(Uh.NbOfDF); fait=false; map< pair , double > sij; for (int step=0;step<2;step++) { for (int it=0;it9 ) cout << it << " " << i << " :: " << TU(PtHatU[i]) << " -- "<< outside << PV[i] << " " << ThV(ts) << " -> " << (*ts)(PV[i]) < fb(v+p*sfb1,nbdfVK,NVh,last_operatortype); // valeur de fonction de base de Vh // ou: fb(idf,j,0) valeur de la j composante de la fonction idf Vh0.tfe->FB(whatd,ThV,ThV[itV[p]],PV[p],fb); } for (int i=0;i next R aipj = AipjU[i]; FElement KV(Vh[itV[p]]); int jV=jU; if(iU2V) jV=iU2V[jU]; if(jV>=0 && jV fb(v+p*sfb1,nbdfVK,NVh,last_operatortype); KN_ fbj(fb('.',jV,op)); for (int idfv=0;idfveps) { int dfv=KV(idfv); int ii=dfu, jj=dfv; if(transpose) Exchange(ii,jj); // le term dfu,dfv existe dans la matrice R c= fbj[idfv]*aipj; // cout << " Mat inter " << i << " , "<< j << " = " << c << " " <eps) // sij[make_pair(ii,jj)] += c;// correct du to periodic BC. June 2011 /* if(step==0) sij.insert(make_pair(i,j)); else (*m)(i,j)=c; */ } } } for (int df=0;df, double >::iterator kk=sij.begin();kk!=sij.end();++kk) { int i= kk->first.first; int j= kk->first.second; // cout << " Mat inter " << i << " , "<< j << endl; cl[k]=j; a[k]= kk->second; lg[i+1]=++k; } assert(k==nbcoef); // on bouche les ligne vide lg[i]=0; // lg est un tableau croissant => for(int i=1;ilg=lg; m->cl=cl; m->a=a; m->nbcoef=nbcoef; fait=false; } } sij.clear(); //assert(0); // a faire to do } void buildInterpolationMatrix(MatriceMorse * m,const FESpace3 & Uh,const FESpace3 & Vh,void *data) { // Uh = Vh typedef FESpace3::Mesh Mesh; typedef FESpace3::FElement FElement; typedef Mesh::Element Element; typedef FESpace3::Rd Rd; typedef Element::RdHat RdHat; int op=op_id; // value of the function bool transpose=false; bool inside=false; int * iU2V=0; if (data) { int * idata=static_cast(data); transpose=idata[0]; op=idata[1]; inside=idata[2]; iU2V= idata + 5; ffassert(op>=0 && op < 4); } if(verbosity>2) { cout << " -- buildInterpolationMatrix transpose =" << transpose << endl << " value, dx , dy op = " << op << endl << " just inside = " << inside << endl; } using namespace Fem2D; int n=Uh.NbOfDF; int mm=Vh.NbOfDF; if(transpose) Exchange(n,mm); m->symetrique = false; m->dummy=false; m->a=0; m->lg=0; m->cl=0; m->nbcoef=0; m->n=n; m->m=mm; int n1=n+1; const Mesh & ThU =Uh.Th; // line const Mesh & ThV =Vh.Th; // colunm bool samemesh = &Uh.Th == &Vh.Th; // same Mesh int thecolor =0; // int nbn_u = Uh.NbOfNodes; //int nbn_v = Vh.NbOfNodes; int nbcoef =0; KN color(ThV.nt); KN mark(n); mark=0; int *lg = new int [n1]; int * cl = 0; double *a=0; color=thecolor++; FElement Uh0 = Uh[0]; FElement Vh0 = Vh[0]; // FElement::aIPJ ipjU(Uh0.Pi_h_ipj()); // FElement::aR2 PtHatU(Uh0.Pi_h_R2()); // FElement::aIPJ ipjV(Vh0.Pi_h_ipj()); // FElement::aR2 PtHatV(Vh0.Pi_h_R2()); int nbdfVK= Vh0.NbDoF(); // int nbdfUK= Uh0.NbDoF(); int NVh= Vh0.N; // int NUh= Uh0.N; //ffassert(NVh==NUh); InterpolationMatrix ipmat(Uh); int nbp=ipmat.np; // // int nbc= ipjU.N(); // KN PV(nbp); // the PtHat in ThV mesh KN itV(nbp); // the Triangle number KN intV(nbp); // ouside or not // KN AipjU(ipjU.N()); KNM aaa(nbp,nbdfVK); const R eps = 1.0e-10; const int sfb1=Vh0.N*last_operatortype*Vh0.NbDoF(); KN kv(sfb1*nbp); R * v = kv; KN ik(nbp); // the Triangle number // KNMK_ fb(v+ik[i],VhV0.NbDoF,VhV0.N,1); // the value for basic fonction op= op==3 ? op_dz : op; // renumber op ???? dec 2010 FH. What_d whatd= 1<< op; KN fait(Uh.NbOfDF); fait=false; map< pair , double > sij; for (int step=0;step<2;step++) { for (int it=0;it9 ) cout << it << " " << i << " :: " << TU(ipmat.P[i]) << " -- "<< outside << PV[i] << " " << ThV(ts) << " -> " << (*ts)(PV[i]) < fb(v+p*sfb1,nbdfVK,NVh,last_operatortype); // valeur de fonction de base de Vh // ou: fb(idf,j,0) valeur de la j composante de la fonction idf Vh0.tfe->FB(whatd,ThV,ThV[itV[p]],PV[p],fb); } for (int i=0;i next R aipj = ipmat.coef[i]; FElement KV(Vh[itV[p]]); int jV=jU; if(iU2V) jV=iU2V[jU]; if(jV>=0 && jV fb(v+p*sfb1,nbdfVK,NVh,last_operatortype); KN_ fbj(fb('.',jV,op)); for (int idfv=0;idfveps) { int dfv=KV(idfv); int ii=dfu, jj=dfv; if(transpose) Exchange(ii,jj); // le term dfu,dfv existe dans la matrice R c= fbj[idfv]*aipj; // cout << " Mat inter " << i << " , "<< j << " = " << c << " " <eps) // sij[make_pair(ii,jj)] += c;// correct du to periodic BC. June 2011 /* if(step==0) sij.insert(make_pair(i,j)); else (*m)(i,j)=c; */ } } } for (int df=0;df, double >::iterator kk=sij.begin();kk!=sij.end();++kk) { int i= kk->first.first; int j= kk->first.second; // cout << " Mat inter " << i << " , "<< j << endl; cl[k]=j; a[k]= kk->second; lg[i+1]=++k; } assert(k==nbcoef); // on bouche les ligne vide lg[i]=0; // lg est un tableau croissant => for(int i=1;ilg=lg; m->cl=cl; m->a=a; m->nbcoef=nbcoef; fait=false; } } sij.clear(); //assert(0); // a faire to do } MatriceMorse * buildInterpolationMatrix1(const FESpace & Uh,const KN_ & xx,const KN_ & yy ,int *data) { // Uh = Vh int op=op_id; // value of the function int icomp=0; bool transpose=false; bool inside=false; if (data) { transpose=data[0]; op=data[1]; inside=data[2]; icomp = data[3]; ffassert(op>=0 && op < 4); } if(verbosity>2) { cout << " -- buildInterpolationMatrix transpose =" << transpose << endl << " value, dx , dy op = " << op << endl << " composante = " << icomp << endl << " just inside = " << inside << endl; } using namespace Fem2D; int n=Uh.NbOfDF; int mm=xx.N(); int nbxx= mm; if(transpose) Exchange(n,mm); const Mesh & ThU =Uh.Th; // line FElement Uh0 = Uh[0]; int nbdfUK= Uh0.NbDoF(); int NUh= Uh0.N; ffassert(icomp < NUh && icomp >=0); const int sfb1=Uh0.N*last_operatortype*Uh0.NbDoF(); KN kv(sfb1); R * v = kv; const R eps = 1.0e-10; bool whatd[last_operatortype]; for (int i=0;i fait(Uh.NbOfDF); fait=false; map< pair , double > sij; R2 Phat; bool outside; for(int ii=0;ii fb(v,nbdfUK,NUh,last_operatortype); Uh0.tfe->FB(whatd,ThU,ThU[it],Phat,fb); KN_ Fwi(fb('.',icomp,op)); for (int idfu=0;idfueps) sij[make_pair(i,j)] += c;// correct du to periodic BC. June 2011 } } MatriceMorse * m = new MatriceMorse(n,mm,sij,false); sij.clear(); return m; //assert(0); // a faire to do } MatriceMorse * buildInterpolationMatrix1(const FESpace3 & Uh,const KN_ & xx,const KN_ & yy ,const KN_ & zz,int *data) { // Uh = Vh typedef FESpace3::Mesh Mesh; typedef FESpace3::FElement FElement; typedef Mesh::Element Element; typedef FESpace3::Rd Rd; int op=op_id; // value of the function int icomp=0; bool transpose=false; bool inside=false; if (data) { transpose=data[0]; op=data[1]; inside=data[2]; icomp = data[3]; ffassert(op>=0 && op < 4); if(op==3) op=op_dz;// correct missing } if(verbosity>2) { cout << " -- buildInterpolationMatrix transpose =" << transpose << endl << " value, dx , dy op = " << op << endl << " composante = " << icomp << endl << " just inside = " << inside << endl; } using namespace Fem2D; int n=Uh.NbOfDF; int mm=xx.N(); int nbxx= mm; if(transpose) Exchange(n,mm); const Mesh & ThU =Uh.Th; // line FElement Uh0 = Uh[0]; int nbdfUK= Uh0.NbDoF(); int NUh= Uh0.N; ffassert(icomp < NUh && icomp >=0); const int sfb1=Uh0.N*last_operatortype*Uh0.NbDoF(); KN kv(sfb1); R * v = kv; const R eps = 1.0e-10; What_d whatd= 1 < fait(Uh.NbOfDF); fait=false; map< pair , double > sij; Rd Phat; bool outside; for(int ii=0;ii fb(v,nbdfUK,NUh,last_operatortype); Uh0.tfe->FB(whatd,ThU,ThU[it],Phat,fb); KN_ Fwi(fb('.',icomp,op)); for (int idfu=0;idfueps) sij[make_pair(i,j)] += c;// correct du to periodic BC. June 2011 } } MatriceMorse * m = new MatriceMorse(n,mm,sij,false); sij.clear(); return m; //assert(0); // a faire to do } AnyType SetMatrixInterpolation1(Stack stack,Expression emat,Expression einter,int init) { using namespace Fem2D; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); const MatrixInterpolation::Op * mi(dynamic_cast::Op *>(einter)); ffassert(einter); int data[ MatrixInterpolation::Op::n_name_param+100]; data[0]=mi->arg(0,stack,false); // transpose not data[1]=mi->arg(1,stack,(long) op_id); ; // get just value data[2]=mi->arg(2,stack,false); ; // get just value data[3]=mi->arg(3,stack,0L); ; // get just value KN U2Vc; U2Vc= mi->arg(4,stack,U2Vc); ; if( mi->c==0) { // old cas pfes * pUh = GetAny< pfes * >((* mi->a)(stack)); pfes * pVh = GetAny< pfes * >((* mi->b)(stack)); FESpace * Uh = **pUh; FESpace * Vh = **pVh; int NVh =Vh->N; int NUh =Uh->N; ffassert(NUh< 100-MatrixInterpolation::Op::n_name_param); for(int i=0;i3) for(int i=0;i " << data[5+i] << " Componante of Vh " <=NVh) { cout << "The Uh componante " << i << " -> " << data[5+i] << " >= " << NVh << " number of Vh Componante " <pUh=pUh; //sparse_mat->pVh=pVh; if(!init) sparse_mat->init(); sparse_mat->typemat=TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) sparse_mat->A.master(new MatriceMorse(*Uh,*Vh,buildInterpolationMatrix,data)); // sparse_mat->A.master(new MatriceMorse(*Uh,*Vh,buildInterpolationMatrix,data)); } else { // new cas mars 2006 pfes * pUh = GetAny< pfes * >((* mi->a)(stack)); KN_ xx = GetAny< KN_ >((* mi->b)(stack)); KN_ yy = GetAny< KN_ >((* mi->c)(stack)); ffassert( xx.N() == yy.N()); FESpace * Uh = **pUh; ffassert(Uh); // sparse_mat->pUh=0; // sparse_mat->pVh=0; if(!init) sparse_mat->init(); sparse_mat->typemat=TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) sparse_mat->A.master(buildInterpolationMatrix1(*Uh,xx,yy,data)); } return sparse_mat; // Warning .. no correct gestion of temp ptr .. // return Add2StackOfPtr2Free(stack,sparse_mat); } AnyType SetMatrixInterpolation31(Stack stack,Expression emat,Expression einter,int init) { using namespace Fem2D; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); const MatrixInterpolation::Op * mi(dynamic_cast::Op *>(einter)); ffassert(einter); int data[ MatrixInterpolation::Op::n_name_param+100]; data[0]=mi->arg(0,stack,false); // transpose not data[1]=mi->arg(1,stack,(long) op_id); ; // get just value data[2]=mi->arg(2,stack,false); ; // get just value data[3]=mi->arg(3,stack,0L); ; // get just value KN U2Vc; U2Vc= mi->arg(4,stack,U2Vc); ; if( mi->c==0) { // old cas pfes3 * pUh = GetAny< pfes3 * >((* mi->a)(stack)); pfes3 * pVh = GetAny< pfes3 * >((* mi->b)(stack)); FESpace3 * Uh = **pUh; FESpace3 * Vh = **pVh; int NVh =Vh->N; int NUh =Uh->N; ffassert(NUh< 100-MatrixInterpolation::Op::n_name_param); for(int i=0;i3) for(int i=0;i " << data[5+i] << " Componante of Vh " <=NVh) { cout << "The Uh componante " << i << " -> " << data[5+i] << " >= " << NVh << " number of Vh Componante " <init(); // sparse_mat->pUh=pUh; //sparse_mat->pVh=pVh; sparse_mat->typemat=TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) sparse_mat->A.master(new MatriceMorse(*Uh,*Vh,buildInterpolationMatrix,data)); // sparse_mat->A.master(new MatriceMorse(*Uh,*Vh,buildInterpolationMatrix,data)); } else { // new cas mars 2006 pfes3 * pUh = GetAny< pfes3 * >((* mi->a)(stack)); KN_ xx = GetAny< KN_ >((* mi->b)(stack)); KN_ yy = GetAny< KN_ >((* mi->c)(stack)); KN_ zz = GetAny< KN_ >((* mi->d)(stack)); ffassert( xx.N() == yy.N()); ffassert( xx.N() == zz.N()); FESpace3 * Uh = **pUh; ffassert(Uh); if(!init) sparse_mat->init(); // sparse_mat->pUh=0; // sparse_mat->pVh=0; sparse_mat->typemat=TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) sparse_mat->A.master(buildInterpolationMatrix1(*Uh,xx,yy,zz,data)); } return sparse_mat; } template AnyType SetMatrixInterpolation(Stack stack,Expression emat,Expression einter) { return SetMatrixInterpolation1(stack,emat,einter,init);} template AnyType SetMatrixInterpolation3(Stack stack,Expression emat,Expression einter) { return SetMatrixInterpolation31(stack,emat,einter,init);} template AnyType ProdMat(Stack stack,Expression emat,Expression prodmat) { using namespace Fem2D; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); const Matrix_Prod AB = GetAny >((*prodmat)(stack)); // sparse_mat->pUh=AB.A->pUh; //sparse_mat->pVh=AB.B->pVh; MatriceMorse *mA= AB.A->A->toMatriceMorse(AB.ta); MatriceMorse *mB= AB.B->A->toMatriceMorse(AB.tb); if( !mA && ! mB) ExecError(" Sorry error: in MatProd, pb trans in MorseMat"); if( mA->m != mB->n) { cerr << " -- Error dim ProdMat A*B : tA =" << AB.ta << " = tB " << AB.tb << endl; cerr << " --MatProd " << mA->n<< " "<< mA->m << " x " << mB->n<< " "<< mB->m << endl; ExecError(" Wrong mat dim in MatProd"); } MatriceMorse *mAB=new MatriceMorse(); mA->prod(*mB,*mAB); if(!init) sparse_mat->init(); sparse_mat->typemat=(mA->n == mB->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) sparse_mat->A.master(mAB); delete mA; delete mB; return sparse_mat; } template AnyType CombMat(Stack stack,Expression emat,Expression combMat) { using namespace Fem2D; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); list *,bool> > * lcB = GetAny *,bool> >*>((*combMat)(stack)); // sparse_mat->pUh=0; // sparse_mat->pVh=0; MatriceCreuse * AA=BuildCombMat(*lcB,false,0,0); if(!init) sparse_mat->init(); sparse_mat->A.master(AA); sparse_mat->typemat=(AA->n == AA->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) delete lcB; return sparse_mat; } template AnyType MatriceCreuse2map(Stack , const AnyType & mat) { using namespace Fem2D; Matrice_Creuse * sparse_mat =GetAny* >(mat); ffassert(sparse_mat); int n=sparse_mat->N(),m=sparse_mat->M(); map,R> *M=new map,R>; if (n >0 && m>0 && sparse_mat->A) { sparse_mat->A->addMatTo(R(1.),*M); // hack (*M)[make_pair(n-1,m-1)]+=R(); } return M; } template AnyType DiagMat(Stack stack,Expression emat,Expression edia) { using namespace Fem2D; KN * diag=GetAny* >((*edia)(stack)); Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); // sparse_mat->pUh=0; // sparse_mat->pVh=0; if(!init) sparse_mat->init(); sparse_mat->typemat=TypeSolveMat(TypeSolveMat::GC); // none square matrice (morse) sparse_mat->A.master(new MatriceMorse((int) diag->N(),(const R*) *diag)); return sparse_mat; } template struct ChangeMatriceMorse { static MatriceMorse *f(MatriceMorse *mr) { MatriceMorse* mrr=new MatriceMorse(*mr); delete mr; return mrr; } }; template struct ChangeMatriceMorse { static MatriceMorse* f(MatriceMorse* mr) { return mr; } }; template AnyType CopyMat_tt(Stack stack,Expression emat,Expression eA,bool transp) { using namespace Fem2D; Matrice_Creuse * Mat; if(transp) { Matrice_Creuse_Transpose tMat=GetAny >((*eA)(stack)); Mat=tMat; } else Mat =GetAny*>((*eA)(stack)); MatriceMorse * mr=Mat->A->toMatriceMorse(transp,false); MatriceMorse * mrr = ChangeMatriceMorse::f(mr); Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); // sparse_mat->pUh=Mat->pUh; // sparse_mat->pVh=Mat->pUh;; // cout << " CopyMat_tt " << init << " "<init() ; sparse_mat->typemat=TypeSolveMat(TypeSolveMat::GC); // none square matrice (morse) sparse_mat->A.master(mrr); //delete mr; return sparse_mat; } template AnyType CopyTrans(Stack stack,Expression emat,Expression eA) { return CopyMat_tt(stack,emat,eA,true); } template AnyType CopyMat(Stack stack,Expression emat,Expression eA) { return CopyMat_tt(stack,emat,eA,false); } template AnyType MatFull2Sparse(Stack stack,Expression emat,Expression eA) { KNM * A=GetAny* >((*eA)(stack)); Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); // sparse_mat->pUh=0; // sparse_mat->pVh=0; if(!init) sparse_mat->init() ; sparse_mat->typemat=TypeSolveMat(TypeSolveMat::GMRES); // none square matrice (morse) sparse_mat->A.master(new MatriceMorse((KNM_ &)*A,0.0)); return sparse_mat; } template AnyType MatMap2Sparse(Stack stack,Expression emat,Expression eA) { map< pair, R> * A=GetAny< map< pair, R> * >((*eA)(stack)); int n=0,m=0; // hack: the last element must exist in the map to set matrix size typename map< pair, R>::const_iterator last= --A->end(); // le last element if( last != A->end() ) { n = last->first.first+1; m=last->first.second+1; } Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); if(!init) sparse_mat->init() ; // sparse_mat->pUh=0; // sparse_mat->pVh=0; sparse_mat->typemat=TypeSolveMat(TypeSolveMat::GMRES); // none square matrice (morse) sparse_mat->A.master(new MatriceMorse(n,m,*A,false)); delete A; return sparse_mat; } template struct Op2_pair: public binary_function { static RR f(const AA & a,const BB & b) { return RR( a, b);} }; template long get_mat_n(Matrice_Creuse * p) { ffassert(p ) ; return p->A ?p->A->n: 0 ;} template long get_mat_m(Matrice_Creuse * p) { ffassert(p ) ; return p->A ?p->A->m: 0 ;} template long get_mat_nbcoef(Matrice_Creuse * p) { ffassert(p ) ; return p->A ?p->A->NbCoef(): 0 ;} template pair get_NM(const list *,bool> > & lM) { typedef typename list *,bool> >::const_iterator lconst_iterator; lconst_iterator begin=lM.begin(); lconst_iterator end=lM.end(); lconst_iterator i; long n=0,m=0; for(i=begin;i!=end;i++++) { ffassert(i->second); MatriceCreuse & M=*i->second; bool t=i->third; int nn= M.n,mm=M.m; if (t) swap(nn,mm); if ( n==0) n = nn; if ( m==0) m = mm; if (n != 0) ffassert(nn == n); if (m != 0) ffassert(mm == m); } return make_pair(n,m); } template long get_diag(Matrice_Creuse * p, KN * x) { ffassert(p && x ) ; return p->A ?p->A->getdiag(*x): 0 ;} template long set_diag(Matrice_Creuse * p, KN * x) { ffassert(p && x ) ; return p->A ?p->A->setdiag(*x): 0 ;} template R * get_elementp2mc(Matrice_Creuse * const & ac,const long & b,const long & c){ MatriceCreuse * a= ac ? ac->A:0 ; if( !a || a->n <= b || c<0 || a->m <= c ) { cerr << " Out of bound 0 <=" << b << " < " << a->n << ", 0 <= " << c << " < " << a->m << " Matrix type = " << typeid(ac).name() << endl; cerr << ac << " " << a << endl; ExecError("Out of bound in operator Matrice_Creuse (,)");} R * p =a->pij(b,c); if( !p) { if(verbosity) cerr << "Error: the coef a(" << b << "," << c << ") do'nt exist in sparse matrix " << " Matrix type = " << typeid(ac).name() << endl; ExecError("Use of unexisting coef in sparse matrix operator a(i,j) ");} return p;} template struct Op2_mulAv: public binary_function { static RR f(const AA & a,const BB & b) { return (*a->A * *b );} }; template struct Op2_mulvirtAv: public binary_function { static RR f(const AA & a,const BB & b) { return RR( (*a).A, b );} }; class Matrice_Creuse_C2R { public: typedef Complex K; Matrice_Creuse * A; int cas; // 0 re , 1 im Matrice_Creuse_C2R(Matrice_Creuse * AA,int cass) : A(AA),cas(cass) {assert(A);} operator MatriceCreuse & () const {return *A->A;} operator Matrice_Creuse * () const {return A;} }; template Matrice_Creuse_C2R Build_Matrice_Creuse_C2R(Matrice_Creuse * pAA) { return Matrice_Creuse_C2R(pAA,cas); } template class OneBinaryOperatorA_inv : public OneOperator { public: OneBinaryOperatorA_inv() : OneOperator(atype >(),atype *>(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { Expression p=args[1]; if ( ! p->EvaluableWithOutStack() ) { bool bb=p->EvaluableWithOutStack(); cout << bb << " " << * p << endl; CompileError(" A^p, The p must be a constant == -1, sorry");} long pv = GetAny((*p)(NullStack)); if (pv !=-1) { char buf[100]; sprintf(buf," A^%ld, The pow must be == -1, sorry",pv); CompileError(buf);} return new E_F_F0,Matrice_Creuse *>(Build,Matrice_Creuse *>,t[0]->CastTo(args[0])); } }; template class Psor : public E_F0 { public: typedef double Result; Expression mat; Expression xx,gmn,gmx,oomega; Psor(const basicAC_F0 & args) { args.SetNameParam(); mat=to *>(args[0]); gmn=to*>(args[1]); gmx=to*>(args[2]); xx=to*>(args[3]); oomega=to(args[4]); } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype *>(), atype*>(), atype*>(), atype*>(), atype(),false);} static E_F0 * f(const basicAC_F0 & args){ return new Psor(args);} AnyType operator()(Stack s) const { Matrice_Creuse* A= GetAny* >( (*mat)(s) ); KN* gmin = GetAny* >( (*gmn)(s) ); KN* gmax = GetAny* >( (*gmx)(s) ); KN* x = GetAny* >( (*xx)(s) ); double omega = GetAny((*oomega)(s)); return A->A->psor(*gmin,*gmax,*x,omega); } }; template struct TheDiagMat { Matrice_Creuse * A; TheDiagMat(Matrice_Creuse * AA) :A(AA) {ffassert(A);} void get_mat_daig( KN_ & x) { ffassert(A && A->A && x.N() == A->A->n && A->A->n == A->A->m ); A->A->getdiag(x);} void set_mat_daig(const KN_ & x) { ffassert(A && A->A && x.N() == A->A->n && A->A->n == A->A->m ); A->A->setdiag(x);} }; template struct TheCoefMat { Matrice_Creuse * A; TheCoefMat(Matrice_Creuse * AA) :A(AA) {ffassert(A);} void get_mat_coef( KN_ & x) { ffassert(A && A->A && x.N() == A->A->NbCoef() ); A->A->getcoef(x);} void set_mat_coef(const KN_ & x) { ffassert(A && A->A && x.N() == A->A->NbCoef() ); A->A->setcoef(x);} }; template TheDiagMat thediag(Matrice_Creuse * p) { return TheDiagMat(p);} template TheCoefMat thecoef(Matrice_Creuse * p) { return TheCoefMat(p);} template TheDiagMat set_mat_daig(TheDiagMat dm,KN * x) { dm.set_mat_daig(*x); return dm; } template KN * get_mat_daig(KN * x,TheDiagMat dm) { dm.get_mat_daig(*x); return x; } template TheCoefMat set_mat_coef(TheCoefMat dm,KN * x) { dm.set_mat_coef(*x); return dm; } template KN * get_mat_coef(KN * x,TheCoefMat dm) { dm.get_mat_coef(*x); return x; } template bool IsRawMat(const basicAC_F0 & args) { const E_Array & ee= *dynamic_cast((Expression) args[1]); if (!&ee) return 0; int N=ee.size(); if (N==1) { C_F0 c0(ee[0]); return atype >()->CastingFrom(ee[0].left()); } else if (N==3) { C_F0 c0(ee[0]),c1(ee[1]),c2(ee[2]); return atype >()->CastingFrom(ee[0].left()) && atype >()->CastingFrom(ee[1].left()) && atype >()->CastingFrom(ee[2].left()); } return 0; } template class RawMatrix : public E_F0 { public: int init; typedef Matrice_Creuse * Result; Expression emat; Expression coef,col,lig; RawMatrix(const basicAC_F0 & args,int initt) ; static ArrayOfaType typeargs() { return ArrayOfaType(atype*>(),atype());} AnyType operator()(Stack s) const ; }; template class BlockMatrix : public E_F0 { public: typedef Matrice_Creuse * Result; int N,M; int init; Expression emat; Expression ** e_Mij; int ** t_Mij; BlockMatrix(const basicAC_F0 & args,int iinit=0) ; ~BlockMatrix() ; static ArrayOfaType typeargs() { return ArrayOfaType(atype*>(),atype());} static E_F0 * f(const basicAC_F0 & args){ if(IsRawMat(args)) return new RawMatrix(args,0); else return new BlockMatrix(args,0); } AnyType operator()(Stack s) const ; }; template class BlockMatrix1 : public BlockMatrix { public: BlockMatrix1(const basicAC_F0 & args): BlockMatrix(args,1) {} static E_F0 * f(const basicAC_F0 & args){ if(IsRawMat(args)) return new RawMatrix(args,1); else return new BlockMatrix(args,1); } }; template map< pair, R> *Matrixfull2mapIJ_inv (KNM * const & pa,const Inv_KN_long & iii,const Inv_KN_long & jjj) { const KN_ &ii(iii), &jj(jjj); const KNM & a(*pa); int N=a.N(),M=a.M(); long n = ii(SubArray(N)).max()+1; long m= jj(SubArray(M)).max()+1; /* long minn = ii(SubArray(N)).min()+1; long minm= jj(SubArray(M)).min()+1; if ( !(0 <= minn && 0 <= minm) ) { cerr << " Out of Bound in A(I^-1,J^1) : "<< minn << " " << minm <<" => negative value!! " << endl; ExecError("Out of Bound Error"); } */ // cout << " ### n m " << n << " " << m << endl; map< pair, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); A[make_pair(n-1,m-1)] = R(); // Hack to be sure that the last term existe for (long i=0;i, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); A[make_pair(n-1,m-1)] += R(); // Hack to be sure that the last term existe for (long il=0;il=0 && j >=0) { if ( !(0 <= i && i < N && 0 <= j && j < M ) ) { cerr << " Out of Bound in A(I,J) : " << i << " " << j << " not in " << "[0,"< negative value!! " << endl; ExecError("Out of Bound Error"); } */ map< pair, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); A[make_pair(n-1,m-1)] = R(); // Hack to be sure that the last term existe for (int i=0;i=0 && jj[j]>=0 && Fem2D::norm(aij)>1e-40) // if (norm(aij)>1e-40 &) A[make_pair(ii[i],jj[j])] += aij; } delete pop; return pA; } template map< pair, R> *Matrixmapp2mapIJ1 (map< pair, R> *const & B,const Inv_KN_long & iii,const Inv_KN_long & jjj) { const KN_ &ii(iii), &jj(jjj); typedef typename map< pair, R>::const_iterator It; map< pair, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); int n=0,m=0; // hack: the last element must exist in the map to set matrix size /* It lastb= --B->end(); // le last element if( lastb != B->end() ) { nb = last->first.first+1; mb=last->first.second+1; } */ int N=ii.N(),M=jj.N(); // A[make_pair(n-1,m-1)] = R(); // Hack to be sure that the last term existe for (It k=B->begin();k!=B->end();++k) { int il = k->first.first; int jl = k->first.second; if ( !( 0 <= il && il < N && 0 <= jl && jl < M ) ) { cerr << " Out of Bound in (Map)(I,J) : " << il << " " << jl << " not in " << "[0,"<second; if(i >=0 && j>=0) A[make_pair(i,j)] += aij; } A[make_pair(n,m)] += R(); // Hack to be sure that the last term existe delete B; return pA; } template map< pair, R> *Matrixmapp2mapIJ (map< pair, R> *const & B,const KN_ & ii,const KN_ & jj) { typedef typename map< pair, R>::const_iterator It; typedef typename multimap< int,int>::iterator MI; map< pair, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); multimap< int,int > I,J; int N=ii.N(),M=jj.N(); for (int i=0;i=0) I.insert(make_pair(ii[i],i)); for (int j=0;j=0) J.insert(make_pair(jj[j],j)); int n=N-1,m=M-1;// change FH sep 2009 to have the correct size.. for (It k=B->begin();k!=B->end();++k) { int il = k->first.first; int jl = k->first.second; R aij =k->second; pair PPi=I.equal_range(il); pair PPj=J.equal_range(jl); for(MI pi=PPi.first ; pi != PPi.second; ++pi) { int i=pi->second; for(MI pj=PPj.first ; pj != PPj.second; ++pj) { int j=pj->second; n=max(i,n); m=max(j,m); if(i >=0 && j>=0) A[make_pair(i,j)] += aij; } } } A[make_pair(n,m)] += R(); // Hack to be sure that the last term existe delete B; return pA; } template map< pair, R> *Matrixoutp2mapIJ (outProduct_KN_ * const & pop,const KN_ & ii,const KN_ & jj) { const outProduct_KN_ & op(*pop); long N=op.a.N(),M=op.b.N(); long n=ii.N(),m=jj.N(); map< pair, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); A[make_pair(n-1,m-1)] = R(); // Hack to be sure that the last term existe for (long il=0;il=0 && j >=0) { if ( !( 0 <= i && i < N && 0 <= j && j < M ) ) { cerr << " Out of Bound in (a*b')(I,J) : " << i << " " << j << " not in " << "[0,"<1e-40) A[make_pair(il,jl)] += aij; } } delete pop; return pA; } template AnyType Matrixoutp2map (Stack , const AnyType & pp) { const outProduct_KN_ & op(*GetAny *>(pp)); long N=op.a.N(),M=op.b.N(); long n = N; long m= M; map< pair, R> *pA= new map< pair, R>; map< pair, R> & A(*pA); A[make_pair(n-1,m-1)] = R(); // Hack to be sure that the last term existe for (long i=0;i1e-40) A[make_pair(i,j)] += aij; } delete &op; return pA; } template BlockMatrix::~BlockMatrix() { if (e_Mij) { cout << " del Block matrix "<< this << " " << e_Mij <<" N = " << N << " M = " << M << endl; for (int i=0;i RawMatrix::RawMatrix(const basicAC_F0 & args,int iinit) : init(iinit) { args.SetNameParam(); emat = args[0]; const E_Array & ee= *dynamic_cast((Expression) args[1]); int N=ee.size(); if (N==1) { C_F0 c0(ee[0]); coef=to >(ee[0]); lig=0; col=0; } else if (N==3) { C_F0 c0(ee[0]),c1(ee[1]),c2(ee[2]); coef=to >(ee[2]); lig=to >(ee[0]); col=to >(ee[1]); } } template BlockMatrix::BlockMatrix(const basicAC_F0 & args,int iinit) : init(iinit) { N=0; M=0; args.SetNameParam(); emat = args[0]; const E_Array & eMij= *dynamic_cast((Expression) args[1]); N=eMij.size(); int err =0; for (int i=0;i((Expression) eMij[i]); if (!emi) err++; else { if ( i==0) M = emi->size(); else if(M != emi->size()) err++; } } if (err) { CompileError(" Block matrix : [[ a, b, c], [ a,b,c ]] or Raw Matrix [a] or [ l, c, a ] "); } assert(N && M); e_Mij = new Expression * [N]; t_Mij = new int * [N]; for (int i=0;i((Expression) eMij[i]); e_Mij[i] = new Expression [M]; t_Mij[i] = new int [M]; for (int j=0; j() && eij->EvaluableWithOutStack() ) { long contm = GetAny((*eij)(NullStack)); /* prev version if(contm !=0) CompileError(" Block matrix , Just 0 matrix"); e_Mij[i][j]=0; t_Mij[i][j]=0;*/ if(contm==0) { e_Mij[i][j]=0; t_Mij[i][j]=0; } else if ( atype()->CastingFrom(rij) ) { // frev 2007 e_Mij[i][j]=to(c_Mij); t_Mij[i][j]=7; // just un scalaire } else CompileError(" Block matrix , Just 0 matrix"); } else if ( rij == atype *>()) { e_Mij[i][j]=eij; t_Mij[i][j]=1; } else if ( rij == atype >()) { e_Mij[i][j]=eij; t_Mij[i][j]=2; } else if ( atype * >()->CastingFrom(rij) ) { // before KN_ because KNM can be cast in KN_ e_Mij[i][j]=to * >(c_Mij); t_Mij[i][j]=5; } else if ( atype >()->CastingFrom(rij) ) { e_Mij[i][j]=to >(c_Mij); t_Mij[i][j]=3; } else if ( atype > >()->CastingFrom(rij) ) { e_Mij[i][j]=to > >(c_Mij); t_Mij[i][j]=4; } else if ( atype * > >()->CastingFrom(rij) ) { e_Mij[i][j]=to *> >(c_Mij); t_Mij[i][j]=6; } else if ( atype()->CastingFrom(rij) ) { // frev 2007 e_Mij[i][j]=to(c_Mij); t_Mij[i][j]=7; // just un scalaire } else { CompileError(" Block matrix , bad type in block matrix"); } /* else if ( atype, R> * >()->CastingFrom(rij) ) { e_Mij[i][j]= to, R> *>(C_F0(eij,rij)).LeftValue(); t_Mij[i][j]=10; }*/ } } } template class SetRawMatformMat : public OneOperator { public: typedef Matrice_Creuse * A; // Warning B type of 2 parameter typedef Matrice_Creuse * R; typedef E_Array B; // A type of 1 parameter class CODE : public E_F0 { public: Expression Mat; Expression lig; Expression col; Expression coef; bool mi; CODE(Expression a,const E_Array & tt) : Mat(a), mi(tt.MeshIndependent()) { assert(&tt); if(tt.size()!=3) CompileError("Set raw matrix: [ lg,col, a] = A (size !=3) "); if ( aatypeknlongp->CastingFrom(tt[0].left() ) //// for compilation error with g++ 3.2.2 (4 times) && aatypeknlongp->CastingFrom(tt[1].left() ) && atype* >()->CastingFrom(tt[2].left() ) ) { lig = aatypeknlongp->CastTo(tt[0]); col = aatypeknlongp->CastTo(tt[1]); coef = atype* >()->CastTo(tt[2]); } else CompileError(" we are waiting for [ lg,col,a] = A"); } AnyType operator()(Stack stack) const { A a=GetAny((*Mat)(stack)); KN *lg,*cl; KN *cc; lg = GetAny*>((*lig)(stack)); cl = GetAny*>((*col)(stack)); cc = GetAny*>((*coef)(stack)); int n=a->N(),m=a->M(); map,RR> *M=new map,RR>; if (n >0 && m>0 && a->A) { a->A->addMatTo(RR(1.),*M); // hack (*M)[make_pair(n-1,m-1)]+=RR(); } int kk = M->size(); lg->resize(kk); cc->resize(kk); cl->resize(kk); int k=0; typename map,RR>::const_iterator i; //if (!a->sym) for (i=M->begin(); i != M->end();++i,++k) { (*lg)[k]= i->first.first; (*cl)[k]= i->first.second; (*cc)[k]= i->second; } delete M; return SetAny(a); } bool MeshIndependent() const {return mi;} // ~CODE() {} operator aType () const { return atype();} }; // end sub class CODE public: // warning hack A and B E_F0 * code(const basicAC_F0 & args) const { return new CODE(t[1]->CastTo(args[1]),*dynamic_cast( t[0]->CastTo(args[0]).RightValue()));} SetRawMatformMat(): OneOperator(atype(),atype(),atype()) {} // warning with A and B }; R realC(Complex c) {return c.real();} R imagC(Complex c) {return c.imag();} template AnyType CopyMatC2R(Stack stack,Expression emat,Expression CR2eA) { typedef Complex C; typedef double R; using namespace Fem2D; Matrice_Creuse_C2R CRMat =GetAny((*CR2eA)(stack)); Matrice_Creuse *Mat=CRMat; int cas = CRMat.cas; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); MatriceMorse * mr=Mat->A->toMatriceMorse(false,false); MatriceMorse * mrr = 0; // cout << " CopyMatC2R: " << init << " " << sparse_mat <(*mr,realC); else if(cas==1) mrr = new MatriceMorse(*mr,imagC); else { cout << " cas = " << cas <init() ; // ???? sparse_mat->A.master(mrr); //ffassert(0);// a faire return sparse_mat; } template AnyType RawMatrix::operator()(Stack stack) const { MatriceMorse * amorse =0; KN_ cc(GetAny< KN_ >((*coef)(stack))); int k= cc.N(); int n= k; int m=n; map< pair, R> Aij; bool sym=false; if( lig && col) { KN_ lg(GetAny< KN_ >((*lig)(stack))); KN_ cl=(GetAny< KN_ >((*col)(stack))); n = lg.max()+1; m = cl.max()+1; ffassert( lg.N()==k && cl.N()==k && lg.min()>=0 && lg.max()>=0); sym=false; for(int i=0;i(lg[i],cl[i])]+=cc[i]; } else { sym=true; for(int i=0;i(n,m,Aij,sym); if(verbosity) cout << " -- Raw Matrix nxm =" <nbcoef << endl; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(stack)); if( !init) sparse_mat->init(); // sparse_mat->pUh=0; // sparse_mat->pVh=0; sparse_mat->A.master(amorse); sparse_mat->typemat=(amorse->n == amorse->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) if(verbosity>3) { cout << " End Raw Matrix : " << endl;} return sparse_mat; } template AnyType BlockMatrix::operator()(Stack s) const { typedef list *,bool> > * L; KNM Bij(N,M); KNM * > Fij(N,M); KNM cnjij(N,M); KNM Rij(N,M); // to sto cnjij = false; KN Oi(N+1), Oj(M+1); if(verbosity>3) { cout << " Build Block Matrix : " << N << " x " << M << endl;} Bij = (L) 0; Oi = (long) 0; Oj = (long)0; for (int i=0;i* >( e)) ; else if (tij==2) Bij(i,j) = to( GetAny >(e)); else if (tij==3) { KN_ x=GetAny< KN_ >( e); Fij(i,j) = new KNM_(x,x.N(),1);} else if (tij==4) { KN_ x=GetAny< Transpose< KN_ > >( e).t ; Fij(i,j) = new KNM_(x,1,x.N());} else if (tij==5) { KNM * m= GetAny< KNM* >( e); Fij(i,j) = new KNM_(*m);} else if (tij==6) { KNM * m= GetAny< Transpose< KNM* > >( e).t; Fij(i,j) = new KNM_(m->t()); } else if (tij==7) { Rij(i,j)=GetAny< R >( e); Fij(i,j) = new KNM_(&(Rij(i,j)),1,1);} // else if (tij==3) {} else { cout << " Bug " << tij << endl; ExecError(" Type sub matrix block unknown "); } } } // compute size of matrix int err=0; for (int i=0;i nm(0,0); if (Bij(i,j)) nm = get_NM( *Bij(i,j)); else if(Fij(i,j)) nm = make_pair(Fij(i,j)->N(), Fij(i,j)->M()); if (( nm.first || nm.second) && verbosity>3) cout << " Block [ " << i << "," << j << " ] = " << nm.first << " x " << nm.second << " cnj = " << cnjij(i,j) << endl; if (nm.first) { if ( Oi(i+1) ==0 ) Oi(i+1)=nm.first; else if(Oi(i+1) != nm.first) { err++; cerr <<"Error Block Matrix, size sub matrix" << i << ","<< j << " n (old) " << Oi(i+1) << " n (new) " << nm.first << endl; } } if(nm.second) { if ( Oj(j+1) ==0) Oj(j+1)=nm.second; else if(Oj(j+1) != nm.second) { cerr <<"Error Block Matrix, size sub matrix" << i << ","<< j << " m (old) " << Oj(j+1) << " m (new) " << nm.second << endl; err++;} } } if (err) ExecError("Error Block Matrix, size sub matrix"); // gestion of zero block ???? for (int j=0;j9) cout << j << " colum size" << Oj(j+1) << endl; if ( Oj(j+1) ==0) { Oj(j+1)=1; if( Oj(j+1) !=1) err++;} } for (int i=0;i9) cout << i << " row size" << Oi(i+1) << endl; if ( Oi(i+1) ==0) { Oi(i+1)=1; if( Oi(i+1) !=1) err++;} } if (err) ExecError("Error Block Matrix with 0 line or 0 colomn.."); // cout << "Oi = " << Oi << endl; // cout << "Oj = " << Oj << endl; for (int i=0;i3) { cout << " Oi = " << Oi << endl; cout << " Oj = " << Oj << endl; } MatriceMorse * amorse =0; { map< pair, R> Aij; for (int i=0;i3) cout << " Add Block S " << i << "," << j << " = at " << Oi(i) << " x " << Oj(j) << " conj = " << cnjij(i,j) << endl; BuildCombMat(Aij,*Bij(i,j),false,Oi(i),Oj(j),cnjij(i,j)); } else if (Fij(i,j)) { if(verbosity>3) cout << " Add Block F " << i << "," << j << " = at " << Oi(i) << " x " << Oj(j) << endl; BuildCombMat(Aij,*Fij(i,j),Oi(i),Oj(j),R(1.),cnjij(i,j));// BuildCombMat } amorse= new MatriceMorse(n,m,Aij,false); } if(verbosity) cout << " -- Block Matrix NxM = " << N << "x" << M << " nxm =" <nbcoef << endl; Matrice_Creuse * sparse_mat =GetAny* >((*emat)(s)); if(!init) sparse_mat->init(); //sparse_mat->pUh=0; // sparse_mat->pVh=0; sparse_mat->A.master(amorse); sparse_mat->typemat=(amorse->n == amorse->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) // cleanning for (int i=0;i3) { cout << " End Build Blok Matrix : " << endl;} return sparse_mat; } template class minusMat { public: list *,bool> > *l; minusMat(list *,bool> > *ll): l(new list *,bool> >(*ll) ) { typedef typename list *,bool> >::iterator lci; for (lci i= l->begin();i !=l->end();++i) i->first*= R(-1); } }; template AnyType mM2L3 (Stack , const AnyType & pp) { minusMat mpp(to(GetAny *>(pp))); return SetAny >(mpp); } /* template AnyType mmM2L3 (Stack , const AnyType & pp) { minusMat & p(GetAny >(pp)); minusMat mpp(p.l); delete p.l; return mpp.l; } template AnyType mmM2L3c (Stack , const AnyType & pp) { list *,bool> > * p(GetAny >(pp)) minusMat mpp(p.l); delete p.l; return mpp.l; } */ template void AddSparseMat() { // aType tkrp = atype *>(); SetMatrix_Op::btype = Dcl_Type * >(); Dcl_Type >(); Dcl_Type >(); // Add FH oct 2005 Dcl_Type< map< pair, R> * >(); // Add FH mars 2005 Dcl_Type< minusMat >(); // Add FJH mars 2007 basicForEachType * t_MC=atype< Matrice_Creuse* >(); // basicForEachType * t_MCt=atype< Matrice_Creuse_Transpose >(); // basicForEachType * t_lM=atype< list *,bool> > * >(); // basicForEachType * t_nM=atype< minusMat >(); basicForEachType * t_MM=atype, R> * >(); TheOperators->Add("*", new OneBinaryOperator::plusAx,Matrice_Creuse*,KN_ > >, new OneBinaryOperator::plusAtx,Matrice_Creuse_Transpose,KN_ > >, new OneBinaryOperator::solveAxeqb,Matrice_Creuse_inv,KN_ > > ); /*if(0) TheOperators->Add("*", new OneBinaryOperator::plusAx,Matrice_Creuse*,KN_ > >( 0 ,tkrp), new OneBinaryOperator::plusAtx,Matrice_Creuse_Transpose,KN_ > >( 0 ,tkrp), new OneBinaryOperator::solveAxeqb,Matrice_Creuse_inv,KN_ > >( 0 ,tkrp) ); */ TheOperators->Add("^", new OneBinaryOperatorA_inv()); // matrix new code FH (Houston 2004) TheOperators->Add("=", // new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation), new OneOperator2_*,Matrice_Creuse*,const Matrix_Prod,E_F_StackF0F0>(ProdMat), new OneOperator2_*,Matrice_Creuse*,KN *,E_F_StackF0F0>(DiagMat), new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse_Transpose,E_F_StackF0F0>(CopyTrans), new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse*,E_F_StackF0F0>(CopyMat) , new OneOperator2_*,Matrice_Creuse*,KNM*,E_F_StackF0F0>(MatFull2Sparse) , new OneOperator2_*,Matrice_Creuse*,map< pair, R> * ,E_F_StackF0F0>(MatMap2Sparse) , new OneOperator2_*,Matrice_Creuse*,list *,bool> > *,E_F_StackF0F0>(CombMat) , new OneOperatorCode >() ); TheOperators->Add("<-", new OneOperatorCode >(), // new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation), new OneOperator2_*,Matrice_Creuse*,const Matrix_Prod,E_F_StackF0F0>(ProdMat), new OneOperator2_*,Matrice_Creuse*,KN *,E_F_StackF0F0>(DiagMat) , new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse_Transpose,E_F_StackF0F0>(CopyTrans), new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse*,E_F_StackF0F0>(CopyMat) , new OneOperator2_*,Matrice_Creuse*,KNM*,E_F_StackF0F0>(MatFull2Sparse) , new OneOperator2_*,Matrice_Creuse*,map< pair, R> * ,E_F_StackF0F0>(MatMap2Sparse) , new OneOperator2_*,Matrice_Creuse*,list *,bool> > *,E_F_StackF0F0>(CombMat) ); TheOperators->Add("*", new OneBinaryOperator,Matrice_Creuse*,Matrice_Creuse*> >, new OneBinaryOperator,Matrice_Creuse_Transpose,Matrice_Creuse* > >, new OneBinaryOperator,Matrice_Creuse_Transpose,Matrice_Creuse_Transpose > >, new OneBinaryOperator,Matrice_Creuse*,Matrice_Creuse_Transpose > > , new OneBinaryOperator > , new OneBinaryOperator > , new OneBinaryOperator > , new OneBinaryOperator > ); TheOperators->Add("+", new OneBinaryOperator >, new OneBinaryOperator >, new OneBinaryOperator >, // new OneBinaryOperator >(t_MCt,t_lM), // new OneBinaryOperator >(t_MC,t_lM), new OneBinaryOperator > ); TheOperators->Add("-", new OneUnaryOperator > ); Add *>("n",".",new OneOperator1 *>(get_mat_n) ); Add *>("m",".",new OneOperator1 *>(get_mat_m) ); Add *>("nbcoef",".",new OneOperator1 *>(get_mat_nbcoef) ); Add *>("nnz",".",new OneOperator1 *>(get_mat_nbcoef) ); Add *>("size",".",new OneOperator1 *>(get_mat_nbcoef) ); Add *>("diag",".",new OneOperator1 ,Matrice_Creuse *>(thediag) ); Add *>("coef",".",new OneOperator1 ,Matrice_Creuse *>(thecoef) ); // Add *>("setdiag",".",new OneOperator2 *,KN *>(set_diag) ); TheOperators->Add("=", new OneOperator2*,KN*,TheDiagMat >(get_mat_daig) ); TheOperators->Add("=", new OneOperator2,TheDiagMat,KN*>(set_mat_daig) ); // TheOperators->Add("=", new OneOperator2*,KN*,TheDiagMat >(get_mat_daig) ); // TheOperators->Add("=", new OneOperator2,TheDiagMat,KN*>(set_mat_daig) ); // ADD oct 2005 TheOperators->Add("=", new OneOperator2*,KN*,TheCoefMat >(get_mat_coef) ); TheOperators->Add("=", new OneOperator2,TheCoefMat,KN*>(set_mat_coef) ); // TheOperators->Add("=", new OneOperator2*,KN*,TheCoefMat >(get_mat_coef) ); // TheOperators->Add("=", new OneOperator2,TheCoefMat,KN*>(set_mat_coef) ); Global.Add("set","(",new SetMatrix); //Global.Add("psor","(",new OneOperatorCode > ); atype * >()->Add("(","",new OneOperator3_ *,long,long >(get_elementp2mc)); atype*>()->Add("(","",new OneOperator3_, R> *,KNM*,Inv_KN_long,Inv_KN_long >(Matrixfull2mapIJ_inv)); atype*>()->Add("(","",new OneOperator3_, R> *,KNM*,KN_,KN_ >(Matrixfull2mapIJ)); atype*>()->Add("(","",new OneOperator3_, R> *,outProduct_KN_*,Inv_KN_long,Inv_KN_long >(Matrixoutp2mapIJ_inv)); atype*>()->Add("(","",new OneOperator3_, R> *,outProduct_KN_*,KN_,KN_ >(Matrixoutp2mapIJ)); TheOperators->Add("=", new SetRawMatformMat); t_MM->Add("(","", new OneOperator3_, R> *,map< pair, R> *,Inv_KN_long,Inv_KN_long >(Matrixmapp2mapIJ1)); t_MM->Add("(","",new OneOperator3_, R> *,map< pair, R> *,KN_,KN_ >(Matrixmapp2mapIJ)); t_MC->Add("(","",new OneOperator3_, R> *,map< pair, R> *,Inv_KN_long,Inv_KN_long >(Matrixmapp2mapIJ1,t_MC)); t_MC->Add("(","",new OneOperator3_, R> *,map< pair, R> *,KN_,KN_ >(Matrixmapp2mapIJ,t_MC)); //atype*>()->Add("(","",new OneOperator3_, R> *,map< pair, R> *,Inv_KN_long,Inv_KN_long >(Matrixmapp2mapIJ1),t_lM); //atype*>()->Add("(","",new OneOperator3_, R> *,map< pair, R> *,KN_,KN_ >(Matrixmapp2mapIJ),t_lM); //map< pair, R> * ttt= (0); // ; map_type[typeid(map< pair, R> *).name()]->AddCast( new E_F1_funcT, R> *,KNM* >(Matrixfull2map), new E_F1_funcT, R> *,outProduct_KN_* >(Matrixoutp2map), new E_F1_funcT, R> *,Matrice_Creuse* >(MatriceCreuse2map) ); map_type[typeid(list *,bool> > *).name()]->AddCast( new E_F1_funcT *,bool> > *,Matrice_Creuse* >(M2L3), new E_F1_funcT *,bool> > *,Matrice_Creuse_Transpose >(tM2L3), new E_F1_funcT *,bool> > *,minusMat >(mM2L3 ) ); /* map_type[typeid(minusMat).name()]->AddCast( new E_F1_funcT,list *,bool> > * >(mmM2L3 ) //new E_F1_funcT,Matrice_Creuse* > * >(mmM2L3c ), //new E_F1_funcT,Matrice_Creuse_Transpose > * >(mmM2L3ct ) ); */ // --- end } //extern Map_type_of_map map_type_of_map ; // to store te type //extern Map_type_of_map map_pair_of_type ; // to store te type extern int lineno(); class PrintErrorCompile : public OneOperator { public: const char * cmm; E_F0 * code(const basicAC_F0 & ) const { ErrorCompile(cmm,lineno()); return 0;} PrintErrorCompile(const char * cc): OneOperator(map_type[typeid(R).name()]),cmm(cc){} }; class PrintErrorCompileIM : public E_F0info { public: typedef double Result; static E_F0 * f(const basicAC_F0 & args) { lgerror("\n\n *** change interplotematrix in interpole.\n *** Bad name in previous version,\n *** sorry FH.\n\n"); return 0; } static ArrayOfaType typeargs() {return ArrayOfaType(true);} operator aType () const { return atype();} }; // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; DefSparseSolverSym::SparseMatSolver SparseMatSolverSym_R ; ; DefSparseSolverSym::SparseMatSolver SparseMatSolverSym_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; DefSparseSolverSym::solver =SparseMatSolverSym_R; DefSparseSolverSym::solver =SparseMatSolverSym_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return true; } template class removeDOF_Op : public E_F0mps { public: Expression A;// A =0 Expression R; Expression x; Expression out; static const int n_name_param = 4; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; removeDOF_Op(const basicAC_F0& args, Expression param1, Expression param2, Expression param3, Expression param4) : A(param1), R(param2), x(param3), out(param4) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type removeDOF_Op::name_param[] = { {"symmetrize", &typeid(bool)}, {"condensation", &typeid(KN*)}, {"interaction", &typeid(Matrice_Creuse*)}, {"eps",&typeid(double)} }; template class removeDOF : public OneOperator { const bool withA; public: removeDOF() : OneOperator(atype(), atype*>(), atype*>(), atype*>(), atype*>()),withA(true) {} removeDOF(int ) : OneOperator(atype(), atype*>(), atype*>(), atype*>()),withA(false) {} E_F0* code(const basicAC_F0& args) const { if(withA) return new removeDOF_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3])); else new removeDOF_Op(args, 0, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2])); } }; template bool cmp(const std::pair& lhs, const std::pair& rhs) { return lhs.first < rhs.first; } template AnyType removeDOF_Op::operator()(Stack stack) const { static const double defEPS=1e-12; Matrice_Creuse* pA = A ? GetAny* >((*A)(stack)):0; if(pA) { Matrice_Creuse* pR = GetAny* >((*R)(stack)); KN* pX = GetAny* >((*x)(stack)); KN* pOut = GetAny* >((*out)(stack)); ffassert( pR && pX && pOut); pA->Uh = pR->Uh; pA->Vh = pR->Vh; MatriceMorse *mA = static_cast*>(&(*pA->A)); MatriceMorse *mR = static_cast*>(&(*pR->A)); bool symmetrize = nargs[0] ? GetAny((*nargs[0])(stack)) : false; double EPS=nargs[3] ? GetAny((*nargs[3])(stack)) :defEPS ; KN* condensation = nargs[1] ? GetAny* >((*nargs[1])(stack)) : (KN*) 0; unsigned int n = condensation ? condensation->n : mR->nbcoef; int* lg = new int[n + 1]; int* cl; T* val; T* b; if(pOut->n != n) pOut->resize(n); std::vector tmpVec; if(!condensation) { tmpVec.resize(mA->n); for(unsigned int i = 0; i < n; ++i) tmpVec[mR->cl[i]] = i + 1; if(!mA->symetrique) { std::vector > tmp; tmp.reserve(mA->nbcoef); lg[0] = 0; for(unsigned int i = 0; i < n; ++i) { for(unsigned int j = mA->lg[mR->cl[i]]; j < mA->lg[mR->cl[i] + 1]; ++j) { unsigned int col = tmpVec[mA->cl[j]]; if(col != 0 && abs(mA->a[j]) > EPS) { if(symmetrize) { if(col - 1 <= i) tmp.push_back(std::make_pair(col - 1, mA->a[j])); } else tmp.push_back(std::make_pair(col - 1, mA->a[j])); } } std::sort(tmp.begin() + lg[i], tmp.end(),cmp ); // c++11 , [](const std::pair& lhs, const std::pair& rhs) { return lhs.first < rhs.first; }); *(*pOut + i) = *(*pX + mR->cl[i]); lg[i + 1] = tmp.size(); } mA->nbcoef = tmp.size(); if(symmetrize) mA->symetrique = true; else mA->symetrique = false; cl = new int[tmp.size()]; val = new T[tmp.size()]; for(unsigned int i = 0; i < tmp.size(); ++i) { cl[i] = tmp[i].first; val[i] = tmp[i].second; } } else { std::vector > > tmp(n); for(unsigned int i = 0; i < n; ++i) tmp[i].reserve(mA->lg[mR->cl[i] + 1] - mA->lg[mR->cl[i]]); unsigned int nnz = 0; for(unsigned int i = 0; i < n; ++i) { for(unsigned int j = mA->lg[mR->cl[i]]; j < mA->lg[mR->cl[i] + 1]; ++j) { unsigned int col = tmpVec[mA->cl[j]]; if(col != 0 && abs(mA->a[j]) > EPS) { if(i < col - 1) tmp[col - 1].push_back(make_pair(i, mA->a[j])); else tmp[i].push_back(make_pair(col - 1, mA->a[j])); ++nnz; } } *(*pOut + i) = *(*pX + mR->cl[i]); } mA->nbcoef = nnz; cl = new int[nnz]; val = new T[nnz]; nnz = 0; lg[0] = 0; for(unsigned int i = 0; i < n; ++i) { std::sort(tmp[i].begin(), tmp[i].end(),cmp); // c++11, [](const std::pair& lhs, const std::pair& rhs) { return lhs.first < rhs.first; }); for(typename std::vector >::const_iterator it = tmp[i].begin(); it != tmp[i].end(); ++it) { cl[nnz] = it->first; val[nnz++] = it->second; } lg[i + 1] = nnz; } } delete [] mA->cl; delete [] mA->lg; delete [] mA->a; mA->n = n; mA->m = n; mA->N = n; mA->M = n; mA->lg = lg; mA->cl = cl; mA->a = val; } else { tmpVec.reserve(mA->n); unsigned int i = 0, j = 1; for(unsigned int k = 0; k < mA->n; ++k) { if(k == *(*condensation + i)) { ++i; tmpVec.push_back(i); } else { tmpVec.push_back(-j); ++j; } } // if(!mA->symetrique) { std::vector > tmpInterior; std::vector > tmpBoundary; std::vector > tmpInteraction; tmpInterior.reserve(mA->nbcoef); tmpBoundary.reserve(mA->nbcoef); tmpInteraction.reserve(mA->nbcoef); lg[0] = 0; for(unsigned int i = 0; i < mA->n; ++i) { int row = tmpVec[i]; if(row < 0) { for(unsigned int j = mA->lg[i]; j < mA->lg[i + 1]; ++j) { int col = tmpVec[mA->cl[j]]; if(col < 0) tmpInterior.push_back(make_pair(-col - 1, mA->a[j])); else tmpInteraction.push_back(make_pair(col - 1, mA->a[j])); } } else { for(unsigned int j = mA->lg[i]; j < mA->lg[i + 1]; ++j) { int col = tmpVec[mA->cl[j]]; if(col > 0) tmpBoundary.push_back(make_pair(col - 1, mA->a[j])); } // std::sort(tmp.begin() + lg[i], tmp.end()); *(*pOut + i) = *(*pX + *(*condensation + i)); lg[i + 1] = tmpBoundary.size(); } } cl = new int[tmpBoundary.size()]; val = new T[tmpBoundary.size()]; for(unsigned int i = 0; i < tmpBoundary.size(); ++i) { cl[i] = tmpBoundary[i].first; val[i] = tmpBoundary[i].second; } // } MatriceMorse* m = new MatriceMorse(n, n, tmpBoundary.size(), mA->symetrique, val, lg, cl, true); pR->typemat = TypeSolveMat(TypeSolveMat::GMRES); pR->A.master(m); m->dummy = false; } } else { Matrice_Creuse* pR = GetAny* >((*R)(stack)); KN* pX = GetAny* >((*x)(stack)); KN* pOut = GetAny* >((*out)(stack)); ffassert(pR && pX && pOut); MatriceMorse *mR = static_cast*>(&(*pR->A)); unsigned int n = mR->nbcoef; if(pOut->n != n) pOut->resize(n); for(unsigned int i = 0; i < n; ++i) { *(*pOut + i) = *(*pX + mR->cl[i]); } } return 0L; } bool SparseDefault() { return TypeSolveMat::SparseSolver== TypeSolveMat::defaultvalue; } bool Have_UMFPACK_=false; bool Have_UMFPACK() { return Have_UMFPACK_;} //OneOperator0 *TheSetDefaultSolver=0; // to change the SetDefaultSolver void init_lgmat() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; SparseMatSolverSym_R= DefSparseSolverSym::solver; SparseMatSolverSym_C= DefSparseSolverSym::solver; Dcl_Type::Op *>(); Dcl_Type::Op *>(); map_type_of_map[make_pair(atype* >(),atype())]=atype *>(); map_type_of_map[make_pair(atype* >(),atype())]=atype *>(); AddSparseMat(); AddSparseMat(); Add::Op *>("<-","(", new MatrixInterpolation); Add::Op *>("<-","(", new MatrixInterpolation(1)); Add::Op *>("<-","(", new MatrixInterpolation); Add::Op *>("<-","(", new MatrixInterpolation(1,1)); Dcl_Type::Op *>(); Dcl_Type::Op *>(); // Add::Op *>("<-","(", new RestrictArray); // Add::Op *>("<-","(", new RestrictArray); Global.Add("restrict","(",new RestrictArray);// FH Jan 2014 Global.Add("restrict","(",new RestrictArray);// FH Jan 2014 TheOperators->Add("=", new OneOperator2_*,KN*,const RestrictArray::Op*,E_F_StackF0F0>(SetRestrict), new OneOperator2_*,KN*,const RestrictArray::Op*,E_F_StackF0F0>(SetRestrict) ); TheOperators->Add("<-", new OneOperator2_*,KN*,const RestrictArray::Op*,E_F_StackF0F0>(SetRestrict), new OneOperator2_*,KN*,const RestrictArray::Op*,E_F_StackF0F0>(SetRestrict) ); Global.Add("interpolate","(",new MatrixInterpolation); Global.Add("interpolate","(",new MatrixInterpolation(1)); Global.Add("interpolate","(",new MatrixInterpolation); Global.Add("interpolate","(",new MatrixInterpolation(1,1)); Global.Add("interplotematrix","(",new OneOperatorCode); zzzfff->Add("mapmatrix",atype, double> *>()); zzzfff->Add("Cmapmatrix",atype, Complex> *>()); // a voir Global.Add("defaulttoGMRES","(",new OneOperator0(SetGMRES)); Global.Add("defaulttoCG","(",new OneOperator0(SetCG)); Global.New("havesparsesolver",CVariable(SparseDefault)); Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Dcl_Type< Resize > > (); Add *>("resize",".",new OneOperator1< Resize >,Matrice_Creuse *>(to_Resize)); Add > >("(","",new OneOperator3_ *,Resize > , long, long >(resize2)); // add missing in Dcl_Type< Resize > > (); Add *>("resize",".",new OneOperator1< Resize >,Matrice_Creuse *>(to_Resize)); Add > >("(","",new OneOperator3_ *,Resize > , long, long >(resize2)); //Global.Add("defaultsolver","(",new OneOperator0(SetDefaultSolver)); // pour compatibiliter TheOperators->Add("=", new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation<1>), new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation3<1>) ); TheOperators->Add("<-", new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation<0>), new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation3<0>) ); // construction of complex matrix form a double matrix TheOperators->Add("=", new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse*,E_F_StackF0F0>(CopyMat) ); TheOperators->Add("<-", new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse*,E_F_StackF0F0>(CopyMat) ); // Global.Add("imag","(",new OneOperator1_(Imag)); // Add("<--","(",new OneOperator1_(Real)); Dcl_Type(); Add*>("re",".",new OneOperator1* >(Build_Matrice_Creuse_C2R<0> )); Add*>("im",".",new OneOperator1* >(Build_Matrice_Creuse_C2R<1> )); // construction of complex matrix form a double matrix TheOperators->Add("=", new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse_C2R,E_F_StackF0F0>(CopyMatC2R<1>)); TheOperators->Add("<-", new OneOperator2_*,Matrice_Creuse*,Matrice_Creuse_C2R,E_F_StackF0F0>(CopyMatC2R<0>)); extern void init_UMFPack_solver(); init_UMFPack_solver(); Global.Add("renumbering", "(", new removeDOF); Global.Add("renumbering", "(", new removeDOF); Global.Add("renumbering", "(", new removeDOF(1)); Global.Add("renumbering", "(", new removeDOF(1)); } int Data_Sparse_Solver_version() { return VDATASPARSESOLVER;} freefem++-3.38-1/src/fflib/lgmesh.cpp000644 000767 000024 00000165270 12511440323 017446 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" //#include "fem3.hpp" #include "MeshPoint.hpp" #include #include "Operator.hpp" #include #include #include #include "lex.hpp" #include "Mesh2.h" #include "BamgFreeFem.hpp" #include "lgfem.hpp" */ #include "ff++.hpp" #include "AFunction_ext.hpp" #include "lgmesh.hpp" using Fem2D::Mesh; using Fem2D::MeshPoint; extern bool NoWait; typedef Mesh * pmesh; class classBuildMesh : public E_F0mps { public: typedef pmesh Result; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =3; Expression nargs[n_name_param]; Expression getborders; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KNM* arg(int i,Stack stack,KNM* p) const{ return nargs[i] ? GetAny*>( (*nargs[i])(stack) ): p;} classBuildMesh(const basicAC_F0 & args) { args.SetNameParam(n_name_param,name_param,nargs); getborders=to(args[0]); } static ArrayOfaType typeargs() { return ArrayOfaType(atype());} static E_F0 * f(const basicAC_F0 & args){ return new classBuildMesh(args);} AnyType operator()(Stack s) const ; operator aType () const { return atype();} }; class classBuildMeshArray : public E_F0mps { public: typedef pmesh Result; //static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =0; //Expression nargs[n_name_param]; Expression env,ent,enbe; Expression ev,et,ebe; classBuildMeshArray(const basicAC_F0 & args) { args.SetNameParam(0,0,0); env=to(args[0]); ent=to(args[1]); enbe=to(args[2]); ev=to >(args[3]); et=to >(args[4]); ebe=to >(args[5]); } static ArrayOfaType typeargs() { aType ffint =atype< long >(); aType ffMi =atype< KNM_ >(); aType ffMr =atype< KNM_ >(); return ArrayOfaType(ffint,ffint,ffint,ffMr,ffMi,ffMi);} static E_F0 * f(const basicAC_F0 & args){ return new classBuildMeshArray(args);} AnyType operator()(Stack s) const { long nv = GetAny((*env)(s)); long nt = GetAny((*ent)(s)); long nbe = GetAny((*enbe)(s)); KNM_ xyl( GetAny >((*ev)(s))); KNM_ nut( GetAny >((*et)(s))); KNM_ nube( GetAny >((*ebe)(s))); using Fem2D::Vertex; using Fem2D::R2; using Fem2D::BoundaryEdge; using Fem2D::Mesh; using Fem2D::MeshPointStack; // Mesh(int nbv,int nbt,int nbeb,Vertex *v,Triangle *t,BoundaryEdge *b); cout << nv << " " << nt << " " << nbe << endl; cout << xyl.N() << " "<< xyl.M() << endl; cout << nut.N() << " "<< nut.M() << endl; cout << nube.N() << " "<< nube.M() << endl; ffassert(xyl.N() >=nv && xyl.M() >= 3); ffassert(nut.N() >=nt && nut.M() >= 4); ffassert(nube.N() >=nbe && nube.M() >= 3); Vertex *v= new Vertex [nv]; Triangle *t= new Triangle[nt]; BoundaryEdge *b = new BoundaryEdge[nbe]; for(int i=0;iBoundingBox(Pn,Px); if(!pth->quadtree) pth->quadtree=new Fem2D::FQuadTree(pth,Pn,Px,pth->nv); return Add2StackOfPtr2FreeRC(s,pth);// 07/2008 FH } operator aType () const { return atype();} }; basicAC_F0::name_and_type classBuildMesh::name_param[]= { { "nbvx", &typeid(long)} , {"fixeborder", &typeid(bool)}, {"points", &typeid(KNM*)} }; // modif aout 2007 class BuildMeshFile : public E_F0mps { public: typedef pmesh Result; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =1; Expression nargs[n_name_param]; Expression getfilename; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} BuildMeshFile(const basicAC_F0 & args) { args.SetNameParam(n_name_param,name_param,nargs); getfilename=to(args[0]); } static ArrayOfaType typeargs() { return ArrayOfaType(atype());} static E_F0 * f(const basicAC_F0 & args){ return new BuildMeshFile(args);} AnyType operator()(Stack s) const ; operator aType () const { return atype();} }; basicAC_F0::name_and_type BuildMeshFile::name_param[]= { { "nbvx", &typeid(long) } }; // fin modif 2007 class MoveMesh : public E_F0mps { public: typedef pmesh Result; Expression getmesh; Expression U,V; int nbsol; vector sol; MoveMesh(const basicAC_F0 & args) :nbsol(args.size()-2),sol(args.size()-2) { using Fem2D::Triangle; using Fem2D::Vertex; using Fem2D::R2; using Fem2D::BoundaryEdge; using Fem2D::Mesh; // using Fem2D::R; using Fem2D::MeshPointStack; args.SetNameParam(); getmesh=to(args[0]); const E_Array * a = dynamic_cast(args[1].LeftValue()); ffassert(a); if (a->size() !=2) CompileError("movemesh(Th,[u,v],...) need 2 componate in array ",atype()); U=to( (*a)[0]); V=to( (*a)[1]); for (int i=2;i(args[i]); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype(),true);} static E_F0 * f(const basicAC_F0 & args){ return new MoveMesh(args);} AnyType operator()(Stack s) const ; operator aType () const { return atype();} }; class SplitMesh : public E_F0mps { public: typedef pmesh Result; Expression getmesh; Expression U; SplitMesh(const basicAC_F0 & args) { args.SetNameParam(); getmesh=to(args[0]); U = to(args[1]); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype());} static E_F0 * f(const basicAC_F0 & args){ return new SplitMesh(args);} AnyType operator()(Stack s) const ; operator aType () const { return atype();} }; class SaveMesh : public E_F0 { public: typedef pmesh Result; Expression getmesh; Expression filename; Expression xx,yy,zz; SaveMesh(const basicAC_F0 & args) { xx=0; yy=0; zz=0; args.SetNameParam(); getmesh=to(args[0]); filename=to(args[1]); if (args.size() >2) { const E_Array * a = dynamic_cast(args[2].LeftValue()); if (!a) CompileError("savemesh(Th,\"filename\",[u,v,w],..."); int k=a->size() ; // cout << k << endl; if ( k!=2 && k !=3) CompileError("savemesh(Th,\"filename\",[u,v,w]) need 2 or 3 componate in array ",atype()); xx=to( (*a)[0]); yy=to( (*a)[1]); if(k==3) zz=to( (*a)[2]); } } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype(),true);} static E_F0 * f(const basicAC_F0 & args){ return new SaveMesh(args);} AnyType operator()(Stack s) const ; }; class Adaptation : public E_F0mps { public: typedef pmesh Result; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =28; int nbsol; Expression nargs[n_name_param]; Expression getmesh; Expression em11,em22,em12; int typesol[100]; vector sol; int nbcperiodic; Expression *periodic; double arg(int i,Stack stack,double a) const { return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long* arg(int i,Stack stack,long* a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} int arg(int i,Stack stack,int a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} Adaptation(const basicAC_F0 & args) :nbsol(args.size()-1),sol(args.size()-1) { em11=0; em22=0; em12=0; args.SetNameParam(n_name_param,name_param,nargs); getmesh=to(args[0]); int ksol=0; ffassert(nbsol<100); for (int i=1;i()) { const E_Array * a = dynamic_cast(args[i].LeftValue()); ffassert(a); ksol+=a->size(); } else ksol++; sol.resize(ksol); ksol=0; for (int i=1;i()) { const E_Array * a = dynamic_cast(args[i].LeftValue()); ffassert(a); int N=a->size(); typesol[i-1]=N-1; // ok en 2D if (N<=4) { for (int j=0;j((*a)[j]); } else { lgerror(" Adaptation vecteur a plus de 4 compossantes inconnue"); } } else { typesol[i-1]=0; sol[ksol++]=to(args[i]); } const E_Array * expmetrix = dynamic_cast(nargs[24]); if(expmetrix) { if(expmetrix->nbitem()!=3) ExecError("\nSorry we wait an array with 3 componants in: metrix=[m11,m12,m22]"); em11=(*expmetrix)[0]; em12=(*expmetrix)[1]; em22=(*expmetrix)[2]; if( (*expmetrix)[0].left()!= atype *>() ) CompileError("Sorry the fist array componant in metrix=[m11,m12,m22] must be vector"); if( (*expmetrix)[1].left()!= atype *>() ) CompileError("Sorry the second array componant in metrix=[m11,m12,m22] must be vector"); if( (*expmetrix)[2].left()!= atype *>() ) CompileError("Sorry the third array componant in metrix=[m11,m12,m22] must be vector"); } nbcperiodic=0; periodic=0; GetPeriodic(2,nargs[25],nbcperiodic,periodic); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),true);} static E_F0 * f(const basicAC_F0 & args){ return new Adaptation(args);} AnyType operator()(Stack s) const ; operator aType () const { return atype();} }; basicAC_F0::name_and_type Adaptation::name_param[Adaptation::n_name_param] = { { "hmin", &typeid(double)}, // { "hmax", &typeid(double)}, { "err", &typeid(double)}, { "errg", &typeid(double)}, { "nbvx", &typeid(long)}, // 4 { "nbsmooth", &typeid(long)}, { "nbjacoby", &typeid(long)}, { "ratio", &typeid(double)}, { "omega", &typeid(double)}, { "iso", &typeid(bool)}, // 9 { "abserror", &typeid(bool)}, { "cutoff", &typeid(double)}, { "verbosity", &typeid(long)}, { "inquire", &typeid(bool)}, { "splitpbedge", &typeid(bool)}, // 14 { "maxsubdiv", &typeid(double)}, { "anisomax", &typeid(double)}, { "rescaling", &typeid(bool)}, { "keepbackvertices", &typeid(bool)}, { "IsMetric", &typeid(bool)}, // 19 { "power", &typeid(double)}, // 20 { "thetamax", &typeid(double)}, { "splitin2", &typeid(bool) }, { "nomeshgeneration", &typeid(bool) }, { "metric" , &typeid(E_Array)}, // 24 { "periodic" , &typeid(E_Array) },// 25 { "requirededges", &typeid(KN_ ) }, // 26 { "warning", &typeid(long *) } // 27 }; struct Op_trunc_mesh : public OneOperator { class Op: public E_F0mps { public: static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =4; Expression nargs[n_name_param]; Expression getmesh,bbb; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KN * arg(int i,Stack stack) const{ return nargs[i] ? GetAny *>( (*nargs[i])(stack) ): 0;} Op(const basicAC_F0 & args,Expression t,Expression b) : getmesh(t),bbb(b) { args.SetNameParam(n_name_param,name_param,nargs); } AnyType operator()(Stack s) const ; }; E_F0 * code(const basicAC_F0 & args) const { return new Op(args,to(args[0]),to(args[1])) ;} Op_trunc_mesh() : OneOperator(atype(),atype(),atype()) {} }; basicAC_F0::name_and_type Op_trunc_mesh::Op::name_param[Op_trunc_mesh::Op::n_name_param] = { { "split", &typeid(long)}, { "label", &typeid(long)}, { "new2old", &typeid(KN*)}, // ajout FH pour P. Jovilet jan 2014 { "old2new", &typeid(KN*)} // ajout FH pour P. Jovilet jan 2014 }; //extern Fem2D::Mesh * BuildMesh(Stack stack, E_BorderN const * const & b,bool justboundary,int nbvmax,) ; AnyType classBuildMesh::operator()(Stack stack) const { const E_BorderN * borders = GetAny((*getborders)(stack)); long nbvx = arg(0,stack,0L); bool requireborder= arg(1,stack,false); KNM * p=0; p=arg(2,stack,p); ffassert( nbvx >= 0); return SetAny(Add2StackOfPtr2FreeRC(stack,BuildMesh(stack,borders,false,nbvx,requireborder,p))); } AnyType BuildMeshFile::operator()(Stack stack) const { string* filename = GetAny((*getfilename)(stack)); long nbvx = arg(0,stack,0); ffassert( nbvx >= 0); pmesh pmsh=buildmeshbamg( filename,nbvx); Add2StackOfPtr2FreeRC(stack,pmsh);// 07/2008 FH return SetAny(pmsh); } AnyType Op_trunc_mesh::Op::operator()(Stack stack) const { using namespace Fem2D; Mesh & Th = *GetAny((*getmesh)(stack)); long kkksplit =arg(0,stack,1L); long label =arg(1,stack,2L); KN * pn2o = arg(2,stack); KN * po2n = arg(3,stack); KN split(Th.nt); split=kkksplit; long ks=kkksplit*kkksplit; MeshPoint *mp= MeshPointStack(stack),mps=*mp; long kk=0; for (int k=0;kset(Th,K(B),B,K,0); if ( GetAny((*bbb)(stack)) ) kk++; else split[k]=0 ; } if(pn2o) { pn2o->resize(kk*ks); KN &n2o(*pn2o); int l=0; for(int k=0; k< Th.nt; ++k) if( split[k] ) for(int i=0; i< ks; ++i) n2o[l++] = k; } if(po2n) { po2n->resize(Th.nt); KN &o2n(*po2n); int l=0; for(int k=0; k< Th.nt; ++k) if( split[k] ) { o2n[k] = l; l+=ks; } else o2n[k]=-1; } *mp=mps; if (verbosity>1) cout << " -- Trunc mesh: Nb of Triangle = " << kk << " label=" < * a=GetAny*>(x); for (int i=0;iN(); i++) (*a)[i]->destroy(); a->destroy(); return Nothing; } template RR * get_elementp_(const A & a,const B & b){ if( b<0 || a->N() <= b) { cerr << " Out of bound 0 <=" << b << " < " << a->N() << " array type = " << typeid(A).name() << endl; ExecError("Out of bound in operator []");} return &((*a)[b]);} template R * set_initinit( R* const & a,const long & n){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << n << endl); a->init(n); for (int i=0;i *>(0,::DestroyKN ); atype* >()->Add("[","",new OneOperator2_*,long >(get_elementp_*,long>)); TheOperators->Add("<-", new OneOperator2_ *,KN *,long>(&set_initinit)); map_type_of_map[make_pair(atype(),atype())]=atype*>(); // vector Dcl_Type< Resize > > (); Add*>("resize",".",new OneOperator1< Resize >,KN*>(to_Resize)); Add > >("(","",new OneOperator2_ *,Resize > , long >(resizeandclean1)); } void init_lgmesh3() { if(verbosity&&(mpirank==0)) cout <<"lg_mesh3 "; // Global.Add("buildmesh","(",new OneOperatorCode); // Global.Add("buildmesh","(",new OneOperatorCode); atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); atype()->AddCast( new E_F1_funcT(UnRef)); Add("[]",".",new OneOperator1 *,pf3r>(pf3r2vect)); Add("[]",".",new OneOperator1 *,pf3c>(pf3r2vect)); Add("(","",new OneQuadOperator,Op4_pf32K::Op> ); Add("(","",new OneQuadOperator,Op4_pf32K::Op> ); Add("(","",new OneQuadOperator,Op4_K2R::Op> ); // Add("(","",new OneTernaryOperator,Op3_K2R::Op> ); // FH stupide Add("(","",new OneQuadOperator,Op4_K2R::Op> ); Add("(","",new OneQuadOperator ); TheOperators->Add("<-", new OneOperator2_(&initMesh)); // use for : mesh Th = readmesh ( ...); TheOperators->Add("<-", new OneOperator2_(&set_copy_incr)); TheOperators->Add("=", new OneOperator2(&set_eqdestroy_incr) ); Global.Add("readmesh3","(",new OneOperatorCode); Global.Add("savemesh","(",new OneOperatorCode); Global.Add("savesurfacemesh","(",new OneOperatorCode); Dcl_Type >(); Dcl_Type >( ); Dcl_Type::Adj>( ); Dcl_Type::BE >( ); Dcl_Type >( ); atype()->AddCast( new E_F1_funcT >(Cast >), new E_F1_funcT >(Cast >), new E_F1_funcT >(Cast >) ); Add("[","",new OneOperator2_,pmesh3,long>(get_element)); Add("[","",new OneOperator2_,pmesh3*,long>(get_element)); Add("(","",new OneOperator2_,pmesh3,long>(get_vertex)); Add("(","",new OneOperator2_,pmesh3*,long>(get_vertex)); Add("be",".",new OneOperator1_::BE,pmesh3*>(Build)); Add >("adj",".",new OneOperator1_::Adj,GlgElement >(Build)); Add::BE>("(","",new OneOperator2_,GlgBoundaryElement::BE,long>(get_element)); Add::Adj>("(","",new OneOperator2_,GlgElement::Adj,long*>(get_adj)); TheOperators->Add("==", new OneBinaryOperator,GlgElement > >); TheOperators->Add("!=", new OneBinaryOperator,GlgElement > >); TheOperators->Add("<", new OneBinaryOperator,GlgElement > >); TheOperators->Add("<=", new OneBinaryOperator,GlgElement > >); Add >("label",".",new OneOperator1_ >(getlab)); Add >("Element",".",new OneOperator1_ ,GlgBoundaryElement >(getElement)); Add >("whoinElement",".",new OneOperator1_ >(NuElement)); Add >("[","",new OneOperator2_ ,GlgElement ,long>(get_element)); Add >("[","",new OneOperator2_,GlgBoundaryElement,long>(get_element)); Add >("x",".",new OneOperator1_ >(getx)); Add >("y",".",new OneOperator1_ >(gety)); Add >("z",".",new OneOperator1_ >(getz)); Add >("label",".",new OneOperator1_ >(getlab)); Add >("label",".",new OneOperator1_ >(getlab)); Add >("region",".",new OneOperator1_ >(getlab)); Add >("mesure",".",new OneOperator1_ >(getmes)); Add("mesure",".",new OneOperator1(pmesh_mes)); Add("bordermesure",".",new OneOperator1(pmesh_mesb)); Add("nt",".",new OneOperator1(pmesh_nt)); Add("nv",".",new OneOperator1(pmesh_nv)); Add("nbe",".",new OneOperator1(pmesh_nbe)); TheOperators->Add("<-", new OneOperator2_(MakePtrFE3_2), new OneOperator3_(MakePtrFE3_3), new OneOperator2_(MakePtrFE3_2), new OneOperator3_(MakePtrFE3_3) //, // new OneOperator2_(MakePtr) ); TheOperators->Add("<-", new OneOperatorMakePtrFE3(atype()), // scalar case new OneOperatorMakePtrFE3(atype()), // vect case new OneOperatorMakePtrFE3(atype()), // scalar complex case new OneOperatorMakePtrFE3(atype()) // vect complex case ); TheOperators->Add("<-", new OneOperator2_(&set_copy_incr)); TheOperators->Add("=", new OneOperator2(&set_eqdestroy_incr) ); TheOperators->Add("=", new OneOperator2_ >(set_fe3) , new OneOperator2_ >(set_fe3) ) ; map_type[typeid(double).name()]->AddCast( new E_F1_funcT(pf3r2R) ); map_type[typeid(Complex).name()]->AddCast( new E_F1_funcT(pf3r2R) ); Global.Add("dz","(",new OneOperatorCode >); Global.Add("dxz","(",new OneOperatorCode >); Global.Add("dyz","(",new OneOperatorCode >); Global.Add("dzx","(",new OneOperatorCode >); Global.Add("dzx","(",new OneOperatorCode >); Global.Add("dzz","(",new OneOperatorCode >); Global.Add("dz","(",new OneOperatorCode >); Global.Add("dxz","(",new OneOperatorCode >); Global.Add("dyz","(",new OneOperatorCode >); Global.Add("dzx","(",new OneOperatorCode >); Global.Add("dzx","(",new OneOperatorCode >); Global.Add("dzz","(",new OneOperatorCode >); // bof Global.Add("dx","(",new E_F1_funcT(pf3r2R)); Global.Add("dy","(",new E_F1_funcT(pf3r2R)); Global.Add("dz","(",new E_F1_funcT(pf3r2R)); Global.Add("dxx","(",new E_F1_funcT(pf3r2R)); Global.Add("dyy","(",new E_F1_funcT(pf3r2R)); Global.Add("dxy","(",new E_F1_funcT(pf3r2R)); Global.Add("dyx","(",new E_F1_funcT(pf3r2R)); Global.Add("dzx","(",new E_F1_funcT(pf3r2R)); Global.Add("dzy","(",new E_F1_funcT(pf3r2R)); Global.Add("dzz","(",new E_F1_funcT(pf3r2R)); Global.Add("dxz","(",new E_F1_funcT(pf3r2R)); Global.Add("dyz","(",new E_F1_funcT(pf3r2R)); Global.Add("dx","(",new E_F1_funcT(pf3r2R)); Global.Add("dy","(",new E_F1_funcT(pf3r2R)); Global.Add("dz","(",new E_F1_funcT(pf3r2R)); Global.Add("dxx","(",new E_F1_funcT(pf3r2R)); Global.Add("dyy","(",new E_F1_funcT(pf3r2R)); Global.Add("dxy","(",new E_F1_funcT(pf3r2R)); Global.Add("dyx","(",new E_F1_funcT(pf3r2R)); Global.Add("dzx","(",new E_F1_funcT(pf3r2R)); Global.Add("dzy","(",new E_F1_funcT(pf3r2R)); Global.Add("dzz","(",new E_F1_funcT(pf3r2R)); Global.Add("dxz","(",new E_F1_funcT(pf3r2R)); Global.Add("dyz","(",new E_F1_funcT(pf3r2R)); Global.Add("int3d","(",new OneOperatorCode); Global.Add("int2d","(",new OneOperatorCode); Global.Add("intallfaces","(",new OneOperatorCode); /*decommente par J. Morice 14/01/09*/ Add("n",".",new OneOperator1(pf3r_nbdf)); Add("n",".",new OneOperator1(pf3r_nbdf)); Add("ndof",".",new OneOperator1(pVh3_ndof)); Add("nt",".",new OneOperator1(pVh3_nt)); Add("ndofK",".",new OneOperator1(pVh3_ndofK)); //Add("[","",new OneOperator2_(get_element)); //Add("[","",new OneOperator2_(get_element)); //Add("[","",new OneOperator2_(get_element)); // 3d new code Add("[","",new OneOperator2_(get_element)); // use ???? FH sep. 2009 Add("[","",new OneOperator2_(get_element)); // use ???? FH sep. 2009 Add("[","",new OneOperator2_FE_get_elmnt());// new version FH sep 2009 Add("[","",new OneOperator2_FE_get_elmnt()); Add("(","", new OneTernaryOperator ); init_mesh3_array(); } //#include "InitFunct.hpp" //static addingInitFunct TheaddingInitFunct(-10,init_lgmesh3); template E_set_fev3::E_set_fev3(const E_Array * a,Expression pp) ; template E_set_fev3::E_set_fev3(const E_Array * a,Expression pp) ; freefem++-3.38-1/src/fflib/lgmesh3.hpp000644 000767 000024 00000002505 11406226635 017537 0ustar00hechtstaff000000 000000 #ifndef LGMESH3_HPP #define LGMESH3_HPP // 3d typedef FEbase * pf3rbase ; typedef FEbaseArray * pf3rbasearray ; typedef pair pf3r ; typedef pair pf3rarray ; typedef FEbase * pf3cbase ; typedef FEbaseArray * pf3cbasearray ; typedef pair pf3c ; typedef pair pf3carray ; // fin bool isSameMesh(const list & largs,const void * Thu,const void * Thv,Stack stack) ; // true => VF type of Matrix //bool isSameMesh(const list & largs,const Mesh * Thu,const Mesh * Thv,Stack stack) ; inline C_F0 CCastToR(const C_F0 & f){ return C_F0(atype()->CastTo(f),atype());} inline bool BCastToR(const C_F0 & f){ return atype()->CastingFrom(f.left());} inline C_F0 CCastToC(const C_F0 & f){ return C_F0(atype()->CastTo(f),atype());} inline bool BCastToC(const C_F0 & f){ return atype()->CastingFrom(f.left());} template inline Expression CastTo(const C_F0 & f) { return atype()->CastTo(f);} template inline bool BCastTo(const C_F0 & f) { return atype()->CastingFrom(f.left());} inline void Check(bool v,const char * mess) { if (!v) { cerr << " Error " << mess ; throw(ErrorExec(mess,1)); } } #endif freefem++-3.38-1/src/fflib/lgsolver.hpp000644 000767 000024 00000045436 12524214121 020031 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "gmres.hpp" typedef void * pcommworld; namespace Fem2D { // hack --- F. Hecht ----- // une fonction pour change un tableau de // complex en tableau de real // Idee faire // Une class qui tranforme une matrice complex en matric real // et faire de transformateur de vecteur inline KN_ C2R(KN_ > & vc) { assert(vc.step==1); complex * pc=vc; // pointeur du tableau double *pr = static_cast(static_cast(pc)); return KN_(pr,vc.N()*2); } inline const KN_ C2R(const KN_ > & vc) { assert(vc.step==1); complex * pc=vc; // pointeur du tableau double *pr = static_cast(static_cast(pc)); return KN_(pr,vc.N()*2); } inline KN_ > R2C(KN_ & vr) { assert(vr.step==1 && vr.N() %2 ==0); double *pr =vr; // pointeur du tableau complex * pc = static_cast* >(static_cast(pr)); return KN_ >(pc,vr.N()/2); } inline const KN_ > R2C(const KN_ & vr) { assert(vr.step==1 && vr.N() %2 ==0); double *pr =vr; // pointeur du tableau complex * pc = static_cast* >(static_cast(pr)); return KN_ >(pc,vr.N()/2); } // une classe pour transforme une Matrice complex en Matrice real // ----------------------------------------------------------------- template class MatC2R : public VirtualMatrice { public: typedef typename VirtualMatrice::plusAx plusAx; // typedef VirtualMatrice > M; const MM &m; MatC2R(const MM &mm): VirtualMatrice(mm.N*2,mm.M*2),m(mm) {} void addMatMul(const KN_ & x, KN_ & Ax) const { R2C(Ax) += m*R2C(x); } plusAx operator*(const KN & x) const {return plusAx(this,x);} virtual bool ChecknbLine(int n) const { return !N ||n==N;} virtual bool ChecknbColumn(int m) const { return !M ||m==M;} }; template class SolveGCPrecon : public MatriceMorse::VirtualSolver , public VirtualMatrice{ int n; int nbitermax; double eps; mutable double epsr; const E_F0 * precon; KN D1; // pour le CL bloque (tgv) mutable KN xx; Expression xx_del, code_del; Stack stack; typedef typename VirtualMatrice::plusAx plusAx; public: SolveGCPrecon(const MatriceMorse &A,const OneOperator * C,Stack stk,int itmax, double epsilon=1e-6) : VirtualMatrice(A.n), n(A.n),nbitermax(itmax?itmax: Max(100,n)),eps(epsilon),epsr(0),precon(0), D1(n),xx(n),stack(stk) { assert(C); WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 throwassert(A.sym()); Type_Expr te_xx(CPValue(xx)); xx_del=te_xx.second; C_F0 e_xx(te_xx); // 1 undelete pointer code_del= C->code(basicAC_F0_wa(e_xx)); precon = to >(C_F0(code_del,*C));// 2 undelete pointer throwassert(precon); R aii; A.getdiag(D1); double tgv=Fem2D::norm(D1.linfty() ) ; if( Fem2D::norm(tgv) < 1e10) tgv=1e100; double tgv1 = 1./tgv; // Corrige fH 11 mai 2015 ... for (int i=0;i &a,KN_ &x,const KN_ &b) const { epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; ConjuguedGradient,SolveGCPrecon,StopGC >(a,*this,b,x,nbitermax,epsr); } plusAx operator*(const KN_ & x) const {return plusAx(this,x);} void addMatMul(const KN_ & x, KN_ & Ax) const { assert(x.N()==Ax.N()); xx=x; // cout << x[0] << " "; xx=GetAny >((*precon)(stack)); WhereStackOfPtr2Free(stack)->clean(); // cout << (xx)[0] << " " << endl; R dii; for (int i=0;iclean(); // FH mars 2005 delete xx_del; delete code_del; // cout << "~SolveGCPrecon " << endl; } virtual bool ChecknbLine(int n) const { return true;} virtual bool ChecknbColumn(int m) const { return true;} }; template class SolveGMRESPrecon : public MatriceMorse::VirtualSolver , public VirtualMatrice{ int n; int nbitermax; double eps; mutable double epsr; const E_F0 * precon; KN D1; mutable KN xx; Expression xx_del, code_del; Stack stack; int dKrylov; typedef typename VirtualMatrice::plusAx plusAx; public: SolveGMRESPrecon(const MatriceMorse &A,const OneOperator * C,Stack stk,int dk=50,int itmax=0,double epsilon=1e-6) : VirtualMatrice(A.n), n(A.n),nbitermax(itmax?itmax: Max(100,n)),eps(epsilon),epsr(0),precon(0), D1(n),xx(n), stack(stk),dKrylov(dk) { assert(C); WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 // C_F0 e_xx(CPValue(xx)); //precon = to >(C_F0(C->code(basicAC_F0_wa(e_xx)),*C)); Type_Expr te_xx(CPValue(xx)); xx_del=te_xx.second; C_F0 e_xx(te_xx); // 1 undelete pointer code_del= C->code(basicAC_F0_wa(e_xx)); precon = to >(C_F0(code_del,*C));// 2 undelete pointer throwassert(precon); R aii; A.getdiag(D1); double tgv = D1.linfty(); if( tgv < 1e5) tgv = 1e100; // if no tgv remove .. // if(verbosity>10 ) cout << " in Precon GMRES, find tgv = " << tgv << endl; for (int i=0;i &a,KN_ &x,const KN_ &b) const { epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; // ConjuguedGradient,SolveGCPrecon >(a,*this,b,x,nbitermax,epsr); KNM H(dKrylov+1,dKrylov+1); int k=dKrylov,nn=nbitermax; //int res= GMRES(a,(KN &)x, (const KN &)b,*this,H,k,nn,epsr,verbosity); } plusAx operator*(const KN_ & x) const {return plusAx(this,x);} void addMatMul(const KN_ & x, KN_ & Ax) const { assert(x.N()==Ax.N()); xx=x; // cout << x[0] << " "; xx=GetAny >((*precon)(stack)); // xx value of the preoco WhereStackOfPtr2Free(stack)->clean(); // cout << (xx)[0] << " " << endl; // R dii; // for (int i=0;iclean(); // FH mars 2005 // cout << "~SolveGMRESPrecon; " << endl; } virtual bool ChecknbLine(int n) const { return true;} virtual bool ChecknbColumn(int m) const { return true;} }; template class SolveGMRESDiag : public MatriceMorse::VirtualSolver , public VirtualMatrice{ int n; int nbitermax; double eps; mutable double epsr; int dKrilov; KN D1; public: typedef typename VirtualMatrice::plusAx plusAx; SolveGMRESDiag(const MatriceMorse &A,int nbk=50,int itmax=0,double epsilon=1e-6) : VirtualMatrice(A.n), n(A.n),nbitermax(itmax?itmax: Max(100,n)),eps(epsilon),epsr(0), dKrilov(nbk) ,D1(n) { R aii=0; A.getdiag(D1); for (int i=0;i &a,KN_ &x,const KN_ &b) const { epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; // ConjuguedGradient,SolveGCDiag >(a,*this,b,x,nbitermax,epsr); KNM H(dKrilov+1,dKrilov+1); int k=dKrilov,nn=nbitermax; //int res= GMRES(a,(KN &)x,(const KN &)b,*this,H,k,nn,epsr,verbosity); } plusAx operator*(const KN_ & x) const {return plusAx(this,x);} void addMatMul(const KN_ & x, KN_ & Ax) const { assert(x.N()==Ax.N()); for (int i=0;i class SolveGMRESDiag : public MatriceMorse::VirtualSolver , public VirtualMatrice{ int n; int nbitermax; KN D1; double eps; mutable double epsr; int dKrilov; public: typedef VirtualMatrice::plusAx plusAx; SolveGMRESDiag(const MatriceMorse &A,int nbk=50,int itmax=0,double epsilon=1e-6) : VirtualMatrice(A.n), n(A.n),nbitermax(itmax?itmax: Max(100,n)),D1(n),eps(epsilon),epsr(0), dKrilov(nbk) { Complex aii=0; A.getdiag(D1); for (int i=0;i &a,KN_ &x,const KN_ &b) const { epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; // ConjuguedGradient,SolveGCDiag >(a,*this,b,x,nbitermax,epsr); KNM H(dKrilov+1,dKrilov+1); int k=dKrilov,nn=nbitermax; KN_ rx=C2R(x); const KN_ rb=C2R(b); typedef MatC2R > VA; typedef MatC2R > VC; VA AR(a); VC CR(*this); //int res= GMRES(AR,(KN &)rx,(const KN &)rb,CR,H,k,nn,epsr,verbosity); } plusAx operator*(const KN_ & x) const {return plusAx(this,x);} void addMatMul(const KN_ & x, KN_ & Ax) const { assert(x.N()==Ax.N()); for (int i=0;i class SolveGMRESPrecon : public MatriceMorse::VirtualSolver , public VirtualMatrice{ public: int n; int nbitermax; Expression xx_del, code_del; const E_F0 * precon; Stack stack; double eps; mutable double epsr; int dKrylov; KN D1; mutable KN xx; typedef VirtualMatrice::plusAx plusAx; public: SolveGMRESPrecon(const MatriceMorse &A,const OneOperator * C,Stack stk,int dk=50,int itmax=0,double epsilon=1e-6) : VirtualMatrice(A.n), n(A.n),nbitermax(itmax?itmax: Max(100,n)), xx_del(0),code_del(0), precon(0),stack(stk),eps(epsilon),epsr(0),dKrylov(dk), D1(n),xx(n) { assert(C); WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Type_Expr te_xx(CPValue(xx)); xx_del=te_xx.second; C_F0 e_xx(te_xx); // 1 undelete pointer code_del= C->code(basicAC_F0_wa(e_xx)); precon = to >(C_F0(code_del,*C));// 2 undelete pointer //C_F0 e_xx(CPValue(xx)); //precon = to >(C_F0(C->code(basicAC_F0_wa(e_xx)),*C)); throwassert(precon); Complex aii; A.getdiag(D1); for (int i=0;i &a,KN_ &x,const KN_ &b) const { epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; // ConjuguedGradient,SolveGCPrecon >(a,*this,b,x,nbitermax,epsr); KNM H(dKrylov+1,dKrylov+1); int k=dKrylov,nn=nbitermax; KN_ rx=C2R(x); const KN_ rb=C2R(b); typedef MatC2R > VA; typedef MatC2R > VC; VA AR(a); VC CR(*this); //int res= GMRES(AR,(KN &)rx,(const KN &)rb,CR,H,k,nn,epsr,verbosity); // assert(0); // a faire //int res=GMRES(a,(KN &)x, (const KN &)b,*this,H,k,nn,epsr); } plusAx operator*(const KN_ & x) const {return plusAx(this,x);} void addMatMul(const KN_ & x, KN_ & Ax) const { assert(x.N()==Ax.N()); xx=x; // cout << x[0] << " "; xx=GetAny >((*precon)(stack)); WhereStackOfPtr2Free(stack)->clean(); // cout << (xx)[0] << " " << endl; Complex dii; for (int i=0;iclean(); // FH mars 2005 delete xx_del; delete code_del; // cout << "~SolveGMRESPrecon; " << endl; } virtual bool ChecknbLine(int ) const { return true;} virtual bool ChecknbColumn(int ) const { return true;} }; template typename MatriceMorse::VirtualSolver * BuildSolverGMRES(DCL_ARG_SPARSE_SOLVER(R,A)) { typename MatriceMorse::VirtualSolver * ret=0; if (ds.precon) ret=new SolveGMRESPrecon(*A,(const OneOperator *)ds.precon,stack,ds.NbSpace,ds.itmax,ds.epsilon); else ret=new SolveGMRESDiag(*A,ds.NbSpace,ds.itmax,ds.epsilon); return ret; } template typename MatriceMorse::VirtualSolver * BuildSolverCG(DCL_ARG_SPARSE_SOLVER(R,A) ) { typename MatriceMorse::VirtualSolver * ret=0; if (ds.precon) ret=new SolveGCPrecon(*A,(const OneOperator *)ds.precon,stack,ds.itmax,ds.epsilon); else ret=new SolveGCDiag(*A,ds.itmax,ds.epsilon); return ret; } #define LIST_NAME_PARM_MAT \ { "init", &typeid(bool)}, \ { "solver", &typeid(TypeSolveMat*)}, \ { "eps", &typeid(double) }, \ { "precon",&typeid(Polymorphic*)}, \ { "dimKrylov",&typeid(long)}, \ { "tgv",&typeid(double )}, \ { "factorize",&typeid(bool)}, \ { "strategy",&typeid(long )}, \ { "tolpivot",&typeid(double )}, \ { "tolpivotsym",&typeid(double )}, \ { "nbiter", &typeid(long)}, \ { "datafilename", &typeid(string*)} , \ { "lparams",&typeid(KN_)} , \ { "dparams", &typeid(KN_)}, \ { "smap", &typeid(map*)}, \ { "permr", &typeid(KN_)}, \ { "permc", &typeid(KN_)}, \ { "scaler", &typeid(KN_)}, \ { "scalec", &typeid(KN_)}, \ { "sparams", &typeid(string*)}, \ { "commworld", &typeid(pcommworld)}, \ { "master", &typeid(long)} \ const int NB_NAME_PARM_MAT = 22 ; /* { "init", &typeid(bool)}, { "solver", &typeid(TypeSolveMat*)}, { "eps", &typeid(double) }, { "precon",&typeid(Polymorphic*)}, { "dimKrylov",&typeid(long)}, { "bmat",&typeid(Matrice_Creuse* )}, { "tgv",&typeid(double )}, { "factorize",&typeid(bool)}, { "strategy",&typeid(long )}, { "tolpivot",&typeid(double )}, { "tolpivotsym",&typeid(double )}, { "nbiter", &typeid(long)}, // 11 // avril 2009 FH { "datafilename",& &typeid(string*)} { "lparams",& &typeid(KN_)} { "dparams",& &typeid(KN_)} { "smap", &typeid(map*)} { "permr", &typeid(KN_)} { "permc", &typeid(KN_)} { "scaler", &typeid(KN_)} { "scalec", &typeid(KN_)} */ template inline void SetEnd_Data_Sparse_Solver(Stack stack,Data_Sparse_Solver & ds,Expression const *nargs ,int n_name_param) { int kk = n_name_param-NB_NAME_PARM_MAT-1; if (nargs[++kk]) ds.initmat= ! GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.typemat= GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.epsilon= GetAny((*nargs[kk])(stack)); if (nargs[++kk]) {// modif FH fev 2010 ... const Polymorphic * op= dynamic_cast(nargs[kk]); if(op) ds.precon = op->Find("(",ArrayOfaType(atype* >(),false)); // strange bug in g++ is R become a double } if (nargs[++kk]) ds.NbSpace= GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.tgv= GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.factorize= GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.strategy = GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.tol_pivot = GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.tol_pivot_sym = GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.itmax = GetAny((*nargs[kk])(stack)); // frev 2007 OK if (nargs[++kk]) ds.data_filename = *GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.lparams = GetAny >((*nargs[kk])(stack)); if (nargs[++kk]) ds.dparams = GetAny >((*nargs[kk])(stack)); if (nargs[++kk]) ds.smap = GetAny *>((*nargs[kk])(stack)); if (nargs[++kk]) ds.perm_r = GetAny >((*nargs[kk])(stack)); if (nargs[++kk]) ds.perm_c = GetAny >((*nargs[kk])(stack)); if (nargs[++kk]) ds.scale_r = GetAny >((*nargs[kk])(stack)); if (nargs[++kk]) ds.scale_c = GetAny >((*nargs[kk])(stack)); if (nargs[++kk]) ds.sparams = *GetAny((*nargs[kk])(stack)); if (nargs[++kk]) ds.commworld = GetAny((*nargs[kk])(stack)); #ifdef VDATASPARSESOLVER if (nargs[++kk]) ds.master = GetAny((*nargs[kk])(stack)); #endif /* de datafilename a scalec */ /* if (nargs[++kk]) ds.param_int= GetAny< KN >((*nargs[kk+12])(stack)); // Add J. Morice 02/09 if (nargs[kk+13]) ds.param_double= GetAny< KN >((*nargs[kk+13])(stack)); if (nargs[kk+14]) ds.param_char= GetAny< string * >((*nargs[kk+14])(stack)); // if (nargs[kk+15]) ds.perm_r = GetAny< KN >((*nargs[kk+15])(stack)); if (nargs[kk+16]) ds.perm_c = GetAny< KN >((*nargs[kk+16])(stack)); // if (nargs[kk+17]) ds.file_param_int= GetAny< string* >((*nargs[kk+17])(stack)); // Add J. Morice 02/09 if (nargs[kk+18]) ds.file_param_double= GetAny< string* >((*nargs[kk+18])(stack)); if (nargs[kk+19]) ds.file_param_char= GetAny< string* >((*nargs[kk+19])(stack)); // if (nargs[kk+20]) ds.file_param_perm_r = GetAny< string* >((*nargs[kk+20])(stack)); if (nargs[kk+21]) ds.file_param_perm_c = GetAny< string* >((*nargs[kk+21])(stack)); // */ assert(++kk == n_name_param); } } // end of namespace Fem2D freefem++-3.38-1/src/fflib/load.cpp000644 000767 000024 00000010203 12471464470 017105 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config-wrapper.h" // needed for HAVE_DLFCN_H #include #include #include #include "AFunction.hpp" #include "environment.hpp" #include "InitFunct.hpp" using namespace std; #include "lex.hpp" #define LOAD 1 #if defined(__INTEL__) || defined(__MWERKS__) || !defined(HAVE_DLFCN_H) #undef LOAD #endif #ifdef LOAD #include #elif _WIN32 #include #endif #include "ffapi.hpp" set SetLoadFile; bool load(string ss) { // FFCS - do not allow potentially dangerous commands from remote anonymous clients if(ffapi::protectedservermode() && (ss=="pipe" || ss=="shell")){ cerr<<"library "< prefix(ffenvironment["loadpath"]); if(prefix.empty()) { prefix.push_back(""); prefix.push_back("./"); } string suffix[nbsuffix] ; suffix[0]=""; suffix[1]=".so"; #ifdef __APPLE__ suffix[1]=".dylib"; #endif #ifdef _WIN32 suffix[1]=".dll"; #endif int j; for (list::const_iterator i= prefix.begin();i !=prefix.end();++i) for ( j= 0;j< nbsuffix;++j) { string s= *i+ss+suffix[j]; #ifdef LOAD handle = dlopen (s.c_str(), RTLD_LAZY ); if (verbosity>9) cout << " test dlopen(" << s << ")= " << handle << endl; // FFCS - 20/9/11 - print explanation for load errors if(verbosity>9 && !handle){ cout<<"load error was: "<9) cout << " test LoadLibrary(" << s << ")= " << mod << endl; if(mod==0) { DWORD merr = GetLastError(); if(verbosity>19) cerr << "\n try loadLibary : " <::const_iterator i= prefix.begin();i !=prefix.end();++i) cerr <<"'"<<*i<<"' "; cerr << "list suffix : '"<< suffix[0] << "' , '" << suffix[1] << "' "; cerr << endl; } CompileError("Error load"); } return 0 ; } freefem++-3.38-1/src/fflib/Makefile.am000644 000767 000024 00000005072 12465110040 017506 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ noinst_LIBRARIES=libff.a # FFCS - 28/11/11 - ffapi.cpp cannot be part of libff.a because it # needs to be compiled with different options depending on the # executable it is included in (eg with/without MPI) libff_a_SOURCES2= UMFPack_Solver.cpp \ AFunction.cpp AFunction2.cpp \ array_long.cpp array_real.cpp array_complex.cpp \ lex.cpp lgmesh.cpp lgmesh3.cpp \ CodeAlloc.cpp lgmat.cpp global.cpp \ ../femlib/Drawing.cpp ../femlib/gibbs.cpp \ ../femlib/CheckPtr.cpp ../femlib/fem.cpp \ ../femlib/QuadratureFormular.cpp ../femlib/FESpace.cpp \ ../femlib/Element_RT.cpp ../femlib/mshptg.cpp ../femlib/FQuadTree.cpp \ ../bamglib/QuadTree.cpp ../bamglib/R2.cpp ../bamglib/Meshio.cpp \ ../bamglib/Mesh2.cpp ../bamglib/Metric.cpp ../femlib/BamgFreeFem.cpp \ ../bamglib/MeshDraw.cpp ../bamglib/MeshGeom.cpp \ ../bamglib/MeshQuad.cpp ../bamglib/SetOfE4.cpp ../bamglib/MeshRead.cpp \ ../bamglib/write_hdf5.cpp ../bamglib/write_hdf5.hpp ../bamglib/write_xdmf.cpp \ ../bamglib/MeshWrite.cpp problem.cpp mt19937ar.cpp \ ../Graphics/DefColor.cpp \ InitFunct.cpp ../Algo/lgalgo.cpp \ ../femlib/Element_P2h.cpp load.cpp lgfem.cpp AFunction.hpp AnyType.hpp \ error.hpp ../femlib/gmres.hpp InitFunct.hpp lex.hpp lgfem.hpp lgmesh3.hpp \ lgmesh.hpp lgsolver.hpp \ Operator.hpp problem.hpp Serialize.hpp showverb.hpp String.hpp \ throwassert.hpp versionnumber.hpp CodeAlloc.hpp \ array_init.hpp array_tlp.hpp array_resize.hpp \ strversionnumber.hpp ffstack.hpp AddNewFE.h \ environment.cpp environment.hpp string_def.cpp \ ../femlib/FESpacen.cpp \ ../femlib/P012_1d.cpp \ ../femlib/P012_2d.cpp \ ../femlib/P012_3d.cpp \ ../femlib/Mesh1dn.cpp \ ../femlib/Mesh2dn.cpp \ ../femlib/Mesh3dn.cpp \ ../femlib/GQuadTree.cpp \ ../femlib/libmesh5.c \ glumesh2D.cpp \ PlotStream.hpp \ endian.hpp \ ff++.hpp \ ../Eigen/arpackff.hpp \ ../femlib/splitsimplex.cpp AFunction_ext.hpp \ ffapi.hpp P1IsoValue.cpp P1IsoValue.hpp libff_a_SOURCES=$(libff_a_SOURCES2) strversionnumber.cpp # eigenvalue.cpp is optional (see configure.ac) EXTRA_libff_a_SOURCES=../Eigen/eigenvalue.cpp libff_a_LIBADD=@EIGENOBJ@ libff_a_DEPENDENCIES=@EIGENOBJ@ AM_CPPFLAGS=-I$(srcdir)/../lglib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics -I$(srcdir)/../femlib $(HDF5_CPPFLAGS) # -I$(top_srcdir)/arpack/arpack++/include # Build date changes at every change EXTRA_DIST=strversionnumber.m4 BUILT_SOURCES=strversionnumber.cpp strversionnumber.cpp: $(libff_a_SOURCES2) ../../configure m4 -DVersionFreeFemDate="`date`" strversionnumber.m4 > $@ FORCE: freefem++-3.38-1/src/fflib/Makefile.in000644 000767 000024 00000303060 12543260337 017531 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/fflib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libff_a_AR = $(AR) $(ARFLAGS) am__objects_1 = UMFPack_Solver.$(OBJEXT) AFunction.$(OBJEXT) \ AFunction2.$(OBJEXT) array_long.$(OBJEXT) array_real.$(OBJEXT) \ array_complex.$(OBJEXT) lex.$(OBJEXT) lgmesh.$(OBJEXT) \ lgmesh3.$(OBJEXT) CodeAlloc.$(OBJEXT) lgmat.$(OBJEXT) \ global.$(OBJEXT) Drawing.$(OBJEXT) gibbs.$(OBJEXT) \ CheckPtr.$(OBJEXT) fem.$(OBJEXT) QuadratureFormular.$(OBJEXT) \ FESpace.$(OBJEXT) Element_RT.$(OBJEXT) mshptg.$(OBJEXT) \ FQuadTree.$(OBJEXT) QuadTree.$(OBJEXT) R2.$(OBJEXT) \ Meshio.$(OBJEXT) Mesh2.$(OBJEXT) Metric.$(OBJEXT) \ BamgFreeFem.$(OBJEXT) MeshDraw.$(OBJEXT) MeshGeom.$(OBJEXT) \ MeshQuad.$(OBJEXT) SetOfE4.$(OBJEXT) MeshRead.$(OBJEXT) \ write_hdf5.$(OBJEXT) write_xdmf.$(OBJEXT) MeshWrite.$(OBJEXT) \ problem.$(OBJEXT) mt19937ar.$(OBJEXT) DefColor.$(OBJEXT) \ InitFunct.$(OBJEXT) lgalgo.$(OBJEXT) Element_P2h.$(OBJEXT) \ load.$(OBJEXT) lgfem.$(OBJEXT) environment.$(OBJEXT) \ string_def.$(OBJEXT) FESpacen.$(OBJEXT) P012_1d.$(OBJEXT) \ P012_2d.$(OBJEXT) P012_3d.$(OBJEXT) Mesh1dn.$(OBJEXT) \ Mesh2dn.$(OBJEXT) Mesh3dn.$(OBJEXT) GQuadTree.$(OBJEXT) \ libmesh5.$(OBJEXT) glumesh2D.$(OBJEXT) splitsimplex.$(OBJEXT) \ P1IsoValue.$(OBJEXT) am_libff_a_OBJECTS = $(am__objects_1) strversionnumber.$(OBJEXT) libff_a_OBJECTS = $(am_libff_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libff_a_SOURCES) $(EXTRA_libff_a_SOURCES) DIST_SOURCES = $(libff_a_SOURCES) $(EXTRA_libff_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libff.a # FFCS - 28/11/11 - ffapi.cpp cannot be part of libff.a because it # needs to be compiled with different options depending on the # executable it is included in (eg with/without MPI) libff_a_SOURCES2 = UMFPack_Solver.cpp \ AFunction.cpp AFunction2.cpp \ array_long.cpp array_real.cpp array_complex.cpp \ lex.cpp lgmesh.cpp lgmesh3.cpp \ CodeAlloc.cpp lgmat.cpp global.cpp \ ../femlib/Drawing.cpp ../femlib/gibbs.cpp \ ../femlib/CheckPtr.cpp ../femlib/fem.cpp \ ../femlib/QuadratureFormular.cpp ../femlib/FESpace.cpp \ ../femlib/Element_RT.cpp ../femlib/mshptg.cpp ../femlib/FQuadTree.cpp \ ../bamglib/QuadTree.cpp ../bamglib/R2.cpp ../bamglib/Meshio.cpp \ ../bamglib/Mesh2.cpp ../bamglib/Metric.cpp ../femlib/BamgFreeFem.cpp \ ../bamglib/MeshDraw.cpp ../bamglib/MeshGeom.cpp \ ../bamglib/MeshQuad.cpp ../bamglib/SetOfE4.cpp ../bamglib/MeshRead.cpp \ ../bamglib/write_hdf5.cpp ../bamglib/write_hdf5.hpp ../bamglib/write_xdmf.cpp \ ../bamglib/MeshWrite.cpp problem.cpp mt19937ar.cpp \ ../Graphics/DefColor.cpp \ InitFunct.cpp ../Algo/lgalgo.cpp \ ../femlib/Element_P2h.cpp load.cpp lgfem.cpp AFunction.hpp AnyType.hpp \ error.hpp ../femlib/gmres.hpp InitFunct.hpp lex.hpp lgfem.hpp lgmesh3.hpp \ lgmesh.hpp lgsolver.hpp \ Operator.hpp problem.hpp Serialize.hpp showverb.hpp String.hpp \ throwassert.hpp versionnumber.hpp CodeAlloc.hpp \ array_init.hpp array_tlp.hpp array_resize.hpp \ strversionnumber.hpp ffstack.hpp AddNewFE.h \ environment.cpp environment.hpp string_def.cpp \ ../femlib/FESpacen.cpp \ ../femlib/P012_1d.cpp \ ../femlib/P012_2d.cpp \ ../femlib/P012_3d.cpp \ ../femlib/Mesh1dn.cpp \ ../femlib/Mesh2dn.cpp \ ../femlib/Mesh3dn.cpp \ ../femlib/GQuadTree.cpp \ ../femlib/libmesh5.c \ glumesh2D.cpp \ PlotStream.hpp \ endian.hpp \ ff++.hpp \ ../Eigen/arpackff.hpp \ ../femlib/splitsimplex.cpp AFunction_ext.hpp \ ffapi.hpp P1IsoValue.cpp P1IsoValue.hpp libff_a_SOURCES = $(libff_a_SOURCES2) strversionnumber.cpp # eigenvalue.cpp is optional (see configure.ac) EXTRA_libff_a_SOURCES = ../Eigen/eigenvalue.cpp libff_a_LIBADD = @EIGENOBJ@ libff_a_DEPENDENCIES = @EIGENOBJ@ AM_CPPFLAGS = -I$(srcdir)/../lglib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics -I$(srcdir)/../femlib $(HDF5_CPPFLAGS) # -I$(top_srcdir)/arpack/arpack++/include # Build date changes at every change EXTRA_DIST = strversionnumber.m4 BUILT_SOURCES = strversionnumber.cpp all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/fflib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/fflib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libff.a: $(libff_a_OBJECTS) $(libff_a_DEPENDENCIES) $(EXTRA_libff_a_DEPENDENCIES) $(AM_V_at)-rm -f libff.a $(AM_V_AR)$(libff_a_AR) libff.a $(libff_a_OBJECTS) $(libff_a_LIBADD) $(AM_V_at)$(RANLIB) libff.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AFunction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AFunction2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BamgFreeFem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CheckPtr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CodeAlloc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefColor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Drawing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Element_P2h.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Element_RT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FESpace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FESpacen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FQuadTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GQuadTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InitFunct.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh1dn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh2dn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mesh3dn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MeshDraw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MeshGeom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MeshQuad.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MeshRead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MeshWrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Meshio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Metric.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/P012_1d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/P012_2d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/P012_3d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/P1IsoValue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuadTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuadratureFormular.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/R2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SetOfE4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UMFPack_Solver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array_complex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array_long.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array_real.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eigenvalue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/environment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gibbs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glumesh2D.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lgalgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lgfem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lgmat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lgmesh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lgmesh3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmesh5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mshptg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt19937ar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/problem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splitsimplex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string_def.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strversionnumber.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_hdf5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_xdmf.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libmesh5.o: ../femlib/libmesh5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmesh5.o -MD -MP -MF $(DEPDIR)/libmesh5.Tpo -c -o libmesh5.o `test -f '../femlib/libmesh5.c' || echo '$(srcdir)/'`../femlib/libmesh5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmesh5.Tpo $(DEPDIR)/libmesh5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../femlib/libmesh5.c' object='libmesh5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmesh5.o `test -f '../femlib/libmesh5.c' || echo '$(srcdir)/'`../femlib/libmesh5.c libmesh5.obj: ../femlib/libmesh5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmesh5.obj -MD -MP -MF $(DEPDIR)/libmesh5.Tpo -c -o libmesh5.obj `if test -f '../femlib/libmesh5.c'; then $(CYGPATH_W) '../femlib/libmesh5.c'; else $(CYGPATH_W) '$(srcdir)/../femlib/libmesh5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmesh5.Tpo $(DEPDIR)/libmesh5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../femlib/libmesh5.c' object='libmesh5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmesh5.obj `if test -f '../femlib/libmesh5.c'; then $(CYGPATH_W) '../femlib/libmesh5.c'; else $(CYGPATH_W) '$(srcdir)/../femlib/libmesh5.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` Drawing.o: ../femlib/Drawing.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Drawing.o -MD -MP -MF $(DEPDIR)/Drawing.Tpo -c -o Drawing.o `test -f '../femlib/Drawing.cpp' || echo '$(srcdir)/'`../femlib/Drawing.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Drawing.Tpo $(DEPDIR)/Drawing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Drawing.cpp' object='Drawing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Drawing.o `test -f '../femlib/Drawing.cpp' || echo '$(srcdir)/'`../femlib/Drawing.cpp Drawing.obj: ../femlib/Drawing.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Drawing.obj -MD -MP -MF $(DEPDIR)/Drawing.Tpo -c -o Drawing.obj `if test -f '../femlib/Drawing.cpp'; then $(CYGPATH_W) '../femlib/Drawing.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Drawing.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Drawing.Tpo $(DEPDIR)/Drawing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Drawing.cpp' object='Drawing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Drawing.obj `if test -f '../femlib/Drawing.cpp'; then $(CYGPATH_W) '../femlib/Drawing.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Drawing.cpp'; fi` gibbs.o: ../femlib/gibbs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gibbs.o -MD -MP -MF $(DEPDIR)/gibbs.Tpo -c -o gibbs.o `test -f '../femlib/gibbs.cpp' || echo '$(srcdir)/'`../femlib/gibbs.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gibbs.Tpo $(DEPDIR)/gibbs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/gibbs.cpp' object='gibbs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gibbs.o `test -f '../femlib/gibbs.cpp' || echo '$(srcdir)/'`../femlib/gibbs.cpp gibbs.obj: ../femlib/gibbs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gibbs.obj -MD -MP -MF $(DEPDIR)/gibbs.Tpo -c -o gibbs.obj `if test -f '../femlib/gibbs.cpp'; then $(CYGPATH_W) '../femlib/gibbs.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/gibbs.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gibbs.Tpo $(DEPDIR)/gibbs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/gibbs.cpp' object='gibbs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gibbs.obj `if test -f '../femlib/gibbs.cpp'; then $(CYGPATH_W) '../femlib/gibbs.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/gibbs.cpp'; fi` CheckPtr.o: ../femlib/CheckPtr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CheckPtr.o -MD -MP -MF $(DEPDIR)/CheckPtr.Tpo -c -o CheckPtr.o `test -f '../femlib/CheckPtr.cpp' || echo '$(srcdir)/'`../femlib/CheckPtr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CheckPtr.Tpo $(DEPDIR)/CheckPtr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/CheckPtr.cpp' object='CheckPtr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CheckPtr.o `test -f '../femlib/CheckPtr.cpp' || echo '$(srcdir)/'`../femlib/CheckPtr.cpp CheckPtr.obj: ../femlib/CheckPtr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CheckPtr.obj -MD -MP -MF $(DEPDIR)/CheckPtr.Tpo -c -o CheckPtr.obj `if test -f '../femlib/CheckPtr.cpp'; then $(CYGPATH_W) '../femlib/CheckPtr.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/CheckPtr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CheckPtr.Tpo $(DEPDIR)/CheckPtr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/CheckPtr.cpp' object='CheckPtr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CheckPtr.obj `if test -f '../femlib/CheckPtr.cpp'; then $(CYGPATH_W) '../femlib/CheckPtr.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/CheckPtr.cpp'; fi` fem.o: ../femlib/fem.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fem.o -MD -MP -MF $(DEPDIR)/fem.Tpo -c -o fem.o `test -f '../femlib/fem.cpp' || echo '$(srcdir)/'`../femlib/fem.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fem.Tpo $(DEPDIR)/fem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/fem.cpp' object='fem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fem.o `test -f '../femlib/fem.cpp' || echo '$(srcdir)/'`../femlib/fem.cpp fem.obj: ../femlib/fem.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fem.obj -MD -MP -MF $(DEPDIR)/fem.Tpo -c -o fem.obj `if test -f '../femlib/fem.cpp'; then $(CYGPATH_W) '../femlib/fem.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/fem.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fem.Tpo $(DEPDIR)/fem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/fem.cpp' object='fem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fem.obj `if test -f '../femlib/fem.cpp'; then $(CYGPATH_W) '../femlib/fem.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/fem.cpp'; fi` QuadratureFormular.o: ../femlib/QuadratureFormular.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT QuadratureFormular.o -MD -MP -MF $(DEPDIR)/QuadratureFormular.Tpo -c -o QuadratureFormular.o `test -f '../femlib/QuadratureFormular.cpp' || echo '$(srcdir)/'`../femlib/QuadratureFormular.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/QuadratureFormular.Tpo $(DEPDIR)/QuadratureFormular.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/QuadratureFormular.cpp' object='QuadratureFormular.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o QuadratureFormular.o `test -f '../femlib/QuadratureFormular.cpp' || echo '$(srcdir)/'`../femlib/QuadratureFormular.cpp QuadratureFormular.obj: ../femlib/QuadratureFormular.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT QuadratureFormular.obj -MD -MP -MF $(DEPDIR)/QuadratureFormular.Tpo -c -o QuadratureFormular.obj `if test -f '../femlib/QuadratureFormular.cpp'; then $(CYGPATH_W) '../femlib/QuadratureFormular.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/QuadratureFormular.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/QuadratureFormular.Tpo $(DEPDIR)/QuadratureFormular.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/QuadratureFormular.cpp' object='QuadratureFormular.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o QuadratureFormular.obj `if test -f '../femlib/QuadratureFormular.cpp'; then $(CYGPATH_W) '../femlib/QuadratureFormular.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/QuadratureFormular.cpp'; fi` FESpace.o: ../femlib/FESpace.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FESpace.o -MD -MP -MF $(DEPDIR)/FESpace.Tpo -c -o FESpace.o `test -f '../femlib/FESpace.cpp' || echo '$(srcdir)/'`../femlib/FESpace.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FESpace.Tpo $(DEPDIR)/FESpace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FESpace.cpp' object='FESpace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FESpace.o `test -f '../femlib/FESpace.cpp' || echo '$(srcdir)/'`../femlib/FESpace.cpp FESpace.obj: ../femlib/FESpace.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FESpace.obj -MD -MP -MF $(DEPDIR)/FESpace.Tpo -c -o FESpace.obj `if test -f '../femlib/FESpace.cpp'; then $(CYGPATH_W) '../femlib/FESpace.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FESpace.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FESpace.Tpo $(DEPDIR)/FESpace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FESpace.cpp' object='FESpace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FESpace.obj `if test -f '../femlib/FESpace.cpp'; then $(CYGPATH_W) '../femlib/FESpace.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FESpace.cpp'; fi` Element_RT.o: ../femlib/Element_RT.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Element_RT.o -MD -MP -MF $(DEPDIR)/Element_RT.Tpo -c -o Element_RT.o `test -f '../femlib/Element_RT.cpp' || echo '$(srcdir)/'`../femlib/Element_RT.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Element_RT.Tpo $(DEPDIR)/Element_RT.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Element_RT.cpp' object='Element_RT.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Element_RT.o `test -f '../femlib/Element_RT.cpp' || echo '$(srcdir)/'`../femlib/Element_RT.cpp Element_RT.obj: ../femlib/Element_RT.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Element_RT.obj -MD -MP -MF $(DEPDIR)/Element_RT.Tpo -c -o Element_RT.obj `if test -f '../femlib/Element_RT.cpp'; then $(CYGPATH_W) '../femlib/Element_RT.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Element_RT.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Element_RT.Tpo $(DEPDIR)/Element_RT.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Element_RT.cpp' object='Element_RT.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Element_RT.obj `if test -f '../femlib/Element_RT.cpp'; then $(CYGPATH_W) '../femlib/Element_RT.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Element_RT.cpp'; fi` mshptg.o: ../femlib/mshptg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mshptg.o -MD -MP -MF $(DEPDIR)/mshptg.Tpo -c -o mshptg.o `test -f '../femlib/mshptg.cpp' || echo '$(srcdir)/'`../femlib/mshptg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mshptg.Tpo $(DEPDIR)/mshptg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/mshptg.cpp' object='mshptg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mshptg.o `test -f '../femlib/mshptg.cpp' || echo '$(srcdir)/'`../femlib/mshptg.cpp mshptg.obj: ../femlib/mshptg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mshptg.obj -MD -MP -MF $(DEPDIR)/mshptg.Tpo -c -o mshptg.obj `if test -f '../femlib/mshptg.cpp'; then $(CYGPATH_W) '../femlib/mshptg.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/mshptg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mshptg.Tpo $(DEPDIR)/mshptg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/mshptg.cpp' object='mshptg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mshptg.obj `if test -f '../femlib/mshptg.cpp'; then $(CYGPATH_W) '../femlib/mshptg.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/mshptg.cpp'; fi` FQuadTree.o: ../femlib/FQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FQuadTree.o -MD -MP -MF $(DEPDIR)/FQuadTree.Tpo -c -o FQuadTree.o `test -f '../femlib/FQuadTree.cpp' || echo '$(srcdir)/'`../femlib/FQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FQuadTree.Tpo $(DEPDIR)/FQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FQuadTree.cpp' object='FQuadTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FQuadTree.o `test -f '../femlib/FQuadTree.cpp' || echo '$(srcdir)/'`../femlib/FQuadTree.cpp FQuadTree.obj: ../femlib/FQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FQuadTree.obj -MD -MP -MF $(DEPDIR)/FQuadTree.Tpo -c -o FQuadTree.obj `if test -f '../femlib/FQuadTree.cpp'; then $(CYGPATH_W) '../femlib/FQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FQuadTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FQuadTree.Tpo $(DEPDIR)/FQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FQuadTree.cpp' object='FQuadTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FQuadTree.obj `if test -f '../femlib/FQuadTree.cpp'; then $(CYGPATH_W) '../femlib/FQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FQuadTree.cpp'; fi` QuadTree.o: ../bamglib/QuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT QuadTree.o -MD -MP -MF $(DEPDIR)/QuadTree.Tpo -c -o QuadTree.o `test -f '../bamglib/QuadTree.cpp' || echo '$(srcdir)/'`../bamglib/QuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/QuadTree.Tpo $(DEPDIR)/QuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/QuadTree.cpp' object='QuadTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o QuadTree.o `test -f '../bamglib/QuadTree.cpp' || echo '$(srcdir)/'`../bamglib/QuadTree.cpp QuadTree.obj: ../bamglib/QuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT QuadTree.obj -MD -MP -MF $(DEPDIR)/QuadTree.Tpo -c -o QuadTree.obj `if test -f '../bamglib/QuadTree.cpp'; then $(CYGPATH_W) '../bamglib/QuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/QuadTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/QuadTree.Tpo $(DEPDIR)/QuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/QuadTree.cpp' object='QuadTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o QuadTree.obj `if test -f '../bamglib/QuadTree.cpp'; then $(CYGPATH_W) '../bamglib/QuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/QuadTree.cpp'; fi` R2.o: ../bamglib/R2.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT R2.o -MD -MP -MF $(DEPDIR)/R2.Tpo -c -o R2.o `test -f '../bamglib/R2.cpp' || echo '$(srcdir)/'`../bamglib/R2.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/R2.Tpo $(DEPDIR)/R2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/R2.cpp' object='R2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o R2.o `test -f '../bamglib/R2.cpp' || echo '$(srcdir)/'`../bamglib/R2.cpp R2.obj: ../bamglib/R2.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT R2.obj -MD -MP -MF $(DEPDIR)/R2.Tpo -c -o R2.obj `if test -f '../bamglib/R2.cpp'; then $(CYGPATH_W) '../bamglib/R2.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/R2.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/R2.Tpo $(DEPDIR)/R2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/R2.cpp' object='R2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o R2.obj `if test -f '../bamglib/R2.cpp'; then $(CYGPATH_W) '../bamglib/R2.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/R2.cpp'; fi` Meshio.o: ../bamglib/Meshio.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Meshio.o -MD -MP -MF $(DEPDIR)/Meshio.Tpo -c -o Meshio.o `test -f '../bamglib/Meshio.cpp' || echo '$(srcdir)/'`../bamglib/Meshio.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Meshio.Tpo $(DEPDIR)/Meshio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/Meshio.cpp' object='Meshio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Meshio.o `test -f '../bamglib/Meshio.cpp' || echo '$(srcdir)/'`../bamglib/Meshio.cpp Meshio.obj: ../bamglib/Meshio.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Meshio.obj -MD -MP -MF $(DEPDIR)/Meshio.Tpo -c -o Meshio.obj `if test -f '../bamglib/Meshio.cpp'; then $(CYGPATH_W) '../bamglib/Meshio.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/Meshio.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Meshio.Tpo $(DEPDIR)/Meshio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/Meshio.cpp' object='Meshio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Meshio.obj `if test -f '../bamglib/Meshio.cpp'; then $(CYGPATH_W) '../bamglib/Meshio.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/Meshio.cpp'; fi` Mesh2.o: ../bamglib/Mesh2.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh2.o -MD -MP -MF $(DEPDIR)/Mesh2.Tpo -c -o Mesh2.o `test -f '../bamglib/Mesh2.cpp' || echo '$(srcdir)/'`../bamglib/Mesh2.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh2.Tpo $(DEPDIR)/Mesh2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/Mesh2.cpp' object='Mesh2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh2.o `test -f '../bamglib/Mesh2.cpp' || echo '$(srcdir)/'`../bamglib/Mesh2.cpp Mesh2.obj: ../bamglib/Mesh2.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh2.obj -MD -MP -MF $(DEPDIR)/Mesh2.Tpo -c -o Mesh2.obj `if test -f '../bamglib/Mesh2.cpp'; then $(CYGPATH_W) '../bamglib/Mesh2.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/Mesh2.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh2.Tpo $(DEPDIR)/Mesh2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/Mesh2.cpp' object='Mesh2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh2.obj `if test -f '../bamglib/Mesh2.cpp'; then $(CYGPATH_W) '../bamglib/Mesh2.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/Mesh2.cpp'; fi` Metric.o: ../bamglib/Metric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Metric.o -MD -MP -MF $(DEPDIR)/Metric.Tpo -c -o Metric.o `test -f '../bamglib/Metric.cpp' || echo '$(srcdir)/'`../bamglib/Metric.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Metric.Tpo $(DEPDIR)/Metric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/Metric.cpp' object='Metric.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Metric.o `test -f '../bamglib/Metric.cpp' || echo '$(srcdir)/'`../bamglib/Metric.cpp Metric.obj: ../bamglib/Metric.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Metric.obj -MD -MP -MF $(DEPDIR)/Metric.Tpo -c -o Metric.obj `if test -f '../bamglib/Metric.cpp'; then $(CYGPATH_W) '../bamglib/Metric.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/Metric.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Metric.Tpo $(DEPDIR)/Metric.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/Metric.cpp' object='Metric.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Metric.obj `if test -f '../bamglib/Metric.cpp'; then $(CYGPATH_W) '../bamglib/Metric.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/Metric.cpp'; fi` BamgFreeFem.o: ../femlib/BamgFreeFem.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BamgFreeFem.o -MD -MP -MF $(DEPDIR)/BamgFreeFem.Tpo -c -o BamgFreeFem.o `test -f '../femlib/BamgFreeFem.cpp' || echo '$(srcdir)/'`../femlib/BamgFreeFem.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BamgFreeFem.Tpo $(DEPDIR)/BamgFreeFem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/BamgFreeFem.cpp' object='BamgFreeFem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BamgFreeFem.o `test -f '../femlib/BamgFreeFem.cpp' || echo '$(srcdir)/'`../femlib/BamgFreeFem.cpp BamgFreeFem.obj: ../femlib/BamgFreeFem.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BamgFreeFem.obj -MD -MP -MF $(DEPDIR)/BamgFreeFem.Tpo -c -o BamgFreeFem.obj `if test -f '../femlib/BamgFreeFem.cpp'; then $(CYGPATH_W) '../femlib/BamgFreeFem.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/BamgFreeFem.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BamgFreeFem.Tpo $(DEPDIR)/BamgFreeFem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/BamgFreeFem.cpp' object='BamgFreeFem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BamgFreeFem.obj `if test -f '../femlib/BamgFreeFem.cpp'; then $(CYGPATH_W) '../femlib/BamgFreeFem.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/BamgFreeFem.cpp'; fi` MeshDraw.o: ../bamglib/MeshDraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshDraw.o -MD -MP -MF $(DEPDIR)/MeshDraw.Tpo -c -o MeshDraw.o `test -f '../bamglib/MeshDraw.cpp' || echo '$(srcdir)/'`../bamglib/MeshDraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshDraw.Tpo $(DEPDIR)/MeshDraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshDraw.cpp' object='MeshDraw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshDraw.o `test -f '../bamglib/MeshDraw.cpp' || echo '$(srcdir)/'`../bamglib/MeshDraw.cpp MeshDraw.obj: ../bamglib/MeshDraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshDraw.obj -MD -MP -MF $(DEPDIR)/MeshDraw.Tpo -c -o MeshDraw.obj `if test -f '../bamglib/MeshDraw.cpp'; then $(CYGPATH_W) '../bamglib/MeshDraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshDraw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshDraw.Tpo $(DEPDIR)/MeshDraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshDraw.cpp' object='MeshDraw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshDraw.obj `if test -f '../bamglib/MeshDraw.cpp'; then $(CYGPATH_W) '../bamglib/MeshDraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshDraw.cpp'; fi` MeshGeom.o: ../bamglib/MeshGeom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshGeom.o -MD -MP -MF $(DEPDIR)/MeshGeom.Tpo -c -o MeshGeom.o `test -f '../bamglib/MeshGeom.cpp' || echo '$(srcdir)/'`../bamglib/MeshGeom.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshGeom.Tpo $(DEPDIR)/MeshGeom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshGeom.cpp' object='MeshGeom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshGeom.o `test -f '../bamglib/MeshGeom.cpp' || echo '$(srcdir)/'`../bamglib/MeshGeom.cpp MeshGeom.obj: ../bamglib/MeshGeom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshGeom.obj -MD -MP -MF $(DEPDIR)/MeshGeom.Tpo -c -o MeshGeom.obj `if test -f '../bamglib/MeshGeom.cpp'; then $(CYGPATH_W) '../bamglib/MeshGeom.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshGeom.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshGeom.Tpo $(DEPDIR)/MeshGeom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshGeom.cpp' object='MeshGeom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshGeom.obj `if test -f '../bamglib/MeshGeom.cpp'; then $(CYGPATH_W) '../bamglib/MeshGeom.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshGeom.cpp'; fi` MeshQuad.o: ../bamglib/MeshQuad.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshQuad.o -MD -MP -MF $(DEPDIR)/MeshQuad.Tpo -c -o MeshQuad.o `test -f '../bamglib/MeshQuad.cpp' || echo '$(srcdir)/'`../bamglib/MeshQuad.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshQuad.Tpo $(DEPDIR)/MeshQuad.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshQuad.cpp' object='MeshQuad.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshQuad.o `test -f '../bamglib/MeshQuad.cpp' || echo '$(srcdir)/'`../bamglib/MeshQuad.cpp MeshQuad.obj: ../bamglib/MeshQuad.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshQuad.obj -MD -MP -MF $(DEPDIR)/MeshQuad.Tpo -c -o MeshQuad.obj `if test -f '../bamglib/MeshQuad.cpp'; then $(CYGPATH_W) '../bamglib/MeshQuad.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshQuad.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshQuad.Tpo $(DEPDIR)/MeshQuad.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshQuad.cpp' object='MeshQuad.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshQuad.obj `if test -f '../bamglib/MeshQuad.cpp'; then $(CYGPATH_W) '../bamglib/MeshQuad.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshQuad.cpp'; fi` SetOfE4.o: ../bamglib/SetOfE4.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SetOfE4.o -MD -MP -MF $(DEPDIR)/SetOfE4.Tpo -c -o SetOfE4.o `test -f '../bamglib/SetOfE4.cpp' || echo '$(srcdir)/'`../bamglib/SetOfE4.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SetOfE4.Tpo $(DEPDIR)/SetOfE4.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/SetOfE4.cpp' object='SetOfE4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SetOfE4.o `test -f '../bamglib/SetOfE4.cpp' || echo '$(srcdir)/'`../bamglib/SetOfE4.cpp SetOfE4.obj: ../bamglib/SetOfE4.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SetOfE4.obj -MD -MP -MF $(DEPDIR)/SetOfE4.Tpo -c -o SetOfE4.obj `if test -f '../bamglib/SetOfE4.cpp'; then $(CYGPATH_W) '../bamglib/SetOfE4.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/SetOfE4.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SetOfE4.Tpo $(DEPDIR)/SetOfE4.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/SetOfE4.cpp' object='SetOfE4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SetOfE4.obj `if test -f '../bamglib/SetOfE4.cpp'; then $(CYGPATH_W) '../bamglib/SetOfE4.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/SetOfE4.cpp'; fi` MeshRead.o: ../bamglib/MeshRead.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshRead.o -MD -MP -MF $(DEPDIR)/MeshRead.Tpo -c -o MeshRead.o `test -f '../bamglib/MeshRead.cpp' || echo '$(srcdir)/'`../bamglib/MeshRead.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshRead.Tpo $(DEPDIR)/MeshRead.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshRead.cpp' object='MeshRead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshRead.o `test -f '../bamglib/MeshRead.cpp' || echo '$(srcdir)/'`../bamglib/MeshRead.cpp MeshRead.obj: ../bamglib/MeshRead.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshRead.obj -MD -MP -MF $(DEPDIR)/MeshRead.Tpo -c -o MeshRead.obj `if test -f '../bamglib/MeshRead.cpp'; then $(CYGPATH_W) '../bamglib/MeshRead.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshRead.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshRead.Tpo $(DEPDIR)/MeshRead.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshRead.cpp' object='MeshRead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshRead.obj `if test -f '../bamglib/MeshRead.cpp'; then $(CYGPATH_W) '../bamglib/MeshRead.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshRead.cpp'; fi` write_hdf5.o: ../bamglib/write_hdf5.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT write_hdf5.o -MD -MP -MF $(DEPDIR)/write_hdf5.Tpo -c -o write_hdf5.o `test -f '../bamglib/write_hdf5.cpp' || echo '$(srcdir)/'`../bamglib/write_hdf5.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/write_hdf5.Tpo $(DEPDIR)/write_hdf5.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/write_hdf5.cpp' object='write_hdf5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o write_hdf5.o `test -f '../bamglib/write_hdf5.cpp' || echo '$(srcdir)/'`../bamglib/write_hdf5.cpp write_hdf5.obj: ../bamglib/write_hdf5.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT write_hdf5.obj -MD -MP -MF $(DEPDIR)/write_hdf5.Tpo -c -o write_hdf5.obj `if test -f '../bamglib/write_hdf5.cpp'; then $(CYGPATH_W) '../bamglib/write_hdf5.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/write_hdf5.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/write_hdf5.Tpo $(DEPDIR)/write_hdf5.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/write_hdf5.cpp' object='write_hdf5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o write_hdf5.obj `if test -f '../bamglib/write_hdf5.cpp'; then $(CYGPATH_W) '../bamglib/write_hdf5.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/write_hdf5.cpp'; fi` write_xdmf.o: ../bamglib/write_xdmf.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT write_xdmf.o -MD -MP -MF $(DEPDIR)/write_xdmf.Tpo -c -o write_xdmf.o `test -f '../bamglib/write_xdmf.cpp' || echo '$(srcdir)/'`../bamglib/write_xdmf.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/write_xdmf.Tpo $(DEPDIR)/write_xdmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/write_xdmf.cpp' object='write_xdmf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o write_xdmf.o `test -f '../bamglib/write_xdmf.cpp' || echo '$(srcdir)/'`../bamglib/write_xdmf.cpp write_xdmf.obj: ../bamglib/write_xdmf.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT write_xdmf.obj -MD -MP -MF $(DEPDIR)/write_xdmf.Tpo -c -o write_xdmf.obj `if test -f '../bamglib/write_xdmf.cpp'; then $(CYGPATH_W) '../bamglib/write_xdmf.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/write_xdmf.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/write_xdmf.Tpo $(DEPDIR)/write_xdmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/write_xdmf.cpp' object='write_xdmf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o write_xdmf.obj `if test -f '../bamglib/write_xdmf.cpp'; then $(CYGPATH_W) '../bamglib/write_xdmf.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/write_xdmf.cpp'; fi` MeshWrite.o: ../bamglib/MeshWrite.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshWrite.o -MD -MP -MF $(DEPDIR)/MeshWrite.Tpo -c -o MeshWrite.o `test -f '../bamglib/MeshWrite.cpp' || echo '$(srcdir)/'`../bamglib/MeshWrite.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshWrite.Tpo $(DEPDIR)/MeshWrite.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshWrite.cpp' object='MeshWrite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshWrite.o `test -f '../bamglib/MeshWrite.cpp' || echo '$(srcdir)/'`../bamglib/MeshWrite.cpp MeshWrite.obj: ../bamglib/MeshWrite.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MeshWrite.obj -MD -MP -MF $(DEPDIR)/MeshWrite.Tpo -c -o MeshWrite.obj `if test -f '../bamglib/MeshWrite.cpp'; then $(CYGPATH_W) '../bamglib/MeshWrite.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshWrite.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MeshWrite.Tpo $(DEPDIR)/MeshWrite.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../bamglib/MeshWrite.cpp' object='MeshWrite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MeshWrite.obj `if test -f '../bamglib/MeshWrite.cpp'; then $(CYGPATH_W) '../bamglib/MeshWrite.cpp'; else $(CYGPATH_W) '$(srcdir)/../bamglib/MeshWrite.cpp'; fi` DefColor.o: ../Graphics/DefColor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DefColor.o -MD -MP -MF $(DEPDIR)/DefColor.Tpo -c -o DefColor.o `test -f '../Graphics/DefColor.cpp' || echo '$(srcdir)/'`../Graphics/DefColor.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DefColor.Tpo $(DEPDIR)/DefColor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/DefColor.cpp' object='DefColor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DefColor.o `test -f '../Graphics/DefColor.cpp' || echo '$(srcdir)/'`../Graphics/DefColor.cpp DefColor.obj: ../Graphics/DefColor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DefColor.obj -MD -MP -MF $(DEPDIR)/DefColor.Tpo -c -o DefColor.obj `if test -f '../Graphics/DefColor.cpp'; then $(CYGPATH_W) '../Graphics/DefColor.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/DefColor.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DefColor.Tpo $(DEPDIR)/DefColor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Graphics/DefColor.cpp' object='DefColor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DefColor.obj `if test -f '../Graphics/DefColor.cpp'; then $(CYGPATH_W) '../Graphics/DefColor.cpp'; else $(CYGPATH_W) '$(srcdir)/../Graphics/DefColor.cpp'; fi` lgalgo.o: ../Algo/lgalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lgalgo.o -MD -MP -MF $(DEPDIR)/lgalgo.Tpo -c -o lgalgo.o `test -f '../Algo/lgalgo.cpp' || echo '$(srcdir)/'`../Algo/lgalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lgalgo.Tpo $(DEPDIR)/lgalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Algo/lgalgo.cpp' object='lgalgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lgalgo.o `test -f '../Algo/lgalgo.cpp' || echo '$(srcdir)/'`../Algo/lgalgo.cpp lgalgo.obj: ../Algo/lgalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lgalgo.obj -MD -MP -MF $(DEPDIR)/lgalgo.Tpo -c -o lgalgo.obj `if test -f '../Algo/lgalgo.cpp'; then $(CYGPATH_W) '../Algo/lgalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../Algo/lgalgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lgalgo.Tpo $(DEPDIR)/lgalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Algo/lgalgo.cpp' object='lgalgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lgalgo.obj `if test -f '../Algo/lgalgo.cpp'; then $(CYGPATH_W) '../Algo/lgalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../Algo/lgalgo.cpp'; fi` Element_P2h.o: ../femlib/Element_P2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Element_P2h.o -MD -MP -MF $(DEPDIR)/Element_P2h.Tpo -c -o Element_P2h.o `test -f '../femlib/Element_P2h.cpp' || echo '$(srcdir)/'`../femlib/Element_P2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Element_P2h.Tpo $(DEPDIR)/Element_P2h.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Element_P2h.cpp' object='Element_P2h.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Element_P2h.o `test -f '../femlib/Element_P2h.cpp' || echo '$(srcdir)/'`../femlib/Element_P2h.cpp Element_P2h.obj: ../femlib/Element_P2h.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Element_P2h.obj -MD -MP -MF $(DEPDIR)/Element_P2h.Tpo -c -o Element_P2h.obj `if test -f '../femlib/Element_P2h.cpp'; then $(CYGPATH_W) '../femlib/Element_P2h.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Element_P2h.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Element_P2h.Tpo $(DEPDIR)/Element_P2h.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Element_P2h.cpp' object='Element_P2h.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Element_P2h.obj `if test -f '../femlib/Element_P2h.cpp'; then $(CYGPATH_W) '../femlib/Element_P2h.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Element_P2h.cpp'; fi` FESpacen.o: ../femlib/FESpacen.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FESpacen.o -MD -MP -MF $(DEPDIR)/FESpacen.Tpo -c -o FESpacen.o `test -f '../femlib/FESpacen.cpp' || echo '$(srcdir)/'`../femlib/FESpacen.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FESpacen.Tpo $(DEPDIR)/FESpacen.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FESpacen.cpp' object='FESpacen.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FESpacen.o `test -f '../femlib/FESpacen.cpp' || echo '$(srcdir)/'`../femlib/FESpacen.cpp FESpacen.obj: ../femlib/FESpacen.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FESpacen.obj -MD -MP -MF $(DEPDIR)/FESpacen.Tpo -c -o FESpacen.obj `if test -f '../femlib/FESpacen.cpp'; then $(CYGPATH_W) '../femlib/FESpacen.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FESpacen.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FESpacen.Tpo $(DEPDIR)/FESpacen.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/FESpacen.cpp' object='FESpacen.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FESpacen.obj `if test -f '../femlib/FESpacen.cpp'; then $(CYGPATH_W) '../femlib/FESpacen.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/FESpacen.cpp'; fi` P012_1d.o: ../femlib/P012_1d.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT P012_1d.o -MD -MP -MF $(DEPDIR)/P012_1d.Tpo -c -o P012_1d.o `test -f '../femlib/P012_1d.cpp' || echo '$(srcdir)/'`../femlib/P012_1d.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/P012_1d.Tpo $(DEPDIR)/P012_1d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/P012_1d.cpp' object='P012_1d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o P012_1d.o `test -f '../femlib/P012_1d.cpp' || echo '$(srcdir)/'`../femlib/P012_1d.cpp P012_1d.obj: ../femlib/P012_1d.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT P012_1d.obj -MD -MP -MF $(DEPDIR)/P012_1d.Tpo -c -o P012_1d.obj `if test -f '../femlib/P012_1d.cpp'; then $(CYGPATH_W) '../femlib/P012_1d.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/P012_1d.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/P012_1d.Tpo $(DEPDIR)/P012_1d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/P012_1d.cpp' object='P012_1d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o P012_1d.obj `if test -f '../femlib/P012_1d.cpp'; then $(CYGPATH_W) '../femlib/P012_1d.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/P012_1d.cpp'; fi` P012_2d.o: ../femlib/P012_2d.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT P012_2d.o -MD -MP -MF $(DEPDIR)/P012_2d.Tpo -c -o P012_2d.o `test -f '../femlib/P012_2d.cpp' || echo '$(srcdir)/'`../femlib/P012_2d.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/P012_2d.Tpo $(DEPDIR)/P012_2d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/P012_2d.cpp' object='P012_2d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o P012_2d.o `test -f '../femlib/P012_2d.cpp' || echo '$(srcdir)/'`../femlib/P012_2d.cpp P012_2d.obj: ../femlib/P012_2d.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT P012_2d.obj -MD -MP -MF $(DEPDIR)/P012_2d.Tpo -c -o P012_2d.obj `if test -f '../femlib/P012_2d.cpp'; then $(CYGPATH_W) '../femlib/P012_2d.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/P012_2d.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/P012_2d.Tpo $(DEPDIR)/P012_2d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/P012_2d.cpp' object='P012_2d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o P012_2d.obj `if test -f '../femlib/P012_2d.cpp'; then $(CYGPATH_W) '../femlib/P012_2d.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/P012_2d.cpp'; fi` P012_3d.o: ../femlib/P012_3d.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT P012_3d.o -MD -MP -MF $(DEPDIR)/P012_3d.Tpo -c -o P012_3d.o `test -f '../femlib/P012_3d.cpp' || echo '$(srcdir)/'`../femlib/P012_3d.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/P012_3d.Tpo $(DEPDIR)/P012_3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/P012_3d.cpp' object='P012_3d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o P012_3d.o `test -f '../femlib/P012_3d.cpp' || echo '$(srcdir)/'`../femlib/P012_3d.cpp P012_3d.obj: ../femlib/P012_3d.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT P012_3d.obj -MD -MP -MF $(DEPDIR)/P012_3d.Tpo -c -o P012_3d.obj `if test -f '../femlib/P012_3d.cpp'; then $(CYGPATH_W) '../femlib/P012_3d.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/P012_3d.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/P012_3d.Tpo $(DEPDIR)/P012_3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/P012_3d.cpp' object='P012_3d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o P012_3d.obj `if test -f '../femlib/P012_3d.cpp'; then $(CYGPATH_W) '../femlib/P012_3d.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/P012_3d.cpp'; fi` Mesh1dn.o: ../femlib/Mesh1dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh1dn.o -MD -MP -MF $(DEPDIR)/Mesh1dn.Tpo -c -o Mesh1dn.o `test -f '../femlib/Mesh1dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh1dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh1dn.Tpo $(DEPDIR)/Mesh1dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh1dn.cpp' object='Mesh1dn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh1dn.o `test -f '../femlib/Mesh1dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh1dn.cpp Mesh1dn.obj: ../femlib/Mesh1dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh1dn.obj -MD -MP -MF $(DEPDIR)/Mesh1dn.Tpo -c -o Mesh1dn.obj `if test -f '../femlib/Mesh1dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh1dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh1dn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh1dn.Tpo $(DEPDIR)/Mesh1dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh1dn.cpp' object='Mesh1dn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh1dn.obj `if test -f '../femlib/Mesh1dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh1dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh1dn.cpp'; fi` Mesh2dn.o: ../femlib/Mesh2dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh2dn.o -MD -MP -MF $(DEPDIR)/Mesh2dn.Tpo -c -o Mesh2dn.o `test -f '../femlib/Mesh2dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh2dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh2dn.Tpo $(DEPDIR)/Mesh2dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh2dn.cpp' object='Mesh2dn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh2dn.o `test -f '../femlib/Mesh2dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh2dn.cpp Mesh2dn.obj: ../femlib/Mesh2dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh2dn.obj -MD -MP -MF $(DEPDIR)/Mesh2dn.Tpo -c -o Mesh2dn.obj `if test -f '../femlib/Mesh2dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh2dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh2dn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh2dn.Tpo $(DEPDIR)/Mesh2dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh2dn.cpp' object='Mesh2dn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh2dn.obj `if test -f '../femlib/Mesh2dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh2dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh2dn.cpp'; fi` Mesh3dn.o: ../femlib/Mesh3dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh3dn.o -MD -MP -MF $(DEPDIR)/Mesh3dn.Tpo -c -o Mesh3dn.o `test -f '../femlib/Mesh3dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh3dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh3dn.Tpo $(DEPDIR)/Mesh3dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh3dn.cpp' object='Mesh3dn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh3dn.o `test -f '../femlib/Mesh3dn.cpp' || echo '$(srcdir)/'`../femlib/Mesh3dn.cpp Mesh3dn.obj: ../femlib/Mesh3dn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Mesh3dn.obj -MD -MP -MF $(DEPDIR)/Mesh3dn.Tpo -c -o Mesh3dn.obj `if test -f '../femlib/Mesh3dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh3dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh3dn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Mesh3dn.Tpo $(DEPDIR)/Mesh3dn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/Mesh3dn.cpp' object='Mesh3dn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Mesh3dn.obj `if test -f '../femlib/Mesh3dn.cpp'; then $(CYGPATH_W) '../femlib/Mesh3dn.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/Mesh3dn.cpp'; fi` GQuadTree.o: ../femlib/GQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GQuadTree.o -MD -MP -MF $(DEPDIR)/GQuadTree.Tpo -c -o GQuadTree.o `test -f '../femlib/GQuadTree.cpp' || echo '$(srcdir)/'`../femlib/GQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GQuadTree.Tpo $(DEPDIR)/GQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/GQuadTree.cpp' object='GQuadTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GQuadTree.o `test -f '../femlib/GQuadTree.cpp' || echo '$(srcdir)/'`../femlib/GQuadTree.cpp GQuadTree.obj: ../femlib/GQuadTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GQuadTree.obj -MD -MP -MF $(DEPDIR)/GQuadTree.Tpo -c -o GQuadTree.obj `if test -f '../femlib/GQuadTree.cpp'; then $(CYGPATH_W) '../femlib/GQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/GQuadTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GQuadTree.Tpo $(DEPDIR)/GQuadTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/GQuadTree.cpp' object='GQuadTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GQuadTree.obj `if test -f '../femlib/GQuadTree.cpp'; then $(CYGPATH_W) '../femlib/GQuadTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/GQuadTree.cpp'; fi` splitsimplex.o: ../femlib/splitsimplex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT splitsimplex.o -MD -MP -MF $(DEPDIR)/splitsimplex.Tpo -c -o splitsimplex.o `test -f '../femlib/splitsimplex.cpp' || echo '$(srcdir)/'`../femlib/splitsimplex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/splitsimplex.Tpo $(DEPDIR)/splitsimplex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/splitsimplex.cpp' object='splitsimplex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o splitsimplex.o `test -f '../femlib/splitsimplex.cpp' || echo '$(srcdir)/'`../femlib/splitsimplex.cpp splitsimplex.obj: ../femlib/splitsimplex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT splitsimplex.obj -MD -MP -MF $(DEPDIR)/splitsimplex.Tpo -c -o splitsimplex.obj `if test -f '../femlib/splitsimplex.cpp'; then $(CYGPATH_W) '../femlib/splitsimplex.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/splitsimplex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/splitsimplex.Tpo $(DEPDIR)/splitsimplex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../femlib/splitsimplex.cpp' object='splitsimplex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o splitsimplex.obj `if test -f '../femlib/splitsimplex.cpp'; then $(CYGPATH_W) '../femlib/splitsimplex.cpp'; else $(CYGPATH_W) '$(srcdir)/../femlib/splitsimplex.cpp'; fi` eigenvalue.o: ../Eigen/eigenvalue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT eigenvalue.o -MD -MP -MF $(DEPDIR)/eigenvalue.Tpo -c -o eigenvalue.o `test -f '../Eigen/eigenvalue.cpp' || echo '$(srcdir)/'`../Eigen/eigenvalue.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/eigenvalue.Tpo $(DEPDIR)/eigenvalue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Eigen/eigenvalue.cpp' object='eigenvalue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o eigenvalue.o `test -f '../Eigen/eigenvalue.cpp' || echo '$(srcdir)/'`../Eigen/eigenvalue.cpp eigenvalue.obj: ../Eigen/eigenvalue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT eigenvalue.obj -MD -MP -MF $(DEPDIR)/eigenvalue.Tpo -c -o eigenvalue.obj `if test -f '../Eigen/eigenvalue.cpp'; then $(CYGPATH_W) '../Eigen/eigenvalue.cpp'; else $(CYGPATH_W) '$(srcdir)/../Eigen/eigenvalue.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/eigenvalue.Tpo $(DEPDIR)/eigenvalue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../Eigen/eigenvalue.cpp' object='eigenvalue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o eigenvalue.obj `if test -f '../Eigen/eigenvalue.cpp'; then $(CYGPATH_W) '../Eigen/eigenvalue.cpp'; else $(CYGPATH_W) '$(srcdir)/../Eigen/eigenvalue.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LIBRARIES) installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile strversionnumber.cpp: $(libff_a_SOURCES2) ../../configure m4 -DVersionFreeFemDate="`date`" strversionnumber.m4 > $@ FORCE: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/fflib/mt19937ar.cpp000755 000767 000024 00000014320 11406226635 017551 0ustar00hechtstaff000000 000000 /* A C-program for MT19937, with initialization improved 2002/1/26. Coded by Takuji Nishimura and Makoto Matsumoto. Before using, initialize the state by using init_genrand(seed) or init_by_array(init_key, key_length). Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Any feedback is very welcome. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) */ #include /* Period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ static unsigned long mt[N]; /* the array for the state vector */ static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ /* initializes mt[N] with a seed */ void init_genrand(unsigned long s) { mt[0]= s & 0xffffffffUL; for (mti=1; mti> 30)) + mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ /* 2002/01/09 modified by Makoto Matsumoto */ mt[mti] &= 0xffffffffUL; /* for >32 bit machines */ } } /* initialize by an array with array-length */ /* init_key is the array for initializing keys */ /* key_length is its length */ /* slight change for C++, 2004/2/26 */ void init_by_array(unsigned long init_key[], int key_length) { int i, j, k; init_genrand(19650218UL); i=1; j=0; k = (N>key_length ? N : key_length); for (; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; /* non linear */ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; j++; if (i>=N) { mt[0] = mt[N-1]; i=1; } if (j>=key_length) j=0; } for (k=N-1; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; /* non linear */ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; if (i>=N) { mt[0] = mt[N-1]; i=1; } } mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ } /* generates a random number on [0,0xffffffff]-interval */ unsigned long genrand_int32(void) { unsigned long y; static unsigned long mag01[2]={0x0UL, MATRIX_A}; /* mag01[x] = x * MATRIX_A for x=0,1 */ if (mti >= N) { /* generate N words at one time */ int kk; if (mti == N+1) /* if init_genrand() has not been called, */ init_genrand(5489UL); /* a default initial seed is used */ for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; } for (;kk> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } /* generates a random number on [0,0x7fffffff]-interval */ long genrand_int31(void) { return (long)(genrand_int32()>>1); } /* generates a random number on [0,1]-real-interval */ double genrand_real1(void) { return genrand_int32()*(1.0/4294967295.0); /* divided by 2^32-1 */ } /* generates a random number on [0,1)-real-interval */ double genrand_real2(void) { return genrand_int32()*(1.0/4294967296.0); /* divided by 2^32 */ } /* generates a random number on (0,1)-real-interval */ double genrand_real3(void) { return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0); /* divided by 2^32 */ } /* generates a random number on [0,1) with 53-bit resolution*/ double genrand_res53(void) { unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; return(a*67108864.0+b)*(1.0/9007199254740992.0); } /* These real versions are due to Isaku Wada, 2002/01/09 added */ /* int main(void) { int i; unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; init_by_array(init, length); printf("1000 outputs of genrand_int32()\n"); for (i=0; i<1000; i++) { printf("%10lu ", genrand_int32()); if (i%5==4) printf("\n"); } printf("\n1000 outputs of genrand_real2()\n"); for (i=0; i<1000; i++) { printf("%10.8f ", genrand_real2()); if (i%5==4) printf("\n"); } return 0; } */ freefem++-3.38-1/src/fflib/Operator.hpp000644 000767 000024 00000052226 12527027106 017772 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if defined(__GNUC__) && __GNUC__+0 >= 3 inline double pow(double x,long l) { return pow(x,(double)l);} #endif template struct Op1_neg: public unary_function { static R f(const A & a) { return - (R)a;} }; template struct Op1_plus: public unary_function { static R f(const A & a) { return + (R)a;} }; template struct Op1_not: public unary_function { static bool f(const A & a) { return ! (bool)a;} }; template struct Op2_add: public binary_function { static R f(const A & a,const B & b) { return ((R)a + (R)b);} }; template struct Op2_sub: public binary_function { static R f(const A & a,const B & b) { return ((R)a - (R)b);} }; template struct Op2_mul: public binary_function { static R f(const A & a,const B & b) { // cout << a << " * " << b <<" => " << ((R)a * (R)b) << endl; return ((R)a * (R)b);} }; template struct Op2_div: public binary_function { static R f(const A & a,const B & b) { if (b == B()) {cerr << a << "/" << b << " : " << typeid(A).name() << " " << typeid(B).name() << " " << typeid(R).name() << endl;ExecError(" Div by 0");} return ((R)a / (R)b);} }; template struct Op2_pipe: public binary_function { static R f(const R & a,const R & b) { return (a | b);} }; template struct Op2_mod: public binary_function { static R f(const A & a,const B & b) { return ((R)a % (R)b);} }; template struct Op2_lt: public binary_function { static bool f(const A & a,const B & b) { // cout << a << " < " << b << " = " << ( a struct Op2_le: public binary_function { static bool f(const A & a,const B & b) { return a <= b;} }; template struct Op2_gt: public binary_function { static bool f(const A & a,const B & b) { return a > b;} }; template struct Op2_ge: public binary_function { static bool f(const A & a,const B & b) { return a >= b;} }; template struct Op2_eq: public binary_function { static bool f(const A & a,const B & b) { //cout << a << " == " << b << " => " <<( a == b) << endl; return a == b;} }; template struct Op2_ne: public binary_function { static bool f(const A & a,const B & b) { return a != b;} }; struct Op2_and: public binary_function { static bool f(const bool & a,const bool & b) { return a && b;} }; struct Op2_or: public binary_function { static bool f(const bool & a,const bool & b) { return a || b;} }; template struct Op2_padd: public binary_function { static R * f(Stack s,const A & a,const B & b) { R* r= Add2StackOfPtr2Free(s,new R (*a + *b)); // delete a,delete b; return r;} }; template struct Op2_plt: public binary_function { static bool f(const A & a,const B & b) { bool r= *a < *b; //delete a,delete b; return r;} }; template struct Op2_ple: public binary_function { static bool f(const A & a,const B & b) { bool r= *a <= *b; // delete a,delete b; return r;} }; template struct Op2_pgt: public binary_function { static bool f(const A & a,const B & b) { bool r= *a > *b; // delete a,delete b; return r;} }; template struct Op2_pge: public binary_function { static bool f(const A & a,const B & b) { bool r= *a >= *b; // delete a,delete b; return r;} }; template struct Op2_peq: public binary_function { static bool f(const A & a,const B & b) { bool r= *a == *b; // delete a,delete b; return r;} }; template struct Op2_pne: public binary_function { static bool f(const A & a,const B & b) { bool r=*a != *b; // delete a,delete b; return r;} }; template struct Op2_pow: public binary_function { static R f(const A & a,const B & b) { return R(pow(a,b));}}; template struct Op_Read : public binary_function { static istream * f(istream * const & f,A * const & a) { *f >> *a; return f; } }; template struct Op_ReadP : public binary_function { static istream * f(istream * const & f,A ** const & a) { assert(a); if( ! *a) *a= new A ; *f >> **a; return f; } }; template struct Op_ReadKN : public binary_function*,istream*> { static istream * f(istream * const & f,KN* const & a) { if( !f || !*f) ExecError("Fatal Error: file not open in read array (Op_ReadKN)"); int n;char c; *f >> n; if(!f->good()) ExecError("Fatal Error: file not good in read array (Op_ReadKN)"); if(n !=a->N()) { cerr << " length on the array " << a->N() << " != " << n << " length in file " << endl; ExecError("Fatal Error: incompatible length in read array (Op_ReadKN)"); assert(n==a->N()); } while (f->get(c) && (c!='\n' && c!='\r' ) ) ((void) 0); // eat until control (new line for (int i=0;i> (*a)[i] ; return f; } }; template struct Op_ReadKNM : public binary_function*,istream*> { static istream * f(istream * const & f,KNM* const & a) { if( !f || !*f) ExecError("Fatal Error: file not open in read array (Op_ReadKN)"); int n,m;char c; *f >> n >> m; if(!f->good()) ExecError("Fatal Error: file not good in read array (Op_ReadKN)"); if(n !=a->N() || m != a->M() ) { cerr << " length on the array N " << a->N() << " != " << n << " n in file " << endl; cerr << " or M " << a->M() << " != " << m << " m in file " << endl; ExecError("Fatal Error: incompatible length in read array (Op_ReadKNM)"); assert(n==a->N()); } while (f->get(c) && (c!='\n' && c!='\r' ) ) ((void) 0); // eat until control (new line for (int i=0;i> (*a)(i,j) ; if(!f->good()) ExecError("Fatal Error: file not good in read array after reading )"); return f; } }; template struct Print: public binary_function { static ostream* f(ostream* const & a,const A & b) { *a << b; return a;} }; // --------------------------------------------- template struct set_eq: public binary_function { static A* f(A* const & a,const A & b) { *a = b; return a;} }; template struct set_eqq: public binary_function { static A f(const A & a,const B & b) {A aa(a); aa = b; return aa;} }; template struct set_eqq_add: public binary_function { static A f(const A & a,const B & b) {A aa(a); aa += b; return aa;} }; template struct set_eq_add: public binary_function { static A* f(A* const & a,const A & b) { *a += b; return a;} }; template struct set_eq_sub: public binary_function { static A* f(A* const & a,const A & b) { *a -= b; return a;} }; template struct set_eq_mul: public binary_function { static A* f(A* const & a,const A & b) { *a *= b; return a;} }; template struct set_eq_div: public binary_function { static A* f(A* const & a,const A & b) { *a /= b; return a;} }; template struct set_peq: public binary_function { static A** f(A** const & a, A * const & b) { if(*a != b ) { //cerr << " set_peq " << *a << endl; delete *a; //cerr << " set_peq " << *a << " " << " = " << b << " " << endl; *a = new A(*b); //(stack ptr) FH mars 2006 //cerr << " set_peq " << *a << " " << **a << " = " << *b << " " << b << endl; } return a;} }; // --------------------------------------------- template struct set_eqarrayp: public binary_function { static A* f(A* const & a, B const & b) { *a = *b; return a;} }; template struct set_eqarrayp_add: public binary_function { static A* f(A* const & a, B const & b) { assert(SameShape(*a,*b)); *a += *b; return a;} }; template struct set_eqarrayp_sub: public binary_function { static A* f(A* const & a, B const & b) { assert(SameShape(*a,*b)); *a -= *b; return a;} }; template struct set_eqarrayp_mul: public binary_function { static A* f(A* const & a, B const & b) { assert(SameShape(*a,*b)); *a *= *b; return a;} }; template struct set_eqarrayp_div: public binary_function { static A* f(A* const & a, B const & b) { assert(SameShape(*a,*b)); *a /= *b; return a;} }; // --------------------------------------------- template struct set_eqarraypd: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,*b)); *a = *b; delete b; return a;} }; template struct set_eqarraypd_add: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,*b)); *a += *b; delete b; return a;} }; template struct set_eqarraypd_sub: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,*b)); *a -= *b; delete b; return a;} }; template struct set_eqarraypd_mul: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,*b)); *a *= *b; delete b; return a;} }; template struct set_eqarraypd_div: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,*b)); *a /= *b; delete b; return a;} }; // --------------------------------------------- template struct set_eqarray: public binary_function { static A* f(A* const & a, B const & b) { *a = b; return a;} }; // --------------------------------------------- august 2007 FH template struct init_eqarray: public binary_function { static A* f(A* const & a, B const & b) { a->init(); *a = b; return a;} }; // --------------------------------------------- template struct init_eqarraypd: public binary_function { static A* f(A* const & a, B const & b) {a->init(); *a = *b; delete b; return a;} }; // --------------------------------------------- template struct init_eqarrayp: public binary_function { static A* f(A* const & a, B const & b) { a->init(); *a = *b; return a;} }; // ---------------------------------------- fin modif august 2007 template struct set_eqarray_add: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,b)); *a += b; return a;} }; template struct set_eqarray_sub: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,b)); *a -= b; return a;} }; template struct set_eqarray_mul: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,b)); *a *= b; return a;} }; template struct set_eqarray_div: public binary_function { static A* f(A* const & a, B const & b) {assert(SameShape(*a,b)); *a /= b; return a;} }; template struct set_eq_array: public binary_function { static A f(const A & a, B const & b) { A aa=a;aa = b; return a;} }; template struct set_eq_array_add: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,b)); A aa(a); aa += b; return a;} }; template struct set_eq_array_sub: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,b)); A aa(a); aa -= b; return a;} }; template struct set_eq_array_mul: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,b)); A aa(a); aa *= b; return a;} }; template struct set_eq_array_div: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,b)); A aa(a); aa /= b; return a;} }; template struct set_eq_arrayp: public binary_function { static A f(A const & a, B const & b) { A aa(a); aa = *b; return a;} }; // --------------------------------------------- template struct set_eq_arraypd: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,*b));A aa(a); aa = *b; delete b; return a;} }; template struct set_eq_arrayp_sub: public binary_function { static A f(A const & a, B const & b) { assert(SameShape(a,*b)); A aa(a); aa -= *b; return a;} }; template struct set_eq_arrayp_mul: public binary_function { static A f(A const & a, B const & b) { assert(SameShape(a,*b)); A aa(a); aa *= *b; return a;} }; template struct set_eq_arrayp_div: public binary_function { static A f(A const & a, B const & b) { assert(SameShape(a,*b)); A aa(a); aa /= *b; return a;} }; template struct set_eq_arrayp_add: public binary_function { static A f(A const & a, B const & b) { assert(SameShape(a,*b)); A aa(a); aa += *b; return a;} }; template struct set_eq_arraypd_add: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,*b)); A aa(a); aa += *b; delete b; return a;} }; template struct set_eq_arraypd_sub: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,*b)); A aa(a); aa -= *b; delete b; return a;} }; template struct set_eq_arraypd_mul: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,*b)); A aa(a); aa *= *b; delete b; return a;} }; template struct set_eq_arraypd_div: public binary_function { static A f(A const & a, B const & b) {assert(SameShape(a,*b)); A aa(a); aa /= *b; delete b; return a;} }; template struct PrintP: public binary_function { static ostream* f(ostream* const & a,const A & b) { *a << *b; // a->flush();// ADD FH MAi 2010 to empty the buffer baf idea add flush of ostream //delete b; mars 2006 FH return a;} }; template struct PrintPnd: public binary_function { static ostream* f(ostream* const & a,const A & b) { *a << *b; return a;} }; template R * set_eqP(R* a,A b){ if (*a != b) delete (*a) ; ( *a =b); return a;} template R * set_eqdestroy(R* a,A b){ if (*a != b) (**a).destroy() ;// le cas debile Th=Th doit marcher // cout << " set_eqdestroy " << a << " " << b << endl; ( *a =b); return a;} template R * set_eqdestroy_incr(R* a,A b){ if(b) (*b).increment() ; if(*a) (**a).destroy() ;// le cas debile Th=Th doit marcher // cout << " set_eqdestroy " << a << " " << b << endl; ( *a =b); return a;} template R * set_copy( R* const & a,const R & b){ SHOWVERB( cout << " set_copy " << typeid(R).name() << " " << &b << endl); memcpy(a,&b,sizeof(R)); return a;} template R ** set_copy_new( R** const & a,const R * & b){ SHOWVERB( cout << " set_copy_new " << typeid(R).name() << " " << &b << endl); *a= new R(*b); return a;} template R * set_copyp( R* const & a,const R & b){ SHOWVERB( cout << " set_copy " << typeid(R).name() << " " << &b << endl); // memcpy(a,&b,sizeof(R)); *a = b; return a;} template R ** set_copyp_new( R** a,R* b){ SHOWVERB( cout << " set_copy " << typeid(R).name() << " " << &b << endl); //memcpy(a,&b,sizeof(R)); return a; FH 2007 // cerr << " set_copyp_new " << typeid(R).name() << " " << b << " " << *b ; *a = new R(*b); // cerr << " -> " << *a << endl; return a; } template R ** set_copy_incr( R** const & a, R * const & b){ *a=b; if(b) b->increment(); return a;} template R * set_init2( R* const & a,const A & b,const A & c){ SHOWVERB( cout << " set_init2 " << typeid(R).name() << " " << &b << " " << &c << endl); a->init(b,c); return a;} template R * set_init( R* const & a,const A & b){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << &b << endl); a->init(b); return a;} template R * set_initp( R* const & a,const A & b){ SHOWVERB( cout << " set_init " << typeid(R).name() << " " << &b << endl); a->init(*b); return a;} template struct Op2_add0: public binary_function { static R f(const A & a,const B & b) { return (a + b);} }; template struct Op2_build: public binary_function { static R f(const A & a,const B & b) { return R(a,b);} }; template struct Op2_pbuild: public binary_function { static R *f(const A & a,const B & b) { return new R(a,b);} }; template struct Op2_add__n: public binary_function { static R * f(const A & a,const B & b) { return new R(a + b);} }; template struct Op2_addp_n: public binary_function { static R* f(const A & a,const B & b) { return new R(*a + b);} }; template struct Op2_add_pn: public binary_function { static R* f(const A & a,const B & b) { return new R(a + *b);} }; template struct Op2_sub0: public binary_function { static R f(const A & a,const B & b) { return (a - b);} }; template struct Op1_subp: public unary_function { static R f(const A & a) { return (- *a );} }; template struct Op1_sub: public unary_function { static R f(const A & a) { return (- a );} }; template struct Op2_mulcp: public binary_function { static R f(const A & a,const B & b) { return (a * *b);} }; template struct Op2_mulc: public binary_function { static R f(const A & a,const B & b) { return (a * b);} }; template struct Op2_divc: public binary_function { static R f(const A & a,const B & b) { return (a / b);} }; template struct Op2_mulpc: public binary_function { static R f(const A & a,const B & b) { return (b * *a);} }; template struct Op2_mulpcp: public binary_function { static R f(const A & a,const B & b) { return (*a * *b);} }; template struct Op2_sub__n: public binary_function { static R * f(const A & a,const B & b) { return new R(a - b);} }; template struct Op2_subp_n: public binary_function { static R* f(const A & a,const B & b) { return new R(*a - b);} }; template struct Op2_sub_pn: public binary_function { static R* f(const A & a,const B & b) { return new R(a - *b);} }; template struct Op3_p: public ternary_function { static R* f(Stack s,const A & a,const B & b,const C & c ) { return new R(a,b,c);} }; template struct Op2_p: public binary_function { static R* f(const A & a,const B & b) { return new R(a,b);} }; template class Transpose{ public: T t; Transpose( T v) : t(v) {} template Transpose( TT v) : t(v) {} template Transpose( TT * v) : t(*v) {} operator const T & () const {return t;} }; freefem++-3.38-1/src/fflib/P1IsoValue.cpp000644 000767 000024 00000025343 12453170446 020126 0ustar00hechtstaff000000 000000 // // P1IsoValue.cpp // ff // // Created by Frédéric Hecht on 07/03/2014. // // #include #include using namespace std; #include "P1IsoValue.hpp" using namespace Fem2D; extern long verbosity; //typedef double R; inline R3 bary(const R3 K[4],R f[4],int i0,int i1,R v) { R d=f[i0]-f[i1]; assert(fabs(d)>1e-20); R l1= (f[i0] - v)/ d; // == 1 si v = f[i1] R l0 = 1. -l1; assert(l0 >=-1e-10 && l1 >= -1e-10); return K[i0]*l0 + K[i1]*l1; // == K[i1] si l1 ==1 => v = f[i1] } inline R2 bary(const R2 K[3],R f[3],int i0,int i1,R v) { R d=f[i0]-f[i1]; assert(fabs(d)>1e-20); R l1= (f[i0] - v)/ d; // == 1 si v = f[i1] R l0 = 1. -l1; assert(l0 >=-1e-10 && l1 >= -1e-10); return K[i0]*l0 + K[i1]*l1; // == K[i1] si l1 ==1 => v = f[i1] } static inline int signep4(int i0,int i1,int i2,int i3) { // calcul du signe dans la permutation int s =1; if(i0>i1) s=-s,Exchange(i0,i1); if(i1>i2) s=-s,Exchange(i1,i2); if(i2>i3) s=-s,Exchange(i2,i3); // i3 max if(i0>i1) s=-s,Exchange(i0,i1); if(i1>i2) s=-s,Exchange(i1,i2); // i2 max < i if(i0>i1) s=-s,Exchange(i0,i1); return s; } inline int signe_permutation(int i0,int i1,int i2,int i3) { int p=1; if(i0>i1) Exchange(i0,i1), p = -p; if(i0>i2) Exchange(i0,i2), p = -p; if(i0>i3) Exchange(i0,i3), p = -p; if(i1>i2) Exchange(i1,i2), p = -p; if(i1>i3) Exchange(i1,i3), p = -p; if(i2>i3) Exchange(i2,i3), p = -p; return p; } inline void pen23tet(R3 P[6],R3 Q[3][4]) { //int d1[3][4]= { {1,6,2,3}, {1,5,2,6}, {1,6,4,5}}; int d0[3][4]= { {0,5,1,2}, {0,4,1,5}, {0,5,3,4}}; /* the 6 way to spilt a pent en tet ... DATA PDD /1,0,2,3,4,5,0,6/ DATA (MU(I, 1),I=1,12) /1,6,2,3, 1,5,2,6, 1,6,4,5/ DATA (MU(I, 2),I=1,12) /1,6,2,3, 1,4,2,6, 2,6,4,5/ DATA (MU(I, 3),I=1,12) /1,4,2,3, 2,6,3,4, 2,6,4,5/ DATA (MU(I, 4),I=1,12) /1,5,2,3, 1,5,3,6, 1,6,4,5/ DATA (MU(I, 5),I=1,12) /1,5,2,3, 1,5,3,4, 3,6,4,5/ DATA (MU(I, 6),I=1,12) /1,4,2,3, 2,5,3,4, 3,6,4,5/ */ for(int k=0; k<3; ++k) for(int i=0; i<4;++i) Q[k][i]=P[d0[k][i]]; } int UnderIso(double *f,R2 Q[2][3] ,double area2[2], double eps) { const R2 *K = R2::KHat; const int p1[]= {1,2,0}; const int p2[]= {2,0,1}; R v=0; // build the negative tetra under zero iso value of f .. double fmx=f[0], fmn=f[0]; fmx = std::max(fmx,f[1]); fmn = std::min(fmn,f[1]); fmx = std::max(fmx,f[2]); fmn = std::min(fmn,f[2]); if( fmn >= v - eps) { area2[0]=1; return 0; // no intersection .. } if( fmx <= v+ eps) { area2[0]=1; return 1; }; // full triz .. int np[4],nm[4]; int km=0,kp=0; int ntria=0; for (int i=0;i<3;++i) { if(f[i]<=v+eps) nm[km++]=i; else np[kp++] = i; } if(km == 0) { area2[0]=0; return 0; } else if( km == 1) { // 1 tet j, j+1, j+2, j+3 int j0=nm[0]; int j1=p1[j0], j2=p2[j0]; Q[0][0]=K[j0]; Q[0][1]=bary(K,f,j0,j1,v); Q[0][2]=bary(K,f,j0,j2,v); ntria=1; } else if( km == 2) {// 1 prisme ntria=2; int j0 = np[0]; int j1=p1[j0], j2=p2[j0]; R2 Q1=bary(K,f,j0,j1,v); R2 Q2=bary(K,f,j0,j2,v); Q[0][0]=K[j1]; Q[0][1]=K[j2]; Q[0][2]=Q2; Q[1][0]=K[j1]; Q[1][1]=Q2; Q[1][2]=Q1; } else if( km == 3) { area2[0]=1; return 1; } // vol computation for(int k=0; k< ntria; ++k) { area2[k]=det(Q[k][0],Q[k][1],Q[k][2]); //cout <= - eps); } return ntria; } int UnderIso(double *f,R3 Q[3][4] ,double vol6[3], double eps) { const R3 *K = R3::KHat; const int p1[]= {1,2,3,0}; const int p2[]= {2,0,0,2}; const int p3[]= {3,3,1,1}; R v=0; // build the negative tetra under zero iso value of f .. double fmx=f[0], fmn=f[0]; fmx = std::max(fmx,f[1]); fmn = std::min(fmn,f[1]); fmx = std::max(fmx,f[2]); fmn = std::min(fmn,f[2]); fmx = std::max(fmx,f[3]); fmn = std::min(fmn,f[3]); if( fmn >= v - eps) { vol6[0]=1; return 0; // no intersection .. } if( fmx <= v+ eps) { vol6[0]=1; return 1; }; // full tet .. // hard case .. // count number vol6[0]=1; int np[4],nm[4]; int km=0,kp=0; int ntet=0; for (int i=0;i<4;++i) { if(f[i]<=v+eps) nm[km++]=i; else np[kp++] = i; } if(km == 0) { vol6[0]=0; return 0; } else if( km == 1) { // 1 tet j, j+1, j+2, j+3 int j0=nm[0]; int j1=p1[j0], j2=p2[j0], j3=p3[j0]; Q[0][0]=K[j0]; Q[0][1]=bary(K,f,j0,j1,v); Q[0][2]=bary(K,f,j0,j2,v); Q[0][3]=bary(K,f,j0,j3,v); ntet=1; } else if( km == 2) {// 1 prisme i0,i1, j0,j1, k0, k0 ntet=3; int i0=nm[0]; int i1=nm[1]; int k0=np[0]; int k1=np[1]; if(signe_permutation(i0,i1,k0,k1)<0) std::swap(k0,k1); R3 P[6]; P[0]=K[i0]; P[1]=bary(K,f,i0,k0,v); P[2]=bary(K,f,i0,k1,v); P[3]=K[i1]; P[4]=bary(K,f,i1,k0,v); P[5]=bary(K,f,i1,k1,v); pen23tet(P,Q); } else if( km == 3) { // prisme ntet=3; int k0=np[0]; int i1=p1[k0]; int i2=p2[k0]; int i3=p3[k0]; assert(signe_permutation(k0,i1,i2,i3)>0); R3 P[6]; P[3]=K[i1]; P[4]=K[i2]; P[5]=K[i3]; P[0]=bary(K,f,i1,k0,v); P[1]=bary(K,f,i2,k0,v); P[2]=bary(K,f,i3,k0,v); pen23tet(P,Q); } else if( km == 4) { vol6[0]=1; return 1; } // vol computation for(int k=0; k< ntet; ++k) { vol6[k]=det(Q[k][0],Q[k][1],Q[k][2],Q[k][3]); assert(vol6[k] >= - eps); if( vol6[k] 99 ) cout <0) ? 3:0;// to take one fulL face not to times ... } R v=0; int nP=0; int np[4],nm[4],nps[4],nms[4];; int km=0,kp=0,kms=0,kps=0; for (int i=0;i<4;++i) { if(f[i]<=v+eps) nm[km++]=i; if(f[i]>=v-eps) np[kp++]=i; // strict .. if(f[i]v+eps) nps[kps++]=i; } // cout << "IsoLineK: km kp "<< km << " " << kp << endl; int h=-1,b[3]; if(kps==1 && km==3) { h = nps[0]; b[0]=nvfaceTet[h][0]; b[1]=nvfaceTet[h][1]; b[2]=nvfaceTet[h][2]; } if(kms==1 && kp == 3) { h = nms[0]; b[0]=nvfaceTet[h][0]; b[2]=nvfaceTet[h][1]; b[1]=nvfaceTet[h][2]; } if(kp==2 && km==2) {// cas quad if(signep4(nm[0],nm[1],np[0],np[1]) < 0) Exchange(nm[0],nm[1]); Q[0]=bary(K,f,nm[0],np[0],v); Q[1]=bary(K,f,nm[0],np[1],v); Q[2]=bary(K,f,nm[1],np[1],v); Q[3]=bary(K,f,nm[1],np[0],v); nP=4; } else if (h>=0) { // cas triangle Q[0]=bary(K,f,h,b[0],v); Q[1]=bary(K,f,h,b[1],v); Q[2]=bary(K,f,h,b[2],v); nP=3; } return nP; } int IsoLineK(double *f,Fem2D::R2 *Q, double eps) { int debug=0; R2 P[3]={ R2(0.,0.),R2(1.,0.),R2(0.,1.)}; int kv=0,ke=0,e=3; int tv[3],te[3],vk[3],i0[3],i1[3]; for(int i=0;i<3;++i) { if( abs(f[i]) <= eps) { e -= tv[kv++]=i; vk[i]=1; } else vk[i]=0; } if(debug) cout << " ** " << kv << endl; if(kv>1) // on 2 vertex on the isoline .... { if(kv==2) { if(f[e] > 0.) { int j0=(e+1)%3; int j1=(e+2)%3; te[ke]=e+3,i0[ke]=j0,i1[ke]=j0,++ke; te[ke]=e,i0[ke]=j1,i1[ke]=j1,++ke; // pb d'unicity, need to see the adj triangle ... //return 10+e ; // edge number + 10 } else return 0; // skip edge ... } else return 0; // const funct... } else // see internal edge .. for(int ee=0;ee<3;++ee) { int j0=(ee+1)%3; int j1=(ee+2)%3; if( vk[j0]) // the intial point on iso line { if(0. < f[j1]) te[ke]=ee,i0[ke]=j0,i1[ke]=j0,++ke; else te[ke]=ee+3,i0[ke]=j0,i1[ke]=j0,++ke; } else if (vk[j1]); // skip the final point on iso line else if( f[j0] < 0. && 0. < f[j1]) // good sens te[ke]=ee,i0[ke]=j0,i1[ke]=j1,++ke; else if ( f[j0] > 0. && 0. > f[j1]) // inverse sens te[ke]=ee+3,i0[ke]=j1,i1[ke]=j0,++ke; } if( ke==2) { // the K[i1[0]] , Q[0], Q[1] must be direct ... // the K[i0[1]] , Q[0], Q[1] must be direct ... // Warning no trivail case .. make a plot to see // with is good // the first edge must be if(te[0]<3) // oriente the line { assert(te[1] >=3); std::swap(te[0],te[1]); std::swap(i0[0],i0[1]); std::swap(i1[0],i1[1]); if(debug) cout << " swap " << endl; } for(int i=0;i<2;++i) { int j0=i0[i],j1=i1[i]; if( j0== j1) Q[i] = P[j0]; else Q[i] = (P[j0]*(f[j1]) - P[j1]*(f[j0]) ) /(f[j1]-f[j0]); if(debug) cout << i << " " << j0 << " " << j1 << " : " << Q[i] << "***" << endl; } if(!vk[i1[0]]) assert( det(P[i1[0]],Q[0],Q[1]) > 0); if(!vk[i0[1]]) assert( det(P[i0[1]],Q[1],Q[0]) > 0); return 2; } // remark, the left of the line is upper . return 0; } freefem++-3.38-1/src/fflib/P1IsoValue.hpp000644 000767 000024 00000002421 12453170061 020114 0ustar00hechtstaff000000 000000 // // P1IsoValue.h // ff // // Created by Frédéric Hecht on 07/03/2014. // // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __ff__P1IsoValue__ #define __ff__P1IsoValue__ #include #include #include #include "ufunction.hpp" namespace Fem2D { #include "R3.hpp" } int IsoLineK(double *f,Fem2D::R3 *Q, double eps); int IsoLineK(double *f,Fem2D::R2 *Q, double eps); int UnderIso(double *f,Fem2D::R3 Q[3][4] ,double vol[3], double eps); int UnderIso(double *f,Fem2D::R2 Q[2][3] ,double area[2], double eps); #endif /* defined(__ff__P1IsoValue__) */ freefem++-3.38-1/src/fflib/PlotStream.hpp000644 000767 000024 00000022420 12471464470 020271 0ustar00hechtstaff000000 000000 /* * PlotStream.hpp * * Created by Frederic Hecht on 27/10/08. * Copyright 2008 UPMC. * */ #include #ifdef _WIN32 #include #endif #include "endian.hpp" //FFCS visualization stream redirection #include "ffapi.hpp" using Fem2D::Mesh; using Fem2D::Mesh3; namespace Fem2D { } class PlotStream { public: FILE * TheStream; PlotStream(FILE *Stream) :TheStream(Stream) { } operator bool() const { return TheStream;} // datatype mush be < 0 to have no collistion with arg number. // FFCS: <> enum datatype { dt_meshes=-1,dt_plots=-2,dt_endplot=-3,dt_meshes3=-10,dt_plots3=-11,dt_endarg=99999,dt_newplot=-5 }; //FFCS:need to send control data to FFCS at least once per plot void SendNewPlot() { ffapi::newplot();write((long )dt_newplot); set_binary_mode(); } void SendEndArgPlot() {write((long )dt_endarg); } //FFCS:redirect visualization stream void SendEndPlot() { write((long )dt_endplot);ffapi::ff_fflush(TheStream); set_text_mode() ;} void SendPlots() { write((long )dt_plots); } void SendMeshes() { write((long )dt_meshes);} void SendMeshes3() { write((long )dt_meshes3);} //FFCS: divert stream to FFCS void write(const void *data,size_t l) {ffapi::ff_fwrite(data,1,l,TheStream);} PlotStream& write(const bool& bb) {bool b=w_endian(bb);write(reinterpret_cast (&b),sizeof(bool));return *this;} PlotStream& write(const long long& bb) {long long b=w_endian(bb);write(reinterpret_cast (&b),sizeof(long long));return *this;} PlotStream& write(const long& bb) { // always write 8 bits for a long FH. long long ll=bb;ll=w_endian(ll);write(reinterpret_cast (&ll),sizeof(long long)); return *this;} PlotStream& write(const int& bb) {int b=w_endian(bb);write(reinterpret_cast (&b),sizeof(int));return *this;} PlotStream& write(const double& bb) {double b=w_endian(bb);write(reinterpret_cast (&b),sizeof(double));return *this;} PlotStream& write(const complex& bb) {return write(bb.real()),write(bb.imag());} PlotStream &write(const Fem2D::R1 & P) { return write(P.x);} PlotStream &write(const Fem2D::R2 & P) { return write(P.x),write(P.y);} PlotStream &write(const Fem2D::R3 & P) { return write(P.x),write(P.y),write(P.z);} PlotStream& write(const string& b) { int l=b.size(); write(l); write(b.data(),l); return *this; } void set_text_mode() { //FFCS:visualization stream redirection ffapi::wintextmode(TheStream); } void set_binary_mode() { //FFCS:visualization stream redirection ffapi::winbinmode(TheStream); } PlotStream & operator << (const bool& b) { return write(b); } PlotStream & operator << (const long& b) { return write(b); } PlotStream & operator << (const long long & b) { return write(b); } PlotStream & operator << (const int& b) { return write(b); } PlotStream & operator << (const double& b) { return write(b); } PlotStream & operator << (const complex& b) { return write(b); } PlotStream & operator << (const string& s) { return write(s); } PlotStream & operator << (const string* s) { ffassert(s); return write(*s); } template PlotStream & operator << (const KN_& b) { long n=b.N(); write(n); // cout << "PlotStream :<< n " << n << endl; for (int i=0;i (&b),sizeof(bool)); b=r_endian(b);return *this;} PlotStream& read( long long& b) {read(reinterpret_cast< void *> (&b),sizeof(long long)); b=r_endian(b);return *this;} PlotStream& read( long& b) { long long l; read(reinterpret_cast< void *> (&l),sizeof(long long)); l=r_endian(l); b=(long) l; if(( b-(long) l) !=0) { cout << " err err read long : error " << b << " != " << l << endl; assert( (b-(long) l)==0);} return *this;} PlotStream& read( int& b) {read(reinterpret_cast< void *> (&b),sizeof(int)); b=r_endian(b);return *this;} PlotStream& read( double& b) {read(reinterpret_cast< void *> (&b),sizeof(double)); b=r_endian(b);return *this;} PlotStream &read( complex &C) { double re,im; read(re); read(im); C=complex(re,im); return *this;} PlotStream &read( Fem2D::R1 & P) { return read(P.x);} PlotStream &read( Fem2D::R2 & P) { return read(P.x),read(P.y);} PlotStream &read( Fem2D::R3 & P) { return read(P.x),read(P.y),read(P.z);} PlotStream& read( string& b) { int l; read(l); b.resize(l); read(& (b[0]),l); return *this; } PlotStream & operator >> ( bool& b) { return read(b); } PlotStream & operator >> ( long& b) { return read(b); } PlotStream & operator >> ( long long& b) { return read(b); } PlotStream & operator >> ( int& b) { return read(b); } PlotStream & operator >> ( double& b) { return read(b); } PlotStream & operator >> ( complex& b) { return read(b); } PlotStream & operator >> ( string& s) { return read(s); } PlotStream & operator >> ( string *& s) { if(!s) s= new string; return read(*s); // cout << " fread string " << s <> ( Mesh *& Th) { long n; read(n); Serialize s(n,Mesh::magicmesh); read(s,n ); Th= new Mesh(s); return *this; } template PlotStream & operator >> ( KN& b) { long n; read(n); // cout << "PlotStream >> : n " << n << endl; if( ! b.N() ) b.init(n); ffassert( b.N()==n); for (int i=0;i> ( Mesh3 *& Th); PlotStream & operator >> ( Fem2D::Mesh3 *& Th) { Th= new Fem2D::Mesh3(TheStream); return *this;} PlotStream & operator >> ( Fem2D::Mesh2 *& Th) { Th= new Fem2D::Mesh2(TheStream); return *this;} // --- I also write the type .. to skip data if we need to skip data // just change >> and << by : <= and >= PlotStream & operator <= (const bool& b) { return write(1),write(b); } PlotStream & operator <= (const long& b) { return write(2),write(b); } PlotStream & operator <= (const long long & b) { return write(3),write(b); } PlotStream & operator <= (const int& b) { return write(4),write(b); } PlotStream & operator <= (const double& b) { return write(5),write(b); } PlotStream & operator <= (const string& s) { return write(6),write(s); } PlotStream & operator <= (const string* s) { return write(6),write(*s); } template PlotStream & operator <= (const KN_& b) { return write(10),write((int) sizeof(T)),operator<<(b);} PlotStream & operator >= ( bool& b) { return readc(1)>>b; } PlotStream & operator >= ( long& b) { return readc(2)>>b; } PlotStream & operator >= ( long long & b) {return readc(3)>>b; } PlotStream & operator >= ( int& b) { return readc(4)>>b; } PlotStream & operator >= ( double& b) { return readc(5)>>b; } PlotStream & operator >= ( string& s) { return readc(6)>>s; } PlotStream & operator >= ( string*& s) { return readc(6)>>s; } template PlotStream & operator >= ( KN& b) { return readc(10), readc(sizeof(T)), operator>>(b);} PlotStream & readc(int cc) { int c; read(c); assert(c==cc); return *this;} void SkipData() { int c; read(c); bool b; int i; long l,n; long long ll; string s; double d; char buf[100]; switch (c) { case 1: read(b);break; case 2: read(l);break; case 3: read(ll);break; case 4: read(i);break; case 5: read(d);break; case 6: read(s);break; case 10: read(l); assert(l>0 && l <100); read(n); for(int i=0;i using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" #include basicAC_F0::name_and_type CDomainOfIntegration::name_param[]= { { "qft", &typeid(const Fem2D::QuadratureFormular *)}, { "qfe", &typeid(const Fem2D::QuadratureFormular1d *)}, { "qforder",&typeid(long)}, { "qfnbpT",&typeid(long)}, { "qfnbpE",&typeid(long)}, { "optimize",&typeid(long)}, { "binside",&typeid(double)}, { "mortar",&typeid(bool)}, { "qfV", &typeid(const Fem2D::GQuadratureFormular *)}, { "levelset",&typeid(double)} }; basicAC_F0::name_and_type Problem::name_param[]= { { "save",&typeid(string* )}, { "cadna",&typeid(KN*)}, { "bmat",&typeid(Matrice_Creuse* )}, LIST_NAME_PARM_MAT /* { "init", &typeid(bool)}, { "solver", &typeid(TypeSolveMat*)}, { "eps", &typeid(double) }, { "precon",&typeid(Polymorphic*)}, { "dimKrylov",&typeid(long)}, { "bmat",&typeid(Matrice_Creuse* )}, { "tgv",&typeid(double )}, { "strategy",&typeid(long )}, { "save",&typeid(string* )}, { "cadna",&typeid(KN*)}, { "tolpivot", &typeid(double)}, { "tolpivotsym", &typeid(double)}, { "nbiter", &typeid(long)}, // 12 { "paramint",&typeid(KN_)}, // Add J. Morice 02/09 { "paramdouble",&typeid(KN_)}, { "paramstring",&typeid(string *)}, { "permrow",&typeid(KN_)}, { "permcol",&typeid(KN_)}, { "fileparamint",&typeid(string*)}, // Add J. Morice 02/09 { "fileparamdouble",&typeid(string*)}, { "fileparamstring",&typeid(string* )}, { "filepermrow",&typeid(string*)}, { "filepermcol",&typeid(string*)} //22 */ }; struct pair_stack_double { Stack first; double *second; pair_stack_double(Stack ss,double* bb) : first(ss),second(bb) {}; }; namespace Fem2D { void Expandsetoflab(Stack stack,const CDomainOfIntegration & di,set & setoflab,bool &all); void Expandsetoflab(Stack stack,const BC_set & bc,set & setoflab); void Check(const Opera &Op,int N,int M) { int err=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); pair jj(ll.first.first),ii(ll.first.second); if (ii.first <0 || ii.first >= M) err++; if (jj.first <0 || jj.first >= N) err++; } if (err) { cout << "Check Bilinear Operator" << N << " " << M << endl; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); pair jj(ll.first.first),ii(ll.first.second); cout << " + " << jj.first << " " << jj.second << "*" << ii.first << " " << ii.second << endl; } ExecError("Check BilinearOperator N M"); } } void Check(const BC_set * bc,int N) { int err=0; int kk=bc->bc.size(); for (int k=0;k xx=bc->bc[k]; if (xx.first >= N) { err++; cerr << " Sorry : just " << N << " componant in FE space \n" << " and Boundary condition refere to " << xx.first << "+1 componant " << endl; } } if (err) ExecError("Incompatibility beetwen boundary condition and FE space"); } void Check(const Ftest * fl,int N) { assert(fl); int err=0; Ftest::const_iterator kk= fl->v.end(),k; int ii=0; for (k=fl->v.begin();kfirst.first; if ( j >= N) { err++; cerr << " Sorry : just " << N << " componant in FE space \n" << " and linear var form refere to " << j << "+1 componant (part " << ii << ")" << endl; } } if (err) ExecError("Incompatibility beetwen linear varf and FE space"); } //--------------------------------------------------------------------------------------- template void Element_OpVF(MatriceElementairePleine & mat, const FElement3 & Ku,const FElement3 & KKu, const FElement3 & Kv,const FElement3 & KKv, double * p,int ie,int iie, int label,void *bstack,R3 *B) { ffassert(0); } template void Element_OpVF(MatriceElementairePleine & mat, const FElement & Ku,const FElement & KKu, const FElement & Kv,const FElement & KKv, double * p,int ie,int iie, int label,void *bstack,R2 *B) { ffassert(B==0); pair_stack_double * bs=static_cast(bstack); Stack stack= bs->first; double binside = *bs->second; // truc FH pour fluide de grad2 (decentrage bizard) assert(mat.onFace); // Finite Volume or discontinous Galerkine assert(ie>=0 && ie < 3); // int on edge MeshPoint mp= *MeshPointStack(stack); R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); bool same = &Ku == & Kv; assert(same); const Triangle & T = Ku.T; int nTonEdge = &Ku == &KKu ? 1 : 2; double cmean = 1./nTonEdge; throwassert(&T == &Kv.T); // const QuadratureFormular & FI = mat.FIT; const QuadratureFormular1d & FIb = mat.FIE; long npi; R *a=mat.a; R *pa=a; long i,j; long n= mat.n,m=mat.m,nx=n*m; assert(nx<=mat.lga); long N= Kv.N; long M= Ku.N; long mu=Ku.NbDoF(); long mmu=KKu.NbDoF(); long nv=Kv.NbDoF(); long nnv=Kv.NbDoF(); assert(mu==mmu && nv == nnv) ; const Opera &Op(*mat.bilinearform); bool classoptm = copt && Op.optiexpK; // if (Ku.number<1 && verbosity/100 && verbosity % 10 == 2) if (Ku.number<1 && ( verbosity > 1 ) ) cout << "Element_OpVF P: copt = " << copt << " " << classoptm << " binside (For FH) =" << binside << " opt: " << mat.optim << endl; KN Dop(last_operatortype); // sinon ca plate bizarre Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); //assert(lastop<=3); int lffv = nv*N*last_operatortype; int lffu = mu*M*last_operatortype; int loffset = same ? 0 : (nv+nnv)*N*last_operatortype; RNMK_ fv(p,nv,N,lastop); // the value for basic fonction in K RNMK_ ffv(p + lffv ,nnv,N,lastop); // the value for basic fonction in KK RNMK_ fu( (double*) fv + loffset ,mu,M,lastop); // the value for basic fonction RNMK_ ffu( (double*) fu + lffu ,mmu,M,lastop); // the value for basic fonction R2 E=T.Edge(ie); double le = sqrt((E,E)); R2 PA(TriangleHat[VerticesOfTriangularEdge[ie][0]]), PB(TriangleHat[VerticesOfTriangularEdge[ie][1]]), PC(TriangleHat[OppositeVertex[ie]]); // warning the to edge are in opposite sens R2 PP_A(TriangleHat[VerticesOfTriangularEdge[iie][1]]), PP_B(TriangleHat[VerticesOfTriangularEdge[iie][0]]), PP_C(TriangleHat[OppositeVertex[ie]]); R2 Normal(E.perp()/-le); for (npi=0;npiset(T(Pt),Pt,Kv,label, Normal,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i jj(ll.first.first),ii(ll.first.second); int iis = ii.second, jjs=jj.second; int iicase = iis / last_operatortype; int jjcase = jjs / last_operatortype; iis %= last_operatortype; jjs %= last_operatortype; double w_i=0,w_j=0,ww_i=0,ww_j=0; if(ik>=0) w_i = wi(ii.first,iis ); if(jk>=0) w_j = wj(jj.first,jjs ); if( iicase>0 && ikk>=0) ww_i = wwi(ii.first,iis ); if( jjcase>0 && jkk>=0) ww_j = wwj(jj.first,jjs ); if (iicase==Code_Jump) w_i = ww_i-w_i; // jump else if (iicase==Code_Mean) { w_i = cmean* (w_i + ww_i );} // average else if (iicase==Code_OtherSide) w_i = ww_i; // valeur de autre cote if (jjcase==Code_Jump) w_j = ww_j-w_j; // jump else if (jjcase==Code_Mean) w_j = cmean* (w_j +ww_j ); // average else if (jjcase==Code_OtherSide) w_j = ww_j; // valeur de l'autre cote // R ccc = GetAny(ll.second.eval(stack)); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization Element_OpVF2d (b) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * ccc * w_i*w_j; } } } // else pa += m; } pa=a; if ( (verbosity > 9999) ||( (verbosity > 55) && (Ku.number <=0 || KKu.number <=0 ))) { cout < void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse & A, const FormBilinear * b ) { /*FH: case ..in 2D in varf ... standard case .. */ StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; const CDomainOfIntegration & di= *b->di; const Mesh * pThdi = GetAny( (* di.Th)(stack)); if ( pThdi != &Th || &Uh.Th !=&Th || &Vh.Th !=&Th) { cout << " --Use matrix formulation ---" << endl; ExecError("No way to compute bilinear form with integrale of on mesh \n" " test or unkown function defined on an other mesh! sorry to hard. "); } SHOWVERB(cout << " FormBilinear " << endl); MatriceElementaireSymetrique *mates =0; MatriceElementairePleine *matep =0; const int useopt=di.UseOpt(stack); double binside=di.binside(stack); //const vector & what(di.what); CDomainOfIntegration::typeofkind kind = di.kind; set setoflab; bool all=true; const Mesh & ThI = Th;//* GetAny( (* di.Th)(stack)); bool sameMesh = &ThI == &Vh.Th && &ThI == &Uh.Th; // const QuadratureFormular1d & FIE = di.FIE(stack); // const QuadratureFormular & FIT = di.FIT(stack); const QuadratureFormular1d & FIEo = di.FIE(stack); const QuadratureFormular & FITo = di.FIT(stack); // const GQuadratureFormular & FIVo = di.FIV(stack); // to change the quadrature on element ... may 2014 FH .. QuadratureFormular1d FIE(FIEo,3); QuadratureFormular FIT(FITo,3); // GQuadratureFormular FIV(FIVo,3); bool VF=b->VF(); // finite Volume or discontinous Galerkin if (verbosity>2) cout << " -- discontinous Galerkin =" << VF << " size of Mat =" << A.size()<< " Bytes\n"; if (verbosity>3) { if (CDomainOfIntegration::int1d==kind) cout << " -- boundary int border ( nQP: "<< FIE.n << ") ," ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges ( nQP: "<< FIE.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIE.n << ")," ; else cout << " -- int (nQP: "<< FIT.n << " ) in " ; } //if(di.islevelset()) InternalError("So no levelset integration type on this case (6)"); if(di.islevelset() && ( (CDomainOfIntegration::int1d!=kind) && (CDomainOfIntegration::int2d!=kind) ) ) InternalError("So no levelset integration type on no int1d case (6)"); Expandsetoflab(stack,di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; }*/ if (verbosity>3) cout <<" Optimized = "<< useopt << ", "; const E_F0 * poptiexp0=b->b->optiexp0; int n_where_in_stack_opt=b->b->where_in_stack_opt.size(); R** where_in_stack =0; if (n_where_in_stack_opt && useopt) where_in_stack = new R * [n_where_in_stack_opt]; if (where_in_stack) { assert(b->b->v.size()==(size_t) n_where_in_stack_opt); for (int i=0;ib->where_in_stack_opt[i]; assert(offset>10); where_in_stack[i]= static_cast(static_cast((char*)stack+offset)); *(where_in_stack[i])=0; } if(poptiexp0) (*poptiexp0)(stack); KN ok(b->b->v.size()); { // remove the zero coef in the liste // R zero=R(); int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) ok[il] = ! (b->b->mesh_indep_stack_opt[il] && ( Fem2D::norm(*(where_in_stack[il])) < 1e-100 ) ); } BilinearOperator b_nozer(*b->b,ok); if (verbosity % 10 > 3 ) cout << " -- nb term in bilinear form (!0) : " << b_nozer.v.size() << " total " << n_where_in_stack_opt << endl; if ( (verbosity/100) % 10 >= 2) { int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) cout << il << " coef (" << l->first << ") = " << *(where_in_stack[il]) << " offset=" << b->b->where_in_stack_opt[il] << " dep mesh " << l->second.MeshIndependent() << b->b->mesh_indep_stack_opt[il] << endl; } } Stack_Ptr(stack,ElemMatPtrOffset) =where_in_stack; void *paramate=stack; pair_stack_double parammatElement_OpVF(stack,& binside); // parammatElement_OpVF.first = stack; // parammatElement_OpVF.second= & binside; if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if(VF) { if(&Uh != &Vh || sym) cout << ("To Day in bilinear form with discontinous Galerkin (2d): \n" " test or unkown function must be defined on the same FEspace, \n" " and the matrix is not symmetric. \n" " To do other case in a future (F. Hecht) dec. 2003 "); if(&Uh == &Vh) matep= new MatriceElementairePleine(Uh,VF,FIT,FIE,useopt); else matep= new MatriceElementairePleine(Uh,Vh,VF,FIT,FIE,useopt); // matep= new MatriceElementairePleine(Uh,Vh,VF,FIT,FIE); matep->faceelement = Element_OpVF; paramate= ¶mmatElement_OpVF; } else if (sym) { mates= new MatriceElementaireSymetrique(Uh,FIT,FIE,useopt); mates->element = Element_Op; } else { matep= new MatriceElementairePleine(Uh,Vh,FIT,FIE,useopt); matep->element = Element_Op; } MatriceElementaireFES & mate(*( sym? (MatriceElementaireFES *)mates : (MatriceElementaireFES *) matep)); mate.bilinearform=b->b; Check(*mate.bilinearform,mate.Uh.N,mate.Vh.N); if (di.kind == CDomainOfIntegration::int1d ) { if(di.islevelset()) { double uset = HUGE_VAL; R2 Q[3]; KN phi(Th.nv);phi=uset; double f[3]; for(int t=0; t< Th.nt;++t) { if ( all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= ThI(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&ThI,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } if( umn <=0 && umx >= 0) { int np= IsoLineK(f,Q,1e-10); if(np==2) { /* if ( sameMesh) { Element_rhs(Vh[t],*l->l,buf,stack,*B,FIE,Q[0],Q[1]); } else*/ // InternalError(" No levelSet on Diff mesh : to day int1d of Matrix"); A += mate(t,10,Th[t].lab,stack,Q); } if(sptrclean) sptrclean=sptr->clean(); } } } } else for( int e=0;eclean(); // modif FH mars 2006 clean Ptr } } } else if (di.kind == CDomainOfIntegration::intalledges) { for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) A += mate(i,ie,Th[i].lab,paramate); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (di.kind == CDomainOfIntegration::intallVFedges) { cerr << " a faire intallVFedges " << endl; ffassert(0); for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) A += mate(i,ie,Th[i].lab,paramate); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (di.kind == CDomainOfIntegration::int2d ) { if(di.islevelset()) { double uset = HUGE_VAL; R2 Q[2][3]; double vol6[2]; KN phi(Th.nv);phi=uset; double f[3]; for(int t=0; t< Th.nt;++t) { if ( all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= ThI(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&ThI,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } int nt= UnderIso(f,Q, vol6,1e-14); setQF(FIT,FITo,QuadratureFormular_T_1, Q,vol6,nt); if(FIT.n) A += mate(t,-1,Th[t].lab,stack); if(sptrclean) sptrclean=sptr->clean(); } } FIT =FITo; } else for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) A += mate(i,-1,Th[i].lab,stack); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr // AA += mate; } } else InternalError(" kind of CDomainOfIntegration unkown"); if (where_in_stack) delete [] where_in_stack; delete &mate; } // --------- FH 120105 // 3d template void AssembleBilinearForm(Stack stack,const FESpace3::Mesh & Th,const FESpace3 & Uh,const FESpace3 & Vh,bool sym, MatriceCreuse & A, const FormBilinear * b ) { /*FH: case ..in 3D in varf ... standard case .. */ typedef FESpace3 FESpace; typedef FESpace3::Mesh Mesh; typedef Mesh *pmesh ; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; const CDomainOfIntegration & di= *b->di; ffassert(di.d==3); const Mesh * pThdi = GetAny( (* di.Th)(stack)); if ( pThdi != &Th || &Uh.Th !=&Th || &Vh.Th !=&Th) { cout << " Use matrix formulation .... " << endl; ExecError("No way to compute bilinear form with integrale of on mesh \n" " test or unkown function defined on an other mesh! sorry to hard. "); } SHOWVERB(cout << " FormBilinear " << endl); MatriceElementaireSymetrique *mates =0; MatriceElementairePleine *matep =0; const int useopt=di.UseOpt(stack); double binside=di.binside(stack); //const vector & what(di.what); CDomainOfIntegration::typeofkind kind = di.kind; set setoflab; bool all=true; const QuadratureFormular1d & FIEo = di.FIE(stack); const QuadratureFormular & FITo = di.FIT(stack); const GQuadratureFormular & FIVo = di.FIV(stack); // to change the quadrature on element ... may 2014 FH .. QuadratureFormular1d FIE(FIEo,3); QuadratureFormular FIT(FITo,3); GQuadratureFormular FIV(FIVo,3); bool VF=b->VF(); // finite Volume or discontinous Galerkin if (verbosity>2) cout << " -- discontinous Galerkin =" << VF << " size of Mat =" << A.size()<< " Bytes\n"; if (verbosity>3) { if (CDomainOfIntegration::int2d==kind) cout << " -- boundary int border ( nQP: "<< FIT.n << ") ," ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges ( nQP: "<< FIT.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIE.n << ")," ; else cout << " -- int3d (nQP: "<< FIV.n << " ) in " ; if(di.islevelset()) cout << " ( int on Levelset) " << endl; } if(di.islevelset() && (CDomainOfIntegration::int2d!=kind) && (CDomainOfIntegration::int3d!=kind)) InternalError("Sorry no levelset integration type on no int[2|3]d case"); Expandsetoflab(stack,di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; }*/ if (verbosity>3) cout <<" Optimized = "<< useopt << ", "; const E_F0 * poptiexp0=b->b->optiexp0; int n_where_in_stack_opt=b->b->where_in_stack_opt.size(); R** where_in_stack =0; if (n_where_in_stack_opt && useopt) where_in_stack = new R * [n_where_in_stack_opt]; if (where_in_stack) { assert(b->b->v.size()==(size_t) n_where_in_stack_opt); for (int i=0;ib->where_in_stack_opt[i]; assert(offset>10); where_in_stack[i]= static_cast(static_cast((char*)stack+offset)); *(where_in_stack[i])=0; } if(poptiexp0) (*poptiexp0)(stack); KN ok(b->b->v.size()); { // remove the zero coef in the liste // R zero=R(); int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) ok[il] = ! (b->b->mesh_indep_stack_opt[il] && ( Fem2D::norm(*(where_in_stack[il])) < 1e-100 ) ); } BilinearOperator b_nozer(*b->b,ok); if (verbosity % 10 > 3 ) cout << " -- nb term in bilinear form (!0) : " << b_nozer.v.size() << " total " << n_where_in_stack_opt << endl; if ( (verbosity/100) % 10 >= 2) { int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) cout << il << " coef (" << l->first << ") = " << *(where_in_stack[il]) << " offset=" << b->b->where_in_stack_opt[il] << " dep mesh " << l->second.MeshIndependent() << b->b->mesh_indep_stack_opt[il] << endl; } } Stack_Ptr(stack,ElemMatPtrOffset) =where_in_stack; void *paramate=stack; pair_stack_double parammatElement_OpVF(stack, & binside); parammatElement_OpVF.first = stack; parammatElement_OpVF.second= & binside; if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if(VF) { if(&Uh != &Vh || sym) cout << ("To Day in bilinear form with discontinous Galerkin (3d): \n" " test or unkown function must be defined on the same FEspace, \n" " and the matrix is not symmetric. \n" " To do other case in a future (F. Hecht) dec. 2014 "); if(&Uh == &Vh) matep= new MatriceElementairePleine(Uh,VF,FIV,FIT,useopt); else matep= new MatriceElementairePleine(Uh,Vh,VF,FIV,FIT,useopt); matep->faceelement = Element_OpVF; paramate= ¶mmatElement_OpVF; } else if (sym) { mates= new MatriceElementaireSymetrique(Uh,FIV,FIT,useopt); mates->element = Element_Op; } else { matep= new MatriceElementairePleine(Uh,Vh,FIV,FIT,useopt); matep->element = Element_Op; } MatriceElementaireFES & mate(*( sym? (MatriceElementaireFES *)mates : (MatriceElementaireFES *) matep)); mate.bilinearform=b->b; Check(*mate.bilinearform,mate.Uh.N,mate.Vh.N); if (di.kind == CDomainOfIntegration::int2d ) { if(di.islevelset()) { if(verbosity>99) cout << " int2d on levelset in 3d " << endl; double uset = HUGE_VAL; R3 Q[4]; KN phi(Th.nv);phi=uset; double f[4]; for(int t=0; t< Th.nt;++t) { if ( all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<4;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } if( umn <=0 && umx >= 0) { int np= IsoLineK(f,Q,1e-10);// ca code ... // cout <2 ) { if( verbosity > 999 ) cout << " -- int " << np << " on: " << Q[0] << " " << Q[1] << " " << Q[2] << " " << Q[3] << endl; A += mate(t,10+np,Th[t].lab,stack,Q); } if(sptrclean) sptrclean=sptr->clean(); } }} } else for( int e=0;eclean(); // modif FH mars 2006 clean Ptr } } } else if (di.kind == CDomainOfIntegration::intallfaces ) { for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) A += mate(i,ie,Th[i].lab,paramate); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (di.kind == CDomainOfIntegration::intallVFedges) { cerr << " a faire intallVFedges " << endl; ffassert(0); for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) A += mate(i,ie,Th[i].lab,paramate); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (di.kind == CDomainOfIntegration::int3d ) { if(di.islevelset()) // may 2014 FH ... { // int3d levelset < 0 double llevelset = 0; const double uset = std::numeric_limits::max(); // cout << " uset ="< phi(Th.nv); phi=uset; double f[4]; for (int t=0;t< Th.nt; t++) { const Mesh3::Element & K(Th[t]); if ( all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=std::numeric_limits::min(),umn=std::numeric_limits::max(); for(int i=0;i<4;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; } int ntets= UnderIso(f,Q, vol6,1e-14); setQF(FIV,FIVo,QuadratureFormular_Tet_1, Q,vol6,ntets); if(FIV.n) { A += mate(t,-1,Th[t].lab,stack); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } FIV=FIVo; } else for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) A += mate(i,-1,Th[i].lab,stack); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr // AA += mate; } } else { cerr << " kind of CDomainOfIntegration unkown ?? " << di.kind << endl; InternalError(" kind of CDomainOfIntegration unkown"); } if (where_in_stack) delete [] where_in_stack; delete &mate; } // end 3d // --------- FH 170605 template void AddMatElem(map, R > & A,const Mesh & Th,const BilinearOperator & Op,bool sym,int it, int ie,int label, const FESpace & Uh,const FESpace & Vh, const QuadratureFormular & FI, const QuadratureFormular1d & FIb, double *p, void *vstack, bool intmortar=false,R2 *Q=0) { //cout << "AddMatElem" << Q << " " << ie << endl; Stack stack=pvoid2Stack(vstack); MeshPoint mp= *MeshPointStack(stack); R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Mesh & Thu(Uh.Th); const Mesh & Thv(Vh.Th); bool same = &Uh == & Vh; const Triangle & T = Th[it]; long npi; long i,j; bool classoptm = copt && Op.optiexpK; assert(Op.MaxOp() Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); //assert(lastop<=3); if (ie<0) { for (npi=0;npi100) cout << " On a pas trouver (u) " << P << " " << endl; continue;}} if(same) { tv=tu; outsidev=outsideu; Ptv=Ptu; } else { if(&Th == & Thv ) { tv =&T; Ptv=Pt; } else { tv= Thv.Find(P,Ptv,outsidev); if( !tv || outsidev) { if(verbosity>100) cout << " On a pas trouver (v) " << P << " " << endl; continue; }} } iut = Thu(tu); ivt = Thv(tv); if( verbosity>1000) cout << " T " << it << " iut " << iut << " ivt " << ivt << endl ; FElement Ku(Uh[iut]); FElement Kv(Vh[ivt]); long n= Kv.NbDoF() ,m=Ku.NbDoF(); long N= Kv.N; long M= Ku.N; RNMK_ fv(p,n,N,lastop); // the value for basic fonction RNMK_ fu(p+ (same ?0:n*N*lastop) ,m,M,lastop); // the value for basic fonction Ku.BF(Dop,Ptu,fu); MeshPointStack(stack)->set(Th,P,Pt,T,label); if (classoptm) (*Op.optiexpK)(stack); // call optim version if (!same) Kv.BF(Dop,Ptv,fv); for ( i=0; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)) ; if( verbosity>1000) cout << ig << " " << jg << " " << " " << ccc << " " << coef * ccc * w_i*w_j << " on T \n" ; double wij = w_i*w_j; if (abs(wij)>= 1e-10) A[make_pair(ig,jg)] += coef * ccc * wij; } } } } } else // int on edge ie { R2 PA,PB,E; if(Q) { PA=Q[0]; PB=Q[1]; E=T(PB)-T(PA); // cout << " AddMAtElem " << PA << " " << PB << " "<< sqrt((E,E))<< endl; } else { PA=TriangleHat[VerticesOfTriangularEdge[ie][0]]; PB=TriangleHat[VerticesOfTriangularEdge[ie][1]]; E=T.Edge(ie); } double le = sqrt((E,E)); for (npi=0;npi100) cout << " On a pas trouver (u) " << P << " " <100) cout << " On a pas trouver (v) " << P << " " << endl; continue;}} ivt = Thv(tv); } FElement Ku(Uh[iut]); FElement Kv(Vh[ivt]); long n= Kv.NbDoF() ,m=Ku.NbDoF(); long N= Kv.N; long M= Ku.N; // cout << P << " " << Pt << " " << iut << " " << ivt << " Ptu : " << Ptu << " Ptv: " << Ptv << " n:" << n << " m:" << m << endl; RNMK_ fv(p,n,N,lastop); // the value for basic fonction RNMK_ fu(p+ (same ?0:n*N*lastop) ,m,M,lastop); // the value for basic fonction Ku.BF(Dop,Ptu,fu); if( !same) Kv.BF(Dop,Ptv,fv); // int label=-999999; // a passer en argument MeshPointStack(stack)->set(Th,P,Pt,T,label,R2(E.y,-E.x)/le,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); // R ccc = GetAny(ll.second.eval(stack)); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); double wij = w_i*w_j; if (abs(wij)>= 1e-10&& (verbosity>1000)) cout << " \t\t\t" << ig << " " << jg << " " << ccc << " " << coef * ccc * w_i*w_j << " on edge \n" ; if (abs(wij)>= 1e-10) A[make_pair(ig,jg)] += wij*coef*ccc ; } } } } } *MeshPointStack(stack) = mp; } template void AddMatElem(map, R > & A,const Mesh3 & Th,const BilinearOperator & Op,bool sym,int it, int ie,int label, const FESpace3 & Uh,const FESpace3 & Vh, const Fem2D::GQuadratureFormular & FI, const QuadratureFormular & FIb, double *p, void *vstack, bool intmortar=false) { Stack stack=pvoid2Stack(vstack); MeshPoint mp= *MeshPointStack(stack); static int count =0; // non test FH ......................... if(count++ < 1) { cout << " Warning : Assemble Matrix with incompatible 3d meshes in test (FH) " << endl; cout << " ------------------------------------------------------------- " << endl; } R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Mesh3 & Thu(Uh.Th); const Mesh3 & Thv(Vh.Th); bool same = &Uh == & Vh; const Tet & T = Th[it]; long npi; long i,j; bool classoptm = copt && Op.optiexpK; assert(Op.MaxOp() pi(FI[npi]); double coef = T.mesure()*pi.a; R3 Pt(pi),Ptu,Ptv; R3 P(T(Pt)); bool outsideu,outsidev; // ici trouve le T int iut=0,ivt=0; const Tet * tu,*tv; if(&Th == & Thu ) { tu =&T; Ptu=Pt; } else { tu= Thu.Find(P,Ptu,outsideu); if( !tu || outsideu) { if(verbosity>100) cout << " On a pas trouver (u) " << P << " " << endl; continue;}} if(same) { tv=tu; outsidev=outsideu; Ptv=Ptu; } else { if(&Th == & Thv ) { tv =&T; Ptv=Pt; } else { tv= Thv.Find(P,Ptv,outsidev); if( !tv || outsidev) { if(verbosity>100) cout << " On a pas trouver (v) " << P << " " << endl; continue; }} } iut = Thu(tu); ivt = Thv(tv); if( verbosity>1000) cout << " T " << it << " iut " << iut << " ivt " << ivt << endl ; FElement3 Ku(Uh[iut]); FElement3 Kv(Vh[ivt]); long n= Kv.NbDoF() ,m=Ku.NbDoF(); long N= Kv.N; long M= Ku.N; RNMK_ fv(p,n,N,(long) lastop); // the value for basic fonction RNMK_ fu(p+ (same ?0:n*N*lastop) ,m,M,(long) lastop); // the value for basic fonction Ku.BF(Dop,Ptu,fu); MeshPointStack(stack)->set(Th,P,Pt,T,label); if (classoptm) (*Op.optiexpK)(stack); // call optim version if (!same) Kv.BF(Dop,Ptv,fv); for ( i=0; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)) ; if( verbosity>1000) cout << ig << " " << jg << " " << " " << ccc << " " << coef * ccc * w_i*w_j << " on T \n" ; double wij = w_i*w_j; if (abs(wij)>= 1e-10) A[make_pair(ig,jg)] += coef * ccc * wij; } } } } else // int on edge ie for (npi=0;npi pi( FIb[npi]); R3 NN= T.N(ie); double mes=NN.norme(); NN/=mes; double coef = 0.5*mes*pi.a; // correction 0.5 050109 FH R3 Pt(T.PBord(ie,pi)); //Ku.BF(Dop,Pt,fu); R3 Ptu,Ptv; R3 P(T(Pt)); bool outsideu,outsidev; // ici trouve le T int iut=0,ivt=0; const Tet * tu, *tv; if(&Th == & Thu ) { tu =&T; Ptu=Pt; } else { tu= Thu.Find(P,Ptu,outsideu); if( !tu || (outsideu && !intmortar) ) { //R dd=-1; //if(tu) { R2 PP((*tu)(Ptu)),PPP(P,PP) ; cout << PP << " " << sqrt( (PPP,PPP) ) <<" "; } if(verbosity>100) cout << " On a pas trouver (u) " << P << " " <100) cout << " On a pas trouver (v) " << P << " " << endl; continue;}} ivt = Thv(tv); } FElement3 Ku(Uh[iut]); FElement3 Kv(Vh[ivt]); long n= Kv.NbDoF() ,m=Ku.NbDoF(); long N= Kv.N; long M= Ku.N; // cout << P << " " << Pt << " " << iut << " " << ivt << " Ptu : " << Ptu << " Ptv: " << Ptv << " n:" << n << " m:" << m << endl; RNMK_ fv(p,n,N,lastop); // the value for basic fonction RNMK_ fu(p+ (same ?0:n*N*lastop) ,m,M,lastop); // the value for basic fonction Ku.BF(Dop,Ptu,fu); if( !same) Kv.BF(Dop,Ptv,fv); // int label=-999999; // a passer en argument MeshPointStack(stack)->set(Th,P,Pt,T,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); // R ccc = GetAny(ll.second.eval(stack)); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); double wij = w_i*w_j; if (abs(wij)>= 1e-10&& (verbosity>1000)) cout << " \t\t\t" << ig << " " << jg << " " << ccc << " " << coef * ccc * w_i*w_j << " on edge \n" ; if (abs(wij)>= 1e-10) A[make_pair(ig,jg)] += wij*coef*ccc ; } } } } *MeshPointStack(stack) = mp; } template void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, map, R > & A, const FormBilinear * b ) { /*FH: case ..in 2D in varf ... all mesh can can be different .... */ StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; // sptr->clean(); // modif FH mars 2006 clean Ptr const CDomainOfIntegration & di= *b->di; const Mesh * pThdi = GetAny( (* di.Th)(stack)); SHOWVERB(cout << " FormBilinear () " << endl); //MatriceElementaireSymetrique *mates =0; // MatriceElementairePleine *matep =0; const int useopt=di.UseOpt(stack); //double binside=di.binside(stack); const bool intmortar=di.intmortar(stack); if ( verbosity >1) { cout << " Integral on Th nv : " << Th.nv << " nt : " << Th.nt << endl; cout << " Th/ u nv : " << Uh.Th.nv << " nt : " << Uh.Th.nt << endl; cout << " Th/ v nv : " << Vh.Th.nv << " nt : " << Vh.Th.nt << endl; cout << " suppose in mortar " << intmortar << " levelset= " << di.islevelset() << endl; } assert(pThdi == & Th); //const vector & what(di.what); CDomainOfIntegration::typeofkind kind = di.kind; set setoflab; bool all=true; const QuadratureFormular1d & FIE = di.FIE(stack); const QuadratureFormular & FITo = di.FIT(stack); QuadratureFormular FIT(FITo,3); bool VF=b->VF(); // finite Volume or discontinous Galerkin if (verbosity>2) cout << " -- discontinous Galerkin =" << VF << " size of Mat =" << A.size()<< " Bytes\n"; if (verbosity>3) { if (CDomainOfIntegration::int1d==kind) cout << " -- boundary int border ( nQP: "<< FIE.n << ") ," ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges ( nQP: "<< FIE.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIE.n << ")," ; else cout << " -- int (nQP: "<< FIT.n << " ) in " ; } // if(di.islevelset()) InternalError("Sorry no levelset integration type on this case (1)"); if(di.islevelset() && (CDomainOfIntegration::int1d!=kind) && (CDomainOfIntegration::int2d!=kind) ) InternalError("Sorry no levelset integration type on no int1d case"); /* if (verbosity>3) if (CDomainOfIntegration::int1d==kind) cout << " -- boundary int border " ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges, " ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges, " ; else cout << " -- int in " ; */ Expandsetoflab(stack,di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; }*/ if (verbosity>3) cout <<" Optimized = "<< useopt << ", "; const E_F0 * poptiexp0=b->b->optiexp0; // const E_F0 & optiexpK=*b->b->optiexpK; int n_where_in_stack_opt=b->b->where_in_stack_opt.size(); R** where_in_stack =0; if (n_where_in_stack_opt && useopt) where_in_stack = new R * [n_where_in_stack_opt]; if (where_in_stack) { assert(b->b->v.size()==(size_t) n_where_in_stack_opt); for (int i=0;ib->where_in_stack_opt[i]; assert(offset>10); where_in_stack[i]= static_cast(static_cast((char*)stack+offset)); *(where_in_stack[i])=0; } if(poptiexp0) (*poptiexp0)(stack); KN ok(b->b->v.size()); { // remove the zero coef in the liste // R zero=R(); int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) ok[il] = ! (b->b->mesh_indep_stack_opt[il] && ( Fem2D::norm(*(where_in_stack[il])) < 1e-100 ) ); } BilinearOperator b_nozer(*b->b,ok); if (verbosity % 10 > 3 ) cout << " -- nb term in bilinear form (!0) : " << b_nozer.v.size() << " total " << n_where_in_stack_opt << endl; if ( (verbosity/100) % 10 >= 2) { int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) cout << il << " coef (" << l->first << ") = " << *(where_in_stack[il]) << " offset=" << b->b->where_in_stack_opt[il] << " dep mesh " << l->second.MeshIndependent() << b->b->mesh_indep_stack_opt[il] << endl; } } Stack_Ptr(stack,ElemMatPtrOffset) =where_in_stack; KN p(Vh.esize()+ Uh.esize() ); if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if (di.kind == CDomainOfIntegration::int1d ) { if(di.islevelset()) { double uset = HUGE_VAL; R2 Q[2]; double vol6[2]; KN phi(Th.nv);phi=uset; double f[3], ll=0; for(int t=0; t< Th.nt;++t) { if ( all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } int ntp= IsoLineK(f,Q,1e-10); if(verbosity>999 && ntp==2) { const Triangle &T = Th[t]; R2 E(T(Q[0]),T(Q[1])); double le=sqrt((E,E)); ll += le; cout << "\t\t" << ntp <<" : " << Q[0] << " " << Q[1] << " ; " << f[0] << " " << f[1] << " " << f[2] << " " << le << " / " << ll<b,sym,t,10,Th[t].lab,Uh,Vh,FIT,FIE,p,stack,intmortar,Q); if(sptrclean) sptrclean=sptr->clean(); } } } FIT =FITo; } else { for( int e=0;eb,sym,i,ie,Th.bedges[e].lab,Uh,Vh,FIT,FIE,p,stack,intmortar); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } }} else if (di.kind == CDomainOfIntegration::intalledges) { cerr << " Sorry no implement to hard "<< endl; ExecError("FH: no intalledges on diff mesh ???"); ffassert(0); // a faire for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) AddMatElem(A,Th,*b->b,sym,i,ie,Th[i].lab,Uh,Vh,FIT,FIE,p,stack,intmortar); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (di.kind == CDomainOfIntegration::intallVFedges) { cerr << " a faire intallVFedges " << endl; ffassert(0); } else if (di.kind == CDomainOfIntegration::int2d ) { // cerr << " a faire CDomainOfIntegration::int2d " << endl; if(di.islevelset()) { double uset = HUGE_VAL; R2 Q[2][3]; double vol6[2]; KN phi(Th.nv);phi=uset; double f[3]; for(int t=0; t< Th.nt;++t) { if ( all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } int nt= UnderIso(f,Q, vol6,1e-14); setQF(FIT,FITo,QuadratureFormular_T_1, Q,vol6,nt); if(FIT.n) AddMatElem(A,Th,*b->b,sym,t,-1,Th[t].lab,Uh,Vh,FIT,FIE,p,stack); if(sptrclean) sptrclean=sptr->clean(); } } FIT =FITo; } else { for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) AddMatElem(A,Th,*b->b,sym,i,-1,Th[i].lab,Uh,Vh,FIT,FIE,p,stack); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } }} else InternalError(" kind of CDomainOfIntegration unkown"); if (where_in_stack) delete [] where_in_stack; } template void AssembleBilinearForm(Stack stack,const Mesh3 & Th,const FESpace3 & Uh,const FESpace3 & Vh,bool sym, map, R > & A, const FormBilinear * b ) { /*FH: case ..in 3D in varf ... all mesh can can be different .... */ StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; // sptr->clean(); // modif FH mars 2006 clean Ptr const CDomainOfIntegration & di= *b->di; const Mesh3 * pThdi = GetAny( (* di.Th)(stack)); SHOWVERB(cout << " FormBilinear () " << endl); //MatriceElementaireSymetrique *mates =0; // MatriceElementairePleine *matep =0; const int useopt=di.UseOpt(stack); //double binside=di.binside(stack); const bool intmortar=di.intmortar(stack); if ( verbosity >1) { cout << " Integral on Th nv : " << Th.nv << " nt : " << Th.nt << endl; cout << " Th/ u nv : " << Uh.Th.nv << " nt : " << Uh.Th.nt << endl; cout << " Th/ v nv : " << Vh.Th.nv << " nt : " << Vh.Th.nt << endl; cout << " suppose in mortar " << intmortar << endl; } assert(pThdi == & Th); //const vector & what(di.what); CDomainOfIntegration::typeofkind kind = di.kind; set setoflab; bool all=true; // const QuadratureFormular1d & FIEo = di.FIE(stack); const QuadratureFormular & FITo = di.FIT(stack); const GQuadratureFormular & FIVo = di.FIV(stack); // to change the quadrature on element ... may 2014 FH .. // QuadratureFormular1d FIE(FIEo,3); QuadratureFormular FIT(FITo,3); GQuadratureFormular FIV(FIVo,3); // const QuadratureFormular & FIT = di.FIT(stack); // const Fem2D::GQuadratureFormular & FIV = di.FIV(stack); bool VF=b->VF(); // finite Volume or discontinous Galerkin if (verbosity>2) cout << " -- discontinous Galerkin =" << VF << " size of Mat =" << A.size()<< " Bytes\n"; if (verbosity>3) { if (CDomainOfIntegration::int2d==kind) cout << " -- boundary int border ( nQP: "<< FIT.n << ") ," ; else if (CDomainOfIntegration::intallfaces==kind) cout << " -- boundary int all edges ( nQP: "<< FIT.n << ")," ; //else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIT.n << ")," ; else cout << " -- int (nQP: "<< FIV.n << " ) in " ; } if(di.islevelset()) InternalError("Sorry no levelset integration type on this case (2)"); if(di.islevelset() && (CDomainOfIntegration::int2d!=kind) && (CDomainOfIntegration::int3d!=kind) ) InternalError("Sorry no levelset integration type on no int2d case"); Expandsetoflab(stack,di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; }*/ if (verbosity>3) cout <<" Optimized = "<< useopt << ", "; const E_F0 *poptiexp0=b->b->optiexp0; // const E_F0 & optiexpK=*b->b->optiexpK; int n_where_in_stack_opt=b->b->where_in_stack_opt.size(); R** where_in_stack =0; if (n_where_in_stack_opt && useopt) where_in_stack = new R * [n_where_in_stack_opt]; if (where_in_stack) { assert(b->b->v.size()==(size_t) n_where_in_stack_opt); for (int i=0;ib->where_in_stack_opt[i]; assert(offset>10); where_in_stack[i]= static_cast(static_cast((char*)stack+offset)); *(where_in_stack[i])=0; } if(poptiexp0) (*poptiexp0)(stack); KN ok(b->b->v.size()); { // remove the zero coef in the liste // R zero=R(); int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) ok[il] = ! (b->b->mesh_indep_stack_opt[il] && ( Fem2D::norm(*(where_in_stack[il])) < 1e-100 ) ); } BilinearOperator b_nozer(*b->b,ok); if (verbosity % 10 > 3 ) cout << " -- nb term in bilinear form (!0) : " << b_nozer.v.size() << " total " << n_where_in_stack_opt << endl; if ( (verbosity/100) % 10 >= 2) { int il=0; for (BilinearOperator::const_iterator l=b->b->v.begin();l!=b->b->v.end();l++,il++) cout << il << " coef (" << l->first << ") = " << *(where_in_stack[il]) << " offset=" << b->b->where_in_stack_opt[il] << " dep mesh " << l->second.MeshIndependent() << b->b->mesh_indep_stack_opt[il] << endl; } } Stack_Ptr(stack,ElemMatPtrOffset) =where_in_stack; KN p(Vh.esize()+ Uh.esize() ); if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if (di.kind == CDomainOfIntegration::int2d ) { for( int e=0;eb,sym,i,ie,Th.be(e).lab,Uh,Vh,FIV,FIT,p,stack,intmortar); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } else if (di.kind == CDomainOfIntegration::intallfaces) { ffassert(0); // a faire for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) AddMatElem(A,Th,*b->b,sym,i,ie,Th[i].lab,Uh,Vh,FIV,FIT,p,stack,intmortar); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } /* else if (di.kind == CDomainOfIntegration::intallVFedges) { cerr << " a faire intallVFedges " << endl; ffassert(0); } */ else if (di.kind == CDomainOfIntegration::int3d ) { if(di.islevelset()) // may 2014 FH ... { // int3d levelset < 0 double llevelset = 0; const double uset = std::numeric_limits::max(); // cout << " uset ="< phi(Th.nv); phi=uset; double f[4]; for (int t=0;t< Th.nt; t++) { const Mesh3::Element & K(Th[t]); if (all || setoflab.find(Th[t].lab) != setoflab.end()) { double umx=std::numeric_limits::min(),umn=std::numeric_limits::max(); for(int i=0;i<4;++i) { int j= Th(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&Th,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; } int ntets= UnderIso(f,Q, vol6,1e-14); setQF(FIV,FIVo,QuadratureFormular_Tet_1, Q,vol6,ntets); if(FIV.n) { AddMatElem(A,Th,*b->b,sym,t,-1,Th[t].lab,Uh,Vh,FIV,FIT,p,stack); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } FIV = FIVo; } else { // cerr << " a faire CDomainOfIntegration::int3d " << endl; for (int i=0;i< Th.nt; i++) { if ( all || setoflab.find(Th[i].lab) != setoflab.end()) AddMatElem(A,Th,*b->b,sym,i,-1,Th[i].lab,Uh,Vh,FIV,FIT,p,stack); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } else InternalError(" kind of CDomainOfIntegration unkown"); if (where_in_stack) delete [] where_in_stack; } // --------- FH 170605 template void Element_Op(MatriceElementairePleine & mat,const FElement3 & Ku,const FElement3 & Kv,double * p,int ie,int label,void *vstack,R3 *B) { // ffassert(B==0); Stack stack=pvoid2Stack(vstack); // ffassert(0); typedef FElement3::Element Element; MeshPoint mp= *MeshPointStack(stack); R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); bool same = &Ku == & Kv; const Element & T = Ku.T; throwassert(&T == &Kv.T); const GQuadratureFormular & FI = mat.FIT; const GQuadratureFormular & FIb = mat.FIE; long npi; R *a=mat.a; R *pa=a; long i,j; long n= mat.n,m=mat.m,nx=n*m; long N= Kv.N; long M= Ku.N; const Opera &Op(*mat.bilinearform); bool classoptm = copt && Op.optiexpK; bool oldopt=1; // juin 2007 FH ???? a voir int iloop=0; KN unvarexp(classoptm ? Op.optiexpK->sizevar() : 1); if (Ku.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_Op 3d P: copt = " << copt << " " << classoptm << " opt: " << mat.optim << endl; assert(Op.MaxOp() Dop(last_operatortype); //p.DiffOp(Dop); //int lastop=1+Dop.last(binder1st >(equal_to(),true)); //assert(lastop<=3); RNMK_ fv(p,n,N,lastop); // the value for basic fonction RNMK_ fu(p+ (same ?0:n*N*lastop) ,m,M,lastop); // the value for basic fonction for (i=0;i< nx;i++) *pa++ = 0.; if (ie<0) for (npi=0;npi pi(FI[npi]); R coef = T.mesure()*pi.a; R3 Pt(pi); pa =a; Ku.BF(Dop,Pt,fu); MeshPointStack(stack)->set(T(Pt),Pt,Kv); if (classoptm) { if( oldopt) (*Op.optiexpK)(stack); // call old optim version else Op.optiexpK->eval(stack,iloop++,unvarexp); // new optim version } if (!same) Kv.BF(Dop,Pt,fv); int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); //cout << *(copt[il]) << " == " << cc << endl; if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization Element_Op plein 3d (a) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } int fi=Kv.dfcbegin(icomp); int li=Kv.dfcend(icomp); int fj=Ku.dfcbegin(jcomp); int lj=Ku.dfcend(jcomp); ccc *= coef; // attention la fonction test donne la ligne // et la fonction test est en second for ( i=fi; i999) cout << " Ass mat pleine /"<< np << endl; assert( np==3 || np==4); // XXXXXXX double epsmes3=T.mesure()*T.mesure()*1e-18; R3 PP[4]; double l[3]; for(int i=0; i< np; ++i) PP[i]= T(B[i]); for( int i =0; i+1 < np; i+=2) { // 0,1,, a and 2,3,0. int i0=i,i1=i+1,i2=(i+2)%np; R3 NN= R3(PP[i0],PP[i1])^R3(PP[i0],PP[i2]); double mes2 = (NN,NN); double mes = sqrt(mes2); if(mes2*mes 999) cout << " --int on leveset3d " << np << " " << mes << " " << i0< pi( FIb[npi]); // cout << " %% " << npi << " " << pi.a << " " << pi.x << " " << pi.y << endl; asum+= pi.a; pi.toBary(l); R3 Pt( l[0]*B[i0]+l[1]*B[i1]+l[2]*B[i2]); // double coef = mes*pi.a; // correction 0.5 050109 FH Ku.BF(Dop,Pt,fu); if (!same) Kv.BF(Dop,Pt,fv); MeshPointStack(stack)->set(T(Pt),Pt,Ku,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version pa=a; for (int i=0; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization Element_Op plein 3d (b) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } if(verbosity>999) cout << " -- int on leveset3d aij = "<< pi.a* ccc * w_i*w_j <<" " << ccc << " " << w_i*w_j <999) cout << " ++\n"; } if(verbosity>999) cout << " @@ "<< asum << endl;; } }// end int level set ... else // int on edge ie for (npi=0;npi pi( FIb[npi]); R3 NN= T.N(ie); double mes=NN.norme(); NN/=mes; double coef = 0.5*mes*pi.a; // correction 0.5 050109 FH R3 Pt(T.PBord(ie,pi)); Ku.BF(Dop,Pt,fu); if (!same) Kv.BF(Dop,Pt,fv); MeshPointStack(stack)->set(T(Pt),Pt,Ku,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization Element_Op plein 3d (c) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * ccc * w_i*w_j; } } } } if (Ku.Vh.Th(T) <1 && verbosity>100) { pa=mat.a; cout < void Element_Op(MatriceElementairePleine & mat,const FElement & Ku,const FElement & Kv,double * p,int ie,int label,void *vstack,R2 *B) { Stack stack=pvoid2Stack(vstack); typedef FElement::Element Element; MeshPoint mp= *MeshPointStack(stack); R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); bool same = &Ku == & Kv; const Element & T = Ku.T; throwassert(&T == &Kv.T); const QuadratureFormular & FI = mat.FIT; const QuadratureFormular1d & FIb = mat.FIE; long npi; R *a=mat.a; R *pa=a; long i,j; long n= mat.n,m=mat.m,nx=n*m; long N= Kv.N; long M= Ku.N; const Opera &Op(*mat.bilinearform); bool classoptm = copt && Op.optiexpK; bool oldopt=1; // juin 2007 FH ???? a voir int iloop=0; KN unvarexp(classoptm ? Op.optiexpK->sizevar() : 1); if (Ku.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_Op P: copt = " << copt << " " << classoptm << " opt: " << mat.optim << endl; assert(Op.MaxOp() Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); //assert(lastop<=3); RNMK_ fv(p,n,N,lastop); // the value for basic fonction RNMK_ fu(p+ (same ?0:n*N*lastop) ,m,M,lastop); // the value for basic fonction for (i=0;i< nx;i++) *pa++ = 0.; if (ie<0 )//&& B==0) for (npi=0;npix : T.area; R coef = mes *pi.a; R2 Pt(pi); pa =a; Ku.BF(Dop,Pt,fu); MeshPointStack(stack)->set(T(Pt),Pt,Kv); if (classoptm) { if( oldopt) (*Op.optiexpK)(stack); // call old optim version else Op.optiexpK->eval(stack,iloop++,unvarexp); // new optim version } if (!same) Kv.BF(Dop,Pt,fv); int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); //cout << *(copt[il]) << " == " << cc << endl; if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (e) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } int fi=Kv.dfcbegin(icomp); int li=Kv.dfcend(icomp); int fj=Ku.dfcbegin(jcomp); int lj=Ku.dfcend(jcomp); fi=0,fj=0; li=n,lj=m; ccc *= coef; // attention la fonction test donne la ligne // et la fonction test est en second for ( i=fi; i 1e-15) // bofbof ???? for (npi=0;npiset(T(Pt),Pt,Kv,-1,R2(E.y,-E.x)/le,-1); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); //cout << *(copt[il]) << " == " << cc << endl; if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (f) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } int fi=Kv.dfcbegin(icomp); int li=Kv.dfcend(icomp); int fj=Ku.dfcbegin(jcomp); int lj=Ku.dfcend(jcomp); ccc *= coef; // attention la fonction test donne la ligne // et la fonction test est en second for ( i=fi; iset(T(Pt),Pt,Kv,label,R2(E.y,-E.x)/le,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); //cout << *(copt[il]) << " == " << cc << endl; if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (g) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } int fi=Kv.dfcbegin(icomp); int li=Kv.dfcend(icomp); int fj=Ku.dfcbegin(jcomp); int lj=Ku.dfcend(jcomp); ccc *= coef; // attention la fonction test donne la ligne // et la fonction test est en second for ( i=fi; i jj(ll.first.first),ii(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); // R ccc = GetAny(ll.second.eval(stack)); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && ( mat.optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (h) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * ccc * w_i*w_j; } } } // else pa += m; FH dec 2003 */ } /* pa=a; if (Ku.Vh.Th(T) >=0 ) { cout < void Element_Op(MatriceElementaireSymetrique & mat,const FElement3 & Ku,double * p,int ie,int label, void * vstack,R3 *B) { // ffassert(B==0); Stack stack=pvoid2Stack(vstack); typedef FESpace3 FESpace; typedef typename FESpace3::Mesh Mesh; typedef Mesh *pmesh ; typedef typename Mesh::Element Element; MeshPoint mp= *MeshPointStack(stack); R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Element & T = Ku.T; const GQuadratureFormular & FI = mat.FIT; const GQuadratureFormular & FIb = mat.FIE; long npi; R *a=mat.a; R *pa=a; long i,j; long n= mat.n,m=mat.m,nx=n*(m+1)/2; long N= Ku.N; assert(mat.bilinearform); const Opera &Op(*mat.bilinearform); bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) || (Op.where_in_stack_opt.size() !=0) ); int lastop; What_d Dop = Op.DiffOp(lastop); if (Ku.number<1 && verbosity/100 && verbosity % 10 == 2 ) cout << "Element_Op S 3d: copt = " << copt << " " << classoptm << " lastop = "<< lastop << " Dop " << Dop << " opt: " << mat.optim << endl; assert(Op.MaxOp() pi(FI[npi]); double coef = T.mesure()*pi.a; //R3 Pt(pi); pa =a; Ku.BF(Dop,pi,fu); MeshPointStack(stack)->set(T(pi),pi,Ku); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R c = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); // cout << *(copt[il]) << " == " << cc << endl; if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (i) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } c *= coef ; long fi=Ku.dfcbegin(icomp); long li=Ku.dfcend(icomp); long fj=Ku.dfcbegin(jcomp); long lj=Ku.dfcend(jcomp); for ( i=fi; i999) cout << " Ass mat pleine /"<< np << endl; assert( np==3 || np==4); // XXXXXXX double epsmes3=T.mesure()*T.mesure()*1e-18; R3 PP[4]; double l[3]; for(int i=0; i< np; ++i) PP[i]= T(B[i]); for( int i =0; i+1 < np; i+=2) { // 0,1,, a and 2,3,0. int i0=i,i1=i+1,i2=(i+2)%np; R3 NN= R3(PP[i0],PP[i1])^R3(PP[i0],PP[i2]); double mes2 = (NN,NN); double mes = sqrt(mes2); if(mes2*mes 999) cout << " --int on leveset3d " << np << " " << mes << " " << i0< pi( FIb[npi]); // cout << " %% " << npi << " " << pi.a << " " << pi.x << " " << pi.y << endl; asum+= pi.a; pi.toBary(l); R3 Pt( l[0]*B[i0]+l[1]*B[i1]+l[2]*B[i2]); // double coef = mes*pi.a; // correction 0.5 050109 FH Ku.BF(Dop,Pt,fu); MeshPointStack(stack)->set(T(Pt),Pt,Ku,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version pa=a; int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R c = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); // cout << *(copt[il]) << " == " << cc << endl; if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (j) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } c *= coef ; long fi=Ku.dfcbegin(icomp); long li=Ku.dfcend(icomp); long fj=Ku.dfcbegin(jcomp); long lj=Ku.dfcend(jcomp); for (long i=fi; i pi( FIb[npi]); R3 NN= T.N(ie); double mes=NN.norme(); NN/=mes; mes *=0.5; double coef = mes*pi.a; // correction 0.5 050109 FH R3 Pt(T.PBord(ie,pi)); Ku.BF(Dop,Pt,fu); // int label=-999999; // a passer en argument MeshPointStack(stack)->set(T(Pt),Pt,Ku,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R c = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); // cout << *(copt[il]) << " == " << cc << endl; if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (k) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } c *= coef ; long fi=Ku.dfcbegin(icomp); long li=Ku.dfcend(icomp); long fj=Ku.dfcbegin(jcomp); long lj=Ku.dfcend(jcomp); for (long i=fi; i100) { cout < Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); // assert(lastop<=3); RNMK_ fu(p,n,N,lastop); // the value for basic fonction pa =a; for (i=0;i< nx;i++) *pa++ = 0.; if (ie<0) for (npi=0;npix :T.area; double coef = mes*pi.a; R2 Pt(pi); pa =a; Ku.BF(Dop,Pt,fu); MeshPointStack(stack)->set(T(pi),pi,Ku); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R c = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); // cout << *(copt[il]) << " == " << cc << endl; if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (l) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } c *= coef ; long fi=Ku.dfcbegin(icomp); long li=Ku.dfcend(icomp); long fj=Ku.dfcbegin(jcomp); long lj=Ku.dfcend(jcomp); if (verbosity>10 && Ku.Vh.Th(T) < 1 && npi < 1) cout << " ic "<< icomp << fi<< " "<< lj << " "<< " c "<< jcomp << " " < "; cerr << "Sorry error in Optimization (m) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * c * w_i*w_j; } } }*/ } else if(B) { R2 PA(B[0]),PB(B[0]); R2 A=T(PA),B=T(PB); R2 E(A,B); double le = sqrt((E,E)); if(le > 1e-15) for (npi=0;npiset(T(Pt),Pt,Ku,0,R2(E.y,-E.x)/le,0); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R c = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); // cout << *(copt[il]) << " == " << cc << endl; if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (n) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } c *= coef ; long fi=Ku.dfcbegin(icomp); long li=Ku.dfcend(icomp); long fj=Ku.dfcbegin(jcomp); long lj=Ku.dfcend(jcomp); for ( i=fi; iset(T(Pt),Pt,Ku,label,R2(E.y,-E.x)/le,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version int il=0; for (BilinearOperator::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { // attention la fonction test donne la ligne // et la fonction test est en second BilinearOperator::K ll(*l); // pair jj(ll.first.first),ii(ll.first.second); long jcomp= ll.first.first.first,jop=ll.first.first.second; long icomp= ll.first.second.first,iop=ll.first.second.second; R c = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); // cout << *(copt[il]) << " == " << cc << endl; if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (o) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } c *= coef ; long fi=Ku.dfcbegin(icomp); long li=Ku.dfcend(icomp); long fj=Ku.dfcbegin(jcomp); long lj=Ku.dfcend(jcomp); for ( i=fi; i ii(ll.first.first),jj(ll.first.second); double w_i = wi(ii.first,ii.second); double w_j = wj(jj.first,jj.second); // R ccc = GetAny(ll.second.eval(stack)); R ccc = copt ? *(copt[il]): GetAny(ll.second.eval(stack)); if ( copt && Ku.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << ccc << " != " << cc << ", xy = "<< T(Pt) << " => "; cerr << "Sorry error in Optimization (d) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * ccc * w_i*w_j; } } } //else pa+= i+1; */ } /* pa=a; if (Ku.Vh.Th(T) <=0 ) { cout < Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); assert(Op.MaxOp() set(T(Pt),Pt,Kv); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); //copt=0; R c = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); //GetAny(ll.second.eval(stack)); if ( copt && ( optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization add: (p) int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //if (Kv.number<5) cout << il<< " " << i << " c== " << c << endl; R a = coef * c * w_i; B[Kv(i)] += a; } } } *MeshPointStack(stack) = mp; } // 3D template void Element_rhs(const FElement3 & Kv,const LOperaD &Op,double * p,void * vstack,KN_ & B, const GQuadratureFormular & FI = QuadratureFormular_Tet_2,int optim=1) { Stack stack=pvoid2Stack(vstack); typedef FElement3::Element Element; MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Element & T = Kv.T; // const QuadratureFormular & FI = QuadratureFormular_T_2; // const QuadratureFormular & FI = QuadratureFormular_T_2; long npi; long i,n=Kv.NbDoF(),N=Kv.N; bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (Kv.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs S0: copt = " << copt << " " << classoptm << " opt: " << optim << endl; int lastop; What_d Dop = Op.DiffOp(lastop); assert(Op.MaxOp() pi(FI[npi]); double coef = T.mesure()*pi.a; R3 Pt(pi); Kv.BF(Dop,Pt,fu); MeshPointStack(stack)->set(T(Pt),Pt,Kv); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); //copt=0; R c = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); //GetAny(ll.second.eval(stack)); if ( copt && ( optim==1) && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (q) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //if (Kv.number<5) cout << il<< " " << i << " c== " << c << endl; R a = coef * c * w_i; B[Kv(i)] += a; } } } *MeshPointStack(stack) = mp; } // fin 3d // #pragma optimization_level 0 // 3d template void Element_rhs(const Mesh3 & ThI,const Mesh3::Element & KI, const FESpace3 & Vh,const LOperaD &Op,double * p,void * vstack,KN_ & B, const GQuadratureFormular & FI,int optim) { Stack stack=pvoid2Stack(vstack); // AFAIRE("Element_rhs 3d diff meshes"); static int count=0; if(count++<1) { cout << "Warning: Element_rhs 3 3d diff meshes in test (FH) " << endl; cout << "--------------------------------------------------- " << endl; } MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); // int maxd = Op.MaxOp(); // assert(maxd pi(FI[npi]); R3 PI(KI(pi)); double coef = KI.mesure()*pi.a; MeshPointStack(stack)->set(ThI,PI,pi,KI,KI.lab); if (classoptm) (*Op.optiexpK)(stack); // call optim version bool outside; R3 Pt; const Tet & K = *Vh.Th.Find(PI,Pt,outside,Kp); if ( ! outside) { const FElement3 Kv= Vh[K]; long i,n=Kv.NbDoF(),N=Kv.N; RNMK_ fu(p,n,N,lastop); // the value for basic fonction Kv.BF(Dop,Pt,fu); for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c = copt ? *(copt[il]) : GetAny(ll.second.eval(stack));;//GetAny(ll.second.eval(stack)); if ( copt && ThI(KI) <1 && optim==1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (r) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } R a = coef * c * w_i; B[Kv(i)] += a; } } } Kp = & K; } *MeshPointStack(stack) = mp; } // template void Element_rhs(const Mesh & ThI,const Triangle & KI, const FESpace & Vh,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular & FI = QuadratureFormular_T_2,int optim=1) { Stack stack=pvoid2Stack(vstack); MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); // int maxd = Op.MaxOp(); // assert(maxd Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); assert(Op.MaxOp() set(ThI,PI,pi,KI,KI.lab); if (classoptm) (*Op.optiexpK)(stack); // call optim version bool outside; R2 Pt; const Triangle & K = *Vh.Th.Find(PI,Pt,outside,Kp); if ( ! outside) { const FElement Kv= Vh[K]; long i,n=Kv.NbDoF(),N=Kv.N; RNMK_ fu(p,n,N,lastop); // the value for basic fonction Kv.BF(Dop,Pt,fu); for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c = copt ? *(copt[il]) : GetAny(ll.second.eval(stack));;//GetAny(ll.second.eval(stack)); if ( copt && ThI(KI) <1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization (s) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } R a = coef * c * w_i; B[Kv(i)] += a; } } } Kp = & K; } *MeshPointStack(stack) = mp; } // 3d template void Element_rhs(const FElement3 & Kv,int ie,int label,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular & FI ,bool alledges=false,int optim=1) { // AFAIRE("Element_rhs on border"); Stack stack=pvoid2Stack(vstack); typedef FElement3::Element Element; MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Element & T = Kv.T; long npi; long i,n=Kv.NbDoF(),N=Kv.N; bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (Kv.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs 3d S: copt = " << copt << " " << classoptm <<" opt " << optim << endl; int lastop; What_d Dop = Op.DiffOp(lastop); assert(Op.MaxOp() pi( FI[npi]); R3 NN=T.N(ie); double le= NN.norme(); NN /= le; double coef = le*pi.a*0.5;// correction 050109 FH R3 Pt(T.PBord(ie,pi)); // Kv.BF(Dop,Pt,fu); MeshPointStack(stack)->set(T(Pt),Pt,Kv,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (t) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); B[Kv(i)] += coef * c * w_i; } } } *MeshPointStack(stack) = mp; } // 3d isoline ... levelset ... template void Element_rhs(const FElement3 & Kv,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular & FI ,int np, R3 *Q,int optim) { // AFAIRE("Element_rhs on border"); Stack stack=pvoid2Stack(vstack); typedef FElement3::Element Element; MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Element & K = Kv.T; const Mesh3 & Th= Kv.Vh.Th; double epsmes3=K.mesure()*K.mesure()*1e-18; long npi; long n=Kv.NbDoF(),N=Kv.N; double l[3]; bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (Kv.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs 3d S(levelset): copt = " << copt << " " << classoptm << " opt " << optim << endl; int lastop; What_d Dop = Op.DiffOp(lastop); assert(Op.MaxOp() pi( FI[npi]); pi.toBary(l); R3 Pt( l[0]*Q[i0]+l[1]*Q[i1]+l[2]*Q[i2]); // MeshPointStack(stack)->set(Th,K(Pt),Pt,K,-1,NN,-1); // Kv.BF(Dop,Pt,fu); // MeshPointStack(stack)->set(K(Pt),Pt,Kv,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version double coef = mes*pi.a; for (int i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (u) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); B[Kv(i)] += coef * c * w_i; } } } } *MeshPointStack(stack) = mp; } // end 3d template void Element_rhs(const FElement & Kv,int ie,int label,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular1d & FI = QF_GaussLegendre2,bool alledges=false,int optim=1) { Stack stack=pvoid2Stack(vstack); MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Triangle & T = Kv.T; // const QuadratureFormular1d & FI = QF_GaussLegendre2; long npi; long i,n=Kv.NbDoF(),N=Kv.N; // bool show = Kv.Vh.Th(T)==0; // char * xxx[] ={" u"," v,"," p"," q"," r"}; // char * xxxx[] ={" u'"," v',"," p'"," q'"," r'"}; // char * yyy[] ={" ","_x ","_y "}; bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (Kv.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs S: copt = " << copt << " " << classoptm << "opt " << optim << endl; KN Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); assert(Op.MaxOp() set(T(Pt),Pt,Kv,label,R2(E.y,-E.x)/le,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (v) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); B[Kv(i)] += coef * c * w_i; } } } *MeshPointStack(stack) = mp; } template void Element_rhs(const FElement & Kv,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular1d & FI ,const R2 & PPA,const R2 &PPB,int optim) { Stack stack=pvoid2Stack(vstack); MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Triangle & T = Kv.T; R2 PA=T(PPA),PB=T(PPB); // const QuadratureFormular1d & FI = QF_GaussLegendre2; long npi; long i,n=Kv.NbDoF(),N=Kv.N; // bool show = Kv.Vh.Th(T)==0; // char * xxx[] ={" u"," v,"," p"," q"," r"}; // char * xxxx[] ={" u'"," v',"," p'"," q'"," r'"}; // char * yyy[] ={" ","_x ","_y "}; bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (Kv.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs(levelset) S: copt = " << copt << " " << classoptm <<" opt " << optim << endl; KN Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); assert(Op.MaxOp() set(T(Pt),Pt,Kv,0,R2(E.y,-E.x)/le,0); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (w) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); B[Kv(i)] += coef * c * w_i; } } } *MeshPointStack(stack) = mp; } template void Element_rhsVF(const FElement & Kv,const FElement & KKv,int ie,int iie,int label,const LOperaD &Op,double * p,int *ip,void * bstack,KN_ & B, const QuadratureFormular1d & FI = QF_GaussLegendre2,int optim=1) // sier of ip // version correct the 29 april 2015 by. FH // missing before in case of jump, mean , .. in test functions // Thank to Lucas Franceschini { pair_stack_double * bs=static_cast(bstack); Stack stack= bs->first; double binside = *bs->second; // truc FH pour fluide de grad2 (decentrage bizard) bool onborder= &Kv.T == &KKv.T; const FElement *pKKv= !onborder ? & KKv : 0; MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); const Triangle & T = Kv.T; // const QuadratureFormular1d & FI = QF_GaussLegendre2; long npi; long i,nv=Kv.NbDoF(),N=Kv.N; long nnv=KKv.NbDoF(); assert(nv==nnv); // bool show = Kv.Vh.Th(T)==0; // char * xxx[] ={" u"," v,"," p"," q"," r"}; // char * xxxx[] ={" u'"," v',"," p'"," q'"," r'"}; // char * yyy[] ={" ","_x ","_y "}; bool classoptm = copt && Op.optiexpK; // assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (Kv.number<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs S: copt = " << copt << " " << classoptm << " opt " << optim << endl; KN Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); //assert(Op.MaxOp() pp(ip,lp),pk(ip+lp,lp),pkk(ip+2*lp,lp); int n = BuildMEK_KK(lp,pp,pk,pkk,&Kv,pKKv); RNMK_ fu(p,nv,N,lastop); // the value for basic fonction RNMK_ ffu( (double*) p + lffv ,nv,N,lastop); // the value for basic fonction R2 E=T.Edge(ie); double le = sqrt((E,E)); R2 PA(TriangleHat[VerticesOfTriangularEdge[ie][0]]), PB(TriangleHat[VerticesOfTriangularEdge[ie][1]]), PC(TriangleHat[OppositeVertex[ie]]); // warning the to edge are in opposite sens R2 PP_A(TriangleHat[VerticesOfTriangularEdge[iie][1]]), PP_B(TriangleHat[VerticesOfTriangularEdge[iie][0]]), PP_C(TriangleHat[OppositeVertex[ie]]); R2 Normal(E.perp()/-le); double cmean = onborder ? 1. : 0.5; for (npi=0;npiset(T(Pt),Pt,Kv,label,R2(E.y,-E.x)/le,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version for ( i=0; i=0? Kv(ik):-1; int dofikk=ikk>=0? KKv(ikk):-1; for (LOperaD::const_iterator l=Op.v.begin();l!=Op.v.end();l++,il++) { LOperaD::K ll(*l); pair ii(ll.first); int iis = ii.second; int iicase = iis / last_operatortype; iis %= last_operatortype; double w_i=0,ww_i=0; if(ik>=0) w_i = wi(ii.first,iis ); if( iicase>0 ) { if( ikk>=0) ww_i = wwi(ii.first,iis ); if (iicase==Code_Jump) w_i = -w_i; ///(w_i = ww_i-w_i); // jump else if (iicase==Code_Mean) ww_i=w_i = cmean* (w_i + ww_i ); // average else if (iicase==Code_OtherSide) std::swap(w_i,ww_i); // valeur de autre cote else ffassert(0); } R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (x) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); if(dofik>=0) B[dofik] += coef * c * w_i; if(dofikk>=0) B[dofikk] += coef * c * ww_i; } } } *MeshPointStack(stack) = mp; } // 3d template void Element_rhs(const Mesh3 & ThI,const Mesh3::Element & KI, const FESpace3 & Vh, int ie,int label,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular & FI,bool alledges=false,int optim=1) { Stack stack=pvoid2Stack(vstack); int intmortar=0; // AFAIRE("Element_rhs 3d on surface 2 diff mesh "); static int count =0; if(count++<1) { cout << " Element_rhs 3d on surface 2 diff mesh int test (FH)" << endl; cout << " -----------------------------------------------------" << endl; } // integration 1d on 2 diff mesh MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); bool classoptm = copt && Op.optiexpK; //assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (ThI(KI)<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs S: copt = " << copt << " " << classoptm << " opt "<< optim < pi(FI[npi]); R3 NN= T.N(ie); double mes=NN.norme(); NN/=mes; double coef = 0.5*mes*pi.a; // R3 Pt(T.PBord(ie,pi)),PI(T(Pt)); MeshPointStack(stack)->set(ThI,PI,Pt,KI,label,NN,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version bool outside; R3 PIt; const Tet & K = *Vh.Th.Find(PI,PIt,outside,Kp); if ( ! outside || intmortar) // FH march 2009 ??? { const FElement3 Kv= Vh[K]; long i,n=Kv.NbDoF(),N=Kv.N; RNMK_ fu(p,n,N,lastop); // the value for basic fonction Kv.BF(Dop,PIt,fu); for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (y) add: int1d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); B[Kv(i)] += coef * c * w_i; } } } } *MeshPointStack(stack) = mp; } // 3d template void Element_rhs(const Mesh & ThI,const Triangle & KI, const FESpace & Vh, int ie,int label,const LOperaD &Op,double * p,void * vstack,KN_ & B, const QuadratureFormular1d & FI = QF_GaussLegendre2,bool alledges=false,bool intmortar=false, R2 *Q=0,int optim=1) { // integration 1d on 2 diff mesh Stack stack=pvoid2Stack(vstack); MeshPoint mp=*MeshPointStack(stack) ; R ** copt = Stack_Ptr(stack,ElemMatPtrOffset); bool classoptm = copt && Op.optiexpK; //assert( (copt !=0) == (Op.where_in_stack_opt.size() !=0) ); if (ThI.number(KI)<1 && verbosity/100 && verbosity % 10 == 2) cout << "Element_rhs S: copt = " << copt << " " << classoptm << " opt " << optim << endl; KN Dop(last_operatortype); Op.DiffOp(Dop); int lastop=1+Dop.last(binder1st >(equal_to(),true)); assert(Op.MaxOp() set(ThI,PI,Pt,KI,label,R2(E.y,-E.x)/le,ie); if (classoptm) (*Op.optiexpK)(stack); // call optim version bool outside; R2 PIt; const Triangle & K = *Vh.Th.Find(PI,PIt,outside,Kp); if ( ! outside || intmortar) // FH march 2009 ??? { const FElement Kv= Vh[K]; long i,n=Kv.NbDoF(),N=Kv.N; RNMK_ fu(p,n,N,lastop); // the value for basic fonction Kv.BF(Dop,PIt,fu); for ( i=0; i ii(ll.first); double w_i = wi(ii.first,ii.second); R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && ( optim==1) && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization (z) add: int1d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } //= GetAny(ll.second.eval(stack)); B[Kv(i)] += coef * c * w_i; } } } } *MeshPointStack(stack) = mp; } template bool AssembleVarForm(Stack stack,const typename FESpace::Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MC * A,KN_ * B,const list &largs) { // return true if BC typedef typename FESpace::Mesh Mesh ; typedef Mesh * pmesh; bool ret=false; typedef DotStar_KN_ DotStar; typedef DotSlash_KN_ DotSlash; list::const_iterator ii,ib=largs.begin(), ie=largs.end(); using namespace FreeFempp; TypeVarForm *tvf=TypeVarForm::Global; assert( tvf); for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); // if(A) cout << "AssembleVarForm " << * r << " " << (*A)(0,3) << endl; if (r== tvf->tFB) { if (A) { const FormBilinear * bf =dynamic_cast(e); pmesh Thbf = GetAny((*bf->di->Th)(stack)); if(Thbf)AssembleBilinearForm( stack,*Thbf,Uh,Vh,sym,*A,bf); } } else if (r==tvf->tMat) { if (A) InternalError(" Add sparse matrice; to do, sorry"); } else if (r==tvf->tFL) { if (B) { const FormLinear * bf =dynamic_cast(e); pmesh Thbf = GetAny((*bf->di->Th)(stack)); if(Thbf) AssembleLinearForm( stack,*Thbf, Vh, B,bf) ; } } else if (r==tvf->tTab) { if ( B) *B += *GetAny *>( (*e)(stack) ); } else if (r==tvf->tDotStar) { if ( B) { DotStar ab=GetAny( (*e)(stack) ); *B += ab; } } else if (r==tvf->tMatX) { if ( B) { *B += GetAny::plusAx >( (*e)(stack) ) ; } } else if (r==tvf->tMatTX) { if ( B) { *B += GetAny::plusAtx >( (*e)(stack) ) ; } } else if (r== tvf->tBC) ret=true; else { cerr << "AssembleVarForm invalid type : " << * r << endl; throw(ErrorExec("AssembleVarForm invalid type in varf",1)); } } return ret; } template void AssembleBC(Stack stack,const typename FESpace::Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ) { list::const_iterator ii,ib=largs.begin(), ie=largs.end(); aType tBC( atype()) ; for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); if (r==tBC) AssembleBC(stack,Th,Uh,Vh,sym,A,B,X, dynamic_cast(e),tgv); } } template void AssembleBC(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const BC_set * bc, double tgv ) { MeshPoint *mps= MeshPointStack(stack),mp=*mps; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; // sptr->clean(); // modif FH mars 2006 clean Ptr int ktbc=0, nbon =0; bool Aii = A && A->n == A->m; int Nbcomp=Vh.N; Check(bc,Nbcomp); ffassert(Vh.N == Uh.N); TabFuncArg tabexp(stack,Vh.N); KN buf(Vh.MaximalNbOfDF()*last_operatortype*Vh.N); KN gg(buf); if ( B && B->N() != Vh.NbOfDF) ExecError("AssembleBC size rhs and nb of DF of Vh"); if(verbosity>99) cout << " Problem : BC_set "<< typeid(R).name() << " " ; nbon =bc->on.size(); set on; Expandsetoflab(stack,*bc, on); /* for (int i=0;i( (*bc->on[i])(stack)); if(verbosity>99) cout << lab << " " ; on.insert(lab); } if(verbosity>99) cout << endl; */ int kk=bc->bc.size(); const int dim=Vh.N; FElement::aIPJ ipj(Vh[0].Pi_h_ipj()); FElement::aR2 PtHat(Vh[0].Pi_h_R2()); KN PtonB(PtHat.N()); KN Aipj(ipj.N()); KNM Vp(dim,PtHat.N()); double tgv1=tgv <0? 1: tgv; // change 21 dec 2010 FH (Hack of ILU) for (int ib=0;ib99) cout << "BC " << it << " " << ie << " lab=" << r << ":\t" << K.T[VerticesOfTriangularEdge[ie][0]] << "; " << K.T[VerticesOfTriangularEdge[ie][1]] << " E=" << K.T.Edge(ie) << endl; for (int k=0;k xx=bc->bc[k]; tabexp=0; int comp = xx.first; tabexp[comp]=xx.second; // while (comp+1 bc[k].first) ) tabexp[comp]=bc->bc[k].second; else CompileError("In Boundary condition the vector FESpace , we must have:" " all componant, in the right order"); } // cout << " k "<< k << " " << comp << " " << " Nbcomp=" << Nbcomp << " " << Uh.dim_which_sub_fem[comp] << " " << Uh.dim_which_sub_fem[comp+1] << endl; #ifdef OLDPih K.Pi_h(gg,F_Pi_h,buf,&tabexp); #else K.Pi_h(Aipj); PtonB = 0; for (int i=0;icomplextype: " << bc->complextype << endl; for (int p=0;pset(K.T(PtHat[p]),PtHat[p],K,r,R2(E.y,-E.x)/le,ie); // la normal bofbof ? KN_ Vpp(Vp('.',p)); Vpp=R(); for (int j=0;jcomplextype) // FH may 2007 MatriceCreuse Vpp[j]=GetAny( (*tabexp[j])(stack) ); else Vpp[j]=GetAny( (*tabexp[j])(stack) ); } else Vpp[j]=0.; } //cout << " ..... Vp " << Vp << " " << bc->complextype << " " << bc << endl; for (int i=0;iSetBC(ddf, tgv);// change 21 dec 2010 FH (Hack of ILU) if (B) (*B)[ddf]= tgv1*gg[df]; if (X) (*X)[ddf]=gg[df]; } } if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } if (! ktbc && nbon && verbosity ) { cout << " Warning: -- Your set of boundary condition is incompatible with the mesh label." << endl; } *mps =mp; } template void AssembleBC(Stack stack,const Mesh3 & Th,const FESpace3 & Uh,const FESpace3 & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const BC_set * bc, double tgv ) { typedef Mesh3 Mesh; typedef typename FESpace3::FElement FElement; typedef typename Mesh::BorderElement BorderElement; typedef typename Mesh::Rd Rd; typedef typename Mesh::Element Element; typedef typename Mesh::RdHat RdHat; MeshPoint *mps= MeshPointStack(stack),mp=*mps; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; // sptr->clean(); // modif FH mars 2006 clean Ptr int ktbc=0, nbon =0; bool Aii = A && A->n == A->m; int Nbcomp=Vh.N; Check(bc,Nbcomp); assert(Vh.N == Uh.N); TabFuncArg tabexp(stack,Vh.N); KN buf(Vh.MaximalNbOfDF()*last_operatortype*Vh.N); KN gg(buf); if ( B && B->N() != Vh.NbOfDF) ExecError("AssembleBC size rhs and nb of DF of Vh"); if(verbosity>99) cout << " Problem : BC_set "<< typeid(R).name() << " " ; nbon =bc->on.size(); set on; Expandsetoflab(stack,*bc, on); /* for (int i=0;i( (*bc->on[i])(stack)); if(verbosity>99) cout << lab << " " ; on.insert(lab); } if(verbosity>99) cout << endl;*/ int kk=bc->bc.size(); const int dim=Vh.N; InterpolationMatrix ipmat(Vh); int npPh = Vh.maxNbPtforInterpolation; KN PtonB(npPh); KNM Vp(npPh,dim); Vp=R(); KN Vdf(Vh.MaxNbDFPerElement); double tgv1=tgv <0? 1: tgv; map lll; for (int ib=0;ib99) cout << "BC " << it << " " << ie << " lab=" << r << ":\t" << K.T[VerticesOfTriangularEdge[ie][0]] << "; " << K.T[VerticesOfTriangularEdge[ie][1]] << " E=" << K.T.Edge(ie) << endl; */ for (int k=0;k xx=bc->bc[k]; tabexp=0; int comp = xx.first; tabexp[comp]=xx.second; // while (comp+1 bc[k].first) ) tabexp[comp]=bc->bc[k].second; else CompileError("In Boundary condition the vector FESpace , we must have:" " all componant, in the right order"); } int nbdf=K.NbDoF() ; //ipmat.set(it); PtonB = 0; Rd NN=K.T.N(ie); NN /= NN.norme(); for (int i=0;iset(K.T(PtHat),PtHat,K,r,NN,ie); // la normal bofbof ? KN_ Vpp(Vp(p,'.')); for (int j=0;jcomplextype) // FH may 2007 Vpp[j]=GetAny( (*tabexp[j])(stack) ); else Vpp[j]=GetAny( (*tabexp[j])(stack) ); else Vpp[j]=0.; } // cout << " Vp: " << Vp << endl; K.Pi_h(Vp,Vdf,ipmat); for (int df=0;df::const_iterator i=lll.begin();i!=lll.end();i++) cout << " lab " << i-> first << " nb " << i->second << endl; } *mps =mp; } void Expandsetoflab(Stack stack,const BC_set & bc,set & setoflab); void Expandsetoflab(Stack stack,const CDomainOfIntegration & di,set & setoflab,bool &all); template void AssembleLinearForm(Stack stack,const Mesh3 & Th,const FESpace3 & Vh,KN_ * B,const FormLinear * l ) { typedef FESpace3 FESpace; typedef FESpace3::Mesh Mesh; typedef Mesh *pmesh ; StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; // sptr->clean(); // modif FH mars 2006 clean Ptr Check(l->l,Vh.N); if ( B && B->N() != Vh.NbOfDF) ExecError("AssembleLinearForm size rhs and nb of DF of Vh"); // if ( & Th != &Vh.Th ) ExecError("AssembleLinearForm on different meshes ( not implemented FH)."); KN buf(Vh.MaximalNbOfDF()*last_operatortype*Vh.N*2); // const FormLinear * l=dynamic_cast(e); const CDomainOfIntegration & di= *l->di; ffassert(di.d==3); // const Mesh * pThdi = GetAny( (* di.Th)(stack)); const Mesh & ThI = Th;//* GetAny( (* di.Th)(stack)); bool sameMesh = &ThI == &Vh.Th; SHOWVERB(cout << " FormLinear " << endl); //const vector & what(di.what); CDomainOfIntegration::typeofkind kind = di.kind; //const QuadratureFormular1d & FIE = di.FIE(stack); // const QuadratureFormular & FIT = di.FIT(stack); // const GQuadratureFormular & FIV = di.FIV(stack); // const QuadratureFormular1d & FIEo = di.FIE(stack); const QuadratureFormular & FITo = di.FIT(stack); const GQuadratureFormular & FIVo = di.FIV(stack); // to change the quadrature on element ... may 2014 FH .. // QuadratureFormular1d FIE(FIEo,3); QuadratureFormular FIT(FITo,3); GQuadratureFormular FIV(FIVo,3); const int useopt=di.UseOpt(stack); double binside=di.binside(stack); // truc FH pour fluide de grad2 (decentrage bizard) // cout << "AssembleLinearForm " << l->l->v.size() << endl; set setoflab; bool all=true; bool VF=l->VF(); // finite Volume or discontinous Galerkin if (verbosity>2) cout << " -- AssembleLinearForm 1, discontinous Galerkin =" << VF << " binside = "<< binside <<"\n"; if (verbosity>3) { if (CDomainOfIntegration::int2d==kind) cout << " -- boundary int border ( nQP: "<< FIT.n << ") , samemesh: " << sameMesh << " " ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges ( nQP: "<< FIT.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIT.n << ")," ; else cout << " -- int (nQP: "<< FIV.n << " ) in " ; } // if(di.islevelset()) InternalError("So no levelset integration type on this case (3)"); if(di.islevelset() && (CDomainOfIntegration::int2d!=kind) && (CDomainOfIntegration::int3d!=kind) ) InternalError("So no levelset intgeration type on no int2d/3d case"); /* if ( verbosity>3) if (kind==CDomainOfIntegration::int1d) cout << " -- boundary int border " ; else if (kind==CDomainOfIntegration::intalledges) cout << " -- boundary int all edges " ; else if (kind==CDomainOfIntegration::intallVFedges) cout << " -- boundary int all edges " ; else cout << " -- boundary int " ; */ Expandsetoflab(stack,di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; } else { KN labs( GetAny >( (*what[i])(stack))); for (long j=0; j3) cout << labs[j] << " "; } all=false; }*/ if (verbosity>3) cout << " Optimized = "<< useopt << ", "; const E_F0 * poptiexp0=l->l->optiexp0; // const E_F0 & optiexpK=*l->l->optiexpK; int n_where_in_stack_opt=l->l->where_in_stack_opt.size(); R** where_in_stack = 0; if (n_where_in_stack_opt && useopt) where_in_stack = new R * [n_where_in_stack_opt]; if (where_in_stack) { assert(l->l->v.size()==(size_t) n_where_in_stack_opt); for (int i=0;il->where_in_stack_opt[i]; assert(offset>10); where_in_stack[i]= static_cast(static_cast((char*)stack+offset)); *(where_in_stack[i])=0; } if(poptiexp0) (*poptiexp0)(stack); if( (verbosity/100) && verbosity % 10 == 2) { int il=0; for (LinearOperatorD::const_iterator ll=l->l->v.begin();ll!=l->l->v.end();ll++,il++) cout << il << " coef (" << ll->first << ") = " << *(where_in_stack[il]) << " offset=" << l->l->where_in_stack_opt[il] < phi(ThI.nv);phi=uset; double f[4]; for(int t=0; t< ThI.nt;++t) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<4;++i) { int j= ThI(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&ThI,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } if( umn <=0 && umx >= 0) { int np= IsoLineK(f,Q,1e-10);// ca code ... if(np==3 || np==4) { // if(np==3) Q[3]=Q[0]; // same 0 == 3 bofbof ??? FH // cout << " Q[0]" << Q[0] << endl; if( verbosity> 99) { R3 PP[4]; const Tet &K(ThI[t]); for(int i=0; i< np; ++i) PP[i]= K(Q[i]); for( int i =0; i+1 < np; i+=2) { int i0=i,i1=i+1,i2=(i+2)%np; R3 NN= R3(PP[i0],PP[i1])^R3(PP[i0],PP[i2]); double mes2 = (NN,NN); double mes = sqrt(mes2)/2; ss+= mes; //cout << "mes " << mes << " " << i << " , "; } } if ( sameMesh) Element_rhs(Vh[t],*l->l,buf,stack,*B,FIT,np,Q,useopt); else // else InternalError(" No levelSet on Diff mesh3 : to day int2d of RHS"); // Element_rhs(ThI,ThI[t],Vh,-1,lab,*l->l,buf,stack,*B,FIT,false); } if(sptrclean) sptrclean=sptr->clean(); } } if( verbosity> 99) cout << " surf levelset = " << ss << endl; } else for( int e=0;e(Vh[i],ie,Th.be(e).lab,*l->l,buf,stack,*B,FIT,false,useopt); else Element_rhs(ThI,ThI[i],Vh,ie,Th.be(e).lab,*l->l,buf,stack,*B,FIT,false,useopt); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } else if (kind==CDomainOfIntegration::intalledges) { AFAIRE("3D Elment RHS CDomainOfIntegration::intalledges"); /* if(VF) { pair_stack_double bstack; bstack.first = stack; bstack.second= & binside; //InternalError(" Today no jump or average in intalledges of RHS "); for (int i=0;i< ThI.nt; i++) if (all || setoflab.find(ThI[i].lab) != setoflab.end()) { for (int ie=0;ie<3;ie++) if ( sameMesh) { int iie=ie,ii=Th.ElementAdj(i,iie); if(ii<0) ii=i;// sur le bord Element_rhsVF(Vh[i],Vh[ii],ie,iie,Th[i].lab,*l->l,buf,ip,&bstack,*B,FIE); } else InternalError("To Do") ; if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else for (int i=0;i< ThI.nt; i++) if (all || setoflab.find(ThI[i].lab) != setoflab.end()) { for (int ie=0;ie<3;ie++) if ( sameMesh) Element_rhs(Vh[i],ie,Th[i].lab,*l->l,buf,stack,*B,FIE,true); else InternalError("To Do") ; if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr }*/ } else if (kind==CDomainOfIntegration::intallVFedges) { cerr << " intallVFedges a faire" << endl; InternalError(" intallVFedges a faire "); ffassert(0);/* for (int i=0;i< ThI.nt; i++) { if (all || setoflab.find(ThI[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) if ( sameMesh) Element_rhs(Vh[i],ie,Th[i].lab,*l->l,buf,stack,*B,FIE,true); else InternalError("To Do") ; if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr }*/ } else if(kind==CDomainOfIntegration::int3d) { if(di.islevelset()) // may 2014 FH ... { // int3d levelset < 0 double llevelset = 0; const double uset = std::numeric_limits::max(); // cout << " uset ="< phi(Th.nv); phi=uset; double f[4]; for (int t=0;t< Th.nt; t++) { const Mesh3::Element & K(ThI[t]); if (all || setoflab.find(ThI[t].lab) != setoflab.end()) { double umx=std::numeric_limits::min(),umn=std::numeric_limits::max(); for(int i=0;i<4;++i) { int j= ThI(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&ThI,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; } int ntets= UnderIso(f,Q, vol6,1e-14); setQF(FIV,FIVo,QuadratureFormular_Tet_1, Q,vol6,ntets); if(FIV.n) { if ( sameMesh ) Element_rhs(Vh[t],*l->l,buf,stack,*B,FIV,useopt); else Element_rhs(ThI,ThI[t],Vh,*l->l,buf,stack,*B,FIV,useopt); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } FIV=FIVo; } else { for (int i=0;i< ThI.nt; i++) if (all || setoflab.find(ThI[i].lab) != setoflab.end()) { if ( sameMesh ) Element_rhs(Vh[i],*l->l,buf,stack,*B,FIV,useopt); else Element_rhs(ThI,ThI[i],Vh,*l->l,buf,stack,*B,FIV,useopt); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr }} } else if(kind==CDomainOfIntegration::intallfaces ) { if(VF) InternalError(" no jump or average in intallfaces of RHS"); for(int i=0;i(Vh[i],ie,lab,*l->l,buf,stack,*B,FIT,false,useopt); else Element_rhs(ThI,ThI[i],Vh,ie,lab,*l->l,buf,stack,*B,FIT,false,useopt); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else { cout << " Strange (unknows) kind = " << kind << endl; ffassert(0); } if (n_where_in_stack_opt) delete [] where_in_stack; } template void AssembleLinearForm(Stack stack,const Mesh & Th,const FESpace & Vh,KN_ * B,const FormLinear * l ) { StackOfPtr2Free * sptr = WhereStackOfPtr2Free(stack); bool sptrclean=true; // sptr->clean(); // modif FH mars 2006 clean Ptr Check(l->l,Vh.N); if ( B && B->N() != Vh.NbOfDF) ExecError("AssembleLinearForm size rhs and nb of DF of Vh"); // if ( & Th != &Vh.Th ) ExecError("AssembleLinearForm on different meshes ( not implemented FH)."); KN buf(Vh.MaximalNbOfDF()*last_operatortype*Vh.N*2); // const FormLinear * l=dynamic_cast(e); const CDomainOfIntegration & di= *l->di; const Mesh & ThI = Th;//* GetAny( (* di.Th)(stack)); bool sameMesh = &ThI == &Vh.Th; const bool intmortar=di.intmortar(stack); SHOWVERB(cout << " FormLinear " << endl); // const vector & what(di.what); CDomainOfIntegration::typeofkind kind = di.kind; const QuadratureFormular1d & FIE = di.FIE(stack); const QuadratureFormular & FIT = di.FIT(stack); const int useopt=di.UseOpt(stack); double binside=di.binside(stack); // truc FH pour fluide de grad2 (decentrage bizard) // cout << "AssembleLinearForm " << l->l->v.size() << endl; set setoflab; bool all=true; bool VF=l->VF(); // finite Volume or discontinous Galerkin if (verbosity>2) cout << " -- AssembleLinearForm 2, discontinous Galerkin =" << VF << " binside = "<< binside << " levelset integration " <3) { if (CDomainOfIntegration::int1d==kind) cout << " -- boundary int border ( nQP: "<< FIE.n << ") , samemesh :"<< sameMesh<< " int mortar: " << intmortar ; else if (CDomainOfIntegration::intalledges==kind) cout << " -- boundary int all edges ( nQP: "<< FIE.n << ")," ; else if (CDomainOfIntegration::intallVFedges==kind) cout << " -- boundary int all VF edges nQP: ("<< FIE.n << ")," ; else cout << " -- int (nQP: "<< FIT.n << " ) in " ; } /* if ( verbosity>3) if (kind==CDomainOfIntegration::int1d) cout << " -- boundary int border " ; else if (kind==CDomainOfIntegration::intalledges) cout << " -- boundary int all edges " ; else if (kind==CDomainOfIntegration::intallVFedges) cout << " -- boundary int all edges " ; else cout << " -- boundary int " ; */ if(di.islevelset() && ( (CDomainOfIntegration::int1d!=kind) && (CDomainOfIntegration::int2d!=kind) ) ) InternalError("So no levelset integration type on no int1d/int2d case (4)"); Expandsetoflab(stack,di, setoflab,all); /* for (size_t i=0;i( (*what[i])(stack)); setoflab.insert(lab); if ( verbosity>3) cout << lab << " "; all=false; } */ if (verbosity>3) cout << " Optimized = "<< useopt << ", "; const E_F0 * poptiexp0=l->l->optiexp0; // const E_F0 & optiexpK=*l->l->optiexpK; int n_where_in_stack_opt=l->l->where_in_stack_opt.size(); R** where_in_stack =0; if (n_where_in_stack_opt && useopt) where_in_stack = new R * [n_where_in_stack_opt]; if (where_in_stack) { assert(l->l->v.size()==(size_t) n_where_in_stack_opt); for (int i=0;il->where_in_stack_opt[i]; assert(offset>10); where_in_stack[i]= static_cast(static_cast((char*)stack+offset)); *(where_in_stack[i])=0; } if(poptiexp0) (*poptiexp0)(stack); if( (verbosity/100) && verbosity % 10 == 2) { int il=0; for (LinearOperatorD::const_iterator ll=l->l->v.begin();ll!=l->l->v.end();ll++,il++) cout << il << " coef (" << ll->first << ") = " << *(where_in_stack[il]) << " offset=" << l->l->where_in_stack_opt[il] < phi(ThI.nv);phi=uset; double f[3]; for(int t=0; t< ThI.nt;++t) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= ThI(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&ThI,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } if( umn <=0 && umx >= 0) { int np= IsoLineK(f,Q,1e-10); if(np==2) { if ( sameMesh) {/* void Element_rhs(const FElement & Kv,const LOperaD &Op,double * p,void * stack,KN_ & B, const QuadratureFormular1d & FI ,const R2 & PA,const R2 &PB) */ Element_rhs(Vh[t],*l->l,buf,stack,*B,FIE,Q[0],Q[1],useopt); } else Element_rhs(ThI,ThI[t],Vh,0,ThI[t].lab,*l->l,buf,stack,*B,FIE,false,intmortar,Q,useopt); //InternalError(" No levelSet on Diff mesh : to day int1d of RHS"); } if(sptrclean) sptrclean=sptr->clean(); } } } else for( int e=0;e(Vh[i],ie,Th.bedges[e].lab,*l->l,buf,stack,*B,FIE,false,useopt); else Element_rhs(ThI,ThI[i],Vh,ie,Th.bedges[e].lab,*l->l,buf,stack,*B,FIE,false,intmortar,0,useopt); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } } else if (kind==CDomainOfIntegration::intalledges) { if(VF) { pair_stack_double bstack(stack,& binside); //bstack.first = stack; //bstack.second= & binside; //InternalError(" Today no jump or average in intalledges of RHS "); for (int i=0;i< ThI.nt; i++) if (all || setoflab.find(ThI[i].lab) != setoflab.end()) { for (int ie=0;ie<3;ie++) if ( sameMesh) { int iie=ie,ii=Th.ElementAdj(i,iie); if(ii<0) ii=i;// sur le bord Element_rhsVF(Vh[i],Vh[ii],ie,iie,Th[i].lab,*l->l,buf,ip,&bstack,*B,FIE,useopt); } else InternalError("To Do") ; if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else for (int i=0;i< ThI.nt; i++) if (all || setoflab.find(ThI[i].lab) != setoflab.end()) { for (int ie=0;ie<3;ie++) if ( sameMesh) Element_rhs(Vh[i],ie,Th[i].lab,*l->l,buf,stack,*B,FIE,true,useopt); else InternalError("To Do") ; if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (kind==CDomainOfIntegration::intallVFedges) { cerr << " intallVFedges a faire" << endl; InternalError(" intallVFedges a faire "); ffassert(0); for (int i=0;i< ThI.nt; i++) { if (all || setoflab.find(ThI[i].lab) != setoflab.end()) for (int ie=0;ie<3;ie++) { if ( sameMesh) Element_rhs(Vh[i],ie,Th[i].lab,*l->l,buf,stack,*B,FIE,true,useopt); else InternalError("To Do") ; } if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } else if (kind==CDomainOfIntegration::int2d){ if(di.islevelset()) { QuadratureFormular FITM(FIT); double uset = HUGE_VAL; R2 Q[4]; KN phi(Th.nv);phi=uset; double f[3]; for(int t=0; t< Th.nt;++t) { if ( all || setoflab.find(ThI[t].lab) != setoflab.end()) { double umx=-HUGE_VAL,umn=HUGE_VAL; for(int i=0;i<3;++i) { int j= ThI(t,i); if( phi[j]==uset) { MeshPointStack(stack)->setP(&ThI,t,i); phi[j]= di.levelset(stack);//zzzz } f[i]=phi[j]; umx = std::max(umx,phi[j]); umn = std::min(umn,phi[j]); } if( umx <=0 ) Element_rhs(Vh[t],*l->l,buf,stack,*B,FIT,useopt); else if( umn <0 ) { // coupe .. int i0 = 0, i1 = 1, i2 =2; if( f[i0] > f[i1] ) swap(i0,i1) ; if( f[i0] > f[i2] ) swap(i0,i2) ; if( f[i1] > f[i2] ) swap(i1,i2) ; double c = (f[i2]-f[i1])/(f[i2]-f[i0]); // coef Up Traing if( f[i1] < 0 ) {double y=f[i2]/(f[i2]-f[i1]); c *=y*y; } else {double y=f[i0]/(f[i0]-f[i1]) ; c = 1.- (1.-c)*y*y; }; assert( c > 0 && c < 1); double arean = (1-c)*Th[t].area; FITM=FIT; FITM*=1-c; Element_rhs(Vh[t],*l->l,buf,stack,*B,FITM,useopt); } if(sptrclean) sptrclean=sptr->clean(); } } } else for (int i=0;i< ThI.nt; i++) if (all || setoflab.find(ThI[i].lab) != setoflab.end()) { if ( sameMesh ) Element_rhs(Vh[i],*l->l,buf,stack,*B,FIT,useopt); else Element_rhs(ThI,ThI[i],Vh,*l->l,buf,stack,*B,FIT,useopt); if(sptrclean) sptrclean=sptr->clean(); // modif FH mars 2006 clean Ptr } } if (n_where_in_stack_opt) delete [] where_in_stack; } }// END of NameSpace Fem2D bool isVF(const list & largs) // true => VF type of Matrix { list::const_iterator ii,ib=largs.begin(), ie=largs.end(); bool VVF =false; for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); if (r==atype()) { const FormBilinear * bb=dynamic_cast(e); bool vvf = bb->VF(); if( vvf && (bb->di->kind != CDomainOfIntegration::intalledges && bb->di->kind != CDomainOfIntegration::intallVFedges ) && (bb->di->kind != CDomainOfIntegration::intallfaces )) CompileError("Sorry, no jump or moy in bilinear form no of type intalledges or intallVFedges "); VVF = vvf || VVF; } } return VVF; } bool isSameMesh(const list & largs,const void * Thu,const void * Thv,Stack stack) // true => VF type of Matrix { if( Thv != Thu ) return false; list::const_iterator ii,ib=largs.begin(), ie=largs.end(); // bool VVF =false; for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); if (r==atype()) { const FormBilinear * bb=dynamic_cast(e); const void * Thbf = GetAny((*bb->di->Th)(stack)); if (Thbf != Thu) return false; } else if (r==atype()) { const FormLinear * bb=dynamic_cast(e); const void * Thbf = GetAny((*bb->di->Th)(stack)); if (Thbf != Thu) return false; } } return true; } template void InitProblem( int Nb, const FESpace & Uh, const FESpace & Vh, KN *&B,KN *&X,vector< pair< FEbase * ,int> > &u_hh, TypeSolveMat *typemat , vector< FEbase * > & u_h,const FESpace ** LL, bool initx ) { typedef typename FESpace::Mesh Mesh; typedef typename FESpace::FElement FElement; typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::RdHat RdHat; typedef typename Mesh::Rd Rd; *B=R(); // bool initx = typemat->t==TypeSolveMat::GC; const Mesh & Th(Uh.Th); if (initx) { if (!X || (X =B) ) X=new KN(B->N()); const FEbase & u_h0 = *(u_h[0]); const FESpace * u_Vh = u_h0.Vh ; if ( u_Vh==0 || &((u_h[0])->Vh->Th) != &Th ) { *X=R(); if(verbosity>1) cout << " -- Change of Mesh " << (u_Vh ? & (*(u_h[0])).Vh->Th: 0 ) << " " << &Th << endl; } else { // copy the previous soluton to initialize CG, GMRES, etc ... if (Nb==1) { // modif FH 0701/2005 + april 2006 if(u_h[0]->x()->N() != X->N() ) cout << " bug ???? " << endl; if (u_h[0]->x() && u_h[0]->x()->N() == X->N() ) *X= * u_h[0]->x(); else *X=R(); } else { // dispatch the solution const FElement ** sK= new const FElement * [Nb]; KN ** sol= new KN * [Nb]; for (int i=0;i void DefSolver(Stack stack, MatriceCreuse & A, Data_Sparse_Solver & ds ) { const OneOperator* pprecon= static_cast(ds.precon); if (ds.typemat->profile) { if(verbosity>5) cout << " Matrix skyline type:" << ds.typemat->t < & AA(dynamic_cast &>(A)); throwassert(&AA); double tol_pivot1= (ds.tol_pivot>0.) ? ds.tol_pivot : EPSILON/8.; // cout << " tol_pivot1 " <t) { case TypeSolveMat::LU : AA.LU(tol_pivot1); break; case TypeSolveMat::CROUT : AA.crout(tol_pivot1); break; case TypeSolveMat::CHOLESKY : AA.cholesky(tol_pivot1); break; default: cerr << " type resolution " << ds.typemat->t << endl; CompileError("type resolution profile inconnue"); break; } } else { if(verbosity>5) cout << " Matrix morse type:" << ds.typemat->t < & AA(dynamic_cast &>(A)); throwassert(&A); switch (ds.typemat->t) { case TypeSolveMat::GC: if (ds.precon) AA.SetSolverMaster(new SolveGCPrecon(AA,pprecon,stack,ds.itmax,ds.epsilon)); else AA.SetSolverMaster(new SolveGCDiag(AA,ds.itmax,ds.epsilon)); break; case TypeSolveMat::GMRES : if (ds.precon) AA.SetSolverMaster(new SolveGMRESPrecon(AA,pprecon,stack,ds.NbSpace,ds.itmax,ds.epsilon)); else AA.SetSolverMaster(new SolveGMRESDiag(AA,ds.NbSpace,ds.itmax,ds.epsilon)); break; //#ifdef HAVE_LIBUMFPACK case TypeSolveMat::SparseSolver : AA.SetSolverMaster(DefSparseSolver::Build(stack,&AA,ds)); // AA.SetSolverMaster(new SolveUMFPack(AA,umfpackstrategy,tgv,eps,tol_pivot,tol_pivot_sym)); break; case TypeSolveMat::SparseSolverSym : AA.SetSolverMaster(DefSparseSolverSym::Build(stack,&AA,ds)); // AA.SetSolverMaster(new SolveUMFPack(AA,umfpackstrategy,tgv,eps,tol_pivot,tol_pivot_sym)); break; //#endif default: cerr << " type resolution " << ds.typemat->t << endl; CompileError("type resolution inconnue"); break; } } } bool SetGMRES() { if(verbosity>1) cout << " SetDefault sparse (morse) solver to GMRES" << endl; DefSparseSolver::solver =BuildSolverGMRES; DefSparseSolver::solver =BuildSolverGMRES; return true; } bool SetCG() { if(verbosity>1) cout << " SetDefault sparse (morse) solver to CG" << endl; DefSparseSolver::solver =BuildSolverCG; DefSparseSolver::solver =BuildSolverCG; return true; } #ifdef XXXXXXXXXXX #ifdef HAVE_LIBUMFPACK bool SetUMFPACK() { if(verbosity>1) cout << " SetDefault sparse solver to UMFPack" << endl; DefSparseSolver::solver =BuildSolverUMFPack; DefSparseSolver::solver =BuildSolverUMFPack; return true; } template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverUMFPack; template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverUMFPack; #else template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverGMRES; template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverGMRES; bool SetUMFPACK() { if(verbosity>1) cout << " Sorry no UMFPack" << endl; return false; } #endif #endif template <> DefSparseSolverSym::SparseMatSolver DefSparseSolverSym::solver =BuildSolverGMRES; template <> DefSparseSolverSym::SparseMatSolver DefSparseSolverSym::solver =BuildSolverGMRES; template MatriceCreuse::Scalaire> * DefSolverCadna( Stack stack, MatriceCreuse & A, Data_Sparse_Solver & ds /* long NbSpace , long itmax, double & eps, bool initmat, int strategy, const OneOperator *precon, double tgv, double tol_pivot, double tol_pivot_sym */ ) { typedef typename CadnaType::Scalaire R_st; // MatriceCreuse *CadnaMat; if (ds.typemat->profile) { if(verbosity>5) cout << " Matrix skyline type:" << ds.typemat->t < & AAA(dynamic_cast &>(A)); MatriceProfile &AA(*new MatriceProfile(AAA)); // throwassert(&AA); double tol_pivot1= (ds.tol_pivot>0) ? ds.tol_pivot : EPSILON/8.; // cout << " tol_pivot1 " <t) { case TypeSolveMat::LU : AA.LU(tol_pivot1); break; case TypeSolveMat::CROUT : AA.crout(tol_pivot1); break; case TypeSolveMat::CHOLESKY : AA.cholesky(tol_pivot1); break; default: cerr << " type resolution " << ds.typemat->t << endl; CompileError("type resolution profile inconnue"); break; } return &AA; } else { ExecError("matrix morse & CADNA are incompatible today, sorry!"); return 0; } return 0; } template void DispatchSolution(const typename FESpace::Mesh & Th,int Nb, vector< FEbase * > & u_h,KN * X,KN * B,const FESpace ** LL,const FESpace & Uh) { typedef typename FESpace::Mesh Mesh; typedef typename FESpace::FElement FElement; typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::RdHat RdHat; typedef typename Mesh::Rd Rd; // dispatch the solution if (Nb==1) { *(u_h[0])=X; if (X != B ) delete B; } else { const FElement ** sK= new const FElement * [Nb]; KN ** sol= new KN * [Nb]; for (int i=0;i( LL[i]->NbOfDF) ; *(u_h[i]) = sol[i]; } for (int it=0;it AnyType Problem::eval(Stack stack,Data * data,CountPointer > & dataA, MatriceCreuse< typename CadnaType::Scalaire > * & cadnamat ) const { typedef typename FESpace::Mesh Mesh; typedef typename FESpace::FElement FElement; typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::RdHat RdHat; typedef typename Mesh::Rd Rd; using namespace Fem2D; typedef typename CadnaType::Scalaire R_st; MeshPoint *mps= MeshPointStack(stack),mp=*mps; Data_Sparse_Solver ds; /* long NbSpace = 50; long itmax=0; double epsilon=1e-6;*/ string save; // bool VF=false; // VF=isVF(op->largs); // assert(!VF); // double tgv = 1e30; // type de matrice par default TypeSolveMat tmat(TypeSolveMat::defaultvalue); ds.typemat=&tmat; // bool initmat=true; /* int strategy=0; double tol_pivot=-1.; // defaut UMFPACK value Add FH 31 oct 2005 double tol_pivot_sym=-1.; // defaut Add FH 31 oct 2005 KN param_int; KN param_double; string *param_char = NULL; KN perm_r; KN perm_c; string *file_param_int; // Add J. Morice 02/09 string *file_param_double; string* file_param_char; string* file_param_perm_r; string* file_param_perm_c; */ KN* cadna=0; /* { "save",&typeid(string* )}, 0 { "cadna",&typeid(KN*)}, 1 { "bmat",&typeid(Matrice_Creuse* )}, 2 */ if (nargs[0]) save = *GetAny((*nargs[0])(stack)); if (nargs[1]) cadna= GetAny* >((*nargs[1])(stack)); // bmat not used .... bizarre /* if (nargs[0]) ds.initmat= ! GetAny((*nargs[0])(stack)); if (nargs[1]) ds.typemat= GetAny((*nargs[1])(stack)); if (nargs[2]) ds.epsilon= GetAny((*nargs[2])(stack)); // 3 precon if (nargs[4]) ds.NbSpace= GetAny((*nargs[4])(stack)); if (nargs[6]) ds.tgv= GetAny((*nargs[6])(stack)); if (nargs[7]) ds.strategy = GetAny((*nargs[7])(stack)); if (nargs[8]) save = *GetAny((*nargs[8])(stack)); if (nargs[9]) cadna= GetAny* >((*nargs[9])(stack)); */ /* if (nargs[10]) ds.tol_pivot= GetAny((*nargs[10])(stack)); if (nargs[11]) ds.tol_pivot_sym= GetAny((*nargs[11])(stack)); if (nargs[12]) ds.itmax = GetAny((*nargs[12])(stack)); // fevr 2007 if (nargs[13]) ds.param_int= GetAny< KN >((*nargs[13])(stack)); // Add J. Morice 02/09 if (nargs[14]) ds.param_double= GetAny< KN >((*nargs[14])(stack)); if (nargs[15]) ds.param_char= GetAny< string * >((*nargs[15])(stack)); // if (nargs[16]) ds.perm_r = GetAny< KN >((*nargs[16])(stack)); if (nargs[17]) ds.perm_c = GetAny< KN >((*nargs[17])(stack)); // if (nargs[18]) ds.file_param_int= GetAny< string* >((*nargs[18])(stack)); // Add J. Morice 02/09 if (nargs[19]) ds.file_param_double= GetAny< string* > ((*nargs[19])(stack)); if (nargs[20]) ds.file_param_char= GetAny< string* >((*nargs[20])(stack)); // if (nargs[21]) ds.file_param_perm_r = GetAny< string* >((*nargs[21])(stack)); if (nargs[22]) ds.file_param_perm_c = GetAny< string* >((*nargs[22])(stack)); // */ SetEnd_Data_Sparse_Solver(stack,ds,nargs,n_name_param); // for the gestion of the PTR. WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH aout 2007 bool sym = ds.typemat->sym; list::const_iterator ii,ib=op->largs.begin(), ie=op->largs.end(); int Nbcomp2=var.size(),Nbcomp=Nbcomp2/2; // nb de composante throwassert(Nbcomp2==2*Nbcomp); // Data *data= dataptr(stack); // data->init(); KN which_comp(Nbcomp2),which_uh(Nbcomp2); TabFuncArg tabexp(stack,Nbcomp); typedef pair< FEbase *,int> pfer; vector< pair< FEbase *,int> > u_hh(Nbcomp2); for (size_t i=0;i( (*(var[i]))(stack)); for (size_t i=0;inewVh(); // compression pour les cas vectoriel int kkk=0; for (int i=0;i * > u_h(kkk); kkk= 0; for (int i=0;i LL(var.size()); for (int i=0;iTh; for (int i=0;iTh != pTh) ExecError("all the finites elements spaces must be defined on the same mesh in solve"); if ( pTh != data->pTh ) { ds.initmat = true; data->pTh=pTh; if (Nb==1) { // cas scalaire data->Uh=LL[0]; data->Vh=LL[1]; } else { // cas vectoriel bool same=true; for (int i=0;iUh.master( new FESpace(*LL[0],Nb)); else data->Uh.master(new FESpace(LL,Nb)); data->Vh=data->Uh; } } } const FESpace & Uh(*data->Uh); const FESpace & Vh(*data->Vh); throwassert(Nbcomp==Uh.N && Nbcomp==Vh.N); KN *B=new KN(Vh.NbOfDF); KN *X=B; // const Mesh & Th(Uh.Th); bool initx = true; //typemat->t==TypeSolveMat::GC ; // make x and b different in all case // more safe for the future ( 4 days lose with is optimization FH ) InitProblem( Nb, Uh, Vh, B, X,u_hh,ds.typemat , u_h, LL, initx); if(verbosity>2) cout << " Problem(): initmat " << ds.initmat << " VF (discontinuous Galerkin) = " << VF << endl; if (ds.initmat) { if (ds.typemat->profile) { dataA.master(new MatriceProfile(Vh,VF)); } else { if ( &Uh == & Vh ) dataA.master(new MatriceMorse(Vh,sym,VF)); else dataA.master(new MatriceMorse(Vh,Uh,VF)); } MatriceCreuse & AA(dataA); if(verbosity>1) cout << " -- size of Matrix " << AA.size()<< " Bytes" << " skyline =" <profile << endl; } MatriceCreuse & A(dataA); if (AssembleVarForm( stack,Th,Uh,Vh,sym, ds.initmat ? &A:0 , B, op->largs)) { *B = - *B; // hach FH for (int i=0, n= B->N(); i< n; i++) if( abs((*B)[i]) < 1.e-60 ) (*B)[i]=0; AssembleBC ( stack,Th,Uh,Vh,sym, ds.initmat ? &A:0 , B, initx ? X:0, op->largs, ds.tgv ); } else *B = - *B; MatriceCreuse * ACadna = 0; try { if (ds.initmat) { if(cadna) ACadna = DefSolverCadna( stack,A, ds); else DefSolver(stack, A, ds); } // if(verbosity>3) cout << " B min " << B->min() << " , max = " << B->max() << endl; if( save.length() ) { string savem=save+".matrix"; string saveb=save+".b"; { ofstream outmtx( savem.c_str()); outmtx << A << endl; } { ofstream outb(saveb.c_str()); outb<< *B << endl; } } if (verbosity>99) { cout << " X= " << *X << endl; cout << " B= " << *B << endl; } if(ACadna) { KN XX(*X); KN BB(*B); ACadna->Solve(XX,BB); *X=XX; *cadna =-1.; #ifdef HAVE_CADNA R_st xxmin = XX.min(); R_st xxmax = XX.max(); cout << " cadna: min " << xxmin << "/ nd " << cestac(xxmin) << " , max " << xxmax << " / nd " << cestac(xxmax) << endl ; int nn= XX.N(); if ( cadna->N() == nn ) for (int i=0;i set sol = 0 !!!!!!! " << endl; *X=R(); // erreur set the sol of zero ???? DispatchSolution(Th,Nb,u_h,X,B,LL,Uh); throw ; } DispatchSolution(Th,Nb,u_h,X,B,LL,Uh); if (verbosity) {cout << " -- Solve : \n" ; for (int i=0;ix()->min() << " max " << (u_h[i])->x()->max() << endl ; } // delete [] LL; // if (save) delete save; // clean memory *mps=mp; return SetAny(this); } int dimProblem(const ListOfId &l) { int dim=2; int nb=l.size();//,nbarray=0;//,n=0, //const UnId *p1; if(nb>0) { if (l[0].array) { ListOfId * array=l[0].array; if(array->size()>0) { const UnId & idi( (*array)[0]); if (idi.r == 0 && idi.re == 0 && idi.array==0 ) { C_F0 c=::Find( idi.id); if(BCastTo(c) ) dim=3; if(BCastTo(c) ) dim=3; } } } else { C_F0 c=::Find(l[0].id); if(BCastTo(c) ) dim=3; if(BCastTo(c) ) dim=3; } } return dim; } template bool GetBilinearParam(const ListOfId &l,basicAC_F0::name_and_type *name_param,int n_name_param, Expression *nargs,int & N,int & M, vector & var ) { bool unset=true,complextype=false; for (int i=0;iname()]->CastTo(C_F0(l[i].e,l[i].re)); break; } if (!ok) { cerr << " Error name argument " << l[i].id << " the kown arg : "; for (int k=0;ksize(); M = array[1]->size(); var.resize(N+M); for (size_t k=0,j=0;k<2;k++) for (size_t i=0;isize();i++) { const UnId & idi((*array[k])[i]); if (idi.r == 0 && idi.re == 0 && idi.array==0 ) { C_F0 c=::Find( idi.id); if (unset) complextype = BCastTo(c) , unset=false; if(complextype) var[j++]=CastTo(c); else var[j++]=CastTo(c); } else CompileError(" Just Variable in array parameter "); } } else { // old version assert(n%2==0); N=n/2; M=N; var.resize(N+M); for (size_t i=0,j=0;i(c) , unset=false; if(complextype) var[j++]=CastTo(c); else var[j++]=CastTo(c); } } return complextype; } /* int DimForm( list & largs) { int dim=0; list::iterator ii,ib=largs.begin(), ie=largs.end(); for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); if (r==atype()) { const FormBilinear * bb=dynamic_cast(e); if(dim) ffassert(bb->d==dim); else dim=bb->d; } else if (r==atype()) { const FormLinear * ll=dynamic_cast(e); if(dim) ffassert(bb->d==dim); else dim=bb->d; } else if (r == atype()) { const BC_set * bc=dynamic_cast(e); if (bc->complextype) complextype=true; } } }*/ bool FieldOfForm( list & largs ,bool complextype) // true => complex problem { // bool iscomplextype=complextype; list::iterator ii,ib=largs.begin(), ie=largs.end(); // bool complextype =false; for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); if (r==atype()) { const FormBilinear * bb=dynamic_cast(e); if (! bb->b->mappable(BCastToR)) complextype=true; } else if (r==atype()) { const FormLinear * ll=dynamic_cast(e); if (! ll->l->mappable(BCastToR)) complextype=true; } else if (r == atype()) { const BC_set * bc=dynamic_cast(e); if (bc->complextype) complextype=true; } } for (ii=ib;ii != ie;ii++) { Expression e=ii->LeftValue(); aType r = ii->left(); if (r==atype()) { FormBilinear * bb=new FormBilinear(*dynamic_cast(e)); Foperator * b=const_cast< Foperator *>(bb->b); // const Foperator * b=bb->b; //cout << b << " bb->b " << bb->b << " " << bb->b << " " << bb->b->isoptimize <isoptimize==false); if (complextype) b->mapping(&CCastToC); else b->mapping(&CCastToR) ; Foperator * bn = b->Optimize(currentblock); *bb->b = *bn; *ii=C_F0(bb,r); } else if (r==atype()) { FormLinear * ll=new FormLinear(*dynamic_cast(e)); Ftest * l= const_cast(ll->l); if (complextype) l->mapping(&CCastToC) ; else l->mapping(&CCastToR) ; Ftest * ln = l->Optimize(currentblock); *ll->l=*ln; *ii=C_F0(ll,r); //cout << l << " ll->l " << ll->l << " " << ll->l->isoptimize <()) {// modif FH mai 2007 A FAIRE il y a un bug ici XXXXXXXXXXXXX BC_set * bc= new BC_set(*dynamic_cast(e)); if (complextype && !bc->complextype) { bc->CastToK() ; if(verbosity > 10) cout << " Bc to complex " << endl; } //else bc->mapping(&CCastToR) ; //cout << l << " ll->l " << ll->l << " " << ll->l->isoptimize <* >(),false)); } VF=isVF(op->largs); // cout << " Problem ) VF = " << VF << endl; complextype = FieldOfForm(op->largs,iscomplex) ; // Warning do the casting of all expression in double or complex if( complextype && !iscomplex) CompileError("Error: Problem a complex problem with no complex FE function "); if( verbosity > 1) cout << " -- Problem type ( complex : " << complextype << " ) " <nbitem(); E_Array * vvi(dynamic_cast< E_Array *>(f)); if ( ! vvi) return 0; E_Array & vi(*vvi); Expression febase=0; for (size_t i=0;i() ); const E_FEcomp * comp=dynamic_cast *>( vi[i].LeftValue()) ; if (!(comp && comp->comp == (int) i && comp->N == (int) N)) return 0; if (!febase) febase = comp->a0; else if(comp->a0 != febase) return 0; } return febase; } template Call_FormBilinear::Call_FormBilinear(int dd,Expression * na,Expression BB,Expression fi, Expression fj) : d(dd),nargs(na),largs(),N(fi->nbitem()),M(fj->nbitem()), euh(fi), evh(fj) { assert(nargs ); const C_args * LLL=dynamic_cast(BB); if (!LLL) CompileError("Sorry the variationnal form (varf) is not a the variationnal form (type const C_args *)"); largs=LLL->largs; } template Call_FormLinear::Call_FormLinear(int dd,Expression *na,Expression LL, Expression ft) : d(dd),largs(),nargs(na),N(ft->nbitem()), ppfes(ft)//IsFebaseArray(ft)) { const C_args * LLL=dynamic_cast(LL); if ( !LLL) CompileError("The parameter of a LinearForm must be a array of all componate of FE function"); largs=LLL->largs; } bool C_args::IsLinearOperator() const { // int n=largs.size(); aType tRn =atype* >(); aType tCn =atype* >(); for (const_iterator i=largs.begin(); i != largs.end();i++) { C_F0 c= *i; // Expression e=c; aType r=c.left(); if ( ( r != atype() ) && ( r != atype() ) && ( r != atype::plusAx >() ) && ( r != atype::plusAtx >() ) && ( r != atype::plusAx >() ) && ( r != atype::plusAtx >() ) && ( r != tRn) && ( r != tCn) ) return false; } return true;} bool C_args::IsBilinearOperator() const { //int n=largs.size(); aType tRn =atype* >(); aType tCn =atype* >(); for (const_iterator i=largs.begin(); i != largs.end();i++) { C_F0 c= *i; //Expression e=c; aType r=c.left(); if ( ( r!= atype() ) && ( r != atype() ) && ( r != tRn) && ( r != tCn) ) return false; } return true;} void SetArgsFormLinear(const ListOfId *lid,int ordre) { // the local parameter are // ordre ==2 => bilinear form unknown (newU_) and test function (newV_) // ordre ==1 => linear form just test function (newV_) // --------------------- throwassert(ordre >0 && ordre <=2 && (lid || lid->size()>0 ) ); const ListOfId & l(*lid); int nb=l.size(); int n=0; C_F0 type,init; int nbarray=0; ListOfId * array[2]; aType uh=atype(),vh=atype(); for (int i=0;isize();iNewID(uh,idi.id,C_F0(newU_(i),uh)); else // test function currentblock->NewID(vh,idi.id,C_F0(newV_(i),vh)); } else CompileError(" Just Variable in array parameter "); } } else if (nbarray==0) { // a supprimer to remove in case of bilinear SHOWVERB(cout << "SetArgs:: form set parameter " << endl); if( ! ( ordre==1 || n%2==0) ) CompileError(" Error in test or unkwon function (odd number of function) "); ffassert( ordre==1 || n%2==0); int nn=ordre==1 ? 0 : n/2; // ordre == 1 => no unknown function just test function for (int i=0,j=0;iNewID(uh,l[i].id,C_F0(newU_(j%nn),uh)); else currentblock->NewID(vh,l[i].id,C_F0(newV_(j%nn),vh)); j++; } } else { CompileError(" Sorry you mixte formulation with and without array "); } } const Fem2D::GQuadratureFormular & CDomainOfIntegration::FIV(Stack stack) const { using namespace Fem2D; if (nargs[8]) return *GetAny *>((*nargs[8])(stack)); int exact = 5; if (nargs[2]) exact= GetAny((*nargs[2])(stack))-1; GQuadratureFormular *qf=QF_Simplex(exact);//QF_Tria_exact(exact); if(verbosity>99 && qf ) cout << " QF Tet n:" << qf->n << " exact = " << exact << endl; if(qf) return *qf; /* if( QuadratureFormular_T_1.exact >= exact ) return QuadratureFormular_T_1; if( QuadratureFormular_T_2.exact >= exact ) return QuadratureFormular_T_2; if( QuadratureFormular_T_5.exact >= exact ) return QuadratureFormular_T_5; if( QuadratureFormular_T_7.exact >= exact ) return QuadratureFormular_T_7; if( QuadratureFormular_T_9.exact >= exact ) return QuadratureFormular_T_9; */ static long count = 0; if(verbosity > 1 && count++ < 5) cerr << "Warning : Max Order of the Quadrature Formular Tet is 6 and expect: " << exact+1 << endl; // ExecError(" We find no Quadrature Formular on Tet for this order: too high"); return QuadratureFormular_Tet_5; } const Fem2D::QuadratureFormular & CDomainOfIntegration::FIT(Stack stack) const { using namespace Fem2D; if (nargs[0]) return *GetAny((*nargs[0])(stack)); int exact = 5; if (nargs[2]) exact= GetAny((*nargs[2])(stack))-1; QuadratureFormular *qf=QF_Simplex(exact);//QF_Tria_exact(exact); if(verbosity>99 && qf ) cout << " QF Tria n:" << qf->n << " exact = " << exact << endl; if(qf) return *qf; /* if( QuadratureFormular_T_1.exact >= exact ) return QuadratureFormular_T_1; if( QuadratureFormular_T_2.exact >= exact ) return QuadratureFormular_T_2; if( QuadratureFormular_T_5.exact >= exact ) return QuadratureFormular_T_5; if( QuadratureFormular_T_7.exact >= exact ) return QuadratureFormular_T_7; if( QuadratureFormular_T_9.exact >= exact ) return QuadratureFormular_T_9; */ cerr << " Order of the Quadature Formular: order = " << exact+1 << " exact = " << exact << endl; ExecError("Sorry, we find no Quadrature Formular on Triangle for this order: too high."); return QuadratureFormular_T_1; } const Fem2D::QuadratureFormular1d & CDomainOfIntegration::FIE(Stack stack) const { using namespace Fem2D; if (nargs[1]) return *GetAny((*nargs[1])(stack)); int exact = 5; if (nargs[2]) exact= GetAny((*nargs[2])(stack))-1; QuadratureFormular1d *qf=QF_Simplex(exact);//QF_1d_exact(exact); if(verbosity>99 && qf ) cout << " QF 1d n:" << qf->n << " exact = " << exact << endl; if(qf) return *qf; /* if( 1 >= exact ) return QF_GaussLegendre1; if( 3 >= exact ) return QF_GaussLegendre2; if( 5 >= exact ) return QF_GaussLegendre3; if( 7 >= exact ) return QF_GaussLegendre4; if( 9 >= exact ) return QF_GaussLegendre5; */ cerr << " Ordre of the Integration Formular on Edge, order = " << exact+1 << " exact = " << exact << endl; ExecError(" We find no Quadrature Formular on Edge for this order: too high."); return QF_GaussLegendre1; } namespace Fem2D { // instantiation des template en double template bool AssembleVarForm,FESpace >(Stack stack,const FESpace::Mesh & Th, const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,const list &largs ); template bool AssembleVarForm,FESpace3 >(Stack stack,const FESpace3::Mesh & Th, const FESpace3 & Uh,const FESpace3 & Vh,bool sym, MatriceCreuse * A,KN_ * B,const list &largs ); template bool AssembleVarForm, double>,FESpace >(Stack stack,const FESpace::Mesh & Th, const FESpace & Uh,const FESpace & Vh,bool sym, map< pair, double> * A,KN_ * B,const list &largs ); //3d -> template bool AssembleVarForm, double>,FESpace3 >(Stack stack,const FESpace3::Mesh & Th, const FESpace3 & Uh,const FESpace3 & Vh,bool sym, map< pair, double> * A,KN_ * B,const list &largs ); template void AssembleLinearForm(Stack stack,const Mesh & Th,const FESpace & Vh,KN_ * B,const FormLinear * const l); template void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse & A, const FormBilinear * b ); template void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, map, double > & A, const FormBilinear * b ); // instantiation des template en Complex template bool AssembleVarForm,FESpace >(Stack stack,const FESpace::Mesh & Th, const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,const list &largs ); template bool AssembleVarForm, Complex >,FESpace >(Stack stack,const FESpace::Mesh & Th, const FESpace & Uh,const FESpace & Vh,bool sym, map, Complex > * A,KN_ * B,const list &largs ); // 3d template bool AssembleVarForm,FESpace3 >(Stack stack,const FESpace3::Mesh & Th, const FESpace3 & Uh,const FESpace3 & Vh,bool sym, MatriceCreuse * A,KN_ * B,const list &largs ); template bool AssembleVarForm, Complex >,FESpace3 >(Stack stack,const FESpace3::Mesh & Th, const FESpace3 & Uh,const FESpace3 & Vh,bool sym, map, Complex > * A,KN_ * B,const list &largs ); // 3d fin //template bool AssembleVarForm, Complex> >(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, // map< pair, Complex> * A,KN * B,const list &largs ); template void AssembleLinearForm(Stack stack,const Mesh & Th,const FESpace & Vh,KN_ * B,const FormLinear * const l); template void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse & A, const FormBilinear * b ); template void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, map, Complex > & A, const FormBilinear * b ); //template void AssembleBC(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, // MatriceCreuse * A,KN_ * B,KN_ * X, const BC_set * bc , double tgv ); // template void AssembleBC(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, // MatriceCreuse * A,KN_ * B,KN_ * X, const BC_set * bc , double tgv ); template void AssembleBC(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); template void AssembleBC(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); template void AssembleBC(Stack stack,const Mesh3 & Th,const FESpace3 & Uh,const FESpace3 & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); template void AssembleBC(Stack stack,const Mesh3 & Th,const FESpace3 & Uh,const FESpace3 & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); } template class Call_FormLinear; template class Call_FormLinear; template class Call_FormBilinear; template class Call_FormBilinear; freefem++-3.38-1/src/fflib/problem.hpp000644 000767 000024 00000140331 12542556466 017647 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROBLEM_HPP_ #define PROBLEM_HPP_ extern Block *currentblock; template class Matrice_Creuse; template class MatriceCreuse; namespace Fem2D { template class SolveGCPrecon; template class SolveGMRESPrecon; template class SolveGMRESDiag; // int IsoLineK(double *f,R2 *Q,double eps); } #include "P1IsoValue.hpp" template class SolveGCDiag; class Plot; class v_fes; typedef FEbase * pferbase ; typedef FEbaseArray * pferbasearray ; typedef pair pfer ; typedef pair pferarray ; typedef FEbase * pfecbase ; typedef FEbaseArray * pfecbasearray ; typedef pair pfec ; typedef pair pfecarray ; //typedef pair pmesharray ; typedef LinearComb Finconnue; typedef LinearComb Ftest; typedef LinearComb,C_F0> Foperator; inline int intOp(const MGauche &i) {return i.second;} inline int intOp(const MDroit &i) {return i.second;} inline int intOp(pair & p) {return Max(intOp(p.first),intOp(p.second));} inline void SetOp(KN_ & d,const MGauche &i) { d[i.second% last_operatortype]=true;} inline void SetOp(KN_ & d,const MDroit &i) { d[(int) i.second % last_operatortype]=true;} inline void SetOp(KN_ & d,const pair & p) {SetOp(d,p.first);SetOp(d,p.second);} inline unsigned int GetDiffOp(const MGauche &i, int& lastop) {int op=(i.second% last_operatortype); lastop=max(lastop,op) ; return 1< &p, int& lastop) { return GetDiffOp(p.first,lastop)|GetDiffOp(p.second,lastop);} typedef const Finconnue finconnue; typedef const Ftest ftest; typedef const Foperator foperator; Expression IsFebaseArray(Expression f); void SetArgsFormLinear(const ListOfId *lid,int ordre); inline ostream & operator<<(ostream & f,const TypeSolveMat & tm) { switch(tm.t) { case TypeSolveMat::NONESQUARE: f << "No Square (Sparse Morse)"; break; case TypeSolveMat::LU: f << "LU (Skyline)"; break; case TypeSolveMat::CROUT: f << "CROUT (Skyline)"; break; case TypeSolveMat::CHOLESKY: f << "CHOLESKY (Skyline)"; break; case TypeSolveMat::GC: f << "CG (Sparse Morse)"; break; case TypeSolveMat::GMRES: f << "GMRES (Sparse Morse)"; break; case TypeSolveMat::SparseSolver: f << "SparseSolver (Sparse Morse)"; break; default: f << "Unknown bug???"; } return f; } class C_args: public E_F0mps {public: typedef const C_args * Result; list largs; typedef list ::const_iterator const_iterator ; // il faut expendre C_args() :largs(){} C_args(C_F0 c) : largs() { if(!c.Zero() )largs.push_back(c);} C_args( const basicAC_F0 & args) :largs(){ int n=args.size(); for (int i=0;i< n;i++) { if(args[i].Zero()) ; // skip zero term ... else if (args[i].left() == atype()) { const C_args * a = dynamic_cast(args[i].LeftValue()); for (list::const_iterator i=a->largs.begin();i!=a->largs.end();i++) largs.push_back(*i); } else largs.push_back(args[i]); };} static ArrayOfaType typeargs() { return ArrayOfaType(true);} AnyType operator()(Stack ) const { return SetAny(this);} operator aType () const { return atype();} static E_F0 * f(const basicAC_F0 & args) { return new C_args(args);} bool Zero() { return !largs.empty();} bool IsLinearOperator() const; bool IsBilinearOperator() const; }; class C_args_minus: public C_args {public: C_args_minus( const basicAC_F0 & args) { int n=args.size(); ffassert(n==2); if (args[0].left() == atype()) { const C_args * a = dynamic_cast(args[0].LeftValue()); ffassert(a); for (list::const_iterator i=a->largs.begin();i!=a->largs.end();i++) largs.push_back(*i); } else largs.push_back(args[0]); largs.push_back(C_F0(TheOperators,"-",args[1])); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),true);} static E_F0 * f(const basicAC_F0 & args) { return new C_args_minus(args);} }; bool isVF(const list & largs); template class Minus_Form: public E_F0mps {public: typedef const F * Result; static ArrayOfaType typeargs() { return ArrayOfaType(atype());} static E_F0 * f(const basicAC_F0 & args) { int n=args.size(); ffassert(n==1); aType tF=atype(); ffassert(args[0].left() == tF); Result f = dynamic_cast(args[0].LeftValue()); ffassert(f); // F mf = -*f; F * rf=new F(-*f); return rf; } operator aType () const { return atype();} }; //template class BC_set : public E_F0mps { public: bool complextype; typedef const BC_set* Result; vector on; vector onis; vector > bc; // n de l'inconnue+ valeur BC_set( const basicAC_F0 & args) :on(args.size()),onis(args.size()) { int n = args.size(); ffassert(args.named_parameter); AC_F0::const_iterator ii=args.named_parameter->begin(); AC_F0::const_iterator ie=args.named_parameter->end(); bc.resize(args.named_parameter->size()); complextype=false; for (int kk=0;ii!=ie;kk++,ii++) { if( ! BCastTo(ii->second)) complextype = true; } ii=args.named_parameter->begin(); for (int kk=0;ii!=ie;kk++,ii++) { // C_F0 x=Find(ii->first); if (x.left() != atype()) CompileError("We expected an unkown u=... of the problem"); const finconnue * uu = dynamic_cast(x.LeftValue()); ffassert(uu); const MGauche *ui=uu->simple(); ffassert(ui && ui->second == op_id); if(verbosity>9) cout << " on : " << ii->first << " n " << ui->first << " = ? " << endl; if (complextype) bc[kk]= make_pair(ui->first,CastTo(ii->second)); else bc[kk]= make_pair(ui->first,CastTo(ii->second)); //ii->second; } // sort bc / num de composante std::sort(bc.begin(),bc.end()); if(verbosity>9) for (vector >::iterator i=bc.begin(); i !=bc.end();++i) cout <<" on " << i->first << " " << i->second << endl; for (int i=0;i >(args[i])) { on[i]=CastTo(args[i]); onis[i]=0; } else { on[i]=CastTo >(args[i]); onis[i]=1; } } template void CastToK() { aType rr = complextype ? atype() : atype(); if (rr == atype()) complextype= true; if(verbosity > 10) cout << " CastToK => " << complextype < >::iterator k=bc.begin();k!=bc.end();k++) k->second=CastTo(C_F0(k->second,rr)) ; } /* De // ajout modif FH mai 2007 XXXXXXXXXXXXX.... void mappingC(C_F0 (*f)(const C_F0 &)) { for ( vector >::iterator k=bc.begin();k!=bc.end();k++) k->second=CastTo(C_F0(k->second,rr)) ;} // fin ajout */ static ArrayOfaType typeargs() { return ArrayOfaType(/*atype(),*/true);} // change frev 2011 FH... AnyType operator()(Stack ) const { return SetAny(this);} operator aType () const { return atype();} static E_F0 * f(const basicAC_F0 & args) { return new BC_set(args);} // void init(Stack stack) const {} }; class CDomainOfIntegration: public E_F0mps { public: static const int n_name_param =10; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; enum typeofkind { int2d=0, int1d=1, intalledges=2,intallVFedges=3, int3d = 4, intallfaces= 5,intallVFfaces=6 } ; //3d typeofkind kind; // 0 int d; // 3d typedef const CDomainOfIntegration* Result; Expression Th; vector what; vector whatis; // 0 -> long , 1 -> array ??? CDomainOfIntegration( const basicAC_F0 & args,typeofkind b=int2d,int ddim=2) // 3d :kind(b),d(ddim), Th(0), what(args.size()-1),whatis(args.size()-1) { args.SetNameParam(n_name_param,name_param,nargs); if(d==2) // 3d Th=CastTo(args[0]); else if(d==3) Th=CastTo(args[0]); else ffassert(0); // a faire int n=args.size(); for (int i=1;i >(args[i]) ) { whatis[i-1]=0; what[i-1]=CastTo(args[i]); } else { whatis[i-1]=1; what[i-1]=CastTo >(args[i]); } // cout << " CDomainOfIntegration " << this << endl; } static ArrayOfaType typeargs() { return ArrayOfaType(atype(), true);} // all type AnyType operator()(Stack ) const { return SetAny(this);} operator aType () const { return atype();} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args);} const Fem2D::QuadratureFormular & FIT(Stack) const ; const Fem2D::QuadratureFormular1d & FIE(Stack) const ; const Fem2D::GQuadratureFormular & FIV(Stack) const ; // 3d long UseOpt(Stack s) const { return nargs[5] ? GetAny( (*(nargs[5]))(s) ) : 1;} double binside(Stack s) const { return nargs[6] ? GetAny( (*(nargs[6]))(s) ) : 0;} // truc pour FH bool intmortar(Stack s) const { return nargs[7] ? GetAny( (*(nargs[7])) (s) ) : 1;} // truc pour double levelset(Stack s) const { return nargs[9] ? GetAny( (*(nargs[9]))(s) ) : 0;} bool islevelset() const { return nargs[9] != 0; } }; class CDomainOfIntegrationBorder: public CDomainOfIntegration { public: CDomainOfIntegrationBorder( const basicAC_F0 & args) :CDomainOfIntegration(args,int1d) {} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args,int1d);} }; class CDomainOfIntegrationAllEdges: public CDomainOfIntegration { public: CDomainOfIntegrationAllEdges( const basicAC_F0 & args) :CDomainOfIntegration(args,intalledges) {} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args,intalledges);} }; class CDomainOfIntegrationVFEdges: public CDomainOfIntegration { public: CDomainOfIntegrationVFEdges( const basicAC_F0 & args) :CDomainOfIntegration(args,intallVFedges) {} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args,intallVFedges);} }; // add for the 3d case .. // 3d class CDomainOfIntegration3d: public CDomainOfIntegration { public: CDomainOfIntegration3d( const basicAC_F0 & args) :CDomainOfIntegration(args,int3d,3) {} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args,int3d,3);} static ArrayOfaType typeargs() { return ArrayOfaType(atype(), true);} // all type }; class CDomainOfIntegrationBorder3d: public CDomainOfIntegration { public: CDomainOfIntegrationBorder3d( const basicAC_F0 & args) :CDomainOfIntegration(args,int2d,3) {} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args,int2d,3);} static ArrayOfaType typeargs() { return ArrayOfaType(atype(), true);} // all type }; class CDomainOfIntegrationAllFaces: public CDomainOfIntegration { public: CDomainOfIntegrationAllFaces( const basicAC_F0 & args) :CDomainOfIntegration(args,intallfaces,3) {} static E_F0 * f(const basicAC_F0 & args) { return new CDomainOfIntegration(args,intallfaces,3);} static ArrayOfaType typeargs() { return ArrayOfaType(atype(), true);} // all type }; // end add // hack build template template struct CadnaType{ typedef T Scalaire; }; #ifdef HAVE_CADNA #include // specialisation template<> struct CadnaType >{ typedef complex Scalaire; }; template<> struct CadnaType { typedef double_st Scalaire; }; inline double_st conj(const double_st &x){ return x;}; inline complex conj(const complex &x){ return complex(x.real(),-x.imag());} inline double norm(complex x){return x.real()*x.real()+x.imag()*x.imag();} inline double norm(double_st x){return x*x;} inline int cestac(const complex & z) {return min(cestac(z.real()),cestac(z.imag()));} #endif class Problem : public Polymorphic { // typedef double R; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =3+NB_NAME_PARM_MAT; // modi FH oct 2005 add tol_pivot 02/ 2007 add nbiter int Nitem,Mitem; const int dim; public: template struct Data { typedef typename FESpace::Mesh Mesh; const Mesh * pTh; CountPointer Uh; CountPointer Vh; CountPointer > AR; CountPointer > AC; typedef CadnaType::Scalaire double_st; typedef CadnaType >::Scalaire cmplx_st; MatriceCreuse * AcadnaR; MatriceCreuse * AcadnaC; void init() {pTh=0; AcadnaR=0;AcadnaC=0; Uh.init(),Vh.init();AR.init();AC.init();} void destroy() { pTh=0; Uh.destroy(); Vh.destroy(); AR.destroy(); AC.destroy(); if(AcadnaR) AcadnaR->destroy(); if(AcadnaC) AcadnaC->destroy(); } } ; const OneOperator *precon; C_args *op; // the list of all operator mutable vector var; // list des var pour les solutions et test bool complextype,VF; // Expression noinit,type,epsilon; Expression nargs[n_name_param]; const size_t offset; Problem(const C_args * ca,const ListOfId &l,size_t & top) ; static ArrayOfaType typeargs() { return ArrayOfaType(true);}// all type Data * dataptr (Stack stack) const {return (Data *) (void *) (((char *) stack)+offset);} Data * dataptr3 (Stack stack) const {return (Data *) (void *) (((char *) stack)+offset);} void init(Stack stack) const { // cout << " init " << (char *) dataptr(stack) - (char*) stack << " " << offset << endl; if(dim==2) dataptr(stack)->init(); else dataptr3(stack)->init(); } void destroy(Stack stack) const { if(dim==2) dataptr(stack)->destroy(); else dataptr3(stack)->destroy(); } template AnyType eval(Stack stack,Data * data,CountPointer > & dataA, MatriceCreuse< typename CadnaType::Scalaire > * & dataCadna) const; AnyType operator()(Stack stack) const { if(dim==2) { Data *data= dataptr(stack); if (complextype) return eval(stack,data,data->AC,data->AcadnaC); else return eval(stack,data,data->AR,data->AcadnaR); } else if(dim==3) { Data *data= dataptr3(stack); if (complextype) return eval(stack,data,data->AC,data->AcadnaC); else return eval(stack,data,data->AR,data->AcadnaR); } else ffassert(0); } bool Empty() const {return false;} size_t nbitem() const { return Nitem;} }; class Solve : public Problem { public: // just a problem with implicit solve Solve(const C_args * ca,const ListOfId &l,size_t & top) : Problem(new C_args(*ca),l,top) {} }; class FormBilinear : public E_F0mps { public: typedef const FormBilinear* Result; typedef const CDomainOfIntegration * A; typedef const foperator * B; A di; Foperator * b; FormBilinear(const basicAC_F0 & args) { di= dynamic_cast(CastTo(args[0])); B bb= dynamic_cast(CastTo(args[1])); // b = bb->Optimize(currentblock); // FH1004 b=new Foperator(*bb); // FH1004 no optimisation here because we don't the type of the bilinear form here. // the opimisation is done after in FieldOfForm routine // to find if the form is real or complex // delete bb; il ne faut pas detruire .. car bb peut etre dans une variable ffassert(di && b); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype());}// all type AnyType operator()(Stack ) const { return SetAny(this);} operator aType () const { return atype();} static E_F0 * f(const basicAC_F0 & args) { return new FormBilinear(args);} FormBilinear(A a,Expression bb) : di(a),b(new Foperator(*dynamic_cast(bb))/*->Optimize(currentblock) FH1004 */) {ffassert(b);} FormBilinear operator-() const { return FormBilinear(di,C_F0(TheOperators,"-",C_F0(b,atype())));} bool VF() const { return MaxOp(b) >= last_operatortype;} int dim() const {return di->d;} FormBilinear(const FormBilinear & fb) : di(fb.di),b(new Foperator(*fb.b) ) {} // void init(Stack stack) const {} }; //template class FormLinear : public E_F0mps { public: typedef const FormLinear* Result; typedef const CDomainOfIntegration * A; typedef const ftest * B; A di; Ftest * l; FormLinear(const basicAC_F0 & args) { di= dynamic_cast(CastTo(args[0])); assert(di); Expression a1=CastTo(args[1]); assert(a1); // cout << " ---FormLinear: "<< a1 << " " << typeid(*a1).name() << *a1 <(a1); assert(ll); l = new Ftest(*ll); // FH1004 ->Optimize(currentblock); same as bilinear // delete ll; // il ne faut pas detruire car ll peut etre dans une variable assert(l); ffassert(di && l); } bool VF() const { return MaxOp(l) >= last_operatortype;} static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype());}// all type AnyType operator()(Stack ) const { return SetAny(this);} operator aType () const { return atype();} int dim() const {return di->d;} static E_F0 * f(const basicAC_F0 & args) { return new FormLinear(args);} FormLinear(A a,Expression bb) : di(a),l(new Ftest(*dynamic_cast(bb))/*->Optimize(currentblock) FH1004 */) {ffassert(l);} FormLinear operator-() const { return FormLinear(di,C_F0(TheOperators,"-",C_F0(l,atype())));} // void init(Stack stack) const {} FormLinear(const FormLinear & fb) : di(fb.di),l(new Ftest(*fb.l) ) {} }; template class Call_FormLinear: public E_F0mps { public: const int d; list largs; Expression *nargs; typedef list::const_iterator const_iterator; const int N; Expression ppfes; Call_FormLinear(int dd,Expression * na,Expression LL, Expression ft) ; AnyType operator()(Stack stack) const { InternalError(" bug: no eval of Call_FormLinear ");} operator aType () const { return atype();} }; template class Call_FormBilinear: public E_F0mps { public: const int d; Expression *nargs; list largs; typedef list::const_iterator const_iterator; const int N,M; Expression euh,evh; Call_FormBilinear(int dd,Expression * na,Expression LL, Expression fi,Expression fj) ; AnyType operator()(Stack stack) const { InternalError(" bug: no eval of Call_FormBilinear ");} operator aType () const { return atype();} }; struct OpCall_FormLinear_np { static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =1; }; struct OpCall_FormBilinear_np { static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =1+NB_NAME_PARM_MAT; // 9-> 11 FH 31/10/2005 11->12 nbiter 02/2007 // 12->22 MUMPS+ Autre Solveur 02/08 }; template struct OpCall_FormLinear : public OneOperator, public OpCall_FormLinear_np { typedef v_fes *pfes; E_F0 * code(const basicAC_F0 & args) const { Expression * nargs = new Expression[n_name_param]; args.SetNameParam(n_name_param,name_param,nargs); return new Call_FormLinear(v_fes::d,nargs,to(args[0]),to(args[1]));} OpCall_FormLinear() : OneOperator(atype*>(),atype(),atype()) {} }; template struct OpCall_FormLinear2 : public OneOperator, public OpCall_FormLinear_np { static const int d=v_fes::d; typedef v_fes *pfes; E_F0 * code(const basicAC_F0 & args) const { Expression * nargs = new Expression[this->n_name_param]; args.SetNameParam(this->n_name_param,this->name_param,nargs); Expression p=args[1]; if ( ! p->EvaluableWithOutStack() ) { CompileError(" a(long,Vh) , The long must be a constant, and = 0, sorry");} long pv = GetAny((*p)(NullStack)); if ( pv ) { CompileError(" a(long,Vh) , The long must be a constant == 0, sorry");} return new Call_FormLinear(v_fes::d,nargs,to(args[0]),to(args[2]));} OpCall_FormLinear2() : OneOperator(atype*>(),atype(),atype(),atype()) {} }; template struct OpCall_FormBilinear : public OneOperator , OpCall_FormBilinear_np { typedef v_fes *pfes; static const int d=v_fes::d; E_F0 * code(const basicAC_F0 & args) const { Expression * nargs = new Expression[n_name_param]; args.SetNameParam(n_name_param,name_param,nargs); // cout << " OpCall_FormBilinear " << *args[0].left() << " " << args[0].LeftValue() << endl; return new Call_FormBilinear(v_fes::d,nargs,to(args[0]),to(args[1]),to(args[2]));} OpCall_FormBilinear() : OneOperator(atype*>(),atype(),atype(),atype()) {} }; bool FieldOfForm( list & largs ,bool complextype); template struct IsComplexType { static const bool value=false;}; template<> struct IsComplexType { static const bool value=true;}; template // to make x=linearform(x) struct OpArraytoLinearForm : public OneOperator { typedef typename Call_FormLinear::const_iterator const_iterator; const bool isptr; const bool init; const bool zero; class Op : public E_F0mps { public: Call_FormLinear *l; Expression x; const bool isptr; const bool init; const bool zero; AnyType operator()(Stack s) const ; Op(Expression xx,Expression ll,bool isptrr,bool initt,bool zzero) : l(new Call_FormLinear(*dynamic_cast *>(ll))), x(xx), isptr(isptrr),init(initt),zero(zzero) {assert(l); bool iscmplx=FieldOfForm(l->largs,IsComplexType::value); //cout<< "FieldOfForm:iscmplx " << iscmplx << " " << IsComplexType::value << " " <<( (iscmplx) == IsComplexType::value) << endl; ffassert( (iscmplx) == IsComplexType::value); } operator aType () const { return atype *>();} }; E_F0 * code(const basicAC_F0 & args) const { if(isptr) return new Op(to *>(args[0]),args[1],isptr,init,zero); else return new Op(to >(args[0]),args[1],isptr,init,zero);} // OpArraytoLinearForm(const basicForEachType * tt) : // OneOperator(atype >(),tt,atype()),init(false),isptr(false) {} OpArraytoLinearForm(const basicForEachType * tt,bool isptrr, bool initt,bool zzero=1) : OneOperator(atype >(),tt,atype*>()), isptr(isptrr), init(initt),zero(zzero) {} }; template // to make A=linearform(x) struct OpMatrixtoBilinearForm : public OneOperator { typedef typename Call_FormBilinear::const_iterator const_iterator; int init; class Op : public E_F0mps { public: Call_FormBilinear *b; Expression a; int init; AnyType operator()(Stack s) const ; Op(Expression aa,Expression bb,int initt) : b(new Call_FormBilinear(* dynamic_cast *>(bb))),a(aa),init(initt) { assert(b && b->nargs); bool iscmplx=FieldOfForm(b->largs,IsComplexType::value) ; // cout<< "FieldOfForm:iscmplx " << iscmplx << " " << IsComplexType::value << " " << ((iscmplx) == IsComplexType::value) << endl; ffassert( (iscmplx) == IsComplexType::value); } operator aType () const { return atype *>();} }; E_F0 * code(const basicAC_F0 & args) const { return new Op(to*>(args[0]),args[1],init);} OpMatrixtoBilinearForm(int initt=0) : OneOperator(atype*>(),atype*>(),atype*>()), init(initt) {} }; template class IntFunction : public E_F0mps { public: typedef R Result; typedef const CDomainOfIntegration * A; typedef R B; A di; Expression fonc; IntFunction(const basicAC_F0 & args) { di= dynamic_cast(CastTo(args[0])); fonc= CastTo(args[1]); ffassert(di && fonc); } static ArrayOfaType typeargs() { return ArrayOfaType(atype(),atype());}// all type AnyType operator()(Stack ) const; static E_F0 * f(const basicAC_F0 & args) { return new IntFunction(args);} // IntFunction(A a,Expression bb) : di(a),fonc(bb) {} operator aType () const { return atype();} }; extern Block *currentblock; class TypeFormOperator: public ForEachType { public: TypeFormOperator() : ForEachType(0,0) {} void SetArgs(const ListOfId *lid) const { SetArgsFormLinear(lid,2); } Type_Expr SetParam(const C_F0 & c,const ListOfId *l,size_t & top) const { return Type_Expr(this,CastTo(c));} inline C_F0 Initialization(const Type_Expr & e) const {return C_F0();} }; class TypeFormBilinear: public ForEachType { public: TypeFormBilinear() : ForEachType(0,0) {} void SetArgs(const ListOfId *lid) const { SetArgsFormLinear(lid,2); } Type_Expr SetParam(const C_F0 & c,const ListOfId *l,size_t & top) const { return Type_Expr(this,CastTo(c));} C_F0 Initialization(const Type_Expr & e) const { // cout << "Initialization " << *e.first << endl; return C_F0(); } // nothing to initialize Type_Expr construct(const Type_Expr & e) const { //cout << "construct " << *e.first << endl; return e; } }; template class TypeSolve : public ForEachType { public: TypeSolve() : ForEachType(0,0) {} void SetArgs(const ListOfId *lid) const { SetArgsFormLinear(lid,2); } Type_Expr SetParam(const C_F0 & c,const ListOfId *l,size_t & top) const { if (c.left() != atype()) CompileError(" Problem a(...) = invalid type ",c.left()); const C_args * ca = dynamic_cast(c.LeftValue()); Problem * pb=new Problem(ca,*l,top); SHOWVERB(cout << "solve:SetParam " << ca << " pb=" << pb << endl); return Type_Expr(this,pb); } class SolveInit: public E_F0 { public: const Problem * a; AnyType operator()(Stack s) const { a->init(s); return exec_init ? (*a)(s) : Nothing ; } SolveInit(const Type_Expr & te) : a(dynamic_cast(te.second)) { SHOWVERB(cout << "SolveInit " << te.second << endl); ffassert(a);} }; class SolveDel: public E_F0 { public: const Problem * a; SolveDel(const C_F0 & c) : a(dynamic_cast(c.LeftValue())) { SHOWVERB(cout << "SolveDel " << c.left() << endl); ffassert(a);} AnyType operator()(Stack s) const { a->destroy(s); return Nothing; }}; Expression Destroy(const C_F0 & c) const { return new SolveDel(c);} bool ExistDestroy() const {return true;} C_F0 Initialization(const Type_Expr & e) const { return C_F0( new SolveInit(e) ,atype()); } }; class TypeFormLinear: public ForEachType { public: TypeFormLinear() : ForEachType(0,0) {} void SetArgs(const ListOfId *lid) const { SetArgsFormLinear(lid,1); } Type_Expr SetParam(const C_F0 & c,const ListOfId *l,size_t & top) const { return Type_Expr(this,CastTo(c));} // { return Type_Expr(c.left(),c.LeftValue()); } // C_F0 Initialization(const Type_Expr & e) const { return C_F0(); } // nothing to initialize }; template class Matrice_Creuse { // CountPointer Uh,Vh; //pfes *pUh,*pVh; // pointeur sur la variable stockant FESpace; public: UniqueffId Uh,Vh; // pour la reconstruction // const void * pUh,pVh; // pointeur pour la reconstruction CountPointer > A; TypeSolveMat typemat; size_t count; void init() { count=0; A.init();Uh.init();Vh.init(); typemat=TypeSolveMat(TypeSolveMat::NONESQUARE);} Matrice_Creuse() { init();} void destroy() {// Correct Oct 2015 FH (avant test a 'envert) !!!! if(count--==0) A.destroy(); //else count--; // Uh.destroy(); //Vh.destroy(); } Matrice_Creuse( MatriceCreuse * aa)//,const pfes *ppUh,const pfes *ppVh) :A(aa){}//,pUh(ppUh),pVh(ppVh),Uh(*ppUh),Vh(*ppVh) {} Matrice_Creuse( MatriceCreuse * aa,const UniqueffId *pUh,const UniqueffId *pVh)//,const pfes *ppUh,const pfes *ppVh) :A(aa),Uh(*pUh),Vh(*pVh) {}//,pUh(ppUh),pVh(ppVh),Uh(*ppUh),Vh(*ppVh) {} long N() const {return A ? A->n : 0;} long M() const { return A ? A->m : 0;} void resize(int n,int m) { if(A) A->resize(n,m);} void increment(){ count++;} }; template class Matrice_Creuse_Transpose; template class Matrix_Prod { public: Matrice_Creuse *A; Matrice_Creuse *B; bool ta,tb; Matrix_Prod(Matrice_Creuse *AA,Matrice_Creuse *BB) : A(AA),B(BB),ta(false),tb(false) {assert(AA && BB);} Matrix_Prod(Matrice_Creuse_Transpose AA,Matrice_Creuse *BB) : A(AA),B(BB),ta(true),tb(false) {assert(AA && BB);} Matrix_Prod(Matrice_Creuse *AA,Matrice_Creuse_Transpose BB) : A(AA),B(BB),ta(false),tb(true) {assert(AA && BB);} Matrix_Prod(Matrice_Creuse_Transpose AA,Matrice_Creuse_Transpose BB) : A(AA),B(BB),ta(true),tb(true) {assert(AA && BB);} }; template ostream & operator << (ostream & f,const Matrice_Creuse & A) { if ( !A.A) f << " unset sparse matrix " << endl; else f << *A.A ; return f; } template istream & operator >> (istream & f,Matrice_Creuse & A) { if ( WhichMatrix(f)== 2 ) { // A.pUh=0; //A.pVh=0; A.A.master(new MatriceMorse(f)); A.typemat=(A.A->n == A.A->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) } else { cerr << " unkwon type of matrix " << endl; ExecError("Erreur read matrix "); A.A =0; } return f; } template class Matrice_Creuse_Transpose { public: Matrice_Creuse * A; Matrice_Creuse_Transpose(Matrice_Creuse * AA) : A(AA) {assert(A);} operator MatriceCreuse & () const {return *A->A;} operator Matrice_Creuse * () const {return A;} }; template class Matrice_Creuse_inv { public: Matrice_Creuse * A; Matrice_Creuse_inv(Matrice_Creuse * AA) : A(AA) {assert(A);} operator MatriceCreuse & () const {return *A->A;} operator Matrice_Creuse * () const {return A;} }; namespace Fem2D { inline void F_Pi_h(R* v, const R2 & P,const baseFElement & K,int i,const R2 & Phat,void * arg) { TabFuncArg &tabe(*(TabFuncArg*)arg); //MeshPoint & mp = *MeshPointStack(tabe.s); MeshPointStack(tabe.s)->set(P,Phat,K); tabe.eval(v); // if (Norme2_2(P-mp.P) > 1e-10) // cout << " bug?? F_Pi_h " << endl; } inline void FoX_1_Pi_h(R* v, const R2 & P,const baseFElement & K,int i,const R2 & Phat,void * arg) { TabFuncArg &tabe(*(TabFuncArg*)arg); MeshPointStack(tabe.s)->set(P,Phat,K); R2 X=tabe.eval_X(); MeshPointStack(tabe.s)->set(X.x,X.y); tabe.eval_2(v); } template bool AssembleVarForm(Stack stack,const typename FESpace::Mesh & Th, const FESpace & Uh,const FESpace & Vh,bool sym, MC * A,KN_ * B,const list &largs ); template void AssembleBC(Stack stack,const typename FESpace::Mesh & Th, const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); template void AssembleLinearForm(Stack stack,const Mesh & Th,const FESpace & Vh,KN_ * B,const FormLinear * const l); // template void AssembleBC(Stack stack,const Mesh3 & Th,const FESpace3 & Uh,const FESpace3 & Vh,bool sym, // MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); template void AssembleLinearForm(Stack stack,const Mesh3 & Th,const FESpace3 & Vh,KN_ * B,const FormLinear * const l); template void AssembleBC(Stack stack,const Mesh & Th3,const FESpace & Uh3,const FESpace & Vh3,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const BC_set * bc , double tgv ); template void Element_rhs(const FElement3 & Kv,int ie,int label,const LOperaD &Op,double * p,void * stack,KN_ & B,bool all,int optim); template void Element_rhs(const FElement3 & Kv,const LOperaD &Op,double * p,void * stack,KN_ & B,int optim); template void Element_Op(MatriceElementairePleine & mat,const FElement3 & Ku,const FElement3 & Kv,double * p,int ie,int label, void *stack,R3 *B); template void Element_Op(MatriceElementaireSymetrique & mat,const FElement3 & Ku,double * p,int ie,int label, void * stack,R3 *B); template void AssembleBC(Stack stack,const typename FESpace::Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse * A,KN_ * B,KN_ * X, const list &largs , double tgv ); // fin 3d template void Element_rhs(const FElement & Kv,int ie,int label,const LOperaD &Op,double * p,void * stack,KN_ & B,bool all,int optim); template void Element_rhs(const FElement & Kv,const LOperaD &Op,double * p,void * stack,KN_ & B,int optim); template void Element_Op(MatriceElementairePleine & mat,const FElement & Ku,const FElement & Kv,double * p,int ie,int label, void *stack,R2 *B); template void Element_Op(MatriceElementaireSymetrique & mat,const FElement & Ku,double * p,int ie,int label, void * stack,R2 *B); /*template void AssembleBilinearForm(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, MatriceCreuse & A, const FormBilinear * b ); */ // --------- FH 120105 //template void AssembleBC(Stack stack,const Mesh & Th,const FESpace & Uh,const FESpace & Vh,bool sym, // MatriceCreuse * A,KN_ * B,KN_ * X, const BC_set * bc , double tgv ); //------ } template AnyType OpArraytoLinearForm::Op::operator()(Stack stack) const { typedef v_fes *pfes; typedef typename v_fes::FESpace FESpace; typedef typename FESpace::Mesh Mesh; typedef typename FESpace::FElement FElement; typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::RdHat RdHat; typedef typename Mesh::Rd Rd; pfes & pp= *GetAny((*l->ppfes)(stack)); FESpace * pVh = *pp ; FESpace & Vh = *pVh ; double tgv= 1e30; if (l->nargs[0]) tgv= GetAny((*l->nargs[0])(stack)); long NbOfDF = &Vh ? Vh.NbOfDF: 0; KN *px=0; if(isptr) { px = GetAny * >((*x)(stack) ); if(init ) px->init(NbOfDF); if(px->N() != NbOfDF) //add Dec 2009 px->resize(NbOfDF); ffassert(px->N() == NbOfDF); } KN_ xx( px ? *(KN_ *) px : GetAny >((*x)(stack) )); if(zero && NbOfDF ) xx=R(); if ( & Vh && AssembleVarForm,FESpace >(stack,Vh.Th,Vh,Vh,false,0,&xx,l->largs) ) AssembleBC(stack,Vh.Th,Vh,Vh,false,0,&xx,0,l->largs,tgv); return SetAny >(xx); } template void SetSolver(Stack stack,bool VF,MatriceCreuse & A, Data_Sparse_Solver & ds) /*Stack stack,MatriceCreuse & A,const TypeSolveMat *typemat,bool VF,double eps,int NbSpace,int itmax, const OneOperator * const precon,int umfpackstrategy, double tgv, double tol_pivot,double tol_pivot_sym, int *param_int, double *param_double, string *param_char, int *perm_r, int *perm_c, string *file_param_int, string *file_param_double, string *file_param_char, string *file_param_perm_r, string *file_param_perm_c)*/ { using namespace Fem2D; const OneOperator* pprecon= static_cast(ds.precon); if (ds.typemat->profile) { MatriceProfile & AA(dynamic_cast &>(A)); ffassert(&AA); switch (ds.typemat->t) { case TypeSolveMat::LU : AA.typesolver=FactorizationLU; break; case TypeSolveMat::CROUT : AA.typesolver=FactorizationCrout; break; case TypeSolveMat::CHOLESKY : AA.typesolver=FactorizationCholeski; break; default: cerr << " type resolution " << ds.typemat->t <<" sym=" << ds.typemat->profile << endl; CompileError("type resolution unknown"); break; } } else { typedef typename MatriceMorse::VirtualSolver VirtualSolver; if(verbosity>5) cout << " Morse matrix GC Precond diag" << endl; MatriceMorse & AA(dynamic_cast &>(A)); ffassert(&AA); // ffassert(typemat->t==TypeSolveMat::GC); // using Fem2D; switch (ds.typemat->t) { case TypeSolveMat::GC: if (pprecon) AA.SetSolverMaster(static_cast( new Fem2D::SolveGCPrecon(AA,pprecon,stack,ds.itmax,ds.epsilon))); else AA.SetSolverMaster(static_cast( new SolveGCDiag(AA,ds.itmax,ds.epsilon))); break; case TypeSolveMat::GMRES : // InternalError("GMRES solveur to do"); if (pprecon) AA.SetSolverMaster(new SolveGMRESPrecon(AA,pprecon,stack,ds.NbSpace,ds.itmax,ds.epsilon)); else AA.SetSolverMaster(new SolveGMRESDiag(AA,ds.NbSpace,ds.itmax,ds.epsilon)); break; //#ifdef HAVE_LIBUMFPACK case TypeSolveMat::SparseSolver : AA.SetSolverMaster(DefSparseSolver::Build( stack,&AA,ds) ); // AA.SetSolverMaster(new SolveUMFPack(AA,umfpackstrategy,tgv,epsilon,tol_pivot,tol_pivot_sym)); break; //#endif default: if (verbosity >5) cout << " SetSolver:: no default solver " << endl; // cerr << " type resolution " << ds.typemat->t << endl; // CompileError("type resolution inconnue"); break; } } } template AnyType OpMatrixtoBilinearForm::Op::operator()(Stack stack) const { typedef typename v_fes::pfes pfes; typedef typename v_fes::FESpace FESpace; typedef typename FESpace::Mesh Mesh; typedef typename FESpace::FElement FElement; typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::RdHat RdHat; typedef typename Mesh::Rd Rd; assert(b && b->nargs);// *GetAny pfes * pUh= GetAny((*b->euh)(stack)); pfes * pVh= GetAny((*b->evh)(stack)); const FESpace & Uh = *(FESpace*) **pUh ; const FESpace & Vh = *(FESpace*) **pVh ; bool A_is_square= & Uh == & Vh || Uh.NbOfDF == Vh.NbOfDF ; // MatriceProfile *pmatpf=0; bool VF=isVF(b->largs); // assert(!VF); // bool factorize=false; Data_Sparse_Solver ds; ds.factorize=false; /* long NbSpace = 50; long itmax=0; double epsilon=1e-6; double tgv = 1e30; int strategy=0; double tol_pivot=-1; double tol_pivot_sym=-1; KN param_int; KN param_double; string *param_char = NULL; KN perm_r; KN perm_c; string *file_param_int; // Add J. Morice 02/09 string *file_param_double; string* file_param_char; string* file_param_perm_r; string* file_param_perm_c; */ TypeSolveMat tmat= ( & Uh == & Vh ? TypeSolveMat::GMRES : TypeSolveMat::NONESQUARE); ds.typemat=&tmat; ds.initmat=true; SetEnd_Data_Sparse_Solver(stack,ds, b->nargs,OpCall_FormBilinear_np::n_name_param); /* if (b->nargs[0]) initmat= ! GetAny((*b->nargs[0])(stack)); if (b->nargs[1]) typemat= *GetAny((*b->nargs[1])(stack)); if (b->nargs[2]) ds.epsilon= GetAny((*b->nargs[2])(stack)); if (b->nargs[4]) ds.NbSpace= GetAny((*b->nargs[4])(stack)); if (b->nargs[6]) ds.tgv= GetAny((*b->nargs[6])(stack)); if (b->nargs[7]) factorize= GetAny((*b->nargs[7])(stack)); if (b->nargs[8]) ds.strategy= GetAny((*b->nargs[8])(stack)); if (b->nargs[9]) ds.tol_pivot= GetAny((*b->nargs[9])(stack)); if (b->nargs[10]) ds.tol_pivot_sym= GetAny((*b->nargs[10])(stack)); if (b->nargs[11]) ds.itmax= GetAny((*b->nargs[11])(stack)); if (b->nargs[12]) ds.param_int= GetAny< KN >((*b->nargs[12])(stack)); // Add J. Morice 02/09 if (b->nargs[13]) ds.param_double= GetAny< KN >((*b->nargs[13])(stack)); if (b->nargs[14]) ds.param_char= GetAny< string * >((*b->nargs[14])(stack)); // if (b->nargs[15]) ds.perm_r = GetAny< KN< int > >((*b->nargs[15])(stack)); if (b->nargs[16]) ds.perm_c = GetAny< KN< int > >((*b->nargs[16])(stack)); // if (b->nargs[17]) ds.file_param_int= GetAny< string* >((*b->nargs[17])(stack)); // Add J. Morice 02/09 if (b->nargs[18]) ds.file_param_double= GetAny< string* >((*b->nargs[18])(stack)); if (b->nargs[19]) ds.file_param_char= GetAny< string* >((*b->nargs[19])(stack)); // if (b->nargs[20]) ds.file_param_perm_r = GetAny< string* >((*b->nargs[20])(stack)); if (b->nargs[21]) ds.file_param_perm_c = GetAny< string* >((*b->nargs[21])(stack)); // */ if (! A_is_square && *ds.typemat != TypeSolveMat::NONESQUARE) { cout << " -- Error the solver << "<< ds.typemat <<" is set on rectangular matrix " << endl; ExecError("A solver is set on a none square matrix!"); ds.typemat= &(tmat =TypeSolveMat::NONESQUARE); } /* const OneOperator *precon = static_cast (ds.precon); // a changer if ( ds.precon) { // const Polymorphic * op= dynamic_cast(precon); //ffassert(op); precon = ds.precon op->Find("(",ArrayOfaType(atype* >(),false)); } */ // change mars 2011 // for the gestion of the PTR. WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH aout 2007 Matrice_Creuse & A( * GetAny*>((*a)(stack))); if(init) A.init(); // if( !& Uh || !& Vh) return SetAny *>(&A); /* if ( (pUh != A.pUh ) || (pVh != A.pVh || A.typemat->t != typemat->t) ) { A.Uh.destroy(); A.Vh.destroy(); }*/ const Mesh & Th = Uh.Th; bool same=isSameMesh(b->largs,&Uh.Th,&Vh.Th,stack); if ( same) { A.typemat = *ds.typemat; if ( A.Uh != Uh || A.Vh != Vh ) { // reconstruct all the matrix A.A=0; // to delete old matrix ADD FH 16112005 A.Uh=Uh; A.Vh=Vh; if (ds.typemat->profile) { A.A.master( new MatriceProfile(Vh,VF) ); ffassert( &Uh == & Vh);} else if (ds.typemat->sym ) { A.A.master( new MatriceMorse(Vh,ds.typemat->sym,VF) ); ffassert( &Uh == & Vh);} else { A.A.master( new MatriceMorse(Vh,Uh,VF) ); // lines corresponding to test functions } } *A.A=R(); // reset value of the matrix if ( AssembleVarForm,FESpace >( stack,Th,Uh,Vh,ds.typemat->sym,A.A,0,b->largs) ) AssembleBC( stack,Th,Uh,Vh,ds.typemat->sym,A.A,0,0,b->largs,ds.tgv); } else { // add FH 17 06 2005 int on different meshes. map, R > AAA; bool bc=AssembleVarForm, R >,FESpace >( stack,Th,Uh,Vh,ds.typemat->sym,&AAA,0,b->largs); if (ds.typemat->profile) { ExecError(" Sorry, construction of Skyline matrix with different meshes is not implemented! ");} else { A.A.master( new MatriceMorse(Vh.NbOfDF,Uh.NbOfDF,AAA,ds.typemat->sym) ); } if (bc) AssembleBC( stack,Th,Uh,Vh,ds.typemat->sym,A.A,0,0,b->largs,ds.tgv); } if( A_is_square && ds.factorize ) { MatriceProfile * pf = dynamic_cast *>((MatriceCreuse *) A.A); assert(pf); switch (ds.typemat->t) { case TypeSolveMat::LU: pf->LU(Abs(ds.epsilon));break; case TypeSolveMat::CROUT: pf->crout(Abs(ds.epsilon));break; case TypeSolveMat::CHOLESKY: pf->cholesky(Abs(ds.epsilon));break; default: ExecError("Sorry no factorize for this type for matrix"); } } if (A_is_square) SetSolver(stack,VF,*A.A,ds); /*stack,*A.A,&typemat,VF,eps,NbSpace,itmax,precon,umfpackstrategy,tgv,tol_pivot,tol_pivot_sym, param_int, param_double, param_char, perm_r, perm_c, file_param_int, file_param_double, file_param_char, file_param_perm_r, file_param_perm_c );*/ return SetAny *>(&A); } bool SetGMRES(); bool SetCG(); #ifdef HAVE_LIBUMFPACK bool SetUMFPACK(); #endif /* template AnyType ProdMat(Stack,Expression ,Expression); template AnyType DiagMat(Stack,Expression ,Expression); template AnyType CopyTrans(Stack stack,Expression emat,Expression eA); template AnyType CopyMat(Stack stack,Expression emat,Expression eA); template AnyType CombMat(Stack stack,Expression emat,Expression combMat); template AnyType MatFull2Sparse(Stack stack,Expression emat,Expression eA); */ namespace FreeFempp { template class TypeVarForm { public: aType tFB; // aType tFB3; aType tMat; aType tMat3; aType tFL; //aType tFL3; aType tTab; aType tMatX; aType tMatTX; aType tDotStar; aType tBC ; // aType tBC3 ; TypeVarForm() : tFB( atype() ), //tFB3( atype *>() ), tMat( atype*>() ), // tMat3( atype*>() ), tFL( atype() ), //tFL3( atype *>() ), tTab( atype *>() ), tMatX( atype::plusAx >() ), tMatTX( atype::plusAtx >() ), tDotStar(atype< DotStar_KN_ >() ), tBC( atype()) { } static TypeVarForm *Global; }; } #endif freefem++-3.38-1/src/fflib/Serialize.hpp000644 000767 000024 00000005435 11464553225 020133 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SERIALEZE_HPP_ #define SERIALEZE_HPP_ #include #include "endian.hpp" struct MPIrank; class Serialize { // we store a refcounter in the pointer p a adresse p-sizeof(long) // so we can use the copy constructor protected: size_t lg; const char *what; char * p; public: Serialize(size_t lgg,const char * wht): lg(lgg), what(wht) , p((new char[lg+sizeof(long)])+sizeof(long)) { //cout << " begin count()=0 " << endl; count()=0; } void resize(size_t lgn) { // Add nov 2010 FH of asyncrone recv MPI ... if (lgn>lg) { char *p0= new char[lgn+sizeof(long)]; memcpy(p0,p-sizeof(long),lg+sizeof(long)); delete [] (p-sizeof(long)); p= p0+sizeof(long); } lg=lgn; } ~Serialize(){ if(count()--==0) delete [] (p-sizeof(long));} size_t size() const { return lg;} // mpi routine void mpisend(const MPIrank &,long tag,const void * comm); Serialize(const MPIrank &,const char * wht,long tag,const void * comm); // end mpi routine operator void *() { return p;} operator char *() { return p;} bool samewhat(const char * w) const { return strncmp(what,w,8)==0; } Serialize(const Serialize & s) : lg(s.lg), what(s.what) , p(s.p) { count()++; } template inline void get(size_t & k,T & x) const { T xx;//= r_endian(x); assert(k<=lg+sizeof(T)); memcpy(&xx,p+ k,sizeof(T)); k += sizeof(T); x=r_endian(xx); } template inline void put(size_t & k,const T & x) { if ( !(k<=lg+sizeof(T)) ) { cout << " assert put " << k << " <=" << lg + sizeof(T) << endl; assert((k<=lg+sizeof(T))); } T xx= w_endian(x); memcpy( p + k,&xx,sizeof(T)); k += sizeof(T); } protected: long & count() const { return * (long*) (void*) (p-sizeof(long));} private: void operator=(Serialize & s) ; // no affectation }; #endif freefem++-3.38-1/src/fflib/showverb.hpp000644 000767 000024 00000001753 11406226635 020040 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SHOWVERB #ifdef VERBOSE #define SHOWVERB(i) i #else #define SHOWVERB(i) ( (void)0) #endif #endif freefem++-3.38-1/src/fflib/String.hpp000644 000767 000024 00000012422 11406226635 017442 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef STRING_HPP_ #define STRING_HPP_ #include #include // BUG option compilation -fast /* template string * toString(const T& a) { ostringstream r; r << a ENDS ; return new string(r.str()); } */ // inline string * toString(const double& a) { char buf[30]; sprintf(buf,"%g",a); return new string(buf); } inline string * toString(const long& a) { char buf[30]; sprintf(buf,"%ld",a); return new string(buf); } inline string * toString(const bool& a) { return new string(a?"T":"F"); } inline string * toString(const complex & a) { char buf[60]; sprintf(buf,"%g%+gi",a.real(),a.imag()); return new string(buf); } inline string * toStringCconst(const char * const &a) { return new string(a); } inline string * toStringC( char * const &a) { return new string(a); } template string * PtoString(const T * a) { ostringstream r; r << *a ENDS; return new string(r.str()); } template AnyType PtoStringA(void *, const AnyType &a) { ostringstream r; r << *GetAny(a) ENDS ; return SetAny(new string(r.str())); } template AnyType toStringA(void *, const AnyType &a) { ostringstream r; r << GetAny(a) ENDS ; return SetAny(new string(r.str())); } class String { string * p; public: // String( string & pp) : p(&pp) {} String() : p(new string()) {/*cout << "String" << p <<","<< *p << endl;*/} void init() { p= new string();} // Add FH march 2010 void destroy() { delete p;p=0;} // Add FH march 2010 // String( string * c) : p(c) {cout << "String" << p <<","<< *p << endl;} String(const String & c) : p(new string(c)) {/*cout << "String" << p <<","<< *p << endl;*/} String(const string & c) : p(new string(c)) {/*cout << "String" << p <<","<< *p << endl;*/} String(const char * c) : p(new string(c)) {/*cout << "String" << p <<","<< *p << endl;*/} String(const long & c) : p(toString(c)){/*cout << "String" << p <<","<< *p << endl;*/} String(const double & c) : p(toString(c)){/*cout << "String" << p <<","<< *p << endl;*/} String(const bool & c) : p(toString(c)){/*cout << "String" << p <<","<< *p << endl;*/} String(const long * c) : p(PtoString(c)){/*cout << "String" << p <<","<< *p << endl;*/} String(const double * c) : p(PtoString(c)){/*cout << "String" << p <<","<< *p << endl;*/} String & operator=(const String & s){delete p;p=new string(s);return *this;} String operator+(const String & s)const {return String(new string(*p+*s.p));} ~String(){/* cout << "~String" << p << *p << endl;*/ delete p; p=0;} operator const string & () const {return *p;} operator string & () {return *p;} string ** getap() {return &p;} friend inline ostream & operator<<(ostream & f,const String & s) {throwassert(s.p); f << *s.p ; return f;} bool operator<(const String &t) const {assert(p && t.p);return *p<*t.p;} // correction FH feb 2004 bool operator>(const String &t) const {assert(p && t.p);return *p>*t.p;} // correction FH feb 2004 }; template class MyMap { public: map *m; MyMap() : m(new map) {/*cout << "new MyMap:: " << m << endl;*/} MyMap &operator=(MyMap &M){ // cout << " MyMap::= " << m << " = " << M.m << endl; delete m;m=new map(M); } V &operator[](const K & k) { throwassert(m); typename map::iterator i=m->find(k); // cout << k << " " << " end? " << (i==m->end()) << endl; // for( map::iterator ii=m->begin(); ii != m->end();ii++) // cout << " MyMap :: m="<< m << ": " << ii->first << " -> " << ii->second <::iterator j=m->find(k); // cout << " m->find(k)->second " << i->second << ";" << j->second <::value_type value_type; if (i==m->end()) i=m->insert(value_type(k,V())).first; V & v= i->second ; return v; } ~MyMap(){delete m;/*cout << "MyMap:: delete "<< m << endl;*/m=0;} private: MyMap(const MyMap &M):m(new map(*M.m)) {} }; template struct pairless : binary_function,const char *, bool> { typedef pair Key; bool operator()(const Key& x, const Key& y) const { return x.first,aType,pairless > Map_type_of_map; extern Map_type_of_map map_type_of_map ; // to store te type // of a map of A[B] #endif freefem++-3.38-1/src/fflib/string_def.cpp000644 000767 000024 00000011610 12035273044 020304 0ustar00hechtstaff000000 000000 //#pragma dont_inline on //#pragma inline_depth(1) #include "config-wrapper.h" #include #include "AFunction.hpp" #include #include #include "error.hpp" #include "lex.hpp" #include "RNM.hpp" #include "Operator.hpp" // for exec routine #include "rgraph.hpp" #include "InitFunct.hpp" #include #include "array_init.hpp" class SubString { public: string * s; long i,n; SubString(string **ss,long ii,long jj) :s(*ss),i(ii),n(jj) {} SubString(string **ss,const SubArray & sb) :s(*ss),i(sb.start),n(sb.n) {ffassert(sb.step==1);} }; extern Map_type_of_map map_type_of_map ; // to store te type extern Map_type_of_map map_pair_of_type ; // to store te type extern basicForEachType * typevarreal, * typevarcomplex; // type of real and complex variable extern int TheCurrentLine; // unset: by default extern long mpisize,mpirank; long get_size(string * p) { ffassert(p ) ; return p->size() ;} long get_sizep(string ** p) { ffassert(p && *p) ; return (*p)->size() ;} string ** get_replace(string ** pp,long i,long j, string *rr) { ffassert(pp && *pp ) ; string s=**pp; // copy modif for windows pb free s.replace(i,j,*rr); delete *pp; *pp = new string(s); return pp; } // a( : ) = "sqsd"; struct set_substring: public binary_function { static SubString f(SubString const & a, string *const & b) { string s=*a.s; s.replace(a.i,a.n,*b); * a.s = s; // bofbof pour windows return a;} }; SubString fSubString( string ** const & a,const SubArray & b) { return SubString(a,b);} template struct String_find { string *p; String_find(string *pp) :p(pp){ffassert(p);} String_find(string **pp) :p(*pp){ffassert(p);} long find(string *f) const { return p->find(*f);} long find(string *f,long i) const { return p->find(*f,i);} }; // spacialisation find -> rfind (bofbof ??) template<> struct String_find { string *p; String_find(string *pp) :p(pp){ffassert(p);} String_find(string **pp) :p(*pp){ffassert(p);} long find(string *f) const { return p->rfind(*f);} long find(string *f,long i) const { return p->rfind(*f,i);} }; template String_find to_String_find(string * p) { return String_find(p);} template String_find to_String_findp(string ** p) { return String_find(*p);} template long string_find(String_find sf,string *s) { return sf.find(s); } template long string_find( String_find const & sf,string *const &s,long const &i) { return sf.find(s,i); } string * TOString(SubString const & a) { return new string(a.s->substr(a.i,a.n)); } istream* getlinep( istream* f, string ** s) { getline(*f,**s); size_t l= (**s).length(); // clean begin end for win32 file if( l) { if((**s)[0] == '\r') { (**s).erase(0,1); l--;}} if( l) { if((**s)[l-1] == '\r') { (**s).erase(l-1,1); l--;}} return f; } void initStringOperator() { Dcl_Type(); // aType tstringp =atype(); //aType tstringpp =atype(); Dcl_Type< String_find > (); Dcl_Type< String_find > (); map_type[typeid(string*).name()]->AddCast( new E_F1_funcT(FCast)); // ajoute pour les chaines Add("size",".",new OneOperator1(get_sizep) ); Add("length",".",new OneOperator1(get_sizep) ); Add("size",".",new OneOperator1(get_size) ); Add("length",".",new OneOperator1(get_size) ); Add("find",".",new OneOperator1,string * >(to_String_find )); Add("rfind",".",new OneOperator1,string * >(to_String_find )); Add("find",".",new OneOperator1,string ** >(to_String_findp )); Add("rfind",".",new OneOperator1,string ** >(to_String_findp )); Add >("(","",new OneOperator2,string *>(string_find ) ); Add >("(","",new OneOperator2,string *>(string_find ) ); Add >("(","",new OneOperator3_,string *,long>(string_find ) ); Add >("(","",new OneOperator3_,string *,long>(string_find ) ); TheOperators->Add("=", new OneBinaryOperator ); Add("(","",new OneOperator2_(fSubString)); TheOperators->Add("getline",new OneOperator2(getlinep)); // Add("[","",new OneOperator2_(fSubString)); //Add("rfind",".",new OneOperator4_(get_replace) ); } freefem++-3.38-1/src/fflib/strversionnumber.cpp000644 000767 000024 00000001061 12544244561 021615 0ustar00hechtstaff000000 000000 #include "config-wrapper.h" #include "strversionnumber.hpp" #include using namespace std; #define TOSTRING1(i) #i #define TOSTRING(i) TOSTRING1(i) //#include #include using namespace std; double VersionNumber(){ return VersionFreeFempp; } string StrVersionNumber(){ // std::ostringstream buffer; // buffer.precision(8); // buffer< using namespace std; double VersionNumber(); string StrVersionNumber(); #endif//STRVERSIONNUMBER_HPP freefem++-3.38-1/src/fflib/strversionnumber.m4000644 000767 000024 00000001033 11406142256 021344 0ustar00hechtstaff000000 000000 #include "config-wrapper.h" #include "strversionnumber.hpp" #include using namespace std; #define TOSTRING1(i) #i #define TOSTRING(i) TOSTRING1(i) //#include #include using namespace std; double VersionNumber(){ return VersionFreeFempp; } string StrVersionNumber(){ // std::ostringstream buffer; // buffer.precision(8); // buffer< //#ifdef __INTEL__ #define cerr cout //#endif #include "error.hpp" #ifdef NDEBUG #define throwassert(i) ( (void) 0) #else #define throwassert(condition) ((condition) ? ( (void) 0) : throw(ErrorAssert(#condition,__FILE__, __LINE__))) #undef assert #define assert(condition) throwassert(condition) #endif // <> an unremovable assert. According to FH, ffassert() is as a more reliable way to trap FF than assert(). #undef ffassert #define ffassert(condition) ((condition) ? ( (void) 0) : throw(ErrorAssert(#condition,__FILE__, __LINE__))) //#define AFAIRE(str) ( (cerr << " TO be Done " << str << endl), throw(ErrorAssert("AFAIRE)/TO DO (FH????",__FILE__, __LINE__))) #define AFAIRE(cmm) ( cerr << "FH: A Faire/ To Do "<< cmm << " file " << __FILE__<< " line "<< __LINE__ << endl, InternalError(cmm)) #define InternalError(message) throw(ErrorInternal(message,__LINE__,__FILE__)) #endif freefem++-3.38-1/src/fflib/UMFPack_Solver.cpp000644 000767 000024 00000026647 12167254041 020762 0ustar00hechtstaff000000 000000 // file to add UMFPACK solver with dynamic load. #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" #include "MatriceCreuse_tpl.hpp" #include "lgsolver.hpp" #ifdef HAVE_LIBUMFPACK extern "C" { #ifdef HAVE_UMFPACK_H #include #else #ifdef HAVE_UMFPACK_UMFPACK_H #include #else #ifdef HAVE_BIG_UMFPACK_UMFPACK_H #include #else #ifdef HAVE_UFSPARSE_UMFPACK_H #include #else #ifdef HAVE_SUITESPARSE_UMFPACK_H #include #else // Defaults to a local version of the UMFPACK headers #include "../../download/include/umfpack.h" #endif // HAVE_SUITESPARSE_UMFPACK_H #endif // HAVE_UFSPARSE_UMFPACK_H #endif // HAVE_BIG_UMFPACK_UMFPACK_H #endif // HAVE_UMFPACK_UMFPACK_H #endif // HAVE_UMFPACK_H } template class SolveUMFPACK : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; void *Symbolic, *Numeric ; int umfpackstrategy; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 public: SolveUMFPACK(const MatriceMorse &A,int strategy,double ttgv, double epsilon=1e-6, double pivot=-1.,double pivot_sym=-1. ) : eps(epsilon),epsr(0), tgv(ttgv), Symbolic(0),Numeric(0) , umfpackstrategy(strategy), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { int status; throwassert( !A.sym() && Numeric == 0 && Symbolic==0 ); int n=A.n; double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; for(int i=0;i4) Control[UMFPACK_PRL]=2; if(tol_pivot_sym>0) Control[UMFPACK_SYM_PIVOT_TOLERANCE]=pivot_sym; if(tol_pivot>0) Control[UMFPACK_PIVOT_TOLERANCE]=pivot; if(umfpackstrategy>=0) Control[UMFPACK_STRATEGY]=umfpackstrategy; if(verbosity>3) { cout << " UMFPACK real Solver Control :" ; cout << "\n\t SYM_PIVOT_TOLERANCE "<< Control[UMFPACK_SYM_PIVOT_TOLERANCE]; cout << "\n\t PIVOT_TOLERANCE "<< Control[UMFPACK_PIVOT_TOLERANCE]; cout << "\n\t PRL "<< Control[UMFPACK_PRL]; cout << "\n"; } status = umfpack_di_symbolic (n, n, A.lg, A.cl, A.a, &Symbolic,Control,Info) ; if (status != 0) { (void) umfpack_di_report_matrix (n, n, A.lg, A.cl, A.a, 1, Control) ; umfpack_di_report_info (Control, Info) ; umfpack_di_report_status (Control, status) ; cerr << "umfpack_di_symbolic failed" << endl; ExecError("umfpack_di_symbolic failed"); //ffassert(0); } status = umfpack_di_numeric (A.lg, A.cl, A.a, Symbolic, &Numeric,Control,Info) ; if (status != 0) { umfpack_di_report_info (Control, Info) ; umfpack_di_report_status (Control, status) ; cerr << "umfpack_di_numeric failed" << endl; ExecError("umfpack_di_numeric failed"); ffassert(0); } if (Symbolic) umfpack_di_free_symbolic (&Symbolic),Symbolic=0; if(verbosity>3) cout << " -- umfpack_di_build LU " << n << endl; if(verbosity>5) (void) umfpack_di_report_info(Control,Info); } void Solver(const MatriceMorse &A,KN_ &x,const KN_ &b) const { ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; for(int i=0;i(x), KN_2Ptr(b), Numeric,Control,Info) ; if (status != 0) { umfpack_di_report_info (Control, Info) ; umfpack_di_report_status (Control, status) ; cerr << "umfpack_di_solve failed" << endl; ExecError("umfpack_di_solve failed"); ffassert(0); } if(verbosity>2) cout << " -- umfpack_di_solve, peak Mem: " << long(Info[UMFPACK_PEAK_MEMORY])/(1024*1024)*Info[UMFPACK_SIZE_OF_UNIT] << "Mbytes " << endl; if(verbosity>3) cout << " b min max " << b.min() << " " <3) (void) umfpack_di_report_info(Control,Info); if(verbosity>1) cout << " x min max " << x.min() << " " <3) cout << "~SolveUMFPACK S:" << Symbolic << " N:" << Numeric < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; template<> class SolveUMFPACK : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; int umfpackstrategy; double tgv; void *Symbolic, *Numeric ; double *ar,*ai; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 public: SolveUMFPACK(const MatriceMorse &A,int strategy,double ttgv, double epsilon=1e-6, double pivot=-1.,double pivot_sym=-1. ) : eps(epsilon),epsr(0),umfpackstrategy(strategy),tgv(ttgv), Symbolic(0),Numeric(0), ar(0),ai(0), tol_pivot_sym(pivot_sym), tol_pivot(pivot) { int status; throwassert( !A.sym()); int n=A.n; // copy the coef of the matrice --- ar= new double[A.nbcoef]; ai= new double[A.nbcoef]; ffassert(ar && ai); C2RR(A.nbcoef,A.a,ar,ai); double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; umfpack_zi_defaults (Control) ; Control[UMFPACK_PRL]=1; if(verbosity>4) Control[UMFPACK_PRL]=2; // Control[UMFPACK_SYM_PIVOT_TOLERANCE]=1E-10; // Control[UMFPACK_PIVOT_TOLERANCE]=1E-10; if(tol_pivot_sym>0) Control[UMFPACK_SYM_PIVOT_TOLERANCE]=pivot_sym; if(tol_pivot>0) Control[UMFPACK_PIVOT_TOLERANCE]=pivot; if(umfpackstrategy>=0) Control[UMFPACK_STRATEGY]=umfpackstrategy; if(verbosity>3) { cout << " UMFPACK complex Solver Control :" ; cout << "\n\t SYM_PIVOT_TOLERANCE "<< Control[UMFPACK_SYM_PIVOT_TOLERANCE]; cout << "\n\t PIVOT_TOLERANCE "<< Control[UMFPACK_PIVOT_TOLERANCE]; cout << "\n\t PRL "<< Control[UMFPACK_PRL]; cout << "\n"; } status = umfpack_zi_symbolic (n, n, A.lg, A.cl, ar,ai, &Symbolic,Control,Info) ; if (status < 0) { (void) umfpack_zi_report_matrix (n, n, A.lg, A.cl, ar,ai, 1, Control) ; umfpack_zi_report_info (Control, Info) ; umfpack_zi_report_status (Control, status) ; cerr << "umfpack_zi_symbolic failed" << endl; ExecError("umfpack_zi_symbolic failed"); ffassert(0); exit(2); } status = umfpack_zi_numeric (A.lg, A.cl, ar,ai, Symbolic, &Numeric,Control,Info) ; if (status < 0) { umfpack_zi_report_info (Control, Info) ; umfpack_zi_report_status (Control, status) ; cerr << "umfpack_zi_numeric failed" << endl; ExecError("umfpack_zi_numeric failed"); ffassert(0); exit(2); } if (Symbolic) umfpack_zi_free_symbolic (&Symbolic),Symbolic=0; if(verbosity>3) cout << "umfpack_zi_build LU " << n << endl; if(verbosity>5) (void) umfpack_zi_report_info(Control,Info); } void Solver(const MatriceMorse &A,KN_ &x,const KN_ &b) const { ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // cout << " epsr = " << epsr << endl; double Control[UMFPACK_CONTROL]; double Info[UMFPACK_INFO]; umfpack_zi_defaults (Control) ; int n = b.N(); ffassert(A.ChecknbLine( n) && n == x.N() && A.ChecknbColumn(n) ); KN xr(n),xi(n),br(n),bi(n); C2RR(n,b,br,bi); // change UMFPACK_At to UMFPACK_Aat in complex oct 2005 int status = umfpack_zi_solve (UMFPACK_Aat, A.lg, A.cl, ar,ai, xr, xi, br,bi, Numeric,Control,Info) ; if (status < 0) { umfpack_zi_report_info (Control, Info) ; umfpack_zi_report_status (Control, status) ; cerr << "umfpack_zi_solve failed" << endl; ExecError("umfpack_zi_numeric failed"); ffassert(0); exit(2); } RR2C(n,xr,xi,x); if(verbosity>1) { cout << " -- umfpack_zi_solve, peak Mem : " << long(Info[UMFPACK_PEAK_MEMORY])/(1024*1024)*Info[UMFPACK_SIZE_OF_UNIT] << "Mbytes " << endl; if(verbosity>3) (void) umfpack_zi_report_info(Control,Info); cout << " b min max " << b.min() << " " <5) cout << "~SolveUMFPACK " << endl; if (Symbolic) umfpack_zi_free_symbolic (&Symbolic),Symbolic=0; if (Numeric) umfpack_zi_free_numeric (&Numeric),Numeric=0; delete [] ar; delete [] ai; } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; inline MatriceMorse::VirtualSolver * BuildSolverIUMFPack(DCL_ARG_SPARSE_SOLVER(double,A)) { //cout << " BuildSolverUMFPack" << endl; return new SolveUMFPACK(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym); } inline MatriceMorse::VirtualSolver * BuildSolverIUMFPack(DCL_ARG_SPARSE_SOLVER(Complex,A)) { //cout << " BuildSolverUMFPack" << endl; return new SolveUMFPACK(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym); } // the 2 default sparse solver double and complex //DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver extern TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue;//=TypeSolveMat::defaultvalue; template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverIUMFPack; template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverIUMFPack; static bool SetUMFPACK() { if(verbosity>1) cout << " SetDefault sparse solver to UMFPack" << endl; DefSparseSolver::solver =BuildSolverIUMFPack; DefSparseSolver::solver =BuildSolverIUMFPack; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; return 1; } void init_UMFPack_solver() { if(verbosity>2) cout << " UMFPACK "; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverIUMFPack; DefSparseSolver::solver =BuildSolverIUMFPack; Global.Add("defaulttoUMFPACK","(",new OneOperator0(SetUMFPACK)); Global.Add("defaultoUMFPACK","(",new OneOperator0(SetUMFPACK)); Global.New("HaveUMFPACK",CConstant(true)); } #ifdef LOAD_LINK_ class Init { public: Init(); }; Init init; Init::Init(){ init_UMFPack_solver(); } #endif #else using namespace Fem2D; bool SetGMRES(); void init_UMFPack_solver() { if(verbosity) cout << " no UMFPACK -> replace by LU or GMRES "; Global.Add("defaultoUMFPACK","(",new OneOperator0(SetGMRES)); Global.New("HaveUMFPACK",CConstant(false)); } template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverGMRES; template <> DefSparseSolver::SparseMatSolver DefSparseSolver::solver =BuildSolverGMRES; #endif freefem++-3.38-1/src/fflib/versionnumber.hpp000644 000767 000024 00000000034 11406226635 021066 0ustar00hechtstaff000000 000000 #include "config-wrapper.h" freefem++-3.38-1/src/femlib/assertion.hpp000755 000767 000024 00000000432 11406226635 020360 0ustar00hechtstaff000000 000000 #ifndef ASSERTION_HPP_ #define ASSERTION_HPP_ // to compile all assertion //#define ASSERTION // to remove all the assert //#define NDEBUG #ifndef ASSERTION #define ASSERTION(i) ((void ) 0) #else #include #undef ASSERTION #define ASSERTION(i) assert(i) #endif #endif freefem++-3.38-1/src/femlib/BamgFreeFem.cpp000644 000767 000024 00000070716 12511456171 020453 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 97 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // #define TRACETRIANGLE 3 //#pragma dont_inline on //#pragma global_optimizer off //#pragma inline_depth(0) //#undef NDEBUG extern long verbosity ; //#define strcasecmp strcmp #include #include #include #include #include #include #include "RNM.hpp" using namespace std; #include "Meshio.h" #include "Mesh2.h" #include "QuadTree.h" #include "SetOfE4.h" #include "rgraph.hpp" #include "fem.hpp" #include "AFunction.hpp" #include "BamgFreeFem.hpp" #include "FESpace.hpp" #include "Mesh2dn.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "PlotStream.hpp" #include Fem2D::Mesh *bamg2msh( bamg::Triangles* tTh,bool renumbering) { using namespace bamg; bamg::Triangles & th (*tTh); tTh->ReNumberingTheTriangleBySubDomain(!renumbering);// just compress //tTh->NbRef++; Int4 i,j,k=0; int nv = tTh->nbv; int nt = tTh->nbt - tTh->NbOutT; int neb = tTh->nbe; int nbcrakev = 0; tTh->ReMakeTriangleContainingTheVertex(); Fem2D::Triangle * t = new Fem2D::Triangle[nt] ; Fem2D::BoundaryEdge * b_e = new Fem2D::BoundaryEdge[neb]; Fem2D::Vertex vbase; Fem2D::Vertex *vb(&vbase); if (verbosity>5) cout << " -- Before cracking mesh: Nb Triangles = " << nt << " Nb of Vertices " << nv << endl; for ( i=0;i= 0 ) && (i <3)); // turn around the vertex v TriangleAdjacent ta(tbegin,EdgesVertexTriangle[i][0]);// previous edge int k=0; do { int kv = VerticesOfTriangularEdge[ta][1]; k++; Triangle * tt (ta); throwassert( &v == & (* tt)[kv] ); if ( ta.Cracked() ) { // cout << " || " ; if ( kk == 0) tbegin=ta,kkk=0; // begin by a cracked edge => restart if ( kkk ) { kc =1;vv = vb + nv++; kkk = 0; } // new vertex if use kk++; // number of cracked edge view } if ( tt->link ) { // if good triangles store the value int it = th.Number(tt); throwassert(it < nt); //int iiv=vv-vb; t[it](kv) = vv; /* cout << it << " " << kv << " "<< iiv << endl; if (&th(it)[kv] != &th[iiv]) cout << it << " " << kv << " "<< iiv << " != " << th.Number(th(it)[kv]) << endl ; */ kkk++; } else if (kk) { // crack + boundary if ( kkk ) { kc =1;vv = vb + nv++; kkk = 0; } // new vertex if use } ta = Next(ta).Adj(); } while ( (tbegin != ta)); throwassert(k); if (kc) nbcrakev++; } double badvalue=12345e100; Fem2D::Vertex * v = new Fem2D::Vertex[nv]; for(int i=0; i=0 && k < nv); Vertex & thv(th(i)[j]); v[k].x = thv.r.x; v[k].y = thv.r.y; v[k].lab = thv.ref(); // cout << i<< " " << j << " " << k <<" " << v[k].x << " " <2) cout << " -- Nb of craked vertices = " << nbcrakev << " Nb of created vertices " << nv - th.nbv << endl; for (i=0;inbe;i++) { int i0=tTh->Number(tTh->edges[i][0]),i1=tTh->Number(tTh->edges[i][1]); throwassert(i0>=0 && i0 =0 && i1 edges[i].ref); } Int4 *reft = new Int4[tTh->nbt]; //Int4 nbref = tTh->ConsRefTriangle(reft); for( i=0,k=0;inbt;i++) if(tTh->triangles[i].link) { Fem2D::R2 A(t[k][0]),B(t[k][1]),C(t[k][2]); t[k].area = (( B-A)^(C-A))*0.5 ; t[k].lab = tTh->subdomains[reft[i]].ref; // a faire throwassert(k == i); k++; } delete [] reft; throwassert ( nt == k); tTh->ReMakeTriangleContainingTheVertex(); if (verbosity) cout << " -- mesh: Nb of Triangles = " << setw(6) << nt << ", Nb of Vertices " << nv << endl; { Fem2D::Mesh *m = new Fem2D::Mesh(nv,nt,neb,v,t,b_e); if (renumbering) m->renum(); m->MakeQuadTree(); return m; } } Fem2D::Mesh *bamg2msh(const bamg::Geometry &Gh) { // ------------------ int nv= Gh.nbv; int neb=Gh.nbe; Fem2D::Triangle * t = 0 ; Fem2D::BoundaryEdge * b_e = new Fem2D::BoundaryEdge[neb]; Fem2D::Vertex *v = new Fem2D::Vertex[nv] ; for (int i=0;iMakeQuadTree(); return m; } // ------------------ } bamg::Triangles * msh2bamg(const Fem2D::Mesh & Th,double cutoffradian,long * reqedgeslab,int nreqedgeslab) { using namespace bamg; Triangles *Tn=new Triangles(Th.nv); Tn->nbv = Th.nv; Tn->nbt = Th.nt; Tn->nbe = Th.neb; Tn->name= new char[strlen("msh2bamg")+1]; strcpy(Tn->name,"msh2bamg"); // Tn->triangles = new Triangle [Tn->nbtx]; throwassert(Tn->triangles); // Tn->vertices = new Vertex [Tn->nbvx]; // Tn->ordre = new (Vertex* [Tn->nbvx]); Tn->edges = new Edge [Th.neb]; Int4 i; Metric Mid(1.); for (i = 0; i < Th.nv; i++) { Tn->vertices[i].r.x = Th(i).x; Tn->vertices[i].r.y = Th(i).y; Tn->vertices[i].m=Mid; Tn->vertices[i].ReferenceNumber = Th(i).lab; } // Int4 i1 [nbt],i2 [nbt],i3 [nbt]; for (i = 0; i < Th.nt; i++) { int i1 = Th(Th[i][0]); int i2 = Th(Th[i][1]); int i3 = Th(Th[i][2]); Tn->triangles[i]= Triangle( Tn,i1 ,i2 ,i3 ); Tn->triangles[i].color = Th[i].lab; } // Real8 cutoffradian = -1; // add code un change boundary part ... frev 2009 JYU FH set labreq; if(nreqedgeslab && verbosity) cout << " label of required edges " ; for (int i=0; i edges[i].v[0] = Tn->vertices + Th(Th.bedges[i][0]); Tn->edges[i].v[1] = Tn->vertices + Th(Th.bedges[i][1]); Tn->edges[i].ref = Th.bedges[i].lab; Tn->edges[i].on = 0; if( labreq.find( Tn->edges[i].ref) != labreq.end()) { k++; Tn->edges[i].on = &paszero; } } if(verbosity)cout << " number of required edges : "<< k << endl; Tn->ConsGeometry(cutoffradian); Tn->Gh.AfterRead(); Tn->SetIntCoor(); Tn->FillHoleInMesh(); return Tn; } bamg::Triangles * msh2bamg(const Fem2D::Mesh & Th,double cutoffradian, int nbdfv, int * ndfv,int nbdfe, int * ndfe, long * reqedgeslab,int nreqedgeslab) { using namespace bamg; Triangles *Tn=new Triangles(Th.nv); KN equiedges(Th.neb); for(int i=0;i kk(Th.neb),kn(Th.neb); kk=0; for(int i=0;i " << dk0 << " " << dk1 << endl; ExecError("bug periodic mesh in ??? "); } equiedges[i]=2*k+sens; } } }; // a faire pour les maillages periodique Tn->nbv = Th.nv; Tn->nbt = Th.nt; Tn->nbe = Th.neb; Tn->name= new char[strlen("msh2bamg")+1]; strcpy(Tn->name,"msh2bamg"); // Tn->triangles = new Triangle [Tn->nbtx]; throwassert(Tn->triangles); // Tn->vertices = new Vertex [Tn->nbvx]; // Tn->ordre = new (Vertex* [Tn->nbvx]); Tn->edges = new Edge [Th.neb]; Int4 i; Metric Mid(1.); for (i = 0; i < Th.nv; i++) { Tn->vertices[i].r.x = Th(i).x; Tn->vertices[i].r.y = Th(i).y; Tn->vertices[i].ReferenceNumber = Th(i).lab; Tn->vertices[i].m=Mid; } // Int4 i1 [nbt],i2 [nbt],i3 [nbt]; for (i = 0; i < Th.nt; i++) { int i1 = Th(Th[i][0]); int i2 = Th(Th[i][1]); int i3 = Th(Th[i][2]); Tn->triangles[i]= Triangle( Tn,i1 ,i2 ,i3 ); Tn->triangles[i].color = Th[i].lab; } // add code un change boundary part ... frev 2009 JYU FH set labreq; if(nreqedgeslab && verbosity) cout << " label of required edges " ; for (int i=0; i edges[i].v[0] = Tn->vertices + Th(Th.bedges[i][0]); Tn->edges[i].v[1] = Tn->vertices + Th(Th.bedges[i][1]); Tn->edges[i].ref = Th.bedges[i].lab; Tn->edges[i].on = 0; if( labreq.find( Tn->edges[i].ref) != labreq.end()) { k++; Tn->edges[i].on = &paszero; } } // Real8 cutoffradian = -1; Tn->ConsGeometry(cutoffradian,equiedges); Tn->Gh.AfterRead(); Tn->SetIntCoor(); Tn->FillHoleInMesh(); return Tn; } Fem2D::Mesh * BuildMesh(Stack stack, E_BorderN const * const & b,bool justboundary,int nbvmax,bool Requiredboundary,KNM *pintern) { int nbvinter=0; if( pintern) { nbvinter=pintern->N(); if((pintern->M() != 2 ) && ( pintern->M()!=3)) { cout << " point m = " <M()<next) { int nbd = k->NbBorder(stack); for(int index=0; indexNbseg(stack,index))); ; nbvx += n+1; nbe += n; nbsd++; } } Geometry * Gh = new Geometry; if(verbosity>2) cout <<"\t\t" << " Begin: ConstGeometry from nb Border " << nbsd <name=new char [strlen(filename)+1]; strcpy(Gh->name,filename); Real8 Hmin = HUGE_VAL;// the infinie value Int4 hvertices =0; Int4 i,nn,n; //Int4 dim=0; Gh->MaximalAngleOfCorner =30.00*Pi/180.0; Gh->nbv = 0; Gh->nbvx = nbvx; Gh->nbe = nbe; Gh->edges = new GeometricalEdge[Gh->nbe]; bamg::Vertex *vertices = new Vertex[Gh->nbvx];// correction 2009/07/03 double lmin= HUGE_VAL; // generation des points et des lignes i=0; for (E_BorderN const * k=b;k;k=k->next) { int nbd = k->NbBorder(stack); for(int index=0; indexb->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long * indx = k->index(stack); if(indx) *indx = index; else ffassert(index==0); n=Max(Abs(k->Nbseg(stack,index)),1L); t=a; double delta = (b-a)/n; for ( nn=0;nn<=n;nn++,i++, t += delta) { if (nn==n) t=b; // to remove roundoff error mp.label = k->label(); k->code(stack); // compute x,y, label // cout << " ----- " << i << " " << mp.P.x << " " << mp.P.y << endl; vertices[i].r.x=mp.P.x; vertices[i].r.y=mp.P.y; vertices[i].ReferenceNumber= mp.label; vertices[i].color = i; if (nn>0) { lmin=min(lmin,Norme2_2( vertices[i].r-vertices[i-1].r)); } } } } // add interna point if(pintern) { for(int k=0; kpmin = vertices[0].r; Gh->pmax = vertices[0].r; // recherche des extrema des vertices pmin,pmax for (i=0;ipmin.x = Min(Gh->pmin.x,vertices[i].r.x); Gh->pmin.y = Min(Gh->pmin.y,vertices[i].r.y); Gh->pmax.x = Max(Gh->pmax.x,vertices[i].r.x); Gh->pmax.y = Max(Gh->pmax.y,vertices[i].r.y); } double diameter=Max(Gh->pmax.x-Gh->pmin.x,Gh->pmax.y-Gh->pmin.y); Gh->coefIcoor= (MaxICoor)/diameter; Icoor1 epsI = (Icoor1) (Gh->coefIcoor*eps); ffassert(Gh->coefIcoor >0); if(lmin2) { cout <<"\t\t" << " Geom: min="<< Gh->pmin << "max ="<< Gh->pmax << " hmin = " << Gh->MinimalHmin() << endl; } nbv = 0; { // find common point QuadTree quadtree; Metric Id(1.); for ( i=0;itoI2(vertices[i].r); vertices[i].m = Id; Vertex *v= quadtree.ToClose(vertices[i],eps,epsI,epsI) ; // quadtree.NearestVertex(vertices[i].i.x,vertices[i].i.y); if( v && Norme1(v->r - vertices[i]) < eps ) { vertices[i].color=v->color; } else {quadtree.Add(vertices[i]); vertices[i].color = nbv++;} } /* if (nbvprev-nbv==0) { reffecran(); bamg::R2 O((Gh->pmin+Gh->pmax)/2),D(Gh->pmax-Gh->pmin); cadreortho(O.x,O.y,Max(D.x,D.y)*1.1); xGrafCoef = Gh->coefIcoor; yGrafCoef = Gh->coefIcoor; xGrafOffSet = Gh->pmin.x; yGrafOffSet = Gh->pmin.y; quadtree.Draw(); for (int i=0;i1) cout << " Nb of common points " << nbvprev-nbv <nbvx = nbv; Gh->nbv = nbv; Gh->vertices = new GeometricalVertex[nbv]; throwassert(Gh->nbvx >= Gh->nbv); Gh->nbiv = Gh->nbv; // Int4 k=0; const Direction NoDirOfSearch; // compression of points int kkk; for ( i=0,kkk=0;kkkvertices[i].r.x = vertices[kkk].r.x ; Gh->vertices[i].r.y = vertices[kkk].r.y; //Gh->vertices[i].link = Gh->vertices + i; throwassert(Gh->vertices[i].IsThe()); Gh->vertices[i].ReferenceNumber = vertices[kkk].ReferenceNumber ; Gh->vertices[i].DirOfSearch = NoDirOfSearch; Gh->vertices[i].color =0; Gh->vertices[i].Set(); // vertices[i].SetCorner(); if(Requiredboundary) Gh->vertices[i].SetRequired(); if(Gh->vertices[i].ReferenceNumber < 0) Gh->vertices[i].SetRequired(); i++; } } throwassert(i==nbv); R2 zero2(0,0); if(verbosity>5) cout <<"\t\t" << " Record Edges: Nb of Edge " << Gh->nbe <edges); throwassert (Gh->nbv >0); Real4 *len =0; if (!hvertices) { len = new Real4[Gh->nbv]; for(i=0;inbv;i++) len[i]=0; } int nnn=0; i=0; for (E_BorderN const * k=b;k;k=k->next) { int nbd = k->NbBorder(stack); for(int index=0; indexvar(stack); double a(k->from(stack)),b(k->to(stack)); n=Max(Abs(k->Nbseg(stack,index)),1L); long * indx = (k->index(stack)); if(indx) *indx = index; else ffassert(index==0); double delta = (b-a)/n; t=a+delta/2; for ( nn=0;nnlabel(); k->code(stack); Int4 i1 = vertices[nnn].color, i2 = vertices[++nnn].color; throwassert(i1 >= 0 && i1 < nbv); throwassert(i2 >= 0 && i2 < nbv); Gh->edges[i].ref = mp.label; Gh->edges[i].v[0]= Gh->vertices + i1; Gh->edges[i].v[1]= Gh->vertices + i2; R2 x12 = Gh->vertices[i2].r-Gh->vertices[i1].r; Real8 l12=Norme2(x12); Gh->edges[i].tg[0]=zero2; Gh->edges[i].tg[1]=zero2; Gh->edges[i].SensAdj[0] = Gh->edges[i].SensAdj[1] = -1; Gh->edges[i].Adj[0] = Gh->edges[i].Adj[1] = 0; Gh->edges[i].flag = 0; Gh->edges[i].link=0; if(Requiredboundary) Gh->edges[i].SetRequired(); if (!hvertices) { Gh->vertices[i1].color++; Gh->vertices[i2].color++; len[i1] += l12; len[i2] += l12; } Hmin = Min(Hmin,l12); } nnn++; }} delete [] vertices; vertices=0; throwassert(nnn+nbvinter==nbvprev); throwassert(i==Gh->nbe); // definition the default of the given mesh size if (!hvertices) { bool hvint = pintern ? pintern->M() ==3 : 0; for (i=0;inbv;i++) { if(hvint &&Gh->vertices[i].ReferenceNumber vertices[i].ReferenceNumber-brefintp; Gh->vertices[i].m=Metric( (*pintern)(k ,2L)); Gh->vertices[i].ReferenceNumber = -1; //++ bof bof FH .. } else if (Gh->vertices[i].color > 0) Gh->vertices[i].m= Metric(len[i] /(Real4) Gh->vertices[i].color); else Gh->vertices[i].m= Metric(Hmin); } delete [] len; if(verbosity>3) cout <<"\t\t" << " Geom Hmin " << Hmin << endl; } Gh->NbSubDomains=nbsd; if (Gh->NbSubDomains>0) { Gh->subdomains = new GeometricalSubDomain[ Gh->NbSubDomains]; Int4 i1=0; i=0; for (E_BorderN const * k=b;k;k=k->next) { int nbd = k->NbBorder(stack); for(int index=0; indexNbseg(stack,index); long n= Max(1L,Abs(Nbseg)); Gh->subdomains[i].sens = Nbseg >0 ? 1 : -1; Gh->subdomains[i].edge=Gh->edges + i1; Gh->subdomains[i].ref = i; i1 += n; }} } Gh->NbEquiEdges=0; Gh->NbCrackedEdges=0; Fem2D::Mesh * m=0; if (justboundary) m=bamg2msh(*Gh); else { Gh->AfterRead(); int nbtx= nbvmax ? nbvmax : (Gh->nbv*Gh->nbv)/9 +1000; if(verbosity> 99) cout << " ** Gh = " << endl << *Gh << endl << " *** " <SetVertexFieldOn(); for( int i=0;inbv;++i) { VertexOnGeom *on=0; if( (on =Th->vertices[i].on) ) // we are on geometrie { if(on->abscisse <0) { bamg::GeometricalVertex * gv= on->gv; int iold = Gh->Number(gv); } else {// erreur car un point est sur un arete en non un sommet bamg::GeometricalEdge * ge= on->ge; int eold = Gh->Number(ge); // int iold = Gh->Number( (*ge)[0] ); int jold = Gh->Number( (*ge)[1] ); int s = on->abscisse; // cout << " error bizarre " << ge << endl; } } } } } catch(...) { Gh->NbRef=0; delete Gh; cout << " catch Err bamg " << endl; throw ; } m=bamg2msh(Th,true); delete Th; } delete Gh; /* deja fait dans bamg2msh Fem2D::R2 Pn,Px; m->BoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); ---------- */ mp=mps; // m->decrement(); // Add2StackOfPtr2FreeRC(stack,m);// fait au niveau d'apres 07/2008 FH return m; } void E_BorderN::BoundingBox(Stack stack,double &xmin,double & xmax, double & ymin,double & ymax) const { Fem2D::MeshPoint & mp (*Fem2D::MeshPointStack(stack)), mps = mp; for (E_BorderN const * k=this;k;k=k->next) { int nbd = k->NbBorder(stack); for(int index=0; indexb->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long * indx = (k->index(stack)); if(indx) *indx = index; else ffassert(index==0); long n=Max(Abs(k->Nbseg(stack,index)),1L); t=a; double delta = (b-a)/n; for (int nn=0;nn<=n;nn++, t += delta) { if (nn==n) t=b; // to remove roundoff error mp.label = k->label(); k->code(stack); // compute x,y, label xmin=Min(xmin,mp.P.x); xmax=Max(xmax,mp.P.x); ymin=Min(ymin,mp.P.y); ymax=Max(ymax,mp.P.y); } }} mp=mps; } void E_BorderN::Plot(Stack stack) const { using Fem2D::R2; Fem2D::MeshPoint & mp (*Fem2D::MeshPointStack(stack)), mps = mp; float x0,x1,y0,y1; getcadre(x0,x1,y0,y1); float h= (x1-x0)*0.01; int nbd=0; for (E_BorderN const * k=this;k;k=k->next) { int nbdr = k->NbBorder(stack); for(int index=0; indexb->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long n=Max(Abs(k->Nbseg(stack,index)),1L); long * indx = (k->index(stack)); if(indx) *indx = index; else ffassert(index==0); t=a; double delta = (b-a)/n; R2 P,Po; for (int nn=0;nn<=n;nn++, t += delta) { if (nn==n) t=b; // to remove roundoff error mp.label = k->label(); mp.P.z=0; k->code(stack); // compute x,y, label P=mp.P.p2(); couleur(2+mp.label); if(nn!=0) { LineTo(P); R2 uv(Po,P); double l = Max(sqrt((uv,uv)),1e-20); R2 dd = uv*(-h/l); R2 dn = dd.perp()*0.5; LineTo(P+dd+dn); MoveTo(P+dd-dn); LineTo(P);} else { DrawMark(mp.P.p2(),0.01); MoveTo(mp.P.p2()); } // cout << k->label()<< " " << nn << ", x,y = " << mp.P.x << " , " << mp.P.y << endl; Po=P; } DrawMark(mp.P.p2(),0.01); MoveTo(mp.P.p2()); } } if(verbosity>9) cout << " -- Plot size : " << nbd << " Border \n"; mp=mps; } void E_BorderN::SavePlot(Stack stack,PlotStream & plot ) const { using Fem2D::R2; Fem2D::MeshPoint & mp (*Fem2D::MeshPointStack(stack)), mps = mp; //float x0,x1,y0,y1; //getcadre(x0,x1,y0,y1); //float h= (x1-x0)*0.01; long nbd1=0;// nb of sub border for (E_BorderN const * k=this;k;k=k->next) { int nbdr = k->NbBorder(stack); for(int index=0; indexnext) { int nbdr = k->NbBorder(stack); for(int index=0; indexb->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long n=Max(Abs(k->Nbseg(stack,index)),1L); long * indx = (k->index(stack)); if(indx) *indx = index; else ffassert(index==0); t=a; double delta = (b-a)/n; R2 P,Po; plot<< (long) n; for (int nn=0;nn<=n;nn++, t += delta) { if (nn==n) t=b; // to remove roundoff error mp.label = k->label(); mp.P.z=0; k->code(stack); // compute x,y, label P=mp.P.p2(); plot << (long) mp.label <9) cout << " -- Plot size : " << nbd << " Border \n"; mp=mps; } Fem2D::Mesh * BuildMeshBorder(Stack stack, E_BorderN const * const & b) { return BuildMesh(stack,b,true,0,true); } Fem2D::Mesh * BuildMesh(Stack stack, E_BorderN const * const & b,bool Requiredboundary) { return BuildMesh(stack,b,false,0,Requiredboundary); } Fem2D::Mesh * ReadTriangulate( string * const & s) { using namespace Fem2D; KN xy; char c; int nv; for(int step=0;step<2;step++) { nv=0; ifstream f(s->c_str()); if(!f) {cerr <<" Error openning file " << *s << endl; ExecError("Openning file ");} while (f.good()) { R2 P; f >> P ; if (!f.good()) break; if (step) xy[nv]=P; nv++; while (f.get(c) && (c!='\n' && c!='\r' ) ) (void) 0; // eat until control (new line } if (!step && nv ) xy.init(nv); // alloc the array } if(verbosity) cout << " we read " << nv << " coordinates xy "<< endl; Mesh * m=new Mesh(nv,xy); m->MakeQuadTree(); // m->decrement(); // 07/2008 FH auto del ptr // delete s; modif mars 2006 auto del ptr return m; } Fem2D::Mesh * Triangulate( const KN_ & xx,const KN_ & yy) { using namespace Fem2D; ffassert(xx.N()==yy.N()); int nv=xx.N(); KN xy(nv); for(int i=0;iMakeQuadTree(); // m->decrement(); 07/2008 FH auto del ptr // delete s; modif mars 2006 auto del ptr return m; } Fem2D::Mesh * ReadMeshbamg( string * const & s) { using bamg::Triangles; Triangles * bTh= new Triangles(s->c_str()); // bTh->inquire(); Fem2D::Mesh * m=bamg2msh(bTh,false);// no renum delete bTh; // delete s; modif mars 2006 auto del ptr // m->decrement(); 07/2008 FH auto del ptr return m; } Fem2D::Mesh * buildmeshbamg( string * const & s, int nbvxin) { using bamg::Triangles; using bamg::Geometry; Geometry Gh(s->c_str()); //double hmin = Gh.MinimalHmin(); //double hmax = Gh.MaximalHmax(); int nbvx = nbvxin ? nbvxin : ((Gh.nbv*Gh.nbv)/9 +1000); Triangles * bTh= new Triangles(nbvx,Gh); // bTh->inquire(); Fem2D::Mesh * m=bamg2msh(bTh,false);// no renum delete bTh; // delete s; modif mars 2006 auto del ptr // m->decrement(); return m; } freefem++-3.38-1/src/femlib/BamgFreeFem.hpp000644 000767 000024 00000004310 12511440375 020442 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Bamglib interface header // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef FREEFEMBAMG_H_ #define FREEFEMBAMG_H_ namespace bamg { extern void (*MeshIstreamErrorHandler)(ios & ); class Triangles; } Fem2D::Mesh * ReadMeshbamg( string * const & s) ; Fem2D::Mesh * ReadTriangulate( string * const & s) ; Fem2D::Mesh * Triangulate( const KN_ & xx,const KN_ & yy) ; Fem2D::Mesh *bamg2msh( bamg::Triangles* tTh,bool renumbering=false); bamg::Triangles * msh2bamg(const Fem2D::Mesh & Th, double cutoffradian=-1.0,long * reqedgeslab=0,int nreqedgeslab =0) ; bamg::Triangles * msh2bamg(const Fem2D::Mesh & Th,double cutoffradian, int nbdfv, int * ndfv,int nbdfe, int * ndfe, long * reqedgeslab=0,int nreqedgeslab=0); Fem2D::Mesh * BuildMesh(Stack stack, E_BorderN const * const & b,bool justboundary,int nbvmax=0,bool Requiredboundary=true,KNM *pintern=0); Fem2D::Mesh * BuildMesh(Stack stack , E_BorderN const * const & b,bool Requiredboundary) ; Fem2D::Mesh * BuildMeshBorder(Stack stack , E_BorderN const * const & b) ; Fem2D::Mesh * MoveTheMesh(const Fem2D::Mesh &Th,const KN_ & u,const KN_ &v); Fem2D::Mesh * buildmeshbamg( string * const & s,int =0); #endif freefem++-3.38-1/src/femlib/CGNL.hpp000644 000767 000024 00000006416 12357516533 017106 0ustar00hechtstaff000000 000000 template R argmin(R rho,const DJ & dJ, KN_ &x,KN_ &h,KN_ &g,KN_ &w) { // Find ro such thah (dJ(x+ro h),h) =0 // remark input: dJ(x)=g int k=0; // g=dJ*x; // pour est sure R ro0=0, ro=rho,ro1=rho,rold=0; R p0= (g,h),p,p1; if(p0>0) { h=-g; p0=(g,h); cout << "Reset searching directions to gradient! (Wow! says F. hecht) \n"; } R ap0=fabs(p0)*0.01; // on arrete quand on a divise par 100. x += (ro-rold)* h; rold=ro; g=dJ*x;// dJ(x,g); p= ( p1 = (g,h) ); if ( verbosity >=50 ) cout << " ro " << ro << " " << p << " rh0= 0 " << p0 << endl; bool loop=true; while (k++<100 && loop) { // calcul du nouveau ro courant if (p0*p1 <0) { // Ok changement de signe R lambda= (-p0/(-p0+p1)); if (lambda>0.8) lambda=0.8; if (lambda<0.2) lambda=0.2; ro = ro1*lambda + (1-lambda)*ro0 ; x += (ro-rold)* h; rold=ro; g=dJ*x;// dJ(x,g); assert(ro>1e-30 && ro < 1e+30); p = (g,h); if ( verbosity >=50 ) cout << " " << ", rho=" << ro << " gh= " << p << "; ro0, gh0 = " << ro0 << " " << p0 << "; ro1, gh1 = " << ro1 << " " << p1 << " " << lambda ; if(fabs(p) <= ap0 || k>100 ) { if ( verbosity >=50 ) cout << endl << endl; return ro; } if(p0*p<0) { p1=p; ro1=ro; if ( verbosity >=50 ) cout << " +\n";} else { p0=p; ro0=ro; if ( verbosity >=50 ) cout <<" -\n";} } else { ro *=2; p0=p1; x += (ro-rold)* h; rold=ro; g=dJ*x;//dJ(x,g); p = (g,h); p1=p; ro1=ro; if ( verbosity >=50 ) cout < int NLCG(const DJ & dJ,const P & C,KN_ &x,const int nbitermax, double &eps,long kprint=1000000000,S *Stop=0) { // ------------- assert(&x && &dJ && &C); typedef KN Rn; int n=x.N(); R ro=1; Rn g(n),h(n),Ah(n), & Cg(Ah); // on utilise Ah pour stocke Cg g=dJ*x;// dJ(x,g); Cg = C*g; // gradient preconditionne h =-Cg; R g2 = (Cg,g); if (g2 < 1e-30) { if(kprint>1) cout << "GCNL g^2 =" << g2 << " < 1.e-30 Nothing to do " << endl; return 2; } if (kprint>5 ) cout << " 0 GCNL g^2 =" << g2 << endl; R reps2 =eps >0 ? eps*eps*g2 : -eps; // epsilon relatif eps = reps2; for (int iter=0;iter<=nbitermax;iter++) { ro = argmin(ro,dJ,x,h,g,Ah); Cg = C*g; R g2p=g2; g2 = (Cg,g); bool stop = Stop && Stop->Stop(iter,x,g); if ( kprint >1 ) cout << "CGNL:" < #else #include #endif static long verbosity; static long StorageUsed() { #if MALLOC_ZONE_SPECIFIC_FLAGS struct mstats mem1; mem1 = mstats(); return mem1.bytes_used; #elif M_MMAP_THRESHOLD struct mallinfo mem1; mem1=mallinfo(); return mem1.uordblks; #else return 0; #endif } #ifndef NCHECKPTR #define DEBUGUNALLOC 1 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include void debugalloc() { } void debugunalloc() { static long count=0; // debugalloc(); count++;} void exitalloc(int i) { static long count=0; count++; exit(1); } // Modif: Juin 2001 for debuging missing delete point // -- THE MACRO // TO SHOW ALL ALLOCATION // #define SHOWALLOC // TO DEBUG ALL UN DELETE POINETUR int UnShowAlloc =1; int ShowAlloc(const char *s,size_t & lg); //inline void *operator new(size_t, void *place) { return place; } static int kerr=0; void * mymalloc(size_t l) { char *p = (char*)malloc(l+16); if (!p) return p; for( int i = 0; i < 8 ; i++) p[i] = 'a'+i,p[i+l+8] = 'z'-i; // put a marque before return (void*) (p+8); } void myfree(char *p,size_t l=0,int nordre=0) { if(p) { p -= 8; int k =0; for( int i = 0; i < 8 ; i++) { if (p[i] != 'a' +i) k++; if(l && (p[i+l+8] != 'z' -i)) k++; } for (size_t i=0;ir) {c[i]=crit;break;} // L8 -> G2 if ((j G2 } } } class AllocData {public: OneAlloc *a; AllocData * next; AllocData(); ~AllocData(); private: AllocData(const AllocExtern::AllocData&); void operator=(const AllocExtern::AllocData&); }; private: static const long Maxundelptr = 2048; static size_t StorageUsage; static size_t AllocSize ; static size_t MaxUsedSize; static AllocData * AllocHead ; static long NbAlloc; static long NbAllocShow; static long NbPtr; static void * NextFree; static long NbuDelPtr; static long uDelPtr[Maxundelptr]; static bool after_end; static char filename[128]; AllocData * NewAllocData(); OneAlloc *Alloc(); public: void * MyNewOperator(size_t ll,bool is_array ); void MyDeleteOperator(void * pp,bool is_array); AllocExtern(); ~AllocExtern(); void init(); int ShowAlloc( const char *s,size_t & lg); bool IsUnDelPtr(long nn) { // dichotomic find long i=0; long j=NbuDelPtr-1; while (i<=j) { long k = (i+j)/2, kn=uDelPtr[k]; if ( nn kn) i = k+1; else return true;} return false; } }; static AllocExtern AllocExternData; size_t AllocExtern::StorageUsage=0; size_t AllocExtern::AllocSize =0; size_t AllocExtern::MaxUsedSize =0; AllocExtern::AllocData * AllocExtern::AllocHead =0; long AllocExtern::NbAlloc =0; long AllocExtern::NbAllocShow=0; long AllocExtern::NbPtr =0; void * AllocExtern::NextFree =0; long AllocExtern::NbuDelPtr =0; long AllocExtern::uDelPtr[Maxundelptr]; bool AllocExtern::after_end =false; char AllocExtern::filename[128] ="ListOfUnAllocPtr.bin"; AllocExtern::AllocData * AllocExtern::NewAllocData() { AllocExtern::AllocData * ad = (AllocData *) mymalloc(sizeof(AllocData)); ad->a = (OneAlloc*) mymalloc(sizeof(OneAlloc)*N100); for (int i=0;ia[i].l=0,ad->a[i].p=NextFree,NextFree = & ad->a[i]; ad->next = AllocHead; AllocHead = ad; #ifdef SHOWALLOC printf("\t\tCheckPtr: OneAlloc[100] %lx\n",this); #endif return ad; } AllocExtern::OneAlloc * AllocExtern::Alloc() { OneAlloc * f = (OneAlloc *) NextFree; if (!f) AllocHead = NewAllocData(); f =(OneAlloc *) NextFree; if (!f) exitalloc(1); NextFree = f->p; return f; } void * AllocExtern::MyNewOperator(size_t ll,bool is_array) { if(after_end) return malloc(ll); init(); AllocExtern::OneAlloc * a = Alloc(); a->p = mymalloc(ll); a->l = ll+1; // pour les allocation null a->n = ++NbAlloc; a->is_array = is_array; NbPtr++; AllocSize += ll; #ifdef DEBUGUNALLOC if ( (IsUnDelPtr(a->n) && (a->n >= DEBUGUNALLOC) )) debugunalloc(); #endif #ifdef SHOWALLOC printf( "\t%d\tCheckPtr: New Alloc %ld %lx when %ld\n ",a->n, ll, a->p, a->n); #endif MaxUsedSize = AllocSize < MaxUsedSize ? MaxUsedSize : AllocSize; if( !ll && !a->p) { if(verbosity>2) { printf("\t\tCheckPtrMem Full Exit(10) New Alloc %ld %p when %ld\n ", ll, a->p, a->n); printf ("\t\tCheckPtr:Max Memory used %10.3f kbytes " , MaxUsedSize/1024. ); printf (" Memory undelete %ld \n" , AllocSize); } exitalloc(1); } return (void*) ((char*)a->p); } void AllocExtern::MyDeleteOperator(void * pp,bool is_array) { if(after_end) { /*free(pp)*/; return;} init(); if (AllocHead) { AllocExtern::AllocData *p = AllocHead; while (p) { for (int i=0;ia[i].l > 0) && (p->a[i].p == pp)) { #ifdef SHOWALLOC printf("\t%d\tCheckPtr: delete Alloc %ld %lx when %ld \n",p->a[i].n,p->a[i].l-1, p->a[i].p, p->a[i].n); #endif size_t ll = p->a[i].l-1; for (size_t kkk=0;kkka[i].n); AllocSize -= ll; NbPtr--; p->a[i].l=0; p->a[i].p = NextFree; p->a[i].n =0; if (p->a[i].is_array != is_array) printf("\t\tCheckPtr: erreur delete [] "); //if( p->a[i].n < NbAllocShow ) debugalloc(); NextFree = & p->a[i].p; return;} p = p->next; } if(pp) { printf( "\t\tCheckPtr: delete of bad pointer %p -----------\n",pp); debugalloc(); } } else myfree((char*)pp); } void AllocExtern::init() { static int count=0; if(0== (count++)) { sprintf(filename,"ListOfAllocPtr-%d.bin",(int) sizeof(void*)); StorageUsage=0; AllocSize =0; MaxUsedSize =0; AllocHead =0; NbAlloc =0; NbPtr =0; NextFree =0; NbuDelPtr =0; NbuDelPtr = 0; after_end = false; FILE *file=fopen(filename,"rb"); if (file) { fread(&NbuDelPtr,sizeof(long),1,file); fread(uDelPtr,sizeof(long),NbuDelPtr,file); if(NbuDelPtr> 100000000 && NbuDelPtr <0) { printf("Fatal error in the file %s is wrong (please remove)",filename); exit(1); } fclose(file); } else { // printf("fopen ListOfUnAllocPtr errno = %d\n",errno); } } } AllocExtern::AllocExtern() { init(); } AllocExtern::~AllocExtern() { if(UnShowAlloc==0) return; OneAlloc * list[Maxundelptr]; AllocData * p=AllocHead; int k=0,kk=0; int lln=0; while (p) {int i=N100; while(i--) if (p->a[i].l >0 ) { if ( p->a[i].n >= p->a[i].n) lln = p->a[i].n; if ( p->a[i].n <= NbAllocShow ) k++; else if (kka+i; } p = p->next; } k+=kk; kk=kk < Maxundelptr ? kk : Maxundelptr; HeapSort(list,kk); if(verbosity > 2) for (int i= kk-10<0 ? 0 : kk-10 ;ip,list[i]->l,list[i]->n); } if (kk) { FILE *file=fopen(filename,"wb"); if (file) { NbuDelPtr=kk; for (int i=0;in; fwrite(&NbuDelPtr,sizeof(long),1,file); fwrite(uDelPtr,sizeof(long),NbuDelPtr,file); fclose(file); } } else {} if(verbosity>2) { if(k) printf ("\t\tCheckPtr:Nb of undelete pointer is %d last %d\n",k,lln); printf ("\t\tCheckPtr:Max Memory used %10.3f kbytes " , MaxUsedSize/1024. ); printf (" Memory undelete %ld \n" , AllocSize); } // clean store pointer p=AllocHead; while (p) { myfree((char*)p->a); AllocData * pold = p; p = p->next; myfree((char*)pold); } AllocHead=0; after_end=true; } // ------------------ void *operator new(size_t ll ) throw (std::bad_alloc) { void * p = AllocExternData.MyNewOperator(ll,false); if (ll && !p) { printf("EXIT BECAUSE MEMORY FULL \n"); exitalloc(1); }; return p;} void *operator new[](size_t ll ) throw (std::bad_alloc) { void * p = AllocExternData.MyNewOperator(ll,true); if (ll && !p) { printf("EXIT BECAUSE MEMORY FULL \n"); exitalloc(1); }; return p;} void operator delete(void * pp) throw () { AllocExternData.MyDeleteOperator(pp,false);} void operator delete[](void * pp) throw () { AllocExternData.MyDeleteOperator(pp,true);} int AllocExtern::ShowAlloc(const char *s,size_t & lg) { size_t m =StorageUsage; StorageUsage =StorageUsed(); if (!NbAllocShow) {NbAllocShow=NbAlloc;} if(verbosity > 2) printf ("----------CheckPtr:-----%s------ NbUndelPtr %ld Alloc: %ld NbPtr %ld Mem Usage: %zu diff: %ld\n",s,NbPtr,AllocSize,NbAlloc,StorageUsage,(long)(StorageUsage-m)); lg = AllocSize; return NbPtr; } int ShowAlloc(const char *s,size_t & lg) { return AllocExternData.ShowAlloc(s,lg);} #else #define XXXX #ifdef XXXX #include #include #include #include long CheckPtr___nbptr=0; size_t CheckPtr___memoryusage =0; void* operator new( size_t size ) throw(std::bad_alloc) { CheckPtr___nbptr++; void *p = malloc( size ); return p; } void* operator new[]( size_t size ) throw(std::bad_alloc) { void *p = malloc(size); CheckPtr___nbptr++; return p; } void operator delete( void *p ) throw() { free(p); CheckPtr___nbptr--; } void operator delete[]( void *p ) throw() { free(p); CheckPtr___nbptr--; } int ShowAlloc(const char *s,size_t & lg) { size_t m =StorageUsed(); long diff = m-CheckPtr___memoryusage; if(verbosity > 0 && CheckPtr___memoryusage!=0 && m != CheckPtr___memoryusage) printf("CheckPtr: Warning memory leak with malloc = %ld \n ",diff); CheckPtr___memoryusage=m; lg = 0; return CheckPtr___nbptr;} int UnShowAlloc =0; #else #include int ShowAlloc(const char *s,size_t & lg) {lg=0; return 0;} int UnShowAlloc =0; #endif #endif freefem++-3.38-1/src/femlib/ConjuguedGradrientNL.cpp000644 000767 000024 00000006650 11406226635 022366 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: 29 fev 2000 // -*- Mode : c++ -*- // // SUMMARY : array modelisation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ template R argmin(R rho,const M & dJ,const KN_ &x,KN_ &h,KN_ &g,KN_ &w) { // find ro / (dJ(x+roh),h) =0 // remark input: dJ(x)=g int k=0; R ro0=0, ro=rho,ro1=rho; R p0= (g,h),p,p1; R ap0=Abs(p0)*0.1; // on arret quand on a divise par 10. x += (ro-rold)* h; rold=ro; g =A(x); p= ( p1 = (g,h) ); bool loop=true; while (k++<100 && loop) { // calcul du nouveau ro courant if (p0*p1 <0) { // Ok changement de signe ro = (p0*ro1+p1*ro0)/ (p0+p1); x += (ro-rold)* h; rold=ro; g =A(x); p = (g,h); if ( verbosity >3 ) cout << " ro " << ro << " gh= " << p << "; ro0, gh0 = " << ro0 << " " << p0 << "; ro1, gh1 = " << ro1 << " " << p1 << endl; if(Abs(p) <= ap0 || k>10 ) return ro; if(p0*p<0) { p1=p;ro1=ro;} else {p0=p;ro0=ro;} } else { ro *=2; x += (ro-rold)* h; rold=ro; g =A(x); p = (g,h); p1=p; ro1=ro; } } } template int ConjuguedGradientNL(const M & dJ,const P & C,KN_ &x,const int nbitermax, double &eps,long kprint=1000000000) { // ------------- throwassert(&x && &b && &A && &C); typedef KN Rn; int n=b.N(); if (verbosity>99) kprint=1; throwassert(n==x.N()); R ro=1; Rn g(n),h(n),Ah(n), & Cg(Ah); // on utilise Ah pour stocke Cg g = dJ(x); Cg = C*g; // gradient preconditionne h =-Cg; R g2 = (Cg,g); if (g2 < 1e-30) { if(verbosity>1) cout << "GCNL g^2 =" << g2 << " < 1.e-30 Nothing to do " << endl; return 2; } if (verbosity>5 ) cout << " 0 GCNL g^2 =" << g2 << endl; R reps2 =eps >0 ? eps*eps*g2 : -eps; // epsilon relatif eps = reps2; for (int iter=0;iter<=nbitermax;iter++) { ro = argmin(J,x,h,g,Ah); Cg = C*g; R g2p=g2; g2 = (Cg,g); if ( verbosity >1 ) cout << "CGNL:" < // class for 1 linear form // just copy a array // Warning this class are use at compilating time // ---------------------------------------------- using Fem2D::operatortype; using Fem2D::op_id; using Fem2D::op_dx; using Fem2D::op_dy; using Fem2D::op_dz; using Fem2D::last_operatortype; template inline T * NewCopy(const T * const o,int n) { int m=n; T * c = new T [n]; for (int i=0;i inline T * NewCopy(const T * const o,int n,int m) { throwassert(m<=n); T * c = new T [n]; for (int i=0;i struct triplet { typedef T1 first_type; typedef T2 second_type; typedef T3 third_type; T1 first; T2 second; T3 third; triplet() : first(),second(),third() {} triplet(const T1& x, const T2& y, const T3& z) : first(x),second(y), third(z) {} template inline triplet(const triplet& p) : first(p.first),second(p.second),third(p.third) {} }; template inline triplet make_triplet(T1 x, T2 y, T3 z) { return triplet(x, y, z); } template class LinearComb : public E_F0mps { public: typedef I TI; typedef R TR; typedef size_t size_type; typedef pair K; typedef vector array; typedef typename array::const_iterator const_iterator; typedef typename array::iterator iterator; array v; vector where_in_stack_opt; vector mesh_indep_stack_opt; const E_F0_Optimize * optiexp0,*optiexpK; bool isoptimize; LinearComb(): v(), where_in_stack_opt(),mesh_indep_stack_opt(), optiexp0(0),optiexpK(0),isoptimize(false) {} LinearComb(const I& i,const R& r) :v(1), where_in_stack_opt(),mesh_indep_stack_opt(), optiexp0(),optiexpK(),isoptimize(false) { v[0]=make_pair((I)i,(R)r); } LinearComb(const LinearComb &l) :v(l.v), where_in_stack_opt(l.where_in_stack_opt), mesh_indep_stack_opt(l.mesh_indep_stack_opt), optiexp0(l.optiexp0),optiexpK(l.optiexpK),isoptimize(false){} int nbtrue(bool *ok) const { int k=0; for (size_t i=0;i &l) { v=l.v; where_in_stack_opt=l.where_in_stack_opt; mesh_indep_stack_opt=l.mesh_indep_stack_opt; optiexp0=l.optiexp0; optiexpK=l.optiexpK; isoptimize=l.isoptimize; } const I * simple() const { if (v.size()==1) return & v.begin()->first;else return 0;} void add(const I& i,const R &r) { for (iterator k=v.begin();k!=v.end();k++) if (k->first == i) {k->second += r;return ;} v.push_back(make_pair((I)i,(R)r)); } size_type size() const { return v.size();} const K & operator[](size_type i) const { return v[i];} void operator+=(const LinearComb & l) { for (const_iterator k=l.v.begin();k!=l.v.end();k++) { const K & kk(*k); add(kk.first,kk.second);} } void operator*=(const R & r) { for (iterator k=v.begin();k!=v.end();k++) {K & kk(*k); kk.second = kk.second*r;} } void operator/=(const R & r) { for (iterator k=v.begin();k!=v.end();k++) {K & kk(*k); kk.second = kk.second/r; } } AnyType operator()(Stack ) const { return SetAny * >(this);} operator aType () const { return atype();} bool mappable(bool (*f)(const R &)) const { for (const_iterator k=v.begin();k!=v.end();k++) if (!(*f)(k->second)) return false; return true;} void mapping(R (*f)(const R &)) { for (iterator k=v.begin();k!=v.end();k++) k->second=(*f)(k->second) ;} int MaxOp() const { int m=0; for (const_iterator k=v.begin();k!=v.end();k++) m= maxop(m,(k->first)) ; return m;} void DiffOp(KN_ &d) const { assert(d.N() >= last_operatortype); d=false; for (const_iterator k=v.begin();k!=v.end();k++) SetOp(d,k->first); } unsigned int DiffOp(int & lastop) const { unsigned int d=0; lastop=0; for (const_iterator k=v.begin();k!=v.end();k++) d |= GetDiffOp(k->first,lastop); assert(lastop > ll; MapOfE_F0 m; rr.where_in_stack_opt.resize(n); rr.mesh_indep_stack_opt.resize(n); size_type top = b->OffSet(0), topbb=top; // FH. bofbof ??? for (int i=0; iMeshIndependent(); rr.where_in_stack_opt[i]=ee->Optimize(ll, m, top); if (kdump) cout << "\n\t\t"<< i << " " << ri.first << ": " << rr.where_in_stack_opt[i] << endl; } b->OffSet(top-topbb); // int k=ll.size(),k0=0,k1=0; for (int i=0;iMeshIndependent()) k0++; deque > l0(k0),l1(k-k0); k0=0,k1=0; for (int i=0;iMeshIndependent()) { if (kdump) cout << " mi " << ll[i].second << " " << *(ll[i].first) << endl; l0[k0++]=ll[i]; } else { if (kdump) cout << " md " << ll[i].second << " " << *(ll[i].first) << endl; l1[k1++]=ll[i]; } if (k0) rr.optiexp0 = new E_F0_Optimize(l0,m,0); if (k1) rr.optiexpK = new E_F0_Optimize(l1,m,0); rr.isoptimize=true; if (kdump) cout << "LinearCom Optimize k0(mi) = " << k0 << " k1 = " << k1 << "\n\n"< LinearComb operator+(const LinearComb & a,const LinearComb & b) {LinearComb r(a);r+=b;return r;} template LinearComb operator*(const LinearComb & a,const R & b) {LinearComb r(a);r*=b;return r;} template LinearComb operator*(const R & b,const LinearComb & a) {LinearComb r(a);r*=b;return r;} class MGauche :public pair {public: MGauche() {} MGauche(int i,operatortype j) {first = i;second= j;} MGauche(const pair &p) : pair(p){} bool operator==(const MGauche& a) const { return static_cast(first == a.first && second == a.second);} int maxop(int op) const { return Max(op,(int) second);} }; class MDroit :public pair {public: MDroit(){} MDroit(int i,operatortype j) {first = i;second =j;} // first : number of unknow // second : number of operator ( 0 Id, 1 dx, 2 dy) MDroit(const pair &p) : pair(p){} bool operator==(const MDroit& a) const { return static_cast(first == a.first && second == a.second);} }; inline ostream & operator<<(ostream & f,const MDroit & p) { f << p.first <<','< inline ostream & operator<<(ostream & f,const pair &p) { f << p.first <<" "< LinearOperatorG; typedef LinearComb LinearOperatorD; typedef LinearComb,C_F0> BilinearOperator; inline int maxop(int op,const MGauche & v) { return Max(op,(int) v.second);} inline int maxop(int op,const MDroit & v) { return Max(op,(int) v.second);} inline int maxop(int op,const pair & b) { return Max(op,(int) b.first.second,(int) b.second.second );} inline BilinearOperator operator*(const LinearOperatorG & a,const LinearOperatorD & b) { BilinearOperator r; for (LinearOperatorG::const_iterator i=a.v.begin();i!=a.v.end();i++) for (LinearOperatorD::const_iterator j=b.v.begin();j!=b.v.end();j++) { const LinearOperatorG::K vi(*i); const LinearOperatorD::K vj(*j); r.add(make_pair(vi.first,vj.first),vi.second*vj.second); } return r; } inline BilinearOperator operator*(const LinearOperatorD & b,const LinearOperatorG & a) { BilinearOperator r; for (LinearOperatorG::const_iterator i=a.v.begin();i!=a.v.end();i++) for (LinearOperatorD::const_iterator j=b.v.begin();j!=b.v.end();j++) { const LinearOperatorG::K vi(*i); const LinearOperatorD::K vj(*j); r.add(make_pair(vi.first,vj.first),vi.second*vj.second); } return r; } ostream & operator<<(ostream & f,const BilinearOperator & a); inline ostream & operator<<(ostream & f,const BilinearOperator & a) { int k=0; for (BilinearOperator::const_iterator i=a.v.begin();i!=a.v.end();i++) { const BilinearOperator::K vi(*i); const char * www[]={" ","_x ","_y "}; const pair,pair > i1(vi.first); const pair ii(i1.first),jj(i1.second); f << *(const E_F0 *) vi.second << char('u'+ii.first) << www[ii.second] << " " << char('u'+jj.first)<<"'" << www[jj.second] ; if ( (++k%5)==0) f << endl ; else f << " "; } return f; } typedef LinearOperatorD LOperaD; typedef LinearOperatorG LOperaG; typedef BilinearOperator Opera; inline LOperaG DiffG(int i,operatortype j) { return LOperaG(make_pair(i,j),*pOne);} inline LOperaD DiffD(int i,operatortype j) { return LOperaD(make_pair(i,j),*pOne);} inline LOperaG *newU_(int i) { LOperaG * r; r= new LOperaG(make_pair(i,op_id),*pOne); SHOWVERB( cout << "newU_ " << r << endl); return r; } inline LOperaG *newU_x(int i) { return new LOperaG(make_pair(i,op_dx),*pOne);} inline LOperaG *newU_y(int i) { return new LOperaG(make_pair(i,op_dy),*pOne);} inline LOperaD *newV_(int i) { return new LOperaD(make_pair(i,op_id),*pOne);} inline LOperaD *newV_x(int i) { return new LOperaD(make_pair(i,op_dx),*pOne);} inline LOperaD *newV_y(int i) { return new LOperaD(make_pair(i,op_dy),*pOne);} template L * Diff(const L * u,const operatortype & d) { throwassert(u); L * r= new L(*u); for (typename L::iterator i=r->v.begin();i!=r->v.end();i++) { operatortype & dd=i->first.second; if (dd != op_id) { ffassert(0); i->first.second = op_id; } // a faire else { ffassert(i->second.EvaluableWithOutStack());// a faire derivation des fonctions dd = d ; } } return r;} template L * CONJ_op(const L * u) { throwassert(u); L * r= new L(*u); for (typename L::iterator i=r->v.begin();i!=r->v.end();i++) { typename L::TR & cc=i->second; if( cc.right()==atype() ) i->second= C_F0(TheOperators,"\'",cc); } return r;} template int MaxOp(const L * u) { throwassert(u); int op=0; for (typename L::const_iterator i=u->v.begin();i!=u->v.end();i++) op = maxop(op,i->first); return op;} template class CODE_L1 { public: typedef L* Result; typedef L* (*func)(const basicAC_F0 & args) ; static L* f(const basicAC_F0 & args) { return ff(args);} // ff :A-> L* static ArrayOfaType typeargs() {return ArrayOfaType(atype);} }; template class CODE_L_Add { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a(dynamic_cast((Expression) args[0])); const L * b(dynamic_cast((Expression) args[1])); throwassert(a && b ); return new L(*a+*b);} static ArrayOfaType typeargs() {return ArrayOfaType(atype(),atype());} }; template class CODE_L_Sub { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a(dynamic_cast((Expression) args[0])); const L * b(dynamic_cast((Expression) args[1])); throwassert(a && b ); L * bb = new L(*pminusOne * *b); return new L(*a+*bb);} static ArrayOfaType typeargs() {return ArrayOfaType(atype(),atype());} }; template class CODE_L_Minus { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a(dynamic_cast((Expression) args[0])); throwassert(a && pminusOne ); return new L(*pminusOne * *a);} static ArrayOfaType typeargs() {return ArrayOfaType(atype());} }; template class CODE_L_Plus { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a(dynamic_cast((Expression) args[0])); throwassert(a ); return new L( *a);} static ArrayOfaType typeargs() {return ArrayOfaType(atype());} }; template class CODE_L_Mul { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const A * a(dynamic_cast((Expression) args[0])); const B * b(dynamic_cast((Expression) args[1])); SHOWVERB(cout << " CODE_L_Mul " << a << " " << b << endl); throwassert(a && b ); return new L(*a * *b);} static ArrayOfaType typeargs() {return ArrayOfaType(atype(),atype());} }; template class CODE_L_MulRL { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * b(dynamic_cast((Expression) args[1])); if (!b) { cout << " --- " << ((Expression) args[1]) << typeid((Expression) args[1]).name() << endl; throwassert( b ); } return new L(to(args[0]) * *b);} static ArrayOfaType typeargs() {return ArrayOfaType(atype(),atype());} }; template class CODE_L_MulLR { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a(dynamic_cast((Expression) args[0])); throwassert( a ); return new L(to(args[1]) * *a);} static ArrayOfaType typeargs() {return ArrayOfaType(atype(),atype());} }; template class CODE_L_DivLR { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a(dynamic_cast((Expression) args[0])); throwassert( a ); return new L(C_F0(TheOperators,"/",*pOne,args[1]) * *a);} static ArrayOfaType typeargs() {return ArrayOfaType(atype(),atype());} }; template class CODE_Diff { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a=dynamic_cast((Expression) args[0]) ; throwassert( a ); return Diff(a,op);} static ArrayOfaType typeargs() {return ArrayOfaType(atype());} }; template class CODE_conj { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * a=dynamic_cast((Expression) args[0]) ; throwassert( a ); return CONJ_op(a);} static ArrayOfaType typeargs() {return ArrayOfaType(atype());} }; enum TheCode_VF { Code_Jump=1, Code_Mean=2, Code_OtherSide=3}; template class Code_VF { public: typedef const L* Result; static E_F0 * f(const basicAC_F0 & args) { const L * u=dynamic_cast((Expression) args[0]) ; assert( u ); L * r= new L(*u); for (typename L::iterator i=r->v.begin();i!=r->v.end();i++) { operatortype & dd=i->first.second; assert(dd());} }; freefem++-3.38-1/src/femlib/Drawing.cpp000644 000767 000024 00000046402 12417753344 017750 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "error.hpp" #include #include #include #include #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" namespace Fem2D { void NewSetColorTable(int nb,float *colors=0,int nbcolors=0,bool hsv=true) { if(colors && nbcolors) SetColorTable1(nb,hsv,nbcolors,colors); else SetColorTable(nb); } int dichotomie(const RN_ &viso,R v) { int i=0,j=viso.N(),k; if (v viso[j-1]) return -1; while (i v) j=k; else i=k; return i; } void plot(long i) { char buf[24]; snprintf(buf,24,"%ld",i); plotstring(buf); } void plot(int i) { char buf[24]; snprintf(buf,24,"%d",i); plotstring(buf); } void plot(double i) { char buf[24]; snprintf(buf,24,"%g",i); plotstring(buf); } void DrawIsoT(const R2 Pt[3],const R ff[3],const RN_ & Viso); void DrawIsoTfill(const R2 Pt[3],const R ff[3],const RN_ & Viso,double rapz); void FillRect(float x0,float y0, float x1, float y1) { float r[8]; r[0]=x0;r[1]=y0; r[2]=x1;r[3]=y0; r[4]=x1;r[5]=y1; r[6]=x0;r[7]=y1; fillpoly(4,r); } void PlotValue(const RN_ & Viso,int k0,const char * cmm) { float xmin,xmax,ymin,ymax; // cout << "PlotValue " << Viso << endl; // int ix,iy; // GetSizeScreen(ix,iy); getcadre(xmin,xmax,ymin,ymax); float dx=(xmax-xmin); float dy=(ymax-ymin); // 10 points // int kk = Max(30,iy/10); float h=GetHeigthFont(); float x0=xmin+dx*0.8; float y= ymin+dy*0.95; // cout << x0 << " " << y << " " << h << endl; y -= k0* h*1.4; couleur(0); FillRect(x0-h*0.5,y-h*(1.4*Viso.N()+0.3),x0+h*9,y+h*1.5); couleur(1); rmoveto(x0+1.2*h,y); plotstring(cmm); y -= h*1.4; for (int i=0;i0) InitDraw(); SetColorTable(16) ; for (int i=0;i cc) uv = uv*(cc/l); MoveTo(P[j]); LineTo(P[j]+uv); if (l>kk) { LineTo(P[j]+uv+dd+dn); MoveTo(P[j]+uv+dd-dn); LineTo(P[j]+uv);} } } } } void DrawIsoT(const R2 Pt[3],const R ff[3],const RN_ & Viso) { R2 PQ[5]; int NbIso = Viso.N(); for(int l=0;l< NbIso;l++) /* loop on the level curves */ { R xf = Viso[l]; int im=0; for(int i=0;i<3;i++) // for the 3 edges { int j = (i+1)%3; R fi=(ff[i]); R fj=(ff[j]); if(((fi<=xf)&&(fj>=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)<=0.1e-10) /* one side must be drawn */ { couleur(l+4); MoveTo(Pt[i]); LineTo(Pt[j]); } else { R xlam=(fi-xf)/(fi-fj); PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } } if (im>=2) /* draw one segment */ { couleur(l+4); MoveTo(PQ[0]); LineTo(PQ[1]); } } } void DrawIsoTfill(const R2 Pt[3],const R ff[3],const RN_ & Viso,double rapz) { R2 PQ[10]; int NbIso = Viso.N(); R eps= (Viso[NbIso-1]-Viso[0])*1e-6; for(int l=1;l< NbIso;l++) // loop on the level curves { R xfb = Viso[l-1]; R xfh = Viso[l]; int im=0; for(int i=0;i<3;i++) // for the 3 edges { int j=(i+1)%3; R fi=(ff[i]); R fj=(ff[j]); R xxfb = xfb; R xxfh = xfh; if (fj=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)>=0.1e-20) { R xlam=(fi-xf)/(fi-fj); PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } xf = xxfh; if(((fi<=xf)&&(fj>=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)>=0.1e-20) { R xlam=(fi-xf)/(fi-fj); PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } if ( xfb-eps <=fj && fj <= xfh+eps) PQ[im++] = Pt[j]; } if (im>2) { float f[20]; int k=0; for (int i=0;i void TBoundaryEdge::Draw() const { couleur(2+(lab%6)); MoveTo(*vertices[0]); LineTo(*vertices[1]); } template void FElement::SaveDraw(const KN_ & U,int composante,R* Usave) const { int nsb = nbsubdivision(); int nsbv = NbOfSubInternalVertices(nsb); int nbdf=NbDoF(); KN fk(nbdf); for (int i=0;i void FElement::SaveDraw(const KN_ & U,const KN_ & V,int iU,int iV,R * Usave) const { int nsb = nbsubdivision(); int nsbv = NbOfSubInternalVertices(nsb); int nbdf=NbDoF(); KN fk(nbdf); KN gk(nbdf); for (int i=0;i KN FESpace::newSaveDraw(const KN_ & U,int composante,int & lg,int & nsb) const { nsb = TFE[0]->nbsubdivision; int nsbv = NbOfSubInternalVertices(nsb); lg = nsbv*Th.nt; if(verbosity>99) cout << " ++ newSaveDraw what: nt " << Th.nt << " " << nsbv << " " << lg << endl; KN v(lg); ffassert(v); for (int k=0,i=0;k(true,v);// to remove the copy. } template KN FESpace::newSaveDraw(const KN_ & U,const KN_ & V,int iU,int iV,int & lg,int & nsb) const { nsb = TFE[0]->nbsubdivision; int nsbv = NbOfSubInternalVertices(nsb)*2; lg = nsbv*Th.nt; KN v(lg); for (int k=0,i=0;k(true,v);// to remove the copy. } typedef complex Complex; template KN FESpace::newSaveDraw(const KN_ & U,const KN_ & V,int iU,int iV,int & lg,int & nsb) const ; template KN FESpace::newSaveDraw(const KN_ & U,int composante,int & lg,int & nsb) const ; template KN FESpace::newSaveDraw(const KN_ & U,const KN_ & V,int iU,int iV,int & lg,int & nsb) const ; template KN FESpace::newSaveDraw(const KN_ & U,int composante,int & lg,int & nsb) const ; void FESpace::Draw(const RN_& U,const RN_ & Viso,int j,float *colors,int nbcolors,bool hsv,bool drawborder) const { showgraphic(); NewSetColorTable(Viso.N()+4,colors,nbcolors,hsv); for (int k=0;k& U,const KN_& V,int j0,int j1,bool bb) const { R2 Pminmax(1e100,-1e100); for (int k=0;k& U,int j0,bool bb) const { R2 Pminmax(1e100,-1e100); for (int k=0;k& U,const RN_ & Viso, R coef,int j0,int j1,float *colors,int nbcolors,bool hsv,bool drawborder) const { showgraphic(); NewSetColorTable(Viso.N()+5,colors,nbcolors,hsv); for (int k=0;k& U,const KN_& V,const RN_ & Viso, R coef,int iu,int iv,float *colors,int nbcolors,bool hsv,bool drawborder) const { showgraphic(); NewSetColorTable(Viso.N()+5,colors,nbcolors,hsv); for (int k=0;k void TTriangle::Draw(double skrink) const { const TTriangle & K(*this); R2 A(K[0]),B(K[1]),C(K[2]),G((A+B+C)/3.); A = G + (A-G)*skrink; B = G + (B-G)*skrink; C = G + (C-G)*skrink; MoveTo(A); LineTo(B); LineTo(C); LineTo(A); } template void TTriangle::Draw(int edge,double skrink) const { const TTriangle & K(*this); R2 A(K[0]),B(K[1]),C(K[2]),G((A+B+C)/3.); MoveTo(G+(*vertices[(edge+1)%3]-G)*skrink); LineTo(G+(*vertices[(edge+2)%3]-G)*skrink); } template void TTriangle::Draw(double skrink) const; template void TTriangle::Draw(int edge,double skrink) const; template void TTriangle::Fill(int color) const { const TTriangle & K(*this); R2 A(K[0]),B(K[1]),C(K[2]); float p[]={(float)A.x,(float)A.y,(float)B.x,(float)B.y,(float)C.x,(float)C.y}; int c=LaCouleur(); couleur(color); fillpoly(3,p); couleur(c); } void DrawMark(R2 P,R k) { float x0,x1,y0,y1; getcadre(x0,x1,y0,y1); float h= (x1-x0)*(float)k; rmoveto((float)P.x+h,(float)P.y-h); rlineto((float)P.x+h,(float)P.y+h); rlineto((float)P.x-h,(float)P.y+h); rlineto((float)P.x-h,(float)P.y-h); rlineto((float)P.x+h,(float)P.y-h); } Triangle * Mesh::Find(const R2 & P) const { // brute force for (int i=0;i-eps && b >-eps && c >-eps) return triangles + i; } return 0; // outside } template void TMortar::Draw() const { throwassert(Th); for (int i=0;i=3); throwassert(val.M()==1); val=0; // -- if (whatd[op_id]) { RN_ f0(val('.',0,op_id)); f0[0] = 4*l1*l2; // oppose au sommet 0 f0[1] = 4*l0*l2; // oppose au sommet 1 f0[2] = 4*l1*l0; // oppose au sommet 3 } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[1] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[2] = 4*(Dl0.x*l1 + Dl1.x*l0) ; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[1] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[2] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); fxx[0] = 8*Dl1.x*Dl2.x; fxx[1] = 8*Dl0.x*Dl2.x; fxx[2] = 8*Dl0.x*Dl1.x; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); fyy[0] = 8*Dl1.y*Dl2.y; fyy[1] = 8*Dl0.y*Dl2.y; fyy[2] = 8*Dl0.y*Dl1.y; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); fxy[0] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[1] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[2] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } } } // link with FreeFem++ do not work with static library .a // FH so add a extern name to call in init_static_FE (see end of FESpace.cpp) void init_FE_P2h() { }; extern ListOfTFE typefem_P2h; static TypeOfFE_P2hLagrange P2LagrangeP2h; // given the name of the finite element in FreeFem++ ListOfTFE typefem_P2h("P2h", &P2LagrangeP2h); // --- fin -- } // FEM2d namespace freefem++-3.38-1/src/femlib/Element_RT.cpp000644 000767 000024 00000055177 11406226635 020357 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "error.hpp" #include #include #include #include "rgraph.hpp" using namespace std; #include "RNM.hpp" #include "fem.hpp" #include "FESpace.hpp" namespace Fem2D { class TypeOfFE_RT : public TypeOfFE { public: static int Data[]; TypeOfFE_RT(): TypeOfFE(0,1,0,2,Data,1,1,6,3) {const R2 Pt[] = { R2(0.5,0.5), R2(0.0,0.5), R2(0.5,0.0) }; for (int p=0,kk=0;p<3;p++) { P_Pi_h[p]=Pt[p]; for (int j=0;j<2;j++) pij_alpha[kk++]= IPJ(p,p,j); }} // void FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void FB(const bool * watdd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; // void D2_FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; // void Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int, void *) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const ; } ; // on what nu df on node node of df int TypeOfFE_RT::Data[]={3,4,5, 0,0,0, 0,1,2, 0,0,0, 0,1,2, 0,0, 0,0,3,3}; /* void TypeOfFE_RT::D2_FB(const Mesh & ,const Triangle & ,const R2 & ,RNMK_ & val) const { // val=0; }*/ /* void TypeOfFE_RT::FB(const Mesh & Th,const Triangle & K,const R2 & PHat,RNMK_ & val) const { // // const Triangle & K(FE.T); R2 P(K(PHat)); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; // R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==2 ); throwassert(val.K()==3 ); RN_ f0(val('.',0,0)); RN_ f1(val('.',1,0)); val=0; // RN_ df0(val(0,'.',0)); // RN_ fy(val('.','.',2)); // a_i ([x,y]-c_i) , ou c_i = A,B , C si i= 0,1,2 // int_T a_i div([x,y]-c_i) = 1 // div div([x,y]-c_i) = 2 // donc a_i = 1/(2 area T) R a=1./(2*K.area); R a0= K.EdgeOrientation(0) * a ; R a1= K.EdgeOrientation(1) * a ; R a2= K.EdgeOrientation(2) * a ; // if (Th(K)< 2) cout << Th(K) << " " << A << " " << B << " " << C << "; " << a0 << " " << a1 << " "<< a2 << endl;; // ------------ f0[0] = (P.x-A.x)*a0; f1[0] = (P.y-A.y)*a0; f0[1] = (P.x-B.x)*a1; f1[1] = (P.y-B.y)*a1; f0[2] = (P.x-C.x)*a2; f1[2] = (P.y-C.y)*a2; // ---------------- // ---------------- // BUG dans RT correct FH le 17 sept 2002 // dx [x,y] = [1,0] et non [1,1] // dy [x,y] = [0,1] et non [1,1] // ------------------------------------- val(0,0,1) = a0; val(1,0,1) = a1; val(2,0,1) = a2; val(0,1,2) = a0; val(1,1,2) = a1; val(2,1,2) = a2; } */ void TypeOfFE_RT::FB(const bool *whatd,const Mesh & Th,const Triangle & K,const R2 & PHat,RNMK_ & val) const { // // const Triangle & K(FE.T); R2 P(K(PHat)); R2 A(K[0]), B(K[1]),C(K[2]); // R l0=1-P.x-P.y,l1=P.x,l2=P.y; // R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==2 ); // throwassert(val.K()==3 ); val=0; R a=1./(2*K.area); R a0= K.EdgeOrientation(0) * a ; R a1= K.EdgeOrientation(1) * a ; R a2= K.EdgeOrientation(2) * a ; // if (Th(K)< 2) cout << Th(K) << " " << A << " " << B << " " << C << "; " << a0 << " " << a1 << " "<< a2 << endl;; // ------------ if (whatd[op_id]) { assert(val.K()>op_id); RN_ f0(val('.',0,0)); RN_ f1(val('.',1,0)); f0[0] = (P.x-A.x)*a0; f1[0] = (P.y-A.y)*a0; f0[1] = (P.x-B.x)*a1; f1[1] = (P.y-B.y)*a1; f0[2] = (P.x-C.x)*a2; f1[2] = (P.y-C.y)*a2; } // ---------------- // BUG dans RT correct FH le 17 sept 2002 // dx [x,y] = [1,0] et non [1,1] // dy [x,y] = [0,1] et non [1,1] // ------------------------------------- if (whatd[op_dx]) { assert(val.K()>op_dx); val(0,0,op_dx) = a0; val(1,0,op_dx) = a1; val(2,0,op_dx) = a2; } if (whatd[op_dy]) { assert(val.K()>op_dy); val(0,1,op_dy) = a0; val(1,1,op_dy) = a1; val(2,1,op_dy) = a2; } } /* void TypeOfFE_RT::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int j, void * arg) const { const R2 Pt[] = { R2(0.5,0.5), R2(0.0,0.5), R2(0.5,0.0) }; const Triangle & T(K.T); // if (K.number<2) cout << K.number << ": " ; for (int i=0;i<3;i++) { f(v,T(Pt[i]),K,i,Pt[i],arg); R2 E(T.Edge(i)); R signe = T.EdgeOrientation(i) ; val[i]= signe*(v[j]*E.y-v[j+1]*E.x); // if (K.number<2) cout << val[i] << " " ; } // if (K.number<2) cout << endl; } */ void TypeOfFE_RT::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); for (int i=0,k=0;i<3;i++) { R2 E(T.Edge(i)); R signe = T.EdgeOrientation(i) ; v[k++]= signe*E.y; v[k++]=-signe*E.x; } } // ------------------- class TypeOfFE_RTmodif : public TypeOfFE { public: static int Data[]; TypeOfFE_RTmodif(): TypeOfFE(0,1,0,2,Data,1,1,6,3) {const R2 Pt[] = { R2(0.5,0.5), R2(0.0,0.5), R2(0.5,0.0) }; for (int p=0,kk=0;p<3;p++) { P_Pi_h[p]=Pt[p]; for (int j=0;j<2;j++) pij_alpha[kk++]= IPJ(p,p,j); }} // void FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void FB(const bool * whatd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; // void D2_FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; // void Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int, void *) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const ; } ; // on what nu df on node node of df int TypeOfFE_RTmodif::Data[]={3,4,5, 0,0,0, 0,1,2, 0,0,0, 0,1,2, 0,0, 0,0, 3,3}; void TypeOfFE_RTmodif::FB(const bool * whatd,const Mesh & Th,const Triangle & K,const R2 & PHat,RNMK_ & val) const { // // const Triangle & K(FE.T); R2 P(K(PHat)); R2 A(K[0]), B(K[1]),C(K[2]); R la=1-PHat.x-PHat.y,lb=PHat.x,lc=PHat.y; R2 Dla(K.H(0)), Dlb(K.H(1)), Dlc(K.H(2)); if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==2 ); R2 AB(A,B),AC(A,C),BA(B,A),BC(B,C),CA(C,A),CB(C,B); R aa0= 1./(((AB,Dlb) + (AC,Dlc))*K.area); R aa1= 1./(((BA,Dla) + (BC,Dlc))*K.area); R aa2= 1./(((CA,Dla) + (CB,Dlb))*K.area); int i=0; R a0= &K[ (i+1)%3] < &K[ (i+2)%3] ? aa0 : -aa0 ; i=1; R a1= &K[ (i+1)%3] < &K[ (i+2)%3] ? aa1 : -aa1 ; i=2; R a2= &K[ (i+1)%3] < &K[ (i+2)%3] ? aa2 : -aa2 ; // if (Th(K)< 2) cout << Th(K) << " " << A << " " << B << " " << C << "; " << a0 << " " << a1 << " "<< a2 << endl;; R2 Va= AB*(lb*a0) + AC*(lc*a0); R2 Vb= BA*(la*a1) + BC*(lc*a1); R2 Vc= CA*(la*a2) + CB*(lb*a2); R2 Va_x= AB*(Dlb.x*a0) + AC*(Dlc.x*a0); R2 Vb_x= BA*(Dla.x*a1) + BC*(Dlc.x*a1); R2 Vc_x= CA*(Dla.x*a2) + CB*(Dlb.x*a2); R2 Va_y= AB*(Dlb.y*a0) + AC*(Dlc.y*a0); R2 Vb_y= BA*(Dla.y*a1) + BC*(Dlc.y*a1); R2 Vc_y= CA*(Dla.y*a2) + CB*(Dlb.y*a2); if( whatd[op_id]) { RN_ f0(val('.',0,0)); RN_ f1(val('.',1,0)); f0[0] = Va.x; f1[0] = Va.y; f0[1] = Vb.x; f1[1] = Vb.y; f0[2] = Vc.x; f1[2] = Vc.y; } // ---------------- if( whatd[op_dx]) { val(0,0,1) = Va_x.x; val(0,1,1) = Va_x.y; val(1,0,1) = Vb_x.x; val(1,1,1) = Vb_x.y; val(2,0,1) = Vc_x.x; val(2,1,1) = Vc_x.y; } if( whatd[op_dy]) { val(0,0,2) = Va_y.x; val(0,1,2) = Va_y.y; val(1,0,2) = Vb_y.x; val(1,1,2) = Vb_y.y; val(2,0,2) = Vc_y.x; val(2,1,2) = Vc_y.y; } } void TypeOfFE_RTmodif::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); for (int i=0,k=0;i<3;i++) { R2 E(T.Edge(i)); R signe = &T[ (i+1)%3] < &T[ (i+2)%3] ? 1.0 : -1.0 ; v[k++]= signe*E.y; v[k++]=-signe*E.x; } } // --------------------- class TypeOfFE_P0 : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P0(): TypeOfFE(0,0,1,1,Data,1,1,1,1,Pi_h_coef){ pij_alpha[0]=IPJ(0,0,0); P_Pi_h[0]=R2(1./3.,1./3.); } void FB(const bool * watdd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; }; // on what nu df on node node of df int TypeOfFE_P0::Data[]={6, 0, 0, 0 , 0 ,0, 0, 1 }; double TypeOfFE_P0::Pi_h_coef[]={1.0}; void TypeOfFE_P0::FB(const bool* whatd,const Mesh & ,const Triangle & K,const R2 & PHat,RNMK_ & val) const { // // const Triangle & K(FE.T); R2 P(K(PHat)); R2 A(K[0]), B(K[1]),C(K[2]); //R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); throwassert(val.N() >=1); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; if ( whatd[op_id]) val(0,0,0) =1; } // ------ P1 non conforme -------- class TypeOfFE_P1ncLagrange : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P1ncLagrange(): TypeOfFE(0,1,0,1,Data,1,1,3,3,Pi_h_coef) { const R2 Pt[] = { R2(0.5,0.5), R2(0.0,0.5), R2(0.5,0.0) }; for (int i=0;i=3); throwassert(val.M()==1 ); val=0; if (whatd[op_id]) { RN_ f0(val('.',0,0)); // f0[0] = double(l0 <= min(l1,l2) ); // arete f0[1] = double(l1 <= min(l0,l2) ); f0[2] = double(l2 <= min(l0,l1) ); } } /* class TypeOfFE_P1Edge : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P1Edge(): TypeOfFE(0,2,0,1,Data,3,1,12,6,Pi_h_coef) { R2 Pt[6] ; int kk=0; for(int i=0;i<3;++i) for(int j=0;i=0) pij_alpha[kk++]= IPJ(i,other[i],0); P_Pi_h[i]=Pt[i]; } } void FB(const bool * whatd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; } ; // on what nu df on node node of df int TypeOfFE_ConsEdge::Data[]={3,4,5, 0,0,0, 0,1,2, 0,0,0, 0,1,2, 0, 0,3}; double TypeOfFE_ConsEdge::Pi_h_coef[]={1.,1.,1.}; void TypeOfFE_ConsEdge::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); val=0; if (whatd[op_id]) { RN_ f0(val('.',0,0)); // f0[0] = double(l0 <= min(l1,l2) ); // arete f0[1] = double(l1 <= min(l0,l2) ); f0[2] = double(l2 <= min(l0,l1) ); } } */ void TypeOfFE_P1ncLagrange::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); // l1( cshrink1*(cshrink*((1,0)-G)+G)-G)+G = 1 R l0=1-P.x-P.y,l1=P.x,l2=P.y; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; if (whatd[op_id]) { RN_ f0(val('.',0,0)); f0[0] = 1-l0*2; f0[1] = 1-l1*2; f0[2] = 1-l2*2; } if (whatd[op_dx] || whatd[op_dy] ) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = -Dl0.x*2; f0x[1] = -Dl1.x*2; f0x[2] = -Dl2.x*2; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = -Dl0.y*2; f0y[1] = -Dl1.y*2; f0y[2] = -Dl2.y*2; } } } // The RT orthogonal FE class TypeOfFE_RTortho : public TypeOfFE { public: static int Data[]; TypeOfFE_RTortho(): TypeOfFE(0,1,0,2,Data,1,1,6,3) {const R2 Pt[] = { R2(0.5,0.5), R2(0.0,0.5), R2(0.5,0.0) }; for (int p=0,kk=0;p<3;p++) { P_Pi_h[p]=Pt[p]; for (int j=0;j<2;j++) pij_alpha[kk++]= IPJ(p,p,j); }} void FB(const bool * watdd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const ; } ; // on what nu df on node node of df int TypeOfFE_RTortho::Data[]={3,4,5, 0,0,0, 0,1,2, 0,0,0, 0,1,2, 0,0, 0,0, 3,3}; void TypeOfFE_RTortho::FB(const bool *whatd,const Mesh & Th,const Triangle & K,const R2 & PHat,RNMK_ & val) const { // // const Triangle & K(FE.T); R2 P(K(PHat)); R2 A(K[0]), B(K[1]),C(K[2]); //R l0=1-P.x-P.y,l1=P.x,l2=P.y; // R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==2 ); // throwassert(val.K()==3 ); val=0; R a=1./(2*K.area); R a0= K.EdgeOrientation(0) * a ; R a1= K.EdgeOrientation(1) * a ; R a2= K.EdgeOrientation(2) * a ; // if (Th(K)< 2) cout << Th(K) << " " << A << " " << B << " " << C << "; " << a0 << " " << a1 << " "<< a2 << endl;; // ------------ if (whatd[op_id]) { assert(val.K()>op_id); RN_ f0(val('.',0,0)); RN_ f1(val('.',1,0)); f1[0] = (P.x-A.x)*a0; f0[0] = -(P.y-A.y)*a0; f1[1] = (P.x-B.x)*a1; f0[1] = -(P.y-B.y)*a1; f1[2] = (P.x-C.x)*a2; f0[2] = -(P.y-C.y)*a2; } // ---------------- if (whatd[op_dx]) { assert(val.K()>op_dx); val(0,1,op_dx) = a0; val(1,1,op_dx) = a1; val(2,1,op_dx) = a2; } if (whatd[op_dy]) { assert(val.K()>op_dy); val(0,0,op_dy) = -a0; val(1,0,op_dy) = -a1; val(2,0,op_dy) = -a2; } } void TypeOfFE_RTortho::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); for (int i=0,k=0;i<3;i++) { R2 E(T.Edge(i)); R signe = &T[ (i+1)%3] < &T[ (i+2)%3] ? 1.0 : -1.0 ; v[k++]= signe*E.x; v[k++]= signe*E.y; } } // ------------------- // ttdc finite element fully discontinue. // ------------------- class TypeOfFE_P1ttdc : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; static const R2 G; static const R cshrink; static const R cshrink1; // (1 -1/3)* static R2 Shrink(const R2& P){ return (P-G)*cshrink+G;} static R2 Shrink1(const R2& P){ return (P-G)*cshrink1+G;} TypeOfFE_P1ttdc(): TypeOfFE(0,0,3,1,Data,1,1,3,3,Pi_h_coef) { const R2 Pt[] = { Shrink(R2(0,0)), Shrink(R2(1,0)), Shrink(R2(0,1)) }; for (int i=0;i & u,int componante,int op) const ; } ; const R2 TypeOfFE_P1ttdc::G(1./3.,1./3.); const R TypeOfFE_P1ttdc::cshrink=1-1e-2; const R TypeOfFE_P1ttdc::cshrink1=1./TypeOfFE_P1ttdc::cshrink; class TypeOfFE_P2ttdc : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; static const R2 G; static const R cshrink; static const R cshrink1; static R2 Shrink(const R2& P){ return (P-G)*cshrink+G;} static R2 Shrink1(const R2& P){ return (P-G)*cshrink1+G;} TypeOfFE_P2ttdc(): TypeOfFE(0,0,6,1,Data,3,1,6,6,Pi_h_coef) { const R2 Pt[] = { Shrink(R2(0,0)), Shrink(R2(1,0)), Shrink(R2(0,1)), Shrink(R2(0.5,0.5)),Shrink(R2(0,0.5)),Shrink(R2(0.5,0)) }; for (int i=0;i & u,int componante,int op) const { R2 PHat=Shrink1(P1Hat); R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))); R r=0; if (op==0) { R l0=1-PHat.x-PHat.y,l1=PHat.x,l2=PHat.y; r = u0*l0+u1*l1+l2*u2; } else { const Triangle & T=K.T; R2 D0 = T.H(0)*cshrink1 , D1 = T.H(1)*cshrink1 , D2 = T.H(2)*cshrink1 ; if (op==1) r = D0.x*u0 + D1.x*u1 + D2.x*u2 ; else r = D0.y*u0 + D1.y*u1 + D2.y*u2 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1ttdc::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P1,RNMK_ & val) const { R2 P=Shrink1(P1); // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd[op_id]) { f0[0] = l0; f0[1] = l1; f0[2] = l2;} if (whatd[op_dx] || whatd[op_dy]) { R2 Dl0(K.H(0)*cshrink1), Dl1(K.H(1)*cshrink1), Dl2(K.H(2)*cshrink1); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x; f0x[1] = Dl1.x; f0x[2] = Dl2.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y; f0y[1] = Dl1.y; f0y[2] = Dl2.y; } } } void TypeOfFE_P2ttdc::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P1,RNMK_ & val) const { R2 P=Shrink1(P1); // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=6); throwassert(val.M()==1); // throwassert(val.K()==3 ); val=0; // -- if (whatd[op_id]) { RN_ f0(val('.',0,op_id)); f0[0] = l0*(2*l0-1); f0[1] = l1*(2*l1-1); f0[2] = l2*(2*l2-1); f0[3] = 4*l1*l2; // oppose au sommet 0 f0[4] = 4*l0*l2; // oppose au sommet 1 f0[5] = 4*l1*l0; // oppose au sommet 3 } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)*cshrink1), Dl1(K.H(1)*cshrink1), Dl2(K.H(2)*cshrink1); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x*l4_0; f0x[1] = Dl1.x*l4_1; f0x[2] = Dl2.x*l4_2; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) ; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y*l4_0; f0y[1] = Dl1.y*l4_1; f0y[2] = Dl2.y*l4_2; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); fxx[0] = 4*Dl0.x*Dl0.x; fxx[1] = 4*Dl1.x*Dl1.x; fxx[2] = 4*Dl2.x*Dl2.x; fxx[3] = 8*Dl1.x*Dl2.x; fxx[4] = 8*Dl0.x*Dl2.x; fxx[5] = 8*Dl0.x*Dl1.x; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); fyy[0] = 4*Dl0.y*Dl0.y; fyy[1] = 4*Dl1.y*Dl1.y; fyy[2] = 4*Dl2.y*Dl2.y; fyy[3] = 8*Dl1.y*Dl2.y; fyy[4] = 8*Dl0.y*Dl2.y; fyy[5] = 8*Dl0.y*Dl1.y; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); fxy[0] = 4*Dl0.x*Dl0.y; fxy[1] = 4*Dl1.x*Dl1.y; fxy[2] = 4*Dl2.x*Dl2.y; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } } } // // end ttdc // ------------------ static TypeOfFE_RTortho The_TypeOfFE_RTortho; static TypeOfFE_RT The_TypeOfFE_RT; static TypeOfFE_P0 The_TypeOfFE_P0; static TypeOfFE_P1ttdc The_TypeOfFE_P1ttdc; static TypeOfFE_P2ttdc The_TypeOfFE_P2ttdc; static TypeOfFE_RTmodif The_TypeOfFE_RTmodif; static TypeOfFE_P1ncLagrange The_TypeOfFE_P1nc; static TypeOfFE_ConsEdge The_TypeOfFE_ConsEdge; // add FH TypeOfFE & RTLagrangeOrtho(The_TypeOfFE_RTortho); TypeOfFE & RTLagrange(The_TypeOfFE_RT); TypeOfFE & RTmodifLagrange(The_TypeOfFE_RTmodif); TypeOfFE & P0Lagrange(The_TypeOfFE_P0); TypeOfFE & P1ncLagrange(The_TypeOfFE_P1nc); TypeOfFE & P1ttdc(The_TypeOfFE_P1ttdc); TypeOfFE & P2ttdc(The_TypeOfFE_P2ttdc); TypeOfFE & P0edge(The_TypeOfFE_ConsEdge); } freefem++-3.38-1/src/femlib/fem.cpp000644 000767 000024 00000157646 12510166272 017131 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ extern long verbosity ; extern long searchMethod; //pichon #include #include #include #include "error.hpp" #include #include //#include //using namespace std; //introduces namespace std #include "RNM.hpp" #include "rgraph.hpp" #include "Serialize.hpp" #include "fem.hpp" #include namespace Fem2D { class SubMortar { friend class Mesh; friend ostream & operator<<(ostream & f,const SubMortar & m); R alpha; // angle in radian R2 from,to; int k; // triangle number int i; // edge on triangle int sens; // // int head; public: SubMortar() :alpha(0),k(0),i(0),sens(0){} SubMortar(const Vertex & s,const Vertex & ss,int kk,int ii,int se) : alpha(Theta((R2) ss - s)),from(s),to(ss),k(kk),i(ii),sens(se) {} R len2() const { return Norme2_2(to-from);} R len2(const R2 & A) const{ return (to-from,(A-from));} bool operator<(const SubMortar & b){ return alpha < b.alpha ;} // to sort // bool side(const Triangle &K) {} }; ostream & operator<<(ostream & f,const SubMortar & m) { f << " a=" << m.alpha << " " << m.k << " " << m.i << " " << m.sens << " l^2=" <=0 && v < nv); BoundaryAdjacencesLink[j2]=BoundaryAdjacencesHead[v]; BoundaryAdjacencesHead[v]=j2; } } } void Mesh::ConsAdjacence() { // warning in the paper a mortar is the whole edge of the coarse triangle // here a mortar is a connected componand of he whole edge of the coarse triangle // minus the extremite of mortar // ----------- int NbCollision=0,NbOfEdges=0,NbOfBEdges=0,NbOfMEdges=0; const char MaskEdge[]={1,2,4}; const char AddMortar[]={8,16,32}; // reffecran(); // cadreortho(0.22,0.22,.1); if (neb) BuildBoundaryAdjacences(); area=0; // FH add nov 2010 lenbord=0; // FH add nov 2010 if(TheAdjacencesLink) return; // TheAdjacencesLink = new int[3*nt]; const int NbCode = 2*nv; char * TonBoundary = new char [nt]; // the edge is 1 2 4 AddMortar = 8 { int * Head = new int[NbCode]; // make the list int i,j,k,n,j0,j1; for ( i=0; i=0; n=TheAdjacencesLink[n]) { int jj=n%3,ii=n/3, jj0,jj1; VerticesNumberOfEdge(triangles[ii],jj,jj0,jj1); if(im==Min(jj0,jj1)) // same edge kk++; } if (kk==1) { if(step) bedges[neb].set(vertices,j0,j1,1); neb++; } } } if (step==0) { if (verbosity) cout << " we build " << neb << " boundary edges" << endl; bedges = new BoundaryEdge[neb]; } } BuildBoundaryAdjacences(); } for (int k=0;k=0 && i0 < nv); throwassert(i1 >=0 && i1 < nv); throwassert(i1 != i0) ; int im=Min(i0,i1); BoundaryEdgeHeadLink[i]=-1; for ( n=Head[i0+i1]; n>=0; n=TheAdjacencesLink[n]) { int jj=n%3,ii=n/3, jj0,jj1; VerticesNumberOfEdge(triangles[ii],jj,jj0,jj1); if(im==Min(jj0,jj1)) // same edge { TonBoundary[n/3] += MaskEdge[n%3]; BoundaryEdgeHeadLink[i]=n; if(i0==jj0) break; // FH 01072005 bon cote de l'arete // sinon on regard si cela existe? } } if ( BoundaryEdgeHeadLink[i] <0 && verbosity) cout << " Attention l'arete frontiere " << i << " n'est pas dans le maillage " <=0) // be carefull { int m=*pm,jj=m%3,ii=m/3, jj0,jj1; VerticesNumberOfEdge(triangles[ii],jj,jj0,jj1); if(jm==Min(jj0,jj1)) // same edge { NbAdj++; // remove from the liste *pm=TheAdjacencesLink[m]; TheAdjacencesLink[m]=He; // link to He He = m; } else { NbCollision++; pm=TheAdjacencesLink+*pm; // next } } // make a circular link if (NbAdj>0) { int m=He; while(TheAdjacencesLink[m]>=0) m=TheAdjacencesLink[m]; // find end of list // close the List of common edges TheAdjacencesLink[m] = He; } if (NbAdj >2) { int m=He; do { m=TheAdjacencesLink[m]; } while(TheAdjacencesLink[m]!=He); } if (NbAdj) NbOfEdges++; if(NbAdj==1) { if (! (TonBoundary[i]& MaskEdge[j])) { NbOfMEdges++; if(verbosity>99) cout << " Edge (" << j0 << " "<< j1 << ") : " << j << " of Triangle " << &T-triangles << " on mortar \n" <<" --- > " << number(T[0]) << " " << number(T[1]) << " " << number(T[2]) << " /" << int(TonBoundary[i])<< "\n" ; TonBoundary[i]+= AddMortar[j]; } else { NbOfBEdges++; } } } } if (verbosity>1 ) { cout << " Nb of Vertices " << nv << " , Nb of Triangles " << nt << endl ; cout << " Nb of edge on user boundary " << neb << " , Nb of edges on true boundary " << NbOfBEdges << endl; if(NbOfMEdges) cout << " Nb of edges on Mortars = " << NbOfMEdges << endl; } delete [] Head; // cleanning memory NbMortars =0; NbMortarsPaper=0; } { // construct the mortar int * linkg = new int [nv]; // to link int * linkd = new int [nv]; // to link int * NextT3= new int[3*nt]; int * headT3= new int[nv]; ffassert( linkg && linkd); for (int i=0;i i is on mortars // make a link for all triangles contening a mortars const int k100=100; SubMortar bmortars[k100]; int k3j=0; for (int k=0;k2) cout << " sizeof datamortars" << kdm << " NbMortars=" << NbMortars << endl; mortars = new Mortar [NbMortars]; datamortars = new int [kdm]; for (int i=0;i=0; p=NextT3[p]) { // for all nonconformitie around sm int k=p/3; int i=p%3; const Triangle & T(triangles[k]); //throwassert( vertices + sm == &T[i]); // for the 2 egdes contening the vertex j of the triangle k for (int jj=0;jj<2;jj++) // 2 edge j contening i { int j = EdgesVertexTriangle[i][jj]; int s0,s1; VerticesNumberOfEdge(T,j,s0,s1); throwassert (s0 == is || s1 == is); if ( TonBoundary[k] & AddMortar[j]) { int ss,sens; if ( s0 == is) { ss=s1;sens=1;} else { ss=s0;sens=-1;} const Vertex & vss( vertices[ss]); bmortars[km++] = SubMortar(S,vss,k,i,sens); throwassert(km=0);// on a mortar ?? for ( p=headT3[sm] ;p>=0; p=NextT3[p]) { k=p/3; i=p%3; const Triangle & T(triangles[k]); // couleur(1);T.Draw(0.3); throwassert( vertices + sm == &T[i]); // for the 2 egdes contening the vertex j of the triangle k j = EdgesVertexTriangle[i][dg]; Vertex &V = T[VerticesOfTriangularEdge[j][dg]]; throwassert( &T[VerticesOfTriangularEdge[j][gd]] == vertices + sm); if ( TonBoundary[k] & AddMortar[j]) { // check the sens and the direction // cout << number(T[VerticesOfTriangularEdge[j][gd]]) << " pv=" // << number(V) << " sm=" << sm << " " << headT3[number(V)] << endl; R2 AV(A,V); lAV = Norme2(AV); avam = (AV,AM); // cout << " --- " << avam << " > " << ll[gd] << " " << Abs((AM.perp(),AV) ) // << " " << ( avam > ll[gd] && Abs((AM.perp(),AV)) < lAV * 1e-6 ) << endl; // go ahead in direction AM if ( (avam > ll[gd]) && Abs((AM.perp(),AV)) < lAV * 1e-6 ) {pV = &V;break;} // ok good } } if ( ! (p>=0 && pV)) throwassert(p>=0 && pV); // PB reach the end without founding if ( ! ( Abs((AM.perp(),A-*pV)) < 1e-5) ) // cout << Abs((AM.perp(),A-*pV)) <<*pV << endl, throwassert( Abs((AM.perp(),A-*pV)) < 1e-5); throwassert(sm != number(pV)); int kkgd= 3*k + j; ll[gd] = avam; // find the SubMortar m of vertex sm // with same sens and direction // for (int s= number(pV);s>=0;s=link[gd][s],nm[gd]++) { // on est sur l'arete kkgd throwassert( s == number(triangles[kkgd/3][VerticesOfTriangularEdge[kkgd%3][dg]])); sgd[gd]=s;// save the last if ( ! ( Abs((AM.perp(),A-vertices[s])) < 1e-5) ) // cout << Abs((AM.perp(),A-vertices[s])) << vertices[s] << endl, throwassert( Abs((AM.perp(),A-vertices[s])) < 1e-5); //cout << " s=" << s << " h=" << headT3[s] << " " << link[gd][s] << " " << link[dg][s] << endl; ; throwassert(kkgd>=0 && kkgd < 3*nt); if (datamortars) { throwassert(datag - datamortars == nm[0] + kdmg); throwassert(datad - datamortars == nm[1] + kdmd + kdmgo ); if (gd == 0) *datag++ = kkgd; // store else *datad++ = kkgd; // } // cout << " ++++ "<< ll[gd] << " > " << ll[dg] << " " << headT3[sgd[dg]] << " " <=0) { for (int pp=headT3[s] ;pp>=0; pp=NextT3[pp],kkk++) { throwassert(number(triangles[pp/3][pp%3]) == s); if( (pp/3)!= (kk/3)) { kkkk++,kkgd=pp - (pp%3) + EdgesVertexTriangle[pp%3][dg]; } } throwassert( kkgd/3 != kk/3); throwassert(kkk==2 && kkkk==1);} } if (ll[gd]>ll[dg] && headT3[sgd[dg]]>=0) //changement de cote gd = dg; throwassert(kkkk++<100); //cout <<" kkkk=" << kkkk << " " << sgd[0] << " " << sgd[1] << endl; } while (sgd[0] != sgd[1]); kdmgaa = Max(kdmgaa,kdmg + nm[0]); kdmdaa = Max(kdmdaa,kdmd + nm[1]); if (is < sgd[0] && headT3[sgd[0]] >=0) { //cout << " Mortars from (on saute) " << is << " to " << sgd[0] << " " << nm[0] << " " << nm[1]<< " " << kdmg << " " << kdmd << endl; if( mortars ) { // restore datag -= nm[0]; datad -= nm[1]; } } else { // cout << " Mortars from " << is << " to " << sgd[0] << " " << nm[0] << " " << nm[1]<< " " << kdmg << " " << kdmd << endl; if(mortars ) { ffassert(NbMortars< onbm); mortars[NbMortars].nleft = nm[0]; mortars[NbMortars].nright = nm[1]; // check for (int i=0;i1 && NbMortars) cout << " Nb Mortars " << NbMortars << /*" " << kdmg << " "<< kdmd <<*/ endl; if (mortars) { // cout << "end " << NbMortars << " g " << kdmg << " d " <4) { cout << " Number of Edges = " << NbOfEdges << endl; cout << " Number of Boundary Edges = " << NbOfBEdges << " neb = " << neb << endl; cout << " Number of Mortars Edges = " << NbOfMEdges << endl; cout << " Nb Of Mortars with Paper Def = " << NbMortarsPaper << " Nb Of Mortars = " << NbMortars; cout << " Euler Number nt- NbOfEdges + nv = " << nt + NbMortars - NbOfEdges + nv << "= Nb of Connected Componant - Nb Of Hole " <> nv >> nt >> neb ; if(verbosity>10) cout << " Nb of Vertex " << nv << " " << " Nb of Triangles " << nt << " Nb of boundary edge " << neb << endl; ffassert(f.good() && nt && nv) ; triangles = new Triangle [nt]; vertices = new Vertex[nv]; bedges = new BoundaryEdge[neb]; area=0; ffassert(triangles && vertices && bedges); for (i=0;i> vertices[i],ffassert(f.good()); for (i=0;i> i0 >> i1 >> i2 >> ir; ffassert(f.good() && i0>0 && i0<=nv && i1>0 && i1<=nv && i2>0 && i2<=nv); triangles[i].set(vertices,i0-1,i1-1,i2-1,ir); area += triangles[i].area;} for (i=0;i> i0 >> i1 >> ir; bedges[i] = BoundaryEdge(vertices,i0-1,i1-1,ir); } if(verbosity) cout << " End of read: area on mesh = " << area <0) { for (int i=0;i=0; nt=0; BuilTriangles(true,removeouside); /* if( ! removeouside) { neb=0; // remove the edge delete [] bedges; bedges=0; } */ ConsAdjacence(); } // cout << " build: Mesh : " << this << endl; } inline int BinaryRand(){ #ifdef RAND_MAX const long HalfRandMax = RAND_MAX/2; return rand() & U,const KN_ & V, R & dt) { const Triangle & T(Th[it]); const R2 Q[3]={(const R2) T[0],(const R2) T[1],(const R2) T[2]}; int i0=Th.number(T[0]); int i1=Th.number(T[1]); int i2=Th.number(T[2]); R u = lambda[0]*U[i0] + lambda[1]*U[i1] + lambda[2]*U[i2]; R v = lambda[0]*V[i0] + lambda[1]*V[i1] + lambda[2]*V[i2]; R2 P = lambda[0]*Q[0] + lambda[1]*Q[1] + lambda[2]*Q[2]; // cout << " " << u << " " << v ; R2 PF = P + R2(u,v)*dt; // couleur(15);MoveTo( P); LineTo( PF); R l[3]; l[0] = Area2(PF ,Q[1],Q[2]); l[1] = Area2(Q[0],PF ,Q[2]); l[2] = Area2(Q[0],Q[1],PF ); R Det = l[0]+l[1]+l[2]; l[0] /= Det; l[1] /= Det; l[2] /= Det; const R eps = 1e-5; int neg[3],k=0; int kk=-1; if (l[0]>-eps && l[1]>-eps && l[2]>-eps) { dt =0; lambda[0] = l[0]; lambda[1] = l[1]; lambda[2] = l[2]; } else { if (l[0]eps1) kk = (j+1)%3; else if (S<-eps1) kk = (j+2)%3; else if (BinaryRand()) kk = (j+1)%3; else kk = (j+2)%3; } else if (k==1) kk = neg[0]; if(kk>=0) { R d=lambda[kk]-l[kk]; throwassert(d); R coef = lambda[kk]/d; R coef1 = 1-coef; dt = dt*coef1; lambda[0] = lambda[0]*coef1 + coef *l[0]; lambda[1] = lambda[1]*coef1 + coef *l[1]; lambda[2] = lambda[2]*coef1 + coef *l[2]; lambda[kk] =0; } } int jj=0; R lmx=lambda[0]; if (lmx0 ? R2( (double) i/ (double)N,(double) j/(double)N) : R2( (double) (N-j)/ (double)N,(double) (N-i)/(double)N); } int numSubTriangle(const int N,const int n,const int l) { // compute the subdivision of a triangle in N*N // N number of sub division // n number of the sub triangle // l vertex of the sub triangle if(N<0) { int j=n%3; return numSubTriangle(-N,n/3,l)*3+j; } throwassert(n < N*N); int i = n % N; int j = n / N; int k = N - i - j; if(k<=0) { if(l==1) i++; else if(l==2) j++; } else if(l==1) j++; else if(l==2) i++; // if ( k <= 0 )cout << " - " << endl; return k >0 ? numSubTVertex(N,i, j) : numSubTVertex(N,N-j,N-i); } int Walk(const Mesh & Th,int& it, R *l, const KN_ & U,const KN_ & V, R dt) { int k=0; int j; while ( (j=WalkInTriangle(Th,it,l,U,V,dt))>=0) { //int jj = j; throwassert( l[j] == 0); R a= l[(j+1)%3], b= l[(j+2)%3]; int itt = Th.ElementAdj(it,j); if(itt==it || itt <0) return -1; it = itt; l[j]=0; l[(j+1)%3] = b; l[(j+2)%3] = a; ffassert(k++<1000); } return it; } const Triangle * Mesh::Find( R2 P, R2 & Phat,bool & outside,const Triangle * tstart) const { int it,j; const Triangle * rett=0; if ( tstart ) it = (*this)(tstart); else { const Vertex * v=quadtree->NearestVertexWithNormal(P); if (!v) { v=quadtree->NearestVertex(P); assert(v); } /* if (verbosity>100) cout << endl << (*this)(v) << *v << " " << Norme2(P-*v) << endl; */ it=Contening(v); } // int itdeb=it; // int count=0; // L1: outside=true; //int its=it; int iib=-1;//,iit=-1; R dP=DBL_MAX; R2 PPhat; const Triangle * tt; int k=0,kout=0; kfind++; while (1) { const Triangle & K(triangles[it]); kthrough++; if (k++>=10000) { /* cout << P << endl; reffecran(); Draw(0); triangles[its].Fill(2); DrawMark(P,0.01); rattente(1); */ ffassert(k++<10000); } int kk,n=0,nl[3]; R2 & A(K[0]), & B(K[1]), & C(K[2]); R l[3]={0,0,0}; R area2= K.area*2; R eps = -area2*1e-6; l[0] = Area2(P,B,C); l[1] = Area2(A,P,C); l[2] = area2-l[0]-l[1]; if (l[0] < eps) nl[n++]=0; if (l[1] < eps) nl[n++]=1; if (l[2] < eps) nl[n++]=2; if (n==0) { // interior => return outside=false; Phat=R2(l[1]/area2,l[2]/area2); return &K; } else if (n==1) kk=0; else kk=BinaryRand() ? 1 : 0; j= nl[ kk ]; int itt = ElementAdj(it,j); if(itt!=it && itt >=0) { dP=DBL_MAX; it=itt; continue; } // edge j on border l[j]=0; if ( n==2 ) { kk = 1-kk; j= nl[ kk ]; itt = ElementAdj(it,j); if (itt >=0 && itt != it) // correction FH oct 2009 { dP=DBL_MAX; it=itt; continue; } // on a corner of the mesh l[0]=l[1]=l[2]=0.; l[3-nl[0]-nl[1]]=1.; // correction april 2015 FH Phat=R2(l[1],l[2]); rett=triangles +it; if(searchMethod && outside) goto PICHON; return rett; } // on the border // projection Ortho kout++; int j0=(j+1)%3,i0= &K[j0]-vertices; int j1=(j+2)%3,i1= &K[j1]-vertices; int ii,jj,iii; bool ret=false; R2 AB=R2(K[j0],K[j1]), AP(K[j0],P), BP(K[j1],P); R la= (AB,AP); R lb= -(AB,BP); if(la<0) ii= i0, jj = j0,iii=i1; else if ( lb <0) ii= i1, jj = j1,iii=i0; else // PROJECTION between A,B ret = true; if( ! ret) { // VERIF THE DISTANCE**2 Dicrease R2 Pjj(P,K[jj]); R dd = (Pjj,Pjj); if (dd >= dP ) { Phat=PPhat; // if(kout>1) cout << " @ " << tt-triangles << " " << Phat << " " << outside << endl; rett=tt; if(searchMethod && outside) goto PICHON; return tt; } else { l[0]=l[1]=l[2]=0; l[jj]=1; PPhat.x=l[1]; PPhat.y=l[2]; dP=dd; tt = triangles + it ; } } /* if(kout>1) cout << "Find --- "<< P << " : k=" << k << " la lb " << la << " " << lb << " ii =" << ii << " iii= " << iii << " " << it << " dP= " << dP << " ret = " << ret <1) cout << " # " << it << " " << Phat << " " << outside << endl; rett=triangles +it; if(searchMethod && outside) goto PICHON; return rett; } bool ok=false; // next edge on true boundary for (int p=BoundaryAdjacencesHead[ii];p>=0;p=BoundaryAdjacencesLink[p]) { int e=p/2, ie=p%2;// je=2-ie; // cout << number(bedges[e][0]) << " " << number(bedges[e][1]) << endl; if (!bedges[e].in( vertices+iii)) // edge not equal to i0 i1 { ok=true; iib = ii; it= BoundaryElement(e,ie); // next triangle // cout << " ------ " << it << " " << Phatt << endl; break; } } ffassert(ok); } PICHON: // Add dec 2010 ... // Brute force .... bof bof ... double ddp=1e100; int pk=-1; for(int k=0;k return outside=false; Phat=R2(l[1]/area2,l[2]/area2); return &K; } R2 GP(G,P); double lgp2=(GP,GP); if(ddp > lgp2) { ddp=lgp2; pk=k; } } return rett; } int WalkInTriangle(const Mesh & Th,int it, double *lambda, R u, R v, R & dt) { const Triangle & T(Th[it]); const R2 Q[3]={(const R2) T[0],(const R2) T[1],(const R2) T[2]}; // int i0=Th.number(T[0]); // int i1=Th.number(T[1]); // int i2=Th.number(T[2]); R2 P = lambda[0]*Q[0] + lambda[1]*Q[1] + lambda[2]*Q[2]; // cout << " " << u << " " << v ; R2 PF = P + R2(u,v)*dt; // couleur(15);MoveTo( P); LineTo( PF); R l[3]; l[0] = Area2(PF ,Q[1],Q[2]); l[1] = Area2(Q[0],PF ,Q[2]); l[2] = Area2(Q[0],Q[1],PF ); R Det = l[0]+l[1]+l[2]; l[0] /= Det; l[1] /= Det; l[2] /= Det; const R eps = 1e-5; int neg[3],k=0; int kk=-1; if (l[0]>-eps && l[1]>-eps && l[2]>-eps) { dt =0; lambda[0] = l[0]; lambda[1] = l[1]; lambda[2] = l[2]; } else { if (l[0]eps1) kk = (j+1)%3; else if (S<-eps1) kk = (j+2)%3; else if (BinaryRand()) kk = (j+1)%3; else kk = (j+2)%3; } else if (k==1) kk = neg[0]; if(kk>=0) { R d=lambda[kk]-l[kk]; throwassert(d); R coef = lambda[kk]/d; R coef1 = 1-coef; dt = dt*coef1; lambda[0] = lambda[0]*coef1 + coef *l[0]; lambda[1] = lambda[1]*coef1 + coef *l[1]; lambda[2] = lambda[2]*coef1 + coef *l[2]; lambda[kk] =0; } } int jj=0; R lmx=lambda[0]; if (lmx0) return k*k; else if(k<0) return 3*(k*k); ffassert(0); return 0; } int NbOfSubInternalVertices(int kk) { assert(kk); int k=Abs(kk); int r= (k+2)*(k+1)/2; assert(r>=0); return kk<0 ? 3*r : r; } Mesh::Mesh(int nbv,R2 * P) { TheAdjacencesLink=0; BoundaryEdgeHeadLink=0; BoundaryAdjacencesHead=0; BoundaryAdjacencesLink=0; TriangleConteningVertex=0; TriangleConteningVertex=0; dim=2; tet=0; edges=0; ntet=0; ne=0; volume=0; quadtree =0; NbMortars=0; NbMortarsPaper=0; nt=0; mortars=0; TheAdjacencesLink =0; datamortars=0; quadtree =0; bedges=0; neb =0; bnormalv=0; nv=nbv; vertices = new Vertex[nv]; triangles=0; area=0; for (int i=0;i1) cout << " Nb Triangles = " << nbt << endl; triangles = new Triangle[nt]; for(int i=0,k=0;i1000) { cout << vertices[nu[k]-1]<< " " << endl; cout << vertices[nu[k+1]-1]<< " " << endl; cout << vertices[nu[k+2]-1]<< " " << endl; cout << vertices[nu[k]-1]<< " \n\n" << endl; } triangles[i].set(vertices,nu[k]-1,nu[k+1]-1,nu[k+2]-1,reft[i]); area += triangles[i].area; } delete [] arete; delete [] nu; delete [] c; delete [] tri; delete [] reft; delete [] cr; delete [] h; delete [] sd; } Mesh::Mesh(const Mesh & Th,int * split,bool WithMortar,int label) { // routine complique // count the number of elements area=0; //Th.area; lenbord=0; volume=0; BoundaryAdjacencesHead=0; BoundaryAdjacencesLink=0; BoundaryEdgeHeadLink=0; quadtree =0; NbMortars=0; ntet=0; ne=0; dim=2; tet=0; edges=0; mortars=0; TheAdjacencesLink =0; quadtree =0; bedges=0; neb =0; bnormalv=0; R2 Pmin,Pmax; Th.BoundingBox(Pmin,Pmax); nt=0; int nebi=0; // nb arete interne int nbsdd =0; int splitmin=100,splitmax=0; for (int i=0;i2) cout << " - Mesh construct : from " << &Th << " split min " << splitmin << " max " << splitmax << ", recreate " << !noregenereration << " label =" << label << endl; triangles = new Triangle[nt]; assert(triangles); // computation of thee numbers of vertices // on decoupe tous betement // et on recolle le points ensuite // avec le quadtree qui sont sur les aretes ou les sommets // calcul du magorant du nombre de sommets int nvmax= 0;// Th.nv; { //int v; KN setofv(Th.nv,false); for (int i=0;i4) cout << " - nv old " << nvmax << endl; } int nebmax=neb; int nebimax=nebi; int nbsddmax=nbsdd; for (int i=0;i=0 && split[it]<=64); // cout << " it = " <Add(vertices[nv]); nv++;} } // nv = Th.nv; if(verbosity>3) { cout << " -- number of old vertices use: " << nv << endl; cout << " -- number of neb : " << nebmax << endl; } bedges = new BoundaryEdge[nebmax]; BoundaryEdge * bedgesi= new BoundaryEdge[nebimax]; // jan 2007 FH int * sdd= new int[Th.nt]; for (int i=0;i=0) n = max(n,split[itt]); // pour les aretes internes (FH juillet 2005) if (!n) continue; if (pbe ) { re = *pbe; if( & (*pbe)[0] == &Th(ie1) ) sens = -sens; // pour les aretes non decoupe avril 2007 // cout << " ### " << ie0 << " " << ie1 << " " << sens << endl; } // cout << " lab = " << re.lab << endl; Vertex *pva= quadtree->NearestVertex(Th(ie0)); Vertex *pvb= quadtree->NearestVertex(Th(ie1)); Vertex *pv0=pva; R2 A(*pva),B(*pvb); R la = 1,lb=0, delta=1.0/n; for (int j=1;j le sens change avril 2007 la-=delta; lb+=delta; assert(nvAdd(*pv1); nv++; assert(nnebToClose(Pj,seuil); // if !noregenereration => point du bord du triangle deja genere bool addv = !pV; if(!noregenereration && pV==0) addv = lmin > 1e-5; if ( addv ) { // new vertex // cout << " -- " << nv << " New Vertices " << Pj << " n=" << n << " j=" << j << " " << PTj << endl; assert(nvAdd(*pV); nv++; } // end of new vertex if(noregenereration) { assert(pV); //cout << j << " " << *pV << " " << Pj << " " << number(pV) << " " << Norme2(Pj-*pV) << " " << nv << endl; vt[j]=number(pV); } } // triangles[kt].SetVertex(j,pV); // for(int j=0;j<3;j++) // cout << kt << " " << n << endl; if(noregenereration) { R2 A=vertices[vt[0]]; R2 B=vertices[vt[1]]; R2 C=vertices[vt[2]]; R a = (( B-A)^(C-A))*0.5; if (a>0) triangles[kt].set(vertices,vt[0],vt[1],vt[2],T.lab); else triangles[kt].set(vertices,vt[0],vt[2],vt[1],T.lab); } } // end loop on all sub triangle } // end if (verbosity>3 ) { cout << " - regeneration = " << ! noregenereration <10) { cout << " mshptg8_ " << endl; cout << " nbs =" << nbs << endl; cout << " nba =" << nba << endl; cout << " nbt =" << nbt << endl; cout << " nbsd =" << nbsd << endl; cout << " sommets : " << endl; for(int i=0;i3) cout << " - Nb Triangles = " << nt << " remove triangle in hole :" << nbt - nt <=0) triangles[kt++].set(vertices,nu[k]-1,nu[k+1]-1,nu[k+2]-1,Th[reft[i]].lab); assert(kt==nt); // END Correction FH bug trunc mesh with hole 25032005 + july 2005 delete [] arete; delete [] nu; delete [] c; delete [] tri; delete [] reft; delete [] cr; delete [] h; delete [] sd; } delete [] bedgesi; delete [] sdd; ConsAdjacence(); } const char Mesh::magicmesh[8]="Mesh 2D"; int Mesh::kthrough =0; int Mesh::kfind=0; Mesh::Mesh(const Serialize &serialized) { TriangleConteningVertex =0; BoundaryAdjacencesHead=0; BoundaryAdjacencesLink=0; BoundaryEdgeHeadLink=0; quadtree =0; volume=0; NbMortars=0; dim=0; tet=0; edges=0; ntet=0; ne=0; mortars=0; TheAdjacencesLink =0; nv=0; nt =0; neb=0; triangles=0; vertices=0; bedges=0; area=0; lenbord=0; bnormalv=0; // --- assert(serialized.samewhat(magicmesh)); size_t pp=0;; long long l; serialized.get(pp,l); serialized.get( pp,nt); serialized.get( pp,nv); serialized.get( pp,neb); if (verbosity>2) cout << " mesh serialized : " << l << " " << nt << " " << nv << " " << neb << endl; assert ( nt > 0 && nv >0 && neb >=0); triangles = new Triangle [nt]; vertices = new Vertex[nv]; bedges = new BoundaryEdge[neb]; area=0; ffassert(triangles && vertices && bedges); for (int i=0;i2) cout << " End of un serialize: area on mesh = " << area <2) cout << " mesh Serialized : " << l << " " << nt << " " << nv << " " << neb << endl; for (int i=0;i2) cout << " number of real boundary edges " << nb << endl; bnormalv= new R2[nb]; R2 *n=bnormalv; for (int k=0;k #include #include "RefCounter.hpp" #include "Serialize.hpp" // some usefull function //typedef double R; template class KN_; const double Pi = 3.14159265358979323846264338328; /* template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} template inline T Abs (const T &a){return a <0 ? -a : a;} template inline void Exchange (T& a,T& b) {T c=a;a=b;b=c;} template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} */ //#include "ufunction.hpp" #include "ufunction.hpp" #include #include #include // ALH - 21/10/13 - R1.hpp needs cmath and it does include it, but since R1.hpp is only included as part of namespace // Fem2D, we need to make sure that cmath is called as part of the default namespace, otherwise we will get "error: // ‘::acos’ has not been declared" and such. #include // definition R namespace Fem2D { inline double norm(double x){return x*x;} inline float norm(float x){return x*x;} template T norm(const complex &x){return std::norm(x);} // ALH - These include files are located inside the namespace definition on purpose? #include "R1.hpp" #include "R2.hpp" #include "R3.hpp" inline void MoveTo(R2 P) { rmoveto((float) P.x,(float)P.y);} inline void LineTo(R2 P) { rlineto((float)P.x,(float)P.y);} inline R Area2(const R2 A,const R2 B,const R2 C){return (B-A)^(C-A);} inline R Theta(R2 P){ return atan2(P.y,P.x);} /* inline R2 Minc(const R2 & A,const R2& B) { return R2(Min(A.x,B.x),Min(A.y,B.y));} inline R2 Maxc(const R2 & A,const R2& B) { return R2(Max(A.x,B.x),Max(A.y,B.y));} inline R3 Minc(const R3 & A,const R3& B) { return R3(Min(A.x,B.x),Min(A.y,B.y),Min(A.z,B.z));} inline R3 Maxc(const R3 & A,const R3& B) { return R3(Max(A.x,B.x),Max(A.y,B.y),Max(A.z,B.z));} inline R2 Minc(const R2 & A,const R2& B,const R2& C) { return R2(Min(A.x,B.x,C.x),Min(A.y,B.y,C.y));} inline R2 Maxc(const R2 & A,const R2& B,const R2& C) { return R2(Max(A.x,B.x,C.x),Max(A.y,B.y,C.y));} inline R3 Minc(const R3 & A,const R3& B,const R3& C) { return R3(Min(A.x,B.x,C.x),Min(A.y,B.y,C.y),Min(A.z,B.z,C.z));} inline R3 Maxc(const R3 & A,const R3& B,const R3& C) { return R3(Max(A.x,B.x,C.x),Max(A.y,B.y,C.y),Max(A.z,B.z,C.z));} */ // def de numerotation dans un triangles direct sens (trigo) // the edge is oposite of the vertex //// [3] is a edge //#include struct SortedTriplet { static const int empty = -1; int i1,i2,i3; SortedTriplet(int j1,int j2=empty, int j3=empty) : i1(j1), i2(j2),i3(j3) { if(i1 class TVertex : public Rd,public Label { friend class Mesh; Rd *normal; // pointeur sur la normal exterieur pour filtre les // point de depart public: TVertex() : Rd(),Label(),normal(0){}; TVertex(Rd P,int r=0): Rd(P),Label(r),normal(0){} bool ninside(const Rd & P) const { return normal? (Rd(*this,P),*normal)<=0: true;} void SetNormal(Rd *&n,const Rd & N) { if (normal) { Rd NN=*normal+N; *normal= NN/Norme2(NN); } else *(normal=n++)=N;} Rd Ne() const {return normal ? *normal: Rd();} // void operator=(const TVertex & v) { x=v.x;y=v.y;lab=v.lab;normal=0;} }; typedef TVertex Vertex; template inline ostream& operator <<(ostream& f, const TVertex & v ) { f << (Rd) v << ' ' << (Label) v ; return f; } template inline istream& operator >> (istream& f, TVertex & v ) { f >> (Rd&) v >> (Label&) v ; return f; } class Tetraedre: public Label { public: typedef TVertex Vertex; private: Vertex *vertices[4]; // an array of 3 pointer to vertex public: R volume; Tetraedre(){}; // constructor empty for array static const int NbWhat = 15; // 4+6+4+1 static const int NbV =4; static const int NbE =6; static const int NbF =4; Vertex & operator[](int i) const// to see triangle as a array of vertex {return *vertices[i];} Vertex *& operator()(int i) // to see triangle as a array of vertex {return vertices[i];} Tetraedre(Vertex * v0,int i0,int i1,int i2,int i3,int r,R a=0.0): Label(r) { set(v0,i0,i1,i2,i3,r,a); } void set(Vertex * v0,int i0,int i1,int i2,int i3,int r,R a=0.0) { R3 A=*(vertices[0]=v0+i0); R3 B=*(vertices[1]=v0+i1); R3 C=*(vertices[2]=v0+i2); R3 D=*(vertices[3]=v0+i3); lab = r; volume = a ==0 ? det(R3(A,B),R3(A,C),R3(A,D))/6. : a; throwassert(volume>0);} Vertex & Face(int j,int i) const // Vertex j of ace i {assert(j<=0 && j < 3 && i <=0 && i < 4) ;return *vertices[v_tet_face[i][j] ];} R3 N2areaInternal(int i) const { return R3(*vertices[v_tet_face[i][0]],*vertices[v_tet_face[i][1]]) ^R3(*vertices[v_tet_face[i][0]],*vertices[v_tet_face[i][2]]) ; } R3 n(int i) const // unit exterior normal {R3 Ni=N2areaInternal(i);return Ni/-Norme2(Ni);} R3 H(int i) const // heigth ($\nabla \lambda_i$ {R3 Ni=N2areaInternal(i);return Ni/(3.*volume);} R3 Edge(int i) const // edge i { return (R3) *vertices[v_tet_edge[i][1]]-(R3) *vertices[v_tet_edge[i][0]];} Vertex & Edge(int j,int i) const // Vertex j of edge i {assert(j<=0 && j < 2 && i <=0 && i < 4) ;return *vertices[v_tet_edge[i][j]];} R lenEdge(int i) const {R3 E=Edge(i);return sqrt((E,E));} R h() const { return Max( Max(lenEdge(0),lenEdge(1),lenEdge(2)), Max(lenEdge(3),lenEdge(4),lenEdge(5)) );} void Renum(Vertex *v0, long * r) { for (int i=0;i<4;i++) vertices[i]=v0+r[vertices[i]-v0];} Vertex & VerticeOfEdge(int i,int j) const // vertex j of edge i {return *vertices[v_tet_edge[i][j]];} // vertex j of edge i R EdgeOrientation(int i) const { // return +1 or -1 R Orient[2]={-1.,1.}; return Orient[vertices[v_tet_edge[i][0]] < vertices[v_tet_edge[i][1]] ] ;} void SetVertex(int j,Vertex *v){vertices[j]=v;} R3 operator() (const R3 & P) const{ // local to Global in triangle return (const R3 &) *vertices[0] * (1-P.x-P.y-P.z) + (const R3 &) *vertices[1] * (P.x) + (const R3 &) *vertices[2] * (P.y) ; + (const R3 &) *vertices[3] * (P.z) ;} SortedTriplet what(int i,Vertex *v0,Tetraedre * t0) { if (i<0) ffassert(i>=0); else if (i<4) return SortedTriplet(vertices[i]-v0); else if( (i-=4)<6) return SortedTriplet( &Edge(0,i)-v0, &Edge(1,i)-v0); else if( (i-=6)<4) return SortedTriplet( &Face(0,i)-v0, &Face(1,i)-v0, &Face(2,i)-v0) ; else if(i==0) return SortedTriplet(vertices[0]-v0,this-t0,-2); else ffassert(0); return 0; } private: Tetraedre(const Tetraedre &); // no copy of triangle void operator=(const Tetraedre &); }; template class TTriangle: public Label { public: typedef TVertex Vertex; private: Vertex *vertices[3]; // an array of 3 pointer to vertex public: static const int NbWhat = 7; // 3+3+1 static const int NbV = 3; // 3+3+1 static const int NbE = 3; // R area; TTriangle(){}; // constructor empty for array Vertex & operator[](int i) const// to see triangle as a array of vertex {return *vertices[i];} Vertex *& operator()(int i) // to see triangle as a array of vertex {return vertices[i];} TTriangle(Vertex * v0,int i0,int i1,int i2,int r,R a=0.0): Label(r) { Rd A=*(vertices[0]=v0+i0); Rd B=*(vertices[1]=v0+i1); Rd C=*(vertices[2]=v0+i2); area = a ==0 ? (( B-A)^(C-A))*0.5 : a; throwassert(area>0);} void set(Vertex * v0,int i0,int i1,int i2,int r,R a=0.0) { lab=r; Rd A=*(vertices[0]=v0+i0); Rd B=*(vertices[1]=v0+i1); Rd C=*(vertices[2]=v0+i2); area = a ==0 ? (( B-A)^(C-A))*0.5 : a; ffassert(area>0);} Rd Edge(int i) const // opposite edge vertex i {return (Rd) *vertices[(i+2)%3]-(Rd) *vertices[(i+1)%3];} Vertex & Edge(int j,int i) const // Vertex j of edge i {throwassert(j==0 || j==1 );return *vertices[(i+j+1)%3];} // il y a un problem sur d=3 ici ---- Rd n(int i) const // unit exterior normal {Rd E=Edge(i);return Rd(E.y,-E.x)/Norme2(E);} Rd H(int i) const // heigth ($\nabla \lambda_i$ {Rd E=Edge(i);return Rd(-E.y,E.x)/(2*area);} // ------ R lenEdge(int i) const {Rd E=Edge(i);return sqrt((E,E));} R lenEdge2(int i) const {Rd E=Edge(i);return ((E,E));} R h() const { return sqrt(Max(lenEdge2(0),lenEdge2(1),lenEdge2(2)));} R h_min() const { return sqrt(Min(lenEdge2(0),lenEdge2(1),lenEdge2(2)));} SortedTriplet what(int i,Vertex *v0,TTriangle * t0) { if (i<0) ffassert(i>=0); else if (i<3) return SortedTriplet(vertices[i]-v0); else if( (i-=3)<3) return SortedTriplet( &Edge(i,0)-v0, &Edge(i,1)-v0); else if( i==0 ) return SortedTriplet( vertices[0]-v0, vertices[1]-v0, vertices[2]-v0) ; else ffassert(0); } void Renum(Vertex *v0, long * r) { for (int i=0;i<3;i++) vertices[i]=v0+r[vertices[i]-v0];} Vertex & VerticeOfEdge(int i,int j) const // vertex j of edge i {return *vertices[(i+1+j)%3];} // vertex j of edge i R EdgeOrientation(int i) const { // return +1 or -1 R Orient[2]={-1.,1.}; return Orient[vertices[ (i+1)%3] < vertices[ (i+2)%3] ] ;} bool intersect(Rd P,Rd Q) const { const Rd &A(*vertices[0]); const Rd &B(*vertices[1]); const Rd &C(*vertices[2]); Rd mn(Minc(A,B,C)), mx(Maxc(A,B,C)); assert(P.x < Q.x && P.y < Q.y ); return (mx.x >= P.x) && (mn.x <= Q.x) && (mx.y >= P.y) && (mn.y <= Q.y) ; } // const Vertex & VerticeOfEdge(int i,int j) const {return *vertices[(i+1+j)%3];} void Draw(double shink=1) const; void Fill(int color) const; void Draw(int edge,double shink=1) const; void SetVertex(int j,Vertex *v){vertices[j]=v;} Rd operator() (const Rd & P) const{ // local to Global in triangle return (const Rd &) *vertices[0] * (1-P.x-P.y) + (const Rd &) *vertices[1] * (P.x) + (const Rd &) *vertices[2] * (P.y) ;} private: TTriangle(const TTriangle &); // no copy of triangle void operator=(const TTriangle &); }; typedef TTriangle Triangle; template class TBoundaryEdge: public Label { public: typedef TVertex Vertex; static const int NbWhat = 3; // 3+3+1 static const int NbV = 2; // 3+3+1 static const int NbE = 1; // Vertex *vertices[2]; TBoundaryEdge(Vertex * v0,int i0,int i1,int r): Label(r) { vertices[0]=v0+i0; vertices[1]=v0+i1; } void set(Vertex * v0,int i0,int i1,int r) { lab=r,vertices[0]=v0+i0; vertices[1]=v0+i1; } bool in(const Vertex * pv) const {return pv == vertices[0] || pv == vertices[1];} TBoundaryEdge(){}; // constructor empty for array void Draw() const; Vertex & operator[](int i) const {return *vertices[i];} R length() const { return Norme2(R2(*vertices[0],*vertices[1]));} void Renum(Vertex *v0, long * r) { for (int i=0;i<2;i++) vertices[i]=v0+r[vertices[i]-v0];} SortedTriplet what(int i,Vertex *v0,TBoundaryEdge * t0) { if (i<0) ffassert(i>=0); else if (i<2) return SortedTriplet(vertices[i]-v0); else if( i==0 ) return SortedTriplet( vertices[0]-v0, vertices[1]-v0) ; else ffassert(0); } }; typedef TBoundaryEdge BoundaryEdge; typedef BoundaryEdge Edge; // typedef Tetraedre Tet; // just to play template class TMortar { public: typedef TVertex Vertex; friend class Mesh; friend class ConstructDataFElement; Mesh * Th; int nleft,nright; int *left,*right; TMortar(): Th(0),nleft(0),nright(0),left(0),right(0){} void Draw() const; public: int NbLeft() const{return nleft;} int NbRight() const{return nright;} int TLeft(int i) const { return left[i]/3;} // int NbT() const {return nleft+nright;} int T_e(int i,int & e) const { // return the triangle number + the edge number throwassert(i>=0 && i < nleft+nright); int k= (i Mortar; class FQuadTree; // <> class Mesh: public RefCounter { public: typedef TTriangle Triangle; typedef TTriangle Element; typedef BoundaryEdge BorderElement; typedef TVertex Vertex; typedef R2 Rd; typedef R2 RdHat;// for parametrization typedef Rd::R R; typedef FQuadTree GTree; static const char magicmesh[8] ; int dim; int nt,nv,neb,ne,ntet; R area; R volume; R lenbord; static int kthrough,kfind; FQuadTree *quadtree; Vertex *vertices; Triangle *triangles; BoundaryEdge *bedges; Edge *edges; // edge element Tetraedre * tet; // int nbElmts() const {return nt;} int nbBrdElmts() const {return neb;} int nbVertices() const {return nv;} int NbMortars,NbMortarsPaper; Mortar *mortars; // list of mortar int *datamortars; R2 * bnormalv; // boundary vertex normal //Triangle * adj; Triangle & operator[](int i) const {throwassert(i>=0 && i=0 && i=0;p=BoundaryAdjacencesLink[p]) { if ( !bedges[p2=p/2].in(vertices+j) ) return p2; } return -1;} // Add J. Morice int nTonEdge(int it,int e) const { int k=3*it+e;return k==TheAdjacencesLink[k] ? 1 : 2;} void VerticesNumberOfEdge(const Triangle & T,int j,int & j0,int & j1) const {j0 = number(T[(j+1)%3]),j1= number(T[(j+ 2)%3]);} bool SensOfEdge(const Triangle & T,int j) const { return number(T[(j+1)%3]) =0 && tabk[i]!=it) i++; tabk[i]=TheAdjacencesLink[3*it+1]/3; if(tabk[i] >=0 && tabk[i]!=it) i++; tabk[i]=TheAdjacencesLink[3*it+2]/3; if(tabk[i] >=0 && tabk[i]!=it) i++; return i; } int BoundaryElement(int bbe,int & edgeInT) const { int i= BoundaryEdgeHeadLink[bbe]; edgeInT = i%3; return i/3;} Triangle * Find(const R2 & P) const ; const Triangle * Find(R2 P, R2 & Phat,bool & outside,const Triangle * tstart=0) const ; BoundaryEdge * TheBoundaryEdge(int i,int j) const { int p2; for (int p=BoundaryAdjacencesHead[i];p>=0;p=BoundaryAdjacencesLink[p]) { if ( bedges[p2=p/2].in(vertices+j) ) return bedges+p2; } return 0;} int NumberOfTheBoundaryEdge(int i,int j) const { int p2; for (int p=BoundaryAdjacencesHead[i];p>=0;p=BoundaryAdjacencesLink[p]) { if ( bedges[p2=p/2].in(vertices+j) ) return p2; } return -1;}// Add J. Morice void destroy() {RefCounter::destroy();} void MakeQuadTree() ; private: void read(const char * filename); void read(ifstream & f,bool bin=false); void BuildBoundaryAdjacences(); void ConsAdjacence(); void Buildbnormalv(); void BuilTriangles(bool empty,bool removeoutside=true); // to construct the adj triangle int *TheAdjacencesLink; int *BoundaryEdgeHeadLink; int *BoundaryAdjacencesHead; int *BoundaryAdjacencesLink; int *TriangleConteningVertex; // <> the copy constructor for Mesh is kept private on purpose Mesh(const Mesh &); void operator=(const Mesh &); }; // 2 routines to compute the caracteristic int WalkInTriangle(const Mesh & Th,int it, double *lambda, const KN_ & U,const KN_ & V, R & dt); int WalkInTriangle(const Mesh & Th,int it, double *lambda, R u, R v, R & dt); int Walk(const Mesh & Th,int & it, R *l, const KN_ & U,const KN_ & V, R dt) ; void DrawMark(R2 P,R k=0.02); template void HeapSort(T *c,long n) { long l,j,r,i; T crit; c--; // on decale de 1 pour que le tableau commence a 1 if( n <= 1) return; l = n/2 + 1; r = n; while (1) { // label 2 if(l <= 1 ) { // label 20 crit = c[r]; c[r--] = c[1]; if ( r == 1 ) { c[1]=crit; return;} } else crit = c[--l]; j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {c[i]=crit;break;} // L8 -> G2 if ((j G2 } } } template void HeapSort(T *c,T1 *c1,T2 *c2,long n) { long l,j,r,i; T crit; T1 crit1; T2 crit2; c--;c1--;c2--; // on decale de 1 pour que le tableau commence a 1 if( n <= 1) return; l = n/2 + 1; r = n; while (1) { // label 2 if(l <= 1 ) { // label 20 crit = c[r]; crit1 = c1[r]; crit2 = c2[r]; c2[r] = c2[1]; c1[r] = c1[1]; c[r--] = c[1]; if ( r == 1 ) { c2[1] = crit2, c1[1] = crit1; c[1]=crit; return;} } else {crit = c[--l];crit1=c1[l];crit2=c2[l]; } j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {c[i]=crit;c1[i]=crit1;c2[i]=crit2;break;} // L8 -> G2 if ((j G2 } } } inline int numSubTVertex(int N,int i,int j) { // i,j coordonne barycentre * N dans l'eleùent de reference. i=i+j; // numerotation / diag // i,j assert(j<=i && 0<= j); return j+i*(i+1)/2; } inline void num1SubTVertex(int N,int l,int & i,int & j) { i= (int) ((-1 + sqrt(1.+8*l))/2); // modif gcc 3.3.3 FH 100109 j = l - i*(i+1)/2; // io=in+j; // in = io-j i=i-j; assert( l == numSubTVertex(N,i,j)); } R2 SubTriangle(const int N,const int n,const int l); int numSubTriangle(const int N,const int n,const int l); int NbOfSubTriangle(const int N); int NbOfSubInternalVertices(int kk); R2 SubInternalVertex(int N,int k); // warning i is in [0, nleft] template inline TVertex & TMortar::VLeft(int i) const { throwassert(i>=0 && i <= nleft); return i< nleft ? (*Th)[TLeft( i )][VerticesOfTriangularEdge[ELeft(i)][0]] : (*Th)[TLeft( i-1)][VerticesOfTriangularEdge[ELeft(i-1)][1]];} template inline TVertex & TMortar::VRight(int i) const { throwassert(i>=0 && i <= nright); return i< nright ? (*Th)[TRight( i )][VerticesOfTriangularEdge[ERight(i)][1]] : (*Th)[TRight( i-1)][VerticesOfTriangularEdge[ERight(i-1)][0]];} void DrawCommentaire(const char *cm,float x=0.1,float y=0.97) ; inline R2 minmax(const R2 & a,const R2 & b) {return R2(Min(a.x,b.x),Max(a.y,b.y));} } using Fem2D::R; #include "FQuadTree.hpp" namespace Fem2D { inline void Mesh::MakeQuadTree() { if (!quadtree) { R2 Pn,Px; BoundingBox(Pn,Px); quadtree=new FQuadTree(this,Pn,Px,nv); } } } #endif freefem++-3.38-1/src/femlib/fem3.hpp000644 000767 000024 00000000011 11406226635 017171 0ustar00hechtstaff000000 000000 to removefreefem++-3.38-1/src/femlib/FESpace-v0.cpp000644 000767 000024 00000142564 11406226635 020147 0ustar00hechtstaff000000 000000 #include #include #include "error.hpp" #include #include #include #include "rgraph.hpp" using namespace std; #include "RNM.hpp" #include "fem.hpp" #include "FESpace.hpp" namespace Fem2D { int Make(const TypeOfFE ** t,int k,KN & P,KN & I) { typedef TypeOfFE::IPJ IPJ; int n=0,nn=0; for (int i=0;i p(t[i]->P_Pi_h); for (int j=0;j ajout I[nn]=n++; for (int l=0;l detruit break;} } } } return n; // nombre de point commun } KN Makepij_alpha(const TypeOfFE ** t,int k) { // Attention les df est numerote de facon croissant // en faisant une boucle sur les TypeOfFE // comme dans la class TypeOfFESum typedef TypeOfFE::IPJ IPJ; int n=0,m=0; for (int i=0;i< k;i++) { n += t[i]->pij_alpha.N(); m += t[i]->P_Pi_h.N(); } KN ij(n); KN I(m); KN P(m); Make(t,k,P,I); int p0=0,i0=0,N0=0,nn=0; for (int i=0;i< k;i++) { const KN p(t[i]->pij_alpha); for (int j=0;jNbDoF; p0+=t[i]->P_Pi_h.N(); N0+=t[i]->N;} return ij; } KN MakeP_Pi_h(const TypeOfFE **t,int k) { int np=0; for (int i=0;i< k;i++) np += t[i]->P_Pi_h.N(); KN< R2 > yy(np); KN zz(np); int kk=Make(t,k,yy,zz); // cout << " MakeP_Pi_h: " << kk << " from " << np << endl; return yy(SubArray(kk)); } ListOfTFE * ListOfTFE::all ; // list of all object of this type ListOfTFE::ListOfTFE (const char * n,TypeOfFE *t) : name(n),tfe(t) { if(!t) assert(t); static int count=0; if (count++==0) all=0; // init of all in dependant of the ordre of the objet file next=all; all=this; } const TypeOfFE ** Make(const FESpace **l,int k) { const TypeOfFE** p=new const TypeOfFE*[k]; for (int i=0;iTFE[0]; return p; } const TypeOfFE ** Make(const TypeOfFE **l,int k) { const TypeOfFE** p=new const TypeOfFE*[k]; for (int i=0;i Aipj(ipj.N()); KNM Vp(N,PtHat.N()); Pi_h(Aipj); for (int p=0;p Vpp(Vp('.',p)); for (int j=0;j & v) const { for (int i=0,k0=0;iNbDoF; KN_ sv(v(SubArray(n,k0))); teb[i]->Pi_h_alpha(K,sv); k0+= n;} } ~TypeOfFESum(){ delete [] teb;} } ; class FEProduitConstruct { protected: const TypeOfFE & teb; int k; int * data; FEProduitConstruct(int kk,const TypeOfFE &t) ; ~FEProduitConstruct(){delete [] data;} }; class TypeOfFEProduit: protected FEProduitConstruct, public TypeOfFE { public: TypeOfFEProduit(int kk,const TypeOfFE &t): FEProduitConstruct(kk,t),TypeOfFE(t,kk,data) {} // void FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void FB(const bool * whatd,const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; // void D2_FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; // void Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int, void * arg ) const; virtual void Pi_h_alpha(const baseFElement & K,KN_ & v) const { int nbof=teb.NbDoF; for (int i=0,k0=0;i sv(v(SubArray(nbof,k0))); teb.Pi_h_alpha(K,sv); } } ~TypeOfFEProduit(){} } ; FEProduitConstruct::FEProduitConstruct(int kk,const TypeOfFE &t) :k(kk),teb(t) { int m= teb.NbDoF; KN nn(teb.NbNode); nn=0; // nb de dl par noeud for (int i=0;i m; int i=k,j; while(i--) // on va a l'envert pour avoir comp[i] <=i m[teb[i]]=i; // l'ordre comp est important comp est croissant mais pas de pb. i=k; while(i--) comp[i]=m[teb[i]]; // comp[i] <=i // reservatition des intervalles en espaces int n=0,N=0; for ( j=0;jN;} NN[kk] = N; // reservation des interval en df n=0; for ( j=0;jNbDoF;} DF[kk] = n; // n = nb de DF total // N the fem is in R^N data = new int [n*5 + N]; int c=0; int ki= 0; // recherche des noeuds KN w(7),nn(7); w=0; nn=0; for ( j=0;jNbDoF;i++) nn[teb[j]->DFOnWhat[i]]++; nbn=0; for( j=0;j<7;j++) if (nn[j]) nn[j]=nbn++; else nn[j]=-1; KN dln(7); dln=0; // nn donne numero de noeud sur what for ( j=0;jNbDoF;i++) data[c++] = teb[j]->DFOnWhat[i]; for ( j=0;jNbDoF;i++) data[c++] = teb[j]->DFOfNode[i]+dln[teb[j]->DFOnWhat[i]]; for ( i=0;iNbDoF;i++) dln[teb[j]->DFOnWhat[i]]=Max(dln[teb[j]->DFOnWhat[i]],data[cc++]+1); } for ( j=0;jNbDoF;i++) data[c++] = nn[teb[j]->DFOnWhat[i]]; } for ( j=0;jNbDoF;i++) data[c++] = j; // node from of FE for ( j=0;jNbDoF;i++) data[c++] = i; // node from of df in FE int xx=0; for (j=0;jN;i++) { data[c] = teb[j]->dim_which_sub_fem[i]+xx; xxx=Max(xxx,data[c]+1); c++; } xx=xxx; } throwassert(c== 5*n+N); /* int cc=0; cout << " Data : " << endl; for ( i=0;i<5;i++) { for (j=0;j & u,int componante,int op) const ; } ; /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// NEW //////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class TypeOfFE_P1Bubble : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P1Bubble(): TypeOfFE(1,0,1,1,Data,1,1,4,4,Pi_h_coef) { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1), R2(1./3.,1./3.) }; for (int i=0;i & u,int componante,int op) const ; } ; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class TypeOfFE_P2Lagrange : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P2Lagrange(): TypeOfFE(1,1,0,1,Data,3,1,6,6,Pi_h_coef) { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1),R2(0.5,0.5),R2(0,0.5),R2(0.5,0) }; for (int i=0;icounter), MaxNbNodePerElement(t->MaxNbNodePerElement), MaxNbDFPerElement(t->MaxNbDFPerElement*k), NodesOfElement(t->NodesOfElement), FirstNodeOfElement(t->FirstNodeOfElement), FirstDfOfNode(0), NbOfElements(t->NbOfElements), NbOfDF(t->NbOfDF*k), NbOfNode(t->NbOfNode), Nproduit(t->Nproduit*k) { throwassert(t==0 || t->FirstDfOfNode==0); *counter++; } ConstructDataFElement::ConstructDataFElement (const Mesh &Th,int NbDfOnSommet,int NbDfOnEdge,int NbDfOnElement,const TypeOfMortar *tm, int nbdfv,const int *ndfv,int nbdfe,const int *ndfe) : counter(&thecounter),thecounter(0) { Make(Th,NbDfOnSommet,NbDfOnEdge,NbDfOnElement, tm,nbdfv,ndfv,nbdfe,ndfe); } ConstructDataFElement::ConstructDataFElement(const FESpace ** l,int k) : thecounter(0),counter(&thecounter) { int NbDfOnSommet=0; int NbDfOnEdge=0; int NbDfOnElement=0; const Mesh & Th(l[0]->Th); for (int i=0;iTFE[0]->NbDfOnVertex; NbDfOnEdge += l[i]->TFE[0]->NbDfOnEdge; NbDfOnElement += l[i]->TFE[0]->NbDfOnElement; throwassert( &Th== &l[i]->Th); throwassert( l[i]->TFE.constant()); } Make(Th,NbDfOnSommet,NbDfOnEdge,NbDfOnElement,0); } void ConstructDataFElement::Make(const Mesh &Th,int NbDfOnSommet,int NbDfOnEdge,int NbDfOnElement,const TypeOfMortar *tm, int nb_dfv,const int *ndfv,int nb_dfe,const int *ndfe) { *counter=0; Nproduit =1; int ndf=0,samendf=1; int nbdfe=3*NbDfOnSommet+3*NbDfOnEdge+NbDfOnElement; int nbne = 0; int nn=0; int firstmul=0; throwassert( tm || Th.NbMortars==0); NbOfElements = Th.nt; // by default // if mortars // int NbOfNodeL=0; NbOfElements += Th.NbMortars; FirstDfOfNode =0; FirstNodeOfElement=0; MaxNbDFPerElement=3*NbDfOnSommet+3*NbDfOnEdge+NbDfOnElement; int ks=0,ke=0,kt=0; if(NbDfOnSommet) { nbne+=3; ks=1; ndf=NbDfOnSommet;} if(NbDfOnEdge) { nbne+=3; ke=1; samendf &= !ndf || ndf == NbDfOnEdge; ndf=NbDfOnEdge;} if(NbDfOnElement) { nbne+=1; kt=1; samendf &= !ndf || ndf == NbDfOnElement; ndf=NbDfOnElement;} int NbDFonNode[7],NodeIsOn[7]; { int j=0,k=0; if(ks) { NbDFonNode[j++]=NbDfOnSommet; NbDFonNode[j++]=NbDfOnSommet; NbDFonNode[j++]=NbDfOnSommet;} if(ke) { NbDFonNode[j++]=NbDfOnEdge; NbDFonNode[j++]=NbDfOnEdge; NbDFonNode[j++]=NbDfOnEdge;} if(kt) { NbDFonNode[j++]=NbDfOnElement;} if (ks) {NodeIsOn[k++]=0;NodeIsOn[k++]=1;NodeIsOn[k++]=2;} if (ke) {NodeIsOn[k++]=3;NodeIsOn[k++]=4;NodeIsOn[k++]=5;} if (kt) {NodeIsOn[k++]=6;} throwassert(j == nbne); } MaxNbNodePerElement=nbne; // if ( ks && (!ke && ! kt) && (ndfv==0 && ndfe==0)) {nn=Th.nv; NodesOfElement=0; } else { // constuction du tableau NodesOfElement bofbof // computation of the length lne of array NodesOfElement int lne= Th.nt*nbne; if (Th.NbMortars) { samendf= false; NbOfNodeL=Th.NbMortars; throwassert(tm); FirstNodeOfElement = new int[NbOfElements+1]; int k=0,kk=0; for (k=0;kNbOfNodes(Th,Th.mortars[im]); } FirstNodeOfElement[k++]=lne; } NodesOfElement = new int[lne]; for (int i=0;i=0 && jj>=0) NodesOfElement[kk*nbne+oe+jj] = nn + ndfe[be] ; // adj NodesOfElement[k*nbne+oe+j] = nn + ndfe[be] ; // new } nn += nb_dfe; } for (int k=0;kConstructionOfNode(Th,im,NodesOfElement,FirstNodeOfElement,nn); Mortar & M(Th.mortars[im]); NodesOfElement[i++] = nn++; // the first node is the lag. mul. int n=M.NbT(); for (int kk=0;kkNbLagrangeMult(Th,Th.mortars[km]); // On node par int nodemul = NodesOfElement[fk]; // the first node is the lagr. mul. throwassert(FirstDfOfNode[nodemul+1]==-1); FirstDfOfNode[nodemul+1]= ndlmul; NbOfDFL += ndlmul; int nbdle=0; int nbnm=lk-fk; for (int j=fk;jnb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), Th(TTh), NbOfDF(cdef->NbOfDF), NbOfElements(cdef->NbOfElements), NbOfNodes(cdef->NbOfNode), MaxNbNodePerElement(cdef->MaxNbNodePerElement), MaxNbDFPerElement(cdef->MaxNbDFPerElement), NodesOfElement(cdef->NodesOfElement), FirstDfOfNodeData(cdef->FirstDfOfNode), FirstNodeOfElement(cdef->FirstNodeOfElement), tom(&tm) { // cout << "avant renum ="<< *this <D2_FB(Th,K,P,v); else v=val(SubArray(DF[j+1]-DF[j],DF[j]),SubArray(NN[j+1]-NN[j],NN[j]),t); } } */ /* void TypeOfFESum::FB(const Mesh & Th,const Triangle & K,const R2 & P,RNMK_ & val) const { val=0.0; SubArray t(3); for (int i=0;iFB(Th,K,P,v); else v=val(SubArray(DF[j+1]-DF[j],DF[j]),SubArray(NN[j+1]-NN[j],NN[j]),t); } } */ void TypeOfFESum::FB(const bool * whatd,const Mesh & Th,const Triangle & K,const R2 & P,RNMK_ & val) const { val=0.0; SubArray t(val.K()); for (int i=0;iFB(whatd,Th,K,P,v); else v=val(SubArray(DF[j+1]-DF[j],DF[j]),SubArray(NN[j+1]-NN[j],NN[j]),t); } } /* void TypeOfFESum::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int jjj, void * arg) const { for(int i=0;iPi_h(KK,vv,f,v,jjj+NN[i],arg); } // cout << val(SubArray(NbDoF)) << endl; } /* void TypeOfFE_P1Lagrange::D2_FB(const Mesh & ,const Triangle & ,const R2 & ,RNMK_ & val) const { // val=0; } */ /* void TypeOfFE_P2Lagrange::D2_FB(const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // 2 times derivatives for error indicator // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); throwassert(val.N() >=6); throwassert(val.M()==1 ); throwassert(val.K()==3 ); val=0; RN_ fxx(val('.',0,0)); RN_ fxy(val('.',0,1)); RN_ fyy(val('.',0,2)); fxx[0] = 4*Dl0.x*Dl0.x; fxx[1] = 4*Dl1.x*Dl1.x; fxx[2] = 4*Dl2.x*Dl2.x; fxx[3] = 8*Dl1.x*Dl2.x; fxx[4] = 8*Dl0.x*Dl2.x; fxx[5] = 8*Dl0.x*Dl1.x; fyy[0] = 4*Dl0.y*Dl0.y; fyy[1] = 4*Dl1.y*Dl1.y; fyy[2] = 4*Dl2.y*Dl2.y; fyy[3] = 8*Dl1.y*Dl2.y; fyy[4] = 8*Dl0.y*Dl2.y; fyy[5] = 8*Dl0.y*Dl1.y; fxy[0] = 4*Dl0.y*Dl0.y; fxy[1] = 4*Dl1.y*Dl1.y; fxy[2] = 4*Dl2.y*Dl2.y; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } */ R TypeOfFE_P1Lagrange::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))); R r=0; if (op==0) { R l0=1-PHat.x-PHat.y,l1=PHat.x,l2=PHat.y; r = u0*l0+u1*l1+l2*u2; } else { const Triangle & T=K.T; R2 D0 = T.H(0) , D1 = T.H(1) , D2 = T.H(2) ; if (op==1) r = D0.x*u0 + D1.x*u1 + D2.x*u2 ; else r = D0.y*u0 + D1.y*u1 + D2.y*u2 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1Lagrange::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd[op_id]) { f0[0] = l0; f0[1] = l1; f0[2] = l2;} if (whatd[op_dx] || whatd[op_dy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x; f0x[1] = Dl1.x; f0x[2] = Dl2.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y; f0y[1] = Dl1.y; f0y[2] = Dl2.y; } } } /////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// NEW ///////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /* void TypeOfFE_P1Bubble::FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const { assert(0); } void TypeOfFE_P1Bubble::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int, void *) const { assert(0); } /* R TypeOfFE_P1Bubble::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { assert(0); } */ void TypeOfFE_P1Bubble::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y, l1=P.x, l2=P.y, lb=l0*l1*l2*9.; if (val.N() <4) throwassert(val.N() >=4); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd[op_id]) { f0[0] = l0-lb; f0[1] = l1-lb; f0[2] = l2-lb; f0[3] = 3.*lb; } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)), Dlb((Dl0*l1*l2+Dl1*l0*l2+Dl2*l0*l1)*9.); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x-Dlb.x; f0x[1] = Dl1.x-Dlb.x; f0x[2] = Dl2.x-Dlb.x; f0x[3] = 3.*Dlb.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y-Dlb.y; f0y[1] = Dl1.y-Dlb.y; f0y[2] = Dl2.y-Dlb.y; f0y[3] = 3.*Dlb.y; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); R lbdxx= 2*((Dl0.x*Dl1.x)*l2+(Dl1.x*Dl2.x)*l0+(Dl2.x*Dl0.x)*l1); fxx[0] = -lbdxx; fxx[1] = -lbdxx; fxx[2] = -lbdxx; fxx[3] = 3*lbdxx; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); R lbdyy= 2*((Dl0.y*Dl1.y)*l2+(Dl1.y*Dl2.y)*l0+(Dl2.y*Dl0.y)*l1); fyy[0] = -lbdyy; fyy[1] = -lbdyy; fyy[2] = -lbdyy; fyy[3] = 3*lbdyy; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); R lbdxy= (Dl0.x*Dl1.y+ Dl0.y*Dl1.x)*l2+(Dl1.x*Dl2.y+Dl1.y*Dl2.x)*l0+(Dl2.x*Dl0.y+Dl2.y*Dl0.x)*l1; fxy[0] = 4*Dl0.x*Dl0.y-9.*(l0-l1-l2); fxy[1] = 4*Dl1.x*Dl1.y-9.*(l0-l1-l2); fxy[2] = 4*Dl2.x*Dl2.y-9.*(l0-l1-l2); fxy[3] = 27.*(l0-l1-l2); } } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /* void TypeOfFE_P1Lagrange::FB(const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,0)); RN_ f0x(val('.',0,1)); RN_ f0y(val('.',0,2)); f0[0] = l0; f0[1] = l1; f0[2] = l2; f0x[0] = Dl0.x; f0x[1] = Dl1.x; f0x[2] = Dl2.x; f0y[0] = Dl0.y; f0y[1] = Dl1.y; f0y[2] = Dl2.y; } void TypeOfFE_P2Lagrange::FB(const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=6); throwassert(val.M()==1); throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,0)); RN_ f0x(val('.',0,1)); RN_ f0y(val('.',0,2)); // -- f0[0] = l0*(2*l0-1); f0[1] = l1*(2*l1-1); f0[2] = l2*(2*l2-1); f0[3] = 4*l1*l2; // oppose au sommet 0 f0[4] = 4*l0*l2; // oppose au sommet 1 f0[5] = 4*l1*l0; // oppose au sommet 3 f0x[0] = Dl0.x*l4_0; f0x[1] = Dl1.x*l4_1; f0x[2] = Dl2.x*l4_2; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) ; f0y[0] = Dl0.y*l4_0; f0y[1] = Dl1.y*l4_1; f0y[2] = Dl2.y*l4_2; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } */ void TypeOfFE_P2Lagrange::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=6); throwassert(val.M()==1); // throwassert(val.K()==3 ); val=0; // -- if (whatd[op_id]) { RN_ f0(val('.',0,op_id)); f0[0] = l0*(2*l0-1); f0[1] = l1*(2*l1-1); f0[2] = l2*(2*l2-1); f0[3] = 4*l1*l2; // oppose au sommet 0 f0[4] = 4*l0*l2; // oppose au sommet 1 f0[5] = 4*l1*l0; // oppose au sommet 3 } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x*l4_0; f0x[1] = Dl1.x*l4_1; f0x[2] = Dl2.x*l4_2; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) ; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y*l4_0; f0y[1] = Dl1.y*l4_1; f0y[2] = Dl2.y*l4_2; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); fxx[0] = 4*Dl0.x*Dl0.x; fxx[1] = 4*Dl1.x*Dl1.x; fxx[2] = 4*Dl2.x*Dl2.x; fxx[3] = 8*Dl1.x*Dl2.x; fxx[4] = 8*Dl0.x*Dl2.x; fxx[5] = 8*Dl0.x*Dl1.x; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); fyy[0] = 4*Dl0.y*Dl0.y; fyy[1] = 4*Dl1.y*Dl1.y; fyy[2] = 4*Dl2.y*Dl2.y; fyy[3] = 8*Dl1.y*Dl2.y; fyy[4] = 8*Dl0.y*Dl2.y; fyy[5] = 8*Dl0.y*Dl1.y; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); fxy[0] = 4*Dl0.x*Dl0.y; fxy[1] = 4*Dl1.x*Dl1.y; fxy[2] = 4*Dl2.x*Dl2.y; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } } } /* void TypeOfFE_P1Lagrange::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int j, void * arg) const { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1) }; for (int i=0;i<3;i++) { f(v,K.T(Pt[i]),K,i,Pt[i],arg),val[i]=*(v+j);} } void TypeOfFE_P2Lagrange::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int j, void * arg) const { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1),R2(0.5,0.5),R2(0,0.5),R2(0.5,0) }; for (int i=0;i<6;i++) { f(v,K.T(Pt[i]),K,i,Pt[i],arg),val[i]=*(v+j);} } */ //TypeOfFE P1Lagrange(1,0,0,P1Functions,D2_P1Functions,P1Interpolant,DataP1Lagrange); //TypeOfFE P2Lagrange(1,1,0,P2Functions,D2_P2Functions,P2Interpolant,DataP2Lagrange,3); // case of fine mesh class TypeOfMortarCas1: public TypeOfMortar { friend class FESpace; friend class FMortar; friend class ConstructDataFElement; protected: int NbLagrangeMult(const Mesh &,const Mortar &M) const ; int NbDoF(const Mesh &,const Mortar &M,int i) const { int l(M.NbLeft()),r(M.NbRight()); int n =Max(l,r); int mn=Min(l,r); return (l+r)*(NbDfOnVertex + NbDfOnEdge) + (n+1)*NbDfOnVertex + n*NbDfOnEdge -mn-1; } int NbOfNodes(const Mesh &,const Mortar &M) const // call one time {int l(M.NbLeft()),r(M.NbRight()); return (l+r)*(vertex_is_node+edge_is_node)+1;} int NbDoF(const Mesh &,const Mortar &M) const { int l(M.NbLeft()),r(M.NbRight()); int n =Max(l,r); int mn=Min(l,r); return (l+r)*(NbDfOnVertex + NbDfOnEdge) + (n+1)*NbDfOnVertex + n*NbDfOnEdge -mn-1; } int NodeOfDF(const FESpace &Vh,const Mortar &M,int i) const {throwassert(0);return 0;} int DFOfNode(const FESpace &Vh,const Mortar &M,int i) const {throwassert(0);return 0;} void ConstructionOfNode(const Mesh &Th,int im,int * NodesOfElement,int *FirstNodeOfElement,int &lastnodenumber) const; void ConsTheSubMortar(FMortar & ) const; const int vertex_is_node,edge_is_node; public: TypeOfMortarCas1 (int i,int j): TypeOfMortar(i,j), vertex_is_node(i?1:0),edge_is_node(j?1:0) {}; } MortarCas1P2(1,1) ; const TypeOfMortar & TheMortarCas1P2(MortarCas1P2); void TypeOfMortarCas1::ConstructionOfNode(const Mesh &Th,int im,int * NodesOfElement,int *FirstNodeOfElement,int &lastnodenumber) const { // im mortar number // trop complique on change const Mortar &M(Th.mortars[im]); int k = Th.nt+im; int kk=FirstNodeOfElement[k]; // begin // lagrange multiplicator one new node NodesOfElement[kk++] = lastnodenumber++; /* int il = M.NbLeft(); int ir = M.NbRight(); int ir1 = ir-1; // left for( int j=0;j=0 && lr >= 0); // throwassert ( ll <=lg && lr <= lg); // cout << "AA , BB = " << AA << "," << BB << endl; // cout << " " << ll << " " << lr << " ll=" << sm.sm[k].left << ", "; if (ll2); return nbmul; } // --- FMortar::FMortar(const FESpace * VVh,int k) : Vh(*VVh), M(Vh.Th.mortars[k-Vh.Th.nt]), N(VVh->N), p(Vh.PtrFirstNodeOfElement(k)), nbn(Vh.NbOfNodesInElement(k)), tom(Vh.tom) { throwassert(k>=Vh.Th.nt && k tom->ConsTheSubMortar(*this);} R TypeOfFE::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R v[1000],vf[100]; assert(N*3*NbDoF<=1000 && NbDoF <100 ); KNMK_ fb(v,NbDoF,N,op+1); // the value for basic fonction KN_ fk(vf,NbDoF); for (int i=0;i #include #include "error.hpp" #include #include #include #include "rgraph.hpp" using namespace std; #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" extern long verbosity ; namespace Fem2D { int Make(const TypeOfFE ** t,int k,KN & P,KN & I) { typedef TypeOfFE::IPJ IPJ; int n=0,nn=0; for (int i=0;i p(t[i]->P_Pi_h); for (int j=0;j ajout I[nn]=n++; for (int l=0;l detruit break;} } } } return n; // nombre de point commun } KN Makepij_alpha(const TypeOfFE ** t,int k) { // Attention les df est numerote de facon croissant // en faisant une boucle sur les TypeOfFE // comme dans la class TypeOfFESum typedef TypeOfFE::IPJ IPJ; int n=0,m=0; for (int i=0;i< k;i++) { n += t[i]->pij_alpha.N(); m += t[i]->P_Pi_h.N(); } KN ij(n); KN I(m); KN P(m); Make(t,k,P,I); int p0=0,i0=0,N0=0,nn=0; for (int i=0;i< k;i++) { const KN p(t[i]->pij_alpha); for (int j=0;jNbDoF; p0+=t[i]->P_Pi_h.N(); N0+=t[i]->N;} return ij; } KN MakeP_Pi_h(const TypeOfFE **t,int k) { int np=0; for (int i=0;i< k;i++) np += t[i]->P_Pi_h.N(); KN< R2 > yy(np); KN zz(np); int kk=Make(t,k,yy,zz); // cout << " MakeP_Pi_h: " << kk << " from " << np << endl; return yy(SubArray(kk)); } ListOfTFE * ListOfTFE::all ; // list of all object of this type void init_static_FE(); // to correct so probleme with static Library FH aout 2004 // the list of other FE file to force the link ListOfTFE::ListOfTFE (const char * n,TypeOfFE *t) : name(n),tfe(t) { if(!t) assert(t); static int count=0; if (count++==0) all=0; // init of all in dependant of the ordre of the objet file next=all; all=this; // to correct so probleme with static Library FH aout 2004 init_static_FE(); } const TypeOfFE ** Make(const FESpace **l,int k) { const TypeOfFE** p=new const TypeOfFE*[k]; for (int i=0;iTFE[0]; return p; } const TypeOfFE ** Make(const TypeOfFE **l,int k) { const TypeOfFE** p=new const TypeOfFE*[k]; for (int i=0;i Aipj(ipj.N()); KNM Vp(N,PtHat.N()); Pi_h(Aipj); for (int p=0;p Vpp(Vp('.',p)); for (int j=0;j & v) const { int k0=0; for (int i=0;iNbDoF; // ici BUG 28/11/2006 FH int n=teb[i]->pij_alpha.N(); // ici BUG KN_ sv(v(SubArray(n,k0))); teb[i]->Pi_h_alpha(K,sv); k0+= n;} assert(pij_alpha.N()==k0); } ~TypeOfFESum(){ delete [] teb;} } ; class FEProduitConstruct { protected: int k; const TypeOfFE & teb; int * data; int * data1; FEProduitConstruct(int kk,const TypeOfFE &t) ; ~FEProduitConstruct(){delete [] data;} }; class TypeOfFEProduit: protected FEProduitConstruct, public TypeOfFE { public: TypeOfFEProduit(int kk,const TypeOfFE &t): FEProduitConstruct(kk,t),TypeOfFE(t,kk,data,data1) {} void FB(const bool * whatd,const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; virtual void Pi_h_alpha(const baseFElement & K,KN_ & v) const { int nbof=teb.NbDoF; for (int i=0,k0=0;i sv(v(SubArray(nbof,k0))); teb.Pi_h_alpha(K,sv); } } ~TypeOfFEProduit(){} } ; FEProduitConstruct::FEProduitConstruct(int kk,const TypeOfFE &t) :k(kk),teb(t) { int m= teb.NbDoF; KN nn(teb.NbNode); nn=0; // nb de dl par noeud for (int i=0;i m; int i=k,j; while(i--) // on va a l'envert pour avoir comp[i] <=i m[teb[i]]=i; // l'ordre comp est important comp est croissant mais pas de pb. i=k; while(i--) comp[i]=m[teb[i]]; // comp[i] <=i // reservatition des intervalles en espaces int n=0,N=0; for ( j=0;jN;} NN[kk] = N; // reservation des interval en df n=0; for ( j=0;jNbDoF;} DF[kk] = n; // n = nb de DF total // N the fem is in R^N data = new int [n*(5+2) + 3*N]; data1 = data + n*5+N; // april 2006 add 2 array ???? int c=0; // int ki= 0; // recherche des noeuds KN w(7),nn(7); w=0; nn=0; for ( j=0;jNbDoF;i++) nn[teb[j]->DFOnWhat[i]]++; nbn=0; for( j=0;j<7;j++) if (nn[j]) nn[j]=nbn++; else nn[j]=-1; KN dln(7); dln=0; // nn donne numero de noeud sur what for ( j=0;jNbDoF;i++) data[c++] = teb[j]->DFOnWhat[i]; for ( j=0;jNbDoF;i++) data[c++] = teb[j]->DFOfNode[i]+dln[teb[j]->DFOnWhat[i]]; for ( i=0;iNbDoF;i++) dln[teb[j]->DFOnWhat[i]]=Max(dln[teb[j]->DFOnWhat[i]],data[cc++]+1); } for ( j=0;jNbDoF;i++) data[c++] = nn[teb[j]->DFOnWhat[i]]; } for ( j=0;jNbDoF;i++) data[c++] = j; // node from of FE for ( j=0;jNbDoF;i++) data[c++] = i; // node from of df in FE // error -- here //in case of [P2,P2],P1 // we expect 0,0,1 and we get 0 1 2 // => wrong BC ???? int xx=0; for (j=0;jN;i++) { data[c] = teb[j]->dim_which_sub_fem[i]+xx; xxx=Max(xxx,data[c]+1); c++; } xx=xxx; } // ou dans la partie miminal element finite atomic int ci=n; int cf=2*n; int cl=cf+N;; int cj=0; int ccc=0; for ( j=0;jnb_sub_fem) for ( i=0;iNbDoF;i++) { int il= teb[j]->fromASubDF[i]; int jl= teb[j]->fromASubFE[i]; data1[ci++]=il; data1[cj++]=ccc+jl; } for (int j=0,ccn=0 ; jNbDoF) for(int k=0;kN;++k) { data1[cf++] = ccn + teb[j]->begin_dfcomp[k]; data1[cl++] = ccn + teb[j]->end_dfcomp[k]; } ffassert(cl==2*n+2*N); ffassert(c== 5*n+N); /* int cc=0; cout << " Data : " << endl; for ( i=0;i<5;i++) { for (j=0;j & u,int componante,int op) const ; } ; /////////////////////////////////////////////////////////////////////////////// // FH pour tester des idee de schema ---- Juin 2005 --- /////////////////////////////////////////////////////////////////////////////// // un VF cell centre class TypeOfFE_P0VF : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P0VF(): TypeOfFE(1,0,0,1,Data,1,1,3,3,Pi_h_coef) { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1) }; for (int i=0;i & u,int componante,int op) const ; } ; int TypeOfFE_P0VF::Data[]={0,1,2, 0,0,0, 0,1,2, 0,0,0, 0,1,2, 0, 0,3}; double TypeOfFE_P0VF::Pi_h_coef[]={1.,1.,1.}; // bofbof a verifier ... R TypeOfFE_P0VF::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))); R r=0; if (op==0) { R l0=0,l1=PHat.x,l2=PHat.y; l1 = l1 * 3. < 1; l2 = l2 * 3. < 1; l0 = 1 - l0 -l2; r = u0*l0+u1*l1+l2*u2; } else { r =0; } // cout << r << "\t"; return r; } void TypeOfFE_P0VF::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); if (whatd[op_id]) { R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; l1 = l1 * 3. < 1; l2 = l2 * 3. < 1; l0 = 1 - l0 -l2; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); f0[0] = l0; f0[1] = l1; f0[2] = l2;} } /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// NEW //////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class TypeOfFE_P1Bubble : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P1Bubble(): TypeOfFE(1,0,1,1,Data,1,1,4,4,Pi_h_coef) { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1), R2(1./3.,1./3.) }; for (int i=0;i & u,int componante,int op) const ; } ; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class TypeOfFE_P2Lagrange : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; TypeOfFE_P2Lagrange(): TypeOfFE(1,1,0,1,Data,3,1,6,6,Pi_h_coef) { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1),R2(0.5,0.5),R2(0,0.5),R2(0.5,0) }; for (int i=0;icounter), MaxNbNodePerElement(t->MaxNbNodePerElement), MaxNbDFPerElement(t->MaxNbDFPerElement*k), NodesOfElement(t->NodesOfElement), FirstNodeOfElement(t->FirstNodeOfElement), FirstDfOfNode(0), NbOfElements(t->NbOfElements), NbOfDF(t->NbOfDF*k), NbOfNode(t->NbOfNode), Nproduit(t->Nproduit*k) { throwassert(t==0 || t->FirstDfOfNode==0); (*counter)++; // correction mai 2006 bug in counter incrementation } ConstructDataFElement::ConstructDataFElement (const Mesh &Th,/*int NbDfOnSommet,int NbDfOnEdge,int NbDfOnElement*/ const KN & TFEs,const TypeOfMortar *tm, int nbdfv,const int *ndfv,int nbdfe,const int *ndfe) : counter(NewCounter()) { Make(Th,TFEs,/*NbDfOnSommet,NbDfOnEdge,NbDfOnElement,*/ tm,nbdfv,ndfv,nbdfe,ndfe); } ConstructDataFElement::ConstructDataFElement(const FESpace ** l,int k,const KN & TFEs) : counter(NewCounter()) { int NbDfOnSommet=0; int NbDfOnEdge=0; int NbDfOnElement=0; const Mesh & Th(l[0]->Th); for (int i=0;iTFE[0]->NbDfOnVertex; NbDfOnEdge += l[i]->TFE[0]->NbDfOnEdge; NbDfOnElement += l[i]->TFE[0]->NbDfOnElement; ffassert( &Th== &l[i]->Th); ffassert( l[i]->TFE.constant()); } Make(Th,TFEs);//NbDfOnSommet,NbDfOnEdge,NbDfOnElement,0); } void ConstructDataFElement::Make(const Mesh &Th, const KN & TFEs, /*int NbDfOnSommet,int NbDfOnEdge,int NbDfOnElement,*/const TypeOfMortar *tm, int nb_dfv,const int *ndfv,int nb_dfe,const int *ndfe) /* pour le condition de periodicit .. nb_dfv : nombre de sommets recolle par periodicit ndfv: numerotation des sommets pour CL de periodicite ndfv[i] = numero du sommet i (iNodeOn(NbNodes); NodeOn=-1; int nb[7]; for (int i=0;i<7;i++) nb[i]=0; int kkk=0; for (int df=0;df=0) assert( NodeOn[node] ==w); else { NodeOn[node]=w; ++kkk; ++nb[w]; }// on vertex 0 } assert(nb[0]==nb[1] && nb[1] == nb[2]); assert(nb[3]==nb[4] && nb[4] == nb[5]); NbNodeonVertex=nb[0]; NbNodeonEdge=nb[3]; NbNodeonElement=nb[6]; assert(kkk==NbNodes); }*/ KN NbDFonNode(NbNodes), NodeIsOn(NbNodes); NbDFonNode=0; for (int df=0;df0, ke=TFE.NbNodeOnEdge>0, kt=TFE.NbNodeOnElement>0; /* Vieux code if(NbDfOnSommet) { nbne+=3; ks=1; ndf=NbDfOnSommet;} if(NbDfOnEdge) { nbne+=3; ke=1; samendf &= !ndf || ndf == NbDfOnEdge; ndf=NbDfOnEdge;} if(NbDfOnElement) { nbne+=1; kt=1; samendf &= !ndf || ndf == NbDfOnElement; ndf=NbDfOnElement;} int NbDFonNode[7],NodeIsOn[7]; { int j=0,k=0; if(ks) { NbDFonNode[j++]=NbDfOnSommet; NbDFonNode[j++]=NbDfOnSommet; NbDFonNode[j++]=NbDfOnSommet;} if(ke) { NbDFonNode[j++]=NbDfOnEdge; NbDFonNode[j++]=NbDfOnEdge; NbDFonNode[j++]=NbDfOnEdge;} if(kt) { NbDFonNode[j++]=NbDfOnElement;} if (ks) {NodeIsOn[k++]=0;NodeIsOn[k++]=1;NodeIsOn[k++]=2;} if (ke) {NodeIsOn[k++]=3;NodeIsOn[k++]=4;NodeIsOn[k++]=5;} if (kt) {NodeIsOn[k++]=6;} throwassert(j == nbne); } */ MaxNbNodePerElement=nbne; // if ( ks && (!ke && ! kt) && (ndfv==0 && ndfe==0)) {nn=Th.nv; NodesOfElement=0; } else { // constuction du tableau NodesOfElement bofbof // computation of the length lne of array NodesOfElement int lne= Th.nt*nbne; if (Th.NbMortars) { samendf= false; NbOfNodeL=Th.NbMortars; ffassert(tm); FirstNodeOfElement = new int[NbOfElements+1]; int k=0,kk=0; for (k=0;kNbOfNodes(Th,Th.mortars[im]); } FirstNodeOfElement[k++]=lne; } NodesOfElement = new int[lne]; for (int i=0;i= 0 && jj >=0 && !(( kk == k ) && ( jj=j ) ) ) { if (k < kk ) kjj = NbNodeonEdge-kj-1; // else kj = NbNodeonEdge-kj-1, kjj = NbNodeonEdge-kj-1; } if (kjj >=0) NodesOfElement[kk*nbne+oe+jj] = nn + ndfe[be]*NbNodeonEdge+ kjj ; // adj NodesOfElement[k*nbne+oe+j] = nn + ndfe[be]*NbNodeonEdge+ kj ; // new } } nn += nb_dfe; } for (int k=0;k=k && jjj == jj); NodesOfElement[kk*nbne+oe+jjj] = nn ; // adj NodesOfElement[i++] = nn++ ; // new } else i++; } for (int jj=0;jjConstructionOfNode(Th,im,NodesOfElement,FirstNodeOfElement,nn); Mortar & M(Th.mortars[im]); NodesOfElement[i++] = nn++; // the first node is the lag. mul. int n=M.NbT(); for (int kk=0;kkNbLagrangeMult(Th,Th.mortars[km]); // On node par int nodemul = NodesOfElement[fk]; // the first node is the lagr. mul. throwassert(FirstDfOfNode[nodemul+1]==-1); FirstDfOfNode[nodemul+1]= ndlmul; NbOfDFL += ndlmul; int nbdle=0; //int nbnm=lk-fk; for (int j=fk;j2) { cout << " FESpace: Nb Of Nodes = " << nn ; if(NbOfNodeL) cout << " Nb of Lagrange Mul Node = " << NbOfNodeL ; cout << " Nb of DF = " << NbOfDF << endl; if(NbOfDFL) { cout << " Nb of Lagrange Mul DF = " << NbOfDFL ; cout << " MaxNbDFPerElement = " << MaxNbDFPerElement ; }; cout << endl; } } FESpace::FESpace(const FESpace & Vh,int k ) : Th(Vh.Th), ptrTFE(new TypeOfFEProduit(k,*Vh.TFE[0])), TFE(1,0,ptrTFE), cdef(Vh.cdef?new ConstructDataFElement(Vh.cdef,k):0), cmesh(Vh.Th), N(Vh.N*k), Nproduit(Vh.Nproduit*k), NbOfDF(Vh.NbOfDF*k), NbOfElements(Vh.NbOfElements), NbOfNodes(Vh.NbOfNodes), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), NodesOfElement(Vh.NodesOfElement), FirstNodeOfElement(Vh.FirstNodeOfElement), FirstDfOfNodeData(cdef?cdef->FirstDfOfNode:0), tom(0), MaxNbNodePerElement(Vh.MaxNbNodePerElement), MaxNbDFPerElement(Vh.MaxNbDFPerElement*k) { // correction mai 2006 no renumbering of existing cdef if(cdef && (Vh.cdef && Vh.cdef->counter != cdef->counter)) { // cout << " remum " << cdef->counter << " != " << Vh.cdef->counter <Nproduit), NbOfDF(cdef->NbOfDF), NbOfElements(cdef->NbOfElements), NbOfNodes(cdef->NbOfNode), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), NodesOfElement(cdef->NodesOfElement), FirstNodeOfElement(cdef->FirstNodeOfElement), FirstDfOfNodeData(cdef->FirstDfOfNode), tom(0) , MaxNbNodePerElement(cdef->MaxNbNodePerElement), MaxNbDFPerElement(cdef->MaxNbDFPerElement) { if(cdef) renum(); Show(); // verification long snbdf=0; for(int i=0;iNbOfDF; if( snbdf !=NbOfDF) cerr << " Problem build of FEspace (2d) (may be : due to periodic Boundary condition missing ) FH " << endl << " The number of DF must be " << snbdf << " and it is " << NbOfDF <Nproduit), NbOfDF(cdef->NbOfDF), NbOfElements(cdef->NbOfElements), NbOfNodes(cdef->NbOfNode), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), NodesOfElement(cdef->NodesOfElement), FirstNodeOfElement(cdef->FirstNodeOfElement), FirstDfOfNodeData(cdef->FirstDfOfNode), tom(0) , MaxNbNodePerElement(cdef->MaxNbNodePerElement), MaxNbDFPerElement(cdef->MaxNbDFPerElement) { if(cdef) renum(); Show(); } FESpace::FESpace(const Mesh & TTh,const TypeOfFE & tef,int nbdfv,const int *ndfv,int nbdfe,const int *ndfe) : Th(TTh), ptrTFE(0), TFE(1,0,&tef), cdef(new ConstructDataFElement(TTh,TFE,0,nbdfv,ndfv,nbdfe,ndfe)), cmesh(TTh), //tef.NbDfOnVertex,tef.NbDfOnEdge,tef.NbDfOnElement,0,nbdfv,ndfv,nbdfe,ndfe)), N(tef.N), Nproduit(cdef->Nproduit), NbOfDF(cdef->NbOfDF), NbOfElements(cdef->NbOfElements), NbOfNodes(cdef->NbOfNode), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), NodesOfElement(cdef->NodesOfElement), FirstNodeOfElement(cdef->FirstNodeOfElement), FirstDfOfNodeData(cdef->FirstDfOfNode), tom(0), MaxNbNodePerElement(cdef->MaxNbNodePerElement), MaxNbDFPerElement(cdef->MaxNbDFPerElement) { if(tef.NbDfOnVertex || tef.NbDfOnEdge) renum(); Show(); } FESpace::~FESpace() { SHOWVERB(cout << " FESpace::~FESpace() " << endl); /* cout << " del FESpace " << this << " " << cdef << " " ; if(cdef) cout << cdef->NodesOfElement << endl; else cout << endl;*/ delete cdef; if(ptrTFE) delete ptrTFE; } FESpace::FESpace(const Mesh & TTh,const TypeOfFE & tef,const TypeOfMortar & tm) : Th(TTh), ptrTFE(0), TFE(1,0,&tef), cdef(new ConstructDataFElement(TTh,TFE,&tm)),//tef.NbDfOnVertex,tef.NbDfOnEdge,tef.NbDfOnElement,&tm)), cmesh(TTh), N(tef.N), Nproduit(1), NbOfDF(cdef->NbOfDF), NbOfElements(cdef->NbOfElements), NbOfNodes(cdef->NbOfNode), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), NodesOfElement(cdef->NodesOfElement), FirstNodeOfElement(cdef->FirstNodeOfElement), FirstDfOfNodeData(cdef->FirstDfOfNode), tom(&tm), MaxNbNodePerElement(cdef->MaxNbNodePerElement), MaxNbDFPerElement(cdef->MaxNbDFPerElement) { // cout << "avant renum ="<< *this <FB(whatd,Th,K,P,v); else v=val(SubArray(DF[j+1]-DF[j],DF[j]),SubArray(NN[j+1]-NN[j],NN[j]),t); } } R TypeOfFE_P1Lagrange::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))); R r=0; if (op==op_id) { R l0=1-PHat.x-PHat.y,l1=PHat.x,l2=PHat.y; r = u0*l0+u1*l1+l2*u2; } else { const Triangle & T=K.T; R2 D0 = T.H(0) , D1 = T.H(1) , D2 = T.H(2) ; if (op==op_dx) r = D0.x*u0 + D1.x*u1 + D2.x*u2 ; else if(op==op_dy) r = D0.y*u0 + D1.y*u1 + D2.y*u2 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1Lagrange::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd[op_id]) { f0[0] = l0; f0[1] = l1; f0[2] = l2;} if (whatd[op_dx] || whatd[op_dy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x; f0x[1] = Dl1.x; f0x[2] = Dl2.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y; f0y[1] = Dl1.y; f0y[2] = Dl2.y; } } } /////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// NEW ///////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// void TypeOfFE_P1Bubble::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y, l1=P.x, l2=P.y, lb=l0*l1*l2*9.; if (val.N() <4) throwassert(val.N() >=4); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd[op_id]) { f0[0] = l0-lb; f0[1] = l1-lb; f0[2] = l2-lb; f0[3] = 3.*lb; } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)), Dlb((Dl0*l1*l2+Dl1*l0*l2+Dl2*l0*l1)*9.); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x-Dlb.x; f0x[1] = Dl1.x-Dlb.x; f0x[2] = Dl2.x-Dlb.x; f0x[3] = 3.*Dlb.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y-Dlb.y; f0y[1] = Dl1.y-Dlb.y; f0y[2] = Dl2.y-Dlb.y; f0y[3] = 3.*Dlb.y; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); R lbdxx= 18*((Dl0.x*Dl1.x)*l2+(Dl1.x*Dl2.x)*l0+(Dl2.x*Dl0.x)*l1); fxx[0] = -lbdxx; fxx[1] = -lbdxx; fxx[2] = -lbdxx; fxx[3] = 3*lbdxx; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); R lbdyy= 18*((Dl0.y*Dl1.y)*l2+(Dl1.y*Dl2.y)*l0+(Dl2.y*Dl0.y)*l1); fyy[0] = -lbdyy; fyy[1] = -lbdyy; fyy[2] = -lbdyy; fyy[3] = 3*lbdyy; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); R lbdxy= 9*(Dl0.x*Dl1.y+ Dl0.y*Dl1.x)*l2+(Dl1.x*Dl2.y+Dl1.y*Dl2.x)*l0+(Dl2.x*Dl0.y+Dl2.y*Dl0.x)*l1; fxy[0] = 4*Dl0.x*Dl0.y-lbdxy; fxy[1] = 4*Dl1.x*Dl1.y-lbdxy; fxy[2] = 4*Dl2.x*Dl2.y-lbdxy; fxy[3] = +3*lbdxy; } } } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /* void TypeOfFE_P1Lagrange::FB(const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,0)); RN_ f0x(val('.',0,1)); RN_ f0y(val('.',0,2)); f0[0] = l0; f0[1] = l1; f0[2] = l2; f0x[0] = Dl0.x; f0x[1] = Dl1.x; f0x[2] = Dl2.x; f0y[0] = Dl0.y; f0y[1] = Dl1.y; f0y[2] = Dl2.y; } void TypeOfFE_P2Lagrange::FB(const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=6); throwassert(val.M()==1); throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,0)); RN_ f0x(val('.',0,1)); RN_ f0y(val('.',0,2)); // -- f0[0] = l0*(2*l0-1); f0[1] = l1*(2*l1-1); f0[2] = l2*(2*l2-1); f0[3] = 4*l1*l2; // oppose au sommet 0 f0[4] = 4*l0*l2; // oppose au sommet 1 f0[5] = 4*l1*l0; // oppose au sommet 3 f0x[0] = Dl0.x*l4_0; f0x[1] = Dl1.x*l4_1; f0x[2] = Dl2.x*l4_2; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) ; f0y[0] = Dl0.y*l4_0; f0y[1] = Dl1.y*l4_1; f0y[2] = Dl2.y*l4_2; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } */ void TypeOfFE_P2Lagrange::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=6); throwassert(val.M()==1); // throwassert(val.K()==3 ); val=0; // -- if (whatd[op_id]) { RN_ f0(val('.',0,op_id)); f0[0] = l0*(2*l0-1); f0[1] = l1*(2*l1-1); f0[2] = l2*(2*l2-1); f0[3] = 4*l1*l2; // oppose au sommet 0 f0[4] = 4*l0*l2; // oppose au sommet 1 f0[5] = 4*l1*l0; // oppose au sommet 3 } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x*l4_0; f0x[1] = Dl1.x*l4_1; f0x[2] = Dl2.x*l4_2; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) ; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y*l4_0; f0y[1] = Dl1.y*l4_1; f0y[2] = Dl2.y*l4_2; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); fxx[0] = 4*Dl0.x*Dl0.x; fxx[1] = 4*Dl1.x*Dl1.x; fxx[2] = 4*Dl2.x*Dl2.x; fxx[3] = 8*Dl1.x*Dl2.x; fxx[4] = 8*Dl0.x*Dl2.x; fxx[5] = 8*Dl0.x*Dl1.x; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); fyy[0] = 4*Dl0.y*Dl0.y; fyy[1] = 4*Dl1.y*Dl1.y; fyy[2] = 4*Dl2.y*Dl2.y; fyy[3] = 8*Dl1.y*Dl2.y; fyy[4] = 8*Dl0.y*Dl2.y; fyy[5] = 8*Dl0.y*Dl1.y; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); fxy[0] = 4*Dl0.x*Dl0.y; fxy[1] = 4*Dl1.x*Dl1.y; fxy[2] = 4*Dl2.x*Dl2.y; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } } } void TypeOfFE_P2bLagrange::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y,lb=l0*l1*l2*3.; R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=7); throwassert(val.M()==1); // throwassert(val.K()==3 ); val=0; // -- if (whatd[op_id]) { R lb4=lb*4; RN_ f0(val('.',0,op_id)); f0[0] = l0*(2*l0-1)+lb; f0[1] = l1*(2*l1-1)+lb; f0[2] = l2*(2*l2-1)+lb; f0[3] = 4*l1*l2-lb4; // oppose au sommet 0 f0[4] = 4*l0*l2-lb4; // oppose au sommet 1 f0[5] = 4*l1*l0-lb4; // oppose au sommet 3 f0[6] = 9*lb; } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)), Dlb((Dl0*l1*l2+Dl1*l0*l2+Dl2*l0*l1)*3.), Dlb4(Dlb*4.); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x*l4_0 +Dlb.x; f0x[1] = Dl1.x*l4_1 +Dlb.x; f0x[2] = Dl2.x*l4_2 +Dlb.x; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) -Dlb4.x; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) -Dlb4.x; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) -Dlb4.x; f0x[6] = 9.*Dlb.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y*l4_0 +Dlb.y; f0y[1] = Dl1.y*l4_1 +Dlb.y; f0y[2] = Dl2.y*l4_2 +Dlb.y; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) -Dlb4.y; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) -Dlb4.y; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) -Dlb4.y; f0y[6] = 9*Dlb.y; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); R lbdxx= 6*((Dl0.x*Dl1.x)*l2+(Dl1.x*Dl2.x)*l0+(Dl2.x*Dl0.x)*l1); R lbd4xx= 4*lbdxx; fxx[0] = 4*Dl0.x*Dl0.x + lbdxx; fxx[1] = 4*Dl1.x*Dl1.x + lbdxx;; fxx[2] = 4*Dl2.x*Dl2.x + lbdxx;; fxx[3] = 8*Dl1.x*Dl2.x - lbd4xx; fxx[4] = 8*Dl0.x*Dl2.x - lbd4xx; fxx[5] = 8*Dl0.x*Dl1.x - lbd4xx; fxx[6] = 9*lbdxx; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); R lbdyy= 6*((Dl0.y*Dl1.y)*l2+(Dl1.y*Dl2.y)*l0+(Dl2.y*Dl0.y)*l1); R lbd4yy= lbdyy*4; fyy[0] = 4*Dl0.y*Dl0.y + lbdyy; fyy[1] = 4*Dl1.y*Dl1.y + lbdyy; fyy[2] = 4*Dl2.y*Dl2.y + lbdyy; fyy[3] = 8*Dl1.y*Dl2.y - lbd4yy; fyy[4] = 8*Dl0.y*Dl2.y - lbd4yy; fyy[5] = 8*Dl0.y*Dl1.y - lbd4yy; fyy[6] = 9*lbdyy; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); R lbdxy= 3*(Dl0.x*Dl1.y+ Dl0.y*Dl1.x)*l2+(Dl1.x*Dl2.y+Dl1.y*Dl2.x)*l0+(Dl2.x*Dl0.y+Dl2.y*Dl0.x)*l1; R lbd4xy= lbdxy*4; fxy[0] = 4*Dl0.x*Dl0.y + lbdxy; fxy[1] = 4*Dl1.x*Dl1.y + lbdxy; fxy[2] = 4*Dl2.x*Dl2.y + lbdxy; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x) - lbd4xy; fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x) - lbd4xy; fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x) - lbd4xy; fxy[6] = 9.*lbdxy; } } } /* void TypeOfFE_P1Lagrange::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int j, void * arg) const { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1) }; for (int i=0;i<3;i++) { f(v,K.T(Pt[i]),K,i,Pt[i],arg),val[i]=*(v+j);} } void TypeOfFE_P2Lagrange::Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int j, void * arg) const { const R2 Pt[] = { R2(0,0), R2(1,0), R2(0,1),R2(0.5,0.5),R2(0,0.5),R2(0.5,0) }; for (int i=0;i<6;i++) { f(v,K.T(Pt[i]),K,i,Pt[i],arg),val[i]=*(v+j);} } */ //TypeOfFE P1Lagrange(1,0,0,P1Functions,D2_P1Functions,P1Interpolant,DataP1Lagrange); //TypeOfFE P2Lagrange(1,1,0,P2Functions,D2_P2Functions,P2Interpolant,DataP2Lagrange,3); // case of fine mesh class TypeOfMortarCas1: public TypeOfMortar { friend class FESpace; friend class FMortar; friend class ConstructDataFElement; protected: int NbLagrangeMult(const Mesh &,const Mortar &M) const ; int NbDoF(const Mesh &,const Mortar &M,int i) const { int l(M.NbLeft()),r(M.NbRight()); int n =Max(l,r); int mn=Min(l,r); return (l+r)*(NbDfOnVertex + NbDfOnEdge) + (n+1)*NbDfOnVertex + n*NbDfOnEdge -mn-1; } int NbOfNodes(const Mesh &,const Mortar &M) const // call one time {int l(M.NbLeft()),r(M.NbRight()); return (l+r)*(vertex_is_node+edge_is_node)+1;} int NbDoF(const Mesh &,const Mortar &M) const { int l(M.NbLeft()),r(M.NbRight()); int n =Max(l,r); int mn=Min(l,r); return (l+r)*(NbDfOnVertex + NbDfOnEdge) + (n+1)*NbDfOnVertex + n*NbDfOnEdge -mn-1; } int NodeOfDF(const FESpace &Vh,const Mortar &M,int i) const {ffassert(0);return 0;} int DFOfNode(const FESpace &Vh,const Mortar &M,int i) const {ffassert(0);return 0;} void ConstructionOfNode(const Mesh &Th,int im,int * NodesOfElement,int *FirstNodeOfElement,int &lastnodenumber) const; void ConsTheSubMortar(FMortar & ) const; const int vertex_is_node,edge_is_node; public: TypeOfMortarCas1 (int i,int j): TypeOfMortar(i,j), vertex_is_node(i?1:0),edge_is_node(j?1:0) {}; } MortarCas1P2(1,1) ; const TypeOfMortar & TheMortarCas1P2(MortarCas1P2); void TypeOfMortarCas1::ConstructionOfNode(const Mesh &Th,int im,int * NodesOfElement,int *FirstNodeOfElement,int &lastnodenumber) const { // im mortar number // trop complique on change // const Mortar &M(Th.mortars[im]); int k = Th.nt+im; int kk=FirstNodeOfElement[k]; // begin // lagrange multiplicator one new node NodesOfElement[kk++] = lastnodenumber++; /* int il = M.NbLeft(); int ir = M.NbRight(); int ir1 = ir-1; // left for( int j=0;j=0 && lr >= 0); // throwassert ( ll <=lg && lr <= lg); // cout << "AA , BB = " << AA << "," << BB << endl; // cout << " " << ll << " " << lr << " ll=" << sm.sm[k].left << ", "; if (ll2); return nbmul; } // --- FMortar::FMortar(const FESpace * VVh,int k) : Vh(*VVh), M(Vh.Th.mortars[k-Vh.Th.nt]), p(Vh.PtrFirstNodeOfElement(k)), nbn(Vh.NbOfNodesInElement(k)), N(VVh->N), tom(Vh.tom) { ffassert(k>=Vh.Th.nt && k tom->ConsTheSubMortar(*this);} R TypeOfFE::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R v[10000],vf[1000]; assert(N*3*NbDoF<=10000 && NbDoF <1000 ); KNMK_ fb(v,NbDoF,N,op+1); // the value for basic fonction KN_ fk(vf,NbDoF); for (int i=0;i namespace Fem2D { class FESpace; class TypeOfFE; /* // numbering of derivative enum operatortype { op_id=0, op_dx=1,op_dy=2, op_dxx=3,op_dyy=4, op_dyx=5,op_dxy=5, op_dz=6, op_dzz=7, op_dzx=8,op_dxz=8, op_dzy=9,op_dyz=9 }; const int last_operatortype=10; inline void initwhatd(bool *whatd,int k) { for (int i=0;i RN_; typedef KN RN; typedef KNM_ RNM_; //typedef KNM RNM; typedef KNMK_ RNMK_; typedef KNMK RNMK; inline int FindIn(int v,int *a,int n) { for (int i=0;i // i = df // j = [0 N[ (ou N est la dim de l'espace d'arrive N=3 // k = 0,1,2 f,fx,fy class FElement; class baseFElement; class FMortar; class TypeOfMortar; // for FE //typedef void (* basicFunction)(const FElement & FE,const R2 &P, RNMK_ & val); typedef void (* InterpolFunction)(R* v, const R2 & P,const baseFElement &,int where,const R2 & Phat, void * arg); //typedef void (*InterpolantFunction)(const FElement & FE,RN_ & val, InterpolFunction f, R* v); // for FM ( Finite Mortar Mortar + interpolation) typedef void (* basicFunctionMortar)(const FMortar & FE,const R2 &P, RNMK_ & val); typedef void (* InterpolFunctionMortar)(R* v, const R2 & P,const Mortar &,int where,const R2 & Phat); typedef void (*InterpolantFunctionMortar)(const FMortar & FE,RN_ & val, InterpolFunctionMortar f, R* v); //void P1Functions(const FElement &FE,const R2 & P,RNMK_ & val); //void P2Functions(const FElement &FE,const R2 & P,RNMK_ & val); class VofScalarFE { R v[3]; public: VofScalarFE() {v[0]=v[1]=v[2]=0;} VofScalarFE(R f,R fx,R fy) {v[0]=f;v[1]=fx;v[2]=fy;} R & operator[](int i){ return v[i];} const R & operator[](int i) const { return v[i];} R f() { return v[0];} R fx() { return v[1];} R fy() { return v[2];} VofScalarFE &operator+=(const VofScalarFE & a) { v[0]+=a.v[0]; v[1]+=a.v[1]; v[2]+=a.v[2];return *this;} }; class ConstructDataFElement { friend class FESpace; //int thecounter; // chang 09/2008 the counter is a pointer because // if you remove before the master the counter become invalide. int * counter; int MaxNbNodePerElement; int MaxNbDFPerElement; int *NodesOfElement; int *FirstNodeOfElement; int *FirstDfOfNode; int NbOfElements; int NbOfDF; int NbOfNode; int Nproduit; ConstructDataFElement(const Mesh &Th,/*int NbDfOnSommet,int NbDfOnEdge,int NbDfOnElement,*/ const KN & TFEs,const TypeOfMortar *tm=0, int nbdfv=0,const int *ndfv=0,int nbdfe=0,const int *ndfe=0); ConstructDataFElement(const ConstructDataFElement *,int k); ConstructDataFElement(const FESpace ** l,int k,const KN & TFEs) ; void renum(const long *r,int l) ; ~ConstructDataFElement(); void Make(const Mesh &Th,/*int NbDfOnSommet,int NbDfOnEdge,int NbDfOnElement*/const KN & TFEs,const TypeOfMortar *tm=0, int nbdfv=0,const int *ndfv=0,int nbdfe=0,const int *ndfe=0); private: static int *NewCounter() { int * p=new int; *p=0;return p;}// add the build thecounter. }; template inline int sum(const T ** l,int const T::*p,int n) { int r=0; for (int i=0;i*p; return r; } template inline int max(const T ** l,int const T::*p,int n) { int r=0; for (int i=0;i*p,r); return r; } class TypeOfFE { public: // The FEM is in R^N // The FEM is compose from nb_sub_fem // dim_which_sub_fem[N] give typedef R2 RdHat; // add avril 2009 FH typedef R2 Rd; // add avril 2009 FH friend class FESpace; friend class FElement; friend class FEProduitConstruct; const int NbDoF; const int NbNodeOnVertex, NbNodeOnEdge, NbNodeOnElement; const int NbDfOnVertex, NbDfOnEdge, NbDfOnElement, N,nb_sub_fem; const int NbNode; // remark // virtual void FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const =0; virtual void FB(const bool *,const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const =0; // virtual void D2_FB(const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const=0; // virtual void Pi_h(const baseFElement & K,RN_ & val, InterpolFunction f, R* v,int , void *) const=0; // soit // $(U_pj)_{{j=0,N-1}; {p=0,nbpoint_Pi_h-1}}$ les valeurs de U au point Phat[i]; // p est le numero du point d'integration // j est la composante // l'interpole est defini par // Pi_h u = \sum_k u_k w^k , et u_i = \sum_pj alpha_ipj U_pj // la matrice de alpha_ipj est tres creuse struct IPJ { int i,p,j; // i is DoF, p is Point, j is componante IPJ(int ii=0,int pp=0,int jj=0):i(ii),p(pp),j(jj) {} }; friend KN Makepij_alpha(const TypeOfFE **,int ); friend KN MakeP_Pi_h(const TypeOfFE **,int ); const KN & Ph_ijalpha() const {return pij_alpha;} // la struct de la matrice const KN & Pi_h_R2() const { return P_Pi_h;} // les points virtual void Pi_h_alpha(const baseFElement & K,KN_ & v) const { assert(coef_Pi_h_alpha); v=KN_(coef_Pi_h_alpha,pij_alpha.N());} // ---- const int nbsubdivision; // nb of subdivision for plot int const * const DFOnWhat; // 0,1,2 vertex 3,4,5 edge 6 triangle int const * const DFOfNode; // n\u00c9 du df on Node int const * const NodeOfDF; // int const * const fromFE; // the df come from df of FE int const * const fromDF; // the df come from with FE int const * const dim_which_sub_fem; // from atomic sub FE for CL (size N) KN pij_alpha ; KN P_Pi_h ; double *coef_Pi_h_alpha; KN Sub_ToFE; // List of atomic sub TFE avril 2006 // form Atomic Sub FE int const * const fromASubFE; // avril 2006 for CL int const * const fromASubDF; // avril 2006 for CL int const * const begin_dfcomp; // mai 2008 for optimiation int const * const end_dfcomp; // mai 2008 // if 0 no plot public: TypeOfFE(const TypeOfFE & t,int k,const int * data,const int * data1) : NbDoF(t.NbDoF*k), NbNodeOnVertex(t.NbNodeOnVertex),NbNodeOnEdge(t.NbNodeOnEdge),NbNodeOnElement(t.NbNodeOnElement), NbDfOnVertex(t.NbDfOnVertex*k),NbDfOnEdge(t.NbDfOnEdge*k),NbDfOnElement(t.NbDfOnElement*k), N(t.N*k),nb_sub_fem(t.nb_sub_fem*k), NbNode(t.NbNode), nbsubdivision(t.nbsubdivision), DFOnWhat(data), DFOfNode(data+NbDoF), NodeOfDF(data+2*NbDoF), fromFE(data+3*NbDoF), fromDF(data+4*NbDoF), dim_which_sub_fem(data+5*NbDoF), pij_alpha(t.pij_alpha.N()*k),P_Pi_h(t.P_Pi_h), coef_Pi_h_alpha(0), Sub_ToFE(nb_sub_fem), fromASubFE(data1+0*NbDoF), fromASubDF(data1+1*NbDoF), begin_dfcomp(data1+2*NbDoF), end_dfcomp(data1+2*NbDoF+N) { for(int i=0,kk=0;i=0 && dim_which_sub_fem[N-1]< nb_sub_fem); // Warning the componant is moving first for (int j=0,l=0;jnb_sub_fem;j++) Sub_ToFE[kk++]=t[i]->Sub_ToFE[j]; assert(begin_dfcomp[0]==0 && end_dfcomp[N-1]==NbDoF); Sub_ToFE= this; throwassert(dim_which_sub_fem[N-1]>=0 && dim_which_sub_fem[N-1]< nb_sub_fem);} TypeOfFE(const int i,const int j,const int k,const int NN,const int * data,int nsub,int nbsubfem, int kPi,int npPi,double * coef_Pi_h_a=0) : NbDoF(3*(i+j)+k), NbNodeOnVertex(NbNodebyWhat(data,NbDoF,0)), NbNodeOnEdge(NbNodebyWhat(data,NbDoF,3)), NbNodeOnElement(NbNodebyWhat(data,NbDoF,6)), /* NbDfOnVertex(Count(data,NbDoF,0)), NbDfOnEdge(Count(data,NbDoF,3)), NbDfOnElement(Count(data,NbDoF,6)), */ NbDfOnVertex(i),NbDfOnEdge(j),NbDfOnElement(k),N(NN),nb_sub_fem(nbsubfem), NbNode( (NbDfOnVertex ? 3 :0) + (NbDfOnEdge ? 3 :0 ) +(NbDfOnElement? 1 :0) ), nbsubdivision(nsub), DFOnWhat(data), DFOfNode(data+NbDoF), NodeOfDF(data+2*NbDoF), fromFE(data+3*NbDoF), fromDF(data+4*NbDoF), dim_which_sub_fem(data+5*NbDoF), pij_alpha(kPi),P_Pi_h(npPi), coef_Pi_h_alpha(coef_Pi_h_a), Sub_ToFE(nb_sub_fem), fromASubFE(data+3*NbDoF), fromASubDF(data+4*NbDoF), begin_dfcomp(data+5*NbDoF+N), end_dfcomp(data+5*NbDoF+2*N) { Sub_ToFE= this; assert(begin_dfcomp[0]==0 && end_dfcomp[N-1]==NbDoF); // cout << "TypeOfFE " <=0 && dim_which_sub_fem[N-1]< nb_sub_fem);} TypeOfFE(const int nbdf,const int NN,const int * data,int nsub,int nbsubfem, int kPi,int npPi,double * coef_Pi_h_a=0) : NbDoF(nbdf), NbNodeOnVertex(NbNodebyWhat(data,NbDoF,0)), NbNodeOnEdge(NbNodebyWhat(data,NbDoF,3)), NbNodeOnElement(NbNodebyWhat(data,NbDoF,6)), NbDfOnVertex(Count(data,NbDoF,0)), NbDfOnEdge(Count(data,NbDoF,3)), NbDfOnElement(Count(data,NbDoF,6)), N(NN), nb_sub_fem(nbsubfem), NbNode( (NbDfOnVertex ? 3 :0) + (NbDfOnEdge ? 3 :0 ) +(NbDfOnElement? 1 :0) ), nbsubdivision(nsub), DFOnWhat(data), DFOfNode(data+NbDoF), NodeOfDF(data+2*NbDoF), fromFE(data+3*NbDoF), fromDF(data+4*NbDoF), dim_which_sub_fem(data+5*NbDoF), pij_alpha(kPi),P_Pi_h(npPi), coef_Pi_h_alpha(coef_Pi_h_a), Sub_ToFE(nb_sub_fem) , fromASubFE(data+3*NbDoF), fromASubDF(data+4*NbDoF), begin_dfcomp(data+5*NbDoF+N), end_dfcomp(data+5*NbDoF+2*N) { Sub_ToFE= this; assert(begin_dfcomp[0]==0 && end_dfcomp[N-1]==NbDoF); assert(NbDfOnVertex==Count(data,NbDoF,0)); assert(NbDfOnVertex==Count(data,NbDoF,1)); assert(NbDfOnVertex==Count(data,NbDoF,2)); assert(NbDfOnEdge==Count(data,NbDoF,3)); assert(NbDfOnEdge==Count(data,NbDoF,4)); assert(NbDfOnEdge==Count(data,NbDoF,5)); assert(NbDfOnElement==Count(data,NbDoF,6)); throwassert(dim_which_sub_fem[N-1]>=0 && dim_which_sub_fem[N-1]< nb_sub_fem);} virtual ~TypeOfFE() { } virtual R operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const ; private: static int Count(const int *data,int n,int which) { int kk=0; for (int i=0;iNodesOfElement << endl;else cout << endl; } private: // for gibbs int gibbsv (long* ptvoi,long* vois,long* lvois,long* w,long* v); }; inline baseFElement::baseFElement( const FESpace &aVh, int k) : Vh(aVh),T(Vh.Th[k]),tfe(aVh.TFE[k]),N(aVh.N),number(k){} inline baseFElement::baseFElement(const baseFElement & K, const TypeOfFE & atfe) : Vh(K.Vh),T(K.T),tfe(&atfe),N(Vh.N),number(K.number){} inline FElement::FElement(const FESpace * VVh,int k) : baseFElement(*VVh,k) , p(Vh.PtrFirstNodeOfElement(k)), nb(Vh.NbOfNodesInElement(k)) {} inline int FElement::operator[](int i) const { return p ? p[i] : ((&T[i])-Vh.Th.vertices);} inline int FElement::operator()(int i,int df) const { return Vh.FirstDFOfNode(p ? p[i] : ((&T[i])-Vh.Th.vertices)) + df;} inline int FMortar::operator()(int i,int df) const {throwassert(p); return Vh.FirstDFOfNode(p[i]) + df;} inline int FMortar::operator[](int i) const {throwassert(p); return p[i];} inline int FElement::NbDoF(int i) const { int node =p ? p[i] : ((&T[i])-Vh.Th.vertices); return Vh.LastDFOfNode(node)-Vh.FirstDFOfNode(node);} void SetDefaultIsoValue(const KN_& U,KN_ & Viso); void SetDefaultIsoValue(const KN_& u,const KN_& v,KN_ & Viso); void MoveTo(R2 P); void LineTo(R2 P) ; /* void operator=( KN_ & u,const FElementGlobalToLocal & x) { int n=u.N(); throwassert(n==x.S.NbDoF()); for (int i=0;iNbDoF(Vh.Th,M);} //inline int FMortar::NbOfNodes()const {return } inline int FMortar::NodeOfDF(int i) const { return tom->NodeOfDF(Vh,M,i);} inline int FMortar::DFOfNode(int i) const { return tom->DFOfNode(Vh,M,i);} inline ostream & operator << (ostream & f,const FElement & FE) { f << FE.number << "," <FB(whatdold,Vh.Th,T,P,val);} inline void FElement::BF(const bool * whatd,const R2 & P,RNMK_ & val) const { tfe->FB(whatd,Vh.Th,T,P,val);} //inline void FElement::D2_BF(const R2 & P,RNMK_ & val) const { tfe->D2_FB(Vh.Th,T,P,val);} // ------- extern const TypeOfMortar & TheMortarCas1P2; void PlotValue(const RN_ & Viso,int k0,const char * cmm); // to store all the type of TFE // the problem is the TFE can be define on lot of file.cpp struct ListOfTFE { const char * name; TypeOfFE * tfe; ListOfTFE * next; static ListOfTFE * all ; // list of all object of this type ListOfTFE (const char * n,TypeOfFE *t); }; // to get a unique list of TypeOfFE // local variable of TypeOfFE ListOfTFE & GetListOfTFE() ; inline R FElement::operator()(const R2 & PHat, const KN_ & u,int i,int op) const { return (*tfe)(*this,PHat,u,i,op); } inline complex FElement::operator()(const R2 & PHat,const KN_ > & u,int i,int op) const { complex * pu=u; // pointeur du tableau double *pr = static_cast(static_cast(pu)); const KN_ ur(pr,u.n,u.step*2); const KN_ ui(pr+1,u.n,u.step*2); return complex((*tfe)(*this,PHat,ur,i,op),(*tfe)(*this,PHat,ui,i,op)); } } #endif freefem++-3.38-1/src/femlib/FESpacen.cpp000644 000767 000024 00000043155 12273276036 020001 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : Generic Fiinite Element 1d, 2d, 3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include "ufunction.hpp" #include "error.hpp" #include "RNM.hpp" #include "Mesh3dn.hpp" #include "Mesh2dn.hpp" #include "FESpacen.hpp" #include "splitsimplex.hpp" int UniqueffId::count=0; namespace Fem2D { //template int nbdf_d(const int ndfitem[4],const int nd[4]) { const int ndf = ndfitem[0]*nd[0] + ndfitem[1]*nd[1]+ ndfitem[2]*nd[2] + ndfitem[3]*nd[3]; return ndf; } //template int nbnode_d(const int ndfitem[4],const int nd[4]) { // const int nd[]= {Element::nv, Element::ne,Element::nf,Element::nt}; const int ndf = nd[0]*(ndfitem[0]!=0) + nd[1]*(ndfitem[1]!=0)+ nd[2]*(ndfitem[2]!=0) + nd[3]*(ndfitem[3]!=0); return ndf; } //template int *builddata_d(const int ndfitem[4],const int nd[4],int N) { // const int d=Element::Rd::d; // const int nwhat=Element::nitem; // const int nd[]= {Element::nv, Element::ne,Element::nf,Element::nt}; // const int nitem=nd[0]+nd[1]+nd[2]+nd[3]; // cout << " nitem="<< nitem<< endl; const int ndf = nbdf_d(ndfitem,nd); const int nnode=nbnode_d(ndfitem,nd); int lgdata= ndf*5+N; int * data = new int[lgdata]; int p=0; for(int i=0,nw=0;i<=3;++i) for(int j=0;j &teb) { const int k = teb.N(); KN NN(k+1), DF(k+1) , comp(k+1); map< dataTypeOfFE const *,int> m; int i=k,j; while(i--) // on va a l'envert pour avoir comp[i] <=i m[teb[i]]=i; // l'ordre comp est important comp est croissant mais pas de pb. i=k; while(i--) comp[i]=m[teb[i]]; // comp[i] <=i int n=0,N=0; for ( j=0;jN;} NN[k] = N; // reservation des interval en df n=0; for ( j=0;jNbDoF;} DF[k] = n; int NbDoF=0; int dfon[4]={0,0,0,0}; int nbsubdivision=0; int discon=0; for (int i=0;iNbDoF; dfon[0] += teb[i]->ndfonVertex; dfon[1] += teb[i]->ndfonEdge; dfon[2] += teb[i]->ndfonFace; dfon[3] += teb[i]->ndfonVolume; nbsubdivision = max(nbsubdivision,teb[i]->nbsubdivision); discon = discon || teb[i]->discontinue; // bof bof 1 FE discontinue => discontinue } int nwhat=15; // 15 = 4+6+1+1 (nb of support item (what) : vertex, edges, fqces, tet) int ostart=nwhat; int * data0=new int[ostart+7*NbDoF+N]; int * data=data0+ostart; int * data1=data+5*NbDoF; int c=0; KN w(nwhat),nn(nwhat); w=0; nn=0; for ( j=0;jNbDoF;i++) nn[teb[j]->DFOnWhat[i]]++; int nbn=0; for( j=0;j dln(nwhat); dln=0; // nn donne numero de noeud sur what for ( j=0;jNbDoF;i++) data[c++] = teb[j]->DFOnWhat[i]; for ( j=0;jNbDoF;i++) data[c++] = teb[j]->DFOfNode[i]+dln[teb[j]->DFOnWhat[i]]; for ( i=0;iNbDoF;i++) dln[teb[j]->DFOnWhat[i]]=Max(dln[teb[j]->DFOnWhat[i]],data[cc++]+1); } for ( j=0;jNbDoF;i++) data[c++] = nn[teb[j]->DFOnWhat[i]]; } for ( j=0;jNbDoF;i++) data[c++] = j; // node from of FE for ( j=0;jNbDoF;i++) data[c++] = i; // node from of df in FE // error -- here //in case of [P2,P2],P1 // we expect 0,0,1 and we get 0 1 2 // => wrong BC ???? c+=2*n; // on saute le deux tableau en plus (cf data1.) int xx=0; for (j=0;jN;i++) { data[c] = teb[j]->dim_which_sub_fem[i]+xx; xxx=Max(xxx,data[c]+1); c++; } xx=xxx; } // ou dans la partie miminal element finite atomic int ci=n; int cj=0; int ccc=0; for ( j=0;jnb_sub_fem) for ( i=0;iNbDoF;i++) { int il= teb[j]->fromASubDF[i]; int jl= teb[j]->fromASubFE[i]; data1[ci++]=il; data1[cj++]=ccc+jl; } int nb_sub_fem=ccc; ffassert(c== 7*n+N); /* int cc=0; cout << " Data : " << endl; for ( i=0;i<5;i++) { for (j=0;j & tef) : data(builddata_d(nitemdim,tef)), dataalloc(data), ndfonVertex(data[0]), ndfonEdge(data[1]), ndfonFace(data[2]), ndfonVolume(data[3]), NbDoF(data[4]), NbNode(data[5]), N(data[6]), nb_sub_fem(data[7]), nbsubdivision(data[8]), discontinue(data[9]), DFOnWhat(data+15+0*NbDoF), DFOfNode(data+15+1*NbDoF), NodeOfDF(data+15+2*NbDoF), fromFE(data+15+3*NbDoF), fromDF(data+15+4*NbDoF), fromASubFE(data+15+5*NbDoF), fromASubDF(data+15+6*NbDoF) , dim_which_sub_fem(data+15+7*NbDoF) {} template void GTypeOfFESum::init(InterpolationMatrix & M,FElement * pK,int odf,int ocomp,int *pp) const { // a faire ..... cas matrix invariante assert(0); } template GTypeOfFESum::GTypeOfFESum(const KN< GTypeOfFE const *> & t) : GTypeOfFE(t), k(t.N()), teb(t), NN(k+1), DF(k+1) , comp(k+1) {Build();} template static KN< GTypeOfFE const *> kn(const GFESpace ** tt,int kk) { KN< GTypeOfFE const *> r(kk); for(int i=0;iTFE[0];ffassert(tt[i]->TFE.constant());} return r; } template static KN< GTypeOfFE const *> kn(const GFESpace & tt,int kk) { return KN< GTypeOfFE const *> (kk,tt.TFE[0]); } template GTypeOfFESum::GTypeOfFESum(const GFESpace ** tt,int kk) : GTypeOfFE(kn(tt,kk)), k(kk), teb(kn(tt,kk)), NN(k+1), DF(k+1) , comp(k+1) {Build();} template GTypeOfFESum::GTypeOfFESum(const GFESpace & tt,int kk) : GTypeOfFE(kn(tt,kk)), k(kk), teb(kn(tt,kk)), NN(k+1), DF(k+1) , comp(k+1) {Build();} template void GTypeOfFESum::Build() { bool debug=verbosity>5;; { const KN< GTypeOfFE const *> & t=teb; map *,int> m; int i=k,j; while(i--) // on va a l'envert pour avoir comp[i] <=i m[teb[i]]=i; // l'ordre comp est important comp est croissant mais pas de pb. i=k; while(i--) comp[i]=m[teb[i]]; // comp[i] <=i // reservatition des intervalles en espaces int n=0,N=0; for ( j=0;jN;} NN[k] = N; // reservation des interval en df n=0; for ( j=0;jNbDoF;} DF[k] = n; } int ii=0; for (int i=0;inb_sub_fem;++j) this->Sub_ToFE[ii++]=teb[i]->Sub_ToFE[j]; } assert(ii==this->nb_sub_fem ); int c=0,c0=0, fcom=0; for (int i=0;inb_sub_fem;i++) { int N=this->Sub_ToFE[i]->N; int ndofi=this->Sub_ToFE[i]->NbDoF; this->first_comp[i]= fcom; this->last_comp[i]= fcom+N; fcom += N; for(int j=0;jbegin_dfcomp[c] = c0 + this->Sub_ToFE[i]->begin_dfcomp[j] ; this->end_dfcomp[c] = c0 + this->Sub_ToFE[i]->end_dfcomp[j] ; c++; } c0+=ndofi; } if(debug) { cout <<" NbDoF : " << this->NbDoF <N;++i) cout << " comp " << i << " ["<begin_dfcomp[i]<<", "<< this->end_dfcomp[i]<< "[\n"; } // construction de l'interpolation . int npi=0; int nci=0; bool var=true; for (int i=0;inb_sub_fem;i++) { npi +=this->Sub_ToFE[i]->NbPtforInterpolation; nci +=this->Sub_ToFE[i]->NbcoefforInterpolation; var = var && this->Sub_ToFE[i]->invariantinterpolationMatrix; } assert(this->NbcoefforInterpolation== nci); this->invariantinterpolationMatrix=var; // this->pInterpolation.init(nci); // this->cInterpolation.init(nci); // this->dofInterpolation.iniy(nci); { map mpt; numPtInterpolation.init(npi); int npp=0,kkk=0; KN Ptt(npi); for (int i=0;inb_sub_fem;i++) { const GTypeOfFE &ti=*this->Sub_ToFE[i]; for(int p=0;p5) cout << " p= "<< p << " [ " << Ptt[kkk]<< "] , "<< kkk<< " "<< npp<NbPtforInterpolation==0); if(verbosity>5) cout << npp; this->NbPtforInterpolation=npp; this->PtInterpolation.init(npp); for(int i=0;iPtInterpolation[numPtInterpolation[i]]=Ptt[i]; } int oc=0,odof=0; for (int i=0,k=0;inb_sub_fem;i++) { const GTypeOfFE &ti=*this->Sub_ToFE[i]; for(int j=0;jpInterpolation[k] = numPtInterpolation[ti.pInterpolation[j]]; this->cInterpolation[k] = ti.cInterpolation[j]+oc; this->dofInterpolation[k] = ti.dofInterpolation[j]+odof; this->coefInterpolation[k]=ti.coefInterpolation[j]; } oc += ti.N; odof += ti.NbDoF; } assert(c==this->N); } template void GTypeOfFESum::set(const Mesh & Th,const Element & K,InterpolationMatrix & M,int oocoef,int oodf,int *nnump ) const { int op=0,oc=0,odof=oodf,ocoef=oocoef; assert(nnump==0); for (int i=0,k=0;inb_sub_fem;i++) { const GTypeOfFE &ti=*this->Sub_ToFE[i]; if(!ti.invariantinterpolationMatrix) ti.set(Th,K,M,ocoef,odof,&numPtInterpolation[op]); oc += ti.N; odof += ti.NbDoF; ocoef += ti.NbcoefforInterpolation; op += ti.NbPtforInterpolation; } } template GFESpace::GFESpace(const GFESpace & Vh,int kk,int nbequibe,int *equibe) : GFESpacePtrTFE(new GTypeOfFESum(Vh,kk)), DataFENodeDF(Vh.Th.BuildDFNumbering(this->ptrTFE->ndfonVertex,this->ptrTFE->ndfonEdge,this->ptrTFE->ndfonFace,this->ptrTFE->ndfonVolume,nbequibe,equibe)), Th(Vh.Th), TFE(1,0,this->ptrTFE), cmesh(Th), N(TFE[0]->N), Nproduit(kk), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), maxNbPtforInterpolation(TFE[0]->NbPtforInterpolation), maxNbcoefforInterpolation(TFE[0]->NbcoefforInterpolation) { } template GFESpace::GFESpace(const GFESpace ** pVh,int kk,int nbequibe,int *equibe) : GFESpacePtrTFE(new GTypeOfFESum(pVh,kk)), DataFENodeDF((**pVh).Th.BuildDFNumbering(this->ptrTFE->ndfonVertex,this->ptrTFE->ndfonEdge,this->ptrTFE->ndfonFace,this->ptrTFE->ndfonVolume,nbequibe,equibe)), Th((**pVh).Th), TFE(1,0,this->ptrTFE), cmesh(Th), N(TFE[0]->N), Nproduit(FirstDfOfNodeData ? 1 :MaxNbDFPerNode), nb_sub_fem(TFE[0]->nb_sub_fem), dim_which_sub_fem(TFE[0]->dim_which_sub_fem), maxNbPtforInterpolation(TFE[0]->NbPtforInterpolation), maxNbcoefforInterpolation(TFE[0]->NbcoefforInterpolation) { long snbdf=0; for(int i=0;iNbOfDF; if( snbdf !=NbOfDF) cerr << " Problem build of GFESpace (3d) (may be : due to periodic Boundary condition missing ) FH " << endl << " The number of DF must be " << snbdf << " and it is " << NbOfDF <Th); } template template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const { const int d = Rd::d; Rd *Ps=0; int *Ks=0; int nsb = TFE[0]->nbsubdivision; int nvsub,nksub; SplitSimplex(nsb, nvsub, Ps, nksub , Ks); ffassert( Psub.unset()); ffassert( Ksub.unset()); Psub.set(Ps,nvsub); Ksub.set(Ks,nksub*(d+1)); lg= nvsub*Th.nt; KN v(lg); for (int k=0,i=0;k(true,v);// to remove the copy. } /* template KN GFESpace::newSaveDraw(const KN_ & U,int composante,int & lg,int & nsb) const { nsb = TFE[0]->nbsubdivision; int nsbv = NbOfSubInternalVertices(nsb,d); lg = nsbv*Th.nt; cout << "newSaveDraw what: nt " << Th.nt << " " << nsbv << " " << lg << endl; KN v(lg); ffassert(v); for (int k=0,i=0;k(true,v);// to remove the copy. } */ // explicite instance.. template class GTypeOfFESum; template class GTypeOfFESum; template class GFESpace; template class GFESpace; template class GFESpace; template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const ; template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const ; template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const ; typedef std::complex Complex; template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const ; template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const ; template KN GFESpace::newSaveDraw(const KN_ & U,int componante,int & lg,KN &Psub,KN &Ksub,int op_U) const ; } freefem++-3.38-1/src/femlib/FESpacen.hpp000644 000767 000024 00000063551 12524413021 017772 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : Generic Fiinite Element header 1d, 2d, 3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef FESpacen_HPP_ #define FESpacen_HPP_ /* * FEspacen.hpp * EF23n * * Created by Frdric Hecht on 04/12/07. * Copyright 2007 Universite Pierre et marie Curie All rights reserved. * */ #include #include #include #include #include #include #include using namespace std; #include "error.hpp" #include "ufunction.hpp" #include "Mesh3dn.hpp" #include "Mesh2dn.hpp" #include "Mesh1dn.hpp" #include "RNM.hpp" #include "QuadratureFormular.hpp" namespace Fem2D { template class GFESpace; template class GFElement; template class GbaseFElement; template class GTypeOfFE; // numbering of derivative enum operatortype { op_id=0, op_dx=1,op_dy=2, op_dxx=3,op_dyy=4, op_dyx=5,op_dxy=5, op_dz=6, op_dzz=7, op_dzx=8,op_dxz=8, op_dzy=9,op_dyz=9 }; typedef unsigned int What_d; const unsigned int Fop_id= 1<< op_id; const unsigned int Fop_dx= 1<< op_dx; const unsigned int Fop_dy= 1<< op_dy; const unsigned int Fop_dz= 1<< op_dz; const unsigned int Fop_dxx= 1<< op_dxx; const unsigned int Fop_dxy= 1<< op_dxy; const unsigned int Fop_dxz= 1<< op_dxz; const unsigned int Fop_dyx= 1<< op_dyx; const unsigned int Fop_dyy= 1<< op_dyy; const unsigned int Fop_dyz= 1<< op_dyz; const unsigned int Fop_dzx= 1<< op_dzx; const unsigned int Fop_dzy= 1<< op_dzy; const unsigned int Fop_dzz= 1<< op_dzz; const unsigned int Fop_D0 = Fop_id; const unsigned int Fop_D1 = Fop_dx | Fop_dy | Fop_dz; const unsigned int Fop_D2 = Fop_dxx | Fop_dyy | Fop_dzz | Fop_dxy | Fop_dxz | Fop_dyz; const unsigned int Fop_Dall = Fop_D0| Fop_D1| Fop_D2; inline What_d Fwhatd(const operatortype op) { return 1<< op;} const int last_operatortype=10; const bool operatortypeValue[last_operatortype]= {true,false,false,false,false,false,false,false,false,false} ; inline void initwhatd(bool *whatd,int k) { for (int i=0;i RN_; typedef KN RN; typedef KNM_ RNM_; typedef KNMK_ RNMK_; typedef KNMK RNMK; template class GFElement; template class GFESpace; templateclass GTypeOfFE ; class dataTypeOfFE { private: const int * data; const int * dataalloc; public: const int ndfonVertex; const int ndfonEdge; const int ndfonFace; const int ndfonVolume; const int NbDoF; const int NbNode; int N,nb_sub_fem; const int nbsubdivision; // nb of subdivision for plot const bool discontinue; int const * const DFOnWhat; int const * const DFOfNode; // nu du df on Node int const * const NodeOfDF; // nu du node du df int const * const fromFE; // the df come from df of FE int const * const fromDF; // the df come from with FE int const * const fromASubFE; // avril 2006 for CL int const * const fromASubDF; // avril 2006 for CL int const * const dim_which_sub_fem; // from atomic sub FE for CL const int * ndfOn() const { return & ndfonVertex;} dataTypeOfFE(const int *nnitemdim,const int dfon[4],int NN,int nbsubdivisionn,int nb_sub_femm=1,bool discon=true); // pour evite un template // nitemdim : nbitem : si d==2 3,3,1,0 , si d=3: 4,6,4,1 , si d==1 = 2,1,0,0 // dfon : nombre de df par item // NN dataTypeOfFE(const int nitemdim[4],const KN< dataTypeOfFE const *> & tef); virtual ~dataTypeOfFE(){ if(dataalloc) delete [] dataalloc;} }; template class InterpolationMatrix { public: const int N,np,ncoef; bool invariant; int k; KN P; KN coef; KN comp; KN p; KN dofe; template InterpolationMatrix(const GFESpace &Vh); template InterpolationMatrix(const GTypeOfFE & tef); template void set(const GFElement & FK); private: // copie interdit ... InterpolationMatrix(const InterpolationMatrix &); void operator=(const InterpolationMatrix &); }; template ostream & operator<<(ostream& f,const InterpolationMatrix &M) { f<< M.N << " "<< M.k << " "<< M.np << " "<< M.ncoef << endl; f<< " = " << M.P ; f << "coef=" <& U,const KN_& Viso,int j=0,float *colors=0,int nbcolors=0,bool hsv=true,bool drawborder=true) const ; // Draw iso line void Drawfill(const KN_& U,const KN_& Viso,int j=0,double rapz=1,float *colors=0,int nbcolors=0,bool hsv=true,bool drawborder=true) const ; // Draw iso line void Draw(const KN_& U,const KN_ & Viso, R coef,int j0=0,int j1=1,float *colors=0,int nbcolors=0,bool hsv=true,bool drawborder=true) const ; // Arrow void Draw(const KN_& U,const KN_& V,const KN_ & Viso, R coef,int iu=0,int iv=0,float *colors=0,int nbcolors=0,bool hsv=true,bool drawborder=true) const ; // Arrow Rd MinMax(const KN_& U,const KN_& V,int j0,int j1,bool bb=true) const ; Rd MinMax(const KN_& U,int j0, bool bb=true) const ; // void destroy() {RefCounter::destroy();} */ bool isFEMesh() const { return ! NodesOfElement && ( N==1) ;} // to make optim template KN newSaveDraw(const KN_ & U,int composante,int & lg,KN &Psub,KN &Ksub,int op_U=0) const ; private: // for gibbs int gibbsv (long* ptvoi,long* vois,long* lvois,long* w,long* v); }; template inline GbaseFElement::GbaseFElement( const GFESpace &aVh, int k) : Vh(aVh),T(Vh.Th[k]),tfe(aVh.TFE[k]),N(aVh.N),number(k){} template inline GbaseFElement::GbaseFElement(const GbaseFElement & K, const GTypeOfFE & atfe) : Vh(K.Vh),T(K.T),tfe(&atfe),N(Vh.N),number(K.number){} template GFElement::GFElement(const GFESpace * VVh,int k) : GbaseFElement(*VVh,k) , p(this->Vh.PtrFirstNodeOfElement(k)), nb(this->Vh.NbOfNodesInElement(k)) {} template inline int GFElement::operator[](int i) const { return p ? p[i] : ((&this->T[i])-this->Vh.Th.vertices);} template inline int GFElement::operator()(int i,int df) const { return this->Vh.FirstDFOfNode(p ? p[i] : ((&this->T[i])-this->Vh.Th.vertices)) + df;} template inline int GFElement::NbDoF(int i) const { int node =p ? p[i] : ((&this->T[i])-this->Vh.Th.vertices); return this->Vh.LastDFOfNode(node)-this->Vh.FirstDFOfNode(node);} template inline void GFElement::BF(const Rd & P,RNMK_ & val) const { this->tfe->FB(Fop_D0|Fop_D1,this->Vh.Th,this->T,P,val);} template inline void GFElement::BF(const What_d whatd,const Rd & P,RNMK_ & val) const { this->tfe->FB(whatd,this->Vh.Th,this->T,P,val);} //template // inline void GFElement::set(InterpolationMatrix &M) const { this->tfe->set(this->Vh.Th,this->T,&M);} template inline R GFElement::operator()(const Rd & PHat, const KN_ & u,int i,int op) const { return (*this->tfe)(*this,PHat,u,i,op); } template inline complex GFElement::operator()(const RdHat & PHat,const KN_ > & u,int i,int op) const { complex * pu=u; // pointeur du tableau double *pr = static_cast(static_cast(pu)); const KN_ ur(pr,u.n,u.step*2); const KN_ ui(pr+1,u.n,u.step*2); return complex((*this->tfe)(*this,PHat,ur,i,op),(*this->tfe)(*this,PHat,ui,i,op)); } template R GTypeOfFE::operator()(const GFElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const { R v[10000],vf[500]; ffassert(N*last_operatortype*NbDoF<=10000 && NbDoF <500 ); KNMK_ fb(v,NbDoF,N,last_operatortype); // the value for basic fonction KN_ fk(vf,NbDoF); for (int i=0;i class GTypeOfFESum: public GTypeOfFE { public: typedef GFElement FElement; typedef typename Mesh::Element Element; typedef typename Element::RdHat RdHat; typedef typename Mesh::Rd Rd; const int k; KN *> teb; KN NN,DF,comp,numPtInterpolation; GTypeOfFESum(const KN< GTypeOfFE const *> & t); GTypeOfFESum(const GFESpace **,int kk); GTypeOfFESum(const GFESpace &,int kk); void Build(); // the true constructor void init(InterpolationMatrix & M,FElement * pK=0,int odf=0,int ocomp=0,int *pp=0) const; void set(const Mesh & Th,const Element & K,InterpolationMatrix & M,int ocoef,int odf,int *nump ) const; // no change by deflaut void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, KNMK_ & val) const ; ~GTypeOfFESum(){} } ; template void GTypeOfFESum::FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, KNMK_ & val) const { val=0.0; SubArray t(val.K()); for (int i=0;iFB(whatd,Th,K,P,v); else v=val(SubArray(DF[j+1]-DF[j],DF[j]),SubArray(NN[j+1]-NN[j],NN[j]),t); } } template template InterpolationMatrix::InterpolationMatrix(const GFESpace &Vh) : N(Vh.N),np(Vh.maxNbPtforInterpolation),ncoef(Vh.maxNbcoefforInterpolation), invariant(Vh.TFE.constant() ? Vh.TFE[0]->invariantinterpolationMatrix: false), k(-1), P(np), comp(ncoef), p(ncoef), dofe(ncoef) { Vh.TFE[0]->GTypeOfFE::init(*this,0,0,0,0); } template template InterpolationMatrix::InterpolationMatrix(const GTypeOfFE & tef) : N(tef.N),np(tef.NbPtforInterpolation),ncoef(tef.NbcoefforInterpolation), invariant(tef.invariantinterpolationMatrix), k(-1), P(np), comp(ncoef), p(ncoef), dofe(ncoef) { // virtual void init(InterpolationMatrix & M,FElement * pK=0,int odf=0,int ocomp=0,int *pp=0) const tef.GTypeOfFE::init(*this,0,0,0,0); } template template void InterpolationMatrix::set(const GFElement & FK) { if(k==FK.number) return; k=FK.number; if(invariant) return; FK.set(*this); //assert(invariant); // a faire ... } typedef GTypeOfFE TypeOfFE3; typedef GTypeOfFE TypeOfFE3; typedef GFESpace FESpace3; typedef GFESpace FESpace2; typedef GFElement FElement3; typedef GFElement FElement2; typedef GFElement FElement3; typedef GbaseFElement baseFElement2; typedef GbaseFElement baseFElement3; } #endif freefem++-3.38-1/src/femlib/FQuadTree.cpp000644 000767 000024 00000057376 12167254041 020201 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // E-MAIL : Frederic.Hecht@Inria.fr // // ORIG-DATE: Dec 97 #include #include #include "error.hpp" #include #include //#include #include #include using namespace std; #include "RNM.hpp" #include "rgraph.hpp" #include "fem.hpp" using namespace Fem2D; #ifndef NEWQUADTREE // new version ---------- // ---------------------- #ifdef DRAWING void FQuadTree::PlotQuad(I2 pp,long hb) { IMoveTo(pp.x,pp.y); ILineTo(pp.x+hb,pp.y); ILineTo(pp.x+hb,pp.y+hb); ILineTo(pp.x ,pp.y+hb); ILineTo(pp.x ,pp.y); } void FQuadTree::PlotX(I2 p,long hb) { IMoveTo(p.x, p.y); ILineTo(p.x+hb/2,p.y+hb/2); IMoveTo(p.x+hb/2,p.y); ILineTo(p.x ,p.y+hb/2); } void FQuadTree::Draw() { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; I2 pp[MaxDeep]; //long ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; IntQuad hb = MaxISize; if (!root) return ; // long kkk =0; pb[0]= root; pi[0]= root->n>0 ?(int) root->n : 4 ;; pp[0].x=pp[0].y=0;//ii[0]=jj[0]=0; do{ b= pb[l]; while (pi[l]--) { if (b->n>0) // Vertex QuadTreeBox none empty { // for (int k=0;kn;k++) { DrawMark(*b->v[k],0.002); } break; } else // Pointer QuadTreeBox { int lll = pi[l]; QuadTreeBox *b0=b; if ((b=b->b[lll])) { hb >>=1 ; // div by 2 I2 ppp(pp[l],lll,hb); pb[++l]= b; pi[l]= 4; pp[l]=ppp; PlotQuad(pp[l],hb); } else { I2 ppp(pp[l],lll,hb/2); b=b0; PlotX(ppp,hb/2); } } } hb <<= 1; // mul by 2 } while (l--); } #endif Vertex * FQuadTree::NearestVertex(long xi,long yj) { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; I2 pp[ MaxDeep ]; int l=0; // level QuadTreeBox * b; IntQuad h=MaxISize,h0; IntQuad hb = MaxISize; I2 p0(0,0); I2 plus( xin) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) long hb2 = hb >> 1 ; int k = plus.Case(hb2);//(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; p0.Add(k,hb2); hb = hb2; } if ( n0 > 0) { for( int k=0;kv[k]); h0 = I2(i2,plus).norm();//NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k];} NbVerticesSearch++; } return vn; } // general case ----- pb[0]= b; pi[0]=b->n>0 ?(int) b->n : 4 ; pp[0]=p0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; I2 i2 = R2ToI2(b->v[k]); h0 = I2(i2,plus).norm();// NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k]; } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 I2 ppp(pp[l],k,hb); if ( ppp.interseg(plus,hb,h) )//(INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; pp[l]=ppp; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return vn; } Vertex * FQuadTree::ToClose(const R2 & v,R seuil,long hx,long hy) { I2 H(hx,hy); const I2 p(XtoI(v.x),YtoJ(v.y)); const R2 X(v); R seuil2 = seuil*seuil; // const Metric Mx(v.m); QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; I2 pp[ MaxDeep ]; // long ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; long h=MaxISize; long hb = MaxISize; //long i0=0,j0=0; I2 p0(0,0); // Vertex *vn=0; if (!root->n) return 0; // empty tree // general case ----- pb[0]= root; pi[0]= root->n>0 ?(int) root->n : 4 ; pp[0]=p0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; Vertex & V(*b->v[k]); I2 i2 = R2ToI2(V); if ( I2(i2,p).less(H) ) { R2 XY(X,V); R dd; if( (dd= (XY,XY) ) < seuil2 ) // LengthInterpole(Mx(XY), b->v[k]->m(XY))) < seuil ) {// cout << dd << " " << XY << " "; return &V; } } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 I2 ppp(pp[l],k,hb); if (ppp.interseg(p,hb,H)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; pp[l]=ppp; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return 0; } void FQuadTree::Add( Vertex & w) { QuadTreeBox ** pb , *b; I2 p(XtoI(w.x),YtoJ(w.y)); long l=MaxISize; pb = &root; // cout << pb << " " << &root << endl; while( (b=*pb) && (b->n<0)) { b->n--; l >>= 1; pb = &b->b[p.Case(l)]; } if (b) { if (b->n > 3 && b->v[3] == &w) return; if (b->n > 2 && b->v[2] == &w) return; if (b->n > 1 && b->v[1] == &w) return; if (b->n > 0 && b->v[0] == &w) return; } throwassert(l); while ((b= *pb) && (b->n == 4)) // the QuadTreeBox is full { Vertex *v4[4]; // copy of the QuadTreeBox vertices v4[0]= b->v[0]; v4[1]= b->v[1]; v4[2]= b->v[2]; v4[3]= b->v[3]; b->n = -b->n; // mark is pointer QuadTreeBox b->b[0]=b->b[1]=b->b[2]=b->b[3]=0; // set empty QuadTreeBox ptr l >>= 1; // div the size by 2 for (int k=0;k<4;k++) // for the 4 vertices find the sub QuadTreeBox ij { int ij; QuadTreeBox * bb = b->b[ij=R2ToI2(v4[k]).Case(l)]; if (!bb) bb=b->b[ij]=NewQuadTreeBox(); // alloc the QuadTreeBox // cout << bb << " " << k << " " << ij << endl; bb->v[bb->n++] = v4[k]; } pb = &b->b[p.Case(l)]; } if (!(b = *pb)) b=*pb= NewQuadTreeBox(); // alloc the QuadTreeBox // cout << b << " " << b->n << endl; b->v[b->n++]=&w; // we add the vertex NbVertices++; } FQuadTree::FQuadTree(Vertex * v,R2 Pmin,R2 Pmax,long nbv) : th(0), lenStorageQuadTreeBox(Max(abs(nbv),1000L)), NbQuadTreeBox(0), NbVertices(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), cMin(Pmin-(Pmax-Pmin)/2), cMax(Pmax+(Pmax-Pmin)/2), coef( MaxISize/Norme_infty(cMax-cMin)) { sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); for (long i=0;inv/8+100), th(t), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), NbQuadTreeBox(0), NbVertices(0), cMin(Pmin-(Pmax-Pmin)/2), cMax(Pmax+(Pmax-Pmin)/2), coef( MaxISize/Norme_infty(cMax-cMin)) { if (nbv == -1) nbv = t->nv; sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); // throwassert( MaxISize > MaxICoor); if (t) for (long i=0;ivertices[i]); #ifdef DRAWING1 Draw(); #endif } FQuadTree::FQuadTree(Mesh* t,long tnv,R2 Pmin,R2 Pmax,long nbv) : lenStorageQuadTreeBox(tnv/8+100), th(t), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), NbQuadTreeBox(0), NbVertices(0), cMin(Pmin-(Pmax-Pmin)/2), cMax(Pmax+(Pmax-Pmin)/2), coef( MaxISize/Norme_infty(cMax-cMin)) { if (nbv == -1) nbv = tnv; sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); // throwassert( MaxISize > MaxICoor); if (t) for (long i=0;ivertices[i]); #ifdef DRAWING1 Draw(); #endif } FQuadTree::FQuadTree() : lenStorageQuadTreeBox(100), th(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), NbQuadTreeBox(0), NbVertices(0), cMin(0,0),cMax(0,0),coef(0) { sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); } FQuadTree::StorageQuadTreeBox::StorageQuadTreeBox(long ll,StorageQuadTreeBox *nn) { len = ll; n = nn; b = new QuadTreeBox[ll]; for (int i = 0; i n) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) long hb2 = hb >> 1 ; int k = plus.Case(hb2);//(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; p0.Add(k,hb2); hb = hb2; } if ( n0 > 0) { for(int k=0;kv[k]; if (v->ninside(P)) { I2 i2 = R2ToI2(v); // try if is in the right sens -- h0 = I2(i2,plus).norm();// h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 n>0 ?(int) b->n : 4 ; pp[0]=p0; h=hb; L1: do { // walk on the tree b= pb[l]; while (pi[l]--) // loop on 4 element of the box { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { Vertex * v=b->v[k]; if (v->ninside(P) ) { NbVerticesSearch++; I2 i2 = R2ToI2(v); // if good sens when try -- h0 = I2(i2,plus).norm();// NORM(iplus,i2.x,jplus,i2.y); if (h0 b[k])) { hb >>=1 ; // div by 2 I2 ppp(pp[l],k,hb); if ( ppp.interseg(plus,hb,h) )//(INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; pp[l]=ppp; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); if (!vn && b != root ) {// cas particulier on repart du sommet on avais rien trouver b=root; hb = MaxISize; p0=I2(0,0); l=0; pb[0]= b; pi[0]= b->n>0 ?(int) b->n : 4 ; pp[0]=I2(0,0); goto L1; } return vn; } #else // nouvelle version a tester #define INTER_SEG(a,b,x,y) (((y) > (a)) && ((x) <(b))) #define ABS(i) ((i)<0 ?-(i) :(i)) #define MAX1(i,j) ((i)>(j) ?(i) :(j)) #define NORM(i1,j1,i2,j2) MAX1(ABS((i1)-(j1)),ABS((i2)-(j2))) #define IJ(i,j,l) ( ( j & l) ? (( i & l) ? 3 : 2 ) :( ( i & l)? 1 : 0 )) #define I_IJ(k,l) (( k&1) ? l : 0) #define J_IJ(k,l) (( k&2) ? l : 0) #ifdef DRAWING // old version ---- void FQuadTree::Draw() { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; long ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; IntQuad hb = MaxISize; if (!root) return ; long kkk =0; pb[0]= root; pi[0]= root->n>0 ?(int) root->n : 4 ;; ii[0]=jj[0]=0; do{ b= pb[l]; while (pi[l]--) { if (b->n>0) // Vertex QuadTreeBox none empty { // for (int k=0;kn;k++) { DrawMark(*b->v[k],0.002); } break; } else // Pointer QuadTreeBox { int lll = pi[l]; QuadTreeBox *b0=b; if ((b=b->b[lll])) { hb >>=1 ; // div by 2 long iii = ii[l]+I_IJ(lll,hb); long jjj = jj[l]+J_IJ(lll,hb); pb[++l]= b; pi[l]= 4; ii[l]= iii; jj[l]= jjj; IMoveTo(ii[l],jj[l]); ILineTo(ii[l]+hb,jj[l]); ILineTo(ii[l]+hb,jj[l]+hb); ILineTo(ii[l] ,jj[l]+hb); ILineTo(ii[l] ,jj[l]); } else { long iii = ii[l]+I_IJ(lll,hb/2); long jjj = jj[l]+J_IJ(lll,hb/2); b=b0; IMoveTo(iii, jjj); ILineTo(iii+hb/2,jjj+hb/2); IMoveTo(iii+hb/2,jjj); ILineTo(iii ,jjj+hb/2); } } } hb <<= 1; // mul by 2 } while (l--); } #endif Vertex * FQuadTree::NearestVertex(long xi,long yj) { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; long ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; IntQuad h=MaxISize,h0; IntQuad hb = MaxISize; long i0=0,j0=0; long iplus( xin) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) long hb2 = hb >> 1 ; int k = IJ(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; i0 += I_IJ(k,hb2); // i orign of QuadTreeBox j0 += J_IJ(k,hb2); // j orign of QuadTreeBox hb = hb2; } if ( n0 > 0) { for( int k=0;kv[k]); h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k];} NbVerticesSearch++; } return vn; } // general case ----- pb[0]= b; pi[0]=b->n>0 ?(int) b->n : 4 ; ii[0]=i0; jj[0]=j0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; I2 i2 = R2ToI2(b->v[k]); h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k]; } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 long iii = ii[l]+I_IJ(k,hb); long jjj = jj[l]+J_IJ(k,hb); if (INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; ii[l]= iii; jj[l]= jjj; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return vn; } Vertex * FQuadTree::ToClose(const R2 & v,R seuil,long hx,long hy) { const long i=XtoI(v.x); const long j=YtoJ(v.y); const R2 X(v); R seuil2 = seuil*seuil; // const Metric Mx(v.m); QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; long ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; long h=MaxISize; long hb = MaxISize; long i0=0,j0=0; // Vertex *vn=0; if (!root->n) return 0; // empty tree // general case ----- pb[0]= root; pi[0]= root->n>0 ?(int) root->n : 4 ; ii[0]=i0; jj[0]=j0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; Vertex & V(*b->v[k]); I2 i2 = R2ToI2(V); if ( ABS(i-i2.x) v[k]->m(XY) < seuil ) if( (dd= (XY,XY) ) < seuil ) // LengthInterpole(Mx(XY), b->v[k]->m(XY))) < seuil ) { // cout << CurrentTh->Number(v) << "is To Close " // << CurrentTh->Number( b->v[k]) << " l=" <b[k])) { hb >>=1 ; // div by 2 long iii = ii[l]+I_IJ(k,hb); long jjj = jj[l]+J_IJ(k,hb); if (INTER_SEG(iii,iii+hb,i-hx,i+hx) && INTER_SEG(jjj,jjj+hb,j-hy,j+hy)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; ii[l]= iii; jj[l]= jjj; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return 0; } void FQuadTree::Add( Vertex & w) { QuadTreeBox ** pb , *b; long i= XtoI(w.x), j=YtoJ(w.y),l=MaxISize; pb = &root; // cout << pb << " " << &root << endl; while( (b=*pb) && (b->n<0)) { b->n--; l >>= 1; pb = &b->b[IJ(i,j,l)]; } if (b) { if (b->n > 3 && b->v[3] == &w) return; if (b->n > 2 && b->v[2] == &w) return; if (b->n > 1 && b->v[1] == &w) return; if (b->n > 0 && b->v[0] == &w) return; } throwassert(l); while ((b= *pb) && (b->n == 4)) // the QuadTreeBox is full { Vertex *v4[4]; // copy of the QuadTreeBox vertices v4[0]= b->v[0]; v4[1]= b->v[1]; v4[2]= b->v[2]; v4[3]= b->v[3]; b->n = -b->n; // mark is pointer QuadTreeBox b->b[0]=b->b[1]=b->b[2]=b->b[3]=0; // set empty QuadTreeBox ptr l >>= 1; // div the size by 2 for (int k=0;k<4;k++) // for the 4 vertices find the sub QuadTreeBox ij { int ij; QuadTreeBox * bb = b->b[ij=IJ(XtoI(v4[k]->x),YtoJ(v4[k]->y),l)]; if (!bb) bb=b->b[ij]=NewQuadTreeBox(); // alloc the QuadTreeBox // cout << bb << " " << k << " " << ij << endl; bb->v[bb->n++] = v4[k]; } pb = &b->b[IJ(i,j,l)]; } if (!(b = *pb)) b=*pb= NewQuadTreeBox(); // alloc the QuadTreeBox // cout << b << " " << b->n << endl; b->v[b->n++]=&w; // we add the vertex NbVertices++; } FQuadTree::FQuadTree(Mesh * t,R2 Pmin,R2 Pmax,long nbv) : th(t), lenStorageQuadTreeBox(t->nv/8+100), NbQuadTreeBox(0), NbVertices(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), cMin(Pmin-(Pmax-Pmin)/2), cMax(Pmax+(Pmax-Pmin)/2), coef( MaxISize/Norme_infty(cMax-cMin)) { if (nbv == -1) nbv = t->nv; sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); // throwassert( MaxISize > MaxICoor); if (t) for (long i=0;ivertices[i]); #ifdef DRAWING1 Draw(); #endif } FQuadTree::FQuadTree() : th(0), lenStorageQuadTreeBox(100), NbQuadTreeBox(0), NbVertices(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), coef(0),cMin(0,0),cMax(0,0) { sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); } FQuadTree::StorageQuadTreeBox::StorageQuadTreeBox(long ll,StorageQuadTreeBox *nn) { len = ll; n = nn; b = new QuadTreeBox[ll]; for (int i = 0; i n) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) long hb2 = hb >> 1 ; int k = IJ(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; i0 += I_IJ(k,hb2); // i orign of QuadTreeBox j0 += J_IJ(k,hb2); // j orign of QuadTreeBox hb = hb2; } if ( n0 > 0) { for(int k=0;kv[k]; if (v->ninside(P)) { I2 i2 = R2ToI2(v); // try if is in the right sens -- h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 n>0 ?(int) b->n : 4 ; ii[0]=i0; jj[0]=j0; h=hb; L1: do { // walk on the tree b= pb[l]; while (pi[l]--) // loop on 4 element of the box { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { Vertex * v=b->v[k]; if (v->ninside(P) ) { NbVerticesSearch++; I2 i2 = R2ToI2(v); // if good sens when try -- h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 b[k])) { hb >>=1 ; // div by 2 long iii = ii[l]+I_IJ(k,hb); long jjj = jj[l]+J_IJ(k,hb); if (INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; ii[l]= iii; jj[l]= jjj; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); if (!vn && b != root ) {// cas particulier on repart du sommet on avais rien trouver b=root; hb = MaxISize; i0=0; j0=0; l=0; pb[0]= b; pi[0]= b->n>0 ?(int) b->n : 4 ; ii[0]=i0; jj[0]=j0; goto L1; } return vn; } #endif freefem++-3.38-1/src/femlib/FQuadTree.hpp000644 000767 000024 00000011124 11406226635 020166 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // AUTHOR: F. Hecht, // ORG : UMPC // E-MAIL : Frederic.Hecht@Inria.fr // // ORIG-DATE: Dec 97 namespace Fem2D { const int MaxDeep = 30; typedef long IntQuad; const IntQuad MaxISize = ( 1L << MaxDeep); class Mesh; //typename Vertex; class FQuadTree { public: class I2 { public: static bool INTER_SEG1d(long a,long b,long x,long y) { return (((y) > (a)) && ((x) <(b)));} long x,y; I2() {} I2(long i,long j): x(i),y(j) {} I2(const I2 &pp,long k,long l): x(pp.x+(( k&1) ? l : 0)),y(pp.y+(( k&2) ? l : 0)) {} void Add(long k,long l) { x+= (( k&1) ? l : 0) ; y+= (( k&2) ? l : 0);} I2(const I2 &A,const I2 &B) : x(B.x-A.x),y(B.y-A.y) {} long Case(long l) const { return ( ( y & l) ? (( x & l) ? 3 : 2 ) :( ( x & l)? 1 : 0 ));} long norm() const { return Max(abs(x),abs(y));} bool less(I2 h) const { return abs(x) Vertex else => QuadTreeBox; union { QuadTreeBox *b[4]; Vertex * v[4]; }; }; // end class QuadTreeBox ///////////////// class StorageQuadTreeBox { public: QuadTreeBox *b,*bc,*be; long len; StorageQuadTreeBox *n; // next StorageQuadTreeBox StorageQuadTreeBox(long ,StorageQuadTreeBox * =0); ~StorageQuadTreeBox(); long SizeOf() const { return len*sizeof(QuadTreeBox)+sizeof(StorageQuadTreeBox)+ (n?n->SizeOf():0); } }; // end class StorageQuadTreeBox StorageQuadTreeBox * sb; long lenStorageQuadTreeBox; public: QuadTreeBox * root; Mesh *th; long NbQuadTreeBoxSearch,NbVerticesSearch; long NbQuadTreeBox,NbVertices; R2 cMin,cMax; // box of QuadTree R coef; // long XtoI(R x) { return (long) ((Max(Min(x,cMax.x),cMin.x)-cMin.x)*coef);} long YtoJ(R y) { return (long) ((Max(Min(y,cMax.y),cMin.y)-cMin.y)*coef);} R ItoX(long i){ return double(i)*coef+cMin.x ;} R ItoY(long j){ return double(j)*coef+cMin.y ;} I2 R2ToI2(const R2 &P) { return I2(XtoI(P.x),YtoJ(P.y));} I2 R2ToI2(const R2 *P) { return I2(XtoI(P->x),YtoJ(P->y));} Vertex * NearestVertex(const R2 & P) { return NearestVertex(XtoI(P.x),YtoJ(P.y));} Vertex * NearestVertexWithNormal(const R2 & P); // { return NearestVertexWithNormal(XtoI(P.x),YtoJ(P.y));} Vertex * NearestVertex(long i,long j); // Vertex * NearestVertexWithNormal(long i,long j); // new version Vertex * ToClose(const R2 & ,R ,long,long); Vertex * ToClose(const R2 & P,R delta){ long hx = (long) (coef*delta); return ToClose(P,delta,hx,hx);} long SizeOf() const {return sizeof(FQuadTree)+sb->SizeOf();} #ifdef DRAWING void IMoveTo(long i,long j) { rmoveto(float(i)/coef+cMin.x ,float(j)/coef+cMin.y );} void ILineTo(long i,long j) {rlineto(float(i)/coef+cMin.x ,float(j)/coef+cMin.y );} void Draw(); void PlotQuad(I2 pp,long hb); void PlotX(I2 pp,long hb); #endif void Add( Vertex & w); QuadTreeBox* NewQuadTreeBox() { ///cout << "NewQuadTreeBox " << sb << " " << sb->bc << " " //<< sb->be << " " <bcbe)) sb=new StorageQuadTreeBox(lenStorageQuadTreeBox,sb); throwassert(sb && (sb->bc->n == 0)); NbQuadTreeBox++; return sb->bc++; } ~FQuadTree(); FQuadTree(Mesh* t,long tnv,R2 Pmin,R2 Pmax,long nbv=-1); FQuadTree(Mesh * t,R2 Pmin,R2 Pmax,long nbv=-1); FQuadTree(Vertex * v,R2 Pmin,R2 Pmax,long nbv); FQuadTree(); friend ostream& operator <<(ostream& f, const FQuadTree & qt); }; //#undef IJ } // name space freefem++-3.38-1/src/femlib/GenericMesh.hpp000644 000767 000024 00000137217 12542250470 020547 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model of generic mesh 1d,2d,3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef GENERICMESH_HPP_ #define GENERICMESH_HPP_ // la regle de programmation 3 extern long verbosity; extern long searchMethod; //pichon #include // Add J. Morice #include "cassert" #include "assertion.hpp" #include #include #include //#include //#include #include "RefCounter.hpp" using namespace ::std; #include "Serialize.hpp" #include "GQuadTree.hpp" // definition R namespace Fem2D { #include "R3.hpp" #include "Label.hpp" #include "HashTable.hpp" inline int randwalk(int ncas) { const long long a = 314125421, b =1, m= 777777; static long xn = 19999999%m; if(ncas <=0) xn=19999999%m; long long xxn = xn; xn = a*xxn%m +1; xn %= m; return (xn*ncas)/m; } const double UnSetMesure=-1e+200; inline int maxdfon(const int *dfon){ return max(max(dfon[0],dfon[1]),max(dfon[2],dfon[3]));} // struct R {}; template struct typeRd {typedef R0 Rd;}; template<> struct typeRd<1> {typedef R1 Rd;}; template<> struct typeRd<2> {typedef R2 Rd;}; template<> struct typeRd<3> {typedef R3 Rd;}; const int NbTypeItemElement = 4; const int TypeVertex =0; const int TypeEdge =1; const int TypeFace =2; const int TypeVolume =3; // add FH ... april 2009 for peroidic Boundary Condition. // gestion of the permutation 1,2,3 // here just user order // NumPerm : number of the permutation // p permutation n= NumPerm(p) // p1 permutation inv n1 = NumPerm(p1) // p1[p[i]]=i // => n1 number of the perm / p[p1[i]] increase <=> i // SetNumPerm: set the permutation form number template inline int NumPerm(int *) {ffassert(0);} template inline int NumPerm1(int *) {ffassert(0);} // num perm inverse template<> inline int NumPerm<1>(int *) { return 0;} template<> inline int NumPerm1<1>(int *) { return 0;} template<> inline int NumPerm<2>(int *p) { return p[0] > p[1] ;} template<> inline int NumPerm1<2>(int *p) { return p[0] > p[1] ;} template<> inline int NumPerm1<3>(int *p) { // signe + depart*2 int k=0,i0=0,i1=1,i2=2,j[3]; if(p[i0]> p[i1]) swap(i0,i1),k +=1; if(p[i1]> p[i2]) swap(i1,i2),k +=1; if(p[i0]> p[i1]) swap(i0,i1),k +=1; assert(p[i0] < p[i1] && p[i1] < p[i2]); // j is inv of i1,i2,i3 j[i0]=0;j[i1]=1;j[i2]=2; return (k%2)+i0*2; // signe + depart*2 } template<> inline int NumPerm<3>(int *p) { // signe + depart*2 int k=0,i0=0,i1=1,i2=2,j[3]; if(p[i0]> p[i1]) swap(i0,i1),k +=1; if(p[i1]> p[i2]) swap(i1,i2),k +=1; if(p[i0]> p[i1]) swap(i0,i1),k +=1; assert(p[i0] < p[i1] && p[i1] < p[i2]); // j is inv of i1,i2,i3 j[i0]=0;j[i1]=1;j[i2]=2; return (k%2)+ ((j[0]+3)%3)*2; // signe + depart*2 } // build de permutation template inline void SetNumPerm(int n,int *p) { ffassert(0); }// a error} template inline void SetNumPerm1(int n,int *p) { ffassert(0); }// a error} template<> inline void SetNumPerm<1>(int ,int *p) { p[0]=0;} // a error} template<> inline void SetNumPerm<2>(int n,int *p) { p[0]=n;p[1]=1-n;} // a error} // build perm inverse template<> inline void SetNumPerm1<1>(int ,int *p) { p[0]=0;} // a error} template<> inline void SetNumPerm1<2>(int n,int *p) { p[0]=n;p[1]=1-n;} // a error} template<> inline void SetNumPerm1<3>(int n,int *p) { int i=n/2, j= n%2 ? 2:1; p[i]=0;p[(i+j)%3]=1;p[(i+j+j)%3]=2; assert( n == NumPerm1<3>(p)); } template<> inline void SetNumPerm<3>(int n,int *p) { int i=n/2, j= n%2 ? 2:1; p[0]=i;p[1]=(i+j)%3;p[2]=(i+j+j)%3; assert( n == NumPerm<3>(p)); } // --- end add periodic class DataFENodeDF { int * nbref; // pointer on common ref counter public: int ndfon[4]; const int NbOfElements; const int NbOfNodes; const int NbOfDF; const int * const NodesOfElement; const int * const FirstDfOfNodeData; const int * const FirstNodeOfElement; // 0 const int MaxNbNodePerElement; const int MaxNbDFPerElement; const int MaxNbDFPerNode; int ndfonVertex()const {return ndfon[0];} int ndfonEdge()const {return ndfon[1];} int ndfonFace()const {return ndfon[2];} int ndfonTet()const {return ndfon[3];} DataFENodeDF(const DataFENodeDF & m) : nbref( m.nbref ) , NbOfElements(m.NbOfElements), NbOfNodes(m.NbOfNodes), NbOfDF(m.NbOfDF), NodesOfElement(m.NodesOfElement), FirstDfOfNodeData(m.FirstDfOfNodeData), FirstNodeOfElement(m.FirstNodeOfElement), MaxNbNodePerElement(m.MaxNbNodePerElement), MaxNbDFPerElement(m.MaxNbDFPerElement) , MaxNbDFPerNode(maxdfon(m.ndfon)) { for(int i=0;i class GenericVertex : public Rn,public Label { template friend class GenericMesh; friend inline ostream& operator <<(ostream& f, const GenericVertex & v ) { f << (const Rn &) v << ' ' << (const Label &) v ; return f; } friend inline istream& operator >> (istream& f, GenericVertex & v ) { f >> (Rn &) v >> (Label &) v ; return f; } Rn *normal; // pointeur sur la normal exterieur pour filtre des points de departs public: typedef Rn Rd; static const int d=Rd::d; GenericVertex() : Rd(),Label(),normal(0) {}; GenericVertex(const Rd & P,int r=0): Rd(P),Label(r),normal(0){} void SetNormal(Rd *&n,const Rd & N) { if (normal) { Rd NN=*normal+N; *normal= NN/NN.norme(); } else *(normal=n++)=N;} Rd Ne() const {return normal ? *normal: Rd();} bool ninside(const Rd & P) const { return normal? (Rd(*this,P),*normal)<=0: true; } private: // pas de copie pour ne pas prendre l'adresse GenericVertex(const GenericVertex &); void operator=(const GenericVertex &); }; inline R1 ExtNormal( GenericVertex *const v[2],int const f[1]) { return f[0]==0 ? R1(-1):R1(1); } inline R2 ExtNormal( GenericVertex *const v[3],int const f[2]) { return R2(*v[f[1]],*v[f[0]]).perp(); } // correct signe N in 3d mai 2009 (FH) inline R3 ExtNormal( GenericVertex *const v[4],int const f[3]) { return R3(*v[f[0]],*v[f[2]])^R3(*v[f[0]],*v[f[1]]) ; } template class GenericElement: public Label { public: typedef typename Data::V Vertex; typedef typename Data::V::Rd Rd; typedef typename Data::RdHat RdHat;// for parametrization typedef typename Data::RdHatBord RdHatBord;// for parametrization typedef typename Rd::R R; static const int nv=Data::NbOfVertices; // nb of vertices static const int ne=Data::NbOfEdges; // nb of edges static const int nf=Data::NbOfFaces; // nb of faces static const int nt=Data::NT; // nb of tets static const int nitem=nv+ne+nf+nt; static const int nva=Data::NbOfVertexOnHyperFace; static const int nea=Data::NbOfAdjElem; static const int d=Rd::d; static const int (* const nvedge)[2] ;// static const int (* const nvface)[3] ;// static const int (* const onWhatBorder)[nitem] ;// static const int (* const nvadj)[nva] ;// static const int nitemdim[4]; // nv,ne,nf,nt // variable prive private: Vertex *vertices[nv]; // an array of 3 pointer to vertex R mes; public: GenericElement() {} const Vertex & operator[](int i) const { ASSERTION(i>=0 && i =0 && i 0); return *this; } istream & Read1(istream & f,Vertex * v0,int n) { int iv[nv],ir,err=0; for (int i=0;i> iv[i]; iv[i]--; if ( ! (iv[i]>=0 && iv[i]> ir; if(err || ! f.good() ) { cerr << " Erreur GenericElement::Read1 " << nv << " " << n << " : " ; for (int j=0;j=0 && i f[1]) fo = -fo,Exchange(f[0],f[1]); if(f[1]>f[2]) { fo = -fo,Exchange(f[1],f[2]); if(f[0]>f[1]) fo = -fo,Exchange(f[0],f[1]); } return fo; } int facePermutation(int i) const {// def the permutatution of orient the face int fo =0; const Vertex * f[3]={&at(nvface[i][0]), &at(nvface[i][1]), &at(nvface[i][2])}; if(f[0]>f[1]) fo+=1,Exchange(f[0],f[1]); if(f[1]>f[2]) { fo+=2,Exchange(f[1],f[2]); if(f[0]>f[1]) fo+=4,Exchange(f[0],f[1]); } return fo; } bool EdgeOrientation(int i) const { return &at(nvedge[i][0]) < &at(nvedge[i][1]);} R lenEdge(int i) const {ASSERTION(i>=0 && i <3); Rd E=Edge(i);return sqrt((E,E));} R mesure() const {return mes;} static int NbNodes(int c) // use the bit i of c to say if node in objet of dim i existe { int c0=(c&1)!=0, c1=(c&2)!=0, c2=(c&4)!=0, c3=(c&8)!=0; return nv*c0 +ne*c1 +nf*c2 + nt*c3 ;} static int NbNodes(const int c[4]) // use the bit i of c to say if node in objet of dim i existe { int c0=(c[0])!=0, c1=(c[1])!=0, c2=(c[2])!=0, c3=(c[3])!=0; return nv*c0 +ne*c1 +nf*c2 + nt*c3 ;} void Renum(Vertex *v0, int * r) { for (int i=0;i inline void PermI2J(const void **I,const void **J,int *S) { ffassert(0); } template<> inline void PermI2J<1>(const void **I,const void **J,int *S) { S[0]=0; } template<> inline void PermI2J<2>(const void **I,const void **J,int *S) { if(I[0]==J[0]) { assert(I[1]==J[1]); S[0]=0;S[1]=1;} else { assert(I[1]==J[0]&&I[0]==J[1]); S[0]=1;S[1]=0;} } template<> inline void PermI2J<3>(const void **I,const void **J,int *S) { if(I[0]==J[0]) S[0]=0; else if(I[0]==J[1]) S[0]=1; else {S[0]=2; assert(I[0]==J[2]) ;} if(I[1]==J[0]) S[1]=0; else if(I[1]==J[1]) S[1]=1; else {S[1]=2; assert(I[1]==J[2]) ; } S[2]=3-S[0]-S[1]; assert(I[2]==J[3-S[0]-S[1]]); } template class GenericMesh : public RefCounter { public: typedef GenericMesh GMesh; typedef T Element; typedef typename V::Rd Rd; typedef typename Rd::R R; typedef V Vertex; typedef B BorderElement; typedef EF23::GTree GTree; typedef typename Element::RdHat RdHat;// for parametrization int nt,nv,nbe; R mes,mesb; //private: V *vertices; T *elements; B *borderelements; Rd * bnormalv; // boundary vertex normal Rd Pmin,Pmax; // // the bound of the domain see BuildBound static const int nea=T::nea; // numbering of adj (4 in Tet, 3 in Tria, 2 in seg) static const int nva=T::nva; // numbering of vertex in Adj element static int kfind,kthrough; // number of search and number of throught element. int *TheAdjacencesLink; // to store the adj link k*nea+i -> k'*nea+i' int *BoundaryElementHeadLink; // int *ElementConteningVertex; GTree *gtree; public: int nbElmts() const {return nt;} int nbBrdElmts() const {return nbe;} int nbVertices() const {return nv;} const T & operator[](int i) const {return elements[CheckT(i)];} const V& operator()(int i) const {return vertices[CheckV(i)];} const B& be(int i) const {return borderelements[CheckBE(i)];} void BoundingBox(Rd &pmin,Rd &pmax) const {pmin=Pmin;pmax=Pmax;} T & t(int i) {return elements[CheckT(i)];} V & v(int i) {return vertices[CheckV(i)];} B & be(int i) {return borderelements[CheckBE(i)];} GenericMesh() : nt(0),nv(0),nbe(0), mes(0.),mesb(0.) , vertices(0),elements(0),borderelements(0),bnormalv(0), TheAdjacencesLink(0),BoundaryElementHeadLink(0), ElementConteningVertex(0), gtree(0) {} GenericMesh(const Serialize &serialized) ; void set(int mv,int mt,int mbe) { assert(nt==0 && nv==0 && nbe ==0); nt=mt; nv=mv; nbe=mbe; vertices=new V[nv]; elements= new T[nt]; borderelements = new B[nbe]; assert( nt >=0 && elements); assert( nv >0 && vertices); } int operator()(const T & tt) const {return CheckT(&tt - elements);} int operator()(const T * tt) const {return CheckT(tt - elements);} int operator()(const V & vv) const {return CheckV(&vv - vertices);} int operator()(const V * vv) const{return CheckV(vv - vertices);} int operator()(const B & k) const {return CheckBE(&k - borderelements);} int operator()(const B * k) const{return CheckBE(k - borderelements);} int operator()(int it,int j) const {return operator()(elements[it][j]);}// Nu vertex j of triangle it int be(int it,int j) const {return operator()(borderelements[it][j]);}// Nu vertex j of triangle it int CheckV(int i) const { ASSERTION(i>=0 && i < nv); return i;} int CheckT(int i) const { ASSERTION(i>=0 && i < nt); return i;} int CheckBE(int i) const { ASSERTION(i>=0 && i < nbe); return i;} int Contening(const Vertex * vv) const{ return ElementConteningVertex[ vv - vertices];} void BuildAdj(); void BuildBoundaryElementAdj(); // Add J. Morice function that give the TheAdjacencesSurfaceLink :: Version avec un manifold void BuildBoundaryElementAdj(const int &nbsurf, int* firstDefSurface, int* labelDefSurface, int* senslabelDefSurface); // version avec plusieurs varits // void BuildBoundaryElementAdj_V2(const int &nbsurf, int* firstDefSurface, int* labelDefSurface, int* senslabelDefSurface); // bug inside a retoucher void Buildbnormalv(); void BuildBound(); void BuildjElementConteningVertex(); void BuildGTree() {if(gtree==0) gtree=new GTree(vertices,Pmin,Pmax,nv);} DataFENodeDF BuildDFNumbering(int dfon[NbTypeItemElement],int nbequibe=0,int *equibe=0) const ; DataFENodeDF BuildDFNumbering(int ndfv,int ndfe,int ndff,int ndft,int nbequibe=0,int *equibe=0) const { int dfon[NbTypeItemElement]={ndfv,ndfe,ndff,ndft}; return BuildDFNumbering(dfon,nbequibe,equibe); } int ElementAdj(int k,int &j) const { int p=TheAdjacencesLink[nea*k+j]; if(p>=0) j=p%nea; return p>=0 ? p/nea: -1-j;}// modif FH. to change the code of copule k,kadj on border element.. // correct bug of 23/05/2013 : 1 dof on RT0 3d... int ElementAdj(int k,int &j,Rd& PHat) const { // return the kk the number of adj element k to hyperface j (opposite to vertex j) // out j: is the new hyperface number in element kk. // and // in : Pt is the point on hyperface j on element k on ref element K hat. // remark lb[j]==0 at enter // you get the new point Pt (in on hyperface j on element kk // and lb[j] ==0 at return (j have change). int p=TheAdjacencesLink[nea*k+j]; if(p>=0) { R lb[Rd::d+1];//{1.-PHat.sum(),PHat}; R lbb[Rd::d+1];//{1.-PHat.sum(),PHat}; PHat.toBary(lb); // R1 R2 R3 if(Abs(lb[j])>1e-10) assert(Abs(lb[j])<1e-10); int sigma[T::nva]; const void * nvkj[T::nva], *nvkkjj[T::nva]; int jj=p%nea; int kk=p/nea; Element & K(elements[CheckT(k)]); Element & KK(elements[CheckT(kk)]); Rd Pin=K(PHat); for (int l=0;l(nvkj,nvkkjj,sigma); for (int l=0;l 1e-10 ) { for (int l=0;l<=T::nva;++l) cout << lbb[l] <<" < -- " << lb[l] << endl; for (int l=0;l " << PHat << " jj = " << jj << endl; assert(0); } #endif j=jj; return kk; } return -1;// on border } int GetAllElementAdj(int it,int *tabk) const { // get the tab of all adj element (max ne) // and return the size of the tab int i=0; for(int j=0;j=0 && tabk[i]!=it) i++; } return i; } int BoundaryElement(int bbe,int & ItemInK) const { int i= BoundaryElementHeadLink[bbe]; ItemInK = i%nea; return i/nea;} // Add J. Morice template SortArray itemadjs(const int (* const nu )[N],int k,int i, int *sens) { int nnv[N]; B & K(borderelements[CheckBE(k)]); ASSERTION(i>=0 && i nnv[1] ) *sens = 1; else *sens =-1; return SortArray(nnv); } SortArray items(int k,int i,int *sens) { return itemadjs(B::nvadj,k,i,sens); } template SortArray iteme(const int (* const nu )[N],int k,int i) { int nnv[N]; Element & K(elements[CheckT(k)]); ASSERTION(i>=0 && i (nnv); } SortArray itemadj(int k,int i) { return iteme(T::nvadj,k,i); } SortArray itembe(int k) { int nnv[B::nv]; B & K(borderelements[CheckBE(k)]); for (int j=0;j(nnv); } // const Element * Find(const Rd & P) const ; const Element * Find(Rd P, RdHat & Phat,bool & outside,const Element * tstart=0) const {return EF23::Find(*this,this->gtree,P,Phat,outside,tstart);} R mesure(){ return mes;} R bordermesure(){ return mesb;} virtual ~GenericMesh() { //cout << "~GenericMesh\n"; delete [] ElementConteningVertex; delete [] TheAdjacencesLink; delete [] BoundaryElementHeadLink; delete [] borderelements; if(nt>0) delete [] elements; delete [] vertices; delete [] bnormalv; if(gtree) delete gtree; ElementConteningVertex=0; TheAdjacencesLink=0; BoundaryElementHeadLink=0; borderelements=0; elements=0; vertices=0; bnormalv=0; gtree=0; nt=(0); nv=(0); nbe=(0); mes=(0.); mesb=(0.); } Serialize serialize() const; private: GenericMesh(const GenericMesh &); // pas de construction par copie void operator=(const GenericMesh &);// pas affectation par copy }; template void GenericMesh::BuildjElementConteningVertex() { const int nkv= T::nv; int lerr[10]; if(!ElementConteningVertex) ElementConteningVertex = new int[nv]; for(int i=0;i void GenericMesh::BuildAdj() { // const int nva = T::nva; // const int nea = T::nea; if(TheAdjacencesLink!=0) return ;// already build ... TheAdjacencesLink = new int[nea*nt]; BoundaryElementHeadLink = new int[nbe]; HashTable,int> h(nea*nt,nv); int nk=0,nba=0; int err=0; if(verbosity>5) cout << " -- BuildAdj:nva=// nea=" << nva << " " << nea << " "<< nbe << endl; for (int k=0;k a(itemadj(k,i)); //cout << " ### " << " item(k,i)= " << itemadj(k,i) << " a= " << a << " k " << k << " i " << i << endl; typename HashTable,int>::iterator p= h.find(a); if(!p) { h.add(a,nk); TheAdjacencesLink[nk]=-1; nba++; } else { ASSERTION(p->v>=0); TheAdjacencesLink[nk]=p->v; TheAdjacencesLink[p->v]=nk; p->v=-1-nk; nba--; } ++nk; } for (int k=0;k a(itembe(k)); typename HashTable,int>::iterator p= h.find(a); //cout << k << " ### " << " item(k,i)= " << itembe(k) << " a= " << a << endl; if(!p) { err++; if(err==1) cerr << "Err Border element not in mesh \n"; if (err<10) cerr << " \t " << k << " " << a << endl; } else { BoundaryElementHeadLink[k] = p->v <0 ? -p->v-1 : p->v; #ifndef NDEBUG int tt=BoundaryElementHeadLink[k]/nea; int ee=BoundaryElementHeadLink[k]%nea; //cout << k << " ### " << a << " = " << itemadj(t,e) << " t " << t << " e " << e << endl; assert(itemadj(tt,ee)==a); #endif } } assert(err==0); int na= h.n; if(verbosity>1) { cout << " -- BuildAdj: nb Elememt " << nt << " nb vertices " << nv << endl; cout << " : nb adj = "<< na << " on border " << nba << " nea = " << nea << " nva = " << nva ; if(nea==2) cout << " Const d'Euler: " << nt - na + nv << endl; else cout << endl; } } /* template void GenericMesh::BuildSurface(const int &nb, KN SurfaceDef) { int nbsurf; nbsurf = nb; KN surfa } */ template void GenericMesh::BuildBoundaryElementAdj() { // Return in TheBorderElementAjacencesLink // if exist a link :: sign(nk_link)*(nk_link+1) // else :: sign(nk)*(nk) // assert(TheBoundaryElementAdjacencesLink==0); plus tard int *TheBoundaryElementAdjacencesLink = new int[B::nea*nbe]; HashTable,int> h(B::nea*nbe,nv); int nk=0; int err=0; int sens; cout << "nea/nva" << B::nea << " " << B::nva << endl; for (int k=0;k a(items(k,i,&sens)); typename HashTable,int>::iterator p= h.find(a); if(!p) { h.add(a,nk); TheBoundaryElementAdjacencesLink[nk] = sens*(nk+1) ; // sens; } else { ASSERTION(p->v>=0); if( sens*TheBoundaryElementAdjacencesLink[p->v] > 0 ){ B & K(borderelements[CheckBE(k)]); int firstVertex = operator()(K[B::nvadj[i][0]])+1; int secondVertex = operator()(K[B::nvadj[i][1]])+1; cout << " The edges defined by vertex is " << firstVertex << "-" << secondVertex << ", is oriented in the same direction in element " << k+1 << " and in element "<< 1+(p->v/B::nea) << endl; err++; assert(err==0); } if( abs(TheBoundaryElementAdjacencesLink[p->v]) != 1+p->v ){ B & K(borderelements[CheckBE(k)]); int firstVertex = operator()(K[B::nvadj[i][0]])+1; int secondVertex = operator()(K[B::nvadj[i][1]])+1; cout << " The edges defined by vertex is " << firstVertex << "-" << secondVertex << "belong to the three border elements ::" << 1+(p->v)/B::nea <<", "<< k+1 <<" and "<< 1+(abs(TheBoundaryElementAdjacencesLink[p->v])-1)/B::nea << endl; cout << " The Surface contains these edges is not a manifold" << endl; err++; } TheBoundaryElementAdjacencesLink[nk]= TheBoundaryElementAdjacencesLink[p->v]; TheBoundaryElementAdjacencesLink[p->v]= sens*(nk+1); } if( err > 10 ) exit(1); nk++; } assert(err==0); delete [ ] TheBoundaryElementAdjacencesLink; if(verbosity) cout << "number of adjacents edges " << nk << endl; } template void GenericMesh::BuildBoundaryElementAdj(const int &nbsurf, int* firstDefSurface, int* labelDefSurface, int* senslabelDefSurface) { // Return in TheBoundaryElementAdjacences // if exist a link :: sign(nk_link)*(nk_link+1) // else :: sign(nk)*(nk) for(int isurf=0; isurf < nbsurf; isurf++){ //###################################### // Trop operations if ===> a changer int nbe_surf=0; // number in the surface for(int k=0; k,int> h(B::nea*nbe_surf,nv); int nk=0; int err=0; int sens; cout << "nea/nva" << B::nea << " " << B::nva << endl; for (int k=0;k a(items( surf_be[k],i,&sens)); sens=sens*orientation_surf_be[k]; typename HashTable,int>::iterator p= h.find(a); if(!p) { h.add(a,nk); TheBoundaryElementAdjacencesLink[nk]=sens*(nk+1); // nk est un nombre locale depend de la surfaces choisie // element du bord est donne par :: surf_be[nk/3]; // arrete corespondante locale de l'element :: nk%3; } else { ASSERTION(p->v>=0); if( sens*TheBoundaryElementAdjacencesLink[p->v] > 0 ){ B & K(borderelements[CheckBE(surf_be[k])]); int firstVertex = operator()(K[B::nvadj[i][0]])+1; int secondVertex = operator()(K[B::nvadj[i][1]])+1; cout << " The edges, defined by vertex is " << firstVertex << "-" << secondVertex << ", is oriented in the same direction in element " << surf_be[k]+1 << " and in element "<< 1+surf_be[(p->v/B::nea)] << endl; err++; } if( abs(TheBoundaryElementAdjacencesLink[p->v]) != 1+p->v ){ B & K(borderelements[CheckBE(k)]); int firstVertex = operator()(K[B::nvadj[i][0]])+1; int secondVertex = operator()(K[B::nvadj[i][1]])+1; cout << " The edges defined by vertex is " << firstVertex << "-" << secondVertex << "belong to the three border elements ::" << 1+surf_be[(p->v)/B::nea] <<", "<< surf_be[k]+1 <<" and "<< 1+surf_be[(abs(TheBoundaryElementAdjacencesLink[p->v])-1)/B::nea] << endl; cout << " The "<< isurf+1 << " Surface contains these edges is not a manifold" << endl; err++; assert(err==0); } TheBoundaryElementAdjacencesLink[nk] = TheBoundaryElementAdjacencesLink[p->v];; TheBoundaryElementAdjacencesLink[p->v] = sens*(nk+1); } if( err > 10 ) exit(1); nk++; } assert(err==0); delete [] surf_be; delete [] orientation_surf_be; delete [ ] TheBoundaryElementAdjacencesLink; if(verbosity) cout << "number of adjacents edges " << nk << endl; } } // template // void GenericMesh::BuildBoundaryElementAdj_V2(const int &nbsurf,int *firstDefSurface, int *labelDefSurface, int *senslabelDefSurface) // { // // assert(firstDefSurface.N() == nbsurf+1); // // assert(labelDefSurface.N() == firstDefSurface[nbsurf]); // // assert(senslabelDefSurface.N() == firstDefSurface[nbsurf]); // // determination des labels des surfaces // map maplabel; // int numero_label=0; // for(int ii=0; ii< firstDefSurface[nbsurf]; ii++){ // map::const_iterator imap=maplabel.find( abs(labelDefSurface[ii]) ); // //cout << "K.lab= " << K.lab << endl; // if(imap == maplabel.end()){ // maplabel[ abs(labelDefSurface[ii]) ] = numero_label; // numero_label = numero_label+1; // } // } // int *nbe_label=new int[numero_label]; // for(int ii=0; ii< numero_label; ii++) nbe_label[ii] = 0; // for(int k=0; k::const_iterator imap=maplabel.find( K.lab ); // // if(imap == maplabel.end()){ // // printf("The label %d given for Definition of different surface is not in the border element mesh\n",K.lab); // // exit(1); // // } // // else{ // nbe_label[(*imap).second]++; // // } // } // int all_nbe_label=0; // for(int k=0; k::const_iterator imap=maplabel.find( K.lab ); // assert(imap != maplabel.end()); // organisation_be_label[ debut_nbe_label[(*imap).second] + count_nbe_label[(*imap).second] ] = k ; // count_nbe_label[(*imap).second ]++; // } // for(int ii=0; ii< numero_label; ii++) // assert( count_nbe_label[ii] == nbe_label[ii] ); // delete [] count_nbe_label; // for(int isurf=0; isurf < nbsurf; isurf++){ // int nbe_surf=0; // number in the surface // for( int iii=firstDefSurface[isurf]; iii< firstDefSurface[isurf+1];iii++ ){ // map::const_iterator imap=maplabel.find( abs(labelDefSurface[iii]) ); // nbe_surf=nbe_surf+nbe_label[ (*imap).second ]; // } // // assert(TheBoundaryElementAdjacencesLink==0); plus tard // int *TheBoundaryElementAdjacencesLink = new int[B::nea*nbe_surf]; // HashTable,int> h(B::nea*nbe_surf,nv); // int nk=0; // int err=0; // int sens; // int count_sbe; // int *surf_be = new int[nbe_surf]; // count_sbe=0; // for( int iii=firstDefSurface[isurf]; iii< firstDefSurface[isurf+1];iii++ ){ // map::const_iterator imap=maplabel.find( abs(labelDefSurface[iii]) ); // for( int jjj= debut_nbe_label[(*imap).second]; jjj < debut_nbe_label[(*imap).second+1]; jjj++ ){ // int k=organisation_be_label[jjj]; // surf_be[count_sbe] = k; // count_sbe++; // for (int i=0;i a(items( k,i,&sens)); // sens=sens*senslabelDefSurface[iii]; // typename HashTable,int>::iterator p= h.find(a); // if(!p) // { // h.add(a,nk); // TheBoundaryElementAdjacencesLink[nk] = sens*(nk+1); // } // else // { // ASSERTION(p->v>=0); // if( sens*TheBoundaryElementAdjacencesLink[p->v] > 0){ // B & K(borderelements[CheckBE(k)]); // int firstVertex = operator()(K[B::nvadj[i][0]])+1; // int secondVertex = operator()(K[B::nvadj[i][1]])+1; // cout << " The edges, defined by vertex is " << firstVertex << "-" << secondVertex << ", is oriented in the same direction in element " << k+1 << // " and in element "<< 1+surf_be[(p->v/B::nea)] << endl; // err++; // } // if( abs(TheBoundaryElementAdjacencesLink[p->v]) != 1+p->v ){ // B & K(borderelements[CheckBE(k)]); // int firstVertex = operator()(K[B::nvadj[i][0]])+1; // int secondVertex = operator()(K[B::nvadj[i][1]])+1; // cout << " The edges defined by vertex is " << firstVertex << "-" << secondVertex << "belong to the three border elements ::" // << 1+surf_be[(p->v)/B::nea] <<", "<< surf_be[k]+1 <<" and "<< 1+surf_be[(abs(TheBoundaryElementAdjacencesLink[p->v])-1)/B::nea] << endl; // cout << " The "<< isurf+1 << " Surface contains these edges is not a manifold" << endl; // err++; // assert(err==0); // } // TheBoundaryElementAdjacencesLink[nk]=TheBoundaryElementAdjacencesLink[p->v]; // TheBoundaryElementAdjacencesLink[p->v]=sens*(nk+1); // } // if( err > 10 ) // exit(1); // nk++; // } // } // } // assert(err==0); // delete [ ] TheBoundaryElementAdjacencesLink; // delete [ ] surf_be; // if(verbosity) cout << "number of adjacents edges " << nk << endl; // } // delete [] organisation_be_label; // delete [] debut_nbe_label; // delete [] nbe_label; // } template DataFENodeDF GenericMesh::BuildDFNumbering(int ndfon[NbTypeItemElement],int nbequibe,int *equibe) const { /* nbequibe nb of borderelement with equi boundary condition for i =0, 2*nbequibe, i+= 2) be0= equibe[i]/8 <=> be1=equibe[i+1] /8 equibe[i]%8 given the permuation p0 compare to sort array. equibe[i+1]%8 given the permuation p1 compare to sort array. the numbering of perumation SetNumPerm(p0,equibe[i+1]%8); SetNumPerm(p1,equibe[i+1]%8); so a level of point with always have: be0[p0[j]] <==> be1[p1[j]] */ const GenericMesh & Th(*this); int nnodeK = T::NbNodes(ndfon); int *p = 0, *pp=0; unsigned int tinfty=std::numeric_limits::max() ; const int nkv= T::nv; const int nkf= T::nf; const int nke= T::ne; const int nkt= T::nt; const int nbev= B::nv; const int nbef= B::nf; const int nbee= B::ne; const int nk[]={nkv,nke,nkf,nkt}; int MaxNbNodePerElement=0; int MaxNbDFPerElement=0; int nbNodes=0; int NbOfDF=0; int n=0; int minndf=100000000; int maxndf=0; int nbnzero=0; for (int dd=0;dd0); const int nkeys=4+6+4+1; assert(nnodeK<= nkeys); if(nodearevertices) { nbNodes=nv; NbOfDF=nbNodes*ndfon[0]; } else { p = new int[nnodeK*nt]; typedef SortArray Key; Key keys[nkeys*2]; int keysdim[nkeys*2]; int of = Th.nv+10;// Modif FH 28/05/2013 int ndim[NbTypeItemElement]={0,0,0,0}; NbOfDF=0; { HashTable h(nnodeK*nt,of+nt); int nbmaxeq = 1+nnodeK*nbequibe; int nbhasheq = nbequibe ? of+nt : 1; HashTable equi(nbmaxeq,nbhasheq); // constuction of item translation for if(verbosity>2) cout << " nb equi be : " << nbequibe << endl; for(int ieq=0,keq=0;keq(pe1,p1); SetNumPerm(pe2,p2); int m=0; for(int i=0;i100) cout << be1<< " " << be2 << " " << v1[i] << " <--> " << v2[i] << " / " << Th(v1[i]) << " <=> " << Th(v2[i]) << endl; } if( ndfon[1] ) for(int i=0;i::iterator pe = if(keys[i0]< keys[i1] ) // not equal ... Add nov. 2014 equi.add(keys[i0],keys[i1]); // if(pe) assert(pe->k == keys[i0]); } } // to find the final equivalent key ... // in change of chaibe of equi key for (int it=0,change=1;change;it++) { change=0; ffassert(it++<100); for (typename HashTable::iterator qe,pe=equi.begin() ; pe != equi.end(); ++pe) { if( verbosity>9999) cout << pe->k << " " << pe->v << endl; ffassert( pe->k < pe->v); qe=equi.find(pe->v); if(qe) { if( verbosity>9999) cout << pe->k << " " << pe->v << " <=> " << qe->k <k < qe->v); pe->v = qe->v; } } if(verbosity>5) cout << " -- BuildDF: iteration in final equivalent " << it << " nb change " << change << endl; } // construction of nodes numbering // ------------ for(int k=0;k::iterator pe= equi.find(ki); if(pe) { ki= pe->v; } typename HashTable::iterator pk= h.find(ki); if(!pk) { pk = h.add(ki,nbNodes++); NbOfDF += ndfon[keysdim[i]]; } if(verbosity>100 && pe ) cout << kio << " -> " << pe->k << " :: " << pk->v << endl; p[n++] = pk->v; ndim[keysdim[i]]++; } } } if(verbosity) { cout << " -- Build Nodes/DF on mesh : n.v. " << nv << ", n. elmt. " << nt << ", n b. elmt. " < void GenericMesh::Buildbnormalv() { const int nkv= T::nv; // const int nkf= T::nf; // const int nke= T::ne; // const int nkt= T::nt; if (bnormalv) {return;} int nb=0; for (int k=0;k2) cout << " number of real boundary " << nb << endl; bnormalv= new Rd[nb]; Rd *n=bnormalv; for (int k=0;k Serialize GenericMesh::serialize() const { const int nve = T::nv; const int nvbe = B::nv; const int d = Rd::d; long long l=0; l += sizeof(long long); l += 6*sizeof(int); l += nt*(sizeof(int)*(nve + 1)); l += nv*( sizeof(int) + sizeof(double)*d); l += nbe*(sizeof(int)*(nvbe+1)); if(verbosity>1) cout << "Serialize gmesh " << l << " " << nve << " " << nvbe << endl; Serialize serialized(l,GenericMesh_magicmesh); // cout << l << magicmesh << endl; size_t pp=0; serialized.put(pp, l); serialized.put( pp,d); serialized.put( pp,nve); serialized.put( pp,nvbe); serialized.put( pp,nt); serialized.put( pp,nv); serialized.put( pp,nbe); if (verbosity>2) cout << " GenericMesh Serialized : " << l << " " << nt << " " << nv << " " << nbe << endl; for (int i=0;i GenericMesh::GenericMesh(const Serialize &serialized) : nt(0),nv(0),nbe(0), mes(0.),mesb(0.) , vertices(0),elements(0),borderelements(0),bnormalv(0), TheAdjacencesLink(0),BoundaryElementHeadLink(0), ElementConteningVertex(0), gtree(0) { const int nve = T::nv; const int nvbe = B::nv; const int d = Rd::d; int dd,nnve,nnvbe,nnt,nnv,nnbe; long long l=0; size_t pp=0; serialized.get(pp, l); serialized.get( pp,dd); serialized.get( pp,nnve); serialized.get( pp,nnvbe); serialized.get( pp,nnt); serialized.get( pp,nnv); serialized.get( pp,nnbe); ffassert(d==dd && nve == nnve && nvbe == nnvbe); set(nnv,nnt,nnbe); for (int i=0;i #include "error.hpp" #include #include #include "RNM.hpp" #include "rgraph.hpp" #include "fem.hpp" using namespace Fem2D; #include "FESpacen.hpp" #include "FESpace.hpp" #define mmax(a,b)(a>b?a:b) #define mmin(a,b)(a= ptvois[record[j] + 1] - ptvois[record[j]]) { goto L8; } record[i] = record[j]; goto L4; L8: record[i] = rec; goto L2; L999: record[1] = rec; return 0; } /* gibbs1_ */ /* Subroutine */ int gibbs2_(integer* n,integer* record,integer* criter) { static integer crit, i, j, l, r, rec; /* trie record selon les valeurs de criter(record(.)) croissantes */ /* Parameter adjustments */ --criter; --record; /* Function Body */ if (*n <= 1) { return 0; } l = *n / 2 + 1; r = *n; L2: if (l <= 1) { goto L20; } --l; rec = record[l]; crit = criter[rec]; goto L3; L20: rec = record[r]; crit = criter[rec]; record[r] = record[1]; --r; if (r == 1) { goto L999; } L3: j = l; L4: i = j; j <<= 1; if (j - r < 0) { goto L5; } else if (j == r) { goto L6; } else { goto L8; } L5: if (criter[record[j]] < criter[record[j + 1]]) { ++j; } L6: if (crit >= criter[record[j]]) { goto L8; } record[i] = record[j]; goto L4; L8: record[i] = rec; goto L2; L999: record[1] = rec; return 0; } /* gibbs2_ */ /* Subroutine */ int gibbsa_(integer* n,integer* ptvois,integer* vois,integer* r,integer* m, integer* nv,integer* nx,integer* ny,integer* nn,integer* w1,integer* w2, integer* pfold,integer* pfnew,integer* impre,integer* nfout) { /* System generated locals */ integer i__1, i__2, i__3, i__4; /* Builtin functions */ /* Local variables */ static integer nbcc, degi, bold, bnew, i, j, k, p, degre, x, y, p1, p2; /* extern Subroutine int gibbs1_();*/ static integer pf; /* extern Subroutine int gibbsb_(), gibbsd_(), gibbst_();*/ static integer nbpass, niveau, pf1, option, old, new_, opt, new1; long pfn1,pfo1,m1e9; m1e9 = 1000000000; /* ----------------------------------------------------------------------- */ /* but: calculer une renumerotation des sommets d'un graphe defini par: */ /* par la methode de gibbs */ /* ----------------------------------------------------------------------- */ /* entree */ /* -------- */ /* n = nb de sommet du graphe */ /* les voisins d'un sommet i ont pour numero : */ /* ( vois(j) , j=ptvois(i),ptvois(i+1)-1 ) */ /* impre parametre d'impression */ /* nfout numero du fichier pour impression */ /* sortie */ /* ------ */ /* r(1:n) tableau donnant la nouvelle numerotation: */ /* r(i) = nouveau numero du sommet i */ /* pfolf = ancien profile */ /* pfnew = nouveau profile */ /* tableau de travail : */ /* -------------------- */ /* m(n) */ /* nv(0:n+n) */ /* nx(n) */ /* ny(n) */ /* nn(0:n) */ /* w1(n) */ /* w2(n) */ /* ----------------------------------------------------------------------- */ /* programmeur f. hecht le 3/02/1987 */ /* ----------------------------------------------------------------------- */ /* tri des voisins d'un sommet du graphe par degre croissant */ /* --------------------------------------------------------------- */ /* Parameter adjustments */ --w2; --w1; --ny; --nx; --m; --r; --vois; --ptvois; /* Function Body */ p2 = ptvois[1] - 1; i__1 = *n; for (i = 1; i <= i__1; ++i) { p1 = p2 + 1; p2 = ptvois[i + 1] - 1; i__2 = p2 - p1 + 1; gibbs1_(&i__2, &vois[p1], &ptvois[1]); /* if(impre.le.-9) then */ /* write (nfout,*) 'les voisin de ',i,'sont: ', (vois(j),j=p1,p 2) */ /* endif */ /* L10: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { r[i] = 0; /* L20: */ } /* boucle sur les composante connexe du graphe */ new_ = 0; nbcc = 0; L30: if (new_ < *n) { ++nbcc; /* recherche d'une racine y (un sommet non numerote) de degree m ini */ y = 0; degre = *n + 1; i__1 = *n; for (i = 1; i <= i__1; ++i) { if (r[i] <= 0) { degi = ptvois[i + 1] - ptvois[i]; if (degi < degre) { degre = degi; y = i; } } /* L40: */ } if (y == 0) { return -3;/* s_stop("fatal erreur gibbs 2 : pb racine", 33L); */ } gibbsd_(&y, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); nbpass = 0; L50: ++nbpass; x = y; p = niveau; k = 0; i__1 = nv[p + 1]; for (i = nv[p] + 1; i <= i__1; ++i) { ++k; m[k] = nv[i]; /* L60: */ } gibbs1_(&k, &m[1], &ptvois[1]); i__1 = k; for (i = 1; i <= i__1; ++i) { y = m[i]; gibbsd_(&y, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); if (niveau > p) { goto L50; } /* L70: */ } y = m[1]; /* if(impre.lt.0) then */ /* write(nfout,*) */ /* + ' nb de pass pour trouver le pseudo diametre',nbpass */ /* + ,' x=',x,',y=',y,' de la composante connexe ',nbcc */ /* write (nfout,*) ('-',i=1,78) */ /* endif */ /* optimisation de la descendance de la numerotation */ /* ------------------------------------------------- */ gibbsb_(&x, &y, n, &ptvois[1], &vois[1], &nx[1], &ny[1], nv, nn, &m[1] , &w1[1], &w2[1], &r[1], impre, nfout); /* renumerotation de cuthill mac kee avec la meilleur des 4 option s */ /* -------------------------------------------------------------- --- */ pf = 1073741824; option = -2; new1 = new_; for (opt = -2; opt <= 2; ++opt) { new_ = new1; if (opt != 0) { gibbst_(n, &p, nv, nn, &ptvois[1], &vois[1], &m[1], &r[1], & new_, &opt, &pf1, impre, nfout); if (pf1 < pf) { pf = pf1; option = opt; } } /* L80: */ } /* if(impre.ne.0) write (nfout,*) ' on a choisi l''option ', */ /* + option,', new =',new */ new_ = new1; gibbst_(n, &p, nv, nn, &ptvois[1], &vois[1], &m[1], &r[1], &new_, & option, &pf1, impre, nfout); goto L30; } /* if(impre.ne.0) write(nfout,*) */ /* + ' nb de composante connexe du graphe =',nbcc */ /* calcul du profile */ *pfold = 0; *pfnew = 0; pfo1=0; pfn1=0; bnew = 0; bold = 0; i__1 = *n; for (i = 1; i <= i__1; ++i) { old = i; new_ = r[i]; i__2 = ptvois[i + 1] - 1; for (j = ptvois[i]; j <= i__2; ++j) { /* Computing MIN */ i__3 = old, i__4 = vois[j]; old = mmin(i__3,i__4); /* Computing MIN */ i__3 = new_, i__4 = r[vois[j]]; new_ = mmin(i__3,i__4); /* L100: */ } *pfold = *pfold + i - old + 1; /* Computing MAX */ i__2 = bold, i__3 = i - old + 1; bold = mmax(i__2,i__3); *pfnew = *pfnew + r[i] - new_ + 1; /* Computing MAX */ i__2 = bnew, i__3 = r[i] - new_ + 1; bnew = mmax(i__2,i__3); if(*pfold>m1e9) { pfo1+=*pfold/m1e9; *pfold = *pfold%m1e9;} if(*pfnew>m1e9) { pfn1+=*pfnew/m1e9; *pfnew = *pfnew%m1e9;} /* L110: */ } if(pfo1 || pfn1) { // change unit of pf if(pfo1==pfn1) { *pfnew= pfn1*10 + (*pfnew >= *pfold) ; *pfold= pfo1*10 + (*pfnew <= *pfold) ; } else { *pfnew= pfn1 ; *pfold= pfo1; } } /* if(impre.ne.0) then */ /* write(nfout,*)'profile old = ',pfold,', profile new = ',pfnew */ /* write(nfout,*)'1/2 bande old = ',bold ,', 1/2 band new = ',bnew */ /* endif */ return 0; } /* gibbsa_ */ /* Subroutine */ int gibbsb_(integer* x,integer* y,integer* n,integer* ptvois, integer* vois,integer* nx,integer* ny,integer* nv,integer* nn,integer* m, integer* wh,integer* wl,integer* r, integer* , integer* ) { /* System generated locals */ integer i__1, i__2; /* Local variables */ static int flag_; static integer i, j, k, p, s, h0, i1, l0, i2; /* extern Subroutine int gibbs1_(); */ static integer lg; /* extern Subroutine int gibbsd_(), gibbsc_();*/ static integer niveau, mxcanx, mxcany, nbc; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* ...................................................................... */ /* attention on met la descente optimiser dans r <0 ou nulle */ /* ....................................................................... */ /* Parameter adjustments */ --r; --m; --ny; --nx; --vois; --ptvois; /* Function Body */ gibbsd_(y, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); gibbsc_(&ny[1], nv, &niveau, n, &mxcany); gibbsd_(x, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); p = niveau; gibbsc_(&nx[1], nv, &niveau, n, &mxcanx); flag_ = ffalse; i__1 = *n; for (i = 1; i <= i__1; ++i) { if (nx[i] + ny[i] == p) { r[i] = -nx[i]; } else if (nx[i] >= 0) { flag_ = ttrue; r[i] = -1073741824; } else { if (r[i] <= 0) { r[i] = -1073741822; } } /* L20: */ } if (flag_) { /* calcul des composantes connexe du graphe sans les sommets de nn */ /* ------------------------------------------------------------ --- */ j = *n; k = 0; nbc = 0; nv[nbc] = j; L30: ++k; if (k <= *n) { if (r[k] == -1073741824) { /* recherche de la fermeture transitive partant de k */ ++nbc; i = -1; s = k; L40: ++i; wl[i] = ptvois[s]; wh[i] = ptvois[s + 1]; ++j; nv[j] = s; r[s] = -1073741823; L50: if (i >= 0) { if (wl[i] < wh[i]) { s = vois[wl[i]]; ++wl[i]; if (r[s] == -1073741824) { goto L40; } goto L50; } --i; goto L50; } nv[nbc] = j; m[nbc] = nbc; } goto L30; } /* if(impre.lt.0) write(nfout,*) */ /* + ' nb de composante connexe du graphe reduit =',nbc */ /* --------------- fin de construction des composantes connexes------ --- */ /* nv(0)=n */ /* if(impre.le.-10) write(nfout,5555)'nv(0:n+n) = ',(nv(i),i=0, n+n) */ gibbs1_(&nbc, &m[1], nv); /* if(impre.le.-10)write(nfout,5555)'trie m =',(m(i),i=1,nbc) */ i__1 = p; for (i = 0; i <= i__1; ++i) { nn[i] = 0; /* L60: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { j = -r[i]; if (j >= 0 && j <= p) { ++nn[j]; } /* L70: */ } /* boucle sur les composante connexes par ordre croissantes */ /* -------------------------------------------------------- */ for (k = nbc; k >= 1; --k) { i = m[k]; i1 = nv[i - 1] + 1; i2 = nv[i]; lg = i2 - i1 + 1; /* if(impre.le.-7) */ /* + write(nfout,*) k,' composante ',i,',lg=',lg,',i1,i2 =',i1,i2 */ /* if(impre.le.-8) */ /* + write (nfout,5555)' ',(nv(i),i=i1,i2) */ h0 = 0; l0 = 0; i__1 = p; for (j = 0; j <= i__1; ++j) { wh[j] = nn[j]; wl[j] = nn[j]; /* L90: */ } i__1 = i2; for (i = i1; i <= i__1; ++i) { s = nv[i]; ++wh[nx[s]]; ++wl[p - ny[s]]; /* L100: */ } i__1 = p; for (j = 0; j <= i__1; ++j) { if (wh[j] != nn[j]) { /* Computing MAX */ i__2 = wh[j]; h0 = mmax(i__2,h0); } if (wl[j] != nn[j]) { /* Computing MAX */ i__2 = wl[j]; l0 = mmax(i__2,l0); } /* L110: */ } if (h0 < l0 || (h0 == l0 && mxcanx <= mxcany)) { /* if(impre.le.-2) write(nfout,*) */ /* + ' h0 = ',h0,',l0 = ',l0,' ------- XXXX --------' */ i__1 = i2; for (i = i1; i <= i__1; ++i) { s = nv[i]; r[s] = -nx[s]; ++nn[-r[s]]; /* L120: */ } } else { /* if (impre.le.-2) write(nfout,*) */ /* + ' h0 = ',h0,',l0 = ',l0,' ------- YYYY --------' */ i__1 = i2; for (i = i1; i <= i__1; ++i) { s = nv[i]; r[s] = -p + ny[s]; ++nn[-r[s]]; /* L130: */ } } /* L140: */ } } /* on met les nouveaux niveaux de la descendance optimiser dans nn */ /* ----------------------------------------------------------------- */ i__1 = *n; for (i = 1; i <= i__1; ++i) { if (r[i] > 0) { nn[i] = -1; } else if (r[i] == -1073741822) { nn[i] = -2; } else { nn[i] = -r[i]; } /* L150: */ } /* if(impre.le.-10)write (nfout,5555)' nn(i)=',(nn(i),i=1,n) */ /* 5555 format(' -------- ',a,/,5(15x,10(i5)/)) */ return 0;} /* gibbsb_ */ /* Subroutine */ int gibbsc_(integer* nz,integer* nv,integer* niveau,integer* n,integer* mxz) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static integer i, j; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* Parameter adjustments */ --nz; /* Function Body */ i__1 = *n; for (i = 1; i <= i__1; ++i) { nz[i] = -1; /* L10: */ } *mxz = 0; i__1 = *niveau; for (i = 0; i <= i__1; ++i) { /* Computing MAX */ i__2 = *mxz, i__3 = nv[i + 1] - nv[i]; *mxz = mmax(i__2,i__3); i__2 = nv[i + 1]; for (j = nv[i] + 1; j <= i__2; ++j) { if(nv[j] > *n) printf(" bug in gibbsc_ ##### %ld %ld %ld %ld \n",j,nv[j],i,*niveau ); if(nv[j] <= *n) nz[nv[j]] = i; /* L20: */ } } return 0;} /* gibbsc_ */ /* Subroutine */ int gibbsd_(integer* racine,integer* n,integer* ptvois,integer* vois,integer* nv,integer* r,integer* niveau) { /* System generated locals */ integer i__1, i__2; /* Local variables */ static integer i, k, s, sv, stk, stk1, stk2, nvni=-1; /* ----------------------------------------------------------------------- */ /* but construire la structure des descendant de racine du graphe */ /* ----------------------------------------------------------------------- */ /* sortie : */ /* -------- */ /* nv est la structure des niveaux */ /* les sommets du niveau (i =0,niveau_ sont defini par : */ /* (nv(j),j=nv(i),nv(i+1)-1) */ /* le tableau r(i) n'est modifier que sur les sommets */ /* de la composante connexe du graphe contenant la racine */ /* ----------------------------------------------------------------------- */ /* on demark tout les sommets non remuneroter */ /* -------------------------------------------------- */ /* Parameter adjustments */ --r; --vois; --ptvois; /* Function Body */ i__1 = *n; for (i = 1; i <= i__1; ++i) { if (r[i] < 0) { r[i] = 0; } /* L10: */ } /* initialisation */ stk = *n ;// correct bug FH june 2011 .... nv[0] = stk; stk2 = stk; *niveau = 0; ++stk; nv[stk] = *racine; r[*racine] = -1; L20: if (stk2 < stk) { ++(*niveau); stk1 = stk2 + 1; nvni=nv[*niveau];/* save value */ nv[*niveau] = stk; stk2 = stk; /* print *,' ------- niveau =',niveau,' stk=',stk1,stk2 */ i__1 = stk2; for (k = stk1; k <= i__1; ++k) { s = nv[k]; /* print *,'----------------- s=',s */ i__2 = ptvois[s + 1] - 1; for (i = ptvois[s]; i <= i__2; ++i) { /* pour tout les sommets (sv) voisin */ /* d'un sommet (s) du niveau precedent */ sv = vois[i]; /* print *,' voisin =',sv */ /* si le sommet n'est pas marque on le marque et on l'ajout */ if (r[sv] == 0) { ++stk; nv[stk] = sv; r[sv] = -1; } /* L30: */ } /* L40: */ } goto L20; } // if(nvni>0) nv[*niveau]=nvni; --(*niveau); /* call pnv(' gibbsd ',n,nv,niveau) */ return 0;} /* gibbsd_ */ /* Subroutine */ int gibbst_(integer* n,integer* p,integer* nv,integer* nn,integer* ptvois,integer* vois,integer* m,integer* r,integer* new_,integer* option, integer* pfnew,integer* impre,integer* ) { /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; /* Local variables */ static integer nbsc, bnew, knew, step, plus, i, j, k, s, debut, i1, i2; /* extern Subroutine int gibbs2_();*/ static integer fin; /* construction de la stucture de niveau dans nv a partir de nn */ /* ------------------------------------------------------------ */ /* Parameter adjustments */ --r; --m; --vois; --ptvois; /* Function Body */ nv[0] = *n; i__1 = *p + 1; for (i = 1; i <= i__1; ++i) { nv[i] = 0; /* L150: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { if (nn[i] >= 0) { ++nv[nn[i] + 1]; } /* L160: */ } i__1 = *p; for (i = 0; i <= i__1; ++i) { nv[i + 1] += nv[i]; /* L170: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { if (nn[i] >= 0) { j = nn[i]; ++nv[j]; nv[nv[j]] = i; } /* L180: */ } for (i = *p; i >= 0; --i) { nv[i + 1] = nv[i]; /* L190: */ } nv[0] = *n; nbsc = nv[*p + 1] - nv[0]; /* --- fin de la construction ------------------------------------ */ if (*option == -2) { i__1 = *impre - 1; } i__1 = *n; for (i = 1; i <= i__1; ++i) { m[i] = *n * 3 + ptvois[i + 1] - ptvois[i]; /* L10: */ } if ((((int)*option) == 1)||(((int)*option) == -1)) { debut = 0; fin = *p; step = 1; } else { debut = *p; fin = 0; step = -1; } i__1 = fin; i__2 = step; for (i = debut; i__2 < 0 ? i >= i__1 : i <= i__1; i += i__2) { i1 = nv[i] + 1; i2 = nv[i + 1]; i__3 = i2 - i1 + 1; gibbs2_(&i__3, &nv[i1], &m[1]); i__3 = i2; for (j = i1; j <= i__3; ++j) { s = nv[j]; i__4 = ptvois[s + 1] - 1; for (k = ptvois[s]; k <= i__4; ++k) { /* Computing MIN */ i__5 = m[vois[k]]; m[vois[k]] = mmin(i__5,j); /* L20: */ } /* L30: */ } /* L40: */ } if (*option > 0) { knew = *new_; plus = 1; } else { knew = *new_ + nbsc + 1; plus = -1; } *new_ += nbsc; /* if(option.gt.0) then */ /* do 60 k = debut , fin , step */ /* do 60 j = nv(k+1),nv(k)+1,-1 */ /* knew = knew + plus */ /* r(nv(j)) = knew */ /* 60 continue */ /* else */ i__2 = fin; i__1 = step; for (k = debut; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { i__3 = nv[k + 1]; for (j = nv[k] + 1; j <= i__3; ++j) { knew += plus; r[nv[j]] = knew; /* L70: */ } } /* endif */ *pfnew = 0; bnew = 0; i__3 = *n; for (i = 1; i <= i__3; ++i) { k = r[i]; if (k > 0) { i__1 = ptvois[i + 1] - 1; for (j = ptvois[i]; j <= i__1; ++j) { if (r[vois[j]] > 0) { /* Computing MIN */ i__2 = k, i__4 = r[vois[j]]; k = mmin(i__2,i__4); } /* L100: */ } *pfnew = *pfnew + r[i] - k + 1; /* Computing MAX */ i__1 = bnew, i__2 = r[i] - k + 1; bnew = mmax(i__1,i__2); } /* L110: */ } /* if(impre.lt.0.or.impre.gt.2) then */ /* write(nfout,*) ' option =',option,', profile =',pfnew */ /* + ,', 1/2 bande =',bnew,', new=',new,', nbss composante=',nbsc */ /* endif */ return 0;} /* gibbst_ */ /* function */ int Mesh::gibbsv (integer* ptvoi, integer* vois,integer* lvois,integer* w,integer* v) { /* System generated locals */ integer i__2; /* Local variables */ integer i, j, k, T, ss, iii, ptv, ptv1; integer nbss = nv , nbt = nt; /*--- Prepare les donees pour gibbsa en construisant ptvoi, vois, lvois - ------------*/ /* in */ /* --- nbnt =3 pour des triangles 2D, */ /* nbt = nb de triangle */ /* nbss = nb de sommets */ /* nsea = numeros de 3 sommets de chaque triangle (me) */ /* out */ /* --- ptvoi, vois, lvois, err */ /* tableaux de travail w, v */ /*----------------------------------------------------------------------- ----------*/ /* Parameter adjustments */ --v; --w; --vois; --ptvoi; /* Function Body */ for (i = 1; i <= nbss; ++i) { w[i] = -1; ptvoi[i] = 0; } ptvoi[nbss + 1] = 0; for (i = 0; i < nbt; ++i) { for (j = 0; j < 3; ++j) { ss = number(triangles[i][j])+1; ++ptvoi[ss + 1]; w[ss] = 0;} } for (i = 1; i <= nbss; ++i) ptvoi[i + 1] += ptvoi[i]; for (i = 0; i < nbt; ++i) { for (j = 0; j < 3; ++j) { ss = number(triangles[i][j])+1; ++ptvoi[ss]; v[ptvoi[ss]] = i; } } ptv1 = 0; iii = 1; for (i = 1; i <= nbss; ++i) { ptv = ptv1 + 1; ptv1 = ptvoi[i]; ptvoi[i] = iii; i__2 = ptv1; for (j = ptv; j <= i__2; ++j) { T = v[j]; for (k = 0; k < 3; ++k) { ss = number(triangles[T][k])+1; /* nsea[k + T * nsea_dim1]; */ if (w[ss] != i) { w[ss] = i; if (iii > *lvois) return 2 ; /* print*,'pas assez de place memoire' */ vois[iii] = ss; ++iii;} } } } ptvoi[nbss + 1] = iii; *lvois = iii - 1; return 0; /* OK */ return 0;} /* gibbsv_ */ int Mesh::renum() /* -------- renumber vertices by gibbs method; updates triangle and edge array in: mesh out: mesh auxiliary arrays: ptvois,vois,r,m,nv,nx,ny,nn,w1,w2,f all of size nv+1 except vois (10(nv+1)) and nv (2(nv+1)) err = -1 : memory alloc pb; err = -3: fatal erreur gibbs 2 : pb racine */ { long pfold, pfnew; long* ptvois=NULL; long* vois=NULL; long* nn =NULL; long* r =NULL; long* m =NULL; long* nnv =NULL; long* nx =NULL; long* ny =NULL; long* w1 =NULL; long* w2=NULL; long nbvoisin = 10*nv; long printint=0, iodev=6; int err=0; ptvois = new long[nv+1]; //(long*)calloc((long)(nv + 1) , sizeof(long)); nn = new long[3*nt]; //(long*)calloc(3 * nt ,sizeof(long)); vois = new long[nbvoisin+10]; //(long*)calloc((long)(nbvoisin + 10) , sizeof(long)); r = new long[nv+1]; //(long*)calloc((long)(nv + 1) , sizeof(long)); if((!ptvois)||(!nn)||(!vois)||(!r)) return -1; err = gibbsv(ptvois,vois,&nbvoisin,r,nn) ; delete [] nn; // free(nn); if(err==0) { m = new long[nv+1]; nn = new long[nv+1]; nnv = new long[(nv+1)<<1]; nx = new long[nv+1]; ny = new long[nv+1]; w1 = new long[nv+1]; w2 = new long[nv+1]; long lnv = nv; err = gibbsa_ (&lnv, ptvois, vois, r, m, nnv, nx, ny, nn, w1, w2, &pfold, &pfnew, &printint, &iodev); delete [] m; delete [] nnv; delete [] nn; delete [] nx; delete [] ny; delete [] w1; delete [] w2; } delete [] vois; delete [] ptvois; if(verbosity>1) cout << " -- Mesh: Gibbs: old skyline = " << pfold << " new skyline = " << pfnew << endl; if (err == 0 && (pfnew <= pfold)) { int i,j; for ( i=0;i=0 && v < nv); BoundaryAdjacencesLink[j2]=BoundaryAdjacencesHead[v]; BoundaryAdjacencesHead[v]=j2; } } for (int it=0;itNodesOfElement==0) return -2; int nv = NbOfNodes; int nt = NbOfElements;// ;Th.nt; long pfold =0, pfnew=0; long* ptvois=NULL; long* vois=NULL; long* nn =NULL; long* r =NULL; long* m =NULL; long* nnv =NULL; long* nx =NULL; long* ny =NULL; long* w1 =NULL; long* w2=NULL; long nbvperelem = 20; // pour le P1 // cout << "gibbs: nbvperelem =" << nbvperelem << endl; long nbvoisin = (nbvperelem)*nv; long printint=0, iodev=6; int err=0; int nnx= SizeToStoreAllNodeofElement(); ptvois = new long[nv+1]; nn = new long[nnx]; vois = new long[nbvoisin+100]; r = new long[nv+1]; if((!ptvois)||(!nn)||(!vois)||(!r)) return -1; err = gibbsv(ptvois,vois,&nbvoisin,r,nn) ; delete [] nn; if(err==0) { m = new long[nv+1]; nn = new long[nv+1]; nnv = new long[(nv+1)<<1]; nx = new long[nv+1]; ny = new long[nv+1]; w1 = new long[nv+1]; w2 = new long[nv+1]; long lnv = nv; err = gibbsa_ (&lnv, ptvois, vois, r, m, nnv, nx, ny, nn, w1, w2, &pfold, &pfnew, &printint, &iodev); delete [] m; delete [] nnv; delete [] nn; delete [] nx; delete [] ny; delete [] w1; delete [] w2; } else cerr << " Not enought memory (bug)" << nbvoisin << " " << nbvoisin/NbOfElements << endl; delete [] vois; delete [] ptvois; if (err==0 && verbosity>1) cout << " FESpace:Gibbs: old skyline = " << pfold << " new skyline = " << pfnew << endl; if (err == 0 && (pfnew <= pfold)) { int i; // cout << *this << endl; for ( i=0;irenum(r,nnx); } delete [] r; return err; } /* function */ int FESpace::gibbsv (integer* ptvoi, integer* vois,integer* lvois,integer* w,integer* v) { /* System generated locals */ integer i__2; /* Local variables */ integer i, j, k, T, ss, iii, ptv, ptv1; integer nbss = NbOfNodes , nbt = NbOfElements; integer jj,kk; /*--- Prepare les donees pour gibbsa en construisant ptvoi, vois, lvois - ------------*/ /* in */ /* --- nbnt =3 pour des triangles 2D, */ /* nbt = nb de triangle */ /* nbss = nb de sommets */ /* nsea = numeros de 3 sommets de chaque triangle (me) */ /* out */ /* --- ptvoi, vois, lvois, err */ /* tableaux de travail w, v */ /*----------------------------------------------------------------------- ----------*/ /* Parameter adjustments */ --v; --w; --vois; --ptvoi; /* Function Body */ for (i = 1; i <= nbss; ++i) { w[i] = -1; ptvoi[i] = 0; } ptvoi[nbss + 1] = 0; for (i = 0; i < nbt; ++i) { for (j = 0; j < NbOfNodesInElement(i) ; ++j) { ss = (*this)(i,j) +1; ++ptvoi[ss + 1]; w[ss] = 0;} } for (i = 1; i <= nbss; ++i) ptvoi[i + 1] += ptvoi[i]; for (i = 0; i < nbt; ++i) { for (j = 0,jj= NbOfNodesInElement(i); j 0 && ss <= nbss)) { cout << "bug " << ss << " " << i << " " << j << endl; exit(1); } ++ptvoi[ss]; v[ptvoi[ss]] = i; } } ptv1 = 0; iii = 1; for (i = 1; i <= nbss; ++i) { ptv = ptv1 + 1; ptv1 = ptvoi[i]; ptvoi[i] = iii; i__2 = ptv1; for (j = ptv; j <= i__2; ++j) { T = v[j]; for (k = 0,kk=NbOfNodesInElement(T); k < kk; ++k) { ss = (*this)(T,k) +1;//number(triangles[T][k])+1; /* nsea[k + T * nsea_dim1]; */ if (w[ss] != i) { w[ss] = i; if (iii > *lvois) return 2 ; /* print*,'pas assez de place memoire' */ vois[iii] = ss; ++iii;} } } } ptvoi[nbss + 1] = iii; *lvois = iii - 1; return 0; /* OK */ return 0;} /* gibbsv_ */ /* message d'erreur: *err = 2; print*,'pas assez de place memoire' */ /* message d'erreur: *err = 2; print*,'pas assez de place memoire' */ freefem++-3.38-1/src/femlib/glutdraw.cpp000644 000767 000024 00000026762 11406226635 020210 0ustar00hechtstaff000000 000000 #ifdef __APPLE__ #include #else #include #endif // #include pthread_mutex_t mutex, mutexclose; #include #include #include using namespace std; #include #include "error.hpp" #include #include #include #include #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpace.hpp" #include const R pi=4*atan(1.); using namespace std; using namespace Fem2D; typedef KN Rn; class Global { // une petite classe pour stoker toutes les variables globales public: int Width , Height; // taille de l'cran en pixel R rapz; int count; vector lppTh; vector lisoTh; vector lu0; vector lu1; R theta,phi,coef_dist; // coordonne polaire de la camera R dtheta; // vitesse de rotation de la camera R xmin,xmax,ymin,ymax,zmin,zmax; // borne de la scne R xm,ym,zm; // point regarde Global(int height,int width) ; void SetView() const; // define le point de vue void DefaultView(); void MoveXView(R dx,R dx); void MakeListDraw() const ; // construit la list d'affichage void reset() { count++;} } *global ; // la variable global static int xold,yold; void * return_value=0; Global::Global(Mesh & TTh,Rn &ff,int height,int width,R rpz,int nbisovalue) : Th(TTh), f(ff) { nbiso = nbisovalue; Width= width ; Height=height; rapz=rpz; count =0; /* // first compute the mesh bound const Vertex & v0=Th(0); xmin=xmax=v0.x; ymin=ymax=v0.y; zmin = f[0], zmax=f[0]; for (int i=0;i2) { viso = new R[nbiso]; R diso=(zmax-zmin)/(nbiso-1); for (int i=0;izmin; // borne de la fonction R fmax=global->zmax; hsvToRgb(0.99*(f-fmin)/(fmax-fmin),1,1,r,g,b); glColor3f(r,g,b); } void DrawVertex(const R2 & v,R z=0,R rapz=1) { SetColor(z); // la couleur glVertex3f(v.x, v.y, z*rapz); // le sommet } void DrawIsoTfill(const R2 Pt[3],const R ff[3],const R * Viso,int NbIso, R rapz=1) { R2 PQ[10]; R z[10]; R eps= (Viso[NbIso-1]-Viso[0])*1e-6; for(int l=1;l< NbIso;l++) // loop on the level curves { R xfb = Viso[l-1]; R xfh = Viso[l]; assert(xfb < xfh); int im=0; for(int i=0;i<3;i++) // for the 3 edges { int j=(i+1)%3; R fi=(ff[i]); R fj=(ff[j]); R xxfb = xfb; R xxfh = xfh; if (fj=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)>=0.1e-20) { R xlam=(fi-xf)/(fi-fj); z[im] = ff[i] * (1.F-xlam) + ff[j]* xlam; PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } xf = xxfh; if(((fi<=xf)&&(fj>=xf))||((fi>=xf)&&(fj<=xf))) { if (Abs(fi-fj)>=0.1e-20) { R xlam=(fi-xf)/(fi-fj); z[im] = ff[i] * (1.F-xlam) + ff[j]* xlam; PQ[im++] = Pt[i] * (1.F-xlam) + Pt[j]* xlam; } } if ( xfb-eps <=fj && fj <= xfh+eps) z[im]=ff[j],PQ[im++] = Pt[j]; } if (im>2) { glBegin(GL_POLYGON); SetColor((xfb+xfh)/2); for (int i=0;iWidth = width; global->Height = height; global->SetView(); glutPostRedisplay(); } static void Key( unsigned char key, int x, int y ) { switch (key) { case 27: // esc char pthread_mutex_unlock(&mutexclose); pthread_exit(&return_value); break; case '+': global->coef_dist /= 1.2; break; case '-': global->coef_dist *= 1.2; break; case 'g': global->theta += pi/180.; break; case 'd': global->theta -= pi/180.; break; case 'h': global->phi += pi/180.; break; case 'b': global->phi -= pi/180.; break; case 'a': global->dtheta = pi/180.; break; case 's': global->dtheta = 0; break; case '=': global->DefaultView(); break; default: cout << " Key Character " << (int) key << " " << key << endl; } global->SetView(); glutPostRedisplay(); } void Display(void) { Clean(); int n=global->nblist; for (int i=1;i<=n;i++) glCallList(i); glFlush(); glutSwapBuffers(); } static void Idle( void ) { if (global->dtheta) { global->theta += pi/180.; global->SetView(); glutPostRedisplay(); } } static void Mouse( int button,int state,int x,int y ) { // state up or down if (state == GLUT_DOWN) { xold=x,yold=y;return;} // cout << "Mouse " << button<< " " << state << " " << x-xold << " " << y-yold << endl; // x gauche -> droitre // y haut -> bas` global->phi += (y-yold)/(2.*180.); global->theta -= (x-xold)/(2*180.); global->SetView(); glutPostRedisplay(); } static void MotionMouse(int x,int y ) { // cout << " MotionMouse " << " " << x << " " << y << endl; GLuint gtime = glutGet(GLUT_ELAPSED_TIME); // global->phi += (y-yold)/(2.*180.); global->theta -= (x-xold)/(2*180.); xold=x; yold=y; global->SetView(); glutPostRedisplay(); } void SpecialKey(int key, int x, int y) { // cout << " SpecialKey " << key << " " << x << " " << y << " : "; R dx(0),dy(0); switch (key) { case GLUT_KEY_LEFT: dx = -1; break; case GLUT_KEY_RIGHT: dx = +1; break; case GLUT_KEY_DOWN: dy = -1; break; case GLUT_KEY_UP: dy = +1; break; } // calcul du deplacement de xm,ym,zm; // cout << " " << dx << " " << dy << endl; global->MoveXView(dx,dy); global->SetView(); glutPostRedisplay(); } void * glutthread(void *argu) { char ** argv = (char **) ((void**) argu)[1]; int & argc = * (int *) ((void**) argu )[0] ; glutInit(&argc , argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); int Height = 512; int Width = 512; glutInitWindowSize(Width , Height); glutInitWindowPosition(100, 100); string titre = "vue de "; titre += argv[1] ; titre += ", "; titre += argv[2]; glutCreateWindow(titre.c_str()); glutPushWindow(); cout << "mutex lock in glut " << endl; pthread_mutex_lock(&mutex); cout << " .. continue in glut " << endl; assert(global); global->Height=Height; global->Width=Width; global->MakeListDraw(); global->SetView(); pthread_mutex_unlock(&mutex); glEnable(GL_DEPTH_TEST); glutReshapeFunc( Reshape ); // pour changement de fenetre glutKeyboardFunc( Key ); // pour les evenements clavier glutSpecialFunc(SpecialKey); glutMouseFunc(Mouse); // pour les evenements sourie glutMotionFunc(MotionMouse); // les mouvements de la sourie glutDisplayFunc( Display ); // l'affichage glutIdleFunc( Idle ); // l'animation automatique glutMainLoop(); return return_value; } /* void * main1(void *argu) { pthread_mutex_lock(&mutex); char ** argv = (char **) ((void**) argu)[1]; int & argc = * (int *) ((void**) argu )[0] ; if (argc <3) { cerr << " utilisation : " << argv[0] << " meshfile solfile [rap in z ] [nbisovalue] " << endl; return return_value; } global=0; assert(argc>2); R rapz=1; int nbiso=20; if (argc>3) rapz=atof(argv[3]); if (argc>4) nbiso=atoi(argv[4]); cout << " Rap z " << rapz << endl; Mesh Th(argv[1]); Rn f(Th.nv); { ifstream fdat(argv[2]); assert(fdat.good()); fdat >> f; } // pour ferme le fichier (la variable fdat est detruite) // global=new Global(Th,f,100,100,rapz,nbiso); pthread_mutex_unlock(&mutex); cout << " un lock in main " << endl; cout << " wait close " << endl; pthread_mutex_lock(&mutexclose); pthread_mutex_unlock(&mutexclose); cout << " close " << endl; return return_value; } int main(int argc, char** argv) { global=0; pthread_mutex_init(&mutex,NULL); pthread_mutex_init(&mutexclose,NULL); pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutexclose); pthread_t tid; void * argu[2]={ (void *) & argc, (void*) argv}; pthread_create(&tid,NULL,main1,(void *) argu); pthread_mutex_unlock(&mutex); glutthread(argu); void **value_ptr; pthread_join(tid,value_ptr ); return 0; } */ freefem++-3.38-1/src/femlib/gmres.hpp000644 000767 000024 00000011237 12357522155 017472 0ustar00hechtstaff000000 000000 //***************************************************************** // Iterative template routine -- GMRES // // GMRES solves the unsymmetric linear system Ax = b using the // Generalized Minimum Residual method // // GMRES follows the algorithm described on p. 20 of the // SIAM Templates book. // // The return value indicates convergence within max_iter (input) // iterations (0), or no convergence within max_iter iterations (1). // // Upon successful return, output arguments have the following values: // // x -- approximate solution to Ax = b // max_iter -- the number of iterations performed before the // tolerance was reached // tol -- the residual after the final iteration // //***************************************************************** // modif F. hecht to by compatible with RNM.hpp // no dummy vector result // M.solve(xx) => M*(xx) // dot(u,v) => (u,v) // norm(u) => sqrt( (u,u) ) #include template void GeneratePlaneRotation(Real &dx, Real &dy, Real &cs, Real &sn) { if (dy == 0.0) { cs = 1.0; sn = 0.0; } else if (abs(dy) > abs(dx)) { Real temp = dx / dy; sn = 1.0 / sqrt( 1.0 + temp*temp ); cs = temp * sn; } else { Real temp = dy / dx; cs = 1.0 / sqrt( 1.0 + temp*temp ); sn = temp * cs; } } template void ApplyPlaneRotation(Real &dx, Real &dy, Real &cs, Real &sn) { Real temp = cs * dx + sn * dy; dy = -sn * dx + cs * dy; dx = temp; } template < class Matrix, class Vector > void Update(Vector &x, int k, Matrix &h, Vector &s, Vector v[]) { Vector y(s); // Backsolve: for (int i = k; i >= 0; i--) { y(i) /= h(i,i); for (int j = i - 1; j >= 0; j--) y(j) -= h(j,i) * y(i); } for (int j = 0; j <= k; j++) x += v[j] * y(j); } template < class Real > Real abs(Real x) { return (x > 0 ? x : -x); } template < class Operator, class Vector, class Preconditioner, class Matrix, class Real, class CStop > int GMRES(const Operator &A, Vector &x, const Vector &b, const Preconditioner &M, Matrix &H, int &m, int &max_iter, Real &tol,long verbosity, CStop * Stop ) { Real resid; int i, j = 1, k; Vector s(m+1), cs(m+1), sn(m+1), w,r,Ax; r=M*b; Real normb = sqrt((r,r)); Ax=A * x; Ax=b-Ax; r = M*(Ax); Real beta = sqrt((r,r)); if ( abs(normb) < 1.e-30) normb = 1; if ((resid = beta / normb) <= tol) { tol = resid; max_iter = 0; return 0; } Vector *v = new Vector[m+1]; while (j <= max_iter) { v[0] = r / beta; s = 0.0; s(0) = beta; for (i = 0; i < m && j <= max_iter; i++, j++) { w = M*(Ax=A * v[i]); for (k = 0; k <= i; k++) { H(k, i) = (w, v[k]); w -= H(k, i) * v[k]; } H(i+1, i) = sqrt((w,w)); v[i+1] = w / H(i+1, i) ; for (k = 0; k < i; k++) ApplyPlaneRotation(H(k,i), H(k+1,i), cs(k), sn(k)); GeneratePlaneRotation(H(i,i), H(i+1,i), cs(i), sn(i)); ApplyPlaneRotation(H(i,i), H(i+1,i), cs(i), sn(i)); ApplyPlaneRotation(s(i), s(i+1), cs(i), sn(i)); if(verbosity>5 || (verbosity>2 && j%100==0) ) cout << "GMRES: " << j << " " << abs(s(i+1)) << " " << normb << " " << abs(s(i+1)) / normb << " < " << tol << endl; bool stop = Stop && Stop->Stop(i,x,r);// bof ???? if (((resid = abs(s(i+1)) / normb) < tol )|| stop ) { if(verbosity) cout << "GMRES converges: " << j << " " << abs(s(i+1)) << " " << normb << " " << abs(s(i+1)) / normb << " < " << tol << endl; Update(x, i, H, s, v); tol = resid; max_iter = j; delete [] v; return 0; } } Update(x, i - 1, H, s, v);// chanhe FH oct 2010 m -1 -> i -1 (bug max_iter < m) Ax = A*x; Ax = b-Ax; r = M*(Ax); beta = sqrt((r,r)); if(verbosity>4) cout << "GMRES: restart" << j << " " << beta << " " << normb << " " << beta / normb << " < " << tol << endl; if ((resid = beta / normb) < tol) { tol = resid; max_iter = j; delete [] v; return 0; } } if(verbosity) cout << "WARNING: GMRES do not converges: " << j <<"/" << max_iter << ", resid = " << resid << ", tol= " << tol << ", normb "<< normb << endl; tol = resid; delete [] v; return 1; } template < class Operator, class Vector, class Preconditioner, class Matrix, class Real > int GMRES(const Operator &A, Vector &x, const Vector &b, const Preconditioner &M, Matrix &H, int &m, int &max_iter, Real &tol,long verbosity) { return GMRES(A,x,b,M,H,m,max_iter,tol,verbosity,(StopGC *)0); } freefem++-3.38-1/src/femlib/GQuadTree.cpp000644 000767 000024 00000047170 12542575432 020200 0ustar00hechtstaff000000 000000 // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : Generic Tree (binairy, Quad, Oct) // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include #include "error.hpp" #include #include #include #include #include "ufunction.hpp" #include "HeapSort.hpp" using namespace std; #include "GenericMesh.hpp" #include "Mesh1dn.hpp" #include "Mesh2dn.hpp" #include "Mesh3dn.hpp" namespace EF23 { // new version ---------- // ---------------------- template void OrthoProject(const Rd &P,const Rd &A,const Rd & B,R * l) { Rd AB(A,B),AP(A,P),BP(B,P); R pa=(AB,AP),pb=(AB,BP); // (l0 PA + l1 PB , AB)=0 // l0 pa + l1 pb = 0 // l0 + l1 =1 // l0 (pa - pb) = - pb; l[0] = - pb/(pa-pb); l[1] = 1-l[0]; } template void OrthoProject(const Rd &P,const Rd &A,const Rd &B,const Rd &C,R * l) { Rd AB(A,B),AC(A,C),AP(A,P),BP(B,P),CP(C,P); R2 p0( (AB,AP) , (AC,AP) ); R2 p1( (AB,BP) , (AC,BP) ); R2 p2( (AB,CP) , (AC,CP) ); // sum li pi = 0 // l0 + l1 + l2 = 1 // => R2 O; R d = det(p0,p1,p2); l[0] = det(O ,p1,p2)/ d; l[1] = det(p0,O ,p2)/ d; l[2] = 1. -l[0] -l[1]; // // } template Vertex * GTree::NearestVertex(Zd xyi)//long xi,long yj) { // warning this function return the NearestVertex in the first // none empty box contening the point xyi. // They do not return the true nearest point in classical norm. QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; Zd pp[ MaxDeep ]; int l=0; // level QuadTreeBox * b; IntQuad h=MaxISize,h0; IntQuad hb = MaxISize; Zd p0(0,0,0); Zd plus(xyi) ; plus.Bound(); // xin) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) long hb2 = hb >> 1 ; int k = plus.Case(hb2);//(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ){ break; // null box or empty box => break } NbQuadTreeBoxSearch++; b=b0; p0.Add(k,hb2); hb = hb2; } // n0 number of boxes of in b ("b0") if(verbosity>200) cout << "n0=" << n0 << endl; if ( n0 > 0) { for( int k=0;kv[k]); h0 = Zd(i2,plus).norm(); //NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k]; } NbVerticesSearch++; } return vn; } if(verbosity>200) cout << "general case : NearVertex" << endl; // general case ----- pb[0]= b; pi[0]=b->n>0 ?(int) b->n : N ; pp[0]=p0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; Zd i2 = VtoZd(b->v[k]); h0 = Zd(i2,plus).norm();// NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k]; } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 Zd ppp(pp[l],k,hb); if ( ppp.interseg(plus,hb,h) )//(INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : N ; pp[l]=ppp; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return vn; } template Vertex * GTree::ToClose(const Rd & v,R seuil,Zd H) { const Rd X(v); const Zd p(RdtoZd(v)); R seuil2 = seuil*seuil; // const Metric Mx(v.m); QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; Zd pp[ MaxDeep ]; int l=0; // level QuadTreeBox * b; long h=MaxISize; long hb = MaxISize; Zd p0( 0 ); if (!root->n) return 0; // empty tree // general case ----- pb[0]= root; pi[0]= root->n>0 ?(int) root->n : N ; pp[0]= p0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; //cout << "b" << b << ", k= " << k << endl; //cout << " b->n " << b->n << endl; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; Vertex & V(*b->v[k]); Zd i2 = VtoZd(V); if ( Zd(i2,p).less(H) ) { Rd XY(X,V); R dd; if( (dd= (XY,XY) ) < seuil2 ) // LengthInterpole(Mx(XY), b->v[k]->m(XY))) < seuil ) { return &V; } } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if( (b=b->b[k]) ) { hb >>=1; // div by 2 Zd ppp(pp[l],k,hb); if( ppp.interseg(p,hb,H) ) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : N; pp[l]=ppp; } else b=b0, hb <<=1 ; } else b=b0; } } // fin: while(pi[l]--) hb <<= 1; // mul by 2 } while (l--); return 0; } template void GTree::Add( Vertex & w) { QuadTreeBox ** pb , *b; Zd p(VtoZd(w)); long l=MaxISize; pb = &root; while( (b=*pb) && (b->n<0)) { b->n--; l >>= 1; pb = &b->b[p.Case(l)]; } if (b) { for(int i=N-1;i>=0;--i) if (b->n > i && b->v[i] == &w) { //if( abs(w.x+0.5)<1e-10 ) cout << "if (b->n > i && b->v[i] == &w)" <n == N)) // the QuadTreeBox is full { //if(verbosity > 5) cout << " b = " << b << b->n << " " << l << endl; Vertex *v4[N]; // copy of the QuadTreeBox vertices for(int i=0;iv[i]; b->v[i]=0;} b->n = -b->n; // mark is pointer QuadTreeBox l >>= 1; // div the size by 2 ffassert(l); for (int k=0;kb[ij=VtoZd(v4[k]).Case(l)]; //if(verbosity > 5) cout << "ij= "<< ij << " " << VtoZd(v4[k])<< endl; if (!bb) bb=b->b[ij]=NewQuadTreeBox(); // alloc the QuadTreeBox //if(verbosity > 5) cout << bb << " " << k << " " << ij << endl; bb->v[bb->n++] = v4[k]; } pb = &b->b[p.Case(l)]; } if (!(b = *pb)) { //if(verbosity > 5) cout << "Qbox \n"; b=*pb= NewQuadTreeBox(); // alloc the QuadTreeBox } //if(verbosity > 5) cout << b << " " << b->n << endl; b->v[b->n++]=&w; // we add the vertex NbVertices++; } template GTree::GTree(Vertex * v,Rd Pmin,Rd Pmax,int nbv) : lenStorageQuadTreeBox(nbv/8+100), // th(t), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), NbQuadTreeBox(0), NbVertices(0), cMin(Pmin-(Pmax-Pmin)/2), cMax(Pmax+(Pmax-Pmin)/2), coef( MaxISize/Norme_infty(cMax-cMin)) { if(verbosity>5){ cout << " GTree: box: "<< Pmin << " " << Pmax << " " << cMin << " "<< cMax << " nbv : " << nbv < MaxICoor); if (v) for (long i=0;i GTree::GTree() : lenStorageQuadTreeBox(100), // th(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0), NbQuadTreeBox(0), NbVertices(0), cMin(),cMax(),coef(0) { sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); } template GTree::StorageQuadTreeBox::StorageQuadTreeBox(int ll,StorageQuadTreeBox *nn) { len = ll; n = nn; b = new QuadTreeBox[ll]; for (int i = 0; i GTree::StorageQuadTreeBox::~StorageQuadTreeBox() { //cout << "~StorageQuadTreeBox " << this << " n " << n << " b " << b << endl; if(n) delete n; delete [] b; } template GTree::~GTree() { delete sb; } template ostream& operator <<(ostream& f, const GTree & qt) { f << " the tree " << endl; f << " NbTreeBox = " << qt.NbQuadTreeBox << " Nb Vertices = " << qt.NbVertices << endl; f << " NbTreeBoxSearch " << qt.NbQuadTreeBoxSearch << " NbVerticesSearch " << qt.NbVerticesSearch << endl; f << " SizeOf QuadTree" << qt.SizeOf() << endl; // return dump(f,*qt.root); return f; } template Vertex * GTree::NearestVertexWithNormal(const Rd &P)//(long xi,long yj) { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; Zd pp[ MaxDeep]; int l; // level QuadTreeBox * b; IntQuad h=MaxISize,h0; IntQuad hb = MaxISize; Zd p0; Zd plus(RdtoZd(P) );//xin) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) long hb2 = hb >> 1 ; int k = plus.Case(hb2);//(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; p0.Add(k,hb2); hb = hb2; } if ( n0 > 0) { for(int k=0;kv[k]; if (v->ninside(P)) { Zd i2 = VtoZd(v); // try if is in the right sens -- h0 = Zd(i2,plus).norm();// h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 n>0 ?(int) b->n : N ; pp[0]=p0; h=hb; L1: do { // walk on the tree b= pb[l]; while (pi[l]--) // loop on 4 element of the box { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { Vertex * v=b->v[k]; if (v->ninside(P) ) { NbVerticesSearch++; Zd i2 = VtoZd(v); // if good sens when try -- h0 = Zd(i2,plus).norm();// NORM(iplus,i2.x,jplus,i2.y); if (h0 b[k])) { hb >>=1 ; // div by 2 Zd ppp(pp[l],k,hb); if ( ppp.interseg(plus,hb,h) )//(INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : N ; pp[l]=ppp; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); if (!vn && b != root ) {// cas particulier on repart du sommet on avais rien trouver b=root; hb = MaxISize; p0=Zd(); l=0; pb[0]= b; pi[0]= b->n>0 ?(int) b->n : N ; pp[0]=Zd(); goto L1; } return vn; } // static int kfind=0; // static int kthrough=0; inline void CoorBary(const Triangle2 & K,const R2 & P, R *l) { R detK = 2.*K.mesure() ; l[1]=det(K[0],P,K[2])/detK; l[2]=det(K[0],K[1],P)/detK; l[0]=1-l[1]-l[2]; } inline void CoorBary(const Tet & K,const R3 & P, R *l) { R detK = 6.*K.mesure() ; l[1]=det(K[0],P,K[2],K[3])/detK; l[2]=det(K[0],K[1],P,K[3])/detK; l[3]=det(K[0],K[1],K[2],P)/detK; l[0]=1-l[1]-l[2]-l[3]; } // inline int nRand(int n) { // return rand()%n; //avant random()%n; // } inline int find5(int i,int *k,int l) { if(l<5) { for(int j=0;j=k[0] && i<=k[l-1]) { int i0=0,i1=l-1; while(i0<=i1) { int im=(i0+i1)/2; if(ik[im]) i0=im+1; else if(i==k[im]){ return im; } } } return -1; } template const typename Mesh::Element * Find(const Mesh & Th, GTree *quadtree, typename Mesh::Rd P, typename Mesh::RdHat & Phat, bool & outside, const typename Mesh::Element * tstart) { typedef typename Mesh::Element Element; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::Rd Rd; const int nkv=Element::nv; const int d=Rd::d; R dP=DBL_MAX; Rd PPhat; int k=0; int it,j; const int mxbord=100; int kbord[mxbord]; int nbord=0; if(searchMethod>1) goto PICHON; if ( tstart ) it = Th(tstart); else if(quadtree) { const Vertex * v=quadtree->NearestVertexWithNormal(P); if (!v) { v=quadtree->NearestVertex(P); assert(v); } it=Th.Contening(v); if(verbosity>200) cout << " Close : "<< *v << " " << Th(v) << " "; } else ffassert(0); if(verbosity>200) cout << "tstart=" << tstart << " "<< "it=" << it << " P="<< P << endl; outside=true; Mesh::kfind++; while (1) { //if(verbosity>199) cout << "it " << it < bug // avant: // R eps = -K.mesure()*1e-10; R eps = -1e-10; for(int i=0;i200){ cout << "tet it=" << it ; cout << " K.mesure=" << K.mesure() ; cout << " eps=" << eps << endl; for(int i=0;i on test les autre { // 1) existe t'il un adj interne int nn=0,ii; int nadj[d+1],ni[d+1]; for(int i=0;i=0) && find5(itt,kbord,nbord) < 0 ) ni[nn++]=i,nadj[i]=itt; if(verbosity>1000) cout << " nn : "<< nn << endl; if (nn>0) { //j=nadj[nRand(nn)]; j=ni[randwalk(nn)]; it=nadj[j]; dP=DBL_MAX; //cout << "new it= " << it << endl; continue; } } // toutes les faces <0 sont sur le bord. // pour l'instant on s'arte // le point est externe. (mais trop cher pour faire mieux) // on projet le points sur le bord via le coordonne // barycentrique { // a ridge on border (to hard to do the correct stuff) // or a corner just do the projection on lambda R s=0.; for(int i=0;i1000) { cout << P << " " << n << " l: "; R ss=0; for(int i=0;i= eps) && (l[1] >= eps) && (l[2] >= eps) && (l[3] >= eps) ) { outside=false; Phat=Rd(l+1); return &K; } } const Element & K(Th[closestTet]); outside=true; CoorBary(K,P,l); Phat=Rd(l+1); if(verbosity>2) cout << " --vertex:" << P << " NOT in DOMAIN. use closestTet. Phat:" << Phat << endl; return &K; } /*==============================PICHON=================*/ } // Instantiation manuel des templates template class GTree; template class GTree; template class GTree; typedef Mesh3::GMesh GMesh3; typedef Mesh2::GMesh GMesh2; typedef Mesh1::GMesh GMesh1; template const GMesh3::Element * Find(const GMesh3 & Th, GTree< GMesh3::Vertex> *quadtree, GMesh3::Rd P, GMesh3::RdHat & Phat, bool & outside, const GMesh3::Element * tstart); template const GMesh2::Element * Find(const GMesh2 & Th, GTree< GMesh2::Vertex> *quadtree, GMesh2::Rd P, GMesh2::RdHat & Phat, bool & outside, const GMesh2::Element * tstart); /* template const GMesh1::Element * Find(const GMesh1 & Th, GTree< GMesh1::Vertex> *quadtree, GMesh1::Rd P, GMesh1::RdHat & Phat, bool & outside, const GMesh1::Element * tstart); */ } freefem++-3.38-1/src/femlib/GQuadTree.hpp000644 000767 000024 00000017756 11406226635 020210 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : Generic Tree header (binairy, Quad, Oct) // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ namespace Fem2D { #include "R3.hpp" } namespace EF23 { using namespace Fem2D; using Fem2D::R; static const int MaxDeep = 30; typedef int IntQuad; static const IntQuad MaxISize = ( 1L << MaxDeep); static const IntQuad MaxISize1 = MaxISize-1; class Z1 { public: static bool INTER_SEG1d(int a,int b,int x,int y) { return (((y) > (a)) && ((x) <(b)));} int x; Z1():x(0){} Z1(R1 P) : x((int)P.x) {} Z1( int i) : x(i){} Z1(const Z1 &pp,int k,int l): x(pp.x+(( k&1) ? l : 0)) {} void Add(int k,int l) { x+= (( k&1) ? l : 0) ;} Z1(const Z1 &A,const Z1 &B) : x(B.x-A.x){} int Case(int l) const { return ( x & l)? 1 : 0 ;} int norm() const { return abs(x);} void Bound() { x = max(min(x,MaxISize1),0);} bool less(Z1 h) const { return abs(x) (a)) && ((x) <(b)));} int x,y; Z2():x(0),y(0) {} Z2(R2 P) : x((int)P.x),y((int)P.y) {} Z2( int i) : x(i),y(i){} //Z2( int i,int j) : x(i),y(j) {} Z2(const Z2 &pp,int k,int l): x(pp.x+(( k&1) ? l : 0)),y(pp.y+(( k&2) ? l : 0)) {} void Add(int k,int l) { x+= (( k&1) ? l : 0) ; y+= (( k&2) ? l : 0);} Z2(const Z2 &A,const Z2 &B) : x(B.x-A.x),y(B.y-A.y) {} int Case(int l) const { return ( ( y & l) ? (( x & l) ? 3 : 2 ) : ( ( x & l)? 1 : 0 ) ) ;} int norm() const { return Max(abs(x),abs(y));} void Bound() { x = max(min(x,MaxISize1),0); y = max(min(y,MaxISize1),0);} bool less(Z2 h) const { return abs(x) (a)) && ((x) <(b)));} int x,y,z; Z3():x(0),y(0),z(0) {} Z3(R3 P) : x((int)P.x),y((int)P.y),z((int) P.z) {} Z3( int i) : x(i),y(i),z(i){} Z3(const Z3 &pp,int k,int l): x(pp.x+(( k&1) ? l : 0)),y(pp.y+(( k&2) ? l : 0)),z(pp.z+(( k&4) ? l : 0)) {} void Add(int k,int l) { x+= (( k&1) ? l : 0) ; y+= (( k&2) ? l : 0); z+= (( k&4) ? l : 0);} Z3(const Z3 &A,const Z3 &B) : x(B.x-A.x),y(B.y-A.y),z(B.z-A.z) {} void Bound() { x = max(min(x,MaxISize1),0); y = max(min(y,MaxISize1),0); z = max(min(z,MaxISize1),0);} int Case(int l) const {// cout << " case = "<< int((x&l)!=0)+(int((y&l)!=0)<<1) + (int((z&l)!=0)<<2); return int( (x&l)!=0) + ( int((y&l)!=0)<<1 ) + ( int( (z&l)!=0) <<2 ) ;} int norm() const { return Max(abs(x),abs(y),abs(z));} bool less(Z3 h) const { return abs(x) struct Traits_Zd { typedef void Zd;}; template<> struct Traits_Zd { typedef Z1 Zd;}; template<> struct Traits_Zd { typedef Z2 Zd;}; template<> struct Traits_Zd { typedef Z3 Zd;}; template class GTree { typedef typename Vertex::Rd Rd; typedef typename Traits_Zd::Zd Zd; public: static const int d =Rd::d; static const int N = 1 << d; // N=2^(d-1) class QuadTreeBox { public: int n; // if n < 4 => Vertex else => QuadTreeBox; union { QuadTreeBox *b[N]; Vertex * v[N]; }; // void init() { for(int i=0;iSizeOf():0); } }; // end class StorageQuadTreeBox StorageQuadTreeBox * sb; int lenStorageQuadTreeBox; public: QuadTreeBox * root; // Mesh *th; int NbQuadTreeBoxSearch,NbVerticesSearch; int NbQuadTreeBox,NbVertices; Rd cMin,cMax; // box of QuadTree R coef; // Zd RdtoZd(const Rd &P) const {return Zd((Minc(Maxc(P,cMin),cMax)-cMin)*coef);} Zd VtoZd(const Vertex * v) const {return RdtoZd( (const Rd&) *v);} Zd VtoZd(const Vertex & v) const {return RdtoZd( (const Rd&) v);} Rd ZdtoRd(const Zd &I) const { return ( (Rd) I )/coef+cMin;} Vertex * NearestVertex(const Rd & P) { return NearestVertex(RdtoZd(P));} //XtoI(P.x),YtoJ(P.y));} Vertex * NearestVertexWithNormal(const Rd & P); Vertex * NearestVertex(Zd i2); Vertex * ToClose(const Rd & ,R ,Zd ); Vertex * ToClose(const Rd & P,R delta){ int hx = (int) (coef*delta); //if(verbosity > 5 ) cout << "hx=" << hx << " coef=" << coef << endl; return ToClose(P,delta,Zd(hx));} int SizeOf() const {return sizeof(GTree)+sb->SizeOf();} void Add( Vertex & w); QuadTreeBox* NewQuadTreeBox() { ///cout << "NewQuadTreeBox " << sb << " " << sb->bc << " " //<< sb->be << " " <bcbe)) sb=new StorageQuadTreeBox(lenStorageQuadTreeBox,sb); assert(sb && (sb->bc->n == 0)); NbQuadTreeBox++; return sb->bc++; } ~GTree(); GTree(Vertex * v,Rd Pmin,Rd Pmax,int nbv); GTree(); template friend ostream& operator <<(ostream& f, const GTree & qt); }; template const typename Mesh::Element * Find(const Mesh & Th, GTree *quadtree, typename Mesh::Rd P, typename Mesh::RdHat & Phat, bool & outside, const typename Mesh::Element * tstart); } // name space freefem++-3.38-1/src/femlib/HashTable.hpp000644 000767 000024 00000006226 11406226635 020210 0ustar00hechtstaff000000 000000 template struct SortArray { }; template struct SortArray { T v[1]; SortArray(T *a) { v[0]=a[0]; } SortArray(const T& a0) { v[0]=a0; } SortArray(){} bool operator == (const SortArray & t) const { return v[0] == t.v[0] ;} bool operator<(const SortArray & t) const { return v[0] < t.v[0] ;} size_t hash() const {return (size_t) v[0];} }; template struct SortArray { // using std::swap; T v[2]; SortArray(T *a) { v[0]=a[0]; v[1]=a[1]; if(v[0]>v[1]) swap(v[0],v[1]); } SortArray(const T& a0,const T &a1) { v[0]=a0; v[1]=a1; if(v[0]>v[1]) swap(v[0],v[1]); } SortArray(){} bool operator == (const SortArray & t) const { return v[0] == t.v[0] && v[1] == t.v[1] ;} bool operator<(const SortArray & t) const { return v[0] != t.v[0] ? v[0] < t.v[0] : v[1] < t.v[1] ;} size_t hash() const {return (size_t) v[0];} }; template struct SortArray { T v[3]; SortArray(T *a) { v[0]=a[0]; v[1]=a[1]; v[2]=a[2]; if(v[0]>v[1]) swap(v[0],v[1]); if(v[1]>v[2]) { swap(v[1],v[2]); if(v[0]>v[1]) swap(v[0],v[1]); ASSERTION(v[0] <= v[1] && v[1] <= v[2] ); } } SortArray(){} bool operator == (const SortArray & t) const { return v[0] == t.v[0] && v[1] == t.v[1] && v[2] == t.v[2] ;} bool operator<(const SortArray & t) const { return v[0] != t.v[0] ? v[0] < t.v[0] : ( v[1] != t.v[1] ? v[1] < t.v[1] : v[2] < t.v[2] );} size_t hash() const {return (size_t) v[0];} }; template ostream & operator<<(ostream & f,const SortArray & item) { for (int i=0;i class HashTable { public: struct nKV { size_t next; K k; V v; nKV(){} }; typedef nKV *iterator; size_t n,nx,nk,ncol,nfind; size_t * head; nKV * t; static const size_t endhash= (size_t) -1; HashTable(size_t nnx,size_t nnk) : n(0),nx(nnx),nk(nnk),ncol(0),nfind(0), head(new size_t[nk]),t(new nKV[nx]) { reset();} void reset() { n=0; ncol=0; for (size_t j=0;jv; else return t[add(key,V())].v; } ~HashTable() { if(nfind && verbosity>4) cout << " ~HashTable: Cas moyen : " << (double) ncol/ nfind << endl; delete [] head; delete [] t; } // pas de copie .... private: HashTable(const HashTable&); void operator=(const HashTable&); }; freefem++-3.38-1/src/femlib/HeapSort.hpp000755 000767 000024 00000002374 11406226635 020105 0ustar00hechtstaff000000 000000 template void HeapSort(T *c,long n) { long l,j,r,i; T crit; c--; // on decale de 1 pour que le tableau commence a 1 if( n <= 1) return; l = n/2 + 1; r = n; while (1) { // label 2 if(l <= 1 ) { // label 20 crit = c[r]; c[r--] = c[1]; if ( r == 1 ) { c[1]=crit; return;} } else crit = c[--l]; j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {c[i]=crit;break;} // L8 -> G2 if ((j G2 } } } template void HeapSort(K *k,T *t,long n) { long l,j,r,i; K kk; T tt; k--;t--; // on decale de 1 pour que les tableau commence a 1 if( n <= 1) return; l = n/2 + 1; r = n; while (1) { // label 2 if(l <= 1 ) { // label 20 kk = k[r]; tt = t[r]; t[r]=t[1]; k[r--] = k[1]; if ( r == 1 ) { k[1]=kk;t[1]=tt; return;} } else {kk = k[--l];tt=t[l]; } j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {k[i]=kk;t[i]=tt;break;} // L8 -> G2 if ((j G2 } } } freefem++-3.38-1/src/femlib/InvIntFunc.cpp000644 000767 000024 00000003501 11406226635 020364 0ustar00hechtstaff000000 000000 // used by splitsimplex.cpp // to inverse numering ... // F. Hecht // ORIG-DATE: fev 2009 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 2d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ inline int InvIntFunction(int l) // calcul de inverse de la fonction F { // inverse la function F int i=0,j,k=l; int Fi=F(i),Fj,Fk=F(k); while (1) { j = (i+k)/2; if(j==i) break; Fj=F(j); // cout << i<< j << k << " " << (l < Fj) << " : "; if( l < Fj ) { k=j; Fk=Fj;} else if ( l > Fj ) { i=j; Fi=Fj;} else { i=j;} // cout << " ** " << l << " : " << i<< " "<< j << " "<< k << " : Fi " << Fi << " " << Fj << " "<< Fk << endl; } if( Fk==l) i=k; // cout << " i =" << i << " l= " << l << " in [ " << F(i) << ", " << F(i+1) << "[ " << endl; assert( (F(i) <= l) && (l < F(i+1) ) ); return i; } freefem++-3.38-1/src/femlib/Label.hpp000644 000767 000024 00000001145 11406226635 017367 0ustar00hechtstaff000000 000000 #ifndef LABEL_HPP #define LABEL_HPP class Label { // reference number for the physics friend inline ostream& operator <<(ostream& f,const Label & r ) { f << r.lab ; return f; } friend inline istream& operator >>(istream& f, Label & r ) { f >> r.lab ; return f; } public: int lab; Label(int r=0):lab(r){} bool onGamma() const { return lab;} int operator!() const{return !lab;} bool operator<(const Label & r) const {return lab < r.lab;} bool operator==(const Label & r) const {return lab == r.lab;} bool operator>(const Label & r) const { return lab > r.lab;} }; #endif freefem++-3.38-1/src/femlib/libmesh5.c000644 000767 000024 00000100064 11406142256 017507 0ustar00hechtstaff000000 000000 /*----------------------------------------------------------*/ /* */ /* LIBMESH V 5.0 */ /* */ /*----------------------------------------------------------*/ /* */ /* Description: handle .meshb file format I/O */ /* Author: Loic MARECHAL */ /* Creation date: feb 16 2007 */ /* Last modification: feb 23 2007 */ /* */ /*----------------------------------------------------------*/ /*----------------------------------------------------------*/ /* Includes */ /*----------------------------------------------------------*/ #include #include #include #include #include #include #include #include "libmesh5.h" /*----------------------------------------------------------*/ /* Structures */ /*----------------------------------------------------------*/ typedef struct { int pos, typ, SolSiz, NmbLin, NmbTyp, TypTab[ GmfMaxTyp ]; char fmt[ GmfMaxTyp ]; }KwdSct; typedef struct { int dim, ver, iter, mod, typ, cod, NexKwdPos; double angle, bbox[3][2], time; KwdSct KwdTab[ GmfMaxKwd + 1 ]; FILE *hdl; char FilNam[ GmfStrSiz ]; }GmfMshSct; /*----------------------------------------------------------*/ /* Defines */ /*----------------------------------------------------------*/ #define Asc 1 #define Bin 2 #define MshFil 4 #define SolFil 8 #define MaxMsh 100 #define InfKwd 1 #define RegKwd 2 #define SolKwd 3 #define WrdSiz 4 /*----------------------------------------------------------*/ /* Global variables */ /*----------------------------------------------------------*/ int NmbMsh=0; GmfMshSct *MshTab[ MaxMsh + 1 ]; char *KwdFmt[ GmfMaxKwd + 1 ][3] = { {"Reserved", "", ""}, {"MeshVersionFormatted", "", "i"}, {"Reserved", "", ""}, {"Dimension", "", "i"}, {"Vertices", "i", "dri"}, {"Edges", "i", "iii"}, {"Triangles", "i", "iiii"}, {"Quadrilaterals", "i", "iiiii"}, {"Tetrahedra", "i", "iiiii"}, {"Pentahedra", "i", "iiiiiii"}, {"Hexahedra", "i", "iiiiiiiii"}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Corners", "i", "i"}, {"Ridges", "i", "i"}, {"RequiredVertices", "i", "i"}, {"RequiredEdges", "i", "i"}, {"RequiredTriangles", "i", "i"}, {"RequiredQuadrilaterals", "i", "i"}, {"TangentAtEdgeVertices", "i", "iii"}, {"NormalAtVertices", "i", "ii"}, {"NormalAtTriangleVertices", "i", "iii"}, {"NormalAtQuadrilateralVertices", "i", "iiii"}, {"AngleOfCornerBound", "", "r"}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"BoundingBox", "", "drdr"}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"End", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Reserved", "", ""}, {"Tangents", "i", "dr"}, {"Normals", "i", "dr"}, {"TangentAtVertices", "i", "ii"}, {"SolAtVertices", "i", "sr"}, {"SolAtEdges", "i", "sr"}, {"SolAtTriangles", "i", "sr"}, {"SolAtQuadrilaterals", "i", "sr"}, {"SolAtTetrahedra", "i", "sr"}, {"SolAtPentahedra", "i", "sr"}, {"SolAtHexahedra", "i", "sr"}, {"DSolAtVertices", "i", "sr"}, {"ISolAtVertices", "i", "i"}, {"ISolAtEdges", "i", "ii"}, {"ISolAtTriangles", "i", "iii"}, {"ISolAtQuadrilaterals", "i", "iiii"}, {"ISolAtTetrahedra", "i", "iiii"}, {"ISolAtPentahedra", "i", "iiiiii"}, {"ISolAtHexahedra", "i", "iiiiiiii"}, {"Iterations","","i"}, {"Time","","r"}, {"Reserved","",""} }; /*----------------------------------------------------------*/ /* Prototypes of local procedures */ /*----------------------------------------------------------*/ static void ScaWrd(GmfMshSct *, unsigned char *); static void ScaDblWrd(GmfMshSct *, unsigned char *); static void RecWrd(GmfMshSct *, unsigned char *); static void RecDblWrd(GmfMshSct *, unsigned char *); static int ScaKwdTab(GmfMshSct *); static void ExpFmt(GmfMshSct *, int); static void ScaKwdHdr(GmfMshSct *, int); /*----------------------------------------------------------*/ /* Open a mesh file in read or write mod */ /*----------------------------------------------------------*/ int GmfOpenMesh(const char *FilNam, int mod, ...) { int KwdCod, res, *PtrVer, *PtrDim; char str[ GmfStrSiz ]; va_list par; GmfMshSct *msh; /*---------------------*/ /* MESH STRUCTURE INIT */ /*---------------------*/ if( NmbMsh == MaxMsh) NmbMsh=0; // Add J. Morice allow to read/write more than 100 mesh/sol if( !(msh = calloc(1, sizeof(GmfMshSct))) || (NmbMsh >= MaxMsh) ) return(0); MshTab[ ++NmbMsh ] = msh; /* Copy the FilNam into the structure */ if(strlen(FilNam) + 7 >= GmfStrSiz) return(0); strcpy(msh->FilNam, FilNam); /* Store the opening mod (read or write) and guess the filetype (binary or ascii) depending on the extension */ msh->mod = mod; if(strstr(msh->FilNam, ".meshb")) msh->typ |= (Bin | MshFil); else if(strstr(msh->FilNam, ".mesh")) msh->typ |= (Asc | MshFil); else if(strstr(msh->FilNam, ".solb")) msh->typ |= (Bin | SolFil); else if(strstr(msh->FilNam, ".sol")) msh->typ |= (Asc | SolFil); else return(0); /* Open the file in the required mod and initialyse the mesh structure */ if(msh->mod == GmfRead) { /*-----------------------*/ /* OPEN FILE FOR READING */ /*-----------------------*/ va_start(par, mod); PtrVer = va_arg(par, int *); PtrDim = va_arg(par, int *); va_end(par); /* Create the name string and open the file */ if(!(msh->hdl = fopen(msh->FilNam, "rb"))) return(0); /* Read the endian coding tag, the mesh version and the mesh dimension (mandatory kwd) */ if(msh->typ & Bin) { fread((unsigned char *)&msh->cod, WrdSiz, 1, msh->hdl); if( (msh->cod != 1) && (msh->cod != 16777216) ) return(0); ScaWrd(msh, (unsigned char *)&msh->ver); ScaWrd(msh, (unsigned char *)&KwdCod); if(KwdCod != GmfDimension) return(0); ScaWrd(msh, (unsigned char *)&KwdCod); ScaWrd(msh, (unsigned char *)&msh->dim); } else { do { res = fscanf(msh->hdl, "%s", str); }while( (res != EOF) && strcmp(str, "MeshVersionFormatted") ); if(res == EOF) return(0); fscanf(msh->hdl, "%d", &msh->ver); do { res = fscanf(msh->hdl, "%s", str); }while( (res != EOF) && strcmp(str, "Dimension") ); if(res == EOF) return(0); fscanf(msh->hdl, "%d", &msh->dim); } if( (msh->dim != 2) && (msh->dim != 3) ) return(0); (*PtrVer) = msh->ver; (*PtrDim) = msh->dim; /*------------*/ /* KW READING */ /*------------*/ /* Read the list of kw present in the file */ if(!ScaKwdTab(msh)) return(0); } else if(msh->mod == GmfWrite) { /*-----------------------*/ /* OPEN FILE FOR WRITING */ /*-----------------------*/ msh->cod = 1; /* Check if the user provided a valid version number and dimension */ va_start(par, mod); msh->ver = va_arg(par, int); msh->dim = va_arg(par, int); va_end(par); if( (msh->ver != 1) && (msh->ver != 2) ) return(0); if( (msh->dim != 2) && (msh->dim != 3) ) return(0); /* Create the mesh file */ if(!(msh->hdl = fopen(msh->FilNam, "wb"))) return(0); /*------------*/ /* KW WRITING */ /*------------*/ /* Write the mesh version and dimension */ if(msh->typ & Asc) { fprintf(msh->hdl, "%s %d\n\n", KwdFmt[ GmfVersionFormatted ][0], msh->ver); fprintf(msh->hdl, "%s %d\n", KwdFmt[ GmfDimension ][0], msh->dim); } else { RecWrd(msh, (unsigned char *)&msh->cod); RecWrd(msh, (unsigned char *)&msh->ver); GmfSetKwd(NmbMsh, GmfDimension, 0); RecWrd(msh, (unsigned char *)&msh->dim); } } else return(0); return(NmbMsh); } /*----------------------------------------------------------*/ /* Close a meshfile in the right way */ /*----------------------------------------------------------*/ int GmfCloseMesh(int MshIdx) { int ret; GmfMshSct *msh; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; /* In write down the "End" kw in write mode */ if(msh->mod == GmfWrite) { if(msh->typ & Asc) fprintf(msh->hdl, "\n%s\n", KwdFmt[ GmfEnd ][0]); else GmfSetKwd(MshIdx, GmfEnd, 0); } /* Close the file and free the mesh structure */ /* modif FH */ ret=fclose(msh->hdl); free(msh); fprintf(stdout,"NmbMsh=%d",NmbMsh); return ret!=0; } /*----------------------------------------------------------*/ /* Read the number of lines and set the position to this kwd*/ /*----------------------------------------------------------*/ int GmfStatKwd(int MshIdx, int KwdCod, ...) { int i, *PtrNmbTyp, *PtrSolSiz, *TypTab; GmfMshSct *msh; KwdSct *kwd; va_list par; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) return(0); kwd = &msh->KwdTab[ KwdCod ]; if(!kwd->NmbLin) return(0); /* Read further arguments if this kw is a sol */ if(kwd->typ == SolKwd) { va_start(par, KwdCod); PtrNmbTyp = va_arg(par, int *); *PtrNmbTyp = kwd->NmbTyp; PtrSolSiz = va_arg(par, int *); *PtrSolSiz = kwd->SolSiz; TypTab = va_arg(par, int *); for(i=0;iNmbTyp;i++) TypTab[i] = kwd->TypTab[i]; va_end(par); } return(kwd->NmbLin); } /*----------------------------------------------------------*/ /* Set the current file position to a given kwd */ /*----------------------------------------------------------*/ int GmfGotoKwd(int MshIdx, int KwdCod) { GmfMshSct *msh; KwdSct *kwd; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) return(0); kwd = &msh->KwdTab[ KwdCod ]; if(!kwd->NmbLin) return(0); fseek(msh->hdl, kwd->pos, SEEK_SET); return 0; } /*----------------------------------------------------------*/ /* Write the kwd and set the number of lines */ /*----------------------------------------------------------*/ int GmfSetKwd(int MshIdx, int KwdCod, ...) { int i, CurPos, NmbLin=0, NulPos=0, *TypTab; va_list par; GmfMshSct *msh; KwdSct *kwd; if( (MshIdx < 1) || (MshIdx > MaxMsh) ) return(0); msh = MshTab[ MshIdx ]; if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) ) return(0); kwd = &msh->KwdTab[ KwdCod ]; /* Read further arguments if this kw has a header */ if(strlen(KwdFmt[ KwdCod ][1])) { va_start(par, KwdCod); NmbLin = va_arg(par, int); if(!strcmp(KwdFmt[ KwdCod ][2], "sr")) { kwd->NmbTyp = va_arg(par, int); TypTab = va_arg(par, int *); for(i=0;iNmbTyp;i++) kwd->TypTab[i] = TypTab[i]; } va_end(par); } /* Setup the kwd info */ ExpFmt(msh, KwdCod); if(!kwd->typ) return(0); else if(kwd->typ == InfKwd) kwd->NmbLin = 1; else kwd->NmbLin = NmbLin; /* Store the next kwd position in binary file */ if( (msh->typ & Bin) && msh->NexKwdPos ) { CurPos = ftell(msh->hdl); fseek(msh->hdl, msh->NexKwdPos, SEEK_SET); RecWrd(msh, (unsigned char *)&CurPos); fseek(msh->hdl, CurPos, SEEK_SET); } /* Write the header */ if(msh->typ & Asc) { fprintf(msh->hdl, "\n%s\n", KwdFmt[ KwdCod ][0]); if(kwd->typ != InfKwd) fprintf(msh->hdl, "%d\n", kwd->NmbLin); /* In case of solution field, write the extended header */ if(kwd->typ == SolKwd) { fprintf(msh->hdl, "%d ", kwd->NmbTyp); for(i=0;iNmbTyp;i++) fprintf(msh->hdl, "%d ", kwd->TypTab[i]); fprintf(msh->hdl, "\n\n"); } } else { RecWrd(msh, (unsigned char *)&KwdCod); msh->NexKwdPos = ftell(msh->hdl); RecWrd(msh, (unsigned char *)&NulPos); if(kwd->typ != InfKwd) RecWrd(msh, (unsigned char *)&kwd->NmbLin); /* In case of solution field, write the extended header at once */ if(kwd->typ == SolKwd) { RecWrd(msh, (unsigned char *)&kwd->NmbTyp); for(i=0;iNmbTyp;i++) RecWrd(msh, (unsigned char *)&kwd->TypTab[i]); } } return(kwd->NmbLin); } /*----------------------------------------------------------*/ /* Read a full line from the current kwd */ /*----------------------------------------------------------*/ int GmfGetLin(int MshIdx, int KwdCod, ...) { double *DblPtr, *DblSolTab; float *FltPtr, *FltSolTab; int i, j, *IntPtr; va_list par; GmfMshSct *msh = MshTab[ MshIdx ]; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; /* Start decoding the arguments */ va_start(par, KwdCod); if(kwd->typ != SolKwd) { if(msh->ver == 1) { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { FltPtr = va_arg(par, float *); fscanf(msh->hdl, "%f", FltPtr); } else { IntPtr = va_arg(par, int *); fscanf(msh->hdl, "%d", IntPtr); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { FltPtr = va_arg(par, float *); ScaWrd(msh, (unsigned char *)FltPtr); } else { IntPtr = va_arg(par, int *); ScaWrd(msh, (unsigned char *)IntPtr); } } } } else { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { DblPtr = va_arg(par, double *); fscanf(msh->hdl, "%lf", DblPtr); } else { IntPtr = va_arg(par, int *); fscanf(msh->hdl, "%d", IntPtr); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { DblPtr = va_arg(par, double *); ScaDblWrd(msh, (unsigned char *)DblPtr); } else { IntPtr = va_arg(par, int *); ScaWrd(msh, (unsigned char *)IntPtr); } } } } } else { if(msh->ver == 1) { FltSolTab = va_arg(par, float *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fscanf(msh->hdl, "%f", &FltSolTab[j]); else for(j=0;jSolSiz;j++) ScaWrd(msh, (unsigned char *)&FltSolTab[j]); } else if(msh->ver == 2) { DblSolTab = va_arg(par, double *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fscanf(msh->hdl, "%lf", &DblSolTab[j]); else for(j=0;jSolSiz;j++) ScaDblWrd(msh, (unsigned char *)&DblSolTab[j]); } } va_end(par); /* return the number of arguments filled */ return(kwd->SolSiz); } /*----------------------------------------------------------*/ /* Write a full line from the current kwd */ /*----------------------------------------------------------*/ int GmfSetLin(int MshIdx, int KwdCod, ...) { double d, *DblSolTab; float f, *FltSolTab; int i, j; va_list par; GmfMshSct *msh = MshTab[ MshIdx ]; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; /* Start decoding the arguments */ va_start(par, KwdCod); if(kwd->typ != SolKwd) { if(msh->ver == 1) { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); fprintf(msh->hdl, "%g ", (float)d); } else { j = va_arg(par, int); fprintf(msh->hdl, "%d ", j); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); f = d; RecWrd(msh, (unsigned char *)&f); } else { j = va_arg(par, int); RecWrd(msh, (unsigned char *)&j); } } } } else { if(msh->typ & Asc) { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); fprintf(msh->hdl, "%.15lg ", d); } else { j = va_arg(par, int); fprintf(msh->hdl, "%d ", j); } } } else { for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { d = va_arg(par, double); RecDblWrd(msh, (unsigned char *)&d); } else { j = va_arg(par, int); RecWrd(msh, (unsigned char *)&j); } } } } } else { if(msh->ver == 1) { FltSolTab = va_arg(par, float *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fprintf(msh->hdl, "%g ", FltSolTab[j]); else for(j=0;jSolSiz;j++) RecWrd(msh, (unsigned char *)&FltSolTab[j]); } else if(msh->ver == 2) { DblSolTab = va_arg(par, double *); if(msh->typ & Asc) for(j=0;jSolSiz;j++) fprintf(msh->hdl, "%.15lg ", DblSolTab[j]); else for(j=0;jSolSiz;j++) RecDblWrd(msh, (unsigned char *)&DblSolTab[j]); } } va_end(par); if(msh->typ & Asc) fprintf(msh->hdl, "\n"); /* return the number of arguments filled */ return(kwd->SolSiz); } /*----------------------------------------------------------*/ /*----------------------------------------------------------*/ int GmfCpyLin(int InpIdx, int OutIdx, int KwdCod) { double d; float f; int i, a; GmfMshSct *InpMsh = MshTab[ InpIdx ], *OutMsh = MshTab[ OutIdx ]; KwdSct *kwd = &InpMsh->KwdTab[ KwdCod ]; for(i=0;iSolSiz;i++) { if(kwd->fmt[i] == 'r') { if(InpMsh->ver == 1) { if(InpMsh->typ & Asc) fscanf(InpMsh->hdl, "%f", &f); else ScaWrd(InpMsh, (unsigned char *)&f); d = f; } else { if(InpMsh->typ & Asc) fscanf(InpMsh->hdl, "%lf", &d); else ScaDblWrd(InpMsh, (unsigned char *)&d); f = (float)d; } if(OutMsh->ver == 1) if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "%g ", f); else RecWrd(OutMsh, (unsigned char *)&f); else if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "%.15g ", d); else RecDblWrd(OutMsh, (unsigned char *)&d); } else { if(InpMsh->typ & Asc) fscanf(InpMsh->hdl, "%d", &a); else ScaWrd(InpMsh, (unsigned char *)&a); if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "%d ", a); else RecWrd(OutMsh, (unsigned char *)&a); } } if(OutMsh->typ & Asc) fprintf(OutMsh->hdl, "\n"); return 0; } /*----------------------------------------------------------*/ /* Find every kw present in a meshfile */ /*----------------------------------------------------------*/ static int ScaKwdTab(GmfMshSct *msh) { int KwdCod, NexPos, CurPos, EndPos; char str[ GmfStrSiz ]; if(msh->typ & Asc) { /* Scan each string in the file until the end */ while(fscanf(msh->hdl, "%s", str) != EOF) { /* Fast test in order to reject quickly the numeric values */ if(isalpha(str[0])) { /* Search which kwd code this string is associated with, then get its header and save the curent position in file (just before the data) */ for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++) if(!strcmp(str, KwdFmt[ KwdCod ][0])) { ScaKwdHdr(msh, KwdCod); break; } } else if(str[0] == '#') while(fgetc(msh->hdl) != '\n'); } } else { /* Get file size */ CurPos = ftell(msh->hdl); fseek(msh->hdl, 0, SEEK_END); EndPos = ftell(msh->hdl); fseek(msh->hdl, CurPos, SEEK_SET); /* Jump through kwd positions in the file */ do { /* Get the kwd code and the next kwd position */ ScaWrd(msh, (unsigned char *)&KwdCod); ScaWrd(msh, (unsigned char *)&NexPos); if(NexPos > EndPos) return(0); /* Check if this kwd belongs to this mesh version */ if( (KwdCod >= 1) && (KwdCod <= GmfMaxKwd) ) ScaKwdHdr(msh, KwdCod); /* Go to the next kwd */ if(NexPos) fseek(msh->hdl, NexPos, SEEK_SET); }while(NexPos && (KwdCod != GmfEnd)); } return(1); } /*----------------------------------------------------------*/ /* Read and setup the keyword's header */ /*----------------------------------------------------------*/ static void ScaKwdHdr(GmfMshSct *msh, int KwdCod) { int i; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; if(!strcmp("i", KwdFmt[ KwdCod ][1])) { if(msh->typ & Asc) fscanf(msh->hdl, "%d", &kwd->NmbLin); else ScaWrd(msh, (unsigned char *)&kwd->NmbLin); } else kwd->NmbLin = 1; if(!strcmp("sr", KwdFmt[ KwdCod ][2])) { if(msh->typ & Asc) { fscanf(msh->hdl, "%d", &kwd->NmbTyp); for(i=0;iNmbTyp;i++) fscanf(msh->hdl, "%d", &kwd->TypTab[i]); } else { ScaWrd(msh, (unsigned char *)&kwd->NmbTyp); for(i=0;iNmbTyp;i++) ScaWrd(msh, (unsigned char *)&kwd->TypTab[i]); } } ExpFmt(msh, KwdCod); kwd->pos = ftell(msh->hdl); } /*----------------------------------------------------------*/ /* Expand the compacted format and compute the line size */ /*----------------------------------------------------------*/ static void ExpFmt(GmfMshSct *msh, int KwdCod) { int i, j, TmpSiz=0; char chr, *InpFmt = KwdFmt[ KwdCod ][2]; KwdSct *kwd = &msh->KwdTab[ KwdCod ]; /* Set the kwd's type */ if(!strlen(KwdFmt[ KwdCod ][1])) kwd->typ = InfKwd; else if(!strcmp(InpFmt, "sr")) kwd->typ = SolKwd; else kwd->typ = RegKwd; /* Get the solution-field's size */ if(kwd->typ == SolKwd) for(i=0;iNmbTyp;i++) switch(kwd->TypTab[i]) { case GmfSca : TmpSiz += 1; break; case GmfVec : TmpSiz += msh->dim; break; case GmfSymMat : TmpSiz += (msh->dim * (msh->dim+1)) / 2; break; case GmfMat : TmpSiz += msh->dim * msh->dim; break; } /* Scan each character from the format string */ i = 0; while(i < strlen(InpFmt)) { chr = InpFmt[ i++ ]; if(chr == 'd') { chr = InpFmt[i++]; for(j=0;jdim;j++) kwd->fmt[ kwd->SolSiz++ ] = chr; } else if(chr == 's') { chr = InpFmt[i++]; for(j=0;jfmt[ kwd->SolSiz++ ] = chr; } else kwd->fmt[ kwd->SolSiz++ ] = chr; } } /*----------------------------------------------------------*/ /* Read a four bytes word in a mesh file */ /*----------------------------------------------------------*/ static void ScaWrd(GmfMshSct *msh, unsigned char *wrd) { unsigned char swp; fread(wrd, WrdSiz, 1, msh->hdl); if(msh->cod == 1) return; swp = wrd[3]; wrd[3] = wrd[0]; wrd[0] = swp; swp = wrd[2]; wrd[2] = wrd[1]; wrd[1] = swp; } /*----------------------------------------------------------*/ /* Read an eight bytes word in a mesh file */ /*----------------------------------------------------------*/ static void ScaDblWrd(GmfMshSct *msh, unsigned char *wrd) { int i; unsigned char swp; fread(wrd, WrdSiz, 2, msh->hdl); if(msh->cod == 1) return; for(i=0;i<4;i++) { swp = wrd[7-i]; wrd[7-i] = wrd[i]; wrd[i] = swp; } } /*----------------------------------------------------------*/ /* Write a four bytes word in a mesh file */ /*----------------------------------------------------------*/ static void RecWrd(GmfMshSct *msh, unsigned char *wrd) { fwrite(wrd, WrdSiz, 1, msh->hdl); } /*----------------------------------------------------------*/ /* Write an eight bytes word in a mesh file */ /*----------------------------------------------------------*/ static void RecDblWrd(GmfMshSct *msh, unsigned char *wrd) { fwrite(wrd, WrdSiz, 2, msh->hdl); } /*----------------------------------------------------------*/ /* Fortran 77 API */ /*----------------------------------------------------------*/ int call(gmfopenmeshf77)(char *FilNam, int *mod, int *ver, int *dim, int StrSiz) { int i; char TmpNam[ GmfStrSiz ]; for(i=0;i&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/femlib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = BamgFreeFem.cpp BamgFreeFem.hpp CGNL.hpp CheckPtr.cpp \ ConjuguedGradrientNL.cpp DOperator.hpp Drawing.cpp Element_P2h.cpp \ Element_RT.cpp fem3.hpp fem.cpp fem.hpp FESpace.cpp \ FESpace.hpp FESpace-v0.cpp FQuadTree.cpp FQuadTree.hpp gibbs.cpp \ glutdraw.cpp gmres.hpp MatriceCreuse.hpp MatriceCreuse_tpl.hpp \ MeshPoint.hpp mortar.cpp mshptg.cpp QuadratureFormular.cpp \ QuadratureFormular.hpp RefCounter.hpp RNM.hpp RNM_opc.hpp RNM_op.hpp \ RNM_tpl.hpp R1.hpp R2.hpp R3.hpp \ FESpacen.cpp \ FESpacen.hpp \ P012_1d.cpp \ P012_2d.cpp \ P012_3d.cpp \ PkLagrange.hpp \ Mesh1dn.cpp \ Mesh1dn.hpp \ Mesh2dn.cpp \ Mesh2dn.hpp \ Mesh3dn.cpp \ Mesh3dn.hpp \ HashTable.hpp \ Label.hpp \ assertion.hpp \ GenericMesh.hpp \ GQuadTree.hpp \ GQuadTree.cpp \ HeapSort.hpp \ libmesh5.c \ libmesh5.h \ ufunction.hpp \ splitsimplex.cpp InvIntFunc.cpp splitsimplex.hpp all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/femlib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/femlib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/femlib/MatriceCreuse.hpp000644 000767 000024 00000103226 12542556633 021114 0ustar00hechtstaff000000 000000 #ifndef MatriceCreuse_h_ #define MatriceCreuse_h_ template T Square(const T & r){return r*r;} #ifdef HAVE_LIBUMFPACK_XXXXXXXXXXXXX extern "C" { #ifdef HAVE_UMFPACK_H #include #else #ifdef HAVE_UMFPACK_UMFPACK_H #include #else #ifdef HAVE_BIG_UMFPACK_UMFPACK_H #include #else #ifdef HAVE_UFSPARSE_UMFPACK_H #include #else #ifdef HAVE_SUITESPARSE_UMFPACK_H #include #else // Defaults to a local version of the UMFPACK headers #include "../../download/include/umfpack.h" #endif // HAVE_SUITESPARSE_UMFPACK_H #endif // HAVE_UFSPARSE_UMFPACK_H #endif // HAVE_BIG_UMFPACK_UMFPACK_H #endif // HAVE_UMFPACK_UMFPACK_H #endif // HAVE_UMFPACK_H } #endif #include "RNM.hpp" #include "fem.hpp" #include "FESpace.hpp" #include "DOperator.hpp" #include "QuadratureFormular.hpp" using Fem2D::Mesh; using Fem2D::FESpace; using Fem2D::FElement; using Fem2D::baseFElement; using Fem2D::FMortar; using Fem2D::TypeOfMortar; using Fem2D::QuadratureFormular; using Fem2D::QuadratureFormular1d; using Fem2D::QuadratureFormular_T_5; using Fem2D::QF_GaussLegendre3; const double EPSILON=1e-20; using Fem2D::onWhatIsEdge; //#define APROGRAMMER(a) {cerr << "A PROGRAMMER " #a << endl; exit (1) ;} #define ERREUR(a,b) {cerr << "ERREUR " #a<< b < class MatriceCreuse; template class MatriceElementaire; template class MatriceElementaireSymetrique; template class MatriceElementairePleine; template class MatriceMorse; template class MatriceProdTensoriel; //template R Square(R x){ return x*x;} template T* docpyornot(bool nocpy,T* p,int n) { T * r=p; if( !nocpy) { // do copy r= new T[n]; ffassert(r); if(p) for(int i=0;i T* docpy(TT* p,int n) { T * r=0; if(p && n) { // do copy r= new T[n]; ffassert(r); for(int i=0;i class MatriceElementaire { public: enum TypeOfMatriceElementaire {Full=1,Symmetric=2}; int lga; // size of array a R* a; // array coef -- int *ni,*nj; // list of df // to build matrice on face or edge ----- int n,m; // n,m number of df const TypeOfMatriceElementaire mtype; KN data; // to store value of basic function const bool onFace ; // true if do int on face or edge with jump (VF or GD : Galerkin Discontinus) // in with case add ... const int lnki,lnkj; // size of the 4 next array int *nik,*nikk; // number of df in element k,kk for VF and GD methode int *njk,*njkk; // number of df in element k,kk for VF and GD methode const int optim; MatriceElementaire(int datasize,int llga ,int *nnj,int * nni,TypeOfMatriceElementaire t=Full,int ooptim=1) : lga(llga),a(new R[lga]), ni(nni),nj(nnj),n(0),m(0),mtype(t),data(datasize), onFace(false),lnki(0),lnkj(0),nik(0),nikk(0),njk(0),njkk(0),optim(ooptim) {} // for discontinous Galerkine method MatriceElementaire(int datasize,int llga,int *nni, int lk, TypeOfMatriceElementaire t=Symmetric, int ooptim=1 ) : lga(llga),a(new R[lga]), ni(nni),nj(nni),n(0),m(0),mtype(t),data(datasize*(lk?2:1)) , onFace(lk!=0), lnki(lk),lnkj(lk), nik(lk? new int[lk*2]:0), nikk(nik+lk), njk(nik), njkk(nik+lk), optim(ooptim) { ffassert(lk>=0);} // for discontinous Galerkine method MatriceElementaire(int datasize,int llga,int *nni,int lki,int *nnj,int lkj, TypeOfMatriceElementaire t=Full,int ooptim=1 ) : lga(llga),a(new R[lga]), ni(nni),nj(nnj),n(0),m(0),mtype(t),data(datasize*(lki+lkj?2:1)) , onFace(lki+lkj), lnki(lki),lnkj(lkj), nik(lki? new int[lki*2]:0), nikk(nik+lki), njk(lkj? new int[lkj*2]:0), njkk(njk+lkj), optim(ooptim) { ffassert(lki>=0);}// non teste ??? .... F. hecht ... virtual ~MatriceElementaire() { if(ni != nj) delete [] nj; delete [] ni; delete [] a; if ( nik) delete[] nik; } virtual R & operator() (int i,int j) =0; virtual void call(int ,int ie,int label,void * data,void *Q=0) =0; // const LinearComb,C_F0> * bilinearform; MatriceElementaire & operator()(int k,int ie,int label,void * s=0,void *B=0) { call(k,ie,label,s,B); return *this;} }; template class MatDataFES { public: typedef FES FESpace; typedef typename FESpace::FElement FElement; typedef typename FESpace::QFElement QFElement; typedef typename FESpace::QFBorderElement QFBorderElement; CountPointer cUh,cVh; const FESpace &Uh; const FESpace &Vh; const QFElement & FIT; const QFBorderElement & FIE; MatDataFES(const FESpace & UUh,const QFElement & fit, const QFBorderElement & fie) :Uh(UUh),Vh(UUh),FIT(fit),FIE(fie) {} MatDataFES(const FESpace & UUh,const FESpace & VVh,const QFElement & fit, const QFBorderElement & fie) :Uh(UUh),Vh(VVh),FIT(fit),FIE(fie) {} }; template class MatriceElementaireFES : public MatDataFES , public MatriceElementaire { public: typedef MatriceElementaire MElm ; using MElm::Full; using MElm::Symmetric; typedef typename MElm::TypeOfMatriceElementaire TypeOfMatriceElementaire; typedef FES FESpace; typedef typename FESpace::FElement FElement; typedef typename FESpace::QFElement QFElement; typedef typename FESpace::QFBorderElement QFBorderElement; MatriceElementaireFES(const FESpace & UUh,const FESpace & VVh,int llga ,int *nnj,int * nni,TypeOfMatriceElementaire t=Full, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) : MatDataFES(UUh,VVh,fit,fie), MatriceElementaire(UUh.esize()+VVh.esize(),llga,nnj,nni,t,optim) {} MatriceElementaireFES(const FESpace & UUh,int llga,int *nni, TypeOfMatriceElementaire t=Symmetric, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) : MatDataFES(UUh,UUh,fit,fie), MatriceElementaire(UUh.esize(),llga,nni,nni,t,optim) {} // for discontinous Galerkine method MatriceElementaireFES(const FESpace & UUh,int llga,int *nni, int lk, TypeOfMatriceElementaire t=Symmetric, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) : MatDataFES(UUh,UUh,fit,fie), MatriceElementaire(UUh.esize(),llga,nni,lk,t,optim) {} MatriceElementaireFES(const FESpace & UUh,const FESpace & VVh,int llga ,int *nnj,int lkj,int * nni,int lki,TypeOfMatriceElementaire t=Full, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) : MatDataFES(UUh,VVh,fit,fie), MatriceElementaire(UUh.esize()+VVh.esize(),llga,nnj,lkj,nni,lki,t,optim) {} ~MatriceElementaireFES() {} const LinearComb,C_F0> * bilinearform; MatriceElementaireFES & operator()(int k,int ie,int label,void * s=0,void *Q=0) { this->call(k,ie,label,s,Q); return *this;} }; template class MatriceElementairePleine:public MatriceElementaireFES { /* --- stockage -- // n = 4 m = 5 // 0 1 2 3 4 // 5 6 7 8 9 // 10 11 12 13 14 // 15 16 17 18 19 ------------------*/ public: typedef FES FESpace; typedef typename FESpace::Mesh Mesh; typedef typename FESpace::QFElement QFElement; typedef typename FESpace::QFBorderElement QFBorderElement; typedef typename FESpace::FElement FElement; typedef typename FESpace::Mesh::Rd Rd; R & operator() (int i,int j) {return this->a[i*this->m+j];} // MatPleineElementFunc element; void (* element)(MatriceElementairePleine &,const FElement &,const FElement &, double*,int ie,int label,void *,Rd *) ; void (* faceelement)(MatriceElementairePleine &,const FElement &,const FElement &,const FElement &,const FElement &, double*,int ie,int iee, int label,void *,Rd *) ; void call(int k,int ie,int label,void *,void *B); MatriceElementairePleine & operator()(int k,int ie,int label,void * stack=0,Rd *Q=0) {call(k,ie,label,stack,Q);return *this;} MatriceElementairePleine(const FESpace & VVh, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) :MatriceElementaireFES(VVh, Square(VVh.MaximalNbOfDF()), new int[VVh.MaximalNbOfDF()],this->Full,fit,fie,optim), element(0),faceelement(0) {} // matrice for VF or Galerkin Discontinus MatriceElementairePleine(const FESpace & VVh,bool VF, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) :MatriceElementaireFES(VVh, Square(VVh.MaximalNbOfDF()*2), new int[VVh.MaximalNbOfDF()*2], VF?VVh.MaximalNbOfDF()*2:0, this->Full,fit,fie,optim), element(0),faceelement(0) {} MatriceElementairePleine(const FESpace & UUh,const FESpace & VVh, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) :MatriceElementaireFES(UUh,VVh, UUh.MaximalNbOfDF()*VVh.MaximalNbOfDF(), new int[UUh.MaximalNbOfDF()], new int[VVh.MaximalNbOfDF()],this->Full,fit,fie,optim), element(0),faceelement(0) {} MatriceElementairePleine(const FESpace & UUh,const FESpace & VVh,bool VF, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) :MatriceElementaireFES(UUh,VVh, UUh.MaximalNbOfDF()*VVh.MaximalNbOfDF()*4, new int[UUh.MaximalNbOfDF()*2],VF?UUh.MaximalNbOfDF()*2:0, new int[VVh.MaximalNbOfDF()*2],VF?VVh.MaximalNbOfDF()*2:0,this->Full,fit,fie,optim), element(0),faceelement(0) {} }; template class MatriceElementaireSymetrique:public MatriceElementaireFES { // --- stockage -- // 0 // 1 2 // 3 4 5 // 6 7 8 9 // 10 . . . . // public: typedef FES FESpace; typedef typename FESpace::Mesh Mesh; typedef typename FESpace::QFElement QFElement; typedef typename FESpace::QFBorderElement QFBorderElement; typedef typename FESpace::FElement FElement; typedef typename FESpace::Mesh::Rd Rd; R & operator()(int i,int j) {return j < i ? this->a[(i*(i+1))/2 + j] : this->a[(j*(j+1))/2 + i] ;} void (* element)(MatriceElementaireSymetrique &,const FElement &, double*,int ie,int label,void *,Rd *) ; void (* mortar)(MatriceElementaireSymetrique &,const FMortar &,void *) ; void call(int k,int ie,int label,void * stack,void *B); MatriceElementaireSymetrique(const FESpace & VVh, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default,int optim=1) :MatriceElementaireFES( VVh, int(VVh.MaximalNbOfDF()*(VVh.MaximalNbOfDF()+1)/2), new int[VVh.MaximalNbOfDF()],this->Symmetric, fit,fie,optim), element(0),mortar(0) {} MatriceElementaireSymetrique & operator()(int k,int ie,int label,void * stack=0,Rd *B=0) {this->call(k,ie,label,stack,B);return *this;}; }; template class MatriceProfile; // classe modele pour matrice creuse // --------------------------------- template class MatriceCreuse : public RefCounter,public VirtualMatrice { public: MatriceCreuse(int NbOfDF,int mm,int ddummy) : VirtualMatrice(NbOfDF,mm),n(NbOfDF),m(mm),dummy(ddummy){} MatriceCreuse(int NbOfDF) : VirtualMatrice(NbOfDF),n(NbOfDF),m(NbOfDF),dummy(1){} int n,m,dummy; virtual int size() const =0; virtual MatriceCreuse & operator +=(MatriceElementaire & )=0; virtual void operator=(const R & v) =0; // Mise a zero KN_ & MatMul(KN_ &ax,const KN_ &x) const { ax= R(); addMatMul(x,ax); return ax;} virtual ostream& dump (ostream&) const =0; virtual void Solve(KN_ & x,const KN_ & b) const =0; virtual ~MatriceCreuse(){} virtual R & diag(int i)=0; virtual void SetBC(int i,double tgv)=0; virtual R & operator()(int i,int j)=0; virtual R * pij(int i,int j) const =0; // Add FH virtual void resize(int n,int m) {AFAIRE("MatriceCreuse::resize");} // a faire dans les classe derive ... // add march 2009 FH virtual MatriceMorse *toMatriceMorse(bool transpose=false,bool copy=false) const {return 0;} // not virtual bool addMatTo(R coef,std::map< pair, R> &mij,bool trans=false,int ii00=0,int jj00=0,bool cnj=false,double threshold=0.)=0; // Add FH april 2005 virtual R pscal(const KN_ & x,const KN_ & y) =0 ; // produit scalaire virtual double psor(KN_ & x,const KN_ & gmin,const KN_ & gmax , double omega) =0; virtual void setdiag(const KN_ & x)=0 ; virtual void getdiag( KN_ & x) const =0 ; // end add virtual int NbCoef() const {return 0;}; virtual void setcoef(const KN_ & x)=0 ; virtual void getcoef( KN_ & x) const =0 ; // Add FH oct 2005 bool ChecknbLine(int nn) const { return n==nn;} bool ChecknbColumn(int mm) const { return m==mm;} // end ADD }; template inline ostream& operator <<(ostream& f,const MatriceCreuse & m) {return m.dump(f);} template KN_ & operator/=(KN_ & x ,const MatriceProfile & a) ; enum FactorizationType { FactorizationNO=0, FactorizationCholeski=1, FactorizationCrout=2, FactorizationLU=3}; template class MatriceProfile:public MatriceCreuse { public: mutable R *L; // lower mutable R *U; // upper mutable R *D; // diagonal int *pL; // profile L int *pU; // profile U mutable FactorizationType typefac; FactorizationType typesolver; ostream& dump (ostream&) const ; MatriceProfile(const int n,const R *a); template MatriceProfile(const FESpace &,bool VF=false); MatriceProfile(int NbOfDF,R* d, R* u, int * pu, R* l, int * pl, FactorizationType tf=FactorizationNO) : MatriceCreuse(NbOfDF),L(l),U(u),D(d),pL(pl),pU(pu), typefac(tf),typesolver(FactorizationNO){} const MatriceProfile t() const {return MatriceProfile(this->n,D,L,pL,U,pU,typefac);} const MatriceProfile lt() const {return MatriceProfile(this->n,0,L,pL,0,0);} const MatriceProfile l() const {return MatriceProfile(this->n,0,0,0,L,pL);} const MatriceProfile d() const {return MatriceProfile(this->n,D,0,0,0,0);} const MatriceProfile ld() const {return MatriceProfile(this->n,D,0,0,L,pL);} const MatriceProfile ldt() const {return MatriceProfile(this->n,D,L,pL,0,0);} const MatriceProfile du() const {return MatriceProfile(this->n,D,U,pU,0,0);} const MatriceProfile u() const {return MatriceProfile(this->n,0,U,pU,0,0);} const MatriceProfile ut() const {return MatriceProfile(this->n,0,0,0,U,pU);} void Solve(KN_ &x,const KN_ &b) const { /*if (typefac==0) code faux // FH nov 2006 switch(typefac) { FactorizationCholeski: cholesky() ; break; FactorizationCrout: crout(); break; FactorizationLU: LU(); break; }*/ if (&x != &b) x=b;x/=*this;} int size() const ; void resize(int n,int m) { AFAIRE("MatriceProfile::resize");} // a faire ... add march 2009 FH ~MatriceProfile(); // KN_ operator* (const KN_ & ) const ; void addMatMul(const KN_ &x,KN_ &ax) const; void addMatTransMul(const KN_ &x,KN_ &ax) const { this->t().addMatMul(x,ax);} MatriceCreuse & operator +=(MatriceElementaire &); void operator=(const R & v); // Mise a zero void cholesky(double = EPSILON/8.) const ; // void crout(double = EPSILON/8.) const ; // void LU(double = EPSILON/8.) const ; // R & diag(int i) { return D[i];} void SetBC (int i,double tgv) { if( tgv>=0) D[i]=tgv; else { ffassert(tgv<0); } // to hard .. } R & operator()(int i,int j) { if(i!=j) ffassert(0); return D[i];} // a faire R * pij(int i,int j) const { if(i!=j) ffassert(0); return &D[i];} // a faire Modif FH 31102005 MatriceMorse *toMatriceMorse(bool transpose=false,bool copy=false) const ; template void map(const F & f) { for(int i=0;in;++i) D[i]=f(D[i]); if (L) for(int i=0;in];++i) L[i]=f(L[i]); if (L && (L != U) ) for(int i=0;im];++i) U[i]=f(U[i]); } template MatriceProfile(const MatriceProfile & A) : MatriceCreuse(A.n,A.m,0) { typefac=A.typefac; pL= docpy(A.pL,this->n+1); D = docpy(A.D,this->n); if ( A.pL == A.pU ) pU=pL; else pU= docpy(A.pU,this->m+1); L= docpy(A.L,pL[this->n]); if ( A.L == A.U ) U=L; else U= docpy(A.U,pU[this->m]); } bool addMatTo(R coef,std::map< pair, R> &mij,bool trans=false,int ii00=0,int jj00=0,bool cnj=false,double threshold=0.); // Add FH april 2005 R pscal(const KN_ & x,const KN_ & y); // produit scalaire double psor(KN_ & x,const KN_ & gmin,const KN_ & gmax , double omega); void setdiag(const KN_ & x) ; void getdiag( KN_ & x) const ; // end add // Add FH oct 2005 int NbCoef() const ; void setcoef(const KN_ & x); void getcoef( KN_ & x) const ; // end add /*---------------------------------------------------------------- D[i] = A[ii] L[k] = A[ij] j < i avec: pL[i]<= k < pL[i+1] et j = pL[i+1]-k U[k] = A[ij] i < j avec: pU[j]<= k < pU[j+1] et i = pU[i+1]-k remarque pL = pU generalement si L = U => la matrice est symetrique ------------------------------------------------------------------- */ private: void operator=(const MatriceProfile & A); }; template class MatriceMorse:public MatriceCreuse { // numebering is no-symmetric // the all line i : // k= lg[i] .. lg[i+1]+1 // j = cl[k] // aij=a[k] // otherwise symmetric case // same but just the LOWER part is store (j <= i) // and aii exist always in symmetric case // ----------------------------------------- public: int nbcoef; bool symetrique; R * a; int * lg; int * cl; public: class VirtualSolver :public RefCounter { friend class MatriceMorse; virtual void Solver(const MatriceMorse &a,KN_ &x,const KN_ &b) const =0; }; MatriceMorse():MatriceCreuse(0),nbcoef(0),symetrique(true),a(0),lg(0),cl(0),solver(0) {}; MatriceMorse(KNM_ & A, double tol) ; MatriceMorse(const int n,const R *a); // :MatriceCreuse(n),solver(0) {} MatriceMorse(istream & f); template explicit MatriceMorse(const FESpace & Uh,bool sym,bool VF=false) :MatriceCreuse(Uh.NbOfDF),solver(0) {Build(Uh,Uh,sym,VF);} template explicit MatriceMorse(const FESpace & Uh,const FESpace & Vh,bool VF=false) :MatriceCreuse(Uh.NbOfDF,Vh.NbOfDF,0),solver(0) {Build(Uh,Vh,false,VF);} template explicit MatriceMorse(const FESpace & Uh,const FESpace & Vh, void (*build)(MatriceMorse *,const FESpace & Uh,const FESpace & Vh,void *data),void *data=0 ) :MatriceCreuse(Uh.NbOfDF,Vh.NbOfDF,0),solver(0) {build(this,Uh,Vh,data); } MatriceMorse(int nn,int mm,int nbc,bool sym,R *aa=0,int *ll=0,int *cc=0,bool dd=false, const VirtualSolver * s=0,bool transpose=false ) :MatriceCreuse(nn,mm,dd && !transpose), nbcoef(nbc), symetrique(sym), // transpose = true => dummy false (new matrix) a(docpyornot(this->dummy,aa,nbc)), lg(docpyornot(this->dummy,ll,nn+1)), cl(docpyornot(this->dummy,cc,nbc)), solver(s) { if(transpose) dotransposition(); }; void Solve(KN_ &x,const KN_ &b) const; int size() const ; void addMatMul(const KN_ &x,KN_ &ax) const; void addMatTransMul(const KN_ &x,KN_ &ax) const; MatriceMorse & operator +=(MatriceElementaire &); void operator=(const R & v) { for (int i=0;i< nbcoef;i++) a[i]=v;} virtual ~MatriceMorse(){ if (!this->dummy) { delete [] a; delete [] cl;delete [] lg;}} ostream& dump(ostream & f) const ; R * pij(int i,int j) const ; R operator()(int i,int j) const {R * p= pij(i,j) ;throwassert(p); return *p;} R & operator()(int i,int j) {R * p= pij(i,j) ;throwassert(p); return *p;} R & diag(int i) {R * p= pij(i,i) ;throwassert(p); return *p;} void SetBC (int i,double tgv) { R * p= pij(i,i) ; ffassert(p); if( tgv>=0) *p=tgv; else { ffassert(!symetrique); for (int k=lg[i];k & x,const KN_ & y); // produit scalaire double psor(KN_ & x,const KN_ & gmin,const KN_ & gmax , double omega); void setdiag(const KN_ & x) ; void getdiag( KN_ & x) const ; // end add // Add FH oct 2005 int NbCoef() const ; void setcoef(const KN_ & x); void getcoef( KN_ & x) const ; // end add void resize(int n,int m) ; // add march 2009 ... template MatriceMorse(int nn,int mm, std::map< pair, K> & m, bool sym); template void prod(const MatriceMorse & B, MatriceMorse & AB); MatriceMorse *toMatriceMorse(bool transpose=false,bool copy=false) const { return new MatriceMorse(this->n,this->m,nbcoef,symetrique,a,lg,cl,copy, solver,transpose);} bool addMatTo(R coef,std::map< pair, R> &mij,bool trans=false,int ii00=0,int jj00=0,bool cnj=false,double threshold=0.); template static RR CastTo(K b){return b;} template MatriceMorse(const MatriceMorse & , R (*f)(K) ); template MatriceMorse(const MatriceMorse & ); private: void dotransposition () ; // do the transposition CountPointer solver; void operator=(const MatriceMorse & ); template void Build(const FESpace & Uh,const FESpace & Vh,bool sym,bool VF=false); }; template class StopGC { public: virtual bool Stop(int iter, R *, R * ){cout << " Stop !!!!!\n"; return false;} }; template// S=StopGC int ConjuguedGradient(const M & A,const P & C,const KN_ &b,KN_ &x,const int nbitermax, double &eps,long kprint=1000000000,S *Stop=0) { // ConjuguedGradient lineare A*x est appele avec des conditions au limites // non-homogene puis homogene pour calculer le gradient if (verbosity>50) kprint=2; if (verbosity>99) cout << A << endl; // throwassert(&x && &b && &A && &C); typedef KN Rn; int n=b.N(); throwassert(n==x.N()); Rn g(n), h(n), Ah(n), & Cg(Ah); // on utilise Ah pour stocke Cg g = A*x; double xx= RNM::real((x,conj(x))); double epsold=eps; g -= b;// g = Ax-b Cg = C*g; // gradient preconditionne h =-Cg; double g2 = RNM::real((Cg,conj(g))); if (g2 < 1e-30) { if(verbosity>1 || (kprint<100000)) cout << "GC g^2 =" << g2 << " < 1.e-30 Nothing to do " << endl; return 2; } double reps2 =eps >0 ? eps*eps*g2 : -eps; // epsilon relatif eps = reps2; for (int iter=0;iter<=nbitermax;iter++) { Ah = A*h; double hAh =RNM::real((h,conj(Ah))); // if (Abs(hAh)<1e-30) ExecError("CG2: Matrix non defined, sorry "); R ro = - RNM::real((g,conj(h)))/ hAh; // ro optimal (produit scalaire usuel) x += ro *h; g += ro *Ah; // plus besoin de Ah, on utilise avec Cg optimisation Cg = C*g; double g2p=g2; g2 = RNM::real((Cg,conj(g))); bool stop = Stop && Stop->Stop(iter,x,g); if ( !(iter%kprint) && iter && (verbosity>3) ) cout << "CG:" <0 ) { // change fo eps converge to fast due to the // penalization of boundary condition. eps = epsold*epsold*g2; if (verbosity>3 || (kprint<3)) cout << "CG converge to fast (pb of BC) restart: " << iter << " ro = " << ro << " ||g||^2 = " << g2 << " <= " << reps2 << " new eps2 =" << eps <1 || (kprint<100000) ) cout << "CG converge: " << iter << " ro = " << ro << " ||g||^2 = " << g2 << endl; return 1;// ok } } double gamma = g2/g2p; h *= gamma; h -= Cg; // h = -Cg * gamma* h } if(verbosity) cout << " GC: method doesn't converge in " << nbitermax << " iteration , xx= " << xx<< endl; return 0; } template// S=StopGC int ConjuguedGradient2(const M & A,const P & C,KN_ &x,const KN_ &b,const int nbitermax, double &eps,long kprint=1000000000,S *Stop=0) { // ConjuguedGradient2 affine A*x = 0 est toujours appele avec les condition aux limites // ------------- throwassert(&x && &A && &C); typedef KN Rn; int n=x.N(); // if (verbosity>99) kprint=1; R ro=1; Rn g(n),h(n),Ah(n), & Cg(Ah); // on utilise Ah pour stocke Cg g = A*x; g -= b; Cg = C*g; // gradient preconditionne h =-Cg; R g2 = (Cg,g); if (g2 < 1e-30) { if(verbosity>1 || kprint< 1000000) cout << "GC g^2 =" << g2 << " < 1.e-30 Nothing to do " << endl; return 2; } if (verbosity>5 || (kprint<2)) cout << " 0 GC g^2 =" << g2 << endl; R reps2 =eps >0 ? eps*eps*g2 : -eps; // epsilon relatif eps = reps2; for (int iter=0;iter<=nbitermax;iter++) { R rop = ro; x += rop*h; // x+ rop*h , g=Ax (x old) // ((Ah = A*x - b) - g); // Ah -= b; // Ax + rop*Ah = rop*Ah + g = // Ah -= g; // Ah*rop Ah = A*x; Ah -= b; // Ax + rop*Ah = rop*Ah + g = Ah -= g; // Ah*rop R hAh =(h,Ah); if (RNM::norm2(hAh)<1e-60) ExecError("CG2: Matrix is not defined (/0), sorry "); ro = - (g,h)*rop/hAh ; // ro optimal (produit scalaire usuel) x += (ro-rop) *h; g += (ro/rop) *Ah; // plus besoin de Ah, on utilise avec Cg optimisation Cg = C*g; R g2p=g2; g2 = (Cg,g); bool stop = Stop && Stop->Stop(iter,x,g); if ( ( (iter%kprint) == kprint-1) /*&& verbosity >1*/ ) cout << "CG:" < #include #include #include #endif #ifndef __MWERKS__ // test blas // on MacOS9 under MWERKS // cblas_ddot macos-9 is not #ifdef HAVE_CBLAS_H extern "C" { #define FF_VERSION VERSION #undef VERSION #include #undef VERSION #define VERSION VERSION } #define WITHBLAS 1 #elif HAVE_VECLIB_CBLAS_H #include #define WITHBLAS 1 #endif #endif #ifdef WITHBLAS template inline R blas_sdot(const int n,const R *sx,const int incx,const R *sy,const int incy) { R s=R(); if(incx == 1 && incy == 1) for (int k = 0; k< n; k++) s += *sx++ * * sy++; else for (int k = 0; k< n; k++, sx += incx, sy += incy) s += *sx * *sy; return s; } template inline R blas_sdot( int n, R *sx, int incx, R *sy, int incy) { R s=R(); if(incx == 1 && incy == 1) for (int k = 0; k< n; k++) s += *sx++ * * sy++; else for (int k = 0; k< n; k++, sx += incx, sy += incy) s += *sx * *sy; return s; } // OpenBlas PB with constant remove const .... template<> inline float blas_sdot(const int n, float *sx, int incx, float *sy, int incy) { return cblas_sdot(n,sx,incx,sy,incy); } template<> inline double blas_sdot( int n, double *sx, int incx, double *sy, int incy) { return cblas_ddot(n,sx,incx,sy,incy); } #ifdef OPENBLAS_CONFIG_H typedef openblas_complex_double *BLAS_ptr_complex16; #else typedef void *BLAS_ptr_complex16; #endif template<> inline complex blas_sdot( int n, complex *sx, int incx, complex *sy, int incy) { complex s; cblas_zdotu_sub(n,( double *)sx,incx,( double *)sy,incy,(BLAS_ptr_complex16)&s); return s; } //template<> inline complex blas_sdot( int n, complex *sx, int incx, complex *sy, int incy) //{ // complex s; // cblas_cdotu_sub(n,( void *)sx,incx,( void *)sy,incy,(BLAS_ptr_complex8)&s); // return s; //} #endif // end modif FH using Fem2D::HeapSort; using std::numeric_limits; // ----------- template inline int BuildMEK_KK(const int l,int *p,int *pk,int *pkk,const FElement * pKE,const FElement*pKKE) { // routine which find common dof on to adjacent element pKE and pKKE and make the link .. // if pKKE== 0 then no adj element // the idea is find common dof, but this work only if all dot a different // in on elemnt, so we can have a bug // in case of periodic boundary condition .. // not correct ... F.Hecht ... // ----- // routine build les array p, pk,pkk // which return number of df int 2 element pKE an pKKE // max l size of array p, pk, pkk // p[i] is the global number of freedom // pk[i] is is the local number in pKE ( -1 if not in pKE element) // pkk[i] is is the local number in pKKE ( -1 if not in pKKE element) const FElement (*pK[2])={pKE,pKKE}; int ndf=0; // number of dl int * qk=pk, *qkk=pkk; for (int k=0;k<2;k++) if(pK[k]) { if(k) Exchange(qk,qkk); const FElement& FEK=*pK[k]; int nbdf =FEK.NbDoF(); for (int ii=0;ii=0) pkk[k]=pkk[ii]; if (pk[ii]>=0) pk[k]=pk[ii]; assert(pk[k] >=0 && pkk[k]>=0); } else { // copy if(p[k]==p[ii]) bug++; p[++k] =p[ii]; pk[k]=pk[ii]; pkk[k]=pkk[ii]; } ndf=k+1; for(int ii=0;ii void MatriceElementairePleine::call(int k,int ie,int label,void * stack,void *B) { for (int i=0;ilga;i++) this->a[i]=0; if(this->onFace) { throwassert(faceelement); const Mesh &Th(this->Vh.Th); int iie=ie,kk=Th.ElementAdj(k,iie); if(kk==k|| kk<0) kk=-1; if ( &this->Vh == &this->Uh) { FElement Kv(this->Vh[k]); if(kk<0) { // return ; // on saute ???? bof bof this->n=this->m=BuildMEK_KK(this->lnki,this->ni,this->nik,this->nikk,&Kv,0); int n2 =this->m*this->n; for (int i=0;ia[i]=0; faceelement(*this,Kv,Kv,Kv,Kv,this->data,ie,iie,label,stack,reinterpret_cast(B)); } else { FElement KKv(this->Vh[kk]); this->n=this->m=BuildMEK_KK(this->lnki,this->ni,this->nik,this->nikk,&Kv,&KKv); faceelement(*this,Kv,KKv,Kv,KKv,this->data,ie,iie,label,stack,reinterpret_cast(B)); } } else { throwassert(faceelement); const Mesh &Th(this->Vh.Th); int iie=ie,kk=Th.ElementAdj(k,iie); if(kk==k|| kk<0) kk=-1; if ( &this->Vh == &this->Uh) { FElement Kv(this->Vh[k]); FElement Ku(this->Uh[k]); if(kk<0) { // return ; // on saute ???? bof bof this->n=BuildMEK_KK(this->lnki,this->ni,this->nik,this->nikk,&Kv,0); this->m=BuildMEK_KK(this->lnkj,this->nj,this->njk,this->njkk,&Ku,0); int n2 =this->m*this->n; for (int i=0;ia[i]=0; faceelement(*this,Kv,Kv,Kv,Kv,this->data,ie,iie,label,stack,reinterpret_cast(B)); } else { FElement KKv(this->Vh[kk]); FElement KKu(this->Uh[kk]); this->n=BuildMEK_KK(this->lnki,this->ni,this->nik,this->nikk,&Kv,&KKv); this->m=BuildMEK_KK(this->lnkj,this->nj,this->njk,this->njkk,&Ku,&KKu); faceelement(*this,Ku,KKu,Kv,KKv,this->data,ie,iie,label,stack,reinterpret_cast(B)); } } ERREUR("BUG ???? A FAIRE/ TO DO (see F. hecht) ", 0); ffassert(0); // a faire F. Hecht desole } } else { throwassert(element); const FElement&Kv(this->Vh[k]); int nbdf =Kv.NbDoF(); for (int i=0;ini[i] = Kv(i); // copy the numbering this->m=this->n=nbdf; if(this->ni != this->nj) { // const FElement&Ku(this->Uh[k]); int nbdf =Ku.NbDoF(); for (int i=0;inj[i] = Ku(i); // copy the numbering this->m=nbdf; int n2 =this->m*this->n; for (int i=0;ia[i]=0; element(*this,Ku,Kv,this->data,ie,label,stack,reinterpret_cast(B)); } else { int n2 =this->m*this->n; for (int i=0;ia[i]=0; element(*this,Kv,Kv,this->data,ie,label,stack,reinterpret_cast(B)); // call the elementary mat } } } template void MatriceElementaireSymetrique::call(int k,int ie,int label,void * stack,void *B) { // mise a zero de la matrice elementaire, plus sur for (int i=0;ilga;i++) this->a[i]=0; if(this->onFace) { ffassert(0); // a faire } else { if (k< this->Uh.Th.nt) { throwassert(element); const FElement K(this->Uh[k]); int nbdf =K.NbDoF(); for (int i=0;ini[i] = K(i); // copy the numbering this->m=this->n = nbdf; element(*this,K,this->data,ie,label,stack,static_cast(B)); }// call the elementary mat else { ffassert(0); // remove code for the 3d /* throwassert(mortar); { const FMortar K(&(this->Uh),k); int nbdf = K.NbDoF(); for (int i=0;ini[i] = K(i); // copy the numbering this->m=this->n = nbdf; // mise a zero de la matrice elementaire, plus sur mortar(*this,K,stack);} */ } } } template MatriceProfile::~MatriceProfile() { if(!this->dummy) { //cout << " del mat profile " << endl ; if (U && (U !=L)) delete [] U; if (D) delete [] D; if (L) delete [] L; if (pU && (pU != pL)) delete [] pU; if (pL) delete [] pL; //cout << " dl de MatriceProfile " << this << endl; } } template int MatriceProfile::size() const { int s = sizeof(MatriceProfile); if (D) s += this->n*sizeof(R); if (pL) s += this->n*sizeof(int); if (pU && (pU != pL)) s += this->n*sizeof(int); if (L) s += pL[this->n]*sizeof(int); if (U && (U != L)) s += pU[this->n]*sizeof(int); return s; } /* template int MatriceProfile::MatriceProfile(const MatriceProfile & A ) : MatriceCreuse(A.n,A.m,0) { typefac=A.typefac; pL= docpy(A.pL,n+1); D = docpy(A.D,n); if ( A.pL == A.pU ) pU=pL; else pU= docpy(A.pU,m+1); L= docpy(A.L,pL[n]); if ( A.L == A.U ) U=L; else U= docpy(A.U,pU[m]); }*/ template MatriceMorse *MatriceProfile::toMatriceMorse(bool transpose,bool copy) const { // A FAIRE; ffassert(0); // TODO return 0; } inline pair ij_mat(bool trans,int ii00,int jj00,int i,int j) { // warning trans sub matrix and not the block. return trans ? make_pair(j+ii00,i+jj00) : make_pair(i+ii00,j+jj00) ; } template bool MatriceProfile::addMatTo(R coef,std::map< pair, R> &mij,bool trans,int ii00,int jj00,bool cnj,double threshold) { double eps0=max(numeric_limits::min(), threshold); if( RNM::norm2(coef)n;i++) if( RNM::norm2(D[i])>eps0) mij[ij_mat(trans,ii00,jj00,i,i)] += coef*(cnj? RNM::conj(D[i]) : D[i]); } else { for(int i=0;in;i++) // no dia => identity dai mij[ij_mat(trans,ii00,jj00,i,i)] += coef; } if (L && pL ) for (kf=pL[0],i=0; in; i++ ) { k=kf; kf=pL[i+1]; for ( j=i-kf+k; keps0) mij[ij_mat(trans,ii00,jj00,i,j)]= coef*(cnj? RNM::conj(L[k]) : L[k]); } if (U && pU) for (kf=pU[0],j=0; jm; j++) { k=kf; kf=pU[j+1]; for ( i=j-kf+k; keps0) mij[ij_mat(trans,ii00,jj00,i,j)]= coef*(cnj? RNM::conj(U[k]) : U[k]); } return L == U ; // symetrique } template MatriceProfile::MatriceProfile(const int nn,const R *a) :MatriceCreuse(nn,nn,0),typefac(FactorizationNO) { int *pf = new int [this->n+1]; int i,j,k; k=0; for (i=0;i<=this->n;k+=i++) { pf[i]=k; // cout << " pf " << i<< " = " << k << endl; } ffassert( pf[this->n]*2 == this->n*(this->n-1)); pU = pf; // pointeur profile U pL = pf; // pointeur profile L U = new R[pf[this->n]]; L = new R[pf[this->n]]; D = new R[this->n]; const R *aij=a; for (i=0;in;i++) for (j=0;jn;j++) if (ji) U[pU[j+1]-j+i] = *aij++; else D[i] = *aij++; } template template MatriceProfile::MatriceProfile(const FESpace & Vh,bool VF) :MatriceCreuse(Vh.NbOfDF,Vh.NbOfDF,0),typefac(FactorizationNO) { // for galerkine discontinue .... // VF : true=> Finite Volume matrices (change the stencil) // VF = false => Finite element // F. Hecht nov 2003 // ----- this->dummy=0; this->n = this->m = Vh.NbOfDF; int i,j,k,ke,ie,mn,jl,iVhk; int itab,tabk[5]; int *pf = new int [this->n+1]; for (i=0;in;i++) pf[i]=0; for (ke=0;ken; for( k=tabk[ie=0]; ie n;i++) {int tmp=l;l += pf[i]; pf[i]=tmp;} pf[this->n] = l; if(verbosity >3) cout << " -- SizeOfSkyline =" < void MatriceProfile::addMatMul(const KN_ &x,KN_ &ax) const {if (x.n!= this->n ) ERREUR(MatriceProfile MatMut(xa,x) ," longueur incompatible x (in) ") ; if (ax.n!= this->n ) ERREUR(MatriceProfile MatMut(xa,x) ," longueur incompatible ax (out)") ; int i,j,k,kf; ffassert(this->n == this->m); if (D) for (i=0;in;i++) ax[i] += D[i]*x[i]; else for (i=0;in;i++) // no dia => identyty dai ax[i] +=x[i]; if (L && pL ) for (kf=pL[0],i=0; in; i++ ) { k=kf; kf=pL[i+1]; for ( j=i-kf+k; k=0 && i n && j >=0 && j < this->m && k>=0 && k < pL[this->n]); } if (U && pU) for (kf=pU[0],j=0; jm; j++) { k=kf; kf=pU[j+1]; for ( i=j-kf+k; k=0 && i n && j >=0 && j < this->m && k>=0 && k < pU[this->n]); } } template void MatriceProfile::operator=(const R & v) { if(v!=R()) { cerr << " Mise a zero d'une matrice MatriceProfile::operator=(R v) uniquement v=" << v << endl; throw(ErrorExec("exit",1)); } typefac = FactorizationNO; delete [] U; delete [] L; delete [] D; U=L=D=0; } template MatriceCreuse & MatriceProfile::operator +=(MatriceElementaire & me) { int il,jl,i,j,k; int * mi=me.ni, *mj=me.nj; if (!D) // matrice vide { D = new R[this->n]; L = pL[this->n] ? new R[pL[this->n]] :0 ; for (i =0;in;i++) D[i] =0; for (k =0;kn];k++) L[k] =0; switch (me.mtype) { case MatriceElementaire::Full : U = pU[this->n] ? new R[pU[this->n]] : 0; for (k =0;kn];k++) U[k] =0; break; case MatriceElementaire::Symmetric : U = L; break; default: cerr << "Big bug type MatriceElementaire unknown" << (int) me.mtype << endl; throw(ErrorExec("exit",1)); break; } } R * al = me.a; switch (me.mtype) { case MatriceElementaire::Full : //throwassert(L !=U); for (il=0; ili) U[ pU[j+1] - (j-i) ] += *al; else D[i] += *al;}} break; case MatriceElementaire::Symmetric : //throwassert(L ==U); for (il=0; ili) U[ pU[j+1] - (j-i) ] += *al++; else D[i] += *al++;}} break; default: cerr << "Big bug type MatriceElementaire unknown" << (int) me.mtype << endl; exit(1); break; } return *this; } template ostream& MatriceProfile::dump (ostream& f) const {f<< " matrix skyline " << this->n << '\t' << this->m << '\t' ; f << " this " << endl; f << " pL = " << pL << " L =" << L << endl << " pU = " << pU << " U =" << U << endl << " D = " << D << endl; if ( (pL == pU) && (U == L) ) if (pL && L) {f << " skyline symmetric " <n;i++) { f << i << " {" << pL[i+1]-pL[i] << "}" <<'\t' ; for (k=pL[i];kn;i++) { f << i ; if (pL && L) { f << " jO=" << i-pL[i+1]+pL[i] << " L= " <<'\t' ; for (k=pL[i];k 1 ; "; if (pU && U) { f << " i0=" << i-pU[i+1]+pU[i] << " U= " <<'\t' ; for (k=pU[i];k void MatriceProfile::cholesky(double eps) const { double eps2=eps*eps; R *ij , *ii , *ik , *jk , xii; int i,j,k; if (L != U) ERREUR(factorise,"Skyline matrix non symmetric"); U = 0; // typefac = FactorizationCholeski; if ( RNM::norm2(D[0]) <= 1.0e-60) ERREUR(cholesky,"pivot (" << 0 << ")= " << D[0] ) D[0] = sqrt(D[0]); ij = L ; // pointeur sur le terme ij de la matrice avec jn;i++) // boucle sur les lignes { ii = L+pL[i+1]; // pointeur sur le terme fin de la ligne +1 => ij < ii; xii = D[i] ; for ( ; ij < ii ; ij++) // pour les j la ligne i { j = i -(ii - ij); k = Max( j - (pL[j+1]-pL[j]) , i-(pL[i+1]-pL[i]) ); ik = ii - (i - k); jk = L + pL[j+1] -(j - k); k = j - k ; R s= -*ij; #ifdef WITHBLAS s += blas_sdot(k,ik,1,jk,1); #else while(k--) s += *ik++ * *jk++; #endif *ij = -s/D[j] ; xii -= *ij * *ij ; } // cout << RNM::norm2(xii) << " " << Max(eps2*RNM::norm2(D[i]),1.0e-60) << " " << sqrt(xii) < void MatriceProfile::crout(double eps) const { R *ij , *ii , *ik , *jk , xii, *dkk; int i,j,k; double eps2=eps*eps; if (L != U) ERREUR(factorise,"Skyline matrix non symmetric"); U = 0; // typefac = FactorizationCrout; ij = L ; // pointeur sur le terme ij de la matrice avec jn;i++) // boucle sur les lignes { ii = L+pL[i+1]; // pointeur sur le terme fin de la ligne +1 => ij < ii; xii = D[i] ; for ( ; ij < ii ; ij++) // pour les j la ligne i { j = i -(ii - ij); k = Max( j - (pL[j+1]-pL[j]) , i-(pL[i+1]-pL[i]) ); ik = ii - (i - k); jk = L + pL[j+1] -(j - k); dkk = D + k; k = j - k ; R s=-*ij; while ( k-- ) s += *ik++ * *jk++ * *dkk++; *ij = -s/ *dkk ; // k = j ici xii -= *ij * *ij * *dkk; } if (RNM::norm2(xii) <= Max(eps2*RNM::norm2(D[i]),1.0e-60)) ERREUR(crout,"pivot (" << i << " )= " << abs(xii)<< " <= " << eps*abs(D[i]) << " eps = " << eps) D[i] = xii; } } template void MatriceProfile::LU(double eps) const { R s,uii; double eps2=eps*eps; int i,j; if (L == U && ( pL[this->n] || pU[this->n] ) ) ERREUR(LU,"matrix LU symmetric"); if(verbosity>3) cout << " -- LU " << endl; typefac=FactorizationLU; for (i=1;in;i++) // boucle sur les sous matrice de rang i { // for L(i,j) j=j0,i-1 int j0 = i-(pL[i+1]-pL[i]); for ( j = j0; j incompatible"); const R *ij ,*ii, *ik, *ki; R *xk,*xi; int i; switch (a.typefac) { case FactorizationNO: if (a.U && a.L) {cerr << "APROGRAMMER (KN_::operator/MatriceProfile)";throw(ErrorExec("exit",2));} if ( a.U && !a.L ) { // matrice triangulaire superieure // cout << " remonter " << (a.D ? "DU" : "U") << endl; ki = a.U + a.pU[n]; i = n; while ( i-- ) { ii = a.U + a.pU[i]; xi= xk = v + i ; if (a.D) *xi /= a.D[i];// pour crout ou LU while ( ki > ii) *--xk -= *--ki * *xi ; } } else if ( !a.U && a.L ) { // matrice triangulaire inferieure // cout << " descente " <<( a.D ? "LD" : "L" ) < ii) ss -= *--ik * *--xk ; if ( a.D) ss /= a.D[i];// pour crout ou LU v[i] = ss ; ii = ij; } } else if (a.D) { // matrice diagonale // cout << " diagonal D" < MatriceMorse::MatriceMorse(istream & f) : MatriceCreuse(0,0,0),nbcoef(0), a(0), lg(0), cl(0), solver(0) { string line; int k=0; while ( isspace(f.peek())) f.get(); while ( f.peek() =='#' ) { line=""; while ( f.good() ) { char c=f.get(); if(c=='\n' || c=='\r') { break;} line += c; } if( f.peek()=='\n' || f.peek()=='\r') f.get(); if(verbosity>9) cout << "Read matrice: "<< k << " :" << line << endl; k++; } f >> this->n >> this->m >> symetrique >>nbcoef; if(verbosity>3) cout << " read mat: " << this->n << " " << this->m << " " << symetrique << " " << nbcoef <n+1]; cl= new int[nbcoef]; a= new R[nbcoef]; ffassert(f.good() && lg && a && cl ); int i,j,i0,j0; i0=-1;j0=2000000000; R aij; int imx=-2000000000, jmx=-2000000000; int imn= 2000000000, jmn= 2000000000; for (int k =0;k> i >> j >> aij; ffassert(f.good() ); i--;j--; imx=max(imx,i); jmx=max(jmx,j); imn=min(imn,i); jmn=min(jmn,j); //cout << i << " " << j << " " << aij << endl; if(i0!=i) {j0=-1;lg[i]=k;} ffassert(i0<=i && j0n && jmx < this->m ); ffassert( imn >=0 && jmn >=0); } template ostream& MatriceMorse::dump(ostream & f) const { f << "# Sparse Matrix (Morse) " << endl; f << "# first line: n m (is symmetic) nbcoef \n"; f << "# after for each nonzero coefficient: i j a_ij where (i,j) \\in {1,...,n}x{1,...,m} \n"; f << this->n << " " << this->m << " " << symetrique << " " << nbcoef <n;i++) { // f << i << " : " << lg[i] <<","<< lg[i+1]-1 << " : " ; int ke=lg[i+1]; for (;k inline R* MatriceMorse::pij(int i,int j) const { if (! (in && j< this->m)) throwassert(in && j< this->m); int i0=lg[i]; int i1=lg[i+1]-1; while (i0<=i1) // dichotomie { int im=(i0+i1)/2; if (jcl[im]) i0=im+1; else return a+im; } return 0; } template template void MatriceMorse::Build(const FESpace & Uh,const FESpace & Vh,bool sym,bool VF) { typedef typename FESpace::Mesh Mesh; // for galerkine discontinue .... // VF : true=> Finite Volume matrices (change the stencil) // VF = false => Finite element // F. Hecht nov 2003 // ----- symetrique = sym; this->dummy=false; a=0; lg=0; cl=0; // bool same = &Uh == & Vh; ffassert( &Uh.Th == &Vh.Th); // same Mesh const Mesh & Th(Uh.Th); //int nbt = Th.nt; //int nbv = Th.nv; //int nbm = Th.NbMortars; int nbe = Uh.NbOfElements; int nbn_u = Uh.NbOfNodes; int nbn_v = Vh.NbOfNodes; KN mark(nbn_v); KN pe_u(nbn_u+1+Uh.SizeToStoreAllNodeofElement()); // les element du node i // sont dans pe_u[k] pour k \in [ pe_u[i] , pe_u[i+1] [ pe_u=0; for (int k=0;k4) cout <<" -- MatriceMorse::Build " << kk << " " << nbn_u << " " << Uh.SizeToStoreAllNodeofElement() << " " << nbn_u+1+Uh.SizeToStoreAllNodeofElement() << endl; ffassert(kk== nbn_u+1+Uh.SizeToStoreAllNodeofElement()); for (int k=0;kn+1]; ffassert(lg); for (int step=0;step<2;step++) { int ilg=0; lg[0]=ilg; int kij=0; for (int in=0;in=0 && k < nbe); int njloc = Vh(k); for (int jloc=0;jloc3) cout << " -- MorseMatrix: Nb coef !=0 " << nbcoef << " n =" << this->n << " m = " << this->m << endl; a = new R[nbcoef]; cl = new int [nbcoef];} ffassert( a && cl); for (int i=0;i 999) { cout << " -- MorseMatrix: " << endl; for(int i=0; i< this->n; ++i) { cout << i << " : " ; for(int k=lg[i];k inline void ConjArray( R *v, int n) { for (int i=0;i inline void ConjArray(double *v, int n) {} template<> inline void ConjArray(float *v, int n) {} template void MatriceMorse::dotransposition() { if(symetrique) return; ffassert(this->dummy==false); int *llg= new int[nbcoef]; int *clg= new int[this->m+1]; for (int i=0;in;i++) for (int k=lg[i];km;k++) clg[k]=-1; // build new line end (old column) for(int k=0;km;k++) if (clg[k]==-1) clg[k]=kk; else kk=clg[k]; clg[this->m]=nbcoef; // sort the new column (old line) for(int i=0;im;i++) HeapSort(llg+clg[i],cl+clg[i],a+clg[i],clg[i+1]-clg[i]); delete[] cl; delete[] lg; Exchange(this->n,this->m); cl=llg; lg=clg; ConjArray(a,nbcoef); } template triplet BuildCombMat(std::map< pair, R> & mij,const list *,bool> > &lM,bool trans,int ii00,int jj00,bool cnj=false) { // modif FH feb 2010 cnj => transpose -> conj & trans typedef typename list *,bool> >::const_iterator lconst_iterator; lconst_iterator begin=lM.begin(); lconst_iterator end=lM.end(); lconst_iterator i; // std::map< pair, R> mij; int n=0,m=0; bool sym=true; for(i=begin;i!=end;i++++) { if(i->second) // M == 0 => zero matrix { MatriceCreuse & M=*i->second; bool transpose = i->third != trans; ffassert( &M); R coef=i->first; if(verbosity>3) cout << " BuildCombMat + " << coef << "*" << &M << " " << sym << " t = " << transpose << " " << i->third << endl; // change to max FH dec 2007 to hard to satisfy /* if (n==0)*/ { if(transpose) {m=max(m,M.n); n=max(n,M.m);} else{n=max(M.n,n); m=max(M.m,m);}}// Modif mars 2007 FH /* else { if(transpose) ffassert(n== M.m && m==M.n); else ffassert(n== M.n && m==M.m);}*/ sym = M.addMatTo(coef,mij,transpose,ii00,jj00,transpose&&cnj) && sym; } } int nbcoef=mij.size(); if(sym) nbcoef = (nbcoef+n)/2; // return new MatriceMorse(n,m,mij,sym); return make_triplet(n,m,sym); } template MatriceMorse * BuildCombMat(const list *,bool> > &lM,bool trans,int ii00,int jj00) { std::map< pair, R> mij; triplet nmsym=BuildCombMat(mij,lM,trans,ii00,jj00); return new MatriceMorse(nmsym.first,nmsym.second,mij,nmsym.third); } template bool MatriceMorse::addMatTo(R coef,std::map< pair, R> &mij,bool trans,int ii00,int jj00,bool cnj,double threshold) { double eps0=max(numeric_limits::min(),threshold); int i,j,k; if (symetrique) { for ( i=0;in;i++) for ( k=lg[i];keps0) { mij[ij_mat(trans,ii00,jj00,i,j)] += cij ; if (i!=j) mij[ij_mat(trans,ii00,jj00,j,i)] += cij; } } } else { for ( i=0;in;i++) for ( k=lg[i];keps0) mij[ij_mat(trans,ii00,jj00,i,j)] += cij; } } return symetrique; } template template MatriceMorse::MatriceMorse(int nn,int mm, std::map< pair, K> & m, bool sym): MatriceCreuse(nn,mm,0), nbcoef(m.size()),symetrique(sym), a(new R[nbcoef]), lg(new int[nn+1]), cl(new int[nbcoef]), solver(0) { int k=0; bool nosym=!sym; typename std::map< pair, R>::iterator iter=m.begin(), mend=m.end(); // remarque lg est croissant Bug trouver par for(int i=0;i<=nn;i++) lg[i]=0; while(iter!=mend) { int i=iter->first.first; int j=iter->first.second; K & aij=iter->second; assert( i < nn && j < mm); if(j<=i || nosym) { cl[k]=j; a[k]=aij; lg[i+1]=++k; } ++iter; } // lg est croissant on bouche les trou for(int i=1;i<=nn;i++) lg[i]=Max(lg[i-1],lg[i]); ffassert(nbcoef==k); } // FH mars 2009 ... template void MatriceMorse::resize(int nn,int mm) { int nc=0; int *nlg=new int[nn+1],*ncl=0; int nm=min(nn,this->n); nc =0; nlg[0]=nc; if (symetrique) { if( nn != mm) AFAIRE("MatriceMorse::resize symetric n!=m"); for (int i=0;im && RNM::norm2(a[k])) ++nc; } nlg[i+1]=nc; } } else { for (int i=0;in && jm && RNM::norm2(a[k])) ++nc ; } nlg[i+1]=nc; } } for(int i=nm+1;i<=nn;++i) nlg[i]=nc; ncl = new int[nc]; R *na=new R[nc]; nc=0; if (symetrique) { if( nn != mm) AFAIRE("MatriceMorse::resize symetric n!=m"); for (int i=0;im && RNM::norm2(a[k])) {na[nc]=a[k]; ncl[nc++]=j;} } } else { for (int i=0;im && RNM::norm2(a[k])) {na[nc]=a[k]; ncl[nc++]=j;} } } delete [] cl; delete [] lg; delete [] a; cl=ncl; lg=nlg; a=na; this->n=nn; this->m=mm; this->N=nn; this->M=mm; this->nbcoef=nc; // cout << nn << " " << mm << " " << KN_(lg,nn+1) << endl; } template template void MatriceMorse::prod(const MatriceMorse & B, MatriceMorse & AB) { // compute the s bool sym=this == & B &&symetrique; int *blg=B.lg; int *bcl=B.cl; ffassert(this->m==B.n); bool delbl= B.symetrique; if (delbl) { int nn=B.n; blg = new int[nn+1]; for (int i=0;i > sij; double eps0=numeric_limits::min(); for (int i=0;in;i++) for (int k=lg[i];k=B.n) continue; // in case of not equal size A.m != B.n for (int kkb=blg[j];kkb j) bjk=B(kz,j); else bjk=B(j,kz); if( RNM::norm2(bjk)>eps0 && (!sym || kz<=i)) sij.insert(make_pair(i,kz)); } } } int nn=this->n; int mm=B.m; int * llg=new int[nn+1]; int * lcl=new int[sij.size()]; RAB * aa = new RAB[sij.size()]; for(int i=0;i<=nn;i++) llg[i]=0; for (set >::iterator iter=sij.begin();iter!=sij.end();++iter) { int i=iter->first; // int j=iter->second; llg[i]++; } for (int i=1;i<=nn;i++) llg[i]+=llg[i-1]; ffassert(llg[this->n]==(long) sij.size()); for (set >::iterator iter=sij.begin();iter!=sij.end();++iter) { int i=iter->first; int j=iter->second; // cout << i << " , " << j << endl; lcl[--llg[i]]=j; } for(int i=0;in;i++) for (int k=lg[i];k=B.n) continue; // in case of not equal size A.m != B.n for (int kb=blg[j];kb j) bjk=B(k,j); else bjk=B(j,k); // cout << i << "," << "," << j << "," << k << " " << aij << " " << bjk << endl; if( RNM::norm2( bjk)> eps0 && (!sym || k<=i)) AB(i,k) += aij*bjk; } } } if (delbl) { delete [] blg; delete [] bcl; } } template void MatriceMorse::addMatMul(const KN_ & x, KN_ & ax) const { int i,j,k; if( ! (this->n==ax.N() && this->m==x.N())) {cerr << " Err MatriceMorse: ax += A x" <n<< " != "<< ax.N() << " ax.n \n"; cerr << " A.m " << this->m<< " != " <n;i++) for (k=lg[i];kn;i++) for (k=lg[i];k void MatriceMorse::addMatTransMul(const KN_ & x, KN_ & ax) const { int i,j,k; ffassert(this->m==ax.N()); ffassert(this->n==x.N()); if (symetrique) { for (i=0;in;i++) for (k=lg[i];kn;i++) for (k=lg[i];k MatriceMorse & MatriceMorse::operator +=(MatriceElementaire & me) { // R zero=R(); int il,jl,i,j; int * mi=me.ni, *mj=me.nj; if ((this->n==0) && (this->m==0)) { // if(verbosity>3) cout << " -- Morse Matrice is empt: let's build it" << endl; ffassert(0); /* this->n=me.Uh.NbOfDF; this->m=me.Vh.NbOfDF; switch (me.mtype) { case MatriceElementaire::Full : Build(me.Uh,me.Vh,false); break; case MatriceElementaire::Symmetric : Build(me.Uh,me.Vh,true); break; default: cerr << "Big bug type MatriceElementaire is unknown" << (int) me.mtype << endl; throw(ErrorExec("exit",1)); break; } */ } R * al = me.a; R * aij; switch (me.mtype) { // modif FH overfloat in array mi and mj => trap on win32 case MatriceElementaire::Full : ffassert(!symetrique); for (il=0; il::Symmetric : ffassert(symetrique); for (il=0; il void MatriceMorse::Solve(KN_ &x,const KN_ &b) const{ if (solver) solver->Solver(*this,x,b); else { cerr << "No Solver defined for this Morse matrix " << endl; throw(ErrorExec("exit",1));} } template double MatriceMorse::psor(KN_ & x,const KN_ & gmin,const KN_ & gmax , double omega) { double err=0; int n=this->n; ffassert(n==this->m); ffassert(n==x.N()); ffassert(n==gmin.N()); ffassert(n==gmax.N()); if (symetrique) { ErrorExec("Error:sorry psor just for no symmetric Morse matrices",1); } else { for (int i=0;in;i++) { R xnew =x[i]; R aii=R(); for (int k=lg[i];k double MatriceProfile::psor(KN_ & x,const KN_ & gmin,const KN_ & gmax , double omega) { double rr=0; ErrorExec("Error:sorry psor just for no symmetric Morse matrices (will do in future FH??? )",2); return rr; } template void MatriceProfile::setdiag(const KN_ & x) { ffassert(D); ffassert( this->n == x.N()); KN_ d(D,this->n) ; d=x; } template void MatriceProfile::getdiag(KN_ & x) const { ffassert(D); ffassert( this->n == x.N()); KN_ d(D,this->n) ; x=d; } template void MatriceMorse::setdiag(const KN_ & x) { ffassert( this->n == this->m&& this->n == x.N()); for (int i=0;in;++i) { R * p= pij(i,i); if(p) *p = x[i]; else ffassert( RNM::norm2(x[i]) < 1e-30);} } template void MatriceMorse::getdiag(KN_ & x) const { ffassert( this->n == this->m && this->n == x.N()); for (int i=0;in;++i) { R * p= pij(i,i); x[i]= p ? *p : R() ; } } template R MatriceMorse::pscal(const KN_ & x,const KN_ & y) { // (x, Ay) R sum=R(); int i,j,k; ffassert(this->n==x.N()); ffassert(this->m==y.N()); if (symetrique) { for (i=0;in;i++) for (k=lg[i];kn;i++) for (k=lg[i];k R MatriceProfile::pscal(const KN_ & x,const KN_ & y) { if (y.n != this->n || x.n != this->n ) ERREUR(MatriceProfile pscal(xa,x) ," longueur incompatible c (out)") ; int i,j,k,kf; R sum = R(); ffassert(this->n == this->m); if (D) for (i=0;in;i++) sum += D[i]*x[i]*y[i]; else for (i=0;in;i++) // no dia => identyty dai sum +=x[i]*y[i]; if (L && pL ) for (kf=pL[0],i=0; in; i++ ) { k=kf; kf=pL[i+1]; for ( j=i-kf+k; k=0 && i n && j >=0 && j < this->m && k>=0 && k < pL[this->n]); } if (U && pU) for (kf=pU[0],j=0; jm; j++) { k=kf; kf=pU[j+1]; for ( i=j-kf+k; k=0 && i n && j >=0 && j < this->m && k>=0 && k < pU[this->n]); } return sum; } template void MatriceMorse::getcoef(KN_ & x) const { ffassert(x.N()==this->nbcoef); x = KN_(this->a,nbcoef); } template void MatriceMorse::setcoef(const KN_ & x) { ffassert(x.N()==nbcoef); KN_(this->a,nbcoef) = x; } template int MatriceMorse::NbCoef() const { return this->nbcoef; } template void MatriceProfile::getcoef(KN_ & x) const { ffassert(x.N()==this->NbCoef()); int k=0,kk; if (D) { kk=this->n; x(SubArray(kk,k)) = KN_(D,kk); k += kk; } if (L) { kk= pL[this->n]; x(SubArray(kk,k)) = KN_(L,kk); k += kk; } if (U && (U != L)) { kk= pU[this->n]; x(SubArray(kk,k)) = KN_(U,kk); k += kk; } } template void MatriceProfile::setcoef(const KN_ & x) { ffassert(x.N()==this->NbCoef()); int k=0,kk; if (D) { kk=this->n; KN_(D,kk)=x(SubArray(kk,k)) ; k += kk; } if (L) { kk= pL[this->n]; KN_(L,kk)=x(SubArray(kk,k)) ; k += kk; } if (U && (U != L)) { kk= pU[this->n]; KN_(U,kk)=x(SubArray(kk,k)) ; k += kk; } } template int MatriceProfile::NbCoef() const { int s=0; if (D) s += this->n; if (L) s += pL[this->n]; if (U && (U != L)) s += pU[this->n]; return s; } #endif freefem++-3.38-1/src/femlib/Mesh1dn.cpp000644 000767 000024 00000007406 11406226635 017650 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 1d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include #include "ufunction.hpp" #include "error.hpp" #include "RNM.hpp" #include "libmesh5.h" #include "Mesh1dn.hpp" //long verbosity=1; namespace Fem2D { const R1 R1::KHat[2]={R1(0),R1(1)}; const R2 R2::KHat[3]={R2(0,0),R2(1,0),R2(0,1)}; const R3 R3::KHat[4]={R3(0,0,0),R3(1,0,0),R3(0,1,0),R3(0,0,1)}; static const int nvfaceTet[4][3] = { {2,1,3},{0,2,3},{1,0,3},{0,1,2} }; static const int nvedgeTet[6][2] = { {0,1},{0,2},{0,3},{0,1},{1,2},{2,3} }; static const int nvfaceTria[1][3] = { {0,1,2} }; static const int nvedgeTria[3][2] = { {1,2},{2,0},{0,1}}; static const int nvfaceSeg[1][3] = {{-1,-1,-1}}; static const int nvedgeSeg[1][2] = { {0,1} }; static const int nvadjSeg[2][1] = { {0},{1} }; template<> const int (* const GenericElement::nvface)[3] = 0 ; template<> const int (* const GenericElement::nvedge)[2] = 0 ; template<> const int (* const GenericElement::nvadj)[1] = 0 ; template<> const int (* const GenericElement::nvface)[3] = 0 ; template<> const int (* const GenericElement::nvedge)[2] = nvedgeSeg; //nvedgeTria ; template<> const int (* const GenericElement::nvadj)[1] = nvadjSeg ; template<> const int GenericElement::nitemdim[4] = {2,1,0,0 } ; template<> int GenericMesh::kfind=0; template<> int GenericMesh::kthrough=0; static const int onWhatIsVertex[2][3] = { {1,0,0}, // sommet 0 {0,1,0}}; // sommet 1 template<> const int (* const GenericElement::onWhatBorder)[3] = onWhatIsVertex ; Mesh1::Mesh1(const char * filename) { // read the mesh int nt,nv,nbe; int ok=0;//load(filename); if(ok) { ifstream f(filename); if(!f) {cerr << "Mesh1::Mesh1 Erreur openning " << filename<> nv >> nt >> nbe ; this->set(nv,nt,nbe); if(verbosity) cout << " -- Nb of Vertex " << nv << " " << " Nb of Seg " << nt << " , Nb of border Vertex " << nbe << endl; assert(f.good() && nt && nv) ; for (int i=0;i> this->vertices[i]; assert(f.good()); } mes=0; for (int i=0;it(i).Read1(f,this->vertices,nv); mes += t(i).mesure(); } mesb=0.; for (int i=0;ibe(i).Read1(f,this->vertices,nv); mesb += be(i).mesure(); } } BuildBound(); BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); if(verbosity) cout << " - mesh mesure = " << mes << " border mesure: " << mesb << endl; } } freefem++-3.38-1/src/femlib/Mesh1dn.hpp000644 000767 000024 00000006127 11406226635 017654 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 1d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef MESH1DN_HPP_ #define MESH1DN_HPP_ namespace Fem2D { #include "R1.hpp" } #include "GenericMesh.hpp" #include using namespace std; namespace Fem2D { typedef GenericVertex Vertex1; struct DataSeg1 { static const int NbOfVertices =2; static const int NbOfFaces =0; static const int NbOfEdges =1; static const int NT =0; static const int NbOfAdjElem =NbOfVertices; static const int NbOfVertexOnHyperFace =NbOfVertices-1; typedef Vertex1 V; typedef V::Rd Rd ; static R mesure( V * pv[NbOfVertices]) { return pv[1]->x-pv[0]->x; } typedef R0 RdHatBord; typedef R1 RdHat; static RdHat PBord(const int * nvb,const RdHatBord & P) { return R1(*nvb) ;} // static const int (* const nvface)[3];// = nvfaceTria ; //static const int (* const nvedge)[2];// = nvedgeTrai; }; struct DataPoint1 { static const int NbOfVertices =1; static const int NbOfEdges =0; static const int NbOfFaces =0; static const int NT =0; static const int NbOfAdjElem =1; static const int NbOfVertexOnHyperFace =1; typedef Vertex1 V; typedef V::Rd Rd; static R mesure( V * pv[NbOfVertices] ) { return 1.; } typedef R0 RdHatBord; typedef R0 RdHat; static RdHat PBord(const int * nvb,const RdHatBord & P) { return R0() ;} }; class Seg1: public GenericElement { public: Seg1() {}; // constructor empty for array R1 H(int i) const { ASSERTION(i>=0 && i <1); return (2-i)/mesure();} // heigth void Gradlambda(R1 * GradL) const { GradL[1]= H(1); GradL[0]=-GradL[1]; } }; class BoundaryPoint1: public GenericElement { public: BoundaryPoint1() {}; // constructor empty for array }; class Mesh1 : public GenericMesh { public: Mesh1(const char *); // const Element * Find( R1 P, R1 & Phat,bool & outside,const Element * tstart) const; private: int load(const string & filename); Mesh1(const Mesh1 &); // pas de construction par copie void operator=(const Mesh1 &);// pas affectation par copy }; } #endif freefem++-3.38-1/src/femlib/Mesh2dn.cpp000644 000767 000024 00000026221 11406226635 017645 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 2d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include #include "ufunction.hpp" #include "error.hpp" #include "RNM.hpp" #include "libmesh5.h" #include "Mesh2dn.hpp" // for plotStream (a change) #include "Mesh3dn.hpp" #include "rgraph.hpp" #include "fem.hpp" #include "PlotStream.hpp" namespace Fem2D { long verbosity=1; // const R1 R1::KHat[2]={R1(0),R1(1)}; // const R2 R2::KHat[3]={R2(0,0),R2(1,0),R2(0,1)}; // const R3 R3::KHat[4]={R3(0,0,0),R3(1,0,0),R3(0,1,0),R3(0,0,1)}; static const int nvfaceTet[4][3] = { {2,1,3},{0,2,3},{1,0,3},{0,1,2} }; static const int nvedgeTet[6][2] = { {0,1},{0,2},{0,3},{0,1},{1,2},{2,3} }; static const int nvfaceTria[1][3] = { {0,1,2} }; static const int nvedgeTria[3][2] = { {1,2},{2,0},{0,1}}; // tourne de le sens trigo donc Normal ext vect(1,0) ^ perp static const int nvfaceSeg[1][3] = {{-1,-1,1}}; static const int nvedgeSeg[1][2] = { {0,1} }; static const int nvadjSeg[2][1] = { {0},{1} }; template<> const int (* const GenericElement::nvface)[3] = 0 ; template<> const int (* const GenericElement::nvedge)[2] = nvedgeSeg; //nvedgeTria ; template<> const int (* const GenericElement::nvadj)[1] = nvadjSeg ; template<> const int (* const GenericElement::nvface)[3] = nvfaceTria ; template<> const int (* const GenericElement::nvedge)[2] = nvedgeTria ; template<> const int (* const GenericElement::nvadj)[2] = nvedgeTria ; template<> const int GenericElement::nitemdim[4] = {3,3,1,0 } ; static const int onWhatIsEdge2d[3][7] = { {0,1,3, 2,0,0, 0}, // edge 0 {3,0,1, 0,2,0, 0}, {1,3,0, 0,0,2, 0}}; template<> const int (* const GenericElement::onWhatBorder)[7] = onWhatIsEdge2d ; template<> int GenericMesh::kfind=0; template<> int GenericMesh::kthrough=0; Mesh2::Mesh2(const char * filename) { // read the mesh int nt,nv,nbe; int ok=load(filename); if(ok) { ifstream f(filename); if(!f) {cerr << "Mesh2::Mesh2 Erreur openning " << filename<> nv >> nt >> nbe ; this->set(nv,nt,nbe); if(verbosity) cout << " -- Nb of Vertex " << nv << " " << " Nb of Triangles " << nt << " , Nb of border edges " << nbe << endl; assert(f.good() && nt && nv) ; for (int i=0;i> this->vertices[i]; assert(f.good()); } mes=0; for (int i=0;it(i).Read1(f,this->vertices,nv); mes += t(i).mesure(); } mesb=0.; for (int i=0;ibe(i).Read1(f,this->vertices,nv); mesb += be(i).mesure(); } } BuildBound(); BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); if(verbosity) cout << " - mesh mesure = " << mes << " border mesure: " << mesb << endl; } int Mesh2::load(const string & filename) { int bin; int ver,inm,dim; int lf=filename.size()+20; KN fileb(lf),filef(lf); char * pfile; strcpy(filef,filename.c_str()); strcpy(fileb,filef); strcat(filef,".mesh"); strcat(fileb,".meshb"); if( (inm=GmfOpenMesh(pfile=fileb, GmfRead,&ver,&dim)) ) bin=true; else if( (inm=GmfOpenMesh(pfile=filef, GmfRead,&ver,&dim)) ) bin=false; else { cerr << " Erreur ouverture file " << (char *) fileb << " " << (char *) filef << endl; return 1; } int nv,nt,neb; nv = GmfStatKwd(inm,GmfVertices); nt = GmfStatKwd(inm,GmfTriangles); neb=GmfStatKwd(inm,GmfEdges); this->set(nv,nt,neb); if(verbosity) cout << pfile <<": ver " << ver << ", d "<< dim << ", nt " << nt << ", nv " << nv << " nbe: = " << nbe << endl; if(dim != Rd::d) { cerr << "Err dim == " << dim << " != " << Rd::d << endl; return 2; } if( nv<=0 && nt <=0 ) { cerr << " missing data "<< endl; return 3; } int iv[4],lab; float cr[3]; // read vertices GmfGotoKwd(inm,GmfVertices); int mxlab=0; int mnlab=0; for(int i=0;ielements[i].set(this->vertices,iv,lab); mes += this->elements[i].mesure(); } } /* read mesh segement */ mesb=0; GmfGotoKwd(inm,GmfEdges); for(int i=0;i0 && iv[0]<=nv && iv[1]>0 && iv[1]<=nv); for (int j=0;j<2;j++) iv[j]--; this->borderelements[i].set(vertices,iv,lab); mesb += this->borderelements[i].mesure(); } GmfCloseMesh(inm); return(0); // OK } int Mesh2::Save(const string & filename) { int ver = GmfFloat, outm; if ( !(outm = GmfOpenMesh(filename.c_str(),GmfWrite,ver,2)) ) { cerr <<" -- Mesh2::Save UNABLE TO OPEN :"<< filename << endl; return(1); } float fx,fy; GmfSetKwd(outm,GmfVertices,this->nv); for (int k=0; kvertices[k]; GmfSetLin(outm,GmfVertices,fx=P.x,fy=P.y,P.lab); } GmfSetKwd(outm,GmfTriangles,nt); for (int k=0; kelements[k]); int i0=this->operator()(K[0])+1; int i1=this->operator()(K[1])+1; int i2=this->operator()(K[2])+1; int lab=K.lab; GmfSetLin(outm,GmfTriangles,i0,i1,i2,lab); } GmfSetKwd(outm,GmfEdges,nbe); for (int k=0; kborderelements[k]); int i0=this->operator()(K[0])+1; int i1=this->operator()(K[1])+1; int lab=K.lab; GmfSetLin(outm,GmfEdges,i0,i1,lab); } GmfCloseMesh(outm); return (0); } const string Gsbegin="Mesh2::GSave v0",Gsend="end"; template void GSave2(FILE * ff,const Mesh & Th) { PlotStream f(ff); f << Gsbegin ; int nbe=Th.nbBrdElmts(); f << Th.nv << Th.nt << nbe; for (int k=0; k(FILE * ff,const Mesh2 & Th) ; template void GSave2(FILE * ff,const Mesh & Th) ; Mesh2::Mesh2(FILE *f) { GRead(f); assert( (nt >= 0 || nbe>=0) && nv>0) ; BuildBound(); if(verbosity>1) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } if(verbosity>1) cout << " -- Mesh2 (File *), d "<< 2 << ", n Tet " << nt << ", n Vtx " << nv << " n Bord " << nbe << endl; } void Mesh2::GRead(FILE * ff) { PlotStream f(ff); string s; f >> s; ffassert( s== Gsbegin); f >> nv >> nt >> nbe; if(verbosity>1) cout << " GRead : nv " << nv << " " << nt << " " << nbe << endl; this->vertices = new Vertex[nv]; this->elements = new Element [nt]; this->borderelements = new BorderElement[nbe]; for (int k=0; kvertices[k]; f >> P.x >>P.y >> P.lab ; } mes=0.; mesb=0.; if(nt != 0) { for (int k=0; kelements[k]); f >> i[0] >> i[1] >> i[2] >> lab; K.set(this->vertices,i,lab); mes += K.mesure(); } } for (int k=0; kborderelements[k]); f >> i[0] >> i[1] >> lab; K.set(this->vertices,i,lab); mesb += K.mesure(); } f >> s; ffassert( s== Gsend); } /* int Mesh2::Popen(const FILE *namestream) { int ver = GmfFloat; int dimp =2; float fx,fy; FILE *popenstream; popenstream = namestream; fprintf(popenstream,"MeshVersionFormatted\n"); fprintf(popenstream,"%i\n",ver); fprintf(popenstream,"Dimension\n"); fprintf(popenstream,"%i\n",dimp); fprintf(popenstream,"Vertices\n"); fprintf(popenstream,"%i\n",this->nv); for (int k=0; kvertices[k]; fx=P.x; fy=P.y; fprintf(popenstream,"%f %f %i\n",fx,fy,P.lab); } fprintf(popenstream,"Triangles\n"); fprintf(popenstream,"%i\n",this->nt); for (int k=0; kelements[k]); int i0=this->operator()(K[0])+1; int i1=this->operator()(K[1])+1; int i2=this->operator()(K[2])+1; int lab=K.lab; fprintf(popenstream,"%i %i %i %i\n",i0,i1,i2,lab); } fprintf(popenstream,"Edges\n"); for (int k=0; kborderelements[k]); int i0=this->operator()(K[0])+1; int i1=this->operator()(K[1])+1; int lab=K.lab; fprintf(popenstream,"%i %i %i\n",i0,i1,lab); } return (0); } */ Mesh2::Mesh2(int nnv, int nnt, int nnbe, Vertex2 *vv, Triangle2 *tt, BoundaryEdge2 *bb) { nv = nnv; nt = nnt; nbe =nnbe; vertices = vv; elements = tt; borderelements = bb; mes=0.; mesb=0.; for (int i=0;ielements[i].mesure(); for (int i=0;ibe(i).mesure(); //if(nnt !=0){ //BuildBound(); //BuildAdj(); //Buildbnormalv(); //BuildjElementConteningVertex(); //BuildGTree(); //decrement(); //} if(verbosity>1) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; } } freefem++-3.38-1/src/femlib/Mesh2dn.hpp000644 000767 000024 00000007570 11651763423 017663 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 2d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef MESH2DN_HPP_ #define MESH2DN_HPP_ namespace Fem2D { #include "R2.hpp" } #include "GenericMesh.hpp" #include #include using namespace std; namespace Fem2D { typedef GenericVertex Vertex2; struct DataTriangle2 { static const int NbOfVertices =3; static const int NbOfFaces =1; static const int NbOfEdges =3; static const int NT =0; static const int NbOfAdjElem =NbOfVertices; static const int NbOfVertexOnHyperFace =NbOfVertices-1; typedef Vertex2 V; typedef V::Rd Rd ; static R mesure( V * pv[NbOfVertices]) { return det(*pv[0],*pv[1],*pv[2])*0.5; } typedef R2 RdHat; typedef R1 RdHatBord; static RdHat PBord(const int * nvb,const RdHatBord & P) { return RdHat::KHat[nvb[0]]*(1-P.x)+R2::KHat[nvb[1]]*(P.x) ;} // static const int (* const nvface)[3];// = nvfaceTria ; //static const int (* const nvedge)[2];// = nvedgeTrai; }; struct DataSeg2 { static const int NbOfVertices =2; static const int NbOfEdges =1; static const int NbOfFaces =0; static const int NT =0; static const int NbOfAdjElem =NbOfVertices; static const int NbOfVertexOnHyperFace =NbOfVertices-1; typedef Vertex2 V; typedef V::Rd Rd; static R mesure( V * pv[NbOfVertices]) { return R2(*pv[0],*pv[1]).norme(); } typedef R1 RdHat; typedef R0 RdHatBord; static RdHat PBord(const int * nvb,const RdHatBord &P) { return RdHat(*nvb) ;} //static const int (* const nvface)[3];// = nvfaceSeg ; //static const int (* const nvedge)[2];// = nvedgeSeg; }; class Triangle2: public GenericElement { public: Triangle2() {}; // constructor empty for array R2 H(int i) const { ASSERTION(i>=0 && i <3); R2 E=Edge(i);return E.perp()/(2.*this->mesure());} // heigth void Gradlambda(R2 * GradL) const { GradL[1]= H(1); GradL[2]= H(2); GradL[0]=-GradL[1]-GradL[2]; } }; class BoundaryEdge2: public GenericElement { public: BoundaryEdge2() {}; // constructor empty for array }; template void GSave2(FILE * ff,const Mesh & Th) ; class Mesh2 : public GenericMesh { public: Mesh2(const char *); // Mesh2(int nnv, int nnt, int nnbe, Vertex2 *vv, Triangle2 *tt, BoundaryEdge2 *bb); const Element * Find( R2 P, R2 & Phat,bool & outside,const Element * tstart) const; int Save(const string & filename); //int Popen(const FILE *namestream); Mesh2(FILE *f); void GSave(FILE * f) const { return GSave2(f,*this);} void GRead(FILE * f); private: int load(const string & filename); Mesh2(const Mesh2 &); // pas de construction par copie void operator=(const Mesh2 &);// pas affectation par copy }; } #endif freefem++-3.38-1/src/femlib/Mesh3dn.cpp000644 000767 000024 00000113125 12542574413 017650 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include #include #include "libmesh5.h" #include "ufunction.hpp" #include "error.hpp" #include "RNM.hpp" namespace Fem2D { } #include "Mesh2dn.hpp" #include "Mesh3dn.hpp" #include "rgraph.hpp" #include "fem.hpp" #include "PlotStream.hpp" namespace Fem2D { /* const short int v_tet_face[4][3]= {{3,2,1},{0,2,3},{ 3,1,0},{ 0,1,2}}; const short int a_tet_face[4][3]= {{ 0,1,0},{ 0,2,0},{ 0,3,1},{ 1,2,1}}; const bool sig_tet_face[4][3]= {{ 0,1,0},{ 1,0,1},{ 0,1,0},{ 1,0,1}}; const short int v_tet_edge[6][2]= {{ 1,2},{1,3},{1,4},{2,3},{2,4},{3,4}}; const short int fadj_tet_edge[6][2]= {{4,3},{2,4},{3,2},{4,1},{1,3},{2,1}}; const short int op_tet_edge[6]={ 6, 5, 4, 3, 2, 1}; */ // Attention nvfaceTet donnne les faces les 4 faces de tet telle que la // tel que le tet forme des trois sommet + l'autre sommet soit positif. // donc le produit vectoriel des 2 aretes (0,1) (0,2) donne une normale interieur. // Ok pour les gradients des $\lambda_i$ static const int nvfaceTet[4][3] ={{3,2,1}, {0,2,3},{ 3,1,0},{ 0,1,2}} ;//{ {2,1,3},{0,2,3},{1,0,3},{0,1,2} }; static const int nvedgeTet[6][2] = { {0,1},{0,2},{0,3},{1,2},{1,3},{2,3} }; static const int nvfaceTria[1][3] = { {0,1,2} }; static const int nvedgeTria[3][2] = { {1,2},{2,0},{0,1}}; static const int nvfaceSeg[1][3] = {{-1,-1,1}}; static const int nvedgeSeg[1][2] = { {0,1} }; template<> const int (* const GenericElement::nvface)[3] = nvfaceTria ; template<> const int (* const GenericElement::nvedge)[2] = nvedgeTria ; template<> const int (* const GenericElement::nvadj)[2] = nvedgeTria ; template<> const int GenericElement::nitemdim[4] = {3,3,1,0 } ; static const int onWhatIsEdge3[3][7] = { {0,1,3, 2,0,0, 0}, // edge 0 {3,0,1, 0,2,0, 0}, {1,3,0, 0,0,2, 0} }; template<> const int (* const GenericElement::onWhatBorder)[7] = onWhatIsEdge3 ; template<> const int (* const GenericElement::nvface)[3] = nvfaceTet ; template<> const int (* const GenericElement::nvedge)[2] = nvedgeTet ; template<> const int (* const GenericElement::nvadj)[3] = nvfaceTet ; template<> const int GenericElement::nitemdim[4] = {4,6,4,1 } ; int onWhatIsFace[4][15] ; typedef const int (*const PtrConst15int) [15]; // a pointeur on const arry of 15 int. (to help xcode) // static const int (* const SetonWhatIsFace(int onWhatIsFace[4][15] ,const int nvfaceTet[4][3],const int nvedgeTet[6][2]))[15]; static PtrConst15int SetonWhatIsFace(int onWhatIsFace[4][15] ,const int nvfaceTet[4][3],const int nvedgeTet[6][2]); template<> const int (* const GenericElement::onWhatBorder)[15] = SetonWhatIsFace(onWhatIsFace,nvfaceTet,nvedgeTet) ; template<> int GenericMesh::kfind=0; template<> int GenericMesh::kthrough=0; // const int (* const SetonWhatIsFace(int onWhatIsFace[4][15] ,const int nvfaceTet[4][3],const int nvedgeTet[6][2]))[15] PtrConst15int SetonWhatIsFace(int onWhatIsFace[4][15] ,const int nvfaceTet[4][3],const int nvedgeTet[6][2]) { for(int i=0;i<15;++i) for(int j=0;j<4;++j) onWhatIsFace[j][i]=0; for(int j=0;j<4;++j) for(int i=0;i<3;++i) onWhatIsFace[j][nvfaceTet[j][i]]=1; for(int j=0;j<4;++j) { onWhatIsFace[j][j+4+6]=3; int ff[]={0,0,0,0}; int jo=1+2+3-nvfaceTet[j][0]-nvfaceTet[j][1]-nvfaceTet[j][2]; ff[jo]=1; for(int i=0;i<6;++i) if(ff[nvedgeTet[i][0]]+ff[nvedgeTet[i][1]]==0) onWhatIsFace[j][i+4]=2; } if(0) for(int j=0;j<4;++j) { for(int i=0;i<15;++i) cout << onWhatIsFace[j][i] << " "; cout << endl; } return onWhatIsFace; } void Add(int *p,int n,int o) { for(int i=0;i2) cout << " -- Mesh3: Read On file \"" < 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } if(verbosity>2) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; if(verbosity) cout << " -- Mesh3 : "<=0); // add F. Hecht sep 2009. } // Add by J. Morice 11/10 // compute the hmin in a 3d mesh // Remark: on peut le mettre dans generic mesh // (attention aux boucles sur les arrtes) double Mesh3::hmin() const{ R3 Pinf(1e100,1e100,1e100),Psup(-1e100,-1e100,-1e100); // Extremit de la bote englobante double hmin=1e10; for (int ii=0;ii< this->nv;ii++){ R3 P( vertices[ii].x, vertices[ii].y, vertices[ii].z); Pinf=Minc(P,Pinf); Psup=Maxc(P,Psup); } for (int k=0;knt;k++){ for (int e=0;e<6;e++){ if( this->elements[k].lenEdge(e) < Norme2(Psup-Pinf)/1e9 ) { const Tet & K(this->elements[k]); int iv[4]; for(int jj=0; jj <4; jj++){ iv[jj] = this->operator()(K[jj]); } for (int eh=0;eh<6;eh++){ if(verbosity>2) cout << "tetrahedra: " << k << " edge : " << eh << " lenght "<< this->elements[k].lenEdge(eh) << endl; } if(verbosity>2) cout << " A tetrahedra with a very small edge was created " << endl; return 1; } hmin=min(hmin,this->elements[k].lenEdge(e)); // calcul de .lenEdge pour un Mesh3 } } for (int k=0;knbe;k++){ for (int e=0;e<3;e++){ if( this->be(k).lenEdge(e) < Norme2(Psup-Pinf)/1e9 ) { for (int eh=0;eh<3;e++){ cout << "triangles: " << k << " edge : " << eh << " lenght "<< this->be(k).lenEdge(e) << endl; } cout << " A triangle with a very small edges was created " << endl; return 1; } hmin=min(hmin,this->be(k).lenEdge(e)); // calcul de .lenEdge pour un Mesh3 } } ffassert(hmin>Norme2(Psup-Pinf)/1e9); return hmin; } // Read a mesh with correct the mesh : // 1) delete multiple points defined // 2) delete points which is not in element or in border element Mesh3::Mesh3(const string filename, const long change) { int ok=load(filename); cout << "read mesh ok " << ok << endl; cout << ", nt " << nt << ", nv " << nv << " nbe: = " << nbe << endl; if(ok) { ifstream f(filename.c_str()); if(!f) { cerr << " -- Mesh3::Mesh3 Erreur openning " << filename<2) cout << " -- Mesh3: Read On file \"" <nt,this-nbe,vvv,tt,bb); delete [] newNumero_Som; } else{ cout << " no need to change the mesh " << endl; } delete [] Numero_Som; } BuildBound(); if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } if(verbosity>2) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; if(verbosity) cout << " -- Mesh3 : "<=0); // add F. Hecht sep 2009. } // Fin Add by J. Morice nov 2010 // Add J. Morice 12/2010 void Mesh3::TrueVertex() { // verification multiple points double hseuil=hmin(); hseuil =hseuil/10; cout << " hseuil = " << hseuil << endl; KN Numero_Som(this->nv); Vertex *vv=new Vertex[this->nv]; int nv_t=0; { R3 Pinf(1e100,1e100,1e100),Psup(-1e100,-1e100,-1e100); for (int ii=0;ii< this->nv;ii++){ R3 P( vertices[ii].x, vertices[ii].y, vertices[ii].z); Pinf=Minc(P,Pinf); Psup=Maxc(P,Psup); } EF23::GTree *gtree = new EF23::GTree(vv,Pinf,Psup,0); // creation of octree for (int ii=0;iinv;ii++){ const R3 r3vi( this->vertices[ii].x, this->vertices[ii].y, this->vertices[ii].z ); const Vertex3 &vi(r3vi); Vertex3 * pvi=gtree->ToClose(vi,hseuil); if(!pvi){ vv[nv_t].x = vi.x; vv[nv_t].y = vi.y; vv[nv_t].z = vi.z; vv[nv_t].lab = this->vertices[ii].lab; // lab mis a zero par default Numero_Som[ii] = nv_t; gtree->Add( vv[nv_t] ); nv_t=nv_t+1; } else{ Numero_Som[ii] = pvi-vv; } } delete gtree; //delete [] vv; } // general case KN takevertex(nv_t,0); for (int k=0; kborderelements[k]); for(int jj=0; jj<3; jj++){ takevertex[ Numero_Som[this->operator()(K[jj])] ] = 1; } } for(int k=0; k< this->nt; k++){ const Element & K(this->elements[k]); for(int jj=0; jj<4; jj++){ takevertex[ Numero_Som[this->operator()(K[jj])] ] = 1; } } int newvertex=0; for(int iv=0; ivnv){ // determination of vertex Vertex *vvv = new Vertex[ newvertex ]; KN newNumero_Som(nv_t); int iii=0; for(int iv=0; iv< nv_t; iv++){ if( takevertex[iv ] == 1 ){ vvv[iii].x = vv[iv].x; vvv[iii].y = vv[iv].y; vvv[iii].z = vv[iv].z; vvv[iii].lab = vv[iv].lab; // lab mis a zero par default newNumero_Som[iv] = iii; iii++; } } ffassert( newvertex== iii ); Element *tt; if(this->nt !=0) tt=new Element[this->nt]; BorderElement *bb = new BorderElement[this->nbe]; Element *ttt=tt; BorderElement *bbb=bb; for (int k=0; knbe; k++) { const BorderElement & K(this->borderelements[k]); int iv[3]; for(int jj=0; jj<3; jj++){ iv[jj] = Numero_Som[this->operator()(K[jj])]; iv[jj] = newNumero_Som[iv[jj]]; } (bbb++)->set(vvv,iv,K.lab); } for(int k=0; k< this->nt; k++){ const Element & K(this->elements[k]); int iv[4]; for(int jj=0; jj<4; jj++){ iv[jj] = Numero_Som[this->operator()(K[jj])]; iv[jj] = newNumero_Som[iv[jj]]; } (ttt++)->set(vvv,iv,K.lab); } cout << " delete vertices + autre " << endl; delete [] vertices; delete [] elements; delete [] borderelements; nv = newvertex; vertices = vvv; elements = tt; borderelements = bb; //&this = new Mesh3(newvertex,this->nt,this-nbe,vvv,tt,bb); delete [] newNumero_Som; } else{ cout << " no need to change the mesh " << endl; } delete [] Numero_Som; BuildBound(); if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } if(verbosity>2) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; if(verbosity) cout << " -- Mesh3 : d "<< 3 << ", n Tet " << nt << ", n Vtx " << nv << " n Bord " << nbe << endl; ffassert(mes>=0); // add F. Hecht sep 2009. } // Fin Add J. Morice 12/2010 void Mesh3::read(istream &f) { // read the mesh int i; // f >> nv >> nt >> neb ; string str; int err=0; while(!f.eof()) { f >> str; //cout << str << endl; if( str== "Vertices") { f >> nv; assert(!this->vertices ); if(verbosity>2) cout << " -- Nb of Vertex " << nv << endl; this->vertices = new Vertex[nv]; for (i=0;i> this->vertices[i]; assert(f.good()); } } else if (str=="Tetrahedra") { f >> nt; assert(this->vertices && !this->elements); this->elements = new Element [nt]; mes=0; assert(this->elements); if(verbosity>2) cout << " -- Nb of Elements " << nt << endl; for (int i=0;it(i).Read1(f,this->vertices,this->nv); if(this->t(i).mesure()<=0) err++; // Modif FH nov 2014 mes += this->t(i).mesure(); } } else if (str=="Triangles") { mesb=0; int kmv=0,ij; f >> nbe; assert(vertices); this->borderelements = new BorderElement[nbe]; if(verbosity>2) cout << " -- Nb of border Triangles " << nbe << endl; for (i=0;ibe(i).Read1(f,this->vertices,this->nv); mesb += this->be(i).mesure(); for(int j=0;j<3;++j) if(!vertices[ij=this->be(i,j)].lab) { vertices[ij].lab=1; kmv++; } } } else if(str[0]=='#') {// on mange la ligne int c; while ( (c=f.get()) != '\n' && c != EOF) //cout << c << endl; ; } } assert( (nt >= 0 || nbe>=0) && nv>0) ; /* done at up level ... BuildBound(); if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } */ if(err!=0) { cerr << " Mesh3::read: sorry bad mesh. Number of negative Tet " << err << endl; this->~Mesh3(); ffassert(0); } } int Mesh3::load(const string & filename) { int bin; int ver,inm,dim; int lf=filename.size()+20; KN fileb(lf),filef(lf); char *data = new char[filename.size()+1]; size_t ssize = filename.size()+1; char *ptr; char *pfile; strncpy( data, filename.c_str(),ssize); ptr = strstr(data,".mesh"); if( !ptr ){ strcpy(filef,filename.c_str()); strcpy(fileb,filef); strcat(filef,".mesh"); strcat(fileb,".meshb"); if( (inm=GmfOpenMesh(pfile=fileb, GmfRead,&ver,&dim)) ) bin=true; else if( (inm=GmfOpenMesh(pfile=filef, GmfRead,&ver,&dim)) ) bin=false; else if(verbosity>5){ cerr << " Erreur ouverture file " << (char *) fileb << " " << (char *) filef <5) cerr << " Erreur ouverture file " << (char *) data << endl; return 1; } } int nv=-1,nt=-1,neb=-1; nv = GmfStatKwd(inm,GmfVertices); nt = GmfStatKwd(inm,GmfTetrahedra); neb= GmfStatKwd(inm,GmfTriangles); this->set(nv,nt,neb); if(verbosity>1) cout << " -- Mesh3(load): "<< (char *) data <<", ver " << ver << ", d "<< dim << ", nt " << nt << ", nv " << nv << " nbe: = " << nbe << endl; if(dim != 3) { cerr << "Err dim == " << dim << " !=3 " < 0) { if(mnlab==0 && mxlab==0 ) { int kmv=0; mesb=0; GmfGotoKwd(inm,GmfTriangles); for(int i=0;ibe(i).set(this->vertices,iv,lab); mesb += this->be(i).mesure(); } if(kmv&& verbosity>1) cout << " Aucun label Hack (FH) ??? => 1 sur les triangle frontiere "<be(i).set(this->vertices,iv,lab); mesb += this->be(i).mesure(); } } } if(nt>0) { /* read mesh tetrahedra */ GmfGotoKwd(inm,GmfTetrahedra); for(int i=0;i0 && iv[0]<=nv && iv[1]>0 && iv[1]<=nv && iv[2]>0 && iv[2]<=nv && iv[3]>0 && iv[3]<=nv); for (int j=0;j<4;j++) iv[j]--; this->elements[i].set(vertices,iv,lab); mes += this->elements[i].mesure(); } } GmfCloseMesh(inm); return 0; // OK } const string Gsbegin="Mesh3::GSave v0",Gsend="end"; void Mesh3::GSave(FILE * ff,int offset) const { PlotStream f(ff); f << Gsbegin ; f << nv << nt << nbe; for (int k=0; kvertices[k]; f << P.x <elements[k]); int i0=this->operator()(K[0])+offset; int i1=this->operator()(K[1])+offset; int i2=this->operator()(K[2])+offset; int i3=this->operator()(K[3])+offset; int lab=K.lab; f << i0 << i1 << i2 << i3 << lab; } } for (int k=0; kborderelements[k]); int i0=this->operator()(K[0])+offset; int i1=this->operator()(K[1])+offset; int i2=this->operator()(K[2])+offset; int lab=K.lab; f << i0 << i1 << i2 << lab; } f << Gsend; } Mesh3::Mesh3(const Serialize &serialized) :GenericMesh (serialized) { BuildBound(); if(verbosity>1) cout << " -- End of serialized: mesure = " << mes << " border mesure " << mesb << endl; if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } if(verbosity>1) cout << " -- Mesh3 (serialized), d "<< 3 << ", n Tet " << nt << ", n Vtx " << nv << " n Bord " << nbe << endl; ffassert(mes>=0); // add F. Hecht sep 2009. } Mesh3::Mesh3(FILE *f,int offset) { GRead(f,offset);// remove 1 assert( (nt >= 0 || nbe>=0) && nv>0) ; BuildBound(); if(verbosity>2) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } if(verbosity>2) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; if(verbosity>1) cout << " -- Mesh3 (File *), d "<< 3 << ", n Tet " << nt << ", n Vtx " << nv << " n Bord " << nbe << endl; ffassert(mes>=0); // add F. Hecht sep 2009. } void Mesh3::GRead(FILE * ff,int offset) { PlotStream f(ff); string s; f >> s; ffassert( s== Gsbegin); f >> nv >> nt >> nbe; if(verbosity>2) cout << " GRead : nv " << nv << " " << nt << " " << nbe << endl; this->vertices = new Vertex[nv]; this->elements = new Element [nt]; this->borderelements = new BorderElement[nbe]; for (int k=0; kvertices[k]; f >> P.x >>P.y >> P.z >> P.lab ; } mes=0.; mesb=0.; if(nt != 0) { for (int k=0; kelements[k]); f >> i[0] >> i[1] >> i[2] >> i[3] >> lab; Add(i,4,offset); K.set(this->vertices,i,lab); mes += K.mesure(); } } for (int k=0; kborderelements[k]); f >> i[0] >> i[1] >> i[2] >> lab; Add(i,3,offset); K.set(this->vertices,i,lab); mesb += K.mesure(); } f >> s; ffassert( s== Gsend); } void Mesh3::readmsh(ifstream & f,int offset) { int err=0; f >> nv >> nt >> nbe; if(verbosity>2) cout << " GRead : nv " << nv << " " << nt << " " << nbe << endl; this->vertices = new Vertex[nv]; this->elements = new Element [nt]; this->borderelements = new BorderElement[nbe]; for (int k=0; kvertices[k]; f >> P.x >>P.y >> P.z >> P.lab ; } mes=0.; mesb=0.; if(nt != 0) { for (int k=0; kelements[k]); f >> i[0] >> i[1] >> i[2] >> i[3] >> lab; Add(i,4,offset); K.set(this->vertices,i,lab); mes += K.mesure(); err += K.mesure() <0; } } for (int k=0; kborderelements[k]); f >> i[0] >> i[1] >> i[2] >> lab; Add(i,3,offset); K.set(this->vertices,i,lab); mesb += K.mesure(); } if(err!=0) { cerr << " Mesh3::readmsh : sorry bad mesh. Number of negative Tet " << err << endl; this->~Mesh3(); ffassert(0); } } int Mesh3::Save(const string & filename) const { int ver = GmfFloat, outm; if ( !(outm = GmfOpenMesh(filename.c_str(),GmfWrite,ver,3)) ) { cerr <<" -- Mesh3::Save UNABLE TO OPEN :"<< filename << endl; return(1); } float fx,fy,fz; GmfSetKwd(outm,GmfVertices,this->nv); for (int k=0; kvertices[k]; GmfSetLin(outm,GmfVertices,fx=P.x,fy=P.y,fz=P.z,P.lab); } if(nt != 0){ GmfSetKwd(outm,GmfTetrahedra,nt); for (int k=0; kelements[k]); int i0=this->operator()(K[0])+1; int i1=this->operator()(K[1])+1; int i2=this->operator()(K[2])+1; int i3=this->operator()(K[3])+1; int lab=K.lab; GmfSetLin(outm,GmfTetrahedra,i0,i1,i2,i3,lab); } } GmfSetKwd(outm,GmfTriangles,nbe); for (int k=0; kborderelements[k]); int i0=this->operator()(K[0])+1; int i1=this->operator()(K[1])+1; int i2=this->operator()(K[2])+1; int lab=K.lab; GmfSetLin(outm,GmfTriangles,i0,i1,i2,lab); } GmfCloseMesh(outm); return (0); } int Mesh3::SaveSurface(const string & filename) const { int ver = GmfFloat, outm; if ( !(outm = GmfOpenMesh(filename.c_str(),GmfWrite,ver,3)) ) { cerr <<" -- Mesh3::Save UNABLE TO OPEN :"<< filename << endl; return(1); } // Number of Vertex in the surface int *v_num_surf=new int[nv]; int *liste_v_num_surf=new int[nv]; for (int k=0; kborderelements[k]); for(int jj=0; jj<3; jj++){ int i0=this->operator()(K[jj]); if( v_num_surf[i0] == -1 ){ v_num_surf[i0] = nbv_surf; liste_v_num_surf[nbv_surf]= i0; nbv_surf++; } } } float fx,fy,fz; GmfSetKwd(outm,GmfVertices,nbv_surf); for (int k=0; kvertices[k0]; GmfSetLin(outm,GmfVertices,fx=P.x,fy=P.y,fz=P.z,P.lab); } GmfSetKwd(outm,GmfTriangles,nbe); for (int k=0; kborderelements[k]); int i0=v_num_surf[this->operator()(K[0])]+1; int i1=v_num_surf[this->operator()(K[1])]+1; int i2=v_num_surf[this->operator()(K[2])]+1; int lab=K.lab; assert( i0-1 < nbv_surf && i1-1 < nbv_surf && i2-1 < nbv_surf ); assert( 0borderelements[k]); for(int jj=0; jj<3; jj++){ int i0=this->operator()(K[jj]); if( v_num_surf[i0] == -1){ v_num_surf[i0] = nbv_surf; nbv_surf++; } } } // file .points FILE *fpoints = fopen(filename1.c_str(),"w"); fprintf(fpoints,"%i\n",nbv_surf); for (int k=0; kvertices[k]; fprintf(fpoints,"%f %f %f %i\n",P.x,P.y,P.z,P.lab); } fclose(fpoints); // file .faces FILE *ffaces = fopen(filename2.c_str(),"w"); fprintf(ffaces,"%i\n",nbe); for (int k=0; kborderelements[k]); int i0=this->operator()(K[0]); int i1=this->operator()(K[1]); int i2=this->operator()(K[2]); int lab=K.lab; int label0= this->vertices[i0].lab; int label1= this->vertices[i1].lab; int label2= this->vertices[i2].lab; //GmfSetLin(outm,GmfTriangles,i0,i1,i2,lab); int nature=3; int i0v=v_num_surf[i0]+1; int i1v=v_num_surf[i1]+1; int i2v=v_num_surf[i2]+1; assert( i0v-1 < nbv_surf && i1v-1 < nbv_surf && i2v-1 < nbv_surf ); assert( 0elements[i].mesure(); for (int i=0;ibe(i).mesure(); // Add FH to be consitant we all constructor ... July 09 BuildBound(); if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } // end add if(verbosity>1) cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; // if(verbosity>1) // cout << " -- End of read: mesure = " << mes << " border mesure " << mesb << endl; assert(mes>=0.); } Mesh3::Mesh3(int nnv, int nnbe, Vertex3 *vv, Triangle3 *bb) { nv = nnv; nbe =nnbe; vertices = vv; borderelements = bb; mes=0.; mesb=0.; for (int i=0;ibe(i).mesure(); // Add FH to be consitant we all constructor ... July 09 BuildBound(); if(nt > 0){ BuildAdj(); Buildbnormalv(); BuildjElementConteningVertex(); } // end add if(verbosity>1) cout << " -- End of Construct mesh3: mesure = " << mes << " border mesure " << mesb << endl; ffassert(mes>=0); // add F. Hecht sep 2009. } void Mesh3::flipSurfaceMesh3(int surface_orientation) { /* inverse the orientation of the surface if necessary*/ /* and control that all surfaces are oriented in the same way*/ int nbflip=0; for (int i=0;inbe;i++) { double mes_triangle3= this->be(i).mesure(); if( surface_orientation*mes_triangle3 < 0){ const Triangle3 &K( this->be(i) ); int iv[3]; iv[0] = this->operator()(K[0]); iv[1] = this->operator()(K[1]); iv[2] = this->operator()(K[2]); int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; this->be(i).set( this->vertices, iv, K.lab ) ; nbflip++; } } assert(nbflip==0 || nbflip== this->nbe); } int signe_permutation(int i0,int i1,int i2,int i3) { int p=1; if(i0>i1) Exchange(i0,i1), p = -p; if(i0>i2) Exchange(i0,i2), p = -p; if(i0>i3) Exchange(i0,i3), p = -p; if(i1>i2) Exchange(i1,i2), p = -p; if(i1>i3) Exchange(i1,i3), p = -p; if(i2>i3) Exchange(i2,i3), p = -p; return p; } int WalkInTet(const Mesh3 & Th,int it, R3 & Phat,const R3 & U, R & dt) { const R eps = 1e-8; // corrected by F.H 23 juin 2015 bool ddd=verbosity>2000; bool nomove=true; R lambda[4],dl[4],cl[4]; Phat.toBary(lambda); if(ddd) cout << "\n\t\t\tWT: " << Phat << " : " << lambda[0] << " " <-0.0000001); #endif typedef R3 Rd; const Mesh3::Element & T(Th[it]); const int nve = 4; const Rd Q[nve]={(const R3) T[0],(const R3) T[1],(const R3) T[2],(const R3) T[3]}; Rd P =T(Phat); // cout << " " << u << " " << v ; Rd PF = P + U*dt; Rd PFK= PF; // couleur(15);MoveTo( P); LineTo( PF); R l[nve]; double Det=T.mesure()*6; l[0] = det(PF ,Q[1],Q[2],Q[3]); l[1] = det(Q[0],PF ,Q[2],Q[3]); l[2] = det(Q[0],Q[1],PF ,Q[3]); l[3] = Det - l[0]-l[1]-l[2]; l[0] /= Det; l[1] /= Det; l[2] /= Det; l[3] /= Det; if (l[0]>-eps && l[1]>-eps && l[2]>-eps && l[3]>-eps) { // a fini .... ouf ... dt =0; Phat=R3(l+1); nomove=false; return -1; } // l(Q) = lambda + dl *coef avec Q= P+ U*dt*coef // coef > 0 et segement [PQ] dans K .. et Q \in \partial K // recherche de la face de sortie .. dl[0]= l[0]-lambda[0]; dl[1]= l[1]-lambda[1]; dl[2]= l[2]-lambda[2]; dl[3]= l[3]-lambda[3]; // attention a inf et NaN possible ci FH.. cl[0]= -lambda[0]/dl[0]; cl[1]= -lambda[1]/dl[1]; cl[2]= -lambda[2]/dl[2]; cl[3]= -lambda[3]/dl[3]; // min positif int kf=-1; double cf=1;// 1 min positif < 1. if(cl[0]>0. && cl[0] < cf) cf=cl[kf=0]; // OK NaN or Inf test are wrong in any case .. if(cl[1]>0. && cl[1] < cf) cf=cl[kf=1]; if(cl[2]>0. && cl[2] < cf) cf=cl[kf=2]; if(cl[3]>0. && cl[3] < cf) cf=cl[kf=3]; if(kf>=0) { double cf1 = 1-cf; // point de sortie en temps dt*cf .. ?? l[0]-= dl[0]*cf1; l[1]-= dl[1]*cf1; l[2]-= dl[2]*cf1; l[3]-= dl[3]*cf1; PFK = P + U*(dt*cf); // final point in tet. } // on sort en temp cf*dt if(ddd) cout << "\t\t\t WT " << it << ", " << Phat << ", PFK=" << PFK << " : " << l[0] << " " <=0) // sortie positive .. { // on regarde de les reelement negatif // on ne veut pas des points sur les faces. // car sinon il va y avoir un probleme ans on va projete sur la face // et remettre le point dans le tetraedre. if (l[0]<=-eps ) neg[k++]=0; if (l[1]<=-eps ) neg[k++]=1; if (l[2]<=-eps ) neg[k++]=2; if (l[3]<=-eps ) neg[k++]=3; //R eps1 = T.mesure() * 1.e-5; if(ddd) cout << "\t\t\t k= " << k << endl; if (k>1) // 2 .. 3 face de sortie possible { // regarde sorti interne .. int pos[4]; int kp =0; if (l[0]<0 ) pos[kp++]=0; if (l[1]<0 ) pos[kp++]=1; if (l[2]<0 ) pos[kp++]=2; if (l[3]<0 ) pos[kp++]=3; if(kp>0) kk=pos[randwalk(kp)];// else kk=neg[randwalk(k)]; } else if (k==1) // une face possible de sortie (cas simple) kk = neg[0]; if(kk>=0) { if ( l[kk] ) // on bouge et on arete avant la fin ... { R coef1 = 1-cf; nomove= (cf<1e-6); dt = dt*coef1;// temps restant } if(ddd) cout << "\t\t\t \t\t -> kk=" << kk << " , l= "<< lambda[0] << " " < recherche un point final (environ) if(dx2*dx2*dx2 > Det*Det/4) dt=0; else { dc=0.25; ddt=dt*dc; PF= P + U*ddt; // on avance que d'un 1/4 dt -= ddt; } if(ddd) cout << "\t\t\t PF = " << PF << " " << dt << " ddt = " << ddt << " " << it << " " << &PF< Find P+U*ddt*c "<< it<< " " << " -> "<< Th(K) << " dt = " << dt << " c = " << dc << " outside: "<< outside <<" , PF " << PF << endl; return 4+Th(K); } // on remet le point dans le tet. int jj=0; R lmx=lambda[0]; if (lmx "<< dt << " : " << Phat << " K(Phat) ="<< Th[it](Phat) << ", " << kk << " jj= "<< jj << " "<< lmx << endl; assert(kk<0 || lambda[kk]==0); return kk; } } // End namespace Fem2D freefem++-3.38-1/src/femlib/Mesh3dn.hpp000644 000767 000024 00000012541 11705630521 017646 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 1d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef MESH3DN_HPP_ #define MESH3DN_HPP_ #include // definition R #include namespace Fem2D { #include "R3.hpp" } using namespace ::std; #include "GenericMesh.hpp" namespace Fem2D { typedef GenericVertex Vertex3; struct DataTriangle3 { static const int NbOfVertices =3; static const int NbOfEdges =3; static const int NbOfFaces =1; static const int NT =0; static const int NbOfAdjElem =NbOfVertices; static const int NbOfVertexOnHyperFace =NbOfVertices-1; typedef Vertex3 V; typedef V::Rd Rd ; typedef R2 RdHat; typedef R1 RdHatBord; static RdHat PBord(const int * nvb,const RdHatBord &P) { return RdHat::KHat[nvb[0]]*(1-P.x)+R2::KHat[nvb[1]]*(P.x) ;} static R mesure( V * pv[NbOfVertices]) { return (R3(*pv[0],*pv[1])^R3(*pv[0],*pv[2])).norme()*0.5; } }; struct DataTet { static const int NbOfVertices =4; static const int NbOfEdges =6; static const int NbOfFaces =4; static const int NT =1; static const int NbOfAdjElem =NbOfVertices; static const int NbOfVertexOnHyperFace =NbOfVertices-1; typedef Vertex3 V; typedef V::Rd Rd ; static R mesure( V * pv[NbOfVertices]) { R3 AB(*pv[0],*pv[1]); R3 AC(*pv[0],*pv[2]); R3 AD(*pv[0],*pv[3]); return det(AB,AC,AD)/6.; } static const int (* const nvface)[3];// = nvfaceTet; static const int (* const nvedge)[2];// = nvedgeTet; typedef R3 RdHat; typedef R2 RdHatBord; static RdHat PBord(const int * nvb,const RdHatBord& P) { // cout << "PBORD : " << nvb[0] << " " << nvb[1] << nvb[2] << " " << P<< " -> " << RdHat::KHat[nvb[0]]*(1-P.x-P.y)+RdHat::KHat[nvb[1]]*(P.x)+RdHat::KHat[nvb[2]]*(P.y) // << "," << RdHat::KHat[nvb[0]] << "," << RdHat::KHat[nvb[1]] << "," << RdHat::KHat[nvb[2]] < { public: Tet() {}; // constructor empty for array R3 H(int i) const { ASSERTION(i>=0 && i <4); int nvface[4][3]= {{3,2,1}, {0,2,3},{ 3,1,0},{ 0,1,2}}; R3 AB(at(nvface[i][0]),at(nvface[i][1])); R3 AC(at(nvface[i][0]),at(nvface[i][2])); return AB^AC/(6.*this->mesure());} // heigth R3 n(int i) const { ASSERTION(i>=0 && i <4); int nvface[4][3]= {{3,2,1}, {0,2,3},{ 3,1,0},{ 0,1,2}}; R3 AB(at(nvface[i][0]),at(nvface[i][1])); R3 AC(at(nvface[i][0]),at(nvface[i][2])); R3 N=AB^AC; return N/N.norme();} // exterior normal void Gradlambda(R3 * GradL) const { R3 V1(at(0),at(1)); R3 V2(at(0),at(2)); R3 V3(at(0),at(3)); R det1=1./(6.*mesure()); GradL[1]= (V2^V3)*det1; GradL[2]= (V3^V1)*det1; GradL[3]= (V1^V2)*det1; GradL[0]=-GradL[1]-GradL[2]-GradL[3]; } }; class Triangle3: public GenericElement { public: Triangle3() {}; // constructor empty for array Rd Edge(int i) const {ASSERTION(i>=0 && i <3); return Rd(this->at((i+1)%3),this->at((i+2)%3));}// opposite edge vertex i /* Rd H(int i) const { ASSERTION(i>=0 && i <3); Rd E=Edge(i);return E.perp()/(2.*this->mesure());} // heigth void Gradlambda(Rd * GradL) const { GradL[1]= H(1); GradL[2]= H(2); GradL[0]=-GradL[1]-GradL[2]; } */ }; class Mesh3 : public GenericMesh { public: Mesh3(){} Mesh3(const string); Mesh3(const string, const long); // Add J. Morice 11/10 Mesh3(FILE *f,int offset=0); Mesh3(const Serialize &); Mesh3(int nnv, int nnt, int nnbe, Vertex3 *vv, Tet *tt, Triangle3 *bb); Mesh3(int nnv, int nnbe, Vertex3 *vv, Triangle3 *bb); // surface mesh double hmin() const; // Add J. Morice 11/10 void GSave(FILE * f,int offset=0) const ; void GRead(FILE * f,int offset); int Save(const string & filename) const ; int SaveSurface(const string & filename) const ; int SaveSurface(const string & filename1, const string & filename2) const ; void flipSurfaceMesh3(int surface_orientation); void read(istream &); void readmsh(ifstream & f,int offset); void TrueVertex(); private: int load(const string & filename); Mesh3(const Mesh3 &); // pas de construction par copie void operator=(const Mesh3 &);// pas affectation par copy }; // for the caracteristic method. int WalkInTet(const Mesh3 & Th,int it, R3 & Phat,const R3 & U, R & dt); } #endif freefem++-3.38-1/src/femlib/MeshPoint.hpp000644 000767 000024 00000025170 12304706030 020250 0ustar00hechtstaff000000 000000 //typedef double R; namespace Fem2D { class MeshPointBase { public: R3 P; R3 PHat; union { const Mesh * Th; const Mesh3 * Th3; }; union{ const Triangle * T; const Tet * T3; }; long region, t,v,f,e,gsens; // triangle,vertex, face or edge long label; R3 N; // if on boundary bool outside; int VF; int d; void set(const R2 &P2,const R2 & P_Hat,const baseFElement & K,int ll,const R2 &NN,int iedge) { P.x=P2.x; P.y=P2.y; P.z=0; PHat.x=P_Hat.x; PHat.y=P_Hat.y; PHat.z=0.; T=&K.T; Th=&K.Vh.Th; region = T->lab; label = ll; v=f=-1; e=iedge; t=(*Th)(T); throwassert( Abs( (NN,NN) -1.0) < 1e-5 ); N.x=NN.x; N.y=NN.y; N.z=0; VF=0; d=2; } void set(const Mesh & aTh,const R2 &P2,const R2 & P_Hat,const Triangle & aK,int ll,const R2 &NN,int iedge,int VFF=0) { P.x=P2.x; P.y=P2.y; P.z=0; PHat.x=P_Hat.x; PHat.y=P_Hat.y; PHat.z=0.; T=&aK; Th=&aTh; region = T->lab; label = ll; v=f=-1; t=(*Th)(T); e=iedge; throwassert( Abs( (NN,NN) -1.0) < 1e-5 ); N.x=NN.x; N.y=NN.y; N.z=0; VF=VFF; d=2; } void set(const R2 &P2,const R2 & P_Hat,const baseFElement & K,int ll) { P.x=P2.x; P.y=P2.y; P.z=0; PHat.x=P_Hat.x; PHat.y=P_Hat.y; PHat.z=0.; T=&K.T; Th=&K.Vh.Th; region = T->lab; label = ll; t=(*Th)(T); v=f=e=-1; N.x=0; N.y=0; N.z=0; VF=0; d=2; } void set(const R2 &P2,const R2 & P_Hat,const baseFElement & K) { P.x=P2.x; P.y=P2.y; P.z=0; PHat.x=P_Hat.x; PHat.y=P_Hat.y; PHat.z=0.; T=&K.T; Th=&K.Vh.Th; region = T->lab; v=f=e=-1; N.x=0; N.y=0; N.z=0; VF=0; int ll[3],kk(0); if ( P_Hat.x<1.e-6) ll[kk++]=1; if ( P_Hat.y<1.e-6) ll[kk++]=2; if ( P_Hat.y+P_Hat.x>0.999999) ll[kk++]=0; if (kk==0) label=0; else if (kk==2) { v = 3-ll[0]-ll[1];// 3 = 0+1+2 sommet oppose label=(*T)[v].lab; } else { e = ll[0]; int i1,i2; Th->VerticesNumberOfEdge(K.T,e,i1,i2); const BoundaryEdge * be=Th->TheBoundaryEdge(i1,i2); label= be ? be->lab : 0; // R2 E(K.T.Edge(ke)); // (R2 &) N = E.perp()/Norme2(E); //cout << "lab =" << label << " " << e << " " << kk << " " << P_Hat // << ": " << K.number << " , " << (R2) P << " " << N << endl; } t=(*Th)(T); d=2; } void set(const Mesh &aTh, const R2 &P2,const R2 & P_Hat,const Triangle & aK,const int ll,bool coutside=false) { P.x=P2.x; P.y=P2.y; P.z=0; PHat.x=P_Hat.x; PHat.y=P_Hat.y; PHat.z=0.; T=&aK; Th=&aTh; region = T->lab; label = ll; t= aTh(aK); // Miss correct Nov. 2012 ... v=f=e=-1; N.x=0; N.y=0; N.z=0; outside=coutside; VF=0; d=2; } void setP(const Mesh * pTh,int tt,int ss) { T=&(*pTh)[tt]; Vertex & V=(*T)[ss]; (R2 &) P= V ; P.z=0; (R2 &) PHat = TriangleHat[ss]; PHat.z=0; Th=pTh; region = T->lab; label = V.lab; t=tt; v=f=e=-1; v=ss; VF=0; d=2; } void change(const R2 & PH,const Triangle & tt,int ll) { T= &tt; (R2 &) PHat = PH; (R2 &) P = (*T)(PH); region = T->lab; label = ll; t=(*Th)(T); v=f=e=-1; VF=0; d=2; } void change(const R3 & PH,const Tet & tt,int ll) { T3= &tt; (R3 &) PHat = PH; (R3 &) P = (*T3)(PH); region = T3->lab; label = ll; t=(*Th)(T); v=f=e=-1; VF=0; d=2; } void unset() { P.x=-1e30; P.y=-1e30; P.z=-1e30; T=0; Th=0; label =0; VF=0; d=0; } bool isUnset() const { return P.x == -1e30;} // BofBof void set(R x=0.0,R y=0.0,R z=0.0) { P.x=x; P.y=y; P.z=z; T=0; Th=0; label =0; t=f=e=v=-1; VF=0; d=0; } // ------- 3D void set(const R3 &P2,const R3 & P_Hat,const baseFElement3 & K,int ll,const R3 &NN,int iface) { P=P2; PHat=P_Hat; T3=&K.T; Th3=&K.Vh.Th; region = T3->lab; label = ll; e=v=-1; f=iface; t=(*Th3)(T3); assert( Abs( (NN,NN) -1.0) < 1e-5 ); N=NN; VF=0; d=3; } void set(const Mesh3 & aTh,const R3 &P2,const R3 & P_Hat,const Tet & aK,int ll,const R3 &NN,int iface,int VFF=0) { P=P2; PHat=P_Hat; T3=&aK; Th3=&aTh; region = T3->lab; label = ll; v=f=-1; t=(*Th3)(T3); v=e=-1; f=iface; assert( Abs( (NN,NN) -1.0) < 1e-5 ); N=NN; VF=VFF; d=3; } void set(const R3 &P2,const R3 & P_Hat,const baseFElement3 & K,int ll) { P=P2; PHat=P_Hat; T3=&K.T; Th3=&K.Vh.Th; region = T3->lab; label = ll; t=(*Th)(T); v=f=e=-1; N.x=0; N.y=0; N.z=0; VF=0; d=3; } void set(const R3 &P2,const R3 & P_Hat,const baseFElement3 & K) { P=P2; PHat=P_Hat; T3=&K.T; Th3=&K.Vh.Th; region = T3->lab; v=f=e=-1; N.x=0; N.y=0; N.z=0; VF=0; int ll[4],kk(0); if ( P_Hat.x<1.e-6) ll[kk++]=1; if ( P_Hat.y<1.e-6) ll[kk++]=2; if ( P_Hat.z<1.e-6) ll[kk++]=3; if ( P_Hat.x+P_Hat.y+P_Hat.z>0.999999) ll[kk++]=0; if (kk==0) label=0; else if (kk==3) { v = 6-ll[0]-ll[1]-ll[2];// 3 = 0+1+2 sommet oppose label=(*T)[v].lab; } else { // on edge //ffassert(0); // a faire /* e = ll[0]; int i1,i2,I3; Th3->VerticesNumberOfEdge(K.T,e,i1,i2); const BoundaryEdge * be=Th3->TheBoundaryEdge(i1,i2); label= be ? be->lab : 0; */ label=-1;// to say } t=(*Th3)(T3); d=3; } void set(const Mesh3 &aTh, const R3 &P2,const R3 & P_Hat,const Tet & aK,const int ll,bool coutside=false) { P=P2; PHat=P_Hat; T3=&aK; Th3=&aTh; region = T3->lab; label = ll; t=(*Th3)(T3); v=f=e=-1; N.x=0; N.y=0; N.z=0; // area=mes; outside=coutside; VF=0; d=3; } void setP(const Mesh3 * pTh,int tt,int ss) { T3=&(*pTh)[tt]; const Mesh3::Vertex & V=(*T3)[ss]; P= V ; PHat = TetHat[ss]; Th3=pTh; region = T3->lab; label = V.lab; t=tt; v=f=e=-1; v=ss; VF=0; d=3; } // -------- }; class MeshPoint : public MeshPointBase { public: MeshPointBase other; void unset() { MeshPointBase::unset(); other.unset();} void set(const R2 &P2,const R2 & P_Hat,const baseFElement & K,int ll,const R2 &NN,int iedge) { MeshPointBase::set(P2,P_Hat,K,ll,NN,iedge); other.unset();} void set(const Mesh & aTh,const R2 &P2,const R2 & P_Hat,const Triangle & aK,int ll,const R2 &NN,int iedge) { MeshPointBase::set(aTh,P2,P_Hat,aK,ll,NN,iedge); other.unset();} void set(const Mesh & aTh,const R2 &P2,const R2 & P_Hat,const Triangle & aK,int ll,const R2 &NN,int iedge,int VFF) { MeshPointBase::set(aTh,P2,P_Hat,aK,ll,NN,iedge,VFF); other.unset();} void set(const R2 &P2,const R2 & P_Hat,const baseFElement & K) { MeshPointBase::set(P2,P_Hat,K); other.unset(); } void set(const Mesh &aTh, const R2 &P2,const R2 & P_Hat,const Triangle & aK, const int ll,bool coutside=false) { MeshPointBase::set(aTh,P2,P_Hat,aK,ll,coutside); other.unset(); } // 3d void set(const R3 &P2,const R3 & P_Hat,const baseFElement3 & K,int ll,const R3 &NN,int iedge) { MeshPointBase::set(P2,P_Hat,K,ll,NN,iedge); other.unset();} void set(const Mesh3 & aTh,const R3 &P2,const R3 & P_Hat,const Tet & aK,int ll,const R3 &NN,int iedge) { MeshPointBase::set(aTh,P2,P_Hat,aK,ll,NN,iedge); other.unset();} void set(const Mesh3 & aTh,const R3 &P2,const R3 & P_Hat,const Tet & aK,int ll,const R3 &NN,int iedge,int VFF) { MeshPointBase::set(aTh,P2,P_Hat,aK,ll,NN,iedge,VFF); other.unset();} void set(const R3 &P2,const R3 & P_Hat,const baseFElement3 & K) { MeshPointBase::set(P2,P_Hat,K); other.unset(); } void set(const Mesh3 &aTh, const R3 &P2,const R3 & P_Hat,const Tet & aK, const int ll,bool coutside=false) { MeshPointBase::set(aTh,P2,P_Hat,aK,ll,coutside); other.unset(); } // fin 3d void set(R x=0.0,R y=0.0,R z=0.0) { MeshPointBase::set(x,y,z); other.unset();} void change(const R2 & PH,const Triangle & tt,int ll) { MeshPointBase::change(PH,tt,ll); other.unset(); } void change(const R3 & PH,const Tet & tt,int ll) { MeshPointBase::change(PH,tt,ll); other.unset(); } void setP(const Mesh * pTh,int tt,int ss) { MeshPointBase::setP(pTh,tt,ss); other.unset(); } void setP(const Mesh3 * pTh,int tt,int ss) { // 3d MeshPointBase::setP(pTh,tt,ss); other.unset(); } bool operator==(const MeshPoint & mp) const { return T == mp.T && P.x == mp.P.x && P.y == mp.P.y && P.z == mp.P.z ;} bool SetAdj() { if (!(Th && T && t >=0 && e>=0)) return false;// modif if(VF==0) { int ieo=e,to=t,ie=e; t=Th->ElementAdj(t,ie); e=ie; if ( t == to && t >= 0 ) return false; int io0=VerticesOfTriangularEdge[ieo][0]; // int io1=VerticesOfTriangularEdge[ieo][1]; int i0=VerticesOfTriangularEdge[e][0]; int i1=VerticesOfTriangularEdge[e][1]; T= &(*Th)[t]; region = T->lab; R l[3]; l[1]=PHat.x; l[2]=PHat.y; l[0]=1-PHat.x-PHat.y; R le=l[io0]; l[i1]=le; l[i0]=1-le; l[3-i1-i0]=0; PHat.x=l[1]; PHat.y=l[2]; gsens = -gsens; } else { // VF = 1 + VF%2; ffassert(0); // a faire } return true; } }; ostream & operator << ( ostream &,const MeshPoint & ) ; inline static MeshPoint* MeshPointStack(Stack s) {void * p= static_cast(s)[MeshPointStackOffset];throwassert(p); return static_cast( p);} inline static void MeshPointStack(Stack s,MeshPoint* mp) {*static_cast(static_cast(s)) = mp;} #ifdef NEWFFSTACK inline static MeshPoint* MeshPointStack(void * s) {void * p= static_cast(s)[MeshPointStackOffset];throwassert(p); return static_cast( p);} inline static void MeshPointStack( void *s,MeshPoint* mp) {*static_cast(static_cast(s)) = mp;} #endif } freefem++-3.38-1/src/femlib/mortar.cpp000644 000767 000024 00000020230 11406226635 017643 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2002 // -*- Mode : c++ -*- // // SUMMARY : Mortar model ( not used) // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include #include #include #include //#include //using namespace std; //introduces namespace std #include "RNM.hpp" #include "rgraph.hpp" #include "fem.hpp" #include "FQuadTree.hpp" inline int NbOfSubTriangle(int k) { assert(k>0); return k*k; } inline int NbOfSubInternalVertices(int k) { assert(k>0); int r= (k+2)*(k+1)/2; assert(r>=0); return r; } // for the mortar elements Mesh::Mesh(const Mesh & Th,int * split,bool WithMortar) { // routine complique // count the number of elements area=Th.area; BoundaryAdjacencesHead=0; BoundaryAdjacencesLink=0; BoundaryEdgeHeadLink=0; quadtree =0; NbMortars=0; mortars=0; TheAdjacencesLink =0; quadtree =0; bedges=0; neb =0; R2 Pmin,Pmax; Th.BoundingBox(Pmin,Pmax); nt=0; for (int i=0;i0 && split[it]<=64); // cout << " it = " <Add(*pV); nv++; } // end of new vertex vt[j]=number(pV); // triangles[kt].SetVertex(j,pV); } // for(int j=0;j<3;j++) // cout << kt << " " << n << endl; R2 A=vertices[vt[0]]; R2 B=vertices[vt[1]]; R2 C=vertices[vt[2]]; R a = (( B-A)^(C-A))*0.5; if (a>0) triangles[kt] = Triangle(vertices,vt[0],vt[1],vt[2],T.ref); else triangles[kt] = Triangle(vertices,vt[0],vt[2],vt[1],T.ref); } // end loop on all sub triangle } // end cout << " -- Nb of vertices " << nv << endl; cout << " -- Nb of triangle " << nt << endl; cout << " -- Nb of boundary edges " << neb << endl; // if (!WithMortar) { // long nba = neb; // long nbsd = 1; // bofbof // faux just pour un test long *sd; nbsd=1; sd=new long[2*nbsd]; sd[0]=-1; sd[1]=Th[0].ref; long nbs=nv; long nbsmax=nv; long err = 0, nbsold = nbs; long *c = 0; long *tri = 0; long *nu = 0; long *reft = 0; float *cr = 0; float *h = 0; long nbtmax = 2 * nbsmax; long * arete = new long[2*nba]; nu = new long[6*nbtmax]; c = new long[2*nbsmax]; tri = new long[(4 * nbsmax + 2 * nbsd)]; reft = new long[nbtmax]; cr = new float[(2 * nbsmax + 2)]; h = new float[nbsmax]; for(int i=0,k=0; i %ld == max nb points \n",*nbs,nbsmx); return 0; } /* ------------------------- */ /* preparation des donnees */ /* ------------------------- */ mshtri_ (&cr[3], &c[3], nbs, &tri[1], (LONG8*) (void *) &tri[*nbs + 1], trfri, err); if (*err != 0) { return 0; } /* -------------------------------- */ /* maillage de l enveloppe convexe */ /* -------------------------------- */ mshcxi_ (&c[3], &nu[1], &tri[1], nbs, &tete, err); /* ----------------------------------------------------------------------- */ /* definition de tableau nu(1:6,2*nbs-2) */ /* ----------------------------------------------------------------------- */ /* nu(*,ie) definit soit un element ,soit un sommet frontiere */ /* si nu(5:6,ie) = (0,0) alors ie est un sommet frontiere */ /* avec nu(1,ie) = numero du sommet */ /* nu(2,ie) = 8*t + a */ /* ou t est le numero du triangle ayant l'arete */ /* frontiere (a) dont le premier sommet est nu(1,ie) */ /* nu(3,ie) = pointeur dans nu sur sommet frontiere precedent */ /* nu(4,ie) = pointeur dans nu sur sommet frontiere suivant */ /* sinon ie est un element : */ /* nu(1:3,ie) numero des 3 sommets du triangle ie tournant dans */ /* le sens direct */ /* nu(4:6,ie) = (d4,d5,d6) donnee des 3 aretes ai */ /* ai est forme des sommets nu(i-3,ie),nu(mod(i,3)+1,ie) */ /* si di < 0 alors arete i est frontiere et -di est pointeur */ /* sur 1er sommet frontiere de i */ /* sinon arete est interne et di = 8*ta + ata */ /* ou ta est le numero du triangle adjacent a l'arete */ /* et ata est le numero de l'arete dans ta */ /* ------------------------------------------------------------------------ */ if (*err != 0) { return 0; } i_1 = *nbs; for (i = 1; i <= i_1; ++i) { tri[i] = 0; } i = tete; L20: j = nu[(i - 1) * 6 + 4]; tri[nu[(i - 1) * 6 + 1]] = nu[(j - 1) * 6 + 1]; i = j; if (i != tete) { goto L20; } /* ----------------------------- */ /* traitement frontiere */ /* ----------------------------- */ k = 0; mshfrt_ (&c[3], &nu[1], nbs, &arete[3], nba, &sd[3], nbsd, &reft[1], &tri[ 1], err); if (*err != 0) { return 0; } /* ------------------------------------------------------------------- */ /* on a modifie nu les sommets frontiere n'ont plus de sens */ /* ainsi que les pointeurs sur ces elements */ /* ------------------------------------------------------------------- */ nbsgrn = *nbs; mshgpt_ (&c[3], &cr[3], &nu[1], &h[1], &reft[1], &nbsgrn, nbsmx, &nbtgrn, coef, puis, trfri, err); if (*err != 0) { return 0; } /* construction du tableau nu(1:3,1:nbt) */ /* ------------------------------------------ */ *nbt = 0; k = 0; j = 1; i_1 = nbtgrn; for (t = 1; t <= i_1; ++t) { if (nu[j + 5] != 0) { ++(*nbt); reft[*nbt] = reft[t]; for (i = 0; i <= 2; ++i) { ++k; nu[k] = nu[j + i]; } } j += 6; } /* dans nu il y a (s1(t),s2(t),s3(t),t=1,nbt) */ /* ou s1 s2 s3 sont les 3 sommets de t */ /* ------------------------------------------------ */ i_1 = *nbs; for (i = 1; i <= i_1; ++i) { tri[i] = 1; } i_1 = nbsgrn; for (i = *nbs + 1; i <= i_1; ++i) { tri[i] = 0; } mshvoi_ (&nu[1], &tri[nbsgrn + 1], &nu[*nbt * 3 + 1], nbt, &nbsgrn); mshrgl_ (&cr[3], &tri[1], &nbsgrn, &nu[1], &tri[nbsgrn + 1], &nu[*nbt * 3 + 1], 1.4F, 20L, .005F); *nbs = nbsgrn; return 1; } /* mshptg_ */ /* ********************************************************************** */ void mshvoi_ (long *nu, long *w1, long *w, long *nbt, long *nbs) { /* System generated locals */ long i_1; /* Local variables */ static long i, is; /* RECHERCHE DU VOISINAGE */ /* ----------------------- */ /* Parameter adjustments */ --w; --nu; /* Function Body */ i_1 = *nbs; for (i = 1; i <= i_1; ++i) { w1[i] = 0; } i_1 = *nbt * 3; for (i = 1; i <= i_1; ++i) { ++w1[nu[i]]; } w1[0] = 0; i_1 = *nbs; for (i = 1; i <= i_1; ++i) { w1[i] = w1[i - 1] + w1[i]; } i_1 = *nbt * 3; for (i = 1; i <= i_1; ++i) { is = nu[i] - 1; ++w1[is]; w[w1[is]] = i; } for (i = *nbs; i >= 1; --i) { w1[i] = w1[i - 1]; } w1[0] = 0; } /* mshvoi_ */ /* ********************************************************************** */ int mshrgl_ (double *c, long *nrfs, long *nbs, long *nu, long *w1, long *w, double omega, long itermx, double eps) { /* System generated locals */ long i_1, i_2, i_3; double r_1, r_2; /* Local variables */ static double depx, depy; static long iter; static double xmin, ymin, xmax, ymax; static long i, k, i1, i2, ic; static double bx, by, dx; static long is; static double err; /* REGULARISATION PAR MOYENNE BARYCENTRIQUE */ /* ----------------------------------------- */ /* Parameter adjustments */ --w; --nu; --nrfs; c -= 3; /* Function Body */ xmin = c[3]; ymin = c[4]; xmax = c[3]; ymax = c[4]; i_1 = *nbs; for (ic = 1; ic <= i_1; ++ic) { /* Computing MIN */ r_1 = c[(ic << 1) + 1]; xmin = amin (r_1, xmin); /* Computing MIN */ r_1 = c[(ic << 1) + 2]; ymin = amin (r_1, ymin); /* Computing MAX */ r_1 = c[(ic << 1) + 1]; xmax = amax (r_1, xmax); /* Computing MAX */ r_1 = c[(ic << 1) + 2]; ymax = amax (r_1, ymax); } /* Computing MAX */ r_1 = xmax - xmin, r_2 = ymax - ymin; dx = amax (r_1, r_2); i_1 = itermx; for (iter = 1; iter <= i_1; ++iter) { err = (double) 0.; i2 = w1[0]; i_2 = *nbs; for (is = 1; is <= i_2; ++is) { i1 = i2 + 1; i2 = w1[is]; if (i2 >= i1 && nrfs[is] == 0) { bx = (double) 0.; by = (double) 0.; i_3 = i2; for (i = i1; i <= i_3; ++i) { if (w[i] % 3 == 0) { k = w[i] - 2; } else { k = w[i] + 1; } bx += c[(nu[k] << 1) + 1]; by += c[(nu[k] << 1) + 2]; } bx /= i2 - i1 + 1; by /= i2 - i1 + 1; depx = omega * (c[(is << 1) + 1] - bx); depy = omega * (c[(is << 1) + 2] - by); c[(is << 1) + 1] -= depx; c[(is << 1) + 2] -= depy; /* Computing MAX */ r_1 = err, r_2 = aabs (depx), r_1 = amax (r_1, r_2), r_2 = aabs (depy); err = amax (r_1, r_2); } } /* -------------------------------- */ if (err <= eps * dx) { return 0; } } return 1; } /* mshrgl_ */ /* ********************************************************************** */ int mshgpt_ (long *c, double *cr, long *nu, double *h, long *reft, long *nbs, long nbsmx, long *nbt, double coef, double puis, double *trfri, long *err) { /* System generated locals */ long i_1; double r_1, r_2, r_3; double d_1, d_2, d_3, d_4, d_5, d_6, d_7, d_8; /* Local variables */ static double aire; static long tete; static long t; static double x, y; static long itera; static double h1, h2, h3; static long s1, s2, s3; static double hs; static long ix, iy, nbsold; static double det, pui; /* Parameter adjustments */ --trfri; --reft; --h; nu -= 7; cr -= 3; c -= 3; /* Function Body */ pui = puis; *nbt = (*nbs << 1) - 2; if (*nbs >= nbsmx) { /* ADD FH avril 2007 */ i_1 = *nbt; for (t = 1; t <= i_1; ++t) if (nu[t * 6 + 6] != 0) { mshopt_ (&c[3], &nu[7], &t, 4L, err); mshopt_ (&c[3], &nu[7], &t, 5L, err); mshopt_ (&c[3], &nu[7], &t, 6L, err); } /* FIN ADD FH vril 2007 */ return 0; } tete = 0; /* initialisation de la liste des triangles libre */ i_1 = *nbt; for (t = 1; t <= i_1; ++t) { if (nu[t * 6 + 6] == 0) { nu[t * 6 + 1] = tete; tete = t; } } itera = 0; L20: ++itera; nbsold = *nbs; i_1 = *nbt; for (t = 1; t <= i_1; ++t) { if (nu[t * 6 + 6] != 0) { s1 = nu[t * 6 + 1]; s2 = nu[t * 6 + 2]; s3 = nu[t * 6 + 3]; /* calcul de 2 fois l'aire du triangle */ det = (cr[(s2 << 1) + 1] - cr[(s1 << 1) + 1]) * (cr[(s3 << 1) + 2] - cr[(s1 << 1) + 2]) - (cr[(s2 << 1) + 2] - cr[(s1 << 1) + 2]) * (cr[(s3 << 1) + 1] - cr[(s1 << 1) + 1]); aire = det * coef; if (puis > (double) 0.) { d_2 = (double) h[s1]; d_3 = (double) pui; d_4 = (double) h[s2]; d_5 = (double) pui; d_6 = (double) h[s3]; d_7 = (double) pui; d_1 = (pow (d_2, d_3) + pow (d_4, d_5) + pow (d_6, d_7)) / (double) 3.; d_8 = (double) (1.F / pui); hs = (double)pow (d_1, d_8); } else if (puis > (double) -1.) { d_1 = (double) (h[s1] * h[s2] * h[s3]); hs = (double)pow (d_1, 1. / 3); } else if (puis > (double) -2.) { hs = h[s1] * (double) 3. *h[s2] * h[s3] / (h[s1] * h[s2] + h[ s1] * h[s3] + h[s2] * h[s3]); } else { /* Computing 2nd power */ r_1 = (double)sqrt (h[s1] * h[s2]); /* Computing 2nd power */ r_2 = h[s1] * h[s3]; /* Computing 2nd power */ r_3 = h[s2] * h[s3]; hs = (double)sqrt (3.0) * (h[s1] * h[s2] * h[s3] / (r_1 * r_1) + r_2 * r_2 + r_3 * r_3); } if (aire > hs * hs) { h1 = (double) 1.; h2 = (double) 1.; h3 = (double) 1.; x = (cr[(s1 << 1) + 1] * h1 + cr[(s2 << 1) + 1] * h2 + cr[(s3 << 1) + 1] * h3) / (h1 + h2 + h3); y = (cr[(s1 << 1) + 2] * h1 + cr[(s2 << 1) + 2] * h2 + cr[(s3 << 1) + 2] * h3) / (h1 + h2 + h3); r_1 = trfri[1] * (x - trfri[2]); ix = (long) i_nint (r_1); r_1 = trfri[1] * (y - trfri[3]) - trfri[4]; iy = (long) i_nint (r_1); if ((c[(s2 << 1) + 1] - ix) * (c[(s3 << 1) + 2] - iy) - (c[( s2 << 1) + 2] - iy) * (c[(s3 << 1) + 1] - ix) <= 0 || (ix - c[(s1 << 1) + 1]) * (c[(s3 << 1) + 2] - c[(s1 << 1) + 2]) - (iy - c[(s1 << 1) + 2]) * (c[(s3 << 1) + 1] - c[(s1 << 1) + 1]) <= 0 || (c[(s2 << 1) + 1] - c[( s1 << 1) + 1]) * (iy - c[(s1 << 1) + 2]) - (c[(s2 << 1) + 2] - c[(s1 << 1) + 2]) * (ix - c[(s1 << 1) + 1]) <= 0) { } else { if (*nbs >= nbsmx) { return 0; } ++(*nbs); c[(*nbs << 1) + 1] = ix; c[(*nbs << 1) + 2] = iy; cr[(*nbs << 1) + 1] = ix / trfri[1] + trfri[2]; cr[(*nbs << 1) + 2] = (iy + trfri[4]) / trfri[1] + trfri[ 3]; h[*nbs] = hs; msha1p_ (&t, nbs, &c[3], &nu[7], &reft[1], &tete, nbt, err); if (*err != 0) { return 0; } } } } } if (nbsold != *nbs) { goto L20; } return 1; } /* mshgpt_ */ /* ********************************************************************** */ int msha1p_ (long *t, long *s, long *c, long *nu, long *reft, long *tete, long *nbt, long *err) { static long t1, t2, t3, ia2, ia3; static long ta2, ta3; // extern int mshopt_(); static long tta; /* Parameter adjustments */ --reft; nu -= 7; c -= 3; /* Function Body */ t1 = *t; if (*tete == 0) { ++(*nbt); t2 = *nbt; } else { t2 = *tete; *tete = nu[*tete * 6 + 1]; } if (*tete == 0) { ++(*nbt); t3 = *nbt; } else { t3 = *tete; *tete = nu[*tete * 6 + 1]; } nu[t2 * 6 + 1] = *s; nu[t2 * 6 + 2] = nu[*t * 6 + 2]; nu[t2 * 6 + 3] = nu[*t * 6 + 3]; nu[t2 * 6 + 4] = (t1 << 3) + 5; nu[t2 * 6 + 5] = nu[*t * 6 + 5]; nu[t2 * 6 + 6] = (t3 << 3) + 5; nu[t3 * 6 + 1] = nu[*t * 6 + 1]; nu[t3 * 6 + 2] = *s; nu[t3 * 6 + 3] = nu[*t * 6 + 3]; nu[t3 * 6 + 4] = (t1 << 3) + 6; nu[t3 * 6 + 5] = (t2 << 3) + 6; nu[t3 * 6 + 6] = nu[*t * 6 + 6]; tta = nu[*t * 6 + 5]; if (tta > 0) { ta2 = tta / 8; ia2 = tta - (ta2 << 3); nu[ia2 + ta2 * 6] = (t2 << 3) + 5; } tta = nu[*t * 6 + 6]; if (tta > 0) { ta3 = tta / 8; ia3 = tta - (ta3 << 3); nu[ia3 + ta3 * 6] = (t3 << 3) + 6; } nu[t1 * 6 + 3] = *s; nu[t1 * 6 + 5] = (t2 << 3) + 4; nu[t1 * 6 + 6] = (t3 << 3) + 4; reft[t2] = reft[*t]; reft[t3] = reft[*t]; mshopt_ (&c[3], &nu[7], &t1, 4L, err); if (*err != 0) { return 0; } mshopt_ (&c[3], &nu[7], &t2, 5L, err); if (*err != 0) { return 0; } mshopt_ (&c[3], &nu[7], &t3, 6L, err); if (*err != 0) { return 0; } return 1; } /* msha1p_ */ /* ********************************************************************** */ long mshlcl_ (long *c, long *nu, long *tete, long *s) { /* System generated locals */ long ret_val; /* Local variables */ static long init; static long x, y, pt, ppt; LONG8 det; /* Parameter adjustments */ nu -= 7; c -= 3; /* Function Body */ x = c[(*s << 1) + 1]; y = c[(*s << 1) + 2]; init = 1; pt = *tete; L10: ppt = pt; pt = nu[pt * 6 + 4]; if (pt != *tete) { det = (LONG8) x * (LONG8) c[(nu[pt * 6 + 1] << 1) + 2] - (LONG8) y * (LONG8) c[(nu[pt * 6 + 1] << 1) + 1]; if (det < 0) { init = 0; goto L10; } else if (init && det == 0) { goto L10; } } ret_val = ppt; return ret_val; } /* mshlcl_ */ /* ********************************************************************** */ int mshtri_ (double *cr, long *c, long *nbs, long *tri, LONG8 *nu, double *trfri, long *err) { /* System generated locals */ long i_1, i_2, i_3; double r_1; /* Local variables */ static long ierr, trik; static double xmin, ymin, xmax, ymax; static long i, j, k, ic, jc; // extern int mshtr1_(); static long ip, xx; static double aa1, aa2; static long iii, tri3; LONG8 det; /* Parameter adjustments */ --trfri; --nu; --tri; c -= 3; cr -= 3; /* Function Body */ ierr = 0; iii = 1; xmin = cr[3]; ymin = cr[4]; xmax = cr[3]; ymax = cr[4]; i_1 = *nbs; for (ic = 1; ic <= i_1; ++ic) { /* Computing MIN */ r_1 = cr[(ic << 1) + 1]; xmin = amin (r_1, xmin); /* Computing MIN */ r_1 = cr[(ic << 1) + 2]; ymin = amin (r_1, ymin); /* Computing MAX */ r_1 = cr[(ic << 1) + 1]; xmax = amax (r_1, xmax); /* Computing MAX */ r_1 = cr[(ic << 1) + 2]; ymax = amax (r_1, ymax); tri[ic] = ic; if (cr[(ic << 1) + 1] < cr[(iii << 1) + 1]) { iii = ic; } } aa1 = MAXCOOR / (xmax - xmin); aa2 = MAXCOOR / (ymax - ymin); aa1 = amin (aa1, aa2); aa2 = aa1 * (cr[(iii << 1) + 2] - ymin); trfri[1] = aa1; trfri[2] = cr[(iii << 1) + 1]; trfri[3] = ymin; trfri[4] = aa2; i_1 = *nbs; for (ic = 1; ic <= i_1; ++ic) { r_1 = aa1 * (cr[(ic << 1) + 1] - cr[(iii << 1) + 1]); c[(ic << 1) + 1] = (long) i_nint (r_1); r_1 = aa1 * (cr[(ic << 1) + 2] - ymin) - aa2; c[(ic << 1) + 2] = (long) i_nint (r_1); /* Computing 2nd power */ i_2 = c[(ic << 1) + 1]; /* Computing 2nd power */ i_3 = c[(ic << 1) + 2]; nu[ic] = (LONG8) i_2 * (LONG8) i_2 + (LONG8) i_3 * (LONG8) i_3; } /* ---------------------------------------------------------- */ mshtr1_ (&nu[1], &tri[1], nbs); ip = 1; xx = nu[ip]; i_1 = *nbs; for (jc = 1; jc <= i_1; ++jc) { if (nu[jc] > xx) { i_2 = jc - ip; mshtr1_ (&nu[ip], &tri[ip], &i_2); i_2 = jc - 2; for (i = ip; i <= i_2; ++i) { if (nu[i] == nu[i + 1]) { ++ierr; if (ierr <10) printf(" The points %ld and %ld are too close \n",tri[i],tri[i+1]); } } xx = nu[jc]; ip = jc; } ic = tri[jc]; nu[jc] = c[(ic << 1) + 2]; } i_1 = *nbs - ip; mshtr1_ (&nu[ip], &tri[ip], &i_1); i_1 = jc - 2; for (i = ip; i <= i_1; ++i) { if (nu[i] == nu[i + 1]) { if (ierr <10) printf(" The points %ld and %ld are to close \n",tri[i],tri[i+1]); ++ierr; } } if (ierr != 0) { *err = 2; printf("mshptg bug 2 \n"); return 0; } k = 2; L50: if (k <= *nbs) { ++k; det = (LONG8) c[(tri[2] << 1) + 1] * (LONG8) c[(tri[k] << 1) + 2] - (LONG8) c[(tri[2] << 1) + 2] * (LONG8) c[(tri[k] << 1) + 1]; if (det == 0) { goto L50; } } else { *err = 3; return 0; } /* k est le premier point non aligne */ trik = tri[k]; for (j = k - 1; j >= 3; --j) { tri[j + 1] = tri[j]; } tri[3] = trik; if (det < 0) { /* on inverse les points 2 3 tries */ tri3 = tri[3]; tri[3] = tri[2]; tri[2] = tri3; } return 1; } /* mshtri_ */ /* ********************************************************************** */ int mshtr1_ (LONG8 *criter, long *record, long *n) { /* System generated locals */ long i_1; /* Local variables */ long i, j, l, r, rec; LONG8 crit; /* trie selon les valeurs de criter croissantes */ /* record suit le reordonnancement */ /* Parameter adjustments */ --record; --criter; /* Function Body */ if (*n <= 1) { return 0; } l = *n / 2 + 1; r = *n; L2: if (l <= 1) { goto L20; } --l; rec = record[l]; crit = criter[l]; goto L3; L20: rec = record[r]; crit = criter[r]; record[r] = record[1]; criter[r] = criter[1]; --r; if (r == 1) { goto L999; } L3: j = l; L4: i = j; j <<= 1; if ((i_1 = j - r) < 0) { goto L5; } else if (i_1 == 0) { goto L6; } else { goto L8; } L5: if (criter[j] < criter[j + 1]) { ++j; } L6: if (crit >= criter[j]) { goto L8; } record[i] = record[j]; criter[i] = criter[j]; goto L4; L8: record[i] = rec; criter[i] = crit; goto L2; L999: record[1] = rec; criter[1] = crit; return 0; } /* mshtr1_ */ /* ********************************************************************** */ int mshcvx_ (long direct, long *c, long *nu, long *pfold, long *err) { static long t, a4, a5, i1, i2, i3, i4, i5, i6, s1, s2, s3, t4, t5, pf, pp, ps; // extern int mshopt_(); static long tt4, tt5, ppf, psf; LONG8 det; /* Parameter adjustments */ nu -= 7; c -= 3; /* Function Body */ if (direct) { pp = 3; ps = 4; i1 = 1; i2 = 3; i3 = 2; i4 = 6; i5 = 5; i6 = 4; } else { pp = 4; ps = 3; i1 = 1; i2 = 2; i3 = 3; i4 = 4; i5 = 5; i6 = 6; } L10: ppf = *pfold; pf = nu[ps + *pfold * 6]; psf = nu[ps + pf * 6]; s1 = nu[ppf * 6 + 1]; s2 = nu[pf * 6 + 1]; s3 = nu[psf * 6 + 1]; det = (LONG8) (c[(s2 << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) (c[(s3 << 1) + 2] - c[(s1 << 1) + 2]) - (LONG8) (c[(s2 << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) (c[(s3 << 1) + 1] - c[(s1 << 1) + 1]); if ((!(direct) && det > 0) || (direct && det < 0)) { /* on ajoute un triangle t et on detruit une arete */ /* ----------------------------------------------- */ if (direct) { tt4 = nu[ppf * 6 + 2]; tt5 = nu[pf * 6 + 2]; } else { tt4 = nu[pf * 6 + 2]; tt5 = nu[psf * 6 + 2]; } t4 = tt4 / 8; t5 = tt5 / 8; a4 = tt4 - (t4 << 3); a5 = tt5 - (t5 << 3); /* destruction de l'arete frontiere en pf */ /* -------------------------------------- */ nu[ps + ppf * 6] = psf; nu[pp + psf * 6] = ppf; /* on remplace l'arete frontiere par l'element genere */ /* --------------------------------------------------- */ t = pf; /* update de l'arete non detruite */ /* ------------------------------ */ if (direct) { nu[ppf * 6 + 2] = (t << 3) + i6; } else { nu[psf * 6 + 2] = (t << 3) + i6; } /* on cree l'element */ /* ----------------- */ nu[i1 + t * 6] = s1; nu[i2 + t * 6] = s2; nu[i3 + t * 6] = s3; nu[i4 + t * 6] = (t4 << 3) + a4; nu[i5 + t * 6] = (t5 << 3) + a5; if (direct) { nu[i6 + t * 6] = -ppf; } else { nu[i6 + t * 6] = -psf; } nu[a4 + t4 * 6] = (t << 3) + i4; nu[a5 + t5 * 6] = (t << 3) + i5; mshopt_ (&c[3], &nu[7], &t5, a5, err); if (*err != 0) { return 0; } goto L10; } return 1; } /* mshcvx_ */ /* ********************************************************************** */ int mshcxi_ (long *c, long *nu, long *tri, long *nbs, long *tete, long *err) { /* System generated locals */ long i_1; /* Local variables */ static long sfree, ttaf, i, j, s, t, pf; // extern long mshlcl_(); // extern int mshcvx_(), mshopt_(); static long iaf, taf, npf, ppf, psf; /* initialisation de la sfree liste dans nu */ /* Parameter adjustments */ --tri; nu -= 7; c -= 3; /* Function Body */ i_1 = *nbs + *nbs - 2; for (i = 1; i <= i_1; ++i) { nu[i * 6 + 1] = i + 1; for (j = 2; j <= 6; ++j) { nu[j + i * 6] = 0; } } nu[(*nbs + *nbs - 2) * 6 + 1] = 0; sfree = 1; /* initialisation du premier triangle */ t = sfree; sfree = nu[sfree * 6 + 1]; /* initialisation de la liste frontiere */ *tete = sfree; pf = sfree; for (i = 1; i <= 3; ++i) { nu[i + t * 6] = tri[i]; nu[i + 3 + t * 6] = -pf; ppf = pf; sfree = nu[pf * 6 + 1]; pf = sfree; if (i == 3) { pf = *tete; } nu[ppf * 6 + 1] = tri[i]; nu[ppf * 6 + 2] = i + 3 + (t << 3); nu[ppf * 6 + 4] = pf; nu[pf * 6 + 3] = ppf; } i_1 = *nbs; for (i = 4; i <= i_1; ++i) { s = tri[i]; pf = mshlcl_ (&c[3], &nu[7], tete, &s); /* creation d'un nouveau triangle et modification de la frontiere */ /* -------------------------------------------------------------- */ t = sfree; sfree = nu[sfree * 6 + 1]; npf = sfree; sfree = nu[sfree * 6 + 1]; ppf = nu[pf * 6 + 3]; psf = nu[pf * 6 + 4]; ttaf = nu[pf * 6 + 2]; taf = ttaf / 8; iaf = ttaf - (taf << 3); /* npf */ /* 1 x s --- */ /* / \ --- */ /* 4 / \ 6 --- vide --- */ /* / t \ --- */ /* 2 / 5 \ 3 --- */ /* ------ --<---x---------x---------x- frontiere--<--- */ /* psf \ iaf / pf --- */ /* \ taf / --- omega --- */ /* \ / --- */ /* \ / --- */ /* x --- */ /* --- */ /* generation de l'element t */ nu[t * 6 + 1] = s; nu[t * 6 + 2] = nu[psf * 6 + 1]; nu[t * 6 + 3] = nu[pf * 6 + 1]; nu[t * 6 + 4] = -npf; nu[t * 6 + 5] = (taf << 3) + iaf; nu[t * 6 + 6] = -pf; nu[iaf + taf * 6] = (t << 3) + 5; /* update de la liste frontiere */ nu[npf * 6 + 4] = psf; nu[pf * 6 + 4] = npf; nu[npf * 6 + 3] = pf; nu[psf * 6 + 3] = npf; nu[npf * 6 + 1] = s; nu[npf * 6 + 2] = (t << 3) + 4; nu[pf * 6 + 2] = (t << 3) + 6; mshopt_ (&c[3], &nu[7], &t, 5L, err); if (*err != 0) { return 0; } mshcvx_ (1, &c[3], &nu[7], &npf, err); if (*err != 0) { return 0; } mshcvx_ (0, &c[3], &nu[7], &npf, err); if (*err != 0) { return 0; } } return 1; } /* mshcxi_ */ /* ********************************************************************** */ int mshopt_ (long *c, long *nu, long *t, long a, long *err) { /* Initialized data */ static long mod3[3] = {2, 3, 1}; /* System generated locals */ long i_1; double d_1; /* Local variables */ static long pile[4096] /* was [2][256] */ ; static double reel1, reel2; static double reel8; static long i, a1, a2, s1, t1, t2, s2, s3, s4, aa, i11, i12, i13, i21, i22, i23, tt; static long tt1; LONG8 cos1, cos2, sin1, sin2, sgn; int kerr21=0; /* Parameter adjustments */ nu -= 7; c -= 3; /* Function Body */ i = 1; pile[(i << 1) - 2] = *t; pile[(i << 1) - 1] = a; L10: if (i > 0) { t1 = pile[(i << 1) - 2]; a1 = pile[(i << 1) - 1]; --i; if (t1 <= 0) { goto L10; } tt1 = nu[a1 + t1 * 6]; if (tt1 <= 0) { goto L10; } t2 = tt1 / 8; a2 = tt1 - (t2 << 3); i11 = a1 - 3; i12 = mod3[i11 - 1]; i13 = mod3[i12 - 1]; i21 = a2 - 3; i22 = mod3[i21 - 1]; i23 = mod3[i22 - 1]; s1 = nu[i13 + t1 * 6]; s2 = nu[i11 + t1 * 6]; s3 = nu[i12 + t1 * 6]; s4 = nu[i23 + t2 * 6]; sin1 = (LONG8) (c[(s3 << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) (c[(s2 << 1) + 1] - c[(s1 << 1) + 1]) - (LONG8) (c[(s3 << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) (c[(s2 << 1) + 2] - c[(s1 << 1) + 2]); cos1 = (LONG8) (c[(s3 << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) (c[(s3 << 1) + 1] - c[(s2 << 1) + 1]) + (LONG8) (c[(s3 << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) (c[(s3 << 1) + 2] - c[(s2 << 1) + 2]); if (sin1 == 0 && cos1 == 0) { *err = 20; return 0; } /* b est la cotangente de angle (s1,s3,s2) */ sin2 = (LONG8) (c[(s4 << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) (c[(s2 << 1) + 2] - c[(s1 << 1) + 2]) - (LONG8) (c[(s4 << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) (c[(s2 << 1) + 1] - c[(s1 << 1) + 1]); // FH correct 6/11/2005 forgotted cast cos2 = (LONG8) (c[(s4 << 1) + 1] - c[(s2 << 1) + 1]) * (LONG8) (c[(s4 << 1) + 1] - c[(s1 << 1) + 1]) + (LONG8) (c[(s4 << 1) + 2] - c[(s2 << 1) + 2]) * (LONG8) (c[(s4 << 1) + 2] - c[(s1 << 1) + 2]); reel1 = (double) cos2 *(double) sin1; reel2 = (double) cos1 *(double) sin2; if (aabs (reel1) + aabs (reel2) >= (double ) DLONG8LONG8) { reel8 = (double) cos2 *(double) sin1 + (double) cos1 *(double) sin2; /* Computing MIN */ d_1 = amax (reel8, -1.); reel8 = amin (d_1, 1.); sgn = (LONG8) reel8; } else { sgn = cos2 * sin1 + cos1 * sin2; } /* Computing MIN */ i_1 = amin(amax (sgn, -1),1); // cout << sgn << " " << i_1 << endl; if ( i_1 * sin1 >= 0) { goto L10; } /* on inverse le quadrilatere */ /* update des sommets */ /* ------------------------- */ nu[i12 + t1 * 6] = s4; nu[i22 + t2 * 6] = s1; /* update des aretes a1,a2 */ /* ------------------------------- */ tt1 = nu[i22 + 3 + t2 * 6]; nu[a1 + t1 * 6] = tt1; if (tt1 > 0) { tt = tt1 / 8; aa = tt1 - (tt << 3); nu[aa + tt * 6] = a1 + (t1 << 3); } else if (tt1 != nothing) { nu[-tt1 * 6 + 2] = a1 + (t1 << 3); } tt1 = nu[i12 + 3 + t1 * 6]; nu[a2 + t2 * 6] = tt1; if (tt1 > 0) { tt = tt1 / 8; aa = tt1 - (tt << 3); nu[aa + tt * 6] = a2 + (t2 << 3); } else if (tt1 != nothing) { nu[-tt1 * 6 + 2] = a2 + (t2 << 3); } nu[i12 + 3 + t1 * 6] = i22 + 3 + (t2 << 3); nu[i22 + 3 + t2 * 6] = i12 + 3 + (t1 << 3); if (i + 4 > 2048) /* Modif F. H june 2015 */ { if(kerr21) cout << " Bizarre mshptg err 21 pile too small (continue) "<< endl; if(kerr21++<10000) goto L10; *err = 21; return 0; } ++i; pile[(i << 1) - 2] = t1; pile[(i << 1) - 1] = a1; ++i; pile[(i << 1) - 2] = t2; pile[(i << 1) - 1] = a2; ++i; pile[(i << 1) - 2] = t1; pile[(i << 1) - 1] = i13 + 3; ++i; pile[(i << 1) - 2] = t2; pile[(i << 1) - 1] = i23 + 3; goto L10; } return 1; } /* mshopt_ */ /* ********************************************************************** */ int mshfrt_ (long *c, long *nu, long *nbs, long *arete, long nba, long *sd, long nbsd, long *reft, long *w, long *err) { /* Initialized data */ static long p3[3] = {2, 3, 1}; /* System generated locals */ long i_1, i_2, i_3; /* Local variables */ static long nbac, ifrt, a, i, t, itera, s1, s2; // extern int mshfr1_(); static long ie, ap, ta, is, nbacpp; static long is1, ss1, s2t, s3t, isd, jsd, nbt, err1; LONG8 det2, det3; /* Parameter adjustments */ --w; --reft; sd -= 3; arete -= 3; nu -= 7; c -= 3; /* Function Body */ if (nba == 0) { return 0; } ifrt = 0; nbt = *nbs + *nbs - 2; i_1 = *nbs; for (i = 1; i <= i_1; ++i) { reft[i] = 0; } i_1 = nba; for (i = 1; i <= i_1; ++i) { reft[arete[(i << 1) + 1]] = nothing; reft[arete[(i << 1) + 2]] = nothing; } nbac = 0; i_1 = nba; for (a = 1; a <= i_1; ++a) { /* Computing MIN */ i_2 = arete[(a << 1) + 1], i_3 = arete[(a << 1) + 2]; s1 = amin (i_2, i_3); /* Computing MAX */ i_2 = arete[(a << 1) + 1], i_3 = arete[(a << 1) + 2]; s2 = amax (i_2, i_3); if (s1 == s2) { ++nbac; } else { i = reft[s1]; L25: if (i != nothing) { /* Computing MAX */ i_2 = arete[(i << 1) + 1], i_3 = arete[(i << 1) + 2]; if (s2 == amax (i_2, i_3)) { ++nbac; } else { i = w[i]; goto L25; } } else { w[a] = reft[s1]; reft[s1] = a; } } } nbacpp = 1; itera = 0; err1 = 0; L50: ++itera; if (err1 != 0) { *err = err1; return 0; } if (nbac < nba) { if (nbacpp == 0) { i_1 = *nbs; for (i = 1; i <= i_1; ++i) { a = reft[i]; L60: if (a > 0) { s1 = arete[(i << 1) + 1]; s2 = arete[(i << 1) + 2]; a = w[a]; goto L60; } } *err = 7; return 0; } /* --------------------------------------------------------------------- */ /* on s'occupe des aretes a forcer */ /* --------------------------------------------------------------------- */ nbacpp = 0; i_1 = nbt; for (ie = 1; ie <= i_1; ++ie) { if (nu[ie * 6 + 5] != 0) { for (is = 1; is <= 3; ++is) { s1 = nu[is + ie * 6]; s2t = nu[p3[is - 1] + ie * 6]; ss1 = amin (s1, s2t); ap = 0; a = reft[ss1]; L80: if (a > 0) { /* Computing MAX */ i_2 = arete[(a << 1) + 1], i_3 = arete[(a << 1) + 2]; s2 = amax (i_2, i_3); t = ie; ta = 0; if (s2 == amax (s1, s2t)) { if (nu[is + 3 + ie * 6] > 0) { ta = nu[is + 3 + ie * 6] / 8; i = nu[is + 3 + ie * 6] - (ta << 3); nu[i + ta * 6] = nothing; } nu[is + 3 + ie * 6] = nothing; goto L100; } ap = a; a = w[a]; goto L80; } if (itera == 1) { goto L110; } ss1 = s1; ap = 0; a = reft[ss1]; L90: if (a > 0) { /* Computing MAX */ i_2 = arete[(a << 1) + 1], i_3 = arete[(a << 1) + 2]; s2 = amax (i_2, i_3); t = ie; ta = 0; /* recherche si l' element coupe l''arete a */ is1 = is; s3t = nu[p3[p3[is - 1] - 1] + t * 6]; det2 = (LONG8) (c[(s2t << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) (c[( s2 << 1) + 2] - c[(s1 << 1) + 2]) - (LONG8) (c[(s2t << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) (c[( s2 << 1) + 1] - c[(s1 << 1) + 1]); det3 = (LONG8) (c[(s3t << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) (c[( s2 << 1) + 2] - c[(s1 << 1) + 2]) - (LONG8) (c[(s3t << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) (c[( s2 << 1) + 1] - c[(s1 << 1) + 1]); if (det2 > 0 && det3 < 0) { mshfr1_ (&c[3], &nu[7], &t, &ta, &is1, &s2, err); if (*err != 0) { return 0; } goto L100; } else if (det2 == 0 && det3 < 0 && reft[s2t] == 0) { err1 = 10; printf(" det = %ld %ld %ld %ld %ld == %ld \n ", (c[(s2t << 1) + 1] - c[(s1 << 1) + 1]), (c[( s2 << 1) + 2] - c[(s1 << 1) + 2]) , (c[(s2t << 1) + 2] - c[(s1 << 1) + 2]), (c[( s2 << 1) + 1] - c[(s1 << 1) + 1]) , (c[(s2t << 1) + 1] - c[(s1 << 1) + 1]) * (c[( s2 << 1) + 2] - c[(s1 << 1) + 2]) , (c[(s2t << 1) + 2] - c[(s1 << 1) + 2]) * (c[( s2 << 1) + 1] - c[(s1 << 1) + 1]) ); printf("bug 2, mshptg: point %ld is on boundary edge %ld %ld \n",s2t,i_2,i_3); } else if (det2 > 0 && det3 == 0 && reft[s3t] == 0) { err1 = 10; printf(" det = %ld %ld %ld %ld %ld %ld \n ", (c[(s3t << 1) + 1] - c[(s1 << 1) + 1]), (c[( s2 << 1) + 2] - c[(s1 << 1) + 2]) , (c[(s3t << 1) + 2] - c[(s1 << 1) + 2]), (c[( s2 << 1) + 1] - c[(s1 << 1) + 1]) , (c[(s3t << 1) + 1] - c[(s1 << 1) + 1]) * (c[( s2 << 1) + 2] - c[(s1 << 1) + 2]) , (c[(s3t << 1) + 2] - c[(s1 << 1) + 2]) * (c[( s2 << 1) + 1] - c[(s1 << 1) + 1]) ); printf("bug 2, mshptg: point %ld is on boundary %ld %ld\n",s3t,i_2,i_3); } ap = a; a = w[a]; goto L90; } goto L110; L100: ++nbacpp; if (ap == 0) { reft[ss1] = w[a]; } else { w[ap] = w[a]; } if (nbac + nbacpp == nba) { goto L130; } L110: ; } } } nbac += nbacpp; goto L50; } L130: /* ----------------------------------------------------------------------- */ /* prise en compte des sous domaines */ /* ----------------------------------------------------------------------- */ /* add FH si pas de nbsd --- jan 2004 */ if (nbsd<0) { i_1 = nbt; for (ie = 1; ie <= i_1; ++ie) { if (nu[ie * 6 + 1] > 0) { nu[ie * 6 + 1] = -nu[ie * 6 + 1]; } reft[ie]=1; } goto L205; // pas triangle retire } if (nbsd == 0) { long i__1 = nbt,nbssd,exter,i__,headt,nst,j; for (t = 1; t <= i__1; ++t) { reft[t] = -1073741824; } nbssd = 0; /* if(impre.gt.1) print *,'nbsd .eq. 0 => recherche de ssd' */ i__1 = nbt; for (t = 1; t <= i__1; ++t) { if (nu[t * 6 + 1] > 0 && nu[t * 6 + 5] != 0) { ++nbssd; exter = 0; i__ = 2; w[i__ - 1] = t; w[i__] = 3; reft[t] = 0; headt = t; nu[t * 6 + 1] = -nu[t * 6 + 1]; nst = 1; /* print *,' ssd ',nbssd */ L131: if (i__ > 0) { ++w[i__]; if (w[i__] <= 6) { ta = nu[w[i__] + w[i__ - 1] * 6]; if (ta <= 0) { if (ta != -1073741824) { exter = 1; } } else if (ta > 0) { ta /= 8; if (nu[ta * 6 + 1] > 0) { /* print *,ta */ nu[ta * 6 + 1] = -nu[ta * 6 + 1]; ++nst; reft[ta] = headt; headt = ta; w[i__ + 1] = ta; w[i__ + 2] = 3; i__ += 2; } } } else { i__ += -2; } goto L131; } if (exter) { --nbssd; i__ = headt; L133: if (i__ > 0) { j = reft[i__]; /* print *,i */ reft[i__] = 0; nu[i__ * 6 + 1] = 0; i__ = j; goto L133; } } else { i__ = headt; L136: if (i__ > 0) { j = reft[i__]; reft[i__] = nbssd; i__ = j; goto L136; } } } } goto L205; } /* fin ajoute FH jan 2004 */ i_1 = *nbs + nbsd + nbsd; for (i = 1; i <= i_1; ++i) { w[i] = 0; } i_1 = nbsd; for (i = 1; i <= i_1; ++i) { a = (i_2 = sd[(i << 1) + 1], aabs (i_2)); /* Computing MIN */ i_2 = arete[(a << 1) + 1], i_3 = arete[(a << 1) + 2]; s1 = amin (i_2, i_3); w[i + i] = w[s1 + nbsd + nbsd]; w[s1 + nbsd + nbsd] = i; } i_1 = nbt; for (t = 1; t <= i_1; ++t) { reft[t] = nothing; if (nu[t * 6 + 6] != 0) { for (i = 1; i <= 3; ++i) { /* Computing MIN */ i_2 = nu[i + t * 6], i_3 = nu[p3[i - 1] + t * 6]; ss1 = amin (i_2, i_3); jsd = nbsd + nbsd + ss1; L160: isd = w[jsd]; if (isd > 0) { a = sd[(isd << 1) + 1]; if (a > 0) { if (nu[i + t * 6] == arete[(a << 1) + 1] && nu[p3[i - 1] + t * 6] == arete[(a << 1) + 2]) { reft[t] = sd[(isd << 1) + 2]; w[isd + isd - 1] = t; w[jsd] = w[isd + isd]; goto L170; } } else if (a < 0) { if (nu[i + t * 6] == arete[(-a << 1) + 2] && nu[p3[i - 1] + t * 6] == arete[(-a << 1) + 1]) { reft[t] = sd[(isd << 1) + 2]; w[isd + isd - 1] = t; w[jsd] = w[isd + isd]; goto L170; } } else { cout << " Err sous domaine " << isd << "ref par d'arete +/- = " << a << " n'est dans aucun triangle " << endl; *err = 11; } jsd = isd + isd; goto L160; } L170: ; } } } i_1 = nbsd; for (isd = 1; isd <= i_1; ++isd) { if (w[isd + isd - 1] == 0) { cout << " Err sous domaine " << isd << "ref par d'arete +/- = " << sd[(isd << 1) + 1] << " n'est dans aucun triangle " << endl; *err = 11; } else { w[isd + isd] = 3; } } if (*err != 0) { return 0; } i = nbsd + nbsd; L200: if (i > 0) { ++w[i]; if (w[i] <= 6) { ta = nu[w[i] + w[i - 1] * 6]; if (ta > 0) { ta /= 8; if (nu[ta * 6 + 1] > 0) { nu[ta * 6 + 1] = -nu[ta * 6 + 1]; if (reft[ta] != reft[w[i - 1]]) { if (reft[ta] != nothing) { } else { reft[ta] = reft[w[i - 1]]; } w[i + 1] = ta; w[i + 2] = 3; i += 2; } } } } else { ta = w[i-1] ; if( nu[ta * 6 + 1]>=0) nu[ta * 6 + 1]= -nu[ta * 6 + 1]; // pour etre sur que le traingle est bien marque i += -2; } goto L200; } L205: i_1 = nbt; for (ie = 1; ie <= i_1; ++ie) { if (nu[ie * 6 + 1] < 0) { nu[ie * 6 + 1] = -nu[ie * 6 + 1]; } else { for (i = 1; i <= 6; ++i) { nu[i + ie * 6] = 0; } } } return 1; } /* mshfrt_ */ /* ********************************************************************** */ int mshfr1_ (long *c, long *nu, long *it1, long *ita, long *is1, long *s2, long *err) { /* Initialized data */ static long p3[5] = {2, 3, 1, 2, 3}; static long nbac, t, x, y, l1, l2, l3, s1, s3; // extern int mshfr2_(); static long la, ta; static long s2t, s3t, lst[768] /* was [3][256] */ ; LONG8 det; /* Parameter adjustments */ nu -= 7; c -= 3; /* Function Body */ t = *it1; s1 = nu[*is1 + t * 6]; x = c[(*s2 << 1) + 1] - c[(s1 << 1) + 1]; y = c[(*s2 << 1) + 2] - c[(s1 << 1) + 2]; nbac = 0; l1 = *is1; l2 = p3[l1 - 1]; l3 = p3[l2 - 1]; s2t = nu[l2 + t * 6]; s3t = nu[l3 + t * 6]; la = l2 + 3; L20: ++nbac; if (nbac > 256) { *err = 8; return 0; } lst[nbac * 3 - 2] = t; lst[nbac * 3 - 1] = la; ta = nu[la + t * 6]; if (ta <= 0) { *err = 9; return 0; } t = ta / 8; la = ta - (t << 3); s3 = nu[p3[la - 3] + t * 6]; if (s3 != *s2) { det = (LONG8) x * (LONG8) (c[(s3 << 1) + 2] - c[(s1 << 1) + 2]) - (LONG8) y * (LONG8) (c[(s3 << 1) + 1] - c[(s1 << 1) + 1]); if (det > 0) { la = p3[la - 4] + 3; } else if (det < 0) { la = p3[la - 3] + 3; } else { printf("mshptg: bug the point %ld is on boundary \n", s3 ); *err = 10+s3*10; return 0; } goto L20; } mshfr2_ (&c[3], &nu[7], lst, &nbac, it1, ita, &s1, s2, err); return 0; } /* mshfr1_ */ /* ********************************************************************** */ int mshfr2_ (long *c, long *nu, long *lst, long *nbac, long *t, long *ta, long *ss1, long *ss2, long *err) { /* Initialized data */ static long mod3[3] = {2, 3, 1}; /* System generated locals */ long i_1; /* Local variables */ static long i, x, y, a1, a2, pplst, s1, pslst, ptlst, s2, s3, s4, ttlst, t1, t2, aa, i11, i12, i13, i21, i22, i23, x41, y41, tt; // extern int mshopt_(); static long tt1, aas; LONG8 det1, det2, det3, det4; /* Parameter adjustments */ lst -= 4; nu -= 7; c -= 3; /* Function Body */ x = c[(*ss1 << 1) + 1] - c[(*ss2 << 1) + 1]; y = c[(*ss1 << 1) + 2] - c[(*ss2 << 1) + 2]; i_1 = *nbac - 1; for (i = 1; i <= i_1; ++i) { lst[i * 3 + 1] = i + 1; } lst[*nbac * 3 + 1] = 0; ttlst = 1; L20: ptlst = ttlst; pplst = 0; L30: if (ptlst > 0) { t1 = lst[ptlst * 3 + 2]; a1 = lst[ptlst * 3 + 3]; tt1 = nu[a1 + t1 * 6]; t2 = tt1 / 8; a2 = tt1 - (t2 << 3); i11 = a1 - 3; i12 = mod3[i11 - 1]; i13 = mod3[i12 - 1]; i21 = a2 - 3; i22 = mod3[i21 - 1]; i23 = mod3[i22 - 1]; s1 = nu[i13 + t1 * 6]; s2 = nu[i11 + t1 * 6]; s3 = nu[i12 + t1 * 6]; s4 = nu[i23 + t2 * 6]; x41 = c[(s4 << 1) + 1] - c[(s1 << 1) + 1]; y41 = c[(s4 << 1) + 2] - c[(s1 << 1) + 2]; det2 = (LONG8) (c[(s2 << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) y41 - (LONG8) (c[(s2 << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) x41; det3 = (LONG8) (c[(s3 << 1) + 1] - c[(s1 << 1) + 1]) * (LONG8) y41 - (LONG8) (c[(s3 << 1) + 2] - c[(s1 << 1) + 2]) * (LONG8) x41; if (det2 > 0 && det3 < 0) { /* le quadrilataire est convexe on le retourne */ /* update des sommets */ /* ------------------------- */ nu[i12 + t1 * 6] = s4; nu[i22 + t2 * 6] = s1; /* update du pointeur suivant */ /* ----------------------------------- */ pslst = lst[ptlst * 3 + 1]; if (pslst > 0) { aas = lst[pslst * 3 + 3]; if (aas == i22 + 3) { lst[pslst * 3 + 2] = t1; lst[pslst * 3 + 3] = i11 + 3; } } /* update des aretes a1,a2 */ /* ------------------------------- */ tt1 = nu[i22 + 3 + t2 * 6]; nu[a1 + t1 * 6] = tt1; if (tt1 > 0) { tt = tt1 / 8; aa = tt1 - (tt << 3); nu[aa + tt * 6] = a1 + (t1 << 3); } else if (tt1 != nothing) { nu[-tt1 * 6 + 2] = a1 + (t1 << 3); } tt1 = nu[i12 + 3 + t1 * 6]; nu[a2 + t2 * 6] = tt1; if (tt1 > 0) { tt = tt1 / 8; aa = tt1 - (tt << 3); nu[aa + tt * 6] = a2 + (t2 << 3); } else if (tt1 != nothing) { nu[-tt1 * 6 + 2] = a2 + (t2 << 3); } nu[i12 + 3 + t1 * 6] = i22 + 3 + (t2 << 3); nu[i22 + 3 + t2 * 6] = i12 + 3 + (t1 << 3); det1 = (LONG8) (c[(s1 << 1) + 1] - c[(*ss1 << 1) + 1]) * (LONG8) y - (LONG8) (c[(s1 << 1) + 2] - c[(*ss1 << 1) + 2]) * (LONG8) x; det4 = (LONG8) (c[(s4 << 1) + 1] - c[(*ss1 << 1) + 1]) * (LONG8) y - (LONG8) (c[(s4 << 1) + 2] - c[(*ss1 << 1) + 2]) * (LONG8) x; if (det1 < 0 && det4 > 0) { /* le sommets s4 est dans omega */ lst[ptlst * 3 + 2] = t2; lst[ptlst * 3 + 3] = i22 + 3; } else if (det1 > 0 && det4 < 0) { /* le sommets s1 est dans omega */ lst[ptlst * 3 + 2] = t1; lst[ptlst * 3 + 3] = i12 + 3; } else { if (pplst == 0) { ttlst = lst[ptlst * 3 + 1]; ptlst = ttlst; } else { ptlst = lst[ptlst * 3 + 1]; lst[pplst * 3 + 1] = ptlst; } goto L30; } } pplst = ptlst; ptlst = lst[ptlst * 3 + 1]; goto L30; } if (ttlst != 0) { goto L20; } nu[i12 + 3 + t1 * 6] = nothing; nu[i22 + 3 + t2 * 6] = nothing; *t = t2; *ta = t1; i_1 = *nbac; for (i = 1; i <= i_1; ++i) { mshopt_ (&c[3], &nu[7], &lst[i * 3 + 2], 4L, err); mshopt_ (&c[3], &nu[7], &lst[i * 3 + 2], 5L, err); mshopt_ (&c[3], &nu[7], &lst[i * 3 + 2], 6L, err); } return 1; } /* mshfr2_ */ } freefem++-3.38-1/src/femlib/P012_1d.cpp000644 000767 000024 00000012324 11406226635 017352 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : P0,P1,P2 lagrange 1D // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "PkLagrange.hpp" namespace Fem2D { // P0 class TypeOfFE_P0Lagrange1d : public TypeOfFE_Lagrange { public: TypeOfFE_P0Lagrange1d(): TypeOfFE_Lagrange(0) { } void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, RNMK_ & val) const; virtual R operator()(const FElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const ; } ; R TypeOfFE_P0Lagrange1d::operator()(const FElement & K,const R1 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))); R r=0; if (op==0) r = u0; else r=0; return r; } void TypeOfFE_P0Lagrange1d::FB(const What_d whatd,const Mesh & ,const Element & K,const R1 & P,RNMK_ & val) const { assert(val.N() >=1); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = 1; } } // P1 class TypeOfFE_P1Lagrange1d : public TypeOfFE_Lagrange { public: TypeOfFE_P1Lagrange1d(): TypeOfFE_Lagrange(1) { } void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, RNMK_ & val) const; virtual R operator()(const FElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const ; } ; R TypeOfFE_P1Lagrange1d::operator()(const FElement & K,const R1 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))); R r=0; if (op==0) { R l0=1-PHat.x,l1=PHat.x; r = u0*l0+u1*l1; } else if(op==op_dx ) { const Element & T=K.T; R1 D[2]; T.Gradlambda(D); r = D[0].x*u0 + D[1].x*u1 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1Lagrange1d::FB(const What_d whatd,const Mesh & ,const Element & K,const R1 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x}; assert(val.N() >=Element::nv); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = l[0]; f0[1] = l[1]; } if (whatd & Fop_D1) { R1 Dl[3]; K.Gradlambda(Dl); if (whatd & Fop_dx) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl[0].x; f0x[1] = Dl[1].x; } } } class TypeOfFE_P2Lagrange1d : public TypeOfFE_Lagrange { public: typedef Mesh1 Mesh; typedef GFElement FElement; TypeOfFE_P2Lagrange1d(): TypeOfFE_Lagrange(2) { } void FB(const What_d whatd,const Mesh & Th,const Mesh1::Element & K,const Rd &P, RNMK_ & val) const; } ; void TypeOfFE_P2Lagrange1d::FB(const What_d whatd,const Mesh & ,const Element & K,const R1 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x}; assert(val.N() >=E::nv+E::ne); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); // if (whatd & Fop_D0) { int k=0; for(int i=0;i & P0Lagrange1d(P0_1d); static TypeOfFE_P1Lagrange1d P1_1d; GTypeOfFE & P1Lagrange1d(P1_1d); static TypeOfFE_P2Lagrange1d P2_1d; GTypeOfFE & P2Lagrange1d(P2_1d); template<> GTypeOfFE & DataFE::P0=P0_1d; template<> GTypeOfFE & DataFE::P1=P1_1d; template<> GTypeOfFE & DataFE::P2=P2_1d; } freefem++-3.38-1/src/femlib/P012_2d.cpp000644 000767 000024 00000013634 12061325411 017346 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : P0,P1,P2 lagrange 2D // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "PkLagrange.hpp" // P0 namespace Fem2D { class TypeOfFE_P0Lagrange2d : public TypeOfFE_Lagrange { public: TypeOfFE_P0Lagrange2d(): TypeOfFE_Lagrange(0) { } void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, RNMK_ & val) const; virtual R operator()(const FElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const ; } ; R TypeOfFE_P0Lagrange2d::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))); R r=0; if (op==0) r = u0; else r=0; return r; } void TypeOfFE_P0Lagrange2d::FB(const What_d whatd,const Mesh & ,const Element & K,const R2 & P,RNMK_ & val) const { assert(val.N() >=1); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = 1; } } // P1 class TypeOfFE_P1Lagrange2d : public TypeOfFE_Lagrange { public: TypeOfFE_P1Lagrange2d(): TypeOfFE_Lagrange(1) { } void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, RNMK_ & val) const; virtual R operator()(const FElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const ; } ; R TypeOfFE_P1Lagrange2d::operator()(const FElement & K,const R2 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))); R r=0; if (op==0) { R l0=1-PHat.x-PHat.y,l1=PHat.x,l2=PHat.y; r = u0*l0+u1*l1+l2*u2; } else if(op==op_dx || op==op_dy ) { const Element & T=K.T; R2 D[3]; T.Gradlambda(D); if (op==op_dx) r = D[0].x*u0 + D[1].x*u1 + D[2].x*u2; else r = D[0].y*u0 + D[1].y*u1 + D[2].y*u2 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1Lagrange2d::FB(const What_d whatd,const Mesh & ,const Element & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x,P.y}; assert(val.N() >=Element::nv); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = l[0]; f0[1] = l[1]; f0[2] = l[2]; } if (whatd & Fop_D1) { R2 Dl[3]; K.Gradlambda(Dl); if (whatd & Fop_dx) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl[0].x; f0x[1] = Dl[1].x; f0x[2] = Dl[2].x; } if (whatd & Fop_dy) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl[0].y; f0y[1] = Dl[1].y; f0y[2] = Dl[2].y; } } } class TypeOfFE_P2Lagrange2d : public TypeOfFE_Lagrange { public: typedef Mesh2 Mesh; typedef GFElement FElement; TypeOfFE_P2Lagrange2d(): TypeOfFE_Lagrange(2) { } void FB(const What_d whatd,const Mesh & Th,const Mesh2::Element & K,const Rd &P, RNMK_ & val) const; } ; void TypeOfFE_P2Lagrange2d::FB(const What_d whatd,const Mesh & ,const Element & K,const R2 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x,P.y}; assert(val.N() >=E::nv+E::ne); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); // if (whatd & Fop_D0) { int k=0; for(int i=0;i & P0Lagrange2d(P0_2d); static TypeOfFE_P1Lagrange2d P1_2d; GTypeOfFE & P1Lagrange2d(P1_2d); static TypeOfFE_P2Lagrange2d P2_2d; GTypeOfFE & P2Lagrange2d(P2_2d); template<> GTypeOfFE & DataFE::P0=P0_2d; template<> GTypeOfFE & DataFE::P1=P1_2d; template<> GTypeOfFE & DataFE::P2=P2_2d; } freefem++-3.38-1/src/femlib/P012_3d.cpp000644 000767 000024 00000051473 12524415026 017360 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY : P0,P1,P2 lagrange 3D // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "PkLagrange.hpp" namespace Fem2D { // P0 class TypeOfFE_P0Lagrange3d : public TypeOfFE_Lagrange { public: TypeOfFE_P0Lagrange3d(): TypeOfFE_Lagrange(0) { } void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, RNMK_ & val) const; virtual R operator()(const FElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const ; } ; R TypeOfFE_P0Lagrange3d::operator()(const FElement & K,const R3 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))); R r=0; if (op==0) r = u0; else r=0; return r; } void TypeOfFE_P0Lagrange3d::FB(const What_d whatd,const Mesh & ,const Element & K,const R3 & P,RNMK_ & val) const { assert(val.N() >=1); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = 1; } } // P1 class TypeOfFE_P1Lagrange3d : public TypeOfFE_Lagrange { public: TypeOfFE_P1Lagrange3d(): TypeOfFE_Lagrange(1) { } void FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P, RNMK_ & val) const; virtual R operator()(const FElement & K,const RdHat & PHat,const KN_ & u,int componante,int op) const ; } ; R TypeOfFE_P1Lagrange3d::operator()(const FElement & K,const R3 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))),u3(u(K(3))); R r=0; if (op==0) { R l0=1-PHat.x-PHat.y-PHat.z,l1=PHat.x,l2=PHat.y,l3=PHat.z; r = u0*l0+u1*l1+l2*u2+l3*u3; } else if(op==op_dx || op==op_dy || op==op_dz) // dx => dy thank to Pichon 27/01/2008 (FH) { const Element & T=K.T; R3 D[4]; T.Gradlambda(D); if (op==op_dx) r = D[0].x*u0 + D[1].x*u1 + D[2].x*u2+ D[3].x*u3 ; else if (op==op_dy) r = D[0].y*u0 + D[1].y*u1 + D[2].y*u2+ D[3].y*u3 ; else r = D[0].z*u0 + D[1].z*u1 + D[2].z*u2+ D[3].z*u3 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1Lagrange3d::FB(const What_d whatd,const Mesh & ,const Element & K,const R3 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x,P.y,P.z}; assert(val.N() >=Element::nv); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = l[0]; f0[1] = l[1]; f0[2] = l[2]; f0[3] = l[3]; } if (whatd & Fop_D1) { R3 Dl[4]; K.Gradlambda(Dl); //for(int i=0;i<4;++i) // cout << Dl[i] << endl; if (whatd & Fop_dx) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl[0].x; f0x[1] = Dl[1].x; f0x[2] = Dl[2].x; f0x[3] = Dl[3].x; } if (whatd & Fop_dy) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl[0].y; f0y[1] = Dl[1].y; f0y[2] = Dl[2].y; f0y[3] = Dl[3].y; } if (whatd & Fop_dz) { RN_ f0z(val('.',0,op_dz)); f0z[0] = Dl[0].z; f0z[1] = Dl[1].z; f0z[2] = Dl[2].z; f0z[3] = Dl[3].z; } } // cout << val << endl; } class TypeOfFE_P2Lagrange3d : public TypeOfFE_Lagrange { public: typedef Mesh3 Mesh; typedef GFElement FElement; TypeOfFE_P2Lagrange3d(): TypeOfFE_Lagrange(2) { } void FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P, RNMK_ & val) const; } ; class TypeOfFE_P1bLagrange3d : public TypeOfFE_Lagrange { public: typedef Mesh3 Mesh; typedef GFElement FElement; TypeOfFE_P1bLagrange3d(): TypeOfFE_Lagrange(-1) { } void FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P, RNMK_ & val) const; } ; void TypeOfFE_P2Lagrange3d::FB(const What_d whatd,const Mesh & ,const Element & K,const R3 & P,RNMK_ & val) const { // const Triangle & K(FE.T); R l[]={1.-P.sum(),P.x,P.y,P.z}; assert(val.N() >=E::nv+E::ne); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); // if (whatd & Fop_D0) { int k=0; for(int i=0;iop_dxy); RN_ fxy(val('.',0,op_dxy)); fxy[0] = 4*Dl0.x*Dl0.y; fxy[1] = 4*Dl1.x*Dl1.y; fxy[2] = 4*Dl2.x*Dl2.y; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } */ } /* R TypeOfFE_P1bLagrange3d::operator()(const FElement & K,const R3 & PHat,const KN_ & u,int componante,int op) const { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))),u3(u(K(3))),u4(u(K(4))); R r=0; if (op==0) { R l0=1-PHat.x-PHat.y-PHat.z,l1=PHat.x,l2=PHat.y,l3=PHat.z; R l0123= r = u0*l0+u1*l1+l2*u2+l3*u3; } else if(op==op_dx || op==op_dy || op==op_dz) // dx => dy thank to Pichon 27/01/2008 (FH) { const Element & T=K.T; R3 D[4]; T.Gradlambda(D); if (op==op_dx) r = D[0].x*u0 + D[1].x*u1 + D[2].x*u2+ D[3].x*u3 ; else if (op==op_dy) r = D[0].y*u0 + D[1].y*u1 + D[2].y*u2+ D[3].y*u3 ; else r = D[0].z*u0 + D[1].z*u1 + D[2].z*u2+ D[3].z*u3 ; } // cout << r << "\t"; return r; } */ void TypeOfFE_P1bLagrange3d::FB(const What_d whatd,const Mesh & ,const Element & K,const R3 & P,RNMK_ & val) const { // const Triangle & K(FE.T); const R d1=d+1.; const R d13=d1*d1*d1; const R d14=d13*d1; R ll[]={1.-P.sum(),P.x,P.y,P.z}; R lb4= (ll[0]*ll[1]*ll[2]*ll[3])*d13; // d1^-4 d1^3 = 1/d1 in G R lb=lb4*d1; // 1 in G R l[5]; for(int i=0;i<4;i++) l[i]=ll[i]-lb4; // 1/d1 in G - 1/d1 G =0 l[4]=lb; assert(val.N() >=Element::nv); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = l[0]; f0[1] = l[1]; f0[2] = l[2]; f0[3] = l[3]; f0[4] = l[4]; } if (whatd & Fop_D1) { R3 Dl[4]; K.Gradlambda(Dl); R3 Dlb4 = ( + Dl[0]*(ll[1]*ll[2]*ll[3]) + Dl[1]*(ll[0]*ll[2]*ll[3]) + Dl[2]*(ll[0]*ll[1]*ll[3]) + Dl[3]*(ll[0]*ll[1]*ll[2]) )*d13; //for(int i=0;i<4;++i) // cout << Dl[i] << endl; if (whatd & Fop_dx) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl[0].x-Dlb4.x; f0x[1] = Dl[1].x-Dlb4.x; f0x[2] = Dl[2].x-Dlb4.x; f0x[3] = Dl[3].x-Dlb4.x; f0x[4] = Dlb4.x*d1; } if (whatd & Fop_dy) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl[0].y-Dlb4.y; f0y[1] = Dl[1].y-Dlb4.y; f0y[2] = Dl[2].y-Dlb4.y; f0y[3] = Dl[3].y-Dlb4.y; f0y[4] = Dlb4.y*d1; } if (whatd & Fop_dz) { RN_ f0z(val('.',0,op_dz)); f0z[0] = Dl[0].z-Dlb4.z; f0z[1] = Dl[1].z-Dlb4.z; f0z[2] = Dl[2].z-Dlb4.z; f0z[3] = Dl[3].z-Dlb4.z; f0z[4] = Dlb4.z*d1; } } else if (whatd & Fop_D2) ffassert(0); // a faire ... // cout << val << endl; } class TypeOfFE_RT0_3d : public GTypeOfFE { public: typedef Mesh3 Mesh; typedef Mesh3::Element Element; typedef GFElement FElement; static int dfon[]; static const int d=Mesh::Rd::d; TypeOfFE_RT0_3d(); int edgeface[4][3] ; void FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P, RNMK_ & val) const; void set(const Mesh & Th,const Element & K,InterpolationMatrix & M,int ocoef,int odf,int *nump ) const; } ; int TypeOfFE_RT0_3d::dfon[]={0,0,1,0}; TypeOfFE_RT0_3d::TypeOfFE_RT0_3d(): GTypeOfFE(dfon,d,1,3*3*4,6,false,true) { // integration on middle of edge (light ) on each face .. R3 Pt[]= {R3(0.,0.,0.), R3(1.,0.,0.),R3(0.,1.,0.),R3(0.,0.,1.)}; for (int i=0;iPtInterpolation[i]=(Pt[Element::nvedge[i][0]]+Pt[Element::nvedge[i][1]])*0.5; // static const int nvfaceTet[4][3] ={{3,2,1}, {0,2,3},{ 3,1,0},{ 0,1,2}} ;//{ {2,1,3},{0,2,3},{1,0,3},{0,1,2} }; // { {0,1},{0,2},{0,3},{1,2},{1,3},{2,3} }; // 0 1 2 3 4 5 { int i=0; for (int f=0;f<4;f++) for (int e=0,i=0;e<6;e++) if ((Element::nvedge[e][0] !=f) && (Element::nvedge[e][1]!=f)) edgeface[f][i++]=e; } { int i=0; for (int f=0;f<4;f++) { // cout << " face : " << f << endl; for (int p=0;p<3;p++) { int e= edgeface[f][p] ; // cout << " , " << this->PtInterpolation[e]; for (int c=0;c<3;c++,i++) { this->pInterpolation[i]=e; this->cInterpolation[i]=c; this->dofInterpolation[i]=f; this->coefInterpolation[i]=0.; } } //cout << endl; } } } void TypeOfFE_RT0_3d::set(const Mesh & Th,const Element & K,InterpolationMatrix & M ,int ocoef,int odf,int *nump) const { // compute de coef d'interpolation // M.coef int i=ocoef; for (int f=0;f<4;f++) { R3 N=K.N(f);// exterior and ||N|| = 2* area f N *= K.faceOrient(f)/6.; for (int p=0;p<3;p++) { int e= edgeface[f][p] ; for (int c=0;c<3;c++,i++) { //this->pInterpolation[i]=e; //this->cInterpolation[i]=c; //this->dofInterpolation[i]=f; M.coef[i]=N[c]; } }} // cout << " M.coef :" << M.coef << endl; //ffassert(i==M.ncoef && M.np == 6 ); } void TypeOfFE_RT0_3d::FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P, RNMK_ & val) const { assert(val.N() >=4); assert(val.M()==3 ); // wi = signe * (x - qi)/ (volume*d) val=0; R cc =1./(d*K.mesure()); R ci[4]={ cc*K.faceOrient(0),cc*K.faceOrient(1),cc*K.faceOrient(2),cc*K.faceOrient(3)}; if (whatd & Fop_D0) { R3 X=K(P); int k=0; for(int i=0;i<4;++i) { R3 wi=(X-K[i])*ci[i]; val(i,0,op_id) = wi.x ; val(i,1,op_id) = wi.y ; val(i,2,op_id) = wi.z ; //cout << "RT 3d "< { public: typedef Mesh3 Mesh; typedef Mesh3::Element Element; typedef GFElement FElement; static int dfon[]; static const int d=Mesh::Rd::d; static const GQuadratureFormular QFe; int edgeface[4][3] ; TypeOfFE_Edge0_3d(); void FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P, RNMK_ & val) const; void set(const Mesh & Th,const Element & K,InterpolationMatrix & M ,int ocoef,int odf,int *nump ) const; } ; int TypeOfFE_Edge0_3d::dfon[]={0,1,0,0}; const GQuadratureFormular TypeOfFE_Edge0_3d::QFe(-1+2*2,2,GaussLegendre(2),true); TypeOfFE_Edge0_3d::TypeOfFE_Edge0_3d(): GTypeOfFE(TypeOfFE_Edge0_3d::dfon,d,1,Element::ne*3*QFe.n,Element::ne*QFe.n,false,true) { assert(QFe.n); // integration on edge use QFe R3 Pt[]= {R3(0.,0.,0.), R3(1.,0.,0.),R3(0.,1.,0.),R3(0.,0.,1.)}; for (int e=0,i=0;ePtInterpolation[i]=Pt[Element::nvedge[e][0]]*x+Pt[Element::nvedge[e][1]]*(1-x); } { int i=0,p=0; for (int e=0;epInterpolation[i]=p; this->cInterpolation[i]=c; this->dofInterpolation[i]=e; this->coefInterpolation[i]=0.; } } } // cout << " ++ TypeOfFE_Edge0_3d():"<< this->PtInterpolation << endl; } void TypeOfFE_Edge0_3d::set(const Mesh & Th,const Element & K,InterpolationMatrix & M ,int ocoef,int odf,int *nump ) const { // compute de coef d'interpolation // M.coef int i=ocoef,p=0; for (int e=0;epInterpolation[i]=p; //this->cInterpolation[i]=c; //this->dofInterpolation[i]=e; M.coef[i]=E[c]*QFe[q].a; } } // ffassert(i==M.ncoef && M.np == p ); } void TypeOfFE_Edge0_3d::FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P, RNMK_ & val) const { assert(val.N() >=6); assert(val.M()==3 ); R l[]={1.-P.sum(),P.x,P.y,P.z}; R3 D[4]; K.Gradlambda(D); // wi = signe * (x - qi)/ (volume*d) val=0; // i,j : l1 grad lj - lj grad lj // int_i^j grad lj . t_ij = 1 bool se[]={ K.EdgeOrientation(0), K.EdgeOrientation(1), K.EdgeOrientation(2), K.EdgeOrientation(3), K.EdgeOrientation(4), K.EdgeOrientation(5)}; if (whatd & Fop_D0) { R3 X=K(P); int k=0; for(int i=0;i<6;++i) { int i0=Element::nvedge[i][0],i1=Element::nvedge[i][1]; if( !se[i]) Exchange(i0,i1); R3 wi = l[i0]*D[i1]-l[i1]*D[i0]; val(i,0,op_id) = wi.x ; val(i,1,op_id) = wi.y ; val(i,2,op_id) = wi.z ; // cout << "Edge0 3d "< & P0Lagrange3d(P0_3d); static TypeOfFE_P1Lagrange3d P1_3d; GTypeOfFE & P1Lagrange3d(P1_3d); static TypeOfFE_P2Lagrange3d P2_3d; GTypeOfFE & P2Lagrange3d(P2_3d); static TypeOfFE_P1bLagrange3d P1b_3d; GTypeOfFE & P1bLagrange3d(P1b_3d); static TypeOfFE_RT0_3d RT0_3d; GTypeOfFE & RT03d(RT0_3d); static TypeOfFE_Edge0_3d Edge0_3d; GTypeOfFE & Edge03d(Edge0_3d); template<> GTypeOfFE & DataFE::P0=P0_3d; template<> GTypeOfFE & DataFE::P1=P1_3d; template<> GTypeOfFE & DataFE::P2=P2_3d; } freefem++-3.38-1/src/femlib/PkLagrange.hpp000644 000767 000024 00000006662 11602363250 020365 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: Jan 2008 // -*- Mode : c++ -*- // // SUMMARY :Generic Pk Lagrange finite element class // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "FESpacen.hpp" namespace Fem2D { template static void SetPtPk(Rd *Pt,const int *dfon,int nn) { // P0 P1 et P2 , P1b const int d= E::Rd::d; int k=0; if(dfon[0]) { for(int i=0;i<=d;++i) Pt[k++]=Rd(); for(int i=0;i9) cout << " Pk = " << KN_(Pt,nn)<<"\n"; } // a class of Lagrange Pk finite element template class TypeOfFE_Lagrange: public GTypeOfFE { //typedef typename MMesh Mesh; public: typedef MMesh Mesh; typedef typename Mesh::Element Element; typedef typename Element::Rd Rd; typedef typename Element::RdHat RdHat; static const int d=Rd::d; struct A4 { int dfon[4]; A4(int k) { if(k==0) {// P0 dfon[0]=dfon[1]=dfon[2]=dfon[3]=0; dfon[d]=1; } else if(k==-1) // P1b. add FH March 2009 { dfon[0]=1; dfon[1]=dfon[2]=dfon[3]=0; dfon[d]=1; } else { dfon[0]=1; dfon[1]=max(k-1,0); dfon[2]=d>1?max(k-2,0):0; dfon[3]=d>2?max(k-3,0):0;} if(verbosity>9) cout << "A4 "<< k<< " " <(A4(k),1,k==-1?-1:Max(k,1),k<=2,k==0) { int n=this->NbDoF; if(verbosity>9) cout << "\n +++ P"< (this->PtInterpolation,this->ndfOn(),this->NbDoF); if(verbosity>9) cout << this->PtInterpolation<< endl; for (int i=0;ipInterpolation[i]=i; this->cInterpolation[i]=0; this->dofInterpolation[i]=i; this->coefInterpolation[i]=1.; } } ~TypeOfFE_Lagrange(){ } //cout << "TypeOfFE_Lagrange"<< this->NbDoF< #include #include #include using namespace std; #include "error.hpp" #include "ufunction.hpp" #include "QuadratureFormular.hpp" namespace Fem2D { template QF * QF_exact(int exact,QF * p=0) { exact=max(0,exact); const int N=100; assert(exact=0); static QF ** a=0; if(a==0) { // a = new QF*[N]; assert(a); for(int i=0;i=0 && exact < N); if ( p ) { //cout << endl << " QF " << exact << " " << p->exact << " " << p->n << endl;; for( int i=0;i<=exact;++i) { if( a[i]== 0 || a[i]->n > p->n) a[i]= p; // cout << " QF: on " << ON << " exact P_" << i << " : "<< a[i]->n << endl; } } else p=a[exact]; return p; } template GQuadratureFormular * QF_Simplex(int exact) { return QF_exact,Rd::d+1>(exact); } // explict instantiation template GQuadratureFormular * QF_Simplex(int exact); template GQuadratureFormular * QF_Simplex(int exact); template GQuadratureFormular * QF_Simplex(int exact); template ostream& operator <<(ostream& f,const GQuadraturePoint & p) { f << '{' << (const R) p << '\t' << (const Rd &) p << '}' ; return f;} template ostream& operator <<(ostream& f, const GQuadratureFormular & fi) { f << "nb de point integration " << fi.n << ", adr = " << &f << endl; for (int i=0;i P_QuadratureFormular_T_1[1] = { GQuadraturePoint(1.,R2(1./3.,1./3.)) }; const GQuadratureFormular QuadratureFormular_T_1(1,1,P_QuadratureFormular_T_1); // ---------------------------------------------------------------------- static GQuadraturePoint P_QuadratureFormular_T_1lump[3] = { GQuadraturePoint(1./3.,R2(0.,0.)) , GQuadraturePoint(1./3.,R2(1.,0.)) , GQuadraturePoint(1./3.,R2(0.,1.)) }; GQuadratureFormular const QuadratureFormular_T_1lump(1,3,P_QuadratureFormular_T_1lump); // ---------------------------------------------------------------------- static GQuadraturePoint P_QuadratureFormular_T_2[3] = { GQuadraturePoint(1./3.,R2(0.5,0.5)) , GQuadraturePoint(1./3.,R2(0.0,0.5)) , GQuadraturePoint(1./3.,R2(0.5,0.0)) }; GQuadratureFormular const QuadratureFormular_T_2(2,3,P_QuadratureFormular_T_2); // ---------------------------------------------------------------------- static GQuadraturePoint P_QuadratureFormular_T_2_4P1[9] = { GQuadraturePoint(1./12.,R2(0.25,0.75)) , GQuadraturePoint(1./12.,R2(0.75,0.25)) , GQuadraturePoint(1./12.,R2(0.0,0.25)) , GQuadraturePoint(1./12.,R2(0.0,0.75)) , GQuadraturePoint(1./12.,R2(0.25,0.0)) , GQuadraturePoint(1./12.,R2(0.75,0.0)) , GQuadraturePoint(1./6.,R2(0.25,0.25)) , GQuadraturePoint(1./6.,R2(0.25,0.50)) , GQuadraturePoint(1./6.,R2(0.50,0.25)) }; GQuadratureFormular const QuadratureFormular_T_2_4P1(2,9,P_QuadratureFormular_T_2_4P1); // ---------------------------------------------------------------------- // STROUD page 314 // ----------------------------- const R sqrt15 = 3.87298334620741688517926539978; const R t_T5 =1.E0/3.E0 , A_T5 = 0.225E0; const R r_T5 = (6-sqrt15)/21 , s_T5 = (9+2*sqrt15)/21 , B_T5 = (155-sqrt15)/1200; const R u_T5 = (6+sqrt15)/21 , v_T5 = (9-2*sqrt15)/21 , C_T5 = (155+sqrt15)/1200; // OK cette formule est OK static GQuadraturePoint P_QuadratureFormular_T_5[] = { GQuadraturePoint(A_T5,R2(t_T5,t_T5)), GQuadraturePoint(B_T5,R2(r_T5,r_T5)), GQuadraturePoint(B_T5,R2(r_T5,s_T5)), GQuadraturePoint(B_T5,R2(s_T5,r_T5)), GQuadraturePoint(C_T5,R2(u_T5,u_T5)), GQuadraturePoint(C_T5,R2(u_T5,v_T5)), GQuadraturePoint(C_T5,R2(v_T5,u_T5)) }; const GQuadratureFormular QuadratureFormular_T_5(5,7,P_QuadratureFormular_T_5); // ------------------ //---- // Thanks to http://xyz.lanl.gov/format/math.NA/0501496 /* Mathematics, abstract math.NA/0501496 From: Mark Taylor [view email] Date: Thu, 27 Jan 2005 19:17:37 GMT (27kb) Several new quadrature formulas for polynomial integration in the triangle Authors: Mark A. Taylor, Beth A. Wingate, Len P. Bos Comments: 14 pages, 14 figures, 5 pages of tabulated quadrature points Report-no: SAND2005-0034J */ // ---------------------------------------------------------------------- // awk '/15:/,/21:/ {print "GQuadraturePoint(" $3 "/2," $1"," $2"),"}' coords.txt static GQuadraturePoint P_QuadratureFormular_T_7[] = { GQuadraturePoint(0.0102558174092/2,R2(1.0000000000000,0.0000000000000)), GQuadraturePoint(0.0102558174092/2,R2(0.0000000000000,0.0000000000000)), GQuadraturePoint(0.0102558174092/2,R2(0.0000000000000,1.0000000000000)), GQuadraturePoint(0.1116047046647/2,R2(0.7839656651012,0.0421382841642)), GQuadraturePoint(0.1116047046647/2,R2(0.1738960507345,0.7839656651012)), GQuadraturePoint(0.1116047046647/2,R2(0.1738960507345,0.0421382841642)), GQuadraturePoint(0.1116047046647/2,R2(0.0421382841642,0.1738960507345)), GQuadraturePoint(0.1116047046647/2,R2(0.7839656651012,0.1738960507345)), GQuadraturePoint(0.1116047046647/2,R2(0.0421382841642,0.7839656651012)), GQuadraturePoint(0.1679775595335/2,R2(0.4743880861752,0.4743880861752)), GQuadraturePoint(0.1679775595335/2,R2(0.4743880861752,0.0512238276497)), GQuadraturePoint(0.1679775595335/2,R2(0.0512238276497,0.4743880861752)), GQuadraturePoint(0.2652238803946/2,R2(0.2385615300181,0.5228769399639)), GQuadraturePoint(0.2652238803946/2,R2(0.5228769399639,0.2385615300181)), GQuadraturePoint(0.2652238803946/2,R2(0.2385615300181,0.2385615300181)) }; const GQuadratureFormular QuadratureFormular_T_7(7,15,P_QuadratureFormular_T_7); // awk '/21:/,/28:/ {print "GQuadraturePoint(" $3 "/2," $1"," $2"),"}' coords.txt static GQuadraturePoint P_QuadratureFormular_T_9[] = { GQuadraturePoint(0.0519871420646/2,R2(0.0451890097844,0.0451890097844)), GQuadraturePoint(0.0519871420646/2,R2(0.0451890097844,0.9096219804312)), GQuadraturePoint(0.0519871420646/2,R2(0.9096219804312,0.0451890097844)), GQuadraturePoint(0.0707034101784/2,R2(0.7475124727339,0.0304243617288)), GQuadraturePoint(0.0707034101784/2,R2(0.2220631655373,0.0304243617288)), GQuadraturePoint(0.0707034101784/2,R2(0.7475124727339,0.2220631655373)), GQuadraturePoint(0.0707034101784/2,R2(0.2220631655373,0.7475124727339)), GQuadraturePoint(0.0707034101784/2,R2(0.0304243617288,0.7475124727339)), GQuadraturePoint(0.0707034101784/2,R2(0.0304243617288,0.2220631655373)), GQuadraturePoint(0.0909390760952/2,R2(0.1369912012649,0.2182900709714)), GQuadraturePoint(0.0909390760952/2,R2(0.6447187277637,0.2182900709714)), GQuadraturePoint(0.0909390760952/2,R2(0.1369912012649,0.6447187277637)), GQuadraturePoint(0.0909390760952/2,R2(0.2182900709714,0.6447187277637)), GQuadraturePoint(0.0909390760952/2,R2(0.2182900709714,0.1369912012649)), GQuadraturePoint(0.0909390760952/2,R2(0.6447187277637,0.1369912012649)), GQuadraturePoint(0.1032344051380/2,R2(0.0369603304334,0.4815198347833)), GQuadraturePoint(0.1032344051380/2,R2(0.4815198347833,0.0369603304334)), GQuadraturePoint(0.1032344051380/2,R2(0.4815198347833,0.4815198347833)), GQuadraturePoint(0.1881601469167/2,R2(0.4036039798179,0.1927920403641)), GQuadraturePoint(0.1881601469167/2,R2(0.4036039798179,0.4036039798179)), GQuadraturePoint(0.1881601469167/2,R2(0.1927920403641,0.4036039798179)) }; const GQuadratureFormular QuadratureFormular_T_9(9,21,P_QuadratureFormular_T_9); // Computation of nodes and weights for a Gauss-Legendre quadrature formula // on [0,1] seg. typedef GQuadraturePoint QP1; QP1 * GaussLegendre(int nn) // : exact(nn*2-1),n(nn),p(new Point[nn]) { QP1 *p=new QP1[nn]; int n=nn; double r, r1, p1, p2, p3, dp3; double eps=1e-16; const double pi=3.141592653589793238463;//M_PI; for(int i = 0,ii=n; i <= (n+1)/2-1; i++) { ii-=1; r = cos(pi*(4*i+3)/(4*n+2)); do { p2 = 0; p3 = 1; for(int j = 0; j <= n-1; j++) { p1 = p2; p2 = p3; p3 = ((2*j+1)*r*p2-j*p1)/(j+1); } dp3 = n*(r*p3-p2)/(r*r-1); r1 = r; r = r-p3/dp3; } while(fabs(r-r1)>=eps*(1+fabs(r))*100); p[i].x = 0.5 +r/2; p[ii].x =0.5 -r/2; p[i].a=p[ii].a= 1./((1.-r*r)*dp3*dp3); } // Check(); return p; } /* void QuadratureFormular1d::Check() { QF_exact(exact,this); int err=0; for(int m=0;m<=exact;++m) { R ve = 1./ ( m+1), v=0.; for (int i=0;i 1.e-8) { cout << " erreur QuadratureFormular1d n= " << n << " exact = " << exact << endl; cout << " int x^" < class GQuadraturePoint: public QuadratureWeight,public Rd { public: typedef GQuadraturePoint QP ; GQuadraturePoint(): QuadratureWeight(0),Rd() {} GQuadraturePoint(R aa, const Rd &xx): QuadratureWeight(aa),Rd(xx) {} GQuadraturePoint(const Rd & xx,R aa): QuadratureWeight(aa),Rd(xx) {} operator R() const {return a;} GQuadraturePoint(R aa,R xx):QuadratureWeight(aa),Rd(xx) {} GQuadraturePoint(R aa,R x,R y):QuadratureWeight(aa),Rd(x,y) {} GQuadraturePoint(R aa,R x,R y,R z):QuadratureWeight(aa),Rd(x,y,z) {} template GQuadraturePoint Bary(RD * K, double mes) { return GQuadraturePoint(this->Rd::Bary(K),a*mes);} }; template class GQuadratureFormular { public: typedef Rdd Rd; typedef GQuadraturePoint QuadraturePoint; typedef GQuadraturePoint QP; int exact; // exact int n; // nombre de point d'integration const int size; // size of the array private: QP *p; // les point d'integration const bool clean; public: // -- les fonctions ------------------ void Verification(); // for verification GQuadratureFormular (int e,int NbOfNodes,QuadraturePoint *pp,bool c=false) :exact(e), n(NbOfNodes),size(n),p(pp),clean(c) {Verification();} GQuadratureFormular (int e,int NbOfNodes,const QuadraturePoint *pp,bool c=false) :exact(e),n(NbOfNodes),p(pp),clean(c) {Verification();} GQuadratureFormular(int ex,QP p0,QP p1,QP p2,QP p3,QP p4) : exact(ex),n(5),size(n),p(new QP[5]),clean(true) { p[0]=p0;p[1]=p1;p[2]=p2;p[3]=p3;p[4]=p4;Verification();} GQuadratureFormular(int ex,QP p0,QP p1,QP p2,QP p3) : exact(ex),n(4),size(n),p(new QP[4]) ,clean(true){ p[0]=p0,p[1]=p1,p[2]=p2;p[3]=p3;Verification();} GQuadratureFormular(int ex,QP p0,QP p1,QP p2) : exact(ex),n(3),size(n),p(new QP[3]),clean(true) { p[0]=p0,p[1]=p1,p[2]=p2;Verification();} GQuadratureFormular(int ex,QP p0,QP p1) : exact(ex),n(2),size(n),p(new QP[2]),clean(true) { p[0]=p0,p[1]=p1;Verification();} GQuadratureFormular(int ex,QP p0) : exact(ex),n(1),size(n),p(new QP[1]),clean(true) { p[0]=p0;Verification();} // bluid a empty GQuadratureFormular GQuadratureFormular(int ssize):exact(0),n(0),size(ssize),p(new QP[size]),clean(true) {} const QP & operator [](int i) const {return p[i];} const QP & operator ()(int i) const {return p[i];} ~GQuadratureFormular() {if(clean) delete [] p;} GQuadratureFormular(const GQuadratureFormular & QF, int mul=1) :exact(QF.exact),n(QF.n),size(QF.size*mul),p(new QP[size]),clean(true){ operator=(QF);} void operator=(const GQuadratureFormular &QF) { assert(size>=QF.n); n = QF.n; for(int i=0;i void AddQFK(const GQuadratureFormular &QF ,Rd *K,double mes,int n0=0) { assert( size >= n0 + QF.n ); n0 += n; n = n0 + QF.n; for(int i=0;i ostream& operator <<(ostream& , const GQuadratureFormular & ) ; template ostream& operator <<(ostream& , GQuadraturePoint & ); typedef GQuadratureFormular QuadratureFormular1d; extern const QuadratureFormular1d QF_GaussLegendre1; extern const QuadratureFormular1d QF_GaussLegendre2; extern const QuadratureFormular1d QF_GaussLegendre3; extern const QuadratureFormular1d QF_GaussLegendre4; extern const QuadratureFormular1d QF_GaussLegendre5; extern const QuadratureFormular1d QF_LumpP1_1D; extern const GQuadratureFormular QuadratureFormular_T_1; extern const GQuadratureFormular QuadratureFormular_T_1lump; extern const GQuadratureFormular QuadratureFormular_T_2; extern const GQuadratureFormular QuadratureFormular_T_5; extern const GQuadratureFormular QuadratureFormular_T_2_4P1; extern const GQuadratureFormular QuadratureFormular_T_7; extern const GQuadratureFormular QuadratureFormular_T_9; extern const GQuadratureFormular QuadratureFormular_Tet_1; extern const GQuadratureFormular QuadratureFormular_Tet_1lump; extern const GQuadratureFormular QuadratureFormular_Tet_2; extern const GQuadratureFormular QuadratureFormular_Tet_5; template GQuadratureFormular * QF_Simplex(int exact); // { return QF_exact,Rd::d+1>(exact);} template void setQF( GQuadratureFormular &FI, const GQuadratureFormular & FI1 , const GQuadratureFormular & FI0 , Rd Q[Rd::d][Rd::d+1], double *cmes, int n) { FI.reset(); for(int i=0; i< n; ++i) if(cmes[i]==1) FI=FI1; else if(cmes[i] > 1e-4) FI.AddQFK(FI1,Q[i],cmes[i]); else if ( cmes[i]> 1e-8 ) FI.AddQFK(FI0,Q[i],cmes[i]); } } namespace Fem2D { typedef GQuadratureFormular QuadratureFormular; typedef GQuadraturePoint QuadraturePoint; typedef GQuadratureFormular QuadratureFormular1d; typedef GQuadraturePoint QuadratureFormular1dPoint; GQuadraturePoint * GaussLegendre(int nn); } #endif freefem++-3.38-1/src/femlib/R1.hpp000644 000767 000024 00000007665 12334663556 016657 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model of $\mathbb{R}^1$ // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef R1_HPP #define R1_HPP #include #include #include typedef double R; // R0 R1, R2 , R3 to be uniforme. // The class R1 class R0 { public: typedef double R; static const int d=0; R0(){} }; class R2; class R3; class R1 { public: typedef double R; static const int d=1; R x; // declaration de membre // les 3 constructeurs --- R1 () :x(0.){} // rappel : x(0) sont initialiser via le constructeur de double R1 (R a):x(a) {} R1 (const R1 & a,const R1 & b):x(b.x-a.x) {} static R1 diag(R a){ return R1(a);} // rappel les operator definis dans une class on un parametre // cache qui est la classe elle meme (*this) // les operateurs affectation // operateur affection (*this) = P est inutil par defaut il fait le travail correctement // les autre operoteur affectations R1 & operator+=(const R1 & P) {x += P.x;return *this;} R1 & operator-=(const R1 & P) {x -= P.x;return *this;} R1 & operator*=(R a) {x *= a;return *this;} R1 & operator/=(R a) {x /= a;return *this;} // operateur binaire + - * , ^ / R1 operator+(const R1 & P)const {return R1(x+P.x);} R1 operator-(const R1 & P)const {return R1(x-P.x);} R operator,(const R1 & P)const {return x*P.x;} // produit scalaire R1 operator*(R c)const {return R1(x*c);} R1 operator/(R c)const {return R1(x/c);} // operateur unaire R1 operator-()const {return R1(-x);} R1 operator+()const {return *this;} // un methode R sum() const { return x;} R * toBary(R * b) const { b[0]=1-x;b[1]=x;return b;} // les operators tableaux // version qui peut modifie la class via l'adresse de x R & operator[](int i){ return (&x)[i];} const R & operator[](int i) const { return (&x)[i];} R norme() const { return std::sqrt(x*x);} R norme2() const { return (x*x);} R1 Bary(R1 P[d+1]) const { return (1-x)*P[0]+x*P[1];} // add FH R1 Bary(const R1 *const *const P ) const { return (1-x)*(*P[0])+x*(*P[1]);} // add FH R2 Bary(R2 P[d+1]) const;// { return (1-x)*P[0]+x*P[1];} // add FH R2 Bary(const R2 *const *const P ) const ;//{ return (1-x)*(*P[0])+x*(*P[1]);} // add FH R3 Bary(R3 P[d+1]) const ;//{ return (1-x)*P[0]+x*P[1];} // add FH R3 Bary(const R3 *const *const P ) const ;//{ return (1-x)*(*P[0])+x*(*P[1]);} // add FH friend R1 operator*(R c,const R1 & P) {return P*c;} friend std::ostream& operator <<(std::ostream& f, const R1 & P ) { f << P.x ; return f; } friend std::istream& operator >>(std::istream& f, R1 & P) { f >> P.x ; return f; } static const R1 KHat[d+1]; }; inline R1 Minc(const R1 & A,const R1 &B){ return R1(min(A.x,B.x));} inline R1 Maxc(const R1 & A,const R1 &B){ return R1(max(A.x,B.x));} inline double Norme_infty(const R1 & A){return std::fabs(A.x);} inline double Norme2_2(const R1 & A){ return A.x*A.x;} inline double Norme2(const R1 & A){ return std::fabs(A.x);} #endif freefem++-3.38-1/src/femlib/R2.hpp000644 000767 000024 00000011376 12334663254 016645 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model of $\mathbb{R}^2$ // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef R2_HPP #define R2_HPP #include #include #include // Definition de la class R2 // sans compilation separe toute les fonctions // sous defini dans ce R2.hpp avec des inline // // definition R (les nombres reals) // remarque la fonction abort est defini dans // #include // The class R2 class R3; class R2 { public: typedef double R; static const int d=2; R x,y; // declaration de membre // les 3 constructeurs --- R2 () :x(0.),y(0.) {} // rappel : x(0), y(0) sont initialiser via le constructeur de double R2 (R a,R b):x(a),y(b) {} R2 (const R * a):x(a[0]),y(a[1]) {} R2 ( R * a):x(a[0]),y(a[1]) {} R2 (const R2 & a,const R2 & b):x(b.x-a.x),y(b.y-a.y) {} static R2 diag(R a){ return R2(a,a);} // le constucteur par defaut est inutile //R2 (const R2 & a) :x(a.x),y(a.y) {} // rappel les operator definis dans une class on un parametre // cache qui est la classe elle meme (*this) // les operateurs affectation // operateur affection (*this) = P est inutil par defaut il fait le travail correctement //R2 & operator=(const R2 & P) {x = P.x;y = P.y;return *this;} // les autre operoteur affectations R2 & operator+=(const R2 & P) {x += P.x;y += P.y;return *this;} R2 & operator-=(const R2 & P) {x -= P.x;y -= P.y;return *this;} R2 & operator*=(R a) {x *= a;y *= a;return *this;} R2 & operator/=(R a) {x /= a;y /= a;return *this;} // operateur binaire + - * , ^ / R2 operator+(const R2 & P)const {return R2(x+P.x,y+P.y);} R2 operator-(const R2 & P)const {return R2(x-P.x,y-P.y);} R operator,(const R2 & P)const {return x*P.x+y*P.y;} // produit scalaire R operator^(const R2 & P)const {return x*P.y-y*P.x;} // produit mixte R2 operator*(R c)const {return R2(x*c,y*c);} R2 operator/(R c)const {return R2(x/c,y/c);} // operateur unaire R2 operator-()const {return R2(-x,-y);} R2 operator+()const {return *this;} // un methode R2 perp() const {return R2(-y,x);} // la perpendiculaire R sum() const { return x+y;} R * toBary(R * b) const { b[0]=1.-x-y;b[1]=x;b[2]=y;return b;} // les operators tableau // version qui peut modifie la class via l'adresse de x ou y R & operator[](int i){ return (&x)[i];} const R & operator[](int i) const { return (&x)[i];} R X() const {return x;} R Y() const {return y;} R Z() const {return 0.;} R norme() const { return std::sqrt(x*x+y*y);} R norme2() const { return (x*x+y*y);} R2 Bary(R2 P[d+1]) const { return (1-x-y)*P[0]+x*P[1]+y*P[2];} // add FH R2 Bary(const R2 *const *const P ) const { return (1-x-y)*(*P[0])+x*(*P[1])+y*(*P[2]);} // add FH R3 Bary(R3 P[d+1]) const ; //{ return (1-x-y)*P[0]+x*P[1]+y*P[2];} // add FH R3 Bary(const R3 *const *const P ) const; // { return (1-x-y)*(*P[0])+x*(*P[1])+y*(*P[2]);} // add FH friend R2 operator*(R c,const R2 & P) {return P*c;} friend R2 perp(const R2 & P) { return R2(-P.y,P.x) ; } //inline R2 Perp(const R2 & P) { return P.perp(); } // autre ecriture de la fonction perp friend R det(const R2 & A,const R2 & B,const R2 &C) { return R2(A,B)^R2(A,C);} friend std::ostream& operator <<(std::ostream& f, const R2 & P ) { f << P.x << ' ' << P.y ; return f; } friend std::istream& operator >>(std::istream& f, R2 & P) { f >> P.x >> P.y ; return f; } static const R2 KHat[d+1]; }; inline R2 Minc(const R2 & A,const R2 &B){ return R2(min(A.x,B.x),min(A.y,B.y));} inline R2 Maxc(const R2 & A,const R2 &B){ return R2(max(A.x,B.x),max(A.y,B.y));} inline double Norme_infty(const R2 & A){return max(std::fabs(A.x),std::fabs(A.y));} inline double Norme2_2(const R2 & A){ return (A,A);} inline double Norme2(const R2 & A){ return sqrt((A,A));} #endif freefem++-3.38-1/src/femlib/R3.hpp000644 000767 000024 00000012037 12334672122 016633 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model of $\mathbb{R}^3$ // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef R3_HPP #define R3_HPP #include "R1.hpp" #include "R2.hpp" class R3 { public: typedef double R; static const int d=3; R x,y,z; R3 () :x(0),y(0),z(0) {}; R3 (R a,R b,R c):x(a),y(b),z(c) {} R3 (const R * a):x(a[0]),y(a[1]) ,z(a[2]) {} R3 (R2 P2):x(P2.x),y(P2.y),z(0) {} R3 (R2 P2,R zz):x(P2.x),y(P2.y),z(zz) {} R3 (const R3 & A,const R3 & B) :x(B.x-A.x),y(B.y-A.y),z(B.z-A.z) {} static R3 diag(R a){ return R3(a,a,a);} R3 & operator=(const R2 &P2) {x=P2.x;y=P2.y;z=0;return *this;} R3 operator+(const R3 &P)const {return R3(x+P.x,y+P.y,z+P.z);} R3 & operator+=(const R3 &P) {x += P.x;y += P.y;z += P.z;return *this;} R3 operator-(const R3 &P)const {return R3(x-P.x,y-P.y,z-P.z);} R3 & operator-=(const R3 &P) {x -= P.x;y -= P.y;z -= P.z;return *this;} R3 & operator*=(R c) {x *= c;y *= c;z *= c;return *this;} R3 & operator/=(R c) {x /= c;y /= c;z /= c;return *this;} R3 operator-()const {return R3(-x,-y,-z);} R3 operator+()const {return *this;} R operator,(const R3 &P)const {return x*P.x+y*P.y+z*P.z;} // produit scalaire R3 operator^(const R3 &P)const {return R3(y*P.z-z*P.y ,P.x*z-x*P.z, x*P.y-y*P.x);} // produit vectoreil R3 operator*(R c)const {return R3(x*c,y*c,z*c);} R3 operator/(R c)const {return R3(x/c,y/c,z/c);} R & operator[](int i){ return (&x)[i];} const R & operator[](int i) const { return (&x)[i];} friend R3 operator*(R c,const R3 &P) {return P*c;} friend R3 operator/(R c,const R3 &P) {return P/c;} R norme() const { return std::sqrt(x*x+y*y+z*z);} R norme2() const { return (x*x+y*y+z*z);} R sum() const { return x+y+z;} R * toBary(R * b) const { b[0]=1.-x-y-z;b[1]=x;b[2]=y;b[3]=z;return b;} R X() const {return x;} R Y() const {return y;} R Z() const {return z;} R3 Bary(const R3 P[d+1]) const { return (1-x-y-z)*P[0]+x*P[1]+y*P[2]+z*P[3];} // add FH R3 Bary(const R3 **P ) const { return (1-x-y-z)*(*P[0])+x*(*P[1])+y*(*P[2])+z*(*P[3]);} // add FH friend ostream& operator <<(ostream& f, const R3 & P ) { f << P.x << ' ' << P.y << ' ' << P.z ; return f; } friend istream& operator >>(istream& f, R3 & P) { f >> P.x >> P.y >> P.z ; return f; } friend R det( R3 A, R3 B, R3 C) { R s=1.; if(abs(A.x)1e-50) { s *= A.x; A.y /= A.x; A.z /= A.x; B.y -= A.y*B.x ; B.z -= A.z*B.x ; C.y -= A.y*C.x ; C.z -= A.z*C.x ; return s* ( B.y*C.z - B.z*C.y) ; } else return 0. ; } friend R det(const R3 &A,const R3 &B, const R3 &C, const R3 &D) { return det(R3(A,B),R3(A,C),R3(A,D));} static const R3 KHat[d+1]; R2 p2() const { return R2(x,y);} }; inline R3 Minc(const R3 & A,const R3 &B){ return R3(min(A.x,B.x),min(A.y,B.y),min(A.z,B.z));} inline R3 Maxc(const R3 & A,const R3 &B){ return R3(max(A.x,B.x),max(A.y,B.y),max(A.z,B.z));} inline R Norme_infty(const R3 & A){return Max(std::fabs(A.x),std::fabs(A.y),std::fabs(A.z));} inline R Norme2_2(const R3 & A){ return (A,A);} inline R Norme2(const R3 & A){ return sqrt((A,A));} inline R3 R2::Bary(R3 P[d+1]) const { return (1-x-y)*P[0]+x*P[1]+y*P[2];} // add FH inline R3 R2::Bary(const R3 *const *const P ) const { return (1-x-y)*(*P[0])+x*(*P[1])+y*(*P[2]);} // add FH inline R3 R1::Bary(R3 P[d+1]) const { return (1-x)*P[0]+x*P[1];} // add FH inline R3 R1::Bary(const R3 *const *const P ) const { return (1-x)*(*P[0])+x*(*P[1]);} // add FH inline R2 R1::Bary(R2 P[d+1]) const { return (1-x)*P[0]+x*P[1];} // add FH inline R2 R1::Bary(const R2 *const *const P ) const { return (1-x)*(*P[0])+x*(*P[1]);} // add FH struct lessRd { bool operator()(const R1 &s1, const R1 & s2) const { return s1.x < s2.x ; } bool operator()(const R2 &s1, const R2 & s2) const { return s1.x == s2.x ? (s1.y < s2.y) :s1.x < s2.x; } bool operator()(const R3 &s1, const R3 & s2) const { return s1.x == s2.x ? (s1.y == s2.y ? (s1.z < s2.z) :s1.y < s2.y ) :s1.x < s2.x; } }; #endif freefem++-3.38-1/src/femlib/RefCounter.hpp000644 000767 000024 00000006703 12514226544 020431 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: 29 fev 2005 // -*- Mode : c++ -*- // // SUMMARY : array modelisation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef REFCOUNTER_HPP #define REFCOUNTER_HPP #include "showverb.hpp" #include "error.hpp" class RefCounter; class baseCountPointer; // ruse pour utiliser le prive c RefCounter de // pas de syntaxe pour des friends template class baseCountPointer { protected: void add(const RefCounter * c) const; void destroyPtr(const RefCounter * c) const; }; class RefCounter { static RefCounter *tnull; mutable int count; protected: virtual ~RefCounter() {} RefCounter() : count(0) {} public: int destroy() const { if(this!=tnull) {throwassert(count>=0); if ( count--==0) { SHOWVERB( cout << "True destruction of " << this << endl); delete this; return true;} else{ SHOWVERB(cout << " no destruction count=" << count+1 << " " << this << endl); return false;}} else return false;} void increment() const {count++;} void decrement() const {count--;} friend class baseCountPointer; // private: RefCounter(const RefCounter &) : count(0) {} void operator=(const RefCounter &) { count=0;} }; inline void baseCountPointer::add(const RefCounter * c) const { if (c) c->count++;} inline void baseCountPointer::destroyPtr(const RefCounter * c) const { if (c) c->destroy();} template class CountPointer: private baseCountPointer { T * c; public: CountPointer() : c(0) {} CountPointer( T * a,bool mmaster=false) :c(a) { if(!mmaster) add(c);} CountPointer( T & a) :c(&a) { add(c);} CountPointer(const CountPointer & a) :c(a.c) { add(c);} ~CountPointer() { destroyPtr(c);c=0;} //void destroy() const { destroyPtr(c);} void destroy() { destroyPtr(c);c=0;} operator T * () const { return c;} operator T & () const {return *c;} T& operator*() const {return *c;} T* operator->() const {return c;} bool operator==(const CountPointer & n) const {return n.c ==c;} bool operator!=(const CountPointer & n) const {return n.c !=c;} bool operator!() const { return !c;} void operator=(const CountPointer & n) { if(*this != n) { destroyPtr(c); c=n.c; add(c); }} void operator=( T * t) { if( c != t) { if(c) destroyPtr(c); c=t; add(c); }} // for the compile time void init() {c=0;} // void master(T *t) { destroyPtr(c); c=t;} }; #endif freefem++-3.38-1/src/femlib/RNM.hpp000644 000767 000024 00000177304 12504535127 017016 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: 29 fev 2000 // -*- Mode : c++ -*- // // SUMMARY : array modelisation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef KNM_H_ #define KNM_H_ // version sept 2008 FH. // ---------------------- // une tentative qui ne marche pas // de tableau constant #include #include #include #include #include using namespace std; #define const_R R #include inline void Check_Kn(const char * str,const char * file,int line) { cerr << "CHECK_KN: " << str << " in file: " << file << ", line " << line < // version du 21 nov 1999 correction delete // version du 13 nov 1999 // version du 18 mars 99 // F. Hecht // attention les indexations les indexations peuvent changer // puisque que l'on peut prendre la transposer d'une matrice // tableau // mais ils partent de 0 // version corrigee du 15/11/98 // version avec sous tableau --- mars 99 // ------- // remarque du 8 mars 99 FH // class pour prendre des sous-tableau // attention aux PB de continute dans les tableaux // on a supposer que les tableaux multi indices pouvait est vue comme // un tableau continue ce qui est generalement faux quand l'on en // prend un sous tableau // exemple: un tableau 3,5 est numerote comme: // 0 3 6 9 12 // 1 4 7 10 13 // 2 5 8 11 14 // step // indexi n 1 // indexj m n // est le sous tableau 3,3 n'est pas numeroter consecutivement // // Donc la fonction IsVector1() nous dit si un tableau // a un 2 ou 3 indices est ou non consecutif en memoire // // -- ajoute d'une classe VirtualMatrice // pour modeliser le produit matrice vecteur // x = A*v; via des fonctions virtuelle // ---------------------------------- // version du 6 mars 2001 FH // --- initialisation -- // -------------------------------- // version du 9 oct 2001 FH // ajoute de constructeur par defaut d'une vecteur // + set , pour definir le vecteur // ou l'affectation (bof bof) // --------------------- // version sep 2002 // ajoute operateur >> pour KN et KN_ // -------------------- // version april 2003 // ajoute un gestion auto de // la fonction InternalError pour les matriceVirtuel // -------------------- // version jan 2004 // correction pour go ++ // des operateur #= pour les matrices et tenseurs // ---------------------- // version feb 2004 // v(i(:)) = w // i(1:10) // w=u(i(:)) // // version mars 2004 make small correction // in ITAB operator problem if non type R a defi // ------------------- // Modif pour version avec les Complex mai 2004 // (u,v) donne le produit complex utiliser dans le produit matrice vecteur // (u,conj(v)) donne le produit hermitiene pour le gradient conjugue // // -- de fonction dans le cas real // modif for g++ 4.0 and xlc++ mai 2005 // adding some this-> // mars 2007 // correction in operator operation:b -1*c // aout 2007, // correct y = A*x ; when y is unset // correct y += A*x ; when y is unset // re-correct += sep 2007 // add size of the matrix in VirtualMatrix class. // mars 2010 add unset KNM case ... // sept 2014 add 1/v operator ... // ---------------- namespace RNM { inline double conj(const double & x){return x;} inline float conj(const float &x){return x;} inline long conj(const long &x){return x;} inline double real(const double &x){return x;} inline float real(const float &x){return x;} template T real(const complex& v){ return std::real(v);} inline double norm2(const double x){return x*x;} inline float norm2(const float x){return x*x;} template T norm2(const complex& v){ return std::norm(v);} template inline complex conj(const complex& v){ return std::conj(v);} template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} template inline T Abs (const T &a){return a <0 ? -a : a;} template inline void Exchange (T& a,T& b) {T c=a;a=b;b=c;} template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} // specialisation cas complex --- template inline complex Min(const complex &a,complex &b) { return complex(min(a.real(),b.real()),min(a.imag(),b.imag()));} template inline complex Max(const complex &a,const complex &b) { return complex(max(a.real(),b.real()),max(a.imag(),b.imag()));} /*inline complex Min(const complex &a,complex &b) { return complex(Min(real(a),real(b)),Min(imag(a),imag(b)));} inline complex Max(const complex &a,const complex &b) { return complex(Max(real(a),real(b)),Max(imag(a),imag(b)));} */ } // ---- template class KNMK_ ; template class KNM_ ; template class KN_ ; template class TKN_ ; // KN_ Hermitain template class ConjKNM_ ;// take the conj of the matrix. template class notKN_ ; // KN_ not template class notnotKN_ ; // KN_ not not template class KNMK ; template class KNM ; template class KN ; template class conj_KN_ ; template class Add_KN_; template class Sub_KN_; template class Mulc_KN_; // vector b*a_i template class Divc_KN_;// vector b/a_i template class Add_Mulc_KN_; template class Mul_KNM_KN_; template class DotStar_KN_; template class DotSlash_KN_; template class outProduct_KN_; template class if_KN_; template class if_arth_KN_; template class ifnot_KN_; template class KN_ITAB; template class F_KN_; #ifndef ffassert #define ffassert assert #endif // gestion des erreur interne -- #ifndef InternalError typedef void (* TypeofInternalErrorRoutine)(const char *) ; static TypeofInternalErrorRoutine &InternalErrorRoutinePtr() { static TypeofInternalErrorRoutine routine=0; return routine; } static void InternalError(const char * str) { if (InternalErrorRoutinePtr() ) (*InternalErrorRoutinePtr())(str); cerr << str; exit(1); } inline void SetInternalErrorRoutine(TypeofInternalErrorRoutine f) { InternalErrorRoutinePtr()=f; } #endif // -- template struct PplusQ { const P & p;const Q & q; PplusQ(const P & pp,const Q & qq) : p(pp),q(qq){} }; template struct VirtualMatrice { public: int N,M; VirtualMatrice(int nn,int mm): N(nn),M(mm) {} VirtualMatrice(int nn): N(nn),M(nn) {} // y += A x virtual void addMatMul(const KN_ & x, KN_ & y) const =0; virtual void addMatTransMul(const KN_ & , KN_ & ) const { InternalError("VirtualMatrice::addMatTransMul not implemented "); } virtual bool WithSolver() const {return false;} // by default no solver virtual void Solve( KN_ & ,const KN_ & ) const { InternalError("VirtualMatrice::solve not implemented "); } #ifdef VersionFreeFempp virtual bool ChecknbLine (int n) const= 0; virtual bool ChecknbColumn (int m) const =0; #else virtual bool ChecknbLine (int n) const {return true;} virtual bool ChecknbColumn (int m) const {return true;} #endif struct plusAx { const VirtualMatrice * A; const KN_ x; plusAx( const VirtualMatrice * B,const KN_ & y) :A(B),x(y) { ffassert(B->ChecknbColumn(y.N())); } }; plusAx operator*(const KN_ & x) const {return plusAx(this,x);} struct plusAtx { const VirtualMatrice * A; const KN_ x; plusAtx( const VirtualMatrice * B,const KN_ & y) :A(B),x(y) {ffassert(B->ChecknbLine(y.N()));} }; struct solveAxeqb { const VirtualMatrice * A; const KN_ b; solveAxeqb( const VirtualMatrice * B,const KN_ & y) :A(B),b(y) {ffassert(B->ChecknbColumn(y.N()));} }; virtual ~VirtualMatrice(){} }; //template class MatriceCreuseMulKN_; //template class MatriceCreuseDivKN_; class ShapeOfArray; class FromTo{ public: long from,to; FromTo(long i,long j):from(i),to(j) {K_throwassert(i=0);} long end() const { return n*step;} long last() const { return (n-1)*step;} long constant() const { return step==0;} long index(long k) const { K_throwassert( (k>=0) && ( (k =0) && ( (k ostream & operator<<(ostream & f,const KN_ & v) ; template istream & operator>>(istream & f, KN_ & v); template istream & operator>>(istream & f, KN & v); template class SetArray { public: R o,step; long n; explicit SetArray(long nn,R oo=R(),R sstep=R(1)): o(oo),n(nn),step(sstep) {} template SetArray(SetArray sa): o(sa.o),n(sa.n),step(sa.step) {} R operator[](long i) const { return i <= n ? o + R(i)*step : R();} long size() const {return n;} }; /// <> template class KN_: public ShapeOfArray { protected: R *v; public: typedef R K; // type of data long N() const {return n;} bool unset() const { return !v;} void set(R * vv,int nn,int st=1,int nx=-1) {v=vv;n=nn;step=st;next=nx;} long size() const{return step?n*step:n;} operator R *() const {return v;} KN_(const KN_ & u) :ShapeOfArray(u),v(u.v){} KN_(const KN_ & U,const SubArray & sa) : ShapeOfArray(U,sa),v(U.v + U.index(sa.start)) {} KN_ operator()(const SubArray & sa) const { return KN_(*this,sa);} // sub array R & operator[](long i) const {return v[index(i)];} R & operator()(long i) const {return v[index(i)];} R & operator[](int i) const {return v[index(i)];} R & operator()(int i) const {return v[index(i)];} R operator,(const KN_ & v) const; // dot product KN_& operator =(const SetArray & u) ; KN_& operator +=(const SetArray & u) ; KN_& operator -=(const SetArray & u) ; KN_& operator *=(const SetArray & u) ; KN_& operator /=(const SetArray & u) ; KN_& operator =(const KN_ & u) ; KN_& operator +=(const KN_ & u) ; KN_& operator -=(const KN_ & u) ; KN_& operator *=(const KN_ & u) ; KN_& operator /=(const KN_ & u) ; KN_& operator = (const_R a) ; KN_& operator +=(const_R a) ; KN_& operator -=(const_R a) ; KN_& operator /=(const_R a) ; KN_& operator *=(const_R a) ; KN_& operator = (R* a) { return operator =(KN_(a,n));} KN_& operator += (R* a) { return operator+=(KN_(a,n));} KN_& operator -= (R* a) { return operator-=(KN_(a,n));} KN_& operator *= (R* a) { return operator*=(KN_(a,n));} KN_& operator /= (R* a) { return operator/=(KN_(a,n));} R min() const ; R max() const ; R sum() const ; double norm() const ; double l2() const ; double l1() const ; double linfty() const ; double lp(double p) const ; template long last(const T &) const; template long first(const T &) const; void map(R (*f)(R )); // apply the f fonction a all element of the array void map(R (*f)(const R& )); // apply the f fonction a all element of the array template void set(R (*f)(const T& ),KN_ & u); // apply the f fonction a all element of the array u KN_& operator =(const DotStar_KN_ & u) ; KN_& operator+=(const DotStar_KN_ & u) ; KN_& operator-=(const DotStar_KN_ & u) ; KN_& operator*=(const DotStar_KN_ & u) ; KN_& operator/=(const DotStar_KN_ & u) ; KN_& operator =(const DotSlash_KN_ & u) ; KN_& operator+=(const DotSlash_KN_ & u) ; KN_& operator-=(const DotSlash_KN_ & u) ; KN_& operator*=(const DotSlash_KN_ & u) ; KN_& operator/=(const DotSlash_KN_ & u) ; KN_& operator =(const if_KN_ & u) ; KN_& operator+=(const if_KN_ & u) ; KN_& operator-=(const if_KN_ & u) ; KN_& operator*=(const if_KN_ & u) ; KN_& operator/=(const if_KN_ & u) ; KN_& operator =(const ifnot_KN_ & u) ; KN_& operator+=(const ifnot_KN_ & u) ; KN_& operator-=(const ifnot_KN_ & u) ; KN_& operator*=(const ifnot_KN_ & u) ; KN_& operator/=(const ifnot_KN_ & u) ; KN_& operator =(const Add_KN_ & u) ; KN_& operator+=(const Add_KN_ & u) ; KN_& operator-=(const Add_KN_ & u) ; KN_& operator*=(const Add_KN_ & u) ; KN_& operator/=(const Add_KN_ & u) ; template KN_& operator = (const KN_ITAB & u); template KN_& operator += (const KN_ITAB & u); template KN_& operator -= (const KN_ITAB & u); template KN_& operator *= (const KN_ITAB & u); template KN_& operator /= (const KN_ITAB & u); KN_ITAB< KN_,const KN_ > operator()(const KN_ &itab) ; KN_ITAB< KN_,const KN_ > operator()(const KN_ &itab) ; KN_ITAB,const KN_ > operator()(const KN_ &itab) const ; KN_ITAB,const KN_ > operator()(const KN_ &itab) const ; KN_& operator =(const Sub_KN_ & u) ; KN_& operator-=(const Sub_KN_ & u) ; KN_& operator+=(const Sub_KN_ & u) ; KN_& operator*=(const Sub_KN_ & u) ; KN_& operator/=(const Sub_KN_ & u) ; KN_& operator =(const Mulc_KN_ & u) ; KN_& operator+=(const Mulc_KN_ & u) ; KN_& operator-=(const Mulc_KN_ & u) ; KN_& operator*=(const Mulc_KN_ & u) ; KN_& operator/=(const Mulc_KN_ & u) ; KN_& operator =(const Divc_KN_ & u) ; KN_& operator+=(const Divc_KN_ & u) ; KN_& operator-=(const Divc_KN_ & u) ; KN_& operator*=(const Divc_KN_ & u) ; KN_& operator/=(const Divc_KN_ & u) ; KN_& operator =(const Add_Mulc_KN_ & u) ; KN_& operator+=(const Add_Mulc_KN_ & u) ; KN_& operator-=(const Add_Mulc_KN_ & u) ; KN_& operator*=(const Add_Mulc_KN_ & u) ; KN_& operator/=(const Add_Mulc_KN_ & u) ; KN_& operator =(const if_arth_KN_ & u) ; KN_& operator+=(const if_arth_KN_ & u) ; KN_& operator-=(const if_arth_KN_ & u) ; KN_& operator*=(const if_arth_KN_ & u) ; KN_& operator/=(const if_arth_KN_ & u) ; KN_& operator =(const Mul_KNM_KN_ & u) ; KN_& operator+=(const Mul_KNM_KN_ & u) ; KN_& operator-=(const Mul_KNM_KN_ & u) ; KN_& operator*=(const Mul_KNM_KN_ & u) ; KN_& operator/=(const Mul_KNM_KN_ & u) ; // KN_& operator =(const MatriceCreuseMulKN_ & ) ; // KN_& operator +=(const MatriceCreuseMulKN_ & ) ; KN_& operator =(const typename VirtualMatrice::plusAx & Ax) {*this=R(); Ax.A->addMatMul(Ax.x,*this);return *this;} KN_& operator =(const typename VirtualMatrice::plusAtx & Ax) {*this=R(); Ax.A->addMatTransMul(Ax.x,*this);return *this;} KN_& operator +=(const typename VirtualMatrice::plusAx & Ax) { Ax.A->addMatMul(Ax.x,*this);return *this;} KN_& operator +=(const typename VirtualMatrice::plusAtx & Ax) { Ax.A->addMatTransMul(Ax.x,*this);return *this;} KN_& operator =(const typename VirtualMatrice::solveAxeqb & Ab) {*this=R(); Ab.A->Solve(*this,Ab.b);return *this;} template KN_& operator = (const F_KN_ & u) ; template KN_& operator += (const F_KN_ & u) ; template KN_& operator -= (const F_KN_ & u) ; template KN_& operator /= (const F_KN_ & u) ; template KN_& operator *= (const F_KN_ & u) ; // KN_& operator =(const MatriceCreuseDivKN_ &) ; friend ostream & operator<< (ostream & f,const KN_ & v) ; KN_(R *u,const ShapeOfArray & s):ShapeOfArray(s),v(u){} KN_(R *u,long nn,long s):ShapeOfArray(nn,s),v(u){} KN_(R *u,long nn,long s,long nextt):ShapeOfArray(nn,s,nextt),v(u){} KN_(R *u,long nn):ShapeOfArray(nn),v(u){} TKN_ t() ; // transpose const TKN_ t() const ; // transpose notKN_ operator!() ; // not const notKN_ operator!() const ; // not // operator KN &(); // operator const KN &() const; private: KN_& operator++(){K_throwassert(next>=0);v += next;return *this;} // ++U KN_& operator--(){K_throwassert(next>=0);v -= next;return *this;} // --U KN_ operator++(int ){K_throwassert(next>=0); KN_ old=*this;v = v +next;return old;} // U++ KN_ operator--(int ){K_throwassert(next>=0); KN_ old=*this;v = v -next;return old;} // U++ KN_(const KN_ & u,long offset) :ShapeOfArray(u),v(&u[offset]){} KN_(const KN_ & u,const ShapeOfArray &sh,long startv=0) :ShapeOfArray(sh*u.step),v(&u[startv]){} KN_(const KN_ & u,long nnext,const ShapeOfArray &sh,long startv=0) :ShapeOfArray(sh.n,sh.step*u.step,nnext),v(&u[startv]){ } // friend class KN_; friend class KNM_; friend class KNMK_; friend class KN; friend class KNM; friend class KNMK; }; template class KNM_: public KN_ { public: ShapeOfArray shapei; ShapeOfArray shapej; public: long IsVector1() const { return (shapei.n*shapej.n) == this->n ;} long N() const {return shapei.n;} long M() const {return shapej.n;} long size() const { return shapei.n*shapej.n;} ConjKNM_ h() ; // take the conj for hermian operator const ConjKNM_ h() const ; // take the conj for hermian operator KNM_(R* u,const ShapeOfArray & s, const ShapeOfArray & si, const ShapeOfArray & sj) : KN_(u,s),shapei(si),shapej(sj){} KNM_(R* u,long nn,long mm) : KN_(u,ShapeOfArray(nn*mm)),shapei(nn,1,nn),shapej(mm,nn,1){} KNM_(R* u,long nn,long mm,long s) : KN_(u,ShapeOfArray(nn*mm,s)),shapei(nn,1,nn),shapej(mm,nn,1){} KNM_(KN_ u,long n,long m) : KN_(u,ShapeOfArray(m*n)),shapei(n,1,n),shapej(m,n,1){ } KNM_(const KN_ &u,const ShapeOfArray & si,const ShapeOfArray & sj,long offset=0) : KN_(&u[offset],si.last()+sj.last()+1,u.step),shapei(si),shapej(sj) {K_throwassert( offset>=0 && this->n+ (this->v-(R*)u) <= u.n);} KNM_(const KN_ &u,const ShapeOfArray & si,const ShapeOfArray & sj,long offset,long nnext) : KN_(&u[offset],si.last()+sj.last()+1,u.step,nnext),shapei(si),shapej(sj) {K_throwassert( offset>=0 && this->n+ (this->v-(R*)u) <= u.n);} KNM_(KNM_ U,const SubArray & si,const SubArray & sj) :KN_(U,SubArray(U.ij(si.len1(),sj.len1())+1,U.ij(si.start,sj.start))), shapei(U.shapei,si),shapej(U.shapej,sj){} KNM_(KNM_ U,const SubArray & sa,const SubArray & si,const SubArray & sj) :KN_(U,SubArray(sa)),shapei(U.shapei,si),shapej(U.shapej,sj){} KNM_(const KNM_ & u) :KN_(u),shapei(u.shapei),shapej(u.shapej) {} KNM_ operator()(const SubArray & sa,const SubArray & sb) const { return KNM_(*this,sa,sb);} // sub array long ij(long i,long j) const { return shapei.index(i)+shapej.index(j);} long indexij(long i,long j) const { return this->index(shapei.index(i)+shapej.index(j));} R & operator()(long i,long j) const { return this->v[indexij(i,j)];} R & operator()(int i,int j) const { return this->v[indexij(i,j)];} KN_ operator()(const SubArray & sa,long j) const { return this->operator()(':',j)(sa);} // sub array KN_ operator()(long i,const SubArray & sb) const { return this->operator()(i,':')(sb);} KN_ operator()(const char,long j ) const // une colonne j ('.',j) { return KN_(&this->v[this->index(shapej.index(j))],shapei*this->step);} KN_ operator()(long i ,const char) const // une ligne i (i,'.') { return KN_(&this->v[this->index(shapei.index(i))],shapej*this->step);} KN_ operator()(const char,int j ) const // une colonne j ('.',j) { return KN_(&this->v[this->index(shapej.index(j))],shapei*this->step);} KN_ operator()(int i ,const char) const // une ligne i (i,'.') { return KN_(&this->v[this->index(shapei.index(i))],shapej*this->step);} KN_ operator()(const char,const char) const // tous { return *this;} KNM_ t() const { return KNM_(this->v,*this,shapej,shapei);} // before { return KNM_(*this,shapej,shapei,v);} KNM_& operator =(const KNM_ & u) ; KNM_& operator =(const_R a) ; KNM_& operator+=(const_R a) ; KNM_& operator-=(const_R a) ; KNM_& operator/=(const_R a) ; KNM_& operator*=(const_R a) ; KNM_& operator+=(const KNM_ & u) ; KNM_& operator-=(const KNM_ & u) ; KNM_& operator*=(const KNM_ & u) ; KNM_& operator/=(const KNM_ & u) ; KNM_ &operator =(const outProduct_KN_ &); KNM_ &operator +=(const outProduct_KN_ &); KNM_ &operator -=(const outProduct_KN_ &); KNM_ &operator /=(const outProduct_KN_ &); // bofbof KNM_ &operator *=(const outProduct_KN_ &); // bofbof KNM_ &operator =(const ConjKNM_ &); KNM_ &operator +=(const ConjKNM_ &); KNM_ &operator -=(const ConjKNM_ &); KNM_ &operator /=(const ConjKNM_ &); // bofbof KNM_ &operator *=(const ConjKNM_ &); // bofbof private: KNM_& operator++() {this->v += this->next;return *this;} // ++U KNM_& operator--() {this->v -= this->next;return *this;} // ++U KNM_ operator++(int ){KNM_ old=*this;this->v = this->v +this->next;return old;} // U++ KNM_ operator--(int ){KNM_ old=*this;this->v = this->v -this->next;return old;} // U-- friend class KN_; // friend class KNM_; friend class KNMK_; friend class KN; friend class KNM; friend class KNMK; }; template struct KN_ITAB { KN_ITAB(const T &vv,const I &iindex) : v(vv),index(iindex) {} T v; I index; KN_ITAB & operator=(const T & t); KN_ITAB & operator+=(const T & t); KN_ITAB & operator-=(const T & t); KN_ITAB & operator*=(const T & t); KN_ITAB & operator/=(const T & t); typename T::R & operator[](long i){ return v[index[i]];} const typename T::R & operator[](long i) const { return v[index[i]];} long N() const { return index.N();} }; template KN_ITAB,const KN_ > KN_::operator()(const KN_ &itab) const { return KN_ITAB,const KN_ > (*this,itab);} template KN_ITAB,const KN_ > KN_::operator()(const KN_ &itab) const { return KN_ITAB,const KN_ > (*this,itab);} template KN_ITAB< KN_,const KN_ > KN_::operator()(const KN_ &itab) { return KN_ITAB,const KN_ > (*this,itab);} template KN_ITAB< KN_,const KN_ > KN_::operator()(const KN_ &itab) { return KN_ITAB,const KN_ > (*this,itab);} template struct TKN_:public KN_ { TKN_(const KN_ &x) : KN_(x) {} }; template struct ConjKNM_:public KNM_ { ConjKNM_(const KNM_ &x) : KNM_(x) {} }; template struct notKN_:public KN_ { notKN_(const KN_ &x) : KN_(x) {} notnotKN_ operator!() ; // not const notnotKN_ operator!() const ; // not }; template struct notnotKN_:public KN_ { notnotKN_(const notKN_ &x) : KN_(x) {} notKN_ operator!() ; // notnot const notKN_ operator!() const ; // notnot }; template TKN_ KN_::t() { return *this;} // transpose template ConjKNM_ KNM_::h() { return *this;} // conj of the matrix template const TKN_ KN_::t() const { return *this;} // transpose template const ConjKNM_ KNM_::h() const { return *this;} // conj of the matrix template notKN_ KN_::operator!() { return *this;} // not template const notKN_ KN_::operator!() const { return *this;} // not template notnotKN_ notKN_::operator!() { return *this;} // not template const notnotKN_ notKN_::operator!() const { return *this;} // not template struct outProduct_KN_ { const KN_ a,b; R c; long N() const {return a.N(); } long M() const {return b.N(); } outProduct_KN_(const KN_ & aa, const KN_ &bb,R cc=(R)1) : a(aa),b(bb),c(cc) {} outProduct_KN_(const KN_ * aa, const KN_ &bb,R cc=(R)1) : a(*aa),b(bb),c(cc) {} outProduct_KN_(const KN_ * aa, const KN_ *bb,R cc=(R)1) : a(*aa),b(*bb),c(cc) {} outProduct_KN_(const Mulc_KN_ & aa,const KN_ & bb) : a(aa.a),b(bb),c(aa.b) {} outProduct_KN_ operator * (R cc) { return outProduct_KN_(a,b,c*cc);} }; template struct if_KN_ { const KN_ & a,&b; R c; if_KN_(const KN_ & aa, const KN_ &bb,R cc=1.) : a(aa),b(bb),c(cc) {} if_KN_ operator * (R cc) { return if_KN_(a,b,c*cc);} }; template struct ifnot_KN_ { const KN_ & a,&b; R c; ifnot_KN_(const KN_ & aa, const KN_ &bb,R cc=1.) : a(aa),b(bb),c(cc) {} ifnot_KN_ operator * (R cc) { return ifnot_KN_(a,b,c*cc);} }; template outProduct_KN_ operator*(const KN_ &a,const TKN_ &b) { return outProduct_KN_(a,b);} template ifnot_KN_ operator*(const KN_ &a,const notKN_ &b) { return ifnot_KN_(b,a);} template ifnot_KN_ operator*(const KN_ &a,const notnotKN_ &b) { return if_KN_(b,a);} template ifnot_KN_ operator*(const notKN_ &b,const KN_ &a) { return ifnot_KN_(b,a);} template ifnot_KN_ operator*(const notnotKN_ &b,const KN_ & a) { return if_KN_(b,a);} template R operator*(const TKN_ &a,const KN_ &b) { return (a,b);} template class KNMK_: public KN_ { friend class KNMK; public: ShapeOfArray shapei; ShapeOfArray shapej; ShapeOfArray shapek; public: long IsVector1() const { return (shapei.n*shapej.n*shapek.n) == this->n ;} long N() const {return shapei.n;} long M() const {return shapej.n;} long K() const {return shapek.n;} long size() const { return shapei.n*shapej.n*shapek.n;} KNMK_(const ShapeOfArray & s, const ShapeOfArray & si, const ShapeOfArray & sj, const ShapeOfArray & sk, R * u) : KN_(u,s),shapei(si),shapej(sj),shapek(sk){} KNMK_(R* u,long n,long m,long k) : KN_(u, ShapeOfArray(n*m*k)),shapei(n,1,n),shapej(m,n,1),shapek(k,n*m,n*m){}; // KNMK_(const KN_ & u,long n,long m,long k) // : KN_(ShapeOfArray(n*m*k)),shapei(n,1,n),shapekj(m,n,1),u), // shapek(k,n*m,n*m){}; KNMK_(const KNMK_ &U,const SubArray & si,const SubArray & sj,const SubArray & sk) : KN_(U,SubArray(U.ijk(si.len1(),sj.len1(),sk.len1())+1, U.ijk(si.start,sj.start,sk.start))), shapei(U.shapei,si), shapej(U.shapej,sj), shapek(U.shapek,sk){} KNMK_(const KNMK_ & u) :KN_(u),shapei(u.shapei),shapej(u.shapej),shapek(u.shapek) {} long ijk(long i,long j,long k) const { return shapei.index(i)+shapej.index(j)+shapek.index(k);} long indexijk(long i,long j,long k) const {return this->index(shapei.index(i)+shapej.index(j)+shapek.index(k));} R & operator()(long i,long j,long k) const {return this->v[indexijk(i,j,k)];} R & operator()(int i,int j,int k) const {return this->v[indexijk(i,j,k)];} // pas de tableau suivant KN_ operator()(const char ,long j,long k) const { // le tableau (.,j,k) return KN_(*this,-1,shapei,shapej[j]+shapek[k]);} KN_ operator()(long i,const char ,long k) const { // le tableau (i,.,k) return KN_(*this,-1,shapej,shapei[i]+shapek[k]);} KN_ operator()(long i,long j,const char ) const { // le tableau (i,j,.) return KN_(*this,-1,shapek,shapei[i]+shapej[j]);} KN_ operator()(const char ,int j,int k) const { // le tableau (.,j,k) return KN_(*this,-1,shapei,shapej[j]+shapek[k]);} KN_ operator()(int i,const char ,int k) const { // le tableau (i,.,k) return KN_(*this,-1,shapej,shapei[i]+shapek[k]);} KN_ operator()(int i,int j,const char ) const { // le tableau (i,j,.) return KN_(*this,-1,shapek,shapei[i]+shapej[j]);} // KNM_ operator()(const char ,const char ,long k) const { // le tableau (.,.,k) return KNM_(*this,shapei,shapej,shapek[k],shapek.next);} // step = n*m //attention les suivants ne marche pas KNM_ operator()(const char ,long j,const char ) const { // le tableau (.,j,.) return KNM_(*this,shapei,shapek,shapej[j],-1/*shapej.next*/);} // step = n KNM_ operator()(long i,const char ,const char ) const { // le tableau (i,.,.) return KNM_(*this,shapej,shapek,shapei[i],-1/*shapei.next*/);} // step = 1 KNM_ operator()(const char ,const char ,int k) const { // le tableau (.,.,k) return KNM_(*this,shapei,shapej,shapek[k],shapek.next);} // step = n*m //attention les suivants ne marche pas KNM_ operator()(const char ,int j,const char ) const { // le tableau (.,j,.) return KNM_(*this,shapei,shapek,shapej[j],-1/*shapej.next*/);} // step = n KNM_ operator()(int i,const char ,const char ) const { // le tableau (i,.,.) return KNM_(*this,shapej,shapek,shapei[i],-1/*shapei.next*/);} // step = 1 KNMK_& operator =(const KNMK_ & u) ; KNMK_& operator+=(const KNMK_ & u) ; KNMK_& operator-=(const KNMK_ & u) ; KNMK_& operator/=(const KNMK_ & u) ; KNMK_& operator*=(const KNMK_ & u) ; KNMK_& operator =(const_R a) ; KNMK_& operator+=(const_R a) ; KNMK_& operator-=(const_R a) ; KNMK_& operator/=(const_R a) ; KNMK_& operator*=(const_R a) ; KNMK_ operator()(SubArray si,SubArray sj,SubArray sk) const {return KNMK_(*this,si,sj,sk);} private: // KNMK_& operator++(){v += next;return *this;} // ++U // KNMK_& operator--(){v -= next;return *this;} // --U // KNMK_ operator++(long ){KNMK_ old=*this;v = v +next;return old;} // U++ // KNMK_ operator--(long ){KNMK_ old=*this;v = v -next;return old;} // U-- friend class KNM_; friend class KN_; }; template class KN :public KN_ { public: typedef R K; // explicit KN(const R & u):KN_(new R(uu),1,0) {} KN() : KN_(0,0) {} KN(long nn) : KN_(new R[nn],nn) {} KN(long nn, R * p) : KN_(new R[nn],nn) { KN_::operator=(KN_(p,nn));} KN(long nn,R (*f)(long i) ) : KN_(new R[nn],nn) {for(long i=0;in;i++) this->v[i]=f(i);} KN(long nn,const R & a) : KN_(new R[nn],nn) { KN_::operator=(a);} KN(long nn,long s,const R a) : KN_(new R[nn],nn,s) { KN_::operator=(a);} template KN(const KN_ & s):KN_(new R[s.n],s.n) {for (long i=0;in;i++) this->v[i] = s[i];} template KN(const KN_ & s,R (*f)(S )):KN_(new R[s.n],s.n) {for (long i=0;in;i++) this->v[i] = f(s[i]);} KN(const KN & u):KN_(new R[u.n],u.n) { KN_::operator=(u);} KN(bool ,KN & u):KN_(u) {u.v=0;u.n=0;}// remove copy for return of local KN. // explicit KN(const KN_ & u):KN_(new R[u.n],u.n) // { KN_::operator=(u);} ~KN(){delete [] this->v;} void CheckSet() { if(!(this->n)) {cerr << "Error RNM set array\n";K_throwassert(0); exit(1);}} KN& operator = (R* a) { CheckSet(); return operator =(KN_(a,this->n));} KN& operator += (R* a) { CheckSet(); return operator+=(KN_(a,this->n));} KN& operator -= (R* a) { CheckSet(); return operator-=(KN_(a,this->n));} KN& operator *= (R* a) { CheckSet(); return operator*=(KN_(a,this->n));} KN& operator /= (R* a) { CheckSet(); return operator/=(KN_(a,this->n));} KN& operator =(const SetArray & u) { if(this->unset()) this->set(new R[u.size()],u.size(),0,0); KN_::operator= (u);return *this;} KN& operator +=(const SetArray & u) { if(this->unset()) this->set(new R[u.size()],u.size(),0,0); KN_::operator+= (u);return *this;} KN& operator -=(const SetArray & u) { if(this->unset()) this->set(new R[u.size()],u.size(),0,0); KN_::operator-= (u);return *this;} KN& operator *=(const SetArray & u) { if(this->unset()) this->set(new R[u.size()],u.size(),0,0); KN_::operator*= (u);return *this;} KN& operator /=(const SetArray & u) { if(this->unset()) this->set(new R[u.size()],u.size(),0,0); KN_::operator/= (u);return *this;} KN& operator =(const_R a) { if(this->unset()) this->set(new R[1],1,0,0); KN_::operator= (a);return *this;} KN& operator =(const KN_& a) { if(this->unset()) this->set(new R[a.N()],a.N()); KN_::operator= (a);return *this;} KN& operator =(const KN& a) { if(this->unset()) this->set(new R[a.N()],a.N()); KN_::operator= (a);return *this;} KN& operator =(const Add_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const DotStar_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const if_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const ifnot_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const DotSlash_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const Sub_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const Mulc_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const Divc_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const Add_Mulc_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const if_arth_KN_ & u) { if(this->unset()) this->set(new R[u.a.N()],u.a.N());KN_::operator=(u);return *this;} KN& operator =(const Mul_KNM_KN_ & u) { if(this->unset()) this->set(new R[u.b.N()],u.b.N());KN_::operator=(u);return *this;} // KN& operator =(const MatriceCreuseMulKN_ & Ax) // {if(this->unset()) set(new R[Ax.v.N()],Ax.v.N()); KN_::operator=(Ax);return *this;} // KN& operator +=(const MatriceCreuseMulKN_ & Ax) // {if(this->unset()) set(new R[Ax.v.N()],Ax.v.N()); KN_::operator+=(Ax);return *this;} // KN& operator =(const MatriceCreuseDivKN_ & A1x) // { if(this->unset()) set(new R[A1x.v.N()],A1x.v.N());KN_::operator=(A1x);return *this;} // correcton aout 2007 FH add N,M flied in VirtualMatrice KN& operator =(const typename VirtualMatrice::plusAx & Ax) { if(this->unset() && Ax.A->N ) this->set(new R[Ax.A->N],Ax.A->N);KN_::operator=(Ax);return *this;} KN& operator =(const typename VirtualMatrice::solveAxeqb & Ab) { if(this->unset()) this->set(new R[Ab.b.N()],Ab.b.N());KN_::operator=(Ab);return *this;} KN& operator +=(const typename VirtualMatrice::plusAx & Ax) { if(this->unset() && Ax.A->N) { this->set(new R[Ax.A->N],Ax.A->N); KN_::operator=(R());} KN_::operator+=(Ax); return *this;} KN& operator =(const typename VirtualMatrice::plusAtx & Ax) { if(this->unset()&&Ax.A->M) this->set(new R[Ax.A->M],Ax.A->M);KN_::operator=(Ax);return *this;} KN& operator +=(const typename VirtualMatrice::plusAtx & Ax) { if(this->unset()&&Ax.A->M) { this->set(new R[Ax.A->M],Ax.A->M); KN_::operator=(R());} KN_::operator+=(Ax); return *this;} // end correcton FH template KN& operator =(const PplusQ & PQ) { *this=PQ.p; *this+=PQ.q;return *this; } template KN& operator +=(const PplusQ & PQ) { *this+=PQ.p; *this+=PQ.q;return *this; } KN& operator -=(const_R a) { KN_::operator-=(a);return *this;} KN& operator -=(const KN_& a) { KN_::operator-= (a);return *this;} KN& operator -=(const Add_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const DotStar_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const DotSlash_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const Sub_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const Mulc_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const Divc_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const Add_Mulc_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const if_arth_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator -=(const Mul_KNM_KN_ & u) { KN_::operator-=(u);return *this;} KN& operator +=(const_R a) { KN_::operator += (a);return *this;} KN& operator += (const KN_& a) { KN_::operator+= (a);return *this;} KN& operator +=(const Add_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const DotStar_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const DotSlash_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const Sub_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const Mulc_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const Divc_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const Add_Mulc_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const if_arth_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator +=(const Mul_KNM_KN_ & u) { KN_::operator+=(u);return *this;} KN& operator/=(const_R a) { KN_::operator/=(a);return *this;} KN& operator /= (const KN_& a) { KN_::operator/= (a);return *this;} KN& operator /=(const Add_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator /=(const Sub_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator /=(const Mulc_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator /=(const Divc_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator /=(const Add_Mulc_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator /=(const if_arth_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator /=(const Mul_KNM_KN_ & u) { KN_::operator/=(u);return *this;} KN& operator*=(const_R a) { KN_::operator*=(a);return *this;} KN& operator*=(const KN_& a) { KN_::operator*= (a);return *this;} KN& operator *=(const Add_KN_ & u) { KN_::operator*=(u);return *this;} KN& operator *=(const Sub_KN_ & u) { KN_::operator*=(u);return *this;} KN& operator *=(const Mulc_KN_ & u) { KN_::operator*=(u);return *this;} KN& operator *=(const Divc_KN_ & u) { KN_::operator*=(u);return *this;} KN& operator *=(const Add_Mulc_KN_ & u) { KN_::operator*=(u);return *this;} KN& operator *=(const if_arth_KN_ & u) { KN_::operator*=(u);return *this;} KN& operator *=(const Mul_KNM_KN_ & u) { KN_::operator*=(u);return *this;} template KN& operator = (const KN_ITAB & ui) { KN_::operator =(ui); return *this;} template KN& operator += (const KN_ITAB & ui) { KN_::operator +=(ui); return *this;} template KN& operator -= (const KN_ITAB & ui) { KN_::operator -=(ui); return *this;} template KN& operator *= (const KN_ITAB & ui) { KN_::operator *=(ui); return *this;} template KN& operator /= (const KN_ITAB & ui) { KN_::operator /=(ui); return *this;} // two opertor to cast to an array of constant // operator KN_ & () // { return * (KN_*) this;} // operator KN_ const & () const // { return *(const KN_*) this;} // operator KN & () // { return (KN &) *this;} // operator KN const & () const // { return (const KN& ) *this;} static void fill0(R *v,int n) { if(n && v) for(int i=0;in=nn;this->step=1;this->next=-1;this->v=new R[nn];fill0(this->v,this->n) ;} void init() {this->n=0;this->step=1;this->next=-1;this->v=0;} void init(const KN_ & a){init(a.N()); operator=(a);} void resize(long nn) { if ( nn != this->n) { R *vo=this->v; long no=std::min(this->n,nn), so=this->step; ShapeOfArray::init(nn); this->v=new R[this->n]; // copy if(this->v && vo) for(long i=0,j=0;jv[i]=vo[j]; delete [] vo;} }// mars 2010 void destroy(){/*assert(this->next<0);*/ if(this->next++ ==-1) {delete [] this->v; this->v=0;this->n=0;}}// mars 2010 void increment() {/*assert(this->next<0);*/ this->next--;} }; // Array with 2 indices // --------------------- template class KNM: public KNM_{ public: KNM() :KNM_(0,0,0){} KNM(long nn,long mm) :KNM_(new R[nn*mm],nn,mm){} KNM(const KNM & u) // PB si stepi ou stepj nulle :KNM_(new R[u.size()],u.N(),u.M()) { KN_::operator=(u);} explicit KNM(const KNM_ & u) :KNM_(new R[u.size()],u.N(),u.M()) { KNM_::operator=(u);} ~KNM(){delete [] this->v;} KNM& operator=(const KNM_ & u) { if(this->unset()) this->init(u.N(),u.M()) ; KNM_::operator=(u);return *this;} KNM& operator=(const_R a) { if(this->unset()) RNM_FATAL_ERROR(" KNM operator=(double)"); KNM_::operator=(a);return *this;} KNM& operator+=(const_R a) { if(this->unset()) RNM_FATAL_ERROR(" KNM operator+=(double)"); KNM_::operator+=(a);return *this;} KNM& operator-=(const_R a) {if(this->unset()) RNM_FATAL_ERROR(" KNM operator-=(double)"); KNM_::operator-=(a);return *this;} KNM& operator/=(const_R a) {if(this->unset()) RNM_FATAL_ERROR(" KNM operator/=(double)"); KNM_::operator/=(a);return *this;} KNM& operator*=(const_R a) {if(this->unset()) RNM_FATAL_ERROR(" KNM operator*=(double)"); KNM_::operator*=(a);return *this;} KNM& operator+=(const KNM_ & u) { if(this->unset()) this->init(u.N(),u.M()) ; KNM_::operator+=(u);return *this;} KNM& operator-=(const KNM_ & u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator-=(u);return *this;} KNM& operator/=(const KNM_ & u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator/=(u);return *this;} KNM& operator*=(const KNM_ & u) { if(this->unset()) this->init(u.N(),u.M()) ; KNM_::operator*=(u);return *this;} KNM &operator =(const outProduct_KN_ & u) { if(this->unset()) this->init(u.N(),u.M()) ; KNM_::operator =(u);return *this;} KNM &operator +=(const outProduct_KN_ & u) { if(this->unset()) this->init(u.N(),u.M()) ; KNM_::operator+=(u);return *this;} KNM &operator -=(const outProduct_KN_ & u) { if(this->unset()) this->init(u.N(),u.M()) ; KNM_::operator-=(u);return *this;} KNM &operator /=(const outProduct_KN_ & u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator/=(u);return *this;} KNM &operator *=(const outProduct_KN_ & u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator*=(u);return *this;} KNM &operator =(const ConjKNM_ &u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator=(u);return *this;} KNM &operator +=(const ConjKNM_ &u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator+=(u);return *this;} KNM &operator -=(const ConjKNM_ &u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator-=(u);return *this;} KNM &operator /=(const ConjKNM_ &u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator/=(u);return *this;} KNM &operator *=(const ConjKNM_ &u) { if(this->unset()) this->init(u.N(),u.M()) ;KNM_::operator*=(u);return *this;} // bofbof // two opertors to cast to un array of constant // operator KNM_ & () // { return * (KNM_*) this;} // operator KNM_ const & () const // { return *(const KNM_*) this;} // operator KNM & () // { return * (KNM*) this;} // operator KNM const & () const // { return *(const KNM*) this;} void init() { // add mars 2010 ... this->n=0;this->step=1;this->next=-1;this->v=0; this->shapei.init(0); this->shapej.init(0);} void init(long nn,long mm) { ShapeOfArray::init(nn*mm); this->shapei.init(nn,1,nn); this->shapej.init(mm,nn,1), this->v=new R[nn*mm];} void resize(long nn,long mm) { long kk=nn*mm; long lso = this->size(); long n = this->shapei.n; long m = this->shapej.n; if( (n !=nn) || ( m != mm)) // correct FH Jav 2012 .. { KNM_ old(*this); long no=std::min(n,nn); long mo=std::min(m,mm); R *vo=this->v; // new mat ShapeOfArray::init(kk); this->v=new R[this->n]; this->shapei.init(nn,1,nn); this->shapej.init(mm,nn,1); if(this->v && vo) // copy (*this)(SubArray(no),SubArray(mo)) = old(SubArray(no),SubArray(mo)); delete []vo; } } void destroy(){/*assert((bool)(this->next<0)); */ if(this->next++ ==-1) {delete [] this->v; this->v=0;this->n=0;}} void increment() {/*assert((bool)(this->next<0)); */ this->next--;} // void destroy(){delete [] this->v;this->n=0 ;} }; // Array with 3 indices // --------------------- template class KNMK: public KNMK_{ public: KNMK(long n,long m,long k) :KNMK_(new R[n*m*k],n,m,k){} explicit KNMK(const KNMK_ & u) :KNMK_(new R[u.size()],u.N(),u.M(),u.K()) { KNMK_::operator=(u);} KNMK(const KNMK & u) :KNMK_(new R[u.size()],u.N(),u.M(),u.K()) { KNMK_::operator=(u);} ~KNMK(){delete [] this->v;} KNMK& operator=(const KNMK_ & u) { KNMK_::operator=(u);return *this;} KNMK& operator=(const_R a) { KNMK_::operator=(a);return *this;} KNMK& operator+=(const_R a) { KNMK_::operator+=(a);return *this;} KNMK& operator-=(const_R a) { KNMK_::operator-=(a);return *this;} KNMK& operator/=(const_R a) { KNMK_::operator/=(a);return *this;} KNMK& operator*=(const_R a) { KNMK_::operator*=(a);return *this;} KNMK& operator+=(const KNMK_ & u) { KNMK_::operator+=(u);return *this;} // ici jd KNMK& operator-=(const KNMK_ & u) { KNMK_::operator-=(u);return *this;} KNMK& operator*=(const KNMK_ & u) { KNMK_::operator*=(u);return *this;} KNMK& operator/=(const KNMK_ & u) { KNMK_::operator/=(u);return *this;} // two opertor to cast to un array of constant // operator KNMK_ & () // { return * (KNMK_*) this;} // operator KNMK_ const & () const // { return *(const KNMK_*) this;} // operator KNMK & () // { return * (KNMK*) this;} // operator KNMK const & () const // { return *(const KNMK*) this;} }; // ------------- optimization --------------------- template class conj_KN_{public: const KN_ & a; conj_KN_(const KN_ & aa) : a(aa){} }; inline const KN_ conj(const KN_ &a){ return a;} inline const KN_ conj(const KN_ &a){ return a;} inline const KN_ conj(const KN_ &a){ return a;} //template conj_KN_ conj(const KN &a){ return a;} template conj_KN_ conj(const KN_ &a){ return a;} template class DotStar_KN_{public: const KN_ a; const KN_ b; DotStar_KN_(const KN_ & aa,const KN_ & bb) : a(aa),b(bb) {} }; template class DotSlash_KN_{public: const KN_ a; const KN_ b; DotSlash_KN_(const KN_ & aa,const KN_ & bb) : a(aa),b(bb) {} }; template class Add_KN_{public: const KN_ a; const KN_ b; Add_KN_(const KN_ & aa,const KN_ & bb) : a(aa),b(bb) { K_throwassert(SameShape(a,b));} }; template class Sub_KN_{public: const KN_ a; const KN_ b; Sub_KN_(const KN_ & aa,const KN_ & bb) : a(aa),b(bb) { K_throwassert(SameShape(a,b));} }; template class Mulc_KN_ { public: const KN_ a; const_R b; Mulc_KN_(const KN_ & aa,const_R bb) : a(aa),b(bb) {} Mulc_KN_(const Mulc_KN_ & aa,const_R bb) : a(aa.a),b(aa.b*bb) {} Mulc_KN_ operator-() const {return Mulc_KN_(a,-b);} outProduct_KN_ operator*(const TKN_ & bb) { return outProduct_KN_(a,bb,b);} }; template class Divc_KN_ { // // vector b/a_i .. public: const KN_ a; const_R b; Divc_KN_(const_R bb,const KN_ & aa) : a(aa),b(bb) {} // Divc_KN_(const Divc_KN_ & aa,const_R bb) : a(aa.a),b(aa.b*bb) {} Divc_KN_ operator-() const {return Divc_KN_(a,-b);} }; template class Add_Mulc_KN_ { public: const KN_ a,b; const R ca,cb; Add_Mulc_KN_(const Mulc_KN_ & aa,const Mulc_KN_ & bb) : a(aa.a),b(bb.a),ca(aa.b),cb(bb.b) { K_throwassert(SameShape(a,b));} Add_Mulc_KN_(const Mulc_KN_ & aa,const KN_ & bb,const R cbb) : a(aa.a),b(bb),ca(aa.b),cb(cbb) { K_throwassert(SameShape(a,b));} Add_Mulc_KN_(const KN_ & aa,const R caa,const KN_ & bb,const R cbb) : a(aa),b(bb),ca(caa),cb(cbb) { K_throwassert(SameShape(a,b));} }; template class if_arth_KN_ { public: const KN_ a,b,c; if_arth_KN_(const KN_ & aa,const KN_ & bb,const KN_ & cc) : a(aa),b(bb),c(cc){ K_throwassert(SameShape(a,b)&&SameShape(a,c));} }; template class Mul_KNM_KN_ { public: const KNM_ &A; const KN_ &b; Mul_KNM_KN_(const KNM_ &aa,const KN_ &bb) : A(aa),b(bb) {K_throwassert(SameShape(A.shapej,b));} }; ostream & operator<<(ostream & f,const ShapeOfArray & s); template ostream & operator<<(ostream & f,const KN_ & v); template ostream & operator<<(ostream & f,const KNM_ & v); template ostream & operator<<(ostream & f,const KNMK_ & v); template inline ostream & operator<<(ostream & f,const KN & v) { return f << (const KN_ &) v;} template inline ostream & operator<<(ostream & f,const KNM & v) { return f << (const KNM_ &) v;} template inline ostream & operator<<(ostream & f,const KNMK & v) { return f << (const KNMK_ &) v;} template inline Add_KN_ operator+(const KN_ &a,const KN_ &b) { return Add_KN_(a,b);} template inline Sub_KN_ operator-(const KN_ &a,const KN_ &b) { return Sub_KN_(a,b);} template inline Mulc_KN_ operator*(const KN_ &a,const R &b) { return Mulc_KN_(a,b);} template inline Mulc_KN_ operator/(const KN_ &a,const R &b) { return Mulc_KN_(a,R(1)/b);} template inline Mulc_KN_ operator*(const R &b,const KN_ &a) { return Mulc_KN_(a,b);} template inline Divc_KN_ operator/(const R &b,const KN_ &a) { return Divc_KN_(b,a);} template inline Mulc_KN_ operator-(const KN_ &a) { return Mulc_KN_(a,R(-1));} template inline Add_Mulc_KN_ operator+(const Mulc_KN_& a,const Mulc_KN_ &b) { return Add_Mulc_KN_(a,b);} template inline Add_Mulc_KN_ operator-(const Mulc_KN_& a,const Mulc_KN_ &b) { return Add_Mulc_KN_(a,b.a,-b.b);} template inline Add_Mulc_KN_ operator+(const Mulc_KN_& a,const KN_ &b) { return Add_Mulc_KN_(a,b,R(1));} template inline Add_Mulc_KN_ operator-(const Mulc_KN_& a,const KN_ &b) { return Add_Mulc_KN_(a,b,R(-1));} template inline Add_Mulc_KN_ operator+(const KN_ & b,const Mulc_KN_& a) { return Add_Mulc_KN_(a,b,R(1));} // modif FH mars 2007 template inline Add_Mulc_KN_ operator-(const KN_ & a,const Mulc_KN_& b) { return Add_Mulc_KN_(a,R(1),b.a,-b.b);}// modif FH mars 2007 template inline Mul_KNM_KN_ operator*(const KNM_ & A,const KN_ & b) { return Mul_KNM_KN_(A,b);} template inline bool SameShape(const ShapeOfArray & a,const Add_Mulc_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const if_arth_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const Add_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const Sub_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const Mulc_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const Divc_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const DotStar_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const DotSlash_KN_ & b) { return SameShape(a,b.a) ;} template inline bool SameShape(const ShapeOfArray & a,const Mul_KNM_KN_ & b) { return a.n==b.A.N() ;} inline bool SameShape(const ShapeOfArray & ,const VirtualMatrice::plusAx & ) { return true ;} // pas de test car la matrice peut etre rectangulaire inline bool SameShape(const ShapeOfArray & ,const VirtualMatrice::plusAtx & ) { return true ;} // pas de test car la matrice peut etre rectangulaire inline bool SameShape(const ShapeOfArray & ,const VirtualMatrice >::plusAx & ) { return true ;} // pas de test car la matrice peut etre rectangulaire inline bool SameShape(const ShapeOfArray & ,const VirtualMatrice >::plusAtx & ) { return true ;} // pas de test car la matrice peut etre rectangulaire inline bool SameShape(const ShapeOfArray & ,const double) { return true;} inline bool SameShape(const ShapeOfArray & ,const complex) { return true;} inline bool SameShape(const ShapeOfArray & ,const complex) { return true;} template inline bool SameShape(KNM& m, const outProduct_KN_& p) { return p.a.N()>=m.N() && m.M()>=p.b.N(); } template inline long SameAdress(const KN_ &a, const KN_ &b) { return &a[0]==&b[0];} // bof -bof //template inline // KN_::operator KN &() { return *(KN *) (void *) this;} //template inline // KN_::operator const KN &() const { return *(const KN *) ( const void *) this;} // operateur y=Ax-b ou y=Ax + b pour le GC template PplusQ< typename VirtualMatrice::plusAx, Mulc_KN_ > operator-(const typename VirtualMatrice::plusAx & A,const KN_ & B) { return PplusQ< typename VirtualMatrice::plusAx, Mulc_KN_ >(A,Mulc_KN_(B,R(-1.)));} template PplusQ< typename VirtualMatrice::plusAx, KN_ > operator+(const typename VirtualMatrice::plusAx & A,const KN_ & B) { return PplusQ< typename VirtualMatrice::plusAx, KN_ >(A,B);} template PplusQ< typename VirtualMatrice::plusAx, Mulc_KN_ > operator-(const typename VirtualMatrice::plusAx & A,const KN & B) { return PplusQ< typename VirtualMatrice::plusAx, Mulc_KN_ >(A,Mulc_KN_(B,R(-1.)));} template PplusQ< typename VirtualMatrice::plusAx, KN_ > operator+(const typename VirtualMatrice::plusAx & A,const KN & B) { return PplusQ< typename VirtualMatrice::plusAx, KN_ >(A,B);} template KN_ diagonal(const KNM & A) { K_throwassert(A.N() == A.M()); return KN_(A,SubArray(A.N(),0,A.N()+1));} // to def inv permutation FH mars 2006 class Inv_KN_long{ public: KN_ t; Inv_KN_long(const KN_ & v) : t(v) {} Inv_KN_long( KN_ const * & v) : t(*v) {} operator const KN_ & () const {return t;} }; // For sparce solve to set array to be consecutif (step==1) if neccessarly template class KN_2Ptr { public: // transfo de KN_ peut etre non concecutif (a.step != 1) en // un tableau concecutif en memoire si necessaire // avec recopie du tableau dans le tableau d'origne a la destruction. KN_ a; const KN_ ca; KN c; // tableau copie si non vide KN_2Ptr(KN_ & vv) : a(vv),ca(vv),c() { assert(a.N()); if (ca.step !=1 ) c=ca;} // copy if non consecutif KN_2Ptr(const KN_ & vv) : a(0,0),ca(vv),c() { assert(ca.N()); if (ca.step !=1 ) c=ca; }// copy if non consecutif operator R *() { return c.unset() ? (R *) ca:(R *) c ;} operator const R *() const { return c.unset() ? (R *) ca:(R *) c ;} ~KN_2Ptr() { if(!a.unset() && !c.unset() ) {a=c; } } // recopy }; // correct march 2015 FH ... // add BB type ... template class F_KN_ { public: A (*f)(BB); KN_ b; long N() const {return b.N();} F_KN_( A (*ff)(BB),const KN_ & aa): f(ff),b(aa) {} A operator[](long i) const { return f(b[i]);} bool check(long n) const { return n <= b.N() || b.constant(); } bool constant() const {return b.constant();} }; template inline bool SameShape(const ShapeOfArray & a,const F_KN_ & b) { return !a.step || b.constant() || a.n == b.N() ;} #include "RNM_tpl.hpp" #ifdef K_throwassert #undef K_throwassert #endif #endif freefem++-3.38-1/src/femlib/RNM_op.hpp000644 000767 000024 00000012231 12504534447 017503 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: 29 fev 2000 // -*- Mode : c++ -*- // // SUMMARY : array modelisation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ template KNM_ & KNM_::operator oper (const outProduct_KN_ & u) { // *this oper A* t B K_throwassert (shapei.SameShape(u.a) && shapej.SameShape(u.b) ); long n= N(), m= M(); R * ai(u.a),cc, c= u.c; long stepi=u.a.step; R * bj, *bb(u.b); long stepj=u.b.step; KN_ li((*this)(0,'.')); // first line int stepij= li.step; for (long i=0;i KNM_ & KNM_::operator oper (const ConjKNM_ & u) { K_throwassert( N() == u.N() && M() == u.M() ); for(int i=0;i::operator () (i,j) oper RNM::conj( u(i,j)); return *this; } template template KN_& KN_::operator oper (const F_KN_ & u) { K_throwassert ( u.check(this->N()) ); R * l(v); // first line for (long i=0;i KN_& KN_::operator oper (const SetArray & u) { R * l(v); // first line for (long i=0;i KN_& KN_::operator oper (const Mul_KNM_KN_ & u) { K_throwassert (SameShape(u.A.shapei) && !constant()); R * l(v); KN_ li(u.A(0,'.')); // first line for (long i=0;i KN_& KN_::operator oper (const DotStar_KN_ & u) { K_throwassert(u.a.N() == N() ); long stepa(u.a.step),stepb(u.b.step); R * l(v); const_R *aa(u.a), *bb(u.b); for (long i=0;i KN_& KN_::operator oper (const DotSlash_KN_ & u) { K_throwassert(u.a.N() == N() ); long stepa(u.a.step),stepb(u.b.step); R * l(v); const_R *aa(u.a), *bb(u.b); for (long i=0;i KN_& KN_::operator oper (const Add_KN_ & u) { K_throwassert(u.a.N() == N() ); long stepa(u.a.step),stepb(u.b.step); R * l(v); const_R *aa(u.a), *bb(u.b); for (long i=0;i KN_& KN_::operator oper (const Sub_KN_ & u) { K_throwassert(u.a.N() == N() ); long stepa(u.a.step),stepb(u.b.step); R * l(v); const_R *aa(u.a), *bb(u.b); for (long i=0;i KN_& KN_::operator oper (const Mulc_KN_ & u) { K_throwassert(u.a.N() == N() ); long stepa(u.a.step); R * l(v); const_R *aa(u.a),bb(u.b) ; for (long i=0;i KN_& KN_::operator oper (const Divc_KN_ & u) { K_throwassert(u.a.N() == N() ); long stepa(u.a.step); R * l(v); const_R *aa(u.a),bb(u.b) ; for (long i=0;i KN_& KN_::operator oper (const Add_Mulc_KN_ & u) { K_throwassert(u.a.N() == N() ); const long stepa(u.a.step),stepb(u.b.step); const R ca(u.ca),cb(u.cb); R * l(v); const R *aa(u.a),*bb(u.b); for (long i=0;i KN_& KN_::operator oper (const if_arth_KN_ & u) { K_throwassert(u.a.N() == N() ); R zero=R(); const long stepa(u.a.step),stepb(u.b.step),stepc(u.c.step); R * l(v); const R *aa(u.a),*bb(u.b),*cc(u.c); for (long i=0;i inline KN_& KN_::operator oper (const_R a) { R * l(v); for (long i=0;i inline KNM_ & KNM_::operator oper (const_R a) { if(IsVector1() ) KN_::operator oper (a); else { KN_ lj(operator()('.',0)); // (.,.,O) for (long j=0;j inline KNMK_ & KNMK_::operator oper (const_R a) { if(IsVector1() ) KN_::operator oper (a); else { KNM_ lj(operator()('.','.',0)); // (.,.,O) long j=K(); while(j--) {lj oper a;++lj;} } return *this; } template inline KN_& KN_::operator oper (const KN_ & u) { K_throwassert(u.n == n); R * l(v); const R *r(u); for (long i=0;i inline KNM_ & KNM_::operator oper (const KNM_ & u) { K_throwassert( N() == u.N() && M() == u.M() ); if(IsVector1() && u.IsVector1() && shapei.step == u.shapei.step ) // modif 2011 (thank to Oka) KN_::operator oper(u); // modif FH jan 2004 else { KN_ lj(operator()('.',0)); // (.,O) KN_ uj(u('.',0)); long j=M(); while ( j--) { lj oper uj;++lj;++uj;} } return *this; } template inline KNMK_ & KNMK_::operator oper (const KNMK_ & u) { K_throwassert( N() == u.N() && M() == u.M() && K() == u.K() ); if(IsVector1() && u.IsVector1() && u.N() == N() && shapei.step == u.shapei.step) // modif 2011 (thank to Oka) KN_::operator oper(u); // modif FH 2004 else { K_throwassert( K() == u.K()); KNM_ lj(operator()('.','.',0)); // (.,O) KNM_ uj(u('.','.',0)); long j=K(); while (j--) { lj oper uj;++lj;++uj;} } return *this; } #undef oper freefem++-3.38-1/src/femlib/RNM_tpl.hpp000644 000767 000024 00000021213 12232503375 017656 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // ORIG-DATE: 29 fev 2000 // -*- Mode : c++ -*- // // SUMMARY : array modelisation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef RNM_tpl_ #define RNM_tpl_ #include "RNM.hpp" // version du 22 nov 1999 // Voila une debut de class vecteur + matrice // les class avec termine avec un _ ne travail que sur // un pointeur existant => pas de new et delete de pointeur // la class correspondant sans de _ genere les pointeurs // // avec ses classes on peut prendre une ligne // ou une colonne d'une matrice // ----------------------- namespace RNM { template inline double norm(const T & x){return std::norm(x);} inline double norm(double x){return x*x;} inline double norm(float x){return x*x;} inline long norm(long x){return x*x;} inline int norm(int x){return x*x;} } template void MatMul(KNM_ & ab, KNM_ & a, KNM_ & b){ // attention ne marche que si les adresses ne sont pas les memes long N= a.shapei.n; long M= a.shapej.n; K_throwassert(a.shapej.n == a.shapei.n); K_throwassert(a.shapei.n == ab.shapei.n); K_throwassert(b.shapej.n == ab.shapej.n); K_throwassert(b.v != ab.v); K_throwassert(a.v != ab.v); KN_ ai =a(0); for(long i=0;i bj=b[0]; for(long j=0;j ostream & operator<<(ostream & f,const KN_ & v) { //f << " KN_ : " << (ShapeOfArray) v << " " << (const_R *) v << " :\n\t" ; f << v.N() << "\t\n\t" ; const int i10=10; int prec=f.precision(); if(prec istream & operator>>(istream & f, KN_ & v) { int n;char c; f >> n; ffassert(f.good()); ffassert(n==v.N()); while (f.get(c) && (c!='\n' && c!='\r' ) ) ; // eat until control (new line for (int i=0;i> v[i] ; ffassert(f.good());} // modif FH main 2006 return f; } template istream & operator>>(istream & f, KN & v) { int n;char c; f >> n; if (v.unset()) v.init(n); cout << n << " == " << v.N() << endl; ffassert(n==v.N()); while (f.get(c) && (c!='\n' && c!='\r' ) ) ; // eat until control (new line for (int i=0;i> v[i] ; ffassert(f.good());}// modif FH main 2006 return f; } template ostream & operator<<(ostream & f,const KNM_ & v) { //f << " KNM_ "< ostream & operator<<(ostream & f,const KNMK_ & v) { //f << " KNM_" < R KN_::operator,(const KN_ & u) const { K_throwassert(u.n == n); R s=0; R * l(v); R *r(u.v); for (long i=0;i R operator,(const KN_ & u,const conj_KN_ & vc) { int n=u.n; K_throwassert(n == vc.a.n); R s=0; R * l(u); R *r(vc.a); int stepl= u.step, stepr=vc.a.step; for (long i=0;i R operator,(const conj_KN_ & u,const KN_ & vc) { int n=u.a.n; K_throwassert(n == vc.n); R s=0; R * l(u.a); R *r(vc); int stepl= u.a.step, stepr=vc.step; for (long i=0;i R operator,(const KN & u,const conj_KN_ & vc) { return ( (KN_) u,vc);} template R operator,(const conj_KN_ & u,const KN & vc) { return ( u, (KN_) vc);} template R KN_::min() const { R minv = v[index(0)]; for (long i=1;i R KN_::max() const { R maxv = v[index(0)]; for (long i=1;i R KN_::sum() const { R s = v[index(0)]; for (long i=1;i(int N,int & nv, R1 *& P, int & nk , int *& K); template void SplitSimplex(int N,int & nv, R2 *& P, int & nk , int *& K); template void SplitSimplex(int N,int & nv, R3 *& P, int & nk , int *& K); $: */ // // // ORIG-DATE: fev 2009 // -*- Mode : c++ -*- // // SUMMARY : Model mesh 2d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include #include #include #include #include "ufunction.hpp" using namespace std; namespace Fem2D { #include "R3.hpp" }; using Fem2D::R1; using Fem2D::R2; using Fem2D::R3; extern long verbosity ; #include "splitsimplex.hpp" /* construction an array of sub simplex for plot ... see last template function SplitSimplex(N,nv,P,nk,K); N > 1 -> classical split un N^d sub simplex nv : number of point on */ // d = 1 trivial void SplitSimplex(int N,R1 *P,int *K,int op=0,R1 *AB=0) { assert(N>0); double h = 1./ N; for(int i=0;i<=N;++i) if(AB) P[i+op] = R1(i*h).Bary(AB); else P[i+op] = R1(i*h); for(int i=0;i " << i << " " << j << endl; assert( n == NumSimplex2(i,j)); } inline void invNumSimplex3(int n,int &i,int &j,int &k) { int l= invNumSimplex3(n); //=( i+j+k) invNumSimplex2(n-NumSimplex3(l),j,k); i=l-k-j; // cout << n << " " << l << "-> " << i << " " << j << " " << k <0); int nv = (N+1)*(N+2)/2; double h=1./N; // loop sur les diag i+j = k // num ( i+j,j) lexico croissant for(int l=0;ln) n8[l]=-1; } for (int l=0;l199) { cout << " SplitSimplex " << endl; for (int i=0,l=0;i200) cout << "face i=0" << endl; for (int i=0;i200) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } // face j=0 if(verbosity>200) cout << "face j=0" << endl; for (int i=0;i200) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } // face k=0 if(verbosity>200) cout << "face k=0" << endl; for (int i=0;i200) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } // face i+j+k=1 if(verbosity>200) cout << "dernier face " << endl; for (int k=0;k200) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } if(verbosity>200) cout << "l= " << l << " ntri=" << ntri << endl; assert( l == ntri); } /* void SplitSimplex(int N,int & nv, R1 *& P, int & nk , int *& K) { typedef R1 Rd; const int d = Rd::d; int cas = (N>0) ? 1 : d+1; N=abs(N); assert(N); int nv1=(N+1); int nk1= N; nv = cas*nv1; nk = cas*nk1; P = new Rd[nv]; K = new int [nk*(d+1)]; if( cas ==1) SplitSimplex( N, P,K) ; else { Rd AB1[2]= { Rd(0),Rd(0.5)}; SplitSimplex( N, P,K,0,AB1) ; Rd AB2[2]= { Rd(0.5),Rd(1)}; SplitSimplex( N, P,K+nk1,nv1,AB2); } } void SplitSimplex(int N,int & nv, R2 *& P, int & nk , int *& K) { typedef R2 Rd; const int d = Rd::d; int cas = (N>0) ? 1 : d+1; assert(N); N=abs(N); int nv1=N*(N+1)/2; int nk1= N*N; nv = cas*nv1; nk = cas*nk1; P = new Rd[nv]; K = new int [nk*(d+1)]; if( cas ==1) SplitSimplex( N, P,K); else { Rd G=Rd::diag(1./(d+1)); R2 Khat[d+1]; for (int i=0;i void SplitSimplex(int N,int & nv, Rd *& P, int & nk , int *& K) { const int d = Rd::d,d1 =d+1; int cas = (N>0) ? 1 : d+1; assert(N); N=abs(N); int nv1=N+1; // nb simplexe int nk1=N; // nb vertices for(int i=2;i<=d;++i) { nk1 *=N; nv1 = (nv1)*(N+i)/i; } nv = cas*nv1; nk = cas*nk1; P = new Rd[nv]; // no bug correct jan 2024 FH (thank to OP) K = new int[nk*d1]; // no bug correct jan 2024 FH (thank to OP) if( cas ==1) SplitSimplex( N, P,K); else { Rd G=Rd::diag(1./(d1)); for(int i=0;i<=d;++i) { Rd Khat[d+1]; for (int j=1;j<=d;++j) Khat[j][j-1]=1;// bug correct jan 2024 FH (thank to OP) Khat[i]=G; SplitSimplex( N, P,K+(nk1*d1)*i,nv1*i,Khat); // FH no recursion here ... } } if(verbosity>99) { cout << "SplitSimplex : nv =" << nv << " nk :" << nk << " " << N << endl ; for(int i=0; i< nv ; ++i) cout << i << " / " << P[i] << endl; for(int k=0,kk=0; k < nk; ++k) { cout << k << " " << kk << " : "; for(int m=0;m(int N,int & nv, R1 *& P, int & nk , int *& K); template void SplitSimplex(int N,int & nv, R2 *& P, int & nk , int *& K); template void SplitSimplex(int N,int & nv, R3 *& P, int & nk , int *& K); /* int main(int argc,const char ** argv) { R3 *P; int *K,nv,nk; int N=2; if(argc>1) N=atoi(argv[1]); SplitSimplex(N,nv,P,nk,K); cout << P << " " << K << endl; cout << N << " nv " << nv << " nk =" << nk << endl; for(int i=0;i void SplitSimplex(int N,int & nv, Rd *& P, int & nk , int *& K); // Add J. Morice for function trunc. void SplitSurfaceSimplex(int N,int &ntri2, int *&tri); freefem++-3.38-1/src/femlib/ufunction.hpp000644 000767 000024 00000005210 11406226635 020357 0ustar00hechtstaff000000 000000 // ORIG-DATE: Dec 2007 // -*- Mode : c++ -*- // // SUMMARY : Model of usefull function generic function // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curi, Paris, FRANCE // AUTHOR : Frederic Hecht // E-MAIL : frederic.hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #ifndef UFUNCTION_HPP_ #define UFUNCTION_HPP_ // some usefull function template inline T Min (const T &a,const T &b){return a < b ? a : b;} template inline T Max (const T &a,const T & b){return a > b ? a : b;} template inline T Abs (const T &a){return a <0 ? -a : a;} template inline double Norme (const T &a){return sqrt(a*a);} template inline void Exchange (T& a,T& b) {T c=a;a=b;b=c;} template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} template struct Copy { static A * copy(A a[d],B * const b) { for (int i=0;i struct Copy<1,A,B> { static A * copy(A a[1],B * const b ) { a[0]=b[0]; return a; }}; template struct Copy<2,A,B> { static A * copy(A a[2],B * const b) { a[0]=b[0]; a[1]=b[1]; return a; }}; template struct Copy<3,A,B> { static A * copy(A a[3],B * const b) { a[0]=b[0]; a[1]=b[1]; a[2]=b[2]; return a; }}; template struct Copy<4,A,B> { static A * copy(A a[4],B * const b) { a[0]=b[0]; a[1]=b[1]; a[2]=b[2]; a[3]=b[3]; return a; }}; struct UniqueffId { private: static int count ; int id; public: UniqueffId() : id(++count) {} bool operator==(UniqueffId u) const {return id==u.id;} bool operator!=(UniqueffId u) const {return id!=u.id;} void init(){id=++count;} }; #endif freefem++-3.38-1/src/Eigen/arpackff.hpp000644 000767 000024 00000040013 11406226635 017713 0ustar00hechtstaff000000 000000 /* The freefem++ arpack interface without arpack ++ aprack++ is do too much c++ error with modern compiler but a by tanks to arpack++ for the idea of this code F. Hecht. */ // Change V[1] -> V[0] // Change workev[1] -> workev[0] #ifndef ARPACKFF_HPP #define ARPACKFF_HPP #include "error.hpp" typedef int integer; typedef int logical; #define F77NAME(x) x ## _ #define HIDDEN_HBW ,int,int,int #define HIDDEN_BW ,int,int #define HIDDEN_12 ,1,2 #define HIDDEN_112 ,1,1,2 extern "C" { /* // debug "common" statement. struct { integer logfil, ndigit, mgetv0; integer msaupd, msaup2, msaitr, mseigt, msapps, msgets, mseupd; integer mnaupd, mnaup2, mnaitr, mneigt, mnapps, mngets, mneupd; integer mcaupd, mcaup2, mcaitr, mceigt, mcapps, mcgets, mceupd; } F77NAME(debug); // add FH pour lib dynamic so win 32 struct { integer nopx, nbx, nrorth, nitref, nrstrt; float tsaupd, tsaup2, tsaitr, tseigt, tsgets, tsapps, tsconv, tnaupd, tnaup2, tnaitr, tneigh, tngets, tnapps, tnconv, tcaupd, tcaup2, tcaitr, tceigh, tcgets, tcapps, tcconv, tmvopx, tmvbx, tgetv0, titref, trvec; } F77NAME(timing); */ // double precision symmetric routines. void F77NAME(dsaupd)(integer *ido, char *bmat, integer *n, char *which, integer *nev, double *tol, double *resid, integer *ncv, double *V, integer *ldv, integer *iparam, integer *ipntr, double *workd, double *workl, integer *lworkl, integer *info HIDDEN_BW); void F77NAME(dseupd)(logical *rvec, char *HowMny, logical *select, double *d, double *Z, integer *ldz, double *sigma, char *bmat, integer *n, char *which, integer *nev, double *tol, double *resid, integer *ncv, double *V, integer *ldv, integer *iparam, integer *ipntr, double *workd, double *workl, integer *lworkl, integer *info HIDDEN_HBW ); // double precision nonsymmetric routines. void F77NAME(dnaupd)(integer *ido, char *bmat, integer *n, char *which, integer *nev, double *tol, double *resid, integer *ncv, double *V, integer *ldv, integer *iparam, integer *ipntr, double *workd, double *workl, integer *lworkl, integer *info HIDDEN_BW); void F77NAME(dneupd)(logical *rvec, char *HowMny, logical *select, double *dr, double *di, double *Z, integer *ldz, double *sigmar, double *sigmai, double *workev, char *bmat, integer *n, char *which, integer *nev, double *tol, double *resid, integer *ncv, double *V, integer *ldv, integer *iparam, integer *ipntr, double *workd, double *workl, integer *lworkl, integer *info HIDDEN_HBW); // single precision symmetric routines. void F77NAME(ssaupd)(integer *ido, char *bmat, integer *n, char *which, integer *nev, float *tol, float *resid, integer *ncv, float *V, integer *ldv, integer *iparam, integer *ipntr, float *workd, float *workl, integer *lworkl, integer *info HIDDEN_BW); void F77NAME(sseupd)(logical *rvec, char *HowMny, logical *select, float *d, float *Z, integer *ldz, float *sigma, char *bmat, integer *n, char *which, integer *nev, float *tol, float *resid, integer *ncv, float *V, integer *ldv, integer *iparam, integer *ipntr, float *workd, float *workl, integer *lworkl, integer *info HIDDEN_HBW); // single precision nonsymmetric routines. void F77NAME(snaupd)(integer *ido, char *bmat, integer *n, char *which, integer *nev, float *tol, float *resid, integer *ncv, float *V, integer *ldv, integer *iparam, integer *ipntr, float *workd, float *workl, integer *lworkl, integer *info HIDDEN_BW); void F77NAME(sneupd)(logical *rvec, char *HowMny, logical *select, float *dr, float *di, float *Z, integer *ldz, float *sigmar, float *sigmai, float *workev, char *bmat, integer *n, char *which, integer *nev, float *tol, float *resid, integer *ncv, float *V, integer *ldv, integer *iparam, integer *ipntr, float *workd, float *workl, integer *lworkl, integer *info HIDDEN_HBW); void F77NAME(cnaupd)(integer *ido, char *bmat, integer *n, char *which, integer *nev, float *tol, complex *resid, integer *ncv, complex *V, integer *ldv, integer *iparam, integer *ipntr, complex *workd, complex *workl, integer *lworkl, float *rwork, integer *info HIDDEN_BW); void F77NAME(cneupd)(logical *rvec, char *HowMny, logical *select, complex *d, complex *Z, integer *ldz, complex *sigma, complex *workev, char *bmat, integer *n, char *which, integer *nev, float *tol, complex *resid, integer *ncv, complex *V, integer *ldv, integer *iparam, integer *ipntr, complex *workd, complex *workl, integer *lworkl, float *rwork, integer *info HIDDEN_HBW); // double precision complex routines. void F77NAME(znaupd)(integer *ido, char *bmat, integer *n, char *which, integer *nev, double *tol, complex *resid, integer *ncv, complex *V, integer *ldv, integer *iparam, integer *ipntr, complex *workd, complex *workl, integer *lworkl, double *rwork, integer *info HIDDEN_BW); void F77NAME(zneupd)(logical *rvec, char *HowMny, logical *select, complex *d, complex *Z, integer *ldz, complex *sigma, complex *workev, char *bmat, integer *n, char *which, integer *nev, double *tol, complex *resid, integer *ncv, complex *V, integer *ldv, integer *iparam, integer *ipntr, complex *workd, complex *workl, integer *lworkl, double *rwork, integer *info HIDDEN_HBW); } inline void saupp(int& ido, char bmat, int n, char* which, int nev, double& tol, double resid[], int ncv, double V[], int ldv, int iparam[], int ipntr[], double workd[], double workl[], int lworkl, int& info) { F77NAME(dsaupd)(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_12); } // saupp (double). inline void saupp(int& ido, char bmat, int n, char* which, int nev, float& tol, float resid[], int ncv, float V[], int ldv, int iparam[], int ipntr[], float workd[], float workl[], int lworkl, int& info) { F77NAME(ssaupd)(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_12); } // saupp (float). inline void seupp(bool rvec, char HowMny, double d[], double Z[], int ldz, double sigma, char bmat, int n, char* which, int nev, double tol, double resid[], int ncv, double V[], int ldv, int iparam[], int ipntr[], double workd[], double workl[], int lworkl, int& info) { int irvec; logical* iselect; double* iZ; irvec = (int) rvec; iselect = new logical[ncv]; iZ = (Z == NULL) ? &V[0] : Z; F77NAME(dseupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_112); delete[] iselect; } // seupp (double). inline void seupp(bool rvec, char HowMny, float d[], float Z[], int ldz, float sigma, char bmat, int n, char* which, int nev, float tol, float resid[], int ncv, float V[], int ldv, int iparam[], int ipntr[], float workd[], float workl[], int lworkl, int& info) { int irvec; logical* iselect; float* iZ; irvec = (int) rvec; iselect = new logical[ncv]; iZ = (Z == NULL) ? &V[0] : Z; F77NAME(sseupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_112 ); delete[] iselect; } // seupp (float). inline void naupp(int& ido, char bmat, int n, char* which, int nev, double& tol, double resid[], int ncv, double V[], int ldv, int iparam[], int ipntr[], double workd[], double workl[], int lworkl, int& info) { F77NAME(dnaupd)(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_12); } // naupp (double). inline void naupp(int& ido, char bmat, int n, char* which, int nev, float& tol, float resid[], int ncv, float V[], int ldv, int iparam[], int ipntr[], float workd[], float workl[], int lworkl, int& info) { F77NAME(snaupd)(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_12 ); } // naupp (float). inline void caupp(int& ido, char bmat, int n, char* which, int nev, double& tol, complex resid[], int ncv, complex V[], int ldv, int iparam[], int ipntr[], complex workd[], complex workl[], int lworkl, double rwork[], int& info) { F77NAME(znaupd)(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &rwork[1], &info HIDDEN_12 ); } // caupp inline void caupp(int& ido, char bmat, int n, char* which, int nev, float& tol, complex resid[], int ncv, complex V[], int ldv, int iparam[], int ipntr[], complex workd[], complex workl[], int lworkl, float rwork[], int& info) { F77NAME(cnaupd)(&ido, &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &rwork[1], &info HIDDEN_12); } // caupp inline void ceupp(bool rvec, char HowMny, complex d[], complex Z[], int ldz, complex sigma, complex workev[], char bmat, int n, char* which, int nev, double tol, complex resid[], int ncv, complex V[], int ldv, int iparam[], int ipntr[], complex workd[], complex workl[], int lworkl, double rwork[], int& info) { int irvec; logical* iselect; complex* iZ; irvec = (int) rvec; iselect = new logical[ncv]; iZ = (Z == NULL) ? &V[0] : Z; F77NAME(zneupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, &workev[0], &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &rwork[1], &info HIDDEN_112); delete[] iselect; } // ceupp (complex). inline void ceupp(bool rvec, char HowMny, complex d[], complex Z[], int ldz, complex sigma, complex workev[], char bmat, int n, char* which, int nev, float tol, complex resid[], int ncv, complex V[], int ldv, int iparam[], int ipntr[], complex workd[], complex workl[], int lworkl, float rwork[], int& info) { int irvec; logical* iselect; complex* iZ; irvec = (int) rvec; iselect = new logical[ncv]; iZ = (Z == NULL) ? &V[0] : Z; F77NAME(cneupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, &workev[0], &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &rwork[1], &info HIDDEN_112); delete[] iselect; } // ceupp (complex). inline void neupp(bool rvec, char HowMny, double dr[], double di[], double Z[], int ldz, double sigmar, double sigmai, double workv[], char bmat, int n, char* which, int nev, double tol, double resid[], int ncv, double V[], int ldv, int iparam[], int ipntr[], double workd[], double workl[], int lworkl, int& info) { int irvec; logical* iselect; double* iZ; irvec = (int) rvec; iselect = new logical[ncv]; iZ = (Z == NULL) ? &V[0] : Z; F77NAME(dneupd)(&irvec, &HowMny, iselect, dr, di, iZ, &ldz, &sigmar, &sigmai, &workv[1], &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_112); delete[] iselect; } // neupp (double). inline void neupp(bool rvec, char HowMny, float dr[], float di[], float Z[], int ldz, float sigmar, float sigmai, float workv[], char bmat, int n, char* which, int nev, float tol, float resid[], int ncv, float V[], int ldv, int iparam[], int ipntr[], float workd[], float workl[], int lworkl, int& info) { int irvec; logical* iselect; float* iZ; irvec = (int) rvec; iselect = new logical[ncv]; iZ = (Z == NULL) ? &V[0] : Z; F77NAME(sneupd)(&irvec, &HowMny, iselect, dr, di, iZ, &ldz, &sigmar, &sigmai, &workv[1], &bmat, &n, which, &nev, &tol, resid, &ncv, &V[0], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], &lworkl, &info HIDDEN_112); delete[] iselect; } // neupp (float). inline void sauppError(int info) { if(info<0) cerr << " erreur arpack sauppError" < #include #include #include #include using namespace std; #include "error.hpp" #include "arpackff.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" #include "MatriceCreuse_tpl.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" //#include "ffstack.hpp" extern Block *currentblock; typedef double R; static bool dddd=false; template void Show(int ido,KN_ w,const char *cmm) { cout << cmm << ido << " max " << w.max() << " min " << w.min() << " sum =" << w.sum() << endl; } template class FuncMat: public VirtualMatrice { public: // typedef double K; typedef KN Kn; typedef KN_ Kn_; Stack stack; int cas; mutable Kn x; C_F0 c_x; Kn *b; Expression mat1,mat; typedef typename VirtualMatrice::plusAx plusAx; FuncMat(int kas,int n,Stack stk,const OneOperator * op,Kn *bb=0) : VirtualMatrice(n), stack(stk),cas(kas), x(n),c_x(CPValue(x)),b(bb), mat1(op->code(basicAC_F0_wa(c_x))), mat( CastTo(C_F0(mat1,(aType)*op)) ) { } FuncMat() { if(mat1!=mat) delete mat; delete mat1; delete c_x.LeftValue();} void addMatMul(const Kn_ & xx, Kn_ & Ax) const { // cout <<" addMatMul " <((*mat)(stack)); if(b && &Ax!=b) Ax += *b; // Ax -b => add b (not in cas of init. b c.a.d &Ax == b WhereStackOfPtr2Free(stack)->clean(); // add dec 2008 } void Solve( KN_ & Ax ,const KN_ & xx) const { ffassert(xx.N()==Ax.N() && cas == -1); x =xx; Ax = GetAny((*mat)(stack)); if(b && &Ax!=b) Ax += *b; // Ax -b => add b (not in cas of init. b c.a.d &Ax == b WhereStackOfPtr2Free(stack)->clean(); // add dec 2008 } plusAx operator*(const Kn & x) const {return plusAx(this,x);} virtual bool ChecknbLine(int n) const { return true;} virtual bool ChecknbColumn(int m) const { return true;} }; template void DoIdoAction(int ido,int mode,KN_ &xx,KN_ &yy,KN_ &zz,KN_ &work,Mat &OP1,Mat &B) { if(mode>2) // inverse mode switch (ido) { case -1: //y <--- OP*x = inv[A-SIGMA*M]*M*x if(dddd) Show(ido,xx," <- (xx) "); OP1.Solve(yy,work=B*xx); if(dddd) Show(ido,yy," -> (yy) "); break; case 1:// y <-- OP*x = inv[A-sigma*M]*z if(dddd) Show(ido,zz," <- (zz) "); OP1.Solve(yy,zz); if(dddd) Show(ido,yy," -> (yy) "); break; case 2: // y <--- M*x if(dddd) Show(ido,xx," <- (xx) "); yy = B*xx; if(dddd) Show(ido,yy," -> (yy) "); break; default : ffassert(0); } else // direct mode switch (ido) { case -1: // y <--- OP*x = inv[M]*A*x case 1: if(mode== 1) // M = Id yy=OP1*xx; else B.Solve(yy,work=OP1*xx); break; case 2: // y <--- M*x. // not use mode = 1 yy = B*xx; break; default : ffassert(0); } } class EigenValue : public OneOperator { public: typedef R K; typedef KN Kn; typedef KN_ Kn_; const int cas; class E_EV: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =12; Expression nargs[n_name_param]; Expression expOP1,expB,expn; const OneOperator * codeOP1, *codeB; template T arg(int i,Stack stack,const T & a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} E_EV(const basicAC_F0 & args,int cc) : cas(cc) { // OP1 = (A-sigma*B) // int nbj= args.size()-1; args.SetNameParam(n_name_param,name_param,nargs); if( cas==1 || cas ==2) { expn=to< long>(args[0]); expOP1=0; expB=0; const Polymorphic * op= dynamic_cast(args[1].LeftValue()); ffassert(op); codeOP1 = op->Find("(",ArrayOfaType(atype(),false)); if( cas== 2) { const Polymorphic * op= dynamic_cast(args[2].LeftValue()); ffassert(op); codeB = op->Find("(",ArrayOfaType(atype(),false)); } } else { expOP1=to< Matrice_Creuse *>(args[0]); expB=to< Matrice_Creuse *>(args[1]); codeOP1=0; codeB=0; expn=0; } } AnyType operator()(Stack stack) const; operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_EV(args,cas);} EigenValue() : OneOperator(atype(), atype *>(), atype *>()), cas(0){} EigenValue(int ,int ) : OneOperator(atype(),atype(), atype(), atype()), cas(2){} EigenValue(int ) : OneOperator(atype(),atype(), atype()), cas(1){} }; class EigenValueC : public OneOperator { public: typedef Complex K; typedef double R; typedef KN Kn; typedef KN_ Kn_; const int cas; class E_EV: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =10; Expression nargs[n_name_param]; Expression expOP1,expB,expn; const OneOperator * codeOP1, *codeB; template T arg(int i,Stack stack,const T & a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} E_EV(const basicAC_F0 & args,int cc) : cas(cc) { // OP1 = (A-sigma*B) // int nbj= args.size()-1; args.SetNameParam(n_name_param,name_param,nargs); if( cas==1 || cas ==2) { expn=to< long>(args[0]); expOP1=0; expB=0; const Polymorphic * op= dynamic_cast(args[1].LeftValue()); ffassert(op); codeOP1 = op->Find("(",ArrayOfaType(atype(),false)); if( cas== 2) { const Polymorphic * op= dynamic_cast(args[2].LeftValue()); ffassert(op); codeB = op->Find("(",ArrayOfaType(atype(),false)); } } else { expOP1=to< Matrice_Creuse *>(args[0]); expB=to< Matrice_Creuse *>(args[1]); codeOP1=0; codeB=0; expn=0; } } AnyType operator()(Stack stack) const; operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_EV(args,cas);} EigenValueC() : OneOperator(atype(), atype *>(), atype *>()), cas(0){} EigenValueC(int ,int ) : OneOperator(atype(),atype(), atype(), atype()), cas(2){} EigenValueC(int ) : OneOperator(atype(),atype(), atype()), cas(1){} }; /* class EigenValueC : public OneOperator { public: typedef Complex K; typedef double R; typedef KN Kn; typedef KN_ Kn_; const int cas; class E_EV: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =10; Expression nargs[n_name_param]; Expression expOP1,expB; template T arg(int i,Stack stack,const T & a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} E_EV(const basicAC_F0 & args,int cc) : cas(cc) { // OP1 = (A-sigma*B) // int nbj= args.size()-1; args.SetNameParam(n_name_param,name_param,nargs); expOP1=to< Matrice_Creuse *>(args[0]); expB=to< Matrice_Creuse *>(args[1]); } AnyType operator()(Stack stack) const; operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_EV(args,cas);} EigenValueC(int c) : OneOperator(atype(), atype *>(), atype *>()), cas(c){} }; */ basicAC_F0::name_and_type EigenValue::E_EV::name_param[]= { { "tol", &typeid(double) }, { "nev",&typeid(long) }, { "sym",&typeid(bool)}, { "sigma",&typeid(double)}, { "value",&typeid(KN *)}, { "vector",&typeid(FEbaseArrayKn *) }, // pferarray { "ncv",&typeid(long) }, // the number of Arnoldi vectors generated { "maxit",&typeid(long)}, // the maximum number of Arnoldi iterations { "ivalue",&typeid(KN *)}, { "rawvector",&typeid(KNM *) }, { "resid",&typeid(KN *) }, { "mode",&typeid(long) } // 12 ieme }; basicAC_F0::name_and_type EigenValueC::E_EV::name_param[]= { { "tol", &typeid(double) }, { "nev",&typeid(long) }, { "sigma",&typeid(K)}, { "value",&typeid(KN *)}, { "vector",&typeid(FEbaseArrayKn *) }, // pfecarray { "ncv",&typeid(long) }, // the number of Arnoldi vectors generated { "maxit",&typeid(long)}, // the maximum number of Arnoldi iterations { "rawvector",&typeid(KNM *) }, { "resid",&typeid(KN *)}, { "mode",&typeid(long) } // 10 ieme }; AnyType EigenValue::E_EV::operator()(Stack stack) const { dddd = (verbosity>=200); double tol=1e-6; long nconv=0; long nbev=1; bool sym=false; long ncv =0; // the number of Arnoldi vectors generated long maxit=0; // the maximum number of Arnoldi iterations double sigma=0; int mode = 3; // KN * evalue=0; KN * evaluei=0; KN * resid=0; KNM * rawvector=0; //double ws,vs; // for debugging FH ++++++++++ // pferarray evector2; FEbaseArrayKn * evector=0;// change mai 2009 tol=arg(0,stack,0); nbev=arg(1,stack,10); sym=arg(2,stack,false); sigma=arg(3,stack,0.0); evalue=arg *>(4,stack,0); evector =arg *>(5,stack,0); ncv= arg(6,stack,0); maxit= arg(7,stack,0); evaluei=arg *>(8,stack,0); rawvector=arg *>(9,stack,0); resid=arg *>(10,stack,0); mode = arg(11,stack,3); // evector=evector2.first; Matrice_Creuse *pOP1=0, *pB=0; if(expOP1) pOP1 = GetAny *>((*expOP1)(stack)); if(expB) pB = GetAny *>((*expB)(stack)); double * residptr=resid? (double*) *resid : 0; cout << " residptr = " << residptr <A->n; else { ffassert(expn); n = GetAny((*expn)(stack)); } if(evalue) nbev=Max( (long)evalue->N(),nbev); const VirtualMatrice * ptOP1, *ptB; if(pOP1) ptOP1= & (const VirtualMatrice&)(pOP1->A); if(pB) ptB = & (const VirtualMatrice&)(pB->A); FuncMat *pcOP1=0, *pcB=0; if(codeOP1) ptOP1=pcOP1= new FuncMat(-1,n,stack,codeOP1); if(codeB) ptB=pcB= new FuncMat(1,n,stack,codeB); MatriceIdentite Id(n); if(!ptB) ptB = &Id; const VirtualMatrice &OP1= *ptOP1, &B=*ptB; if(sym) { nbev=min(n-1,nbev); if(!ncv) ncv = min(nbev*2+1,n); } else { nbev=min(nbev,n-2); if(!ncv) ncv = nbev*2+1; } ncv = max(nbev+2,ncv); ncv = min(ncv,n); if(!maxit) maxit = 100*nbev; const char *serr[10]; int err=0; if( ! (nbev < n) ) serr[err++]=" Number of eigenvalues of OP to be computed nev <= n "; if( (mode < 1 || mode > 5) && sym) serr[err++]=" the mode = 1 ,2 ,3, 4, 5 "; if( (mode < 1 || mode > 4) && !sym) serr[err++]=" the mode = 1 ,2 ,3, 4 "; // 2 <= NCV-NEV and NCV <= N if( ! ( ncv <= n) && sym ) serr[err++]=" ( ncv <= n) (symetric case) "; if( ! ( ( ncv <= n) && 2 <= (ncv-nbev ) ) && !sym ) serr[err++]=" ( ncv <= n) 2 <= (ncv-nev ) ( no-symetric case) "; if (n != OP1.M) serr[err++]=" the first matrix in EigneValue is not square."; if (n != B.N ) serr[err++]="Sorry the row's number of the secand matrix in EigneValue is wrong."; if (n != B.M ) serr[err++]="Sorry the colum's number of the secand matrix in EigneValue is wrong."; if(verbosity) { if(sym) cout << "Real symmetric eigenvalue problem: A*x - B*x*lambda" << endl; else cout << "Real non symmetric eigenvalue problem: A*x - B*x*lambda" << endl; } if(verbosity>9 || err) cout << " n " << n << ", nev "<< nbev << ", tol =" << tol << ", maxit =" << maxit << ", ncv = " < work(n); if(sym) { int ido=0; char bmat= mode == 1 ? 'I' : 'G'; char which[3]= "LM"; // larger value // if(mode >2) which[0] ='S'; // smaller value int ishift=1; // Auto Shift true by default int iparam[12]= {0,ishift,0,(int)maxit,1,(int) nconv,0,mode,0,0,0,0}; int ipntr[12]={ 0,0,0, 0,0,0, 0,0,0, 0,0,0 }; KN workd(3*n+1); int lworkl = ncv*(ncv+9); KN workl(lworkl+1); KN vp(ncv*n+1); int info= (residptr !=0); KN vresid(residptr? 1: n); if(!residptr) residptr=&vresid[0]; while (1) { saupp(ido,bmat,n,which,nbev,tol, residptr, ncv, vp, n, iparam, ipntr, workd, workl, lworkl, info); if(verbosity>99) cout << " saupp ido: " << ido << " info : " << info << endl; if(info<0) {cerr << " -- err arpack info = " << info << endl;} sauppError(info); if(ido==99) break; KN_ xx(&workd[ipntr[1]],n); KN_ yy(&workd[ipntr[2]],n); KN_ zz(&workd[ipntr[3]],n); DoIdoAction(ido,mode,xx,yy,zz,work,OP1,B); } nconv = iparam[5]; if(nconv==0) cerr << " -- Strange: no eigens values ??? " << endl; // Finding eigenvalues and eigenvectors. if(nconv) { int newdim = nbev; if(nconv>nbev) { cerr << "WARNING: nconv(saupp) > nbev: " << nconv << " > " << nbev << endl; newdim = nconv; } KN evr(newdim); KNM Z(n,newdim); int ldz=n; char HowMny ='A'; int rvec=1; seupp( rvec, HowMny, evr, Z, ldz, sigma, bmat, n, which, nbev, tol, residptr, ncv, vp, n, iparam,ipntr, workd, workl,lworkl,info); if(verbosity>5) { cout << "Dimension of the system : " << n << endl; cout << "Number of 'requested' eigenvalues : " << nbev << endl; cout << "Number of 'converged' eigenvalues : " << nconv << endl; cout << "Number of Arnoldi vectors generated: " << ncv << endl; cout << "Number of iterations taken : " << iparam[3] << endl; cout << endl; //if (prob.EigenvaluesFound()) { cout << "Eigenvalues:" << endl; for (int i=0; i vi(Z(':',i)) ; if(verbosity>99) cout <<" Eigenvector: :" << vi << endl; } cout << endl; } if (evalue) { KN & ev(*evalue); int m = Min(nconv,ev.N()); for(int i=0;iM()); ffassert(rawvector->N()==n); for(int i=0;i vi(Z(':',i)) ; // cout << " ------ EV--raw " << vi.min() << " " << vi.max() << endl; (*rawvector)(':',i)=vi; } } if (evector) { FEbaseArrayKn & ev(*evector); int m = Min(nconv,(long) ev.N); for(int i=0;i & xx= *(ev(i)); //if(xx.pVh->NbDoF != n) //ExecError("Wrong Type size of FEspace to store the eigen vector "); // if (xx.pVh != pOP1->pUh) // ExecError("Wrong Type of FEspace to store the eigen vector "); //xx.Vh = pOP1->Uh; KN_ vi(Z(':',i)) ; ev.set(i,vi); } } } } else { // cas non symetrique , // Finding an Arnoldi basis. //int mode=3; // Shift invert int ido=0; char bmat='G'; char which[]="LM"; int ishift=1; // Auto Shift true by default int iparam[12]= {0,ishift,0,(int)maxit,1,(int)nconv,0,mode,0,0,0,0}; int ipntr[15]={ 0,0,0, 0,0,0, 0,0,0, 0,0,0 ,0,0,0}; KN workd(3*n+1); int lworkl = 3*ncv*(ncv+2); KN workl(lworkl+1); KN vp(ncv*n+1); int info= (residptr !=0); KN vresid(residptr? 1: n); if(!residptr) residptr=&vresid[0]; if(verbosity>9) cout << " n " << n << " nbev "<< nbev << " tol =" << tol << " maxit =" << maxit << " ncv = " <99) {cout << " naupp ido: " << ido << " info : " << info << endl;} if(info<0) {cerr << " -- err arpack info = " << info << endl;} sauppError(info); if(ido==99) break; KN_ xx(&workd[ipntr[1]],n); KN_ yy(&workd[ipntr[2]],n); KN_ zz(&workd[ipntr[3]],n); DoIdoAction(ido,mode,xx,yy,zz,work,OP1,B); } nconv = iparam[5]; if(nconv) { int newdim = nbev; if(nconv>nbev) { cerr << "WARNING: nconv(naupp) > nbev: " << nconv << " > " << nbev << endl; newdim = nconv; } KN evr(newdim+1), evi(newdim+1); KNM Z(n,newdim+1); KN workev(3*ncv); int ldz=n; char HowMny ='A'; int rvec=1; double sigmai=0; neupp( rvec, HowMny, evr,evi, Z , ldz, sigma,sigmai, workev, bmat, n, which, nbev, tol, residptr, ncv, vp, n, iparam , ipntr, workd, workl,lworkl,info); if (verbosity) { cout << "Real non-symmetric eigenvalue problem: A*x - B*x*lambda" << endl; cout << "mode " << mode << " sigma=" << sigma << endl << endl; cout << "Dimension of the system : " << n << endl; cout << "Number of 'requested' eigenvalues : " << nbev << endl; cout << "Number of 'converged' eigenvalues : " << nconv << endl; cout << "Number of Arnoldi vectors generated: " << ncv << endl; cout << "Number of iterations taken : " << iparam[3] << endl; cout << endl; cout << "Eigenvalues:" << endl; for (int i=0; i vi(Z(':',i)) ; if(verbosity>99) { cout <<" Eigenvector: :" << vi << endl; cout << endl; } } } if (evalue) { KN & ev(*evalue); int m = Min(nconv,ev.N()); for(int i=0;i & ev(*evaluei); int m = Min(nconv,ev.N()); for(int i=0;iM()); ffassert(rawvector->N()==n); for(int i=0;i vi(Z(':',i)) ; cout << " ------ EV--raw " << vi.min() << " " << vi.max() << endl; (*rawvector)(':',i)=vi; } } if (evector) { // K* rawev(prob.RawEigenvectors()); // rawev + n*k is // iev = prob.EigenvalueImag(k) // iev==0 => the eigen vector // iev> 0 => real // start real : rawev + n*k // start imag : ramev +n*(k+1) // iev < 0 => complex // start real : rawev + n*(k-1) // -start imag : ramev +n*(k) FEbaseArrayKn & ev(*evector); int m = Min(nconv,(long) ev.N); for(int i=0;i & xx= *(ev[i]); // if (xx.pVh != pOP1->pUh) // ExecError("Wrong Type of FEspace to store the eigen vector "); // xx.Vh = pOP1->Uh; // int k=(ev_i < 0) ? i-1 : i; //int k=i; KN_ vi(Z(':',i));//rawev+n*k,n) ; //xx= new KN(vi); ev.set(i,vi);//new KN(vi)); } } } } if(pcOP1) delete pcOP1; if(pcB) delete pcB; return (long) nconv; } AnyType EigenValueC::E_EV::operator()(Stack stack) const { dddd = (verbosity>=200); double tol=1e-6; long nconv=0; long nbev=1; long ncv =0; // the number of Arnoldi vectors generated long maxit=0; // the maximum number of Arnoldi iterations long mode=3; K sigma=0; KN * evalue=0; KN * resid=0; KNM * rawvector=0; // pfecarray evector2; FEbaseArrayKn * evector=0; tol=arg(0,stack,0); nbev=arg(1,stack,0); sigma=arg(2,stack,0.0); evalue=arg *>(3,stack,0); // evector2 =arg(4,stack,make_pair(0,0)); evector= arg * >(4,stack,0); ncv= arg(5,stack,0); maxit= arg(6,stack,0); rawvector=arg *>(7,stack,0); resid=arg *>(8,stack,0); mode = arg(9,stack,3); K * residptr= resid ? (K*) *resid : 0; //evector=evector2.first; ffassert(mode>0 && mode <4) ; // Matrice_Creuse *pOP1 = GetAny *>((*expOP1)(stack)); // Matrice_Creuse *pB = GetAny *>((*expB)(stack)); if(evalue) nbev=Max( (long)evalue->N(),nbev); if(!maxit) maxit = 100*nbev; //const MatriceCreuse & OP1 = pOP1->A; //const MatriceCreuse & B = pB->A; //long n=OP1.n; Matrice_Creuse *pOP1=0, *pB=0; if(expOP1) pOP1 = GetAny *>((*expOP1)(stack)); if(expB) pB = GetAny *>((*expB)(stack)); // double * residptr=resid? (double*) *resid : 0; // cout << " residptr = " << residptr <A->n; else { ffassert(expn); n = GetAny((*expn)(stack)); } if(evalue) nbev=Max( (long)evalue->N(),nbev); const VirtualMatrice * ptOP1, *ptB; if(pOP1) ptOP1= & (const VirtualMatrice&)(pOP1->A); if(pB) ptB = & (const VirtualMatrice&)(pB->A); FuncMat *pcOP1=0, *pcB=0; if(codeOP1) ptOP1=pcOP1= new FuncMat(-1,n,stack,codeOP1); if(codeB) ptB=pcB= new FuncMat(1,n,stack,codeB); MatriceIdentite Id(n); if(!ptB) ptB = &Id; const VirtualMatrice &OP1= *ptOP1, &B=*ptB; nbev=min(nbev,n-2); if(!ncv) ncv = nbev*2+1; ncv = max(nbev+2,ncv); ncv = min(ncv,n); const char *serr[10]; int err=0; if(nbev>= n-1) serr[err++]=" Number of eigenvalues of OP to be computed <= n-2 "; if( mode < 1 || mode > 3) serr[err++]=" the mode = 1 ,2 ,3 "; // 2 <= NCV-NEV and NCV <= N if( ! ( 2 <= nbev && ncv <= n)) serr[err++]=" ( 2 <= nbve && nvc <= n) "; if (n != OP1.N) serr[err++]=" the first matrix in EigneValue is not Hermitien."; if (n != B.N ) serr[err++]="Sorry the row's number of the secand matrix in EigneValue is wrong."; if (n != B.M ) serr[err++]="Sorry the colum's number of the secand matrix in EigneValue is wrong."; if(verbosity) cout << "Real complex eigenvalue problem: A*x - B*x*lambda" << endl; if(verbosity>9 || err) cout << " n " << n << " nev "<< nbev << " tol =" << tol << " maxit =" << maxit << " ncv = " << ncv << " mode = " << mode << endl; if(err) { cerr << " list of the error " << endl; for (int i=0;i work(n); // ARrcSymGenEig is a class that requires the user to provide a // way to perform the matrix-vector products w = OP*Bv = // inv(A-sigma*B)*B*v and w = B*v, where sigma is the adopted shift. // OP1 = (A-sigma*B) // OP = inv(OP) /* ffassert(0); ARrcCompGenEig prob( n, nbev, sigma,"LM",ncv,tol,maxit,residptr); // OP = inv[A - sigma*I] // Finding an Arnoldi basis. while (!prob.ArnoldiBasisFound()) { // Calling ARPACK FORTRAN code. Almost all work needed to prob.TakeStep(); */ // cas non symetrique , // Finding an Arnoldi basis. \ // int mode=3; // Shift invert \ int ido=0; char bmat='G'; char which[]="LM"; int ishift=1; // Auto Shift true by default \ int iparam[12]= { 0, ishift, 0, (int) maxit, 1,(int) nconv, 0,(int) mode, 0, 0, 0, 0 }; int ipntr[15]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; KN workd(3*n+1); int lworkl = 3*ncv*ncv+5*ncv; KN workl(lworkl+1); KN vp(ncv*n+1); int info= (residptr !=0); KN rwork(ncv+1); KN vresid(residptr? 1: n); if(!residptr) residptr=&vresid[0]; while(1) { caupp(ido, bmat, n, which, nbev, tol, residptr, ncv, vp, n, iparam, ipntr, workd, workl, lworkl,rwork, info); if(verbosity>99) { cout << " caupp ido: " << ido << " info : " << info << endl; } if(info<0) {cerr << " -- err arpack info = " << info << endl;} sauppError(info); if(ido==99) break; KN_ xx(&workd[ipntr[1]],n); KN_ yy(&workd[ipntr[2]],n); KN_ zz(&workd[ipntr[3]],n); DoIdoAction(ido,mode,xx,yy,zz,work,OP1,B); } nconv = iparam[5]; if(nconv) { int newdim = nbev; if(nconv>nbev) { cerr << "WARNING: nconv(caupp) > nbev: " << nconv << " > " << nbev << endl; newdim = nconv; } KN evc(newdim); KNM Z(n,newdim); KN workev(3*ncv); //int ldz=n; char HowMny ='A'; int rvec=1; ceupp( rvec, HowMny, evc, Z, n, sigma, workev, bmat, n, which, nbev, tol, residptr, ncv, vp, n, iparam, ipntr, workd, workl,lworkl,rwork,info); if (verbosity) { cout << "Complex eigenvalue problem: A*x - B*x*lambda" << endl; cout << "mode =" << mode << " sigma=" << sigma << endl << endl; cout << "Dimension of the system : " << n << endl; cout << "Number of 'requested' eigenvalues : " << nbev << endl; cout << "Number of 'converged' eigenvalues : " << nconv << endl; cout << "Number of Arnoldi vectors generated: " << ncv << endl; cout << "Number of iterations taken : " << iparam[3] << endl; cout << endl; cout << "Eigenvalues:" << endl; for (int i=0; i vi(Z(':',i)) ; if(verbosity>99) cout <<" Eigenvector: :" << vi << endl; } cout << endl; } if (evalue) { KN & ev(*evalue); int m = Min(nconv,ev.N()); for(int i=0;i & ev(*evector); FEbaseArrayKn & ev(*evector); int m = Min(nconv,(long) ev.N); for(int i=0;i & xx= **(ev[i]); //KN_ vi(Z(':',i)) ; //xx= new KN(vi); ev.set(i,Z(':',i)); } } if(rawvector) { int m = Min(nconv,rawvector->M()); ffassert(rawvector->N()==n); for(int i=0;i vi(Z(':',i)) ; (*rawvector)(':',i)=vi; cout << " raw " << vi.l2() << " == " << (*rawvector)(':',i).l2()<< endl; } } } return (long) nconv; } #ifndef DYNM_LOAD void init_eigenvalue() { if(verbosity&& (mpirank==0) ) cout << "eigenvalue "; Global.Add("EigenValue","(",new EigenValue()); // j + dJ Global.Add("EigenValue","(",new EigenValueC()); // j + dJ Global.Add("EigenValue","(",new EigenValue(1)); // j + dJ Global.Add("EigenValue","(",new EigenValue(1,1)); // j + dJ // Global.Add("EigenValue","(",new EigenValueC(1)); // j + dJ } #else class Init { public: Init() { if(verbosity&&(mpirank==0) ) cout << "eigenvalue "; Global.Add("EigenValue2","(",new EigenValue()); // j + dJ Global.Add("EigenValue2","(",new EigenValueC(1)); // j + dJ } }; Init init; #endif freefem++-3.38-1/src/bin-win32/launchff++.cpp000755 000767 000024 00000002423 12533551067 020536 0ustar00hechtstaff000000 000000 #include #include #include #include #include #include using namespace std; const char C='"'; int main(int argc,const char **argv) { int debug=0; char *dir=0; const char *pp=0; string cmd="freefem++.exe "; if(argc <=1) { // cerr << " Sorry no file name "<< endl; // cerr << " Drag and Drop the file icon on the application icon or double clip on script file" << endl; cmd += " -wait -log"; int ret= system(cmd.c_str()); return 0; } for(int i=1;i2) if( argv[i][1]==':') pp= argv[i]; cmd += C; cmd += " "; if( debug) cout << " ffl: arg " << i << argv[i] << endl; }} if(pp) { if( debug ) cout << " ffl: file:" << pp << endl; int i=0; int l= strlen(pp); for(i=l-1;i>=0;i--) if(pp[i]=='\\') break; dir= new char [l+1]; strcpy(dir,pp); dir[i]=0; if(debug) cout << " ffl: chdir to " << dir << endl; _chdir(dir); delete [] dir; } cmd += " -wait -log"; if(debug) cout << "exec " << cmd << endl; int ret= system(cmd.c_str()); return ret; } freefem++-3.38-1/src/bin-win32/Makefile.am000755 000767 000024 00000011071 12471700013 020135 0ustar00hechtstaff000000 000000 EXTRA_DIST=launchff++.cpp LDADD2 = $(ARPACKLIBS) $(UMFPACKLIBS) $(BLASLIBS) $(G2CLIB) # remark the libff.dll was splited in 6 because ld trap # to much routine => memory fault in ld # but now I see thant the couple allocation/delete # must be make in same .dll file under windows # is impossible to manage with the template generation # so one .dll (this work with gcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)) # change the entry points mymain to mainff # to be compatibile with bamg. # FF_OBJ0 = CodeAlloc.o AFunction2.o CheckPtr.o lex.o global.o environment.o load.o FF_OBJ_AC = array_complex.o FF_OBJ_AR = array_real.o FF_OBJ_AL = array_long.o FF_OBJ1 = AFunction.o InitFunct.o strversionnumber.o mt19937ar.o string_def.o FF_OBJ2 = BamgFreeFem.o Drawing.o Element_P2h.o Element_RT.o FESpace.o FQuadTree.o InitFunct.o Mesh2.o MeshDraw.o MeshGeom.o MeshQuad.o MeshRead.o MeshWrite.o Meshio.o Metric.o QuadTree.o QuadratureFormular.o R2.o SetOfE4.o eigenvalue.o fem.o gibbs.o lgalgo.o lgfem.o lgmat.o lgmesh.o mshptg.o problem.o DefColor.o lgmesh3.o P012_2d.o P012_3d.o FESpacen.o ../libMesh/chrono.o ../libMesh/libmesh3.o ../libMesh/memory.o ../libMesh/eigenv.o ../libMesh/libmesh5.o Mesh1dn.o Mesh2dn.o Mesh3dn.o GQuadTree.o glumesh2D.o UMFPack_Solver.o splitsimplex.o P1IsoValue.o FF_OBJIDE = FreeFem___cs-cs.o FreeFem___cs-commands.o FreeFem___cs-draw.o FreeFem___cs-strversionnumber.o FreeFem___cs-socket.o FreeFem___cs-threads.o FreeFem___cs-hl_yacc.o FreeFem___cs-hl_lex.o FreeFem___cs-highlight.o FreeFem___cs-spawn.o FreeFem___cs-editor.o FreeFem___cs-server.o windres.o FFD_OBJ0 = $(patsubst %.o,../fflib/%.o,$(FF_OBJ0)) FFD_OBJ_AC = $(patsubst %.o,../fflib/%.o,$(FF_OBJ_AC)) FFD_OBJ_AL = $(patsubst %.o,../fflib/%.o,$(FF_OBJ_AL)) FFD_OBJ_AR = $(patsubst %.o,../fflib/%.o,$(FF_OBJ_AR)) FFD_OBJ1 = $(patsubst %.o,../fflib/%.o,$(FF_OBJ1)) FFD_OBJ2 = $(patsubst %.o,../fflib/%.o,$(FF_OBJ2)) FFD_OBJIDE = $(patsubst %.o,../ide/%.o,$(FF_OBJIDE)) FFD_OBJLMSH = $(patsubst %.o,../ide/%.o,$(FF_OBJLMSH)) LIBS_FF = ../nw/ffapi.o libff.dll LIBS_FFmpi = ../mpi/ffapi.o libff.dll all-local: $(WIN32DLLTARGET) -for i in $(LDADD2) ; do case $$i in *.dll) echo cp -p $$i .; cp -p $$i . ;; esac ; done echo done win32-dll-target: FreeFem++.exe FreeFem++-nw.exe bamg.exe cvmsh2.exe launchff++.exe ff-c++ $(MPIPROG) echo "on a fini" libff.dll: $(FFD_OBJ0) $(FFD_OBJ_AR) $(FFD_OBJ_AC) $(FFD_OBJ_AL) $(FFD_OBJ1) $(FFD_OBJ2) ../lglib/lg.tab.o $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $^ -o $@ $(LDADD2) FreeFem++-nw.exe: ../nw/sansrgraph.o ../nw/parallelempi-empty.o ../lglib/mymain.o $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) libff.dll $^ -o $@ -lcomdlg32 FreeFem++.exe: ../nw/sansrgraph.o ../nw/parallelempi-empty.o ../lglib/mymain.o $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) libff.dll $^ -o $@ -lcomdlg32 ## FH.. Strange : pb with MPI finaly with ffapi-mpi.dll ( J'ai compris) ## dur dur ... ## on mais init ffpt dans mymain.cpp FreeFem++-mpi.exe: ../nw/sansrgraph.o ../mpi/parallelempi.o ../lglib/mymain.o $(LIBS_FFmpi) $(MPICXX) $(GCCNOCYGWIN) libff.dll $^ -o $@ -lcomdlg32 $(MPI_LIB) bamg.exe: libff.dll $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) ../bamg/bamg.o -Wl,--enable-auto-import $^ -o $@ cvmsh2.exe: $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) -Wl,--enable-auto-import ../bamg/cvmsh2.o $^ -o $@ drawbdmesh.exe:../std/Pcrgraph.o ../bamg/drawbdmesh.o $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) -mwindows -Wl,--enable-auto-import $^ -o $@ launchff++.exe:launchff++.cpp $(CXX) $(GCCNOCYGWIN) launchff++.cpp -o launchff++.exe ff-c++:../../examples++-load/load.link.in ../../config.status --file=ff-c++:$< chmod a+x ff-c++ install-exec-local:: install-exec-local--$(WIN32DLLTARGET) install-exec-local--win32-dll-target:: $(INSTALL_SCRIPT) launchff++.exe FreeFem++.exe FreeFem++-nw.exe bamg.exe cvmsh2.exe ff-c++ $(MPIPROG) $(DESTDIR)${bindir} $(INSTALL_SCRIPT) *.dll $(DESTDIR)${bindir} install-exec-local--:: # FFCS: create a separate DLL for ffapi so that it can be changed when running FreeFem++ or FFCS # NO dll not all function of ffapi are callback def in ffapi::init() # and alloctae in gggg.cpp and Global.cpp #FreeFem++-api.dll:../nw/ffapi.o # $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $< -o $@ # FF mpi : create a separate DLL for ffapi so that it can be changed when running FreeFem++ or FreeFem++-mpi #FreeFem++-mpi-api.dll:../mpi/ffapi.o # $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $< -o $@ $(MPI_LIB) # FFCS: automake does not clean the exes automatically because they are not built automatically. clean-local:: -rm *.exe freefem++-3.38-1/src/bin-win32/Makefile.in000644 000767 000024 00000051702 12543260337 020162 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/bin-win32 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = launchff++.cpp LDADD2 = $(ARPACKLIBS) $(UMFPACKLIBS) $(BLASLIBS) $(G2CLIB) # remark the libff.dll was splited in 6 because ld trap # to much routine => memory fault in ld # but now I see thant the couple allocation/delete # must be make in same .dll file under windows # is impossible to manage with the template generation # so one .dll (this work with gcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)) # change the entry points mymain to mainff # to be compatibile with bamg. # FF_OBJ0 = CodeAlloc.o AFunction2.o CheckPtr.o lex.o global.o environment.o load.o FF_OBJ_AC = array_complex.o FF_OBJ_AR = array_real.o FF_OBJ_AL = array_long.o FF_OBJ1 = AFunction.o InitFunct.o strversionnumber.o mt19937ar.o string_def.o FF_OBJ2 = BamgFreeFem.o Drawing.o Element_P2h.o Element_RT.o FESpace.o FQuadTree.o InitFunct.o Mesh2.o MeshDraw.o MeshGeom.o MeshQuad.o MeshRead.o MeshWrite.o Meshio.o Metric.o QuadTree.o QuadratureFormular.o R2.o SetOfE4.o eigenvalue.o fem.o gibbs.o lgalgo.o lgfem.o lgmat.o lgmesh.o mshptg.o problem.o DefColor.o lgmesh3.o P012_2d.o P012_3d.o FESpacen.o ../libMesh/chrono.o ../libMesh/libmesh3.o ../libMesh/memory.o ../libMesh/eigenv.o ../libMesh/libmesh5.o Mesh1dn.o Mesh2dn.o Mesh3dn.o GQuadTree.o glumesh2D.o UMFPack_Solver.o splitsimplex.o P1IsoValue.o FF_OBJIDE = FreeFem___cs-cs.o FreeFem___cs-commands.o FreeFem___cs-draw.o FreeFem___cs-strversionnumber.o FreeFem___cs-socket.o FreeFem___cs-threads.o FreeFem___cs-hl_yacc.o FreeFem___cs-hl_lex.o FreeFem___cs-highlight.o FreeFem___cs-spawn.o FreeFem___cs-editor.o FreeFem___cs-server.o windres.o FFD_OBJ0 = $(patsubst %.o,../fflib/%.o,$(FF_OBJ0)) FFD_OBJ_AC = $(patsubst %.o,../fflib/%.o,$(FF_OBJ_AC)) FFD_OBJ_AL = $(patsubst %.o,../fflib/%.o,$(FF_OBJ_AL)) FFD_OBJ_AR = $(patsubst %.o,../fflib/%.o,$(FF_OBJ_AR)) FFD_OBJ1 = $(patsubst %.o,../fflib/%.o,$(FF_OBJ1)) FFD_OBJ2 = $(patsubst %.o,../fflib/%.o,$(FF_OBJ2)) FFD_OBJIDE = $(patsubst %.o,../ide/%.o,$(FF_OBJIDE)) FFD_OBJLMSH = $(patsubst %.o,../ide/%.o,$(FF_OBJLMSH)) LIBS_FF = ../nw/ffapi.o libff.dll LIBS_FFmpi = ../mpi/ffapi.o libff.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin-win32/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin-win32/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \ uninstall uninstall-am .PRECIOUS: Makefile all-local: $(WIN32DLLTARGET) -for i in $(LDADD2) ; do case $$i in *.dll) echo cp -p $$i .; cp -p $$i . ;; esac ; done echo done win32-dll-target: FreeFem++.exe FreeFem++-nw.exe bamg.exe cvmsh2.exe launchff++.exe ff-c++ $(MPIPROG) echo "on a fini" libff.dll: $(FFD_OBJ0) $(FFD_OBJ_AR) $(FFD_OBJ_AC) $(FFD_OBJ_AL) $(FFD_OBJ1) $(FFD_OBJ2) ../lglib/lg.tab.o $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $^ -o $@ $(LDADD2) FreeFem++-nw.exe: ../nw/sansrgraph.o ../nw/parallelempi-empty.o ../lglib/mymain.o $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) libff.dll $^ -o $@ -lcomdlg32 FreeFem++.exe: ../nw/sansrgraph.o ../nw/parallelempi-empty.o ../lglib/mymain.o $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) libff.dll $^ -o $@ -lcomdlg32 FreeFem++-mpi.exe: ../nw/sansrgraph.o ../mpi/parallelempi.o ../lglib/mymain.o $(LIBS_FFmpi) $(MPICXX) $(GCCNOCYGWIN) libff.dll $^ -o $@ -lcomdlg32 $(MPI_LIB) bamg.exe: libff.dll $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) ../bamg/bamg.o -Wl,--enable-auto-import $^ -o $@ cvmsh2.exe: $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) -Wl,--enable-auto-import ../bamg/cvmsh2.o $^ -o $@ drawbdmesh.exe:../std/Pcrgraph.o ../bamg/drawbdmesh.o $(LIBS_FF) $(CXX) $(GCCNOCYGWIN) -mwindows -Wl,--enable-auto-import $^ -o $@ launchff++.exe:launchff++.cpp $(CXX) $(GCCNOCYGWIN) launchff++.cpp -o launchff++.exe ff-c++:../../examples++-load/load.link.in ../../config.status --file=ff-c++:$< chmod a+x ff-c++ install-exec-local:: install-exec-local--$(WIN32DLLTARGET) install-exec-local--win32-dll-target:: $(INSTALL_SCRIPT) launchff++.exe FreeFem++.exe FreeFem++-nw.exe bamg.exe cvmsh2.exe ff-c++ $(MPIPROG) $(DESTDIR)${bindir} $(INSTALL_SCRIPT) *.dll $(DESTDIR)${bindir} install-exec-local--:: # FFCS: create a separate DLL for ffapi so that it can be changed when running FreeFem++ or FFCS # NO dll not all function of ffapi are callback def in ffapi::init() # and alloctae in gggg.cpp and Global.cpp #FreeFem++-api.dll:../nw/ffapi.o # $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $< -o $@ # FF mpi : create a separate DLL for ffapi so that it can be changed when running FreeFem++ or FreeFem++-mpi #FreeFem++-mpi-api.dll:../mpi/ffapi.o # $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $< -o $@ $(MPI_LIB) # FFCS: automake does not clean the exes automatically because they are not built automatically. clean-local:: -rm *.exe # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/bamglib/Makefile.am000644 000767 000024 00000000746 12465110456 020037 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # This is not compiled as a separate library because its # interconnections with other libraries have not been solved. EXTRA_DIST=Mesh2.cpp Mesh2.h MeshDraw.cpp MeshGeom.cpp Meshgibbs.cpp \ Meshio.cpp Meshio.h MeshQuad.cpp MeshRead.cpp meshtype.h MeshWrite.cpp \ Metric.cpp Metric.h QuadTree.cpp QuadTree.h R2.cpp R2.h SetOfE4.cpp \ SetOfE4.h write_hdf5.cpp write_hdf5.hpp write_xdmf.cpp write_xdmf.hpp freefem++-3.38-1/src/bamglib/Makefile.in000644 000767 000024 00000041635 12543260337 020053 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # This is not compiled as a separate library because its # interconnections with other libraries have not been solved. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/bamglib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Mesh2.cpp Mesh2.h MeshDraw.cpp MeshGeom.cpp Meshgibbs.cpp \ Meshio.cpp Meshio.h MeshQuad.cpp MeshRead.cpp meshtype.h MeshWrite.cpp \ Metric.cpp Metric.h QuadTree.cpp QuadTree.h R2.cpp R2.h SetOfE4.cpp \ SetOfE4.h write_hdf5.cpp write_hdf5.hpp write_xdmf.cpp write_xdmf.hpp all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bamglib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bamglib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/bamglib/Mesh2.cpp000644 000767 000024 00000444356 12514211102 017457 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef __MWERKS__ #ifdef __INTEL__ //#pragma global_optimizer off //#pragma inline_depth(0) //#pragma optimization_level 2 #endif //#pragma inline_depth 0 #endif extern bool withrgraphique; #include #include #include #include #include using namespace std; #include "Mesh2.h" #include "QuadTree.h" #include "SetOfE4.h" namespace bamg { #ifdef DEBUG1 extern int SHOW ; // for debugging int SHOW = 0; // for debugging #endif int Triangles::counter = 0; Triangles * CurrentTh =0; int hinterpole=1; long NbUnSwap =0; int ForDebugging = 0; const Direction NoDirOfSearch = Direction(); #ifndef NDEBUG inline void MyAssert(int i,char*ex,char * file,long line) { if( i) { cerr << "Error Assert:" << ex << " in " << file << " line: " << line << endl; #ifdef NOTFREEFEM exit(1); #else throw(ErrorExec("exit",1000)); #endif } } #endif Int4 AGoodNumberPrimeWith(Int4 n) { const Int4 BigPrimeNumber[] ={ 567890359L, 567890431L, 567890437L, 567890461L, 567890471L, 567890483L, 567890489L, 567890497L, 567890507L, 567890591L, 567890599L, 567890621L, 567890629L , 0}; Int4 o = 0; Int4 pi = BigPrimeNumber[1]; for (int i=0; BigPrimeNumber[i]; i++) { Int4 r = BigPrimeNumber[i] % n; Int4 oo = Min(Min(r,n-r),Min(Abs(n-2*r),Abs(n-3*r))); if ( o < oo) o=oo,pi=BigPrimeNumber[i];} // cout << " AGoodNumberPrimeWith " << n << " " <Number(ta) << "::" << CurrentTh->Number(ta.ns[0]) << "," << CurrentTh->Number(ta.ns[1]) << "," << CurrentTh->Number(ta.ns[2]) << "," << "{" << CurrentTh->Number(ta.at[0]) << " " << ta.aa[0] << "} " << "{" << CurrentTh->Number(ta.at[1]) << " " << ta.aa[1] << "} " << "{" << CurrentTh->Number(ta.at[2]) << " " << ta.aa[2] << "} " << "]" ; else f << "[" << ta.ns[0] << "," << ta.ns[1] << "," << ta.ns[2] << "," << "{" << ta.at[0] << " " << ta.aa[0] << "} " << "{" << ta.at[1] << " " << ta.aa[1] << "} " << "{" << ta.at[2] << " " << ta.aa[2] << "} " << "]" ; return f;} void swap(Triangle *t1,Int1 a1, Triangle *t2,Int1 a2, Vertex *s1,Vertex *s2,Icoor2 det1,Icoor2 det2) { // swap // -------------------------------------------------------------- // Int1 a2=aa[a];// les 2 numero de l arete dans les 2 triangles // // sb sb // / | \ / \ ! // as1/ | \ /a2 \ ! // / | \ / t2 \ ! // s1 /t1 | t2 \s2 --> s1 /___as2___\s2 ! // \ a1|a2 / \ as1 / // \ | / \ t1 / // \ | / as2 \ a1/ // \ | / \ / // sa sa // ------------------------------------------------------------- int as1 = NextEdge[a1]; int as2 = NextEdge[a2]; int ap1 = PreviousEdge[a1]; int ap2 = PreviousEdge[a2]; #ifdef DRAWING1 couleur(0); t1->Draw(); t2->Draw(); #endif #ifdef DEBUG1 t1->check(); t2->check(); #endif (*t1)(VerticesOfTriangularEdge[a1][1]) = s2 ; // avant sb (*t2)(VerticesOfTriangularEdge[a2][1]) = s1 ; // avant sa // mise a jour des 2 adjacences externes TriangleAdjacent taas1 = t1->Adj(as1), taas2 = t2->Adj(as2), tas1(t1,as1), tas2(t2,as2), ta1(t1,a1),ta2(t2,a2); #ifdef DEBUG assert( ! ta1.Locked()); assert( ! ta2.Locked()); #endif // externe haut gauche taas1.SetAdj2(ta2, taas1.GetAllFlag_UnSwap()); // externe bas droite taas2.SetAdj2(ta1, taas2.GetAllFlag_UnSwap()); // remove the Mark UnMarkSwap t1->SetUnMarkUnSwap(ap1); t2->SetUnMarkUnSwap(ap2); // interne tas1.SetAdj2(tas2); t1->det = det1; t2->det = det2; t1->SetTriangleContainingTheVertex(); t2->SetTriangleContainingTheVertex(); #ifdef DEBUG1 t1->check(); t2->check(); #endif #ifdef DRAWING1 couleur(1); t1->Draw(); t2->Draw(); #endif #ifdef DRAWING1 if( CurrentTh) CurrentTh->inquire(); #endif } // end swap Int4 FindTriangle(Triangles &Th, Real8 x, Real8 y, double* a,int & inside) { CurrentTh=&Th; assert(&Th); I2 I = Th.toI2(R2(Min(Max(Th.pmin.x,x),Th.pmax.x),Min(Max(Th.pmin.y,y),Th.pmax.y))); Icoor2 dete[3]; Triangle & tb = *Th.FindTriangleContening(I,dete); if (tb.link) { // internal point in a true triangles a[0]= (Real8) dete[0]/ tb.det; a[1]= (Real8) dete[1] / tb.det; a[2] = (Real8) dete[2] / tb.det; inside = 1; return Th.Number(tb); } else { inside = 0; double aa,bb; TriangleAdjacent ta=CloseBoundaryEdgeV2(I,&tb,aa,bb); int k = ta; Triangle * tc = ta; if (!tc->link) { ta = ta.Adj(); tc=ta; k = ta; Exchange(aa,bb); assert(tc->link); } a[VerticesOfTriangularEdge[k][0]] = aa; a[VerticesOfTriangularEdge[k][1]] = bb; a[OppositeVertex[k]] = 1- aa -bb; return Th.Number(tc); } } TriangleAdjacent CloseBoundaryEdge(I2 A,Triangle *t, double &a,double &b) { // // cout << " - "; int k=(*t)(0) ? (( (*t)(1) ? ( (*t)(2) ? -1 : 2) : 1 )) : 0; int dir=0; assert(k>=0); int kkk=0; Icoor2 IJ_IA,IJ_AJ; TriangleAdjacent edge(t,OppositeEdge[k]); for (;;edge = dir >0 ? Next(Adj(Next(edge))) : Previous(Adj(Previous(edge)))) { assert(kkk++<1000); Vertex &vI = *edge.EdgeVertex(0); Vertex &vJ = *edge.EdgeVertex(1); I2 I=vI, J=vJ, IJ= J-I; IJ_IA = (IJ ,(A-I)); // cout << A << vI.i << vJ.i << edge << " " << IJ_IA << " dir " << dir <0) {a=1;b=0;return edge;}// change of signe => I else {dir=-1; continue;}};// go in direction i IJ_AJ = (IJ ,(J-A)); if (IJ_AJ<0) { if(dir<0) {a=0;b=1;return edge;} else {dir = 1; continue;}}// go in direction j double IJ2 = IJ_IA + IJ_AJ; assert(IJ2); a= IJ_AJ/IJ2; b= IJ_IA/IJ2; // cout<< "CloseBoundaryEdge a = " << a << " b= " << b << endl; return edge; } } TriangleAdjacent Triangle::FindBoundaryEdge(int i) const { // turn around the vertex ns[i] also call s #ifdef DEBUG Vertex * s = ns[i]; #endif Triangle *t = (Triangle *) this , *ttc; int k=0,j = EdgesVertexTriangle[i][0],jc; int exterieur = !link ; do { int exterieurp = exterieur; k++; #ifdef DEBUG assert( s == & (*t)[VerticesOfTriangularEdge[j][1]] ); #endif ttc = t->at[j]; exterieur = !ttc->link; if (exterieur+exterieurp == 1) return TriangleAdjacent(t,j); jc = NextEdge[t->aa[j]&3]; t = ttc; j = NextEdge[jc]; assert(k<2000); } while ( (this!= t)); return TriangleAdjacent(0,0); } TriangleAdjacent CloseBoundaryEdgeV2(I2 C,Triangle *t, double &a,double &b) { // walk around the vertex // version 2 for remove the probleme if we fill the hole //int bug=1; // Triangle *torigine = t; // restart: // int dir=0; assert(t->link == 0); // to have a starting edges // try the 3 edge bourna-- in case of internal hole // and choice the best // // // the probleme is in case of the fine and long internal hole // for exemple neart the training edge of a wing // Vertex * s=0,*s1=0, *s0=0; Icoor2 imax = MaxICoor22; Icoor2 l0 = imax,l1 = imax; double dd2 = imax;// infinity TriangleAdjacent er; int cas=-2; for (int j=0;j<3;j++) { TriangleAdjacent ta=t->FindBoundaryEdge(j); if (! (Triangle *) ta) continue; s0 = ta.EdgeVertex(0); s1 = ta.EdgeVertex(1); I2 A = * s0; I2 B = *ta.EdgeVertex(1); I2 AB = B-A,AC=C-A,BC=B-C; Icoor2 ACAC = (AC,AC), BCBC = (BC,BC); Icoor2 AB2 = Norme2_2(AB); // ||AB||^2 Icoor2 ABAC = (AB,AC); // AB.AC| double d2; if ( ABAC < 0 ) // DIST A { if ( (d2=(double) ACAC) < dd2) { // cout << " A " << d2 << " " << dd2; er = ta; l0 = ACAC; l1 = BCBC; cas = 0; s = s0; } } else if (ABAC > AB2) // DIST B { if ( (d2=(double) BCBC) < dd2) { // cout << " B " << d2 << " " << dd2; dd2 = d2; er = Adj(ta); // other direction l0 = BCBC; l1 = ACAC; cas = 1; s = s1; } } else // DIST AB { double det_2 = (double) Det(AB,AC); det_2 *= det_2; // square of area*2 of triangle ABC d2 = det_2/ (double) AB2; // hauteur^2 in C of of triangle ABC // cout << " AB " << d2 << " " << dd2 // << " " << CurrentTh->Number(ta.EdgeVertex(0)) // << " " << CurrentTh->Number(ta.EdgeVertex(1)) << " " ; if (d2 < dd2) { dd2 = d2; er = ta; l0 = (AC,AC); l1 = (BC,BC); s = 0; cas = -1; // cout << " ABAC " << ABAC << " ABAC " << ABAC // << " AB2 " << AB2 << endl; b = ((double) ABAC/(double) AB2); a = 1 - b; } } } assert(cas !=-2); // l1 = ||C s1|| , l0 = ||C s0|| // where s0,s1 are the vertex of the edge er if ( s) { t=er; TriangleAdjacent edge(er); int kkk=0; int linkp = t->link == 0; Triangle * tt=t=edge=Adj(Previous(edge)); // cout << CurrentTh->Number(t) << " " << linkp << endl; do { // loop around vertex s assert(edge.EdgeVertex(0)==s && kkk++<10000); int link = tt->link == 0; // cout << CurrentTh->Number(tt) << " " << link << " " << CurrentTh->Number(s) // << " " << CurrentTh->Number(er.EdgeVertex(0)) // << " " << CurrentTh->Number(er.EdgeVertex(1)) // << " " << CurrentTh->Number(edge.EdgeVertex(0)) // << " " << CurrentTh->Number(edge.EdgeVertex(1)) // << endl; if ((link + linkp) == 1) { // a boundary edge Vertex * st = edge.EdgeVertex(1); I2 I=*st; Icoor2 ll = Norme2_2 (C-I); if (ll < l1) { // the other vertex is neart s1=st; l1=ll; er = edge; if(llNumber(er.EdgeVertex(0)) // << " " << CurrentTh->Number(er.EdgeVertex(1)) ; if (aa<0) a=1,b=0; else if(bb<0) a=0,b=1; else { a = bb/(aa+bb); b = aa/(aa+bb); } } // cout <<" return= " << CurrentTh->Number(er.EdgeVertex(0)) << " " // << CurrentTh->Number(er.EdgeVertex(1)) << " " << a // << " " << b <<" " << l0 << " " <det <0) { // outside double ba,bb; TriangleAdjacent edge= CloseBoundaryEdge(a,t,ba,bb) ; return Metric(ba,*edge.EdgeVertex(0),bb,*edge.EdgeVertex(1));} else { // inside Real8 aa[3]; Real8 s = deta[0]+deta[1]+deta[2]; aa[0]=deta[0]/s; aa[1]=deta[1]/s; aa[2]=deta[2]/s; return Metric(aa,(*t)[0],(*t)[1],(*t)[2]); } } void ListofIntersectionTriangles::SplitEdge(const Triangles & Bh, const R2 &A,const R2 &B,int nbegin) { // SplitEdge // if(SHOW) cout << " splitedge " << A << B << " " << nbegin << endl; Triangle *tbegin, *t; Icoor2 deta[3], deti,detj; Real8 ba[3]; int nbt =0,ifirst=-1,ilast; int i0,i1,i2; int ocut,i,j,k=-1; // int OnAVertices =0; Icoor2 dt[3]; I2 a = Bh.toI2(A) ,b= Bh.toI2(B);// compute the Icoor a,b I2 vi,vj; int iedge =-1;// not a edge if(nbegin) {// optimisation // we suppose knowing the starting triangle t=tbegin=lIntTria[ilast=(Size-1)].t; if (tbegin->det>=0) ifirst = ilast;} else {// not optimisation init(); t=tbegin = Bh.FindTriangleContening(a,deta); // if(SHOW) cout <det<< " " << Real8(deta[1])/t->det // << " " << Real8(deta[2])/t->det << endl; if( t->det>=0) ilast=NewItem(t,Real8(deta[0])/t->det,Real8(deta[1])/t->det,Real8(deta[2])/t->det); else {// find the nearest boundary edge of the vertex A // find a edge or such normal projection a the edge IJ is on the edge // <=> IJ.IA >=0 && IJ.AJ >=0 ilast=ifirst; double ba,bb; TriangleAdjacent edge=CloseBoundaryEdge(a,t,ba,bb); Vertex & v0 = *edge.EdgeVertex(0), & v1 = *edge.EdgeVertex(1); NewItem(A,Metric(ba,v0,bb,v1)); t=edge; // test if the point b is in the same side if (det(v0.i,v1.i,b)>=0) { //cout << " All the edge " << A << B << endl; TriangleAdjacent edge=CloseBoundaryEdge(a,t,ba,bb); Vertex & v0 = *edge.EdgeVertex(0), & v1 = *edge.EdgeVertex(1); NewItem(A,Metric(ba,v0,bb,v1)); return; } } // find the nearest boundary edge of the vertex A } // end not optimisation if (t->det<0) { // outside departure while (t->det <0) { // intersection boundary edge and a,b, k=(*t)(0) ? (( (*t)(1) ? ( (*t)(2) ? -1 : 2) : 1 )) : 0; assert(k>=0); ocut = OppositeEdge[k]; i=VerticesOfTriangularEdge[ocut][0]; j=VerticesOfTriangularEdge[ocut][1]; vi=(*t)[i]; vj=(*t)[j]; deti = bamg::det(a,b,vi); detj = bamg::det(a,b,vj); // if(SHOW) { penthickness(3); // Move(vi);Line(vj);CurrentTh->inquire();penthickness(1); // cout << Bh.Number(tbegin) << " " << Bh.Number(t) << " i= " << i <<" j= " << j << " k=" << k // << " deti= " << deti << " detj= " << detj // << " v = " << Bh.Number((*t)[i]) << (*t)[i].r << " " << Bh.Number((*t)[j]) << (*t)[j].r << endl;} if (deti>0) // go to i direction on gamma ocut = PreviousEdge[ocut]; else if (detj<=0) // go to j direction on gamma ocut = NextEdge[ocut]; TriangleAdjacent tadj =t->Adj(ocut); t = tadj; iedge= tadj; if (t == tbegin) { // double ba,bb; if (verbosity>7) cout << " SplitEdge: All the edge " << A << B << nbegin << det(vi,vj,b) << " deti= " << deti << " detj=" <Draw(); if (iedge < 0) { i0 =0;i1=1;i2=2; dt[0] =bamg::det(a,b,(*t)[0]); dt[1] =bamg::det(a,b,(*t)[1]); dt[2] =bamg::det(a,b,(*t)[2]);} else { i2 = iedge; i0 = NextEdge[i2]; i1 = NextEdge[i0]; dt[VerticesOfTriangularEdge[iedge][0]] = detj;// we revert i,j because dt[VerticesOfTriangularEdge[iedge][1]] = deti;// we take the Triangle by the other side dt[iedge] = det(a,b,(*t)[OppositeVertex[iedge]]);} // so we have just to see the transition from - to + of the det0..2 on edge of t // because we are going from a to b if ((dt[i=VerticesOfTriangularEdge[i0][0]] < 0) && ( dt[j=VerticesOfTriangularEdge[i0][1]] > 0)) ocut =i0; else if ((dt[i=VerticesOfTriangularEdge[i1][0]] < 0) && (dt[j=VerticesOfTriangularEdge[i1][1]] > 0)) ocut =i1; else if ((dt[i=VerticesOfTriangularEdge[i2][0]] < 0) && (dt[j=VerticesOfTriangularEdge[i2][1]] > 0)) ocut =i2; else if ((dt[i=VerticesOfTriangularEdge[i0][0]] == 0) && ( dt[j=VerticesOfTriangularEdge[i0][1]] > 0)) ocut =i0; else if ((dt[i=VerticesOfTriangularEdge[i1][0]] == 0) && (dt[j=VerticesOfTriangularEdge[i1][1]] > 0)) ocut =i1; else if ((dt[i=VerticesOfTriangularEdge[i2][0]] == 0) && (dt[j=VerticesOfTriangularEdge[i2][1]] > 0)) ocut =i2; else if ((dt[i=VerticesOfTriangularEdge[i0][0]] < 0) && ( dt[j=VerticesOfTriangularEdge[i0][1]] == 0)) ocut =i0; else if ((dt[i=VerticesOfTriangularEdge[i1][0]] < 0) && (dt[j=VerticesOfTriangularEdge[i1][1]] == 0)) ocut =i1; else if ((dt[i=VerticesOfTriangularEdge[i2][0]] < 0) && (dt[j=VerticesOfTriangularEdge[i2][1]] == 0)) ocut =i2; else { // On a edge (2 zero) k =0; if (dt[0]) ocut=0,k++; if (dt[1]) ocut=1,k++; if (dt[2]) ocut=2,k++; if(k == 1) { if (dt[ocut] >0) // triangle upper AB ocut = NextEdge[ocut]; i= VerticesOfTriangularEdge[ocut][0]; j= VerticesOfTriangularEdge[ocut][1]; } else { cerr << " Bug Split Edge " << endl; cerr << " dt[0]= " << dt[0] << " dt[1]= " << dt[1] << " dt[2]= "<< dt[2] << endl; cerr << i0 << " " << i1 << " " << i2 << endl; cerr << " A = " << A << " B= " << B << endl; cerr << " Triangle t = " << *t << endl; cerr << (*t)[0] << (*t)[1] << (*t)[0] << endl; cerr << " nbt = " << nbt << endl; MeshError(100);}} k = OppositeVertex[ocut]; Icoor2 detbij = bamg::det((*t)[i],(*t)[j],b); if (detbij >= 0) { //we find the triangle contening b dt[0]=bamg::det((*t)[1],(*t)[2],b); dt[1]=bamg::det((*t)[2],(*t)[0],b); dt[2]=bamg::det((*t)[0],(*t)[1],b); #ifdef DEBUG assert(dt[0] >= 0); assert(dt[1] >= 0); assert(dt[2] >= 0); #endif Real8 dd = t->det; NewItem(t,dt[0]/dd,dt[1]/dd,dt[2]/dd); return ;} else { // next triangle by adjacent by edge ocut deti = dt[i]; detj = dt[j]; Real4 dij = detj-deti; ba[i] = detj/dij; ba[j] = -deti/dij; ba[3-i-j ] = 0; ilast=NewItem(t, ba[0],ba[1],ba[2]); TriangleAdjacent ta =t->Adj(ocut); t = ta; iedge= ta; if (t->det <= 0) { double ba,bb; TriangleAdjacent edge=CloseBoundaryEdge(b,t,ba,bb); NewItem(B,Metric(ba,*edge.EdgeVertex(0),bb,*edge.EdgeVertex(1))); // cout << " return " << ba << " " << bb << endl; // ajoute le 03 frev 1997 par F. hecht return; } }// we go outside of omega } // for(;;) } // routine SplitEdge int ListofIntersectionTriangles::NewItem(Triangle * tt,Real8 d0,Real8 d1,Real8 d2) { int n; R2 x(0,0); if ( d0) x = (*tt)[0].r * d0; if ( d1) x = x + (*tt)[1].r * d1; if ( d2) x = x + (*tt)[2].r * d2; // newer add same point if(!Size || Norme2_2(lIntTria[Size-1].x-x)) { if (Size==MaxSize) ReShape(); lIntTria[Size].t=tt; lIntTria[Size].bary[0]=d0; lIntTria[Size].bary[1]=d1; lIntTria[Size].bary[2]=d2; lIntTria[Size].x = x; Metric m0,m1,m2; Vertex * v; if ((v=(*tt)(0))) m0 = v->m; if ((v=(*tt)(1))) m1 = v->m; if ((v=(*tt)(2))) m2 = v->m; lIntTria[Size].m = Metric(lIntTria[Size].bary,m0,m1,m2); #ifdef DEBUG1 if(SHOW) { cout << "SHOW ++ NewItem =" << Size << x ; cout << " " << d0 << " " << d1 << " " << d2 <0); // computation of the length R2 C; Metric Mx,My; int ii,jj; R2 x,y,xy; SegInterpolation *SegI=lSegsI; SegI=lSegsI; lSegsI[NbSeg].last=Size;// improvement int EndSeg=Size; y = lIntTria[0].x; Real8 sxy, s = 0; lIntTria[0].s =0; SegI->lBegin=s; for (jj=0,ii=1;iilEnd=s, SegI++, EndSeg=SegI->last, SegI->lBegin=s; // cout << ii << " " << jj << x<< y <lEnd=s; // cout << " len= " << s << endl; return s; } Int4 ListofIntersectionTriangles::NewPoints(Vertex * vertices,Int4 & nbv,Int4 nbvx) { const Int4 nbvold = nbv; Real8 s = Length(); if (s < 1.5 ) return 0; ////////////////////// int ii = 1 ; R2 y,x; Metric My,Mx ; Real8 sx =0,sy; int nbi = Max(2,(int) (s+0.5)); Real8 sint = s/nbi; Real8 si = sint; int EndSeg=Size; SegInterpolation *SegI=0; if (NbSeg) SegI=lSegsI,EndSeg=SegI->last; for (int k=1;klast; int ii1=ii-1; x =lIntTria[ii1].x; sx =lIntTria[ii1].s; Metric Mx=lIntTria[ii1].m; #ifdef DEBUG double lx = lIntTria[ii-1].sn; #endif y =lIntTria[ii].x; sy =lIntTria[ii].s; Metric My=lIntTria[ii].m; #ifdef DEBUG double ly =lIntTria[ii].sp; assert( sx <= si); assert( si <= sy); assert( sy != sx); #endif Real8 lxy = sy-sx; Real8 cy = abscisseInterpole(Mx,My,y-x,(si-sx)/lxy); R2 C; Real8 cx = 1-cy; C = SegI ? SegI->F(si): x * cx + y *cy; si += sint; if ( nbv1) { R2 AB = vertices[nbv-2].r - vertices[nbv-1].r ; Real8 dp = LengthInterpole(vertices[nbv-2].m,vertices[nbv-1].m,AB); if (dp > 1.6) { cerr << "PB calcul new Int. points trop loin l=" << dp << " v=" << nbv-1 << " " << nbv-2 <0 et detsb <0 // attention la routine echange pva et pvb if(tt1.Locked()) return 0; // frontiere croise TriangleAdjacent tt2 = Adj(tt1); Triangle *t1=tt1,*t2=tt2;// les 2 triangles adjacent Int1 a1=tt1,a2=tt2;// les 2 numero de l arete dans les 2 triangles assert ( a1 >= 0 && a1 < 3 ); Vertex & sa= (* t1)[VerticesOfTriangularEdge[a1][0]]; Vertex & s1= (*t1)[OppositeVertex[a1]]; Vertex & s2= (*t2)[OppositeVertex[a2]]; Icoor2 dets2 = det(*pva,*pvb,s2); #ifdef DEBUG Vertex & sb= (*t1)[VerticesOfTriangularEdge[a1][1]]; Icoor2 wdets1 = det(*pva,*pvb,s1); Icoor2 wdetsa = det(*pva,*pvb,sa); Icoor2 wdetsb = det(*pva,*pvb,sb); assert(wdets1 == dets1); assert(wdetsa == detsa); assert(wdetsb == detsb); #endif Icoor2 det1=t1->det , det2=t2->det ; #ifdef DEBUG assert(det1>0 && det2 >0); Icoor2 ddet1 = det((*t1)[0],(*t1)[1],(*t1)[2]); Icoor2 ddet2 = det((*t2)[0],(*t2)[1],(*t2)[2]); if ((det1 != ddet1) || (det2 != ddet2) ) { assert(det1 == ddet1); assert(det2 == ddet2); } Icoor2 detvasasb = det(*pva,sa,sb); Icoor2 detvbsasb = det(*pvb,sa,sb); if ( CurrentTh && ! ( ( (detvasasb <= 0) && (detvbsasb >= 0)) || ( (detvasasb >= 0) && (detvbsasb <= 0)))) { cout << " detvasasb =" << detvasasb << "detvbsasb = " << detvbsasb << " " << pva << " " << pvb << " " <Draw(); penthickness(10); pva->MoveTo();pvb->LineTo(); penthickness(1); CurrentTh->inquire(); #endif } assert( ( (detvasasb <= 0) && (detvbsasb >= 0)) || ( (detvasasb >= 0) && (detvbsasb <= 0))); #endif Icoor2 detT = det1+det2; assert((det1>0 ) && (det2 > 0)); assert ( (detsa < 0) && (detsb >0) ); // [a,b] cut infinite line va,bb Icoor2 ndet1 = bamg::det(s1,sa,s2); Icoor2 ndet2 = detT - ndet1; int ToSwap =0; //pas de swap if ((ndet1 >0) && (ndet2 >0)) { // on peut swaper if ((dets1 <=0 && dets2 <=0) || (dets2 >=0 && detsb >=0)) ToSwap =1; else // swap alleatoire if (BinaryRand()) ToSwap =2; } #ifdef DEBUG if (ForDebugging) { cerr << "swap = " << ToSwap << " ndet1 " << ndet1 << ", ndet2 " << ndet2 << "det1 " << det1 << " det2 " << det2 << " if1 = " << ((ndet1 >0) && (ndet2 >0)) << " if2 = " << ((dets1 <=0 && dets2 <=0) || (dets2 >=0 && detsb >=0)) << endl; #ifdef DRAWING couleur(0); t1->Draw(); t2->Draw(); #endif } #endif if (ToSwap) NbSwap++, bamg::swap(t1,a1,t2,a2,&s1,&s2,ndet1,ndet2); #ifdef DEBUG if (ForDebugging) { #ifdef DRAWING couleur(4); t1->Draw(); t2->Draw(); rattente(1); #endif } #endif int ret=1; if (dets2 < 0) {// haut dets1 = ToSwap ? dets1 : detsa ; detsa = dets2; tt1 = Previous(tt2) ;} else if (dets2 > 0){// bas dets1 = ToSwap ? dets1 : detsb ; detsb = dets2; //xxxx tt1 = ToSwap ? tt1 : Next(tt2); if(!ToSwap) tt1 = Next(tt2); } else { // changement de sens if (ForDebugging) cout << "changement de sens" << endl; ret = -1; Exchange(pva,pvb); Exchange(detsa,detsb); Exchange(dets1,dets2); Exchange(tt1,tt2); dets1=-dets1; dets2=-dets2; detsa=-detsa; detsb=-detsb; if (ToSwap) { if (dets2 < 0) {// haut dets1 = (ToSwap ? dets1 : detsa) ; detsa = dets2; tt1 = Previous(tt2) ;} else if (dets2 > 0){// bas dets1 = (ToSwap ? dets1 : detsb) ; detsb = dets2; if(!ToSwap) tt1 = Next(tt2); } else {// on a fin ??? tt1 = Next(tt2); ret =0;} } } return ret; } int ForceEdge(Vertex &a, Vertex & b,TriangleAdjacent & taret) { #ifdef DEBUG restart: // for debug #endif int NbSwap =0; assert(a.t && b.t); // the 2 vertex is in a mesh int k=0; taret=TriangleAdjacent(0,0); // erreur TriangleAdjacent tta(a.t,EdgesVertexTriangle[a.vint][0]); Vertex *v1, *v2 = tta.EdgeVertex(0),*vbegin =v2; // we turn around a in the direct sens Icoor2 det2 = v2 ? det(*v2,a,b): -1 , det1; if(v2) // normal case det2 = det(*v2,a,b); else { // no chance infini vertex try the next tta= Previous(Adj(tta)); v2 = tta.EdgeVertex(0); vbegin =v2; assert(v2); det2 = det(*v2,a,b); // cout << " No Change try the next" << endl; } #ifdef DRAWING1 a.MoveTo();b.LineTo(); #endif while (v2 != &b) { TriangleAdjacent tc = Previous(Adj(tta)); v1 = v2; v2 = tc.EdgeVertex(0); det1 = det2; #ifdef DEBUG assert( v1 == tta.EdgeVertex(0)); assert( &a == tc.EdgeVertex(1) ); #endif det2 = v2 ? det(*v2,a,b): det2; if((det1 < 0) && (det2 >0)) { // try to force the edge Vertex * va = &a, *vb = &b; tc = Previous(tc); assert ( v1 && v2); Icoor2 detss = 0,l=0,ks; // cout << "Real ForcingEdge " << *va << *vb << detss << endl; #ifdef DEBUG Icoor2 dettt1 = det(*v1,a,b); Icoor2 dettt2 = det(*v2,a,b); if (!(dettt1==det1 && dettt2==det2)) { assert(ForDebugging==0); ForDebugging=1; goto restart; } #endif while ((ks=SwapForForcingEdge( va, vb, tc, detss, det1,det2,NbSwap))) if(l++ > 10000000) { cerr << " Loop in forcing Egde AB" <<"\n vertex A " << a <<"\n vertex B " << b <<"\n nb de swap " << NbSwap <<"\n nb of try swap too big = " << l << " gearter than " << 1000000 << endl; if ( CurrentTh ) cerr << " vertex number " << CurrentTh->Number(a) << " " << CurrentTh->Number(b) << endl; #ifdef DEBUG ForDebugging = 1; #endif #ifdef DRAWING1 if ( CurrentTh ) { reffecran(); couleur(6); CurrentTh->Draw(); couleur(1); penthickness(10); a.MoveTo();b.LineTo(); penthickness(1); CurrentTh->inquire(); couleur(6); l=0; reffecran(); while (ks=SwapForForcingEdge( va, vb, tc, detss, det1,det2,NbSwap) && (l++ < 1000)) cerr << " " << CurrentTh->Number(tc.EdgeVertex(0))<<" " <Number(tc.EdgeVertex(1)) << " "; } #endif MeshError(990); } Vertex *aa = tc.EdgeVertex(0), *bb = tc.EdgeVertex(1); if ((( aa == &a ) && (bb == &b)) || ((bb == &a ) && (aa == &b))) { tc.SetLock(); a.Optim(1,0); b.Optim(1,0); taret = tc; return NbSwap; } else { taret = tc; return -2; // error boundary is crossing /* cerr << "Fatal Error boundary is crossing "; if(CurrentTh) { cerr << " edge: [" << CurrentTh->Number(a) << ", " << CurrentTh->Number(b) << " ] and [ "; cerr << CurrentTh->Number(aa) << " " << CurrentTh->Number(bb) << " ] " << endl; } MeshError(991); */ } } tta = tc; assert(k++<2000); if ( vbegin == v2 ) return -1;// error } tta.SetLock(); taret=tta; a.Optim(1,0); b.Optim(1,0); return NbSwap; } int Triangle::swap(Int2 a,int koption){ #ifdef DEBUG if(a &4 ) return 0;// arete lock int munswap1 = a/4; a &=3; #else if(a/4 !=0) return 0;// arete lock or MarkUnSwap #endif Triangle *t1=this,*t2=at[a];// les 2 triangles adjacent Int1 a1=a,a2=aa[a];// les 2 numero de l arete dans les 2 triangles #ifdef DEBUG if(a2 & 4) return 0; // arete lock int munswap2 = a2/4; a2 &= 3; #else if(a2/4 !=0) return 0; // arete lock or MarkUnSwap #endif Vertex *sa=t1->ns[VerticesOfTriangularEdge[a1][0]]; Vertex *sb=t1->ns[VerticesOfTriangularEdge[a1][1]]; Vertex *s1=t1->ns[OppositeVertex[a1]]; Vertex *s2=t2->ns[OppositeVertex[a2]]; #ifdef DEBUG assert ( a >= 0 && a < 3 ); #endif Icoor2 det1=t1->det , det2=t2->det ; Icoor2 detT = det1+det2; Icoor2 detA = Abs(det1) + Abs(det2); Icoor2 detMin = Min(det1,det2); int OnSwap = 0; // si 2 triangle infini (bord) => detT = -2; if (sa == 0) {// les deux triangles sont frontieres det2=bamg::det(s2->i,sb->i,s1->i); OnSwap = det2 >0;} else if (sb == 0) { // les deux triangles sont frontieres det1=bamg::det(s1->i,sa->i,s2->i); OnSwap = det1 >0;} else if(( s1 != 0) && (s2 != 0) ) { det1 = bamg::det(s1->i,sa->i,s2->i); det2 = detT - det1; OnSwap = (Abs(det1) + Abs(det2)) < detA; Icoor2 detMinNew=Min(det1,det2); // if (detMin<0 && (Abs(det1) + Abs(det2) == detA)) OnSwap=BinaryRand();// just for test if (! OnSwap &&(detMinNew>0)) { OnSwap = detMin ==0; if (! OnSwap) { int kopt = koption; while (1) if(kopt) { // critere de Delaunay pure isotrope Icoor2 xb1 = sb->i.x - s1->i.x, x21 = s2->i.x - s1->i.x, yb1 = sb->i.y - s1->i.y, y21 = s2->i.y - s1->i.y, xba = sb->i.x - sa->i.x, x2a = s2->i.x - sa->i.x, yba = sb->i.y - sa->i.y, y2a = s2->i.y - sa->i.y; double cosb12 = double(xb1*x21 + yb1*y21), cosba2 = double(xba*x2a + yba*y2a) , sinb12 = double(det2), sinba2 = double(t2->det); // angle b12 > angle ba2 => cotg(angle b12) < cotg(angle ba2) OnSwap = ((double) cosb12 * (double) sinba2) < ((double) cosba2 * (double) sinb12); // if(CurrentTh) // cout << "swap " << CurrentTh->Number(sa) << " " << CurrentTh->Number(sb) << " " ; // cout << cosb12 << " " << sinba2 << " " << cosba2 << " " << sinb12 // << " Onswap = " << OnSwap << endl; break; } else { // critere de Delaunay anisotrope Real8 som; I2 AB=(I2) *sb - (I2) *sa; I2 MAB2=((I2) *sb + (I2) *sa); R2 MAB(MAB2.x*0.5,MAB2.y*0.5); I2 A1=(I2) *s1 - (I2) *sa; I2 D = (I2) * s1 - (I2) * sb ; R2 S2(s2->i.x,s2->i.y); R2 S1(s1->i.x,s1->i.y); { Metric M=s1->m; R2 ABo = M.Orthogonal(AB); R2 A1o = M.Orthogonal(A1); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 if (Abs(d) > dd*1.e-3) { R2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); som = M(C - S2)/M(C - S1); } else {kopt=1;continue;} } { Metric M=s2->m; R2 ABo = M.Orthogonal(AB); R2 A1o = M.Orthogonal(A1); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 if(Abs(d) > dd*1.e-3) { R2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); som += M(C - S2)/M(C - S1); } else {kopt=1;continue;} } OnSwap = som < 2; break; } } // OnSwap } // (! OnSwap &&(det1 > 0) && (det2 > 0) ) } #ifdef DEBUG1 if (OnSwap && ( munswap1 || munswap2)) { cout << " erreur Mark unswap T " << CurrentTh->Number(t1) << " " << CurrentTh->Number(t2) << endl << *t1 << endl << *t2 << endl; return 0; } #endif if( OnSwap ) bamg::swap(t1,a1,t2,a2,s1,s2,det1,det2); else { NbUnSwap ++; t1->SetMarkUnSwap(a1); } return OnSwap; } Real8 Vertex::Smoothing(Triangles & Th,const Triangles & BTh,Triangle * & tstart ,Real8 omega) { #ifdef DEBUG Int4 NbSwap =0; #endif Vertex * s = this; Vertex &vP = *s,vPsave=vP; // if (vP.on) return 0;// Don't move boundary vertex Triangle * tbegin= t , *tria = t , *ttc; int k=0,kk=0,j = EdgesVertexTriangle[vint][0],jc; R2 P(s->r),PNew(0,0); // cout << BTh.quadtree << " " << BTh.quadtree->root << endl; // assert(BTh.quadtree && BTh.quadtree->root); do { k++; #ifdef DEBUG assert( s == & (*tria)[VerticesOfTriangularEdge[j][1]] ); assert( tria->det >0); #endif if (!tria->Hidden(j)) { Vertex &vQ = (*tria)[VerticesOfTriangularEdge[j][0]]; R2 Q = vQ,QP(P-Q); Real8 lQP = LengthInterpole(vP,vQ,QP); PNew += Q+QP/Max(lQP,1e-20); kk ++; } ttc = tria->TriangleAdj(j); jc = NextEdge[tria->NuEdgeTriangleAdj(j)]; tria = ttc; j = NextEdge[jc]; assert(k<2000); } while ( tbegin != tria); if (kk<4) return 0; PNew = PNew/(Real8)kk; R2 Xmove((PNew-P)*omega); PNew = P+Xmove; Real8 delta=Norme2_2(Xmove); // Icoor2 deta[3]; I2 IBTh = BTh.toI2(PNew); tstart=BTh.FindTriangleContening(IBTh,deta,tstart); if (tstart->det <0) { // outside double ba,bb; TriangleAdjacent edge= CloseBoundaryEdge(IBTh,tstart,ba,bb) ; tstart = edge; vP.m= Metric(ba,*edge.EdgeVertex(0),bb,*edge.EdgeVertex(1)); } else { // inside Real8 aa[3]; Real8 s = deta[0]+deta[1]+deta[2]; aa[0]=deta[0]/s; aa[1]=deta[1]/s; aa[2]=deta[2]/s; vP.m = Metric(aa,(*tstart)[0],(*tstart)[1],(*tstart)[2]); } // recompute the det of the triangle vP.r = PNew; vP.i = Th.toI2(PNew); Vertex vPnew = vP; int ok=1; int loop=1; k=0; while (ok) { ok =0; do { k++; double detold = tria->det; tria->det = bamg::det( (*tria)[0],(*tria)[1] ,(*tria)[2]); if (loop) { Vertex *v0,*v1,*v2,*v3; if (tria->det<0) ok =1; else if (tria->Quadrangle(v0,v1,v2,v3)) { vP = vPsave; Real8 qold =QuadQuality(*v0,*v1,*v2,*v3); vP = vPnew; Real8 qnew = QuadQuality(*v0,*v1,*v2,*v3); if (qnewdet < detold/2 ) ok=1; } tria->SetUnMarkUnSwap(0); tria->SetUnMarkUnSwap(1); tria->SetUnMarkUnSwap(2); ttc = tria->TriangleAdj(j); jc = NextEdge[tria->NuEdgeTriangleAdj(j)]; tria = ttc; j = NextEdge[jc]; assert(k<2000); } while ( tbegin != tria); if (ok && loop) vP=vPsave; // no move loop=0; } return delta; } void Triangles::Add( Vertex & s,Triangle * t, Icoor2 * det3) { // ------------------------------------------- // s2 // ! // /|\ ! // / | \ ! // / | \ ! // tt1 / | \ tt0 ! // / |s \ ! // / . \ ! // / . ` \ ! // / . ` \ ! // ---------------- ! // s0 tt2 s1 //-------------------------------------------- Triangle * tt[3]; // the 3 new Triangles Vertex *ps0 = (* t)(0), *ps1=(* t)(1), *ps2=(* t)(2); Vertex &s0 = *ps0, &s1=*ps1, &s2=*ps2 ; Icoor2 det3local[3]; int infv = t->infv(); //&s0 ? (( &s1 ? ( &s2 ? -1 : 2) : 1 )) : 0; // infv = ordre of the infini vertex (null) int nbd0 =0; // number of zero det3 int izerodet=-1,iedge; // izerodet = egde contening the vertex s Icoor2 detOld = t->det; if ( (( infv <0 ) && (detOld <0)) || (( infv >=0 ) && (detOld >0)) ) { cerr << " infv " << infv << " det = " << detOld << endl; cerr << Number(s) << " "<< Number(s0) << " " << Number(s1) << " " << Number(s2) << endl; MeshError(3); } // if det3 do not exist then constuct det3 if (!det3) { det3 = det3local; // alloc if ( infv<0 ) { det3[0]=bamg::det(s ,s1,s2); det3[1]=bamg::det(s0,s ,s2); det3[2]=bamg::det(s0,s1,s );} else { // one of &s1 &s2 &s0 is NULL so (&si || &sj) <=> !&sk det3[0]= ps0 ? -1 : bamg::det(s ,s1,s2) ; det3[1]= ps1 ? -1 : bamg::det(s0,s ,s2) ; det3[2]= ps2 ? -1 : bamg::det(s0,s1,s ) ;}} if (!det3[0]) izerodet=0,nbd0++; if (!det3[1]) izerodet=1,nbd0++; if (!det3[2]) izerodet=2,nbd0++; if (nbd0 >0 ) // point s on a egde or on a vertex { if (nbd0 == 1) { iedge = OppositeEdge[izerodet]; TriangleAdjacent ta = t->Adj(iedge); #ifdef DEBUG1 cout << " the point " << Number(s) << " is the edge " << izerodet << " of " << Number(t) << " det3 = " << det3[0] << " " << det3[1] << " " << det3[2] << " " << endl; cout << " ta = " << ta << "ta->det =" << ((Triangle*) ta)->det << " "<< t->det<< endl; #endif // the point is on the edge // if the point is one the boundary // add the point in outside part if ( t->det >=0) { // inside triangle if ((( Triangle *) ta)->det < 0 ) { // add in outside triangle Add(s,( Triangle *) ta); return;} }} else { cerr << " bug " << nbd0 <SetUnMarkUnSwap(0); t->SetUnMarkUnSwap(1); t->SetUnMarkUnSwap(2); tt[0]= t; tt[1]= &triangles[nbt++]; tt[2]= &triangles[nbt++]; if (nbt>nbtx) { cerr << " No enougth triangles " << endl; MeshError(999,this); } *tt[1]= *tt[2]= *t; // gestion of the link tt[0]->link=tt[1]; tt[1]->link=tt[2]; (* tt[0])(OppositeVertex[0])=&s; (* tt[1])(OppositeVertex[1])=&s; (* tt[2])(OppositeVertex[2])=&s; tt[0]->det=det3[0]; tt[1]->det=det3[1]; tt[2]->det=det3[2]; // update adj des triangles externe tt[0]->SetAdjAdj(0); tt[1]->SetAdjAdj(1); tt[2]->SetAdjAdj(2); // update des adj des 3 triangle interne const int i0 = 0; const int i1= NextEdge[i0]; const int i2 = PreviousEdge[i0]; tt[i0]->SetAdj2(i2,tt[i2],i0); tt[i1]->SetAdj2(i0,tt[i0],i1); tt[i2]->SetAdj2(i1,tt[i1],i2); tt[0]->SetTriangleContainingTheVertex(); tt[1]->SetTriangleContainingTheVertex(); tt[2]->SetTriangleContainingTheVertex(); // swap if the point s is on a edge if(izerodet>=0) { // cout << " the point s is on a edge =>swap " << iedge << " " << *tt[izerodet] << endl; int rswap =tt[izerodet]->swap(iedge); if (!rswap) { cout << " Pb swap the point s is on a edge =>swap " << iedge << " " << *tt[izerodet] << endl; #ifdef DRAWING if( CurrentTh && withrgraphique) { reffecran(); DrawMark(s.r); CurrentTh->inquire(); DrawMark(s.r); rattente(1); } #endif } assert(rswap); } #ifdef DEBUG tt[0]->check(); tt[1]->check(); tt[2]->check(); #endif #ifdef DRAWING1 tt[0]->Draw(); tt[1]->Draw(); tt[2]->Draw(); #endif } Int4 Triangles::SplitInternalEdgeWithBorderVertices() { Int4 NbSplitEdge=0; SetVertexFieldOn(); Int4 it; Int4 nbvold=nbv; for (it=0;it7) cout <<" Internal edge with two vertices on boundary" << Number(v0) << " " << Number(v1) << " by " << endl; } } } } ReMakeTriangleContainingTheVertex(); if (nbvold!=nbv) { Int4 iv = nbvold; Int4 NbSwap = 0; Icoor2 dete[3]; for (Int4 i=nbvold;iToClose(vi,seuil,hi,hj)) { // a good new point vi.ReferenceNumber=0; vi.DirOfSearch =NoDirOfSearch; // cout << " Add " << Number(vi) << " " << vi // << " " << Number(vi) << " <--> " << Number(vi) <link) { cout << i << " PB insert point " << Number(vi) << vi << Number(vi) << " tcvi = " << tcvi << " " << tcvi->link << endl; cout << (*tcvi)[1] << (*tcvi)[2] << endl; tcvi = FindTriangleContening(vi.i,dete); cout << (*tcvi)[1] << (*tcvi)[2] << endl; #ifdef DRAWING1 inquire(); penthickness(5); DrawMark(vi.r); penthickness(1); inquire(); #endif MeshError(1001,this); } quadtree->Add(vi); #ifdef DRAWING1 DrawMark(vi.r); #endif assert (tcvi && tcvi->det >= 0) ;// internal Add(vi,tcvi,dete); NbSwap += vi.Optim(1); iv++; // } } if (verbosity>3) { cout << " Nb Of New Point " << iv ; cout << " Nb swap = " << NbSwap << " to split internal edges with border vertices" ;} nbv = iv; } if (NbSplitEdge > nbv-nbvold) { cout << " Warning not enough vertices to split all internal edges " << endl << " we lost " << NbSplitEdge - ( nbv-nbvold) << " Edges Sorry " << endl; warning = 2; } if (verbosity>2) cout << "SplitInternalEdgeWithBorderVertices: Number of splited edge " << NbSplitEdge << endl; return NbSplitEdge; } Int4 Triangles::InsertNewPoints(Int4 nbvold,Int4 & NbTSwap) { Real8 seuil= 1.414/2 ;// for two close point Int4 i; // insertion part --- const Int4 nbvnew = nbv-nbvold; if (verbosity>5) cout << " Try to Insert the " <ReferenceNumber=i; } // be carefull Int4 iv = nbvold; for (i=nbvold;iToClose(vi,seuil,hi,hj)) { // a good new point Vertex & vj = vertices[iv]; Int4 j = vj.ReferenceNumber; assert( &vj== ordre[j]); if(i!=j) { // for valgring Exchange(vi,vj); Exchange(ordre[j],ordre[i]); } vj.ReferenceNumber=0; // cout << " Add " << Number(vj) << " " << vj // << " " << Number(vi) << " <--> " << Number(vj) <link) { cerr << i << " PB insert point " << Number(vj) << vj << Number(vi) << " tcvj = " << tcvj << " " << tcvj->link << endl; cerr << (*tcvj)[1] << (*tcvj)[2] << endl; tcvj = FindTriangleContening(vj.i,dete); cout << (*tcvj)[1] << (*tcvj)[2] << endl; #ifdef DRAWING1 inquire(); penthickness(5); DrawMark(vj.r); penthickness(1); inquire(); #endif MeshError(1001,this); } quadtree->Add(vj); #ifdef DRAWING1 DrawMark(vj.r); #endif assert (tcvj && tcvj->det >= 0) ;// internal Add(vj,tcvj,dete); NbSwap += vj.Optim(1); iv++; } } if (verbosity>3) { cout << " Nb Of New Point " << iv << " Nb Of To close Points " << nbv-iv ; cout << " Nb swap = " << NbSwap << " after " ;} nbv = iv; } #ifdef DRAWING1 inquire(); #endif for (i=nbvold;i3) cout << " NbSwap = " << NbSwap << endl; NbTSwap += NbSwap ; #ifdef DEBUG { Int4 NbErr=0; Int4 i; for (i=0;i2) cout << " -- Triangles::NewPoints "; if (verbosity>3)cout << " nbv (in) on Boundary = " << nbv <2) cout << " (Nb of Points from background mesh = " << nbv-nbvold << " / " << nbv1-nbvold << ")" << endl; } else Bh.ReMakeTriangleContainingTheVertex(); Triangle *t; // generation of the list of next Triangle // at 1 time we test all the triangles Int4 Headt =0,next_t; for(i=0;i= nbt // the list of test triangle is // the next traingle on i is -first_np_or_next_t[i] int iter=0; // Big loop do { iter++; nbtold = nbt; nbvold = nbv; #ifdef DRAWING1 inquire(); #endif // default size of IntersectionTriangle i=Headt; next_t=-first_np_or_next_t[i]; for(t=&triangles[i];it, EdgesVertexTriangle[s->vint][1]); Triangle * tbegin= (Triangle*) ta; Int4 kt; do { kt = Number((Triangle*) ta); if (first_np_or_next_t[kt]>0) first_np_or_next_t[kt]=-Headt,Headt=kt; assert( ta.EdgeVertex(0) == s); ta = Next(Adj(ta)); } while ( (tbegin != (Triangle*) ta)); } } while (nbv!=nbvold); delete [] first_np_or_next_t; Int4 NbSwapf =0,NbSwp; // bofbof NbSwp = NbSwapf; for (i=0;i3) cout << " " ; if (verbosity>2) cout << " Nb Of Vertices =" << nbv << " Nb of triangles = " << nbt-NbOutT << " NbSwap final = " << NbSwapf << " Nb Total Of Swap = " << NbTSwap << endl; } void Triangles::NewPointsOld(Triangles & Bh) { // Triangles::NewPointsOld Real8 seuil= 0.7 ;// for two neart point if (verbosity>1) cout << " begin : Triangles::NewPointsOld " << endl; Int4 i,k; int j; Int4 BeginNewPoint[3]; Int4 EndNewPoint[3]; #ifdef TRACETRIANGLE Int4 trace=0; #endif int step[3]; Int4 *first_np_or_next_t = new Int4[nbtx]; Int4 ColorEdge[3]; Int4 color=-1; Triangle *t; // generation of the list of next Triangle // at 1 time we test all the triangles Int4 Headt =0,next_t; for(i=0;i= nbt // the list of test triangle is // the next Triangle on i is -first_np_or_next_t[i] Int4 nbtold,nbvold; // Big loop do { nbtold = nbt; nbvold = nbv; #ifdef DRAWING1 inquire(); #endif // default size of IntersectionTriangle i=Headt; next_t=-first_np_or_next_t[i]; for(t=&triangles[i];iLocked(j) ; } #endif if (!t->link) continue;// boundary if (t->det <0) continue; if (t->Locked(j)) continue; TriangleAdjacent tadjj = t->Adj(j); Triangle * ta= tadjj; if (ta->det <0) continue; R2 A = vA; R2 B = vB; k=Number(ta); // the 2 opposite vertices const Vertex & vC1 = *tj.OppositeVertex(); const Vertex & vC2 = *tadjj.OppositeVertex(); #ifdef TRACETRIANGLE trace = trace || k == TRACETRIANGLE; if(trace) { cout << "Test Arete " << i << " AB = " << A << B << "i " <link << " ta=" << Number( ta) << " det " <det ; cout << " hA = " <Locked(j) << endl; } #endif if(first_np_or_next_t[k]>0) { // this edge is done before // find the color of the edge and begin , end of newpoint int kk = t->NuEdgeTriangleAdj(j); assert ((*t)(VerticesOfTriangularEdge[j][0]) == (*ta)(VerticesOfTriangularEdge[kk][1])); assert ((*t)(VerticesOfTriangularEdge[j][1]) == (*ta)(VerticesOfTriangularEdge[kk][0])); Int4 kolor =3*k + kk; ColorEdge[j]=kolor; Int4 kkk= 1; step[j]=-1;// other sens BeginNewPoint[j]=0; EndNewPoint[j]=-1; // empty list for (Int4 iv=first_np_or_next_t[k];iv kolor) break; // the color is passed else if (vertices[iv].color == kolor) { EndNewPoint[j]=iv; if (kkk) // one time test kkk=0,BeginNewPoint[j]=iv;} continue; // next edge of the triangle } // end if( k < i) #ifdef DRAWING1 penthickness(2); Move(A);Line(B); penthickness(1); #endif const Int4 NbvOld = nbv; lIntTria.SplitEdge(Bh,A,B); // Int4 NbvNp = lIntTria.NewPoints(vertices,nbv,nbvx); Int4 nbvNew=nbv; nbv = NbvOld; for (Int4 iv=NbvOld;iv seuil) && ( (vC2.m(CC2) + vertices[nbv].m(CC2)) > seuil) ) nbv++; } EndNewPoint[j] = nbv-1; } // end loop for each edge #ifdef TRACETRIANGLE if(trace) { // verification des point cree cout << "\n ------------ " << t->link << " " << t->det << " b " << BeginNewPoint[0] << " " << BeginNewPoint[1] << " " << BeginNewPoint[2] << " " << " e " << EndNewPoint[0] << " " << EndNewPoint[1] << " " << EndNewPoint[2] << " " << " s " << step[0] << " " << step[1] << " " << step[2] << " " << endl; } #endif if (!t->link) continue;// boundary if (t->det<=0) continue;// outside // continue; for(int j0=0;j0<3;j0++) for (Int4 i0= BeginNewPoint[j0]; i0 <= EndNewPoint[j0];i0++) { // find the neart point one the opposite edge // to compute i1 Vertex & vi0 = vertices[i0]; int kstack = 0; Int4 stack[10]; // Int4 savRef[10]; int j1 = j0; while (j0 != (j1 = NextEdge[j1])) {//loop on the 2 other edge // computation of the intersection of edge j1 and DOrto // take the good sens if (BeginNewPoint[j1]> EndNewPoint[j1]) continue; // else if (EndNewPoint[j1] - BeginNewPoint[j1] <1) { for (Int4 ii1= BeginNewPoint[j1];ii1<=EndNewPoint[j1];ii1++) stack[kstack++] = ii1; continue;} int k0,k1; if (step[j1]<0) k0=1,k1=0; // reverse else k0=0,k1=1; R2 V10 = (R2)(*t)[VerticesOfTriangularEdge[j1][k0]]; R2 V11 = (R2)(*t)[VerticesOfTriangularEdge[j1][k1]]; R2 D = V11-V10; Real8 c0 = vi0.m(D,(R2) vi0); Real8 c10 = vi0.m(D,V10); Real8 c11 = vi0.m(D,V11); Real8 s; //cout << " --i0 = " << i0 << D << V10 << V11 << endl ; //cout << " c10 " << c10 << " c0 " << c0 << " c11 " << c11 << endl; if (( c10 < c0 ) && (c0 < c11)) s = (c11-c0)/(c11-c10); else if (( c11 < c0 ) && (c0 < c10)) s = (c11-c0) /(c11-c10); else break; R2 VP = V10*s + V11*(1-s); int sss = (c11-c10) >0 ? 1 : -1; #ifdef DRAWING1 penthickness(2); Move((R2) vi0); Line(VP); penthickness(1); #endif // find the 2 point by dichotomie //cout << " t =" << Number(t) << " c0 " << c0 ; Int4 ii0 = BeginNewPoint[j1]; Int4 ii1 = EndNewPoint[j1]; Real8 ciii=-1,cii0=-1,cii1=-1 ; if ( sss * ((cii0=vi0.m(D,(R2) vertices[ii0]))- c0) >0 ) stack[kstack++] = ii0;//cout << " add+0 " << ii0; else if ( sss * ((cii1= vi0.m(D ,(R2) vertices[ii1]))- c0) < 0 ) stack[kstack++] = ii1;//cout << " add+1 " << ii1; else { while ((ii1-ii0)> 1) { Int4 iii = (ii0+ii1)/2; ciii = vi0.m( D ,(R2) vertices[iii]); //cout << " (iii = " << iii << " " << ciii << ") "; if ( sss * (ciii - c0) <0 ) ii0 = iii; else ii1 = iii;} stack[kstack++] = ii0;// cout << " add0 " << ii0; if (ii1 != ii0) stack[kstack++] = ii1;//cout << " add1 " << ii1; } #ifdef DEBUG2 cout << "ii1 = " << ii1 << " ii0 = " << ii0 << endl; cout << " cccc = " << cii0 << " " << ciii << " " << cii1 << " sss=" << sss << endl; #endif if (kstack >5) // bug ? cout << "NewPoints: bug????? " << kstack << " stack " << stack[kstack]<< endl; } stack[kstack++] = -1; // to stop Int4 i1; kstack =0; while( (i1=stack[kstack++]) >= 0) { // the two parameter is i0 and i1 assert(i1 < nbv && i1 >= 0); assert(i0 < nbv && i0 >= 0); assert(i1 != i0); R2 v01 = (R2) vertices[i1]- (R2) vertices[i0]; Real8 d01 = (vertices[i0].m(v01) + vertices[i1].m(v01)); #ifdef DRAWING1 Move(vertices[i0].r); Line(vertices[i1].r); #endif #ifdef TRACETRIANGLE if(trace) { cout << "\n test j" << j <<" " << i0 << " " << i1 << " d01=" << d01 <= nbvold); assert (i1 >= nbvold); assert(i0 != i1); if (d01 == 0) break; if ( d01 < seuil) { if (i1=0) {// good points // cout <<" i = " << i ; for (ip=i;i != (ipp = vertices[ip].ReferenceNumber);ip=ipp) vertices[ip].ReferenceNumber = -1;// mark remove vertices[ip].ReferenceNumber = -1;// mark remove // cout << i << " ---> " << kkk << endl; vertices[kkk] = vertices[i]; vertices[kkk].i = toI2(vertices[kkk].r); #ifdef DRAWING1 DrawMark(vertices[kkk]); #endif vertices[kkk++].ReferenceNumber = 0; } #ifdef DRAWING1 penthickness(1); #endif // insertion part --- const Int4 nbvnew = kkk-nbvold; cout << " Remove " << nbv - kkk << " to close vertex " ; cout << " and Insert the " <i,dete); // Vertex * nv = quadtree->NearestVertex(vi->i.x,vi->i.y); // cout << " Neart Vertex of " << Number(vi)<< vi->i << " is " // << Number(nv) << nv->i << endl; // Int4 kt = Number(tcvi); // quadtree->Add(*vi); // #ifdef DRAWING1 DrawMark(vi->r); #endif assert (tcvi->det >= 0) ;// internal Add(*vi,tcvi,dete),NbSwap += vi->Optim(1); } } cout << " Nb swap = " << NbSwap << " after " ; #ifdef DRAWING1 inquire(); #endif for (i=nbvold;it, EdgesVertexTriangle[s->vint][1]); Triangle * tbegin= (Triangle*) ta; Int4 kt; do { kt = Number((Triangle*) ta); if (first_np_or_next_t[kt]>0) first_np_or_next_t[kt]=-Headt,Headt=kt; assert( ta.EdgeVertex(0) == s); ta = Next(Adj(ta)); } while ( (tbegin != (Triangle*) ta)); } } while (nbv!=nbvold); delete [] first_np_or_next_t; #ifdef DEBUG int nberr=0; for (int it=0;iti, ordre[1]->i, ordre[i]->i ) == 0;) if ( ++i >= nbv) { cerr << " All the vertices are aline " << endl; MeshError(998,this); } // echange i et 2 dans ordre afin // que les 3 premiers ne soit pas aligne Exchange( ordre[2], ordre[i]); // on ajoute un point a l'infini pour construire le maillage // afin d'avoir une definition simple des aretes frontieres nbt = 2; // on construit un maillage trivale forme // d'une arete et de 2 triangles // construit avec le 2 aretes orientes et Vertex * v0=ordre[0], *v1=ordre[1]; triangles[0](0) = 0; // sommet pour infini triangles[0](1) = v0; triangles[0](2) = v1; triangles[1](0) = 0;// sommet pour infini triangles[1](2) = v0; triangles[1](1) = v1; const int e0 = OppositeEdge[0]; const int e1 = NextEdge[e0]; const int e2 = PreviousEdge[e0]; triangles[0].SetAdj2(e0, &triangles[1] ,e0); triangles[0].SetAdj2(e1, &triangles[1] ,e2); triangles[0].SetAdj2(e2, &triangles[1] ,e1); triangles[0].det = -1; // faux triangles triangles[1].det = -1; // faux triangles triangles[0].SetTriangleContainingTheVertex(); triangles[1].SetTriangleContainingTheVertex(); triangles[0].link=&triangles[1]; triangles[1].link=&triangles[0]; #ifdef DEBUG triangles[0].check(); triangles[1].check(); #endif // nbtf = 2; if ( !quadtree ) quadtree = new QuadTree(this,0); quadtree->Add(*v0); quadtree->Add(*v1); // on ajoute les sommets un un Int4 NbSwap=0; time1=CPUtime(); if (verbosity>3) cout << " -- Begin of insertion process " << endl; for (Int4 icount=2; icounti,dete); quadtree->Add(*vi); Add(*vi,tcvi,dete); NbSwap += vi->Optim(1,0); #ifdef DRAWING1 inquire(); #endif }// fin de boucle en icount time2=CPUtime(); if (verbosity>3) cout << " NbSwap of insertion " << NbSwap << " NbSwap/Nbv " << (float) NbSwap / (float) nbv << " NbUnSwap " << NbUnSwap << " Nb UnSwap/Nbv " << (float)NbUnSwap /(float) nbv <Optim(0,0); timeloop = CPUtime(); if (verbosity>3) cout << " Optim Loop "<4) cout << " init " << time1 - time0 << " initialisation, " << time2 - time1 << "s, insert point " << time3 -time2 << "s, optim " << endl << " Init Total Cpu Time = " << time3 - time0 << "s " << endl; #ifdef DRAWING1 inquire(); #endif CurrentTh=OldCurrentTh; } void Triangles::ForceBoundary() { if (verbosity > 2) cout << " -- ForceBoundary nb of edge " << nbe << endl; int k=0; Int4 nbfe=0,nbswp=0,Nbswap=0; for (Int4 t = 0; t < nbt; t++) if (!triangles[t].det) k++,cerr << " det T" << t << " = " << 0 << endl; if (k!=0) { cerr << " ther is " << k << " triangles of mes = 0 " << endl; MeshError(11,this);} TriangleAdjacent ta(0,0); for (Int4 i = 0; i < nbe; i++) { nbswp = ForceEdge(edges[i][0],edges[i][1],ta); if ( nbswp < 0) k++; else Nbswap += nbswp; if (nbswp) nbfe++; if ( nbswp < 0 && k < 5) { cerr << " Missing Edge " << i << " v0 = " << Number(edges[i][0]) << edges[i][0].r <<" v1= " << Number(edges[i][1]) << edges[i][1].r << " " << edges[i].on->Cracked() << " " << (Triangle *) ta ; if(ta.t) { Vertex *aa = ta.EdgeVertex(0), *bb = ta.EdgeVertex(1); cerr << " crossing with [" << Number(aa) << ", " << Number(bb) << "]\n"; } else cerr << endl; } if ( nbswp >=0 && edges[i].on->Cracked()) ta.SetCracked(); } if (k!=0) { cerr << " they is " << k << " lost edges " << endl; cerr << " The boundary is crossing may be!" << endl; MeshError(10,this); } for (Int4 j=0;j 3) cout << " Nb of inforced edge = " << nbfe << " Nb of Swap " << Nbswap << endl; } void Triangles::FindSubDomain(int OutSide=0) { //#define DRAWING1 if (verbosity >2) { if (OutSide) cout << " -- Find all external sub-domain "; else cout << " -- Find all internal sub-domain "; if(verbosity>99) { for(int i=0;i 4) cout << " OutSide=" << OutSide << endl; short * HeapArete = new short[nbt]; Triangle ** HeapTriangle = new Triangle* [nbt]; Triangle *t,*t1; Int4 k,it; for (Int4 itt=0;ittlink = t ; // sd forme d'un triangle cicular link #ifdef DRAWING1 t->Draw(NbSubDomTot-1); #endif HeapTriangle[i] =t ; HeapArete[i] = 3; while (i >= 0) // boucle sur la pile { while ( HeapArete[i]--) // boucle sur les 3 aretes { int na = HeapArete[i]; Triangle * tc = HeapTriangle[i]; // triangle courant if( ! tc->Locked(na)) // arete non frontiere { Triangle * ta = tc->TriangleAdj(na) ; // n triangle adjacent if (ta->link == 0 ) // non deja chainer => on enpile { i++; #ifdef DRAWING1 ta->Draw(NbSubDomTot-1); #endif ta->link = t->link ; // on chaine les triangles t->link = ta ; // d'un meme sous domaine HeapArete[i] = 3; // pour les 3 triangles adjacents HeapTriangle[i] = ta; }} } // deplie fin de boucle sur les 3 adjacences i--; } } } // supression de tous les sous domaine infini <=> contient le sommet NULL it =0; NbOutT = 0; while (itlink; t1->link=0;}//while (t) } } it++;} // end while (it All triangles are outside " << endl; MeshError(888,this); } delete [] HeapArete; delete [] HeapTriangle; if (OutSide|| !Gh.subdomains || !Gh.NbSubDomains ) { // No geom sub domain Int4 i; if (subdomains) delete [] subdomains; subdomains = new SubDomain[ NbSubDomTot]; NbSubDomains= NbSubDomTot; for ( i=0;ilink; mark[it]=k; #ifdef DRAWING1 t1->Draw(k); #endif subdomains[k].head = t1; // cout << " New -- " << Number(t1) << " " << it << endl; do {// cout << " k " << k << " " << Number(t) << endl; mark[Number(t)]=k; #ifdef DRAWING1 t->Draw(k); #endif t=t->link; } while (t!=t1); #ifdef DRAWING1 t1->Draw(k); #endif mark[it]=k++;} // else if(mark[it] == -2 ) triangles[it].Draw(999); it++;} // end white (it=0 && subdomains[kl].ref <0 && kr >=0 && subdomains[kr].ref>=0) nbk--,subdomains[kr].ref=subdomains[kl].ref-1; if (kr >=0 && subdomains[kr].ref <0 && kl >=0 && subdomains[kl].ref>=0) nbk--,subdomains[kl].ref=subdomains[kr].ref-1; if(kr<0 && kl >=0 && subdomains[kl].ref>=0) nbk--,subdomains[kl].ref=-1; if(kl<0 && kr >=0 && subdomains[kr].ref>=0) nbk--,subdomains[kr].ref=-1; // cout << " after \t " // << kl << subdomains[kl].ref << " rr " << kr // << subdomains[kr].ref << endl; } } // cout << subdomains[0].ref << subdomains[1].ref << endl; Int4 j=0; for ( i=0;ilink; t1->link=0;}//while (t) } if(verbosity>4) cout << " Number of remove sub domain (OutSideMesh) =" << NbSubDomains-j << endl; NbSubDomains=j; } delete [] mark; } else { // find the head for all sub domaine if (Gh.NbSubDomains != NbSubDomains && subdomains) delete [] subdomains, subdomains=0; if (! subdomains ) subdomains = new SubDomain[ Gh.NbSubDomains]; NbSubDomains =Gh.NbSubDomains; if(verbosity>4) cout << " find the " << NbSubDomains << " sub domain " << endl; Int4 err=0; ReMakeTriangleContainingTheVertex(); Int4 * mark = new Int4[nbt]; Edge **GeometricalEdgetoEdge = MakeGeometricalEdgeToEdge(); for (it=0;itt; int sens = Gh.subdomains[i].sens; // test if ge and e is in the same sens // cout << " geom edge = " << Gh.Number(eg) <<" @" << &eg << " ref = " << subdomains[i].ref // << " ref edge =" << eg.ref << " sens " << sens ; if (((eg[0].r-eg[1].r),(e[0].r-e[1].r))<0) sens = -sens ; subdomains[i].sens = sens; subdomains[i].edge = &e; // cout << " sens " << sens << " in geom " << eg[0].r << eg[1].r << " in mesh " << e[0].r << e[1].r << endl; // cout << " v0 , v1 = " << Number(v0) << " " << Number(v1) << endl; assert(t && sens); TriangleAdjacent ta(t,EdgesVertexTriangle[v0->vint][0]);// previous edges while (1) { assert( v0 == ta.EdgeVertex(1) ); // cout << " recherche " << Number( ta.EdgeVertex(0)) << endl; if (ta.EdgeVertex(0) == v1) { // ok we find the edge if (sens>0) subdomains[i].head=t=Adj(ta); else subdomains[i].head=t=ta; //cout << " triangle =" << Number(t) << " = " << (*t)[0].r << (*t)[1].r << (*t)[2].r << endl; if(t= triangles+nbt || t->det < 0 || t->link == 0) // Ajoute aout 200 { cerr << " Error in the def of sub domain "<=0) { if(verbosity>10) cerr << " Warning: the sub domain " << i << " ref = " << subdomains[i].ref << " is previouly defined with " <Draw(i); #endif mark[Number(tt)]=i; tt=tt->link; } while (tt!=t); if(verbosity>7) cout << " Nb de triangles dans le sous domaine " << i << " de ref " << subdomains[i].ref << " = " << kkk << endl; break;} ta = Previous(Adj(ta)); if(t == (Triangle *) ta) { err++; cerr << " Error in the def of sub domain " << i << " edge=" << Gh.Number(eg) << " " << sens << endl; break;} // cout << " NB of remove subdomain " << NbSubDomTot-NbSubDomains<< endl; } } if (err) MeshError(777,this); if (inew < NbSubDomains) { if (verbosity>5) cout << " Warning: We remove " << NbSubDomains-inew << " SubDomains " << endl; NbSubDomains=inew;} for (it=0;it 4) cout << " " ; if (verbosity> 2) cout << " Nb of Sub borned Domain = " << NbSubDomTot << " NbOutTriangles = " << NbOutT <=vertices && v < ve) VerticesOnGeomVertex[i].mv=vertices+renu[Number(v)]; } for (i=0;i< NbVerticesOnGeomEdge;i++) { Vertex *v =VerticesOnGeomEdge[i].mv; if (v>=vertices && v < ve) VerticesOnGeomEdge[i].mv=vertices+renu[Number(v)]; } for (i=0;i< NbVertexOnBThVertex;i++) { Vertex *v=VertexOnBThVertex[i].v; if (v>=vertices && v < ve) VertexOnBThVertex[i].v=vertices+renu[Number(v)]; } for (i=0;i< NbVertexOnBThEdge;i++) { Vertex *v=VertexOnBThEdge[i].v; if (v>=vertices && v < ve) VertexOnBThEdge[i].v=vertices+renu[Number(v)]; } // move the Vertices without a copy of the array // be carefull not trivial code Int4 j; for ( it=0;it= 0) // a new sub cycle { i=it; Vertex ti=vertices[i],tj; while ( (j=renu[i]) >= 0) { // i is old, and j is new renu[i] = -1-renu[i]; // mark tj = vertices[j]; // save new vertices[j]= ti; // new <- old i=j; // next ti = tj; } } if (quadtree) { delete quadtree; quadtree = new QuadTree(this); } for ( it=0;it=0 && kt < nbt ); assert(renu[kt]==-1); renu[kt]=k++; } while (t0 != (t=t->link)); } if (verbosity>9) cout << " number of inside triangles " << k << " nbt = " << nbt << endl; // take is same numbering if possible if(justcompress) for ( k=0,it=0;it=0 ) renu[it]=k++; // put the outside triangles at the end for ( it=0;it= 0) // a new sub cycle { i=it; Triangle ti=triangles[i],tj; while ( (j=renu[i]) >= 0) { // i is old, and j is new renu[i] = -1; // mark tj = triangles[j]; // save new triangles[j]= ti; // new <- old i=j; // next ti = tj; } } delete [] renu; nt = nbt - NbOutT; #ifdef DEBUG // verif for ( it=0;it=0 &&num < nbt); reft[num]=i; // cout << Number(t0) << " " <link)); } // NbOutT = nbt - k; if (verbosity>5) cout << " Nb of Sub Domain =" << NbSubDomains << " Nb of In Triangles " << k << " Nbt = " << nbt << " Out Triangles = " << nbt - k << endl; return k; } /* void Triangles::ConsLinkTriangle() { for (Int4 i=0;ilink) { Int4 color = t->color-1; assert(color=0); if (hst=subdomains[color].head) { t->link=hst->link; hst->link=t; } else { subdomains[color].head = t; t->link=t;}// circular link } } { for (Int4 i=0;iNearestVertex(i,j); } void Triangles::PreInit(Int4 inbvx,char *fname) { srand(19999999); OnDisk =0; NbRef=0; // allocGeometry=0; identity=0; NbOfTriangleSearchFind =0; NbOfSwapTriangle =0; nbiv=0; nbv=0; nbvx=inbvx; nbt=0; NbOfQuad = 0; nbtx=2*inbvx-2; NbSubDomains=0; NbVertexOnBThVertex=0; NbVertexOnBThEdge=0; VertexOnBThVertex=0; VertexOnBThEdge=0; NbCrackedVertices=0; NbCrackedEdges =0; CrackedEdges =0; nbe = 0; name = fname ; warning=0; if (inbvx) { vertices=new Vertex[nbvx]; assert(vertices); ordre=new Vertex* [nbvx]; assert(ordre); triangles=new Triangle[nbtx]; assert(triangles);} else { vertices=0; ordre=0; triangles=0; nbtx=0; } if ( name || inbvx) { time_t timer =time(0); char buf[70]; strftime(buf ,70,", Date: %y/%m/%d %H:%M %Ss",localtime(&timer)); counter++; char countbuf[30]; sprintf(countbuf,"%d",counter); int lg =0 ; if (&BTh != this && BTh.name) lg = strlen(BTh.name)+4; identity = new char[ lg + strlen(buf) + strlen(countbuf)+ 2 + 10 + ( Gh.name ? strlen(Gh.name) + 4 : 0)]; identity[0]=0; if (lg) strcat(strcat(strcat(identity,"B="),BTh.name),", "); if (Gh.name) strcat(strcat(identity,"G="),Gh.name); strcat(strcat(identity,";"),countbuf); strcat(identity,buf); // cout << "New MAILLAGE "<< identity << endl; } quadtree=0; // edgescomponante=0; edges=0; VerticesOnGeomVertex=0; VerticesOnGeomEdge=0; NbVerticesOnGeomVertex=0; NbVerticesOnGeomEdge=0; // nbMaxIntersectionTriangles=0; // lIntTria; subdomains=0; NbSubDomains=0; // Meshbegin = vertices; // Meshend = vertices + nbvx; if (verbosity>98) cout << "Triangles::PreInit() " << nbvx << " " << nbtx << " " << vertices << " " << ordre << " " << triangles <= nbvx) { cerr << " Too much vertices on geometry " << NbVerticesOnGeomVertex << " >= " << nbvx << endl; MeshError(1,this); } assert(vertices); for (i=0;i Th VerticesOnGeomVertex[nbv]= VertexOnGeom(vertices[nbv],Gh[i]); // cout << "--------- " <to);// use of Geom -> Th VertexOnBThVertex[NbVertexOnBThVertex++] = VertexOnVertex(gv->to,bv); gv->to->m = bv->m; // for taking the metrix of the background mesh ;} } assert(NbVertexOnBThVertex == NbVerticesOnGeomVertex); // new stuff FH with curve // find the begin of the curve in BTh { Gh.UnMarkEdges(); int bfind=0; /* cout << " nb curves = " << Gh.NbOfCurves << endl; for(int i=0;iMark() && ei[jedge].on->IsRequiredVertex() ) { */ // new code FH 2004 Real8 L=0; for (int icurve=0;icurveMark() can be change in // loop for(jedge=0;jedge<2;jedge++) // new curve // good the find a starting edge Real8 Lstep=0,Lcurve=0;// step between two points (phase==1) Int4 NbCreatePointOnCurve=0;// Nb of new points on curve (phase==1) // cout.precision(16); for(int phase=0;phase<=step;phase++) { for(Curve * curve= Gh.curves+icurve;curve;curve= curve->next) { int icurveequi= Gh.Number(curve); if( phase == 0 && icurveequi != icurve) continue; int k0=jedge,k1; Edge * pe= BTh.edges+iedge; //GeometricalEdge *ong = ei.on; int iedgeequi=bcurve[icurveequi]/2; int jedgeequi=bcurve[icurveequi]%2; int k0equi=jedgeequi,k1equi; Edge * peequi= BTh.edges+iedgeequi; GeometricalEdge *ongequi = peequi->on; Real8 sNew=Lstep;// abcisse of the new points (phase==1) L=0;// length of the curve Int4 i=0;// index of new points on the curve GeometricalVertex * GA0 = *(*peequi)[k0equi].on; Vertex *A0; A0 = GA0->to; // the vertex in new mesh Vertex *A1; VertexOnGeom *GA1; Edge * PreviousNewEdge = 0; // cout << " --------------New Curve phase " << phase // << "---------- A0=" << *A0 << ei[k0] <=0 && A0-vertices Required() ) { GeometricalVertex *GA1 = *(*peequi)[1-k0equi].on; A1 = GA1->to; // } else for(;;) { // assert(pe && BTh.Number(pe)>=0 && BTh.Number(pe)<=BTh.nbe); Edge &ee=*pe; Edge &eeequi=*peequi; k1 = 1-k0; // next vertex of the edge k1equi= 1 - k0equi; assert(pe && ee.on); ee.on->SetMark(); Vertex & v0=ee[0], & v1=ee[1]; R2 AB= (R2) v1 - (R2) v0; Real8 L0=L,LAB; LAB = LengthInterpole(v0.m,v1.m,AB); L+= LAB; if (phase) {// computation of the new points while ((i!=NbCreatePointOnCurve) && sNew <= L) { // cout << " L0= " << L0 << " L " << L << " sN=" // << sNew << " LAB=" << LAB << " NBPC =" <= L0); assert(LAB); assert(vertices && nbv=0 && se < 1.000000001); #ifdef DEBUG se = abscisseInterpole(v0.m,v1.m,AB,se); // because code \ref(xxx) #else se = abscisseInterpole(v0.m,v1.m,AB,se,1); #endif assert(se>=0 && se <= 1); //((k1==1) != (k1==k1equi)) se = k1 ? se : 1. - se; se = k1==k1equi ? se : 1. - se; VertexOnBThEdge[NbVerticesOnGeomEdge++] = VertexOnEdge(A1,&eeequi,se); // save ongequi = Gh.ProjectOnCurve(eeequi,se,*A1,*GA1); A1->ReferenceNumber = eeequi.ref; A1->DirOfSearch =NoDirOfSearch; //cout << icurveequi << " " << i << " " << *A1 << endl; e->on = ongequi; e->v[0]= A0; e->v[1]= A1; if(verbosity>99) cout << i << "+ New P "<< nbv-1 << " " <r <r - A0->r; Real8 dp = LengthInterpole(A0->m,A1->m,A1A0); if (dp > 1.4) { cerr << " PB new Points "<< nbv-1 ; cerr << " AB=" << LAB << " s=" << (sNew-L0)/LAB << " se= " ; cerr << se <<" B edge " << BTh.Number(ee) << " signe = " << k1 <CurveNumber==ei.on->CurveNumber); if(verbosity>98) cout << BTh.Number(ee) << " " << " on=" << *ee[k1].on << " "<< ee[k1].on->IsRequiredVertex() << endl; if ( ee[k1].on->IsRequiredVertex()) { assert(eeequi[k1equi].on->IsRequiredVertex()); GeometricalVertex * GA1 = *eeequi[k1equi].on; A1=GA1->to;// the vertex in new mesh assert (A1-vertices>=0 && A1-vertices " << icurveequi <<"-----" << NbCreatePointOnCurve << " == " <on = ongequi; e->v[0]= A0; e->v[1]= A1; e->ref = peequi->ref; e->adj[0]=PreviousNewEdge; e->adj[1]=0; if (PreviousNewEdge) PreviousNewEdge->adj[1] = e; PreviousNewEdge = e; // cout << "Last new edge " << nbe << " " << " on " << Gh.Number(pe->on) // << " of curve =" <on->CurveNumber <Draw(); A1->Draw(); A0->Draw(); // inquire(); #endif assert(i==NbCreatePointOnCurve); } } // end loop on equi curve if (!phase) { // Int4 NbSegOnCurve = Max((Int4)(L+0.5),(Int4) 1);// nb of seg Lstep = L/NbSegOnCurve; Lcurve = L; NbCreatePointOnCurve = NbSegOnCurve-1; for(Curve * curve= Gh.curves+icurve;curve;curve= curve->next) { NbOfNewEdge += NbSegOnCurve; NbOfNewPoints += NbCreatePointOnCurve; } if(verbosity>5) cout << icurve << " NbSegOnCurve = " << NbSegOnCurve << " Lstep=" << Lstep <<" " << NbOfNewPoints<< " NBPC= " << NbCreatePointOnCurve < nbvx) { cerr << " Too much vertices on geometry " << nbv+NbOfNewPoints << " >= " << nbvx << endl; MeshError(3,this); } //cout << " NbOfNewEdge" << NbOfNewEdge << " NbOfNewPoints " << NbOfNewPoints << endl; edges = new Edge[NbOfNewEdge]; nbex = NbOfNewEdge; if(NbOfNewPoints) { // VerticesOnGeomEdge = new VertexOnGeom[NbOfNewPoints]; NbVertexOnBThEdge =NbOfNewPoints; VertexOnBThEdge = new VertexOnEdge[NbOfNewPoints]; NbVerticesOnGeomEdgex = NbOfNewPoints; } NbOfNewPoints =0; NbOfNewEdge = 0; } } // for(step;;) assert(nbe); delete [] bcurve; #ifdef DRAWING1 reffecran(); InitDraw(); Draw(); inquire(); #endif Insert(); ForceBoundary(); FindSubDomain(); #ifdef DRAWING1 reffecran(); Draw(); inquire(); #endif // NewPointsOld(*this) ; // BTh.ReMakeTriangleContainingTheVertex(); // FH change => put in NewPoints // for (Int4 iv=0;iv= nbvx) { cerr << " Too much vertices on geometry " << NbVerticesOnGeomVertex << " >= " << nbvx << endl; MeshError(1,this); } for (i=0;i Th VerticesOnGeomVertex[nbv]= VertexOnGeom(*Gh[i].to,Gh[i]); // cout << "--------- " <10) cout << " GeomToTriangles0: init nbv : " << nbv << endl; // assert( Gh.nbv < nbvx); // Method in 2 step: 0 and 1 // 1) compute de nb of edge // 2) construct the edge // generation of the curves assert(! edges); #ifdef DRAWING1 reffecran(); #endif // 2 step // --step=0 to compute the number of edges + alloc at end // --step=1 to construct the edges for (int step=0;step<2;step++) {// for (int step=0;step<2;step++) Int4 nbex = 0; nbe = 0; Int4 NbVerticesOnGeomEdge0=NbVerticesOnGeomEdge; // cout << " -------------- step =" << step << endl; Gh.UnMarkEdges(); NbOfCurves = 0; for (i=0;iThe(); AB = b->r - a->r; Metric MA = background ? BTh.MetricAt(a->r) :a->m ; Metric MB = background ? BTh.MetricAt(b->r) :b->m ; Real8 ledge = (MA(AB) + MB(AB))/2; // const int MaxSubEdge = 10; int NbSubEdge = 1; Real8 lSubEdge[MaxSubEdge]; R2 A,B; if (ledge < 1.5) lSubEdge[0] = ledge; else { NbSubEdge = Min( MaxSubEdge, (int) (ledge +0.5)); A= a->r; Metric MAs =MA,MBs; // cout << " lSubEdge old=" << ledge // << " new " << A << MA << endl; ledge = 0; Real8 x =0, xstep= 1. / NbSubEdge; for (int kk=0; kk < NbSubEdge; kk++,A=B,MAs=MBs ) { x += xstep; B = e->F(k ? x : 1-x); MBs= background ? BTh.MetricAt(B) :Metric(1-x, MA, x ,MB); AB = A-B; lSubEdge[kk]= (ledge += (MAs(AB)+MBs(AB))/2); // cout << " " << lSubEdge[kk] << " x " << x // << " " << A << B << MA << MB<< endl ; } // cout << endl; } Real8 lcurveb = lcurve+ ledge ; while (lcurve<=s && s <= lcurveb && nbv < nbvend) { // New points // Real8 aa=(lcurveb-s)/ledge; // Real8 bb=(s-lcurve)/ledge; Real8 ss = s-lcurve; // 1) find the SubEdge containing ss by dichotomie int kk0=-1,kk1=NbSubEdge-1,kkk; Real8 ll0=0,ll1=ledge,llk; while (kk1-kk0>1) { if (ss < (llk=lSubEdge[kkk=(kk0+kk1)/2])) kk1=kkk,ll1=llk; else kk0=kkk,ll0=llk;} assert(kk1 != kk0); Real8 sbb = (ss-ll0 )/(ll1-ll0); Real8 bb = (kk1+sbb)/NbSubEdge, aa=1-bb; // new vertex on edge vb = &vertices[nbv++]; vb->m = Metric(aa,a->m,bb,b->m); vb->ReferenceNumber = e->ref; vb->DirOfSearch =NoDirOfSearch; Real8 abcisse = k ? bb : aa; vb->r = e->F( abcisse ); VerticesOnGeomEdge[NbVerticesOnGeomEdge++]= VertexOnGeom(*vb,*e,abcisse); // to take in account the sens of the edge s += lstep; edges[nbe].v[0]=va; edges[nbe].v[1]=vb; edges[nbe].ref = e->ref; edges[nbe].on = e; edges[nbe].adj[0] = PreviousNewEdge; if(PreviousNewEdge) PreviousNewEdge->adj[1] = &edges[nbe]; #ifdef DRAWING1 vb->Draw(); edges[nbe].Draw(); #endif PreviousNewEdge = edges + nbe; nbe++; // remove DEBUG print to find a bug in examples++-tutorial/periodic4.edp // under windows // after this the bug disappear (version 3.30 on freefem++ 23/04/2014 FH // problem optimisation, bug in compiler, bug in freefem++ if(verbosity>999) { cout << " new points " << nbv-1 << " " << vb->r ; cout << " new edge " << nbe-1 << " " ; cout << va << vb << " kk0 = " << kk0 << " " << kk1 << " ss=" << ss ; cout << " " << sbb << endl; cout << " " << aa << va->r << bb << vb->r <<" length=" << Norme2(va->r-vb->r) << endl; cout << " s " << s << " lstep= " << lstep << " ledge= " << ledge << " lcurve= " << lcurve << endl; } // end of modification ... DF. Hecht 23/04/2014 FH va = vb; } lcurve = lcurveb; e->SetMark(); // cout << e-Gh.edges << ", " << k << " " // <<(*e)[k].r <<" " <<(*e)[1-k].r <<" " // << lcurve<< ";; " ; a=b; if (b->Required() ) break; int kprev=k; k = e->SensAdj[kprev];// next vertices e = e->Adj[kprev]; assert(e); }// for(;;) vb = b->to; // cout << endl; NbEdgeCurve = Max((Int4) (lcurve +0.5), (Int4) 1); NbNewPoints = NbEdgeCurve-1; if(!kstep) { NbVerticesOnGeomEdge0 += NbNewPoints; NbOfCurves++;} nbvend=nbv+NbNewPoints; lstep = lcurve / NbEdgeCurve; // cout <<"lstep " << lstep << " lcurve " // << lcurve << " NbEdgeCurve " << NbEdgeCurve << " " < " ; Adj(on,j); // next geom edge j=1-j; // cout << Gh.Number(on) << " " << j << " e[ON] = " << e[Gh.Number(on)] // << " s0 " << Gh.Number( (*on)[0]) << " s1 " << Gh.Number( (*on)[1]) << endl; if (e[Gh.Number(on)]) break; // optimisation e[Gh.Number(on)] = ei; } } int kk=0; for ( i=0;i10) cout << " ~Triangles "<< this <<" "<< identity << endl; if(vertices) delete [] vertices; if(edges) delete [] edges; if(triangles) delete [] triangles; if(quadtree) delete quadtree; if(ordre) delete [] ordre; if( subdomains) delete [] subdomains; if (VerticesOnGeomEdge) delete [] VerticesOnGeomEdge; if (VerticesOnGeomVertex) delete [] VerticesOnGeomVertex; if (name) delete [] name; if (identity) delete [] identity; if (VertexOnBThVertex) delete [] VertexOnBThVertex; if (VertexOnBThEdge) delete [] VertexOnBThEdge; if (&Gh) { if (Gh.NbRef>0) Gh.NbRef--; else if (Gh.NbRef==0) delete &Gh; } if (&BTh && (&BTh != this)) { if (BTh.NbRef>0) BTh.NbRef--; else if (BTh.NbRef==0) delete &BTh; } PreInit(0); // set all to zero } void Triangles::SetIntCoor(const char * strfrom) { pmin = vertices[0].r; pmax = vertices[0].r; // recherche des extrema des vertices pmin,pmax Int4 i; for (i=0;i0); // generation of integer coord for (i=0;i2) cout << " -- FillHoleInMesh: Nb of vertices =" << nbv << " Pmin = "<< pmin << " Pmax = "<< pmax << endl; assert(ordre); for (i=0;iaddtrie(Number(edges[i][0]),Number(edges[i][1]))); if (kk != nbe) { cerr << " Some Double edge in the mesh, the number is " << kk-nbe << endl; MeshError(1002,this); } for (i=0;iaddtrie(Number(triangles[i][VerticesOfTriangularEdge[j][0]]), Number(triangles[i][VerticesOfTriangularEdge[j][1]])); Int4 invisible = triangles[i].Hidden(j); if(st[k]==-1) st[k]=3*i+j; else if(st[k]>=0) { assert( ! triangles[i].TriangleAdj(j) && !triangles[st[k] / 3].TriangleAdj((int) (st[k]%3))); triangles[i].SetAdj2(j,triangles + st[k] / 3,(int) (st[k]%3)); if (invisible) triangles[i].SetHidden(j); if (k5) { cout << " On Mesh " << name << endl; cout << " - The number of Vertices = " << nbv << endl; cout << " - The number of Triangles = " << nbt << endl; cout << " - The number of given edge = " << nbe << endl; cout << " - The number of all edges = " << edge4->nb() << endl; cout << " - The Euler number = 1-Nb Of Hole = " << nbt-edge4->nb()+nbv << endl; } // check the consistant of edge[].adj and the geometrical required vertex Int4 k=0; for (i=0;inb();i++) if (st[i] >=0) // edge alone { if (i < nbe) { Int4 i0=edge4->i(i);ordre[i0] = vertices+i0; Int4 i1=edge4->j(i);ordre[i1] = vertices+i1; } else { k++; if (verbosity>20 && k <20) { Int4 i0=edge4->i(i); Int4 i1=edge4->j(i); cerr << " Lose boundary edges " << i << " : " << i0 << " " << i1 << endl; } } } if(k != 0) { if (verbosity>20) { cout << " The given edge are " << endl; for (int i=0;i< nbe;i++) cout << " Edge " << i << " : " << Number(edges[i][0]) << " " << Number(edges[i][1]) << " " << edges[i].ref << endl; } cerr << k << " boundary edges are not defined as edges " << endl; MeshError(9998,this); } // generation of the mesh with boundary points Int4 nbvb = 0; for (i=0;i9) cout << " Nbtriafillhole triafillhole*" << triafillhole << endl; triangles = triafillhole; nbt=2; nbtx= Nbtriafillhole; for (i=2 ; det( ordre[0]->i, ordre[1]->i, ordre[i]->i ) == 0;) if ( ++i >= nbvb) { cerr << "FillHoleInMesh: All the vertices are aline " << nbvb << endl; MeshError(998,this); } Exchange( ordre[2], ordre[i]); Vertex * v0=ordre[0], *v1=ordre[1]; triangles[0](0) = 0; // sommet pour infini triangles[0](1) = v0; triangles[0](2) = v1; triangles[1](0) = 0;// sommet pour infini triangles[1](2) = v0; triangles[1](1) = v1; const int e0 = OppositeEdge[0]; const int e1 = NextEdge[e0]; const int e2 = PreviousEdge[e0]; triangles[0].SetAdj2(e0, &triangles[1] ,e0); triangles[0].SetAdj2(e1, &triangles[1] ,e2); triangles[0].SetAdj2(e2, &triangles[1] ,e1); triangles[0].det = -1; // faux triangles triangles[1].det = -1; // faux triangles triangles[0].SetTriangleContainingTheVertex(); triangles[1].SetTriangleContainingTheVertex(); triangles[0].link=&triangles[1]; triangles[1].link=&triangles[0]; #ifdef DEBUG triangles[0].check(); triangles[1].check(); #endif // nbtf = 2; if ( !quadtree ) delete quadtree; // ->ReInitialise(); quadtree = new QuadTree(this,0); quadtree->Add(*v0); quadtree->Add(*v1); // on ajoute les sommets un a un Int4 NbSwap=0; for (Int4 icount=2; icounti,dete); quadtree->Add(*vi); Add(*vi,tcvi,dete); NbSwap += vi->Optim(1,1); #ifdef DRAWING2 cout << Number(vi) << " " << NbSwap << endl; reffecran(); Draw(); vi->Draw(); inquire(); #endif }// end loop on icount #ifdef DRAWING1 inquire(); #endif //Int4 nbtfillhole = nbt; // inforce the boundary TriangleAdjacent ta(0,0); Int4 nbloss = 0,knbe=0; for ( i = 0; i < nbe; i++) if (st[i] >=0) // edge alone => on border ... FH oct 2009 { Vertex & a=edges[i][0], & b = edges[i][1]; if (a.t && b.t) // le bug est la si maillage avec des bod non raffine 1. { knbe++; if (ForceEdge(a,b,ta)<0) nbloss++; } } if(nbloss) { cerr << " we loss some " << nbloss << " " << " edges other " << knbe << endl; MeshError(1100,this); } FindSubDomain(1); // remove all the hole // remove all the good sub domain Int4 krm =0; for (i=0;iaddtrie(v0?Number(v0):nbv,v1? Number(v1):nbv); assert(st[k] >=0); tta.SetAdj2(ja,savetriangles + st[k] / 3,(int) (st[k]%3)); ta.SetLock(); st[k]=-2-st[k]; } } } Int4 NbTfillHoll =0; for (i=0;i=0) { savetriangles[savenbt]=triangles[i]; savetriangles[savenbt].link=0; savenbt++; } // gestion of the adj k =0; Triangle * tmax = triangles + nbt; for (i=0;i= triangles && ta < tmax) { ta= savetriangles + ta->color; ti.SetAdj2(j,ta,aa); if(lck) ti.SetLocked(j); } } } // OutSidesTriangles = triangles; // Int4 NbOutSidesTriangles = nbt; // restore triangles; nbt=savenbt; nbtx=savenbtx; delete [] triangles; delete [] subdomains; triangles = savetriangles; subdomains = savesubdomains; // cout << triangles << " <> " << OutSidesTriangles << endl; /* k=0; for (i=0;iAdd(vertices[i]); SetVertexFieldOn(); for (i=0;iIsRequiredVertex()) { cerr << " Erreur adj et sommet requis edges [" << i << "][ " << j << "]= " << Number(edges[i][j]) << " : " << " on = " << Gh.Number(edges[i].on) ; if (edges[i][j].on->OnGeomVertex()) cerr << " vertex " << Gh.Number(edges[i][j].on->gv); else if (edges[i][j].on->OnGeomEdge()) cerr << "Edges " << Gh.Number(edges[i][j].on->ge); else cerr << " = " << edges[i][j].on ; cerr << endl; } #ifdef DRAWING1 InitDraw(); #endif } CurrentTh=OldCurrentTh; } Triangles::Triangles(Triangles & Th,Geometry * pGh,Triangles * pBth,Int4 nbvxx) // COPY OPERATOR : Gh(*(pGh?pGh:&Th.Gh)), BTh(*(pBth?pBth:this)) { Gh.NbRef++; nbvxx = Max(nbvxx,Th.nbv); Int4 i; // do all the allocation to be sure all the pointer existe char * cname = 0; if (Th.name) { cname = new char[strlen(Th.name)+1]; strcpy(cname,Th.name); } PreInit(nbvxx,cname);// to make the allocation // copy of triangles nt=Th.nt; nbv = Th.nbv; nbt = Th.nbt; nbiv = Th.nbiv; nbe = Th.nbe; NbSubDomains = Th.NbSubDomains; NbOutT = Th.NbOutT; NbOfQuad = Th.NbOfQuad ; NbOfSwapTriangle =0; NbVerticesOnGeomVertex = Th.NbVerticesOnGeomVertex; if(NbVerticesOnGeomVertex) VerticesOnGeomVertex = new VertexOnGeom[NbVerticesOnGeomVertex]; NbVerticesOnGeomEdge = Th.NbVerticesOnGeomEdge; if (NbVerticesOnGeomEdge) VerticesOnGeomEdge = new VertexOnGeom[NbVerticesOnGeomEdge] ; if (& BTh == & Th.BTh) // same back ground { BTh.NbRef++; NbVertexOnBThVertex = Th.NbVertexOnBThVertex; if(NbVertexOnBThVertex) VertexOnBThVertex = new VertexOnVertex[NbVertexOnBThVertex]; NbVertexOnBThEdge = Th.NbVertexOnBThEdge; if(NbVertexOnBThEdge) VertexOnBThEdge = new VertexOnEdge[NbVertexOnBThEdge]; } else { // no add on back ground mesh BTh.NbRef++; NbVertexOnBThVertex=0; VertexOnBThVertex=0; NbVertexOnBThEdge=0; VertexOnBThEdge=0; // assert (& BTh == this); // --- a voir } if(nbe) edges = new Edge[nbe]; if(NbSubDomains) subdomains = new SubDomain[NbSubDomains]; pmin = Th.pmin; pmax = Th.pmax; coefIcoor = Th.coefIcoor; for(i=0;iDraw(); DrawMark( s->r); #endif ttc = t->at[j]; jc = NextEdge[t->aa[j]&3]; cout << *t << " " << VerticesOfTriangularEdge[j][1] << "\n\t try swap " << * ttc << " " << jc ; while ( ttc->swap(jc,koption)) { NbSwap++,assert(k++<20000); ttc = t->at[j]; jc = NextEdge[t->aa[j]&3]; cout << "\n\t s " << *ttc << " " << jc << endl; } cout << endl; t = ttc; j = NextEdge[jc]; assert(k<20000); } while ( (tbegin != t)); return NbSwap; } */ Int4 Triangle::Optim(Int2 i,int koption) { // turne around in positif sens Int4 NbSwap =0; #ifdef DEBUG Vertex * s = ns[i]; #endif Triangle *t = this; int k=0,j =OppositeEdge[i]; int jp = PreviousEdge[j]; // initialise tp, jp the previous triangle & edge Triangle *tp= at[jp]; jp = aa[jp]&3; #ifdef DEBUG assert(tp->at[jp] == this); #endif do { #ifdef DEBUG assert(k++<20000); assert( s == & (*t)[OppositeVertex[j]] ); #endif // cout << *t << " " << j << "\n\t try swap " ; while (t->swap(j,koption)) { NbSwap++; assert(k++<20000); t= tp->at[jp]; // set unchange t qnd j for previous triangles j= NextEdge[tp->aa[jp]&3]; // cout << "\n\t s " << *t << " " << j << endl; #ifdef DEBUG assert( s == & (*t)[OppositeVertex[j]] ); #endif } // end on this Triangle tp = t; jp = NextEdge[j]; t= tp->at[jp]; // set unchange t qnd j for previous triangles j= NextEdge[tp->aa[jp]&3]; } while( t != this); return NbSwap; } void Triangles::SmoothingVertex(int nbiter,Real8 omega ) { // if quatree exist remove it end reconstruct if (quadtree) delete quadtree; quadtree=0; ReMakeTriangleContainingTheVertex(); Triangle vide; // a triangle to mark the boundary vertex Triangle ** tstart= new Triangle* [nbv]; Int4 i,j,k; // attention si Background == Triangle alors on ne peut pas utiliser la rechech rapide if ( this == & BTh) for ( i=0;i2) cout << " -- SmoothingVertex: nb Iteration = " << nbiter << " Omega = " << omega << endl; for (k=0;k3) cout << " Move max = " << sqrt(delta) << " iteration = " << k << " Nb of Swap = " << NbSwap << endl; } delete [] tstart; if (quadtree) quadtree= new QuadTree(this); } void Triangles::MakeQuadTree() { if(verbosity>8) cout << " MakeQuadTree" << endl; if ( !quadtree ) quadtree = new QuadTree(this); #ifdef DRAWING1 quadtree->Draw(); rattente(1); reffecran(); quadtree->Draw(); rattente(1); #endif } void Triangles::ShowRegulaty() const// Add FH avril 2007 { const Real8 sqrt32=sqrt(3.)*0.5; const Real8 aireKh=sqrt32*0.5; D2 Beq(1,0),Heq(0.5,sqrt32); D2xD2 Br(D2xD2(Beq,Heq).t()); D2xD2 B1r(Br.inv()); /* D2xD2 BB = Br.t()*Br; cout << " BB = " << BB << " " << Br*B1r << endl; MetricAnIso MMM(BB.x.x,BB.x.y,BB.y.y); MatVVP2x2 VMM(MMM); cout << " " << VMM.lambda1 << " " << VMM.lambda2 << endl; */ double gammamn=1e100,hmin=1e100; double gammamx=0,hmax=0; double beta=1e100; double beta0=0; double alpha2=0; double area=0,Marea=0; // Real8 cf= Real8(coefIcoor); // Real8 cf2= 6.*cf*cf; int nt=0; for (int it=0;itlink || Number(ta) >= it) { Vertex & vP = triangles[it][VerticesOfTriangularEdge[j][0]]; Vertex & vQ = triangles[it][VerticesOfTriangularEdge[j][1]]; if ( !& vP || !&vQ) continue; R2 PQ = vQ.r - vP.r; Real8 l = log(LengthInterpole(vP,vQ,PQ)); #ifdef DRAWING2 if (l>1.4) { penthickness(3); vP.MoveTo(),vQ.LineTo(); penthickness(1); cout << " l = " << l << Number(vP) << " edge = " << Number(vQ) << endl; } #endif nbedges++; k = (int) ((l - lmin)*delta); k = Min(Max(k,0L),kmax); histo[k]++; } } } cout << " -- Histogram of the unit mesh, nb of edges" << nbedges << endl <0); for (int i=0;i0); for (int i=0;iCracked()) k++; if( k==0) return 0; CurrentTh = this; cout << " Nb of Cracked Edges = " << k << endl; NbCrackedEdges =k; CrackedEdges = new CrackedEdge[k]; // new edge Edge * e = new Edge[ nbe + k]; // copy for (i=0;iCracked()) { e[nbe] = e[i]; // return the edge e[nbe].v[0] = e[i].v[1]; e[nbe].v[1] = e[i].v[0]; e[nbe].on = e[i].on->link ; // fqux CrackedEdges[k++]=CrackedEdge(edges,i,nbe); nbe++; } ReMakeTriangleContainingTheVertex() ; // int nbcrakev =0; Vertex *vlast = vertices + nbv; Vertex *vend = vertices + nbvx; // end of array for (int iv=0;iv= 0 ) && (i <3)); // turn around the vertex v TriangleAdjacent ta(tbegin,EdgesVertexTriangle[i][0]);// previous edge int k=0; do { int kv = VerticesOfTriangularEdge[ta][1]; k++; Triangle * tt (ta); if ( ta.Cracked() ) { TriangleAdjacent tta=(ta.Adj()); assert(tta.Cracked()); if ( kk == 0) tbegin=ta,kkk=0; // begin by a cracked edge => restart if ( kkk ) { kc =1;vv = vlast++; kkk = 0; } // new vertex if use kk++;// number of cracked edge view } if ( tt->link ) { // if good triangles store the value int it = Number(tt); assert(it < nt); (*tt)(kv)= vv; // Change the vertex of triangle if(vvReferenceNumber=iv;} // copy the vertex value + store the old vertex number in ref // tt->SetTriangleContainingTheVertex(); kkk++; } else if (kk) { // crack + boundary if ( kkk ) { kc =1;vv = vlast++; kkk = 0; } // new vertex if use } ta = Next(ta).Adj(); } while ( (tbegin != ta)); assert(k); if (kc) nbcrakev++; } if ( nbcrakev ) for (int iec =0;iec < NbCrackedEdges; iec ++) CrackedEdges[iec].Set(); // set the ref cout << " set the ref " << endl ; NbCrackedVertices = nbcrakev; // int nbvo = nbv; nbv = vlast - vertices; int nbnewv = nbv - nbv; // nb of new vrtices if (nbcrakev && verbosity > 1 ) cout << " Nb of craked vertices = " << nbcrakev << " Nb of created vertices " << nbnewv<< endl; // all the new vertices are on geometry // BOFBO-- A VOIR if (nbnewv) { // Int4 n = nbnewv+NbVerticesOnGeomVertex; Int4 i,j,k; VertexOnGeom * vog = new VertexOnGeom[n]; for ( i =0; i= LastOld) { // a new vertex Int4 old = v->ReferenceNumber ; // the old same vertex Int4 i = ( v - LastOld); // if the old is on vertex => warning // else the old is on edge => ok vog[i] = vog[old]; // vog[i].mv = v; //g[i].ge = ; //og[i].abcisse = ; } } } NbVerticesOnGeomVertex = n; } SetVertexFieldOn(); if (vlast >= vend) { cerr << " Not enougth vertices to crack the mesh we need " << nbv << " vertices " << endl; MeshError(555,this); } cout << " NbCrackedVertices " << NbCrackedVertices << endl; CurrentTh = CurrentThOld; return NbCrackedVertices; } Triangles::Triangles(const Triangles & Tho,const int *flag ,const int *bb) : Gh(*(new Geometry())), BTh(*this) { // truncature // char cname[] = "trunc"; int i,k,itadj; int kt=0; int * kk = new int [Tho.nbv]; Int4 * reft = new Int4[Tho.nbt]; Int4 nbInT = Tho.ConsRefTriangle(reft); Int4 * refv = new Int4[Tho.nbv]; for (i=0;i=0 && flag[i]) { const Triangle & t = Tho.triangles[i]; kt++; kk[Tho.Number(t[0])]=1; kk[Tho.Number(t[1])]=1; kk[Tho.Number(t[2])]=1; itadj=Tho.Number(t.TriangleAdj(0)); if ( reft[itadj] >=0 && !flag[itadj]) { nbNewBedge++; refv[Tho.Number(t[VerticesOfTriangularEdge[0][0]])]=bb[i]; refv[Tho.Number(t[VerticesOfTriangularEdge[0][1]])]=bb[i]; } itadj=Tho.Number(t.TriangleAdj(1)); if ( reft[itadj] >=0 && !flag[itadj]) { nbNewBedge++; refv[Tho.Number(t[VerticesOfTriangularEdge[1][0]])]=bb[i]; refv[Tho.Number(t[VerticesOfTriangularEdge[1][1]])]=bb[i];} itadj=Tho.Number(t.TriangleAdj(2)); if ( reft[itadj] >=0 && !flag[itadj]) { nbNewBedge++; refv[Tho.Number(t[VerticesOfTriangularEdge[2][0]])]=bb[i]; refv[Tho.Number(t[VerticesOfTriangularEdge[2][1]])]=bb[i];} } k=0; for (i=0;i=0) kk[i]=k++; cout << " number of vertices " << k << " remove = " << Tho.nbv - k << endl; cout << " number of triangles " << kt << " remove = " << nbInT-kt << endl; cout << " number of New boundary edge " << nbNewBedge << endl; Int4 inbvx =k; PreInit(inbvx,cname); for (i=0;i=0) { vertices[nbv] = Tho.vertices[i]; if (!vertices[nbv].ref()) vertices[nbv].ReferenceNumber = refv[i]; nbv++; } assert(inbvx == nbv); for (i=0;i=0 && flag[i]) { const Triangle & t = Tho.triangles[i]; int i0 = Tho.Number(t[0]); int i1 = Tho.Number(t[1]); int i2 = Tho.Number(t[2]); assert(i0>=0 && i1 >= 0 && i2 >= 0); assert(i0link); } Triangle * Triangles::FindTriangleContening(const I2 & B,Icoor2 dete[3], Triangle *tstart) const { // in: B // out: t // out : dete[3] // t the triangle and s0,s1,s2 the 3 vertices of t // in dete[3] = { det(B,s1,s2) , det(s0,B,s2), det(s0,s1,B)} // with det(a,b,c ) = -1 if one of 3 vertices a,b,c is NULL Triangle * t=0; int j,jp,jn,jj; if (tstart) t=tstart; else { assert(quadtree); Vertex *a = quadtree->NearestVertex(B.x,B.y) ; if (! a || !a->t ) { if (a) {cerr << " Attention PB TriangleConteningTheVertex vertex number=" << Number(a) << endl; cerr << "We forget a call to ReMakeTriangleContainingTheVertex" << endl;} cerr << " Pb with " << B << toR2(B) << endl; MeshError(7777); } assert(a>= vertices && a < vertices+nbv); #ifdef DRAWING1 a->Draw(); #endif // int k=0; t = a->t; assert(t>= triangles && t < triangles+nbt); } Icoor2 detop ; int kkkk =0; // number of test triangle while ( t->det < 0) { // the initial triangles is outside int k0=(*t)(0) ? (( (*t)(1) ? ( (*t)(2) ? -1 : 2) : 1 )) : 0; assert(k0>=0); // k0 the NULL vertex int k1=NextVertex[k0],k2=PreviousVertex[k0]; dete[k0]=det(B,(*t)[k1],(*t)[k2]); dete[k1]=dete[k2]=-1; if (dete[k0] > 0) // outside B return t; t = t->TriangleAdj(OppositeEdge[k0]); assert(kkkk++ < 2); } jj=0; detop = det(*(*t)(VerticesOfTriangularEdge[jj][0]),*(*t)(VerticesOfTriangularEdge[jj][1]),B); while(t->det > 0 ) { assert( kkkk++ < 2000 ); j= OppositeVertex[jj]; #ifdef DRAWING1 t->Draw(); #endif dete[j] = detop; //det(*b,*s1,*s2); jn = NextVertex[j]; jp = PreviousVertex[j]; dete[jp]= det(*(*t)(j),*(*t)(jn),B); dete[jn] = t->det-dete[j] -dete[jp]; #ifdef DEBUG const Vertex * s0 = (*t)(0); const Vertex * s1 = (*t)(1); const Vertex * s2 = (*t)(2); assert(dete[0] == det(B ,*s1,*s2)); assert(dete[1] == det(*s0,B ,*s2)); assert(dete[2] == det(*s0,*s1,B )); assert(t->det== (dete[0] + dete[1] +dete[2])); #endif // count the number k of dete <0 int k=0,ii[3]; if (dete[0] < 0 ) ii[k++]=0; if (dete[1] < 0 ) ii[k++]=1; if (dete[2] < 0 ) ii[k++]=2; // 0 => ok // 1 => go in way 1 // 2 => two way go in way 1 or 2 randomly if (k==0) break; if (k == 2 && BinaryRand()) Exchange(ii[0],ii[1]); assert ( k < 3); TriangleAdjacent t1 = t->Adj(jj=ii[0]); if ((t1.det() < 0 ) && (k == 2)) t1 = t->Adj(jj=ii[1]); t=t1; j=t1;// for optimisation we now the -det[OppositeVertex[j]]; detop = -dete[OppositeVertex[jj]]; jj = j; } if (t->det<0) // outside triangle dete[0]=dete[1]=dete[2]=-1,dete[OppositeVertex[jj]]=detop; // NbOfTriangleSearchFind += kkkk; return t; } } freefem++-3.38-1/src/bamglib/Mesh2.h000644 000767 000024 00000136661 12514227162 017136 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #if (defined(unix) || defined(__unix)) && !defined(__AIX) #define SYSTIMES #include #include #endif #ifdef DRAWING #include "rgraph.hpp" #endif extern long verbosity; extern int SHOW; #include "meshtype.h" #include "error.hpp" #include "R2.h" namespace bamg { const double Pi = 3.14159265358979323846264338328; const float fPi = 3.14159265358979323846264338328; class MeshIstream; class OFortranUnFormattedFile; class IFortranUnFormattedFile; extern int hinterpole; typedef P2 I2; inline int BinaryRand(){ #ifdef RAND_MAX const long HalfRandMax = RAND_MAX/2; return rand() R2; typedef P2xP2 I2xI2; typedef P2 R2xR2; } #include "Metric.h" namespace bamg { inline float OppositeAngle(float a) {return a<0 ? fPi + a :a - fPi ;} inline double OppositeAngle(double a) {return a<0 ? Pi + a :a - Pi ;} #ifdef DRAWING extern Real4 xGrafCoef,yGrafCoef,xGrafOffSet,yGrafOffSet; extern R2 GrafPMin,GrafPMax; extern Real8 Grafh; #endif Icoor2 inline det(const I2 &a,const I2 & b,const I2 &c) { Icoor2 bax = b.x - a.x ,bay = b.y - a.y; Icoor2 cax = c.x - a.x ,cay = c.y - a.y; return bax*cay - bay*cax;} // def de numerotation dans un triangles static const Int2 VerticesOfTriangularEdge[3][2] = {{1,2},{2,0},{0,1}}; static const Int2 EdgesVertexTriangle[3][2] = {{1,2},{2,0},{0,1}}; static const Int2 OppositeVertex[3] = {0,1,2}; static const Int2 OppositeEdge[3] = {0,1,2}; static const Int2 NextEdge[3] = {1,2,0}; static const Int2 PreviousEdge[3] = {2,0,1}; static const Int2 NextVertex[3] = {1,2,0}; static const Int2 PreviousVertex[3] = {2,0,1}; Int4 AGoodNumberPrimeWith(Int4 n); // remark all the angle are in radian beetwen [-Pi,Pi] class Geometry; //static Geometry *NULLGeometry=0; class Triangles; class Triangle; class QuadTree; class GeometricalEdge; class VertexOnGeom; class VertexOnEdge; ///////////////////////////////////////////////////////////////////////////////////// const int IsVertexOnGeom = 8; const int IsVertexOnVertex = 16; const int IsVertexOnEdge = 32; ///////////////////////////////////////////////////////////////////////////////////// #ifndef NOTFREEFEM class ErrorMesh : public Error { public: const Triangles *Th; ErrorMesh(const char * Text,int l,const Triangles * TTh=0, const char *t2="") : Error(MESH_ERROR,"Meshing error: ",Text,"\n number : ",l,", ",t2),Th(TTh) {} }; #endif class Direction { // private: Icoor1 dir; public: Direction(): dir(MaxICoor){}; // no direction set Direction(Icoor1 i,Icoor1 j) { Icoor2 n2 = 2*(Abs(i)+Abs(j)); Icoor2 r = MaxICoor* (Icoor2) i; Icoor1 r1 = (Icoor1) (2*(r/ n2)); // odd number dir = (j>0) ? r1 : r1+1; // odd -> j>0 even -> j<0 } int sens( Icoor1 i,Icoor1 j) { int r =1; if (dir!= MaxICoor) { Icoor2 x(dir/2),y1(MaxICoor/2-Abs(x)),y(dir%2?-y1:y1); r = (x*i + y*j) >=0;} return r;} #ifdef DRAWING void Draw() { if (dir!= MaxICoor) { Icoor2 x(dir/2),y1(MaxICoor/2-Abs(x)),y(dir%2?-y1:y1); R2 D(x,y); double eps = Grafh/Norme2(D)/20; D = D*eps; rmoveto(D.x,D.y); } } #endif }; ///////////////////////////////////////////////////////////////////////////////////// class Vertex {public: I2 i; // allow to use i.x, and i.y in long int (beware of scale and centering) R2 r; // allow to use r.x, and r.y in double Metric m; Int4 ReferenceNumber; Direction DirOfSearch; union { Triangle * t; // one triangle which contained the vertex Int4 color; Vertex * to;// use in geometry Vertex to now the Mesh Vertex associed VertexOnGeom * on; // if vint 8; // set with Triangles::SetVertexFieldOn() Vertex * onbv; // if vint == 16 on Background vertex Triangles::SetVertexFieldOnBTh() VertexOnEdge * onbe; // if vint == 32 on Background edge }; Int1 vint; // the vertex number in triangle; varies between 0 and 2 in t operator I2 () const {return i;} // operator de cast operator const R2 & () const {return r;}// operator de cast // operator R2 & () {return r;}// operator de cast Real8 operator()(R2 x) const { return m(x);} operator Metric () const {return m;}// operator de cast Int4 Optim(int = 1,int =0); // Vertex(){} // ~Vertex(){} Real8 Smoothing(Triangles & ,const Triangles & ,Triangle * & ,Real8 =1); int ref() const { return ReferenceNumber;} friend ostream& operator <<(ostream& f, const Vertex & v) {f << "(" << v.i << "," << v.r << MatVVP2x2(v.m) << ")" ; return f;} inline void Set(const Vertex & rec,const Triangles &,Triangles &); #ifdef DRAWING void Draw(Int4 =-1) const ; void MoveTo() const { rmoveto(r.x,r.y); } void LineTo() const { rlineto(r.x,r.y); } #endif }; double QuadQuality(const Vertex &,const Vertex &,const Vertex &,const Vertex &); // extern Vertex *Meshend , *Meshbegin; ///////////////////////////////////////////////////////////////////////////////////// class TriangleAdjacent { friend ostream& operator <<(ostream& f, const TriangleAdjacent & ta) {f << "{" << ta.t << "," << ((int) ta.a) << "}" ; return f;} public: Triangle * t; // le triangle int a; // le numero de l arete TriangleAdjacent(Triangle * tt,int aa): t(tt),a(aa &3) {}; TriangleAdjacent() {}; operator Triangle * () const {return t;} operator Triangle & () const {return *t;} operator int() const {return a;} TriangleAdjacent & operator++() { a= NextEdge[a]; return *this;} TriangleAdjacent operator--() { a= PreviousEdge[a]; return *this;} inline TriangleAdjacent Adj() const ; int swap(); inline void SetAdj2(const TriangleAdjacent& , int =0); inline Vertex * EdgeVertex(const int &) const ; inline Vertex * OppositeVertex() const ; inline Icoor2 & det() const; inline int Locked() const ; inline int GetAllFlag_UnSwap() const ; inline void SetLock(); inline int MarkUnSwap() const; inline void SetMarkUnSwap(); inline void SetCracked(); inline int Cracked() const ; };// end of Vertex class ///////////////////////////////////////////////////////////////////////////////////// class Edge { public: Vertex * v[2]; Int4 ref; GeometricalEdge * on; Vertex & operator[](int i){return *v[i];}; Vertex * operator()(int i){return v[i];}; void ReNumbering(Vertex *vb,Vertex *ve, Int4 *renu) { if (v[0] >=vb && v[0] =vb && v[1] no continuite GeometricalEdge * Adj [2]; int SensAdj[2]; // private: int flag ; public: GeometricalEdge * link; // if Cracked() or Equi() // end of data GeometricalVertex & operator[](int i){return *v[i];}; const GeometricalVertex & operator[](int i) const { return *v[i];}; GeometricalVertex * operator()(int i){return v[i];}; // inline void Set(const Geometry &,Int4,Geometry &); R2 F(Real8 theta) const ; // parametrization of the curve edge Real8 R1tg(Real8 theta,R2 &t) const ; // 1/radius of curvature + tangente int Cracked() const {return flag & 1;} int Dup() const { return flag & 32;} int Equi()const {return flag & 2;} int ReverseEqui()const {return flag & 128;} int TgA()const {return flag &4;} int TgB()const {return flag &8;} int Tg(int i) const{return i==0 ? TgA() : TgB();} int Mark()const {return flag &16;} int Required() { return flag & 64;} void SetCracked() { flag |= 1;} void SetDup() { flag |= 32;} // not a real edge void SetEqui() { flag |= 2;} void SetTgA() { flag|=4;} void SetTgB() { flag|=8;} void SetMark() { flag|=16;} void SetUnMark() { flag &= 1007 /* 1023-16*/;} void SetRequired() { flag |= 64;} void SetReverseEqui() {flag |= 128;} inline void Set(const GeometricalEdge & rec,const Geometry & Th ,Geometry & ThNew); #ifdef DRAWING void Draw(Int4 =-1); #endif }; class Curve {public: GeometricalEdge * be,*ee; // begin et end edge int kb,ke; // begin vetex and end vertex Curve *next; // next curve equi to this bool master; // true => of equi curve point on this curve inline void Set(const Curve & rec,const Geometry & Th ,Geometry & ThNew); Curve() : be(0),ee(0),kb(0),ke(0),next(0),master(true) {} void Reverse() { Exchange(be,ee); Exchange(kb,ke);} // revese the sens of the curse }; ///////////////////////////////////////////////////////////////////////////////////// class Triangle { friend class TriangleAdjacent; friend ostream& operator <<(ostream& f, const Triangle & ta); private: // les arete sont opposes a un sommet Vertex * ns [3]; // 3 vertices if t is triangle, t[i] allowed by access function, (*t)[i] if pointer Triangle * at [3]; // nu triangle adjacent Int1 aa[3]; // les nu des arete dans le triangles (mod 4) public: Icoor2 det; // determinant du triangle (2 fois l aire des vertices entieres) union { Triangle * link ; Int4 color; }; void SetDet() { if(ns[0] && ns[1] && ns[2]) det = bamg::det(*ns[0],*ns[1],*ns[2]); else det = -1; } Triangle() {} Triangle(Triangles *Th,Int4 i,Int4 j,Int4 k); Triangle(Vertex *v0,Vertex *v1,Vertex *v2); inline void Set(const Triangle &,const Triangles &,Triangles &); inline int In(Vertex *v) const { return ns[0]==v || ns[1]==v || ns[2]==v ;} TriangleAdjacent FindBoundaryEdge(int ) const; int infv() const {return ns[0] ? (( ns[1] ? ( ns[2] ? -1 : 2) : 1 )) : 0;} void ReNumbering(Triangle *tb,Triangle *te, Int4 *renu) { if (link >=tb && link =tb && at[0] =tb && at[1] =tb && at[2] =vb && ns[0] =vb && ns[1] =vb && ns[2] at[aatt]=this; tt->aa[aatt]=a + (aa[a] & 60 ) ;}// Copy all the mark } void SetAdj2(Int1 a,Triangle *t,Int1 aat) { at[a]=t;aa[a]=aat; if(t) {t->at[aat]=this;t->aa[aat]=a;} } void SetTriangleContainingTheVertex() { if (ns[0]) (ns[0]->t=this,ns[0]->vint=0); if (ns[1]) (ns[1]->t=this,ns[1]->vint=1); if (ns[2]) (ns[2]->t=this,ns[2]->vint=2); } int swap(Int2 a1,int=0); Int4 Optim(Int2 a,int =0); int Locked(int a)const { return aa[a]&4;} int Hidden(int a)const { return aa[a]&16;} int Cracked(int a) const { return aa[a] & 32;} // for optimisation int GetAllflag(int a){return aa[a] & 1020;} void SetAllFlag(int a,int f){aa[a] = (aa[a] &3) + (1020 & f);} void SetHidden(int a){ Triangle * t = at[a]; if(t) t->aa[aa[a] & 3] |=16; aa[a] |= 16;} void SetCracked(int a){ Triangle * t = at[a]; if(t) t->aa[aa[a] & 3] |=32; aa[a] |= 32;} double QualityQuad(int a,int option=1) const; Triangle * Quadrangle(Vertex * & v0,Vertex * & v1,Vertex * & v2,Vertex * & v3) const ; void SetLocked(int a){ Triangle * t = at[a]; t->aa[aa[a] & 3] |=4; aa[a] |= 4;} void SetMarkUnSwap(int a){ Triangle * t = at[a]; t->aa[aa[a] & 3] |=8; aa[a] |=8 ;} void SetUnMarkUnSwap(int a){ Triangle * t = at[a]; t->aa[aa[a] & 3] &=55; // 23 + 32 aa[a] &=55 ;} #ifdef DEBUG void inline checka(Int1 a); void inline check(); #endif #ifdef DRAWING void Draw(Int4 i=-1) const; int swapDRAW(Int2 a1); #endif }; // end of Triangle class class ListofIntersectionTriangles { ///////////////////////////////////////////////////////////////////////////////////// class IntersectionTriangles { public: Triangle *t; Real8 bary[3]; // use if t != 0 R2 x; Metric m; Real8 s;// abscisse curviline Real8 sp; // len of the previous seg in m Real8 sn;// len of the next seg in m }; ///////////////////////////////////////////////////////////////////////////////////// class SegInterpolation { public: GeometricalEdge * e; Real8 sBegin,sEnd; // abscisse of the seg on edge parameter Real8 lBegin,lEnd; // length abscisse set in ListofIntersectionTriangles::Length int last;// last index in ListofIntersectionTriangles for this Sub seg of edge R2 F(Real8 s){ Real8 c01=lEnd-lBegin, c0=(lEnd-s)/c01, c1=(s-lBegin)/c01; assert(lBegin<= s && s <=lEnd); return e->F(sBegin*c0+sEnd*c1);} }; int MaxSize; // int Size; // Real8 len; // int state; IntersectionTriangles * lIntTria; int NbSeg; int MaxNbSeg; SegInterpolation * lSegsI; public: IntersectionTriangles & operator[](int i) {return lIntTria[i];} operator int&() {return Size;} ListofIntersectionTriangles(int n=256,int m=16) : MaxSize(n), Size(0), len(-1),state(-1),lIntTria(new IntersectionTriangles[n]) , NbSeg(0), MaxNbSeg(m), lSegsI(new SegInterpolation[m]) { if (verbosity>9) cout << " construct ListofIntersectionTriangles" << MaxSize << " " << MaxNbSeg<< endl;}; ~ListofIntersectionTriangles(){ if (lIntTria) delete [] lIntTria,lIntTria=0; if (lSegsI) delete [] lSegsI,lSegsI=0;} void init(){state=0;len=0;Size=0;} int NewItem(Triangle * tt,Real8 d0,Real8 d1,Real8 d2); int NewItem(R2,const Metric & ); void NewSubSeg(GeometricalEdge *e,Real8 s0,Real8 s1) { if (NbSeg>=MaxNbSeg) { int mneo= MaxNbSeg; MaxNbSeg *= 2; if (verbosity>3) cout <<" reshape lSegsI from " << mneo << " to " << MaxNbSeg <3) cout << " ListofIntersectionTriangles ReShape MaxSize " << MaxSize << " -> " << newsize << endl; MaxSize = newsize; delete [] lIntTria;// remove old lIntTria = nw; // copy pointer } void SplitEdge(const Triangles & ,const R2 &,const R2 &,int nbegin=0); Real8 Length(); Int4 NewPoints(Vertex *,Int4 & nbv,Int4 nbvx); }; ///////////////////////////////////////////////////////////////////////////////////// class GeometricalSubDomain { public: GeometricalEdge *edge; int sens; // -1 or 1 Int4 ref; inline void Set(const GeometricalSubDomain &,const Geometry & ,const Geometry &); }; ///////////////////////////////////////////////////////////////////////////////////// class SubDomain { public: Triangle * head; Int4 ref; int sens; // -1 or 1 Edge * edge; // to geometrical inline void Set(const Triangles &,Int4,Triangles &); }; ///////////////////////////////////////////////////////////////////////////////////// class VertexOnGeom { public: Vertex * mv; Real8 abscisse; union{ GeometricalVertex * gv; // if abscisse <0; GeometricalEdge * ge; // if abscisse in [0..1] }; inline void Set(const VertexOnGeom&,const Triangles &,Triangles &); int OnGeomVertex()const {return abscisse <0 ;} int OnGeomEdge() const {return abscisse >=0 ;} VertexOnGeom(): mv(0),abscisse(0){gv=0;} VertexOnGeom(Vertex & m,GeometricalVertex &g) : mv(&m),abscisse(-1){gv=&g;} // cout << " mv = " <Required():0):0 )) : 0;} void SetOn(){mv->on=this;mv->vint=IsVertexOnGeom;} friend ostream& operator <<(ostream& f, const VertexOnGeom & vog){ f << vog.abscisse << " " << vog.mv << " " << vog.gv << " ; "; if (vog.abscisse < 0) f << *vog.gv << " ;; " ; // else f << *vog.ge << " ;; " ; return f;} inline void Set(const Triangles &,Int4,Triangles &); }; ///////////////////////////////////////////////////////////////////////////////////// class VertexOnVertex {public: Vertex * v, *bv; VertexOnVertex(Vertex * w,Vertex *bw) :v(w),bv(bw){} VertexOnVertex() {}; inline void Set(const Triangles &,Int4,Triangles &); void SetOnBTh(){v->onbv=bv;v->vint=IsVertexOnVertex;} }; ///////////////////////////////////////////////////////////////////////////////////// class VertexOnEdge {public: Vertex * v; Edge * be; Real8 abcisse; VertexOnEdge( Vertex * w, Edge *bw,Real8 s) :v(w),be(bw),abcisse(s) {} VertexOnEdge(){} inline void Set(const Triangles &,Int4,Triangles &); void SetOnBTh(){v->onbe=this;v->vint=IsVertexOnEdge;} Vertex & operator[](int i) const { return (*be)[i];} operator Real8 () const { return abcisse;} operator Vertex * () const { return v;} operator Edge * () const { return be;} }; inline TriangleAdjacent FindTriangleAdjacent(Edge &E); inline Vertex * TheVertex(Vertex * a); // for remove crak in mesh ///////////////////////////////////////////////////////////////////////////////////// class CrackedEdge { // a small class to store on crack an uncrack information friend class Triangles; friend ostream& operator <<(ostream& f, const Triangles & Th) ; class CrackedTriangle { friend class Triangles; friend class CrackedEdge; friend ostream& operator <<(ostream& f, const Triangles & Th) ; Triangle * t; // edge of triangle t int i; // edge number of in triangle Edge *edge; // the 2 edge Vertex *New[2]; // new vertex number CrackedTriangle() : t(0),i(0),edge(0) { New[0]=New[1]=0;} CrackedTriangle(Edge * a) : t(0),i(0),edge(a) { New[0]=New[1]=0;} void Crack(){ Triangle & T(*t); int i0=VerticesOfTriangularEdge[i][0]; int i1=VerticesOfTriangularEdge[i][0]; assert(New[0] && New[1]); T(i0) = New[0]; T(i1) = New[1];} void UnCrack(){ Triangle & T(*t); int i0=VerticesOfTriangularEdge[i][0]; int i1=VerticesOfTriangularEdge[i][0]; assert(New[0] && New[1]); T(i0) = TheVertex(T(i0)); T(i1) = TheVertex(T(i1));} void Set() { TriangleAdjacent ta ( FindTriangleAdjacent(*edge)); t = ta; i = ta; New[0] = ta.EdgeVertex(0); New[1] = ta.EdgeVertex(1); // warning the ref } }; // end of class CrackedTriangle public: CrackedTriangle a,b; CrackedEdge() :a(),b() {} CrackedEdge(Edge * start, Int4 i,Int4 j) : a(start+i),b(start+j) {}; CrackedEdge(Edge * e0, Edge * e1 ) : a(e0),b(e1) {}; void Crack() { a.Crack(); b.Crack();} void UnCrack() { a.UnCrack(); b.UnCrack();} void Set() { a.Set(), b.Set();} }; ///////////////////////////////////////////////////////////////////////////////////// class Triangles { public: enum TypeFileMesh { AutoMesh=0,BDMesh=1,NOPOMesh=2,amMesh=3,am_fmtMesh=4,amdbaMesh=5, //-----------------------------ajout format hdf5-----------------------------// // ftqMesh=6,mshMesh=7}; ftqMesh=6,mshMesh=7,hdf5Mesh=8}; //-----------------------------ajout format hdf5-----------------------------// int static counter; // to kown the number of mesh in memory int OnDisk; // true if on disk Geometry & Gh; // Geometry Triangles & BTh; // Background Mesh Bth==*this =>no background Int4 NbRef; // counter of ref on the this class if 0 we can delete Int4 nbvx,nbtx; // nombre max de sommets , de triangles Int4 nt,nbv,nbt,nbiv,nbe; // nb of legal triangles, nb of vertex, of triangles, // of initial vertices, of edges with reference, Int4 NbOfQuad; // nb of quadrangle Int4 NbSubDomains; // Int4 NbOutT; // Nb of oudeside triangle Int4 NbOfTriangleSearchFind; Int4 NbOfSwapTriangle; char * name, *identity; Vertex * vertices; // data of vertices des sommets Int4 NbVerticesOnGeomVertex; VertexOnGeom * VerticesOnGeomVertex; Int4 NbVerticesOnGeomEdge; VertexOnGeom * VerticesOnGeomEdge; Int4 NbVertexOnBThVertex; VertexOnVertex *VertexOnBThVertex; Int4 NbVertexOnBThEdge; VertexOnEdge *VertexOnBThEdge; Int4 NbCrackedVertices; Int4 NbCrackedEdges; CrackedEdge *CrackedEdges; R2 pmin,pmax; // extrema Real8 coefIcoor; // coef to integer Icoor1; Triangle * triangles; Edge * edges; QuadTree *quadtree; Vertex ** ordre; SubDomain * subdomains; ListofIntersectionTriangles lIntTria; int warning ; // end of variable Triangles(Int4 i);//:BTh(*this),Gh(*new Geometry()){PreInit(i);} void clear(); ~Triangles() {if(NbRef==0) {clear();NbRef=-1;}} Triangles(const char * ,Real8=-1) ; Triangles(Int4 nbvx,Triangles & BT,int keepBackVertices=1) :Gh(BT.Gh),BTh(BT) { try {GeomToTriangles1(nbvx,keepBackVertices);} catch(...) { this->clear(); throw; } } Triangles(Int4 nbvx,Geometry & G) :Gh(G),BTh(*this){ try { GeomToTriangles0(nbvx);} catch(...) { this->clear(); throw; } } Triangles(Triangles &,Geometry * pGh=0,Triangles* pBTh=0,Int4 nbvxx=0 ); // COPY OPERATEUR // Triangles(Triangles &){ cerr << " BUG call copy opretor of Triangles" << endl;MeshError(111);} Triangles(const Triangles &,const int *flag,const int *bb); // truncature void SetIntCoor(const char * from =0); // void RandomInit(); // void CubeInit(int ,int); Real8 MinimalHmin() {return 2.0/coefIcoor;} Real8 MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);} const Vertex & operator[] (Int4 i) const { return vertices[i];}; Vertex & operator[](Int4 i) { return vertices[i];}; const Triangle & operator() (Int4 i) const { return triangles[i];}; Triangle & operator()(Int4 i) { return triangles[i];}; I2 toI2(const R2 & P) const { return I2( (Icoor1) (coefIcoor*(P.x-pmin.x)) ,(Icoor1) (coefIcoor*(P.y-pmin.y)) );} R2 toR2(const I2 & P) const { return R2( (double) P.x/coefIcoor+pmin.x, (double) P.y/coefIcoor+pmin.y);} void Add( Vertex & s,Triangle * t,Icoor2 * =0) ; void Insert(); // void InsertOld(); void ForceBoundary(); void Heap(); void FindSubDomain(int ); Int4 ConsRefTriangle(Int4 *) const; void ShowHistogram() const; void ShowRegulaty() const; // Add FH avril 2007 // void ConsLinkTriangle(); void ReMakeTriangleContainingTheVertex(); void UnMarkUnSwapTriangle(); void SmoothMetric(Real8 raisonmax) ; void BoundAnisotropy(Real8 anisomax,double hminaniso= 1e-100) ; void MaxSubDivision(Real8 maxsubdiv); void WriteMetric(ostream &,int iso) ; Edge** MakeGeometricalEdgeToEdge(); void SetVertexFieldOn(); void SetVertexFieldOnBTh(); Int4 SplitInternalEdgeWithBorderVertices(); void MakeQuadrangles(double costheta); int SplitElement(int choice); void MakeQuadTree(); void NewPoints( Triangles &,int KeepBackVertex =1 ); Int4 InsertNewPoints(Int4 nbvold,Int4 & NbTSwap) ; void NewPointsOld( Triangles & ); void NewPoints(int KeepBackVertex=1){ NewPoints(*this,KeepBackVertex);} void ReNumberingTheTriangleBySubDomain(bool justcompress=false); void ReNumberingVertex(Int4 * renu); void SmoothingVertex(int =3,Real8=0.3); Metric MetricAt (const R2 &) const; GeometricalEdge * ProjectOnCurve( Edge & AB, Vertex & A, Vertex & B,Real8 theta, Vertex & R,VertexOnEdge & BR,VertexOnGeom & GR); void WriteElements(ostream& f,Int4 * reft ,Int4 nbInT) const; Int4 Number(const Triangle & t) const { return &t - triangles;} Int4 Number(const Triangle * t) const { return t - triangles;} Int4 Number(const Vertex & t) const { return &t - vertices;} Int4 Number(const Vertex * t) const { return t - vertices;} Int4 Number(const Edge & t) const { return &t - edges;} Int4 Number(const Edge * t) const { return t - edges;} Int4 Number2(const Triangle * t) const { // if(t>= triangles && t < triangles + nbt ) return t - triangles; // else return t - OutSidesTriangles; } Vertex * NearestVertex(Icoor1 i,Icoor1 j) ; Triangle * FindTriangleContening(const I2 & ,Icoor2 [3],Triangle *tstart=0) const; void Write(const char * filename,const TypeFileMesh type = AutoMesh); void Write_am_fmt(ostream &) const ; void Write_am(ostream &) const ; void Write_ftq(ostream &) const ; void Write_nopo(ostream &) const ; void Write_msh(ostream &) const ; //-----------------------------ajout format hdf5-----------------------------// void Write_hdf5(const char * filename) const ; //-----------------------------ajout format hdf5-----------------------------// void Write_amdba(ostream &) const ; void Read(MeshIstream &,int version,Real8 cutoffradian); void Read_am_fmt(MeshIstream &); void Read_amdba(MeshIstream &); void Read_am(MeshIstream &); void Read_nopo(MeshIstream &); void Read_ftq(MeshIstream &); void Read_msh(MeshIstream &); void ReadMetric(const char * fmetrix,const Real8 hmin,const Real8 hmax,const Real8 coef); void IntersectConsMetric(const double * s,const Int4 nbsol,const int * typsols, const Real8 hmin,const Real8 hmax, const Real8 coef, const Real8 anisomax,const Real8 CutOff=1.e-4,const int NbJacobi=1, const int DoNormalisation=1, const double power=1.0, const int choise=0); void IntersectGeomMetric(const Real8 err,const int iso); int isCracked() const {return NbCrackedVertices != 0;} int Crack(); int UnCrack(); #ifdef DEBUG void inline Check(); #endif #ifdef DRAWING void Draw() const ; void InitDraw() const ; void inquire() ; #endif friend ostream& operator <<(ostream& f, const Triangles & Th); void Write(const char * filename); void ConsGeometry(Real8 =-1.0,int *equiedges=0); // construct a geometry if no geo void FillHoleInMesh() ; int CrackMesh(); private: void GeomToTriangles1(Int4 nbvx,int KeepBackVertices=1);// the real constructor mesh adaption void GeomToTriangles0(Int4 nbvx);// the real constructor mesh generator void PreInit(Int4,char * =0 ); // void Write_nop5(OFortranUnFormattedFile * f, Int4 &lnop5,Int4 &nef,Int4 &lgpdn,Int4 ndsr) const ; }; // End Class Triangles ///////////////////////////////////////////////////////////////////////////////////// class Geometry { public: int OnDisk; Int4 NbRef; // counter of ref on the this class if 0 we can delete char *name; Int4 nbvx,nbtx; // nombre max de sommets , de Geometry Int4 nbv,nbt,nbiv,nbe; // nombre de sommets, de Geometry, de sommets initiaux, Int4 NbSubDomains; // Int4 NbEquiEdges; Int4 NbCrackedEdges; // Int4 nbtf;// de triangle frontiere Int4 NbOfCurves; int empty(){return (nbv ==0) && (nbt==0) && (nbe==0) && (NbSubDomains==0); } GeometricalVertex * vertices; // data of vertices des sommets Triangle * triangles; GeometricalEdge * edges; QuadTree *quadtree; GeometricalSubDomain *subdomains; Curve *curves; ~Geometry(); Geometry(const Geometry & Gh); //Copy Operator Geometry(int nbg,const Geometry ** ag); // intersection operator R2 pmin,pmax; // extrema Real8 coefIcoor; // coef to integer Icoor1; Real8 MaximalAngleOfCorner; // end of data I2 toI2(const R2 & P) const { return I2( (Icoor1) (coefIcoor*(P.x-pmin.x)) ,(Icoor1) (coefIcoor*(P.y-pmin.y)) );} Real8 MinimalHmin() {return 2.0/coefIcoor;} Real8 MaximalHmax() {return Max(pmax.x-pmin.x,pmax.y-pmin.y);} void ReadGeometry(const char * ) ; void ReadGeometry(MeshIstream & ,const char *) ; void EmptyGeometry(); Geometry() {EmptyGeometry();}// empty Geometry void AfterRead(); Geometry(const char * filename) {EmptyGeometry();OnDisk=1;ReadGeometry(filename);AfterRead();} void ReadMetric(const char *,Real8 hmin,Real8 hmax,Real8 coef); const GeometricalVertex & operator[] (Int4 i) const { return vertices[i];}; GeometricalVertex & operator[](Int4 i) { return vertices[i];}; const GeometricalEdge & operator() (Int4 i) const { return edges[i];}; GeometricalEdge & operator()(Int4 i) { return edges[i];}; Int4 Number(const GeometricalVertex & t) const { return &t - vertices;} Int4 Number(const GeometricalVertex * t) const { return t - vertices;} Int4 Number(const GeometricalEdge & t) const { return &t - edges;} Int4 Number(const GeometricalEdge * t) const { return t - edges;} Int4 Number(const Curve * c) const { return c - curves;} void UnMarkEdges() { for (Int4 i=0;i=0) { t = at[a]; // if (t-this<0) return 0; v2 = ns[VerticesOfTriangularEdge[a][0]]; v0 = ns[VerticesOfTriangularEdge[a][1]]; v1 = ns[OppositeEdge[a]]; v3 = t->ns[OppositeEdge[aa[a]&3]]; } } return t; } inline double Triangle::QualityQuad(int a,int option) const { // first do the logique part double q; if (!link || aa[a] &4) q= -1; else { Triangle * t = at[a]; if (t-this<0) q= -1;// because we do 2 times else if (!t->link ) q= -1; else if (aa[0] & 16 || aa[1] & 16 || aa[2] & 16 || t->aa[0] & 16 || t->aa[1] & 16 || t->aa[2] & 16 ) q= -1; else if(option) { const Vertex & v2 = *ns[VerticesOfTriangularEdge[a][0]]; const Vertex & v0 = *ns[VerticesOfTriangularEdge[a][1]]; const Vertex & v1 = *ns[OppositeEdge[a]]; const Vertex & v3 = * t->ns[OppositeEdge[aa[a]&3]]; q = QuadQuality(v0,v1,v2,v3); // do the float part } else q= 1; } return q; } inline void Vertex::Set(const Vertex & rec,const Triangles & ,Triangles & ) { *this = rec; } inline void GeometricalVertex::Set(const GeometricalVertex & rec,const Geometry & ,const Geometry & ) { *this = rec; } inline void Edge::Set(const Triangles & Th ,Int4 i,Triangles & ThNew) { *this = Th.edges[i]; v[0] = ThNew.vertices + Th.Number(v[0]); v[1] = ThNew.vertices + Th.Number(v[1]); if (on) on = ThNew.Gh.edges+Th.Gh.Number(on); if (adj[0]) adj[0] = ThNew.edges + Th.Number(adj[0]); if (adj[1]) adj[1] = ThNew.edges + Th.Number(adj[1]); } inline void GeometricalEdge::Set(const GeometricalEdge & rec,const Geometry & Gh ,Geometry & GhNew) { *this = rec; v[0] = GhNew.vertices + Gh.Number(v[0]); v[1] = GhNew.vertices + Gh.Number(v[1]); if (Adj[0]) Adj[0] = GhNew.edges + Gh.Number(Adj[0]); if (Adj[1]) Adj[1] = GhNew.edges + Gh.Number(Adj[1]); } inline void Curve::Set(const Curve & rec,const Geometry & Gh ,Geometry & GhNew) { *this = rec; be = GhNew.edges + Gh.Number(be); ee = GhNew.edges + Gh.Number(ee); if(next) next= GhNew.curves + Gh.Number(next); } inline void Triangle::Set(const Triangle & rec,const Triangles & Th ,Triangles & ThNew) { *this = rec; if ( ns[0] ) ns[0] = ThNew.vertices + Th.Number(ns[0]); if ( ns[1] ) ns[1] = ThNew.vertices + Th.Number(ns[1]); if ( ns[2] ) ns[2] = ThNew.vertices + Th.Number(ns[2]); if(at[0]) at[0] = ThNew.triangles + Th.Number(at[0]); if(at[1]) at[1] = ThNew.triangles + Th.Number(at[1]); if(at[2]) at[2] = ThNew.triangles + Th.Number(at[2]); if (link >= Th.triangles && link < Th.triangles + Th.nbt) link = ThNew.triangles + Th.Number(link); } inline void VertexOnVertex::Set(const Triangles & Th ,Int4 i,Triangles & ThNew) { *this = Th.VertexOnBThVertex[i]; v = ThNew.vertices + Th.Number(v); } inline void SubDomain::Set(const Triangles & Th ,Int4 i,Triangles & ThNew) { *this = Th.subdomains[i]; assert( head - Th.triangles >=0 && head - Th.triangles < Th.nbt); head = ThNew.triangles + Th.Number(head) ; assert(edge - Th.edges >=0 && edge - Th.edges < Th.nbe); edge = ThNew.edges+ Th.Number(edge); } inline void GeometricalSubDomain::Set(const GeometricalSubDomain & rec,const Geometry & Gh ,const Geometry & GhNew) { *this = rec; edge = Gh.Number(edge) + GhNew.edges; } inline void VertexOnEdge::Set(const Triangles & Th ,Int4 i,Triangles & ThNew) { *this = Th.VertexOnBThEdge[i]; v = ThNew.vertices + Th.Number(v); } inline void VertexOnGeom::Set(const VertexOnGeom & rec,const Triangles & Th ,Triangles & ThNew) { *this = rec; mv = ThNew.vertices + Th.Number(mv); if (gv) { if (abscisse < 0 ) gv = ThNew.Gh.vertices + Th.Gh.Number(gv); else ge = ThNew.Gh.edges + Th.Gh.Number(ge); } } inline Real8 Edge::MetricLength() const { return LengthInterpole(v[0]->m,v[1]->m,v[1]->r - v[0]->r) ; } inline void Triangles::ReMakeTriangleContainingTheVertex() { Int4 i; for ( i=0;iat[a]=ta.t; t->aa[a]=ta.a|l;} if(ta.t) { ta.t->at[ta.a] = t ; ta.t->aa[ta.a] = a| l ; } } inline int TriangleAdjacent::Locked() const { return t->aa[a] &4;} inline int TriangleAdjacent::Cracked() const { return t->aa[a] &32;} inline int TriangleAdjacent::GetAllFlag_UnSwap() const { return t->aa[a] & 1012;} // take all flag except MarkUnSwap inline int TriangleAdjacent::MarkUnSwap() const { return t->aa[a] &8;} inline void TriangleAdjacent::SetLock(){ t->SetLocked(a);} inline void TriangleAdjacent::SetCracked() { t->SetCracked(a);} inline TriangleAdjacent TriangleAdjacent::Adj() const { return t->Adj(a);} inline Vertex * TriangleAdjacent::EdgeVertex(const int & i) const {return t->ns[VerticesOfTriangularEdge[a][i]]; } inline Vertex * TriangleAdjacent::OppositeVertex() const {return t->ns[bamg::OppositeVertex[a]]; } inline Icoor2 & TriangleAdjacent::det() const { return t->det;} inline TriangleAdjacent Adj(const TriangleAdjacent & a) { return a.Adj();} inline TriangleAdjacent Next(const TriangleAdjacent & ta) { return TriangleAdjacent(ta.t,NextEdge[ta.a]);} inline TriangleAdjacent Previous(const TriangleAdjacent & ta) { return TriangleAdjacent(ta.t,PreviousEdge[ta.a]);} inline void Adj(GeometricalEdge * & on,int &i) {int j=i;i=on->SensAdj[i];on=on->Adj[j];} inline Real4 qualite(const Vertex &va,const Vertex &vb,const Vertex &vc) { Real4 ret; I2 ia=va,ib=vb,ic=vc; I2 ab=ib-ia,bc=ic-ib,ac=ic-ia; Icoor2 deta=Det(ab,ac); if (deta <=0) ret = -1; else { Real8 a = sqrt((Real8) (ac,ac)), b = sqrt((Real8) (bc,bc)), c = sqrt((Real8) (ab,ab)), p = a+b+c; Real8 h= Max(Max(a,b),c),ro=deta/p; ret = ro/h;} return ret; } inline Triangle::Triangle(Triangles *Th,Int4 i,Int4 j,Int4 k) { Vertex *v=Th->vertices; Int4 nbv = Th->nbv; assert(i >=0 && j >=0 && k >=0); assert(i < nbv && j < nbv && k < nbv); ns[0]=v+i; ns[1]=v+j; ns[2]=v+k; at[0]=at[1]=at[2]=0; aa[0]=aa[1]=aa[2]=0; det=0; } inline Triangle::Triangle(Vertex *v0,Vertex *v1,Vertex *v2){ ns[0]=v0; ns[1]=v1; ns[2]=v2; at[0]=at[1]=at[2]=0; aa[0]=aa[1]=aa[2]=0; if (v0) det=0; else { det=-1; link=NULL;}; } inline Real4 Triangle::qualite() { return det < 0 ? -1 : bamg::qualite(*ns[0],*ns[1],*ns[2]); } Int4 inline Vertex::Optim(int i,int koption) { Int4 ret=0; if ( t && (vint >= 0 ) && (vint <3) ) { ret = t->Optim(vint,koption); if(!i) { t =0; // for no future optime vint= 0; } } return ret; } Icoor2 inline det(const Vertex & a,const Vertex & b,const Vertex & c) { Icoor2 bax = b.i.x - a.i.x ,bay = b.i.y - a.i.y; Icoor2 cax = c.i.x - a.i.x ,cay = c.i.y - a.i.y; return bax*cay - bay*cax;} void swap(Triangle *t1,Int1 a1, Triangle *t2,Int1 a2, Vertex *s1,Vertex *s2,Icoor2 det1,Icoor2 det2); int inline TriangleAdjacent::swap() { return t->swap(a);} int SwapForForcingEdge(Vertex * & pva ,Vertex * & pvb , TriangleAdjacent & tt1,Icoor2 & dets1, Icoor2 & detsa,Icoor2 & detsb, int & nbswap); int ForceEdge(Vertex &a, Vertex & b,TriangleAdjacent & taret) ; // inline bofbof FH inline TriangleAdjacent FindTriangleAdjacent(Edge &E) { Vertex * a = E.v[0]; Vertex * b = E.v[1]; Triangle * t = a->t; int i = a->vint; TriangleAdjacent ta(t,EdgesVertexTriangle[i][0]); // Previous edge assert(t && i>=0 && i < 3); assert( a == (*t)(i)); int k=0; do { // turn around vertex in direct sens (trigo) k++;assert(k< 20000); // in no crack => ta.EdgeVertex(1) == a otherwise ??? if (ta.EdgeVertex(1) == a && ta.EdgeVertex(0) == b) return ta; // find ta = ta.Adj(); if (ta.EdgeVertex(0) == a && ta.EdgeVertex(1) == b) return ta; // find --ta; } while (t != (Triangle *)ta); assert(0); return TriangleAdjacent(0,0);// error } inline Vertex * TheVertex(Vertex * a) // give a unique vertex with smallest number { // in case on crack in mesh Vertex * r(a), *rr; Triangle * t = a->t; int i = a->vint; TriangleAdjacent ta(t,EdgesVertexTriangle[i][0]); // Previous edge assert(t && i>=0 && i < 3); assert( a == (*t)(i)); int k=0; do { // turn around vertex in direct sens (trigo) k++;assert(k< 20000); // in no crack => ta.EdgeVertex(1) == a if ((rr=ta.EdgeVertex(0)) < r) r = rr; ta = ta.Adj(); if ((rr=ta.EdgeVertex(1)) < r) r =rr; --ta; } while (t != (Triangle*) ta); return r; } inline double CPUtime(){ #ifdef SYSTIMES struct tms buf; if (times(&buf)!=-1) return ((double)buf.tms_utime+(double)buf.tms_stime)/(long) sysconf(_SC_CLK_TCK); else #endif return ((double) clock())/CLOCKS_PER_SEC; } #ifdef DEBUG void inline Triangle::checka(Int1 a) { // verif de la coherence des adjacences de l arete a a = a%4; assert(a < 3 && a >= 0 ); Triangle *t1=this,*t2=at[a]; Int2 a1=a,a2=aa[a]%4; assert(a2 < 3 && a2 >= 0 ); if (t2 && ( ((*t1).ns[VerticesOfTriangularEdge[a1][0]] != (*t2).ns[VerticesOfTriangularEdge[a2][1]]) || ((*t1).ns[VerticesOfTriangularEdge[a1][1]] != (*t2).ns[VerticesOfTriangularEdge[a2][0]]))) { if (CurrentTh) cerr << " In Triangles beetween Triangle " << CurrentTh->Number(t1) << " and " << CurrentTh->Number(t2) << endl; cerr << "---- t1="<< t1 << " " << a1 <<", t2="<< t2 << " " << a2 << endl; cerr <<"t1="<< t1 << " " << a1 << " " << t1->ns[VerticesOfTriangularEdge[a1][0]] << " " << t1->ns[VerticesOfTriangularEdge[a1][1]] <Number(t1->ns[VerticesOfTriangularEdge[a1][0]]) << " " << CurrentTh->Number(t1->ns[VerticesOfTriangularEdge[a1][1]]) <ns[VerticesOfTriangularEdge[a2][0]] << " " << t2->ns[VerticesOfTriangularEdge[a2][1]] <Number(t2->ns[VerticesOfTriangularEdge[a2][0]]) << " " << CurrentTh->Number(t2->ns[VerticesOfTriangularEdge[a2][1]]) <aa[a1]/4 == t2->aa[a2]/4); // lock compatibite } void inline Triangle::check() { Icoor2 det2=0; // cout << " check " << this << endl; int infv=ns[0] ? (( ns[1] ? ( ns[2] ? -1 : 2) : 1 )) : 0; if (det<0) { if (infv<0 ) { if (CurrentTh) cerr << " In Triangles " << CurrentTh->Number(this) << endl; cerr << " det = " << det << " and " << infv << endl; MeshError(5); }} else if (infv>=0 ) { if (CurrentTh) cerr << " In Triangles " << CurrentTh->Number(this) << endl; cerr << " det = " << det << " and " << infv << endl; MeshError(5); } if (det >=0) if( det != (det2=bamg::det(*ns[0],*ns[1],*ns[2]))) { // penthickness(4);Draw(); if (CurrentTh) cerr << " In Triangles" << CurrentTh->Number(this) << endl; cerr << *ns[0] << *ns[1] << " " << *ns[2] << " " << endl; cerr << " Bug in triangle " << this << ":" << det << " != " << det2 << endl; MeshError(5); } checka(0); checka(1); checka(2); // if (ns[0]) assert( ns[0] - Meshbegin >= 0 ); // if (ns[0]) assert( Meshend - ns[0] >= 0 ); // if (ns[1]) assert( ns[1] - Meshbegin >= 0 ); // if (ns[1]) assert( Meshend - ns[1] >= 0 ); // if (ns[2]) assert( ns[2] - Meshbegin >= 0 ); // if (ns[2]) assert( Meshend - ns[2] >= 0 ); assert(ns[0] != ns[2]); assert(ns[1] != ns[2]); assert(ns[0] != ns[1]); } #endif #ifdef DRAWING extern Real4 xGrafCoef,yGrafCoef,xGrafOffSet,yGrafOffSet; // R2 -> I2 transform extern R2 Gpmin,Gpmax; //extern Real8 Gh; // cf routine ILineTo IMoveto extern void IMoveTo(long i,long j); extern void ILineTo(long i,long j); extern char Getxyc(long &i,long &j); extern void Draw(float ,float ); extern void Draw(long ,long ); extern void DrawMark(R2 r); //inline void DrawMark(D2 r) {DrawMark(R2(r.x,r.y));} inline void Move(I2 x) {IMoveTo(x.x,x.y);} inline void Move(R2 x) {rmoveto(x.x,x.y);} //inline void Move(D2 x) {rmoveto(x.x,x.y);} inline void Line(I2 x){ILineTo(x.x,x.y);} inline void Line(R2 x) {rlineto(x.x,x.y);} //inline void Line(D2 x) {rlineto(x.x,x.y);} #endif } freefem++-3.38-1/src/bamglib/MeshDraw.cpp000644 000767 000024 00000055301 12310010353 020176 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef DRAWING #include #include #include #include #include using namespace std; #include "Mesh2.h" #include "QuadTree.h" #include "SetOfE4.h" extern bool withrgraphique; namespace bamg { Real4 xGrafCoef,yGrafCoef,xGrafOffSet,yGrafOffSet; R2 GrafPMin,GrafPMax; Real8 Grafh=0; void IMoveTo(long i,long j) { if (!withrgraphique) return; rmoveto(float(i)/xGrafCoef+xGrafOffSet ,float(j)/yGrafCoef+yGrafOffSet );} void ILineTo(long i,long j) { if (!withrgraphique) return; rlineto(float(i)/xGrafCoef+xGrafOffSet ,float(j)/yGrafCoef+yGrafOffSet );} void Triangles::Draw( ) const { if (!withrgraphique) return; showgraphic(); // if (!init) InitDraw(); Int4 i; // for (i=0;ir.x,v[1]->r.x), Max(v[0]->r.y,v[1]->r.y), Min(v[0]->r.x,v[1]->r.x), Max(v[0]->r.y,v[1]->r.y))) { v[0]->MoveTo(); v[1]->LineTo(); R2 M= ((R2) *v[0] + (R2) * v[1])*0.5; Move(M); char VertexDraw_i10[20]; if (i<0) sprintf(VertexDraw_i10,"%p",this); else sprintf(VertexDraw_i10,"%ld",i); if (i>=0) plotstring(&VertexDraw_i10[0]); } } void Vertex::Draw(Int4 i) const { if (!withrgraphique) return; if (CurrentTh && i<0&& i != -2 ) { if (CurrentTh->vertices <= this && this < CurrentTh->vertices + CurrentTh->nbv) i = CurrentTh->Number(this); } if (InPtScreen(r.x,r.y)) { char VertexDraw_i10[20]; if (i<0) sprintf(VertexDraw_i10,"%p",this); else sprintf(VertexDraw_i10,"%ld",i); showgraphic(); // float eps = (MaxICoor/yGrafCoef)/100; DrawMark(r); if (i>=0) plotstring(&VertexDraw_i10[0]); } } void DrawMark(R2 r) { if (!withrgraphique) return; if (InPtScreen(r.x,r.y)) { float eps = Grafh/100; rmoveto(r.x+eps,r.y); rlineto(r.x,r.y+eps); rlineto(r.x-eps,r.y); rlineto(r.x,r.y-eps); rlineto(r.x+eps,r.y);} } void Triangle::Draw(Int4 i ) const { if (!withrgraphique) return; // int cc=LaCouleur(); if (CurrentTh && i<0 && i != -2) { if (CurrentTh->triangles <= this && this < CurrentTh->triangles + CurrentTh->nbt) i = CurrentTh->Number(this); } char i10[20]; if (i<0) sprintf(i10,"%p",this); else sprintf(i10,"%ld",i); showgraphic(); if (ns[0] == 0) { if (InRecScreen(Min(ns[1]->r.x,ns[2]->r.x), Min(ns[1]->r.y,ns[2]->r.y), Max(ns[1]->r.x,ns[2]->r.x), Max(ns[1]->r.y,ns[2]->r.y))) { rmoveto(ns[1]->r.x,ns[1]->r.y); rlineto(ns[2]->r.x,ns[2]->r.y); rmoveto( (ns[1]->r.x + ns[2]->r.x)/2.0 + (ns[1]->r.y - ns[2]->r.y)*0.1, (ns[1]->r.y + ns[2]->r.y)/2.0 - (ns[1]->r.x - ns[2]->r.x)*0.1 ); if(i>=0) plotstring(&i10[0]); }} else if (InRecScreen(Min3(ns[0]->r.x,ns[1]->r.x,ns[2]->r.x), Min3(ns[0]->r.y,ns[1]->r.y,ns[2]->r.y), Max3(ns[0]->r.x,ns[1]->r.x,ns[2]->r.x), Max3(ns[0]->r.y,ns[1]->r.y,ns[2]->r.y))) { { const int i0=0 , j01=EdgesVertexTriangle[i0][1];// j01==2 const int i1=VerticesOfTriangularEdge[j01][1], j12=EdgesVertexTriangle[i1][1];//i1=1,j12=0 const int i2=VerticesOfTriangularEdge[j12][1], j20=EdgesVertexTriangle[i2][1];//i1=2,j20=1 rmoveto(ns[i0]->r.x,ns[i0]->r.y); if(Hidden(j01)) rmoveto(ns[i1]->r.x,ns[i1]->r.y); else rlineto(ns[i1]->r.x,ns[i1]->r.y); if(Hidden(j12)) rmoveto(ns[i2]->r.x,ns[i2]->r.y); else rlineto(ns[i2]->r.x,ns[i2]->r.y); if(Hidden(j20)) rmoveto(ns[i0]->r.x,ns[i0]->r.y); else rlineto(ns[i0]->r.x,ns[i0]->r.y); rmoveto( (ns[0]->r.x + ns[1]->r.x + ns[2]->r.x)/3.0 , (ns[0]->r.y + ns[1]->r.y + ns[2]->r.y)/3.0); } if(i>=0) plotstring(&i10[0]); } // LaCouleur(cc); } void Triangles::InitDraw() const { if (!withrgraphique) return; couleur(1); GrafPMin = vertices[0].r; GrafPMax = vertices[0].r; // recherche des extrema des vertices GrafPMin,GrafPMax Int4 i; for (i=0;i2) cout << "inquire: Nb de Triangle reel = " < draw metric o=> optim around (debug)",i++); Show("t: find triangle contening the point with brute force",i++); Show("e: find the nearest edge of triangle contening the point",i++); Show("C: construct the in-circle in anistrope way",i++); Show("n: show normal for find ",i++); } if (c=='p') openPS(0),PS=1; if (c=='P') closePS(),PS=0; if (c=='B') BTh.inquire(); if ( c=='D') { for(int iter=0;iter < 50;iter++) { int k = 0; for (Int4 icount=0; icount=0) { couleur(2+(reft[i])%6); triangles[i].Draw(reft[i]); couleur(1); } } if (c=='b') { Int4 i; reffecran(); for (i=0;iDraw(Number(tb)); penthickness(1); if(tb->link==0) { double a,b; TriangleAdjacent ta=CloseBoundaryEdgeV2(I,tb,a,b); R2 A = *ta.EdgeVertex(0); R2 B = *ta.EdgeVertex(1); //Triangle * tt = ta; // tt->Draw(Number(tt)); penthickness(5); // ta.EdgeVertex(0)->MoveTo(); // ta.EdgeVertex(1)->LineTo(); DrawMark(A*a+B*b); penthickness(1); } } if (c=='v' || c=='o' || c=='s' ) { couleur(3); if(!setv) ReMakeTriangleContainingTheVertex(); setv=1; R2 XY(x,y),P; Real8 d; Int4 i,j=0; P = XY - vertices[0].r; d = (P,P); for (i=0;iMoveTo(); tta.EdgeVertex(1)->LineTo(); cout << " Edge " << Number(tta.EdgeVertex(0)) << " " << Number(tta.EdgeVertex(1)) << endl; for (Int4 k=0;kr.x,s1->r.y); D2 SA(sa->r.x,sa->r.y); D2 SB(sb->r.x,sb->r.y); D2 AB= SB-SA; D2 MAB2=SB + SA; D2 M1A=(S1 + SA)*0.5; D2 MAB(MAB2.x*0.5,MAB2.y*0.5); D2 A1=S1-SA; D2 D = S1 - SB ; { Metric M=s1->m; D2 ABo = M.Orthogonal(AB); D2 A1o = M.Orthogonal(A1); penthickness(1); Move(MAB); Line(MAB+ABo); Line(MAB-ABo); Move(M1A); Line(M1A+A1o); Line(M1A-A1o); penthickness(3); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 cout << " d = " << d << " dd= " << dd << endl; if (Abs(d) > dd*1.e-10) { D2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); cout << C << s1->r <r <r << endl; DrawMark(C); cout << M << " l = "<< M(C-S1) << " lnew = 1 == " ; //M.Draw(R2(C.x,C.y)); M=M/M(C-S1); cout << M(C-S1) << M << endl; M.Draw(R2(C.x,C.y)); } } } break; } cout << " fin recherche triangle " << endl; couleur(1); } if (c=='='||c==249) { rd=1; float hx = (GrafPMax.x-GrafPMin.x); float hy = (GrafPMax.y-GrafPMin.y); Grafh = Max(hx,hy)*0.55; cadreortho((GrafPMin.x+GrafPMax.x)*0.5,(GrafPMin.y+GrafPMax.y)*0.55,Grafh); } penthickness(1); if (rd) reffecran(),Draw(); } // cout << endl; delete [] reft; CurrentTh = OldCurrentTh; } void Draw(float x,float y) { if (!withrgraphique) return; if (InPtScreen(x,y)) { float eps = Max(GrafPMax.x-GrafPMin.x,GrafPMax.y-GrafPMin.y)/100; rmoveto(x+eps,y); rlineto(x,y+eps); rlineto(x-eps,y); rlineto(x,y-eps); rlineto(x+eps,y);} } char Getxyc(long &i,long &j) { if (!withrgraphique) return 0; float x,y; char c=::Getxyc(x,y); i = (long)( (x - xGrafOffSet)*xGrafCoef); j = (long)((y - yGrafOffSet)*yGrafCoef); return c; } void Draw(long i,long j) { if (!withrgraphique) return; Draw(((float) i)/xGrafCoef+xGrafOffSet ,((float) j)/yGrafCoef+yGrafOffSet ); } int Triangle::swapDRAW(Int2 a){ int NbUnSwap=0; if(a/4 !=0) {cout << a << "arete lock"<< a <ns[VerticesOfTriangularEdge[a1][0]]; Vertex *sb=t1->ns[VerticesOfTriangularEdge[a1][1]]; Vertex *s1=t1->ns[OppositeVertex[a1]]; Vertex *s2=t2->ns[OppositeVertex[a2]]; #ifdef DEBUG assert ( a >= 0 && a < 3 ); #endif Icoor2 det1=t1->det , det2=t2->det ; Icoor2 detT = det1+det2; Icoor2 detA = Abs(det1) + Abs(det2); Icoor2 detMin = Min(det1,det2); int OnSwap = 0; // si 2 triangle infini (bord) => detT = -2; if (sa == 0) {// les deux triangles sont frontieres det2=bamg::det(s2->i,sb->i,s1->i); OnSwap = det2 >0;} else if (sb == 0) { // les deux triangles sont frontieres det1=bamg::det(s1->i,sa->i,s2->i); OnSwap = det1 >0;} else if(( s1 != 0) && (s2 != 0) ) { det1 = bamg::det(s1->i,sa->i,s2->i); det2 = detT - det1; OnSwap = (Abs(det1) + Abs(det2)) < detA; Icoor2 detMinNew=Min(det1,det2); cout << " detMin = " << detMin << " detMinNew " << detMinNew << endl; if (! OnSwap &&(detMinNew>0)) { OnSwap = detMin ==0; if (! OnSwap) { int kopt = 1; while (1) if(kopt) { // critere de Delaunay pure Real8 xb1 = sb->i.x - s1->i.x, x21 = s2->i.x - s1->i.x, yb1 = sb->i.y - s1->i.y, y21 = s2->i.y - s1->i.y, xba = sb->i.x - sa->i.x, x2a = s2->i.x - sa->i.x, yba = sb->i.y - sa->i.y, y2a = s2->i.y - sa->i.y, cosb12 = xb1*x21 + yb1*y21 , cosba2 = xba*x2a + yba*y2a , sinb12 = det2, sinba2 = t2->det, //zsinba2 = t2->det; // angle b12 > angle ba2 => cotg(angle b12) < cotg(angle ba2) OnSwap = (cosb12 * sinba2) < (cosba2 * sinb12); if(CurrentTh) cout << "swap s1=" << CurrentTh->Number(sa) << " s2=" << CurrentTh->Number(sb) << " t1= " << CurrentTh->Number(t1) << " t2=" << CurrentTh->Number(t2) << " " ; cout << cosb12 << " " << sinba2 << " " << cosba2 << " " << sinb12 << " Onswap = " << OnSwap << endl; break; } else { // critere de Delaunay pure Real8 som; I2 AB=(I2) *sb - (I2) *sa; I2 MAB2=((I2) *sb + (I2) *sa); D2 MAB(MAB2.x*0.5,MAB2.y*0.5); I2 A1=(I2) *s1 - (I2) *sa; I2 D = (I2) * s1 - (I2) * sb ; D2 S2(s2->i.x,s2->i.y); D2 S1(s1->i.x,s1->i.y); D2 SA(sa->i.x,sa->i.y); D2 SB(sb->i.x,sb->i.y); DrawMark(s2->r); DrawMark(s1->r); DrawMark(sa->r); DrawMark(sb->r); { Metric M=s1->m; D2 ABo = M.Orthogonal(SB-SA); D2 A1o = M.Orthogonal(S1-SA); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 if (Abs(d) > dd*1.e-3) { D2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); cout << "M1 r2 =" << M(C - S2) << " r1 = " << M(C - S1) << "ra = " << M(C - SA) << " rb = " << M(C-SB) ; som = M(C - S2)/M(C - S1); cout << " r1/r2 = " << som << endl; } else {kopt=1;continue;} } { Metric M=s2->m; D2 ABo = M.Orthogonal(SB-SA); D2 A1o = M.Orthogonal(S1-SA); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 cout << " d = " << Abs(d) << " dd " << dd << endl; if(Abs(d) > dd*1.e-3) { D2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); cout << "M2 r1 =" << M(C - S2) << " r2 = " << M(C - S1) << "ra = " << M(C - SA) << " rb = " << M(C-SB) << " r1/r2 = " << M(C - S2)/M(C - S1) << endl; som += M(C - S2)/M(C - S1); } else {kopt=1;continue;} } { Metric M=sa->m; D2 ABo = M.Orthogonal(SB-SA); D2 A1o = M.Orthogonal(S1-SA); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 cout << " d = " << Abs(d) << " dd " << dd << endl; if(Abs(d) > dd*1.e-3) { D2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); cout << "M2 r1 =" << M(C - S2) << " r2 = " << M(C - S1) << "ra = " << M(C - SA) << " rb = " << M(C-SB) << " r1/r2 = " << M(C - S2)/M(C - S1) << endl; som += M(C - S2)/M(C - S1); } else {kopt=1;continue;} } { Metric M=sb->m; D2 ABo = M.Orthogonal(SB-SA); D2 A1o = M.Orthogonal(S1-SA); // (A+B)+ x ABo = (S1+B)/2+ y A1 // ABo x - A1o y = (S1+B)/2-(A+B)/2 = (S1-B)/2 = D/2 double dd = Abs(ABo.x*A1o.y)+Abs(ABo.y*A1o.x); double d = (ABo.x*A1o.y - ABo.y*A1o.x)*2; // because D/2 cout << " d = " << Abs(d) << " dd " << dd << endl; if(Abs(d) > dd*1.e-3) { D2 C(MAB+ABo*((D.x*A1o.y - D.y*A1o.x)/d)); cout << "M2 r1 =" << M(C - S2) << " r2 = " << M(C - S1) << "ra = " << M(C - SA) << " rb = " << M(C-SB) << " r1/r2 = " << M(C - S2)/M(C - S1) << endl; som += M(C - S2)/M(C - S1); } else {kopt=1;continue;} } cout << som << endl; OnSwap = som < 4; break; } } // OnSwap } // (! OnSwap &&(det1 > 0) && (det2 > 0) ) } cout << OnSwap << endl; if( OnSwap ) { couleur(0); t1->Draw(); t2->Draw(); bamg::swap(t1,a1,t2,a2,s1,s2,det1,det2); couleur(1); t1->Draw(); t2->Draw(); } else { NbUnSwap ++; t1->SetMarkUnSwap(a1); } return OnSwap; } void GeometricalEdge::Draw(Int4 i) { if (!withrgraphique) return; if (CurrentTh && i<0 && i != -2) { if (CurrentTh->Gh.edges <= this && this < CurrentTh->Gh.edges + CurrentTh->Gh.nbe) i = CurrentTh->Gh.Number((this)); } v[0]->MoveTo(); R2 x,x50; int k=0,k50=0; for (int ii = 0;ii<100;ii++) { x= F( Real4(ii)/100.0); if(ii==50) x50=x,k50=1; if (InPtScreen(x.x,x.y) ) {if(k) rlineto(x.x,x.y); else k=1,rmoveto(x.x,x.y);} } if (InPtScreen(v[1]->r.x,v[1]->r.y)) v[1]->LineTo(); char VertexDraw_i10[20]; if( k50) { if (i<0) sprintf(VertexDraw_i10,"Eg%p",this); else sprintf(VertexDraw_i10,"Eg%ld",i); rmoveto(x50.x,x50.y); plotstring(&VertexDraw_i10[0]); } } void Geometry::InitDraw() const { GrafPMin = vertices[0].r; GrafPMax = vertices[0].r; // recherche des extrema des vertices GrafPMin,GrafPMax Int4 i; for (i=0;i #include #include #include #include using namespace std; #include "Mesh2.h" #include "QuadTree.h" #include "SetOfE4.h" namespace bamg { void Triangles::ConsGeometry(Real8 cutoffradian,int *equiedges) // construct a geometry if no geo { // if equiedges existe taille nbe // equiedges[i]/2 == i original // equiedges[i]/2 = j => equivalence entre i et j => meme maillage // equiedges[i]%2 : 0 meme sens , 1 pas meme sens // // -------------------------- if (verbosity>1) cout << " -- construction of the geometry from the 2d mesh " << endl; if (nbt<=0 || nbv <=0 ) { MeshError(101);} // construction of the edges // Triangles * OldCurrentTh =CurrentTh; CurrentTh=this; // Int4 NbTold = nbt; // generation of the integer coor // generation of the adjacence of the triangles if (cutoffradian>=0) Gh.MaximalAngleOfCorner = cutoffradian; SetOfEdges4 * edge4= new SetOfEdges4(nbt*3,nbv); Int4 * st = new Int4[nbt*3]; Int4 i,k; int j; if (Gh.name) delete Gh.name; Gh.name = new char [ name ? strlen(name) + 15 : 50 ]; Gh.name[0]=0; strcat(Gh.name,"cons from: "); if (name) strcat(Gh.name,name); else strcat(Gh.name," a mesh with no name"); for (i=0;iaddtrie(Number(edges[i][0]),Number(edges[i][1])); } if (nbe != edge4->nb()) { cerr << " Some Double edge in the mesh, the number is " << nbe << " nbe4=" << edge4->nb() << endl; MeshError(1002); } for (i=0;iaddtrie(Number(triangles[i][VerticesOfTriangularEdge[j][0]]), Number(triangles[i][VerticesOfTriangularEdge[j][1]])); Int4 invisible = triangles[i].Hidden(j); if(st[k]==-1) st[k]=3*i+j; else if(st[k]>=0) { assert( ! triangles[i].TriangleAdj(j) && !triangles[st[k] / 3].TriangleAdj((int) (st[k]%3))); triangles[i].SetAdj2(j,triangles + st[k] / 3,(int) (st[k]%3)); if (invisible) triangles[i].SetHidden(j); if (knb(); // the total number of edges delete edge4; edge4 =0; if(verbosity>5) { if (name) cout << " On Mesh " << name << endl; cout << " - The number of Vertices = " << nbv << endl; cout << " - The number of Triangles = " << nbt << endl; cout << " - The number of given edge = " << nbe << endl; cout << " - The number of all edges = " << nbedges << endl; cout << " - The Euler number = 1-Nb Of Hole = " << nbt-nbedges+nbv << endl; } // check the consistant of edge[].adj and the geometrical required vertex k=0; kk=0; Int4 it; for (i=0;i4) cout << " Construction of the edges " << nbe << endl; for (i=0;i=0) // edge alone { it = st[i]/3; j = (int) (st[i]%3); add=k++; } if (add>=0 && add < nbe) { edges[add].v[0] = &triangles[it][VerticesOfTriangularEdge[j][0]]; edges[add].v[1] = &triangles[it][VerticesOfTriangularEdge[j][1]]; edges[add].on=0; if (iref(),edges[add].v[1]->ref()); // no a good choice } } assert(k==nbe); if (edgessave) delete [] edgessave; } // construction of edges[].adj for (i=0;icolor++; for (i=0;icolor,j0; if(i0<0) edges[i ].adj[ j ]=0; // Add FH Jan 2008 if(i0==-1) v->color=i*2+j; else if (i0>=0) {// i and i0 edge are adjacent by the vertex v j0 = i0%2; i0 = i0/2; assert( v == edges[i0 ].v[j0]); edges[i ].adj[ j ] =edges +i0; edges[i0].adj[ j0] =edges +i ; assert(edges[i0].v[j0] == v); // if(verbosity>8) // cout << " edges adj " << i0 << " "<< j0 << " <--> " << i << " " << j << endl; v->color = -3;} } // now reconstruct the sub domain info assert(!NbSubDomains); NbSubDomains=0; { Int4 it; // find all the sub domain Int4 *colorT = new Int4[nbt]; Triangle *tt,*t; Int4 k; for ( it=0;it0) if( ( j=st[level]++) <3) { t = &triangles[st[level-1]]; tt=t->TriangleAdj((int)j); if ( ! t->Locked(j) && tt && (colorT[jt = Number(tt)] == -1) && ( tt->color==kolor)) { colorT[jt]=NbSubDomains; st[++level]=jt; st[++level]=0; k++; } } else level-=2; if (verbosity>5) cout << " Nb of triangles " << k << " of Subdomain " << NbSubDomains << " " << kolor << endl; NbSubDomains++; } } if (verbosity> 3) cout << " The Number of sub domain = " << NbSubDomains << endl; Int4 isd; subdomains = new SubDomain[NbSubDomains]; for (isd=0;isdcolor != triangles[it].color) && !subdomains[isd=colorT[it]].head) { subdomains[isd].head = triangles+it; subdomains[isd].ref = triangles[it].color; subdomains[isd].sens = j; // hack subdomains[isd].edge = 0; k++; } } assert(k== NbSubDomains); delete [] colorT; } delete [] st; // now make the geometry // 1 compress the vertices Int4 * colorV = new Int4[nbv]; for (i=0;i3) cout << " Nb of vertices = " << Gh.nbv << " Nb of edges = " << Gh.nbe << endl; NbVerticesOnGeomVertex = Gh.nbv; VerticesOnGeomVertex = new VertexOnGeom[NbVerticesOnGeomVertex]; NbVerticesOnGeomEdge =0; VerticesOnGeomEdge =0; for (i=0;i6){ int nbr=0; for (i=0;i=0) { int k=Gh.vertices[j].cas; Gh.vertices[j].Set(vertices[i]); // Vertex & v = Gh.vertices[j]; // v = vertices[i]; Gh.vertices[j].color =0; assert(k==Gh.vertices[j].cas); VerticesOnGeomVertex[j] = VertexOnGeom(vertices[i], Gh.vertices[j]); } } edge4= new SetOfEdges4(nbe,nbv); Real4 * len = new Real4[Gh.nbv]; for(i=0;i6){ int nbr=0; for (i=0;i0); Real8 hmin = HUGE_VAL; int kreq=0,kkreq=0; for (i=0;i=0) { if(verbosity>9) cout << " Edges Equi " << i << " <=> " << j << " sens = " << sens << endl; if( sens==0) Gh.edges[i].SetEqui(); else Gh.edges[i].SetReverseEqui(); Gh.edges[i].link= & Gh.edges[j]; //assert(sens==0);// meme sens pour l'instant } } if(requis) { // correction fevr 2009 JYU ... Gh.edges[i].v[0]->SetRequired(); Gh.edges[i].v[1]->SetRequired(); Gh.edges[i].SetRequired(); // fin modif ... kkreq++; } R2 x12 = Gh.vertices[j0].r-Gh.vertices[j1].r; Real8 l12=Norme2(x12); hmin = Min(hmin,l12); Gh.vertices[j1].color++; Gh.vertices[j0].color++; len[j0]+= l12; len[j1] += l12; hmin = Min(hmin,l12); Gh.edges[i].ref = edges[i].ref; k = edge4->addtrie(i0,i1); assert(k == i); } if(verbosity>6){ int nbr=0; for (i=0;iAdj[0]; else if ( (AB,BP) > 0) on = on->Adj[1]; else return on; } return on; } GeometricalEdge* Geometry::ProjectOnCurve(const Edge & e,Real8 s,Vertex &V,VertexOnGeom &GV ) const { Real8 save_s=s; int NbTry=0; retry: s=save_s; GeometricalEdge * on = e.on; assert(on); assert( e[0].on && e[1].on); const Vertex &v0=e[0],&v1=e[1]; V.m = Metric(1.0-s, v0,s, v1); #define MXE__LINE __LINE__+1 const int mxe =100; GeometricalEdge *ge[mxe+1]; int sensge[mxe+1]; Real8 lge[mxe+1]; int bge=mxe/2,tge=bge; ge[bge] = e.on; sensge[bge]=1; R2 V0 = v0,V1=v1,V01=V1-V0; VertexOnGeom vg0= *v0.on, vg1=*v1.on; if(NbTry) cout << "bug: s==== " << s << " e=" << V0 << " " << V1 << endl; // GeometricalEdge * eg0 = e.on,* eg1 = e.on, *eg=NULL; GeometricalEdge * eg0=on, *eg1=on; R2 Ag=(R2) (*on)[0],Bg=(R2)(*on)[1],AB=Bg-Ag; if(NbTry) cout <<" G edge= " << Ag << Bg << endl << " v edge" << V01 << " v geom " << AB << (V01,AB) < V0Ag.V0V1 > 0 || V0Bg.V0V1 >0 // => V1Ag.V0V1 < 0 || V0Bg.V0V1 <0 R2 V0V1 = V1-V0; Real8 cos0A = ((Ag-V0),V0V1); Real8 cos0B = ((Bg-V0),V0V1); Real8 cos1A = ((Ag-V1),V0V1); Real8 cos1B = ((Bg-V1),V0V1); if ( (cos0A < 0 && cos0B <0) || (cos1A> 0 && cos1B >0)) { cerr << " Bug on pointer edge [" << V0 << " , " << V1 << " ] " << " on geometrical edge " << Number(on) << " = [" << Ag << " , " << Bg << " ] " << endl; cerr << cos0A << "> 0 || " << cos0B << " > 0 and "; cerr << cos1A << "< 0 || " << cos1B << " < 0 " << endl; exit (1); } #endif if(NbTry) cout << "bug: edge = " << v0.r << " -> " << v1.r << endl << "sg 0 = " << vg0 << " on = " << Number(on) << ":" << Ag << Bg << "; " << " sg 1= " << vg1 << "--------------------------------------------" << endl; while (eg0 != (GeometricalEdge*) vg0 && (*eg0)(sens0) != (GeometricalVertex*) vg0) { if (bge<=0) { // int kkk; // if (NbTry) cout <<"Read (int) to Show Sioux window", cin >> kkk ; if(NbTry) { cerr << " -- Fatal Error: on the class triangles before call Geometry::ProjectOnCurve" << endl; cerr << " The mesh of the Geometry is to fine: "; cerr << " 1) a mesh edge contening more than "<< mxe/2 << " geometrical edges." << endl; cerr << " 2) code bug : be sure that we call Triangles::SetVertexFieldOn() before " << endl; cerr << " To solve the problem do a coarsening of the geometrical mesh " << endl; cerr << " or change the constant value of mxe in " << __FILE__ << " line " << MXE__LINE << "( dangerous way )" << endl; MeshError(222); } NbTry++; goto retry;} GeometricalEdge* tmpge = eg0; if(NbTry) cout << "bug: --Edge @" << Number(tmpge) << " = "<< Number(eg0) << ":" <Adj[0]) << "," << Number(eg0->Adj[1]) <<"," ; ge[--bge] =eg0 = eg0->Adj[sens0]; assert(bge>=0 && bge <= mxe); sens0 = 1-( sensge[bge] = tmpge->SensAdj[sens0]); if(NbTry) cout << "bug: Edge " << Number(eg0) << " "<< 1-sens0 << " S " << Number((*eg0)[1-sens0]) <<":" << Number(eg0->Adj[0]) << "," << Number(eg0->Adj[1]) <<"," << endl <=mxe ) { cerr << " --Fatal Error: on the class triangles before call Geometry::ProjectOnCurve" << endl; NbTry++; if (NbTry<2) goto retry; cerr << " The mesh of the Geometry is to fine:" ; cerr << " 1) a mesh edge contening more than "<< mxe/2 << " geometrical edges." << endl; cerr << " 2) code bug : be sure that we call Triangles::SetVertexFieldOn() before " << endl; cerr << " To solve the problem do a coarsening of the geometrical mesh " << endl; cerr << " or change the constant value of mxe in " << __FILE__ << " line " << MXE__LINE << "( dangerous way )" << endl; MeshError(223); } GeometricalEdge* tmpge = eg1; if(NbTry) cout << "++Edge @" << tmpge << " = " << Number(eg1) <<"%" << Number(eg1->Adj[0]) << "," << Number(eg1->Adj[1]) <<"," ; ge[++tge] =eg1 = eg1->Adj[sens1]; sensge[tge]= sens1 = 1-tmpge->SensAdj[sens1]; assert(tge>=0 && tge <= mxe); if(NbTry) cout << " Edge " << Number(eg1) << " " << sens1 << " S " <Adj[0]) << "," << Number(eg1->Adj[1]) <<"," <=0 && i <= mxe); BB = (*ge[i])[sensge[i]]; lge[i]=ll += Norme2(AA-BB); // cout << " ll " << i << BB << ll << " " <r - vertices[i]) < eps ) { // link v & vertices[i] // vieille ruse pour recuperer j GeometricalVertex * vg = (GeometricalVertex *) (void *) v; int j = vg-v0g; assert( v == & (Vertex &) vertices[j]); vertices[i].link = vertices + j; k++; } else quadtree.Add(vertices[i]); } if (k) { cout << " Number of distinte vertices " << nbv - k << " Over " << nbv << endl; //if (verbosity>10) { cout << " The duplicate vertex " << endl; for (i=0;i7) for (i=0;ir - edges[i].v[0]->r; Real8 lv10 = Norme2(v10); if(lv10 == 0) { cerr << "The length of " <9) cout << " angle edge " << i <<" " << eangle[i]*180/Pi<< v10<=0) { ord++; Int4 i1= n /2; Int4 j1 = n % 2; Int4 *pn = ev + n; float angle = j1 ? OppositeAngle(eangle[i1]): eangle[i1]; n = *pn; if (angleold > angle) // exch to have : po -> pn -> p exch=1,*pn = *po,*po=*p,*p=n,po = pn; else // to have : po -> p -> pn angleold = angle, po = p,p = pn; } } // end while (exch) if (ord >= 1 ) { /* Int4 n = hv[i]; while ( n >=0) { Int4 i1 = n/2,j1 = n%2; //float a = 180*(j1 ? OppositeAngle(eangle[i1]): eangle[i1])/Pi; n = ev[n]; } */ } if(ord == 2) { // angulare test to find a corner Int4 n1 = hv[i]; Int4 n2 = ev[n1]; Int4 i1 = n1 /2, i2 = n2/2; // edge number Int4 j1 = n1 %2, j2 = n2%2; // vertex in the edge float angle1= j1 ? OppositeAngle(eangle[i1]) : eangle[i1]; float angle2= !j2 ? OppositeAngle(eangle[i2]) : eangle[i2]; float da12 = Abs(angle2-angle1); if(verbosity>9) cout <<" check angle " << i << " " << i1 << " " << i2 << " " << 180*(da12)/Pi << " " << 180*MaximalAngleOfCorner/Pi << vertices[i] << endl; if (( da12 >= MaximalAngleOfCorner ) && (da12 <= 2*Pi -MaximalAngleOfCorner)) { vertices[i].SetCorner() ; if(verbosity>7) cout << " The vertex " << i << " is a corner (angle) " << 180*(da12)/ Pi<< " " << 180*MaximalAngleOfCorner/Pi << endl;} // if the ref a changing then is SetRequired(); if (edges[i1].flag != edges[i2].flag || edges[i1].Required()) { vertices[i].SetRequired(); if(verbosity>7) cout << " The vertex " << i << " is Required the flag change (crack or equi, or require)" << endl;} if (edges[i1].ref != edges[i2].ref) { vertices[i].SetRequired(); if(verbosity>7) cout << " The vertex " << i << " is Required ref" << endl;} } ; if(ord != 2) { vertices[i].SetCorner(); if(verbosity>7) cout << " the vertex " << i << " is a corner ordre = " << ord << endl; } // close the liste around the vertex { Int4 no=-1, ne = hv[i]; while ( ne >=0) ne = ev[no=ne]; if(no>=0) ev[no] = hv[i]; } // now the list around the vertex is circular } // end for (i=0;i " << Number(edges[i1].v[j1]) <10) cout << " edges. Adj " << i1 << " " << j1 << " <--- " << i << " " << jj << endl; } // generation of all the tangente for (i=0;ir -edges[i].v[0]->r; Real8 lAB = Norme2(AB); // length of current edge AB Real8 ltg2[2]; ltg2[0]=0;ltg2[1]=0; for (jj=0;jj<2;jj++) { R2 tg = edges[i].tg[jj]; Real8 ltg = Norme2(tg); // length of tg if(ltg == 0) {// no tg if( ! edges[i].v[jj]->Corner()) { // not a Corner tg = edges[i].v[1-jj]->r - edges[i].Adj[jj]->v[1-edges[i].SensAdj[jj]]->r; ltg = Norme2(tg); tg = tg *(lAB/ltg),ltg=lAB; /* if(edges[i].ref >=4) cout << " tg " << tg.x << " "<< tg.y << " " << edges[i].v[1-jj]->r << edges[i].Adj[jj]->v[1-edges[i].SensAdj[jj]]->r << " y-y = " << edges[i].v[1-jj]->r.y -edges[i].Adj[jj]->v[1-edges[i].SensAdj[jj]]->r.y << endl; */ } //else ;// a Corner with no tangent => nothing to do } // a tg else tg = tg *(lAB/ltg),ltg=lAB; ltg2[jj] = ltg; if ( (tg,AB) < 0) tg = -tg; //if(edges[i].ref >=4) cout << " tg = " << tg << endl; edges[i].tg[jj] = tg; } // for (jj=0;jj<2;jj++) if (ltg2[0]!=0) edges[i].SetTgA(); if (ltg2[1]!=0) edges[i].SetTgB(); } // for (i=0;i7) for (i=0;iSetMark(); nbgem++; e->CurveNumber=NbOfCurves; if(curves) { curves[NbOfCurves].ee=e; curves[NbOfCurves].ke=k1; } GeometricalVertex *b=(*e)(k1); if (a == b || b->Required() ) break; k0 = e->SensAdj[k1];// vertex in next edge e = e->Adj[k1]; // next edge }// for(;;) if(verbosity>10 && curves==0) cout << NbOfCurves <<" curve : nb edges= "<< nee<< endl; NbOfCurves++; if(level) { if(verbosity>4) cout << " Warning: Curve "<< NbOfCurves << " without required vertex " << "so the vertex " << Number(a) << " become required " <SetRequired(); } }} assert(nbgem && nbe); if(step==0) { curves = new Curve[NbOfCurves]; } } for(int i=0;ilink; //GeometricalEdge * ee=curves[i].ee, *eqee=be->link; curves[i].master=true; if(be->Equi() || be->ReverseEqui() ) { assert(eqbe); int nc = eqbe->CurveNumber; assert(i!=nc); curves[i].next=curves[nc].next; curves[i].master=false; curves[nc].next=curves+i; if(be->ReverseEqui()) curves[i].Reverse(); } } if(verbosity>3) cout << " End ReadGeometry: Number of curves in geometry is " << NbOfCurves <4) for(int i=0;ir,B=v[1]->r; Real8 dca,dcb,dcta,dctb; Real8 ddca,ddcb,ddcta,ddctb; // Real8 t1 = 1 -theta; // Real8 t1t1 = t1*t1; Real8 tt = theta*theta; assert( theta >=0); assert( theta <=1); if (TgA()) if (TgB()) // interpolation d'hermite { //cb = theta*theta*(3-2*theta); dcb = 6*theta*(1-theta); ddcb = 6*(1-2*theta); //ca = 1-cb; dca = -dcb; ddca = -ddcb; // cta = (1-theta)*(1-theta)*theta; dcta = (3*theta - 4)*theta + 1; ddcta=6*theta-4; //ctb = (theta-1)*theta*theta ; dctb = 3*tt - 2*theta; ddctb = 6*theta-2; } else { // 1-t*t, t-t*t, t*t Real8 t = theta; // cb = t*t; dcb = 2*t; ddcb = 2; //ca = 1-cb; dca = -dcb; ddca = -2; // cta= t-cb; dcta = 1-dcb; ddcta = -ddcb; // ctb =0; dctb=0; ddctb=0; } else if (TgB()){ Real8 t = 1-theta; //ca = t*t; dca = -2*t; ddca = 2; //cb = 1-ca; dcb = -dca; ddcb = -2; //ctb= -t+ca; dctb = 1+dca; ddctb= ddca; //cta=0; dcta =0; ddcta =0; } else {t=B-A;return 0;} // lagrange P1 R2 d = A*dca + B*dcb + tg[0]* dcta + tg[1] * dctb; R2 dd = A*ddca + B*ddcb + tg[0]* ddcta + tg[1] * ddctb; Real8 d2=(d,d); Real8 sd2 = sqrt(d2); t=d; if(d2>1.0e-20) {t/=sd2;return Abs(Det(d,dd))/(d2*sd2);} else return 0; } R2 GeometricalEdge::F(Real8 theta) const // parametrization of the curve edge { R2 A=v[0]->r,B=v[1]->r; Real8 ca,cb,cta,ctb; assert( theta >=-1e-12); assert( theta <=1+1e-12); if (TgA()) if (TgB()) // interpolation d'hermite { cb = theta*theta*(3-2*theta); ca = 1-cb; cta = (1-theta)*(1-theta)*theta; ctb = (theta-1)*theta*theta ; // if(ref==4 || ref==5) // cout << " FFF " << tg[0] << tg[1] << A << B << " => " << A*ca + B*cb + tg[0]* cta + tg[1] * ctb << endl; } else { // 1-t*t, t-t*t, t*t Real8 t = theta; cb = t*t; ca = 1-cb; cta= t-cb; ctb=0; } else if (TgB()){ Real8 t = 1-theta; ca = t*t; cb = 1-ca; ctb= -t+ca; cta=0; } else { ca =(1-theta),cb = theta,cta=ctb=0; // lagrange P1 } return A*ca + B*cb + tg[0]* cta + tg[1] * ctb; } } freefem++-3.38-1/src/bamglib/Meshgibbs.cpp000644 000767 000024 00000062555 11406226635 020421 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "vect.h" #define mmax(a,b)(a>b?a:b) #define mmin(a,b)(a= ptvois[record[j] + 1] - ptvois[record[j]]) { goto L8; } record[i] = record[j]; goto L4; L8: record[i] = rec; goto L2; L999: record[1] = rec; return 0; } /* gibbs1_ */ /* Subroutine */ int gibbs2_(integer* n,integer* record,integer* criter) { static integer crit, i, j, l, r, rec; /* trie record selon les valeurs de criter(record(.)) croissantes */ /* Parameter adjustments */ --criter; --record; /* Function Body */ if (*n <= 1) { return 0; } l = *n / 2 + 1; r = *n; L2: if (l <= 1) { goto L20; } --l; rec = record[l]; crit = criter[rec]; goto L3; L20: rec = record[r]; crit = criter[rec]; record[r] = record[1]; --r; if (r == 1) { goto L999; } L3: j = l; L4: i = j; j <<= 1; if (j - r < 0) { goto L5; } else if (j == r) { goto L6; } else { goto L8; } L5: if (criter[record[j]] < criter[record[j + 1]]) { ++j; } L6: if (crit >= criter[record[j]]) { goto L8; } record[i] = record[j]; goto L4; L8: record[i] = rec; goto L2; L999: record[1] = rec; return 0; } /* gibbs2_ */ /* Subroutine */ int gibbsa_(integer* n,integer* ptvois,integer* vois,integer* r,integer* m, integer* nv,integer* nx,integer* ny,integer* nn,integer* w1,integer* w2, integer* pfold,integer* pfnew,integer* impre,integer* nfout) { /* System generated locals */ integer i__1, i__2, i__3, i__4; /* Builtin functions */ /* Subroutine */ int s_stop(); /* Local variables */ static integer nbcc, degi, bold, bnew, i, j, k, p, degre, x, y, p1, p2; /* extern Subroutine int gibbs1_();*/ static integer pf; /* extern Subroutine int gibbsb_(), gibbsd_(), gibbst_();*/ static integer nbpass, niveau, pf1, option, old, new_, opt, new1; /* ----------------------------------------------------------------------- */ /* but: calculer une renumerotation des sommets d'un graphe defini par: */ /* par la methode de gibbs */ /* ----------------------------------------------------------------------- */ /* entree */ /* -------- */ /* n = nb de sommet du graphe */ /* les voisins d'un sommet i ont pour numero : */ /* ( vois(j) , j=ptvois(i),ptvois(i+1)-1 ) */ /* impre parametre d'impression */ /* nfout numero du fichier pour impression */ /* sortie */ /* ------ */ /* r(1:n) tableau donnant la nouvelle numerotation: */ /* r(i) = nouveau numero du sommet i */ /* pfolf = ancien profile */ /* pfnew = nouveau profile */ /* tableau de travail : */ /* -------------------- */ /* m(n) */ /* nv(0:n+n) */ /* nx(n) */ /* ny(n) */ /* nn(0:n) */ /* w1(n) */ /* w2(n) */ /* ----------------------------------------------------------------------- */ /* programmeur f. hecht le 3/02/1987 */ /* ----------------------------------------------------------------------- */ /* tri des voisins d'un sommet du graphe par degre croissant */ /* --------------------------------------------------------------- */ /* Parameter adjustments */ --w2; --w1; --ny; --nx; --m; --r; --vois; --ptvois; /* Function Body */ p2 = ptvois[1] - 1; i__1 = *n; for (i = 1; i <= i__1; ++i) { p1 = p2 + 1; p2 = ptvois[i + 1] - 1; i__2 = p2 - p1 + 1; gibbs1_(&i__2, &vois[p1], &ptvois[1]); /* if(impre.le.-9) then */ /* write (nfout,*) 'les voisin de ',i,'sont: ', (vois(j),j=p1,p 2) */ /* endif */ /* L10: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { r[i] = 0; /* L20: */ } /* boucle sur les composante connexe du graphe */ new_ = 0; nbcc = 0; L30: if (new_ < *n) { ++nbcc; /* recherche d'une racine y (un sommet non numerote) de degree m ini */ y = 0; degre = *n + 1; i__1 = *n; for (i = 1; i <= i__1; ++i) { if (r[i] <= 0) { degi = ptvois[i + 1] - ptvois[i]; if (degi < degre) { degre = degi; y = i; } } /* L40: */ } if (y == 0) { return -3;/* s_stop("fatal erreur gibbs 2 : pb racine", 33L); */ } gibbsd_(&y, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); nbpass = 0; L50: ++nbpass; x = y; p = niveau; k = 0; i__1 = nv[p + 1]; for (i = nv[p] + 1; i <= i__1; ++i) { ++k; m[k] = nv[i]; /* L60: */ } gibbs1_(&k, &m[1], &ptvois[1]); i__1 = k; for (i = 1; i <= i__1; ++i) { y = m[i]; gibbsd_(&y, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); if (niveau > p) { goto L50; } /* L70: */ } y = m[1]; /* if(impre.lt.0) then */ /* write(nfout,*) */ /* + ' nb de pass pour trouver le pseudo diametre',nbpass */ /* + ,' x=',x,',y=',y,' de la composante connexe ',nbcc */ /* write (nfout,*) ('-',i=1,78) */ /* endif */ /* optimisation de la descendance de la numerotation */ /* ------------------------------------------------- */ gibbsb_(&x, &y, n, &ptvois[1], &vois[1], &nx[1], &ny[1], nv, nn, &m[1] , &w1[1], &w2[1], &r[1], impre, nfout); /* renumerotation de cuthill mac kee avec la meilleur des 4 option s */ /* -------------------------------------------------------------- --- */ pf = 1073741824; option = -2; new1 = new_; for (opt = -2; opt <= 2; ++opt) { new_ = new1; if (opt != 0) { gibbst_(n, &p, nv, nn, &ptvois[1], &vois[1], &m[1], &r[1], & new_, &opt, &pf1, impre, nfout); if (pf1 < pf) { pf = pf1; option = opt; } } /* L80: */ } /* if(impre.ne.0) write (nfout,*) ' on a choisi l''option ', */ /* + option,', new =',new */ new_ = new1; gibbst_(n, &p, nv, nn, &ptvois[1], &vois[1], &m[1], &r[1], &new_, & option, &pf1, impre, nfout); goto L30; } /* if(impre.ne.0) write(nfout,*) */ /* + ' nb de composante connexe du graphe =',nbcc */ /* calcul du profile */ *pfold = 0; *pfnew = 0; bnew = 0; bold = 0; i__1 = *n; for (i = 1; i <= i__1; ++i) { old = i; new_ = r[i]; i__2 = ptvois[i + 1] - 1; for (j = ptvois[i]; j <= i__2; ++j) { /* Computing MIN */ i__3 = old, i__4 = vois[j]; old = mmin(i__3,i__4); /* Computing MIN */ i__3 = new_, i__4 = r[vois[j]]; new_ = mmin(i__3,i__4); /* L100: */ } *pfold = *pfold + i - old + 1; /* Computing MAX */ i__2 = bold, i__3 = i - old + 1; bold = mmax(i__2,i__3); *pfnew = *pfnew + r[i] - new_ + 1; /* Computing MAX */ i__2 = bnew, i__3 = r[i] - new_ + 1; bnew = mmax(i__2,i__3); /* L110: */ } /* if(impre.ne.0) then */ /* write(nfout,*)'profile old = ',pfold,', profile new = ',pfnew */ /* write(nfout,*)'1/2 bande old = ',bold ,', 1/2 band new = ',bnew */ /* endif */ return 0; } /* gibbsa_ */ /* Subroutine */ int gibbsb_(integer* x,integer* y,integer* n,integer* ptvois, integer* vois,integer* nx,integer* ny,integer* nv,integer* nn,integer* m, integer* wh,integer* wl,integer* r, integer* impre, integer* nfout) { /* System generated locals */ integer i__1, i__2; /* Local variables */ static flag_; static integer i, j, k, p, s, h0, i1, l0, i2; /* extern Subroutine int gibbs1_(); */ static integer lg; /* extern Subroutine int gibbsd_(), gibbsc_();*/ static integer niveau, mxcanx, mxcany, nbc; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* ...................................................................... */ /* attention on met la descente optimiser dans r <0 ou nulle */ /* ....................................................................... */ /* Parameter adjustments */ --r; --m; --ny; --nx; --vois; --ptvois; /* Function Body */ gibbsd_(y, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); gibbsc_(&ny[1], nv, &niveau, n, &mxcany); gibbsd_(x, n, &ptvois[1], &vois[1], nv, &r[1], &niveau); p = niveau; gibbsc_(&nx[1], nv, &niveau, n, &mxcanx); flag_ = ffalse; i__1 = *n; for (i = 1; i <= i__1; ++i) { if (nx[i] + ny[i] == p) { r[i] = -nx[i]; } else if (nx[i] >= 0) { flag_ = ttrue; r[i] = -1073741824; } else { if (r[i] <= 0) { r[i] = -1073741822; } } /* L20: */ } if (flag_) { /* calcul des composantes connexe du graphe sans les sommets de nn */ /* ------------------------------------------------------------ --- */ j = *n; k = 0; nbc = 0; nv[nbc] = j; L30: ++k; if (k <= *n) { if (r[k] == -1073741824) { /* recherche de la fermeture transitive partant de k */ ++nbc; i = -1; s = k; L40: ++i; wl[i] = ptvois[s]; wh[i] = ptvois[s + 1]; ++j; nv[j] = s; r[s] = -1073741823; L50: if (i >= 0) { if (wl[i] < wh[i]) { s = vois[wl[i]]; ++wl[i]; if (r[s] == -1073741824) { goto L40; } goto L50; } --i; goto L50; } nv[nbc] = j; m[nbc] = nbc; } goto L30; } /* if(impre.lt.0) write(nfout,*) */ /* + ' nb de composante connexe du graphe reduit =',nbc */ /* --------------- fin de construction des composantes connexes------ --- */ /* nv(0)=n */ /* if(impre.le.-10) write(nfout,5555)'nv(0:n+n) = ',(nv(i),i=0, n+n) */ gibbs1_(&nbc, &m[1], nv); /* if(impre.le.-10)write(nfout,5555)'trie m =',(m(i),i=1,nbc) */ i__1 = p; for (i = 0; i <= i__1; ++i) { nn[i] = 0; /* L60: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { j = -r[i]; if (j >= 0 && j <= p) { ++nn[j]; } /* L70: */ } /* boucle sur les composante connexes par ordre croissantes */ /* -------------------------------------------------------- */ for (k = nbc; k >= 1; --k) { i = m[k]; i1 = nv[i - 1] + 1; i2 = nv[i]; lg = i2 - i1 + 1; /* if(impre.le.-7) */ /* + write(nfout,*) k,' composante ',i,',lg=',lg,',i1,i2 =',i1,i2 */ /* if(impre.le.-8) */ /* + write (nfout,5555)' ',(nv(i),i=i1,i2) */ h0 = 0; l0 = 0; i__1 = p; for (j = 0; j <= i__1; ++j) { wh[j] = nn[j]; wl[j] = nn[j]; /* L90: */ } i__1 = i2; for (i = i1; i <= i__1; ++i) { s = nv[i]; ++wh[nx[s]]; ++wl[p - ny[s]]; /* L100: */ } i__1 = p; for (j = 0; j <= i__1; ++j) { if (wh[j] != nn[j]) { /* Computing MAX */ i__2 = wh[j]; h0 = mmax(i__2,h0); } if (wl[j] != nn[j]) { /* Computing MAX */ i__2 = wl[j]; l0 = mmax(i__2,l0); } /* L110: */ } if (h0 < l0 || h0 == l0 && mxcanx <= mxcany) { /* if(impre.le.-2) write(nfout,*) */ /* + ' h0 = ',h0,',l0 = ',l0,' ------- XXXX --------' */ i__1 = i2; for (i = i1; i <= i__1; ++i) { s = nv[i]; r[s] = -nx[s]; ++nn[-r[s]]; /* L120: */ } } else { /* if (impre.le.-2) write(nfout,*) */ /* + ' h0 = ',h0,',l0 = ',l0,' ------- YYYY --------' */ i__1 = i2; for (i = i1; i <= i__1; ++i) { s = nv[i]; r[s] = -p + ny[s]; ++nn[-r[s]]; /* L130: */ } } /* L140: */ } } /* on met les nouveaux niveaux de la descendance optimiser dans nn */ /* ----------------------------------------------------------------- */ i__1 = *n; for (i = 1; i <= i__1; ++i) { if (r[i] > 0) { nn[i] = -1; } else if (r[i] == -1073741822) { nn[i] = -2; } else { nn[i] = -r[i]; } /* L150: */ } /* if(impre.le.-10)write (nfout,5555)' nn(i)=',(nn(i),i=1,n) */ /* 5555 format(' -------- ',a,/,5(15x,10(i5)/)) */ return 0;} /* gibbsb_ */ /* Subroutine */ int gibbsc_(integer* nz,integer* nv,integer* niveau,integer* n,integer* mxz) { /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static integer i, j; /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* Parameter adjustments */ --nz; /* Function Body */ i__1 = *n; for (i = 1; i <= i__1; ++i) { nz[i] = -1; /* L10: */ } *mxz = 0; i__1 = *niveau; for (i = 0; i <= i__1; ++i) { /* Computing MAX */ i__2 = *mxz, i__3 = nv[i + 1] - nv[i]; *mxz = mmax(i__2,i__3); i__2 = nv[i + 1]; for (j = nv[i] + 1; j <= i__2; ++j) { nz[nv[j]] = i; /* L20: */ } } return 0;} /* gibbsc_ */ /* Subroutine */ int gibbsd_(integer* racine,integer* n,integer* ptvois,integer* vois,integer* nv,integer* r,integer* niveau) { /* System generated locals */ integer i__1, i__2; /* Local variables */ static integer i, k, s, sv, stk, stk1, stk2; /* ----------------------------------------------------------------------- */ /* but construire la structure des descendant de racine du graphe */ /* ----------------------------------------------------------------------- */ /* sortie : */ /* -------- */ /* nv est la structure des niveaux */ /* les sommets du niveau (i =0,niveau_ sont defini par : */ /* (nv(j),j=nv(i),nv(i+1)-1) */ /* le tableau r(i) n'est modifier que sur les sommets */ /* de la composante connexe du graphe contenant la racine */ /* ----------------------------------------------------------------------- */ /* on demark tout les sommets non remuneroter */ /* -------------------------------------------------- */ /* Parameter adjustments */ --r; --vois; --ptvois; /* Function Body */ i__1 = *n; for (i = 1; i <= i__1; ++i) { if (r[i] < 0) { r[i] = 0; } /* L10: */ } /* initialisation */ stk = *n - 1; nv[0] = stk; stk2 = stk; *niveau = 0; ++stk; nv[stk] = *racine; r[*racine] = -1; L20: if (stk2 < stk) { ++(*niveau); stk1 = stk2 + 1; nv[*niveau] = stk; stk2 = stk; /* print *,' ------- niveau =',niveau,' stk=',stk1,stk2 */ i__1 = stk2; for (k = stk1; k <= i__1; ++k) { s = nv[k]; /* print *,'----------------- s=',s */ i__2 = ptvois[s + 1] - 1; for (i = ptvois[s]; i <= i__2; ++i) { /* pour tout les sommets (sv) voisin */ /* d'un sommet (s) du niveau precedent */ sv = vois[i]; /* print *,' voisin =',sv */ /* si le sommet n'est pas marque on le marque et on l'ajout */ if (r[sv] == 0) { ++stk; nv[stk] = sv; r[sv] = -1; } /* L30: */ } /* L40: */ } goto L20; } --(*niveau); /* call pnv(' gibbsd ',n,nv,niveau) */ return 0;} /* gibbsd_ */ /* Subroutine */ int gibbst_(integer* n,integer* p,integer* nv,integer* nn,integer* ptvois,integer* vois,integer* m,integer* r,integer* new_,integer* option, integer* pfnew,integer* impre,integer* nfout) { /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; /* Local variables */ static integer nbsc, bnew, knew, step, plus, i, j, k, s, debut, i1, i2; /* extern Subroutine int gibbs2_();*/ static integer fin; /* construction de la stucture de niveau dans nv a partir de nn */ /* ------------------------------------------------------------ */ /* Parameter adjustments */ --r; --m; --vois; --ptvois; /* Function Body */ nv[0] = *n; i__1 = *p + 1; for (i = 1; i <= i__1; ++i) { nv[i] = 0; /* L150: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { if (nn[i] >= 0) { ++nv[nn[i] + 1]; } /* L160: */ } i__1 = *p; for (i = 0; i <= i__1; ++i) { nv[i + 1] += nv[i]; /* L170: */ } i__1 = *n; for (i = 1; i <= i__1; ++i) { if (nn[i] >= 0) { j = nn[i]; ++nv[j]; nv[nv[j]] = i; } /* L180: */ } for (i = *p; i >= 0; --i) { nv[i + 1] = nv[i]; /* L190: */ } nv[0] = *n; nbsc = nv[*p + 1] - nv[0]; /* --- fin de la construction ------------------------------------ */ if (*option == -2) { i__1 = *impre - 1; } i__1 = *n; for (i = 1; i <= i__1; ++i) { m[i] = *n * 3 + ptvois[i + 1] - ptvois[i]; /* L10: */ } if ((((int)*option) == 1)||(((int)*option) == -1)) { debut = 0; fin = *p; step = 1; } else { debut = *p; fin = 0; step = -1; } i__1 = fin; i__2 = step; for (i = debut; i__2 < 0 ? i >= i__1 : i <= i__1; i += i__2) { i1 = nv[i] + 1; i2 = nv[i + 1]; i__3 = i2 - i1 + 1; gibbs2_(&i__3, &nv[i1], &m[1]); i__3 = i2; for (j = i1; j <= i__3; ++j) { s = nv[j]; i__4 = ptvois[s + 1] - 1; for (k = ptvois[s]; k <= i__4; ++k) { /* Computing MIN */ i__5 = m[vois[k]]; m[vois[k]] = mmin(i__5,j); /* L20: */ } /* L30: */ } /* L40: */ } if (*option > 0) { knew = *new_; plus = 1; } else { knew = *new_ + nbsc + 1; plus = -1; } *new_ += nbsc; /* if(option.gt.0) then */ /* do 60 k = debut , fin , step */ /* do 60 j = nv(k+1),nv(k)+1,-1 */ /* knew = knew + plus */ /* r(nv(j)) = knew */ /* 60 continue */ /* else */ i__2 = fin; i__1 = step; for (k = debut; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { i__3 = nv[k + 1]; for (j = nv[k] + 1; j <= i__3; ++j) { knew += plus; r[nv[j]] = knew; /* L70: */ } } /* endif */ *pfnew = 0; bnew = 0; i__3 = *n; for (i = 1; i <= i__3; ++i) { k = r[i]; if (k > 0) { i__1 = ptvois[i + 1] - 1; for (j = ptvois[i]; j <= i__1; ++j) { if (r[vois[j]] > 0) { /* Computing MIN */ i__2 = k, i__4 = r[vois[j]]; k = mmin(i__2,i__4); } /* L100: */ } *pfnew = *pfnew + r[i] - k + 1; /* Computing MAX */ i__1 = bnew, i__2 = r[i] - k + 1; bnew = mmax(i__1,i__2); } /* L110: */ } /* if(impre.lt.0.or.impre.gt.2) then */ /* write(nfout,*) ' option =',option,', profile =',pfnew */ /* + ,', 1/2 bande =',bnew,', new=',new,', nbss composante=',nbsc */ /* endif */ return 0;} /* gibbst_ */ /* function */ int Triangles::gibbsv (integer* ptvoi, integer* vois,integer* lvois,integer* w,integer* v) { /* System generated locals */ integer i__2; /* Local variables */ integer i, j, k, T, ss, iii, ptv, ptv1; integer nbss = nbv; /*--- Prepare les donees pour gibbsa en construisant ptvoi, vois, lvois - ------------*/ /* in */ /* --- nbnt =3 pour des triangles 2D, */ /* nbt = nb de triangle */ /* nbss = nb de sommets */ /* nsea = numeros de 3 sommets de chaque triangle (me) */ /* out */ /* --- ptvoi, vois, lvois, err */ /* tableaux de travail w, v */ /*----------------------------------------------------------------------- ----------*/ /* Parameter adjustments */ --v; --w; --vois; --ptvoi; long nt = nbt-NbOutT; /* Function Body */ for (i = 1; i <= nbss; ++i) { w[i] = -1; ptvoi[i] = 0; } ptvoi[nbss + 1] = 0; for (i = 0; i < nt; ++i) { assert(triangles[i].link); for (j = 0; j < 3; ++j) { ss = Number(triangles[i][j])+1; ++ptvoi[ss + 1]; w[ss] = 0; } } for (i = 1; i <= nbss; ++i) ptvoi[i + 1] += ptvoi[i]; for (i = 0; i < nt; ++i) if (triangles[i].link) for (j = 0; j < 3; ++j) { ss = Number(triangles[i][j])+1; ++ptvoi[ss]; v[ptvoi[ss]] = i; } ptv1 = 0; iii = 1; for (i = 1; i <= nbss; ++i) { ptv = ptv1 + 1; ptv1 = ptvoi[i]; ptvoi[i] = iii; i__2 = ptv1; for (j = ptv; j <= i__2; ++j) { T = v[j]; for (k = 0; k < 3; ++k) { ss = Number(triangles[T][k])+1; /* nsea[k + T * nsea_dim1]; */ if (w[ss] != i) { w[ss] = i; if (iii > *lvois) return 2 ; /* print*,'pas assez de place memoire' */ vois[iii] = ss; ++iii;} } } } ptvoi[nbss + 1] = iii; *lvois = iii - 1; return 0; /* OK */ return 0;} /* gibbsv_ */ int Triangles::gibbs() /* -------- renumber vertices by gibbs method; updates triangle and edge array in: mesh out: mesh auxiliary arrays: ptvois,vois,r,m,nv,nx,ny,nn,w1,w2,f all of size nv+1 except vois (10(nv+1)) and nv (2(nv+1)) err = -1 : memory alloc pb; err = -3: fatal erreur gibbs 2 : pb racine */ { long nv = nbv; long nt = nbt-NbOutT; long i, j, pfold, pfnew; long* ptvois=NULL; long* vois=NULL; long* nn =NULL; long* r =NULL; long* m =NULL; long* nnv =NULL; long* nx =NULL; long* ny =NULL; long* w1 =NULL; long* w2=NULL; long nbvoisin = 10*nv; long printint=0, iodev=6; int err=0; ptvois = new long[nv+1]; //(long*)calloc((long)(nv + 1) , sizeof(long)); nn = new long[3*nt]; //(long*)calloc(3 * nt ,sizeof(long)); vois = new long[nbvoisin+10]; //(long*)calloc((long)(nbvoisin + 10) , sizeof(long)); r = new long[nv+1]; //(long*)calloc((long)(nv + 1) , sizeof(long)); if((!ptvois)||(!nn)||(!vois)||(!r)) return -1; err = gibbsv(ptvois,vois,&nbvoisin,r,nn) ; delete [] nn; // free(nn); if(err==0) { m = new long[nv+1]; nn = new long[nv+1]; nnv = new long[(nv+1)<<1]; nx = new long[nv+1]; ny = new long[nv+1]; w1 = new long[nv+1]; w2 = new long[nv+1]; long lnv = nv; err = gibbsa_ (&lnv, ptvois, vois, r, m, nnv, nx, ny, nn, w1, w2, &pfold, &pfnew, &printint, &iodev); delete [] m; delete [] nnv; delete [] nn; delete [] nx; delete [] ny; delete [] w1; delete [] w2; } delete [] vois; delete [] ptvois; /* if (err == 0 && (pfnew <= pfold)) { A f(nv); for (i = 0; i < nv; ++i) { f[i].x = v[i].x; f[i].y = v[i].y; f[i].where = v[i].where; } for (i = 0; i < nv; ++i) { v[r[i] - 1].x = f[i].x; v[r[i] - 1].y = f[i].y; v[r[i] - 1].where = f[i].where; } for (j = 0; j < nt; ++j) // updates triangle array for (i = 0; i < 3; i++) t[j].v[i] = &v[r[no(t[j].v[i])] - 1]; for (j = 0; j < ne; ++j) // updates edge array { e[j].in = &v[r[no(e[j].in)] - 1]; e[j].out = &v[r[no(e[j].out)] - 1]; } f.destroy(); if (!NumThinGrid) { NumThinGrid= new int [nv]; for (i=0;i> dimlu >> nbsol >> lsol >> typesollu ; if(typesol != typesollu ) { cerr << " incorrect type of solution (read) " << typesollu << " != (wanted) " << typesol << endl; cerr << " or dim of solution (read) " << dimlu << " != (wanted) " << dim << endl; nbsol=0; lsol=0; } else { sol = new double[lsol*nbsol]; double *s=sol; for( i=0;i> *s++ ; // frbb.close(); } return sol; } /////////////////////////////////////////////////////////// double * ReadBBFile(const char * file,long & nbsol,long & lsol,int *& typesols, const int dim,const int typesol) { MeshIstream frbb(file); int dimlu,typesollu; typesols = 0; long i,n=0; double *sol =0; int sizeoftype[] = { 1, dim ,dim * (dim+1) / 2, dim * dim } ; // char * charoftype[] = { "Scalar" , "dim Vector" ,"dim x dim Sym-Matric","dim x dim Full-Matric" } ; frbb >> dimlu >> nbsol ; typesols = new int [nbsol] ; for (i=0;i> typesols[i]; typesols[i]--; if (typesols[i]<0 || typesols[i]>= 4) { cerr << " Error reading BBFile the type solution " << i+1 << " is " << typesols[i]+1 << " is not in [1..4] " << endl; frbb.ShowIoErr(998); nbsol=0; lsol=0; delete [] typesols; typesols=0; return 0; } n += sizeoftype[ typesols[i]]; } frbb >> lsol >> typesollu ; if(typesol != typesollu ) { cerr << " incorrect type of solution (read) " << typesollu << " != (wanted) " << typesol << endl; cerr << " or dim of solution (read) " << dimlu << " != (wanted) " << dim << endl; frbb.ShowIoErr(999); nbsol=0; lsol=0; } else { if (verbosity> 5) cout << " read BB file " << file << " with nbsol " << nbsol << " total nb of field = " << n << endl; if (verbosity>9) for (i=0;i> *s++ ; // frbb.close(); } return sol; } void MeshIstream::ShowIoErr(int s) { LineError = 1; if (CurrentFile) cerr << " In file " << CurrentFile ; cerr << ", Erreur Lecture " << s << ", good=" << (s & ios::goodbit) << ", bad=" << (s & ios::badbit) << ", fail=" << (s & ios::failbit) << ", eof=" << (s & ios::eofbit) << " Line " << LineNumber << endl; if(!in.eof()) { in.clear(ios::goodbit); int i=0; char c; cerr << " the next character :" ; while (i++<80 && in.get(c) && (c != '\n' || i < 30 )) cerr.put(c); cerr << endl; } if (MeshIstreamErrorHandler) MeshIstreamErrorHandler(in); else { in.clear(ios::failbit); } } int MeshIstream::IsString(const char* s) { int n=0; char c; const char * ss = s; while (in.get(c) && c ==' ') n++; // eat whitespace if (in.good()) while ( *ss && c == *ss && in.get(c) ) ss++; if (*ss) { // no if (verbosity>9) cout << "IsString: not " << s << " " << n << " putback " << ss-s << " :" << c ; if (in.good()) in.putback(c),ss--; while(ss-s>0) { cout << *ss ; in.putback(*ss--); }; if (verbosity>9) cout << ":"<< endl; return 0;} else return 1; } char * MeshIstream::ReadStr() { static char buf[1025]; int instr=0,k=0; char * b=buf, bb=0, *bend=buf+1023; for (b=buf;b9) cout << " size of last record = " << l << " n = " << nb_rec << " i= " << i << endl; if (!f->good()) Error(3); f->seekp(i-sizeof(long)); if (!f->good()) Error(3); f->write((char*)&l,sizeof(l)); if (!f->good()) Error(3); n=j; } f->seekp(n); if (!f->good()) Error(3); f->write((char*) &l,sizeof(l)); if (!f->good()) Error(3); if (f && to_close) { if (verbosity>9) cout << "delete OFortranUnFormattedFile " << file_name << " @end = " << n << endl; delete f;} f=0; } IFortranUnFormattedFile::~IFortranUnFormattedFile() { if (f && to_close) { if (verbosity>9) cout << " delete IFortranUnFormattedFile" << file_name << " @end = " << n << endl; delete f;} f=0; } long IFortranUnFormattedFile::Record() { nb_rec++; n += sizeof(long); f->seekg(n); f->read((char*)&l,sizeof(l)); if (!f->good()) Error(3); i=j= n+sizeof(l); n += l + sizeof(l) ; // end if (verbosity>9) cout << " Read rec end =" << n << " l= " << l << " current= " << j << " begin= " << i << endl; return l; } long OFortranUnFormattedFile::Record(long ll) // { if (j==4 && l==0) { l=ll; f->seekp(0); f->write((char*)&ll,sizeof(l)); if (!f->good()) Error(3); return 0; } if (n>=0) { if (l==0) { // l rec no set -- l=where(); if (verbosity>9) cout << " set len of rec " << nb_rec << " = " << l << " @ " << i-sizeof(long) << endl; f->seekp(i-sizeof(long)); f->write((char*)&l,sizeof(l)); n=j; } f->seekp(n); f->write((char*)&l,sizeof(l)); if (!f->good()) Error(3); } else f->seekp(0); n += sizeof(long); nb_rec++; f->write((char*)&ll,sizeof(l)); if (!f->good()) Error(3); l=ll; n += sizeof(long); j = n; i = n; n += l; if (verbosity>9) cout << " Write rec end =" << n << " l= " << l << " current= " << j << " begin= " << i << endl; return l; } void OFortranUnFormattedFile::Error(int err) { cerr << "Fatal Error Output FortranUnFormattedFile " << endl; if (err==0) cerr << "-- Error openning "; else if (err==1) cerr<< "-- OverFlow write "; else if (err==2) cerr<< "-- Erreur write " ; else if (err==3) cerr<< "-- Erreur write record info " ; else cerr << " unkown err " << err ; cerr << " Record number = " << nb_rec << endl << " read position in file " << j << " < " << n << " = end on record " << endl; cerr << " position in the record = " << where() << " length of record = " << l < #include #include #include "error.hpp" #include #include #include using namespace std; // PB compilo HP aCC #if defined(__hpux) || defined(__SUNPRO_CC) #define IOS_OPENMODE int #else #define IOS_OPENMODE ios::openmode #endif extern long verbosity ; namespace bamg { extern void (*MeshIstreamErrorHandler)(ios & ); void WriteStr(ostream & out,char * str); double * ReadbbFile(const char * file,long & nbsol,long & lsol,const int dim=2,const int typesol=2); double * ReadBBFile(const char * file,long & nbsol,long & lsol,int *& typesols,const int dim=2,const int typesol=2); // solution at vertex (P1) union Char4orLong { char c[4]; long l;} ; class MeshIstream { public: istream & in ; const char * CurrentFile; // ifstream fin; int LineNumber,LineError,opened; istream & cm ()// mange les blancs et les commentaire { char c; int cmm=0; while ( in.get(c) && ( isspace(c) ? (( ( c=='\n'|| c==char(12) || c==char(15)) && (LineNumber++,cmm=0)),1) : (cmm || (c=='#' && (cmm=1) )) ) ) ((void ) 0); if (in.good()) in.putback(c); return in; } // void rewind(){ fin.clear();fin.seekg(0);} void eol()// go to end of line { char c; while ( in.get(c) && ( c!='\n') && ( c!='\r')) (void) 0; } void ShowIoErr(int ); MeshIstream & err () { if ( ! in.good() ) ShowIoErr(in.rdstate()); return *this; } // MeshIstream(istream & i): in(i),CurrentFile(0),LineNumber(1),LineError(0) {} MeshIstream(const char * file_name) : in(*new ifstream(file_name)),CurrentFile(file_name), LineNumber(1),LineError(0) { if (!in) {cerr << " Error Opening file " << file_name,CurrentFile=0;ShowIoErr(1);} if(verbosity>4) cout << " Openfile : " << file_name << endl;err(); } /* // void close() { if (CurrentFile) { if(verbosity>5) cout << " Closefile: " << CurrentFile << endl; CurrentFile=0;in.close();} } */ int eof(){return in.eof();} ~MeshIstream(){delete ∈} int IsString(const char* s); char * ReadStr(); MeshIstream& operator>>(short& i) { cm() >> i ;return err();} MeshIstream& operator>>(long& i) { cm() >> i ;return err();} MeshIstream& operator>>(int& i) { cm() >> i ;return err();} MeshIstream& operator>>(float& i) { cm() >> i ;return err();} MeshIstream& operator>>(double& i) { cm() >> i ;return err();} MeshIstream& operator>>(char * & i ) { i=ReadStr();return err();} }; // Fortran unformatted file interface ---------- class IFortranUnFormattedFile { // template friend IFortranUnFormattedFile & operator>>(IFortranUnFormattedFile &f,T & l); istream * f; long i,l,n,j,nb_rec; const char * file_name; int to_close; public: IFortranUnFormattedFile(char *name) : f(new ifstream(name)),i(0),l(0),n((long)-sizeof(long)), nb_rec(0),file_name(name), to_close(1) { if(!*f) Error(0);} IFortranUnFormattedFile(MeshIstream & ff) : f(&ff.in),i(0),l(0),n((long)-sizeof(long)),nb_rec(0), file_name(ff.CurrentFile), to_close(0) { if(! *f) Error(0);} ~IFortranUnFormattedFile(); long Record(); long where(){return j-i;} void read4(char *c,int );// for the fortran 77 char4 void read(char * p,const size_t lg); void Error(int); }; class OFortranUnFormattedFile { // template friend OFortranUnFormattedFile & operator<<(OFortranUnFormattedFile &f,const T & l); ostream * f; long i,l,n,j,nb_rec; const static char * unkown; const char * file_name; int to_close; public: OFortranUnFormattedFile(const char *name,IOS_OPENMODE mm=ios::trunc) : f(new ofstream(name,mm)),i(0),l(0),n((long) -sizeof(long)),nb_rec(0),file_name(name), to_close(1) { if(!*f) Error(0);} OFortranUnFormattedFile(ostream &ff) : f(&ff),i(0),l(0),n((long) -sizeof(long)),nb_rec(0),file_name(unkown), to_close(0) { if(!*f) Error(0);} ~OFortranUnFormattedFile(); long Record(long ll=0); long where(){return j-i;} void write4(const char *c,int );// for the fortran 77 char4 void write(const char * p,const size_t lg); void Error(int ); }; /// ---------- inline ------------------------- inline void IFortranUnFormattedFile::read(char * p,const size_t lg){ f->read(p,lg); j+=lg; if (j>n) Error(1); else if (!f->good()) Error(2) ; } inline void OFortranUnFormattedFile::write(const char * p,const size_t lg){ f->write(p,lg); j+=lg; if (l && j>n) Error(1); else if (!f->good()) Error(2); } template inline IFortranUnFormattedFile & operator>>(IFortranUnFormattedFile &f,T & l) { f.read((char *) &l,sizeof(l));return f; } /* bug sur sun template inline OFortranUnFormattedFile & operator<<(OFortranUnFormattedFile &f,const T & l) { f.write((char *) &l,sizeof(l));return f; } on ex les template */ inline OFortranUnFormattedFile & operator<<(OFortranUnFormattedFile &f,const int & l) { f.write((char *) &l,sizeof(l));return f; } inline OFortranUnFormattedFile & operator<<(OFortranUnFormattedFile &f,const long & l) { f.write((char *) &l,sizeof(l));return f; } inline OFortranUnFormattedFile & operator<<(OFortranUnFormattedFile &f,const double & l) { f.write((char *) &l,sizeof(l));return f; } inline OFortranUnFormattedFile & operator<<(OFortranUnFormattedFile &f,const float & l) { f.write((char *) &l,sizeof(l));return f; } inline void OFortranUnFormattedFile::write4(const char *c,int ll) { int i,j; Char4orLong ch4; for ( i=0;i> ch4.l; for (j=0;j<4;j++) *c++= ch4.c[j]; } *c=0;// end of string } } freefem++-3.38-1/src/bamglib/MeshQuad.cpp000644 000767 000024 00000064265 11406226635 020225 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // // ********** DO NOT REMOVE THIS BANNER ********** /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // // SUMMARY: Bamg: Bidimensional Anisotrope Mesh Generator // RELEASE: 0 // AUTHOR: F. Hecht, // ORG : UMPC // E-MAIL : Frederic.Hecht@Inria.fr // // ORIG-DATE: frev 98 //--------------------------------------------------------- // to make quad // ------------------- #include #include #include #include #include "Meshio.h" #include "Mesh2.h" #include "QuadTree.h" #include "SetOfE4.h" namespace bamg { static const Direction NoDirOfSearch=Direction(); #ifdef __MWERKS__ #pragma global_optimizer on #pragma optimization_level 1 //#pragma inline_depth 0 #endif class DoubleAndInt4 { public: double q; Int4 i3j; int operator<(DoubleAndInt4 a){return q > a.q;} };// to sort by decroissant template inline void HeapSort(T *c,long n) { long l,j,r,i; T crit; c--; // on decale de 1 pour que le tableau commence a 1 if( n <= 1) return; l = n/2 + 1; r = n; while (1) { // label 2 if(l <= 1 ) { // label 20 crit = c[r]; c[r--] = c[1]; if ( r == 1 ) { c[1]=crit; return;} } else crit = c[--l]; j=l; while (1) {// label 4 i=j; j=2*j; if (j>r) {c[i]=crit;break;} // L8 -> G2 if ((j G2 } } } Triangle * swapTest(Triangle *t1,Int2 a); // double QuadQuality(const Vertex & a,const Vertex &b,const Vertex &c,const Vertex &d) { // calcul de 4 angles -- R2 A((R2)a),B((R2)b),C((R2)c),D((R2)d); R2 AB(B-A),BC(C-B),CD(D-C),DA(A-D); // Move(A),Line(B),Line(C),Line(D),Line(A); const Metric & Ma = a; const Metric & Mb = b; const Metric & Mc = c; const Metric & Md = d; double lAB=Norme2(AB); double lBC=Norme2(BC); double lCD=Norme2(CD); double lDA=Norme2(DA); AB /= lAB; BC /= lBC; CD /= lCD; DA /= lDA; // version aniso double cosDAB= Ma(DA,AB)/(Ma(DA)*Ma(AB)),sinDAB= Det(DA,AB); double cosABC= Mb(AB,BC)/(Mb(AB)*Mb(BC)),sinABC= Det(AB,BC); double cosBCD= Mc(BC,CD)/(Mc(BC)*Mc(CD)),sinBCD= Det(BC,CD); double cosCDA= Md(CD,DA)/(Md(CD)*Md(DA)),sinCDA= Det(CD,DA); double sinmin=Min(Min(sinDAB,sinABC),Min(sinBCD,sinCDA)); // cout << A << B << C << D ; // cout << " sinmin " << sinmin << " " << cosDAB << " " << cosABC << " " << cosBCD << " " << cosCDA << endl; // rattente(1); if (sinmin<=0) return sinmin; return 1.0-Max(Max(Abs(cosDAB),Abs(cosABC)),Max(Abs(cosBCD),Abs(cosCDA))); } GeometricalEdge * Triangles::ProjectOnCurve( Edge & BhAB, Vertex & vA, Vertex & vB, Real8 theta, Vertex & R,VertexOnEdge & BR,VertexOnGeom & GR) { void *pA=0,*pB=0; Real8 tA=0,tB=0; R2 A=vA,B=vB; Vertex * pvA=&vA, * pvB=&vB; if (vA.vint == IsVertexOnVertex) { // cout << " Debut vertex = " << BTh.Number(vA.onbv) ; pA=vA.onbv; } else if (vA.vint == IsVertexOnEdge) { pA=vA.onbe->be; tA=vA.onbe->abcisse; // cout << " Debut edge = " << BTh.Number(vA.onbv) << " " << tA ; } else {cerr << "ProjectOnCurve On Vertex " << BTh.Number(vA) << " " << endl; cerr << " forget call to SetVertexFieldOnBTh" << endl; MeshError(-1); } if (vB.vint == IsVertexOnVertex) { // cout << " Fin vertex = " << BTh.Number(vB.onbv) << endl; pB=vB.onbv; } else if(vB.vint == IsVertexOnEdge) { pB=vB.onbe->be; tB=vB.onbe->abcisse; // cout << " Fin edge = " << BTh.Number(vB.onbe->be) << " " << tB ; } else {cerr << "ProjectOnCurve On Vertex " << BTh.Number(vB) << " " << endl; cerr << " forget call to SetVertexFieldOnBTh" << endl; MeshError(-1); } Edge * e = &BhAB; assert( pA && pB && e); // be carefull the back ground edge e is on same geom edge // of the initiale edge def by the 2 vertex A B; assert(e>=BTh.edges && e !IsRequiredVertex if (vA.vint == IsVertexOnEdge) if (tA<=0) assert(! (*vA.onbe->be)[0].on->IsRequiredVertex()); else if (tA>=1) assert(!(*vA.onbe->be)[1].on->IsRequiredVertex()); #endif if( vA.vint == IsVertexOnEdge) { // find the start edge e = vA.onbe->be; } else if (vB.vint == IsVertexOnEdge) { theta = 1-theta; Exchange(tA,tB); Exchange(pA,pB); Exchange(pvA,pvB); Exchange(A,B); e = vB.onbe->be; // cout << " EXCHANGE A et B) " << endl; } else { // do the search by walking assert(0 /* A FAIRE */); } // find the direction of walking with sens of edge and pA,PB; R2 AB=B-A; Real8 cosE01AB = (( (R2) (*e)[1] - (R2) (*e)[0] ) , AB); int kkk=0; int sens = (cosE01AB>0) ? 1 : 0; // Real8 l=0; // length of the edge AB Real8 abscisse = -1; for (int cas=0;cas<2;cas++) {// 2 times algo: // 1 for computing the length l // 2 for find the vertex int iii; Vertex *v0=pvA,*v1; Edge *neee,*eee; Real8 lg =0; // length of the curve Real8 te0; // we suppose take the curve's abcisse // cout << kkk << " e = " << BTh.Number(e) << " v0= " // << BTh.Number(v0) << " v1 = " << BTh.Number((*e)[sens]) << endl; for ( eee=e,iii=sens,te0=tA; eee && ((( void*) eee) != pB) && (( void*) (v1=&((*eee)[iii]))) != pB ; neee = eee->adj[iii],iii = 1-neee->Intersection(*eee),eee = neee,v0=v1,te0=1-iii ) { // cout << kkk << " eee = " << BTh.Number(eee) << " v0= " // << BTh.Number(v0) << " v1 = " << BTh.Number(v1) << endl; assert(kkk++<100); assert(eee); Real8 lg0 = lg; Real8 dp = LengthInterpole(v0->m,v1->m,(R2) *v1 - (R2) *v0); lg += dp; if (cas && abscisse <= lg) { // ok we find the geom edge Real8 sss = (abscisse-lg0)/dp; Real8 thetab = te0*(1-sss)+ sss*iii; assert(thetab>=0 && thetab<=1); BR = VertexOnEdge(&R,eee,thetab); // cout << Number(R) << " = " << thetab << " on " << BTh.Number(eee) // << " = " << R << endl; return Gh.ProjectOnCurve(*eee,thetab,R,GR); } } // we find the end if (v1 != pvB) { if (( void*) v1 == pB) tB = iii; Real8 lg0 = lg; assert(eee); v1 = pvB; Real8 dp = LengthInterpole(v0->m,v1->m,(R2) *v1 - (R2) *v0); lg += dp; abscisse = lg*theta; if (abscisse <= lg && abscisse >= lg0 ) // small optimisation we know the lenght because end { // ok we find the geom edge Real8 sss = (abscisse-lg0)/dp; Real8 thetab = te0*(1-sss)+ sss*tB; assert(thetab>=0 && thetab<=1); BR = VertexOnEdge(&R,eee,thetab); // cout << kkk << " eee = " << BTh.Number(eee) << " v0= " // << BTh.Number(v0) << " " << te0 // << " v1 = " << BTh.Number(v1) << " " << tB << endl; //out << Number(R) << " Opt = " << thetab << " on " << BTh.Number(eee) // << " = " << R << endl; return Gh.ProjectOnCurve(*eee,thetab,R,GR); } } abscisse = lg*theta; } cerr << " Big Bug" << endl; MeshError(678); return 0; // just for the compiler } void Triangles::MakeQuadrangles(double costheta) { if (verbosity>2) cout << " -- MakeQuadrangles costheta = " << costheta << endl; if (verbosity>5) cout << " (in) Nb of Quadrilaterals = " << NbOfQuad << " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 << " Nb of outside triangles = " << NbOutT << endl; if (costheta >1) { if (verbosity>5) cout << " do nothing costheta >1 "<< endl; return;} Int4 nbqq = (nbt*3)/2; DoubleAndInt4 *qq = new DoubleAndInt4[nbqq]; Int4 i,ij; int j; Int4 k=0; for (i=0;i=costheta) qq[k++].i3j=i*3+j; // sort qq HeapSort(qq,k); Int4 kk=0; for (ij=0;ij=costheta) triangles[i].SetHidden(j),kk++; } NbOfQuad = kk; if (verbosity>2) { cout << " (out) Nb of Quadrilaterals = " << NbOfQuad << " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 << " Nb of outside triangles = " << NbOutT << endl; } delete [] qq; #ifdef DRAWING2 Draw(); inquire(); #endif } /* Triangles::BThBoundary(Edge e,Real 8) const { // pointeur of the background must be on // Edge be = e.on; } */ int Triangles::SplitElement(int choice) { Direction NoDirOfSearch; const int withBackground = &BTh != this && &BTh; if (verbosity>2) cout << " -- SplitElement " << (choice? " Q->4Q and T->4T " : " Q->4Q or T->3Q " ) << endl;; if (verbosity>5) cout << endl << " (in) Nb of Quadrilaterals = " << NbOfQuad << " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 << " Nb of outside triangles = " << NbOutT << endl; ReNumberingTheTriangleBySubDomain(); #ifdef DRAWING2 Draw(); inquire(); #endif //int nswap =0; const Int4 nfortria( choice ? 4 : 6); if(withBackground) { BTh.SetVertexFieldOn(); SetVertexFieldOnBTh(); } else BTh.SetVertexFieldOn(); Int4 newnbt=0,newnbv=0; Int4 * kedge = 0; Int4 newNbOfQuad=NbOfQuad; Int4 * ksplit= 0, * ksplitarray=0; Int4 kkk=0; int ret =0; if (nbvxfindtrie(Number(v0),Number(v1)); // cout << ":" << ke << "," << !!t.link << " " << &tt ; if (ke<0) // new { if (&tt) // internal triangles all the boundary { // new internal edges Int4 ii = Number(tt); int jj = ta; kedge[3*i+j]=k;// save the vertex number kedge[3*ii+jj]=k; if (k=40); } // now do the element split newNbOfQuad = 4*NbOfQuad; nbv = k; #ifdef DRAWING2 inquire(); #endif // cout << " Nbv = " << nbv << endl; kkk = nbt; ksplit[-1] = nbt; // look on old true triangles for (i=0;i0); // def the numbering k (edge) i vertex int k0 = ke; int k1 = NextEdge[k0]; int k2 = PreviousEdge[k0]; int i0 = OppositeVertex[k0]; int i1 = OppositeVertex[k1]; int i2 = OppositeVertex[k2]; Triangle &t0=triangles[i]; Vertex * v0=t0(i0); Vertex * v1=t0(i1); Vertex * v2=t0(i2); // cout << "nbmkadj " << nbmkadj << " it=" << i <0); #endif V=D2xD2(vp1x,vp2x,vp1y,vp2y); } return; } MetricAnIso Intersection(const MetricAnIso M1,const MetricAnIso M2) ; MetricAnIso Intersection(const MetricAnIso M1,const MetricAnIso M2) { D2xD2 M; double l1,l2; ReductionSimultanee(M1,M2,l1,l2,M); R2 v0(M.x.x,M.y.x); R2 v1(M.x.y,M.y.y); D2xD2 M_1(M.inv()); D2xD2 D(Max(M1(v0,v0),M2(v0,v0)),0,0,Max(M1(v1,v1),M2(v1,v1))); D2xD2 Mi(M_1.t()*D*M_1); return MetricAnIso(Mi.x.x,0.5*(Mi.x.y+Mi.y.x),Mi.y.y); } MetricAnIso::MetricAnIso(const Real8 a[3],const MetricAnIso m0, const MetricAnIso m1,const MetricAnIso m2 ) { MetricAnIso mab(a[0]*m0.a11 + a[1]*m1.a11 + a[2]*m2.a11, a[0]*m0.a21 + a[1]*m1.a21 + a[2]*m2.a21, a[0]*m0.a22 + a[1]*m1.a22 + a[2]*m2.a22); MatVVP2x2 vab(mab); R2 v1(vab.v.x,vab.v.y); R2 v2(-v1.y,v1.x); Real8 h1 = a[0] / m0(v1) + a[1] / m1(v1) + a[2] / m2(v1); Real8 h2 = a[0] / m0(v2) + a[1] / m1(v2) + a[2] / m2(v2); vab.lambda1 = 1 / (h1*h1); vab.lambda2 = 1 / (h2*h2); *this = vab; } MetricAnIso::MetricAnIso( Real8 a,const MetricAnIso ma, Real8 b,const MetricAnIso mb) { MetricAnIso mab(a*ma.a11+b*mb.a11,a*ma.a21+b*mb.a21,a*ma.a22+b*mb.a22); MatVVP2x2 vab(mab); R2 v1(vab.v.x,vab.v.y); R2 v2(-v1.y,v1.x); Real8 h1 = a / ma(v1) + b / mb(v1); Real8 h2 = a / ma(v2) + b / mb(v2); vab.lambda1 = 1 / (h1*h1); vab.lambda2 = 1 / (h2*h2); *this = vab; } MatVVP2x2::MatVVP2x2(const MetricAnIso M) { double a11=M.a11,a21=M.a21,a22=M.a22; const double eps = 1.e-5; double c11 = a11*a11, c22 = a22*a22, c21= a21*a21; double b=-a11-a22,c=-c21+a11*a22; double delta = b*b - 4 * c ; double n2=(c11+c22+c21); if ( n2 < 1e-30) lambda1=lambda2=0,v.x=1,v.y=0; else if (delta < eps*n2) { lambda1=lambda2=-b/2, v.x=1,v.y=0; } else { // --- construction de 2 vecteur dans (Im ( A - D(i) Id) ortogonal delta = sqrt(delta); lambda1 = (-b-delta)/2.0,lambda2 = (-b+delta)/2.0; double v0 = a11-lambda1, v1 = a21,v2 = a22 - lambda1; double s0 = v0*v0 + v1*v1, s1 = v1*v1 +v2*v2; if(s1 < s0) s0=sqrt(s0),v.x=v1/s0,v.y=-v0/s0; else s1=sqrt(s1),v.x=v2/s1,v.y=-v1/s1; }; } int MetricAnIso::IntersectWith(const MetricAnIso M2) { //cerr << " - " << *this << M2 << endl; int r=0; MetricAnIso & M1 = *this; D2xD2 M; double l1,l2; ReductionSimultanee(*this,M2,l1,l2,M); // cerr << M << endl; R2 v1(M.x.x,M.y.x); R2 v2(M.x.y,M.y.y); double l11=M1(v1,v1); double l12=M1(v2,v2); double l21=M2(v1,v1); double l22=M2(v2,v2); if ( l11 < l21 ) r=1,l11=l21; if ( l12 < l22 ) r=1,l12=l22; // cerr << r << endl; if (r) { // change D2xD2 M_1(M.inv()); D2xD2 D(l11,0,0,l12); D2xD2 Mi(M_1.t()*D*M_1); a11=Mi.x.x; a21=0.5*(Mi.x.y+Mi.y.x); a22=Mi.y.y; } return r; } void Triangles::IntersectGeomMetric(const Real8 err=1,const int iso=0) { if(verbosity>1) cout << " -- IntersectGeomMetric geometric err=" << err << (iso ? " iso " : " aniso " ) << endl; Real8 ss[2]={0.00001,0.99999}; Real8 errC = 2*sqrt(2*err); Real8 hmax = Gh.MaximalHmax(); Real8 hmin = Gh.MinimalHmin(); Real8 maxaniso = 1e6; assert(hmax>0); SetVertexFieldOn(); if (errC > 1) errC = 1; for (Int4 i=0;iR1tg(s,tg); // cerr << " R = " << 1/Max(R1,1e-20) << tg << " on x " // << V.r << errC/ Max(R1,1e-20) << " hold=" <1.0e-20) { // err relative to the length of the edge ht = Min(Max(errC/R1,hmin),hmax); } Real8 hn = iso? ht : Min(hmax,ht*maxaniso); //cerr << ht << " " << hn << "m=" << edges[i][j].m << endl; assert(ht>0 && hn>0); MatVVP2x2 Vp(1/(ht*ht),1/(hn*hn),tg); //cerr << " : " ; Metric MVp(Vp); // cerr << " : " << MVp << endl; edges[i][j].m.IntersectWith(MVp); //cerr << " . " << endl; } } // the problem is for the vertex on vertex } /* void Triangles::BoundAnisotropy(Real8 anisomax) { if (verbosity > 1) cout << " -- BoundAnisotropy by " << anisomax << endl; Real8 h1=1.e30,h2=1e-30,rx=0; Real8 coef = 1./(anisomax*anisomax); Real8 hn1=1.e30,hn2=1e-30,rnx =1.e-30; for (Int4 i=0;i2) { cout << " input : Hmin = " << sqrt(1/h2) << " Hmax = " << sqrt(1/h1) << " factor of anisotropy max = " << sqrt(rx) << endl; cout << " output: Hmin = " << sqrt(1/hn2) << " Hmax = " << sqrt(1/hn1) << " factor of anisotropy max = " << sqrt(rnx) << endl; } } */ void Triangles::BoundAnisotropy(Real8 anisomax,Real8 hminaniso) { double lminaniso = 1/ (Max(hminaniso*hminaniso,1e-100)); if (verbosity > 1) cout << " -- BoundAnisotropy by " << anisomax << endl; Real8 h1=1.e30,h2=1e-30,rx=0; Real8 coef = 1./(anisomax*anisomax); Real8 hn1=1.e30,hn2=1e-30,rnx =1.e-30; for (Int4 i=0;i2) { cout << " input : Hmin = " << sqrt(1/h2) << " Hmax = " << sqrt(1/h1) << " factor of anisotropy max = " << sqrt(rx) << endl; cout << " output: Hmin = " << sqrt(1/hn2) << " Hmax = " << sqrt(1/hn1) << " factor of anisotropy max = " << sqrt(rnx) << endl; } } void Triangles::IntersectConsMetric(const double * s,const Int4 nbsol,const int * typsols, const Real8 hmin1,const Real8 hmax1,const Real8 coef, const Real8 anisomax ,const Real8 CutOff,const int NbJacobi, const int DoNormalisation,const double power,const int choice) { // the array of solution s is store // sol0,sol1,...,soln on vertex 0 // sol0,sol1,...,soln on vertex 1 // etc. // choise = 0 => H is computed with green formule // otherwise => H is computed from P2 on 4T const int dim = 2; int sizeoftype[] = { 1, dim ,dim * (dim+1) / 2, dim * dim } ; // computation of the nb of field Int4 ntmp = 0; if (typsols) { for (Int4 i=0;i1e-30; Real8 hmin = Max(hmin1,MinimalHmin()); Real8 hmax = Min(hmax1,MaximalHmax()); Real8 coef2 = 1/(coef*coef); if(verbosity>1) { cout << " -- Construction of Metric: Nb of field. " << n << " nbt = " << nbt << " nbv= " << nbv << " coef = " << coef << endl << " hmin = " << hmin << " hmax=" << hmax << " anisomax = " << anisomax << " Nb Jacobi " << NbJacobi << " Power = " << power ; if (RelativeMetric) cout << " RelativeErr with CutOff= " << CutOff << endl; else cout << " Absolute Err" <link) // no adj triangle => edge on boundary OnBoundary[Number(t[VerticesOfTriangularEdge[j][0]])]=1, OnBoundary[Number(t[VerticesOfTriangularEdge[j][1]])]=1, nbb++; } workT[i] = nbb; Mmass[iA] += dett; Mmass[iB] += dett; Mmass[iC] += dett; if((nbb==0)|| !choice) { Mmassxx[iA] += dett; Mmassxx[iB] += dett; Mmassxx[iC] += dett; } } else workT[i]=-1; // for (Int4 kcount=0;kcount2) cout << " Solution " << nusol << " Min = " << smin << " Max = " << smax << " Delta =" << sdelta << " cnorm = " << cnorm << " Nb of fields =" << nbfield << endl; if ( sdelta < 1.0e-10*Max(absmax,1e-20) && (nbfield ==1)) { if (verbosity>2) cout << " Solution " << nusol << " is constant. We skip. " << " Min = " << smin << " Max = " << smax << endl; continue; } double *sf = ss; for (Int4 nufield=0;nufieldlink) { Vertex &v = *ta.OppositeVertex(); R2 V = v; Int4 iV = Number(v); Real8 lA = bamg::Area2(V,B,C)/dd; Real8 lB = bamg::Area2(A,V,C)/dd; Real8 lC = bamg::Area2(A,B,V)/dd; taa[0][j] = lB*lC; taa[1][j] = lC*lA; taa[2][j] = lA*lB; //Real8 xx = V.x-V.y; //Real8 yy = V.x + V.y; //cout << " iv " << ss[iV*n] << " == " << (8*xx*xx+yy*yy) // << " l = " << lA << " " << lB << " " << lC // << " = " << lA+lB+lC << " " << V << " == " << A*lA+B*lB+C*lC << endl; lla = lA,llb=lB,llc=lC,llf=ss[iV*n] ; bb[j] = ss[iV*n] - ( sA*lA + sB*lB + sC*lC ) ; } else { nbb++; taa[0][j]=0; taa[1][j]=0; taa[2][j]=0; taa[j][j]=1; bb[j]=0; } } // resolution of 3x3 lineaire system transpose Real8 det33 = det3x3(taa[0],taa[1],taa[2]); Real8 cBC = det3x3(bb,taa[1],taa[2]); Real8 cCA = det3x3(taa[0],bb,taa[2]); Real8 cAB = det3x3(taa[0],taa[1],bb); assert(det33); // det33=1; // verif // cout << " " << (taa[0][0]*cBC + taa[1][0]*cCA + taa[2][0] * cAB)/det33 << " == " << bb[0] ; // cout << " " << (taa[0][1]*cBC + taa[1][1]*cCA + taa[2][1] * cAB)/det33 << " == " << bb[1]; // cout << " " << (taa[0][2]*cBC + taa[1][2]*cCA + taa[2][2] * cAB)/det33 << " == " << bb[2] // << " -- " ; //cout << lla*sA + llb*sB+llc*sC+ (lla*llb* cAB + llb*llc* cBC + llc*lla*cCA)/det33 // << " == " << llf << endl; // computation of the gradient in the element // H( li*lj) = grad li grad lj + grad lj grad lj // grad li = njk / detT ; with i j k ={A,B,C) Real8 Hxx = cAB * ( nBC.x*nCA.x) + cBC * ( nCA.x*nAB.x) + cCA * (nAB.x*nBC.x); Real8 Hyy = cAB * ( nBC.y*nCA.y) + cBC * ( nCA.y*nAB.y) + cCA * (nAB.y*nBC.y); Real8 Hxy = cAB * ( nBC.y*nCA.x) + cBC * ( nCA.y*nAB.x) + cCA * (nAB.y*nBC.x) + cAB * ( nBC.x*nCA.y) + cBC * ( nCA.x*nAB.y) + cCA * (nAB.x*nBC.y); Real8 coef = 1.0/(3*dd*det33); Real8 coef2 = 2*coef; // cout << " H = " << Hxx << " " << Hyy << " " << Hxy/2 << " coef2 = " << coef2 << endl; Hxx *= coef2; Hyy *= coef2; Hxy *= coef2; //cout << i << " H = " << 3*Hxx/dd << " " << 3*Hyy/dd << " " << 3*Hxy/(dd*2) << " nbb = " << nbb << endl; if(nbb==0) { dxdx[iA] += Hxx; dydy[iA] += Hyy; dxdy[iA] += Hxy; dxdx[iB] += Hxx; dydy[iB] += Hyy; dxdy[iB] += Hxy; dxdx[iC] += Hxx; dydy[iC] += Hyy; dxdy[iC] += Hxy; } } else { // if edge on boundary no contribution => normal = 0 if ( ! tBC || ! tBC->link ) nBC = O; if ( ! tCA || ! tCA->link ) nCA = O; if ( ! tAB || ! tAB->link ) nAB = O; // remark we forgot a 1/2 because // $\\int_{edge} w_i = 1/2 $ if $i$ is in edge // 0 if not // if we don't take the boundary // dxdx[iA] += ( nCA.x + nAB.x ) *Grads.x; dxdx[iA] += ( nCA.x + nAB.x ) *Grads.x; dxdx[iB] += ( nAB.x + nBC.x ) *Grads.x; dxdx[iC] += ( nBC.x + nCA.x ) *Grads.x; // warning optimization (1) the divide by 2 is done on the metrix construction dxdy[iA] += (( nCA.y + nAB.y ) *Grads.x + ( nCA.x + nAB.x ) *Grads.y) ; dxdy[iB] += (( nAB.y + nBC.y ) *Grads.x + ( nAB.x + nBC.x ) *Grads.y) ; dxdy[iC] += (( nBC.y + nCA.y ) *Grads.x + ( nBC.x + nCA.x ) *Grads.y) ; dydy[iA] += ( nCA.y + nAB.y ) *Grads.y; dydy[iB] += ( nAB.y + nBC.y ) *Grads.y; dydy[iC] += ( nBC.y + nCA.y ) *Grads.y; } } // for real all triangles Int4 kk=0; for ( iv=0,k=0 ; iv0) { dxdx[iv] /= 2*Mmassxx[iv]; // warning optimization (1) on term dxdy[iv]*ci/2 dxdy[iv] /= 4*Mmassxx[iv]; dydy[iv] /= 2*Mmassxx[iv]; // Compute the matrix with abs(eigen value) Metric M(dxdx[iv], dxdy[iv], dydy[iv]); MatVVP2x2 Vp(M); //cout <2) { cout << " Field " << nufield << " of solution " << nusol << endl; cout << " before bounding : Hmin = " << sqrt(1/h2) << " Hmax = " << sqrt(1/h1) << " factor of anisotropy max = " << sqrt(rx) << endl; cout << " after bounding : Hmin = " << sqrt(1/hn2) << " Hmax = " << sqrt(1/hn1) << " factor of anisotropy max = " << sqrt(rnx) << endl; } } // end of for all field }// end for all solution delete [] detT; delete [] Mmass; delete [] dxdx; delete [] dxdy; delete [] dydy; delete [] workT; delete [] workV; delete [] Mmassxx; delete [] OnBoundary; } void Triangles::ReadMetric(const char * fmetrix,const Real8 hmin1=1.0e-30,const Real8 hmax1=1.0e30,const Real8 coef=1) { Real8 hmin = Max(hmin1,MinimalHmin()); Real8 hmax = Min(hmax1,MaximalHmax()); MeshIstream f_metrix(fmetrix); Int4 k,j; f_metrix >> k >> j ; if(verbosity>1) cout << " metrix: open " << fmetrix << ", le coef = " << coef << ", hmin = " << hmin << ", hmax = " << hmax << ( (j == 1)? " Iso " : " AnIso " )<< endl; if (k != nbv || !(j == 1 || j == 3)) { cerr << " Error Pb metrix " << k << " <> " << nbv << " or 1 or 3 <> " << j << endl; MeshError(1002); } cout << " j = " << j << endl; // Int4 nberr = 0; for (Int4 iv=0;iv> h ; vertices[iv].m=Metric(Max(hmin,Min(hmax, h*coef))); } else if (j==3) { Real8 a,b,c; f_metrix >> a >> b >> c ; MetricAnIso M(a,b,c); MatVVP2x2 Vp(M/coef); Vp.Maxh(hmin); Vp.Minh(hmax); vertices[iv].m = Vp; } } } void Triangles::WriteMetric(ostream & f,int iso) { if (iso) { f << nbv <<" " << 1 << endl ; for (Int4 iv=0;iv1) cout << " -- Limit the subdivision of a edges in the new mesh by " << maxsubdiv << endl ; // for all the edges // if the len of the edge is to long Int4 it,nbchange=0; Real8 lmax=0; for (it=0;it maxsubdiv2) { R2 AC = M.Orthogonal(AB);// the ortogonal vector of AB in M Real8 lc = M(AC,AC); D2xD2 Rt(AB,AC);// Rt.x = AB , Rt.y = AC; D2xD2 Rt1(Rt.inv()); D2xD2 D(maxsubdiv2,0,0,lc); D2xD2 MM = Rt1*D*Rt1.t(); #ifdef DRAWING1 v0.m.Draw(v0); #endif v0.m = M = MetricAnIso(MM.x.x,MM.y.x,MM.y.y); #ifdef DRAWING1 v0.m.Draw(v0); #endif // cout << " M(AB,AB) = " << M(AB,AB) << " == " << maxsubdiv // << " M(AC,AC) = " << M(AC,AC) << " == " << lc << endl; nbchange++; } M = v1; l = M(AB,AB); lmax = Max(lmax,l); if(l> maxsubdiv2) { R2 AC = M.Orthogonal(AB);// the ortogonal vector of AB in M Real8 lc = M(AC,AC); D2xD2 Rt(AB,AC);// Rt.x = AB , Rt.y = AC; D2xD2 Rt1(Rt.inv()); D2xD2 D(maxsubdiv2,0,0,lc); D2xD2 MM = Rt1*D*Rt1.t(); #ifdef DRAWING1 v1.m.Draw(v1); #endif v1.m = M = MetricAnIso(MM.x.x,MM.y.x,MM.y.y); #ifdef DRAWING1 v1.m.Draw(v1); inquire(); #endif // cout << " M(AB,AB) = " << M(AB,AB) << " == " << maxsubdiv // << " M(AC,AC) = " << M(AC,AC) << " == " << lc << endl; nbchange++; } } } } if(verbosity>3) cout << " Nb of metric change = " << nbchange << " Max of the subdivision of a edges before change = " << sqrt(lmax) << endl; #ifdef DRAWING2 inquire(); #endif } void Triangles::SmoothMetric(Real8 raisonmax) { if(raisonmax<1.1) return; if(verbosity > 1) cout << " -- Triangles::SmoothMetric raisonmax = " << raisonmax << " " <=0&& kk++<100) { kch=0; for (i=Head0;i>=0;i=first_np_or_next_t0[ip=i],first_np_or_next_t0[ip]=-1) { // pour tous les triangles autour du sommet s // cout << kk << " i = " << i << " " << ip << endl; Triangle * t= vertices[i].t; assert(t); Vertex & vi = vertices[i]; TriangleAdjacent ta(t,EdgesVertexTriangle[vertices[i].vint][0]); Vertex *pvj0 = ta.EdgeVertex(0); while (1) { // cout << i << " " << Number(ta.EdgeVertex(0)) << " " // << Number(ta.EdgeVertex(1)) << " ---> " ; ta=Previous(Adj(ta)); // cout << Number(ta.EdgeVertex(0)) << " " << Number(ta.EdgeVertex(1)) << endl; assert(vertices+i == ta.EdgeVertex(1)); Vertex & vj = *(ta.EdgeVertex(0)); if ( &vj ) { j= &vj-vertices; assert(j>=0 && j < nbv); R2 Aij = (R2) vj - (R2) vi; Real8 ll = Norme2(Aij); if (0) { Real8 hi = ll/vi.m(Aij); Real8 hj = ll/vj.m(Aij); if(hi < hj) { Real8 dh=(hj-hi)/ll; //cout << " dh = " << dh << endl; if (dh>logseuil) { vj.m.IntersectWith(vi.m/(1 +logseuil*ll/hi)); if(first_np_or_next_t1[j]<0) kch++,first_np_or_next_t1[j]=Head1,Head1=j; } } } else { Real8 li = vi.m(Aij); //Real8 lj = vj.m(Aij); // if ( i == 2 || j == 2) // cout << " inter " << i << " " << j << " " << ((1 +logseuil*li)) << endl; if( vj.m.IntersectWith(vi.m/(1 +logseuil*li)) ) //if( vj.m.IntersectWith(vi.m*(lj/li/(1 +logseuil*lj))) ) if(first_np_or_next_t1[j]<0) // if the metrix change kch++,first_np_or_next_t1[j]=Head1,Head1=j; } } if ( &vj == pvj0 ) break; } } Head0 = Head1; Head1 = -1; Exchange(first_np_or_next_t0,first_np_or_next_t1); if(verbosity>5) cout << " Iteration " << kk << " Nb de vertices with change " << kch << endl; } if(verbosity>2 && verbosity < 5) cout << " Nb of Loop " << kch << endl; delete [] first_np_or_next_t0; delete [] first_np_or_next_t1; } void Geometry::ReadMetric(const char * fmetrix,Real8 hmin=1.0e-30,Real8 hmax=1.0e30,Real8 coef=1) { hmin = Max(hmin,MinimalHmin()); MeshIstream f_metrix(fmetrix); Int4 k,j; f_metrix >> k >> j ; if(verbosity>1) cout << " -- ReadMetric " << fmetrix << ", coef = " << coef << ", hmin = " << hmin << ", hmax = " << hmax << ( (j == 1)? " Iso " : " AnIso " ) << endl; if (k != nbv || !(j == 1 || j == 3)) { cerr << " Error Pb metrix " << k << " <> " << nbv << " or 1 or 3 <> " << j << endl; MeshError(1003);} // Int4 nberr = 0; for (Int4 iv=0;iv> h ; vertices[iv].m=Metric(Max(hmin,Min(hmax, h*coef))); } else if (j==3) { Real8 a,b,c; f_metrix >> a >> b >> c ; MetricAnIso M(a,b,c); MatVVP2x2 Vp(M/coef); Vp.Maxh(hmin); Vp.Minh(hmax); vertices[iv].m = Vp; } } } Real8 LengthInterpole(const MetricAnIso Ma,const MetricAnIso Mb, R2 AB) { Real8 k=1./2.; int level=0; static int kkk=0; static Metric Ms1[32],Ms2[32]; static Real8 lMs1[32],lMs2[32]; static double K[32]; Real8 l=0,sss=0; Ms1[level]=Ma; Ms2[level]=Mb; Real8 sa = Ma(AB); Real8 sb = Mb(AB); lMs1[level]=sa; lMs2[level]=sb; K[level]=k; level++; int i=0; Real8 * L= LastMetricInterpole.L, *S = LastMetricInterpole.S; Real8 sstop = 0.1; // Max(0.6,(sa+sb)/5000); while (level) { level--; Metric M1=Ms1[level]; Metric M2=Ms2[level]; k=K[level]; Real8 s1= lMs1[level]; Real8 s2= lMs2[level]; Real8 s= (s1+s2)*k; // if (level >20 && i < 2030-level) // cout << " level " << level << " " << i << " " << s << " " << k < sstop && level < 30 && i < 500-level ) { Metric Mi(0.5,M1,0.5,M2); Real8 si = Mi(AB); if( Abs((s1+s2)-(si+si)) > s1*0.001) { k=k/2; // we begin by the end to walk in the correct sens from a to b // due to the stack Ms1[level]=Mi; Ms2[level]=M2; lMs1[level]=si; lMs2[level]=s2; K[level]=k; level++; Ms1[level]=M1; Ms2[level]=Mi; lMs1[level]=s1; lMs2[level]=si; K[level]=k; level++; } else L[i]= l += s,S[i]=sss+=k,i++; } else L[i]= l += s,S[i]=sss+=k,i++;//cout << i << " l = " << l << " sss = " << sss << endl; } // warning for optimisation S is in [0:0.5] not in [0:1] assert(i<512); LastMetricInterpole.lab=l; LastMetricInterpole.opt=i; if (i>200 && kkk++<10) cout << "Warning LengthInterpole: ( i = " << i << " l = " << l << " sss " << sss << " ) " << sstop <=L[j]) r=1; else { while (j-i>1) { k= (i+j)/2; if(l<=L[k]) j=k;// l<=L[j] else i=k; // L[i] D2; typedef P2xP2 D2xD2; class MetricAnIso; class MatVVP2x2; class MetricIso; typedef TYPEMETRIX Metric; class MetricIso{ friend class MatVVP2x2; Real4 h; public: MetricIso(Real4 a): h(a){} MetricIso(const MetricAnIso M);// {MatVVP2x2 vp(M);h=1/sqrt(Max(vp.lambda1,vp.lambda2));} MetricIso(Real8 a11,Real8 a21,Real8 a22);// {*this=MetricAnIso(a11,a21,a22));} MetricIso(): h(1) {}; // MetricIso(const Real8 a[3],const MetricIso m0, const MetricIso m1,const MetricIso m2 ) : h(hinterpole ? (a[0]*m0.h+a[1]*m1.h+a[2]*m2.h) : 1/sqrt(a[0]/(m0.h*m0.h)+a[1]/(m1.h*m1.h)+a[2]/(m2.h*m2.h))) {} MetricIso(const Real8 a,const MetricIso ma, const Real8 b,const MetricIso mb) : h(hinterpole ? a*ma.h+b*mb.h :1/sqrt(a/(ma.h*ma.h)+b/(mb.h*mb.h))) {} R2 Orthogonal(const R2 A)const {return R2(-h*A.y,h*A.x);} R2 Orthogonal(const I2 A)const {return R2(-h*A.y,h*A.x);} // D2 Orthogonal(const D2 A)const {return D2(-h*A.y,h*A.x);} Real8 operator()(R2 x) const { return sqrt((x,x))/h;}; Real8 operator()(R2 x,R2 y) const { return ((x,y))/(h*h);}; int IntersectWith(MetricIso M) {int r=0;if (M.h>(istream& f, MatVVP2x2 & c) { f >> c.lambda1 >>c.lambda2 >> c.v.x >> c.v.y ;c.v /= Norme2(c.v); return f; } MatVVP2x2(const MetricAnIso ); MatVVP2x2(const MetricIso M) : lambda1(1/(M.h*M.h)),lambda2(1/(M.h*M.h)),v(1,0) {} Real8 hmin() const {return sqrt(1/bamg::Max3(lambda1,lambda2,1e-30));} Real8 hmax() const {return sqrt(1/bamg::Max(bamg::Min(lambda1,lambda2),1e-30));} Real8 lmax() const {return bamg::Max3(lambda1,lambda2,1e-30);} Real8 lmin() const {return bamg::Max(bamg::Min(lambda1,lambda2),1e-30);} Real8 Aniso2() const { return lmax()/lmin();} inline void BoundAniso2(const Real8 coef); Real8 Aniso() const { return sqrt( Aniso2());} void BoundAniso(const Real8 c){ BoundAniso2(1/(c*c));} void operator *=(double coef){ lambda1*=coef;lambda2*=coef;} }; inline void MatVVP2x2::BoundAniso2(const Real8 coef) { if (coef<=1.00000000001) if (lambda1 < lambda2) lambda1 = bamg::Max(lambda1,lambda2*coef); else lambda2 = bamg::Max(lambda2,lambda1*coef); else // a verifier if (lambda1 > lambda2) lambda1 = bamg::Min(lambda1,lambda2*coef); else lambda2 = bamg::Min(lambda2,lambda1*coef); } void ReductionSimultanee( MetricAnIso M1, MetricAnIso M2,double & l1,double & l2, D2xD2 & V) ; inline MetricAnIso::MetricAnIso(const MatVVP2x2 M) { // recompose M in: M = V^t lambda V // V = ( v,v^\perp) // where v^\perp = (-v_1,v_0) double v00=M.v.x*M.v.x; double v11=M.v.y*M.v.y; double v01=M.v.x*M.v.y; a11=v00*M.lambda1+v11*M.lambda2; a21=v01*(M.lambda1-M.lambda2); a22=v00*M.lambda2+v11*M.lambda1; } inline void MetricAnIso::Box(Real4 &hx,Real4 &hy) const { Real8 d= a11*a22-a21*a21; hx = sqrt(a22/d); hy = sqrt(a11/d); // cerr << " hx = " << hx << " hy = " << hy << endl; } inline MetricIso::MetricIso(const MetricAnIso M) {MatVVP2x2 vp(M);h=1/sqrt(Max(vp.lambda1,vp.lambda2));} inline MetricIso::MetricIso(Real8 a11,Real8 a21,Real8 a22) {MatVVP2x2 vp(MetricAnIso(a11,a21,a22));h=1/sqrt(Max(vp.lambda1,vp.lambda2));} class SaveMetricInterpole { friend Real8 LengthInterpole(const MetricAnIso ,const MetricAnIso , R2 ); friend Real8 abscisseInterpole(const MetricAnIso ,const MetricAnIso , R2 ,Real8 ,int ); int opt; Real8 lab; Real8 L[1024],S[1024]; }; extern SaveMetricInterpole LastMetricInterpole; // for optimization Real8 LengthInterpole(const MetricAnIso Ma,const MetricAnIso Mb, R2 AB); Real8 abscisseInterpole(const MetricAnIso Ma,const MetricAnIso Mb, R2 AB,Real8 s,int optim=0); inline Real8 LengthInterpole(Real8 la,Real8 lb) { return ( Abs(la - lb) < 1.0e-6*Max3(la,lb,1.0e-20) ) ? (la+lb)/2 : la*lb*log(la/lb)/(la-lb);} inline Real8 abscisseInterpole(Real8 la,Real8 lb,Real8 lab,Real8 s) { return ( Abs(la - lb) <1.0e-6*Max3(la,lb,1.0e-20)) ? s : (exp(s*lab*(la-lb)/(la*lb))-1)*lb/(la-lb);} } freefem++-3.38-1/src/bamglib/QuadTree.cpp000644 000767 000024 00000027160 12310010353 020200 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include //#include #include #include #include "Meshio.h" #include "Mesh2.h" #include "QuadTree.h" namespace bamg { #define INTER_SEG(a,b,x,y) (((y) > (a)) && ((x) <(b))) #define ABS(i) ((i)<0 ?-(i) :(i)) #define MAX1(i,j) ((i)>(j) ?(i) :(j)) #define NORM(i1,j1,i2,j2) MAX1(ABS((i1)-(j1)),ABS((i2)-(j2))) #define IJ(i,j,l) ( ( j & l) ? (( i & l) ? 3 : 2 ) :( ( i & l)? 1 : 0 )) #define I_IJ(k,l) (( k&1) ? l : 0) #define J_IJ(k,l) (( k&2) ? l : 0) #ifdef DRAWING void QuadTree::Draw() { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; Icoor1 ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; IntQuad hb = MaxISize; if(!root) return; // Int4 kkk =0; pb[0]= root; pi[0]= root->n>0 ?(int) root->n : 4 ; ii[0]=jj[0]=0; do{ b= pb[l]; while (pi[l]--) { if (b->n>0) // Vertex QuadTreeBox none empty { // for (int k=0;kn;k++) { I2 i2 = b->v[k]->i; IMoveTo(i2.x,i2.y+50); ILineTo(i2.x,i2.y-50); IMoveTo(i2.x+50,i2.y); ILineTo(i2.x-50,i2.y); assert(ii[l] <= i2.x); assert(jj[l] <= i2.y); assert(ii[l] +hb > i2.x); assert(jj[l] +hb > i2.y); } break; } else // Pointer QuadTreeBox { int lll = pi[l]; QuadTreeBox *b0=b; if ((b=b->b[lll])) { hb >>=1 ; // div by 2 Icoor1 iii = ii[l]+I_IJ(lll,hb); Icoor1 jjj = jj[l]+J_IJ(lll,hb); pb[++l]= b; pi[l]= 4; ii[l]= iii; jj[l]= jjj; IMoveTo(ii[l],jj[l]); ILineTo(ii[l]+hb,jj[l]); ILineTo(ii[l]+hb,jj[l]+hb); ILineTo(ii[l] ,jj[l]+hb); ILineTo(ii[l] ,jj[l]); } else { Icoor1 iii = ii[l]+I_IJ(lll,hb/2); Icoor1 jjj = jj[l]+J_IJ(lll,hb/2); b=b0; IMoveTo(iii, jjj); ILineTo(iii+hb/2,jjj+hb/2); IMoveTo(iii+hb/2,jjj); ILineTo(iii ,jjj+hb/2); } } } hb <<= 1; // mul by 2 } while (l--); } #endif Vertex * QuadTree::NearestVertex(Icoor1 i,Icoor1 j) { QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; Icoor1 ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; IntQuad h=MaxISize,h0; IntQuad hb = MaxISize; Icoor1 i0=0,j0=0; Icoor1 iplus( in) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) Icoor1 hb2 = hb >> 1 ; int k = IJ(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; i0 += I_IJ(k,hb2); // i orign of QuadTreeBox j0 += J_IJ(k,hb2); // j orign of QuadTreeBox hb = hb2; } if ( n0 > 0) { for( int k=0;kv[k]->i; h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k];} NbVerticesSearch++; } return vn; } // general case ----- pb[0]= b; pi[0]=b->n>0 ?(int) b->n : 4 ; ii[0]=i0; jj[0]=j0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; I2 i2 = b->v[k]->i; h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k]; } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 Icoor1 iii = ii[l]+I_IJ(k,hb); Icoor1 jjj = jj[l]+J_IJ(k,hb); if (INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; ii[l]= iii; jj[l]= jjj; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return vn; } Vertex * QuadTree::ToClose(Vertex & v,Real8 seuil,Icoor1 hx,Icoor1 hy) { const Icoor1 i=v.i.x; const Icoor1 j=v.i.y; const R2 X(v.r); const Metric Mx(v.m); QuadTreeBox * pb[ MaxDeep ]; int pi[ MaxDeep ]; Icoor1 ii[ MaxDeep ], jj [ MaxDeep]; int l=0; // level QuadTreeBox * b; Icoor1 h=MaxISize; Icoor1 hb = MaxISize; Icoor1 i0=0,j0=0; // Vertex *vn=0; if (!root->n) return 0; // empty tree // general case ----- pb[0]=root; pi[0]=root->n>0 ?(int) root->n : 4 ; ii[0]=i0; jj[0]=j0; h=hb; do { b= pb[l]; while (pi[l]--) { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; I2 i2 = b->v[k]->i; if ( ABS(i-i2.x) v[k]->r); Real8 dd; // old code if( Mx(XY) + b->v[k]->m(XY) < seuil ) if( (dd= LengthInterpole(Mx(XY), b->v[k]->m(XY))) < seuil ) { // cout << CurrentTh->Number(v) << "is To Close " // << CurrentTh->Number( b->v[k]) << " l=" <v[k]; } } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 long iii = ii[l]+I_IJ(k,hb); long jjj = jj[l]+J_IJ(k,hb); if (INTER_SEG(iii,iii+hb,i-hx,i+hx) && INTER_SEG(jjj,jjj+hb,j-hy,j+hy)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; ii[l]= iii; jj[l]= jjj; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return 0; } void QuadTree::Add( Vertex & w) { QuadTreeBox ** pb , *b; long i=w.i.x, j=w.i.y,l=MaxISize; pb = &root; // cout << pb << " " << &root << endl; while( (b=*pb) && (b->n<0)) { b->n--; l >>= 1; pb = &b->b[IJ(i,j,l)]; } if (b) { if (b->n > 3 && b->v[3] == &w) return; if (b->n > 2 && b->v[2] == &w) return; if (b->n > 1 && b->v[1] == &w) return; if (b->n > 0 && b->v[0] == &w) return; } assert(l); while ((b= *pb) && (b->n == 4)) // the QuadTreeBox is full { Vertex *v4[4]; // copy of the QuadTreeBox vertices v4[0]= b->v[0]; v4[1]= b->v[1]; v4[2]= b->v[2]; v4[3]= b->v[3]; b->n = -b->n; // mark is pointer QuadTreeBox b->b[0]=b->b[1]=b->b[2]=b->b[3]=0; // set empty QuadTreeBox ptr l >>= 1; // div the size by 2 for ( int k=0;k<4;k++) // for the 4 vertices find the sub QuadTreeBox ij { int ij; QuadTreeBox * bb = b->b[ij=IJ(v4[k]->i.x,v4[k]->i.y,l)]; if (!bb) bb=b->b[ij]=NewQuadTreeBox(); // alloc the QuadTreeBox // cout << bb << " " << k << " " << ij << endl; bb->v[bb->n++] = v4[k]; } pb = &b->b[IJ(i,j,l)]; } if (!(b = *pb)) b=*pb= NewQuadTreeBox(); // alloc the QuadTreeBox // cout << b << " " << b->n << endl; b->v[b->n++]=&w; // we add the vertex NbVertices++; } QuadTree::QuadTree(Triangles * t,long nbv) : lenStorageQuadTreeBox(t->nbvx/8+10), th(t), NbQuadTreeBox(0), NbVertices(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0) { if (nbv == -1) nbv = t->nbv; sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); assert( MaxISize > MaxICoor); for (Int4 i=0;ivertices[i]); #ifdef DRAWING1 Draw(); #endif } QuadTree::QuadTree() : lenStorageQuadTreeBox(100), th(0), NbQuadTreeBox(0), NbVertices(0), NbQuadTreeBoxSearch(0), NbVerticesSearch(0) { sb =new StorageQuadTreeBox(lenStorageQuadTreeBox); root=NewQuadTreeBox(); } QuadTree::StorageQuadTreeBox::StorageQuadTreeBox(long ll,StorageQuadTreeBox *nn) { len = ll; n = nn; b = new QuadTreeBox[ll]; for (int i = 0; i n) return vn; // empty tree while( (n0 = b->n) < 0) { // search the non empty // QuadTreeBox containing the point (i,j) Icoor1 hb2 = hb >> 1 ; int k = IJ(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j QuadTreeBox * b0= b->b[k]; if ( ( b0 == 0) || (b0->n == 0) ) break; // null box or empty => break NbQuadTreeBoxSearch++; b=b0; i0 += I_IJ(k,hb2); // i orign of QuadTreeBox j0 += J_IJ(k,hb2); // j orign of QuadTreeBox hb = hb2; } if ( n0 > 0) { for( int k=0;kv[k]->i; // try if is in the right sens -- h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k];} NbVerticesSearch++; } if (vn) return vn; } // general case ----- // INITIALISATION OF THE HEAP l =0; // level pb[0]= b; pi[0]=b->n>0 ?(int) b->n : 4 ; ii[0]=i0; jj[0]=j0; h=hb; do { // walk on the tree b= pb[l]; while (pi[l]--) // loop on 4 element of the box { int k = pi[l]; if (b->n>0) // Vertex QuadTreeBox none empty { NbVerticesSearch++; I2 i2 = b->v[k]->i; // if good sens when try -- h0 = NORM(iplus,i2.x,jplus,i2.y); if (h0 v[k]; } } else // Pointer QuadTreeBox { QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 Icoor1 iii = ii[l]+I_IJ(k,hb); Icoor1 jjj = jj[l]+J_IJ(k,hb); if (INTER_SEG(iii,iii+hb,iplus-h,iplus+h) && INTER_SEG(jjj,jjj+hb,jplus-h,jplus+h)) { pb[++l]= b; pi[l]= b->n>0 ?(int) b->n : 4 ; ii[l]= iii; jj[l]= jjj; } else b=b0, hb <<=1 ; } else b=b0; } } hb <<= 1; // mul by 2 } while (l--); return vn; } } // end of namespace bamg freefem++-3.38-1/src/bamglib/QuadTree.h000644 000767 000024 00000005276 11406142256 017666 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ namespace bamg { const int MaxDeep = 30; typedef long IntQuad; const IntQuad MaxISize = ( 1L << MaxDeep); class Triangles; class Vertex; class QuadTree { public: class QuadTreeBox { public: long n; // if n < 4 => Vertex else => QuadTreeBox; union { QuadTreeBox *b[4]; Vertex * v[4]; }; }; // end class QuadTreeBox ///////////////// class StorageQuadTreeBox { public: QuadTreeBox *b,*bc,*be; long len; StorageQuadTreeBox *n; // next StorageQuadTreeBox StorageQuadTreeBox(long ,StorageQuadTreeBox * =0); ~StorageQuadTreeBox() { //cout << "~StorageQuadTreeBox " << this << " n " << n << " b " << b << endl; if(n) delete n; delete [] b; } long SizeOf() const { return len*sizeof(QuadTreeBox)+sizeof(StorageQuadTreeBox)+ (n?n->SizeOf():0); } }; // end class StorageQuadTreeBox StorageQuadTreeBox * sb; long lenStorageQuadTreeBox; public: QuadTreeBox * root; Triangles *th; long NbQuadTreeBox,NbVertices; long NbQuadTreeBoxSearch,NbVerticesSearch; Vertex * NearestVertex(Icoor1 i,Icoor1 j); Vertex * NearestVertexWithNormal(Icoor1 i,Icoor1 j); // new version Vertex * ToClose(Vertex & ,Real8 ,Icoor1,Icoor1); long SizeOf() const {return sizeof(QuadTree)+sb->SizeOf();} #ifdef DRAWING void Draw(); #endif void Add( Vertex & w); QuadTreeBox* NewQuadTreeBox() { ///cout << "NewQuadTreeBox " << sb << " " << sb->bc << " " //<< sb->be << " " <bcbe)) sb=new StorageQuadTreeBox(lenStorageQuadTreeBox,sb); assert(sb && (sb->bc->n == 0)); NbQuadTreeBox++; return sb->bc++; } ~QuadTree(); QuadTree(Triangles * t,long nbv=-1); QuadTree(); friend ostream& operator <<(ostream& f, const QuadTree & qt); }; } //#undef IJ freefem++-3.38-1/src/bamglib/R2.cpp000644 000767 000024 00000001674 11406226635 016774 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include using namespace std; #include "R2.h" freefem++-3.38-1/src/bamglib/R2.h000644 000767 000024 00000011214 11406142256 016424 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ namespace bamg { template class P2xP2; template class P2 { public: R x,y; P2 () :x(0),y(0) {}; P2 (R a,R b) :x(a),y(b) {} P2 (P2 A,P2 B) : x(B.x-A.x),y(B.y-A.y) {} P2 operator+(const P2 & cc) const {return P2(x+cc.x,y+cc.y);} P2 operator-(const P2 & cc) const {return P2(x-cc.x,y-cc.y);} P2 operator-() const{return P2(-x,-y);} // RR operator*(const P2 & cc) const {return (RR) x* (RR) cc.x+(RR) y* (RR) cc.y;} // produit scalaire RR operator,(const P2 & cc) const {return (RR) x* (RR) cc.x+(RR) y* (RR) cc.y;} // produit scalaire P2 operator*(R cc) const {return P2(x*cc,y*cc);} // P2 operator*(RR cc) const {return P2((R)(x*cc),(R)(y*cc));} P2 operator/(R cc) const {return P2(x/cc,y/cc);} P2 operator+=(const P2 & cc) {x += cc.x;y += cc.y;return *this;} P2 operator/=(const R r) {x /= r;y /= r;return *this;} P2 operator*=(const R r) {x *= r;y *= r;return *this;} P2 operator-=(const P2 & cc) {x -= cc.x;y -= cc.y;return *this;} // P2 Orthogonal(const P2 r) {return P2(-r.y,r.x);} }; template class P2xP2 { // x ligne 1 y ligne2 friend ostream& operator <<(ostream& f, const P2xP2 & c) { f << '[' << c.x << ',' << c.y << ']' < operator*(P2 c,P2xP2 cc) {return P2(c.x*cc.x.x + c.y*cc.y.x, c.x*cc.x.y + c.y*cc.y.y);} public: P2 x,y; P2xP2 (): x(),y() {} P2xP2 (P2 a,P2 b): x(a),y(b) {} P2xP2 (P2 a,P2 b,P2 c ): x(b-a),y(c-a) {} P2xP2 (R xx,R xy,R yx,R yy) :x(xx,xy),y(yx,yy) {} P2 operator*(const P2 c) const {return P2(x.x*c.x + x.y*c.y, y.x*c.x + y.y*c.y);} P2xP2 operator*(P2xP2 c) const { return P2xP2(x.x*c.x.x + x.y*c.y.x, x.x*c.x.y + x.y*c.y.y, y.x*c.x.x + y.y*c.y.x, y.x*c.x.y + y.y*c.y.y);} RR det() const {return (RR) x.x* (RR) y.y - (RR) x.y * (RR) y.x;} P2xP2 inv() const { RR d = (*this).det(); return P2xP2((R)( y.y /d) ,(R)(-x.y/d),(R)( -y.x/d) ,(R)( x.x/d) ); }; P2xP2 t() {return P2xP2(x.x,y.x,x.y,y.y);} //transposer P2tx() {return P2(x.x,y.x);} P2ty() {return P2(x.y,y.y);} }; //template // transposer //inline P2xP2 t(P2xP2 m) // {return P2xP2(m.x.x,m.y.x,m.x.y,m.y.y);} template inline RR Det(const P2 x,const P2 y) { return (RR) x.x * (RR) y.y - (RR) x.y * (RR) y.x ;} template inline RR Area2 (const P2 a,const P2 b,const P2 c) { return Det(b-a,c-a) ;} template inline R Norme1 (const P2 x) { return (Abs(x.x)+Abs(x.y)) ;} template inline R NormeInfini (const P2 x) { return Max(Abs(x.x),Abs(x.y)) ;} template inline RR Norme2_2 (const P2 x) { return (RR)x.x*(RR)x.x + (RR)x.y*(RR)x.y ;} template inline RR Norme2 (const P2 x) { return sqrt((RR)x.x*(RR)x.x + (RR)x.y*(RR)x.y) ;} template inline P2 Orthogonal (const P2 x) { return P2(-x.y,x.x);} template inline ostream& operator <<(ostream& f, const P2 & c) { f << '[' << c.x << ',' << c.y <<']' < inline P2 Min2(P2 x,P2 y) {return P2(Min(x.x,y.x),Min(x.y,y.y) ;} template inline P2 Max2(P2 x,P2 y) {return P2(Max(x.x,y.x),Max(x.y,y.y) ;} */ } freefem++-3.38-1/src/bamglib/SetOfE4.cpp000644 000767 000024 00000004163 11406226635 017716 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include using namespace std; #include "meshtype.h" #include "SetOfE4.h" namespace bamg { SetOfEdges4::SetOfEdges4(Int4 mmx,Int4 nnx) {nx=nnx; nbax=mmx; NbOfEdges = 0; tete= new Int4 [nx]; Int4 i=nx; while (i--) tete[i] = -1;// vide Edges =new Int4Edge[nbax]; } Int4 SetOfEdges4::find(Int4 ii,Int4 jj) { if (tete == 0 ) { cerr <<"SetOfEdges4::find \nplus de tete de liste\n"; MeshError(888);} Int4 n = tete[ Abs( ii ) % nx ]; while (n >= 0) if (ii == Edges[n].i && jj == Edges[n].j) return n; else n = Edges[n].next; return -1; // n'existe pas } Int4 SetOfEdges4::add(Int4 ii,Int4 jj) { if (tete == 0 ) { cerr << "SetOfEdges4::add\n plus de tete de liste \n" << endl; MeshError(888);} Int4 h; Int4 n = tete[ h = Abs( ii ) % nx ]; while (n >= 0) if (ii == Edges[n].i && jj == Edges[n].j) return n; else n = Edges[n].next; if (nbax <=NbOfEdges ) { cerr << " SetOfEdges4::add\noverflow de la pile " << nbax << " " << NbOfEdges << endl; MeshError(888);} Edges[NbOfEdges].i=ii; Edges[NbOfEdges].j=jj; Edges[NbOfEdges].next= tete[h]; tete[h] = NbOfEdges; return NbOfEdges ++; } } // end of namespace bamg freefem++-3.38-1/src/bamglib/SetOfE4.h000644 000767 000024 00000003365 11406142256 017362 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _SetOfEdge4_h #define _SetOfEdge4_h namespace bamg { class SetOfEdges4 ; class Int4Edge{ friend class SetOfEdges4; public: Int4 i,j; Int4 next; }; class SetOfEdges4 { Int4 nx,nbax,NbOfEdges; Int4 * tete; Int4Edge * Edges; public: SetOfEdges4(Int4 ,Int4);// nb Edges mx , nb de sommet ~SetOfEdges4() {// cout << " delete SetofArete " << endl ; delete [] tete; delete [] Edges;} Int4 add (Int4 ii,Int4 jj); Int4 addtrie (Int4 ii,Int4 jj) {return ii <=jj ? add (ii,jj) : add (jj,ii) ;} Int4 nb(){return NbOfEdges;} Int4 find (Int4 ii,Int4 jj); Int4 findtrie (Int4 ii,Int4 jj) {return ii <=jj ? find (ii,jj) : find (jj,ii) ;} // inline void close(); Int4 i(Int4 k){return Edges[k].i;} Int4 j(Int4 k){return Edges[k].j;} Int4 newarete(Int4 k){return NbOfEdges == k+1;} Int4Edge & operator[](Int4 k){return Edges[k];} }; } #endif freefem++-3.38-1/src/bamglib/write_hdf5.cpp000644 000767 000024 00000046311 12462701266 020547 0ustar00hechtstaff000000 000000 #include "config.h" extern long verbosity; #ifdef HAVE_HDF5 #include "write_hdf5.hpp" using std::max; using std::min; WriteHdf5::WriteHdf5(const char *ffname, Int4 nbelem, Int4 nbvertex) : hdf5_filename(ffname), nbofelem(nbelem), nbofvertex(nbvertex) { //constructeur //creation du fichier hdf5 file_id = H5Fcreate(hdf5_filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); status=0; } WriteHdf5::~WriteHdf5() { } void WriteHdf5::WriteHdf5MeshFile2D(float coordinates[][2], int connec[][3]) { //ecriture du maillage 2D au format hdf5 pour paraview hid_t group_id_connec; hid_t group_id_coord; hid_t dataset_id_coord, dataspace_id_coord; hid_t aid_max_x, aid_min_x, aid_max_y, aid_min_y; hid_t attr_max_x, attr_min_x, attr_max_y, attr_min_y; hid_t dataset_id_elem2node, dataspace_id_elem2node; hid_t dataset_id_nelem, dataspace_id_nelem; hid_t dataset_id_nnode, dataspace_id_nnode; hid_t dataset_id_elemtype, dataspace_id_elemtype; hid_t dataset_id_meshtype, dataspace_id_meshtype; hid_t type_id,type_mesh_id; hsize_t dims_coord[2]; hsize_t dims_x_max[1]; hsize_t dims_x_min[1]; hsize_t dims_y_max[1]; hsize_t dims_y_min[1]; hsize_t dims_elem2node[2]; hsize_t dims_nelem[1]; hsize_t dims_nnode[1]; dims_coord[0] = nbofvertex; dims_coord[1] = 2; dims_x_max[0] = 1; dims_x_min[0] = 1; dims_y_max[0] = 1; dims_y_min[0] = 1; dims_elem2node[0] = nbofelem; dims_elem2node[1] = 3; dims_nelem[0] = 1; dims_nnode[0] = 1; float x_max = coordinates[0][0]; float x_min = coordinates[0][0]; float y_max = coordinates[0][1]; float y_min = coordinates[0][1]; for (int i=0;i type_char(3); vector res_char(2); type_char[0]= "Scalar"; type_char[1]= "Vector"; type_char[2]= "Vector"; res_char[0]= "Cell"; res_char[1]= "Node"; size_t size_datafieldname = fieldname->size() + 1; char * char_datafieldname = new char[size_datafieldname]; strncpy(char_datafieldname, fieldname->c_str(), size_datafieldname); char * char_datafieldname_tot=new char[size_data+size_datafieldname]; strncpy(char_datafieldname_tot, str_data.c_str(), size_data); strncat(char_datafieldname_tot,char_datafieldname,size_data+size_datafieldname); strncpy(data_type, str_float.c_str(), size_str_float); if(result_order==0) { dims_data[0] = nbofelem; } else { dims_data[0] = nbofvertex; } dims_data[1] = trans_dim; //ajout des champs fonction de la dimension de l'element (triangle ou noeud) et du type //de donnees (vecteur, ...) affectees a l'element strncat(data_type, res_char[result_order].c_str(), size_str_float + (res_char[result_order].size()+1)); strncat(data_type, str_underscore.c_str(), size_str_float + (res_char[result_order].size()+1) + size_str_underscore); strncat(data_type, type_char[what_type].c_str(), size_str_float + (res_char[result_order].size()+1) + size_str_underscore + (type_char[what_type].size() + 1)); dataspace_id_data = H5Screate_simple(2, dims_data, NULL); dataset_id_data = H5Dcreate2(file_id, char_datafieldname_tot, H5T_IEEE_F32LE, dataspace_id_data, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dataset_id_data, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, field); type_id = H5Tcopy(H5T_C_S1); status = H5Tset_size(type_id, 17); aid_type = H5Screate(H5S_SCALAR); attr_type = H5Acreate2(dataset_id_data, "TYPE", type_id, aid_type, H5P_DEFAULT, H5P_DEFAULT); status = H5Awrite(attr_type, type_id, data_type); status = H5Aclose(attr_type); status = H5Sclose(aid_type); status = H5Dclose(dataset_id_data); status = H5Sclose(dataspace_id_data); delete [] char_datafieldname; delete [] char_datafieldname_tot; } void WriteHdf5::WriteHdf5SolFile2DFinalize() { //fermeture du groupe /Data et du fichier hdf5 status = H5Gclose(group_id_data); status = H5Fclose(file_id); if (status != 0) cout << "HDF5 error" << endl; if(verbosity>2) cout << "save hdf5 file solution : " << hdf5_filename <2 vector type_char(3); vector res_char(2); type_char[0]= "Scalar"; type_char[1]= "Vector"; type_char[2]= "Tensor6"; res_char[0]= "Cell"; res_char[1]= "Node"; size_t size_datafieldname = fieldname->size() + 1; char * char_datafieldname = new char[size_datafieldname]; strncpy(char_datafieldname, fieldname->c_str(), size_datafieldname); char * char_datafieldname_tot=new char[size_data+size_datafieldname]; strncpy(char_datafieldname_tot, str_data.c_str(), size_data); strncat(char_datafieldname_tot,char_datafieldname,size_data+size_datafieldname); strncpy(data_type, str_float.c_str(), size_str_float); if(result_order==0) { dims_data[0] = nbofelem; } else { dims_data[0] = nbofvertex; } dims_data[1] = trans_dim; //ajout des champs fonction de la dimension de l'element (tetraedre ou noeud) et du type //de donnees (tenseur de 6 composantes, ...) affectees a l'element strncat(data_type, res_char[result_order].c_str(), size_str_float + (res_char[result_order].size()+1)); strncat(data_type, str_underscore.c_str(), size_str_float + (res_char[result_order].size()+1) + size_str_underscore); strncat(data_type, type_char[what_type].c_str(), size_str_float + (res_char[result_order].size()+1) + size_str_underscore + (type_char[what_type].size() + 1)); dataspace_id_data = H5Screate_simple(2, dims_data, NULL); dataset_id_data = H5Dcreate2(file_id, char_datafieldname_tot, H5T_IEEE_F32LE, dataspace_id_data, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dataset_id_data, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, field); type_id = H5Tcopy(H5T_C_S1); status = H5Tset_size(type_id, 18); aid_type = H5Screate(H5S_SCALAR); attr_type = H5Acreate2(dataset_id_data, "TYPE", type_id, aid_type, H5P_DEFAULT, H5P_DEFAULT); status = H5Awrite(attr_type, type_id, data_type); status = H5Aclose(attr_type); status = H5Sclose(aid_type); status = H5Dclose(dataset_id_data); status = H5Sclose(dataspace_id_data); delete [] char_datafieldname; delete [] char_datafieldname_tot; } void WriteHdf5::WriteHdf5SolFile3DFinalize() { //fermeture du groupe /Data et du fichier hdf5 status = H5Gclose(group_id_data); status = H5Fclose(file_id); if (status != 0) cout << "HDF5 error" << endl; if(verbosity>2) cout << "save hdf5 file solution : " << hdf5_filename < #include #include #include #include #include #include #ifndef H5_NO_NAMESPACE #ifndef H5_NO_STD using std::cout; using std::endl; #endif // H5_NO_STD #endif #include "H5Cpp.h" #ifndef H5_NO_NAMESPACE using namespace H5; #endif using namespace std; using std::string; using std::vector; typedef long Int4; class WriteHdf5 { private: ofstream hdf5_file; const char * hdf5_filename; Int4 nbofelem; Int4 nbofvertex; Int4 nbvperelem; hid_t file_id; hid_t group_id_data; herr_t status; int dimension; public: WriteHdf5(const char * ffname, Int4 nbelem, Int4 nbvertex); virtual ~WriteHdf5(); void WriteHdf5MeshFile2D(float coordinates[][2], int connec[][3]); void WriteHdf5MeshFile3D(float coordinates[][3], int connec[][4]); void WriteHdf5SolFile2DInit(); void WriteHdf5SolFile2DAddField(string * fieldname, int result_order, int trans_dim, int what_type, float *field); void WriteHdf5SolFile2DFinalize(); void WriteHdf5SolFile3DInit(); void WriteHdf5SolFile3DAddField(string * fieldname, int result_order, int trans_dim, int what_type, float *field); void WriteHdf5SolFile3DFinalize(); }; #endif freefem++-3.38-1/src/bamglib/write_xdmf.cpp000644 000767 000024 00000024350 12455152304 020651 0ustar00hechtstaff000000 000000 #include "write_xdmf.hpp" #ifdef DEBUG int debug_w=1; #else int debug_w=0; #endif //La denomination, au niveau des fichiers d'input, //des fichiers de maillage ou solution sont en partie fixes : //Le nom des fichiers de maillage doit se finir par .mesh.h5 //Le nom des fichiers solution doit se finir par .sol.h5 //L'interface ne prend en compte que les elements de type triangle et tetraedre. WriteXdmf::WriteXdmf(const char *ffname, Int4 nbelem, Int4 nbvertex) : WXffname(ffname), nbofelem(nbelem), nbofvertex(nbvertex) { //constructeur //recuperation du nom de fichier passe dans l'input //pour creation du nom de fichier xdmf int lll = strlen(WXffname); string str_xdmf_filename=WXffname; string str_xdmf="xmf"; str_xdmf_filename.replace(lll-2,3,str_xdmf); size_t size_xdmf_filename = str_xdmf_filename.size() + 1; xdmf_filename = new char[size_xdmf_filename]; strncpy(xdmf_filename, str_xdmf_filename.c_str(), size_xdmf_filename); } WriteXdmf::~WriteXdmf() { delete [] xdmf_filename; delete [] Elemtype; } void WriteXdmf::WriteXdmfMeshFile2D() { //initialisation du type d'element : triangle Elemtype= new char[strlen("Triangle")+1]; strcpy(Elemtype,"Triangle"); dimension=2; nbvperelem=3; //creation et ecriture du fichier de description //du maillage 2D au format xdfm pour paraview xdmf_file.open (xdmf_filename); xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << " \n"; // pour l'instant nom du maillage par defaut : full mesh xdmf_file << " \n"; xdmf_file << " \n"; // nb nodes per element, ici classe triangle donc =3 xdmf_file << " \n"; xdmf_file << " " << WXffname << ":/Connectivity/ELEM2NODE\n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " " << WXffname << ":/Coordinates/XY\n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << "\n"; xdmf_file.close(); cout<<"save xdmf file mesh : "<< xdmf_filename << endl; } void WriteXdmf::WriteXdmfMeshFile3D() { //initialisation du type d'element : tetraedre Elemtype= new char[strlen("Tetrahedron")+1]; strcpy(Elemtype,"Tetrahedron"); dimension=3; nbvperelem=4; //creation et ecriture du fichier de description //du maillage 3D au format xdfm pour paraview xdmf_file.open (xdmf_filename); xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << " \n"; //pour l'instant nom du maillage par defaut : full mesh xdmf_file << " \n"; xdmf_file << " \n"; // nb nodes per element, ici classe Tetrahedra donc = 4 xdmf_file << " \n"; xdmf_file << " " << WXffname << ":/Connectivity/ELEM2NODE\n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " " << WXffname << ":/Coordinates/XYZ\n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << "\n"; xdmf_file.close(); cout <<"save xdmf file mesh : "<< xdmf_filename << endl; } void WriteXdmf::WriteXdmfSolFile2DInit() { //initialisation du type d'element : triangle Elemtype= new char[strlen("Triangle")+1]; strcpy(Elemtype,"Triangle"); dimension=2; nbvperelem=3; string str_h5_mesh="mesh.h5"; string str_h5_mesh_filename=WXffname; str_h5_mesh_filename.replace(strlen(WXffname)-6,7,str_h5_mesh); //creation et debut d'ecriture du fichier de description //du fichier solution 2D au format xdfm pour paraview //avec le lien vers le fichier de maillage hdf5 correspondant xdmf_file.open (xdmf_filename); xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << " \n"; //pour l'instant nom du maillage par defaut : full mesh xdmf_file << " \n"; xdmf_file << " \n"; // nb nodes per element, ici classe triangle donc =3 xdmf_file << " \n"; xdmf_file << " " << str_h5_mesh_filename.c_str() << ":/Connectivity/ELEM2NODE\n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " " << str_h5_mesh_filename.c_str() << ":/Coordinates/XY\n"; xdmf_file << " \n"; xdmf_file << " \n"; } void WriteXdmf::WriteXdmfSolFile2DAddField(string * fieldname, int data_type, int result_order, int trans_dim) { vector type_char(3); vector res_char(2); type_char[0]= "Scalar"; type_char[1]= "Vector"; type_char[2]= "Vector"; res_char[0]= "Cell"; res_char[1]= "Node"; //ecriture des descriptions du ou des champs solution 2D xdmf_file << " c_str() << "\" AttributeType=\"" << type_char[data_type] << "\" Center=\"" << res_char[result_order]<<"\">\n"; if(result_order==0) { xdmf_file << " \n"; } else { xdmf_file << " \n"; } xdmf_file << " " << WXffname << ":/Data/" << fieldname->c_str() <<"\n"; xdmf_file << " \n"; xdmf_file << " \n"; } void WriteXdmf::WriteXdmfSolFile2DFinalize() { //fin d'ecriture et fermeture du fichier des descriptions solution 2D xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << "\n"; xdmf_file.close(); cout << "save xdmf file solution : " << xdmf_filename <\n"; xdmf_file << "\n"; xdmf_file << "\n"; xdmf_file << " \n"; //pour l'instant nom du maillage par defaut : full mesh xdmf_file << " \n"; xdmf_file << " \n"; //nb nodes per element, ici classe tetrahedre donc =4 xdmf_file << " \n"; xdmf_file << " " << str_h5_mesh_filename.c_str() << ":/Connectivity/ELEM2NODE\n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << " " << str_h5_mesh_filename.c_str() << ":/Coordinates/XYZ\n"; xdmf_file << " \n"; xdmf_file << " \n"; } void WriteXdmf::WriteXdmfSolFile3DAddField(string * fieldname, int data_type, int result_order, int trans_dim) { vector type_char(3); vector res_char(2); type_char[0]= "Scalar"; type_char[1]= "Vector"; type_char[2]= "Tensor6"; res_char[0]= "Cell"; res_char[1]= "Node"; //ecriture des descriptions du ou des champs solution 3D xdmf_file << " c_str() << "\" AttributeType=\"" << type_char[data_type] << "\" Center=\"" << res_char[result_order]<<"\">\n"; if(result_order==0) { xdmf_file << " \n"; } else { xdmf_file << " \n"; } xdmf_file << " " << WXffname << ":/Data/" << fieldname->c_str() <<"\n"; xdmf_file << " \n"; xdmf_file << " \n"; } void WriteXdmf::WriteXdmfSolFile3DFinalize() { //fin d'ecriture et fermeture du fichier des descriptions solution 3D xdmf_file << " \n"; xdmf_file << " \n"; xdmf_file << "\n"; xdmf_file.close(); cout << "save xdmf file solution : " << xdmf_filename < #include #include #include #include using namespace std; using std::string; using std::vector; typedef long Int4; class WriteXdmf { private: const char * WXffname; ofstream xdmf_file; char * Elemtype; Int4 nbofelem; Int4 nbofvertex; Int4 nbvperelem; char * xdmf_filename; int dimension; public: WriteXdmf(const char * ffname, Int4 nbelem, Int4 nbvertex); virtual ~WriteXdmf(); void WriteXdmfMeshFile2D(); void WriteXdmfMeshFile3D(); void WriteXdmfSolFile2DInit(); void WriteXdmfSolFile2DAddField(string * fieldname, int data_type, int result_order, int trans_dim); void WriteXdmfSolFile2DFinalize(); void WriteXdmfSolFile3DInit(); void WriteXdmfSolFile3DAddField(string * fieldname, int data_type, int result_order, int trans_dim); void WriteXdmfSolFile3DFinalize(); }; #endif freefem++-3.38-1/src/bamg/bamg.cpp000644 000767 000024 00000071233 11406226635 016726 0ustar00hechtstaff000000 000000 // ********** DO NOT REMOVE THIS BANNER ********** // // SUMMARY: Bamg: Bidimensional Anisotrope Mesh Generator // RELEASE: 0 // // AUTHOR: F. Hecht, // ORG : UMPC // E-MAIL : Frederic.Hecht@Inria.fr // // ORIG-DATE: Dec 97 // Modif March 98 /* This file is part of Bamg or FreeFEm++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // E-MAIL : Frederic.Hecht@Inria.fr // // ORIG-DATE: Dec 97 #include #include #include #include #include #include #include #include "Meshio.h" #include #include "Mesh2.h" #include "QuadTree.h" using namespace bamg; using namespace std; #include #ifdef __MWERKS__ #define NBVMAX 10000 #else #define NBVMAX 50000 #endif // 0 1 2 3 // 0123456789012345678901234567890 const char whatbamg []= "@(#)LJLL, le 20 fevr 2006, Bamg v1.02 "; const char *bamgversion = whatbamg + 28; int initgraph=0; //long verbosity=2; #ifdef __MWERKS__ #define R_OK 0 #define F_OK 0 #define W_OK 0 #include inline int access( char *fileName, int notUsed ) { struct stat statRec; return stat( fileName, &statRec ); } #endif #ifdef _MSC_VER #define R_OK 04 #define F_OK 0 #define W_OK 02 #include inline int access( char *fileName, int mode) { return _access( fileName, mode ); } #endif void NewHandler(); void NewHandler() { cerr << " Not enought memory " << endl; exit(1); } void forDebug(); void MeshErrorIO(ios& ) { MeshError(999); exit(1); } #ifdef DRAWING bool withrgraphique= initgraphique; #else bool withrgraphique=false; #endif void forDebug() { #ifdef DRAWING if(initgraph) { if (CurrentTh) CurrentTh->inquire(); closegraphique();initgraph=0; } #endif } int main(int argc, char **argv) { #ifdef __MWERKS__ cout << " version " << bamgversion << " for initialisation of the toolbox " << endl; #endif // JUST for HP CC bug #ifdef LONGLONG long long bidon=2; if( (double) bidon != 2.0) { cerr << "Compiler bug Pb of cast of long long to a double => remove the LONGLONG define" << endl; exit(10); } #endif double time0, time1,time2,time3,time4; // 2 way for uses --- // 1 first mesh // or adaptation MeshIstreamErrorHandler = MeshErrorIO; // double *sol=0; // int adaptation = 0 ; Int4 i; hinterpole=1; // by def interpolation a h // int Err=0; int fileout=0; int nbvx = NBVMAX; int iso =0,AbsError=0,nbjacoby=1,allquad=0; int NoMeshReconstruction=0; int Rescaling = 1; double costheta=2; Real8 cutoffradian=-1; double anisomax = 1e6; double err=0.01,errg=0.1,coef=1,hmin=1.e-100,hmax=1.e17,raison=0,CutOff=1e-5; int KeepBackVertices=1; double hminaniso=1e-100; const double boundmaxsubdiv = 10; double maxsubdiv=boundmaxsubdiv; double omega=1.8; int NbSmooth=3; double *solMbb =0,*solMBB=0; int *typesolsBB =0; Int4 nbsolbb=0,lsolbb=0; Int4 nbsolBB=0,lsolBB=0; int SplitEdgeWith2Boundary=0; int rbbeqMbb=0,rBBeqMBB=0; int ChoiseHessien = 0; double power=1; Triangles *Thr=0,*Thb=0; char * fgeom=0,*fmeshback=0,*fmeshout=0,*fmeshr=0,*fmetrix=0,*famfmt=0,*fmsh=0, *fnopo=0,*fftq=0,*fam=0,*famdba=0,*rbb=0,*rBB=0,*wbb=0,*wBB=0, *fMbb=0,*foM=0,*fMBB=0; verbosity =2; char *datargv[128] ; int datargc=1; datargv[0]= datargv[1]=0;// for create a error if no parameter const char * datafile = argc ==2 ? argv[1] : "DATA_bamg"; atexit( forDebug); set_new_handler( &NewHandler); if (argc<3) { // for test on the mac if (!access(datafile,R_OK)) { MeshIstream data(datafile); while(data.cm() && datargc <128) datargv[datargc++]=data.ReadStr(); if (argc==1) datargv[0]=argv[0]; // copy of the program name argc=datargc; argv=datargv; } }; for (i=1;i isotropic (1e6 by default) " << endl; cout << " -RelError Construct metric with relative error " << endl; cout << " -AbsError Construct metric with with abs error " << endl; cout << " -CutOff (double) Set the limit of the relative error (1.e-5)" << endl; cout << " -NbJacobi (int) Set the number of Jacobi iteration for smoothing " << endl; cout << " the construction of metric (1 by default)." << endl; cout << " -NoRescaling Don't rescaling of all solution between [0..1] " << "before metric computation " << endl; cout << " -Rescaling Do rescaling of all solution between [0..1] " << "before metric computation ((default case)" << endl; cout << " -H (int) choices for computing the hessein (test)" << endl; cout << "" << endl; cout << "" << endl; cout << " Definition of some internal variable and limitation." << endl; cout << "" << endl; cout << " -v (int) Set the level of impression (verbosity) " << endl; cout << " between 0 and 10 (1 by default)." << endl; cout << " -nbv (int) Set the maximal of vertices (" << nbvx << " by default)." << endl; cout << "" << endl; cout << "" << endl; cout << " To interpoled a solution form background mesh to generated " << endl; cout << " mesh (in case of adpatation)" << endl; cout << "" << endl; cout << " -rbb filename Read solution file defined on the background " << endl; cout << " mesh for interpolation on created mesh." << endl; cout << " bb file. (by default the -Mbb filename)" << endl; cout << " -wbb filename Write the file of interpolation of the solutions" << endl; cout << " read with -rbb argument. " << endl; cout << " bb file." << endl; cout << " -rBB filename same -rbb but with BB file "; cout << " -wBB filename same -wbb but with BB file "; cout << "" << endl; cout << " Output mesh file for adpation or generation." << endl; cout << " Remark: one of output mesh file is require " << endl; cout << endl; cout << " -o filename Create a DB Mesh file." << endl; cout << " -oamdba filename Create a amdba file." << endl; cout << " -oftq filename Create a ftq file." << endl; cout << " -omsh filename Create a msh file (freefem3 file)." << endl; cout << " -oam_fmt filename Create a am_fmt file. " << endl; cout << " -oam filename Create a am file. " << endl; cout << " -onopo filename Create a nopo file. " << endl; cout << " -oM filename Create a metric file. " << endl; cout << endl; cout << endl; cout << " -thetaquad (double) minimal angle of a quadrangle " << endl; cout << " -2q split triangles in 3 quad and quad in 4 quad " << endl; cout << " -2 split triangles in 4 trai and quad in 4 quad " << endl; cout << endl; cout << " Remark: if no argument is given when the arguments are read in "< boundmaxsubdiv || maxsubdiv <= 1.0) { cerr << " -maxsubdiv " << maxsubdiv << " is not in ]1,"<< boundmaxsubdiv << "]" << endl; exit(3); } if (iso) anisomax=1; if (!(fmetrix||fMbb)) NbSmooth=0; // no metric -> no smoothing if( ! rbb) // to set the rbb filename by default rbb=fMbb; if( ! rBB) // to set the rbb filename by default rBB=fMBB; if (fMbb && rbb) rbbeqMbb = !strcmp(rbb,fMbb); if (fMBB && rBB) rBBeqMBB = !strcmp(rBB,fMBB); #ifdef DRAWING if(initgraphique) { initgraphique(); initgraph=1; withrgraphique=0; } #endif if (verbosity) cout << bamgversion <<" : "; if (verbosity) if (fgeom && fileout) cout << " Construction of a mesh from the geometry : " << fgeom << endl << " with less than " << nbvx << " vertices " << endl; else if(fmeshback && fileout) if (NoMeshReconstruction) cout << " Modification of a adpated mesh " << fmeshback << " with less than " << nbvx << " vertices" << endl; else cout << " Construction of a adpated mesh from the background mesh: " << fmeshback << " with less than " << nbvx << " vertices" << endl; else if (fmeshback && foM) cout << " Construction of the metric file on the background mesh: " << fmeshback << endl; if (fgeom && fileout) { if (verbosity) cout << " Construction of a mesh from the geometry : " << fgeom << endl << " with less than " << nbvx << " vertices " << endl; time0 = CPUtime(); Geometry Gh(fgeom); hmin = Max(hmin,Gh.MinimalHmin()); hmax = Min(hmax,Gh.MaximalHmax()); if(fmetrix) Gh.ReadMetric(fmetrix,hmin,hmax,coef); else { Int4 iv; for(iv=0;iv3) cout << " Cpu for read the geometry " << time1-time0 << "s" << endl; Triangles Th(nbvx,Gh); if(costheta<=1) Th.MakeQuadrangles(costheta); if (allquad) Th.SplitElement(allquad==2); if(SplitEdgeWith2Boundary) Th.SplitInternalEdgeWithBorderVertices(); Th.ReNumberingTheTriangleBySubDomain(); time2 = CPUtime(); if(verbosity>3) Th.ShowHistogram(); if(NbSmooth>0) Th.SmoothingVertex(NbSmooth,omega); if(verbosity>3 && NbSmooth>0) Th.ShowHistogram(); #ifdef DRAWING if(initgraph) { Th.InitDraw(); Th.Draw(); Th.inquire(); } #endif time3 = CPUtime(); if(verbosity> 1) cout << " Cpu for meshing :" << setw(8) << time2-time1 << "s, for Smoothing " << time3-time2 << "s Nb Vertices/s = " << (Th.nbv) /(time2-time1) << setw(0) <0) { cout << " Cpu for meshing with io :" << setw(8) <2) cout << " -- write Metric file " << foM <Gh,Thb,nbvx) // copy the mesh + free space to modification : new Triangles(nbvx,BTh,KeepBackVertices) // construct a new mesh )); if (Thr != &BTh) delete Thr; if(costheta<=1.0) Th.MakeQuadrangles(costheta); if (allquad) Th.SplitElement(allquad==2); if(SplitEdgeWith2Boundary) Th.SplitInternalEdgeWithBorderVertices(); Th.ReNumberingTheTriangleBySubDomain(); time3 = CPUtime(); if(verbosity>0) cout << " Cpu time for meshing : " << time3-time2 << "s Nb Vertices/s = " << (Th.nbv) /(time3-time2) << endl; if(verbosity>3) Th.ShowHistogram(); if(NbSmooth>0) Th.SmoothingVertex(NbSmooth,omega); if(verbosity>3 && NbSmooth>0) Th.ShowHistogram(); #ifdef DRAWING if(initgraph) { Th.InitDraw(); Th.Draw(); Th.inquire(); } #endif Th.BTh.ReMakeTriangleContainingTheVertex(); if (fmeshout) Th.Write(fmeshout ,Triangles::BDMesh); if (famfmt) Th.Write(famfmt ,Triangles::am_fmtMesh); if (fam) Th.Write(fam ,Triangles::amMesh); if (famdba) Th.Write(famdba ,Triangles::amdbaMesh); if (fftq) Th.Write(fftq ,Triangles::ftqMesh); if (fmsh) Th.Write(fmsh ,Triangles::mshMesh); if (fnopo) Th.Write(fnopo ,Triangles::NOPOMesh); if ( ( rbb && wbb) ||( rBB && wBB)) // the code for interpolation { if(verbosity >1) { if (rbb ) cout << " -- interpolation P1 files : " << rbb << " -> " << wbb < " << wBB <precision(15); //if(fbb) fbb->precision(15); for(i=0;i0) { // internal point a[0]= (Real8) dete[0]/ tb.det; a[1]= (Real8) dete[1] / tb.det; a[2] = (Real8) dete[2] / tb.det; i0=Th.BTh.Number(tb[0]); i1=Th.BTh.Number(tb[1]); i2=Th.BTh.Number(tb[2]);} else { double aa,bb; TriangleAdjacent ta=CloseBoundaryEdge(I,&tb,aa,bb).Adj(); int k = ta; Triangle & tc = *(Triangle *)ta; i0=Th.BTh.Number(tc[0]); i1=Th.BTh.Number(tc[1]); i2=Th.BTh.Number(tc[2]); a[VerticesOfTriangularEdge[k][1]] =aa; a[VerticesOfTriangularEdge[k][0]] = bb; a[OppositeVertex[k]] = 1- aa -bb;} Int4 ibb0 = nbfieldbb*i0; Int4 ibb1 = nbfieldbb*i1; Int4 ibb2 = nbfieldbb*i2; Int4 iBB0 = nbfieldBB*i0; Int4 iBB1 = nbfieldBB*i1; Int4 iBB2 = nbfieldBB*i2; Int4 j=0; for ( j=0;j0) cout << " Cpu time for interpolation " << time04-time00 << " s" <0) { cout << " Cpu time for meshing with io : " << time4-time0 << "s Nb Vertices/s = " << Th.nbv/(time4-time0) << endl << " Nb vertices = " << Th.nbv; if (Th.nbt-Th.NbOutT-Th.NbOfQuad*2) cout << " Nb Triangles = " << (Th.nbt-Th.NbOutT-Th.NbOfQuad*2); if (Th.NbOfQuad ) cout << " Nb Quadrilaterals = " << Th.NbOfQuad ; cout << endl; } #ifdef DRAWING if(initgraph) { reffecran(); Th.InitDraw(); Th.Draw(); Th.inquire(); } #endif // cout << "delete &Th " ; delete &Th; //cout << " end " << endl; } }// if (fgeom && fmeshout) // clean the for(i=1;i #include #include #include #include #include #include "Meshio.h" #include "Mesh2.h" #include "QuadTree.h" using namespace std; using namespace bamg; //long verbosity=2; #ifdef DRAWING bool withrgraphique= initgraphique; #else bool withrgraphique=false; #endif #ifdef HAVE_UNISTD_H #include #else #ifdef __MWERKS__ #define R_OK 0 #define F_OK 0 #define W_OK 0 #include inline int access( char *fileName, int notUsed ) { struct stat statRec; return stat( fileName, &statRec ); } #endif #ifdef PURE_WIN32 #define R_OK 0 #define F_OK 0 #define W_OK 0 #define access(i,j) 1 #endif #endif int initgraph=0; void NewHandler(); void NewHandler() { cerr << " Not enought memory " << endl; exit(1); } void MeshErrorIO(ios& ) { MeshError(999); exit(1); } int main(int argc, char **argv) { Real8 cutoffradian = 30.0*Pi/180.0; char * fin=0,*fout=0,*fgeom=0; verbosity = 2; int ok=0,i=0; if (argc >= 3) { fin=argv[1]; fout=argv[2]; ok= !access(fin,R_OK) && (access(fout,F_OK) || !access(fout,W_OK)) ; } for (i=3;i no message, 99 to much \n"; cout << endl; cout << " remark: "; cout << " the type of OutMesh is defined with the suffix\n"; cout << " si the suffixe is not in .am_fmt .amdba .am .nopo .msh .ftq, then \n"; cout << " the mesh is a bd mesh (cf .mesh)" << endl; return 1; } MeshIstreamErrorHandler = MeshErrorIO; set_new_handler( &NewHandler); #ifdef DRAWING if(initgraphique) { initgraphique(); initgraph=1; } #endif // cout << "open file in " << fin<< endl; Triangles Th(fin,cutoffradian); if (!fgeom) ((void ) 0); // Th.Write( (const char *) fout); else { // cout << " geom " << fgeom << endl; Th.Gh.Write(fgeom); Th.Write(fout,Triangles::BDMesh); } return 0; } freefem++-3.38-1/src/bamg/global.cpp000644 000767 000024 00000000076 12021733446 017252 0ustar00hechtstaff000000 000000 long verbosity=1; long mpirank =0; void ShowDebugStack(){} freefem++-3.38-1/src/bamg/Makefile.am000644 000767 000024 00000002563 12455277555 017364 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ CXXLD=$(STATICTOOL) $(CXX) bin_PROGRAMS=$(BAMGPROG) EXTRA_PROGRAMS=bamg cvmsh2 #drawbdmesh bamg_SOURCES=bamg.cpp global.cpp bamg_DEPENDENCIES=../fflib/Mesh2.o ../fflib/MeshDraw.o ../fflib/MeshGeom.o ../fflib/MeshQuad.o ../fflib/MeshRead.o ../fflib/MeshWrite.o ../fflib/Meshio.o ../fflib/Metric.o ../fflib/QuadTree.o ../fflib/R2.o ../fflib/SetOfE4.o ../fflib/write_hdf5.o ../fflib/write_xdmf.o cvmsh2_SOURCES=cvmsh2.cpp global.cpp cvmsh2_DEPENDENCIES=../fflib/Mesh2.o ../fflib/MeshDraw.o ../fflib/MeshGeom.o ../fflib/MeshQuad.o ../fflib/MeshRead.o ../fflib/MeshWrite.o ../fflib/Meshio.o ../fflib/Metric.o ../fflib/QuadTree.o ../fflib/R2.o ../fflib/SetOfE4.o ../fflib/write_hdf5.o ../fflib/write_xdmf.o #EXTRA_drawbdmesh_SOURCES= # ../Graphics/Xrgraph.cpp ../Graphics/Pcrgraph.cpp #drawbdmesh_DEPENDENCIES=../fflib/libff.a @STD_GRAPH_OBJ@ #drawbdmesh_SOURCES= drawbdmesh.cpp #drawbdmesh_LDADD = @STD_GRAPH_OBJ@ $(LDADD) @STD_LIBS@ @LIBSNOCONSOLE@ LDADD= ../fflib/Mesh2.o ../fflib/MeshDraw.o ../fflib/MeshGeom.o ../fflib/MeshQuad.o ../fflib/MeshRead.o ../fflib/MeshWrite.o ../fflib/Meshio.o ../fflib/Metric.o ../fflib/QuadTree.o ../fflib/R2.o ../fflib/SetOfE4.o ../fflib/write_hdf5.o ../fflib/write_xdmf.o AM_CPPFLAGS=-I$(srcdir)/../fflib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics $(HDF5_CPPFLAGS) freefem++-3.38-1/src/bamg/Makefile.in000644 000767 000024 00000060330 12543260337 017355 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ EXTRA_PROGRAMS = bamg$(EXEEXT) cvmsh2$(EXEEXT) subdir = src/bamg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_bamg_OBJECTS = bamg.$(OBJEXT) global.$(OBJEXT) bamg_OBJECTS = $(am_bamg_OBJECTS) bamg_LDADD = $(LDADD) am_cvmsh2_OBJECTS = cvmsh2.$(OBJEXT) global.$(OBJEXT) cvmsh2_OBJECTS = $(am_cvmsh2_OBJECTS) cvmsh2_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(bamg_SOURCES) $(cvmsh2_SOURCES) DIST_SOURCES = $(bamg_SOURCES) $(cvmsh2_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ CXXLD = $(STATICTOOL) $(CXX) bin_PROGRAMS = $(BAMGPROG) bamg_SOURCES = bamg.cpp global.cpp bamg_DEPENDENCIES = ../fflib/Mesh2.o ../fflib/MeshDraw.o ../fflib/MeshGeom.o ../fflib/MeshQuad.o ../fflib/MeshRead.o ../fflib/MeshWrite.o ../fflib/Meshio.o ../fflib/Metric.o ../fflib/QuadTree.o ../fflib/R2.o ../fflib/SetOfE4.o ../fflib/write_hdf5.o ../fflib/write_xdmf.o cvmsh2_SOURCES = cvmsh2.cpp global.cpp cvmsh2_DEPENDENCIES = ../fflib/Mesh2.o ../fflib/MeshDraw.o ../fflib/MeshGeom.o ../fflib/MeshQuad.o ../fflib/MeshRead.o ../fflib/MeshWrite.o ../fflib/Meshio.o ../fflib/Metric.o ../fflib/QuadTree.o ../fflib/R2.o ../fflib/SetOfE4.o ../fflib/write_hdf5.o ../fflib/write_xdmf.o #EXTRA_drawbdmesh_SOURCES= # ../Graphics/Xrgraph.cpp ../Graphics/Pcrgraph.cpp #drawbdmesh_DEPENDENCIES=../fflib/libff.a @STD_GRAPH_OBJ@ #drawbdmesh_SOURCES= drawbdmesh.cpp #drawbdmesh_LDADD = @STD_GRAPH_OBJ@ $(LDADD) @STD_LIBS@ @LIBSNOCONSOLE@ LDADD = ../fflib/Mesh2.o ../fflib/MeshDraw.o ../fflib/MeshGeom.o ../fflib/MeshQuad.o ../fflib/MeshRead.o ../fflib/MeshWrite.o ../fflib/Meshio.o ../fflib/Metric.o ../fflib/QuadTree.o ../fflib/R2.o ../fflib/SetOfE4.o ../fflib/write_hdf5.o ../fflib/write_xdmf.o AM_CPPFLAGS = -I$(srcdir)/../fflib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics $(HDF5_CPPFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bamg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bamg/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) bamg$(EXEEXT): $(bamg_OBJECTS) $(bamg_DEPENDENCIES) $(EXTRA_bamg_DEPENDENCIES) @rm -f bamg$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(bamg_OBJECTS) $(bamg_LDADD) $(LIBS) cvmsh2$(EXEEXT): $(cvmsh2_OBJECTS) $(cvmsh2_DEPENDENCIES) $(EXTRA_cvmsh2_DEPENDENCIES) @rm -f cvmsh2$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(cvmsh2_OBJECTS) $(cvmsh2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bamg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cvmsh2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/Algo/BFGS.hpp000644 000767 000024 00000010257 11406226635 016521 0ustar00hechtstaff000000 000000 #ifndef BFGS_HH #define BFGS_HH #include "Optima.hpp" #include "defs.hpp" // BFGS Quasi-Newton Optimization Method /* At the present version, you must use the CubicLineSearch procedure */ // Necessite une "vraie" classe Matrice template class BFGS : public Optima { typedef typename LS::Real Real; typedef typename LS::Param Param; typedef typename LS::Vect Vect; typedef typename LS::VMat VMat; typedef typename LS::Mat Mat; typedef list mlist; public: BFGS(///pointer to the line-search object. LS* ls, ///Maximum number of iterations int iter, ///minimum accepted gradient at optimum solution Real tol, ///vebose or quiet int verb=0); ~BFGS(){;} // the BFGS search starting from model0, returns an optimum model Param optimizer(Param& model0); }; template BFGS::BFGS(LS* p, int it, Real eps, int verb) :Optima(verb) { this->ls=p; this->iterMax = it; this->tol = eps; this->iterNum = 0; } // Ncessite pour la classe MAT: // - un constructeur de matrice avec nbre de lig, nbre de col // - un constructeur de matrice avec la diagonale comme paramtre // - le produit matrice vecteur // - une mthode outProduct qui construit partir de 2 vecteurs u et v la matrice A_{i,j}=u(i)v(j) // - une mthode t() // - un oprateur + // - un oprateur = Real // - un oprateur = Vect template typename BFGS::Param BFGS::optimizer(Param& model0) { //reset the residue history for every new optimizer this->iterNum = 0; if (this->residue != NULL) { delete this->residue; this->residue = new mlist; } // Initial settings for some parameters int n = model0.size(); Vect g0(n); double lambda = 0.025; double descent = 0.; g0= *(this->ls->gradient(model0)); // check the gradient, in case the initial model is the optimal double err = (Real)sqrt((g0,g0)); if (this->isVerbose) cerr << "Initial residue : " << err << endl; this->appendResidue(err); // residual if (err < this->tol) { if (this->isVerbose) cerr << "Initial guess was great! \n"; this->isSuccess = 1; return model0; } //initial identical matrix for estimating inverse of the Hessian //Vect diag(n,1.); Mat H(n,n);H=0;diagonal(H)=1; Real d, dd, scale; Param model1(model0); Vect s(n),gamma(n),delta(n),g1(n); //searching directions s=Real(); s -= H*g0; descent = (s,g0); assert(s.max() <1e100); //cubic line search for a new model model1 = this->ls->search(model0, s, descent, lambda); g1 = *(this->ls->gradient(model1)); err = (Real)sqrt((g1,g1)); if (this->isVerbose) cerr << "Iteration (" << this->iterNum << ") : " <<"current value of the objective function: " <ls->currentValue() << "\t current residue: "<< err << endl; this->appendResidue(err); // residual this->iterNum ++; Mat B(n,n); while (this->finalResidue() > this->tol && this->iterNum < this->iterMax) { gamma = g1 - g0; delta = model1 - model0; //replace the searching direction with temporal storage s = H*gamma; //factor of the denominator dd = (delta,gamma); // Modif TONY // Au dpart, il y avait : if (dd < 0.00000001) // Mais Adel ne fait pas ce test non plus... if (Abs(dd)<1e-20) { // re-initialize the Hessian Matrix // Il faut d'abord le mettre a zero : cf. Matrix.hpp H = 0.; diagonal(H)=1.; } else { assert(dd); d = 1./dd; scale = d*((gamma,s)); scale += 1; scale *= d; // update the first term H += scale*delta*delta.t(); //update the second term H -= d*s*delta.t(); H -= d*delta*s.t(); //store the current model and gradient g0 = g1; model0 = model1; } s=Real(); s -= H*g0; descent = (s,g0); model1 = this->ls->search(model0, s, descent, lambda); g1 = *(this->ls->gradient(model1)); err = (Real)sqrt((g1,g1)); if (this->isVerbose) cerr << "Iteration (" << this->iterNum << ") : "<<"current value of the objective function: " <ls->currentValue() << "\t current residue: "<< err << endl; this->appendResidue(err); // residual this->iterNum ++; } return(model1); } #endif freefem++-3.38-1/src/Algo/BrentLS.hpp000644 000767 000024 00000022411 11406226635 017304 0ustar00hechtstaff000000 000000 //====================================================================== // Definition of the BrentLineSearch class // Brent's line search algorithm // author: Wenceslau Gouveia, Adapted from Numerical Recipes in C // Modified to fit into new classes. H. Lydia Deng, 02/21/94, 03/15/94 // Tony : cf. page 301 section 10.2 //======================================================================== // .B BrentLineSearch() // This routine, inpired by the Numerical Recipes book, performs a unidimensional search // for the minimum of the objective function along a specified direction. The minimum is // at first bracket using the Golden search procedure. After bracketing the Brent's // algorithm is used to isolate the minimum to a fractional precision of about the specified // tolerance. // // .SECTION Description // Public Operations // Constructors: // BrentLineSearch (ObjectiveFunction *f, int iter); // Here: // f: Define the objective function // iter: Maximum number of iterations // Methods: // model <> BrentLineSearch::search(Model& model0, Vector& direction, // double tol, double delta) // Here: // model0: Initial model to initiate the bracketing procedure // direction: Vector that defines the direction of the line search // tol: The minimum is within the returned this->value +/- tol // delta: Used in the bracketing procedure. The initial interval // for the bracketing is from 0 to delta * STEP_MAX, where // STEP_MAX is hard coded to 5. // // The sought minimum is returned by the function. // // .SECTION Caveats // This line search was not thoroughly tested. The CubicLineSearch procedure, that requires // certain derivative information on the objective function (that can be provided by numerical // methods) has demonstrated to be a more efficient line search procedure. // Cela me semble louche... cf. les commentaires BIZARRE ! // Ceci dit, le premiers tests semblent OK... #include "defs.hpp" #include #ifndef BRENT_LINE_SEARCH_HH #define BRENT_LINE_SEARCH_HH #include "LineSearch.hpp" #define CGOLD .3819660 #define ZEPS 1.e-10 #define GOLD 1.618034 #define STEP_MAX 5 #define GLIMIT 100. /* BrentLineSearch class was inpired by the Numerical Recipes book, performs an unidimensional search for the minimum of the objective function along a specified direction. The minimum is at first bracket using the Golden search procedure. After bracketing the Brent's algorithm is used to isolate the minimum to a fractional precision of about the specified tolerance. This line search was not thoroughly tested. The CubicLineSearch procedure, that requires certain derivative information on the objective function (that can be provided by numerical methods) has demonstrated to be a more efficient line search procedure. */ template class BrentLineSearch : public LS { typedef typename LS::Real Real; typedef typename LS::Param Param; typedef typename LS::Vect Vect; typedef typename LS::VMat VMat; typedef typename LS::Mat Mat; typedef typename LS::NRJ NRJ; public: BrentLineSearch(NRJ* f, int iter); ~BrentLineSearch(); // Implementation of the Brent Search // search for minimum model along a 1-D direction Param search(///initial model to initiate the bracketing procedure Param& m0, ///the direction of the line search Vect& direction, ///the minimum is within the returned this->value +/- tol Real tol, ///a parameter used in the bracketing procedure double delta); /*The initial interval for the bracketing is from $0$ to $delta \times STEP\_MAX$, where $STEP\_MAX$ is hard coded to $5$. The sought minimum is returned by the function. */ //@ManMemo: search for minimum model along a 1-D direction }; template BrentLineSearch::BrentLineSearch(NRJ * f, int it) : LS(f) { this->iterMax = it; } template BrentLineSearch::~BrentLineSearch() {;} // Code for the BrentBrent line search template typename BrentLineSearch::Param BrentLineSearch::search(Param& model0,Vect& direction, Real tol, double delta) { this->iterNum = 0; KN steps(3); // brackets Vect of_values(3); // OF evaluated inside bracket Real dum; // auxiliary quantity Real r, q, ulim; // auxiliary quantity Real u, fu; // define the new bracket limit // Variables related to Brent's algorithm Real d, fv, fw, fx, p; // auxiliary variables double tol1, tol2, v, w, xm; // auxiliary variables double x, e = 0.,etemp; // auxiliary variables int i; // counter // Ajout Tony d=0; // Sinon, il n'est pas initialise : BIZARRE ! // Beggining of the bracketing stage steps[0] = 0.; steps[1] = STEP_MAX * delta; of_values[0]= this->nrj->getVal(model0); of_values[1] =this->nrj->getVal(update(model0,1,steps[1],direction)); this->iterNum += 2; if (of_values[1] > of_values[0]) { dum = steps[0]; steps[0] = steps[1]; steps[1] = dum; dum = of_values[0]; of_values[0] = of_values[1]; of_values[1] = dum; } steps[2] = steps[1] + GOLD * (steps[1] - steps[0]); of_values[2] = this->nrj->getVal(update(model0,1,steps[2],direction)); this->iterNum++; while (of_values[1] > of_values[2]) { r = (steps[1] - steps[0]) * (of_values[1] - of_values[2]); q = (steps[1] - steps[2]) * (of_values[1] - of_values[0]); u = steps[1] - ((steps[1] - steps[2]) * q - (steps[1] - steps[0]) * r) / (2. * Abs(Max(Abs(q - r), TINY)) / Sgn(q - r)); ulim = steps[1] + GLIMIT * (steps[2] - steps[1]); if ((steps[1] - u) * (u - steps[2]) > 0.) { fu = this->nrj->getVal(update(model0,1,u,direction)); this->iterNum++; if (fu < of_values[2]) { steps[0] = steps[1]; steps[1] = u; of_values[0] = of_values[1]; of_values[1] = fu; break; } else if (fu > of_values[1]) { steps[2] = u; of_values[2] = fu; break; } u = steps[2] + GOLD * (steps[2] - steps[1]); fu = this->nrj->getVal(update(model0,1,u,direction)); this->iterNum++; } else if ((steps[2] - u) * (u - ulim) > 0.) { fu = this->nrj->getVal(update(model0,1,u,direction)); this->iterNum++; if (fu < of_values[2]) { steps[1] = steps[2]; steps[2] = u; u = steps[2] + GOLD * (steps[2] - steps[1]); of_values[1] = of_values[2]; of_values[2] = fu; fu = this->nrj->getVal(update(model0,1,u,direction)); this->iterNum ++; } } else if ((u - ulim) * (ulim * steps[2]) >= 0.) { u = ulim; fu = this->nrj->getVal(update(model0,1,u,direction)); this->iterNum ++; } else { u = steps[2] + GOLD * (steps[2] - steps[1]); fu = this->nrj->getVal(update(model0,1,u,direction)); this->iterNum ++; } steps[0] = steps[1]; steps[1] = steps[2]; steps[2] = u; of_values[0] = of_values[1]; of_values[1] = of_values[2]; of_values[2] = fu; } // Sorting STEPS in ascending order for (i = 0; i < 2; i++) { if (steps[0] > steps[i+1]) { dum = steps[0]; steps[0] = steps[i+1]; steps[i+1] = dum; dum = of_values[0]; of_values[0] = of_values[i+1]; of_values[i+1] = dum; } } if (steps[1] > steps[2]) { dum = steps[1]; steps[1] = steps[2]; steps[2] = dum; dum = of_values[1]; of_values[1] = of_values[2]; of_values[2] = dum; } // The line minimization will be performed now using as // bracket the 3 first steps given in vector steps // The algorithm is due to Brent // initializations x = w = v = steps[1]; fw = fv = fx = of_values[1]; for (; this->iterNum <= this->iterMax; this->iterNum++) { xm = .5 * (steps[0] + steps[2]); tol1 = tol * Abs(x) + ZEPS; tol2 = 2.0 * tol1; if (Abs(x - xm) <= (tol2 - .5 * (steps[2] - steps[0]))) { this->value = fx; Param new_model(update(model0,1,x,direction)); return new_model; } // minimum along a line if (Abs(e) > tol1) { r = (x - w) * (fx - fv); q = (x - v) * (fx - fw); p = (x - v) * q - (x - w) * r; q = 2.0 * (q - r); // Tony // ??? ERREUR ??? // dans le numerical recipe, c'est p=-p... // BIZARRE ! if (q > 0.){ cerr<<"BIZARRE BrentLS"<= Abs(.5 * q * etemp) || p <= q * (steps[0] - x) || p >= q * (steps[2] - x)) { // parabolic fit if (x >= xm) e = steps[0] - x; else e = steps[2] - x; d = CGOLD * e; } else { d = p / q; u = x + d; if (u - steps[0] < tol2 || steps[2] - u < tol2) d = Abs(tol1) / Sgn(xm-x); } } else { if (x >= xm) e = steps[0] - x; else e = steps[2] - x; d = CGOLD * e; } if (Abs(d) >= tol1) u = x + d; else u = x + Abs(tol1) / Sgn(d); fu = this->nrj->getVal(update(model0,1,u,direction)); if (fu <= fx) { if (u >= x) steps[0] = x; else steps[2] = x; v = w; w = x; x = u; fv = fw; fw = fx; fx = fu; } else { if (u < x) steps[0] = u; else steps[2] = u; if (fu <= fw || w == x) { v = w; w = u; fv = fw; fw = fu; } else if (fu <= fw || v == x || v == w) { v = u; fv = fu; } } } this->appendSearchNumber(); // cout << " Maximum number of iterations reached " << endl; Param new_model(update(model0,1,x,direction)); this->value = this->nrj->getVal(new_model); return new_model; } #endif freefem++-3.38-1/src/Algo/CG.hpp000644 000767 000024 00000014644 11406226635 016275 0ustar00hechtstaff000000 000000 //============================= // Definition of the conjugate gradient class // Non-linear conjugate gradient algorithm // author: Wenceslau Gouveia // modified: H. Lydia Deng, 02/23/94, /03/14/94 //============================= // .NAME ConjugateGradient class // .LIBRARY Base // .HEADER Optimization Algorithms // .INCLUDE defs.hpp // .FILE CG.hpp // .SECTION Description // .B ConjugateGradient() // The conjugate gradient procedure implemented in this object is an extension of // the conjugate gradient used in linear system solving to handle non quadratic // objective functions. Such extensions amount basically to the inclusion of a // line search step and a modification in the computation of the conjugate directions. // Details can be found in the classic (and tough!) book Practical Optimization by // Powell. // // .SECTION Description // Public Operations // Constructors: // ConjugateGradient(LineSearch* ls, int iter, double tol) // Here: // ls: Defines the line search used. At the present version you should use the // CubicLineSearch procedure. // iter: Maximum number of iterations // tol: Minimum accepted module of the gradient at optimum solution // Methods: // Model<>ConjugateGradient::optimizer(Model&) // Here: // model0: Initial model for the conjugate gradient procedure. // // The optimum model is returned by the function. // // .SECTION Caveats // This procedure requires the derivatives of the objective function. At the present version the // COOOL library cannot handle analytic derivatives provided by the user. Here the derivatives // are computed numerically by a centered finite differencing scheme in a automatic fashion. // The hability to support user-provided derivatives will hopefully be // implemented in the near future. #ifndef CONJUGATE_GRADIENT_HH #define CONJUGATE_GRADIENT_HH #include "Optima.hpp" #include "defs.hpp" #include "Param.hpp" // Nonlinear Conjugate Gradient /* This conjugate gradient procedure implemented in this object is an extension of the conjugate gradient used in linear system solving to handle non quadratic objective functions. Such extensions amount basically to the inclusion of a line search step and a modification in the computation of the conjugate directions. Details can be found in the classic (and tough!) book Practical Optimization by Powell. */ template class ConjugateGradient : public Optima { typedef typename LS::Real Real; typedef typename LS::Param Param; typedef typename LS::Vect Vect; typedef typename LS::VMat VMat; typedef LS LineSearch; public: // a constructor ConjugateGradient(///pointer to the line-search object. LS * ls, ///Maximum number of iterations int iter, ///minimum accepted gradient at optimum solution Real tol, ///vebose or quiet int verb=0); /* At the present version, you must use the CubicLineSearch procedure */ // a constructor ~ConjugateGradient(){;} // conjugate gradient search starting from m0, returns an optimum Model Param optimizer(Param& m0); }; template ConjugateGradient::ConjugateGradient(LS * p, int it, Real eps, int verb) : Optima(verb) { ls=p; iterMax = it; tol = eps; iterNum = 0; } // Necessite : // un produit scalaire sur Vect : (u,v) // un produit de Vect par un Real : operator* // un produit de Vect par un Real : operator*= // une diffrence de Vect : operator- template ConjugateGradient::Param ConjugateGradient::optimizer(Param& model0) { //reset the residue history for every new optimizer iterNum = 0; isSuccess = 0; if (residue != NULL) { delete residue; residue = new list; } int n = model0.size(); Param model1(model0); // new model Vect search(n); // search direction Vect g0(n); // old gradient vector Vect g1(n); // new gradient vector double beta; // beta parameter double lambda = .025; // line search parameter double descent = 0.; // descent direction // Beginning iterations g0 = *(ls->gradient(model0)); // check the gradient, in case the initial model is the optimal, Real err = (Real)sqrt((g0,g0)); if (isVerbose) cout << "Initial residue : " << err << endl; appendResidue(err); // residual if (err < tol) { if (isVerbose) cout << "Initial guess was great! \n"; isSuccess = 1; return model0; } // Considering first iteration search = -1. * g0; descent = (search,g0); // On utilise un CubicLineSearch // cerr<<"Line Search"<search(model0, search, descent, lambda); g1 = *(ls->gradient(model1)); // Gradient at new model err = (Real)sqrt((g1,g1)); if (isVerbose) cout << "Iteration (0) : " << "current value of the objective function: " << ls->currentValue() << "\t current residue: "<< err << endl; appendResidue(err); // residual iterNum = 0; Real temp; do { iterNum++; temp = 1./((g0,g0)); beta = ((g1-g0),g1); beta *= temp; // computation Polak & Ribiere search = beta * search - g1; // search direction descent = (search,g1); // descent if (descent > 0.) { if (isVerbose){ cout << "Reset search direction to gradient vector! \n"; } search = -1.*g1; descent = (search,g1); } model0 = model1; g0 = g1; // save the old model and gradient before new search // On utilise un CubicLineSearch // cerr<<"Line Search"<search(model0, search, descent, lambda); // line search g1 = *(ls->gradient(model1)); err = (Real)sqrt((g1,g1)); if (isVerbose) cout << "Iteration (" << iterNum << ") : "<<"current value of the nrj : " <currentValue() << "\t current residue : "<< err << endl; appendResidue(err); // residual } while (finalResidue() > tol && iterNum < iterMax); // stopping criterion if (finalResidue() <= tol) isSuccess = 1; return(model1); // hopefully answer } #endif freefem++-3.38-1/src/Algo/CubicLS.hpp000644 000767 000024 00000012057 11705630521 017257 0ustar00hechtstaff000000 000000 // Tony : lambda=0.25 ou lambda=0.025 ??? // cf. CG.hpp // // The minimizer along the search direction is returned by the function. // /* CubicLineSearch() class implements the efficient line search procedure described in Dennis and Schbabel's book entitled "Numerical Methods for Unconstrained and Nonlinear Equations. The objective is to perform a unidimensional search for a minimum point along a specified direction in a multidimensional space. */ // This procedure seems to be fairly robust. It has worked for a fairly broad class of // problems from optimization of standard test functons in optimization theory and // to hard geophysical problems as stacking power optimization and amplitude // seismogram inversion #ifndef CUBIC_LINE_SEARCH_HH #define CUBIC_LINE_SEARCH_HH #include "LineSearch.hpp" #include #include template class CubicLineSearch : public LS { typedef typename LS::Real Real; typedef typename LS::Param Param; typedef typename LS::Vect Vect; typedef typename LS::VMat VMat; typedef LS LineSearch; typedef tNRJ NRJ; public: //a constructor with the default delta CubicLineSearch(NRJ* f, int iter); //a constructor with the specified delta CubicLineSearch(NRJ* f, int iter, Vect* delta); /* The parameter $delta$ is not used by the line search itself. Rather it is used in the numerical computation of the derivatives using centered differences. For example the derivative of f(x) at the point x0 would be given by \[f(x0 - delta) - f(x0 + delta) / 2 * delta\] */ ~CubicLineSearch(); //search for the minimum model along a 1-D direction Param search(///initial model for the line search const Param& m0, ///search direction Vect& direction, /// product of search direction and gradient Real descent, ///a parameter double lambda); /* The parameter $lambda$ controls the accuraccy of the line search. $lambda = .25$ is a good choice. The minimizer along the search direction is returned by the function. */ // lambda=0.25 ou lambda=0.025 ??? // cf. CG.hpp }; template CubicLineSearch::CubicLineSearch(NRJ* f, int it) : LS(f) { this->iterMax = it; } template CubicLineSearch::CubicLineSearch(NRJ* f, int it, Vect* interval) : LS(f,interval) { this->iterMax = it; } template CubicLineSearch::~CubicLineSearch() {} // Code for the Cubic Line Search template typename CubicLineSearch::Param CubicLineSearch::search(const Param& current_solution, Vect& p, Real slope, double lambda){ int tst = 0; // useful vars Real alpha2=0, alpha_tmp=0, alpha_prev=0; Real alpha_prev2=0, alpha=0; Real f1=0, f2=0, fprev=0; Real a=0, b=0; Real c=0, cm11=0, cm12=0, cm21=0, cm22=0; Real disc=0; Real new_m=0, old_m=0; Param new_solution(current_solution); cout << " search " << p.max() << endl; assert(p.max() <1e100); old_m = this->nrj->getVal(current_solution); // Evaluation at the current solution this->iterNum = 0; this->iterNum++; // iteration counter alpha = 1.; // updating step new_solution = this->update(current_solution,1,alpha,p); // updating new_m = this->nrj->getVal(new_solution); // Evaluation at the // new solution this->iterNum++; // Implementing Goldstein's test for alpha too small while (new_m < old_m + (1. - lambda)*alpha*slope && this->iterNum< this->iterMax) { alpha *= 3; new_solution = this->update(current_solution,1, alpha, p); new_m = this->nrj->getVal(new_solution); this->iterNum++; } if (this->iterNum == this->iterMax) cerr << "Alpha overflowed! \n"; // Armijo's test for alpha too large alpha_prev = alpha; // H.L. Deng, 6/13/95 while (new_m > old_m + lambda*alpha*slope && this->iterNum < this->iterMax) { alpha2 = alpha * alpha; f1 = new_m - old_m - slope * alpha; if (tst == 0) { alpha_tmp = -slope * alpha2 / (f1 * 2.); // tentative alpha tst = 1; } else { alpha_prev2 = alpha_prev * alpha_prev; f2 = fprev - old_m - alpha_prev * slope; c = 1. / (alpha - alpha_prev); cm11 = 1. / alpha2; cm12 = -1. / alpha_prev2; cm21 = -alpha_prev / alpha2; cm22 = alpha / alpha_prev2; a = c * (cm11 * f1 + cm12 * f2); b = c * (cm21 * f1 + cm22 * f2); disc = b * b - 3. * a * slope; if ((Abs(a) > FLT_MIN) && (disc > FLT_MIN)) alpha_tmp = (-b + sqrt(disc)) / (3. * a); else alpha_tmp = slope * alpha2 / (2. * f1); if (alpha_tmp >= .5 * alpha) alpha_tmp = .5 * alpha; } alpha_prev = alpha; fprev = new_m; if (alpha_tmp < .1 * alpha) alpha *= .1; else alpha = alpha_tmp; new_solution = this->update(current_solution,1, alpha, p); new_m = this->nrj->getVal(new_solution); this->iterNum++; } if (this->iterNum == this->iterMax){ cerr << "Alpha underflowed! \n"; cerr << this->iterMax; } this->value = new_m; this->appendSearchNumber(); return (new_solution); // # of iterations } #endif freefem++-3.38-1/src/Algo/defs.hpp000644 000767 000024 00000004515 11406226635 016721 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DEFS_H #define DEFS_H #ifndef GLIB #define GLIB #include #include #include #include #include //#include #include #include #include using namespace std; //#include "mvvtp.h" //#include "mvblas.h" #endif // DEFINE simple constants #ifndef Pi #define Pi (3.141592653589793) #endif #ifndef TINY // sert dans BrentLS et Matrix #define TINY 1.0e-20 #endif #ifndef True #define True (1) #endif #ifndef False #define False (0) #endif #ifndef Yes #define Yes (1) #endif #ifndef No #define No (0) #endif //Define some simple template functions #ifndef Sgn #define Sgn(x) ((x) < 0 ? -1.0 : 1.0) #endif #ifndef Abs #define Abs(x) ((x) < 0 ? -(x) : (x)) #endif #ifndef Max #define Max(x,y) ((x) > (y) ? (x) : (y)) #endif #ifndef Min #define Min(x,y) ((x) < (y) ? (x) : (y)) #endif #ifndef inValidSize #define inValidSize() cerr<<"Warning: incompatible sizes!"< void affiche(list l) { typename list::iterator il; for (il=l.begin();il!=l.end();il++) cout <<(*il)<<" "; cout< list normalize(list l) { list v(l); Type scale = l.front(); typename list::iterator il; if (scale == 0) { cerr << "First element is zero, cannot be normed! \n"; return v; } else { for (il=v.begin();il!=v.end();il++) *il /= scale; return v; } } #endif freefem++-3.38-1/src/Algo/lgalgo.cpp000644 000767 000024 00000020576 11645651133 017245 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" #include "MatriceCreuse_tpl.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" #include "NRJ.hpp" #include "RosenBrock.hpp" #include "LineSearch.hpp" #include "CubicLS.hpp" #include "BrentLS.hpp" #include "Optima.hpp" #include "BFGS.hpp" //#include "CG.hpp" #include "NewtonRaphson.hpp" //template extern Block *currentblock; typedef double R; class PrintErrorCompileNewtow : public E_F0info { public: typedef double Result; static E_F0 * f(const basicAC_F0 & args) { lgerror("\n\n *** change Newtow in Newton .\n *** Bad name in previous version,\n *** sorry FH.\n\n"); return 0; } static ArrayOfaType typeargs() {return ArrayOfaType(true);} operator aType () const { return atype();} }; class OptimAlgo : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; typedef R REAL; typedef Param PARAM; typedef KN VECT; typedef KNM MAT; typedef VirtualMatrice VMAT; const int cas; class E_LCG: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =3; Expression nargs[n_name_param]; Expression X; C_F0 inittheparam,theparam,closetheparam; Expression J,dJ,hJ; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} class lgNRJ : public tNRJ { private: Stack stack; Expression J,dJ,hJ,theparame; VECT * gg; protected: void setparam( const Param& x ) { KN *p=GetAny *>( (*theparame)(stack) ); ffassert( p->N() == x.N()); *p =x; } public: lgNRJ(Stack s,int n,Expression t,Expression JJ,Expression dJJ,Expression hJJ) : tNRJ(n), stack(s), J(JJ),dJ(dJJ),hJ(hJJ),theparame(t), gg(0) { if(dJ) gg=new VECT(n); } ~lgNRJ() { if(gg) delete gg;} REAL Val(const Param& x) { setparam(x); assert(J); R ret= GetAny( (*J)(stack)); WhereStackOfPtr2Free(stack)->clean(); return ret; } VECT* Gradient(const Param& x) { setparam(x); if ( dJ) { *gg=GetAny( (*dJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); } return gg ; //dJ ? GetAny( (*dJ)(stack)) :0;} } VMAT* Hessian(const Param& x) { setparam(x); if (!hJ) return 0; Matrice_Creuse * M= GetAny *>( (*hJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); assert(M && M->A ); return (VirtualMatrice*) M->A;} }; E_LCG(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; const Polymorphic * opdJ=0; const Polymorphic * ophJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } if (nbj>1) { opdJ= dynamic_cast(args[1].LeftValue()); assert(opdJ); } if (nbj>2) { ophJ= dynamic_cast(args[2].LeftValue()); assert(ophJ); } J=dJ=hJ=0; J= to(C_F0(opJ,"(",theparam)); if(opdJ) dJ= to(C_F0(opdJ,"(",theparam));// mai2009 (bug????) Modif FH 17102005 (a verifier) to ->to if(ophJ) hJ= to< Matrice_Creuse *>(C_F0(ophJ,"(",theparam)); closetheparam=currentblock->close(currentblock); // the cleanning block expression /* if (nargs[2]) { const Polymorphic * op= dynamic_cast(nargs[2]); assert(op); C = op->Find("(",ArrayOfaType(atype(),false)); } else C =0; */ } virtual AnyType operator()(Stack stack) const { WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 typedef LineSearch LS; typedef CubicLineSearch CLS; KN * delta =0; R tol=arg(0,stack,1E-6); int itMax=arg(1,stack,100L); int itMaxLine=arg(2,stack,100L); bool verbose=verbosity>3; try { Kn &x = *GetAny((*X)(stack)); const int n=x.N(); //Kn * para = GetAny*>( inittheparam.eval(stack) ) ; // do allocation Param param(x); lgNRJ nrj1(stack,n,theparam,J,dJ,hJ); if (!dJ) delta = new KN(n); CLS ls( & nrj1,itMaxLine,delta); REAL initialNrj = nrj1.getVal(param); Optima *opt=0; if(cas==1) opt=new BFGS((CLS*)&ls,itMax,tol,verbose); else if(cas==2) opt=new Newt((CLS*)&ls,itMax,tol,verbose); else ErrorExec("lgalgo: Case no available Sorry internal bug",cas); param = opt->optimizer(param); REAL finalNrj = nrj1.getVal(param); if(verbosity) cout <1) { cout <<" The number of call to NRJ : "<< nrj1.Appel_Val() << endl; cout <<" The number of call to gradient : "<< nrj1.Appel_Grad() << endl; cout <<" The number of call to hessian : "<< nrj1.Appel_Hess() << endl; } if(verbosity>2) { cout <<"Normalized residue : "; affiche(opt->allResidue()); } if(verbosity) { cout <<" Initial NRJ value : " << initialNrj << endl; cout <<" Final NRJ value : " << finalNrj << endl;} delete opt; /// cout<<"The final optimized parameters : "<clean(); // FH mars 2005 if( delta) delete delta; throw ; } if( delta) delete delta; closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return 0L; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_LCG(args,cas);} OptimAlgo(int c) : OneOperator(atype(), atype(), atype *>()),cas(c){} OptimAlgo(int c,int cc) : OneOperator(atype(), atype(), atype(), atype *>()),cas(c){} OptimAlgo(int c,int cc,int ccc) : OneOperator(atype(), atype(), atype(), atype(), atype *>()),cas(c){} }; //template basicAC_F0::name_and_type OptimAlgo::E_LCG::name_param[]= { { "eps", &typeid(double) }, { "nbiter",&typeid(long) }, { "nbiterline",&typeid(long)} }; void init_algo(); void init_algo() { Global.Add("BFGS","(",new OptimAlgo(1,1)); // j + dJ Global.Add("Newton","(",new OptimAlgo(2,2,2)); // j + dJ Global.Add("Newtow","(",new OneOperatorCode); // error } //#include "InitFunct.hpp" //static addingInitFunct TheaddingInitFunct(-9,init_algo); freefem++-3.38-1/src/Algo/LineSearch.hpp000644 000767 000024 00000014734 11406226635 020021 0ustar00hechtstaff000000 000000 #ifndef LINE_SEARCH_HH #define LINE_SEARCH_HH #include #include "defs.hpp" #include "NRJ.hpp" #include #include #define MAX_IT_LS 1000 /* This is the base class for one dimensional line search algorithms. Some optimization algorithms need to find the optimimal point on one searching directions. Classes derived from this class inherit features of LineSearch. This class cannot be used directly. */ // Attention : // pas de copie // pas d'oprateur = template class LineSearch { public: typedef R Real; typedef VM VMat; typedef M Mat; typedef P Param; typedef V Vect; typedef tNRJ NRJ; private: //ne sert que si on calcule le gradient de manire numrique //dans ce cas, on lui alloue de la mmoire //sinon, ce n'est qu'un pointeur vers le gradient de nrj Vect* grad; int ref; //ref vaut 1 quand on a cr le gradient de manire numrique void numericalGradient(const Param &); protected: //maxinum number of iterations allowed; int iterMax; //the number iterations so far // rinitialiser dans les classes drives int iterNum; //the history of number of iteration of iteration list* iterHistory; //the value at the minimum along the direction //mis a jour dans les classes derivees Real value; //the delta used for calculating numerical gradient // c'est du meme type que le gradient Vect* step; //pointer to the nrj NRJ * nrj; void appendSearchNumber(); public: //a constructor with pointer to the nrj and //to the step if numerical gradient is computed LineSearch(NRJ* f,Vect* interval = NULL); virtual ~LineSearch(); // point de dpart et direction de descente + des paramtres virtual Param search(const Param&, Vect&, Real, double); //compute the gradient Vector //C'est tjs le linesearch qui on demande le gradient dans la suite Vect* gradient(const Param& m); //C'est tjs le linesearch qui on demande le hessien dans la suite VMat* hessian(const Param& m); //evaluate the nrj; Real evaluate(const Param& m); //number of iterations for all line searches. list allSearchIterations(); //number of iterations in the current line search; int searchIterations(); // value of the objective function for the current Model Real currentValue(); Param update(const Param&,Real, Real, const Vect&) const; }; template LineSearch::LineSearch(NRJ* p, Vect* interval ) { iterMax = MAX_IT_LS; iterNum = 0; nrj = p; step = interval; iterHistory = new list; grad = NULL; ref=0; value=0.; } template LineSearch::~LineSearch(){ if (iterHistory!=NULL) delete iterHistory; if (ref==1 && grad!=NULL) delete grad; if (step!=NULL) delete step; } template void LineSearch::appendSearchNumber() { iterHistory[0].push_back(iterNum); } template list LineSearch::allSearchIterations() { return iterHistory[0];} template int LineSearch::searchIterations() {return iterNum;} template typename LineSearch::Real LineSearch::currentValue() {return value;} template typename LineSearch::Param LineSearch::search(const Param& m,Vect& v,Real alpha, double beta) { cerr << "You need to specify the LineSearch method!"< void LineSearch::numericalGradient(const Param& m) { int n = m.size(); // au premier appel, on initialise le gradient if (grad==NULL){ grad = new Vect(n); ref=1; } Real diffValue, newValue, off; Param m1(m); if (step!=NULL){ for (int i = 0; i < n; i++) { off = step[0][i]; m1[i] -= off; newValue = nrj->getVal(m1); m1[i] += 2*off; diffValue = nrj->getVal(m1); diffValue -= newValue; (*grad)[i] = diffValue/(2*off); m1[i] = m[i]; } } else{ // Par dfaut, on fait un pas de taille relative 10^-3 for (int i = 0; i < n; i++) { off = m[i]/1000; m1[i] -= off; newValue = nrj->getVal(m1); m1[i] += 2*off; diffValue = nrj->getVal(m1); diffValue -= newValue; (*grad)[i] = diffValue/(2*off); m1[i] = m[i]; } } } template typename LineSearch::Vect* LineSearch::gradient(const Param& m) { Vect* g; g=nrj->getGradient(m); if (g==NULL){ cerr<<"Undefined gradient for this NRJ function !"< typename LineSearch::VMat* LineSearch::hessian(const Param& m) { VMat* h; h=nrj->getHessian(m); if (h==NULL){ cerr<<"Hessien is undefined for this NRJ function !"< typename LineSearch::Real LineSearch::evaluate(const Param& m) { return nrj->getVal(m); } // on avance depuis alpha*m, m tant le point actuel dans la direction dmod, de beta // on vrifie qu'on est dans les bornes template typename LineSearch::Param LineSearch::update(const Param& m,Real alpha, Real beta, const Vect& dmod) const { Param newparam(m); long ndim=m.size(); Vect direction(dmod); if (direction.size() != ndim) { cerr << "Size of direction is different from dimensions." << endl; exit(1); } // check to see if the new model is out of the upper bound cout << "update "<< m.min() << " " << m.max() << " " << direction.max() << " " << dmod.max() ; direction = alpha * m + beta * direction; newparam = direction; cout << " ; "<< newparam.min() << " " << newparam.max() << endl; if ((m.modMax() != NULL) && (m.modMin() != NULL)) { for (long i=0; i0) newparam[i] = (*(m.modMax()))[i]; if ((newparam[i]-(*(m.modMin()))[i])<0) newparam[i] = (*(m.modMin()))[i]; } } return newparam; } #endif freefem++-3.38-1/src/Algo/Makefile.am000644 000767 000024 00000000543 11406142256 017314 0ustar00hechtstaff000000 000000 # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # This is not compiled as a separate library because its # interconnections with other libraries have not been solved. EXTRA_DIST=BFGS.hpp BrentLS.hpp CG.hpp CubicLS.hpp defs.hpp lgalgo.cpp \ LineSearch.hpp NewtonRaphson.hpp NRJ.hpp Optima.hpp Param.hpp \ RosenBrock.hpp freefem++-3.38-1/src/Algo/Makefile.in000644 000767 000024 00000041421 12543260337 017331 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile using Automake + Autoconf # ---------------------------------- # $Id$ # This is not compiled as a separate library because its # interconnections with other libraries have not been solved. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/Algo ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = BFGS.hpp BrentLS.hpp CG.hpp CubicLS.hpp defs.hpp lgalgo.cpp \ LineSearch.hpp NewtonRaphson.hpp NRJ.hpp Optima.hpp Param.hpp \ RosenBrock.hpp all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Algo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Algo/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/src/Algo/NewtonRaphson.hpp000644 000767 000024 00000005144 11406226635 020604 0ustar00hechtstaff000000 000000 #ifndef NEWTONRAPHSON_HH #define NEWTONRAPHSON_HH #include "Optima.hpp" #include "defs.hpp" /* At the present version, you must use the CubicLS procedure */ // Necessite une "vraie" classe Matrice template class Newt : public Optima { typedef typename LS::Real Real; typedef typename LS::Param Param; typedef typename LS::Vect Vect; typedef typename LS::VMat VMat; typedef typename LS::Mat Mat; typedef list mlist; public: Newt(///pointer to the line-search object. LS * ls, ///Maximum number of iterations int iter, ///minimum accepted gradient at optimum solution Real tol, ///vebose or quiet int verb=0); ~Newt(){;} // the Newt search starting from model0, returns an optimum model Param optimizer(Param& model0); }; template Newt::Newt(LS* p, int it, Real eps, int verb) :Optima(verb) { this->ls=p; this->iterMax = it; this->tol = eps; this->iterNum = 0; } // Ncessite pour la classe MAT: // - une mthode de rsolution de Ax=b template typename Newt::Param Newt::optimizer( Param& model0) { //reset the this->residue history for every new optimizer this->iterNum = 0; if (this->residue != NULL) { delete this->residue; this->residue = new mlist; } // Initial settings for some parameters int n = model0.size(); Vect g0(n); double lambda = 0.025; double descent = 0.; g0= *(this->ls->gradient(model0)); // check the gradient, in case the initial model is the optimal double err = (Real)sqrt((g0,g0)); if (this->isVerbose) cerr << "Initial this->residue : " << err << endl; this->appendResidue(err); // residual if (err < this->tol) { if (this->isVerbose) cerr << "Initial guess was great! \n"; this->isSuccess = 1; return model0; } Vect g1(n); Vect s(n); Param model1(model0); while (this->finalResidue() > this->tol && this->iterNum < this->iterMax) { //searching directions // s = g0/(*this->ls->hessian(model0)); //on rinitialise LU a chaque fois this->ls->hessian(model0)->Solve(s,g0); s = -1.*s; descent = (s,g0); // Cubic Line Search model1 = this->ls->search(model0, s, descent, lambda); g1 = *(this->ls->gradient(model1)); err = (Real)sqrt((g1,g1)); if (this->isVerbose) cerr << "Iteration (" << this->iterNum << ") : "<<"current value of the objective function: " <ls->currentValue() << "\t current this->residue: "<< err << endl; this->appendResidue(err); // residual g0=g1; model0=model1; this->iterNum ++; } return(model1); } #endif freefem++-3.38-1/src/Algo/NRJ.hpp000644 000767 000024 00000004267 11406226635 016435 0ustar00hechtstaff000000 000000 #ifndef NRJ_HH #define NRJ_HH #include "defs.hpp" // Attention : // pas de copie // pas d'oprateur = template class tNRJ{ protected: int nappel_val; int nappel_grad; int nappel_hess; int nparam; Real val; Vect* grad; Mat* hess; public: // Attention : dans le constructeur de l'tNRJ, il faut vraiment // initialiser grad ou hess, si on les utilise... Ce n'est pas // fait ici (parce que l'initialisation dpend trop du type) tNRJ(int); virtual ~tNRJ(); // preciser pour chaque fonction tNRJ virtual Real Val(const Param&) = 0; Real getVal(const Param&); // preciser ventuellement, sinon a rend nul virtual Vect* Gradient(const Param&); Vect* getGradient(const Param&); // preciser ventuellement, sinon a rend nul virtual Mat* Hessian(const Param&); Mat* getHessian(const Param&); int Appel_Val() const {return nappel_val;}; int Appel_Grad() const {return nappel_grad;}; int Appel_Hess() const {return nappel_hess;}; }; template tNRJ::~tNRJ() { if (grad!=NULL) delete grad; if (hess!=NULL) delete hess; } template tNRJ::tNRJ(int n) { nparam=n; nappel_val=0; nappel_grad=0; nappel_hess=0; grad = NULL; hess = NULL; val=0.; } template Real tNRJ::getVal(const Param& p) { nappel_val++; return Val(p); } template Vect* tNRJ::getGradient(const Param& p) { nappel_grad++; return Gradient(p); } template Vect* tNRJ::Gradient(const Param&) { return NULL; } template Mat* tNRJ::getHessian(const Param& p) { nappel_hess++; return Hessian(p); } template Mat* tNRJ::Hessian(const Param&) { return NULL; } #endif freefem++-3.38-1/src/Algo/Optima.hpp000644 000767 000024 00000004545 11406226635 017234 0ustar00hechtstaff000000 000000 #ifndef OPTIMA_HH #define OPTIMA_HH #include "NRJ.hpp" #include #include "defs.hpp" #define MAX_IT_OPT 1000 //================== //define the base class for optimization classes // H. Lydia Deng, 03/14/94 //====================== /* This is the base class for general optimization classes. Classes derived from this class inherit features of Optima. This class cannot be instantiated directly. */ // Attention : // pas de copie // pas d'oprateur = template class Optima { typedef typename LS::Real Real; typedef typename LS::Param Param; typedef typename LS::Vect Vect; typedef typename LS::VMat VMat; typedef LS LineSearch; typedef list mlist; protected: // maximum number of iterations int iterMax; int iterNum; // tolerance error // c'est une tolrance sur la norme euclidienne du gradient Real tol; // mlist of residue mlist * residue; // pointer to LS LS * ls; // verbose or quiet int isVerbose; // the flag indicating if the search was a success int isSuccess; // append the new residue to the mlist void appendResidue(Real res); public: Optima(int verb=0); virtual ~Optima(); virtual Param optimizer(Param&) = 0; //Output residues int ifSuccess(); // residue of the last iteration Real finalResidue(); // residue of the first iteration Real firstResidue(); // residues of all iterations mlist allResidue(); // normalized residues of all iterations mlist normResidue(); }; template Optima::Optima(int verbose){ residue = new mlist; isVerbose = verbose; isSuccess = 0; ls = NULL; tol = 0.; iterMax = MAX_IT_OPT; } template Optima::~Optima() { if (residue!=NULL) delete residue; } //Output residues template int Optima::ifSuccess() {return isSuccess;} template typename Optima::Real Optima::finalResidue() {return residue->back();} template typename Optima::Real Optima::firstResidue() {return residue->front();} template typename Optima::mlist Optima::allResidue() {return *residue;} template typename Optima::mlist Optima::normResidue() {return normalize(*residue);} //cf. defs.hpp template void Optima::appendResidue(Real res) { (residue[0]).push_back(res); } #endif freefem++-3.38-1/src/Algo/Param.hpp000644 000767 000024 00000010723 11406226635 017036 0ustar00hechtstaff000000 000000 // Class Param // C'est la classe des paramtres par rapport auxquels on optimise // Derive de la classe KN // On pourra ventuellement lui ajouter des contraintes #ifndef PARAM_HH #define PARAM_HH #include using namespace std; #include "defs.hpp" //#include "mvvtp.h" //#include "mvblas.h" // on a besoin du type Vect pour la fonction update template class Param: public KN { private: int ndim; // Ces bornes servent ventuellement dans la mthode update de LineSearch.hpp // C'est une manire d'implmenter le gradient projet... KN* maxParam; KN* minParam; public: Param(); //construct a continuous model with size n Param(int n); //construct a continuous model space with boundary and initial values Param(const KN& maxp, const KN& minp, const KN& initmod); //construct a continuous model space with boundary Param(const KN& maxp, const KN& minp); //construct a continuous model space with initial values Param(const KN& initmod); //operateur de copie Param(const Param& p); virtual ~Param(); Param& operator=(const Param&); KN* modMax() const; KN* modMin() const; void setModMax(const KN& v); void setModMin(const KN& v); //cf. Stroustrup page 612-613 pour l'implmentation de operator<< virtual ostream& toto(ostream&) const; private: // pas de copy }; // Constructors template Param::Param(void) :KN() { // cerr<<"Constructeur par dfaut Param"< Param::Param(int n) :KN(n) { // cerr<<"Constructeur 0 Param"< Param::Param(const KN& maxp, const KN& minp, const KN& initmod) :KN(initmod) { int ndim=initmod.size(); // cerr<<"Constructeur 1 Param"<(ndim); minParam = new KN(ndim); maxParam[0] = maxp; minParam[0] = minp; } template Param::Param(const KN& maxp, const KN& minp) :KN(Min(minp.size(),maxp.size())) { int ndim=Min(minp.size(),maxp.size()); // cerr<<"Constructeur 2 Param"<(ndim); minParam = new KN(ndim); maxParam[0] = maxp; minParam[0] = minp; } template Param::Param(const KN& initmod) :KN(initmod) { // cerr<<"Constructeur 3 Param"< Param::Param(const Param& p) :KN(p) { // cerr<<"Operateur de copie de Param"<(ndim); *maxParam=*(p.maxParam); } if ((p.minParam)==NULL) minParam=NULL; else{ minParam = new KN(ndim); *minParam=*(p.minParam); } } template Param& Param::operator=(const Param& p) { // cerr<<"Operateur = de Param"< & a1= *this; const KN & a2= p; a1=a2; // Operateur de copie de KN int ndim=p.size(); if ((p.maxParam)==NULL) maxParam=NULL; else{ if(maxParam) delete maxParam; maxParam = new KN(ndim); *maxParam=*(p.maxParam); } if ((p.minParam)==NULL) minParam=NULL; else{ if(minParam) delete minParam; minParam = new KN(ndim); *minParam=*(p.minParam); } return (*this); } template Param::~Param() { // cerr<<"Destructeur de Param"< KN* Param::modMax() const { return maxParam; } template KN* Param::modMin() const { return minParam; } template void Param::setModMax(const KN& v) { if (maxParam!=NULL) delete maxParam; maxParam= new KN(v); } template void Param::setModMin(const KN& v) { if (minParam!=NULL) delete minParam; minParam= new KN(v); } //cf. Stroustrup page 612-613 pour l'implmentation de operator<< template ostream& Param::toto (ostream& os) const { for (long i=0;i<(*this).size();i++) os << (*this)[i]<<" "; os< ostream& operator <<(ostream& os, const Param& d) { return d.toto(os); } #endif freefem++-3.38-1/src/Algo/RosenBrock.hpp000644 000767 000024 00000004540 11406226635 020045 0ustar00hechtstaff000000 000000 #ifndef ROSENBROCK_HH #define ROSENBROCK_HH #include "NRJ.hpp" #include "Param.hpp" //#include "mvvtp.h" //#include "mvblas.h" template class RosenBrock : public tNRJ,KN,Mat,Real> { private: protected: public: //Constructors and Destructors RosenBrock(int); ~RosenBrock(); Real Val(const Param&); KN* Gradient(const Param&); Mat* Hessian(const Param&); }; template RosenBrock::RosenBrock(int n) :tNRJ,KN,Mat,Real>(n) { // On initialise le gradient this->grad= new KN(n); // On initialise le hessien // Si on utlise pas le hessien, il suffit qu'il existe un constructeur // pour le type Mat qui prend un parametre entier. C'est vrai pour les // doubles par exemple... this->hess= new Mat(n); (*this->hess)=0; } template RosenBrock::~RosenBrock() { ; } template Real RosenBrock::Val(const Param& param) { Real ti_1, ti, tt; Real d=0; ti_1=param[0]; for (int i=1; i < this->nparam; i++) { ti = param[i]; tt = 1-ti_1; d += tt*tt; tt=ti-ti_1*ti_1; d += 100*tt*tt; ti_1=ti; } this->val=d; return d; } template KN* RosenBrock::Gradient(const Param& param) { Real ti_1,ti; ti_1=param[0]; ti=param[1]; (*this->grad)[0]=-200*2*ti_1*(ti-ti_1*ti_1)-2*(1-ti_1); for (int i=1; inparam-1; i++){ (*this->grad)[i]=200*(ti-ti_1*ti_1); ti_1=ti; ti=param[i+1]; (*this->grad)[i] += -200*2*ti_1*(ti-ti_1*ti_1)-2*(1-ti_1); } (*this->grad)[this->nparam-1]=200*(ti-ti_1*ti_1); return this->grad; } template Mat* RosenBrock::Hessian(const Param& param) { Real ti_1,ti; ti_1=param[0]; ti=param[1]; (*this->hess)(0,0)=-200*2*(ti-ti_1*ti_1)+200*2*2*ti_1*ti_1+2; (*this->hess)(0,1)=-200*2*ti_1; for (int i=1; inparam-1; i++){ (*this->hess)(i,i)=200; (*this->hess)(i,i-1)=-200*2*ti_1; ti_1=ti; ti=param[i+1]; (*this->hess)(i,i) += -200*2*(ti-ti_1*ti_1)+200*2*2*ti_1*ti_1+2; (*this->hess)(i,i+1)=-200*2*ti_1; } (*this->hess)(this->nparam-1,this->nparam-1)=200; (*this->hess)(this->nparam-1,this->nparam-2)=-200*2*ti_1; return this->hess; } #endif freefem++-3.38-1/examples-bamg/NACA012/000755 000767 000024 00000000000 12544247065 017264 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples-bamg/quadloop/000755 000767 000024 00000000000 12544247065 020163 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples-bamg/square/000755 000767 000024 00000000000 12544247065 017637 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples-bamg/test/000755 000767 000024 00000000000 12544247065 017316 5ustar00hechtstaff000000 000000 freefem++-3.38-1/examples-bamg/test/dotest.pl000755 000767 000024 00000007663 11406142255 021163 0ustar00hechtstaff000000 000000 #!/usr/local/bin/perl # ----- clean --- unlink <*.mesh>; unlink <*.am_fmt>; unlink <*.mtr>; unlink <*.bb>; unlink <*.BB>; unlink ; unlink 'PLOT'; ##$f="10 + 1/(1+ 100**(sin(x*3)-y)) "; #$f1 = "(10*x*x*x+y*y*y) + 10/(1+10**(10*((sin(5*x)-2*y)))) "; $f1=" sin(3*x)*cos(5*y)+ atan2(0.001,x**2 + y**2 - 0.5 )"; #$f1=" 8*(x-y)**2 + (x+y)**2"; $err=0.1; $errg=0.01; $nbiteration=10; $bamg=$ENV{'bamg'}; $quadoption=""; $bamgoption=" -AbsError -NbJacobi 2 -NbSmooth 5 -anisomax 5 -hmax 0.5 -ratio 2 -nbv 100000 "; #$bamgoption=" -AbsError -NbJacobi 3 -ratio 2 -anisomax 30"; #$quadoption=" -2q -thetaquad 30 -coef 2"; # --- change x in $x and y in $y $_=$f1; s/x/\$x/g; s/y/\$y/g; $f1="$_;"; print "The function = f1(x,y) = $f1 \n"; #-------------------------- $suffixe=".mesh"; $iteration=0; $GH="Gh$suffixe"; $TH="Th$iteration$suffixe"; $, = ' '; # set output field separator $\ = "\n"; # set output record separator ## ------------------------------------------------------------- ## --- construction the Geometry file Gh.mesh ## 8 points on circle of radius r open(GH,">$GH") || die "Can't redirect stdout"; $Pi = 3.14159265358979; $i8 = 8; $r = 1; $c0x = 0; $c0y = 0; print GH 'Dimension', 2; print GH 'MaximalAngleOfCorner 46'; print GH 'Vertices'; print GH $i8; # vertex on circle (counter clock wise) for ($i = 0; $i < $i8; $i++) { $t = $i * $Pi * 2 / $i8; print GH $c0x + $r * (cos($t)), $c0y + $r * sin($t), 5; } print GH 'Edges', $i8+1; print GH 1,5,10; # edge on circle $k = 1; $j = $i8 - 1; # previous points for ($i = 0; $i < $i8; $j = $i++) { print GH $k + $j, $k + $i, 5; } # previous, current vertex # one subdomain, region on left side of the wing # because clock wise sens. print GH 'SubDomain', 2; print GH 2, 1, 1, 0; print GH 2, 1, -1, 1; close GH; ## -------------- END construct of the geom ## # -- make the DATA file for the mesh to also save the arguments open(BAMG,">DATA_bamg") || die "Can't open DATA_bamg"; print BAMG "$quadoption $bamgoption -g $GH -o $TH -v 9 -oam_fmt $TH.am_fmt"; close(BAMG); ## constructio the inital mesh !system($bamg) || die "Error in bamg construction of initial mesh $Th"; ## the adpatation loop while ($iteration<$nbiteration) { $BB="$iteration.BB"; $ERRBB="err$iteration.bb"; ## construction of the solution $errsol=0; open (TH,"<$TH") || die "Can't open $TH"; open (BB,">$BB") || die "Can't open $BB"; open (ERRBB,">$ERRBB") || die "Can't open $ERRBB"; while () { if(/^Vertices$/) { $nbv=; chop($nbv); print BB "2 1 1 $nbv 2"; for ($i=1;$i<=$nbv;$i++) { ($x,$y,$ref)=split(/[\ \t\n]+/, ); $f1xy=eval $f1; $xx[$i]=$x; $yy[$i]=$y; $ff[$i]=$f1xy; print BB $f1xy ; }; }; if(/^Triangles$/) { $nbt=; chop($nbt); print " Nb of Triangles = $nbt \n"; print ERRBB "2 1 $nbt 1"; for ($i=1;$i<=$nbt;$i++) { ($i0,$i1,$i2,$ref)=split(/[\ \t\n]+/, ); $x = ($xx[$i0]+$xx[$i1]+$xx[$i2])/3; $y = ($yy[$i0]+$yy[$i1]+$yy[$i2])/3; $fm = ($ff[$i0]+$ff[$i1]+$ff[$i2])/3; $fxy = eval $f1; $vv=($fm-$fxy); $vv= ($vv<0)?-$vv:$vv; print ERRBB $vv; $errsol = ($errsol>$vv) ? $errsol : $vv; }; }; }; close TH; close BB; close ERRBB; print " ---------------------------------------------\n"; print "\n\n Iteration $iteration\n Erreur L_infini = $errsol \n\n"; print " ---------------------------------------------\n"; ## ----------------------- $MTR="M$iteration.mtr"; $iteration++; $BTH=$TH; $TH="Th$iteration$suffixe"; open(BAMG,">DATA_bamg") || die "Can't open DATA_bamg"; print BAMG "$quadoption $bamgoption -MBB $BB -errg $errg -err $err -b $BTH -o $TH -v 9 -oM $MTR -oam_fmt $TH.am_fmt -wBB /tmp/tyty "; close(BAMG); !system($bamg) || die "Error in bamg construction of adapted $iteration mesh $Th"; } print "Normal End\n"; freefem++-3.38-1/examples-bamg/square/circle_g.mesh000644 000767 000024 00000000541 11406142255 022253 0ustar00hechtstaff000000 000000 MeshVersionFormatted 0 MaximalAngleOfCorner 46 Dimension 2 Vertices 8 1 0 1 .7071067811865476 .7071067811865476 1 0 1 1 -.7071067811865476 .7071067811865476 1 -1 0 1 -.7071067811865476 -.7071067811865476 1 0 -1 1 .7071067811865476 -.7071067811865476 1 Edges 8 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 7 8 1 8 1 1 hVertices 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 freefem++-3.38-1/examples-bamg/square/doadapt000755 000767 000024 00000002073 11406142255 021172 0ustar00hechtstaff000000 000000 #!/bin/sh prefix=circle equation='100*x*x*x+y*y+20*x*y' if [ -z "$bamg" ] ;then bamg=../../bamg; fi # for compatibility pb in awk if LANG=French LANG=C export LANG ## initialisation i=0 MESH=${prefix}_$i.mesh GEOM=${prefix}_g.mesh echo ${bamg} -g $GEOM -o $MESH -oam_fmt $MESH.am_fmt ${bamg} -g $GEOM -o $MESH -oam_fmt $MESH.am_fmt ## do a simple loop of adpation i1 = i-1 for i in 1 2 3 ; do BACK=${MESH} MESH=${prefix}_$i.mesh SOL=${BACK}.bb # generation of the solution file with awk awk ' BEGIN {k=0} k>0 {k--; x=$1;y=$2;print '$equation'} (k==-1) {k=$1; print 2,1,k,2;} $1=="Vertices" {k=-1;} ' $BACK > $SOL # generation of the adapted mesh echo ${bamg} -AbsError -v 8 -b $BACK -Mbb $SOL -err 0.005 -hmin 0.00001 -NbSmooth 3 -NbJacobi 3 -o $MESH -oam_fmt $MESH.am_fmt ${bamg} -AbsError -v 8 -b $BACK -Mbb $SOL -err 0.005 -hmin 0.00001 -NbSmooth 3 -NbJacobi 3 -o $MESH -oam_fmt $MESH.am_fmt echo "to see the result enter : ../../drawbdmesh $MESH" done freefem++-3.38-1/examples-bamg/square/dotest000755 000767 000024 00000004434 11406142255 021063 0ustar00hechtstaff000000 000000 rm -f *[0s].mesh g= quad= if [ "$1" = "-g" ] ;then g=-g;shift; fi if [ "$1" = "-q" ] ;then quad="-2q -coef 2 -thetaquad 10" ;shift; fi if [ "$1" = "-g" ] ;then g=-g;shift; fi if [ -z "$bamg" -o ! -x "$bamg" ] ;then bamg=../../bamg$g; fi echo " to close the graphic enter f on graphic window until they exist " echo "Mesh square " echo ${bamg} -g square_g.mesh -o square_0.mesh $quad ${bamg} -g square_g.mesh -o square_0.mesh $quad if [ $? -ne 0 -o ! -s square_0.mesh ] ; then echo "the file square_0.mesh is empty or d'ont exist";exit 1 ; fi echo ${bamg} -g square_g.mesh -o square_0.mesh $quad ${bamg} -splitpbedge -g square_g.mesh -o square_s.mesh $quad if [ $? -ne 0 -o ! -s square_0.mesh ] ; then echo "the file square_s.mesh is empty or d'ont exist";exit 1 ; fi echo "Mesh circle " ${bamg} -g circle_g.mesh -o circle_0.mesh $quad if [ $? -ne 0 -o ! -s circle_0.mesh ] ; then echo "the file circle_0.mesh is empty or d'ont exist";exit 1 ; fi echo "Mesh a octogone " ${bamg} -g octogone_g.mesh -o octogone_0.mesh $quad if [ ! -s octogone_0.mesh ] ; then echo "the file octogone_0.mesh is empty or d'ont exist";exit 1 ; fi echo "Mesh a square with raff " ${bamg} -g square_raf_g.mesh -o square_raf_0.mesh $quad if [ $? -ne 0 -o ! -s square_raf_0.mesh ] ; then echo "the file square_raf_0.mesh is empty or d'ont exist";exit 1 ; fi echo "Mesh a square with raff split pb edge" ${bamg} -splitpbedge -g square_raf_g.mesh -o square_raf_s.mesh $quad if [ $? -ne 0 -o ! -s square_raf_0.mesh ] ; then echo "the file square_raf_0.mesh is empty or d'ont exist";exit 1 ; fi echo "Mesh a square with anisotropique mesh " ${bamg} -g square_raf_g.mesh -o square_raf_ani_0.mesh -M square_raf_ani_g.mtr $quad if [ $? -ne 0 -o ! -s square_raf_ani_0.mesh ] ; then echo "the file square_raf_ani_0.mesh is empty or d'ont exist";exit 1 ; fi echo "Mesh a square with anisotropique mesh with -splitpbedge " ${bamg} -splitpbedge -g square_raf_g.mesh -o square_raf_ani_s.mesh -M square_raf_ani_g.mtr $quad if [ $? -ne 0 -o ! -s square_raf_ani_s.mesh ] ; then echo "the file square_raf_ani_s.mesh is empty or d'ont exist";exit 1 ; fi ${bamg} -splitpbedge -g l_g.mesh -o l_0.mesh $quad if [ $? -ne 0 -o ! -s l_0.mesh ] ; then echo "the file l_0.mesh is empty or d'ont exist";exit 1 ; fi freefem++-3.38-1/examples-bamg/square/l_g.mesh000644 000767 000024 00000015352 11406142255 021253 0ustar00hechtstaff000000 000000 MeshVersionFormatted 0 Dimension 2 AngleOfCornerBound 30 Vertices 226 7.5 -2.27374E-13 5 7.1962 2.11299 4 6.3094 4.05481 4 4.91146 5.66812 4 3.11561 6.82224 4 1.06736 7.42366 4 -1.06736 7.42366 4 -3.11561 6.82224 4 -4.91146 5.66812 4 -6.3094 4.05481 4 -7.1962 2.113 4 -7.5 -2.44381E-06 5 -6.0 58.86447 3 -6.44157 61.39993 3 -7.71429 63.63684 2 -9.09783 12.54909 5 -7.43538 14.2087 3 -6.36787 16.30117 3 -6.0 18.62123 3 7.71429 63.63684 2 6.44157 61.39993 3 6.0 58.86447 3 8.96137 65.56223 2 9.73688 67.72115 2 6.0 18.62123 3 6.36787 16.30117 3 7.43538 14.2087 3 9.09783 12.54909 5 6.0 56.85231 3 6.0 54.84015 3 6.0 52.82799 3 6.0 50.81583 3 6.0 48.80367 3 6.0 46.7915 3 6.0 44.77934 3 6.0 42.76718 3 6.0 40.75502 3 6.0 38.74286 3 6.0 36.7307 3 6.0 34.71854 3 6.0 32.70638 3 6.0 30.69421 3 6.0 28.68205 3 6.0 26.66989 3 6.0 24.65773 3 6.0 22.64557 3 6.0 20.63341 3 12.54909 9.09783 6 14.2087 7.43538 6 16.30117 6.36787 6 18.62123 6.0 6 28.86447 6.0 6 31.39993 6.44157 6 33.63684 7.71429 7 33.63684 -7.71429 7 31.39993 -6.44157 6 28.86447 -6.0 6 3.5 70.0 2 2.83156 72.05725 1 1.08156 73.3287 1 -1.08156 73.3287 1 -2.83156 72.05725 1 -3.5 70.0 2 43.5 .0 7 42.83156 2.05725 8 41.08156 3.3287 8 38.91844 3.3287 8 37.16844 2.05725 8 36.5 -1.14045E-06 7 10.96016 10.96016 5 20.66988 6.0 6 22.71853 6.0 6 24.76718 6.0 6 26.81582 6.0 6 35.34489 -8.85042 7 37.24883 -9.61411 7 39.26855 -9.97321 7 41.31905 -9.91262 7 43.31404 -9.43489 7 45.16957 -8.56012 7 46.80755 -7.32511 7 48.15905 -5.78185 7 49.16721 -3.99528 7 49.78959 -2.04058 7 50.0 -4.29153E-06 7 26.81582 -6.0 6 24.76717 -6.0 6 22.71852 -6.0 6 20.66987 -6.0 6 18.62123 -6.0 6 -10.7016 11.21272 5 -12.1113 9.67296 5 -13.3013 7.95773 5 -14.25 6.09815 5 -14.9402 4.12794 5 -15.3594 2.08286 5 -15.5 9.53674E-07 5 -6.0 20.63339 3 -6.0 22.64555 3 -6.0 24.65771 3 -6.0 26.66987 3 -6.0 28.68204 3 -6.0 30.6942 3 -6.0 32.70636 3 -6.0 34.71852 3 -6.0 36.73068 3 -6.0 38.74284 3 -6.0 40.755 3 -6.0 42.76717 3 -6.0 44.77933 3 -6.0 46.79149 3 -6.0 48.80365 3 -6.0 50.81581 3 -6.0 52.82797 3 -6.0 54.84013 3 -6.0 56.85229 3 16.30117 -6.36787 6 14.2087 -7.43538 6 12.54909 -9.09783 6 -6.13758 62.10506 3 -4.26429 60.95479 3 -2.18493 60.24162 3 5.24521E-06 60.0 3 2.18494 60.24162 3 4.2643 60.9548 3 6.13759 62.10507 3 32.10506 6.13758 7 30.95479 4.26429 7 30.24162 2.18494 7 30.0 -4.76837E-07 7 7.26591 13.69148 5 5.29303 14.56825 5 3.21746 15.16239 5 1.07947 15.46237 5 -1.07947 15.46237 5 -3.21746 15.16239 5 -5.29303 14.56825 5 -7.26591 13.69148 5 13.816 -7.02624 6 14.74383 -4.78221 6 15.30979 -2.42082 6 15.5 -1.43051E-06 6 49.78959 2.04058 7 49.16721 3.99528 7 48.15906 5.78185 7 46.80755 7.32511 7 45.16957 8.56011 7 43.31404 9.43489 7 41.31905 9.91262 7 39.26855 9.97321 7 37.24883 9.61411 7 35.34489 8.85042 7 45.66667 -1.11262E-06 0 47.83334 -5.56310E-07 0 30.24162 -2.18494 7 30.95479 -4.2643 7 32.10506 -6.13759 7 37.16844 -2.05725 8 38.91844 -3.3287 8 41.08156 -3.3287 8 42.83156 -2.05725 8 34.33333 -1.58946E-07 0 32.16666 -3.17892E-07 0 15.30979 2.42081 6 14.74383 4.78222 6 13.816 7.02625 6 -7.1962 -2.11299 4 -6.3094 -4.05481 4 -4.91146 -5.66812 4 -3.11561 -6.82224 4 -1.06736 -7.42366 4 1.06736 -7.42366 4 3.11561 -6.82224 4 4.91145 -5.66812 4 6.3094 -4.05481 4 7.1962 -2.113 4 -15.3645 -2.04516 5 -14.9603 -4.05455 5 -14.2945 -5.99305 5 -13.3788 -7.82675 5 -12.2291 -9.52359 5 -10.8656 -11.0539 5 -9.31208 -12.3909 5 -7.59574 -13.5113 5 -5.74658 -14.3954 5 -3.79693 -15.0278 5 -1.78089 -15.3974 5 .2662987 -15.4977 5 2.30883 -15.3271 5 4.31098 -14.8884 5 6.23775 -14.1895 5 8.05545 -13.2424 5 9.73229 -12.0637 5 11.23895 -10.6741 5 -13.5 1.93710E-07 0 -11.5 -8.94168E-08 0 -9.5 -3.72544E-07 0 9.5 -2.29475E-06 0 11.5 -2.32456E-06 0 13.5 -2.35437E-06 0 9.78148 72.07912 2 9.13545 74.06737 2 8.09017 75.87785 2 6.69131 77.43145 2 5.0 78.66026 2 3.09017 79.51057 2 1.04528 79.94522 2 -1.04529 79.94522 2 -3.09017 79.51057 2 -5.0 78.66026 2 -6.69131 77.43144 2 -8.09017 75.87785 2 -9.13546 74.06736 2 -9.78148 72.07912 2 -10.0 70.0 2 -2.83156 67.94275 1 -1.08156 66.6713 1 1.08156 66.6713 1 2.83156 67.94275 1 -9.73688 67.72115 2 -8.96137 65.56223 2 -7.83333 70.0 0 -5.66667 70.0 0 10.0 70.0 2 5.66667 70.0 0 7.83333 70.0 0 Edges 236 97 177 5 196 197 0 97 195 0 177 178 5 197 12 0 46 45 3 96 97 5 179 180 5 12 11 4 95 96 5 180 181 5 164 165 6 167 12 4 168 167 4 176 175 4 92 93 5 182 183 5 183 184 5 16 91 5 185 186 5 99 98 3 17 16 3 16 138 5 18 17 3 138 137 5 19 18 3 137 136 5 135 134 5 171 170 4 193 194 5 134 133 5 172 171 4 131 132 5 198 199 0 133 132 5 119 139 6 2 1 4 1 198 0 192 193 5 25 47 3 174 173 4 1 176 4 194 119 5 98 19 3 3 2 4 27 26 3 200 142 0 28 27 3 131 28 5 199 200 0 175 174 4 140 141 6 70 28 5 49 48 6 48 166 6 118 117 6 166 165 6 140 139 6 119 118 6 117 90 6 142 164 6 100 99 3 26 25 3 191 192 5 50 49 6 102 101 3 4 3 4 190 191 5 5 4 4 87 86 6 189 190 5 106 105 3 86 57 6 188 189 5 187 188 5 57 56 6 53 52 6 73 72 6 163 130 0 130 155 7 155 156 7 129 130 7 34 33 3 157 156 7 6 5 4 55 157 7 56 55 6 127 54 7 54 53 6 163 162 0 55 75 7 128 127 7 33 32 3 128 129 7 69 68 7 76 77 7 7 6 4 69 162 0 169 168 4 77 78 7 8 7 4 150 151 7 9 8 4 29 22 3 65 64 7 64 153 0 153 154 0 160 159 8 91 92 5 14 13 3 115 114 3 64 161 7 184 185 5 124 125 3 15 14 2 120 15 2 146 147 7 122 123 3 121 120 3 154 85 0 161 160 8 126 125 3 10 9 4 93 94 5 22 21 3 84 85 7 85 143 7 126 20 2 94 95 5 21 20 2 23 24 2 220 221 2 222 215 0 215 220 2 63 62 1 63 223 0 24 224 2 214 215 2 58 225 0 58 219 1 201 202 2 62 61 1 224 201 2 226 224 0 60 59 1 59 58 1 211 212 2 178 179 5 209 210 2 196 195 0 207 208 2 141 142 6 48 70 5 42 41 3 101 100 3 103 102 3 41 40 3 104 103 3 47 46 3 51 50 6 40 39 3 39 38 3 107 106 3 109 108 3 108 107 3 74 73 6 136 135 5 35 34 3 52 74 6 32 31 3 159 158 8 111 110 3 152 54 7 170 169 4 114 113 3 113 112 3 78 79 7 151 152 7 79 80 7 149 150 7 124 123 3 80 81 7 66 65 8 81 82 7 116 115 3 82 83 7 148 149 7 122 121 3 13 116 3 147 148 7 143 144 7 145 146 7 144 145 7 20 23 2 221 15 2 223 222 0 219 218 1 226 225 0 208 209 2 61 60 1 203 204 2 213 214 2 181 182 5 212 213 2 204 205 2 210 211 2 206 207 2 44 43 3 11 10 4 186 187 5 173 172 4 88 87 6 72 71 6 38 37 3 75 76 7 68 67 8 112 111 3 30 29 3 83 84 7 205 206 2 43 42 3 90 89 6 89 88 6 105 104 3 37 36 3 36 35 3 110 109 3 158 69 7 67 66 8 217 216 1 216 63 1 218 217 1 202 203 2 31 30 3 45 44 3 71 51 6 SubDomain 8 2 1 1 5 2 50 1 4 2 40 1 3 2 65 1 6 2 79 1 8 2 94 1 7 2 114 1 2 2 149 1 1 End freefem++-3.38-1/examples-bamg/square/octogone_g.mesh000644 000767 000024 00000000541 11406142255 022627 0ustar00hechtstaff000000 000000 MeshVersionFormatted 0 MaximalAngleOfCorner 44 Dimension 2 Vertices 8 1 0 1 .7071067811865476 .7071067811865476 1 0 1 1 -.7071067811865476 .7071067811865476 1 -1 0 1 -.7071067811865476 -.7071067811865476 1 0 -1 1 .7071067811865476 -.7071067811865476 1 Edges 8 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 7 8 1 8 1 1 hVertices 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 freefem++-3.38-1/examples-bamg/square/square_g.mesh000644 000767 000024 00000000224 11406142255 022310 0ustar00hechtstaff000000 000000 MeshVersionFormatted 0 Dimension 2 Vertices 4 -1 -1 1 1 -1 2 1 1 3 -1 1 4 Edges 4 1 2 1 2 3 1 3 4 2 4 1 2 hVertices 0.666 0.666 0.666 0.666 freefem++-3.38-1/examples-bamg/square/square_raf_ani_g.mtr000644 000767 000024 00000000056 11406142255 023640 0ustar00hechtstaff000000 000000 5 3 500 0 25 25 0 25 25 0 25 25 0 25 25 0 100 freefem++-3.38-1/examples-bamg/square/square_raf_g.mesh000644 000767 000024 00000000506 11406142255 023143 0ustar00hechtstaff000000 000000 MeshVersionFormatted 0 Dimension 2 Vertices 5 -1 -1 1 1 -1 2 1 1 3 -1 1 4 0 0 0 Edges 4 1 2 1 2 3 1 3 4 2 4 1 2 hVertices 0.666 0.666 0.666 0.666 0.01 # if you do not say that the vertex number 5 is required # the mesher lost this information so no refement # around the vertex (0.,0.) is done RequiredVertices 1 5 freefem++-3.38-1/examples-bamg/square/square_raf_g.mtr000644 000767 000024 00000000041 11406142255 023003 0ustar00hechtstaff000000 000000 5 1 0.666 0.666 0.666 0.666 0.01 freefem++-3.38-1/examples-bamg/quadloop/dotest.pl000755 000767 000024 00000010454 11535703040 022016 0ustar00hechtstaff000000 000000 #!/usr/bin/perl # -- so option ##$f="10 + 1/(1+ 100**(sin(x*3)-y)) "; $f = "10 + sin(x/10)*cos(y/3)"; $err=0.001; $errg=0.05; $nbiteration=3; $bamg="../../src/bamg/bamg"; $quadoption=""; $bamgoption=" -AbsError -NbJacobi 3 -ratio 2 -anisomax 30"; $quadoption=" -2q -thetaquad 30 -coef 2"; # --- change x in $x and y in $y $_=$f; s/x/\$x/g; s/y/\$y/g; $f="$_;"; print "The function = f(x,y) = $f \n"; #-------------------------- $suffixe=".mesh"; $iteration=0; $GH="Gh$suffixe"; $TH="Th$iteration$suffixe"; $, = ' '; # set output field separator $\ = "\n"; # set output record separator ## ------------------------------------------------------------- ## --- construction the Geometry file Gh.mesh ## a naca0012 wing in a big circle radius 5 ## 20 points on the up wing ## 20 points on the down wing ## 8 points on circle of radius r open(GH,">$GH") || die "Can't redirect stdout"; $Pi = 3.14159265358979; $i20 = 20; $i8 = 8; $r = 5; $c0x = 1; $c0y = 0; print GH 'Dimension', 2; print GH 'MaximalAngleOfCorner 46'; print GH 'Vertices'; print GH $i20 + $i20 + $i8; # the vertex on naca012 wing ( clock wise) for ($i = -$i20; $i < $i20; $i++) { $X = $i / $i20; $X = $X ** 4; $t = 1.008930411365 * $X; $Y = 5 * .12 * (0.2969 * sqrt($t) - 0.126 * $t - 0.3516 * $t ** 2 + 0.2843 * $t ** 3 - 0.1015 * $t ** 4); if ($i < 0) { $Y = -$Y; } print GH $X, $Y, 3; } # vertex on circle (counter clock wise) for ($i = 0; $i < $i8; $i++) { $t = $i * $Pi * 2 / $i8; print GH $c0x + $r * (cos($t)), $c0y + $r * sin($t), 5; } print GH 'Edges', $i20 + $i20 + $i8; # edge on wing $k = 1; $j = $i20 + $i20 - 1; # previous points for ($i = 0; $i < $i20 + $i20; $j = $i++) { print GH $j + $k, $i + $k, 3; } # previous, current vertex # edge on circle $k = $i20 + $i20 + 1; $j = $i8 - 1; # previous points for ($i = 0; $i < $i8; $j = $i++) { print GH $k + $j, $k + $i, 5; } # previous, current vertex # one subdomain, region on left side of the wing # because clock wise sens. print GH 'SubDomain', 1; print GH 2, 1, 1, 0; close GH; ## -------------- END construct of the geom ## # -- make the DATA file for the mesh to also save the arguments open(BAMG,">DATA_bamg") || die "Can't open DATA_bamg"; print BAMG "$quadoption $bamgoption -g $GH -o $TH -v 9"; close(BAMG); ## constructio the inital mesh !system($bamg) || die "Error in bamg construction of initial mesh $Th"; ## the adpatation loop while ($iteration<$nbiteration) { $BB="$iteration.bb"; ## construction of the solution $errsol=0; open (TH,"<$TH") || die "Can't open $TH"; open (BB,">$BB") || die "Can't open $BB"; open (PLOT,">PLOT") || die "Can't open PLOT"; while () { if(/^Vertices$/) { $nbv=; chop($nbv); print BB "2 1 $nbv 2"; for ($i=1;$i<=$nbv;$i++) { ($x,$y,$ref)=split(/[\ \t\n]+/, ); $fxy=eval $f; $xx[$i]=$x; $yy[$i]=$y; $ff[$i]=$fxy; print BB $fxy; }; }; if(/^Triangles$/) { print " Nb of Triangles = $nbt \n"; $nbt=; chop($nbt); for ($i=1;$i<=$nbt;$i++) { ($i0,$i1,$i2,$ref)=split(/[\ \t\n]+/, ); print PLOT "$xx[$i0] $yy[$i0] $ff[$i0]"; print PLOT "$xx[$i1] $yy[$i1] $ff[$i1]"; print PLOT "$xx[$i2] $yy[$i2] $ff[$i2]"; print PLOT "$xx[$i0] $yy[$i0] $ff[$i0]"; print PLOT ""; $x = ($xx[$i0]+$xx[$i1]+$xx[$i2])/3; $y = ($yy[$i0]+$yy[$i1]+$yy[$i2])/3; $fm = ($ff[$i0]+$ff[$i1]+$ff[$i2])/3; $fxy = eval $f; $vv=($fm-$fxy); $vv= ($vv<0)?-$vv:$vv; # print " $i0 $i1 $i2 $xx[$i0] $xx[$i1] $xx[$i2] "; # print " $i $x $y $fm $fxy err= $errsol diff=$vv"; $errsol = ($errsol>$vv) ? $errsol : $vv; }; }; }; close TH; close BB; close PLOT; print " ---------------------------------------------\n"; print "\n\n Iteration $iteration\n Erreur L_infini = $errsol \n\n"; print " ---------------------------------------------\n"; ## ----------------------- $iteration++; $BTH=$TH; $TH="Th$iteration$suffixe"; open(BAMG,">DATA_bamg") || die "Can't open DATA_bamg"; print BAMG "$quadoption $bamgoption -Mbb $BB -errg $errg -err $err -b $BTH -o $TH -v 9"; close(BAMG); !system($bamg) || die "Error in bamg construction of adapted $iteration mesh $Th"; } print "Normal End\n"; freefem++-3.38-1/examples-bamg/NACA012/ad.sh000755 000767 000024 00000004556 11406142255 020210 0ustar00hechtstaff000000 000000 #!/bin/sh -eu # the -e option to stop on error # we are with awk to do real operation in the shell # bamg=../../bamg-g NSC2KE=s/NSC2KE # for awk because in french the number 1/1000 is written 0,001 not 0.001 # to be sure the RADIXCHAR is '.' (cf. Native Language Support) LANG=C export LANG # some VAR ifin=2 j=0 INIT=0 LastIteration=0 NBITER=50 HMIN=0.05 HMINGLOBAL=0.0005 HCOEF=0.8 # clean of the output file rm -f [A-Z]* # create the geometry file awk -f naca.awk MESH_g.msh # create the initial mesh MESH_0.amdba $bamg -g MESH_g.msh -o MESH_$j.msh -hmax 2 -oamdba MESH_$j.amdba while [ $j -lt $ifin ] ; do # i = j + 1 i=`expr $j + 1` # LastIteration = LastIteration + NBITER LastIteration=`expr $LastIteration + $NBITER` ## set the current MESH rm -f MESH ln -s MESH_$j.amdba MESH ## create the DATA file for NSC2KE form file data ## change 2 lines for initialisation rm -f DATA sed -e "s/^INIT/$INIT/" -e "s/^LastIteration/$LastIteration/" DATA echo "--------- NSC2KE iteration $j -----------" $NSC2KE ## mv the GNU file for file in GNU.MACH GNU.MESH GNU.PRES GNU.TEMP GNU.TURB GNU.VECT;do mv -f $file $file.$j done ## find the nb of vertices in the file MESH nbv=`head -1 MESH|awk '{print $1}'` ## create the bb file for interpolation echo "2 4 $nbv 2" > SOL_$j.bb cat SOL_NS >> SOL_$j.bb ## create the bb file for metric construction ## in file SOL_NS on each line i we have ro ro*u ro*v energy ## at vertex i ## + a last line with 2 number last iteration and last time echo "2 1 $nbv 2" > MACH.bb awk 'NF==4 { print sqrt($2*$2+$3*$3)/$1}' SOL_NS >> MACH.bb ## put all the residual in one file cat RESIDUAL >>RESIDU ## set HMIN = MAX($HMINGLOBAL,$HMIN*$HCOEF) HMIN=`awk "END {c=$HMIN*$HCOEF;c=c<$HMINGLOBAL ?$HMINGLOBAL:c; print c};" DATA_bamg $bamg ## creation of the INIT_NS for NSC2KE ## remove fisrt line form bb file and add the last line of SOL_NS sed 1d INIT_NS tail -1 SOL_NS >>INIT_NS # change i and not initialisation j=$i INIT=1 done freefem++-3.38-1/examples-bamg/NACA012/adap.sh000755 000767 000024 00000005040 11406142255 020516 0ustar00hechtstaff000000 000000 #!/bin/sh -eu # the -e option to stop on error # we are with awk to do real operation in the shell # bamg=../../bamg NSC2KE=s/NSC2KE # for awk because in french the number 1/1000 is written 0,001 not 0.001 # to be sure the RADIXCHAR is '.' (cf. Native Language Support) LANG=C export LANG # some VAR ifin=20 j=0 INIT=0 LastIteration=0 NBITER=500 # --------- HMIN=1e-6 HMINGLOBAL=$HMIN HCOEF=1 # ------- ERR=0.1 ERRCOEF=0.8608916593317348 ERRGLOBAL=0.01 # ----------- # end of some parameters # ---------- # clean of the output file rm -f [A-Z]* # create the geometry file awk -f naca.awk MESH_g.msh # create the initial mesh MESH_0.amdba $bamg -g MESH_g.msh -o MESH_$j.msh -hmax 1 -oamdba MESH_$j.amdba while [ $j -lt $ifin ] ; do # i = j + 1 i=`expr $j + 1` # LastIteration = LastIteration + NBITER LastIteration=`expr $LastIteration + $NBITER` ## set the current MESH rm -f MESH ln -s MESH_$j.amdba MESH ## create the DATA file for NSC2KE form file data ## change 2 lines for initialisation rm -f DATA sed -e "s/^INIT/$INIT/" -e "s/^LastIteration/$LastIteration/" DATA echo "--------- NSC2KE iteration $j -----------" $NSC2KE ## find the nb of vertices in the file MESH nbv=`head -1 MESH|awk '{print $1}'` ## create the bb file for interpolation echo "2 4 $nbv 2" > SOL_$j.bb cat SOL_NS >> SOL_$j.bb ## create the bb file for metric construction ## in file SOL_NS on each line i we have ro ro*u ro*v energy ## at vertex i ## + a last line with 2 number last iteration and last time echo "2 1 $nbv 2" > MACH.bb awk 'NF==4 { print sqrt($2*$2+$3*$3)/$1}' SOL_NS >> MACH.bb ## put all the residual in one file cat RESIDUAL >>RESIDU ## set HMIN = MAX($HMINGLOBAL,$HMIN*$HCOEF) HMIN=`awk "END {c=$HMIN*$HCOEF;c=c<$HMINGLOBAL ?$HMINGLOBAL:c; print c};" DATA_bamg echo --- bamg parameters --- cat DATA_bamg echo ---------------------- $bamg ## creation of the INIT_NS for NSC2KE ## remove fisrt line form bb file and add the last line of SOL_NS sed 1d INIT_NS tail -1 SOL_NS >>INIT_NS # change i and not initialisation j=$i INIT=1 done freefem++-3.38-1/examples-bamg/NACA012/adap.sh-g000755 000767 000024 00000004743 11406142255 020753 0ustar00hechtstaff000000 000000 #!/bin/sh -eu # the -e option to stop on error # we are with awk to do real operation in the shell # bamg=../../bamg-g NSC2KE=s/NSC2KE # for awk because in french the number 1/1000 is written 0,001 not 0.001 # to be sure the RADIXCHAR is '.' (cf. Native Language Support) LANG=C export LANG # some VAR ifin=20 j=0 INIT=0 LastIteration=0 NBITER=500 HMIN=0.05 HMINGLOBAL=0.0005 HCOEF=0.8 # clean of the output file rm -f [A-Z]* # create the geometry file awk -f naca.awk MESH_g.msh # create the initial mesh MESH_0.amdba echo -- $bamg -g MESH_g.msh -o MESH_$j.msh -hmax 2 -oamdba MESH_$j.amdba $bamg -g MESH_g.msh -o MESH_$j.msh -hmax 2 -oamdba MESH_$j.amdba while [ $j -lt $ifin ] ; do # i = j + 1 i=`expr $j + 1` # LastIteration = LastIteration + NBITER LastIteration=`expr $LastIteration + $NBITER` ## set the current MESH rm -f MESH ln -s MESH_$j.amdba MESH ## create the DATA file for NSC2KE form file data ## change 2 lines for initialisation rm -f DATA sed -e "s/^INIT/$INIT/" -e "s/^LastIteration/$LastIteration/" DATA echo "--------- NSC2KE iteration $j -----------" $NSC2KE ## find the nb of vertices in the file MESH nbv=`head -1 MESH|awk '{print $1}'` ## create the bb file for interpolation echo "2 4 $nbv 2" > SOL_$j.bb cat SOL_NS >> SOL_$j.bb ## create the bb file for metric construction ## in file SOL_NS on each line i we have ro ro*u ro*v energy ## at vertex i ## + a last line with 2 number last iteration and last time echo "2 1 $nbv 2" > MACH.bb awk 'NF==4 { print sqrt($2*$2+$3*$3)/$1}' SOL_NS >> MACH.bb ## put all the residual in one file cat RESIDUAL >>RESIDU ## set HMIN = MAX($HMINGLOBAL,$HMIN*$HCOEF) HMIN=`awk "END {c=$HMIN*$HCOEF;c=c<$HMINGLOBAL ?$HMINGLOBAL:c; print c};" INIT_NS tail -1 SOL_NS >>INIT_NS # change i and not initialisation j=$i INIT=1 done freefem++-3.38-1/examples-bamg/NACA012/data000644 000767 000024 00000002700 11406142255 020106 0ustar00hechtstaff000000 000000 0 --> =0 2D, =1 AXISYMMETRIC 0 --> =0 Euler, =1 Navier-Stokes 1.e2 --> Reynolds by meter (the mesh is given in meter) 0. --> inverse of Froude number (=0 no gravity) 0.96 --> inflow Mach number 1. --> ratio pout/pin 1 --> wall =1 newmann b.c.(adiabatic wall), =2 (isothermal wall) 300. --> inflow temperature (in Kelvin) for Sutherland laws 288. --> if isothermal walls , wall temperature (in Kelvin) 0.0 --> angle of attack 1 --> Euler fluxes =1 roe, =2 osher,=3 kinetic 3 --> nordre = 1st order scheme, =2 2ndorder, =3 limited 2nd order 1 --> =0 global time steping (unsteady), =1 local Euler, =2 local N.S. 1. --> cfl LastIteration --> number of time step 500 --> frequence for the solution to be saved 1.e10 --> maximum physical time for run (for unsteady problems) -4. --> order of magnitude for the residual to be reduced (for steady problems) INIT --> =0 start with uniform solution, =1 restart from INIT_NS cccc turbulence ccccccccccccccccccccccccccccccccccccccccccccccccccccccc 0 --> =0 no turbulence model, =1 k-epsilon model 0 --> =0 two-layer technique, =1 wall laws 1.e-2 --> delta in wall laws or limit of the one-eq. model. (in meter) 0 --> =0 start from uniform solution for k-epsilon, =1 from INIT_KE -1.e10 1.e10 -1.e10 1.e10 --> xtmin,xtmax,ytmin,ytmax (BOX for k-epsilon r.h.s) freefem++-3.38-1/examples-bamg/NACA012/data-orign000644 000767 000024 00000002677 11406142255 021237 0ustar00hechtstaff000000 000000 0 --> =0 2D, =1 AXISYMMETRIC 0 --> =0 Euler, =1 Navier-Stokes 1.e2 --> Reynolds by meter (the mesh is given in meter) 0. --> inverse of Froude number (=0 no gravity) 0.8 --> inflow Mach number 1. --> ratio pout/pin 1 --> wall =1 newmann b.c.(adiabatic wall), =2 (isothermal wall) 300. --> inflow temperature (in Kelvin) for Sutherland laws 288. --> if isothermal walls , wall temperature (in Kelvin) 0.0 --> angle of attack 1 --> Euler fluxes =1 roe, =2 osher,=3 kinetic 3 --> nordre = 1st order scheme, =2 2ndorder, =3 limited 2nd order 1 --> =0 global time steping (unsteady), =1 local Euler, =2 local N.S. 1. --> cfl LastIteration --> number of time step 500 --> frequence for the solution to be saved 1.e10 --> maximum physical time for run (for unsteady problems) -4. --> order of magnitude for the residual to be reduced (for steady problems) INIT --> =0 start with uniform solution, =1 restart from INIT_NS cccc turbulence ccccccccccccccccccccccccccccccccccccccccccccccccccccccc 0 --> =0 no turbulence model, =1 k-epsilon model 0 --> =0 two-layer technique, =1 wall laws 1.e-2 --> delta in wall laws or limit of the one-eq. model. (in meter) 0 --> =0 start from uniform solution for k-epsilon, =1 from INIT_KE -1.e10 1.e10 -1.e10 1.e10 --> xtmin,xtmax,ytmin,ytmax (BOX for k-epsilon r.h.s) freefem++-3.38-1/examples-bamg/NACA012/naca.awk000644 000767 000024 00000001644 11406142255 020666 0ustar00hechtstaff000000 000000 END { Pi=3.14159265358979; i20=20; i8=8; r = 5; c0x = 1; c0y=0; print "Dimension",2; print "MaximalAngleOfCorner 46"; print "Vertices",i20+i20+i8; # the vertex on naca012 wing ( clock wise) for (i=-i20;i5) cc=1; if(i<9) ReMeshIndicator(Th,Ph,Vh,indicator2,cc); plot(u,Th,wait=1,ps="arei-Thu.eps",value=1); } freefem++-3.38-1/examples++-tutorial/aile.msh000644 000767 000024 00000025104 12214310341 021025 0ustar00hechtstaff000000 000000 112 184 40 4.075497E+00 8.003750E-01 1 3.468245E+00 9.339829E-01 1 2.857521E+00 1.039934E+00 1 2.231503E+00 1.131899E+00 1 1.596009E+00 1.213341E+00 1 9.782588E-01 1.283559E+00 1 3.468041E-01 1.347639E+00 1 -2.795196E-01 1.404281E+00 1 -9.100614E-01 1.454697E+00 1 -1.537047E+00 1.498263E+00 1 -2.171066E+00 1.535326E+00 1 -2.793453E+00 1.564127E+00 1 -3.431808E+00 1.584451E+00 1 -4.065853E+00 1.592797E+00 1 -4.688077E+00 1.584438E+00 1 -5.305153E+00 1.547287E+00 1 -5.914978E+00 1.398924E+00 1 -6.476645E+00 1.117341E+00 1 -6.972389E+00 7.314404E-01 1 -7.382722E+00 2.559056E-01 1 -7.674503E+00 -2.996254E-01 1 2.686152E+00 9.200337E-01 1 1.290776E+00 9.916314E-01 1 -1.058211E-01 1.019319E+00 1 -1.489369E+00 9.981937E-01 1 -2.891748E+00 9.439344E-01 1 -4.288854E+00 8.350767E-01 1 -5.664926E+00 5.838397E-01 1 -6.364868E+00 -5.272588E-01 1 -7.066498E+00 -1.478878E+00 1 1.019193E+01 -7.961763E-01 1 7.782479E+00 6.619352E+00 1 1.474454E+00 1.120240E+01 1 -6.322694E+00 1.120240E+01 1 -1.263072E+01 6.619351E+00 1 -1.504017E+01 -7.961774E-01 1 -1.263072E+01 -8.211705E+00 1 -6.322695E+00 -1.279475E+01 1 1.474456E+00 -1.279475E+01 1 7.782482E+00 -8.211700E+00 1 -1.050187E+01 -3.774225E+00 0 -1.030402E+01 1.760113E+00 0 -1.062298E+01 -9.409381E-01 0 -8.120244E+00 -6.890119E+00 0 -8.327751E+00 1.114643E+00 0 -7.030205E+00 3.655890E+00 0 -5.705182E+00 2.251289E+00 0 -5.233823E+00 2.586788E+00 0 -3.568635E+00 -1.971066E-01 0 -3.864839E+00 4.360435E+00 0 -1.868891E+00 2.562439E+00 0 -1.347341E+00 -2.504814E+00 0 -6.859015E-01 1.758138E+00 0 -5.138293E+00 -7.542873E+00 0 -8.016615E+00 -4.056562E+00 0 -8.900968E+00 4.022112E+00 0 2.436143E-01 4.142326E+00 0 -2.172804E+00 -5.206747E-01 0 -1.846865E+00 3.983616E+00 0 -5.449497E-01 2.949911E+00 0 1.796799E+00 2.113467E+00 0 3.521564E+00 -4.406007E+00 0 5.387890E+00 2.588071E+00 0 2.493658E+00 2.880930E+00 0 6.233596E+00 -3.148530E+00 0 1.151424E+00 -2.496122E+00 0 -6.611673E+00 5.729552E+00 0 1.909933E+00 -6.032418E-01 0 2.557634E+00 5.670380E+00 0 -8.797068E+00 -1.072165E-02 0 -1.857090E+00 -8.452744E+00 0 -7.845343E+00 2.301641E+00 0 -2.536231E+00 1.918698E+00 0 -1.874209E+00 1.878176E+00 0 -3.863200E+00 2.121552E+00 0 -3.667961E+00 -1.848395E+00 0 -1.273230E+00 1.884726E+00 0 -3.328228E+00 -4.736179E+00 0 -2.058262E+00 6.607205E+00 0 -4.799016E+00 -4.393931E-01 0 -1.170004E-01 -4.384110E-01 0 -2.552725E-01 1.825780E+00 0 5.865835E-02 -5.068399E+00 0 3.903476E+00 1.427050E+00 0 2.657649E+00 1.593844E+00 0 -6.770658E+00 1.814122E+00 0 -6.113464E+00 -4.835857E+00 0 -5.535376E+00 3.640081E+00 0 -2.976545E+00 3.245543E+00 0 1.189424E-01 2.193703E+00 0 -8.507294E+00 -1.916803E+00 0 1.083397E+00 1.824587E+00 0 1.875683E+00 1.569242E+00 0 5.374640E+00 -2.497857E-01 0 8.662421E-01 2.677091E+00 0 4.311450E+00 -2.071755E+00 0 2.890089E+00 -2.017998E+00 0 -5.951860E+00 1.815626E+00 0 -5.236918E+00 -1.528655E+00 0 -7.297338E+00 1.219361E+00 0 -3.150111E+00 2.389109E+00 0 -4.548691E+00 2.131815E+00 0 -4.164779E+00 2.921586E+00 0 3.374693E-01 1.648933E+00 0 3.541547E+00 -5.395558E-01 0 2.197370E+00 -7.784485E+00 0 -6.838565E+00 -2.848820E+00 0 -5.231667E+00 -2.938977E+00 0 -7.554908E-01 2.195015E+00 0 -6.305655E+00 2.573771E+00 0 -5.234858E+00 1.989110E+00 0 -6.141749E+00 -1.868861E+00 0 45 42 70 1 43 70 42 1 37 44 41 1 47 110 98 1 35 36 42 1 38 44 37 1 41 55 91 1 54 38 71 1 100 18 86 1 76 80 99 1 45 20 100 1 98 16 111 1 80 28 29 1 111 15 102 1 73 101 13 1 73 51 101 1 80 27 28 1 47 98 111 1 51 73 74 1 58 26 49 1 48 47 111 1 77 9 53 1 58 49 76 1 51 74 77 1 5 93 92 1 52 76 78 1 44 54 87 1 46 67 56 1 36 43 42 1 33 34 79 1 49 27 80 1 51 77 109 1 58 52 81 1 53 8 82 1 4 3 85 1 52 78 83 1 94 84 1 1 64 61 85 1 61 93 85 1 62 40 65 1 68 23 81 1 45 70 20 1 50 79 67 1 19 100 20 1 23 24 81 1 43 36 41 1 32 33 69 1 37 41 36 1 31 32 63 1 70 91 21 1 56 67 35 1 18 17 98 1 75 102 14 1 72 86 110 1 74 73 11 1 110 48 88 1 49 26 27 1 55 44 87 1 67 79 34 1 103 75 101 1 53 9 8 1 88 48 103 1 62 83 106 1 25 58 81 1 104 8 7 1 82 8 104 1 54 44 38 1 39 71 38 1 55 107 91 1 44 55 41 1 56 35 42 1 45 72 42 1 6 5 92 1 4 85 93 1 81 52 66 1 26 58 25 1 59 57 79 1 88 103 50 1 60 57 59 1 51 60 59 1 84 85 2 1 60 90 95 1 65 40 31 1 105 68 97 1 63 84 94 1 69 63 32 1 64 63 69 1 90 92 95 1 94 31 63 1 62 65 96 1 66 52 83 1 96 94 105 1 67 34 35 1 88 67 46 1 96 97 62 1 23 68 22 1 69 33 79 1 64 69 57 1 70 43 91 1 20 70 21 1 83 71 106 1 78 71 83 1 72 46 56 1 42 72 56 1 73 13 12 1 11 73 12 1 74 11 10 1 9 77 10 1 75 14 13 1 51 89 101 1 87 108 107 1 58 76 52 1 77 74 10 1 82 109 53 1 87 78 108 1 71 78 54 1 79 50 59 1 69 79 57 1 112 29 30 1 49 80 76 1 81 66 68 1 25 81 24 1 92 104 6 1 77 53 109 1 106 71 39 1 66 83 62 1 84 2 1 1 64 84 63 1 85 3 2 1 64 85 84 1 86 98 110 1 45 100 72 1 87 54 78 1 76 99 108 1 88 50 67 1 110 88 46 1 89 51 59 1 50 89 59 1 95 61 64 1 109 90 60 1 91 30 21 1 41 91 43 1 92 61 95 1 82 104 90 1 93 61 92 1 4 93 5 1 94 1 105 1 31 94 65 1 95 64 57 1 60 95 57 1 96 65 94 1 22 68 105 1 97 68 66 1 62 97 66 1 98 86 18 1 16 98 17 1 99 80 29 1 107 108 112 1 100 19 18 1 72 100 86 1 101 89 103 1 13 101 75 1 102 15 14 1 103 102 75 1 103 48 102 1 50 103 89 1 104 7 6 1 90 104 92 1 105 1 22 1 96 105 97 1 106 39 40 1 62 106 40 1 107 30 91 1 87 107 55 1 108 78 76 1 112 108 99 1 109 82 90 1 51 109 60 1 110 47 48 1 72 110 46 1 111 16 15 1 48 111 102 1 112 99 29 1 107 112 30 1 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 7 8 1 8 9 1 9 10 1 10 11 1 11 12 1 12 13 1 13 14 1 14 15 1 15 16 1 16 17 1 17 18 1 18 19 1 19 20 1 20 21 1 1 22 1 22 23 1 23 24 1 24 25 1 25 26 1 26 27 1 27 28 1 28 29 1 29 30 1 30 21 1 31 32 1 32 33 1 33 34 1 34 35 1 35 36 1 36 37 1 37 38 1 38 39 1 39 40 1 40 31 1 freefem++-3.38-1/examples++-tutorial/algo.edp000644 000767 000024 00000014022 12357435771 021042 0ustar00hechtstaff000000 000000 // cleanning version 07/2008 FH in Sevilla. int nerr =0; int debugJ =0; int debugdJ =0; real umax=0; { func bool stop(int iter,real[int] u,real[int] g) { cout << " stop = " << iter << " " << u.linfty << " " << g.linfty << endl; return g.linfty < 1e-5 || iter > 15;; } // minimisation of $J(u) = \frac12\sum (i+1) u_i^2 - b_i $ // work array real[int] b(10),u(10); func real J(real[int] & u) { real s=0; for (int i=0;i=0) C(I[i])+=a[i]; cout << " b = a(I) : " << b << "\n c(I) = a " << c << endl; } { // bidimensionnal array int N=3,M=4; real[int,int] A(N,M),RA(N,M); real[int] b(N),c(M); b=[1,2,3]; c=[4,5,6,7]; complex[int,int] C(N,M); complex[int] cb=[1,2,3],cc=[10i,20i,30i,40i]; b=[1,2,3]; int [int] I=[2,0,1]; int [int] J=[2,0,1,3]; A=1; // set the all matrix A(2,:) = 4; // the full line 2 A(:,1) = 5; // the full column 1 A(0:N-1,2) = 2; // set the column 2 A(1,0:2) = 3; // set the line 1 from 0 to 2 cout << " A = " << A << endl; // outer product C = cb*cc'; C += 3*cb*cc'; C -= 5i*cb*cc'; cout << " C = " << C << endl; // the way to transform a array to a sparce matrix matrix B; B = A; B=A(I,J); // B(i,j)= A(I(i),J(j)) B=A(I^-1,J^-1); // B(I(i),J(j))= A(i,j) A = 2.*b*c'; // outer product cout << " A = " << A << endl; cout << " A(1,2) " << A(1,2) << endl; B = b*c'; // outer product B(i,j) = b(i)*c(j) B = b*c'; // outer product B(i,j) = b(i)*c(j) B = (2*b*c')(I,J); // outer product B(i,j) = b(I(i))*c(J(j)) B = (3.*b*c')(I^-1,J^-1); // outer product B(I(i),J(j)) = b(i)*c(j) cout << "B = (3.*b*c')(I^-1,J^-1) = " << B << endl; cout << " b =" << b << endl; b = exp(b) ; cout << " exp(b) =" << b << endl; cb += complex(10.)*cc(0:2); cout << " cb =" << cb << endl; cb = exp(cb) ; cout << " exp(cb) =" << cb << endl; cout << " exp(cb).re =" << cb.re << endl; cout << " exp(cb).im =" << cb.im << endl; cb.im = 0.; cout << cb << endl; b += cb.re + cb.im; // do not work to do cout << " b = " << endl; {ofstream FA("A.txt"); FA << A << endl; } {ifstream FA("A.txt"); FA >> RA ; cout << RA << endl; RA -= A; cout << " RA = 00 ??? " << RA.linfty << endl; assert( RA.linfty < 1e-12); } } { // sort array : real[int] a=[3,5,7,9,0]; real[int] b(a); int[int] p=[0,1,2,3,4]; b=a; cout << " a =" < " << tt << endl; } { real[int] tt(2:10); // 2,3,4,5,6,7,8,9,10 real[int] t1(2.:3:10.); // 2,5,8, cout << " tt(2:10) = = " << tt << endl; cout << " t1(2.:3:10.)= " << t1 << endl; tt=1.:0.5:3.999; cout << " 1.:0.5:3.999 => " << tt << endl; } { complex[int] tt(2.+0i:10.+0i); // 2,3,4,5,6,7,8,9,10 complex[int] t1(2.:3.:10.); // 2,5,8, cout << " tt(2.+0i:10.+0i)= " << tt << endl; cout << " t1(2.:3.:10.);= " << t1 << endl; cout << " tt.re real part array " << tt.re << endl ; // the real part array of the complex array \index{re}\index{array!re} cout << " tt.im imag part array " << tt.im << endl ; // the imag part array of the complex array \index{im}\index{array!im} } { real [int] tab(10), tab1(10); // 2 array of 10 real //real [int] tab2; // bug array with no size tab = 1.03; // set all the array to 1.03 tab[1]=2.15; cout << tab[1] << " " << tab[9] << " size of tab = " << tab.n << " min: " << tab.min << " max:" << tab.max << " sum : " << tab.sum << endl; // tab.resize(12); // change the size of array tab // to 12 with preserving first value tab(10:11)=3.14; // set unset value cout <<" resize tab: " << tab << endl; real [string] tt; tt["+"]=1.5; cout< A=vP(Vh,Vh); // la matrice sans BEM. complex[int] b=vP(0,Vh); Vh u; {// for cleanning all local varaible at end of block. // computation of the matrice BEM int kdfBEM=0; // nb of DoF on border int[int] IdfB2Vh(0:Vh.ndof-1); // for numbering IdfB2Vh[i]==i { int lbord = labup; // label of the BEM border varf vbord(u1,v1) = on(lbord,u1= atan(y,-x)-2*pi);// negative value .. real[int] xb=vbord(0,Vh,tgv=1); sort(xb,IdfB2Vh); // sort of array xb and IdfB2Vh xb = xb ? 1 : 0;// put 1 if none zero kdfBEM = xb.sum +0.5; // number of DoF on border IdfB2Vh.resize(kdfBEM); // IdfB2Vh[i] -> number DoF of border } // end of the numbering computation // so IdfB2Vh[ibem] = iVh where ibem is a df of on bem , and iVh is a df in Vh space. complex cci=1i; int n=0;// // Use of higher order Quadarture formular ... varf vWn(u,w)=int1d(Th,3,qforder=7)(exp(-cci*n*atan2(y,x))*w); // Lap polar : 1/r^2 u_tt + u_rr + 1/u u_r (t = theta ) // see http://www.medphys.ucl.ac.uk/~mbanaji/MATH6502/LaplacePolar.pdf // f_n = exp( i ( n theta) ) gn(r) , a mode .. // - n^2 gn + gn'r + r^2 gn'' = 0 // find gn = r^l => l = ± n so gn = c1 r^n + c2 r^-n // if n = 0; then g0 = c1 + c2 log(r) => g0 = 1 // BC 0 a infinity , gn =1 on R // gives // gn = R^|n| r^-|n| // gn' = -R^|n| |n| gn / r // gn'' = -R^|n| |n|(-|n|-1) gn / r^2 => OK complex[int,int] ABemFull(kdfBEM,kdfBEM);// the full bem matrix in Bem numbering. ABemFull=0;// set of 0 for ( n=-nharm;n<=nharm;++n) { complex[int] wwn(kdfBEM); complex[int] wn=vWn(0,Vh); wwn=wn(IdfB2Vh); complex Gn=abs(n)*eps0/(2*pi)/R^2; ABemFull += Gn*wwn*wwn'; } matrix ABem=ABemFull(IdfB2Vh^-1,IdfB2Vh^-1); // Build the sparse BEm matrix A = A + ABem; }// for cleanning all local varaible at end of block. ABem ABemFull set(A,solver=UMFPACK); u[]=A^-1*b; Vh ur=real(u),ui=imag(u); Vh err=ur-uref; cout << " err Linty=" << err[].linfty << " / " << uref[].linfty << endl; plot(ur,uref,wait=1,cmm="ur + uref "); freefem++-3.38-1/examples++-tutorial/BEM.edp000644 000767 000024 00000005501 11406142255 020507 0ustar00hechtstaff000000 000000 // compute the solution of a Laplace operator in a Semi infini domain. // with coupling of Boundary element with periodicity BC in x . // ------------------------------------------------------------- real eps0=1; int labup=3, labdown=1; int nharm= 10; // Number of Harmonique func ug= max(0.,-(x-0.5)*(x-0.75)); // boundary condition.. macro Grad(u) [dx(u),dy(u)] // eom real Xmax=1,Ymax=0.3; int NNx=100,NNy=NNx*Ymax; mesh Th=square(NNx,NNy,[x*Xmax,y*Ymax]); fespace Vh(Th,P1,periodic=[[2,y],[4,y]]); Vh uref; // la solution de reference. { // calcule de la solution de reference in Huge Domaine. mesh Th1=square(NNx,NNx*10,[x*Xmax,10*Xmax*y]); // pour la solution de reference fespace Uh(Th1,P1,periodic=[[2,y],[4,y]]); Uh uu,vv; solve Pref(uu,vv)=int2d(Th1)(eps0*(Grad(uu)'*Grad(vv)))+on(labdown,uu=ug); uref=uu; plot(uu,wait=1,cmm=" ref sol / large Th "); } // pour nettoyer la memoire plot(uref,wait=1,cmm=" ref sol / Th"); varf vP(u,v)=int2d(Th)(eps0*(Grad(u)'*Grad(v)))+on(labdown,u=ug); varf vF(u,v)=on(labdown,u=ug); matrix A=vP(Vh,Vh); // la matrice sans BEM. complex[int] b=vF(0,Vh); Vh u; {// for cleanning all local varaible at end of block. // computation of the matrice BEM int kdfBEM=0; // nb of DoF on border int[int] IdfB2Vh(0:Vh.ndof-1); // for numbering IdfB2Vh[i]==i { int lbord = labup; // label of the BEM border varf vbord(u1,v1) = on(lbord,u1=x-10);// negative value .. real[int] xb=vbord(0,Vh,tgv=1); sort(xb,IdfB2Vh); // sort of array xb and IdfB2Vh xb = xb ? 1 : 0;// put 1 if none zero kdfBEM = xb.sum +0.5; // number of DoF on border IdfB2Vh.resize(kdfBEM); // IdfB2Vh[i] -> number DoF of border } // end of the numbering computation // so IdfB2Vh[ibem] = iVh where ibem is a df of on bem , and iVh is a df in Vh space. real perio=Xmax; complex deuxpii=2*pi*1i; int n=0;// // Use of higher order Quadarture formular ... varf vWn(u,w)=int1d(Th,labup,qforder=10)(exp(-deuxpii*(n)*x)*w); //complex[int] wn=vWn(0,Vh);// with Vh numbering.. complex[int,int] ABemFull(kdfBEM,kdfBEM);// the full bem matrix in Bem numbering. ABemFull=0;// set of 0 for ( n=-nharm;n<=nharm;++n) { complex[int] wwn(kdfBEM); complex[int] wn=vWn(0,Vh); wwn=wn(IdfB2Vh);// wwn(i) = wn(IdfB2Vh(i)) i=0 a wwn.n -1 complex Gs=+2.*pi*abs(n/perio/perio)*eps0; ABemFull += Gs*wwn*wwn'; } matrix ABem=ABemFull(IdfB2Vh^-1,IdfB2Vh^-1); // Build the sparse BEm matrix // ABem(IdfB2Vh(ib),IdfB2Vh(jb)) = ABemFull(ib,jb) A = A + ABem; }// for cleanning all local varaible at end of block. ABem ABemFull set(A,solver=UMFPACK); u[]=A^-1*b; Vh ur=real(u),ui=imag(u); Vh err=ur-uref; cout << " err Linty=" << err[].linfty << " / " << uref[].linfty << endl; plot(ur,uref,wait=1,cmm="ur + uref "); freefem++-3.38-1/examples++-tutorial/calculus.edp000644 000767 000024 00000002754 12417770437 021742 0ustar00hechtstaff000000 000000 real x=3.14,y; int i,j; complex c; cout << " x = " << x << "\n"; x = 1;y=2; x=y; i=0;j=1; cout << 1 + 3 << " " << 1/3 << "\n"; cout << 10 ^10 << "\n"; cout << 10 ^-10 << "\n"; cout << -10^-2+5 << "== 4.99 \n"; cout << 10^-2+5 << "== 5.01 \n"; cout << "------------------ complex ---- \n" ; cout << 10-10i << " \n"; int prec=cout.precision(12); cout.scientific << " scientific : \n"; cout << " -1^(1/3) = " << (-1+0i)^(1./3.) << " (precision=12)\n"; cout.precision(prec); cout.fixed; cout.showpos << " fixed and showpos :\n"; cout << " -1^(1/3) = " << (-1+0i)^(1./3.) << " (precision="<8000) lerr=0.05; if(re>10000) lerr=0.01; for(int step=0;step<2;step++) { Th=adaptmesh(Th,[u1,u2],p,err=lerr,nbvx=100000,abserror=0, cutoff=0.01); //plot(Th,wait=0); [u1,u2,p]=[u1,u2,p]; [up1,up2,pp]=[up1,up2,pp]; for (i=0;i<=20;i++) { nu =1./re; up1[]=u1[]; real[int] b = vNS(0,XXMh); matrix Ans=vDNS(XXMh,XXMh); set(Ans,solver=UMFPACK); real[int] w = Ans^-1*b; u1[] -= w; cout << " iter = "<< i << " " << w.l2 << " rey = " << re << endl; if(w.l2<1e-6) break; // uu1=u1;uu2=u2; //plot(coef=0.2,cmm=" [u1,u2] et p ",p,[uu1,uu2]); } ; } uu1=u1;uu2=u2; streamlines; plot(coef=0.2,cmm="rey="+re+" [u1,u2] et p ",psi,[uu1,uu2],wait=0,nbiso=20,ps="cavity-"+re+".ps"); } freefem++-3.38-1/examples++-tutorial/convect-apt.edp000755 000767 000024 00000005175 11540140006 022330 0ustar00hechtstaff000000 000000 // This a the rotating hill problem with one turn. // First 1/2 turn is a convection equation and second 1/2 a convection diffusion int kt=6; int kloop=5; int nbadap=5; bool inq=0; real tol=0.05; real tol2=1e-4; border a(t=0, 2*pi) { x = cos(t); y = sin(t); }; // the unit circle mesh th = buildmesh(a(70)); // triangulates the disk fespace Vh(th,P1); Vh u1 = y, u2 = -x; // rotation velocity Vh m11=0,m22=0,m12=0; // to store the metric field Vh vT; // to save the initial in big loop int i; Vh vv,vo,vp; // working Finite element function func rhill=sqrt((x-0.3)^2 +(y-0.3)^2); func hill = 1-tanh(30*(rhill-0.2)); //func real hill(real r2) { return 1-tanh(100*(r2-0.04));} Vh v = hill;//((x-0.3)^2 +(y-0.3)^2); // initial condition plot(v); vp=0; for (int i=0;i1.18); mesh Th=square(10,10); fespace Xh(Th,P2),Mh(Th,P1); Xh u1,u2,v1,v2; Mh p,q,ppp; varf bx(u1,q) = int2d(Th)( (dx(u1)*q)); varf by(u1,q) = int2d(Th)( (dy(u1)*q)); varf a(u1,u2)= int2d(Th)( dx(u1)*dx(u2) + dy(u1)*dy(u2) ) + on(1,2,4,u1=0) + on(3,u1=1) ; Xh bc1; bc1[] = a(0,Xh); Xh b; matrix A= a(Xh,Xh,solver=CG); matrix Bx= bx(Xh,Mh); matrix By= by(Xh,Mh); Xh bcx=1,bcy=0; Mh f=x; Xh g=sin(x); b[] = Bx'*f[]; b[] += bc1[] .*bcx[]; u1[] = A^-1*b[]; freefem++-3.38-1/examples++-tutorial/exception.edp000644 000767 000024 00000001570 11406142255 022104 0ustar00hechtstaff000000 000000 real a; try { a=1./0.; } catch (...) { cout << " get a ExecError " << endl; a =0; } verbosity=10; int nn=5 ; mesh Th=square(nn,nn); verbosity=5; fespace Vh(Th,P1); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function real cpu=clock(); problem laplace(uh,vh,solver=Cholesky,tolpivot=1e-6) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int2d(Th)( -f*vh ) // linear form ; try { cout << " Try Cholesky \n"; laplace; // solve the problem plot(uh); // to see the result cout << "-- lap Cholesky " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; } catch(...) { cout << " Catch cholesky PB " << endl; } freefem++-3.38-1/examples++-tutorial/FE.edp000644 000767 000024 00000002417 12506334423 020403 0ustar00hechtstaff000000 000000 // test all FEspace verbosity=10; mesh Th=square(5,5); verbosity = 10; cout << " P0 " << endl; fespace Ph(Th,P0); cout << " P1 " << endl; fespace Vh(Th,P1); cout << " P2 " << endl; fespace Wh(Th,P2); cout << " nb of degre of freedom : " << Wh.ndof << endl; cout << " nb of degre of freedom / ELEMENT : " << Wh.ndofK << endl; //* don't work to day in progresse { int k= 2; int kdf= Wh.ndofK ; cout << " df of element " << k << ":" ; for (int i=0;i v=x,diff; Vh w=x+1i*y; cout << "w[][10] " << " " << w[][10] << endl; w=y+1i*y; cout << "w[][10] " << w[][10] << " " << (w[][10])' << endl; Wh [wx,wy]=[x+1i*y,y]; [wx,wy]=[x+1i*y,y]; func ue= (x*x+2.*y*y+(x*y*y+3.*x*x*y)*1i); func uexx = 2.+6.i*y; func ueyy = 4.+2.i*x; func f= (-uexx-(2i+1)*ueyy); func g= ue; Vh uh,vh; problem laplace(uh,vh,solver=LU,tgv=1e5) = // definion of the problem int2d(Th,optimize=1)( dx(uh)*dx(vh) + (2i+1)*dy(uh)*dy(vh) ) // bilinear form - int2d(Th,optimize=1)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form //verbosity=102; laplace; // solve the problem plot(uh); // to see the result real err = int2d(Th)(norm(uh-ue)); cout << " -- err = " << err << endl; assert(err<0.01); // cout << " -- uh = " << uh[] << endl; cout << " uh(0.5,0.5) = " << uh(0.5,0.5) << " ~ " << ue(0.5,0.5) << endl; Vh vr=real(uh(x,y)); Vh vi=imag(uh(x,y)); vr = real(uh); vi = imag(uh); Vh ver = real(ue); Vh vei = imag(ue); // for (int i=0;i=1.24); // for big bug is non symetric matrix see HISTORY, and sign in int1d include "beam.edp" // Stokes on square b,e,f,g driven cavite on left side g border e(t=0,10) { x=t; y=-10; label= 1; }; // bottom border f(t=0,10) { x=10; y=-10+t ; label= 1; }; // right border g(t=0,10) { x=0; y=-t ;label= 2;}; // left border h(t=0,10) { x=t; y=vv(t,0)*( t>=0.001 )*(t <= 9.999); label=3;}; // top of cavity deforme mesh sh = buildmesh(h(-20)+f(10)+e(10)+g(10)); plot(sh,wait=1); fespace Xh(sh,P2),Mh(sh,P1); fespace V1h(sh,P2); Xh u1,u2,v1,v2; Mh p,q,ppp; varf bx(u1,q) = int2d(sh)( -(dx(u1)*q)); varf by(u1,q) = int2d(sh)( -(dy(u1)*q)); varf Lap(u1,u2)= int2d(sh)( dx(u1)*dx(u2) + dy(u1)*dy(u2) ) + on(2,u1=1) + on(1,3,u1=0) ; varf Mass(p,q)=int2d(sh)(p*q); Xh bc1; Xh brhs; matrix A= Lap(Xh,Xh,solver=CG); matrix M= Mass(Mh,Mh,solver=CG); matrix Bx= bx(Xh,Mh); matrix By= by(Xh,Mh); Xh bcx,bcy; func real[int] divup(real[int] & pp) { // int verb=verbosity; verbosity=1; brhs[] = Bx'*pp; brhs[] += bc1[] .*bcx[]; u1[] = A^-1*brhs[]; brhs[] = By'*pp; brhs[] += bc1[] .*bcy[]; u2[] = A^-1*brhs[]; ppp[] = M^-1*pp; ppp[] = 1.e-6*ppp[]; ppp[] = Bx*u1[]; ppp[] += By*u2[]; verbosity=verb; return ppp[] ; }; p=0;q=0;u1=0;v1=0; int i; for( i=0;i<2;i++) { bcx=0; bcy= (-y)*(10.+y)/25.; cout << " loop " << i << endl; bc1[] = Lap(0,Xh); q=0; verbosity=50; LinearCG(divup,p[],eps=1.e-3,nbiter=50); divup(p[]); verbosity=1; plot([u1,u2],p,wait=1,value=true,coef=0.1,cmm="[u1,u2],p"); real coef=0.2; V1h sigma11,sigma22,sigma12; Vh [uu1,vv1]; [uu1,vv1]=[uu,vv]; sigma11([x+uu,y+vv]) = (2*dx(u1)-p); sigma22([x+uu,y+vv]) = (2*dy(u2)-p); sigma12([x+uu,y+vv]) = (dx(u2)+dy(u1)); solve bbst([uu,vv],[w,s],init=i) = int2d(th)( lambda*div(w,s)*div(uu,vv) +2.*mu*( epsilon(w,s)'*epsilon(uu,vv) ) ) + int2d(th) (-gravity*s) + int1d(th,bottombeam)( coef*(sigma11*N.x*w + sigma22*N.y*s + sigma12*(N.y*w+N.x*s) ) ) + on(1,uu=0,vv=0) ; cout << " max deplacement " << uu[].linfty << endl; plot([uu,vv],wait=1); real err = sqrt(int2d(th)( (uu-uu1)^2 + (vv-vv1)^2 )); cout << " ----- Iteration = " << i << " Erreur L2 = " << err << "----------\n"; th1 = movemesh(th, [x+uu, y+vv]); plot(th1,wait=1); sh = buildmesh(h(-20)+f(10)+e(10)+g(10)); plot(sh); p=p;q=q;u1=u1;u2=u2;brhs=brhs;ppp=ppp; A= Lap(Xh,Xh,solver=CG); M= Mass(Mh,Mh,solver=CG); Bx= bx(Xh,Mh); By= by(Xh,Mh); bc1=0; // for resize bc1[] = Lap(0,Xh); } cout << " max deplacement " << uu[].linfty << endl; freefem++-3.38-1/examples++-tutorial/fluidStructAdapt.edp000644 000767 000024 00000010507 12104206102 023354 0ustar00hechtstaff000000 000000 assert(version>=1.24); // for big bug is non symetric matrix see HISTORY, and sign in int1d int method1=0; int iwait=0; include "beam.edp" // Stokes on square b,e,f,g driven cavite on left side g border e(t=0,10) { x=t; y=-10; label= 1; }; // bottom border f(t=0,10) { x=10; y=-10+t ; label= 1; }; // right border g(t=0,10) { x=0; y=-t ;label= 2;}; // left border h(t=0,10) { x=t; y=vv(t,0)*( t>=0.001 )*(t <= 9.999); label=3;}; // top of cavity deforme real err=10; mesh sh = buildmesh(h(-20)+f(10)+e(10)+g(10)); plot(sh,wait=iwait); fespace Xh(sh,P2),Mh(sh,P1); fespace V1h(sh,P2); Xh u1,u2,v1,v2; Mh p,q,ppp; real veps=1e-4; varf bx(u1,q) = int2d(sh)( -(dx(u1)*q)); varf by(u1,q) = int2d(sh)( -(dy(u1)*q)); varf Lap(u1,u2)= int2d(sh)( dx(u1)*dx(u2) + dy(u1)*dy(u2) ) + on(2,u1=1) + on(1,3,u1=0) ; varf Mass(p,q)=int2d(sh)(p*q); Xh bc1; Xh brhs; matrix A= Lap(Xh,Xh,solver=CG); matrix M= Mass(Mh,Mh,solver=CG); matrix Bx= bx(Xh,Mh); matrix By= by(Xh,Mh); func cly =(-y)*(10.+y)/25.; Xh bcx=0,bcy=cly; func real[int] divup(real[int] & pp) { // int verb=verbosity; verbosity=1; brhs[] = Bx'*pp; brhs[] += bc1[] .*bcx[]; u1[] = A^-1*brhs[]; brhs[] = By'*pp; brhs[] += bc1[] .*bcy[]; u2[] = A^-1*brhs[]; ppp[] = M^-1*pp; ppp[] = 1.e-6*ppp[]; ppp[] = Bx*u1[]; ppp[] += By*u2[]; verbosity=verb; return ppp[] ; }; p=0;q=0;u1=0;v1=0; int i; th1 = movemesh(th, [x+uu, y+vv]); for( i=0;i<6;i++) { bc1=0; brhs=0; bc1[] = Lap(0,Xh); q=0; verbosity=50; LinearCG(divup,p[],veps=veps,nbiter=100); divup(p[]); verbosity=1; plot([u1,u2],p,wait=iwait,value=true,coef=0.1); real coef=0.2; Vh [uu1,vv1]; [uu1,vv1]=[uu,vv]; if(method1==1) { V1h sigma11,sigma22,sigma12; sigma11([x+uu,y+vv]) = (2*dx(u1)-p); sigma22([x+uu,y+vv]) = (2*dy(u2)-p); sigma12([x+uu,y+vv]) = (dx(u2)+dy(u1)); solve bbst([uu,vv],[w,s],init=i) = int2d(th)( lambda*div(w,s)*div(uu,vv) +2.*mu*( epsilon(w,s)'*epsilon(uu,vv) ) ) + int2d(th) (-gravity*s) + int1d(th,bottombeam)( coef*(sigma11*N.x*w + sigma22*N.y*s + sigma12*(N.y*w+N.x*s) ) ) + on(1,uu=0,vv=0) ; } else { // this piece of code is crucial to mixe adaptation and fluid structure fespace Vh11(th1,[P1,P1]); varf vFS([yyyy],[w,s])= int1d(th1,bottombeam)( coef*((2*dx(u1)-p)*N.x*w + (2*dy(u2)-p)*N.y*s + (dx(u1)+dy(u2))*(N.y*w+N.x*s)) ); Vh11 [FS,FS1];[FS,FS1]=[0,0]; FS[]= vFS(0,Vh11); cout << FS[].min << " " << FS[].max << endl; plot([FS,FS1],wait=iwait,value=1); solve bbst2([uu,vv],[w,s],init=i) = int2d(th)( lambda*div(w,s)*div(uu,vv) +2.*mu*( epsilon(w,s)'*epsilon(uu,vv) ) ) + int2d(th) (-gravity*s) + FS[] // + int1d(th,bottombeam)( coef*(sigma11*N.x*w + sigma22*N.y*s + sigma12*(N.y*w+N.x*s) ) ) + on(1,uu=0,vv=0) ; } //plot([uu,vv],wait=1); err = sqrt(int2d(th)( (uu-uu1)^2 + (vv-vv1)^2 )); cout << " ----- Iteration = " << i << " Erreur L2 = " << err << "----------\n"; cout << " max deplacement " << uu[].linfty << endl; bool iadapt=err>0.05; if(iadapt) th = adaptmesh(th,[uu,vv],err=1.e-2); [uu,vv]=[uu,vv]; [w,s]=[0,0]; th1 = movemesh(th, [x+uu, y+vv]); //plot(th1,wait=1); if(method1==1) sh = buildmesh(h(-20)+f(10)+e(10)+g(10)); else { fespace VVh(sh,P1);VVh uh,vh; solve lapllll(uh,vh,solver=CG,tgv=1e5) = // definion of the problem // compute a deformation field for moving the fluid mesh // x -> vv(x,0) is the new deformation y // x -> y is the position of the mesh on border 3 int2d(sh)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + on(1,2,uh=0)+ on(3,uh=(vv(x,0)-y)*( x>=0.001 )*(x <= 9.999)) ; // boundary condition form sh = movemesh(sh,[x,y+uh]); if(iadapt) { sh = adaptmesh(sh,[u1,u2],p,err=2.e-2); lapllll; sh = movemesh(sh,[x,y+uh]); } plot(th1,sh,wait=iwait); p=p; u1=u1; u2=u2; A= Lap(Xh,Xh,solver=CG); M= Mass(Mh,Mh,solver=CG); Bx= bx(Xh,Mh); By= by(Xh,Mh); bcx=0; bcy=cly; } p=p;q=q;u1=u1;u2=u2;brhs=brhs;ppp=ppp; A= Lap(Xh,Xh,solver=CG); M= Mass(Mh,Mh,solver=CG); Bx= bx(Xh,Mh); By= by(Xh,Mh); bc1=0; // for resize bc1[] = Lap(0,Xh); } cout << " max deplacement " << uu[].linfty << endl; freefem++-3.38-1/examples++-tutorial/freeboundary-weak.edp000755 000767 000024 00000004702 12167254041 023525 0ustar00hechtstaff000000 000000 // // calcul d'une zone saturation en eau (nappe phreatique) // verbosity=1; real weak=1; string com= " avec du/dn "; if(weak) com = " avec du/du = residu "; real L=10; // longueur du domaine real Q=0.02; // flux entrant real K=0.5; //permeabilite real erradap=0.001; real coef=1; real h=2.1; // hauteur du bord gauche real h1=0.35; // hauteur du bord droite // maillage d'un tapeze border a(t=0,L){x=t;y=0;}; // bas border b(t=0,h1){x=L;y=t;}; // droite border f(t=L,0){x=t;y=t*(h1-h)/L+h;}; // free surface border d(t=h,0){x=0;y=t;}; // gauche int n=10; mesh Th=buildmesh (a(L*n)+b(h1*n)+f(sqrt(L^2+(h-h1)^2)*n)+d(h*n)); plot(Th,ps="dTh.eps"); fespace Vh(Th,P1); int j=0,ii=0; Vh p,v,pp,vv; varf vPp(p,pp) = int2d(Th)( dx(p)*dx(pp)+dy(p)*dy(pp)); varf vonfree(p,pp) =on(f,p=1); Vh onfree,wdpdn; onfree[]=vonfree(0,Vh); cout << "pb ?" << endl; onfree[]/=onfree[].max; // sauce cout << "pb non " << endl; matrix A= vPp(Vh,Vh,solver=CG); problem Pp(p,pp,solver=CG) = int2d(Th)( dx(p)*dx(pp)+dy(p)*dy(pp)) + on(b,f,p=y) ; // -- imprecise (fort) problem Pv(v,vv,solver=CG) = int2d(Th)( dx(v)*dx(vv)+dy(v)*dy(vv)) + on (a, v=0) + int1d(Th,f)(vv*((Q/K)*N.y- (dx(p)*N.x+dy(p)*N.y))); // -- precise (faible) problem Pw(v,vv,solver=CG) = int2d(Th)( dx(v)*dx(vv)+dy(v)*dy(vv)) + on (a, v=0) + int1d(Th,f)(vv*((Q/K)*N.y)) + wdpdn[]; real errv=1; verbosity=1; while(errv>1e-6) { j++; Pp; if (weak) { wdpdn[] = A*p[]; wdpdn[] = wdpdn[].*onfree[]; wdpdn[] = -wdpdn[]; Pw;} else Pv; errv=int1d(Th,f)(v*v); plot(Th,p,v ,cmm=com+" iter = "+j+ " errv =" +errv,wait=0); // if (j%10==0) // Th=adaptmesh(Th,p,err=erradap ) ; real coef=1; real mintcc = checkmovemesh(Th,[x,y])/5.; real mint = checkmovemesh(Th,[x,y-v*coef]); if (mintmintcc) break; cout << " min |T] " << mint << endl; coef /= 1.5; } Th=movemesh(Th,[x,y-coef*v]); // calcul de la deformation A= vPp(Vh,Vh,solver=CG); onfree[]=vonfree(0,Vh);onfree[]/=onfree[].max; // sauce cout << "\n\n"<1e-6) { j++; Pu; Pv; plot(Th,u,v ,wait=0); errv=int1d(Th,f)(v*v); // if (j%10==0) // Th=adaptmesh(Th,u,err=erradap ) ; real coef=1; real mintcc = checkmovemesh(Th,[x,y])/5.; real mint = checkmovemesh(Th,[x,y-v*coef]); if (mintmintcc) break; cout << " min |T] " << mint << endl; coef /= 1.5; } Th=movemesh(Th,[x,y-coef*v]); // calcul de la deformation cout << "\n\n"<= 3.3 verbosity=500; real[int] G=[7,8,9]; func mesh carre(int n) { mesh th=square(n,n); return th;} func real[int] aaa(int n) { real[int] a(n); a=0; a[2]=n; return a;} func real[int] bb(real[int] &a) { cout << " sum " <> xx; cout << " xx = " << xx << " good ? " << file.good() << endl; assert(xx==0.1); file.seekg(0); cout << " where " << file.tellg() << " " << file.good() << endl; file >> g[] ; } fespace Vh2(th2,P1); Vh2 u,v; plot(g); solve pb(u,v) = int2d(th2)( u*v -dx(u)*dx(v)-dy(u)*dy(v) ) + int2d(th2)(-g*v) + int1d(th2,5)( -g*v) + on(1,u=0) ; plot (th2,u); cout << " (u[],u[]) = " << (u[]'*u[]) << endl; { ofstream file("u.txt"); file << u[] << endl; } freefem++-3.38-1/examples++-tutorial/LapDG2.edp000644 000767 000024 00000003563 12321210236 021113 0ustar00hechtstaff000000 000000 // Discontinous Galerlin Method // based on paper from // Riviere, Beatrice; Wheeler, Mary F.; Girault, Vivette // title: // A priori error estimates for finite element // methods based on discontinuous approximation spaces // for elliptic problems. // SIAM J. Numer. Anal. 39 (2001), no. 3, 902--931 (electronic). // --------------------------------- // Formulation given by Vivette Girault // ------ // Author: F. Hecht , december 2003 // ------------------------------- // nonsymetric bilinear form // ------------------------ // solve $ -\Delta u = f$ on $\Omega$ and $u= g$ on $\Gamma$ macro dn(u) (N.x*dx(u)+N.y*dy(u) ) // def the normal derivative mesh Th = square(10,10); // unite square fespace Vh(Th,P2dc); // Discontinous P2 finite element fespace Xh(Th,P2); // if param = 0 => Vh must be P2 otherwise we need some penalisation real pena=0; // a paramater to add penalisation varf Ans(u,v)= int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v) ) + intalledges(Th)(// loop on all edge of all triangle // the edge are see nTonEdge times so we / nTonEdge // remark: nTonEdge =1 on border edge and =2 on internal // we are in a triange th normal is the exterior normal // def: jump = external - internal value; on border exter value =0 // mean = (external + internal value)/2, on border just internal value ( jump(v)*mean(dn(u)) - jump(u)*mean(dn(v)) + pena*jump(u)*jump(v) ) / nTonEdge ) + int1d(Th,3)(pena*0.*v) ; func f=1; func g=0; Vh u,v; Xh uu,vv; problem A(u,v,solver=UMFPACK) = Ans - int2d(Th)(f*v) - int1d(Th)(g*dn(v) + pena*g*v) ; problem A1(uu,vv,solver=CG) = int2d(Th)(dx(uu)*dx(vv)+dy(uu)*dy(vv)) - int2d(Th)(f*vv) + on(1,2,3,4,uu=g); A; // solve DG A1; // solve continuous plot(u,uu,cmm="Discontinue Galerkin",wait=1,value=1); plot(u,cmm="Discontinue Galerkin",wait=1,value=1,fill=1); freefem++-3.38-1/examples++-tutorial/Laplace-lagrange-mult.edp000644 000767 000024 00000002100 11406142255 024172 0ustar00hechtstaff000000 000000 /* solving laplace operator with neumam boundary condition with 1D lagrange multiplier The variationnal form is find (u,l) such that $\forall (v,m) a(u,v) + b(u,m) + b(v,l) = L(v) $ where $b(u,m) = int u*m dx$ */ mesh Th=square(10,10); fespace Vh(Th,P1); // P1 FE space int n = Vh.ndof; int n1 = n+1; Vh uh,vh; // unkown and test function. func f=1+x-y; // right hand side function varf va(uh,vh) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form ; varf vL(uh,vh)= int2d(Th)( f*vh ) ; varf vb(uh,vh)= int2d(Th)(1.*vh); matrix A=va(Vh,Vh); real[int] b(n); b = vL(0,Vh); real[int] B = vb(0,Vh); // the block matrix matrix AA = [ [ A , B ] , [ B', 0 ] ] ; real[int] bb(n+1),x(n+1),b1(1),l(1); b1=0; // build the block rhs bb = [ b, b1]; set(AA,solver=UMFPACK); x = AA^-1*bb; // solve the linear systeme [uh[],l] = x; // set the value cout << " l = " << l(0) << " , b(u,1) =" << B'*uh[] << endl; plot(uh,wait=1); freefem++-3.38-1/examples++-tutorial/Laplace-RHS-Dirac.edp000644 000767 000024 00000002452 12167254041 023123 0ustar00hechtstaff000000 000000 // Laplace operator with RHS sum of Dirac // f = sum cdelta_i \delta_i real[int] xdelta = [0.25,0.6];// coord x de delta_i real[int] ydelta = [0.25,0.6];// coord x de delta_j real[int] cdelta=[1.,2.];// coef delta_i mesh Th=square(10,10); verbosity=0; // Reference value for FFCS regression tests real ref; for(int iter=0;iter < 13;iter++) { fespace Vh(Th,P1); // P1 FE space matrix D = interpolate(Vh,xdelta,ydelta); // the interpolation matrix // at point (xdelta[j],ydelta[i] ) \hfilll // so $D_ij = w^i((xdelta[j],ydelta[i]) $ where $w^i$ are the basic function of $V_h$. Vh uh,vh; // unkown and test function. func g=0; // boundary condition function Vh b; b[]= D*cdelta; b[]= -b[]; problem laplace(uh,vh) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + b[] // linear form of the rhs (so an array) + on(1,2,3,4,uh=0) ; // boundary condition form laplace; // solve the problem plot(uh); // to see the result cout < $@ clean-local: -rm *.fg *.eps *~ *.ps *.mesh *.mesh.gmsh f.txt u.txt A.matrix mm.matrix mm.b sphere-a.faces sphere-a.points sphere.faces sphere.points toto.Th toto.am_fmt toto.dbg.gmsh toto.Th.gmsh toto.dbg toto.msh plot.gp ListOfAllocPtr-8.bin ffglut*.ppm th.msh Th1.msh Th12.msh th.msh emptymesh-2.msh thermic.dat # To create a new set of reference values in "ref.edp" Ref: makeref.edp freefem++.pref ../src/nw/FreeFem++-nw makeref.edp install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/idp $(INSTALL) -m 555 $(LIST_IDP) $(DESTDIR)$(ff_prefix_dir)/idp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref # FreeFem API tests # ----------------- EXTRA_PROGRAMS=Laplace Laplace_SOURCES=Laplace.cpp # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp FORCE:freefem++-3.38-1/examples++-tutorial/Makefile.in000644 000767 000024 00000142275 12543260337 021476 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # $Id$ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ EXTRA_PROGRAMS = Laplace$(EXEEXT) subdir = examples++-tutorial ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_Laplace_OBJECTS = Laplace.$(OBJEXT) Laplace_OBJECTS = $(am_Laplace_OBJECTS) Laplace_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(Laplace_SOURCES) DIST_SOURCES = $(Laplace_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = adapt.edp adaptindicatorP1.edp adaptindicatorP2.edp algo.edp array.edp a_tutorial.edp beam.edp calculus.edp cavity.edp convect2.edp convect-apt.edp convect.edp dumptable.edp ex-vf.edp FE.edp fluidStructAdapt.edp fluidStruct.edp freeboundary.edp freeboundary-weak.edp LapDG2.edp Laplace.edp LaplaceP1bis.edp LaplaceP1.edp LaplaceP1P2h.edp LaplaceRT.edp mesh.edp movemesh.edp nolinear-elas.edp NSUzawaCahouetChabart.edp onde.edp periodic4.edp Periodic.edp plot.edp readmesh.edp region.edp saverestore.edp schwarz-gc.edp schwarz-no-overlap.edp schwarz-overlap.edp sparse-matrix.edp sparse-cmatrix.edp StokesUzawa.edp tablefunction.edp intlevelset.edp mesh-internal.edp LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw LIST_IDP = *.idp EXTRA_DIST = *.edp *.idp aile.msh xyf all.edp regtests.edp regtests.m4 ref.edp Laplace_SOURCES = Laplace.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-tutorial/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-tutorial/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Laplace$(EXEEXT): $(Laplace_OBJECTS) $(Laplace_DEPENDENCIES) $(EXTRA_Laplace_DEPENDENCIES) @rm -f Laplace$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(Laplace_OBJECTS) $(Laplace_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Laplace.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? adapt.edp.log: adapt.edp @p='adapt.edp'; \ b='adapt.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) adaptindicatorP1.edp.log: adaptindicatorP1.edp @p='adaptindicatorP1.edp'; \ b='adaptindicatorP1.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) adaptindicatorP2.edp.log: adaptindicatorP2.edp @p='adaptindicatorP2.edp'; \ b='adaptindicatorP2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) algo.edp.log: algo.edp @p='algo.edp'; \ b='algo.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) array.edp.log: array.edp @p='array.edp'; \ b='array.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) a_tutorial.edp.log: a_tutorial.edp @p='a_tutorial.edp'; \ b='a_tutorial.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) beam.edp.log: beam.edp @p='beam.edp'; \ b='beam.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) calculus.edp.log: calculus.edp @p='calculus.edp'; \ b='calculus.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cavity.edp.log: cavity.edp @p='cavity.edp'; \ b='cavity.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convect2.edp.log: convect2.edp @p='convect2.edp'; \ b='convect2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convect-apt.edp.log: convect-apt.edp @p='convect-apt.edp'; \ b='convect-apt.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convect.edp.log: convect.edp @p='convect.edp'; \ b='convect.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) dumptable.edp.log: dumptable.edp @p='dumptable.edp'; \ b='dumptable.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ex-vf.edp.log: ex-vf.edp @p='ex-vf.edp'; \ b='ex-vf.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FE.edp.log: FE.edp @p='FE.edp'; \ b='FE.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fluidStructAdapt.edp.log: fluidStructAdapt.edp @p='fluidStructAdapt.edp'; \ b='fluidStructAdapt.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fluidStruct.edp.log: fluidStruct.edp @p='fluidStruct.edp'; \ b='fluidStruct.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) freeboundary.edp.log: freeboundary.edp @p='freeboundary.edp'; \ b='freeboundary.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) freeboundary-weak.edp.log: freeboundary-weak.edp @p='freeboundary-weak.edp'; \ b='freeboundary-weak.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapDG2.edp.log: LapDG2.edp @p='LapDG2.edp'; \ b='LapDG2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Laplace.edp.log: Laplace.edp @p='Laplace.edp'; \ b='Laplace.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceP1bis.edp.log: LaplaceP1bis.edp @p='LaplaceP1bis.edp'; \ b='LaplaceP1bis.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceP1.edp.log: LaplaceP1.edp @p='LaplaceP1.edp'; \ b='LaplaceP1.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceP1P2h.edp.log: LaplaceP1P2h.edp @p='LaplaceP1P2h.edp'; \ b='LaplaceP1P2h.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceRT.edp.log: LaplaceRT.edp @p='LaplaceRT.edp'; \ b='LaplaceRT.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mesh.edp.log: mesh.edp @p='mesh.edp'; \ b='mesh.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) movemesh.edp.log: movemesh.edp @p='movemesh.edp'; \ b='movemesh.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) nolinear-elas.edp.log: nolinear-elas.edp @p='nolinear-elas.edp'; \ b='nolinear-elas.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSUzawaCahouetChabart.edp.log: NSUzawaCahouetChabart.edp @p='NSUzawaCahouetChabart.edp'; \ b='NSUzawaCahouetChabart.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) onde.edp.log: onde.edp @p='onde.edp'; \ b='onde.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) periodic4.edp.log: periodic4.edp @p='periodic4.edp'; \ b='periodic4.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Periodic.edp.log: Periodic.edp @p='Periodic.edp'; \ b='Periodic.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) plot.edp.log: plot.edp @p='plot.edp'; \ b='plot.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) readmesh.edp.log: readmesh.edp @p='readmesh.edp'; \ b='readmesh.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) region.edp.log: region.edp @p='region.edp'; \ b='region.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) saverestore.edp.log: saverestore.edp @p='saverestore.edp'; \ b='saverestore.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) schwarz-gc.edp.log: schwarz-gc.edp @p='schwarz-gc.edp'; \ b='schwarz-gc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) schwarz-no-overlap.edp.log: schwarz-no-overlap.edp @p='schwarz-no-overlap.edp'; \ b='schwarz-no-overlap.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) schwarz-overlap.edp.log: schwarz-overlap.edp @p='schwarz-overlap.edp'; \ b='schwarz-overlap.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sparse-matrix.edp.log: sparse-matrix.edp @p='sparse-matrix.edp'; \ b='sparse-matrix.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sparse-cmatrix.edp.log: sparse-cmatrix.edp @p='sparse-cmatrix.edp'; \ b='sparse-cmatrix.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) StokesUzawa.edp.log: StokesUzawa.edp @p='StokesUzawa.edp'; \ b='StokesUzawa.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tablefunction.edp.log: tablefunction.edp @p='tablefunction.edp'; \ b='tablefunction.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) intlevelset.edp.log: intlevelset.edp @p='intlevelset.edp'; \ b='intlevelset.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mesh-internal.edp.log: mesh-internal.edp @p='mesh-internal.edp'; \ b='mesh-internal.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \ check-am clean clean-generic clean-local cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am recheck tags tags-am uninstall uninstall-am .PRECIOUS: Makefile all-local: all.edp regtests.edp freefem++.pref all.edp: (echo "NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ clean-local: -rm *.fg *.eps *~ *.ps *.mesh *.mesh.gmsh f.txt u.txt A.matrix mm.matrix mm.b sphere-a.faces sphere-a.points sphere.faces sphere.points toto.Th toto.am_fmt toto.dbg.gmsh toto.Th.gmsh toto.dbg toto.msh plot.gp ListOfAllocPtr-8.bin ffglut*.ppm th.msh Th1.msh Th12.msh th.msh emptymesh-2.msh thermic.dat # To create a new set of reference values in "ref.edp" Ref: makeref.edp freefem++.pref ../src/nw/FreeFem++-nw makeref.edp install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/idp $(INSTALL) -m 555 $(LIST_IDP) $(DESTDIR)$(ff_prefix_dir)/idp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp freefem++.pref: echo loadpath = \"../examples++-load/\" >freefem++.pref echo loadpath += \"./\" >>freefem++.pref # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp FORCE: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-tutorial/mat_interpol.edp000644 000767 000024 00000003524 11625711166 022612 0ustar00hechtstaff000000 000000 mesh Th=square(4,4); mesh Th4=square(2,2,[x*0.5,y*0.5]); plot(Th,Th4,ps="ThTh4.eps",wait=1); fespace Vh(Th,P1); fespace Vh4(Th4,P1); fespace Wh(Th,P0); fespace Wh4(Th4,P0); // remark in previous version (before v1.44) // the name of interpolate function is interplotematrix matrix IV= interpolate(Vh,Vh4); // here the function is // exended by continuity cout << " IV Vh<-Vh4 " << IV << endl; Vh v; Vh4 v4=x*y; v=v4; real[int] vv= IV*v4[]; // here v[] == vv => real[int] diff= vv - v[]; cout << " || v - vv || = " << diff.linfty << endl; assert( diff.linfty<= 1e-6); // matrix IV0= interpolate(Vh,Vh4,inside=0);// here the function is // exended by zero cout << " IV Vh<-Vh4 (inside=1) " << IV0 << endl; matrix IVt0= interpolate(Vh,Vh4,inside=1,t=1); cout << " IV Vh<-Vh4^t (inside=1) " << IVt0 << endl; matrix IV4t0= interpolate(Vh4,Vh); cout << " IV Vh4<-Vh^t " << IV4t0 << endl; matrix IW4= interpolate(Wh4,Wh); cout << " IV Wh4<-Wh " << IW4 << endl; matrix IW4V= interpolate(Wh4,Vh); cout << " IV Wh4<-Vh " << IW4 << endl; fespace V4h(Th4,[P1,P1,P1,P1]); fespace V3h(Th,[P1,P1,P1]); int[int] u2vc=[1,3,-1];// -1 => put zero on the componante ; matrix IV34= interpolate(V3h,V4h,inside=0,U2Vc=u2vc);// here the function is V4h [a1,a2,a3,a4]=[1,2,3,4]; V3h [b1,b2,b3]=[10,20,30]; b1[]=IV34*a1[]; cout << "b1 = " << b1(.25,.25) << " == " << 2 << endl; cout << "b2 = " << b2(.25,.25) << " == " << 4 <= 2.24); func abc= a(6) + b(4) + c(4) ; func def = d(4) + e(4) + f(6); plot(abc + def,wait=1); mesh rh = buildmesh (abc + def ); plot(rh,ps="lshape.eps"); } // ------------------------------------------------------------ { // readmesh mesh th("aile.msh"); plot(th); } // ------------------------------------------------------------ { // movemesh real Pi=atan(1)*4; verbosity=4; border a(t=0,1){x=t;y=0;label=1;}; border b(t=0,0.5){x=1;y=t;label=1;}; border c(t=0,0.5){x=1-t;y=0.5;label=1;}; border d(t=0.5,1){x=0.5;y=t;label=1;}; border e(t=0.5,1){x=1-t;y=1;label=1;}; border f(t=0,1){x=0;y=1-t;label=1;}; func uu= sin(y*Pi)/10; func vv= cos(x*Pi)/10; mesh Th = buildmesh ( a(6) + b(4) + c(4) +d(4) + e(4) + f(6)); // find a good deformation coef. // --------------------------------- // return the minimal area of a triangle of Th real okareamin = checkmovemesh(Th,[x,y])/10; // we accept to divide by 10 the area of the smallest triangles real coef=1000,cc=0; while (okareamin > (cc=checkmovemesh(Th,[x+coef*uu,y+coef*vv]) ) ) { cout << " coef = " << coef << " min area " << cc << endl; coef /=2; } Th=movemesh(Th,[x+coef*uu,y+coef*vv]); plot(Th,wait=1,fill=1,ps="movemesh.eps"); // save mesh int i=12; string filename="Th"+i+".msh"; savemesh(Th,filename); } // ------------------------------------------------------------ { // trunc mesh tools exemples mesh Th=square(3,3); int[int] n2o(1); fespace Vh(Th,P1); Vh u; int i,n=u.n; u=0; for (i=0;i1e-10,split=2,label=2,new2old=n2o); plot(Th,Shi,wait=1,ps="trunc"+i+".eps"); cout << " n2o " << n2o << endl; // where the element come u[][i]=0; } } // ------------------------------------------------------------ { // new stuff 2004 splitmesh (version 1.37) assert(version>=1.37); border a(t=0,2*pi){ x=cos(t); y=sin(t);label=1;} mesh Th=buildmesh(a(20)); plot(Th,wait=1,ps="nosplitmesh.eps"); plot(Th,wait=1); Th=splitmesh(Th,1+5*(square(x-0.5)+y*y)); plot(Th,wait=1,ps="splitmesh.eps"); } // ------------------------------------------------------------ { // new stuff 2004 emptymesh (version 1.40) // -- usefull to build Multiplicator space // build a mesh without internal point // with the same boundary // ----- assert(version>=1.40); border a(t=0,2*pi){ x=cos(t); y=sin(t);label=1;} mesh Th=buildmesh(a(20)); plot(Th,wait=1,ps="nosplitmesh.eps"); plot(Th,wait=1); Th=emptymesh(Th); plot(Th,wait=1,ps="emptymesh-1.eps"); } { // new stuff 2004 emptymesh (version 1.40) // -- usefull to build Multiplicator space // build a mesh without internal point // if the adj triangle // ----- assert(version>=1.40); mesh Th=square(10,10); int[int] ssd(Th.nt); fespace Ph(Th,P0); Ph sd; for(int i=0;i=5) + (iy>=5)*2; sd[][i]=ssd[i]; } plot(sd,fill=1,wait=1); Th=emptymesh(Th,ssd); plot(Th,wait=1,ps="emptymesh-2.eps"); savemesh(Th,"emptymesh-2.msh"); } // ------------------------------------------------------------ { // get mesh information (version 1.37) mesh Th=square(2,2); // get data of the mesh int nbtriangles=Th.nt; cout << " nb of Triangles = " << nbtriangles << endl; for (int i=0;i3.4-1 // --------- new stuff ----------------- int k=0,l=1,e=1; Th.nbe ; // return the number of boundary element \hfilll Th.be(k); // return the boundary element k $\in \{0,...,Th.nbe-1\}$ \hfilll Th.be(k)[l]; // return the vertices l $\in \{0,1\}$ of boundary element k \hfilll Th.be(k).Element ; // return the triangle contening the boundary element k \hfilll Th.be(k).whoinElement ; // return the egde number of triangle contening the boundary element k \hfilll Th[k].adj(e) ; // return adjacent triangle to k by edge e, and change the value of e to \hfilll // the corresponding edge in the adjacent triangle Th[k] == Th[k].adj(e) ;// non adjacent triangle return the same Th[k] != Th[k].adj(e) ;// true adjacent triangle cout << " print mesh connectivity " << endl; int nbelement = Th.nt; for (int k=0;k " << int(Th[k].adj((ee=e))) << " " << ee << " adj: " << ( Th[k].adj((ee=e)) != Th[k]) << endl; } // note : if k == int(Th[k].adj(ee=e)) not adjacent element int nbboundaryelement = Th.nbe; Th.be; for (int k=0;k=2.23); // Mortar (4 sub domain) // with matrix -et Precon Conjugade Gradient -- // Neuman -> Dirichlet . // ------------------------------- func f=1+x+y; real g=1; int withprecon=1; macro Grad(u) [ dx(u), dy(u) ] // int nbsd=4; macro Psd(U) U[0],U[1],U[2],U[3] // int labext= nbsd+1; real meshsize=0.025; real meshsizem=meshsize*1.5; bool noconforme=0; include "mortar-msh.idp" cout << "mortar : " << endl; mesh Thm=Tha; Thm=adaptmesh(Thm,meshsizem,IsMetric=1,thetamax=60,nbvx=100000); Thm=adaptmesh(Thm,meshsizem,IsMetric=1,thetamax=60,nbvx=1000000); Thm=emptymesh(Thm); mesh Thmm=Thm; if(noconforme) { // need a find mesh to integrate on Thm. Thmm=trunc(Thm,split=4,1); // for fine integration Thmm=emptymesh(Thmm); } plot(Thm,wait=0); verbosity=1; mesh[int] Thsd(nbsd); for(int sd=0;sd0.00001); Csd[sd] = cci(Lh,Vhi); Asd[sd] = vLapMi(Vhi,Vhi,solver=UMFPACK); PAsd[sd] = vPLapMi(Vhi,Vhi,solver=UMFPACK); matrix IVL=interpolate(Vhi,Lh,inside=1); // v = IVL*l varf vonext(u,v)=on(labext,u=1); varf von1(u,v)=on(1,u=1); real[int] onext=vonext(0,Vhi); real[int] on1=von1(0,Vhi); on1= on1 ? 1 : 0; on1 = onext ? 0 : on1; // remove df of ext matrix I1(on1);// matrix tgv $i\in Gamma_1 \ Gamma_e $ , 0 otherwise PIsd[sd]= I1*IVL;// remove of line not on $Gamma_1 \ Gamma_e $ // so PIsd[sd]*l = tgv * Interpole l on $Gamma_1 \ Gamma_e $ I1.diag=on1; matrix AA=I1*Asd[sd];// remove line not on lab 1 PJsd[sd]= IVL'*AA; rhssd[sd][]=vLapMi(0,Vhi); } plot(epssd,cmm="eps 0,1,2,3",wait=0,value=1); lh[]=0; varf vDD(u,v) = int2d(Thm)(u*v*1e-10); varf vML(u,v) = int2d(Thm)(u*v*1e-10)+int1d(Thm,1)(u*v); matrix ML=vML(Lh,Lh); matrix DD=vDD(Lh,Lh); matrix M=[ [ Asd[0] ,0 ,0 ,0 ,Csd[0] ], [ 0 ,Asd[1] ,0 ,0 ,Csd[1] ], [ 0 ,0 ,Asd[2] ,0 ,Csd[2] ], [ 0 ,0 ,0 ,Asd[3] ,Csd[3] ], [ Csd[0]',Csd[1]',Csd[2]',Csd[3]',DD ] ]; real[int] xx(M.n); real[int] bb =[rhssd[0][], rhssd[1][],rhssd[2][],rhssd[3][],rhsl[] ]; set(M,solver=UMFPACK); xx = M^-1 * bb; [usd[0][],usd[1][],usd[2][],usd[3][],lh[]] = xx; // dispatch the solution plot(usd,cmm="u1,u2,u3,u4",wait=1); int itera=0; varf vbc(u,v) = int1d(Thm,labext)(v); real[int] lbc(Lh.ndof),lbc0(Lh.ndof); lbc=vbc(0,Lh); lbc = lbc ? 0 : 1 ; func real[int] SkPb(real[int] &l) { int verb=verbosity; verbosity=0; itera++; for(int sd=0;sd0 ) // the movemesh will be ok Th=movemesh(Th,[x,y+f]); cout << " Min area " << minarea << endl; // u=(Vh,u[]); // the new syntaxe FH Vh tmp; // =u[], sorry no init of FEspace function with array. tmp[]=u[]; //save the value u=0; // to change the FEspace and mesh associated to u u[]=tmp[]; // set le value of the array without no mesh update plot(Th,u,wait=1); }; // remark, in this programme we have no solution with link to a previous mesh // so all the previoux are delete in memory // -------- freefem++-3.38-1/examples++-tutorial/Newton.edp000644 000767 000024 00000004541 12167254041 021363 0ustar00hechtstaff000000 000000 // FFCS: making a numerical value visible for regression tests real regtest; { // --- a real non linear test --- mesh Th=square(10,10); // mesh definition of $\Omega$ Th = adaptmesh(Th,0.05,IsMetric=1,splitpbedge=1); //plot(Th,wait=1); //Th = adaptmesh(Th,0.1,IsMetric=1,splitpbedge=1); plot(Th,wait=0); fespace Vh(Th,P1); // finite element space fespace Ph(Th,P1dc); // make optimization Vh b=1; // to defined b // $ J(u) = 1/2 \int_\Omega f(|\nabla u|^2) - \int\Omega u b $ // $ f(x) = a*x + x-ln(1+x), \quad f'(x) = a+\frac{x}{1+x}, \quad f''(x) = \frac{1}{(1+x)^2}$ real a=0.001; func real f(real u) { return u*a+u-log(1+u); } func real df(real u) { return a+u/(1+u);} func real ddf(real u) { return 1/((1+u)*(1+u));} Vh u=0; // the current value of the solution Ph alpha; // to store $ (|\nabla u|^2)$ Ph dfalpha; // to store $f' (|\nabla u|^2)$ Ph ddfalpha ; //to store = $2 f''( |\nabla u|^2) $ optimisation int iter=0; // methode of Newton Ralphson to solve dJ(u)=0; // $$ u^{n+1} = u^n - (\frac{\partial dJ}{\partial u_i})^{-1}*dJ(u^n) $$ // --------------------------------------------- // the variationnal form of evaluate dJ // -------------------------------------- // dJ = f'()*( dx(u)*dx(vh) + dy(u)*dy(vh) varf vdJ(uh,vh) = int2d(Th)( dfalpha*( dx(u)*dx(vh) + dy(u)*dy(vh) ) - b*vh) + on(1,2,3,4, uh=0); // the variationnal form of evaluate ddJ // hJ(uh,vh) = f'()*( dx(uh)*dx(vh) + dy(uh)*dy(vh) // + f''()( dx(u)*dx(uh) + dy(u)*dy(uh) ) * (dx(u)*dx(vh) + dy(u)*dy(vh)) varf vhJ(uh,vh) = int2d(Th)( dfalpha*( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) + ddfalpha*( dx(u)*dx(vh) + dy(u)*dy(vh) )*( dx(u)*dx(uh) + dy(u)*dy(uh) ) ) + on(1,2,3,4, uh=0); // the newton algorithm Vh v,w; u=0; for (int i=0;i<100;i++) { alpha = dx(u)*dx(u) + dy(u)*dy(u);// optimization dfalpha = df( alpha ) ; // optimization ddfalpha = 2*ddf(alpha ) ; // optimization v[]= vdJ(0,Vh); real res= v[]'*v[]; //' cout << i << " residu^2 = " << res << endl; matrix H; if( res< 1e-12) break; H= vhJ(Vh,Vh,factorize=1,solver=LU); w[]=H^-1*v[]; u[] -= w[]; plot (u,wait=0,cmm="solution with Newton Raphson"); // FFCS: regression tests regtest=u[]'*u[]; //' } load "medit" load "msh3" mesh3 Th3= movemesh23(Th,transfo=[x,y,u*1.5]); medit("N",Th3); } freefem++-3.38-1/examples++-tutorial/nl-elast-neo-Hookean.edp000644 000767 000024 00000032632 11406142255 023771 0ustar00hechtstaff000000 000000 // See comment on documentation chapter 9, // section: Compressible Neo-Hookean Materials: Computational So- // lutions // ----------- Author Alex Sadovsky (mail:sashas@gmail.com) // ================================================================ // non linear elasticity model: a neo-Hookean material of the // Simo-Pister type, with the strain energy density function given // by: // // W = (mu / 2) * ( I1 - tr(I1) - 2 ln(J) ), where we have used // the notation // F = deformation gradient, // J = det(F), // C = F^T F, // I1 = tr(C), // I = the identity tensor of rank 2 // For details, see formula (12) in the following paper: // ==================================================================== // Horgan, C; Saccomandi, G; // ``Constitutive Models for Compressible Nonlinearly Elastic // Materials with Limiting Chain Extensibility,'' // Journal of Elasticity, Volume 77, Number 2, November 2004, pp. 123-138(16) // ==================================================================== // For an exposition of nonlinear elasticity, see the book // "Nonlinear Elastic Deformations" by R. Ogden. Other good sources // are A.J.M. Spencer's "Continuum Mechanics" and P. Chadwick's // book with the same title. For the FEM formulation, see // Prof. Alan Bower's course notes, posted at: // http://www.engin.brown.edu/courses/en222/Notes/FEMfinitestrain/FEMfinitestrain.htm // // // The domain of the following problem is a circular or // elliptical disc with a concentric elliptical hole. Zero // displacements are prescribed on the outer boundary; the // dead stress load Pa, on the inner boundary. // ==================================================================== // Macros for the gradient of a vector field (u1, u2) macro grad11(u1, u2) (dx(u1)) // macro grad21(u1, u2) (dy(u1)) // macro grad12(u1, u2) (dx(u2)) // macro grad22(u1, u2) (dy(u2)) // // Macros for the deformation gradient macro F11(u1, u2) (1.0 + grad11(u1,u2)) // macro F12(u1, u2) (0.0 + grad12(u1,u2)) // macro F21(u1, u2) (0.0 + grad21(u1,u2)) // macro F22(u1, u2) (1.0 + grad22(u1,u2)) // // Macros for the incremental deformation gradient macro dF11(varu1, varu2) (grad11(varu1, varu2)) // macro dF12(varu1, varu2) (grad12(varu1, varu2)) // macro dF21(varu1, varu2) (grad21(varu1, varu2)) // macro dF22(varu1, varu2) (grad22(varu1, varu2)) // // Macro for the determinant of the deformation gradient macro J(u1, u2) ( F11(u1, u2)*F22(u1, u2) - F12(u1, u2)*F21(u1, u2) ) // // Macros for the inverse of the deformation gradient macro Finv11 (u1, u2) ( F22(u1, u2) / J(u1, u2) ) // macro Finv22 (u1, u2) ( F11(u1, u2) / J(u1, u2) ) // macro Finv12 (u1, u2) ( -F12(u1, u2) / J(u1, u2) ) // macro Finv21 (u1, u2) ( -F21(u1, u2) / J(u1, u2) ) // // Macros for the square of the inverse of the deformation gradient macro FFinv11 (u1, u2) ( Finv11(u1, u2)^2 + Finv12(u1, u2)*Finv21(u1, u2) ) // macro FFinv12 (u1, u2) ( Finv12(u1, u2)*(Finv11(u1, u2) + Finv22(u1, u2)) ) // macro FFinv21 (u1, u2) ( Finv21(u1, u2)*(Finv11(u1, u2) + Finv22(u1, u2)) ) // macro FFinv22 (u1, u2) ( Finv12(u1, u2)*Finv21(u1, u2) + Finv22(u1, u2)^2 ) // // Macros for the inverse of the transpose of the deformation gradient macro FinvT11(u1, u2) (Finv11(u1, u2)) // macro FinvT12(u1, u2) (Finv21(u1, u2)) // macro FinvT21(u1, u2) (Finv12(u1, u2)) // macro FinvT22(u1, u2) (Finv22(u1, u2)) // // The left Cauchy-Green strain tensor macro B11(u1, u2) ( F11(u1, u2)^2 + F12(u1, u2)^2 )// macro B12(u1, u2) ( F11(u1, u2)*F21(u1, u2) + F12(u1, u2)*F22(u1, u2) )// macro B21(u1, u2) ( F11(u1, u2)*F21(u1, u2) + F12(u1, u2)*F22(u1, u2) )// macro B22(u1, u2) ( F21(u1, u2)^2 + F22(u1, u2)^2 )// //=========================================================================== // The macros for the auxiliary tensors (D0, D1, D2, ...): Begin //// The tensor quantity D0 = F_{n} (\delta F_{n+1})^T macro d0Aux11 (u1, u2, varu1, varu2) ( dF11(varu1, varu2) * F11(u1, u2) + dF12(varu1, varu2) * F12(u1, u2) )// macro d0Aux12 (u1, u2, varu1, varu2) ( dF21(varu1, varu2) * F11(u1, u2) + dF22(varu1, varu2) * F12(u1, u2) )// macro d0Aux21 (u1, u2, varu1, varu2) ( dF11(varu1, varu2) * F21(u1, u2) + dF12(varu1, varu2) * F22(u1, u2) )// macro d0Aux22 (u1, u2, varu1, varu2) ( dF21(varu1, varu2) * F21(u1, u2) + dF22(varu1, varu2) * F22(u1, u2) )// //// The tensor quantity D1 = D0 + D0^T macro d1Aux11 (u1, u2, varu1, varu2) ( 2.0 * d0Aux11 (u1, u2, varu1, varu2) )// macro d1Aux12 (u1, u2, varu1, varu2) ( d0Aux12 (u1, u2, varu1, varu2) + d0Aux21 (u1, u2, varu1, varu2) )// macro d1Aux21 (u1, u2, varu1, varu2) ( d1Aux12 (u1, u2, varu1, varu2) )// macro d1Aux22 (u1, u2, varu1, varu2) ( 2.0 * d0Aux22 (u1, u2, varu1, varu2) )// //// The tensor quantity D2 = F^{-T}_{n} dF_{n+1} macro d2Aux11 (u1, u2, varu1, varu2) ( dF11(varu1, varu2) * FinvT11(u1, u2) + dF21(varu1, varu2) * FinvT12(u1, u2) )// macro d2Aux12 (u1, u2, varu1, varu2) ( dF12(varu1, varu2) * FinvT11(u1, u2) + dF22(varu1, varu2) * FinvT12(u1, u2) )// macro d2Aux21 (u1, u2, varu1, varu2) ( dF11(varu1, varu2) * FinvT21(u1, u2) + dF21(varu1, varu2) * FinvT22(u1, u2) )// macro d2Aux22 (u1, u2, varu1, varu2) ( dF12(varu1, varu2) * FinvT21(u1, u2) + dF22(varu1, varu2) * FinvT22(u1, u2) )// //// The tensor quantity D3 = F^{-2}_{n} dF_{n+1} macro d3Aux11 (u1, u2, varu1, varu2, w1, w2) ( dF11(varu1, varu2) *FFinv11(u1, u2) *grad11(w1, w2) + dF21(varu1, varu2) *FFinv12(u1, u2) *grad11(w1, w2) + dF11(varu1, varu2) *FFinv21(u1, u2) *grad12(w1, w2) + dF21(varu1, varu2) *FFinv22(u1, u2) *grad12(w1, w2) )// macro d3Aux12 (u1, u2, varu1, varu2, w1, w2) ( dF12(varu1, varu2) *FFinv11(u1, u2) *grad11(w1, w2) + dF22(varu1, varu2) *FFinv12(u1, u2) *grad11(w1, w2) + dF12(varu1, varu2) *FFinv21(u1, u2) *grad12(w1, w2) + dF22(varu1, varu2) *FFinv22(u1, u2) *grad12(w1, w2) )// macro d3Aux21 (u1, u2, varu1, varu2, w1, w2) ( dF11(varu1, varu2) *FFinv11(u1, u2) *grad21(w1, w2) + dF21(varu1, varu2) *FFinv12(u1, u2) *grad21(w1, w2) + dF11(varu1, varu2) *FFinv21(u1, u2) *grad22(w1, w2) + dF21(varu1, varu2) *FFinv22(u1, u2) *grad22(w1, w2) )// macro d3Aux22 (u1, u2, varu1, varu2, w1, w2) ( dF12(varu1, varu2) *FFinv11(u1, u2) *grad21(w1, w2) + dF22(varu1, varu2) *FFinv12(u1, u2) *grad21(w1, w2) + dF12(varu1, varu2) *FFinv21(u1, u2) *grad22(w1, w2) + dF22(varu1, varu2) *FFinv22(u1, u2) *grad22(w1, w2) )// //// The tensor quantity D4 = (grad w) * Finv macro d4Aux11 (w1, w2, u1, u2) ( Finv11(u1, u2)*grad11(w1, w2) + Finv21(u1, u2)*grad12(w1, w2) )// macro d4Aux12 (w1, w2, u1, u2) ( Finv12(u1, u2)*grad11(w1, w2) + Finv22(u1, u2)*grad12(w1, w2) )// macro d4Aux21 (w1, w2, u1, u2) ( Finv11(u1, u2)*grad21(w1, w2) + Finv21(u1, u2)*grad22(w1, w2) )// macro d4Aux22 (w1, w2, u1, u2) ( Finv12(u1, u2)*grad21(w1, w2) + Finv22(u1, u2)*grad22(w1, w2) )// // The macros for the auxiliary tensors (D0, D1, D2, ...): End //---------------------------------------------------------------------------- //=========================================================================== // The macros for the various stress measures: BEGIN // The Kirchhoff stress tensor macro StressK11(u1, u2) ( mu * (B11(u1, u2) - 1.0) )// // The Kirchhoff stress tensor macro StressK12(u1, u2) ( mu * B12(u1, u2) )// // The Kirchhoff stress tensor macro StressK21(u1, u2) ( mu * B21(u1, u2) )// // The Kirchhoff stress tensor macro StressK22(u1, u2) ( mu * (B22(u1, u2) - 1.0) )// // The tangent Kirchhoff stress tensor macro TanK11(u1, u2, varu1, varu2) ( mu * d1Aux11(u1, u2, varu1, varu2) )// macro TanK12(u1, u2, varu1, varu2) ( mu * d1Aux12(u1, u2, varu1, varu2) )// macro TanK21(u1, u2, varu1, varu2) ( mu * d1Aux21(u1, u2, varu1, varu2) )// macro TanK22(u1, u2, varu1, varu2) ( mu * d1Aux22(u1, u2, varu1, varu2) )// // The macros for the stress tensor components: END //---------------------------------------------------------------------------- // END OF MACROS // ---------------------------------------------------------------------------- // ************************************************ // THE (BIO)MECHANICAL PARAMETERS: Begin // Elastic coefficients real mu = 5.e2; // kg/cm^2 real D = 1.e3; // (1 / compressibility) // Stress loads real Pa = -3.e2; // THE (BIO)MECHANICAL PARAMETERS: End // ************************************************ // ************************************************ // THE COMPUTATIONAL PARAMETERS: Begin // The wound radius real InnerRadius = 1.e0; // The outer (truncated) radius real OuterRadius = 4.e0; // Tolerance (L^2) real tol = 1.e-4; // Extension of the inner ellipse ((major axis) - (minor axis)) real InnerEllipseExtension = 1.e0; // THE COMPUTATIONAL PARAMETERS: End // ************************************************ int m = 40, n = 20; border InnerEdge(t = 0, 2.0*pi) {x = (1.0 + InnerEllipseExtension) * InnerRadius * cos(t); y = InnerRadius * sin(t); label = 1;} border OuterEdge(t = 0, 2.0*pi) {x = (1.0 + 0.0 * InnerEllipseExtension) * OuterRadius * cos(t); y = OuterRadius * sin(t); label = 2;} mesh Th = buildmesh(InnerEdge(-m) + OuterEdge(n)); int bottom=1, right=2,upper=3,left=4; plot(Th); fespace Wh(Th,P1dc); fespace Vh(Th,[P1,P1]); fespace Sh(Th,P1); Vh [w1, w2], [u1n,u2n], [varu1, varu2]; varf vfMass1D(p,q) = int2d(Th)(p*q); matrix Mass1D = vfMass1D(Sh,Sh,solver=CG); Sh p, ppp; p[] = 1; ppp[] = Mass1D * p[]; real DomainMass = ppp[].sum; cout << "****************************************" << endl; cout << "DomainMass = " << DomainMass << endl; cout << "****************************************" << endl; varf vmass([u1,u2],[v1,v2],solver=CG) = int2d(Th)( (u1*v1 + u2*v2) / DomainMass ); matrix Mass = vmass(Vh,Vh); matrix Id = vmass(Vh,Vh); // Define the standard Euclidean basis functions Vh [ehat1x, ehat1y], [ehat2x, ehat2y]; [ehat1x, ehat1y] = [1.0, 0.0]; [ehat2x, ehat2y] = [0.0, 1.0]; // The individual elements of the total 1st Piola-Kirchoff stress Vh [auxVec1, auxVec2]; // Sh Stress1PK11, Stress1PK12, Stress1PK21, Stress1PK22; Sh StrK11, StrK12, StrK21, StrK22; Vh [ef1, ef2]; real ContParam, dContParam; problem neoHookeanInc ([varu1, varu2], [w1, w2], solver = LU)= int2d(Th, qforder=1) ( // BILINEAR part -( StressK11 (u1n, u2n) * d3Aux11(u1n, u2n, varu1, varu2, w1, w2) + StressK12 (u1n, u2n) * d3Aux12(u1n, u2n, varu1, varu2, w1, w2) + StressK21 (u1n, u2n) * d3Aux21(u1n, u2n, varu1, varu2, w1, w2) + StressK22 (u1n, u2n) * d3Aux22(u1n, u2n, varu1, varu2, w1, w2) ) + TanK11 (u1n, u2n, varu1, varu2) * d4Aux11(w1, w2, u1n, u2n) + TanK12 (u1n, u2n, varu1, varu2) * d4Aux12(w1, w2, u1n, u2n) + TanK21 (u1n, u2n, varu1, varu2) * d4Aux21(w1, w2, u1n, u2n) + TanK22 (u1n, u2n, varu1, varu2) * d4Aux22(w1, w2, u1n, u2n) ) + int2d(Th, qforder=1) ( // LINEAR part StressK11 (u1n, u2n) * d4Aux11(w1, w2, u1n, u2n) + StressK12 (u1n, u2n) * d4Aux12(w1, w2, u1n, u2n) + StressK21 (u1n, u2n) * d4Aux21(w1, w2, u1n, u2n) + StressK22 (u1n, u2n) * d4Aux22(w1, w2, u1n, u2n) ) // Choose one of the following two boundary conditions involving Pa: // Load vectors normal to the boundary: - int1d(Th,1)( Pa * (w1*N.x + w2*N.y) ) // Load vectors tangential to the boundary: // - int1d(Th,1)( Pa * (w1*N.y - w2*N.x) ) + on(2, varu1 = 0, varu2 = 0); ; // The Lagrange-Green strain tensor, E = (1/2)(C - I) // Wh E111, E12, E121, E12; // Auxiliary variables matrix auxMat; // Newton's method // --------------- Sh u1,u2; ContParam = 0.0; dContParam = 0.01; // Initialization: [varu1,varu2] = [0.0, 0.0]; [u1n, u2n] = [0.0, 0.0]; real res = 2.0 * tol; real eforceres; int loopcount = 0; int loopmax = 45; // Iteration: while (loopcount <= loopmax && res >= tol) { loopcount ++; //////////////////////////////////////////////////////////// cout << "Loop " << loopcount << endl; // plot([u1n,u2n], wait=0, cmm="displacement:" ); /* cout << "TESTING: Begin" << endl; cout << "dFStress2PK11 = " << dFStress2PK11 (u1n, u2n, varu1, varu2) << endl; cout << "TESTING: End" << endl; cout << "B11 = " << B11(u1n, u2n) << endl; cout << "B12 = " << B12(u1n, u2n) << endl; cout << "B21 = " << B21(u1n, u2n) << endl; cout << "B22 = " << B22(u1n, u2n) << endl << endl; cout << "J = " << J(u1n, u2n) << endl << endl; StrK11 = StressK11(u1n, u2n); StrK12 = StressK12(u1n, u2n); StrK21 = StressK21(u1n, u2n); StrK22 = StressK22(u1n, u2n); cout << "StressK11 = " << StrK11 << endl; cout << "StressK12 = " << StrK12 << endl; cout << "StressK21 = " << StrK21 << endl; cout << "StressK22 = " << StrK22 << endl; */ neoHookeanInc; // compute [varu1,varu2] = (D^2 J(u1n))^{-1}(D J(u1n)) // cout << "This marker reached" << endl; u1 = varu1; u2 = varu2; w1[] = Mass*varu1[]; res = sqrt(w1[]' * varu1[]); // norme L^2 of [varu1, varu2] // cout << " u1 min =" < (a+c,0,a+c) // so the associed matrix is: // ( 1 0 1 ) // ( 0 0 0 ) // ( 1 0 1 ) // ------------------ real a11= 2*mu + lambda ; real a22= mu ; // because [0,2*t12,0]' A [0,2*s12,0] = 2*mu*(t12*s12+t21*s21) = 4*mu*t12*s12 real a33= 2*mu + lambda ; real a12= 0 ; real a13= lambda ; real a23= 0 ; // symetric part real a21= a12 ; real a31= a13 ; real a32= a23 ; func A = [ [ a11,a12,a13],[ a21,a22,a23],[ a31,a32,a33] ]; real Pa=1e2; // a pressure of 100 Pa // ---------------- int n=30,m=10; mesh Th= square(n,m,[x,.3*y]); // label: 1 bottom, 2 right, 3 up, 4 left; int bottom=1, right=2,upper=3,left=4; plot(Th); fespace Wh(Th,P1dc); fespace Vh(Th,[P1,P1]); fespace Sh(Th,P1); Wh e2,fe2,dfe2,ddfe2; // optimisation Wh ett,ezz,err,erz; // optimisation Vh [uu,vv], [w,s],[un,vn]; [un,vn]=[0,0];// intialisation [uu,vv]=[0,0]; varf vmass([uu,vv],[w,s],solver=CG) = int2d(Th)( uu*w + vv*s ); matrix M=vmass(Vh,Vh); problem NonLin([uu,vv],[w,s],solver=LU)= int2d(Th,qforder=1)( // (D^2 J(un)) part dF2(un,vn,uu,vv)*dF2(un,vn,w,s)*ddfe2 + ddF2(un,vn,w,s,uu,vv)*dfe2 ) - int1d(Th,3)(Pa*s) - int2d(Th,qforder=1)( // (D J(un)) part dF2(un,vn,w,s)*dfe2 ) + on(right,left,uu=0,vv=0); ; // Newton's method // --------------- Sh u1,v1; for (int i=0;i<10;i++) { cout << "Loop " << i << endl; e2 = F2(un,vn); dfe2 = df(e2) ; ddfe2 = ddf(e2); cout << " e2 max " <l) | (y >0.5),label=4); func meshsize= 2*max(0.05,max(max(x-l,0.0)/19./5.,max(l-x,0.0)/3./8. )); func uin=(H-y)*(y-0.5)/square((H-0.5)/2.); Th=adaptmesh(Th,meshsize,IsMetric=1); Th=adaptmesh(Th,meshsize,IsMetric=1); plot(Th,wait=0); fespace Xh(Th,P2); fespace Mh(Th,P1); fespace XXMh(Th,[P2,P2,P1]); XXMh [u1,u2,p]; XXMh [v1,v2,q]; macro div(u1,u2) (dx(u1)+dy(u2))// macro grad(u1,u2) [dx(u1),dy(u2)]// macro ugrad(u1,u2,v) (u1*dx(v)+u2*dy(v)) // macro Ugrad(u1,u2,v1,v2) [ugrad(u1,u2,v1),ugrad(u1,u2,v2)]// solve Stokes ([u1,u2,p],[v1,v2,q],solver=UMFPACK) = int2d(Th)( ( dx(u1)*dx(v1) + dy(u1)*dy(v1) + dx(u2)*dx(v2) + dy(u2)*dy(v2) ) + p*q*(0.000001) - p*div(v1,v2)-q*div(u1,u2) ) + on(1,u1=uin,u2=0) + on(3,4,5,u1=0,u2=0); Xh uu1=u1,uu2=u2; plot(coef=0.2,cmm="Stokes [u1,u2] et p ",p,[uu1,uu2],wait=0); plot(coef=0.2,cmm="Stokes p ",p,wait=0); Mh psi,phi; solve streamlines(psi,phi) = int2d(Th)( dx(psi)*dx(phi) + dy(psi)*dy(phi)) + int2d(Th)( -phi*(dy(u1)-dx(u2))) + on(3,4,psi=0)+ on(5,psi=-2./3.*(H-0.5)) ; real[int] psiviso(31); {int k=0; for(int i=-20;i<0;i++) psiviso[k++] = i*2./3.*(H-0.5)/20; for(int i=0;i<=10;i++) psiviso[k++] = i*2./3.*(H-0.5)/100/(H*H*H); } plot(psi,wait=0,viso=psiviso); int i=0; real nu=1./100.; real dt=0.1; real alpha=1/dt; XXMh [up1,up2,pp]; varf vDNS ([u1,u2,p],[v1,v2,q]) = int2d(Th)( + nu * ( dx(u1)*dx(v1) + dy(u1)*dy(v1) + dx(u2)*dx(v2) + dy(u2)*dy(v2) ) + p*q*(0.000001) + p*dx(v1)+ p*dy(v2) + dx(u1)*q+ dy(u2)*q + Ugrad(u1,u2,up1,up2)'*[v1,v2] + Ugrad(up1,up2,u1,u2)'*[v1,v2] ) + on(1,3,4,5,u1=0,u2=0) ; varf vNS ([u1,u2,p],[v1,v2,q]) = int2d(Th)( + nu * ( dx(up1)*dx(v1) + dy(up1)*dy(v1) + dx(up2)*dx(v2) + dy(up2)*dy(v2) ) + pp*q*(0.000001) + pp*dx(v1)+ pp*dy(v2) + dx(up1)*q+ dy(up2)*q + Ugrad(up1,up2,up1,up2)'*[v1,v2]//' ) + on(1,3,4,5,u1=0,u2=0) ; for(int krey=0;krey=l & x < (l+0.5)) | (x>(l+0.4)) & (x<10)& (dy(psi) >= 1e-5)) ) ; real rp2=1./(H-h)*int1d(Th,3)( real( (x>=l & x < (l+0.5)) | (x>(l+0.4)) & (x<10)& (dy(psi) >= -1e-5)) ) ; real rp3=1./(H-h)*int1d(Th,3)( real( (x>=l & x < (l+0.5)) | (x>(l+0.4)) & (x<10)& (dy(u1)<=0) ) ) ; cout << " Reattach point " << rp2 << " " << rp2 << " " << rp3 << endl; real rp = (rp1+rp2)/2; real rppaper = krey < 2 ? reattachP(krey,cas) : rp; real err= abs(rppaper - rp)/rp; if( err>0.5 ) nerr++;// cout << "\n\n\n"; cout << "H= " << H << " Re " << re << " Reattach point " << rp << " paper=" << rppaper << " err "<< err << " psi max = " << psi[].max <> comment; if ( ! ff.good() ) break; if( comment(0:0)=="#") { getline(ff,comment); cout << " -- #" << comment << endl; } else { ff.seekg(where); //restore file position break; } } return ff; } { ifstream file("f.txt",binary); // for windows (pb CRNL EOL translation ) cout << " where " << file.seekg << endl; file.seekg(where); file >> xx; cout << " xx = " << xx << " good ? " << file.good() << endl; assert(xx==0.1); skipcomment(file) >> xx; assert(xx==0.2); file.seekg(0); cout << " where " << file.tellg() << " " << file.good() << endl; file >> g[] ; } fespace Vh2(th2,P1); Vh2 u,v; plot(g); solve pb(u,v) = int2d(th2)( u*v -dx(u)*dx(v)-dy(u)*dy(v) ) + int2d(th2)(-g*v) + int1d(th2,5)( -g*v) + on(1,u=0) ; plot (th2,u); cout << " (u[],u[]) = " << (u[]'*u[]) << endl; { ofstream file("u.txt"); file << u[] << endl; } freefem++-3.38-1/examples++-tutorial/ref.edp000644 000767 000024 00000002052 12107167667 020673 0ustar00hechtstaff000000 000000 real REFadapt=0.238829; real REFadaptindicatorP1=0.239154; real REFadaptindicatorP2=0.239362; real REFalgo=0.283188; real REFalgowithmacro=0.283188; real REFaXtutorial=1+0.000305788; real REFbeam=2.25164; real REFBlackSchole=58.0181; real REFcavity=0.423606; real REFconvect2=2.54096; real REFconvectXapt=0.00195759; real REFconvect=9.88705; real REFFE=84.9337; real REFfluidStructAdapt=4.36689; real REFfluidStruct=1.2965; real REFfreeboundary=1071.12; real REFfreeboundaryXweak=1071.12; real REFLapDG2=2.04649; real REFLaplace=0.167397; real REFLaplaceP1bis=3.4845e-14; real REFLaplaceP1=2.34669; real REFLaplaceP1P2h=8.60123; real REFLaplaceRT=0.433835; real REFmovemesh=42.35; real REFnolinearXelas=0.11349; real REFNSUzawaCahouetChabart=2.01994; real REFonde=146.865; real REFplot=85.3776; real REFreadmesh=110.015; real REFregion=0.010438; real REFschwarzXgc=3.29683; real REFschwarzXnoXoverlap=5.11085; real REFschwarzXoverlap=5.04675; real REFsparseXmatrix=116.382; real REFsparseXcmatrix=232.764; real REFStokesUzawa=32.7781; real REFtablefunction=66.5851; freefem++-3.38-1/examples++-tutorial/region.edp000644 000767 000024 00000002110 11406142255 021360 0ustar00hechtstaff000000 000000 // example using region keywork // construct a mesh with 4 regions (sub-domains) border a(t=0,1){x=t;y=0;}; border b(t=0,0.5){x=1;y=t;}; border c(t=0,0.5){x=1-t;y=0.5;}; border d(t=0.5,1){x=0.5;y=t;}; border e(t=0.5,1){x=1-t;y=1;}; border f(t=0,1){x=0;y=1-t;}; // internal boundary border i1(t=0,0.5){x=t;y=1-t;}; border i2(t=0,0.5){x=t;y=t;}; border i3(t=0,0.5){x=1-t;y=t;}; mesh th = buildmesh (a(6) + b(4) + c(4) +d(4) + e(4) + f(6)+i1(6)+i2(6)+i3(6)); fespace Ph(th,P0); fespace Vh(th,P1); Ph reg=region; plot(reg,fill=1,wait=1,value=1,ps="region.eps"); int nupper=reg(0.4,0.9); int nlower=reg(0.9,0.1); cout << " nlower " << nlower << ", nupper = " << nupper<< endl; // defined the characteristics fonctions of upper and lower region Ph nu=1+5*(region==nlower) + 10*(region==nupper); if ( nu[].sum < 1) { cout << " Bug in region.edp (bad version try new one)"<< endl; exit(1);} plot(nu,fill=1,wait=1,value=1,ps="region_nu.eps"); Vh u,v; solve lap(u,v) = int2d(th)( nu*(dx(u)*dx(v) +dy(u)*dy(v))) + int2d(th)(-1*v) + on(a,b,c,d,e,f,u=0); plot(u,value=1,ps="region_u.eps"); freefem++-3.38-1/examples++-tutorial/regtests.edp000644 000767 000024 00000032303 12105735621 021746 0ustar00hechtstaff000000 000000 // Regression tests // ---------------- // $Id$ // Regression tests // ---------------- // The tests are checked against reference values by "make check" in // each examples subdirectory // "ref.edp" contains all reference values and may be rebuilt with // "make Ref" // $Id$ // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. NoUseOfWait=true; int verbosityy=verbosity; include "ref.edp"; // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. cout << "--------- file : adapt.edp -----------------" << endl; verbosity=verbosityy; { include "adapt.edp"; real TESTadapt=u[].max-u[].min; cout<<"adapt reference value = "<> v[] ; e[] = u[] -v[]; cout << e[].max << " " << e[].min << endl; plot(e,wait=1,value=1); assert(e[].max-e[].min < 1e-6); regtest=e[].max-e[].min; } freefem++-3.38-1/examples++-tutorial/schwarz-gc.edp000644 000767 000024 00000004042 11406142255 022153 0ustar00hechtstaff000000 000000 // Schwarz without overlapping (Shur complenement Neumann -> Dirichet) verbosity=2; real cpu=clock(); int inside = 2; int outside = 1; border Gamma1(t=1,2){x=t;y=0;label=outside;}; border Gamma2(t=0,1){x=2;y=t;label=outside;}; border Gamma3(t=2,0){x=t ;y=1;label=outside;}; border GammaInside(t=1,0){x = 1-t; y = t;label=inside;}; border GammaArc(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=outside;}; int n=4; mesh Th1 = buildmesh( Gamma1(5*n) + Gamma2(5*n) + GammaInside(5*n) + Gamma3(5*n)); mesh Th2 = buildmesh ( GammaInside(-5*n) + GammaArc(25*n) ); plot(Th1,Th2); fespace Vh1(Th1,P1), Vh2(Th2,P1); Vh1 u1=0,v1; Vh2 u2,v2; Vh1 lambda=0; // take $\lambda \in V_{h1}$ /* Remark, to day is not possible to defined a function just on a border, so the $\ lambda $ function is defined on the all domain $\Omega_1$ by: */ int i=0; // for factorization optimization problem Pb2(u2,v2,init=i,solver=Cholesky) = int2d(Th2)( dx(u2)*dx(v2)+dy(u2)*dy(v2) ) + int2d(Th2)( -v2) + int1d(Th2,inside)(-lambda*v2) + on(outside,u2= 0 ) ; problem Pb1(u1,v1,init=i,solver=Cholesky) = int2d(Th1)( dx(u1)*dx(v1)+dy(u1)*dy(v1) ) + int2d(Th1)( -v1) + int1d(Th1,inside)(+lambda*v1) + on(outside,u1 = 0 ) ; varf b(u2,v2,solver=CG) =int1d(Th1,inside)(u2*v2); matrix B= b(Vh1,Vh1,solver=CG); // $\lambda \longrightarrow \int_{\Gamma_i }(u_1-u_2) v_{1}$ func real[int] BoundaryProblem(real[int] &l) { lambda[]=l; Pb1; Pb2; i++; v1=-(u1-u2); lambda[]=B*v1[]; return lambda[] ; }; /* Remark, the difference between the tow notation \ttCC{v1} and \ttCC{v1[]} is: \ttCC{v1} is the finite element function and \ttCC{v1[]} is the vector in the canonical basis of the finite element function \ttCC{v1} . */ Vh1 p=0,q=0; // solve the problem with Conjugue Gradient LinearCG(BoundaryProblem,p[],q[],eps=1.e-6,nbiter=100); // compute the final solution, because CG works with increment BoundaryProblem(p[]); // solve again to have right u1,u2 cout << " -- CPU time schwarz-gc:" << clock()-cpu << endl; plot(u1,u2); freefem++-3.38-1/examples++-tutorial/schwarz-no-overlap.edp000644 000767 000024 00000002135 12421462500 023641 0ustar00hechtstaff000000 000000 // schwarz1 without overlapping int inside = 2; int outside = 1; border a(t=1,2){x=t;y=0;label=outside;}; border b(t=0,1){x=2;y=t;label=outside;}; border c(t=2,0){x=t ;y=1;label=outside;}; border d(t=1,0){x = 1-t; y = t;label=inside;}; border e(t=0, 1){ x= 1-t; y = t;label=inside;}; border e1(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=outside;}; int n=4; mesh th = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)); mesh TH = buildmesh ( e(5*n) + e1(25*n) ); plot(th,TH,wait=1,ps="schwarz-no-th.eps"); fespace vh(th,P1); fespace VH(TH,P1); vh u=0,v; VH U,V; vh lambda=0; int i=0; problem PB(U,V,init=i,solver=Cholesky) = int2d(TH)( dx(U)*dx(V)+dy(U)*dy(V) ) + int2d(TH)( -V) + int1d(TH,inside)(lambda*V) + on(outside,U= 0 ) ; problem pb(u,v,init=i,solver=Cholesky) = int2d(th)( dx(u)*dx(v)+dy(u)*dy(v) ) + int2d(th)( -v) + int1d(th,inside)(-lambda*v) + on(outside,u = 0 ) ; for ( i=0 ;i< 20; i++) { PB; pb; lambda = lambda - (u-U)/2; // if (i==0) // FFCS: add 3d view plot(U,u,wait=true,ps="schwarz-no-u"+i+".eps",dim=3,fill=1); }; plot(U,u,ps="schwarz-no-u.eps"); freefem++-3.38-1/examples++-tutorial/schwarz-overlap.edp000644 000767 000024 00000001742 11406142255 023236 0ustar00hechtstaff000000 000000 real pi=4*atan(1); int inside = 2; int outside = 1; border a(t=1,2){x=t;y=0;label=outside;}; border b(t=0,1){x=2;y=t;label=outside;}; border c(t=2,0){x=t ;y=1;label=outside;}; border d(t=1,0){x = 1-t; y = t;label=inside;}; border e(t=0, pi/2){ x= cos(t); y = sin(t);label=inside;}; border e1(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=outside;}; int n=4; mesh th = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)); mesh TH = buildmesh ( e(5*n) + e1(25*n) ); plot(th,TH,ps="schwarz-th.eps"); fespace vh(th,P1); fespace VH(TH,P1); vh u=0,v; VH U,V; int i=0; problem PB(U,V,init=i,solver=Cholesky) = int2d(TH)( dx(U)*dx(V)+dy(U)*dy(V) ) + int2d(TH)( -V) + on(inside,U = u) + on(outside,U= 0 ) ; problem pb(u,v,init=i,solver=Cholesky) = int2d(th)( dx(u)*dx(v)+dy(u)*dy(v) ) + int2d(th)( -v) + on(inside ,u = U) + on(outside,u = 0 ) ; for ( i=0 ;i< 10; i++) { PB; pb; if (i==0) plot(U,u,wait=true,ps="schwarz-u"+i+".eps"); }; plot(U,u,ps="schwarz-u.eps"); freefem++-3.38-1/examples++-tutorial/shur-comp.edp000644 000767 000024 00000007657 11406142255 022037 0ustar00hechtstaff000000 000000 // Schwarz without overlapping (Shur complement Neumann -> Dirichet) // with matrix --- // ------------ verbosity=2; real cpu=clock(); macro laplacien(u,v) (dx(u)*dx(v)+dy(u)*dy(u)) // // --- beging meshes building -------------- int nbsd=4; int labext= nbsd+1; real[int] theta(nbsd+1),cost(nbsd),sint(nbsd); for (int i=0;i Xh1 matrix I2=interpolate(Xh2,Mhe); // build interpolation matrix Mhe -> Xh2 matrix I3=interpolate(Xh3,Mhe); // build interpolation matrix Mhe -> Xh2 matrix I4=interpolate(Xh4,Mhe); // build interpolation matrix Mhe -> Xh3 int nm = Mhe.ndof; real [int] l1(nm),l2(nm),l3(nm),l4(nm); func f = (x+1)*(y-2); varf vgamma(u,v) = on(1,2,3,4,u=1); Mhe gamma; gamma[] = vgamma(0,Mhe,tgv=1); plot(gamma,wait=1,cmm="gamma",value=1); varf vM(u,v) = int1d(The)( u*v) ; matrix M = vM(Mhe,Mhe,solver=UMFPACK) ; // debut macro par ssd macro Pb(A,B,a,P,Th,u1,v1,Xh) cout << " -- PB -- " << endl; varf a(u1,v1) = int2d(Th)( dx(u1)*dx(v1)+dy(u1)*dy(v1) ) - int2d(Th)( f*v1) ; problem P(u1,v1,init=i,solver=Cholesky) = int2d(Th)( dx(u1)*dx(v1)+dy(u1)*dy(v1) ) - int2d(Th)( f*v1) + on(labext,u1= 0 ) + on(1,2,3,4,u1=lambda) ; matrix A = a(Xh,Xh,solver=GMRES) ; real[int] B(Xh.ndof); B=a(0,Xh); // Fin macro ssd ------- Pb(A1,b1,va1,Pb1,aTh[0],u1,v1,Xh1); Pb(A2,b2,va2,Pb2,aTh[1],u2,v2,Xh2); Pb(A3,b3,va3,Pb3,aTh[2],u3,v3,Xh3); Pb(A4,b4,va4,Pb4,aTh[3],u4,v4,Xh4); func real[int] BoundaryProblem(real[int] &l) { int vv = verbosity; verbosity=0; lambda[]=l; Pb1; dnu1[]= A1*u1[];dnu1[]+=b1; l1= I1'*dnu1[]; Pb2; dnu2[]= A2*u2[];dnu2[]+=b2; l2= I2'*dnu2[]; Pb3; dnu3[]= A3*u3[];dnu3[]+=b3; l3= I3'*dnu3[]; Pb4; dnu4[]= A4*u4[];dnu4[]+=b4; l4= I4'*dnu4[]; l1 += l2; l1 += l3; l1 += l4; l1 = l1.* intern[]; cout << " residu = " << l1.max << " " << l1.min << endl; lambda[]=M*l1; plot(lambda,wait=1,cmm="lamdba"); lambda[]=lambda[].* intern[]; i++; verbosity=vv; return lambda[] ; }; lambda=0; Mhe p=0; verbosity=100; LinearCG(BoundaryProblem,p[],eps=1.e-6,nbiter=100); BoundaryProblem(p[]); plot(u1,u2,u3,u4,wait=1,cmm="u1,u2,u3,u4"); freefem++-3.38-1/examples++-tutorial/sparse-cmatrix.edp000644 000767 000024 00000007715 12442533126 023061 0ustar00hechtstaff000000 000000 // sparse matrix test --- // example of the new matrix feature in version 1.40 // ------------------------------------------------- for(int step=0; step <2; ++step) { mesh TH = square(3,4); mesh th = square(2,3); mesh Th = square(4,4); complex ccc; ccc= 1; cout << ccc << endl; fespace VH(TH,P1); fespace Vh(th,P1); fespace Wh(Th,P1); matrix RB= interpolate(VH,Vh); // build interpolation matrix Vh->Vh matrix RBB= interpolate(Wh,Vh); // build interpolation matrix matrix B=RB; B = B*(1+2i); matrix BB=RBB; varf vA(u,v) = int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))+ int1d(Th)(u*v); matrix A=vA(Wh,Wh); Vh ml=0; cout << " ml " << ml[] << endl; varf vML(u,v) = int2d(th)(1.*v); ml[]=vML(0,Vh); // build the P1 mass lump of P1 cout << ml[] << endl; matrix ML(ml[]); // matrix diagonal cout << "ML="< sparseA=A; cout << sparseA << endl; sparseA = 2*sparseA+sparseA; sparseA = 4*sparseA+sparseA*(5+1i); // * 27 matrix sparseB=sparseA;//+sparseA+sparseA; ; cout << sparseA << endl; cout << sparseB << endl; // *81 cout << "sparseB = " << sparseB(0,0) << endl; // ajoute version 2.0-2 sparseA=A; verbosity=4; if(HaveUMFPACK) set(sparseA,solver=UMFPACK,tolpivot=1e-10,tolpivotsym=1e-9); else set(sparseA,solver=GMRES); bb=sparseA^-1*a; verbosity=1; b = sparseA*bb; b -= a; cout << " nb coef sparseA " << sparseA.nbcoef << endl; cout << " ||b.||_1 " << b.l1 << endl; cout << " ||b.||_2 " << b.l2 << endl; cout << " ||b.||_infty " << b.linfty << endl; assert(b.l1 < 1e-10); } {// version 3.8 mesh Th=square(2,2); fespace Xh(Th,P1); varf vv(u,v)= int2d(Th)( ((2+1i)*u*v)')+int2d(Th)((3+2i)*v);//'); varf vr(u,v)= int2d(Th)( u*v);//'); matrix A=vv(Xh,Xh); matrix Ar=vr(Xh,Xh); complex[int] vc=vv(0,Xh); real[int] vrr=vc.re,vii=vc.im; vrr=vc.re; vii=vc.im; cout << "vc[0] = " <> ssA; ssA = (1.)*sA+ (-1.)*ssA; cout << ssA << endl; } } matrix tAA=sA+sA';//'; matrix ttAA=sA'+sA;//'; // matrix tttAA=sA'-sA; // matrix ttAA=sA'-sA; A += 2*a*a'; //'// produit tensoriel matrix A1= A(II^-1,JJ^-1); // do A1(II(i),JJ(j)) = A(i),j) $ matrix A2= A(III,JJJ); // do $A2(i,j) = A(III(i),JJJ(i)) $ matrix sA1= sA(II^-1,JJ^-1); // do A1(II(i),JJ(i)) = A( matrix sA2= sA(III,JJJ); // do A = A matrix A0 = (a*a')(II^-1,JJ^-1); //'); matrix A3 = (a*a')(III,JJJ);//'); cout << " ------------------- " << endl; // cout << " A = " << A << endl; // cout << " A1 = " << A1 < " < 0.01) assert(A1(II[j9],JJ[i9]) == A(j9,i9)); if( abs(A(III(j9),JJJ(i9))) > 0.01) assert(A2(j9,i9) == A(III(j9),JJJ(i9) )) ; // cout << " i9,j9 -> " < 0.01) assert(A0(II[i9],JJ[j9]) == a[i9]*a[j9]); if( abs(a[III[i9]]*a[JJJ[j9]])> 0.01) assert(A3(i9,j9) == a[III[i9]]*a[JJJ[j9]]); } b=A*a; c=-9; cout << "xxxx\n"; matrix sparseA=A; //cout << sparseA << endl; sparseA = 2*sparseA+sparseA; sparseA = 4*sparseA+sparseA*5; // * 27 matrix sparseB=sparseA+sparseA+sparseA; ; //cout << sparseA << endl; //cout << sparseB << endl; // *81 cout << "sparseB = " << sparseB(0,0) << endl; cout << " -------- block matrix \n " << endl; matrix B = [ [sparseA, 0 , sparseA ], [ 0, sparseA , 0 ] , [0, 0, sparseB' ]];//']]; matrix B2 = [ [sparseA], [sparseA]]; assert( B2.n == sparseA.n*2); assert( B2.m == sparseA.m); matrix B1 = [ [sparseA, sparseA] ]; assert( B1.m == sparseA.m*2); // FH. bug before version 2.11-4 (10/01/2007) assert( B1.n == sparseA.n); real[int] x([a,b,c]); // construct the block vector x form a,b,c, // where the size is sum of size of a,b,c, x=[a,b,c]; // set x to to the block vector (the vector x is resize if it necessary cout << " abc =" << a[2] << " " << b[3] << " "<< c[4] << endl; cout << " xxx =" << x[2] << " " << x[3+N] << " "<< x[4+N*2] << endl; x = x*10; [a,b,c]=x; // set the block vector a,b,c from concecutive part of x; cout << " abc*10 == " << a[2] << " " << b[3] << " "<< c[4] << endl; // remark the size of sum of size must be equal to the size of x. //cout << " B = " << B << endl; cout << B(8,29) << " === " << sparseA(8,9) << endl; cout << B(28,27) << " === " << sparseB(7,8) << endl; B(8,29)=100; // change the value an existing coef cout << " B(8,29) " << B(8,29) << endl; cout << " -------- block matrix \n " << endl; } // build FE matrice with differente meshes (here 3) varf vM(u,v)=int1d(Th,qforder=1)(u*v); matrix MM=vM(Vh,VH); //cout << MM << endl; Vh unVh=0,wVh=0; VH unVH=0,wVH=0; unVh[]=1; unVH[]=1; wVh[] = MM' * unVH[] ; //' wVH[] = MM * unVh[] ; //cout << "wWh : " << wVh[] << endl; //cout <<" wVH : " << wVH[] << endl; // array of matrix v2.4-1 cout << " array of matrix \n" ; matrix[int] aM(10); aM[0]= MM; aM[3]= MM; aM[9]= MM; // aM.resize(4); // aM.resize(10); bug on debian ? FH // add version 2.17 --- { real[int] coef([1,2,3,5,6]); int[int] lg( [1,3,6,9,100]); int[int] cl( [1,4,9,0,0]); // a diagonal matrix matrix A=[coef]; cout << " A = " << A << endl; // a raw matrix matrix B=[lg,cl,coef]; cout << " B = " << B << endl; [lg,cl,coef] = A; cout<< " lg : " << lg << endl; cout << " cl : " << cl << endl; cout << " coef = "<< coef << endl; } // version 3.1-1 cout << MM << endl; MM.resize(10,100); cout << MM << endl; { // test renumbering of sub mesh .. func Pk=P2; int[int] n2ok(1); mesh ThC = trunc(Th,x < 0.5,new2old=n2ok); fespace VFh(Th,Pk); fespace VCh(ThC,Pk); verbosity= 100; int[int] n2o=restrict(VCh,VFh,n2ok); cout << " n2o " << n2o << endl; } }freefem++-3.38-1/examples++-tutorial/sphere.edp000644 000767 000024 00000002275 12131740110 021365 0ustar00hechtstaff000000 000000 mesh Th=square(10,20,[x*pi-pi/2,2*y*pi]); // $]\frac{-pi}{2},frac{-pi}{2}[\times]0,2\pi[ $ // a paratrization of a sphere func f1 =cos(x)*cos(y); func f2 =cos(x)*sin(y); func f3 = sin(x); // de partiel derivatrive of the parametrization DF func f1x=sin(x)*cos(y); func f1y=-cos(x)*sin(y); func f2x=-sin(x)*sin(y); func f2y=cos(x)*cos(y); func f3x=cos(x); func f3y=0; // $ M = DF^t DF $ func m11=f1x^2+f2x^2+f3x^2; func m21=f1x*f1y+f2x*f2y+f3x*f3y; func m22=f1y^2+f2y^2+f3y^2; func perio=[[4,y],[2,y],[1,x],[3,x]]; // to store the periodic condition // the intial mesh savemesh(Th,"sphere",[f1,f2,f3]); real hh=0.1; real vv= 1/square(hh); verbosity=2; Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,inquire=1,periodic=perio); plot(Th,wait=1); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); plot(Th,wait=1); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); plot(Th,wait=1); Th=adaptmesh(Th,m11*vv,m21*vv,m22*vv,IsMetric=1,periodic=perio); load "msh3" load "medit" //savemesh(Th,"sphere-a",[f1,f2,f3]); plot(Th,wait=1); mesh3 Th3= movemesh23(Th,transfo=[f1,f2,f3]); plot(Th3,wait=1); medit("sphere-a",Th3);// bug un color of u ... FH //exec("ffmedit sphere-a"); freefem++-3.38-1/examples++-tutorial/StokesUzawa.edp000644 000767 000024 00000001620 11406142255 022362 0ustar00hechtstaff000000 000000 // signe of pressure is correct assert(version>1.18); real s0=clock(); mesh Th=square(10,10); fespace Xh(Th,P2),Mh(Th,P1); Xh u1,u2,v1,v2; Mh p,q,ppp; varf bx(u1,q) = int2d(Th)( (dx(u1)*q)); varf by(u1,q) = int2d(Th)( (dy(u1)*q)); varf a(u1,u2)= int2d(Th)( dx(u1)*dx(u2) + dy(u1)*dy(u2) ) + on(1,2,4,u1=0) + on(3,u1=1) ; Xh bc1; bc1[] = a(0,Xh); Xh b; matrix A= a(Xh,Xh,solver=CG); matrix Bx= bx(Xh,Mh); matrix By= by(Xh,Mh); Xh bcx=1,bcy=0; func real[int] divup(real[int] & pp) { int verb=verbosity; verbosity=0; b[] = Bx'*pp; b[] += bc1[] .*bcx[]; u1[] = A^-1*b[]; b[] = By'*pp; b[] += bc1[] .*bcy[]; u2[] = A^-1*b[]; ppp[] = Bx*u1[]; ppp[] += By*u2[]; verbosity=verb; return ppp[] ; }; p=0;q=0;u1=0;v1=0; LinearCG(divup,p[],q[],eps=1.e-6,nbiter=50); divup(p[]); plot([u1,u2],p,wait=1,value=true,coef=0.1); freefem++-3.38-1/examples++-tutorial/string.edp000644 000767 000024 00000003342 12310071035 021403 0ustar00hechtstaff000000 000000 // bug string macro parameter version < 1.41 // bug in string parameter version before <2.5 // ----------------- macro tyty(uu) uu// cout << tyty("toto") << endl; func string write(string fn,real[int] & u) { cout <<"write : " << fn << " u = "<< u << endl; // delete 2 times before version 2.5 return fn; } func string write1(string fn,real[int] & u) { cout << "write 1 " << fn << " u = " << u << endl; string toto=fn; ; return toto+"dfsdf"; } real[int] u(3); u=1; string tt=tyty("toto1"+1+" -- 77"); string t1="0123456789";// write(tt,u); string t2; { t2= write1(t1,u)+write1(tt,u); // // because the local variable of write1 are delete 2 times at the ; cout << " t2 = " << t2 << endl; } if(0) { // the correct way t2= write1(t1,u); t2=t2 + write1(tt,u); cout << " t2 = " << t2 << endl; } // new operator t2 ="12340005678"; t2(4:3) = "abcdefghijk-"; string t55=t2(4:3); //t2 = "12340abcdefghijk-005678"; cout << t2 << endl; cout << " find abc " << t2.find("abc") << endl; cout << "r find abc " << t2.rfind("abc") << endl; cout << " find abc from 10 " << t2.find("abc",10) << endl; cout << " ffind abc from 10 " <> xx >>yy >> fxy[][i]; } plot(fxy,wait=1,ps="xyf.ps"); // new way to bluid a mesh version 2.23-2 Vhxy xx=x,yy=y; mesh Th=triangulate(xx[],yy[]); cout << " region = " << triangulate(xx[],yy[])[1].region <1.18 // correction in CahouetChabard routine in version 1.26 assert(version>1.18); // for big bug is non symetric matrix see HISTORY real s0=clock(); mesh Th=square(10,10); fespace Xh(Th,P2),Mh(Th,P1); Xh u1,u2,v1,v2; Mh p,q,ppp; real[int] pwork(p.n); int i=0; real one =1; varf bx(u1,q) = int2d(Th,qforder=4)( dx(u1)*q ); varf by(u1,q) = int2d(Th,qforder=4)( dy(u1)*q ); varf a(u1,u2)= int2d(Th,qforder=4)( dx(u1)*dx(u2) + dy(u1)*dy(u2) ) + on(3,u1=1) + on(1,2,4,u1=0) ; varf vfMass(p,q) = int2d(Th)(p*q); matrix MassMh=vfMass(Mh,Mh,solver=CG); p[]=1; ppp[]= MassMh*p[]; real aire = ppp[].sum; cout << " area of Omega = " << aire << endl; Xh bc1; bc1[] = a(0,Xh); Xh b; matrix A= a(Xh,Xh,solver=CG); matrix Bx= bx(Xh,Mh); // Mh corresponding to line and Xh to column matrix By= by(Xh,Mh); Xh bcx=(1-x)*x*4,bcy=0; Xh b1=0,b2=0; // right hand side (0) for Stokes func real[int] divup(real[int] & pp) { pwork= MassMh*pp; cout << " pp moy = " << pwork.sum/aire << " " ; pp -= pwork.sum/aire;; b = b1; b[] += Bx'*pp; b[] += bc1[] .*bcx[]; u1[] = A^-1*b[]; b = b2; b[] += By'*pp; b[] += bc1[] .*bcy[]; u2[] = A^-1*b[]; ppp[] = Bx*u1[]; ppp[] += By*u2[]; pwork= MassMh*ppp[]; cout << " moy = " << pwork.sum/aire << endl; // ppp[] -= pwork.sum/aire; return ppp[] ; }; p=0;q=0;u1=0;v1=0; //cout << " -------- A = " << A << endl; LinearCG(divup,p[],q[],eps=1.e-6,nbiter=50); divup(p[]); plot([u1,u2],p,wait=0,value=true,coef=0.1); real dt=0.05, alpha=1/dt; if ( alpha > 1e30) exit(1); real xnu=1./400.; cout << " alpha = " << alpha << " nu = " << xnu << endl; cout << "------------------------------------------ " << endl; varf at(u1,u2)= int2d(Th)( xnu*dx(u1)*dx(u2) + xnu*dy(u1)*dy(u2) + u1*u2*alpha ) + on(3,u1=1) + on(1,2,4,u1=0) ; A = at(Xh,Xh,solver=CG); //cout << " -------- AA = " << AA << endl; varf vfconv1(uu,vv) = int2d(Th,qforder=5) (convect([u1,u2],-dt,u1)*vv*alpha); varf vfconv2(v2,v1) = int2d(Th,qforder=5) (convect([u1,u2],-dt,u2)*v1*alpha); int idt; real temps=0; Mh pprec,prhs; varf vfLap(p,q) = int2d(Th)(dx(p)*dx(q) + dy(p)*dy(q) + p*q*1e-3); matrix LapMh= vfLap(Mh,Mh,solver=Cholesky,factorize=true); real[int] unMh(pprec.n); pprec[]=1; unMh = MassMh*pprec[]; func real[int] CahouetChabart(real[int] & xx) { // xx = \int (div u) w_i // $ \alpha \Delta^{-1} + \nu I $ // $ \alpha \LapMh ^{-1} + \nu MassMh^-1 $ real mxx= unMh'*xx; xx -= mxx*Th.area; pprec[]= LapMh^-1* xx; prhs[] = MassMh^-1*xx; pprec[] = alpha*pprec[]+xnu* prhs[]; // xx = LapMh*pprec[]; // pprec[] -= xx.sum; return pprec[]; }; Xh up1,up2; for (idt = 1; idt < 50; idt++) { up1=u1; up2=u2; temps += dt; cout << " --------- temps " << temps << " \n "; b1[] = vfconv1(0,Xh); b2[] = vfconv2(0,Xh); cout << " min b1 b2 " << b1[].min << " " << b2[].min << " max b1 b2 " << b1[].max << " " << b2[].max << endl; LinearCG(divup,p[],q[],eps=-1.e-6,nbiter=50,precon=CahouetChabart); divup(p[]); real errl2 = sqrt(int2d(Th)( (u1-up1)^2 + (u2-up2)^2 ) ); cout << " errl2 " << errl2 << endl; plot([u1,u2],p,wait=0,value= 1,coef=0.1,cmm="[u1,u2],p || u^n+1 - u^n ]]_L2 ="+errl2); if (errl2 < 1e-4) break; } freefem++-3.38-1/examples++-other/lap3-cpu.edp000644 000767 000024 00000006362 12167254041 021016 0ustar00hechtstaff000000 000000 // a example to test the level of optimisation // -------------------------------------------- int nn=300; mesh Th=square(nn,nn); verbosity=5; fespace Vh(Th,P1); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace0(uh,vh,solver=Cholesky,tgv=1e30) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int1d(Th,1)( uh*vh) + int1d(Th,1)( - vh) + int2d(Th)( -f*vh ) // linear form + on(2,3,4,uh=g) ; // boundary condition form problem laplace1(uh,vh,solver=CG,tgv=1e30) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int1d(Th,1)( uh*vh) + int1d(Th,1)( - vh) + int2d(Th)( -f*vh ) // linear form + on(2,3,4,uh=g) ; // boundary condition form problem laplaceLU(uh,vh,solver=LU,tgv=1e30) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int1d(Th,1)( uh*vh) + int1d(Th,1)( - vh) + int2d(Th)( -f*vh ) // linear form + on(2,3,4,uh=g) ; // boundary condition form problem laplaceCrout(uh,vh,solver=Crout,tgv=1e30) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int1d(Th,1)( uh*vh) + int1d(Th,1)( - vh) + int2d(Th)( -f*vh ) // linear form + on(2,3,4,uh=g) ; // boundary condition form real cpu=clock() ; laplace0; // solve the problem plot(uh); // to see the result cout << "-- lap Cholesky " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; uh=0; cpu=clock() ; laplace1; // solve the problem plot(uh); // to see the result cout << "-- lap CG " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; uh=0; cpu=clock() ; laplaceLU; // solve the problem plot(uh); // to see the result cout << "-- lap LU " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; uh=0; cpu=clock() ; laplaceCrout; // solve the problem plot(uh); // to see the result cout << "-- lap Crout " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; // FFCS: reference value for regression tests real regtest=uh[].max; uh=0; if(HaveUMFPACK){ problem laplace2(uh,vh,solver=UMFPACK,tgv=1e30) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int1d(Th,1)( uh*vh) + int1d(Th,1)( - vh) + int2d(Th)( -f*vh ) // linear form + on(2,3,4,uh=g) ; // boundary condition form cpu=clock(); laplace2; // solve the problem plot(uh); // to see the result cout << "-- lap UMFPACK " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; } else{ cout << "-- lap UMFPACK " << nn << "x" << nn << " : " << "not available" << endl; } // plot(uh,ps="lap1-cpu.eps",value=true); freefem++-3.38-1/examples++-other/Makefile.am000644 000767 000024 00000000241 12152204465 020721 0ustar00hechtstaff000000 000000 # $Id$ TESTS=lap3-cpu.edp EXTRA_DIST=*.edp speedtest.sh LOG_DRIVER=$(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT=TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw freefem++-3.38-1/examples++-other/Makefile.in000644 000767 000024 00000074011 12543260337 020744 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++-other ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # $Id$ TESTS = lap3-cpu.edp EXTRA_DIST = *.edp speedtest.sh LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-other/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-other/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? lap3-cpu.edp.log: lap3-cpu.edp @p='lap3-cpu.edp'; \ b='lap3-cpu.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am check check-TESTS check-am clean clean-generic \ cscopelist-am ctags-am distclean distclean-generic distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am recheck tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-other/speedtest.sh000755 000767 000024 00000001066 11406142255 021231 0ustar00hechtstaff000000 000000 #!/bin/bash # Speed benchmark for FreeFem++ # $Id$ # The FreeFem++ executable ffexe=${PROGLOC}/nw/FreeFem++-nw${EXEEXT} if test ! -x $ffexe then echo $ffexe non existent exit 1 fi # Write some build information into the trace file echo ------------------------------------------- >> speedtest.out date >> speedtest.out echo CXXFLAGS=$CXXFLAGS >> speedtest.out # Run the actual test $ffexe lap3-cpu.edp \ |grep -E -- \ '-- lap (Cholesky|CG|UMFPACK|LU|Crout) +[0-9]+x[0-9]+' \ |tee -a speedtest.out if test $PIPESTATUS != 0 then exit 1 fi freefem++-3.38-1/examples++-mpi/additional.idp000755 000767 000024 00000016770 12527570472 021172 0ustar00hechtstaff000000 000000 load"medit" int debug =0; /********************************************************************************************/ macro plotMPI(Th, u, legend, Pk, def, d, w) if(mpirank == 0) { meshN ThCurrent = Th; meshN[int] meshTab(mpisize); fespace Xh(ThCurrent, Pk); Xh[int] def(uTab)(mpisize); uTab[0][] = u; meshTab[0] = Th; mpiRequest[int] rq(mpisize - 1); for(i = 1; i < mpisize; ++i) Irecv(processor(i, mpiCommWorld, rq[i - 1]), meshTab[i]); for(i = 1; i < mpisize; ++i) mpiWaitAny(rq); for(i = 1; i < mpisize; ++i) { ThCurrent = meshTab[i]; Irecv(processor(i, mpiCommWorld, rq[i - 1]), uTab[i][]); } for(i = 1; i < mpisize; ++i) mpiWaitAny(rq); plot(uTab, wait = w, nbiso = 40, fill = 1, value = 1, dim = d, cmm = legend); } else { mpiRequest[int] rq(2); Isend(processor(0, rq[0]), Th); Isend(processor(0, rq[1]), u); mpiWait(rq[0]); mpiWait(rq[1]); }// EOM /********************************************************************************************/ macro partition(meshName, borderName, overlapName, s, D, Vh, P, comm) meshName = trunc(overlapName, abs(part - mpiRank(comm)) < 0.1, label = 10); mpiBarrier(comm); real timerPartition = mpiWtime(); { fespace PhLocal(meshName, P0); PhLocal overshoot = hTriangle; real max = 2. * overlap * overshoot[].max; bbN(meshName, max, overlapName) } fespace VhGlobal(overlapName, P1); PhGlobal supp = abs(part - mpiRank(comm)) < 0.1; VhGlobal suppSmooth; AddLayers(overlapName, supp[], overlap * 2, suppSmooth[]); { meshN neighbors = trunc(overlapName, suppSmooth > 0.001 && (suppSmooth < 0.999)); fespace Oh(neighbors, P0); Oh partOverlap = part; Unique(partOverlap[], arrayIntersection); } fespace Vh(meshName, P1); Vh[int] partitionIntersection(arrayIntersection.n); if(s > 1) { overlapName = trunc(overlapName, suppSmooth > 0.001, split = s); supp = abs(part - mpiRank(comm)) < 0.1; suppSmooth = 0; AddLayers(overlapName, supp[], overlap * 2, suppSmooth[]); } overlapName = trunc(overlapName, suppSmooth > (overlap - 0.999)/2/overlap); supp = supp; suppSmooth = suppSmooth; meshName = trunc(overlapName, suppSmooth> 0.5001, label = 10); real oooo = 0.5001-0.5/overlap; borderName = trunc(overlapName, (suppSmooth > oooo) && (suppSmooth < 0.5001), label = 20); Vh khi = max(suppSmooth*overlap*2 - overlap, 0.) / overlap; Vh sum = khi; VhGlobal phi = 0; for(i = 0; i < arrayIntersection.n; ++i) { PhGlobal suppPartition = abs(arrayIntersection[i] - part) < 0.1; AddLayers(overlapName, suppPartition[], overlap, phi[]); bool inter = intN(overlapName)(phi/measureN)>1e-6; if( inter ) { partitionIntersection[numberIntersection] = phi; sum[] += partitionIntersection[numberIntersection][]; arrayIntersection[numberIntersection++] = arrayIntersection[i]; } else if(debug) medit("phi",overlapName,phi); } khi[] = khi[] ./= sum[]; if(solver != 3 && solver != 5) overlapName = minimalMesh; else overlapName = trunc(meshName, khi < 0.99); if(numberIntersection != arrayIntersection.n) arrayIntersection.resize(numberIntersection); { if(verbosity>2) {cout << " **** "<< mpirank << " / "; for(int i=0; i 1e-6); if( debug) cout << mpirank << " xx nb somm " << meshIntersection.nv << endl; fespace WhIntersection(meshIntersection, P); matrix R = interpolate(WhIntersection, Wh); real[int] C; int[int] I; [I, restrictionIntersection[i], C] = R; restrictionIntersection[i].resize(R.nbcoef); if( debug) {savemesh(meshIntersection,"Th/Th-"+mpirank+"-"+arrayIntersection[i]+".mesh"); medit("Th/TTh-"+mpirank+"-"+arrayIntersection[i],meshIntersection,order=0,partitionIntersection[i]); cout < 1) { globalTh(ThOverlap); fespace PhGlobal(ThOverlap, P0); PhGlobal part; part[]=0; if(mpiRank(comm) == 0) { cout.scientific << " --- global mesh of " << ThOverlap.nt << " elements (prior to refinement) generated (in " << mpiWtime() - timing << ") and partitioned with "; timing = mpiWtime(); metisdual(part[], ThOverlap, mpiSize(comm)); cout << "Metis"; cout.scientific << " (in " << mpiWtime() - timing << ")" << endl; } timing = mpiWtime(); broadcast(processor(0, comm), part[]); if(debug) medit("part",ThOverlap,part,order=0); partition(Th, ThBorder, ThOverlap, s, D, Vh, P, comm) } else if(mpisize == 1) { globalTh(Th); D.resize(Wh.ndof); D = 1.; } mpiBarrier(mpiCommWorld); if(mpirank == 0) cout.scientific << " --- partition of unity built (in " << mpiWtime() - timing << ")" << endl; } /*# partitionEnd #*/ // EOM /********************************************************************************************/ macro assemble(mat, rhs, Wh, Th, ThBorder, Varf) real[int] rhs; matrix mat; { /* all memory of objects defined between this set of curly brackets will be freed when the closing bracket is reached */ meshN ThAugmented = Th + ThBorder; /* ⠶$\Omega^{\delta + 1}_k = \Omega^\delta_k \cup \left(\Omega^{\delta + 1}_k \setminus \Omega^{\delta}_k\right)$⠶ */ ThBorder = minimalMesh; Varf(vPb, ThAugmented, PhAugmented) fespace WhAugmented(ThAugmented, Pk); mat = vPb(WhAugmented, WhAugmented/*, solver = CG*/); real[int] rhsFull = vPb(0, WhAugmented); matrix R = interpolate(Wh, WhAugmented); renumbering(mat, R, rhsFull, rhs); } // EOM /********************************************************************************************/ macro assembleUnsym(mat, rhs, Wh, Th, ThBorder, Varf) { Varf(vPb, Th, Ph) mat = vPb(Wh, Wh); } // EOM freefem++-3.38-1/examples++-mpi/AddLayer2d.idp000644 000767 000024 00000003131 12270566741 020754 0ustar00hechtstaff000000 000000 // AddLayer2d.idf file.. version 0. // Frederic Hecht 2010 // LGPL licence // Author Frederic.Hecht@upmc.fr // ------------------------------- func bool same(mesh & Th1,mesh & Th2) { bool ret=0; //cout << mpirank << " same Th ?? " << Th1.nt << " "<< Th2.nt << " " << Th1.nv << " "<< Th2.nv << endl; if(Th1.nt == Th2.nt && Th1.nv == Th2.nv) { fespace V1(Th1,P1); fespace V2(Th2,P1); V1 x1=x,y1=y; V2 x2=x,y2=y; real err1= sqrt(int2d(Th1,qft=qf1pTlump)( square(x-x2) + square(y-y2))); real err2= sqrt(int2d(Th2,qft=qf1pTlump)( square(x-x1) + square(y-y1))); if(err1+err2 < Th1.nv*1e-6) ret=1; else if(verbosity>1) cout << "same no same mesh " << err1 << " " << err2 << endl; } return ret; } func bool AddLayers(mesh & Th,real[int] &ssd,int n,real[int] &unssd) { // build a continuous function uussd (P1) and modifies ssd : // IN: ssd in the caracteristics function on the input sub domain. // OUT: ssd and unssd // such that : // ssd is a boolean function // unssd is a smooth function // ssd = 1 when unssd >0; // add n layer of element (size of the overlap) // and unssd = 0 ouside of this layer ... // --------------------------------- fespace Vh(Th,P1); fespace Ph(Th,P0); Ph s; assert(ssd.n==Ph.ndof); assert(unssd.n==Vh.ndof); unssd=0; s[]= ssd; Vh u; varf vM(uuuu,v)=int2d(Th,qforder=1)(uuuu*v/area); matrix M=vM(Ph,Vh); for(int i=0;i.1; unssd+= u[]; s[]= M'*u[]; s = s >0.1; } unssd /= (n); u[]=unssd; ssd=s[]; return true; } freefem++-3.38-1/examples++-mpi/AddLayer3d.idp000644 000767 000024 00000003204 11745333166 020755 0ustar00hechtstaff000000 000000 // AddLayer2d.idf file.. version 0. // Frederic Hecht 2010 // LGPL licence // Author Frederic.Hecht@upmc.fr // ------------------------------- func bool same(mesh3 & Th1,mesh3 & Th2) { bool ret=0; //cout << mpirank << " same Th ?? " << Th1.nt << " "<< Th2.nt << " " << Th1.nv << " "<< Th2.nv << endl; if(Th1.nt == Th2.nt && Th1.nv == Th2.nv) { fespace V1(Th1,P1); fespace V2(Th2,P1); V1 x1=x,y1=y,z1=z; V2 x2=x,y2=y,z2=z; real err1= sqrt(int3d(Th1,qft=qf1pTlump)( square(x-x2) + square(y-y2)+ square(z-z2))); real err2= sqrt(int3d(Th2,qft=qf1pTlump)( square(x-x1) + square(y-y1)+ square(z-z1))); if(err1+err2 < Th1.nv*1e-6) ret=1; else if(verbosity>1) cout << "same no same mesh " << err1 << " " << err2 << endl; } return ret; } func bool AddLayers(mesh3 & Th,real[int] &ssd,int n,real[int] &unssd) { // build a continuous function uussd (P1) and modifies ssd : // IN: ssd in the caracteristics function on the input sub domain. // OUT: ssd and unssd // such that : // ssd is a boolean function // unssd is a smooth function // ssd = 1 when unssd >0; // add n layer of element (size of the overlap) // and unssd = 0 ouside of this layer ... // --------------------------------- fespace Vh(Th,P1); fespace Ph(Th,P0); Ph s; assert(ssd.n==Ph.ndof); assert(unssd.n==Vh.ndof); unssd=0; s[]= ssd; Vh u; varf vM(uuuu,v)=int3d(Th,qforder=1)(uuuu*v/volume); matrix M=vM(Ph,Vh); for(int i=0;i.1; unssd+= u[]; s[]= M'*u[]; s = s >0.1; } unssd /= (n); u[]=unssd; ssd=s[]; return true; } freefem++-3.38-1/examples++-mpi/beam-3d-matrix-pastix.edp000644 000767 000024 00000004201 11745333166 023053 0ustar00hechtstaff000000 000000 // other load "medit" load "real_pastix_FreeFem" include "cube.idp" real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; int[int] Nxyz=[40,8,8]; real [int,int] Bxyz=[[0.,5.],[0.,1.],[0.,1.]]; int [int,int] Lxyz=[[1,1],[2,2],[2,2]]; mesh3 Th=Cube(Nxyz,Bxyz,Lxyz); real E = 21.5e4; real sigma = 0.29; real mu = E/(2*(1+sigma)); real lambda = E*sigma/((1+sigma)*(1-2*sigma)); real gravity = -0.05; fespace Vh(Th,[P2,P2,P2]); //fespace Vh(Th,[P1,P1,P1]); Vh [u1,u2,u3], [v1,v2,v3]; cout << "lambda,mu,gravity ="<8000) lerr=0.01; if(re>10000) lerr=0.005; for(int step=0;step<2;step++) { Th=adaptmesh(Th,[u1,u2],p,err=lerr,nbvx=100000); //plot(Th,wait=0); [u1,u2,p]=[u1,u2,p]; [up1,up2,pp]=[up1,up2,pp]; for (i=0;i<=20;i++) { nu =1./re; up1[]=u1[]; real[int] b = vNS(0,XXMh,tgv=ttgv); matrix Ans=vDNS(XXMh,XXMh,tgv=ttgv); set(Ans,solver=sparsesolver,tgv=ttgv,sparams=ssparams); real[int] w = Ans^-1*b; u1[] -= w; cout << " iter = "<< i << " " << w.l2 << " rey = " << re << endl; if(w.l2<1e-6) break; // uu1=u1;uu2=u2; //plot(coef=0.2,cmm=" [u1,u2] et p ",p,[uu1,uu2]); } ; } uu1=u1;uu2=u2; streamlines; if( mpirank==0) plot(coef=0.2,cmm="rey="+re+" [u1,u2] et p ",psi,[uu1,uu2],wait=0,nbiso=20,ps="cavity-"+re+".ps"); } freefem++-3.38-1/examples++-mpi/chaleur3D-hips.edp000644 000767 000024 00000000415 11745333166 021611 0ustar00hechtstaff000000 000000 // NBPROC 5 // bug with 4 proc very strange (Debug in progress) //ff-mpirun -np 4 chaleur3D-mumps.edp -glut ffglut -n 20 -op 1 -dt 0.01 -niter 10 load "hips_FreeFem" real ttgv=1e10; string ssparams="";//"nprow=1, npcol="+mpisize; verbosity=4; include "Heat3d.idp" freefem++-3.38-1/examples++-mpi/chaleur3D-hypre.edp000644 000767 000024 00000005172 11745333166 022002 0ustar00hechtstaff000000 000000 // other load "msh3" load "medit" load "hypre_FreeFem" real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; func bool GetNoBC(matrix & A,real[int] & in) { // def a array in such what // on unkwnon i // in[i] = 1 if no boundary condition // in[i] = 0 if boundary condition in = A.diag ; // take the daig of the matrix real tgv = in.max ; for(int i=0 ;i #include #include #include #include #include #include #include #include "pastix_int_complex.h" #undef memFree_null #define memFree_null(x) {if (x ==NULL) {fprintf(stdout,"%s:%d freeing NULL\n",__FILE__,__LINE__);} free(x); x=NULL;} #define STR_SIZE 256 static pastix_int_t * pastixint(int * ii){ return (pastix_int_t*) (void *) ii;} static pastix_float_t * pastixfloat(Complex * ii){ return (pastix_float_t*) (void *) ii;} typedef struct pastix_param { pastix_data_t *pastix_data; /*Pointer used by PaStiX to keep information alive between calls */ MPI_Comm comm; /* Communicator used by PaStiX */ pastix_int_t Ncol; /* Size of the Matrix */ pastix_int_t *ia; /* Index of first element of each column in ja and avals */ pastix_int_t *ja; /* Rows of the unknows of the matrix */ pastix_float_t *avals; /* Values of the matrix */ pastix_int_t *perm; /* Permutation used for re-numbering of the unknowns */ pastix_int_t *invp; /* Inverse permutation */ pastix_float_t *rhs; /* Right hand side */ pastix_int_t *iparm; /* Integer parameters */ double *dparm; /* Floating parameters */ } pastix_param_t; void Morse_to_CSC(int m, int n, int nnz, Complex *a, int *colind, int *rowptr, pastix_float_t **at, pastix_int_t **rowind, pastix_int_t **colptr) { register int i, j, col, relpos; pastix_int_t *marker; /* Allocate storage for another copy of the matrix. */ *at = (pastix_float_t *) malloc(sizeof(pastix_float_t)*nnz); *rowind = (pastix_int_t *) malloc(sizeof(pastix_int_t)*nnz); *colptr = (pastix_int_t *) malloc(sizeof(pastix_int_t)*(n+1)); marker = (pastix_int_t *) malloc(sizeof(pastix_int_t)*n); for (i = 0; i < n; ++i) marker[i] = 0; /* Get counts of each column of A, and set up column pointers */ for (i = 0; i < m; ++i) for (j = rowptr[i]; j < rowptr[i+1]; ++j) ++marker[colind[j]]; (*colptr)[0] = 0; for (j = 0; j < n; ++j) { (*colptr)[j+1] = (*colptr)[j] + marker[j]; marker[j] = (*colptr)[j]; } /* Transfer the matrix into the compressed column storage. */ for (i = 0; i < m; ++i) { for (j = rowptr[i]; j < rowptr[i+1]; ++j) { col = colind[j]; relpos = marker[col]; (*rowind)[relpos] = i; (*at)[relpos] = a[j]; ++marker[col]; } } free(marker); } static const int MAX_CHAR_PER_LINE=256; //void read_datafile_pastixff(const string &datafile, pastix_int_t *iparmtab, double *dparmtab){ void read_datafile_pastixff(const string &datafile, int &mpi_flag, pastix_int_t *iparmtab, double *dparmtab){ FILE* m_File; int i = 0; char szbuff[MAX_CHAR_PER_LINE]; char* token; char filename[datafile.size()+1]; strcpy( filename, datafile.c_str()); m_File = fopen(filename,"rt"); if(!m_File) { printf("error in reading filename %s\n",filename); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"matrix") == 0) ){ printf("freefem++: error in reading matrix parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading matrix parameter for pastix \n"); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if(strcmp(token,"assembled") == 0) mpi_flag = 0; else if(strcmp(token,"distributedglobal") == 0) mpi_flag = 1; else if(strcmp(token,"distributed") == 0) mpi_flag = 2; else{ printf("value of parameter matrix is not correct %s \n", token ); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"iparm") == 0) ){ printf("freefem++: error in reading iparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading iparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); iparmtab[i] = (pastix_int_t)atol(token); i++; } i=0; fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"dparm") == 0) ){ printf("freefem++: error in reading dparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading dparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); dparmtab[i] = atof(token); i++; } fclose(m_File); #ifdef OOC /* if (iparmtab[IPARM_OOC_THREAD] > 1) */ iparmtab[IPARM_OOC_THREAD] = 1; #endif /* On empeche le 2d avec NUMA_ALLOC */ #ifdef NUMA_ALLOC if (iparmtab[IPARM_DISTRIBUTION_LEVEL] != 0) { errorPrint("2D not available with NUMA allocation\n"); exit(-1); } #endif } // ATTENTION :: pastix_float_t // peut tre soit un complex ou un reel cela depend de la maniere dont on a compiler pastix // CAS COMPLEX SEULEMENT class zSolvepastixmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 int paraoption; int myid, mpi_size; int Nrow; int mpi_flag; int init_raff; int thrd_flag; int SYM; string data_option; mutable pastix_int_t iparm[64]; mutable double dparm[64]; mutable pastix_int_t Ncol; mutable pastix_int_t *ia; mutable pastix_int_t *ja; mutable pastix_float_t *avals; mutable pastix_int_t *loc2glob; //char *Type = NULL; //char *RhsType = NULL; mutable pastix_float_t *rhs; mutable pastix_int_t *perm; mutable pastix_int_t *invp; mutable pastix_data_t *pastix_data; MPI_Comm commworld ; public: zSolvepastixmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN &pperm_c,void * ccommworld) : eps(epsilon),epsr(0), tgv(ttgv),tol_pivot_sym(pivot_sym),tol_pivot(pivot), data_option(datafile) { commworld = ccommworld ? *static_cast( ccommworld) : MPI_COMM_WORLD; //KN_ param_int(pparam_int); //KN_ param_double(pparam_double); //int m; //int ierr; struct timeval tv1, tv2; int nnz; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); ia = NULL; ja = NULL; avals = NULL; loc2glob = NULL; rhs = NULL; pastix_data = NULL; // matrix assembled on host MPI_Comm_rank(commworld, &myid); printf("- Rang MPI : %d\n", myid); MPI_Comm_size(commworld, &mpi_size); // SYMETRIQUE // MPI_flag need to unselect for non distributed matrix mpi_flag = 0; thrd_flag = 0; // ###################### //pastix_int_t init_raff; fprintf(stdout,"-- INIT PARAMETERS --\n"); // reading iparm from array if(!data_option.empty()){ read_datafile_pastixff(data_option,mpi_flag,iparm,dparm); if(mpi_flag != 0) cerr << "ERROR :: GLOBAT INPUT MATRIX FOR ALL PROCS matrix=assembled" << endl; } else if( !(param_int==NULL) || !(param_double==NULL)){ if( ! (param_int==NULL) ) { cout << "internal param_int" << endl; assert(param_int.N() == 64); for(int ii=0; ii<64; ii++) iparm[ii] = param_int[ii]; iparm[IPARM_MODIFY_PARAMETER] = API_YES; } if( !(param_double==NULL) ) { cout << "internal param_double" << endl; assert(param_double.N() == 64); for(int ii=0; ii<64; ii++) dparm[ii] = param_double[ii]; } } else{ iparm[IPARM_MODIFY_PARAMETER] = API_NO; cout << "initialize default parameter" << endl; } //################################ if(myid == 0){ Ncol = AA.m; Nrow = AA.n; nnz = AA.nbcoef; // Avant : on ecrit la transpose // AA.cl : indices des colonnes // AA.lg : pointeurs des lignes Morse_to_CSC( AA.n , AA.m, AA.nbcoef, AA.a, AA.cl, AA.lg, &avals, &ja, &ia); // ia : pointeurs des colonnes // ja : indices des lignes cout << "AA.n= "<< AA.n << " AA.m=" << AA.m << " AA.nbcoef=" << AA.nbcoef << endl; for(int ii=0; ii < Ncol+1; ii++){ ia[ii] = ia[ii]+1; } assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++){ ja[ii] = ja[ii]+1; } MPI_Bcast( &Ncol, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &Nrow, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &nnz, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, commworld ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, commworld ); } else{ MPI_Bcast( &Ncol, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &Nrow, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &nnz, 1, MPI_PASTIX_INT, 0, commworld ); avals = (pastix_float_t *) malloc( nnz*sizeof(pastix_float_t) ); ia = (pastix_int_t *) malloc( (Ncol+1)*sizeof(pastix_int_t) ); ja = (pastix_int_t *) malloc( nnz*sizeof(pastix_int_t) ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, commworld ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, commworld ); } perm = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); invp = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); rhs = (pastix_float_t *) malloc(Ncol*sizeof(pastix_float_t)); // reading permutation given by the user if(pperm_r) for(int ii=0; ii < Ncol; ii++) perm[ii] = pperm_r[ii]; if(pperm_c) for(int ii=0; ii < Ncol; ii++) invp[ii] = pperm_c[ii]; iparm[IPARM_START_TASK] = API_TASK_INIT; iparm[IPARM_END_TASK] = API_TASK_INIT; iparm[IPARM_SYM] = API_SYM_NO; // Matrix is considered nonsymetric if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; fprintf(stdout,"-- FIN INIT PARAMETERS --\n"); init_raff = iparm[IPARM_ITERMAX]; cout << "init_raff=" << init_raff << endl; fflush(stdout); /* Passage en mode verbose */ iparm[IPARM_RHS_MAKING] = API_RHS_B; if( (param_int==NULL) && data_option.empty() ){ iparm[IPARM_MATRIX_VERIFICATION] = API_YES; iparm[IPARM_REFINEMENT] = API_RAF_GMRES; iparm[IPARM_INCOMPLETE] = API_NO; } if( (param_double==NULL) && data_option.empty()){ dparm[DPARM_EPSILON_REFINEMENT] = 1e-12; dparm[DPARM_EPSILON_MAGN_CTRL] = 1e-32; } // cscd_checksym(Ncol, ia, ja, loc2glob, commworld); // if (iparm[IPARM_SYM]==API_SYM_YES) // { // /* Symetric problem */ // /* Build non oriented graph */ // /* build non symmetric csc from symmetric csc */ // /*maillage global*/ // INT *tmpia; // INT *tmpja; // INT tmpn; // cscd_symgraph_int(*n2, *col2, *row2 , NULL, // &tmpn, &tmpia, &tmpja, NULL, // *loc2glob2, pastix_comm, API_YES); // memFree_null(*col2); // *col2 = tmpia; // memFree_null(*row2); // *row2 = tmpja; // *n2 = tmpn; // } SYM = AA.symetrique; cout << "SYM = "<< SYM << endl; // SYMETRIQUE if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } /* Scotch */ fprintf(stdout,"-- Scotch --\n"); fflush(stdout); iparm[IPARM_START_TASK] = API_TASK_ORDERING; iparm[IPARM_END_TASK] = API_TASK_ORDERING; if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; iparm[IPARM_SYM] = API_SYM_NO; /* Fax */ fprintf(stdout,"-- Fax --\n"); iparm[IPARM_START_TASK] = API_TASK_SYMBFACT; iparm[IPARM_END_TASK] = API_TASK_SYMBFACT; if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Blend */ fprintf(stdout,"-- Blend --\n"); iparm[IPARM_START_TASK] = API_TASK_ANALYSE; iparm[IPARM_END_TASK] = API_TASK_ANALYSE; if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Factorisation */ iparm[IPARM_START_TASK] = API_TASK_NUMFACT; iparm[IPARM_END_TASK] = API_TASK_NUMFACT; gettimeofday(&tv1, NULL); fprintf(stdout,"-- SOPALIN --\n"); if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call factorization : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; //for(int ii=0; ii < ia[Ncol]-1; ii++) // ja[ii] = ja[ii]-1; if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " pastix : time factorization :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { struct timeval tv1, tv2; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); // index for pastix for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]+1; for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]+1; // give value of the second member for(int ii=0; ii < Ncol; ii++){ rhs[ii] = b[ii]; } //fprintf(stdout,"SOLVE STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* updo */ iparm[IPARM_START_TASK] = API_TASK_SOLVE; iparm[IPARM_END_TASK] = API_TASK_SOLVE; iparm[IPARM_RHS_MAKING] = API_RHS_B; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call updown : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); if(verbosity > 1) for(int jj=0; jj < Ncol; jj++) cout << "rhs["<< jj << "]=" << rhs[jj] << endl; //fprintf(stdout,"RAFF STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* raff */ iparm[IPARM_START_TASK] = API_TASK_REFINE; iparm[IPARM_END_TASK] = API_TASK_REFINE; iparm[IPARM_RHS_MAKING] = API_RHS_B; iparm[IPARM_ITERMAX] = init_raff; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call refinement : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < Ncol; ii++) x[ii] = rhs[ii]; // index for freefem for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; //for(int ii=0; ii < ia[Ncol]-1; ii++) // ja[ii] = ja[ii]-1; if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " pastix : time solve :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverpastix_complex_mpi(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverpastix_complex_mpi" << endl; return new zSolvepastixmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c,ds.commworld); } /* class Init { public: Init(); };*/ // the 2 default sparse solver double and complex //DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; //DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return false; } bool Setpastixmpi() { if(verbosity) cout << " SetDefault sparse solver to pastixmpi" << endl; //DefSparseSolver::solver =BuildSolverpastix_complex_mpi; DefSparseSolver::solver =BuildSolverpastix_complex_mpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return false; } static void Load_Init() { //SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pastix, defaultsolver defaultsolverpastix" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; //DefSparseSolver::solver =BuildSolverpastix_complex_mpi; DefSparseSolver::solver =BuildSolverpastix_complex_mpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("complexdefaulttopastix","(",new OneOperator0(Setpastixmpi)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/complex_SuperLU_DIST_FreeFem.cpp000644 000767 000024 00000060146 12500061201 024333 0ustar00hechtstaff000000 000000 // for automatic compilation with ff-c++ // FFCS - 23/5/12 - remove metis dependency because it interfers with identically-named libmetis.a from parmetis //ff-c++-LIBRARY-dep: superlu_dist ptscotchparmetis ptscotch scotchmetis scotch mpi blas fc //ff-c++-cpp-dep: // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* Interface freefem++ et SuperLU_DIST_2.3 /bin/sh ff-mpic++ zSuperLU_DIST.cpp -I/Users/morice/librairie/SuperLU_DIST_2.3/SRC/ -L/Users/morice/librairie/openmpi/lib/ -lmpi -lopen-pal -lopen-rte -L/Users/morice/librairie/PATCHVECLIB/ -lwrapperdotblas -framework veclib -L/Users/morice/librairie/ParMetis-3.1/ -lparmetis -lmetis -L/Users/morice/librairie/SuperLU_DIST_2.3/lib/ -lsuperlu_dist_2.3 */ // FFCS - required to define __int64 for MSMPI #include #include #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "superlu_zdefs.h" #include "ffsuperludistoption.hpp" template struct SuperLUmpiDISTDriver { }; template <> struct SuperLUmpiDISTDriver { /* Driver routines */ /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_Z;} static doublecomplex *dc(Complex *p) { return (doublecomplex *) (void *) p;} static doublecomplex **dc(Complex **p) { return (doublecomplex **) (void *) p;} // Remplacement doublecomplex par Complex static void pgssvx(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, Complex *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, SOLVEstruct_t *p9, double *p10, SuperLUStat_t *p11, int *p12) { pzgssvx( p1,p2,p3, dc(p4),p5,p6,p7,p8,p9,p10,p11,p12 ); } static void pgssvx_ABglobal(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, Complex *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, double *p9, SuperLUStat_t *p10, int *p11) { pzgssvx_ABglobal( p1,p2,p3, dc(p4),p5,p6,p7,p8,p9,p10,p11 ); } static void Create_CompCol_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, Complex *p5, int_t *p6, int_t *p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { zCreate_CompCol_Matrix_dist( p1,p2,p3, p4,dc(p5),p6,p7,p8,p9,p10 ); } static void Create_CompRowLoc_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, int_t p5, int_t p6, Complex *p7, int_t *p8, int_t *p9, Stype_t p10, Dtype_t p11, Mtype_t p12) { zCreate_CompRowLoc_Matrix_dist( p1,p2,p3, p4,p5,p6,dc(p7),p8,p9,p10,p11,p12 ); } static void CompRow_to_CompCol_dist(int_t p1, int_t p2, int_t p3, Complex *p4, int_t *p5, int_t *p6, Complex **p7, int_t **p8, int_t **p9) { zCompRow_to_CompCol_dist( p1,p2,p3, dc(p4),p5,p6,dc(p7),p8,p9 ); } static void Create_Dense_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, Complex *p4, int_t p5, Stype_t p6, Dtype_t p7,Mtype_t p8) { zCreate_Dense_Matrix_dist( p1,p2,p3, dc(p4),p5,p6,p7,p8 ); } static void Create_SuperNode_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, Complex *p5, int_t *p6, int_t *p7, int_t *p8, int_t *p9, int_t *p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { zCreate_SuperNode_Matrix_dist( p1,p2,p3, p4,dc(p5),p6,p7,p8,p9,p10,p11,p12,p13 ); } static void Print_CompRowLoc_Matrix_dist(SuperMatrix *p1) { zPrint_CompRowLoc_Matrix_dist(p1); } }; template class ZSolveSuperLUmpi : public MatriceMorse::VirtualSolver, public SuperLUmpiDISTDriver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 //mutable char equed[1]; //yes_no_t equil; mutable SuperMatrix A; NCformat *Astore; //NCformat *Ustore; //SCformat *Lstore; mutable superlu_options_t options; mutable mem_usage_t mem_usage; mutable ScalePermstruct_t ScalePermstruct; mutable LUstruct_t LUstruct; mutable SOLVEstruct_t SOLVEstruct; mutable gridinfo_t grid; string string_option; string data_option; R *a; int *asub, *xa; int_t m, n, nnz; // rajout pour // int_t nprow,npcol; /* process rows and process columns*/ int matrixdist; // type of distributed matrix MPI_Comm commworld ; static const int assembled =0; static const int distributedglobal =1; static const int distributed =2; public: ZSolveSuperLUmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string datafile, string param_char, KN &pperm_r, KN &pperm_c, void * ccommworld ) : eps(epsilon),epsr(0), tgv(ttgv),string_option(param_char),data_option(datafile), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { commworld = ccommworld ? *static_cast( ccommworld) : MPI_COMM_WORLD; R* B; //R* X; SuperLUStat_t stat; int info, ldb, nrhs=0; int i; double* berr; int iam; // Add for distributed matrix int_t m_loc, m_loc_fst, fst_row, nnz_loc, fst_nnz; R *aloc; int *asubloc, *xaloc; // End Add for distributed matrix // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); A.Store=0; /* Defaults */ nrhs = 0; /* lecture de nprow and npcol */ // Cas max deux procs nprow = 1; MPI_Comm_size(commworld,&npcol); matrixdist=0; /* set the default options */ set_default_options_dist(&options); DiagScale_t optionDiagScale; //if(verbosity > 10) print_options_dist(&options); if(!string_option.empty()) read_nprow_npcol_freefem( &string_option, &nprow, &npcol, &matrixdist); if(!string_option.empty()) read_options_freefem(&string_option,&options,&optionDiagScale); if(!data_option.empty()) read_options_superlu_datafile(&data_option,&options,&nprow, &npcol, &matrixdist,&optionDiagScale); //if(verbosity > 10) print_options_dist(&options); /* ------------------------------------------------------------ INITIALIZE THE SUPERLU PROCESS GRID. ------------------------------------------------------------*/ cout << "Complex superlu_gridinit " << commworld << " "<< ccommworld << " : " << nprow << "X" << npcol <= nprow * npcol ){ //superlu_gridexit(&grid); printf("this process is not used in superlu %d \n",iam); } else { // matrix to procs and vectors if( matrixdist == assembled ){ if(!iam){ cout << "iam=" << iam << endl; printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; assert( AA.lg[n] == nnz ); printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* transform Row to Col */ // cela coute cher comme fonction // // dallocateA_dist(n, nnz, &a, &asub, &xa); // dCompRow_to_CompCol_dist(m,n,nnz,arow,asubrow,xarow,&a,&asub,&xa); // FFCS - "this->" required by g++ 4.7 this->CompRow_to_CompCol_dist(m,n,nnz,AA.a,AA.cl,AA.lg,&a,&asub,&xa); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } else{ /* printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ // FFCS - "this->" required by g++ 4.7 zallocateA_dist(n, nnz, this->dc(&a), &asub, &xa); MPI_Bcast( a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); cout << "Debut: Create_CompCol_Matrix_dist" <" required by g++ 4.7 this->Create_CompCol_Matrix_dist(&A, m, n, nnz, a, asub, xa, SLU_NC, R_SLU, SLU_GE); cout << "Fin: Create_CompCol_Matrix_dist" <::pgssvx_ABglobal(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } //########################################################## // // matrix distributed with matrix global given // //########################################################## else if( matrixdist == distributedglobal) { if(!iam){ printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; a=AA.a; asub=AA.cl; xa=AA.lg; xa[n] = nnz; printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( AA.cl, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.lg, n+1, mpi_int_t, 0, grid.comm ); } else { printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ // FFCS - "this->" required by g++ 4.7 zallocateA_dist(n, nnz, this->dc(&a), &asub, &xa); MPI_Bcast( a, nnz, SuperLU_MPI_DOUBLE_COMPLEX, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } /* Compute the number of rows to be distributed to local process */ m_loc = m / (grid.nprow * grid.npcol); m_loc_fst = m_loc; /* When m / procs is not an integer */ if ((m_loc * grid.nprow * grid.npcol) != m) { /*m_loc = m_loc+1; m_loc_fst = m_loc;*/ if (iam == (grid.nprow * grid.npcol - 1)) /* last proc. gets all*/ m_loc = m - m_loc * (grid.nprow * grid.npcol - 1); } fst_row = iam * m_loc_fst; nnz_loc = xa[fst_row+m_loc]-xa[fst_row]; // FFCS - "this->" required by g++ 4.7 zallocateA_dist(m_loc, nnz_loc, this->dc(&aloc), &asubloc, &xaloc); //xaloc = (int_t*) intMalloc_dist(m_loc+1); for(int ii=0; ii < m_loc; ii++){ xaloc[ii] = xa[fst_row+ii]-xa[fst_row]; } xaloc[m_loc]=nnz_loc; fst_nnz = xa[fst_row]; //aloc = new R[nnz_loc]; //aloc = (Complex*) doubleMalloc_dist(nnz_loc); //asubloc = (int_t*) intMalloc_dist(nnz_loc); for(int ii=0; ii < nnz_loc; ii++){ aloc[ii] = a[fst_nnz+ii]; asubloc[ii] = asub[fst_nnz+ii]; } if( iam ){ SUPERLU_FREE( a ); SUPERLU_FREE( asub ); SUPERLU_FREE( xa ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); if(verbosity) cout << "Debut: Create_CompRowCol_Matrix_dist" <" required by g++ 4.7 if(verbosity) this->Create_CompRowLoc_Matrix_dist(&A, m, n, nnz_loc, m_loc, fst_row, aloc, asubloc, xaloc, SLU_NR_loc, R_SLU, SLU_GE); cout << "Fin: Create_CompRowCol_Matrix_dist" <::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } else if( matrixdist == distributed) { printf("in construction\n"); exit(1); } else{ printf("matrix choice for SuperLU_DIST is assembled, distributedglobal and distributed \n"); exit(1); } delete [] B; options.Fact = FACTORED; /* Indicate the factored form of A is supplied. */ nrhs=1; SUPERLU_FREE(berr); if(iam==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "SuperLU_DIST : time factorisation :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { R* B; SuperLUStat_t stat; int iam; int info=0, ldb=m, nrhs=1; int i; double* berr; double ferr; double rpg, rcond; int_t m_loc,m_loc_fst,fst_row; // time variables long int starttime,finishtime; long int timeused; iam = grid.iam; if( iam < nprow*npcol){ if(verbosity) starttime = clock(); if(n != m) exit(1); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); nrhs= 1; /* Initialize the statistics variables. */ PStatInit(&stat); /* cas matrix assembled */ if( matrixdist == assembled ){ if( !(B = new R[m*nrhs] ) ){ printf("probleme d allocation\n"); exit(1); } for(int ii=0; ii::pgssvx_ABglobal (&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if(verbosity) PStatPrint(&options, &stat, &grid); for(int ii=0; ii::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if ( !(xtemp = new R[AA.n]) ){ printf("probleme d allocation de xtemp\n"); exit(1); } int disp[nprow*npcol]; MPI_Allgather(&fst_row, 1, MPI_INT, disp, 1, MPI_INT, grid.comm); int recv[nprow*npcol]; MPI_Allgather(&m_loc, 1, MPI_INT, recv, 1, MPI_INT, grid.comm); MPI_Allgatherv(B, m_loc, SuperLU_MPI_DOUBLE_COMPLEX, xtemp, recv, disp, SuperLU_MPI_DOUBLE_COMPLEX, grid.comm); for(int ii= 0; ii< AA.n ; ii++) x[ii] = xtemp[ii]; if(verbosity) cout << " x min max " << x.min() << " " < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverSuperLUmpi(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverSuperLUmpi" << endl; return new ZSolveSuperLUmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.sparams, ds.perm_r, ds.perm_c, ds.commworld); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex //DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; //DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return false; } bool SetSuperLUmpi() { if(verbosity) cout << " SetDefault sparse solver to SuperLUmpi double" << endl; //DefSparseSolver::solver =BuildSolverSuperLUmpi; DefSparseSolver::solver =BuildSolverSuperLUmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return false; } static void Load_Init() { //SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Complex SuperLU_DIST, defaultsolver defaultsolverSuperLUdist" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; //DefSparseSolver::solver =BuildSolverSuperLUmpi; DefSparseSolver::solver =BuildSolverSuperLUmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("complexdefaulttoSuperLUdist","(",new OneOperator0(SetSuperLUmpi)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/DDM-funcs-v2.idp000644 000767 000024 00000014473 12504056356 021115 0ustar00hechtstaff000000 000000 NewMacro DMMDeffuncAndGlobals(prefix,comm,jpart,Whi,Vhc,Pknbcomp,Ai,vPbC,onG10,Pii,Usend,Vrecv,U2V) /* */ int prefix#rgmres=0; int prefix#kiter=-1; /* the global name user... */ /* jpart,njpart : partition Usend, Vrecv : buffer Ai , Bi rMj, sMj : matrices onG10: tgv only on DDM s Gamma and not on Gamma */ /*---- for coarse solver ... */ matrix prefix#AC,prefix#Rci,prefix#Pci;/**/ { int[int] Sigma11=U2V; prefix#Pci= interpolate(Whi,VhC,U2Vc=Sigma11); prefix#Rci = prefix#Pci'*Pii; /*Rci= interpolate(Whi,VhC,t=1,U2Vc=Sigma11(0:Pknbcomp-1)); Pci = Pii*Rci'; */ } /*----End of Global Def -------------*/ /*-----------------*/ /*-----------------*/ func bool prefix#Update(real[int] &ui, real[int] &vi) { for(int j=0;j I ~ - C1AC2A +C1A +C2A New Prec P= C1+C2 - C1AC2 = C1(I- A C2) +C2 ( C1(I- A C2) +C2 ) Uo V = - C2*Uo .... */ real[int] V(U.n); prefix#CoarseSolve(V,U,comm); V = -V; /* -C2*Uo */ U += Ai*V; /* U = (I-A C2) Uo */ real[int] b= onG10 ? 0. : U; U = Ai^-1*b; /* ( C1( I -A C2) Uo */ V = U -V; /**/ prefix#Update(V,U); return U; } /*-----------------*/ /*-----------------*/ /*-----------------*/ func real[int] prefix#PDJC2(real[int]& U) /* bogus ???? */ { /* Precon C1= precon Coarse C2 precon Precon Idea : F. Nataf. 0 ~ (I C1A)(I-C2A) => I ~ - C1AC2A +C1A +C2A New Prec P= C1+C2 - C1AC2 = C1(I- A C2) +C2 ( C1(I- A C2) +C2 ) Uo V = - C2*Uo .... V = - C2 Uo W = Uo + A V V + C1 W */ real[int] V(U.n); real[int] b= onG10 ? 0. : U; V = Ai^-1*b; b=U; V = -V; prefix#Update(V,U); U += Ai*V; prefix#CoarseSolve(U,b,comm); V = U -V; prefix#Update(V,U); return U; } /*-----------------*/ /*-----------------*/ /*-----------------*/ func real[int] prefix#DJ0(real[int]& U) { ++prefix#kiter; real[int] V(U.n); real[int] b= onG10 .* U; b = onG10 ? b : Bi ; V = Ai^-1*b; prefix#Update(V,U); V -= U; return V; } /*-----------------*/ /*-----------------*/ /*-----------------*/ func bool prefix#CheckUpdate() { /* verification.....*/ Whi defPk#Pknbcomp(u,) =Times#Pknbcomp(1),defPk#Pknbcomp(v,); prefix#Update(u[],v[]); u[]-=v[]; if(mpirank==0) cout << "CheckUpdate " << u[].linfty << endl; if(u[].linfty>1e-6) plot(u,cmm="bug ????"); assert( u[].linfty<1e-6); return 1; } func bool prefix#Saveff(string sff,real epss,int ksplit,int nloc,int sizeoverlaps) { if(sff != "") { ofstream ff(sff+".txt",append); cout << " ++++ " ; cout << mpirank <<"/" << mpisize << " k=" << ksplit << " n= " << nloc << " " << sizeoverlaps << " it= " << prefix#kiter ; for (int i=1; i=3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",1); int nloc = getARGV("-n",10); string sff=getARGV("-p",""); int gmres=getARGV("-gmres",3); int nC = getARGV("-N" ,max(nloc/10,5)); int sizeoverlaps=1; // size of overlap bool RAS=1; // select kind of of $\pi_i$ if(mpirank==0 && verbosity) cout << " vdebug: " << vdebug << " kspilt "<< ksplit << " nloc "<< nloc << " sff "<< sff <<"."<< endl; string sPk="P2-Lame-2gd"; func Pk=[P2,P2]; func bool plotMPIall(mesh &Th,real[int] & u,string cm) {if(vdebug) PLOTMPIALLU(mesh,Pk, defPk2, Th, u, allu1, { cmm=cm,nbiso=10,fill=1,dim=3,value=1}); return 1;} mpiComm comm(mpiCommWorld,0,0);// trick : make a no split mpiWorld int ipart= mpiRank(comm); // current partition number if(ipart==0) cout << " Final N=" << ksplit*nloc << " nloc =" << nloc << " split =" << ksplit << endl; int[int] l111=[2,2,2,1]; settt mesh Thg=square(nloc*4,nloc,[x*4,y],label=l111); mesh ThC=square(nC*4,nC,[x*4,y],label=l111);// Coarse Mesh fespace VhC(ThC,[P1,P1]); // of the coarse problem.. BuildPartitioning(sizeoverlaps,mesh,Thg,Thi,aThij,RAS,pii,jpart,comm,vdebug) if(ksplit>1) { for(int jp=0;jp=3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",1); int nloc = getARGV("-n",5); string sff=getARGV("-p",""); int gmres=getARGV("-gmres",3); int nC = getARGV("-N" ,max(nloc/10,5)); int sizeoverlaps=1; // size of overlap bool RAS=1; if(mpirank==0 && verbosity) cout << " vdebug: " << vdebug << " kspilt "<< ksplit << " nloc "<< nloc << " sff "<< sff <<"."<< endl; string sPk="P2-Lame-3gd"; func Pk=[P2,P2,P2]; func bool plotMPIall(mesh3 &Th,real[int] & u,string cm) {if(vdebug) PLOTMPIALLU(mesh3,Pk, defPk3, Th, u, allu2, { cmm=cm,nbiso=20,fill=1,dim=3,value=1}); return 1;} mpiComm comm(mpiCommWorld,0,0);// trick : make a no split mpiWorld int ipart= mpiRank(comm); // current partition number if(ipart==0) cout << " Final N=" << ksplit*nloc << " nloc =" << nloc << " split =" << ksplit << endl; int[int] l111=[1,1,1,1]; settt int[int,int] LL=[[1,1],[2,1],[1,1]]; real[int,int] BB=[[0,1],[0,5],[0,1]]; int[int] NN=[nloc,nloc*5,nloc]; int[int] NNC=[nC,nC*5,nC]; settt mesh3 Thg=Cube(NN,BB,LL); mesh3 ThC=Cube(NNC,BB,LL); fespace VhC(ThC,[P1,P1,P1]); // of the coarse problem.. BuildPartitioning(sizeoverlaps,mesh3,Thg,Thi,aThij,RAS,pii,jpart,comm,vdebug) if(ksplit>1) { for(int jp=0;jp=3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",1); int nloc = getARGV("-n",10); string sff=getARGV("-p",""); int gmres=getARGV("-gmres",3); int nC = getARGV("-N" ,max(nloc/10,5)); int sizeoverlaps=getARGV("-overlap" ,1); ; // size of overlap bool RAS=getARGV("-RAS",1); // Global Variable .. if(mpirank==0 && verbosity) cout << " vdebug: " << vdebug << " kspilt "<< ksplit << " nloc "<< nloc << " sff "<< sff <<"."<< endl; string sPk="P2-2gd"; func Pk=P2; func bool plotMPIall(mesh &Th,real[int] & u,string cm) {if(vdebug) PLOTMPIALL(mesh,Pk, Th, u,{ cmm=cm,nbiso=20,fill=1,dim=3,value=1}); return 1;} mpiComm comm(mpiCommWorld,0,0);// trick : make a no split mpiWorld int iiipart= mpiRank(comm); // current partition number if(iiipart==0) cout << " Final N=" << ksplit*nloc << " nloc =" << nloc << " split =" << ksplit << endl; int[int] l111=[1,2,2,2]; settt mesh Thg=square(nloc,nloc*5,[x,5*y],label=l111); mesh ThC=square(nC,nC*5,[x,5*y],label=l111);// Caarse Mesh fespace VhC(ThC,P1); // of the coarse problem.. BuildPartitioning(sizeoverlaps,mesh,Thg,Thi,aThij,RAS,pii,jpart,comm,vdebug) if(ksplit>1) { for(int jp=0;jp=3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",1); int nloc = getARGV("-n",20); string sff=getARGV("-p",""); int gmres=getARGV("-gmres",3); int tsolver = getARGV("-ts",int(CG)); int nC = getARGV("-N" ,max(nloc/10,5)); int sizeoverlaps=1; // size of overlap bool RAS=1; if(mpirank==0 && verbosity) cout << " vdebug: " << vdebug << " kspilt "<< ksplit << " nloc "<< nloc << " sff "<< sff <<"."<< endl; string sPk="P2-3gd"; func Pk=P2; int Pknbcomp=1; func bool plotMPIall(mesh3 &Th,real[int] & u,string cm) { if(vdebug) PLOTMPIALL(mesh3,Pk, Th, u,{ cmm=cm,nbiso=4,fill=1,dim=3,value=1}); return 1;} mpiComm comm(mpiCommWorld,0,0);// trick : make a no split mpiWorld int ipart= mpiRank(comm); // current partition number if(ipart==0) cout << " Final N=" << ksplit*nloc << " nloc =" << nloc << " split =" << ksplit << endl; int[int] l111=[1,1,1,1]; settt int[int,int] LL=[[1,1],[1,1],[1,1]]; real[int,int] BB=[[0,1],[0,1],[0,1]]; int[int] NN=[nloc,nloc,nloc]; int[int] NNC=[nC,nC,nC]; settt mesh3 Thg=Cube(NN,BB,LL); mesh3 ThC=Cube(NNC,BB,LL); fespace VhC(ThC,P1); // of the coarse problem.. BuildPartitioning(sizeoverlaps,mesh3,Thg,Thi,aThij,RAS,pii,jpart,comm,vdebug) if(ksplit>1) { for(int jp=0;jp> Ri[j]; } // EOM /******************************************************************/ macro CheckUV(comm,jpart,Si,Ri) { int n= jpart.n; int[int] rn(n),sn(n),in(n); for (int j=0;j> rn[j]; for (int j=0;j> in[j]; int err=0; for (int j=0;j " << in[j] << " " << err << endl; } assert(err==0); }//EOM /******************************************************************/ macro SendRecvUV(comm,jpart,Si,Ri) { int n= jpart.n; mpiRequest[int] rq(n); for (int j=0;j> Ri[j][];*/ for (int j=0;j1 && ipart==0) metisdual(part[],Thg,npart); broadcast(processor(0,comm),part[]); } /* build ... */ if(vdebug>10&& mpirank==0 && !NoGraphicWindow) plot(part,fill=1,cmm="dual",wait=1); /* overlapping partition */ Vhi unssd; int nnn = sizeoverlaps*2;/* to be sure exact in thii */ { int[int] n2o(1); Phg suppi= abs(part-ipart)<0.1; /* boolean function 1 in the subdomain 0 elswhere */ Thin=trunc(Thg,suppi>0,label=10); /* non-overlapping mesh, interfaces have label 10 */ AddLayers(Thg,suppi[],nnn,unssd[]); /* see above ! suppi and unssd are modified */ unssd[] *= nnn; /* to put value nnn a 0 */ /* build a local mesh of thii such that all compuation of the unit partition are */ /* exact in thii */ Thii=trunc(Thg,unssd> 0.001 ,label=10,new2old=n2o); /* overlapping mesh, interfaces have label 10 */ unssd= unssd;/* put on Thii*/ real[int] p=part[]; part=0.; part[]=p(n2o); real nnn0 = nnn - sizeoverlaps + 0.001 ; Thi=trunc(Thii,unssd>nnn0 ,label=10); /* overlapping mesh, interfaces have label 10 */ } settt int npij=npart; Vhi[int] pij(npij);/* local partition of unit + pii */ { /* construction of the partition of the unit, let phi_i P1 FE function 1 on Thin and zero ouside of Thi and positive the partition is build with $$ p_i = phi_i/ \sum phi_i to build the partition of one domain i we nned to find all j such that supp(phi_j) \cap supp(phi_j) is not empty <=> int phi_j */ { /* find all j mes (supp(p_j) \cap supp(p_i)) >0 */ /* compute all phi_j on Thii */ /* remark supp p_i include in Thi */ /* */ fespace Phii(Thii,P0); fespace Vhii(Thii,P1); Vhi sumphi=0; jpart=0; njpart=0; if(ipart==0) cout <<" sizeoverlaps=" << sizeoverlaps << " " << " nnn = " << nnn<< endl; if(dplot1) plot(unssd,wait=1,cmm=" bbbb"); pii= max(unssd-sizeoverlaps,0.)/sizeoverlaps; if(RAS) pii[]=pii[] ? 1. : 0.; if(dplot1) plot(pii,wait=1,cmm=" 0000 max="+pii[].max); sumphi[] += pii[]; if(dplot1) plot(sumphi,wait=1,cmm=" summ 0000"); Vhii phii=0; real epsmes=1e-10*Thii.mesure; /*cout << " epsmes = " << epsmes < 0.5) { AddLayers(Thii,suppii[],sizeoverlaps,phii[]); if(RAS) { phii[]=phii[] ? 1. : 0.; if(dplot1) plot(phii,wait=1,cmm=" RAS ij"); } assert(phii[].min >= -1e-10); real interij = int#mesh(Thi)( phii); if(interij>epsmes) { pij[njpart]=abs(phii); if(vdebug1>2) cout << " ***** " << int#mesh(Thi)(real(pij[njpart])<0) << " " <2) cout << " sum min " < 1.-1e-6 && sumphi[].max< 1.+1e-6); /* verification */ }}/* (Thii is remove here) */ /* end of the construction of the local partition of the unity ... */ /* on Thi ... */ /* ----------------------------------------------------------------- */ if(mpiRank(comm)==0) cout << " *** end build partition " << endl; /* computation of number of intersection .. */ /* ------------------------------------------ */ /* here pii and the pij is the locate partition of the unite on */ /* Thi ( mesh with overlap ).... */ /*Thi=splitmesh(Thi,2); */ if(dplot1 ) { plot(Thi,pii,wait=1); for(int j=0;j we have to recive */ /* data on intersection of the support of pij[0] and pij[j] */ settt aThij.resize(njpart); /* construction of the mesh intersect i,j part */ for(int jp=0;jp1e-6,label=10); /* mesh of the supp of pij */ } if(mpiRank(comm)==0) cout << " *** end build mesh intersection " << endl; // EOM macro defPk1(i,j) i j // macro defPk2(i,j) [i j,i#1 j]// macro defPk3(i,j) [i j,i#1 j,i#2 j]// macro defPk4(i,j) [i j,i#1 j,i#2 j,i#3 j]// macro defPk5(i,j) [i j,i#1 j,i#2 j,i#3 j, i#4 j]// macro Times1(i) i // macro Times2(i) [i,i]// macro Times3(i) [i,i,i]// macro Times4(i) [i,i,i,i]// macro Times5(i) [i,i,i,i,i]// macro InitUdef(n,Vh,Th,aTh,U,N) Vh[int] defPk#N(U,)(n); for(int j=0;j s Whij */ rMj[jp] = interpolate(Whij,Whi,t=1,U2Vc=U2Vdata); /* Whji -> Whi */ if(vdebug>10) { {Whi defPk#N(uuu,)=Times#N(1),defPk#N(vvv,)=Times#N(-1); vvv[]+=I*uuu[]; cout << jp << " %%% " << vvv[].linfty << endl; assert(vvv[].linfty < 1e-6);} {Whi defPk#N(uuu,)=Times#N(1),defPk#N(vvv,)=Times#N(-1) ; vvv[]+=rMj[jp]'*uuu[]; cout << jp << " ### " << vvv[].linfty << endl; assert(vvv[].linfty < 1e-6);}} }} if(ipart==0) cout << " *** end build transfert matrix " << endl; settt /* alloc array of send and recv data .. */ InitUdef(jpart.n,Whij,Thij,aThij,Usend,N) /* initU(n,Vh,Th,aTh,U) */ InitUdef(jpart.n,Whij,Thij,aThij,Vrecv,N) /* ... */ if(ipart==0) cout << " *** end init data for send/revc " << endl; // /******************************************************************/ macro BuildTransferMat(ipart,mesh,Pk,N,U2V,Thi,Whi,Whij,Thij,aThij,Usend,Vrecv,jpart,vdebug) BuildTransferMat2(ipart,mesh,Pk,N,U2V,Thi,Whi,Whij,Thij,aThij,Usend,Vrecv,jpart,Pii,vdebug) // /******************************************************************/ /******************************************************************/ // usage uplot is allu or [allu,allu1] : macro PLOTMPIALLU(mesh,Pk,defPk, Th, u, uplot, plotparm) { int ver=verbosity; verbosity=0; if(NoGraphicWindow==0) { if(mpirank==0) { mesh Thi=Th; mesh[int] ath(mpisize); fespace Xh(Thi,Pk); Xh[int] defPk(allu,)(mpisize); allu[0][]=u; ath[0]=Th; mpiRequest[int] rq(mpisize); for(int i= 1; i =3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",1); int nloc = getARGV("-n",10); string sff=getARGV("-p",""); int gmres=getARGV("-gmres",0); int nC = getARGV("-N" ,max(nloc/10,5)); bool RAS=1; int sizeoverlaps=1; // size of overlap if(mpirank==0 && verbosity) cout << " vdebug: " << vdebug << " kspilt "<< ksplit << " nloc "<< nloc << " sff "<< sff <<"."<< endl; string sPk="P2-Stokes-2gd"; func Pk=[P2,P2,P1]; //int Pknbcomp=3; func bool plotMPIall(mesh &Th,real[int] & u,string cm) {if(vdebug) PLOTMPIALLU(mesh,Pk, defPk3, Th, u, allu1, { cmm=cm,nbiso=10,fill=1,dim=3,value=1}); return 1;} func bool plotMPIallp(mesh &Th,real[int] & u,string cm) {if(vdebug) PLOTMPIALLU(mesh,Pk, defPk3, Th, u, allu2, { cmm=cm,nbiso=10,fill=1,dim=3,value=1}); return 1;} mpiComm comm(mpiCommWorld,0,0);// trick : make a no split mpiWorld int ipart= mpiRank(comm); // current partition number if(ipart==0) cout << " Final N=" << ksplit*nloc << " nloc =" << nloc << " split =" << ksplit << endl; int[int] l111=[1,1,2,1]; settt mesh Thg=square(nloc,nloc,[x,y],label=l111); mesh ThC=square(nC,nC,[x,y],label=l111);// Coarse Mesh fespace VhC(ThC,[P2,P2,P1]); // of the coarse problem.. BuildPartitioning(sizeoverlaps,mesh,Thg,Thi,aThij,RAS,pii,jpart,comm,vdebug) if(ksplit>1) { for(int jp=0;jp> solver; } if(solver != 1 && solver != 2 && solver != 3 && solver != 10 && solver != 11 && solver != 12 && solver != 13) { cout << "Wrong choice, using GMRES instead !" << endl; solver = 13; } } broadcast(processor(0), solver); /*# chooseSolverEnd #*/ /*# physicalParameters #*/ real f = 1.; macro coefficients(meshName, PhName) fespace PhName(meshName, P0); PhName kappa = stripes(y, x, 10, 1e6);// EOM /*# physicalParametersEnd #*/ real[int] res(Wh.ndof); real[int] rhs(Wh.ndof); if(solver == 1 || solver == 2 || solver == 3) { /*# StiffnessRhsMatrix #*/ Varf(vPb, Th, Ph) matrix A = vPb(Wh, Wh); rhs = vPb(0, Wh); dmatrix Mat(A, arrayIntersection, restrictionIntersection, D, bs = 1); /*# StiffnessRhsMatrixEnd #*/ // sparams will override command line arguments ! if(solver == 2) { /*# rigidBodyMotion #*/ Wh[int] def(Rb)(1); Rb[0] = 1; /*# rigidBodyMotionEnd #*/ /*# SolverPETSc #*/ set(Mat, sparams = "-pc_type gamg -ksp_type gmres -pc_gamg_threshold 0.05 -ksp_monitor", nearnullspace = Rb); } else if(solver == 3) set(Mat, sparams = "-pc_type lu -pc_factor_mat_solver_package mumps -mat_mumps_icntl_7 2 -ksp_monitor"); mpiBarrier(mpiCommWorld); timing = mpiWtime(); u[] = Mat^-1 * rhs; /*# SolverPETScEnd #*/ timing = mpiWtime() - timing; /*# matrixVectorPETSc #*/ res = Mat * u[]; /*# matrixVectorPETScEnd #*/ } else { /*# localMatrix #*/ assemble(A, rhs, Wh, Th, ThBorder, Varf) /*# localMatrixEnd #*/ dschwarz Aglob(A, arrayIntersection, restrictionIntersection, scaling = D); mpiBarrier(mpiCommWorld); timing = mpiWtime(); /*# coarseSpace #*/ matrix N; if(mpisize > 1 && solver == 12) { int[int] parm(1); parm(0) = getARGV("-nu", 20); EVproblem(vPbNoPen, Th, Ph) matrix noPen = vPbNoPen(Wh, Wh, solver = CG); attachCoarseOperator(mpiCommWorld, Aglob, A = noPen, /*threshold = 2. * h[].max / diam,*/ parameters = parm); } /*# coarseSpaceEnd #*/ /*# SolverDDM #*/ DDM(Aglob, u[], rhs, dim = getARGV("-gmres_restart", 60), iter = getARGV("-iter", 100), eps = getARGV("-eps", 1e-8), solver = solver - 9); /*# SolverDDMEnd #*/ timing = mpiWtime() - timing; /*# matrixVectorFFpp #*/ res = Aglob * u[]; /*# matrixVectorFFppEnd #*/ } /*# trueResidual #*/ res -= rhs; real rhsnorm = dscalprod(D, rhs, rhs); real dist = dscalprod(D, res, res); if(mpirank == 0) cout << " --- normalized L^2 norm of the true residual: " << sqrt(dist / rhsnorm) << endl; /*# trueResidualEnd #*/ mpiBarrier(mpiCommWorld); if(mpirank == 0) cout << " --- time to solution: " << timing << endl; /*# Visualization #*/ plotMPI(Th, u, "Global solution", Pk, def, 3, 1); /*# VisualizationEnd #*/ /*# ScriptEnd #*/ freefem++-3.38-1/examples++-mpi/dmatrix.hpp000755 000767 000024 00000006265 12055625170 020533 0ustar00hechtstaff000000 000000 // SUMMARY : matrix manipulation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : P. Jolivet // E-MAIL : Pierre Jolivet // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include struct step { public: step(int x, int y) : x(x), y(y) { } int operator()() { return x += y; } private: int x, y; }; template static void CSR2COO(unsigned int n, int* compressedI, int* uncompressedI) { if(S == 'U') { for(int i = n - 1; i > -1; --i) { if(M == 'F') std::fill(uncompressedI + compressedI[i] - 1, uncompressedI + compressedI[i + 1] - 1, i + 1); else std::fill(uncompressedI + compressedI[i], uncompressedI + compressedI[i + 1], i + 1); } } else if(S == 'L') { for(int i = 1; i < n; ++i) { if(M == 'F') std::fill(uncompressedI + compressedI[i] - i - 1, uncompressedI + compressedI[i + 1] - i - 1, i + 1); else std::fill(uncompressedI + compressedI[i] - i, uncompressedI + compressedI[i + 1] - i - 1, i + 1); } } }; template static unsigned int trimCSR(unsigned int n, int* trimmedI, int* untrimmedI, int* trimmedJ, int* untrimmedJ, Scalar* trimmedC, Scalar* untrimmedC) { unsigned int upper = 0; for(unsigned int i = 0; i < n - WithDiagonal; ++i) { trimmedI[i] = upper + (N == 'F'); int* jIndex = lower_bound(untrimmedJ + untrimmedI[i], untrimmedJ + untrimmedI[i + 1], i + !WithDiagonal); unsigned int j = untrimmedI[i] + jIndex - (untrimmedJ + untrimmedI[i]); if(N == 'F') { for(unsigned int k = j; k < untrimmedI[i + 1]; ++k) trimmedJ[upper + k - j] = untrimmedJ[k] + 1; } else std::copy(untrimmedJ + j, untrimmedJ + untrimmedI[i + 1], trimmedJ + upper); std::copy(untrimmedC + j, untrimmedC + untrimmedI[i + 1], trimmedC + upper); upper += untrimmedI[i + 1] - j; } if(WithDiagonal) { trimmedI[n - 1] = upper + (N == 'F'); trimmedI[n] = trimmedI[n - 1] + 1; trimmedJ[upper] = n - (N == 'C'); trimmedC[upper] = untrimmedC[untrimmedI[n] - 1]; return trimmedI[n]; } else { trimmedI[n] = trimmedI[n - 1]; return trimmedI[n + 1]; } }; freefem++-3.38-1/examples++-mpi/dSuperLU_DIST.cpp000644 000767 000024 00000051420 12467063676 021410 0ustar00hechtstaff000000 000000 //ff-c++-LIBRARY-dep: metis superlu_dist parmetis blas mpi fc //ff-c++-cpp-dep: /* Interface freefem++ et SuperLU_DIST_2.3 /bin/sh ff-mpic++ dSuperLU_DIST.cpp -I/Users/morice/librairie/SuperLU_DIST_2.3/SRC/ -L/Users/morice/librairie/openmpi/lib/ -lmpi -lopal -lorte -L/Users/morice/librairie/PATCHVECLIB/ -lwrapperdotblas -framework veclib -L/Users/morice/librairie/ParMetis-3.1/ -lparmetis -lmetis -L/Users/morice/librairie/SuperLU_DIST_2.3/lib/ -lsuperlu_dist_2.3 */ #include #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "superlu_ddefs.h" #include "ffsuperludistoption-1.hpp" template struct SuperLUmpiDISTDriver { }; template <> struct SuperLUmpiDISTDriver { /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_D;} static void pgssvx(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, double *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, SOLVEstruct_t *p9, double *p10, SuperLUStat_t *p11, int *p12) { pdgssvx( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 ); } static void pgssvx_ABglobal(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, double *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, double *p9, SuperLUStat_t *p10, int *p11) { pdgssvx_ABglobal( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11); } static void Print_CompRowLoc_Matrix_dist(SuperMatrix *p1) { dPrint_CompRowLoc_Matrix_dist(p1); } static void Create_CompCol_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, double *p5, int_t *p6, int_t *p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { dCreate_CompCol_Matrix_dist(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); } static void Create_CompRowLoc_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, int_t p5, int_t p6, double *p7, int_t *p8, int_t *p9, Stype_t p10, Dtype_t p11, Mtype_t p12) { dCreate_CompRowLoc_Matrix_dist( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12); } static void CompRow_to_CompCol_dist(int_t p1, int_t p2, int_t p3, double *p4, int_t *p5, int_t *p6, double **p7, int_t **p8, int_t **p9) { dCompRow_to_CompCol_dist( p1,p2,p3,p4,p5,p6,p7,p8,p9 ); } static void Create_Dense_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, double *p4, int_t p5, Stype_t p6, Dtype_t p7, Mtype_t p8) { dCreate_Dense_Matrix_dist( p1,p2,p3,p4,p5,p6,p7,p8 ); } static void Create_SuperNode_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, double *p5, int_t *p6, int_t *p7, int_t *p8, int_t *p9, int_t *p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { dCreate_SuperNode_Matrix_dist(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13); } }; template class SolveSuperLUmpi : public MatriceMorse::VirtualSolver, public SuperLUmpiDISTDriver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 //mutable char equed[1]; //yes_no_t equil; mutable SuperMatrix A; NCformat *Astore; //NCformat *Ustore; //SCformat *Lstore; mutable superlu_options_t options; mutable mem_usage_t mem_usage; mutable ScalePermstruct_t ScalePermstruct; mutable LUstruct_t LUstruct; mutable SOLVEstruct_t SOLVEstruct; mutable gridinfo_t grid; string string_option; string data_option; R *a; int *asub, *xa; int_t m, n, nnz; // rajout pour // int_t nprow,npcol; /* process rows and process columns*/ int matrixdist; // type of distributed matrix static const int assembled =0; static const int distributedglobal =1; static const int distributed =2; public: SolveSuperLUmpi(const MatriceMorse &AA,string datafile, string param_char, KN &pperm_r, KN &pperm_c, MPI_Comm * mpicommw) : string_option(param_char),data_option(datafile) { R* B; //R* X; SuperLUStat_t stat; int info, ldb, nrhs=0; int i; double* berr; int iam; // Add for distributed matrix int_t m_loc, m_loc_fst, fst_row, nnz_loc, fst_nnz; R *aloc; int *asubloc, *xaloc; // End Add for distributed matrix A.Store=0; int status; /* Defaults */ nrhs = 0; /* lecture de nprow and npcol */ // Cas max deux procs nprow = 1; npcol = 1; matrixdist=0; /* set the default options */ set_default_options_dist(&options); DiagScale_t optionDiagScale; //if(verbosity > 10) print_options_dist(&options); if(!string_option.empty()) read_nprow_npcol_freefem( &string_option, &nprow, &npcol, &matrixdist); if(!string_option.empty()) read_options_freefem(&string_option,&options,&optionDiagScale); if(!data_option.empty()) read_options_superlu_datafile(&data_option,&options,&nprow, &npcol, &matrixdist,&optionDiagScale); //if(verbosity > 10) print_options_dist(&options); /* ------------------------------------------------------------ INITIALIZE THE SUPERLU PROCESS GRID. ------------------------------------------------------------*/ cout << "superlu_gridinit" <= nprow * npcol ){ //superlu_gridexit(&grid); printf("this process is not used in superlu %d \n",iam); } else { // matrix to procs and vectors if( matrixdist == assembled ){ if(!iam){ cout << "iam=" << iam << endl; printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; assert( AA.lg[n] == nnz ); printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* transform Row to Col */ // cela coute cher comme fonction // //dallocateA_dist(n, nnz, &a, &asub, &xa); //dCompRow_to_CompCol_dist(m,n,nnz,arow,asubrow,xarow,&a,&asub,&xa); dCompRow_to_CompCol_dist(m,n,nnz,AA.a,AA.cl,AA.lg,&a,&asub,&xa); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); int infobcast=MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } else{ /* printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ dallocateA_dist(n, nnz, &a, &asub, &xa); int infobcast=MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); cout << "Debut: Create_CompCol_Matrix_dist" <" required by g++ 4.7 this->Create_CompCol_Matrix_dist(&A, m, n, nnz, a, asub, xa, SLU_NC, R_SLU, SLU_GE); cout << "Fin: Create_CompCol_Matrix_dist" <::pgssvx_ABglobal(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } //########################################################## // // matrix distributed with matrix global given // //########################################################## else if( matrixdist == distributedglobal) { if(!iam){ printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; a=AA.a; asub=AA.cl; xa=AA.lg; xa[n] = nnz; printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( AA.cl, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.lg, n+1, mpi_int_t, 0, grid.comm ); } else{ printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ dallocateA_dist(n, nnz, &a, &asub, &xa); MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } /* Compute the number of rows to be distributed to local process */ m_loc = m / (grid.nprow * grid.npcol); m_loc_fst = m_loc; /* When m / procs is not an integer */ if ((m_loc * grid.nprow * grid.npcol) != m) { /*m_loc = m_loc+1; m_loc_fst = m_loc;*/ if (iam == (grid.nprow * grid.npcol - 1)) /* last proc. gets all*/ m_loc = m - m_loc * (grid.nprow * grid.npcol - 1); } fst_row = iam * m_loc_fst; nnz_loc = xa[fst_row+m_loc]-xa[fst_row]; xaloc = (int_t*) intMalloc_dist(m_loc+1); for(int ii=0; ii < m_loc; ii++){ xaloc[ii] = xa[fst_row+ii]-xa[fst_row]; } xaloc[m_loc]=nnz_loc; fst_nnz = xa[fst_row]; aloc = (double*) doubleMalloc_dist(nnz_loc); asubloc = (int_t*) intMalloc_dist(nnz_loc); for(int ii=0; ii < nnz_loc; ii++){ aloc[ii] = a[fst_nnz+ii]; asubloc[ii] = asub[fst_nnz+ii]; } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); cout << "Debut: Create_CompRowCol_Matrix_dist" <::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info); if(verbosity) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } else if( matrixdist == distributed) { printf("in construction\n"); exit(1); } else{ printf("matrix choice for SuperLU_DIST is assembled, distributedglobal and distributed \n"); exit(1); } SUPERLU_FREE( B ); options.Fact = FACTORED; /* Indicate the factored form of A is supplied. */ nrhs=1; SUPERLU_FREE(berr); } } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { R* B; SuperLUStat_t stat; int iam; int info=0, ldb=m, nrhs=1; int i; double* berr; double ferr; double rpg, rcond; int_t m_loc,m_loc_fst,fst_row; if(n != m) exit(1); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); nrhs= 1; /* Initialize the statistics variables. */ PStatInit(&stat); iam = grid.iam; if( iam < nprow*npcol){ /* cas matrix assembled */ if( matrixdist == assembled ){ if( !(B = doubleMalloc_dist(m*nrhs)) ){ printf("probleme d allocation\n"); exit(1); } for(int ii=0; ii::pgssvx_ABglobal (&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if(verbosity) PStatPrint(&options, &stat, &grid); for(int ii=0; ii::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info ); if(verbosity) printf("Triangular solve: dgssvx() returns info %d\n", info); if ( !(xtemp = doubleMalloc_dist(AA.n)) ){ printf("probleme d allocation de xtemp\n"); exit(1); } int disp[nprow*npcol]; MPI_Allgather(&fst_row, 1, MPI_INT, disp, 1, MPI_INT, grid.comm); int recv[nprow*npcol]; MPI_Allgather(&m_loc, 1, MPI_INT, recv, 1, MPI_INT, grid.comm); MPI_Allgatherv(B, m_loc, MPI_DOUBLE, xtemp, recv, disp, MPI_DOUBLE, grid.comm); for(int ii= 0; ii< AA.n ; ii++) x[ii] = xtemp[ii]; if(verbosity) cout << " x min max " << x.min() << " " < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverSuperLUmpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverSuperLUmpi" << endl; return new SolveSuperLUmpi(*A,ds.data_filename, ds.sparams, ds.perm_r, ds.perm_c,static_cast(ds.commworld)); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return false; } bool SetSuperLUmpi() { if(verbosity) cout << " SetDefault sparse solver to SuperLUmpi double" << endl; DefSparseSolver::solver =BuildSolverSuperLUmpi; //DefSparseSolver::solver =BuildSolverSuperLUmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return false; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: SuperLUmpi, defaultsolver defaultsolverSuperLUmpi" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverSuperLUmpi; //DefSparseSolver::solver =BuildSolverSuperLUmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoSuperLUmpi","(",new OneOperator0(SetSuperLUmpi)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/elasticity-3d.edp000755 000767 000024 00000015767 12500405645 021527 0ustar00hechtstaff000000 000000 // Author : P. Jolivet /*# Script #*/ macro K()real// EOM macro def()def3// EOM macro init()init3// EOM macro BC()BC3// EOM macro meshN()mesh3// EOM macro intN()int3d// EOM macro measureN()volume// EOM macro bbN()bb3// EOM include "schwarz-macro.idp" /*# problemPhysics #*/ real Sqrt = sqrt(2.); macro epsilon(u)[dx(u), dy(u#B), dz(u#C), (dz(u#B) + dy(u#C)) / Sqrt, (dz(u) + dx(u#C)) / Sqrt, (dy(u) + dx(u#B)) / Sqrt]// EOM macro div(u)(dx(u) + dy(u#B) + dz(u#C))// EOM macro Varf(varfName, meshName, PhName) coefficients(meshName, PhName) varf varfName(def(u), def(v)) = intN(meshName)(lambda * div(u) * div(v) + 2. * mu * (epsilon(u)' * epsilon(v))) + intN(meshName)(f * vB) + on(1, BC(u, 0)); // EOM /*# problemPhysicsEnd #*/ /*# vfGENEO #*/ macro EVproblem(varfName, meshName, PhName) coefficients(meshName, PhName) varf varfName(def(u), def(v)) = intN(meshName)(lambda * div(u) * div(v) + 2. * mu * (epsilon(u)' * epsilon(v))) + on(1, BC(u, 0)); // EOM /*# vfGENEOEnd #*/ /*# sequentialMesh #*/ real depth = 0.25; int discrZ = getARGV("-discrZ", 1); real L = 2.5; real H = 0.71; real Hsupp = 0.61; real r = 0.05; real l = 0.35; real h = 0.02; real width = 2.5*L/4.; real alpha = asin(h/(2.*r))/2; /*# twoDsequentialMesh #*/ border a0a(t=0, 1){x=0; y=-t*Hsupp; label=2;}; border a0(t=0, (L - width)/2.){x=t; y=-Hsupp; label=1;}; border a0b(t=0, 1){x=(L - width)/2.; y=-(1-t)*Hsupp; label=2;}; border aa(t=0, 0.5^(1/0.75)){x=L/2. - width/2.*cos(pi*t^0.75); y=sin(pi*t^0.75)/4.; label=2;}; border ab(t=0, 0.5^(1/0.75)){x=L/2. + width/2.*cos(pi*t^0.75); y=sin(pi*t^0.75)/4.; label=2;}; border a2a(t=0, 1){x=(L + width)/2.; y=-t*Hsupp; label=2;}; border a2(t=(L + width)/2., L){x=t; y=-Hsupp; label=1;}; border a2b(t=0, 1){x=L; y=-(1-t)*Hsupp; label=2;}; border e(t=0, 1){x=L; y=t*H; label=2;}; border c(t=0, 1){x=(1-t)*L; y=H; label=3;}; border d(t=0, 1){x=0; y=(1-t)*H; label=2;}; mesh ThGlobal2d = buildmesh(a0(global * (L - width)/(2.*L)) + a0a(global*Hsupp/L) + a0b(global*Hsupp/L) + a2(global * (L - width)/(2*L)) + a2a(global*Hsupp/L) + a2b(global*Hsupp/L) + aa(global * width/(2*L)) + ab(-global * width/(2*L)) + e(global*H/L) + c(global) + d(global*H/L)); ThGlobal2d = adaptmesh(ThGlobal2d, 1/200., IsMetric=1, nbvx=100000); /*# twoDsequentialMeshEnd #*/ macro minimalMesh()Cube(CC, BB, LL)// EOM macro generateTh(name)name = buildlayers(ThGlobal2d, discrZ, zbound=[0, depth])// EOM int[int, int] LL = [[1,3], [2,2], [2,2]]; real[int, int] BB = [[0,10], [0,1], [0,1]]; int[int] CC = [1, 1, 1]; /*# sequentialMeshEnd #*/ int overlap = getARGV("-overlap", 1); if(mpirank == 0) { cout << " --- " << mpirank << "/" << mpisize; cout << " - input parameters: global size = " << global << " - refinement factor = " << s << " - precision = " << getARGV("-eps", 1e-8) << " - overlap = " << overlap << " - with partitioner? = " << partitioner << endl; } /*# parallelMesh #*/ func Pk = [P2, P2, P2]; build(generateTh, Th, ThBorder, ThOverlap, D, numberIntersection, arrayIntersection, restrictionIntersection, Wh, Pk, mpiCommWorld, s) ThGlobal2d = square(1, 1); /*# parallelMeshEnd #*/ Wh def(u); /*# chooseSolver #*/ solver=getARGV("-solver",12); if(mpirank == 0 && solver==0) { cout << "What kind of solver would you like to use ?" << endl; cout << " [1] PETSc GMRES" << endl; cout << " [2] GAMG" << endl; cout << " [3] MUMPS" << endl; cout << " [10] ASM" << endl; cout << " [11] RAS" << endl; cout << " [12] Schwarz GenEO" << endl; cout << " [13] GMRES" << endl; cout << "Please type in a number: "; cin >> solver; if(solver != 1 && solver != 2 && solver != 3 && solver != 4 && solver != 10 && solver != 11 && solver != 12) { cout << "Wrong choice, using GMRES instead !" << endl; solver = 10; } } broadcast(processor(0), solver); /*# chooseSolverEnd #*/ /*# physicalParameters #*/ real f = -900000.; func real stripes(real a, real b, real paramA, real paramB) { int da = int(a * 10); return (da == (int(da / 2) * 2) ? paramB : paramA); } macro coefficients(meshName, PhName) fespace PhName(meshName, P0); PhName Young = stripes(y, x, 2e11, 1e7); PhName poisson = stripes(y, x, 0.25, 0.45); PhName tmp = 1. + poisson; PhName mu = Young / (2. * tmp); PhName lambda = Young * poisson / (tmp * (1. - 2. * poisson));// EOM /*# physicalParametersEnd #*/ real[int] res(Wh.ndof); real[int] rhs(Wh.ndof); if(solver == 1 || solver == 2 || solver == 3) { /*# StiffnessRhsMatrix #*/ Varf(vPb, Th, Ph) matrix A = vPb(Wh, Wh); rhs = vPb(0, Wh); dmatrix Mat(A, arrayIntersection, restrictionIntersection, D, bs = 3); /*# StiffnessRhsMatrixEnd #*/ // sparams will override command line arguments ! if(solver == 2) { /*# rigidBodyMotion #*/ Wh[int] def(Rb)(6); [Rb[0], RbB[0], RbC[0]] = [ 1, 0, 0]; [Rb[1], RbB[1], RbC[1]] = [ 0, 1, 0]; [Rb[2], RbB[2], RbC[2]] = [ 0, 0, 1]; [Rb[3], RbB[3], RbC[3]] = [ y, -x, 0]; [Rb[4], RbB[4], RbC[4]] = [-z, 0, x]; [Rb[5], RbB[5], RbC[5]] = [ 0, z, -y]; /*# rigidBodyMotionEnd #*/ /*# SolverPETSc #*/ set(Mat, sparams = "-pc_type gamg -ksp_type gmres -pc_gamg_threshold 0.05 -ksp_monitor", nearnullspace = Rb); } else if(solver == 3) set(Mat, sparams = "-pc_type lu -pc_factor_mat_solver_package mumps -mat_mumps_icntl_7 2 -ksp_monitor"); mpiBarrier(mpiCommWorld); timing = mpiWtime(); u[] = Mat^-1 * rhs; /*# SolverPETScEnd #*/ timing = mpiWtime() - timing; /*# matrixVectorPETSc #*/ res = Mat * u[]; /*# matrixVectorPETScEnd #*/ } else { /*# localMatrix #*/ assemble(A, rhs, Wh, Th, ThBorder, Varf) /*# localMatrixEnd #*/ dschwarz Aglob(A, arrayIntersection, restrictionIntersection, scaling = D); mpiBarrier(mpiCommWorld); timing = mpiWtime(); /*# coarseSpace #*/ matrix N; if(mpisize > 1 && solver == 12) { int[int] parm(1); parm(0) = getARGV("-nu", 20); EVproblem(vPbNoPen, Th, Ph) matrix noPen = vPbNoPen(Wh, Wh, solver = CG); attachCoarseOperator(mpiCommWorld, Aglob, A = noPen, /*threshold = 2. * h[].max / diam,*/ parameters = parm); } /*# coarseSpaceEnd #*/ /*# SolverDDM #*/ DDM(Aglob, u[], rhs, dim = getARGV("-gmres_restart", 60), iter = getARGV("-iter", 100), eps = getARGV("-eps", 1e-8), solver = solver - 9); /*# SolverDDMEnd #*/ timing = mpiWtime() - timing; /*# matrixVectorFFpp #*/ res = Aglob * u[]; /*# matrixVectorFFppEnd #*/ } /*# trueResidual #*/ res -= rhs; real rhsnorm = dscalprod(D, rhs, rhs); real dist = dscalprod(D, res, res); if(mpirank == 0) cout << " --- normalized L^2 norm of the true residual: " << sqrt(dist / rhsnorm) << endl; /*# trueResidualEnd #*/ mpiBarrier(mpiCommWorld); if(mpirank == 0) cout << " --- time to solution: " << timing << endl; /*# Visualization #*/ plotMPI(Th, u, "Global solution", Pk, def, 3, 1); meshN ThMoved = movemesh3(Th, transfo = [x + u, y + uB, z + uC]); plotMPI(ThMoved, u, "Moved mesh", Pk, def, 3, 1); /*# VisualizationEnd #*/ /*# ScriptEnd #*/ freefem++-3.38-1/examples++-mpi/essai-com.edp000644 000767 000024 00000001502 12167254041 020705 0ustar00hechtstaff000000 000000 verbosity=100; cout << " rank = " << mpirank << " " << " size " << mpisize << endl; if ( mpisize > 1) if( mpirank==0) { cout << " send to 1 " << endl; processor(1) << 123456; } else if (mpirank==1) { int k; processor(0) >> k; cout << " recived " << k << endl; } int l= mpirank+100; cout << " l == " << l << " broadcast l from 0 mpirank = " << mpirank << endl; broadcast(processor(0),l); cout << " l == " << l << " mpirank ="<< mpirank << endl; matrix A; if( mpirank==0) A=[[1+1i,1i],[0,2-1i]]; broadcast(processor(0),A); if (mpirank==1) { A=A+A; processor(0) << A; } else if(mpirank==0) processor(1) >> A; cout << " mpirank = " << " A = " << A << endl; cout << " " << norm(A(1,1) - 2-1i) << endl; int[int] procs=[1,4,8]; mpiGroup group(procs); freefem++-3.38-1/examples++-mpi/essai.edp000644 000767 000024 00000007347 11745333166 020155 0ustar00hechtstaff000000 000000 verbosity=2; cout << " rank = " << mpirank << " " << " size " << mpisize << endl; cout << " rank = " << mpiRank(mpiCommWorld) << " " << " size " << mpiSize(mpiCommWorld) << endl; if(mpisize>4) { int[int] procs=[1,4]; mpiGroup gpr(procs); cout << " before ... " << mpirank << endl; mpiComm comm(gpr); cout << " after ... " << mpirank << " in : " << bool(comm) << " rank " << mpiRank(comm) << " / " << mpiSize(comm) <=2) { if( mpirank==0) { cout << mpirank << " send to 1 " << endl; processor(1) << 123456; // unblock send } else if (mpirank==1) { int k; processor(0) >> k; // block recv cout << " recived " << k << endl; } { // UnBlock communication mpiRequest rq; if( mpirank==0) { Isend(processor(1,rq),16.); mpiWait(rq);// Send } else if (mpirank==1) { real k; Irecv(processor(0,rq),k); mpiWait(rq);// Recv assert(k==16.);// verif.. } } { // Block Communication if( mpirank==0) Send(processor(1),16.); else if (mpirank==1) { real k; Recv(processor(0),k); assert(k==16.);// verif.. } } } int l= mpirank+100; cout << " l == " << l << " broadcast l from 0 mpirank = " << mpirank << endl; broadcast(processor(0),l); cout << " l == " << l << " mpirank ="<< mpirank << endl; { matrix A; if( mpirank==0) A=[[1+1i,1i],[0,2-1i]]; broadcast(processor(0),A); if (mpirank==1) { A=A+A; processor(0) << A; } else if (mpirank==0) processor(1) >> A; cout << " mpirank = " << mpirank << " A = " << endl; cout << A << endl; cout << " " << norm(A(1,1) - 2-1i) << endl; } // asyncronous send/recv messages.... mpiRequest rr; real[int] vv(mpirank*mpisize:mpirank*mpisize+mpisize-1),ww(mpisize); processor(0,rr) << vv; if(mpirank==0) { mpiRequest[int] rq(mpisize); cout << " --- in ++ " <> ww; cout << " --- out ++ " <> ww; cout << " case " << i << " " << ww[0] << endl ; } } mpiAlltoall(vv,ww); cout << " all2all " << mpirank << " : " ; for(int i=0;i " ; for(int i=0;isize()+1]; strcpy( data, string_option->c_str()); char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2 = tictac; tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 13: // nprow *nprow = atoi(tictac); break; case 14: // npcol *npcol = atoi(tictac); break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2 ); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol, int *matrixdist){ static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol","matrix",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2 = tictac; tictac = strtok(NULL," =,\t\n"); int val_options; printf("param %s = value %s , id_option %d\n",tictac2,tictac,id_option); switch (id_option) { case 13: // nprow *nprow = atoi(tictac); break; case 14: // npcol *npcol = atoi(tictac); break; case 15: // matrix printf("parameter matrix \n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("value of parameter matrix is not correct %s \n", tictac ); } break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2 ); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } void read_options_freefem(string *string_option, superlu_options_t *options, DiagScale_t *diag){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[6] = {NATURAL, MMD_AT_PLUS_A, MMD_ATA, METIS_AT_PLUS_A,PARMETIS, MY_PERMC}; static const rowperm_t enumrowperm_t[3] = {NOROWPERM, LargeDiag, MY_PERMR}; static const DiagScale_t enumDiagScale_t[4] = {NOEQUIL, ROW, COL, BOTH}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SLU_SINGLE, SLU_DOUBLE, SLU_EXTRA}; //static const MemType enumMemType_t[4] = {LUSUP, UCOL, LSUB, USUB}; //static const stack_end_t enumstack_end_t[2] = {HEAD, TAIL}; //static const LU_space_t enumLU_space_t[2] = {SYSTEM, USER}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* comprowperm_t[] = {"NOROWPERM", "LargeDiag", "MY_PERMR",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_AT_PLUS_A", "MMD_ATA", "METIS_AT_PLUS_A", "PARMETIS", "MY_PERMC",0}; static const char* compDiagScale_t[] = {"NOEQUIL", "ROW", "COL", "BOTH",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; //static const char* compMemType_t[] = {"LUSUP", "UCOL", "LSUB", "USUB",0}; //static const char* compstack_end_t[] = {"HEAD", "TAIL",0}; //static const char* compLU_space_t[] = {"SYSTEM", "USER",0}; static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol","DiagScale","matrix",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); cout << "data=" << data << endl; char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2=tictac; tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ParSymbFact //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ParSymbFact = enumyes_no_t[val_options-1]; break; case 4: // ColPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 5: // RowPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,comprowperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->RowPerm = enumrowperm_t[val_options-1]; break; case 6: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 7: // IterRefine val_options= s_(tictac,compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 8: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 9: // ReplaceTinyPivot //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->ReplaceTinyPivot= enumyes_no_t[val_options-1]; break; case 10: // SolveInitialized //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->SolveInitialized = enumyes_no_t[val_options-1]; break; case 11: // RefineInitialized //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->RefineInitialized = enumyes_no_t[val_options-1]; break; case 12: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; // case 13 nprow // case 14 npcol case 15: // DiagScale_t val_options= s_(tictac, compDiagScale_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } *diag = enumDiagScale_t[val_options-1]; break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } // void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol, int *matrixdist){ // static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", // "DiagPivotThresh","IterRefine","Trans", // "ReplaceTinyPivot","SolveInitialized", // "RefineInitialized","PrintStat","nprow","npcol","matrix",0}; // char data[string_option->size()+1]; // strcpy( data, string_option->c_str()); // char *tictac; // char *tictac2; // tictac = strtok(data," =,\t\n"); // while(tictac != NULL){ // int id_option = s_(tictac, comp); // tictac2 = tictac; // tictac = strtok(NULL," =,\t\n"); // int val_options; // printf("param %s = value %s , id_option %d\n",tictac2,tictac,id_option); // switch (id_option) // { // case 13: // nprow // *nprow = atoi(tictac); // break; // case 14: // npcol // *npcol = atoi(tictac); // break; // case 15: // matrix // printf("parameter matrix \n"); // if(strcmp(tictac,"assembled") == 0) // *matrixdist = 0; // else if(strcmp(tictac,"distributedglobal") == 0) // *matrixdist = 1; // else if(strcmp(tictac,"distributed") == 0) // *matrixdist = 2; // else{ // printf("value of parameter matrix is not correct %s \n", tictac ); // } // break; // default: // Equivalent of case default // if(id_option == 0) // { // printf("parameter is not valid for superlu_dist %s \n", tictac2 ); // exit(1); // } // break; // } // tictac = strtok(NULL," =,\t\n"); // } // } void read_options_superlu_datafile(string *data_option, superlu_options_t *options, int_t *nprow, int_t *npcol, int *matrixdist, DiagScale_t *diag){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[6] = {NATURAL, MMD_AT_PLUS_A, MMD_ATA, METIS_AT_PLUS_A,PARMETIS, MY_PERMC}; static const rowperm_t enumrowperm_t[3] = {NOROWPERM, LargeDiag, MY_PERMR}; static const DiagScale_t enumDiagScale_t[4] = {NOEQUIL, ROW, COL, BOTH}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SLU_SINGLE, SLU_DOUBLE, SLU_EXTRA}; //static const MemType enumMemType_t[4] = {LUSUP, UCOL, LSUB, USUB}; //static const stack_end_t enumstack_end_t[2] = {HEAD, TAIL}; //static const LU_space_t enumLU_space_t[2] = {SYSTEM, USER}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* comprowperm_t[] = {"NOROWPERM", "LargeDiag", "MY_PERMR",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_AT_PLUS_A", "MMD_ATA", "METIS_AT_PLUS_A", "PARMETIS", "MY_PERMC",0}; static const char* compDiagScale_t[] = {"NOEQUIL", "ROW", "COL", "BOTH",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; //int_t ffnprow,ffnpcol; //int matrixdist; char datafile[data_option->size()+1]; strcpy( datafile, data_option->c_str()); FILE* pfile= fopen( datafile,"rt"); char data[256]; char *tictac; fgets(data,256,pfile); cout << "data=" << data << endl; tictac = strtok(data," /!#\t\n"); *nprow = (int) atol(tictac); if(verbosity) printf("nprow=%d\n",*nprow); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); *npcol = (int) atol(tictac); if(verbosity) printf("npcol=%d\n",*npcol); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("matrix input %s for superlu_dist is not correct\n", tictac ); exit(1); } int id_option=0; while( !feof(pfile) && id_option<12){ fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); id_option++; int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ParSymbFact //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ParSymbFact = enumyes_no_t[val_options-1]; break; case 4: // ColPerm val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 5: // RowPerm val_options= s_(tictac,comprowperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->RowPerm = enumrowperm_t[val_options-1]; break; case 6: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 7: // IterRefine val_options= s_(tictac,compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 8: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 9: // ReplaceTinyPivot //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->ReplaceTinyPivot= enumyes_no_t[val_options-1]; break; case 10: // SolveInitialized //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->SolveInitialized = enumyes_no_t[val_options-1]; break; case 11: // RefineInitialized //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->RefineInitialized = enumyes_no_t[val_options-1]; break; case 12: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; case 13: // DiagScale_t val_options= s_(tictac, compDiagScale_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } *diag = enumDiagScale_t[val_options-1]; break; default: // Equivalent of case default if(id_option == 0 && id_option > 13) { printf("Error in reading data file for superlu_dist %s\n",datafile); exit(1); } break; } } fclose(pfile); } freefem++-3.38-1/examples++-mpi/ffsuperludistoption.hpp000644 000767 000024 00000042715 11745333363 023215 0ustar00hechtstaff000000 000000 // read options for superlu in freefem++ int s_(char* str, const char* cmp[]) { int i = 0; while( cmp[i] != 0){ if( strcmp(str, cmp[i]) == 0){ //cout << *str << " return" << i << endl; return i+1 ; } i++; } //cout << *str << " return 0" << endl; return 0; } void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol){ static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2 = tictac; tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 13: // nprow *nprow = atoi(tictac); break; case 14: // npcol *npcol = atoi(tictac); break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2 ); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol, int *matrixdist){ static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol","matrix",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2 = tictac; tictac = strtok(NULL," =,\t\n"); int val_options; if(verbosity>4) printf("param %s = value %s , id_option %d\n",tictac2,tictac,id_option); switch (id_option) { case 13: // nprow *nprow = atoi(tictac); break; case 14: // npcol *npcol = atoi(tictac); break; case 15: // matrix if(verbosity>4) printf("parameter matrix \n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ if(verbosity>4)printf("value of parameter matrix is not correct %s \n", tictac ); } break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2 ); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } void read_options_freefem(string *string_option, superlu_options_t *options, DiagScale_t *diag){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[6] = {NATURAL, MMD_AT_PLUS_A, MMD_ATA, METIS_AT_PLUS_A,PARMETIS, MY_PERMC}; static const rowperm_t enumrowperm_t[3] = {NOROWPERM, LargeDiag, MY_PERMR}; static const DiagScale_t enumDiagScale_t[4] = {NOEQUIL, ROW, COL, BOTH}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE,SLU_SINGLE, SLU_DOUBLE, SLU_EXTRA}; //static const MemType enumMemType_t[4] = {LUSUP, UCOL, LSUB, USUB}; //static const stack_end_t enumstack_end_t[2] = {HEAD, TAIL}; //static const LU_space_t enumLU_space_t[2] = {SYSTEM, USER}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* comprowperm_t[] = {"NOROWPERM", "LargeDiag", "MY_PERMR",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_AT_PLUS_A", "MMD_ATA", "METIS_AT_PLUS_A", "PARMETIS", "MY_PERMC",0}; static const char* compDiagScale_t[] = {"NOEQUIL", "ROW", "COL", "BOTH",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; //static const char* compMemType_t[] = {"LUSUP", "UCOL", "LSUB", "USUB",0}; //static const char* compstack_end_t[] = {"HEAD", "TAIL",0}; //static const char* compLU_space_t[] = {"SYSTEM", "USER",0}; static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", "DiagPivotThresh","IterRefine","Trans", "ReplaceTinyPivot","SolveInitialized", "RefineInitialized","PrintStat","nprow","npcol","DiagScale","matrix",0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); if(verbosity>4) cout << "data=" << data << endl; char *tictac; char *tictac2; tictac = strtok(data," =,\t\n"); while(tictac != NULL){ int id_option = s_(tictac, comp); tictac2=tictac; tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ParSymbFact //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ParSymbFact = enumyes_no_t[val_options-1]; break; case 4: // ColPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 5: // RowPerm //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,comprowperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->RowPerm = enumrowperm_t[val_options-1]; break; case 6: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 7: // IterRefine val_options= s_(tictac,compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 8: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 9: // ReplaceTinyPivot //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->ReplaceTinyPivot= enumyes_no_t[val_options-1]; break; case 10: // SolveInitialized //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->SolveInitialized = enumyes_no_t[val_options-1]; break; case 11: // RefineInitialized //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->RefineInitialized = enumyes_no_t[val_options-1]; break; case 12: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; // case 13 nprow // case 14 npcol case 15: // DiagScale_t val_options= s_(tictac, compDiagScale_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } *diag = enumDiagScale_t[val_options-1]; break; default: // Equivalent of case default if(id_option == 0) { printf("parameter is not valid for superlu_dist %s \n", tictac2); exit(1); } break; } tictac = strtok(NULL," =,\t\n"); } } // void read_nprow_npcol_freefem(string *string_option, int *nprow, int *npcol, int *matrixdist){ // static const char* comp[] = {"Fact","Equil","ParSymbFact","ColPerm","RowPerm", // "DiagPivotThresh","IterRefine","Trans", // "ReplaceTinyPivot","SolveInitialized", // "RefineInitialized","PrintStat","nprow","npcol","matrix",0}; // char data[string_option->size()+1]; // strcpy( data, string_option->c_str()); // char *tictac; // char *tictac2; // tictac = strtok(data," =,\t\n"); // while(tictac != NULL){ // int id_option = s_(tictac, comp); // tictac2 = tictac; // tictac = strtok(NULL," =,\t\n"); // int val_options; // printf("param %s = value %s , id_option %d\n",tictac2,tictac,id_option); // switch (id_option) // { // case 13: // nprow // *nprow = atoi(tictac); // break; // case 14: // npcol // *npcol = atoi(tictac); // break; // case 15: // matrix // printf("parameter matrix \n"); // if(strcmp(tictac,"assembled") == 0) // *matrixdist = 0; // else if(strcmp(tictac,"distributedglobal") == 0) // *matrixdist = 1; // else if(strcmp(tictac,"distributed") == 0) // *matrixdist = 2; // else{ // printf("value of parameter matrix is not correct %s \n", tictac ); // } // break; // default: // Equivalent of case default // if(id_option == 0) // { // printf("parameter is not valid for superlu_dist %s \n", tictac2 ); // exit(1); // } // break; // } // tictac = strtok(NULL," =,\t\n"); // } // } void read_nprow_npcol_matrixdist_superlu_datafile(string *data_option, int_t *nprow, int_t *npcol, int *matrixdist){ char datafile[data_option->size()+1]; strcpy( datafile, data_option->c_str()); FILE* pfile= fopen( datafile,"rt"); char data[256]; char *tictac; fgets(data,256,pfile); if(verbosity>4) cout << "data=" << data << endl; tictac = strtok(data," /!#\t\n"); *nprow = (int) atol(tictac); if(verbosity>1) printf("nprow=%d\n",*nprow); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); *npcol = (int) atol(tictac); if(verbosity>1) printf("npcol=%d\n",*npcol); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("matrix input %s for superlu_dist is not correct\n", tictac ); exit(1); } fclose(pfile); } void read_options_superlu_datafile(string *data_option, superlu_options_t *options, int_t *nprow, int_t *npcol, int *matrixdist, DiagScale_t *diag){ static const yes_no_t enumyes_no_t[2] = {NO, YES}; static const fact_t enumfact_t[4] = {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED}; static const colperm_t enumcolperm_t[6] = {NATURAL, MMD_AT_PLUS_A, MMD_ATA, METIS_AT_PLUS_A,PARMETIS, MY_PERMC}; static const rowperm_t enumrowperm_t[3] = {NOROWPERM, LargeDiag, MY_PERMR}; static const DiagScale_t enumDiagScale_t[4] = {NOEQUIL, ROW, COL, BOTH}; static const trans_t enumtrans_t[3] = {NOTRANS, TRANS, CONJ}; static const IterRefine_t enumIterRefine_t[4] = {NOREFINE, SLU_SINGLE, SLU_DOUBLE, SLU_EXTRA}; //static const MemType enumMemType_t[4] = {LUSUP, UCOL, LSUB, USUB}; //static const stack_end_t enumstack_end_t[2] = {HEAD, TAIL}; //static const LU_space_t enumLU_space_t[2] = {SYSTEM, USER}; static const char* compyes_no_t[] = {"NO", "YES",0}; static const char* compfact_t[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; static const char* comprowperm_t[] = {"NOROWPERM", "LargeDiag", "MY_PERMR",0}; static const char* compcolperm_t[] = {"NATURAL", "MMD_AT_PLUS_A", "MMD_ATA", "METIS_AT_PLUS_A", "PARMETIS", "MY_PERMC",0}; static const char* compDiagScale_t[] = {"NOEQUIL", "ROW", "COL", "BOTH",0}; static const char* comptrans_t[] = {"NOTRANS", "TRANS", "CONJ",0}; static const char* compIterRefine_t[] = {"NOREFINE", "SINGLE", "DOUBLE", "EXTRA",0}; //int_t ffnprow,ffnpcol; //int matrixdist; char datafile[data_option->size()+1]; strcpy( datafile, data_option->c_str()); FILE* pfile= fopen( datafile,"rt"); char data[256]; char *tictac; fgets(data,256,pfile); if(verbosity>4) cout << "data=" << data << endl; tictac = strtok(data," /!#\t\n"); *nprow = (int) atol(tictac); if(verbosity) printf("nprow=%d\n",*nprow); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); *npcol = (int) atol(tictac); if(verbosity) printf("npcol=%d\n",*npcol); fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); if(strcmp(tictac,"assembled") == 0) *matrixdist = 0; else if(strcmp(tictac,"distributedglobal") == 0) *matrixdist = 1; else if(strcmp(tictac,"distributed") == 0) *matrixdist = 2; else{ printf("matrix input %s for superlu_dist is not correct\n", tictac ); exit(1); } int id_option=0; while( !feof(pfile) && id_option<12){ fgets(data,256,pfile); tictac = strtok(data," /!#\t\n"); id_option++; int val_options; switch (id_option) { case 1 : // Fact //char* comp1[] = {"DOFACT", "SamePattern", "SamePattern_SameRowPerm", "FACTORED",0}; val_options= s_(tictac,compfact_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Fact"); exit(1); } options->Fact = enumfact_t[val_options-1]; break; case 2: // Equil //char* comp2[] = {"NO", "YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Equil"); exit(1); } options->Equil = enumyes_no_t[val_options-1]; break; case 3: // ParSymbFact //char* comp3[] = {"NATURAL", "MMD_ATA", "MMD_AT_PLUS_A", "COLAMD", "MY_PERMC", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ParSymbFact = enumyes_no_t[val_options-1]; break; case 4: // ColPerm val_options= s_(tictac,compcolperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->ColPerm = enumcolperm_t[val_options-1]; break; case 5: // RowPerm val_options= s_(tictac,comprowperm_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->RowPerm = enumrowperm_t[val_options-1]; break; case 6: // DiagPivotThresh options->DiagPivotThresh= strtod(tictac,&tictac); break; case 7: // IterRefine val_options= s_(tictac,compIterRefine_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ColPerm"); exit(1); } options->IterRefine = enumIterRefine_t[val_options-1]; break; case 8: // Trans //char* comp5[] = {"NOTRANS", "TRANS", "CONJ", 0}; val_options= s_(tictac, comptrans_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","Trans"); exit(1); } options->Trans = enumtrans_t[val_options-1]; break; case 9: // ReplaceTinyPivot //char* comp7[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","SymmetricMode"); exit(1); } options->ReplaceTinyPivot= enumyes_no_t[val_options-1]; break; case 10: // SolveInitialized //char* comp8[] = {"NO","YES", 0}; val_options= s_(tictac,compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PivotGrowth"); exit(1); } options->SolveInitialized = enumyes_no_t[val_options-1]; break; case 11: // RefineInitialized //char* comp9[] = {"NO","YES", 0}; val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","ConditionNumber"); exit(1); } options->RefineInitialized = enumyes_no_t[val_options-1]; break; case 12: // PrintStat val_options= s_(tictac, compyes_no_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } options->PrintStat = enumyes_no_t[val_options-1]; break; case 13: // DiagScale_t val_options= s_(tictac, compDiagScale_t); if( val_options == 0){ printf("value given for SuperLU for options %s is not correct\n","PrintStat"); exit(1); } *diag = enumDiagScale_t[val_options-1]; break; default: // Equivalent of case default if(id_option == 0 && id_option > 13) { printf("Error in reading data file for superlu_dist %s\n",datafile); exit(1); } break; } } fclose(pfile); } freefem++-3.38-1/examples++-mpi/func-max.idp000644 000767 000024 00000004320 12500256676 020557 0ustar00hechtstaff000000 000000 int nbmaxS=0,nbmax; real[int,int] Strouhal(2,100), Strouhal3(3,3); real[int] mxdrag(4), mxdragi(3); real[int] mxlift(4), mxlifti(3); func real t1MaxO2(real c0,real c1,real c2) { return (1./2.)*(c0-c2)/(c0-2.*c1+c2); } func real MaxO2(real c0,real c1,real c2) { return -(1./8)*(c0^2-8.*c0*c1-2.*c0*c2-8.*c2*c1+16.*c1^2+c2^2)/(c0-2.*c1+c2); } func real AddMaxO2(real Cd,int i,real[int] &Maxd,real[int] & Maxdi) { assert(Maxdi.n ==3 && Maxd.n > 3); if( i <=1) // init ... { Maxdi = -1e100; Maxd = -1e100; Maxd[0] =-1000; } Maxdi[i%3] = Cd; if( Maxdi.min > -1e50) { int i0=(i+1)%3, i1=(i+2)%3, i2=(i)%3; if( (Maxdi[i0] < Maxdi[i1]) & (Maxdi[i1] > Maxdi[i2]) ) { // new max int j = Maxd[0]+1+1000; Maxd[j] = MaxO2(Maxdi[i0],Maxdi[i1],Maxdi[i2]); Maxd[0] = j%(Maxd.n-1)-1000; if(mpirank==0 && verbosity>5) cout << " max " << " " << Cd << " " << i << " " << j << " " << Maxd[j] << i0 << " " << i1 << " " << i2 << " " << Maxdi[i0] << " " << Maxdi[i1] << " "<< Maxdi[i2] << endl; } } } func real AddStrouhal(int i,real t,real v) { real s=-1; int i3 = i%3; Strouhal3(0,i3)= t; Strouhal3(1,i3)= v; if( i>10) { int i2 = (i-1)%3; int i1 = (i-2)%3; if(Strouhal3(1,i1) < Strouhal3(1,i2) & Strouhal3(1,i2) > Strouhal3(1,i3) ) { real dt = t- Strouhal3(0,i2); real t2 = Strouhal3(0,i2); int ii = nbmaxS%Strouhal.m; real tm = t2+dt*t1MaxO2(Strouhal3(1,i1),Strouhal3(1,i2),Strouhal3(1,i3)); real fm = MaxO2(Strouhal3(1,i1),Strouhal3(1,i2),Strouhal3(1,i3)); Strouhal(0,ii) =tm; Strouhal(1,ii) =fm; ++nbmaxS; // if(mpirank==0) cout << ii << " " << " " << Strouhal3(0,i1) << " < " << Strouhal3(0,i2) << " > " << Strouhal3(0,i3) << endl; } } if(nbmaxS > 3) { int ii = (nbmaxS-1)%Strouhal.m; int jj = (nbmaxS-4)%Strouhal.m; real per = (Strouhal(0,ii)-Strouhal(0,jj))/3.; // if(mpirank==0) cout << "zzzz " << ii << " " << jj << " " << per << endl; s= 1/per; } return s; } freefem++-3.38-1/examples++-mpi/generaldefs.h000755 000767 000024 00000005142 11745333166 021001 0ustar00hechtstaff000000 000000 #if defined(AIX) #define wreadmtc wreadmtc #define userread userread #define nod2dom nod2dom #define roscal roscal #define coscal coscal #define csrcsc csrcsc #define aplb aplb #define expnddom expnddom #elif defined(BGL) #define wreadmtc wreadmtc #define userread userread #define nod2dom nod2dom #define roscal roscal #define coscal coscal #define csrcsc csrcsc #define aplb aplb #define expnddom expnddom #elif defined(LINUX) #define wreadmtc wreadmtc_ #define userread userread_ #define nod2dom nod2dom_ #define roscal roscal_ #define coscal coscal_ #define csrcsc csrcsc_ #define aplb aplb_ #define expnddom expnddom_ #elif defined(CRAY) #define wreadmtc WREADMTC #define userread USERREAD #define nod2dom NOD2DOM #define roscal ROSCAL #define coscal COSCAL #define csrcsc CSRCSC #define aplb APLB #define expnddom EXPNDDOM #else #define wreadmtc wreadmtc_ #define userread userread_ #define nod2dom nod2dom_ #define roscal roscal_ #define coscal coscal_ #define csrcsc csrcsc_ #define aplb aplb_ #define expnddom expnddom_ #endif /* for outer and inner functions */ extern void setpar(char *filename, char *matrix, int *iov, int *scale, int *unsym, int *method, PrePar prepar, IterPar ipar, DistMatrix dm) ; int assignprecon( char *precon_str, DistMatrix dm); void set_def_params(PrePar prepar, IterPar ipar) ; extern void userread(char *fname, int *len, int *job, int *n, int *nnz, double *a, int *ja, int *ia, int *nrhs, double *rhs, int *ierr); extern void wreadmtc(int *nmax, int *nzmax, int *job, char *fname,int *len, double *a, int *ja, int *ia, double *rhs, int *nrhs, char *guesol, int *nrow, int *ncol, int *nnz, char *title, char *key, char *type, int *ierr) ; extern void nod2dom(int *n, int *ndom, int *nodes, int *pointer, int *map, int *mapsize, int *ier); extern void roscal(int *n, int *job, int *nrm, double *a, int *ja, int *ia, double *diag, double *b, int *jb, int *ib, int *ierr); extern void coscal(int *n, int *job, int *nrm, double *a, int *ja, int *ia, double *diag, double *b, int *jb, int *ib, int *ierr); extern void csrcsc(int *n, int *job, int *ipos, double *a, int *ja, int *ia, double *ao, int *jao, int *iao); extern void aplb(int *nrow, int *ncol, int *job, double *a, int *ja, int *ia, double *b, int *jb, int *ib, double *c, int *jc, int *ic, int *nnzmax, int *iw, int *ierr); extern void expnddom(int *, int *, int *, int *, int *, int *, int *, int *, int *, int *); /*-----------------------------------------------------------------------*/ freefem++-3.38-1/examples++-mpi/getARGV.idp000644 000767 000024 00000004175 11745333166 020310 0ustar00hechtstaff000000 000000 // for gestion of FreeFem++ argument and in version 3.10-1 FH // F. Hecht // Usage: getARGV(n,defaultvalue) // get the fist used default valeu // or getARGV(after,defaultvalue) // get the arg after after // the type of delfaut value given the return type: int,double, string func int usedARGV(int n) { int k=1,ii=1,kk=1,ret=-1; for(int i=1;i=0;--i) if(ARGV[i]==after) { ret=++i; break;} if(ARGV.n0) d=atoi(ARGV[k]); return d; } func real getARGV(int n,real default) { real d=default; int k=usedARGV(n); if(k>0) d=atof(ARGV[k]); return d; } func string getARGV(int n,string default) { string d=default; int k=usedARGV(n); if(k>0) d=ARGV[k]; return d; } func int getARGV(string after,int default) { int d=default; int k=usedARGV(after); if(k>0) d=atoi(ARGV[k]); return d; } func real getARGV(string after,real default) { real d=default; int k=usedARGV(after); if(k>0) d=atof(ARGV[k]); return d; } func string getARGV(string after,string default) { string d=default; int k=usedARGV(after); if(k>0) d=ARGV[k]; return d; } /* cout << getARGV(1,100) << endl; cout << getARGV(2,200.) << endl; cout << getARGV(3,"300.000") << endl; cout << getARGV("-n"," xxx") << endl; */ freefem++-3.38-1/examples++-mpi/Heat3d.idp000644 000767 000024 00000006133 12500052047 020137 0ustar00hechtstaff000000 000000 load "msh3" load "medit" include "getARGV.idp" func f= 1. ; // right hand side function func g=0.; ; // boundary condition function func u0= 0; real dt=getARGV("-dt",0.01); int nn=getARGV("-n",10); int imax=getARGV("-niter",10); int op=getARGV("-op",1); int pplot=getARGV("-plot",0); mesh Th2D=square(nn,nn); int[int] refm=[1,1,2,1,3,1,4,1]; int[int] refu=[0,1]; mesh3 Th=buildlayers(Th2D,nn,zbound=[0.,1.],labelmid=refm,labelup=refu,labeldown=refu); // to slip integral on each processor // set a region number of a processor number real ccc = mpisize/real(Th.nt) ; if(op) Th=change(Th,fregion= min(mpisize-1,int(nuTriangle* ccc+1e-10))); else Th=change(Th,fregion=0); int reg= op ? mpirank : 0; // end of trick cout << " *** Th: vol " << Th.mesure << " " << int3d(Th,reg)(1.) << endl; fespace Vh(Th,P2) ; // P1 FE space Vh uh=u0 ; // unkown and test function. real temps=clock(); real time1,time2,time6; time1=clock(); // compute only on region number = processor number varf vlaplace(uh,vh) = // definition de problem int3d(Th,reg)( uh*vh+ dt*(dx(uh)*dx(vh) + dy(uh)*dy(vh)+ dz(uh)*dz(vh)) ) // bil. form + int3d(Th,reg)( dt*vh*f) + on(1,uh=g) ; varf vmasse(u,v) = int3d(Th,reg)(u*v); varf von1(uh,vh) = on(1,uh=1) ; matrix AA = vlaplace(Vh,Vh,tgv=ttgv) ; time1=clock()-time1; // reduce the matrice to get the full matrice // warning the tgv number is now mpisize*tgv for B.C. matrix A; time6=clock(); if(op) mpiAllReduce(AA,A,mpiCommWorld,mpiSUM); else A=AA; time6 = clock()-time6; time2=clock(); set(A,solver=sparsesolver,tgv=ttgv,sparams=ssparams) ; // factorize time2=clock()-time2; real time3=clock(); matrix M = vmasse(Vh,Vh); time3=clock()-time3; real [int] b(A.n),bb(A.n) ; real[int] bcl= vlaplace(0,Vh,tgv=ttgv) ; // The B.C vector real[int] Gamma = von1(0,Vh,tgv=1); // real time4=0,time5=0; for(int i=0 ;i #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" #include "MatriceCreuse_tpl.hpp" #ifndef MPI_SUCCESS #define MPI_SUCCESS #endif extern "C" { typedef int SCOTCH_Num ; void METIS_PartGraphKway(const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, const SCOTCH_Num * const, SCOTCH_Num * const, SCOTCH_Num * const); #include "hips.h" //#include "metis.h" } #include #include #include #define BUFLEN 200 #define MCW MPI_COMM_WORLD int roscal(int n, int job,int nrm, double *AAv, int *p, int *pr, double * scaletmpr , int *ierr) { /*--------------------------------------------------------------------- | | This routine scales each row of mata so that the norm is 1. | |---------------------------------------------------------------------- | on entry: | mata = the matrix (in SparRow form) | nrm = type of norm | 0 (\infty), 1 or 2 | | on return | diag = diag[j] = 1/norm(row[j]) | | 0 --> normal return | j --> row j is a zero row |--------------------------------------------------------------------*/ /* local variables */ int i, k; double scal; for (i=0; i scal) scal = fabs(AAv[k]); } else if (nrm == 1) { for (k=pr[i]; k normal return | j --> column j is a zero column |--------------------------------------------------------------------*/ /* local variables */ int i, j, k; double *kr; int *ki; for (i=0; i scaletmpc[p[k]]) scaletmpc[p[k]] = fabs(AAv[k]); } } else if (nrm == 1) { for (k=pr[i]; k param_int,KN param_double) { char buf[BUFLEN]; int num,in_val; double val; FILE *fp; char * filename=new char[datafile.length()+1]; strcpy(filename,datafile.c_str()); int i; for(i=0;i<16;i++) param_int[i]=-1; for(i=0;i<9;i++) param_double[i]=-1.0; /* read parameters for preconditioner and iteration from file 'filename' */ /* ---- start modification by MS */ if( (fp = fopen(filename, "r")) == NULL ){ fprintf(stderr, "Cannot open file inputs\n"); exit(1); } num = 0; while(fgets(buf, BUFLEN, fp) != NULL) { if(num<=15) {sscanf(buf, "%d", &in_val); param_int[num]=in_val;} else {sscanf(buf, "%lf", &val); param_double[num]=val;} num++; } fclose(fp); } class HipsSolver : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 string data_option; mutable INTS master;// MPI_Comm comm; mutable INTS id, i, j; mutable INTS *unknownlist; mutable double *x; mutable INTS ln; mutable INTS ierr; mutable INTS n,nnz,nnzl; mutable double * a; mutable INTS *ia, *ja; mutable int *pp; int loc_size,pbegin, pend; INTS domsize, nproc,proc_id; mutable int sym_pattern, sym_matrix; KN param_int; KN param_double; mutable double *scaletmpr, *scaletmpc; mutable int *mapptr,*maptmp,*iwork,*riord,*iwork1,scale; mutable int *pr, *p; mutable double * AAv; private: static const int MaxIds=100; static int Ids[MaxIds]; static int GetId() { static bool Initialized=false; if(!Initialized) { Initialized=true; if(verbosity>2) cout << " Hips HIPS_Initialize " << MaxIds <8) cout << " find HipsSoler : id = " << i << "/" << MaxIds << endl; return i; } cerr<< " All id of Hips are busy " << MaxIds << " try to store less matrix or change MaxIds (FH.) in " << endl; ffassert(0); return -1; } public: static void Def_iopt(long * param_intd) { param_intd[0]= HIPS_ITERATIVE ; // HIPS_STRA param_intd[1]= 0 ; // HIPS_KRYLOV_METHOD param_intd[2]= 1000 ; // HIPS_ITMAX param_intd[3]= 40 ; // HIPS_KRYLOV_RESTART param_intd[4]= 1 ; // HIPS_SYMMETRIC param_intd[5]= 1 ; // HIPS_GRAPH_SYM param_intd[6]= 0 ; // HIPS_PARTITION_TYPE param_intd[7]= 2 ; // HIPS_LOCALLY param_intd[8]= 0 ; // HIPS_FORTRAN_NUMBERING param_intd[9]= 1 ; // HIPS_SCALE param_intd[10]= 1 ; // HIPS_REORDER param_intd[11]= 1 ; // HIPS_DOF param_intd[12]= 2 ; // HIPS_SCALENBR param_intd[13]= max(0L,verbosity-2) ; // HIPS_VERBOSE param_intd[14]= 2 ; // HIPS_DOMSIZE param_intd[15]= 2 ; // HIPS_SCHUR_METHOD param_intd[16]= 2 ; // HIPS_ITMAX_SCHUR } static void Def_dopt(double *d) { d[0]= 1e-09 ; // HIPS_PREC d[1]= 0.005 ; // HIPS_DROPTOL0 d[2]= 0.005 ; // HIPS_DROPTOL1 d[3]= 0.005 ; // HIPS_DROPTOLE d[4]= 0.005 ; // HIPS_AMALG d[5]= 0.005 ; // HIPS_DROPSCHUR } public: HipsSolver(const MatriceMorse &AA,double eeps,string datafile, const KN ¶m_int1, const KN ¶m_double1,int mmaster, MPI_Comm * mpicommw ) : eps(eeps),data_option(datafile) ,param_int(17), param_double(6),id(GetId()) { master=mmaster; if(mpicommw==0) comm=MPI_COMM_WORLD; else comm= *mpicommw; MPI_Comm_rank(comm, &proc_id); MPI_Comm_size(comm, &nproc); if(proc_id==0 || verbosity>2) cout << " Hips Comm " << proc_id<< " / "<< nproc << endl; Def_iopt(param_int); Def_dopt(param_double); static int dopt_wrapper[6] = { HIPS_PREC , HIPS_DROPTOL0 , HIPS_DROPTOL1 , HIPS_DROPTOLE , HIPS_AMALG , HIPS_DROPSCHUR }; static int iopt_wrapper[17] = { -1,// DEf STRATEGIC not in H HIPS_KRYLOV_METHOD , HIPS_ITMAX, HIPS_KRYLOV_RESTART, HIPS_SYMMETRIC, HIPS_GRAPH_SYM, HIPS_PARTITION_TYPE, HIPS_LOCALLY, HIPS_FORTRAN_NUMBERING, HIPS_SCALE, HIPS_REORDER, HIPS_DOF, HIPS_SCALENBR, HIPS_VERBOSE, HIPS_DOMSIZE, HIPS_SCHUR_METHOD, HIPS_ITMAX_SCHUR } ; int ic,sym=AA.symetrique ,symm=AA.symetrique; if(!data_option.empty()) parm_param(datafile,param_int,param_double); else { for(int i=0;i< min(param_int.N(),param_int1.N()); ++i) if(param_int1[i]>-1) param_int[i]=param_int1[i]; for(int i=0;i< min(param_double.N(),param_double1.N()); ++i) if(param_double1[i]>-0.9999) param_double[i]=param_double1[i]; } // force param value ... param_int[0]=max(min(param_int[0],2L),0L); param_int[5]= sym; param_int[4]= symm; if(eps>0 &&( param_double1.N() ==0 || param_double1[0]<0) ) param_double[0]= eps; else eps = param_double[0]; ic = param_int[0]; scale=param_int[9]; if(verbosity>3 && proc_id==0 ) { cout << " Hips INT opts " << param_int << endl; cout << " Hips REAL opts " << param_double << endl; } HIPS_SetDefaultOptions(id, param_int[0] ); for(int i=1;i=0) HIPS_SetOptionINT(id,iopt_wrapper[i],param_int[i] ); for(int i=0;i=0.)HIPS_SetOptionREAL(id,dopt_wrapper[i],param_double[i] ); if(!data_option.empty()) parm_param(datafile,param_int,param_double); HIPS_SetCommunicator(id,comm); n=AA.n; nnz=AA.nbcoef; int ierr; /* pr= new int[n+1]; p= new int[nnz]; AAv=new double[nnz]; for(int i=0;i1){ METIS_PartGraphKway(&n, AA.lg, AA.cl, NULL, NULL, &wgtflag, &numflag,&nproc, option, &volume, riord); } else if(nproc==1){ for (int i=0; i 5) cout << " Hips : proc " << proc_id << " / nzz = " << nnzz << " / nzzg " << nnz << endl; for(int i=0;i100) cout << " " << proc_id << " a( " << i << ", " < 1 && proc_id==0 ) cout << " Hips " << id << ", Res = " <=0); if( (verbosity>3 && proc_id==0 ) ||(verbosity>9) ) cout << " ~Hips_Solver S:" << id << endl; // HIPS_SetOptionINT(id,HIPS_DISABLE_PRECOND,0); // HIPS_ExitOnError(ierr); ierr = HIPS_Clean(id); HIPS_ExitOnError(ierr); delete [] iwork1; delete [] mapptr; delete [] iwork; delete [] maptmp; if(id>0 && id< MaxIds) Ids[id]=-2; id=-2; } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } private:// no copy HipsSolver(const HipsSolver &); HipsSolver & operator=(const HipsSolver &); }; // CLASS HipsSolver int HipsSolver::Ids[HipsSolver::MaxIds]; inline MatriceMorse::VirtualSolver * BuildSolverHipsSolvermpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverSuperLU" << endl; return new HipsSolver(*A,ds.epsilon,ds.data_filename, ds.lparams, ds.dparams,ds.master,(MPI_Comm *)ds.commworld); } /* --FH: class Init { public: Init(); }; */ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return 1; } bool HipsDefaults(KN* piop,KN * pdop) { if(piop) { piop->resize(17); HipsSolver::Def_iopt(*piop); } if(pdop) { pdop->resize(6); HipsSolver::Def_dopt(*pdop); } return true; } bool SetHipsSolver() { if(verbosity>1) cout << " SetDefault sparse solver to Hips" << endl; DefSparseSolver::solver =BuildSolverHipsSolvermpi; //DefSparseSolver::solver =BuildSolverHipsSolvermpi; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; return 1; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Hips, defaultsolver defaultsolverHips" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverHipsSolvermpi; // DefSparseSolver::solver =BuildSolverHipsSolver; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoHips","(",new OneOperator0(SetHipsSolver)); if(! Global.Find("HipsDefaults").NotNull() ) Global.Add("HipsDefaults","(",new OneOperator2*,KN *>(HipsDefaults)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/hypre_FreeFem.cpp000644 000767 000024 00000160740 12471464507 021601 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : INRIA Saclay // AUTHOR : Guy Atenekeng // E-MAIL : Guy_Antoine_Atenekeng_Kahou@lri.fr // //ff-c++-LIBRARY-dep: hypre metis blas mpi //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ // FFCS: add requirement for MPI //ff-c++-LIBRARY-dep: hypre mpi //ff-c++-cpp-dep: // add F.Hecht ... oct 2010 #define HYPRE_TIMING // .. end add #include #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #ifdef __cplusplus extern "C" { #include "metis.h" #endif #ifdef __cplusplus } #endif #include #include #include #ifdef MPI_WTIME_IS_GLOBAL #undef MPI_WTIME_IS_GLOBAL #endif #define MPI_WTIME_IS_GLOBAL 1 #define STATS #include "_hypre_utilities.h" #include "HYPRE.h" #include "HYPRE_krylov.h" #include "HYPRE_IJ_mv.h" #include "HYPRE_parcsr_ls.h" #include "_hypre_parcsr_mv.h" #include "fortran_matrix.h" #include "HYPRE_lobpcg.h" #include "interpreter.h" #include "multivector.h" #include "HYPRE_MatvecFunctions.h" #include "HYPRE_parcsr_int.h" #define CHECK_ZERO #define MCW MPI_COMM_WORLD #define BUFLEN 100 #define SCALE 0 #ifdef SUN /* * It uses the system call gethrtime(3C), which is accurate to * nanoseconds. */ #include double dwalltime() { return ( (double)gethrtime() / 1e9 ); } #else #ifndef NO_TIMER #include #include #include #include #endif #ifndef CLK_TCK #define CLK_TCK 60 #endif double dwalltime() { #ifdef NO_TIMER /* no sys/times.h on _WIN32 */ double tmp; tmp = 0.0; #else struct tms use; double tmp; times(&use); tmp = use.tms_utime; tmp += use.tms_stime; #endif return (double)(tmp) / CLK_TCK; } #endif int roscal(int n, int job,int nrm, double *AAv, int *p, int *pr, double * scaletmpr , int *ierr) { /*--------------------------------------------------------------------- | | This routine scales each row of mata so that the norm is 1. | |---------------------------------------------------------------------- | on entry: | mata = the matrix (in SparRow form) | nrm = type of norm | 0 (\infty), 1 or 2 | | on return | diag = diag[j] = 1/norm(row[j]) | | 0 --> normal return | j --> row j is a zero row |--------------------------------------------------------------------*/ /* local variables */ int i, k; double scal; for (i=0; i scal) scal = fabs(AAv[k]); } else if (nrm == 1) { for (k=pr[i]; k normal return | j --> column j is a zero column |--------------------------------------------------------------------*/ /* local variables */ int i, j, k; double *kr; int *ki; for (i=0; i scaletmpc[p[k]]) scaletmpc[p[k]] = fabs(AAv[k]); } } else if (nrm == 1) { for (k=pr[i]; kilower=rk*(n/size); ilower=(A_loc)->ilower; (A_loc)->iupper=(rk+1)*(n/size)-1; if(rk==size-1) (A_loc)->iupper=(A_loc)->iupper+n%size; iupper=(A_loc)->iupper; (A_loc)->n_loc=n_loc; if( !((A_loc)->ptr=(int *)malloc((n_loc+1)*sizeof(int))) ) {printf("%s","Malloc fails for ptr \n"); exit(1);} if( !((A_loc)->rows=(int *)malloc((n_loc)*sizeof(int))) ) {printf("%s","Malloc fails for rows \n");exit(1);} if( !((A_loc)->ncols=(int *)malloc((n_loc)*sizeof(int))) ) {printf("%s","Malloc fails for ncols \n");exit(1);} //Change global Input matrix (A) to local (A_loc) on each process if(type==0){ //Matrix A is in CSR format //Gets local nnz i1=(A_loc)->ilower; i2=(A_loc)->iupper; (A_loc)->ilower=i1; (A_loc)->iupper=i2; nnz_loc=0; for(i=i1;i<=i2;i++){ nnz_loc+=ptr[i+1]-ptr[i]; } //Allocate memory for local matrix if( !((A_loc)->id_cols=(int *)malloc(nnz_loc*sizeof(int))) ) {printf("%s","Malloc fails for id_cols \n");exit(1);} if( !((A_loc)->vals=(double *)malloc(nnz_loc*sizeof(double))) ) {printf("%s","Malloc fails for vals"); exit(1);} //Transfer the corresponding values from global to local relpos=0; //int ncols; //count number of elements in each row for(i=i1;i<=i2;i++){ (A_loc)->rows[i-i1]=i; (A_loc)->ptr[i-i1]=relpos; ncols=relpos; for(j=ptr[i];jid_cols[relpos]=id_rows[j]; (A_loc)->vals[relpos]=vals[j]; relpos++; } (A_loc)->ncols[i-i1]=relpos-ncols; } //cout << "taille des sous domaines" << nnz_loc << endl; } else{ //matrix A is in CSC format marker= (int *)calloc(n, sizeof(int)); //count number of elements in each row for(i=0; iptr[0]=0; //set up the beginning of each row for(i=0; iptr[i+1] = (A_loc)->ptr[i] + marker[i+ilower]; (A_loc)->id_cols[relpos]=id_rows[j]; (A_loc)->vals[relpos]=vals[j]; relpos++; } (A_loc)->ncols[i-ilower]=relpos-ncols; } return 0; } class hypreParam { //Solveur and preconditionner public: char solver[BUFLEN]; char precon[BUFLEN]; //BoomerAMG parameter int amg_coarsentype ; /* Falgout coarsening */ int amg_relaxtype; /* hybrid Gauss-Seidel or SOR */ int amg_interptype; /* default*/ int amg_maxlevels; int amg_numsweeps; /*default*/ double amg_strongthreshold;/*suitable for 3D Laplace Operator*/ double amg_truncfactor; int amg_prntlevel; /* print setup info */ double amg_tol; //BoomerAMG Tolerance int amg_maxiter; int scale; int gsmg_sample, measure_type,cycle_type; int solv_stopcrit ; double trunc_factor; //More complex smoothers (Schwarz methods, Pilut, Parasails, Euclid) int smooth_type; int smooth_numlevels; int smooth_numsweeps; double pilut_droptol; double pilut_maxnz; int schwarz_overlap; int schwarz_variant; int schwarz_domaintype; //parasails parameter int sai_max_levels ; double sai_threshold ; double sai_filter ; int sai_sym ; int sai_log ; int VERBOSE; /***************************HYPRE_BOOMERAMG***********************/ double strong_threshold; int * num_grid_sweeps; int * grid_relax_type; int * grid_relax_points; double * relax_weight; double * omega; //Solver parameter (used for GMRES , PCG or BiCGStab) double solv_tol ; int solv_maxiter; int solv_kdim; int solv_log; int solv_prntlevel; int precond_id, solver_id,matrix_id,solver_type; int smooth_num_levels,smooth_num_sweeps,max_levels,Two_Norm; int domain_type, num_functions,variant,overlap,nonzeros_to_keep; double max_row_sum,drop_tol; int *dof_func; int pcg_max_its,rrow_size,Rel_change; int dscg_max_its,coarsen_type,hybrid,k_dim,num_sweep; int pmax_iter; double cf_tol,tol,pc_tol; double schwarz_rlx_weight; /*For timing*/ int timing; public : hypreParam(const KN ¶m_int, const KN ¶m_double) { amg_coarsentype =6; /* Falgout coarsening */ amg_relaxtype =3; /* hybrid Gauss-Seidel or SOR */ amg_interptype=0; /* default*/ amg_maxlevels=25; amg_numsweeps=1; /*default*/ amg_strongthreshold = 0.25;/*suitable for 3D Laplace Operator*/ amg_truncfactor=0.3; amg_prntlevel =1; /* print setup info */ amg_tol=0.0; //BoomerAMG Tolerance amg_maxiter=20; gsmg_sample=1; //More complex smoothers (Schwarz methods, Pilut, Parasails, Euclid) smooth_type=6; smooth_numlevels=3; smooth_numsweeps=1; pilut_droptol=1.0e-4; pilut_maxnz=100; schwarz_overlap=10; schwarz_variant=2; schwarz_domaintype=2; //parasails parameter sai_max_levels = 1; sai_threshold = 0.1; sai_filter = 0.1; sai_sym =0; sai_log = 1; int i; //Solver parameter (used for GMRES or BiCGStab) solv_tol = 1.0e-11; solv_maxiter = 1000; solv_kdim =40; solv_log = 0; solv_prntlevel = 2; precond_id=0;//BOOMER AMG solver_id=1; //GMRES as solver VERBOSE=0; scale=1; pmax_iter=30; rrow_size=1000; solv_stopcrit=1; amg_interptype =6; gsmg_sample =5; amg_coarsentype =6; measure_type =1;amg_strongthreshold=0.25; trunc_factor=1e-2; amg_maxiter=20; cycle_type=1; smooth_num_levels=3; smooth_num_sweeps=1; max_levels=25; hybrid=1; k_dim = 5; smooth_type = 6; num_functions = 1; smooth_num_levels = 3; smooth_num_sweeps = 2; num_sweep = 1; variant = 0; overlap = 10; domain_type = 2; nonzeros_to_keep = 1000; tol = 1.e-8; pc_tol = 0.; drop_tol = -1.; max_row_sum = 0.9; schwarz_rlx_weight = 1.; sai_threshold = 0.1; sai_filter = 0.1; relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } max_row_sum=0.9; schwarz_rlx_weight=1.; variant=0; num_functions=1; overlap=10; domain_type= 2; if(param_int.N()>0) {if((param_int[0]>=0)&&(param_int[0]<=9)) solver_id=param_int[0]; else solver_id=1;} //GMRES as solver if((solver_id!=4)&&(solver_id!=5)){ if(param_int.N()>1) {if((param_int[1]>=0)&&(param_int[1]<=9)) precond_id=param_int[1]; else precond_id=0;}//BOOMER AMG } if(param_int.N()>2) {if(param_int[2]>0) solv_maxiter = param_int[2];else solv_maxiter=1000;} if(param_int.N()>3) {if(param_int[3]>0) solv_kdim =param_int[3];else solv_kdim=40;} if(param_int.N()>4) {if(param_int[4]>=0) solv_prntlevel = param_int[4];} if(param_int.N()>5) {if(param_int[5]>=0) solv_log = param_int[5];} if(param_int.N()>6) {if(param_int[6]>=0) solv_stopcrit = param_int[6];} if(param_double.N()>0) {if(param_double[0]>0) solv_tol = param_double[0];} switch(precond_id) { case 0 : //Preconditionner AMG if(param_int.N()>7) {if(param_int[7]>=0) amg_interptype =param_int[7];} if(param_int.N()>8) {if(param_int[8]>=0) gsmg_sample =param_int[8];} if(param_int.N()>9) {if(param_int[9]>=0) amg_coarsentype =param_int[9];} if(param_int.N()>10) {if(param_int[10]>=0) measure_type =param_int[10];} if(param_double.N()>1) {if(param_double[1]>0) amg_strongthreshold = param_double[1];} if(param_double.N()>2) {if(param_double[2]>0) trunc_factor = param_double[2];} //if(param_int.N()>11) {if(param_int[11]>0) amg_maxiter=param_int[11];} if(param_int.N()>11) {if(param_int[11]>0) cycle_type=param_int[11];} if(param_int.N()>12) {if(param_int[12]>0) smooth_type=param_int[12];} if(param_int.N()>13) {if(param_int[13]>0) smooth_num_levels=param_int[13];} if(param_int.N()>14) {if(param_int[14]>0) smooth_num_sweeps=param_int[14];} if(param_int.N()>15) {if(param_int[15]>0) max_levels = param_int[15];} relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } if(param_double.N()>3) {if(param_double[3]>0) max_row_sum = param_double[3];else max_row_sum=0.9;} else max_row_sum=0.9; if(param_double.N()>4) {if(param_double[4]>0) schwarz_rlx_weight = param_double[4];else schwarz_rlx_weight=1.;} else schwarz_rlx_weight=1.; if(param_int.N()>16) {if(param_int[16]>0) variant = param_int[16];else variant=3;} else variant=3; if(param_int.N()>17) {if(param_int[17]>0) num_functions = param_int[17];else num_functions=1;} else num_functions=1; if(param_int.N()>18) {if(param_int[18]>0) overlap = param_int[18];else overlap=10;} else overlap=10; if(param_int.N()>19) {if(param_int[19]>0) domain_type = param_int[19]; else domain_type= 2;} else domain_type= 2; break; case 1: //Preconditionner PILUT if(param_double.N()>1) {if(param_double[1]>0) drop_tol = param_double[1]; else drop_tol=1e-5;} else drop_tol=1e-5; if(param_int.N()>7) {if(param_int[7]>0) nonzeros_to_keep = param_int[7]; else nonzeros_to_keep=1000;} else nonzeros_to_keep=1000; if(param_int.N()>8) {if(param_int[8]>0) pmax_iter = param_int[8];} if(param_int.N()>9) {if(param_int[9]>0) rrow_size = param_int[9];} break; case 2://Preconditionner ParaSails if(param_double.N()>1) {if(param_double[1]>0) sai_filter = param_double[1];else sai_filter=0.1;} else sai_filter=0.1; if(param_double.N()>2) {if(param_double[2]>0) sai_threshold = param_double[2];else sai_threshold=0.1;} else sai_threshold=0.1; if(param_int.N()>7) {if(param_int[7]>0) max_levels = param_int[7];else max_levels=1;} else max_levels=1; if(param_int.N()>8) {if(param_int[8]>0) sai_sym =param_int[8];else sai_sym=0;} else sai_sym=0; break; case 3: //Preconditionner Schwarz if(param_double.N()>1) {if(param_double[1]>0) schwarz_rlx_weight = param_double[1];schwarz_rlx_weight=1;} else schwarz_rlx_weight=1.; if(param_int.N()>7) {if(param_int[7]>0) variant = param_int[7];else variant=1;} else variant=1; if(param_int.N()>8) {if(param_int[8]>0) overlap = param_int[8];else overlap=1;} else overlap=1; if(param_int.N()>9) {if(param_int[9]>0) domain_type = param_int[9];else domain_type=3;} else domain_type=3; break; default: break; } } if(solver_id==4) // Solver AMG_HYBRID { if(param_double.N()>1) {if(param_double[1]>=0) amg_tol =param_double[1];else amg_tol=1e-9;} else amg_tol=1e-9; if(param_double.N()>2) {if(param_double[2]>=0) cf_tol =param_double[2];else cf_tol= 1e-3;} else cf_tol= 1e-3; if(param_int.N()>1) {if(param_int[1]>=0) solver_type =param_int[1];else solver_type=1;} else solver_type=1; if(param_int.N()>2) {if(param_int[2]>0) dscg_max_its=param_int[2];else dscg_max_its=1000;} else dscg_max_its=1000; if(param_int.N()>3) {if(param_int[3]>0) pcg_max_its=param_int[3];else pcg_max_its=200;} else pcg_max_its=200; if(param_int.N()>4) {if(param_int[4]>0) coarsen_type=param_int[4]; else coarsen_type=6;} else coarsen_type=6; if(param_double.N()>3) {if(param_double[3]>0) strong_threshold = param_double[3]; else strong_threshold=1e-3;} else strong_threshold=1e-3; if(param_double.N()>4) {if(param_double[4]>0) trunc_factor = param_double[4]; else trunc_factor=1e-2;} else trunc_factor=1e-2; if(param_int.N()>5) {if(param_int[5]>0) max_levels = param_int[5]; else max_levels=25;} else max_levels=25; if(param_double.N()>5) {if(param_double[5]>0) max_row_sum = param_double[5];else max_row_sum=0.9;} else max_row_sum=0.9; relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } } if(solver_id==3) { if(param_int.N()>7) {if(param_int[7]>=0) Two_Norm =param_int[7];else Two_Norm=2;} else Two_Norm=2; if(param_int.N()>8) {if(param_int[8]>=0) Rel_change =param_int[8];else Rel_change=1;} else Rel_change=1; } if(solver_id==5) //Solver AMG { if(param_int.N()>7) {if(param_int[7]>=0) amg_interptype =param_int[7];} if(param_int.N()>8) {if(param_int[8]>=0) gsmg_sample =param_int[8];} if(param_int.N()>9) {if(param_int[9]>=0) amg_coarsentype =param_int[9];} if(param_int.N()>10) {if(param_int[10]>=0) measure_type =param_int[10];} if(param_double.N()>2) {if(param_double[2]>0) amg_strongthreshold = param_double[2];} if(param_double.N()>3) {if(param_double[3]>0) trunc_factor = param_double[3];} if(param_int.N()>11) {if(param_int[11]>0) amg_maxiter=param_int[11];} if(param_int.N()>12) {if(param_int[12]>0) cycle_type=param_int[12];} if(param_int.N()>13) {if(param_int[13]>0) smooth_type=param_int[13];} if(param_int.N()>14) {if(param_int[14]>0) smooth_num_levels=param_int[14];} if(param_int.N()>15) {if(param_int[15]>0) smooth_num_sweeps=param_int[15];} if(param_int.N()>16) {if(param_int[16]>0) max_levels = param_int[16];} relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } if(param_double.N()>4) {if(param_double[4]>0) max_row_sum = param_double[4];else max_row_sum=1e-1;} else max_row_sum=1e-1; if(param_double.N()>5) {if(param_double[5]>0) schwarz_rlx_weight = param_double[5];else schwarz_rlx_weight=1.;} else schwarz_rlx_weight=1.; if(param_int.N()>17) {if(param_int[17]>0) variant = param_int[17];else variant=1;} else variant=1; if(param_int.N()>19) {if(param_int[18]>0) num_functions = param_int[18];else num_functions=5;} else num_functions=5; if(param_int.N()>20) {if(param_int[19]>0) overlap = param_int[19];else overlap=1;} else overlap=1; if(param_int.N()>21) {if(param_int[20]>0) domain_type = param_int[20];else domain_type= 1;} else domain_type= 1; } if(param_int.N()>22) {if(param_int[22]>0) VERBOSE = param_int[22];} if(param_int.N()>23) {if(param_int[23]>0) scale = param_int[23]; else scale=1;} else scale=1; if(param_int.N()>24) {if(param_int[24]>0) timing = param_int[24]; else timing=1;} else timing=1; } public : hypreParam() { int i; amg_coarsentype =6; /* Falgout coarsening */ amg_relaxtype =3; /* hybrid Gauss-Seidel or SOR */ amg_interptype=0; /* default*/ amg_maxlevels=25; amg_numsweeps=1; /*default*/ amg_strongthreshold = 0.25;/*suitable for 3D Laplace Operator*/ amg_truncfactor=0.3; amg_prntlevel =1; /* print setup info */ amg_tol=1e-7; //BoomerAMG Tolerance amg_maxiter=1; gsmg_sample=1; //Solver parameter (used for GMRES or BiCGStab) solv_tol = 1.0e-11; solv_maxiter = 1000; solv_kdim =40; solv_log = 0; solv_prntlevel = 2; precond_id=0;//BOOMER AMG solver_id=1; //GMRES as solver VERBOSE=0; scale=1; pmax_iter=30; rrow_size=1000; amg_interptype =0; gsmg_sample =1; amg_coarsentype =6; measure_type =1;amg_strongthreshold=0.25; trunc_factor=1e-2; amg_maxiter=20; cycle_type=1; smooth_type=6; smooth_num_levels=0; smooth_num_sweeps=2; max_levels=25; relax_weight = hypre_CTAlloc(double, max_levels); omega = hypre_CTAlloc(double, max_levels); for (i=0; i < max_levels; i++) { relax_weight[i] = 1.; omega[i] = 1.; } max_row_sum=0.9; schwarz_rlx_weight=1.; variant=0; num_functions=1; overlap=10; domain_type= 0; } public : hypreParam(char * fileparameter, MPI_Comm comm) { FILE *f; char buf[BUFLEN]; int num; int rk, size; MPI_Comm_rank(comm,&rk); MPI_Comm_size(comm, &size); amg_coarsentype =6; /* Falgout coarsening */ amg_relaxtype =3; /* hybrid Gauss-Seidel or SOR */ amg_interptype=0; /* default*/ amg_maxlevels=25; amg_numsweeps=1; /*default*/ amg_strongthreshold = 0.25;/*suitable for 3D Laplace Operator*/ amg_truncfactor=0.3; amg_prntlevel =1; /* print setup info */ amg_tol=0.0; //BoomerAMG Tolerance amg_maxiter=20; //More complex smoothers (Schwarz methods, Pilut, Parasails, Euclid) smooth_type=6; smooth_numlevels=3; smooth_numsweeps=1; pilut_droptol=1.0e-4; pilut_maxnz=100; schwarz_overlap=10; schwarz_variant=2; schwarz_domaintype=2; //parasails parameter sai_max_levels = 1; sai_threshold = 0.1; sai_filter = 0.05; sai_sym =0; sai_log = 1; //Solver parameter (used for GMRES or BiCGStab) solv_tol = 1.0e-30; solv_maxiter = 80; solv_kdim =40; // int solv_stopcrit = 1; //only for BiCGSTAB solv_log = 0; solv_prntlevel = 0; precond_id=0;//BOOMER AMG solver_id=1; //GMRES as solver VERBOSE=0; scale=1; if(fileparameter==NULL) { if(rk==0) printf("%s","Set default parameter because you not precise the parameter file \n \n"); solver_id=1; //GMRES as solver precond_id=0;//BOOMER AMG } else if( (f=fopen(fileparameter,"r") )==NULL) { if(rk==0)printf("%s","Set default parameter because your parameter file not exist \n \n"); solver_id=1; //GMRES as solver precond_id=0;//BOOMER AMG } else { if(rk==0) printf("%s%s%s","Read parameter from file ", fileparameter, "\n \n"); num =0; while(fgets(buf, BUFLEN, f) != NULL) { switch(num) { case 0: sscanf(buf, "%s", solver); break; case 1: sscanf(buf, "%d", &solver_id); break; case 2: sscanf(buf, "%lf", &solv_tol); break; case 3: sscanf(buf, "%d", &solv_maxiter); break; case 4: sscanf(buf, "%d", &solv_prntlevel); break; case 5: sscanf(buf, "%d", &solv_log); if(solver_id!=1) {fgets(buf, BUFLEN, f);num++;} break; case 6: sscanf(buf, "%d", &solv_kdim); break; case 7: sscanf(buf, "%s", precon); break; case 8: sscanf(buf, "%d", &precond_id); if(precond_id==2) //The parameter of preconditionner is inside file { fclose(f); exit(1); } break; case 9: if(precond_id==0) sscanf(buf, "%d", &amg_coarsentype); if(precond_id==1) sscanf(buf, "%lf", &sai_threshold); break; case 10: if(precond_id==0) sscanf(buf, "%d", &amg_prntlevel); if(precond_id==1) sscanf(buf, "%d", &sai_max_levels); break; case 11: if(precond_id==0) sscanf(buf, "%d", &amg_interptype); if(precond_id==1) sscanf(buf, "%lf", &sai_filter); break; case 12: if(precond_id==0) sscanf(buf, "%d", &amg_maxlevels); if(precond_id==1) case 17: sscanf(buf, "%d", &amg_prntlevel); break; case 18: sscanf(buf, "%lf", &amg_tol); break; case 19: sscanf(buf, "%d", &amg_maxiter); break; case 20: sscanf(buf, "%d", &scale); break; default: break; } num++; } if(fclose(f)==EOF) printf("%s","Error while closing the file \n"); else printf("%s","File is well close \n"); } } }; class HypreSolver : public MatriceMorse::VirtualSolver { mutable HYPRE_IJMatrix ij_A; mutable HYPRE_IJVector ij_B; mutable HYPRE_IJVector ij_X; mutable HYPRE_ParCSRMatrix par_A; mutable HYPRE_ParVector par_B; mutable HYPRE_ParVector par_X; void *object; HYPRE_ParCSRMatrix parcsr_A; string data_option; mutable int time_index,time_index1; mutable HYPRE_Solver solver; mutable HYPRE_Solver precond; mutable hypreParam *param; mutable double *scaletmpr, *scaletmpc; mutable int rk,size; int jlower, jupper; int ilower, iupper; mutable int num_iter; mutable double final_res_norm; mutable double tgv,eps,tol_pivot,tol_pivot_sym,epsr; sparse_mat_loc A_loc; mutable int *iwork, *maptmp, *mapptr, *iwork1,*riord; mutable int n_loc,n,VERBOSE; mutable MPI_Comm comm; mutable int pcg_num_its,dscg_num_its; public: HypreSolver(const MatriceMorse &AA,string datafile, KN ¶m_int, KN ¶m_double, MPI_Comm * mpicommw ) { int i,j,ierrr; if(mpicommw==NULL){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; /*****INITIALIZE MPI ENVIRONMENT*****/ ierrr = MPI_Comm_rank(comm, &rk); ierrr = MPI_Comm_size(comm, &size); if(((param_double!=NULL)||(param_int!=NULL))&&(datafile.empty())) { if(rk==0) cout << "#########PARAMETERS ARE SET INSIDE A VECTOR###"<< endl; param=new hypreParam(param_int,param_double); } if((datafile.empty())&&((param_int==NULL)&&(param_double==NULL))) { if(rk==0) cout << "###########DEFAULT PARAMETERS WILL BE SET#######"<< endl; param= new hypreParam(); } if((!datafile.empty())&&((param_int==NULL)&&(param_double==NULL))) { if(rk==0) cout << "#########PARAMETERS ARE INSIDE A FILE#########"<< endl; char *p; p=new char[datafile.length()+1]; strcpy(p,datafile.c_str()); param= new hypreParam(p,comm); } /*################################################### USING HYPRE ####################################################*/ int n,nnz, *pr, *p,ierr; double * AAv; n=AA.n; nnz=AA.nbcoef; /*################################################## COPY ENTRY MATRIX ##################################################*/ if(param->timing){ time_index = hypre_InitializeTiming("MATRIX DISTRIBUTION"); hypre_BeginTiming(time_index); } pr= new int[n+1];p= new int[nnz]; AAv=new double[nnz]; for(i=0;iscale) { job = 1; /*-- compute 1-norm */ tmp = 2; /*-- compute 2-norm */ scaletmpr=new double[n]; scaletmpc=new double[n]; roscal(n,job,tmp,AAv,p,pr,scaletmpr,&ierr); if (ierr) fprintf(stderr, "ERROR: IN ROSCAL, IERR = %d\n", ierr); /*------- scale the RHS according to row scaling coefficients */ coscal(n,job,tmp,AAv,p,pr,scaletmpc,&ierr); if (ierr) fprintf(stderr, "ERROR : IN COSCAL, IERR = %d\n", ierr); } /*--- end of branch on scaling */ /************************************************************* Distribute input matrix into local structures *************************************************************/ int type=0,wgtflag=0, numflag=0, volume; //0=CSR; 1=CSC int option[5]; option[0]=0; riord=(int *)malloc(sizeof(int)*n); if(riord==NULL){if(rk==0) printf("%s","IN PARTITION , MEMORY ALLOCATION FAILED \n");exit(1);} /************************USE METIS FOR DATA DISTRIBUTION**************************/ if(size>1) METIS_PartGraphKway(&n, pr, p, NULL, NULL, &wgtflag, &numflag,&size, option, &volume, riord); else if(size==1){ for (i=0; itiming){ hypre_EndTiming(time_index); hypre_PrintTiming("IJ Matrix Setup", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } /************************************************************* Create preconditioner Setup and Use solver **************************************************************/ param->timing=1; switch(param->solver_id){ case 0 : //BiCGStab solver HYPRE_ParCSRBiCGSTABCreate(comm, &solver); HYPRE_ParCSRBiCGSTABSetTol(solver, param->solv_tol); HYPRE_ParCSRBiCGSTABSetMaxIter(solver, param->solv_maxiter); //HYPRE_ParCSRBiCGSTABSetStopCrit(solver, solv_stopcrit); HYPRE_ParCSRBiCGSTABSetPrintLevel(solver, param->solv_prntlevel); HYPRE_ParCSRBiCGSTABSetLogging(solver, param->solv_log); //Set Preconditioner switch (param->precond_id){ case 0 : //set BoomerAMG as preconditioner if(rk==0) printf("SOLVER: BOOMERAMG-BiCGSTAB\n"); HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetInterpType(precond, param->amg_interptype); HYPRE_BoomerAMGSetTol(precond, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(precond, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(precond,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(precond,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(precond, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(precond,param->cycle_type); HYPRE_BoomerAMGSetSmoothType(precond,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(precond,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond,param->max_row_sum); HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type); HYPRE_BiCGSTABSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); break; case 4: /*use diagonal scaling as preconditioner*/ if(rk==0) printf("SOLVER: DS-BiCGSTAB\n"); precond=NULL; HYPRE_ParCSRBiCGSTABSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScaleSetup, precond); break; case 1: /*Use PILUT as preconditioner*/ if(rk==0) printf("SOLVER: PILUT-BiCGSTAB\n"); ierr=HYPRE_ParCSRPilutCreate(comm,&precond); if(ierr) printf("ERROR: PILUT-BiCGSTAB\n"); if(param->drop_tol>=0) HYPRE_ParCSRPilutSetDropTolerance(precond,param->drop_tol); if(param->nonzeros_to_keep>=0) HYPRE_ParCSRPilutSetFactorRowSize(precond,param->nonzeros_to_keep); HYPRE_ParCSRBiCGSTABSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSetup, precond); break; case 2: if(rk==0) printf("SOLVER: ParaSails-BicGSTAB\n"); ierr=HYPRE_ParaSailsCreate(comm,&precond); if(ierr) printf("ERROR: ParaSails-BicGSTAB\n"); HYPRE_ParaSailsSetParams(precond,param->sai_threshold,param->max_levels); HYPRE_ParaSailsSetFilter(precond,param->sai_filter); HYPRE_ParaSailsSetSym(precond,param->sai_sym); HYPRE_ParCSRBiCGSTABSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSetup, precond); break; case 3: if(rk==0) printf("SOLVER: Schwarz-PCG \n"); HYPRE_SchwarzCreate(&precond); HYPRE_SchwarzSetVariant(precond,param->variant); HYPRE_SchwarzSetOverlap(precond,param->overlap); HYPRE_SchwarzSetDomainType(precond,param->domain_type); //HYPRE_SchwarzSetRelaxWeight(precond,param->schwarz_rlx_weight); /*HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type);*/ HYPRE_BiCGSTABSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, precond); break; default: break; } break; case 2:/*USE PCG AS SOLVER*/ HYPRE_ParCSRPCGCreate(comm, &solver); HYPRE_ParCSRPCGSetTol(solver, param->solv_tol); HYPRE_PCGSetMaxIter(solver, param->solv_maxiter); HYPRE_PCGSetPrintLevel(solver, param->solv_prntlevel); HYPRE_PCGSetTwoNorm(solver, param->Two_Norm); HYPRE_PCGSetRelChange(solver,param->Rel_change); HYPRE_PCGGetPrecond(solver,&precond); switch (param->precond_id){ case 0 : //set BoomerAMG as preconditioner in PCG if(rk==0) printf("SOLVER: AMG-PCG\n"); HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetInterpType(precond, param->amg_interptype); HYPRE_BoomerAMGSetTol(precond, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(precond, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(precond,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(precond,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(precond, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(precond,param->cycle_type); HYPRE_BoomerAMGSetSmoothType(precond,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(precond,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond,param->max_row_sum); HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type); HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToSolverFcn) HYPRE_BoomerAMGSetup, precond); break; case 2: if(rk==0) printf("SOLVER: ParaSails-PCG\n"); ierr=HYPRE_ParaSailsCreate(comm,&precond); if(ierr) printf("ERROR: ParaSails-PCG\n"); HYPRE_ParaSailsSetParams(precond,param->sai_threshold,param->max_levels); HYPRE_ParaSailsSetFilter(precond,param->sai_filter); HYPRE_ParaSailsSetSym(precond,param->sai_sym); HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, precond); break; case 3: if(rk==0) printf("SOLVER: Schwarz-PCG \n"); HYPRE_SchwarzCreate(&precond); HYPRE_SchwarzSetVariant(precond,param->variant); HYPRE_SchwarzSetOverlap(precond,param->overlap); HYPRE_SchwarzSetDomainType(precond,param->domain_type); //HYPRE_SchwarzSetRelaxWeight(precond,param->schwarz_rlx_weight); /*HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type);*/ HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToSolverFcn) HYPRE_SchwarzSetup, precond); break; default: break; } break; case 5: if(rk==0) printf("SOLVER: AMG \n"); HYPRE_BoomerAMGCreate(&solver); HYPRE_BoomerAMGSetInterpType(solver, param->amg_interptype); HYPRE_BoomerAMGSetNumSamples(solver, param->gsmg_sample); HYPRE_BoomerAMGSetTol(solver, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(solver, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(solver,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(solver, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(solver,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(solver, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(solver,param->cycle_type); HYPRE_BoomerAMGSetRelaxWeight(solver,param->relax_weight); HYPRE_BoomerAMGSetOmega(solver,param->omega); HYPRE_BoomerAMGSetSmoothType(solver,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(solver,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(solver,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(solver,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(solver,param->max_row_sum); HYPRE_BoomerAMGSetVariant(solver, param->variant); // HYPRE_BoomerAMGSetNumFunctions(solver, param->num_functions); //HYPRE_BoomerAMGSetSchwarzRlxWeight(solver,param->schwarz_rlx_weight); HYPRE_BoomerAMGSetOverlap(solver, param->overlap); HYPRE_BoomerAMGSetVariant(solver, param->domain_type); /* if(param->num_functions>1) HYPRE_BoomerAMGSetDofFunc(solver,param->dof_func);*/ break; case 4: if(rk==0) printf("SOLVER: AMG_HYBRID \n"); HYPRE_ParCSRHybridCreate(&solver); HYPRE_ParCSRHybridSetTol(solver, param->amg_tol); HYPRE_ParCSRHybridSetCoarsenType(solver,param->coarsen_type); HYPRE_ParCSRHybridSetStrongThreshold(solver, param->strong_threshold); HYPRE_ParCSRHybridSetTruncFactor(solver,param->trunc_factor); HYPRE_ParCSRHybridSetDSCGMaxIter(solver,param->dscg_max_its); HYPRE_ParCSRHybridSetPCGMaxIter(solver,param->pcg_max_its); HYPRE_ParCSRHybridSetConvergenceTol(solver, param->cf_tol); HYPRE_ParCSRHybridSetSolverType(solver, param->solver_type); HYPRE_ParCSRHybridSetRelaxWeight(solver,param->relax_weight); HYPRE_ParCSRHybridSetOmega(solver,param->omega); HYPRE_ParCSRHybridSetMaxLevels(solver,param->max_levels); HYPRE_ParCSRHybridSetMaxRowSum(solver,param->max_row_sum); break; case 1:/*GMRES AS SOLVER*/ HYPRE_ParCSRFlexGMRESCreate (comm, &solver); HYPRE_ParCSRFlexGMRESSetPrintLevel(solver,VERBOSE); HYPRE_ParCSRFlexGMRESSetKDim(solver,param->solv_kdim); HYPRE_ParCSRFlexGMRESSetMaxIter(solver, param->solv_maxiter ); HYPRE_ParCSRFlexGMRESSetTol(solver,param->solv_tol ); HYPRE_FlexGMRESSetLogging(solver, param->solv_log); HYPRE_ParCSRGMRESSetPrintLevel(solver,param->solv_prntlevel); //Set Preconditioner switch (param->precond_id){ case 0 : //set BoomerAMG as preconditioner if(rk==0) printf("SOLVER: AMG-GMRES\n"); HYPRE_BoomerAMGCreate(&precond); HYPRE_BoomerAMGSetInterpType(precond, param->amg_interptype); // HYPRE_BoomerAMGSetTol(precond, param->amg_tol); HYPRE_BoomerAMGSetCoarsenType(precond, param->amg_coarsentype); HYPRE_BoomerAMGSetMeasureType(precond,param-> measure_type); HYPRE_BoomerAMGSetStrongThreshold(precond, param->amg_strongthreshold); HYPRE_BoomerAMGSetTruncFactor(precond,param->trunc_factor); HYPRE_BoomerAMGSetMaxIter(precond, param->amg_maxiter); HYPRE_BoomerAMGSetCycleType(precond,param->cycle_type); HYPRE_BoomerAMGSetSmoothType(precond,param->smooth_type); HYPRE_BoomerAMGSetSmoothNumLevels(precond,param->smooth_num_levels); HYPRE_BoomerAMGSetSmoothNumSweeps(precond,param->smooth_num_sweeps); HYPRE_BoomerAMGSetMaxLevels(precond,param->max_levels); HYPRE_BoomerAMGSetMaxRowSum(precond,param->max_row_sum); HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type); HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSolve, (HYPRE_PtrToParSolverFcn) HYPRE_BoomerAMGSetup, precond); break; case 4: /*use diagonal scaling as preconditioner*/ if(rk==0) printf("SOLVER: DS-GMRES\n"); precond = NULL; HYPRE_ParCSRFlexGMRESSetPrecond (solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScale, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRDiagScaleSetup, precond); break; case 1: /*Use PILUT as preconditioner*/ if(rk==0) printf("SOLVER: PILUT-GMRES\n"); ierr=HYPRE_ParCSRPilutCreate(comm,&precond); HYPRE_ParCSRPilutSetMaxIter(precond,param->pmax_iter); if(param->drop_tol>=0) HYPRE_ParCSRPilutSetDropTolerance(precond,param->drop_tol); if(param->nonzeros_to_keep>=0) HYPRE_ParCSRPilutSetFactorRowSize(precond,param->nonzeros_to_keep); if(ierr) printf("ERROR: PILUT-GMRES \n"); HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParCSRPilutSetup, precond); break; case 3: if(rk==0) printf("SOLVER: Schwarz-GMRES \n"); HYPRE_SchwarzCreate(&precond); HYPRE_SchwarzSetVariant(precond,param->variant); HYPRE_SchwarzSetOverlap(precond,param->overlap); HYPRE_SchwarzSetDomainType(precond,param->domain_type); //HYPRE_SchwarzSetRelaxWeight(precond,param->schwarz_rlx_weight); /*HYPRE_BoomerAMGSetOverlap(precond, param->overlap); HYPRE_BoomerAMGSetVariant(precond, param->variant); HYPRE_BoomerAMGSetDomainType(precond, param->domain_type);*/ HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_SchwarzSolve, (HYPRE_PtrToParSolverFcn) HYPRE_SchwarzSetup, precond); break; case 2: if(rk==0) printf("SOLVER: ParaSails-GMRES\n"); ierr=HYPRE_ParaSailsCreate(comm,&precond); if(ierr) printf("ERROR: ParaSails-GMRES\n"); HYPRE_ParaSailsSetParams(precond,param->sai_threshold,param->max_levels); HYPRE_ParaSailsSetFilter(precond,param->sai_filter); HYPRE_ParaSailsSetSym(precond,param->sai_sym); HYPRE_ParCSRFlexGMRESSetPrecond(solver, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSolve, (HYPRE_PtrToParSolverFcn) HYPRE_ParaSailsSetup, precond); break; } default: break; } } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; int i, i1,i2; int *row,*row1; double * b_loc,*X_loc,*rhs,*xx; n=AA.n; rhs= (double *)malloc(sizeof(double)*n); xx= (double *)malloc(sizeof(double)*n); x= (double *)malloc(sizeof(double)*n); i1=ilower; i2=iupper; double t2,t1; for(i=0;iscale) for(i = 0; i < n; i++) rhs[i] *= scaletmpr[i]; b_loc=(double *)malloc(n_loc*sizeof(double)); X_loc=(double *)malloc(n_loc*sizeof(double)); row=(int *)malloc(n_loc*sizeof(int)); row1=(int *)malloc(n_loc*sizeof(int)); for(i=i1;i <=i2; i++){ // node = maptmp[i]; b_loc[i-i1]=rhs[i]; X_loc[i-i1]=0.0; //Initial Guest row[i-i1]=i; //used to get results later row1[i-i1]=i; } int ierr=0; HYPRE_IJVectorCreate(comm, ilower, iupper, &ij_B); HYPRE_IJVectorCreate(comm, ilower, iupper, &ij_X); HYPRE_IJVectorSetObjectType(ij_B, HYPRE_PARCSR); HYPRE_IJVectorSetObjectType(ij_X, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_B); HYPRE_IJVectorInitialize(ij_X); HYPRE_IJVectorSetValues(ij_B, n_loc, row, b_loc); HYPRE_IJVectorSetValues(ij_X, n_loc, row, X_loc); HYPRE_IJVectorAssemble(ij_B); HYPRE_IJVectorAssemble(ij_X); ierr=HYPRE_IJVectorGetObject(ij_B, (void **) &par_B); ierr=HYPRE_IJVectorGetObject(ij_X, (void **) &par_X); switch (param->solver_id){ case 0 : //BICGSTAB solver if(param->timing){ time_index1 = hypre_InitializeTiming("BiCGSTAB SETUP"); hypre_BeginTiming(time_index1); } HYPRE_ParCSRBiCGSTABSetup (solver, par_A, par_B, par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("BiCGSTAB SETUP TIME", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR BICGSTAB Solver"); hypre_BeginTiming(time_index1);} HYPRE_ParCSRBiCGSTABSolve (solver, par_A, par_B, par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("SOLVE PHASE TIMES", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_ParCSRBiCGSTABGetNumIterations(solver, &num_iter); HYPRE_ParCSRBiCGSTABGetFinalRelativeResidualNorm(solver, &final_res_norm); //HYPRE_ParCSRBiCGSTABDestroy(solver); break; case 1 : //GMRES Solver if(param->timing){ time_index1 = hypre_InitializeTiming("GMRES SETUP"); hypre_BeginTiming(time_index1); } HYPRE_FlexGMRESSetup(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index); hypre_PrintTiming("SETUP PHASE TIME", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR GMRES Solver"); hypre_BeginTiming(time_index1); } HYPRE_FlexGMRESSolve(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_GMRESGetNumIterations(solver, &num_iter); HYPRE_GMRESGetFinalRelativeResidualNorm(solver, &final_res_norm); //HYPRE_ParCSRGMRESDestroy(solver); break; case 2 : //PCG if(param->timing){ time_index1 = hypre_InitializeTiming("PCG SETUP"); hypre_BeginTiming(time_index1); } HYPRE_PCGSetup(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index); hypre_PrintTiming("SETUP PHASE TIME", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR PCG Solve"); hypre_BeginTiming(time_index1);} HYPRE_PCGSolve(solver, (HYPRE_Matrix)par_A, (HYPRE_Vector)par_B, (HYPRE_Vector)par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_ParCSRPCGGetNumIterations(solver,&dscg_num_its); HYPRE_ParCSRPCGGetFinalRelativeResidualNorm(solver,&final_res_norm); break; case 4: if(param->timing){ time_index1 = hypre_InitializeTiming("HYBRID SETUP"); hypre_BeginTiming(time_index1); } HYPRE_ParCSRHybridSetup(solver,par_A,par_B,par_X); if(param->timing){ hypre_EndTiming(time_index); hypre_PrintTiming("SETUP PHASE TIME", comm); hypre_FinalizeTiming(time_index); hypre_ClearTiming(); } if(param->timing){ time_index1 = hypre_InitializeTiming("ParCSR Hybrid Solve"); hypre_BeginTiming(time_index1);} HYPRE_ParCSRHybridSolve(solver,par_A,par_B,par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} HYPRE_ParCSRHybridGetNumIterations(solver,&num_iter); HYPRE_ParCSRHybridGetPCGNumIterations(solver,&pcg_num_its); HYPRE_ParCSRHybridGetDSCGNumIterations(solver,&dscg_num_its); HYPRE_ParCSRHybridGetFinalRelativeResidualNorm(solver,&final_res_norm); if(rk==0){ printf("\n"); printf("Iterations = %d\n", num_iter); printf("PCG_Iterations = %d\n", pcg_num_its); printf("DSCG_Iterations = %d\n", dscg_num_its); printf("Final Relative Residual Norm = %e\n", final_res_norm); printf("\n"); } break; case 5: if(param->timing){ time_index1 = hypre_InitializeTiming("BoomerAMG SETUP"); hypre_BeginTiming(time_index1); } HYPRE_BoomerAMGSetup(solver,par_A, par_B,par_X); if(param->timing){ time_index1 = hypre_InitializeTiming("BoomerAMG SETUP Solve"); hypre_BeginTiming(time_index1);} HYPRE_BoomerAMGSolve(solver,par_A,par_B,par_X); if(param->timing){ hypre_EndTiming(time_index1); hypre_PrintTiming("Solve phase times", comm); hypre_FinalizeTiming(time_index1); hypre_ClearTiming();} break; default : break; } /*Reconstruction of vector*/ delete [] iwork1; delete []mapptr; iwork1=new int[size+1]; mapptr=new int[size+1]; int disp=0; for(i=0;iscale) x[i]=x[i]*scaletmpc[i];} if(verbosity==0) { MPI_Barrier(comm); t2 = dwalltime(); t2=t2-t1; MPI_Reduce(&t2, &t1, 1, MPI_DOUBLE, MPI_MAX, 0,comm); MPI_Bcast(&t1, 1, MPI_DOUBLE,0,comm); if(rk==0){printf("%s%18.6g%s","TIME FOR SOLVING ", fabs(t1) ,"\n \n"); printf("%s%18.6g%s","RELATIVE RESIDU ", final_res_norm ,"\n \n"); printf("%s%d%s","NUMBER OF ITERATION ", num_iter ," \n \n"); } } if(X_loc!=NULL) free(X_loc); if(rhs!=NULL) free(rhs); if(xx!=NULL) free(xx); if(b_loc!=NULL) free(b_loc); if(row!=NULL) free(row); if(iwork1!=NULL) delete [] iwork1; if(mapptr!=NULL) delete [] mapptr; } ~HypreSolver() { if(verbosity){ cout << "~HypreSolver():" << endl; HYPRE_IJMatrixDestroy(ij_A); HYPRE_IJVectorDestroy(ij_B); HYPRE_IJVectorDestroy(ij_X); switch (param->solver_id){ case 0 : //BICGSTAB solver HYPRE_ParCSRBiCGSTABDestroy(solver); switch(param->precond_id){ case 0: HYPRE_BoomerAMGDestroy(precond); break; case 5: HYPRE_ParaSailsDestroy(precond); break; case 6: HYPRE_SchwarzDestroy(precond); break; case 4: HYPRE_ParCSRPilutDestroy(precond); break; default: break; } break; case 1 : //GMRES Solver HYPRE_ParCSRFlexGMRESDestroy(solver); switch(param->precond_id){ case 0: HYPRE_BoomerAMGDestroy(precond); break; case 5: HYPRE_ParaSailsDestroy(precond); break; case 6: HYPRE_SchwarzDestroy(precond); break; case 4: HYPRE_ParCSRPilutDestroy(precond); break; default: break; } break; case 3 : //PCG HYPRE_ParCSRPCGDestroy(solver); switch(param->precond_id){ case 0: HYPRE_BoomerAMGDestroy(precond); break; case 5: HYPRE_ParaSailsDestroy(precond); break; case 6: HYPRE_SchwarzDestroy(precond); break; default: break; } break; case 4: //AMG-Hybrid HYPRE_ParCSRHybridDestroy(solver); break; case 5: //AMG HYPRE_BoomerAMGDestroy(solver); break; default : break; } } } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; inline MatriceMorse::VirtualSolver * BuildHypreSolver(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverHypre>" << endl; return new HypreSolver(*A,ds.data_filename, ds.lparams, ds.dparams,(MPI_Comm *)ds.commworld); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return 1; } bool SetHypreSolver() { if(verbosity>1) cout << " SetDefault sparse solver to Hyprempi" << endl; DefSparseSolver::solver =BuildHypreSolver; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return 1; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Hyprempi, defaultsolver defaultsolverHyprempi" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildHypreSolver; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoHyprempi","(",new OneOperator0(SetHypreSolver)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/interfacepastix.cpp000644 000767 000024 00000037640 12467062125 022247 0ustar00hechtstaff000000 000000 /* Interface entre freefem++ et pastix */ //ff-c++-LIBRARY-dep: double_pastix blas parmetis metis scotch mpi fc //ff-c++-cpp-dep: #include #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include #include #include #include #include #include #include #include // #include // #include // #include // #include // //#include // #include // #include // #include // #include "mpi.h" // #include // #include "pastix.h" // #include "cscd_utils.h" // #include "read_matrix.h" #include extern "C"{ #include "pastix.h" } //#include "cscd_utils.h" //#include "read_matrix.h" #undef memFree_null #define memFree_null(x) {if (x ==NULL) {fprintf(stdout,"%s:%d freeing NULL\n",__FILE__,__LINE__);} free(x); x=NULL;} #define STR_SIZE 256 static pastix_int_t * pastixint(int * ii){ return (pastix_int_t*) (void *) ii;} static pastix_float_t * pastixfloat(double * ii){ return (pastix_float_t*) (void *) ii;} typedef struct pastix_param { pastix_data_t *pastix_data; /*Pointer used by PaStiX to keep information alive between calls */ MPI_Comm comm; /* Communicator used by PaStiX */ pastix_int_t Ncol; /* Size of the Matrix */ pastix_int_t *ia; /* Index of first element of each column in ja and avals */ pastix_int_t *ja; /* Rows of the unknows of the matrix */ pastix_float_t *avals; /* Values of the matrix */ pastix_int_t *perm; /* Permutation used for re-numbering of the unknowns */ pastix_int_t *invp; /* Inverse permutation */ pastix_float_t *rhs; /* Right hand side */ pastix_int_t *iparm; /* Integer parameters */ double *dparm; /* Floating parameters */ } pastix_param_t; void Morse_to_CSC(int m, int n, int nnz, double *a, int *colind, int *rowptr, pastix_float_t **at, pastix_int_t **rowind, pastix_int_t **colptr) { register int i, j, col, relpos; pastix_int_t *marker; /* Allocate storage for another copy of the matrix. */ *at = (pastix_float_t *) malloc(sizeof(pastix_float_t)*nnz); *rowind = (pastix_int_t *) malloc(sizeof(pastix_int_t)*nnz); *colptr = (pastix_int_t *) malloc(sizeof(pastix_int_t)*(n+1)); marker = (pastix_int_t *) malloc(sizeof(pastix_int_t)*n); for (i = 0; i < n; ++i) marker[i] = 0; /* Get counts of each column of A, and set up column pointers */ for (i = 0; i < m; ++i) for (j = rowptr[i]; j < rowptr[i+1]; ++j) ++marker[colind[j]]; (*colptr)[0] = 0; for (j = 0; j < n; ++j) { (*colptr)[j+1] = (*colptr)[j] + marker[j]; marker[j] = (*colptr)[j]; } /* Transfer the matrix into the compressed column storage. */ for (i = 0; i < m; ++i) { for (j = rowptr[i]; j < rowptr[i+1]; ++j) { col = colind[j]; relpos = marker[col]; (*rowind)[relpos] = i; (*at)[relpos] = a[j]; ++marker[col]; } } free(marker); } static const int MAX_CHAR_PER_LINE=256; void read_datafile_pastixff(const string &datafile, pastix_int_t *iparmtab, double *dparmtab){ FILE* m_File; int i = 0; char szbuff[MAX_CHAR_PER_LINE]; char* token; char filename[datafile.size()+1]; strcpy( filename, datafile.c_str()); m_File = fopen(filename,"rt"); if(!m_File) { printf("error in reading filename %s\n",&filename); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"iparm") == 0) ){ printf("freefem++: error in reading iparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading iparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); iparmtab[i] = (pastix_int_t)atol(token); i++; } i=0; fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"dparm") == 0) ){ printf("freefem++: error in reading dparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading dparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); dparmtab[i] = atof(token); i++; } fclose(m_File); #ifdef OOC /* if (iparmtab[IPARM_OOC_THREAD] > 1) */ iparmtab[IPARM_OOC_THREAD] = 1; #endif /* On empeche le 2d avec NUMA_ALLOC */ #ifdef NUMA_ALLOC if (iparmtab[IPARM_DISTRIBUTION_LEVEL] != 0) { errorPrint("2D not available with NUMA allocation\n"); exit(-1); } #endif } // ATTENTION :: pastix_float_t // peut tre soit un complex ou un reel cela depend de la maniere dont on a compiler pastix // CAS DOUBLE SEULEMENT class dSolvepastixmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 int paraoption; int myid, mpi_size; int Nrow; int mpi_flag; int init_raff; int thrd_flag; int SYM; string data_option; mutable pastix_int_t iparm[64]; mutable double dparm[64]; mutable pastix_int_t Ncol; mutable pastix_int_t *ia; mutable pastix_int_t *ja; mutable pastix_float_t *avals; mutable pastix_int_t *loc2glob; //char *Type = NULL; //char *RhsType = NULL; mutable pastix_float_t *rhs; mutable pastix_int_t *perm; mutable pastix_int_t *invp; mutable pastix_data_t *pastix_data; public: dSolvepastixmpi(const MatriceMorse &AA, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN &pperm_c) : data_option(datafile) { //int m; //int ierr; struct timeval tv1, tv2; ia = NULL; ja = NULL; avals = NULL; loc2glob = NULL; rhs = NULL; pastix_data = NULL; // matrix assembled on host MPI_Comm_rank(MPI_COMM_WORLD, &myid); printf("- Rang MPI : %d\n", myid); MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); // SYMETRIQUE mpi_flag = 0; thrd_flag = 0; Ncol = AA.m; Nrow = AA.n; // Avant : on ecrit la transpose /* ia = (pastix_int_t *) malloc( (Ncol+1)*sizeof(pastix_int_t)); for(int ii=0; ii < Ncol+1; ii++){ ia[ii] = AA.lg[ii]+1; } assert( ia[Ncol]-1 == AA.nbcoef ); ja = (pastix_int_t *) malloc((ia[Ncol]-1)*sizeof(pastix_int_t)); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = AA.cl[ii]+1; if( sizeof(pastix_float_t) == sizeof(double) ){ avals = (pastix_float_t *) malloc( (ia[Ncol]-1)*sizeof(pastix_float_t)); for(int ii=0; ii < ia[Ncol]-1; ii++) avals[ii] = AA.a[ii]; } */ // AA.cl : indices des colonnes // AA.lg : pointeurs des lignes Morse_to_CSC( AA.n , AA.m, AA.nbcoef, AA.a, AA.cl, AA.lg, &avals, &ja, &ia); // ia : pointeurs des colonnes // ja : indices des lignes cout << "AA.n= "<< AA.n << " AA.m=" << AA.m << " AA.nbcoef=" << AA.nbcoef << endl; for(int ii=0; ii < Ncol+1; ii++){ ia[ii] = ia[ii]+1; } assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++){ ja[ii] = ja[ii]+1; } perm = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); invp = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); rhs = (pastix_float_t *) malloc(Ncol*sizeof(pastix_float_t)); // reading permutation given by the user if(pperm_r) for(int ii=0; ii < Ncol; ii++) perm[ii] = pperm_r[ii]; if(pperm_c) for(int ii=0; ii < Ncol; ii++) invp[ii] = pperm_c[ii]; // CAS DE LA MATRICE NON DISTRIBUER pastix_int_t init_raff; fprintf(stdout,"-- INIT PARAMETERS --\n"); // reading iparm from array if(!data_option.empty()) read_datafile_pastixff(data_option,iparm,dparm); else if(param_int || param_double){ if( param_int ) { cout << "read param_int" << endl; assert(param_int.N() == 64); for(int ii=0; ii<64; ii++) iparm[ii] = param_int[ii]; iparm[IPARM_MODIFY_PARAMETER] = API_YES; } if( param_double ) { cout << "read param_double" << endl; assert(param_double.N() == 64); for(int ii=0; ii<64; ii++) dparm[ii] = param_double[ii]; } } else{ iparm[IPARM_MODIFY_PARAMETER] = API_NO; cout << "initialize parameter" << endl; } iparm[IPARM_START_TASK] = API_TASK_INIT; iparm[IPARM_END_TASK] = API_TASK_INIT; iparm[IPARM_SYM] = API_SYM_NO; // Matrix is considered nonsymetric pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); fprintf(stdout,"-- FIN INIT PARAMETERS --\n"); init_raff = iparm[IPARM_ITERMAX]; fflush(stdout); /* Passage en mode verbose */ iparm[IPARM_RHS_MAKING] = API_RHS_B; if( !param_int && data_option.empty() ){ iparm[IPARM_MATRIX_VERIFICATION] = API_YES; iparm[IPARM_REFINEMENT] = API_RAF_GMRES; iparm[IPARM_INCOMPLETE] = API_NO; } if( !param_double && data_option.empty()){ dparm[DPARM_EPSILON_REFINEMENT] = 1e-12; dparm[DPARM_EPSILON_MAGN_CTRL] = 1e-32; } SYM = AA.symetrique; cout << "SYM = "<< SYM << endl; // SYMETRIQUE if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; //iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; //iparm[IPARM_FACTORIZATION] = API_FACT_LU; } /* Scotch */ fprintf(stdout,"-- Scotch --\n"); fflush(stdout); iparm[IPARM_START_TASK] = API_TASK_ORDERING; iparm[IPARM_END_TASK] = API_TASK_ORDERING; pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); /* Fax */ fprintf(stdout,"-- Fax --\n"); iparm[IPARM_START_TASK] = API_TASK_SYMBFACT; iparm[IPARM_END_TASK] = API_TASK_SYMBFACT; pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); /* Blend */ fprintf(stdout,"-- Blend --\n"); iparm[IPARM_START_TASK] = API_TASK_ANALYSE; iparm[IPARM_END_TASK] = API_TASK_ANALYSE; pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); if( SYM == 1 ){ //iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ //iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } /* Factorisation */ iparm[IPARM_START_TASK] = API_TASK_NUMFACT; iparm[IPARM_END_TASK] = API_TASK_NUMFACT; gettimeofday(&tv1, NULL); fprintf(stdout,"-- SOPALIN --\n"); pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call factorization : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { struct timeval tv1, tv2; // index for pastix for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]+1; for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]+1; // give value of the second member for(int ii=0; ii < Ncol; ii++) rhs[ii] = b[ii]; //fprintf(stdout,"SOLVE STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* updo */ iparm[IPARM_START_TASK] = API_TASK_SOLVE; iparm[IPARM_END_TASK] = API_TASK_SOLVE; iparm[IPARM_RHS_MAKING] = API_RHS_B; gettimeofday(&tv1, NULL); pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call updown : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); //for(int jj=0; jj < Ncol; jj++) // cout << "rhs["<< jj << "]=" << rhs[jj] << endl; //fprintf(stdout,"RAFF STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* raff */ iparm[IPARM_START_TASK] = API_TASK_REFINE; iparm[IPARM_END_TASK] = API_TASK_REFINE; //iparm[IPARM_RHS_MAKING] = API_RHS_B; iparm[IPARM_ITERMAX] = init_raff; gettimeofday(&tv1, NULL); pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call refinement : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < Ncol; ii++) x[ii] = rhs[ii]; // index for freefem for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; } ~dSolvepastixmpi(){ /* mem free */ iparm[IPARM_START_TASK] = API_TASK_CLEAN; iparm[IPARM_END_TASK] = API_TASK_CLEAN; pastix(&pastix_data, MPI_COMM_WORLD, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); if( sizeof(pastix_int_t) != sizeof(int) ) { memFree_null(ia); memFree_null(ja); } /* Free mem no longer necessary */ memFree_null(rhs); } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverpastixmpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverpastixmpi" << endl; return new dSolvepastixmpi(*A,ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return false; } bool Setpastixmpi() { if(verbosity) cout << " SetDefault sparse solver to pastixmpi" << endl; DefSparseSolver::solver =BuildSolverpastixmpi; //DefSparseSolver::solver =BuildSolverpastixmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return false; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pastixmpi, defaultsolver defaultsolverpastixmpi" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverpastixmpi; //DefSparseSolver::solver =BuildSolverpastixmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttopastixmpi","(",new OneOperator0(Setpastixmpi)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/Laplace3d-hips.edp000644 000767 000024 00000005306 12246043347 021567 0ustar00hechtstaff000000 000000 /* Warning in before version 3.2-1 the nomarl are interal normal after the signe is correct and now the noral was exterior normal. */ verbosity=2; load "msh3" load "hips_FreeFem" int[int] iparm(16); real[int] dparm(6); iparm=-1; dparm=-1; /* the sol trap if we use... iparm[0]=1; // use iterative solver 0 => trap why ???? FH ..... iparm[1]=0; // PCG as Krylov method iparm[4]=1; // Matrix are symmetric iparm[5]=1; // Pattern are also symmetric iparm[9]=0; // Scale matrix dparm[0]=1e-13; // Tolerance to convergence dparm[1]=5e-4; // Threshold in ILUT dparm[2]=5e-4; // Threshold for Schur preconditionner dparm[4]=1e-2; // drop tol dparm[5]=1e-2; // drop tol */ int nn=10; mesh Th2=square(nn,nn,region=0); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); fespace Vh(Th,P2); func ue = 2*x*x + 3*y*y + 4*z*z + 5*x*y+6*x*z+1; func uex= 4*x+ 5*y+6*z; func uey= 6*y + 5*x; func uez= 8*z +6*x; func f= -18. ; Vh uhe = ue; // cout << " uhe min: " << uhe[].min << " max:" << uhe[].max << endl; Vh u,v; macro Grad3(u) [dx(u),dy(u),dz(u)] // EOM /* problem Lapl3d(u,v) = int3d(Th)(Grad3(v)' *Grad3(u)) //') for emacs + int2d(Th,2)(u*v) - int3d(Th)(f*v) - int2d(Th,2) ( ue*v + (uex*N.x +uey*N.y +uez*N.z)*v ) + on(1,u=ue); Lapl3d; */ varf Lapl3d(u,v) = int3d(Th)(Grad3(v)' *Grad3(u)) //') for emacs + int2d(Th,2)(u*v) + int3d(Th)(f*v) + int2d(Th,2) ( ue*v + (uex*N.x +uey*N.y +uez*N.z)*v ) + on(1,u=ue); matrix A = Lapl3d(Vh,Vh,tgv=-1);// to remove line this BC. cout << A.n << " " << A.m << " " << A.nbcoef << endl; verbosity=4; set(A,solver=sparsesolver,dparams=dparm, lparams=iparm); cout <freefem++.pref echo includepath = \"../examples++-3d/\" >>freefem++.pref echo includepath += \"../examples++-tutorial/\" >>freefem++.pref echo loadpath += \"./\" >>freefem++.pref # force the build for freefem++.pref FH.. DDM-Schwarz-Lame-2d.edp:freefem++.pref # FFCS - cleaning is useful sometimes clean-local:: -rm $(LIST_COMPILE) -rm *.$(OBJEXT) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/examples++-mpi/Makefile.in000644 000767 000024 00000131156 12543260337 020414 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # http://www.ljll.math.upmc.fr/lehyaric # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh default=0 freefem make multipleauthors start=19/03/10 upmc VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples++-mpi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = schwarz.edp DDM-Schwarz-Lame-2d.edp DDM-Schwarz-Lame-3d.edp DDM-Schwarz-Lap-2dd.edp DDM-Schwarz-Lap-3d.edp \ DDM-Schwarz-Stokes-2d.edp LaplaceRT-3d-matrix-mumps.edp MPICGLap.edp MPIGMRES2D.edp MPIGMRES3D.edp MUMPS.edp \ NSI3d-carac-mumps.edp NSI3d-carac.edp Stokes-v1-matrix-mumps.edp Stokes-v1-matrix-superludist.edp \ Stokes-v2-matrix-mumps.edp Stokes-v3-matrix-mumps.edp VG.edp beam-3d-matrix-superludist.edp \ cavityNewtow-MUMPS.edp chaleur3D-hips.edp chaleur3D-mumps.edp chaleur3D-superludist.edp cmaes-mpi-VarIneq.edp \ essai.edp mortar-DN-4-mpi.edp testsolver_MUMPS.edp testsolver_SuperLU_DIST.edp testsolver_pastix.edp \ NSCaraCyl.edp diffusion-3d.edp elasticity-3d.edp XFAIL_TESTS = $(TESTS) LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPPMPI) FLAGS_FFPP="-np 4 -nw" SKIP=$(SKIP_TESTS_MPI) LIST_IDP = AddLayer2d.idp DDM-Schwarz-macro.idp MPIGMRESmacro.idp getARGV.idp \ AddLayer3d.idp DDM-funcs-v2.idp MPIplot.idp mortar-msh.idp Heat3d.idp func-max.idp \ schwarz-add-macro.idp schwarz-macro.idp EXTRA_DIST = *.edp *.idp regtests.sh \ MPICG.cpp \ MUMPS_FreeFem.cpp \ complex_SuperLU_DIST_FreeFem.cpp \ complex_pastix_FreeFem.cpp \ dSuperLU_DIST.cpp \ ffsuperludistoption-1.hpp \ ffsuperludistoption.hpp \ generaldefs.h \ hips_FreeFem.cpp \ hypre_FreeFem.cpp \ interfacepastix.cpp \ parms_FreeFem.cpp \ real_SuperLU_DIST_FreeFem.cpp \ real_pastix_FreeFem.cpp mpi-cmaes.cpp \ ffmumps_fileparam.txt ffpastix_iparm_dparm.txt ffsuperlu_dist_fileparam.txt \ MUMPS.cpp \ MUMPS.edp dmatrix.hpp \ PETSc.hpp additional.idp removeDOF.cpp schwarz.cpp schwarz.edp stokes-2d.edp utility.cpp schwarz-2d.edp schwarz-init.hpp # FFCS - list modified to disable some downloaded tools depending on the platform (see # [[file:../../../configure.ac::tools_problems_all_platforms]] for reasons why some tools may be # deactivated). LIST_COMPILE = @TOOL_DYLIB_mumps@ @TOOL_DYLIB_hips@ @TOOL_DYLIB_superludist@ @TOOL_DYLIB_pastix@ MPICG.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_parms@ mpi-cmaes.$(DYLIB_SUFFIX) @TOOL_DYLIB_schwarz@ all: all-am .SUFFIXES: .SUFFIXES: .$(DYLIB_SUFFIX) .cpp .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-mpi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-mpi/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? schwarz.edp.log: schwarz.edp @p='schwarz.edp'; \ b='schwarz.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DDM-Schwarz-Lame-2d.edp.log: DDM-Schwarz-Lame-2d.edp @p='DDM-Schwarz-Lame-2d.edp'; \ b='DDM-Schwarz-Lame-2d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DDM-Schwarz-Lame-3d.edp.log: DDM-Schwarz-Lame-3d.edp @p='DDM-Schwarz-Lame-3d.edp'; \ b='DDM-Schwarz-Lame-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DDM-Schwarz-Lap-2dd.edp.log: DDM-Schwarz-Lap-2dd.edp @p='DDM-Schwarz-Lap-2dd.edp'; \ b='DDM-Schwarz-Lap-2dd.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DDM-Schwarz-Lap-3d.edp.log: DDM-Schwarz-Lap-3d.edp @p='DDM-Schwarz-Lap-3d.edp'; \ b='DDM-Schwarz-Lap-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DDM-Schwarz-Stokes-2d.edp.log: DDM-Schwarz-Stokes-2d.edp @p='DDM-Schwarz-Stokes-2d.edp'; \ b='DDM-Schwarz-Stokes-2d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceRT-3d-matrix-mumps.edp.log: LaplaceRT-3d-matrix-mumps.edp @p='LaplaceRT-3d-matrix-mumps.edp'; \ b='LaplaceRT-3d-matrix-mumps.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MPICGLap.edp.log: MPICGLap.edp @p='MPICGLap.edp'; \ b='MPICGLap.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MPIGMRES2D.edp.log: MPIGMRES2D.edp @p='MPIGMRES2D.edp'; \ b='MPIGMRES2D.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MPIGMRES3D.edp.log: MPIGMRES3D.edp @p='MPIGMRES3D.edp'; \ b='MPIGMRES3D.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MUMPS.edp.log: MUMPS.edp @p='MUMPS.edp'; \ b='MUMPS.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSI3d-carac-mumps.edp.log: NSI3d-carac-mumps.edp @p='NSI3d-carac-mumps.edp'; \ b='NSI3d-carac-mumps.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSI3d-carac.edp.log: NSI3d-carac.edp @p='NSI3d-carac.edp'; \ b='NSI3d-carac.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Stokes-v1-matrix-mumps.edp.log: Stokes-v1-matrix-mumps.edp @p='Stokes-v1-matrix-mumps.edp'; \ b='Stokes-v1-matrix-mumps.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Stokes-v1-matrix-superludist.edp.log: Stokes-v1-matrix-superludist.edp @p='Stokes-v1-matrix-superludist.edp'; \ b='Stokes-v1-matrix-superludist.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Stokes-v2-matrix-mumps.edp.log: Stokes-v2-matrix-mumps.edp @p='Stokes-v2-matrix-mumps.edp'; \ b='Stokes-v2-matrix-mumps.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Stokes-v3-matrix-mumps.edp.log: Stokes-v3-matrix-mumps.edp @p='Stokes-v3-matrix-mumps.edp'; \ b='Stokes-v3-matrix-mumps.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) VG.edp.log: VG.edp @p='VG.edp'; \ b='VG.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) beam-3d-matrix-superludist.edp.log: beam-3d-matrix-superludist.edp @p='beam-3d-matrix-superludist.edp'; \ b='beam-3d-matrix-superludist.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cavityNewtow-MUMPS.edp.log: cavityNewtow-MUMPS.edp @p='cavityNewtow-MUMPS.edp'; \ b='cavityNewtow-MUMPS.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) chaleur3D-hips.edp.log: chaleur3D-hips.edp @p='chaleur3D-hips.edp'; \ b='chaleur3D-hips.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) chaleur3D-mumps.edp.log: chaleur3D-mumps.edp @p='chaleur3D-mumps.edp'; \ b='chaleur3D-mumps.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) chaleur3D-superludist.edp.log: chaleur3D-superludist.edp @p='chaleur3D-superludist.edp'; \ b='chaleur3D-superludist.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cmaes-mpi-VarIneq.edp.log: cmaes-mpi-VarIneq.edp @p='cmaes-mpi-VarIneq.edp'; \ b='cmaes-mpi-VarIneq.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) essai.edp.log: essai.edp @p='essai.edp'; \ b='essai.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mortar-DN-4-mpi.edp.log: mortar-DN-4-mpi.edp @p='mortar-DN-4-mpi.edp'; \ b='mortar-DN-4-mpi.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testsolver_MUMPS.edp.log: testsolver_MUMPS.edp @p='testsolver_MUMPS.edp'; \ b='testsolver_MUMPS.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testsolver_SuperLU_DIST.edp.log: testsolver_SuperLU_DIST.edp @p='testsolver_SuperLU_DIST.edp'; \ b='testsolver_SuperLU_DIST.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testsolver_pastix.edp.log: testsolver_pastix.edp @p='testsolver_pastix.edp'; \ b='testsolver_pastix.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSCaraCyl.edp.log: NSCaraCyl.edp @p='NSCaraCyl.edp'; \ b='NSCaraCyl.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) diffusion-3d.edp.log: diffusion-3d.edp @p='diffusion-3d.edp'; \ b='diffusion-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) elasticity-3d.edp.log: elasticity-3d.edp @p='elasticity-3d.edp'; \ b='elasticity-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-local cscopelist-am ctags-am distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am recheck \ tags-am uninstall uninstall-am .PRECIOUS: Makefile # FFCS - do not set loadpath to be able to run an external version of FF on the examples in this directory with # [[../../mkffref]] @FFCS_MPIOK_TRUE@all-local:$(LIST_COMPILE) @FFCS_MPIOK_TRUE@ @echo Warning missing mpi plugin: `for i in $(LIST_COMPILE); do if test ! -s $i ; then j=1; echo "$i," ;fi; done` @FFCS_MPIOK_TRUE@ echo "finish compile load mpi solver !" @FFCS_MPIOK_FALSE@all-local: .cpp.$(DYLIB_SUFFIX): ../examples++-load/ff-c++ ../examples++-load/WHERE_LIBRARY-download # FFCS needs an error exit code to make sure that all libraries are correctly compiled # # FFCS on Windows inserts all MPI options (include, lib, ...) in the $MPICXX compiler script, instead of "$CXX $MPI_xxx", # but it needs '-mpi' to do that # ### -../examples++-load/ff-c++ -auto $< ../examples++-load/ff-c++ -auto -mpi $< install-exec-local:: $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib/mpi $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/include $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/etc -for i in $(LIST_COMPILE); do \ if [ -f $$i ] ; then $(INSTALL) -m 555 $$i $(DESTDIR)$(ff_prefix_dir)/lib/mpi; fi; done $(INSTALL) -m 555 $(LIST_IDP) $(DESTDIR)$(ff_prefix_dir)/idp freefem++.pref:Makefile echo loadpath = \"../examples++-load/\" >freefem++.pref echo includepath = \"../examples++-3d/\" >>freefem++.pref echo includepath += \"../examples++-tutorial/\" >>freefem++.pref echo loadpath += \"./\" >>freefem++.pref # force the build for freefem++.pref FH.. DDM-Schwarz-Lame-2d.edp:freefem++.pref # FFCS - cleaning is useful sometimes clean-local:: -rm $(LIST_COMPILE) -rm *.$(OBJEXT) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-mpi/mortar-DN-4-mpi.edp000644 000767 000024 00000011651 11745333166 021571 0ustar00hechtstaff000000 000000 assert(version>=2.23); if ( mpisize != 4 ) { cout << " sorry number of processeur !=4 " << endl; exit(1); } // Mortar (4 sub domain) // with matrix -et Precon Conjugade Gradient -- // Neuman -> Dirichlet . // ------------------------------- func f=1+x+y; real g=1; int withprecon=1; macro Grad(u) [ dx(u), dy(u) ] // int nbsd=4; macro Psd(U) U[0],U[1],U[2],U[3] // int labext= nbsd+1; real meshsize=0.03; real meshsizem=meshsize*1.5; bool noconforme=0; mesh Tha,Thm,Thmm; int [int] regsd(4); if(mpirank==0) { mesh Thacopy; //hack to dcl Tha ouside of mortar-msh.idp { include "mortar-msh.idp" Thacopy=Tha; regsd=regi; } Tha=Thacopy; cout << "mortar : " << endl; Thm=Tha; Thm=adaptmesh(Thm,meshsizem,IsMetric=1,thetamax=60); Thm=emptymesh(Thm); Thmm=Thm; Thmm=trunc(Thm,split=4,1); // for fine integration Thmm=emptymesh(Thmm); plot(Thm,wait=0,ps="mortar-Thm.eps"); } // send meshes verbosity=1; broadcast(processor(0),Tha); broadcast(processor(0),Thm); broadcast(processor(0),Thmm); broadcast(processor(0),regsd); // build sub domaine mesh : mesh Thi=trunc(Tha,region==regsd[mpirank],split=1);// les sous domaines if(noconforme) Thi=adaptmesh(Thi,meshsize*(1+0.1*mpirank),IsMetric=1,nbvx=100000,thetamax=60);// les sous domaines fespace Lh(Thm,P1); fespace RTh(Thm,[P0edge,P0edge]); RTh [Nmx,Nmy]; // ne marche pas car la normal // n'est definie que une un bord varf vNN([ux,uy],[nx,ny]) = int1d(Thm,1)(( nx*N.x + ny*N.y)/lenEdge); Nmx[]= vNN(0,RTh); // les joint P0 sur le squelette // ----- \int [q] l + \int[p] m Lh lh=0,rhsl=0; fespace Vhi(Thi,P1); fespace Ehi(Thi,P0edge); matrix Asd,Csd,PAsd,PIsd,PJsd; Vhi usd,vsd,rhssd, pusd,bcsd; Ehi epssd; real tgv=1e30; varf cci([l],[u]) = int1d(Thmm,1,qforder=3)(l*u*epssd); varf vepsi(u,v)= int1d(Thi,1,qforder=10)( (Nmx*N.x + Nmy*N.y)*v/lenEdge); varf vLapMi([ui],[vi],tgv=tgv) = int2d(Thi)( Grad(ui)'*Grad(vi) ) // + int1d(Thi,1,qfe=qf1pElump)(alpha*ui*vi) + int2d(Thi) (f*vi) + on(labext,ui=g); varf vPLapMi([ui],[vi],tgv=tgv) = int2d(Thi)( Grad(ui)'*Grad(vi) ) // + int1d(Thi,1,qfe=qf1pElump)(alphap*ui*vi) + on(labext,1,ui=0); ; varf vrhsMi(ui,vi) = on(labext,ui=g); usd=0; vsd=0; epssd[]= vepsi(0,Ehi); epssd = -real(epssd <-0.00001) + real(epssd >0.00001); Csd = cci(Lh,Vhi); Asd = vLapMi(Vhi,Vhi,solver=UMFPACK); PAsd = vPLapMi(Vhi,Vhi,solver=UMFPACK); matrix IVL=interpolate(Vhi,Lh,inside=1); // v = IVL*l varf vonext(u,v)=on(labext,u=1); varf von1(u,v)=on(1,u=1); real[int] onext=vonext(0,Vhi); real[int] on1=von1(0,Vhi); on1= on1 ? 1 : 0; on1 = onext ? 0 : on1; // remove df of ext matrix I1(on1);// matrix tgv $i\in Gamma_1 \ Gamma_e $ , 0 otherwise PIsd= I1*IVL;// remove of line not on $Gamma_1 \ Gamma_e $ // so PIsd*l = tgv * Interpole l on $Gamma_1 \ Gamma_e $ I1.diag=on1; matrix AA=I1*Asd;// remove line not on lab 1 PJsd= IVL'*AA; rhssd[]=vLapMi(0,Vhi); varf vML(u,v) = int2d(Thm)(u*v*1e-10)+int1d(Thm,1)(u*v); matrix ML=vML(Lh,Lh); lh[]=0; int itera=0; varf vbc(u,v) = int1d(Thm,labext)(v); real[int] lbc(Lh.ndof),lbc0(Lh.ndof); lbc=vbc(0,Lh); lbc = lbc ? 0 : 1 ; int what; // to choose which funct call 1 SkPb 2:PSkPb, 3:end // the preconditionner func real[int] PSkPb(real[int] &l) { if(withprecon) { if(mpirank==0) { what=2; broadcast(processor(0),what); // get from SkBk routine } if(what!=2) return l; int verb=verbosity; verbosity=0; itera++; real[int] ll= ML^-1*l; broadcast(processor(0),ll); ll= lbc .* ll; ll *= tgv; pusd[] = PAsd^-1*(vsd[]= PIsd* ll); ll = PJsd*pusd[]; if(mpirank==0) { for (int i=1;i<4;++i) { processor(i) >> l; ll += l; } l = ML^-1*ll; l= lbc .* l; } else processor(0) << ll; verbosity=verb; } return l ; }; func real[int] SkPb(real[int] &l) { int verb=verbosity; verbosity=0; itera++; if(mpirank==0 && what!=3) what=1; broadcast(processor(0),what); if(what==2) return PSkPb(l); else if (what !=1) return l; broadcast(processor(0),l); vsd[] = rhssd[]; vsd[] += Csd* l; usd[] = Asd^-1*vsd[]; l = Csd'*usd[]; l= lbc .* l; if(mpirank==0) { real[int] ll(l.n); for (int i=1;i<4;++i) { processor(i) >> ll; l += ll; } } else processor(0) << l; verbosity=verb; return l ; }; if(mpirank==0) { verbosity=100; lh[]=0; LinearCG(SkPb,lh[],eps=1.e-5,nbiter=100,precon=PSkPb); what=3; SkPb(lh[]); } else while(what!=3) SkPb(lh[]); plot(usd,bb=[[-1,-1],[1,1]],ps="mortar-"+mpirank+".eps"); cout << "Fin CG " << mpirank << endl; /* Brochet:examples++-mpi hecht$ (grep -vh showpage mortar-?.eps;echo showpage) > mortar.eps Brochet:examples++-mpi hecht$ gv mortar.eps */ freefem++-3.38-1/examples++-mpi/mortar-msh.idp000644 000767 000024 00000002341 11745333166 021133 0ustar00hechtstaff000000 000000 // --- begin meshes building -------------- real[int] theta(nbsd+1),cost(nbsd),sint(nbsd); for (int i=0;i using namespace std; #include "ff++.hpp" #include "mpi.h" #include "cmaes_interface.h" template struct MPI_TYPE {}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_LONG;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_INT;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_DOUBLE;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_BYTE;}}; class CMAES //Abstract class, because the fitness function prototype may differ from users to users { public: //typedef double (*FFT)(double const *); //Fitness Function Type CMAES() : pop(0),fitvals(0),evo() {} CMAES(int d,double *xstart,double *stddev,long seed,int lambda,const char *ipf="initials.par") : pop(0),fitvals(0),evo() { fitvals = init(d,xstart,stddev,seed,lambda,ipf); cout << SayHello() << endl; } virtual ~CMAES() {exit();} void resume_distribution(char *filename) {return cmaes_resume_distribution(&evo, filename);} double * const * & SamplePopulation() {return pop = cmaes_SamplePopulation(&evo);} double * UpdateDistribution() {return cmaes_UpdateDistribution(&evo,fitvals);} const char * TestForTermination() const {return cmaes_TestForTermination(&evo);} double * const * & ReSampleSingle(int index) {return pop = cmaes_ReSampleSingle(&evo,index);} double const * ReSampleSingle_old(double *rgx) {return cmaes_ReSampleSingle_old(&evo,rgx);} void UpdateEigensystem(int flgforce) {return cmaes_UpdateEigensystem(&evo, flgforce);} virtual void PopEval() =0; //{for(int i=0;i(cmaes_GetPtr(&evo,"diag(C)"));} double * diagD() const {return const_cast(cmaes_GetPtr(&evo,"diag(D)"));} double * stddev() const {return const_cast(cmaes_GetPtr(&evo,"stddev"));} double * xbestever() const {return const_cast(cmaes_GetPtr(&evo,"xbestever"));} double * xbest() const {return const_cast(cmaes_GetPtr(&evo,"xbest"));} double * xmean() const {return const_cast(cmaes_GetPtr(&evo,"xmean"));} void ReadSignals(char const * filename) const {cmaes_ReadSignals(&evo,filename);} char * SayHello() const {return cmaes_SayHello(&evo);} void WriteToFile(char const * keyword,char const * output_filename) const {cmaes_WriteToFile(&evo,keyword,output_filename);} virtual double * operator() () { //ReadSignals("signals.par"); while(!TestForTermination()) { SamplePopulation(); PopEval(); UpdateDistribution(); //ReadSignals("signals.par"); } cout << "Stop : " << TestForTermination() << endl; return xmean(); } cmaes_t& optimizer() {return evo;} protected: double * const * pop; double * fitvals; double*& init(int dimension,double *xstart,double *stddev,long seed,int lambda,const char *input_parameter_filename) {return fitvals = cmaes_init(&evo,dimension,xstart,stddev,seed,lambda,input_parameter_filename);} private: void exit() {cmaes_exit(&evo);} mutable cmaes_t evo; }; /* Now comes the FreeFem ++ part : */ extern Block *currentblock; typedef double R; class OptimCMA_ES : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; const int cas; class ffcalfunc // to call the freefem function .. J { public: Stack stack; Expression JJ,theparame; mutable int counter; ffcalfunc(Stack s,Expression JJJ,Expression epar) : stack(s),JJ(JJJ), theparame(epar), counter(0) {} double J(Kn_ x) const { ++counter; KN *p=GetAny *>( (*theparame)(stack) ); *p=x; double ret= GetAny( (*JJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); return ret; } }; class CMA_ES_MPI : public CMAES { public: typedef KN Rn; typedef KN_ Rn_; //CMA_ES_MPI() : CMAES(),x(0),fit(0) {} /*CMA_ES(ffcalfunc &_ff,int d,Rn &xstart,double *stddev,long seed,int lambda) : CMAES(d,xstart.n ? xstart:0,stddev,seed,lambda,"non"),x(&xstart),fit(&_ff) {} CMA_ES(ffcalfunc &_ff,int d,Rn &xstart,const Rn &stddev,long seed,int lambda) : CMAES(d,xstart.n ? xstart:0,stddev,seed,lambda,"non"),x(&xstart),fit(&_ff) {}*/ CMA_ES_MPI(ffcalfunc &_ff,Rn &xstart,const Rn &stddev,long seed,int lambda,MPI_Comm *_com) : CMAES(),x(0),fit(&_ff),com(_com),myid(0),nproc(1),my_number_of_fitness_eval(0),index(0) { MPI_Comm_size(*com,&nproc); MPI_Comm_rank(*com,&myid); x = &xstart; init(x->n,xstart.n ? xstart:0,stddev,seed,lambda,"non"); my_number_of_fitness_eval = (lambda/nproc) + (myid < (lambda%nproc) ? 1:0); index = new int[nproc]; for(int i=0;i0 ? index[i-1]+inofe : 0; } if(myid==0) cout << SayHello() << endl; } CMA_ES_MPI(ffcalfunc &_ff,Rn &xstart,const Rn &stddev,long seed,int lambda,MPI_Comm *_com,const char *ifname) : CMAES(),x(0),fit(&_ff),com(_com),myid(0),nproc(1),my_number_of_fitness_eval(0),index(0) { MPI_Comm_size(*com,&nproc); MPI_Comm_rank(*com,&myid); x = &xstart; init(x->n,xstart.n ? xstart:0,stddev,seed,lambda,ifname); my_number_of_fitness_eval = (lambda/nproc) + (myid < (lambda%nproc) ? 1:0); index = new int[nproc]; for(int i=0;i0 ? index[i-1]+inofe : 0; } if(myid==0) cout << SayHello() << endl; } ~CMA_ES_MPI() { if(index) delete [] index; index=0; } void PopEval() { //cout << endl << "***** in popeval myid = " << myid << "*****" << endl; for(int i=0;iJ(popi); } } double * operator() () { while(!TestForTermination()) { MPI_Barrier(*com); SamplePopulation();//Every proc samples its own population... but only the one from proc 0 is used. Fortunately, this is a quick computation regarding the time spent on fitness function evaluation for(int i=0;i( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} E_CMA_ES(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } JJ= to(C_F0(opJ,"(",theparam)); closetheparam=currentblock->close(currentblock); // the cleanning block expression } virtual AnyType operator()(Stack stack) const { double cost = 1e100; WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Kn &x = *GetAny((*X)(stack)); long n=x.N(); long seed = arg(0,stack,0L); //The seed for random numbers generation double initialStdDev = arg(1,stack,0.3); //Initial standard deviation KN iSD(n,1.); iSD *= initialStdDev; KN initialStdDevs(nargs[2] ? GetAny >((*nargs[2])(stack)) : (KN_)iSD); //cout << "dans le dylib :" << initialStdDevs << endl; double stopTolFun = arg(3,stack,1.E-12); double stopTolFunHist = arg(4,stack,0.); double stopTolX = arg(5,stack,0.); double stopTolUpXFactor = arg(6,stack,1.E3); long popsize = arg(7,stack,4 + (long) floor(3*log(n))); pcommworld vcommworld=0; if (nargs[8]) vcommworld = GetAny((*nargs[8])(stack)); MPI_Comm mpiCommWorld = MPI_COMM_WORLD; MPI_Comm * commworld= vcommworld ? (MPI_Comm *) vcommworld : & mpiCommWorld ; //long mu = arg(8,stack,popsize/2); long iprint = verbosity; ffcalfunc ffJ(stack,JJ,theparam); //cout << endl << "ATTENTION : " << *commworld << endl; int myid=0,nproc=1; MPI_Comm_size(*commworld,&nproc); MPI_Comm_rank(*commworld,&myid); //cout << endl << "nbr de proc : " << nproc << " -- myid=" << myid << " -- world id=" << wr << endl; CMA_ES_MPI *optim=0; if(nargs[9]) optim = new CMA_ES_MPI(ffJ,x,initialStdDevs,seed,popsize,commworld,(GetAny((*nargs[9])(stack)))->c_str()); else optim = new CMA_ES_MPI(ffJ,x,initialStdDevs,seed,popsize,commworld); if(!nargs[9]) { optim->optimizer().sp.stopTolFun = stopTolFun; optim->optimizer().sp.stopTolFunHist = stopTolFunHist; optim->optimizer().sp.stopTolX = stopTolX; optim->optimizer().sp.stopTolUpXFactor = stopTolUpXFactor; long meval = arg(10,stack,static_cast(optim->maxeval())); long mgen = arg(11,stack,static_cast(optim->maxgen())); optim->optimizer().sp.stopMaxFunEvals = meval; optim->optimizer().sp.stopMaxIter = mgen; } (*optim)(); cost = optim->fitness(); x = KN_(optim->xbestever(),optim->dimension()); delete optim; closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return cost; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const {return new E_CMA_ES(args,cas);} OptimCMA_ES(int c) : OneOperator(atype(),atype(),atype *>()),cas(c){} }; basicAC_F0::name_and_type OptimCMA_ES::E_CMA_ES::name_param[]= { {"seed", &typeid(long) }, {"initialStdDev", &typeid(double) }, {"initialStdDevs", &typeid(KN_) }, {"stopTolFun", &typeid(double) }, {"stopTolFunHist", &typeid(double) }, {"stopTolX", &typeid(double) }, {"stopTolUpXFactor",&typeid(double) }, {"popsize", &typeid(long) }, {"comm", &typeid(pcommworld)}, {"paramFile", &typeid(string*) }, {"stopMaxFunEval", &typeid(long) }, {"stopMaxIter", &typeid(long) } //{"mu", &typeid(long) } }; /* --FH: class Init { public: Init(); };*/ static void Load_Init() { Global.Add("cmaesMPI","(",new OptimCMA_ES(1)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/MPICG.cpp000644 000767 000024 00000034676 12467062125 017723 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // //ff-c++-LIBRARY-dep: mpi //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "mpi.h" #include using namespace std; #include "ff++.hpp" #include "CGNL.hpp" //#include "gmres.hpp" template int NLCG(const DJ & dJ,const P & C,KN_ &x,const int nbitermax, double &eps,long kprint,MPI_Comm * ) { // ------------- assert(&x && &dJ && &C); typedef KN Rn; int n=x.N(); R ro=1; Rn g(n),h(n),Ah(n), & Cg(Ah); // on utilise Ah pour stocke Cg g=dJ*x;// dJ(x,g); Cg = C*g; // gradient preconditionne h =-Cg; R g2 = (Cg,g); if (g2 < 1e-30) { if(kprint>1) cout << "GCNL g^2 =" << g2 << " < 1.e-30 Nothing to do " << endl; return 2; } if (kprint>5 ) cout << " 0 GCNL g^2 =" << g2 << endl; R reps2 =eps >0 ? eps*eps*g2 : -eps; // epsilon relatif eps = reps2; for (int iter=0;iter<=nbitermax;iter++) { ro = argmin(ro,dJ,x,h,g,Ah); Cg = C*g; R g2p=g2; g2 = (Cg,g); if ( kprint < nbitermax ) cout << "CGNL:" < struct MPI_TYPE {}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_LONG;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_INT;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_DOUBLE;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_BYTE;}}; template R ReduceSum1(R s,MPI_Comm * comm) { R r=0; // nt MPI_Allreduce( void *sendbuf, void *recbuf, int count, // MPI_Datatype datatype, MPI_Op op, MPI_Comm comm ) MPI_Allreduce( &s, &r, 1 ,MPI_TYPE::TYPE(), MPI_SUM, *comm ); return r; } template int ConjuguedGradient2(const M & A,const P & C,KN_ &x,const KN_ &b,const int nbitermax, double &eps,long kprint,MPI_Comm * commworld) { // ConjuguedGradient2 affine A*x = 0 est toujours appele avec les condition aux limites // ------------- throwassert(&x && &A && &C); typedef KN Rn; int n=x.N(); // if (verbosity>99) kprint=1; R ro=1; Rn g(n),h(n),Ah(n), & Cg(Ah); // on utilise Ah pour stocke Cg g = A*x; g -= b; Cg = C*g; // gradient preconditionne h =-Cg; R g2 = ReduceSum1((Cg,g),commworld); if (g2 < 1e-30) { if(kprint<=nbitermax) cout << "GC g^2 =" << g2 << " < 1.e-30 Nothing to do " << endl; return 2; } if (kprint<5 ) cout << " 0 GC g^2 =" << g2 << endl; R reps2 =eps >0 ? eps*eps*g2 : -eps; // epsilon relatif eps = reps2; for (int iter=0;iter<=nbitermax;iter++) { R rop = ro; x += rop*h; // x+ rop*h , g=Ax (x old) // ((Ah = A*x - b) - g); // Ah -= b; // Ax + rop*Ah = rop*Ah + g = // Ah -= g; // Ah*rop Ah = A*x; Ah -= b; // Ax + rop*Ah = rop*Ah + g = Ah -= g; // Ah*rop R hAh =ReduceSum1((h,Ah),commworld); R gh = ReduceSum1((g,h),commworld); if (RNM::norm2(hAh)<1e-100) ExecError("CG2: Matrix is not defined (/0), sorry "); ro = -gh*rop/hAh ; // ro optimal (produit scalaire usuel) x += (ro-rop) *h; g += (ro/rop) *Ah; // plus besoin de Ah, on utilise avec Cg optimisation Cg = C*g; R g2p=g2; g2 = ReduceSum1((Cg,g),commworld); if ( ( (iter%kprint) == kprint-1) ) cout << "CG:" <4) cout << "GMRES: restart" << j << " " << beta << " " << normb << " " << beta / normb << " < " << tol << endl; if ((resid = beta / normb) < tol) { tol = resid; max_iter = j; delete [] v; return 0; } } if(verbosity) cout << "WARNING: GMRES do not converges: " << j <<"/" << max_iter << ", resid = " << resid << ", tol= " << tol << ", normb "<< normb << endl; tol = resid; delete [] v; return 1; } template class MPILinearCG : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; const int cas,CG; class MatF_O: VirtualMatrice { public: Stack stack; mutable Kn x; C_F0 c_x; Kn *b; Expression mat1,mat; typedef typename VirtualMatrice::plusAx plusAx; MatF_O(int n,Stack stk,const OneOperator * op,Kn *bb=0) : VirtualMatrice(n),stack(stk), x(n),c_x(CPValue(x)),b(bb), mat1(op->code(basicAC_F0_wa(c_x))), mat( CastTo(C_F0(mat1,(aType)*op))) { //ffassert(atype() ==(aType) *op); // WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 } ~MatF_O() { // cout << " del MatF_O mat " << endl; if(mat1 != mat) delete mat; delete mat1; // cout << " del MatF_Ocx ..." << endl; Expression zzz = c_x; // cout << " zzz "<< zzz << endl; delete zzz; // WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 } void addMatMul(const Kn_ & xx, Kn_ & Ax) const { ffassert(xx.N()==Ax.N()); x =xx; Ax += GetAny((*mat)(stack)); if(b && &Ax!=b) Ax += *b; // Ax -b => add b (not in cas of init. b c.a.d &Ax == b WhereStackOfPtr2Free(stack)->clean(); } plusAx operator*(const Kn & x) const {return plusAx(this,x);} virtual bool ChecknbLine(int n) const { return true;} virtual bool ChecknbColumn(int m) const { return true;} }; class E_LCG: public E_F0mps { public: const int cas;// <0 => Nolinear const int CG; static const int n_name_param=7; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; const OneOperator *A, *C; Expression X,B; E_LCG(const basicAC_F0 & args,int cc,int gc) :cas(cc),CG(gc) { args.SetNameParam(n_name_param,name_param,nargs); { const Polymorphic * op= dynamic_cast(args[0].LeftValue()); ffassert(op); A = op->Find("(",ArrayOfaType(atype(),false)); } if (nargs[2]) { const Polymorphic * op= dynamic_cast(nargs[2]); ffassert(op); C = op->Find("(",ArrayOfaType(atype(),false)); } else C =0; X = to(args[1]); if (args.size()>2) B = to(args[2]); else B=0; } virtual AnyType operator()(Stack stack) const { int ret=-1; // WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 try { Kn &x = *GetAny((*X)(stack)); int n=x.N(); double eps = 1.0e-6; int nbitermax= 100; long verb = verbosity; pcommworld vcommworld=0; long dKrylov=50; if (nargs[0]) eps= GetAny((*nargs[0])(stack)); if (nargs[1]) nbitermax = GetAny((*nargs[1])(stack)); if (nargs[3]) eps= *GetAny((*nargs[3])(stack)); if (nargs[4]) vcommworld = GetAny((*nargs[4])(stack)); if (nargs[5]) dKrylov= GetAny((*nargs[5])(stack)); if (nargs[6]) verb=Abs(GetAny((*nargs[6])(stack))); long gcverb=51L-Min(Abs(verb),50L); if(verb==0) gcverb = 1000000000;// no print MPI_Comm mpiCommWorld = MPI_COMM_WORLD; MPI_Comm * commworld= vcommworld ? (MPI_Comm *) vcommworld: & mpiCommWorld ; KN bzero(B?1:n); // const array zero bzero=R(); KN *bb=&bzero; if (B) { Kn &b = *GetAny((*B)(stack)); R p = (b,b); if (p) { // ExecError("Sorry MPILinearCG work only with nul right hand side, so put the right hand in the function"); } bb = &b; } KN * bbgmres =0; if ( !B && !CG) bbgmres=bb; // none zero if gmres without B MatF_O AA(n,stack,A,bbgmres); if(bbgmres ){ *bbgmres= AA* *bbgmres; // Ok Ax == b -> not translation of b . *bbgmres = - *bbgmres; if(verbosity>1) cout << " ** GMRES set b = -A(0); : max=" << bbgmres->max() << " " << bbgmres->min()<(n),x,nbitermax,eps, gcverb ,commworld); } else if (C) { MatF_O CC(n,stack,C); ret = ConjuguedGradient2(AA,CC,x,*bb,nbitermax,eps, gcverb ,commworld);} else ret = ConjuguedGradient2(AA,MatriceIdentite(n),x,*bb,nbitermax,eps, gcverb ,commworld); } else {// GMRES KNM H(dKrylov+1,dKrylov+1); int k=dKrylov;//,nn=n; if (cas<0) { ErrorExec("NL GMRES: to do! sorry ",1); /* if (C) { MatF_O CC(n,stack,C); ret = NLGMRES(AA,CC,x,nbitermax,eps, 51L-Min(Abs(verbosity),50L) );} else ret = NLGMRES(AA,MatriceIdentite(n),x,nbitermax,eps, 51L-Min(Abs(verbosity),50L)); ConjuguedGradient */ } else { if (C) { MatF_O CC(n,stack,C); ret=GMRES_MPI(AA,(KN &)x, *bb,CC,H,k,nbitermax,eps,commworld,verb);} else ret=GMRES_MPI(AA,(KN &)x, *bb,MatriceIdentite(n),H,k,nbitermax,eps,commworld,verb); } } if( nargs[3]) *GetAny((*nargs[3])(stack)) = -(eps); } catch(...) { // WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 throw; } // WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return SetAny(ret); } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_LCG(args,cas,CG);} MPILinearCG() : OneOperator(atype(), atype(), atype *>(),atype *>()),cas(2),CG(1){} MPILinearCG(int cc,int CGG) : OneOperator(atype(), atype(), atype *>(),atype *>()),cas(cc),CG(CGG){} MPILinearCG(int cc,int CGG,int ) : OneOperator(atype(), atype(), atype *>()),cas(cc),CG(CGG){} MPILinearCG(int cc) : OneOperator(atype(), atype(), atype *>()),cas(cc),CG(1){} }; template basicAC_F0::name_and_type MPILinearCG::E_LCG::name_param[]= { { "eps", &typeid(double) }, { "nbiter",&typeid(long) }, { "precon",&typeid(Polymorphic*)}, { "veps" , &typeid(double*) }, { "comm", &typeid(pcommworld)} , { "dimKrylov", &typeid(long) }, { "verbosity", &typeid(long) } }; /* --FH: class Init { public: Init(); }; LOADINIT(Init); */ static void Load_Init() { Global.Add("MPILinearCG","(",new MPILinearCG()); // old form with rhs (must be zer Global.Add("MPIAffineCG","(",new MPILinearCG(1)); // without right handsize Global.Add("MPILinearGMRES","(",new MPILinearCG(0,0)); // with right handsize Global.Add("MPIAffineGMRES","(",new MPILinearCG(0,0,0)); // with right handsize Global.Add("MPINLCG","(",new MPILinearCG(-1)); // without right handsize } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/MPICGLap.edp000644 000767 000024 00000010515 11745333166 020334 0ustar00hechtstaff000000 000000 load "MPICG" // the grad of the bilinear part of J (the RHS in remove) int n=3; real[int] b(n),u(n); b=1; u=0; // set right hand side and initial gest func real[int] matId(real[int] &u) { return u;}; func real[int] DJ0(real[int] &u) { for (int i=0;i1e10 && vi[nn-1] < 1e10); vi.resize(nn); Ii.resize(nn); for(int i=0;i> NN; assert( nn == NN) ; // II.resize(NN); processor(1-rank,comm) <>II; //cout << Ii << endl; real Ihioo=0; try { Ihioo= Ihi(Vh.ndof-1,Ii[nn-1]); } catch(...) {;}; int[int] I(0:Vh.ndof-1); Ihi = Ihi(I,Ii); assert(Ihi(Vh.ndof-1,nn-1) == Ihioo); // cout << rank << " Ihi = "<< Ihi << " ---- " << endl; dhi=1; vi=1; dhi += Ihi*vi; real[int] one(dhi);one=1.; dhi = one ./ dhi; cout << dhi << endl; } real[int] tosend(NN),torecv(nn); real tgv=1e3; macro Grad(u) [dx(u),dy(u)] // varf va(u,v)=int2d(Th)(u*v+Grad(u)'*Grad(v)) - int2d(Th)( x*v ) -int1d(Th,1)( N.x*v) ; ;//'); matrix A=va(Vh,Vh,tgv=tgv); real[int] b=va(0,Vh,tgv=tgv); int kiter=0; func real[int] projC(real[int] &u) { verbosity=0; processor(1-rank,comm) << (tosend = u(II)); processor(1-rank,comm) >> torecv; //cout << "to send " << tosend << endl; u += Ihi*torecv; // u = u .* dhi; Vh uu; uu[]=u; // cout << kiter++ << " " << mpirank << " --- " << uu(1,0.5) << endl; return u; } func real[int] projD(real[int] &u) { verbosity=0; processor(1-rank,comm) << (tosend = u(II)); processor(1-rank,comm) >> torecv; u += Ihi*torecv; u = u .* dhi; Vh uu; uu[]=u; // cout << kiter++ << " " << mpirank << " --- " << uu(1,0.5) << endl; return u; } func bool Plot(real[int] & uu) { Vh u; u[]=uu; Vhi ui; if(rank==0) { processor(1,comm) >> ui[]; plot(u,ui,wait=1); } else processor(0,comm) << u[]; return true; } func real[int] DJJ(real[int] &v) { verbosity=0; // Plot(v); v = projD(v); real[int] u=A*v; u += b; u = projC(u); verbosity=101; return u; // return }; func real[int] matId(real[int] &u) { verbosity=0; u =projD(u); verbosity=100; return u;}; Vh u=0; u=0; verbosity=100; MPIAffineCG(DJJ,u[],eps=1.e-4,nbiter=200,precon=matId,comm=comm); projD(u[]); Plot(u[]); if(rank==0) { fespace Vhh(Thh,P1); Vhh uuu,vvv; // u = x , dn(x) = N.x solve PPPP(uuu,vvv) = int2d(Thh)(uuu*vvv+Grad(uuu)'*Grad(vvv)) - int2d(Thh)( x*vvv ) -int1d(Thh,1)( N.x*vvv) ; //'); cout << " err = " << int2d(Th)( square(uuu-u)) << " " << int2d(Thh)( square(uuu-x)) << endl; savemesh(Thh,"/tmp/Thh.msh"); } } } freefem++-3.38-1/examples++-mpi/MPIGMRES2D.edp000644 000767 000024 00000031400 12504074373 020441 0ustar00hechtstaff000000 000000 // NBPROC 10 // ff-mpirun -np 4 MPIGMRES2D.edp -glut ffglut -n 11 -k 1 -d 1 -ns -gmres 1 /* a first true parallele example fisrt freefem++ Ok up to 200 proc for a Poisson equation.. See the Doc for full explaiantion F Hecht Dec. 2010. ------------------- usage : ff-mpirun [mpi parameter] MPIGMRES2d.edp [-glut ffglut] [-n N] [-k K] [-d D] [-ns] [-gmres [0|1] argument: -glut ffglut : to see graphicaly the process -n N: set the mesh cube split NxNxN -d D: set debug flag D must be one for mpiplot -k K: to refined by K all elemnt -ns: reomove script dump -gmres 0 : use iterative schwarz algo. 1 : Algo GMRES on residu of schwarz algo. 2 : DDM GMRES 3 : DDM GMRES with coarse grid preconditionner (Good one) */ load "MPICG" load "medit" load "metis" include "getARGV.idp" include "MPIplot.idp" include "MPIGMRESmacro.idp" //include "AddLayer2d.idp" searchMethod=1; // more safe seach algo (warning can be very expensive in case lot of ouside point) assert(version >=3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",3); int nloc = getARGV("-n",10); string sff=getARGV("-p,",""); int gmres=getARGV("-gmres",2); bool dplot=getARGV("-dp",0); int nC = getARGV("-N" ,max(nloc/10,4)); if(mpirank==0 && verbosity) { cout << "ARGV : "; for(int i=0;i0,label=10); // non-overlapping mesh, interfaces have label 10 int nnn = sizeoverlaps*2;// to be sure AddLayers(Thg,suppi[],nnn,unssd[]); // see above ! suppi and unssd are modified unssd[] *= nnn; // to put value nnn a 0 real nnn0 = nnn - sizeoverlaps + 0.001 ; Thi=trunc(Thg,unssd>nnn0 ,label=10); // overlapping mesh, interfaces have label 10 settt fespace Vhi(Thi,P1); int npij=npart; Vhi[int] pij(npij);// local partition of unit + pii Vhi pii; real nnn1= + 0.001 ; { /* construction of the partition of the unit, let phi_i P1 FE function 1 on Thin and zero ouside of Thi and positive the partition is build with $$ p_i = phi_i/ \sum phi_i to build the partition of one domain i we nned to find all j such that supp(phi_j) \cap supp(phi_j) is not empty <=> int phi_j */ // build a local mesh of thii such that all compuation of the unit partition are // exact in thii mesh Thii=trunc(Thg,unssd>nnn1 ,label=10); // overlapping mesh, interfaces have label 10 { // find all j mes (supp(p_j) \cap supp(p_i)) >0 // compute all phi_j on Thii // remark supp p_i include in Thi // fespace Phii(Thii,P0); fespace Vhii(Thii,P1); Vhi sumphi=0; jpart=0; njpart=0; int nlayer=RAS?1:sizeoverlaps; if(ipart==0) cout <<" nlayer=" << nlayer << endl; pii= max(unssd-nnn+nlayer,0.)/nlayer; if(dplot) plot(pii,wait=1,cmm=" 0000"); sumphi[] += pii[]; if(dplot) plot(sumphi,wait=1,cmm=" summ 0000"); Vhii phii=0; real epsmes=1e-10*Thii.area; for (int i=0;i 0.5) { AddLayers(Thii,suppii[],nlayer,phii[]); assert(phii[].min >=0); real interij = int2d(Thi)( phii); if(interij>epsmes) { pij[njpart]=abs(phii); if(vdebug>2) cout << " ***** " << int2d(Thi)(real(pij[njpart])<0) << " " <2) cout << " sum min " < 1.-1e-6 && sumphi[].max< 1.+1e-6); // verification }}// (Thii is remove here) // end of the construction of the local partition of the unity ... // on Thi ... // ----------------------------------------------------------------- if(ipart==0) cout << " *** end build partition " << endl; // computation of number of intersection .. // ------------------------------------------ // here pii and the pij is the locate partition of the unite on // Thi ( mesh with overlap ).... //Thi=splitmesh(Thi,2); if(dplot ) { plot(Thi,wait=1); for(int j=0;j we have to recive // data on intersection of the support of pij[0] and pij[j] settt if(vdebug) plotMPIall(Thi,pii[],"pi_i"); mesh[int] aThij(njpart); matrix Pii; matrix[int] sMj(njpart); // M of send to j matrix[int] rMj(njpart); // M to recv from j fespace Whi(Thi,Pk); mesh Thij=Thi; fespace Whij(Thij,Pk);// // construction of the mesh intersect i,j part for(int jp=0;jp1e-6,label=10); // mesh of the supp of pij for(int jp=0;jp s Whij rMj[jp] = interpolate(Whij,Whi,t=1); // Whji -> Whi if(vdebug>10) { {Whi uuu=1;Whij vvv=-1; vvv[]+=I*uuu[]; cout << jp << " %%% " << vvv[].linfty << endl; assert(vvv[].linfty < 1e-6);} {Whi uuu=1;Whij vvv=-1; vvv[]+=rMj[jp]'*uuu[]; cout << jp << " ### " << vvv[].linfty << endl; assert(vvv[].linfty < 1e-6);}} }} if(ipart==0) cout << " *** end build transfert matrix " << endl; // alloc array of send and recv data .. InitU(njpart,Whij,Thij,aThij,Usend) // initU(n,Vh,Th,aTh,U) InitU(njpart,Whij,Thij,aThij,Vrecv) // ... if(ipart==0) cout << " *** end init data for send/revc " << endl; Whi ui,vi; func bool Update(real[int] &ui, real[int] &vi) { for(int j=0;j I ~ - C1AC2A +C1A +C2A // New Prec P= C1+C2 - C1AC2 = C1(I- A C2) +C2 // ( C1(I- A C2) +C2 ) Uo // V = - C2*Uo // .... real[int] V(U.n); CoarseSolve(V,U,comm); V = -V; // -C2*Uo U += Ai*V; // U = (I-A C2) Uo real[int] b= onG10 ? 0. : U; U = Ai^-1*b; // ( C1( I -A C2) Uo V = U -V; // Update(V,U); return U; } func real[int] DJ0(real[int]& U) { ++kiter; real[int] V(U.n); real[int] b= onG .* U; b = onG ? b : Bi ; V = Ai^-1*b; Update(V,U); V -= U; return V; } Whi u=0,v; { // verification..... Whi u=1,v; Update(u[],v[]); u[]-=v[]; assert( u[].linfty<1e-6); } settt u[]=vBC(0,Whi,tgv=1); // set u with tge BC value ... real epss=1e-6; int rgmres=0; if(gmres==1) { rgmres=MPIAffineGMRES(DJ0,u[],veps=epss,nbiter=300,comm=comm,dimKrylov=100,verbosity=ipart ? 0: 50); real[int] b= onG .* u[]; b = onG ? b : Bi ; v[] = Ai^-1*b; Update(v[],u[]); } else if(gmres==2) rgmres= MPILinearGMRES(DJ,precon=PDJ,u[],Bi,veps=epss,nbiter=300,comm=comm,dimKrylov=100,verbosity=ipart ? 0: 50); else if(gmres==3) rgmres= MPILinearGMRES(DJ,precon=PDJC,u[],Bi,veps=epss,nbiter=300,comm=comm,dimKrylov=100,verbosity=ipart ? 0: 50); else // algo Shwarz for demo ... for(int iter=0;iter <10; ++iter) { real[int] b= onG .* u[]; b = onG ? b : Bi ; v[] = Ai^-1*b; Update(v[],u[]); if(vdebug) plotMPIall(Thi,u[],"u-"+iter); v[] -= u[]; real err = v[].linfty; real umax = u[].max; real[int] aa=[err,umax], bb(2); mpiAllReduce(aa,bb,comm,mpiMAX); real errg = bb[0]; real umaxg = bb[1]; if(ipart==0) cout << ipart << " err = " << errg << " u. max " << umaxg << endl; if(errg< 1e-5) break; } if(vdebug) plotMPIall(Thi,u[],"u-final"); settt real errg =1,umaxg; { real umax = u[].max,umaxg; real[int] aa=[umax], bb(1); mpiAllReduce(aa,bb,comm,mpiMAX); errg=bb[0]; if(ipart==0) cout << " umax global = " << bb[0] << " Wtime = " << (ttt[ittt-1]-ttt[ittt-2]) << " s " << " " << kiter << endl; } if(sff != "") { ofstream ff(sff+".txt",append); cout << " ++++ " ; cout << mpirank <<"/" << mpisize << " k=" << ksplit << " n= " << nloc << " " << sizeoverlaps << " it= " << kiter ; for (int i=1; i3.11); real[int] ttt(10);int ittt=0; macro settt {ttt[ittt++]=mpiWtime();}// verbosity=getARGV("-vv",0); int vdebug=getARGV("-d",1); int ksplit=getARGV("-k",2); int nloc = getARGV("-n",10); string sff=getARGV("-p,",""); int gmres=getARGV("-gmres",3); bool dplot=getARGV("-dp",0); int nC = getARGV("-N" ,max(nloc/10,4)); if(mpirank==0 && verbosity) { cout << "ARGV : "; for(int i=0;i0,label=10); // non-overlapping mesh3, interfaces have label 10 int nnn = sizeoverlaps*2;// to be sure AddLayers(Thg,suppi[],nnn,unssd[]); // see above ! suppi and unssd are modified unssd[] *= nnn; // to put value nnn a 0 real nnn0 = nnn - sizeoverlaps + 0.001 ; Thi=trunc(Thg,unssd>nnn0 ,label=10); // overlapping mesh3, interfaces have label 10 settt fespace Vhi(Thi,P1); int npij=npart; Vhi[int] pij(npij);// local partition of unit + pii Vhi pii; real nnn1= + 0.001 ; { /* construction of the partition of the unit, let phi_i P1 FE function 1 on Thin and zero ouside of Thi and positive the partition is build with $$ p_i = phi_i/ \sum phi_i to build the partition of one domain i we nned to find all j such that supp(phi_j) \cap supp(phi_j) is not empty <=> int phi_j */ // build a local mesh3 of thii such that all compuation of the unit partition are // exact in thii mesh3 Thii=trunc(Thg,unssd>nnn1 ,label=10); // overlapping mesh3, interfaces have label 10 { // find all j mes (supp(p_j) \cap supp(p_i)) >0 // compute all phi_j on Thii // remark supp p_i include in Thi // fespace Phii(Thii,P0); fespace Vhii(Thii,P1); Vhi sumphi=0; jpart=0; njpart=0; int nlayer=RAS?1:sizeoverlaps; if(ipart==0) cout <<" nlayer=" << nlayer << endl; pii= max(unssd-nnn+nlayer,0.)/nlayer; if(dplot) plot(pii,wait=1,cmm=" 0000"); sumphi[] += pii[]; if(dplot) plot(sumphi,wait=1,cmm=" summ 0000"); Vhii phii=0; real epsmes=1e-10*Thii.mesure; for (int i=0;i 0.5) { AddLayers(Thii,suppii[],nlayer,phii[]); assert(phii[].min >=0); real interij = int3d(Thi)( phii); if(interij>epsmes) { pij[njpart]=abs(phii); if(vdebug>2) cout << " ***** " << int3d(Thi)(real(pij[njpart])<0) << " " < 1.-1e-6 && sumphi[].max< 1.+1e-6); // verification }}// (Thii is remove here) // end of the construction of the local partition of the unity ... // on Thi ... // ----------------------------------------------------------------- if(ipart==0) cout << " *** end build partition " << endl; // computation of number of intersection .. // ------------------------------------------ // here pii and the pij is the locate partition of the unite on // Thi ( mesh3 with overlap ).... //Thi=splitmesh(Thi,2); if(dplot ) { plot(Thi,wait=1); for(int j=0;j we have to recive // data on intersection of the support of pij[0] and pij[j] settt plotMPIall(Thi,pii[],"pi_i"); mesh3[int] aThij(njpart); matrix Pii; matrix[int] sMj(njpart); // M of send to j matrix[int] rMj(njpart); // M to recv from j fespace Whi(Thi,Pk); mesh3 Thij=Thi; fespace Whij(Thij,Pk);// // construction of the mesh3 intersect i,j part for(int jp=0;jp1e-6,label=10); // mesh3 of the supp of pij for(int jp=0;jp s Whij rMj[jp] = interpolate(Whij,Whi,t=1); // Whji -> Whi if(vdebug>10) { {Whi uuu=1;Whij vvv=-1; vvv[]+=I*uuu[]; cout << jp << " %%% " << vvv[].linfty << endl; assert(vvv[].linfty < 1e-6);} {Whi uuu=1;Whij vvv=-1; vvv[]+=rMj[jp]'*uuu[]; cout << jp << " ### " << vvv[].linfty << endl; assert(vvv[].linfty < 1e-6);}} }} if(ipart==0) cout << " *** end build transfert matrix " << endl; // alloc array of send and recv data .. InitU(njpart,Whij,Thij,aThij,Usend) // initU(n,Vh,Th,aTh,U) InitU(njpart,Whij,Thij,aThij,Vrecv) // ... if(ipart==0) cout << " *** end init data for send/revc " << endl; Whi ui,vi; func bool Update(real[int] &ui, real[int] &vi) { for(int j=0;j I ~ - C1AC2A +C1A +C2A // New Prec P= C1+C2 - C1AC2 = C1(I- A C2) +C2 // ( C1(I- A C2) +C2 ) Uo // V = - C2*Uo // .... real[int] V(U.n); CoarseSolve(V,U,comm); V = -V; // -C2*Uo U += Ai*V; // U = (I-A C2) Uo real[int] b= onG10 ? 0. : U; U = Ai^-1*b; // ( C1( I -A C2) Uo V = U -V; // Update(V,U); return U; } func real[int] DJ0(real[int]& U) { ++kiter; real[int] V(U.n); real[int] b= onG .* U; b = onG ? b : Bi ; V = Ai^-1*b; Update(V,U); V -= U; return V; } Whi u=0,v; { // verification..... Whi u=1,v; Update(u[],v[]); u[]-=v[]; assert( u[].linfty<1e-6); } settt u[]=vBC(0,Whi,tgv=1); // set u with tge BC value ... real epss=1e-6; int rgmres=0; if(gmres==1) { rgmres=MPIAffineGMRES(DJ0,u[],veps=epss,nbiter=300,comm=comm,dimKrylov=100,verbosity=ipart ? 0: 50); real[int] b= onG .* u[]; b = onG ? b : Bi ; v[] = Ai^-1*b; Update(v[],u[]); } else if(gmres==2) rgmres= MPILinearGMRES(DJ,precon=PDJ,u[],Bi,veps=epss,nbiter=300,comm=comm,dimKrylov=100,verbosity=ipart ? 0: 50); else if(gmres==3) rgmres= MPILinearGMRES(DJ,precon=PDJC,u[],Bi,veps=epss,nbiter=300,comm=comm,dimKrylov=100,verbosity=ipart ? 0: 50); else // algo Shwarz for demo ... for(int iter=0;iter <10; ++iter) { real[int] b= onG .* u[]; b = onG ? b : Bi ; v[] = Ai^-1*b; Update(v[],u[]); if(vdebug) plotMPIall(Thi,u[],"u-"+iter); v[] -= u[]; real err = v[].linfty; real umax = u[].max; real[int] aa=[err,umax], bb(2); mpiAllReduce(aa,bb,comm,mpiMAX); real errg = bb[0]; real umaxg = bb[1]; if(ipart==0) cout << ipart << " err = " << errg << " u. max " << umaxg << endl; if(errg< 1e-5) break; } if(vdebug) plotMPIall(Thi,u[],"u-final"); settt real errg =1,umaxg; { real umax = u[].max,umaxg; real[int] aa=[umax], bb(1); mpiAllReduce(aa,bb,comm,mpiMAX); errg=bb[0]; if(ipart==0) cout << " umax global = " << bb[0] << " Wtime = " << (ttt[ittt-1]-ttt[ittt-2]) << " s " << " " << kiter << endl; } if(sff != "") { ofstream ff(sff+".txt",append); cout << " ++++ " ; cout << mpirank <<"/" << mpisize << " k=" << ksplit << " n= " << nloc << " " << sizeoverlaps << " it= " << kiter ; for (int i=1; i> Ri[j]; } // EOM macro CheckUV(comm,jpart,Si,Ri) { int ipart=mpiRank(comm); int n= jpart.n; int[int] rn(n),sn(n),in(n); for (int j=0;j> rn[j]; for (int j=0;j> in[j]; int err=0; for (int j=0;j " << in[j] << " " << err << endl; } assert(err==0); }//EOM macro SendRecvUV(comm,jpart,Si,Ri) { int n= jpart.n; mpiRequest[int] rq(n); for (int j=0;j> Ri[j][];*/ for (int j=0;j // //ff-c++-LIBRARY-dep: mumps parmetis ptscotch scotch scalapack blas mpifc fc mpi pthread //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "rgraph.hpp" #include "AFunction.hpp" // FFCS - 23/4/13 - instanciate some global symbols which are not found by default in MS MPI Fortran libraries #ifdef _WIN32 __declspec(dllexport) int toto; MPI_Fint* _imp__MPI_F_STATUS_IGNORE; MPI_Fint* _imp__MPI_F_STATUSES_IGNORE; #endif #include "MatriceCreuse.hpp" #include "dmatrix.hpp" #include #include #define JOB_INIT -1 #define JOB_END -2 #define USE_COMM_WORLD -987654 #define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */ #define INFOG(I) infog[(I)-1] /* macro s.t. indices match documentation */ #define INFO(I) info[(I)-1] /* macro s.t. indices match documentation */ template struct MUMPS_STRUC_TRAIT {typedef void MUMPS; typedef void R; }; template<> struct MUMPS_STRUC_TRAIT {typedef DMUMPS_STRUC_C MUMPS; typedef double R;}; template<> struct MUMPS_STRUC_TRAIT {typedef ZMUMPS_STRUC_C MUMPS; typedef ZMUMPS_COMPLEX R;}; void mumps_c(DMUMPS_STRUC_C *id) { dmumps_c(id);} void mumps_c(ZMUMPS_STRUC_C *id) { zmumps_c(id);} template struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_BYTE;}};; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_LONG;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_INT;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_DOUBLE;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_BYTE;}}; template<> struct MPI_TYPE {static const MPI_Datatype TYPE(){return MPI_DOUBLE_COMPLEX;}}; static std::string analysis[] = {"AMD", "", "AMF", "SCOTCH", "PORD", "METIS", "QAMD", "automatic sequential", "automatic parallel", "PT-SCOTCH", "ParMetis"}; template class SolverMumps : public MatriceMorse::VirtualSolver { private: mutable typename MUMPS_STRUC_TRAIT::MUMPS * _id; //mutable DMUMPS_STRUC_C* _id; mutable unsigned char _strategy; bool distributed; MPI_Comm comm; int mpirank; public: typedef typename MUMPS_STRUC_TRAIT::R MR; SolverMumps(const MatriceMorse &A, KN ¶m_int, KN ¶m_R, MPI_Comm* pcomm,int strategy=3,int matrank=0) : comm( pcomm ? *pcomm :MPI_COMM_WORLD ), distributed(matrank<0) { MPI_Comm_rank(comm, &mpirank); int master = mpirank==matrank; _id = new typename MUMPS_STRUC_TRAIT::MUMPS ; _id->job = JOB_INIT; _id->par = 1; _id->comm_fortran = MPI_Comm_c2f(comm); _id->sym = A.symetrique; _strategy = strategy; mumps_c(_id); int* I = 0; int* J = 0; R * C = 0; long nnz=0; if( distributed || (mpirank == matrank) ) { if(_id->sym == 0) { nnz = A.nbcoef; I = new int[A.nbcoef]; CSR2COO<'C', 'U'>(A.n, A.lg, I); C = A.a; J = A.cl; for(unsigned int i = 0; i < A.nbcoef; ++i) ++J[i]; } else { if(A.symetrique) { nnz = A.nbcoef; I = new int[A.nbcoef]; J = new int[A.nbcoef]; C = new R[A.nbcoef]; for(unsigned int i = 0; i < A.n; ++i) C[i] = A.a[A.lg[i + 1] - 1]; std::generate(I, I + A.n, step(0, 1)); CSR2COO<'C', 'L'>(A.n, A.lg, I + A.n); std::copy(I, I + A.n, J); for(unsigned int i = 1; i < A.n; ++i) { for(unsigned int j = A.lg[i]; j < A.lg[i + 1] - 1; ++j) { J[A.n + j - i] = A.cl[j] + 1; C[A.n + j - i] = A.a[j]; } } } else { nnz = A.n + (A.nbcoef - A.n) / 2; I = new int[A.n + (A.nbcoef - A.n) / 2]; J = new int[A.n + (A.nbcoef - A.n) / 2]; C = new R[A.n + (A.nbcoef - A.n) / 2]; trimCSR(A.n, I + A.n, A.lg, J + A.n, A.cl, C + A.n, A.a); for(unsigned int i = 0; i < A.n - 1; ++i) C[i] = A.a[A.lg[i + 1] - (I[i + 1 + A.n] - I[i + A.n]) - 1]; C[A.n - 1] = A.a[A.nbcoef - 1]; std::generate(I, I + A.n, step(0, 1)); CSR2COO<'F', 'U'>(A.n - 1, I + A.n, I + A.n); std::copy(I, I + A.n, J); } } _id->n = A.n; if(!distributed) { _id->nz=nnz; _id->a =reinterpret_cast( C); _id->irn = I; _id->jcn = J; } else { _id->nz_loc=nnz; _id->a_loc =reinterpret_cast( C); _id->irn_loc = I; _id->jcn_loc = J; } } else { // no matrix ... _id->nz=0; _id->a =0; _id->irn = 0;; _id->jcn = 0; } _id->nrhs = 1; _id->ICNTL(1) = 0; _id->ICNTL(2) = 0; _id->ICNTL(3) = verbosity > 1 ? 6 : 0; _id->ICNTL(4) = 0; // verbose level _id->ICNTL(5) = 0; // assembled format if(_strategy > 0 && _strategy < 9 && _strategy != 2) { _id->ICNTL(28) = 1; // 1: sequential analysis _id->ICNTL(7) = _strategy - 1; // 0: AMD } // 1: // 2: AMF // 3: SCOTCH // 4: PORD // 5: METIS // 6: QAMD // 7: automatic else { _id->ICNTL(28) = 1; _id->ICNTL(7) = 7; } if(_strategy > 8 && _strategy < 12) { _id->ICNTL(28) = 2; // 2: parallel analysis _id->ICNTL(29) = _strategy - 9; // 0: automatic } // 1: PT-STOCH // 2: ParMetis _id->ICNTL(9) = 1; _id->ICNTL(11) = 0; // verbose level _id->ICNTL(18) = distributed ? 3: 0; // centralized matrix input if !distributed _id->ICNTL(20) = 0; // dense RHS _id->ICNTL(14) = 30; // percentage increase in the estimated working space _id->job = 4; mumps_c(_id); if(_id->INFOG(1) != 0) std::cout << "BUG MUMPS, INFOG(1) = " << _id->INFOG(1) << " distributed: " << distributed << " master " << matrank << std::endl; if(I) { if(_id->sym == 0) { for(unsigned int i = 0; i < A.nbcoef; ++i) --J[i]; } else { delete [] C; delete [] J; } delete [] I; } }; void Solver(const MatriceMorse &A, KN_ &x, const KN_ &b) const { _id->ICNTL(20) = 0; // dense RHS _id->ICNTL(21) = 0; // centralized dense solution if(distributed) { MPI_Reduce( (void *) (R*) b,(void *) (R*) x , x.N() , MPI_TYPE::TYPE(),MPI_SUM,0,comm); } else if(mpirank==0) x = b; _id->ICNTL(3) = verbosity > 1 ? 6 : 0; _id->rhs = reinterpret_cast((R*) x); _id->job = 3; mumps_c(_id); if(distributed) { MPI_Bcast(reinterpret_cast ( (R*) x), x.N(), MPI_TYPE::TYPE(), 0,comm); } }; ~SolverMumps() { _id->job = JOB_END; mumps_c(_id); if(_id) delete _id; }; }; template typename MatriceMorse::VirtualSolver* buildSolver(DCL_ARG_SPARSE_SOLVER(R, A)) {// gestion de la star MPI_Comm cw = MPI_COMM_WORLD, * pcw= (MPI_Comm*) ds.commworld; if(!pcw) pcw = & cw; int mpirank ; MPI_Comm_rank(*pcw, &mpirank); int strategy = ds.strategy,matrank=0; if(Data_Sparse_Solver_version()>0 ) matrank=ds.master; if( !strategy && ds.lparams.N() > 0) strategy = ds.lparams[0]; if(ds.lparams.N()>1) matrank = ds.lparams[1];// <0 => distri mat .. if( ! strategy) strategy=3; int mat = mpirank == matrank || matrank < 0; if(A) return new SolverMumps(*A, ds.lparams, ds.dparams, pcw,strategy,matrank); else ffassert(0); return new SolverMumps(*A, ds.lparams, ds.dparams, pcw,strategy,matrank); } // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; DefSparseSolver::SparseMatSolver SparseMatSolver_C; DefSparseSolverSym::SparseMatSolver SparseMatSolverSym_R ; ; DefSparseSolverSym::SparseMatSolver SparseMatSolverSym_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetMUMPS() { if(verbosity>1) cout << " SetDefault sparse solver to MUMPS" << endl; DefSparseSolver::solver = buildSolver; DefSparseSolver::solver = buildSolver; DefSparseSolverSym::solver = buildSolver; DefSparseSolverSym::solver = buildSolver; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; return true; } void initMUMPS() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; SparseMatSolverSym_R= DefSparseSolverSym::solver; SparseMatSolverSym_C= DefSparseSolverSym::solver; if(verbosity>1) cout << "\n Add: MUMPS: defaultsolver defaultsolverMUMPS_" << endl; DefSparseSolver::solver = buildSolver; DefSparseSolver::solver = buildSolver; DefSparseSolverSym::solver = buildSolver; DefSparseSolverSym::solver = buildSolver; TypeSolveMat::defaultvalue =TypeSolveMatdefaultvalue; if(! Global.Find("defaulttoMUMPS").NotNull() ) Global.Add("defaulttoMUMPS","(",new OneOperator0(SetMUMPS)); } LOADFUNC(initMUMPS); freefem++-3.38-1/examples++-mpi/MUMPS.edp000755 000767 000024 00000003747 12310553611 017741 0ustar00hechtstaff000000 000000 load "MUMPS" load "symmetrizeCSR" int[int] l = [1, 1, 2, 2]; mesh Th = square(150, 150, label = l); int master = 0; // no choose see MUMPS doc sect 4.3 if(mpirank != master) // no need to store the matrix on ranks other than 0 Th = square(1, 1, label = l); fespace Vh(Th, P2); varf lap(u,v) = int2d(Th)(dx(u)*dx(v) + dy(u)*dy(v)) + int2d(Th)(v) + on(1, u = 1); real[int] b = lap(0, Vh); matrix A,B; //if( mpirank==master) // => trap pb of size in A^-1 * b; { // def only on master .. A = lap(Vh, Vh); B = A; symmetrizeCSR(B); } verbosity = 2; // If you want, you can pass an array of integer (int[int] t) // for specifying the ordering you want to use // 1 : AMD // 3 : AMF // 4 : SCOTCH // 5 : PORD // 6 : METIS // 7 : QAMD // 10 : PT-SCOTCH // 11 : ParMETIS // // You can also set on which MPI rank the matrix is defined // as the current interface only supports centralized matrices // // Example : // If one wants to use SCOTCH with a matrix stored on mpirank == 0 // int[int] t(2); t(0) = 4; t(1) = 1; // set(A, solver = sparsesolver, lparams = t); set(A, solver = sparsesolver,master=master); set(B, solver = sparsesolver,master=master); verbosity = 0; Vh u; u[] = A^-1 * b; if(mpirank==master) cout << " A : u " << u[].l1 << " " << u[].linfty << endl; if(mpirank==0-master) plot(Th, u, wait = 1, dim = 3, fill = 1, cmm = "sparsesolver unsymmetric", value = 1); u[] = B^-1 * b; if(mpirank==master) cout << " B : u " << u[].l1 << " " << u[].linfty << endl; if(mpirank==master) plot(Th, u, wait = 1, dim = 3, fill = 1, cmm = "sparsesolver symmetric", value = 1); // try distributed version ... Th = square(150, 150, label = l); u=0; // resize u.. b.resize(Vh.ndof); Th=change(Th,fregion= nuTriangle%mpisize); varf lapd(u,v) = int2d(Th,mpirank)(dx(u)*dx(v) + dy(u)*dy(v)) + int2d(Th,mpirank)(v) + on(1, u = 1); A = lapd(Vh, Vh,solver=CG); set(A, solver = sparsesolver,master=-1);// distruteb b = lapd(0, Vh); u[] = A^-1 * b; cout << " D u " << u[].l1 << " " << u[].linfty << " " << mpirank << endl; freefem++-3.38-1/examples++-mpi/MUMPS_FreeFem.cpp000644 000767 000024 00000211643 12500052047 021333 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // //ff-c++-LIBRARY-dep:mumps ptscotch scotch scalapack blas mpifc fc mpi pthread //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include using namespace std; #ifdef _WIN32 // ALH - this activates the Windows DLL default export mechanism __declspec(dllexport) int not_used; // FFCS - 23/4/13 - instanciate some global symbols which are not found by default in MS MPI Fortran libraries MPI_Fint* _imp__MPI_F_STATUS_IGNORE; MPI_Fint* _imp__MPI_F_STATUSES_IGNORE; #endif #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include #include #include #include "dmumps_c.h" #include "zmumps_c.h" // read options for MUMPS in freefem++ int s_(char* str, const char* cmp[]) { int i = 0; while( cmp[i] != 0){ if( strcmp(str, cmp[i]) == 0){ //cout << *str << " return" << i << endl; return i+1 ; } i++; } //cout << *str << " return 0" << endl; return 0; } void read_options_freefem(string *string_option, int *SYM, int *PAR){ static const char* comp[] = {"SYM", "PAR", 0}; char data[string_option->size()+1]; strcpy( data, string_option->c_str()); cout << "data=" << data << endl; char * tictac; tictac = strtok(data," =,\t\n"); cout << "tictac=" << data << endl; while(tictac != NULL){ int id_option = s_(tictac, comp); tictac = strtok(NULL," =,\t\n"); int val_options; switch (id_option) { case 1 : // SYM *SYM = atoi(tictac); // strtol ??? if(*SYM != 0 && *SYM !=1) cout << "SYM must be equal to 1 or 0 for MUMPS" << endl; break; case 2: // PAR *PAR = atoi(tictac); if(*PAR != 0 && *PAR !=1) cout << "PAR must be equal to 1 or 0" << endl; //strtol ??? break; case 0: // Equivalent of case default break; } tictac = strtok(NULL," =,\t\n"); } } class dSolveMUMPSmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 mutable MPI_Comm comm; double *a; int *irn, *jcn; int n, m, nz; // parameter MUMPS KN_ perm_r; /* row permutations from partial pivoting */ KN_ perm_c; KN_ scale_r; KN_ scale_c; string string_option; string data_option; int SYM; int PAR; int myid; // distribuer int nz_loc; int *jcn_loc, *irn_loc; double *a_loc; static const int JOB_INIT=-1; static const int JOB_END=-2; static const int USE_COMM_WORLD= -987654; // variable reel mutable DMUMPS_STRUC_C id; #define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */ #define CNTL(I) cntl[(I)-1] /* macro s.t. indices match documentation */ #define RINFOG(I) rinfog[(I)-1] /* macro s.t. indices match documentation */ #define INFOG(I) infog[(I)-1] /* macro s.t. indices match documentation */ public: dSolveMUMPSmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string param_string, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN &pperm_c, KN &pscale_r,KN &pscale_c, MPI_Comm * mpicommw ) : eps(epsilon),epsr(0), tgv(ttgv), string_option(param_string), data_option(datafile), perm_r(pperm_r), perm_c(pperm_c), tol_pivot_sym(pivot_sym),tol_pivot(pivot), scale_r(pscale_r), scale_c(pscale_c) { long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); int dataint[40]; double datadouble[15]; int ierr; if(mpicommw==0){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; /* ------------------------------------------------------------ INITIALIZE THE MUMPS PROCESS GRID. ------------------------------------------------------------*/ ierr = MPI_Comm_rank(comm, &myid); if( myid ==0){ n = AA.n; m = AA.m; nz = AA.nbcoef; MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } else{ MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } if( !(param_int==NULL) ) assert( param_int.N() == 42); if( !(param_double==NULL) ) assert( param_double.N() == 15); if(perm_r) assert( perm_r.N() == n); if(perm_c) assert( perm_c.N() == m); if(scale_r) assert( scale_r.N() == n); if(scale_c) assert( scale_c.N() == m); if( n != m ) cerr << "only square matrix are supported by MUMPS" << endl; // initialisation par defaut SYM=0; PAR=1; /* if(!string_option.empty()) { if(myid==0){ cout << "read string option" <2) cout << " MUMPS_FreeFem init parameter :: PAR & SYM " << PAR << " " << SYM << endl; dmumps_c(&id); if(verbosity>10) cout << "fin init parameter" << endl; /* set parameter of mumps */ if( !(param_int == NULL) || !(param_double == NULL) ){ if(!data_option.empty()){ printf("MUMPS ERROR: parameters are given on the file %s and in the array lparams and dparams => double definition of parameters.",data_option.c_str()); exit(1); } if( !(param_int == NULL) ){ cout << "internal parameter" << endl; for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = param_int[ii+2]; } else{ // parameter by default id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; } if( !(param_double == NULL) ){ cout << "internal parameter" << endl; for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = param_double[ii]; } } else if(!data_option.empty()){ for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = dataint[ii]; for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = datadouble[ii]; } else{ // parameter by default if(verbosity>10) cout << "default parameter" << endl; id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; } // uniquement donner au host if(myid==0) { if( !(perm_r==NULL) && id.ICNTL(7)==1){ for(int ii=0; ii id.ICNTL(5) = 0; \n"); id.ICNTL(5) = 0; exit(1); } if (myid == 0) { id.n = n; id.nz =nz; //id.irn=irn; id.jcn=jcn; //id.a = a; //id.rhs = rhs; } if( id.ICNTL(18) == 0) { // CASE:: NON DISTRIBUTED MATRIX if (myid == 0) { // nouveau a=AA.a; // ATTENTION // AA.cl :: indice des colonnes (exacte) et AA.lg :: indice des lignes // index of row and colummn by 1 jcn = AA.cl; for(int ii=0; ii 1) cout <<"id.ICNTL(18) = 1 || id.ICNTL(18) == 2 "<< endl; // ATTENTION // AA.cl :: indice des colonnes (exacte) et AA.lg :: indice des lignes // index of row and column by 1 if (myid == 0) { // new host process jcn = AA.cl; for(int ii=0; ii 0){ id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = a_loc; } if( myid == 0){ //free( irn_loc ); //free( jcn_loc ); //free( a_loc ); free( nz_loc_procs ); free( fst_nz_procs ); free( irn_g ); free( jcn_g ); free( a_g ); } } if( PAR == 1 ){ int *nz_loc_procs; int *fst_nz_procs; int *irn_g; int *jcn_g; double *a_g; int commSize; MPI_Comm_size(comm,&commSize); if(myid==0){ // allocation des differents tableaux nz_loc_procs = (int*) malloc ( commSize*sizeof(int) ); for(int ii=0; ii pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = a_loc; } } if(PAR == 1){ //============================== // besoin de irn, jcn, AA.a //============================== int commSize; ierr=MPI_Comm_size(comm,&commSize); int m_loc_fst = m/commSize; int m_loc; if( myid == commSize-1 && ( m_loc_fst*commSize != m ) ) m_loc = m-m_loc_fst*( commSize-1 ); else m_loc = m_loc_fst; int fst_row= myid*m_loc_fst; nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // allocation des tableaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (double*) malloc(sizeof(double)*nz_loc); int fst_nnz = AA.lg[fst_row]; for(int ii=0; ii < nz_loc; ii++){ a_loc[ii] = AA.a[fst_nnz+ii]; jcn_loc[ii] = AA.cl[fst_nnz+ii]; // jcn=AA.cl a ete augmenter de 1 avant => pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = a_loc; } /* Call the MUMPS package. */ // Factorisation id.job=2; dmumps_c(&id); } } if( id.ICNTL(18) == 3 ) { // indices et colonnes de la matrice // // Cas Matrice parallele :: // // ======================== // // // Cas stockage Morse parallele // m_loc = AA.m_loc; // Nombre de lignes prise en compte // nz_loc = AA.nbcoef_loc; // Nombre de coefficients non nulles // // indice des colonnes // jcn_loc = AA.cl_loc; // indices des colonnes dans la matrice locale // // if( !(irn_loc = (int*) malloc(sizeof(int)*nz_loc)) ){ // printf("problem allocation jcn "); // exit(1); // } // assert(AA.lg_loc[nrow_loc] == nz_loc); // for(int ii=0; ii< nrow_loc; ii++) // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1] = ii+1; // // a_loc=AA.a_loc; // // Pas de matrice parallele ==> utilisation astuce de SuperLU // Matrice :: distribution bloc continue de lignes :: voir SuperLU // Attention :: performance ??? // //================== // // pour un proc : // // a: AA.a[fstow] , ..., AA.a[fstrow+nz_loc-1] // // jcn: AA.cl[fstrow] , ..., AA.cl[fstrow+nz_loc-1] // // irn: AA.lg[fstrow] , ..., AA.lg[fstrow+m_loc] // //================== // // apres reception : // // irn_reel: // // int jj=0, // // do ii=0,m_loc-1 // // do ii1=irn_donnee[ii],irn_donnee[ii+1]-1 // // irn_reel[jj] = fst_row+ii+1; // // jj++ // // end do // // end do // //================= cout <<"id.ICNTL(18) = 3, PAR="<< PAR << endl; if(PAR == 0){ // if(myid != 0) { // int commSize; // ierr=MPI_Comm_size(comm,&commSize); // commSize=commSize-1; // int myidpar=myid-1; // int m_loc_fst; // m_loc_fst= m/commSize; // int m_loc; // if( myidpar == commSize-1 && ( m_loc_fst*commSize != m ) ) // m_loc = m-m_loc_fst*( commSize-1 ); // else // m_loc = m_loc_fst; // int fst_row; // fst_row= myidpar*m_loc_fst; // nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // // allocation des tableaux // irn_loc = (int*) malloc(sizeof(int)*nz_loc); // jcn_loc = (int*) malloc(sizeof(int)*nz_loc); // a_loc = (double*) malloc(sizeof(double)* nz_loc); // int fst_nnz; // fst_nnz = AA.lg[fst_row]; // for(int ii=0; ii < nz_loc; ii++){ // a_loc[ii] = AA.a[fst_nnz+ii]; // jcn_loc[ii] = AA.cl[fst_nnz+ii]+1; // } // for(int ii=fst_row; ii< fst_row+m_loc; ii++){ // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1-fst_nnz] = ii+1; // } // id.nz_loc = nz_loc; // id.irn_loc = irn_loc; // id.jcn_loc = jcn_loc; // id.a_loc = a_loc; // } // definition de variables int commSize; int m_loc_fst; int m_loc; int fst_row; int *nz_loc_procs; int *fst_nz_procs; int *m_loc_procs; int *fst_row_procs; double *tab_a; int *tab_cl; int *tab_lg; int *tab_lg_loc; MPI_Comm_size(comm,&commSize); if( myid !=0){ int commSizemm; int myidpar=myid-1; commSizemm = commSize-1; m_loc_fst= m/commSizemm; if( myidpar == commSizemm-1 && ( m_loc_fst*commSizemm != m ) ) m_loc = m-m_loc_fst*( commSizemm-1 ); else m_loc = m_loc_fst; if(verbosity > 5){ fst_row = myidpar*m_loc_fst; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } } if( myid ==0){ int commSizemm; commSizemm = commSize-1; m_loc_fst= m/commSizemm; fst_row_procs = (int* ) malloc( commSize*sizeof(int) ); m_loc_procs = (int* ) malloc( commSize*sizeof(int) ); fst_nz_procs = (int* ) malloc( commSize*sizeof(int) ); nz_loc_procs = (int* ) malloc ( commSize*sizeof(int) ); fst_row_procs [0] = 0; m_loc_procs [0] = 0; for( int ii= 1; ii 5){ cout << "after scatter " << myid << endl; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } // allocation des tableaux locaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (double*) malloc(sizeof(double)*nz_loc); tab_lg_loc = (int*) malloc(sizeof(int)*(m_loc) ); MPI_Scatterv( tab_a, nz_loc_procs, fst_nz_procs, MPI_DOUBLE, a_loc, nz_loc, MPI_DOUBLE, 0, comm); MPI_Scatterv( tab_cl, nz_loc_procs, fst_nz_procs, MPI_INT, jcn_loc, nz_loc, MPI_INT, 0, comm); MPI_Scatterv( tab_lg, m_loc_procs, fst_row_procs, MPI_INT, tab_lg_loc, m_loc, MPI_INT, 0, comm); int jj=0; for(int ii=0; ii &AA,KN_ &x,const KN_ &b) const { long int starttime,finishtime; long int timeused; ///////////////////////////// double *rhs; int job; if(verbosity) starttime = clock(); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // indices des colonnes commence par 1 avec mumps // et 0 dans freefem ==> renumerotation if(jcn != NULL) for(int ii=0; ii renumerotation if(jcn != NULL) for(int ii=0; ii1){ /* information given by mumps*/ int Rinfo=20; int Sinfo=40; // in Freefem++ we give only global information if(myid == 0){ printf("Global Output Information of MUMPS: RINFOG and INFOG \n"); printf("============= After Solving ==================\n"); for(int ii=0; ii< Rinfo; ii++) printf( "RINFOG[%d]= %f \n", ii, id.RINFOG(ii+1) ); printf("=====================================================\n"); for(int ii=0; ii< Sinfo; ii++) printf( "INFOG[%d]= %d \n", ii, id.INFOG(ii+1) ); printf("=====================================================\n"); } } if( verbosity ){ if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "MUMPS : time solve step :: " << timeused << " ms, Mem usage " << id.INFOG(16) << "Mb \n"; printf("=====================================================\n"); } } } ~dSolveMUMPSmpi() { if(verbosity>10) cout << "~SolveMUMPS S:" << endl; id.job=JOB_END; dmumps_c(&id); /* Terminate instance */ if( irn != NULL){ free(irn); irn=NULL; } /* free(jcn_loc); free(irn_loc); free(a_loc); */ } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; static mumps_double_complex *mumps_dc(Complex *p) { return (mumps_double_complex *) (void *) p;} static Complex *inv_mumps_dc(mumps_double_complex *p) { return (Complex *) (void *) p;} class zSolveMUMPSmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 mutable MPI_Comm comm; Complex *a; int *irn, *jcn; int n, m, nz; // parameter MUMPS KN perm_r; /* row permutations from partial pivoting */ KN perm_c; KN scale_r; KN scale_c; string string_option; string data_option; int SYM; int PAR; int myid; // distribuer int nz_loc; int *jcn_loc, *irn_loc; Complex *a_loc; static const int JOB_INIT=-1; static const int JOB_END=-2; static const int USE_COMM_WORLD= -987654; // variable complex mutable ZMUMPS_STRUC_C id; /* variable d'informations */ #define ICNTL(I) icntl[(I)-1] /* macro s.t. indices match documentation */ #define CNTL(I) cntl[(I)-1] /* macro s.t. indices match documentation */ #define RINFOG(I) rinfog[(I)-1] /* macro s.t. indices match documentation */ #define INFOG(I) infog[(I)-1] /* macro s.t. indices match documentation */ public: zSolveMUMPSmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string param_string, string datafile, KN ¶m_int, KN ¶m_double, KN &pperm_r, KN_ &pperm_c, KN &pscale_r,KN &pscale_c, MPI_Comm * mpicommw) : eps(epsilon),epsr(0), tgv(ttgv), string_option(param_string), data_option(datafile), perm_r(pperm_r), perm_c(pperm_c), tol_pivot_sym(pivot_sym),tol_pivot(pivot), scale_r(pscale_r), scale_c(pscale_c) { long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); int dataint[40]; double datadouble[15]; int ierr; if(mpicommw==0){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; /* ------------------------------------------------------------ INITIALIZE THE MUMPS PROCESS GRID. ------------------------------------------------------------*/ ierr = MPI_Comm_rank(comm, &myid); if( myid ==0){ n = AA.n; m = AA.m; nz = AA.nbcoef; MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } else{ MPI_Bcast( &n, 1, MPI_INT, 0, comm ); MPI_Bcast( &m, 1, MPI_INT, 0, comm ); MPI_Bcast( &nz, 1, MPI_INT, 0, comm ); } if( !(param_int==NULL) ) assert( param_int.N() == 42); if( !(param_double==NULL) ) assert( param_double.N() == 15); if(pperm_r) assert( perm_r.N() == n); if(pscale_r) assert( scale_r.N() == n+m ); if(pscale_c) assert( scale_c.N() == n+m ); if( n != m ) cerr << "only square matrix are supported by MUMPS" << endl; /* ------------------------------------------------------------ INITIALIZE THE MUMPS PROCESS GRID. ------------------------------------------------------------*/ // initialisation par defaut SYM=0; PAR=1; // if(!string_option.empty()) // { // read_options_freefem(&string_option,&SYM,&PAR); // } if( !(param_int==NULL) ){ SYM = param_int[0]; PAR = param_int[1]; } else if(!data_option.empty()) { if(myid==0){ char * retfile= new char[data_option.size()+1]; strcpy(retfile, (&data_option)->c_str()); printf("read data from file %s\n", retfile); FILE *pFile=fopen(retfile,"rt"); int i_data=0; int d_data=0.; char data[256]; char *tictac; fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); SYM = atoi(tictac); fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); PAR = atoi(tictac); while( !feof(pFile) && i_data < 40){ fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); dataint[i_data] = (int)atol(tictac); i_data++; } assert(i_data == 40); while( !feof(pFile) && d_data < 15){ fgets(data,256,pFile); tictac = strtok(data," /!#\t\n"); datadouble[d_data] = (double)atof(tictac); d_data++; } assert(d_data == 15); fclose(pFile); delete [] retfile; MPI_Bcast( &SYM, 1, MPI_INT, 0, comm ); MPI_Bcast( &PAR, 1, MPI_INT, 0, comm ); MPI_Bcast( dataint, 40, MPI_INT, 0, comm ); MPI_Bcast( datadouble, 15, MPI_DOUBLE, 0, comm ); fclose(pFile); delete [] retfile; } else{ MPI_Bcast( &SYM, 1, MPI_INT, 0, comm ); MPI_Bcast( &PAR, 1, MPI_INT, 0, comm ); MPI_Bcast( dataint, 40, MPI_INT, 0, comm ); MPI_Bcast( datadouble, 15, MPI_DOUBLE, 0, comm ); } } /* Initialize a MUMPS instance. Use comm */ id.job=JOB_INIT; id.par=PAR; id.sym=SYM; id.comm_fortran=(MUMPS_INT) MPI_Comm_c2f(comm); zmumps_c(&id); /* set parameter of mumps */ if( !(param_int==NULL) || !(param_double==NULL) ){ if(!data_option.empty()){ printf("read option before with the file %s\n",data_option.c_str()); exit(1); } if( !(param_int==NULL) ){ for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = param_int[ii+2]; } else // parameter by default id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; if( !(param_double==NULL) ) for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = param_double[ii]; } else if(!data_option.empty()){ for(int ii=0; ii<40; ii++) id.ICNTL(ii+1) = dataint[ii]; for(int ii=0; ii<15; ii++) id.CNTL(ii+1) = datadouble[ii]; } else{ // parameter by default id.ICNTL(1)=-1; id.ICNTL(2)=-1; id.ICNTL(3)=-1; id.ICNTL(4)=0; } // uniquement donner au host if(myid==0){ if( !(perm_r==NULL) && id.ICNTL(7)==1){ for(int ii=0; ii pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = mumps_dc(a_loc); } } if(PAR == 1){ int commSize; ierr=MPI_Comm_size(comm,&commSize); int m_loc_fst = m/commSize; int m_loc; if( myid == commSize-1 && ( m_loc_fst*commSize != m ) ) m_loc = m-m_loc_fst*( commSize-1 ); else m_loc = m_loc_fst; int fst_row= myid*m_loc_fst; nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // allocation des tableaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (Complex*) malloc(sizeof(Complex)*nz_loc); int fst_nnz = AA.lg[fst_row]; for(int ii=0; ii < nz_loc; ii++){ a_loc[ii] = AA.a[fst_nnz+ii]; jcn_loc[ii] = AA.cl[fst_nnz+ii]; // jcn=AA.cl a ete augmenter de 1 avant => pas ajouter 1 } for(int ii=fst_row; ii< fst_row+m_loc; ii++){ for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) irn_loc[ii1-fst_nnz] = ii+1; } id.nz_loc = nz_loc; id.irn_loc = irn_loc; id.jcn_loc = jcn_loc; id.a_loc = mumps_dc(a_loc); } /* Call the MUMPS package. */ // Factorisation id.job=2; zmumps_c(&id); } } if( id.ICNTL(18) == 3 ) { // indices et colonnes de la matrice // // Cas Matrice parallele :: // // ======================== // // // Cas stockage Morse parallele // m_loc = AA.m_loc; // Nombre de lignes prise en compte // nz_loc = AA.nbcoef_loc; // Nombre de coefficients non nulles // // indice des colonnes // jcn_loc = AA.cl_loc; // indices des colonnes dans la matrice locale // // if( !(irn_loc = (int*) malloc(sizeof(int)*nz_loc)) ){ // printf("problem allocation jcn "); // exit(1); // } // assert(AA.lg_loc[nrow_loc] == nz_loc); // for(int ii=0; ii< nrow_loc; ii++) // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1] = ii+1; // // a_loc=AA.a_loc; // // Pas de matrice parallele ==> utilisation astuce de SuperLU // Matrice :: distribution bloc continue de lignes :: voir SuperLU // Attention :: performance ??? cout <<"id.ICNTL(18) = 3, PAR="<< PAR << endl; if(PAR == 0){ // if(myid !=0) { // int commSize; // ierr=MPI_Comm_size(comm,&commSize); // commSize=commSize-1; // int myidpar=myid-1; // int m_loc_fst; // m_loc_fst= m/commSize; // int m_loc; // if( myidpar == commSize-1 && ( m_loc_fst*commSize != m ) ) // m_loc = m-m_loc_fst*( commSize-1 ); // else // m_loc = m_loc_fst; // // int fst_row; // fst_row= myidpar*m_loc_fst; // nz_loc = AA.lg[fst_row+m_loc]-AA.lg[fst_row]; // // // allocation des tableaux // irn_loc = (int*) malloc(sizeof(int)*nz_loc); // jcn_loc = (int*) malloc(sizeof(int)*nz_loc); // a_loc = (Complex*) malloc(sizeof(Complex)* nz_loc); // // int fst_nnz; // fst_nnz = AA.lg[fst_row]; // for(int ii=0; ii < nz_loc; ii++){ // a_loc[ii] = AA.a[fst_nnz+ii]; // jcn_loc[ii] = AA.cl[fst_nnz+ii]+1; // } // for(int ii=fst_row; ii< fst_row+m_loc; ii++){ // for(int ii1=AA.lg[ii]; ii1 < AA.lg[ii+1]; ii1++ ) // irn_loc[ii1-fst_nnz] = ii+1; // } // id.nz_loc = nz_loc; // id.irn_loc = irn_loc; // id.jcn_loc = jcn_loc; // id.a_loc = mumps_dc(a_loc); // } // definition de variables int commSize; int m_loc_fst; int m_loc; int fst_row; int *nz_loc_procs; int *fst_nz_procs; int *m_loc_procs; int *fst_row_procs; Complex *tab_a; int *tab_cl; int *tab_lg; int *tab_lg_loc; MPI_Comm_size(comm,&commSize); if( myid !=0){ int commSizemm; int myidpar=myid-1; commSizemm = commSize-1; m_loc_fst= m/commSizemm; if( myidpar == commSizemm-1 && ( m_loc_fst*commSizemm != m ) ) m_loc = m-m_loc_fst*( commSizemm-1 ); else m_loc = m_loc_fst; if(verbosity > 5){ fst_row = myidpar*m_loc_fst; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } } if( myid ==0){ int commSizemm; commSizemm = commSize-1; m_loc_fst= m/commSizemm; fst_row_procs = (int* ) malloc( commSize*sizeof(int) ); m_loc_procs = (int* ) malloc( commSize*sizeof(int) ); fst_nz_procs = (int* ) malloc( commSize*sizeof(int) ); nz_loc_procs = (int* ) malloc ( commSize*sizeof(int) ); fst_row_procs [0] = 0; m_loc_procs [0] = 0; for( int ii= 1; ii 5){ cout << "after scatter " << myid << endl; cout << " myid = " << myid << endl; cout <<" m_loc = " << m_loc << endl; cout <<" fst_row = " << fst_row << endl; } // allocation des tableaux locaux irn_loc = (int*) malloc(sizeof(int)*nz_loc); jcn_loc = (int*) malloc(sizeof(int)*nz_loc); a_loc = (Complex*) malloc(2*sizeof(double)*nz_loc); tab_lg_loc = (int*) malloc(sizeof(int)*(m_loc) ); MPI_Scatterv( tab_a, nz_loc_procs, fst_nz_procs, MPI_DOUBLE_COMPLEX, a_loc, nz_loc, MPI_DOUBLE_COMPLEX, 0, comm); MPI_Scatterv( tab_cl, nz_loc_procs, fst_nz_procs, MPI_INT, jcn_loc, nz_loc, MPI_INT, 0, comm); MPI_Scatterv( tab_lg, m_loc_procs, fst_row_procs, MPI_INT, tab_lg_loc, m_loc, MPI_INT, 0, comm); int jj=0; for(int ii=0; ii renumerotation if( jcn != NULL ) for(int ii=0; ii1){ /* information given by mumps*/ int Rinfo=20; int Sinfo=40; // in Freefem++ we give only global information if(myid == 0){ printf("Global Output Information of MUMPS: RINFOG and INFOG \n"); printf("============= After Factorisation ==================\n"); for(int ii=0; ii< Rinfo; ii++) printf( "RINFOG[%d]= %f \n", ii, id.RINFOG(ii+1) ); printf("=====================================================\n"); for(int ii=0; ii< Sinfo; ii++) printf( "INFOG[%d]= %d \n", ii, id.INFOG(ii+1) ); printf("=====================================================\n"); } } if( verbosity){ if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << "MUMPS : time factorisation :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { long int starttime,finishtime; long int timeused; //*******************************************************************// // depend pas de la forme de la matrice: distribuer ou assembler Complex *rhs; int job; if(verbosity) starttime = clock(); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; // indices des colonnes commence par 1 avec mumps // et 0 dans freefem ==> renumerotation if(jcn != NULL) for(int ii=0; ii renumerotation if(jcn != NULL) for(int ii=0; ii 1){ /* information given by mumps*/ int Rinfo=20; int Sinfo=40; // in Freefem++ we give only global information if(myid == 0){ printf("Global Output Information of MUMPS: RINFOG and INFOG \n"); printf("============= After Solving ==================\n"); for(int ii=0; ii< Rinfo; ii++) printf( "RINFOG[%d]= %f \n", ii, id.RINFOG(ii+1) ); printf("=====================================================\n"); for(int ii=0; ii< Sinfo; ii++) printf( "INFOG[%d]= %d \n", ii, id.INFOG(ii+1) ); printf("=====================================================\n"); } } if(verbosity) if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " MUMPS : time solve :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverMUMPSmpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverMUMPS" << endl; return new dSolveMUMPSmpi(*A,ds.strategy, ds.tgv, ds.epsilon, ds.tol_pivot, ds.tol_pivot_sym, ds.sparams, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c, ds.scale_r, ds.scale_c,(MPI_Comm *)ds.commworld); } MatriceMorse::VirtualSolver * BuildSolverMUMPSmpi(DCL_ARG_SPARSE_SOLVER(Complex,A)) { if(verbosity>9) cout << " BuildSolverMUMPS" << endl; return new zSolveMUMPSmpi(*A,ds.strategy, ds.tgv, ds.epsilon, ds.tol_pivot, ds.tol_pivot_sym, ds.sparams, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c, ds.scale_r, ds.scale_c,(MPI_Comm *)ds.commworld); } /* class Init { public: Init(); };*/ // the 2 default sparse solver double and complex static DefSparseSolver::SparseMatSolver SparseMatSolver_R ; static DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver static TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; } bool SetMUMPSmpi() { if(verbosity) cout << " SetDefault sparse solver to MUMPSmpi" << endl; DefSparseSolver::solver =BuildSolverMUMPSmpi; DefSparseSolver::solver =BuildSolverMUMPSmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; } //LOADINIT(Init); static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: MUMPS , defaultsolver defaultsolverMUMPS " << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverMUMPSmpi; DefSparseSolver::solver =BuildSolverMUMPSmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoMUMPS","(",new OneOperator0(SetMUMPSmpi)); } void ffinit() { SparseMatSolver_R= DefSparseSolver::solver; SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: MUMPS , defaultsolver defaultsolverMUMPS " << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverMUMPSmpi; DefSparseSolver::solver =BuildSolverMUMPSmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttoMUMPS","(",new OneOperator0(SetMUMPSmpi)); } #include "InitFunct.hpp" addingInitFunct FFinit(100,ffinit,"MUMPS_FreeFem"); LOADFUNC(Load_Init); freefem++-3.38-1/examples++-mpi/NSCaraCyl.edp000644 000767 000024 00000022014 12500257464 020610 0ustar00hechtstaff000000 000000 // NBPROC 4 // PARAM -cas 2 -n 20 -ndt 50 // usage : // ff-mpirun -np 8 NSNewtonCyl-100-mpi.edp -cas 2 -n 20 -ndt 50 /* args can are: -ns no output of script -cas 1|2|3 case of benchmark or Reynorl integer) -n nbseg nb of seg on input edge .. -ndt ndt nb time step par period -nNewton nNx number of of iteration in Newtow loop. -gp gnuplot .. -T final time */ // Author: F. Hecht .. // jan 2012 Stationnary imcompressible Navier Stokes Equation with Newton method. // a round a 2d Cylinder // Benchmark // http://www.mathematik.tu-dortmund.de/lsiii/cms/papers/SchaeferTurek1996.pdf // // Thank to Macarena Gómez Mármol // need version 3.20-2 **** for pipe pluging // otherwise remove line with pgnuplot // corresponding to gnuplot visualization // -------------------------------------------------- include "getARGV.idp" load "MUMPS" load "shell" load "scotch" load "pipe" int cas = getARGV("-cas",2);; // 1, 2 or 3 .. int n=getARGV("-n",15); // mesh size ... int ndt=getARGV("-ndt",25); int schema = 2; // order 1 bool gplt = usedARGV("-gp")>=0 && (mpirank==0) && (cas!=1) ; // real Tend = getARGV("-T",2);; bool save=0; real cpu0=mpiWtime() ; string data="./dd";//"2D-"+cas+"-"+n; if(mpirank==0) mkdir(data); string fgnup =data+"/fld2-"+cas+".gp"; string fdata = data+"/sol-cas-"; string fTh = data+"/Th-"+cas+".msh"; pstream pgnuplot( gplt ? "gnuplot": "cat" ); // parameter ... real D=0.1; real H=0.41; int ncurl=20; real[int] colorhsv=[ // color hsv model 3./6., 1 , 0.5, // dark cyan 3./6., 1 , 1, // cyan 4./6., 1 , 1, // blue 5./6., 1 , 1, // magenta 1, 1. , 1, // red 1, 0.5 , 1 // light red ]; real[int] vcurl( ncurl*2+1); { int n = vcurl.n; real d = 100; real c = 1.3 ; real ccc=0,cc = d/(1- c^(ncurl+1))/ (1-c) ; vcurl[ncurl]=0; for( int i =1 ; i <= ncurl;++i) { ccc += cc; cc *= c ; // cout << i << " " << ncurl-i << " " << ncurl+i << endl; vcurl[ncurl-i] = -ccc; vcurl[ncurl+i] = ccc; } cout << vcurl << endl; } real cx0 = 0.2, cy0 = 0.2; // center of cyl. real xa = 0.15, ya=0.2, xe = 0.25,ye =0.2;// point for pressure.. //Definición del dominio border fr1(t=0,2.2){x=t; y=0; label=1;} border fr2(t=0,H){x=2.2; y=t; label=2;} border fr3(t=2.2,0){x=t; y=H; label=1;} border fr4(t=H,0){x=0; y=t; label=1;} border fr5(t=2*pi,0){x=cx0+D*sin(t)/2; y=cy0+D*cos(t)/2; label=3;} //plot(fr1(n)+fr2(n)+fr3(n)+fr4(n)+fr5(n)); mesh Th; if(mpirank==0) { Th=buildmesh(fr1(5*n)+fr2(n)+fr3(5*n)+fr4(n)+fr5(-n*3)); int[int] nupart(Th.nt); nupart=0; if(mpisize>1) scotch(nupart, Th, mpisize); Th=change(Th,fregion= nupart[nuTriangle]); savemesh(Th,fTh); plot(Th,wait=0); } broadcast(processor(0),Th); // partition of the mesh ... // for computation of the Strouhal number include "func-max.idp" real hsize = D*pi/n; // size of the mesh ???? // bounding box for the plot func bb=[[0,H/4],[H*2,3*H/4]]; // operator macro Grad(u1,u2) [ dx(u1),dy(u1), dx(u2),dy(u2)]// macro Eps(u1,u2) [ dx(u1),(dy(u1)+dx(u2))*0.5,(dy(u1)+dx(u2))*0.5,dy(u2)]// macro UgradV(u1,u2,v1,v2) [ [u1,u2]'*[dx(v1),dy(v1)] , [u1,u2]'*[dx(v2),dy(v2)] ]// macro div(u1,u2) (dx(u1)+dy(u2))// // FE Space fespace Xh(Th,P2);fespace Mh(Th,P1); fespace Wh(Th,[P2,P2,P1]); fespace Rh(Th,P1dc); Wh [u1,u2,p]; Wh [up1,up2,pp]; Wh [upp1,upp2,ppp]; Wh [vx1,vx2,vxp]; Wh [vy1,vy2,vyp]; varf von3x([u1,u2,p],[v1,v2,q]) = on(3 ,u1= 1); varf von3y([u1,u2,p],[v1,v2,q]) = on(3 ,u2= 1); vx1[]= von3x(0,Wh,tgv=1); vy1[]= von3y(0,Wh,tgv=1); real coefv =1, vtheta=0; real Um= 1.5;// max volicite case 2,3 (Rey 100) if( cas>3) { Um = cas*1.5/100.; cas =2; } func Ub = Um*2./3.; real nu = 1e-3; real mu = 2*nu; // Formulation in Eps : Eps func Rey = Ub*D/nu; func ccdrag = 2./ square(Ub) /D ; func ccfreq = D/Ub; real freq = 0.3/ccfreq; // frequence theorique // initial guess.. u1[]=0; real T=0; // current time // velocity BC .. func coefV = (cas<3)? 1 : sin(pi*min(T/8.,1.)); func U1 = 4.*Um*y*(H-y)/(H*H) * coefv ; func U2 = 0 ; // stop test for Newton real eps=1e-8*Um; // choise of time step .. int mdt = rint(Tend*freq*ndt); real dt = Tend/mdt;// ntd pas de temps pas periode real CFL = Um*dt/hsize; if(mpirank==0) cout << " dt =" << dt << " CFL = " << CFL << endl; verbosity=0; // BDF2 schema order 2 in time ... real[int] beta=[1.5, -2., +0.5]; if(schema ==1) beta=[1,-1,0]; // Euler implicit + ruse OP real[int] ab=1./dt*beta ; if(cas ==1) { // static case Um = 0.3; Tend=0; ab=0; // no time .. } // init.. int iter=0; if(mpirank==0) { ofstream f(fgnup);// clean the file .. } varf GStokesl([du1,du2,dp],[v1,v2,q]) = int2d(Th,mpirank) ( ab[0]*[du1,du2]'*[v1,v2] + mu*(Eps(du1,du2)'*Eps(v1,v2) ) - div(du1,du2)*q - div(v1,v2)*dp - 1e-8*dp*q // stabilization term ) + on(1,3,du1=0,du2=0) + on(2,du2=0) ; varf GStokesl0([du1,du2,dp],[v1,v2,q]) = int2d(Th,mpirank) ( ab[0]*[du1,du2]'*[v1,v2] + mu*(Eps(du1,du2)'*Eps(v1,v2) ) - div(du1,du2)*q - div(v1,v2)*dp - 1e-8*dp*q // stabilization term ) ; varf Vconvect([du1,du2,dp],[v1,v2,q]) = -int2d(Th,mpirank) ( ab[1]* ( [v1,v2]'* [ convect([u1,u2],-dt,up1), convect([u1,u2],-dt,up2) ] ) + ab[2]* ( [v1,v2]'* [ convect([u1,u2],-dt*2,upp1), convect([u1,u2],-dt*2,upp2) ] ) ); varf Vconvect1([du1,du2,dp],[v1,v2,q]) = -int2d(Th,mpirank) ( ab[1]* ( [v1,v2]'* [ convect([u1,u2],-dt,up1), convect([u1,u2],-dt,up2) ] ) ); varf VBC([u1,u2,p],[v1,v2,q]) = on(1,u1=U1,u2=U2); real[int] bcl=VBC(0,Wh); real[int] bl(Wh.ndof),b(Wh.ndof),bcv(Wh.ndof); matrix A,A0; A=GStokesl(Wh,Wh,solver=GMRES); //sparsesolver,master=-1); //mpiAllReduce(Al,A,mpiCommWorld,mpiSUM); A0=GStokesl0(Wh,Wh,solver=GMRES); //mpiAllReduce(A0,A,mpiCommWorld,mpiSUM); set(A,solver=sparsesolver,master=-1); Wh [w1,w2,wp]; // loop in time if need .. cout << "Stort\n"; real CPU0=mpiWtime(); while(1) { real err=0; T += dt; iter++; real co = coefv; coefv = coefV;// coef in velocty .. if( co != coefv ) bcl=VBC(0,Wh); upp1[]=up1[]; up1[]=u1[]; if(schema>1) { u1[] *=2; u1[] -= upp1[]; } if( ab[2]) bcv = Vconvect(0,Wh); else bcv = Vconvect1(0,Wh); bl = bcv; bl += bcl; { //mpiAllReduce(bl,b,mpiCommWorld,mpiSUM); w1[]=A^-1*bl; u1[] = w1[]; if(mpirank==0) cout << T << "\t " << n << " rey =" << Rey << " U1 max = " << u1[].max <<" " ; } //if( schema==1) //{ u1[] *= 2; u1[] -= up1[]; } if(cas==1) { plot([u1,u2],p, coef = 0.02/u1[].max, bb=bb,wait=1, cmm=" cas 1 "); } b = A0*w1[]; b += bcv; real cdrag = -(b'*vx1[]) ; real clift = b'*vy1[] ; real drag,lift,Cd,Cl,Ta; mpiAllReduce(clift,lift,mpiCommWorld,mpiSUM); mpiAllReduce(cdrag,drag,mpiCommWorld,mpiSUM); if ( iter > 2) { Cd = ccdrag*drag; Cl = ccdrag*lift; } // end of compute the Drag and lift Coef Ta = T/ccfreq; // The adimensional time .. real Deltap = p(xa,ya) - p(xe,ye) ; // the Deltap real strouhal = AddStrouhal(iter,Ta,Cl); AddMaxO2(Cd,iter,mxdrag,mxdragi); AddMaxO2(Cl,iter,mxlift,mxlifti); real Cdx = mxdrag.max, Clx = mxlift.max; if(mpirank==0) { { ofstream f(fgnup,append); f << T << " " << drag << " " << lift << " " << Ta << " " << Cd << " " << Cl << " " << Deltap <<" " << mpiWtime()-cpu0 << " " << iter << " " << strouhal << endl; } real Td = max((int(Ta)-20),0); // period = 3 en Ta if(cas==3) Td=0; if(gplt) { pgnuplot << "set title \"Rey = " +Rey + ", Strouhal= "+strouhal+", T = " + T + ", cas = " + cas << ", Cara CFL : "+CFL+"\";\n"; pgnuplot << "plot ["+Td+":] \""+fgnup+"\" u 4:5 w l t \"Cd\", \""+fgnup +"\" u 4:6 w l t \"Cl\","+Cdx+", "+ Clx << endl; flush(pgnuplot); } } // plot curl of the flow preetty ... Rh curlu = -dy(u1)+ dx(u2); plot(curlu,viso=vcurl, fill=1,hsv=colorhsv, // bb=bb, coef=0.01/Um,cmm = " T = " + T+" / "+Tend+" s + "); upp1[] = up1[] -u1[]; upp2[] = up2[] -u2[]; real CPU = mpiWtime()-CPU0; CPU0=mpiWtime(); real errt = upp1[].linfty + upp2[].linfty; if(mpirank==0) cout << " errt = " << errt<< " T = " << T << " Strouhal " << strouhal <<" Cdx= " << Cdx<< " Clx = " << Clx << " " << CPU << "s" <Tend*1.0000001) break; // stop after final time .. } freefem++-3.38-1/examples++-mpi/NSI3d-carac-mumps.edp000644 000767 000024 00000011152 11745333166 022124 0ustar00hechtstaff000000 000000 load "msh3" load "MUMPS_FreeFem" //////////////////// // parameters real ttgv=1e30; string ssparams="nprow=1, npcol="+mpisize; //////////////////// real nu=0.01,dt=0.3; real alpha=1./dt,alpha2=sqrt(alpha); int nn=10; mesh Th2=square(nn,nn); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], // region=r1, labelmid=rmid, reffaceup = rup, reffacelow = rdown); fespace VVh(Th,[P23d,P23d,P23d,P13d]); fespace Vh(Th,P23d); fespace Ph(Th,P13d); macro Grad(u) [dx(u),dy(u),dz(u)]// EOM macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM cout << "initilisation" << endl; real t1,t2,t3,t4; t1=clock(); varf vStokes([u1,u2,u3,p],[v1,v2,v3,q]) = int3d(Th,qforder=3)( Grad(u1)'*Grad(v1) + Grad(u2)'*Grad(v2) + Grad(u3)'*Grad(v3) //' for emacs - div(u1,u2,u3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,u1=1.,u2=0,u3=0) + on(1,u1=0,u2=0,u3=0) ; matrix A=vStokes( VVh, VVh, tgv=ttgv, sparams=ssparams ); t1=clock()-t1; t4=clock(); set(A,solver=sparsesolver, sparams=ssparams ); t4=clock()-t4; t2=clock(); real[int] b= vStokes(0,VVh); t2=clock()-t2; VVh [u1,u2,u3,p]; VVh [X1,X2,X3,Xp]; VVh [x1,x2,x3,xp]=[x,y,z,0]; t3=clock(); u1[]= A^-1 * b; t3=clock()-t3; ux= u1(x,0.5,y); uz= u3(x,0.5,y); p2= p(x,0.5,y); plot([ux,uz],p2,cmm=" cut y = 0.5",wait=1); macro XX1() (x-u1*dt)// macro XX2() (y-u2*dt)// macro XX3() (z-u3*dt)// varf vNS([uu1,uu2,uu3,p],[v1,v2,v3,q]) = int3d(Th)( alpha*(uu1*v1+uu2*v2+uu3*v3) + nu*(Grad(uu1)'*Grad(v1) + Grad(uu2)'*Grad(v2) + Grad(uu3)'*Grad(v3)) //' for emacs - div(uu1,uu2,uu3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,uu1=1,uu2=0,uu3=0) + on(1,uu1=0,uu2=0,uu3=0) + int3d(Th,optimize=1,qforder=4)( alpha*( convect([u1,u2,u3],-dt,u1)*v1 + convect([u1,u2,u3],-dt,u2)*v2 + convect([u1,u2,u3],-dt,u3)*v3 ) ) ; // + int3d(Th,optimize=1)( alpha*( u1(X1,X2,X3)*v1 + u2(X1,X2,X3)*v2 + u3(X1,X2,X3)*v3 ) ) ; // + int3d(Th,optimize=1)( alpha*( u1(XX1,XX2,XX3)*v1 + u2(XX1,XX2,XX3)*v2 + u3(XX1,XX2,XX3)*v3 ) ) ; //+ int3d(Th,optimize=1)( alpha*( u1(x,y,z)*v1 + u2(x,y,z)*v2 + u3(x,y,z)*v3 ) ) ; //+ int3d(Th,optimize=1)( alpha*( u1*v1 + u2*v2 + u3*v3 ) ) ; real time1,time2=0.,time3=0.,time4,time5; time1=clock(); A = vNS( VVh, VVh, tgv=ttgv, sparams=ssparams); time1=clock()-time1; time5=clock(); set(A,solver=sparsesolver,sparams=ssparams); time5=clock()-time5; time4=clock(); real t=0; int nbtemps=5; for(int i=0;i #include using namespace std; #define MCW MPI_COMM_WORLD #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" /* Explain here what foobar does */ #ifdef __cplusplus extern "C" { #endif #include "psparslib.h" #include "generaldefs.h" #ifdef __cplusplus } #endif extern "C" { // ALH - 24/7/13 - we need to include metis/defs.h explicitely // because pARMS also contains an include file called defs.h and // both include directories are specified on the command line to // compile this file. Without this only one defs.h would be // included, the one from the first package specified above on the // line [[LIBRARY-dep]] typedef int SCOTCH_Num ; // #include "../download/include/metis/defs.h" #include "metis.h" } #ifdef _WIN32 // ALH - this activates the Windows DLL default export mechanism __declspec(dllexport) int not_used; // ALH - 24/7/13 - instanciate some global symbols which are not found by default in MS MPI Fortran libraries MPI_Fint* _imp__MPI_F_STATUS_IGNORE; MPI_Fint* _imp__MPI_F_STATUSES_IGNORE; #endif #include #include #include #define BUFLEN 100 #define NORHS 0 #define BUFLEN 100 //This functions come from pARMS package and consist to scale matrix class parm_param { public: mutable PrePar prepar; mutable IterPar ipar; mutable int sol_type; mutable int iov,scale, unsymm,method; mutable int solver; mutable int VERBOSE; public: parm_param(){ PARMS_malloc(prepar,1,_PrePar); PARMS_malloc(ipar,1,_IterPar); /*---------------------------------------------------------------------- * * This function sets some default parameters just to get started with * * pARMS. There are two arrays which define the parameters in pARMS. * * Because ther\ e are so many methods, the number of parameters may seem * * overwhelming.. However\ , not all are used. For example when add_ilut * * is used only two parameters are r\ equired which are the drop * * tolerance and the max fill per row.. This function s\ ets everything * * so that all the methods can be safely tested. YS - * * * *------------------------------------------------------------------------*/ int i; /*------------------------------------------------------------------------*/ for (i=1; i<18; i++) ipar->ipar[i] = 0; /* parameters to be set for the solver -- not all of these are used -- depending on the method selected - */ /* parameters associated with various accelerators (inner/outer) */ ipar->ipar[0] = 3; /* nlev in arms when used */ ipar->ipar[1] = 20; /* block size in arms when used */ ipar->ipar[5] = 30; /* Outer iteration Krylov subs. dimension */ ipar->ipar[6] = 200; /* Max. outer iterations */ ipar->ipar[3] = 3; /* Inner iteration Krylov subs. dimension */ ipar->ipar[4] = 3; /* Max. inner iterations */ ipar->pgfpar[0] = 0.01; /* tolerance for inner iteration when used */ ipar->pgfpar[1] = 1.e-10;/* tolerance for outer iteration */ /* preconditioning parameters */ prepar->tolind = 0.1; /* tolerance used for diag dom. filtration alg.*/ prepar->lfil[0] = 20; /* lfil0 (ilut, iluk, and arms) */ prepar->lfil[4] = 20; /* lfil for Schur complement const. */ prepar->lfil[5] = 20; /* lfil for Schur complement const. */ prepar->droptol[0]=.001; /* droptol0 (ilut, iluk, and arms) */ prepar->droptol[4]=.001; /* droptol for Schur complement const. */ prepar->droptol[5]=.001; /* droptol for Schur complement const. */ prepar->mc = 1; /* multicoloring or not in ILU when used */ //Integer parameter iov=0; scale=1; unsymm=1; method= 2; VERBOSE=0; /*no statistic infos has print*/ /*VERBOSE=1 Only informations on convergence will be print*/ /*VERBOSE=2 Only informations on time will be print*/ solver=0; memcpy(prepar->ipar, ipar->ipar, sizeof(int)*18); for (i=1; i<4; i++) { prepar->droptol[i] = prepar->droptol[0]; prepar->lfil[i] = prepar->lfil[0]; } prepar->lfil[6] = prepar->lfil[5]; ipar->in_iters = 0; /*-------------------- done */ } public: parm_param(const KN ¶m_int, const KN ¶m_double) { int i; PARMS_malloc(prepar,1,_PrePar); PARMS_malloc(ipar,1,_IterPar); for (i=1; i<18; i++) ipar->ipar[i] = 0; if(param_int.N()>0){if((param_int[0]<0)||(param_int[0]>2)) {printf("%s","WRONG SOLVER INDEX WE SET DEFAULT ONE \n"); solver=0; } else solver=param_int[0];}else solver=0; if(param_int.N()>1){if((param_int[1]<0)||(param_int[1]>13)) {printf("%s","WRONG INDEX FOR PRECONDITIONER, WE SET DEFAULT ONE \n"); method=2; } else if((param_int[1]>=0)||(param_int[1]<=13)) method=param_int[1];}else method=2; if(param_int.N()>2){if(param_int[2]>0) ipar->ipar[5]=param_int[2]; else ipar->ipar[5]=30;} else ipar->ipar[5]=30; /* Outer iteration Krylov subs. dimension */ if(param_int.N()>3){if(param_int[3]>0) ipar->ipar[6]=param_int[3]; else ipar->ipar[6]=1000;} else ipar->ipar[6]=1000; /* Max. outer iterations */ if((method==3)||(method==7)||(method==11)) {if(param_int.N()>4) {if(param_int[4]>0) ipar->ipar[0]=param_int[4]; else ipar->ipar[0]=3;} else ipar->ipar[0]=3; } /* nlev in arms when used */ if(param_int.N()>5){ if(param_int[5]>0) ipar->ipar[3]=param_int[5]; else ipar->ipar[3]=3;} else ipar->ipar[3]=3; /* Inner iteration Krylov subs. dimension */ if(param_int.N()>6){if(param_int[6]>0) ipar->ipar[4]=param_int[6]; else ipar->ipar[4]=3;} else ipar->ipar[4]=3; /* Max. inner iterations */ if(param_int.N()>7){if(param_int[7]>=0) unsymm=param_int[7]; else unsymm=0;} else unsymm=0; if(param_int.N()>8) {if(param_int[8]>=0) iov=param_int[8]; else iov=0;} else iov=0; if(param_int.N()>9) {if(param_int[9]>0) scale=param_int[9]; else scale=1;}else scale=1; if(param_int.N()>10){if(param_int[10]>0) ipar->ipar[1]=param_int[10]; else ipar->ipar[1]=20; }else ipar->ipar[1]=20; if(param_int.N()>11){if(param_int[11]>0) prepar->lfil[0]=param_int[11]; else prepar->lfil[0]=20;} else prepar->lfil[0]=20; /* lfil0(ilut, iluk, and arms) */ if(param_int.N()>12){if(param_int[12]>0) prepar->lfil[4]=param_int[12]; else prepar->lfil[4]=20;} else prepar->lfil[4]=20; /* lfil for Schur complement const. */ if(param_int.N()>13){if(param_int[13]>0) prepar->lfil[5]=param_int[13]; else prepar->lfil[5]=20;} else prepar->lfil[5]=20; /* lfil for Schur complement const. */ if(param_int.N()>14){if(param_int[14]>0) prepar->mc=param_int[14]; else prepar->mc=1; } else prepar->mc=1; if(param_int.N()>15){if(param_int[15]>0) ipar->in_iters=param_int[15]; else ipar->in_iters=0; } else ipar->in_iters=0; if(param_int.N()>16){if(param_int[16]>0) VERBOSE=param_int[16]; else VERBOSE=0; }else VERBOSE=0; if(param_double.N()>0){if(param_double[0]>0) ipar->pgfpar[1]=param_double[0]; else ipar->pgfpar[1]=1.e-08;} ipar->pgfpar[1]=1.e-08; /* tolerance for outer iteration */ if(param_double.N()>1){if(param_double[1]>0) ipar->pgfpar[0]=param_double[1]; else ipar->pgfpar[0]=0.01;} else ipar->pgfpar[0]=0.01; /* tolerance for inner iteration when used */ if(param_double.N()>2) {if(param_double[2]>0) prepar->tolind = param_double[2]; else prepar->tolind=0.1;} else prepar->tolind=0.1; /* tolerance used for diag dom. filtration alg.*/ if(param_double.N()>3){if(param_double[3]>0) prepar->droptol[0]=param_double[3]; else prepar->droptol[0]=.001;} else prepar->droptol[0]=.001; /* droptol0 (ilut, iluk, and arms) */ if(param_double.N()>4) {if(param_double[4]>0) prepar->droptol[4]=param_double[4]; else prepar->droptol[4]=.001;} else prepar->droptol[4]=.001; /* droptol for Schur complement const. */ if(param_double.N()>5){if(param_double[5]>0) prepar->droptol[5]=param_double[5]; else prepar->droptol[5]=.001;} else prepar->droptol[5]=.001; /* droptol for Schur complement const. */ memcpy(prepar->ipar, ipar->ipar, sizeof(int)*18); for (i=1; i<4; i++) { prepar->droptol[i] = prepar->droptol[0]; prepar->lfil[i] = prepar->lfil[0]; } prepar->lfil[6] = prepar->lfil[5]; } public: parm_param(string datafile,DistMatrix dm) { FILE *fp; char buf[BUFLEN], meth_buf[BUFLEN]; int num; PARMS_malloc(prepar,1,_PrePar); PARMS_malloc(ipar,1,_IterPar); parm_param(); char * filename=new char[datafile.length()+1]; strcpy(filename,datafile.c_str()); /* read parameters for preconditioner and iteration from file 'filename' */ /* ---- start modification by MS */ if( (fp = fopen(filename, "r")) == NULL ){ fprintf(stderr, "Cannot open file inputs\n"); PARMS_Final();exit(1); } for (num=0; num< 18; num++) ipar->ipar[num] = 0; num = 1; while(fgets(buf, BUFLEN, fp) != NULL) { switch(num) { case 1: /* solver */ sscanf(buf, "%d", &solver); if((solver!=0)&&(solver!=1)&&(solver!=2)) {printf("%s","WRONG SOLVER INDEX, WE SET DEFAULT ONE \n"); solver=0;} break; case 2: /* preconditionner */ sscanf(buf,"%s",meth_buf); method = assignprecon(meth_buf, dm); if((method<0)||(method>13)) {printf("%s","WRONG INDEX FOR PRECONDITIONER, WE SET DEFAULT ONE \n"); method=2; } break; case 3: /* im (Outer Krylov subs dim) */ sscanf(buf,"%d",&ipar->ipar[5]); break; case 4: /* im (Outer Krylov subs dim) */ sscanf(buf,"%d",&ipar->ipar[6]); break; case 5: /* outer tol */ sscanf(buf,"%lf",&ipar->pgfpar[1]); break; case 6: /* inner tol */ sscanf(buf,"%lf",&ipar->pgfpar[0]); break; case 7: /* unsym */ sscanf(buf, "%d", &unsymm); break; case 8: /* inim (inned Krylov subs dim) */ sscanf(buf, "%d", &ipar->ipar[3]); break; case 9: /* Max. inner iterations */ sscanf(buf,"%d",&ipar->ipar[4]); break; case 10: /* nlev */ sscanf(buf, "%d", &iov); break; case 11: /* scale */ sscanf(buf,"%d",&scale); break; case 12: /* For printing result */ sscanf(buf, "%d", &VERBOSE); break; case 13: /* lfil0 (ilut, iluk, and arms) */ sscanf(buf, "%d", &prepar->lfil[0]); break; case 14: /* lfil 4 (schur construction) */ sscanf(buf, "%d", &prepar->lfil[4]); break; case 15: /* lfil 5 (ILUT for Schur) */ sscanf(buf, "%d", &prepar->lfil[5]); break; case 16: /* bsize */ sscanf(buf,"%d",&ipar->ipar[1]); break; case 17: /* tolerance used for diag dom. filtration alg.*/ sscanf(buf,"%lf",&prepar->tolind); break; case 18: /*droptol (0) -- simliar to lfil0*/ sscanf(buf, "%lf", &prepar->droptol[0]); break; case 19: /*droptol (4) -- simliar to lfil4*/ sscanf(buf, "%lf", &prepar->droptol[4]); break; case 20: /*droptol (5) -- simliar to lfil5*/ sscanf(buf, "%lf", &prepar->droptol[5]); break; case 21: /* multicoloring or not */ sscanf(buf, "%d", &prepar->mc); break; default: break; } num++; } fclose(fp); memcpy(prepar->ipar, ipar->ipar, sizeof(int)*18); prepar->droptol[1] = prepar->droptol[2] = prepar->droptol[3] = prepar->droptol[0]; prepar->droptol[6] = prepar->droptol[5]; prepar->lfil[1] = prepar->lfil[2] = prepar->lfil[3] = prepar->lfil[0]; prepar->lfil[6] = prepar->lfil[5]; ipar->in_iters = 0; free(filename); } ~parm_param(){ free(prepar); free(ipar); } }; int assignprecon( char *precon_str, DistMatrix dm) { /*------------------------------------------------------------------ create preconditioner handler * precon -- preconditioning handler * add_ilu0 -- additive schwarz preconditioner with ilu0 as local preconditioner * add_ilut -- additive schwarz preconditioner with ilut as local preconditioner * add_iluk -- additive schwarz preconditioner with iluk as local preconditioner * add_arms -- additive schwarz preconditioner with arms as local preconditioner * lsch_ilu0 -- schur complement preconditioner with ilu0 as local preconditioner * lsch_ilut -- schur complement preconditioner with ilut as local preconditioner * lsch_iluk -- schur complement preconditioner with iluk as local preconditioner * lsch_arms -- schur complement preconditioner with arms as local preconditioner * sch_gilu0 -- parallel ilu0 preconditioner * sch_sgs -- Schur-Symmetric GS preconditioner *------------------------------------------------------------------*/ /* set the method label for preconditioning and parameter for inner iteration -- actual labels (int) are defined in SRC/ARMS/data.h */ int ierr, method; ierr = 0; method=0; if(!strcmp(precon_str, "add_ilu0")) method = add_ilu0; else if(!strcmp(precon_str, "add_ilut")) method = add_ilut; else if(!strcmp(precon_str, "add_iluk")) method = add_iluk; else if(!strcmp(precon_str, "add_arms")) method = add_arms; else if(!strcmp(precon_str, "lsch_ilu0")) method = lsch_ilu0; else if(!strcmp(precon_str, "lsch_ilut")) method = lsch_ilut; else if(!strcmp(precon_str, "lsch_iluk")) method = lsch_iluk; else if(!strcmp(precon_str, "lsch_arms")) method = lsch_arms; else if(!strcmp(precon_str, "rsch_ilu0")) method = rsch_ilu0; else if(!strcmp(precon_str, "rsch_ilut")) method = rsch_ilut; else if(!strcmp(precon_str, "rsch_iluk")) method = rsch_iluk; else if(!strcmp(precon_str, "rsch_arms")) method = rsch_arms; else if(!strcmp(precon_str, "sch_sgs")) method = sch_sgs; else if(!strcmp(precon_str, "sch_gilu0")) method = sch_gilu0; else ierr = 1; char pcrM[40]; strcpy(pcrM,"invalid choice for the preconditioner \n"); if (ErrHand(ierr, dm, pcrM)) exit(1) ; return method;cout << "Cette resolution semble prendre du temps" << endl; } #define minint(a, b) ( (a) < (b) ? (a) : (b) ) #define maxint(a, b) ( (a) > (b) ? (a) : (b) ) #define max(a, b) ( (a) > (b) ? (a) : (b) ) #define min(a, b) ( a < b ? (a) : (b) ) #define fabsmin(a, b) ( fabs(a) < fabs(b) ? (a) : (b) ) #define fabsmax(a, b) ( fabs(a) > fabs(b) ? (a) : (b) ) class dSolvePARMS : public MatriceMorse::VirtualSolver { char mat_domain[BUFLEN]; int *riord; mutable int n, nnz, nloc; int iov, scale, unsymm, method,solver,VERBOSE; string data_option; int rk, size; mutable double *rhs1, res; //double t1, t2, t3, t4; double *u, *v; int job,i1,i2; mutable DistMatrix dm; //distributed matrix object mutable PrePar prepar; mutable PreCon precon; //structure for preconditioner mutable IterPar ipar; //structure for iteration mutable int * maptmp1, *mapptr1; double eps, tol_pivot_sym,tgv, tol_pivot,epsr; mutable double t1,t2,t3,t4; mutable char * meth[14]; mutable int *maptmp, *mapptr,*iwork1,*iwork; mutable double *scaletmpr, *scaletmpc; mutable MPI_Comm comm; char *p; //Constructor construct the distribute matrix and also preconditionner public: dSolvePARMS(const MatriceMorse &AA,string datafile, KN ¶m_int, KN ¶m_double, MPI_Comm * mpicommw) { int n,i,job,nnz,ierr,tmp; int *ptr2,*id_rows2; double *vals2; double *AAv; int *p, *pr; int j, node; /* Initialize PARMSARSLIB environment */ if(mpicommw==NULL){ comm=MPI_COMM_WORLD; } else comm= *mpicommw; // comm=MPI_COMM_WORLD; ierr = MPI_Comm_rank(comm, &rk); ierr = MPI_Comm_size(comm, &size); parm_param * pp; /*Differents preconditionners use*/ meth[0]=(char *)malloc(sizeof(char)*9); strcpy(meth[0],"add_ilu0"); meth[1]=(char *)malloc(sizeof(char)*9); strcpy(meth[1],"add_ilut"); meth[2]=(char *)malloc(sizeof(char)*9); strcpy(meth[2],"add_iluk"); meth[3]=(char *)malloc(sizeof(char)*9); strcpy(meth[3],"add_arms"); // FFCS - fixed "buffer overflow" warning by JHunt meth[4]=(char *)malloc(sizeof(char)*10); strcpy(meth[4],"lsch_ilu0"); meth[5]=(char *)malloc(sizeof(char)*10); strcpy(meth[5],"lsch_ilut"); meth[6]=(char *)malloc(sizeof(char)*10); strcpy(meth[6],"lsch_iluk"); meth[7]=(char *)malloc(sizeof(char)*10); strcpy(meth[7],"lsch_arms"); meth[8]=(char *)malloc(sizeof(char)*10); strcpy(meth[8],"rsch_ilu0"); meth[9]=(char *)malloc(sizeof(char)*10); strcpy(meth[9],"rsch_ilut"); meth[10]=(char *)malloc(sizeof(char)*10); strcpy(meth[10],"rsch_iluk"); meth[11]=(char *)malloc(sizeof(char)*10); strcpy(meth[11],"rsch_arms"); meth[12]=(char *)malloc(sizeof(char)*10); strcpy(meth[12],"sch_gilu0"); meth[13]=(char *)malloc(sizeof(char)*8); strcpy(meth[13],"sch_sgs"); /*storage format of the matrix*/ char pcrM[4]; strcpy(pcrM,"csr"); /*- Create Distributed Matrix dm in CSR format */ CreateMat(&dm, pcrM); dm->comm->mpi_comm=comm;dm->comm->myproc=rk; dm->comm->npro=size; /*------ Create PrePar /iterPar pointer */ /*---- parameters for preconditioning and iteration*/ if((datafile.empty())&&(param_double==NULL)&&(param_int==NULL)){ if(dm->comm->myproc==0) printf("%s","We are going to set default parameters because user did not specify any one \n \n "); parm_param * pp= new parm_param(); iov=pp->iov; scale=pp->scale; unsymm=pp->unsymm; method= assignprecon(meth[pp->method], dm); prepar=pp->prepar; ipar=pp->ipar; VERBOSE=pp->VERBOSE; solver=pp->solver; } if(((param_double!=NULL)||(param_int!=NULL))&&(datafile.empty())) { if(dm->comm->myproc==0) printf("%s","User have set parameter inside vector of parameter \n"); parm_param * pp= new parm_param(param_int, param_double); iov=pp->iov; scale=pp->scale; unsymm=pp->unsymm; method= assignprecon(meth[pp->method], dm); prepar=pp->prepar; ipar=pp->ipar; VERBOSE=pp->VERBOSE; solver=pp->solver; } if((!datafile.empty())&&((param_double==NULL)&&(param_int==NULL))) { if(dm->comm->myproc==0) printf("%s","User have set parameter inside file of parameter \n"); parm_param * pp= new parm_param(datafile, dm); iov=pp->iov; scale=pp->scale; unsymm=pp->unsymm; method=pp->method; prepar=pp->prepar; ipar=pp->ipar; VERBOSE=pp->VERBOSE; solver=pp->solver; } if(((solver==1)||(solver==2))&&((method!=0)||(method!=4))) { if(dm->comm->myproc==0) printf("%s%s%s", "WE NOT GARANTI THE PRECONDITIONNER WILL WORK BECAUSE ACCELARATOR ", meth[method] ," NO NEED INNER ITERATION \n"); //MPI_Finalize(); } if((dm->comm->myproc==0)&&(VERBOSE>=0)){ printf("###########################################\n"); printf("######### CALLING PARMS PACKAGE ###########\n"); if(solver==0) printf("########### SOLVER : FGMRES #######\n"); if(solver==1) printf("########### SOLVER : BiCGStab #######\n"); if(solver==2) printf("########### SOLVER : DGMRES #######\n"); printf("%s%s%s","########### PRECONDITIONNER : ", meth[method], "\n" ); printf("###########################################\n"); } /*----from zero-based to 1-based before calling pARMS routine----*/ n=AA.n; nnz=AA.nbcoef; PARMS_malloc(pr,n+1,int) ; PARMS_malloc(p,nnz,int) ; PARMS_malloc(AAv,nnz,double) ; for(i=0;i1){ METIS_PartGraphVKway(&n, pr, p, NULL, NULL, &wgtflag, &numflag,&size, option, &volume, riord); } else if(size==1){ for (i=0; ipgfpar[0] == 0.0){ if (rk == 0) fprintf(stderr, "Error: Tolerance for inner solver\n"); ierr = 1; } if (ipar->ipar[3] == 0){ if (rk == 0) fprintf(stderr, "Error: Krylov subspace size for inner solver\n"); ierr = 1; } if (ipar->ipar[4] == 0){ if (rk == 0) fprintf(stderr, "Error: Maximum number of inner iterations\n"); ierr = 1; } if (ierr == 1){ if (rk == 0) fprintf(stderr,"should be nonzero to invoke the Schur Complement iteration\n "); PARMS_Final(); exit(1); } } /*----- create preconditioner */ if(VERBOSE==3){ MPI_Barrier(dm->comm->mpi_comm); t1 = dwalltime();} ierr = CreatePrec(dm,&precon,method,prepar,ipar); if(VERBOSE==3) { MPI_Barrier(dm->comm->mpi_comm); t2 = dwalltime(); t2 = fabs(t2-t1); double tmax=0.0; MPI_Reduce(&t2, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0,dm->comm->mpi_comm); MPI_Bcast(&tmax, 1, MPI_INT,0,dm->comm->mpi_comm); t2=tmax; } /*----- check for errors in preconditioning construction, quit if any */ if (ierr != 0) fprintf(stderr, "Fatal Error (ierr = %d) in preconditioner construction on processor %d\nExiting...\n", ierr, rk); ierr = ierr*ierr; int tmp_ierr=0; MPI_Allreduce(&ierr, &tmp_ierr, 1, MPI_INT, MPI_SUM, dm->comm->mpi_comm); if ( tmp_ierr > 0 ){ /* delete distributed local matrix */ DeleteMat(&dm); /* delete distributed local vector */ free(prepar); free(ipar); free(pp); /* exit PARMS and MPI environment */ PARMS_Final(); exit(1); } } void Solver(const MatriceMorse &AA,KN_ &x,const KN_ &b) const { /* Vec structure rhs -- right hand side, sol -- solution, xsol -- exact solution */ Vec sol, rhs; int i,comt,node; int * poloc; double res1; double dnnz_pre, dgprec_nnz; nnz=AA.nbcoef; CreateVec(&rhs); CreateVec(&sol); n=AA.n; double * rhsb=(double *)malloc(sizeof(double)*n); for(i=0;ivec, nloc, double); PARMS_malloc(poloc, nloc, int); comt=0; if(scale) { for(i = 0; i < n; i++) rhsb[i] *= scaletmpr[i]; } for(i=i1;i<=i2;i++) { node = maptmp1[i-1];poloc[comt]=node-1; rhs->vec[comt]=rhsb[node-1];comt++; } /*----Iteration count-------------------------------------*/ ipar->in_iters=0; ipar->iters=0; /*--- Permute RHS according to result of setup routine ---*/ setuprhs(rhs); /*------- populate the initial guess with values */ VecSetVal(sol,0.0); /*------- calculate the norm of the residual on input */ res1 = ResiNorm2(dm, sol, rhs); if(VERBOSE==3){ MPI_Barrier(dm->comm->mpi_comm); t3 = dwalltime(); } double dgnnz; if(VERBOSE==3){ dnnz_pre = precon->nnz_pre; dgnnz = (double)nnz; dgprec_nnz=0; MPI_Reduce(&dgprec_nnz, &dnnz_pre, 1, MPI_DOUBLE, MPI_SUM, 0, dm->comm->mpi_comm); } if(rk == 0) { printf("Total NNZ(PreCon) / (NNZ*npro) = %6.2f\n",dgprec_nnz/dgnnz); } if(solver==0) fgmresd(dm,precon,ipar,rhs,sol); if(solver==1) dgmresd(dm,precon,ipar,rhs,sol); if(solver==2) bcgstabd(dm,precon,ipar,rhs,sol); res = ResiNorm2(dm, sol, rhs); if(VERBOSE==3){ MPI_Barrier(dm->comm->mpi_comm); t4 = dwalltime(); t4 = fabs(t4-t3); double tmax=0; MPI_Reduce(&t4, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0,dm->comm->mpi_comm); MPI_Bcast(&tmax, 1, MPI_DOUBLE,0,dm->comm->mpi_comm); t4=tmax; } /*----find the norm of the solution error */ i=1; t3 = -1.0; int j; for (i=0; inode[i]-1; /* get the global node corresponding to node i*/ poloc[i]=j; } if (scale){ /*--------- apply permutations to scaletmp */ for (i=0; inode[i]-1; /* get the global node corresponding to node i*/ sol->vec[i] = sol->vec[i]*scaletmpc[j]; /*---- find the residual of the computed solution */ } } /*----- compute the relative error of computed solution */ if((dm->comm->myproc == 0)&&(VERBOSE==3)) { fprintf(stdout,"################ SOLVER STATISTICS ####################\n"); fprintf(stdout, "OUTER ITERATIONS COUNT IS %d\n", ipar->iters); fprintf(stdout, "INNER ITERATION COUNT IS %d\n", ipar->in_iters); fprintf(stdout, "THE TOTAL TIME IS %16.8f\n", t2+t4); fprintf(stdout, "THE TIME FOR CREATING PRECONDITIONER IS %16.8f\n", t2); fprintf(stdout, "THE TIME FOR SOLVING PROCESS is %16.8f\n", t4); fprintf(stdout, "The 2-NORM OF THE RELATIVE RESIDUAL IS %16.8g\n", res/res1); } if((dm->comm->myproc == 0)&&(VERBOSE==2)) { fprintf(stdout, "THE TOTAL TIME IS %16.8f\n", t2+t4); fprintf(stdout, "THE TIME FOR CREATING PRECONDITIONER IS %16.8f\n", t2); fprintf(stdout, "THE TIME FOR SOLVING PROCESS is %16.8f\n", t4); } if((dm->comm->myproc == 0)&&(VERBOSE==1)) { fprintf(stdout, "OUTER ITERATIONS COUNT IS %d\n", ipar->iters); fprintf(stdout, "INNER ITERATION COUNT IS %d\n", ipar->in_iters); fprintf(stdout, "The 2-NORM OF THE RELATIVE RESIDUAL IS %16.8g\n", res/res1); } double * xx= (double *)malloc(sizeof(double)*n); comt=0; for(i=0;icomm->npro;i++) mapptr[i]--; int *displs, *perm; PARMS_malloc(displs, nloc, int);PARMS_malloc(perm, n, int); MPI_Gatherv(&(sol->vec[0]), nloc, MPI_DOUBLE, &(xx[0]), iwork, mapptr , MPI_DOUBLE, 0,comm ); MPI_Gatherv(&(poloc[0]), nloc, MPI_INT, &(perm[0]), iwork, mapptr , MPI_INT, 0,comm ); MPI_Bcast(perm,AA.n,MPI_INT,0, comm); int *invp=(int *)malloc(sizeof(int)*n); for(i=0;icomm->myproc==0){for(i=0;icomm->npro;i++) mapptr[i]++; /*Delete use vectors*/ DeleteVec(&sol); DeleteVec(&rhs); free(xx); //This should be in Destructor free(perm); free(invp); } ~dSolvePARMS() { if(VERBOSE==3){ cout << "~SolvePARMS:" << endl; free(mapptr); DeletePrec(precon); free(scaletmpc); free(scaletmpr); /*---- Delete distributed local matrix */ DeleteMat(&dm); /*---- Delete distributed local vector */ free(prepar); free(ipar); /*Delete matrix and right hand side*/ } //PARMS_Final(); } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; inline MatriceMorse::VirtualSolver * BuilddSolvePARMS(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverMUMPSmpi" << endl; return new dSolvePARMS(*A,ds.data_filename, ds.lparams, ds.dparams,(MPI_Comm *)ds.commworld); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity>1) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return TRUE; } bool SetdSolvePARMS() { if(verbosity>1) cout << " SetDefault sparse solver to PARMS" << endl; DefSparseSolver::solver =BuilddSolvePARMS; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return TRUE; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pARMSmpi, defaultsolver defaultsolverpARMSmpi" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuilddSolvePARMS; //DefSparseSolver::solver =BuildSolverMUMPSmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("defaulttopARMSmpi","(",new OneOperator0(SetdSolvePARMS)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/PETSc.hpp000755 000767 000024 00000030301 12515673144 017772 0ustar00hechtstaff000000 000000 #include #include extern KN* pkarg; #include "petsc.h" #if PETSC_VERSION_LT(3,6,0) #define MatCreateVecs MatGetVecs #endif class DistributedCSR { public: HpSchwarz<>* _A; Mat _petsc; Vec _x; KSP _ksp; unsigned int* _num; int* _ia; int* _ja; double* _c; unsigned int _first; unsigned int _last; unsigned int _global; bool _free; DistributedCSR() : _A(), _num(), _ia(), _ja(), _c(), _first(), _last() { }; ~DistributedCSR() { if(_A) { VecDestroy(&_x); MatDestroy(&_petsc); KSPDestroy(&_ksp); delete [] _num; _num = nullptr; if(_free) { delete [] _ia; delete [] _ja; delete [] _c; _ia = _ja = nullptr; _c = nullptr; } delete _A; _A = nullptr; } } }; void finalizePETSc() { PETSC_COMM_WORLD = MPI_COMM_WORLD; PetscFinalize(); } long initEmptyCSR(DistributedCSR* const&) { return 0; } template class initCSR_Op : public E_F0mps { public: Expression A; Expression K; Expression O; Expression R; Expression D; static const int n_name_param = 3; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; initCSR_Op(const basicAC_F0& args, Expression param1, Expression param2, Expression param3, Expression param4, Expression param5) : A(param1), K(param2), O(param3), R(param4), D(param5) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type initCSR_Op::name_param[] = { {"communicator", &typeid(pcommworld)}, {"bs", &typeid(long)}, {"rhs", &typeid(KN*)} }; template class initCSR : public OneOperator { public: initCSR() : OneOperator(atype(), atype(), atype*>(), atype*>(), atype>*>(), atype*>()) { } E_F0* code(const basicAC_F0& args) const { return new initCSR_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]), t[4]->CastTo(args[4])); } }; template AnyType initCSR_Op::operator()(Stack stack) const { DistributedCSR* ptA = GetAny((*A)(stack)); KN>* ptR = GetAny>*>((*R)(stack)); KN* ptO = GetAny*>((*O)(stack)); KN* ptD = GetAny*>((*D)(stack)); long bs = nargs[1] ? GetAny((*nargs[1])(stack)) : 1; ptA->_A = new HpSchwarz<>; MatriceMorse *mA = static_cast*>(&(*GetAny*>((*K)(stack))->A)); MPI_Comm* comm = nargs[0] ? (MPI_Comm*)GetAny((*nargs[0])(stack)) : 0; if(ptO && ptA) { HPDDM::MatrixCSR* dA = new HPDDM::MatrixCSR(mA->n, mA->m, mA->nbcoef, mA->a, mA->lg, mA->cl, mA->symetrique); ptA->_A->Subdomain::initialize(dA, STL(*ptO), *ptR, comm); } if(comm) PETSC_COMM_WORLD = *comm; ptA->_A->HpSchwarz<>::initialize(*ptD); if(!ptA->_num) ptA->_num = new unsigned int[ptA->_A->getDof()]; double timing = MPI_Wtime(); ptA->_A->distributedNumbering(ptA->_num, ptA->_first, ptA->_last, ptA->_global); if(verbosity > 0 && mpirank == 0) cout << " --- global numbering created (in " << MPI_Wtime() - timing << ")" << endl; timing = MPI_Wtime(); ptA->_free = ptA->_A->distributedCSR(ptA->_num, ptA->_first, ptA->_last, ptA->_ia, ptA->_ja, ptA->_c); MatCreate(PETSC_COMM_WORLD, &(ptA->_petsc)); if(bs > 1) MatSetBlockSize(ptA->_petsc, bs); MatSetSizes(ptA->_petsc, ptA->_last - ptA->_first, ptA->_last - ptA->_first, ptA->_global, ptA->_global); if(mpisize > 1) { MatSetType(ptA->_petsc, MATMPIAIJ); MatMPIAIJSetPreallocationCSR(ptA->_petsc, ptA->_ia, ptA->_ja, ptA->_c); } else { MatSetType(ptA->_petsc, MATSEQAIJ); MatSeqAIJSetPreallocationCSR(ptA->_petsc, ptA->_ia, ptA->_ja, ptA->_c); } if(mA->symetrique) MatSetOption(ptA->_petsc, MAT_SYMMETRIC, PETSC_TRUE); if(verbosity > 0 && mpirank == 0) cout << " --- global CSR created (in " << MPI_Wtime() - timing << ")" << endl; KN* rhs = nargs[2] ? GetAny*>((*nargs[2])(stack)) : 0; if(rhs) ptA->_A->HPDDM::template Subdomain::exchange(*rhs); timing = MPI_Wtime(); KSPCreate(PETSC_COMM_WORLD, &(ptA->_ksp)); KSPSetOperators(ptA->_ksp, ptA->_petsc, ptA->_petsc); double eps = 1e-8; PetscOptionsGetReal(NULL, "-eps", &eps, NULL); int it = 100; PetscOptionsGetInt(NULL, "-iter", &it, NULL); KSPSetTolerances(ptA->_ksp, eps, PETSC_DEFAULT, PETSC_DEFAULT, it); KSPSetFromOptions(ptA->_ksp); KSPSetUp(ptA->_ksp); if(verbosity > 0 && mpirank == 0) cout << " --- PETSc preconditioner built (in " << MPI_Wtime() - timing << ")" << endl; MatCreateVecs(ptA->_petsc, &(ptA->_x), nullptr); return ptA; } template class setOptions_Op : public E_F0mps { public: Expression A; static const int n_name_param = 2; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; setOptions_Op(const basicAC_F0& args, Expression param1) : A(param1) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type setOptions_Op::name_param[] = { {"sparams", &typeid(std::string*)}, {"nearnullspace", &typeid(FEbaseArrayKn*)} }; template class setOptions : public OneOperator { public: setOptions() : OneOperator(atype(), atype()) { } E_F0* code(const basicAC_F0& args) const { return new setOptions_Op(args, t[0]->CastTo(args[0])); } }; template AnyType setOptions_Op::operator()(Stack stack) const { DistributedCSR* ptA = GetAny((*A)(stack)); std::string* options = nargs[0] ? GetAny((*nargs[0])(stack)) : NULL; if(options) { std::vector elems; std::stringstream ss(*options); std::string item; while (std::getline(ss, item, ' ')) elems.push_back(item); int argc = elems.size() + 1; char** data = new char*[argc]; data[0] = new char[options->size() + argc](); data[1] = data[0] + 1; for(int i = 0; i < argc - 1; ++i) { if(i > 0) data[i + 1] = data[i] + elems[i - 1].size() + 1; strcpy(data[i + 1], elems[i].c_str()); } PetscOptionsInsert(&argc, &data, NULL); delete [] *data; delete [] data; } FEbaseArrayKn* ptNS = nargs[1] ? GetAny*>((*nargs[1])(stack)) : 0; int dim = 0; if(ptNS) dim = ptNS->N; if(dim) { Vec x; MatCreateVecs(ptA->_petsc, &x, NULL); Vec* ns; VecDuplicateVecs(x, dim, &ns); for(unsigned short i = 0; i < dim; ++i) { double* x; VecGetArray(ns[i], &x); ptA->_A->distributedVec<0>(ptA->_num, ptA->_first, ptA->_last, *(ptNS->get(i)), x, ptA->_A->getDof()); VecRestoreArray(ns[i], &x); } MatNullSpace sp; MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_FALSE, dim, ns, &sp); MatSetNearNullSpace(ptA->_petsc, sp); MatNullSpaceDestroy(&sp); if(ns) VecDestroyVecs(dim, &ns); delete [] ns; } double timing = MPI_Wtime(); KSPSetOperators(ptA->_ksp, ptA->_petsc, ptA->_petsc); double eps = 1e-8; PetscOptionsGetReal(NULL, "-eps", &eps, NULL); int it = 100; PetscOptionsGetInt(NULL, "-iter", &it, NULL); KSPSetTolerances(ptA->_ksp, eps, PETSC_DEFAULT, PETSC_DEFAULT, it); KSPSetFromOptions(ptA->_ksp); KSPSetUp(ptA->_ksp); if(verbosity > 0 && mpirank == 0) cout << " --- PETSc preconditioner built (in " << MPI_Wtime() - timing << ")" << endl; return 0L; } class DistributedCSR_inv { public: DistributedCSR* A; DistributedCSR_inv(DistributedCSR* B) : A(B) { assert(A); } operator DistributedCSR& () const { return *A; } operator DistributedCSR* () const { return A; } }; class OneBinaryOperatorPETSc : public OneOperator { public: OneBinaryOperatorPETSc() : OneOperator(atype(), atype(), atype()) { } E_F0* code(const basicAC_F0 & args) const { Expression p = args[1]; if(!p->EvaluableWithOutStack()) CompileError("A^p, The p must be a constant == -1, sorry"); long pv = GetAny((*p)(NullStack)); if(pv != -1) { char buf[100]; sprintf(buf, "A^%ld, The pow must be == -1, sorry", pv); CompileError(buf); } return new E_F_F0(Build, t[0]->CastTo(args[0])); } }; template class Inv { public: const T t; const U u; Inv(T v, U w) : t(v), u(w) {} void solve(U out) const { Vec y; double timing = MPI_Wtime(); MatCreateVecs((*t)._petsc, nullptr, &y); double* x; VecGetArray((*t)._x, &x); (*t)._A->template distributedVec<0>((*t)._num, (*t)._first, (*t)._last, static_cast(*u), x, (*t)._A->getDof()); VecRestoreArray((*t)._x, &x); std::fill(static_cast(*out), static_cast(*out) + out->n, 0); timing = MPI_Wtime(); KSPSolve((*t)._ksp, (*t)._x, y); if(verbosity > 0 && mpirank == 0) cout << " --- system solved with PETSc (in " << MPI_Wtime() - timing << ")" << endl; VecGetArray(y, &x); (*t)._A->template distributedVec<1>((*t)._num, (*t)._first, (*t)._last, *out, x, (*t)._A->getDof()); VecRestoreArray(y, &x); VecDestroy(&y); (*t)._A->HPDDM::template Subdomain::exchange(*out); }; }; KN* InvPETSc(KN* Ax, Inv*> A) { A.solve(Ax); return Ax; } template class GMV { public: const T t; const U u; GMV(T v, U w) : t(v), u(w) {} void prod(U x) const; }; template class GMV*, U> { public: const HpSchwarz<>* t; const U u; GMV(HpSchwarz<>* v, U w) : t(v), u(w) {} void prod(U x) const { t->GMV(*(this->u), *x); }; }; template R Build(A a, B b) { return R(a, b); } template KN* GlobalMV(KN* Ax, GMV*, KN*> A) { A.prod(Ax); return Ax; } template class GMV { public: const DistributedCSR* t; const U u; GMV(DistributedCSR* v, U w) : t(v), u(w) {} void prod(U x) const { Vec z; Vec y; MatCreateVecs(t->_petsc, &z, &y); double* w; VecGetArray(z, &w); t->_A->distributedVec<0>(t->_num, t->_first, t->_last, *u, w, t->_A->getDof()); VecRestoreArray(z, &w); MatMult(t->_petsc, z, y); VecGetArray(y, &w); t->_A->template distributedVec<1>(t->_num, t->_first, t->_last, *x, w, t->_A->getDof()); VecRestoreArray(y, &w); VecDestroy(&y); VecDestroy(&z); t->_A->Subdomain::exchange(*x); }; }; KN* GlobalMV(KN* Ax, GMV*> A) { A.prod(Ax); return Ax; } freefem++-3.38-1/examples++-mpi/real_pastix_FreeFem.cpp000644 000767 000024 00000052761 12467062125 022763 0ustar00hechtstaff000000 000000 // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // //ff-c++-LIBRARY-dep: double_pastix blas parmetis metis scotch mpi fc //ff-c++-cpp-dep: /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* Interface entre freefem++ et pastix */ #include #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include #include #include #include #include #include #include #include // #include // #include // #include // #include // //#include // #include // #include // #include // #include "mpi.h" // #include // #include "pastix.h" // #include "cscd_utils.h" // #include "read_matrix.h" #include #ifdef __cplusplus extern "C" { #endif #include "pastix.h" //#include "cscd_utils.h" #ifdef __cplusplus } #endif //#include "read_matrix.h" #undef memFree_null #define memFree_null(x) {if (x ==NULL) {fprintf(stdout,"%s:%d freeing NULL\n",__FILE__,__LINE__);} free(x); x=NULL;} #define STR_SIZE 256 static pastix_int_t * pastixint(int * ii){ return (pastix_int_t*) (void *) ii;} static pastix_float_t * pastixfloat(double * ii){ return (pastix_float_t*) (void *) ii;} typedef struct pastix_param { pastix_data_t *pastix_data; /*Pointer used by PaStiX to keep information alive between calls */ MPI_Comm comm; /* Communicator used by PaStiX */ pastix_int_t Ncol; /* Size of the Matrix */ pastix_int_t *ia; /* Index of first element of each column in ja and avals */ pastix_int_t *ja; /* Rows of the unknows of the matrix */ pastix_float_t *avals; /* Values of the matrix */ pastix_int_t *perm; /* Permutation used for re-numbering of the unknowns */ pastix_int_t *invp; /* Inverse permutation */ pastix_float_t *rhs; /* Right hand side */ pastix_int_t *iparm; /* Integer parameters */ double *dparm; /* Floating parameters */ } pastix_param_t; void Morse_to_CSC(int m, int n, int nnz, double *a, int *colind, int *rowptr, pastix_float_t **at, pastix_int_t **rowind, pastix_int_t **colptr) { register int i, j, col, relpos; pastix_int_t *marker; /* Allocate storage for another copy of the matrix. */ *at = (pastix_float_t *) malloc(sizeof(pastix_float_t)*nnz); *rowind = (pastix_int_t *) malloc(sizeof(pastix_int_t)*nnz); *colptr = (pastix_int_t *) malloc(sizeof(pastix_int_t)*(n+1)); marker = (pastix_int_t *) malloc(sizeof(pastix_int_t)*n); for (i = 0; i < n; ++i) marker[i] = 0; /* Get counts of each column of A, and set up column pointers */ for (i = 0; i < m; ++i) for (j = rowptr[i]; j < rowptr[i+1]; ++j) ++marker[colind[j]]; (*colptr)[0] = 0; for (j = 0; j < n; ++j) { (*colptr)[j+1] = (*colptr)[j] + marker[j]; marker[j] = (*colptr)[j]; } /* Transfer the matrix into the compressed column storage. */ for (i = 0; i < m; ++i) { for (j = rowptr[i]; j < rowptr[i+1]; ++j) { col = colind[j]; relpos = marker[col]; (*rowind)[relpos] = i; (*at)[relpos] = a[j]; ++marker[col]; } } free(marker); } static const int MAX_CHAR_PER_LINE=256; //void read_datafile_pastixff(const string &datafile, pastix_int_t *iparmtab, double *dparmtab){ void read_datafile_pastixff(const string &datafile, int &mpi_flag, pastix_int_t *iparmtab, double *dparmtab){ FILE* m_File; int i = 0; char szbuff[MAX_CHAR_PER_LINE]; char* token; char filename[datafile.size()+1]; strcpy( filename, datafile.c_str()); m_File = fopen(filename,"rt"); if(!m_File) { printf("error in reading filename %s\n",filename); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"matrix") == 0) ){ printf("freefem++: error in reading matrix parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading matrix parameter for pastix \n"); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if(strcmp(token,"assembled") == 0) mpi_flag = 0; else if(strcmp(token,"distributedglobal") == 0) mpi_flag = 1; else if(strcmp(token,"distributed") == 0) mpi_flag = 2; else{ printf("value of parameter matrix is not correct %s \n", token ); } fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"iparm") == 0) ){ printf("freefem++: error in reading iparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading iparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); iparmtab[i] = (pastix_int_t)atol(token); i++; } i=0; fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); if( !(strcmp(token,"dparm") == 0) ){ printf("freefem++: error in reading dparm parameter for pastix (see strcuture of ffpastix_iparm_dparm.txt) \n"); exit(1); } else{ printf("freefem++: reading dparm parameter for pastix \n"); } while(!feof(m_File) && i < 64) { fgets(szbuff,MAX_CHAR_PER_LINE,m_File); token = strtok(szbuff," /#!\t\n"); dparmtab[i] = atof(token); i++; } fclose(m_File); #ifdef OOC /* if (iparmtab[IPARM_OOC_THREAD] > 1) */ iparmtab[IPARM_OOC_THREAD] = 1; #endif /* On empeche le 2d avec NUMA_ALLOC */ #ifdef NUMA_ALLOC if (iparmtab[IPARM_DISTRIBUTION_LEVEL] != 0) { errorPrint("2D not available with NUMA allocation\n"); exit(-1); } #endif } // ATTENTION :: pastix_float_t // peut tre soit un complex ou un reel cela depend de la maniere dont on a compiler pastix // CAS DOUBLE SEULEMENT class dSolvepastixmpi : public MatriceMorse::VirtualSolver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 int paraoption; int myid, mpi_size; int Nrow; int mpi_flag; int init_raff; int thrd_flag; int SYM; string data_option; mutable pastix_int_t iparm[64]; mutable double dparm[64]; mutable pastix_int_t Ncol; mutable pastix_int_t *ia; mutable pastix_int_t *ja; mutable pastix_float_t *avals; mutable pastix_int_t *loc2glob; //char *Type = NULL; //char *RhsType = NULL; mutable pastix_float_t *rhs; mutable pastix_int_t *perm; mutable pastix_int_t *invp; mutable pastix_data_t *pastix_data; MPI_Comm commworld ; public: dSolvepastixmpi(const MatriceMorse &AA, int strategy, double ttgv, double epsilon, double pivot, double pivot_sym, string datafile, KN &pparam_int, KN &pparam_double, KN &pperm_r, KN &pperm_c,void * ccommworld ) : eps(epsilon),epsr(0), tgv(ttgv),tol_pivot_sym(pivot_sym),tol_pivot(pivot), data_option(datafile) { commworld = ccommworld ? *static_cast( ccommworld) : MPI_COMM_WORLD; KN_ param_int(pparam_int); KN_ param_double(pparam_double); //int m; //int ierr; struct timeval tv1, tv2; int nnz; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); ia = NULL; ja = NULL; avals = NULL; loc2glob = NULL; rhs = NULL; pastix_data = NULL; // matrix assembled on host MPI_Comm_rank(commworld, &myid); printf("- Rang MPI : %d\n", myid); MPI_Comm_size(commworld, &mpi_size); // SYMETRIQUE // MPI_flag need to unselect for non distributed matrix mpi_flag = 0; thrd_flag = 0; // ###################### //pastix_int_t init_raff; fprintf(stdout,"-- INIT PARAMETERS --\n"); // reading iparm from array if(!data_option.empty()){ read_datafile_pastixff(data_option,mpi_flag,iparm,dparm); if(mpi_flag != 0) cerr << "ERROR :: GLOBAT INPUT MATRIX FOR ALL PROCS matrix=assembled" << endl; } else if( !(param_int==NULL) || !(param_double==NULL) ){ if( !(param_int==NULL) ) { cout << "read param_int" << endl; assert(param_int.N() == 64); for(int ii=0; ii<64; ii++) iparm[ii] = param_int[ii]; iparm[IPARM_MODIFY_PARAMETER] = API_YES; } if( !(param_double==NULL) ) { cout << "read param_double" << endl; assert(param_double.N() == 64); for(int ii=0; ii<64; ii++) dparm[ii] = param_double[ii]; } } else{ iparm[IPARM_MODIFY_PARAMETER] = API_NO; cout << "initialize parameter" << endl; } //################################ if( myid==0 ){ Ncol = AA.m; Nrow = AA.n; nnz = AA.nbcoef; // Avant : on ecrit la transpose // AA.cl : indices des colonnes // AA.lg : pointeurs des lignes Morse_to_CSC( AA.n , AA.m, AA.nbcoef, AA.a, AA.cl, AA.lg, &avals, &ja, &ia); // ia : pointeurs des colonnes // ja : indices des lignes if(verbosity) cout << "AA.n= "<< AA.n << " AA.m=" << AA.m << " AA.nbcoef=" << AA.nbcoef << endl; for(int ii=0; ii < Ncol+1; ii++){ ia[ii] = ia[ii]+1; } assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++){ ja[ii] = ja[ii]+1; } //cout << " put " << Ncol << " " << Nrow << " " << nnz << endl; MPI_Bcast( &Ncol, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &Nrow, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &nnz, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, commworld ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, commworld ); } else{ MPI_Bcast( &Ncol, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &Nrow, 1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( &nnz, 1, MPI_PASTIX_INT, 0, commworld ); //cout << " get " << Ncol << " " << Nrow << " " << nnz << endl; avals = (pastix_float_t *) malloc( nnz*sizeof(pastix_float_t) ); ia = (pastix_int_t *) malloc( (Ncol+1)*sizeof(pastix_int_t) ); ja = (pastix_int_t *) malloc( nnz*sizeof(pastix_int_t) ); MPI_Bcast( avals, nnz, MPI_PASTIX_FLOAT, 0, commworld ); MPI_Bcast( ia, Ncol+1, MPI_PASTIX_INT, 0, commworld ); MPI_Bcast( ja, nnz, MPI_PASTIX_INT, 0, commworld ); } //cout << " " << Ncol << " " << endl; perm = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); invp = (pastix_int_t *) malloc(Ncol*sizeof(pastix_int_t)); rhs = (pastix_float_t *) malloc(Ncol*sizeof(pastix_float_t)); // reading permutation given by the user if(pperm_r) for(int ii=0; ii < Ncol; ii++) perm[ii] = pperm_r[ii]; if(pperm_c) for(int ii=0; ii < Ncol; ii++) invp[ii] = pperm_c[ii]; iparm[IPARM_START_TASK] = API_TASK_INIT; iparm[IPARM_END_TASK] = API_TASK_INIT; iparm[IPARM_SYM] = API_SYM_NO; // Matrix is considered nonsymetric if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; fprintf(stdout,"-- FIN INIT PARAMETERS --\n"); init_raff = iparm[IPARM_ITERMAX]; fflush(stdout); /* Passage en mode verbose */ iparm[IPARM_RHS_MAKING] = API_RHS_B; if( (param_int==NULL) && data_option.empty() ){ iparm[IPARM_MATRIX_VERIFICATION] = API_YES; iparm[IPARM_REFINEMENT] = API_RAF_GMRES; iparm[IPARM_INCOMPLETE] = API_NO; } if( (param_double==NULL) && data_option.empty()){ dparm[DPARM_EPSILON_REFINEMENT] = 1e-12; dparm[DPARM_EPSILON_MAGN_CTRL] = 1e-32; } // cscd_checksym(Ncol, ia, ja, loc2glob, commworld); // if (iparm[IPARM_SYM]==API_SYM_YES) // { // /* Symetric problem */ // /* Build non oriented graph */ // /* build non symmetric csc from symmetric csc */ // /*maillage global*/ // INT *tmpia; // INT *tmpja; // INT tmpn; // cscd_symgraph_int(*n2, *col2, *row2 , NULL, // &tmpn, &tmpia, &tmpja, NULL, // *loc2glob2, pastix_comm, API_YES); // memFree_null(*col2); // *col2 = tmpia; // memFree_null(*row2); // *row2 = tmpja; // *n2 = tmpn; // } SYM = AA.symetrique; cout << "SYM = "<< SYM << endl; // SYMETRIQUE if( SYM == 1 ){ iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } /* Scotch */ fprintf(stdout,"-- Scotch --\n"); fflush(stdout); iparm[IPARM_START_TASK] = API_TASK_ORDERING; iparm[IPARM_END_TASK] = API_TASK_ORDERING; if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; iparm[IPARM_SYM] = API_SYM_NO; /* Fax */ fprintf(stdout,"-- Fax --\n"); iparm[IPARM_START_TASK] = API_TASK_SYMBFACT; iparm[IPARM_END_TASK] = API_TASK_SYMBFACT; if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Blend */ fprintf(stdout,"-- Blend --\n"); iparm[IPARM_START_TASK] = API_TASK_ANALYSE; iparm[IPARM_END_TASK] = API_TASK_ANALYSE; if( SYM == 1 ){ //iparm[IPARM_SYM] = API_SYM_YES; iparm[IPARM_FACTORIZATION] = API_FACT_LDLT; } if( SYM == 0 ){ //iparm[IPARM_SYM] = API_SYM_NO; iparm[IPARM_FACTORIZATION] = API_FACT_LU; } if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; /* Factorisation */ iparm[IPARM_START_TASK] = API_TASK_NUMFACT; iparm[IPARM_END_TASK] = API_TASK_NUMFACT; gettimeofday(&tv1, NULL); fprintf(stdout,"-- SOPALIN --\n"); if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call factorization : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; if(verbosity) if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000); printf("=====================================================\n"); cout << " pastix : time factorization :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { struct timeval tv1, tv2; // time variables long int starttime,finishtime; long int timeused; if(verbosity) starttime = clock(); // index for pastix for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]+1; assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]+1; // give value of the second member for(int ii=0; ii < Ncol; ii++){ rhs[ii] = b[ii]; } //fprintf(stdout,"SOLVE STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* updo */ iparm[IPARM_START_TASK] = API_TASK_SOLVE; iparm[IPARM_END_TASK] = API_TASK_SOLVE; iparm[IPARM_RHS_MAKING] = API_RHS_B; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call updown : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); //if(verbosity > 1) // for(int jj=0; jj < Ncol; jj++) //cout << "rhs["<< jj << "]=" << rhs[jj] << endl; //fprintf(stdout,"RAFF STEP %ld (in FACTORIZE STEP %ld)\n",(long)ii,(long)jj); /* raff */ iparm[IPARM_START_TASK] = API_TASK_REFINE; iparm[IPARM_END_TASK] = API_TASK_REFINE; iparm[IPARM_RHS_MAKING] = API_RHS_B; iparm[IPARM_ITERMAX] = init_raff; gettimeofday(&tv1, NULL); if(mpi_flag == 0) pastix(&pastix_data, commworld, Ncol,ia,ja,avals,perm,invp,rhs,1,iparm,dparm); else cerr << "error :: mpi_flag = 0 for calling pastix" << endl; gettimeofday(&tv2, NULL); fprintf(stdout,"Time to call refinement : %ld usec\n", (long)((tv2.tv_sec - tv1.tv_sec ) * 1000000 + tv2.tv_usec - tv1.tv_usec)); for(int ii=0; ii < Ncol; ii++) x[ii] = rhs[ii]; // index for freefem assert( ia[Ncol]-1 == AA.nbcoef ); for(int ii=0; ii < ia[Ncol]-1; ii++) ja[ii] = ja[ii]-1; for(int ii=0; ii < Ncol+1; ii++) ia[ii] = ia[ii]-1; if(verbosity) if(myid==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); printf("=====================================================\n"); cout << " pastix : time solve :: " << timeused << " ms" < & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverpastix_real_mpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverpastix_real_mpi" << endl; return new dSolvepastixmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.lparams, ds.dparams, ds.perm_r, ds.perm_c, ds.commworld); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return false; } bool Setpastixmpi() { if(verbosity) cout << " SetDefault sparse solver to pastixmpi" << endl; DefSparseSolver::solver =BuildSolverpastix_real_mpi; //DefSparseSolver::solver =BuildSolverpastix_real_mpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return false; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: pastix, defaultsolver defaultsolverpastix" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverpastix_real_mpi; //DefSparseSolver::solver =BuildSolverpastix_real_mpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("realdefaulttopastix","(",new OneOperator0(Setpastixmpi)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/real_SuperLU_DIST_FreeFem.cpp000644 000767 000024 00000055736 12500064767 023644 0ustar00hechtstaff000000 000000 // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: superlu_dist ptscotchparmetis ptscotch scotchmetis scotch mpi blas fc //ff-c++-cpp-dep: // // ORIG-DATE: 02/2009 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include #include using namespace std; #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "superlu_ddefs.h" #include "ffsuperludistoption.hpp" template struct SuperLUmpiDISTDriver { }; template <> struct SuperLUmpiDISTDriver { /* Driver routines */ static Dtype_t R_SLU_T() { return SLU_D;} static void pgssvx(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, double *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, SOLVEstruct_t *p9, double *p10, SuperLUStat_t *p11, int *p12) { pdgssvx( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 ); } static void pgssvx_ABglobal(superlu_options_t *p1, SuperMatrix *p2, ScalePermstruct_t *p3, double *p4, int p5, int p6, gridinfo_t *p7, LUstruct_t *p8, double *p9, SuperLUStat_t *p10, int *p11) { pdgssvx_ABglobal( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11); } static void Print_CompRowLoc_Matrix_dist(SuperMatrix *p1) { dPrint_CompRowLoc_Matrix_dist(p1); } static void Create_CompCol_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, double *p5, int_t *p6, int_t *p7, Stype_t p8, Dtype_t p9, Mtype_t p10) { dCreate_CompCol_Matrix_dist(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); } static void Create_CompRowLoc_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, int_t p5, int_t p6, double *p7, int_t *p8, int_t *p9, Stype_t p10, Dtype_t p11, Mtype_t p12) { dCreate_CompRowLoc_Matrix_dist( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12); } static void CompRow_to_CompCol_dist(int_t p1, int_t p2, int_t p3, double *p4, int_t *p5, int_t *p6, double **p7, int_t **p8, int_t **p9) { dCompRow_to_CompCol_dist( p1,p2,p3,p4,p5,p6,p7,p8,p9 ); } static void Create_Dense_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, double *p4, int_t p5, Stype_t p6, Dtype_t p7, Mtype_t p8) { dCreate_Dense_Matrix_dist( p1,p2,p3,p4,p5,p6,p7,p8 ); } static void Create_SuperNode_Matrix_dist(SuperMatrix *p1, int_t p2, int_t p3, int_t p4, double *p5, int_t *p6, int_t *p7, int_t *p8, int_t *p9, int_t *p10, Stype_t p11, Dtype_t p12, Mtype_t p13) { dCreate_SuperNode_Matrix_dist(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10, p11,p12,p13); } }; template class SolveSuperLUmpi : public MatriceMorse::VirtualSolver, public SuperLUmpiDISTDriver { double eps; mutable double epsr; double tgv; double tol_pivot_sym,tol_pivot; //Add 31 oct 2005 //mutable char equed[1]; //yes_no_t equil; mutable SuperMatrix A; NCformat *Astore; //NCformat *Ustore; //SCformat *Lstore; mutable superlu_options_t options; mutable mem_usage_t mem_usage; mutable ScalePermstruct_t ScalePermstruct; mutable LUstruct_t LUstruct; mutable SOLVEstruct_t SOLVEstruct; mutable gridinfo_t grid; string string_option; string data_option; R *a; int *asub, *xa; int_t m, n, nnz; // rajout pour // int_t nprow,npcol; /* process rows and process columns*/ int matrixdist; // type of distributed matrix MPI_Comm commworld ; static const int assembled =0; static const int distributedglobal =1; static const int distributed =2; int iam; public: SolveSuperLUmpi(const MatriceMorse &AA,int strategy,double ttgv, double epsilon, double pivot,double pivot_sym, string datafile, string param_char, KN &pperm_r, KN &pperm_c,void * ccommworld=0) : eps(epsilon),epsr(0), tgv(ttgv),string_option(param_char),data_option(datafile), tol_pivot_sym(pivot_sym),tol_pivot(pivot) { commworld = ccommworld ? *static_cast( ccommworld) : MPI_COMM_WORLD; int rank; MPI_Comm_rank(commworld, &rank); R* B; //R* X; SuperLUStat_t stat; int info, ldb, nrhs=0; int i; double* berr; //int iam; // Add for distributed matrix int_t m_loc, m_loc_fst, fst_row, nnz_loc, fst_nnz; R *aloc; int *asubloc, *xaloc; // End Add for distributed matrix A.Store=0; int status; // time variables long int starttime,finishtime; long int timeused; // rajout debug int myid; if(verbosity) starttime = clock(); /* Defaults */ nrhs = 0; /* lecture de nprow and npcol */ // Cas max deux procs nprow = 1; npcol = 1; matrixdist=0; if(!data_option.empty()) read_nprow_npcol_matrixdist_superlu_datafile(&data_option, &nprow, &npcol, &matrixdist); if(!string_option.empty()) read_nprow_npcol_freefem( &string_option, &nprow, &npcol, &matrixdist); /* ------------------------------------------------------------ INITIALIZE THE SUPERLU PROCESS GRID. ------------------------------------------------------------*/ if( (verbosity>1) && (rank ==0)) cout << "Real superlu_gridinit" << " " << commworld << " " << ccommworld <= nprow * npcol ){ printf("this process is not used in superlu %d \n",iam); } else { /* set the default options */ set_default_options_dist(&options); DiagScale_t optionDiagScale; if(!string_option.empty()) read_options_freefem(&string_option,&options,&optionDiagScale); if(!data_option.empty()) read_options_superlu_datafile(&data_option,&options,&nprow, &npcol, &matrixdist,&optionDiagScale); // matrix to procs and vectors if( matrixdist == assembled ){ if(!iam){ if(verbosity>5) { cout << "iam=" << iam << " " ; printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); } /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; assert( AA.lg[n] == nnz ); if(verbosity>5) printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* transform Row to Col */ // cela coute cher comme fonction // //dallocateA_dist(n, nnz, &a, &asub, &xa); //dCompRow_to_CompCol_dist(m,n,nnz,arow,asubrow,xarow,&a,&asub,&xa); dCompRow_to_CompCol_dist(m,n,nnz,AA.a,AA.cl,AA.lg,&a,&asub,&xa); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); int infobcast=MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } else{ /* printf("\tProcess grid\t%d X %d\n", grid.nprow, grid.npcol); Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ dallocateA_dist(n, nnz, &a, &asub, &xa); int infobcast=MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); if(verbosity>6) cout << "Debut: Create_CompCol_Matrix_dist" <" required by g++ 4.7 this->Create_CompCol_Matrix_dist(&A, m, n, nnz, a, asub, xa, SLU_NC, R_SLU, SLU_GE); if(verbosity>6) cout << "Fin: Create_CompCol_Matrix_dist" <2 && rank ==0) printf("Dimension %dx%d; # nonzeros %d\n", A.nrow, A.ncol, nnz); /* Initialize ScalePermstruct and LUstruct. */ ScalePermstructInit(m, n, &ScalePermstruct); if( !(pperm_r==NULL) || !(pperm_c==NULL) ) ScalePermstruct.DiagScale=optionDiagScale; if( !(pperm_r==NULL) ) for(int ii=0; ii::pgssvx_ABglobal(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info); if(verbosity>2 && rank ==0) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } //########################################################## // // matrix distributed with matrix global given // //########################################################## else if( matrixdist == distributedglobal) { if(!iam){ if(verbosity>2) printf("\tProcess grid\t%d X %d iam=%d \n", grid.nprow, grid.npcol,iam); /* create the matrix for superlu_dist */ n=AA.n; m=AA.m; nnz=AA.nbcoef; a=AA.a; asub=AA.cl; xa=AA.lg; xa[n] = nnz; if(verbosity>6) printf("\tDimension\t%dx%d\t # nonzeros %d\n", m, n, nnz); /* Broadcast matrix A to the other PEs. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( AA.cl, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( AA.lg, n+1, mpi_int_t, 0, grid.comm ); } else{ if(verbosity>6)printf("\tProcess grid\t%d X %d iam=%d \n", grid.nprow, grid.npcol,iam); /* Receive matrix A from PE 0. */ MPI_Bcast( &m, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &n, 1, mpi_int_t, 0, grid.comm ); MPI_Bcast( &nnz, 1, mpi_int_t, 0, grid.comm ); /* Allocate storage for compressed column representation. */ dallocateA_dist(n, nnz, &a, &asub, &xa); MPI_Bcast( a, nnz, MPI_DOUBLE, 0, grid.comm ); MPI_Bcast( asub, nnz, mpi_int_t, 0, grid.comm ); MPI_Bcast( xa, n+1, mpi_int_t, 0, grid.comm ); } /* Compute the number of rows to be distributed to local process */ m_loc = m / (grid.nprow * grid.npcol); m_loc_fst = m_loc; /* When m / procs is not an integer */ if ((m_loc * grid.nprow * grid.npcol) != m) { /*m_loc = m_loc+1; m_loc_fst = m_loc;*/ if (iam == (grid.nprow * grid.npcol - 1)) /* last proc. gets all*/ m_loc = m - m_loc * (grid.nprow * grid.npcol - 1); } fst_row = iam * m_loc_fst; nnz_loc = xa[fst_row+m_loc]-xa[fst_row]; xaloc = (int_t*) intMalloc_dist(m_loc+1); for(int ii=0; ii < m_loc; ii++){ xaloc[ii] = xa[fst_row+ii]-xa[fst_row]; } xaloc[m_loc]=nnz_loc; fst_nnz = xa[fst_row]; aloc = (double*) doubleMalloc_dist(nnz_loc); asubloc = (int_t*) intMalloc_dist(nnz_loc); for(int ii=0; ii < nnz_loc; ii++){ aloc[ii] = a[fst_nnz+ii]; asubloc[ii] = asub[fst_nnz+ii]; } if( iam ){ SUPERLU_FREE( a ); SUPERLU_FREE( asub ); SUPERLU_FREE( xa ); } Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); if(verbosity>6) cout << "Debut: Create_CompRowCol_Matrix_dist" <6) cout << "Fin: Create_CompRowCol_Matrix_dist" <2 && rank ==0) printf("Dimension %dx%d; # nonzeros %d\n", A.nrow, A.ncol, nnz); /* set the default options */ //set_default_options_dist(&options); //DiagScale_t optionDiagScale; //if(!string_option.empty()) read_options_freefem(&string_option,&options,&optionDiagScale); m=A.nrow; n=A.ncol; //printf("Dimension %dx%d; # nonzeros %d\n", A.nrow, A.ncol, nnz); /* Initialize ScalePermstruct and LUstruct. */ ScalePermstructInit(m, n, &ScalePermstruct); if(pperm_r || pperm_c ) ScalePermstruct.DiagScale=optionDiagScale; if(pperm_r) for(int ii=0; ii::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info); if(verbosity >1 && rank ==0) printf("LU factorization: pdgssvx()/p returns info %d\n", info); if ( verbosity > 2 ) PStatPrint(&options,&stat,&grid); PStatFree(&stat); } else if( matrixdist == distributed) { printf("in construction\n"); exit(1); } else{ printf("matrix choice for SuperLU_DIST is assembled, distributedglobal and distributed \n"); exit(1); } SUPERLU_FREE( B ); options.Fact = FACTORED; /* Indicate the factored form of A is supplied. */ nrhs=1; SUPERLU_FREE(berr); if(iam==0){ finishtime = clock(); timeused= (finishtime-starttime)/(1000 ); if(verbosity>1) { printf("=====================================================\n"); cout << "SuperLU_DIST : time factorisation :: " << timeused << " ms" < &AA,KN_ &x,const KN_ &b) const { R* B; SuperLUStat_t stat; //int iam; int info=0, ldb=m, nrhs=1; int i; double* berr; double ferr; double rpg, rcond; int_t m_loc,m_loc_fst,fst_row; // time variable long int starttime,finishtime; long int timeused; if( iam < nprow*npcol){ if(verbosity) starttime = clock(); if(n != m) exit(1); ffassert ( &x[0] != &b[0]); epsr = (eps < 0) ? (epsr >0 ? -epsr : -eps ) : eps ; Dtype_t R_SLU = SuperLUmpiDISTDriver::R_SLU_T(); nrhs= 1; //iam = grid.iam; //if( iam < nprow*npcol){ /* Initialize the statistics variables. */ PStatInit(&stat); /* cas matrix assembled */ if( matrixdist == assembled ){ if( !(B = doubleMalloc_dist(m*nrhs)) ){ printf("probleme d allocation\n"); exit(1); } for(int ii=0; ii::pgssvx_ABglobal (&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, berr, &stat, &info ); if(verbosity>3) printf("Triangular solve: dgssvx() returns info %d\n", info); if(verbosity) PStatPrint(&options, &stat, &grid); for(int ii=0; ii2) cout << " x min max " << x.min() << " " <::pgssvx(&options, &A, &ScalePermstruct, B, ldb, nrhs, &grid, &LUstruct, &SOLVEstruct, berr, &stat, &info ); if(verbosity>3) printf("Triangular solve: dgssvx() returns info %d\n", info); if ( !(xtemp = doubleMalloc_dist(AA.n)) ){ printf("probleme d allocation de xtemp\n"); exit(1); } int disp[nprow*npcol]; MPI_Allgather(&fst_row, 1, MPI_INT, disp, 1, MPI_INT, grid.comm); int recv[nprow*npcol]; MPI_Allgather(&m_loc, 1, MPI_INT, recv, 1, MPI_INT, grid.comm); MPI_Allgatherv(B, m_loc, MPI_DOUBLE, xtemp, recv, disp, MPI_DOUBLE, grid.comm); for(int ii= 0; ii< AA.n ; ii++) x[ii] = xtemp[ii]; if(verbosity) cout << " x min max " << x.min() << " " <1) { printf("=====================================================\n"); cout << "SuperLu_DIST: time solve step :: " << timeused << " ms" <4) cout << "~SolveSuperLUmpi double:" << endl; if( matrixdist == assembled) { //if( A.Store) Destroy_CompCol_Matrix_dist(&A); //if( L.Store && U.Store ) { Destroy_LU(n, &grid, &LUstruct); ScalePermstructFree(&ScalePermstruct); LUstructFree(&LUstruct); //} if ( options.SolveInitialized ) { dSolveFinalize(&options, &SOLVEstruct); } } else if( matrixdist == distributedglobal) { Destroy_CompRowLoc_Matrix_dist(&A); Destroy_LU(n, &grid, &LUstruct); ScalePermstructFree(&ScalePermstruct); LUstructFree(&LUstruct); if ( options.SolveInitialized ) { dSolveFinalize(&options, &SOLVEstruct); } } else if( matrixdist == distributed) { printf("in construction\n"); exit(1); } else{ printf("matrix choice for SuperLU_DIST is assembled, distributedglobal and distributed \n"); exit(1); } } printf("Real superlu_gridexit(&grid), %d\n",iam); superlu_gridexit(&grid); } void addMatMul(const KN_ & x, KN_ & Ax) const { ffassert(x.N()==Ax.N()); Ax += (const MatriceMorse &) (*this) * x; } }; MatriceMorse::VirtualSolver * BuildSolverSuperLUmpi(DCL_ARG_SPARSE_SOLVER(double,A)) { if(verbosity>9) cout << " BuildSolverSuperLUmpi" << endl; return new SolveSuperLUmpi(*A,ds.strategy,ds.tgv,ds.epsilon,ds.tol_pivot,ds.tol_pivot_sym, ds.data_filename, ds.sparams, ds.perm_r, ds.perm_c, ds.commworld); } /* --FH: class Init { public: Init(); };*/ // the 2 default sparse solver double and complex DefSparseSolver::SparseMatSolver SparseMatSolver_R ; ; //DefSparseSolver::SparseMatSolver SparseMatSolver_C; // the default probleme solver TypeSolveMat::TSolveMat TypeSolveMatdefaultvalue=TypeSolveMat::defaultvalue; bool SetDefault() { if(verbosity) cout << " SetDefault sparse to default" << endl; DefSparseSolver::solver =SparseMatSolver_R; //DefSparseSolver::solver =SparseMatSolver_C; TypeSolveMat::defaultvalue =TypeSolveMat::SparseSolver; return false; } bool SetSuperLUmpi() { if(verbosity) cout << " SetDefault sparse solver to SuperLUmpi double" << endl; DefSparseSolver::solver =BuildSolverSuperLUmpi; //DefSparseSolver::solver =BuildSolverSuperLUmpi; TypeSolveMat::defaultvalue = TypeSolveMatdefaultvalue; return false; } static void Load_Init() { SparseMatSolver_R= DefSparseSolver::solver; //SparseMatSolver_C= DefSparseSolver::solver; if(verbosity>1) cout << "\n Add: Real SuperLUdist, defaultsolver defaultsolverSuperLUdist" << endl; TypeSolveMat::defaultvalue=TypeSolveMat::SparseSolver; DefSparseSolver::solver =BuildSolverSuperLUmpi; //DefSparseSolver::solver =BuildSolverSuperLUmpi; if(! Global.Find("defaultsolver").NotNull() ) Global.Add("defaultsolver","(",new OneOperator0(SetDefault)); Global.Add("realdefaulttoSuperLUdist","(",new OneOperator0(SetSuperLUmpi)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-mpi/regtests.sh000755 000767 000024 00000000750 11745333166 020545 0ustar00hechtstaff000000 000000 #!/bin/sh # Testing procedure for MPI version of FreeFem++ # $Id$ NPROCS=2 REGEDP=essai.edp ../regtests.sh if test $? != 0 then exit 1 fi NPROCS=2 REGEDP=schwarz.edp ../regtests.sh if test $? != 0 then exit 1 fi NPROCS=2 REGEDP=schwarz-b.edp ../regtests.sh if test $? != 0 then exit 1 fi NPROCS=2 REGEDP=schwarz-c.edp ../regtests.sh if test $? != 0 then exit 1 fi NPROCS=4 REGEDP=mortar-DN-4-mpi.edp ../regtests.sh if test $? != 0 then exit 1 fi freefem++-3.38-1/examples++-mpi/removeDOF.cpp000644 000767 000024 00000022632 12471636006 020677 0ustar00hechtstaff000000 000000 //ff-c++-LIBRARY-dep: cxx11 #ifndef _ALL_IN_ONE_ #include "ff++.hpp" #include #include #include #endif #include #ifndef EPS #define EPS 1e-12 #endif template class removeDOF_Op : public E_F0mps { public: Expression A; Expression R; Expression x; Expression out; static const int n_name_param = 3; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; removeDOF_Op(const basicAC_F0& args, Expression param1, Expression param2, Expression param3, Expression param4) : A(param1), R(param2), x(param3), out(param4) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type removeDOF_Op::name_param[] = { {"symmetrize", &typeid(bool)}, {"condensation", &typeid(KN*)}, {"interaction", &typeid(Matrice_Creuse*)} }; template class removeDOF : public OneOperator { public: removeDOF() : OneOperator(atype(), atype*>(), atype*>(), atype*>(), atype*>()) {} E_F0* code(const basicAC_F0& args) const { return new removeDOF_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3])); } }; template AnyType removeDOF_Op::operator()(Stack stack) const { Matrice_Creuse* pA = GetAny* >((*A)(stack)); Matrice_Creuse* pR = GetAny* >((*R)(stack)); KN* pX = GetAny* >((*x)(stack)); KN* pOut = GetAny* >((*out)(stack)); ffassert(pA && pR && pX && pOut); pA->Uh = pR->Uh; pA->Vh = pR->Vh; MatriceMorse *mA = static_cast*>(&(*pA->A)); MatriceMorse *mR = static_cast*>(&(*pR->A)); bool symmetrize = nargs[0] ? GetAny((*nargs[0])(stack)) : false; KN* condensation = nargs[1] ? GetAny* >((*nargs[1])(stack)) : (KN*) 0; unsigned int n = condensation ? condensation->n : mR->nbcoef; int* lg = new int[n + 1]; int* cl; T* val; T* b; if(pOut->n == 0) { b = new T[n]; pOut->set(b, n); } std::vector tmpVec; if(!condensation) { tmpVec.resize(mA->n); for(unsigned int i = 0; i < n; ++i) tmpVec[mR->cl[i]] = i + 1; if(!mA->symetrique) { std::vector > tmp; tmp.reserve(mA->nbcoef); lg[0] = 0; for(unsigned int i = 0; i < n; ++i) { for(unsigned int j = mA->lg[mR->cl[i]]; j < mA->lg[mR->cl[i] + 1]; ++j) { unsigned int col = tmpVec[mA->cl[j]]; if(col != 0 && abs(mA->a[j]) > EPS) { if(symmetrize) { if(col - 1 <= i) tmp.emplace_back(col - 1, mA->a[j]); } else tmp.emplace_back(col - 1, mA->a[j]); } } std::sort(tmp.begin() + lg[i], tmp.end(), [](const std::pair& lhs, const std::pair& rhs) { return lhs.first < rhs.first; }); *(*pOut + i) = *(*pX + mR->cl[i]); lg[i + 1] = tmp.size(); } mA->nbcoef = tmp.size(); if(symmetrize) mA->symetrique = true; else mA->symetrique = false; cl = new int[tmp.size()]; val = new T[tmp.size()]; for(unsigned int i = 0; i < tmp.size(); ++i) { cl[i] = tmp[i].first; val[i] = tmp[i].second; } } else { std::vector > > tmp(n); for(unsigned int i = 0; i < n; ++i) tmp[i].reserve(mA->lg[mR->cl[i] + 1] - mA->lg[mR->cl[i]]); unsigned int nnz = 0; for(unsigned int i = 0; i < n; ++i) { for(unsigned int j = mA->lg[mR->cl[i]]; j < mA->lg[mR->cl[i] + 1]; ++j) { unsigned int col = tmpVec[mA->cl[j]]; if(col != 0 && abs(mA->a[j]) > EPS) { if(i < col - 1) tmp[col - 1].emplace_back(i, mA->a[j]); else tmp[i].emplace_back(col - 1, mA->a[j]); ++nnz; } } *(*pOut + i) = *(*pX + mR->cl[i]); } mA->nbcoef = nnz; cl = new int[nnz]; val = new T[nnz]; nnz = 0; lg[0] = 0; for(unsigned int i = 0; i < n; ++i) { std::sort(tmp[i].begin(), tmp[i].end(), [](const std::pair& lhs, const std::pair& rhs) { return lhs.first < rhs.first; }); for(typename std::vector >::const_iterator it = tmp[i].begin(); it != tmp[i].end(); ++it) { cl[nnz] = it->first; val[nnz++] = it->second; } lg[i + 1] = nnz; } } delete [] mA->cl; delete [] mA->lg; delete [] mA->a; mA->n = n; mA->m = n; mA->N = n; mA->M = n; mA->lg = lg; mA->cl = cl; mA->a = val; } else { tmpVec.reserve(mA->n); unsigned int i = 0, j = 1; for(unsigned int k = 0; k < mA->n; ++k) { if(k == *(*condensation + i)) { ++i; tmpVec.emplace_back(i); } else { tmpVec.emplace_back(-j); ++j; } } // if(!mA->symetrique) { std::vector > tmpInterior; std::vector > tmpBoundary; std::vector > tmpInteraction; tmpInterior.reserve(mA->nbcoef); tmpBoundary.reserve(mA->nbcoef); tmpInteraction.reserve(mA->nbcoef); lg[0] = 0; for(unsigned int i = 0; i < mA->n; ++i) { int row = tmpVec[i]; if(row < 0) { for(unsigned int j = mA->lg[i]; j < mA->lg[i + 1]; ++j) { int col = tmpVec[mA->cl[j]]; if(col < 0) tmpInterior.emplace_back(-col - 1, mA->a[j]); else tmpInteraction.emplace_back(col - 1, mA->a[j]); } } else { for(unsigned int j = mA->lg[i]; j < mA->lg[i + 1]; ++j) { int col = tmpVec[mA->cl[j]]; if(col > 0) tmpBoundary.emplace_back(col - 1, mA->a[j]); } // std::sort(tmp.begin() + lg[i], tmp.end()); *(*pOut + i) = *(*pX + *(*condensation + i)); lg[i + 1] = tmpBoundary.size(); } } cl = new int[tmpBoundary.size()]; val = new T[tmpBoundary.size()]; for(unsigned int i = 0; i < tmpBoundary.size(); ++i) { cl[i] = tmpBoundary[i].first; val[i] = tmpBoundary[i].second; } // } MatriceMorse* m = new MatriceMorse(n, n, tmpBoundary.size(), mA->symetrique, val, lg, cl, true); pR->typemat = TypeSolveMat(TypeSolveMat::GMRES); pR->A.master(m); m->dummy = false; } return 0L; } template long symmetrizeCSR(Matrice_Creuse* const& A) { MatriceMorse* mA = static_cast*>(&(*A->A)); if(!mA->symetrique) { mA->symetrique = true; std::vector cl; std::vector a; a.reserve(mA->nbcoef); cl.reserve(mA->nbcoef); unsigned int save = mA->lg[0]; for(unsigned int i = 0; i < mA->n; ++i) { for(unsigned int j = save; j < mA->lg[i + 1]; ++j) { int col = mA->cl[j]; if(col <= i) { T val = mA->a[j]; if(abs(val) > EPS) { a.emplace_back(val); cl.emplace_back(col); } } else break; } save = mA->lg[i + 1]; mA->lg[i + 1] = cl.size(); } delete [] mA->cl; delete [] mA->a; int* col = new int[cl.size()]; T* val = new T[cl.size()]; for(unsigned int i = 0; i < cl.size(); ++i) { col[i] = cl[i]; val[i] = a[i]; } mA->cl = col; mA->a = val; mA->nbcoef = cl.size(); } return 0L; } #ifndef _ALL_IN_ONE_ /* --FH: class Init { public: Init(); }; Init ...; */ static void Load_Initrm() { Global.Add("removeDOF", "(", new removeDOF); Global.Add("removeDOF", "(", new removeDOF>); Global.Add("symmetrizeCSR", "(", new OneOperator1_* >(symmetrizeCSR)); } LOADFUNC(Load_Initrm) #endif // std::sort(tmp.begin() + lg[i], tmp.end(), [](const std::pair& lhs, const std::pair& rhs) { return lhs.first < rhs.first; } ); freefem++-3.38-1/examples++-mpi/schwarz-2d.edp000644 000767 000024 00000002752 12441261146 021020 0ustar00hechtstaff000000 000000 if ( mpisize != 2 ) { cout << " sorry number of processeur !=2 " << endl; exit(1);} verbosity=3; real pi=4*atan(1); int inside = 2; int outside = 1; border a(t=1,2){x=t;y=0;label=outside;}; border b(t=0,1){x=2;y=t;label=outside;}; border c(t=2,0){x=t ;y=1;label=outside;}; border d(t=1,0){x = 1-t; y = t;label=inside;}; border e(t=0, pi/2){ x= cos(t); y = sin(t);label=inside;}; border e1(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=outside;}; int n=4; mesh th,TH; if (mpirank == 0) { th = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)); cout << " end th " << endl; // processor(1) << th ; // processor(1) >> TH; } else { TH = buildmesh ( e(5*n) + e1(25*n) ); cout << " end TH " << endl; // processor(0) << TH ; // processor(0) >> th; } broadcast(processor(0),th); broadcast(processor(1),TH); fespace vh(th,P1); fespace VH(TH,P1); vh u=0,v; VH U,V; int i=0; problem PB(U,V,init=i,solver=Cholesky) = int2d(TH)( dx(U)*dx(V)+dy(U)*dy(V) ) + int2d(TH)( -V) + on(inside,U = u) + on(outside,U= 0 ) ; problem pb(u,v,init=i,solver=Cholesky) = int2d(th)( dx(u)*dx(v)+dy(u)*dy(v) ) + int2d(th)( -v) + on(inside ,u = U) + on(outside,u = 0 ) ; for ( i=0 ;i< 10; i++) { cout << mpirank << " looP " << i << endl; if (mpirank == 0) { PB; processor(1) << U[]; processor(1) >> u[]; } else { pb; processor(0) >> U[]; processor(0) << u[]; } // if (mpirank==0) // plot(U,u,wait=true,ps="Uu"+i+".eps"); }; if (mpirank==0) plot(U,u,ps="Uu.eps"); freefem++-3.38-1/examples++-mpi/schwarz-3.edp000644 000767 000024 00000004235 11745333166 020663 0ustar00hechtstaff000000 000000 /* to run : in a Shell. cut and past: cd /Users/hecht/work/freefem++/examples++-mpi mpirun -np 2 FreeFem++-mpi schwarz-3.edp -glut ffglut */ load "msh3" if ( mpisize != 2 ) { cout << " sorry number of processeur !=2 " << endl; exit(1);} verbosity=4; real pi=4*atan(1); int inside = 2; int outside = 1; real zmin =0, zmax=1; border a(t=1,2){x=t;y=0;label=outside;}; border b(t=0,1){x=2;y=t;label=outside;}; border c(t=2,0){x=t ;y=1;label=outside;}; border d(t=1,0){x = 1-t; y = t;label=inside;}; border e(t=0, pi/2){ x= cos(t); y = sin(t);label=inside;}; border e1(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=outside;}; int n=4; mesh th2,TH2; mesh3 th,TH; int[int] rup=[0,0], rdown=[0,0], rmid=[outside,outside,inside,inside];; if (mpirank == 0) { th2 = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)); th = buildlayers(th2,n, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); cout << " end th " << endl; } else { TH2 = buildmesh ( e(5*n) + e1(25*n) ); TH = buildlayers(TH2,n, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); cout << " end TH " << endl; } broadcast(processor(0),th); broadcast(processor(1),TH); fespace vh(th,P1); fespace VH(TH,P1); fespace ph(th,P1); fespace PH(TH,P1); vh u=0,v; VH U,V; ph chi=1; PH CHI=1; int i=0; problem PB(U,V,init=i,solver=CG) = int3d(TH)( dx(U)*dx(V)+dy(U)*dy(V) +dz(U)*dz(V)) + int3d(TH)( -V) + on(inside,U = u) + on(outside,U= 0 ) ; problem pb(u,v,init=i,solver=CG) = int3d(th)( dx(u)*dx(v)+dy(u)*dy(v)+dz(u)*dz(v) ) + int3d(th)( -v) + on(inside ,u = U) + on(outside,u = 0 ) ; for ( i=0 ;i< 10; i++) { cout << mpirank << " looP " << i << endl; if (mpirank == 0) { PB; processor(1) << U[]; processor(1) >> u[]; } else { pb; processor(0) << u[]; processor(0) >> U[]; } if (mpirank==0) plot(U,u,wait=1,fill=1); if(mpirank==0) { real ERR= int3d(TH)( square(U-u)*CHI*chi) ; cout << " ERR= " << ERR<< endl; } else { real err= int3d(th)( square(U-u)*CHI*chi) ; cout << " err= " << err<< endl; } }; if (mpirank==0) plot(U,u,ps="Uu.eps",fill=1); freefem++-3.38-1/examples++-mpi/schwarz-add-macro.idp000755 000767 000024 00000020247 12527570472 022362 0ustar00hechtstaff000000 000000 macro partition(meshName, borderName, overlapName, D, Vh, P, comm, s) meshName = trunc(overlapName, abs(part - mpiRank(comm)) < 0.1, label = 10); /* savemesh(meshName, "Th-0-" + mpirank + ".msh"); coefficients fespace Ph(meshName, P0); Ph poisson = skyscraper(x, y); load "iovtk" int[int] fforder=[1]; savevtk("SC-" + mpirank + ".vtk", meshName, poisson, dataname = "kappa", order = fforder); */ mpiBarrier(comm); real timerPartition = mpiWtime(); { /* PhGlobal overshoot = hTriangle; */ fespace PhLocal(meshName, P0); PhLocal overshoot = hTriangle; real max = 2. * overlap * overshoot[].max; bbN(meshName, max, overlapName) } /* mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "Bounding box: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); */ fespace VhGlobal(overlapName, P1); PhGlobal supp = abs(part - mpiRank(comm)) < 0.1; VhGlobal suppSmooth; AddLayers(overlapName, supp[], overlap * 2, suppSmooth[]); /* mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "AddLayers: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); */ { meshN neighbors = trunc(overlapName, suppSmooth > 0.001 && (suppSmooth < 2 * overlap - 0.001)); fespace Oh(neighbors, P0); Oh partOverlap = part; /*findDiff(partOverlap[], arrayIntersection);*/ Unique(partOverlap[], arrayIntersection); } /* mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "findDiff: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); */ fespace Vh(meshName, P1); Vh[int] partitionIntersection(arrayIntersection.n); /* plotAll(overlapName, suppSmooth[], "khi", P1, def1, 3) mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "Initialization: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); */ if(s > 1) { overlapName = trunc(overlapName, suppSmooth > 0.001, split = s); supp = abs(part - mpiRank(comm)) < 0.1; suppSmooth = 0; AddLayers(overlapName, supp[], overlap * 2, suppSmooth[]); } overlapName = trunc(overlapName, suppSmooth > overlap - 0.999); supp = supp; suppSmooth = suppSmooth; meshName = trunc(overlapName, suppSmooth > overlap + 0.001, label = 10); borderName = trunc(overlapName, (suppSmooth > overlap - 0.999) && (suppSmooth < overlap + 0.001), label = 20); if(0) { supp = abs(part - mpiRank(comm)) > 0.1; AddLayers(overlapName, supp[], overlap * 2, suppSmooth[]); overlapName = trunc(overlapName, suppSmooth > 0.001); suppSmooth = suppSmooth; part = part; } Vh khi = max(suppSmooth - overlap, 0.) / overlap; Vh sum = khi; VhGlobal phi = 0; varf vM(u, v) = intN(overlapName, qforder = 1)(u * v / measureN); matrix M = vM(PhGlobal, VhGlobal); /* mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "Localization: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); */ for(i = 0; i < arrayIntersection.n; ++i) { PhGlobal suppPartition = abs(arrayIntersection[i] - part) < 0.1; AddLayersMacro(M, PhGlobal, VhGlobal, suppPartition, overlap, phi[]) partitionIntersection[numberIntersection] = phi; sum[] += partitionIntersection[numberIntersection][]; arrayIntersection[numberIntersection++] = arrayIntersection[i]; } khi[] = khi[] ./= sum[]; if(solver != 3 && solver != 5) overlapName = minimalMesh; else overlapName = trunc(meshName, khi < 0.99); if(numberIntersection != arrayIntersection.n) arrayIntersection.resize(numberIntersection); Wh def(func2vec) = init(khi); D.resize(Wh.ndof); D = func2vec[]; /* DEBUG sum[] = khi[]; for(j = 0; j < numberIntersection; ++j) sum[] += partitionIntersection[j][]; assert(sum[].min > 1. - 1e-6 && sum[].max < 1. + 1e-6); mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "Neighbors: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); DEBUG */ /* savemesh(meshName, "Th-" + overlap + "-" + mpirank + ".msh"); */ restrictionIntersection.resize(numberIntersection); for(i = 0; i < numberIntersection; ++i) { meshN meshIntersection = trunc(meshName, partitionIntersection[i] > 1e-6); fespace WhIntersection(meshIntersection, P); matrix R = interpolate(WhIntersection, Wh); real[int] C; int[int] I; [I, restrictionIntersection[i], C] = R; restrictionIntersection[i].resize(R.nbcoef); /* int[int] n2o; meshN meshIntersection = trunc(meshName, partitionIntersection[i] > 1e-6, new2old = n2o); fespace WhIntersection(meshIntersection, P); restrictionIntersection[i] = restrict(WhIntersection, Wh, n2o); */ } /* mpiBarrier(comm); if(mpiRank(comm) == 0) cout << "Construction: " << mpiWtime() - timerPartition << endl; timerPartition = mpiWtime(); */ // EOM macro build(globalTh, Th, ThBorder, ThOverlap, D, numberIntersection, arrayIntersection, restrictionIntersection, Wh, P, comm, s) meshN Th = minimalMesh, ThOverlap, ThBorder; /*# partition #*/ int[int] arrayIntersection; fespace Wh(Th, P); int[int][int] restrictionIntersection(0); real[int] D; int numberIntersection = 0; real timing; { timing = mpiWtime(); if(mpisize > 1) { globalTh(ThOverlap); fespace PhGlobal(ThOverlap, P0); PhGlobal part=0; if(partitioner == 1 || partitioner == 2) { if(mpiRank(comm) == 0) { cout.scientific << " --- global mesh of " << ThOverlap.nt << " elements (prior to refinement) generated (in " << mpiWtime() - timing << ") and partitioned with "; timing = mpiWtime(); if(partitioner == 1) { metisdual(part[], ThOverlap, mpiSize(comm)); cout << "Metis"; } else if(partitioner == 2) { scotch(part[], ThOverlap, mpiSize(comm)); cout << "SCOTCH"; } cout.scientific << " (in " << mpiWtime() - timing << ")" << endl; } timing = mpiWtime(); broadcast(processor(0, comm), part[]); } partition(Th, ThBorder, ThOverlap, D, Vh, P, comm, s) } else if(mpisize == 1) { globalTh(Th); D.resize(Wh.ndof); D = 1.; /* coefficients fespace Ph(Th, P0); Ph poisson = skyscraper(x, y); load "iovtk" int[int] fforder=[1]; savevtk("SC.vtk", Th, poisson, dataname = "kappa", order = fforder); exit(1); */ } mpiBarrier(mpiCommWorld); if(mpirank == 0) cout.scientific << " --- partition of unity built (in " << mpiWtime() - timing << ")" << endl; } /*# partitionEnd #*/ // EOM macro assemble(K, rhs, Wh, Th, ThBorder, Varf) matrix K; { /* all memory of objects defined between this set of curly brackets will be freed when the closing bracket is reached */ meshN ThAugmented = Th + ThBorder; /* ⠶$\Omega^{\delta + 1}_k = \Omega^\delta_k \cup \left(\Omega^{\delta + 1}_k \setminus \Omega^{\delta}_k\right)$⠶ */ ThBorder = minimalMesh; Varf(vPb, ThAugmented, PhAugmented) fespace WhAugmented(ThAugmented, Pk); /* K = vPb(WhAugmented, WhAugmented, solver = CG); */ K = vPb(WhAugmented, WhAugmented); real[int] rhsFull = vPb(0, WhAugmented); matrix R = interpolate(Wh, WhAugmented); renumbering(K, R, rhsFull, rhs); } // EOM freefem++-3.38-1/examples++-mpi/schwarz-b.edp000644 000767 000024 00000003535 11745333166 020744 0ustar00hechtstaff000000 000000 // a new coding methode de schwarz // ------------------------------- // F.Hecht december 2003 // ---------------------------------- // to test the broadcast instruction // add add the stop test // --------------------------------- // NBPROC 2 if ( mpisize != 2 ) { cout << " sorry number of processeur !=2 " << endl; exit(1);} verbosity=3; real pi=4*atan(1); int inside = 2; int outside = 1; border a(t=1,2){x=t;y=0;label=outside;}; border b(t=0,1){x=2;y=t;label=outside;}; border c(t=2,0){x=t ;y=1;label=outside;}; border d(t=1,0){x = 1-t; y = t;label=inside;}; border e(t=0, pi/2){ x= cos(t); y = sin(t);label=inside;}; border e1(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=outside;}; int n=4; mesh Th0,Th1; if (mpirank == 0) Th0 = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)); else Th1 = buildmesh ( e(5*n) + e1(25*n) ); broadcast(processor(0),Th0); broadcast(processor(1),Th1); fespace Vh1(Th1,P1); fespace Vh0(Th0,P1); Vh0 u0,v0; Vh1 u1=0,v1; int i=0; problem pb0(u0,v0,init=i,solver=Cholesky) = int2d(Th0)( dx(u0)*dx(v0)+dy(u0)*dy(v0) ) + int2d(Th0)( -v0) + on(inside,u0 = u1) + on(outside,u0= 0 ) ; problem pb1(u1,v1,init=i,solver=Cholesky) = int2d(Th1)( dx(u1)*dx(v1)+dy(u1)*dy(v1) ) + int2d(Th1)( -v1) + on(inside ,u1 = u0) + on(outside,u1 = 0 ) ; for ( i=0 ;i< 20; i++) { cout << mpirank << " looP " << i << endl; if (mpirank == 0) pb0; else pb1; broadcast(processor(0),u0[]); broadcast(processor(1),u1[]); real err0,err1; if (mpirank == 0) err0 = int1d(Th0,inside)(square(u0-u1)) ; else err1= int1d(Th1,inside)(square(u0-u1)) ; broadcast(processor(0),err0); broadcast(processor(1),err1); real err= sqrt(err0+err1); cout <<" err = " << err << " err0 = " << err0 << ", err1 = " << err1 << endl; if(err<1e-3) break; }; if (mpirank==0) plot(u0,u1,ps="u0-u1.eps"); freefem++-3.38-1/examples++-mpi/schwarz-c.edp000644 000767 000024 00000003356 11745333166 020746 0ustar00hechtstaff000000 000000 // NBPROC 2 // a new coding methode de schwarz // with 2 proc. // ------------------------------- // F.Hecht december 2003 // ---------------------------------- // to test the broadcast instruction // and array of mesh // add add the stop test // --------------------------------- if ( mpisize != 2 ) { cout << " sorry, number of processors !=2 " << endl; exit(1);} verbosity=3; int interior = 2; int exterior = 1; border a(t=1,2){x=t;y=0;label=exterior;}; border b(t=0,1){x=2;y=t;label=exterior;}; border c(t=2,0){x=t ;y=1;label=exterior;}; border d(t=1,0){x = 1-t; y = t;label=interior;}; border e(t=0, pi/2){ x= cos(t); y = sin(t);label=interior;}; border e1(t=pi/2, 2*pi){ x= cos(t); y = sin(t);label=exterior;}; int n=4; mesh[int] Th(mpisize); if (mpirank == 0) Th[0] = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)); else Th[1] = buildmesh ( e(5*n) + e1(25*n) ); broadcast(processor(0),Th[0]); broadcast(processor(1),Th[1]); fespace Vh(Th[mpirank],P1); fespace Vhother(Th[1-mpirank],P1); Vh u=0,v; Vhother U=0; int i=0; problem pb(u,v,init=i,solver=Cholesky) = int2d(Th[mpirank])( dx(u)*dx(v)+dy(u)*dy(v) ) + int2d(Th[mpirank])( -v) + on(interior,u = U) + on(exterior,u= 0 ) ; for ( i=0 ;i< 20; i++) { cout << mpirank << " looP " << i << endl; pb; // send u to the other proc, receive in U processor(1-mpirank) << u[]; processor(1-mpirank) >> U[]; real err0,err1; err0 = int1d(Th[mpirank],interior)(square(U-u)) ; // send err0 to the other proc, receive in err1 processor(1-mpirank)<>err1; real err= sqrt(err0+err1); cout <<" err = " << err << " err0 = " << err0 << ", err1 = " << err1 << endl; if(err<1e-3) break; }; if (mpirank==0) plot(u,U,ps="uU.eps"); freefem++-3.38-1/examples++-mpi/schwarz-init.hpp000644 000767 000024 00000006616 12527616311 021503 0ustar00hechtstaff000000 000000 const char ds = 'S'; const char zs = 'G'; #ifdef SCHWARZ // Schwarz::add(); // zzzfff->Add("sschwarz", atype*>()); Schwarz::add(); zzzfff->Add("dschwarz", atype*>()); // Schwarz::add, zs>(); // zzzfff->Add("cschwarz", atype, zs>*>()); Schwarz::add, zs>(); zzzfff->Add("zschwarz", atype, zs>*>()); #ifdef WITH_PETSC int argc = pkarg->n; char** argv = new char*[argc]; for(int i = 0; i < argc; ++i) argv[i] = const_cast((*(*pkarg)[i].getap())->c_str()); PetscInitialize(&argc, &argv, 0, ""); delete [] argv; ff_atend(finalizePETSc); Dcl_Type(Initialize, Delete); Dcl_Type*>>(); zzzfff->Add("dmatrix", atype()); TheOperators->Add("<-", new OneOperator1_(initEmptyCSR)); TheOperators->Add("<-", new initCSR); TheOperators->Add("*", new OneOperator2*>, DistributedCSR*, KN*>(Build)); TheOperators->Add("=", new OneOperator2*, KN*, GMV*>>(GlobalMV)); Global.Add("set", "(", new setOptions()); Dcl_Type(); TheOperators->Add("^", new OneBinaryOperatorPETSc()); Dcl_Type*>>(); TheOperators->Add("*", new OneOperator2*>, DistributedCSR_inv, KN*>(Build)); TheOperators->Add("=", new OneOperator2*, KN*, Inv*>>(InvPETSc)); #endif #endif #if defined(BDD) // Substructuring::add(); // zzzfff->Add("sbdd", atype*>()); Substructuring::add(); zzzfff->Add("dbdd", atype*>()); // Substructuring::add, zs>(); // zzzfff->Add("cbdd", atype, zs>*>()); Substructuring::add, zs>(); zzzfff->Add("zbdd", atype, zs>*>()); #endif #if defined(FETI) // Substructuring::add(); // zzzfff->Add("sfeti", atype*>()); Substructuring::add(); zzzfff->Add("dfeti", atype*>()); // Substructuring::add, zs>(); // zzzfff->Add("cfeti", atype, zs>*>()); Substructuring::add, zs>(); zzzfff->Add("zfeti", atype, zs>*>()); #endif // Dcl_Type*>(InitP>, Destroy>); // zzzfff->Add("spair", atype*>()); Dcl_Type*>(InitP>, Destroy>); zzzfff->Add("dpair", atype*>()); // Dcl_Type>*>(InitP>>, Destroy>>); // zzzfff->Add("cpair", atype>*>()); Dcl_Type>*>(InitP>>, Destroy>>); zzzfff->Add("zpair", atype>*>()); freefem++-3.38-1/examples++-mpi/schwarz-macro.idp000644 000767 000024 00000016743 12527570472 021637 0ustar00hechtstaff000000 000000 load "msh3" load "metis" load "Element_P3" load "Element_P4" load "scotch" //load "utility" //load "removeDOF" load "schwarz" macro floating(meshName, VhName, vecName) varf floatingPb(def(u), def(v)) = on(1, BC(u, 1)); vecName = floatingPb(0, VhName); // EOM macro simple3d(Ph, function, comm, deltaX, deltaY, deltaZ) Ph xx = x / deltaX, yy = y / deltaY, zz = z / deltaZ; i = int(mpiSize(comm)^(0.333333333333333)); while(mpiSize(comm) % i != 0) --i; real trash = mpiSize(comm) / i; j = int(sqrt(trash)); while(trash % j != 0) --j; real k = int(trash / j); function = int(i * xx) * k * j + int(j * yy) * k + int(k * zz);// EOM macro simple2d(Ph, function, comm, deltaX, deltaY) Ph xx = x / deltaX, yy = y / deltaY; i = int(sqrt(mpiSize(comm))); while(mpiSize(comm) % i != 0) --i; j = mpiSize(comm) / i; function = int(j * xx) + int(i * yy) * j;// EOM macro bb2(boundingMesh, overshoot, ThGlobal) real[int] bb(4); boundingbox(bb, boundingMesh/*, intersection = possibleIntersection, offset = 2. * overlap / global*/); diam = sqrt((bb(1) - bb(0))^2 + (bb(3) - bb(2))^2); bb(0) -= overshoot; bb(1) += overshoot; bb(2) -= overshoot; bb(3) += overshoot; ThGlobal = trunc(ThGlobal, (x >= bb(0) && x <= bb(1) && y >= bb(2) && y <= bb(3)));// EOM macro bb3(boundingMesh, overshoot, ThGlobal) real[int] bb(6); boundingbox(bb, boundingMesh/*, intersection = possibleIntersection, offset = 2. * overlap / global*/); diam = sqrt((bb(1) - bb(0))^2 + (bb(3) - bb(2))^2 + (bb(5) - bb(4))^2); bb(0) -= overshoot; bb(1) += overshoot; bb(2) -= overshoot; bb(3) += overshoot; bb(4) -= overshoot; bb(5) += overshoot; ThGlobal = trunc(ThGlobal, (x >= bb(0) && x <= bb(1) && y >= bb(2) && y <= bb(3) && z >= bb(4) && z <= bb(5)));// EOM /*# visualization #*/ macro plotMPI(Th, u, legend, Pk, def, d, w) if(mpirank == 0) { meshN ThCurrent = Th; meshN[int] meshTab(mpisize); fespace Xh(ThCurrent, Pk); Xh[int] def(uTab)(mpisize); uTab[0][] = u[]; meshTab[0] = Th; mpiRequest[int] rq(mpisize - 1); for(i = 1; i < mpisize; ++i) Irecv(processor(i, mpiCommWorld, rq[i - 1]), meshTab[i]); for(i = 1; i < mpisize; ++i) mpiWaitAny(rq); for(i = 1; i < mpisize; ++i) { ThCurrent = meshTab[i]; Irecv(processor(i, mpiCommWorld, rq[i - 1]), uTab[i][]); } for(i = 1; i < mpisize; ++i) mpiWaitAny(rq); plot(uTab, wait = w, nbiso = 40, fill = 1, value = 1, dim = d, cmm = legend); } else { mpiRequest[int] rq(2); Isend(processor(0, rq[0]), Th); Isend(processor(0, rq[1]), u[]); mpiWait(rq[0]); mpiWait(rq[1]); }// EOM macro plotAll(Th, u, legend, Pk, def, d) if(mpirank == 0) { meshN ThCurrent = Th; meshN[int] meshTab(mpisize); fespace Xh(ThCurrent, Pk); Xh[int] def(uTab)(mpisize); uTab[0][] = u[]; meshTab[0] = Th; mpiRequest[int] rq(mpisize - 1); for(i = 1; i < mpisize; ++i) Irecv(processor(i, mpiCommWorld, rq[i - 1]), meshTab[i]); for(i = 1; i < mpisize; ++i) mpiWaitAny(rq); for(i = 1; i < mpisize; ++i) { ThCurrent = meshTab[i]; Irecv(processor(i, mpiCommWorld, rq[i - 1]), uTab[i][]); } for(i = 1; i < mpisize; ++i) mpiWaitAny(rq); for(i = 0; i < mpisize; ++i) plot(meshTab[i], uTab[i], wait = 1, nbiso = 40, fill = 1, value = 1, dim = d, cmm = legend + " (from " + i + ")"); } else { mpiRequest[int] rq(2); Isend(processor(0, rq[0]), Th); Isend(processor(0, rq[1]), u[]); mpiWait(rq[0]); mpiWait(rq[1]); }// EOM /*# visualizationEnd #*/ macro AddLayersMacro(M, Ph, Vh, ssd, n, unssd) unssd = 0; Vh u; for(j = 0; j < n; ++j) { u[] = M * ssd[]; u = u > .1; unssd += u[]; ssd[] = M' * u[]; ssd = ssd > 0.1; } unssd /= n;// EOM /* THE FOLLOWING IS PART OF THE FREEFEM++ DISTRIBUTION */ func bool AddLayers(meshN & Th, real[int] &ssd,int n,real[int] &unssd) { // build a continuous function uussd (P1) and modifies ssd : // IN: ssd in the caracteristics function on the input sub domain. // OUT: ssd and unssd // such that : // ssd is a boolean function // unssd is a smooth function // ssd = 1 when unssd >0; // add n layer of element (size of the overlap) // and unssd = 0 ouside of this layer ... // --------------------------------- fespace Vh(Th,P1); fespace Ph(Th,P0); Ph s; // assert(ssd.n==Ph.ndof); // assert(unssd.n==Vh.ndof); unssd=0; s[]= ssd; Vh u; varf vM(uuuu,v)=intN(Th,qforder=1)(uuuu*v/measureN); matrix M=vM(Ph,Vh); for(int i=0;i.1; unssd+= u[]; s[]= M'*u[]; s = s >0.1; } return true; } func int usedARGV(string after) { int ret=-1; for(int i=ARGV.n-1;i>=0;--i) if(ARGV[i]==after) { ret=++i; break;} if(ARGV.n0) d=atof(ARGV[k]); return d; } func int getARGV(string after,int default) { int d=default; int k=usedARGV(after); if(k>0) d=atoi(ARGV[k]); return d; } macro def1(i)i// EOM macro def2(i)[i, i#B]// EOM macro def3(i)[i, i#B, i#C]// EOM macro def4(i)[i, i#B, i#C, i#D]// EOM macro init1(i)i// EOM macro init2(i)[i, i]// EOM macro init3(i)[i, i, i]// EOM macro init4(i)[i, i, i, i]// EOM macro BC1(i, val)i = val// EOM macro BC2(i, val)i = val, i#B = val// EOM macro BC3(i, val)i = val, i#B = val, i#C = val// EOM macro BC4(i, val)i = val, i#B = val, i#C = val, i#D = val// EOM searchMethod = 1; /*# initialization #*/ verbosity = getARGV("-v", 0); // the higher this value, the more verbose ⠶\tt FreeFem++⠶ is int s = getARGV("-split", 1); // refinement factor of each local meshes int global = getARGV("-global", 20); // global number of discretization points in one direction int solver = getARGV("-solver", 3); // 1: Additive Schwarz+CG, 2: RAS+GMRES, 3:RGENEO+GMRES, 4: in progress int partitioner = getARGV("-partitioner", 1); // usage of a partitioner 0: regular , 1: Metis, 2: Scotch int i, j; real diam; real[int] stats(5); /*# initializationEnd #*/ macro rectangle(A, l, L, lab1, lab2, lab3, lab4, N, M) border A#1(t=0, l) { x=t; y=0; label=lab1; } border A#2(t=0., L) { x=l.; y=t; label=lab2; } border A#3(t=l,0) { x=t; y=L; label=lab3; } border A#4(t=L,0) { x=0; y=t; label=lab4; } func A = A#1(N) + A#2(M) + A#3(N)+A#4(M);// EOM func mesh3 Cube(int[int] & NN,real[int,int] &BB ,int[int,int] & L) { // first build the 6 faces of the hex. real x0=BB(0,0),x1=BB(0,1); real y0=BB(1,0),y1=BB(1,1); real z0=BB(2,0),z1=BB(2,1); int nx=NN[0],ny=NN[1],nz=NN[2]; mesh Thx = square(nx,ny,[x0+(x1-x0)*x,y0+(y1-y0)*y]); int[int] rup=[0,L(2,1)], rdown=[0,L(2,0)], rmid=[1,L(1,0), 2,L(0,1), 3, L(1,1), 4, L(0,0) ]; mesh3 Th=buildlayers(Thx,nz, zbound=[z0,z1], labelmid=rmid, labelup = rup, labeldown = rdown); return Th; } include "schwarz-add-macro.idp"freefem++-3.38-1/examples++-mpi/schwarz.cpp000644 000767 000024 00000062163 12535520347 020536 0ustar00hechtstaff000000 000000 #ifndef _ALL_IN_ONE_ #include //ff-c++-LIBRARY-dep: cxx11 hpddm [petsc|mumps parmetis ptscotch scotch] umfpack amd scalapack blas [mkl] mpifc fc mpi pthread //ff-c++-cpp-dep: // mumps est avec petsc .. #define SCHWARZ #ifdef WITH_mumps #define MUMPSSUB #define DMUMPS #endif #ifdef WITH_mkl #include #define MKL_Complex16 std::complex #define MKL_Complex8 std::complex #define MKL_INT int #include #endif #ifndef WITH_petsc #pragma message("schwarz plugin compile without PETSc") #else #define WITH_PETSC #define MUMPSSUB #define DMUMPS #endif #include #include #include "AFunction_ext.hpp" #ifdef BDD #undef BDD #endif #ifdef FETI #undef FETI #endif #include template class STL { T* const _it; const int _size; public: STL(const KN& v) : _it(v), _size(v.size()) { }; int size() const { return _size; } T* begin() const { return _it; } T* end() const { return _it + _size; } }; template class Pair { public: Pair() : p() { }; std::pair* p; void init() { } void destroy() { } }; #ifdef WITH_PETSC #include "PETSc.hpp" #endif #endif namespace Schwarz { template class initDDM_Op : public E_F0mps { public: Expression A; Expression Mat; Expression o; Expression R; static const int n_name_param = 3; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; initDDM_Op(const basicAC_F0& args, Expression param1, Expression param2, Expression param3, Expression param4) : A(param1), Mat(param2), o(param3), R(param4) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type initDDM_Op::name_param[] = { {"communicator", &typeid(pcommworld)}, {"scaling", &typeid(KN::ul_type>*)}, {"deflation", &typeid(FEbaseArrayKn*)} }; template class initDDM : public OneOperator { public: initDDM() : OneOperator(atype(), atype(), atype*>(), atype*>(), atype>*>()) { } E_F0* code(const basicAC_F0& args) const { return new initDDM_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3])); } }; template AnyType initDDM_Op::operator()(Stack stack) const { Type* ptA = GetAny((*A)(stack)); MatriceMorse* mA = static_cast*>(&(*GetAny*>((*Mat)(stack))->A)); KN* ptO = GetAny*>((*o)(stack)); KN>* ptR = GetAny>*>((*R)(stack)); MPI_Comm* comm = nargs[0] ? (MPI_Comm*)GetAny((*nargs[0])(stack)) : 0; if(ptO && mA) { HPDDM::MatrixCSR* dA = new HPDDM::MatrixCSR(mA->n, mA->m, mA->nbcoef, mA->a, mA->lg, mA->cl, mA->symetrique); ptA->HPDDM::template Subdomain::initialize(dA, STL(*ptO), *ptR, comm); } FEbaseArrayKn* deflation = nargs[2] ? GetAny*>((*nargs[2])(stack)) : 0; K** const& v = ptA->getVectors(); if(deflation && deflation->N > 0 && !v) { K** ev = new K*[deflation->N]; *ev = new K[deflation->N * deflation->get(0)->n]; for(int i = 0; i < deflation->N; ++i) { ev[i] = *ev + i * deflation->get(0)->n; std::copy(&(*deflation->get(i))[0], &(*deflation->get(i))[deflation->get(i)->n], ev[i]); } ptA->setVectors(ev); ptA->Type::super::initialize(deflation->N); } KN::ul_type>* ptD = nargs[1] ? GetAny::ul_type>*>((*nargs[1])(stack)) : 0; if(ptD) ptA->initialize(*ptD); else std::cerr << "Something is really wrong here !" << std::endl; return ptA; } template class attachCoarseOperator_Op : public E_F0mps { public: Expression comm; Expression A; static const int n_name_param = 8; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; attachCoarseOperator_Op(const basicAC_F0& args, Expression param1, Expression param2) : comm(param1), A(param2) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type attachCoarseOperator_Op::name_param[] = { {"A", &typeid(Matrice_Creuse*)}, {"B", &typeid(Matrice_Creuse*)}, {"pattern", &typeid(Matrice_Creuse*)}, {"threshold", &typeid(typename HPDDM::Wrapper::ul_type)}, {"parameters", &typeid(KN*)}, {"timing", &typeid(KN*)}, {"ret", &typeid(Pair*)}, {"solver", &typeid(long)} }; template class attachCoarseOperator : public OneOperator { public: attachCoarseOperator() : OneOperator(atype(), atype(), atype()) { } E_F0* code(const basicAC_F0& args) const { return new attachCoarseOperator_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1])); } }; template AnyType attachCoarseOperator_Op::operator()(Stack stack) const { pcommworld ptComm = GetAny((*comm)(stack)); MPI_Comm comm = *(MPI_Comm*)ptComm; Type* ptA = GetAny((*A)(stack)); MatriceMorse* mA = nargs[0] ? static_cast*>(&(*GetAny*>((*nargs[0])(stack))->A)) : 0; KN* ptParm = nargs[4] ? GetAny*>((*nargs[4])(stack)) : 0; if(ptParm && ptParm->n != 5) { if(ptParm->n == 1) { ptParm->resize(5); (*ptParm)[HPDDM::P] = 1; } else if(ptParm->n == 2) ptParm->resize(5); else cout << "Input array must be of size 1, 2, or 5 !" << endl; if(ptParm->n == 5) { (*ptParm)[HPDDM::TOPOLOGY] = 0; (*ptParm)[HPDDM::DISTRIBUTION] = HPDDM::DMatrix::NON_DISTRIBUTED; (*ptParm)[HPDDM::STRATEGY] = 3; } } KN* timing = nargs[5] ? GetAny*>((*nargs[5])(stack)) : 0; Pair* pair = nargs[6] ? GetAny*>((*nargs[6])(stack)) : 0; typename HPDDM::Wrapper::ul_type threshold = nargs[3] ? GetAny::ul_type>((*nargs[3])(stack)) : 0; std::vector parm(5); if(ptParm) { parm[HPDDM::P] = (*ptParm)[HPDDM::P]; parm[HPDDM::TOPOLOGY] = (*ptParm)[HPDDM::TOPOLOGY]; parm[HPDDM::DISTRIBUTION] = (*ptParm)[HPDDM::DISTRIBUTION]; parm[HPDDM::STRATEGY] = (*ptParm)[HPDDM::STRATEGY]; } else { parm[HPDDM::P] = 1; parm[HPDDM::TOPOLOGY] = 0; parm[HPDDM::DISTRIBUTION] = HPDDM::DMatrix::NON_DISTRIBUTED; parm[HPDDM::STRATEGY] = 3; } unsigned short nu = ptParm ? (*ptParm)[HPDDM::NU] : 20; nu = std::max(nu, static_cast(1)); std::pair* ret = nullptr; double t; if(mA || nargs[7]) { long nbSolver = nargs[7] ? GetAny((*nargs[7])(stack)) : 0; std::vector*> vecAIJ; if(mA) { HPDDM::MatrixCSR dA(mA->n, mA->m, mA->nbcoef, mA->a, mA->lg, mA->cl, mA->symetrique); MatriceMorse* mB = nargs[1] ? static_cast*>(&(*GetAny*>((*nargs[1])(stack))->A)) : nullptr; MatriceMorse* mP = nargs[2] ? static_cast*>(&(*GetAny*>((*nargs[2])(stack))->A)) : nullptr; t = MPI_Wtime(); if(dA._n == dA._m) { const HPDDM::MatrixCSR* const dP = mP ? new HPDDM::MatrixCSR(mP->n, mP->m, mP->nbcoef, mP->a, mP->lg, mP->cl, mP->symetrique) : nullptr; if(mB) { HPDDM::MatrixCSR dB(mB->n, mB->m, mB->nbcoef, mB->a, mB->lg, mB->cl, mB->symetrique); ptA->template solveGEVP(&dA, nu, threshold, &dB, dP); } else ptA->template solveGEVP(&dA, nu, threshold, nullptr, dP); mA->nbcoef = dA._nnz; mA->a = dA._a; mA->lg = dA._ia; mA->cl = dA._ja; delete dP; } else { vecAIJ.emplace_back(&dA); nbSolver = 101; } } else { ptA->template interaction(vecAIJ); std::sort(vecAIJ.begin(), vecAIJ.end(), [](const HPDDM::MatrixCSR* lhs, const HPDDM::MatrixCSR* rhs) { return lhs->_m > rhs->_m; }); nbSolver = 100; } if(nbSolver != 0) { ptA->callNumfact(); if(!vecAIJ.empty()) { int dof = ptA->getDof(); HPDDM::Eigensolver solver(dof); const HPDDM::MatrixCSR& first = *vecAIJ.front(); nu = std::min(nu, static_cast(first._m)); K** ev = new K*[nu]; *ev = new K[nu * dof]; for(int i = 0; i < nu; ++i) ev[i] = *ev + i * dof; ptA->setVectors(ev); ptA->Type::super::initialize(nu); int lwork = solver.workspace("S", &first._m); K* a; typename HPDDM::Wrapper::ul_type* values; if(!std::is_same::ul_type>::value) { a = new K[first._m * (2 * dof + first._m) + lwork]; values = new typename HPDDM::Wrapper::ul_type[nu + first._m + std::max(1, first._m * std::max(5 * first._m + 7, 2 * dof + 2 * first._m + 1))]; } else { a = new K[first._m * (2 * dof + first._m + 1) + lwork + nu]; values = reinterpret_cast::ul_type*>(a + first._m * (2 * dof + first._m) + lwork); } int* pos = new int[nu + 8 * first._m]; std::fill(pos, pos + nu, 0); std::fill(values, values + nu, 0.0); for(const HPDDM::MatrixCSR* A : vecAIJ) { K* u = a + dof * A->_m; K* vt = u + dof * A->_m; K* work = vt + A->_m * A->_m; typename HPDDM::Wrapper::ul_type* s = values + nu; typename HPDDM::Wrapper::ul_type* rwork = s + A->_m; std::fill(a, a + A->_m * dof, K(0.0)); for(int i = 0; i < dof; ++i) for(int j = A->_ia[i]; j < A->_ia[i + 1]; ++j) a[i + A->_ja[j] * dof] = A->_a[j]; ptA->Type::super::callSolve(a, A->_m); solver.svd("S", &(A->_m), a, s, u, vt, work, &lwork, pos + nu, rwork); for(unsigned int i = 0, j = 0, k = 0; k < nu; ++k) { if(s[i] > values[j]) pos[k] = ++i; else pos[k] = -(++j); } for(unsigned int i = nu - 1; i > 0; ) { if(pos[i] < 0) { unsigned int j = i; while(j > 0 && pos[j - 1] < 0) --j; std::copy_backward(values - pos[j] - 1, values - pos[i], values + i + 1); std::copy_backward(ev[-pos[j] - 1], ev[-pos[i] - 1] + dof, ev[i] + dof); i = std::max(j, 1u) - 1; } else --i; } for(unsigned int i = 0; i < nu; ) { if(pos[i] > 0) { unsigned int j = i; while(j < nu - 1 && pos[j + 1] > 0) ++j; std::copy(s + pos[i] - 1, s + pos[j], values + i); std::copy(u + (pos[i] - 1) * dof, u + pos[j] * dof, ev[i]); i = j + 1; } else ++i; } } delete [] pos; if(!std::is_same::ul_type>::value) delete [] values; delete [] a; ptA->Type::super::initialize(nu); if(nbSolver == 100) std::for_each(vecAIJ.begin(), vecAIJ.end(), std::default_delete>()); } else ptA->Type::super::initialize(0); } if(timing) (*timing)[3] = MPI_Wtime() - t; parm[HPDDM::NU] = nu; MPI_Barrier(MPI_COMM_WORLD); if(timing) t = MPI_Wtime(); if(ptA->exclusion(comm)) { if(pair) pair->p = ptA->template buildTwo<1>(comm, parm); else ret = ptA->template buildTwo<1>(comm, parm); } else { if(pair) pair->p = ptA->template buildTwo<0>(comm, parm); else ret = ptA->template buildTwo<0>(comm, parm); } if(timing) (*timing)[4] = MPI_Wtime() - t; } else { MPI_Barrier(MPI_COMM_WORLD); if(!threshold) { parm[HPDDM::NU] = nu; ret = ptA->template buildTwo<2>(comm, parm); } } if(ret) delete ret; return 0L; } template class solveDDM_Op : public E_F0mps { public: Expression A; Expression x; Expression rhs; static const int n_name_param = 9; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; solveDDM_Op(const basicAC_F0& args, Expression param1, Expression param2, Expression param3) : A(param1), x(param2), rhs(param3) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type solveDDM_Op::name_param[] = { {"eps", &typeid(typename HPDDM::Wrapper::ul_type)}, {"dim", &typeid(long)}, {"iter", &typeid(long)}, {"timing", &typeid(KN*)}, {"solver", &typeid(long)}, {"pipelined", &typeid(long)}, {"excluded", &typeid(bool)}, {"ret", &typeid(Pair*)}, {"O", &typeid(Matrice_Creuse*)} }; template class solveDDM : public OneOperator { public: solveDDM() : OneOperator(atype(), atype(), atype*>(), atype*>()) { } E_F0* code(const basicAC_F0& args) const { return new solveDDM_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2])); } }; template AnyType solveDDM_Op::operator()(Stack stack) const { KN* ptX = GetAny*>((*x)(stack)); KN* ptRHS = GetAny*>((*rhs)(stack)); Type* ptA = GetAny((*A)(stack)); if(ptX->n != ptRHS->n || ptRHS->n < ptA->getDof()) return 0L; typename HPDDM::Wrapper::ul_type eps = nargs[0] ? GetAny::ul_type>((*nargs[0])(stack)) : 1e-8; unsigned short dim = nargs[1] ? GetAny((*nargs[1])(stack)) : 50; unsigned short iter = nargs[2] ? GetAny((*nargs[2])(stack)) : 50; KN* timing = nargs[3] ? GetAny*>((*nargs[3])(stack)) : 0; long solver = nargs[4] ? GetAny((*nargs[4])(stack)) : 0; Pair* pair = nargs[7] ? GetAny*>((*nargs[7])(stack)) : 0; if(solver >= 0 && pair) if(pair->p) { int flag; MPI_Test(&(pair->p->first), &flag, MPI_STATUS_IGNORE); } MatriceMorse* mA = nargs[8] ? static_cast*>(&(*GetAny*>((*nargs[8])(stack))->A)) : 0; double timer = MPI_Wtime(); if(solver >= 0) { ptA->setType(solver == 1 || solver == 6 || solver == 11 || solver == 36); if(mpisize > 1 && (mA && (solver == 6 || solver == 8 || solver == 36))) { HPDDM::MatrixCSR dA(mA->n, mA->m, mA->nbcoef, mA->a, mA->lg, mA->cl, mA->symetrique); ptA->callNumfact(&dA); } else if((solver != 100 && solver != 101) || ((solver == 100 || solver == 101) && mpisize == 1)) ptA->callNumfact(nullptr); if(timing) (*timing)[1] = MPI_Wtime() - timer; } long pipelined = nargs[5] ? GetAny((*nargs[5])(stack)) : 0; bool excluded = nargs[6] ? GetAny((*nargs[6])(stack)) : false; if(pair) if(pair->p) { if(timing) timer = MPI_Wtime(); MPI_Wait(&(pair->p->first), MPI_STATUS_IGNORE); if(timing) (*timing)[timing->n - 1] = MPI_Wtime() - timer; delete [] pair->p->second; delete pair->p; timer = MPI_Wtime(); } MPI_Barrier(MPI_COMM_WORLD); if(solver >= 0 && !excluded && pair && pair->p && timing && mpisize > 1) (*timing)[timing->n - 1] += MPI_Wtime() - timer; timer = MPI_Wtime(); unsigned short mu = ptX->n / ptA->getDof(); MPI_Allreduce(MPI_IN_PLACE, &mu, 1, MPI_UNSIGNED_SHORT, MPI_MAX, ptA->getCommunicator()); int rank; MPI_Comm_rank(ptA->getCommunicator(), &rank); if(!excluded) { if(std::abs(solver) == 1) HPDDM::IterativeMethod::CG(*ptA, (K*)*ptX, (K*)*ptRHS, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); else switch(pipelined) { #if (OMPI_MAJOR_VERSION > 1 || (OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 7)) || MPICH_NUMVERSION >= 30000000 case 1: HPDDM::IterativeMethod::GMRES(*ptA, (K*)*ptX, (K*)*ptRHS, mu, dim, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); break; #endif #if defined(DPASTIX) || defined(DMKL_PARDISO) case 2: HPDDM::IterativeMethod::GMRES(*ptA, (K*)*ptX, (K*)*ptRHS, mu, dim, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); break; #endif default: HPDDM::IterativeMethod::GMRES(*ptA, (K*)*ptX, (K*)*ptRHS, mu, dim, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); break; } } else { if(std::abs(solver) == 1) HPDDM::IterativeMethod::CG(*ptA, (K*)nullptr, (K*)nullptr, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); else switch(pipelined) { #if (OMPI_MAJOR_VERSION > 1 || (OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 7)) || MPICH_NUMVERSION >= 30000000 case 1: HPDDM::IterativeMethod::GMRES(*ptA, (K*)nullptr, (K*)nullptr, mu, dim, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); break; #endif #if defined(DPASTIX) || defined(DMKL_PARDISO) case 2: HPDDM::IterativeMethod::GMRES(*ptA, (K*)nullptr, (K*)nullptr, mu, dim, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); break; #endif default: HPDDM::IterativeMethod::GMRES(*ptA, (K*)nullptr, (K*)nullptr, mu, dim, iter, eps, MPI_COMM_WORLD, rank == 0 && !excluded ? 1 : 0); break; } } timer = MPI_Wtime() - timer; if(!excluded) { if(rank == 0) std::cout << scientific << " --- system solved (in " << timer << ")" << std::endl; typename HPDDM::Wrapper::ul_type* storage = new typename HPDDM::Wrapper::ul_type[2 * mu]; ptA->computeError(*ptX, *ptRHS, storage, mu); if(rank == 0) { std::cout << scientific << " --- error = " << storage[1] << " / " << storage[0]; for(unsigned short nu = 1; nu < mu; ++nu) std::cout << " (rhs #" << nu << ")" << std::endl << scientific << " " << storage[2 * nu + 1] << " / " << storage[2 * nu]; if(mu > 1) std::cout << " (rhs #" << mu << ")"; std::cout << std::endl; } delete [] storage; } return 0L; } template class changeOperator_Op : public E_F0mps { public: Expression A; Expression mat; static const int n_name_param = 0; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; changeOperator_Op(const basicAC_F0& args, Expression param1, Expression param2) : A(param1), mat(param2) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; template basicAC_F0::name_and_type changeOperator_Op::name_param[] = { }; template class changeOperator : public OneOperator { public: changeOperator() : OneOperator(atype(), atype(), atype*>()) { } E_F0* code(const basicAC_F0& args) const { return new changeOperator_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1])); } }; template AnyType changeOperator_Op::operator()(Stack stack) const { MatriceMorse* mN = static_cast*>(&(*GetAny*>((*mat)(stack))->A)); HPDDM::MatrixCSR* dN = new HPDDM::MatrixCSR(mN->n, mN->m, mN->nbcoef, mN->a, mN->lg, mN->cl, mN->symetrique); Type* ptA = GetAny((*A)(stack)); ptA->setMatrix(dN); return 0L; } class distributedDot_Op : public E_F0mps { public: Expression A; Expression in; Expression out; static const int n_name_param = 1; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; distributedDot_Op(const basicAC_F0& args, Expression param1, Expression param2, Expression param3) : A(param1), in(param2), out(param3) { args.SetNameParam(n_name_param, name_param, nargs); } AnyType operator()(Stack stack) const; }; basicAC_F0::name_and_type distributedDot_Op::name_param[] = { {"communicator", &typeid(pcommworld)} }; class distributedDot : public OneOperator { public: distributedDot() : OneOperator(atype(), atype*>(), atype*>(), atype*>()) { } E_F0* code(const basicAC_F0& args) const { return new distributedDot_Op(args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2])); } }; AnyType distributedDot_Op::operator()(Stack stack) const { KN* pA = GetAny*>((*A)(stack)); KN* pin = GetAny*>((*in)(stack)); KN* pout = GetAny*>((*out)(stack)); MPI_Comm* comm = nargs[0] ? (MPI_Comm*)GetAny((*nargs[0])(stack)) : 0; double* tmp = new double[pin->n]; HPDDM::Wrapper::diag(pin->n, *pA, *pin, tmp); KN_ KN(tmp, pin->n); double dot = (KN, *pout); MPI_Allreduce(MPI_IN_PLACE, &dot, 1, MPI_DOUBLE, MPI_SUM, comm ? *((MPI_Comm*)comm) : MPI_COMM_WORLD); delete [] tmp; return dot; } template class GMV { public: const T t; const U u; GMV(T v, U w) : t(v), u(w) {} void prod(U x) const; }; template class GMV { public: const Type* t; const U u; GMV(Type* v, U w) : t(v), u(w) {} void prod(U x) const { t->GMV(*(this->u), *x); }; }; template R Build(A a, B b) { return R(a, b); } template KN* GlobalMV(KN* Ax, GMV*> A) { A.prod(Ax); return Ax; } #ifdef DEBUG_SCHWARZ template long InitDDM(Type* const& A) { A->setType(true); A->callNumfact(); return 0; } template long ApplyAS(Type* const& A, KN* const& in, KN* const& out) { A->apply(*in, *out); return 0; } #endif template class Type, class K, char S> void add() { Dcl_Type*>(Initialize>, Delete>); TheOperators->Add("<-", new initDDM, K>); Global.Add("attachCoarseOperator", "(", new attachCoarseOperator, K>); Global.Add("DDM", "(", new solveDDM, K>); Global.Add("changeOperator", "(", new changeOperator, K>); Dcl_Type*, KN*>>(); TheOperators->Add("*", new OneOperator2*, KN*>, Type*, KN*>(Build)); TheOperators->Add("=", new OneOperator2*, KN*, GMV*, KN*>>(GlobalMV)); if(std::is_same::value) Global.Add("dscalprod", "(", new distributedDot); #ifdef DEBUG_SCHWARZ Global.Add("initPreconditioner", "(", new OneOperator1_*>(InitDDM)); Global.Add("precond", "(", new OneOperator3_*, KN*, KN*>(ApplyAS)); #endif } } #ifndef _ALL_IN_ONE_ static void Init_Schwarz() { #include "schwarz-init.hpp" } LOADFUNC(Init_Schwarz) #endif freefem++-3.38-1/examples++-mpi/schwarz.edp000644 000767 000024 00000004417 12527570472 020527 0ustar00hechtstaff000000 000000 load "schwarz" load "metis" //load "utility" //load "removeDOF" include "getARGV.idp" {int tyty; if(mpirank==-1) cin >> tyty;} searchMethod = 1; macro minimalMesh()square(1, 1)// EOM macro generateTh(name)name = square(global, global, [x, y], label = l);// EOM macro grad(u)[dx(u), dy(u)]// EOM macro bbN(boundingMesh, overshoot, ThGlobal) real[int] bb(4); boundingbox(bb, boundingMesh/*, intersection = possibleIntersection, offset = 2. * overlap / global*/); bb(0) -= overshoot; bb(1) += overshoot; bb(2) -= overshoot; bb(3) += overshoot; ThGlobal = trunc(ThGlobal, (x >= bb(0) && x <= bb(1) && y >= bb(2) && y <= bb(3)));// EOM macro meshN()mesh// EOM macro intN()int2d// EOM macro measureN()area// EOM macro def(u)u// EOM macro init(u)u// EOM include "additional.idp" int overlap = getARGV("-overlap", 1); func Pk = P1; verbosity = getARGV("-v", 0); int s = getARGV("-split", 1); int global = getARGV("-global", 200); int solver = getARGV("-solver", 3); // 1: Additive Schwarz + CG, 2: RAS + GMRES, 3: GENEO + GMRES int i, j; int[int] l = [1, 2, 2, 2]; mesh Th = minimalMesh; fespace Wh(Th, Pk); build(generateTh, Th, ThBorder, ThOverlap, s, D, numberIntersection, arrayIntersection, restrictionIntersection, Wh, Pk, mpiCommWorld) // verif .. macro Varf(varfName, meshName, PhName) varf varfName(u, v) = intN(meshName)((grad(u)' * grad(v))) + intN(meshName)(v) + on(1, u = 0.0);// EOM assemble(Mat, rhs, Wh, Th, ThBorder, Varf) dschwarz A(Mat, arrayIntersection, restrictionIntersection, scaling = D); if(mpisize > 1 && solver == 3) { int[int] parm(1); parm(0) = getARGV("-nu", 20); macro EVproblem(varfName, meshName, PhName) varf varfName(u, v) = intN(meshName)((grad(u)' * grad(v))) + on(1, u = 0.0);// EOM EVproblem(vPbNoPen, Th, Ph) matrix noPen = vPbNoPen(Wh, Wh, solver = CG); if(solver == 3) // standard GenEO, no need for RHS -> deduced from LHS (Neumann matrix) attachCoarseOperator(mpiCommWorld, A, A = noPen, parameters = parm); } Wh def(u); // this will be the solution DDM(A, u[], rhs, dim = getARGV("-gmres_restart", 60), iter = getARGV("-iter", 60), eps = getARGV("-eps", 1e-8), solver = solver); plotMPI(Th, u[], "Global solution", Pk, def, 3, 1) freefem++-3.38-1/examples++-mpi/stokes-2d.edp000755 000767 000024 00000003524 12527570472 020662 0ustar00hechtstaff000000 000000 load "schwarz" load "metis" //load "utility" include "getARGV.idp" searchMethod = 1; macro minimalMesh()square(1, 1)// EOM macro grad(u)[dx(u), dy(u)]// EOM macro bbN(boundingMesh, overshoot, ThGlobal) real[int] bb(4); boundingbox(bb, boundingMesh); bb(0) -= overshoot; bb(1) += overshoot; bb(2) -= overshoot; bb(3) += overshoot; ThGlobal = trunc(ThGlobal, (x >= bb(0) && x <= bb(1) && y >= bb(2) && y <= bb(3)));// EOM macro meshN()mesh// EOM macro intN()int2d// EOM macro measureN()area// EOM macro def(u)[u, u#B, u#C]// EOM macro init(u)[u, u, u]// EOM include "additional.idp" int overlap = getARGV("-overlap", 1); func Pk = [P2, P2, P0]; verbosity = getARGV("-v", 0); int s = getARGV("-split", 1); int global = getARGV("-global", 200); int solver = getARGV("-solver", 3); // 1: Additive Schwarz + CG, 2: RAS + GMRES, 3: GENEO + GMRES int i, j; real Sqrt = sqrt(2.); macro epsilon(u)[dx(u), dy(u#B), (dy(u) + dx(u#B)) / Sqrt]// EOM macro div(u)(dx(u) + dy(u#B))// EOM mesh ThGlobal = square(getARGV("-global", 20), getARGV("-global", 20), [x, y]); ThGlobal = trunc(ThGlobal, (x < 0.5) || (y < 0.5), label = 5); mesh Th = movemesh(ThGlobal, [-x, y]); ThGlobal = ThGlobal + Th; macro generateTh(name)name = ThGlobal;// EOM fespace Wh(Th, Pk); build(generateTh, Th, ThBorder, ThOverlap, s, D, numberIntersection, arrayIntersection, restrictionIntersection, Wh, Pk, mpiCommWorld) varf vPb([u, uB, p], [v, vB, q]) = intN(Th)(grad(u)' * grad(v) + grad(uB)' * grad(vB) - div(u) * q - div(v) * p + 1e-10 * p * q) + on(1, 3, 5, u = 0, uB = 0) + on(2, u = y*(0.5-y), uB = 0); matrix K = vPb(Wh, Wh); real[int] rhs = vPb(0, Wh); dmatrix Mat(K, arrayIntersection, restrictionIntersection, D, bs = 1); Wh def(b); b[] = Mat^-1 * rhs; plotMPI(Th, b[], "Global solution PETSc", Pk, def, 3, 1); freefem++-3.38-1/examples++-mpi/Stokes-v1-matrix-mumps.edp000644 000767 000024 00000004317 12467066727 023310 0ustar00hechtstaff000000 000000 /* to change locatation of daynamic lib. set freefem++.pref file like : more freefem++.pref loadpath = "../examples++-load/" loadpath += "./" */ load "msh3" //load "medit" load "MUMPS_FreeFem" include "getARGV.idp" verbosity=0; real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; int nn=getARGV("-n",15); int pplot=getARGV("-plot",0); mesh Th2=square(nn,nn); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); fespace VVh(Th,[P2,P2,P2,P1]); fespace UUh(Th,[P2,P2,P2]); fespace Uh(Th,P2); fespace Ph(Th,P1); macro Grad(u) [dx(u),dy(u),dz(u)]// EOM macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM func fup = (1-x)*(x)*y*(1-y)*16; VVh [u1,u2,u3,p]; VVh [v1,v2,v3,q]; real timeI=mpiWtime(); real time1=mpiWtime(); varf vStokes([u1,u2,u3,p],[v1,v2,v3,q]) = int3d(Th,qforder=3)( Grad(u1)'*Grad(v1) + Grad(u2)'*Grad(v2) + Grad(u3)'*Grad(v3) //' for emacs - div(u1,u2,u3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,u1=fup,u2=0,u3=0) + on(1,u1=0,u2=0,u3=0) ; matrix MStokes=vStokes(VVh,VVh,tgv=ttgv); cout << "size of matrix " << MStokes.n << " x " << MStokes.m << " nn nzero coef = " << MStokes.nbcoef << endl; time1=mpiWtime()-time1; real timeF=mpiWtime(); set(MStokes,solver=sparsesolver,tgv=ttgv,sparams=ssparams); timeF=mpiWtime()-timeF; real time2=mpiWtime(); real[int] b=vStokes(0,VVh); time2=mpiWtime()-time2; real time3=mpiWtime(); u1[] = MStokes^-1*b; time3=mpiWtime()-time3; timeI=mpiWtime()-timeI; cout << "============= CPU TIME ============" << endl; cout << "size of matrix " << MStokes.n << " x " << MStokes.m << " nn nzero coef = " << MStokes.nbcoef << endl; cout << " matrix " << time1 << endl; cout << " Fact " << timeF << endl; cout << " second member " << time2 << endl; cout << " solve " << time3 << endl; cout << " ------------" << endl; cout << " all " << timeI << endl; cout << "============= CPU TIME ============" << endl; //if(mpirank==0 && pplot) medit("UV2 PV2",Th,[u1,u2,u3],p); freefem++-3.38-1/examples++-mpi/Stokes-v1-matrix-pastix.edp000644 000767 000024 00000003355 12163101722 023432 0ustar00hechtstaff000000 000000 // other load "msh3" load "medit" load "real_pastix_FreeFem" real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; int nn=10; mesh Th2=square(nn,nn); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); fespace VVh(Th,[P2,P2,P2,P1]); fespace UUh(Th,[P2,P2,P2]); fespace Uh(Th,P2); fespace Ph(Th,P1); macro Grad(u) [dx(u),dy(u),dz(u)]// EOM macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM func fup = (1-x)*(x)*y*(1-y)*16; VVh [u1,u2,u3,p]; VVh [v1,v2,v3,q]; real timeI=clock(); real time1=clock(); varf vStokes([u1,u2,u3,p],[v1,v2,v3,q]) = int3d(Th,qforder=3)( Grad(u1)'*Grad(v1) + Grad(u2)'*Grad(v2) + Grad(u3)'*Grad(v3) //' for emacs - div(u1,u2,u3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,u1=fup,u2=0,u3=0) + on(1,u1=0,u2=0,u3=0) ; matrix MStokes=vStokes(VVh,VVh,tgv=ttgv); time1=clock()-time1; real timeF=clock(); set(MStokes,solver=sparsesolver,tgv=ttgv,sparams=ssparams); timeF=clock()-timeF; real time2=clock(); real[int] b=vStokes(0,VVh); time2=clock()-time2; real time3=clock(); u1[] = MStokes^-1*b; time3=clock()-time3; timeI=clock()-timeI; cout << "============= CPU TIME ============" << endl; cout << " matrix " << time1 << endl; cout << " Fact " << timeF << endl; cout << " second member " << time2 << endl; cout << " solve " << time3 << endl; cout << " ------------" << endl; cout << " all " << timeI << endl; cout << "============= CPU TIME ============" << endl; //if(mpirank==0) medit("UV2 PV2",Th,[u1,u2,u3],p); freefem++-3.38-1/examples++-mpi/Stokes-v1-matrix-superludist.edp000644 000767 000024 00000003356 12500137035 024507 0ustar00hechtstaff000000 000000 // other load "msh3" load "medit" load "real_SuperLU_DIST_FreeFem" real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; int nn=8; mesh Th2=square(nn,nn); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); fespace VVh(Th,[P2,P2,P2,P1]); fespace UUh(Th,[P2,P2,P2]); fespace Uh(Th,P2); fespace Ph(Th,P1); macro Grad(u) [dx(u),dy(u),dz(u)]// EOM macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM func fup = (1-x)*(x)*y*(1-y)*16; VVh [u1,u2,u3,p]; VVh [v1,v2,v3,q]; real timeI=clock(); real time1=clock(); varf vStokes([u1,u2,u3,p],[v1,v2,v3,q]) = int3d(Th,qforder=3)( Grad(u1)'*Grad(v1) + Grad(u2)'*Grad(v2) + Grad(u3)'*Grad(v3) //' for emacs - div(u1,u2,u3)*q - div(v1,v2,v3)*p + 1e-10*q*p ) + on(2,u1=fup,u2=0,u3=0) + on(1,u1=0,u2=0,u3=0) ; matrix MStokes=vStokes(VVh,VVh,tgv=ttgv); time1=clock()-time1; real timeF=clock(); set(MStokes,solver=sparsesolver,tgv=ttgv,sparams=ssparams); timeF=clock()-timeF; real time2=clock(); real[int] b=vStokes(0,VVh); time2=clock()-time2; real time3=clock(); u1[] = MStokes^-1*b; time3=clock()-time3; timeI=clock()-timeI; cout << "============= CPU TIME ============" << endl; cout << " matrix " << time1 << endl; cout << " Fact " << timeF << endl; cout << " second member " << time2 << endl; cout << " solve " << time3 << endl; cout << " ------------" << endl; cout << " all " << timeI << endl; cout << "============= CPU TIME ============" << endl; //if(mpirank==0)medit("UV2 PV2",Th,[u1,u2,u3],p); freefem++-3.38-1/examples++-mpi/Stokes-v2-matrix-mumps.edp000644 000767 000024 00000004555 12163102024 023263 0ustar00hechtstaff000000 000000 // other load "msh3" load "medit" load "MUMPS_FreeFem" real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; int nn=15; mesh Th2=square(nn,nn); fespace Vh2(Th2,P2); Vh2 ux,uz,p2; int[int] rup=[0,2], rdown=[0,1], rmid=[1,1,2,1,3,1,4,1]; real zmin=0,zmax=1; mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax], labelmid=rmid, reffaceup = rup, reffacelow = rdown); //medit("c10x10x10",Th); fespace VVh(Th,[P2,P2,P2,P1]); fespace UUh(Th,[P2,P2,P2]); fespace Uh(Th,P2); fespace Ph(Th,P1); macro Grad(u) [dx(u),dy(u),dz(u)]// EOM macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM func fup = (1-x)*(x)*y*(1-y)*16; Uh u1,u2,u3; Uh v1,v2,v3; Ph p,q; real timeI=clock(); real time1=clock(); //VVh [uu1,uu2,uu3,up]; varf vlaplace([u1,u2,u3],[v1,v2,v3]) = int3d(Th,qforder=3)( Grad(u1)'*Grad(v1) + Grad(u2)'*Grad(v2) + Grad(u3)'*Grad(v3) ) + on(2,u1=fup,u2=0,u3=0) + on(1,u1=0,u2=0,u3=0) ; //' varf vdiv([u1,u2,u3],[q])=int3d(Th,qforder=3)(- div(u1,u2,u3)*q ); varf vdivT([q],[u1,u2,u3])=int3d(Th,qforder=3)(- div(u1,u2,u3)*q ); varf vmass(p,q) = int3d(Th,qforder=3)( 1e-10*p*q ); matrix M=vmass(Ph,Ph); matrix L=vlaplace(UUh,UUh,tgv=ttgv); matrix B=vdiv(UUh,Ph); matrix BT=vdivT(Ph,UUh); matrix A = [ [ L, BT ], //' [ B, M ]]; time1=clock()-time1; real timeF=clock(); set(A,solver=sparsesolver,sparams=ssparams); timeF=clock()-timeF; real time2=clock(); real[int] b(VVh.ndof); real[int] xx(VVh.ndof); { real[int] b1 = vlaplace(0,UUh); for(int ii=0; ii> ICNTL[iii]; getline(ff,line); } } broadcast(processor(0),ICNTL); // Given data of MUMPS solver in array lparams(SYM,PAR,ICNTL) // There is no symmetric storage for a matrix associated with a sparse solver. // Therefore, the matrix will be considered unsymmetric for parallel sparse solver even if symmetric. // This fact will be change in new version of FreeFem++ { int SYM = 0; int PAR = 1; matrix A = [[ 40, 0, 45, 0, 0], [ 0, 12, 0, 0 , 0], [ 0, 0, 40, 0, 0], [ 12, 0, 0, 22, 0], [ 0, 0, 20, 0., 22]]; // construction of integer parameter for MUMPS int[int] MumpsLParams(42); MumpsLParams[0] = SYM; MumpsLParams[1] = PAR; for(int ii=0; ii< 40; ii++) MumpsLParams[ii+2] = ICNTL[ii]; // ICNTL begin with index 0 here real[int] xx = [ 1,32,45,7,2], x(5), b(5), di(5); b=A*xx; if(mpirank ==0) cout << "xx=" << xx << endl; set(A,solver=sparsesolver,lparams=MumpsLParams); // We take the default value for CNTL MUMPS parameter if(mpirank ==0) cout << "solving solution" << endl; x = A^-1*b; if(mpirank ==0) cout << "b=" << b << endl; if(mpirank ==0) cout << "x=" << endl; cout << x << endl; di = xx-x; if(mpirank==0){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } } // FFCS - reference value for regression tests real regtest; // Read parameter of MUMPS solver in file ffmumps_fileparam.txt { matrix A = [[ 40, 0, 45, 0, 0], [ 0, 12, 0, 0 , 0], [ 0, 0, 40, 0, 0], [ 12, 0, 0, 22, 0], [ 0, 0, 20, 0., 22]]; real[int] xx = [ 1,32,45,7000,2], x(5), b(5), di(5); // xb(4),bbb(4); b=A*xx; cout << "b=" << b << endl; cout << "xx=" << xx << endl; set(A,solver=sparsesolver,datafilename="ffmumps_fileparam.txt"); cout << "solving solution" << endl; x = A^-1*b; cout << "b=" << b << endl; cout << "x=" << endl; cout << x << endl; di = xx-x; if(mpirank==0){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; regtest=di.l2; } } freefem++-3.38-1/examples++-mpi/testsolver_pastix.edp000644 000767 000024 00000013347 11745333166 022650 0ustar00hechtstaff000000 000000 load "real_pastix_FreeFem" load "complex_pastix_FreeFem" verbosity=1; //################################# //# real arithmetic //################################# // reading parameter of pastix from data file { matrix A = [[ 100, 1, 0, 10], [ 1, 100, 2, 0 ], [ 0, 2, 100, 3 ], [ 10, 0, 3, 100 ]]; real[int] xx = [ 1,2,3,4], x(4), b(4), di(4); // xb(4),bbb(4); b=A*xx; cout << "b=" << b << endl; cout << "xx=" << xx << endl; if(mpirank==0) cout << "A="<< A << endl; set(A,solver=sparsesolver,datafilename="ffpastix_iparm_dparm.txt"); cout << "solving solution" << endl; x = A^-1*b; cout << "b=" << b << endl; cout << "x=" << endl; cout << x << endl; di = xx-x; if(mpirank==0){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } if(mpirank==1){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } if(mpirank==0) cout << "A="<< A << endl; x = A^-1*b; cout << "b=" << b << endl; cout << "x=" << endl; cout << x << endl; } // definition of pastix parameter iparm and dparm in this file // These parameters must be given to lparams and dparams respectively { matrix A = [[ 1e16, 2, 2, 1, 1], [ 2, 12, 0, 10 , 10], [ 2, 0, 1e16, 0, 2], [ 1, 10, 0, 22, 0.], [ 1, 10, 2, 0., 22]]; real[int] xx = [ 1,32,45,7,2], x(5), b(5), di(5); b=A*xx; cout << "b=" << b << endl; cout << "xx=" << xx << endl; int[int] iparm(64); real[int] dparm(64); if(mpirank == 0){ // read iparm and dparm from data file with processor 0 ifstream datapastix("ffpastix_iparm_dparm.txt"); string line; getline(datapastix,line); cout << " line= "<< line << endl; getline(datapastix,line); cout << " line= "<< line << endl; getline(datapastix,line); cout << " line= "<< line << endl; for(int iii=0; iii<64;iii++){ datapastix >> iparm[iii]; // read iii+2 lines of the file ffpastix_iparm_dparm.txt getline(datapastix,line); } getline(datapastix,line); cout << " line= "<< line << endl; for(int iii=0; iii<64;iii++){ datapastix >> dparm[iii]; // read iii+66 lines of the file ffpastix_iparm_dparm.txt getline(datapastix,line); } } broadcast(processor(0),iparm); // broadcast iparm to the other processor broadcast(processor(0),dparm); // broadcast dparm to the other processor if(mpirank ==0){ cout << "iparm=" << iparm << endl; cout << "dparm =" << dparm << endl; } set(A,solver=sparsesolver,lparams=iparm,dparams=dparm); // set to pastix solver the parameter iparm and dparm if(mpirank) cout << "solving solution" << endl; x = A^-1*b; di = xx-x; if(mpirank==0){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } if(mpirank==1){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } } //################################# //# complex arithmetic //################################# // read parameter for pastix from data file { // Resolution with complex pastix int N=40; complex[int,int] AA(N,N); AA=0.+0i; for(int ii=1;ii A; A = AA; complex[int] xx(N), x(N), b(N),b1(N), di(N); for(int j=0;j A1; A1 = AB; complex[int] xx(N), x(N), b(N),b1(N), di(N); for(int j=0;j=2); int[int] procs=[0,1]; mpiGroup gpr(procs); mpiComm comm(gpr); // FFCS - reference value for regression tests real regtest; if ( bool(comm)) { ///////////////////////////// // real arithmetics case ///////////////////////////// // read parameter for SuperLU\_DIST from file verbosity=1; { matrix A = [[ 1e16, 2, 2, 1, 1], [ 2, 12, 0, 10 , 10], [ 2, 0, 1e16, 0, 2], [ 1, 10, 0, 22, 0.], [ 1, 10, 2, 0., 22]]; real[int] xx = [ 1,32,45,7,2], x(5), b(5), di(5); b=A*xx; cout << "b=" << b << endl; cout << "xx=" << xx << endl; set(A,solver=sparsesolver,datafilename="ffsuperlu_dist_fileparam.txt",commworld=comm); cout << "solving solution" << endl; x = A^-1*b; cout << "b=" << b << endl; cout << "x=" << endl; cout << x << endl; di = xx-x; if(mpirank==0){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } } // give parameter for superlu in this file with string parameter (sparams) { matrix A = [[ 1e16, 2, 2, 1, 1], [ 2, 12, 0, 10 , 10], [ 2, 0, 1e16, 0, 2], [ 1, 10, 0, 22, 0.], [ 1, 10, 2, 0., 22]]; real[int] xx = [ 1,32,45,7,2], x(5), b(5), di(5); b=A*xx; cout << "b=" << b << endl; cout << "xx=" << xx << endl; set(A,solver=sparsesolver,sparams="nprow=2,npcol=1,matrix=distributedglobal,ColPerm=MMD_AT_PLUS_A",commworld=comm); // option selected for SuperLU_DIST // nprow= 2, npcol = 1 // matrix = distributedglobal // ParSymbFact = NO, ColPerm = MMD_AT_PLUS_A, RowPerm = LargeDiag // DiagPivotThresh = 1.0, DiagScale = NOEQUIL // ReplaceTinyPivot = NO, SolveInitialized = NO, RefineInitialized = NO // IterRefine = NOREFINE cout << "solving solution" << endl; x = A^-1*b; cout << "b=" << b << endl; cout << "x=" << endl; cout << x << endl; di = xx-x; if(mpirank==0){ cout << "x-xx="<< endl; cout << "Linf "<< di.linfty << " L2 " << di.l2 << endl; } b=A*xx; cout << "b=" << b << endl; cout << "xx=" << xx << endl; } ///////////////////////////// // complex arithmetics case ///////////////////////////// // read parameter for SuperLU\_DIST from file if (1) { // Resolution avec SuperLU_DIST COMPLEX int N=40; complex[int,int] AA(N,N); AA=0.+0i; for(int ii=1;ii A; A = AA; complex[int] xx(N), x(N), b(N),b1(N), di(N); for(int j=0;j A; A = AA; complex[int] xx(N), x(N), b(N),b1(N), di(N); for(int j=0;j #include #include #endif long Boundingbox2D(KN* const& bb, pmesh const& pTh) { KN minmax(4); // x.min, x.max, y.min, y.max R2 p1(pTh->bedges[0][0]); R2 p2(pTh->bedges[0][1]); /* If array has even number of elements then initialize the first two elements as minimum and maximum */ if(p1.x > p2.x) { minmax[1] = p1.x; minmax[0] = p2.x; } else { minmax[0] = p1.x; minmax[1] = p2.x; } if(p1.y > p2.y) { minmax[3] = p1.y; minmax[2] = p2.y; } else { minmax[2] = p1.y; minmax[3] = p2.y; } for(int e = 1; e < pTh->neb; ++e) { R2 p1(pTh->bedges[e][0]); R2 p2(pTh->bedges[e][1]); if(p1.x > p2.x) { if(p1.x > minmax[1]) minmax[1] = p1.x; if(p2.x < minmax[0]) minmax[0] = p2.x; } else { if(p2.x > minmax[1]) minmax[1] = p2.x; if(p1.x < minmax[0]) minmax[0] = p1.x; } if(p1.y > p2.y) { if(p1.y > minmax[3]) minmax[3] = p1.y; if(p2.y < minmax[2]) minmax[2] = p2.y; } else { if(p2.y > minmax[3]) minmax[3] = p2.y; if(p1.y < minmax[2]) minmax[2] = p1.y; } } *bb = minmax; return 0L; } long Boundingbox3D(KN* const& bb, pmesh3 const& pTh) { KN minmax(6); // x.min, x.max, y.min, y.max, z.min, z.max const Triangle3& K1(pTh->be(0)); const Triangle3& K2(pTh->be(1)); if(K1[0].x > K1[1].x) { minmax[1] = K1[0].x; minmax[0] = K1[1].x; } else { minmax[0] = K1[0].x; minmax[1] = K1[1].x; } if(K1[0].y > K1[1].y) { minmax[3] = K1[0].y; minmax[2] = K1[1].y; } else { minmax[2] = K1[0].y; minmax[3] = K1[1].y; } if(K1[0].z > K1[1].z) { minmax[5] = K1[0].z; minmax[4] = K1[1].z; } else { minmax[4] = K1[0].z; minmax[5] = K1[1].z; } // if(K1[2].x > K2[0].x) { if(K1[2].x > minmax[1]) minmax[1] = K1[2].x; if(K2[0].x < minmax[0]) minmax[0] = K2[0].x; } else { if(K2[0].x > minmax[1]) minmax[1] = K2[0].x; if(K1[2].x < minmax[0]) minmax[0] = K1[2].x; } if(K1[2].y > K2[0].y) { if(K1[2].y > minmax[3]) minmax[3] = K1[2].y; if(K2[0].y < minmax[2]) minmax[2] = K2[0].y; } else { if(K2[0].y > minmax[3]) minmax[3] = K2[0].y; if(K1[2].y < minmax[2]) minmax[2] = K1[2].y; } if(K1[2].z > K2[0].z) { if(K1[2].z > minmax[5]) minmax[5] = K1[2].z; if(K2[0].z < minmax[4]) minmax[4] = K2[0].z; } else { if(K2[0].z > minmax[5]) minmax[5] = K2[0].z; if(K1[2].z < minmax[4]) minmax[4] = K1[2].z; } // if(K2[1].x > K2[2].x) { if(K2[1].x > minmax[1]) minmax[1] = K2[1].x; if(K2[2].x < minmax[0]) minmax[0] = K2[2].x; } else { if(K2[2].x > minmax[1]) minmax[1] = K2[2].x; if(K2[1].x < minmax[0]) minmax[0] = K2[1].x; } if(K2[1].y > K2[2].y) { if(K2[1].y > minmax[3]) minmax[3] = K2[1].y; if(K2[2].y < minmax[2]) minmax[2] = K2[2].y; } else { if(K2[2].y > minmax[3]) minmax[3] = K2[2].y; if(K2[1].y < minmax[2]) minmax[2] = K2[1].y; } if(K2[1].z > K2[2].z) { if(K2[1].z > minmax[5]) minmax[5] = K2[1].z; if(K2[2].z < minmax[4]) minmax[4] = K2[2].z; } else { if(K2[2].z > minmax[5]) minmax[5] = K2[2].z; if(K2[1].z < minmax[4]) minmax[4] = K2[1].z; } int i = 3; while(i < pTh->nbe - 1) { const Triangle3& Ka(pTh->be(i)); const Triangle3& Kb(pTh->be(i+1)); if(Ka[0].x > Ka[1].x) { if(Ka[0].x > minmax[1]) minmax[1] = Ka[0].x; if(Ka[1].x < minmax[0]) minmax[0] = Ka[1].x; } else { if(Ka[1].x > minmax[1]) minmax[1] = Ka[1].x; if(Ka[0].x < minmax[0]) minmax[0] = Ka[0].x; } if(Ka[0].y > Ka[1].y) { if(Ka[0].y > minmax[3]) minmax[3] = Ka[0].y; if(Ka[1].y < minmax[2]) minmax[2] = Ka[1].y; } else { if(Ka[1].y > minmax[3]) minmax[3] = Ka[1].y; if(Ka[0].y < minmax[2]) minmax[2] = Ka[0].y; } if(Ka[0].z > Ka[1].z) { if(Ka[0].z > minmax[5]) minmax[5] = Ka[0].z; if(Ka[1].z < minmax[4]) minmax[4] = Ka[1].z; } else { if(Ka[1].z > minmax[5]) minmax[5] = Ka[1].z; if(Ka[0].z < minmax[4]) minmax[4] = Ka[0].z; } // if(Ka[2].x > Kb[0].x) { if(Ka[2].x > minmax[1]) minmax[1] = Ka[2].x; if(Kb[0].x < minmax[0]) minmax[0] = Kb[0].x; } else { if(Kb[0].x > minmax[1]) minmax[1] = Kb[0].x; if(Ka[2].x < minmax[0]) minmax[0] = Ka[2].x; } if(Ka[2].y > Kb[0].y) { if(Ka[2].y > minmax[3]) minmax[3] = Ka[2].y; if(Kb[0].y < minmax[2]) minmax[2] = Kb[0].y; } else { if(Kb[0].y > minmax[3]) minmax[3] = Kb[0].y; if(Ka[2].y < minmax[2]) minmax[2] = Ka[2].y; } if(Ka[2].z > Kb[0].z) { if(Ka[2].z > minmax[5]) minmax[5] = Ka[2].z; if(Kb[0].z < minmax[4]) minmax[4] = Kb[0].z; } else { if(Kb[0].z > minmax[5]) minmax[5] = Kb[0].z; if(Ka[2].z < minmax[4]) minmax[4] = Ka[2].z; } // if(Kb[1].x > Kb[2].x) { if(Kb[1].x > minmax[1]) minmax[1] = Kb[1].x; if(Kb[2].x < minmax[0]) minmax[0] = Kb[2].x; } else { if(Kb[2].x > minmax[1]) minmax[1] = Kb[2].x; if(Kb[1].x < minmax[0]) minmax[0] = Kb[1].x; } if(Kb[1].y > Kb[2].y) { if(Kb[1].y > minmax[3]) minmax[3] = Kb[1].y; if(Kb[2].y < minmax[2]) minmax[2] = Kb[2].y; } else { if(Kb[2].y > minmax[3]) minmax[3] = Kb[2].y; if(Kb[1].y < minmax[2]) minmax[2] = Kb[1].y; } if(Kb[1].z > Kb[2].z) { if(Kb[1].z > minmax[5]) minmax[5] = Kb[1].z; if(Kb[2].z < minmax[4]) minmax[4] = Kb[2].z; } else { if(Kb[2].z > minmax[5]) minmax[5] = Kb[2].z; if(Kb[1].z < minmax[4]) minmax[4] = Kb[1].z; } i += 2; } if(pTh->nbe % 2 == 1 && i < pTh->nbe) { const Triangle3& Ka(pTh->be(i)); if(Ka[0].x > Ka[1].x) { if(Ka[0].x > minmax[1]) minmax[1] = Ka[0].x; if(Ka[1].x < minmax[0]) minmax[0] = Ka[1].x; } else { if(Ka[1].x > minmax[1]) minmax[1] = Ka[1].x; if(Ka[0].x < minmax[0]) minmax[0] = Ka[0].x; } if(Ka[0].y > Ka[1].y) { if(Ka[0].y > minmax[3]) minmax[3] = Ka[0].y; if(Ka[1].y < minmax[2]) minmax[2] = Ka[1].y; } else { if(Ka[1].y > minmax[3]) minmax[3] = Ka[1].y; if(Ka[0].y < minmax[2]) minmax[2] = Ka[0].y; } if(Ka[0].z > Ka[1].z) { if(Ka[0].z > minmax[5]) minmax[5] = Ka[0].z; if(Ka[1].z < minmax[4]) minmax[4] = Ka[1].z; } else { if(Ka[1].z > minmax[5]) minmax[5] = Ka[1].z; if(Ka[0].z < minmax[4]) minmax[4] = Ka[0].z; } if(Ka[2].x < minmax[0]) minmax[0] = Ka[2].x; else if(Ka[2].x > minmax[1]) minmax[1] = Ka[2].x; if(Ka[2].y < minmax[2]) minmax[2] = Ka[2].y; else if(Ka[2].y > minmax[3]) minmax[3] = Ka[2].y; if(Ka[2].z < minmax[4]) minmax[4] = Ka[2].z; else if(Ka[2].z > minmax[5]) minmax[5] = Ka[2].z; } *bb = minmax; return 0L; } long findDiff(KN* const& array, KN* const& val) { std::set vals; for(int i = 0; i < array->n; ++i) vals.insert((*array)[i]); val->resize(vals.size()); int i = 0; for(std::set::iterator it = vals.begin(); it != vals.end(); ++it) (*val)[i++] = *it; return 0L; } #ifndef _ALL_IN_ONE_ static void Init_Utility() { Global.Add("bb2d", "(", new OneOperator2_*, pmesh>(Boundingbox2D)); Global.Add("bb3d", "(", new OneOperator2_*, pmesh3>(Boundingbox3D)); Global.Add("findDiff", "(", new OneOperator2_*, KN*>(findDiff)); } LOADFUNC(Init_Utility) #endif freefem++-3.38-1/examples++-mpi/VG.edp000644 000767 000024 00000004245 12240775536 017361 0ustar00hechtstaff000000 000000 // other //load "medit" load "MUMPS_FreeFem" include "cube.idp" real ttgv=1e10; string ssparams="nprow=1, npcol="+mpisize; int[int] Nxyz=[40,8,8]; real [int,int] Bxyz=[[0.,5.],[0.,1.],[0.,1.]]; int [int,int] Lxyz=[[1,1],[2,2],[2,2]]; mesh3 Th=Cube(Nxyz,Bxyz,Lxyz); real E = 21.5e4; real sigma = 0.29; real mu = E/(2*(1+sigma)); real lambda = E*sigma/((1+sigma)*(1-2*sigma)); real gravity = -0.05; fespace Vh(Th,[P2,P2,P2]); //fespace Vh(Th,[P1,P1,P1]); Vh [u1,u2,u3], [v1,v2,v3]; cout << "lambda,mu,gravity ="<nom = new string(* s); cout << " build MyType " << *a->nom << endl; return NULL; // return value never used for now (13.1) } myType_uv set_myType_uv( myType * const & mt,const double & u,const double & v) { return myType_uv(mt,u,v);} double get_myType_uv_x(const myType_uv & muv) { return muv.mt->x(muv.u,muv.v); } R3 * get_myType_uv_N(const myType_uv & muv) { static R3 r; r=R3(muv.mt->x(muv.u,muv.v),0.,0.); return &r; } // Add the function name to the freefem++ table /* class Init { public: Init(); }; $1 */ static void Load_Init(){ Dcl_Type(InitP,Destroy); // declare deux nouveau type pour freefem++ un pointeur et Dcl_Type(); // Dcl_Type(); // cast d'un ** en * // atype()->AddCast( new E_F1_funcT(UnRef)); zzzfff->Add("myType",atype()); // ajoute le type myType a freefem++ // constructeur d'un type myType dans freefem TheOperators->Add("<-", new OneOperator2_(&init_MyType)); // dans ff++ // myType ff("qsdlqdjlqsjdlkq"); // ajoute la fonction myType* (u,v) cree le type myType_uv // ff(0.1,0.6).x // deux etapes // 1) ff(u,v) -> myType_uv // ajoute la methode x sur myType_uv ff(u,v).x // ajoute des fonction sur myType_uv // 1) atype< myType * >()->Add("(","",new OneOperator3_(set_myType_uv)); Add("x",".",new OneOperator1_(get_myType_uv_x) ); Add("N",".",new OneOperator1_(get_myType_uv_N) ); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/all.edp000644 000767 000024 00000053726 12165315734 017753 0ustar00hechtstaff000000 000000 NoGraphicWindow=true;NoUseOfWait=true;int verbosityy=verbosity; cout << "--------- file : APk-AdaptEpsDeltaPk.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "APk-AdaptEpsDeltaPk.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : APk-ExplicitPkTest.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "APk-ExplicitPkTest.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : APk-FreeFemQA.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "APk-FreeFemQA.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : APk-MetricPk.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "APk-MetricPk.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IPOTest.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IPOTest.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IpOptMinSurf.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IpOptMinSurf.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IpoptLap.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IpoptLap.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IpoptMinSurfVol.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IpoptMinSurfVol.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IpoptVI.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IpoptVI.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IpoptVI2.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IpoptVI2.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : IsoSurfVol.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "IsoSurfVol.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapDG3.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapDG3.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapDG4.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapDG4.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapLNewSolver.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapLNewSolver.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapMUMPS_seq.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapMUMPS_seq.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapNewSolver.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapNewSolver.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LapUmfpack64.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LapUmfpack64.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LaplaceP3.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LaplaceP3.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LaplaceP4.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LaplaceP4.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : LaplaceRT1.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "LaplaceRT1.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : Leman-mesh.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "Leman-mesh.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : MetricKuate.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "MetricKuate.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : NSP2BRP0.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "NSP2BRP0.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : PARDISO.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "PARDISO.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : SuperLU.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "SuperLU.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : VIJumpP2sparse.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "VIJumpP2sparse.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : VarIneq2.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "VarIneq2.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : bilapMorley.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "bilapMorley.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : bmo.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "bmo.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : buildlayermesh.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "buildlayermesh.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : checkglumeshcube.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "checkglumeshcube.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : cmaes-VarIneq.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "cmaes-VarIneq.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : cmaes-oven.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "cmaes-oven.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : convect_dervieux.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "convect_dervieux.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : convectchacon-3d.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "convectchacon-3d.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : convectchacon.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "convectchacon.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : convexehull3d.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "convexehull3d.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : dfft.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "dfft.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : ffnewuoa.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "ffnewuoa.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : ffrandom.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "ffrandom.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : funcTemplate.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "funcTemplate.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : glumesh3D.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "glumesh3D.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : gnuplot.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "gnuplot.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : gsl.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "gsl.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : gsl1.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "gsl1.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : ilut.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "ilut.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : isoline.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "isoline.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : lame-TD-NSS.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "lame-TD-NSS.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : lap-solvers.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "lap-solvers.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : lapack.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "lapack.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : layer.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "layer.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : load.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "load.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : meditddm.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "meditddm.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : metis.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "metis.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : mshmet.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "mshmet.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : myType.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "myType.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : myfunction2.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "myfunction2.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : pipe.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "pipe.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : plot-fb-P3.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "plot-fb-P3.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : plot-fb-P3dc.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "plot-fb-P3dc.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : plot-fb-P4.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "plot-fb-P4.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : plot-fb-P4dc.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "plot-fb-P4dc.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : plotfb.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "plotfb.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : ppm2rnm.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "ppm2rnm.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : provadxw.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "provadxw.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : refinesphere.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "refinesphere.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : schwarz-nm.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "schwarz-nm.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : scotch.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "scotch.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : shell.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "shell.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : splitedges.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "splitedges.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : splitmesh3.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "splitmesh3.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : splitmesh6.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "splitmesh6.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : test-ElementMixte.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "test-ElementMixte.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE-P13ddc.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE-P13ddc.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE-P3.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE-P3.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE-P3dc.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE-P3dc.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE-P4.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE-P4.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE-P4dc.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE-P4dc.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE-PkEdge.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE-PkEdge.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFE.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFE.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : testFEMorley.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "testFEMorley.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : tetgencube.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "tetgencube.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : tetgenholeregion.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "tetgenholeregion.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : tetgenholeregion_rugby.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "tetgenholeregion_rugby.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : thresholdings.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "thresholdings.edp";}; cout << "------------------------------------------------------------------------------ " << endl; cout << "--------- file : ttestio.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "ttestio.edp";}; cout << "------------------------------------------------------------------------------ " << endl; freefem++-3.38-1/examples++-load/aniso.cpp000644 000767 000024 00000007020 12505357323 020306 0ustar00hechtstaff000000 000000 // ORIG-DATE: March 2015 // -*- Mode : c++ -*- // // SUMMARY : liaison medit freefem++ : adaptmesh in 3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: mshmet libMesh //ff-c++-cpp-dep: // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ //ff-c++-LIBRARY-dep: libMesh //compile: ff-c++ -auto aniso.cpp #include "ff++.hpp" #include "msh3.hpp" #include "eigenv.h" //#define ADAPTLIBRARY /* int eigenv(int symmat,double *mat,double lambda[3],double v[3][3]); int eigen2(double *mm,double *lambda,double vp[2][2]); */ static const int wrapperMetric[6]={0,1,3,2,4,5}; void met3dwrap(double m[6],double mw[6]) { for(int i=0;i<6;++i) mw[i]=m[wrapperMetric[i]]; } void unmet3dwrap(double mw[6],double m[6]) { for(int i=0;i<6;++i) m[wrapperMetric[i]]=mw[i]; } int BoundAniso2d(double m[3],double cmin) { double vp[2][2]; double l[2]; int nv=eigen2(m,l,vp); if(nv) { double vpmx=max(l[0],l[1]); double vpmn = vpmx/cmin; l[0]=max(l[0],vpmn); l[1]=max(l[1],vpmn); m[0] = l[0]*vp[0][0]*vp[0][0] + l[1]*vp[1][0]*vp[1][0]; m[1] = l[0]*vp[0][0]*vp[0][1] + l[1]*vp[1][0]*vp[1][1]; m[2] = l[0]*vp[0][1]*vp[0][1] + l[1]*vp[1][1]*vp[1][1]; } return nv ? 0: 1; } int BoundAniso3d(double mff[6],double cmin) { double m[6]; double vp[3][3]; double l[3]; met3dwrap(mff,m); int nv=eigenv(1,m,l,vp); if(nv) { double vpmx=max(max(l[0],l[1]),l[2]); double vpmn = vpmx/cmin; l[0]=max(l[0],vpmn); l[1]=max(l[1],vpmn); l[2]=max(l[2],vpmn); for (int k=0,i=0; i<3; i++) for (int j=i; j<3; j++) m[k++] = l[0]*vp[0][i]*vp[0][j] + l[1]*vp[1][i]*vp[1][j] \ + l[2]*vp[2][i]*vp[2][j]; } unmet3dwrap(m,mff); return nv ? 0: 1; } long Boundaniso(long const &k,KN * const &pm,double const &animax) { KN & m(*pm); long ns = m.N()/k; ffassert( ns*k== m.N()); double lmin = sqrt(animax); ffassert( k==3 || k==6); int err=0; if( k==3) {// <[m11,m12,m22] for(int i=0; i*,double>(Boundaniso)); } #define WITH_NO_INIT #include "msh3.hpp" LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/APk-AdaptEpsDeltaPk.edp000755 000767 000024 00000002536 12052701007 022601 0ustar00hechtstaff000000 000000 load "MetricPk" load "Element_P3"; load "Element_P4"; int nIter=4; mesh Th=square(20,20,[x,y]); //fespace Vh(Th,P1); int kDeg=1; //degr des FE utiliss //fespace Vh(Th,P2); int kDeg=2; //degr des FE utiliss fespace Vh(Th,P3); int kDeg=3; //degr des FE utiliss int rdeg=1; //on approche le gradient ou des drives d'ordre suprieur real ratio = 2.;//number of triangles is multiplied by ratio at each step real rmax = 1; //max triangle size desired. Vh u,v; fespace Metric(Th,[P1,P1,P1]); Metric [m11,m12,m22]; ////pour de l'adaptation isotrope //problem EpsDelta(u,v) = // int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))+ // on(1,u=1)+on(2,3,4, u=0); //avec une forte anisotropie, et des singularits aux coins. real eps=0.01; problem EpsDelta(u,v) = int2d(Th)(eps*dx(u)*dx(v)+eps*dy(u)*dy(v)+(dx(u)+dy(u))*v)+ on(1,u=atan(10*x*(1-x)))+on(2,3,4, u=0); //real massRef = 1000*Th.nt; real massRef = Th.nt/2; EpsDelta; plot(u, wait=1); for(int i=0; iFF a l'air de marcher. //Maintenant, il faut le sens inverse. //mesh Th=square(1,1,[x,y]); //savemesh(Th,"ThFF.msh");freefem++-3.38-1/examples++-load/APk-MetricPk.edp000755 000767 000024 00000002035 11714271311 021347 0ustar00hechtstaff000000 000000 load "MetricPk" mesh Th=square(3,3,[x,y]); fespace Metric(Th,[P1,P1,P1]); Metric [m11,m12,m22]; //fespace Deriv(Th,[P1,P1,P1]); //Deriv [D1,D2,D3]; //m11[]=MetricPk(Th,(x^2+100*y^2)/2,kDeg=1,rDeg=1,Derivatives=D1[]); fespace Deriv(Th,[P1,P1,P1,P1]); Deriv [D1,D2,D3,D4]; //m11[]=MetricPk(Th,(x^3+2*3*x^2*y+3*3*x*y^2+4*y^3)/6,kDeg=2,rDeg=1,Derivatives=D1[]); m11[]=MetricPk(Th,(x^3/100+y^3)/6,kDeg=2,rDeg=1,Derivatives=D1[]); //fespace Deriv(Th,[P1,P1,P1,P1,P1]); //Deriv [D1,D2,D3,D4,D5]; //m11[]=MetricPk(Th,(x^4+2*4*x^3*y+3*6*x^2*y^2+4*4*x*y^3+5*y^4)/24,kDeg=3,rDeg=1,Derivatives=D1[]); //m11[]=MetricPk(Th,(x^3+2*3*x^2*y+3*3*x*y^2+4*y^3)/6,kDeg=3,rDeg=1,Derivatives=D1[]); //fespace Deriv(Th,[P1,P1,P1,P1,P1,P1]); //Deriv [D1,D2,D3,D4,D5,D6]; //m11[]=MetricPk(Th,(x^5+2*5*x^4*y+3*10*x^3*y^2+4*10*x^2*y^3+5*5*x*y^4+6*y^5)/120,kDeg=4,rDeg=1,Derivatives=D1[]); //m11[]=MetricPk(Th,(x^4+2*4*x^3*y+3*6*x^2*y^2+4*4*x*y^3+5*y^4)/24,kDeg=4,rDeg=1,Derivatives=D1[]); //plot(m11,m12,m22,dim=3,wait=1); cout << m11[] << endl; cout << D1[] << endl; freefem++-3.38-1/examples++-load/BasicMath.h000755 000767 000024 00000011152 11714503427 020500 0ustar00hechtstaff000000 000000 // // BasicMath.h // FastMarchingBundle // // Created by Jean-Marie Mirebeau on 11/07/11. // Copyright 2011 UPMC. All rights reserved. // #ifndef BASIC_MATH #define BASIC_MATH #include #include #include "assert.h" using namespace std; /****** A few common functions which are absent in C++ *******/ template inline ring square(ring u){return u*u;} template inline ring cube(ring u){return u*u*u;} inline double sqrt3(double r){return r>=0 ? pow(r,1/3.) : -pow(-r,1/3.);} template inline int sign(ordered_zero a) {return a>0 ? 1 : (a==ordered_zero(0) ? 0 : -1);} inline int mod (int a, int N) {const double u = a%N; return u>=0 ? u : u+N;} //math modulo. Beware : % is wrong for negative numbers inline int smallmod(int a, int N) {const int NHalf = N/2; return -NHalf+mod(a+NHalf,N);}//math symmetrized modulo, in [-N/2,N/2] or so. //inline int round0(double a){return a>0 ? ceil(a-0.5) : floor(a+0.5);} //rounding towards the closest integer to 0. /****** Some debug macros *****/ //try_debug helps to locate errors in combination with external libraries #if DEBUG #define assert_msg(condition, message) if (! (condition)) { std::cerr << message << " : "; assert(condition); assert(false); } else {} #define try_debug_msg(instructions, message) try{ instructions ;} catch(...) {assert_msg(false, message);} #define try_debug(instructions) try{ instructions ;} catch(...) {assert(false);} #else #define assert_msg(condition, message) assert(condition) #define try_debug_msg(instructions, message) { instructions ;} #define try_debug(instructions) { instructions ;} #endif /***** Display of mathematical structures in diverse formats *******/ //typical usage : some_ostream << some_Format_Math << data1 << data2 < inline ostream_math operator << (ostream_math f, const E & n){ f.os << n; return f;} //Display of doubles : 1.5e+34 -> 1.5*10^+34 inline ostream_math operator << (ostream_math f, double x){ if(f.format==Mathematica) { ostringstream oss; oss << x; const char * px = oss.str().c_str(); if(px[0]=='N') f<<"Indeterminate"; else if(px[0]=='i') f<<"Infinity"; else if(px[0]=='-' && px[1]=='i') f<<"-Infinity"; else { for(int i=0; i<20 && px[i]>0; i++) if(px[i]=='e') { char Buffer[20]; for(int j=0; j void print_array(ostream_math f, ForwardIterator first, ForwardIterator last, bool one_per_line=false) { string sep = one_per_line ? ",\n" : ","; f<<"{"; if(first!=last) f<<*first++; while(first!=last) f << sep << *first++; f<<"}"; } /* //Display of arrays template void print_array(ostream & f, const E * tab, int N, bool one_per_line=false){ if(one_per_line) for(int i=0; i void print_array(ostream_math f, const E * tab, int N, bool one_per_line=false){ if(f.format==Mathematica) { if(N==0) {f << "{}"; return;} f << "{"; for(int i=0; i void print_array(ostream_math f, E (*func)(int), int N, bool one_per_line=false){ E * tab = new E [N]; for(int i=0; i inline void print_array(ostream & f, E (*func)(int), int N, bool one_per_line=false){ print_array(f << Standard, func, N, one_per_line);} */ //conversion to string template std::string to_string(const E & e){ostringstream oss; oss << e; return oss.str();} #endif freefem++-3.38-1/examples++-load/BEC.cpp000644 000767 000024 00000001763 12332442640 017571 0ustar00hechtstaff000000 000000 // Example C++ function "myfunction", dynamically loaded into "load.edp" // --------------------------------------------------------------------- // $Id$ #include using namespace Fem2D; double BECtrap(Stack stack,KN * const & pd) { MeshPoint &mp= *MeshPointStack(stack); // the struct to get x,y, normal , value double *d = *pd; double x= mp.P.x; // get the current x value double y= mp.P.y; // get the current y value double z= mp.P.y; // get the current y value double x2=x*x, y2=y*y,z2=z*z, r2 = x2+y2, r4 = r2*r2; long n = pd->N(); // cout << "x = " << x << " y=" << y << " " << sin(x)*cos(y) << endl; double ret ; if( n ==4) ret = x2*d[0] + y2*d[1] + z2*d[2] + r4*d[3] ; else if(n==6) { double s = sin(d[5]*z); ret = x2*d[0] + y2*d[1] + z2*d[2] + r4*d[3] + d[4]*s*s; } else ffassert(0); // return ret; } void init(){ Global.Add("BECtrap","(",new OneOperator1s_ * ,E_F0mps >(BECtrap)); } LOADFUNC(init); freefem++-3.38-1/examples++-load/BernadiRaugel.cpp000644 000767 000024 00000017200 11406142255 021675 0ustar00hechtstaff000000 000000 // The P2BR finite element : the Bernadi Raugel Finite Element // F. Hecht, decembre 2005 // ------------- // See Bernardi, C., Raugel, G.: Analysis of some finite elements for the Stokes problem. Math. Comp. 44, 71-79 (1985). // It is a 2d coupled FE // the Polynomial space is $ P1^2$ + 3 normals bubbles edges function $(P_2)$ // the degre of freedom is 6 values at of the 2 componantes at the 3 vertices // and the 3 flux on the 3 edges // So 9 degrees of freedom and N= 2. // ----------------------- related files: // to check and validate : testFE.edp // to get a real example : NSP2BRP0.edp // ------------------------------------------------------------ // ----------------------- #include #include "AddNewFE.h" namespace Fem2D { class TypeOfFE_P2BRLagrange : public TypeOfFE { public: static int Data[]; // double Pi_h_coef[]; TypeOfFE_P2BRLagrange(): TypeOfFE(6+3+0, 2, Data, 4, 1, 6+3*(2+2), // nb coef to build interpolation 9, // np point to build interpolation 0) { const double gauss1=(1.-sqrt(1./3.))/2; const double gauss2=1.-gauss1; // faux const R2 Pt[] = { R2(0,0),R2(1,0),R2(0,1)}; // for the 3 vertices 6 coef int kk=0; for (int p=0;p<3;p++) { P_Pi_h[p]=Pt[p]; pij_alpha[kk]= IPJ(kk,p,0); ++kk; pij_alpha[kk]= IPJ(kk,p,1); ++kk; } // for int p=3; for (int e=0;e<3;++e) { // point d'integration sur l'arete e R2 A=Pt[VerticesOfTriangularEdge[e][0]]; R2 B=Pt[VerticesOfTriangularEdge[e][1]]; P_Pi_h[p]= A*gauss1+B*gauss2; // cout <<"\n" << p << " -- " << P_Pi_h[p] << " :: " << A << " " << B << endl; pij_alpha[kk++]= IPJ(6+e,p,0); // coef = 0.5* l_e *ne_x * sge pij_alpha[kk++]= IPJ(6+e,p,1); // coef = 0.5* l_e *ne_y * sge p++; P_Pi_h[p]= A*gauss2+B*gauss1; // cout << p << " ++ " << P_Pi_h[p] << endl; pij_alpha[kk++]= IPJ(6+e,p,0); // coef = 0.5* l_e *ne_x * sge pij_alpha[kk++]= IPJ(6+e,p,1); // coef = 0.5* l_e *ne_y * sge p++; } assert(P_Pi_h.N()==p); assert(pij_alpha.N()==kk); } void FB(const bool * whatd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const; } ; // on what nu df on node node of df int TypeOfFE_P2BRLagrange::Data[]={ 0,0, 1,1, 2,2, 3,4,5, 0,1, 0,1, 0,1, 0,0,0, 0,0, 1,1, 2,2, 3,4,5, 0,0, 0,0, 0,0, 0,0,0, 0,1, 2,3, 4,5, 6,7,8, 0,0, 0,0, 0,9 }; void TypeOfFE_P2BRLagrange::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); int k=0; // coef pour les 3 sommets fois le 2 composantes for (int i=0;i<6;i++) v[k++]=1; // integration sur les aretes for (int i=0;i<3;i++) { R2 N(T.Edge(i).perp()); N *= T.EdgeOrientation(i)*0.5 ; v[k++]= N.x; v[k++]= N.y; v[k++]= N.x; v[k++]= N.y; } } void TypeOfFE_P2BRLagrange::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // $int_e_1 l0*l0 = |e_1| /3 $ et $int_e_1 l0*l1 = |e_1| /6 $ // pour avoir flux = 1 // R2 E[3]={ K.Edge(0),K.Edge(1),K.Edge(2)}; double l2E[3]={ (E[0],E[0]), (E[1],E[1]), (E[2],E[2]) }; double lE[3]={ sqrt(l2E[0]), sqrt(l2E[1]), sqrt(l2E[2]) }; double sgE[3]={ K.EdgeOrientation(0), K.EdgeOrientation(1), K.EdgeOrientation(2)}; R2 cN[3]= { E[0].perp() *(6.*sgE[0]/l2E[0]), E[1].perp() *(6.*sgE[1]/l2E[1]), E[2].perp() *(6.*sgE[2]/l2E[2]) }; val=0; throwassert( val.N()>=9); throwassert(val.M()==2); val=0; if (whatd[op_id]) { RN_ f0(val('.',0,op_id)); RN_ f1(val('.',1,op_id)); f1[1]=f0[0] = l0; f1[3]=f0[2] = l1; f1[5]=f0[4] = l2; f0[6] = cN[0].x*l1*l2; // oppose au sommet 0 f0[7] = cN[1].x*l0*l2; // oppose au sommet 1 f0[8] = cN[2].x*l1*l0; // oppose au sommet 3 f1[6] = cN[0].y*l1*l2; // oppose au sommet 0 f1[7] = cN[1].y*l0*l2; // oppose au sommet 1 f1[8] = cN[2].y*l1*l0; // oppose au sommet 3 } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)), Dl1(K.H(1)), Dl2(K.H(2)); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); RN_ f1x(val('.',1,op_dx)); f1x[1]=f0x[0] = Dl0.x; f1x[3]=f0x[2] = Dl1.x; f1x[5]=f0x[4] = Dl2.x; f0x[6] = cN[0].x*(Dl1.x*l2 + Dl2.x*l1) ; f0x[7] = cN[1].x*(Dl2.x*l0 + Dl0.x*l2) ; f0x[8] = cN[2].x*(Dl0.x*l1 + Dl1.x*l0) ; f1x[6] = cN[0].y*(Dl1.x*l2 + Dl2.x*l1) ; f1x[7] = cN[1].y*(Dl2.x*l0 + Dl0.x*l2) ; f1x[8] = cN[2].y*(Dl0.x*l1 + Dl1.x*l0) ; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); RN_ f1y(val('.',1,op_dy)); f1y[1]=f0y[0] = Dl0.y; f1y[3]=f0y[2] = Dl1.y; f1y[5]=f0y[4] = Dl2.y; f0y[6] = cN[0].x*(Dl1.y*l2 + Dl2.y*l1) ; f0y[7] = cN[1].x*(Dl2.y*l0 + Dl0.y*l2) ; f0y[8] = cN[2].x*(Dl0.y*l1 + Dl1.y*l0) ; f1y[6] = cN[0].y*(Dl1.y*l2 + Dl2.y*l1) ; f1y[7] = cN[1].y*(Dl2.y*l0 + Dl0.y*l2) ; f1y[8] = cN[2].y*(Dl0.y*l1 + Dl1.y*l0) ; } if (whatd[op_dxx]) { RN_ f0xx(val('.',0,op_dxx)); RN_ f1xx(val('.',1,op_dxx)); f0xx[6] = 2*cN[0].x*Dl1.x*Dl2.x; f0xx[7] = 2*cN[1].x*Dl0.x*Dl2.x; f0xx[8] = 2*cN[2].x*Dl0.x*Dl1.x; f1xx[6] = 2*cN[0].y*Dl1.x*Dl2.x; f1xx[7] = 2*cN[1].y*Dl0.x*Dl2.x; f1xx[8] = 2*cN[2].y*Dl0.x*Dl1.x; } if (whatd[op_dyy]) { RN_ f0yy(val('.',0,op_dyy)); RN_ f1yy(val('.',1,op_dyy)); f0yy[6] = 2*cN[0].x*Dl1.y*Dl2.y; f0yy[7] = 2*cN[1].x*Dl0.y*Dl2.y; f0yy[8] = 2*cN[2].x*Dl0.y*Dl1.y; f1yy[6] = 2*cN[0].y*Dl1.y*Dl2.y; f1yy[7] = 2*cN[1].y*Dl0.y*Dl2.y; f1yy[8] = 2*cN[2].y*Dl0.y*Dl1.y; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ f0xy(val('.',0,op_dxy)); RN_ f1xy(val('.',1,op_dxy)); f0xy[6] = cN[0].x*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); f0xy[7] = cN[1].x*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); f0xy[8] = cN[2].x*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); f1xy[6] = cN[0].y*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); f1xy[7] = cN[1].y*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); f1xy[8] = cN[2].y*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } } // now remove the flux part on 6 first DL // w_i = w_i - a_i w_{k_i} - b_i w_{l_i} ; { int k[6]={ 6+1 , 6+1, 6+2 , 6+2, 6+0, 6+0 }; int l[6]={ 6+2 , 6+2, 6+0 , 6+0, 6+1, 6+1 }; R2 eN[3]= { E[0].perp() *(0.5*sgE[0]), E[1].perp() *(0.5*sgE[1]), E[2].perp() *(0.5*sgE[2]) }; double a[6]={ eN[1].x , eN[1].y, eN[2].x , eN[2].y, eN[0].x , eN[0].y}; double b[6]={ eN[2].x , eN[2].y, eN[0].x , eN[0].y, eN[1].x , eN[1].y}; int nop=0; int vop[last_operatortype]; for (int j=0;j #include template class Stream_b { public: Stream_b(T * ff) :f(ff) {} Stream_b(T ** ff) :f(*ff) {ffassert(f); } Stream_b(const Stream_b &io): f(io.f) {} T * f; }; template Stream_b pto_stream_b(T **f){ return Stream_b(f);} template Stream_b to_stream_b(T *f){ return Stream_b(f);} template istream * Read(Stream_b const & io, T * const & data ) { io.f->read(reinterpret_cast(data),sizeof(*data)); return io.f; } template istream * Read(Stream_b const & io, KN * const & data ) { long n; io.f->read(reinterpret_cast(&n),sizeof(long)); cout << " read n =" << n << " " << n*sizeof(sizeof(T)) << " " << endl; if( n != data->N()) data->resize(n); T* p = *data; io.f->read(reinterpret_cast(p),n*sizeof(T)); return io.f; } template ostream * Write(Stream_b const & io, KN * const & data ) { T* p = *data; long n=data->N(); cout << " write n =" << n << " " << n*sizeof(T) << " " << p << endl; io.f->write(reinterpret_cast(&n),sizeof(long)); io.f->write(reinterpret_cast(p),n*sizeof(T)); return io.f; } template ostream * Write(Stream_b const & io, T * const & data ) { io.f->write(reinterpret_cast(data),sizeof(*data)); return io.f; } template ostream * Write(Stream_b const & io, T const & data ) { io.f->write(reinterpret_cast(&data),sizeof(data)); return io.f; } template void initK() { typedef Stream_b OB; typedef Stream_b IB; Add("(","",new OneOperator2_(Read)); Add("(","",new OneOperator2_(Write)); Add("(","",new OneOperator2_(Write)); Add("(","",new OneOperator2_ *>(Read)); Add("(","",new OneOperator2_ * >(Write)); } void inittt() { typedef Stream_b OB; typedef Stream_b IB; Dcl_Type< OB> (); Dcl_Type< IB> (); Add("read",".",new OneOperator1(pto_stream_b)); Add("write",".",new OneOperator1(pto_stream_b)); initK(); initK(); initK >(); /* Add("(","",new OneOperator2_(Read)); Add("(","",new OneOperator2_(Write)); Add("(","",new OneOperator2_(Write)); */ } LOADFUNC(inittt); freefem++-3.38-1/examples++-load/bfstream.edp000644 000767 000024 00000000517 12350346320 020763 0ustar00hechtstaff000000 000000 load "bfstream" real[int] b(10),bb(1); for(int i=0; i< b.n; ++i) b[i] = i+pi; cout << " " << b << endl; { ofstream f("toto.dt"); f.write(134); f.write(1.346888); f.write(b); } b=0; { real r; int i; ifstream f("toto.dt"); f.read(i); f.read(r); f.read(bb); cout << i << " " << r << endl; cout << bb << endl; //cout << b << endl; }freefem++-3.38-1/examples++-load/bilapMorley.edp000644 000767 000024 00000001636 12352621125 021443 0ustar00hechtstaff000000 000000 load "Morley" int n=100,nn=n+10; real[int] xx(nn),yy(nn); mesh Th=square(40,40); // mesh definition of $\Omega$ fespace Wh(Th,P2); fespace Vh(Th,P2Morley); // finite element space // correct june 21 2007 (Thank to Hui Zhang hzhang@mailst.xjtu.edu.cn who find the error) macro bilaplacien(u,v) ( dxx(u)*dxx(v)+dyy(u)*dyy(v)+2.*dxy(u)*dxy(v)) // fin macro real f=1; Vh [u,ux,uy],[v,vx,vy]; solve bilap([u,ux,uy],[v,vx,vy]) = int2d(Th)( bilaplacien(u,v) ) - int2d(Th)(f*v) + on(1,2,3,4,u=0,ux=0,uy=0) ; plot(u,cmm="u", wait=1,fill=1); plot(ux,wait=1,cmm="u_x"); plot(uy,wait=1,cmm="u_y"); Wh uu=u; real umax = uu[].max; int err = (abs(umax-0.0012782) > 1e-4); cout << " uu max " << umax << " ~ 0.0012782, err = " << err << endl; for (int i=0;i<=n;i++) { xx[i]=real(i)/n; yy[i]=u(0.5,real(i)/n); // value of uh at point (0.5, i/10.) } plot([xx(0:n),yy(0:n)],wait=1); assert(err==0); freefem++-3.38-1/examples++-load/bilapP3-hct-like.edp000644 000767 000024 00000002253 12353223212 022144 0ustar00hechtstaff000000 000000 // a trick to build C1 finite element with P3 lagrangre finite element // like HSIEH-CLOUCH-TOCHER finite element // the idee is insure the the jump (dn(u)) on all edges // by penalisatison ... // not to bad ... // F. Hecht juin 2014 .. load "Element_P3" // for P3 load "splitmesh3" // to splite each triangle in 3 traingle int n=100,nn=n+10; real[int] xx(nn),yy(nn); mesh Th=square(20,20); // mesh definition of $\Omega$ //Th=splitmesh3(Th); fespace Vh(Th,P3); // finite element space macro bilaplacien(u,v) ( dxx(u)*dxx(v)+dyy(u)*dyy(v)+2.*dxy(u)*dxy(v)) // fin macro real f=1; Vh [u],[v]; real pena = 1e6; macro dn(u) (dx(u)*N.x+dy(u)*N.y)// solve bilap([u],[v]) = int2d(Th)( bilaplacien(u,v) ) + intalledges(Th) ( jump(dn(u))*jump(dn(v))*pena) - int2d(Th)(f*v) + on(1,2,3,4,u=0) ; plot(u,cmm="u", wait=1,fill=1); real umax = u[].max; int err = (abs(umax-0.0012782) > 1e-4); cout << " uu max " << umax << " ~ 0.0012782 , err = " << err << " " << abs(umax-0.0012782) < #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpace.hpp" #include "MeshPoint.hpp" #include "AFunction_ext.hpp" // Extension of "AFunction.hpp" to deal with more than 3 parameters function using namespace Fem2D; double SaveVec(KN *const & f, string *const & nome) { std::ofstream outfile (nome->data(),ios_base::binary); // To access value at node i of vector N, do as follow: *(N[0]+i) // Explanation (C++ for dummies as I am ;-): // N is an alias to the KN object. // N[0] is a pointer to the first element of the vector. // N[0]+i is a pointer to the ith element of the vector. // *(N[0]+i) is the value of the ith element of the vector. long int nn = f->N(); // get number of nodes long int dim=nn; outfile.write ((char*) &dim, sizeof(long int));//write the dimension of the vector double ftemp ; for(long int i=0; i *const & ww, string *const & nome) { std::ifstream infile (nome->data(),ios_base::binary); long int dim; infile.read((char *) &dim, sizeof(long int)); double dtemp; for(long int i=0; idata(),ios_base::binary); long int flag; infile.read((char *) &flag, sizeof(long int)); *ww=flag; return 0.0; // dummy return value. } double flag(long int *const & FLAG,string *const &nome) { std::ofstream outfile (nome->data(),ios_base::binary); long int Flag; Flag= *FLAG; outfile.write ((char*) &Flag, sizeof(long int)); outfile.close(); return 0.0; } // add the function name to the freefem++ table /* class Init { public: Init(); }; $1 */ static void Load_Init(){ Global.Add("LoadVec","(",new OneOperator2_*, string* >(LoadVec)); Global.Add("LoadFlag","(",new OneOperator2_(LoadFlag)); Global.Add("SaveVec","(",new OneOperator2_*, string* >(SaveVec)); Global.Add("flag","(",new OneOperator2_(flag)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/bmo.cpp000644 000767 000024 00000030544 12471464507 017766 0ustar00hechtstaff000000 000000 //ff-c++-LIBRARY-dep: //ff-c++-cpp-dep: #include #include #include #include #include using namespace std; #include "RNM.hpp" #include "bmo.hpp" int irand_(int i) { #ifdef _WIN32 srand(i); return rand(); #else srandom(i); return random(); #endif } static /* Subroutine */ double xrandme(integer ii) { #ifdef _WIN32 static double xrd2, xrd3, xrd4, xrd5, xrd6; /* System generated locals */ int i__1, i__2, i__3, i__4; double d__1; double xilim = 2147483648.; xrd2 = (d__1 = irand_(ii) / xilim, abs(d__1)); i__1 = irand_(ii); xrd3 = (d__1 = irand_(i__1) / xilim, abs(d__1)); i__2 = irand_(ii); i__1 = irand_(i__2); xrd4 = (d__1 = irand_(i__1) / xilim, abs(d__1)); i__3 = irand_(ii); i__2 = irand_(i__3); i__1 = irand_(i__2); xrd5 = (d__1 = irand_(i__1) / xilim, abs(d__1)); i__4 = irand_(ii); i__3 = irand_(i__4); i__2 = irand_(i__3); i__1 = irand_(i__2); xrd6 = (d__1 = irand_(i__1) / xilim, abs(d__1)); double xx=(xrd2 + xrd3 + xrd4 + xrd5 + xrd6) / 5.; #else // srandom(ii); long r=random(); r=random(); const unsigned long rmax= (1UL<<31)-1; double xx= (double) r/ (double) rmax; #endif // cout << " \t\t\trand = " << xx << " " << ii << endl; return xx; } static istream & Eat2LN(istream & f) { int c; while( (c=f.get()) !='\n') {cout << char(c);assert(f.good());} cout << endl; return f; } double BijanMO::main(Vect & xx,Vect & xxmin, Vect &xxmax) { /* Local variables */ double costsave; integer irestart; double f, costsave0, f0; Vect v(ndim), v0(ndim), x1(ndim), hgc(ndim),fpx(ndim), fpx0(ndim),temp(ndim), xmin(ndim), xmax(ndim), xsave(ndim), vinit(ndim),xsave0(ndim); double rho; double rho0; double rho00; integer iter1; double gnorm; integer iterbvp, itersom; double irestart2; ncstr = 0; nbeval = 0; nbevalp = 0; // init .. ffassert(ndim==xx.N()); ffassert(ndim==xxmin.N()); ffassert(ndim==xxmax.N()); vinit=xx; xmin=xxmin; xmax=xxmax; finit=func(vinit); if(debug) cout << " ndim = "<< ndim << endl; f = finit; f0 = finit; xopt1=xoptg=vinit; if (finit < epsij) { cstropt=cstr; fseulopt = fseul; goto L9101; } epsij *= finit; if(debug) cout << " F = "<< finit << endl; if(ncstr>0) { if(debug) { cout << " CSTR = " ; for(int i=0;i 4) cout << "MM " << irestart << " " << iter1 << " " << iterbvp << " " << rho << " ------------------------------ \n"; gradopt( x1, fpx, temp, rho, f, gnorm,fpx0, hgc); if (costsaveming < epsij) break; if (iterbvp >= 2) tir( v, fpx); else rand(v); v0=v; f0 = f; } if(debug) { cout.precision(15); cout << " F = " << costsavemin << " FM = " << costsaveming << endl; } if (costsaveming < epsij) goto L9101; costsave = f; if (iter1 >= 2) tir( v, fpx); else rand(v); costsave0 = costsave; xsave0 = xsave; } } L9101: result( xoptg, vinit); cout << "-------------------------------------------\n"; cout.precision(15); cout << " FM = " <0) { cout << "-------------------------------------------\n"; cout << "F seul = " << fseulopt << endl; cout << "-------------------------------------------\n"; cout << " CSTR = " ; for(int i=0;i CG , other : descent hgc = 0.; for (igr = 1; igr <= nbgrad; ++igr) { xnorm =0.; fpx0=fpx; xnorm=fpx.norm(); nbeval = -nbeval; funcp( x1, fpx,f); nbeval = -nbeval; gamgc = 0.; if (igc == 1 && igr >= 2 && xnorm > 1e-10) for (ii = 0; ii < ndim; ++ii) gamgc += (fpx[ii] - fpx0[ii]) * fpx[ii] / xnorm; for (ii = 0; ii < ndim; ++ii) hgc(ii)=fpx(ii)+gamgc*hgc(ii); if(debug> 5) cout <<"\t\t\t"<< rho << " "<< hgc(0) << " " << hgc(1) << "\n" ; f=ropt_dicho(x1, temp, rho, hgc,f); xmod =0.; xmodd =0.; for (ii = 0; ii < ndim; ++ii) { double x0=x1(ii); x1(ii)=x1(ii)-rho*hgc(ii); x1(ii)=min(x1(ii),xmax(ii)); x1(ii)=max(x1(ii),xmin(ii)); xmod=xmod+abs(x1(ii)-x0); xmodd=xmodd+abs(x1(ii)); } if (igr == 1) xmod0 = xmod; f = func(x1); gnorm = fpx.l2(); if (igr == 1) gnorm0 = gnorm; if (gnorm0 < 1e-6) return 0; gnorm /= gnorm0; if(histpath) { ofstream fhist(histpath->c_str(),ios::app); fhist.precision(16); fhist << f << " " << gnorm*gnorm0<< " "; int n1 = min(ndim,10); for(int i=0;ic_str(),ios::app); fhist.precision(16); fhist << fseul << endl; for(int i=0;i2) cout << "\t\t\t "<< f << " " << gnorm*gnorm0<< " "<< x1[0]<< " "<< x1[1] << " /J/ "< 3) // cout << "\t\t\t opt: rho = " << rho << " F = " << f << endl; return 0; } double BijanMO::ropt_dicho(Vect x, Vect temp, double &ro, Vect g, double ccout) { integer j, l; double s, fm, sd, sn, pr; static double fmin[3]={0,0,0}; integer numi; double romin[3]; integer numimax; /* Function Body */ numi = 0; numimax = 5; L240: romin[0] = ro *.5; romin[1] = ro; romin[2] = ro *2.; l = 0; L300: fmin[l]=fun( x, temp, g, romin[l]); ++l; ++numi; if (l==1 & fmin[0] > ccout) { ro *= .5; /* ****** test d'arret */ if (abs(ro) <1e-5 || numi > numimax) goto L500; goto L240; } L360: if(l<2) goto L300; if (fmin[0] < fmin[1]) goto L380; L370: if(l<3) goto L300; if (fmin[1] <= fmin[2] ) goto L450; else goto L420; L380: l=3; romin[2] = romin[1]; fmin[2] = fmin[1]; romin[1] = romin[0]; fmin[1] = fmin[0]; romin[0] *= .5; ++numi; fmin[0]= fun( x, temp, g, romin[0]); goto L360; L420: romin[0] = romin[1]; fmin[0] = fmin[1]; romin[1] = romin[2]; fmin[1] = fmin[2]; romin[2] *= 2.; ++numi; fmin[2]=fun( x, temp, g, romin[2]); goto L370; L450: ro = romin[1]; if (abs( fmin[1] - fmin[2])* 2 / (fmin[1] + fmin[2]) < 1e-4 || numi > numimax) goto L500; /* ****** calcul de ro interpole */ sn = 0.; sd = 0.; for (int i = 0; i < 3; ++i) { s = 0.; pr = 1.; for (j = 0; j <3; ++j) { if (i != j) { s += romin[j]; pr *= romin[i] - romin[j]; } } sn += fmin[i] * s / pr; sd += fmin[i] / pr; } ro = sn / sd / 2.; if(debug> 5) cout << "\t\t\t\tro int = " << ro << " " << l << endl; L500: fm=fun(x, temp, g, ro); ccout = fm; if (fm > fmin[1]) { ro = romin[1]; ccout = fmin[1]; } if(debug> 4) cout << "\t\t\t\tdicho : " << ro << " " << ccout << " " << l << endl; return ccout; } /* ropt_dicho__ */ double BijanMO::fun(Vect & x, Vect& temp, Vect& g, double ro) { for(int ii=0;ii 5) cout << " ro = " << ro << endl; return func(temp); } void BijanMO::funcp(Vect &x, Vect &fpx,double f) { /* Local variables */ double fp, x00; /* Function Body */ nbevalp=nbevalp+1; double *ok=DJ( x, fpx); if(!ok) { for(int ii=0;ii 1e-6) { fapp /= xcoef; fpx/= xcoef; break; } else diffucarte = diffucarte0 / itest2 ; } if(debug> 3) cout << " fapp = " << fapp << " " << nbeval << x[0] << " " << x[1] << endl; return fapp; } freefem++-3.38-1/examples++-load/bmo.edp000644 000767 000024 00000001347 11406142255 017741 0ustar00hechtstaff000000 000000 load "./lgbmo" int n=2; real[int] X(n),DX(n); real[int] X0(n); for(int i=0;i #include using namespace Fem2D; double dist2(int n,double *p,double *q) { double s=0; for(int i=0; i* CloseTo(Stack stack,double const & eps,KNM * const & p,KNM * const & q) { long n=q->N(); KN* pr=new KN(q->N()); MeshPoint &mp= *MeshPointStack(stack); // the struct to get x,y, normal , value //HashTable table(n); double *p0=&(*p)(0,0); return Add2StackOfPtr2FreeRC(stack,pr); } KN* CloseTo(Stack stack,double const & eps,pmesh const & pTh,KNM * const & pq) { ffassert(pTh && pq); const Mesh & Th=*pTh; const KNM Q=*pq; int np=Q.N(); assert(Q.M()>=2); KN* pr=new KN(np); KN b(Th.nv); b=0; for (int i=0;iAdd(Th.vertices[i]); } } cout << " After quadterr" << endl; for (int j=0;jToClose(P,eps); if(pV) { pV=quadtree->NearestVertex(P); long k= Th(pV); cout << j << " " << k << " " << P << " " << pV <*,double,KNM * ,KNM * >(CloseTo)); Global.Add("ClosePoints","(",new OneOperator3s_*,double,pmesh,KNM * >(CloseTo)); } LOADFUNC(init); freefem++-3.38-1/examples++-load/ClosePoints.edp000644 000767 000024 00000002763 12527350701 021433 0ustar00hechtstaff000000 000000 // FFCS: for regression tests load "ClosePoints" real regtest; { // example of mesh with a given set of internal point (P) // P(i,0) x, // P(i,1) y, // P(i,2) = mesh density close to x,y not mandatory .. verbosity=1; real[int,int] P(100,3); real[int,int] Q(100,2); for(int i=0; i2 ? 2*l/3 : 0); Xmax[3*i+2] = (i>2 ? l : l/3) - (R+eps); } cout << "Xmin: " << Xmin << endl << "Xmax: " << Xmax << endl; int iter=0; func real J(real[int] &X) { verbosity=0; real[int] XX=X,diff=X; for(int i=0;iXmin[i] ? X[i] : Xmin[i]; XX[i] = XX[i]" << corr << endl; border b1(t=0,1){x=L*t; y=0; label=0;} border b2(t=0,1){x=L; y=l*t; label=0;} border b3(t=0,1){x=L*(1-t); y=l; label=0;} border b4(t=0,1){x=0; y=l*(1-t); label=0;} Resistor(1,XX[1] ,XX[2] ,1); Resistor(2,XX[4] ,XX[5] ,1); Resistor(3,XX[7] ,XX[8] ,1); Resistor(4,XX[10],XX[11],1); Resistor(5,XX[13],XX[14],1); Resistor(6,XX[16],XX[17],1); border bi1(t=0,2){x=(0.5+t)*L/3; y=l/3; label=1;} border bi2(t=0,1){x=5*L/6; y=(1+t)*l/3; label=1;} border bi3(t=0,2){x=(2.5-t)*L/3; y=2*l/3; label=1;} border bi4(t=0,1){x=L/6; y=(2-t)*l/3; label=1;} mesh Th = buildmesh( bi1(2*NP*L/3)+bi2(NP*l/3)+bi3(2*NP*L/3)+bi4(NP*l/3) + Res1(NPres)+Res2(NPres)+Res3(NPres)+Res4(NPres)+Res5(NPres)+Res6(NPres) + b1(NP*L)+b2(NP*l)+b3(NP*L)+b4(NP*l)); //plot(Th,wait=1); fespace Vh(Th,P1); Vh u,v,reg=region; real[int] K(reg[].max+1),pr(reg[].max+1); K=1; K[Th(L/2,l/2).region] = 10; pr=0; for(int i=0;i " << res+pena*corr << endl; cout << "pos : "; for(int j=0;jXmin[i] ? X[i] : Xmin[i]; XX[i] = XX[i]" << corr << endl; border b1(t=0,1){x=L*t; y=0; label=7;} border b2(t=0,1){x=L; y=l*t; label=7;} border b3(t=0,1){x=L*(1-t); y=l; label=7;} border b4(t=0,1){x=0; y=l*(1-t); label=7;} Resistor(1,XX[1] ,XX[2] ,0); Resistor(2,XX[4] ,XX[5] ,1); Resistor(3,XX[7] ,XX[8] ,2); Resistor(4,XX[10],XX[11],3); Resistor(5,XX[13],XX[14],4); Resistor(6,XX[16],XX[17],5); border bi1(t=0,2){x=(0.5+t)*L/3; y=l/3; label=6;} border bi2(t=0,1){x=5*L/6; y=(1+t)*l/3; label=6;} border bi3(t=0,2){x=(2.5-t)*L/3; y=2*l/3; label=6;} border bi4(t=0,1){x=L/6; y=(2-t)*l/3; label=6;} mesh Th = buildmesh( bi1(2*NP*L/3)+bi2(NP*l/3)+bi3(2*NP*L/3)+bi4(NP*l/3) + Res1(NPres)+Res2(NPres)+Res3(NPres)+Res4(NPres)+Res5(NPres)+Res6(NPres) + b1(NP*L)+b2(NP*l)+b3(NP*L)+b4(NP*l)); //plot(Th,wait=1); fespace Vh(Th,P1); Vh reg=region; real[int] K(reg[].max+1),pr(reg[].max+1); K=1; K[Th(L/2,l/2).region] = 10; pr=0; for(int i=0;i /* sqrt() */ #include /* size_t */ #include /* NULL, free */ #include /* strlen() */ #include /* sprintf(), NULL? */ #include "cmaes_interface.h" /* via cmaes.h */ /* --------------------------------------------------------- */ /* ------------------- Declarations ------------------------ */ /* --------------------------------------------------------- */ /* ------------------- External Visibly -------------------- */ /* see cmaes_interface.h for those, not listed here */ long random_init(random_t *, long unsigned seed /* 0==clock */); void random_exit(random_t *); double random_Gauss(random_t *); /* (0,1)-normally distributed */ double random_Uniform(random_t *); long random_Start(random_t *, long unsigned seed /* 0==1 */); void timings_init(timings_t *timing); void timings_start(timings_t *timing); /* fields totaltime and tictoctime */ double timings_update(timings_t *timing); void timings_tic(timings_t *timing); double timings_toc(timings_t *timing); void readpara_init (readpara_t *, int dim, int seed, const double * xstart, const double * sigma, int lambda, const char * filename); void readpara_exit(readpara_t *); void readpara_ReadFromFile(readpara_t *, const char *szFileName); void readpara_SupplementDefaults(readpara_t *); void readpara_SetWeights(readpara_t *, const char * mode); void readpara_WriteToFile(readpara_t *, const char *filenamedest, const char *parafilesource); double const * cmaes_SetMean(cmaes_t *, const double *xmean); double * cmaes_PerturbSolutionInto(cmaes_t *t, double *xout, double const *xin, double eps); void cmaes_WriteToFile(cmaes_t *, const char *key, const char *name); void cmaes_WriteToFileAW(cmaes_t *t, const char *key, const char *name, const char * append); void cmaes_WriteToFilePtr(cmaes_t *, const char *key, FILE *fp); void cmaes_ReadFromFilePtr(cmaes_t *, FILE *fp); void cmaes_FATAL(char const *s1, char const *s2, char const *s3, char const *s4); /* ------------------- Locally visibly ----------------------- */ static char * getTimeStr(void); static void TestMinStdDevs( cmaes_t *); /* static void WriteMaxErrorInfo( cmaes_t *); */ static void Eigen( int N, double **C, double *diag, double **Q, double *rgtmp); static int Check_Eigen( int N, double **C, double *diag, double **Q); static void QLalgo2 (int n, double *d, double *e, double **V); static void Householder2(int n, double **V, double *d, double *e); static void Adapt_C2(cmaes_t *t, int hsig); static void FATAL(char const *sz1, char const *s2, char const *s3, char const *s4); static void ERRORMESSAGE(char const *sz1, char const *s2, char const *s3, char const *s4); static void Sorted_index( const double *rgFunVal, int *index, int n); static int SignOfDiff( const void *d1, const void * d2); static double douSquare(double); static double rgdouMax( const double *rgd, int len); static double rgdouMin( const double *rgd, int len); static double douMax( double d1, double d2); static double douMin( double d1, double d2); static int intMin( int i, int j); static int MaxIdx( const double *rgd, int len); static int MinIdx( const double *rgd, int len); static double myhypot(double a, double b); static double * new_double( int n); static void * new_void( int n, size_t size); /* --------------------------------------------------------- */ /* ---------------- Functions: cmaes_t --------------------- */ /* --------------------------------------------------------- */ static char * getTimeStr(void) { time_t tm = time(0); static char s[33]; /* get time */ strncpy(s, ctime(&tm), 24); /* TODO: hopefully we read something useful */ s[24] = '\0'; /* cut the \n */ return s; } char * cmaes_SayHello(cmaes_t *t) { /* write initial message */ sprintf(t->sOutString, "(%d,%d)-CMA-ES(mu_eff=%.1f), Ver=\"%s\", dimension=%d, diagonalIterations=%ld, randomSeed=%d (%s)", t->sp.mu, t->sp.lambda, t->sp.mueff, t->version, t->sp.N, (long)t->sp.diagonalCov, t->sp.seed, getTimeStr()); return t->sOutString; } double * cmaes_init(cmaes_t *t, /* "this" */ int dimension, double *inxstart, double *inrgstddev, /* initial stds */ long int inseed, int lambda, const char *input_parameter_filename) { int i, j, N; double dtest, trace; t->version = "3.11.00.beta"; readpara_init (&t->sp, dimension, inseed, inxstart, inrgstddev, lambda, input_parameter_filename); t->sp.seed = random_init( &t->rand, (long unsigned int) t->sp.seed); N = t->sp.N; /* for convenience */ /* initialization */ for (i = 0, trace = 0.; i < N; ++i) trace += t->sp.rgInitialStds[i]*t->sp.rgInitialStds[i]; t->sigma = sqrt(trace/N); /* t->sp.mueff/(0.2*t->sp.mueff+sqrt(N)) * sqrt(trace/N); */ t->chiN = sqrt((double) N) * (1. - 1./(4.*N) + 1./(21.*N*N)); t->flgEigensysIsUptodate = 1; t->flgCheckEigen = 0; t->genOfEigensysUpdate = 0; timings_init(&t->eigenTimings); t->flgIniphase = 0; /* do not use iniphase, hsig does the job now */ t->flgresumedone = 0; t->flgStop = 0; for (dtest = 1.; dtest && dtest < 1.1 * dtest; dtest *= 2.) if (dtest == dtest + 1.) break; t->dMaxSignifKond = dtest / 1000.; /* not sure whether this is really save, 100 does not work well enough */ t->gen = 0; t->countevals = 0; t->state = 0; t->dLastMinEWgroesserNull = 1.0; t->printtime = t->writetime = t->firstwritetime = t->firstprinttime = 0; t->rgpc = new_double(N); t->rgps = new_double(N); t->rgdTmp = new_double(N+1); t->rgBDz = new_double(N); t->rgxmean = new_double(N+2); t->rgxmean[0] = N; ++t->rgxmean; t->rgxold = new_double(N+2); t->rgxold[0] = N; ++t->rgxold; t->rgxbestever = new_double(N+3); t->rgxbestever[0] = N; ++t->rgxbestever; t->rgout = new_double(N+2); t->rgout[0] = N; ++t->rgout; t->rgD = new_double(N); t->C = (double**)new_void(N, sizeof(double*)); t->B = (double**)new_void(N, sizeof(double*)); t->publicFitness = new_double(t->sp.lambda); t->rgFuncValue = new_double(t->sp.lambda+1); t->rgFuncValue[0]=t->sp.lambda; ++t->rgFuncValue; t->arFuncValueHist = new_double(10+(int)ceil(3.*10.*N/t->sp.lambda)+1); t->arFuncValueHist[0] = (double)(10+(int)ceil(3.*10.*N/t->sp.lambda)); t->arFuncValueHist++; for (i = 0; i < N; ++i) { t->C[i] = new_double(i+1); t->B[i] = new_double(N); } t->index = (int *) new_void(t->sp.lambda, sizeof(int)); for (i = 0; i < t->sp.lambda; ++i) t->index[i] = i; /* should not be necessary */ t->rgrgx = (double **)new_void(t->sp.lambda, sizeof(double*)); for (i = 0; i < t->sp.lambda; ++i) { t->rgrgx[i] = new_double(N+2); t->rgrgx[i][0] = N; t->rgrgx[i]++; } /* Initialize newed space */ for (i = 0; i < N; ++i) for (j = 0; j < i; ++j) t->C[i][j] = t->B[i][j] = t->B[j][i] = 0.; for (i = 0; i < N; ++i) { t->B[i][i] = 1.; t->C[i][i] = t->rgD[i] = t->sp.rgInitialStds[i] * sqrt(N / trace); t->C[i][i] *= t->C[i][i]; t->rgpc[i] = t->rgps[i] = 0.; } t->minEW = rgdouMin(t->rgD, N); t->minEW = t->minEW * t->minEW; t->maxEW = rgdouMax(t->rgD, N); t->maxEW = t->maxEW * t->maxEW; t->maxdiagC=t->C[0][0]; for(i=1;imaxdiagCC[i][i]) t->maxdiagC=t->C[i][i]; t->mindiagC=t->C[0][0]; for(i=1;imindiagC>t->C[i][i]) t->mindiagC=t->C[i][i]; /* set xmean */ for (i = 0; i < N; ++i) t->rgxmean[i] = t->rgxold[i] = t->sp.xstart[i]; /* use in case xstart as typicalX */ if (t->sp.typicalXcase) for (i = 0; i < N; ++i) t->rgxmean[i] += t->sigma * t->rgD[i] * random_Gauss(&t->rand); if (strcmp(t->sp.resumefile, "_no_") != 0) cmaes_resume_distribution(t, t->sp.resumefile); return (t->publicFitness); } /* cmaes_init() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void cmaes_resume_distribution(cmaes_t *t, char *filename) { int i, j, res, n; double d; FILE *fp = fopen( filename, "r"); if(fp == 0) { ERRORMESSAGE("cmaes_resume_distribution(): could not open '", filename, "'",0); return; } /* count number of "resume" entries */ i = 0; res = 0; while (1) { if ((res = fscanf(fp, " resume %lg", &d)) == EOF) break; else if (res==0) fscanf(fp, " %*s"); else if(res > 0) i += 1; } /* go to last "resume" entry */ n = i; i = 0; res = 0; rewind(fp); while (i 0) ++i; } if (d != t->sp.N) FATAL("cmaes_resume_distribution(): Dimension numbers do not match",0,0,0); /* find next "xmean" entry */ while (1) { if ((res = fscanf(fp, " xmean %lg", &d)) == EOF) FATAL("cmaes_resume_distribution(): 'xmean' not found",0,0,0); else if (res==0) fscanf(fp, " %*s"); else if(res > 0) break; } /* read xmean */ t->rgxmean[0] = d; res = 1; for(i = 1; i < t->sp.N; ++i) res += fscanf(fp, " %lg", &t->rgxmean[i]); if (res != t->sp.N) FATAL("cmaes_resume_distribution(): xmean: dimensions differ",0,0,0); /* find next "path for sigma" entry */ while (1) { if ((res = fscanf(fp, " path for sigma %lg", &d)) == EOF) FATAL("cmaes_resume_distribution(): 'path for sigma' not found",0,0,0); else if (res==0) fscanf(fp, " %*s"); else if(res > 0) break; } /* read ps */ t->rgps[0] = d; res = 1; for(i = 1; i < t->sp.N; ++i) res += fscanf(fp, " %lg", &t->rgps[i]); if (res != t->sp.N) FATAL("cmaes_resume_distribution(): ps: dimensions differ",0,0,0); /* find next "path for C" entry */ while (1) { if ((res = fscanf(fp, " path for C %lg", &d)) == EOF) FATAL("cmaes_resume_distribution(): 'path for C' not found",0,0,0); else if (res==0) fscanf(fp, " %*s"); else if(res > 0) break; } /* read pc */ t->rgpc[0] = d; res = 1; for(i = 1; i < t->sp.N; ++i) res += fscanf(fp, " %lg", &t->rgpc[i]); if (res != t->sp.N) FATAL("cmaes_resume_distribution(): pc: dimensions differ",0,0,0); /* find next "sigma" entry */ while (1) { if ((res = fscanf(fp, " sigma %lg", &d)) == EOF) FATAL("cmaes_resume_distribution(): 'sigma' not found",0,0,0); else if (res==0) fscanf(fp, " %*s"); else if(res > 0) break; } t->sigma = d; /* find next entry "covariance matrix" */ while (1) { if ((res = fscanf(fp, " covariance matrix %lg", &d)) == EOF) FATAL("cmaes_resume_distribution(): 'covariance matrix' not found",0,0,0); else if (res==0) fscanf(fp, " %*s"); else if(res > 0) break; } /* read C */ t->C[0][0] = d; res = 1; for (i = 1; i < t->sp.N; ++i) for (j = 0; j <= i; ++j) res += fscanf(fp, " %lg", &t->C[i][j]); if (res != (t->sp.N*t->sp.N+t->sp.N)/2) FATAL("cmaes_resume_distribution(): C: dimensions differ",0,0,0); t->flgIniphase = 0; t->flgEigensysIsUptodate = 0; t->flgresumedone = 1; cmaes_UpdateEigensystem(t, 1); } /* cmaes_resume_distribution() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void cmaes_exit(cmaes_t *t) { int i, N = t->sp.N; t->state = -1; /* not really useful at the moment */ free( t->rgpc); free( t->rgps); free( t->rgdTmp); free( t->rgBDz); free( --t->rgxmean); free( --t->rgxold); free( --t->rgxbestever); free( --t->rgout); free( t->rgD); for (i = 0; i < N; ++i) { free( t->C[i]); free( t->B[i]); } for (i = 0; i < t->sp.lambda; ++i) free( --t->rgrgx[i]); free( t->rgrgx); free( t->C); free( t->B); free( t->index); free( t->publicFitness); free( --t->rgFuncValue); free( --t->arFuncValueHist); random_exit (&t->rand); readpara_exit (&t->sp); } /* cmaes_exit() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double const * cmaes_SetMean(cmaes_t *t, const double *xmean) /* * Distribution mean could be changed before SamplePopulation(). * This might lead to unexpected behaviour if done repeatedly. */ { int i, N=t->sp.N; if (t->state >= 1 && t->state < 3) FATAL("cmaes_SetMean: mean cannot be set inbetween the calls of ", "SamplePopulation and UpdateDistribution",0,0); if (xmean != 0 && xmean != t->rgxmean) for(i = 0; i < N; ++i) t->rgxmean[i] = xmean[i]; else xmean = t->rgxmean; return xmean; } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double * const * cmaes_SamplePopulation(cmaes_t *t) { int iNk, i, j, N=t->sp.N; int flgdiag = ((t->sp.diagonalCov == 1) || (t->sp.diagonalCov >= t->gen)); double sum; double const *xmean = t->rgxmean; /* cmaes_SetMean(t, xmean); * xmean could be changed at this point */ /* calculate eigensystem */ if (!t->flgEigensysIsUptodate) { if (!flgdiag) cmaes_UpdateEigensystem(t, 0); else { for (i = 0; i < N; ++i) t->rgD[i] = sqrt(t->C[i][i]); t->minEW = douSquare(rgdouMin(t->rgD, N)); t->maxEW = douSquare(rgdouMax(t->rgD, N)); t->flgEigensysIsUptodate = 1; timings_start(&t->eigenTimings); } } /* treat minimal standard deviations and numeric problems */ TestMinStdDevs(t); for (iNk = 0; iNk < t->sp.lambda; ++iNk) { /* generate scaled random vector (D * z) */ for (i = 0; i < N; ++i) if (flgdiag) t->rgrgx[iNk][i] = xmean[i] + t->sigma * t->rgD[i] * random_Gauss(&t->rand); else t->rgdTmp[i] = t->rgD[i] * random_Gauss(&t->rand); if (!flgdiag) /* add mutation (sigma * B * (D*z)) */ for (i = 0; i < N; ++i) { for (j = 0, sum = 0.; j < N; ++j) sum += t->B[i][j] * t->rgdTmp[j]; t->rgrgx[iNk][i] = xmean[i] + t->sigma * sum; } } if(t->state == 3 || t->gen == 0) ++t->gen; t->state = 1; return(t->rgrgx); } /* SamplePopulation() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double const * cmaes_ReSampleSingle_old( cmaes_t *t, double *rgx) { int i, j, N=t->sp.N; double sum; if (rgx == 0) FATAL("cmaes_ReSampleSingle(): Missing input double *x",0,0,0); for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i] * random_Gauss(&t->rand); /* add mutation (sigma * B * (D*z)) */ for (i = 0; i < N; ++i) { for (j = 0, sum = 0.; j < N; ++j) sum += t->B[i][j] * t->rgdTmp[j]; rgx[i] = t->rgxmean[i] + t->sigma * sum; } return rgx; } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double * const * cmaes_ReSampleSingle( cmaes_t *t, int iindex) { int i, j, N=t->sp.N; double *rgx; double sum; static char s[99]; if (iindex < 0 || iindex >= t->sp.lambda) { sprintf(s, "index==%d must be between 0 and %d", iindex, t->sp.lambda); FATAL("cmaes_ReSampleSingle(): Population member ",s,0,0); } rgx = t->rgrgx[iindex]; for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i] * random_Gauss(&t->rand); /* add mutation (sigma * B * (D*z)) */ for (i = 0; i < N; ++i) { for (j = 0, sum = 0.; j < N; ++j) sum += t->B[i][j] * t->rgdTmp[j]; rgx[i] = t->rgxmean[i] + t->sigma * sum; } return(t->rgrgx); } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double * cmaes_SampleSingleInto( cmaes_t *t, double *rgx) { int i, j, N=t->sp.N; double sum; if (rgx == 0) rgx = new_double(N); for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i] * random_Gauss(&t->rand); /* add mutation (sigma * B * (D*z)) */ for (i = 0; i < N; ++i) { for (j = 0, sum = 0.; j < N; ++j) sum += t->B[i][j] * t->rgdTmp[j]; rgx[i] = t->rgxmean[i] + t->sigma * sum; } return rgx; } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double * cmaes_PerturbSolutionInto( cmaes_t *t, double *rgx, double const *xmean, double eps) { int i, j, N=t->sp.N; double sum; if (rgx == 0) rgx = new_double(N); if (xmean == 0) FATAL("cmaes_PerturbSolutionInto(): xmean was not given",0,0,0); for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i] * random_Gauss(&t->rand); /* add mutation (sigma * B * (D*z)) */ for (i = 0; i < N; ++i) { for (j = 0, sum = 0.; j < N; ++j) sum += t->B[i][j] * t->rgdTmp[j]; rgx[i] = xmean[i] + eps * t->sigma * sum; } return rgx; } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ double * cmaes_UpdateDistribution( cmaes_t *t, const double *rgFunVal) { int i, j, iNk, hsig, N=t->sp.N; int flgdiag = ((t->sp.diagonalCov == 1) || (t->sp.diagonalCov >= t->gen)); double sum; double psxps; if(t->state == 3) FATAL("cmaes_UpdateDistribution(): You need to call \n", "SamplePopulation() before update can take place.",0,0); if(rgFunVal == 0) FATAL("cmaes_UpdateDistribution(): ", "Fitness function value array input is missing.",0,0); if(t->state == 1) /* function values are delivered here */ t->countevals += t->sp.lambda; else ERRORMESSAGE("cmaes_UpdateDistribution(): unexpected state",0,0,0); /* assign function values */ for (i=0; i < t->sp.lambda; ++i) t->rgrgx[i][N] = t->rgFuncValue[i] = rgFunVal[i]; /* Generate index */ Sorted_index(rgFunVal, t->index, t->sp.lambda); /* Test if function values are identical, escape flat fitness */ if (t->rgFuncValue[t->index[0]] == t->rgFuncValue[t->index[(int)t->sp.lambda/2]]) { t->sigma *= exp(0.2+t->sp.cs/t->sp.damps); ERRORMESSAGE("Warning: sigma increased due to equal function values\n", " Reconsider the formulation of the objective function",0,0); } /* update function value history */ for(i = (int)*(t->arFuncValueHist-1)-1; i > 0; --i) /* for(i = t->arFuncValueHist[-1]-1; i > 0; --i) */ t->arFuncValueHist[i] = t->arFuncValueHist[i-1]; t->arFuncValueHist[0] = rgFunVal[t->index[0]]; /* update xbestever */ if (t->rgxbestever[N] > t->rgrgx[t->index[0]][N] || t->gen == 1) for (i = 0; i <= N; ++i) { t->rgxbestever[i] = t->rgrgx[t->index[0]][i]; t->rgxbestever[N+1] = t->countevals; } /* calculate xmean and rgBDz~N(0,C) */ for (i = 0; i < N; ++i) { t->rgxold[i] = t->rgxmean[i]; t->rgxmean[i] = 0.; for (iNk = 0; iNk < t->sp.mu; ++iNk) t->rgxmean[i] += t->sp.weights[iNk] * t->rgrgx[t->index[iNk]][i]; t->rgBDz[i] = sqrt(t->sp.mueff)*(t->rgxmean[i] - t->rgxold[i])/t->sigma; } /* calculate z := D^(-1) * B^(-1) * rgBDz into rgdTmp */ for (i = 0; i < N; ++i) { if (!flgdiag) for (j = 0, sum = 0.; j < N; ++j) sum += t->B[j][i] * t->rgBDz[j]; else sum = t->rgBDz[i]; t->rgdTmp[i] = sum / t->rgD[i]; } /* TODO?: check length of t->rgdTmp and set an upper limit, e.g. 6 stds */ /* in case of manipulation of arx, this can prevent an increase of sigma by several orders of magnitude within one step; a five-fold increase in one step can still happen. */ /* for (j = 0, sum = 0.; j < N; ++j) sum += t->rgdTmp[j] * t->rgdTmp[j]; if (sqrt(sum) > chiN + 6. * sqrt(0.5)) { rgdTmp length should be set to upper bound and hsig should become zero } */ /* cumulation for sigma (ps) using B*z */ for (i = 0; i < N; ++i) { if (!flgdiag) for (j = 0, sum = 0.; j < N; ++j) sum += t->B[i][j] * t->rgdTmp[j]; else sum = t->rgdTmp[i]; t->rgps[i] = (1. - t->sp.cs) * t->rgps[i] + sqrt(t->sp.cs * (2. - t->sp.cs)) * sum; } /* calculate norm(ps)^2 */ for (i = 0, psxps = 0.; i < N; ++i) psxps += t->rgps[i] * t->rgps[i]; /* cumulation for covariance matrix (pc) using B*D*z~N(0,C) */ hsig = sqrt(psxps) / sqrt(1. - pow(1.-t->sp.cs, 2*t->gen)) / t->chiN < 1.4 + 2./(N+1); for (i = 0; i < N; ++i) { t->rgpc[i] = (1. - t->sp.ccumcov) * t->rgpc[i] + hsig * sqrt(t->sp.ccumcov * (2. - t->sp.ccumcov)) * t->rgBDz[i]; } /* stop initial phase */ if (t->flgIniphase && t->gen > douMin(1/t->sp.cs, 1+N/t->sp.mucov)) { if (psxps / t->sp.damps / (1.-pow((1. - t->sp.cs), t->gen)) < N * 1.05) t->flgIniphase = 0; } #if 0 /* remove momentum in ps, if ps is large and fitness is getting worse */ /* This is obsolete due to hsig and harmful in a dynamic environment */ if(psxps/N > 1.5 + 10.*sqrt(2./N) && t->arFuncValueHist[0] > t->arFuncValueHist[1] && t->arFuncValueHist[0] > t->arFuncValueHist[2]) { double tfac = sqrt((1 + douMax(0, log(psxps/N))) * N / psxps); for (i=0; irgps[i] *= tfac; psxps *= tfac*tfac; } #endif /* update of C */ Adapt_C2(t, hsig); /* Adapt_C(t); not used anymore */ #if 0 if (t->sp.ccov != 0. && t->flgIniphase == 0) { int k; t->flgEigensysIsUptodate = 0; /* update covariance matrix */ for (i = 0; i < N; ++i) for (j = 0; j <=i; ++j) { t->C[i][j] = (1 - t->sp.ccov) * t->C[i][j] + t->sp.ccov * (1./t->sp.mucov) * (t->rgpc[i] * t->rgpc[j] + (1-hsig)*t->sp.ccumcov*(2.-t->sp.ccumcov) * t->C[i][j]); for (k = 0; k < t->sp.mu; ++k) /* additional rank mu update */ t->C[i][j] += t->sp.ccov * (1-1./t->sp.mucov) * t->sp.weights[k] * (t->rgrgx[t->index[k]][i] - t->rgxold[i]) * (t->rgrgx[t->index[k]][j] - t->rgxold[j]) / t->sigma / t->sigma; } } #endif /* update of sigma */ t->sigma *= exp(((sqrt(psxps)/t->chiN)-1.)*t->sp.cs/t->sp.damps); t->state = 3; return (t->rgxmean); } /* cmaes_UpdateDistribution() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ static void Adapt_C2(cmaes_t *t, int hsig) { int i, j, k, N=t->sp.N; int flgdiag = ((t->sp.diagonalCov == 1) || (t->sp.diagonalCov >= t->gen)); if (t->sp.ccov != 0. && t->flgIniphase == 0) { /* definitions for speeding up inner-most loop */ double ccov1 = douMin(t->sp.ccov * (1./t->sp.mucov) * (flgdiag ? (N+1.5) / 3. : 1.), 1.); double ccovmu = douMin(t->sp.ccov * (1-1./t->sp.mucov)* (flgdiag ? (N+1.5) / 3. : 1.), 1.-ccov1); double sigmasquare = t->sigma * t->sigma; t->flgEigensysIsUptodate = 0; /* update covariance matrix */ for (i = 0; i < N; ++i) for (j = flgdiag ? i : 0; j <= i; ++j) { t->C[i][j] = (1 - ccov1 - ccovmu) * t->C[i][j] + ccov1 * (t->rgpc[i] * t->rgpc[j] + (1-hsig)*t->sp.ccumcov*(2.-t->sp.ccumcov) * t->C[i][j]); for (k = 0; k < t->sp.mu; ++k) { /* additional rank mu update */ t->C[i][j] += ccovmu * t->sp.weights[k] * (t->rgrgx[t->index[k]][i] - t->rgxold[i]) * (t->rgrgx[t->index[k]][j] - t->rgxold[j]) / sigmasquare; } } /* update maximal and minimal diagonal value */ t->maxdiagC = t->mindiagC = t->C[0][0]; for (i = 1; i < N; ++i) { if (t->maxdiagC < t->C[i][i]) t->maxdiagC = t->C[i][i]; else if (t->mindiagC > t->C[i][i]) t->mindiagC = t->C[i][i]; } } /* if ccov... */ } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ static void TestMinStdDevs(cmaes_t *t) /* increases sigma */ { int i, N = t->sp.N; if (t->sp.rgDiffMinChange == 0) return; for (i = 0; i < N; ++i) while (t->sigma * sqrt(t->C[i][i]) < t->sp.rgDiffMinChange[i]) t->sigma *= exp(0.05+t->sp.cs/t->sp.damps); } /* cmaes_TestMinStdDevs() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void cmaes_WriteToFile(cmaes_t *t, const char *key, const char *name) { cmaes_WriteToFileAW(t, key, name, "a"); /* default is append */ } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void cmaes_WriteToFileAW(cmaes_t *t, const char *key, const char *name, const char *appendwrite) { const char *s = "tmpcmaes.dat"; FILE *fp; if (name == 0) name = s; fp = fopen( name, appendwrite); if(fp == 0) { ERRORMESSAGE("cmaes_WriteToFile(): could not open '", name, "' with flag ", appendwrite); return; } if (appendwrite[0] == 'w') { /* write a header line, very rudimentary */ fprintf(fp, "%% # %s (randomSeed=%d, %s)\n", key, t->sp.seed, getTimeStr()); } else if (t->gen > 0 || strncmp(name, "outcmaesfit", 11) != 0) cmaes_WriteToFilePtr(t, key, fp); /* do not write fitness for gen==0 */ fclose(fp); } /* WriteToFile */ /* --------------------------------------------------------- */ void cmaes_WriteToFilePtr(cmaes_t *t, const char *key, FILE *fp) /* this hack reads key words from input key for data to be written to * a file, see file signals.par as input file. The length of the keys * is mostly fixed, see key += number in the code! If the key phrase * does not match the expectation the output might be strange. for * cmaes_t *t == 0 it solely prints key as a header line. Input key * must be zero terminated. */ { int i, k, N=(t ? t->sp.N : 0); char const *keyend, *keystart; const char *s = "few"; if (key == 0) key = s; keystart = key; /* for debugging purpose */ keyend = key + strlen(key); while (key < keyend) { if (strncmp(key, "axisratio", 9) == 0) { fprintf(fp, "%.2e", sqrt(t->maxEW/t->minEW)); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "idxminSD", 8) == 0) { int mini=0; for(i=N-1;i>0;--i) if(t->mindiagC==t->C[i][i]) mini=i; fprintf(fp, "%d", mini+1); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "idxmaxSD", 8) == 0) { int maxi=0; for(i=N-1;i>0;--i) if(t->maxdiagC==t->C[i][i]) maxi=i; fprintf(fp, "%d", maxi+1); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } /* new coordinate system == all eigenvectors */ if (strncmp(key, "B", 1) == 0) { /* int j, index[N]; */ int j, *iindex=(int*)(new_void(N,sizeof(int))); /* MT */ Sorted_index(t->rgD, iindex, N); /* should not be necessary, see end of QLalgo2 */ /* One eigenvector per row, sorted: largest eigenvalue first */ for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) fprintf(fp, "%g%c", t->B[j][iindex[N-1-i]], (j==N-1)?'\n':'\t'); ++key; free(iindex); /* MT */ } /* covariance matrix */ if (strncmp(key, "C", 1) == 0) { int j; for (i = 0; i < N; ++i) for (j = 0; j <= i; ++j) fprintf(fp, "%g%c", t->C[i][j], (j==i)?'\n':'\t'); ++key; } /* (processor) time (used) since begin of execution */ if (strncmp(key, "clock", 4) == 0) { timings_update(&t->eigenTimings); fprintf(fp, "%.1f %.1f", t->eigenTimings.totaltotaltime, t->eigenTimings.tictoctime); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } /* ratio between largest and smallest standard deviation */ if (strncmp(key, "stddevratio", 11) == 0) /* std dev in coordinate axes */ { fprintf(fp, "%g", sqrt(t->maxdiagC/t->mindiagC)); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } /* standard deviations in coordinate directions (sigma*sqrt(C[i,i])) */ if (strncmp(key, "coorstddev", 10) == 0 || strncmp(key, "stddev", 6) == 0) /* std dev in coordinate axes */ { for (i = 0; i < N; ++i) fprintf(fp, "%s%g", (i==0) ? "":"\t", t->sigma*sqrt(t->C[i][i])); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } /* diagonal of D == roots of eigenvalues, sorted */ if (strncmp(key, "diag(D)", 7) == 0) { for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i]; qsort(t->rgdTmp, (unsigned) N, sizeof(double), &SignOfDiff); /* superfluous */ for (i = 0; i < N; ++i) fprintf(fp, "%s%g", (i==0) ? "":"\t", t->rgdTmp[i]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "dim", 3) == 0) { fprintf(fp, "%d", N); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "eval", 4) == 0) { fprintf(fp, "%.0f", t->countevals); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "few(diag(D))", 12) == 0)/* between four and six axes */ { int add = (int)(0.5 + (N + 1.) / 5.); for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i]; qsort(t->rgdTmp, (unsigned) N, sizeof(double), &SignOfDiff); for (i = 0; i < N-1; i+=add) /* print always largest */ fprintf(fp, "%s%g", (i==0) ? "":"\t", t->rgdTmp[N-1-i]); fprintf(fp, "\t%g\n", t->rgdTmp[0]); /* and smallest */ break; /* number of printed values is not determined */ } if (strncmp(key, "fewinfo", 7) == 0) { fprintf(fp," Iter Fevals Function Value Sigma "); fprintf(fp, "MaxCoorDev MinCoorDev AxisRatio MinDii Time in eig\n"); while (*key != '+' && *key != '\0' && key < keyend) ++key; } if (strncmp(key, "few", 3) == 0) { fprintf(fp, " %4.0f ", t->gen); fprintf(fp, " %5.0f ", t->countevals); fprintf(fp, "%.15e", t->rgFuncValue[t->index[0]]); fprintf(fp, " %.2e %.2e %.2e", t->sigma, t->sigma*sqrt(t->maxdiagC), t->sigma*sqrt(t->mindiagC)); fprintf(fp, " %.2e %.2e", sqrt(t->maxEW/t->minEW), sqrt(t->minEW)); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "funval", 6) == 0 || strncmp(key, "fitness", 6) == 0) { fprintf(fp, "%.15e", t->rgFuncValue[t->index[0]]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "fbestever", 9) == 0) { fprintf(fp, "%.15e", t->rgxbestever[N]); /* f-value */ while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "fmedian", 7) == 0) { fprintf(fp, "%.15e", t->rgFuncValue[t->index[(int)(t->sp.lambda/2)]]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "fworst", 6) == 0) { fprintf(fp, "%.15e", t->rgFuncValue[t->index[t->sp.lambda-1]]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "arfunval", 8) == 0 || strncmp(key, "arfitness", 8) == 0) { for (i = 0; i < N; ++i) fprintf(fp, "%s%.10e", (i==0) ? "" : "\t", t->rgFuncValue[t->index[i]]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "gen", 3) == 0) { fprintf(fp, "%.0f", t->gen); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "iter", 4) == 0) { fprintf(fp, "%.0f", t->gen); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "sigma", 5) == 0) { fprintf(fp, "%.4e", t->sigma); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "minSD", 5) == 0) /* minimal standard deviation */ { fprintf(fp, "%.4e", sqrt(t->mindiagC)); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "maxSD", 5) == 0) { fprintf(fp, "%.4e", sqrt(t->maxdiagC)); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "mindii", 6) == 0) { fprintf(fp, "%.4e", sqrt(t->minEW)); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "0", 1) == 0) { fprintf(fp, "0"); ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "lambda", 6) == 0) { fprintf(fp, "%d", t->sp.lambda); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "N", 1) == 0) { fprintf(fp, "%d", N); ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "resume", 6) == 0) { fprintf(fp, "\n# resume %d\n", N); fprintf(fp, "xmean\n"); cmaes_WriteToFilePtr(t, "xmean", fp); fprintf(fp, "path for sigma\n"); for(i=0; irgps[i], (i==N-1) ? "\n":"\t"); fprintf(fp, "path for C\n"); for(i=0; irgpc[i], (i==N-1) ? "\n":"\t"); fprintf(fp, "sigma %g\n", t->sigma); /* note than B and D might not be up-to-date */ fprintf(fp, "covariance matrix\n"); cmaes_WriteToFilePtr(t, "C", fp); while (*key != '+' && *key != '\0' && key < keyend) ++key; } if (strncmp(key, "xbest", 5) == 0) { /* best x in recent generation */ for(i=0; irgrgx[t->index[0]][i]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "xmean", 5) == 0) { for(i=0; irgxmean[i]); while (*key != '+' && *key != '\0' && key < keyend) ++key; fprintf(fp, "%c", (*key=='+') ? '\t':'\n'); } if (strncmp(key, "all", 3) == 0) { time_t ti = time(0); fprintf(fp, "\n# --------- %s\n", asctime(localtime(&ti))); fprintf(fp, " N %d\n", N); fprintf(fp, " seed %d\n", t->sp.seed); fprintf(fp, "function evaluations %.0f\n", t->countevals); fprintf(fp, "elapsed (CPU) time [s] %.2f\n", t->eigenTimings.totaltotaltime); fprintf(fp, "function value f(x)=%g\n", t->rgrgx[t->index[0]][N]); fprintf(fp, "maximal standard deviation %g\n", t->sigma*sqrt(t->maxdiagC)); fprintf(fp, "minimal standard deviation %g\n", t->sigma*sqrt(t->mindiagC)); fprintf(fp, "sigma %g\n", t->sigma); fprintf(fp, "axisratio %g\n", rgdouMax(t->rgD, N)/rgdouMin(t->rgD, N)); fprintf(fp, "xbestever found after %.0f evaluations, function value %g\n", t->rgxbestever[N+1], t->rgxbestever[N]); for(i=0; irgxbestever[i], (i%5==4||i==N-1)?'\n':' '); fprintf(fp, "xbest (of last generation, function value %g)\n", t->rgrgx[t->index[0]][N]); for(i=0; irgrgx[t->index[0]][i], (i%5==4||i==N-1)?'\n':' '); fprintf(fp, "xmean \n"); for(i=0; irgxmean[i], (i%5==4||i==N-1)?'\n':' '); fprintf(fp, "Standard deviation of coordinate axes (sigma*sqrt(diag(C)))\n"); for(i=0; isigma*sqrt(t->C[i][i]), (i%5==4||i==N-1)?'\n':' '); fprintf(fp, "Main axis lengths of mutation ellipsoid (sigma*diag(D))\n"); for (i = 0; i < N; ++i) t->rgdTmp[i] = t->rgD[i]; qsort(t->rgdTmp, (unsigned) N, sizeof(double), &SignOfDiff); for(i=0; isigma*t->rgdTmp[N-1-i], (i%5==4||i==N-1)?'\n':' '); fprintf(fp, "Longest axis (b_i where d_ii=max(diag(D))\n"); k = MaxIdx(t->rgD, N); for(i=0; iB[i][k], (i%5==4||i==N-1)?'\n':' '); fprintf(fp, "Shortest axis (b_i where d_ii=max(diag(D))\n"); k = MinIdx(t->rgD, N); for(i=0; iB[i][k], (i%5==4||i==N-1)?'\n':' '); while (*key != '+' && *key != '\0' && key < keyend) ++key; } /* "all" */ #if 0 /* could become generic part */ s0 = key; d = cmaes_Get(t, key); /* TODO find way to detect whether key was found */ if (key == s0) /* this does not work, is always true */ { /* write out stuff, problem: only generic format is available */ /* move in key until "+" or end */ } #endif if (*key == '\0') break; else if (*key != '+') { /* last key was not recognized */ ERRORMESSAGE("cmaes_t:WriteToFilePtr(): unrecognized key '", key, "'", 0); while (*key != '+' && *key != '\0' && key < keyend) ++key; } while (*key == '+') ++key; } /* while key < keyend */ if (key > keyend) FATAL("cmaes_t:WriteToFilePtr(): BUG regarding key sequence",0,0,0); } /* WriteToFilePtr */ /* --------------------------------------------------------- */ double cmaes_Get( cmaes_t *t, char const *s) { int N=t->sp.N; if (strncmp(s, "axisratio", 5) == 0) { /* between lengths of longest and shortest principal axis of the distribution ellipsoid */ return (rgdouMax(t->rgD, N)/rgdouMin(t->rgD, N)); } else if (strncmp(s, "eval", 4) == 0) { /* number of function evaluations */ return (t->countevals); } else if (strncmp(s, "fctvalue", 6) == 0 || strncmp(s, "funcvalue", 6) == 0 || strncmp(s, "funvalue", 6) == 0 || strncmp(s, "fitness", 3) == 0) { /* recent best function value */ return(t->rgFuncValue[t->index[0]]); } else if (strncmp(s, "fbestever", 7) == 0) { /* ever best function value */ return(t->rgxbestever[N]); } else if (strncmp(s, "generation", 3) == 0 || strncmp(s, "iteration", 4) == 0) { return(t->gen); } else if (strncmp(s, "maxeval", 4) == 0 || strncmp(s, "MaxFunEvals", 8) == 0 || strncmp(s, "stopMaxFunEvals", 12) == 0) { /* maximal number of function evaluations */ return(t->sp.stopMaxFunEvals); } else if (strncmp(s, "maxgen", 4) == 0 || strncmp(s, "MaxIter", 7) == 0 || strncmp(s, "stopMaxIter", 11) == 0) { /* maximal number of generations */ return(ceil(t->sp.stopMaxIter)); } else if (strncmp(s, "maxaxislength", 5) == 0) { /* sigma * max(diag(D)) */ return(t->sigma * sqrt(t->maxEW)); } else if (strncmp(s, "minaxislength", 5) == 0) { /* sigma * min(diag(D)) */ return(t->sigma * sqrt(t->minEW)); } else if (strncmp(s, "maxstddev", 4) == 0) { /* sigma * sqrt(max(diag(C))) */ return(t->sigma * sqrt(t->maxdiagC)); } else if (strncmp(s, "minstddev", 4) == 0) { /* sigma * sqrt(min(diag(C))) */ return(t->sigma * sqrt(t->mindiagC)); } else if (strncmp(s, "N", 1) == 0 || strcmp(s, "n") == 0 || strncmp(s, "dimension", 3) == 0) { return (N); } else if (strncmp(s, "lambda", 3) == 0 || strncmp(s, "samplesize", 8) == 0 || strncmp(s, "popsize", 7) == 0) { /* sample size, offspring population size */ return(t->sp.lambda); } else if (strncmp(s, "sigma", 3) == 0) { return(t->sigma); } FATAL( "cmaes_Get(cmaes_t, char const * s): No match found for s='", s, "'",0); return(0); } /* cmaes_Get() */ /* --------------------------------------------------------- */ double * cmaes_GetInto( cmaes_t *t, char const *s, double *res) { int i, N = t->sp.N; double const * res0 = cmaes_GetPtr(t, s); if (res == 0) res = new_double(N); for (i = 0; i < N; ++i) res[i] = res0[i]; return res; } /* --------------------------------------------------------- */ double * cmaes_GetNew( cmaes_t *t, char const *s) { return (cmaes_GetInto(t, s, 0)); } /* --------------------------------------------------------- */ const double * cmaes_GetPtr( cmaes_t *t, char const *s) { int i, N=t->sp.N; /* diagonal of covariance matrix */ if (strncmp(s, "diag(C)", 7) == 0) { for (i = 0; i < N; ++i) t->rgout[i] = t->C[i][i]; return(t->rgout); } /* diagonal of axis lengths matrix */ else if (strncmp(s, "diag(D)", 7) == 0) { return(t->rgD); } /* vector of standard deviations sigma*sqrt(diag(C)) */ else if (strncmp(s, "stddev", 3) == 0) { for (i = 0; i < N; ++i) t->rgout[i] = t->sigma * sqrt(t->C[i][i]); return(t->rgout); } /* bestever solution seen so far */ else if (strncmp(s, "xbestever", 7) == 0) return(t->rgxbestever); /* recent best solution of the recent population */ else if (strncmp(s, "xbest", 5) == 0) return(t->rgrgx[t->index[0]]); /* mean of the recent distribution */ else if (strncmp(s, "xmean", 1) == 0) return(t->rgxmean); return(0); } /* --------------------------------------------------------- */ /* tests stopping criteria * returns a string of satisfied stopping criterion for each line * otherwise 0 */ const char * cmaes_TestForTermination( cmaes_t *t) { double range, fac; int iAchse, iKoo; int flgdiag = ((t->sp.diagonalCov == 1) || (t->sp.diagonalCov >= t->gen)); static char sTestOutString[3024]; char * cp = sTestOutString; int i, cTemp, N=t->sp.N; cp[0] = '\0'; /* function value reached */ if ((t->gen > 1 || t->state > 1) && t->sp.stStopFitness.flg && t->rgFuncValue[t->index[0]] <= t->sp.stStopFitness.val) cp += sprintf(cp, "Fitness: function value %7.2e <= stopFitness (%7.2e)\n", t->rgFuncValue[t->index[0]], t->sp.stStopFitness.val); /* TolFun */ range = douMax(rgdouMax(t->arFuncValueHist, (int)douMin(t->gen,*(t->arFuncValueHist-1))), rgdouMax(t->rgFuncValue, t->sp.lambda)) - douMin(rgdouMin(t->arFuncValueHist, (int)douMin(t->gen, *(t->arFuncValueHist-1))), rgdouMin(t->rgFuncValue, t->sp.lambda)); if (t->gen > 0 && range <= t->sp.stopTolFun) { cp += sprintf(cp, "TolFun: function value differences %7.2e < stopTolFun=%7.2e\n", range, t->sp.stopTolFun); } /* TolFunHist */ if (t->gen > *(t->arFuncValueHist-1)) { range = rgdouMax(t->arFuncValueHist, (int)*(t->arFuncValueHist-1)) - rgdouMin(t->arFuncValueHist, (int)*(t->arFuncValueHist-1)); if (range <= t->sp.stopTolFunHist) cp += sprintf(cp, "TolFunHist: history of function value changes %7.2e stopTolFunHist=%7.2e", range, t->sp.stopTolFunHist); } /* TolX */ for(i=0, cTemp=0; isigma * sqrt(t->C[i][i]) < t->sp.stopTolX) ? 1 : 0; cTemp += (t->sigma * t->rgpc[i] < t->sp.stopTolX) ? 1 : 0; } if (cTemp == 2*N) { cp += sprintf(cp, "TolX: object variable changes below %7.2e \n", t->sp.stopTolX); } /* TolUpX */ for(i=0; isigma * sqrt(t->C[i][i]) > t->sp.stopTolUpXFactor * t->sp.rgInitialStds[i]) break; } if (i < N) { cp += sprintf(cp, "TolUpX: standard deviation increased by more than %7.2e, larger initial standard deviation recommended \n", t->sp.stopTolUpXFactor); } /* Condition of C greater than dMaxSignifKond */ if (t->maxEW >= t->minEW * t->dMaxSignifKond) { cp += sprintf(cp, "ConditionNumber: maximal condition number %7.2e reached. maxEW=%7.2e,minEW=%7.2e,maxdiagC=%7.2e,mindiagC=%7.2e\n", t->dMaxSignifKond, t->maxEW, t->minEW, t->maxdiagC, t->mindiagC); } /* if */ /* Principal axis i has no effect on xmean, ie. x == x + 0.1 * sigma * rgD[i] * B[i] */ if (!flgdiag) { for (iAchse = 0; iAchse < N; ++iAchse) { fac = 0.1 * t->sigma * t->rgD[iAchse]; for (iKoo = 0; iKoo < N; ++iKoo){ if (t->rgxmean[iKoo] != t->rgxmean[iKoo] + fac * t->B[iKoo][iAchse]) break; } if (iKoo == N) { /* t->sigma *= exp(0.2+t->sp.cs/t->sp.damps); */ cp += sprintf(cp, "NoEffectAxis: standard deviation 0.1*%7.2e in principal axis %d without effect\n", fac/0.1, iAchse); break; } /* if (iKoo == N) */ } /* for iAchse */ } /* if flgdiag */ /* Component of xmean is not changed anymore */ for (iKoo = 0; iKoo < N; ++iKoo) { if (t->rgxmean[iKoo] == t->rgxmean[iKoo] + 0.2*t->sigma*sqrt(t->C[iKoo][iKoo])) { /* t->C[iKoo][iKoo] *= (1 + t->sp.ccov); */ /* flg = 1; */ cp += sprintf(cp, "NoEffectCoordinate: standard deviation 0.2*%7.2e in coordinate %d without effect\n", t->sigma*sqrt(t->C[iKoo][iKoo]), iKoo); break; } } /* for iKoo */ /* if (flg) t->sigma *= exp(0.05+t->sp.cs/t->sp.damps); */ if(t->countevals >= t->sp.stopMaxFunEvals) cp += sprintf(cp, "MaxFunEvals: conducted function evaluations %.0f >= %g\n", t->countevals, t->sp.stopMaxFunEvals); if(t->gen >= t->sp.stopMaxIter) cp += sprintf(cp, "MaxIter: number of iterations %.0f >= %g\n", t->gen, t->sp.stopMaxIter); if(t->flgStop) cp += sprintf(cp, "Manual: stop signal read\n"); #if 0 else if (0) { for(i=0, cTemp=0; i320) ERRORMESSAGE("Bug in cmaes_t:Test(): sTestOutString too short",0,0,0); if (cp != sTestOutString) { return sTestOutString; } return(0); } /* cmaes_Test() */ /* --------------------------------------------------------- */ void cmaes_ReadSignals(cmaes_t *t, char const *filename) { const char *s = "signals.par"; FILE *fp; if (filename == 0) filename = s; fp = fopen( filename, "r"); if(fp == 0) { return; } cmaes_ReadFromFilePtr( t, fp); fclose(fp); } /* --------------------------------------------------------- */ void cmaes_ReadFromFilePtr( cmaes_t *t, FILE *fp) /* reading commands e.g. from signals.par file */ { const char *keys[15]; char s[199], sin1[99], sin2[129], sin3[99], sin4[99]; int ikey, ckeys, nb; double d; static int flglockprint = 0; static int flglockwrite = 0; static long countiterlastwritten; static long maxdiffitertowrite; /* to prevent long gaps at the beginning */ int flgprinted = 0; int flgwritten = 0; double deltaprinttime = time(0)-t->printtime; /* using clock instead might not be a good */ double deltawritetime = time(0)-t->writetime; /* idea as disc time is not CPU time? */ double deltaprinttimefirst = t->firstprinttime ? time(0)-t->firstprinttime : 0; /* time is in seconds!? */ double deltawritetimefirst = t->firstwritetime ? time(0)-t->firstwritetime : 0; if (countiterlastwritten > t->gen) { /* probably restarted */ maxdiffitertowrite = 0; countiterlastwritten = 0; } keys[0] = " stop%98s %98s"; /* s=="now" or eg "MaxIter+" %lg"-number */ /* works with and without space */ keys[1] = " print %98s %98s"; /* s==keyword for WriteFile */ keys[2] = " write %98s %128s %98s"; /* s1==keyword, s2==filename */ keys[3] = " check%98s %98s"; keys[4] = " maxTimeFractionForEigendecompostion %98s"; ckeys = 5; strcpy(sin2, "tmpcmaes.dat"); if (cmaes_TestForTermination(t)) { deltaprinttime = time(0); /* forces printing */ deltawritetime = time(0); } while(fgets(s, sizeof(s), fp) != 0) { if (s[0] == '#' || s[0] == '%') /* skip comments */ continue; sin1[0] = sin2[0] = sin3[0] = sin4[0] = '\0'; for (ikey=0; ikey < ckeys; ++ikey) { if((nb=sscanf(s, keys[ikey], sin1, sin2, sin3, sin4)) >= 1) { switch(ikey) { case 0 : /* "stop", reads "stop now" or eg. stopMaxIter */ if (strncmp(sin1, "now", 3) == 0) t->flgStop = 1; else if (strncmp(sin1, "MaxFunEvals", 11) == 0) { if (sscanf(sin2, " %lg", &d) == 1) t->sp.stopMaxFunEvals = d; } else if (strncmp(sin1, "MaxIter", 4) == 0) { if (sscanf(sin2, " %lg", &d) == 1) t->sp.stopMaxIter = d; } else if (strncmp(sin1, "Fitness", 7) == 0) { if (sscanf(sin2, " %lg", &d) == 1) { t->sp.stStopFitness.flg = 1; t->sp.stStopFitness.val = d; } } else if (strncmp(sin1, "TolFunHist", 10) == 0) { if (sscanf(sin2, " %lg", &d) == 1) t->sp.stopTolFunHist = d; } else if (strncmp(sin1, "TolFun", 6) == 0) { if (sscanf(sin2, " %lg", &d) == 1) t->sp.stopTolFun = d; } else if (strncmp(sin1, "TolX", 4) == 0) { if (sscanf(sin2, " %lg", &d) == 1) t->sp.stopTolX = d; } else if (strncmp(sin1, "TolUpXFactor", 4) == 0) { if (sscanf(sin2, " %lg", &d) == 1) t->sp.stopTolUpXFactor = d; } break; case 1 : /* "print" */ d = 1; /* default */ if (sscanf(sin2, "%lg", &d) < 1 && deltaprinttimefirst < 1) d = 0; /* default at first time */ if (deltaprinttime >= d && !flglockprint) { cmaes_WriteToFilePtr(t, sin1, stdout); flgprinted = 1; } if(d < 0) flglockprint += 2; break; case 2 : /* "write" */ /* write header, before first generation */ if (t->countevals < t->sp.lambda && t->flgresumedone == 0) cmaes_WriteToFileAW(t, sin1, sin2, "w"); /* overwrite */ d = 0.9; /* default is one with smooth increment of gaps */ if (sscanf(sin3, "%lg", &d) < 1 && deltawritetimefirst < 2) d = 0; /* default is zero for the first second */ if(d < 0) flglockwrite += 2; if (!flglockwrite) { if (deltawritetime >= d) { cmaes_WriteToFile(t, sin1, sin2); flgwritten = 1; } else if (d < 1 && t->gen-countiterlastwritten > maxdiffitertowrite) { cmaes_WriteToFile(t, sin1, sin2); flgwritten = 1; } } break; case 3 : /* check, checkeigen 1 or check eigen 1 */ if (strncmp(sin1, "eigen", 5) == 0) { if (sscanf(sin2, " %lg", &d) == 1) { if (d > 0) t->flgCheckEigen = 1; else t->flgCheckEigen = 0; } else t->flgCheckEigen = 0; } break; case 4 : /* maxTimeFractionForEigendecompostion */ if (sscanf(sin1, " %lg", &d) == 1) t->sp.updateCmode.maxtime = d; break; default : break; } break; /* for ikey */ } /* if line contains keyword */ } /* for each keyword */ } /* while not EOF of signals.par */ if (t->writetime == 0) t->firstwritetime = time(0); if (t->printtime == 0) t->firstprinttime = time(0); if (flgprinted) t->printtime = time(0); if (flgwritten) { t->writetime = time(0); if (t->gen-countiterlastwritten > maxdiffitertowrite) ++maxdiffitertowrite; /* smooth prolongation of writing gaps/intervals */ countiterlastwritten = (long int) t->gen; } --flglockprint; --flglockwrite; flglockprint = (flglockprint > 0) ? 1 : 0; flglockwrite = (flglockwrite > 0) ? 1 : 0; } /* cmaes_ReadFromFilePtr */ /* ========================================================= */ static int Check_Eigen( int N, double **C, double *diag, double **Q) /* exhaustive test of the output of the eigendecomposition needs O(n^3) operations writes to error file returns number of detected inaccuracies */ { /* compute Q diag Q^T and Q Q^T to check */ int i, j, k, res = 0; double cc, dd; static char s[324]; for (i=0; i < N; ++i) for (j=0; j < N; ++j) { for (cc=0.,dd=0., k=0; k < N; ++k) { cc += diag[k] * Q[i][k] * Q[j][k]; dd += Q[i][k] * Q[j][k]; } /* check here, is the normalization the right one? */ if (fabs(cc - C[i>j?i:j][i>j?j:i])/sqrt(C[i][i]*C[j][j]) > 1e-10 && fabs(cc - C[i>j?i:j][i>j?j:i]) > 3e-14) { sprintf(s, "%d %d: %.17e %.17e, %e", i, j, cc, C[i>j?i:j][i>j?j:i], cc-C[i>j?i:j][i>j?j:i]); ERRORMESSAGE("cmaes_t:Eigen(): imprecise result detected ", s, 0, 0); ++res; } if (fabs(dd - (i==j)) > 1e-10) { sprintf(s, "%d %d %.17e ", i, j, dd); ERRORMESSAGE("cmaes_t:Eigen(): imprecise result detected (Q not orthog.)", s, 0, 0); ++res; } } return res; } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void cmaes_UpdateEigensystem(cmaes_t *t, int flgforce) { int i, N = t->sp.N; timings_update(&t->eigenTimings); if(flgforce == 0) { if (t->flgEigensysIsUptodate == 1) return; /* return on modulo generation number */ if (t->sp.updateCmode.flgalways == 0 /* not implemented, always ==0 */ && t->gen < t->genOfEigensysUpdate + t->sp.updateCmode.modulo ) return; /* return on time percentage */ if (t->sp.updateCmode.maxtime < 1.00 && t->eigenTimings.tictoctime > t->sp.updateCmode.maxtime * t->eigenTimings.totaltime && t->eigenTimings.tictoctime > 0.0002) return; } timings_tic(&t->eigenTimings); Eigen( N, t->C, t->rgD, t->B, t->rgdTmp); timings_toc(&t->eigenTimings); /* find largest and smallest eigenvalue, they are supposed to be sorted anyway */ t->minEW = rgdouMin(t->rgD, N); t->maxEW = rgdouMax(t->rgD, N); if (t->flgCheckEigen) /* needs O(n^3)! writes, in case, error message in error file */ i = Check_Eigen( N, t->C, t->rgD, t->B); #if 0 /* Limit Condition of C to dMaxSignifKond+1 */ if (t->maxEW > t->minEW * t->dMaxSignifKond) { ERRORMESSAGE("Warning: Condition number of covariance matrix at upper limit.", " Consider a rescaling or redesign of the objective function. " ,"",""); printf("\nWarning: Condition number of covariance matrix at upper limit\n"); tmp = t->maxEW/t->dMaxSignifKond - t->minEW; tmp = t->maxEW/t->dMaxSignifKond; t->minEW += tmp; for (i=0;iC[i][i] += tmp; t->rgD[i] += tmp; } } /* if */ t->dLastMinEWgroesserNull = minEW; #endif for (i = 0; i < N; ++i) t->rgD[i] = sqrt(t->rgD[i]); t->flgEigensysIsUptodate = 1; t->genOfEigensysUpdate = t->gen; return; } /* cmaes_UpdateEigensystem() */ /* ========================================================= */ static void Eigen( int N, double **C, double *diag, double **Q, double *rgtmp) /* Calculating eigenvalues and vectors. Input: N: dimension. C: symmetric (1:N)xN-matrix, solely used to copy data to Q niter: number of maximal iterations for QL-Algorithm. rgtmp: N+1-dimensional vector for temporal use. Output: diag: N eigenvalues. Q: Columns are normalized eigenvectors. */ { int i, j; if (rgtmp == 0) /* was OK in former versions */ FATAL("cmaes_t:Eigen(): input parameter double *rgtmp must be non-0", 0,0,0); /* copy C to Q */ if (C != Q) { for (i=0; i < N; ++i) for (j = 0; j <= i; ++j) Q[i][j] = Q[j][i] = C[i][j]; } #if 0 Householder( N, Q, diag, rgtmp); QLalgo( N, diag, Q, 30*N, rgtmp+1); #else Householder2( N, Q, diag, rgtmp); QLalgo2( N, diag, rgtmp, Q); #endif } /* ========================================================= */ static void QLalgo2 (int n, double *d, double *e, double **V) { /* -> n : Dimension. -> d : Diagonale of tridiagonal matrix. -> e[1..n-1] : off-diagonal, output from Householder -> V : matrix output von Householder <- d : eigenvalues <- e : garbage? <- V : basis of eigenvectors, according to d Symmetric tridiagonal QL algorithm, iterative Computes the eigensystem from a tridiagonal matrix in roughtly 3N^3 operations code adapted from Java JAMA package, function tql2. */ int i, k, l, m; double f = 0.0; double tst1 = 0.0; double eps = 2.22e-16; /* Math.pow(2.0,-52.0); == 2.22e-16 */ /* shift input e */ for (i = 1; i < n; i++) { e[i-1] = e[i]; } e[n-1] = 0.0; /* never changed again */ for (l = 0; l < n; l++) { /* Find small subdiagonal element */ if (tst1 < fabs(d[l]) + fabs(e[l])) tst1 = fabs(d[l]) + fabs(e[l]); m = l; while (m < n) { if (fabs(e[m]) <= eps*tst1) { /* if (fabs(e[m]) + fabs(d[m]+d[m+1]) == fabs(d[m]+d[m+1])) { */ break; } m++; } /* If m == l, d[l] is an eigenvalue, */ /* otherwise, iterate. */ if (m > l) { /* TODO: check the case m == n, should be rejected here!? */ int iter = 0; do { /* while (fabs(e[l]) > eps*tst1); */ double dl1, h; double g = d[l]; double p = (d[l+1] - g) / (2.0 * e[l]); double r = myhypot(p, 1.); iter = iter + 1; /* Could check iteration count here */ /* Compute implicit shift */ if (p < 0) { r = -r; } d[l] = e[l] / (p + r); d[l+1] = e[l] * (p + r); dl1 = d[l+1]; h = g - d[l]; for (i = l+2; i < n; i++) { d[i] -= h; } f = f + h; /* Implicit QL transformation. */ p = d[m]; { double c = 1.0; double c2 = c; double c3 = c; double el1 = e[l+1]; double s = 0.0; double s2 = 0.0; for (i = m-1; i >= l; i--) { c3 = c2; c2 = c; s2 = s; g = c * e[i]; h = c * p; r = myhypot(p, e[i]); e[i+1] = s * r; s = e[i] / r; c = p / r; p = c * d[i] - s * g; d[i+1] = h + s * (c * g + s * d[i]); /* Accumulate transformation. */ for (k = 0; k < n; k++) { h = V[k][i+1]; V[k][i+1] = s * V[k][i] + c * h; V[k][i] = c * V[k][i] - s * h; } } p = -s * s2 * c3 * el1 * e[l] / dl1; e[l] = s * p; d[l] = c * p; } /* Check for convergence. */ } while (fabs(e[l]) > eps*tst1); } d[l] = d[l] + f; e[l] = 0.0; } /* Sort eigenvalues and corresponding vectors. */ #if 1 /* TODO: really needed here? So far not, but practical and only O(n^2) */ { int j; double p; for (i = 0; i < n-1; i++) { k = i; p = d[i]; for (j = i+1; j < n; j++) { if (d[j] < p) { k = j; p = d[j]; } } if (k != i) { d[k] = d[i]; d[i] = p; for (j = 0; j < n; j++) { p = V[j][i]; V[j][i] = V[j][k]; V[j][k] = p; } } } } #endif } /* QLalgo2 */ /* ========================================================= */ static void Householder2(int n, double **V, double *d, double *e) { /* Householder transformation of a symmetric matrix V into tridiagonal form. -> n : dimension -> V : symmetric nxn-matrix <- V : orthogonal transformation matrix: tridiag matrix == V * V_in * V^t <- d : diagonal <- e[0..n-1] : off diagonal (elements 1..n-1) code slightly adapted from the Java JAMA package, function private tred2() */ int i,j,k; for (j = 0; j < n; j++) { d[j] = V[n-1][j]; } /* Householder reduction to tridiagonal form */ for (i = n-1; i > 0; i--) { /* Scale to avoid under/overflow */ double scale = 0.0; double h = 0.0; for (k = 0; k < i; k++) { scale = scale + fabs(d[k]); } if (scale == 0.0) { e[i] = d[i-1]; for (j = 0; j < i; j++) { d[j] = V[i-1][j]; V[i][j] = 0.0; V[j][i] = 0.0; } } else { /* Generate Householder vector */ double f, g, hh; for (k = 0; k < i; k++) { d[k] /= scale; h += d[k] * d[k]; } f = d[i-1]; g = sqrt(h); if (f > 0) { g = -g; } e[i] = scale * g; h = h - f * g; d[i-1] = f - g; for (j = 0; j < i; j++) { e[j] = 0.0; } /* Apply similarity transformation to remaining columns */ for (j = 0; j < i; j++) { f = d[j]; V[j][i] = f; g = e[j] + V[j][j] * f; for (k = j+1; k <= i-1; k++) { g += V[k][j] * d[k]; e[k] += V[k][j] * f; } e[j] = g; } f = 0.0; for (j = 0; j < i; j++) { e[j] /= h; f += e[j] * d[j]; } hh = f / (h + h); for (j = 0; j < i; j++) { e[j] -= hh * d[j]; } for (j = 0; j < i; j++) { f = d[j]; g = e[j]; for (k = j; k <= i-1; k++) { V[k][j] -= (f * e[k] + g * d[k]); } d[j] = V[i-1][j]; V[i][j] = 0.0; } } d[i] = h; } /* Accumulate transformations */ for (i = 0; i < n-1; i++) { double h; V[n-1][i] = V[i][i]; V[i][i] = 1.0; h = d[i+1]; if (h != 0.0) { for (k = 0; k <= i; k++) { d[k] = V[k][i+1] / h; } for (j = 0; j <= i; j++) { double g = 0.0; for (k = 0; k <= i; k++) { g += V[k][i+1] * V[k][j]; } for (k = 0; k <= i; k++) { V[k][j] -= g * d[k]; } } } for (k = 0; k <= i; k++) { V[k][i+1] = 0.0; } } for (j = 0; j < n; j++) { d[j] = V[n-1][j]; V[n-1][j] = 0.0; } V[n-1][n-1] = 1.0; e[0] = 0.0; } /* Housholder() */ #if 0 /* ========================================================= */ static void WriteMaxErrorInfo(cmaes_t *t) { int i,j, N=t->sp.N; char *s = (char *)new_void(200+30*(N+2), sizeof(char)); s[0] = '\0'; sprintf( s+strlen(s),"\nKomplett-Info\n"); sprintf( s+strlen(s)," Gen %20.12g\n", t->gen); sprintf( s+strlen(s)," Dimension %d\n", N); sprintf( s+strlen(s)," sigma %e\n", t->sigma); sprintf( s+strlen(s)," lastminEW %e\n", t->dLastMinEWgroesserNull); sprintf( s+strlen(s)," maxKond %e\n\n", t->dMaxSignifKond); sprintf( s+strlen(s)," x-Vektor rgD Basis...\n"); ERRORMESSAGE( s,0,0,0); s[0] = '\0'; for (i = 0; i < N; ++i) { sprintf( s+strlen(s), " %20.12e", t->rgxmean[i]); sprintf( s+strlen(s), " %10.4e", t->rgD[i]); for (j = 0; j < N; ++j) sprintf( s+strlen(s), " %10.2e", t->B[i][j]); ERRORMESSAGE( s,0,0,0); s[0] = '\0'; } ERRORMESSAGE( "\n",0,0,0); free( s); } /* WriteMaxErrorInfo() */ #endif /* --------------------------------------------------------- */ /* --------------- Functions: timings_t -------------------- */ /* --------------------------------------------------------- */ /* timings_t measures overall time and times between calls * of tic and toc. For small time spans (up to 1000 seconds) * CPU time via clock() is used. For large time spans the * fall-back to elapsed time from time() is used. * timings_update() must be called often enough to prevent * the fallback. */ /* --------------------------------------------------------- */ void timings_init(timings_t *t) { t->totaltotaltime = 0; timings_start(t); } void timings_start(timings_t *t) { t->totaltime = 0; t->tictoctime = 0; t->lasttictoctime = 0; t->istic = 0; t->lastclock = clock(); t->lasttime = time(0); t->lastdiff = 0; t->tictoczwischensumme = 0; t->isstarted = 1; } double timings_update(timings_t *t) { /* returns time between last call of timings_*() and now, * should better return totaltime or tictoctime? */ double diffc, difft; clock_t lc = t->lastclock; /* measure CPU in 1e-6s */ time_t lt = t->lasttime; /* measure time in s */ if (t->isstarted != 1) FATAL("timings_started() must be called before using timings... functions",0,0,0); t->lastclock = clock(); /* measures at most 2147 seconds, where 1s = 1e6 CLOCKS_PER_SEC */ t->lasttime = time(0); diffc = (double)(t->lastclock - lc) / CLOCKS_PER_SEC; /* is presumably in [-21??, 21??] */ difft = difftime(t->lasttime, lt); /* is presumably an integer */ t->lastdiff = difft; /* on the "save" side */ /* use diffc clock measurement if appropriate */ if (diffc > 0 && difft < 1000) t->lastdiff = diffc; if (t->lastdiff < 0) FATAL("BUG in time measurement", 0, 0, 0); t->totaltime += t->lastdiff; t->totaltotaltime += t->lastdiff; if (t->istic) { t->tictoczwischensumme += t->lastdiff; t->tictoctime += t->lastdiff; } return t->lastdiff; } void timings_tic(timings_t *t) { if (t->istic) { /* message not necessary ? */ ERRORMESSAGE("Warning: timings_tic called twice without toc",0,0,0); return; } timings_update(t); t->istic = 1; } double timings_toc(timings_t *t) { if (!t->istic) { ERRORMESSAGE("Warning: timings_toc called without tic",0,0,0); return -1; } timings_update(t); t->lasttictoctime = t->tictoczwischensumme; t->tictoczwischensumme = 0; t->istic = 0; return t->lasttictoctime; } /* --------------------------------------------------------- */ /* ---------------- Functions: random_t -------------------- */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ /* X_1 exakt : 0.79788456) */ /* chi_eins simuliert : 0.798xx (seed -3) */ /* +-0.001 */ /* --------------------------------------------------------- */ /* Gauss() liefert normalverteilte Zufallszahlen bei vorgegebenem seed. */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ long random_init( random_t *t, long unsigned inseed) { clock_t cloc = clock(); t->flgstored = 0; t->rgrand = (long *) new_void(32, sizeof(long)); if (inseed < 1) { while ((long) (cloc - clock()) == 0) ; /* TODO: remove this for time critical applications? */ inseed = (long unsigned)abs(100*time(0)+clock()); } return random_Start(t, inseed); } void random_exit(random_t *t) { free( t->rgrand); } /* --------------------------------------------------------- */ long random_Start( random_t *t, long unsigned inseed) { long tmp; int i; t->flgstored = 0; t->startseed = inseed; if (inseed < 1) inseed = 1; t->aktseed = inseed; for (i = 39; i >= 0; --i) { tmp = t->aktseed/127773; t->aktseed = 16807 * (t->aktseed - tmp * 127773) - 2836 * tmp; if (t->aktseed < 0) t->aktseed += 2147483647; if (i < 32) t->rgrand[i] = t->aktseed; } t->aktrand = t->rgrand[0]; return inseed; } /* --------------------------------------------------------- */ double random_Gauss(random_t *t) { double x1, x2, rquad, fac; if (t->flgstored) { t->flgstored = 0; return t->hold; } do { x1 = 2.0 * random_Uniform(t) - 1.0; x2 = 2.0 * random_Uniform(t) - 1.0; rquad = x1*x1 + x2*x2; } while(rquad >= 1 || rquad <= 0); fac = sqrt(-2.0*log(rquad)/rquad); t->flgstored = 1; t->hold = fac * x1; return fac * x2; } /* --------------------------------------------------------- */ double random_Uniform( random_t *t) { long tmp; tmp = t->aktseed/127773; t->aktseed = 16807 * (t->aktseed - tmp * 127773) - 2836 * tmp; if (t->aktseed < 0) t->aktseed += 2147483647; tmp = t->aktrand / 67108865; t->aktrand = t->rgrand[tmp]; t->rgrand[tmp] = t->aktseed; return (double)(t->aktrand)/(2.147483647e9); } static char * szCat(const char *sz1, const char*sz2, const char *sz3, const char *sz4); /* --------------------------------------------------------- */ /* -------------- Functions: readpara_t -------------------- */ /* --------------------------------------------------------- */ void readpara_init (readpara_t *t, int dim, int inseed, const double * inxstart, const double * inrgsigma, int lambda, const char * filename) { int i, N; t->rgsformat = static_cast(new_void(55, sizeof(char *))); t->rgpadr = static_cast(new_void(55, sizeof(void *))); t->rgskeyar = static_cast(new_void(11, sizeof(char *))); t->rgp2adr = static_cast(new_void(11, sizeof(double **))); t->weigkey = static_cast(new_void(7, sizeof(char))); /* All scalars: */ i = 0; t->rgsformat[i] = " N %d"; t->rgpadr[i++] = (void *) &t->N; t->rgsformat[i] = " seed %d"; t->rgpadr[i++] = (void *) &t->seed; t->rgsformat[i] = " stopMaxFunEvals %lg"; t->rgpadr[i++] = (void *) &t->stopMaxFunEvals; t->rgsformat[i] = " stopMaxIter %lg"; t->rgpadr[i++] = (void *) &t->stopMaxIter; t->rgsformat[i] = " stopFitness %lg"; t->rgpadr[i++]=(void *) &t->stStopFitness.val; t->rgsformat[i] = " stopTolFun %lg"; t->rgpadr[i++]=(void *) &t->stopTolFun; t->rgsformat[i] = " stopTolFunHist %lg"; t->rgpadr[i++]=(void *) &t->stopTolFunHist; t->rgsformat[i] = " stopTolX %lg"; t->rgpadr[i++]=(void *) &t->stopTolX; t->rgsformat[i] = " stopTolUpXFactor %lg"; t->rgpadr[i++]=(void *) &t->stopTolUpXFactor; t->rgsformat[i] = " lambda %d"; t->rgpadr[i++] = (void *) &t->lambda; t->rgsformat[i] = " mu %d"; t->rgpadr[i++] = (void *) &t->mu; t->rgsformat[i] = " weights %5s"; t->rgpadr[i++] = (void *) t->weigkey; t->rgsformat[i] = " fac*cs %lg";t->rgpadr[i++] = (void *) &t->cs; t->rgsformat[i] = " fac*damps %lg"; t->rgpadr[i++] = (void *) &t->damps; t->rgsformat[i] = " ccumcov %lg"; t->rgpadr[i++] = (void *) &t->ccumcov; t->rgsformat[i] = " mucov %lg"; t->rgpadr[i++] = (void *) &t->mucov; t->rgsformat[i] = " fac*ccov %lg"; t->rgpadr[i++]=(void *) &t->ccov; t->rgsformat[i] = " diagonalCovarianceMatrix %lg"; t->rgpadr[i++]=(void *) &t->diagonalCov; t->rgsformat[i] = " updatecov %lg"; t->rgpadr[i++]=(void *) &t->updateCmode.modulo; t->rgsformat[i] = " maxTimeFractionForEigendecompostion %lg"; t->rgpadr[i++]=(void *) &t->updateCmode.maxtime; t->rgsformat[i] = " resume %59s"; t->rgpadr[i++] = (void *) t->resumefile; t->rgsformat[i] = " fac*maxFunEvals %lg"; t->rgpadr[i++] = (void *) &t->facmaxeval; t->rgsformat[i] = " fac*updatecov %lg"; t->rgpadr[i++]=(void *) &t->facupdateCmode; t->n1para = i; t->n1outpara = i-2; /* disregard last parameters in WriteToFile() */ /* arrays */ i = 0; t->rgskeyar[i] = " typicalX %d"; t->rgp2adr[i++] = &t->typicalX; t->rgskeyar[i] = " initialX %d"; t->rgp2adr[i++] = &t->xstart; t->rgskeyar[i] = " initialStandardDeviations %d"; t->rgp2adr[i++] = &t->rgInitialStds; t->rgskeyar[i] = " diffMinChange %d"; t->rgp2adr[i++] = &t->rgDiffMinChange; t->n2para = i; t->N = dim; t->seed = (unsigned) inseed; t->xstart = 0; t->typicalX = 0; t->typicalXcase = 0; t->rgInitialStds = 0; t->rgDiffMinChange = 0; t->stopMaxFunEvals = -1; t->stopMaxIter = -1; t->facmaxeval = 1; t->stStopFitness.flg = -1; t->stopTolFun = 1e-12; t->stopTolFunHist = 1e-13; t->stopTolX = 0; /* 1e-11*insigma would also be reasonable */ t->stopTolUpXFactor = 1e3; t->lambda = lambda; t->mu = -1; t->mucov = -1; t->weights = 0; strcpy(t->weigkey, "log"); t->cs = -1; t->ccumcov = -1; t->damps = -1; t->ccov = -1; t->diagonalCov = 0; /* default is 0, but this might change in future, see below */ t->updateCmode.modulo = -1; t->updateCmode.maxtime = -1; t->updateCmode.flgalways = 0; t->facupdateCmode = 1; strcpy(t->resumefile, "_no_"); if (strcmp(filename, "non") != 0 && strcmp(filename, "writeonly") != 0) readpara_ReadFromFile(t, filename); if (t->N <= 0) t->N = dim; N = t->N; if (N == 0) FATAL("readpara_readpara_t(): problem dimension N undefined.\n", " (no default value available).",0,0); if (t->xstart == 0 && inxstart == 0 && t->typicalX == 0) { ERRORMESSAGE("Warning: initialX undefined. typicalX = 0.5...0.5 used.","","",""); printf("\nWarning: initialX undefined. typicalX = 0.5...0.5 used.\n"); } if (t->rgInitialStds == 0 && inrgsigma == 0) { /* FATAL("initialStandardDeviations undefined","","",""); */ ERRORMESSAGE("Warning: initialStandardDeviations undefined. 0.3...0.3 used.","","",""); printf("\nWarning: initialStandardDeviations. 0.3...0.3 used.\n"); } if (t->xstart == 0) { t->xstart = new_double(N); /* put inxstart into xstart */ if (inxstart != 0) { for (i=0; ixstart[i] = inxstart[i]; } /* otherwise use typicalX or default */ else { t->typicalXcase = 1; for (i=0; ixstart[i] = (t->typicalX == 0) ? 0.5 : t->typicalX[i]; } } /* xstart == 0 */ if (t->rgInitialStds == 0) { t->rgInitialStds = new_double(N); for (i=0; irgInitialStds[i] = (inrgsigma == 0) ? 0.3 : inrgsigma[i]; } readpara_SupplementDefaults(t); if (strcmp(filename, "non") != 0) readpara_WriteToFile(t, "actparcmaes.par", filename); } /* readpara_init */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void readpara_exit(readpara_t *t) { if (t->xstart != 0) /* not really necessary */ free( t->xstart); if (t->typicalX != 0) free( t->typicalX); if (t->rgInitialStds != 0) free( t->rgInitialStds); if (t->rgDiffMinChange != 0) free( t->rgDiffMinChange); if (t->weights != 0) free( t->weights); free(t->rgsformat); free(t->rgpadr); free(t->rgskeyar); free(t->rgp2adr); free(t->weigkey); } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void readpara_ReadFromFile(readpara_t *t, const char * filename) { char s[1000]; const char *ss = "initials.par"; int ipara, i; int size; FILE *fp; if (filename == 0) filename = ss; fp = fopen( filename, "r"); if(fp == 0) { ERRORMESSAGE("cmaes_ReadFromFile(): could not open '", filename, "'",0); return; } for (ipara=0; ipara < t->n1para; ++ipara) { rewind(fp); while(fgets(s, sizeof(s), fp) != 0) { /* skip comments */ if (s[0] == '#' || s[0] == '%') continue; if(sscanf(s, t->rgsformat[ipara], t->rgpadr[ipara]) == 1) { if (strncmp(t->rgsformat[ipara], " stopFitness ", 13) == 0) t->stStopFitness.flg = 1; break; } } } /* for */ if (t->N <= 0) FATAL("readpara_ReadFromFile(): No valid dimension N",0,0,0); for (ipara=0; ipara < t->n2para; ++ipara) { rewind(fp); while(fgets(s, sizeof(s), fp) != 0) /* read one line */ { /* skip comments */ if (s[0] == '#' || s[0] == '%') continue; if(sscanf(s, t->rgskeyar[ipara], &size) == 1) { /* size==number of values to be read */ if (size > 0) { *t->rgp2adr[ipara] = new_double(t->N); for (i=0;iN;++i) /* start reading next line */ if (fscanf(fp, " %lf", &(*t->rgp2adr[ipara])[i]) != 1) break; if (iN) { ERRORMESSAGE("readpara_ReadFromFile ", filename, ": ",0); FATAL( "'", t->rgskeyar[ipara], "' not enough values found.\n", " Remove all comments between numbers."); } for (; i < t->N; ++i) /* recycle */ (*t->rgp2adr[ipara])[i] = (*t->rgp2adr[ipara])[i%size]; } } } } /* for */ fclose(fp); return; } /* readpara_ReadFromFile() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void readpara_WriteToFile(readpara_t *t, const char *filenamedest, const char *filenamesource) { int ipara, i; size_t len; time_t ti = time(0); FILE *fp = fopen( filenamedest, "a"); if(fp == 0) { ERRORMESSAGE("cmaes_WriteToFile(): could not open '", filenamedest, "'",0); return; } fprintf(fp, "\n# Read from %s at %s\n", filenamesource, asctime(localtime(&ti))); /* == ctime() */ for (ipara=0; ipara < 1; ++ipara) { fprintf(fp, t->rgsformat[ipara], *(int *)t->rgpadr[ipara]); fprintf(fp, "\n"); } for (ipara=0; ipara < t->n2para; ++ipara) { if(*t->rgp2adr[ipara] == 0) continue; fprintf(fp, t->rgskeyar[ipara], t->N); fprintf(fp, "\n"); for (i=0; iN; ++i) fprintf(fp, "%7.3g%c", (*t->rgp2adr[ipara])[i], (i%5==4)?'\n':' '); fprintf(fp, "\n"); } for (ipara=1; ipara < t->n1outpara; ++ipara) { if (strncmp(t->rgsformat[ipara], " stopFitness ", 13) == 0) if(t->stStopFitness.flg == 0) { fprintf(fp, " stopFitness\n"); continue; } len = strlen(t->rgsformat[ipara]); if (t->rgsformat[ipara][len-1] == 'd') /* read integer */ fprintf(fp, t->rgsformat[ipara], *(int *)t->rgpadr[ipara]); else if (t->rgsformat[ipara][len-1] == 's') /* read string */ fprintf(fp, t->rgsformat[ipara], (char *)t->rgpadr[ipara]); else { if (strncmp(" fac*", t->rgsformat[ipara], 5) == 0) { fprintf(fp, " "); fprintf(fp, t->rgsformat[ipara]+5, *(double *)t->rgpadr[ipara]); } else fprintf(fp, t->rgsformat[ipara], *(double *)t->rgpadr[ipara]); } fprintf(fp, "\n"); } /* for */ fprintf(fp, "\n"); fclose(fp); } /* readpara_WriteToFile() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void readpara_SupplementDefaults(readpara_t *t) { double t1, t2; int N = t->N; clock_t cloc = clock(); if (t->seed < 1) { while ((int) (cloc - clock()) == 0) ; /* TODO: remove this for time critical applications!? */ t->seed = (unsigned int)abs(100*time(0)+clock()); } if (t->stStopFitness.flg == -1) t->stStopFitness.flg = 0; if (t->lambda < 2) t->lambda = 4+(int)(3*log((double)N)); if (t->mu == -1) { t->mu = t->lambda/2; readpara_SetWeights(t, t->weigkey); } if (t->weights == 0) readpara_SetWeights(t, t->weigkey); if (t->cs > 0) /* factor was read */ t->cs *= (t->mueff + 2.) / (N + t->mueff + 3.); if (t->cs <= 0 || t->cs >= 1) t->cs = (t->mueff + 2.) / (N + t->mueff + 3.); if (t->ccumcov <= 0 || t->ccumcov > 1) t->ccumcov = 4. / (N + 4); if (t->mucov < 1) { t->mucov = t->mueff; } t1 = 2. / ((N+1.4142)*(N+1.4142)); t2 = (2.*t->mueff-1.) / ((N+2.)*(N+2.)+t->mueff); t2 = (t2 > 1) ? 1 : t2; t2 = (1./t->mucov) * t1 + (1.-1./t->mucov) * t2; if (t->ccov >= 0) /* ccov holds the read factor */ t->ccov *= t2; if (t->ccov < 0 || t->ccov > 1) /* set default in case */ t->ccov = t2; if (t->diagonalCov == -1) t->diagonalCov = 2 + 100. * N / sqrt((double)t->lambda); if (t->stopMaxFunEvals == -1) /* may depend on ccov in near future */ t->stopMaxFunEvals = t->facmaxeval*900*(N+3)*(N+3); else t->stopMaxFunEvals *= t->facmaxeval; if (t->stopMaxIter == -1) t->stopMaxIter = ceil((double)(t->stopMaxFunEvals / t->lambda)); if (t->damps < 0) t->damps = 1; /* otherwise a factor was read */ t->damps = t->damps * (1 + 2*douMax(0., sqrt((t->mueff-1.)/(N+1.)) - 1)) /* basic factor */ * douMax(0.3, 1. - /* modify for short runs */ (double)N / (1e-6+douMin(t->stopMaxIter, t->stopMaxFunEvals/t->lambda))) + t->cs; /* minor increment */ if (t->updateCmode.modulo < 0) t->updateCmode.modulo = 1./t->ccov/(double)(N)/10.; t->updateCmode.modulo *= t->facupdateCmode; if (t->updateCmode.maxtime < 0) t->updateCmode.maxtime = 0.20; /* maximal 20% of CPU-time */ } /* readpara_SupplementDefaults() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ void readpara_SetWeights(readpara_t *t, const char * mode) { double s1, s2; int i; if(t->weights != 0) free( t->weights); t->weights = new_double(t->mu); if (strcmp(mode, "lin") == 0) for (i=0; imu; ++i) t->weights[i] = t->mu - i; else if (strncmp(mode, "equal", 3) == 0) for (i=0; imu; ++i) t->weights[i] = 1; else if (strcmp(mode, "log") == 0) for (i=0; imu; ++i) t->weights[i] = log(t->mu+1.)-log(i+1.); else for (i=0; imu; ++i) t->weights[i] = log(t->mu+1.)-log(i+1.); /* normalize weights vector and set mueff */ for (i=0, s1=0, s2=0; imu; ++i) { s1 += t->weights[i]; s2 += t->weights[i]*t->weights[i]; } t->mueff = s1*s1/s2; for (i=0; imu; ++i) t->weights[i] /= s1; if(t->mu < 1 || t->mu > t->lambda || (t->mu==t->lambda && t->weights[0]==t->weights[t->mu-1])) FATAL("readpara_SetWeights(): invalid setting of mu or lambda",0,0,0); } /* readpara_SetWeights() */ /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ static double douSquare(double d) { return d*d; } static int intMin( int i, int j) { return i < j ? i : j; } static double douMax( double i, double j) { return i > j ? i : j; } static double douMin( double i, double j) { return i < j ? i : j; } static double rgdouMax( const double *rgd, int len) { int i; double max = rgd[0]; for (i = 1; i < len; ++i) max = (max < rgd[i]) ? rgd[i] : max; return max; } static double rgdouMin( const double *rgd, int len) { int i; double min = rgd[0]; for (i = 1; i < len; ++i) min = (min > rgd[i]) ? rgd[i] : min; return min; } static int MaxIdx( const double *rgd, int len) { int i, res; for(i=1, res=0; i rgd[res]) res = i; return res; } static int MinIdx( const double *rgd, int len) { int i, res; for(i=1, res=0; i fabs(b)) { r = b/a; r = fabs(a)*sqrt(1+r*r); } else if (b != 0) { r = a/b; r = fabs(b)*sqrt(1+r*r); } return r; } static int SignOfDiff(const void *d1, const void * d2) { return *((double *) d1) > *((double *) d2) ? 1 : -1; } #if 1 /* dirty index sort */ static void Sorted_index(const double *rgFunVal, int *iindex, int n) { int i, j; for (i=1, iindex[0]=0; i0; --j) { if (rgFunVal[iindex[j-1]] < rgFunVal[i]) break; iindex[j] = iindex[j-1]; /* shift up */ } iindex[j] = i; /* insert i */ } } #endif static void * new_void(int n, size_t size) { static char s[70]; void *p = calloc((unsigned) n, size); if (p == 0) { sprintf(s, "new_void(): calloc(%ld,%ld) failed",(long)n,(long)size); FATAL(s,0,0,0); } return p; } double * cmaes_NewDouble(int n) { return new_double(n); } static double * new_double(int n) { static char s[170]; double *p = (double *) calloc((unsigned) n, sizeof(double)); if (p == 0) { sprintf(s, "new_double(): calloc(%ld,%ld) failed", (long)n,(long)sizeof(double)); FATAL(s,0,0,0); } return p; } /* --------------------------------------------------------- */ /* --------------------------------------------------------- */ /* ========================================================= */ void cmaes_FATAL(char const *s1, char const *s2, char const *s3, char const *s4) { time_t t = time(0); ERRORMESSAGE( s1, s2, s3, s4); ERRORMESSAGE("*** Exiting cmaes_t ***",0,0,0); printf("\n -- %s %s\n", asctime(localtime(&t)), s2 ? szCat(s1, s2, s3, s4) : s1); printf(" *** CMA-ES ABORTED, see errcmaes.err *** \n"); fflush(stdout); exit(1); } /* ========================================================= */ static void FATAL(char const *s1, char const *s2, char const *s3, char const *s4) { cmaes_FATAL(s1, s2, s3, s4); } /* ========================================================= */ void ERRORMESSAGE( char const *s1, char const *s2, char const *s3, char const *s4) { #if 1 /* static char szBuf[700]; desirable but needs additional input argument sprintf(szBuf, "%f:%f", gen, gen*lambda); */ time_t t = time(0); FILE *fp = fopen( "errcmaes.err", "a"); if (!fp) { printf("\nFATAL ERROR: %s\n", s2 ? szCat(s1, s2, s3, s4) : s1); printf("cmaes_t could not open file 'errcmaes.err'."); printf("\n *** CMA-ES ABORTED *** "); fflush(stdout); exit(1); } fprintf( fp, "\n -- %s %s\n", asctime(localtime(&t)), s2 ? szCat(s1, s2, s3, s4) : s1); fclose (fp); #endif } /* ========================================================= */ char *szCat(const char *sz1, const char*sz2, const char *sz3, const char *sz4) { static char szBuf[700]; if (!sz1) FATAL("szCat() : Invalid Arguments",0,0,0); strncpy ((char *)szBuf, sz1, (unsigned)intMin( (int)strlen(sz1), 698)); szBuf[intMin( (int)strlen(sz1), 698)] = '\0'; if (sz2) strncat ((char *)szBuf, sz2, (unsigned)intMin((int)strlen(sz2)+1, 698 - (int)strlen((char const *)szBuf))); if (sz3) strncat((char *)szBuf, sz3, (unsigned)intMin((int)strlen(sz3)+1, 698 - (int)strlen((char const *)szBuf))); if (sz4) strncat((char *)szBuf, sz4, (unsigned)intMin((int)strlen(sz4)+1, 698 - (int)strlen((char const *)szBuf))); return (char *) szBuf; } freefem++-3.38-1/examples++-load/cmaes.h000644 000767 000024 00000010375 11650032724 017734 0ustar00hechtstaff000000 000000 /* --------------------------------------------------------- */ /* --- File: cmaes.h ----------- Author: Nikolaus Hansen --- */ /* ---------------------- last modified: IX 2010 --- */ /* --------------------------------- by: Nikolaus Hansen --- */ /* --------------------------------------------------------- */ /* CMA-ES for non-linear function minimization. Copyright (C) 1996, 2003-2010 Nikolaus Hansen. e-mail: nikolaus.hansen (you know what) inria.fr License: see file cmaes.c */ #ifndef NH_cmaes_h /* only include ones */ #define NH_cmaes_h #include typedef struct /* random_t * sets up a pseudo random number generator instance */ { /* Variables for Uniform() */ long int startseed; long int aktseed; long int aktrand; long int *rgrand; /* Variables for Gauss() */ short flgstored; double hold; } random_t; typedef struct /* timings_t * time measurement, used to time eigendecomposition */ { /* for outside use */ double totaltime; /* zeroed by calling re-calling timings_start */ double totaltotaltime; double tictoctime; double lasttictoctime; /* local fields */ clock_t lastclock; time_t lasttime; clock_t ticclock; time_t tictime; short istic; short isstarted; double lastdiff; double tictoczwischensumme; } timings_t; typedef struct /* readpara_t * collects all parameters, in particular those that are read from * a file before to start. This should split in future? */ { /* input parameter */ int N; /* problem dimension, must stay constant */ unsigned int seed; double * xstart; double * typicalX; int typicalXcase; double * rgInitialStds; double * rgDiffMinChange; /* termination parameters */ double stopMaxFunEvals; double facmaxeval; double stopMaxIter; struct { int flg; double val; } stStopFitness; double stopTolFun; double stopTolFunHist; double stopTolX; double stopTolUpXFactor; /* internal evolution strategy parameters */ int lambda; /* -> mu, <- N */ int mu; /* -> weights, (lambda) */ double mucov, mueff; /* <- weights */ double *weights; /* <- mu, -> mueff, mucov, ccov */ double damps; /* <- cs, maxeval, lambda */ double cs; /* -> damps, <- N */ double ccumcov; /* <- N */ double ccov; /* <- mucov, <- N */ double diagonalCov; /* number of initial iterations */ struct { int flgalways; double modulo; double maxtime; } updateCmode; double facupdateCmode; /* supplementary variables */ char *weigkey; char resumefile[99]; const char **rgsformat; void **rgpadr; const char **rgskeyar; double ***rgp2adr; int n1para, n1outpara; int n2para; } readpara_t; typedef struct /* cmaes_t * CMA-ES "object" */ { const char *version; readpara_t sp; random_t rand; /* random number generator */ double sigma; /* step size */ double *rgxmean; /* mean x vector, "parent" */ double *rgxbestever; double **rgrgx; /* range of x-vectors, lambda offspring */ int *index; /* sorting index of sample pop. */ double *arFuncValueHist; short flgIniphase; /* not really in use anymore */ short flgStop; double chiN; double **C; /* lower triangular matrix: i>=j for C[i][j] */ double **B; /* matrix with normalize eigenvectors in columns */ double *rgD; /* axis lengths */ double *rgpc; double *rgps; double *rgxold; double *rgout; double *rgBDz; /* for B*D*z */ double *rgdTmp; /* temporary (random) vector used in different places */ double *rgFuncValue; double *publicFitness; /* returned by cmaes_init() */ double gen; /* Generation number */ double countevals; double state; /* 1 == sampled, 2 == not in use anymore, 3 == updated */ double maxdiagC; /* repeatedly used for output */ double mindiagC; double maxEW; double minEW; char sOutString[330]; /* 4x80 */ short flgEigensysIsUptodate; short flgCheckEigen; /* control via signals.par */ double genOfEigensysUpdate; timings_t eigenTimings; double dMaxSignifKond; double dLastMinEWgroesserNull; short flgresumedone; time_t printtime; time_t writetime; /* ideally should keep track for each output file */ time_t firstwritetime; time_t firstprinttime; } cmaes_t; #endif freefem++-3.38-1/examples++-load/cmaes_interface.h000644 000767 000024 00000004442 11650032724 021752 0ustar00hechtstaff000000 000000 /* --------------------------------------------------------- */ /* --- File: cmaes_interface.h - Author: Nikolaus Hansen --- */ /* ---------------------- last modified: IV 2007 --- */ /* --------------------------------- by: Nikolaus Hansen --- */ /* --------------------------------------------------------- */ /* CMA-ES for non-linear function minimization. Copyright (C) 1996, 2003, 2007 Nikolaus Hansen. e-mail: hansen AT bionik.tu-berlin.de hansen AT lri.fr License: see file cmaes.c */ #include "cmaes.h" /* --------------------------------------------------------- */ /* ------------------ Interface ---------------------------- */ /* --------------------------------------------------------- */ /* --- initialization, constructors, destructors --- */ double * cmaes_init(cmaes_t *, int dimension , double *xstart, double *stddev, long seed, int lambda, const char *input_parameter_filename); void cmaes_resume_distribution(cmaes_t *evo_ptr, char *filename); void cmaes_exit(cmaes_t *); /* --- core functions --- */ double * const * cmaes_SamplePopulation(cmaes_t *); double * cmaes_UpdateDistribution(cmaes_t *, const double *rgFitnessValues); const char * cmaes_TestForTermination(cmaes_t *); /* --- additional functions --- */ double * const * cmaes_ReSampleSingle( cmaes_t *t, int index); double const * cmaes_ReSampleSingle_old(cmaes_t *, double *rgx); double * cmaes_SampleSingleInto( cmaes_t *t, double *rgx); void cmaes_UpdateEigensystem(cmaes_t *, int flgforce); /* --- getter functions --- */ double cmaes_Get(cmaes_t *, char const *keyword); const double * cmaes_GetPtr(cmaes_t *, char const *keyword); /* e.g. "xbestever" */ double * cmaes_GetNew( cmaes_t *t, char const *keyword); double * cmaes_GetInto( cmaes_t *t, char const *keyword, double *mem); /* --- online control and output --- */ void cmaes_ReadSignals(cmaes_t *, char const *filename); void cmaes_WriteToFile(cmaes_t *, const char *szKeyWord, const char *output_filename); char * cmaes_SayHello(cmaes_t *); /* --- misc --- */ double * cmaes_NewDouble(int n); void cmaes_FATAL(char const *s1, char const *s2, char const *s3, char const *s4); freefem++-3.38-1/examples++-load/convect_dervieux.edp000644 000767 000024 00000001762 12167254041 022543 0ustar00hechtstaff000000 000000 bool fast=true; load "mat_dervieux"; // external module in C++ must be loaded border a(t=0, 2*pi){ x = cos(t); y = sin(t); } mesh th = buildmesh(a(100)); fespace Vh(th,P1); Vh vh,vold,u1 = y, u2 = -x; Vh v = exp(-10*((x-0.3)^2 +(y-0.3)^2)), vWall=0, rhs =0; real dt = 0.025; // qf1pTlump means mass lumping is used problem FVM(v,vh) = int2d(th,qft=qf1pTlump)(v*vh/dt) - int2d(th,qft=qf1pTlump)(vold*vh/dt) + int1d(th,a)(((u1*N.x+u2*N.y)<0)*(u1*N.x+u2*N.y)*vWall*vh) + rhs[] ; matrix A; MatUpWind1(A,th,vold,[u1,u2]); if(fast) { varf vFVM(v,vh) = int2d(th,qft=qf1pTlump)(v*vh/dt) - int1d(th,a)(((u1*N.x+u2*N.y)<0)*(u1*N.x+u2*N.y)*vWall*vh) ; real[int] rhs0=vFVM(0,Vh); matrix M=vFVM(Vh,Vh,solver=CG); A=-A+M; for ( real t=0; t< pi ; t+=dt) { vold=v; rhs[]=rhs0; rhs[] += A * vold[] ; v[]= M^-1*rhs[]; plot(v,wait=0); } } else for ( real t=0; t< pi ; t+=dt){ vold=v; rhs[] = A * vold[] ; FVM; plot(v,wait=0); }; freefem++-3.38-1/examples++-load/convectchacon-3d.edp000644 000767 000024 00000001760 11643536043 022311 0ustar00hechtstaff000000 000000 load "msh3" load "mat_psi" border a(t=0, 2*pi) { x = cos(t); y = sin(t); }; mesh th2 = buildmesh(a(70)); mesh3 th= buildlayers(th2,5,zbound=[0,1]); fespace Vh(th,P1); Vh vh,vo,u1 = y, u2 = -x, v = exp(-10*((x-0.3)^2 +(y-0.3)^2)), u3=0, rhs =0; Vh wh=0,Bwh; real dt = 0.001,t=0, tmax=3.14; int kk=0; varf aa(v,vh) = int3d(th)(v*vh/dt) ; matrix AA= aa(Vh,Vh,solver=UMFPACK); problem A(v,vh) = int3d(th)(v*vh/dt) - int3d(th)(vo*vh/dt) + rhs[]; real[int] viso=[-0.1,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,10,100,1000]; verbosity = 4; if(1) cout << "\n\n\n MatUpWind0 3d not yet implemented FH. (To DO) \n\n\n" << endl; else for ( t=0; t< tmax ; t+=dt) { vo=v; matrix B; MatUpWind0(B,th,vo,[u1,u2,u3]); // cout << B << endl; rhs[] = AA* vo[]; rhs[] += B* vo[] ; v[] = AA^-1*rhs[]; // wh[][50]=1; //Bwh[] = B*wh[]; // plot(wh,Bwh,wait=1); plot(v,fill=1,cmm="convection: t="+t + ", min=" + v[].min + ", max=" + v[].max,viso=viso,wait=0); }; plot(v,wait=1,value=1,fill=1); freefem++-3.38-1/examples++-load/convectchacon.edp000644 000767 000024 00000001557 11406142255 022004 0ustar00hechtstaff000000 000000 load "mat_psi" border a(t=0, 2*pi) { x = cos(t); y = sin(t); }; mesh th = buildmesh(a(70)); fespace Vh(th,P1); Vh vh,vo,u1 = y, u2 = -x, v = exp(-10*((x-0.3)^2 +(y-0.3)^2)), rhs =0; Vh wh=0,Bwh; real dt = 0.001,t=0, tmax=pi/4; int kk=0; varf aa(v,vh) = int2d(th)(v*vh/dt) ; matrix AA= aa(Vh,Vh,solver=CG); problem A(v,vh) = int2d(th)(v*vh/dt) - int2d(th)(vo*vh/dt) + rhs[]; real[int] viso=[-0.1,0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,10,100,1000]; verbosity = 4; for ( t=0; t< tmax ; t+=dt) { vo[]=v[]; matrix B; MatUpWind0(B,th,vo,[u1,u2]); // cout << B << endl; rhs[] = B* vo[] ; rhs[] = -rhs[] ; rhs[] += AA* vo[]; v[] = AA^-1*rhs[]; // wh[][50]=1; //Bwh[] = B*wh[]; // plot(wh,Bwh,wait=1); plot(v,fill=1,dim=3,cmm="convection: t="+t + ", min=" + v[].min + ", max=" + v[].max,viso=viso,wait=0); }; plot(v,dim=3,wait=1,value=1,fill=1); freefem++-3.38-1/examples++-load/convexehull3d.edp000644 000767 000024 00000000146 12500134760 021741 0ustar00hechtstaff000000 000000 load "tetgen" mesh3 Th=tetgconvexhull("ch.pts",region=1,label=3);//,reftet=1, refface=1); plot(Th); freefem++-3.38-1/examples++-load/cube.msh000644 000767 000024 00000036170 11406142255 020123 0ustar00hechtstaff000000 000000 $MeshFormat 2 0 8 $EndMeshFormat $Nodes 93 1 0 0 0 2 1 0 0 3 1 1 0 4 0 1 0 5 1 1 1 6 1 0 1 7 0 0 1 8 0 1 1 9 0.3333333333326071 1 0 10 0.6666666666658988 1 0 11 1 0.6666666666673606 0 12 1 0.3333333333344899 0 13 0.6666666666673606 0 0 14 0.3333333333344899 0 0 15 0 0.3333333333326071 0 16 0 0.6666666666658988 0 17 1 0.6666666666673606 1 18 1 0.3333333333344899 1 19 0.6666666666673606 0 1 20 0.3333333333344899 0 1 21 0 0.3333333333326071 1 22 0 0.6666666666658988 1 23 0.3333333333326071 1 1 24 0.6666666666658988 1 1 25 1 1 0.3333333333326071 26 1 1 0.6666666666658988 27 1 0 0.3333333333326071 28 1 0 0.6666666666658988 29 0 0 0.3333333333326071 30 0 0 0.6666666666658988 31 0 1 0.3333333333326071 32 0 1 0.6666666666658988 33 0.6033987166763249 0.3101885670465382 0 34 0.769851917280195 0.6582487583463627 0 35 0.3956160891556272 0.684861250769156 0 36 0.2293953234680604 0.3255914299923437 0 37 0.8175163458359214 0.160880475095257 0 38 0.1822373556220586 0.8378819793587637 0 39 1 0.287795406903777 0.5162592383367501 40 1 0.677749446674222 0.738440154311957 41 1 0.5497854121514134 0.323956695317194 42 1 0.2394619452145299 0.250885368529923 43 1 0.8121736384318632 0.4458127032587921 44 1 0.8057251434501275 0.2206205463817186 45 1 0.2597756373824978 0.7842732118629211 46 0.2696653904235826 0 0.507567042174021 47 0.5089518016469133 0 0.7191309942205057 48 0.525787937742471 0 0.4230502036065255 49 0.2335074533456678 0 0.7829029531710534 50 0.3755409516430834 0 0.2043738922542082 51 0.7835677343427908 0 0.5236968663041317 52 0.7918372405314129 0 0.7818989054381073 53 0.7252605483992843 0 0.2474090492495787 54 0 0.3189361886297027 0.471090130118638 55 0 0.3345786853318198 0.754826829805717 56 0 0.6844037619596788 0.6088816240370495 57 0 0.6368173167452134 0.2516230284835886 58 0 0.8377676071563944 0.818887072675737 59 0 0.825870995852778 0.1462390904540489 60 0 0.2578173677415044 0.2112092983869667 61 0.4659615515276305 1 0.341076738349146 62 0.3561903612622483 1 0.7764212397445254 63 0.7139534585284268 1 0.6680916643257201 64 0.2048376520554457 1 0.4577750407509648 65 0.8077636127869927 1 0.334861400445562 66 0.2079004435473459 1 0.2273791342858121 67 0.6033987166763249 0.3101885670465382 1 68 0.769851917280195 0.6582487583463627 1 69 0.3956160891556272 0.684861250769156 1 70 0.2293953234680604 0.3255914299923437 1 71 0.8175163458359214 0.160880475095257 1 72 0.1822373556220586 0.8378819793587637 1 73 0.5181254719613425 0.512820448991764 0.5222218545365421 74 0.3161690575272439 0.3126655926137832 0.3311497441358422 75 0.6360818500851182 0.7210360273959794 0.295034021342571 76 0.3094461830608684 0.7044061796974738 0.3498323752432158 77 0.3209010156600531 0.3026010954511582 0.6834725753627503 78 0.7447276689998517 0.456432312236522 0.7473314440265498 79 0.6879655308338695 0.3191317587205752 0.3177242488758017 80 0.3112472585627467 0.6934967487277688 0.6896867215854406 81 0.6070665682496384 0.7278138857821207 0.7524393983227856 82 0.7794358175012712 0.6486911468986005 0.5348728099974022 83 0.2253693732805382 0.5144212358631581 0.1856217218953246 84 0.5064007851930725 0.4934742660593801 0.1909006305043531 85 0.2116040567831997 0.4985313910731254 0.5138492930908205 86 0.6138237354943221 0.2436572730156315 0.5921353831639898 87 0.1896271624975805 0.1335106123291861 0.1362237629249333 88 0.4772199555576193 0.4900582817265309 0.818091543605002 89 0.16317799408501 0.5287352311465979 0.8393348531998897 90 0.5007595428173509 0.7973624929334675 0.514992099280024 91 0.41357779735851 0.2266192142511251 0.1261314227295705 92 0.09287798162604473 0.7907426563470528 0.4129188738729443 93 0.7952502473596437 0.4322708451082602 0.1157419828834438 $EndNodes $Elements 483 1 15 3 0 1 0 1 2 15 3 0 2 0 2 3 15 3 0 3 0 3 4 15 3 0 4 0 4 5 15 3 0 5 0 5 6 15 3 0 6 0 6 7 15 3 0 10 0 7 8 15 3 0 14 0 8 9 1 3 0 1 0 4 9 10 1 3 0 1 0 9 10 11 1 3 0 1 0 10 3 12 1 3 0 2 0 3 11 13 1 3 0 2 0 11 12 14 1 3 0 2 0 12 2 15 1 3 0 3 0 2 13 16 1 3 0 3 0 13 14 17 1 3 0 3 0 14 1 18 1 3 0 4 0 1 15 19 1 3 0 4 0 15 16 20 1 3 0 4 0 16 4 21 1 3 0 8 0 5 17 22 1 3 0 8 0 17 18 23 1 3 0 8 0 18 6 24 1 3 0 9 0 6 19 25 1 3 0 9 0 19 20 26 1 3 0 9 0 20 7 27 1 3 0 10 0 7 21 28 1 3 0 10 0 21 22 29 1 3 0 10 0 22 8 30 1 3 0 11 0 8 23 31 1 3 0 11 0 23 24 32 1 3 0 11 0 24 5 33 1 3 0 13 0 3 25 34 1 3 0 13 0 25 26 35 1 3 0 13 0 26 5 36 1 3 0 14 0 2 27 37 1 3 0 14 0 27 28 38 1 3 0 14 0 28 6 39 1 3 0 18 0 1 29 40 1 3 0 18 0 29 30 41 1 3 0 18 0 30 7 42 1 3 0 22 0 4 31 43 1 3 0 22 0 31 32 44 1 3 0 22 0 32 8 45 2 3 0 6 0 34 10 3 46 2 3 0 6 0 35 9 10 47 2 3 0 6 0 10 34 35 48 2 3 0 6 0 12 2 37 49 2 3 0 6 0 34 11 12 50 2 3 0 6 0 12 33 34 51 2 3 0 6 0 37 33 12 52 2 3 0 6 0 9 38 4 53 2 3 0 6 0 38 16 4 54 2 3 0 6 0 34 3 11 55 2 3 0 6 0 37 2 13 56 2 3 0 6 0 1 15 36 57 2 3 0 6 0 36 14 1 58 2 3 0 6 0 33 13 14 59 2 3 0 6 0 13 33 37 60 2 3 0 6 0 15 16 36 61 2 3 0 6 0 9 35 38 62 2 3 0 6 0 16 38 35 63 2 3 0 6 0 33 35 34 64 2 3 0 6 0 33 36 35 65 2 3 0 6 0 35 36 16 66 2 3 0 6 0 14 36 33 67 2 3 0 15 0 2 42 12 68 2 3 0 15 0 11 12 41 69 2 3 0 15 0 12 42 41 70 2 3 0 15 0 18 45 6 71 2 3 0 15 0 45 28 6 72 2 3 0 15 0 11 44 3 73 2 3 0 15 0 3 44 25 74 2 3 0 15 0 42 2 27 75 2 3 0 15 0 40 17 5 76 2 3 0 15 0 40 5 26 77 2 3 0 15 0 11 41 44 78 2 3 0 15 0 18 40 45 79 2 3 0 15 0 17 40 18 80 2 3 0 15 0 41 39 40 81 2 3 0 15 0 41 40 43 82 2 3 0 15 0 45 40 39 83 2 3 0 15 0 40 26 43 84 2 3 0 15 0 41 43 44 85 2 3 0 15 0 41 42 39 86 2 3 0 15 0 43 25 44 87 2 3 0 15 0 28 45 39 88 2 3 0 15 0 42 27 39 89 2 3 0 15 0 27 28 39 90 2 3 0 15 0 43 26 25 91 2 3 0 19 0 6 52 19 92 2 3 0 19 0 6 28 52 93 2 3 0 19 0 2 13 53 94 2 3 0 19 0 2 53 27 95 2 3 0 19 0 1 50 14 96 2 3 0 19 0 1 29 50 97 2 3 0 19 0 49 7 20 98 2 3 0 19 0 49 30 7 99 2 3 0 19 0 13 14 50 100 2 3 0 19 0 13 50 53 101 2 3 0 19 0 48 47 51 102 2 3 0 19 0 48 51 53 103 2 3 0 19 0 50 46 48 104 2 3 0 19 0 48 46 47 105 2 3 0 19 0 50 48 53 106 2 3 0 19 0 46 49 47 107 2 3 0 19 0 30 49 46 108 2 3 0 19 0 47 49 20 109 2 3 0 19 0 51 47 52 110 2 3 0 19 0 53 51 27 111 2 3 0 19 0 51 28 27 112 2 3 0 19 0 52 28 51 113 2 3 0 19 0 29 46 50 114 2 3 0 19 0 46 29 30 115 2 3 0 19 0 19 47 20 116 2 3 0 19 0 52 47 19 117 2 3 0 23 0 4 59 16 118 2 3 0 23 0 4 31 59 119 2 3 0 23 0 1 15 60 120 2 3 0 23 0 60 29 1 121 2 3 0 23 0 7 55 21 122 2 3 0 23 0 7 30 55 123 2 3 0 23 0 8 22 58 124 2 3 0 23 0 58 32 8 125 2 3 0 23 0 57 60 15 126 2 3 0 23 0 57 15 16 127 2 3 0 23 0 56 55 54 128 2 3 0 23 0 30 54 55 129 2 3 0 23 0 56 22 55 130 2 3 0 23 0 22 21 55 131 2 3 0 23 0 56 58 22 132 2 3 0 23 0 32 58 56 133 2 3 0 23 0 60 57 54 134 2 3 0 23 0 29 60 54 135 2 3 0 23 0 56 54 57 136 2 3 0 23 0 56 57 31 137 2 3 0 23 0 16 59 57 138 2 3 0 23 0 59 31 57 139 2 3 0 23 0 30 29 54 140 2 3 0 23 0 31 32 56 141 2 3 0 27 0 3 65 10 142 2 3 0 27 0 9 10 61 143 2 3 0 27 0 10 65 61 144 2 3 0 27 0 66 4 9 145 2 3 0 27 0 66 31 4 146 2 3 0 27 0 65 3 25 147 2 3 0 27 0 5 24 63 148 2 3 0 27 0 26 5 63 149 2 3 0 27 0 8 62 23 150 2 3 0 27 0 8 32 62 151 2 3 0 27 0 9 61 66 152 2 3 0 27 0 63 62 61 153 2 3 0 27 0 62 64 61 154 2 3 0 27 0 62 24 23 155 2 3 0 27 0 24 62 63 156 2 3 0 27 0 32 64 62 157 2 3 0 27 0 61 65 63 158 2 3 0 27 0 61 64 66 159 2 3 0 27 0 63 65 26 160 2 3 0 27 0 25 26 65 161 2 3 0 27 0 66 64 31 162 2 3 0 27 0 31 64 32 163 2 3 0 28 0 18 6 71 164 2 3 0 28 0 19 71 6 165 2 3 0 28 0 5 17 68 166 2 3 0 28 0 68 24 5 167 2 3 0 28 0 20 7 70 168 2 3 0 28 0 70 7 21 169 2 3 0 28 0 72 22 8 170 2 3 0 28 0 23 72 8 171 2 3 0 28 0 68 18 67 172 2 3 0 28 0 18 68 17 173 2 3 0 28 0 67 18 71 174 2 3 0 28 0 67 69 68 175 2 3 0 28 0 24 68 69 176 2 3 0 28 0 69 22 72 177 2 3 0 28 0 23 69 72 178 2 3 0 28 0 67 71 19 179 2 3 0 28 0 70 67 20 180 2 3 0 28 0 67 70 69 181 2 3 0 28 0 22 70 21 182 2 3 0 28 0 69 70 22 183 2 3 0 28 0 67 19 20 184 2 3 0 28 0 23 24 69 185 4 3 0 1 0 70 67 20 77 186 4 3 0 1 0 35 9 66 76 187 4 3 0 1 0 70 22 69 89 188 4 3 0 1 0 71 45 52 78 189 4 3 0 1 0 21 49 55 70 190 4 3 0 1 0 9 61 66 76 191 4 3 0 1 0 40 68 63 81 192 4 3 0 1 0 62 32 64 80 193 4 3 0 1 0 50 1 29 87 194 4 3 0 1 0 62 58 32 80 195 4 3 0 1 0 8 62 58 32 196 4 3 0 1 0 71 78 52 86 197 4 3 0 1 0 80 32 64 92 198 4 3 0 1 0 10 44 65 75 199 4 3 0 1 0 67 47 20 77 200 4 3 0 1 0 35 66 9 38 201 4 3 0 1 0 55 56 22 89 202 4 3 0 1 0 9 35 61 76 203 4 3 0 1 0 68 18 67 78 204 4 3 0 1 0 78 39 79 82 205 4 3 0 1 0 62 8 58 72 206 4 3 0 1 0 82 65 75 90 207 4 3 0 1 0 67 71 52 86 208 4 3 0 1 0 63 65 43 82 209 4 3 0 1 0 38 35 66 76 210 4 3 0 1 0 63 5 68 40 211 4 3 0 1 0 18 68 17 78 212 4 3 0 1 0 76 57 59 83 213 4 3 0 1 0 78 71 67 86 214 4 3 0 1 0 78 45 52 86 215 4 3 0 1 0 38 76 59 83 216 4 3 0 1 0 65 44 43 75 217 4 3 0 1 0 18 40 45 78 218 4 3 0 1 0 67 70 69 88 219 4 3 0 1 0 40 18 17 78 220 4 3 0 1 0 52 67 19 71 221 4 3 0 1 0 33 35 36 84 222 4 3 0 1 0 80 56 32 92 223 4 3 0 1 0 23 72 8 62 224 4 3 0 1 0 65 82 63 90 225 4 3 0 1 0 49 70 20 77 226 4 3 0 1 0 45 51 52 86 227 4 3 0 1 0 60 74 29 87 228 4 3 0 1 0 34 35 33 84 229 4 3 0 1 0 65 75 43 82 230 4 3 0 1 0 45 40 39 78 231 4 3 0 1 0 44 10 34 75 232 4 3 0 1 0 61 35 75 76 233 4 3 0 1 0 57 38 59 83 234 4 3 0 1 0 40 39 78 82 235 4 3 0 1 0 13 33 14 91 236 4 3 0 1 0 1 14 36 87 237 4 3 0 1 0 12 33 37 93 238 4 3 0 1 0 49 55 70 77 239 4 3 0 1 0 68 67 69 88 240 4 3 0 1 0 62 61 63 90 241 4 3 0 1 0 41 44 34 75 242 4 3 0 1 0 60 15 57 83 243 4 3 0 1 0 58 56 32 80 244 4 3 0 1 0 60 57 54 83 245 4 3 0 1 0 16 15 36 83 246 4 3 0 1 0 78 82 79 86 247 4 3 0 1 0 38 66 59 76 248 4 3 0 1 0 62 72 58 80 249 4 3 0 1 0 67 52 19 47 250 4 3 0 1 0 67 19 20 47 251 4 3 0 1 0 57 15 16 83 252 4 3 0 1 0 45 52 51 28 253 4 3 0 1 0 5 68 40 17 254 4 3 0 1 0 39 78 79 86 255 4 3 0 1 0 40 41 39 82 256 4 3 0 1 0 16 59 57 38 257 4 3 0 1 0 54 55 30 77 258 4 3 0 1 0 49 70 21 7 259 4 3 0 1 0 61 35 9 10 260 4 3 0 1 0 41 75 79 82 261 4 3 0 1 0 38 57 16 83 262 4 3 0 1 0 47 49 20 77 263 4 3 0 1 0 61 62 64 90 264 4 3 0 1 0 51 45 39 86 265 4 3 0 1 0 46 54 30 77 266 4 3 0 1 0 46 74 77 86 267 4 3 0 1 0 49 7 21 55 268 4 3 0 1 0 13 50 53 91 269 4 3 0 1 0 44 41 43 75 270 4 3 0 1 0 18 71 67 78 271 4 3 0 1 0 63 68 24 81 272 4 3 0 1 0 55 49 30 77 273 4 3 0 1 0 75 41 79 93 274 4 3 0 1 0 47 67 52 86 275 4 3 0 1 0 69 62 23 24 276 4 3 0 1 0 50 46 74 87 277 4 3 0 1 0 70 67 77 88 278 4 3 0 1 0 60 54 29 74 279 4 3 0 1 0 71 18 45 78 280 4 3 0 1 0 34 41 75 93 281 4 3 0 1 0 39 41 79 82 282 4 3 0 1 0 82 78 73 86 283 4 3 0 1 0 74 46 29 87 284 4 3 0 1 0 35 10 61 75 285 4 3 0 1 0 67 47 77 86 286 4 3 0 1 0 46 48 74 86 287 4 3 0 1 0 46 74 54 77 288 4 3 0 1 0 62 80 64 90 289 4 3 0 1 0 28 39 51 45 290 4 3 0 1 0 75 41 43 82 291 4 3 0 1 0 57 54 83 85 292 4 3 0 1 0 82 73 79 86 293 4 3 0 1 0 33 13 53 91 294 4 3 0 1 0 22 70 21 89 295 4 3 0 1 0 54 57 56 85 296 4 3 0 1 0 49 46 30 77 297 4 3 0 1 0 5 63 68 24 298 4 3 0 1 0 50 13 14 91 299 4 3 0 1 0 48 74 79 91 300 4 3 0 1 0 67 86 77 88 301 4 3 0 1 0 63 40 26 5 302 4 3 0 1 0 50 48 53 91 303 4 3 0 1 0 10 35 34 75 304 4 3 0 1 0 76 66 59 92 305 4 3 0 1 0 39 45 78 86 306 4 3 0 1 0 35 38 16 83 307 4 3 0 1 0 40 26 43 82 308 4 3 0 1 0 76 80 64 92 309 4 3 0 1 0 41 40 43 82 310 4 3 0 1 0 25 65 43 26 311 4 3 0 1 0 51 42 53 79 312 4 3 0 1 0 38 35 76 83 313 4 3 0 1 0 57 76 59 92 314 4 3 0 1 0 13 33 53 37 315 4 3 0 1 0 11 41 44 34 316 4 3 0 1 0 54 46 29 74 317 4 3 0 1 0 55 22 21 89 318 4 3 0 1 0 65 3 25 44 319 4 3 0 1 0 74 60 54 83 320 4 3 0 1 0 34 11 3 44 321 4 3 0 1 0 42 53 27 51 322 4 3 0 1 0 35 83 36 84 323 4 3 0 1 0 40 81 63 82 324 4 3 0 1 0 68 40 17 78 325 4 3 0 1 0 69 62 24 81 326 4 3 0 1 0 42 51 39 79 327 4 3 0 1 0 12 11 34 93 328 4 3 0 1 0 48 50 74 91 329 4 3 0 1 0 48 79 53 91 330 4 3 0 1 0 74 48 79 86 331 4 3 0 1 0 26 63 43 82 332 4 3 0 1 0 79 33 53 91 333 4 3 0 1 0 44 3 10 65 334 4 3 0 1 0 35 34 75 84 335 4 3 0 1 0 61 65 63 90 336 4 3 0 1 0 74 60 36 87 337 4 3 0 1 0 75 73 79 82 338 4 3 0 1 0 80 76 64 90 339 4 3 0 1 0 33 84 36 91 340 4 3 0 1 0 72 58 80 89 341 4 3 0 1 0 61 10 65 75 342 4 3 0 1 0 2 53 27 37 343 4 3 0 1 0 42 27 37 2 344 4 3 0 1 0 33 53 37 79 345 4 3 0 1 0 72 62 69 80 346 4 3 0 1 0 43 63 26 65 347 4 3 0 1 0 76 74 83 84 348 4 3 0 1 0 80 62 69 81 349 4 3 0 1 0 23 69 72 62 350 4 3 0 1 0 65 61 75 90 351 4 3 0 1 0 60 74 36 83 352 4 3 0 1 0 34 10 44 3 353 4 3 0 1 0 70 49 20 7 354 4 3 0 1 0 46 50 29 87 355 4 3 0 1 0 42 53 37 27 356 4 3 0 1 0 73 74 76 84 357 4 3 0 1 0 68 78 67 88 358 4 3 0 1 0 68 40 78 81 359 4 3 0 1 0 7 55 49 30 360 4 3 0 1 0 53 42 37 79 361 4 3 0 1 0 40 63 26 82 362 4 3 0 1 0 54 74 83 85 363 4 3 0 1 0 51 42 39 27 364 4 3 0 1 0 11 41 34 93 365 4 3 0 1 0 35 75 76 84 366 4 3 0 1 0 46 48 50 74 367 4 3 0 1 0 33 34 84 93 368 4 3 0 1 0 51 39 79 86 369 4 3 0 1 0 74 54 77 85 370 4 3 0 1 0 68 69 24 81 371 4 3 0 1 0 84 75 79 93 372 4 3 0 1 0 85 57 56 92 373 4 3 0 1 0 74 73 76 85 374 4 3 0 1 0 22 72 69 89 375 4 3 0 1 0 11 12 41 93 376 4 3 0 1 0 74 73 77 86 377 4 3 0 1 0 76 57 83 85 378 4 3 0 1 0 78 86 67 88 379 4 3 0 1 0 88 70 69 89 380 4 3 0 1 0 15 1 36 87 381 4 3 0 1 0 74 76 83 85 382 4 3 0 1 0 73 74 79 86 383 4 3 0 1 0 81 62 63 90 384 4 3 0 1 0 81 68 69 88 385 4 3 0 1 0 47 46 77 86 386 4 3 0 1 0 73 75 79 84 387 4 3 0 1 0 56 58 22 89 388 4 3 0 1 0 54 46 30 29 389 4 3 0 1 0 57 85 76 92 390 4 3 0 1 0 40 78 81 82 391 4 3 0 1 0 55 54 56 85 392 4 3 0 1 0 79 42 37 93 393 4 3 0 1 0 84 34 75 93 394 4 3 0 1 0 2 53 37 13 395 4 3 0 1 0 52 6 45 71 396 4 3 0 1 0 55 85 56 89 397 4 3 0 1 0 15 60 36 83 398 4 3 0 1 0 6 52 45 28 399 4 3 0 1 0 58 72 22 89 400 4 3 0 1 0 62 63 24 81 401 4 3 0 1 0 62 81 80 90 402 4 3 0 1 0 48 46 47 86 403 4 3 0 1 0 84 83 36 91 404 4 3 0 1 0 85 80 77 88 405 4 3 0 1 0 78 68 81 88 406 4 3 0 1 0 41 42 39 79 407 4 3 0 1 0 74 73 79 84 408 4 3 0 1 0 80 58 56 89 409 4 3 0 1 0 72 80 69 89 410 4 3 0 1 0 75 73 76 84 411 4 3 0 1 0 48 51 53 79 412 4 3 0 1 0 55 70 77 89 413 4 3 0 1 0 32 31 64 92 414 4 3 0 1 0 73 85 77 88 415 4 3 0 1 0 85 80 76 92 416 4 3 0 1 0 35 76 83 84 417 4 3 0 1 0 73 80 85 88 418 4 3 0 1 0 48 51 79 86 419 4 3 0 1 0 54 55 77 85 420 4 3 0 1 0 38 66 9 4 421 4 3 0 1 0 74 84 79 91 422 4 3 0 1 0 88 80 77 89 423 4 3 0 1 0 80 85 77 89 424 4 3 0 1 0 41 42 79 93 425 4 3 0 1 0 18 6 71 45 426 4 3 0 1 0 85 55 77 89 427 4 3 0 1 0 70 88 77 89 428 4 3 0 1 0 73 74 77 85 429 4 3 0 1 0 33 79 37 93 430 4 3 0 1 0 43 25 44 65 431 4 3 0 1 0 39 51 27 28 432 4 3 0 1 0 87 14 36 91 433 4 3 0 1 0 74 50 87 91 434 4 3 0 1 0 66 61 64 76 435 4 3 0 1 0 82 81 63 90 436 4 3 0 1 0 46 49 47 77 437 4 3 0 1 0 2 42 12 37 438 4 3 0 1 0 66 76 64 92 439 4 3 0 1 0 80 85 56 92 440 4 3 0 1 0 41 12 42 93 441 4 3 0 1 0 38 4 16 59 442 4 3 0 1 0 4 59 66 31 443 4 3 0 1 0 76 61 64 90 444 4 3 0 1 0 73 80 76 85 445 4 3 0 1 0 84 74 83 91 446 4 3 0 1 0 6 52 19 71 447 4 3 0 1 0 73 75 76 90 448 4 3 0 1 0 74 87 36 91 449 4 3 0 1 0 83 74 36 91 450 4 3 0 1 0 80 73 76 90 451 4 3 0 1 0 75 61 76 90 452 4 3 0 1 0 81 78 73 82 453 4 3 0 1 0 86 73 77 88 454 4 3 0 1 0 59 4 66 38 455 4 3 0 1 0 66 31 59 92 456 4 3 0 1 0 42 12 37 93 457 4 3 0 1 0 85 80 56 89 458 4 3 0 1 0 86 78 73 88 459 4 3 0 1 0 84 33 79 91 460 4 3 0 1 0 78 81 73 88 461 4 3 0 1 0 51 47 52 86 462 4 3 0 1 0 70 55 21 89 463 4 3 0 1 0 80 88 69 89 464 4 3 0 1 0 80 81 69 88 465 4 3 0 1 0 81 80 73 88 466 4 3 0 1 0 60 15 36 87 467 4 3 0 1 0 82 75 73 90 468 4 3 0 1 0 1 15 60 87 469 4 3 0 1 0 72 8 58 22 470 4 3 0 1 0 81 82 73 90 471 4 3 0 1 0 80 81 73 90 472 4 3 0 1 0 1 60 29 87 473 4 3 0 1 0 51 48 47 86 474 4 3 0 1 0 33 84 79 93 475 4 3 0 1 0 87 50 14 91 476 4 3 0 1 0 31 66 64 92 477 4 3 0 1 0 1 50 14 87 478 4 3 0 1 0 56 31 32 92 479 4 3 0 1 0 56 57 31 92 480 4 3 0 1 0 12 34 33 93 481 4 3 0 1 0 35 16 36 83 482 4 3 0 1 0 14 33 36 91 483 4 3 0 1 0 31 57 59 92 $EndElements freefem++-3.38-1/examples++-load/dfft.cpp000644 000767 000024 00000020456 12466663061 020135 0ustar00hechtstaff000000 000000 // Example C++ function "myfunction", dynamically loaded into "ff-c++ dfft.cpp " // --------------------------------------------------------------------- // $Id$ // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: fftw3 //ff-c++-cpp-dep: // #include "ff++.hpp" #include "AFunction_ext.hpp" #include template class DFFT_1d2dor3d { public: Complex * x; int n, m,k; int sign; DFFT_1d2dor3d(KN * xx,long signn,long nn=1,long kk=1) : x(*xx),n(nn),m(xx->N()/(nn*kk)),k(kk),sign(signn) { cout << xx << " " << signn << " " << nn << " " << xx->N() << " n: " << n << " m:" << m << " k: " << k <0 && (n*m*k ==xx->N())); } DFFT_1d2dor3d(KNM * xx,long signn) : x(*xx),n(xx->M()),m(xx->N()),sign(signn) { } }; DFFT_1d2dor3d dfft(KN * const & x,const long &sign) { return DFFT_1d2dor3d(x,sign); } DFFT_1d2dor3d dfft(KN *const &x,const long &nn,const long &sign) { return DFFT_1d2dor3d(x,sign,nn); } DFFT_1d2dor3d dfft(KN *const &x,const long &nn,const long &kk,const long &sign) { return DFFT_1d2dor3d(x,sign,nn,kk); } DFFT_1d2dor3d dfft(KNM * const & x,const long &sign) { return DFFT_1d2dor3d(x,sign); } bool ff_execute(fftw_plan *p) { if(*p) fftw_execute(*p); return 0; } bool ff_delete(fftw_plan *p) { if(*p) fftw_destroy_plan(*p); *p =0; return 0; } KN * dfft_eq( KN * const &x,const DFFT_1d2dor3d & d) { ffassert(x->N()==d.n*d.m*d.k ); Complex *px = *x; fftw_plan p; //cout << " dfft " << px << " = " << d.x << " n = " << d.n << " " << d.m << " sign = " << d.sign << endl; if ( d.k ==1) { if ( d.n > 1) p = fftw_plan_dft_2d(d.n,d.m,reinterpret_cast(d.x),reinterpret_cast (px),d.sign,FFTW_ESTIMATE); else p = fftw_plan_dft_1d(d.m ,reinterpret_cast(d.x),reinterpret_cast (px),d.sign,FFTW_ESTIMATE); } else { if ( d.n > 1) p = fftw_plan_dft_3d(d.n,d.m,d.k,reinterpret_cast(d.x),reinterpret_cast (px),d.sign,FFTW_ESTIMATE); else p = fftw_plan_dft_2d(d.m,d.k,reinterpret_cast(d.x),reinterpret_cast (px),d.sign,FFTW_ESTIMATE); } // cout << " ---" ; fftw_execute(p); // cout << " ---" ; fftw_destroy_plan(p); // cout << " ---" ; return x; } KN * dfft_eq( KN * const &x,const DFFT_1d2dor3d & d) { ffassert(0); return x; } /* class Init { public: Init(); };*/ // bofbof .. struct fftw_plan_s {}; // ... template<> inline AnyType DeletePtr(Stack,const AnyType &x) { fftw_plan * a=PGetAny(x); if(*a) fftw_destroy_plan(*a); *a =0; return Nothing; }; fftw_plan* plan__eq( fftw_plan* a, fftw_plan b) { if(*a) fftw_destroy_plan(*a); *a=b; return a; } fftw_plan* plan_set( fftw_plan* a, fftw_plan b) { // if(*a) fftw_destroy_plan(*a); *a=b; return a; } fftw_plan plan_dfft(KN * const & x,KN * const & y,const long &sign) { return fftw_plan_dft_1d(x->N() ,reinterpret_cast(&x[0]),reinterpret_cast (&y[0]),sign,FFTW_ESTIMATE); } fftw_plan plan_dfft(KNM * const & x,KNM * const & y,const long &sign) { long m=x->N(), n=x->M(); fftw_plan_dft_2d(n,m,reinterpret_cast(&x[0]),reinterpret_cast (&y[0]),sign,FFTW_ESTIMATE); return 0; } fftw_plan plan_dfft(KN * const & x,KN * const & y,const long &n,const long &sign) { long nn=n, mm=y->N()/nn; ffassert( mm*nn == y->N() && x->N() == y->N() ); return fftw_plan_dft_2d(nn,mm,reinterpret_cast(&x[0]),reinterpret_cast (&y[0]),sign,FFTW_ESTIMATE); } fftw_plan plan_dfft(KN * const & x,KN * const & y,const long &n,const long &k,const long &sign) { int nn=n, mm= y->N()/(k*n), kk= k; ffassert(y->N() == nn*mm*kk) ; if( nn >1) return fftw_plan_dft_3d(nn,mm,kk, reinterpret_cast(&x[0]),reinterpret_cast (&y[0]),sign,FFTW_ESTIMATE); else return fftw_plan_dft_2d(nn,mm,reinterpret_cast(&x[0]),reinterpret_cast (&y[0]),sign,FFTW_ESTIMATE); } class Mapkk : public E_F0mps { public: typedef Complex R; typedef KN_ Result; ; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =0; Expression nargs[n_name_param]; Expression expv, expm,exp; Mapkk(const basicAC_F0 & args) : expv(0), expm(0),exp(0) { args.SetNameParam(n_name_param,name_param,nargs); expv= to*>(args[0]); // a the expression to get the mesh expm= to(args[1]); exp= to(args[2]);// a the expression to get the mesh } ~Mapkk() { } static ArrayOfaType typeargs() { return ArrayOfaType( atype *>(), atype(), atype() ); } static E_F0 * f(const basicAC_F0 & args){ return new Mapkk(args);} AnyType operator()(Stack s) const ; }; basicAC_F0::name_and_type Mapkk::name_param[]={}; AnyType Mapkk::operator()(Stack s) const { MeshPoint *mp(MeshPointStack(s)) , mps=*mp; KN * pv=GetAny *>((*expv)(s)); KN v(*pv); long nn = v.N(); long m = GetAny((*expm)(s)); cout << " expm " << expm << " m = " << m << endl; long n = nn/m; double ki = 1./n ; double kj = 1./m ; double ki0=0., kj0=0; cout << n << " " << m << " " << nn << " == " << n*m << endl; ffassert( m* n == nn ); long n2= (n+1)/2, m2=(m+1)/2; for(long k=0,i=0;i < n; ++i) for(long j=0;j < m; ++j,++k) {// int ii=i, jj=j; if( ii > n2) ii=i-n; if( jj > m2) jj=j-n; R2 P(i*ki+ki0 ,j*kj+kj0); mp->set(P.x,P.y); v[k] = GetAny< R>((*exp)(s)); } *mp = mps; return 0L; } static void Load_Init(){ typedef DFFT_1d2dor3d DFFT_C; typedef DFFT_1d2dor3d DFFT_R; cout << " lood: init dfft " << endl; Dcl_Type(); Dcl_Type(); // cout << typeid(fftw_plan).name() << endl; Dcl_Type(::InitializePtr,::DeletePtr); Dcl_Type(); zzzfff->Add("fftwplan",atype()); TheOperators->Add("=", new OneOperator2(plan__eq)); TheOperators->Add("<-", new OneOperator2(plan_set)); Global.Add("plandfft","(", new OneOperator3_*,KN*,long >(plan_dfft )); Global.Add("plandfft","(", new OneOperator4_*,KN*,long,long >(plan_dfft )); Global.Add("plandfft","(", new OneOperator5_*,KN*,long,long,long >(plan_dfft )); Global.Add("plandfft","(", new OneOperator3_*,KNM*,long >(plan_dfft )); Global.Add("execute","(", new OneOperator1(ff_execute)); Global.Add("delete","(", new OneOperator1(ff_delete)); Global.Add("dfft","(", new OneOperator2_*,long >(dfft )); Global.Add("dfft","(", new OneOperator3_*,long,long >(dfft )); Global.Add("dfft","(", new OneOperator4_*,long,long, long >(dfft )); Global.Add("dfft","(", new OneOperator2_*,long >(dfft )); Global.Add("map","(", new OneOperatorCode( )); TheOperators->Add("=", new OneOperator2_*,KN*,DFFT_C>(dfft_eq)); /* Global.Add("dfft","(", new OneOperator2_*,long >(dfft )); Global.Add("dfft","(", new OneOperator3_*,long,long >(dfft )); Global.Add("dfft","(", new OneOperator4_*,long,long, long >(dfft )); Global.Add("dfft","(", new OneOperator2_*,long >(dfft )); TheOperators->Add("=", new OneOperator2_*,KN*,DFFT_R>(dfft_eq)); */ // TheOperators->Add("=", new OneOperator2_*,KNM*,DFFT_1d2dor3d>(dfft_eq)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/dfft.edp000644 000767 000024 00000004153 12131467023 020104 0ustar00hechtstaff000000 000000 // Example of dynamic function load // -------------------------------- // $Id$ // Discret Fast Fourier Transform // ------------------------------- load "dfft" int nx=32,ny=16,N=nx*ny; // warning the fourier space is not exactly the unite square due to periodic condition mesh Th=square(nx-1,ny-1,[(nx-1)*x/nx,(ny-1)*y/ny]); // warring the numbering is of the vertices (x,y) is // given by $ i = x/nx + nx* y/ny $ fespace Vh(Th,P1); func f1 = cos(2*x*2*pi)*cos(3*y*2*pi); Vh u=f1,v; Vh w=f1; Vh ur,ui; // in dfft the matrix n,m is in row-major order ann array n,m is // store j + m* i ( the transpose of the square numbering ) v[]=dfft(u[],ny,-1); u[]=dfft(v[],ny,+1); cout << " ||u||_\infty " << u[].linfty << endl; u[] *= 1./N; // remark: operator /= bug before version 2.0-3 (FH) cout << " ||u||_\infty " << u[].linfty << endl; ur=real(u); plot(w,wait=1,value=1,cmm="w"); plot(ur,wait=1,value=1,cmm="u"); v = w-u; cout << " diff = "<< v[].max << " " << v[].min << endl; assert( norm(v[].max) < 1e-10 && norm(v[].min) < 1e-10) ; // ------- a more hard example ----\hfilll // Lapacien en FFT \hfilll // $ -\Delta u = f $ with biperiodic condition \hfilll func f = cos(3*2*pi*x)*cos(2*2*pi*y); // func ue = +(1./(square(2*pi)*13.))*cos(3*2*pi*x)*cos(2*2*pi*y); // the exact solution Vh ff = f; Vh fhat; fhat[] = dfft(ff[],ny,-1); Vh wij; // warning in fact we take mode between -nx/2, nx/2 and -ny/2,ny/2 // thank to the operator ?: \label{?:} wij = square(2.*pi)*(square(( x<0.5?x*nx:(x-1)*nx)) + square((y<0.5?y*ny:(y-1)*ny))); wij[][0] = 1e-5; // to remove div / 0 fhat[] = fhat[]./ wij[]; // u[]=dfft(fhat[],ny,1); u[] /= complex(N); ur = real(u); // the solution w = real(ue); // the exact solution plot(w,ur,value=1 ,cmm=" ue ", wait=1); w[] -= ur[]; // array sub real err= abs(w[].max)+abs(w[].min) ; cout << " err = " << err << endl; assert( err < 1e-6); // version 3.22 ... fftwplan p1=plandfft(u[],v[],ny,-1); fftwplan p2=plandfft(u[],v[],ny,1); real ccc = square(2.*pi); cout << " ny = " << ny << endl; map(wij[],ny,ccc*(x*x+y*y)); wij[][0] = 1e-5; freefem++-3.38-1/examples++-load/dmatrix.hpp000755 000767 000024 00000006267 12115121001 020644 0ustar00hechtstaff000000 000000 // SUMMARY : matrix manipulation // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : P. Jolivet // E-MAIL : Pierre Jolivet // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include //#include #include #include struct step { public: step(int x, int y) : x(x), y(y) { } int operator()() { return x += y; } private: int x, y; }; template static void CSR2COO(unsigned int n, int* compressedI, int* uncompressedI) { if(S == 'U') { for(int i = n - 1; i > -1; --i) { if(M == 'F') std::fill(uncompressedI + compressedI[i] - 1, uncompressedI + compressedI[i + 1] - 1, i + 1); else std::fill(uncompressedI + compressedI[i], uncompressedI + compressedI[i + 1], i + 1); } } else if(S == 'L') { for(int i = 1; i < n; ++i) { if(M == 'F') std::fill(uncompressedI + compressedI[i] - i - 1, uncompressedI + compressedI[i + 1] - i - 1, i + 1); else std::fill(uncompressedI + compressedI[i] - i, uncompressedI + compressedI[i + 1] - i - 1, i + 1); } } }; template static unsigned int trimCSR(unsigned int n, int* trimmedI, int* untrimmedI, int* trimmedJ, int* untrimmedJ, Scalar* trimmedC, Scalar* untrimmedC) { unsigned int upper = 0; for(unsigned int i = 0; i < n - WithDiagonal; ++i) { trimmedI[i] = upper + (N == 'F'); int* jIndex = lower_bound(untrimmedJ + untrimmedI[i], untrimmedJ + untrimmedI[i + 1], i + !WithDiagonal); unsigned int j = untrimmedI[i] + jIndex - (untrimmedJ + untrimmedI[i]); if(N == 'F') { for(unsigned int k = j; k < untrimmedI[i + 1]; ++k) trimmedJ[upper + k - j] = untrimmedJ[k] + 1; } else std::copy(untrimmedJ + j, untrimmedJ + untrimmedI[i + 1], trimmedJ + upper); std::copy(untrimmedC + j, untrimmedC + untrimmedI[i + 1], trimmedC + upper); upper += untrimmedI[i + 1] - j; } if(WithDiagonal) { trimmedI[n - 1] = upper + (N == 'F'); trimmedI[n] = trimmedI[n - 1] + 1; trimmedJ[upper] = n - (N == 'C'); trimmedC[upper] = untrimmedC[untrimmedI[n] - 1]; return trimmedI[n]; } else { trimmedI[n] = trimmedI[n - 1]; return trimmedI[n + 1]; } }; freefem++-3.38-1/examples++-load/DxWriter.cpp000644 000767 000024 00000025110 12466661714 020755 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Sala Lorenzo // E-MAIL : salalo80@gmail.com // #include "mode_open.hpp" #include #include #include #include using namespace std; #include "ff++.hpp" using namespace Fem2D; /*!The class DxWriter permits to save in opendx format a "field" (in the dx-language a "field" means the values of a function f(x,y,z) on a grid), a time series (an ordered collection of "fields", so we have field0=f(x,y,z,t0), field1=f(x,y,z,t1) and so on). DxWriter creates two files: one with extension .data where it puts the position of the grid, the connessions, the values; and one with extension.dx where it puts the time series. Now you can save only scalar fields. An example load "DxWriter" mesh Th=square(5,5); DxWriter ff("pippo"); Dxaddmesh(ff, Th); Dxaddtimeseries(ff, "Vx",Th); fespace Vh(Th, P1); Vh vx=x*y; Dxaddsol2ts(ff,"Vx",1.0, vx); vx=0.5*x*y^2+0.2; Dxaddsol2ts(ff,"Vx",2.0, vx); cout<<"Ciao"; */ class DxWriter { struct tsinfo{ int imesh;//! vecistant; }; private: std::vector _vecmesh; std::vector _vecofts; std::string _nameoffile; /*! This string contains the name of data file with \\ where there's a \ in the path*/ std::string _nameofdatafile; //!files containing the data and the timeseries std::ofstream _ofdata, _ofts; /*!This function is called frequently, so if the main program crashes the files are good and you need only write "end" at the end of data file: echo end>>nameoffile.data and then the files are good */ void save_header(){ std::string s=_nameoffile; s.append(".dx"); _ofts.open(s.c_str(), std::ios_base::out); for(int i=0;i<_vecofts.size();++i){ _ofts<<"object \""<<_vecofts[i].name<<"\" class series"<::const_iterator first=_vecmesh.begin(), last=_vecmesh.end(); if(std::find(first, last, mesh)==last){ addmesh(mesh); ts.imesh=_vecmesh.size()-1; }else{ ts.imesh=std::distance(first, std::find(first, last, mesh)); } _vecofts.push_back(ts); } /*!Add an instant to a time series name*/ void addistant2ts(const string& nameofts, const double t, const KN&val){ int jj=-1; for(int i=0;i<_vecofts.size();++i){ if(_vecofts[i].name==nameofts)jj=i; } _vecofts[jj].vecistant.push_back(t); _ofdata.flags(std::ios_base::scientific); _ofdata.precision(15); _ofdata<<"object \""<&val){ std::vector::const_iterator first=_vecmesh.begin(), last=_vecmesh.end(); int im; if(std::find(first, last, mesh)==last){ addmesh(mesh); im=_vecmesh.size()-1; }else{ im=std::distance(first, std::find(first, last, mesh)); } _ofdata.flags(std::ios_base::scientific); _ofdata.precision(15); _ofdata<<"object \""<(args[0])) edx = CastTo(args[0]); if (BCastTo(args[1])) ename = CastTo(args[1]); if (BCastTo(args[2])) et = CastTo(args[2]); if ( args[3].left()==atype() ){ what=1; nbfloat=1; evct=to( args[3] ); } else if ( args[3].left()==atype() ) { what=1; nbfloat=1; evct=to( args[3] ); } else if ( BCastTo(args[3]) ) { what=1; nbfloat=1; evct=to( args[3] ); } else if ( args[3].left()==atype() ) { CompileError("Until now only scalar solution"); /*const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); //cout << "taille" << a0->size() << endl; //if (a0->size() != ddim || a0->size() != stsize) // CompileError("savesol in 2D: vector solution is 2 composant, symmetric solution is 3 composant"); if( a0->size() == ddim){ // vector solution what=2; nbfloat=a0->size(); for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize){ // symmetric tensor solution what=3; nbfloat=a0->size(); for(int j=0; j( (*a0)[j]); } }*/ } else { CompileError("savesol in 2D: Sorry no way to save this kind of data"); } } static ArrayOfaType typeargs() { return ArrayOfaType(atype(), atype(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new Dxwritesol_Op(args);} AnyType operator()(Stack stack) const ; }; AnyType Dxwritesol_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; DxWriter &dx=*(GetAny((*edx)(stack))); string &name=*(GetAny((*ename)(stack))); double t=GetAny((*et)(stack)); Mesh &Th=*(dx.getmeshts(name)); int nt = Th.nt; int nv = Th.nv; int nbsol=nv; long longdefault; KN valsol(nbsol); valsol=0.; KN takemesh(nbsol); takemesh=0; MeshPoint *mp3(MeshPointStack(stack)); for (int it=0;itsetP(&Th,it,iv); valsol[i] = valsol[i] + GetAny< double >((*evct)(stack)); ++takemesh[i]; } } for(int i=0; iinit(); a->openfiles(*s); std::cout << "end init_DxWriter" << std::endl; return a; } void* call_addmesh( DxWriter * const & mt, Fem2D::Mesh* const & pTh) { mt->addmesh(pTh); return NULL; } void* call_addtimeseries( DxWriter * const & mt,string * const & name, Fem2D::Mesh* const & pTh) { mt->addtimeseries(*name, pTh); return NULL; } // Add the function name to the freefem++ table /* class Init { public: Init(); }; $1 */ static void Load_Init(){ Dcl_Type(InitP,Destroy); // declare deux nouveau type pour freefem++ un pointeur et zzzfff->Add("DxWriter",atype()); // ajoute le type myType a freefem++ // constructeur d'un type myType dans freefem TheOperators->Add("<-", new OneOperator2_(&init_DxWriter)); Global.Add("Dxaddmesh","(",new OneOperator2_(call_addmesh)); Global.Add("Dxaddtimeseries","(",new OneOperator3_(call_addtimeseries)); Global.Add("Dxaddsol2ts","(",new OneOperatorCode< Dxwritesol_Op> ); //atype< myType * >()->Add("(","",new OneOperator3_(set_myType_uv)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/Element_Mixte.cpp000644 000767 000024 00000125263 12477617013 021751 0ustar00hechtstaff000000 000000 // add some mixte finite element // RT1 et BDM1 conforme in H(div) space, ie u.n continuous (n = is the normal) // RT1Ortho , BDM1 are conforme in H(curl) space ie u.t continuous (t = is the tangent) // RT1 , RT1Ortho ( Neledec type I order 1) // BDM1 (Brezzi, Douglas, Marini) , , BDM1Ortho ( Neledec type I order 1) // the // TDNNS1 finite element for symetrix 2x2 matrix conforme in H(div div) // : Snn are continious // See Thesis of Astrid Sabine Sinwel, A New Family of Mixed Finite Elements for Elasticity, 2009 // http://www.numa.uni-linz.ac.at/Teaching/PhD/Finished/sinwel-diss.pdf // JOHANNES KEPLER UNIVERSITA,T LINZ // Thesis of Sabine Zaglmayr, High Order Finite Element Methods for Electromagnetic Field Computation, 2006 // JOHANNES KEPLER UNIVERSITA,T LINZ // http://www.numerik.math.tugraz.at/~zaglmayr/pub/szthesis.pdf // // F. Hecht May 2011 // ------------------------------------------------------------ // test /* -- edp script associed: LaplaceRT1.edp lame-TD-NSS.edp test-ElementMixte.edp */ //ff-c++-LIBRARY-dep: lapack blas #include "ff++.hpp" #include "AddNewFE.h" #ifdef __LP64__ typedef int intblas; typedef int integer; #else typedef long intblas; typedef long integer; #endif typedef integer logical; typedef float LAPACK_real; typedef double doublereal; typedef logical (* L_fp)(); typedef integer ftnlen; typedef complex LAPACK_complex; typedef complex doublecomplex; typedef void VOID; #define complex LAPACK_complex #define real LAPACK_real #include "clapack.h" #undef real #undef complex // #include "problem.hpp" namespace Fem2D { // ------ P2 TD_NNS class TypeOfFE_TD_NNS0 : public TypeOfFE { public: static int Data[]; // double Pi_h_coef[]; TypeOfFE_TD_NNS0(): TypeOfFE(3, 3, Data, 1, 1, 9, // nb coef to build interpolation 3, // np point to build interpolation 0) { const R c3=1./3.; const R2 Pt[] = {R2(0.5,0.5), R2(0,0.5),R2(0.5,0)}; // for the 3 vertices 6 coef // P_Pi_h[0]=Pt[0]; int kk=0; for (int e=0;e<3;++e) { // point d'integration sur l'arete e P_Pi_h[e]= Pt[e]; pij_alpha[kk++]= IPJ(e,e,0); pij_alpha[kk++]= IPJ(e,e,1); pij_alpha[kk++]= IPJ(e,e,2); } assert(P_Pi_h.N()==3); assert(pij_alpha.N()==kk); } void FB(const bool * whatd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const; } ; // on what nu df on node node of df int TypeOfFE_TD_NNS0::Data[]={ 3,4,5, // support on what 0,0,0, // df on node 0,1,2, // th node of df 0,0,0, // df previou FE 0,1,2, // which df on prev 0,0,0, 0,0,0, 3,3,3 }; void TypeOfFE_TD_NNS0::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); int k=0; // integration sur les aretes for (int i=0;i<3;i++) { R2 N(T.Edge(i).perp()); v[k++]= N.x*N.x; v[k++]= 2*N.y*N.x; v[k++]= N.y*N.y; } assert(k==9); } void TypeOfFE_TD_NNS0::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { typedef double R; //R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; const R c3= 1./3.; R ll3[3]={l0-c3,l1-c3,l2-c3}; R ll[3]={l0,l1,l2}; R2 Dl[3]= {K.H(0), K.H(1), K.H(2) }; /* if T_i=Edge(i) ,N=T.perp : N_i' T_j T_k' N_i =0 if i=j or i=k N_i' T_j = det(T_i,T_j) = aire(K) */ R cK= 2* K.area; R2 Rl[3]= { K.Edge(0)/cK, K.Edge(1)/ cK, K.Edge(2)/ cK}; // /* bulle: $ B_i = ((Rot L_i+1 ) (Rot L_(i+2)' ))^s L_i$ s => symetrise .. */ R S[3][3],S1[3][3]; for(int i=0;i<3;++i) { int i1=(i+1)%3; int i2=(i+2)%3; S[0][i]= -Rl[i1].x*Rl[i2].x; S[1][i]= -(Rl[i1].x*Rl[i2].y+Rl[i1].y*Rl[i2].x)*0.5; S[2][i]= -Rl[i1].y*Rl[i2].y; } val=0; KN wd(KN_(whatd,last_operatortype)); if (wd[op_id]) { for(int c=0;c<3;++c) for(int i=0;i<3;++i){ val(i,c,op_id) = S[c][i]; // (c3-ll[i])/c3 } } /* // s[.] [i] = { // // compute the inv of S with lapack for(int j=0;j<3;++j) for(int i=0;i<3;++i) S1[i][j]=S[i][j]; intblas N=3,LWORK = 9; double WORK[9] ; intblas INFO,IPIV[4]; dgetrf_(&N,&N,&(S1[0][0]),&N,IPIV,&INFO); ffassert(INFO==0); dgetri_(&N,&(S1[0][0]),&N,IPIV,WORK,&LWORK,&INFO); ffassert(INFO==0); } R B[3][3], BB[3][3]; R cc = 3./K.area; for(int j=0;j<3;++j) for(int i=0;i<3;++i) B[i][j]= S[i][j]*ll[j]; for(int i=0;i<3;++i) for(int k=0;k<3;++k) { BB[i][k]=0.; for(int j=0;j<3;++j) BB[i][k] += cc*S[i][j]*ll[j]*S1[j][k]; } if(verbosity>1000) { cout << endl; cout << Rl[0] << " "<< Rl[1] << ", " < wd(KN_(whatd,last_operatortype)); val=0; throwassert( val.N()>=6); throwassert(val.M()==3); val=0; if (wd[op_id]) { for(int c=0;c<3;++c) for(int i=0;i<3;++i){ val(i,c,op_id) = S[c][i]*(c3-ll[i])/c3; // (c3-ll[i])/c3 val(i+3,c,op_id) = BB[c][i]; } } if (wd[op_dx]) { for(int i=0;i<3;++i) for(int k=0;k<3;++k) { BB[i][k]=0.; for(int j=0;j<3;++j) BB[i][k] += cc*S[i][j]*Dl[j].x*S1[j][k]; } for(int c=0;c<3;++c) for(int i=0;i<3;++i) { val(i ,c,op_dx) = -S[c][i]*Dl[i].x/c3; val(i+3,c,op_dx) = BB[c][i]; } } if (wd[op_dy]) { for(int i=0;i<3;++i) for(int k=0;k<3;++k) { BB[i][k]=0. ; for(int j=0;j<3;++j) BB[i][k] += cc*S[i][j]*Dl[j].y*S1[j][k]; } for(int c=0;c<3;++c) for(int i=0;i<3;++i) { val(i ,c,op_dy) = -S[c][i]*Dl[i].y/c3; val(i+3,c,op_dy) = BB[c][i]; } } */ } // ------ P2 TD_NNS class TypeOfFE_TD_NNS1 : public TypeOfFE { public: static int Data[]; // double Pi_h_coef[]; const QuadratureFormular1d & QFE; const GQuadratureFormular & QFK; TypeOfFE_TD_NNS1(): TypeOfFE(3*2+3, 3, Data, 2, 1, 3+6*3*QF_GaussLegendre2.n, // nb coef to build interpolation QuadratureFormular_T_1.n+3*QF_GaussLegendre2.n, // np point to build interpolation 0), QFE(QF_GaussLegendre2), QFK(QuadratureFormular_T_1) { int kk=0,kp=0; for(int p=0;p A X=1 => B; } } for (int e=0;e<3;++e) for(int p=0;p & v) const; } ; // on what nu df on node node of df int TypeOfFE_TD_NNS1::Data[]={ 3,3, 4,4, 5,5, 6,6,6,// support on what 0,1, 0,1, 0,1, 0,1,2, // df on node 0,0, 1,1, 2,2, 3,3,3, // th node of df 0,0, 0,0, 0,0, 0,0,0, // df previou FE 0,1, 2,3, 4,5, 6,7,8, // which df on prev 0,0,0, 0,0,0, 9,9,9 }; void TypeOfFE_TD_NNS1::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); int k=0; // coef pour les 3 sommets fois le 2 composantes // for (int i=0;i<3;i++) for (int p=0;p symetrise .. */ R S[3][3],S1[3][3]; int ei0[3]={1,2,0}; int ei1[3]={ 2,0,1}; for(int i=0;i<3;++i) { if(K.EdgeOrientation(i) < 0) Exchange(ei0[i],ei1[i]); int i1=(i+1)%3; int i2=(i+2)%3; S[0][i]= -Rl[i1].x*Rl[i2].x; S[1][i]= -(Rl[i1].x*Rl[i2].y+Rl[i1].y*Rl[i2].x)*0.5; S[2][i]= -Rl[i1].y*Rl[i2].y; } // s[.] [i] = { // // compute the inv of S with lapack for(int j=0;j<3;++j) for(int i=0;i<3;++i) S1[i][j]=S[i][j]; intblas N=3,LWORK = 9; double WORK[9] ; intblas INFO,IPIV[4]; dgetrf_(&N,&N,&(S1[0][0]),&N,IPIV,&INFO); ffassert(INFO==0); dgetri_(&N,&(S1[0][0]),&N,IPIV,WORK,&LWORK,&INFO); ffassert(INFO==0); } R B[3][3], BB[3][3]; R cc = 3./K.area; for(int j=0;j<3;++j) for(int i=0;i<3;++i) B[i][j]= S[i][j]*ll[j]; for(int i=0;i<3;++i) for(int k=0;k<3;++k) { BB[i][k]=0.; for(int j=0;j<3;++j) BB[i][k] += cc*S[i][j]*ll[j]*S1[j][k]; } if(verbosity>1000) { cout << endl; cout << Rl[0] << " "<< Rl[1] << ", " < wd(KN_(whatd,last_operatortype)); val=0; throwassert( val.N()>=6); throwassert(val.M()==3); val=0; if (wd[op_id]) { for(int c=0;c<3;++c) for(int i=0;i<3;++i){ val(2*i,c,op_id) = S[c][i]*(ll[ei0[i]]-ll[i]); val(2*i+1,c,op_id) = S[c][i]*(ll[ei1[i]]-ll[i]); val(i+6,c,op_id) = BB[c][i]; } } if (wd[op_dx]) { for(int i=0;i<3;++i) for(int k=0;k<3;++k) { BB[i][k]=0.; for(int j=0;j<3;++j) BB[i][k] += cc*S[i][j]*Dl[j].x*S1[j][k]; } for(int c=0;c<3;++c) for(int i=0;i<3;++i) { val(2*i,c,op_dx) = S[c][i]*(Dl[ei0[i]].x-Dl[i].x); val(2*i+1,c,op_dx) = S[c][i]*(Dl[ei1[i]].x-Dl[i].x); val(i+6,c,op_dx) = BB[c][i]; } } if (wd[op_dy]) { for(int i=0;i<3;++i) for(int k=0;k<3;++k) { BB[i][k]=0. ; for(int j=0;j<3;++j) BB[i][k] += cc*S[i][j]*Dl[j].y*S1[j][k]; } for(int c=0;c<3;++c) for(int i=0;i<3;++i) { val(2*i,c,op_dy) = S[c][i]*(Dl[ei0[i]].y-Dl[i].y); val(2*i+1,c,op_dy) = S[c][i]*(Dl[ei1[i]].y-Dl[i].y); val(i+6,c,op_dy) = BB[c][i]; } } } struct InitTypeOfRTk_2d { int k;// order poly on edge int ndfi;// nb of internal dof int npe; // nb point on edge int ndf; // nb dof KN X; // point on edge // KN Pi_h_coef; // 1 KN Data; // data of TypeOfFE const QuadratureFormular1d QFE; const GQuadratureFormular & QFK; InitTypeOfRTk_2d(int KK) :k(KK),ndfi((k+1)*(k)), npe(k+1),ndf(3*npe+ndfi),Data( 5*ndf+6), QFE(-1+2*npe,npe,GaussLegendre(npe),true), QFK(QuadratureFormular_T_5) { int j=0; int ndfe=ndf-ndfi; // int o[6]; o[0]=0; for(int i=1;i<6;++i) o[i]=o[i-1]+ndf; for(int df=0;dfpij_alpha.N() << endl; //cout << i << " ii == " << this->P_Pi_h.N() << endl; ffassert(kkk==this->pij_alpha.N()); ffassert(i==this->P_Pi_h.N() ); } void Pi_h_alpha(const baseFElement & K,KN_ & v) const { // compute the coef of interpolation ... const Triangle & T(K.T); int k=0; for (int i=0;i<3;i++) { R2 E(Ortho? T.Edge(i) : -T.Edge(i).perp()); R s = T.EdgeOrientation(i) ; for (int p=0;p \int_e f \lambda_{e+k} . n_e THE 2 internal dof are : f -> \int_K f e_i where e_i is the canonical basis of R^2 so the basis function are let call \phi_i the basic fonction of RT0 (without orientation) so the normal is exterior. \phi_i (X) = ( X- Q_i ) / (2 |K|) = \lambda_{i+1} Curl( \lambda_{i+2}) - \lambda_{i+2} Curl( \lambda_{i+1}) edge function j=0,1 i1= i+j+1, i2= i+2-j remark : {i,i1,i2} <=> {i,i+1,i+2} \phi_i ( \lambda_{i1} - 4/3 \lambda_i) + 1/3 \phi_{i1}\lambda_{i1} internal function are \sum bx_i \phi_{i}\lambda_{i} \sum by_i \phi_{i}\lambda_{i} \sum bx_i = 1/c0 \sum by_i = 1/c0 we have \phi_{i} = A_{i+2} \lambda_{i+1} - A_{i+1} \lambda_{i+2} with A_i = Th.edge(i)/ ( 2 |K]) B_i = A_{i+2} - A_{i+1} det( B_i ) = 9 *2 area to be homogene cc0= |K] sqrt(area)*sqrt(18) ccK= 9 *2 area *c0; bx_0 = det(R2(cc0,0),B1,B2)/ ( cck) so all basic d function are the sum of 3 function sum_{k=0}^2 c_k phi_{p_k} lambda_{l_k} */ assert( val.N()>=ndf); assert(val.M()==2); int ee=0; val=0; R2 phi[3] = { X-Q[0], X-Q[1], X-Q[2] };// phi * area *2 int pI[8][3];// store p_k int lI[8][3];// store l_k R cI[8][3];// store c_k int df=0; R CKK = 2* K.area; for(int e=0;e<3;++e) { int i=e; int ii[2]={(e+1)%3,(e+2)%3}; int i2=(e+2)%3; R s = K.EdgeOrientation(e)/CKK; if(s<0) Exchange(ii[0],ii[1]); // for(int k=0;k<2;++k,df++) { pI[df][0]= i; lI[df][0]= ii[k]; cI[df][0]= s; pI[df][1]= i; lI[df][1]= i; cI[df][1]= -s*4./3.; pI[df][2]= ii[k]; lI[df][2]= ii[k]; cI[df][2]= s/3.; } } /* if(count<0) { // verif. R2 PP[] ={ R2(0.5,0),R2(0.5,0.5),R2(0,0.5)}; int err=0; for(int df = 0;df < 6;++df) { cout << " df = " << df << " : \t"; for(int k=0;k<3;++k) cout <<"+ " << cI[df][k] << " *l" << lI[df][k] << " *phi" << pI[df][k] << " \t "; cout << endl; R2 fd; for(int p=0;p<3;++p) { R L[3]; PP[p].toBary(L); R2 X=K(PP[p]); cout << X << " ,\t " << L[0] << " " << L[1] << " " < 1e-5) err++; cout << " Verif " << df << " [ " << 3*fd << " ] " << fd.norme() <pij_alpha.N() << endl; //cout << i << " ii == " << this->P_Pi_h.N() << endl; ffassert(kkk==this->pij_alpha.N()); ffassert(i==this->P_Pi_h.N() ); } void Pi_h_alpha(const baseFElement & K,KN_ & v) const { // compute the coef of interpolation ... const Triangle & T(K.T); int k=0; // magic fom: // // inv of [[4!,3!,2!2!],[3!,2!2!,2!],[2!2!,3!,4!]]/5! = const double a11=9,a12=-18,a22=3,b11=-18, b12=84;// thank maple .. // inv [[2, 1, 1], [1, 2, 1], [1, 1, 2]]/12 = diag [9, hors diag -3] for (int i=0;i<3;i++) { R2 E(Ortho? T.Edge(i) : -T.Edge(i).perp()); R s = T.EdgeOrientation(i) ; for (int p=0;p \int_e f \lambda_{e+k} . n_e THE 2 internal dof are : f -> \int_K f e_i where e_i is the canonical basis of R^2 so the basis function are let call \phi_i the basic fonction of RT0 (without orientation) so the normal is exterior. \phi_i (X) = ( X- Q_i ) / (2 |K|) = \lambda_{i+1} Curl( \lambda_{i+2}) - \lambda_{i+2} Curl( \lambda_{i+1}) remarque les bulles sont du type \phi_i l_i l_k soit 9 bulles qui ne sont pas independent .. car \sum \phi_i l_i = 0 => 6 bulles independents The Edges function j=0,1,2 , for ll_j = l1^2, l1l2 l2^2 on edge i+1,i+2 with k=1,2 : lk = \lambda_{i+k} \phi_i ll_j + c_jk \phi_i l_i l_k to remove the 3 internal node 2 term int \phi_i ll_j l_k = Curl( \lambda_{i+2}) * - Curl( \lambda_{i+1}) * // c'est le bordel a calculer .. i1= i+j+1, i2= i+2-j remark : {i,i1,i2} <=> {i,i+1,i+2} \phi_i ( \lambda_{i1} - 4/3 \lambda_i) + 1/3 \phi_{i1}\lambda_{i1} internal function are ??? \sum bx_i \phi_{i}\lambda_{i} \sum by_i \phi_{i}\lambda_{i} \sum bx_i = 1/c0 \sum by_i = 1/c0 we have \phi_{i} = A_{i+2} \lambda_{i+1} - A_{i+1} \lambda_{i+2} with A_i = Th.edge(i)/ ( 2 |K]) B_i = A_{i+2} - A_{i+1} det( B_i ) = 9 *2 area to be homogene cc0= |K] sqrt(area)*sqrt(18) ccK= 9 *2 area *c0; bx_0 = det(R2(cc0,0),B1,B2)/ ( cck) so all basic d function are the sum of 4 functions Qu'il faut calculer ... sum_{k=0}^4 c_k phi_{p_k} lambda_{l_k} lambda{ll_k} */ assert( val.N()>=ndf); assert(val.M()==2); int ee=0; val=0; R2 phi[3] = { X-Q[0], X-Q[1], X-Q[2] };// phi * area *2 //3*3 + 2*3 = 15 int pI[15][4];// store p_k int lI[15][4];// store l_k int llI[15][4];// store ll_k R cI[15][4];// store c_k int df=0; R CKK = 2* K.area; for(int e=0;e<3;++e) { int i=e; int ii[2]={(e+1)%3,(e+2)%3}; int i2=(e+2)%3; R s = K.EdgeOrientation(e)/CKK; if(s<0) Exchange(ii[0],ii[1]); // for(int k=0;k<3;++k,df++) { pI[df][0]= i; lI[df][0]= ii[k]; llI[df][0]= ii[k]; cI[df][0]= s; pI[df][1]= i; lI[df][1]= i; cI[df][1]= -s*4./3.; pI[df][2]= ii[k]; lI[df][2]= ii[k]; cI[df][2]= s/3.; } } /* if(count<0) { // verif. R2 PP[] ={ R2(0.5,0),R2(0.5,0.5),R2(0,0.5)}; int err=0; for(int df = 0;df < 6;++df) { cout << " df = " << df << " : \t"; for(int k=0;k<3;++k) cout <<"+ " << cI[df][k] << " *l" << lI[df][k] << " *phi" << pI[df][k] << " \t "; cout << endl; R2 fd; for(int p=0;p<3;++p) { R L[3]; PP[p].toBary(L); R2 X=K(PP[p]); cout << X << " ,\t " << L[0] << " " << L[1] << " " < 1e-5) err++; cout << " Verif " << df << " [ " << 3*fd << " ] " << fd.norme() <pij_alpha.N() << endl; //cout << i << " ii == " << this->P_Pi_h.N() << endl; ffassert(kkk==this->pij_alpha.N()); ffassert(i==this->P_Pi_h.N() ); } void Pi_h_alpha(const baseFElement & K,KN_ & v) const { // compute the coef of interpolation ... const Triangle & T(K.T); int k=0; for (int i=0;i<3;i++) { R2 E(Ortho? T.Edge(i) : -T.Edge(i).perp()); R s = T.EdgeOrientation(i) ; for (int p=0;p (which is defined in FESpacen.hpp) class TypeOfFE_Edge1_3d : public GTypeOfFE { public: typedef Mesh3 Mesh; typedef Mesh3::Element Element; typedef GFElement FElement; static int dfon[]; static const int d=Mesh::Rd::d; static const GQuadratureFormular QFe; // quadrature formula on an edge static const GQuadratureFormular QFf; // quadrature formule on a face int edgeface[4][3]; // not used?! TypeOfFE_Edge1_3d(); // constructor void FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd & P,RNMK_ & val) const; void set(const Mesh & Th,const Element & K,InterpolationMatrix & M,int ocoef,int odf,int *nump) const; }; int TypeOfFE_Edge1_3d:: dfon[] = {0,2,2,0}; // 2 dofs on each edge, 2 dofs on each face // Quadrature formula on an edge, exact for degree 3 (ok: int_e (deg2*t *lambda)) const GQuadratureFormular TypeOfFE_Edge1_3d:: QFe(-1+2*2,2,GaussLegendre(2),true); // argomenti: exact, num pti integrazione, pti integrazione, clean (~GQuadratureFormular() {if(clean) delete [] p;}) // GaussLegendre definita in QuadratureFormular.cpp (nel commento dice che è su [0,1]) // Quadrature formule on a face, exact for degree 2 (ok: int_f (deg2*t)), internal quadrature points static GQuadraturePoint P_QuadratureFormular_T_2_intp[3] = { GQuadraturePoint(1./3.,R2(1./6.,4./6.)) , GQuadraturePoint(1./3.,R2(4./6.,1./6.)) , GQuadraturePoint(1./3.,R2(1./6.,1./6.)) }; // GQuadratureFormular const QuadratureFormular_T_2_int(2,3,P_QuadratureFormular_T_2_intp); const GQuadratureFormular TypeOfFE_Edge1_3d:: QFf(2,3,P_QuadratureFormular_T_2_intp); // In Mesh3dn.cpp: // static const int nvedgeTet[6][2] = { {0,1},{0,2},{0,3},{1,2},{1,3},{2,3} }; // static const int nvfaceTet[4][3] = { {3,2,1},{0,2,3},{3,1,0},{0,1,2} }; // In GenericMesh.hpp: // Vertex& at(int i) {return *vertices[i];} // penso che vertices venga riempito nell'ordine dato dal file di mesh per ogni tetraedro // In GenericMesh.hpp: // Rd Edge(int i) const {ASSERTION(i>=0 && i (TypeOfFE_Edge1_3d::dfon,d,1, Element::ne*2*3*QFe.n+Element::nf*2*3*QFf.n, Element::ne*QFe.n+Element::nf*QFf.n, false,true) { assert(QFe.n); // a cosa serve? assert(QFf.n); R3 Pt[] = {R3(0.,0.,0.),R3(1.,0.,0.),R3(0.,1.,0.),R3(0.,0.,1.)}; // 4 ref tetrahedron vertices { // We build the interpolation pts on the edges of the reference tetrahedron: int i; i=0; for(int e=0; ePtInterpolation[i] = Pt[Element::nvedge[e][0]]*(1.-x)+Pt[Element::nvedge[e][1]]*(x); // rispetto all'originale ho scambiato x e 1-x ! ?? (forse non e' importante l'ordine perche' ho gruppo di pti di quadratura simmetrico ?) } // We build the interpolation pts on the faces of the reference tetrahedron: // (the index i mustn't be reinitialised!) for(int f=0; fPtInterpolation[i] = Pt[Element::nvface[f][0]]*(1.-x-y) + Pt[Element::nvface[f][1]]*x + Pt[Element::nvface[f][2]]*y; // penso che non sia importante l'ordine perche' i tre punti di quadratura sono simmetrici } } { // We build the indices in (13.1) : edge basis fncts int i=0, p=0; // i is the k in (13.1) (chapter 13 ff++doc) int e; // we will need e also below, in the part referred to faces for(e=0; e<(Element::ne)*2; e++) // loop on the 12 edge basis fcts { if (e%2==1) {p = p-QFe.n;} // if I consider an 'even' basis fct, the quad pts are the ones of the previous basis fnct (they correspond to the same edge) for(int q=0; qpInterpolation[i]=p; // pk in (13.1) this->cInterpolation[i]=c; // jk in (13.1) this->dofInterpolation[i]=e; // ik in (13.1) this->coefInterpolation[i]=0.; // alfak: we will fill them with 'set' (below) because they depend on the tetrahedron } } // We build the indices in (13.1) : face basis fncts // (the indices i and p mustn't be reinitialised) for(int f=0; f<(Element::nf)*2; f++) // loop on the 8 face basis fcts { if (f%2==1) {p = p-QFf.n;} // if I consider an 'even' basis fct, the quad pts are the ones of the previous basis fnct (they correspond to the same face) for(int q=0; qpInterpolation[i]=p; // pk in (13.1) this->cInterpolation[i]=c; // jk in (13.1) this->dofInterpolation[i]=e+f; // ik in (13.1) this->coefInterpolation[i]=0.; // alphak: we will fill them with 'set' (below) because they depend on the tetrahedron } } } // cout << " ++ TypeOfFE_Edge1_3d():"<< this->PtInterpolation << endl; // a cosa serve? } // For the coefficients of interpolation alphak in (13.1) (same 'for loops' as above) (vedi foglio) void TypeOfFE_Edge1_3d:: set(const Mesh & Th,const Element & K,InterpolationMatrix & M,int ocoef,int odf,int *nump) const { int i=ocoef, p=0; // Edge0_3d: parto da ocoef a riempire M perche' 'potrei avere un elemento finito dentro un altro elemento finito' (non capito) ??qui?? // Edge basis fncts: int e; // we will need e also below, in the part referred to faces for(e=0; e<(Element::ne)*2; e++) { int ee=e/2; R3 E=K.Edge(ee); // the edge local number is given by the integer division between e and 2 int eo = K.EdgeOrientation(ee); if(!eo) E=-E; if (e%2==1) {p = p-QFe.n;} // if I consider an 'even' basis fct, the quad pts are the ones of the previous basis fnct (they correspond to the same edge) for(int q=0; qfV[i1]) Exchange(i0,i1); if(fV[i1]>fV[i2]) { Exchange(i1,i2); if(fV[i0]>fV[i1]) Exchange(i0,i1); } // now local numbers in the tetrahedron: i0 = Element::nvface[ff][i0], i1 = Element::nvface[ff][i1], i2 = Element::nvface[ff][i2]; int ie0=i0, ie1 = iff==0? i1 : i2; // edge for the face dof (its endpoints local numbers) R3 E(K[ie0],K[ie1]); if (iff) {p = p-QFf.n;} // if I consider an 'even' basis fct, the quad pts are the ones of the previous basis fnct (they correspond to the same face) for(int q=0; q=20); // 20 degrees of freedom, why >= ?? assert(val.M()==3); // 3 components // ------------- // perm: the permutation for which the 4 tetrahedron vertices are listed with increasing GLOBAL number // (i.e. perm[0] is the local number of the vertex with the smallest global number, ... // perm[3] is the local number of the vertex with the biggest global number.) const Element::Vertex * tV[4] = {& K.at(0), & K.at(1), & K.at(2), & K.at(3)}; int k0=0, k1=1, k2=2, k3=3; if(tV[k0]>tV[k1]) Exchange(k0,k1); if(tV[k1]>tV[k2]) Exchange(k1,k2); if(tV[k2]>tV[k3]) Exchange(k2,k3); if(tV[k0]>tV[k1]) Exchange(k0,k1); if(tV[k1]>tV[k2]) Exchange(k1,k2); if(tV[k0]>tV[k1]) Exchange(k0,k1); int perm[4] = {k0,k1,k2,k3}; // ------------- // We build mynvface to be used here instead of the FreeFem nvface, // (in order to exploit the results of perm and write a better code), // in mynvface in all the triplets the numbers are increasing static const int mynvface[4][3] = { {1,2,3},{0,2,3},{0,1,3},{0,1,2} }; // ------------- // If [a,b] is the i-th edge (where a,b are its vertices local numbers), edgesMap[(a+1)*(b+1)] = i int edgesMap[13] = {-1,-1,0,1,2,-1,3,-1,4,-1,-1,-1,5}; // a map would be more slow // ------------- // the 4 barycentric coordinates for the reference tetrahedron evaluated at the point P // (they have the same value at the real tetrahedron's point corresponding to the reference tetrahedron's point P) R l[] = {1.-P.sum(),P.x,P.y,P.z}; R3 D[4]; K.Gradlambda(D); // (riempie un array di 4 R3) val = 0; // ----- int p20[20]; // the permutation from the dofs numbering of my tetrahedron (numbered using the GLOBAL vertex numbers) to the dofs numbering of FreeFem !!!!! for(int i=0; i<6; ++i) // edges { // see below int ii0 = Element::nvedge[i][0], ii1 = Element::nvedge[i][1]; int i0 = perm[ii0]; int i1 = perm[ii1]; int iEdge = edgesMap[(i0+1)*(i1+1)]; // i of the edge [i0,i1] p20[i*2] = iEdge*2; p20[i*2+1] = iEdge*2+1; } for(int j=0; j<4; ++j) // faces { // using perm the 1st examined face is the one opposite the vertex with the smallest GLOBAL number, and so on // (see below) int jFace = perm[j]; p20[12+j*2] = 12+jFace*2; p20[12+j*2+1] = 12+jFace*2+1; } // ----- if (whatd & Fop_D0) // Fop_D0 definito in FESpacen.hpp ma non capito bene il << { R3 X = K(P); //usato nella riga commentata più sotto // First, the functions omega (they don't constitute a dual basis! only a basis) R3 omega[20]; // 12 edge functions: for(int i=0; i<6; ++i) { int ii0 = Element::nvedge[i][0], ii1 = Element::nvedge[i][1]; int i0 = perm[ii0]; int i1 = perm[ii1]; // ! : // using perm, [i0,i1] is already from the smallest global number to the greatest global number, // since nvedge always gives indices which read perm from left to right //cout << i << " oriented edge (" << K.at(i0) << "->" << K.at(i1) << ")" << endl; omega[i*2] = l[i0]*(l[i0]*D[i1]-l[i1]*D[i0]); omega[i*2+1] = l[i1]*(l[i0]*D[i1]-l[i1]*D[i0]); } // 8 face functions: for(int j=0; j<4; ++j) { // In (my)nvface the face opposite the vertex k is (my)nvface[k][], // using perm the 1st examined face is the one opposite the vertex with the smallest GLOBAL number, and so on, // and, since in mynvface the numbers always increase, [i0,i1,i2] are already ordered with increasing global number int ii0 = mynvface[j][0]; int ii1 = mynvface[j][1]; int ii2 = mynvface[j][2]; int i0 = perm[ii0]; int i1 = perm[ii1]; int i2 = perm[ii2]; omega[12+j*2] = l[i2]*(l[i0]*D[i1]-l[i1]*D[i0]); omega[12+j*2+1] = l[i1]*(l[i0]*D[i2]-l[i2]*D[i0]); } // Now, the functions phi that really constitute a dual basis R3 phi[20]; phi[p20[0]] = +4*omega[0]-2*omega[1]-4*omega[16]+2*omega[17]-4*omega[18]+2*omega[19]; phi[p20[1]] = -2*omega[0]+4*omega[1]-2*omega[16]-2*omega[17]-2*omega[18]-2*omega[19]; phi[p20[2]] = +4*omega[2]-2*omega[3]-4*omega[14]+2*omega[15]+2*omega[18]-4*omega[19]; phi[p20[3]] = -2*omega[2]+4*omega[3]-2*omega[14]-2*omega[15]-2*omega[18]-2*omega[19]; phi[p20[4]] = +4*omega[4]-2*omega[5]+2*omega[14]-4*omega[15]+2*omega[16]-4*omega[17]; phi[p20[5]] = -2*omega[4]+4*omega[5]-2*omega[14]-2*omega[15]-2*omega[16]-2*omega[17]; phi[p20[6]] = +4*omega[6]-2*omega[7]-4*omega[12]+2*omega[13]+2*omega[18]-4*omega[19]; phi[p20[7]] = -2*omega[6]+4*omega[7]-2*omega[12]-2*omega[13]+4*omega[18]-2*omega[19]; phi[p20[8]] = +4*omega[8]-2*omega[9]+2*omega[12]-4*omega[13]+2*omega[16]-4*omega[17]; phi[p20[9]] = -2*omega[8]+4*omega[9]-2*omega[12]-2*omega[13]+4*omega[16]-2*omega[17]; phi[p20[10]] = +4*omega[10]-2*omega[11]+2*omega[12]-4*omega[13]+2*omega[14]-4*omega[15]; phi[p20[11]] = -2*omega[10]+4*omega[11]+4*omega[12]-2*omega[13]+4*omega[14]-2*omega[15]; phi[p20[12]] = +8*omega[12]-4*omega[13]; phi[p20[13]] = -4*omega[12]+8*omega[13]; phi[p20[14]] = +8*omega[14]-4*omega[15]; phi[p20[15]] = -4*omega[14]+8*omega[15]; phi[p20[16]] = +8*omega[16]-4*omega[17]; phi[p20[17]] = -4*omega[16]+8*omega[17]; phi[p20[18]] = +8*omega[18]-4*omega[19]; phi[p20[19]] = -4*omega[18]+8*omega[19]; for(int k=0; k<20; ++k) { val(k,0,op_id) = phi[k].x; val(k,1,op_id) = phi[k].y; val(k,2,op_id) = phi[k].z; } } if (whatd & Fop_D1) // Derivatives wrt x,y,z { R3 omegadx[20]; R3 omegady[20]; R3 omegadz[20]; // 12 edge functions: for(int i=0; i<6; ++i) { int ii0 = Element::nvedge[i][0], ii1 = Element::nvedge[i][1]; int i0 = perm[ii0]; int i1 = perm[ii1]; // using perm, [i0,i1] is already from the smallest global number to the greatest global number, // since nvedge always gives indices which read perm from left to right if (whatd & Fop_dx) { omegadx[i*2] = D[i0].x*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i0]*(D[i0].x*D[i1]-D[i1].x*D[i0]); omegadx[i*2+1] = D[i1].x*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i1]*(D[i0].x*D[i1]-D[i1].x*D[i0]); } if (whatd & Fop_dy) { omegady[i*2] = D[i0].y*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i0]*(D[i0].y*D[i1]-D[i1].y*D[i0]); omegady[i*2+1] = D[i1].y*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i1]*(D[i0].y*D[i1]-D[i1].y*D[i0]); } if (whatd & Fop_dz) { omegadz[i*2] = D[i0].z*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i0]*(D[i0].z*D[i1]-D[i1].z*D[i0]); omegadz[i*2+1] = D[i1].z*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i1]*(D[i0].z*D[i1]-D[i1].z*D[i0]); } } // 8 face functions: for(int j=0; j<4; ++j) { // In (my)nvface the face opposite the vertex k is (my)nvface[k][], // using perm the 1st examined face is the one opposite the vertex with the smallest GLOBAL number, and so on, // and, since in mynvface the numbers always increase, [i0,i1,i2] are already ordered with increasing global number int ii0 = mynvface[j][0]; int ii1 = mynvface[j][1]; int ii2 = mynvface[j][2]; int i0 = perm[ii0]; int i1 = perm[ii1]; int i2 = perm[ii2]; if (whatd & Fop_dx) { omegadx[12+j*2] = D[i2].x*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i2]*(D[i0].x*D[i1]-D[i1].x*D[i0]); omegadx[12+j*2+1] = D[i1].x*(l[i0]*D[i2]-l[i2]*D[i0]) + l[i1]*(D[i0].x*D[i2]-D[i2].x*D[i0]); } if (whatd & Fop_dy) { omegady[12+j*2] = D[i2].y*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i2]*(D[i0].y*D[i1]-D[i1].y*D[i0]); omegady[12+j*2+1] = D[i1].y*(l[i0]*D[i2]-l[i2]*D[i0]) + l[i1]*(D[i0].y*D[i2]-D[i2].y*D[i0]); } if (whatd & Fop_dz) { omegadz[12+j*2] = D[i2].z*(l[i0]*D[i1]-l[i1]*D[i0]) + l[i2]*(D[i0].z*D[i1]-D[i1].z*D[i0]); omegadz[12+j*2+1] = D[i1].z*(l[i0]*D[i2]-l[i2]*D[i0]) + l[i1]*(D[i0].z*D[i2]-D[i2].z*D[i0]); } } // Now, the functions phi that really constitute a dual basis R3 phidx[20]; if (whatd & Fop_dx) { phidx[p20[0]] = +4*omegadx[0]-2*omegadx[1]-4*omegadx[16]+2*omegadx[17]-4*omegadx[18]+2*omegadx[19]; phidx[p20[1]] = -2*omegadx[0]+4*omegadx[1]-2*omegadx[16]-2*omegadx[17]-2*omegadx[18]-2*omegadx[19]; phidx[p20[2]] = +4*omegadx[2]-2*omegadx[3]-4*omegadx[14]+2*omegadx[15]+2*omegadx[18]-4*omegadx[19]; phidx[p20[3]] = -2*omegadx[2]+4*omegadx[3]-2*omegadx[14]-2*omegadx[15]-2*omegadx[18]-2*omegadx[19]; phidx[p20[4]] = +4*omegadx[4]-2*omegadx[5]+2*omegadx[14]-4*omegadx[15]+2*omegadx[16]-4*omegadx[17]; phidx[p20[5]] = -2*omegadx[4]+4*omegadx[5]-2*omegadx[14]-2*omegadx[15]-2*omegadx[16]-2*omegadx[17]; phidx[p20[6]] = +4*omegadx[6]-2*omegadx[7]-4*omegadx[12]+2*omegadx[13]+2*omegadx[18]-4*omegadx[19]; phidx[p20[7]] = -2*omegadx[6]+4*omegadx[7]-2*omegadx[12]-2*omegadx[13]+4*omegadx[18]-2*omegadx[19]; phidx[p20[8]] = +4*omegadx[8]-2*omegadx[9]+2*omegadx[12]-4*omegadx[13]+2*omegadx[16]-4*omegadx[17]; phidx[p20[9]] = -2*omegadx[8]+4*omegadx[9]-2*omegadx[12]-2*omegadx[13]+4*omegadx[16]-2*omegadx[17]; phidx[p20[10]] = +4*omegadx[10]-2*omegadx[11]+2*omegadx[12]-4*omegadx[13]+2*omegadx[14]-4*omegadx[15]; phidx[p20[11]] = -2*omegadx[10]+4*omegadx[11]+4*omegadx[12]-2*omegadx[13]+4*omegadx[14]-2*omegadx[15]; phidx[p20[12]] = +8*omegadx[12]-4*omegadx[13]; phidx[p20[13]] = -4*omegadx[12]+8*omegadx[13]; phidx[p20[14]] = +8*omegadx[14]-4*omegadx[15]; phidx[p20[15]] = -4*omegadx[14]+8*omegadx[15]; phidx[p20[16]] = +8*omegadx[16]-4*omegadx[17]; phidx[p20[17]] = -4*omegadx[16]+8*omegadx[17]; phidx[p20[18]] = +8*omegadx[18]-4*omegadx[19]; phidx[p20[19]] = -4*omegadx[18]+8*omegadx[19]; for(int k=0; k<20; ++k) { val(k,0,op_dx) = phidx[k].x; val(k,1,op_dx) = phidx[k].y; val(k,2,op_dx) = phidx[k].z; } } R3 phidy[20]; if (whatd & Fop_dy) { phidy[p20[0]] = +4*omegady[0]-2*omegady[1]-4*omegady[16]+2*omegady[17]-4*omegady[18]+2*omegady[19]; phidy[p20[1]] = -2*omegady[0]+4*omegady[1]-2*omegady[16]-2*omegady[17]-2*omegady[18]-2*omegady[19]; phidy[p20[2]] = +4*omegady[2]-2*omegady[3]-4*omegady[14]+2*omegady[15]+2*omegady[18]-4*omegady[19]; phidy[p20[3]] = -2*omegady[2]+4*omegady[3]-2*omegady[14]-2*omegady[15]-2*omegady[18]-2*omegady[19]; phidy[p20[4]] = +4*omegady[4]-2*omegady[5]+2*omegady[14]-4*omegady[15]+2*omegady[16]-4*omegady[17]; phidy[p20[5]] = -2*omegady[4]+4*omegady[5]-2*omegady[14]-2*omegady[15]-2*omegady[16]-2*omegady[17]; phidy[p20[6]] = +4*omegady[6]-2*omegady[7]-4*omegady[12]+2*omegady[13]+2*omegady[18]-4*omegady[19]; phidy[p20[7]] = -2*omegady[6]+4*omegady[7]-2*omegady[12]-2*omegady[13]+4*omegady[18]-2*omegady[19]; phidy[p20[8]] = +4*omegady[8]-2*omegady[9]+2*omegady[12]-4*omegady[13]+2*omegady[16]-4*omegady[17]; phidy[p20[9]] = -2*omegady[8]+4*omegady[9]-2*omegady[12]-2*omegady[13]+4*omegady[16]-2*omegady[17]; phidy[p20[10]] = +4*omegady[10]-2*omegady[11]+2*omegady[12]-4*omegady[13]+2*omegady[14]-4*omegady[15]; phidy[p20[11]] = -2*omegady[10]+4*omegady[11]+4*omegady[12]-2*omegady[13]+4*omegady[14]-2*omegady[15]; phidy[p20[12]] = +8*omegady[12]-4*omegady[13]; phidy[p20[13]] = -4*omegady[12]+8*omegady[13]; phidy[p20[14]] = +8*omegady[14]-4*omegady[15]; phidy[p20[15]] = -4*omegady[14]+8*omegady[15]; phidy[p20[16]] = +8*omegady[16]-4*omegady[17]; phidy[p20[17]] = -4*omegady[16]+8*omegady[17]; phidy[p20[18]] = +8*omegady[18]-4*omegady[19]; phidy[p20[19]] = -4*omegady[18]+8*omegady[19]; for(int k=0; k<20; ++k) { val(k,0,op_dy) = phidy[k].x; val(k,1,op_dy) = phidy[k].y; val(k,2,op_dy) = phidy[k].z; } } R3 phidz[20]; if (whatd & Fop_dz) { phidz[p20[0]] = +4*omegadz[0]-2*omegadz[1]-4*omegadz[16]+2*omegadz[17]-4*omegadz[18]+2*omegadz[19]; phidz[p20[1]] = -2*omegadz[0]+4*omegadz[1]-2*omegadz[16]-2*omegadz[17]-2*omegadz[18]-2*omegadz[19]; phidz[p20[2]] = +4*omegadz[2]-2*omegadz[3]-4*omegadz[14]+2*omegadz[15]+2*omegadz[18]-4*omegadz[19]; phidz[p20[3]] = -2*omegadz[2]+4*omegadz[3]-2*omegadz[14]-2*omegadz[15]-2*omegadz[18]-2*omegadz[19]; phidz[p20[4]] = +4*omegadz[4]-2*omegadz[5]+2*omegadz[14]-4*omegadz[15]+2*omegadz[16]-4*omegadz[17]; phidz[p20[5]] = -2*omegadz[4]+4*omegadz[5]-2*omegadz[14]-2*omegadz[15]-2*omegadz[16]-2*omegadz[17]; phidz[p20[6]] = +4*omegadz[6]-2*omegadz[7]-4*omegadz[12]+2*omegadz[13]+2*omegadz[18]-4*omegadz[19]; phidz[p20[7]] = -2*omegadz[6]+4*omegadz[7]-2*omegadz[12]-2*omegadz[13]+4*omegadz[18]-2*omegadz[19]; phidz[p20[8]] = +4*omegadz[8]-2*omegadz[9]+2*omegadz[12]-4*omegadz[13]+2*omegadz[16]-4*omegadz[17]; phidz[p20[9]] = -2*omegadz[8]+4*omegadz[9]-2*omegadz[12]-2*omegadz[13]+4*omegadz[16]-2*omegadz[17]; phidz[p20[10]] = +4*omegadz[10]-2*omegadz[11]+2*omegadz[12]-4*omegadz[13]+2*omegadz[14]-4*omegadz[15]; phidz[p20[11]] = -2*omegadz[10]+4*omegadz[11]+4*omegadz[12]-2*omegadz[13]+4*omegadz[14]-2*omegadz[15]; phidz[p20[12]] = +8*omegadz[12]-4*omegadz[13]; phidz[p20[13]] = -4*omegadz[12]+8*omegadz[13]; phidz[p20[14]] = +8*omegadz[14]-4*omegadz[15]; phidz[p20[15]] = -4*omegadz[14]+8*omegadz[15]; phidz[p20[16]] = +8*omegadz[16]-4*omegadz[17]; phidz[p20[17]] = -4*omegadz[16]+8*omegadz[17]; phidz[p20[18]] = +8*omegadz[18]-4*omegadz[19]; phidz[p20[19]] = -4*omegadz[18]+8*omegadz[19]; for(int k=0; k<20; ++k) { val(k,0,op_dz) = phidz[k].x; val(k,1,op_dz) = phidz[k].y; val(k,2,op_dz) = phidz[k].z; } } } } static TypeOfFE_Edge1_3d Edge1_3d; // TypeOfFE_Edge1_3d e' il nome della classe appena definita GTypeOfFE & GEdge13d(Edge1_3d); // GTypeOfFE e' la classe madre static AddNewFE3 TypeOfFE_Edge1_3d("Edge13d",&GEdge13d); // Edge13d sara' il nome usato dall'utente // // Come in BernardiRaugel.cpp (MA se scrivo in terminale ff-c++ P012_3d_Modif.cpp, ERRORE compilazione) // // ---- cooking to add the finite elemet to freefem table -------- // // a static variable to def the finite element // static TypeOfFE_Edge1_3d Edge1_3d; // // now adding FE in FreeFEm++ table // static AddNewFE Edge13d("Edge13d",&Edge1_3d); // // --- end cooking // // Come a pag 345 docu (MA se scrivo in terminale ff-c++ P012_3d_Modif.cpp, ERRORI compilazione) // static TypeOfFE_Edge1_3d Edge1_3d; // static AddNewFE("Edge13d", Edge1_3d); // static AddNewFE("Edge13d",&GEdge13d); class TypeOfFE_RT1_3d : public GTypeOfFE { public: typedef Mesh3 Mesh; typedef Mesh3::Element Element; typedef GFElement FElement; static int dfon[]; static const int d=Mesh::Rd::d; static const GQuadratureFormular & QFt; // quadrature formula on an tet static const GQuadratureFormular QFf; // quadrature formule on a face TypeOfFE_RT1_3d(); // constructor void FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd & P,RNMK_ & val) const; // void set(const Mesh & Th,const Element & K,InterpolationMatrix & M,int ocoef,int odf,int *nump) const; }; int TypeOfFE_RT1_3d:: dfon[] = {0,0,3,3}; // 2 dofs on each edge, 2 dofs on each face // Quadrature formula on an edge, exact for degree 3 (ok: int_e (deg2*t *lambda)) const GQuadratureFormular & TypeOfFE_RT1_3d:: QFt( QuadratureFormular_Tet_1); const GQuadratureFormular TypeOfFE_RT1_3d:: QFf(2,3,P_QuadratureFormular_T_2_intp); TypeOfFE_RT1_3d:: TypeOfFE_RT1_3d(): GTypeOfFE(TypeOfFE_Edge1_3d::dfon,d,1,Element::nf*QFf.n+QFt.n, Element::nf*QFf.n, false,true) { ffassert(0); } void TypeOfFE_RT1_3d:: FB(const What_d whatd,const Mesh & Th,const Mesh3::Element & K,const Rd &P,RNMK_ & val) const { ffassert(0); } } // chiude namespace Fem2D { // --- fin -- freefem++-3.38-1/examples++-load/Element_P1dc1.cpp000644 000767 000024 00000027260 11625711166 021527 0ustar00hechtstaff000000 000000 #include "ff++.hpp" #include "AddNewFE.h" // Attention probleme de numerotation des inconnues // ------------------------------------------------- // dans freefem, il y a un noeud par objets sommet, arete, element. // et donc la numerotation des dl dans l'element depend // de l'orientation des aretes // /// --------------------------------------------------------------- namespace Fem2D { // ------------------- // ttdc1_ finite element fully discontinue. // ------------------- class TypeOfFE_P1ttdc1_ : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; static const R2 G; static const R cshrink; static const R cshrink1; // (1 -1/3)* static R2 Shrink(const R2& P){ return (P-G)*cshrink+G;} static R2 Shrink1(const R2& P){ return (P-G)*cshrink1+G;} TypeOfFE_P1ttdc1_(): TypeOfFE(0,0,3,1,Data,1,1,3,3,Pi_h_coef) { const R2 Pt[] = { Shrink(R2(0,0)), Shrink(R2(1,0)), Shrink(R2(0,1)) }; for (int i=0;i & u,int componante,int op) const ; } ; const R2 TypeOfFE_P1ttdc1_::G(1./3.,1./3.); const R TypeOfFE_P1ttdc1_::cshrink=1; const R TypeOfFE_P1ttdc1_::cshrink1=1./TypeOfFE_P1ttdc1_::cshrink; class TypeOfFE_P2ttdc1_ : public TypeOfFE { public: static int Data[]; static double Pi_h_coef[]; static const R2 G; static const R cshrink; static const R cshrink1; static R2 Shrink(const R2& P){ return (P-G)*cshrink+G;} static R2 Shrink1(const R2& P){ return (P-G)*cshrink1+G;} TypeOfFE_P2ttdc1_(): TypeOfFE(0,0,6,1,Data,3,1,6,6,Pi_h_coef) { const R2 Pt[] = { Shrink(R2(0,0)), Shrink(R2(1,0)), Shrink(R2(0,1)), Shrink(R2(0.5,0.5)),Shrink(R2(0,0.5)),Shrink(R2(0.5,0)) }; for (int i=0;i & u,int componante,int op) const { R2 PHat=Shrink1(P1Hat); R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))); R r=0; if (op==0) { R l0=1-PHat.x-PHat.y,l1=PHat.x,l2=PHat.y; r = u0*l0+u1*l1+l2*u2; } else { const Triangle & T=K.T; R2 D0 = T.H(0)*cshrink1 , D1 = T.H(1)*cshrink1 , D2 = T.H(2)*cshrink1 ; if (op==1) r = D0.x*u0 + D1.x*u1 + D2.x*u2 ; else r = D0.y*u0 + D1.y*u1 + D2.y*u2 ; } // cout << r << "\t"; return r; } void TypeOfFE_P1ttdc1_::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P1,RNMK_ & val) const { R2 P=Shrink1(P1); // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; if (val.N() <3) throwassert(val.N() >=3); throwassert(val.M()==1 ); // throwassert(val.K()==3 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd[op_id]) { f0[0] = l0; f0[1] = l1; f0[2] = l2;} if (whatd[op_dx] || whatd[op_dy]) { R2 Dl0(K.H(0)*cshrink1), Dl1(K.H(1)*cshrink1), Dl2(K.H(2)*cshrink1); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x; f0x[1] = Dl1.x; f0x[2] = Dl2.x; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y; f0y[1] = Dl1.y; f0y[2] = Dl2.y; } } } void TypeOfFE_P2ttdc1_::FB(const bool *whatd,const Mesh & ,const Triangle & K,const R2 & P1,RNMK_ & val) const { R2 P=Shrink1(P1); // const Triangle & K(FE.T); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R l4_0=(4*l0-1),l4_1=(4*l1-1),l4_2=(4*l2-1); // throwassert(FE.N == 1); throwassert( val.N()>=6); throwassert(val.M()==1); // throwassert(val.K()==3 ); val=0; // -- if (whatd[op_id]) { RN_ f0(val('.',0,op_id)); f0[0] = l0*(2*l0-1); f0[1] = l1*(2*l1-1); f0[2] = l2*(2*l2-1); f0[3] = 4*l1*l2; // oppose au sommet 0 f0[4] = 4*l0*l2; // oppose au sommet 1 f0[5] = 4*l1*l0; // oppose au sommet 3 } if( whatd[op_dx] || whatd[op_dy] || whatd[op_dxx] || whatd[op_dyy] || whatd[op_dxy]) { R2 Dl0(K.H(0)*cshrink1), Dl1(K.H(1)*cshrink1), Dl2(K.H(2)*cshrink1); if (whatd[op_dx]) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl0.x*l4_0; f0x[1] = Dl1.x*l4_1; f0x[2] = Dl2.x*l4_2; f0x[3] = 4*(Dl1.x*l2 + Dl2.x*l1) ; f0x[4] = 4*(Dl2.x*l0 + Dl0.x*l2) ; f0x[5] = 4*(Dl0.x*l1 + Dl1.x*l0) ; } if (whatd[op_dy]) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl0.y*l4_0; f0y[1] = Dl1.y*l4_1; f0y[2] = Dl2.y*l4_2; f0y[3] = 4*(Dl1.y*l2 + Dl2.y*l1) ; f0y[4] = 4*(Dl2.y*l0 + Dl0.y*l2) ; f0y[5] = 4*(Dl0.y*l1 + Dl1.y*l0) ; } if (whatd[op_dxx]) { RN_ fxx(val('.',0,op_dxx)); fxx[0] = 4*Dl0.x*Dl0.x; fxx[1] = 4*Dl1.x*Dl1.x; fxx[2] = 4*Dl2.x*Dl2.x; fxx[3] = 8*Dl1.x*Dl2.x; fxx[4] = 8*Dl0.x*Dl2.x; fxx[5] = 8*Dl0.x*Dl1.x; } if (whatd[op_dyy]) { RN_ fyy(val('.',0,op_dyy)); fyy[0] = 4*Dl0.y*Dl0.y; fyy[1] = 4*Dl1.y*Dl1.y; fyy[2] = 4*Dl2.y*Dl2.y; fyy[3] = 8*Dl1.y*Dl2.y; fyy[4] = 8*Dl0.y*Dl2.y; fyy[5] = 8*Dl0.y*Dl1.y; } if (whatd[op_dxy]) { assert(val.K()>op_dxy); RN_ fxy(val('.',0,op_dxy)); fxy[0] = 4*Dl0.x*Dl0.y; fxy[1] = 4*Dl1.x*Dl1.y; fxy[2] = 4*Dl2.x*Dl2.y; fxy[3] = 4*(Dl1.x*Dl2.y + Dl1.y*Dl2.x); fxy[4] = 4*(Dl0.x*Dl2.y + Dl0.y*Dl2.x); fxy[5] = 4*(Dl0.x*Dl1.y + Dl0.y*Dl1.x); } } } // // end ttdc1_ // ------------------ static void SetPtPkDC(R3 *Pt,int kk,int nn,R cc=1 ) { // P0 P1 et P2 , P1b const int d=3 ; int n=0; double dK= kk; double cc1= 1-cc;// const R3 G=R3::diag(1./(d+1)); // barycenter for(int i=0;i<= kk; ++i) for(int j=0;j<= kk-i; ++j) for(int k=0;k<= kk-i-j; ++k) { int l = kk -i-j-k; ffassert(l>=0 && l <= kk); Pt[n++] = R3(k/dK,j/dK,i/dK)*cc + G*cc1 ; } ffassert(n==nn); if(verbosity>9) cout << " Pkdc = " << KN_(Pt,nn)<<"\n"; } class TypeOfFE_LagrangeDC3d: public GTypeOfFE { //typedef typename MMesh Mesh; public: typedef Mesh3 Mesh; typedef Mesh::Element Element; typedef Element::Rd Rd; typedef Element::RdHat RdHat; static const int d=Rd::d; const R cshrink; const R cshrink1; static const Rd G; // (1 -1/3)* Rd Shrink(const Rd& P) const { return (P-G)*cshrink+G;} Rd Shrink1(const Rd& P) const { return (P-G)*cshrink1+G;} const int k; struct A4 { int dfon[4]; A4(int k) { // (k+3)(k+2)(k+1) / 6 // d== 3 int ndf = (d== 3) ? ((k+3)*(k+2)*(k+1) / 6) : ((d== 2) ? ((k+2)*(k+1) / 2) : k+1 ); dfon[0]=dfon[1]=dfon[2]=dfon[3]=0; dfon[d]=ndf; if(verbosity>9) cout << "A4 "<< k<< " " <(A4(kk),1,Max(kk,1),true,true),cshrink(cc),cshrink1(1./cc),k(kk) { int n=this->NbDoF; if(verbosity>9) cout << "\n +++ Pdc"<PtInterpolation,k,this->NbDoF,cc); if(verbosity>9) cout << this->PtInterpolation<< endl; { for (int i=0;ipInterpolation[i]=i; this->cInterpolation[i]=0; this->dofInterpolation[i]=i; this->coefInterpolation[i]=1.; } } /* inv de a M1 + b Id = a1 M1 + b1 Id ( M1 : mat / m_ij =1 ) M*M = (d+1) M => b1 = 1/b a1 = -b / ((d+1)a+1) */ } ~TypeOfFE_LagrangeDC3d(){ } //cout << "TypeOfFE_LagrangeDC3d"<< this->NbDoF< & u,int componante,int op) const ; private: TypeOfFE_LagrangeDC3d( const TypeOfFE_LagrangeDC3d &) ; void operator=( const TypeOfFE_LagrangeDC3d &) ; }; void TypeOfFE_LagrangeDC3d::FB(const What_d whatd,const Mesh & Th,const Element & K,const Rd &P1, RNMK_ & val) const { // const Triangle & K(FE.T); R3 P=this->Shrink1(P1); R l[]={1.-P.sum(),P.x,P.y,P.z}; assert(val.N() >=Element::nv); assert(val.M()==1 ); val=0; RN_ f0(val('.',0,op_id)); if (whatd & Fop_D0) { f0[0] = l[0]; f0[1] = l[1]; f0[2] = l[2]; f0[3] = l[3]; } if (whatd & Fop_D1) { R3 Dl[4]; K.Gradlambda(Dl); for(int i=0;i<4;++i) Dl[i] *= cshrink1; //for(int i=0;i<4;++i) // cout << Dl[i] << endl; if (whatd & Fop_dx) { RN_ f0x(val('.',0,op_dx)); f0x[0] = Dl[0].x; f0x[1] = Dl[1].x; f0x[2] = Dl[2].x; f0x[3] = Dl[3].x; } if (whatd & Fop_dy) { RN_ f0y(val('.',0,op_dy)); f0y[0] = Dl[0].y; f0y[1] = Dl[1].y; f0y[2] = Dl[2].y; f0y[3] = Dl[3].y; } if (whatd & Fop_dz) { RN_ f0z(val('.',0,op_dz)); f0z[0] = Dl[0].z; f0z[1] = Dl[1].z; f0z[2] = Dl[2].z; f0z[3] = Dl[3].z; } } // cout << val << endl; } R TypeOfFE_LagrangeDC3d::operator()(const FElement & K,const R3 & PHat1,const KN_ & u,int componante,int op) const { R3 PHat=Shrink1(PHat1); R r=0; if(k==1) { R u0(u(K(0))), u1(u(K(1))), u2(u(K(2))),u3(u(K(3))); if (op==0) { R l[4]; PHat.toBary(l); r = u0*l[0]+u1*l[1]+l[2]*u2+l[3]*u3; } else if(op==op_dx || op==op_dy || op==op_dz) { const Element & T=K.T; R3 D[4]; T.Gradlambda(D); for(int i=0;i<4;++i) D[i] *= cshrink1; if (op==op_dx) r = D[0].x*u0 + D[1].x*u1 + D[2].x*u2+ D[3].x*u3 ; else if (op==op_dy) r = D[0].y*u0 + D[1].y*u1 + D[2].y*u2+ D[3].y*u3 ; else r = D[0].z*u0 + D[1].z*u1 + D[2].z*u2+ D[3].z*u3 ; } } else ffassert(0); // to do .. return r; } const R3 TypeOfFE_LagrangeDC3d::G(1./4.,1./4.,1./4.); // link with FreeFem++ static TypeOfFE_P1ttdc1_ P1dc1LagrangeP1dc1; static TypeOfFE_P2ttdc1_ P2dc1LagrangeP2dc1; static TypeOfFE_LagrangeDC3d TypeOfFE_LagrangeDC3dtt(1,0.999); // a static variable to add the finite element to freefem++ static AddNewFE P1dcLagrange("P1dc1",&P1dc1LagrangeP1dc1); static AddNewFE P2dcLagrange("P2dc1",&P2dc1LagrangeP2dc1); static AddNewFE3 P1dttLagrange3d("P1dc3d",&TypeOfFE_LagrangeDC3dtt,"P1dc"); } // FEM2d namespace // --- fin -- freefem++-3.38-1/examples++-load/Element_P3.cpp000644 000767 000024 00000012632 11746441270 021136 0ustar00hechtstaff000000 000000 #include "ff++.hpp" #include "AddNewFE.h" // Attention probleme de numerotation des inconnues // ------------------------------------------------- // dans freefem, il y a un noeud par objets sommet, arete, element. // et donc la numerotation des dl dans l'element depend // de l'orientation des aretes // /// --------------------------------------------------------------- namespace Fem2D { // ------ P3 Hierarchical (just remove P1 node of the P2 finite element) -------- class TypeOfFE_P3Lagrange : public TypeOfFE { public: static const int k=3; static const int ndf = (k+2)*(k+1)/2; static int Data[]; static double Pi_h_coef[]; static const int nn[10][3] ; static const int aa[10][3] ; static const int ff[10]; static const int il[10]; static const int jl[10]; static const int kl[10]; TypeOfFE_P3Lagrange(): TypeOfFE(3+2*3+1,1,Data,4,1,16,10,0) { static const R2 Pt[10] = { R2( 0/3. , 0/3. ) , R2( 3/3. , 0/3. ) , R2( 0/3. , 3/3. ) , R2( 2/3. , 1/3. ) , R2( 1/3. , 2/3. ) , R2( 0/3. , 2/3. ) , R2( 0/3. , 1/3. ) , R2( 1/3. , 0/3. ) , R2( 2/3. , 0/3. ) , R2( 1/3. , 1/3. ) } ; // 3,4,5,6,7,8 int other[10]= { -1, -1,-1,4,3,6,5,8,7,-1 }; int kk=0; for (int i=0;i=0) pij_alpha[kk++]= IPJ(i,other[i],0); P_Pi_h[i]=Pt[i]; } assert(P_Pi_h.N()==NbDoF); assert(pij_alpha.N()==kk); } void FB(const bool * whatd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const { for (int i=0;i<16;++i) v[i]=1; int e0=K.EdgeOrientation(0); int e1=K.EdgeOrientation(1); int e2=K.EdgeOrientation(2); int ooo[6]={e0,e0,e1,e1,e2,e2}; int iii[6]; int jjj[6]; for(int i=0;i<6;++i) { iii[i]= 3+2*i; // si orient = 1 jjj[i]= 4+2*i; // si orient = -1 } for(int i=0;i<6;++i) if(ooo[i]==1) v[jjj[i]]=0; else v[iii[i]]=0; } } ; // on what nu df on node node of df int TypeOfFE_P3Lagrange::Data[]={ 0,1,2,3,3,4,4,5,5,6, // the support number of the node of the df 0,0,0,0,1,0,1,0,1,0, // the number of the df on the node 0,1,2,3,3,4,4,5,5,6, // the node of the df 0,0,0,0,0,0,0,0,0,0, // the df come from which FE (generaly 0) 0,1,2,3,4,5,6,7,8,9, // which are de df on sub FE 0, // for each compontant $j=0,N-1$ it give the sub FE associated 0,10 }; double TypeOfFE_P3Lagrange::Pi_h_coef[]={1.,1.,1.,1.,1.,1.,1.,1.,1.,1.}; void TypeOfFE_P3Lagrange::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R L[3]={l0*k,l1*k,l2*k}; throwassert( val.N()>=10); throwassert(val.M()==1); // Attention il faut renumeroter les fonction de bases // car dans freefem++, il y a un node par sommet, arete or element // et la numerotation naturelle mais 2 noud pas arete // donc p est la perumation // echange de numerotation si les arete sont dans le mauvais sens int p[10]; for(int i=0;i<10;++i) p[i]=i; if(K.EdgeOrientation(0) <0) Exchange(p[3],p[4]);// 3,4 if(K.EdgeOrientation(1) <0) Exchange(p[5],p[6]);// 5,6 if(K.EdgeOrientation(2) <0) Exchange(p[7],p[8]);// 7,8 //cout << KN_(p,10) < & v) const { for (int i=0;i<10;++i) v[i]=1; int e0=K.EdgeOrientation(0); int e1=K.EdgeOrientation(1); int e2=K.EdgeOrientation(2); int ooo[6]={e0,e0,e1,e1,e2,e2}; int iii[6]; int jjj[6]; for(int i=0;i<6;++i) { iii[i]= 3+2*i; // si orient = 1 jjj[i]= 4+2*i; // si orient = -1 } for(int i=0;i<6;++i) if(ooo[i]==1) v[jjj[i]]=0; else v[iii[i]]=0; }*/ } ; const R2 TypeOfFE_P3dcLagrange::G(1./3.,1./3.); const R TypeOfFE_P3dcLagrange::cshrink=1-1e-2; const R TypeOfFE_P3dcLagrange::cshrink1=1./TypeOfFE_P3dcLagrange::cshrink; // on what nu df on node node of df int TypeOfFE_P3dcLagrange::Data[]={ 6,6,6, 6,6, 6,6, 6,6, 6, // the support number of the node of the df 0,1,2,3,4,5,6,7,8,9, // the number of the df on the node 0,0,0,0,0,0,0,0,0,0, // the node of the df 0,0,0,0,0,0,0,0,0,0, // the df come from which FE (generaly 0) 0,1,2,3,4,5,6,7,8,9, // which are de df on sub FE 0, // for each compontant $j=0,N-1$ it give the sub FE associated 0, 10 }; double TypeOfFE_P3dcLagrange::Pi_h_coef[]={1.,1.,1.,1.,1.,1.,1.,1.,1.,1.}; void TypeOfFE_P3dcLagrange::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P1,RNMK_ & val) const { R2 P=Shrink1(P1); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R L[3]={l0*k,l1*k,l2*k}; throwassert( val.N()>=10); throwassert(val.M()==1); // Attention il faut renumeroter les fonction de bases // car dans freefem++, il y a un node par sommet, arete or element // et la numerotation naturelle mais 2 noud pas arete // donc p est la perumation // echange de numerotation si les arete sont dans le mauvais sens int p[10]; for(int i=0;i<10;++i) p[i]=i; /* if(K.EdgeOrientation(0) <0) Exchange(p[3],p[4]);// 3,4 if(K.EdgeOrientation(1) <0) Exchange(p[5],p[6]);// 5,6 if(K.EdgeOrientation(2) <0) Exchange(p[7],p[8]);// 7,8 */ //cout << KN_(p,10) < & v) const { for (int i=0;i<15+6;++i) v[i]=1; int e0=K.EdgeOrientation(0); int e1=K.EdgeOrientation(1); int e2=K.EdgeOrientation(2); int ooo[6]={e0,e0,e1,e1,e2,e2}; /* 3,4 5, 6,7 8,9, 10, 11,12, 13,14, 15 16,17 */ int iii[6]={3,6,8,11,13,16}; int jjj[6]; for(int i=0;i<6;++i) { jjj[i]= iii[i]+1; // si orient = -1 } for(int i=0;i<6;++i) if(ooo[i]==1) v[jjj[i]]=0; else v[iii[i]]=0; } } ; // on what nu df on node node of df int TypeOfFE_P4Lagrange::Data[]={ 0,1,2,3,3,3,4,4,4,5,5,5,6,6,6, // the support number of the node of the df 0,0,0,0,1,2,0,1,2,0,1,2,0,1,2, // the number of the df on the node 0,1,2,3,3,3,4,4,4,5,5,5,6,6,6, // the node of the df 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // the df come from which FE (generaly 0) 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, // which are de df on sub FE 0, // for each compontant $j=0,N-1$ it give the sub FE associated 0,15 }; void TypeOfFE_P4Lagrange::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { R2 A(K[0]), B(K[1]),C(K[2]); R l0=1.-P.x-P.y,l1=P.x,l2=P.y; R L[3]={l0*k,l1*k,l2*k}; throwassert( val.N()>=10); throwassert(val.M()==1); // Attention il faut renumeroter les fonction de bases // car dans freefem++, il y a un node par sommet, arete or element // et la numerotation naturelle mais 2 noud pas arete // donc p est la perumation // echange de numerotation si les arete sont dans le mauvais sens int p[15]; for(int i=0;i<15;++i) p[i]=i; if(K.EdgeOrientation(0) <0) Exchange(p[3],p[5]);// 3,4 if(K.EdgeOrientation(1) <0) Exchange(p[6],p[8]);// 5,6 if(K.EdgeOrientation(2) <0) Exchange(p[9],p[11]);// 7,8 //cout << KN_(p,10) < & v) const { for (int i=0;i<15+6;++i) v[i]=1; int e0=K.EdgeOrientation(0); int e1=K.EdgeOrientation(1); int e2=K.EdgeOrientation(2); int ooo[6]={e0,e0,e1,e1,e2,e2}; int iii[6]={3,6,8,11,13,16}; int jjj[6]; for(int i=0;i<6;++i) { jjj[i]= iii[i]+1; // si orient = -1 } for(int i=0;i<6;++i) if(ooo[i]==1) v[jjj[i]]=0; else v[iii[i]]=0; } */ } ; const R2 TypeOfFE_P4dcLagrange::G(1./3.,1./3.); const R TypeOfFE_P4dcLagrange::cshrink=1-1e-2; const R TypeOfFE_P4dcLagrange::cshrink1=1./TypeOfFE_P4dcLagrange::cshrink; // on what nu df on node node of df int TypeOfFE_P4dcLagrange::Data[]={ 6,6,6,6,6, 6,6,6,6,6 ,6,6,6,6,6, // the support number of the node of the df 0,1,2,3,4, 5,6,7,8,9 ,10,11,12,13,14, // the number of the df on the node 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, // the node of the df 0,0,0,0,0, 0,0,0,0,0 ,0,0,0,0,0, // the df come from which FE (generaly 0) 0,1,2,3,4, 5,6,7,8,9 ,10,11,12,13,14, // which are de df on sub FE 0, // for each compontant $j=0,N-1$ it give the sub FE associated 0, 15}; double TypeOfFE_P4dcLagrange::Pi_h_coef[]={ 1.,1.,1.,1.,1. ,1.,1.,1.,1.,1. ,1.,1.,1.,1.,1.}; void TypeOfFE_P4dcLagrange::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P1,RNMK_ & val) const { R2 P=Shrink1(P1); R2 A(K[0]), B(K[1]),C(K[2]); R l0=1.-P.x-P.y,l1=P.x,l2=P.y; R L[3]={l0*k,l1*k,l2*k}; throwassert( val.N()>=14); throwassert(val.M()==1); // Attention il faut renumeroter les fonction de bases // car dans freefem++, il y a un node par sommet, arete or element // et la numerotation naturelle mais 2 noud pas arete // donc p est la perumation // echange de numerotation si les arete sont dans le mauvais sens int p[15]; for(int i=0;i<15;++i) p[i]=i; // if(K.EdgeOrientation(0) <0) Exchange(p[3],p[5]);// 3,4 // if(K.EdgeOrientation(1) <0) Exchange(p[6],p[8]);// 5,6 // if(K.EdgeOrientation(2) <0) Exchange(p[9],p[11]);// 7,8 //cout << KN_(p,10) < X; // point on edge // KN Pi_h_coef; // 1 KN Data; // data of TypeOfFE InitTypeOfFE_PkEdge(int KK) :k(KK),npe(k+1),ndf(3*npe),X(npe),Data( 5*ndf+3) { //Pi_h_coef=1.; const QuadratureFormular1d QF(-1+2*npe,npe,GaussLegendre(npe),true); for (int i=0;i=ndf); assert(val.M()==1); int ee=0; if (L[0] <= min(L[1],L[2]) ) ee=0; // arete else if (L[1] <= min(L[0],L[2]) ) ee=1; else ee=2; int e3=ee*npe; double s=1.-L[ee]; R xe = L[VerticesOfTriangularEdge[ee][0]]/s;// go from 0 to 1 on edge R dxe = -1; if(K.EdgeOrientation(ee) <0.) xe = 1-xe, dxe=-1; //cout << P << " ee = " << ee << " xe " << xe << " " << L[ee]<< " s=" < // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ff++.hpp" long exactpartition( int n, int m,double ** v,long *J) { int kkerr=0; long N = (1 << 30); cout <<" exactpartition " << n << " " << m << " N ="<< N < * const & p, KN *const &pj) { int n = p->N,m=0; double ** v= new double *[n]; int kerr=0; for(int i=0;i *vi=p->get(i); int mi = vi ? vi->N() : 0; if(m==0) m = mi; else if (m != mi ) kerr++; v[i]= *vi; } ffassert(kerr==0); ffassert(pj->N() >= n) ; exactpartition(n,m,v,*pj); delete[] v; return 0; } long exactpartition( KN > * const & p, KN *const &pj) { int n = p->N(),m=0; double ** v= new double *[n]; int kerr=0; for(int i=0;i vi=(*p)(i); int mi = vi ? vi.N() : 0; if(m==0) m = mi; else if (m != mi ) kerr++; if(mi==0) v[i]=0; else v[i]= vi; } ffassert(kerr==0); ffassert(pj->N() >= n) ; exactpartition(n,m,v,*pj); delete[] v; return 0; } static void Load_Init() { // to be sure to have unique add if(! Global.Find("exactpartition").NotNull() ) { Global.Add("exactpartition", "(", new OneOperator2_ *,KN *>(exactpartition)); // KN > Global.Add("exactpartition", "(", new OneOperator2_ >*,KN *>(exactpartition)); } } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/exactpartition.edp000644 000767 000024 00000001131 12511505711 022207 0ustar00hechtstaff000000 000000 load "exactpartition" load "msh3" mesh Th=square(10,10); mesh3 Th3=buildlayers(Th,10); fespace Vh(Th,P1); fespace Vh3(Th3,P1); int n=10; Vh[int] p(n); Vh3[int] p3(n); real[int][int] pp(n); for(int i=0; i const sym2 ExampleMetric(const R2 & P); template const sym3 ExampleMetric3D(const R3 & P); /********************** 2D *****************/ template<> const sym2 ExampleMetric<0>(const R2 & P){return sym2(1,0,1);} //identity template<> const sym2 ExampleMetric<1>(const R2 & P){ //A piecewise constant anisotropic metric const double scal = fabs(P.x-1/2.)<1/6. ? 4 : 1; return sym2(scal,-scal,4*scal); } template<> const sym2 ExampleMetric<2>(const R2 & P){ //circle, regularity Graded. const double delta = 0.03; //paramètre const R2 Q = P - R2(0.5,0.5); const double r= Q.norm(); const double h = max(fabs(r-1/2.),delta); return sym2(1/(h*h), 1/h, Q); } template<> const sym2 ExampleMetric<3>(const R2 & P){ //circle, regularity QuasiAcute. const double delta = 0.4; //paramètre const R2 Q = P - R2(0.5,0.5); const double r = Q.norm(); const double h = max(fabs(r-1/2.),delta); const double k = max(fabs(r-1/2.),delta*delta); return sym2(1/(k*k), 1/(h*h), Q); } template<> const sym2 ExampleMetric<4>(const R2 & P){return sym2(10,0,1);} //diagonal template<> const sym2 ExampleMetric<5>(const R2 & P){ //High anisotropy along the spiral r=k(theta+2 mu Pi), mu in {0,1,2}. const double pi = 4*atan(1); const double width = 0.006; const double k= 0.4/(6*pi); const double mu = 100.; const R2 Q = P-R2(0.5,0.5); const double r = Q.norm(); double theta = Q.x==-r ? pi : 2*atan(Q.y/(r+Q.x)); //theta = theta >= 0 ? theta : theta+pi; if(fabs(r-k*theta) <= width){theta = theta;} else if (fabs(r-k*(theta+2*pi)) <= width) {theta = theta+2*pi;} else if (fabs(r-k*(theta+4*pi)) <= width) {theta = theta+4*pi;} else if (fabs(r-k*(theta+6*pi)) <= width && theta <=0) {theta = theta+6*pi;} else return sym2(1,0,1); //{metric[0]=1; metric[1]=0; metric[2]=1; break;} double c= cos(theta)-theta*sin(theta), s=sin(theta)+theta*cos(theta); //tangente à la spirale double cOld=c; c=-s; s=cOld; return sym2(1,1/(mu*mu),R2(c,s)); } template<> const sym2 ExampleMetric<6>(const R2 & P){ //high but constant anisotropy const double mu=30., t = 0.3; R2 Q(cos(t),sin(t)); return sym2(1,1/(mu*mu), Q); } template<> const sym2 ExampleMetric<7>(const R2 & P){const double s=0.1+(P-R2(0.1,0.2)).norm(); return sym2()/square(s);} template<> const sym2 ExampleMetric<8>(const R2 & P){const double s=0.1+(P-R2(0.1,0.2)).norm(); return sym2(100,1,R2(1/2.,sqrt(3.)/2))/square(s);} template<> const sym2 ExampleMetric<9>(const R2 & P){const double s=0.1+fabs(P.x); return sym2(100,0,1)/square(s);} //template sym2 coExampleMetric(const R2 & P){return ExampleMetric(P).comatrix();} /************************ 3D *************************/ template<> const sym3 ExampleMetric3D<0>(const R3 & P){return sym3(1,1,1,0,0,0);} template<> const sym3 ExampleMetric3D<1>(const R3 & P){return sym3(1,10,100,0,0,0);} template<> const sym3 ExampleMetric3D<2>(const R3 & P){return sym3(1,10,R3(0.1,-0.2,0.4));} template<> const sym3 ExampleMetric3D<3>(const R3 & P){ // tire bouchon... const double r0 = 0.33; const double theta0 = 4*M_PI; const double delta0 = 0.06; const double mu = 1/8.; const R3 Q(P.x-0.5, P.y-0.5, P.z-0.5); const double r = sqrt(Q.x*Q.x+Q.y*Q.y); if(fabs(r-r0) > delta0) return sym3(); if(square(Q.x-r*cos(theta0*Q.z))+ square(Q.y-r*sin(theta0*Q.z)) > square(r*delta0)) return sym3(); return sym3(mu*mu, 1, R3( -r0*theta0*sin(theta0*Q.z), r0*theta0*cos(theta0*Q.z), 1)); } #endiffreefem++-3.38-1/examples++-load/ff-AiryBiry.cpp000644 000767 000024 00000005050 12471724777 021336 0ustar00hechtstaff000000 000000 #include #include using namespace std; double airy(double x,long df) { double f,y,a,b,s; int p; double u=.258819403792807,v=.355028053887817; if(x<=1.7 && x>= -6.9) { y=x*x*x/9.; if(df) { a=2./3.; b= -a; v*=x*x/2.; u= -u; } else{ b=1./3.; a= -b; u*= -x; } for(p=1,f=u+v;;++p) { a+=1.; b+=1.; v*=y/(p*a); u*=y/(p*b); s=u+v; f+=s; if(fabs(s)<1.e-14) break; } } else { s=1./sqrt(v=3.14159265358979); y=fabs(x); if(df) s*=pow(y,.25); else s/=pow(y,.25); y*=2.*sqrt(y)/3.; if(x>0.) { a=12./pow(y,.333); p=a*a; if(df) a= -7./36.; else a=5./36.; b=2.*(p+y); f=1.; u=x=0.; s*=exp(-y)/2.; for(; p>0 ;--p,b-=2.) { y=(b*f-(p+1)*x)/(p-1+a/p); x=f; f=y; u+=f; } if(df) f*= -s/u; else f*=s/u; } else { x=y-v/4.; y*=2.; b=.5; f=s; v=0.; if(df) a=2./3.; else a=1./3.; for(p=1; (u=fabs(s))>1.e-14 ;++p,b+=1.) { s*=(a+b)*(a-b)/(p*y); if(fabs(s)>=u) break; if(!(p&1)) { s= -s; f+=s; } else v+=s; } if(df) f=f*sin(x)+v*cos(x); else f=f*cos(x)-v*sin(x); } } return f; } double biry(double x,long df) { double f,y,a,b,s; int p; double u=.258819403792807,v=.355028053887817; if(x<=7.6 && x>= -6.9){ y=x*x*x/9.; if(df){ b= -(a=2./3.); u*=(f=sqrt(3.)); v*=f*x*x/2.;} else{ a= -(b=1./3.); v*=(f=sqrt(3.)); u*=f*x;} for(p=1,f=u+v;;++p){ v*=y/(p*(a+=1.)); u*=y/(p*(b+=1.)); f+=(s=u+v); if(fabs(s)<1.e-14*(1.+fabs(f))) break; } } else{ s=1./sqrt(v=3.14159265358979); y=fabs(x); if(df) s*=pow(y,.25); else s/=pow(y,.25); y*=2.*sqrt(y)/3.; b=.5; if(df) a=2./3.; else a=1./3.; if(x>0.){ s*=exp(y); f=s; y*= -2.; for(p=1; (u=fabs(s))>1.e-14 ;++p,b+=1.){ s*=(a+b)*(a-b)/(p*y); if(fabs(s)>=u) break; f+=s; } } else{ x=y-v/4.; y*=2.; f=s; v=0.; for(p=1; (u=fabs(s))>1.e-14 ;++p,b+=1.){ s*=(a+b)*(a-b)/(p*y); if(fabs(s)>=u) break; if(!(p&1)){ s= -s; f+=s;} else v+=s; } if(df) f=f*cos(x)-v*sin(x); else f= -(f*sin(x)+v*cos(x)); } } return f; } #include "ff++.hpp" static void InitFF() { Global.Add("airy","(",new OneOperator2( airy)); Global.Add("biry","(",new OneOperator2( biry)); } LOADFUNC(InitFF) freefem++-3.38-1/examples++-load/ff-cmaes.cpp000644 000767 000024 00000025673 12466661714 020704 0ustar00hechtstaff000000 000000 //ff-c++-cpp-dep: cmaes.cpp // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Sylvain Auliac // E-MAIL : auliac@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This is a freefem interface of the Hansen's CMA-ES C optimizer. The class CMAES is a quick C++ interface for the contents of the C files then follow the real FreeFem++ stuff. */ #include using namespace std; #include "ff++.hpp" #include "cmaes_interface.h" class CMAES //Abstract class, because the fitness function prototype may differ from users to users { public: //typedef double (*FFT)(double const *); //Fitness Function Type CMAES() : pop(0),fitvals(0),evo() {} CMAES(int d,double *xstart,double *stddev,long seed,int lambda,const char *ipf="initials.par") : pop(0),fitvals(0),evo() { fitvals = init(d,xstart,stddev,seed,lambda,ipf); cout << SayHello() << endl; } virtual ~CMAES() {exit();} void resume_distribution(char *filename) {return cmaes_resume_distribution(&evo, filename);} double * const * & SamplePopulation() {return pop = cmaes_SamplePopulation(&evo);} double * UpdateDistribution() {return cmaes_UpdateDistribution(&evo,fitvals);} const char * TestForTermination() const {return cmaes_TestForTermination(&evo);} double * const * & ReSampleSingle(int index) {return pop = cmaes_ReSampleSingle(&evo,index);} double const * ReSampleSingle_old(double *rgx) {return cmaes_ReSampleSingle_old(&evo,rgx);} void UpdateEigensystem(int flgforce) {return cmaes_UpdateEigensystem(&evo, flgforce);} virtual void PopEval() =0; //{for(int i=0;i(cmaes_GetPtr(&evo,"diag(C)"));} double * diagD() const {return const_cast(cmaes_GetPtr(&evo,"diag(D)"));} double * stddev() const {return const_cast(cmaes_GetPtr(&evo,"stddev"));} double * xbestever() const {return const_cast(cmaes_GetPtr(&evo,"xbestever"));} double * xbest() const {return const_cast(cmaes_GetPtr(&evo,"xbest"));} double * xmean() const {return const_cast(cmaes_GetPtr(&evo,"xmean"));} void ReadSignals(char const * filename) const {cmaes_ReadSignals(&evo,filename);} char * SayHello() const {return cmaes_SayHello(&evo);} void WriteToFile(char const * keyword,char const * output_filename) const {cmaes_WriteToFile(&evo,keyword,output_filename);} virtual double * operator() () { //ReadSignals("signals.par"); while(!TestForTermination()) { SamplePopulation(); PopEval(); UpdateDistribution(); //ReadSignals("signals.par"); } cout << "Stop : " << TestForTermination() << endl; return xmean(); } cmaes_t& optimizer() {return evo;} protected: double * const * pop; double * fitvals; private: void exit() {cmaes_exit(&evo);} double*& init(int dimension,double *xstart,double *stddev,long seed,int lambda,const char *input_parameter_filename) {return fitvals = cmaes_init(&evo,dimension,xstart,stddev,seed,lambda,input_parameter_filename);} mutable cmaes_t evo; }; /* Now comes the FreeFem ++ part : */ extern Block *currentblock; typedef double R; class OptimCMA_ES : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; const int cas; class ffcalfunc // to call the freefem function .. J { public: Stack stack; Expression JJ,theparame; ffcalfunc(Stack s,Expression JJJ,Expression epar) : stack(s),JJ(JJJ), theparame(epar) {} double J(Kn_ x) const { KN *p=GetAny *>( (*theparame)(stack) ); *p=x; double ret= GetAny( (*JJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); return ret; } }; class CMA_ES : public CMAES { public: typedef KN Rn; typedef KN_ Rn_; CMA_ES() : CMAES(),x(0),fit(0) {} /*CMA_ES(ffcalfunc &_ff,int d,Rn &xstart,double *stddev,long seed,int lambda) : CMAES(d,xstart.n ? xstart:0,stddev,seed,lambda,"non"),x(&xstart),fit(&_ff) {} CMA_ES(ffcalfunc &_ff,int d,Rn &xstart,const Rn &stddev,long seed,int lambda) : CMAES(d,xstart.n ? xstart:0,stddev,seed,lambda,"non"),x(&xstart),fit(&_ff) {}*/ CMA_ES(ffcalfunc &_ff,Rn &xstart,const Rn &stddev,long seed,int lambda) : CMAES(xstart.n,xstart,stddev,seed,lambda,"non"),x(&xstart),fit(&_ff) {} CMA_ES(ffcalfunc &_ff,Rn &xstart,const Rn &stddev,long seed,int lambda,const string &ipf) : CMAES(xstart.n,xstart,stddev,seed,lambda,ipf.c_str()),x(&xstart),fit(&_ff) {} void PopEval() {for(int i=0;iJ(popi);}} double * operator() () {return *x = Rn(x->n,CMAES::operator()());} private: ffcalfunc *fit; Rn *x; }; class E_CMA_ES: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =11; Expression nargs[n_name_param]; Expression X; C_F0 inittheparam,theparam,closetheparam; Expression JJ; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} E_CMA_ES(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } JJ= to(C_F0(opJ,"(",theparam)); closetheparam=currentblock->close(currentblock); // the cleanning block expression } virtual AnyType operator()(Stack stack) const { double cost = 1e100; WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Kn &x = *GetAny((*X)(stack)); long n=x.N(); long seed = arg(0,stack,0L); //The seed for random numbers generation double initialStdDev = arg(1,stack,0.3); //Initial standard deviation KN iSD(n,1.); iSD *= initialStdDev; KN initialStdDevs(nargs[2] ? GetAny >((*nargs[2])(stack)) : (KN_)iSD); //cout << "dans le dylib :" << initialStdDevs << endl; double stopTolFun = arg(3,stack,1.E-12); double stopTolFunHist = arg(4,stack,0.); double stopTolX = arg(5,stack,0.); double stopTolUpXFactor = arg(6,stack,1.E3); long popsize = arg(7,stack,4 + (long) floor(3*log(n))); //long mu = arg(8,stack,popsize/2); string pipf = nargs[10] ? *GetAny((*nargs[10])(stack)) : string("") ; long iprint = verbosity; ffcalfunc ffJ(stack,JJ,theparam); CMA_ES *optim=0; if(pipf.size()>0) { cout << "input file : " << pipf << endl; optim = new CMA_ES(ffJ,x,initialStdDevs,seed,popsize,pipf); } else { cout << "no input file " << endl; optim = new CMA_ES(ffJ,x,initialStdDevs,seed,popsize); long meval = arg(8,stack,static_cast(optim->maxeval())); long mgen = arg(9,stack,static_cast(optim->maxgen())); optim->optimizer().sp.stopTolFun = stopTolFun; optim->optimizer().sp.stopTolFunHist = stopTolFunHist; optim->optimizer().sp.stopTolX = stopTolX; optim->optimizer().sp.stopTolUpXFactor = stopTolUpXFactor; optim->optimizer().sp.stopMaxFunEvals = meval; optim->optimizer().sp.stopMaxIter = mgen; } (*optim)(); cost = optim->fitness(); x = KN_(optim->xbestever(),optim->dimension()); cout << "Number of fitness evalution(s) : " << optim->eval() << endl; closetheparam.eval(stack); // clean memory if(optim) {delete optim; optim=0;} WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return cost; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const {return new E_CMA_ES(args,cas);} OptimCMA_ES(int c) : OneOperator(atype(),atype(),atype *>()),cas(c){} }; basicAC_F0::name_and_type OptimCMA_ES::E_CMA_ES::name_param[]= { {"seed", &typeid(long) }, {"initialStdDev", &typeid(double) }, {"initialStdDevs", &typeid(KN_) }, {"stopTolFun", &typeid(double) }, {"stopTolFunHist", &typeid(double) }, {"stopTolX", &typeid(double) }, {"stopTolUpXFactor",&typeid(double) }, {"popsize", &typeid(long) }, {"stopMaxFunEval", &typeid(long) }, {"stopMaxIter", &typeid(long) }, {"paramFile", &typeid(string*) } //{"mu", &typeid(long) } }; /* class Init { public: Init(); }; $1 */ static void Load_Init() { Global.Add("cmaes","(",new OptimCMA_ES(1)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/ff-get-dep.awk000644 000767 000024 00000002055 12500247366 021116 0ustar00hechtstaff000000 000000 BEGIN { nl=split(libs,l," *"); err= 0;sp=" ";db=0;} $2=="LD" { if( ld[$1]=="" ) { a=$1; sub(/.* LD /,""); ld[a]=$0 sp; if(db) print a,$0 }} $2=="INCLUDE" { if( inc[$1]=="" ) { a=$1;sub(/.* INCLUDE /,""); inc[a]=$0 sp; if(db) print a,$0; }} END { msg=cpp sp; for(i=1; i<=nl;++i) { libbb=l[i]; m=split(libbb,ll,"[]|[]"); first = 0; for(j=1; j<=m; ++j) { msg1=""; lib = ll[j]; nn=1; if(libbb==lib) nn=0; if (ld[lib]=="" && nn ==0) { lerr[err++]=lib ;} if(ld[lib]!="" && nn!=0) { if( first==0) { msg1="-DWITH_" lib sp ld[lib] sp inc[lib] sp; } first ++; } if(ld[lib]!="" && nn==0) msg1 = ld[lib] sp inc[lib] sp; msg =msg msg1; if(db) print " ###" libbb, lib, err, first ,j, m, msg1; } } if(err) { printf "\t\t MISSING lib "> "/dev/stderr" for(i=0; i < err;++i) printf "%s, ", lerr[i]> "/dev/stderr"; print " Check the WHERE-LIBRARYfiles " > "/dev/stderr"; exit 1; } else printf("%s\n",msg); }freefem++-3.38-1/examples++-load/ff-get-dep.in000755 000767 000024 00000001655 12466405071 020752 0ustar00hechtstaff000000 000000 #!/bin/sh # ff-c++ `./ff-get-dep -ff metis.cpp` case "$1" in -dlib) shift awk -F: '/^[\/]+ff-c[+][+]-LIBRARY-dep:/ { printf("%s",$2); exit 0;}' $@ exit 0; ;; -dcpp) shift awk -F: '/^[\/]+ff-c[+][+]-cpp-dep:/ { printf("%s",$2); exit 0;}' $@ exit 0; ;; -ff) shift; # ajout de lib with check libs=`$0 -dlib $@` cpp=`$0 -dcpp $@`" $@" ;; esac dircommand=`dirname $0` if [ -f "WHERE_LIBRARY-download" ] ; then dircommand="./" elif [ -f "$dircommand/WHERE_LIBRARY-download" ] ; then dirwhere=$dircommand elif [ -f '@ff_prefix_dir@/lib/WHERE_LIBRARY-download' ] ; then dirwhere='@ff_prefix_dir@/lib' else echo " error no WHERE_LIBRARY file " exit 1; fi cd "$dirwhere" wherel=WHERE_LIBRARY-download test -f WHERE_LIBRARY-config && wherel="$wherel WHERE_LIBRARY-config" test -f WHERE_LIBRARY && wherel="$wherel WHERE_LIBRARY" awk -f ff-get-dep.awk -v libs="$libs" -v cpp="$cpp" $wherel exit $? freefem++-3.38-1/examples++-load/ff-Ipopt.cpp000644 000767 000024 00000254753 12466663526 020715 0ustar00hechtstaff000000 000000 /* * ff-NLopt.cpp * * * Created by Sylvain Auliac on 17/01/12. * */ /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //ff-c++-LIBRARY-dep: Ipopt mumps-seq blas libseq fc //using namespace std; #include "IpTNLP.hpp" #include "IpIpoptApplication.hpp" #include "ff++.hpp" extern Block *currentblock; typedef double R; typedef KN_ Rn_; typedef KN Rn; typedef KNM_ Rnm_; typedef KNM Rnm; /***************************************************************************************************************************** * Some misc. function usefull later... *****************************************************************************************************************************/ //A variadic function to add an undefinite number of elements to a set of short int //This is used to define the set of named parameter which are not used when some assumptions //upon the optimization poblem functions are met void AddElements(std::set &_set,int amount,int first,...) { int elem=0; va_list vl; va_start(vl,first); _set.insert(first); for (int i=1;i inline void clean(T *p) {if(p) {delete p; p=0;} } //Pair compare (certainly already implemented in the STL with KeyLess...) inline bool operator<=(const std::pair &l,const std::pair &r) {return (l.first < r.first) || (l.first==r.first && l.second <= r.second);} //Some logical operators (exclussive or and its negation) inline bool XOR(bool a,bool b) {return (!a && b) || (a && !b);} inline bool NXOR(bool a,bool b) {return !XOR(a,b);} //A debug tool #ifdef DEBUG inline void SONDE() {static int i=1; cout << "SONDE " << i << endl; ++i;} #else inline void SONDE() {} #endif /***************************************************************************************************************************** * FreeFem function callers * ffcalfunc : template abstract mother class with a pointer to the freefem stack and the J virtual method which computes * the function *****************************************************************************************************************************/ template class ffcalfunc { public: Stack stack; ffcalfunc(const ffcalfunc &f) : stack(f.stack) {} ffcalfunc(Stack _stack) : stack(_stack) {} virtual K J(Rn_) const = 0; virtual ~ffcalfunc() {} }; /***************************************************************************************************************************** * GeneralFunc : Most general case (specialized for sparse matrix returning functions, because IPOPT need the hessian func * to take some additional parameters). * @theparame: ff expression of the parameter of the ff function, computing J(x) need the associated KN to be set to the * values of x * @JJ : ff expression of the function *****************************************************************************************************************************/ template class GeneralFunc : public ffcalfunc { public: Expression JJ,theparame; GeneralFunc(const GeneralFunc &f) : ffcalfunc(f),JJ(f.JJ),theparame(f.theparame) {} GeneralFunc(Stack s,Expression JJJ,Expression epar) : ffcalfunc(s),JJ(JJJ), theparame(epar) {} K J(Rn_ x) const { KN *p=GetAny *>( (*theparame)(this->stack) ); *p=x; K ret= GetAny( (*JJ)(this->stack) ); //cout << "call to ffcalfunc.J with " << *p << " and ret=" << ret << endl; WhereStackOfPtr2Free(this->stack)->clean(); return ret; } }; /***************************************************************************************************************************** * P2ScalarFunc: encapsulate a function which is the sum of a bilinear and a linear form (no constant part since it will be * used as fitness function). It also handles the case of pure quadratic or linear forms. * @vf : If true J will compute 0.5xMx - bx (x is the solution of Mx = b in the unconstrained optimization process) * if false xMx + bx is returned * @M : FF expression of the matrix of the bilinear form (null pointer for linear form case) * @b : FF expression of the vector representation of the linear part (null for pure quadratic case) *****************************************************************************************************************************/ class P2ScalarFunc : public ffcalfunc { public: const bool vf; Expression M,b; //Matrix of the quadratic part, vector of the linear part P2ScalarFunc(const P2ScalarFunc &f) : ffcalfunc(f),M(f.M),b(f.b),vf(f.vf) {} P2ScalarFunc(Stack s,Expression _M,Expression _b,bool _vf=false) : ffcalfunc(s),M(_M),b(_b),vf(_vf) {} R J(Rn_ x) const { Rn tmp(x.N(),0.); if(M) { Matrice_Creuse * a = GetAny *>( (*M)(stack) ); MatriceMorse *A = dynamic_cast *>(&(*a->A)); assert(A); tmp = (*A)*x; if(vf) tmp/=2.; } if(b) { Rn *B = GetAny( (*b)(stack) ); tmp += *B; //if(vf) tmp -= (*B); else tmp += (*B); } R res=0.; for(int i=0;i { public: const bool vf; Expression M,b; P1VectorFunc(const P1VectorFunc &f) : ffcalfunc(f),M(f.M),b(f.b),vf(f.vf) {} P1VectorFunc(Stack s,Expression _M,Expression _b,bool _vf=false) : ffcalfunc(s),M(_M),b(_b),vf(_vf) {} Rn J(Rn_ x) const { Rn tmp(0); if(M) { Matrice_Creuse * a = GetAny *>( (*M)(stack) ); MatriceMorse *A = dynamic_cast *>(&(*a->A)); assert(A); if(tmp.N() != A->n) {tmp.resize(A->n); tmp=0.;} tmp = (*A)*x; } if(b) { Rn* B = GetAny( (*b)(stack) ); if(tmp.N() != B->N()) {tmp.resize(B->N()); tmp=0.;} tmp += *B; //if(vf) tmp -= (*B); else tmp += (*B); } return tmp; } }; /***************************************************************************************************************************** * ffcalfuncR>*>: specialization for sparse matrix returning function. When it encapsulates the hessian * function of the lagragian, non-linear constraints will need the additional obj_factor and lagrange multiplier * parameters. The one parameter version of J is called if there is no non-linear constraints or if the objects * represents the jacobian of the constraints. *****************************************************************************************************************************/ template<> class ffcalfunc *> { public: typedef Matrice_Creuse *K; Stack stack; ffcalfunc(const ffcalfunc &f) : stack(f.stack) {} ffcalfunc(Stack s) : stack(s) {} virtual K J(Rn_) const = 0; virtual K J(Rn_,double,Rn_) const = 0; virtual bool NLCHPEnabled() const = 0; //Non Linear Constraints Hessian Prototype virtual ~ffcalfunc(){} }; /***************************************************************************************************************************** * GeneralSparseMatFunc: general case of sparse matrix returning function. Members datas added are ff expression of the * scalar objective factor and vectorial lagrange multipliers. *****************************************************************************************************************************/ class GeneralSparseMatFunc : public ffcalfunc *> { private: typedef ffcalfunc *> FFF; public: Expression JJ,param,paramlm,paramof; GeneralSparseMatFunc(const GeneralSparseMatFunc &f) : FFF(f),JJ(f.JJ),param(f.param),paramlm(f.paramlm),paramof(f.paramof) {}; GeneralSparseMatFunc(Stack s,Expression JJJ,Expression epar,Expression eparof=0,Expression eparlm=0) : FFF(s),JJ(JJJ),param(epar),paramlm(eparlm),paramof(eparof) {ffassert(NXOR(paramlm,paramof));} bool NLCHPEnabled() const {return paramlm && paramof;} K J(Rn_ x) const { KN *p=GetAny *>( (*param)(stack) ); *p=x; K ret= GetAny( (*JJ)(stack)); //cout << "call to ffcalfunc.J with " << *p << " and ret=" << ret << endl; WhereStackOfPtr2Free(stack)->clean(); return ret; } K J(Rn_ x,double of,Rn_ lm) const { if(paramlm && paramof) { KN *p=GetAny *>( (*param)(stack) ); double *pof=GetAny( (*paramof)(stack) ); KN *plm=GetAny *>( (*paramlm)(stack) ); *p=x; *pof=of; int m= lm.N(), mm=plm->N(); if( (m != mm) && mm) {cout << " ff-ipopt H : big bug int size ???"<< m << " != " << mm << endl; abort();}; *plm=lm; K ret= GetAny( (*JJ)(stack)); //cout << "call to ffcalfunc.J with " << *p << " and ret=" << ret << endl; WhereStackOfPtr2Free(stack)->clean(); return ret; } else return J(x); } }; /***************************************************************************************************************************** * ConstantSparseMatFunc: Encapsulate a constant matrix returning function. Just contains the ff expression of the matrix * (and stack inherited from mother class), this matrix is returned regardless of x. *****************************************************************************************************************************/ class ConstantSparseMatFunc : public ffcalfunc *> { private: typedef ffcalfunc *> FFF; public: Expression M; //Expression of the matrix ConstantSparseMatFunc(const ConstantSparseMatFunc &f) : FFF(f),M(f.M) {} ConstantSparseMatFunc(Stack s,Expression _M) : FFF(s),M(_M) {} bool NLCHPEnabled() const {return false;} K J(Rn_) const { K ret = M ? GetAny( (*M)(stack) ) : 0; WhereStackOfPtr2Free(stack)->clean(); return ret; } K J(Rn_ x,double,Rn_) const {return J(x);} }; typedef ffcalfunc ScalarFunc; typedef ffcalfunc VectorFunc; typedef ffcalfunc FullMatrixFunc; typedef ffcalfunc* > SparseMatFunc; /***************************************************************************************************************************** * SparseMatStructure: a class for sparse matrix structure management (mostly merging). The most interesting methods in this * class are : * AddMatrix : merge the structure of the given matrix to the structure of current object * AddArrays : merge structure in arrays form to the current object * ToKn : allocate the raws and cols pointers and fill them with the std::set form of the structure * structure is then emptied if this method is passed a true value * ==> update 28/03/2012, autostruct proved useless since the structure merging can be done with operator + * (I did not no whether nullify coefficients where removed from the result but it actually doesn't so the structure of * the lagrangian hessian can be guessed exactly by evaluating on a point yeilding the biggest fitness function * hessian along with a dual vector filled with 1). *****************************************************************************************************************************/ class SparseMatStructure { public: typedef std::pair Z2; typedef std::set Structure; typedef std::pair,KN > Zn2; typedef Structure::const_iterator const_iterator; typedef Structure::iterator iterator; SparseMatStructure(bool _sym=0) : structure(),sym(_sym),n(0),m(0),raws(0),cols(0) {} SparseMatStructure(Matrice_Creuse const * const M,bool _sym=0) : structure(),sym(_sym),n(M->N()),m(M->M()),raws(0),cols(0) {this->AddMatrix(M);} template SparseMatStructure(const KN &I,const KN &J,bool _sym=0) : structure(),sym(_sym),n(I.max()),m(J.max()),raws(0),cols(0) {this->AddArrays(I,J);} ~SparseMatStructure() {if(raws) delete raws; if(cols) delete cols;} const_iterator begin() const {return structure.begin();} iterator begin() {return structure.begin();} const_iterator end() const {return structure.end();} iterator end() {return structure.end();} //Structure& operator()() {return structure;} //const Structure& operator()() const {return structure;} bool empty() const {return structure.empty() && !raws && !cols;} int N() const {return n;} int M() const {return m;} SparseMatStructure& clear() {structure.clear(); if(raws) delete raws; if(cols) delete cols; sym=false; n=0; m=0; return *this;} int size() const {return structure.size() ? structure.size() : (raws ? raws->N() : 0);} SparseMatStructure& AddMatrix(Matrice_Creuse const * const); template SparseMatStructure& AddArrays(const KN &,const KN &); SparseMatStructure& ToKn(bool emptystruct=false); KN & Raws() {return *raws;} KN const & Raws() const {return *raws;} KN & Cols() {return *cols;} KN const & Cols() const {return *cols;} private: int n,m; Structure structure; bool sym; //Zn2 *array_structure; KN *raws,*cols; }; SparseMatStructure& SparseMatStructure::ToKn(bool emptystruct) { if(raws) delete raws; if(cols) delete cols; raws = new KN(structure.size()); cols = new KN(structure.size()); int k=0; for(const_iterator i=begin();i!=end();++i) {(*raws)[k]=i->first; (*cols)[k]=i->second; ++k;} if(emptystruct) structure.clear(); return *this; } SparseMatStructure& SparseMatStructure::AddMatrix(Matrice_Creuse const * const _M) { n = n > _M->N() ? n : _M->N(); m = m > _M->M() ? m : _M->M(); MatriceMorse const * const M = dynamic_cast const * const> (&(*_M->A)); if( !M ) { cerr << " Err= "<< " Matrix is not morse or CSR "<< &(*_M->A) << endl; ffassert(M); } { if(!sym || (sym && M->symetrique)) { for(int i=0;i < M->N;++i) { for(int k=M->lg[i]; k < M->lg[i+1]; ++k) structure.insert(Z2(i,M->cl[k])); } } else // sym && !M->symetrique { for(int i=0;iN;++i) { for(int k=M->lg[i]; k < M->lg[i+1]; ++k) if(i >= M->cl[k]) structure.insert(Z2(i,M->cl[k])); } } } return *this; } template SparseMatStructure& SparseMatStructure::AddArrays(const KN &I,const KN &J) { ffassert(I.N()==J.N()); n = n > I.max()+1 ? n : I.max()+1; m = m > J.max()+1 ? m : J.max()+1; if(!sym) for(int k=0;k=J[k]) structure.insert(Z2(I[k],J[k])); return *this; } /***************************************************************************************************************************** * ffNLP : Derived from the TNLP non-linear problem wrapper class of Ipopt. Virtual methods are defined as explain in * the IPOPT documentation. Some of them are tricky because the sparse matrix format in freefem is CRS, whereas * IPOPT use COO storage. * It is even more tricky because most of time, FreeFem will remove null coefficient from the structure, leading to * non constant indexing of the coefficient through the algorithm in case of very non linear functions. As IPOPT need * a constant structure, a FindIndex method involving a dichotomic search has been implemented to prevent the errors * related to that. *****************************************************************************************************************************/ using namespace Ipopt; class ffNLP : public TNLP { public: ffNLP() : xstart(0) {} ffNLP(Rn &,const Rn &,const Rn &,const Rn &,const Rn &,ScalarFunc*, VectorFunc*, SparseMatFunc*, VectorFunc*, SparseMatFunc*); ffNLP(Rn &,const Rn &,const Rn &,const Rn &,const Rn &,ScalarFunc*, VectorFunc*, SparseMatFunc*, VectorFunc*, SparseMatFunc*, int ,int ,int); virtual ~ffNLP(); bool get_nlp_info(Index&, Index&, Index&, Index&, IndexStyleEnum&); //the IPOPT methods bool get_bounds_info(Index, Number*, Number*, Index, Number*, Number*); bool get_starting_point(Index, bool, Number*,bool , Number* , Number*,Index , bool ,Number* ); bool eval_f(Index, const Number*, bool, Number&); bool eval_grad_f(Index, const Number*, bool, Number*); bool eval_g(Index, const Number*, bool, Index, Number*); bool eval_jac_g(Index, const Number*, bool,Index, Index, Index*, Index *,Number*); bool eval_h(Index, const Number*, bool ,Number , Index , const Number*,bool, Index, Index*,Index*, Number*); void finalize_solution(SolverReturn, Index, const Number*, const Number*, const Number*, Index, const Number*, const Number*, Number, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq); template ffNLP& SetHessianStructure(const KN &,const KN &,bool reset=0); template ffNLP& SetJacobianStructure(const KN &,const KN &,bool reset=0); enum Level {do_nothing,user_defined, one_evaluation, basis_analysis}; ffNLP& BuildMatrixStructures(Level,Level,int); ffNLP& EnableCheckStruct() {checkstruct=true; return *this;} ffNLP& DisableCheckStruct() {checkstruct=false; return *this;} Rn lambda_start,x_start,uz_start,lz_start; double sigma_start; double final_value; private: //algorithm datas Rn *xstart,xl,xu,gl,gu; ScalarFunc *fitness; //Pointers to functions wrappers VectorFunc *dfitness,*constraints; SparseMatFunc *hessian,*dconstraints; int mm,nnz_jac,nnz_h; //duplicated datas? did not seems to be reachable in the base class //bool sym; bool checkstruct; SparseMatStructure HesStruct,JacStruct; //some static functions... template static void KnToPtr(const KN &a,B *b) {for(int i=0;i static void KnFromPtr(KN &a,B const *b) {for(int i=0;i &irow,const KN & jrow,int i,int j,int kmin,int kmax); }; ffNLP::ffNLP(Rn &x,const Rn &_xl,const Rn &_xu,const Rn &_gl,const Rn &_gu,ScalarFunc * _fitness,VectorFunc * _dfitness,SparseMatFunc * _hessian, VectorFunc * _constraints,SparseMatFunc * _dconstraints) : xstart(&x), xl(_xl), xu(_xu), gl(_gl), gu(_gu),final_value(299792458.),//sym(0),unsymind(), fitness(_fitness), dfitness(_dfitness), constraints(_constraints),uz_start(),lz_start(), hessian(_hessian), dconstraints(_dconstraints),mm(-1),nnz_jac(-1),nnz_h(-1), HesStruct(true),JacStruct(false),sigma_start(1.),lambda_start(),x_start(x),checkstruct(1) {} ffNLP::ffNLP(Rn &x,const Rn &_xl,const Rn &_xu,const Rn &_gl,const Rn &_gu,ScalarFunc * _fitness,VectorFunc * _dfitness,SparseMatFunc * _hessian, VectorFunc * _constraints,SparseMatFunc * _dconstraints, int _mm,int _nnz_jac,int _nnz_h) : xstart(&x), xl(_xl), xu(_xu), gl(_gl), gu(_gu),hessian(_hessian),final_value(299792458.),//sym(0),unsymind(), fitness(_fitness),dfitness(_dfitness),constraints(_constraints),dconstraints(_dconstraints),uz_start(),lz_start(), mm(_mm),nnz_jac(_nnz_jac),nnz_h(_nnz_h),HesStruct(true),JacStruct(false),sigma_start(1.),lambda_start(),x_start(x),checkstruct(1) {} ffNLP::~ffNLP() { /* clean(fitness); clean(dfitness); clean(constraints); clean(hessian); clean(dconstraints); */ } template ffNLP& ffNLP::SetHessianStructure(const KN &I,const KN &J,bool reset) { if(reset) HesStruct.clear(); HesStruct.AddArrays(I,J); return *this; } template ffNLP& ffNLP::SetJacobianStructure(const KN &I,const KN &J,bool reset) { if(reset) JacStruct.clear(); JacStruct.AddArrays(I,J); return *this; } ffNLP& ffNLP::BuildMatrixStructures(Level hlvl, Level jlvl,int _mm) { if(jlvl!=do_nothing && dconstraints) { if(jlvl==user_defined) ffassert(JacStruct.size()); else if((jlvl==one_evaluation || jlvl==basis_analysis) && dconstraints) JacStruct.AddMatrix(dconstraints->J(x_start)); } if(hlvl!=do_nothing && hessian) { if(hlvl==user_defined) ffassert(HesStruct.size()); else if(hlvl==one_evaluation || !hessian->NLCHPEnabled() ) { Rn lms=lambda_start; lms=1.; HesStruct.AddMatrix(hessian->J(x_start,sigma_start,lms)); } else if(hlvl==basis_analysis) { { Rn lambda(_mm,0.); HesStruct.AddMatrix(hessian->J(x_start,1.,lambda)); } for(int i=0;i<_mm;++i) { Rn lambda(_mm,0.); lambda[i] = 1.; HesStruct.AddMatrix(hessian->J(x_start,0.,lambda)); lambda[i] = 0.; } } } JacStruct.ToKn(); HesStruct.ToKn(); return *this; } int ffNLP::FindIndex(const KN &irow,const KN &jcol,int i,int j,int kmin,int kmax) { //cout << "Trying to find (" << i << ',' << j << ") in :" << irow << jcol << " - kmin=" << kmin << " and kmax=" << kmax << endl; typedef std::pair Z2; Z2 ij(i,j),ijmin(irow[kmin],jcol[kmin]),ijmax(irow[kmax],jcol[kmax]); if(abs(kmin-kmax)<=1) { if(ij==ijmin) return kmin; else if(ij==ijmax) return kmax; else return -1; } else { int knew = (kmin + kmax) / 2; Z2 ijnew(irow[knew],jcol[knew]); if(ij <= ijnew) return FindIndex(irow,jcol,i,j,kmin,knew); else return FindIndex(irow,jcol,i,j,knew,kmax); } } bool ffNLP::get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,Index& nnz_h_lag, IndexStyleEnum& index_style) { bool ret=true; n = xstart ? xstart->N() : (ret=0); //set(m,mm,constraints,xstart,ret); //set(nnz_jac_g,nnz_jac,dconstraints,xstart,ret); //set(nnz_h_lag,nnz_h,hessian,xstart,ret); //if(JacStruct.empty() && constraints) BuildMatrixStructures(do_nothing,one_evaluation); //if(HesStruct.empty()) BuildMatrixStructures(one_evaluation,do_nothing); mm = m = constraints ? JacStruct.N() : 0; nnz_jac = nnz_jac_g = constraints ? JacStruct.size() : 0; nnz_h = nnz_h_lag = HesStruct.size(); index_style = TNLP::C_STYLE; return ret; } bool ffNLP::get_bounds_info(Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u) { //cout << "n=" << n << " m=" << m << " mm=" << mm << " g_l.N()=" << gl.N() << " g_u.N()=" << gu.N() << endl; //assert(gl.N()==mm); //assert(gu.N()==mm); KnToPtr(xl,x_l); KnToPtr(xu,x_u); if(mm) KnToPtr(gl,g_l); if(mm) KnToPtr(gu,g_u); /* DEBUG cout << "constraints lower bound = ("; for(int i=0;iN() == n); KnToPtr(*xstart,x); if(init_z) { if(uz_start.N() != n) { if(xu.min() < 1.e19) { cout << "ff-IPOPT warm start : upper simple bounds start multipliers array doesn't have the expected size (" << uz_start.N() << "!=" << n << ")." << endl; cout << " "; if(uz_start.N()==0) cout << "maybe because no upper bounds multiplier has been given. " << endl; cout << " Initializing them to 1..." << endl; } uz_start.resize(n); uz_start=1.; } if(lz_start.N() != n) { if(xl.max() > -1e19) { cout << "ff-IPOPT warm start : lower simple bounds start multipliers array doesn't have the expected size (" << lz_start.N() << "!=" << n << ")." << endl; cout << " "; if(lz_start.N()==0) cout << "maybe because no lower bounds multiplier has been given. " << endl; cout << " Initializing them to 1..." << endl; } lz_start.resize(n); lz_start=1.; } KnToPtr(uz_start, z_U); KnToPtr(lz_start, z_L); } if(init_lambda) { if(lambda_start.N() != m) { cout << "ff-IPOPT warm start : constraints start multipliers array doesn't have the expected size (" << lambda_start.N() << "!=" << m << ")." << endl; cout << " "; if(lambda_start.N()==0) cout << "maybe because no constraints multiplier has been given. " << endl; cout << " Initializing them to 1..." << endl; lambda_start.resize(m); lambda_start=1.; } KnToPtr(lambda_start, lambda); } return true; } bool ffNLP::eval_f(Index n, const Number* x, bool new_x, Number& obj_value) { assert(n == xstart->N()); Rn X(n); KnFromPtr(X,x); obj_value = fitness->J(X); return true; } bool ffNLP::eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f) { assert(n == xstart->N()); Rn X(n); KnFromPtr(X,x); Rn _grad_f=dfitness->J(X); KnToPtr(_grad_f,grad_f); return true; } bool ffNLP::eval_g(Index n, const Number* x, bool new_x, Index m, Number* g) { Rn X(n); KnFromPtr(X,x); if(constraints) { Rn _g=constraints->J(X); KnToPtr(_g,g); } return true; } bool ffNLP::eval_jac_g(Index n, const Number* x, bool new_x,Index m, Index nele_jac, Index* iRow, Index *jCol,Number* values) { assert(n==xstart->N()); Rn X(n); if(x) KnFromPtr(X,x); else X=*xstart; if(values==0) { int k=0; for(SparseMatStructure::const_iterator i=JacStruct.begin(); i != JacStruct.end(); ++i) { iRow[k] = i->first; jCol[k] = i->second; ++k; } } else if(dconstraints) { Matrice_Creuse* M = dconstraints->J(X); MatriceMorse *MM = dynamic_cast* >(&(*M->A)); //ugly! for(int i=0;iN;++i) { for(int k=MM->lg[i]; k < MM->lg[i+1]; ++k) { if(checkstruct) { int kipopt = FindIndex(JacStruct.Raws(),JacStruct.Cols(),i,MM->cl[k],0,nele_jac-1); if(kipopt>=0) values[kipopt] = MM->a[k]; } else values[k] = MM->a[k]; } } } return true; } bool ffNLP::eval_h(Index n, const Number* x, bool new_x,Number obj_factor, Index m, const Number* lambda,bool new_lambda, Index nele_hess, Index* iRow,Index* jCol, Number* values) { Rn X(n),L(m); if(x) KnFromPtr(X,x); else X=*xstart; if(lambda) KnFromPtr(L,lambda); else L=0.; bool NLCHPE = hessian->NLCHPEnabled(); Number _obj_factor = NLCHPE ? 1. : obj_factor; if(values==0) { int k=0; for(SparseMatStructure::const_iterator i=HesStruct.begin(); i != HesStruct.end(); ++i) { iRow[k] = i->first; jCol[k] = i->second; ++k; } } else { Matrice_Creuse* M=0; if(NLCHPE) M=hessian->J(X,obj_factor,L); else M=hessian->J(X); MatriceMorse *MM = dynamic_cast* >(&(*M->A));//ugly! if(MM) { if(checkstruct) { for(int i=0;iN;++i) { for(int k=MM->lg[i]; k < MM->lg[i+1]; ++k) { int kipopt = FindIndex(HesStruct.Raws(),HesStruct.Cols(),i,MM->cl[k],0,nele_hess-1); if(kipopt>=0) values[kipopt] = _obj_factor * (MM->a[k]); //else values[k] = (hessian->paramof &&hessian->paramlm ? 1. : obj_factor) * (MM->a[k]); } } } else if(! MM->symetrique) { for(int i=0,kipopt=0;iN;++i) { for(int k=MM->lg[i]; k < MM->lg[i+1]; ++k) { if(i >= MM->cl[k]) { values[kipopt] = _obj_factor * (MM->a[k]); ++kipopt; } } } } else { for(int i=0;iN;++i) { for(int k=MM->lg[i]; k < MM->lg[i+1]; ++k) values[k] = _obj_factor * (MM->a[k]); } } } } return true; } void ffNLP::finalize_solution(SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value,const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq) { KnFromPtr(*xstart,x); KnFromPtr(lambda_start,lambda); KnFromPtr(lz_start, z_L); KnFromPtr(uz_start, z_U); final_value = obj_value; } /***************************************************************************************************************************** * Assumptions : these are tags used as template parameters for case specific function wrapping or warning message in the * interface. Some case can be added here (but some class has to be specialized for the new cases) * AssumptionF : undeff --> undefined case (not used) * no_assumption_f --> most general case when the fitness function and all its derivative are coded in the * freefem script with the func keyword (type Polymorphic in c++). These functions * are then wrapped in GeneralFunc objects. * P2_f --> no longer used (it was used for fitness and its gradient defined as func in freefem * script, while the hessian is a constant matrix directly given to the interface, but * it leads to ambiguities). * unavailable_hessian --> fitness function and its gradients coded with func in the ff script, wrapped into * GeneralFunc objects, without second order derivative function. Enables the BFGS * option of IPOPT. * mv_P2_f --> fitness function is a P2 function which will be defined by a [matrix,vector] array. * The functions are passed to the ffNLP object as P2ScalarFunc, P1VectorFunc and * ConstantSparseMatFunc respectively for the fitness function, its gradient and its * hessian (with all vf=1). * quadratic_f --> f is a pure quadratic fonction, defined by a single matrix. Same type as mv_P2_f * for function wrappers with a vf=0 tag. * linear_f --> f is a linear form, defined by a single vector. Same type as mv_P2_f * for function wrappers with a vf=0 tag. * AssumptionG : undeff --> undefined case (not used) * no_assumption_f --> most general case when the constraint functions and all its derivative are coded in * the freefem script with the func keyword (type Polymorphic in c++). These functions * are then wrapped in GeneralFunc objects. * P1_g --> no longer used (it was used for constraints defined as func in freefem script * , while the jacobian is a constant matrix directly given to the interface, but * it leads to ambiguities). * mv_P1_g --> Constraints function is a P1 function which will be defined by a [matrix,vector] * array. The functions are passed to the ffNLP object as P1VectorFunc and * ConstantSparseMatFunc respectively for the constraints and its jacobian (with * all vf=0). * linear_g --> Constraints are linear, defined by a single matrix. Same type as mv_P1_g * for function wrappers with a vf=0 tag. * Case : templatized with a pair of AssumptionF and AssumptionG, is used to build different constructor for the interface * class in order to overload the freefem function which will call IPOPT *****************************************************************************************************************************/ enum AssumptionF {undeff,no_assumption_f, P2_f, unavailable_hessian, mv_P2_f, quadratic_f, linear_f}; enum AssumptionG {undefg,without_constraints, no_assumption_g, P1_g, mv_P1_g, linear_g}; template struct Case { Case() {} static const AssumptionF af=AF; static const AssumptionG ag=AG; }; /***************************************************************************************************************************** * CheckMatrixVectorPair : Small function taking an E_Array and check whether the type of the 2 objects contained in the * array are matrix and vector. Returns false if types are not matrix/vector. * order is modified to know whether the matrix is in first position or not. *****************************************************************************************************************************/ bool CheckMatrixVectorPair(const E_Array *mv,bool &order) { const aType t1 = (*mv)[0].left(), t2 = (*mv)[1].left(); if(NXOR(t1 == atype*>() , t2 == atype*>())) return false; else if(NXOR(t1 == atype(),t2 == atype())) return false; else { order = (t1 == atype*>()); return true; } } /***************************************************************************************************************************** * The following class offers a polymorphic way to build the function wrappers to pass to the ffNLP object * Each element of the assumption enum define a "FunctionDatas" class in which the constructor and the operator() makes * case specific task. * If some new value in the Assumption enums are to be added, the FitnessFunctionDatas and/or ConstraintFunctionDatas with * the new value as template parameter has to be specialized. * What should the method do is (exemple at the end of the file with already coded cases): * Constructor : define the Expression members using the arguments passed to the IPOPT function in the script * operator() : allocate with appropriate dynamic type the ScalarFunc, VectorFunc, SparseMatFunc pointers, and display some * case dependant errors or warnings (note that there is no ScalarFunc ptr to allocate for constraints) *****************************************************************************************************************************/ class GenericFitnessFunctionDatas { public: static GenericFitnessFunctionDatas* New(AssumptionF,const basicAC_F0 &,Expression const *,const C_F0&,const C_F0&,const C_F0&); bool CompletelyNonLinearConstraints; Expression JJ,GradJ,Hessian; GenericFitnessFunctionDatas() : CompletelyNonLinearConstraints(true),JJ(0),GradJ(0),Hessian(0) {} virtual const AssumptionF A() const {return undeff;} virtual void operator()(Stack,const C_F0&,const C_F0&,const C_F0&,Expression const *,ScalarFunc *&,VectorFunc *&,SparseMatFunc *&,bool) const = 0; //Build the functions virtual ~GenericFitnessFunctionDatas() {} }; template class FitnessFunctionDatas : public GenericFitnessFunctionDatas //not really a template, since most of the methods of all cases have to be specialized { public: FitnessFunctionDatas(const basicAC_F0 &,Expression const *,const C_F0 &,const C_F0 &,const C_F0 &); const AssumptionF A() const {return AF;} void operator()(Stack,const C_F0&,const C_F0&,const C_F0&,Expression const *,ScalarFunc *&,VectorFunc *&,SparseMatFunc *&,bool) const; }; class GenericConstraintFunctionDatas { public: static GenericConstraintFunctionDatas* New(AssumptionG,const basicAC_F0 &,Expression const *,const C_F0 &); Expression Constraints,GradConstraints; GenericConstraintFunctionDatas() : Constraints(0),GradConstraints(0) {} virtual const AssumptionG A() const {return undefg;} virtual const bool WC() const =0;//with constraints virtual void operator()(Stack,const C_F0 &,Expression const *,VectorFunc *&,SparseMatFunc *&,bool) const = 0;//build the functions` virtual ~GenericConstraintFunctionDatas() {} }; template class ConstraintFunctionDatas : public GenericConstraintFunctionDatas { public: ConstraintFunctionDatas(const basicAC_F0 &,Expression const *,const C_F0 &); const AssumptionG A() const {return AG;} const bool WC() const {return AG!=without_constraints;} void operator()(Stack,const C_F0&,Expression const *,VectorFunc *&,SparseMatFunc *&,bool) const ; }; /***************************************************************************************************************************** * OptimIpopt & OptimIpopt::E_Ipopt - The interface class * Do the link beetween freefem and Ipopt *****************************************************************************************************************************/ class OptimIpopt : public OneOperator { public: const AssumptionF AF; const AssumptionG AG; class E_Ipopt : public E_F0mps { private: bool spurious_cases; public: const AssumptionF AF; const AssumptionG AG; const bool WC; std::set unused_name_param; //In some case, some parameter are usless, this is the list of their index in nargs void InitUNP(); //Initialize unusued_name_param at freefem compile time static basicAC_F0::name_and_type name_param[]; static const int n_name_param=29; Expression nargs[n_name_param]; Expression X; mutable Rn lm; C_F0 L_m; C_F0 inittheparam,theparam,closetheparam; C_F0 initobjfact,objfact; GenericFitnessFunctionDatas * fitness_datas; GenericConstraintFunctionDatas * constraints_datas; bool arg(int i,Stack stack,bool a) const {return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} Rn_ arg(int i,Stack stack,Rn_ a) const {return nargs[i] ? GetAny((*nargs[i])(stack)) : a;} template T Arg(int i,Stack s) const {return GetAny( (*nargs[i])(s));} E_Ipopt(const basicAC_F0 & args,AssumptionF af,AssumptionG ag) : lm(),L_m(CPValue(lm)),AF(af),AG(ag),WC(ag!=without_constraints),unused_name_param(), spurious_cases(false),fitness_datas(0),constraints_datas(0) { InitUNP(); int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); initobjfact = currentblock->NewVar("objective factor",atype()); //C_F0 initlm = currentblock->NewVar("lagrange multiplier",atype *>(),L_m); theparam = currentblock->Find("the parameter"); // the expression for the parameter objfact = currentblock->Find("objective factor"); args.SetNameParam(n_name_param,name_param,nargs); fitness_datas = GenericFitnessFunctionDatas::New(AF,args,nargs,theparam,objfact,L_m); //Creates links to the freefem objects constraints_datas = GenericConstraintFunctionDatas::New(AG,args,nargs,theparam); //defining the functions spurious_cases = AG==no_assumption_g && (AF==P2_f || AF==mv_P2_f || AF==quadratic_f || AF==linear_f); closetheparam=currentblock->close(currentblock); // the cleanning block expression } ~E_Ipopt() { if(fitness_datas) delete fitness_datas; if(constraints_datas) delete constraints_datas; } virtual AnyType operator()(Stack stack) const { double cost = nan(""); WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Rn &x = *GetAny((*X)(stack)); { Expression test(theparam); //in some case the KN object associated to the param is never initialized, leading to failed assertion in KN::destroy Rn *tt = GetAny((*test)(stack)); //this lines prevent this to happen *tt = x; } long n=x.N(); bool warned=false; cout << endl; if(spurious_cases) { cout << "ff-IPOPT Spurious case detected : the hessian is defined as a constant matrix but constraints are given in function form." << endl; cout << "If they are not affine, the optimization is likely to fail. In this case, try one of the following suggestions:" << endl; cout << " - if constraints have computable hessians, use function form for the fitness function and all its derivatives" << endl; cout << " and check the documentation to know how to express the whole lagrangian hessian." << endl; cout << " - if constraints hessians are difficult to obtain, force the BFGS mode using named parameter "<< name_param[12].name<< '.' << endl; cout << "Do not worry about this message if you know all your constraints has a constant null hessian." << endl << endl; } if(nargs[7]) cout << "ff-IPOPT : the named parameter autostruct is no longer used in this version of the interface." << endl; //Detection of mixed case dependant warnings or error for(int i=0;i " << name_param[8].name << " is useless because there should not be any function returning matrix in your problem," << endl; cout << " (2 functions can only be J and dJ). You may as well have forgotten one function (IPOPT will certainly crash if so)." << endl; } if(AF!=no_assumption_f && AF!=unavailable_hessian && AG!=no_assumption_g && nargs[5]) { cout << " ==> your lagrangian hessian is a constant matrix, so there is no need to specify its structure with " << name_param[5].name << endl; cout << " since it is contained in the matrix object." << endl; } if(AF!=no_assumption_f && AF!=unavailable_hessian && AG!=no_assumption_g && nargs[7]) { cout << " ==> " << name_param[7].name << " will be ignored since all matrices are constants and constraints do not" << endl; cout << " contribute to the hessian, matrix structure determination is trivial." << endl; } if(AF==unavailable_hessian && AG!=no_assumption_g && (nargs[7] || nargs[8])) { cout << " ==> " << name_param[7].name << " or " << name_param[8].name << " will be ignored since the only matrix you have passed is constant. " << endl; cout << " Or maybe did you forget to pass a function (IPOPT will certainly crash if so)." << endl; } if(AF!=no_assumption_f && AF!=unavailable_hessian && AG!=no_assumption_g && nargs[8]) { cout << " ==> no need to use " << name_param[8].name << " since all matrices are constant, structures won't change through the algorithm," << endl; cout << " it is automatically set to the default disabling value." << endl; } } long iprint = verbosity; ScalarFunc *ffJ=0; VectorFunc *ffdJ=0,*ffC=0; SparseMatFunc *ffH=0,*ffdC=0; (*fitness_datas)(stack,theparam,objfact,L_m,nargs,ffJ,ffdJ,ffH,warned);//Fill the functions (*constraints_datas)(stack,theparam,nargs,ffC,ffdC,warned); Rn xl(n),xu(n),gl(nargs[2] ? Arg(2,stack).N() : 0),gu(nargs[3] ? Arg(3,stack).N() : 0); int mmm=0; if(WC && (gl.N()+gu.N())==0) { cout << "IPOPT Warning : constrained problem without constraints bounds." << endl; mmm = ffC->J(x).N(); } else mmm=gl.N()>gu.N() ? gl.N() : gu.N(); Rn_ *lag_mul=0,*l_z=0,*u_z=0;//Rn(mmm,1.); //int niter=arg(6,stack,100L); int autostructmode = ffNLP::one_evaluation; bool checkindex = (AF!=no_assumption_f && AG!=no_assumption_g) ? false : arg(8,stack,true), cberror=false; if(nargs[0]) xl=Arg(0,stack); else xl=-1.e19; if(nargs[1]) xu=Arg(1,stack); else xu=1.e19; if(nargs[2]) gl=Arg(2,stack); else {gl.resize(mmm); gl=-1.e19;} if(nargs[3]) gu=Arg(3,stack); else {gu.resize(mmm); gu=1.e19;} const E_Array * ejacstruct = (WC && AF==no_assumption_f && AG==no_assumption_g && nargs[4]) ? dynamic_cast (nargs[4]) : 0, * ehesstruct = (AF==no_assumption_f && nargs[5]) ? dynamic_cast (nargs[5]) : 0; if(nargs[6] && WC) lag_mul = new Rn_(GetAny((*nargs[6])(stack))); if(nargs[21]) l_z = new Rn_(GetAny((*nargs[21])(stack))); if(nargs[20]) u_z = new Rn_(GetAny((*nargs[20])(stack))); SmartPtr optim = new ffNLP(x,xl,xu,gl,gu,ffJ,ffdJ,ffH,ffC,ffdC); ffNLP * _optim = dynamic_cast (&(*optim)); assert(_optim); if(WC && nargs[6]) _optim->lambda_start = *lag_mul; else if(WC) { _optim->lambda_start.resize(mmm); _optim->lambda_start = 1.; } _optim->sigma_start = 1.; if(nargs[21] && nargs[0]) _optim->lz_start = *l_z; else if(nargs[0]) {_optim->lz_start.resize(xl.N()); _optim->lz_start = 1.;} if(nargs[20] && nargs[1]) _optim->uz_start = *u_z; else if(nargs[1]) {_optim->uz_start.resize(xu.N()); _optim->uz_start = 1.;} if(ejacstruct) { if(ejacstruct->nbitem()!=2) ExecError("\nSorry, we were expecting an array with two componants in structjac=[iraw,jcol]"); if((*ejacstruct)[0].left() != atype *>()) CompileError("Sorry, array componants in structjac=[iraw,jcol] must be integer arrays"); if((*ejacstruct)[1].left() != atype *>()) CompileError("Sorry, array componants in structjac=[iraw,jcol] must be integer arrays"); Expression raws = (*ejacstruct)[0], cols = (*ejacstruct)[1]; _optim->SetJacobianStructure(*GetAny*>((*raws)(stack)),*GetAny*>((*cols)(stack)),true); } if(ehesstruct) { if(ehesstruct->nbitem()!=2) ExecError("\nSorry, we were expecting an array with two componants in structhess=[iraw,jcol]"); if((*ehesstruct)[0].left() != atype *>()) CompileError("Sorry, array componants in structhess=[iraw,jcol] must be integer arrays"); if((*ehesstruct)[1].left() != atype *>()) CompileError("Sorry, array componants in structhess=[iraw,jcol] must be integer arrays"); Expression raws = (*ehesstruct)[0], cols = (*ehesstruct)[1]; _optim->SetHessianStructure(*GetAny*>((*raws)(stack)),*GetAny*>((*cols)(stack)),true); } ffNLP::Level lh=ehesstruct ? ffNLP::user_defined : ffNLP::Level(autostructmode),lj=ejacstruct ? ffNLP::user_defined : ffNLP::Level(autostructmode); if(AF==unavailable_hessian) lh=ffNLP::do_nothing; _optim->BuildMatrixStructures(lh,lj,mmm); if(checkindex) _optim->EnableCheckStruct(); SmartPtr app = new IpoptApplication(); //app->Options()->SetNumericValue("tol", 1e-10); if(nargs[9]) app->Options()->SetNumericValue("tol",GetAny((*nargs[9])(stack))); if(nargs[10]) app->Options()->SetIntegerValue("max_iter",GetAny((*nargs[10])(stack))); if(nargs[11]) app->Options()->SetNumericValue("max_cpu_time",GetAny((*nargs[11])(stack))); bool bfgs = nargs[12] ? GetAny((*nargs[12])(stack)) : false; //app->Options()->SetStringValue("hessian_approximation","limited-memory"); if(AF==unavailable_hessian || bfgs) { if(AF==unavailable_hessian && !bfgs) cout << "IPOPT Note : No hessian given ==> LBFGS hessian approximation enabled" << endl; app->Options()->SetStringValue("hessian_approximation","limited-memory"); } if(nargs[13]) { string derivative_test = *GetAny((*nargs[13])(stack)) ; app->Options()->SetStringValue("derivative_test",derivative_test.c_str()); } if(nargs[14]) { string options_file = *GetAny((*nargs[14])(stack)); app->Options()->SetStringValue("option_file_name",options_file.c_str()); } if(nargs[15]) app->Options()->SetIntegerValue("print_level",GetAny((*nargs[15])(stack))); if(AG==without_constraints || AG==mv_P1_g || AG==linear_g) { app->Options()->SetStringValue("jac_c_constant","yes"); app->Options()->SetStringValue("jac_d_constant","yes"); } if(AF==mv_P2_f || AF==quadratic_f || AF==linear_f) app->Options()->SetStringValue("hessian_constant","yes"); if(nargs[16]) app->Options()->SetNumericValue("derivative_test_perturbation",GetAny((*nargs[16])(stack))); if(nargs[17]) app->Options()->SetNumericValue("derivative_test_tol",GetAny((*nargs[16])(stack))); if(nargs[18]) app->Options()->SetStringValue("fixed_variable_treatment",GetAny((*nargs[18])(stack))->c_str()); if(nargs[19]) { app->Options()->SetStringValue("warm_start_init_point","yes"); if(WC && !nargs[6]) { cout << "ff-IPOPT Warning : warm start for constrained problem without initial constraints dual variables (" << name_param[6].name << " parameter)." << endl; cout << " ==> Starting with " << name_param[6].name << "=(1,1,...,1)." << endl; } if(nargs[0] && !nargs[21]) { cout << "ff-IPOPT Warning : warm start with simple lower bounds without initial lower bounds dual variables (" << name_param[21].name << " parameter)." << endl; cout << " ==> Starting with " << name_param[21].name << "=(1,1,...,1)." << endl; } if(nargs[1] && !nargs[20]) { cout << "ff-IPOPT Warning : warm start with simple upper bounds without initial upper bounds dual variables (" << name_param[20].name << " parameter)." << endl; cout << " ==> Starting with " << name_param[20].name << "=(1,1,...,1)." << endl; } if(l_z) _optim->lz_start = *l_z; if(u_z) _optim->uz_start = *u_z; if(lag_mul) _optim->lambda_start = *lag_mul; } if(nargs[22]) app->Options()->SetNumericValue("mu_init",GetAny((*nargs[22])(stack))); else app->Options()->SetStringValue("mu_strategy", "adaptive"); if(nargs[23]) app->Options()->SetNumericValue("mumps_pivtol",GetAny((*nargs[23])(stack))); if(nargs[24]) app->Options()->SetNumericValue("bound_relax_factor",GetAny((*nargs[24])(stack))); if(nargs[25]) app->Options()->SetStringValue("mu_strategy",GetAny((*nargs[25])(stack))->c_str()); if(nargs[27]) app->Options()->SetNumericValue("mu_min",GetAny((*nargs[27])(stack))); if(nargs[28]) if(!GetAny((*nargs[28])(stack))) app->Options()->SetStringValue("accept_every_trial_step","yes"); //if(nargs[26]) app->Options()->SetNumericValue("obj_scaling_factor",GetAny((*nargs[26])(stack))); if(verbosity>1) app->Options()->SetStringValue("print_user_options","yes"); app->Options()->SetStringValue("output_file", "ipopt.out"); if(AF!=no_assumption_f && AF!=unavailable_hessian && AG!=no_assumption_g) app->Options()->SetStringValue("mehrotra_algorithm", "yes"); ApplicationReturnStatus status; app->Initialize(); // Ask Ipopt to solve the problem status = app->OptimizeTNLP(optim); if(lag_mul) *lag_mul = _optim->lambda_start; if(l_z) *l_z = _optim->lz_start; if(u_z) *u_z = _optim->uz_start; cost = _optim->final_value; if(nargs[26]) { double *pfv = GetAny((*nargs[26])(stack)); *pfv = cost; } if(verbosity) { if(status == Solve_Succeeded) printf("\n\n*** Ipopt succeeded \n"); else if(static_cast(status)<0) printf("\n\n*** Ipopt failure!\n"); else printf("\n\n*** Ipopt mixed results.\n"); } clean(lag_mul); clean(l_z); clean(u_z); clean(ffJ); clean(ffdJ); clean(ffH); clean(ffC); clean(ffdC); if(lm) lm.destroy(); // clean memory of LM closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return SetAny(static_cast(static_cast(status))); //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const {return new E_Ipopt(args,AF,AG);} //Constructors - they define the different prototype of the overloaded IPOPT function reachable in freefem scripts OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype(),atype(),atype *>()), AF(no_assumption_f),AG(no_assumption_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype *>()), AF(no_assumption_f),AG(without_constraints) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype(),atype *>(),atype *>()), AF(no_assumption_f),AG(P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype(),atype *>()), AF(no_assumption_f),AG(mv_P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype*>(),atype *>()), AF(no_assumption_f),AG(linear_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype *>(),atype(),atype *>(),atype *>()), AF(P2_f),AG(P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype *>(),atype *>()), AF(P2_f),AG(without_constraints) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype *>(),atype(),atype(),atype *>()), AF(P2_f),AG(no_assumption_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype*>(),atype(),atype *>()), AF(P2_f),AG(mv_P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype*>(),atype*>(),atype *>()), AF(P2_f),AG(linear_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype(),atype *>()), AF(unavailable_hessian),AG(no_assumption_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype *>()),AF(unavailable_hessian),AG(without_constraints) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype*>(),atype *>()), AF(unavailable_hessian),AG(P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype*>()), AF(unavailable_hessian),AG(mv_P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype*>(),atype*>()), AF(unavailable_hessian),AG(linear_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype(),atype*>()), AF(mv_P2_f),AG(no_assumption_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype*>()), AF(mv_P2_f),AG(without_constraints) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype*>(),atype*>()), AF(mv_P2_f),AG(P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype(),atype*>()), AF(mv_P2_f),AG(mv_P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype(),atype*>(),atype*>()), AF(mv_P2_f),AG(linear_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype(),atype(),atype*>()), AF(quadratic_f),AG(no_assumption_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype*>()), AF(quadratic_f),AG(without_constraints) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype(),atype*>(),atype*>()), AF(quadratic_f),AG(P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype(),atype*>()), AF(quadratic_f),AG(mv_P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype*>(),atype*>()), AF(quadratic_f),AG(linear_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype(),atype(),atype*>()), AF(linear_f),AG(no_assumption_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype*>()), AF(linear_f),AG(without_constraints) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype(),atype*>(),atype*>()), AF(linear_f),AG(P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype(),atype*>()), AF(linear_f),AG(mv_P1_g) {} OptimIpopt(Case) : OneOperator(atype(),atype*>(),atype*>(),atype*>()), AF(linear_f),AG(linear_g) {} }; /* enum AssumptionF {no_assumption_f, P2_f, unavailable_hessian, mv_P2_f, quadratic_f,linear_f}; enum AssumptionG {without_constraints, no_assumption_g, P1_g, mv_P1_g, linear_g}; */ //Case dependant initialization of unused_name_param //exemple : AF==no_assumption_f && AG==without_constraints ==> no constraint related named parameter should be used (index 2,3,4,6 - first integer is how many are not used) void OptimIpopt::E_Ipopt::InitUNP() { if(AF==no_assumption_f && AG==no_assumption_g) {} //no unused named parameter if(AF==no_assumption_f && AG==without_constraints) AddElements(unused_name_param,4,2,3,4,6); if(AF==no_assumption_f && AG==P1_g) AddElements(unused_name_param,1,4); if(AF==no_assumption_f && AG==mv_P1_g) AddElements(unused_name_param,1,4); if(AF==no_assumption_f && AG==linear_g) AddElements(unused_name_param,1,4); if(AF==P2_f && AG==P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==P2_f && AG==without_constraints) AddElements(unused_name_param,8,2,3,4,5,6,7,8,12); if(AF==P2_f && AG==no_assumption_g) AddElements(unused_name_param,1,5); if(AF==P2_f && AG==mv_P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==P2_f && AG==linear_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==unavailable_hessian && AG==no_assumption_g) AddElements(unused_name_param,1,5); if(AF==unavailable_hessian && AG==without_constraints) AddElements(unused_name_param,7,2,3,4,5,6,7,8); if(AF==unavailable_hessian && AG==P1_g) AddElements(unused_name_param,4,4,5,7,8); if(AF==unavailable_hessian && AG==mv_P1_g) AddElements(unused_name_param,4,4,5,7,8); if(AF==unavailable_hessian && AG==linear_g) AddElements(unused_name_param,4,4,5,7,8); if(AF==mv_P2_f && AG==without_constraints) AddElements(unused_name_param,8,2,3,4,5,6,7,8,12); if(AF==mv_P2_f && AG==no_assumption_g) AddElements(unused_name_param,1,5); if(AF==mv_P2_f && AG==P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==mv_P2_f && AG==mv_P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==mv_P2_f && AG==linear_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==quadratic_f && AG==without_constraints) AddElements(unused_name_param,8,2,3,4,5,6,7,8,12); if(AF==quadratic_f && AG==no_assumption_g) AddElements(unused_name_param,1,5); if(AF==quadratic_f && AG==P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==quadratic_f && AG==mv_P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==quadratic_f && AG==linear_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==linear_f && AG==without_constraints) AddElements(unused_name_param,8,2,3,4,5,6,7,8,12); if(AF==linear_f && AG==no_assumption_g) AddElements(unused_name_param,1,5); if(AF==linear_f && AG==P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==linear_f && AG==mv_P1_g) AddElements(unused_name_param,5,4,5,7,8,12); if(AF==linear_f && AG==linear_g) AddElements(unused_name_param,5,4,5,7,8,12); } basicAC_F0::name_and_type OptimIpopt::E_Ipopt::name_param[]= { //DONT CHANGE THE ORDER!!!! If some parameters need to be added, add them after the last one //otherwize warning message of this interface will be a mess {"lb", &typeid(KN_) }, //0 - lower bound on optimization parameter X {"ub", &typeid(KN_) }, //1 - upper bound on optimization parameter X {"clb", &typeid(KN_) }, //2 - constraints lower bounds {"cub", &typeid(KN_) }, //3 - constraints upper bounds {"structjacc",&typeid(E_Array)}, //4 - constraints jacobian structure {"structhess",&typeid(E_Array)}, //5 - lagrangian hessian structure {"lm", &typeid(KN_)}, //6 - lagrange multiplier (for autostruct or to get their value at the end of the algorithm) {"autostruct",&typeid(long)}, //7 - automatic structure determination {"checkindex",&typeid(bool)}, //8 - whether to use the FindIndex function or not {"tol", &typeid(double)}, //9 - stopping criteria tol {"maxiter", &typeid(long)}, //10 - stopping criteria : maximum number of iterations {"maxcputime",&typeid(double)}, //11 - stopping criteria : maximum CPU time {"bfgs", &typeid(bool)}, //12 - force the bfgs hessian approximation {"derivativetest", &typeid(string*)}, //13 - call the derivative checker {"optfile", &typeid(string*)}, //14 - set the ipopt option file name (default is ipopt.opt) {"printlevel",&typeid(long)}, //15 - controls IPOPT print level output {"dth", &typeid(double)}, //16 - perturbation for finite difference derivative test {"dttol", &typeid(double)}, //17 - relative tolerence for the derivative test error detection {"fixedvar", &typeid(string*)}, //18 - remove the equality simple bounds from problem {"warmstart", &typeid(bool)}, //19 - do we initialize multipliers with given values {"uz", &typeid(KN_) }, //20 - simple upper bounds dual variable {"lz", &typeid(KN_) }, //21 - simple lower bounds dual variable {"muinit", &typeid(double) }, //22 - barrier parameter initialization {"pivtol", &typeid(double) }, //23 - pivot tolerance for the linear solver {"brf", &typeid(double) }, //24 - bounds relax factor {"mustrategy",&typeid(string*) }, //25 - strategy for barrier parameter update {"objvalue", &typeid(double*) }, //26 - to get the last objective function value {"mumin", &typeid(double) }, //27 - minimal value for the barrier parameter {"linesearch",&typeid(bool) } //28 - use the line search or not (if no, the usual Newton step is kept) //{"osf", &typeid(double) } //26 - objective function scalling factor }; /* class Init { public: Init(); }; static Init init; */ static void Load_Init() { Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); //Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); /*Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case()));*/ Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); //Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); //Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); //Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); //Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); Global.Add("IPOPT","(",new OptimIpopt(Case())); } /***************************************************************************************************************************** * Specialization of functions builders' constructor and operator() *****************************************************************************************************************************/ template<> FitnessFunctionDatas::FitnessFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m) : GenericFitnessFunctionDatas() { const Polymorphic * opJ = dynamic_cast(args[0].LeftValue()), * opdJ = dynamic_cast(args[1].LeftValue()), * opH = dynamic_cast(args[2].LeftValue()); ArrayOfaType hprototype2(atype *>(),atype(),atype*>()),hprototype1(atype *>()); JJ = to(C_F0(opJ,"(",theparam)); GradJ = to(C_F0(opdJ,"(",theparam)); if(opH->Find("(",hprototype2)) { CompletelyNonLinearConstraints = true; Hessian = to* >(C_F0(opH,"(",theparam,objfact,L_m)); } else if(opH->Find("(",hprototype1)) { CompletelyNonLinearConstraints = false; //When constraints are affine, lagrange multipliers are not used in the hessian, obj_factor is also hidden to the user Hessian = to* >(C_F0(opH,"(",theparam)); } else CompileError("Error, wrong hessian function prototype. Must be either (real[int] &) or (real[int] &,real,real[int] &)"); } template<> void FitnessFunctionDatas::operator() (Stack stack,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m,Expression const *nargs,ScalarFunc *&ffJ,VectorFunc *&ffdJ,SparseMatFunc *&ffH,bool warned) const { ffJ = new GeneralFunc(stack,JJ,theparam); ffdJ = new GeneralFunc(stack,GradJ,theparam); if(CompletelyNonLinearConstraints) ffH = new GeneralSparseMatFunc(stack,Hessian,theparam,objfact,L_m); else ffH = new GeneralSparseMatFunc(stack,Hessian,theparam); } template<> FitnessFunctionDatas::FitnessFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m) : GenericFitnessFunctionDatas() { CompletelyNonLinearConstraints = false; const Polymorphic * opJ = dynamic_cast(args[0].LeftValue()),* opdJ = dynamic_cast(args[1].LeftValue()); JJ = to(C_F0(opJ,"(",theparam)); GradJ = to(C_F0(opdJ,"(",theparam)); Hessian = to *>(args[2]); } template<> void FitnessFunctionDatas::operator() (Stack stack,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m,Expression const *nargs,ScalarFunc *&ffJ,VectorFunc *&ffdJ,SparseMatFunc *&ffH,bool warned) const { if(warned && nargs[5]) { cout << " ==> your lagrangian hessian is a constant matrix, so there is no need to specify its structure with "; cout << OptimIpopt::E_Ipopt::name_param[5].name << endl; cout << " since it is contained in the matrix object." << endl; } ffJ = new GeneralFunc(stack,JJ,theparam); ffdJ = new GeneralFunc(stack,GradJ,theparam); ffH = new ConstantSparseMatFunc(stack,Hessian); } template<> FitnessFunctionDatas::FitnessFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m) : GenericFitnessFunctionDatas() { CompletelyNonLinearConstraints = false; const Polymorphic * opJ = dynamic_cast (args[0].LeftValue()),* opdJ = dynamic_cast(args[1].LeftValue()); JJ = to(C_F0(opJ,"(",theparam)); GradJ = to(C_F0(opdJ,"(",theparam)); } template<> void FitnessFunctionDatas::operator() (Stack stack,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m,Expression const *nargs,ScalarFunc *&ffJ,VectorFunc *&ffdJ,SparseMatFunc *&ffH,bool warned) const { if(warned && nargs[5]) { cout << " ==> no hessian has been given, the LBFGS mode has been enabled, thus making "; cout << OptimIpopt::E_Ipopt::name_param[5].name << " useless. You may also" << endl << " have forgoten a function (IPOPT will certainly crash if so)." << endl; } ffJ = new GeneralFunc(stack,JJ,theparam); ffdJ = new GeneralFunc(stack,GradJ,theparam); ffH = 0; } template<> FitnessFunctionDatas::FitnessFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m) : GenericFitnessFunctionDatas() { const E_Array *M_b = dynamic_cast(args[0].LeftValue()); if(M_b->nbitem() != 2) CompileError("\nSorry, we were expecting an array with two componants, either [M,b] or [b,M] for the affine constraints expression." ); bool order = true; if(CheckMatrixVectorPair(M_b,order)) { Hessian = to *>((*M_b)[order ? 0:1]); GradJ = to((*M_b)[order ? 1:0]); //This is gradJ evaluated on x=0 } } template<> void FitnessFunctionDatas::operator() (Stack stack,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m,Expression const *nargs,ScalarFunc *&ffJ,VectorFunc *&ffdJ,SparseMatFunc *&ffH,bool warned) const { if(warned && nargs[5]) { cout << " ==> your lagrangian hessian is a constant matrix, so there is no need to specify its structure with "; cout << OptimIpopt::E_Ipopt::name_param[5].name << endl; cout << " since it is contained in the matrix object." << endl; } ffJ = new P2ScalarFunc(stack,Hessian,GradJ,true); ffdJ = new P1VectorFunc(stack,Hessian,GradJ,true); ffH = new ConstantSparseMatFunc(stack,Hessian); } template<> FitnessFunctionDatas::FitnessFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m) : GenericFitnessFunctionDatas() {Hessian = to *>(args[0]);} template<> void FitnessFunctionDatas::operator() (Stack stack,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m,Expression const *nargs,ScalarFunc *&ffJ,VectorFunc *&ffdJ,SparseMatFunc *&ffH,bool warned) const { if(warned && nargs[5]) { cout << " ==> your lagrangian hessian is a constant matrix, so there is no need to specify its structure with "; cout << OptimIpopt::E_Ipopt::name_param[5].name << endl; cout << " since it is contained in the matrix object." << endl; } ffJ = new P2ScalarFunc(stack,Hessian,0,true); ffdJ = new P1VectorFunc(stack,Hessian,0,true); ffH = new ConstantSparseMatFunc(stack,Hessian); } template<> FitnessFunctionDatas::FitnessFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m) : GenericFitnessFunctionDatas() {GradJ = to(args[0]);} template<> void FitnessFunctionDatas::operator() (Stack stack,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &L_m,Expression const *nargs,ScalarFunc *&ffJ,VectorFunc *&ffdJ,SparseMatFunc *&ffH,bool warned) const { if(warned && nargs[5]) { cout << " ==> your lagrangian hessian is a null matrix, so there is no need to specify its structure with "; cout << OptimIpopt::E_Ipopt::name_param[5].name << endl; cout << " since it is empty." << endl; } ffJ = new P2ScalarFunc(stack,0,GradJ); ffdJ = new P1VectorFunc(stack,0,GradJ); ffH = 0; } template<> ConstraintFunctionDatas::ConstraintFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam) : GenericConstraintFunctionDatas() {} template<> void ConstraintFunctionDatas::operator()(Stack stack,const C_F0 &theparam,Expression const *nargs,VectorFunc *&ffC,SparseMatFunc *&ffdC,bool warned) const { if(warned) { if(nargs[2] || nargs[3]) cout << " ==> Some constraints bounds have been defined while no constraints function has been passed." << endl; if(nargs[4]) cout << " ==> A structure has been provided for the constraints jacobian but there is no constraint function." << endl; if(nargs[6]) cout << " ==> Unconstrained problem make the use of " << OptimIpopt::E_Ipopt::name_param[6].name << " pointless (see the documentation for more details)." << endl; } ffC = 0; ffdC = 0; } template<> ConstraintFunctionDatas::ConstraintFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam) : GenericConstraintFunctionDatas() { int nbj = args.size()-1; const Polymorphic * opG = dynamic_cast (args[nbj-2].LeftValue()), * opjG= dynamic_cast (args[nbj-1].LeftValue()); Constraints = to(C_F0(opG,"(",theparam)); GradConstraints = to*>(C_F0(opjG,"(",theparam)); } template<> void ConstraintFunctionDatas::operator()(Stack stack,const C_F0 &theparam,Expression const *nargs,VectorFunc *&ffC,SparseMatFunc *&ffdC,bool) const { ffC = new GeneralFunc(stack,Constraints,theparam); ffdC = new GeneralSparseMatFunc(stack,GradConstraints,theparam); } template<> ConstraintFunctionDatas::ConstraintFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam) : GenericConstraintFunctionDatas() { int nbj = args.size()-1; const Polymorphic * opG = dynamic_cast (args[nbj-2].LeftValue()); Constraints = to(C_F0(opG,"(",theparam)); GradConstraints = to *>(args[nbj-1]); } template<> void ConstraintFunctionDatas::operator()(Stack stack,const C_F0 &theparam,Expression const *nargs,VectorFunc *&ffC,SparseMatFunc *&ffdC,bool warned) const { if(warned && nargs[4]) { cout << " ==> your constraints jacobian is a constant matrix, there is no need to specify its structure with " << OptimIpopt::E_Ipopt::name_param[4].name << endl; cout << " since it is contained in the matrix object." << endl; } ffC = new GeneralFunc(stack,Constraints,theparam); ffdC = new ConstantSparseMatFunc(stack,GradConstraints); } template<> ConstraintFunctionDatas::ConstraintFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam) : GenericConstraintFunctionDatas() { int nbj = args.size()-1; const E_Array *M_b = dynamic_cast(args[nbj-1].LeftValue()); if(M_b->nbitem() != 2) CompileError("\nSorry, we were expecting an array with two componants, either [M,b] or [b,M] for the affine constraints expression." ); bool order=true; if(CheckMatrixVectorPair(M_b,order)) { GradConstraints = to *>((*M_b)[order ? 0:1]); Constraints = to((*M_b)[order ? 1:0]); //Constraint on x=0 } else CompileError("\nWrong types in the constraints [matrix,vector] pair, expecting a sparse matrix and real[int]."); } template<> void ConstraintFunctionDatas::operator()(Stack stack,const C_F0 &theparam,Expression const *nargs,VectorFunc *&ffC,SparseMatFunc *&ffdC,bool warned) const { if(warned && nargs[4]) { cout << " ==> your constraints jacobian is a constant matrix, there is no need to specify its structure with " << OptimIpopt::E_Ipopt::name_param[4].name << endl; cout << " since it is contained in the matrix object." << endl; } ffC = new P1VectorFunc(stack,GradConstraints,Constraints); ffdC = new ConstantSparseMatFunc(stack,GradConstraints); } template<> ConstraintFunctionDatas::ConstraintFunctionDatas(const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam) : GenericConstraintFunctionDatas() { int nbj = args.size()-1; GradConstraints = to *>(args[nbj-1]); } template<> void ConstraintFunctionDatas::operator()(Stack stack,const C_F0 &theparam,Expression const *nargs,VectorFunc *&ffC,SparseMatFunc *&ffdC,bool warned) const { if(warned && nargs[4]) { cout << " ==> your constraints jacobian is a constant matrix, there is no need to specify its structure with " << OptimIpopt::E_Ipopt::name_param[4].name << endl; cout << " since it is contained in the matrix object." << endl; } ffC = new P1VectorFunc(stack,GradConstraints,0); ffdC = new ConstantSparseMatFunc(stack,GradConstraints); } GenericFitnessFunctionDatas* GenericFitnessFunctionDatas::New(AssumptionF AF,const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam,const C_F0 &objfact,const C_F0 &lm) { switch (AF) { case no_assumption_f: return new FitnessFunctionDatas(args,nargs,theparam,objfact,lm); break; case P2_f: return new FitnessFunctionDatas(args,nargs,theparam,objfact,lm); break; case unavailable_hessian: return new FitnessFunctionDatas(args,nargs,theparam,objfact,lm); break; case mv_P2_f: return new FitnessFunctionDatas(args,nargs,theparam,objfact,lm); break; case quadratic_f: return new FitnessFunctionDatas(args,nargs,theparam,objfact,lm); break; case linear_f: return new FitnessFunctionDatas(args,nargs,theparam,objfact,lm); break; default: return 0; break; } } GenericConstraintFunctionDatas* GenericConstraintFunctionDatas::New(AssumptionG AG,const basicAC_F0 &args,Expression const *nargs,const C_F0 &theparam) { switch (AG) { case no_assumption_g: return new ConstraintFunctionDatas(args,nargs,theparam); break; case without_constraints: return new ConstraintFunctionDatas(args,nargs,theparam); break; case P1_g: return new ConstraintFunctionDatas(args,nargs,theparam); break; case mv_P1_g: return new ConstraintFunctionDatas(args,nargs,theparam); break; case linear_g: return new ConstraintFunctionDatas(args,nargs,theparam); break; default: return 0; break; } } /* enum AssumptionF {undeff,no_assumption_f, P2_f, unavailable_hessian, mv_P2_f, quadratic_f, linear_f}; enum AssumptionG {undefg,without_constraints, no_assumption_g, P1_g, mv_P1_g, linear_g}; */ LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/ff-NLopt.cpp000644 000767 000024 00000124032 12466661714 020635 0ustar00hechtstaff000000 000000 /* * ff-NLopt.cpp * * * Created by Sylvain Auliac on 25/05/11. * */ //ff-c++-LIBRARY-dep: nlopt //ff-c++-cpp-dep: // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Sylvain Auliac // E-MAIL : auliac@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include using namespace std; #include "ff++.hpp" #include extern Block *currentblock; typedef double R; typedef double (*NLoptFuncType)(unsigned,const double *,double *,void*); template struct Info {static const bool DF=true,SA=false; static const char *name;};//DF=Derivative Free , SA=need a Sub Algorithm template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=true; static const char *name;}; template<> struct Info {static const bool DF=false,SA=true; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=false; static const char *name;}; template<> struct Info {static const bool DF=false,SA=true; static const char *name;}; template<> struct Info {static const bool DF=false,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template<> struct Info {static const bool DF=true,SA=true; static const char *name;}; template const char *Info::name = "ALGORITHM"; template<> const char *Info::name = "Dividing Rectangles"; template<> const char *Info::name = "Locally Biased Dividing Rectangles"; template<> const char *Info::name = "Randomized Locally Biased Dividing Rectangles"; template<> const char *Info::name = "Dividing Rectangles (no scaling)"; template<> const char *Info::name = "Locally Biased Dividing Rectangles (no scaling)"; template<> const char *Info::name = "Randomized Locally Biased Dividing Rectangles (no scaling)"; template<> const char *Info::name = "Original Glabonsky's Dividing Rectangles"; template<> const char *Info::name = "Original Glabonsky's Locally Biased Dividing Rectangles"; const char *Info::name = "StoGO"; const char *Info::name = "Randomized StoGO"; const char *Info::name = "Nocedal's Low-Storage BFGS"; const char *Info::name = "Low-Storage BFGS"; template<> const char *Info::name = "Principal Axis"; const char *Info::name = "Rank-1 Shifted Limited Memory Variable Metric"; const char *Info::name = "Rank-2 Shifted Limited Memory Variable Metric"; const char *Info::name = "Truncated Newton"; const char *Info::name = "Steepest Descent Restarting Truncated Newton"; const char *Info::name = "BFGS Preconditionned Truncated Newton"; const char *Info::name = "BFGS Precondionned Truncated Newton with Steepest Descent Resrtarting"; template<> const char *Info::name = "Controlled Random Search with Local Mutation"; const char *Info::name = "Multi-Level Single-Linkage (derivative free)"; const char *Info::name = "Multi-Level Single-Linkage (with gradient-based local search)"; const char *Info::name = "Low Discrepancy Sequence Multi-Level Single-Linkage (derivative free)"; const char *Info::name = "Low Discrepancy Sequence Multi-Level Single-Linkage (with gradient-based local search)"; const char *Info::name = "Method of Moving Asymptotes"; template<> const char *Info::name = "Constrained Optimization by Linear Approximations"; template<> const char *Info::name = "NEWUOA"; template<> const char *Info::name = "NEWUOA for bounded optimization"; template<> const char *Info::name = "Nelder-Mead Simplex"; template<> const char *Info::name = "Subplex"; const char *Info::name = "Inequality/Equality Constraints Augmented Lagrangian (derivative free)"; const char *Info::name = "Inequality/Equality Constraints Augmented Lagrangian (with gradient-based subsidiary search)"; const char *Info::name = "Equality Constraints Augmented Lagrangian (derivative free)"; const char *Info::name = "Equality Constraints Augmented Lagrangian (with gradient-based subsidiary search)"; template<> const char *Info::name = "BOBYQA"; template<> const char *Info::name = "Improved Stochastic Ranking Evolution Strategy"; const char *Info::name = "Sequential Least-Squares Quadratic Programming"; const char *Info::name = "Multi-Level Single-Linkage"; const char *Info::name = "Low Discrepancy Multi-level Single-Linkage"; const char *Info::name = "Inequality/Equality Constraints Augmented Lagrangian"; const char *Info::name = "Equality Constraints Augmented Lagrangian"; inline void Sonde(int i) {cout << "sonde " << i << endl;} typedef KN_ Rn_; typedef KN Rn; typedef KNM_ Rnm_; typedef KNM Rnm; /*template inline std::vector KnToStdVect(const KN &V) { std::vector v(V.n); for(int i=0;i inline std::vector KnToStdVect(const KN_ &V) { std::vector v(V.n); for(int i=0;i class ffcalfunc // to call the freefem function .. J, constraints, and derivatives { public: Stack stack; Expression JJ,theparame; ffcalfunc(const ffcalfunc &f) : stack(f.stack),JJ(f.JJ),theparame(f.theparame) {} ffcalfunc(Stack s,Expression JJJ,Expression epar) : stack(s),JJ(JJJ), theparame(epar) {} K J(Rn_ x) const { KN *p=GetAny *>( (*theparame)(stack) ); *p=x; K ret= GetAny( (*JJ)(stack)); //cout << "call to ffcalfunc.J with " << *p << " and ret=" << ret << endl; WhereStackOfPtr2Free(stack)->clean(); return ret; } }; typedef ffcalfunc * ScalarFunc; typedef ffcalfunc * VectorFunc; typedef ffcalfunc * MatrixFunc; class GenericOptimizer { public: /*GenericOptimizer(nlopt::algorithm ALGO) : opt(ALGO,0),x(0),econsttol(0),iconsttol(0),econstrained(false),iconstrained(false),fit(0),d_fit(0),equaconst(0), d_equaconst(0),ineqconst(0),d_ineqconst(0),subopt(0) {}*/ GenericOptimizer(nlopt::algorithm ALGO,int dim=0) : opt(ALGO,dim),x(0),econsttol(0),iconsttol(0),econstrained(false),iconstrained(false),fit(0),d_fit(0),equaconst(0), d_equaconst(0),ineqconst(0),d_ineqconst(0),subopt(0) {} GenericOptimizer(nlopt::algorithm ALGO,const ffcalfunc &_ff,Rn &xstart) : opt(ALGO,xstart.n),x(&xstart),econsttol(0),iconsttol(0),econstrained(false),iconstrained(false), fit(new ffcalfunc(_ff)),d_fit(0),equaconst(0),d_equaconst(0),ineqconst(0),d_ineqconst(0),subopt(0) { opt.set_min_objective(NLoptFunc, static_cast(this)); } virtual ~GenericOptimizer() { Clean(fit); Clean(d_fit); Clean(equaconst); Clean(d_equaconst); Clean(ineqconst); Clean(d_ineqconst); Clean(subopt); } double operator() () { double minf; vector vv(x->n); for(int i=0;i(val)); return *this;} virtual GenericOptimizer& SetVectorStorage(const int val) {opt.set_vector_storage(static_cast(val)); return *this;} GenericOptimizer& SetObjectiveFunctionGradient(const ffcalfunc &g) {Clean(d_fit) = new ffcalfunc(g); return *this;} GenericOptimizer& SetEqualityConstraintFunction(const ffcalfunc &f) {Clean(equaconst) = new ffcalfunc(f); return *this;} GenericOptimizer& SetEqualityConstraintGradient(const ffcalfunc &g) {Clean(d_equaconst) = new ffcalfunc(g); return *this;} GenericOptimizer& SetInequalityConstraintFunction(const ffcalfunc &f) {Clean(ineqconst) = new ffcalfunc(f); return *this;} GenericOptimizer& SetInequalityConstraintGradient(const ffcalfunc &g) {Clean(d_ineqconst) = new ffcalfunc(g); return *this;} GenericOptimizer& SetEqualityConstraints() { if(econstrained) opt.remove_equality_constraints(); Rn etestv = equaconst->J(*x); if(econsttol.n==0) {econsttol.resize(etestv.n); econsttol = 1.e-12;} else assert(econsttol.n == etestv.n); opt.add_equality_mconstraint(NLoptECDF,static_cast(this),KnToStdVect(econsttol)); econstrained = true; return *this; } GenericOptimizer& SetInequalityConstraints() { if(iconstrained) opt.remove_inequality_constraints(); Rn itestv = ineqconst->J(*x); //cout << "itestv = " << itestv << "(x=" << *x << ")" << endl; if(iconsttol.n==0) {iconsttol.resize(itestv.n); iconsttol = 1.e-12;} else assert(iconsttol.n == itestv.n); opt.add_inequality_mconstraint(NLoptICDF,static_cast(this),KnToStdVect(iconsttol)); iconstrained = true; return *this; } static double NLoptFunc(const std::vector &xx,std::vector &grad, void *data) { GenericOptimizer * pthis = static_cast(data); int n = xx.size(); Rn X(n); for(int i=0;id_fit) { Rn dJ=pthis->d_fit->J(X); for(int i=0;i(x->n); else if(name=="DIRECTL") subopt = new Optimizer(x->n); else if(name=="DIRECTLRand") subopt = new Optimizer(x->n); else if(name=="DIRECTNoScal") subopt = new Optimizer(x->n); else if(name=="DIRECTLNoScal") subopt = new Optimizer(x->n); else if(name=="DIRECTLRandNoScal") subopt = new Optimizer(x->n); else if(name=="OrigDIRECT") subopt = new Optimizer(x->n); else if(name=="OrigDIRECTL") subopt = new Optimizer(x->n); else if(name=="StoGO") subopt = new Optimizer(x->n); else if(name=="StoGORand") subopt = new Optimizer(x->n); else if(name=="LBFGS") subopt = new Optimizer(x->n); else if(name=="PRAXIS") subopt = new Optimizer(x->n); else if(name=="Var1") subopt = new Optimizer(x->n); else if(name=="Var2") subopt = new Optimizer(x->n); else if(name=="TNewton") subopt = new Optimizer(x->n); else if(name=="TNewtonRestart") subopt = new Optimizer(x->n); else if(name=="TNewtonPrecond") subopt = new Optimizer(x->n); else if(name=="TNewtonPrecondRestart") subopt = new Optimizer(x->n); else if(name=="CRS2") subopt = new Optimizer(x->n); else if(name=="MMA") subopt = new Optimizer(x->n); else if(name=="COBYLA") subopt = new Optimizer(x->n); else if(name=="NEWUOA") subopt = new Optimizer(x->n); else if(name=="NEWUOABound") subopt = new Optimizer(x->n); else if(name=="NelderMead") subopt = new Optimizer(x->n); else if(name=="Sbplx") subopt = new Optimizer(x->n); else if(name=="BOBYQA") subopt = new Optimizer(x->n); else if(name=="ISRES") subopt = new Optimizer(x->n); else if(name=="SLSQP") subopt = new Optimizer(x->n); else cout << "Warning: unknown or unauthorized optimizer name passed as sub algorithm to " << Info::name << endl; } if(subopt && save) opt.set_local_optimizer(subopt->opt); return *this; } template::SA> class OptimNLopt : public OneOperator { public: const int cas; class E_NLopt : public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =18; Expression nargs[n_name_param]; Expression X; C_F0 inittheparam,theparam,closetheparam; Expression JJ; Expression GradJ,EIConst,EGradIConst,EEConst,EGradEConst; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} Rn_ arg(int i,Stack stack,Rn_ a) const {return nargs[i] ? GetAny((*nargs[2])(stack)) : a;} template T Arg(int i,Stack s) const {return GetAny( (*nargs[i])(s));} E_NLopt(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } JJ= to(C_F0(opJ,"(",theparam)); const Polymorphic * gradient = nargs[0] ? dynamic_cast(nargs[0]) : 0, * iconst = nargs[1] ? dynamic_cast(nargs[1]) : 0, * gradiconst = nargs[2] ? dynamic_cast(nargs[2]) : 0, * econst = nargs[3] ? dynamic_cast(nargs[3]) : 0, * gradeconst = nargs[4] ? dynamic_cast(nargs[4]) : 0; if(gradient) GradJ = to(C_F0(gradient,"(",theparam)); if(iconst) EIConst = to(C_F0(iconst,"(",theparam)); if(gradiconst) EGradIConst = to(C_F0(gradiconst,"(",theparam)); if(econst) EEConst = to(C_F0(econst,"(",theparam)); if(gradeconst) EGradEConst = to(C_F0(gradeconst,"(",theparam)); closetheparam=currentblock->close(currentblock); // the cleanning block expression } virtual AnyType operator()(Stack stack) const { double cost = 1e100; WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Rn &x = *GetAny((*X)(stack)); long n=x.N(); const bool gradient = nargs[0] ? dynamic_cast(nargs[0]) : 0, iconst = nargs[1] ? dynamic_cast(nargs[1]) : 0, gradiconst = nargs[2] ? dynamic_cast(nargs[2]) : 0, econst = nargs[3] ? dynamic_cast(nargs[3]) : 0, gradeconst = nargs[4] ? dynamic_cast(nargs[4]) : 0; long iprint = verbosity; ffcalfunc ffJ(stack,JJ,theparam); Optimizer optim(ffJ,x); if(nargs[5]) optim.SetLowerBounds(Arg(5,stack)); if(nargs[6]) optim.SetUpperBounds(Arg(6,stack)); if(nargs[7]) optim.SetSCStopFunctionValue(Arg(7,stack)); if(nargs[8]) optim.SetEqualityConstraintsTolerance(Arg(8,stack)); if(nargs[9]) optim.SetSCXRelativeTolerance(Arg(9,stack)); if(nargs[10]) optim.SetSCXAbsoluteTolerance(Arg(10,stack)); if(nargs[11]) optim.SetSCRelativeFunctionTolerance(Arg(11,stack)); if(nargs[12]) optim.SetSCAbsoluteFunctionTolerance(Arg(12,stack)); if(nargs[13]) optim.SetSCMaxFunctionEvaluations(Arg(13,stack)); if(nargs[14]) optim.SetSCEllapsedTime(Arg(14,stack)); if(nargs[15]) optim.SetInequalityConstraintsTolerance(Arg(15,stack)); if(nargs[16]) optim.SetPopulationSize(static_cast(Arg(16,stack))); if(nargs[17]) { optim.SetVectorStorage(static_cast (Arg(17,stack))); if(optim.DF()) cout << "Warning: in " << optim.Name() << " algorithm - using nGradStored is pointless (no gradient to store in a derivative free context)." << endl; else if(ALGO==nlopt::LD_SLSQP || ALGO==nlopt::LD_MMA) cout << "Warning: nGradStored can't be used with " << optim.Name() << ", parameter will be ignored." << endl; } if(econst) optim.SetEqualityConstraintFunction(ffcalfunc(stack,EEConst,theparam)); if(iconst) optim.SetInequalityConstraintFunction(ffcalfunc(stack,EIConst,theparam)); if(optim.DF()) { if(gradient) cout << "Warning: in " << optim.Name() << " algorithm - derivative free algorithm will ignore the objective function gradient." << endl; if(gradiconst) { cout << "Warning: in " << optim.Name() << " algorithm - derivative free algorithm will ignore the inequality constraints gradient." << endl; if(!iconst) cout << "Also note that this gradient has been provided for an inexisting set of inequality constraints!" << endl; } if(gradeconst) { cout << "Warning: in " << optim.Name() << " algorithm - derivative free algorithm will ignore the equality constraints gradient." << endl; if(!econst) cout << "Also note that this gradient has been provided for an inexisting set of equality constraints!" << endl; } } else { if(gradient) optim.SetObjectiveFunctionGradient(ffcalfunc(stack,GradJ,theparam)); else cout << "Warning: in " << optim.Name() << " algorithm - no objective function gradient has been provided (choose a derivative free algorithm if it is not available)." << endl; if(econst) { if(gradeconst) optim.SetEqualityConstraintGradient(ffcalfunc(stack,EGradEConst,theparam)); else cout << "Warning: in " << optim.Name() << " algorithm - no equality constraints gradients has been provided." << endl; } else if(gradeconst) cout << "Warning: in " << optim.Name() << " algorithm - gradients have been provided for an inexisting set of equality constraints." << endl; if(iconst) { if(gradiconst) optim.SetInequalityConstraintGradient(ffcalfunc(stack,EGradIConst,theparam)); else cout << "Warning: in " << optim.Name() << " algorithm - no inequality constraints gradients has been provided." << endl; } else if(gradiconst)cout << "Warning: in " << optim.Name() << " algorithm - gradients have been provided for an inexisting set of inequality constraints." << endl; } if(econst) optim.SetEqualityConstraints(); if(iconst) optim.SetInequalityConstraints(); if(verbosity>1) cout << Info::name << " starting..." << endl; try {cost = optim();} catch(nlopt::roundoff_limited) {cout << " nlopt roundoff limited" << endl;} catch(nlopt::forced_stop) { cout << " nlopt forced stop" << endl;} catch(std::runtime_error) {cout << "runtime error" << endl;} catch(std::invalid_argument) {cout << "invalid argument" << endl;} catch(std::bad_alloc) {cout << "bad alloc" << endl;} //x = KN_(optim.xbestever(),optim.dimension()); //cout << "Number of fitness evalution(s) : " << optim.eval() << endl; closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return cost; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const {return new E_NLopt(args,cas);} OptimNLopt(int c) : OneOperator(atype(),atype(),atype *>()),cas(c){} }; template basicAC_F0::name_and_type OptimNLopt::E_NLopt::name_param[]= { {"grad", &typeid(Polymorphic*) }, {"IConst", &typeid(Polymorphic*) }, {"gradIConst", &typeid(Polymorphic*) }, {"EConst", &typeid(Polymorphic*) }, {"gradEConst", &typeid(Polymorphic*) }, {"lb", &typeid(KN_) }, {"ub", &typeid(KN_) }, {"stopFuncValue", &typeid(double) }, {"tolEConst", &typeid(KN_) }, {"stopRelXTol", &typeid(double) }, {"stopAbsXTol", &typeid(KN_) }, {"stopRelFTol", &typeid(double) }, {"stopAbsFTol", &typeid(double) }, {"stopMaxFEval", &typeid(long) }, {"stopTime", &typeid(double) }, {"tolIConst", &typeid(KN_) }, {"popSize", &typeid(long) }, {"nGradStored", &typeid(long) } }; template class OptimNLopt : public OneOperator { public: const int cas; class E_NLopt : public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =27; Expression nargs[n_name_param]; Expression X; C_F0 inittheparam,theparam,closetheparam; Expression JJ; Expression GradJ,EIConst,EGradIConst,EEConst,EGradEConst; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} Rn_ arg(int i,Stack stack,Rn_ a) const {return nargs[i] ? GetAny((*nargs[2])(stack)) : a;} template T Arg(int i,Stack s) const {return GetAny( (*nargs[i])(s));} E_NLopt(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } JJ= to(C_F0(opJ,"(",theparam)); const Polymorphic * gradient = nargs[0] ? dynamic_cast(nargs[0]) : 0, * iconst = nargs[1] ? dynamic_cast(nargs[1]) : 0, * gradiconst = nargs[2] ? dynamic_cast(nargs[2]) : 0, * econst = nargs[3] ? dynamic_cast(nargs[3]) : 0, * gradeconst = nargs[4] ? dynamic_cast(nargs[4]) : 0; if(gradient) GradJ = to(C_F0(gradient,"(",theparam)); if(iconst) EIConst = to(C_F0(iconst,"(",theparam)); if(gradiconst) EGradIConst = to(C_F0(gradiconst,"(",theparam)); if(econst) EEConst = to(C_F0(econst,"(",theparam)); if(gradeconst) EGradEConst = to(C_F0(gradeconst,"(",theparam)); closetheparam=currentblock->close(currentblock); // the cleanning block expression } virtual AnyType operator()(Stack stack) const { double cost = 1e100; WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Rn &x = *GetAny((*X)(stack)); long n=x.N(); const bool gradient = nargs[0] ? dynamic_cast(nargs[0]) : 0, iconst = nargs[1] ? dynamic_cast(nargs[1]) : 0, gradiconst = nargs[2] ? dynamic_cast(nargs[2]) : 0, econst = nargs[3] ? dynamic_cast(nargs[3]) : 0, gradeconst = nargs[4] ? dynamic_cast(nargs[4]) : 0; long iprint = verbosity; ffcalfunc ffJ(stack,JJ,theparam); SAOptimizer optim(ffJ,x); if(nargs[5]) optim.SetLowerBounds(Arg(5,stack)); if(nargs[6]) optim.SetUpperBounds(Arg(6,stack)); if(nargs[7]) optim.SetSCStopFunctionValue(Arg(7,stack)); if(nargs[8]) optim.SetEqualityConstraintsTolerance(Arg(8,stack)); if(nargs[9]) optim.SetSCXRelativeTolerance(Arg(9,stack)); if(nargs[10]) optim.SetSCXAbsoluteTolerance(Arg(10,stack)); if(nargs[11]) optim.SetSCRelativeFunctionTolerance(Arg(11,stack)); if(nargs[12]) optim.SetSCAbsoluteFunctionTolerance(Arg(12,stack)); if(nargs[13]) optim.SetSCMaxFunctionEvaluations(Arg(13,stack)); if(nargs[14]) optim.SetSCEllapsedTime(Arg(14,stack)); if(nargs[15]) optim.SetInequalityConstraintsTolerance(Arg(15,stack)); if(nargs[16]) optim.SetPopulationSize(static_cast(Arg(16,stack))); if(nargs[17]) optim.SetSubOptimizer(*Arg(17,stack),0); else cout << "Warning: in " << optim.Name() << " algorithm - you have to specify a local optimizer, aboarting optimization (use the subOpt named parameter)." << endl; if(nargs[18]) optim.SetSASCStopFunctionValue(Arg(18,stack)); if(nargs[19]) optim.SetSASCXRelativeTolerance(Arg(19,stack)); if(nargs[20]) optim.SetSASCXAbsoluteTolerance(Arg(20,stack)); if(nargs[21]) optim.SetSASCRelativeFunctionTolerance(Arg(21,stack)); if(nargs[22]) optim.SetSASCAbsoluteFunctionTolerance(Arg(22,stack)); if(nargs[23]) optim.SetSASCMaxFunctionEvaluations(Arg(23,stack)); if(nargs[24]) optim.SetSASCEllapsedTime(Arg(24,stack)); if(nargs[25]) optim.SetSAPopulationSize(static_cast(Arg(25,stack))); if(nargs[26]) { optim.SetVectorStorage(static_cast (Arg(26,stack))); if(optim.DF()) cout << "Warning: in " << optim.subopt->Name() << " algorithm - using nGradStored is pointless (no gradient to store in a derivative free context)." << endl; else if(optim.subopt->Tag()==nlopt::LD_SLSQP || optim.subopt->Tag()==nlopt::LD_MMA) cout << "Warning: nGradStored can't be used with " << optim.Name() << ", parameter will be ignored." << endl; } optim.SetSubOptimizer(); if(econst) optim.SetEqualityConstraintFunction(ffcalfunc(stack,EEConst,theparam)); if(iconst) optim.SetInequalityConstraintFunction(ffcalfunc(stack,EIConst,theparam)); if(optim.subopt) { if(optim.subopt->DF()) { if(gradient) cout << "Warning: in " << optim.Name() << " algorithm - derivative free sub-algorithm will ignore the objective function gradient." << endl; if(gradiconst) { cout << "Warning: in " << optim.Name() << " algorithm - derivative free sub-algorithm will ignore the inequality constraints gradient." << endl; if(!iconst) cout << "Also note that this gradient has been provided for an inexisting set of inequality constraints!" << endl; } if(gradeconst) { cout << "Warning: in " << optim.Name() << " algorithm - derivative free sub-algorithm will ignore the equality constraints gradient." << endl; if(!econst) cout << "Also note that this gradient has been provided for an inexisting set of equality constraints!" << endl; } } else { if(gradient) optim.SetObjectiveFunctionGradient(ffcalfunc(stack,GradJ,theparam)); else cout << "Warning: in " << optim.Name() << " algorithm - no objective function gradient has been provided (choose a derivative free local search if it is not available)." << endl; if(econst) { if(gradeconst) optim.SetEqualityConstraintGradient(ffcalfunc(stack,EGradEConst,theparam)); else cout << "Warning: in " << optim.Name() << " algorithm - no equality constraints gradients has been provided." << endl; } else if(gradeconst) cout << "Warning: in " << optim.Name() << " algorithm - gradients have been provided for an inexisting set of equality constraints." << endl; if(iconst) { if(gradiconst) optim.SetInequalityConstraintGradient(ffcalfunc(stack,EGradIConst,theparam)); else cout << "Warning: in " << optim.Name() << " algorithm - no inequality constraints gradients has been provided." << endl; } else if(gradiconst)cout << "Warning: in " << optim.Name() << " algorithm - gradients have been provided for an inexisting set of inequality constraints." << endl; } if(econst) optim.SetEqualityConstraints(); if(iconst) optim.SetInequalityConstraints(); if(verbosity>1) cout << Info::name << " starting..." << endl; try {cost = optim();} catch(nlopt::roundoff_limited) {cout << " nlopt roundoff limited" << endl;} catch(nlopt::forced_stop) { cout << " nlopt forced stop" << endl;} catch(std::runtime_error) {cout << "runtime error" << endl;} catch(std::invalid_argument) {cout << "invalid argument" << endl;} catch(std::bad_alloc) {cout << "bad alloc" << endl;} } //x = KN_(optim.xbestever(),optim.dimension()); //cout << "Number of fitness evalution(s) : " << optim.eval() << endl; closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return cost; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const {return new E_NLopt(args,cas);} OptimNLopt(int c) : OneOperator(atype(),atype(),atype *>()),cas(c){} }; template basicAC_F0::name_and_type OptimNLopt::E_NLopt::name_param[]= { {"grad", &typeid(Polymorphic*) }, {"IConst", &typeid(Polymorphic*) }, {"gradIConst", &typeid(Polymorphic*) }, {"EConst", &typeid(Polymorphic*) }, {"gradEConst", &typeid(Polymorphic*) }, {"lb", &typeid(KN_) }, {"ub", &typeid(KN_) }, {"stopFuncValue", &typeid(double) }, {"tolEConst", &typeid(KN_) }, {"stopRelXTol", &typeid(double) }, {"stopAbsXTol", &typeid(KN_) }, {"stopRelFTol", &typeid(double) }, {"stopAbsFTol", &typeid(double) }, {"stopMaxFEval", &typeid(long) }, {"stopTime", &typeid(double) }, {"tolIConst", &typeid(KN_) }, {"popSize", &typeid(long) }, //16 {"subOpt", &typeid(string*) }, {"SOStopFuncValue", &typeid(double) }, {"SOStopRelXTol", &typeid(double) }, {"SOStopAbsXTol", &typeid(KN_) }, {"SOStopRelFTol", &typeid(double) }, {"SOStopAbsFTol", &typeid(double) }, {"SOStopMaxFEval", &typeid(long) }, {"SOStopTime", &typeid(double) }, {"SOPopSize", &typeid(long) }, {"nGradStored", &typeid(long) } }; /* class Init { public: Init(); }; $1 */ static void Load_Init() { Global.Add("nloptDIRECT", "(",new OptimNLopt(1)); Global.Add("nloptDIRECTL", "(",new OptimNLopt(1)); Global.Add("nloptDIRECTLRand", "(",new OptimNLopt(1)); Global.Add("nloptDIRECTNoScal", "(",new OptimNLopt(1)); Global.Add("nloptDIRECTLNoScal", "(",new OptimNLopt(1)); Global.Add("nloptDIRECTLRandNoScal", "(",new OptimNLopt(1)); Global.Add("nloptOrigDIRECT", "(",new OptimNLopt(1)); Global.Add("nloptOrigDIRECTL", "(",new OptimNLopt(1)); Global.Add("nloptStoGO", "(",new OptimNLopt(1)); Global.Add("nloptStoGORand", "(",new OptimNLopt(1)); //Global.Add("nloptLBFGSNocedal", "(",new OptimNLopt(1)); //Invalid argument Global.Add("nloptLBFGS", "(",new OptimNLopt(1)); Global.Add("nloptPRAXIS", "(",new OptimNLopt(1)); Global.Add("nloptVar1", "(",new OptimNLopt(1)); Global.Add("nloptVar2", "(",new OptimNLopt(1)); Global.Add("nloptTNewton", "(",new OptimNLopt(1)); Global.Add("nloptTNewtonRestart", "(",new OptimNLopt(1)); Global.Add("nloptTNewtonPrecond", "(",new OptimNLopt(1)); Global.Add("nloptTNewtonPrecondRestart","(",new OptimNLopt(1)); Global.Add("nloptCRS2", "(",new OptimNLopt(1)); Global.Add("nloptMMA", "(",new OptimNLopt(1)); Global.Add("nloptCOBYLA", "(",new OptimNLopt(1)); Global.Add("nloptNEWUOA", "(",new OptimNLopt(1)); Global.Add("nloptNEWUOABound", "(",new OptimNLopt(1)); Global.Add("nloptNelderMead", "(",new OptimNLopt(1)); Global.Add("nloptSbplx", "(",new OptimNLopt(1)); Global.Add("nloptBOBYQA", "(",new OptimNLopt(1)); Global.Add("nloptISRES", "(",new OptimNLopt(1)); Global.Add("nloptSLSQP", "(",new OptimNLopt(1)); Global.Add("nloptMLSL", "(",new OptimNLopt(1)); Global.Add("nloptMLSLLDS", "(",new OptimNLopt(1)); Global.Add("nloptAUGLAG", "(",new OptimNLopt(1)); Global.Add("nloptAUGLAGEQ", "(",new OptimNLopt(1)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/ff-pkg-download.in000755 000767 000024 00000006163 12310155422 022000 0ustar00hechtstaff000000 000000 #!/bin/bash # Building WHERE_LIBRARY-download # ====================================================================== # Laboratoire Jacques-Louis Lions # Université Pierre et Marie Curie-Paris6, UMR 7598, Paris, F-75005 France # ====================================================================== # This file is part of Freefem++ # # Freefem++ is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. # # Freefem++ is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with Freefem++; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ====================================================================== # headeralh brief="Building WHERE_LIBRARY-download" default=0 freefem multipleauthors shell start=21/09/09 upmc ff=$0; bb=`basename $0` DIR=`dirname $ff` pp=`pwd` DESTDIR="" if [ -n "$1" ] ; then DESTDIR="$1/" elif [ $bb = $ff -a \( '.' = "$DIR" -o -z "$DIR" \) ] ; then ff=`which $0` DIR=`dirname $ff` if [ '.' = "$DIR" -o -z "$DIR" ] ; then echo Sorry cant find the Directory place of $0 fi fi case $DIR in /*) ;; [.]) DIR=$pp;; *) DIR="$pp/$DIR" esac DIRP=`dirname $DIR` #echo "WWWWW" $DIRP if [ -d "$DESTDIR$DIRP/download/lib" -a -d "$DESTDIR$DIRP/download/include" ] ; then DIR="$DIRP/download" DIRW="$DIRP/examples++-load" elif [ -d "$DESTDIR$DIRP/lib" -a -d "$DESTDIR$DIRP/include" ] ; then DIR="$DIRP" DIRW="$DIR/lib" else DIR=@ff_prefix_dir@ DIRW="$DIRW/lib" fi if [ -d $DESTDIR$DIR/lib -a -d $DESTDIR$DIR/include ] ; then LIB="$DIR/lib" INC="$DIR/include" cd "$DESTDIR$LIB" # set -x for i in $LIB/WHERE.* ; do test -f $i && ( sed "s;@DIR@;$DIR;" <$i ) done # ALH - 6/1/14 - remove umfpack and amd because some versions of umfpack needs more than just adding -L (they need # the colamd and cholmod libraries, which are setup in [[file:configure.ac]]). cd "$DIRW" for la in arpack fftw3 mmg3d; do l=`echo $la |sed -e s/^tet$/tetgen/` nbw=`awk "/^$la /" WHERE_LIBRARY WHERE_LIBRARY-config|wc -l` if [ "$nbw" -ne 0 -a ! -f $LIB/WHERE.$l ]; then if [ -z "$l" ];then l="$la";fi if ( ls "lib$la"[-._0-9]*a 1>/dev/null 2>/dev/null ) ; then ll=`ls "lib$la"[-._0-9]*a|grep [.]a` if [ -n "$ll" ]; then lib=`expr "$ll" : lib'\(.*\).a'` echo $l LD "'"-L$LIB"'" "'"-l$lib"'" if [ -d $INC/$la ] ; then echo $l INCLUDE "'"-I$INC/$la"'" else echo $l INCLUDE "'"-I$INC"'" fi fi fi fi done else echo error not directory $DIR/lib and $DIR/include $DIRP fi # Local Variables: # mode:shell-script # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.38-1/examples++-load/ff_gsl_awk.hpp000644 000767 000024 00000327513 12470426023 021313 0ustar00hechtstaff000000 000000 /* // -- missing type "const double[]" missing: 5 gsl_ran_dirichlet_pdf -> /usr/local/include/gsl/gsl_randist.h:double gsl_ran_dirichlet_pdf (const size_t K, const double alpha[], const double theta[]); missing: 5 gsl_ran_dirichlet_lnpdf -> /usr/local/include/gsl/gsl_randist.h:double gsl_ran_dirichlet_lnpdf (const size_t K, const double alpha[], const double theta[]); // -- missing type "size_t" missing: 4 gsl_ran_discrete_pdf -> /usr/local/include/gsl/gsl_randist.h:double gsl_ran_discrete_pdf (size_t k, const gsl_ran_discrete_t *g); // -- missing type "const gsl_mode_t" missing: 5 gsl_sf_airy_Ai_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Ai_e(const double x, const gsl_mode_t mode, gsl_sf_result * result); // -- missing type "gsl_sf_result *" missing: 5 gsl_sf_airy_Bi_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Bi_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_airy_Ai_scaled_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Ai_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_airy_Bi_scaled_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Bi_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_airy_Ai_deriv_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Ai_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_airy_Bi_deriv_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Bi_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_airy_Ai_deriv_scaled_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Ai_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_airy_Bi_deriv_scaled_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_Bi_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result); missing: 4 gsl_sf_airy_zero_Ai_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_zero_Ai_e(unsigned int s, gsl_sf_result * result); missing: 4 gsl_sf_airy_zero_Bi_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_zero_Bi_e(unsigned int s, gsl_sf_result * result); missing: 4 gsl_sf_airy_zero_Ai_deriv_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_zero_Ai_deriv_e(unsigned int s, gsl_sf_result * result); missing: 4 gsl_sf_airy_zero_Bi_deriv_e -> /usr/local/include/gsl/gsl_sf_airy.h:int gsl_sf_airy_zero_Bi_deriv_e(unsigned int s, gsl_sf_result * result); missing: 4 gsl_sf_bessel_J0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_J0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_J1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_J1_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Jn_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Jn_e(int n, double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_Y0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Y0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_Y1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Y1_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Yn_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Yn_e(int n,const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_I0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_I0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_I1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_I1_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_In_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_In_e(const int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_I0_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_I0_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_I1_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_I1_scaled_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_In_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_In_scaled_e(int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_K0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_K0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_K1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_K1_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Kn_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Kn_e(const int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_K0_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_K0_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_K1_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_K1_scaled_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Kn_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Kn_scaled_e(int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_j0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_j0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_j1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_j1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_j2_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_j2_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_jl_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_jl_e(const int l, const double x, gsl_sf_result * result); // -- missing type "double *" missing: 5 gsl_sf_bessel_jl_array -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_jl_array(const int lmax, const double x, double * result_array); missing: 5 gsl_sf_bessel_jl_steed_array -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_jl_steed_array(const int lmax, const double x, double * jl_x_array); missing: 4 gsl_sf_bessel_y0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_y0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_y1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_y1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_y2_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_y2_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_yl_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_yl_e(int l, const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_yl_array -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_yl_array(const int lmax, const double x, double * result_array); missing: 4 gsl_sf_bessel_i0_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_i0_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_i1_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_i1_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_i2_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_i2_scaled_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_il_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_il_scaled_e(const int l, double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_il_scaled_array -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_il_scaled_array(const int lmax, const double x, double * result_array); missing: 4 gsl_sf_bessel_k0_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_k0_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_k1_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_k1_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_k2_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_k2_scaled_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_kl_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_kl_scaled_e(int l, const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_kl_scaled_array -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_kl_scaled_array(const int lmax, const double x, double * result_array); missing: 5 gsl_sf_bessel_Jnu_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Jnu_e(const double nu, const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Ynu_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Ynu_e(double nu, double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Inu_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Inu_scaled_e(double nu, double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Inu_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Inu_e(double nu, double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_Knu_scaled_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Knu_scaled_e(const double nu, const double x, gsl_sf_result * result); // -- missing type "gsl_sf_result_e10 *" missing: 5 gsl_sf_bessel_Knu_scaled_e10_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Knu_scaled_e10_e(const double nu, const double x, gsl_sf_result_e10 * result); missing: 5 gsl_sf_bessel_Knu_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_Knu_e(const double nu, const double x, gsl_sf_result * result); missing: 5 gsl_sf_bessel_lnKnu_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_lnKnu_e(const double nu, const double x, gsl_sf_result * result); missing: 4 gsl_sf_bessel_zero_J0_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_zero_J0_e(unsigned int s, gsl_sf_result * result); missing: 4 gsl_sf_bessel_zero_J1_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_zero_J1_e(unsigned int s, gsl_sf_result * result); missing: 5 gsl_sf_bessel_zero_Jnu_e -> /usr/local/include/gsl/gsl_sf_bessel.h:int gsl_sf_bessel_zero_Jnu_e(double nu, unsigned int s, gsl_sf_result * result); missing: 4 gsl_sf_clausen_e -> /usr/local/include/gsl/gsl_sf_clausen.h:int gsl_sf_clausen_e(double x, gsl_sf_result * result); missing: 5 gsl_sf_hydrogenicR_1_e -> /usr/local/include/gsl/gsl_sf_coulomb.h:int gsl_sf_hydrogenicR_1_e(const double Z, const double r, gsl_sf_result * result); missing: 5 gsl_sf_coulomb_CL_e -> /usr/local/include/gsl/gsl_sf_coulomb.h:int gsl_sf_coulomb_CL_e(double L, double eta, gsl_sf_result * result); missing: 6 gsl_sf_coulomb_CL_e -> /usr/local/include/gsl/gsl_sf_coulomb.h:int gsl_sf_coulomb_CL_array(double Lmin, int kmax, double eta, double * cl); missing: 4 gsl_sf_dawson_e -> /usr/local/include/gsl/gsl_sf_dawson.h:int gsl_sf_dawson_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_debye_1_e -> /usr/local/include/gsl/gsl_sf_debye.h:int gsl_sf_debye_1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_debye_2_e -> /usr/local/include/gsl/gsl_sf_debye.h:int gsl_sf_debye_2_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_debye_3_e -> /usr/local/include/gsl/gsl_sf_debye.h:int gsl_sf_debye_3_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_debye_4_e -> /usr/local/include/gsl/gsl_sf_debye.h:int gsl_sf_debye_4_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_debye_5_e -> /usr/local/include/gsl/gsl_sf_debye.h:int gsl_sf_debye_5_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_debye_6_e -> /usr/local/include/gsl/gsl_sf_debye.h:int gsl_sf_debye_6_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_dilog_e -> /usr/local/include/gsl/gsl_sf_dilog.h:int gsl_sf_dilog_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_multiply_e -> /usr/local/include/gsl/gsl_sf_elementary.h:int gsl_sf_multiply_e(const double x, const double y, gsl_sf_result * result); missing: 5 gsl_sf_ellint_Kcomp_e -> /usr/local/include/gsl/gsl_sf_ellint.h:int gsl_sf_ellint_Kcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_ellint_Ecomp_e -> /usr/local/include/gsl/gsl_sf_ellint.h:int gsl_sf_ellint_Ecomp_e(double k, gsl_mode_t mode, gsl_sf_result * result); missing: 5 gsl_sf_ellint_Dcomp_e -> /usr/local/include/gsl/gsl_sf_ellint.h:int gsl_sf_ellint_Dcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result); missing: 4 gsl_sf_erfc_e -> /usr/local/include/gsl/gsl_sf_erf.h:int gsl_sf_erfc_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_log_erfc_e -> /usr/local/include/gsl/gsl_sf_erf.h:int gsl_sf_log_erfc_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_erf_e -> /usr/local/include/gsl/gsl_sf_erf.h:int gsl_sf_erf_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_erf_Z_e -> /usr/local/include/gsl/gsl_sf_erf.h:int gsl_sf_erf_Z_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_erf_Q_e -> /usr/local/include/gsl/gsl_sf_erf.h:int gsl_sf_erf_Q_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_hazard_e -> /usr/local/include/gsl/gsl_sf_erf.h:int gsl_sf_hazard_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_exp_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_exp_e10_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_e10_e(const double x, gsl_sf_result_e10 * result); missing: 5 gsl_sf_exp_mult_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_mult_e(const double x, const double y, gsl_sf_result * result); missing: 5 gsl_sf_exp_mult_e10_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_mult_e10_e(const double x, const double y, gsl_sf_result_e10 * result); missing: 4 gsl_sf_expm1_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_expm1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_exprel_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exprel_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_exprel_2_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exprel_2_e(double x, gsl_sf_result * result); missing: 5 gsl_sf_exprel_n_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exprel_n_e(const int n, const double x, gsl_sf_result * result); missing: 5 gsl_sf_exprel_n_CF_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exprel_n_CF_e(const double n, const double x, gsl_sf_result * result); missing: 5 gsl_sf_exp_err_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_err_e(const double x, const double dx, gsl_sf_result * result); missing: 5 gsl_sf_exp_err_e10_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_err_e10_e(const double x, const double dx, gsl_sf_result_e10 * result); missing: 7 gsl_sf_exp_err_e10_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_mult_err_e(const double x, const double dx, const double y, const double dy, gsl_sf_result * result); missing: 7 gsl_sf_exp_err_e10_e -> /usr/local/include/gsl/gsl_sf_exp.h:int gsl_sf_exp_mult_err_e10_e(const double x, const double dx, const double y, const double dy, gsl_sf_result_e10 * result); missing: 4 gsl_sf_expint_E1_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_E1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_expint_E2_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_E2_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_expint_En_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_En_e(const int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_expint_E1_scaled_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_E1_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_expint_E2_scaled_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_E2_scaled_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_expint_En_scaled_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_En_scaled_e(const int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_expint_Ei_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_Ei_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_expint_Ei_scaled_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_Ei_scaled_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_Shi_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_Shi_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_Chi_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_Chi_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_expint_3_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_expint_3_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_Si_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_Si_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_Ci_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_Ci_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_atanint_e -> /usr/local/include/gsl/gsl_sf_expint.h:int gsl_sf_atanint_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_m1_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_m1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_0_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_1_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_2_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_2_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_fermi_dirac_int_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_int_e(const int j, const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_mhalf_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_mhalf_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_half_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_half_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_fermi_dirac_3half_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_3half_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_fermi_dirac_inc_0_e -> /usr/local/include/gsl/gsl_sf_fermi_dirac.h:int gsl_sf_fermi_dirac_inc_0_e(const double x, const double b, gsl_sf_result * result); missing: 4 gsl_sf_lngamma_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lngamma_e(double x, gsl_sf_result * result); missing: 5 gsl_sf_lngamma_sgn_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lngamma_sgn_e(double x, gsl_sf_result * result_lg, double *sgn); missing: 4 gsl_sf_gamma_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_gamma_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_gammastar_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_gammastar_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_gammainv_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_gammainv_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_taylorcoeff_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_taylorcoeff_e(const int n, const double x, gsl_sf_result * result); missing: 4 gsl_sf_fact_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_fact_e(const unsigned int n, gsl_sf_result * result); missing: 4 gsl_sf_doublefact_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_doublefact_e(const unsigned int n, gsl_sf_result * result); missing: 4 gsl_sf_lnfact_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lnfact_e(const unsigned int n, gsl_sf_result * result); missing: 4 gsl_sf_lndoublefact_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lndoublefact_e(const unsigned int n, gsl_sf_result * result); missing: 5 gsl_sf_lnchoose_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lnchoose_e(unsigned int n, unsigned int m, gsl_sf_result * result); missing: 5 gsl_sf_choose_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_choose_e(unsigned int n, unsigned int m, gsl_sf_result * result); missing: 5 gsl_sf_lnpoch_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lnpoch_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_poch_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_poch_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_pochrel_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_pochrel_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_gamma_inc_Q_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_gamma_inc_Q_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_gamma_inc_P_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_gamma_inc_P_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_gamma_inc_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_gamma_inc_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_lnbeta_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_lnbeta_e(const double a, const double b, gsl_sf_result * result); missing: 5 gsl_sf_beta_e -> /usr/local/include/gsl/gsl_sf_gamma.h:int gsl_sf_beta_e(const double a, const double b, gsl_sf_result * result); missing: 5 gsl_sf_gegenpoly_1_e -> /usr/local/include/gsl/gsl_sf_gegenbauer.h:int gsl_sf_gegenpoly_1_e(double lambda, double x, gsl_sf_result * result); missing: 5 gsl_sf_gegenpoly_2_e -> /usr/local/include/gsl/gsl_sf_gegenbauer.h:int gsl_sf_gegenpoly_2_e(double lambda, double x, gsl_sf_result * result); missing: 5 gsl_sf_gegenpoly_3_e -> /usr/local/include/gsl/gsl_sf_gegenbauer.h:int gsl_sf_gegenpoly_3_e(double lambda, double x, gsl_sf_result * result); missing: 5 gsl_sf_hyperg_0F1_e -> /usr/local/include/gsl/gsl_sf_hyperg.h:int gsl_sf_hyperg_0F1_e(double c, double x, gsl_sf_result * result); missing: 5 gsl_sf_laguerre_1_e -> /usr/local/include/gsl/gsl_sf_laguerre.h:int gsl_sf_laguerre_1_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_laguerre_2_e -> /usr/local/include/gsl/gsl_sf_laguerre.h:int gsl_sf_laguerre_2_e(const double a, const double x, gsl_sf_result * result); missing: 5 gsl_sf_laguerre_3_e -> /usr/local/include/gsl/gsl_sf_laguerre.h:int gsl_sf_laguerre_3_e(const double a, const double x, gsl_sf_result * result); missing: 4 gsl_sf_lambert_W0_e -> /usr/local/include/gsl/gsl_sf_lambert.h:int gsl_sf_lambert_W0_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_lambert_Wm1_e -> /usr/local/include/gsl/gsl_sf_lambert.h:int gsl_sf_lambert_Wm1_e(double x, gsl_sf_result * result); missing: 5 gsl_sf_legendre_Pl_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_Pl_e(const int l, const double x, gsl_sf_result * result); missing: 4 gsl_sf_legendre_P1_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_P1_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_legendre_P2_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_P2_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_legendre_P3_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_P3_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_legendre_Q0_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_Q0_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_legendre_Q1_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_Q1_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_legendre_Ql_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_Ql_e(const int l, const double x, gsl_sf_result * result); missing: 5 gsl_sf_conicalP_half_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_conicalP_half_e(const double lambda, const double x, gsl_sf_result * result); missing: 5 gsl_sf_conicalP_mhalf_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_conicalP_mhalf_e(const double lambda, const double x, gsl_sf_result * result); missing: 5 gsl_sf_conicalP_0_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_conicalP_0_e(const double lambda, const double x, gsl_sf_result * result); missing: 5 gsl_sf_conicalP_1_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_conicalP_1_e(const double lambda, const double x, gsl_sf_result * result); missing: 5 gsl_sf_legendre_H3d_0_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_H3d_0_e(const double lambda, const double eta, gsl_sf_result * result); missing: 5 gsl_sf_legendre_H3d_1_e -> /usr/local/include/gsl/gsl_sf_legendre.h:int gsl_sf_legendre_H3d_1_e(const double lambda, const double eta, gsl_sf_result * result); missing: 4 gsl_sf_log_e -> /usr/local/include/gsl/gsl_sf_log.h:int gsl_sf_log_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_log_abs_e -> /usr/local/include/gsl/gsl_sf_log.h:int gsl_sf_log_abs_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_log_1plusx_e -> /usr/local/include/gsl/gsl_sf_log.h:int gsl_sf_log_1plusx_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_log_1plusx_mx_e -> /usr/local/include/gsl/gsl_sf_log.h:int gsl_sf_log_1plusx_mx_e(const double x, gsl_sf_result * result); // -- missing type "gsl_sf_result" missing: 5 gsl_sf_mathieu_a -> /usr/local/include/gsl/gsl_sf_mathieu.h:int gsl_sf_mathieu_a(int order, double qq, gsl_sf_result *result); missing: 5 gsl_sf_mathieu_b -> /usr/local/include/gsl/gsl_sf_mathieu.h:int gsl_sf_mathieu_b(int order, double qq, gsl_sf_result *result); missing: 6 gsl_sf_mathieu_b -> /usr/local/include/gsl/gsl_sf_mathieu.h:int gsl_sf_mathieu_a_coeff(int order, double qq, double aa, double coeff[]); missing: 6 gsl_sf_mathieu_b -> /usr/local/include/gsl/gsl_sf_mathieu.h:int gsl_sf_mathieu_b_coeff(int order, double qq, double aa, double coeff[]); missing: 6 gsl_sf_mathieu_b -> /usr/local/include/gsl/gsl_sf_mathieu.h:int gsl_sf_mathieu_ce(int order, double qq, double zz, gsl_sf_result *result); missing: 6 gsl_sf_mathieu_b -> /usr/local/include/gsl/gsl_sf_mathieu.h:int gsl_sf_mathieu_se(int order, double qq, double zz, gsl_sf_result *result); missing: 5 gsl_sf_pow_int_e -> /usr/local/include/gsl/gsl_sf_pow_int.h:int gsl_sf_pow_int_e(double x, int n, gsl_sf_result * result); missing: 4 gsl_sf_psi_int_e -> /usr/local/include/gsl/gsl_sf_psi.h:int gsl_sf_psi_int_e(const int n, gsl_sf_result * result); missing: 4 gsl_sf_psi_e -> /usr/local/include/gsl/gsl_sf_psi.h:int gsl_sf_psi_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_psi_1piy_e -> /usr/local/include/gsl/gsl_sf_psi.h:int gsl_sf_psi_1piy_e(const double y, gsl_sf_result * result); missing: 4 gsl_sf_psi_1_int_e -> /usr/local/include/gsl/gsl_sf_psi.h:int gsl_sf_psi_1_int_e(const int n, gsl_sf_result * result); missing: 4 gsl_sf_psi_1_e -> /usr/local/include/gsl/gsl_sf_psi.h:int gsl_sf_psi_1_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_psi_n_e -> /usr/local/include/gsl/gsl_sf_psi.h:int gsl_sf_psi_n_e(const int n, const double x, gsl_sf_result * result); // -- missing type "const gsl_sf_result_e10 *" missing: 4 gsl_sf_result_smash_e -> /usr/local/include/gsl/gsl_sf_result.h:int gsl_sf_result_smash_e(const gsl_sf_result_e10 * re, gsl_sf_result * r); missing: 4 gsl_sf_synchrotron_1_e -> /usr/local/include/gsl/gsl_sf_synchrotron.h:int gsl_sf_synchrotron_1_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_synchrotron_2_e -> /usr/local/include/gsl/gsl_sf_synchrotron.h:int gsl_sf_synchrotron_2_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_transport_2_e -> /usr/local/include/gsl/gsl_sf_transport.h:int gsl_sf_transport_2_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_transport_3_e -> /usr/local/include/gsl/gsl_sf_transport.h:int gsl_sf_transport_3_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_transport_4_e -> /usr/local/include/gsl/gsl_sf_transport.h:int gsl_sf_transport_4_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_transport_5_e -> /usr/local/include/gsl/gsl_sf_transport.h:int gsl_sf_transport_5_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_sin_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_sin_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_cos_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_cos_e(double x, gsl_sf_result * result); missing: 5 gsl_sf_hypot_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_hypot_e(const double x, const double y, gsl_sf_result * result); missing: 4 gsl_sf_sinc_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_sinc_e(double x, gsl_sf_result * result); missing: 4 gsl_sf_lnsinh_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_lnsinh_e(const double x, gsl_sf_result * result); missing: 4 gsl_sf_lncosh_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_lncosh_e(const double x, gsl_sf_result * result); missing: 5 gsl_sf_sin_err_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_sin_err_e(const double x, const double dx, gsl_sf_result * result); missing: 5 gsl_sf_cos_err_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_cos_err_e(const double x, const double dx, gsl_sf_result * result); missing: 3 gsl_sf_angle_restrict_symm_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_angle_restrict_symm_e(double * theta); missing: 3 gsl_sf_angle_restrict_pos_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_angle_restrict_pos_e(double * theta); missing: 4 gsl_sf_angle_restrict_symm_err_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_angle_restrict_symm_err_e(const double theta, gsl_sf_result * result); missing: 4 gsl_sf_angle_restrict_pos_err_e -> /usr/local/include/gsl/gsl_sf_trig.h:int gsl_sf_angle_restrict_pos_err_e(const double theta, gsl_sf_result * result); missing: 4 gsl_sf_zeta_int_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_zeta_int_e(const int n, gsl_sf_result * result); missing: 4 gsl_sf_zeta_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_zeta_e(const double s, gsl_sf_result * result); missing: 4 gsl_sf_zetam1_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_zetam1_e(const double s, gsl_sf_result * result); missing: 4 gsl_sf_zetam1_int_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_zetam1_int_e(const int s, gsl_sf_result * result); missing: 5 gsl_sf_hzeta_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_hzeta_e(const double s, const double q, gsl_sf_result * result); missing: 4 gsl_sf_eta_int_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_eta_int_e(int n, gsl_sf_result * result); missing: 4 gsl_sf_eta_e -> /usr/local/include/gsl/gsl_sf_zeta.h:int gsl_sf_eta_e(const double s, gsl_sf_result * result); */ /*****************/ /*****************/ double gsl_cdf_ugaussian_P__(double const & x ) { return gsl_cdf_ugaussian_P( (const double) x );} double gsl_cdf_ugaussian_Q__(double const & x ) { return gsl_cdf_ugaussian_Q( (const double) x );} double gsl_cdf_ugaussian_Pinv__(double const & x ) { return gsl_cdf_ugaussian_Pinv( (const double) x );} double gsl_cdf_ugaussian_Qinv__(double const & x ) { return gsl_cdf_ugaussian_Qinv( (const double) x );} double gsl_cdf_gaussian_P__(double const & x , double const & y ){ return gsl_cdf_gaussian_P( (const double) x , (const double) y );} double gsl_cdf_gaussian_Q__(double const & x , double const & y ){ return gsl_cdf_gaussian_Q( (const double) x , (const double) y );} double gsl_cdf_gaussian_Pinv__(double const & x , double const & y ){ return gsl_cdf_gaussian_Pinv( (const double) x , (const double) y );} double gsl_cdf_gaussian_Qinv__(double const & x , double const & y ){ return gsl_cdf_gaussian_Qinv( (const double) x , (const double) y );} double gsl_cdf_gamma_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_gamma_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gamma_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_gamma_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gamma_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_gamma_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gamma_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_gamma_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_cauchy_P__(double const & x , double const & y ){ return gsl_cdf_cauchy_P( (const double) x , (const double) y );} double gsl_cdf_cauchy_Q__(double const & x , double const & y ){ return gsl_cdf_cauchy_Q( (const double) x , (const double) y );} double gsl_cdf_cauchy_Pinv__(double const & x , double const & y ){ return gsl_cdf_cauchy_Pinv( (const double) x , (const double) y );} double gsl_cdf_cauchy_Qinv__(double const & x , double const & y ){ return gsl_cdf_cauchy_Qinv( (const double) x , (const double) y );} double gsl_cdf_laplace_P__(double const & x , double const & y ){ return gsl_cdf_laplace_P( (const double) x , (const double) y );} double gsl_cdf_laplace_Q__(double const & x , double const & y ){ return gsl_cdf_laplace_Q( (const double) x , (const double) y );} double gsl_cdf_laplace_Pinv__(double const & x , double const & y ){ return gsl_cdf_laplace_Pinv( (const double) x , (const double) y );} double gsl_cdf_laplace_Qinv__(double const & x , double const & y ){ return gsl_cdf_laplace_Qinv( (const double) x , (const double) y );} double gsl_cdf_rayleigh_P__(double const & x , double const & y ){ return gsl_cdf_rayleigh_P( (const double) x , (const double) y );} double gsl_cdf_rayleigh_Q__(double const & x , double const & y ){ return gsl_cdf_rayleigh_Q( (const double) x , (const double) y );} double gsl_cdf_rayleigh_Pinv__(double const & x , double const & y ){ return gsl_cdf_rayleigh_Pinv( (const double) x , (const double) y );} double gsl_cdf_rayleigh_Qinv__(double const & x , double const & y ){ return gsl_cdf_rayleigh_Qinv( (const double) x , (const double) y );} double gsl_cdf_chisq_P__(double const & x , double const & y ){ return gsl_cdf_chisq_P( (const double) x , (const double) y );} double gsl_cdf_chisq_Q__(double const & x , double const & y ){ return gsl_cdf_chisq_Q( (const double) x , (const double) y );} double gsl_cdf_chisq_Pinv__(double const & x , double const & y ){ return gsl_cdf_chisq_Pinv( (const double) x , (const double) y );} double gsl_cdf_chisq_Qinv__(double const & x , double const & y ){ return gsl_cdf_chisq_Qinv( (const double) x , (const double) y );} double gsl_cdf_exponential_P__(double const & x , double const & y ){ return gsl_cdf_exponential_P( (const double) x , (const double) y );} double gsl_cdf_exponential_Q__(double const & x , double const & y ){ return gsl_cdf_exponential_Q( (const double) x , (const double) y );} double gsl_cdf_exponential_Pinv__(double const & x , double const & y ){ return gsl_cdf_exponential_Pinv( (const double) x , (const double) y );} double gsl_cdf_exponential_Qinv__(double const & x , double const & y ){ return gsl_cdf_exponential_Qinv( (const double) x , (const double) y );} double gsl_cdf_exppow_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_exppow_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_exppow_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_exppow_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_tdist_P__(double const & x , double const & y ){ return gsl_cdf_tdist_P( (const double) x , (const double) y );} double gsl_cdf_tdist_Q__(double const & x , double const & y ){ return gsl_cdf_tdist_Q( (const double) x , (const double) y );} double gsl_cdf_tdist_Pinv__(double const & x , double const & y ){ return gsl_cdf_tdist_Pinv( (const double) x , (const double) y );} double gsl_cdf_tdist_Qinv__(double const & x , double const & y ){ return gsl_cdf_tdist_Qinv( (const double) x , (const double) y );} double gsl_cdf_fdist_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_fdist_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_fdist_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_fdist_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_fdist_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_fdist_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_fdist_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_fdist_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_beta_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_beta_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_beta_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_beta_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_beta_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_beta_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_beta_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_beta_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_flat_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_flat_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_flat_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_flat_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_flat_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_flat_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_flat_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_flat_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_lognormal_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_lognormal_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_lognormal_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_lognormal_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_lognormal_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_lognormal_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_lognormal_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_lognormal_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel1_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel1_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel1_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel1_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel1_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel1_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel1_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel1_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel2_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel2_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel2_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel2_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel2_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel2_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_gumbel2_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_gumbel2_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_weibull_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_weibull_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_weibull_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_weibull_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_weibull_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_weibull_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_weibull_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_weibull_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_pareto_P__(double const & x , double const & y , double const & z ){ return gsl_cdf_pareto_P( (const double) x , (const double) y , (const double) z );} double gsl_cdf_pareto_Q__(double const & x , double const & y , double const & z ){ return gsl_cdf_pareto_Q( (const double) x , (const double) y , (const double) z );} double gsl_cdf_pareto_Pinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_pareto_Pinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_pareto_Qinv__(double const & x , double const & y , double const & z ){ return gsl_cdf_pareto_Qinv( (const double) x , (const double) y , (const double) z );} double gsl_cdf_logistic_P__(double const & x , double const & y ){ return gsl_cdf_logistic_P( (const double) x , (const double) y );} double gsl_cdf_logistic_Q__(double const & x , double const & y ){ return gsl_cdf_logistic_Q( (const double) x , (const double) y );} double gsl_cdf_logistic_Pinv__(double const & x , double const & y ){ return gsl_cdf_logistic_Pinv( (const double) x , (const double) y );} double gsl_cdf_logistic_Qinv__(double const & x , double const & y ){ return gsl_cdf_logistic_Qinv( (const double) x , (const double) y );} double gsl_cdf_binomial_P__(long const & x , double const & y , long const & z ){ return gsl_cdf_binomial_P( (const unsigned int) x , (const double) y , (const unsigned int) z );} double gsl_cdf_binomial_Q__(long const & x , double const & y , long const & z ){ return gsl_cdf_binomial_Q( (const unsigned int) x , (const double) y , (const unsigned int) z );} double gsl_cdf_poisson_P__(long const & x , double const & y ){ return gsl_cdf_poisson_P( (const unsigned int) x , (const double) y );} double gsl_cdf_poisson_Q__(long const & x , double const & y ){ return gsl_cdf_poisson_Q( (const unsigned int) x , (const double) y );} double gsl_cdf_geometric_P__(long const & x , double const & y ){ return gsl_cdf_geometric_P( (const unsigned int) x , (const double) y );} double gsl_cdf_geometric_Q__(long const & x , double const & y ){ return gsl_cdf_geometric_Q( (const unsigned int) x , (const double) y );} double gsl_cdf_negative_binomial_P__(long const & x , double const & y , double const & z ){ return gsl_cdf_negative_binomial_P( (const unsigned int) x , (const double) y , (const double) z );} double gsl_cdf_negative_binomial_Q__(long const & x , double const & y , double const & z ){ return gsl_cdf_negative_binomial_Q( (const unsigned int) x , (const double) y , (const double) z );} double gsl_cdf_pascal_P__(long const & x , double const & y , long const & z ){ return gsl_cdf_pascal_P( (const unsigned int) x , (const double) y , (const unsigned int) z );} double gsl_cdf_pascal_Q__(long const & x , double const & y , long const & z ){ return gsl_cdf_pascal_Q( (const unsigned int) x , (const double) y , (const unsigned int) z );} double gsl_ran_bernoulli_pdf__(long const & x , double const & y ){ return gsl_ran_bernoulli_pdf( (const unsigned int) x , (double) y );} double gsl_ran_beta__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_beta( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_beta_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_beta_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_binomial_pdf__(long const & x , double const & y , long const & z ){ return gsl_ran_binomial_pdf( (const unsigned int) x , (const double) y , (const unsigned int) z );} double gsl_ran_exponential__(gsl_rng ** const & x , double const & y ){ return gsl_ran_exponential( (const gsl_rng *)* x , (const double) y );} double gsl_ran_exponential_pdf__(double const & x , double const & y ){ return gsl_ran_exponential_pdf( (const double) x , (const double) y );} double gsl_ran_exppow__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_exppow( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_exppow_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_exppow_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_cauchy__(gsl_rng ** const & x , double const & y ){ return gsl_ran_cauchy( (const gsl_rng *)* x , (const double) y );} double gsl_ran_cauchy_pdf__(double const & x , double const & y ){ return gsl_ran_cauchy_pdf( (const double) x , (const double) y );} double gsl_ran_chisq__(gsl_rng ** const & x , double const & y ){ return gsl_ran_chisq( (const gsl_rng *)* x , (const double) y );} double gsl_ran_chisq_pdf__(double const & x , double const & y ){ return gsl_ran_chisq_pdf( (const double) x , (const double) y );} double gsl_ran_erlang__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_erlang( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_erlang_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_erlang_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_fdist__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_fdist( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_fdist_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_fdist_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_flat__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_flat( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_flat_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_flat_pdf( (double) x , (const double) y , (const double) z );} double gsl_ran_gamma__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_gamma( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_gamma_int__(gsl_rng ** const & x , long const & y ){ return gsl_ran_gamma_int( (const gsl_rng *)* x , (const unsigned int) y );} double gsl_ran_gamma_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_gamma_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_gamma_mt__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_gamma_mt( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_gamma_knuth__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_gamma_knuth( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_gaussian__(gsl_rng ** const & x , double const & y ){ return gsl_ran_gaussian( (const gsl_rng *)* x , (const double) y );} double gsl_ran_gaussian_ratio_method__(gsl_rng ** const & x , double const & y ){ return gsl_ran_gaussian_ratio_method( (const gsl_rng *)* x , (const double) y );} double gsl_ran_gaussian_ziggurat__(gsl_rng ** const & x , double const & y ){ return gsl_ran_gaussian_ziggurat( (const gsl_rng *)* x , (const double) y );} double gsl_ran_gaussian_pdf__(double const & x , double const & y ){ return gsl_ran_gaussian_pdf( (const double) x , (const double) y );} double gsl_ran_ugaussian__(gsl_rng ** const & x ) { return gsl_ran_ugaussian( (const gsl_rng *)* x );} double gsl_ran_ugaussian_ratio_method__(gsl_rng ** const & x ) { return gsl_ran_ugaussian_ratio_method( (const gsl_rng *)* x );} double gsl_ran_ugaussian_pdf__(double const & x ) { return gsl_ran_ugaussian_pdf( (const double) x );} double gsl_ran_gaussian_tail__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_gaussian_tail( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_gaussian_tail_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_gaussian_tail_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_ugaussian_tail__(gsl_rng ** const & x , double const & y ){ return gsl_ran_ugaussian_tail( (const gsl_rng *)* x , (const double) y );} double gsl_ran_ugaussian_tail_pdf__(double const & x , double const & y ){ return gsl_ran_ugaussian_tail_pdf( (const double) x , (const double) y );} double gsl_ran_landau__(gsl_rng ** const & x ) { return gsl_ran_landau( (const gsl_rng *)* x );} double gsl_ran_landau_pdf__(double const & x ) { return gsl_ran_landau_pdf( (const double) x );} double gsl_ran_geometric_pdf__(long const & x , double const & y ){ return gsl_ran_geometric_pdf( (const unsigned int) x , (const double) y );} double gsl_ran_gumbel1__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_gumbel1( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_gumbel1_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_gumbel1_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_gumbel2__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_gumbel2( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_gumbel2_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_gumbel2_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_logistic__(gsl_rng ** const & x , double const & y ){ return gsl_ran_logistic( (const gsl_rng *)* x , (const double) y );} double gsl_ran_logistic_pdf__(double const & x , double const & y ){ return gsl_ran_logistic_pdf( (const double) x , (const double) y );} double gsl_ran_lognormal__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_lognormal( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_lognormal_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_lognormal_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_logarithmic_pdf__(long const & x , double const & y ){ return gsl_ran_logarithmic_pdf( (const unsigned int) x , (const double) y );} double gsl_ran_negative_binomial_pdf__(long const & x , double const & y , double const & z ){ return gsl_ran_negative_binomial_pdf( (const unsigned int) x , (const double) y , (double) z );} double gsl_ran_pascal_pdf__(long const & x , double const & y , long const & z ){ return gsl_ran_pascal_pdf( (const unsigned int) x , (const double) y , (unsigned int) z );} double gsl_ran_pareto__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_pareto( (const gsl_rng *)* x , (double) y , (const double) z );} double gsl_ran_pareto_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_pareto_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_poisson_pdf__(long const & x , double const & y ){ return gsl_ran_poisson_pdf( (const unsigned int) x , (const double) y );} double gsl_ran_rayleigh__(gsl_rng ** const & x , double const & y ){ return gsl_ran_rayleigh( (const gsl_rng *)* x , (const double) y );} double gsl_ran_rayleigh_pdf__(double const & x , double const & y ){ return gsl_ran_rayleigh_pdf( (const double) x , (const double) y );} double gsl_ran_rayleigh_tail__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_rayleigh_tail( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_rayleigh_tail_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_rayleigh_tail_pdf( (const double) x , (const double) y , (const double) z );} double gsl_ran_tdist__(gsl_rng ** const & x , double const & y ){ return gsl_ran_tdist( (const gsl_rng *)* x , (const double) y );} double gsl_ran_tdist_pdf__(double const & x , double const & y ){ return gsl_ran_tdist_pdf( (const double) x , (const double) y );} double gsl_ran_laplace__(gsl_rng ** const & x , double const & y ){ return gsl_ran_laplace( (const gsl_rng *)* x , (const double) y );} double gsl_ran_laplace_pdf__(double const & x , double const & y ){ return gsl_ran_laplace_pdf( (const double) x , (const double) y );} double gsl_ran_levy__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_levy( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_weibull__(gsl_rng ** const & x , double const & y , double const & z ){ return gsl_ran_weibull( (const gsl_rng *)* x , (const double) y , (const double) z );} double gsl_ran_weibull_pdf__(double const & x , double const & y , double const & z ){ return gsl_ran_weibull_pdf( (const double) x , (const double) y , (const double) z );} double gsl_sf_airy_Ai__(double const & x , long const & y ){ return gsl_sf_airy_Ai( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Bi__(double const & x , long const & y ){ return gsl_sf_airy_Bi( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Ai_scaled__(double const & x , long const & y ){ return gsl_sf_airy_Ai_scaled( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Bi_scaled__(double const & x , long const & y ){ return gsl_sf_airy_Bi_scaled( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Ai_deriv__(double const & x , long const & y ){ return gsl_sf_airy_Ai_deriv( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Bi_deriv__(double const & x , long const & y ){ return gsl_sf_airy_Bi_deriv( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Ai_deriv_scaled__(double const & x , long const & y ){ return gsl_sf_airy_Ai_deriv_scaled( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_Bi_deriv_scaled__(double const & x , long const & y ){ return gsl_sf_airy_Bi_deriv_scaled( (const double) x , (gsl_mode_t) y );} double gsl_sf_airy_zero_Ai__(long const & x ) { return gsl_sf_airy_zero_Ai( (unsigned int) x );} double gsl_sf_airy_zero_Bi__(long const & x ) { return gsl_sf_airy_zero_Bi( (unsigned int) x );} double gsl_sf_airy_zero_Ai_deriv__(long const & x ) { return gsl_sf_airy_zero_Ai_deriv( (unsigned int) x );} double gsl_sf_airy_zero_Bi_deriv__(long const & x ) { return gsl_sf_airy_zero_Bi_deriv( (unsigned int) x );} double gsl_sf_bessel_J0__(double const & x ) { return gsl_sf_bessel_J0( (const double) x );} double gsl_sf_bessel_J1__(double const & x ) { return gsl_sf_bessel_J1( (const double) x );} double gsl_sf_bessel_Jn__(long const & x , double const & y ){ return gsl_sf_bessel_Jn( (const int) x , (const double) y );} double gsl_sf_bessel_Y0__(double const & x ) { return gsl_sf_bessel_Y0( (const double) x );} double gsl_sf_bessel_Y1__(double const & x ) { return gsl_sf_bessel_Y1( (const double) x );} double gsl_sf_bessel_Yn__(long const & x , double const & y ){ return gsl_sf_bessel_Yn( (const int) x , (const double) y );} double gsl_sf_bessel_I0__(double const & x ) { return gsl_sf_bessel_I0( (const double) x );} double gsl_sf_bessel_I1__(double const & x ) { return gsl_sf_bessel_I1( (const double) x );} double gsl_sf_bessel_In__(long const & x , double const & y ){ return gsl_sf_bessel_In( (const int) x , (const double) y );} double gsl_sf_bessel_I0_scaled__(double const & x ) { return gsl_sf_bessel_I0_scaled( (const double) x );} double gsl_sf_bessel_I1_scaled__(double const & x ) { return gsl_sf_bessel_I1_scaled( (const double) x );} double gsl_sf_bessel_In_scaled__(long const & x , double const & y ){ return gsl_sf_bessel_In_scaled( (const int) x , (const double) y );} double gsl_sf_bessel_K0__(double const & x ) { return gsl_sf_bessel_K0( (const double) x );} double gsl_sf_bessel_K1__(double const & x ) { return gsl_sf_bessel_K1( (const double) x );} double gsl_sf_bessel_Kn__(long const & x , double const & y ){ return gsl_sf_bessel_Kn( (const int) x , (const double) y );} double gsl_sf_bessel_K0_scaled__(double const & x ) { return gsl_sf_bessel_K0_scaled( (const double) x );} double gsl_sf_bessel_K1_scaled__(double const & x ) { return gsl_sf_bessel_K1_scaled( (const double) x );} double gsl_sf_bessel_Kn_scaled__(long const & x , double const & y ){ return gsl_sf_bessel_Kn_scaled( (const int) x , (const double) y );} double gsl_sf_bessel_j0__(double const & x ) { return gsl_sf_bessel_j0( (const double) x );} double gsl_sf_bessel_j1__(double const & x ) { return gsl_sf_bessel_j1( (const double) x );} double gsl_sf_bessel_j2__(double const & x ) { return gsl_sf_bessel_j2( (const double) x );} double gsl_sf_bessel_jl__(long const & x , double const & y ){ return gsl_sf_bessel_jl( (const int) x , (const double) y );} double gsl_sf_bessel_y0__(double const & x ) { return gsl_sf_bessel_y0( (const double) x );} double gsl_sf_bessel_y1__(double const & x ) { return gsl_sf_bessel_y1( (const double) x );} double gsl_sf_bessel_y2__(double const & x ) { return gsl_sf_bessel_y2( (const double) x );} double gsl_sf_bessel_yl__(long const & x , double const & y ){ return gsl_sf_bessel_yl( (const int) x , (const double) y );} double gsl_sf_bessel_i0_scaled__(double const & x ) { return gsl_sf_bessel_i0_scaled( (const double) x );} double gsl_sf_bessel_i1_scaled__(double const & x ) { return gsl_sf_bessel_i1_scaled( (const double) x );} double gsl_sf_bessel_i2_scaled__(double const & x ) { return gsl_sf_bessel_i2_scaled( (const double) x );} double gsl_sf_bessel_il_scaled__(long const & x , double const & y ){ return gsl_sf_bessel_il_scaled( (const int) x , (const double) y );} double gsl_sf_bessel_k0_scaled__(double const & x ) { return gsl_sf_bessel_k0_scaled( (const double) x );} double gsl_sf_bessel_k1_scaled__(double const & x ) { return gsl_sf_bessel_k1_scaled( (const double) x );} double gsl_sf_bessel_k2_scaled__(double const & x ) { return gsl_sf_bessel_k2_scaled( (const double) x );} double gsl_sf_bessel_kl_scaled__(long const & x , double const & y ){ return gsl_sf_bessel_kl_scaled( (const int) x , (const double) y );} double gsl_sf_bessel_Jnu__(double const & x , double const & y ){ return gsl_sf_bessel_Jnu( (const double) x , (const double) y );} double gsl_sf_bessel_Ynu__(double const & x , double const & y ){ return gsl_sf_bessel_Ynu( (const double) x , (const double) y );} double gsl_sf_bessel_Inu_scaled__(double const & x , double const & y ){ return gsl_sf_bessel_Inu_scaled( (double) x , (double) y );} double gsl_sf_bessel_Inu__(double const & x , double const & y ){ return gsl_sf_bessel_Inu( (double) x , (double) y );} double gsl_sf_bessel_Knu_scaled__(double const & x , double const & y ){ return gsl_sf_bessel_Knu_scaled( (const double) x , (const double) y );} double gsl_sf_bessel_Knu__(double const & x , double const & y ){ return gsl_sf_bessel_Knu( (const double) x , (const double) y );} double gsl_sf_bessel_lnKnu__(double const & x , double const & y ){ return gsl_sf_bessel_lnKnu( (const double) x , (const double) y );} double gsl_sf_bessel_zero_J0__(long const & x ) { return gsl_sf_bessel_zero_J0( (unsigned int) x );} double gsl_sf_bessel_zero_J1__(long const & x ) { return gsl_sf_bessel_zero_J1( (unsigned int) x );} double gsl_sf_bessel_zero_Jnu__(double const & x , long const & y ){ return gsl_sf_bessel_zero_Jnu( (double) x , (unsigned int) y );} double gsl_sf_clausen__(double const & x ) { return gsl_sf_clausen( (const double) x );} double gsl_sf_hydrogenicR_1__(double const & x , double const & y ){ return gsl_sf_hydrogenicR_1( (const double) x , (const double) y );} double gsl_sf_dawson__(double const & x ) { return gsl_sf_dawson( (double) x );} double gsl_sf_debye_1__(double const & x ) { return gsl_sf_debye_1( (const double) x );} double gsl_sf_debye_2__(double const & x ) { return gsl_sf_debye_2( (const double) x );} double gsl_sf_debye_3__(double const & x ) { return gsl_sf_debye_3( (const double) x );} double gsl_sf_debye_4__(double const & x ) { return gsl_sf_debye_4( (const double) x );} double gsl_sf_debye_5__(double const & x ) { return gsl_sf_debye_5( (const double) x );} double gsl_sf_debye_6__(double const & x ) { return gsl_sf_debye_6( (const double) x );} double gsl_sf_dilog__(double const & x ) { return gsl_sf_dilog( (const double) x );} double gsl_sf_multiply__(double const & x , double const & y ){ return gsl_sf_multiply( (const double) x , (const double) y );} double gsl_sf_ellint_Kcomp__(double const & x , long const & y ){ return gsl_sf_ellint_Kcomp( (double) x , (gsl_mode_t) y );} double gsl_sf_ellint_Ecomp__(double const & x , long const & y ){ return gsl_sf_ellint_Ecomp( (double) x , (gsl_mode_t) y );} double gsl_sf_ellint_Pcomp__(double const & x , double const & y , long const & z ){ return gsl_sf_ellint_Pcomp( (double) x , (double) y , (gsl_mode_t) z );} double gsl_sf_ellint_Dcomp__(double const & x , long const & y ){ return gsl_sf_ellint_Dcomp( (double) x , (gsl_mode_t) y );} double gsl_sf_ellint_F__(double const & x , double const & y , long const & z ){ return gsl_sf_ellint_F( (double) x , (double) y , (gsl_mode_t) z );} double gsl_sf_ellint_E__(double const & x , double const & y , long const & z ){ return gsl_sf_ellint_E( (double) x , (double) y , (gsl_mode_t) z );} double gsl_sf_ellint_RC__(double const & x , double const & y , long const & z ){ return gsl_sf_ellint_RC( (double) x , (double) y , (gsl_mode_t) z );} double gsl_sf_erfc__(double const & x ) { return gsl_sf_erfc( (double) x );} double gsl_sf_log_erfc__(double const & x ) { return gsl_sf_log_erfc( (double) x );} double gsl_sf_erf__(double const & x ) { return gsl_sf_erf( (double) x );} double gsl_sf_erf_Z__(double const & x ) { return gsl_sf_erf_Z( (double) x );} double gsl_sf_erf_Q__(double const & x ) { return gsl_sf_erf_Q( (double) x );} double gsl_sf_hazard__(double const & x ) { return gsl_sf_hazard( (double) x );} double gsl_sf_exp__(double const & x ) { return gsl_sf_exp( (const double) x );} double gsl_sf_exp_mult__(double const & x , double const & y ){ return gsl_sf_exp_mult( (const double) x , (const double) y );} double gsl_sf_expm1__(double const & x ) { return gsl_sf_expm1( (const double) x );} double gsl_sf_exprel__(double const & x ) { return gsl_sf_exprel( (const double) x );} double gsl_sf_exprel_2__(double const & x ) { return gsl_sf_exprel_2( (const double) x );} double gsl_sf_exprel_n__(long const & x , double const & y ){ return gsl_sf_exprel_n( (const int) x , (const double) y );} double gsl_sf_expint_E1__(double const & x ) { return gsl_sf_expint_E1( (const double) x );} double gsl_sf_expint_E2__(double const & x ) { return gsl_sf_expint_E2( (const double) x );} double gsl_sf_expint_En__(long const & x , double const & y ){ return gsl_sf_expint_En( (const int) x , (const double) y );} double gsl_sf_expint_E1_scaled__(double const & x ) { return gsl_sf_expint_E1_scaled( (const double) x );} double gsl_sf_expint_E2_scaled__(double const & x ) { return gsl_sf_expint_E2_scaled( (const double) x );} double gsl_sf_expint_En_scaled__(long const & x , double const & y ){ return gsl_sf_expint_En_scaled( (const int) x , (const double) y );} double gsl_sf_expint_Ei__(double const & x ) { return gsl_sf_expint_Ei( (const double) x );} double gsl_sf_expint_Ei_scaled__(double const & x ) { return gsl_sf_expint_Ei_scaled( (const double) x );} double gsl_sf_Shi__(double const & x ) { return gsl_sf_Shi( (const double) x );} double gsl_sf_Chi__(double const & x ) { return gsl_sf_Chi( (const double) x );} double gsl_sf_expint_3__(double const & x ) { return gsl_sf_expint_3( (double) x );} double gsl_sf_Si__(double const & x ) { return gsl_sf_Si( (const double) x );} double gsl_sf_Ci__(double const & x ) { return gsl_sf_Ci( (const double) x );} double gsl_sf_atanint__(double const & x ) { return gsl_sf_atanint( (const double) x );} double gsl_sf_fermi_dirac_m1__(double const & x ) { return gsl_sf_fermi_dirac_m1( (const double) x );} double gsl_sf_fermi_dirac_0__(double const & x ) { return gsl_sf_fermi_dirac_0( (const double) x );} double gsl_sf_fermi_dirac_1__(double const & x ) { return gsl_sf_fermi_dirac_1( (const double) x );} double gsl_sf_fermi_dirac_2__(double const & x ) { return gsl_sf_fermi_dirac_2( (const double) x );} double gsl_sf_fermi_dirac_int__(long const & x , double const & y ){ return gsl_sf_fermi_dirac_int( (const int) x , (const double) y );} double gsl_sf_fermi_dirac_mhalf__(double const & x ) { return gsl_sf_fermi_dirac_mhalf( (const double) x );} double gsl_sf_fermi_dirac_half__(double const & x ) { return gsl_sf_fermi_dirac_half( (const double) x );} double gsl_sf_fermi_dirac_3half__(double const & x ) { return gsl_sf_fermi_dirac_3half( (const double) x );} double gsl_sf_fermi_dirac_inc_0__(double const & x , double const & y ){ return gsl_sf_fermi_dirac_inc_0( (const double) x , (const double) y );} double gsl_sf_lngamma__(double const & x ) { return gsl_sf_lngamma( (const double) x );} double gsl_sf_gamma__(double const & x ) { return gsl_sf_gamma( (const double) x );} double gsl_sf_gammastar__(double const & x ) { return gsl_sf_gammastar( (const double) x );} double gsl_sf_gammainv__(double const & x ) { return gsl_sf_gammainv( (const double) x );} double gsl_sf_taylorcoeff__(long const & x , double const & y ){ return gsl_sf_taylorcoeff( (const int) x , (const double) y );} double gsl_sf_fact__(long const & x ) { return gsl_sf_fact( (const unsigned int) x );} double gsl_sf_doublefact__(long const & x ) { return gsl_sf_doublefact( (const unsigned int) x );} double gsl_sf_lnfact__(long const & x ) { return gsl_sf_lnfact( (const unsigned int) x );} double gsl_sf_lndoublefact__(long const & x ) { return gsl_sf_lndoublefact( (const unsigned int) x );} double gsl_sf_lnchoose__(long const & x , long const & y ){ return gsl_sf_lnchoose( (unsigned int) x , (unsigned int) y );} double gsl_sf_choose__(long const & x , long const & y ){ return gsl_sf_choose( (unsigned int) x , (unsigned int) y );} double gsl_sf_lnpoch__(double const & x , double const & y ){ return gsl_sf_lnpoch( (const double) x , (const double) y );} double gsl_sf_poch__(double const & x , double const & y ){ return gsl_sf_poch( (const double) x , (const double) y );} double gsl_sf_pochrel__(double const & x , double const & y ){ return gsl_sf_pochrel( (const double) x , (const double) y );} double gsl_sf_gamma_inc_Q__(double const & x , double const & y ){ return gsl_sf_gamma_inc_Q( (const double) x , (const double) y );} double gsl_sf_gamma_inc_P__(double const & x , double const & y ){ return gsl_sf_gamma_inc_P( (const double) x , (const double) y );} double gsl_sf_gamma_inc__(double const & x , double const & y ){ return gsl_sf_gamma_inc( (const double) x , (const double) y );} double gsl_sf_lnbeta__(double const & x , double const & y ){ return gsl_sf_lnbeta( (const double) x , (const double) y );} double gsl_sf_beta__(double const & x , double const & y ){ return gsl_sf_beta( (const double) x , (const double) y );} double gsl_sf_beta_inc__(double const & x , double const & y , double const & z ){ return gsl_sf_beta_inc( (const double) x , (const double) y , (const double) z );} double gsl_sf_gegenpoly_1__(double const & x , double const & y ){ return gsl_sf_gegenpoly_1( (double) x , (double) y );} double gsl_sf_gegenpoly_2__(double const & x , double const & y ){ return gsl_sf_gegenpoly_2( (double) x , (double) y );} double gsl_sf_gegenpoly_3__(double const & x , double const & y ){ return gsl_sf_gegenpoly_3( (double) x , (double) y );} double gsl_sf_gegenpoly_n__(long const & x , double const & y , double const & z ){ return gsl_sf_gegenpoly_n( (int) x , (double) y , (double) z );} double gsl_sf_hyperg_0F1__(double const & x , double const & y ){ return gsl_sf_hyperg_0F1( (const double) x , (const double) y );} double gsl_sf_hyperg_1F1_int__(long const & x , long const & y , double const & z ){ return gsl_sf_hyperg_1F1_int( (const int) x , (const int) y , (double) z );} double gsl_sf_hyperg_1F1__(double const & x , double const & y , double const & z ){ return gsl_sf_hyperg_1F1( (double) x , (double) y , (double) z );} double gsl_sf_hyperg_U_int__(long const & x , long const & y , double const & z ){ return gsl_sf_hyperg_U_int( (const int) x , (const int) y , (const double) z );} double gsl_sf_hyperg_U__(double const & x , double const & y , double const & z ){ return gsl_sf_hyperg_U( (const double) x , (const double) y , (const double) z );} double gsl_sf_hyperg_2F0__(double const & x , double const & y , double const & z ){ return gsl_sf_hyperg_2F0( (const double) x , (const double) y , (const double) z );} double gsl_sf_laguerre_1__(double const & x , double const & y ){ return gsl_sf_laguerre_1( (double) x , (double) y );} double gsl_sf_laguerre_2__(double const & x , double const & y ){ return gsl_sf_laguerre_2( (double) x , (double) y );} double gsl_sf_laguerre_3__(double const & x , double const & y ){ return gsl_sf_laguerre_3( (double) x , (double) y );} double gsl_sf_laguerre_n__(long const & x , double const & y , double const & z ){ return gsl_sf_laguerre_n( (int) x , (double) y , (double) z );} double gsl_sf_lambert_W0__(double const & x ) { return gsl_sf_lambert_W0( (double) x );} double gsl_sf_lambert_Wm1__(double const & x ) { return gsl_sf_lambert_Wm1( (double) x );} double gsl_sf_legendre_Pl__(long const & x , double const & y ){ return gsl_sf_legendre_Pl( (const int) x , (const double) y );} double gsl_sf_legendre_P1__(double const & x ) { return gsl_sf_legendre_P1( (const double) x );} double gsl_sf_legendre_P2__(double const & x ) { return gsl_sf_legendre_P2( (const double) x );} double gsl_sf_legendre_P3__(double const & x ) { return gsl_sf_legendre_P3( (const double) x );} double gsl_sf_legendre_Q0__(double const & x ) { return gsl_sf_legendre_Q0( (const double) x );} double gsl_sf_legendre_Q1__(double const & x ) { return gsl_sf_legendre_Q1( (const double) x );} double gsl_sf_legendre_Ql__(long const & x , double const & y ){ return gsl_sf_legendre_Ql( (const int) x , (const double) y );} double gsl_sf_legendre_Plm__(long const & x , long const & y , double const & z ){ return gsl_sf_legendre_Plm( (const int) x , (const int) y , (const double) z );} double gsl_sf_legendre_sphPlm__(long const & x , long const & y , double const & z ){ return gsl_sf_legendre_sphPlm( (const int) x , (const int) y , (const double) z );} long gsl_sf_legendre_array_size__(long const & x , long const & y ){ return gsl_sf_legendre_array_size( (const int) x , (const int) y );} double gsl_sf_conicalP_half__(double const & x , double const & y ){ return gsl_sf_conicalP_half( (const double) x , (const double) y );} double gsl_sf_conicalP_mhalf__(double const & x , double const & y ){ return gsl_sf_conicalP_mhalf( (const double) x , (const double) y );} double gsl_sf_conicalP_0__(double const & x , double const & y ){ return gsl_sf_conicalP_0( (const double) x , (const double) y );} double gsl_sf_conicalP_1__(double const & x , double const & y ){ return gsl_sf_conicalP_1( (const double) x , (const double) y );} double gsl_sf_conicalP_sph_reg__(long const & x , double const & y , double const & z ){ return gsl_sf_conicalP_sph_reg( (const int) x , (const double) y , (const double) z );} double gsl_sf_conicalP_cyl_reg__(long const & x , double const & y , double const & z ){ return gsl_sf_conicalP_cyl_reg( (const int) x , (const double) y , (const double) z );} double gsl_sf_legendre_H3d_0__(double const & x , double const & y ){ return gsl_sf_legendre_H3d_0( (const double) x , (const double) y );} double gsl_sf_legendre_H3d_1__(double const & x , double const & y ){ return gsl_sf_legendre_H3d_1( (const double) x , (const double) y );} double gsl_sf_legendre_H3d__(long const & x , double const & y , double const & z ){ return gsl_sf_legendre_H3d( (const int) x , (const double) y , (const double) z );} double gsl_sf_log__(double const & x ) { return gsl_sf_log( (const double) x );} double gsl_sf_log_abs__(double const & x ) { return gsl_sf_log_abs( (const double) x );} double gsl_sf_log_1plusx__(double const & x ) { return gsl_sf_log_1plusx( (const double) x );} double gsl_sf_log_1plusx_mx__(double const & x ) { return gsl_sf_log_1plusx_mx( (const double) x );} double gsl_sf_pow_int__(double const & x , long const & y ){ return gsl_sf_pow_int( (const double) x , (const int) y );} double gsl_sf_psi_int__(long const & x ) { return gsl_sf_psi_int( (const int) x );} double gsl_sf_psi__(double const & x ) { return gsl_sf_psi( (const double) x );} double gsl_sf_psi_1piy__(double const & x ) { return gsl_sf_psi_1piy( (const double) x );} double gsl_sf_psi_1_int__(long const & x ) { return gsl_sf_psi_1_int( (const int) x );} double gsl_sf_psi_1__(double const & x ) { return gsl_sf_psi_1( (const double) x );} double gsl_sf_psi_n__(long const & x , double const & y ){ return gsl_sf_psi_n( (const int) x , (const double) y );} double gsl_sf_synchrotron_1__(double const & x ) { return gsl_sf_synchrotron_1( (const double) x );} double gsl_sf_synchrotron_2__(double const & x ) { return gsl_sf_synchrotron_2( (const double) x );} double gsl_sf_transport_2__(double const & x ) { return gsl_sf_transport_2( (const double) x );} double gsl_sf_transport_3__(double const & x ) { return gsl_sf_transport_3( (const double) x );} double gsl_sf_transport_4__(double const & x ) { return gsl_sf_transport_4( (const double) x );} double gsl_sf_transport_5__(double const & x ) { return gsl_sf_transport_5( (const double) x );} double gsl_sf_sin__(double const & x ) { return gsl_sf_sin( (const double) x );} double gsl_sf_cos__(double const & x ) { return gsl_sf_cos( (const double) x );} double gsl_sf_hypot__(double const & x , double const & y ){ return gsl_sf_hypot( (const double) x , (const double) y );} double gsl_sf_sinc__(double const & x ) { return gsl_sf_sinc( (const double) x );} double gsl_sf_lnsinh__(double const & x ) { return gsl_sf_lnsinh( (const double) x );} double gsl_sf_lncosh__(double const & x ) { return gsl_sf_lncosh( (const double) x );} double gsl_sf_angle_restrict_symm__(double const & x ) { return gsl_sf_angle_restrict_symm( (const double) x );} double gsl_sf_angle_restrict_pos__(double const & x ) { return gsl_sf_angle_restrict_pos( (const double) x );} double gsl_sf_zeta_int__(long const & x ) { return gsl_sf_zeta_int( (const int) x );} double gsl_sf_zeta__(double const & x ) { return gsl_sf_zeta( (const double) x );} double gsl_sf_zetam1__(double const & x ) { return gsl_sf_zetam1( (const double) x );} double gsl_sf_zetam1_int__(long const & x ) { return gsl_sf_zetam1_int( (const int) x );} double gsl_sf_hzeta__(double const & x , double const & y ){ return gsl_sf_hzeta( (const double) x , (const double) y );} double gsl_sf_eta_int__(long const & x ) { return gsl_sf_eta_int( (const int) x );} double gsl_sf_eta__(double const & x ) { return gsl_sf_eta( (const double) x );} /*****************/ /*****************/ void init_gsl_sf() { Global.Add("gslcdfugaussianP","(",new OneOperator1_( gsl_cdf_ugaussian_P__)); Global.Add("gslcdfugaussianQ","(",new OneOperator1_( gsl_cdf_ugaussian_Q__)); Global.Add("gslcdfugaussianPinv","(",new OneOperator1_( gsl_cdf_ugaussian_Pinv__)); Global.Add("gslcdfugaussianQinv","(",new OneOperator1_( gsl_cdf_ugaussian_Qinv__)); Global.Add("gslcdfgaussianP","(",new OneOperator2_( gsl_cdf_gaussian_P__)); Global.Add("gslcdfgaussianQ","(",new OneOperator2_( gsl_cdf_gaussian_Q__)); Global.Add("gslcdfgaussianPinv","(",new OneOperator2_( gsl_cdf_gaussian_Pinv__)); Global.Add("gslcdfgaussianQinv","(",new OneOperator2_( gsl_cdf_gaussian_Qinv__)); Global.Add("gslcdfgammaP","(",new OneOperator3_( gsl_cdf_gamma_P__)); Global.Add("gslcdfgammaQ","(",new OneOperator3_( gsl_cdf_gamma_Q__)); Global.Add("gslcdfgammaPinv","(",new OneOperator3_( gsl_cdf_gamma_Pinv__)); Global.Add("gslcdfgammaQinv","(",new OneOperator3_( gsl_cdf_gamma_Qinv__)); Global.Add("gslcdfcauchyP","(",new OneOperator2_( gsl_cdf_cauchy_P__)); Global.Add("gslcdfcauchyQ","(",new OneOperator2_( gsl_cdf_cauchy_Q__)); Global.Add("gslcdfcauchyPinv","(",new OneOperator2_( gsl_cdf_cauchy_Pinv__)); Global.Add("gslcdfcauchyQinv","(",new OneOperator2_( gsl_cdf_cauchy_Qinv__)); Global.Add("gslcdflaplaceP","(",new OneOperator2_( gsl_cdf_laplace_P__)); Global.Add("gslcdflaplaceQ","(",new OneOperator2_( gsl_cdf_laplace_Q__)); Global.Add("gslcdflaplacePinv","(",new OneOperator2_( gsl_cdf_laplace_Pinv__)); Global.Add("gslcdflaplaceQinv","(",new OneOperator2_( gsl_cdf_laplace_Qinv__)); Global.Add("gslcdfrayleighP","(",new OneOperator2_( gsl_cdf_rayleigh_P__)); Global.Add("gslcdfrayleighQ","(",new OneOperator2_( gsl_cdf_rayleigh_Q__)); Global.Add("gslcdfrayleighPinv","(",new OneOperator2_( gsl_cdf_rayleigh_Pinv__)); Global.Add("gslcdfrayleighQinv","(",new OneOperator2_( gsl_cdf_rayleigh_Qinv__)); Global.Add("gslcdfchisqP","(",new OneOperator2_( gsl_cdf_chisq_P__)); Global.Add("gslcdfchisqQ","(",new OneOperator2_( gsl_cdf_chisq_Q__)); Global.Add("gslcdfchisqPinv","(",new OneOperator2_( gsl_cdf_chisq_Pinv__)); Global.Add("gslcdfchisqQinv","(",new OneOperator2_( gsl_cdf_chisq_Qinv__)); Global.Add("gslcdfexponentialP","(",new OneOperator2_( gsl_cdf_exponential_P__)); Global.Add("gslcdfexponentialQ","(",new OneOperator2_( gsl_cdf_exponential_Q__)); Global.Add("gslcdfexponentialPinv","(",new OneOperator2_( gsl_cdf_exponential_Pinv__)); Global.Add("gslcdfexponentialQinv","(",new OneOperator2_( gsl_cdf_exponential_Qinv__)); Global.Add("gslcdfexppowP","(",new OneOperator3_( gsl_cdf_exppow_P__)); Global.Add("gslcdfexppowQ","(",new OneOperator3_( gsl_cdf_exppow_Q__)); Global.Add("gslcdftdistP","(",new OneOperator2_( gsl_cdf_tdist_P__)); Global.Add("gslcdftdistQ","(",new OneOperator2_( gsl_cdf_tdist_Q__)); Global.Add("gslcdftdistPinv","(",new OneOperator2_( gsl_cdf_tdist_Pinv__)); Global.Add("gslcdftdistQinv","(",new OneOperator2_( gsl_cdf_tdist_Qinv__)); Global.Add("gslcdffdistP","(",new OneOperator3_( gsl_cdf_fdist_P__)); Global.Add("gslcdffdistQ","(",new OneOperator3_( gsl_cdf_fdist_Q__)); Global.Add("gslcdffdistPinv","(",new OneOperator3_( gsl_cdf_fdist_Pinv__)); Global.Add("gslcdffdistQinv","(",new OneOperator3_( gsl_cdf_fdist_Qinv__)); Global.Add("gslcdfbetaP","(",new OneOperator3_( gsl_cdf_beta_P__)); Global.Add("gslcdfbetaQ","(",new OneOperator3_( gsl_cdf_beta_Q__)); Global.Add("gslcdfbetaPinv","(",new OneOperator3_( gsl_cdf_beta_Pinv__)); Global.Add("gslcdfbetaQinv","(",new OneOperator3_( gsl_cdf_beta_Qinv__)); Global.Add("gslcdfflatP","(",new OneOperator3_( gsl_cdf_flat_P__)); Global.Add("gslcdfflatQ","(",new OneOperator3_( gsl_cdf_flat_Q__)); Global.Add("gslcdfflatPinv","(",new OneOperator3_( gsl_cdf_flat_Pinv__)); Global.Add("gslcdfflatQinv","(",new OneOperator3_( gsl_cdf_flat_Qinv__)); Global.Add("gslcdflognormalP","(",new OneOperator3_( gsl_cdf_lognormal_P__)); Global.Add("gslcdflognormalQ","(",new OneOperator3_( gsl_cdf_lognormal_Q__)); Global.Add("gslcdflognormalPinv","(",new OneOperator3_( gsl_cdf_lognormal_Pinv__)); Global.Add("gslcdflognormalQinv","(",new OneOperator3_( gsl_cdf_lognormal_Qinv__)); Global.Add("gslcdfgumbel1P","(",new OneOperator3_( gsl_cdf_gumbel1_P__)); Global.Add("gslcdfgumbel1Q","(",new OneOperator3_( gsl_cdf_gumbel1_Q__)); Global.Add("gslcdfgumbel1Pinv","(",new OneOperator3_( gsl_cdf_gumbel1_Pinv__)); Global.Add("gslcdfgumbel1Qinv","(",new OneOperator3_( gsl_cdf_gumbel1_Qinv__)); Global.Add("gslcdfgumbel2P","(",new OneOperator3_( gsl_cdf_gumbel2_P__)); Global.Add("gslcdfgumbel2Q","(",new OneOperator3_( gsl_cdf_gumbel2_Q__)); Global.Add("gslcdfgumbel2Pinv","(",new OneOperator3_( gsl_cdf_gumbel2_Pinv__)); Global.Add("gslcdfgumbel2Qinv","(",new OneOperator3_( gsl_cdf_gumbel2_Qinv__)); Global.Add("gslcdfweibullP","(",new OneOperator3_( gsl_cdf_weibull_P__)); Global.Add("gslcdfweibullQ","(",new OneOperator3_( gsl_cdf_weibull_Q__)); Global.Add("gslcdfweibullPinv","(",new OneOperator3_( gsl_cdf_weibull_Pinv__)); Global.Add("gslcdfweibullQinv","(",new OneOperator3_( gsl_cdf_weibull_Qinv__)); Global.Add("gslcdfparetoP","(",new OneOperator3_( gsl_cdf_pareto_P__)); Global.Add("gslcdfparetoQ","(",new OneOperator3_( gsl_cdf_pareto_Q__)); Global.Add("gslcdfparetoPinv","(",new OneOperator3_( gsl_cdf_pareto_Pinv__)); Global.Add("gslcdfparetoQinv","(",new OneOperator3_( gsl_cdf_pareto_Qinv__)); Global.Add("gslcdflogisticP","(",new OneOperator2_( gsl_cdf_logistic_P__)); Global.Add("gslcdflogisticQ","(",new OneOperator2_( gsl_cdf_logistic_Q__)); Global.Add("gslcdflogisticPinv","(",new OneOperator2_( gsl_cdf_logistic_Pinv__)); Global.Add("gslcdflogisticQinv","(",new OneOperator2_( gsl_cdf_logistic_Qinv__)); Global.Add("gslcdfbinomialP","(",new OneOperator3_( gsl_cdf_binomial_P__)); Global.Add("gslcdfbinomialQ","(",new OneOperator3_( gsl_cdf_binomial_Q__)); Global.Add("gslcdfpoissonP","(",new OneOperator2_( gsl_cdf_poisson_P__)); Global.Add("gslcdfpoissonQ","(",new OneOperator2_( gsl_cdf_poisson_Q__)); Global.Add("gslcdfgeometricP","(",new OneOperator2_( gsl_cdf_geometric_P__)); Global.Add("gslcdfgeometricQ","(",new OneOperator2_( gsl_cdf_geometric_Q__)); Global.Add("gslcdfnegativebinomialP","(",new OneOperator3_( gsl_cdf_negative_binomial_P__)); Global.Add("gslcdfnegativebinomialQ","(",new OneOperator3_( gsl_cdf_negative_binomial_Q__)); Global.Add("gslcdfpascalP","(",new OneOperator3_( gsl_cdf_pascal_P__)); Global.Add("gslcdfpascalQ","(",new OneOperator3_( gsl_cdf_pascal_Q__)); Global.Add("gslranbernoullipdf","(",new OneOperator2_( gsl_ran_bernoulli_pdf__)); Global.Add("gslranbeta","(",new OneOperator3_( gsl_ran_beta__)); Global.Add("gslranbetapdf","(",new OneOperator3_( gsl_ran_beta_pdf__)); Global.Add("gslranbinomialpdf","(",new OneOperator3_( gsl_ran_binomial_pdf__)); Global.Add("gslranexponential","(",new OneOperator2_( gsl_ran_exponential__)); Global.Add("gslranexponentialpdf","(",new OneOperator2_( gsl_ran_exponential_pdf__)); Global.Add("gslranexppow","(",new OneOperator3_( gsl_ran_exppow__)); Global.Add("gslranexppowpdf","(",new OneOperator3_( gsl_ran_exppow_pdf__)); Global.Add("gslrancauchy","(",new OneOperator2_( gsl_ran_cauchy__)); Global.Add("gslrancauchypdf","(",new OneOperator2_( gsl_ran_cauchy_pdf__)); Global.Add("gslranchisq","(",new OneOperator2_( gsl_ran_chisq__)); Global.Add("gslranchisqpdf","(",new OneOperator2_( gsl_ran_chisq_pdf__)); Global.Add("gslranerlang","(",new OneOperator3_( gsl_ran_erlang__)); Global.Add("gslranerlangpdf","(",new OneOperator3_( gsl_ran_erlang_pdf__)); Global.Add("gslranfdist","(",new OneOperator3_( gsl_ran_fdist__)); Global.Add("gslranfdistpdf","(",new OneOperator3_( gsl_ran_fdist_pdf__)); Global.Add("gslranflat","(",new OneOperator3_( gsl_ran_flat__)); Global.Add("gslranflatpdf","(",new OneOperator3_( gsl_ran_flat_pdf__)); Global.Add("gslrangamma","(",new OneOperator3_( gsl_ran_gamma__)); Global.Add("gslrangammaint","(",new OneOperator2_( gsl_ran_gamma_int__)); Global.Add("gslrangammapdf","(",new OneOperator3_( gsl_ran_gamma_pdf__)); Global.Add("gslrangammamt","(",new OneOperator3_( gsl_ran_gamma_mt__)); Global.Add("gslrangammaknuth","(",new OneOperator3_( gsl_ran_gamma_knuth__)); Global.Add("gslrangaussian","(",new OneOperator2_( gsl_ran_gaussian__)); Global.Add("gslrangaussianratiomethod","(",new OneOperator2_( gsl_ran_gaussian_ratio_method__)); Global.Add("gslrangaussianziggurat","(",new OneOperator2_( gsl_ran_gaussian_ziggurat__)); Global.Add("gslrangaussianpdf","(",new OneOperator2_( gsl_ran_gaussian_pdf__)); Global.Add("gslranugaussian","(",new OneOperator1_( gsl_ran_ugaussian__)); Global.Add("gslranugaussianratiomethod","(",new OneOperator1_( gsl_ran_ugaussian_ratio_method__)); Global.Add("gslranugaussianpdf","(",new OneOperator1_( gsl_ran_ugaussian_pdf__)); Global.Add("gslrangaussiantail","(",new OneOperator3_( gsl_ran_gaussian_tail__)); Global.Add("gslrangaussiantailpdf","(",new OneOperator3_( gsl_ran_gaussian_tail_pdf__)); Global.Add("gslranugaussiantail","(",new OneOperator2_( gsl_ran_ugaussian_tail__)); Global.Add("gslranugaussiantailpdf","(",new OneOperator2_( gsl_ran_ugaussian_tail_pdf__)); Global.Add("gslranlandau","(",new OneOperator1_( gsl_ran_landau__)); Global.Add("gslranlandaupdf","(",new OneOperator1_( gsl_ran_landau_pdf__)); Global.Add("gslrangeometricpdf","(",new OneOperator2_( gsl_ran_geometric_pdf__)); Global.Add("gslrangumbel1","(",new OneOperator3_( gsl_ran_gumbel1__)); Global.Add("gslrangumbel1pdf","(",new OneOperator3_( gsl_ran_gumbel1_pdf__)); Global.Add("gslrangumbel2","(",new OneOperator3_( gsl_ran_gumbel2__)); Global.Add("gslrangumbel2pdf","(",new OneOperator3_( gsl_ran_gumbel2_pdf__)); Global.Add("gslranlogistic","(",new OneOperator2_( gsl_ran_logistic__)); Global.Add("gslranlogisticpdf","(",new OneOperator2_( gsl_ran_logistic_pdf__)); Global.Add("gslranlognormal","(",new OneOperator3_( gsl_ran_lognormal__)); Global.Add("gslranlognormalpdf","(",new OneOperator3_( gsl_ran_lognormal_pdf__)); Global.Add("gslranlogarithmicpdf","(",new OneOperator2_( gsl_ran_logarithmic_pdf__)); Global.Add("gslrannegativebinomialpdf","(",new OneOperator3_( gsl_ran_negative_binomial_pdf__)); Global.Add("gslranpascalpdf","(",new OneOperator3_( gsl_ran_pascal_pdf__)); Global.Add("gslranpareto","(",new OneOperator3_( gsl_ran_pareto__)); Global.Add("gslranparetopdf","(",new OneOperator3_( gsl_ran_pareto_pdf__)); Global.Add("gslranpoissonpdf","(",new OneOperator2_( gsl_ran_poisson_pdf__)); Global.Add("gslranrayleigh","(",new OneOperator2_( gsl_ran_rayleigh__)); Global.Add("gslranrayleighpdf","(",new OneOperator2_( gsl_ran_rayleigh_pdf__)); Global.Add("gslranrayleightail","(",new OneOperator3_( gsl_ran_rayleigh_tail__)); Global.Add("gslranrayleightailpdf","(",new OneOperator3_( gsl_ran_rayleigh_tail_pdf__)); Global.Add("gslrantdist","(",new OneOperator2_( gsl_ran_tdist__)); Global.Add("gslrantdistpdf","(",new OneOperator2_( gsl_ran_tdist_pdf__)); Global.Add("gslranlaplace","(",new OneOperator2_( gsl_ran_laplace__)); Global.Add("gslranlaplacepdf","(",new OneOperator2_( gsl_ran_laplace_pdf__)); Global.Add("gslranlevy","(",new OneOperator3_( gsl_ran_levy__)); Global.Add("gslranweibull","(",new OneOperator3_( gsl_ran_weibull__)); Global.Add("gslranweibullpdf","(",new OneOperator3_( gsl_ran_weibull_pdf__)); Global.Add("gslsfairyAi","(",new OneOperator2_( gsl_sf_airy_Ai__)); Global.Add("gslsfairyBi","(",new OneOperator2_( gsl_sf_airy_Bi__)); Global.Add("gslsfairyAiscaled","(",new OneOperator2_( gsl_sf_airy_Ai_scaled__)); Global.Add("gslsfairyBiscaled","(",new OneOperator2_( gsl_sf_airy_Bi_scaled__)); Global.Add("gslsfairyAideriv","(",new OneOperator2_( gsl_sf_airy_Ai_deriv__)); Global.Add("gslsfairyBideriv","(",new OneOperator2_( gsl_sf_airy_Bi_deriv__)); Global.Add("gslsfairyAiderivscaled","(",new OneOperator2_( gsl_sf_airy_Ai_deriv_scaled__)); Global.Add("gslsfairyBiderivscaled","(",new OneOperator2_( gsl_sf_airy_Bi_deriv_scaled__)); Global.Add("gslsfairyzeroAi","(",new OneOperator1_( gsl_sf_airy_zero_Ai__)); Global.Add("gslsfairyzeroBi","(",new OneOperator1_( gsl_sf_airy_zero_Bi__)); Global.Add("gslsfairyzeroAideriv","(",new OneOperator1_( gsl_sf_airy_zero_Ai_deriv__)); Global.Add("gslsfairyzeroBideriv","(",new OneOperator1_( gsl_sf_airy_zero_Bi_deriv__)); Global.Add("gslsfbesselJ0","(",new OneOperator1_( gsl_sf_bessel_J0__)); Global.Add("gslsfbesselJ1","(",new OneOperator1_( gsl_sf_bessel_J1__)); Global.Add("gslsfbesselJn","(",new OneOperator2_( gsl_sf_bessel_Jn__)); Global.Add("gslsfbesselY0","(",new OneOperator1_( gsl_sf_bessel_Y0__)); Global.Add("gslsfbesselY1","(",new OneOperator1_( gsl_sf_bessel_Y1__)); Global.Add("gslsfbesselYn","(",new OneOperator2_( gsl_sf_bessel_Yn__)); Global.Add("gslsfbesselI0","(",new OneOperator1_( gsl_sf_bessel_I0__)); Global.Add("gslsfbesselI1","(",new OneOperator1_( gsl_sf_bessel_I1__)); Global.Add("gslsfbesselIn","(",new OneOperator2_( gsl_sf_bessel_In__)); Global.Add("gslsfbesselI0scaled","(",new OneOperator1_( gsl_sf_bessel_I0_scaled__)); Global.Add("gslsfbesselI1scaled","(",new OneOperator1_( gsl_sf_bessel_I1_scaled__)); Global.Add("gslsfbesselInscaled","(",new OneOperator2_( gsl_sf_bessel_In_scaled__)); Global.Add("gslsfbesselK0","(",new OneOperator1_( gsl_sf_bessel_K0__)); Global.Add("gslsfbesselK1","(",new OneOperator1_( gsl_sf_bessel_K1__)); Global.Add("gslsfbesselKn","(",new OneOperator2_( gsl_sf_bessel_Kn__)); Global.Add("gslsfbesselK0scaled","(",new OneOperator1_( gsl_sf_bessel_K0_scaled__)); Global.Add("gslsfbesselK1scaled","(",new OneOperator1_( gsl_sf_bessel_K1_scaled__)); Global.Add("gslsfbesselKnscaled","(",new OneOperator2_( gsl_sf_bessel_Kn_scaled__)); Global.Add("gslsfbesselj0","(",new OneOperator1_( gsl_sf_bessel_j0__)); Global.Add("gslsfbesselj1","(",new OneOperator1_( gsl_sf_bessel_j1__)); Global.Add("gslsfbesselj2","(",new OneOperator1_( gsl_sf_bessel_j2__)); Global.Add("gslsfbesseljl","(",new OneOperator2_( gsl_sf_bessel_jl__)); Global.Add("gslsfbessely0","(",new OneOperator1_( gsl_sf_bessel_y0__)); Global.Add("gslsfbessely1","(",new OneOperator1_( gsl_sf_bessel_y1__)); Global.Add("gslsfbessely2","(",new OneOperator1_( gsl_sf_bessel_y2__)); Global.Add("gslsfbesselyl","(",new OneOperator2_( gsl_sf_bessel_yl__)); Global.Add("gslsfbesseli0scaled","(",new OneOperator1_( gsl_sf_bessel_i0_scaled__)); Global.Add("gslsfbesseli1scaled","(",new OneOperator1_( gsl_sf_bessel_i1_scaled__)); Global.Add("gslsfbesseli2scaled","(",new OneOperator1_( gsl_sf_bessel_i2_scaled__)); Global.Add("gslsfbesselilscaled","(",new OneOperator2_( gsl_sf_bessel_il_scaled__)); Global.Add("gslsfbesselk0scaled","(",new OneOperator1_( gsl_sf_bessel_k0_scaled__)); Global.Add("gslsfbesselk1scaled","(",new OneOperator1_( gsl_sf_bessel_k1_scaled__)); Global.Add("gslsfbesselk2scaled","(",new OneOperator1_( gsl_sf_bessel_k2_scaled__)); Global.Add("gslsfbesselklscaled","(",new OneOperator2_( gsl_sf_bessel_kl_scaled__)); Global.Add("gslsfbesselJnu","(",new OneOperator2_( gsl_sf_bessel_Jnu__)); Global.Add("gslsfbesselYnu","(",new OneOperator2_( gsl_sf_bessel_Ynu__)); Global.Add("gslsfbesselInuscaled","(",new OneOperator2_( gsl_sf_bessel_Inu_scaled__)); Global.Add("gslsfbesselInu","(",new OneOperator2_( gsl_sf_bessel_Inu__)); Global.Add("gslsfbesselKnuscaled","(",new OneOperator2_( gsl_sf_bessel_Knu_scaled__)); Global.Add("gslsfbesselKnu","(",new OneOperator2_( gsl_sf_bessel_Knu__)); Global.Add("gslsfbessellnKnu","(",new OneOperator2_( gsl_sf_bessel_lnKnu__)); Global.Add("gslsfbesselzeroJ0","(",new OneOperator1_( gsl_sf_bessel_zero_J0__)); Global.Add("gslsfbesselzeroJ1","(",new OneOperator1_( gsl_sf_bessel_zero_J1__)); Global.Add("gslsfbesselzeroJnu","(",new OneOperator2_( gsl_sf_bessel_zero_Jnu__)); Global.Add("gslsfclausen","(",new OneOperator1_( gsl_sf_clausen__)); Global.Add("gslsfhydrogenicR1","(",new OneOperator2_( gsl_sf_hydrogenicR_1__)); Global.Add("gslsfdawson","(",new OneOperator1_( gsl_sf_dawson__)); Global.Add("gslsfdebye1","(",new OneOperator1_( gsl_sf_debye_1__)); Global.Add("gslsfdebye2","(",new OneOperator1_( gsl_sf_debye_2__)); Global.Add("gslsfdebye3","(",new OneOperator1_( gsl_sf_debye_3__)); Global.Add("gslsfdebye4","(",new OneOperator1_( gsl_sf_debye_4__)); Global.Add("gslsfdebye5","(",new OneOperator1_( gsl_sf_debye_5__)); Global.Add("gslsfdebye6","(",new OneOperator1_( gsl_sf_debye_6__)); Global.Add("gslsfdilog","(",new OneOperator1_( gsl_sf_dilog__)); Global.Add("gslsfmultiply","(",new OneOperator2_( gsl_sf_multiply__)); Global.Add("gslsfellintKcomp","(",new OneOperator2_( gsl_sf_ellint_Kcomp__)); Global.Add("gslsfellintEcomp","(",new OneOperator2_( gsl_sf_ellint_Ecomp__)); Global.Add("gslsfellintPcomp","(",new OneOperator3_( gsl_sf_ellint_Pcomp__)); Global.Add("gslsfellintDcomp","(",new OneOperator2_( gsl_sf_ellint_Dcomp__)); Global.Add("gslsfellintF","(",new OneOperator3_( gsl_sf_ellint_F__)); Global.Add("gslsfellintE","(",new OneOperator3_( gsl_sf_ellint_E__)); Global.Add("gslsfellintRC","(",new OneOperator3_( gsl_sf_ellint_RC__)); Global.Add("gslsferfc","(",new OneOperator1_( gsl_sf_erfc__)); Global.Add("gslsflogerfc","(",new OneOperator1_( gsl_sf_log_erfc__)); Global.Add("gslsferf","(",new OneOperator1_( gsl_sf_erf__)); Global.Add("gslsferfZ","(",new OneOperator1_( gsl_sf_erf_Z__)); Global.Add("gslsferfQ","(",new OneOperator1_( gsl_sf_erf_Q__)); Global.Add("gslsfhazard","(",new OneOperator1_( gsl_sf_hazard__)); Global.Add("gslsfexp","(",new OneOperator1_( gsl_sf_exp__)); Global.Add("gslsfexpmult","(",new OneOperator2_( gsl_sf_exp_mult__)); Global.Add("gslsfexpm1","(",new OneOperator1_( gsl_sf_expm1__)); Global.Add("gslsfexprel","(",new OneOperator1_( gsl_sf_exprel__)); Global.Add("gslsfexprel2","(",new OneOperator1_( gsl_sf_exprel_2__)); Global.Add("gslsfexpreln","(",new OneOperator2_( gsl_sf_exprel_n__)); Global.Add("gslsfexpintE1","(",new OneOperator1_( gsl_sf_expint_E1__)); Global.Add("gslsfexpintE2","(",new OneOperator1_( gsl_sf_expint_E2__)); Global.Add("gslsfexpintEn","(",new OneOperator2_( gsl_sf_expint_En__)); Global.Add("gslsfexpintE1scaled","(",new OneOperator1_( gsl_sf_expint_E1_scaled__)); Global.Add("gslsfexpintE2scaled","(",new OneOperator1_( gsl_sf_expint_E2_scaled__)); Global.Add("gslsfexpintEnscaled","(",new OneOperator2_( gsl_sf_expint_En_scaled__)); Global.Add("gslsfexpintEi","(",new OneOperator1_( gsl_sf_expint_Ei__)); Global.Add("gslsfexpintEiscaled","(",new OneOperator1_( gsl_sf_expint_Ei_scaled__)); Global.Add("gslsfShi","(",new OneOperator1_( gsl_sf_Shi__)); Global.Add("gslsfChi","(",new OneOperator1_( gsl_sf_Chi__)); Global.Add("gslsfexpint3","(",new OneOperator1_( gsl_sf_expint_3__)); Global.Add("gslsfSi","(",new OneOperator1_( gsl_sf_Si__)); Global.Add("gslsfCi","(",new OneOperator1_( gsl_sf_Ci__)); Global.Add("gslsfatanint","(",new OneOperator1_( gsl_sf_atanint__)); Global.Add("gslsffermidiracm1","(",new OneOperator1_( gsl_sf_fermi_dirac_m1__)); Global.Add("gslsffermidirac0","(",new OneOperator1_( gsl_sf_fermi_dirac_0__)); Global.Add("gslsffermidirac1","(",new OneOperator1_( gsl_sf_fermi_dirac_1__)); Global.Add("gslsffermidirac2","(",new OneOperator1_( gsl_sf_fermi_dirac_2__)); Global.Add("gslsffermidiracint","(",new OneOperator2_( gsl_sf_fermi_dirac_int__)); Global.Add("gslsffermidiracmhalf","(",new OneOperator1_( gsl_sf_fermi_dirac_mhalf__)); Global.Add("gslsffermidirachalf","(",new OneOperator1_( gsl_sf_fermi_dirac_half__)); Global.Add("gslsffermidirac3half","(",new OneOperator1_( gsl_sf_fermi_dirac_3half__)); Global.Add("gslsffermidiracinc0","(",new OneOperator2_( gsl_sf_fermi_dirac_inc_0__)); Global.Add("gslsflngamma","(",new OneOperator1_( gsl_sf_lngamma__)); Global.Add("gslsfgamma","(",new OneOperator1_( gsl_sf_gamma__)); Global.Add("gslsfgammastar","(",new OneOperator1_( gsl_sf_gammastar__)); Global.Add("gslsfgammainv","(",new OneOperator1_( gsl_sf_gammainv__)); Global.Add("gslsftaylorcoeff","(",new OneOperator2_( gsl_sf_taylorcoeff__)); Global.Add("gslsffact","(",new OneOperator1_( gsl_sf_fact__)); Global.Add("gslsfdoublefact","(",new OneOperator1_( gsl_sf_doublefact__)); Global.Add("gslsflnfact","(",new OneOperator1_( gsl_sf_lnfact__)); Global.Add("gslsflndoublefact","(",new OneOperator1_( gsl_sf_lndoublefact__)); Global.Add("gslsflnchoose","(",new OneOperator2_( gsl_sf_lnchoose__)); Global.Add("gslsfchoose","(",new OneOperator2_( gsl_sf_choose__)); Global.Add("gslsflnpoch","(",new OneOperator2_( gsl_sf_lnpoch__)); Global.Add("gslsfpoch","(",new OneOperator2_( gsl_sf_poch__)); Global.Add("gslsfpochrel","(",new OneOperator2_( gsl_sf_pochrel__)); Global.Add("gslsfgammaincQ","(",new OneOperator2_( gsl_sf_gamma_inc_Q__)); Global.Add("gslsfgammaincP","(",new OneOperator2_( gsl_sf_gamma_inc_P__)); Global.Add("gslsfgammainc","(",new OneOperator2_( gsl_sf_gamma_inc__)); Global.Add("gslsflnbeta","(",new OneOperator2_( gsl_sf_lnbeta__)); Global.Add("gslsfbeta","(",new OneOperator2_( gsl_sf_beta__)); Global.Add("gslsfbetainc","(",new OneOperator3_( gsl_sf_beta_inc__)); Global.Add("gslsfgegenpoly1","(",new OneOperator2_( gsl_sf_gegenpoly_1__)); Global.Add("gslsfgegenpoly2","(",new OneOperator2_( gsl_sf_gegenpoly_2__)); Global.Add("gslsfgegenpoly3","(",new OneOperator2_( gsl_sf_gegenpoly_3__)); Global.Add("gslsfgegenpolyn","(",new OneOperator3_( gsl_sf_gegenpoly_n__)); Global.Add("gslsfhyperg0F1","(",new OneOperator2_( gsl_sf_hyperg_0F1__)); Global.Add("gslsfhyperg1F1int","(",new OneOperator3_( gsl_sf_hyperg_1F1_int__)); Global.Add("gslsfhyperg1F1","(",new OneOperator3_( gsl_sf_hyperg_1F1__)); Global.Add("gslsfhypergUint","(",new OneOperator3_( gsl_sf_hyperg_U_int__)); Global.Add("gslsfhypergU","(",new OneOperator3_( gsl_sf_hyperg_U__)); Global.Add("gslsfhyperg2F0","(",new OneOperator3_( gsl_sf_hyperg_2F0__)); Global.Add("gslsflaguerre1","(",new OneOperator2_( gsl_sf_laguerre_1__)); Global.Add("gslsflaguerre2","(",new OneOperator2_( gsl_sf_laguerre_2__)); Global.Add("gslsflaguerre3","(",new OneOperator2_( gsl_sf_laguerre_3__)); Global.Add("gslsflaguerren","(",new OneOperator3_( gsl_sf_laguerre_n__)); Global.Add("gslsflambertW0","(",new OneOperator1_( gsl_sf_lambert_W0__)); Global.Add("gslsflambertWm1","(",new OneOperator1_( gsl_sf_lambert_Wm1__)); Global.Add("gslsflegendrePl","(",new OneOperator2_( gsl_sf_legendre_Pl__)); Global.Add("gslsflegendreP1","(",new OneOperator1_( gsl_sf_legendre_P1__)); Global.Add("gslsflegendreP2","(",new OneOperator1_( gsl_sf_legendre_P2__)); Global.Add("gslsflegendreP3","(",new OneOperator1_( gsl_sf_legendre_P3__)); Global.Add("gslsflegendreQ0","(",new OneOperator1_( gsl_sf_legendre_Q0__)); Global.Add("gslsflegendreQ1","(",new OneOperator1_( gsl_sf_legendre_Q1__)); Global.Add("gslsflegendreQl","(",new OneOperator2_( gsl_sf_legendre_Ql__)); Global.Add("gslsflegendrePlm","(",new OneOperator3_( gsl_sf_legendre_Plm__)); Global.Add("gslsflegendresphPlm","(",new OneOperator3_( gsl_sf_legendre_sphPlm__)); Global.Add("gslsflegendrearraysize","(",new OneOperator2_( gsl_sf_legendre_array_size__)); Global.Add("gslsfconicalPhalf","(",new OneOperator2_( gsl_sf_conicalP_half__)); Global.Add("gslsfconicalPmhalf","(",new OneOperator2_( gsl_sf_conicalP_mhalf__)); Global.Add("gslsfconicalP0","(",new OneOperator2_( gsl_sf_conicalP_0__)); Global.Add("gslsfconicalP1","(",new OneOperator2_( gsl_sf_conicalP_1__)); Global.Add("gslsfconicalPsphreg","(",new OneOperator3_( gsl_sf_conicalP_sph_reg__)); Global.Add("gslsfconicalPcylreg","(",new OneOperator3_( gsl_sf_conicalP_cyl_reg__)); Global.Add("gslsflegendreH3d0","(",new OneOperator2_( gsl_sf_legendre_H3d_0__)); Global.Add("gslsflegendreH3d1","(",new OneOperator2_( gsl_sf_legendre_H3d_1__)); Global.Add("gslsflegendreH3d","(",new OneOperator3_( gsl_sf_legendre_H3d__)); Global.Add("gslsflog","(",new OneOperator1_( gsl_sf_log__)); Global.Add("gslsflogabs","(",new OneOperator1_( gsl_sf_log_abs__)); Global.Add("gslsflog1plusx","(",new OneOperator1_( gsl_sf_log_1plusx__)); Global.Add("gslsflog1plusxmx","(",new OneOperator1_( gsl_sf_log_1plusx_mx__)); Global.Add("gslsfpowint","(",new OneOperator2_( gsl_sf_pow_int__)); Global.Add("gslsfpsiint","(",new OneOperator1_( gsl_sf_psi_int__)); Global.Add("gslsfpsi","(",new OneOperator1_( gsl_sf_psi__)); Global.Add("gslsfpsi1piy","(",new OneOperator1_( gsl_sf_psi_1piy__)); Global.Add("gslsfpsi1int","(",new OneOperator1_( gsl_sf_psi_1_int__)); Global.Add("gslsfpsi1","(",new OneOperator1_( gsl_sf_psi_1__)); Global.Add("gslsfpsin","(",new OneOperator2_( gsl_sf_psi_n__)); Global.Add("gslsfsynchrotron1","(",new OneOperator1_( gsl_sf_synchrotron_1__)); Global.Add("gslsfsynchrotron2","(",new OneOperator1_( gsl_sf_synchrotron_2__)); Global.Add("gslsftransport2","(",new OneOperator1_( gsl_sf_transport_2__)); Global.Add("gslsftransport3","(",new OneOperator1_( gsl_sf_transport_3__)); Global.Add("gslsftransport4","(",new OneOperator1_( gsl_sf_transport_4__)); Global.Add("gslsftransport5","(",new OneOperator1_( gsl_sf_transport_5__)); Global.Add("gslsfsin","(",new OneOperator1_( gsl_sf_sin__)); Global.Add("gslsfcos","(",new OneOperator1_( gsl_sf_cos__)); Global.Add("gslsfhypot","(",new OneOperator2_( gsl_sf_hypot__)); Global.Add("gslsfsinc","(",new OneOperator1_( gsl_sf_sinc__)); Global.Add("gslsflnsinh","(",new OneOperator1_( gsl_sf_lnsinh__)); Global.Add("gslsflncosh","(",new OneOperator1_( gsl_sf_lncosh__)); Global.Add("gslsfanglerestrictsymm","(",new OneOperator1_( gsl_sf_angle_restrict_symm__)); Global.Add("gslsfanglerestrictpos","(",new OneOperator1_( gsl_sf_angle_restrict_pos__)); Global.Add("gslsfzetaint","(",new OneOperator1_( gsl_sf_zeta_int__)); Global.Add("gslsfzeta","(",new OneOperator1_( gsl_sf_zeta__)); Global.Add("gslsfzetam1","(",new OneOperator1_( gsl_sf_zetam1__)); Global.Add("gslsfzetam1int","(",new OneOperator1_( gsl_sf_zetam1_int__)); Global.Add("gslsfhzeta","(",new OneOperator2_( gsl_sf_hzeta__)); Global.Add("gslsfetaint","(",new OneOperator1_( gsl_sf_eta_int__)); Global.Add("gslsfeta","(",new OneOperator1_( gsl_sf_eta__)); } /*****************/ /*****************/ freefem++-3.38-1/examples++-load/fflapack.cpp000644 000767 000024 00000107012 12471400760 020742 0ustar00hechtstaff000000 000000 //ff-c++-LIBRARY-dep: lapack blas #include "ff++.hpp" #include "RNM.hpp" #include "AFunction_ext.hpp" // Extension of "AFunction.hpp" to deal with more than 3 parameters function using namespace std; #ifdef __LP64__ typedef int intblas; typedef int integer; #else typedef long intblas; typedef long integer; #endif typedef integer logical; typedef float LAPACK_real; typedef double doublereal; typedef logical (* L_fp)(); typedef integer ftnlen; typedef complex LAPACK_complex; typedef complex doublecomplex; typedef void VOID; #define complex LAPACK_complex #define real LAPACK_real #include "clapack.h" #undef real #undef complex long lapack_inv(KNM* A) { intblas n=A->N(); intblas m=A->M(); double *a=&(*A)(0,0); intblas info; intblas lda=n; KN ipiv(n); intblas lw=10*n; KN w(lw); ffassert(n==m); dgetrf_(&n,&n,a,&lda,ipiv,&info); if(info) return info; dgetri_(&n,a,&lda,ipiv,w,&lw,&info); return info; } long lapack_inv(KNM* A) { intblas n=A->N(); intblas m=A->M(); Complex *a=&(*A)(0,0); intblas info; intblas lda=n; KN ipiv(n); intblas lw=10*n; KN w(lw); ffassert(n==m); zgetrf_(&n,&n,a,&lda,ipiv,&info); if(info) return info; zgetri_(&n,a,&lda,ipiv,w,&lw,&info); return info; } // (computation of the eigenvalues and right eigenvectors of a real nonsymmetric matrix) long lapack_dgeev(KNM *const &A,KN *const &vp,KNM *const &vectp) { /* SUBROUTINE DGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR, LDVR, WORK, LWORK, INFO ) * JOBVL (input) CHARACTER*1 * = 'N': left eigenvectors of A are not computed; * = 'V': left eigenvectors of A are computed. * * JOBVR (input) CHARACTER*1 * = 'N': right eigenvectors of A are not computed; * = 'V': right eigenvectors of A are computed. * * N (input) INTEGER * The order of the matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the N-by-N matrix A. * On exit, A has been overwritten. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * WR (output) DOUBLE PRECISION array, dimension (N) * WI (output) DOUBLE PRECISION array, dimension (N) * WR and WI contain the real and imaginary parts, * respectively, of the computed eigenvalues. Complex * conjugate pairs of eigenvalues appear consecutively * with the eigenvalue having the positive imaginary part * first. * * VL (output) DOUBLE PRECISION array, dimension (LDVL,N) * If JOBVL = 'V', the left eigenvectors u(j) are stored one * after another in the columns of VL, in the same order * as their eigenvalues. * If JOBVL = 'N', VL is not referenced. * If the j-th eigenvalue is real, then u(j) = VL(:,j), * the j-th column of VL. * If the j-th and (j+1)-st eigenvalues form a complex * conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and * u(j+1) = VL(:,j) - i*VL(:,j+1). * * LDVL (input) INTEGER * The leading dimension of the array VL. LDVL >= 1; if * JOBVL = 'V', LDVL >= N. * * VR (output) DOUBLE PRECISION array, dimension (LDVR,N) * If JOBVR = 'V', the right eigenvectors v(j) are stored one * after another in the columns of VR, in the same order * as their eigenvalues. * If JOBVR = 'N', VR is not referenced. * If the j-th eigenvalue is real, then v(j) = VR(:,j), * the j-th column of VR. * If the j-th and (j+1)-st eigenvalues form a complex * conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and * v(j+1) = VR(:,j) - i*VR(:,j+1). * * LDVR (input) INTEGER * The leading dimension of the array VR. LDVR >= 1; if * JOBVR = 'V', LDVR >= N. * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. * * LWORK (input) INTEGER * The dimension of the array WORK. LWORK >= max(1,3*N), and * if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N. For good * performance, LWORK must generally be larger. * * If LWORK = -1, then a workspace query is assumed; the routine * only calculates the optimal size of the WORK array, returns * this value as the first entry of the WORK array, and no error * message related to LWORK is issued by XERBLA. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value. * > 0: if INFO = i, the QR algorithm failed to compute all the * eigenvalues, and no eigenvectors have been computed; * elements i+1:N of WR and WI contain eigenvalues which * have converged. */ intblas n=A->N(); ffassert(A->M()==n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); ffassert(vp->N()>=n); KN wr(n),wi(n),w(1); KNM mat(*A),vr(n,n),vl(n,n); intblas info,lw=-1; char JOBVL='N',JOBVR='V'; dgeev_(&JOBVL,&JOBVR,&n,mat,&n,wr,wi,vl,&n,vr,&n,w,&lw,&info); lw=w[0]; w.resize(lw); //cout << mat << endl; dgeev_(&JOBVL,&JOBVR,&n,mat,&n,wr,wi,vl,&n,vr,&n,w,&lw,&info); //cout << wr << endl; //cout << wi << endl; if (info<0) { cout << " dgeev: the " << info << "-th argument had an illegal value." << endl; (*vp)=Complex(); (*vectp)=Complex(); } else if (info>0) { cout << " dgeev: the QR algorithm failed to compute all the eigenvalues, and no eigenvectors have been computed." << endl; (*vp)=Complex(); (*vectp)=Complex(); } else if (info==0) { for (int i=0;i2) cout << " dgeev: vp "<< i << " : " << (*vp)[i] << endl; if (wi[i]==0) for (int j=0;j0) { for (int j=0;j5) cout << " dgeev: " << (*vectp)(':',i) < *const &A,KN *const &vp,KNM *const &vectp) { intblas nvp =0,zero=0; intblas n= A->N(); ffassert(A->M()==n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); ffassert(vp->N()>=n); KN w(n),vr(n*n),vl(n*n); KNM mat(*A); intblas info,lw=n*(n+1)*10; KN wk(lw); KN rwk(2*n); char N='N',V='V'; // lw=1;// to get opt size value zgeev_(&N,&V,&n, mat,&n, w, vl,&n, vr,&n,wk,&lw,rwk,&info); // cout << lw << " " << wk[0] << " " << info << endl; /* lw=wk[0].real(); w.resize(lw); zgeev_(&N,&V,&n, mat,&n, w, vl,&n, vr,&n,wk,&lw,rwk,&info); */ if(info) cout << " info = " << info << endl; if(!info) { int k=0; for(int i=0;i2) cout << " zgeev: vp "<< i << " : " << (*vp)[i] << endl; for(int j=0;j5) cout << " zgeev : " << (*vectp)(':',i) < *const &A,KNM *const &B,KN *const &vpa,KN *const &vpb,KNM *const &vectp) { intblas nvp =0,zero=0; intblas n=A->N(); ffassert(A->M()==n); ffassert(B->M()==n); ffassert(B->N()==n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); ffassert(vpa->N()>=n); ffassert(vpb->N()>=n); KN war(n),wai(n),wb(n),vr(n*n),vl(n*n); KNM matA(*A); KNM matB(*B); intblas info,lw=-1; KN w(1); //char N='N',V='V'; VL: do not compute eigenvectors (if yes, switch with following line) char VL='N',VR='N'; dggev_(&VL,&VR,&n,matA,&n,matB,&n,war,wai,wb,vl,&n,vr,&n,w,&lw,&info); lw=w[0]; // cout << lw << endl; w.resize(lw); dggev_(&VL,&VR,&n,matA,&n,matB,&n,war,wai,wb,vl,&n,vr,&n,w,&lw,&info); if(info) cout << " info = " << info << endl; if(!info) { int k=0; for(int i=0;i2) cout << " dggev: vp "<< i << " : " << (*vpa)[i] << " ; " << (*vpb)[i] << endl; if( wai[i] == 0) for(int j=0;j 0) { int ki= k+n; for(int j=0;j5) cout << " dggev : " << (*vectp)(':',i) < *const &A,KNM *const &B,KN *const &vp,KNM *const &vectp) { /* SUBROUTINE DSYGVD( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, IWORK, LIWORK, INFO ) * ITYPE (input) INTEGER * Specifies the problem type to be solved: * = 1: A*x = (lambda)*B*x * = 2: A*B*x = (lambda)*x * = 3: B*A*x = (lambda)*x * * JOBZ (input) CHARACTER*1 * = 'N': Compute eigenvalues only; * = 'V': Compute eigenvalues and eigenvectors. * * UPLO (input) CHARACTER*1 * = 'U': Upper triangles of A and B are stored; * = 'L': Lower triangles of A and B are stored. * * N (input) INTEGER * The order of the matrices A and B. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA, N) * On entry, the symmetric matrix A. If UPLO = 'U', the * leading N-by-N upper triangular part of A contains the * upper triangular part of the matrix A. If UPLO = 'L', * the leading N-by-N lower triangular part of A contains * the lower triangular part of the matrix A. * * On exit, if JOBZ = 'V', then if INFO = 0, A contains the * matrix Z of eigenvectors. The eigenvectors are normalized * as follows: * if ITYPE = 1 or 2, Z**T*B*Z = I; * if ITYPE = 3, Z**T*inv(B)*Z = I. * If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') * or the lower triangle (if UPLO='L') of A, including the * diagonal, is destroyed. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * B (input/output) DOUBLE PRECISION array, dimension (LDB, N) * On entry, the symmetric matrix B. If UPLO = 'U', the * leading N-by-N upper triangular part of B contains the * upper triangular part of the matrix B. If UPLO = 'L', * the leading N-by-N lower triangular part of B contains * the lower triangular part of the matrix B. * * On exit, if INFO <= N, the part of B containing the matrix is * overwritten by the triangular factor U or L from the Cholesky * factorization B = U**T*U or B = L*L**T. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * W (output) DOUBLE PRECISION array, dimension (N) * If INFO = 0, the eigenvalues in ascending order. * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. * * LWORK (input) INTEGER * The dimension of the array WORK. * If N <= 1, LWORK >= 1. * If JOBZ = 'N' and N > 1, LWORK >= 2*N+1. * If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. * * If LWORK = -1, then a workspace query is assumed; the routine * only calculates the optimal sizes of the WORK and IWORK * arrays, returns these values as the first entries of the WORK * and IWORK arrays, and no error message related to LWORK or * LIWORK is issued by XERBLA. * * IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) * On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. * * LIWORK (input) INTEGER * The dimension of the array IWORK. * If N <= 1, LIWORK >= 1. * If JOBZ = 'N' and N > 1, LIWORK >= 1. * If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. * * If LIWORK = -1, then a workspace query is assumed; the * routine only calculates the optimal sizes of the WORK and * IWORK arrays, returns these values as the first entries of * the WORK and IWORK arrays, and no error message related to * LWORK or LIWORK is issued by XERBLA. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: DPOTRF or DSYEVD returned an error code: * <= N: if INFO = i and JOBZ = 'N', then the algorithm * failed to converge; i off-diagonal elements of an * intermediate tridiagonal form did not converge to * zero; * if INFO = i and JOBZ = 'V', then the algorithm * failed to compute an eigenvalue while working on * the submatrix lying in rows and columns INFO/(N+1) * through mod(INFO,N+1); * > N: if INFO = N + i, for 1 <= i <= N, then the leading * minor of order i of B is not positive definite. * The factorization of B could not be completed and * no eigenvalues or eigenvectors were computed. */ intblas n=A->N(); ffassert(A->M()==n); ffassert(B->M()==n); ffassert(B->N()==n); ffassert(vp->N()>=n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); KN war(n),wai(n),wb(n),vr(n*n),vl(n*n); KNM matA(*A),matB(*B); intblas itype=1,info,lw=-1; KN w(1); KN iw(1); char JOBZ='V',UPLO='U'; dsygvd_(&itype,&JOBZ,&UPLO,&n,matA,&n,matB,&n,*vp,w,&lw,iw,&lw,&info); lw=w[0]; w.resize(lw); iw.resize(lw); dsygvd_(&itype,&JOBZ,&UPLO,&n,matA,&n,matB,&n,*vp,w,&lw,iw,&lw,&info); if (info<0) { cout << " dsygvd: the " << info << "-th argument had an illegal value." << endl; } else if (info>0) { cout << " dsygvd: DPOTRF or DSYEVD returned an error code." << endl; } else if (info==0) { for (int i=0;i *const &A,KNM *const &U,KN *const &S,KNM *const &V) { /* SUBROUTINE DGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO ) * JOBZ (input) CHARACTER*1 * Specifies options for computing all or part of the matrix U: * = 'A': all M columns of U and all N rows of V**T are * returned in the arrays U and VT; * = 'S': the first min(M,N) columns of U and the first * min(M,N) rows of V**T are returned in the arrays U * and VT; * = 'O': If M >= N, the first N columns of U are overwritten * on the array A and all rows of V**T are returned in * the array VT; * otherwise, all columns of U are returned in the * array U and the first M rows of V**T are overwritten * in the array A; * = 'N': no columns of U or rows of V**T are computed. * * M (input) INTEGER * The number of rows of the input matrix A. M >= 0. * * N (input) INTEGER * The number of columns of the input matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the M-by-N matrix A. * On exit, * if JOBZ = 'O', A is overwritten with the first N columns * of U (the left singular vectors, stored * columnwise) if M >= N; * A is overwritten with the first M rows * of V**T (the right singular vectors, stored * rowwise) otherwise. * if JOBZ .ne. 'O', the contents of A are destroyed. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,M). * * S (output) DOUBLE PRECISION array, dimension (min(M,N)) * The singular values of A, sorted so that S(i) >= S(i+1). * * U (output) DOUBLE PRECISION array, dimension (LDU,UCOL) * UCOL = M if JOBZ = 'A' or JOBZ = 'O' and M < N; * UCOL = min(M,N) if JOBZ = 'S'. * If JOBZ = 'A' or JOBZ = 'O' and M < N, U contains the M-by-M * orthogonal matrix U; * if JOBZ = 'S', U contains the first min(M,N) columns of U * (the left singular vectors, stored columnwise); * if JOBZ = 'O' and M >= N, or JOBZ = 'N', U is not referenced. * * LDU (input) INTEGER * The leading dimension of the array U. LDU >= 1; if * JOBZ = 'S' or 'A' or JOBZ = 'O' and M < N, LDU >= M. * * VT (output) DOUBLE PRECISION array, dimension (LDVT,N) * If JOBZ = 'A' or JOBZ = 'O' and M >= N, VT contains the * N-by-N orthogonal matrix V**T; * if JOBZ = 'S', VT contains the first min(M,N) rows of * V**T (the right singular vectors, stored rowwise); * if JOBZ = 'O' and M < N, or JOBZ = 'N', VT is not referenced. * * LDVT (input) INTEGER * The leading dimension of the array VT. LDVT >= 1; if * JOBZ = 'A' or JOBZ = 'O' and M >= N, LDVT >= N; * if JOBZ = 'S', LDVT >= min(M,N). * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK; * * LWORK (input) INTEGER * The dimension of the array WORK. LWORK >= 1. * If JOBZ = 'N', * LWORK >= 3*min(M,N) + max(max(M,N),7*min(M,N)). * If JOBZ = 'O', * LWORK >= 3*min(M,N) + * max(max(M,N),5*min(M,N)*min(M,N)+4*min(M,N)). * If JOBZ = 'S' or 'A' * LWORK >= 3*min(M,N) + * max(max(M,N),4*min(M,N)*min(M,N)+4*min(M,N)). * For good performance, LWORK should generally be larger. * If LWORK = -1 but other input arguments are legal, WORK(1) * returns the optimal LWORK. * * IWORK (workspace) INTEGER array, dimension (8*min(M,N)) * * INFO (output) INTEGER * = 0: successful exit. * < 0: if INFO = -i, the i-th argument had an illegal value. * > 0: DBDSDC did not converge, updating process failed. */ intblas n=A->N(); intblas m=A->M(); U->resize(n,n); S->resize(min(n,m)); V->resize(m,m); KNM VT(m,m); KN iw(8*min(n,m)); intblas info,lw=-1; KN w(1); char JOBZ='A'; dgesdd_(&JOBZ,&n,&m,*A,&n,*S,*U,&n,VT,&m,w,&lw,iw,&info); lw=w[0]; w.resize(lw); dgesdd_(&JOBZ,&n,&m,*A,&n,*S,*U,&n,VT,&m,w,&lw,iw,&info); if (info<0) { cout << " dgesdd: the " << info << "-th argument had an illegal value." << endl; } else if (info>0) { cout << " dgesdd: DBDSDC did not converge, updating process failed." << endl; } else if (info==0) { for (int i=0;i *const &A,KN *const &vp,KNM *const &vectp) { /* SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) * JOBZ (input) CHARACTER*1 * = 'N': Compute eigenvalues only; * = 'V': Compute eigenvalues and eigenvectors. * * UPLO (input) CHARACTER*1 * = 'U': Upper triangle of A is stored; * = 'L': Lower triangle of A is stored. * * N (input) INTEGER * The order of the matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA, N) * On entry, the symmetric matrix A. If UPLO = 'U', the * leading N-by-N upper triangular part of A contains the * upper triangular part of the matrix A. If UPLO = 'L', * the leading N-by-N lower triangular part of A contains * the lower triangular part of the matrix A. * On exit, if JOBZ = 'V', then if INFO = 0, A contains the * orthonormal eigenvectors of the matrix A. * If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') * or the upper triangle (if UPLO='U') of A, including the * diagonal, is destroyed. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * W (output) DOUBLE PRECISION array, dimension (N) * If INFO = 0, the eigenvalues in ascending order. * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. * * LWORK (input) INTEGER * The length of the array WORK. LWORK >= max(1,3*N-1). * For optimal efficiency, LWORK >= (NB+2)*N, * where NB is the blocksize for DSYTRD returned by ILAENV. * * If LWORK = -1, then a workspace query is assumed; the routine * only calculates the optimal size of the WORK array, returns * this value as the first entry of the WORK array, and no error * message related to LWORK is issued by XERBLA. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, the algorithm failed to converge; i * off-diagonal elements of an intermediate tridiagonal * form did not converge to zero. */ intblas n=A->N(); ffassert(A->M()==n); ffassert(vectp->N()==n); ffassert(vectp->M()==n); ffassert(vp->N()==n); KNM mat(*A); intblas info,lw=-1; KN w(1); char JOBZ='V',UPLO='U'; dsyev_(&JOBZ,&UPLO,&n,mat,&n,*vp,w,&lw,&info); lw=w[0]; w.resize(lw); dsyev_(&JOBZ,&UPLO,&n,mat,&n,*vp,w,&lw,&info); if (info<0) { cout << " dsyev: the " << info << "-th argument had an illegal value." << endl; } else if (info>0) { cout << " dsyev: the algorithm failed to converge." << endl; } else if (info==0) { *vectp=mat; } return info; } template class Inverse{ public: T t; Inverse( T v) : t(v) {} template Inverse( TT v) : t(v) {} template Inverse( TT * v) : t(*v) {} operator const T & () const {return t;} }; template class Mult{ public: T a;bool ta; T b;bool tb; Mult( T aa,T bb) : a(aa),b(bb),ta(0),tb(0) {} // Transpose< Mult( Transpose aa,T bb) : a(aa),b(bb),ta(1),tb(0) {} Mult( Transpose aa,Transpose bb) : a(aa),b(bb),ta(1),tb(1) {} Mult( T aa,Transpose bb) : a(aa),b(bb),ta(1),tb(1) {} }; template class OneBinaryOperatorRNM_inv : public OneOperator { public: OneBinaryOperatorRNM_inv() : OneOperator( atype< Inverse< KNM* > >(),atype *>(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { Expression p=args[1]; if ( ! p->EvaluableWithOutStack() ) { bool bb=p->EvaluableWithOutStack(); cout << " Error exposant ??? " << bb << " " << * p << endl; CompileError(" A^p, The p must be a constant == -1, sorry");} long pv = GetAny((*p)(0)); if (pv !=-1) { char buf[100]; sprintf(buf," A^%ld, The pow must be == -1, sorry",pv); CompileError(buf);} return new E_F_F0* > ,KNM *>(Build* > ,KNM *>,t[0]->CastTo(args[0])); } }; template KNM* Solve(KNM* a,Inverse*> b) { /* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) * N (input) INTEGER * The number of linear equations, i.e., the order of the * matrix A. N >= 0. * * NRHS (input) INTEGER * The number of right hand sides, i.e., the number of columns * of the matrix B. NRHS >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the N-by-N coefficient matrix A. * On exit, the factors L and U from the factorization * A = P*L*U; the unit diagonal elements of L are not stored. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * IPIV (output) INTEGER array, dimension (N) * The pivot indices that define the permutation matrix P; * row i of the matrix was interchanged with row IPIV(i). * * B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) * On entry, the N-by-NRHS matrix of right hand side matrix B. * On exit, if INFO = 0, the N-by-NRHS solution matrix X. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, U(i,i) is exactly zero. The factorization * has been completed, but the factor U is exactly * singular, so the solution could not be computed. * */ typedef double R; integer info; KNM B(*b); integer n= B.N(); KN p(n); ffassert(B.M()==n); if(INIT) a->init(n,n); else a->resize(n,n); *a=0.; for(int i=0;i KNM* mult(KNM* a,const KNM_ & A,const KNM_ & B) { // C=A*B R alpha=1.,beta=R(ibeta); char tA, tB; if(init) a->init(); intblas N= A.N(); intblas M=B.M(); intblas K=A.M(); KNM & C= *a; C.resize(N,M); ffassert(K==B.N()); R *A00=&A(0,0), *A10= &A(1,0), *A01= &A(0,1); R *B00=&B(0,0), *B10= &B(1,0), *B01= &B(0,1); R *C00=&C(0,0), *C10= &C(1,0), *C01= &C(0,1); intblas lsa=A10-A00 ,lsb=B10-B00,lsc=C10-C00; intblas lda=A01-A00 ,ldb=B01-B00,ldc=C01-C00; if(verbosity>10) { cout << lsa << " " << lsb << " "<< lsc << " init " << init << endl; cout << lda << " " << ldb << " "<< ldc << endl; } tA=lda==1?'T':'N'; tB=ldb==1?'T':'N'; if(lda==1) lda=lsa; if(ldb==1) ldb=lsb; if(beta==0.) C=R(); #ifdef XXXXXXXXXXXXXX for(int i=0;i KNM* mult(KNM* a,Mult*> bc) { if( (bc.ta == 0) && (bc.tb == 0)) return mult(a,*bc.a,*bc.b) ; else if((bc.ta == 1 )&& (bc.tb == 0)) return mult(a,bc.a->t(),*bc.b) ; else if((bc.ta == 0) && (bc.tb == 1)) return mult(a,*bc.a,bc.b->t()) ; else if((bc.ta == 1) && (bc.tb == 1)) return mult(a,bc.a->t(),bc.b->t()) ; else // should never happen return NULL; } template KNM* SolveC(KNM* a,Inverse*> b) { /* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) * N (input) INTEGER * The number of linear equations, i.e., the order of the * matrix A. N >= 0. * * NRHS (input) INTEGER * The number of right hand sides, i.e., the number of columns * of the matrix B. NRHS >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the N-by-N coefficient matrix A. * On exit, the factors L and U from the factorization * A = P*L*U; the unit diagonal elements of L are not stored. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * IPIV (output) INTEGER array, dimension (N) * The pivot indices that define the permutation matrix P; * row i of the matrix was interchanged with row IPIV(i). * * B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) * On entry, the N-by-NRHS matrix of right hand side matrix B. * On exit, if INFO = 0, the N-by-NRHS solution matrix X. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, U(i,i) is exactly zero. The factorization * has been completed, but the factor U is exactly * singular, so the solution could not be computed. * */ typedef Complex R; integer info; KNM B(*b); integer n= B.N(); KN p(n); ffassert(B.M()==n); if(INIT) a->init(n,n); else a->resize(n,n); *a=0.; for(int i=0;i R Build2(A a,B b) { return R(a,b); } static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ if( map_type.find(typeid(Inverse* >).name() ) == map_type.end() ) { if(verbosity) cout << " Add lapack interface ..." ; Dcl_Type< Inverse* > > (); Dcl_Type< Inverse* > > (); Dcl_Type< Mult* > > (); Dcl_Type< Mult* > > (); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("*", new OneOperator2< Mult< KNM* >,KNM*,KNM*>(Build2)); TheOperators->Add("*", new OneOperator2< Mult< KNM* >,KNM*,KNM*>(Build2)); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( Solve<0>) ); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( SolveC<0>) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Inverse*> >( Solve<1>) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Inverse*> >( SolveC<1>) ); TheOperators->Add("=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("+=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("+=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("-=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("-=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Mult*> >( mult ) ); Global.Add("inv","(",new OneOperator1*>(lapack_inv)); Global.Add("inv","(",new OneOperator1*>(lapack_inv)); Global.Add("dgeev","(",new OneOperator3_*,KN*,KNM*>(lapack_dgeev)); Global.Add("zgeev","(",new OneOperator3_*,KN*,KNM*>(lapack_zgeev)); // add FH Global.Add("geev","(",new OneOperator3_*,KN*,KNM*>(lapack_dgeev)); Global.Add("geev","(",new OneOperator3_*,KN*,KNM*>(lapack_zgeev)); Global.Add("dggev","(",new OneOperator5_*,KNM*,KN*,KN*,KNM*>(lapack_dggev)); Global.Add("dsygvd","(",new OneOperator4_*,KNM*,KN*,KNM*>(lapack_dsygvd)); Global.Add("dgesdd","(",new OneOperator4_*,KNM*,KN*,KNM*>(lapack_dgesdd)); Global.Add("dsyev","(",new OneOperator3_*,KN*,KNM*>(lapack_dsyev)); } else if(verbosity) cout << "( load: lapack <=> fflapack , skeep ) "; } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/ffnewuoa.cpp000644 000767 000024 00000012606 12466661714 021025 0ustar00hechtstaff000000 000000 //ff-c++-cpp-dep: newuoa.f // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" #include "MatriceCreuse_tpl.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" typedef int integer; typedef int logical; typedef void (*typecalfunc)( integer *, double *, double *f, void * ); #define F77newuoa newuoa_ extern "C" { double F77newuoa(integer *N, integer *NPT, double *x , double * rhob, double *rhog, integer *iprint, integer *maxfun, double *w, void * iwf, typecalfunc calfun); } void calfun( integer * n, double * x, double *f, void * t); //template extern Block *currentblock; typedef double R; void calfun( integer * n, double * x, double *f, void * t); class OptimNewoa : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; const int cas; class ffcalfunc { // to call the freefem function .. J public: Stack stack; Expression JJ,theparame; ffcalfunc(Stack s,Expression JJJ,Expression epar) : stack(s),JJ(JJJ), theparame(epar) {} double J(Kn_ x) const { KN *p=GetAny *>( (*theparame)(stack) ); *p=x; double ret= GetAny( (*JJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); return ret; } }; class E_newoa: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =4; Expression nargs[n_name_param]; Expression X; C_F0 inittheparam,theparam,closetheparam; Expression JJ; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} E_newoa(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } JJ= to(C_F0(opJ,"(",theparam)); closetheparam=currentblock->close(currentblock); // the cleanning block expression } virtual AnyType operator()(Stack stack) const { double cost = 1e100; WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 Kn &x = *GetAny((*X)(stack)); long n=x.N(); double rhobeg=arg(0,stack,1E-6); // not used .... double rhoend=arg(1,stack,2.); // not used .... long maxfun=arg(2,stack,1000L); // bof bof long npt=arg(3,stack,n*2L+1L); // bof bof long iprint = verbosity; ffcalfunc ffJ(stack,JJ,theparam); int lw = (npt+13)*(npt+n)+3*n*(n+3)/2; KN w(lw); integer N=n,NPT=npt,IPRINT=iprint,MAXFUN=maxfun; cost= F77newuoa(&N,&NPT,(double *)x,&rhobeg,&rhoend,&IPRINT,&MAXFUN,(double *)w,(void *) &ffJ, calfun); closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return cost; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_newoa(args,cas);} OptimNewoa(int c) : OneOperator(atype(), atype(), atype *>()),cas(c){} }; basicAC_F0::name_and_type OptimNewoa::E_newoa::name_param[]= { { "rhobeg", &typeid(double) }, { "rhoend", &typeid(double) }, { "maxfun",&typeid(long) }, { "npt",&typeid(long) } }; void calfun( integer * n, double * x, double *f, void * t) { OptimNewoa::ffcalfunc * tt=static_cast(t); *f=tt->J(KN_(x,*n)); if(verbosity>20) cout << " F= " << * f << endl; } /* class Init { public: Init(); }; $1 */ static void Load_Init() // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ { Global.Add("newuoa","(",new OptimNewoa(1)); // j + dJ } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/ffnewuoa.edp000644 000767 000024 00000007274 11406142255 021003 0ustar00hechtstaff000000 000000 /* README NEWUOA: This is the Fortran version of NEWUOA. Its purpose is to seek the least value of a function F of several variables, when derivatives are not available, where F is specified by the user through a subroutine called CALFUN. The algorithm is intended to change the variables to values that are close to a local minimum of F. The user, however, should assume responsibility for finding out if the calculations are satisfactory, by considering carefully the values of F that occur. The method is described in the report "The NEWUOA software for unconstrained optimization without derivatives", which is available on the web at www.damtp.cam.ac.uk, where you have to click on Numerical Analysis and then on Reports, the number of the report being NA2004/08. Let N be the number of variables. The main new feature of the method is that quadratic models are updated using only about NPT=2N+1 interpolation conditions, the remaining freedom being taken up by minimizing the Frobenius norm of the change to the second derivative matrix of the model. The new software was developed from UOBYQA, which also forms quadratic models from interpolation conditions. That method requires NPT=(N+1)(N+2)/2 conditions, however, because they have to define all the parameters of the model. The least Frobenius norm updating procedure with NPT=2N+1 is usually much more efficient when N is large, because the work of each iteration is much less than before, and in some experiments the number of calculations of the objective function seems to be only of magnitude N. The attachments in sequence are a suitable Makefile, followed by a main program and a CALFUN routine for the Chebyquad problems, in order to provide an example for testing. Then NEWUOA and its five auxiliary routines, namely NEWUOB, BIGDEN, BIGLAG, TRSAPP and UPDATE, are given. Finally, the computed output that the author obtained for the Chebyquad problems is listed. The way of calling NEWUOA should be clear from the Chebyquad example and from the comments of that subroutine. It is hoped that the software will be helpful to much future research and to many applications. There are no restrictions on or charges for its use. If you wish to refer to it, please cite the DAMTP report that is mentioned above, which has been submitted for publication in the proceedings of the 40th Workshop on Large Scale Nonlinear Optimization (Erice, Italy, 2004). December 16th, 2004 M.J.D. Powell (mjdp@cam.ac.uk) */ load "ffnewuoa" /* SUBROUTINE CALFUN (N,X,F,IWF) IMPLICIT REAL*8 (A-H,O-Z) DIMENSION X(*),Y(10,10),IWF(*) DO 10 J=1,N Y(1,J)=1.0D0 10 Y(2,J)=2.0D0*X(J)-1.0D0 DO 20 I=2,N DO 20 J=1,N 20 Y(I+1,J)=2.0D0*Y(2,J)*Y(I,J)-Y(I-1,J) F=0.0D0 NP=N+1 IW=1 DO 40 I=1,NP SUM=0.0D0 DO 30 J=1,N 30 SUM=SUM+Y(I,J) SUM=SUM/DFLOAT(N) IF (IW .GT. 0) SUM=SUM+1.0D0/DFLOAT(I*I-2*I) IW=-IW 40 F=F+SUM*SUM RETURN END */ int N=2; real[int,int] Y(N+1,N); real[int] X(N); func real J(real[int] & X) { Y(0,:)=1.; Y(1,:)=2.*X; for(int i=2;i<=N;++i) for(int j=0;j0) s+= 1./(i1*i1-2.*i1); iw=-iw; f += s*s; } return 2.14+f; } real delta=1; mesh Th=square(30,30,[(x-0.5)*delta,(y-0.5)*delta]); fespace Vh(Th,P1); Vh u; for(int i=0;i #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include #include #include #include // FFCS: random() and srandom() do not seem to be available in MinGW #ifdef _WIN32 #define random rand #define srandom srand #endif unsigned long good_seed() { unsigned long random_seed, random_seed_a,random_seed_b; std::ifstream file ("/dev/random", std::ios::binary); if (file.is_open()) { unsigned long memblock[10]; size_t size = sizeof(int); file.read ((char*) (void *) memblock, size); file.close(); random_seed_a = memblock[0]; }// end if else { random_seed_a = 0; } random_seed_b = std::time(0); random_seed = random_seed_a xor random_seed_b; if(verbosity>1) cout << " good_seed =" << random_seed << endl; return random_seed; } // end good_seed() template class OneOperator_0 : public OneOperator { class E_F0_F :public E_F0mps { public: typedef R (*func)( ) ; func f; E_F0_F(func ff) : f(ff) {} AnyType operator()(Stack ) const {return SetAny( f()) ;} operator aType () const { return atype();} }; typedef R (*func)() ; func f; public: E_F0 * code(const basicAC_F0 & ) const { return new E_F0_F(f);} OneOperator_0(func ff): OneOperator(map_type[typeid(R).name()]),f(ff){} }; // FFCS: rand() wants an int on Win32 and Win64, so we need to have a new function "long ffrandom()" to create the OneOperator // object which requires longs (and the MinGW compiler (g++ 4.5) refuses to compile if OneOperator and the underlying function do // not have the same type). FFCS patched this source with "long ffrandom(){return random();}" but FF now comes with // "genrand_int31()". #ifdef _WIN32 void init_by_array(unsigned long init_key[], int key_length); long genrand_int31(void); void init_genrand(unsigned long); // hach for window ... F. HEcht long ffsrandom(long s) { init_genrand( (unsigned int ) s); return 0;} long ffrandom() { return genrand_int31();} long ffsrandomdev() { init_genrand(good_seed()); return 0;} #else long ffsrandom(long s) { srandom( (unsigned int ) s); return 0;} long ffrandom(){return random();} long ffsrandomdev() { #ifdef HAVE_SRANDOMDEV srandomdev(); #else srandom(good_seed()); #endif return 0;} #endif void init(){ Global.Add("srandomdev","(",new OneOperator_0(ffsrandomdev)); Global.Add("srandom","(",new OneOperator1(ffsrandom)); Global.Add("random","(",new OneOperator_0(ffrandom)); } LOADFUNC(init); /* These real versions are due to Isaku Wada, 2002/01/09 added */ freefem++-3.38-1/examples++-load/ffrandom.edp000644 000767 000024 00000000507 12376600523 020761 0ustar00hechtstaff000000 000000 load "ffrandom" srandomdev(); // warning under window this // change the seed by randinit(random()) ) so all // freefem++ random function are change.. cout << random() << endl; cout << random() << endl; cout << random() << endl; srandom(10); cout << random() << endl; cout << random() << endl; cout << random() << endl; freefem++-3.38-1/examples++-load/fig.pgm000644 000767 000024 00000224133 11406142255 017744 0ustar00hechtstaff000000 000000 P5 #AppleMark 240 316 255 |{|~gnblqk\vizaTee^liUoYLTQUXVLwNA9ABIPMJlL<8588@FEfG7220-5GDkI115307HFkJ:.-36?LKkP>1--;COFvX@216@>EDmT>:0AEB<:nZJ:59EF<8~tbK@:=UF@?<9lWBNdxzU94364/6zmmV?>CRg~a8412325njZS@57GbsD84/../tXOF;88A_yYA83-,0z|sX@=/1/7ZupL=3042~`asxTD632-3G`}haOAJGvRPXjhV>44226-A_km|j^^\UUNNXuy_RD8=8D/33@GTxsee]UvfWQT\~s_OE4?CB126.>C_v{ozuvfcs{cWLQlxkWD<8:D>5/4/)4H\x}|se{xuriPMI`osrXL@::B<5//+)5DWaejfdyrucKHZelolYJA795200)(&;GOMWZipy|vzp]HVc__YZNKB9,//-("+3<=DLP`nyxx}|]ztlOOUYBFKGSG>1.1-'#',29ACWrrlle|Zy|vdJ?GLEAGQPF:21,!!"*1?=DSormh`bl}v[K>TA=7MOCH;60)""'/92ETmypZ`n^u`^][G,7AHNIH=3-&%"!(/;8Plvzk`sbWxuqqi<)(5GHPKA?4*%$%#),Kexn^qm^azf8%)6EJLKJB:2,-01$ !/M[eecpslegsC059@@CJFBC=565:*$((36=PYondpqlhiuxti|`dpvk^JGIGBBDFDD<9;.-+9Io[\WSYRJKFVOjzfg\kY~zeMLFA@=A?B;2>.,"-9~u^ZLRM59;AJAL]{t}vdnbhUzRQJECBB?<8,:94# jW@>.)//76?>DRuo|zT^jO}dTLJC?DA>;+7>3wokjf`[]M<21" #&)6CCA]}ow\ssc`^R|jTLCBIHDB67=-"zwqofWQ8/-''*>@4>ktntQ`sdN\=r~mUMORNPQ?>8,+,*n\G9.,%&%%" .405RvuyfbdfZMHIy_Z_d\\I;;>9128sZNBB@:0&# ! ';2=MuzWab[\SC4q|xr_mrmUF79>J<67||`UVQDFJ=1++*"('1$LUYciXT?59{qktj[@;60P94, }i]]dYTA?60.+'-)'"PoQI\`LJB<,]zdb[;+95K8.gmkkOQIIJ69/0& GUPsSMJI764^iX3,8<02.qffYWFMQE?672$%*( &2MyiKEJ20-2\nXPWB=C5!$$izxXUeg`ME:6+-)'&%#!!!2NfUK>900.*b|ykkjL;=;11vcP>OYl\ZPXd?D<4*+(-))!$L\_D>4--/5hj]UCAJv]GA7K:$&)-!&f{|}~}ythxнOIQ^T8/*!&+%   );9?N>'1;=1&I;4D<-$,+* * .1p{{|~}||}{q}jDVaLcek`Q0++%$"".TLG\C,,OQ<(FNFG3--A.,$)5%F~}|x}zv|}{yuW@K]h}rZK;0)(&%!&  %`kPU=?/CwYwB\+4i@AP3:6, W[/+!+e[Kz}}~~|}~}|y}~zpat~jfg`hbXW\YB3HXD53*)+4ZGAJUrAA(E~8@>531&9/'#-UpYC~}}|~|}{{y~~|}x{}}sqbakgXjmnhdM\VHAAZC53.(%'!)%(7Onf=7X^10&P[02(/>6[7"#!)~~~~{~~|~}}{{z{y}|}um]Wgtblqt}zpdaONSe~PO@:1++)-..+(*$&/:AbyU?2>?8:;@:8:3,"!!  $),IBkeTH+A&5)(#0-&..38Ch}xmy~mP|{}~~||~~~~{{|w~w{oY\c]dz|yojЌrh`bKQCFING?::0/($&&&(*'"%!%#" !)BaUJZ88*!!% *&)&08958692,'3,')$)%&&&&"&"'('%&QKEBH')$ !&/20+9Ojzpey{z}~z}~}~z{vra[bhpx}py{bSVGd}ǥdep`YIGA@?94/1.---*,&'$#('$%(#"(FCK=<(!  !+.+06Oubf~z|~qtw|}zz~{rnh_kirw|owmWQVTRMhv˜n{aULJFE9A6625111.)*(((&++,+*&"%7;E;4.(  ! !&532-*Qwlh~zz|~}xlgfrzx~~~w}~~}ud]alzskm}s^XEEUTPWaml[fvз{aUFD@BG;=F,34422/--.-11-,/*0.-)''34H=0('   *6127=ch}{~xy}|}znbYVfstw||{~{z}vtg_bhmpsxgMDGOQLIT\]eg͹j^O@7JR5<237764223412620.1232*-&):/5]*)   $/5;=:aym}z~~x|x{lVPKNrdgu}zzz{zzn`_ad}nwoPUVSXPOdgjsv|}iJnm^WJE?93=;EK=>969?A:69868<85721,-1//-3381O/*($     +>@A,Vrwv~~x}}z||}~}}~}y~}`VLH:XY[g|~{vx{|yxZd`bwsjWY]^`Z^hnfi^nnkfUYazjKKLI:;>63mrcqwt}rwq{||}{}~~}~~~y~||~}zfRDDFDSM`uxmpvtnTL^znVCLcef`ok]`_eb_YvCI@ADIHGJGNWXSIDJEJ@DB<6655952/23;858;82-$/5?/%#    &;8<::2)$-6.$!8       6G4=GnkG8M]`QEbh[{p|}{}}|y}{|w|}w[@7AHJEJGEE@?;=:1-(% "(1      ,T;GXvdOSIC>URJK@=:<\itf}m~}{uy||z{~z~}~~{~~h=-%*(&",21LvsqˬvwwYZSQXTblvnx|ujbeX\QMOIF;>>>A=FLGFKFGC>;<73/+'% "#9       BH^R[uywgGBKDBMCFIF;6:j`h{mv~}x|{y}w~{}{~tD0)*&(26Lddg~l]aW\[`q}zjebYS]ZOIGEAEABCADCB><>9<:314.)*'' 0      '#+DM]Mgky~vbG4?COMdssywih|~~~}{yywwszx}d;.&%,(-5::/331110,./.'##   +/:LTV`elqonmaS@?DAEHA>9=;;>DKWjsu_ucj~}}z|xu{~|x~}gze>3*'0/09<[U~ʜ̞wrk]nu|~wukf`^WYV]ZMMMJEB376652231/3'&"       -(9DMFOZhnqmijTHEFDDFQA<8234;GOgjmad|nduuw}~ywuwxv{xw{~~veduiJ9,)0.7<@S`Ƥѿжddmmsz{oh_]XWZ[\PQTOLLF?=95715-$'     '15KXrƵлаÕaXSp{zph~tjd\VPTXPYWQQVS`TOONPKD>@?<6412-#      .:<;,+:JFCIKOAF:BCDMSM>81&#$.1+97ATudZtwy}}{{~|{|yyy{vsu~~w}tr^iy|{qaP5ekc~w{[A8612.4;G\yǮϮl^glpusnpuoliaUUTSZYY[WWTVSQRLNRJHEC>?:6-/.'!     #9><2*/<;<:BE7>>=@ELRNG;-$(,3279DVx`Wion~{{{|yvwts{xyx~y||vbXi}yursaHTs_wyx^M;8<535:Njɴȥ°hpmsqmntlhb\ZPUVW`Y]VWQVVUQPGGGFDKF@;5./,)$     8>>93)289309,97;>>ITVO@1**/07B<;:8-*-0-+155-66>JPMM=8567<;4512..) +:AYq~wy{vzsuxwuwwwqx}}}||zhZXL*-37,,+2I\\KQZ`|xyxwwxwyvxsw{y}~}xyrsjZD'=2((734;6,=@5+2Whg]YNIm⽮ʚ{idprjdfhx^WPTSOIP]gnmqk^\OIEFGHDBNE@9.,("!#!"$   ! 3411.*'*&!"$()-9,+'4>40+.,79A74277UdfPLE`yssyyxuvxstuvyx|x|{{~~~}txsl^F4;:2'*.:70,',A7!"8qa^ZW]||dfjofb`dfaWTSPONMX_vmsd]RPKDIHMOHO=<8/+%#!!!    .;840'""* '(/**",71.-/+17:82056JROGMTdzquylnqpyvxyzzx}}v~z|x|}}uvrbP299I0-59?1/-*530,2_]^_\i˲ڶˎnuqha]Y[edTOQQPMPUgtxthYT[SOQUWXOK8<2-)$# "  #1<;7+(!" &($!"11..+-,0,1,+656CDBRTgruktquuqusytzzzx{{~|yxp~y~vjbD28A126?HB93!*3@>iQV\dxᬧʫvsjc]RWXec[TONJNRbw|xhb^`[XSUYVNHA92.&%!    "%9;76+##"! $%*,/-)**,,''473>>=GMU\avpwwxuust}~wx{y|y{}rr\ID@;9;:A:<: !!)4CbMXSjʹֻqjhTTTWX\ZVPJIKPYgr{j`jcZ\TPSQJA?91-,* !! #  "!".410."(" """&'%"$(*$+1169;87GN@Sk{oxsxvy~~{~zxzzwunaWJ??@>?:24 !)*6/)*"# !   "$12520.&#" $'##$')$3179BG:DKCSfowwux~|y}zyzywrldYI=AD@:4)(! -1--8MWi˴͸ʾкÎvdbbZ\WX]\PHIMPU_dkuiega[ZYVOJFA550%& !"  #,676452.*-( %'+("#%(+/55:EE6<76410.0(..>J}ټ»ųee\Z[]VVZDFIQW_fouldaba^\WNJD@:..&!!!  $ # " (788331-+.,'+(%"$%*+11,0990):EParmtty}xz~y~yttustrvzfQGDAB:;5;7:*:44/-D}ؽ}kkfaa_XSTQIHNWcgp|pc[Zbh\YRGB=6.'%#!!$ $ %%$# #&16912,/,-/,$  !'%$(()+*++1--.5;DKVljttyz{}ztvlssrpx{_LJJIA;69;@C8B9>>?DĪĪzkjiba\XUUNJGNTgea}bZUU\bXRID:4.$%&$#$!   "&%$'%"$$'392/.&-+.0-"  !"#%$&'"(,&*+/47=<=R[txkx{zwwzwzwqrsn_JALEB45;;<@LNELOQNƸmfagV\XUXRGCIS^dvk[VRV^bZS?73+'&!!# #!!!   $%%"#'$!&!*6<2.,#&*,,'    "%',&,1897JSjmow}mwxx~{}{yz|tvrojUMNJD7,><=?>F@EJ^Zly~|xxzca]\Z]Z]YNEBFPZdjp]TV]^^UE;674-%'  !$"$"&#,*)&,,:>9-(&%!$&&! $&#!!'+39;;H]_njimquzr{|}rywyy{xzongMQCG=4&:E?77==?HPal¿{z}|yx}{~r_]\V[XXWVOGDEKRWbxq_WZ__TM<<99-//$(   "%$',.*&,6@=6,,*% "" $,#""'373=@CGbefijmpt~}{x{ysu}yyqj^>FGG<2/)574*3;EDI[p}ʺz~stukt~s][VVT\WVSME<7?CR^mqi][]b\MGC=:7.-*'"""!!!#$&'"..++8=91+*+* &('),0.AONR_glhjifjqz{~z|zy}{wvttnvinbKCIIA55116+.3:?97:AQay{~̯Ͽ֣wfa\WVVW`XRF913089Yz|hupfQGB61/**%)!!&% $" !"!  !,0/--)!$32771*&)  $ $6[^ZRF[bhhfghhuy~}}wwz{yutw^LFBE<876255-67[\bSY`flfdigiy}wjUD7:;9881-12(6V[scgbhdmkllex{y|zxyzpXB/276773,1/#+38mvK5::d{<:03:43/$$! )4<62*))&$'(&% #!  !$''!##&)'!#!%""&,5-+*&)+0<>93.-/./%#""')$   #GKha=VM;4860Odjmjeiekhjk9882AWkoy}|uw{~~|yyy{]=?B<2,*43336;=~~ajYyibowV4())"#"# ' %#"$&*5:4,)%+0.=SYTF<24,*$#! %$%'&$## $ "&&&(&43,-*-+2;EA464301$"'#% %!9NRiaATU?8353499;?Uuq{ڧuRF+& #"$   #$'.&%"*(.0151+*)%   !')*()&%#%"$# #*%#++0/.+(,!+25;83("-#%"&1DIUQqg7BO:8M[X`cefdchijjif.33.2%-10CKcosnmmszxxyqx||{zxzw~~rcJCGB7767;B:6XV`kA"$   "),FJ:3.,(((+*%!      %&'%%'%%!"!$%(&(&*.1-/'&/''1/26    &:0&=GIOMRG:=<96CJRSabjchihdije),+-%)),.2:@\d]Tcsr{nrbl{tnntxvv{{ukcOBNG=>;73788nwajşǪZ 17573.)**(,#'W)  "!"       %&&!&(((%'(***,//20*(*!%(0/**# ), ,03&#=@@@>1-683012::JUN]ag^X[cgh$(%%#"+(--/?PONJ]dg_TR]{aVLcjd[skigaVFEMNH>G8447Fu{}ywɕz# !:2!'042,)''() vF2(*+&0-+242'+## $%&&&$&$ ,),-!-.220)*&$+,&'1$*& #"-+!03.)#$)91/+- /7KLJSUYUQW]WQ$&" "#(+'*=EB=IRULKECaP8DYY\WMTPLQNDIKSH:>;85:_nrerǷ$!!    :#2>942( %(-$"w#   )-+.) #$"&$!"#%! -0+4#//4423(&!!*.+,-3-0'$*,$($&",)"" %$4,-31+/:MHJPPTGMJ?FC"!"")'"*C<@88BD>>9@2;DF=9IE>97=B?>FNE==;98>qWҢ3,!      3#17855)'!!059!)     %,84$ #"$#$#%%&3/3%/11632+&"*76.,+4753-,,$ $%#%!+0"--/&1;H=DDF5;HC>@E#!"!&$"'5@C>2:=B6:239??845<6+618]ʹiuF-1#    &3346+&+1#      &,&!$ %"$%!!(631**0373/0((&,9@<<>;88=:::@&("%'*"!%0;=@5.>IL5C1@DG<(.427>@>>>IGG;8<DJFE<63.-/159;1+,+*5>;=AADTXPGCJOJ>3:@JDDJKIOF9::??Ec)")|%+#" $*V_MK?+%      .6!&""#783/(0334/2/&*0=>:651.*)+(+'## ',)('(*&%$.332/3<>FPEA@AHE=>H>997:9==:@DMKSPBDE@B>81#      +6&$ #3.2,'00)0++,!(/8;;891-))-'%*&"" !&$!&&,46;AG?=GIB9?D=H>:86885;ILNG;AA;86647,0::99@GA25,^~{>;\wp+3+-)+*  $68354*7FHJC=>B;*'006./220,7@?/7Dhy <'/Wytxbs-410'(!(,('*)&"     =2!%! +$(,+/(5B=94461+**-1023+$!%%''57::?AVYc]QLF;6937><42128:B=<52A;101.)'#'00110*-+% ! %'-0)'*/.,4=E\ihaUIAA:AD<;4/05=CA>732A>=<;0/...137.1=BFD?869>HJPW;x2*Oh~m&  *"*'9151+$#&!      $=" ', F-&0+'#367=BB=8,,+"$*&-,-01-15.%! "&02052*,*'/<5kzvq\M<@GVPGB>7=?FKDF;.11893>B2+&235;=:>;=@:=<=3;BEHI~|?4ovט2 %)0TgncM<1'""       %>C7:$8>3)0,!!%.6;BND<5-+*&'&&')(--19<10,-'#$)(+0558;;47,,&!3GT|`7>DMXMZCLOMLKMIF;-)4711:7&-9<=C89:8552==;8313;DtxU$7Ҡyo;* %%&'0unZH=1$"    &-**4/!!E<1*-*# '**8@?C942.'$()+)&%'(0469:772*)':.(2258867:7236)-Ik|538:AJKNNWNI<9LB:**330,0574;9=D;973/2178622-+-9fWOEE㖫ɹW=&  #'(1?StĜwZK;/&!"      "(&*/(2.&$(.5::?60-*'!!'+*'%&*15&    &(#5IªoZF:4(#       ,&#  /*.)* #**).00+')*$&"$(!$)&&-3>A>6:>?.,010463535412/1/79@JMV[XZZP+*(%).,12-,12120/.*2/+""(,;7./-*1-'$$%*#)--*&-35seKTPɡrcF0   !,$7Qɲv[@6($"      ")"!%# )*/2+( '$*('.**')*'.)+#$&%(*1;<75BF;0(+1/720303,-,* /536/2)&4=Zĭ{gM=,(#       ,&&)0 '++)*0('$ "&)+(#')( "',/7;7($$"!$('.151.461.6B7/(-./%!" *2229<;BI>A>" $&')+"" %#'!%'&%'%""0=72*&(' )-"%)(.?=JG>m6)w`MŸrikmpwxlejb[XS^k¥zjZF/&#!"!        "$-'1)%$'()-&#-21#$$ %+"(60('(# ##!(99-21-/,*/102(! !+,-00*$*.7C81?6(IfI5'5+)./*0470005.)(# #&(.*&!!##   #"#&!%"5/&'/.,*(�&$$#!#+&"11'"&'" !"#,/&((%*-.051.$'+,:;5.-21O^YajjLiyxia=1+,4/(*$66369866''122/5:CNWYdSV`Wtb[ŤǰvhTa[VUNHC;=4414i~wph]XOE5'#$%&     )"%*$!'+)+-*/*,'$$(,%!##!# &$#&,.*$#)*$$'*/153/($)2HSR[Z\X[[]bRiū˵zo_WVQJF?<640-.7R|qd_UPB6,%!#&)(%     %#'*#'.4,/'*#&$ +/% &,#$"!!*'(#!#$$(*'1551/+(!!##"",8ERaVH>525evy{njmfZ<1,3I@3,012448:BLVPUJVRLEEIJNRFHAap]Pt£{rcYQIF>9722.*).=nh[SK?2+"'))%##   !  '+&# +/#)&%"%!))#$$"!"$"&' "&&!$)"!%'(+33742,(!"# &(&(4:CGTZTG<79GKajrnf\QHB@20&32+&%)+2,)17EKGGLGFGE?AKKH<8/gZMż~qcWQG>:554,+)%"0Und\SH<0( "$')*'$(   $&&,- '')%'#$"&).&$"&$%!"&(,+&%)$/1(##!&()1-//-%'&&%% &,/7@KLGZWKCD@FQWcbbWPIE?B4;,-+&%+,62,):H7>CKLECBCDJPJIBjWQ–qiXPE>9/752*($'(?r]VND8.$$#%((*'" &++%##&*%$"#"')- &&&)'( *-.*2.!+*%&+*% !$'+*+*"'"(&!%#$*4:JMYDKI9DDFBOZ^WeW5>><522//. )-=/,5=<,1=FKFHHGLNLNNT$o[O¯qdZPFA;5463/*""(&cm[SKA1) !#%#)*'%#!!'*,) "&# "$",/*)'&#..-.13218,'" +*!&(%#!&#%$ !")4??JF7>:BIC:CLSNOJ?2:8=2+,+&#'.2+,*6<3%*2EJILNIUUMOZTeVj{~tgaPHB85220*'#$!$;~}b\OB>0$! "#$%(*+'%*$ ""  "  )-*( !%" *022-*,01/126<880*'#*+%+$# !!' $-69MITTQDC?:=90%$%"&()*--35.6DDQR_Q_aZ]^SѠqzĝug\XKB>415-*$"!#%(SƵg[RMA60$$ !!#'+-*)14*))%#%" !! ,..* !#%$! (2899-)&,262155:72-*$-.&(%"!!$5846.'((:8631043+-'*+**)'%) "1666SVbPECA>?668:63'*))((*#$"/94(--!)6CHOPQHXc(tl]RI?<878,&!"#*Mqwzk]NKD=750./.)'% #++,.2=E<JJC>2)'#)($&$%321++/+,0Pc]XKAIwn!vn[QG=>;5,(# "$#(/-.- &(BV^TMKE??==;9686321.,(!""$(/203343/(+&" "&$&%"$$%"&($"&"*,*$&7(+*))"""#3-054:1-"&'+(*!  &(1/.!1-"! 2/069D>B=5-%!#" 3853*'+-1JcVVLJOzuu0!scYLC>>92'  $'&-4bp9(+( &?MIEF@?=?=;7712402.'""%/-01200/-'((('(''(''$%&&($%) "&,.(J=),))') "(/'-0(122)$ ((-3$"%&#+*.$),.+$ $!*0,437:<871,&$( "!$!*08640'0(*:ILNRMZp|vn_QH>>;6/ " #$#./zh9+&%>BCA@ABA94* ! (*)##.01210.//,-(+*))'**+*&*'''&$$ )++$G:"&'')(!!(+*'(')-.,(4' ,36?2-,%"&&%,/' '# 3*)0./1-/APEG1('$ " +2+0-(#.( -7AEKEXr~0ŻthVJD>:8-!!""%'*+oîwC-$+<;@<>>8-$'+1321200.0./,,*-(+,-,*),)'%&'**'H7"!!$"()/)!''(/.-482/3:7?243+)&)''#$1*-+(+,,,qte{ #$435-&%*$$.46F8Ejvp={peWJC?72(!$&&+),lϫp;&,246:3#+31643323.-.'./0*/-/+,,,+))%(***).+"%'$9=+"('&)+/236:9AC>6==:BN1FF>/+)5//+.1+71,& #!"1-% $-'$%  8AjLFTsfnkejqtvpntpsrorjkvzeOXWjgcbcfancd]Mdeehpfd`1xjXGF<51.$"'+.101J`bljWsmphck`][KC1# #&*1/'" %/558766652022100253-1++,--)()" !# .>=2+00137*&" #-%#!#%0$$(*"'   5?KJB8]ljhinmqmqrsvqrrrnmkbQ;E@SUX_bde\^x{[M?exoYNCA76-,,).23/5;@cihif\Z[XSWT]RK?1*()53FzsaNFA:110.+-230989^hgacYUSQLNOXPJB504937BAE;0*%' %##""!" "%##!$$!!!%+05:44:8545677102..1,++,,,.*(/-% !%(.& "651/$##!#*/%$!" !$+79,.1133/,% %#! 8DcY@BiytrXQPUXVMNbxv|zz{qE@?:;===5HR`gkYYs\\\\odlMB:62v`MB:6120-102//004CNMIGKE@E=;=DDBB9179749=;4/.+*,))*'$##$%$&'&((%$!$#.38877843479752301.,,,+/.+)* -. '##%$'%! -22-,%#&)+"!##%/:3!&,/2855(%"$ ! :W[B68T|tWNSTWXQYdx|{}}xfED@6;>;:9.1*%'#&, !"%.2. '7371-%! !)!4ZwS22SxZSPSXWRQ[z}z>IF>9<;==NBWgf]YpZ^KGbRL=82 )*zqaVJC=:411-+)'.0-$-'('$$'%&&"$&(,3633723321532590310./,*/+.1,-++###%.0863745754664202/.1.,,,+(,$ ((,-(",)%"),832/(#%%!!%*&$!"%.35/('#('$7\h=*e\PRVTRUY\zvrOJE9<<>;?P=QZhfaoS\CAcXO><1"'lriUQKRK:72.)).227AHVnaY>N;67)$"%"%$%)#$%'#&+*)+//1441314-+,,.1-'%!"&-455558997645122/210--*,*$  &.9( **("%-4/(662.'#'+,,! $%&!"'-/76(%-.)%!#&%'>dlG0rcSQMFNRU[wnk\CFEF>=?B?dAC74* -R{klW[[YNA800&).34RšqF9,%!! !$&(+02/4230/+-./++$$$$(/3455744452321-00.-./*,,# ',+$.)*(09<% 8@8.+)!-203)'$*'$+39943-+.$"#%*1338tw[/sjPSG2HEX[qf@ACALKHBIHBPSY\g[QRET8DeK=2-+/ )4scVbeXPB9.-),44H{p`aB+'"!"'**/100/.+)++*%"%&+,226545462312/21/-/-./-,$ #'-"&&1.*"#*065-! 5@E40.)&++,,*$%+*?=:(+*2-''++286A|mGTqsWIDS_hnw]K@KLLPNMSFXYc^gYOTGGA9b`{W06-& (wpfhg_PF93*)(2Gĩuhc_\S<%"##)*((-+*'(%&%&,00//1276753230+121-..,/-+%*3!(1.,) #(,4+.-"/4>@80+*+)/'#$-=;1+-/.0-+'$/12Ak{u\Jh|~}oocMIMW`ZuuvYPPTUXPXWXVVZ^_\Z]U6DGE[bv26<4,{rmjiaTD91+,-BvnxleZV<* !$&&&'&%$&,302123723442//1-..)/0.+,( 10 !*20--+'&+-),=6%)4;>:5.-))*&&!#2511,,/0)(* $%'DJPXY[VOZ^`UOLNMKMNMKLS[[`]XZ]Z[bd]Y^dWWYRU]OPY\_botH?E@$ ^szqk`RA6/-/;f~^SRT]ZLMH@/(!!! !!&&&((-1,313553../1/0//-..-/-.,++('-001/1%&/2))/3(*.1>A82*%!& $'$/05*+03+##%!!SUY`dd_NR`^_TSVZWXVW^Y`abdaa_`^`ac`b^e^QX\]sjca_alkMC7;5 =yvyul[UD811/Az~yhW?:8=B=;<74/*&%$"#"#!"$ !!# !  $#"++,22131333401.00/2-.1---,02 -'+0.-27) -4-**0+)5HI?=:4'(!% "(/*+24-(%$__elmnkbcindeebgf_W[]fbjkhf_^_bb\gabhjkU^_Vlljfa\^WdQH;6?$y{tiaTD6001JyvthkaR@5+'./1.,,).%/(''&&$+&'!!#% "! !$%)+.1121/11321200//0.0/1./.,,<',/-+33.*.014,2)1;IHB899-))%$#%%#((*/6,-)" mbrrrqtomssjggja]ZSHUV`eeXa`Y`be]fgicfdbecdhoqga]XTWVF@:=A tz{upaQD;0.8ftk`YOLNC*/'%*'(),)(**&'*)*+,*%& %%$""# !%&+)',-/00,/322210121/000.-03,&"$(-220*/---1//29BA;6153' %$+!#&'&$"$!#'()-2!noprsvwvwunihd[_`^]SUTSXZ``WZf`b`^_``\_Ycgeckhb[XSNKFJDBIkK{{xueZHH;GSy{td\UMIF=5-*'%&$#'%&'(+'&*(++-+'))-)' "$$#%++1023344/0010/01221001-0.   -36/+)+,+81,069<;3183*%('#!!&(,%! "#%))&#//2-$tjonqtprttlkigfdc__``Z\]U_]VW[\b]ZUX[X\]bcab_V]_`^dTQOXRVe=&||vl]UTXcq|sqc[UM?>90+&%%$&#%%*)(')/*/-*)+.'&''%"  $&(*(//.34315-0.212/22/2156/1* "&-%)/-(,482+*,43:=<:0&)%#"&$"+!$"##("'.8/&&qrmnty{zwzuvoiiha]ZM[eihcW[^Z]WY^WVY\Y]_ib]_]_]gga`eb`gdc_] y~}wnd`cgi|ssf`YM<>7/+'%'(&&&$'%$(()-+/*+-*+**)(&$$"" &(++*21-33112/0/.01033036404-   !$ %*0--+0;94)"'-,1/77,++"&%#$ !"#$#""/2,(%msty|~{~}|xnlaXXUNUgnsmngd_dcab\Y^hmlrc`[Y_hpiffhkmnrpgh"Q}xwoupnnwwnf[NEC6/+)('% #" "##&*'),,+,)**(&*)%#$" #&)')+-213644321010/2436/24754/ +&"!'-+ (,43/+&,1/22510--0(%!""!!$#!+/'' ||{~{|xxxrifb_[XSLObmtwqzyxuvwywv{{u{gcY[slpkonssntvtrJ #{{~vswvvvod\MI@=0)-,$&$$"#&()()%+-.,**)(&($% !#" &).(.013646560230//3160234513) +**($#)/%/%($-1/-01251/*-.1,-(&##"$"#~}||z}xwofjdhjifafepwv{x{}wzwwvpaPUGDSbbnqrwswyy~vw u~~~wy}|qdXTMJ@;3/)*' %!"$!&(()+*,()%*'%(%$!"$$%,(.00121033.201321532144210"  +*,1)$)+.2.*))261376.--***('""*&%%(!{rpwtlwxs^mxyxqlnghlzvphig]TOJF6=Ncmswuw}w{~?z|~khRWHDB..&(!&$&#%$(''+()**&$%%#$!%$!$-./122.011.//1021052/42531. '50/,%(&'+.('&-:1521)'/.*)(!"#%'&#"%}~~yzzdQGlytq]b_YZ\u{{|xwhsrqhkc^djvxt{{zv|yIö~udhZI3)-!&#&!$'&(*'))('&$#$ !&),+///25/0311///.23433054285+ !,301)'#!$&:7:2-'),*+&# $!#}xzoMNIUcbUDDPN@CXbx{|}}}xvxzvuw}|x}~qww mԽٸ|r_ZREA1)&$#"# "'$*(*'%"'&&##" ())-000220/201,00212445444232) '130*"!"!"./1/-/2+ )',((#,0/,#$!&$!w{z~zpqssIKJLJ?<855?FLM1dz}}|v{yzvy|w{}q{AоȯudbTUJ@;/($ $'%%$&(&#"%&#'&%%'((+//140.03/20//444812641344#"&160/(%&$!,40)*)-/,-)'##'//1, %&%! !nsvu~}{tux{{rkdWX`}lTCLMB@10/3GPZN[|~z~xvrqusx{}y}~xD}Ѣtqf`RNF=52,)"&#$#"#('%&&%&$$$%(%%+*//00/./00101456555121521! "*2;51,'$"$&$&87--+/421+'(73-(!#$&(#"" zuy|~uu`_ia]_]RBN\gsYUV\I?/33DJKUl~yx~kpkikpusvrqzsomκmlWROGD:40-)%! "!!%#$%"###%)'!,(-,,2-1..00/33563426405755+ $.163+.&%%(%) -.63210@%(*"$.+-*((#&+!"" |}|}zcONHSSDHOPNRWREPHQWTRIMPGGCO\}~}}~yz}|~uni]XP`[eeXYMWY`! Cs±ɩ|fSOELCA9BBEIHGNEB<=@>AJDEEH@ITt}ywnnfidYVYT=LJHNQ\[QyrhdTHJIA:80*('& !""!&'#&#'#**+).--.-./046037021/436451% '*)$"(!&&.43)&! +45."#&%&&#&&".26=/()-/,+ !|x|jZPJ@:89==>?@A<=C@DLC?@;DJHIBB>ADYvq}}}zqmqklwokgjfbaZVWR[b83y{{o_cRRGA=>82))*%&!  ! """$#')&$(*),,--/.////2014224412/13223- $)!""$&$'2.)%"+78./.%&''(-/% '..-(").-',#!#||aJG;;88864;=<742=AFJFBECJLNMJI@23CUU]beldXT]GIOWY]ghv|utxwuZxz|wpmmVZRGB9;<8-',("'"!!"!""#"&%&%&+)*),--0/0/100242121600/04231$"  !#)('*52+/+%(&*).0%!&###&+ " %'zsxdRE92.172.74>@9>KOMEA1/68ACWPENZb^KHFALEMSTcw|zv}2 R~x|~~smhbVPFHA?9:?6+"+'!%$%"$###$$$'+'*,,+,/2-//1320535142501//3333,#  "!# #!"'$# ,<4/,')((!*,*% " )&$!ZYubFC1/*/21)8@DEDEHAA=HGCDB846<7@HJMQXXUOPKJKIGMRTH`aY^]f^"rv|}}vrjb^\SNFHB@;994,(%&''%%$!""$#"&%(**+**-,-26.20003523221300-00211." ### ! !# %(/!&*99.112140% %#!)")H38A@>8ABD@?IIPKMRUWVZXPOPPPJQJJKNQK5z}xj{y{~}z~||ywnheXYXPJA@>:774/-*(*)$"$'&'$'''&(*+,+-/../300.0./02230420/.,,.22-)   %%# +)+01.//2500," *#&$&#"!1 $!:9<9=>759;;;>>?;CCA80124;::73367::@ERRLLSZZVUQX[[\`YPQNLQMHBGQM?FGxwuotu|z}}txqoi^[VSRHF>>957645..,.,,***')(&+()*+/..-01136063/024455611,.+-..10)$ #/")%"&&+++(.5/*)+ $0*!',0)&)-7("%$;:598?9.8978:AD@>@@53-35@B>?51/~yvzxuxyz}}}vmnpje__OVHI@>;48834330...-,+--,-&*()-/21/.035574164535856212..,,,00,"! "!!$!#%&))6:3.)# ! +%.-(+24-"'1/(%" 11149;8467237=@9:?95+.28=L>?AC:BOKNX_\][VE>=;?RTNML?BIM]kM8;T]pZLv{ukpx~}~zwpkihi\QULLKD<=996456464241120.0./,,+2//16107848724567776432---,0++2-( ) %"#*/688:5,&#""$!+/2255,'/-..0)%$" 3398>8;8876,-<@>;:744+=?LHB<>GGJQQTYXXIbUE941.8C>GE;5MV_gd;9M]ikXg||vssuqgz|wkgc[aVPOPJJIDCB?8=>6:9987644241232/113445878::7967574573010.+-(.++)-#"*(' " %)269;5>0+&(#!#%+023-'*-$(-%$$#<>;9789:;47534.,,,,)(*($(29 ""$#$&+368=B=40*)$%(!*.)&&.&!#$ # HKNIHF2,00/08<@A=BD?<6D?81851;GF:KCKL]IKI>:@>LTKPPbTia]NMHJZLHA>AA>@95:69<:98420-,+,+)'+%!:: ('+'!"($'15==>:83)/+)(&&),/(%+,*%%#RRU[RKC9./-2:A?9CHAA=<<@:9<=4?DD2ECIOPAI@<=<<>@?@><:=??CCEB?;0>>=>;:56/-**(*)$(%",L'>80.)$!3 ',./49B;63:660*',+02--+&))##VUb``_IFE8;<;A@58<5>dS>=AG7==H@G>CHMD?FFB85CKOHOTSM@B86KH46I<'CNR4.f{vttswsnlnlpyyxwidb^[ZUR[^ZY\WQTULG?GIBB?AEEEDBB@?BGCFBF<FJ99F:GQcLAHP6:AB5862-,+)+''($# "% ),%,31'*-2(((37=@553422)&()%"&$#"  \`g`^c\SFL@KEHKKGMRQSFOQYdZ:EGN]SILEA@@=77>CFFAB906;30,))2[EAETbhEAoz}|yttmkje[[ffohfnfdhe^^]_^ba]]^\`YYUQLMQPSQNPMIJIJGHCB@A@=8834,,++(*)$&#  "64**44/*$++$)%'889/20--&'&..*$,)) QXWPJJTREE;DEDPJFNRTPFERS^aJLUaa\KA>65:=9=BDF;;<9/,+*"('(>VD7ACOGf8o~zxvvrolb]SSW_jj`d^cacbc`_]`a`b``b_]VQQTTPQSJKHJHLFCE@@=<<;7.*/,*#(*'!! #d.+26:9> /0!(14-()'&#*2+-7-" '  BIEGD?GCBDNLHGMKOJ@AFNSUTS^WU?MJ7:>HBDEFDD=<80+*((&!.??9/7>8>EAe}{wsroolaZ[^]`]e[^_hbbed`_abdgfbefa\\VWTLNHGHHJHHDAF?C?=:641/,*)(()% "bV4$3640)#" $#"%')##'*+,49%!" DORF=7H;EAEC=CKGHDDFGJFCBGOPTMJPEIRX==<;;DGBCB>;71,-,,Ġ/0582172N|}spsnhc\]Z\[T]^_\]a`abfbeecbc^^Z[YYQRSOOJKIKIFGDFGCC<<72.0*'**(%% " cb[D*-25-#$)"#%"'' %+'/65 )KYVVD639?7CLK@A;67;=@C:655+/-.&!%22351.256;:7}}|tosnic]a_^a]_X[_a^cg`YbbeX_Z]YWVVVQPLPFMFJEJ?CDDIE<=87*,- ++#" !!`_dYZ>791##$(&#!$ +& $)*'(& !!)0+  .!QPLF>7-:;92?>=288C8>?<;11/2//0301-'("&9@0;RSV;;4*.+%/*~ooojghgidhmfebccdcfgcehefia\^ZWQSTPQQKLMIFCDCBEB>9600.00/))*(# &$!  EW\YZYX[Q #!"-2.&+'&"%%#(%,-*-2G!$'/3,00'*..0# 67:82+)8;4;0120/-.248;8168:::78;:0./,)).3/004.*)AB.,;L>8DAE;2-$'$",5spmjd^ifiijggedcegjkmioigfgb[][UZURQROMOJFBC>BC>;411//0/.*(+%$!!'!  KVXXZZ[VaT,# #!#)--++(*"#!$+*,*!!!*((,'%*/31!,)0.))0783..,.+*++-479842669<44322+0,%',--,+./,1EA12@I?>=<=4)*(#!"(%ǿxrlikfijdfiehfa`lkkdlkljkhcacgc`[UVTMMOKGHGCDFC>752.,/0/'&%(#$#!!"  KW\RVVYW^__@(! %!&!$(/0,)&%#"!'()$ !(**&" */1-! *(&-$))1/1-))'#$(+()588=<;H>4-(-*()+&$%**,/+$/5>@:14@A99:;561-*+1./!tsgjghdgehidjfkilrmnljjggf[hef]e^ZVTOKLGMHJF>@@924/--,,-+'#'#$%$    RWV]TWXTb^W[UA+!"# 4&*-"*(,!"&-%$(,,%$% %'.-,%(/*&++'&&!'-03/.<6732/20-.06; ,ĺ}qnoehfcdhgimmnlropqmlljdaca``_aYYVRQNNNGG?9;:+10//00(()! !&!    0V\[^dfbde^ZXXYXZM-#&#%"$$+%$"*. ( %!' " ""&&"!%%#%!!$)+)(%%,-02--:,*0(+6:/!'+-11*-19><549<:55520-//+/3?;0s¹|qvgecihjfkjnppxuiknmlgihdd`cZ]WVUXTOKIBD>9544413/00-,+&$%$  @SXR\a_^fraa[WXYYUVO2!(&&&"1"! !&!',)"" (&%(!" $"#)-/.2/,6OA:6DX80500-10#&'/259.-49:35=@9594471344207=3n̺wihgjggikfhmnijeolgijefddb]\\Z]VTSNKGA;=::73220,/*---)*) "  !WS\\b^ZaabUY\ZYZZYY[YE-0/( " ! $*&! "%0-'$!##$# $'.1113>D0?KNY8633-+32,),3269530==;63DA7=89F8<:6.93:_Ǻ}phcgfijhhfkminplmlhigidea]]aYTSQKEFEA;<9;62622.,(--**"! !  AU[^^^^_c`^][\X[YZ^\_]]]N61!$#%&,.''$'%!!"#+-50179?<@RONA:66,154'*032?;4)5?@/697>CL?KOT[k~yhc[difgkihgimkpjihedc`\^\\ZUSSOJEAA??9::6320./+-,,$'  #%"   +La_^Y]__]Z]]]\]YZ\\Z][\[]aK7$% &*%'((" $,3, #$''.4734:EETOcK=@;922694:80;@IqֲvnlbadjjghhjjkiipfegfdYb^[ZWYSPIJHC=B:<8:725541-.+-&$ !$"!!) EZ]^\b]`\YZX[YZXZ[]^\Ya`^^^`dL' !#&!4858CF;/#!,='$(3466649I\\QSKB@C>A::;97Z糬ypnibagbhgilhikhhebda`a`\XUORPMLDFC?B>>:;:87333.-*)"# !!! <% NTXY_\^c_XYWYY[Z[\Z\]\]_^^^__d[F   LMNFKHJGE?A;Q4#-6=27;5AF^STRQVXDI?LVs|lkd]V`dhefigkbkeddbc]\ZVQQMMNNIGDC?@@><7;;84651+)%#! ! ##"$!(A? JPW`a]\\VNWRVVX[]_Z[][_bb^___`aVfA"  !$NPSQTILEOXQTNPD83>28:?>:553/'% #!$$$ #"%DL IQXYa[VWXSZXXXZ\[aW]\\`bab`aab_bd]Y> 2,! %NOPTSPGHNQVWQdUOZE<+<3KXZF^Ugpwvqhfdcadeecdmfde^db`YXSRUOLLKHHEFEC>AA?><<<=83-+&'$'%%% %'"0CODHSW_a\UYWV[[\_`^`\]a^ad^`_ceddafbjah_7"((*%TIMRSRSNNPSY[^TIQMI>CDRWZ[O[êtpfeb^ccbiggebb`_^XWPQOONNKHIIICCBD?B?A=820''&('(()'!%$:IXZ< %FO\]ZZ[WZZ\W\``^b`a_`cbdbcdbdedcffecejV+"$# BEDLRNSPOST_aeSSTaZNXX_\agwάzrea`_c^]ifee^_X\XVQSSRPNKIIKH?EDAC@AACF>=420,($')())'('!;LZUZ 5Jc]\ZZ^Z\\b___b`c``bbeeheffggbgfjigfecegG  )BCCKVLMIOYXYac^ZW]bbbfidбxoja\`addeca`baXXYYSTQPPLJNIGEDDCBJCDBCA981.+*(+(*(*(''($"BXY^]S CK_kY[SU׻lcbbcefjfbb``^XYVVWXTTQORMPTSNMJHID<@;774211/0--(#+0)!$"!B`egjec^Y\ CIQZ\db^dcbcfeffgjhpmloonknopoomnoolmikillflmlglZ&%=.%'(-0=:567>?:CBDCMVladhʳujdecdbk\ebb]_^^VZXWWUUVRQSPRMMHCC@A?A8553405/1.+)/-#"""-W_hjmihecXU  :EMY\aeefhffjjhliloiopllprkpkommsrpqqqqrnmmsqlpmjnkH%1.%,:576><=913<<68-7==:;2?@:;BMb]ouлqlcigigphoclhhgee`\[YRPLLJIFDDIFD?B=;=;57203914030"&''!*SfjqktuqojjcX =GT[cdekgkokpnkoplpqqoqrssttststtvxuvsuuyyvntoqprsoqniP5,&"%"",IQWbLDFMNQF@G:;@FH>EH@8:\[VoŪ}ylhggohjnmomoghab_^`SVQOMLIEHKCEEECA@7>:658857756.&!'*))C]qswwxyyukjj_3 AMU]efkpdljkpruuusrwnsvuutwvu}{zwxxwuuy{~|wyxyvrvususooiW= ''.-29FJ<;CD?<9:9:966:533+ (.*4Rpr~y{y}~zupldN 0 .I`\echmostrqqqsvrvwsvvrvzzxw{{{xzuz|{x}||zyyyvvqsyqoqL2/5@452=DH=Fe~QORI77ACIKP8NOWQOUqkҽ{oheca_^_a__ba\XXXSUSPOSPEGFHJFDAD@A>:8:6869<874/+)-%@byu|}zxyqhU8 '=< HW\lloqmqstwtswts{y||z{zxyz{y{}}y}|~~}}||{vwpprptYG?3;.9EVZZZ\[UNF<-=@>HF:WVSUNTi˹vkb[]\\_]\^Z\[\[ZUQ]NONPNMGHIIGEKAA=;56:96:=:883),./5Pnz{pel_? @K?" 4Yjloqqsqtyw|xuy}y|z{x{{|~}}|~~~~z|zzyxvurpsdGGbeZhfeiOTF<721<>JJ=BW][Zbe^Ϻxh`VWWUVWV]\T][\VVSTLLMMIMHIJIGGB>>><=;5<<<;984+/0.5f~|tc8`mF 7='(Vfnnswvxxy|{|z}zz}}~~~~|~zyvsqtrcZeqqfZJF72'&A=DH<999:40/;j}syy<,5DC0_tljqq|{~~{zzwuuvvmlF<1&/(4.04DCGTZ˾hfbYVTTOURSPOKMHKOMKKOLOPNPSNMJIHEFA?<9:84.2;P|~yoxK2(CU?^~{~y{wyxwtqXF51#EC/08=FR˺zqnok^UUTPRSPRPNLSHHJJJLQMPNPNOMJKGHEB?<6:8866Gn~~|yZ)28QKf|}||yzzwurm@=6!U]U88]h`~rkl``gVSRRQPTSQIKHKGFJKMNRPPQSSULHGC@>>;;9:54_|}}^6CP^F`}~ys{xwvnxJ*(VebSFq_½m_]b_SWSQUQRPMMLMJMJHNMWVTTUUPQQLIDA><9=<53O}~oKc@d@Y|}~{{{{yusuxF-#Xa__fw`ɺ|rkeb\QRRSKNNKMLLJKKRQNRRWTSQUQJIGCA>?>?9HdpXBAd9d|z|xxwuxN-ZQZ\\[ʼ{rorn^YXUQQNOROKNKKW[`RUXXVRQTRLLHDA@A=5`gJB9WEk֮z}zwzxx{;OHTTTW̾{qhdcX]_YYSUUXOW[frkZYRZYTSSHMJDG=:Kf?>@dT`ᵝ|~{|yyxuzJJQ\jDztgb]i`[a^]d]`cewƫn_`\WRUWIII@Mm\I:OY:_ͩ~{{y{xvvvJTUOiƷvkdnf`ijimnvμ_\^XQQPTKj`GEDmU_簘}|zzzzyuRR_mkиvhc]gdefmlxȳzkbab^`ø^GBMhTWΦ}~~{}|xzywNUKhӵti_`a\pvw½uur^kmE;@obO~{yyyK[jfŹqgd_itͪvcԻwHBA{P@k⮔~~~|}zvVHUmƿŽpfomnu|د~\A)GYRdOJlج~~{x~x~Wc]gͼyrisowмշi<(0BSVt\T|Û|~z|vzz|Sn`ֽœtkiv̰ҳ`G>DG}dW^齙}{x~}ao[ƸyvtHZEbx]\԰}|||ytiuǺux̰gW;X{fKƦ~~zypggū|JBOtw\Ƿ~~{dcǼìGNObm]q˺~~z}bhd\_P_tnǭ}[ae²ѻpTKhٻ~|\Zn辶bd͌ONco缭䵌ב֫ӿĔњ¿٘˧viZѧ{pyyˡƆѸͥ޷ҹ԰Ԑʯ֞ۈЭ˳iʻΫy߳ӭ׺vƦƝgےںĄܛ~n밖h|䶐op̈́꬜{{}o򬒟军ն|n󸣷XpoúѽqµõҺz윔Ʋ|ڶ¼ҩӃɺǹְ֠ļ¼ڣiБlʹͿȻ`᭭oUÿνƽء~nɿ¿cjp˿ǹ慪οȾ»«ȸfreefem++-3.38-1/examples++-load/FreeFemQA.cpp000644 000767 000024 00000014450 12466661714 020745 0ustar00hechtstaff000000 000000 // // FreeFamQA.cpp // // // Created by Jean-Marie Mirebeau on 09/10/11. // Copyright 2011 UPMC. All rights reserved. // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //compilation : ff-c++ FreeFemQA.cpp -I/usr/local/boost_1_47_0 //ff-c++-cpp-dep: GeometryQA.cpp #include #include #include using namespace std; #include "ff++.hpp" using namespace Fem2D; //#include namespace mir { #define _FLAGGED_BOUNDARY_ #include "Geometry.hpp" } //the main class //details of FreeFem meshes (connectivity, etc) in file GenericMesh.hpp class MeshGenQA : public E_F0mps { public: static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =7; Expression nargs[n_name_param];// store named args typedef Mesh * Result; Expression expTh; Expression expM11; Expression expM12; Expression expM22; MeshGenQA(const basicAC_F0 & args) { args.SetNameParam(n_name_param,name_param,nargs);// named args expTh= to(args[0]); // a the expression to get the mesh expM11= to(args[1]); expM12= to(args[2]); expM22= to(args[3]); } double arg(int i,Stack stack,double a) const { return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KN * arg(int i,Stack stack,KN * a) const{ return nargs[i] ? GetAny *>( (*nargs[i])(stack) ): a;} ~MeshGenQA(){} static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), atype(), atype() );; } static E_F0 * f(const basicAC_F0 & args){ return new MeshGenQA(args);} AnyType operator()(Stack s) const ;// la vraie fonction qui fait faire le boulot }; basicAC_F0::name_and_type MeshGenQA::name_param[MeshGenQA::n_name_param] = { //{ "flag", &typeid(long)}, { "noIsoRef", &typeid(bool)}, { "finalRefine", &typeid(bool)}, { "exportIntermediateData", &typeid(bool)}, { "Lip", &typeid(double)}, { "exportToMathematica", &typeid(bool)}, { "exportMetricToMathematica",&typeid(bool)}, { "noRef", &typeid(bool)} }; AnyType MeshGenQA:: operator()(Stack stack) const { //const long flag = arg(0,stack,0L); const bool noIsoRef = arg(0,stack,false); const bool finalRefine = arg(1,stack,false); const bool exportIntermediateData = arg(2,stack,false); unsigned int flag = 0; if(noIsoRef) flag |= mir::Triangulation::hRQA_noIsoRef; if(finalRefine) flag |= mir::Triangulation::hRQA_finalRefine; if(exportIntermediateData) flag |= mir::Triangulation::hRQA_exportIntermediateData; const double Lip = arg(3,stack,5.); const bool exportToMathematica = arg(4, stack, false); const bool exportMetricToMathematica = arg(5, stack, false); const bool noRef = arg(6, stack, false); Mesh * pTh = GetAny((*expTh)(stack)); ffassert(pTh); const Mesh & Th= *pTh; class FFMetric2 : public mir::Metric2 { const MeshGenQA &MGQA_; Stack stack_; public: FFMetric2(const MeshGenQA &MGQA, Stack stack, double Lip):MGQA_(MGQA),stack_(stack){lip=Lip;} const mir::sym2 operator()(const mir::R2 &P) const { MeshPointStack(stack_)->set(P.x,P.y); //needs to be done three times ? MeshPointStack(stack_)->set(P.x,P.y); MeshPointStack(stack_)->set(P.x,P.y); return mir::sym2(GetAny((*MGQA_.expM11)(stack_)), GetAny((*MGQA_.expM12)(stack_)), GetAny((*MGQA_.expM22)(stack_)) ); } }; FFMetric2 ffMetric(*this,stack,Lip); const mir::Metric2 &metric = ffMetric; mir::Triangulation triQA(Th,metric); if(!triQA.check()) {cout << "MeshGenQA : Error while importing mesh !\n"; return false;} if(exportToMathematica) triQA.export_to_Mathematica("ThFF.txt"); if(exportMetricToMathematica) triQA.export_to_Mathematica_Metric("ThFF_Metric.txt"); if(!noRef) triQA.hRefineQA(1, flag); triQA.export_to_FreeFem("triQA.msh"); if(exportToMathematica) triQA.export_to_Mathematica("TriQA.txt"); if(exportMetricToMathematica) triQA.export_to_Mathematica_Metric("TriQA_Metric.txt"); /* if(exportToMathematica) { vector gains; gains.resize(triQA.ne_oriented()); for(int i=0; iBoundingBox(Pn,Px); m->quadtree=new Fem2D::FQuadTree(m,Pn,Px,m->nv); m->decrement(); return m; } }; /* class Init { public: Init(); }; $1 */ // Init init; static void Load_Init() { cout << "\n -- lood: init MeshGenQA\n"; Global.Add("MeshGenQA","(", new OneOperatorCode( )); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/freeyams.cpp000644 000767 000024 00000053721 12466661714 021031 0ustar00hechtstaff000000 000000 // ORIG-DATE: Fev 2010 // -*- Mode : c++ -*- // // SUMMARY : liaison medit freefem++ : adaptmesh in 3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: freeyams libMesh //ff-c++-cpp-dep: // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* ff-c++ -auto freeyams.cpp */ // ./ff-c++ yams.cpp -I../src/libMesh/ -I../download/include/yams/ -L../download/lib/yams/ -lyams2 -L/Users/morice/work/postdoc/freefem++prod/src/libMesh/ -lMesh #include "ff++.hpp" #include "msh3.hpp" //#define ADAPTLIBRARY #include "memory.h" #include "freeyamslib.h" #include "eigenv.h" // include dans libMesh using namespace Fem2D; using namespace yams; // 3d mesh function void mesh3_to_yams_pSurfMesh( const Mesh3 &Th3 , int memory, int choix, yams_pSurfMesh meshyams){ /* Mesh3 :: maillage initiale memory :: memoire pour yams choix :: option du remaillage ref :: */ int k; int npinit,neinit; meshyams->dim = 3; meshyams->npfixe = Th3.nv; meshyams->nefixe = Th3.nbe; meshyams->ntet = Th3.nt; meshyams->nafixe = 0; // Edges meshyams->nvfixe = 0; // Normals meshyams->ntfixe = 0; // Tangents npinit = meshyams->npfixe; neinit = meshyams->nefixe; // cette fonction change la taille des tableaux en fonctions des options : choix, memory, sm->type zaldy1( meshyams->nefixe, meshyams->npfixe, meshyams->nvfixe, memory, meshyams, choix); yams_pPoint ppt; for (k=1; k<=npinit; k++) { ppt = &meshyams->point[k]; ppt->c[0] = Th3.vertices[k-1].x; ppt->c[1] = Th3.vertices[k-1].y; ppt->c[2] = Th3.vertices[k-1].z; ppt->ref = Th3.vertices[k-1].lab & 0x7fff; ppt->tag = M_UNUSED; ppt->color= 0; ppt->size = -1.; ppt->tge = 0; ppt->geom = M_CURVE; } meshyams->npfixe = npinit; /* read mesh triangles */ yams_pTriangle ptriangle; for (k=1; k<=neinit; k++) { const Triangle3 & K(Th3.be(k-1)); ptriangle = &meshyams->tria[k]; ptriangle->v[0] = Th3.operator()(K[0])+1; ptriangle->v[1] = Th3.operator()(K[1])+1; ptriangle->v[2] = Th3.operator()(K[2])+1; ptriangle->ref = K.lab& 0x7fff; } /* tetrahedra */ if( meshyams->ntet ){ yams_pTetra ptetra; meshyams->tetra = (yams_Tetra*)calloc((meshyams->ntet+1),sizeof(yams_Tetra)); assert(meshyams->tetra); for (k=1; k<=meshyams->ntet; k++) { const Tet & K(Th3.elements[k-1]); ptetra = &meshyams->tetra[k]; ptetra->v[0] = Th3.operator()(K[0])+1; ptetra->v[1] = Th3.operator()(K[1])+1; ptetra->v[2] = Th3.operator()(K[2])+1; ptetra->v[3] = Th3.operator()(K[3])+1; ptetra->ref = K.lab & 0x7fff; } } meshyams->ne = meshyams->nefixe; meshyams->np = meshyams->npfixe; } Mesh3 * yams_pSurfMesh_to_mesh3( yams_pSurfMesh sm, int infondang, int infocc, int choix){ /* Mesh3 :: maillage initiale memory :: memoire pour yams choix :: option du remaillage ref :: */ // variable a enlever par la suite yams_pGeomSupp gs; yams_pGeomtge gt; yams_pPoint ppt; yams_pTriangle pt1; yams_pTetra ptt; yams_pEdge pte; int i,k,np,ne,nn,nt,nav,natv,tatv,nbl; int nedge,nridge,ndang,nrequis; int is1,is2,ncorner,prequis; // freefempp variable int ff_nv, ff_nt, ff_nbe; /* mark connected component */ ne = 0; for (k=1; k<=sm->npmax; k++) { ppt = & sm->point[k]; ppt->tag |= M_UNUSED; ppt->flag = ppt->color = 0; } // a enlever pour l'instant if ( sm->connex > 0 ) { for (k=1; k<=sm->ne; k++) { pt1 = &sm->tria[k]; if ( pt1->v[0] > 0 && pt1->cc == sm->connex ) { ne++; for (i=0; i<3; i++) { ppt = &sm->point[pt1->v[i]]; ppt->tag &= ~M_UNUSED; } } } } else { /* mark used faces */ for (k=1; k<=sm->ne; k++) { pt1 = &sm->tria[k]; if ( !pt1->v[0] ) continue; ++ne; for (i=0; i<3; i++) { ppt = &sm->point[pt1->v[i]]; ppt->tag &= ~M_UNUSED; } } } cout << "sm->ntet=" << sm->ntet << endl; // a enlever on ne garde pas les tetrahedres // demander P. Frey if ( choix == 6 && sm->ntet ) { for (k=1; k<=sm->ntet; k++) { ptt = &sm->tetra[k]; if ( !ptt->v[0] ) continue; for (i=0; i<4; i++) { ppt = &sm->point[ptt->v[i]]; ppt->tag &= ~M_UNUSED; } } } /* mark used vertices */ np = nav = 0; ncorner = prequis = 0; for (k=1; k<=sm->npmax; k++) { ppt = &sm->point[k]; if ( ppt->tag & M_UNUSED ) continue; ppt->tmp = ++np; if ( ppt->tag == M_NOTAG ) nav++; } ff_nv = np; // number of vertex // Vertex3 *ff_v = new Vertex3[ff_nv]; int kk=0; for(k=1; k<=sm->npmax; k++) { ppt = &sm->point[k]; if ( ppt->tag & M_UNUSED ) continue; ff_v[kk].x = ppt->c[0]; ff_v[kk].y = ppt->c[1]; ff_v[kk].z = ppt->c[2]; ff_v[kk].lab = ppt->ref; kk++; if (ppt->tag & M_CORNER) ncorner++; if (ppt->tag & M_REQUIRED ) prequis++; } assert(kk==ff_nv); // write triangle nedge = sm->dim == 3 ? infondang : 0; nridge = nrequis = nn = nt = natv = tatv = 0; for (k=1; k<=sm->ne; k++) { pt1 = &sm->tria[k]; if ( !pt1->v[0] ) continue; else if ( sm->connex > 0 && pt1->cc != sm->connex ) continue; nt++; } ff_nbe = nt; Triangle3 *ff_b = new Triangle3[ff_nbe]; Triangle3 *ff_bb = ff_b; for (k=1; k<=sm->ne; k++) { int iv[3],lab; pt1 = &sm->tria[k]; // lab = pt1->ref; if ( !pt1->v[0] ) continue; else if ( sm->connex > 0 && pt1->cc != sm->connex ) continue; iv[0] = sm->point[pt1->v[0]].tmp-1; iv[1] = sm->point[pt1->v[1]].tmp-1; iv[2] = sm->point[pt1->v[2]].tmp-1; lab = pt1->ref; // change fh 02/2013 //cout << " lab : " << sm->connex << " " << pt1->cc << " " << pt1->ref<< " " << endl; (*ff_bb++).set( ff_v, iv, lab); for (i=0; i<3; i++) { ppt = &sm->point[pt1->v[i]]; gs = &sm->geom[pt1->vn[i]]; gt = &sm->tgte[ppt->tge]; if ( ppt->tag > M_NOTAG ) { natv++; if ( ppt->tag & M_CORNER ) tatv++; } if ( !gs->newnum ) gs->newnum = ++nn; if ( !gt->newnum ) gt->newnum = ++nt; if ( !pt1->edg[i] && pt1->tag[i] == M_NOTAG ) continue; else if ( pt1->adj[i] && (k > pt1->adj[i]) ) continue; nedge++; if ( pt1->tag[i] & M_RIDGE_GEO ) nridge++; if ( pt1->tag[i] & M_REQUIRED ) nrequis++; } } Tet *ff_t; if ( choix == 6 && sm->ntet ) ff_t = new Tet[sm->ntet]; Tet *ff_tt = ff_t; if ( choix == 6 && sm->ntet ) { int iv[4],lab; for (k=1; k<=sm->ntet; k++) { ptt = &sm->tetra[k]; if ( !ptt->v[0] ) continue; for (i=0; i<4; i++) iv[i] = sm->point[ptt->v[i]].tmp-1; lab = ptt->ref; (*ff_tt++).set( ff_v, iv, lab); } } // les autres avoir par la suite if( verbosity>1 ) cout << " nv " << ff_nv << " nbe" << ff_nbe << endl; if( choix == 6 && sm->ntet){ int ff_nt = sm->ntet; Mesh3 *TH3_T = new Mesh3(ff_nv,ff_nt,ff_nbe,ff_v,ff_t,ff_b); TH3_T->BuildGTree(); return TH3_T; } else{ Mesh3 *TH3_T = new Mesh3(ff_nv,ff_nbe,ff_v,ff_b); return TH3_T; } } void solyams_pSurfMesh( yams_pSurfMesh sm, const int &type, const KN & tabsol, float hmin, float hmax){ yams_pPoint ppt; yams_pMetric pm; int i,k; double sizeh,m[6],lambda[3],vp[2][2],vp3[3][3]; hmin = FLT_MAX; hmax = -FLT_MAX; float vpmin=FLT_MAX, vpmax=-FLT_MAX, mmin=FLT_MAX,mmax=-FLT_MAX; if(type == 1) { for (k=1; k<=sm->npfixe; k++) { ppt = &sm->point[k]; ppt->size = (float) tabsol[k-1];// change FH nov 2010: k -> k-1 hmin = min(ppt->size,hmin); hmax = max(ppt->size,hmax); } } else if( type == 3 ){ if ( !sm->metric && !zaldy3(sm,3) ) { ExecError("Pb alloc metric in freeyam ??? "); } for (k=1; k<=sm->npfixe; k++) { ppt = &sm->point[k]; pm = &sm->metric[k];// coorrection FH dec 2010.. memset(pm->m,6*sizeof(float),0.); for (i=0; i<6; i++) m[i] = (float) tabsol[(k-1)*6+i]; pm->m[0] = m[0]; pm->m[1] = m[1]; pm->m[2] = m[3]; pm->m[3] = m[2]; pm->m[4] = m[4]; pm->m[5] = m[5]; pm->k1 = pm->k2 = (float)FLT_MAX; for (i=0; i<6; i++) m[i] = pm->m[i]; if ( !eigenv(1,m,lambda,vp3) ) { fprintf(stderr," ## ERR 9201, inbbf, Not a metric tensor. Discarded\n"); free(sm->metric); sm->metric = 0; ExecError("freeyamerr: ## ERR 9201, inbbf, Not a metric tensor. Discarded"); } float vmn = min(min(lambda[0],lambda[1]),lambda[2]); float vmx = max(max(lambda[0],lambda[1]),lambda[2]); vpmin= min(vpmin, vmn); vpmax= max(vpmax,vmx); sizeh = vpmax; ppt->size = max(1.0 / sqrt(sizeh),EPS); hmin = min(ppt->size,hmin); hmax = max(ppt->size,hmax); } } //if(verbosity>4) { cout << " freeyams (metric in) : hmin " << hmin << " , hmax " << hmax << endl; if(type==3) cout << " min max of eigen val " << vpmin << " " << vpmax << endl; } if(type==3 && vpmin <0 ) { cout << " Error Freeyam : metric min max of eigen val " << vpmin << " " << vpmax << endl; ExecError("Error in metric definition freeyams (negative eigen value"); } } static const int wrapper_intopt[13] = { 0, 3, 7, 8, 9, 11, 12, 13, 14, 15, 17, 18, 22}; /* static const int wrapper_fopt[12] = { 0, 1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13}; */ static const int wrapper_fopt[11] = { 1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13}; void yams_inival(int intopt[23],double fopt[14]){ /* intopt : 0 !! anisotropie 1 !! ecp // enl 2 !! extended out put file // enl 3 !! FE correction 4 !! Formatted (ascii) output file // enl 5 !! save metric file // enl 6 !! msh2 // enl 7 !! Split multiple connected points 8 !! memory 9 !! connected component 10 !! vrml //enl 11 !! imprim 12 !! nm : Create point on straight edge (no mapping) 13 !! nc : No validity check during smoothing (opt. 9) 14 !! np : Specify number of points desired 15 !! nit : Nb Iter 16 !! nq : Output quads // enl 17 !! nr : No ridge detection 18 !! ns : No point smoothing 19 !! no : No output file // enl 20 !! ref : Ignore face references // enl // rajouter lors de l'ouverture du fichiers yams 21 !! absolute : opts.ctrl &= ~REL; par default 1 // enl 22 !! set optim option fopt : 0 !! iso 1 !! eps pas de 2 3 !! opts.lambda 4 !! opts.mu pas de 5 6 !! hgrad :: opts.shock 7 !! hmin :: opts.hmin 8 !! hmax :: opts.hmax // rajouter lors de l'ouverture du fichiers yams 9 !! tolerance :: opts.bande 10 !! degrad :: opts.degrad 11 !! declic :: opts.declic 12 !! walton :: opts.walton = cos(dummy/180.0*M_PI); 13 !! ridge :: opts.ridge */ /* Set default values for options */ // fopt 5, fopt[7] = -2.0; fopt[8] = -2.0; fopt[6] = 1.3; /* default mesh gradation */ fopt[1] = 0.01; /* geometric approximation */ fopt[0] = 0.0; fopt[11] = 1.0 / BETAC; fopt[3] = -1.0; fopt[4] = -1.0; fopt[13] = 45.; // default RIDG = 45. //opts.ridge = cos(RIDG*M_PI/180.); //opts.geom = cos(GEOM*M_PI/180.); fopt[12] = COS45DEG; /* Walton limitation */ fopt[9] = -2; /* default = 1 unit */ fopt[10] = QUALCOE; /* quality degradation */ //opts.ctrl = REL | ISO; initialisation by default // intopt :: 3,7,13,14,15,20 intopt[15] = -1; intopt[13] = 0; intopt[14] = -1; /* get decimation parameters */ intopt[20] = 0; intopt[3] = 0; intopt[7] = 0;// Split multiple connected points (no manifold) intopt[22] = 1;// set optim option // demander P. Frey intopt[0] = 0; // anisotropie intopt[1] = 0; // intopt[2] = 0; intopt[4] = 0; intopt[5] = 0; intopt[6] = 0; intopt[8] = -1; // memory intopt[9] = -1; // par default connex connected component (tout) intopt[10] = 0;// vrml intopt[11] = verbosity; intopt[12] = 0; //nm intopt[16] = 0; // quad intopt[17] = 0;// noridge intopt[18] = 0;// nosmooth intopt[19] = 1;// 1 intopt[21] = 1; } class yams_Op: public E_F0mps { public: typedef pmesh3 Result; Expression eTh; int nbsol; int nbsolsize; int type; int dim; vector sol; static const int n_name_param = 14; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} int arg(int i,Stack stack, int a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack, bool a ) const{ return nargs[i] ? GetAny< bool >( (*nargs[i])(stack) ): a;} public: yams_Op(const basicAC_F0 & args) : sol( args.size()-1 ) { cout << "yams"<< endl; args.SetNameParam(n_name_param,name_param,nargs); eTh=to(args[0]); dim=3; nbsol = args.size()-1; if(nbsol >1) CompileError(" yams accept only one solution "); int ksol=0; if(nbsol == 1){ int i=1; if (args[i].left()==atype()) { const E_Array * a = dynamic_cast(args[i].LeftValue()); ffassert(a); ksol+=a->size(); } else ksol++; sol.resize(ksol); // type :: 1 sca, 2 vector, 3 symtensor ksol=0; nbsolsize=0; type = 0; if (args[i].left()==atype()) { const E_Array * a = dynamic_cast(args[i].LeftValue()); ffassert(a); int N=a->size(); nbsolsize=nbsolsize+N; switch (N){ /* case 3 : type[i-1]=2; for (int j=0;j((*a)[j]); break; */ case 6 : type=3; for (int j=0;j((*a)[j]); break; default : CompileError(" 3D solution for yams is a scalar (1 comp) or a symetric tensor (6 comp)"); break; } } else { type=1; nbsolsize=nbsolsize+1; sol[ksol++]=to(args[i]); } if( nargs[2] ) CompileError(" we give two metric for yams "); } } static ArrayOfaType typeargs() { return ArrayOfaType( atype< pmesh3 >(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new yams_Op(args);} AnyType operator()(Stack stack) const ; operator aType () const { return atype< pmesh3 >();} }; basicAC_F0::name_and_type yams_Op::name_param[]= { { "loptions", &typeid(KN_)}, //0 { "doptions", &typeid(KN_)}, { "metric", &typeid(KN_)}, { "aniso", &typeid(bool)} ,//3 { "mem", &typeid(long)} , { "hmin", &typeid(double)} , { "hmax", &typeid(double)} ,//6 { "gradation", &typeid(double)} , { "option", &typeid(long)} , // 8 { "ridgeangle", &typeid(double)} ,//9 { "absolute", &typeid(bool)}, //10 { "verbosity", &typeid(long)}, //11 { "nr", &typeid(long)}, // 12 no ridge { "ns", &typeid(long)} // 13 no point smoothing }; AnyType yams_Op::operator()(Stack stack) const { // initialisation MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); ffassert( pTh ); Mesh3 &Th3=*pTh; int nv=Th3.nv; int nt=Th3.nt; int nbe=Th3.nbe; KN defaultintopt(23); KN defaultfopt(14); defaultintopt = 0; defaultfopt = 0.; yams_inival( defaultintopt, defaultfopt); KN intopt(23); for(int ii=0; ii< 23; ii++){ intopt[ii]=defaultintopt[ii]; } KN fopt(14); for(int ii=0; ii< 14; ii++){ fopt[ii]=defaultfopt[ii]; } assert( fopt.N() == 14 ); if( nargs[0] ){ KN intopttmp = GetAny >( (*nargs[0])(stack) ); if( intopttmp.N() != 13 ){ cerr <<"the size of vector loptions is 13 " << endl; exit(1); } else{ for(int ii=0; ii<13; ii++){ intopt[ wrapper_intopt[ii] ] = intopttmp[ii]; } } } if( nargs[1] ){ KN fopttmp = GetAny >( (*nargs[1])(stack) ); if( fopttmp.N() != 11 ){ cerr <<"the size of vector loptions is 11 not " << fopttmp.N()<< endl; ExecError("FreeYams"); } else{ for(int ii=0; ii<11; ii++){ fopt[ wrapper_fopt[ii] ] = fopttmp[ii]; } } } intopt[0] = arg(3,stack,intopt[0]!=1); intopt[8] = arg(4,stack,intopt[8]); fopt[7] = arg(5,stack,fopt[7]); fopt[8] = arg(6,stack,fopt[7]); fopt[6] = arg(7,stack,fopt[6]); intopt[22] = arg(8,stack, intopt[22] ); // optim option if(nargs[9]) intopt[17]=1; fopt[13] = arg(9,stack,fopt[13]); // ridge angle intopt[21] = arg(10,stack, intopt[21] ); // absolue intopt[11] = arg(11,stack,(int) verbosity); // verbosity intopt[17] = arg(12,stack,intopt[17]); // no ridge intopt[18] = arg(13,stack,intopt[18]); // nb smooth if(verbosity>1) { cout << " fopt = ["; for(int i=0;i<11;++i) cout << fopt[wrapper_fopt[i]] << (i < 10 ? ",": "];\n") ; cout << " intopt = ["; for(int i=0;i<13;++i) cout << intopt[wrapper_intopt[i]] << (i < 12 ? ",": "];\n" ); } /* KN intopt(arg(0,stack,defaultintopt)); assert( intopt.N() == 23 ); KN fopt(arg(1,stack,defaultfopt)); assert( fopt.N() == 14 ); */ KN metric; int mtype=type; if( nargs[2] ) { metric = GetAny >( (*nargs[2])(stack) ); if(metric.N()==Th3.nv){ mtype=1; intopt[1]=0; } else if(metric.N()==6*Th3.nv){ intopt[1]=1; mtype=3; } else cerr << "sizeof vector metric is incorrect, size will be Th.nv or 6*Th.nv" << endl; } else if(nbsol>0) { if( type == 1 ) { intopt[1]=0; metric.resize(Th3.nv); metric=0.; } else if( type ==3 ) { intopt[1]=1; metric.resize(6*Th3.nv); metric=0.; } } else { if( intopt[1]==0 ){ metric.resize(Th3.nv); metric=0.;} else if ( intopt[1]==1 ){ metric.resize(6*Th3.nv); metric=0.;} } // mesh for yams yams_pSurfMesh yamsmesh; yamsmesh = (yams_pSurfMesh)calloc(1,sizeof(yams_SurfMesh)); if ( !yamsmesh ){ cerr << "allocation error for SurfMesh for yams" << endl; } yamsmesh->infile = NULL; yamsmesh->outfile = NULL; yamsmesh->type = M_SMOOTH | M_QUERY | M_DETECT | M_BINARY | M_OUTPUT; mesh3_to_yams_pSurfMesh( Th3 , intopt[8], intopt[22], yamsmesh); // solution for freeyams2 if(nbsol) { MeshPoint *mp3(MeshPointStack(stack)); KN takemesh(nv); takemesh=false; for(int it=0;itsetP(&Th3,it,iv); for(int ii=0;ii( (*sol[ii])(stack) ); } takemesh[i] = true; } } } } if(verbosity>10) cout << "nbsol " << nargs[2] << endl; if( nargs[2] || (nbsol > 0) ){ float hmin,hmax; solyams_pSurfMesh( yamsmesh, mtype, metric, hmin, hmax); yamsmesh->nmfixe = yamsmesh->npfixe; if( fopt[7] < 0.0 ) fopt[7]= max(fopt[7],hmin); if( fopt[8] < 0.0 ) fopt[8]=max(fopt[8],hmax); } else{ yamsmesh->nmfixe = 0; } int infondang=0, infocc=0; int res = yams_main( yamsmesh, intopt, fopt, infondang, infocc); if(verbosity>10) cout << " yamsmesh->dim " << yamsmesh->dim << endl; if( res > 0){ cout << " problem with yams :: error " << res << endl; ExecError("Freeyams error"); } Mesh3 *Th3_T = yams_pSurfMesh_to_mesh3( yamsmesh, infondang, infocc ,intopt[22] ); // recuperer la solution ???? if(verbosity>10) { cout << &yamsmesh->point << " " << &yamsmesh->tria << " " <<&yamsmesh->geom << " " << &yamsmesh->tgte << endl; cout << &yamsmesh << endl; } free(yamsmesh->point); free(yamsmesh->tria); free(yamsmesh->geom); free(yamsmesh->tgte); if ( yamsmesh->metric ) free(yamsmesh->metric); if ( yamsmesh->edge ) free(yamsmesh->edge); if ( yamsmesh->tetra ) free(yamsmesh->tetra); free(yamsmesh); *mp=mps; Add2StackOfPtr2FreeRC(stack,Th3_T); return SetAny(Th3_T); } /* class Init1 { public: Init1(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ //typedef Mesh3 *pmesh3; if(verbosity) cout << " load: freeyams " << endl; Global.Add("freeyams","(",new OneOperatorCode); } #define WITH_NO_INIT #include "msh3.hpp" LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/funcTemplate.cpp000644 000767 000024 00000012346 12466661644 021645 0ustar00hechtstaff000000 000000 // Example C++ function "CppModTemplate" dynamically loaded into "load.edp" // ------------------------------------------------------------------------ #include #include "AFunction_ext.hpp" // Extension of "AFunction.hpp" to deal with more than 3 parameters function using namespace Fem2D; // see src/femlib/RNM.hpp // dummy routine to understand how to use vector double CppModTemplate3(KN *const & A, // OUTPUT KN *const & B, KN *const & C) // INPUTS { // Remarque: // It might prove usefull to have a look in the cpp file where KN is defined: src/femlib/RNM.hpp // // To access value at node i of vector N, do as follow: *(N[0]+i) // Explanation (C++ for dummies as I am ;-): // N is an alias to the KN object. // N[0] is a pointer to the first element of the vector. // N[0]+i is a pointer to the ith element of the vector. // *(N[0]+i) is the value of the ith element of the vector. int nn = A->N(); // get number of nodes cout << "nn: " << nn << endl; for(int i=0; i *const & A, // OUTPUT KN *const & B, KN *const & C, // INPUTS KN *const & D) { int nn = A->N(); // get number of nodes cout << "nn: " << nn << endl; for(int i=0; i *const & A, // OUTPUT KN *const & B, KN *const & C, // INPUTS KN *const & D, KN *const & E) { int nn = A->N(); // get number of nodes cout << "nn: " << nn << endl; for(int i=0; i *const & A, // OUTPUT KN *const & B, KN *const & C, // INPUTS KN *const & D, KN *const & E, KN *const & F) { int nn = A->N(); // get number of nodes cout << "nn: " << nn << endl; for(int i=0; i *const & A, // OUTPUT KN *const & B, KN *const & C, // INPUTS KN *const & D, KN *const & E, KN *const & F, KN *const & G) { int nn = A->N(); // get number of nodes cout << "nn: " << nn << endl; for(int i=0; i *const & A, // OUTPUT KN *const & B, KN *const & C, // INPUTS KN *const & D, KN *const & E, KN *const & F, KN *const & G, KN *const & H) { int nn = A->N(); // get number of nodes cout << "nn: " << nn << endl; for(int i=0; i(funcs1)); Global.Add("funcs2","(",new OneOperator2s_(funcs2)); Global.Add("funcs3","(",new OneOperator3s_(funcs3)); Global.Add("CppModTemplate3","(",new OneOperator3_*, KN*, KN*>(CppModTemplate3)); Global.Add("CppModTemplate4","(",new OneOperator4_*, KN*, KN*, KN*>(CppModTemplate4)); Global.Add("CppModTemplate5","(",new OneOperator5_*, KN*, KN*, KN*, KN*>(CppModTemplate5)); Global.Add("CppModTemplate6","(",new OneOperator6_*, KN*, KN*, KN*, KN*, KN*>(CppModTemplate6)); Global.Add("CppModTemplate7","(",new OneOperator7_*, KN*, KN*, KN*, KN*, KN*, KN*>(CppModTemplate7)); Global.Add("CppModTemplate8","(",new OneOperator8_*, KN*, KN*, KN*, KN*, KN*, KN*, KN*>(CppModTemplate8)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/funcTemplate.edp000644 000767 000024 00000002606 11435701373 021616 0ustar00hechtstaff000000 000000 load "funcTemplate" mesh Th=square(3,3); fespace Vh(Th,P1); Vh N; for(int i=0; i #include "RZ.h" #include "SortedList.h" using namespace std; /**************** Vertex ******************/ class Vertex : public R2 { //heritage is perhaps not totally justified here, but... sym2 m; int gen; //friend int main(int argc, const char * argv[]); //for Debug purposes public: Vertex():R2(),m(){}; Vertex(R2 u, int Gen, sym2 metric=sym2()) : R2(u), gen(Gen), m(metric) {} Vertex(R2 u, int Gen, const Metric2 &metric) : R2(u), gen(Gen), m(metric(u)) {} const sym2 & getm() const {return m;} int getGen() const {return gen;} sym3 homogeneousDistance() const {const R2 a(*this); const R2 ma=m*a; const double ama=a.scal(ma); return sym3(m.xx, m.yy, ama, m.xy, -ma.y, -ma.x);} double dist2(const R2 &P) const {return m.norm2(*this-P);} }; /*inline ostream& operator<<(ostream &f, const Vertex &u){f<next;} bool cut(Vertex const *start, Vertex const *end, Edge *oldSister, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, vector & aligned); //friend int main(int argc, const char * argv[]); //for Debug purposes #ifdef _FLAGGED_BOUNDARY_ int onBoundary_; #endif public: Edge():u(NULL),v(NULL),next(NULL),sister(NULL){}; #ifdef _FLAGGED_BOUNDARY_ Edge(Vertex const *U, Vertex const *V, Edge *S, Edge *N, int OnBoundary_=0):u(U),v(V),sister(S),next(N),onBoundary_(OnBoundary_){}; int onBoundary() const {return onBoundary_;} //{if(sister!=NULL) return 0; if(onBoundary_>0) return onBoundary_; return 10;} #else Edge(Vertex const *U, Vertex const *V, Edge *S, Edge *N):u(U),v(V),next(N),sister(S){}; bool onBoundary() const {return sister==NULL;} #endif inline bool flipable() const; inline double flipGain() const ; //gain brought by a flip in terms of square cosine inline bool flip(); inline bool flip(Edge * affected[4]); inline bool flip_resolve(); Vertex const * getu() const {return u;} Vertex const * getv() const {return v;} R2 vec() const {return *v-*u;} //R2(v->x - u->x, v->y - u->y) // R2 midPoint(){return R2((v->x + u->x)/2, (v->y + u->y)/2);} // R2 bary() const {if(sister==NULL) return (*u+*v)/2; return (*u +*v +*next->v +*sister->next->v)/4;} bool isRepresentative() const {return (sister==NULL) || (u->x < v->x) || (u->x == v->x && u->y < v->y);} Edge * representative(){return isRepresentative() ? this : sister;} bool isRepresentative3() const {R2 v=vec(); return vvec() && vvec();} bool isRepresentative3(Vertex const *triangle[3]) const {triangle[0]=u; triangle[1]=v; triangle[2]=next->v; return isRepresentative3();} enum refinement_priority {selected_edge_first, newest_vertex_first, euclidean_longest_edge_first}; Edge * which_first(refinement_priority priority); //refine splits the edge and returns a pointer to the other half of the splitted edge //bool newestVertexFirst=true Edge * refine(Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, refinement_priority priority); //splits associated triangle if larger than size h/sqrt(smallEigenVal) (metric taken at the worst point on the triangle). Non recursive. bool hRefine3(double h, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, refinement_priority priority); //splits the edge if its length in the metric (taken at the worst point on the edge) is larger than h. Edge * hRefine2(double h, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, safe_vector *recursive=NULL, bool exaggerate=false); bool check() const; Edge * getNext() const {return next;} Edge * getSister() const {return sister;} bool cut(Vertex const *start, Vertex const *end, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, vector & aligned); Vertex *intersect(Vertex const *start, Vertex const *end, Tab &VertexAllocator, const Metric2 &metric); }; inline ostream& operator<<(ostream &f, const Edge &e){f<next==NULL) cout<<"Edge::check : Missing edge connections"; else if(next->next->next!=this) cout<<"Edge::check : not a triangle"; else if(next->u!=v) cout<<"Edge::check : invalid next edge (next->u!=v)"; else if(sister!=NULL && sister->u!=v) cout<<"Edge::check : invalid sister edge"; // else if(sister!=NULL && refinable && !sister->refinable) cout<<"Edge::check : flag refinable inconsistent with sister edge"<vec())<0) cout<<"Edge::check : trigonometric order not respected"; #ifdef _FLAGGED_BOUNDARY_ else if(sister==NULL && onBoundary_==0) cout << "Edge::check : Interior edge without sister !" << endl; #endif else return true; coutMath << " " << *this << *next << *next->next << endl; return false; } inline bool Edge::flipable() const { return !onBoundary() && det(sister->prev()->vec(),next->vec())>0 && det(prev()->vec(),sister->next->vec())>0; } inline double Edge::flipGain() const { //edge is assumed to be flipable, hence angles are flip increases minimum angle. if(!flipable()) return 0; Vertex const *s=next->v; Vertex const *t=sister->next->v; const R2 uv=*v-*u, st=*t-*s, vs=*s-*v, su=*u-*s, ut=*t-*u, tv=*v-*t; const sym2 &mu=u->getm(), &mv=v->getm(), ms=s->getm(), mt=t->getm(); return min(min(min(-ms.cos(st,vs), ms.cos(st,su)), min(mt.cos(st,ut), -mt.cos(st,tv))),min(-mu.cos(su,ut),-mv.cos(tv,vs)))- min(min(min(-mu.cos(uv,su), mu.cos(uv,ut)), min(mv.cos(uv,tv), -mv.cos(uv,vs))),min(-ms.cos(vs,su),-mt.cos(ut,tv))); // max(max(mu.cos2(uv,su), mu.cos2(uv,ut)), max(mv.cos2(uv,tv), mv.cos2(uv,vs))) - // max(max(ms.cos2(st,vs), ms.cos2(st,su)), max(mt.cos2(st,ut), mt.cos2(st,tv))); } inline bool Edge::flip(){ if(sister==NULL) return false; //triangle inversion is unchecked Edge *e=this, *f=sister; Edge *ep=prev(), *fp=sister->prev(); Vertex const *u=ep->u; Vertex const *v=fp->u; e->u=u; e->v=v; f->u=v; f->v=u; e->next->next=e; f->next->next=f; ep->next=f->next; fp->next=e->next; e->next=fp; f->next=ep; return true; } inline bool Edge::flip(Edge * affected[4]){ //representatives of affected edges if(flip()){ affected[0]=next-> representative(); affected[1]=prev()-> representative(); affected[2]=sister->next-> representative(); affected[3]=sister->prev()->representative(); return true; } return false; } inline bool Edge::flip_resolve(){ if(flipGain()<=0) return false; Edge * affected[4]; flip(affected); for(int i=0; i<4; i++) affected[i]->flip_resolve(); return true; } /****************************************************/ class Triangulation { Tab vertices; Tab edges; friend int main(int argc, const char * argv[]); //for Debug purposes public: const Metric2 &metric; const Tab & getVertices() {return vertices;} const Tab & getEdges() {return edges;} int nv() const {return vertices.card();} int ne_oriented() const {return edges.card();} int nt() const {return ne_oriented()/3;} Triangulation(int N, const Metric2 &Metric); //basic NxN square triangulation //Triangulation(const Tab &Vertices, const Tab &Edges, sym2 (*Metric)(const R2&)=NULL, double Lip=5): vertices(Vertices), edges(Edges), metric(Metric), lip(Lip) {if(!check()) cout << "Invalid triangulation !" << endl; movie_init();} //pointer mismatch #ifdef FF___HPP_ Triangulation(const Fem2D::Mesh &Th, const Metric2 &Metric); #endif void Delaunay_ordered(const vector &toExclude); void Delaunay_ordered(){vector toExclude; toExclude.resize(ne_oriented()); Delaunay_ordered(toExclude);} void Delaunay_unordered(){for(int i=0; i & connectivity) const { int counter=0; for(int i=0; i #include #include using namespace std; #include "ff++.hpp" using namespace Fem2D; //#include namespace mir { #define _FLAGGED_BOUNDARY_ #include "Geometry.hpp" ostream_math coutMath= cout << Mathematica; template<> const string R2::name = "R2"; template<> const string Z2::name = "Z2"; template<> const R2 R2::NABiDim = R2(DBL_MAX,DBL_MAX); //NAN could be a better alternative, but equality tests become problematic, template<> const Z2 Z2::NABiDim = Z2(INT_MAX,INT_MAX); //and NAN does not exists for integers. template<> const string R3::name = "R3"; template<> const string Z3::name = "Z3"; #include "ExampleMetrics.h" Edge * Edge::refine(Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, refinement_priority priority){ Edge * const wf=which_first(priority); if(wf!=this) wf->refine(EdgeAllocator, VertexAllocator, metric, priority); if(sister!=NULL) { Edge * const swf=sister->which_first(priority); if(swf!=sister) swf->refine(EdgeAllocator, VertexAllocator, metric, priority); } Vertex const *w=next->v; Vertex *t=VertexAllocator.next(); const int newGen = 1+max(max(u->getGen(),v->getGen()),max(next->v->getGen(),sister==NULL ? -1 : sister->next->v->getGen())); *t=Vertex((*u+*v)/2,newGen,metric); Edge *const wt=EdgeAllocator.next(), *const tw=EdgeAllocator.next(), *const ut=EdgeAllocator.next(); *wt=Edge(w,t,tw,this); *tw=Edge(t,w,wt,prev()); #ifdef _FLAGGED_BOUNDARY_ *ut=Edge(u,t,NULL,tw,onBoundary()); #else *ut=Edge(u,t,NULL,tw); #endif u=t; prev()->next=ut; next->next=wt; if(sister==NULL) return ut; Vertex const *x=sister->next->v; Edge *xt=EdgeAllocator.next(), *tx=EdgeAllocator.next(), *vt=EdgeAllocator.next(); *xt=Edge(x,t,tx,sister); *tx=Edge(t,x,xt,sister->prev()); #ifdef _FLAGGED_BOUNDARY_ *vt=Edge(v,t,this,tx,onBoundary()); #else *vt=Edge(v,t,this,tx); #endif sister->u=t; sister->prev()->next=vt; sister->next->next=xt; ut->sister=sister; sister->sister=ut; sister=vt; return ut; } bool Edge::hRefine3(double h, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, refinement_priority priority){ Edge * const wf = which_first(priority); if(this!=wf) return wf->hRefine3(h,EdgeAllocator, VertexAllocator, metric, priority); const double maxLen=max(max(vec().norm(), next->vec().norm()),prev()->vec().norm()); R2 const *w=next->v; double minSize=sqrt(metric(*w).invNorm()); if(metric.lip==0){ if(h*minSize &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, safe_vector *recursive, bool exaggerate){ //in the case recursive=!NULL of a recursive split, the safe_vector recursive contains all newly created edges which are oriented like *this. const R2 Vec = vec(); sym2 m= metric(*u); if(exaggerate) m=m.exaggerate(); double minSize=1/m.norm(Vec); if(metric.lip==0){ if(h*minSize<1) { Edge *const e=refine(EdgeAllocator, VertexAllocator, metric, selected_edge_first); if(recursive){ hRefine2 (h, EdgeAllocator, VertexAllocator, metric, recursive, exaggerate); e->hRefine2(h, EdgeAllocator, VertexAllocator, metric, recursive, exaggerate); recursive->push_back(e); } return e; } return NULL; } //If the metric is not constant, it is sampled until resolution allows to make a sensible choice (based on lip constant). Smallest eigenvalue used only. //assert(lip>0); for(int pow=1; h*(minSize-metric.lip/(2*pow))<0.5; pow*=2){ // !!! condition should be checked for(int i=0; i<=pow; i++){ if(i%2==0) continue; m= metric((*u*i+*v*(pow-i))/pow); if(exaggerate) m=m.exaggerate(); minSize=min(minSize, 1/m.norm(Vec)); if(h*minSize<1) { Edge *const e=refine(EdgeAllocator, VertexAllocator, metric, selected_edge_first); if(recursive){ hRefine2 (h, EdgeAllocator, VertexAllocator, metric, recursive, exaggerate); e->hRefine2(h, EdgeAllocator, VertexAllocator, metric, recursive, exaggerate); recursive->push_back(e); } return e; } } } return NULL; } Edge * Edge::which_first(refinement_priority priority){ if(priority==selected_edge_first) return this; else if(priority==newest_vertex_first){ const int ugen=u->getGen(), vgen=v->getGen(), wgen=next->v->getGen(); return ugen>vgen ? (ugen>wgen ? next : this) : (vgen>wgen ? prev() : this); } else { //euclidean_longest_edge_first const double this_len=vec().norm(), next_len=next->vec().norm(), prev_len=prev()->vec().norm(); return next_len>prev_len ? (next_len>this_len ? next : this) : (prev_len>this_len ? prev() : this); } } bool Edge::cut(Vertex const *start, Vertex const *end, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2 &metric, vector & aligned){ //aligned collects created edges which are aligned with the cut if(start==v) return next->cut(start, end, EdgeAllocator, VertexAllocator, metric, aligned); //looking for the starting edge, in the wrong direction if(start==u){ //looking for the starting edge, in the good direction if(end==v) return false; const R2 se= *end-*start; Edge *currentEdge=this; double currentDet; double prevDet=-det(vec(),se); do { currentDet=-prevDet; prevDet=det(currentEdge->prev()->vec(),se); if(currentDet>0 && prevDet>0) return currentEdge->cut(start,end, NULL, EdgeAllocator, VertexAllocator, metric, aligned); currentEdge=currentEdge->prev()->sister; if(currentEdge==this) return false; } while(currentEdge!=NULL); currentEdge=this; currentDet=det(vec(),se); while (currentEdge->sister!=NULL) { currentEdge=currentEdge->sister->next; if(currentEdge==this) return false; prevDet=-currentDet; currentDet=det(currentEdge->vec(),se); if(currentDet>0 && prevDet>0) return currentEdge->cut(start,end, NULL, EdgeAllocator, VertexAllocator, metric, aligned); } } //cout << "hello" << endl; return false; // not supposed to happen } bool Edge::cut(Vertex const *start, Vertex const *end, Edge *oldSister, Tab &EdgeAllocator, Tab &VertexAllocator, const Metric2& metric, vector & aligned){ Vertex *t=next->intersect(start, end, VertexAllocator, metric); if(oldSister==NULL){ //Vertex *s=next->intersect(start, end, VertexAllocator, metric); if(t==NULL) return false; Edge *const tw=next; Edge *const wu=tw->next; Edge *const vt=EdgeAllocator.next(); Edge *const ut=EdgeAllocator.next(), *const tu=EdgeAllocator.next(); tw->u=t; wu->next=ut; *ut=Edge(u,t,tu,next); aligned.push_back(ut); *tu=Edge(t,u,ut,this); *vt=Edge(v,t,next->sister,tu); vt->sister->sister=vt; next=vt; return vt->sister->cut(start, end, tw, EdgeAllocator, VertexAllocator, metric, aligned); } Vertex const *const w=next->v; Vertex const *const s=sister->v; if(t!=NULL){ Edge *const tw=next; Edge *const wu=next->next; Edge *const ws=EdgeAllocator.next(); Edge *const sw=EdgeAllocator.next(); Edge *const st=EdgeAllocator.next(); Edge *const ts=EdgeAllocator.next(); Edge *const us=EdgeAllocator.next(); Edge *const vt=EdgeAllocator.next(); tw->u=t; tw->next=ws; wu->next=us; *ws=Edge(w,s,sw,st); *sw=Edge(s,w,ws,wu); *st=Edge(s,t,ts,tw); aligned.push_back(st); *ts=Edge(t,s,st,this); *us=Edge(u,s,oldSister,sw); oldSister->sister=us; *vt=Edge(v,t,tw->sister,ts); vt->sister->sister=vt; next=vt; u=s; return vt->sister->cut(start, end, tw, EdgeAllocator, VertexAllocator, metric, aligned); } t=next->next->intersect(start, end, VertexAllocator, metric); if(t!=NULL){ Edge *const vw=next; Edge *const tu=next->next; Edge *const sw=EdgeAllocator.next(); Edge *const ws=EdgeAllocator.next(); Edge *const ts=EdgeAllocator.next(); Edge *const st=EdgeAllocator.next(); Edge *const us=EdgeAllocator.next(); Edge *const wt=EdgeAllocator.next(); vw->next=ws; tu->u=t; tu->next=us; *sw=Edge(s,w,ws,wt); *ws=Edge(w,s,sw,this); *ts=Edge(t,s,st,sw); *st=Edge(s,t,ts,tu); aligned.push_back(st); *us=Edge(u,s,oldSister,st); oldSister->sister=us; *wt=Edge(w,t,tu->sister,ts); wt->sister->sister=wt; u=s; return wt->sister->cut(start, end, tu, EdgeAllocator, VertexAllocator, metric, aligned); } if(w==end){// last bisected edge Edge *const vw=next; Edge *const wu=next->next; Edge *const us=EdgeAllocator.next(); Edge *const sw=EdgeAllocator.next(); Edge *ws=EdgeAllocator.next(); vw->next=ws; wu->next=us; *us=Edge(u,s,oldSister,sw); oldSister->sister=us; *sw=Edge(s,w,ws,wu); aligned.push_back(sw); *ws=Edge(w,s,sw,this); u=s; return true; } return false; } Vertex * Edge::intersect(Vertex const *start, Vertex const *end, Tab &VertexAllocator, const Metric2 &metric){ if(start==end || start==u || start ==v || end ==u || end ==v || u==v) return NULL; const R2 es=*start-*end, uv=vec(); const R2 diff=(*end+*start)-(*v+*u); if(det(uv,es)==0) return NULL; const R2 coef=diff.lin_solve(uv, es); if(coef.x <=-1 || coef.x>=1 || coef.y<=-1 || coef.y>=1 || coef==R2::NABiDim) return NULL; *VertexAllocator.next()=Vertex(*u*(1-coef.x)/2+*v*(1+coef.x)/2, 1+max(u->getGen(),v->getGen()), metric); return &VertexAllocator[VertexAllocator.max_accessed_pos]; } ostream_math operator << (ostream_math f, Edge *e){if(e!=NULL) return f << *e; return f; } //<<"{{},{}}"; Triangulation::Triangulation(int N, const Metric2 &Metric): metric(Metric){ for(int i=0; i<=N; i++) for(int j=0; j<=N; j++) vertices[i+(N+1)*j]=Vertex(R2(i/double(N), j/double(N)), abs(N-i-j), metric); for(int i=0; i0? &edges[6*(index-N)+3] : NULL, &edges[6*index+1], j ==0 ? 1 : 0); edges[6*index+1]=Edge(&vertices[i+1+(N+1)*j], &vertices[i +(N+1)*(j+1)], &edges[6*index +4], &edges[6*index+2]); edges[6*index+2]=Edge(&vertices[i +(N+1)*(j+1)], &vertices[i +(N+1)*j] , i>0? &edges[6*(index-1)+5] : NULL, &edges[6*index+0], i ==0 ? 4 : 0); edges[6*index+3]=Edge(&vertices[i+1+(N+1)*(j+1)], &vertices[i +(N+1)*(j+1)], j+10? &edges[6*(index-N)+3] : NULL, &edges[6*index+1]); edges[6*index+1]=Edge(&vertices[i+1+(N+1)*j], &vertices[i +(N+1)*(j+1)], &edges[6*index +4], &edges[6*index+2]); edges[6*index+2]=Edge(&vertices[i +(N+1)*(j+1)], &vertices[i +(N+1)*j] , i>0? &edges[6*(index-1)+5] : NULL, &edges[6*index+0]); edges[6*index+3]=Edge(&vertices[i+1+(N+1)*(j+1)], &vertices[i +(N+1)*(j+1)], j+1 &toExclude){ vector gains; gains.resize(ne_oriented()); SortedList toFlip; for(int i=0; i0) toFlip.insert(RZ(gain,i)); } while(toFlip.Card()>0){ const RZ current=toFlip.pop(); Edge * affected[4]; if(!edges[current.number].flip(affected)) continue; movie_frame(); for(int i=0; i<4; i++){ const int index = edges.index(affected[i]); if(gains[index]>0) toFlip.remove(RZ(gains[index],index)); const double gain= toExclude[index] ? 0 : edges[index].flipGain(); gains[index]=gain; if(gain>0) toFlip.insert(RZ(gain,index)); } } } void Triangulation::hRefineQA(double h, unsigned int flag, Edge::refinement_priority priority){ if(h<=0) return; if(!(flag & hRQA_noIsoRef)) hRefine(h, priority); const bool exportIntermediateData = flag & hRQA_exportIntermediateData; const bool finalRefine = flag & hRQA_finalRefine; //const double ratio=0.5; //over_refinement of the extremal half edges. Replaced with an exageration of the metric. if(exportIntermediateData){ vertices.export_content("vertices_iso.txt"); Tab connectivity; Connectivity(connectivity); connectivity.export_content("connectivity_iso.txt"); } //collecting the extremal edges associated to each vertex. const int nv_iso=nv(); const int ne_iso=ne_oriented(); cout << "Triangulation::hRefineQA : Intermediate isotropic triangulation contains " << nt() << " triangles" << endl; double *minDet= new double [nv_iso](); //set to zero double *maxDet= new double [nv_iso](); Edge **minEdge= new Edge *[nv_iso](); Edge **maxEdge= new Edge *[nv_iso](); R2 *eigenVec= new R2[nv_iso]; for(int i=0; iisRepresentative()) continue; R2 vec=e->vec(); vec/=vec.norm(); for(int j=0; j<=1; j++){ const int index = vertices.index(j==0 ? e->getu() : e->getv()); const double currentDet = det(vec,eigenVec[index])*(1-2*j); if (currentDetmaxDet[index]) {maxDet[index]=currentDet; maxEdge[index]=e;} } } delete minDet; delete maxDet; delete eigenVec; //refining these edges Tab halfEdges; Tab endVertex; safe_vector toExcludePtr; //these edges should be excluded from the flipping process for(int i=0; iisRepresentative()) continue; const int indexu = vertices.index(e->getu()), indexv = vertices.index(e->getv()); bool extru= (e==minEdge[indexu]) || (e==maxEdge[indexu]); bool extrv= (e==minEdge[indexv]) || (e==maxEdge[indexv]); if(!extru && !extrv) continue; Edge *const f=e->hRefine2(h, edges, vertices, metric, NULL); //non recursive split. if(f==NULL) continue; const int indexw=vertices.max_accessed_pos; //index of the mid point between u and v that was just created if(exportIntermediateData){ if(extru) *halfEdges.next()=*f; if(extrv) *halfEdges.next()=*e; } if(finalRefine){ if(extru && !extrv) endVertex[indexw]=indexv+1; // "+1" required to distinguish from values initialized to zero if(extrv && !extru) endVertex[indexw]=indexu+1; } if(extru) {//recursive split, exaggerate //*ratio f->hRefine2(h, edges, vertices, metric, &toExcludePtr, true); toExcludePtr.push_back(f); } if(extrv) { e->hRefine2(h, edges, vertices, metric, &toExcludePtr, true); toExcludePtr.push_back(e); } //Note : in the theoretical algorithm, the edge is split in 3, and the midpart is refined if extru || extrv movie_frame(); } delete minEdge; delete maxEdge; if(exportIntermediateData) {halfEdges.export_content("halfEdges.txt"); edges.export_content("edgesBeforeDelaunay.txt");} cout << "Triangulation::hRefineQA : Intermediate anisotropic triangulation contains " << nt() << " triangles."<< endl; vector toExclude; toExclude.resize(ne_oriented()); for(vector::const_iterator e=toExcludePtr.begin(); e!=toExcludePtr.end(); ++e) if(!(*e)->onBoundary()) {toExclude[edges.index(*e)]=true; toExclude[edges.index((*e)->getSister())]=true;} //boundary edges are fixed anyway toExcludePtr.clear(); /* for(int i=0; ionBoundary()) toExclude[edges.index(e->getSister())]=true; }*/ if(movie_name.size()>0) cout << "Beginning main flip. Movie frame : " << movie_frame_number; Delaunay_ordered(toExclude); if(movie_name.size()>0) cout << "; Finishing : " << movie_frame_number << endl; if(finalRefine) { for(int i=0; igetu()); if(endVertex[indexw]>0){ e->cut(e->getu(), &vertices[endVertex[indexw]-1], edges, vertices, metric, toExcludePtr); endVertex[indexw]=0; movie_frame(); } } cout << "Triangulation::hRefineQA : Triangulation contains " << nt() << " triangles after optional refinement (which eliminates the remaining large angles.)"<< endl; } //return; //now taking care of the boundary for(int i=0; i::const_iterator e=toExcludePtr.begin(); e!=toExcludePtr.end(); ++e) if(!(*e)->onBoundary()) {toExclude[edges.index(*e)]=true; toExclude[edges.index((*e)->getSister())]=true;} //boundary edges are fixed anyway Delaunay_ordered(toExclude); cout << "Triangulation::hRefineQA : Final triangulation contains " << nt() << " triangles after refinement of the boundary."<< endl; } Fem2D::Mesh * Triangulation::export_to_Mesh() const { typedef Fem2D::Triangle FFT; typedef Fem2D::Vertex FFV; using Fem2D::R2; typedef Fem2D::BoundaryEdge FFBE; using Fem2D::Mesh; using namespace Fem2D; // using Fem2D::R; vectoronBoundary; onBoundary.resize(nv()); int boundaryEdges=0; for(int i=0; ix=vertices[i].x; vv->y=vertices[i].y; vv->lab = onBoundary[i] ; vv++; } // generation des triangles FFT *tt= t; int nberr=0; Vertex const *triangle[3]; for(int i=0; ionBoundary; onBoundary.resize(nv()); int boundaryEdges=0; for(int i=0; i,int> BorderElementLabels; for(int i=0; i(ui,vi)] = label; BorderElementLabels[pair(vi,ui)] = label; } for(int i=0; i,int>::iterator it=BorderElementLabels.find(pair(ui,vi)); const int label = (it==BorderElementLabels.end()) ? 0 : it->second; edges[3*i+j]=Edge(&vertices[ui], &vertices[vi], sister, &edges[3*i+(j+1)%3], label); #else edges[3*i+j]=Edge(&vertices[Th(i,(j+1)%3)], &vertices[Th(i,(j+2)%3)], i==ip ? NULL : &edges[3*ip+jp], &edges[3*i+(j+1)%3]); #endif } } #endif } // end namespace std freefem++-3.38-1/examples++-load/glumesh3D.edp000755 000767 000024 00000002311 12130607024 021005 0ustar00hechtstaff000000 000000 load "msh3" real x0=-1.,x1=-0.5; real y0=-0.5,y1=0.5; mesh Th1=square(5,8,[x0+(x1-x0)*x,y0+(y1-y0)*y]); x0=-0.5; x1=-0.1; y0=-1; y1=1; mesh Th2=square(10,16,[x0+(x1-x0)*x,y0+(y1-y0)*y]); int[int] r1=[2,0], r2=[4,0]; Th1=change(Th1,label=r1); Th2=change(Th2,label=r2); plot( Th1, Th2, wait=1 ); verbosity=2; cout << "================" << endl; cout << " gluing mesh " << endl; mesh Th2D=Th1+Th2; cout << "Vertex, Triangle, Border " << Th2D.nv << " "<< Th2D.nt << " " << endl; //plot( Th2D, wait=1 ); savemesh( Th2D, "glu2D.mesh"); func zmin=0.; func zmax=1.; int MaxLayer=10; mesh3 Th31=buildlayers(Th1,MaxLayer,zbound=[zmin,zmax]); savemesh( Th31, "bl31.mesh"); mesh3 Th32=buildlayers(Th2,MaxLayer,zbound=[zmin,zmax]); savemesh( Th32, "bl32.mesh"); mesh3 Tht=Th31+Th32; savemesh( Tht, "glu3D.mesh"); cout << "Vertex, Tet, Triangle " << Tht.nv << " "<< Tht.nt << " " << Tht.nbe << endl; cout << "area border = " << int2d(Tht)(1.) << endl; verbosity =3; Tht = change(Tht,rmInternalFaces=1); cout << "area border = " << int2d(Tht)(1.) <BuildBound(); // Th3_t->BuildAdj(); // Th3_t->Buildbnormalv(); // Th3_t->BuildjElementConteningVertex(); // is now in the constructor of Mesh3 to be consistante. // // Vincent HUBER - vincent.huber@cemosis.fr October 2014 // manage verbosity levels // #include "ff++.hpp" using namespace Fem2D; // Table of number of vertex for an element type of gmsh static const int nvElemGmsh[30] = { 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // we considerer only edges, triangles and tetrahedrons in Freefem++ // 15 :: Vertex Corner // 1 :: Edge/line // 2 :: triangles // 4 :: tetrahedrons void SwapBytes(char *array, int size, int n) { char *x = new char[size]; for(int i = 0; i < n; i++) { char *a = &array[i * size]; memcpy(x, a, size); for(int c = 0; c < size; c++) a[size - 1 - c] = x[c]; } delete [] x; } class GMSH_LoadMesh_Op : public E_F0mps { public: Expression filename; static const int n_name_param = 2; // static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; public: GMSH_LoadMesh_Op(const basicAC_F0 & args,Expression ffname) : filename(ffname) { if(verbosity>1) cout << "Load mesh given by GMSH " << endl; args.SetNameParam(n_name_param,name_param,nargs); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type GMSH_LoadMesh_Op::name_param[]= { { "reftri", &typeid(long)}, { "renum", &typeid(long)} }; class GMSH_LoadMesh : public OneOperator { public: GMSH_LoadMesh() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new GMSH_LoadMesh_Op( args,t[0]->CastTo(args[0]) ); } }; Mesh * GMSH_Load(const string & filename) { // variable freefem++ int nv, nt=0, nbe=0; Mesh::Vertex *vff; map mapnumv; // loading mesh and reading mesh in gmsh are in the file GModelIO_Mesh.cpp (directory Geo) char str[256] = "ZZZ"; double version = 2.0; bool binary = false, swap = false, postpro = false; FILE *fp = fopen(filename.c_str(), "rb"); if(!fp){ cerr << "Unable to open file " << filename.c_str() << endl; exit(1); } while( !feof(fp) ){ fgets(str, sizeof(str), fp); if( str[0] == '$'){ if(!strncmp(&str[1], "MeshFormat", 10)) { if(!fgets(str, sizeof(str), fp)) exit(1); int format, size; if(sscanf(str, "%lf %d %d", &version, &format, &size) != 3) exit(1); if(verbosity>1) cout << "Mesh Format is " << format << endl; if(format){ binary = true; if(verbosity>2) cout << "Mesh is in binary format" << endl; int one; if(fread(&one, sizeof(int), 1, fp) != 1) exit(1); if(one != 1){ swap = true; if(verbosity>2) cout << "Swapping bytes from binary file" << endl; } } } else if(!strncmp(&str[1], "PhysicalNames", 13)) { if(verbosity>0) cout << " PhysicalNames is not considered in freefem++ " << endl; } else if(!strncmp(&str[1], "NO", 2) || !strncmp(&str[1], "Nodes", 5) || !strncmp(&str[1], "ParametricNodes", 15)) { const bool parametric = !strncmp(&str[1], "ParametricNodes", 15); if( parametric == true ){ cerr << " ParametricNodes is not considered yet in freefem++" << endl; exit(1); } if(!fgets(str, sizeof(str), fp)) exit(1); if(sscanf(str, "%d", &nv) != 1) exit(1); printf("%d vertices\n", nv); // local variables freefem++ vff = new Mesh::Vertex[nv]; int minVertex = nv + 1, maxVertex = -1; for(int i = 0; i < nv; i++) { int num; double xyz[3], uv[2]; //if (!parametric){ if(!binary){ if (fscanf(fp, "%d %lf %lf %lf", &num, &xyz[0], &xyz[1], &xyz[2]) != 4) exit(1); } else{ if(fread(&num, sizeof(int), 1, fp) != 1) exit(1); if(swap) SwapBytes((char*)&num, sizeof(int), 1); if(fread(xyz, sizeof(double), 3, fp) != 3) exit(1); if(swap) SwapBytes((char*)xyz, sizeof(double), 3); } assert( abs(xyz[2]) < 1.e-7); vff[i].x = xyz[0]; vff[i].y = xyz[1]; vff[i].lab = 1; mapnumv[num] = i; } } else if(!strncmp(&str[1], "ELM", 3) || !strncmp(&str[1], "Elements", 8)) { if(!fgets(str, sizeof(str), fp)) exit(1); int numElements; sscanf(str, "%d", &numElements); if(verbosity>2) cout << "Loading elements\n" << endl; if(!binary){ for(int i = 0; i < numElements; i++) { int num, type, physical = 0, elementary = 0, partition = 0, numVertices; if(version <= 1.0){ fscanf(fp, "%d %d %d %d %d", &num, &type, &physical, &elementary, &numVertices); } else{ int numTags; fscanf(fp, "%d %d %d", &num, &type, &numTags); for(int j = 0; j < numTags; j++){ int tag; fscanf(fp, "%d", &tag); if(j == 0) physical = tag; else if(j == 1) elementary = tag; else if(j == 2) partition = tag; // ignore any other tags for now } assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } } if( type == 1 ) nbe++; if( type == 2 ) nt++; if( type == 4 ){ cout << "We are loading a two dimensionnal mesh " << endl; exit(1); } int indices[60]; for(int j = 0; j < numVertices; j++) fscanf(fp, "%d", &indices[j]); } } else{ int numElementsPartial = 0; while(numElementsPartial < numElements){ int header[3]; if( fread(header, sizeof(int), 3, fp) != 3 ) exit(1); if(swap) SwapBytes((char*)header, sizeof(int), 3); int type = header[0]; int numElms = header[1]; int numTags = header[2]; int numVertices; assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } unsigned int n = 1 + numTags + numVertices; int *data = new int[n]; for(int i = 0; i < numElms; i++) { if(fread(data, sizeof(int), n, fp) != n) exit(1); if(swap) SwapBytes((char*)data, sizeof(int), n); int num = data[0]; int physical = (numTags > 0) ? data[4 - numTags] : 0; int elementary = (numTags > 1) ? data[4 - numTags + 1] : 0; int partition = (numTags > 2) ? data[4 - numTags + 2] : 0; int *indices = &data[numTags + 1]; if( type == 1 ) nbe++; if( type == 2 ) nt++; if( type == 4 ){ cout << "We are loading a two dimensionnal mesh " << endl; exit(1); } } delete [] data; numElementsPartial += numElms; } } break; } } } fclose(fp); Mesh::Triangle *tff = new Mesh::Triangle[nt]; Mesh::Triangle *ttff = tff; Mesh::BorderElement *bff = new Mesh::BorderElement[nbe]; Mesh::BorderElement *bbff = bff; // second reading fp = fopen(filename.c_str(), "rb"); while( !feof(fp) ){ fgets(str, sizeof(str), fp); if( str[0] == '$'){ if(!strncmp(&str[1], "ELM", 3) || !strncmp(&str[1], "Elements", 8)) { if(!fgets(str, sizeof(str), fp)) exit(1); int numElements; sscanf(str, "%d", &numElements); if(!binary){ int ie=0; int it=0; for(int i = 0; i < numElements; i++) { int num, type, physical = 0, elementary = 0, partition = 0, numVertices; if(version <= 1.0){ fscanf(fp, "%d %d %d %d %d", &num, &type, &physical, &elementary, &numVertices); } else{ int numTags; fscanf(fp, "%d %d %d", &num, &type, &numTags); for(int j = 0; j < numTags; j++){ int tag; fscanf(fp, "%d", &tag); if(j == 0) physical = tag; else if(j == 1) elementary = tag; else if(j == 2) partition = tag; // ignore any other tags for now } assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } } int indices[60]; for(int j = 0; j < numVertices; j++) fscanf(fp, "%d", &indices[j]); if( type == 1 ){ int iv0,iv1; iv0 = mapnumv[ indices[0] ]; iv1 = mapnumv[ indices[1] ]; if(verbosity>2) cout << "Elem " << ie+1 << " " << iv0+1 << " " << iv1+1 << endl; (bbff++)->set(vff, iv0, iv1, physical); ie++; } if( type == 2 ){ int iv0,iv1,iv2; iv0 = mapnumv[ indices[0] ]; iv1 = mapnumv[ indices[1] ]; iv2 = mapnumv[ indices[2] ]; if(verbosity>2) cout << "Triangles " << it+1 << " " << iv0+1 << " " << iv1+1 << " " << iv2+1 << endl; (ttff++)->set(vff, iv0, iv1, iv2, physical); if(verbosity>2) cout << "mes=" << tff[it].area << endl; if( tff[it].area < 1e-8 ){ cout << "bug : mes < 1e-8 !" << endl; exit(1); } it++; } } assert(it==nt); assert(ie==nbe); } else{ int ie=0; int it=0; int numElementsPartial = 0; while(numElementsPartial < numElements){ int header[3]; if( fread(header, sizeof(int), 3, fp) != 3 ) exit(1); if(swap) SwapBytes((char*)header, sizeof(int), 3); int type = header[0]; int numElms = header[1]; int numTags = header[2]; int numVertices; assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } unsigned int n = 1 + numTags + numVertices; int *data = new int[n]; for(int i = 0; i < numElms; i++) { if(fread(data, sizeof(int), n, fp) != n) exit(1); if(swap) SwapBytes((char*)data, sizeof(int), n); int num = data[0]; int physical = (numTags > 0) ? data[4 - numTags] : 0; int elementary = (numTags > 1) ? data[4 - numTags + 1] : 0; int partition = (numTags > 2) ? data[4 - numTags + 2] : 0; int *indices = &data[numTags + 1]; if( type == 1 ){ int iv0,iv1; iv0 = mapnumv[ indices[0] ]; iv1 = mapnumv[ indices[1] ]; (bbff++)->set(vff, iv0, iv1, physical); ie++; } if( type == 2 ){ double mes=-1; int iv0,iv1,iv2; iv0 = mapnumv[ indices[0] ]; iv1 = mapnumv[ indices[1] ]; iv2 = mapnumv[ indices[2] ]; (ttff++)->set(vff, iv0, iv1, iv2, physical,mes); it++; } } delete [] data; numElementsPartial += numElms; } assert(it==nt); assert(ie==nbe); } } else if(!strncmp(&str[1], "NodeData", 8)) { if(verbosity>1) cout << " NodeData is not considered in freefem++ " << endl; } else if(!strncmp(&str[1], "ElementData", 11) || !strncmp(&str[1], "ElementNodeData", 15)){ if(verbosity>1) cout << " ElementData/ElementNodeData is not considered in freefem++ " << endl; } } } fclose(fp); Mesh *pTh = new Mesh(nv,nt,nbe,vff,tff,bff); R2 Pn,Px; pTh->BoundingBox(Pn,Px); if(!pTh->quadtree) pTh->quadtree=new Fem2D::FQuadTree(pTh,Pn,Px,pTh->nv); return pTh; } AnyType GMSH_LoadMesh_Op::operator()(Stack stack) const { string * pffname= GetAny((*filename)(stack)); int renumsurf = 0; if( nargs[1] ) renumsurf = GetAny( (*nargs[1])(stack) ); assert( renumsurf <=1 && renumsurf >= 0); Mesh * Th = GMSH_Load( *pffname ); Add2StackOfPtr2FreeRC(stack,Th); return Th; } // Load three dimensionnal mesh class GMSH_LoadMesh3_Op : public E_F0mps { public: Expression filename; static const int n_name_param = 2; // static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; public: GMSH_LoadMesh3_Op(const basicAC_F0 & args,Expression ffname) : filename(ffname) { if(verbosity>1) cout << "Load mesh given by GMSH " << endl; args.SetNameParam(n_name_param,name_param,nargs); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type GMSH_LoadMesh3_Op::name_param[]= { { "reftet", &typeid(long)}, { "renum", &typeid(long)} }; class GMSH_LoadMesh3 : public OneOperator { public: GMSH_LoadMesh3() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new GMSH_LoadMesh3_Op( args,t[0]->CastTo(args[0]) ); } }; Mesh3 * GMSH_Load3(const string & filename) { // variable freefem++ int nv, nt=0, nbe=0; Vertex3 *vff; map mapnumv; // loading mesh and reading mesh in gmsh are in the file GModelIO_Mesh.cpp (directory Geo) char str[256] = "ZZZ"; double version = 2.0; bool binary = false, swap = false, postpro = false; FILE *fp = fopen(filename.c_str(), "rb"); if(!fp){ cerr << "Unable to open file " << filename.c_str() << endl; exit(1); } while( !feof(fp) ){ fgets(str, sizeof(str), fp); if( str[0] == '$'){ if(!strncmp(&str[1], "MeshFormat", 10)) { if(!fgets(str, sizeof(str), fp)) exit(1); int format, size; if(sscanf(str, "%lf %d %d", &version, &format, &size) != 3) exit(1); if(format){ binary = true; if(verbosity>1) cout << "Mesh is in binary format" << endl; int one; if(fread(&one, sizeof(int), 1, fp) != 1) exit(1); if(one != 1){ swap = true; if(verbosity>1) cout << "Swapping bytes from binary file" << endl; } } } else if(!strncmp(&str[1], "PhysicalNames", 13)) { if(verbosity>1) cout << " PhysicalNames is not considered in freefem++ " << endl; } else if(!strncmp(&str[1], "NO", 2) || !strncmp(&str[1], "Nodes", 5) || !strncmp(&str[1], "ParametricNodes", 15)) { const bool parametric = !strncmp(&str[1], "ParametricNodes", 15); if( parametric == true ){ cerr << " ParametricNodes is not considered yet in freefem++" << endl; exit(1); } if(!fgets(str, sizeof(str), fp)) exit(1); if(sscanf(str, "%d", &nv) != 1) exit(1); printf("%d vertices\n", nv); // local variables freefem++ vff = new Vertex3[nv]; //map mapnumv; int minVertex = nv + 1, maxVertex = -1; for(int i = 0; i < nv; i++) { int num; double xyz[3], uv[2]; //if (!parametric){ if(!binary){ if (fscanf(fp, "%d %lf %lf %lf", &num, &xyz[0], &xyz[1], &xyz[2]) != 4) exit(1); } else{ if(fread(&num, sizeof(int), 1, fp) != 1) exit(1); if(swap) SwapBytes((char*)&num, sizeof(int), 1); if(fread(xyz, sizeof(double), 3, fp) != 3) exit(1); if(swap) SwapBytes((char*)xyz, sizeof(double), 3); } vff[i].x = xyz[0]; vff[i].y = xyz[1]; vff[i].z = xyz[2]; vff[i].lab = 1; mapnumv[num] = i; } } else if(!strncmp(&str[1], "ELM", 3) || !strncmp(&str[1], "Elements", 8)) { if(!fgets(str, sizeof(str), fp)) exit(1); int numElements; sscanf(str, "%d", &numElements); if(!binary){ for(int i = 0; i < numElements; i++) { int num, type, physical = 0, elementary = 0, partition = 0, numVertices; if(version <= 1.0) { fscanf(fp, "%d %d %d %d %d", &num, &type, &physical, &elementary, &numVertices); } else{ int numTags; fscanf(fp, "%d %d %d", &num, &type, &numTags); for(int j = 0; j < numTags; j++){ int tag; fscanf(fp, "%d", &tag); if(j == 0) physical = tag; else if(j == 1) elementary = tag; else if(j == 2) partition = tag; // ignore any other tags for now } assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } } if( type == 1 ){ if(i==0) if(verbosity>0) cout << "edges in 3D mesh are not considered yet in freefem++, skeep data" << endl; } if( type == 2 ) nbe++; if( type == 4 ) nt++; int indices[60]; for(int j = 0; j < numVertices; j++) fscanf(fp, "%d", &indices[j]); } } else { int numElementsPartial = 0; while(numElementsPartial < numElements){ int header[3]; if( fread(header, sizeof(int), 3, fp) != 3 ) exit(1); if(swap) SwapBytes((char*)header, sizeof(int), 3); int type = header[0]; int numElms = header[1]; int numTags = header[2]; int numVertices; assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cout << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } unsigned int n = 1 + numTags + numVertices; int *data = new int[n]; for(int i = 0; i < numElms; i++) { if(fread(data, sizeof(int), n, fp) != n) exit(1); if(swap) SwapBytes((char*)data, sizeof(int), n); int num = data[0]; int physical = (numTags > 0) ? data[4 - numTags] : 0; int elementary = (numTags > 1) ? data[4 - numTags + 1] : 0; int partition = (numTags > 2) ? data[4 - numTags + 2] : 0; int *indices = &data[numTags + 1]; if( type == 1 && i==0 ){ cout << "edges in 3D mesh are not used in freefem++,skeep data" << endl; //exit(1); } if( type == 2 ) nbe++; if( type == 4 ) nt++; } delete [] data; numElementsPartial += numElms; } } break; } } } fclose(fp); if(verbosity>1) cout << "closing file " << nt << " " << nbe << endl; Tet *tff = new Tet[nt]; Tet *ttff = tff; Triangle3 *bff = new Triangle3[nbe]; Triangle3 *bbff = bff; // second reading fp = fopen(filename.c_str(), "rb"); while( !feof(fp) ){ fgets(str, sizeof(str), fp); if( str[0] == '$'){ if(!strncmp(&str[1], "ELM", 3) || !strncmp(&str[1], "Elements", 8)) { if(!fgets(str, sizeof(str), fp)) exit(1); int numElements; sscanf(str, "%d", &numElements); printf("%d tetrahedrons\n", nt); printf("%d triangles\n", nbe); printf("%d numElements\n", numElements); if(!binary){ int ie=0; int it=0; for(int i = 0; i < numElements; i++) { int num, type, physical = 0, elementary = 0, partition = 0, numVertices; if(version <= 1.0){ fscanf(fp, "%d %d %d %d %d", &num, &type, &physical, &elementary, &numVertices); } else{ int numTags; fscanf(fp, "%d %d %d", &num, &type, &numTags); for(int j = 0; j < numTags; j++){ int tag; fscanf(fp, "%d", &tag); if(j == 0) physical = tag; else if(j == 1) elementary = tag; else if(j == 2) partition = tag; // ignore any other tags for now } assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } } int indices[60]; for(int j = 0; j < numVertices; j++){ fscanf(fp, "%d", &indices[j]); } if( type == 2 ){ int ivff[3]; for(int ii=0; ii < numVertices; ii++){ ivff[ii] = mapnumv[ indices[ii] ]; assert( ivff[ii]>=0 && ivff[ii]< nv ); } (bbff++)->set(vff,ivff,physical); ie++; } if( type == 4 ){ int ivff[4]; for(int ii=0; ii < numVertices; ii++){ ivff[ii] = mapnumv[ indices[ii] ]; assert( ivff[ii]>=0 && ivff[ii]< nv ); } (ttff++)->set(vff,ivff,physical); it++; } } assert( it==nt ); assert( ie==nbe ); } else{ int ie=0; int it=0; int numElementsPartial = 0; while(numElementsPartial < numElements){ int header[3]; if( fread(header, sizeof(int), 3, fp) != 3 ) exit(1); if(swap) SwapBytes((char*)header, sizeof(int), 3); int type = header[0]; int numElms = header[1]; int numTags = header[2]; int numVertices; assert(type>=1 && type <=31); if( (numVertices = nvElemGmsh[type-1]) == 0){ cerr << "Element of type " << type << " is not considered in Freefem++" << endl; exit(1); } unsigned int n = 1 + numTags + numVertices; int *data = new int[n]; for(int i = 0; i < numElms; i++) { if(fread(data, sizeof(int), n, fp) != n) exit(1); if(swap) SwapBytes((char*)data, sizeof(int), n); int num = data[0]; int physical = (numTags > 0) ? data[4 - numTags] : 0; int elementary = (numTags > 1) ? data[4 - numTags + 1] : 0; int partition = (numTags > 2) ? data[4 - numTags + 2] : 0; int *indices = &data[numTags + 1]; if( type == 2 ){ int ivff[3]; for(int ii=0; ii < numVertices; ii++) ivff[ii] = mapnumv[ indices[ii] ]; (bbff++)->set(vff,ivff,physical); ie++; } if( type == 4 ){ int ivff[4]; for(int ii=0; ii < numVertices; ii++) ivff[ii] = mapnumv[ indices[ii] ]; (ttff++)->set(vff,ivff,physical); it++; } } delete [] data; numElementsPartial += numElms; } assert(it==nt); assert(ie==nbe); } } else if(!strncmp(&str[1], "NodeData", 8)) { if(verbosity) cout << " NodeData is not considered in freefem++ " << endl; } else if(!strncmp(&str[1], "ElementData", 11) || !strncmp(&str[1], "ElementNodeData", 15)){ if(verbosity) cout << " ElementData/ElementNodeData is not considered in freefem++ " << endl; } } } fclose(fp); if(nt==0){ Mesh3 *Th3 = new Mesh3(nv,nbe,vff,bff); return Th3; } else{ Mesh3 *Th3 = new Mesh3(nv,nt,nbe,vff,tff,bff); return Th3; } } AnyType GMSH_LoadMesh3_Op::operator()(Stack stack) const { string * pffname= GetAny((*filename)(stack)); int renumsurf = 0; if( nargs[1] ) renumsurf = GetAny( (*nargs[1])(stack) ); assert( renumsurf <=1 && renumsurf >= 0); Mesh3 * Th3_t = GMSH_Load3( *pffname); Th3_t->BuildGTree(); Add2StackOfPtr2FreeRC(stack,Th3_t); return Th3_t; } /* class Init1 { public: Init1(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ //if (verbosity) if(verbosity>1) cout << " load: gmsh " << endl; Global.Add("gmshload3","(",new GMSH_LoadMesh3); Global.Add("gmshload","(",new GMSH_LoadMesh); if(verbosity>1) cout << " load: gmsh " << endl; } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/gsl.awk000644 000767 000024 00000007340 12470422377 017772 0ustar00hechtstaff000000 000000 # egrep "^int|^double" /opt/local/include/gsl/gsl_sf* # egrep "^int|^double|^long" /usr/local/include/gsl/gsl_{cdf,randist,sf_*}.h | egrep -v ',$' # export LANG=C BEGIN {FS="[(),]"; FLOAD="gsl" LANG="C"; edp=FLOAD ".idp"; c="\""; pp=c "(" c; print " /* "; print "// file create: awk -f gsl.awk gsl_list > ff_gsl_awk.hpp " >edp print "load",c FLOAD c > edp print "gslrng ffrng;" >edp print " gslabortonerror=0; " >edp # convertion de type gsl .. ff++ Tff["double"]="double"; Tff["const double"]="double"; Tff["int"]="long"; Tff["const size_t"]="long"; Tff["unsigned int"]="long"; Tff["const int"]="long"; Tff["const unsigned int"]="long"; Tff["const double"]="double"; Tff["const gsl_rng *"] = "gsl_rng **"; Tff["gsl_mode_t"] = "long"; Cff["const gsl_rng *"] = "*"; V0["double"]= 0.55; V0["const double"]= 0.55; V0["const gsl_rng *"] = "ffrng"; } function f0(f) { xx=f;gsub("_","",xx) ; return xx }; function ff(f) { return c f0(f) c }; function VV(t) { if ( V0[t] !=0) return V0[t]; else return 0;} function ana1() { ok = 0; xx1=$1; nnn=split($1,xxx,":"); if(nnn == 2) xx1= xxx[2]; fonc=0; split(xx1,fff,"[ \t]*"); f=fff[2]; R=fff[1]; if( R=="int" || R =="double" ) ok=1; #print " xx: " xx1, R, f, ok ; } function anatype(kkk) { if( ok !=1) return 0; ; v0=1; t = ""; nnn=split($(kkk+1),fff,"[ \t]*"); i2 =1; while( i2( " f "__)); " cw = cw lw; cm = cm gg; v0 = VV(T[1]); print "cout << " c f "("v0") = " c " << " f0(f) "("v0") << endl; "> edp } } NF ==4 { ana1(); anatype(1); anatype(2); if( ok == 1) { ok==2; lw=""; lw = Tff[R] " " f "__(" Tff[T[1]] " const & x , " Tff[T[2]] " const & y )" \ "{ return " f "( (" T[1] ")" Cff[T[1]] " x , (" T[2] ")" Cff[T[2]] " y );}\n" ; gg = "\n Global.Add(" ff(f) "," pp ",new OneOperator2_<" Tff[R] "," Tff[T[1]] "," Tff[T[2]] ">( " f "__)); " cw = cw lw; cm = cm gg; v0 = VV(T[1]); v1 = VV(T[2]); print "cout << " c f "(" v0 ", "v1 ") = " c " << " f0(f) "(" v0 ",",v1 ") << endl; "> edp } } NF ==5 { ana1(); anatype(1); anatype(2); anatype(3); if( ok == 1) { ok==2; lw=""; lw = Tff[R] " " f "__(" Tff[T[1]] " const & x , " Tff[T[2]] " const & y , " Tff[T[3]] " const & z )" \ "{ return " f "( (" T[1] ")" Cff[T[1]] " x , (" T[2] ")" Cff[T[2]] " y , (" T[3] ")" Cff[T[3]] " z );}\n" ; gg = "\n Global.Add(" ff(f) "," pp ",new OneOperator3_<" Tff[R] "," Tff[T[1]] "," Tff[T[2]] "," Tff[T[3]] \ ">( " f "__)); "; cw = cw lw; cm = cm gg; v0 = VV(T[1]); v1 = VV(T[2]); v2 = VV(T[3]); print "cout << " c f "(" v0 "," v1 "," v2 ") = " c " << " f0(f) "(" v0 "," v1 "," v2 ") << endl; "> edp } } ok !=1 { print " missing:",NF," ", f , " -> " $0; } END { print " */ " print "/*****************/"; print "/*****************/"; print cw ; print "/*****************/"; print "/*****************/"; print " void init_gsl_sf() { \n" print cm ; print " } "; print "/*****************/"; print "/*****************/"; }freefem++-3.38-1/examples++-load/gsl.cpp000644 000767 000024 00000026556 12466661714 020011 0ustar00hechtstaff000000 000000 // Example C++ function "myfunction", dynamically loaded into "load.edp" // --------------------------------------------------------------------- // $Id$ //ff-c++-LIBRARY-dep: gsl //ff-c++-cpp-dep: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ff_gsl_awk.hpp" long gslpolysolvequadratic( KN_ a, KN_ x) { ffassert(a.N()>2 && x.N()>1); return gsl_poly_solve_quadratic (a[2],a[1],a[0],&(x[0]),&(x[1])); } long gslpolysolvecubic( KN_ a, KN_ x) { ffassert(a.N()>2 && x.N()>2); return gsl_poly_solve_cubic (a[2],a[1],a[0],&(x[0]),&(x[1]),&(x[2])); } long gslpolycomplexsolve( KN_ a, KN_ x) { int n = a.N(); ffassert( n-1 <= x.N()); KN z(n*2); gsl_poly_complex_workspace * w= gsl_poly_complex_workspace_alloc (n); int ok=gsl_poly_complex_solve (&a[0], n, w, &z[0]); gsl_poly_complex_workspace_free (w); for (long i = 0; i < n-1; i++) x[i] = Complex(z[2*i], z[2*i+1]); return ok; } // Ramdom part.. AnyType init_gsl_rng(Stack,const AnyType &x){ gsl_rng ** pp = PGetAny< gsl_rng *>(x); *pp = gsl_rng_alloc(gsl_rng_default) ; return x; }; AnyType delete_gsl_rng(Stack,const AnyType &x) { gsl_rng ** pp = PGetAny< gsl_rng *>(x); if(*pp) gsl_rng_free(*pp); *pp=0; return Nothing; }; gsl_rng ** init_gsl_rng_type( gsl_rng ** pp, const gsl_rng_type * g) { *pp = gsl_rng_alloc(g) ; return pp; } gsl_rng ** set_gsl_rng_type( gsl_rng ** pp, const gsl_rng_type * g) { if(*pp) gsl_rng_free(*pp); *pp = gsl_rng_alloc(g) ; return pp; } gsl_rng ** set_gsl_cpy( gsl_rng ** pp, gsl_rng ** gg) { if(*pp) gsl_rng_free(*pp); *pp = gsl_rng_clone(*gg); return pp; } double gslrnguniform( gsl_rng ** pr) { return gsl_rng_uniform(*pr);} double gslrnguniformpos( gsl_rng ** pr) { return gsl_rng_uniform_pos(*pr);} long gsl_rng_get(gsl_rng ** pr){ return gsl_rng_get(*pr);} long gsl_rng_min(gsl_rng ** pr){ return gsl_rng_min(*pr);} long gsl_rng_max(gsl_rng ** pr){ return gsl_rng_max(*pr);} long gsl_rng_set(gsl_rng ** pr, long s){ gsl_rng_set(*pr,s);return 0; } string * gsl_name(Stack s,const gsl_rng_type * const & pr) {return Add2StackOfPtr2Free(s,new string((*pr).name));} long ngslrng =0; long gslabort =1; static const gsl_rng_type ** gsl_rngpp; const gsl_rng_type * gslrngtype(long i) { ffassert(i >=0 && i < ngslrng); return gsl_rngpp[i]; } extern "C" { void ffhandler (const char * reason, const char * file, int line, int gsl_errno); } void ffhandler (const char * reason, const char * file, int line, int gsl_errno) { cerr << "\n GSL Error = " << reason << " in " <,KN_ >( gslpolysolvequadratic)); Global.Add("gslpolysolvecubic","(",new OneOperator2,KN_ >(gslpolysolvecubic)); Global.Add("gslpolycomplexsolve","(",new OneOperator2,KN_ >( gslpolycomplexsolve)); /* spline gsl and June 2013 */ /* Dcl_Type(::InitializePtr,::DeletePtr); zzzfff->Add("gslbspline",atype()); TheOperators->Add("<-", new OneOperator3_ >(pBuilQFd), */ // a faire ... interface randon of gsl ... gsl_rng_env_setup(); gsl_rngpp =gsl_rng_types_setup(); for(long i=0; gsl_rngpp[i]; ) ngslrng=++i; Dcl_Type< gsl_rng ** > (init_gsl_rng,delete_gsl_rng); Dcl_Type< const gsl_rng_type * > (); //gsl_rng_type Global.New("ngslrng",CConstant(ngslrng)); // // all gsl random generator .???? . /* Global.New("gslrngborosh13",CConstant(gsl_rng_borosh13)); Global.New("gslrngcoveyou",CConstant(gsl_rng_coveyou)); Global.New("gslrngcmrg",CConstant(gsl_rng_cmrg)); Global.New("gslrngfishman18",CConstant(gsl_rng_fishman18)); Global.New("gslrngfishman20",CConstant(gsl_rng_fishman20)); Global.New("gslrngfishman2x",CConstant(gsl_rng_fishman2x)); Global.New("gslrnggfsr4",CConstant(gsl_rng_gfsr4)); Global.New("gslrngknuthran",CConstant(gsl_rng_knuthran)); Global.New("gslrngknuthran2",CConstant(gsl_rng_knuthran2)); Global.New("gslrngknuthran2002",CConstant(gsl_rng_knuthran2002)); Global.New("gslrnglecuyer21",CConstant(gsl_rng_lecuyer21)); Global.New("gslrngminstd",CConstant(gsl_rng_minstd)); Global.New("gslrngmrg",CConstant(gsl_rng_mrg)); Global.New("gslrngmt19937",CConstant(gsl_rng_mt19937)); Global.New("gslrngmt199371999",CConstant(gsl_rng_mt19937_1999)); Global.New("gslrngmt199371998",CConstant(gsl_rng_mt19937_1998)); Global.New("gslrngr250",CConstant(gsl_rng_r250)); Global.New("gslrngran0",CConstant(gsl_rng_ran0)); Global.New("gslrngran1",CConstant(gsl_rng_ran1)); Global.New("gslrngran2",CConstant(gsl_rng_ran2)); Global.New("gslrngran3",CConstant(gsl_rng_ran3)); Global.New("gslrngrand",CConstant(gsl_rng_rand)); Global.New("gslrngrand48",CConstant(gsl_rng_rand48)); Global.New("gslrngrandom128bsd",CConstant(gsl_rng_random128_bsd)); Global.New("gslrngrandom128glibc2",CConstant(gsl_rng_random128_glibc2)); Global.New("gslrngrandom128libc5",CConstant(gsl_rng_random128_libc5)); Global.New("gslrngrandom256bsd",CConstant(gsl_rng_random256_bsd)); Global.New("gslrngrandom256glibc2",CConstant(gsl_rng_random256_glibc2)); Global.New("gslrngrandom256libc5",CConstant(gsl_rng_random256_libc5)); Global.New("gslrngrandom32bsd",CConstant(gsl_rng_random32_bsd)); Global.New("gslrngrandom32glibc2",CConstant(gsl_rng_random32_glibc2)); Global.New("gslrngrandom32libc5",CConstant(gsl_rng_random32_libc5)); Global.New("gslrngrandom64bsd",CConstant(gsl_rng_random64_bsd)); Global.New("gslrngrandom64glibc2",CConstant(gsl_rng_random64_glibc2)); Global.New("gslrngrandom64libc5",CConstant(gsl_rng_random64_libc5)); Global.New("gslrngrandom8bsd",CConstant(gsl_rng_random8_bsd)); Global.New("gslrngrandom8glibc2",CConstant(gsl_rng_random8_glibc2)); Global.New("gslrngrandom8libc5",CConstant(gsl_rng_random8_libc5)); Global.New("gslrngrandombsd",CConstant(gsl_rng_random_bsd)); Global.New("gslrngrandomglibc2",CConstant(gsl_rng_random_glibc2)); Global.New("gslrngrandomlibc5",CConstant(gsl_rng_random_libc5)); Global.New("gslrngrandu",CConstant(gsl_rng_randu)); Global.New("gslrngranf",CConstant(gsl_rng_ranf)); Global.New("gslrngranlux",CConstant(gsl_rng_ranlux)); Global.New("gslrngranlux389",CConstant(gsl_rng_ranlux389)); Global.New("gslrngranlxd1",CConstant(gsl_rng_ranlxd1)); Global.New("gslrngranlxd2",CConstant(gsl_rng_ranlxd2)); Global.New("gslrngranlxs0",CConstant(gsl_rng_ranlxs0)); Global.New("gslrngranlxs1",CConstant(gsl_rng_ranlxs1)); Global.New("gslrngranlxs2",CConstant(gsl_rng_ranlxs2)); Global.New("gslrngranmar",CConstant(gsl_rng_ranmar)); Global.New("gslrngslatec",CConstant(gsl_rng_slatec)); Global.New("gslrngtaus",CConstant(gsl_rng_taus)); Global.New("gslrngtaus2",CConstant(gsl_rng_taus2)); Global.New("gslrngtaus113",CConstant(gsl_rng_taus113)); Global.New("gslrngtransputer",CConstant(gsl_rng_transputer)); Global.New("gslrngtt800",CConstant(gsl_rng_tt800)); Global.New("gslrnguni",CConstant(gsl_rng_uni)); Global.New("gslrnguni32",CConstant(gsl_rng_uni32)); Global.New("gslrngvax",CConstant(gsl_rng_vax)); Global.New("gslrngwaterman14",CConstant(gsl_rng_waterman14)); Global.New("gslrngzuf",CConstant(gsl_rng_zuf)); Global.New("gslrngdefault",CConstant(gsl_rng_default)); */ zzzfff->Add("gslrng",atype()); TheOperators->Add("<-",new OneOperator2(init_gsl_rng_type)); TheOperators->Add("=",new OneOperator2(set_gsl_rng_type)); TheOperators->Add("=",new OneOperator2(set_gsl_cpy)); //map_type[typeid(gsl_rng *).name()]->AddCast( new E_F1_funcT(UnRef) ); //map_type[typeid(gsl_rng *).name()]->AddCast( new E_F1_funcT(UnRef) ); Global.Add("gslrnguniform","(",new OneOperator1( gslrnguniform)); Global.Add("gslrnguniformpos","(",new OneOperator1( gslrnguniformpos)); Global.Add("gslname","(",new OneOperator1s_( gsl_name)); Global.Add("gslrngget","(",new OneOperator1( gsl_rng_get)); Global.Add("gslrngmin","(",new OneOperator1( gsl_rng_min)); Global.Add("gslrngmax","(",new OneOperator1( gsl_rng_max)); Global.Add("gslrngset","(",new OneOperator2(gsl_rng_set)); Global.Add("gslrngtype","(",new OneOperator1(gslrngtype)); init_gsl_sf() ; gslabort=1; Global.New("gslabortonerror",CConstant(&gslabort)); gsl_set_error_handler(ffhandler); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/gsl.edp000644 000767 000024 00000001417 12350366304 017751 0ustar00hechtstaff000000 000000 include "gsl.idp" // FFCS - avoid using P2 and P3 which already define something very precise real [int] p2=[ 2,-3,1]; real [int] p3=[ 8,-10,1,1]; real [int] X(3); complex[int] Z(4); real [int] Q4=[ -1,0,0,0,1]; gslpolysolvequadratic(p2,X); cout << X[0] << " " << X[1] << endl; gslpolysolvecubic(p3,X); cout << X[0] << " " << X[1] << " " << X[2] << endl; gslpolycomplexsolve(Q4,Z); cout << Z[0] << " " << Z[1] << " " << Z[2] << " " << Z[3] < ff_gsl_awk.hpp load "gsl" gslrng ffrng; gslabortonerror=0; cout << "gsl_cdf_ugaussian_P(0.55) = " << gslcdfugaussianP(0.55) << endl; cout << "gsl_cdf_ugaussian_Q(0.55) = " << gslcdfugaussianQ(0.55) << endl; cout << "gsl_cdf_ugaussian_Pinv(0.55) = " << gslcdfugaussianPinv(0.55) << endl; cout << "gsl_cdf_ugaussian_Qinv(0.55) = " << gslcdfugaussianQinv(0.55) << endl; cout << "gsl_cdf_gaussian_P(0.55, 0.55) = " << gslcdfgaussianP(0.55, 0.55) << endl; cout << "gsl_cdf_gaussian_Q(0.55, 0.55) = " << gslcdfgaussianQ(0.55, 0.55) << endl; cout << "gsl_cdf_gaussian_Pinv(0.55, 0.55) = " << gslcdfgaussianPinv(0.55, 0.55) << endl; cout << "gsl_cdf_gaussian_Qinv(0.55, 0.55) = " << gslcdfgaussianQinv(0.55, 0.55) << endl; cout << "gsl_cdf_gamma_P(0.55,0.55,0.55) = " << gslcdfgammaP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gamma_Q(0.55,0.55,0.55) = " << gslcdfgammaQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gamma_Pinv(0.55,0.55,0.55) = " << gslcdfgammaPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gamma_Qinv(0.55,0.55,0.55) = " << gslcdfgammaQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_cauchy_P(0.55, 0.55) = " << gslcdfcauchyP(0.55, 0.55) << endl; cout << "gsl_cdf_cauchy_Q(0.55, 0.55) = " << gslcdfcauchyQ(0.55, 0.55) << endl; cout << "gsl_cdf_cauchy_Pinv(0.55, 0.55) = " << gslcdfcauchyPinv(0.55, 0.55) << endl; cout << "gsl_cdf_cauchy_Qinv(0.55, 0.55) = " << gslcdfcauchyQinv(0.55, 0.55) << endl; cout << "gsl_cdf_laplace_P(0.55, 0.55) = " << gslcdflaplaceP(0.55, 0.55) << endl; cout << "gsl_cdf_laplace_Q(0.55, 0.55) = " << gslcdflaplaceQ(0.55, 0.55) << endl; cout << "gsl_cdf_laplace_Pinv(0.55, 0.55) = " << gslcdflaplacePinv(0.55, 0.55) << endl; cout << "gsl_cdf_laplace_Qinv(0.55, 0.55) = " << gslcdflaplaceQinv(0.55, 0.55) << endl; cout << "gsl_cdf_rayleigh_P(0.55, 0.55) = " << gslcdfrayleighP(0.55, 0.55) << endl; cout << "gsl_cdf_rayleigh_Q(0.55, 0.55) = " << gslcdfrayleighQ(0.55, 0.55) << endl; cout << "gsl_cdf_rayleigh_Pinv(0.55, 0.55) = " << gslcdfrayleighPinv(0.55, 0.55) << endl; cout << "gsl_cdf_rayleigh_Qinv(0.55, 0.55) = " << gslcdfrayleighQinv(0.55, 0.55) << endl; cout << "gsl_cdf_chisq_P(0.55, 0.55) = " << gslcdfchisqP(0.55, 0.55) << endl; cout << "gsl_cdf_chisq_Q(0.55, 0.55) = " << gslcdfchisqQ(0.55, 0.55) << endl; cout << "gsl_cdf_chisq_Pinv(0.55, 0.55) = " << gslcdfchisqPinv(0.55, 0.55) << endl; cout << "gsl_cdf_chisq_Qinv(0.55, 0.55) = " << gslcdfchisqQinv(0.55, 0.55) << endl; cout << "gsl_cdf_exponential_P(0.55, 0.55) = " << gslcdfexponentialP(0.55, 0.55) << endl; cout << "gsl_cdf_exponential_Q(0.55, 0.55) = " << gslcdfexponentialQ(0.55, 0.55) << endl; cout << "gsl_cdf_exponential_Pinv(0.55, 0.55) = " << gslcdfexponentialPinv(0.55, 0.55) << endl; cout << "gsl_cdf_exponential_Qinv(0.55, 0.55) = " << gslcdfexponentialQinv(0.55, 0.55) << endl; cout << "gsl_cdf_exppow_P(0.55,0.55,0.55) = " << gslcdfexppowP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_exppow_Q(0.55,0.55,0.55) = " << gslcdfexppowQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_tdist_P(0.55, 0.55) = " << gslcdftdistP(0.55, 0.55) << endl; cout << "gsl_cdf_tdist_Q(0.55, 0.55) = " << gslcdftdistQ(0.55, 0.55) << endl; cout << "gsl_cdf_tdist_Pinv(0.55, 0.55) = " << gslcdftdistPinv(0.55, 0.55) << endl; cout << "gsl_cdf_tdist_Qinv(0.55, 0.55) = " << gslcdftdistQinv(0.55, 0.55) << endl; cout << "gsl_cdf_fdist_P(0.55,0.55,0.55) = " << gslcdffdistP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_fdist_Q(0.55,0.55,0.55) = " << gslcdffdistQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_fdist_Pinv(0.55,0.55,0.55) = " << gslcdffdistPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_fdist_Qinv(0.55,0.55,0.55) = " << gslcdffdistQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_beta_P(0.55,0.55,0.55) = " << gslcdfbetaP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_beta_Q(0.55,0.55,0.55) = " << gslcdfbetaQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_beta_Pinv(0.55,0.55,0.55) = " << gslcdfbetaPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_beta_Qinv(0.55,0.55,0.55) = " << gslcdfbetaQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_flat_P(0.55,0.55,0.55) = " << gslcdfflatP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_flat_Q(0.55,0.55,0.55) = " << gslcdfflatQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_flat_Pinv(0.55,0.55,0.55) = " << gslcdfflatPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_flat_Qinv(0.55,0.55,0.55) = " << gslcdfflatQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_lognormal_P(0.55,0.55,0.55) = " << gslcdflognormalP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_lognormal_Q(0.55,0.55,0.55) = " << gslcdflognormalQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_lognormal_Pinv(0.55,0.55,0.55) = " << gslcdflognormalPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_lognormal_Qinv(0.55,0.55,0.55) = " << gslcdflognormalQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel1_P(0.55,0.55,0.55) = " << gslcdfgumbel1P(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel1_Q(0.55,0.55,0.55) = " << gslcdfgumbel1Q(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel1_Pinv(0.55,0.55,0.55) = " << gslcdfgumbel1Pinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel1_Qinv(0.55,0.55,0.55) = " << gslcdfgumbel1Qinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel2_P(0.55,0.55,0.55) = " << gslcdfgumbel2P(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel2_Q(0.55,0.55,0.55) = " << gslcdfgumbel2Q(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel2_Pinv(0.55,0.55,0.55) = " << gslcdfgumbel2Pinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_gumbel2_Qinv(0.55,0.55,0.55) = " << gslcdfgumbel2Qinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_weibull_P(0.55,0.55,0.55) = " << gslcdfweibullP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_weibull_Q(0.55,0.55,0.55) = " << gslcdfweibullQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_weibull_Pinv(0.55,0.55,0.55) = " << gslcdfweibullPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_weibull_Qinv(0.55,0.55,0.55) = " << gslcdfweibullQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_pareto_P(0.55,0.55,0.55) = " << gslcdfparetoP(0.55,0.55,0.55) << endl; cout << "gsl_cdf_pareto_Q(0.55,0.55,0.55) = " << gslcdfparetoQ(0.55,0.55,0.55) << endl; cout << "gsl_cdf_pareto_Pinv(0.55,0.55,0.55) = " << gslcdfparetoPinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_pareto_Qinv(0.55,0.55,0.55) = " << gslcdfparetoQinv(0.55,0.55,0.55) << endl; cout << "gsl_cdf_logistic_P(0.55, 0.55) = " << gslcdflogisticP(0.55, 0.55) << endl; cout << "gsl_cdf_logistic_Q(0.55, 0.55) = " << gslcdflogisticQ(0.55, 0.55) << endl; cout << "gsl_cdf_logistic_Pinv(0.55, 0.55) = " << gslcdflogisticPinv(0.55, 0.55) << endl; cout << "gsl_cdf_logistic_Qinv(0.55, 0.55) = " << gslcdflogisticQinv(0.55, 0.55) << endl; cout << "gsl_cdf_binomial_P(0,0.55,0) = " << gslcdfbinomialP(0,0.55,0) << endl; cout << "gsl_cdf_binomial_Q(0,0.55,0) = " << gslcdfbinomialQ(0,0.55,0) << endl; cout << "gsl_cdf_poisson_P(0, 0.55) = " << gslcdfpoissonP(0, 0.55) << endl; cout << "gsl_cdf_poisson_Q(0, 0.55) = " << gslcdfpoissonQ(0, 0.55) << endl; cout << "gsl_cdf_geometric_P(0, 0.55) = " << gslcdfgeometricP(0, 0.55) << endl; cout << "gsl_cdf_geometric_Q(0, 0.55) = " << gslcdfgeometricQ(0, 0.55) << endl; cout << "gsl_cdf_negative_binomial_P(0,0.55,0.55) = " << gslcdfnegativebinomialP(0,0.55,0.55) << endl; cout << "gsl_cdf_negative_binomial_Q(0,0.55,0.55) = " << gslcdfnegativebinomialQ(0,0.55,0.55) << endl; cout << "gsl_cdf_pascal_P(0,0.55,0) = " << gslcdfpascalP(0,0.55,0) << endl; cout << "gsl_cdf_pascal_Q(0,0.55,0) = " << gslcdfpascalQ(0,0.55,0) << endl; cout << "gsl_ran_bernoulli_pdf(0, 0.55) = " << gslranbernoullipdf(0, 0.55) << endl; cout << "gsl_ran_beta(ffrng,0.55,0.55) = " << gslranbeta(ffrng,0.55,0.55) << endl; cout << "gsl_ran_beta_pdf(0.55,0.55,0.55) = " << gslranbetapdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_binomial_pdf(0,0.55,0) = " << gslranbinomialpdf(0,0.55,0) << endl; cout << "gsl_ran_exponential(ffrng, 0.55) = " << gslranexponential(ffrng, 0.55) << endl; cout << "gsl_ran_exponential_pdf(0.55, 0.55) = " << gslranexponentialpdf(0.55, 0.55) << endl; cout << "gsl_ran_exppow(ffrng,0.55,0.55) = " << gslranexppow(ffrng,0.55,0.55) << endl; cout << "gsl_ran_exppow_pdf(0.55,0.55,0.55) = " << gslranexppowpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_cauchy(ffrng, 0.55) = " << gslrancauchy(ffrng, 0.55) << endl; cout << "gsl_ran_cauchy_pdf(0.55, 0.55) = " << gslrancauchypdf(0.55, 0.55) << endl; cout << "gsl_ran_chisq(ffrng, 0.55) = " << gslranchisq(ffrng, 0.55) << endl; cout << "gsl_ran_chisq_pdf(0.55, 0.55) = " << gslranchisqpdf(0.55, 0.55) << endl; cout << "gsl_ran_erlang(ffrng,0.55,0.55) = " << gslranerlang(ffrng,0.55,0.55) << endl; cout << "gsl_ran_erlang_pdf(0.55,0.55,0.55) = " << gslranerlangpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_fdist(ffrng,0.55,0.55) = " << gslranfdist(ffrng,0.55,0.55) << endl; cout << "gsl_ran_fdist_pdf(0.55,0.55,0.55) = " << gslranfdistpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_flat(ffrng,0.55,0.55) = " << gslranflat(ffrng,0.55,0.55) << endl; cout << "gsl_ran_flat_pdf(0.55,0.55,0.55) = " << gslranflatpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_gamma(ffrng,0.55,0.55) = " << gslrangamma(ffrng,0.55,0.55) << endl; cout << "gsl_ran_gamma_int(ffrng, 0) = " << gslrangammaint(ffrng, 0) << endl; cout << "gsl_ran_gamma_pdf(0.55,0.55,0.55) = " << gslrangammapdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_gamma_mt(ffrng,0.55,0.55) = " << gslrangammamt(ffrng,0.55,0.55) << endl; cout << "gsl_ran_gamma_knuth(ffrng,0.55,0.55) = " << gslrangammaknuth(ffrng,0.55,0.55) << endl; cout << "gsl_ran_gaussian(ffrng, 0.55) = " << gslrangaussian(ffrng, 0.55) << endl; cout << "gsl_ran_gaussian_ratio_method(ffrng, 0.55) = " << gslrangaussianratiomethod(ffrng, 0.55) << endl; cout << "gsl_ran_gaussian_ziggurat(ffrng, 0.55) = " << gslrangaussianziggurat(ffrng, 0.55) << endl; cout << "gsl_ran_gaussian_pdf(0.55, 0.55) = " << gslrangaussianpdf(0.55, 0.55) << endl; cout << "gsl_ran_ugaussian(ffrng) = " << gslranugaussian(ffrng) << endl; cout << "gsl_ran_ugaussian_ratio_method(ffrng) = " << gslranugaussianratiomethod(ffrng) << endl; cout << "gsl_ran_ugaussian_pdf(0.55) = " << gslranugaussianpdf(0.55) << endl; cout << "gsl_ran_gaussian_tail(ffrng,0.55,0.55) = " << gslrangaussiantail(ffrng,0.55,0.55) << endl; cout << "gsl_ran_gaussian_tail_pdf(0.55,0.55,0.55) = " << gslrangaussiantailpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_ugaussian_tail(ffrng, 0.55) = " << gslranugaussiantail(ffrng, 0.55) << endl; cout << "gsl_ran_ugaussian_tail_pdf(0.55, 0.55) = " << gslranugaussiantailpdf(0.55, 0.55) << endl; cout << "gsl_ran_landau(ffrng) = " << gslranlandau(ffrng) << endl; cout << "gsl_ran_landau_pdf(0.55) = " << gslranlandaupdf(0.55) << endl; cout << "gsl_ran_geometric_pdf(0, 0.55) = " << gslrangeometricpdf(0, 0.55) << endl; cout << "gsl_ran_gumbel1(ffrng,0.55,0.55) = " << gslrangumbel1(ffrng,0.55,0.55) << endl; cout << "gsl_ran_gumbel1_pdf(0.55,0.55,0.55) = " << gslrangumbel1pdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_gumbel2(ffrng,0.55,0.55) = " << gslrangumbel2(ffrng,0.55,0.55) << endl; cout << "gsl_ran_gumbel2_pdf(0.55,0.55,0.55) = " << gslrangumbel2pdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_logistic(ffrng, 0.55) = " << gslranlogistic(ffrng, 0.55) << endl; cout << "gsl_ran_logistic_pdf(0.55, 0.55) = " << gslranlogisticpdf(0.55, 0.55) << endl; cout << "gsl_ran_lognormal(ffrng,0.55,0.55) = " << gslranlognormal(ffrng,0.55,0.55) << endl; cout << "gsl_ran_lognormal_pdf(0.55,0.55,0.55) = " << gslranlognormalpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_logarithmic_pdf(0, 0.55) = " << gslranlogarithmicpdf(0, 0.55) << endl; cout << "gsl_ran_negative_binomial_pdf(0,0.55,0.55) = " << gslrannegativebinomialpdf(0,0.55,0.55) << endl; cout << "gsl_ran_pascal_pdf(0,0.55,0) = " << gslranpascalpdf(0,0.55,0) << endl; cout << "gsl_ran_pareto(ffrng,0.55,0.55) = " << gslranpareto(ffrng,0.55,0.55) << endl; cout << "gsl_ran_pareto_pdf(0.55,0.55,0.55) = " << gslranparetopdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_poisson_pdf(0, 0.55) = " << gslranpoissonpdf(0, 0.55) << endl; cout << "gsl_ran_rayleigh(ffrng, 0.55) = " << gslranrayleigh(ffrng, 0.55) << endl; cout << "gsl_ran_rayleigh_pdf(0.55, 0.55) = " << gslranrayleighpdf(0.55, 0.55) << endl; cout << "gsl_ran_rayleigh_tail(ffrng,0.55,0.55) = " << gslranrayleightail(ffrng,0.55,0.55) << endl; cout << "gsl_ran_rayleigh_tail_pdf(0.55,0.55,0.55) = " << gslranrayleightailpdf(0.55,0.55,0.55) << endl; cout << "gsl_ran_tdist(ffrng, 0.55) = " << gslrantdist(ffrng, 0.55) << endl; cout << "gsl_ran_tdist_pdf(0.55, 0.55) = " << gslrantdistpdf(0.55, 0.55) << endl; cout << "gsl_ran_laplace(ffrng, 0.55) = " << gslranlaplace(ffrng, 0.55) << endl; cout << "gsl_ran_laplace_pdf(0.55, 0.55) = " << gslranlaplacepdf(0.55, 0.55) << endl; cout << "gsl_ran_levy(ffrng,0.55,0.55) = " << gslranlevy(ffrng,0.55,0.55) << endl; cout << "gsl_ran_weibull(ffrng,0.55,0.55) = " << gslranweibull(ffrng,0.55,0.55) << endl; cout << "gsl_ran_weibull_pdf(0.55,0.55,0.55) = " << gslranweibullpdf(0.55,0.55,0.55) << endl; cout << "gsl_sf_airy_Ai(0.55, 0) = " << gslsfairyAi(0.55, 0) << endl; cout << "gsl_sf_airy_Bi(0.55, 0) = " << gslsfairyBi(0.55, 0) << endl; cout << "gsl_sf_airy_Ai_scaled(0.55, 0) = " << gslsfairyAiscaled(0.55, 0) << endl; cout << "gsl_sf_airy_Bi_scaled(0.55, 0) = " << gslsfairyBiscaled(0.55, 0) << endl; cout << "gsl_sf_airy_Ai_deriv(0.55, 0) = " << gslsfairyAideriv(0.55, 0) << endl; cout << "gsl_sf_airy_Bi_deriv(0.55, 0) = " << gslsfairyBideriv(0.55, 0) << endl; cout << "gsl_sf_airy_Ai_deriv_scaled(0.55, 0) = " << gslsfairyAiderivscaled(0.55, 0) << endl; cout << "gsl_sf_airy_Bi_deriv_scaled(0.55, 0) = " << gslsfairyBiderivscaled(0.55, 0) << endl; cout << "gsl_sf_airy_zero_Ai(0) = " << gslsfairyzeroAi(0) << endl; cout << "gsl_sf_airy_zero_Bi(0) = " << gslsfairyzeroBi(0) << endl; cout << "gsl_sf_airy_zero_Ai_deriv(0) = " << gslsfairyzeroAideriv(0) << endl; cout << "gsl_sf_airy_zero_Bi_deriv(0) = " << gslsfairyzeroBideriv(0) << endl; cout << "gsl_sf_bessel_J0(0.55) = " << gslsfbesselJ0(0.55) << endl; cout << "gsl_sf_bessel_J1(0.55) = " << gslsfbesselJ1(0.55) << endl; cout << "gsl_sf_bessel_Jn(0, 0.55) = " << gslsfbesselJn(0, 0.55) << endl; cout << "gsl_sf_bessel_Y0(0.55) = " << gslsfbesselY0(0.55) << endl; cout << "gsl_sf_bessel_Y1(0.55) = " << gslsfbesselY1(0.55) << endl; cout << "gsl_sf_bessel_Yn(0, 0.55) = " << gslsfbesselYn(0, 0.55) << endl; cout << "gsl_sf_bessel_I0(0.55) = " << gslsfbesselI0(0.55) << endl; cout << "gsl_sf_bessel_I1(0.55) = " << gslsfbesselI1(0.55) << endl; cout << "gsl_sf_bessel_In(0, 0.55) = " << gslsfbesselIn(0, 0.55) << endl; cout << "gsl_sf_bessel_I0_scaled(0.55) = " << gslsfbesselI0scaled(0.55) << endl; cout << "gsl_sf_bessel_I1_scaled(0.55) = " << gslsfbesselI1scaled(0.55) << endl; cout << "gsl_sf_bessel_In_scaled(0, 0.55) = " << gslsfbesselInscaled(0, 0.55) << endl; cout << "gsl_sf_bessel_K0(0.55) = " << gslsfbesselK0(0.55) << endl; cout << "gsl_sf_bessel_K1(0.55) = " << gslsfbesselK1(0.55) << endl; cout << "gsl_sf_bessel_Kn(0, 0.55) = " << gslsfbesselKn(0, 0.55) << endl; cout << "gsl_sf_bessel_K0_scaled(0.55) = " << gslsfbesselK0scaled(0.55) << endl; cout << "gsl_sf_bessel_K1_scaled(0.55) = " << gslsfbesselK1scaled(0.55) << endl; cout << "gsl_sf_bessel_Kn_scaled(0, 0.55) = " << gslsfbesselKnscaled(0, 0.55) << endl; cout << "gsl_sf_bessel_j0(0.55) = " << gslsfbesselj0(0.55) << endl; cout << "gsl_sf_bessel_j1(0.55) = " << gslsfbesselj1(0.55) << endl; cout << "gsl_sf_bessel_j2(0.55) = " << gslsfbesselj2(0.55) << endl; cout << "gsl_sf_bessel_jl(0, 0.55) = " << gslsfbesseljl(0, 0.55) << endl; cout << "gsl_sf_bessel_y0(0.55) = " << gslsfbessely0(0.55) << endl; cout << "gsl_sf_bessel_y1(0.55) = " << gslsfbessely1(0.55) << endl; cout << "gsl_sf_bessel_y2(0.55) = " << gslsfbessely2(0.55) << endl; cout << "gsl_sf_bessel_yl(0, 0.55) = " << gslsfbesselyl(0, 0.55) << endl; cout << "gsl_sf_bessel_i0_scaled(0.55) = " << gslsfbesseli0scaled(0.55) << endl; cout << "gsl_sf_bessel_i1_scaled(0.55) = " << gslsfbesseli1scaled(0.55) << endl; cout << "gsl_sf_bessel_i2_scaled(0.55) = " << gslsfbesseli2scaled(0.55) << endl; cout << "gsl_sf_bessel_il_scaled(0, 0.55) = " << gslsfbesselilscaled(0, 0.55) << endl; cout << "gsl_sf_bessel_k0_scaled(0.55) = " << gslsfbesselk0scaled(0.55) << endl; cout << "gsl_sf_bessel_k1_scaled(0.55) = " << gslsfbesselk1scaled(0.55) << endl; cout << "gsl_sf_bessel_k2_scaled(0.55) = " << gslsfbesselk2scaled(0.55) << endl; cout << "gsl_sf_bessel_kl_scaled(0, 0.55) = " << gslsfbesselklscaled(0, 0.55) << endl; cout << "gsl_sf_bessel_Jnu(0.55, 0.55) = " << gslsfbesselJnu(0.55, 0.55) << endl; cout << "gsl_sf_bessel_Ynu(0.55, 0.55) = " << gslsfbesselYnu(0.55, 0.55) << endl; cout << "gsl_sf_bessel_Inu_scaled(0.55, 0.55) = " << gslsfbesselInuscaled(0.55, 0.55) << endl; cout << "gsl_sf_bessel_Inu(0.55, 0.55) = " << gslsfbesselInu(0.55, 0.55) << endl; cout << "gsl_sf_bessel_Knu_scaled(0.55, 0.55) = " << gslsfbesselKnuscaled(0.55, 0.55) << endl; cout << "gsl_sf_bessel_Knu(0.55, 0.55) = " << gslsfbesselKnu(0.55, 0.55) << endl; cout << "gsl_sf_bessel_lnKnu(0.55, 0.55) = " << gslsfbessellnKnu(0.55, 0.55) << endl; cout << "gsl_sf_bessel_zero_J0(0) = " << gslsfbesselzeroJ0(0) << endl; cout << "gsl_sf_bessel_zero_J1(0) = " << gslsfbesselzeroJ1(0) << endl; cout << "gsl_sf_bessel_zero_Jnu(0.55, 0) = " << gslsfbesselzeroJnu(0.55, 0) << endl; cout << "gsl_sf_clausen(0.55) = " << gslsfclausen(0.55) << endl; cout << "gsl_sf_hydrogenicR_1(0.55, 0.55) = " << gslsfhydrogenicR1(0.55, 0.55) << endl; cout << "gsl_sf_dawson(0.55) = " << gslsfdawson(0.55) << endl; cout << "gsl_sf_debye_1(0.55) = " << gslsfdebye1(0.55) << endl; cout << "gsl_sf_debye_2(0.55) = " << gslsfdebye2(0.55) << endl; cout << "gsl_sf_debye_3(0.55) = " << gslsfdebye3(0.55) << endl; cout << "gsl_sf_debye_4(0.55) = " << gslsfdebye4(0.55) << endl; cout << "gsl_sf_debye_5(0.55) = " << gslsfdebye5(0.55) << endl; cout << "gsl_sf_debye_6(0.55) = " << gslsfdebye6(0.55) << endl; cout << "gsl_sf_dilog(0.55) = " << gslsfdilog(0.55) << endl; cout << "gsl_sf_multiply(0.55, 0.55) = " << gslsfmultiply(0.55, 0.55) << endl; cout << "gsl_sf_ellint_Kcomp(0.55, 0) = " << gslsfellintKcomp(0.55, 0) << endl; cout << "gsl_sf_ellint_Ecomp(0.55, 0) = " << gslsfellintEcomp(0.55, 0) << endl; cout << "gsl_sf_ellint_Pcomp(0.55,0.55,0) = " << gslsfellintPcomp(0.55,0.55,0) << endl; cout << "gsl_sf_ellint_Dcomp(0.55, 0) = " << gslsfellintDcomp(0.55, 0) << endl; cout << "gsl_sf_ellint_F(0.55,0.55,0) = " << gslsfellintF(0.55,0.55,0) << endl; cout << "gsl_sf_ellint_E(0.55,0.55,0) = " << gslsfellintE(0.55,0.55,0) << endl; cout << "gsl_sf_ellint_RC(0.55,0.55,0) = " << gslsfellintRC(0.55,0.55,0) << endl; cout << "gsl_sf_erfc(0.55) = " << gslsferfc(0.55) << endl; cout << "gsl_sf_log_erfc(0.55) = " << gslsflogerfc(0.55) << endl; cout << "gsl_sf_erf(0.55) = " << gslsferf(0.55) << endl; cout << "gsl_sf_erf_Z(0.55) = " << gslsferfZ(0.55) << endl; cout << "gsl_sf_erf_Q(0.55) = " << gslsferfQ(0.55) << endl; cout << "gsl_sf_hazard(0.55) = " << gslsfhazard(0.55) << endl; cout << "gsl_sf_exp(0.55) = " << gslsfexp(0.55) << endl; cout << "gsl_sf_exp_mult(0.55, 0.55) = " << gslsfexpmult(0.55, 0.55) << endl; cout << "gsl_sf_expm1(0.55) = " << gslsfexpm1(0.55) << endl; cout << "gsl_sf_exprel(0.55) = " << gslsfexprel(0.55) << endl; cout << "gsl_sf_exprel_2(0.55) = " << gslsfexprel2(0.55) << endl; cout << "gsl_sf_exprel_n(0, 0.55) = " << gslsfexpreln(0, 0.55) << endl; cout << "gsl_sf_expint_E1(0.55) = " << gslsfexpintE1(0.55) << endl; cout << "gsl_sf_expint_E2(0.55) = " << gslsfexpintE2(0.55) << endl; cout << "gsl_sf_expint_En(0, 0.55) = " << gslsfexpintEn(0, 0.55) << endl; cout << "gsl_sf_expint_E1_scaled(0.55) = " << gslsfexpintE1scaled(0.55) << endl; cout << "gsl_sf_expint_E2_scaled(0.55) = " << gslsfexpintE2scaled(0.55) << endl; cout << "gsl_sf_expint_En_scaled(0, 0.55) = " << gslsfexpintEnscaled(0, 0.55) << endl; cout << "gsl_sf_expint_Ei(0.55) = " << gslsfexpintEi(0.55) << endl; cout << "gsl_sf_expint_Ei_scaled(0.55) = " << gslsfexpintEiscaled(0.55) << endl; cout << "gsl_sf_Shi(0.55) = " << gslsfShi(0.55) << endl; cout << "gsl_sf_Chi(0.55) = " << gslsfChi(0.55) << endl; cout << "gsl_sf_expint_3(0.55) = " << gslsfexpint3(0.55) << endl; cout << "gsl_sf_Si(0.55) = " << gslsfSi(0.55) << endl; cout << "gsl_sf_Ci(0.55) = " << gslsfCi(0.55) << endl; cout << "gsl_sf_atanint(0.55) = " << gslsfatanint(0.55) << endl; cout << "gsl_sf_fermi_dirac_m1(0.55) = " << gslsffermidiracm1(0.55) << endl; cout << "gsl_sf_fermi_dirac_0(0.55) = " << gslsffermidirac0(0.55) << endl; cout << "gsl_sf_fermi_dirac_1(0.55) = " << gslsffermidirac1(0.55) << endl; cout << "gsl_sf_fermi_dirac_2(0.55) = " << gslsffermidirac2(0.55) << endl; cout << "gsl_sf_fermi_dirac_int(0, 0.55) = " << gslsffermidiracint(0, 0.55) << endl; cout << "gsl_sf_fermi_dirac_mhalf(0.55) = " << gslsffermidiracmhalf(0.55) << endl; cout << "gsl_sf_fermi_dirac_half(0.55) = " << gslsffermidirachalf(0.55) << endl; cout << "gsl_sf_fermi_dirac_3half(0.55) = " << gslsffermidirac3half(0.55) << endl; cout << "gsl_sf_fermi_dirac_inc_0(0.55, 0.55) = " << gslsffermidiracinc0(0.55, 0.55) << endl; cout << "gsl_sf_lngamma(0.55) = " << gslsflngamma(0.55) << endl; cout << "gsl_sf_gamma(0.55) = " << gslsfgamma(0.55) << endl; cout << "gsl_sf_gammastar(0.55) = " << gslsfgammastar(0.55) << endl; cout << "gsl_sf_gammainv(0.55) = " << gslsfgammainv(0.55) << endl; cout << "gsl_sf_taylorcoeff(0, 0.55) = " << gslsftaylorcoeff(0, 0.55) << endl; cout << "gsl_sf_fact(0) = " << gslsffact(0) << endl; cout << "gsl_sf_doublefact(0) = " << gslsfdoublefact(0) << endl; cout << "gsl_sf_lnfact(0) = " << gslsflnfact(0) << endl; cout << "gsl_sf_lndoublefact(0) = " << gslsflndoublefact(0) << endl; cout << "gsl_sf_lnchoose(0, 0) = " << gslsflnchoose(0, 0) << endl; cout << "gsl_sf_choose(0, 0) = " << gslsfchoose(0, 0) << endl; cout << "gsl_sf_lnpoch(0.55, 0.55) = " << gslsflnpoch(0.55, 0.55) << endl; cout << "gsl_sf_poch(0.55, 0.55) = " << gslsfpoch(0.55, 0.55) << endl; cout << "gsl_sf_pochrel(0.55, 0.55) = " << gslsfpochrel(0.55, 0.55) << endl; cout << "gsl_sf_gamma_inc_Q(0.55, 0.55) = " << gslsfgammaincQ(0.55, 0.55) << endl; cout << "gsl_sf_gamma_inc_P(0.55, 0.55) = " << gslsfgammaincP(0.55, 0.55) << endl; cout << "gsl_sf_gamma_inc(0.55, 0.55) = " << gslsfgammainc(0.55, 0.55) << endl; cout << "gsl_sf_lnbeta(0.55, 0.55) = " << gslsflnbeta(0.55, 0.55) << endl; cout << "gsl_sf_beta(0.55, 0.55) = " << gslsfbeta(0.55, 0.55) << endl; cout << "gsl_sf_beta_inc(0.55,0.55,0.55) = " << gslsfbetainc(0.55,0.55,0.55) << endl; cout << "gsl_sf_gegenpoly_1(0.55, 0.55) = " << gslsfgegenpoly1(0.55, 0.55) << endl; cout << "gsl_sf_gegenpoly_2(0.55, 0.55) = " << gslsfgegenpoly2(0.55, 0.55) << endl; cout << "gsl_sf_gegenpoly_3(0.55, 0.55) = " << gslsfgegenpoly3(0.55, 0.55) << endl; cout << "gsl_sf_gegenpoly_n(0,0.55,0.55) = " << gslsfgegenpolyn(0,0.55,0.55) << endl; cout << "gsl_sf_hyperg_0F1(0.55, 0.55) = " << gslsfhyperg0F1(0.55, 0.55) << endl; cout << "gsl_sf_hyperg_1F1_int(0,0,0.55) = " << gslsfhyperg1F1int(0,0,0.55) << endl; cout << "gsl_sf_hyperg_1F1(0.55,0.55,0.55) = " << gslsfhyperg1F1(0.55,0.55,0.55) << endl; cout << "gsl_sf_hyperg_U_int(0,0,0.55) = " << gslsfhypergUint(0,0,0.55) << endl; cout << "gsl_sf_hyperg_U(0.55,0.55,0.55) = " << gslsfhypergU(0.55,0.55,0.55) << endl; cout << "gsl_sf_hyperg_2F0(0.55,0.55,0.55) = " << gslsfhyperg2F0(0.55,0.55,0.55) << endl; cout << "gsl_sf_laguerre_1(0.55, 0.55) = " << gslsflaguerre1(0.55, 0.55) << endl; cout << "gsl_sf_laguerre_2(0.55, 0.55) = " << gslsflaguerre2(0.55, 0.55) << endl; cout << "gsl_sf_laguerre_3(0.55, 0.55) = " << gslsflaguerre3(0.55, 0.55) << endl; cout << "gsl_sf_laguerre_n(0,0.55,0.55) = " << gslsflaguerren(0,0.55,0.55) << endl; cout << "gsl_sf_lambert_W0(0.55) = " << gslsflambertW0(0.55) << endl; cout << "gsl_sf_lambert_Wm1(0.55) = " << gslsflambertWm1(0.55) << endl; cout << "gsl_sf_legendre_Pl(0, 0.55) = " << gslsflegendrePl(0, 0.55) << endl; cout << "gsl_sf_legendre_P1(0.55) = " << gslsflegendreP1(0.55) << endl; cout << "gsl_sf_legendre_P2(0.55) = " << gslsflegendreP2(0.55) << endl; cout << "gsl_sf_legendre_P3(0.55) = " << gslsflegendreP3(0.55) << endl; cout << "gsl_sf_legendre_Q0(0.55) = " << gslsflegendreQ0(0.55) << endl; cout << "gsl_sf_legendre_Q1(0.55) = " << gslsflegendreQ1(0.55) << endl; cout << "gsl_sf_legendre_Ql(0, 0.55) = " << gslsflegendreQl(0, 0.55) << endl; cout << "gsl_sf_legendre_Plm(0,0,0.55) = " << gslsflegendrePlm(0,0,0.55) << endl; cout << "gsl_sf_legendre_sphPlm(0,0,0.55) = " << gslsflegendresphPlm(0,0,0.55) << endl; cout << "gsl_sf_legendre_array_size(0, 0) = " << gslsflegendrearraysize(0, 0) << endl; cout << "gsl_sf_conicalP_half(0.55, 0.55) = " << gslsfconicalPhalf(0.55, 0.55) << endl; cout << "gsl_sf_conicalP_mhalf(0.55, 0.55) = " << gslsfconicalPmhalf(0.55, 0.55) << endl; cout << "gsl_sf_conicalP_0(0.55, 0.55) = " << gslsfconicalP0(0.55, 0.55) << endl; cout << "gsl_sf_conicalP_1(0.55, 0.55) = " << gslsfconicalP1(0.55, 0.55) << endl; cout << "gsl_sf_conicalP_sph_reg(0,0.55,0.55) = " << gslsfconicalPsphreg(0,0.55,0.55) << endl; cout << "gsl_sf_conicalP_cyl_reg(0,0.55,0.55) = " << gslsfconicalPcylreg(0,0.55,0.55) << endl; cout << "gsl_sf_legendre_H3d_0(0.55, 0.55) = " << gslsflegendreH3d0(0.55, 0.55) << endl; cout << "gsl_sf_legendre_H3d_1(0.55, 0.55) = " << gslsflegendreH3d1(0.55, 0.55) << endl; cout << "gsl_sf_legendre_H3d(0,0.55,0.55) = " << gslsflegendreH3d(0,0.55,0.55) << endl; cout << "gsl_sf_log(0.55) = " << gslsflog(0.55) << endl; cout << "gsl_sf_log_abs(0.55) = " << gslsflogabs(0.55) << endl; cout << "gsl_sf_log_1plusx(0.55) = " << gslsflog1plusx(0.55) << endl; cout << "gsl_sf_log_1plusx_mx(0.55) = " << gslsflog1plusxmx(0.55) << endl; cout << "gsl_sf_pow_int(0.55, 0) = " << gslsfpowint(0.55, 0) << endl; cout << "gsl_sf_psi_int(0) = " << gslsfpsiint(0) << endl; cout << "gsl_sf_psi(0.55) = " << gslsfpsi(0.55) << endl; cout << "gsl_sf_psi_1piy(0.55) = " << gslsfpsi1piy(0.55) << endl; cout << "gsl_sf_psi_1_int(0) = " << gslsfpsi1int(0) << endl; cout << "gsl_sf_psi_1(0.55) = " << gslsfpsi1(0.55) << endl; cout << "gsl_sf_psi_n(0, 0.55) = " << gslsfpsin(0, 0.55) << endl; cout << "gsl_sf_synchrotron_1(0.55) = " << gslsfsynchrotron1(0.55) << endl; cout << "gsl_sf_synchrotron_2(0.55) = " << gslsfsynchrotron2(0.55) << endl; cout << "gsl_sf_transport_2(0.55) = " << gslsftransport2(0.55) << endl; cout << "gsl_sf_transport_3(0.55) = " << gslsftransport3(0.55) << endl; cout << "gsl_sf_transport_4(0.55) = " << gslsftransport4(0.55) << endl; cout << "gsl_sf_transport_5(0.55) = " << gslsftransport5(0.55) << endl; cout << "gsl_sf_sin(0.55) = " << gslsfsin(0.55) << endl; cout << "gsl_sf_cos(0.55) = " << gslsfcos(0.55) << endl; cout << "gsl_sf_hypot(0.55, 0.55) = " << gslsfhypot(0.55, 0.55) << endl; cout << "gsl_sf_sinc(0.55) = " << gslsfsinc(0.55) << endl; cout << "gsl_sf_lnsinh(0.55) = " << gslsflnsinh(0.55) << endl; cout << "gsl_sf_lncosh(0.55) = " << gslsflncosh(0.55) << endl; cout << "gsl_sf_angle_restrict_symm(0.55) = " << gslsfanglerestrictsymm(0.55) << endl; cout << "gsl_sf_angle_restrict_pos(0.55) = " << gslsfanglerestrictpos(0.55) << endl; cout << "gsl_sf_zeta_int(0) = " << gslsfzetaint(0) << endl; cout << "gsl_sf_zeta(0.55) = " << gslsfzeta(0.55) << endl; cout << "gsl_sf_zetam1(0.55) = " << gslsfzetam1(0.55) << endl; cout << "gsl_sf_zetam1_int(0) = " << gslsfzetam1int(0) << endl; cout << "gsl_sf_hzeta(0.55, 0.55) = " << gslsfhzeta(0.55, 0.55) << endl; cout << "gsl_sf_eta_int(0) = " << gslsfetaint(0) << endl; cout << "gsl_sf_eta(0.55) = " << gslsfeta(0.55) << endl; freefem++-3.38-1/examples++-load/ilut.cpp000644 000767 000024 00000007217 12466663430 020167 0ustar00hechtstaff000000 000000 /* * ilut.cpp: ILUT plugin for FreeFem++ wrapping GMM++ functions. * Copyright (C) 2008, Alessandro Proverbio and David Radice. * * ilut.cpp is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation; * * ilut.cpp is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with ilut.cpp; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //ff-c++-LIBRARY-dep: gmm //ff-c++-cpp-dep: #include #include #include "AFunction.hpp" #include "RNM.hpp" #include "error.hpp" #include #include #define ILUT_K_FILLIN 5 #define ILUT_EPS 1e-6 #define PRINT(VAR) cout << VAR << endl using namespace std; using namespace gmm; typedef ilut_precond > > my_ilut_precond; class ILUT; class ILUT_Matrix { private: long * _i; long * _j; double * _c; long _nelem; long _size; public: ILUT_Matrix(KN * const & i, KN * const & j, KN * const & c): _i(*i), _j(*j), _c(*c), _nelem(c->N()) { _size=max(i->max(),j->max()); ++_size; } friend class ILUT; }; class ILUT_Vector { private: double * _v; long _size; public: ILUT_Vector(KN * const & c) : _v(*c),_size(c->N()) {} friend class ILUT; }; class ILUT { private: static my_ilut_precond * p; static long size; public: static long make_ilut_precond(ILUT_Matrix const & m) { row_matrix > A(m._size,m._size); row_matrix > w_A(m._size,m._size); for(long k(0);k * const & x) { vector vv(size); vector xx(size); for(long k=0;kN();++k) { (*x)[k+size]=v._v[k+size]; } } }; my_ilut_precond * ILUT::p=0; long ILUT::size=0; long * make_ilut_precond_eq(long * const & errorcode, ILUT_Matrix const & mat) { *errorcode=ILUT::make_ilut_precond(mat); return errorcode; } KN * apply_ilut_precond_eq(KN * const & x, ILUT_Vector const & vec) { ILUT::apply_ilut_precond(vec, x); return x; } ILUT_Matrix make_ilut_precond(KN * const & i, KN * const & j, KN * const & v) { return ILUT_Matrix(i,j,v); } ILUT_Vector apply_ilut_precond(KN * const & v) { return ILUT_Vector(v); } static void Load_Init() { if(verbosity) cout << " -- load ilut init : " << endl; Dcl_Type(); Dcl_Type(); Global.Add("applyIlutPrecond","(",new OneOperator1_* >(apply_ilut_precond)); Global.Add("makeIlutPrecond","(", new OneOperator3_ *,KN *,KN *>(make_ilut_precond)); TheOperators->Add("=", new OneOperator2_(make_ilut_precond_eq)); TheOperators->Add("=", new OneOperator2_ *, KN *,ILUT_Vector>(apply_ilut_precond_eq)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/ilut.edp000644 000767 000024 00000001711 11643537361 020145 0ustar00hechtstaff000000 000000 load "ilut" mesh Th=square(10,10); fespace Qh(Th,P1); fespace Vh(Th,P2); real nu=1; varf mp(p,q)=int2d(Th)(p*q/nu); matrix Mp=mp(Qh,Qh); real[int] diagMp(Qh.ndof); diagMp=Mp.diag; diagMp=1/nu*diagMp; // We are putting this here to workaround a bug in freefem++ real[int] ilutOUT(Vh.ndof+Qh.ndof); // Uses ILUT for the velocity part and the mass matrix for the pressure part func real[int] ilutMp(real[int] & xx) { real[int] uuin(Vh.ndof); real[int] ppin(Qh.ndof); real[int] uuout(Vh.ndof); real[int] ppout(Qh.ndof); [uuin,ppin]=xx; for(int k=0;kv/V?Ɵ)OZɈ5k06}-^qFߺ"$kVU `NhwVKC<^dϨ}/@J?C}L_Is/@J7P.YvbL?U)o] ?/?ȡ!vt?%k?DSo>4G?%eLHOP&@J?Ro+ ?A2JZ ?=Gsy6\PV!Bokwb:?o^ /DS{kY;!fخOS"$k~#:O"$k?WAx/D/W]!BTup~z[Ok>c` ,X` ,7z;freefem++-3.38-1/examples++-load/iohd5-beam-2d.edp000644 000767 000024 00000002614 12455274705 021412 0ustar00hechtstaff000000 000000 // Fluid-structure interaction for a weighting beam sitting on a // square cavity filled with a fluid. load "iohdf5" int bottombeam = 2; border a(t=2,0) { x=0; y=t ;label=1;}; // left beam border b(t=0,10) { x=t; y=0 ;label=bottombeam;}; // bottom of beam border c(t=0,2) { x=10; y=t ;label=1;}; // rigth beam border d(t=0,10) { x=10-t; y=2; label=3;}; // top beam real E = 21.5; real sigma = 0.29; real mu = E/(2*(1+sigma)); real lambda = E*sigma/((1+sigma)*(1-2*sigma)); real gravity = -0.05; mesh th = buildmesh( b(20)+c(5)+d(20)+a(5)); fespace Vh(th,[P1,P1]); Vh [uu,vv], [w,s]; cout << "lambda,mu,gravity ="<( (*e[i])(stack) ); } else return 0; } }; vector l; static const int n_name_param = 1; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a ) const { return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a; } public: datasolHDF5Mesh2_Op(const basicAC_F0 & args) : l((args.size()-2)/2 ) { int nbofsol; int ddim=2; int stsize=3; cout << " " << endl; if(debug==1) { cout << "construction data hdf5 solution avec datasolHDF5Mesh2_Op" << endl; cout << "taille de args " << args.size() << endl; } args.SetNameParam(n_name_param,name_param,nargs); if (BCastTo(args[0])) filename = CastTo(args[0]); if (BCastTo(args[1])) eTh= CastTo(args[1]); nbofsol = l.size(); if(debug==1) { cout << "hdf5 solution 2d nb sol: "<< nbofsol << endl; } size_t kk=0; for (size_t i=2;i<(unsigned int)args.size();i=i+2) { size_t jj=i-2-kk; if (BCastTo( args[i] )) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); if(debug==1) { cout << "hdf5 solution 2d N° " << jj << " is scalar type " << endl; } } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); if (a0->size() != ddim && a0->size() != stsize) CompileError("savesol in 2D: vector solution is 2 composant, tensor solution is 3 composant"); if( a0->size() == ddim) { // vector solution if(debug==1) { cout << "hdf5 solution 2d N° " << jj << " is vector type" << endl; } l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize) { // symmetric tensor solution if(debug==1) { cout << "hdf5 solution 2d N° " << jj << " is tensor type" << endl; } l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } } } else { cout << " arg " << i << " " << args[i].left() << endl; CompileError("savesol in 2D: Sorry no way to save this kind of data"); } if (BCastTo(args[i+1])) l[jj].lename = CastTo(args[i+1]); kk++; } } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), true); } static E_F0 * f(const basicAC_F0 & args) { return new datasolHDF5Mesh2_Op(args); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type datasolHDF5Mesh2_Op::name_param[]= { { "order",&typeid(long)} }; AnyType datasolHDF5Mesh2_Op::operator()(Stack stack) const { //Hyp A //----- // A priori, paraview - hdf5 -xdmf impose qu un vecteur possede 3 composantes. // Donc, pour stocker la solution, on transforme le resultat produit par le // code, i.e. vecteur 2D, en vecteur 3D en initialisant le vecteur 3D a zero. // //Hyp B //----- // Etant donne que le tenseur est un tenseur 2d symetrique, // on fait le choix, ici, pour paraview, de le representer sous forme // d'un vecteur a 3 composantes Exx,Eyy,Exy=Eyx // un autre choix possible serait de stocker les valeurs sous // un tenseur 3x3 avec Ezz=Exz=Ezx=Eyz=Ezy=0 // mp & mps set but not used //MeshPoint *mp(MeshPointStack(stack)), mps=*mp; Mesh * pTh= GetAny((*eTh)(stack)); string * ffname= GetAny( (*filename)(stack) ); ffassert(pTh); Mesh &Th=*pTh; int nt = Th.nt; int nv = Th.nv; // int nbtype=l.size(); int nbsol; int solnbfloat; int resultorder= arg(0, stack, 1L); string * datafieldname; long longdefault = 0; if(verbosity>2) { cout << "filename data hdf5 solution () : "<< ffname << endl; cout << "hdf5 solution () nb vertices: "<< nv << endl; cout << "hdf5 solution () nb triangles: "<< nt << endl; cout << "hdf5 solution () nb of fields: "<< l.size() << endl; } //write xdmf sol file WriteXdmf * XdmfSolFile2D = new WriteXdmf(ffname->c_str(),nt,nv); XdmfSolFile2D->WriteXdmfSolFile2DInit(); for (size_t i=0;i( (*(l[i].lename))(stack) ); XdmfSolFile2D->WriteXdmfSolFile2DAddField(datafieldname, (l[i].what-1), resultorder, trans); } XdmfSolFile2D->WriteXdmfSolFile2DFinalize(); delete XdmfSolFile2D; //write hdf5 sol file WriteHdf5 * Hdf5SolFile2D = new WriteHdf5(ffname->c_str(),nt,nv); Hdf5SolFile2D->WriteHdf5SolFile2DInit(); solnbfloat=0; for (size_t ii=0;ii( (*(l[ii].lename))(stack) ); if(resultorder==0) { // ordre 0 // a priori la solution est par triangle //Hyp A int trans=-1; if(l[ii].nbfloat==2) { trans=3; } else { trans=l[ii].nbfloat; } //initialisation a 0 du field tab float *tab_vfield; tab_vfield = new float[nt * trans]; memset(tab_vfield, 0, sizeof(float) * nt * trans); solnbfloat=l[ii].nbfloat; nbsol = nt; KN valsol(solnbfloat*nbsol); MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); //boucle sur les triangles for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); //boucle sur chaque champ des triangles for(size_t i=0;iWriteHdf5SolFile2DAddField(datafieldname, resultorder, trans, (l[ii].what-1),tab_vfield); delete [] tab_vfield; } else { //Hyp A int trans=-1; if(l[ii].nbfloat==2) { trans=3; } else { trans=l[ii].nbfloat; } //initialisation a 0 du field tab float *tab_vfield; tab_vfield = new float[nv * trans]; memset(tab_vfield, 0, sizeof(float) * nv * trans); solnbfloat=l[ii].nbfloat; nbsol = nv; KN valsol(solnbfloat*nbsol); valsol=0.; KN takemesh(nbsol); MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; //boucle sur les triangles for (int it=0;itsetP(&Th,it,iv); int h=0; for(size_t j=0;j<(unsigned int)l[ii].nbfloat;j++) { //calcul de la somme des valeurs du champ Ux (par exemple) sur un noeud //appartenant à plusieurs triangles //u_noeud_2_appartenant_au_triangle_0 + u_noeud_2_appartenant_au_triangle_23 + ... valsol[i*solnbfloat+h] = valsol[i*solnbfloat+h] + l[ii].eval(j,stack); h=h+1; } assert(solnbfloat==h); takemesh[i] = takemesh[i]+1; } } for(int i=0; i10) { for (int m=0;m<(solnbfloat*nbsol);m++) cout << "valsol[m] hdf5 solution : "<< valsol[m] << " for lii : " << ii << endl; } Hdf5SolFile2D->WriteHdf5SolFile2DAddField(datafieldname, resultorder, trans, (l[ii].what-1),tab_vfield); delete [] tab_vfield; } } Hdf5SolFile2D->WriteHdf5SolFile2DFinalize(); delete Hdf5SolFile2D; return longdefault; }; //datasolMesh3 template class datasolHDF5Mesh3_Op : public E_F0mps { public: typedef long Result; Expression eTh; Expression filename; struct Expression2 { long what; // 1 scalar, 2 vector, 3 symtensor long nbfloat; // 1 scalar, 3 vector (3D), 6 symtensor(3D) Expression e[6]; Expression lename; Expression2() { e[0]=0; e[1]=0; e[2]=0; e[3]=0; e[4]=0; e[5]=0; what=0; nbfloat=0; }; Expression &operator[](int i) { return e[i]; } double eval(int i,Stack stack) const { if (e[i]) { return GetAny< double >( (*e[i])(stack) ); } else return 0; } }; vector l; static const int n_name_param =1; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a ) const { return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a; } public: datasolHDF5Mesh3_Op(const basicAC_F0 & args) : l((args.size()-2)/2 ) { int nbofsol; int ddim=3; int stsize=6; cout << " " << endl; if(debug==1) { cout << "construction data hdf5 solution avec datasolHDF5Mesh3_Op" << endl; cout << "taille de args " << args.size() << endl; } args.SetNameParam(n_name_param,name_param,nargs); if (BCastTo(args[0])) filename = CastTo(args[0]); if (BCastTo(args[1])) eTh= CastTo(args[1]); nbofsol = l.size(); if(verbosity > 1) { cout << "hdf5 solution 3d nb sol: "<< nbofsol << endl; } size_t kk=0; for (size_t i=2;i<(unsigned int)args.size();i=i+2) { size_t jj=i-2-kk; if ( BCastTo(args[i])) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); if(verbosity > 9) { cout << "hdf5 solution 3d N° " << jj << " is scalar type " << endl; } } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); if (a0->size() != ddim && a0->size() != stsize) { CompileError("savesol in 3D: vector solution is 3 composant, tensor solution is 6 composant"); } if( a0->size() == ddim) { // vector solution if(verbosity > 9) { cout << "hdf5 solution 3d N° " << jj << " is vector type" << endl; } l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize) { // symmetric tensor solution if(verbosity > 9) { cout << "hdf5 solution 3d N° " << jj << " is tensor type" << endl; } l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } } } else { CompileError("savesol in 3D: Sorry no way to save this kind of data"); } if (BCastTo(args[i+1])) l[jj].lename = CastTo(args[i+1]); kk++; } } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), true); } static E_F0 * f(const basicAC_F0 & args) { return new datasolHDF5Mesh3_Op(args); } AnyType operator()(Stack stack) const ; }; template basicAC_F0::name_and_type datasolHDF5Mesh3_Op::name_param[]= { { "order",&typeid(long)} }; template AnyType datasolHDF5Mesh3_Op::operator()(Stack stack) const { Mesh3 * pTh= GetAny((*eTh)(stack)); string * ffname= GetAny( (*filename)(stack) ); ffassert(pTh); Mesh3 &Th=*pTh; int trans=-1; int nt = Th.nt; int nv = Th.nv; int nbsol; int solnbfloat; int resultorder= arg(0, stack, 1); long longdefault = 0; string * datafieldname; if(verbosity>2) { cout << "filename data hdf5 solution () : "<< ffname << endl; cout << "hdf5 solution () nb vertices: "<< nv << endl; cout << "hdf5 solution () nb tetrahedrons: "<< nt << endl; cout << "hdf5 solution () nb of fields: "<< l.size() << endl; } //write xdmf sol file WriteXdmf * XdmfSolFile3D = new WriteXdmf(ffname->c_str(),nt,nv); XdmfSolFile3D->WriteXdmfSolFile3DInit(); for (size_t i=0;i( (*(l[i].lename))(stack) ); XdmfSolFile3D->WriteXdmfSolFile3DAddField(datafieldname, (l[i].what-1), resultorder, trans); } XdmfSolFile3D->WriteXdmfSolFile3DFinalize(); delete XdmfSolFile3D; //write hdf5 sol file WriteHdf5 * Hdf5SolFile3D = new WriteHdf5(ffname->c_str(),nt,nv); Hdf5SolFile3D->WriteHdf5SolFile3DInit(); solnbfloat=0; for (size_t ii=0;ii( (*(l[ii].lename))(stack) ); trans=l[ii].nbfloat; if(resultorder==0) { // Tetrahedra // ordre 0 float *tab_vfield; tab_vfield = new float[nt * trans]; memset(tab_vfield, 0, sizeof(float) * nt * trans); solnbfloat=l[ii].nbfloat; nbsol = nt; KN valsol(solnbfloat*nbsol); MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); //boucle sur les tetrahedres for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); //boucle sur chaque champ des tetrahedres for(size_t i=0;iWriteHdf5SolFile3DAddField(datafieldname, resultorder, trans, (l[ii].what-1),tab_vfield); delete [] tab_vfield; } if(resultorder==1) { //ordre 1 float *tab_vfield; tab_vfield = new float[nv * trans]; memset(tab_vfield, 0, sizeof(float) * nv * trans); solnbfloat=l[ii].nbfloat; nbsol = nv; KN valsol(solnbfloat*nbsol); KN takemesh(nbsol); MeshPoint *mp3(MeshPointStack(stack)); //R3 Cdg_hat = R3(1./4.,1./4.,1./4.); takemesh=0; //boucle sur les tetrahedres for (int it=0;itsetP(&Th,it,iv); int h=0; for(size_t j=0;j<(unsigned int)l[ii].nbfloat;j++) { valsol[i*solnbfloat+h] = l[ii].eval(j,stack); h=h+1; } assert(solnbfloat==h); takemesh[i] = takemesh[i]+1; } } } for(int i=0; i9) { for (int m=0;m<(solnbfloat*nbsol);m++) cout << "valsol[m] hdf5 solution : "<< valsol[m] << " for lii : " << ii << endl; } Hdf5SolFile3D->WriteHdf5SolFile3DAddField(datafieldname, resultorder, trans, (l[ii].what-1),tab_vfield); delete [] tab_vfield; } } Hdf5SolFile3D->WriteHdf5SolFile3DFinalize(); delete Hdf5SolFile3D; return longdefault; } /* class Init { public: Init(); }; $1 */ static void Load_Init(){ cout << " " << endl; cout << " ---------------------- " << endl; typedef Mesh *pmesh; typedef Mesh3 *pmesh3; if (verbosity>2) cout << " load:popen.cpp " << endl; // 2D Global.Add("savehdf5sol","(",new OneOperatorCode ); // 3D Global.Add("savehdf5sol","(",new OneOperatorCode< datasolHDF5Mesh3_Op >); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/iovtk.cpp000644 000767 000024 00000334126 12466661714 020353 0ustar00hechtstaff000000 000000 // ORIG-DATE: September 2009 // -*- Mode : c++ -*% // // SUMMARY : READ/WRITE MESH AND SOLUTION IN FORMAT VTK // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the #License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ // FH July 2009 // comment all // Th3_t->BuildBound(); // Th3_t->BuildAdj(); // Th3_t->Buildbnormalv(); // Th3_t->BuildjElementConteningVertex(); // is now in the constructor of Mesh3 to be consistante. // FH nev 2009 // correct gestion of nameofuser variable // JM :: VTU extension file #include #include #include #include using namespace std; using namespace std; #include "error.hpp" #include "AFunction.hpp" using namespace std; #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include "Operator.hpp" #include "lex.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" //#include "LayerMesh.hpp" //#include "TransfoMesh_v2.hpp" #include "msh3.hpp" //#include "GQuadTree.hpp" //#include "lex.hpp" #include #include #include #include using namespace Fem2D; static const char* EncodeB64_LoopByte ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ "; static const char* EncodeB64_Mul4Byte ="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZaaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz0000111122223333444455556666777788889999++++//// "; // ===================== // Test for BigEndian // ===================== bool isBigEndian() { const int i=1; char *c=(char *)&i; if (c[sizeof(int)-1]==0) return false; else return true; } void encodeB64_3Bytes(unsigned char *in3Bytes, unsigned char *out4Bytes) { if (in3Bytes==NULL || out4Bytes==NULL) return; out4Bytes[0]=EncodeB64_Mul4Byte[in3Bytes[0]]; out4Bytes[1]=EncodeB64_LoopByte[((in3Bytes[0]&0x03)<<4)+ ((in3Bytes[1]&0xf0)>>4)]; out4Bytes[2]=EncodeB64_LoopByte[((in3Bytes[1]&0x0f)<<2)+ ((in3Bytes[2]&0xc0)>>6)]; out4Bytes[3]=EncodeB64_LoopByte[in3Bytes[2]]; } // =========================== // // =========================== int encodeB64(int n, unsigned char *inBytes, unsigned char *outBytes) { if (inBytes==NULL || outBytes==NULL || n<=0) return 0; int m=n-(n%3); int ii, jj; jj=0; for ( ii=0; ii0){ l=encodeB64(nbcached,charCache,outBytes); nbcached=0; } } else{ // bytes are given :: if (nbcached>0) { // give chars to the Cache if (nn>0) { charCache[nbcached++]=inBytes[nbcachedInBytes]; nbcachedInBytes++; nn--; } if(nbcached<3 && nn>0) { charCache[nbcached++]=inBytes[nbcachedInBytes]; nbcachedInBytes++; nn--; } if(nbcached==3) { // the cache is filled :: encode bytes l=encodeB64(nbcached,charCache,outBytes); outBytes+=l; nbcached=0; } } if(nn==0) return l; unsigned char *newInBytes = &inBytes[nbcachedInBytes]; //unsigned char *newOutBytes = &outBytes[l]; int m=nn-nn%3; if( nn==m) { l+=encodeB64(nn,newInBytes,outBytes); return l; } // cache left overs charCache[nbcached++]=newInBytes[m]; if (m+1size()+1]); strcpy(r, s->c_str() ); return r; } // Tables of element type of VTK considered in Freefem++ static const int nvElemVTK[25] = { 1, 0, 2, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // we considerer only vertex, edges, triangles and tetrahedrons in Freefem++ // 1 :: Vertex Corner // 3 :: Edge/line // 5 :: triangles // 10 :: tetrahedrons enum FFppCells{VTK_EDGE=3, VTK_TRI=5, VTK_TET=10}; static const int NbColorTable=30; // Table of colors for Labels of elements :: RGB static const float ColorTable[30][3] = { {1.0,0.0,0.0}, /* red */ {1.0,1.0,0.0}, /* yellow */ {1.0,0.0,1.0}, /* ???? */ {0.0,1.0,0.0}, /* green */ {0.0,1.0,1.0}, /* cyan */ {0.0,0.0,1.0}, /* blue */ {1.0, 0.5, 0.0}, /* orange */ {0.5, 0.0, 1.0}, /* violet */ {1.0, 0.0, 0.5}, /* ??? */ {0.5, 1.0, 0.0}, /* ??? */ {0.0, 1.0, 0.5}, /* ??? */ {0.0, 0.5, 1.0}, /* ??? */ {1.0, 0.5, 0.5}, /* ??? */ {1.0, 1.0, 0.5}, /* ??? */ {1.0, 0.5, 1.0}, /* ??? */ {0.5, 1.0, 0.5}, /* ??? */ {0.5, 1.0, 1.0}, /* ??? */ {0.5, 0.5, 1.0}, /* ??? */ {0.4, 0.0, 0.0}, /* dark blue */ {0.4, 0.4, 0.0}, /* dark yellow */ {0.4, 0.0, 0.4}, /* dark ???? */ {0.0, 0.4, 0.0}, /* dark green */ {0.0, 0.4, 0.4}, /* dark cyan */ {0.0, 0.0, 0.4}, /* dark blue */ {0.8, 0.0, 0.0}, /* ??? */ {0.8, 0.8, 0.0}, /* ??? */ {0.8, 0.0, 0.8}, /* ??? */ {0.0, 0.8, 0.0}, /* ??? */ {0.0, 0.8, 0.8}, /* ??? */ {0.0, 0.0, 0.8}, /* ??? */ }; // a voir F.Hecht void SwapBytes(char *array, int size, int n) { char *x = new char[size]; for(int i = 0; i < n; i++) { char *a = &array[i * size]; memcpy(x, a, size); for(int c = 0; c < size; c++) a[size - 1 - c] = x[c]; } delete [] x; } //============================================== // Fichier Format .vtu //============================================== // general functions void VTU_BEGIN( FILE *fp ){ string version="1.0"; fprintf(fp,"\n",version.c_str()); } void VTU_VTKFILE( FILE *fp, bool bigEndian){ string type("UnstructuredGrid"); string byte_big("BigEndian"); string byte_little("LittleEndian"); string version("0.1"); fprintf(fp,"\n",byte_big.c_str()); else fprintf(fp," byte_order=\"%s\">\n", byte_little.c_str()); //fprintf(fp,"<%s>\n",type.c_str()); } void VTU_PIECE( FILE *fp, const int &nv, const int &nc){ fprintf(fp,"\n",nv,nc); } void VTU_DATA_ARRAY( FILE *fp, const string &type,const string &name,bool binary){ fprintf(fp,"\n"); } void VTU_DATA_ARRAY( FILE *fp, const string &type,const string &name,const long &noc,bool binary){ fprintf(fp,"\n"); } void BEGINTYPE_VTU( FILE *fp, string begintype){ fprintf(fp,"<%s>\n",begintype.c_str()); } void ENDTYPE_VTU( FILE *fp , string endtype){ fprintf(fp,"\n",endtype.c_str()); } void VTU_WRITE_MESH( FILE *fp, const Mesh &Th, bool binary, int datasize, bool surface, bool bigEndian){ int nc,nv,nconnex; if(surface) nc=Th.nt+Th.neb; else nc=Th.nt; if(surface) nconnex=3*Th.nt+2*Th.neb; else nconnex=3*Th.nt; unsigned char ElementChars[256]; fprintf(fp,"\n"); fprintf(fp,"\n"); else fprintf(fp," byte_order=\"LittleEndian\">\n"); fprintf(fp,"\n"); fprintf(fp,"\n",Th.nv,nc); fprintf(fp,"\n"); fprintf(fp,"\n "); { unsigned nbytes= 3*Th.nv*sizeof(float); int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (long i=0; i\n"); for (long i=0; i\n"); fprintf(fp,"\n"); fprintf(fp,"\n"); delete [] coord; long *ien= new long[nconnex]; for (long it=0; it\n "); unsigned nbytes= nconnex*sizeof(int); int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (long i=0; i\n"); for (long i=0; i\n"); delete [] ien; fprintf(fp,"\n "); { unsigned nbytes= nc*sizeof(int); int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); long nelem=3; for (long i=nelem; i <= nelem*Th.nt; i+=nelem){ l=runEncodeB64(sizeof(int),(unsigned char *)&i,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } if(surface){ nelem=2; for (long i=nelem+3*Th.nt; i <= nelem*Th.neb+3*Th.nt; i+=nelem){ l=runEncodeB64(sizeof(int),(unsigned char *)&i,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } // flush buffer l=runEncodeB64(0,NULL,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } else{ fprintf(fp,"format=\"ascii\" >\n"); long nelem=3; for (long i=nelem; i <= nelem*Th.nt; i+=nelem){ fprintf(fp,"%ld ",i); } if(surface){ nelem=2; for (long i=nelem; i <= nelem*Th.neb; i+=nelem){ fprintf(fp,"%ld ",i+3*Th.nt); } } } fprintf(fp,"\n\n"); fprintf(fp,"\n "); { unsigned nbytes= nc; int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (long i=0; i\n"); for (long i=0; i\n"); fprintf(fp,"\n"); //fprintf(fp,"\n"); //fprintf(fp,"\n"); //fprintf(fp,"\n"); } void VTU_WRITE_MESH( FILE *fp, const Mesh3 &Th, bool binary, int datasize, bool surface, bool bigEndian){ int nc,nv,nconnex; if(surface) nc=Th.nt+Th.nbe; else nc=Th.nt; if(surface) nconnex=4*Th.nt+3*Th.nbe; else nconnex=4*Th.nt; unsigned char ElementChars[256]; fprintf(fp,"\n"); fprintf(fp,"\n"); else fprintf(fp," byte_order=\"LittleEndian\">\n"); fprintf(fp,"\n"); fprintf(fp,"\n",Th.nv,nc); fprintf(fp,"\n"); fprintf(fp,"\n "); { unsigned nbytes= 3*Th.nv*sizeof(float); int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (long i=0; i\n"); for (long i=0; i\n"); fprintf(fp,"\n"); fprintf(fp,"\n"); delete [] coord; long *ien= new long[nconnex]; for (long it=0; it\n "); unsigned nbytes= nconnex*sizeof(int); int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (long i=0; i\n"); for (long i=0; i\n"); delete [] ien; fprintf(fp,"\n "); { unsigned nbytes= nc*sizeof(int); int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); long nelem=4; for (long i=nelem; i <= nelem*Th.nt; i+=nelem){ l=runEncodeB64(sizeof(int),(unsigned char *)&i,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } if(surface){ nelem=3; for (long i=nelem+4*Th.nt; i <= nelem*Th.nbe+4*Th.nt; i+=nelem){ l=runEncodeB64(sizeof(int),(unsigned char *)&i,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } // flush buffer l=runEncodeB64(0,NULL,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } else{ fprintf(fp,"format=\"ascii\" >\n"); long nelem=4; for (long i=nelem; i <= nelem*Th.nt; i+=nelem){ fprintf(fp,"%ld ",i); } if(surface){ nelem=3; for (long i=nelem+4*Th.nt; i <= nelem*Th.nbe+4*Th.nt; i+=nelem){ fprintf(fp,"%ld ",i); } } } fprintf(fp,"\n\n"); fprintf(fp,"\n "); { unsigned nbytes= nc; int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (long i=0; i\n"); for (long i=0; i\n"); fprintf(fp,"\n"); //fprintf(fp,"\n"); //fprintf(fp,"\n"); //fprintf(fp,"\n"); } /* void VTU_WRITE_MESH( FILE *fp, const Mesh3 &Th, bool binary, int datasize, bool surface, bool bigEndian){ int nc,nv; if(surface) nc=Th.nt+Th.nbe; else nc=Th.nt; // Mesh // Vertex coordinates BEGINTYPE_VTU( fp, "Points"); if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", "Points", 3 ,binary); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", "Points", 3 ,binary); } // write coordinate of vertices :: the same as extension .vtk if(datasize == sizeof(float)){ for(unsigned int i = 0; i < Th.nv; i++){ const Vertex3 & P = Th.vertices[i]; float f[3]; f[0]=P.x; f[1]=P.y; f[2]=P.z; if(binary){ if(!bigEndian) SwapBytes((char*)&f, sizeof(float), 3); fwrite(&f, sizeof(float), 3, fp); } else{ fprintf(fp,"%f %f %f\n",f[0],f[1],f[2]); } } } else if(datasize == sizeof(double)){ for(unsigned int i = 0; i < Th.nv; i++){ const Vertex3 & P = Th.vertices[i]; double f[3]; f[0]=P.x; f[1]=P.y; f[2]=P.z; if(binary){ if(!bigEndian) SwapBytes((char*)&f, sizeof(double), 3); fwrite(&f, sizeof(double), 3, fp); } else{ fprintf(fp,"%lf %lf %lf\n",f[0],f[1],f[2]); } } } if(binary) fprintf(fp,"\n"); ENDTYPE_VTU( fp, "DataArray"); ENDTYPE_VTU( fp, "Points"); // Elemenents BEGINTYPE_VTU( fp, "Cells"); VTU_DATA_ARRAY( fp, "Int32", "connectivity" , binary); // rgmin=0 ; rgmax=nc-1; // begin :: connectivit des elements if(binary){ int IntType=4; if(verbosity > 1) printf("writting tetrahedre elements \n"); for(int it=0; it< Th.nt; it++){ const Tet & K( Th.elements[it] ); int iv[IntType]; for(int ii=0; ii 1) printf("writting border elements \n"); IntType=3; for(int ibe=0; ibe 1) printf("writting tetrahedrons elements \n"); for(int it=0; it< Th.nt; it++){ const Tet &K( Th.elements[it] ); int iv[IntType]; for(int ii=0; ii 1) printf("writting border elements \n"); IntType=3; for(int ibe=0; ibe(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new VTK_LoadMesh_Op( args,t[0]->CastTo(args[0]) ); } }; Mesh * VTK_Load(const string & filename, bool bigEndian) // swap = bigEndian or not bigEndian { // variable freefem++ int nv, nt=0, nbe=0; int nerr=0; Mesh::Vertex *vff; map mapnumv; // Reading Mesh in vtk formats FILE *fp = fopen(filename.c_str(), "rb"); if(!fp){ cerr << "Unable to open file " << filename.c_str() << endl; exit(1); } char buffer[256], buffer2[256]; fgets(buffer, sizeof(buffer), fp); // version line fgets(buffer, sizeof(buffer), fp); // title fscanf(fp, "%s", buffer); // ASCII or BINARY bool binary = false; if(!strncmp(buffer, "BINARY",6)) binary = true; if(fscanf(fp, "%s %s", buffer, buffer2) != 2) { cerr << "error in reading vtk files" << filename << endl; ExecError("load vtk files"); } if(strcmp(buffer, "DATASET") || strcmp(buffer2, "UNSTRUCTURED_GRID")){ cout << "VTK reader can only read unstructured datasets" << endl; ExecError("load vtk files"); exit(1); } // read mesh vertices if(fscanf(fp, "%s %d %s\n", buffer, &nv, buffer2) != 3) { cout << "error in reading vtk files" << endl; ExecError("load vtk files reah vertices"); exit(1); } if(strcmp(buffer, "POINTS") || !nv){ cerr << "No points in dataset" << endl; ExecError("load vtk files: No points in dataset"); exit(1); } int datasize; if(!strncmp(buffer2, "double",6)) datasize = sizeof(double); else if(!strncmp(buffer2, "float",5)) datasize = sizeof(float); else { cout <<"VTK reader only accepts float or double datasets" << endl; ExecError("load vtk files VTK reader only accepts float or double datasets"); exit(1); } if(verbosity>1) cout << " vtkio: Reading %d points" << nv << endl; vff = new Mesh::Vertex[nv]; for(int i = 0 ; i < nv; i++){ double xyz[3]; if(binary){ if(datasize == sizeof(float)){ float f[3]; if(fread(f, sizeof(float), 3, fp) != 3){ ExecError("load vtk files VTK reader only accepts float or double datasets"); ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)f, sizeof(float), 3); for(int j = 0; j < 3; j++) xyz[j] = f[j]; } else{ if(fread(xyz, sizeof(double), 3, fp) != 3) { cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)xyz, sizeof(double), 3); } } else{ if(fscanf(fp, "%lf %lf %lf", &xyz[0], &xyz[1], &xyz[2]) != 3){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } } vff[i].x = xyz[0]; vff[i].y = xyz[1]; if( abs(xyz[2]) > 1.e-7){ cout << "we are plotted a two dimensional mesh: z coordinate must be 0" << endl; ExecError("error in reading vtk file,we are plotted a two dimensional mesh: z coordinate must be 0"); } vff[i].lab = 1; } // read mesh elements int numElements, numElements2, totalNumInt; if(fscanf(fp, "%s %d %d\n", buffer, &numElements, &totalNumInt) != 3){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(strcmp(buffer, "CELLS") || !numElements){ cout << "No cells in dataset" << endl; ExecError("error in reading vtk file"); } cout << "Reading cells" << numElements << endl; int *IntCells = new int[totalNumInt-numElements]; int *firstCell = new int[numElements+1]; int *TypeCells = new int[numElements]; int numIntCells = 0; for(unsigned int i = 0; i < numElements; i++){ int numVerts, n[100]; for(int ii = 0; ii < 100; ii++) n[ii]=-1; if(binary){ if( fread(&numVerts, sizeof(int), 1, fp) != 1 ) { cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } if( !bigEndian) SwapBytes((char*)&numVerts, sizeof(int), 1); if((int)fread(n, sizeof(int), numVerts, fp) != numVerts){ cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)n, sizeof(int), numVerts); } else{ if(fscanf(fp, "%d", &numVerts) != 1){ cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } for(int j = 0; j < numVerts; j++){ if(fscanf(fp, "%d", &n[j]) != 1){ cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } } } firstCell[i] = numIntCells; for(int j = 0; j < numVerts; j++){ if(n[j] >= 0 && n[j] < nv){ IntCells[numIntCells] = n[j]; numIntCells++; } else{ cout << "Bad vertex index" << endl; ExecError("error in reading vtk file"); } } } firstCell[numElements] = totalNumInt-numElements; if(fscanf(fp, "%s %d\n", buffer, &numElements2) != 2){ cout << " Error in reading CELL_TYPES ARGUMENT " << endl; ExecError("error in reading vtk file"); } if(strcmp(buffer, "CELL_TYPES") || numElements2 != (int)numElements){ cout <<"No or invalid number of cells types" << endl; ExecError("error in reading vtk file"); } // 2D for(unsigned int i = 0; i < numElements; i++){ int type; if(binary){ if(fread(&type, sizeof(int), 1, fp) != 1){ cout <<"bug in readings cell types" << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)&type, sizeof(int), 1); } else{ if(fscanf(fp, "%d", &type) != 1){ cout <<"bug in readings cell types" << endl; ExecError("error in reading vtk file"); } } TypeCells[i] = type; switch(type){ case 1: // Vertex if(nerr++<10 && verbosity ) cout << "this type of cell (vertex) is not taking account in Freefem++ " << type << endl; break; case 3: // Edge/line nbe++; // 2D break; case 5: // Triangle nt++; // 2D break; case 10: // Tetrahdre cout << "We are loading a three dimensional mesh. Three is no tetrahedron." << endl; ExecError("error in reading vtk file"); break; default: cout << "Error :: This type of cell is not considered in Freefem++ "<< type << endl; ExecError("error in reading vtk file"); break; } } fclose(fp); // 2D Versions Mesh::Triangle *tff; if(nt>0) tff = new Mesh::Triangle[nt]; Mesh::Triangle *ttff = tff; Mesh::BorderElement *bff; if(nbe>0) bff= new Mesh::BorderElement[nbe]; Mesh::BorderElement *bbff = bff; for(unsigned int i = 0; i < numElements; i++){ int type=TypeCells[i]; int iv[3]; int label=1; switch(type){ case 1: // Vertex if(nerr++<10 && verbosity ) cout << "this type of cell (vertex) is not taking account in Freefem++ " << type << " " << endl; break; case 3: // Edge/line assert( (firstCell[i+1]-firstCell[i]) == 2 ); for(int j=firstCell[i]; jset(vff, iv[0], iv[1], label); break; case 5: // Triangle assert( (firstCell[i+1]-firstCell[i]) == 3 ); for(int j=firstCell[i]; jset(vff, iv[0], iv[1], iv[2], label); break; default: break; } } delete [] IntCells; delete [] firstCell; delete [] TypeCells; Mesh *pTh = new Mesh(nv,nt,nbe,vff,tff,bff); return pTh; } AnyType VTK_LoadMesh_Op::operator()(Stack stack) const { string * pffname= GetAny((*filename)(stack)); bool swap = false; int reftri = 1; int refedges = 1; if( nargs[0] ) reftri = GetAny((*nargs[0])(stack)); if( nargs[1] ) swap = GetAny< bool >((*nargs[1])(stack)); if( nargs[2] ) refedges = GetAny((*nargs[2])(stack)); string *DataLabel; if( nargs[3] ) DataLabel = GetAny((*nargs[3])(stack)); Mesh * Th = VTK_Load( *pffname , swap); // A faire fonction pour changer le label Add2StackOfPtr2FreeRC(stack,Th); return Th; } //============================================== // ECRITURE DE FICHIER .vtk //============================================== class VTK_WriteMesh_Op : public E_F0mps { public: typedef long Result; Expression eTh; Expression filename; struct Expression2 { string name; long what; // 1 scalar, 2 vector, 3 symtensor long nbfloat; // 1 scalar, 2 vector (3D), 3 symtensor(3D) Expression e[3]; Expression2() {e[0]=0; e[1]=0; e[2]=0; what=0; nbfloat=0; }; Expression &operator[](int i){return e[i];} double eval(int i,Stack stack) const { if (e[i]) { return GetAny< double >( (*e[i])(stack) ); } else return 0; } void writesolutionP0_float_binary( FILE *fp, const Mesh &Th, Stack stack, bool surface, bool bigEndian) const { MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); if(!bigEndian) SwapBytes((char*)&value, sizeof(float), 1); fwrite(&value, sizeof(float), 1, fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); if(!bigEndian) SwapBytes((char*)&value, sizeof(float), 1); fwrite(&value, sizeof(float), 1, fp); } } } fprintf(fp,"\n"); } void writesolutionP0_float( FILE *fp, const Mesh &Th, Stack stack, bool surface) const { MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); fprintf(fp,"%.8e ",value); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); fprintf(fp,"%.8e ",value); } } } fprintf(fp,"\n"); } void writesolutionP0_float_XML( FILE *fp, const Mesh &Th, Stack stack, bool surface) const { MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); unsigned char ElementChars[256]; long nc=Th.nt; if(surface) nc=nc+Th.neb; unsigned nbytes= nc*sizeof(float)*(*this).nbfloat; int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); l=runEncodeB64(sizeof(float),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); l=runEncodeB64(sizeof(float),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } } // flush buffer l=runEncodeB64(0,NULL,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); fprintf(fp,"\n"); } void writesolutionP0_float( FILE *fp, const Mesh &Th, Stack stack, bool surface, bool binary, bool bigEndian, bool XML=false) const { if(binary){ if(!XML){ (*this).writesolutionP0_float_binary( fp, Th, stack, surface, bigEndian); } else (*this).writesolutionP0_float_XML( fp, Th, stack, surface ); } else (*this).writesolutionP0_float( fp, Th, stack, surface ); } void writesolutionP0_double_binary( FILE *fp, const Mesh &Th, Stack stack, bool surface, bool bigEndian) const { MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); if(!bigEndian) SwapBytes((char*)&value, sizeof(double), 1); fwrite(&value, sizeof(double), 1, fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); if(!bigEndian) SwapBytes((char*)&value, sizeof(double), 1); fwrite(&value, sizeof(double), 1, fp); } } } fprintf(fp,"\n"); } void writesolutionP0_double( FILE *fp, const Mesh &Th, Stack stack, bool surface) const { MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); unsigned char ElementChars[256]; for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); fprintf(fp,"%.16e ",value); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); fprintf(fp,"%.16e ",value); } } } fprintf(fp,"\n"); } void writesolutionP0_double_XML( FILE *fp, const Mesh &Th, Stack stack, bool surface) const { unsigned char ElementChars[256]; MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); long nc=Th.nt; if(surface) nc=nc+Th.neb; unsigned nbytes= nc*sizeof(double)*(*this).nbfloat; int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); l=runEncodeB64(sizeof(double),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); l=runEncodeB64(sizeof(double),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } } // flush buffer l=runEncodeB64(0,NULL,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); fprintf(fp,"\n"); } void writesolutionP0_double( FILE *fp, const Mesh &Th, Stack stack, bool surface, bool binary, bool bigEndian, bool XML=false) const { if(binary){ if(!XML){ (*this).writesolutionP0_double_binary( fp, Th, stack, surface, bigEndian); } else (*this).writesolutionP0_double_XML( fp, Th, stack, surface ); } else (*this).writesolutionP0_double( fp, Th, stack, surface ); } void writesolutionP1_float( FILE *fp, const Mesh &Th, Stack stack,bool binary,bool bigEndian,bool XML=false) const { unsigned char ElementChars[256]; MeshPoint *mp3(MeshPointStack(stack)); KN valsol(Th.nv*(*this).nbfloat); KN takemesh(Th.nv); takemesh =0; valsol =0.; for(int it=0; itsetP(&Th,it,iv); for(int j=0;j<(*this).nbfloat;j++){ valsol[ i*(*this).nbfloat+j ] = valsol[ i*(*this).nbfloat+j ] + (*this).eval(j,stack); } takemesh[i] = takemesh[i]+1; } } if(binary){ if( !XML ){ if( !bigEndian){ for (int iv=0;iv valsol(Th.nv*(*this).nbfloat); KN takemesh(Th.nv); takemesh =0; valsol =0.; for(int it=0; itsetP(&Th,it,iv); for(int j=0;j<(*this).nbfloat;j++){ valsol[ i*(*this).nbfloat+j ] = valsol[ i*(*this).nbfloat+j ] + (*this).eval(j,stack); } takemesh[i] = takemesh[i]+1; } } if(binary){ if( !XML ){ if( !bigEndian ){ for (int iv=0;iv l; static const int n_name_param = 7; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: VTK_WriteMesh_Op(const basicAC_F0 & args) : l( args.size()-2 ) { int nbofsol; int ddim=2; int stsize=3; int sca=0,vec=0,ten=0; string scas("scalaire"); string vecs("vector"); string tens("tensor"); if(verbosity) cout << "Write Mesh and Solutions in VTK Formats" << endl; args.SetNameParam(n_name_param,name_param,nargs); if (BCastTo(args[0])) filename = CastTo(args[0]); if (BCastTo(args[1])) eTh= CastTo(args[1]); nbofsol = l.size(); for (size_t i=2;i( args[i] )) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); char number[16]; sprintf(number,"%li",jj+1); l[jj].name=scas; l[jj].name+=number; sca++; } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); //cout << "taille" << a0->size() << endl; if (a0->size() != ddim && a0->size() != stsize) CompileError("savesol in 2D: vector solution is 2 composant, tensor solution is 3 composant"); if( a0->size() == ddim){ // vector solution l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } char number[16]; sprintf(number,"%li",jj+1); l[jj].name=vecs; l[jj].name+=number; vec++; } else if( a0->size() == stsize){ // symmetric tensor solution l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } char number[16]; sprintf(number,"%li",jj+1); l[jj].name=tens; l[jj].name+=number; ten++; } } else { cout << " arg " << i << " " << args[i].left() << endl; CompileError("save solution in 2D in format VTK: Sorry no way to save this kind of data"); } } } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new VTK_WriteMesh_Op(args);} AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type VTK_WriteMesh_Op::name_param[]= { { "dataname", &typeid(string*)}, { "withsurfacemesh", &typeid(bool)}, { "order", &typeid(KN_)}, // A rajouter dans le 3D { "floatmesh", &typeid(bool)}, { "floatsol", &typeid(bool)}, { "bin", &typeid(bool)}, { "swap", &typeid(bool)} }; void VTK_WRITE_MESH( const string &filename, FILE *fp, const Mesh &Th, bool binary, int datasize, bool surface, bool bigEndian){ fprintf(fp, "# vtk DataFile Version 2.0\n"); fprintf(fp, "%s, Created by Freefem++ \n", filename.c_str()); if(binary) fprintf(fp, "BINARY\n"); else fprintf(fp, "ASCII\n"); fprintf(fp, "DATASET UNSTRUCTURED_GRID\n"); // get all the entities in the model // write mesh vertices if(datasize == sizeof(float)) { fprintf(fp, "POINTS %d float\n", Th.nv); for(unsigned int i = 0; i < Th.nv; i++){ const Mesh::Vertex & P = Th.vertices[i]; float f[3]; f[0]=P.x; f[1]=P.y; f[2]=0; // P.z; 3D case if(binary){ if(!bigEndian) SwapBytes((char*)&f, sizeof(float), 3); fwrite( &f, sizeof(float), 3, fp); } else{ fprintf(fp,"%.8g %.8g %.8g\n",P.x,P.y,0.); } } } else if(datasize == sizeof(double)){ fprintf(fp, "POINTS %d double\n", Th.nv); for(unsigned int i = 0; i < Th.nv; i++){ const Mesh::Vertex & P = Th.vertices[i]; double f[3]; f[0]=P.x; f[1]=P.y; f[2]=0; // P.z; 3D case if(binary){ if(!bigEndian) SwapBytes((char*)&f, sizeof(double), 3); fwrite( (unsigned char*)&f, sizeof(double), 3, fp); } else{ fprintf(fp,"%.15lg %.15lg %.15lg\n",f[0],f[1],f[2]); } } } fprintf(fp,"\n"); if(verbosity > 1) printf("writting vertices is finish\n"); if(verbosity > 1) printf("writting elements now\n"); //================ // CELL //================ // loop over all elements we need to save and count vertices int numElements, totalNumInt; if(surface){ numElements = Th.nt+Th.neb; totalNumInt = Th.nt*3+Th.neb*2+numElements; } else{ numElements = Th.nt; totalNumInt = Th.nt*3+numElements; } if(verbosity > 1) printf("writting cells \n"); // print vertex indices in ascii or binary fprintf(fp, "CELLS %d %d\n", numElements, totalNumInt); if(binary){ int IntType=3; if(verbosity > 1) printf("writting triangle elements \n"); for(int it=0; it< Th.nt; it++){ const Mesh::Triangle & K( Th.t(it) ); int iv[IntType+1]; iv[0] = IntType; for(int ii=0; ii 1) printf("writting edge elements \n"); IntType=2; for(int ibe=0; ibe 1) printf("writting triangle elements \n"); for(int it=0; it< Th.nt; it++){ const Mesh::Triangle &K( Th.t(it) ); int iv[IntType+1]; iv[0] = IntType; for(int ii=0; ii 1) printf("writting edge elements \n"); IntType=2; for(int ibe=0; ibe list_label_Elem; //list list_label_Border_Elem; { for(int it=0; it< Th.nt; it++){ const Mesh::Triangle &K( Th.t(it) ); list::const_iterator ilist; int labOk=0; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if( *ilist == K.lab ){ labOk = 1; break; } } if( labOk == 0){ list_label_Elem.push_back(K.lab); } } if(surface){ for(int ibe=0; ibe::const_iterator ilist; int labOk=0; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if( *ilist == K.lab ){ labOk = 1; break; } } if( labOk == 0){ list_label_Elem.push_back(K.lab); } } } } list_label_Elem.sort(); //================================= //================================= fprintf(fp, "CELL_DATA %d\n", numElements); int cell_fd=1; int cell_lab=1; /* fprintf(fp, "COLOR_SCALARS Label 4\n"); if(binary){ int label; for(int it=0; it< Th.nt; it++){ const Mesh::Triangle &K( Th.t(it) ); label =K.lab; if(!bigEndian) SwapBytes((char*)&label, sizeof(int), 1); fwrite(&label, sizeof(int), 1, fp); } if(surface){ for(int ibe=0; ibe::const_iterator ilist; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if( *ilist == K.lab ){ fprintf(fp,"%f %f %f 1.0\n",ColorTable[abs(*ilist)%NbColorTable][0], ColorTable[abs(*ilist)%NbColorTable][1], ColorTable[abs(*ilist)%NbColorTable][2]); break; } } } if(surface){ for(int ibe=0; ibe::const_iterator ilist; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if( *ilist == K.lab ){ fprintf(fp,"%f %f %f 1.0\n",ColorTable[abs(*ilist)%NbColorTable][0], ColorTable[abs(*ilist)%NbColorTable][1], ColorTable[abs(*ilist)%NbColorTable][2]); break; } } } } } fprintf(fp,"\n"); */ fprintf(fp, "Scalars Label int %d\n", cell_fd); fprintf(fp, "LOOKUP_TABLE FreeFempp_table\n"); // Determination des labels if(binary){ int label; for(int it=0; it< Th.nt; it++){ const Mesh::Triangle &K( Th.t(it) ); label =K.lab; if(!bigEndian) SwapBytes((char*)&label, sizeof(int), 1); fwrite(&label, sizeof(int), 1, fp); } if(surface){ for(int ibe=0; ibe::const_iterator ilist; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++) size_list++; fprintf(fp, "LOOKUP_TABLE FreeFempp_table %d\n",size_list); { list::const_iterator ilist; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if(binary){ int tab[4]; tab[0] = (int) ColorTable[abs(*ilist)%NbColorTable][0]*255; tab[1] = (int) ColorTable[abs(*ilist)%NbColorTable][1]*255; tab[2] = (int) ColorTable[abs(*ilist)%NbColorTable][2]*255; tab[3] = 255; for(int itab=0; itab<4; itab++){ char newvalue[sizeof(int)]; int bid0= sprintf(newvalue,"%s", (char*)&tab[itab]); fwrite( &newvalue, sizeof(unsigned char), 1, fp); } } else{ float tab[4]; tab[0] = ColorTable[abs(*ilist)%NbColorTable][0]; tab[1] = ColorTable[abs(*ilist)%NbColorTable][1]; tab[2] = ColorTable[abs(*ilist)%NbColorTable][2]; tab[3] = 1.; fprintf(fp,"%.8f %.8f %.8f %.8f\n",tab[0],tab[1],tab[2],tab[3]); } } } fprintf(fp,"\n"); } AnyType VTK_WriteMesh_Op::operator()(Stack stack) const { string * pffname= GetAny((*filename)(stack)); Mesh * pTh= GetAny((*eTh)(stack)); ffassert(pTh); Mesh &Th=*pTh; bool swap = false; bool bigEndian=true; bool binary = false; bool surface = true; bool floatmesh = true; bool floatsol = true; int datasize = sizeof(float); int datasizeSol = sizeof(float); string *dataname; int nbofsol = l.size(); KN order(nbofsol); char *nameofuser[nbofsol]; for(int ii=0; ii( (*nargs[0])(stack) ); if( nargs[1] ) surface = GetAny< bool >( (*nargs[1])(stack) ); if( nargs[2] ) order = GetAny< KN_ >( (*nargs[2])(stack) ); if( nargs[3] ) floatmesh = GetAny< bool >( (*nargs[3])(stack) ); if( nargs[4] ) floatsol = GetAny< bool >( (*nargs[4])(stack) ); if( nargs[5] ) binary = GetAny< bool >( (*nargs[5])(stack) ); if( nargs[6] ) bigEndian = GetAny< bool >( (*nargs[6])(stack) ); swap = bigEndian; if( !floatmesh ) datasize = sizeof(double); if( !floatsol ) datasizeSol= sizeof(double); int iii=0; if( nargs[0]) { //char *data = newcopy(dataname->c_str()); char *data = newcopy(dataname); char * name = strtok(data," \t\n"); nameofuser[iii] = newcopy(name); if(verbosity>5) cout << " iovtk : value of iii =" << iii << " \""<< nameofuser[iii] << "\"\n"; iii++; { while( (name = strtok(NULL," \t\n\0")) ){ if( iii >= nbofsol ){ if(verbosity>5) cout << " iovtk : The number of data name is too large " << endl; break; } nameofuser[iii] = newcopy(name); if(verbosity>5) cout << " iovtk : value of iii =" << iii << " \""<< nameofuser[iii] << "\"\n"; iii++; } if( iii < nbofsol){ if(verbosity>6) cout << " iovtk: The number of data name is too small, we give default name " << endl; } delete [] data; } } if( iii < nbofsol ){ for( int iiii=iii; iiii0){ fprintf(fp, "FIELD FieldData %d\n", Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ int nsol; if(surface){ nsol = Th.nt+Th.neb; } else{ nsol = Th.nt; } fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,nsol); // changement ecriture solution l[ii].writesolutionP0_float( fp, Th, stack, surface, binary, swap); } } } if( Norder0 < nbofsol ){ fprintf(fp, "POINT_DATA %d\n", Th.nv); fprintf(fp, "FIELD FieldData %d\n", nbofsol-Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1){ //fprintf(fp,"%s %d %d float\n",l[ii].name.c_str(),l[ii].nbfloat,Th.nv); fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,Th.nv); if(verbosity>5) cout << "name of data("<< ii <<")=" << nameofuser[ii] << " " << l[ii].name << endl; // changement ecriture solution l[ii].writesolutionP1_float( fp, Th, stack, binary, swap); } } } } if( datasizeSol == sizeof(double) ){ if( Norder0 >0){ fprintf(fp, "FIELD FieldData %d\n", Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ int nsol; if(surface){ nsol = Th.nt+Th.neb; } else{ nsol = Th.nt; } fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,nsol); // changement ecriture solution l[ii].writesolutionP0_double( fp, Th, stack, surface, binary, swap); } } if( Norder0 < nbofsol ){ fprintf(fp, "POINT_DATA %d\n", Th.nv); fprintf(fp, "FIELD FieldData %d\n", nbofsol-Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1){ fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,Th.nv); if(verbosity>5) cout << "name of data("<< ii <<")=" << nameofuser[ii] << endl; // changement ecriture solution l[ii].writesolutionP1_double( fp, Th, stack, binary, swap); } } } } } } else if( VTK_FILE == 2 ){ /* // Solution Order // order 1 if( Norder0 != nbofsol){ BEGINTYPE_VTU( fp, "PointData"); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1){ if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP1_float( fp, Th, stack, binary, swap); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP1_double( fp, Th, stack, binary, swap); } ENDTYPE_VTU( fp, "DataArray"); } } ENDTYPE_VTU( fp, "PointData"); } // order 0 if( Norder0 > 0 ){ BEGINTYPE_VTU( fp, "CellData"); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP0_float( fp, Th, stack, surface, binary, swap); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP0_double( fp, Th, stack, surface, binary, swap); } ENDTYPE_VTU( fp, "DataArray"); } } ENDTYPE_VTU( fp, "CellData"); } long offsetsol=0; bool encode64=0; */ VTU_WRITE_MESH( fp, Th, binary, datasize, surface, swap); // Solution Order // order 1 if( Norder0 != nbofsol){ BEGINTYPE_VTU( fp, "PointData"); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1){ if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP1_float( fp, Th, stack, binary, swap, 1); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP1_double( fp, Th, stack, binary, swap, 1); } ENDTYPE_VTU( fp, "DataArray"); } } ENDTYPE_VTU( fp, "PointData"); } // order 0 if( Norder0 > 0 ){ BEGINTYPE_VTU( fp, "CellData"); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP0_float( fp, Th, stack, surface, binary, swap, 1); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP0_double( fp, Th, stack, surface, binary, swap, 1); } ENDTYPE_VTU( fp, "DataArray"); } } ENDTYPE_VTU( fp,"CellData"); } fprintf(fp,"\n"); fprintf(fp,"\n"); fprintf(fp,"\n"); } else { cout << " iovtk extension file is not correct (" << VTK_FILE << " != 1 or 2 ) " << endl; ExecError(" iovtk : extension file"); } // close file fp fclose(fp); for( int iiii=0; iiii(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new VTK_LoadMesh3_Op( args,t[0]->CastTo(args[0]) ); } }; Mesh3 * VTK_Load3(const string & filename, bool bigEndian) // swap = bigEndian or not bigEndian { // variable freefem++ int nv, nt=0, nbe=0; int nerr=0; // Reading Mesh in vtk formats FILE *fp = fopen(filename.c_str(), "rb"); if(!fp){ cerr << "Unable to open file " << filename.c_str() << endl; ExecError("error in reading vtk file"); } char buffer[256], buffer2[256]; fgets(buffer, sizeof(buffer), fp); // version line fgets(buffer, sizeof(buffer), fp); // title fscanf(fp, "%s", buffer); // ASCII or BINARY bool binary = false; if( !strcmp(buffer, "BINARY") ) binary = true; if(fscanf(fp, "%s %s", buffer, buffer2) != 2){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(strcmp(buffer, "DATASET") || strcmp(buffer2, "UNSTRUCTURED_GRID")){ cout << "VTK reader can only read unstructured datasets" << endl; ExecError("error in reading vtk file"); } // read mesh vertices if(fscanf(fp, "%s %d %s\n", buffer, &nv, buffer2) != 3){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(strcmp(buffer, "POINTS") || !nv){ cerr << "No points in dataset" << endl; ExecError("error in reading vtk file"); } int datasize; if( !strncmp(buffer2, "double",6)) datasize = sizeof(double); else if( !strncmp(buffer2, "float",5)) datasize = sizeof(float); else{ cout << "VTK reader only accepts float or double datasets" << endl; ExecError("error in reading vtk file"); } if(verbosity>3) cout << "Reading %d points" << nv << " buffer2" << buffer2 << "binary" << binary << " " << datasize << " "<< sizeof(float) << endl; Vertex3 *vff = new Vertex3[nv]; for(int i = 0 ; i < nv; i++){ if(verbosity>9) cout << " i=" << i << endl; double xyz[3]; if(binary){ if(datasize == sizeof(float)){ float f[3]; if(fread(f, sizeof(float), 3, fp) != 3){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)f, sizeof(float), 3); for(int j = 0; j < 3; j++) xyz[j] = f[j]; } else{ if(fread(xyz, sizeof(double), 3, fp) != 3){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)xyz, sizeof(double), 3); } } else{ cout << datasize << " "<< sizeof(float) << endl; if(datasize == sizeof(float)){ if(fscanf(fp, "%lf %lf %lf", &xyz[0], &xyz[1], &xyz[2]) != 3){ cout << "error in reading vtk files (float)" << endl; ExecError("error in reading vtk file"); } } else{ if(fscanf(fp, "%lf %lf %lf", &xyz[0], &xyz[1], &xyz[2]) != 3){ cout << "error in reading vtk files (double)" << endl; ExecError("error in reading vtk file"); } } } vff[i].x = xyz[0]; vff[i].y = xyz[1]; vff[i].z = xyz[2]; vff[i].lab = 1; if(verbosity>9) printf( "xyz = %f %f %f\n", xyz[0],xyz[1], xyz[2]); } // read mesh elements int numElements, numElements2, totalNumInt; if(fscanf(fp, "%s %d %d\n", buffer, &numElements, &totalNumInt) != 3){ cout << "error in reading vtk files" << endl; ExecError("error in reading vtk file"); } if(verbosity>3) printf("reading parameter %s %d %d\n", buffer, numElements, totalNumInt); if(strncmp(buffer, "CELLS",5) || !numElements){ cout << "No cells in dataset" << endl; ExecError("error in reading vtk file"); } if(verbosity>3) cout << "Reading cells" << numElements << endl; int *IntCells = new int[totalNumInt-numElements]; int *firstCell = new int[numElements+1]; int *TypeCells = new int[numElements]; int numIntCells = 0; for(unsigned int i = 0; i < numElements; i++){ int numVerts, n[100]; if(verbosity>9) cout << "i=" << i << " " << numElements << endl; for(int ii = 0; ii < 100; ii++) n[ii]=-1; if(binary){ if( fread(&numVerts, sizeof(int), 1, fp) != 1 ) { cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } if( !bigEndian) SwapBytes((char*)&numVerts, sizeof(int), 1); if((int)fread(n, sizeof(int), numVerts, fp) != numVerts){ cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)n, sizeof(int), numVerts); } else{ if(fscanf(fp, "%d", &numVerts) != 1){ cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } cout << "numVerts" << numVerts << endl; for(int j = 0; j < numVerts; j++){ if(fscanf(fp, "%d", &n[j]) != 1){ cout << "error in reading VTK files " << endl; ExecError("error in reading vtk file"); } if(verbosity>9) cout << " n[j]" << n[j] << endl; } } firstCell[i] = numIntCells; for(int j = 0; j < numVerts; j++){ if(n[j] >= 0 && n[j] < nv){ IntCells[numIntCells] = n[j]; numIntCells++; } else{ cout << "Bad vertex index" << endl; ExecError("error in reading vtk file"); } } } firstCell[numElements] = totalNumInt-numElements; if(fscanf(fp, "%s %d\n", buffer, &numElements2) != 2){ cout << " Error in reading CELL_TYPES ARGUMENT " << endl; ExecError("error in reading vtk file"); } if(strcmp(buffer, "CELL_TYPES") || numElements2 != (int)numElements){ cout <<"No or invalid number of cells types" << endl; ExecError("error in reading vtk file"); } if(verbosity>3) printf( "reading parameter %s %d\n", buffer, numElements2); // 3D for(unsigned int i = 0; i < numElements; i++){ int type; if(binary){ if(fread(&type, sizeof(int), 1, fp) != 1){ cout <<"bug in readings cell types" << endl; ExecError("error in reading vtk file"); } if(!bigEndian) SwapBytes((char*)&type, sizeof(int), 1); } else{ if(fscanf(fp, "%d", &type) != 1){ cout <<"bug in readings cell types" << endl; ExecError("error in reading vtk file"); } } TypeCells[i] = type; switch(type){ case 1: // Vertex if(nerr++< 3 && verbosity) cout << "this type of cell (vertex) is not taking account in Freefem++ " << endl; break; case 3: // Edge/line cout << "this type of cell is not taking account in Freefem++ for a two dimensional mesh" << endl; // 3D break; case 5: // Triangle nbe++; // 3D break; case 10: // Tetrahdre nt++; break; default: cout << "Error :: This type of cell is not considered in Freefem++"<< endl; ExecError("error in reading vtk file"); break; } } fclose(fp); // 3D versions Tet *tff; if( nt >0) tff = new Tet[nt]; Tet *ttff = tff; Triangle3 *bff = new Triangle3[nbe]; Triangle3 *bbff = bff; for(unsigned int i = 0; i < numElements; i++){ int type=TypeCells[i]; int ivb[3],ivt[4]; int label=1; switch(type){ case 1: // Vertex if(nerr++<3 && verbosity) cout << "this type of cell is not taking account in Freefem++ " << endl; break; case 3: // Edge/line break; case 5: // Triangle cout << i << " " << firstCell[i+1] << " " << firstCell[i] << endl; assert( (firstCell[i+1]-firstCell[i]) == 3 ); for(int j=firstCell[i]; jset(vff, ivb, label); break; case 10: // Tetrahdre assert( (firstCell[i+1]-firstCell[i]) == 4 ); for(int j=firstCell[i]; jset(vff, ivt, label); break; default: break; } } delete [] IntCells; delete [] firstCell; delete [] TypeCells; if(nt>0){ Mesh3 *pTh = new Mesh3(nv,nt,nbe,vff,tff,bff); return pTh; } else{ Mesh3 *pTh = new Mesh3(nv,nbe,vff,bff); return pTh; } } AnyType VTK_LoadMesh3_Op::operator()(Stack stack) const { string * pffname= GetAny((*filename)(stack)); bool swap = false; int reftetra=1; int reftri = 1; if( nargs[0] ) reftetra = GetAny((*nargs[0])(stack)); if( nargs[1] ) swap = GetAny< bool >((*nargs[1])(stack)); if( nargs[2] ) reftri = GetAny((*nargs[2])(stack)); string *DataLabel; if( nargs[3] ) DataLabel = GetAny((*nargs[3])(stack)); Mesh3 * Th = VTK_Load3( *pffname, swap); // A faire fonction pour changer le label Add2StackOfPtr2FreeRC(stack,Th); return Th; } //============================================== // ECRITURE DE FICHIER .vtk (3D) //============================================== class VTK_WriteMesh3_Op : public E_F0mps { public: typedef long Result; Expression eTh; Expression filename; struct Expression2 { string name; long what; // 1 scalar, 2 vector, 3 symtensor long nbfloat; // 1 scalar, 2 vector (3D), 3 symtensor(3D) Expression e[6]; Expression2() {e[0]=0; e[1]=0; e[2]=0; e[3]=0; e[4]=0; e[5]=0; what=0; nbfloat=0;}; Expression &operator[](int i){return e[i];} double eval(int i,Stack stack) const { if (e[i]) { return GetAny< double >( (*e[i])(stack) ); } else return 0; } void writesolutionP0_float_XML( FILE *fp, const Mesh3 &Th, Stack stack, bool surface) const { unsigned char ElementChars[256]; MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1/4.); long nc=Th.nt; if(surface) nc=nc+Th.nbe; unsigned nbytes= nc*sizeof(float)*(*this).nbfloat; int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); l=runEncodeB64(sizeof(float),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); l=runEncodeB64(sizeof(float),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } } // flush buffer l=runEncodeB64(0,NULL,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); fprintf(fp,"\n"); } void writesolutionP0_float_binary( FILE *fp, const Mesh3 &Th, Stack stack, bool surface, bool bigEndian) const { MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1/4.); if(!bigEndian){ for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); SwapBytes((char*)&value, sizeof(float), 1); fwrite(&value, sizeof(float), 1, fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); SwapBytes((char*)&value, sizeof(float), 1); fwrite(&value, sizeof(float), 1, fp); } } } } else{ for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); fwrite(&value, sizeof(float), 1, fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); fwrite(&value, sizeof(float), 1, fp); } } } } fprintf(fp,"\n"); } void writesolutionP0_float( FILE *fp, const Mesh3 &Th, Stack stack, bool surface) const { MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1/4.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); fprintf(fp,"%.8e ",value); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< nbfloat;j++){ float value = eval(j,stack); fprintf(fp,"%.8e ",value); } } } fprintf(fp,"\n"); } void writesolutionP0_float( FILE *fp, const Mesh3 &Th, Stack stack, bool surface, bool binary, bool bigEndian, bool XML=false) const { if(binary){ if(!XML){ (*this).writesolutionP0_float_binary( fp, Th, stack, surface, bigEndian); } else (*this).writesolutionP0_float_XML( fp, Th, stack, surface ); } else (*this).writesolutionP0_float( fp, Th, stack, surface ); } void writesolutionP0_double_binary( FILE *fp, const Mesh3 &Th, Stack stack, bool surface, bool bigEndian) const { MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); if(!bigEndian){ for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); SwapBytes((char*)&value, sizeof(double), 1); fwrite(&value, sizeof(double), 1, fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); SwapBytes((char*)&value, sizeof(double), 1); fwrite(&value, sizeof(double), 1, fp); } } } } else{ for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); fwrite(&value, sizeof(double), 1, fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); fwrite(&value, sizeof(double), 1, fp); } } } } fprintf(fp,"\n"); } void writesolutionP0_double_XML( FILE *fp, const Mesh3 &Th, Stack stack, bool surface) const { unsigned char ElementChars[256]; MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); long nc=Th.nt; if(surface) nc=nc+Th.nbe; unsigned nbytes= nc*sizeof(double)*(*this).nbfloat; int l=runEncodeB64(sizeof(int),(unsigned char *)&nbytes,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); l=runEncodeB64(sizeof(double),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); l=runEncodeB64(sizeof(double),(unsigned char *)&value,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); } } } // flush buffer l=runEncodeB64(0,NULL,ElementChars); ElementChars[l]=0; fwrite(&ElementChars,l,1,fp); fprintf(fp,"\n"); } void writesolutionP0_double( FILE *fp, const Mesh3 &Th, Stack stack, bool surface) const { MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); fprintf(fp,"%.16e ",value); } } if( surface ){ for (int ibe=0;ibeset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(int j=0;j< (*this).nbfloat;j++){ double value = (*this).eval(j,stack); fprintf(fp,"%.16e ",value); } } } //fprintf(fp,"\n"); } void writesolutionP0_double( FILE *fp, const Mesh3 &Th, Stack stack, bool surface, bool binary, bool bigEndian, bool XML=false) const { if(binary){ if(!XML){ (*this).writesolutionP0_double_binary( fp, Th, stack, surface, bigEndian); } else (*this).writesolutionP0_double_XML( fp, Th, stack, surface ); } else (*this).writesolutionP0_double( fp, Th, stack, surface ); } void writesolutionP1_float( FILE *fp, const Mesh3 &Th, Stack stack, bool binary, bool bigEndian,bool XML=false) const { unsigned char ElementChars[256]; MeshPoint *mp3(MeshPointStack(stack)); KN valsol(Th.nv*(*this).nbfloat); KN takemesh(Th.nv); takemesh =0; valsol =0.; for(int it=0; itsetP(&Th,it,iv); for(int j=0;j<(*this).nbfloat;j++){ valsol[ i*(*this).nbfloat+j ] = valsol[ i*(*this).nbfloat+j ] + (*this).eval(j,stack); } takemesh[i] = takemesh[i]+1; } } if(binary){ if(!XML){ if(!bigEndian){ for (int iv=0;iv valsol(Th.nv*(*this).nbfloat); KN takemesh(Th.nv); takemesh =0; valsol =0.; for(int it=0; itsetP(&Th,it,iv); for(int j=0;j<(*this).nbfloat;j++){ valsol[ i*(*this).nbfloat+j ] = valsol[ i*(*this).nbfloat+j ] + (*this).eval(j,stack); } takemesh[i] = takemesh[i]+1; } } if(binary){ if( !XML ){ if( !bigEndian ){ for (int iv=0;iv l; static const int n_name_param = 7; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: VTK_WriteMesh3_Op(const basicAC_F0 & args) : l( args.size()-2 ) { int nbofsol; int ddim=3; int stsize=6; int sca=0,vec=0,ten=0; string scas("scalaire"); string vecs("vector"); string tens("tensor"); if(verbosity) cout << "Write Mesh and Solutions in VTK Formats" << endl; args.SetNameParam(n_name_param,name_param,nargs); if (BCastTo(args[0])) filename = CastTo(args[0]); if (BCastTo(args[1])) eTh= CastTo(args[1]); nbofsol = l.size(); for (size_t i=2;i( args[i] )) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); char number[16]; sprintf(number,"%li",jj+1); l[jj].name=scas; l[jj].name+=number; sca++; } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); //cout << "taille" << a0->size() << endl; if (a0->size() != ddim && a0->size() != stsize) CompileError("savesol in 3D: vector solution is 3 composant, tensor solution is 6 composant"); if( a0->size() == ddim){ // vector solution l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } char number[16]; sprintf(number,"%li",jj+1); l[jj].name=vecs; l[jj].name+=number; vec++; } else if( a0->size() == stsize){ // symmetric tensor solution l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } char number[16]; sprintf(number,"%li",jj+1); l[jj].name=tens; l[jj].name+=number; ten++; } } else { cout << " arg " << i << " " << args[i].left() << endl; CompileError("savesol in 2D: Sorry no way to save this kind of data"); } } } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new VTK_WriteMesh3_Op(args);} AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type VTK_WriteMesh3_Op::name_param[]= { { "dataname", &typeid(string*)}, { "withsurfacemesh", &typeid(bool)}, { "order", &typeid(KN_)}, // A rajouter dans le 3D { "floatmesh", &typeid(bool)}, { "floatsol", &typeid(bool)}, { "bin", &typeid(bool)}, { "swap", &typeid(bool)} }; void VTK_WRITE_MESH3( const string &filename, FILE *fp, const Mesh3 &Th, bool binary, int datasize, bool surface, bool bigEndian){ fprintf(fp, "# vtk DataFile Version 2.0\n"); fprintf(fp, "%s, Created by Freefem++ \n", filename.c_str()); if(binary) fprintf(fp, "BINARY\n"); else fprintf(fp, "ASCII\n"); fprintf(fp, "DATASET UNSTRUCTURED_GRID\n"); // get all the entities in the model // write mesh vertices if(datasize == sizeof(float)) fprintf(fp, "POINTS %d float\n", Th.nv); if(datasize == sizeof(double)) fprintf(fp, "POINTS %d double\n", Th.nv); if(datasize == sizeof(float)) { for(unsigned int i = 0; i < Th.nv; i++){ const Vertex3 & P = Th.vertices[i]; float f[3]; f[0]=P.x; f[1]=P.y; f[2]=P.z; if(binary){ if(!bigEndian) SwapBytes((char*)&f, sizeof(float), 3); fwrite(&f, sizeof(float), 3, fp); } else{ fprintf(fp,"%.8f %.8f %.8f\n",f[0],f[1],f[2]); } } } else if(datasize == sizeof(double)){ for(unsigned int i = 0; i < Th.nv; i++){ const Vertex3 & P = Th.vertices[i]; double f[3]; f[0]=P.x; f[1]=P.y; f[2]=P.z; // 3D case if(binary){ if(!bigEndian) SwapBytes((char*)&f, sizeof(float), 3); fwrite(&f, sizeof(float), 3, fp); } else{ fprintf(fp,"%lf %lf %lf\n",f[0],f[1],f[2]); } } } fprintf(fp,"\n"); if(verbosity > 1) printf("writting vertices is finish\n"); if(verbosity > 1) printf("writting elements now\n"); //================ // CELL //================ // loop over all elements we need to save and count vertices int numElements, totalNumInt; if(surface){ numElements = Th.nt+Th.nbe; totalNumInt = Th.nt*4+Th.nbe*3+numElements; } else{ numElements = Th.nt; totalNumInt = Th.nt*4+numElements; } if(verbosity > 1) printf("writting cells \n"); // print vertex indices in ascii or binary fprintf(fp, "CELLS %d %d\n", numElements, totalNumInt); if(binary){ int IntType=4; if(verbosity > 1) printf("writting tetrahedron elements \n"); for(int it=0; it< Th.nt; it++){ const Tet & K( Th.elements[it] ); int iv[IntType+1]; iv[0] = IntType; for(int ii=0; ii 1) printf("writting triangle elements \n"); IntType=3; for(int ibe=0; ibe 1) printf("writting tetrahedron elements \n"); for(int it=0; it< Th.nt; it++){ const Tet &K( Th.elements[it] ); int iv[IntType+1]; iv[0] = IntType; for(int ii=0; ii 1) printf("writting triangle elements \n"); IntType=3; for(int ibe=0; ibe list_label_Elem; //list list_label_Border_Elem; { for(int it=0; it< Th.nt; it++){ const Tet &K( Th.elements[it] ); list::const_iterator ilist; int labOk=0; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if( *ilist == K.lab ){ labOk = 1; break; } } if( labOk == 0){ list_label_Elem.push_back(K.lab); } } if(surface){ for(int ibe=0; ibe::const_iterator ilist; int labOk=0; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if( *ilist == K.lab ){ labOk = 1; break; } } if( labOk == 0){ list_label_Elem.push_back(K.lab); } } } } list_label_Elem.sort(); //================================= //================================= fprintf(fp, "CELL_DATA %d\n", numElements); int cell_fd=1; int cell_lab=1; fprintf(fp, "Scalars Label int%d\n", cell_fd); fprintf(fp, "LOOKUP_TABLE FreeFempp_table\n"); // Determination des labels if(binary){ int label; for(int it=0; it< Th.nt; it++){ const Tet &K( Th.elements[it] ); label =K.lab; if(!bigEndian) SwapBytes((char*)&label, sizeof(int), 1); fwrite(&label, sizeof(int), 1, fp); } if(surface){ for(int ibe=0; ibe::const_iterator ilist; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++) size_list++; fprintf(fp, "LOOKUP_TABLE FreeFempp_table %d\n",size_list); { list::const_iterator ilist; for( ilist=list_label_Elem.begin(); ilist!=list_label_Elem.end(); ilist++){ if(binary){ int tab[4]; tab[0] = (int) ColorTable[abs(*ilist)%NbColorTable][0]*255; tab[1] = (int) ColorTable[abs(*ilist)%NbColorTable][1]*255; tab[2] = (int) ColorTable[abs(*ilist)%NbColorTable][2]*255; tab[3] = 255; for(int itab=0; itab<4; itab++){ char newvalue[sizeof(int)]; int bid0= sprintf(newvalue,"%s", (char*)&tab[itab]); fwrite( &newvalue, sizeof(unsigned char), 1, fp); } } else{ float tab[4]; tab[0] = ColorTable[abs(*ilist)%NbColorTable][0]; tab[1] = ColorTable[abs(*ilist)%NbColorTable][1]; tab[2] = ColorTable[abs(*ilist)%NbColorTable][2]; tab[3] = 1.0; fprintf(fp,"%.8f %.8f %.8f %.8f\n",tab[0],tab[1],tab[2],tab[3]); } } } fprintf(fp,"\n"); } AnyType VTK_WriteMesh3_Op::operator()(Stack stack) const { string * pffname= GetAny((*filename)(stack)); Mesh3 * pTh= GetAny((*eTh)(stack)); ffassert(pTh); Mesh3 &Th=*pTh; bool swap = false; bool bigEndian = false; bool binary = false; bool surface = true; bool floatmesh = true; bool floatsol = true; int datasize = sizeof(float); int datasizeSol = sizeof(float); string *dataname; int nbofsol = l.size(); KN order(nbofsol); char *nameofuser[nbofsol]; for(int ii=0; ii( (*nargs[0])(stack) ); if( nargs[1] ) surface = GetAny< bool >( (*nargs[1])(stack) ); if( nargs[2] ) order = GetAny< KN_ >( (*nargs[2])(stack) ); if( nargs[3] ) floatmesh = GetAny< bool >( (*nargs[3])(stack) ); if( nargs[4] ) floatsol = GetAny< bool >( (*nargs[4])(stack) ); if( nargs[5] ) binary = GetAny< bool >( (*nargs[5])(stack) ); if( nargs[6] ) bigEndian = GetAny< bool >( (*nargs[6])(stack) ); swap = bigEndian; if( !floatmesh ) datasize = sizeof(double); if( !floatsol ) datasizeSol= sizeof(double); int iii=0; if( nargs[0]){ char *data = newcopy(dataname); if(verbosity>5) cout << " iovtk writeMesh3: names \""<< data <<"\"" << endl; char * name =strtok(data," \n\0\t"); nameofuser[iii] = newcopy(name); if(verbosity>5) cout << " iovtk writeMesh3:value of iii=" << iii << " " << nameofuser[iii] <= nbofsol ) { if(verbosity) cout << " iovtk writeMesh3: The number of data name is too large " << endl; break; } nameofuser[iii] = newcopy(name); if(verbosity>5) cout << " iovtk writeMesh3:value of iii=" << iii << " " << nameofuser[iii] <0){ fprintf(fp, "FIELD FieldData %d\n", Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ int nsol; if(surface){ nsol = Th.nt+Th.nbe; } else{ nsol = Th.nt; } fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,nsol); if(verbosity>5) cout << " iovtk writeMesh3: name of data("<< ii <<")=" << nameofuser[ii] << endl; // changement ecriture solution l[ii].writesolutionP0_float( fp, Th, stack, surface, binary, swap); //fprintf(fp,"\n"); } } } if( Norder0 < nbofsol ) { fprintf(fp, "POINT_DATA %d\n", Th.nv); fprintf(fp, "FIELD FieldData %d\n", nbofsol-Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1) { fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,Th.nv); if(verbosity>5) cout << " iovtk writeMesh3:name of data("<< ii <<")=" << nameofuser[ii] << endl; // changement ecriture solution l[ii].writesolutionP1_float( fp, Th, stack, binary, swap); } } } } if( datasizeSol == sizeof(double) ){ if( Norder0 >0){ fprintf(fp, "FIELD FieldData %d\n", Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ int nsol; if(surface){ nsol = Th.nt+Th.nbe; } else{ nsol = Th.nt; } fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,nsol); if(verbosity>5) cout << " iovtk writeMesh3:name of data("<< ii <<")=" << nameofuser[ii] << endl; // changement ecriture solution l[ii].writesolutionP0_double( fp, Th, stack, surface, binary, swap); } } } if( Norder0 < nbofsol ){ fprintf(fp, "POINT_DATA %d\n", Th.nv); fprintf(fp, "FIELD FieldData %d\n", nbofsol-Norder0); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1){ fprintf(fp,"%s %ld %d float\n",nameofuser[ii],l[ii].nbfloat,Th.nv); if(verbosity>5) cout << " iovtk writeMesh3:name of data("<< ii <<")=" << nameofuser[ii] << endl; // changement ecriture solution l[ii].writesolutionP1_double( fp, Th, stack, binary, swap); } } } } } else if(VTK_FILE == 2){ int nc,nv; VTU_WRITE_MESH( fp, Th, binary, datasize, surface, swap); // Solution Order // order 1 if( Norder0 != nbofsol){ BEGINTYPE_VTU( fp, "PointData"); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 1){ if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP1_float( fp, Th, stack, binary, swap,1); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP1_double( fp, Th, stack, binary, swap,1); } ENDTYPE_VTU( fp, "DataArray"); } } ENDTYPE_VTU( fp, "PointData"); } // order 0 if( Norder0 > 0 ){ BEGINTYPE_VTU( fp, "CellData"); for(int ii=0; ii< nbofsol; ii++){ if(order[ii] == 0){ if(datasize == sizeof(float)){ VTU_DATA_ARRAY( fp, "Float32", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP0_float( fp, Th, stack, surface, binary, swap,1); } else if(datasize == sizeof(double)) { VTU_DATA_ARRAY( fp, "Float64", nameofuser[ii] , l[ii].nbfloat, binary); l[ii].writesolutionP0_double( fp, Th, stack, surface, binary, swap,1); } ENDTYPE_VTU( fp, "DataArray"); } } ENDTYPE_VTU( fp, "CellData"); } ENDTYPE_VTU( fp, "Piece"); ENDTYPE_VTU( fp, "UnstructuredGrid"); ENDTYPE_VTU( fp, "VTKFile"); } else{ cout << "extension file of VTK is not correct" << endl; exit(1); } fclose(fp); for( int iiii=0; iiiigetShape()==LINE) { m = 2; shape = "LINESEG"; } */ else if (Th.dim==3) { m = 4; shape = "TETRAHEDRON"; } pf << "ZONE N=" << Th.nv << ", E=" << Th.nt << ", F=FEPOINT, ET=" << shape << endl; for (int i=0;i); Global.Add("savevtk","(",new OneOperatorCode); Global.Add("vtkload3","(",new VTK_LoadMesh3); Global.Add("vtkload","(",new VTK_LoadMesh); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/IpoptLap.edp000644 000767 000024 00000005564 11730400403 020711 0ustar00hechtstaff000000 000000 load "ff-Ipopt"; int NN=10; mesh Th = square(NN,NN); fespace Vh(Th,P1); func f=1; func g=0; varf Poiss(u,v) = int2d(Th)(0.5*dx(u)*dx(v) + 0.5*dy(u)*dy(v)) - int2d(Th)(v*f); varf dPoiss(u,v) = int2d(Th)(dx(u)*dx(v) + dy(u)*dy(v)) ; matrix A = Poiss(Vh,Vh); matrix dA = dPoiss(Vh,Vh); real[int] b = Poiss(0,Vh); varf Bord(u,v) = int1d(Th,1,2,3,4)(0.5*u*v) - int1d(Th,1,2,3,4)(v*g); varf dBord(u,v) = int1d(Th,1,2,3,4)(u*v); real intg2 = int1d(Th,1,2,3,4)(0.5*g*g); matrix M = dBord(Vh,Vh); real[int] bc= Bord(0,Vh); //cout << M << endl; //matrix M = Bord(Vh,Vh); int iter=0; func real J(real[int] &X) { Vh u; u[]=X; real[int] Au = A*X; Au += b; real res = X '* Au; plot(u,dim=3,fill=1,cmm="res = "+res+" - iter="+(iter++)); return res; } int nj=0; func real[int] dJ(real[int] &X) { real[int] Au = dA*X; //Au *= 2.; Au += b; return Au; } int nh=0; matrix MH; func matrix HJ(real[int] &X,real objfact,real[int] &lm) { int[int] ia(0),ja(0),ic(0),jc(0); real[int] ca(0),cc(0); [ia,ja,ca] = dA; [ic,jc,cc] = M; ca *= (objfact ? objfact : 0.0001); cc *= (lm[0] ? lm[0] : 0.0001); matrix odA = [ia,ja,ca]; matrix lmM = [ic,jc,cc]; MH = odA + lmM; return MH; } //func matrix HJ(real[int] &X) {return dA;} //out << dA << end; int nc=0; func real[int] C(real[int] &X) { real[int] res=M*X; res *= 0.5; res += bc; real result = X '* res; result += intg2; real[int] rrr = [result]; return rrr; } int ndc=0; matrix MdC; for(int i=0;i seg fault in Ipopt func matrix HJ(real[int]& X) { Vh u; u[]=X; varf vH(v,w) = int2d(Th)( (grad(w)'*grad(v)) / sqrt(1+grad(u)'*grad(u)) - (grad(w)'*grad(u))*(grad(v)'*grad(u)) *(1+grad(u)'*grad(u))^-1.5 ) ; H = vH(Vh,Vh); return H;} varf OnGamma(u,v) = on(1,2,3,4,u=1); Vh OnG; OnG[]=OnGamma(0,Vh,tgv=1); // 1 on Gamma Vh lb = OnG!=0 ? g : -1e19 ; // Vh ub = OnG!=0 ? g : 1e19 ; // Vh u = OnG!=0 ? g : 0 ; // initial guest .. Vh clb = 3-square(10*(square(x-x0)+square(y-y0))); // constraint .. if(constraint) lb = max(lb,clb); int ret; if(bfgs) ret = IPOPT(J,DJ,u[],lb=lb[],ub=ub[],bfgs=1); else ret = IPOPT(J,DJ,HJ,u[],lb=lb[],ub=ub[]); cout << " min = " << J(u[]) << " ~ " << J(ue[]) << " ret = " << ret << endl; plot(u, wait=1); freefem++-3.38-1/examples++-load/IpoptMinSurfVol.edp000644 000767 000024 00000015057 12211656553 022255 0ustar00hechtstaff000000 000000 // this exemple is buggus in some case ... // strange ... FH. , S Auliac (will be correct in test ???) // remove the test (no loop) int nadapt=0;// 3 is teh previous value.. load "msh3"; load "medit"; load "ff-Ipopt"; real alpha=0.9; int np=30; mesh Th = square(2*np,np,[2*pi*x,pi*y]); // FFCS regression reference value real regtest; fespace Vh(Th,P1,periodic=[[2,y],[4,y]/*,[1,x],[3,x]*/]); /* * Initial shape definition * outside of the mesh adaptation loop to initialize with the previous optimial shape found on further iterations */ Vh startshape=5;//+0.5*(cos(10*x)*sin(10*y)*sin(y)); //uz,lz,lm : dual variables storage for the warmstart Vh uz=1.,lz=1.; real[int] lm=[1]; for(int kkk=0;kkk0 Wh cl=0;//constraints lower bounds (no upper bounds) //Boundary conditions varf vGamma([u1,u2],[v1,v2]) = on(1,2,3,4,u1=1,u2=1); real[int] onGamma=vGamma(0,Vh); Vh [ub1,ub2]=[g1,g2]; Vh [lb1,lb2]=[g1,g2]; ub1[] = onGamma ? ub1[] : 1e19 ; //Unbounded in interior lb1[] = onGamma ? lb1[] : -1e19 ; Vh [uzi,uzi2]=[uz,uz2],[lzi,lzi2]=[lz,lz2]; Wh lmi=lm; Vh [ui1,ui2]=[u1,u2]; IPOPT([b,A],CC,ui1[],lb=lb1[],clb=cl[],ub=ub1[],warmstart=iter>1,uz=uzi[],lz=lzi[],lm=lmi[]); //cout << "ADAPTMESH ITERATION " << iter << endl << "UZ = " << uzi[] << endl << "LZ = " << lzi[] << endl << "LM = " << lmi[] << endl; plot(ui1,ui2,wait=1,nbiso=60,dim=3); if(iter > 1) break; Th= adaptmesh(Th,[ui1,ui2],err=0.004,nbvx=100000); [uz,uz2]=[uzi,uzi2]; [lz,lz2]=[lzi,lzi2]; [u1,u2]=[ui1,ui2]; lm=lmi; } freefem++-3.38-1/examples++-load/IPOTest.edp000644 000767 000024 00000004330 12420154103 020436 0ustar00hechtstaff000000 000000 /* * min x1*x4*(x1 + x2 + x3) + x3 (= x1^2.x4 + x1.x2.x4 + x1.x3.x4 + x3) * s.t. x1*x2*x3*x4 >= 25 * x1**2 + x2**2 + x3**2 + x4**2 = 40 * 1 <= x1,x2,x3,x4 <= 5 * * Starting point: * x = (1, 5, 5, 1) * * Optimal solution: * x = (1.00000000, 4.74299963, 3.82114998, 1.37940829) */ load "ff-Ipopt" real[int] xlb=[1.,1.,1.,1.],xub=[5.,5.,5.,5.],glb=[25.,40.],gub=[1.e19,40.]; func real J(real[int] &X) { return X[0]*X[3]*(X[0] + X[1] + X[2]) + X[2]; } func real[int] dJ(real[int] &X) { real[int] grad(X.n); grad[0] = 2.*X[0]*X[3] + X[1]*X[3] + X[2]*X[3]; grad[1] = X[0]*X[3]; grad[2] = X[0]*X[3] + 1.; grad[3] = X[0]*X[0] + X[0]*X[1] + X[0]*X[2]; return grad; } matrix H; int[int] hi=[0,1,1,2,2,2,3,3,3,3],hj=[0,0,1,0,1,2,0,1,2,3]; real[int] hc(hi.n); hc=0.; func matrix HJ(real[int] &X,real jfactor,real[int] &lambda) { H = [hi,hj,hc]; H(0,0) = jfactor * 2*X[3]; H(1,0) = jfactor * X[3]; H(2,0) = jfactor * X[3]; H(3,0) = jfactor * (2*X[0] + X[1] + X[2]); H(3,1) = jfactor * X[0]; H(3,2) = jfactor * X[0]; H(1,0) += lambda[0] * (X[2]*X[3]); H(2,0) += lambda[0] * (X[1]*X[3]); H(2,1) += lambda[0] * (X[0]*X[3]); H(3,0) += lambda[0] * (X[1]*X[2]); H(3,1) += lambda[0] * (X[0]*X[2]); H(3,2) += lambda[0] * (X[0]*X[1]); H(0,0) += lambda[1] * 2.; H(1,1) += lambda[1] * 2.; H(2,2) += lambda[1] * 2.; H(3,3) += lambda[1] * 2.; //cout << H << endl; return H; } func real[int] G(real[int] &X) { real[int] g(2); g[0] = X[0]*X[1]*X[2]*X[3]; g[1] = square(X.l2); return g; } matrix GG; int[int] II=[0, 0, 0, 0, 1, 1, 1, 1], JJ=[0, 1, 2, 3, 0, 1, 2, 3]; real[int] CC=[0.,0.,0.,0.,0.,0.,0.,0.]; GG = [II,JJ,CC]; func matrix jacG(real[int] &X) { GG(0,0) = X[1]*X[2]*X[3]; GG(0,1) = X[0]*X[2]*X[3]; GG(0,2) = X[0]*X[1]*X[3]; GG(0,3) = X[0]*X[1]*X[2]; GG(1,0) = 2.*X[0]; GG(1,1) = 2.*X[1]; GG(1,2) = 2.*X[2]; GG(1,3) = 2.*X[3]; return GG; } real[int] start=[1, 5, 5, 1]; real[int] optimsol=[1.00000000, 4.74299963, 3.82114998, 1.37940829]; IPOPT(J,dJ,HJ,G,jacG,start,ub=xub, lb=xlb,clb=glb,cub=gub); optimsol -= start; cout << "Dist : " << optimsol.l2 << endl; freefem++-3.38-1/examples++-load/isoline.cpp000644 000767 000024 00000057333 12134244151 020643 0ustar00hechtstaff000000 000000 // ORIG-DATE: Novembre 2008 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice, Modif par F. Hecht Dec. 2011 // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ /* calcul demander par F. Hecht */ #ifndef WITH_NO_INIT #include "ff++.hpp" #include "AFunction_ext.hpp" #endif using namespace std; #include #include #include #include //#include "msh3.hpp" using namespace Fem2D; // fonction determinant les points d'intersection static int debug =0; class ISOLINE_P1_Op : public E_F0mps { public: Expression eTh,eff,emat,exx,eyy,exy,iso; static const int n_name_param = 7; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; double arg(int i,Stack stack,double a) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} KN * arg(int i,Stack stack,KN * a) const{ return nargs[i] ? GetAny< KN * >( (*nargs[i])(stack) ): a;} string * arg(int i,Stack stack,string * a) const{ return nargs[i] ? GetAny< string * >( (*nargs[i])(stack) ): a;} public: ISOLINE_P1_Op(const basicAC_F0 & args,Expression tth, Expression fff,Expression xxx,Expression yyy) : eTh(tth),emat(0),eff(fff),exx(xxx),eyy(yyy),exy(0) { args.SetNameParam(n_name_param,name_param,nargs); } ISOLINE_P1_Op(const basicAC_F0 & args,Expression tth, Expression fff,Expression xxyy) : eTh(tth),emat(0),eff(fff),exx(0),eyy(0),exy(xxyy) { args.SetNameParam(n_name_param,name_param,nargs); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type ISOLINE_P1_Op::name_param[]= { { "iso", &typeid(double)}, { "close", &typeid(long)}, { "smoothing", &typeid(double)}, { "ratio", &typeid(double)}, { "eps", &typeid(double)}, { "beginend", &typeid(KN * )}, { "file", &typeid(string * )} }; int IsoLineK(R2 *P,double *f,R2 *Q,int *i0,int *i1,double eps) { int kv=0,ke=0,e=3; int tv[3],te[3],vk[3]; for(int i=0;i<3;++i) { if( abs(f[i]) <= eps) { e -= tv[kv++]=i; vk[i]=1; } else vk[i]=0; } if(debug) cout << " ** " << kv << endl; if(kv>1) // on 2 vertex on the isoline .... { if(kv==2) { if(f[e] > 0.) { int j0=(e+1)%3; int j1=(e+2)%3; te[ke]=e+3,i0[ke]=j0,i1[ke]=j0,++ke; te[ke]=e,i0[ke]=j1,i1[ke]=j1,++ke; // pb d'unicity, need to see the adj triangle ... //return 10+e ; // edge number + 10 } else return 0; // skip edge ... } else return 0; // const funct... } else // see internal edge .. for(int e=0;e<3;++e) { int j0=(e+1)%3; int j1=(e+2)%3; if( vk[j0]) // the intial point on iso line { if(0. < f[j1]) te[ke]=e,i0[ke]=j0,i1[ke]=j0,++ke; else te[ke]=e+3,i0[ke]=j0,i1[ke]=j0,++ke; } else if (vk[j1]); // skip the final point on iso line else if( f[j0] < 0. && 0. < f[j1]) // good sens te[ke]=e,i0[ke]=j0,i1[ke]=j1,++ke; else if ( f[j0] > 0. && 0. > f[j1]) // inverse sens te[ke]=e+3,i0[ke]=j1,i1[ke]=j0,++ke; } if( ke==2) { // the K[i1[0]] , Q[0], Q[1] must be direct ... // the K[i0[1]] , Q[0], Q[1] must be direct ... // Warning no trivail case .. make a plot to see // with is good // the first edge must be if(te[0]<3) // oriente the line { assert(te[1] >=3); std::swap(te[0],te[1]); std::swap(i0[0],i0[1]); std::swap(i1[0],i1[1]); if(debug) cout << " swap " << endl; } for(int i=0;i<2;++i) { int j0=i0[i],j1=i1[i]; if( j0== j1) Q[i] = P[j0]; else Q[i] = (P[j0]*(f[j1]) - P[j1]*(f[j0]) ) /(f[j1]-f[j0]); if(debug) cout << i << " " << j0 << " " << j1 << " : " << Q[i] << "***" << endl; } if(debug) { cout << "i0 " << i0[0] << " " << i0[1] << " " << det(P[i1[0]],Q[0],Q[1]) < 0); if(!vk[i0[1]]) assert( det(P[i0[1]],Q[1],Q[0]) > 0); return 2; } // remark, the left of the line is upper . return 0; } int LineBorder(R2 *P,double *f,long close,R2 *Q,int *i1,int *i2,double eps) { int np=0; if(close) { if(f[0]>-eps) { Q[np]=P[0]; i1[np]=i2[np]=0,np++; } if (f[0]*f[1] <= - eps*eps) { Q[np]= (P[0]*(f[1]) - P[1]*(f[0]) ) /(f[1]-f[0]); i1[np]=0,i2[np]=1,np++; } if(f[1]>-eps) { Q[np]=P[1]; i1[np]=i2[np]=1,np++; } } else { } return np; } struct R2_I2 { R2 P; int nx; R2_I2(R2 A,int nxx=-1) : P(A),nx(nxx) {} bool add(int k0,int k1,multimap & L) { if (nx==-1) nx=k1; else { if(nx >0) {// more than 2 seg ... put data in the multi map .. L.insert(make_pair(k0,nx)); L.insert(make_pair(k0,k1)); nx=-2; } else L.insert(make_pair(k0,k1)); return false; } return true;} int next(int k0,multimap & L,int rm=0) { int nxx=-1; if(nx>=0) { nxx=nx; if(rm) nx=-2;} else { typedef multimap::iterator IT; IT f= L.find(k0); if(f == L.end()) nxx=-1; // else { nxx = f->second; if(rm) L.erase(f); } } return nxx; } int count(int k0,const multimap & L) const { if(nx>=0) return 1; else return L.count(k0); } }; // Absact mesh for data on grid .... FH .. int Th_Grid(const KNM_ *g, int k,int ii) { int N = g->N()-1; int kq= k/2; // number of the quad int k0 = k%2; // up or down // (0,0),(1,0),(1,1) Qd <=> (ii !=0, ii==2) // (0,0),(1,1),(0,1) Q2 <=> (ii%2, ii != 0 int I = kq%N + ( k0 ? (ii%2) : (ii !=0) ) ; int J = kq/N + ( k0 ? (ii!=0) : (ii ==2) ); return J*(N+1)+I; } R2 V_Grid(const KNM_ *g, int k) { int i = k % g->N() , j = k / g->N() ; return R2( i,j); } int EA_Grid(const KNM_ *g, int k,int & e) { int N = g->N()-1; int kq= k/2; // number of the quad int k0 = k%2; // up or down bool intern = k0 ? (e==0) : (e==2); if(intern) {e = 2-e; return 2*kq+ 1-k0;} ffassert(0); return 0; } struct SMesh { const Mesh *pTh; const KNM_ *g; int nv,nt, neb; int operator()(int k,int i) const { return pTh ? (*pTh)(k,i) : Th_Grid(g,k,i); } R2 operator()(int i) const { return pTh ? (*pTh)(i) : V_Grid(g,i); } int ElementAdj(int k,int &e) { return pTh ? pTh->ElementAdj(k,e) : EA_Grid(g,k,e); } SMesh(Mesh *PTh) : pTh(PTh),g(0) , nv(pTh->nv), nt(pTh->nt),neb(pTh->neb) {} SMesh(KNM_ *gg): pTh(0),g(gg) , nv(gg->N()*gg->M()), nt((gg->N()-1) *(gg->M()-1)*2), neb( ( gg->N()+gg->M()-2 )*2 ) {} }; AnyType ISOLINE_P1_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; KNM * pxy=0; KN * pxx=0; KN * pyy=0; if(exy) pxy = GetAny*>((*exy)(stack)); if(exx) pxx = GetAny*>((*exx)(stack)); if(eyy) pyy = GetAny*>((*eyy)(stack)); // cout << pxx << " " << pyy << " " << pxy << endl; ffassert( (pxx || pyy) == !pxy ) ; Mesh * pTh= GetAny((*eTh)(stack)); ffassert(pTh); SMesh Th(pTh); int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.neb; // nombre d'aretes fontiere long nbc; // value of isoline int ka=0; double isovalue = arg(0,stack,0.); long close = arg(1,stack,1L); double smoothing = arg(2,stack,0.); double ratio = arg(3,stack,1.); double epsr = arg(4,stack,1e-10); KN *pbeginend = arg(5,stack, (KN *) 0); string * file = arg(6,stack,(string*) 0); vector< R2_I2 > P; multimap L; if(verbosity>= 1000) debug =verbosity/1000; else debug = 0; map, int> FP; const double unset = -1e-100; KN tff(nbv, unset); // loop over triangle if(pTh) for (int it=0;itsetP(pTh,it,iv); tff[i]=GetAny((*eff)(stack))-isovalue; } } } else ffassert(0); if(close<0) { tff=-tff; close=-close; } double tffmax=tff.max(), tffmin=tff.min(); if(verbosity) cout << " -- isoline close="<< close << " iso= "<< isovalue << " " << epsr << endl << " bound isovalue :" << tffmin << " " << tffmax << endl; double eps = (tffmax-tffmin)*epsr; if( (tffmax <0.) || (tffmin > 0.)) return 0L; if(epsr>0) eps = epsr; ostream *fff=0; if(debug>9) fff = new ofstream("g-iso"); for (int k=0;k, int>::iterator , bool > ii; pair e(i1[i],i2[i]); ii=FP.insert(make_pair(e,P.size())); if(ii.second) P.push_back(R2_I2(Qk[i])); if(debug) cout << i1[i] << " --- " << i2[i] <<" ; " << ii.second<< endl; p[i] = ii.first->second ; } // add line k[0], k[1] P[p[0]].add(p[0],p[1],L); if(debug) cout << " +++ " << Qk[0] << " -> " << Qk[1] << " :: " << p[0] << " -> " << p[1] << endl; if(fff) *fff << Qk[0] << "\n" << Qk[1] << "\n" << ((Qk[0]*0.4 + Qk[1]*.6)+R2(Qk[0],Qk[1]).perp()*.4) << "\n\n"; } } if(fff) delete fff; if(close) { if(debug) cout<< " Close path " << endl; for (int k=0;k "<< Pk[1] << ", " << fk[1] << " : " <=10) { // full edge int ke = 0; } else if(np==2) { for(int i=0;i<2;++i) { i1[i]=iK[i1[i]]; i2[i]=iK[i2[i]]; if(i2[i] " << Qk[1] << ", " << i1[1] <<',' << i2[1]<< endl; int p[2]; // point number for(int i=0;i<2;++i) { pair< map, int>::iterator , bool > ii; pair ee(i1[i],i2[i]); ii=FP.insert(make_pair(ee,P.size())); if(ii.second) P.push_back(R2_I2(Qk[i])); if(debug) cout << i1[i] << " --- " << i2[i] <<" ; " << ii.second<< endl; p[i] = ii.first->second ; } // add line k[0], k[1] P[p[0]].add(p[0],p[1],L); if(debug) cout << " +++ " << Qk[0] << " -> " << Qk[1] << " :: " << p[0] << " -> " << p[1] << endl; } } } } if(debug) cout<< " End Close path " << endl; } if(verbosity>99) { // dump the data base cout << " IsolineP1 " << endl; for(int i=0;i " << P[i].nx << endl; cout<< " multmap for execption " << endl; for( multimap::const_iterator i= L.begin(); i!= L.end();++i) cout << "\t" << i->first << " -> " << i->second << endl; cout<< " End multmap for execption " << endl; } vector iQ, QQ; // QQ the list of curve int np= P.size(); KN start(np); start=-1; int kkk=0; for(int i=0;i=0) start[nx]=i; } vector starting; int iss=0; for( multimap::const_iterator i= L.begin(); i!= L.end();++i) { starting.push_back(i->first); start[i->second]=i->first; } for(int i=0;i=0) ) i=ii; if(i<0) break; { if(verbosity>9) cout << " isolineP1: start curve = " << i << " -> " << P[i].next(i,L,0) ; if(verbosity>99) cout << " (" << i <99) cout << " -- " << i1; QQ.push_back(i1); break; } QQ.push_back(i1); if(verbosity>99) cout << " " << i1; start[i1]=-2; i0=i1; } /* do in brak if(i1==ie) // close the path .. { QQ.push_back(i1); if(verbosity>99) cout << " " << i1; } */ if(verbosity>99) cout << ") "<< endl; else if(verbosity>9) cout << endl; iQ.push_back(QQ.size()); } } // sort iQ if(iQ.size()>2) { vector< pair > > sQ(iQ.size()/2); for(int i=0,j=0; i0) { KN P1(QQ.size()),P2(QQ.size()); for(int i=0;i2) cout << " curve " << i << " size = " << i1-i0 << " nbsmoothing = " << nbsmoothing << " " << i0 << " " << i1 << endl; P2=P1; for( int step=0;stepresize(iQ.size()); for(int i=0; iresize(QQ.size()); pyy->resize(QQ.size()); for(int i=0;iresize(3,QQ.size()); for(int k=0; kc_str()); int i=0,i0,i1,n2= iQ.size(),k=0; while(i0) { for(int i=0;i<10;i++) cout << " PB point = " << pe[i] << " " << P[pe[i]].P << " odd count = " << P[pe[i]].count(pe[i],L) << endl; ffassert(0); } */ // construction des courble return nbc; } class ISOLINE_P1: public OneOperator { public: typedef Mesh *pmesh; int cas; ISOLINE_P1() : OneOperator(atype(),atype(),atype(), atype*>(),atype* >() ) ,cas(4){} ISOLINE_P1(int ) : OneOperator(atype(),atype(),atype(), atype*>() ),cas(3) {} E_F0 * code(const basicAC_F0 & args) const { if(cas==4) return new ISOLINE_P1_Op( args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]), t[3]->CastTo(args[3]) ); else if(cas==3) return new ISOLINE_P1_Op( args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]), t[2]->CastTo(args[2]) ); else ffassert(0); // bug } }; R3 * Curve(Stack stack,const KNM_ &b,const long &li0,const long & li1,const double & ss) { assert(b.N() >=3); int i0=li0,i1=li1,im; if(i0<0) i0=0; if(i1<0) i1=b.M()-1; double lg=b(2,i1); R3 Q; ffassert(lg>0 && b(2,0)==0.); double s = ss*lg; int k=0,k1=i1; while(i0 < i1-1) { ffassert(k++ < k1); im = (i0+i1)/2; if(s b(2,im) ) { i0= im; } else { Q=R3(b(0,im),b(1,im),0); i0=i1=im;break;} } if(i0= s ); R2 A(b(0,i0),b(1,i0)); R2 B(b(0,i1),b(1,i1)); double l1=(b(2,i1)-s); double l0=s-b(2,i0); Q= (l1*A + l0*B)/(l1+l0); } R3 *pQ = Add2StackOfPtr2Free(stack,new R3(Q)); // MeshPoint &mp= *MeshPointStack(stack); // the struct to get x,y, normal , value //mp.P.x=Q.x; // get the current x value //mp.P.y=Q.y; // get the current y value return pQ; } double mesure(Stack stack,const KNM_ &b,const KN_ &be) { double mes =0; int nbc2 = be.N(); for (int k=0; k 9) cout << " mesure: composante " << k/2 << " mesure " << mk/2. << endl; mes += mk; } return mes/2.; } R3 * Curve(Stack stack,const KNM_ &b,const double & ss) { return Curve(stack,b,-1,-1,ss); } void finit() { typedef Mesh *pmesh; Global.Add("isoline","(",new ISOLINE_P1); Global.Add("isoline","(",new ISOLINE_P1(1)); Global.Add("Curve","(",new OneOperator2s_,double>(Curve)); Global.Add("Curve","(",new OneOperator4s_,long,long,double>(Curve)); Global.Add("Area","(",new OneOperator2s_,KN_ >(mesure)); } LOADFUNC(finit); // une variable globale qui serat construite au chargement dynamique freefem++-3.38-1/examples++-load/isoline.edp000644 000767 000024 00000003231 11741351162 020621 0ustar00hechtstaff000000 000000 load "isoline" real[int,int] xy(3,1); int[int] be(1); { mesh Th=square(10,10);//,[x*.5,y*0.5]); fespace Vh(Th,P1); Vh u= sqrt(square(x-0.5)+square(y-0.5)); real iso= 0.2 ; real[int] viso=[iso]; plot(u,viso=viso,Th); int nbc= isoline(Th,u,xy,close=1,iso=iso,beginend=be,smoothing=0.1); /* iso = value of the iso to compute close = close the iso line this the border (def. 0). smoothing = nb of smoothing process = smoothing * len curve ^ratio (def. 0.) ratio = (def. 1.) eps = relative eps (see code ??) (def 1e-10 ) beginend = array to get begin end of sub line file = filename remark: sense of the isoline : the upper part is a the left part isoline so here : the minimiun is a 0.5,05 => the curve 1 turn in the clockwise sense */ cout << " nb of the line componant = " << nbc << endl; cout << " n = " << xy.m << endl; // nombre of points cout << "be = " << be << endl; // begin end of the componant // show the lines for( int c=0;c #include //#include "msh3.hpp" using namespace Fem2D; // fonction determinant les points d'intersection class ISOLINE_P1_Op : public E_F0mps { public: Expression eTh,filename,ff; static const int n_name_param = 1; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; double arg(int i,Stack stack,double a) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} public: ISOLINE_P1_Op(const basicAC_F0 & args,Expression tth, Expression fff) : eTh(tth), filename(fff) { args.SetNameParam(n_name_param,name_param,nargs); if ( BCastTo(args[2]) ) { ff=to( args[2] ); } else {ffassert(0); // ErrorCompile("no function to isolines \n"); } if( !nargs[0]) ffassert(0); // ErrorCompile("no isolines selected \n"); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type ISOLINE_P1_Op::name_param[]= { { "iso", &typeid(double)} }; AnyType ISOLINE_P1_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh= GetAny((*eTh)(stack)); string * ffname= GetAny( (*filename)(stack) ); ffassert(pTh); Mesh &Th=*pTh; Mesh *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.neb; // nombre d'aretes fontiere long valsortie; // value of isoline double isovalue; isovalue = GetAny< double >( (*nargs[0])(stack) ); // evaluation de la fonction aux sommets KN takevertex(Th.nv); KN tff(Th.nv); MeshPoint *mp3(MeshPointStack(stack)); takevertex=0; // loop over triangle for (int it=0;itsetP(&Th,it,iv); tff[i]=GetAny((*ff)(stack)); takevertex[i] = takevertex[i]+1; } } } // calcul des isolines dans les triangles KN EdgeIter(3*Th.nt); KN taketriangle(2*Th.nt); for(int ii=0; ii< 3*Th.nt; ii++){ EdgeIter[ii] = -1; } for(int ii=0; ii< 2*Th.nt; ii++){ taketriangle[ii] = -1; } int VertexIso[Th.nv]; int VertexIsoTri[2*Th.nv]; for(int ii=0; ii< Th.nv; ii++) VertexIso[ii] = 0; for(int ii=0; ii< 2*Th.nv; ii++) VertexIsoTri[ii] = 0; int NbIsoVertex = 0; int NbIsoNonVertex = 0; for(int it=0; it< Th.nt; it++){ const Mesh::Triangle & K(Th.t(it)); int nkeq[3]; int ivertex = 0; int mark[3]; int im=0; for(int ii=0; ii<3; ii++){ int j0,j1; nkeq[ii] = 0; mark[ii] = 0; Th.VerticesNumberOfEdge( K, ii, j0, j1); //cout << "it=" << it << " ii= " << ii << " j0= " << j0 << "j1= " << j1 << endl; double fi = tff[j0]; double fj = tff[j1]; double xf = isovalue; if( Abs( tff[j0]- isovalue) < 1.e-11*(Abs(isovalue)+Abs(tff[j0])) ) { nkeq[ii] = 1; mark[ii] = 1; EdgeIter[3*it+ii] =0.; ivertex++; } else{ if( Abs( tff[j1]- isovalue) < 1.e-11*(Abs(isovalue)+Abs(tff[j1])) ) { mark[(ii+1)%3] = 1; } else if( ((fi <= xf)&&(fj>=xf)) || ((fi>=xf)&&(fj<=xf)) ){ int eo; eo=ii; int ito=Th.ElementAdj(it,eo); mark[ii] = 1; im++; double xlam = (fi-xf)/(fi-fj); if(ito<0){ EdgeIter[3*it+ii] = xlam; NbIsoNonVertex++; } else if( 3*it+ii <= 3*ito+eo || it == ito ){ EdgeIter[3*it+ii] = xlam; NbIsoNonVertex++; } if(it <=10 && verbosity>10) cout << "vertex (it="<< it << ", i="<< ii << ") :: " << j0 << " " << j1 <<" xlam= "<< xlam << endl; } } } if( ivertex == 3){ cerr << " A triangle is a isovalue " << endl; exit(1); } else if( ivertex == 2){ //* search positive triangle *// // deux possibilits for(int iii=0;iii<3;iii++){ if( nkeq[iii] != 1 ){ int j0,j1; Th.VerticesNumberOfEdge( K, iii, j0, j1); R fi = tff[ j0 ]; if( fi > isovalue ){ for(int i=0;i<3;i++) // for the 3 edges { if( mark[i] == 1 && mark[(i+1)%3] == 1 ){ int jj0,jj1; Th.VerticesNumberOfEdge( K, i, jj0, jj1); taketriangle[2*it+1] = i; taketriangle[2*it] = (i+1)%3; VertexIso[ jj0 ]++; VertexIso[ jj1 ]++; if( VertexIso[ jj0 ] > 2 || VertexIso[ jj1 ] > 2 ) cerr << " error:the iso value pass is connected to more then 2 iso vertices " << endl; else{ VertexIsoTri[ 2*jj0+VertexIso[ jj0 ] -1 ] = it; VertexIsoTri[ 2*jj1+VertexIso[ jj1 ] -1 ] = it; } } } } } } } else if( im == 1 && ivertex == 1){ for(int i=0;i<3;i++) // for the 3 edges { if( mark[i] == 1 && mark[(i+1)%3] == 1 ){ int jj0,jj1; Th.VerticesNumberOfEdge( K, i, jj0, jj1); // determination if(1==nkeq[i]){ EdgeIter[3*it+i] = 0.; VertexIso[ jj0 ]++; if( VertexIso[ jj0 ] > 2 ) cerr << " error:the iso value pass is connected to more then 2 iso vertices " << endl; else{ VertexIsoTri[ 2*jj0+VertexIso[ jj0 ] -1 ] = it; } } else{ EdgeIter[3*it+(i+1)%3] = 0.; VertexIso[ jj1 ]++; if( VertexIso[ jj1 ] > 2 ) cerr << " error:the iso value pass is connected to more then 2 iso vertices " << endl; else{ VertexIsoTri[ 2*jj1+VertexIso[ jj1 ] -1 ] = it; } } int jj00,jj10; Th.VerticesNumberOfEdge( K, (i+2)%3, jj00, jj10); R fi2 = tff[ jj00 ]; if( fi2 > isovalue ){ taketriangle[2*it] = (i+1)%3; taketriangle[2*it+1] = i; } else{ taketriangle[2*it] = i; taketriangle[2*it+1] = (i+1)%3; } } } } else if( im == 2){ for(int i=0;i<3;i++) // for the 3 edges { if( mark[i] == 1 && mark[(i+1)%3] == 1 ){ int jj0,jj1; Th.VerticesNumberOfEdge( K, i, jj0, jj1); R fi1 = tff[ jj0 ]; if( it < 10 ) cout << "vertex (it="<< it << ", i="<< i << ") :: " << jj0 << " " << jj1 << endl; if( fi1 > isovalue ){ taketriangle[2*it] = (i+1)%3; taketriangle[2*it+1] = i; } else{ taketriangle[2*it] = i; taketriangle[2*it+1] = (i+1)%3; } Th.VerticesNumberOfEdge( K, (i+1)%3, jj0, jj1); if( it < 10 ) cout << "vertex (it="<< it << ", i="<< (i+1)%3 << ") :: " << jj0 << " " << jj1 << endl; } } } } //################################# int NbInterBord=0; KN ElementLink(Th.nt+Th.neb); for(int it=0; it< Th.nt+Th.neb; it++) ElementLink[it]=-1; for(int it=0; it< Th.nt; it++){ if( taketriangle[2*it] < 0 ) continue; const Mesh::Triangle & K(Th.t(it)); int ii = 2*it; int eT1 = taketriangle[2*it]; int eT2 = taketriangle[2*it+1]; int eo1 = eT1; int eo2 = eT2; int adjeT1 = Th.ElementAdj(it,eo1); int adjeT2 = Th.ElementAdj(it,eo2); /* if( VertexIso[ numv ] == 2 ){ if( VertexIsoTri[ 2*numv ] == it ){ newit = VertexIsoTri[ 2*numv+1 ]; } else newit = VertexIsoTri[ 2*numv ]; } */ // link with previous element { int jj00,jj10; Th.VerticesNumberOfEdge( K, eT1, jj00, jj10); int numv=jj00; //cout << "eT1, jj00, jj10 " << eT1 << " " << jj00 << " " << jj10 << " VertexIso[ numv ] "<< VertexIso[ numv ] << endl; if( VertexIso[ numv ] == 2 ){ if( VertexIsoTri[ 2*numv ] == it ){ ElementLink[ VertexIsoTri[ 2*numv+1 ] ] = it; //newit = VertexIsoTri[ 2*numv+1 ]; } else ElementLink[ VertexIsoTri[ 2*numv] ] = it; //newit = VertexIsoTri[ 2*numv ]; } else if( VertexIso[ numv ] == 1 ){ if(adjeT1 >= 0 && it!=adjeT1 ){ // search the edge of it in the border int eT3 = 3-eT1-eT2; int eo3 = eT3; int adjeT3 = Th.ElementAdj(it,eo3); if(adjeT3 < 0 || it==adjeT3 ){ int jj000,jj100; Th.VerticesNumberOfEdge( K, eT3, jj000, jj100); cout << " bug une iso vertex definis une fois doit etre sur le bord :: vertex " << numv << endl; int ibeV = Th.NumberOfTheBoundaryEdge(jj000,jj100); // old ElementLink[ ibeV+Th.nt ] = it; //NbInterBord++; } //exit(1); } else{ // border // int ibeV = Th.BorderElementAdj( jj00, jj10); //old int ibeV = Th.NumberOfTheBoundaryEdge( jj00, jj10); ElementLink[ibeV+Th.nt] = it; //NbInterBord++; } } else if(adjeT1 >= 0 && it!=adjeT1 ){ ElementLink[adjeT1] = it; } else{ // border int ibeV = Th.NumberOfTheBoundaryEdge(jj00,jj10); //ElementLink[Th.NumberOfTheBoundaryEdge(jj00,jj10)+Th.nt] = it; // old ElementLink[ibeV+Th.nt] = it; //NbInterBord++; } } // link with the next element { int jj00,jj10; Th.VerticesNumberOfEdge( K, eT2, jj00, jj10); int numv=jj00; if( VertexIso[ numv ] == 2 ){ if( VertexIsoTri[ 2*numv ] == it ){ ElementLink[ it ] = VertexIsoTri[ 2*numv+1 ]; //newit = VertexIsoTri[ 2*numv+1 ]; } else ElementLink[ it ] = VertexIsoTri[ 2*numv]; //newit = VertexIsoTri[ 2*numv ]; } else if( VertexIso[ numv ] == 1 ){ if(adjeT2 >= 0 && it!=adjeT2 ){ // search the edge of it in the border int eT3 = 3-eT1-eT2; int eo3 = eT3; int adjeT3 = Th.ElementAdj(it,eo3); if(adjeT3 < 0 || it==adjeT3 ){ int jj000,jj100; Th.VerticesNumberOfEdge( K, eT3, jj000, jj100); cout << " bug une iso vertex definis une fois doit etre sur le bord :: vertex " << numv << endl; int ibeV = Th.NumberOfTheBoundaryEdge(jj000,jj100); // old ElementLink[ it ] = ibeV+Th.nt; NbInterBord++; } //exit(1); } else{ // border int ibeV = Th.NumberOfTheBoundaryEdge(jj00,jj10); // old //int ibeV = Th.BorderElementAdj( jj00, jj10); ElementLink[ it ] = ibeV+Th.nt; NbInterBord++; } } else{ if(adjeT2 >= 0 && it!=adjeT2) ElementLink[it] = adjeT2; else{ // border int ibeV = Th.NumberOfTheBoundaryEdge(jj00,jj10); ElementLink[it] = ibeV+Th.nt; // ElementLink[it] = Th.BorderElementAdj( jj00, jj10)+Th.nt; // old NbInterBord++; } //for(int iijj=0; iijj<10; iijj++){ //cout << "ElementLink["<< iijj <<"]=" << ElementLink[iijj] <= 0 && it!=adjeT2) ElementLink[it] = adjeT2; else{ // border const Mesh::Triangle & K(Th.t(it)); int jj00,jj10; Th.VerticesNumberOfEdge( K, taketriangle[ii], jj00, jj10); ElementLink[it] = Th.TheBoundaryEdge(jj00,jj10)+Th.nt; //NbInterBord++; } */ } int NbBordVertex=0; if(verbosity>10)cout << " NbInterBord = " << NbInterBord << endl; if(NbInterBord>0){ //################################# // boucle sur le bord // determination des points sur le bord for(int ii=0; ii < Th.neb; ii++){ // determination du sens du bord int edgebid; int ffbid = Th.BoundaryElement( ii, edgebid ); // ii : number of edge => sortie :: ffbid = numero triangles, edgebid = numero edges int j0bid,j1bid; Th.VerticesNumberOfEdge( Th.t(ffbid), edgebid, j0bid, j1bid); // j0bid --> j1bid sens de parcours sur le triangle double fi = tff[j0bid]; double fj = tff[j1bid]; double xf = isovalue; // sens fi -> fj (same as local triangle) // fi++ et fj++ ==> lien ibe ++ next border // fi==0 et fjj++ ==> lien triangle contenant cette vertex ++ vers next border // fj==0 et fi++ ==> lien ibe vers triangle contenant cette vertex // fi==0 et fj==0 ==> lien triangle contenant cette vertex vers - next bord ( fjj >= 0 ) // - triangle contenant cette vertex (fjj < 0) if( VertexIso[ j0bid ] > 0 ){ // cas fi == isovalue if( VertexIso[ j1bid ] > 0 ){ if(verbosity>10)cout << "the edge is a isovalue :: link is previously computed "<< endl; //assert( VertexIso[ j0bid ] == 2); //assert( VertexIso[ j1bid ] == 2); } else if( fj >= isovalue){ // cas fi iso fj++ //assert( VertexIso[ j0bid ] == 2); if( VertexIso[ j0bid ] == 2 ){ if( VertexIsoTri[2*j0bid] == ffbid ){ //ElementLink[ VertexIsoTri[2*j0bid+1] ] = Th.nt + Th.BorderElementAdj(j1bid,j0bid); // old orientation ElementLink[ Th.nt + Th.NumberOfTheBoundaryEdge(j0bid,j1bid) ] = VertexIsoTri[2*j0bid+1]; } else{ //ElementLink[ VertexIsoTri[2*j0bid] ] = Th.nt + Th.BorderElementAdj(j1bid,j0bid); // old orientation ElementLink[ Th.nt + Th.NumberOfTheBoundaryEdge(j0bid,j1bid) ] = VertexIsoTri[2*j0bid]; } NbBordVertex++; } if( VertexIso[ j0bid ] == 1 ){ if(verbosity>10) cout << "j0bid, j1bid, ffbid " << j0bid << " "<< j1bid << " " << ffbid << endl; //assert( VertexIsoTri[2*j0bid] == ffbid ); //if( VertexIsoTri[2*j0bid] == ffbid ){ ElementLink[ Th.nt + Th.NumberOfTheBoundaryEdge(j0bid,j1bid) ] = VertexIsoTri[2*j0bid]; //} NbBordVertex++; } } } else if( fi >= isovalue){ // cas fi == isovalue++ if( VertexIso[ j1bid ] > 0 ){ assert( VertexIso[ j1bid ] == 1); // ElementLink[ ii+Th.nt ] = VertexIsoTri[2*j1bid]; // old version ElementLink[ VertexIsoTri[2*j1bid] ] = ii+Th.nt; ElementLink[ ii+Th.nt ] = Th.BorderElementAdj(j0bid,j1bid)+Th.nt; } else if( fj >= isovalue){ //ElementLink[ii+Th.nt] = Th.nt + Th.BorderElementAdj(j1bid,j0bid); // old orientation ElementLink[ii+Th.nt] = Th.nt + Th.BorderElementAdj(j0bid,j1bid); NbBordVertex++; } //old version :: else{ ElementLink[ii+Th.nt] = Th.nt + Th.BorderElementAdj(j0bid,j1bid); NbBordVertex++; } } /* if( fi >= isovalue && Abs( fi - isovalue) > 1.e-11*(Abs(isovalue)+Abs(fi)) ){ if( fj >= isovalue && Abs( fj - isovalue) > 1.e-11*(Abs(isovalue)+Abs(fj)) ){ ElementLink[ii+Th.nt] = Th.nt + Th.BorderElementAdj(ii,j0bid,j1bid); } NbBordVertex++; } */ } // rappel: le lien a t effectuer entre les bords // -1 : pas de suivant // positive et nulle : le suivant border element // -2 : pas d'lement prendre en compte. } if(verbosity>10) { cout << " NbInterBord = " << NbInterBord << endl; for(int iijj=0; iijj<10; iijj++){ cout << "ElementLink["<< iijj <<"]=" << ElementLink[iijj] <=0); assert(eT2>=0); int jj00,jj10; Th.VerticesNumberOfEdge( K, eT1, jj00, jj10); if( EdgeIter[3*it1+eT1] > -0.1){ double xlam = EdgeIter[3*it1+eT1] ; VertexIsoP[inv].x = (1-xlam)*Th.vertices[ jj00 ].x + xlam*Th.vertices[ jj10 ].x; VertexIsoP[inv].y = (1-xlam)*Th.vertices[ jj00 ].y + xlam*Th.vertices[ jj10 ].y; VertexIsoP[inv].lab = label; inv++; } else{ int eo1; eo1=eT1; int ito1=Th.ElementAdj(it1,eo1); double xlam = EdgeIter[3*ito1+eo1]; VertexIsoP[inv].x = xlam*Th.vertices[ jj00 ].x + (1-xlam)*Th.vertices[ jj10 ].x; VertexIsoP[inv].y = xlam*Th.vertices[ jj00 ].y + (1-xlam)*Th.vertices[ jj10 ].y; VertexIsoP[inv].lab = label; inv++; } } int it2=ElementLink[it1]; for( int it=it2; it != it1; it=ElementLink[it]){ assert(it >=0); if( it< Th.nt){ // sur un triangle if(verbosity>10) cout << "it = " << it << " <---> it2=" << it2 << " Th.nt "<< Th.nt << endl; assert( TriangleVu[it] == -1); TriangleVu[it] = 1; int ii = 2*it; int eT1 = taketriangle[ii]; assert( eT1 >=0); //int eT2 = taketriangle[ii+1]; const Mesh::Triangle & K(Th.t(it)); int jj00,jj10; Th.VerticesNumberOfEdge( K, eT1, jj00, jj10); if( EdgeIter[3*it+eT1] > -0.1){ double xlam = EdgeIter[3*it+eT1] ; VertexIsoP[inv].x = (1-xlam)*Th.vertices[ jj00 ].x + xlam*Th.vertices[ jj10 ].x; VertexIsoP[inv].y = (1-xlam)*Th.vertices[ jj00 ].y + xlam*Th.vertices[ jj10 ].y; VertexIsoP[inv].lab = label; inv++; } else{ int eo1; eo1=eT1; assert( eo1 >=0); int ito1=Th.ElementAdj(it,eo1); double xlam = EdgeIter[3*ito1+eo1]; VertexIsoP[inv].x = xlam*Th.vertices[ jj00 ].x + (1-xlam)*Th.vertices[ jj10 ].x; VertexIsoP[inv].y = xlam*Th.vertices[ jj00 ].y + (1-xlam)*Th.vertices[ jj10 ].y; VertexIsoP[inv].lab = label; inv++; } } else{ int ibe=it-Th.nt; if(verbosity>10) cout << "ibe = " << ibe << " <---> it2=" << it2 << " Th.nt "<< Th.nt << endl; // sur le bord int edgebid; //int newit; int ffbid = Th.BoundaryElement( ibe, edgebid ); // ii : number of edge => sortie :: ffbid = numero triangles, edgebid = numero edges int j0bid,j1bid; Th.VerticesNumberOfEdge( Th.t(ffbid), edgebid, j0bid, j1bid); if(verbosity>10) cout << "Edge Vertex Number "<< j0bid+1 << " " << j1bid+1 << " number of triangle " << ffbid << endl; if( taketriangle[2*ffbid+1] == edgebid && VertexIso[j1bid] == 0){ //if( taketriangle[2*ffbid+1] == edgebid && VertexIso[j0bid] == 0){ // old version if( EdgeIter[3*ffbid+edgebid] > -0.1){ double xlam = EdgeIter[3*ffbid+edgebid] ; VertexIsoP[inv].x = (1-xlam)*Th.vertices[ j0bid ].x + xlam*Th.vertices[ j1bid ].x; VertexIsoP[inv].y = (1-xlam)*Th.vertices[ j0bid ].y + xlam*Th.vertices[ j1bid ].y; VertexIsoP[inv].lab = label; inv++; } else{ int eo1; eo1=edgebid; int ito1=Th.ElementAdj(ffbid,eo1); double xlam = EdgeIter[3*ito1+eo1]; VertexIsoP[inv].x = xlam*Th.vertices[ j0bid ].x + (1-xlam)*Th.vertices[ j1bid ].x; VertexIsoP[inv].y = xlam*Th.vertices[ j0bid ].y + (1-xlam)*Th.vertices[ j1bid ].y; VertexIsoP[inv].lab = label; inv++; } } else{ // old version j0bid la place de j1bid VertexIsoP[inv].x = Th.vertices[ j1bid ].x; VertexIsoP[inv].y = Th.vertices[ j1bid ].y; VertexIsoP[inv].lab = label; inv++; } } } label++; } // int TriangleVu[Th.nt]; // for(int iii=0; iii< Th.nt; iii++) // TriangleVu[iii]= -1; // int label = 0; // int inv = 0; // Vertex *VertexIsoP = new Vertex[NbVertex]; // for(int it1=0; it1< Th.nt; it1++){ // if( taketriangle[2*it1] < 0 || TriangleVu[it1] == 1 ) continue; // int it =it1; // do { // const Mesh::Triangle & K(Th.t(it)); // TriangleVu[it] = 1; // int ii = 2*it; // int eT1 = taketriangle[ii]; // int eT2 = taketriangle[ii+1]; // int jj00,jj10; // Th.VerticesNumberOfEdge( K, eT1, jj00, jj10); // if( EdgeIter[3*it+eT1] > -0.1){ // double xlam = EdgeIter[3*it+eT1] ; // VertexIsoP[inv].x = (1-xlam)*Th.vertices[ jj00 ].x + xlam*Th.vertices[ jj10 ].x; // VertexIsoP[inv].y = (1-xlam)*Th.vertices[ jj00 ].y + xlam*Th.vertices[ jj10 ].y; // VertexIsoP[inv].lab = label; // inv++; // } // else{ // cerr << "bug in definition of vertex" << endl; // int eo1; // eo1=eT1; // int ito1=Th.ElementAdj(it,eo1); // double xlam = EdgeIter[3*ito1+eo1]; // VertexIsoP[inv].x = xlam*Th.vertices[ jj00 ].x + (1-xlam)*Th.vertices[ jj10 ].x; // VertexIsoP[inv].y = xlam*Th.vertices[ jj00 ].y + (1-xlam)*Th.vertices[ jj10 ].y; // VertexIsoP[inv].lab = label; // inv++; // } // // on passe a eT2 // int newit; // Th.VerticesNumberOfEdge( K, eT2, jj00, jj10); // int numv = jj00; // if( VertexIso[ numv ] == 2 ){ // if( VertexIsoTri[ 2*numv ] == it ){ // newit = VertexIsoTri[ 2*numv+1 ]; // } // else // newit = VertexIsoTri[ 2*numv ]; // } // else if( VertexIso[ numv ] == 1 ){ // newit = -1; // } // else{ // int eo; // eo=eT2; // int ito=Th.ElementAdj(it,eo); // if( (ito != it && taketriangle[2*ito] >= 0 ) && it >= 0){ // newit = ito; // if( taketriangle[2*ito] != eo){ // exit(1); // } // } // else // newit = -1; // } // if( newit < 0 ){ // Th.VerticesNumberOfEdge( K, eT2, jj00, jj10); // if( EdgeIter[3*it+eT2] > -0.1){ // double xlam = EdgeIter[3*it+eT2] ; // //cout << "vertex (it="<< it << ", eT1="<< eT1 << ") :: " << jj00 << " " << jj10 << endl; // VertexIsoP[inv].x = (1-xlam)*Th.vertices[ jj00 ].x + xlam*Th.vertices[ jj10 ].x; // VertexIsoP[inv].y = (1-xlam)*Th.vertices[ jj00 ].y + xlam*Th.vertices[ jj10 ].y; // VertexIsoP[inv].lab = label; // inv++; // } // else{ // //cerr << "bug in definition of vertex" << endl; // // determination du triangle adjacents contenant e1 // //int ito1 = Th.TheAdjacencesLink[3*it+eT1]/3; // //int eo1 = Th.TheAdjacencesLink[3*it+eT1]%3; // int eo1; // eo1=eT2; // int ito1=Th.ElementAdj(it,eo1); // double xlam = EdgeIter[3*ito1+eo1]; // VertexIsoP[inv].x = xlam*Th.vertices[ jj00 ].x + (1-xlam)*Th.vertices[ jj10 ].x; // VertexIsoP[inv].y = xlam*Th.vertices[ jj00 ].y + (1-xlam)*Th.vertices[ jj10 ].y; // VertexIsoP[inv].lab = label; // inv++; // } // } // //if(newit>=0)TriangleVu[it] = newit; // it = newit; // } while( it >= 0 && it!=it1 && taketriangle[2*it] >= 0 && TriangleVu[it] == -1 && inv <= NbVertex); // label=label+1; // } if(verbosity) cout << " IsolineP1 :inv= " << inv << endl; if(verbosity) cout << " NbVertex= " << NbVertex << endl; if(verbosity) cout << " label =" << label << endl; assert(inv == NbVertex); if(verbosity>2) cout << " file point \"" << ffname->c_str() <<"\""<< endl; FILE *fpoints = fopen(ffname->c_str(),"w"); int lab=VertexIsoP[0].lab; for (int k=0; k(),atype(),atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new ISOLINE_P1_Op( args, t[0]->CastTo(args[0]), t[1]->CastTo(args[1]) ); } }; /* class Init { public: Init(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ typedef Mesh *pmesh; cerr << " Warning obsolete load file version now use isolineP1 -> isoline " << endl; cerr << " see example for the syntaxe " << endl; cerr << " F . Hecht " << endl; CompileError("obsolet load filee (sorry) use: load \"isoline\" "); //Global.Add("isolineP1","(",new ISOLINE_P1); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/lame-TD-NSS.edp000644 000767 000024 00000004105 11625711166 021051 0ustar00hechtstaff000000 000000 /* Exemple of Mixte furmulation for Lame equation (Linear Elasticity) The Stress and Strian are H(div div), for a Sym Stress S we have ( div(div S) in H^-1 and S.nn are continuous The Displacement u are H(Curl) ( u.tau is continuous ) where n,tau are normal / tangent This formulation is call TD-NSS */ load "Element_Mixte" load "Element_P3" int nn=10; mesh Th= square(nn*4,nn,[x*4,y]); // caoutchoouc //real mu = 0.012; //real lambda = 0.4; // rho rho=1e-16; // ALu real mu = 3.8; real lambda= 6.2; real rho = 5e-4; // s11, s12, s22 real twomu=mu*2; real mu1= 1./(twomu); real lambda1 = 1./(2*(2*lambda+twomu)) - 1./(twomu*2); macro BItr(a,b) /* S-> a S + b tr(S) Id */ [ [ a + b , 0 , 0 ,b ], [ 0 , a , 0 ,0 ], [ 0 , 0 , a ,0 ], [ b , 0 , 0 , a+ b ] ] // func A = BItr(twomu,lambda) ; func A1 = BItr(mu1,lambda1) ; real gravity = -9.81*rho; macro Strain(u) [dx(u#1),(dy(u#1)+dx(u#2))/2,(dy(u#1)+dx(u#2))/2,dy(u#2)] //EOM macro Strain2(s) [s#11, s#12, s#12, s#22] //EOM macro S(s) [s#11,s#12,s#22]// macro U(u) [u#1,u#2] // macro dn(u) (U(u)'*[N.x,N.y]) //') macro dnn(s) ( [N.x,N.y]' * [[ s#11,s#12] , [s#12, s#22] ] *[N.x,N.y]) //') fespace Wh(Th,[P2,P2]); fespace Sh(Th,TDNNS1); fespace Vh(Th,BDM1Ortho); Sh S(s),S(t); Vh U(u),U(v);; Wh U(w),U(ww); solve Lame2([s11,s12,s22,u1,u2],[t11,t12,t22,v1,v2])= int2d(Th)( Strain2(s)'*(A1*Strain2(t)) //' - Strain(u)'*Strain2(t) //' - Strain(v)'*Strain2(s) //' // + 1e-6*(u1*v2+u2*v2) ) + intalledges(Th)( dnn(t)*dn(u) + dnn(s)*dn(v) ) // - int1d(Th,4) ( 0*dnn(t) ) // here 0 <=> U_d .n * dnn(t) + int2d(Th) ( gravity*v2) //-int2d(Th,1,2,3) ( dNtau(t). v.tau) +on(1,2,3,s11=0,s12=0,s22=0) +on(4,u1=0,u2=0); solve Lame1([w1,w2],[ww1,ww2])= int2d(Th)( Strain(w)'*(A*Strain(ww)) //' ) -int2d(Th)(gravity*ww2) +on(4,w1=0,w2=0); plot([w1,w2], wait=1); plot([u1,u2], wait=1); real errl2 = sqrt(int2d(Th)( square(w1-u1) + square(w2-w2))); cout << " errL2 = " << errl2 << endl; freefem++-3.38-1/examples++-load/lap-solvers.edp000644 000767 000024 00000002171 12167254041 021431 0ustar00hechtstaff000000 000000 load "SuperLu" load "NewSolver" verbosity=3; // a example to test the level of optimisation // -------------------------------------------- int nn=300; mesh Th=square(nn,nn); verbosity=5; fespace Vh(Th,P1); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace0(uh,vh) = // definion of the problem int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form + int1d(Th,1)( uh*vh) + int1d(Th,1)( - vh) + int2d(Th)( -f*vh ) // linear form + on(2,3,4,uh=g) ; // boundary condition form defaulttoUMFPACK(); real cpu=clock() ; laplace0; // solve the problem plot(uh); // to see the result cout << "-- lap UMFPACK " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; uh=0; defaulttoSuperLU(); cpu=clock() ; laplace0; // solve the problem plot(uh); // to see the result cout << "-- lap SuperLU " << nn << "x" << nn << " : " << -cpu+clock() << " s, max =" << uh[].max << endl; freefem++-3.38-1/examples++-load/lapack.cpp000644 000767 000024 00000107012 12471400577 020434 0ustar00hechtstaff000000 000000 //ff-c++-LIBRARY-dep: lapack blas #include "ff++.hpp" #include "RNM.hpp" #include "AFunction_ext.hpp" // Extension of "AFunction.hpp" to deal with more than 3 parameters function using namespace std; #ifdef __LP64__ typedef int intblas; typedef int integer; #else typedef long intblas; typedef long integer; #endif typedef integer logical; typedef float LAPACK_real; typedef double doublereal; typedef logical (* L_fp)(); typedef integer ftnlen; typedef complex LAPACK_complex; typedef complex doublecomplex; typedef void VOID; #define complex LAPACK_complex #define real LAPACK_real #include "clapack.h" #undef real #undef complex long lapack_inv(KNM* A) { intblas n=A->N(); intblas m=A->M(); double *a=&(*A)(0,0); intblas info; intblas lda=n; KN ipiv(n); intblas lw=10*n; KN w(lw); ffassert(n==m); dgetrf_(&n,&n,a,&lda,ipiv,&info); if(info) return info; dgetri_(&n,a,&lda,ipiv,w,&lw,&info); return info; } long lapack_inv(KNM* A) { intblas n=A->N(); intblas m=A->M(); Complex *a=&(*A)(0,0); intblas info; intblas lda=n; KN ipiv(n); intblas lw=10*n; KN w(lw); ffassert(n==m); zgetrf_(&n,&n,a,&lda,ipiv,&info); if(info) return info; zgetri_(&n,a,&lda,ipiv,w,&lw,&info); return info; } // (computation of the eigenvalues and right eigenvectors of a real nonsymmetric matrix) long lapack_dgeev(KNM *const &A,KN *const &vp,KNM *const &vectp) { /* SUBROUTINE DGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR, LDVR, WORK, LWORK, INFO ) * JOBVL (input) CHARACTER*1 * = 'N': left eigenvectors of A are not computed; * = 'V': left eigenvectors of A are computed. * * JOBVR (input) CHARACTER*1 * = 'N': right eigenvectors of A are not computed; * = 'V': right eigenvectors of A are computed. * * N (input) INTEGER * The order of the matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the N-by-N matrix A. * On exit, A has been overwritten. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * WR (output) DOUBLE PRECISION array, dimension (N) * WI (output) DOUBLE PRECISION array, dimension (N) * WR and WI contain the real and imaginary parts, * respectively, of the computed eigenvalues. Complex * conjugate pairs of eigenvalues appear consecutively * with the eigenvalue having the positive imaginary part * first. * * VL (output) DOUBLE PRECISION array, dimension (LDVL,N) * If JOBVL = 'V', the left eigenvectors u(j) are stored one * after another in the columns of VL, in the same order * as their eigenvalues. * If JOBVL = 'N', VL is not referenced. * If the j-th eigenvalue is real, then u(j) = VL(:,j), * the j-th column of VL. * If the j-th and (j+1)-st eigenvalues form a complex * conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and * u(j+1) = VL(:,j) - i*VL(:,j+1). * * LDVL (input) INTEGER * The leading dimension of the array VL. LDVL >= 1; if * JOBVL = 'V', LDVL >= N. * * VR (output) DOUBLE PRECISION array, dimension (LDVR,N) * If JOBVR = 'V', the right eigenvectors v(j) are stored one * after another in the columns of VR, in the same order * as their eigenvalues. * If JOBVR = 'N', VR is not referenced. * If the j-th eigenvalue is real, then v(j) = VR(:,j), * the j-th column of VR. * If the j-th and (j+1)-st eigenvalues form a complex * conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and * v(j+1) = VR(:,j) - i*VR(:,j+1). * * LDVR (input) INTEGER * The leading dimension of the array VR. LDVR >= 1; if * JOBVR = 'V', LDVR >= N. * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. * * LWORK (input) INTEGER * The dimension of the array WORK. LWORK >= max(1,3*N), and * if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N. For good * performance, LWORK must generally be larger. * * If LWORK = -1, then a workspace query is assumed; the routine * only calculates the optimal size of the WORK array, returns * this value as the first entry of the WORK array, and no error * message related to LWORK is issued by XERBLA. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value. * > 0: if INFO = i, the QR algorithm failed to compute all the * eigenvalues, and no eigenvectors have been computed; * elements i+1:N of WR and WI contain eigenvalues which * have converged. */ intblas n=A->N(); ffassert(A->M()==n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); ffassert(vp->N()>=n); KN wr(n),wi(n),w(1); KNM mat(*A),vr(n,n),vl(n,n); intblas info,lw=-1; char JOBVL='N',JOBVR='V'; dgeev_(&JOBVL,&JOBVR,&n,mat,&n,wr,wi,vl,&n,vr,&n,w,&lw,&info); lw=w[0]; w.resize(lw); //cout << mat << endl; dgeev_(&JOBVL,&JOBVR,&n,mat,&n,wr,wi,vl,&n,vr,&n,w,&lw,&info); //cout << wr << endl; //cout << wi << endl; if (info<0) { cout << " dgeev: the " << info << "-th argument had an illegal value." << endl; (*vp)=Complex(); (*vectp)=Complex(); } else if (info>0) { cout << " dgeev: the QR algorithm failed to compute all the eigenvalues, and no eigenvectors have been computed." << endl; (*vp)=Complex(); (*vectp)=Complex(); } else if (info==0) { for (int i=0;i2) cout << " dgeev: vp "<< i << " : " << (*vp)[i] << endl; if (wi[i]==0) for (int j=0;j0) { for (int j=0;j5) cout << " dgeev: " << (*vectp)(':',i) < *const &A,KN *const &vp,KNM *const &vectp) { intblas nvp =0,zero=0; intblas n= A->N(); ffassert(A->M()==n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); ffassert(vp->N()>=n); KN w(n),vr(n*n),vl(n*n); KNM mat(*A); intblas info,lw=n*(n+1)*10; KN wk(lw); KN rwk(2*n); char N='N',V='V'; // lw=1;// to get opt size value zgeev_(&N,&V,&n, mat,&n, w, vl,&n, vr,&n,wk,&lw,rwk,&info); // cout << lw << " " << wk[0] << " " << info << endl; /* lw=wk[0].real(); w.resize(lw); zgeev_(&N,&V,&n, mat,&n, w, vl,&n, vr,&n,wk,&lw,rwk,&info); */ if(info) cout << " info = " << info << endl; if(!info) { int k=0; for(int i=0;i2) cout << " zgeev: vp "<< i << " : " << (*vp)[i] << endl; for(int j=0;j5) cout << " zgeev : " << (*vectp)(':',i) < *const &A,KNM *const &B,KN *const &vpa,KN *const &vpb,KNM *const &vectp) { intblas nvp =0,zero=0; intblas n=A->N(); ffassert(A->M()==n); ffassert(B->M()==n); ffassert(B->N()==n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); ffassert(vpa->N()>=n); ffassert(vpb->N()>=n); KN war(n),wai(n),wb(n),vr(n*n),vl(n*n); KNM matA(*A); KNM matB(*B); intblas info,lw=-1; KN w(1); //char N='N',V='V'; VL: do not compute eigenvectors (if yes, switch with following line) char VL='N',VR='N'; dggev_(&VL,&VR,&n,matA,&n,matB,&n,war,wai,wb,vl,&n,vr,&n,w,&lw,&info); lw=w[0]; // cout << lw << endl; w.resize(lw); dggev_(&VL,&VR,&n,matA,&n,matB,&n,war,wai,wb,vl,&n,vr,&n,w,&lw,&info); if(info) cout << " info = " << info << endl; if(!info) { int k=0; for(int i=0;i2) cout << " dggev: vp "<< i << " : " << (*vpa)[i] << " ; " << (*vpb)[i] << endl; if( wai[i] == 0) for(int j=0;j 0) { int ki= k+n; for(int j=0;j5) cout << " dggev : " << (*vectp)(':',i) < *const &A,KNM *const &B,KN *const &vp,KNM *const &vectp) { /* SUBROUTINE DSYGVD( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, IWORK, LIWORK, INFO ) * ITYPE (input) INTEGER * Specifies the problem type to be solved: * = 1: A*x = (lambda)*B*x * = 2: A*B*x = (lambda)*x * = 3: B*A*x = (lambda)*x * * JOBZ (input) CHARACTER*1 * = 'N': Compute eigenvalues only; * = 'V': Compute eigenvalues and eigenvectors. * * UPLO (input) CHARACTER*1 * = 'U': Upper triangles of A and B are stored; * = 'L': Lower triangles of A and B are stored. * * N (input) INTEGER * The order of the matrices A and B. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA, N) * On entry, the symmetric matrix A. If UPLO = 'U', the * leading N-by-N upper triangular part of A contains the * upper triangular part of the matrix A. If UPLO = 'L', * the leading N-by-N lower triangular part of A contains * the lower triangular part of the matrix A. * * On exit, if JOBZ = 'V', then if INFO = 0, A contains the * matrix Z of eigenvectors. The eigenvectors are normalized * as follows: * if ITYPE = 1 or 2, Z**T*B*Z = I; * if ITYPE = 3, Z**T*inv(B)*Z = I. * If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') * or the lower triangle (if UPLO='L') of A, including the * diagonal, is destroyed. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * B (input/output) DOUBLE PRECISION array, dimension (LDB, N) * On entry, the symmetric matrix B. If UPLO = 'U', the * leading N-by-N upper triangular part of B contains the * upper triangular part of the matrix B. If UPLO = 'L', * the leading N-by-N lower triangular part of B contains * the lower triangular part of the matrix B. * * On exit, if INFO <= N, the part of B containing the matrix is * overwritten by the triangular factor U or L from the Cholesky * factorization B = U**T*U or B = L*L**T. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * W (output) DOUBLE PRECISION array, dimension (N) * If INFO = 0, the eigenvalues in ascending order. * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. * * LWORK (input) INTEGER * The dimension of the array WORK. * If N <= 1, LWORK >= 1. * If JOBZ = 'N' and N > 1, LWORK >= 2*N+1. * If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. * * If LWORK = -1, then a workspace query is assumed; the routine * only calculates the optimal sizes of the WORK and IWORK * arrays, returns these values as the first entries of the WORK * and IWORK arrays, and no error message related to LWORK or * LIWORK is issued by XERBLA. * * IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK)) * On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. * * LIWORK (input) INTEGER * The dimension of the array IWORK. * If N <= 1, LIWORK >= 1. * If JOBZ = 'N' and N > 1, LIWORK >= 1. * If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. * * If LIWORK = -1, then a workspace query is assumed; the * routine only calculates the optimal sizes of the WORK and * IWORK arrays, returns these values as the first entries of * the WORK and IWORK arrays, and no error message related to * LWORK or LIWORK is issued by XERBLA. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: DPOTRF or DSYEVD returned an error code: * <= N: if INFO = i and JOBZ = 'N', then the algorithm * failed to converge; i off-diagonal elements of an * intermediate tridiagonal form did not converge to * zero; * if INFO = i and JOBZ = 'V', then the algorithm * failed to compute an eigenvalue while working on * the submatrix lying in rows and columns INFO/(N+1) * through mod(INFO,N+1); * > N: if INFO = N + i, for 1 <= i <= N, then the leading * minor of order i of B is not positive definite. * The factorization of B could not be completed and * no eigenvalues or eigenvectors were computed. */ intblas n=A->N(); ffassert(A->M()==n); ffassert(B->M()==n); ffassert(B->N()==n); ffassert(vp->N()>=n); ffassert(vectp->M()>=n); ffassert(vectp->N()>=n); KN war(n),wai(n),wb(n),vr(n*n),vl(n*n); KNM matA(*A),matB(*B); intblas itype=1,info,lw=-1; KN w(1); KN iw(1); char JOBZ='V',UPLO='U'; dsygvd_(&itype,&JOBZ,&UPLO,&n,matA,&n,matB,&n,*vp,w,&lw,iw,&lw,&info); lw=w[0]; w.resize(lw); iw.resize(lw); dsygvd_(&itype,&JOBZ,&UPLO,&n,matA,&n,matB,&n,*vp,w,&lw,iw,&lw,&info); if (info<0) { cout << " dsygvd: the " << info << "-th argument had an illegal value." << endl; } else if (info>0) { cout << " dsygvd: DPOTRF or DSYEVD returned an error code." << endl; } else if (info==0) { for (int i=0;i *const &A,KNM *const &U,KN *const &S,KNM *const &V) { /* SUBROUTINE DGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO ) * JOBZ (input) CHARACTER*1 * Specifies options for computing all or part of the matrix U: * = 'A': all M columns of U and all N rows of V**T are * returned in the arrays U and VT; * = 'S': the first min(M,N) columns of U and the first * min(M,N) rows of V**T are returned in the arrays U * and VT; * = 'O': If M >= N, the first N columns of U are overwritten * on the array A and all rows of V**T are returned in * the array VT; * otherwise, all columns of U are returned in the * array U and the first M rows of V**T are overwritten * in the array A; * = 'N': no columns of U or rows of V**T are computed. * * M (input) INTEGER * The number of rows of the input matrix A. M >= 0. * * N (input) INTEGER * The number of columns of the input matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the M-by-N matrix A. * On exit, * if JOBZ = 'O', A is overwritten with the first N columns * of U (the left singular vectors, stored * columnwise) if M >= N; * A is overwritten with the first M rows * of V**T (the right singular vectors, stored * rowwise) otherwise. * if JOBZ .ne. 'O', the contents of A are destroyed. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,M). * * S (output) DOUBLE PRECISION array, dimension (min(M,N)) * The singular values of A, sorted so that S(i) >= S(i+1). * * U (output) DOUBLE PRECISION array, dimension (LDU,UCOL) * UCOL = M if JOBZ = 'A' or JOBZ = 'O' and M < N; * UCOL = min(M,N) if JOBZ = 'S'. * If JOBZ = 'A' or JOBZ = 'O' and M < N, U contains the M-by-M * orthogonal matrix U; * if JOBZ = 'S', U contains the first min(M,N) columns of U * (the left singular vectors, stored columnwise); * if JOBZ = 'O' and M >= N, or JOBZ = 'N', U is not referenced. * * LDU (input) INTEGER * The leading dimension of the array U. LDU >= 1; if * JOBZ = 'S' or 'A' or JOBZ = 'O' and M < N, LDU >= M. * * VT (output) DOUBLE PRECISION array, dimension (LDVT,N) * If JOBZ = 'A' or JOBZ = 'O' and M >= N, VT contains the * N-by-N orthogonal matrix V**T; * if JOBZ = 'S', VT contains the first min(M,N) rows of * V**T (the right singular vectors, stored rowwise); * if JOBZ = 'O' and M < N, or JOBZ = 'N', VT is not referenced. * * LDVT (input) INTEGER * The leading dimension of the array VT. LDVT >= 1; if * JOBZ = 'A' or JOBZ = 'O' and M >= N, LDVT >= N; * if JOBZ = 'S', LDVT >= min(M,N). * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK; * * LWORK (input) INTEGER * The dimension of the array WORK. LWORK >= 1. * If JOBZ = 'N', * LWORK >= 3*min(M,N) + max(max(M,N),7*min(M,N)). * If JOBZ = 'O', * LWORK >= 3*min(M,N) + * max(max(M,N),5*min(M,N)*min(M,N)+4*min(M,N)). * If JOBZ = 'S' or 'A' * LWORK >= 3*min(M,N) + * max(max(M,N),4*min(M,N)*min(M,N)+4*min(M,N)). * For good performance, LWORK should generally be larger. * If LWORK = -1 but other input arguments are legal, WORK(1) * returns the optimal LWORK. * * IWORK (workspace) INTEGER array, dimension (8*min(M,N)) * * INFO (output) INTEGER * = 0: successful exit. * < 0: if INFO = -i, the i-th argument had an illegal value. * > 0: DBDSDC did not converge, updating process failed. */ intblas n=A->N(); intblas m=A->M(); U->resize(n,n); S->resize(min(n,m)); V->resize(m,m); KNM VT(m,m); KN iw(8*min(n,m)); intblas info,lw=-1; KN w(1); char JOBZ='A'; dgesdd_(&JOBZ,&n,&m,*A,&n,*S,*U,&n,VT,&m,w,&lw,iw,&info); lw=w[0]; w.resize(lw); dgesdd_(&JOBZ,&n,&m,*A,&n,*S,*U,&n,VT,&m,w,&lw,iw,&info); if (info<0) { cout << " dgesdd: the " << info << "-th argument had an illegal value." << endl; } else if (info>0) { cout << " dgesdd: DBDSDC did not converge, updating process failed." << endl; } else if (info==0) { for (int i=0;i *const &A,KN *const &vp,KNM *const &vectp) { /* SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) * JOBZ (input) CHARACTER*1 * = 'N': Compute eigenvalues only; * = 'V': Compute eigenvalues and eigenvectors. * * UPLO (input) CHARACTER*1 * = 'U': Upper triangle of A is stored; * = 'L': Lower triangle of A is stored. * * N (input) INTEGER * The order of the matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA, N) * On entry, the symmetric matrix A. If UPLO = 'U', the * leading N-by-N upper triangular part of A contains the * upper triangular part of the matrix A. If UPLO = 'L', * the leading N-by-N lower triangular part of A contains * the lower triangular part of the matrix A. * On exit, if JOBZ = 'V', then if INFO = 0, A contains the * orthonormal eigenvectors of the matrix A. * If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') * or the upper triangle (if UPLO='U') of A, including the * diagonal, is destroyed. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * W (output) DOUBLE PRECISION array, dimension (N) * If INFO = 0, the eigenvalues in ascending order. * * WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) * On exit, if INFO = 0, WORK(1) returns the optimal LWORK. * * LWORK (input) INTEGER * The length of the array WORK. LWORK >= max(1,3*N-1). * For optimal efficiency, LWORK >= (NB+2)*N, * where NB is the blocksize for DSYTRD returned by ILAENV. * * If LWORK = -1, then a workspace query is assumed; the routine * only calculates the optimal size of the WORK array, returns * this value as the first entry of the WORK array, and no error * message related to LWORK is issued by XERBLA. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, the algorithm failed to converge; i * off-diagonal elements of an intermediate tridiagonal * form did not converge to zero. */ intblas n=A->N(); ffassert(A->M()==n); ffassert(vectp->N()==n); ffassert(vectp->M()==n); ffassert(vp->N()==n); KNM mat(*A); intblas info,lw=-1; KN w(1); char JOBZ='V',UPLO='U'; dsyev_(&JOBZ,&UPLO,&n,mat,&n,*vp,w,&lw,&info); lw=w[0]; w.resize(lw); dsyev_(&JOBZ,&UPLO,&n,mat,&n,*vp,w,&lw,&info); if (info<0) { cout << " dsyev: the " << info << "-th argument had an illegal value." << endl; } else if (info>0) { cout << " dsyev: the algorithm failed to converge." << endl; } else if (info==0) { *vectp=mat; } return info; } template class Inverse{ public: T t; Inverse( T v) : t(v) {} template Inverse( TT v) : t(v) {} template Inverse( TT * v) : t(*v) {} operator const T & () const {return t;} }; template class Mult{ public: T a;bool ta; T b;bool tb; Mult( T aa,T bb) : a(aa),b(bb),ta(0),tb(0) {} // Transpose< Mult( Transpose aa,T bb) : a(aa),b(bb),ta(1),tb(0) {} Mult( Transpose aa,Transpose bb) : a(aa),b(bb),ta(1),tb(1) {} Mult( T aa,Transpose bb) : a(aa),b(bb),ta(1),tb(1) {} }; template class OneBinaryOperatorRNM_inv : public OneOperator { public: OneBinaryOperatorRNM_inv() : OneOperator( atype< Inverse< KNM* > >(),atype *>(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { Expression p=args[1]; if ( ! p->EvaluableWithOutStack() ) { bool bb=p->EvaluableWithOutStack(); cout << " Error exposant ??? " << bb << " " << * p << endl; CompileError(" A^p, The p must be a constant == -1, sorry");} long pv = GetAny((*p)(0)); if (pv !=-1) { char buf[100]; sprintf(buf," A^%ld, The pow must be == -1, sorry",pv); CompileError(buf);} return new E_F_F0* > ,KNM *>(Build* > ,KNM *>,t[0]->CastTo(args[0])); } }; template KNM* Solve(KNM* a,Inverse*> b) { /* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) * N (input) INTEGER * The number of linear equations, i.e., the order of the * matrix A. N >= 0. * * NRHS (input) INTEGER * The number of right hand sides, i.e., the number of columns * of the matrix B. NRHS >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the N-by-N coefficient matrix A. * On exit, the factors L and U from the factorization * A = P*L*U; the unit diagonal elements of L are not stored. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * IPIV (output) INTEGER array, dimension (N) * The pivot indices that define the permutation matrix P; * row i of the matrix was interchanged with row IPIV(i). * * B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) * On entry, the N-by-NRHS matrix of right hand side matrix B. * On exit, if INFO = 0, the N-by-NRHS solution matrix X. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, U(i,i) is exactly zero. The factorization * has been completed, but the factor U is exactly * singular, so the solution could not be computed. * */ typedef double R; integer info; KNM B(*b); integer n= B.N(); KN p(n); ffassert(B.M()==n); if(INIT) a->init(n,n); else a->resize(n,n); *a=0.; for(int i=0;i KNM* mult(KNM* a,const KNM_ & A,const KNM_ & B) { // C=A*B R alpha=1.,beta=R(ibeta); char tA, tB; if(init) a->init(); intblas N= A.N(); intblas M=B.M(); intblas K=A.M(); KNM & C= *a; C.resize(N,M); ffassert(K==B.N()); R *A00=&A(0,0), *A10= &A(1,0), *A01= &A(0,1); R *B00=&B(0,0), *B10= &B(1,0), *B01= &B(0,1); R *C00=&C(0,0), *C10= &C(1,0), *C01= &C(0,1); intblas lsa=A10-A00 ,lsb=B10-B00,lsc=C10-C00; intblas lda=A01-A00 ,ldb=B01-B00,ldc=C01-C00; if(verbosity>10) { cout << lsa << " " << lsb << " "<< lsc << " init " << init << endl; cout << lda << " " << ldb << " "<< ldc << endl; } tA=lda==1?'T':'N'; tB=ldb==1?'T':'N'; if(lda==1) lda=lsa; if(ldb==1) ldb=lsb; if(beta==0.) C=R(); #ifdef XXXXXXXXXXXXXX for(int i=0;i KNM* mult(KNM* a,Mult*> bc) { if( (bc.ta == 0) && (bc.tb == 0)) return mult(a,*bc.a,*bc.b) ; else if((bc.ta == 1 )&& (bc.tb == 0)) return mult(a,bc.a->t(),*bc.b) ; else if((bc.ta == 0) && (bc.tb == 1)) return mult(a,*bc.a,bc.b->t()) ; else if((bc.ta == 1) && (bc.tb == 1)) return mult(a,bc.a->t(),bc.b->t()) ; else // should never happen return NULL; } template KNM* SolveC(KNM* a,Inverse*> b) { /* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) * N (input) INTEGER * The number of linear equations, i.e., the order of the * matrix A. N >= 0. * * NRHS (input) INTEGER * The number of right hand sides, i.e., the number of columns * of the matrix B. NRHS >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the N-by-N coefficient matrix A. * On exit, the factors L and U from the factorization * A = P*L*U; the unit diagonal elements of L are not stored. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * IPIV (output) INTEGER array, dimension (N) * The pivot indices that define the permutation matrix P; * row i of the matrix was interchanged with row IPIV(i). * * B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) * On entry, the N-by-NRHS matrix of right hand side matrix B. * On exit, if INFO = 0, the N-by-NRHS solution matrix X. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, U(i,i) is exactly zero. The factorization * has been completed, but the factor U is exactly * singular, so the solution could not be computed. * */ typedef Complex R; integer info; KNM B(*b); integer n= B.N(); KN p(n); ffassert(B.M()==n); if(INIT) a->init(n,n); else a->resize(n,n); *a=0.; for(int i=0;i R Build2(A a,B b) { return R(a,b); } static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ if( map_type.find(typeid(Inverse* >).name() ) == map_type.end() ) { if(verbosity) cout << " Add lapack interface ..." ; Dcl_Type< Inverse* > > (); Dcl_Type< Inverse* > > (); Dcl_Type< Mult* > > (); Dcl_Type< Mult* > > (); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("*", new OneOperator2< Mult< KNM* >,KNM*,KNM*>(Build2)); TheOperators->Add("*", new OneOperator2< Mult< KNM* >,KNM*,KNM*>(Build2)); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( Solve<0>) ); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( SolveC<0>) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Inverse*> >( Solve<1>) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Inverse*> >( SolveC<1>) ); TheOperators->Add("=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("+=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("+=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("-=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("-=", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Mult*> >( mult ) ); TheOperators->Add("<-", new OneOperator2*,KNM*,Mult*> >( mult ) ); Global.Add("inv","(",new OneOperator1*>(lapack_inv)); Global.Add("inv","(",new OneOperator1*>(lapack_inv)); Global.Add("dgeev","(",new OneOperator3_*,KN*,KNM*>(lapack_dgeev)); Global.Add("zgeev","(",new OneOperator3_*,KN*,KNM*>(lapack_zgeev)); // add FH Global.Add("geev","(",new OneOperator3_*,KN*,KNM*>(lapack_dgeev)); Global.Add("geev","(",new OneOperator3_*,KN*,KNM*>(lapack_zgeev)); Global.Add("dggev","(",new OneOperator5_*,KNM*,KN*,KN*,KNM*>(lapack_dggev)); Global.Add("dsygvd","(",new OneOperator4_*,KNM*,KN*,KNM*>(lapack_dsygvd)); Global.Add("dgesdd","(",new OneOperator4_*,KNM*,KN*,KNM*>(lapack_dgesdd)); Global.Add("dsyev","(",new OneOperator3_*,KN*,KNM*>(lapack_dsyev)); } else if(verbosity) cout << "( load: lapack <=> fflapack , skeep ) "; } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/lapack.edp000644 000767 000024 00000004613 12250304424 020412 0ustar00hechtstaff000000 000000 load "lapack" // test of lapack load file ... // ....................... // load "fflapack" obsolete (F. Hecht version 3.8) // use load "lapack" int nerr=0; // nomber of err .. // to set a full matrix .. macro SETM(A,i,j,fij) { for(int i=0;i 1e-9; B=0; B = A*A1; // version 3.13 B -= Id; cout <<" ||A*A1-Id|| " << B.linfty << endl; nerr += B.linfty > 1e-9; inv(A1); A1 -= A; cout << "|| inv(A1) - A ||" << A1.linfty << endl; nerr += A1.linfty > 1e-9; } EndMacro TEST(real,complex,-100.,dgeev) TEST(complex,complex,100i,zgeev) TEST(real,real,1,dsyev) assert(nerr==0); // FFCS - value for regression checks real regtest=0; { int n=5; real [int,int] A(n,n), B(n,n), C(n,n); SETM(C,i,j,1./(1+i+j)) ; SETM(B,i,j,i==j?2.:1./n) ; A = B*C; cout << A << " " << endl; A = B + C; real[int] b(n),c(n); real[int,int] AA=A; AA=A; real [int,int] At=A'; b = A*c; At =A'; { real [int,int] A=[[0,-1,2],[4,11,2],[0,-1,2],[4,11,2]]; real [int,int] B=[[3,-1],[1,2],[6,1]]; real [int,int] E=[[11,0],[35,20],[11,0],[35,20]]; real [int,int] At=A'; real [int,int] C(A.n,B.m); C=A*B; cout << " C = " << C << endl; cout << " E = " << E << endl; C -= E; assert( C.linfty < 1e-10); C = A*B; C -=E; assert( C.linfty < 1e-10); } { complex [int,int] A=[[0,-1,2],[4,11,2],[0,-1,2],[4,11,2]]; complex [int,int] B=[[3,-1],[1,2],[6,1]]; complex [int,int] E=[[11,0],[35,20],[11,0],[35,20]]; complex [int,int] C(A.n,B.m); complex [int,int] At=A'; cout << "At = " << At << endl; C=A*B; cout << " C = " << C << endl; cout << " E = " << E << endl; C -= E; assert( C.linfty < 1e-10); C = A*B; C -=E; assert( C.linfty < 1e-10); // FFCS - value for regression checks regtest=C.linfty; } } freefem++-3.38-1/examples++-load/LapDG3.edp000644 000767 000024 00000003642 11406142255 020176 0ustar00hechtstaff000000 000000 load "Element_P3dc" load "Element_P3" // Discontinous Galerlin Method // based on paper from // Riviere, Beatrice; Wheeler, Mary F.; Girault, Vivette // title: // A priori error estimates for finite element // methods based on discontinuous approximation spaces // for elliptic problems. // SIAM J. Numer. Anal. 39 (2001), no. 3, 902--931 (electronic). // --------------------------------- // Formulation given by Vivette Girault // ------ // Author: F. Hecht , december 2003 // ------------------------------- // nonsymetric bilinear form // ------------------------ // solve $ -\Delta u = f$ on $\Omega$ and $u= g$ on $\Gamma$ macro dn(u) (N.x*dx(u)+N.y*dy(u) ) // def the normal derivative mesh Th = square(3,3); // unite square fespace Vh(Th,P3dc); // Discontinous P2 finite element fespace Xh(Th,P3); // if param = 0 => Vh must be P2 otherwise we need some penalisation real pena=1000; // a paramater to add penalisation varf Ans(u,v)= int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v) ) // Ok P4 + intalledges(Th,qforder=7)(// loop on all edge of all triangle // the edge are see nTonEdge times so we / nTonEdge // remark: nTonEdge =1 on border edge and =2 on internal // we are in a triange th normal is the exterior normal // def: jump = external - internal value; on border exter value =0 // average = (external + internal value)/2, on border just internal value ( jump(v)*average(dn(u)) - jump(u)*average(dn(v)) + pena*jump(u)*jump(v) ) / nTonEdge ) ; func f=1; func g=0; Vh u,v; Xh uu,vv; problem A(u,v,solver=UMFPACK) = Ans - int2d(Th)(f*v) - int1d(Th)(g*dn(v) + pena*g*v) ; problem A1(uu,vv,solver=CG) = int2d(Th)(dx(uu)*dx(vv)+dy(uu)*dy(vv)) - int2d(Th)(f*vv) + on(1,2,3,4,uu=g); A; // solve DG A1; // solve continuous plot(u,uu,cmm="P3 Discontinue Galerkin",wait=1,value=1); plot(u,cmm="Discontinue Galerkin",wait=1,value=1,fill=1); freefem++-3.38-1/examples++-load/LapDG4.edp000644 000767 000024 00000003542 11406142255 020176 0ustar00hechtstaff000000 000000 // Discontinous Galerlin Method // based on paper from // Riviere, Beatrice; Wheeler, Mary F.; Girault, Vivette // title: // A priori error estimates for finite element // methods based on discontinuous approximation spaces // for elliptic problems. // SIAM J. Numer. Anal. 39 (2001), no. 3, 902--931 (electronic). // --------------------------------- // Formulation given by Vivette Girault // ------ // Author: F. Hecht , december 2003 // ------------------------------- // nonsymetric bilinear form // ------------------------ // solve $ -\Delta u = f$ on $\Omega$ and $u= g$ on $\Gamma$ macro dn(u) (N.x*dx(u)+N.y*dy(u) ) // def the normal derivative mesh Th = square(10,10); // unite square fespace Vh(Th,P2dc); // Discontinous P2 finite element fespace Xh(Th,P2); // if param = 0 => Vh must be P2 otherwise we need some penalisation real pena=0; // a paramater to add penalisation varf Ans(u,v)= int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v) ) + intalledges(Th)(// loop on all edge of all triangle // the edge are see nTonEdge times so we / nTonEdge // remark: nTonEdge =1 on border edge and =2 on internal // we are in a triange th normal is the exterior normal // def: jump = external - internal value; on border exter value =0 // average = (external + internal value)/2, on border just internal value ( jump(v)*average(dn(u)) - jump(u)*average(dn(v)) + pena*jump(u)*jump(v) ) / nTonEdge ) ; func f=1; func g=0; Vh u,v; Xh uu,vv; problem A(u,v,solver=UMFPACK) = Ans - int2d(Th)(f*v) - int1d(Th)(g*dn(v) + pena*g*v) ; problem A1(uu,vv,solver=CG) = int2d(Th)(dx(uu)*dx(vv)+dy(uu)*dy(vv)) - int2d(Th)(f*vv) + on(1,2,3,4,uu=g); A; // solve DG A1; // solve continuous plot(u,uu,cmm="Discontinue Galerkin",wait=1,value=1); plot(u,cmm="Discontinue Galerkin",wait=1,value=1,fill=1); freefem++-3.38-1/examples++-load/LaplaceP3.edp000644 000767 000024 00000001217 11406142255 020724 0ustar00hechtstaff000000 000000 load "Element_P3" mesh Th=square(10,10); fespace Vh(Th,P3); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh) = // Definion of the problem int2d(Th,qft=qf7pT)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th,qft=qf7pT)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="LaplaceP3.eps",value=true); freefem++-3.38-1/examples++-load/LaplaceP4.edp000644 000767 000024 00000002666 11754421664 020750 0ustar00hechtstaff000000 000000 load "Element_P4" load "Element_P3" load "qf11to25" mesh Th=square(10,10); verbosity=4; for (int i=1;i<=26;i++) { cout <<" int1d order= "<< i ; int1d(Th,qforder=i)(1.); } for (int i=1;i<=26;i++) { cout <<" int2d order= "<< i ; int2d(Th,qforder=i)(1.); } verbosity=1; fespace Vh(Th,P4); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh) = // Definion of the problem int2d(Th,qft=qf11pT)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th,qft=qf25pT)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="LaplaceP4.eps",value=true); real[int,int] qq1=[ [0.5,0], [0.5,1]]; real[int,int] qq2=[[1./3,0,0],[1./3.,1,0],[1./3.,0,1]]; real[int,int] qq3=[[1./4,0,0,0],[1./4.,1,0,0],[1./4.,0,1,0],[1./4.,0,0,1]]; QF1 qf1(1,qq1); QF2 qf2(1,qq2); QF3 qf3(1,qq3); real I1 = int1d(Th,qfe=qf1)(x^2) ; real I1l = int1d(Th,qfe=qf1pElump)(x^2) ; real I2 = int2d(Th,qft=qf2)(x^2) ; real I2l = int2d(Th,qft=qf1pTlump)(x^2) ; cout << I1 << " == " << I1l << endl; cout << I2 << " == " << I2l << endl; assert( abs(I1-I1l) < 1e-10); assert( abs(I2-I2l) < 1e-10); freefem++-3.38-1/examples++-load/LaplaceRT1.edp000644 000767 000024 00000002350 11567136027 021057 0ustar00hechtstaff000000 000000 load "Element_Mixte" /* Solving the following Poisson problem Find $p$, such that; $ - \Delta p = f $ on $\Omega$, $ dp / dn = (g1d,g2d). n $ on $\Gamma_{123}$ $ p = gd $ on $\Gamma_{1}$ with de Mixte finite element formulation Find $p\in L^2(\Omega) and $u\in H(div) $ such than u - Grad p = 0 - div u = f $ u. n = (g1d,g2d). n $ on $\Gamma_{123}$ $ p = gd $ on $\Gamma_{1}$ the variationnel form is: $\forall v\in H(div)$; $v.n = 0$ on $\Gamma_{4}\} $: $ \int_\Omega u v + p div v -\int_{\Gamma_{123}} gd* v.n = 0 $ $\forall q\in L^2$: $ -\int_\Omega q div u = \int_Omega f q $ and $ u.n = (g1n,g2n).n$ on $\Gamma_4$ */ mesh Th=square(10,10); fespace Vh(Th,RT1); fespace Ph(Th,P1dc); func gd = 1.; func g1n = 1.; func g2n = 1.; func f = 1.; Vh [u1,u2],[v1,v2]; Ph p,q; problem laplaceMixte([u1,u2,p],[v1,v2,q],solver=UMFPACK,eps=1.0e-10,tgv=1e30,dimKrylov=150) = int2d(Th)( p*q*0e-10+ u1*v1 + u2*v2 + p*(dx(v1)+dy(v2)) + (dx(u1)+dy(u2))*q ) + int2d(Th) ( f*q) - int1d(Th,1,2,3)( gd*(v1*N.x +v2*N.y)) // int on gamma + on(4,u1=g1n,u2=g2n); laplaceMixte; plot([u1,u2],coef=0.1,wait=1,ps="lapRTuv.eps",value=true); plot(p,fill=1,wait=1,ps="laRTp.eps",value=true); freefem++-3.38-1/examples++-load/LapLNewSolver.edp000644 000767 000024 00000001316 11450301200 021637 0ustar00hechtstaff000000 000000 load "Element_P3" load "NewSolver" defaulttoUMFPACK(); verbosity=3; mesh Th=square(10,10); fespace Vh(Th,P3); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh) = // Definion of the problem int2d(Th,qft=qf7pT)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th,qft=qf7pT)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form verbosity=5; laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="LaplaceP3.eps",value=true); freefem++-3.38-1/examples++-load/LapMUMPS_seq.edp000644 000767 000024 00000001362 12477571157 021407 0ustar00hechtstaff000000 000000 load "Element_P3" load "MUMPS_seq" defaulttoMUMPSseq(); //verbosity=3; mesh Th=square(10,10); fespace Vh(Th,P3); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh,solver=sparsesolverSym) = // Definion of the problem int2d(Th,qft=qf7pT)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th,qft=qf7pT)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form verbosity=3; laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="LaplaceP3.eps",value=true); freefem++-3.38-1/examples++-load/LapNewSolver.edp000644 000767 000024 00000001254 11406142255 021542 0ustar00hechtstaff000000 000000 load "Element_P3" load "NewSolver" verbosity=3; mesh Th=square(10,10); fespace Vh(Th,P3); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh) = // Definion of the problem int2d(Th,qft=qf7pT)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th,qft=qf7pT)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="LaplaceP3.eps",value=true); freefem++-3.38-1/examples++-load/LapUmfpack64.edp000644 000767 000024 00000001320 11406142255 021350 0ustar00hechtstaff000000 000000 load "Element_P3" load "UMFPACK64" defaulttoUMFPACK64(); verbosity=3; mesh Th=square(10,10); fespace Vh(Th,P3); // P1 FE space Vh uh,vh; // unkown and test function. func f=1; // right hand side function func g=0; // boundary condition function problem laplace(uh,vh) = // Definion of the problem int2d(Th,qft=qf7pT)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) // bilinear form - int2d(Th,qft=qf7pT)( f*vh ) // linear form + on(1,2,3,4,uh=g) ; // boundary condition form verbosity=5; laplace; // solve the problem plot(uh); // to see the result plot(uh,ps="LaplaceP3.eps",value=true); freefem++-3.38-1/examples++-load/layer.edp000644 000767 000024 00000000131 11406142255 020266 0ustar00hechtstaff000000 000000 load "msh3" mesh Th=square(3,3); mesh3 Th3=buildlayers(Th,3); savemesh(Th3,"lll.mesh"); freefem++-3.38-1/examples++-load/Leman-mesh.edp000644 000767 000024 00000002474 12034157746 021165 0ustar00hechtstaff000000 000000 load "ppm2rnm" load "isoline" string leman="lg.pgm"; real AreaLac = 580.03; // $Km^2$ real hsize= 5; real[int,int] Curves(3,1); int[int] be(1); int nc;// nb of curve { real[int,int] ff1(leman); // read image and set to an rect. array int nx = ff1.n, ny=ff1.m; // grey value beetween 0 to 1 (dark) // build a Cartesian mesh such that the origne is qt the right place. mesh Th=square(nx-1,ny-1,[(nx-1)*(x),(ny-1)*(1-y)]); // warning the numbering is of the vertices (x,y) is // given by $ i = x/nx + nx* y/ny $ fespace Vh(Th,P1); Vh f1; f1[]=ff1; // transforme array in finite element function. plot(f1,wait=1); nc=isoline(Th,f1,iso=0.25,close=1,Curves,beginend=be,smoothing=.1,ratio=0.5); verbosity=1; } // the longuest isoline int ic0=be(0), ic1=be(1)-1; plot([Curves(0,ic0:ic1),Curves(1,ic0:ic1)], wait=1); int NC= Curves(2,ic1)/hsize; real xl = Curves(0,ic0:ic1).max-5; real yl = Curves(1,ic0:ic1).min+5; border G(t=0,1) { P=Curve(Curves,ic0,ic1,t); label= 1 + (x>xl)*2 + (y,+-++.Ysv|qlkmlt{~}nvl~~XQifrp}suo|ujkibbmsuigdbdhqfrqquxyhopmrzsyt=(8pyxdEO`gnrnxmwvzqqjhdl{ahbwnrju{vqinjjlr}|||z~x~||{|~riw}zvxsvR-,,-../4b|`M8+++,+++-c~yowtr{{{w}xyorx|von3jngqlyozyk~sckia\acmsoxpjlejipnyyaszoji}pc-&.wwhcNnzsrvt|~|tpkkgindhvrswprpttwgknjksyvx~|whmryvzvijK,,+,,,../O}}<.++*+++*+**3LGStmtvunqx{~vqzkn?:{}en~|nqu|ujhr_^ljvvbw}uoclupk`tvnhmxzX)'8unLqh{qtutu}ssjihm~t~jeelxnqursnpryxn}nklp{yzjt|yuy}y{xilpltovr\1++,+,,,,,-Ksijmw{{S++++++++++**)***,Yuxxx{}|yo|{vozykt5iz~tmwrskqgip{xtmq|abttn||jeolflztpdn|{lnqkntSC[exaGdggsurxuw|wvvvkemp~||qjgifkwt|syx|wytkjpnkkmiqypvxurwppsr8.--++,+,,+++/-++-.1.,**++++++**))()**,.9Zntqp{~z{{|gna?oux~~x~mh|wnzwjhyv|ldetz{ylno`hmsvppxs|pjypqyuhp{WVgzrnznqsuvpeecfvozrytw|rosolmlt}oeeoxl~}}xglmxz~[9/.--++,+,,++++))))+++,****++++**)(((**+**/?[++;bxd_]iXoo{}yiokcsyowt{pkv}}|kqsmjnptt~~bc[^]beek}hkhgpy}yjO]T`ǖ{pvvljsy|secc~qpspurv{|p{rknvylquwn~ossr{^<1//..,++,+,,++++++*****+****++))))((((***+)))+)))+.*++,+,2NX`Ym||}}~qx|qqpbder~iu~wom}zsqeeslkfr}ghqslpgc}pkr|ralwۮ}ytowtljlspehm}puqdezp}{zqw}u|rojo~wt}mo~}xryouzd431//..,,,,,,,**++************++))((((((**++))))((***)*+++*+*,+-5Ocew}y~vdclk}~kyjljnz}um}s}g^dnwpp{vwxhawxgil{x|Dz{fZ{~x}unkmqkknvbcvwzhjgm|vrxtopsrpoln{uxjr}qvw|tyu{}8200/0..,,,,,,,++++++++**********)(((((((****)((((())))))))*+*+**++--Nnh~|hsv{qgnr}zz{movzfkheollml{rsynsrimlqww}{{~oqqjop~mqvnxjrgqvvppmfmov}rs}yxnkr}~r{~}y}20.../-.,,,,,,,++++,,,,**********)(((((((****)((((()))))))))****+**)++.5T~ts}n|~wxukvns~ū}ns|vlzm|`lrupnmmeozctmWs}nal~zvyuphikqu}wmfmrzlr}plwg~}vt~vriquq}u{}p1/...,+,,,,+,+,,+++,,,,********))(((((((())))(((((())))))))))))))))))*+++;t~uyyuwspzwwssx~qvq{|~}lp|{wjfkoghiqujon]^INVi}~~zxlmo|sdowfprmrssxuzx{qypojyt{|wwhdekpp~z|zwyszaR_V;//.,,++,,,,+,+,,+,,,,,,********)((((((((((((((((((()))))))))))))))))))))**3g|x|u~u}t|y|t|}sfhzzi}{svjimqxyw~ea–`djc|yzmifoyiopjlmwiqpzuqvpwrns~wuefknws}|zwu{]333110/.-.++,,,,+,+,,+++++++****++))))))(((((((((((())))))))))))))))(((()))))))*1jwvslwyzzsyyo~~u{naemoebj{xigelnt|wk|t߱|ztmlqffjogkmnmumpz|mxz~}mpos}|uldhmpnisyu~{wQ4112000/-,--*,,,,,,,,,,+++*+*****++))))))(((((((((((())))))))))))))))((((*********0Vww}v||s}r}{u|~{|mjpswyjgys{sywfhpocjnxxoxњvuu{wx}snnjqdeidttrxzonc{}xyockustoolflpnktw}}x}81000/0/.-,-,*++++++++,,+++*+***+)+*))**))(((((((((((())))))))))))))))((((*+++++++*),D{qT9C>Iyz~{v~~kgfq}wmwuq|kn~mlugfp{dpx~~|d^͑|xs~ytvtt~ymcihkw{owjt|x}wypqxywmptmgioququ{~|wl2/......--,.,+++++++++,,+++*+***+)+)))*+))(((((((((((())))))))))))))))(((())*****)*+++:@DA-))**1Y~}öuxr~y|jmt}z}txvpunovvhpz~}w{yku|Pi{uqrssqqksuegjefn|vsphqgqqrtopvn|}{~zzklgiv|~b/--.-.----+,,+*****+++++++******+)****+*))))))))))))))))))))))))))))))))))(())*+)())**++*+*)((**,\p|{t|yznwwvzqxv~mw~]pvpihpiijemjadkvcbwfv|yuvortxtvyssz|{kdlxw~|}{x~{}MGE.,-,,-----,,++*****+*+++++******)*+,**+)))))))))))))))))))))))))))))))))))(((()))(((***))))(((*++,S~~}~~z~s}uzuwpk|z}x}us}cuͺ|fibtmsj~i`gr{benenvsrrlkmnppolr~zolmmzvv{}}~}{>.1.-,,*+,--.,++++*****+*+++++*******+,,*)*()()))))))))())))))))))))))))))))))(((((((((()))((((((())*++S~~||svxpn|t~|rsqi{{iu~z{}kkkxvpim{pdv|puzqqw~noplss|{t|vlig~{zy||~sP-./-++,++,--.,++++*****+*+++++********+++))()()))))))))())))))))))))))))))))))((((((((((((((((((((())*)*9dz~xrntqz}zzsm{r}tq{mgknyw{tzllnzqqtyylnlv}rx}|~wwlx~}yy~xdB1.-/-+++,+++--,++,+++++++++++++++++++++++++***))))))'())((()))))))))(((())))(((((((((((((((((((((((((((())*,?g{tpl{éyvq~yp|hhkoxmvt|~q}nhzvrlogoiilt|vxuryzyz~ztqzy~{cUC71--,+,-,+,,+,...++++,++++++++++++++++++,,++****++))))))&())((()))))))))(((())))(((((((((((((((((((((((((((((()))+<[utkltq~ϭzov|{}|qjw~{lijl|sp|wshv|}yxjnrjmklfccmp}pruy|v~z~}rwyv~}|tE/--,-,++,++,++,,++...,+++,++++++++++++++++++,,++****++))))))(())('()((()))))(((())))((((((((((((((((((((((((((((((((**+,./-/:Vv~~~}}ss|r{rv}}|~||mlnsihejnylnss{xtw~vvfwy{vnrjylkjsw||z|zz{|v~{|~wnI?;Mwwt~~|qy~vx}t~|vt{|}rek~xqoyyvrntwnrurwvt~}nvy|{u|{w~|}{N15-+,++,,+*,++@w}~^-,+****+,+++++++****++++++,+++,,,,+)++++++++++++,,,,+***+++))(())))))))))(''&())))))))))))))))))(((())))))))))))((((((((()))(((((*++,-.010724T~uruv}zv~}mvxv{|~{uxqz{}egempp{}}tusy|ppuqlqxyzvzz{~{{~sz{z~}uf<+**)+++++*))+++,2HKR@0,++*****++++++++****++++++++++++,,,*++++++,*+++++++++*+**++))(())))))(()('''&(('))))))))))))))))(((())))))))))))((((((((())))***)*++*+../.../9qmos}|y~}}uu{ptgoxzwx|rv{riqohbap}nu{uqvysiq}rxxtuvtxyu~}vt~}~}w@,++*)*++*+)))*+++*+*,,,,+++****++++++++************++++,,,++++++++)++++++++**+)*++))))))))))(()('''&((&))))))))))))))))(((())))))))))))((((((((())))*****++*+,-------cvss}||uy{{orbso{}stus|rrqr}~iodt}xndm{trswsws~fw{z{~|zjz|y}}{{}}z~]++*+****))))))*+,+*+++,+,++*************))**++++++++++++++++++++))*())++****+++*))*)))))(()))(())(')''''((()())))))))(()))))))))))()((((()))((((())**+++**++++,+++++--Wtqgw|~|}ztrru{{qypykupy|zyprumi{qpm~~{xr`c`oxmomn}}{w{wxu]ykslnv}~|y}zy|x}~|}t<*+******))))))++,,,,,,,,+++*************()******++++++++++++++++)))())++****++++))))))))((()(((()('*(&''''()())))))))(()))))))))))()((((()))((((()*++++++++++++++++++,/AVcmq}{~}}}y}sw|~ptsmts{ssunlnx}{tozxqtgkignwc|u{~}u|u`znU{zy~z}{{|}~~p;+)+++*+*)))))))+**++++++++++**********)*)(())))))))))++++++++++**)))())++****++++)())))))((()'((()(()('(((''(()))))))))))))))))))((()((''()))((((()*+++++++++++++++++++0214=V{{uxqn{v{|}wsnint}wmnagflitpmh{~higjmtxgu{mmipthFY{w~{vxuz}N.*******+*)))))))+**+++++++*++**********)((((((()(())))++++++++++(())))))++****++++*())))(())))&'('()()''(((&''()))))))))))))))))))((()('&'()))((((()*++++++++++*++++++,-343346exz{~rkmsmpqj{~t|ijr|yulgbfvtgqx}~mfcd_\lhfyolyuhiPV~~}zx{}~zy~v~xH++******))*))))))))))*+++++++++++++*****)((())))()))))))+++++*++))(()())))+++**++++*)()))((())))''''&)))'((((''''))))))))'()))))))))((((''(())))((((()))*++++++*++++++++,.354665Jrx}|kvj{qzwzwsl^^iz|im|ugkhkkpihpuyqmbda\OWtymY|svrꬋus}}|}{}~~||w~zz}}_:***++****)(**))))))))))+++++++++++++++++*(((())))))))))))+++++)++)))))())))+++)+++++))())()))))))('''''()(''('''(')))))))('())))))))))))''&()))))((((()))*++++++)++++++++,-3546658S|~n|niyz{qjnzyjavm\jjnrfhkjqko{~}~ubejg]eĚxkly{z~}z||~{t9*)(()*****(())))))))))))+++++++++++++++++*(((()))))))))())****+*)))))))())**+++*+++++**)))()))))))'&''(&())'((''((()((()))'&((()))))))))''(&()((()((((())**++++++*++++++++,,05686765hukwy~znlyxytjdqt}wedo}ykfanwbnynmnmplis{vvkmki}ngxp`dm鲃~y|z|}{~vx|k.(((((*****(((())))))))))++++++++++++++****(((()))))))))())))))++)))))))())++**+++++++++*))))))))))''''''())(()''(())((()))(')('*)))))))(''(&()))))((((()*+++++*++**+++*+-+,-.49;;;53=3155Oy}wlx~|vxkoopobdkgyjow}rypuqmlqtvppiooy}wxtb_Zaijɛvxvr||z~~|v{vu|m5(((('()))))))))))))(((())+++++++++++++++++*)))))))))))))())))))++))(()))(()))(())))+++++*))))))))))((('&()))()))'()))(''('()))(')'(((('(('((&'())))((((()**+++++-,**+**,-,,,/157=;9210.-,./M~}~t{{nqyixunihcu|rjZjomvqhp{ousxxl{urwyؾܱȽͿu~s}~}}{|x{yizv{x>)(((('')))))))))))))(((())+++++++++++++++++*))))))))))))))))))))++))(((())()))))))))****++))))))))))((()('())))))(()((('&(('(()('(&'('(''(()('()))))(((((*+**+++,.-**++,././//04697610/-,..07o}{u|}}qpqoylirmnhk|z~^Sequlnkystouxl_hu[{ĽƤx}~~|wx|{{yy}uwxx}zA))((((''())))))))))))(((()))))*+*)*+++++****)))))))))))))))))))))))))('(())(****)))))+,++*)))))))))))(()))(())))))())'&''&&)('')(&&&&'''&')'())**)))**))))*++++*+,.,**++-00/1431223440..,+-./18IY{vqnuv|o{x}qggqlcfrs^jhjdrnpx~~otoxrj`^g||zzvu⶚ƹӅxyz}}|y{}~~{zr~{~Z+*)((((((())))))))))))(((())))))+*))+++++*))))))))))))))))))))))))))()*()))))++++))))(+,+*))))))))))))(((())))))))))))'''''')('')(''''''''()()***+***+******,.-,+++.,*+,,/23343220./22/..,+-..0101GI@6;j}|zrpmiksrqrtxbe{m|hhesxovz~dtl~sha`srÏȡ葳{wvtz}~~z~yz{~}y||L,)))(((('(''())))'())))))()***)))**))+++++*))))))))))))))(())(())))))((*)))**+++**)))))*,,+))**)())))))(((()))))))())))))('())(())(((((((((()**++++++++*))*++-..+*+,,,++--03571/.//..21...-,../230125433:ewurrkihlifh_^lepwwzwv}{r}swqiqt|letxخǮ躰ᴉ|x{|wu}|zuvu}{{T2*))))(())'('()))))&())))**()****))()))+++++*))))))))))))))''))''))))))))))))+++++))))))))*.,*****(((()))(((())))('(()))))(((()))))))))))))))))*++***++++)((*,-...+,+,+--,,,.1340.----/30..//././3421233332;lwk{zvgmgo}sspnwuyhsq}tĪĘ}}ԫ{ɕ|wz|~yw{{yzz{twwula.))*)))(()*(('&'())('())))))()**))))(())*****)))))))))))))()(())'''()))())))))*****)))))))(*-.,+++*)*))))))))()***))(())))((((())))))))))))))))))*+***++++*))*+././--,++**,++-/10/.++,,.1.../0/../34211221228prvmyxxwv}|x}|vveuis}ݿ˱|ȗٱ~|w|uz}}l|{{y|~|z}v{zo.+)))((()))()(''''()))))))))((()**(())))))))))))))))))))))))()))))('&()))))))))))))))))))))))+,.,+**+++*))))**)(*+++**)())))))))))))))))))))))))()(*+***++++*****--././-,,+*+,++-0.//++++,//../00//14322101111>tvv{v~{zyxvyufa}qylroo~|}{hx{y}{v~x}}zvy{~~wa*(*'((()*))()'&'))))))))))))((()))(())))))))))))))))))))))))()))(()(&()))*))))))))))))))))))(*,,+***++,***))***)))**++*))))))))))))))))))))))))*****+++++++++***+...000.-.-+*,,-.-,--+**+,/.../01//1442332210//IR+')**))(*++++++*))))))))))((((((((())))))))++,0567885557741/-+++,.,7omvvxu{|qb^iqsrrq}qonrqqsoqnviTqǨuxzurwxz|z}|rz}w}~~}{q+'&%&&&&&&&'&''((*++++**)*****)))))(()())+++++*))))))))))))))))))))())('(,LimnxpV/*(()())))(((*))*+**)**)**+-2468GUV_n{vx~wdXOKMWt~~xmiqpwzyyoiR60+))))++++++)()))))))))((((((((())))))))**+.2469966666632/-,,-/,7uvwtzz~{tffhegplnpk~iljiio{tls|Δzy{u~}z{||y~}~~~}|yb&&&%'''(&'&(()((((*+++*)((*+*+)))))())())+++++*))))))))))))))))))))())(0Mrzsyjz~vF*)))))))(((((**,1;Y[QMPflhwy|~|{zurkjfsutuifijmg]\J20*+++*)()))))))))((((((((()))))))()*+-.0486334346552/--../M~zu~}urhdU]h`dgkkglrimksysqrxw♄|y}}}}~{xyw}vvz@)&&&%'(('%&'()*)((')***)(((*+**)((((())()*+++++*)()))))))))))))))))())9_nx}]0))))()))+13?Xhwwvnptvyzz|~}wrlhiv}pv|lskjtwwtswwA*++*)())))))))))(((((((())(()))()*+,-./32/000014741/...>u~}rzrrla^^ggj`^pbo}jrlkkzpq}vkvw᫞|lsy|||}w}yxkSZq|me(&&&'(((('&'()*+**))((()((())**))(((())))*++++++*)()))))))))))))))))(*Du||~rB,+**->Sbsuwyx|z|zy|z{zvuneh~wpxqlyjiquwz{tZE.))()(((()))))))))(((()))))))))'*+-..0/-,-///23320..4v}xngY^dcdkgth`r~qnHKczwpcmur|kȠy~}}v{}|zww|vI:++:Md:&%&%&''((('('(***++***)(((((())))(((()))))***+++*)())))))))))))))((((K~~z{mOLZlz~~}y|~}|}wvrutknwxxudwurnimuzz}pG;+*))((((((())))(((())(())))*()*,..--.---../0221.07uwqic^Y]aba[csdpc7X}wkjtzxqs䞬~~~{yy{~ww|l5*())'&(&&&&%'(()(('&&'((((())((((***)))))(((())))))))+++*))))))))))))))))(((7|~xxw~z~y{|~yt{{{vswyuoonjix||sckyox|ujswyzx{}yH-)())()(())))(((()))))))),**+-.--,-6-.-26864213PrurbVTWY^]UVlj{~ZXwrsxxitxr~{ww}xxzvrxr0&('((&&%%%&&&''(()))**+*****+***+*(((())))((()))))((()****))()))))()))))))((*Bq~}{uvsnx{twyytkjlu|rg~jeqzqvwziY:+,8DH+))))(((()))))))(8:--.;CVafjNHGoqvk\NMwp}~~wskb_[V\P[u{kgsmljzxsmsxqyv{~x{v{~y|ys|vxmfs|Z(((((('&&&&&&'&'(()++++****************+*))))))))))((()******(())))()))))))()*?|~~||{|wvpqxx|sizvx{{ysqoxzsst}{rtpqoiks~|}wxywnstT/)*)))((()))))*+G_\Qftxsrtut||vo|u}}{v{m`imb_Z^fikuk}vuv|v{ld|}{v~}}ywz}ys}{{{yugoP,'''(''&&&&&&''''(()**++***********+++,+))))))))))))((()******))))()()))))))()*F~|{y||zxrsxwxy{y}zy~|xtsihorsz|tp~~}vhmuvrqfilqhkklflxnrlsrsz{hPE+())(())))++*;pmqs|wyt}yu{{}x|{k`X_deW]hgz}yguzp{ypuwп{v~~wyvz|u{}}~~{p/&&&'('&&&&&&'''((((()*++************++**))))))))))))((()********))())))))))))),Iy~yyv{}|xvwsw~~w|znmtyv|{{|wv|vxgol\[hni^\_ig^d^hxwwqijrnsrw}z~~x[A*()(+-8F7++7ylrshb~v}{~z~udec]\OBmluv{|p}sz~tuphǶ}~|vwy|yx|m5&'%&''&%%&&&&'((((''()*+***+++++++++++*))))))))))))))()))*+*+++**))())))))))))*-Z~{{}~{~~~~yvz{qidah|xmhgdq{Ygbbn_QW_^]^enlykejknprx|{wux}|ysfN?NYkvzr[Ohzpsy~zwoy{~~oZgahdLfoqswvw^]|jrè|t{ҷڦz~~~y~q|}|x~|{{g,'&&&&&&&&&&&&'('''(''))*+*))**++++***++)))))))))))))))))+**+++,++*))))))))))))*+3u||yg_egz~y~~tcqxdlfcnp^mgaheqcuwdHQ^mmrv}ywpqstv}~vy~}{{~ywv~|stzlXcbd[\orlpigghmhkzm}pʕrzz}~{zxqy}~R&%%&&&%%%&&%&''('&'(''()**)(()**++++++++**)))))))))))))))***+++,,++)))))))))))*)1e}~}kwpnkq|}|xtxmhki~wvx|yrolwyg\\irasrtopxmjfhvxw}||}z~}uw}xoqv||_[abXMiqifgZb|sffc~s|t{紤ẫ~v|y|||oqmoywy3%&&&%&&&%&&%'((('&'(((()))(((*))))****++++*))))))))))))))))++++,,,++*))))))))++7R{{|zx~}||edkmt|ulkiiokwq{zulbRdqpkihouvvyrp~febo~w||zy}~|y~btsv~qo^]a[Mepknlgp{xqpgh|fzn̩Ŝu}~wxzx{y}pywuq{>&%&&&&&%%%&&%''''&&&''('(('((0WT183,1,+****)))))))))))))))))**+++,,++*)))(()),1[vtnqszwz|}|yvs~mm_dtymhgifgpp}|ahkmf``cm}c^ezzzyvwzz}zw||p{{~~b^a[E`shdkmkh{unrvs׭㪄~wmlzy|{rqrxt~xy{|{t}vE&&'&$&'%%$$&&%&&&&&&&%&('(*3O`f}s~vft]1*))))))))))))))))(((())++-.,********.D_nz}oeluyyz}|n}y~mb`Ywtechlovsz|~wwnZ}{`hg~qolyysvtptttr~x}}yv|{kYb]Mall]b`tlc^i{{nxyz镍xrsmmw}xyv{w{wznv|srssiA&%$%$$&&%%$%&&%&&'&%&&&')=Q[hy~m8))))))))))))))))(((())+++--,*++++3Ml{{w|yompx}z}}}~xedeb~u]brn_k|seurk}|v}z{vlrujqqlh]egrwssy~~rq|q_`XF]ki`^f^gzxk[chvxluoz{ory~~zxvns~uxz}{zwvk.%&%$$%%&%%%$%&&&&'('&&&%(Ax}}=)())))))))))))))(((())+++-..+,,0Jtyz|twqsz~{{u|qb^p}xnz|eZx}sls~yzbgzqofijfji`cUVgkchrsyxu}y~t}z^b^H\gbZ`wnedsl{pxywӼ唧{tvy~wyyyv{wv{yquxzpy~E$%&%$$%%%$$%%%&&&&'(('%%+O|x}ux}~:)())))))))))))))((()))*+*...-1Io}{xz|~{yuu{}ovs~|{}{w~zd{~{mupohvzdgkhgh]\YlWbd`Z_jllpgfvxuwkicYggXVmsi{yoDZ{˔ݛhxuv|~}{p~~QDz{ttvvytwyrx|zsy~_0$&&%%$%%$#$%%%&&&&&'(''@o~{|U))))))))))))))))((()*+)+,,-7Tozy}t|vutrv|}}~x}syuyxvw~{ltxxvpXi~{s\b^abnd^nj_\^YdUhh]Zkxuz|{vse}wd\geo~qawkr񤋌zqyzqxy7-uxtvxsv{|ww3%&%%%$$$%%$$%%%%%%&'((*J{|}{~{n+))))())))))))))(()0MFHQMF]x}|}vw{||yzt~spnszkoqq~xxyda~u{~}yo]XRXXekYWYk`\`bbdtw~tx{~ruSciftsevz|tܞpqyx\-Qt~{y|vy~y}}C'&&%#%$##&&%$%&&&%%())*U||v{{|G()))())))))))))((*d}~~}~xy}|y{y~|{rfri|uyfulpqty}{fsrvprspfVRWjrdhgqu}r~xmu|~bbnd]~kxhqqytwj{dlx~}G^}wzyy~~|}}q*%%&%$%$#$&&$$&%&&&&()*Lzzpz{6)))())))))))))))H|}{{z||}~}{yb]V__bc]vr~nlspS`X`_SAYdHhk~wh~u{zymjv~~rsqqlktskxj|zu}w|tqio}a}p{{{}s{{}F&&&&&&&&$$%&$$&%&&&&),I{}~~F*()))))))))))*)5{|~{}|z}{|~{y|tyhYaifgscqf|hlthM]eamYAdbtwyyt|v~{ltxzw~rr~yv{s]qxrqutivnpmWlu{}}|xn{x{R'%&&&&&&&$%&&$%&%&%''+Z~|}z{}~i.((()))))))))+5f|{z~xt}}zxy|zztnrwooirv|ywyrthhr[Twomw{s|xsv}pu|{|}ry|~|o^eszu{nabfwsyzy{||~}z~ux}~w|2&%&&&&&&&$$%&%&&&&%()*g~y{}|w|Z/))))))))))4kw}}y}|}}|yvy}po~{}~nrxqkoklxvmvt{sdYjn`e}ozjgk|jqgqz}mgmsi_gv|sz{{r{~~o_alwy{tb]byypu|vjfu{{||}~}|s}z1%&&%$%&&&%&&%$%&&&&(((k~zz{|xta8,)()()))*`y{{rtyxwzr{ytprgjfZcijn[^c_b_ohhot}kgjstfl~ssnnvoZpaqnxxssqrhdhq|~}|v|}{losquzyc_[zzswkw~wc[~}~}z{{|~~|}u-&&&$$%&&&&&&$#$&&&'*);z{zwx|~}w}z|srR3)*)())?}yx{x|~}s~~y{{u}sfjsh_YV[`b_V\\]dswgaa`ecjx~hcuidgx{xgv~vpyf]WW`kivv{zxnc~~t}mbdfwmqa_k{|}}uz}{xt~{ytxszw,&&&$$$&&&&$%$#%&&&')*\x{~v{zxyyxy}{~z|{vwws[7,(),h{~~}w{u~owty|~z{rrxkmer|yTX\acSTdehczgb_di~vflk{zp{vssre]mz}wytqsv|zsd~~gbjoya]a]\{v~xwsy|{w|{~{vrv~~~['&%&$$$&&&&$&%&&&(''(=vuyzxxwwzyz}|wz|~~|zxbEI[~}z}}}zsrprsvw|wpn|jgjndr~rtqf]_jqt{o|s|sjdkxwsmuz{y{~~ok{hlsp|YY\Xny}{xv|~~rv|~}v{}{}}i,&&%&&&%&&&''&&'%$)&'6m}uxz{wyyx|{}}ywx|}}z}}~z|}|{qy~wlorzwxvw|wz~xwxprw~pu}wfY\cejy||lE:?\~{|}z|ln}uuzxijXSZetztsyz}|u}{~xxty{~z]&&&&&&&&&&&''$'%&&(&*lz|}yyyx{y|{zvyy}~~~|{w{||{}v|}}oeyuzywysyuhxw|vwsuwᲑ|tkv{slecnjxyepo{pgkbc^Tdvzwtq~~{|{yyzy}~zP&&%%&&&&&&&''%&%'('(R}~xsruxyz{|~|z{}~~~|ogmpvyurstwvy|}|wwt|mnqΨԳzbly{`hhsymj{|smfijbWytyx{zzz|{}y|A&&&%&&&&&&&&&%%&(((6x~}|uvuz~{|zz{sqx~}sj^^eigmoov|yyyu|{p{}xxemt}Ģp|vxu~zzy^utyushgdbRts}~z|}wv{wyxt~sr~k'&&&%&&&&&&&&&&&'*+*i~}|sxwx~~}wwn|}so}~ulf]Zhkehqlovww~xyyxsuxztsrtxvv{m_j{uvȷæ~~d{z~}vnE{|umkcd]RUi~z}xr}y|xww||{~{N'&&&&&&&&&&&'('&(*1Tv~}{zyyy{st~||ouv}zwvdVYidjklx}wvqsottyxtgeggkmqm|txvim{~rl԰~qgmx|{n|qkj^SWq~xy~~}|ntwxw|}|~z|3%%&&&&&&&&&&''()*,]v}{xz~~{zwss~tyru|y}kdakvtpxylxwgmdgrmytrl}wvt{rpgoyn[_mmgyynn}|xxy~|mrg^nwu}w~{~x~|{wvww~zr~}|}i'%%&&&&&&&&&''')**+_|{yyxyy{z|}}yyxrsw{uZi[jwuqtqps}kuyfgig}|ig{}}wnypv}jw]bdnzhe|{rlhmx~{xtwy|z|u}stiitx}x|~{|}~|rwzvy}~~y{@'&&&&%%&%&&&'((**),I~~y~yxw{{}w|zz}uzwmrwmt~w{oc]c^oqrrs~}xy{ov~{cejigdpzuwnvcis[V^qxvsziyxsc__chhtbjjpx{ywzryvtkp|y~~y|~zsxwvuv~~{~}wW'%%&&&$$%#&&&&'))*+-`|z|yuyx~}|x~|ust{z}uuytsqxoowyov}~uql``g^cko{~yywvqktxpb]`^ccfqgkp}qerUU_}~hbso[r|rhYa\]elrum`gdY_csxvz~ntutwst|{~on}~u|yyw|~}}y|yxj3&%%%%&$%%$&&&&')(+-:uz{tzy{|xtpq~vnuxzrr~wnlnqop|upy||~ppeeja[mnow||{|yppx{oy{|ytg_`]mtihmp|rmpTZkyrqnueT}xkbfs{~snbl^^fo|o{stqz}wuv|~xytwyz}y^.'%%%%$'&&&&&&%&')*,,Yzyy~w}{{zvrrsrqvy{vozxwyvsskhrrs|xrz~yzoe_[\r|oossux{rwmnz{m}}sstosnqtel{yw{~zrSZn~]lv`Rrrxmiw|nleibh_q{u{z~vyt{r~yq}||y|y~}ykqx{{|g)&%%%$%$'&&&%&&%&')*+6qx~z~|yvwtrwnu|z{ssrsxzsqoqouzsz~smz}lha^ywpjjv{p}tojnjp}~zyxtuuw}hlaavnpss{u`Sk|ifWjmV}z|r|kpzuncexru~~{{~}}{~pky}~~z~x~}|}qqwrqtxz~x{~}}>&&&%%$%&&&&%%%&'(()*+Rz{yw{ywyxuwuwzxuvrsorutvvvszwhvdd`ao~noo}rupsuthz~xxyxvfg||dtczd`ozzsdjzye\botu|xh|ignjjpyw}{{|of`g{r{}yp{ztwwqoltw{||~P%%&&%%$%%%%%%%%&'(((*>yzw|wwzxxyvvxyuzvwwuqptxzxwqvzuoqtecfam{nzyw}`nmz|}s~ph`y|wo}pjjdknyusT\r|wmsruq|wcxixn}~zzymfx{|ron|{{rgffap}x}x~|zqqtrspux~~|z}u.&&&&&$$%%%#$%&&&&'(.Gm~ynv|zorzytry~|z|~xzvtsrxq~xuuvwrhidehhw{sy}o[_enzqoonvx}ytjk{zwwulob_oz|zz~xzocPWqqrq}zu{{jkziv||{vwz~v~tpqokmiixy~z}{xqigitxv{z}}{yy~M'&&%&%$$%$$$$%&&&&'8mwv|pynwy~{|}|wsr||rowt|~{z{unuxxnzzut{kdpyfee{|p~{wswulfd]aboe``dhvxwrodwmn{n\Zc`gv}wjs|wns}rc^R_ukvzztidptnutw|goosr~z|~}iempthZv}|{sqojjcf|uy~{}{yqmkmwz|xlzzy|p)&&&&&%$$$$$%#$$%%&(0pvyy}ypqsy{zt}u{uqsponmxz}}|tlhememwzzkx|s|rc]V_^\pl`bbaegxzrektjdkcqjUafguyi[^ngcci`V]ffon{uyq]}ovll{uolxqp}uvzzki^kqlnvyoi~swy~{pqsmmmheglzy|}v}q{{z{vssqpxvwvoy}h4&%%&%%%$$$$$%$$%%%&(/vxzxwssrrs~~|~ypoorqozspptoshkl_jz^ixwusrukuW`^ORSdx]]fptqzky~l[W\WYpjizy}|yUYZWTUQ`ZWU_V\pwjz~vvsoizirha~~pwynajwsmpqao|y~ipw}losplmuwyyyy~umt}{}}xkmxwww{|v~|~}O)%&%&&%%$$$$$$$$%%%%&&2uyxutrtvw~{tuwsjksun~uvutxkgdjsqmf{}}hqogbfTaqxzrlx}h|uhe`bmkzxvv|~tpSpj^TM]bSZfgfhdqvxnujwrk\bmWulgzpznicas~~v~pu}ygfipqzm~vvqv}zosvxursvuwvky{}}yy|.%&&%%%%$$$$$$$%%%&&&')a~~yrtzsqq~~}xnquljphsty}tst}rfhmkk~vquhebY`pofhvux{|wpicd{ds~{v]a{h\bx~jlcg_oqp~uz{|yrsxvn\zqUYtvyd^i}uzo|yfknxpv}{|s{qliny{vrx~u}|ymohv~xtstxyyh{~yzu)&&&&%$%$$$$$%#&&&((&'D}xx}vtwwsvxv{{}~qpporinhsy~umlcwzmodnqoss~sqpmxvmomc_qvvrfjiq|si||jaiakux`i{i]cw{~kkmi}vyug{wnnxsjhrYYio}jepoyqv|zum~mwwkm{|wyz~{lnp}~}~}y|xxwuw}{xstx}sy{|{1%&&%%%$$$$$$%$%%%&'))j{xwutyrtx{x{z{z~ysqunrrunnw~{syq}v{qemhwworjoxztkkjgyvlxgla`pkjxwjdf]eǫ~z{tryqeq}}t}||wywbb~s}wo~zyhdarta^hlpkpopsji|vgihx|~~~y|[{{pmf`}{~~z{}qwytsw~zwz{}{y|z:&&%$$%#$%$$$$&%%%%%&E|qt~~wtvvtzyutz}~{|{zyppqmuvsoyw}nbwdvoxrygisylfbbbpgq{mxg{htuukdcVhz|xuaw|mlmooeiyzuzmvyu{vs}h^WX]{~d~tw}klseZj^akx{uvci{z|kdc\~{||}{ty{|dlzz}~ru~~{|y`-%&#%%#$$%$$$%&''&'0Uztmz}u{vuwvsuvy}~~xx}so|qrrkpuww~knxtggvtvvpynrjgkcl}j}omtl[W_ixzu|oogz~smla\|pxwo]a_ggiu}teiopt{qaYoh_frqzw}ty}irytngel{w{wty~{sy|zxw{}~{yvC($%#%%$$$%%%%&&'((0lz||y~|{zzwwvxqtuy{|{}x~{vu|vttq}qurzynfty|lv~qovv}}qgeu|geq}lxpn[Rfyy{yyv}jh|zjwof]Szoieruyznton~yw|tn[it]^bwvxzy}iz}||||zmhkq~y~{y{rzz~~xw{~}}y~vo+'%#%'&$$$%%%%%%&')Zzzuwpx~}~wyxtv{utwy}{~|y|}t|pwwom}|yqixzszoqxyudtqgYbph_zuir|u|n\s|tsdbQc~lfbjv{{wpvxoefg}urynlt_jl]Zgttvw~~yh{spwz}}|xww~xu{~{xvxx}~sl.&&$%'%###$%%%%$&%<{y~~}{xyoz|}{yvvx{vxw{|tt|y}}xsw|{qupplfr~|}vo|kbdunZbu{rjo{seybkyo~fXXu}xviRiswobohl`m\bdft}b[Zbvmvyx}x`heme^miz|{}~y}V|vuwy~~}|l}{}||||}|qy}~yyzv{~{uJ%''$%&%%%%$%%$%%0q~vwv~}z|x~zywzzzy{}|~~}ysyz}|||snjen{}|}|~ja`fjoy}}lYebslfrr~wbkq~sywjWal}qnv}x^tv}|lfugaxszmyi[gtmcg~_j\elnmtz{wjyswevsa\|wxoxz{unx|}w{z~xtswz}x|}|~zt|{h)%&&&&&%&%#%$#%&Mw|~{{{yzz}{y~}~~}vrw}}mlkcxo«}zdi^ahk|ru~~fV\kj}hkkr|uitvojszdlkYflz}rrxyn]X`vz_\dwrn]``dmgp}pactsspvupiiXbqr~~t|{~rpnu{}~uuoiy~}|tiy|~}~~y{xkvxu,%&&&&&%&&$%$%'-o~{{zzzw{~~~|}{|{~~~{|~|y{zpnrnkips}jag`btuttzzhW^kkpnanzvu}wgZXjt`cj^i|u|{jh_[ablwvaYl{w\X`Z^hmqt{ypnmmxv{}eajwv{}v~z~z{nqtv{y||llaZg~pttzxzyt|wxg&&&%&&&&&&&&&%'\|}{w|muz|sx~~|~|}~}~y|~|v|tiqxkmpnjgysƕ|ͼ}y|cgjdd~~taRwmpudyn`_qx~vt|h\XUgsm[XYcv}vdccgxr^XY]X[dW`xge]kpxsYX_cnktppvyhxxrpsufassyzvt}|{v}yxv~zcQ`xy}|w~~zxvtw|~?%%&%&&&&&&&%&%Mzz~{}r}vv{}~||}}z{vrmikqoskeolb}qϢzqkhbbibwlWfu}f`lpodqwvyss]ahkpxfYYT`~u{lbj{xmXaYe]Y\_hywnx]tfx{karv^jm{{s}rqhhovtwwyrjx}|xxv|m]JUo}w~{{j}rtz|t{~w'&%%%%%&&&$%&'4vzz~v|v~|~z|}}}puqkjoptitdj~qquxcfjz~amsqjY]^nwkr}zyqiehrbevle`fo{|sup~tcedtjcofb_ij{hnksoi\`n_ur]_aajqquur{tpw|}vc|wmr~wx}z{y|s~ymM\_j~pmzz~z{{e&&%$%%%&&&(-6'%&%$$$%%$&%*g~{yyy|xwx}||{~{}|yrvyzvzwvx|v~n|shegojmi{zy}uzwozjmgcvw~cenvi[gs~yrpsxyl\k|zsnryxbdzqt^sy|wz`gce{mbjpl{|}dqstu~tsuutcTXicpnidkY~}o{tk|lkjerw~z~zwmy{zwnz}u}tdPMU[Yk}u|~}~@$&&%$$$%$%&',kxx~t|wz|z|u}~zyx{wvxxzwysbh_hfryrz{zulojobcctvѳiivl]kx{np|ƙl]{swuiu{~kivpahrvxh]b\bwxz{x|pdfmnk{u|auwr}zv|n`sij}rwgs~lqclknxmev}z}~uxx~t{zxzuyvyvdYX[Xfik|}|~~}}n)&&%$$$%&'((>}x~}}v|z{wyx|zy{}y{|vuo}yldcdu}smfe{zoexhmpznxpv|~}Ʊyviuvymymjupj[hovwywgdf_ae~~kW\ep}zjtsipfz{}~~tt_ghcyuӵvmlz|ytq}|z|}yz|zrxvxwuquxtmZ\qcjtx}x~|d'%%%$$$%&'('Rw||~z{rv~{ux{}}y{zyy{{|tkktvvpmkgdv~gg`fre^m~ojjÆx~yØltxzw{twwxhfj}sszs}ncmenpktxffo`]xrsĤ{zfh^Y`moz|lys|~uhdlsrreqeZk΢txtyx{{z}}q}sy{w{oikn}zwy}sq|}y|S&%&$#$$%&&&(35>Kr|zxssz~~ysz~y}yz}{oxxntvsyx|zw}ilc`dm{wuou~umtwtfylԲ}|svv~sbdyy~k@ltimtws|`c\aeogdYZrcthru~{okkxuwyj~uymjfhaqzy`\ecex|{syrh`jl_VZYZagrlkv~|||urYyp~}~{{uyrmqmbc`VD;8Wtyz{~}}{yvwv|}}z}{z|ttxvlwwweab[r}vtkxoot}zsl|ݖ~rmjtn|}dsy~}uskmmȬvvnZZhnikaZVgpjqvpwpjlslh|||ztpr|~wsqjlzw}p_bf]izxlkzy{yb\^kwbV\Y_hjuuXm~y}vw||}}wwal~h}lrsu\ZWJIMGajpxuz}|}~~zwz||y|{|wz{yzz}wlorz}f`\^opmqn|{urv{|w|񳍆wxhgevmesw{spmw|{gTYYufg_bmyxautwzyjjdev{}|tx}{yrwvml{ub_`dhr|qnjaim~sg[[mzwf_][bxv|^e}kwsx~y{bdcj||m~pnsvk^[bk_]\a`gddoyumu}z{|~v|}z~~{{{}zw~}tuyca^nqpkxv~z~zz垆xwml㴣exweknzwthr{rvf]UU]in{n~{~zofrrr~~g]eyv}}vzyzonfflprkt}syjbadnzx{sy~wzlbd`iubd`_Z]|sc~}uvy|l\}~}xxi~qyodiihhleml`fabcrqrqvwwyxy}z|}y|~tu|q{}u}|pqpk`\^xlnj}wzx|nry|{terwərsjōsimryy}xkikd_hledi|y~vnmu~xrff|ztwqaee\ohgXJJcia`^uh|lgurtumeys`Xa`_^jcsjiefkflty|yUquatyzulojqnvgniksu|{vqwurwz}y|~|}}z{wwzkryy~~~~zwwgposjebxkxyxz|kz}|zotϠ}~yy̸fsxicywlkfgjnsvrgvrxo[grs|~gnwxpoN8:BNXUTFMuf_`_gpzvj\ngv}sktzzidtog_fk\dj|pquys~p{|pa}~z{jizyzt}~z|rkojehfgmts}|yxxvrvsxsxyyz}|woryrkqu}x{}}||qwqxnbfuy|tzjnokm~{krrmqǷ|pmnƤ{w~r`hsjlkbeg_fcl{wtq[fcxxl|wrx|ngegXULJMWatswstfkr}{tdforss~oi}whefkggaoe[fvslsvsz|sn~qEV`y|{|xWvxxkyz~~x~mpebjljpppvrw|wutzrqlnz{}z~|xvqttkntz}y}|y~~okv`mzxvspw~qqwxkq}yڴ|qfbt|y||`d_ootfho}{~dl_^liwyk}}{xld\XLRWUSafly~qi\cttl|whr{|ʙtqy~nshagdux]`h_^eox{|yzzt|}{z}z||yf^jw|||~x{velexpowrvvuzw|yv|pnsvv{uzvspqslcjp~|xz|rsz|jme}ysnurqxxyvn{|yoh|ڗxrjbuhqʉ{u`]jdqmpq~|}p\|f}jkt~l~|p}nb[OPW^hsllrq~yw{~zjbkahn{zhk|Ůwurmaflkmn]dux{nlr~~|~{z}zz|y|z~sqgmhvqnzzyvruz}zx{|zypsqsosonwongjqx}}|}z{zq}yqfry{x|}xsurqyp|~ƃ}xltx}{l׏zgWVakgoqfeoeszyyfaqn{}wr{hUTTafmckvu{}||zwu~}o~ثr~wcokibwinx~yzx{f`pz|}zw~~|y|vzrpobmvtxruxvy{{|}xz{vwvttz}x~{ssqv|~}{no~uyr||xwmm}|}yu|Σz~tdVc{zfpkW^ifľyxpjch~~wl^lzmjkef|w~|u}zܧytzyxv{z\ejie_Zco~|qc[j^]u{}yy~u}y}|yxwwlgjywuv~r~syz{|}~xzywwuzz~~w||~~|}ur{ut}{~wsmtȸ}|z~sptؽyr]_odbW]uup|ixtǏ}mea^iu}w~zuq~kbdqcqr}xut{ٱ~z~mt껸uv}h{veSaedo_`gs{}}vZZZiW_vv}|n~~}|ux}tuw{xoomzwo~{uu{{{}}|y}v{svx}~zxvv{}usjuy{vtu~yy|vo{{|wz~jei}vuor{rsj^\wqlfYwxstqz|}~ffdabpy~yznlibffk~~~~|tzp~|xqcxlWUfinqaYfwuw~u]Xfeh_ik~yuyzpopvsy}x}~|z{{xvxryotr{uy|uoz|vy}|}{vyvruz|{xrvrvutz~n|uvbhqrsx~tyuq~r|}{jn˝rgfgjgqek{DZohnii}xzrjyponop{z{uq|zicb`x|uw||{pzwsiu}ݹsj_wmYYeosgVZaz|`Rfhznkfcuwqy|tnpvwyrww|}}{u~|xurt|uzz~xt|uz{tyt}zo}}zlxr~msnvx|ruwm~vszxz~n~~{{rjj~jf_Y^`ozz~qƚyhozzu}koef}pxlgsn{{lpv~i_lz|ưq_smeWRblc^efevxxROhuxslso}u{~oxlsx|rvy}|}z}z{xyvz{z}kvtr~}szooo~u~~zuxiuvx{p~utzy{prm}omuplz}p}||zx~|}uhorj|{fgwwoغ~zɢȲyjqx|z{ilwdspyu`wz}yqispst`W]lw~y˯ybp`^^^gqstpqomzuse|yyhY^koi}w}snyzox{xtx~z~z|~~|}|{yvz~tod|y{kvsuto{|w|}y{}}o~}yuu|xzxz~}ilsxnis~ig~mfhtr{z}}gllnujwíŽƠ}ps}pdp|xwy{yzqurh_QVc]jslabrkqztr̫}ujyoal\_dgqz}yzztyy{~w}muhfs}zyyunxqqy{{~~~~zz~y~}~z~{rpouvolvttwzy}zysxzqm~v~{y~wv}xw~xlssorp~mzqdbgdv{zlken}»̥Ӷq\ijre]\ou}ovxz{qy|nmibU`hZ^wzd[h]o}t泟wyypfv~wjmtcqorwww|yscn]k][rmpt{|umow~z|x{~{}|~{~wtu}|}}z{u}~_vwu~z{vpjhxqqx{pz|tzukqplnpvk}}l_bz}qjlħ嶚Хgk~kcika[a^bnqusu{|{xh\_`bipYismnxjw~涖}eohdv|htfpuoxseg{|{gmjou`~yXfVnwomw~}w}||x}}zy}w}|vst~|~||}|~yvheq|t~wxv{y|z{|sq{vigsq}mmis}z||~uko|xıȧŇrl{wtbb^bjz{vqifonzpq`Yartrx}peu|ƨ}~|u`\hqvrsmlnkt~zxfhhir`d}fYws{}}ky{|w{~|}~spvz{}~}}zi^dku~}sv|}}v|yw}{ntvtdl|x}sbmnr}go{~yrklw{qnҾȡĝuytmӕobcmqwn^`rxwuqrmYknqzqzwxμ}x}fVgmhfosd}psttnncifme~{yzyohex~|x|~y{yz~zx{~|~vp|~|s_Qju|}y~t|~|uhjl~}}inywunlyxe]ij⮤s΋tc`bu{b`bruyvxmfV`e{}uwʻqx~|mb[p_XagtoqirtgOe{zsr{|o]kom~}{|z}wv{~{w|~|}}{z{~xm\ao{z~zy{|~mnfpjwfrϗz{slo{~qoqȿëȻޜuptwέ|vblws^Ygotpldj}ƾ×z~~şȒs{~{i[emchZaksmppoq{iyKKr~jfvvmaZfmkw{|xt}~{xz~}z{}~|eh{ty{yt{z|}}{ychm|{}tigl}y}yxy~{dljdno~l㺝r㦞i~ru«sns{e]WmyzynhkyØw{ss|yp|mrWj]arYTbrkqspsscaguuqyyyj[RRcmqx}y|xzy{w|}m~~{z|x|p}ygTwyw}yt{{zqhrtv~ylyrtx|~utx}|vkihjn^`Wi֧l{ͮ}e}Óxxegnss~qxrcaizxwxk{{{}n^Zh]a`qadv~w]gm}PTȺodROZljsy~x|u}{uyyn~z|x~|x|~m~~|[Olyw{{ww~z|zlarythu{vzv{jju}ur{{gkc]sr|tڴqvuot}tapnhzsynupoѶȽշȰs|}uxjYdhV^p{vhqx~qs@UR\Ȗ|zqzcOOTgggrvw{toysuw|p}}ysr}vsyiL^yrtt{~{v|ilwq|{xut|x{yetm|}lkvqx|~m~{v`fxv~jilXmș|rnz|}wqw{ȫѱհy{~~vzhu~\badnppvvn}~x|}vdicǹukol|zi|jQRYUfacgsrwfreefem++-3.38-1/examples++-load/lgbmo.cpp000644 000767 000024 00000021402 12466661714 020305 0ustar00hechtstaff000000 000000 // -*- Mode : c++ -*- // // SUMMARY : // USAGE : // ORG : // AUTHOR : Frederic Hecht // E-MAIL : hecht@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //ff-c++-cpp-dep: bmo.cpp #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" #include "MatriceCreuse_tpl.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" #include "bmo.hpp" //template extern Block *currentblock; typedef double R; class OptimBMO : public OneOperator { public: typedef KN Kn; typedef KN_ Kn_; typedef R REAL; typedef KN VECT; typedef KNM MAT; typedef VirtualMatrice VMAT; const int cas; class E_BMO: public E_F0mps { public: const int cas; static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =16; Expression nargs[n_name_param]; Expression X; C_F0 inittheparam,theparam,closetheparam; Expression JJ,dJJ; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} R arg(int i,Stack stack,R a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} string *arg(int i,Stack stack,string * a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} void Set_arg(int i,Stack stack,Kn_ v) const { if(nargs[i]) v= GetAny( (*nargs[i])(stack) );} class lgBMO: public BijanMO { private: Stack stack; Expression JJ,dJJ,theparame; protected: void setparam( const KN_& x ) { KN_ *p=GetAny *>( (*theparame)(stack) ); ffassert( p->N() == x.N()); *p =x; } public: lgBMO(Stack s,int n,Expression t,Expression J,Expression dJ, int wnbrestart=1, int wnbext1=1, int wnbbvp=5, int wnbgrad=5, double wepsfd=1e-5, double wrho000=100, double wepsloc=1e-4, double wepsij=1e-6, int nn100=100) : BijanMO(n,wnbrestart,wnbext1,wnbbvp,wnbgrad,wepsfd,wrho000,wepsloc,wepsij,nn100), stack(s), JJ(J),dJJ(dJ),theparame(t) { } ~lgBMO() { } /* ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* functional definition */ /* ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ double J(Vect & x) { setparam(x); double ret= GetAny( (*JJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); return ret; } /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ /* gradient exact, no defini => DF */ /* cccccccccccccccccccccccccccccccccccccccccccccccccccccccc */ double * DJ(Vect & x, Vect & fpx) { if(!dJJ) return 0; setparam(x); fpx=GetAny( (*dJJ)(stack)); WhereStackOfPtr2Free(stack)->clean(); return fpx; } void result(Vect & xoptg,Vect &vinit){} }; E_BMO(const basicAC_F0 & args,int cc) : cas(cc) { int nbj= args.size()-1; Block::open(currentblock); // make a new block to X = to(args[nbj]); C_F0 X_n(args[nbj],"n"); // the expression to init the theparam of all inittheparam = currentblock->NewVar("the parameter",atype *>(),X_n); theparam = currentblock->Find("the parameter"); // the expression for the parameter args.SetNameParam(n_name_param,name_param,nargs); const Polymorphic * opJ=0; const Polymorphic * opdJ=0; if (nbj>0) { opJ= dynamic_cast(args[0].LeftValue()); assert(opJ); } if (nbj>1) { opdJ= dynamic_cast(args[1].LeftValue()); assert(opdJ); } JJ=dJJ=0; JJ= to(C_F0(opJ,"(",theparam)); if(opdJ) dJJ= to(C_F0(opdJ,"(",theparam));// Modif FH 17102005 (a verifier) to ->to closetheparam=currentblock->close(currentblock); // the cleanning block expression } virtual AnyType operator()(Stack stack) const { WhereStackOfPtr2Free(stack)=new StackOfPtr2Free(stack);// FH mars 2005 /* basicAC_F0::name_and_type OptimBMO::E_BMO::name_param[]= { { "eps", &typeid(double) }, { "nbrestart",&typeid(long) }, { "nbbvp",&typeid(long)}, { "nbgrad",&typeid(long)}, { "epsfd",&typeid(double)}, { "epsloc",&typeid(double)}, { "epsij",&typeid(double)}, { "n100",&typeid(long)} // 7 }; */ R tol=arg(0,stack,1E-6); // not used .... int nbrestart=arg(1,stack,5L); int nbext1=5; // bof bof int nbbvp=arg(2,stack,5L); int nbgrad=arg(3,stack,5L); double epsfd=arg(4,stack,1e-5); double rho000=arg(5,stack,1e-5); double epsloc=arg(6,stack,1e-4); double epsij=arg(7,stack,1e-6); int n100=arg(8,stack,100L); int diagrand=arg(9,stack,0L); R cmin = arg(9,stack,-1000.); R cmax = arg(10,stack,1000.); //KN_ vmin = arg< KN_ >(11,stack, ccmin ); // KN_ vmax = arg< KN_ >(12,stack, ccmax ); string * datahist =arg(13,stack, (string *) 0 ); string * datachist =arg(14,stack, (string *) 0 ); int typealgo =arg(15,stack, 1L ); try { Kn &x = *GetAny((*X)(stack)); const int n=x.N(); Kn xmin(n),xmax(n); xmin=cmin; xmax=cmax; Set_arg(11,stack,xmin); Set_arg(12,stack,xmax); //Kn * para = GetAny*>( inittheparam.eval(stack) ) ; // do allocation KN_ param(x); //cout << nbrestart << " ---- \n"; lgBMO nrj1(stack,n,theparam,JJ,dJJ,nbrestart,nbext1,nbbvp,nbgrad,epsfd,rho000,epsloc,epsij,n100); nrj1.diagrand=diagrand; nrj1.debug=verbosity; nrj1.typealgo=typealgo; nrj1.histpath=datahist; nrj1.histcpath=datachist; double fopt=nrj1.main(x,xmin,xmax); if(verbosity) { cout <1) { cout <<" The number of call to J : "<< nrj1.nbeval << endl; cout <<" The number of call to dJ : "<< nrj1.nbevalp << endl; } if(verbosity) { cout <<" Initial J value : " << nrj1.finit << endl; cout <<" Final J value : " << fopt<< endl;} } } catch (...) { closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 throw ; } closetheparam.eval(stack); // clean memory WhereStackOfPtr2Free(stack)->clean(); // FH mars 2005 return 0L; //SetAny(0); Modif FH july 2005 } operator aType () const { return atype();} }; E_F0 * code(const basicAC_F0 & args) const { return new E_BMO(args,cas);} OptimBMO(int c) : OneOperator(atype(), atype(), atype *>()),cas(c){} OptimBMO(int c,int cc) : OneOperator(atype(), atype(), atype(), atype *>()),cas(c){} }; //template /* BijanMO( ndim, nbrestart=1, nbext1=1, nbbvp=5, nbgrad=5, epsfd=1e-5, rho000=100, epsloc=1e-4, epsij=1e-6, n100=100) */ basicAC_F0::name_and_type OptimBMO::E_BMO::name_param[]= { { "eps", &typeid(double) }, { "nbrestart",&typeid(long) }, { "nbbvp",&typeid(long)}, { "nbgrad",&typeid(long)}, { "epsfd",&typeid(double)}, { "rho000",&typeid(double)}, { "epsloc",&typeid(double)}, { "epsij",&typeid(double)}, { "n100",&typeid(long)}, // 8 { "max",&typeid(double)}, // 9 { "min",&typeid(double)}, // 10 { "vmax",&typeid(double)}, // 11 { "vmin",&typeid(double)}, // 12 { "histfile", & typeid(string*)}, // 13 { "histcfile", & typeid(string*)}, // 14 { "algo", & typeid(long)} // 15 }; /* class Init { public: Init(); }; $1 */ static void Load_Init() // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ { Global.Add("bmo","(",new OptimBMO(1)); // j + dJ Global.Add("bmo","(",new OptimBMO(1,1)); // j + dJ } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/load.edp000644 000767 000024 00000000526 11656306311 020103 0ustar00hechtstaff000000 000000 // Example of dynamic function load // -------------------------------- // $Id$ load "myfunction" // dumptable(cout); mesh Th=square(5,5); fespace Vh(Th,P1); Vh uh= myfunction(); // warning do not forget () cout << uh[].min << " " << uh[].max << endl; cout << " test io ( " << endl; testio(); cout << " ) end test io .. " << endl;freefem++-3.38-1/examples++-load/load.link.in000755 000767 000024 00000022550 12505270305 020676 0ustar00hechtstaff000000 000000 #!/bin/sh # Create a loadable object from a C++ function defined in a .cpp file # $Id$ thecommand="$0" dircommand=`dirname "$0"` FFVERSION='@VERSION@' FFCXXFLAGS='@CXXFLAGS@ @CPPFLAGS@' FFFFLAGS='@FFLAGS@' FFFLIBS='@FLIBS@' FFCXX11FLAGS='@CXX11FLAGS@' INCFF= if [ "@ENABLE_FFCS@" != "yes" ] ;then ffcs=0; else ffcs=1;fi if [ -z "$CXX" ] ; then CXX='@CXX@' ; fi if [ -z "$MPICXX" ] ; then MPICXX="@MPICXX@" ; fi if [ -z "$MPI_LIB" ] ; then MPI_LIB="@MPI_LIB@" ; fi if [ -z "$F77" ] ; then F77="@F77@" ; fi if [ "$CXX" = '@'CXX'@' ] ; then CXX=""; fi if [ "$MPICXX" = '@'MPICXX'@' ] ; then MPICXX=""; fi if [ "$F77" = '@'F77'@' ] ; then F77=""; fi if [ "$FFCXXFLAGS" = '@'CXXFLAGS'@' ] ; then FFCXXFLAGS=""; fi if [ "$FFFFLAGS" = '@'FFLAGS'@' ] ; then FFFFLAGS=""; fi if [ "$FFFLIBS" = '@'FLIBS'@' ] ; then FFFLIBS=""; fi if [ "$FFVERSION" = '@'VERSION'@' ] ; then FFVERSION=""; fi if [ -z "$INCFF" ] ; then if [ -f "@INCFF@/ff++.hpp" ] ; then INCFF="-I@INCFF@" elif [ -f "${dircommand}/include/ff++.hpp" ]; then INCFF="-I${dircommand}/include" elif [ -f ../examples++-load/include/ff++.hpp ]; then INCFF="-I../examples++-load/include" elif [ -f "FFAPPLI_INC/ff++.hpp" ] ; then INCFF="-IFFAPPLI_INC" elif [ -f '@ff_prefix_dir@/include/ff++.hpp' ] ; then INCFF='-I@ff_prefix_dir@/include' else ff=`which freefem++.exe`; ffinc=`dirname "$ff"`/examples++-load/include if [ -f "$ffinc/ff++.hpp" ]; then INCFF=-I"'$ffinc'"; else echo " erreur PB include freefem++ directory " ; exit 1; fi fi fi do="yes" DEBUG="" CONLY="false" uu=`uname -s` INC="" LIBS="" DLL="" bin="." out="" files="" fileso="" OTHER=""; WIN32=""; case "$uu" in CYGWIN*|MINGW*) if [ -z "@WIN32DLLTARGET@" ] ; then onwin32=1; uu="cygwin-version"; else onwin32=1; uu="win32"; # pure windows fi WIN32="win32-" wff=`which FreeFem++.exe` dff=`dirname "$wff"` if [ "$bin" = "." -a -f ../src/bin-win32/libff.dll ]; then bin=../src/bin-win32 elif [ -f "$dff/libff.dll" ]; then # modif for install on cygwin bin="$dff" elif [ "$bin" = "." -a -f ../libff.dll ]; then bin=.. elif [ "$bin" = "." -a -f ../../libff.dll ]; then bin=../.. fi;; esac autodep="" withmpi="" args="" while [ $# -ne 0 ] ; do argsp=$args args="$args '$1'" case "$1" in -[h?]*) echo usage $0 "[-n] [-g] [-win32] [-l libfile] [-I includedir] files" echo " -auto : build automaticaly the dependance (in test FH) " echo " -n : do nothing just print" echo " -g : compile with -g option" echo " -c : compile only" echo " -mpi: with mpi" echo " -nompi: without $MPI_LIB links " echo " -O* : compile with -O* option" echo " -cygwin: compile for cygwin/win32 OS (Window XP, ...)" echo " -win32: compile for win32 OS (Window XP, ...) default under cygwin" echo " -l files add files to the ld process (link)" echo " -I dir add dir in include seach dir for compilation" echo " -b dir to change the default install dir " echo " -dll file add dll and this file copie in the install dir" echo " -o outputfile without suffix" echo " file.{cpp,cp,cxx,c,f,F}" exit 0; ;; F77=*) F77=`echo $1|sed 's/[A-Z0-9]*=//'` ;; CXX=*) CXX=`echo $1|sed 's/[A-Z0-9]*=//'` ;; MPICXX=*) MPICXX=`echo $1|sed 's/[A-Z0-9]*=//'`;withmpi=yes ;; F77=*) F77=`echo $1|sed 's/[A-Z0-9]*=//'` ;; CXXFLAGS=*) CXXFLAGS=`echo $1|sed 's/[A-Z0-9]*=//'` ;; FFLAGS=*) FFLAGS=`echo $1|sed 's/[A-Z0-9]*=//'` ;; MPI_LIB=*) MPI_LIB=`echo $1|sed 's/[A-Z0-9]*=//'` ;; -std=*) CXXFLAGS="$1 $CXXFLAGS" ;; -auto) autodep=yes;args=$argsp;; -mpi) withmpi=yes;; -nompi) MPI_LIB='';withmpi='';; -n) do="no";; -g) DEBUG="$DEBUG $1";; -c) CONLY=yes;; -O*) DEBUG="$DEBUG $1";; -cygwin) onwin32=1; uu="cygwin-version";; -win32) onwin32=1; uu="win32";; -b) bin=$2 ; shift;; -I*) INC="$INC '$1'";; -D*) INC="$INC '$1'";; -dll) DLL="$DLL '$2'";shift;; -[Ll]*) LIBS="$LIBS '$1'" ;; # FFCS - 27/10/11 - need quotes for MPICH libraries in 'Program Files' under Windows *.a) LIBS="$LIBS $1" ;; *.so) LIBS="$LIBS $1" ;; *.dll) if [ -f "$1" ] ; then LIBS="$LIBS '$1'" elif [ -f "$bin/$1" ] ; then LIBS="$LIBS '$bin/$1'" else echo " erreur file not found $1" ; exit 1; fi;; -Wl*) LIBS="$LIBS $1" ;; *.cpp) files="$files '$1'"; o=`basename "$1" .cpp` ; fileso="$fileso '$o.o'"; args=$argsp;; *.cp) files="$files '$1'"; o=`basename "$1" .cp` ; fileso="$fileso '$o.o'"; args=$argsp;; *.cxx) files="$files '$1'"; o=`basename "$1" .cxx` ; fileso="$fileso '$o.o'"; args=$argsp;; *.c) files="$files '$1'"; o=`basename "$1" .c` ; fileso="$fileso '$o.o'"; args=$argsp;; *.f) ffiles="$ffiles '$1'"; o=`basename "$1" .f` ; fileso="$fileso '$o.o'";; *.F) ffiles="$ffiles '$1'"; o=`basename "$1" .F` ; fileso="$fileso '$o.o'";; *.o) fileso="$fileso '$1'"; o=`basename "$1" .o` ;; -o) out="$2"; shift;; *) OTHER="$OTHER $1";; esac shift done # remove old file... FH sep 2013.. SUF=@DYLIB_SUFFIX@ if [ -n "$autodep" ] ; then # echo "$thecommand" $args `eval "'$dircommand/ff-get-dep'" -ff $files` argsdep=`eval "'$dircommand/ff-get-dep'" -ff $files` error=`echo "$argsdep"| grep ERROR` if [ -n "$error" ] ; then echo " WARNING in auto dependance seach ( missing plugin $2) . sorry : $error " # FFCS - 28/11/11 - we need to stop compiling as soon as there is an error because we want a fixed set of features in # FFCS # return a error when FFCS enable .. FH. echo " -- $error " >>Missing-plugins-@DYLIB_SUFFIX@.log exit $ffcs; fi echo eval "$thecommand" $args $argsdep eval "$thecommand" $args $argsdep # FFCS needs an error exit code to make sure that all libraries are correctly compiled exit $?; fi if [ -n "$onwin32" -a ! -f "$bin/libff.dll" ] ; then echo " Error the file libff.dll must be exist in '$bin' the install directory," echo " to link on windows OS " echo " Use the parameter -b to set the correct install directory " exit 1; fi if [ -z "$out" ] ; then out=$o ; fi; if [ -f "$out.$SUF" ] ; then rm $out.$SUF ; fi # Default compiler if [ -z "$CXX" ];then CXX=g++ ; fi if [ -n "$withmpi" ]; then CXX=$MPICXX;fi test "$withmpi" = "yes" && WMPI_LIB="$MPI_LIB" # build a mpi version of the plugin if the plugin do exist un mpi dir # and if the mpi version exist and if OWMPI="" test -d ../examples++-mpi -a -n "$MPI_LIB" -a "$withmpi" != "yes" -a ! -f "../examples++-mpi/$out.cpp" && OWMPI="../examples++-mpi/$out.$SUF" test -f "$OWMPI" -a -n "$OWMPI" && rm "$OWMPI" INC="$INCFF $INC" SHARED="-shared" case "$WIN32$uu" in Darwin*) # echo "export MACOSX_DEPLOYMENT_TARGET=10.3" # export MACOSX_DEPLOYMENT_TARGET=10.4 # SUF=dylib SHARED="-bundle -undefined dynamic_lookup" ;; win32-CYGWIN*|win32-win32) echo " Window without cygwin " WMPI_LIB='' b="$bin" LIBS=" '$b/libff.dll' $LIBS $DLL" # FFCS - 17/10/12 - --unresolved-symbols=ignore-all is not understood by the current mingw64 compilers SHARED="-shared -Wl,--enable-auto-import" # FFCS - 17/10/12 - -mno-cygwin is not understood by the current mingw64 compilers ###FLAGS=' -mno-cygwin ' # SUF=dll ;; win32-cygwin-version) echo " cygwin-version " WMPI_LIB='' b=$bin FLAGS=' ' LIBS="'$b/libff.dll' $LIBS $DLL" # SUF=dll ;; FreeBSD|NetBSD) SHARED="-shared" FLAGS='-fPIC';; # 64 bit Linux needs -fPIC (ALH) SunOS) SHARED="-shared" FLAGS='-fPIC';; # 64 bit Linux needs -fPIC (ALH) Linux) FLAGS='-fPIC' SHARED="-shared " ;; *) echo "sorry unknown achitecture "`uname` exit 1;; esac #FLAGS="$FLAGS $DEBUG $FFCXXFLAGS" # change F. H Version 3.17 FLAGS="$FLAGS $DEBUG" if [ -n "$ffiles$files$fileso" ] ; then if [ -n "$WIN32" -a ! -f "$bin/libff.dll" ]; then echo " Sorry, no freefem .dll file (libff.dll) in $bin dir " echo " try with -b dir-path where the file libff.dll exist" exit 1; fi if [ "$files" ] ;then echo $CXX -c $FLAGS $CXXFLAGS $FFCXXFLAGS $INC $PIC $files if [ $do = yes ] ; then eval $CXX -c $INC $FLAGS $CXXFLAGS $FFCXXFLAGS $PIC $files ret=$?; if [ $ret -ne 0 ] ; then exit $ret ;fi fi echo fi if [ "$ffiles" ] ;then echo $F77 -c $FLAGS $FFLAGS $FFFFLAGS $INC $PIC $ffiles LIBS="$FFFLIBS $LIBS" if [ $do = yes ] ; then eval $F77 -c $INC $FFLAGS $FLAGS $FFFFLAGS $PIC $ffiles ret=$?; if [ $ret -ne 0 ] ; then exit $ret ;fi fi echo fi if [ "$CONLY" != yes ]; then echo $CXX $SHARED $FLAGS $CXXFLAGS $FFCXXFLAGS $fileso -o $out.$SUF $LIBS $DLL $OTHER $WMPI_LIB if [ $do = yes ] ; then eval $CXX $SHARED $FLAGS $CXXFLAGS $FFCXXFLAGS $fileso -o $out.$SUF $LIBS $DLL $OTHER $WMPI_LIB ret=$?; if [ $ret -ne 0 ] ; then exit $ret ;fi fi echo if [ "$bin" != "." ]; then echo cp $out.$SUF $bin test $do = yes && cp $out.$SUF "$bin" fi if [ -n "$DLL" ] ; then echo cp $DLL $bin test $do = yes && cp $DLL "$bin" fi if [ -n "$OWMPI" ] ; then echo $CXX $SHARED $FLAGS $CXXFLAGS $FFCXXFLAGS $fileso -o $OWMPI $LIBS $DLL $OTHER $MPI_LIB if [ $do = yes ] ; then eval $CXX $SHARED $FLAGS $CXXFLAGS $FFCXXFLAGS $fileso -o $OWMPI $LIBS $DLL $OTHER $MPI_LIB ret=$?; if [ $ret -ne 0 ] ; then exit $ret ;fi fi echo fi fi fi freefem++-3.38-1/examples++-load/Makefile.am000644 000767 000024 00000031635 12544244534 020540 0ustar00hechtstaff000000 000000 all-local: @LOAD_COMPILE@ TESTS=APk-AdaptEpsDeltaPk.edp APk-ExplicitPkTest.edp APk-FreeFemQA.edp APk-MetricPk.edp IPOTest.edp IpOptMinSurf.edp IpoptLap.edp IpoptMinSurfVol.edp IpoptVI.edp IpoptVI2.edp LapDG3.edp LapDG4.edp LapLNewSolver.edp LapMUMPS_seq.edp LapNewSolver.edp LapUmfpack64.edp LaplaceP3.edp LaplaceP4.edp LaplaceRT1.edp Leman-mesh.edp MetricKuate.edp NSP2BRP0.edp PARDISO.edp SuperLU.edp VarIneq2.edp bilapMorley.edp bmo.edp buildlayermesh.edp checkglumeshcube.edp cmaes-VarIneq.edp cmaes-oven.edp convect_dervieux.edp convectchacon-3d.edp convectchacon.edp convexehull3d.edp dfft.edp ffnewuoa.edp ffrandom.edp funcTemplate.edp glumesh3D.edp gsl.edp ilut.edp isoline.edp lame-TD-NSS.edp lap-solvers.edp lapack.edp layer.edp load.edp meditddm.edp metis.edp mshmet.edp myType.edp myfunction2.edp pipe.edp plot-fb-P3.edp plot-fb-P3dc.edp plot-fb-P4.edp plot-fb-P4dc.edp plotfb.edp ppm2rnm.edp provadxw.edp ref.edp refinesphere.edp schwarz-nm.edp scotch.edp shell.edp splitedges.edp splitmesh3.edp splitmesh6.edp test-ElementMixte.edp testFE-P3.edp testFE-P3dc.edp testFE-P4.edp testFE-P4dc.edp testFE-PkEdge.edp testFE.edp testFEMorley.edp tetgencube.edp tetgenholeregion_rugby.edp thresholdings.edp ttestio.edp bfstream.edp bilapP3-hct-like.edp ClosePoints.edp # all test can fail must but clean ???? FH... XFAIL_TESTS=$(TESTS) LOG_DRIVER=$(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT=TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw EXTRA_DIST= $(TESTS) all.edp makeref.edp regtests.edp \ ff-get-dep.in ff-get-dep.awk ff-pkg-download.in load.link.in include.tar.gz \ BernadiRaugel.cpp Morley.cpp dfft.cpp \ funcTemplate.cpp mat_dervieux.cpp mat_psi.cpp myfunction.cpp \ mat_dervieux.cpp funcTemplate.cpp \ regtests.m4 addNewType.cpp \ qf11to25.cpp Element_P3.cpp Element_P3.hpp Element_P4.cpp Element_P4.hpp \ Element_P3dc.cpp Element_P3dc.hpp Element_P4dc.cpp Element_P4dc.hpp \ Element_PkEdge.cpp \ SuperLu.cpp \ NewSolver.cpp \ splitmesh3.cpp splitmesh6.cpp \ README_SuperLU \ tetgen.cpp\ msh3.cpp msh3.hpp\ ffrandom.cpp \ medit.cpp \ bmo.cpp lgbmo.cpp bmo.hpp \ fflapack.cpp lapack.cpp clapack.h \ fig.pgm lg.pgm ppm2rnm.cpp ppmimg.h \ DxWriter.cpp metis.cpp pcm.cpp pcm.hpp pcm2rnm.cpp \ UMFPACK64.cpp iovtk.cpp gmsh.cpp MetricKuate.cpp \ ffnewuoa.cpp newuoa.f Element_P1dc1.cpp ilut.cpp \ freeyams.cpp mmg3d-v4.0.cpp mshmet.cpp \ BinaryIO.cpp gsl.cpp gsl.awk ff_gsl_awk.hpp gsl.idp isolineP1.cpp isoline.cpp lg.pgm \ thresholdings.cpp \ VTK_writer_3d.cpp VTK_writer.cpp splitedges.cpp \ Element_Mixte.cpp \ Element_Mixte3d.cpp \ myfunction2.cpp \ cmaes.cpp \ cmaes.h cmaes_interface.h ff-cmaes.cpp \ ff-NLopt.cpp \ MetricPk.cpp GeometryQA.cpp FreeFemQA.cpp BasicMath.h TensorK.hpp Geometry.hpp \ RZ.h SortedList.h ExampleMetrics.h \ cube.msh \ MUMPS_seq.cpp \ MUMPS.cpp \ ff-Ipopt.cpp \ scotch.cpp shell.cpp \ pipe.cpp pstream.h \ symmetrizeCSR.cpp \ dmatrix.hpp PARDISO.cpp \ ch.pts BEC.cpp bfstream.cpp iohdf5.cpp \ iohd5-beam-2d.edp iohd5-beam-3d.edp ff-AiryBiry.cpp \ exactpartition.cpp exactpartition.edp \ ClosePoints.cpp aniso.cpp LIST_COMPILE=myfunction.$(DYLIB_SUFFIX) BernadiRaugel.$(DYLIB_SUFFIX) \ Morley.$(DYLIB_SUFFIX) funcTemplate.$(DYLIB_SUFFIX) addNewType.$(DYLIB_SUFFIX) \ qf11to25.$(DYLIB_SUFFIX) Element_P3.$(DYLIB_SUFFIX) Element_P4.$(DYLIB_SUFFIX) \ Element_P3dc.$(DYLIB_SUFFIX) Element_P4dc.$(DYLIB_SUFFIX) \ Element_PkEdge.$(DYLIB_SUFFIX) msh3.$(DYLIB_SUFFIX) \ splitmesh3.$(DYLIB_SUFFIX) splitmesh6.$(DYLIB_SUFFIX) \ ffrandom.$(DYLIB_SUFFIX) \ medit.$(DYLIB_SUFFIX) \ mat_dervieux.$(DYLIB_SUFFIX) lgbmo.$(DYLIB_SUFFIX) mat_psi.$(DYLIB_SUFFIX)\ ppm2rnm.$(DYLIB_SUFFIX) DxWriter.$(DYLIB_SUFFIX) \ pcm2rnm.$(DYLIB_SUFFIX) $(DYLIB_OTHER_COMPILE) \ iovtk.$(DYLIB_SUFFIX) gmsh.$(DYLIB_SUFFIX) MetricKuate.$(DYLIB_SUFFIX) \ Element_P1dc1.$(DYLIB_SUFFIX) BinaryIO.$(DYLIB_SUFFIX) \ isolineP1.$(DYLIB_SUFFIX) isoline.$(DYLIB_SUFFIX) thresholdings.$(DYLIB_SUFFIX) \ VTK_writer_3d.$(DYLIB_SUFFIX) VTK_writer.$(DYLIB_SUFFIX) \ splitedges.$(DYLIB_SUFFIX) Element_Mixte.$(DYLIB_SUFFIX) Element_Mixte3d.$(DYLIB_SUFFIX) \ myfunction2.$(DYLIB_SUFFIX) \ MetricPk.$(DYLIB_SUFFIX) FreeFemQA.$(DYLIB_SUFFIX) shell.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_pipe@ symmetrizeCSR.$(DYLIB_SUFFIX) BEC.$(DYLIB_SUFFIX) \ bfstream.$(DYLIB_SUFFIX) @TOOL_DYLIB_iohdf5@ ff-AiryBiry.$(DYLIB_SUFFIX) \ exactpartition.$(DYLIB_SUFFIX) ClosePoints.$(DYLIB_SUFFIX) aniso.$(DYLIB_SUFFIX) # FFCS - some libraries are skipped because the corresponding tool is deactivated. LIST_COMPILE_PKG=tetgen.$(DYLIB_SUFFIX) @TOOL_DYLIB_superlu@ dfft.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_umfpack@ NewSolver.$(DYLIB_SUFFIX) @TOOL_DYLIB_lapack@ @TOOL_DYLIB_fflapack@ \ ffnewuoa.$(DYLIB_SUFFIX) @TOOL_DYLIB_gmm@ @TOOL_DYLIB_yams@ @TOOL_DYLIB_mmg3d@ @TOOL_DYLIB_mshmet@ \ @TOOL_DYLIB_gsl@ @TOOL_DYLIB_mumps_seq@ @TOOL_DYLIB_ipopt@ @TOOL_DYLIB_nlopt@ ff-cmaes.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_scotch@ @TOOL_DYLIB_parmetis@ @TOOL_DYLIB_pardiso@ bin_PROGRAMS= # FFCS parallel make: some targets need to be built first, sequentially load_compile: ff-c++ WHERE_LIBRARY-download include.done freefem++.pref # # max_load -@rm "Missing-plugins-$(DYLIB_SUFFIX).log" 2>/dev/null || true $(MAKE) $(AM_MAKEFLAGS) $(LIST_COMPILE) $(LIST_COMPILE_PKG) @if test -f Missing-plugins-$(DYLIB_SUFFIX).log ; then cat Missing-plugins-$(DYLIB_SUFFIX).log; fi; exit 0 @echo Warning missing plugin: `for i in $(LIST_COMPILE) $(LIST_COMPILE_PKG); do if test ! -s $i ; then j=1; echo "$i," ;fi; done` echo " finish build list $(DYLIB_SUFFIX)" .cpp.$(DYLIB_SUFFIX): ff-c++ ./ff-c++ -auto $< # FFCS - 26/10/11 - Unpacking include.tar.gz is very often buggy under Cygwin (softlinks are randomly replaced with # empty files without any access right). So just replace the whole thing with a plain copy. allheaders=../src/fflib/AddNewFE.h ../src/fflib/AFunction_ext.hpp ../src/fflib/AFunction.hpp ../src/fflib/AnyType.hpp \ ../src/fflib/array_init.hpp ../src/fflib/array_resize.hpp ../src/fflib/array_tlp.hpp \ ../src/femlib/assertion.hpp ../src/femlib/BamgFreeFem.hpp ../src/Algo/BFGS.hpp ../src/Algo/BrentLS.hpp \ ../src/Algo/CG.hpp ../src/femlib/CGNL.hpp ../src/fflib/CodeAlloc.hpp ../config.h ../config-wrapper.h \ ../src/Algo/CubicLS.hpp ../src/Algo/defs.hpp ../src/femlib/DOperator.hpp ../src/libMesh/eigenv.h \ ../src/fflib/endian.hpp ../src/fflib/environment.hpp ../src/fflib/error.hpp ../src/femlib/fem3.hpp \ ../src/femlib/fem.hpp ../src/femlib/FESpace.hpp ../src/femlib/FESpacen.hpp ../src/fflib/ff++.hpp \ ../src/fflib/ffstack.hpp ../src/femlib/FQuadTree.hpp ../src/femlib/GenericMesh.hpp \ ../src/Graphics/getprog-unix.hpp ../src/Graphics/glrgraph.hpp ../src/femlib/gmres.hpp \ ../src/femlib/GQuadTree.hpp ../src/femlib/HashTable.hpp ../src/femlib/HeapSort.hpp ../src/fflib/InitFunct.hpp \ ../src/fflib/ffapi.hpp ../src/femlib/Label.hpp ../src/fflib/lex.hpp ../src/fflib/lgfem.hpp \ ../src/fflib/lgmesh3.hpp ../src/fflib/lgsolver.hpp ../src/lglib/lg.tab.hpp ../src/femlib/libmesh5.h \ ../src/Algo/LineSearch.hpp ../src/femlib/MatriceCreuse.hpp ../src/femlib/MatriceCreuse_tpl.hpp \ ../src/femlib/Mesh1dn.hpp ../src/femlib/Mesh2dn.hpp ../src/bamglib/Mesh2.h ../src/femlib/Mesh3dn.hpp \ ../src/bamglib/Meshio.h ../src/femlib/MeshPoint.hpp ../src/bamglib/meshtype.h ../src/bamglib/Metric.h \ ../src/Graphics/mode_open.hpp ../src/Algo/NewtonRaphson.hpp ../src/Algo/NRJ.hpp ../src/fflib/Operator.hpp \ ../src/Algo/Optima.hpp ../src/Algo/Param.hpp ../src/femlib/PkLagrange.hpp ../src/fflib/PlotStream.hpp \ ../src/fflib/problem.hpp ../src/femlib/QuadratureFormular.hpp ../src/bamglib/QuadTree.h ../src/femlib/R1.hpp \ ../src/bamglib/R2.h ../src/femlib/R2.hpp ../src/femlib/R3.hpp ../src/femlib/RefCounter.hpp \ ../src/Graphics/rgraph.hpp ../src/femlib/RNM.hpp ../src/femlib/RNM_opc.hpp ../src/femlib/RNM_op.hpp \ ../src/femlib/RNM_tpl.hpp ../src/Algo/RosenBrock.hpp ../src/fflib/Serialize.hpp ../src/bamglib/SetOfE4.h \ ../src/fflib/showverb.hpp ../src/femlib/splitsimplex.hpp ../src/fflib/String.hpp \ ../src/fflib/strversionnumber.hpp ../src/fflib/throwassert.hpp ../src/femlib/ufunction.hpp \ ../src/fflib/versionnumber.hpp ../src/bamglib/write_hdf5.hpp ../src/bamglib/write_xdmf.hpp \ ../src/fflib/P1IsoValue.hpp if ENABLE_FFCS include.done: $(allheaders) -rm -rf include mkdir -p include cp $^ include touch $@ else include.done: $(allheaders) -rm -rf include mkdir -p include for i in $(allheaders); do ln -s ../$$i include/. ; done touch $@ endif clean-local:: -rm -r include -rm include.done Ref: makeref.edp ../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp all-local: all.edp regtests.edp load_compile # FFCS - 27/2/13 - remove dependency on Makefile to avoid recompiling everything everytime something is changed in the # configuration step all.edp: @(echo "NoGraphicWindow=true;NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp # FFCS - 27/2/13 - remove dependency on Makefile to avoid recompiling everything everytime something is changed in the # configuration step $(LIST_COMPILE):ff-c++ include.done clean-local:: -rm *.o *.$(DYLIB_SUFFIX) load.link WHERE_LIBRARY-download ff-get-dep ff-c++ ff-pkg-download \ $(LIST_COMPILE) $(LIST_COMPILE_PKG) regtests.edp makeref.edp -rm -rf include include.done ff-c++:load.link.in load.link WHERE_LIBRARY-download ff-get-dep ../config.status ../config.status --file=ff-c++:load.link.in chmod a+x ff-c++ load.link:load.link.in ../config.status ../config.status --file=load.link:load.link.in chmod a+x load.link ff-pkg-download:ff-pkg-download.in ../config.status ../config.status --file=$@:$@.in chmod a+x $@ cp $@ ../download/bin ff-get-dep:ff-get-dep.in ../config.status ../config.status --file=$@:$@.in chmod a+x $@ -if [ -d ../download/bin ] ;then cp $@ ../download/bin; fi WHERE_LIBRARY-download:ff-pkg-download FORCE WHERE_LIBRARY-config WHERE_LIBRARY @./ff-pkg-download >$@-new @diff $@-new $@ || (cp $@-new $@ ;touch WHERE_LIBRARY) WHERE_LIBRARY: touch $@ FORCE: ; freefem++.pref: echo loadpath = \"./\" >freefem++.pref install-exec-local:: load_compile WHERE_LIBRARY $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib test -n "$(MPIPROG)" && $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib/mpi || true $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/include $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/etc $(INSTALL_DATA) clapack.h ppmimg.h bmo.hpp msh3.hpp pcm.hpp include/* $(DESTDIR)$(ff_prefix_dir)/include $(INSTALL) -m 555 $(LIST_COMPILE) $(DESTDIR)$(ff_prefix_dir)/lib $(INSTALL) -m 555 ff-get-dep.awk WHERE_LIBRARY-config WHERE_LIBRARY $(DESTDIR)$(ff_prefix_dir)/lib for i in WHERE_LIBRARY-config WHERE_LIBRARY WHERE_LIBRARY-download; do \ sed <$$i >$(DESTDIR)$(ff_prefix_dir)/lib/$$i 's#$(abs_top_builddir)/download#$(ff_prefix_dir)#' ;\ done echo loadpath += \"./\" >$(DESTDIR)$(ff_prefix_dir)/etc/freefem++.pref echo loadpath += \"$(ff_prefix_dir)/lib\" >>$(DESTDIR)$(ff_prefix_dir)/etc/freefem++.pref echo includepath += \"$(ff_prefix_dir)/idp\" >>$(DESTDIR)$(ff_prefix_dir)/etc/freefem++.pref $(INSTALL_SCRIPT) ff-c++ $(DESTDIR)${bindir} $(INSTALL_SCRIPT) ff-pkg-download $(DESTDIR)${bindir} $(INSTALL_SCRIPT) ff-get-dep $(DESTDIR)${bindir} ## $(DESTDIR)${bindir}/ff-pkg-download $(DESTDIR) >$(DESTDIR)$(ff_prefix_dir)/lib/WHERE_LIBRARY-download -for i in $(LIST_COMPILE_PKG); do \ if [ -f $$i ] ; then $(INSTALL) -m 555 $$i $(DESTDIR)$(ff_prefix_dir)/lib; fi; done - if [ -n "$(MPIPROG)" ] ; then \ for i in $(LIST_COMPILE_PKG) $(LIST_COMPILE); do \ if [ -f ../examples++-mpi/$$i ] ; then \ $(INSTALL) -m 555 ../examples++-mpi/$$i $(DESTDIR)$(ff_prefix_dir)/lib/mpi; \ else echo missing install mpi version ??? ../examples++-mpi/$$i ;\ fi; \ done ; \ fi clean-local:: -rm *.fg *.eps *~ *.ps *.mesh *.mesh.gmsh ListOfAllocPtr-8.bin ffglut*.ppm Th.o.meshb Th3.d.meshb dep.sol.meshbgh \ ipopt.out mmg.out xxxx ThFF.txt TriQA.txt cavidadTT.txt mass.txt xy.txt \ ThFF_Metric.txt TriQA_Metric.txt datanc.txt u100m8.txt \ TTh.sol Th.o.sol Th3.sol dep.o.sol dep.sol gradient.sol hessien.sol pippo.data pippo.dx testsavemedit.solb med.gp bidule.vtk disque.vtk g-iso # FFCS: add tags for files that are not specified to automake by a SOURCE directive (this tags file is automatically # taken into account by automake when it sees it). TAGS: etags *.?pp freefem++-3.38-1/examples++-load/Makefile.in000644 000767 000024 00000212015 12544244701 020536 0ustar00hechtstaff000000 000000 # Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = subdir = examples++-load ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/ax_lib_hdf5.m4 \ $(top_srcdir)/ax_lib_gsl.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \ $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_PACKAGE_NAME = @ADD_PACKAGE_NAME@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARFLAGS = @ARFLAGS@ ARPACKLIB = @ARPACKLIB@ ARPACKLIBS = @ARPACKLIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BAMGPROG = @BAMGPROG@ BLASINC = @BLASINC@ BLASLIBS = @BLASLIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGSF77 = @CFLAGSF77@ CNOFLAGS = @CNOFLAGS@ COMPILE_OPENBLAS = @COMPILE_OPENBLAS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXX11FLAGS = @CXX11FLAGS@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DOCPDF = @DOCPDF@ DOCPS = @DOCPS@ DOCPSGZ = @DOCPSGZ@ DOWNLOADCOMPILE = @DOWNLOADCOMPILE@ DOWNLOADED_BLAS = @DOWNLOADED_BLAS@ DOWNLOADED_BLAS_BUILT_SOURCES = @DOWNLOADED_BLAS_BUILT_SOURCES@ DOWNLOAD_ARPACK = @DOWNLOAD_ARPACK@ DOWNLOAD_FFTW = @DOWNLOAD_FFTW@ DOWNLOAD_UMFPACK = @DOWNLOAD_UMFPACK@ DYLIB_SUFFIX = @DYLIB_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EIGENOBJ = @EIGENOBJ@ ENABLE_FFCS = @ENABLE_FFCS@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFGLUTNAME = @FFGLUTNAME@ FFGLUTPROG = @FFGLUTPROG@ FFLAGS = @FFLAGS@ FF_HAVE_REGEX_H = @FF_HAVE_REGEX_H@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ H5CC = @H5CC@ H5FC = @H5FC@ HDF5_CC = @HDF5_CC@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_CPPFLAGS = @HDF5_CPPFLAGS@ HDF5_FC = @HDF5_FC@ HDF5_FFLAGS = @HDF5_FFLAGS@ HDF5_FLIBS = @HDF5_FLIBS@ HDF5_LDFLAGS = @HDF5_LDFLAGS@ HDF5_LIBS = @HDF5_LIBS@ HDF5_VERSION = @HDF5_VERSION@ HISTORY = @HISTORY@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KERNEL_VERSION = @KERNEL_VERSION@ LAPACKLIBS = @LAPACKLIBS@ LAPACK_arpack_LIB = @LAPACK_arpack_LIB@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBC_VERSION = @LIBC_VERSION@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSGLUT = @LIBSGLUT@ LIBSNOCONSOLE = @LIBSNOCONSOLE@ LIBSPTHREAD = @LIBSPTHREAD@ LOAD_COMPILE = @LOAD_COMPILE@ LOAD_TESTS = @LOAD_TESTS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MEDITPROG = @MEDITPROG@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIF77 = @MPIF77@ MPIFC = @MPIFC@ MPIPROG = @MPIPROG@ MPIRUN = @MPIRUN@ MPISCRIPT = @MPISCRIPT@ MPI_INCLUDE = @MPI_INCLUDE@ MPI_INC_DIR = @MPI_INC_DIR@ MPI_LIB = @MPI_LIB@ MPI_LIBC = @MPI_LIBC@ MPI_LIBFC = @MPI_LIBFC@ MPI_LIB_DIRS = @MPI_LIB_DIRS@ NO_RANGE_CHECK = @NO_RANGE_CHECK@ OBJEXT = @OBJEXT@ OPTIM_TYPE = @OPTIM_TYPE@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PASTIX_HOSTARCH = @PASTIX_HOSTARCH@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ RANLIN = @RANLIN@ SCOTCH_INCLUDE = @SCOTCH_INCLUDE@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIZEOF_INT = @SIZEOF_INT@ SIZEOF_LONG = @SIZEOF_LONG@ SIZEOF_PTR = @SIZEOF_PTR@ SIZEOF_PTRINBIT = @SIZEOF_PTRINBIT@ SKIP_TESTS_EIGEN = @SKIP_TESTS_EIGEN@ SKIP_TESTS_MPI = @SKIP_TESTS_MPI@ STATICTOOL = @STATICTOOL@ STDPROG = @STDPROG@ STD_GRAPH_OBJ = @STD_GRAPH_OBJ@ STD_LDFLAGS = @STD_LDFLAGS@ STD_LIBS = @STD_LIBS@ STRIP = @STRIP@ TEST_FFPP = @TEST_FFPP@ TEST_FFPPMPI = @TEST_FFPPMPI@ TEST_FFPP_MPI = @TEST_FFPP_MPI@ TOOL_COMPILE_NewSolver = @TOOL_COMPILE_NewSolver@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gmm = @TOOL_COMPILE_gmm@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_iohdf5 = @TOOL_COMPILE_iohdf5@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_mmg3d = @TOOL_COMPILE_mmg3d@ TOOL_COMPILE_mshmet = @TOOL_COMPILE_mshmet@ TOOL_COMPILE_mumps = @TOOL_COMPILE_mumps@ TOOL_COMPILE_mumps_seq = @TOOL_COMPILE_mumps_seq@ TOOL_COMPILE_nlopt = @TOOL_COMPILE_nlopt@ TOOL_COMPILE_pardiso = @TOOL_COMPILE_pardiso@ TOOL_COMPILE_parmetis = @TOOL_COMPILE_parmetis@ TOOL_COMPILE_parms = @TOOL_COMPILE_parms@ TOOL_COMPILE_pastix = @TOOL_COMPILE_pastix@ TOOL_COMPILE_pipe = @TOOL_COMPILE_pipe@ TOOL_COMPILE_schwarz = @TOOL_COMPILE_schwarz@ TOOL_COMPILE_scotch = @TOOL_COMPILE_scotch@ TOOL_COMPILE_superlu = @TOOL_COMPILE_superlu@ TOOL_COMPILE_superludist = @TOOL_COMPILE_superludist@ TOOL_COMPILE_umfpack = @TOOL_COMPILE_umfpack@ TOOL_COMPILE_yams = @TOOL_COMPILE_yams@ TOOL_DYLIB_NewSolver = @TOOL_DYLIB_NewSolver@ TOOL_DYLIB_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gmm = @TOOL_DYLIB_gmm@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_iohdf5 = @TOOL_DYLIB_iohdf5@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_mmg3d = @TOOL_DYLIB_mmg3d@ TOOL_DYLIB_mshmet = @TOOL_DYLIB_mshmet@ TOOL_DYLIB_mumps = @TOOL_DYLIB_mumps@ TOOL_DYLIB_mumps_seq = @TOOL_DYLIB_mumps_seq@ TOOL_DYLIB_nlopt = @TOOL_DYLIB_nlopt@ TOOL_DYLIB_pardiso = @TOOL_DYLIB_pardiso@ TOOL_DYLIB_parmetis = @TOOL_DYLIB_parmetis@ TOOL_DYLIB_parms = @TOOL_DYLIB_parms@ TOOL_DYLIB_pastix = @TOOL_DYLIB_pastix@ TOOL_DYLIB_pipe = @TOOL_DYLIB_pipe@ TOOL_DYLIB_schwarz = @TOOL_DYLIB_schwarz@ TOOL_DYLIB_scotch = @TOOL_DYLIB_scotch@ TOOL_DYLIB_superlu = @TOOL_DYLIB_superlu@ TOOL_DYLIB_superludist = @TOOL_DYLIB_superludist@ TOOL_DYLIB_umfpack = @TOOL_DYLIB_umfpack@ TOOL_DYLIB_yams = @TOOL_DYLIB_yams@ UMFPACKLIBS = @UMFPACKLIBS@ VERSION = @VERSION@ WGET = @WGET@ WIN32DLLTARGET = @WIN32DLLTARGET@ WINDRESOBJ = @WINDRESOBJ@ WITH_CXX11 = @WITH_CXX11@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ff_bison = @ff_bison@ ff_convert = @ff_convert@ ff_curl = @ff_curl@ ff_dvips = @ff_dvips@ ff_flex = @ff_flex@ ff_git = @ff_git@ ff_gzip = @ff_gzip@ ff_history = @ff_history@ ff_latex = @ff_latex@ ff_libtool = @ff_libtool@ ff_m4 = @ff_m4@ ff_makeindex = @ff_makeindex@ ff_patch = @ff_patch@ ff_pdf2ps = @ff_pdf2ps@ ff_pdflatex = @ff_pdflatex@ ff_prefix_dir = @ff_prefix_dir@ ff_unzip = @ff_unzip@ ff_wget = @ff_wget@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = APk-AdaptEpsDeltaPk.edp APk-ExplicitPkTest.edp \ APk-FreeFemQA.edp APk-MetricPk.edp IPOTest.edp \ IpOptMinSurf.edp IpoptLap.edp IpoptMinSurfVol.edp IpoptVI.edp \ IpoptVI2.edp LapDG3.edp LapDG4.edp LapLNewSolver.edp \ LapMUMPS_seq.edp LapNewSolver.edp LapUmfpack64.edp \ LaplaceP3.edp LaplaceP4.edp LaplaceRT1.edp Leman-mesh.edp \ MetricKuate.edp NSP2BRP0.edp PARDISO.edp SuperLU.edp \ VarIneq2.edp bilapMorley.edp bmo.edp buildlayermesh.edp \ checkglumeshcube.edp cmaes-VarIneq.edp cmaes-oven.edp \ convect_dervieux.edp convectchacon-3d.edp convectchacon.edp \ convexehull3d.edp dfft.edp ffnewuoa.edp ffrandom.edp \ funcTemplate.edp glumesh3D.edp gsl.edp ilut.edp isoline.edp \ lame-TD-NSS.edp lap-solvers.edp lapack.edp layer.edp load.edp \ meditddm.edp metis.edp mshmet.edp myType.edp myfunction2.edp \ pipe.edp plot-fb-P3.edp plot-fb-P3dc.edp plot-fb-P4.edp \ plot-fb-P4dc.edp plotfb.edp ppm2rnm.edp provadxw.edp ref.edp \ refinesphere.edp schwarz-nm.edp scotch.edp shell.edp \ splitedges.edp splitmesh3.edp splitmesh6.edp \ test-ElementMixte.edp testFE-P3.edp testFE-P3dc.edp \ testFE-P4.edp testFE-P4dc.edp testFE-PkEdge.edp testFE.edp \ testFEMorley.edp tetgencube.edp tetgenholeregion_rugby.edp \ thresholdings.edp ttestio.edp bfstream.edp \ bilapP3-hct-like.edp ClosePoints.edp # all test can fail must but clean ???? FH... XFAIL_TESTS = $(TESTS) LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver-ff TESTS_ENVIRONMENT = TEST_FFPP=$(TEST_FFPP) FLAGS_FFPP=-nw EXTRA_DIST = $(TESTS) all.edp makeref.edp regtests.edp \ ff-get-dep.in ff-get-dep.awk ff-pkg-download.in load.link.in include.tar.gz \ BernadiRaugel.cpp Morley.cpp dfft.cpp \ funcTemplate.cpp mat_dervieux.cpp mat_psi.cpp myfunction.cpp \ mat_dervieux.cpp funcTemplate.cpp \ regtests.m4 addNewType.cpp \ qf11to25.cpp Element_P3.cpp Element_P3.hpp Element_P4.cpp Element_P4.hpp \ Element_P3dc.cpp Element_P3dc.hpp Element_P4dc.cpp Element_P4dc.hpp \ Element_PkEdge.cpp \ SuperLu.cpp \ NewSolver.cpp \ splitmesh3.cpp splitmesh6.cpp \ README_SuperLU \ tetgen.cpp\ msh3.cpp msh3.hpp\ ffrandom.cpp \ medit.cpp \ bmo.cpp lgbmo.cpp bmo.hpp \ fflapack.cpp lapack.cpp clapack.h \ fig.pgm lg.pgm ppm2rnm.cpp ppmimg.h \ DxWriter.cpp metis.cpp pcm.cpp pcm.hpp pcm2rnm.cpp \ UMFPACK64.cpp iovtk.cpp gmsh.cpp MetricKuate.cpp \ ffnewuoa.cpp newuoa.f Element_P1dc1.cpp ilut.cpp \ freeyams.cpp mmg3d-v4.0.cpp mshmet.cpp \ BinaryIO.cpp gsl.cpp gsl.awk ff_gsl_awk.hpp gsl.idp isolineP1.cpp isoline.cpp lg.pgm \ thresholdings.cpp \ VTK_writer_3d.cpp VTK_writer.cpp splitedges.cpp \ Element_Mixte.cpp \ Element_Mixte3d.cpp \ myfunction2.cpp \ cmaes.cpp \ cmaes.h cmaes_interface.h ff-cmaes.cpp \ ff-NLopt.cpp \ MetricPk.cpp GeometryQA.cpp FreeFemQA.cpp BasicMath.h TensorK.hpp Geometry.hpp \ RZ.h SortedList.h ExampleMetrics.h \ cube.msh \ MUMPS_seq.cpp \ MUMPS.cpp \ ff-Ipopt.cpp \ scotch.cpp shell.cpp \ pipe.cpp pstream.h \ symmetrizeCSR.cpp \ dmatrix.hpp PARDISO.cpp \ ch.pts BEC.cpp bfstream.cpp iohdf5.cpp \ iohd5-beam-2d.edp iohd5-beam-3d.edp ff-AiryBiry.cpp \ exactpartition.cpp exactpartition.edp \ ClosePoints.cpp aniso.cpp LIST_COMPILE = myfunction.$(DYLIB_SUFFIX) BernadiRaugel.$(DYLIB_SUFFIX) \ Morley.$(DYLIB_SUFFIX) funcTemplate.$(DYLIB_SUFFIX) addNewType.$(DYLIB_SUFFIX) \ qf11to25.$(DYLIB_SUFFIX) Element_P3.$(DYLIB_SUFFIX) Element_P4.$(DYLIB_SUFFIX) \ Element_P3dc.$(DYLIB_SUFFIX) Element_P4dc.$(DYLIB_SUFFIX) \ Element_PkEdge.$(DYLIB_SUFFIX) msh3.$(DYLIB_SUFFIX) \ splitmesh3.$(DYLIB_SUFFIX) splitmesh6.$(DYLIB_SUFFIX) \ ffrandom.$(DYLIB_SUFFIX) \ medit.$(DYLIB_SUFFIX) \ mat_dervieux.$(DYLIB_SUFFIX) lgbmo.$(DYLIB_SUFFIX) mat_psi.$(DYLIB_SUFFIX)\ ppm2rnm.$(DYLIB_SUFFIX) DxWriter.$(DYLIB_SUFFIX) \ pcm2rnm.$(DYLIB_SUFFIX) $(DYLIB_OTHER_COMPILE) \ iovtk.$(DYLIB_SUFFIX) gmsh.$(DYLIB_SUFFIX) MetricKuate.$(DYLIB_SUFFIX) \ Element_P1dc1.$(DYLIB_SUFFIX) BinaryIO.$(DYLIB_SUFFIX) \ isolineP1.$(DYLIB_SUFFIX) isoline.$(DYLIB_SUFFIX) thresholdings.$(DYLIB_SUFFIX) \ VTK_writer_3d.$(DYLIB_SUFFIX) VTK_writer.$(DYLIB_SUFFIX) \ splitedges.$(DYLIB_SUFFIX) Element_Mixte.$(DYLIB_SUFFIX) Element_Mixte3d.$(DYLIB_SUFFIX) \ myfunction2.$(DYLIB_SUFFIX) \ MetricPk.$(DYLIB_SUFFIX) FreeFemQA.$(DYLIB_SUFFIX) shell.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_pipe@ symmetrizeCSR.$(DYLIB_SUFFIX) BEC.$(DYLIB_SUFFIX) \ bfstream.$(DYLIB_SUFFIX) @TOOL_DYLIB_iohdf5@ ff-AiryBiry.$(DYLIB_SUFFIX) \ exactpartition.$(DYLIB_SUFFIX) ClosePoints.$(DYLIB_SUFFIX) aniso.$(DYLIB_SUFFIX) # FFCS - some libraries are skipped because the corresponding tool is deactivated. LIST_COMPILE_PKG = tetgen.$(DYLIB_SUFFIX) @TOOL_DYLIB_superlu@ dfft.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_umfpack@ NewSolver.$(DYLIB_SUFFIX) @TOOL_DYLIB_lapack@ @TOOL_DYLIB_fflapack@ \ ffnewuoa.$(DYLIB_SUFFIX) @TOOL_DYLIB_gmm@ @TOOL_DYLIB_yams@ @TOOL_DYLIB_mmg3d@ @TOOL_DYLIB_mshmet@ \ @TOOL_DYLIB_gsl@ @TOOL_DYLIB_mumps_seq@ @TOOL_DYLIB_ipopt@ @TOOL_DYLIB_nlopt@ ff-cmaes.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_scotch@ @TOOL_DYLIB_parmetis@ @TOOL_DYLIB_pardiso@ # FFCS - 26/10/11 - Unpacking include.tar.gz is very often buggy under Cygwin (softlinks are randomly replaced with # empty files without any access right). So just replace the whole thing with a plain copy. allheaders = ../src/fflib/AddNewFE.h ../src/fflib/AFunction_ext.hpp ../src/fflib/AFunction.hpp ../src/fflib/AnyType.hpp \ ../src/fflib/array_init.hpp ../src/fflib/array_resize.hpp ../src/fflib/array_tlp.hpp \ ../src/femlib/assertion.hpp ../src/femlib/BamgFreeFem.hpp ../src/Algo/BFGS.hpp ../src/Algo/BrentLS.hpp \ ../src/Algo/CG.hpp ../src/femlib/CGNL.hpp ../src/fflib/CodeAlloc.hpp ../config.h ../config-wrapper.h \ ../src/Algo/CubicLS.hpp ../src/Algo/defs.hpp ../src/femlib/DOperator.hpp ../src/libMesh/eigenv.h \ ../src/fflib/endian.hpp ../src/fflib/environment.hpp ../src/fflib/error.hpp ../src/femlib/fem3.hpp \ ../src/femlib/fem.hpp ../src/femlib/FESpace.hpp ../src/femlib/FESpacen.hpp ../src/fflib/ff++.hpp \ ../src/fflib/ffstack.hpp ../src/femlib/FQuadTree.hpp ../src/femlib/GenericMesh.hpp \ ../src/Graphics/getprog-unix.hpp ../src/Graphics/glrgraph.hpp ../src/femlib/gmres.hpp \ ../src/femlib/GQuadTree.hpp ../src/femlib/HashTable.hpp ../src/femlib/HeapSort.hpp ../src/fflib/InitFunct.hpp \ ../src/fflib/ffapi.hpp ../src/femlib/Label.hpp ../src/fflib/lex.hpp ../src/fflib/lgfem.hpp \ ../src/fflib/lgmesh3.hpp ../src/fflib/lgsolver.hpp ../src/lglib/lg.tab.hpp ../src/femlib/libmesh5.h \ ../src/Algo/LineSearch.hpp ../src/femlib/MatriceCreuse.hpp ../src/femlib/MatriceCreuse_tpl.hpp \ ../src/femlib/Mesh1dn.hpp ../src/femlib/Mesh2dn.hpp ../src/bamglib/Mesh2.h ../src/femlib/Mesh3dn.hpp \ ../src/bamglib/Meshio.h ../src/femlib/MeshPoint.hpp ../src/bamglib/meshtype.h ../src/bamglib/Metric.h \ ../src/Graphics/mode_open.hpp ../src/Algo/NewtonRaphson.hpp ../src/Algo/NRJ.hpp ../src/fflib/Operator.hpp \ ../src/Algo/Optima.hpp ../src/Algo/Param.hpp ../src/femlib/PkLagrange.hpp ../src/fflib/PlotStream.hpp \ ../src/fflib/problem.hpp ../src/femlib/QuadratureFormular.hpp ../src/bamglib/QuadTree.h ../src/femlib/R1.hpp \ ../src/bamglib/R2.h ../src/femlib/R2.hpp ../src/femlib/R3.hpp ../src/femlib/RefCounter.hpp \ ../src/Graphics/rgraph.hpp ../src/femlib/RNM.hpp ../src/femlib/RNM_opc.hpp ../src/femlib/RNM_op.hpp \ ../src/femlib/RNM_tpl.hpp ../src/Algo/RosenBrock.hpp ../src/fflib/Serialize.hpp ../src/bamglib/SetOfE4.h \ ../src/fflib/showverb.hpp ../src/femlib/splitsimplex.hpp ../src/fflib/String.hpp \ ../src/fflib/strversionnumber.hpp ../src/fflib/throwassert.hpp ../src/femlib/ufunction.hpp \ ../src/fflib/versionnumber.hpp ../src/bamglib/write_hdf5.hpp ../src/bamglib/write_xdmf.hpp \ ../src/fflib/P1IsoValue.hpp all: all-am .SUFFIXES: .SUFFIXES: .$(DYLIB_SUFFIX) .cpp .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples++-load/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples++-load/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? APk-AdaptEpsDeltaPk.edp.log: APk-AdaptEpsDeltaPk.edp @p='APk-AdaptEpsDeltaPk.edp'; \ b='APk-AdaptEpsDeltaPk.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) APk-ExplicitPkTest.edp.log: APk-ExplicitPkTest.edp @p='APk-ExplicitPkTest.edp'; \ b='APk-ExplicitPkTest.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) APk-FreeFemQA.edp.log: APk-FreeFemQA.edp @p='APk-FreeFemQA.edp'; \ b='APk-FreeFemQA.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) APk-MetricPk.edp.log: APk-MetricPk.edp @p='APk-MetricPk.edp'; \ b='APk-MetricPk.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) IPOTest.edp.log: IPOTest.edp @p='IPOTest.edp'; \ b='IPOTest.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) IpOptMinSurf.edp.log: IpOptMinSurf.edp @p='IpOptMinSurf.edp'; \ b='IpOptMinSurf.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) IpoptLap.edp.log: IpoptLap.edp @p='IpoptLap.edp'; \ b='IpoptLap.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) IpoptMinSurfVol.edp.log: IpoptMinSurfVol.edp @p='IpoptMinSurfVol.edp'; \ b='IpoptMinSurfVol.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) IpoptVI.edp.log: IpoptVI.edp @p='IpoptVI.edp'; \ b='IpoptVI.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) IpoptVI2.edp.log: IpoptVI2.edp @p='IpoptVI2.edp'; \ b='IpoptVI2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapDG3.edp.log: LapDG3.edp @p='LapDG3.edp'; \ b='LapDG3.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapDG4.edp.log: LapDG4.edp @p='LapDG4.edp'; \ b='LapDG4.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapLNewSolver.edp.log: LapLNewSolver.edp @p='LapLNewSolver.edp'; \ b='LapLNewSolver.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapMUMPS_seq.edp.log: LapMUMPS_seq.edp @p='LapMUMPS_seq.edp'; \ b='LapMUMPS_seq.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapNewSolver.edp.log: LapNewSolver.edp @p='LapNewSolver.edp'; \ b='LapNewSolver.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LapUmfpack64.edp.log: LapUmfpack64.edp @p='LapUmfpack64.edp'; \ b='LapUmfpack64.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceP3.edp.log: LaplaceP3.edp @p='LaplaceP3.edp'; \ b='LaplaceP3.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceP4.edp.log: LaplaceP4.edp @p='LaplaceP4.edp'; \ b='LaplaceP4.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LaplaceRT1.edp.log: LaplaceRT1.edp @p='LaplaceRT1.edp'; \ b='LaplaceRT1.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) Leman-mesh.edp.log: Leman-mesh.edp @p='Leman-mesh.edp'; \ b='Leman-mesh.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MetricKuate.edp.log: MetricKuate.edp @p='MetricKuate.edp'; \ b='MetricKuate.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) NSP2BRP0.edp.log: NSP2BRP0.edp @p='NSP2BRP0.edp'; \ b='NSP2BRP0.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PARDISO.edp.log: PARDISO.edp @p='PARDISO.edp'; \ b='PARDISO.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) SuperLU.edp.log: SuperLU.edp @p='SuperLU.edp'; \ b='SuperLU.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) VarIneq2.edp.log: VarIneq2.edp @p='VarIneq2.edp'; \ b='VarIneq2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bilapMorley.edp.log: bilapMorley.edp @p='bilapMorley.edp'; \ b='bilapMorley.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bmo.edp.log: bmo.edp @p='bmo.edp'; \ b='bmo.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) buildlayermesh.edp.log: buildlayermesh.edp @p='buildlayermesh.edp'; \ b='buildlayermesh.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) checkglumeshcube.edp.log: checkglumeshcube.edp @p='checkglumeshcube.edp'; \ b='checkglumeshcube.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cmaes-VarIneq.edp.log: cmaes-VarIneq.edp @p='cmaes-VarIneq.edp'; \ b='cmaes-VarIneq.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cmaes-oven.edp.log: cmaes-oven.edp @p='cmaes-oven.edp'; \ b='cmaes-oven.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convect_dervieux.edp.log: convect_dervieux.edp @p='convect_dervieux.edp'; \ b='convect_dervieux.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convectchacon-3d.edp.log: convectchacon-3d.edp @p='convectchacon-3d.edp'; \ b='convectchacon-3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convectchacon.edp.log: convectchacon.edp @p='convectchacon.edp'; \ b='convectchacon.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) convexehull3d.edp.log: convexehull3d.edp @p='convexehull3d.edp'; \ b='convexehull3d.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) dfft.edp.log: dfft.edp @p='dfft.edp'; \ b='dfft.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ffnewuoa.edp.log: ffnewuoa.edp @p='ffnewuoa.edp'; \ b='ffnewuoa.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ffrandom.edp.log: ffrandom.edp @p='ffrandom.edp'; \ b='ffrandom.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) funcTemplate.edp.log: funcTemplate.edp @p='funcTemplate.edp'; \ b='funcTemplate.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) glumesh3D.edp.log: glumesh3D.edp @p='glumesh3D.edp'; \ b='glumesh3D.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) gsl.edp.log: gsl.edp @p='gsl.edp'; \ b='gsl.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ilut.edp.log: ilut.edp @p='ilut.edp'; \ b='ilut.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) isoline.edp.log: isoline.edp @p='isoline.edp'; \ b='isoline.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lame-TD-NSS.edp.log: lame-TD-NSS.edp @p='lame-TD-NSS.edp'; \ b='lame-TD-NSS.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lap-solvers.edp.log: lap-solvers.edp @p='lap-solvers.edp'; \ b='lap-solvers.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lapack.edp.log: lapack.edp @p='lapack.edp'; \ b='lapack.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) layer.edp.log: layer.edp @p='layer.edp'; \ b='layer.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) load.edp.log: load.edp @p='load.edp'; \ b='load.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) meditddm.edp.log: meditddm.edp @p='meditddm.edp'; \ b='meditddm.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) metis.edp.log: metis.edp @p='metis.edp'; \ b='metis.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mshmet.edp.log: mshmet.edp @p='mshmet.edp'; \ b='mshmet.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) myType.edp.log: myType.edp @p='myType.edp'; \ b='myType.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) myfunction2.edp.log: myfunction2.edp @p='myfunction2.edp'; \ b='myfunction2.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pipe.edp.log: pipe.edp @p='pipe.edp'; \ b='pipe.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) plot-fb-P3.edp.log: plot-fb-P3.edp @p='plot-fb-P3.edp'; \ b='plot-fb-P3.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) plot-fb-P3dc.edp.log: plot-fb-P3dc.edp @p='plot-fb-P3dc.edp'; \ b='plot-fb-P3dc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) plot-fb-P4.edp.log: plot-fb-P4.edp @p='plot-fb-P4.edp'; \ b='plot-fb-P4.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) plot-fb-P4dc.edp.log: plot-fb-P4dc.edp @p='plot-fb-P4dc.edp'; \ b='plot-fb-P4dc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) plotfb.edp.log: plotfb.edp @p='plotfb.edp'; \ b='plotfb.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ppm2rnm.edp.log: ppm2rnm.edp @p='ppm2rnm.edp'; \ b='ppm2rnm.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) provadxw.edp.log: provadxw.edp @p='provadxw.edp'; \ b='provadxw.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ref.edp.log: ref.edp @p='ref.edp'; \ b='ref.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) refinesphere.edp.log: refinesphere.edp @p='refinesphere.edp'; \ b='refinesphere.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) schwarz-nm.edp.log: schwarz-nm.edp @p='schwarz-nm.edp'; \ b='schwarz-nm.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) scotch.edp.log: scotch.edp @p='scotch.edp'; \ b='scotch.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) shell.edp.log: shell.edp @p='shell.edp'; \ b='shell.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) splitedges.edp.log: splitedges.edp @p='splitedges.edp'; \ b='splitedges.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) splitmesh3.edp.log: splitmesh3.edp @p='splitmesh3.edp'; \ b='splitmesh3.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) splitmesh6.edp.log: splitmesh6.edp @p='splitmesh6.edp'; \ b='splitmesh6.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test-ElementMixte.edp.log: test-ElementMixte.edp @p='test-ElementMixte.edp'; \ b='test-ElementMixte.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE-P3.edp.log: testFE-P3.edp @p='testFE-P3.edp'; \ b='testFE-P3.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE-P3dc.edp.log: testFE-P3dc.edp @p='testFE-P3dc.edp'; \ b='testFE-P3dc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE-P4.edp.log: testFE-P4.edp @p='testFE-P4.edp'; \ b='testFE-P4.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE-P4dc.edp.log: testFE-P4dc.edp @p='testFE-P4dc.edp'; \ b='testFE-P4dc.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE-PkEdge.edp.log: testFE-PkEdge.edp @p='testFE-PkEdge.edp'; \ b='testFE-PkEdge.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFE.edp.log: testFE.edp @p='testFE.edp'; \ b='testFE.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) testFEMorley.edp.log: testFEMorley.edp @p='testFEMorley.edp'; \ b='testFEMorley.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tetgencube.edp.log: tetgencube.edp @p='tetgencube.edp'; \ b='tetgencube.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tetgenholeregion_rugby.edp.log: tetgenholeregion_rugby.edp @p='tetgenholeregion_rugby.edp'; \ b='tetgenholeregion_rugby.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) thresholdings.edp.log: thresholdings.edp @p='thresholdings.edp'; \ b='thresholdings.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ttestio.edp.log: ttestio.edp @p='ttestio.edp'; \ b='ttestio.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bfstream.edp.log: bfstream.edp @p='bfstream.edp'; \ b='bfstream.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bilapP3-hct-like.edp.log: bilapP3-hct-like.edp @p='bilapP3-hct-like.edp'; \ b='bilapP3-hct-like.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ClosePoints.edp.log: ClosePoints.edp @p='ClosePoints.edp'; \ b='ClosePoints.edp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-binPROGRAMS clean-generic clean-local cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile all-local: @LOAD_COMPILE@ # FFCS parallel make: some targets need to be built first, sequentially load_compile: ff-c++ WHERE_LIBRARY-download include.done freefem++.pref # # max_load -@rm "Missing-plugins-$(DYLIB_SUFFIX).log" 2>/dev/null || true $(MAKE) $(AM_MAKEFLAGS) $(LIST_COMPILE) $(LIST_COMPILE_PKG) @if test -f Missing-plugins-$(DYLIB_SUFFIX).log ; then cat Missing-plugins-$(DYLIB_SUFFIX).log; fi; exit 0 @echo Warning missing plugin: `for i in $(LIST_COMPILE) $(LIST_COMPILE_PKG); do if test ! -s $i ; then j=1; echo "$i," ;fi; done` echo " finish build list $(DYLIB_SUFFIX)" .cpp.$(DYLIB_SUFFIX): ff-c++ ./ff-c++ -auto $< @ENABLE_FFCS_TRUE@include.done: $(allheaders) @ENABLE_FFCS_TRUE@ -rm -rf include @ENABLE_FFCS_TRUE@ mkdir -p include @ENABLE_FFCS_TRUE@ cp $^ include @ENABLE_FFCS_TRUE@ touch $@ @ENABLE_FFCS_FALSE@include.done: $(allheaders) @ENABLE_FFCS_FALSE@ -rm -rf include @ENABLE_FFCS_FALSE@ mkdir -p include @ENABLE_FFCS_FALSE@ for i in $(allheaders); do ln -s ../$$i include/. ; done @ENABLE_FFCS_FALSE@ touch $@ clean-local:: -rm -r include -rm include.done Ref: makeref.edp ../src/nw/FreeFem++-nw makeref.edp makeref.edp: regtests.m4 ../regtests.m4 m4 regtests.m4 > makeref.edp all-local: all.edp regtests.edp load_compile # FFCS - 27/2/13 - remove dependency on Makefile to avoid recompiling everything everytime something is changed in the # configuration step all.edp: @(echo "NoGraphicWindow=true;NoUseOfWait=true;int verbosityy=verbosity;"; \ for i in *`ls *.edp|grep -v -E '^(all|regtests|makeref|ref)\.edp$$'` ; do \ echo ' cout << "--------- file : '$$i' --------------------------------------------------------" << endl;' ;\ echo "verbosity=verbosityy;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ # To check the scripts against their reference values regtests.edp: regtests.m4 ../regtests.m4 m4 -DASSERT regtests.m4 > regtests.edp # FFCS - 27/2/13 - remove dependency on Makefile to avoid recompiling everything everytime something is changed in the # configuration step $(LIST_COMPILE):ff-c++ include.done clean-local:: -rm *.o *.$(DYLIB_SUFFIX) load.link WHERE_LIBRARY-download ff-get-dep ff-c++ ff-pkg-download \ $(LIST_COMPILE) $(LIST_COMPILE_PKG) regtests.edp makeref.edp -rm -rf include include.done ff-c++:load.link.in load.link WHERE_LIBRARY-download ff-get-dep ../config.status ../config.status --file=ff-c++:load.link.in chmod a+x ff-c++ load.link:load.link.in ../config.status ../config.status --file=load.link:load.link.in chmod a+x load.link ff-pkg-download:ff-pkg-download.in ../config.status ../config.status --file=$@:$@.in chmod a+x $@ cp $@ ../download/bin ff-get-dep:ff-get-dep.in ../config.status ../config.status --file=$@:$@.in chmod a+x $@ -if [ -d ../download/bin ] ;then cp $@ ../download/bin; fi WHERE_LIBRARY-download:ff-pkg-download FORCE WHERE_LIBRARY-config WHERE_LIBRARY @./ff-pkg-download >$@-new @diff $@-new $@ || (cp $@-new $@ ;touch WHERE_LIBRARY) WHERE_LIBRARY: touch $@ FORCE: ; freefem++.pref: echo loadpath = \"./\" >freefem++.pref install-exec-local:: load_compile WHERE_LIBRARY $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib test -n "$(MPIPROG)" && $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/lib/mpi || true $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/include $(mkinstalldirs) -m 755 $(DESTDIR)$(ff_prefix_dir)/etc $(INSTALL_DATA) clapack.h ppmimg.h bmo.hpp msh3.hpp pcm.hpp include/* $(DESTDIR)$(ff_prefix_dir)/include $(INSTALL) -m 555 $(LIST_COMPILE) $(DESTDIR)$(ff_prefix_dir)/lib $(INSTALL) -m 555 ff-get-dep.awk WHERE_LIBRARY-config WHERE_LIBRARY $(DESTDIR)$(ff_prefix_dir)/lib for i in WHERE_LIBRARY-config WHERE_LIBRARY WHERE_LIBRARY-download; do \ sed <$$i >$(DESTDIR)$(ff_prefix_dir)/lib/$$i 's#$(abs_top_builddir)/download#$(ff_prefix_dir)#' ;\ done echo loadpath += \"./\" >$(DESTDIR)$(ff_prefix_dir)/etc/freefem++.pref echo loadpath += \"$(ff_prefix_dir)/lib\" >>$(DESTDIR)$(ff_prefix_dir)/etc/freefem++.pref echo includepath += \"$(ff_prefix_dir)/idp\" >>$(DESTDIR)$(ff_prefix_dir)/etc/freefem++.pref $(INSTALL_SCRIPT) ff-c++ $(DESTDIR)${bindir} $(INSTALL_SCRIPT) ff-pkg-download $(DESTDIR)${bindir} $(INSTALL_SCRIPT) ff-get-dep $(DESTDIR)${bindir} -for i in $(LIST_COMPILE_PKG); do \ if [ -f $$i ] ; then $(INSTALL) -m 555 $$i $(DESTDIR)$(ff_prefix_dir)/lib; fi; done - if [ -n "$(MPIPROG)" ] ; then \ for i in $(LIST_COMPILE_PKG) $(LIST_COMPILE); do \ if [ -f ../examples++-mpi/$$i ] ; then \ $(INSTALL) -m 555 ../examples++-mpi/$$i $(DESTDIR)$(ff_prefix_dir)/lib/mpi; \ else echo missing install mpi version ??? ../examples++-mpi/$$i ;\ fi; \ done ; \ fi clean-local:: -rm *.fg *.eps *~ *.ps *.mesh *.mesh.gmsh ListOfAllocPtr-8.bin ffglut*.ppm Th.o.meshb Th3.d.meshb dep.sol.meshbgh \ ipopt.out mmg.out xxxx ThFF.txt TriQA.txt cavidadTT.txt mass.txt xy.txt \ ThFF_Metric.txt TriQA_Metric.txt datanc.txt u100m8.txt \ TTh.sol Th.o.sol Th3.sol dep.o.sol dep.sol gradient.sol hessien.sol pippo.data pippo.dx testsavemedit.solb med.gp bidule.vtk disque.vtk g-iso # FFCS: add tags for files that are not specified to automake by a SOURCE directive (this tags file is automatically # taken into account by automake when it sees it). TAGS: etags *.?pp # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: freefem++-3.38-1/examples++-load/makeref.edp000644 000767 000024 00000006151 12505046511 020573 0ustar00hechtstaff000000 000000 // Regression tests // ---------------- // $Id$ // Regression tests // ---------------- // The tests are checked against reference values by "make check" in // each examples subdirectory // "ref.edp" contains all reference values and may be rebuilt with // "make Ref" // $Id$ // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. NoUseOfWait=true; int verbosityy=verbosity; ofstream ref("ref.edp"); // The values tested here may not have a physical or mathematical // meaning. Their main property is to gather numerical values from the // whole domain, to be checked for consistency with previous runs. cout << "--------- file : load.edp -----------------" << endl; verbosity=verbosityy; { include "load.edp"; real TESTload=uh[].max; ref<<"real REFload="< using namespace std; #include "cfloat" #include "rgraph.hpp" #include "error.hpp" #include "AFunction.hpp" //#include "lex.hpp" #include "MatriceCreuse_tpl.hpp" #include "Mesh3dn.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" /* #include #include #include using namespace std; #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" // remove problem of include #undef HAVE_LIBUMFPACK #undef HAVE_CADNA #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh.hpp" #include "lgmesh3.hpp" #include "lgsolver.hpp" #include "problem.hpp" */ class MatrixUpWind0 : public E_F0mps { public: typedef Matrice_Creuse * Result; Expression emat,expTh,expc,expu1,expu2; MatrixUpWind0(const basicAC_F0 & args) { args.SetNameParam(); emat =args[0]; // the matrix expression expTh= to(args[1]); // a the expression to get the mesh expc = CastTo(args[2]); // the expression to get c (must be a double) // a array expression [ a, b] const E_Array * a= dynamic_cast((Expression) args[3]); if (a->size() != 2) CompileError("syntax: MatrixUpWind0(Th,rhi,[u1,u2])"); int err =0; expu1= CastTo((*a)[0]); // fist exp of the array (must be a double) expu2= CastTo((*a)[1]); // second exp of the array (must be a double) } ~MatrixUpWind0() { } static ArrayOfaType typeargs() { return ArrayOfaType(atype*>(), atype(),atype(),atype());} static E_F0 * f(const basicAC_F0 & args){ return new MatrixUpWind0(args);} AnyType operator()(Stack s) const ; }; int fvmP1P0(double q[3][2], double u[2],double c[3], double a[3][3], double where[3] ) { // computes matrix a on a triangle for the Dervieux FVM for(int i=0;i<3;i++) for(int j=0;j<3;j++) a[i][j]=0; for(int i=0;i<3;i++){ int ip = (i+1)%3, ipp =(ip+1)%3; double unL =-((q[ip][1]+q[i][1]-2*q[ipp][1])*u[0] -(q[ip][0]+q[i][0]-2*q[ipp][0])*u[1])/6; if(unL>0) { a[i][i] += unL; a[ip][i]-=unL;} else{ a[i][ip] += unL; a[ip][ip]-=unL;} if(where[i]&&where[ip]){ // this is a boundary edge unL=((q[ip][1]-q[i][1])*u[0] -(q[ip][0]-q[i][0])*u[1])/2; if(unL>0) { a[i][i]+=unL; a[ip][ip]+=unL;} } } return 1; } // the evaluation routine AnyType MatrixUpWind0::operator()(Stack stack) const { Matrice_Creuse * sparce_mat =GetAny* >((*emat)(stack)); MatriceMorse * amorse =0; MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh = GetAny((*expTh)(stack)); ffassert(pTh); Mesh & Th (*pTh); { map< pair, R> Aij; KN cc(Th.nv); double infini=DBL_MAX; cc=infini; for (int it=0;itsetP(&Th,it,iv); cc[i]=GetAny((*expc)(stack)); } } for (int k=0;kset(Th,K(Pt),Pt,K,K.lab); u[0] = GetAny< R>( (*expu1)(stack) ) ; u[1] = GetAny< R>( (*expu2)(stack) ) ; int ii[3] ={ Th(A), Th(B),Th(C)}; double q[3][2]= { { A.x,A.y} ,{B.x,B.y},{C.x,C.y} } ; // coordinates of 3 vertices (input) double c[3]={cc[ii[0]],cc[ii[1]],cc[ii[2]]}; double a[3][3], where[3]={(double) A.lab, (double) B.lab, (double)C.lab}; if (fvmP1P0(q,u,c,a,where) ) { for (int i=0;i<3;i++) for (int j=0;j<3;j++) if (fabs(a[i][j]) >= 1e-30) { Aij[make_pair(ii[i],ii[j])]+=a[i][j]; } } } amorse= new MatriceMorse(Th.nv,Th.nv,Aij,false); } sparce_mat->Uh=UniqueffId(); sparce_mat->Vh=UniqueffId(); sparce_mat->A.master(amorse); sparce_mat->typemat=(amorse->n == amorse->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) *mp=mps; if(verbosity>3) { cout << " End Build MatrixUpWind : " << endl;} return sparce_mat; } /* class Init { public: Init(); }; $1 */ static void Load_Init() { cout << " lood: init Mat Chacon " << endl; Global.Add("MatUpWind1","(", new OneOperatorCode( )); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/mat_psi.cpp000644 000767 000024 00000016615 12466662503 020650 0ustar00hechtstaff000000 000000 // Example C++ function "myfunction", dynamically loaded into "load.edp" // --------------------------------------------------------------------- // $Id$ #include "ff++.hpp" class MatrixUpWind0 : public E_F0 { public: typedef Matrice_Creuse * Result; Expression emat,expTh,expc,expu1,expu2; MatrixUpWind0(const basicAC_F0 & args) { args.SetNameParam(); emat =args[0]; expTh= to(args[1]); expc = CastTo(args[2]); const E_Array * a= dynamic_cast((Expression) args[3]); if (a->size() != 2) CompileError("syntax: MatrixUpWind0(Th,rhi,[u1,u2])"); int err =0; expu1= CastTo((*a)[0]); expu2= CastTo((*a)[1]); } ~MatrixUpWind0() { } static ArrayOfaType typeargs() { return ArrayOfaType(atype*>(),atype(),atype(),atype());} static E_F0 * f(const basicAC_F0 & args){ return new MatrixUpWind0(args);} AnyType operator()(Stack s) const ; }; class MatrixUpWind3 : public E_F0 { public: typedef Matrice_Creuse * Result; Expression emat,expTh,expc,expu1,expu2,expu3; MatrixUpWind3(const basicAC_F0 & args) { args.SetNameParam(); emat =args[0]; expTh= to(args[1]); expc = CastTo(args[2]); const E_Array * a= dynamic_cast((Expression) args[3]); if (a->size() != 3) CompileError("syntax: MatrixUpWind0(Th,rhi,[u1,u2])"); int err =0; expu1= CastTo((*a)[0]); expu2= CastTo((*a)[1]); expu3= CastTo((*a)[2]); } ~MatrixUpWind3() { } static ArrayOfaType typeargs() { return ArrayOfaType(atype*>(),atype(),atype(),atype());} static E_F0 * f(const basicAC_F0 & args){ return new MatrixUpWind3(args);} AnyType operator()(Stack s) const ; }; int gladys(double q[3][2], double u[2],double c[3], double a[3][3] ) //PSI Deconninck { // computes matrix a on a triangle for the Chacon-Reina Petrof-Galerkin upwind // working arrays double dw[3][2]; // basis function gradients times area double ua[2], kk[3], beta[3]; // to define a[][] double udc=0; // u.grad(w)*area bool oneaval=false; int i1=-1; for(int i=0;i<3;i++) { int ip=(i+1)%3, ipp=(ip+1)%3; for(int j=0;j<2;j++) dw[i][1-j]= (2*j-1)*(q[ipp][j]-q[ip][j])/2; } for(int i=0;i<3;i++){ kk[i] = u[0]*dw[i][0]+u[1]*dw[i][1] ; udc += kk[i]*c[i]; } for(int i=0;i<3;i++) { ua[0]=u[0]; ua[1]=u[1]; int ip=(i+1)%3, ipp=(ip+1)%3; if(kk[i]>0 && kk[ip]<=0 && kk[ipp]<=0) { beta[i]=1; beta[ip]=0; beta[ipp]=0; oneaval=true; } else if(kk[i]<=0 && kk[ip]>0 && kk[ipp]>0) i1=i; } if(!oneaval) { if(i1<0)cout<<"bug\n"; int i=i1, ip=(i+1)%3, ipp=(i+2)%3; double lambda = (c[ip]-c[i])*(c[ipp]-c[i]); if (fabs(lambda) < -1e-20) { return 0; } if(lambda < 0) { if (udc>0) { beta[i]=0; beta[ip]=0; beta[ipp]=1; ua[0] = udc*(q[ipp][0]-q[i][0])/(c[ipp]-c[i]); ua[1] = udc*(q[ipp][1]-q[i][1])/(c[ipp]-c[i]); } else { beta[i]=0; beta[ipp]=0; beta[ip]=1; ua[0] = udc*(q[ip][0]-q[i][0])/(c[ip]-c[i]); ua[1] = udc*(q[ip][1]-q[i][1])/(c[ip]-c[i]); } } else { beta[i]=0; beta[ip]=kk[ip]*(c[ip]-c[i])/udc; beta[ipp]=kk[ipp]*(c[ipp]-c[i])/udc; } } for(int i=0;i<3;i++) for(int j=0;j<3;j++) a[i][j]= beta[i]*(ua[0]*dw[j][0]+ua[1]*dw[j][1]); return 1; } AnyType MatrixUpWind0::operator()(Stack stack) const { Matrice_Creuse * sparce_mat =GetAny* >((*emat)(stack)); MatriceMorse * amorse =0; MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh = GetAny((*expTh)(stack)); ffassert(pTh); Mesh & Th (*pTh); { map< pair, R> Aij; KN cc(Th.nv); double infini=DBL_MAX; cc=infini; for (int it=0;itsetP(&Th,it,iv); cc[i]=GetAny((*expc)(stack)); } } for (int k=0;kset(Th,K(Pt),Pt,K,K.lab); u[0] = GetAny< R>( (*expu1)(stack) ) ; u[1] = GetAny< R>( (*expu2)(stack) ) ; int ii[3] ={ Th(A), Th(B),Th(C)}; double q[3][2]= { { A.x,A.y} ,{B.x,B.y},{C.x,C.y} } ; // coordinates of 3 vertices (input) double c[3]={cc[ii[0]],cc[ii[1]],cc[ii[2]]}; double a[3][3]; if (gladys(q,u,c,a) ) { for (int i=0;i<3;i++) for (int j=0;j<3;j++) if (fabs(a[i][j]) >= 1e-30) Aij[make_pair(ii[i],ii[j])]+=a[i][j]; } } amorse= new MatriceMorse(Th.nv,Th.nv,Aij,false); } sparce_mat->Uh=UniqueffId(); sparce_mat->Vh=UniqueffId(); sparce_mat->A.master(amorse); sparce_mat->typemat=(amorse->n == amorse->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) *mp=mps; if(verbosity>3) { cout << " End Build MatrixUpWind : " << endl;} return sparce_mat; } int Marco(const Mesh3::Element & K, R3 U,R c[4], double a[4][4] ) //PSI Deconninck { ExecError("Not Implemented Sorry Marco!"); return 0; } AnyType MatrixUpWind3::operator()(Stack stack) const { Matrice_Creuse * sparce_mat =GetAny* >((*emat)(stack)); MatriceMorse * amorse =0; MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh = GetAny((*expTh)(stack)); ffassert(pTh); Mesh3 & Th (*pTh); { map< pair, R> Aij; KN cc(Th.nv); double infini=DBL_MAX; cc=infini; for (int it=0;itsetP(&Th,it,iv); cc[i]=GetAny((*expc)(stack)); } } for (int k=0;kset(Th,K(Pt),Pt,K,K.lab); U.x = GetAny< R>( (*expu1)(stack) ) ; U.y = GetAny< R>( (*expu2)(stack) ) ; U.z = GetAny< R>( (*expu3)(stack) ) ; int ii[4] ={ Th(A), Th(B),Th(C),Th(D)};// number of 4 vertex double c[4]={cc[ii[0]],cc[ii[1]],cc[ii[2]],cc[ii[3]]}; double a[4][4]; if (Marco(K,U,c,a) ) { for (int i=0;i<4;i++) for (int j=0;j<4;j++) if (fabs(a[i][j]) >= 1e-30) Aij[make_pair(ii[i],ii[j])]+=a[i][j]; } } amorse= new MatriceMorse(Th.nv,Th.nv,Aij,false); } sparce_mat->Uh=UniqueffId(); sparce_mat->Vh=UniqueffId(); sparce_mat->A.master(amorse); sparce_mat->typemat=(amorse->n == amorse->m) ? TypeSolveMat(TypeSolveMat::GMRES) : TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) *mp=mps; if(verbosity>3) { cout << " End Build MatrixUpWind : " << endl;} return sparce_mat; } /* class Init { public: Init(); }; Init init; */ static void Load_Init() { cout << " lood: init Mat Chacon " << endl; Global.Add("MatUpWind0","(", new OneOperatorCode( )); Global.Add("MatUpWind0","(", new OneOperatorCode( )); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/medit.cpp000644 000767 000024 00000204032 12471464507 020306 0ustar00hechtstaff000000 000000 // ORIG-DATE: Aout 2008 // -*- Mode : c++ -*- // // SUMMARY : liaison medit freefem++ : popen // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // E-MAIL : jacques.morice@ann.jussieu.fr // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ #include "../src/Graphics/mode_open.hpp" // ALH - there should be a '-I'? #include "ff++.hpp" #define WrdSiz 4 #ifdef _WIN32 string stringffmedit= "ffmedit.exe"; //string stringemptymedit= "ffmedit.exe"; #else string stringffmedit= "ffmedit"; #endif const char *medit_popen="-popen";// 1"; // depend de l endroit ou se trouve medit const char *medit_bin="-filebin"; const char *medit_addsol="-addsol"; const char *medit_debug="-d"; static bool TheWait=false; bool NoWait=false; extern bool NoGraphicWindow; using namespace std; using namespace Fem2D; //******************************* // // read solution of .sol or .solb // //******************************* class readsol_Op : public E_F0mps { public: typedef KN_ Result; Expression eTh; Expression filename; static const int n_name_param = 1; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: /* readsol_Op(const basicAC_F0 & args, Expression ffname) : filename(ffname) { if(verbosity>2) cout << "readsol"<< endl; args.SetNameParam(n_name_param,name_param,nargs); } */ readsol_Op(const basicAC_F0 & args) { if(verbosity>2) cout << "readsol"<< endl; args.SetNameParam(n_name_param,name_param,nargs); if ( BCastTo(args[0]) ) filename = CastTo(args[0]); else CompileError("no filename given"); } static ArrayOfaType typeargs() { return ArrayOfaType( atype(),true ); }// all type static E_F0 * f(const basicAC_F0 & args) { return new readsol_Op(args);} AnyType operator()(Stack stack) const ; operator aType () const { return atype< KN_ >();} }; basicAC_F0::name_and_type readsol_Op::name_param[]= { { "number",&typeid(long) } }; AnyType readsol_Op::operator()(Stack stack) const { string * ffname= GetAny( (*filename)(stack) ); int k,i,isol,type,inm,ver,dim,typtab[GmfMaxTyp],offset; char *ptr,data[128]; // rajout freefem++ int nv=0,ntet=0,ntri=0; int nsol; int key; int numsol(arg(0,stack,-1L)); assert(abs(numsol)>=1); char * charfile= new char[ffname->size()+1]; strncpy(charfile,ffname->c_str(),ffname->size()+1); strcpy(data,charfile); ptr = strstr(data,".sol"); if ( ptr ) *ptr = '\0'; strcat(data,".solb"); if( !(inm = GmfOpenMesh(data, GmfRead, &ver,&dim)) ) { ptr = strstr(data,".solb"); *ptr = '\0'; strcat(data,".sol"); if( !(inm = GmfOpenMesh(data, GmfRead, &ver,&dim)) ) { cerr << " ** "<< (char *) data << " NOT FOUND.\n" << endl; exit(1); } } if(verbosity>2) cout <<" %%%%" << (char *) data << " OPENED\n" << endl; nv = GmfStatKwd(inm,GmfSolAtVertices,&type,&offset,&typtab); if( nv ){ key = GmfSolAtVertices; nsol = nv; } else{ ntri = GmfStatKwd(inm,GmfSolAtTriangles,&type,&offset,&typtab); if( ntri ){ key = GmfSolAtTriangles; nsol = ntri; } else ntet = GmfStatKwd(inm,GmfSolAtTetrahedra,&type,&offset,&typtab); if( ntet ){ key = GmfSolAtTetrahedra; nsol = ntet; } } if ( (nv == 0) && (ntri == 0) && (ntet == 0) ){ cerr << " ** MISSING DATA" << endl; exit(1); } int nbsol = nsol*offset; int offsettab = 0; int firstelem = 0; if(numsol != -1){ if( typtab[numsol-1] == 1){ nbsol=nsol; offsettab = 1; } else if( typtab[numsol-1] == 2){ nbsol=nsol*dim; offsettab = dim; } else if( typtab[numsol-1] == 3){ nbsol=nsol*dim*(dim+1)/2; offsettab = dim*(dim+1)/2; } else{ cerr << "bug in the definition of type of solution: 1 scalar, 2 vector, 3 symetric tensor" << endl; exit(1); } for(int ii=0; ii< (numsol-1); ii++) if( typtab[ii] == 1) firstelem=firstelem+1; else if( typtab[ii] == 2){ firstelem=firstelem+dim; } else if( typtab[ii] == 3){ firstelem=firstelem+dim*(dim+1)/2;; } else{ cerr << "bug in the definition of type of solution: 1 scalar, 2 vector, 3 symetric tensor" << endl; exit(1); } } if(verbosity >5) cout << "nbsol " << nbsol << " offset " << offset << " " << nsol << " "<< endl; float *buf =new float[offset]; double tmp; double *bufd=new double[offset]; KN *ptabsol = new KN(nbsol); KN &tabsol =*ptabsol; if(numsol == -1){ GmfGotoKwd(inm,key); if( ver == GmfFloat ){ for (k=1; k<=nsol; k++) { isol = (k-1) * offset ; GmfGetLin(inm,key,buf); for (i=0; ioffset == 6 ) { tmp = sol->met[isol + 2]; sol->met[isol + 2] = sol->met[isol + 3]; sol->met[isol + 3] = tmp; */ GmfCloseMesh(inm); delete [] buf; delete [] bufd; Add2StackOfPtr2Free(stack,ptabsol); return SetAny< KN >(tabsol); } //************************* // // creation point sol // //************************* // datasolMesh2 class datasolMesh2_Op : public E_F0mps { public: typedef long Result; Expression eTh; Expression filename; struct Expression2 { long what; // 1 scalar, 2 vector, 3 symtensor long nbfloat; // 1 scalar, 2 vector (3D), 3 symtensor(3D) string *dataname; Expression e[3]; Expression2() {e[0]=0; e[1]=0; e[2]=0; what=0; nbfloat=0;}; Expression &operator[](int i){return e[i];} double eval(int i,Stack stack) const { if (e[i]) { return GetAny< double >( (*e[i])(stack) ); } else return 0; } }; vector l; static const int n_name_param = 1; static basicAC_F0::name_and_type name_param[]; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: datasolMesh2_Op(const basicAC_F0 & args) : l( args.size()-2 ) { int nbofsol; int ddim=2; int stsize=3; //cout << "construction data medit solution avec datasolMesh2_Op" << args << endl; //cout << "taille de args" << args.size() << endl; args.SetNameParam(n_name_param,name_param,nargs); if (BCastTo(args[0])) filename = CastTo(args[0]); if (BCastTo(args[1])) eTh= CastTo(args[1]); nbofsol = l.size(); for (size_t i=2;i( args[i] )) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); //cout << "taille" << a0->size() << endl; if (a0->size() != ddim && a0->size() != stsize) CompileError("savesol in 2D: vector solution is 2 composant, tensor solution is 3 composant"); if( a0->size() == ddim){ // vector solution l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize){ // symmetric tensor solution l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } } } else { cout << " arg " << i << " " << args[i].left() << endl; CompileError("savesol in 2D: Sorry no way to save this kind of data"); } } } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new datasolMesh2_Op(args);} AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type datasolMesh2_Op::name_param[]= { { "order",&typeid(long)} }; AnyType datasolMesh2_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh= GetAny((*eTh)(stack)); string * ffname= GetAny( (*filename)(stack) ); ffassert(pTh); Mesh &Th=*pTh; int nt = Th.nt; int nv = Th.nv; int nbtype=l.size(); int nbsol; int solnbfloat; int TypTab[l.size()]; int resultorder= arg(0, stack, 1L); long longdefault; int ver = GmfFloat, outm; // determination de TypTab solnbfloat=0; for (size_t i=0;isize()+1]; strcpy(ret, ffname->c_str()); if ( !(outm = GmfOpenMesh( ret, GmfWrite, ver, 2)) ) { cerr <<" -- Mesh3::Save UNABLE TO OPEN :"<< ret << endl; exit(1); } if(resultorder==0){ // ordre 0 nbsol = nt; KN valsol(solnbfloat*nbsol); MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(size_t i=0;i valsol(solnbfloat*nbsol); valsol=0.; KN takemesh(nbsol); MeshPoint *mp3(MeshPointStack(stack)); //R2 Cdg_hat = R2(1./3.,1./3.); takemesh=0; for (int it=0;itsetP(&Th,it,iv); int h=0; for(size_t ii=0;ii(args[0])){ filename = CastTo(args[0]); // } //if (BCastTo(args[1])){ eTh= CastTo(args[1]); // } nbofsol = l.size(); for (size_t i=2;i(args[i])) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); //cout << "taille" << a0->size() << endl; if (a0->size() != ddim && a0->size() != stsize) CompileError("savesol in 3D: vector solution is 3 composant, vector solution is 6 composant"); if( a0->size() == ddim){ // vector solution l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize){ // symmetric tensor solution l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } } } else { CompileError("savesol in 3D: Sorry no way to save this kind of data"); } } } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new datasolMesh3_Op(args);} AnyType operator()(Stack stack) const ; }; template basicAC_F0::name_and_type datasolMesh3_Op::name_param[]= { { "order",&typeid(long)} }; template AnyType datasolMesh3_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); string * ffname= GetAny( (*filename)(stack) ); ffassert(pTh); Mesh3 &Th=*pTh; int nt = Th.nt; int nv = Th.nv; int nbe = Th.nbe; int nbtype=l.size(); int nbsol; int solnbfloat; int TypTab[l.size()]; int resultorder= arg(0, stack, 1); long longdefault; int ver = GmfFloat, outm; // determination de TypTab solnbfloat=0; for (size_t i=0;isize()+1]; strcpy(ret, ffname->c_str()); if(verbosity>2) cout << ret << endl; if ( !(outm = GmfOpenMesh( ret, GmfWrite, ver, 3)) ) { cerr <<" -- Mesh3::Save UNABLE TO OPEN :"<< filename << endl; exit(1); } if(resultorder==0){ // Tetrahedra // ordre 0 nbsol = nt; KN valsol(solnbfloat*nbsol); MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); for(size_t i=0;i valsol2(solnbfloat*nbsol); //cout << "value of triangles in the border nbe="<< nbe << endl; MeshPoint *mp32(MeshPointStack(stack)); for (int it=0;itset(xg,yg,zg); for(size_t i=0;i valsol(solnbfloat*nbsol); KN takemesh(nbsol); MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); takemesh=0; for (int it=0;itsetP(&Th,it,iv); int h=0; for(size_t ii=0;ii ret1(ffnn.size()+1); strcpy( ret1, ffnn.c_str()); int nbstrings=1; char *tictac; tictac= strtok(ret1," \n"); meditcmm += ' '; meditcmm += tictac; while( tictac != NULL && nbstrings < nbsol){ tictac = strtok(NULL," \n"); meditcmm += ' '; meditcmm += tictac; nbstrings++; } if(nbstrings != smedit ){ cout << "The number of string defined in string parameter is different of the number of solution" << endl; if( nbstrings < smedit ){ // Add strings while( nbstrings < smedit ){ nbstrings++; char newsol[10]; sprintf(newsol," ffsol%i",nbstrings); meditcmm += newsol; } } } char * ret= new char[meditcmm.size()+1]; //char ret[meditcmm.size()+1]; strcpy( ret, meditcmm.c_str()); return ret; } void writetabsol(const int &tsize, const int &nbofsol,const KN &v1, KNM &vv){ for(int i=0; i &v1, const KN &v2, KNM &vv){ for(int i=0; i &v1, const KN &v2, const KN &v3, KNM &vv){ for(int i=0; i &v1, const KN &v2, const KN &v3, const KN &v4, const KN &v5, const KN &v6,KNM &vv){ for(int i=0; i( (*e[i])(stack) ); } else return 0; } const Mesh & evalm(int i,Stack stack) const { throwassert(e[i]);return * GetAny< pmesh >((*e[i])(stack)) ;} }; vector l; static const int n_name_param =5; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a ) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: PopenMeditMesh_Op(const basicAC_F0 & args) : l( args.size()-1 ) { int nbofsol; int ddim=2; int stsize=3; char *tictac; args.SetNameParam(n_name_param,name_param,nargs); if(BCastTo(args[0])) filename = CastTo(args[0]); /* string * ffname = GetAny( args[0] ); char * ret= new char[ffname->size()+1]; strcpy( ret, ffname->c_str()); int nbstrings=1; tictac = strtok(ret," \n"); cout << "tictac" << tictac << endl; while( tictac != NULL ){ tictac = strtok(NULL," \n"); nbstrings++; } */ for (size_t i=1;i(args[i]) ) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); if (a0->size() != ddim && a0->size() != stsize) CompileError("medit in 2D: vector solution is 2 composant, tensor solution is 3 composant"); if( a0->size() == ddim){ // vector solution l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize){ // symmetric tensor solution l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } } } else if( BCastTo(args[i]) ){ l[jj].what = 0; l[jj].nbfloat = 0; l[jj][0] = CastTo(args[i]); } else { CompileError("medit in 2D: Sorry no way to save this kind of data"); } } offset=0; nbTh=1; // determination of the number of solutions // ============================= // 0 2 3 2 ! 0 2 3 2 ! 0 2 3 2 // 0 1 2 3 ! 4 5 6 7 ! 8 9 10 11 // ============================= for(size_t jj=1; jj( (*filename)(stack) ); string * meditff(arg(1,stack,&stringffmedit)); long filebin (arg(4,stack,1)); int smedit=max(1,nbsol); char * commandline = meditcmd( filebin, nbsol, smedit, *meditff, *ffname); printf("version de medit %s\n",commandline); // lecture des differents maillages int nv=0,nt=0,nbe=0; // sommet, triangles, arretes du maillage unifies //cout << "commencement du maillage " << endl; for(size_t i=0; i2) cout << "Popen medit : vertex "<< nv << " triangle "<< nt << " edge " << nbe << endl; Mesh *pTh = new Mesh(nv,nt,nbe,v,t,b); Mesh &Th = *pTh; // determination of the number of elements to represent the solution int datasize; if(order == 0) datasize= nt; if(order == 1) datasize= nv; // cas de sauvegarde bool boolsave = false; int solnbfloat=0; KNM solsave(1,1); string * saveff; KN vxx,vyx,vyy; if(nbsol > 0){ vxx.init(datasize); vyx.init(datasize); vyy.init(datasize); if( nargs[2] ){ boolsave= true; saveff = GetAny( (*nargs[2])(stack) ); int ddim = 2; for (size_t i=0;i 0){ if(filebin){ int cod = 1; int NulPos = 0; int KwdCod; int codtypjm = 1; // determination of number solutions associated with a mesh fwrite( (unsigned char *) &cod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &ver, WrdSiz,1,popenstream ); KwdCod = GmfDimension; fwrite( (unsigned char *) &KwdCod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &NulPos, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &dimp, WrdSiz,1,popenstream ); if(order==0){ KwdCod = GmfSolAtTriangles; fwrite( (unsigned char *) &KwdCod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &NulPos, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &nt, WrdSiz,1,popenstream ); printf("SolAtTriangles nt=%i\n",nt); } if(order==1){ KwdCod = GmfSolAtVertices; fwrite( (unsigned char *) &KwdCod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &NulPos, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &nv, WrdSiz,1,popenstream ); printf("SolAtVertices nv=%i\n",nv); } typsol = TypTab[jojo]; fwrite( (unsigned char *) &codtypjm, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &typsol, WrdSiz,1,popenstream ); //printf(popenstream,"%i %i\n",codtypjm,typsol); } else{ fprintf(popenstream,"MeshVersionFormatted %i\n",ver); fprintf(popenstream,"Dimension %i\n",dimp); if(order==0){ fprintf(popenstream,"SolAtTriangles\n"); fprintf(popenstream,"%i\n",nt); } if(order==1){ fprintf(popenstream,"SolAtVertices\n"); fprintf(popenstream,"%i\n",nv); } typsol = TypTab[jojo]; fprintf(popenstream,"%i %i\n",1,typsol); } if(typsol==1){ if(order==0){ vxx=0.; MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); vxx[it] = l[jojo1].eval(0,stack); //GetAny< double >( (*nargs[1])(stack) ); } if(filebin){ for(int k=0; k solsca(nv); vxx=0.; KN takemesh(nv); MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; for (int it=0;itsetP(&Th,it,iv); vxx[i] = vxx[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*nargs[1])(stack) ); takemesh[i] = takemesh[i]+1; } } if(filebin){ for(int k=0; k vxx(nt),vyy(nt); MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); vxx=0.; vyy=0.; for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); vxx[it] = l[jojo1].eval(0,stack); //GetAny< double >( (*xx)(stack) ); vyy[it] = l[jojo1].eval(1,stack); //GetAny< double >( (*yy)(stack) ); } if(filebin){ for(int k=0; k vxx(nv),vyy(nv); KN takemesh(nv); MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; vxx=0.; vyy=0.; for (int it=0;itsetP(&Th,it,iv); vxx[i] = vxx[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*xx)(stack) ); vyy[i] = vyy[i]+l[jojo1].eval(1,stack); //GetAny< double >( (*yy)(stack) ); takemesh[i] = takemesh[i]+1; //} } } if(filebin){ for(int k=0; k vxx(nt),vyx(nt),vyy(nt); vxx=0.; vyx=0.; vyy=0.; MeshPoint *mp3(MeshPointStack(stack)); R2 Cdg_hat = R2(1./3.,1./3.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); vxx[it] = l[jojo1].eval(0,stack); //GetAny< double >( (*tsxx)(stack) ); vyx[it] = l[jojo1].eval(1,stack); //GetAny< double >( (*tsyx)(stack) ); vyy[it] = l[jojo1].eval(2,stack); //GetAny< double >( (*tsyy)(stack) ); } if(filebin){ for(int k=0; k vxx(nv),vyx(nv),vyy(nv); KN takemesh(nv); MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; vxx=0.; vyx=0.; vyy=0.; for (int it=0;itsetP(&Th,it,iv); vxx[i] = vxx[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*tsxx)(stack) ); vyx[i] = vyx[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*tsyx)(stack) ); vyy[i] = vyy[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*tsyy)(stack) ); takemesh[i] = takemesh[i]+1; //} } } if(filebin){ for(int k=0; k2) cout << "writing solution in file" << endl; if(typsol==1){ writetabsol( datasize, nboftmp, vxx, solsave); nboftmp=nboftmp+1; } else if(typsol==2){ writetabsol( datasize, nboftmp, vxx, vyy, solsave); nboftmp=nboftmp+2; } else if(typsol==3){ writetabsol( datasize, nboftmp, vxx, vyx, vyy, solsave); nboftmp=nboftmp+3; } /*cout << "fin writing solution in file nboftmp=" << nboftmp << endl; if(verbosity>2) { cout << "datasize=" << datasize << " " << "solnbfloat=" << solnbfloat << " boolsave=" << boolsave << endl; for(int iy=0; iy((*nargs[3])(stack)); bool plotting = true; // drawing part ------------------------------ // suppression du no wait car plante sur mac // il faut faire thread qui lance ca de maniere asyncrone ... // a faire .. FH ... // if (wait && !NoWait) { pclose(popenstream); } //else // { // fclose(popenstream); //} // rajout pout la sauvegarde de la solution if(boolsave){ //cout <<"save solution in file avec printf\n"<< endl;; int outm; int nbtype=nbsol; float *OutSolTab = new float[solnbfloat]; if ( !(outm = GmfOpenMesh(saveff->c_str(),GmfWrite,ver,2)) ) { cerr <<" -- Mesh3::Save UNABLE TO OPEN :"<< saveff << endl; exit(1); } if(order == 0){ GmfSetKwd(outm,GmfSolAtTriangles, datasize, nbtype, TypTab); for (int k=0; k class PopenMeditMesh3_Op : public E_F0mps { public: typedef long Result; Expression eTh; Expression filename; long offset; long nbTh; struct Expression2 { long what; // 0 mesh, 1 scalar, 2 vector, 3 symtensor long nbfloat; // 0 mesh(3D), 1 scalar, 2 vector (3D), 3 symtensor(3D) Expression e[6]; Expression2() {e[0]=0; e[1]=0; e[2]=0; e[3]=0; e[4]=0; e[5]=0; what=0; nbfloat=0;}; Expression &operator[](int i){return e[i];} double eval(int i,Stack stack) const { if (e[i]) { return GetAny< double >( (*e[i])(stack) ); } else return 0; } const Mesh3 & evalm(int i,Stack stack) const { throwassert(e[i]);return * GetAny< pmesh3 >((*e[i])(stack)) ;} }; vector l; static const int n_name_param = 5; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} string* arg(int i,Stack stack, string* a ) const{ return nargs[i] ? GetAny< string* >( (*nargs[i])(stack) ): a;} public: PopenMeditMesh3_Op(const basicAC_F0 & args) : l( args.size()-1 ) { int nbofsol; int ddim=3; int stsize=6; args.SetNameParam(n_name_param,name_param,nargs); if (BCastTo(args[0])) filename = CastTo(args[0]); //if (BCastTo(args[1])) eTh= CastTo(args[1]); for (size_t i=1;i(args[i]) ) { l[jj].what=1; l[jj].nbfloat=1; l[jj][0]=to( args[i] ); } else if ( args[i].left()==atype() ) { const E_Array * a0 = dynamic_cast( args[i].LeftValue() ); //cout << "taille" << a0->size() << endl; if (a0->size() != ddim && a0->size() != stsize) CompileError("medit in 3D: vector solution is 3 composant, tensor solution is 6 composant"); if( a0->size() == ddim){ // vector solution l[jj].what=2; l[jj].nbfloat=ddim; for(int j=0; j( (*a0)[j]); } } else if( a0->size() == stsize){ // symmetric tensor solution l[jj].what=3; l[jj].nbfloat=stsize; for(int j=0; j( (*a0)[j]); } } } else if( BCastTo(args[i]) ){ l[jj].what = 0; l[jj].nbfloat = 0; l[jj][0] = CastTo(args[i]); } else { CompileError("medit 3d: Sorry no way to save this kind of data"); } } // determination of the number of solutions. size_t lastTh=0; long offset1; offset=0; nbTh=0; for(size_t jj=0; jj(), atype(), true); }// all type static E_F0 * f(const basicAC_F0 & args) { return new PopenMeditMesh3_Op(args);} AnyType operator()(Stack stack) const ; }; template basicAC_F0::name_and_type PopenMeditMesh3_Op::name_param[]= { { "order", &typeid(long)}, { "meditff", &typeid(string*)}, { "save",&typeid(string*)}, { "wait",&typeid(bool)}, { "bin",&typeid(long)} }; template AnyType PopenMeditMesh3_Op::operator()(Stack stack) const { if(NoGraphicWindow) return Nothing; MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; long order (arg(0,stack,1L)); // int ver = GmfFloat; int dimp =3; float fx,fy,fz; // long valsortie=0; int typsol,nbsol; nbsol = offset-1; int TypTab[l.size()-1]; for (size_t i=0;i( (*filename)(stack) ); string * meditff(arg(1,stack,&stringffmedit)); long filebin (arg(4,stack,1L)); int smedit=max(1,nbsol); char * commandline = meditcmd( filebin, nbsol, smedit, *meditff, *ffname); printf("version de medit %s\n",commandline); if(verbosity>2) cout << "number of solution = " << offset-1 << endl; if(verbosity>2) cout << "number of mesh = " << nbTh << endl; // lecture des differents maillages int nv=0,nt=0,nbe=0; // sommet, triangles, arretes du maillage unifies //cout << "commencement du maillage " << endl; for(size_t i=0; i2) cout << "meditff :: Value of elements: vertex "<< nv << " Tet "<< nt << " triangle " << nbe << endl; Mesh3 *pTh = new Mesh3(nv,nt,nbe,v,t,b); Mesh3 &Th = *pTh; //cout << "Mesh is created" << endl; // determination of the number of elements to represent the solution int datasize; if(order == 0) datasize= nt; if(order == 1) datasize= nv; // cas de sauvegarde bool boolsave = false; int solnbfloat=0; KNM solsave(1,1); string * saveff; KN vxx,vyx,vyy,vzx,vzy,vzz; //cout << "nbsol=" << endl; if(nbsol > 0){ vxx.init(datasize); vyx.init(datasize); vyy.init(datasize); vzx.init(datasize); vzy.init(datasize); vzz.init(datasize); if( nargs[2] ){ boolsave= true; saveff = GetAny( (*nargs[2])(stack) ); int ddim = 3; for (size_t i=0;i 0){ if(filebin){ int cod = 1; int NulPos = 0; int KwdCod; fwrite( (unsigned char *) &cod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &ver, WrdSiz,1,popenstream ); KwdCod = GmfDimension; fwrite( (unsigned char *) &KwdCod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &NulPos, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &dimp, WrdSiz,1,popenstream ); } else{ fprintf(popenstream,"MeshVersionFormatted %i\n",ver); fprintf(popenstream,"Dimension %i\n",dimp); // detemination of solution // default scalaire // faire tableau pour plusieurs } typsol = TypTab[jojo]; //fprintf(popenstream,"%i %i\n",1,typsol); if(order == 0){ if(filebin){ int NulPos = 0; int KwdCod = GmfSolAtTetrahedra; int codtypjm = 1; fwrite( (unsigned char *) &KwdCod, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &NulPos, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &datasize, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &codtypjm, WrdSiz,1,popenstream ); fwrite( (unsigned char *) &typsol, WrdSiz,1,popenstream ); } else{ fprintf(popenstream,"SolAtTetrahedra\n"); fprintf(popenstream,"%i\n",datasize); fprintf(popenstream,"%i %i\n",1,typsol); } if(typsol==1){ //KN solsca(nv); MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); vxx=0.; for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); vxx[it] = l[jojo1].eval(0,stack); //GetAny< double >( (*nargs[1])(stack) ); } if(filebin){ for(int k=0; k vxx(nv),vyy(nv),vzz(nv); vxx=0.; vyy=0.; vzz=0.; MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); vxx[it] = l[jojo1].eval(0,stack); //GetAny< double >( (*xx)(stack) ); vyy[it] = l[jojo1].eval(1,stack); //GetAny< double >( (*yy)(stack) ); vzz[it] = l[jojo1].eval(2,stack); //GetAny< double >( (*zz)(stack) ); } if(filebin){ for(int k=0; k vxx(nv),vyx(nv),vyy(nv),vzx(nv),vzy(nv),vzz(nv); vxx(nv)=0.;vyx(nv)=0.;vyy(nv)=0.; vzx(nv)=0.;vzy(nv)=0.;vzz(nv)=0.; MeshPoint *mp3(MeshPointStack(stack)); R3 Cdg_hat = R3(1./4.,1./4.,1./4.); for (int it=0;itset( Th, K(Cdg_hat), Cdg_hat, K, K.lab); vxx[it] = l[jojo1].eval(0,stack); //GetAny< double >( (*tsxx)(stack) ); vyx[it] = l[jojo1].eval(1,stack); //GetAny< double >( (*tsyx)(stack) ); vyy[it] = l[jojo1].eval(2,stack); //GetAny< double >( (*tsyy)(stack) ); vzx[it] = l[jojo1].eval(3,stack); //GetAny< double >( (*tszx)(stack) ); vzy[it] = l[jojo1].eval(4,stack); //GetAny< double >( (*tszy)(stack) ); vzz[it] = l[jojo1].eval(5,stack); //GetAny< double >( (*tszz)(stack) ); } if(filebin){ for(int k=0; k solsca(nv); KN takemesh(nv); MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; vxx=0.; for (int it=0;itsetP(&Th,it,iv); vxx[i] = vxx[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*nargs[1])(stack) ); takemesh[i] = takemesh[i]+1; } } if(filebin){ for(int k=0; k vxx(nv),vyy(nv),vzz(nv); KN takemesh(nv); MeshPoint *mp3(MeshPointStack(stack)); vxx=0.; vyy=0.; vzz=0.; takemesh=0; for (int it=0;itsetP(&Th,it,iv); vxx[i] = vxx[i]+l[jojo1].eval(0,stack); //GetAny< double >( (*xx)(stack) ); vyy[i] = vyy[i]+l[jojo1].eval(1,stack); //GetAny< double >( (*yy)(stack) ); vzz[i] = vzz[i]+l[jojo1].eval(2,stack); //GetAny< double >( (*zz)(stack) ); takemesh[i] = takemesh[i]+1; //} } } if(filebin){ for(int k=0; k vxx(nv),vyx(nv),vyy(nv),vzx(nv),vzy(nv),vzz(nv); KN takemesh(nv); MeshPoint *mp3(MeshPointStack(stack)); vxx=0.; vyx=0.; vyy=0.; vzx=0.; vzy=0.; vzz=0.; takemesh=0; for (int it=0;itsetP(&Th,it,iv); vxx[i] = vxx[i] + l[jojo1].eval(0,stack); //GetAny< double >( (*tsxx)(stack) ); vyx[i] = vyx[i] + l[jojo1].eval(1,stack); //GetAny< double >( (*tsyx)(stack) ); vyy[i] = vyy[i] + l[jojo1].eval(2,stack); //GetAny< double >( (*tsyy)(stack) ); vzx[i] = vzx[i] + l[jojo1].eval(3,stack); //GetAny< double >( (*tszx)(stack) ); vzy[i] = vzy[i] + l[jojo1].eval(4,stack); //GetAny< double >( (*tszy)(stack) ); vzz[i] = vzz[i] + l[jojo1].eval(5,stack); //GetAny< double >( (*tszz)(stack) ); takemesh[i] = takemesh[i]+1; } } if(filebin){ for(int k=0; k2) cout << "writing solution in file" << endl; if(typsol==1){ writetabsol( datasize, nboftmp, vxx, solsave); nboftmp=nboftmp+1; } else if(typsol==2){ writetabsol( datasize, nboftmp, vxx, vyy, vzz, solsave); nboftmp=nboftmp+3; } else if(typsol==3){ writetabsol( datasize, nboftmp, vxx, vyx, vyy, vzx, vzy, vzz, solsave); nboftmp=nboftmp+6; } //cout << "finish writing solution in file" << endl; //cout << "datasize=" << datasize << " " << "solnbfloat=" << solnbfloat << endl; } } } delete [ ] numTht; // fermeture du stream pour popen bool wait=TheWait; if (nargs[3]) wait= GetAny((*nargs[3])(stack)); bool plotting = true; // drawing part ------------------------------ // if (wait && !NoWait) { pclose(popenstream); } /*else { fclose(popenstream); }*/ if(boolsave){ int outm; int nbtype=nbsol; float *OutSolTab = new float[solnbfloat]; if ( !(outm = GmfOpenMesh(saveff->c_str(),GmfWrite,ver,3)) ) { cerr <<" -- Mesh3::Save UNABLE TO OPEN :"<< saveff << endl; exit(1); } if(order == 0){ GmfSetKwd(outm,GmfSolAtTetrahedra, datasize, nbtype, TypTab); for (int k=0; k2) cout << " load:popen.cpp " << endl; // 2D Global.Add("medit","(",new OneOperatorCode); Global.Add("savesol","(",new OneOperatorCode ); // 3D Global.Add("medit","(",new OneOperatorCode< PopenMeditMesh3_Op >); Global.Add("savesol","(",new OneOperatorCode< datasolMesh3_Op >); Global.Add("readsol","(",new OneOperatorCode< readsol_Op >); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/meditddm.edp000644 000767 000024 00000003472 11406142255 020754 0ustar00hechtstaff000000 000000 // meditddm.edp load "medit" /******************************************** Initial Problem: Resolution of the following EDP: $- \Delta u = f$ on $\Omega =\{ (x,y) | 1 \leq sqrt(x^2+y^2) \geq 2}$ $- \Delta u = f1$ on $\Omega_{1} =\{ (x,y) | 0.5 \leq sqrt(x^2+y^2) \geq 1.}$ $u = 1$ on $\Gamma$ + Null Neumman condition on $\Gamma_{1}$ and on $\Gamma_{2}$ We find the solution $u$ in solving two EDP defined on domain $\Omega$ and $\Omega_{1}$ This solution is vizualize with ffmedit *********************************************/ verbosity=3; border Gamma(t=0,2*pi){x=cos(t); y=sin(t); label=1;}; border Gamma1(t=0,2*pi){x=2*cos(t); y=2*sin(t); label=2;}; border Gamma2(t=0,2*pi){x=0.5*cos(t); y=0.5*sin(t); label=3;}; // construction of mesh of domain $\Omega$ mesh Th=buildmesh(Gamma1(40)+Gamma(-40)); fespace Vh(Th,P2); func f=sqrt(x*x+y*y); Vh us,v; macro Grad2(us) [dx(us),dy(us)] // EOM problem Lap2dOmega(us,v,init=false)=int2d(Th)(Grad2(v)' *Grad2(us)) - int2d(Th)(f*v)+on(Gamma,us=1) ; // Resolution of EDP defined on the domain $\Omega$ // $- \Delta u = f$ on $\Omega$ // $u = 1$ on $\Gamma // + Null Neumann condition on $\Gamma_{1}$ Lap2dOmega; // construction of mesh of domain $\Omega1 =\{ (x,y) | 0.5 \leq sqrt(x^2+y^2) \geq 1.}$ mesh Th1=buildmesh(Gamma(40)+Gamma2(-40)); fespace Vh1(Th1,P2); func f1=10*sqrt(x*x+y*y); Vh1 u1,v1; macro Grad21(u1) [dx(u1),dy(u1)] // EOM problem Lap2dOmega1(u1,v1,init=false)=int2d(Th1)(Grad21(v1)' *Grad21(u1)) - int2d(Th1)(f1*v1)+on(Gamma,u1=1) ; // Resolution of EDP defined on the domain $\Omega_{1}$ // $- \Delta u = f1$ on $\Omega_{1}$ // $u = 1$ on $\Gamma$ // + Null Neumann condition on $\Gamma_{2}$ Lap2dOmega1; // vizualisation of solution of the initial problem medit("solution",Th,us,Th1,u1,order=1,meditff="ffmedit",save="testsavemedit.solb"); freefem++-3.38-1/examples++-load/metis.cpp000644 000767 000024 00000012421 12504540702 020311 0ustar00hechtstaff000000 000000 // SUMMARY : add interface with partionning library scotch // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : F. Hecht // E-MAIL : F. Hecht // date : 2009 ???? /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: metis //ff-c++-cpp-dep: // #include #include typedef KNM * pRnm; typedef KN * pRn; typedef string * pstring; extern "C" { #include } #ifdef METIS_VER_MAJOR // METIS_PartMeshDual(&ne, &nn, elmnts, &etype, &numflag, &nparts, &edgecut, epart, npart); extern "C" { real_t libmetis__ComputeElementBalance(idx_t ne, idx_t nparts, idx_t *where); } #else typedef idxtype idx_t ; #endif template KN * partmetis(Stack s,KN * const & part,Mesh * const & pTh,long const & lparts) { ffassert(pTh); const Mesh & Th(*pTh); int nt=Th.nt,nv=Th.nv; int nve = Mesh::Rd::d+1; KN eptr(nt+1),elmnts(nve*nt), epart(nt), npart(nv); for(int k=0,i=0;kresize(nt); *part=epart; return part; } KN * partmetisd(Stack s,KN * const & part,Mesh * const & pTh,long const & lparts) { ffassert(pTh); const Mesh & Th(*pTh); int nt=Th.nt,nv=Th.nv; int nve = Mesh::Element::NbV; KN elmnts(nve*nt), epart(nt), npart(nv); for(int k=0,i=0;kresize(nt); *part=epart; return part; } /* class Init { public: Init(); }; // E_F_StackF0F0 $1 */ static void Load_Init(){ if(verbosity && mpirank == 0) #ifdef METIS_VER_MAJOR cout << " lood: init metis (v " << METIS_VER_MAJOR <<" )\n"; #else cout << " lood: init metis (v 4 )\n"; #endif Global.Add("metisnodal","(",new OneOperator3_ *,KN *,Mesh *,long , E_F_stackF0F0F0_ *,KN *,Mesh *,long> >(&partmetis)); Global.Add("metisdual","(",new OneOperator3_ *,KN *,Mesh *,long , E_F_stackF0F0F0_ *,KN *,Mesh *,long> >(&partmetis)); Global.Add("metisnodal","(",new OneOperator3_ *,KN *,Mesh3 *,long , E_F_stackF0F0F0_ *,KN *,Mesh3 *,long> >(&partmetis)); Global.Add("metisdual","(",new OneOperator3_ *,KN *,Mesh3 *,long , E_F_stackF0F0F0_ *,KN *,Mesh3 *,long> >(&partmetis)); Global.Add("metisnodal","(",new OneOperator3_ *,KN *,Mesh *,long , E_F_stackF0F0F0_ *,KN *,Mesh *,long> >(&partmetis)); Global.Add("metisdual","(",new OneOperator3_ *,KN *,Mesh *,long , E_F_stackF0F0F0_ *,KN *,Mesh *,long> >(&partmetis)); Global.Add("metisnodal","(",new OneOperator3_ *,KN *,Mesh3 *,long , E_F_stackF0F0F0_ *,KN *,Mesh3 *,long> >(&partmetis)); Global.Add("metisdual","(",new OneOperator3_ *,KN *,Mesh3 *,long , E_F_stackF0F0F0_ *,KN *,Mesh3 *,long> >(&partmetis)); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/metis.edp000644 000767 000024 00000000502 11406142255 020275 0ustar00hechtstaff000000 000000 load "metis" mesh Th=square(100,100); fespace Ph(Th,P0); int[int] nupart(Th.nt); Ph part; metisnodal(nupart,Th,100); for(int i=0;i #include #include using namespace std; /* #include "error.hpp" #include "AFunction.hpp" #include "rgraph.hpp" #include "RNM.hpp" // remove problem of include #undef HAVE_LIBUMFPACK #undef HAVE_CADNA #include "MatriceCreuse_tpl.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lgmesh3.hpp" #include "problem.hpp" //#include "ellipsemax.hpp" */ #include "ff++.hpp" using namespace std; R Min (const R a,const R b); R Max (const R a,const R b); inline void Exchange (R a,R b) {R c=a;a=b;b=c;}; //const R precision = 1e-10; int LireTaille( const char * NomDuFichier,int &nbnoeuds); int Lire( const char * NomDuFichier,int n ,R2 noeuds[] ); template bool from_string( const string & Str, T & Dest ) { // crer un flux partir de la chaine donne istringstream iss( Str ); // tenter la conversion vers Dest iss >> Dest; return !Dest; }; void metrique(int nbpoints, R2 * Point,R &A, R &B,R &C,R epsilon) { C=0.; R epsilon0=1e-5,precision=1e-15,delta=1e-10; R inf =1e50; R Rmin=inf,Rmax=0.; int indiceX0=0; R2 *PPoint = new R2 [nbpoints]; for(int i=0;i0) { Point[i].x=delta; Point[i].y=sqrt(pow(Point[i].y,2)-pow(Point[i].x,2)); } } if(abs(Point[i].y)<=precision) { if(Point[i].x<0) { Point[i].y=-delta; Point[i].x=-sqrt(pow(Point[i].x,2)-pow(Point[i].y,2)); } if(Point[i].x>0) { Point[i].y=delta; Point[i].x=sqrt(pow(Point[i].x,2)-pow(Point[i].y,2)); } } //----------------------------------------------------------- assert(abs(Point[i].x*Point[i].y)>=pow(precision,2)); if(Rmin>Point[i].norme()) { indiceX0=i; Rmin=Point[i].norme(); } //cout<epsilon0); R0=r0/(r0-epsilon0); for(int i=1;iepsilon); Ri = ri/(ri-epsilon); detXY=Xi*Y0-Yi*X0; //------deplacement des points aligns avec l'origine et X0----------- if(abs(detXY)<=precision) { Xi += delta; if(Yi<0)Yi= -sqrt(pow(ri,2)- pow(Xi,2)); else Yi=sqrt(pow(ri,2)- pow(Xi,2)); Point[i].x=Xi; Point[i].y=Yi; ri=Point[i].norme(); if(ri<=epsilon)epsilon=ri*epsilon; assert(ri>epsilon); Ri = ri/(ri-epsilon); } detXY=Xi*Y0-Yi*X0; assert(abs(detXY)>=precision); //----------------------------------------------------------------- //-----racines du polynome en b minimiser---------------------------- R bb1=(1./pow(detXY,2))*(pow(X0*Ri,2)+pow(Xi*R0,2)-2.*abs(Xi*X0)*sqrt(pow(R0*Ri,2)-pow(detXY/(Rmax*(r0-epsilon0)),2))); R bb2=(1./pow(detXY,2))*(pow(X0*Ri,2)+pow(Xi*R0,2)+2.*abs(Xi*X0)*sqrt(pow(R0*Ri,2)-pow(detXY/(Rmax*(r0-epsilon0)),2))); //--fin----racines du polynome en b minimiser-------------------- bmax=Min(bb2,pow(Rmax/pow((r0),2),2)); bmin=Max(1./(Rmax*Rmax),bb1);//minoration de b R Cte = Max(1e-9,(bmax-bmin)*1e-9); bmin=bmin*(1.+Cte); bmax=bmax*(1.-Cte); //bornes de b----------------------------------------------------------- //cas: majoration de c -------------------------------------------- R Li=X0*Xi*(pow(Rmax/pow(r0-epsilon0min,2),2)-1./pow(Rmax,2))+(pow(Ri*X0,2)-pow(R0*Xi,2))/detXY; R LiXY=Xi*Y0+Yi*X0; if(abs(LiXY)>=precision) { condition=1; if(Xi*X0>0) { if(LiXY>0) bmin=Max(bmin,-Li/LiXY); else bmax=Min(bmax,-Li/LiXY); } else { if(LiXY<0) bmin=Max(bmin,-Li/LiXY); else bmax=Min(bmax,-Li/LiXY); } } else { if(Li<0) condition =0; else condition =1; } //cas minoration de c -------------------------------------------- Li=X0*Xi*(-pow(Rmax/pow(r0-epsilon0min,2),2)+1./pow(Rmax,2))+(pow(Ri*X0,2)-pow(R0*Xi,2))/detXY; LiXY=Xi*Y0+Yi*X0; if(abs(LiXY)>=precision) { condition=1; if(Xi*X0>0) { if(LiXY<0) bmin=Max(bmin,-Li/LiXY); else bmax=Min(bmax,-Li/LiXY); } else { if(LiXY>0) bmin=Max(bmin,-Li/LiXY); else bmax=Min(bmax,-Li/LiXY); } } else { if(Li>0) condition =0; else condition =1; } if (condition==1) { //--cas : minoration de a----------------------------------------------- R Gi=((Xi*Yi*R0*R0-X0*Y0*Ri*Ri)/detXY +Xi*X0/(Rmax*Rmax))/(Yi*Y0); if(Xi*X0>0) { if(Yi*Y0>0) bmin=Max(bmin,Gi); else bmax=Min(bmax,Gi); } else { if(Yi*Y0<0) bmin=Max(bmin,Gi); else bmax=Min(bmax,Gi); } //cas :majoration de a------------------------------------------------ R Hi=(Xi*X0*Rmax*Rmax/pow((r0-epsilon0min),4)+(Xi*Yi*R0*R0-X0*Y0*Ri*Ri)/detXY)/(Yi*Y0); if(Xi*X0>0) { if(Yi*Y0>0) bmax=Min(bmax,Hi); else bmin=Max(bmin,Hi); } else { if(Yi*Y0<0) bmax=Min(bmax,Hi); else bmin=Max(bmin,Hi); } //------fin bornes de b------------------------------------------------ b2=bmax; b1=bmin; for(int k=1;k=pow(precision,5)); if(abs(Bk)>precision)//non nul { if(Bk<=0) bmax=Min(bmax,Ck/Bk); else bmin=Max(bmin,Ck/Bk); if((bmaxb2)||(bmin>bmax)) { //cout<<" i = "<> buffer; if(buffer[0]=='#') { getline( f,buffer );} else{ // Lecture X Y Z de chacun des noeuds from_string( buffer,noeuds[i++].x ); f>>noeuds[i-1].y>>buffer; } } return 0; } R Min (const R a,const R b){return a < b ? a : b;} R Max (const R a,const R b){return a > b ? a : b;} // metrixkuate(Th,np,o,err,[m11,m12,m22]); class MetricKuate : public E_F0mps { public: typedef bool Result; Expression expTh; Expression expnp; Expression exphmin; Expression exphmax; Expression experr; Expression m11,m12,m22; Expression px,py; MetricKuate(const basicAC_F0 & args) { args.SetNameParam(); expTh= to(args[0]); // a the expression to get the mesh expnp= to(args[1]); // a the expression to get the mesh exphmin= to(args[2]); // a the expression to get the mesh exphmax= to(args[3]); // a the expression to get the mesh experr= to(args[4]); // a the expression to get the mesh // a array expression [ a, b] const E_Array * ma= dynamic_cast((Expression) args[5]); const E_Array * mp= dynamic_cast((Expression) args[6]); if (ma->size() != 3) CompileError("syntax: MetricKuate(Th,np,o,err,[m11,m12,m22],[xx,yy])"); if (mp->size() != 2) CompileError("syntax: MetricKuate(Th,np,o,err,[m11,m12,m22],[xx,yy])"); int err =0; m11= CastTo * >((*ma)[0]); // fist exp of the array (must be a double) m12= CastTo * >((*ma)[1]); // second exp of the array (must be a double) m22= CastTo * >((*ma)[2]); // second exp of the array (must be a double) px= CastTo((*mp)[0]); // fist exp of the array (must be a double) py= CastTo((*mp)[1]); // second exp of the array (must be a double) } ~MetricKuate() { } static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype(), atype(), atype(), atype(), atype(), atype()); } static E_F0 * f(const basicAC_F0 & args){ return new MetricKuate(args);} AnyType operator()(Stack s) const ; }; // the evaluation routine AnyType MetricKuate::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh = GetAny((*expTh)(stack)); long np= GetAny((*expnp)(stack)); double hmin= GetAny((*exphmin)(stack)); double hmax= GetAny((*exphmax)(stack)); KN *pm11,*pm12,*pm22; double *pxx,*pyy; pm11= GetAny*>((*m11)(stack)); pm22= GetAny*>((*m22)(stack)); pm12= GetAny*>((*m12)(stack)); pxx = GetAny((*px)(stack)); pyy = GetAny((*py)(stack)); ffassert(pTh); KN Pt(np); Mesh & Th (*pTh); cout << " MetricKuate " << np << " hmin = "<< hmin << " hmax = " << hmax << " nv = " << Th.nv << endl; R hmx2=1./(hmax*hmax); R hmn2=1./(hmin*hmin); ffassert(pm11->N()==Th.nv); ffassert(pm12->N()==Th.nv); ffassert(pm22->N()==Th.nv); { for (int iv=0;ivset(P.x,P.y); double m11=1,m12=0,m22=1; for(int i=0;i((*experr)(stack))); *pxx*=M_E; *pyy*=M_E; double eee = fabs(GetAny((*experr)(stack))); ee = max(ee,1e-30); eee = max(eee,1e-30); // e^p = eee/ee double p = Min(Max(log(eee)-log(ee),0.1),10); // c^p ee = 1 // c = (1/ee)^1/p double c=pow(1./ee,1./p); c = min(max(c,hmin),hmax); Pt[i].x = *pxx*c/M_E; Pt[i].y = *pyy*c/M_E; if(iv==0) { cout << Pt[i] << " ++++ " << i <<" " << t << " " << p << " c = " << R2(*pxx*c/M_E,*pyy*c/M_E) << "e= " << ee << " " << eee << " " << c << endl; } } double epsilon=1e-5; metrique(np,Pt,m11,m22,m12,epsilon); if(iv==0) cout << " ---- 11,12,22 : " << m11 << " "<< m12/2. << " "<< m22 << endl; (*pm11)[iv]=m11; (*pm12)[iv]=m12/2.;; (*pm22)[iv]=m22; } } *mp = mps; return true; } /* class Init { public: Init(); }; $1 */ static void Load_Init() { cout << "\n -- lood: init MetricKuate\n"; Global.Add("MetricKuate","(", new OneOperatorCode( )); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/MetricKuate.edp000644 000767 000024 00000006734 12167254041 021410 0ustar00hechtstaff000000 000000 load "MetricKuate" mesh Th=square(5,5,[(x-0.5)*2,(y-0.5)*2]); real x0,y0;// pour definir l'err forme n lineare en x0,y0 real coef =1; fespace Vh(Th,P1); fespace Wh(Th,P2); fespace Ph(Th,P0); real c=10; func f = tanh(c * (sin( (5 * y)) - (2 * x))) + (y * x * x) + pow( y, 3);; func fxxx = 0.16e2 * pow(0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1), 0.2e1) * pow(c, 0.3e1) - 0.32e2 * pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1) * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * pow(c, 0.3e1); func fxxy = -0.40e2 * pow(0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1), 0.2e1) * pow(c, 0.3e1) * cos( (5 * y)) + 0.80e2 * pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1) * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * pow(c, 0.3e1) * cos( (5 * y)) + 0.2e1; func fxyy = 0.100e3 * pow(0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1), 0.2e1) * pow(c, 0.3e1) * pow(cos( (5 * y)), 0.2e1) - 0.200e3 * pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1) * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * pow(c, 0.3e1) * pow(cos( (5 * y)), 0.2e1) - 0.100e3 * tanh(c * (sin( (5 * y)) - (2 * x))) * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * c * c * sin( (5 * y)); func fyyy = -0.250e3 * pow(0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1), 0.2e1) * pow(c, 0.3e1) * pow(cos( (5 * y)), 0.3e1) + 0.500e3 * pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1) * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * pow(c, 0.3e1) * pow(cos( (5 * y)), 0.3e1) + 0.750e3 * tanh(c * (sin( (5 * y)) - (2 * x))) * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * c * c * cos( (5 * y)) * sin( (5 * y)) - 0.125e3 * (0.1e1 - pow(tanh(c * (sin( (5 * y)) - (2 * x))), 0.2e1)) * c * cos( (5 * y)) + 0.6e1; /* real p=20; real p3=p-3, p321=p*(p-1)*(p-2); func f= x^p + y^p; func fxxx = p321*x; func fyyy = p321*y; func fxxy=0.; func fxyy=0.; */ func err=(fxxx*x0*x0*x0+3*fxxy*x0*x0*y0+3*fxyy*x0*y0*y0+fyyy*y0*y0*y0 )*coef; for(int i=1;i<4;i++) { Vh m11,m12,m22; coef = 1; Wh f2=f; MetricKuate(Th,200,0.0001,3,err,[m11[],m12[],m22[]],[x0,y0]); // plot(m11,m22,wait=1,cmm="mmmm"); real cc=10; Th=adaptmesh(Th,cc*m11,cc*m12,cc*m22,IsMetric=1,inquire=1,hmin=0.00001,nbvx=1000000); cout << m11[].max << " " << m12[].max << " " << m22[].max << endl; plot(Th,wait=1,ps="Th.eps"); plot(f2,wait=1); Ph eh = (abs(f2-f)); Ph leh= log10(eh); real[int] viso=[-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1]; plot(leh,fill=1,wait=1,viso=viso,value=1,ps="leh.eps"); cout << i << " .... " << eh[].min << " "<< eh[].max << " "<< eh[].sum/eh[].n << " " << int2d(Th)(eh)/Th.area << " " << Th.nt << " " << Th.nv << endl; } Th=square(5,5,[(x-0.5)*2,(y-0.5)*2]); // FFCS - regression tests real regtest; real cerr= 0.005*(0.000961606/0.000582183)^0.66; for(int i=1;i<4;i++) { Vh m11,m12,m22; coef = 1; Wh f2=f; real cc=10; Th=adaptmesh(Th,f,err=cerr,inquire=1,hmin=0.00001,nbvx=1000000); cout << m11[].max << " " << m12[].max << " " << m22[].max << endl; plot(Th,wait=1,ps="Th2.eps"); plot(f2,wait=1); Ph eh = (abs(f2-f)); Ph leh= log10(eh); real[int] viso=[-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1]; plot(leh,fill=1,wait=1,viso=viso,value=1,ps="leh2.eps"); cout << i << " .... " << eh[].min << " "<< eh[].max << " "<< eh[].sum/eh[].n << " " << int2d(Th)(eh)/Th.area << " " << Th.nt << " " << Th.nv << endl; regtest=eh[]'*eh[];//' } freefem++-3.38-1/examples++-load/MetricPk.cpp000644 000767 000024 00000045552 12466662655 020744 0ustar00hechtstaff000000 000000 // // --------------------------------------------------------------------- // $Id$ // compile and link with ff-c++ metric_Pk.cpp #include #include #include using namespace std; #include "ff++.hpp" using namespace Fem2D; #include //typedef std::vector::iterator Rptr; //typedef std::vector::const_iterator const_Rptr; //template inline A * to_ptr(std::vector::iterator it){return &*it;} //template inline const A * to_ptr(std::vector::const_iterator it){return &*it;} #include "TensorK.hpp" //the main class class MetricPk : public E_F0mps { public: static basicAC_F0::name_and_type name_param[] ; static const int n_name_param=10; Expression nargs[n_name_param];// stocker les argunments nommes typedef KN_ Result; Expression expTh; Expression expu; MetricPk(const basicAC_F0 & args) { args.SetNameParam(n_name_param,name_param,nargs);// les arguments nommes expTh= to(args[0]); // a the expression to get the mesh expu= to(args[1]); // a the expression to get the mesh /* exphmin= to(args[2]); // a the expression to get the mesh exphmax= to(args[3]); // a the expression to get the mesh experr= to(args[4]); // a the expression to get the mesh // a array expression [ a, b] const E_Array * ma= dynamic_cast((Expression) args[5]); const E_Array * mp= dynamic_cast((Expression) args[6]); if (ma->size() != 3) CompileError("syntax: MetricKuate(Th,np,o,err,[m11,m12,m22],[xx,yy])"); if (mp->size() != 2) CompileError("syntax: MetricKuate(Th,np,o,err,[m11,m12,m22],[xx,yy])"); int err =0; m11= CastTo * >((*ma)[0]); // fist exp of the array (must be a double) m12= CastTo * >((*ma)[1]); // second exp of the array (must be a double) m22= CastTo * >((*ma)[2]); // second exp of the array (must be a double) px= CastTo((*mp)[0]); // fist exp of the array (must be a double) py= CastTo((*mp)[1]); // second exp of the array (must be a double) */ } double arg(int i,Stack stack,double a) const { return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack,bool a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KN * arg(int i,Stack stack,KN * a) const{ return nargs[i] ? GetAny *>( (*nargs[i])(stack) ): a;} ~MetricPk(){} static ArrayOfaType typeargs() { return ArrayOfaType( atype(), atype());; } static E_F0 * f(const basicAC_F0 & args){ return new MetricPk(args);} AnyType operator()(Stack s) const ;// la vraie fonction qui fait faire le boulot }; basicAC_F0::name_and_type MetricPk::name_param[MetricPk::n_name_param] = { { "kDeg", &typeid(long)}, { "rDeg", &typeid(long)}, { "iterJacobiDeriv", &typeid(long)}, { "iterJacobiMetric", &typeid(long)}, { "Derivatives", &typeid(KN*)}, { "rmax", &typeid(double)}, { "mass", &typeid(double)}, { "TriangulationType", &typeid(long)}, { "MetricType", &typeid(long)}, { "pExp", &typeid(double)} }; AnyType MetricPk:: operator()(Stack stack) const { /************* rcupration des arguments ****************/ const long k_deg= arg(0,stack,2L); // Finite element of degree k_deg will be used for approximation. const long m_deg=k_deg+1; // Derivatives of degree m_deg = k_deg+1 will be estimated. const long m_dim=m_deg+1; // The description of these derivatives requires m_dim = m_deg+1 coefficients. const long nDOFt=((k_deg+1)*(k_deg+2))/2; // Number of Lagrange points on each triangle. const long r_deg= arg(1,stack,1L); // The function is approximated in the W^r,p Sobolev semi-norm. const double p_exp = arg(9,stack,2.); const long iterJacobiDeriv = arg(2,stack,3L); // The derivatives are slightly smoothed before use. const long iterJacobiMetric = arg(3,stack,3L); // The riemannian metric is slightly smoothed before being returned. const double rmax=arg(5,stack,1.); //Not used yet. (Lower bound for the metric) const double mass=arg(6,stack,1000.); // Mass of the metric returned, i.e. mass = int sqrt(det M). // In practice, bamg produces a mesh with nt=2*mass elements. const TensorK::triangulation_type ttype = TensorK::triangulation_type(arg(7,stack,long(0))); // Type of triangulation on which approx will be done. const TensorK::which_matrix wmat = TensorK::which_matrix(arg(8,stack,long(1))); // Type of metric. Do not change. TensorK tk(m_deg, r_deg, ttype, wmat, p_exp); cout << "Approximation of " << r_deg << "th derivatives using finite elements of degree " << k_deg << ", in the L^" << p_exp << " norm.\n"; cout << "Triangulation type : " << ttype << "; Graded=0, Quasi_Acute(refined)=1, Quasi_Acute_Unrefined=2, Quasi_Acute_Proved(refined)=3" << endl; //cout << "Metric type : " << wmat << "M0_alone=0, M1_alone=1, M0_M1_weighted_sum=2" << endl; Mesh * pTh = GetAny((*expTh)(stack)); ffassert(pTh); const Mesh & Th= *pTh; /************ initialisations ***************/ //the metric const int nv = Th.nv; KN * pMetric=new KN(nv*3); KN & metric= * pMetric; metric=0.; if(!tk.is_valid){ cout << "Error : Unsupported parameters for MetricPk!\n"; Add2StackOfPtr2Free(stack,pMetric); return SetAny > (metric); //identically zero metric is returned in case of error } //Lagrange points. const R2 QLagrange[5][15]={ {R2(1./3.,1./3.)}, //k_deg=0, barycenter. {R2(0,0),R2(1,0),R2(0,1)}, {R2(0,0),R2(1,0),R2(0,1),R2(0.5,0.5),R2(0,0.5),R2(0.5,0)}, {R2(0,0),R2(1,0),R2(0,1),R2(2./3.,1./3.),R2(1./3.,2./3.),R2(0,2./3.),R2(0,1./3.),R2(1./3.,0),R2(2./3.,0),R2(1/3.,1/3.)}, {R2(0,0),R2(1,0),R2(0,1),R2(3./4.,1./4.),R2(1./2.,1./2.),R2(1./4.,3./4.),R2(0.,3./4.),R2(0.,1./2.),R2(0.,1./4.),R2(1./4.,0),R2(1./2.,0),R2(3./4.,0), R2(1./4.,1./2.),R2(1./2.,1./4.),R2(1./4.,1./4.)} }; std::vector aires; aires.resize(nv); //area of the "cell" surrounding a point std::vector Deriv; Deriv.resize(m_dim*nv); //estimate of the derivatives at a point std::vector DOFt; DOFt.resize(nDOFt); //degrees of freedom on a triangle //le bord //Th.ElementAdj(k,ie); renvoie k', crase ie par ie'; // is frontiere k' <0 ou k'==k //Seg //BoundaryElement (+rcent) //Th.nbe ou Th.neb //Th.be(i) Th.be(i)[0] ou Th.be(i)[1] std::vector nextv; nextv.resize(nv); fill(nextv.begin(), nextv.end(), -1); for(int i=0; iset(Point.x,Point.y); DOFt[dof]= GetAny((*expu)(stack)); } double f[m_deg]; //contains the derivatives of order switch(m_deg){ case 2:{ //accolades ncessaires pour dclarer des variables dans un case double f[2]; tk.getDerivatives(DOFt,invHauteur,f); //f={fx,fy} for(int j=0; j<3; ++j){ const int s= Th(i,j); //le sommet j du triangle i Deriv[m_dim*s+0]+= aire* f[0]*invHauteur[j].x; //contribution l'estimation des drives secondes. Deriv[m_dim*s+1]+= aire*(f[0]*invHauteur[j].y/2.+f[1]*invHauteur[j].x/2.); Deriv[m_dim*s+2]+= aire* f[1]*invHauteur[j].y; aires[s]+=aire; } break; } case 3:{ double f[3]; tk.getDerivatives(DOFt,invHauteur,f); //f={fxx,fxy,fyy} for(int j=0; j<3; ++j){ const int s= Th(i,j); Deriv[m_dim*s+0]+= aire*f[0]*invHauteur[j].x; //contribution l'estimation des drives troisimes. Deriv[m_dim*s+1]+= aire*(f[0]*invHauteur[j].y/3.+f[1]*invHauteur[j].x*2./3.); Deriv[m_dim*s+2]+= aire*(f[2]*invHauteur[j].x/3.+f[1]*invHauteur[j].y*2./3.); Deriv[m_dim*s+3]+= aire*f[2]*invHauteur[j].y; aires[s]+=aire; } break; } case 4:{ double f[4]; tk.getDerivatives(DOFt,invHauteur,f); //f={fxxx,fxxy,fxyy,fyyy} for(int j=0; j<3; ++j){ const int s= Th(i,j); Deriv[m_dim*s+0]+= f[0]*invHauteur[j].x*aire; //contribution l'estimation des drives quatrimes. Deriv[m_dim*s+1]+= (f[0]*invHauteur[j].y/4. +f[1]*invHauteur[j].x*3./4.)*aire; Deriv[m_dim*s+2]+= (f[1]*invHauteur[j].y/2. +f[2]*invHauteur[j].x/2.)*aire; Deriv[m_dim*s+3]+= (f[2]*invHauteur[j].y*3./4.+f[3]*invHauteur[j].x/4.)*aire; Deriv[m_dim*s+4]+= f[3]*invHauteur[j].y*aire; aires[s]+=aire; } break; } case 5:{ double f[5]; tk.getDerivatives(DOFt,invHauteur,f); //f={fxxxx,fxxxy,fxxyy,fxyyy,fyyyy} for(int j=0; j<3; ++j){ const int s= Th(i,j); Deriv[m_dim*s+0]+= f[0]*invHauteur[j].x*aire; //contribution l'estimation des drives quatrimes. Deriv[m_dim*s+1]+= (f[0]*invHauteur[j].y/5.+f[1]*invHauteur[j].x*4./5.)*aire; Deriv[m_dim*s+2]+= (f[1]*invHauteur[j].y*2./5.+f[2]*invHauteur[j].x*3./5.)*aire; Deriv[m_dim*s+3]+= (f[2]*invHauteur[j].y*3./5.+f[3]*invHauteur[j].x*2./5.)*aire; Deriv[m_dim*s+4]+= (f[3]*invHauteur[j].y*4./5.+f[4]*invHauteur[j].x/5.)*aire; Deriv[m_dim*s+5]+= f[4]*invHauteur[j].y*aire; aires[s]+=aire; } } //case m_deg==5 } //switch m_deg } //for i triangle for(int i=0; i connectivity; // this is probably already computed by FreeFem. Where ? vector > dist; //(distance,number) set computed; for(int i=0; i(u,v)); connectivity.insert(pair(v,u)); connectivity.insert(pair(v,w)); connectivity.insert(pair(w,v)); connectivity.insert(pair(w,u)); connectivity.insert(pair(u,w)); if(nextv[u]==-1 && computed.insert(u).second==true) dist.push_back(pair(u,0)); if(nextv[v]==-1 && computed.insert(v).second==true) dist.push_back(pair(v,0)); if(nextv[w]==-1 && computed.insert(w).second==true) dist.push_back(pair(w,0)); } for(int i=0; i::iterator, multimap::iterator> ret = connectivity.equal_range(u); for(multimap::iterator it=ret.first; it!=ret.second; ++it){ const int v=it->second; if(computed.insert(v).second) dist.push_back(pair(v,du+1)); } } map dist_sorted; dist_sorted.insert(dist.begin(), dist.end()); for(int i=0; i::iterator, multimap::iterator> neighbors = connectivity.equal_range(u); int closer_neighbors=0; for(multimap::iterator it=neighbors.first; it!=neighbors.second; ++it){ const int v=it->second; const int dv=dist_sorted.find(v)->second; if(du!=dv+1) continue; closer_neighbors++; for(int k=0; k cardNeighbors; cardNeighbors.resize(nv); for(int i=0; i DerivNew; DerivNew.resize(m_dim*nv); for(int r=0; r * pDerivRes= arg(4,stack,(KN *)0); if(pDerivRes){ ffassert( pDerivRes->N()== m_dim*nv); KN &DerivRes = *pDerivRes; for(int i=0; i ih_metric; ih_metric.resize(3*nv); for(int i=0; i ih_metricNew; ih_metricNew.resize(3*nv); for(int r=0; r > (metric); /* //example by F.Hecht for( int k=0;kset(Pi.x,Pi.y); R uP= GetAny((*expu)(stack)); cout << Pi << " " << uP << endl; if(i<3) { int s= Th(k,i); // le sommet i du triangle k. metric[3*s+0] =uP; metric[3*s+1] =uP+1; metric[3*s+2] =uP+3; } } } */ } /* class Init { public: Init(); }; Init init;*/ static void Load_Init() { cout << "\n -- lood: init MetricPk\n"; Global.Add("MetricPk","(", new OneOperatorCode( )); } LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/mmg3d-v4.0.cpp000644 000767 000024 00000025411 12466661714 020705 0ustar00hechtstaff000000 000000 // ORIG-DATE: Fev 2010 // -*- Mode : c++ -*- // // SUMMARY : liaison medit freefem++ : adaptmesh in 3d // USAGE : LGPL // ORG : LJLL Universite Pierre et Marie Curie, Paris, FRANCE // AUTHOR : Jacques Morice // Modif : F. hecht : Frederic.hecht@upmc.fr // E-MAIL : jacques.morice@ann.jussieu.fr // // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: mmg3d-v4 //ff-c++-cpp-dep: // /* This file is part of Freefem++ Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. Freefem++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Thank to the ARN () FF2A3 grant ref:ANR-07-CIS7-002-01 */ // ./ff-c++ mmg3dv4.cpp -I../download/include/mmg3d/ -lmmg3d4 #include "ff++.hpp" #include "msh3.hpp" //#define ADAPTLIBRARY" #include "dataff.h" using namespace Fem2D; //using namespace mmg3d; inline void add2(int *k,int n, int a) { for (int i=0;inv = nnv; pTh->nt = nnt; pTh->nbe =nnbe; pTh->vertices = vv; pTh->elements = tt; pTh->borderelements = bb; pTh->mes=0.; pTh->mesb=0.; dff->mesh= pTh; if(verbosity>5) cout << " Set_mesh nv=" << nnv << " nTet " << nnt<< " NTria " <mesh; Th.mes=0.; Th.mesb=0.; for (int i=0;i5) cout << "end_mesh: Th.mes = " << Th.mes << " Th.mesb = " << Th.mesb << endl; if(Th.nt > 0){ Th.BuildAdj(); Th.Buildbnormalv(); Th.BuildjElementConteningVertex(); } // end add if(verbosity>1) cout << " -- End of Construct mesh3: mesure = " << Th.mes << " border mesure " << Th.mesb << endl; ffassert(Th.mes>=0); // add F. Hecht sep 2009. } void set_v(void *dataff,int i,double *xyz,int lab) { i--; DataFF *dff=(DataFF *) dataff; ffassert(dff->mesh); Mesh3 & Th= * (Mesh3 *) dff->mesh; Th.vertices[i].x = xyz[0]; Th.vertices[i].y = xyz[1]; Th.vertices[i].z = xyz[2]; Th.vertices[i].lab = lab; if(verbosity>10) cout << " set_v3 " <mesh); Mesh3 & Th= *(Mesh3 *) dff->mesh; if( id == 2) { n=3; Mesh3::BorderElement & K(Th.be(i)); add2(k,3,-1); K.set(Th.vertices,k,lab); } else if ( id== 3) { n=4; Mesh3::Element & K(Th.t(i)); add2(k,4,-1); K.set(Th.vertices,k,lab); } else { cout << " unknows id = " << id << " not 2 or 3 " << endl; ffassert(0); } if(verbosity>10) { cout << " set_ele"<< n << " " <5); for(int i=0;imesh); Mesh3 & Th= *(Mesh3*) dff->mesh; data[ff_id_vertex]= Th.nv; data[ff_id_tria]= Th.nbe; data[ff_id_tet]= Th.nt; if(verbosity>9) cout << " get_mesh " << Th.nv << " "<< Th.nbe << " "<< Th.nt << endl; } void get_v3(void *dataff,int i,double *xyz,int *lab) { i--; DataFF *dff=(DataFF *) dataff; ffassert(dff->mesh); Mesh3 & Th= *(Mesh3*) dff->mesh; xyz[0] = Th.vertices[i].x ; xyz[1] = Th.vertices[i].y ; xyz[2] = Th.vertices[i].z ; *lab = Th.vertices[i].lab ; if(verbosity>10) cout << " get_v3 " <mesh); Mesh3 & Th= *(Mesh3*)dff->mesh; int n =0; if( id == 2) { n=3; Mesh3::BorderElement & K(Th.be(i)); for (int j=0; j10) { cout << " get_ele"<< n << " " < karg(int i,Stack stack) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): KN_((long*) 0,0L) ;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} string arg(int i,Stack stack,const char * a ) const{ return nargs[i] ? *GetAny< string * >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: mmg3d_Op(const basicAC_F0 & args ,Expression tth) : eTh(tth),xx(0),yy(0),zz(0) { if(verbosity >1) cout << "mmg3d v4 "<< endl; args.SetNameParam(n_name_param,name_param,nargs); const E_Array * a1=0 ; if(nargs[1]) a1 = dynamic_cast(nargs[1]); if(a1) { if(a1->size() !=3) CompileError("mmg3d(Th,displacement=[X,Y,Z],) "); xx=to( (*a1)[0]); yy=to( (*a1)[1]); zz=to( (*a1)[2]); } else if ( nargs[1] ) CompileError("mmg3d(Th,displacement=[X,Y,Z], .... ) "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type mmg3d_Op::name_param[]= { { "metric", &typeid(KN *)}, // 0 { "displacement", &typeid(E_Array)}, // 1 { "displVect", &typeid(KN_)}, // 2 { "opt", &typeid(string*)}, // 3 { "Mb",&typeid(long)} // 4 }; class mmg3d_ff : public OneOperator { public: mmg3d_ff() : OneOperator( atype(), atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new mmg3d_Op( args,t[0]->CastTo(args[0]) ); } }; AnyType mmg3d_Op::operator()(Stack stack) const { // initialisation MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); ffassert( pTh ); Mesh3 &Th3=*pTh; string sarg= arg(3,stack,""); DataFF dff; dff.memory= arg(4,stack,128L); // 128 Mb .. ???? ffassert( dff.memory < 2048 );// 2 GiGa bytes limite of integer .. dff.typesol=0; dff.np=pTh->nv; dff.mesh=pTh; dff.meshname="Th"; dff.imprim=verbosity; dff.sol=0; dff.mov=0; dff.set_mesh =set_mesh; dff.end_mesh =end_mesh; dff.set_v = set_v; dff.set_elmt = set_elmt; dff.get_mesh = get_mesh; dff.get_v3 = get_v3; dff.get_elmt= get_elmt; KN *pmetric=0; if( nargs[0] ){ pmetric = GetAny< KN *>( (*nargs[0])(stack) ); ffassert(pmetric) ; } KN cmetric; if(pmetric) { int m=pmetric->N(); if( m == Th3.nv*6) // { cmetric = (*pmetric); dff.typesol=6; dff.np = Th3.nv; for(int i=0;i Moving(0); if( nargs[1] || nargs[2] ){ BoolMoving=1; if( nargs[2] ){ Moving = GetAny( (*nargs[2])(stack) ); assert( Moving.N() == 3*Th3.nv ); dff.movename="move"; dff.mov = Moving; if( Moving.N() != 3*Th3.nv ){ cerr << " Displacement vector is of size 3*Th.nv" << endl; ExecError(" mmg3d v4");} } else{ MeshPoint *mp3(MeshPointStack(stack)); Moving.resize(3*Th3.nv); for( int i=0; iset( Th3.vertices[i].x, Th3.vertices[i].y, Th3.vertices[i].z ); if(xx) Moving[3*i] = GetAny((*xx)(stack)); if(yy) Moving[3*i+1] = GetAny((*yy)(stack)); if(zz) Moving[3*i+2] = GetAny((*zz)(stack)); } dff.mov = Moving; dff.movename="move"; } //if(verbosity > 2) if(verbosity >2) cout << "displacement vector is loading" << endl; } int argc=1; char * argv[1000]; char ff[10]="ff++"; KN args(sarg.size()+1); argv[0] = ff; argv[1] = & args[0]; strcpy(args, sarg.c_str()); //cout << sarg << " == " << &args[0] << endl; char cc='\0'; for(int i=0;i 0){ dff.mesh=0; cout << " problem of remeshing with mmg3d :: error" << res << endl; } if(! pTh3 ){ cout << " problem of remeshing with mmg3d v 4 (no mesh) :: error" << res << endl; ExecError(" Error mmg3d" );} else { // end build of TH3... if(verbosity > 10) cout << "buildGtree" << endl; pTh3->BuildGTree(); } *mp=mps; Add2StackOfPtr2FreeRC(stack,pTh3); return pTh3; } /* class Init1 { public: Init1(); }; $1 */ static void Load_Init(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ //if (verbosity) if(verbosity) cout << " load: mmg3d " << endl; Global.Add("mmg3d","(",new mmg3d_ff); } #define WITH_NO_INIT #include "msh3.hpp" LOADFUNC(Load_Init) freefem++-3.38-1/examples++-load/Morley.cpp000644 000767 000024 00000017643 12262537572 020466 0ustar00hechtstaff000000 000000 // MORLEY FINITE ELEMENT // F. Hecht december 2005 // ---------------------------- // the Polynomial space is $P2$, an the degree of freedom are // the 3 values a the 3 vertices and the three // normal derivative at the middle at the tree the edges // remark; // to compute the interpolante, we need // the value , plus the value of the normal derivative // so I use the following hack, I say the is a tree dim vectorial // finite element with give the value, x derivative ,and the y derivative // Ref: chapter VII section 50 fig 50.2 of // Ciarlet, HandBook of Numerical Analysis, Volume II Finite elemet methodes (parts 1), // NORTH-HOLLAND // ----------------------- related files: // to check and validate : testFEMorlay.edp // to get a real example : bilapMorley.edp // ------------------------------------------------------------ #include "ff++.hpp" #include "AddNewFE.h" // #include "problem.hpp" namespace Fem2D { // ------ P2 Morley class TypeOfFE_P2Morley : public TypeOfFE { public: static int Data[]; // double Pi_h_coef[]; TypeOfFE_P2Morley(): TypeOfFE(3+3+0, 3,// hack u, u_x, u_y for interpolation Data, 2, 1, 3+6, // nb coef to build interpolation 6, // np point to build interpolation 0) { const double gauss1=(1.-sqrt(1./3.))/2; const double gauss2=1.-gauss1; const R2 Pt[] = { R2(0,0),R2(1,0),R2(0,1),R2(0.5,0.5), R2(0,0.5),R2(0.5,0)}; // for the 3 vertices 6 coef int kk=0; for (int p=0;p<3;p++) { P_Pi_h[p]=Pt[p]; pij_alpha[kk]= IPJ(kk,p,0); kk++; } // for int p=3; for (int e=0;e<3;++e) { // point d'integration sur l'arete e P_Pi_h[p]= Pt[p]; // cout <<"\n" << p << " -- " << P_Pi_h[p] << " :: " << A << " " << B << endl; pij_alpha[kk++]= IPJ(3+e,p,1); // coef = 0.5* l_e *ne_x * sge pij_alpha[kk++]= IPJ(3+e,p,2); // coef = 0.5* l_e *ne_y * sge p++; } assert(P_Pi_h.N()==p); assert(pij_alpha.N()==kk); } void FB(const bool * whatd, const Mesh & Th,const Triangle & K,const R2 &P, RNMK_ & val) const; void Pi_h_alpha(const baseFElement & K,KN_ & v) const; } ; // on what nu df on node node of df int TypeOfFE_P2Morley::Data[]={ 0,1,2, 3,4,5, 0,0,0, 0,0,0, 0,1,2, 3,4,5, 0,0,0, 0,0,0, 0,1,2, 3,4,5, 0,0,0, 0,0,0, 6,6,6 }; void TypeOfFE_P2Morley::Pi_h_alpha(const baseFElement & K,KN_ & v) const { const Triangle & T(K.T); int k=0; // coef pour les 3 sommets fois le 2 composantes for (int i=0;i<3;i++) v[k++]=1; // integration sur les aretes for (int i=0;i<3;i++) { R2 N(T.Edge(i).perp()); N *= T.EdgeOrientation(i); v[k++]= N.x; v[k++]= N.y; } } void TypeOfFE_P2Morley::FB(const bool * whatd,const Mesh & ,const Triangle & K,const R2 & P,RNMK_ & val) const { typedef double R; R2 A(K[0]), B(K[1]),C(K[2]); R l0=1-P.x-P.y,l1=P.x,l2=P.y; R2 Dl[3]= {K.H(0), K.H(1), K.H(2) }; R2 E[3]={ K.Edge(0),K.Edge(1),K.Edge(2)}; // double l2E[3]={ (E[0],E[0]), (E[1],E[1]), (E[2],E[2]) }; // double lE[3]={ sqrt(l2E[0]), sqrt(l2E[1]), sqrt(l2E[2]) }; double sgE[3]={ K.EdgeOrientation(0), K.EdgeOrientation(1), K.EdgeOrientation(2)}; // $ w_{3+i} = ccc[i] * ( li-2*li*li) $ // donc $ D(w_i) = ccc[i] (1-2*li) Dl[i] $ // we must have $$ int_{e_i} dn(w_{3+j) ) = \delta_{ij} $ // $int_e_i dn(w_{3+i} ) = ccc[i] (Dl[i],Ne[i]) = 1 $ // $ ccc[i] = 1/ (Dl[i],Ne[i]) $ R2 Ne[3]= { E[0].perp() *sgE[0], E[1].perp() *sgE[1], E[2].perp() *sgE[2] }; double ccc[] = { 1./(Dl[0],Ne[0]), 1./(Dl[1],Ne[1]), 1./(Dl[2],Ne[2]) }; R l3=(l0-l0*l0)*ccc[0]; R l4=(l1-l1*l1)*ccc[1]; R l5=(l2-l2*l2)*ccc[2]; R dl3=(1-2*l0)*ccc[0]; R dl4=(1-2*l1)*ccc[1]; R dl5=(1-2*l2)*ccc[2]; // cout << l0 << " " << l1 << " " << l2 << " " << l3 << " " << l4 << " " << l5 ; KN wd(KN_(whatd,last_operatortype)); KN wd_op(last_operatortype),wd_j(last_operatortype); wd_j=0; wd_op=-1; if (whatd[op_id]) {wd[op_dx ]=wd[op_dy ]=true; wd_op[op_dx ]=wd_op[op_dy ]=op_id; wd_j[op_dx ]=1;wd_j[op_dy ]=2;} if (whatd[op_dx]) {wd[op_dxx]=wd[op_dxy]=true; wd_op[op_dxx]=wd_op[op_dxy]=op_dx; wd_j[op_dxx]=1;wd_j[op_dxy]=2;} if (whatd[op_dy]) {wd[op_dyy]=wd[op_dxy]=true; wd_op[op_dxy]=wd_op[op_dyy]=op_dy; wd_j[op_dxy]=1;wd_j[op_dyy]=2;} // on previligie les originaux for (int i=0; i< last_operatortype ; ++i) if (whatd[i]) { wd_op[i]=i; wd_j[i]=0;} val=0; throwassert( val.N()>=6); throwassert(val.M()==3); val=0; if (wd[op_id]) { RN_ f(val('.',0,op_id)); f[0] = l0; f[1] = l1; f[2] = l2; // remark \int_O \Delta u = \int_G \dn(u) // \Delta l1^2 = Div ( 2 l1 \nalba l1) = 2 (\nalba l1,\nalba l1) f[3] = l3 ; // (1-2 lO) \nabla l0 f[4] = l4 ; f[5] = l5 ; } if (wd[op_dx]) { RN_ fx(val('.',wd_j[op_dx],wd_op[op_dx])); fx[0] = Dl[0].x; fx[1] = Dl[1].x; fx[2] = Dl[2].x; fx[3] = dl3*Dl[0].x; fx[4] = dl4*Dl[1].x; fx[5] = dl5*Dl[2].x; } if (wd[op_dy]) { // RN_ fy(val('.',0,op_dy)); RN_ fy(val('.',wd_j[op_dy],wd_op[op_dy])); fy[0] = Dl[0].y; fy[1] = Dl[1].y; fy[2] = Dl[2].y; fy[3] = dl3*Dl[0].y; fy[4] = dl4*Dl[1].y; fy[5] = dl5*Dl[2].y; } if (wd[op_dxx]) { // RN_ fxx(val('.',0,op_dxx)); RN_ fxx(val('.',wd_j[op_dxx],wd_op[op_dxx])); fxx[3] = Dl[0].x*Dl[0].x*ccc[0]*-2.; fxx[4] = Dl[1].x*Dl[1].x*ccc[1]*-2.; fxx[5] = Dl[2].x*Dl[2].x*ccc[2]*-2.; } if (wd[op_dyy]) { //RN_ fyy(val('.',0,op_dyy)); RN_ fyy(val('.',wd_j[op_dyy],wd_op[op_dyy])); fyy[3] = Dl[0].y*Dl[0].y*ccc[0]*-2.; fyy[4] = Dl[1].y*Dl[1].y*ccc[1]*-2.; fyy[5] = Dl[2].y*Dl[2].y*ccc[2]*-2.; } if (wd[op_dxy]) { assert(val.K()>wd_op[op_dxy]); // RN_ fxy(val('.',0,op_dxy)); RN_ fxy(val('.',wd_j[op_dxy],wd_op[op_dxy])); fxy[3] = Dl[0].x*Dl[0].y*ccc[0]*-2.; fxy[4] = Dl[1].x*Dl[1].y*ccc[1]*-2.; fxy[5] = Dl[2].x*Dl[2].y*ccc[2]*-2.; } { int vop[last_operatortype], nop=0; for (int j=0;jBuildBound(); // Th3_t->BuildAdj(); // Th3_t->Buildbnormalv(); // Th3_t->BuildjElementConteningVertex(); // is now in the constructor of Mesh3 to be consistante. // #ifndef WITH_NO_INIT #include "ff++.hpp" #endif #include "AFunction_ext.hpp" // TransfoMesh_v2.cpp using namespace std; // LayerMesh.cpp // buildlayer.cpp // trunc3d.cpp // rajout global #include #include #include "msh3.hpp" #include "splitsimplex.hpp" using namespace Fem2D; int ChangeLab3D(const map & m,int lab); void TestSameVertexMesh3( const Mesh3 & Th3, const double & hseuil, const R3 & Psup, const R3 &Pinf, int & nv_t, int *Numero_Som){ Vertex3 *v=new Vertex3[Th3.nv]; nv_t=0; EF23::GTree *gtree = new EF23::GTree(v,Pinf,Psup,0); // creation of octree for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ v[nv_t].x = vi.x; v[nv_t].y = vi.y; v[nv_t].z = vi.z; v[nv_t].lab = Th3.vertices[ii].lab; // lab mis a zero par default Numero_Som[ii] = nv_t; gtree->Add( v[nv_t] ); nv_t=nv_t+1; } else{ Numero_Som[ii] = pvi-v; } } delete gtree; delete [] v; } void TestSameTetrahedraMesh3( const Mesh3 & Th3, const double & hseuil, const R3 & Psup, const R3 &Pinf, int & nt_t ){ Vertex3 *vt=new Vertex3[Th3.nt]; EF23::GTree *gtree_t = new EF23::GTree(vt,Pinf,Psup,0); nt_t=0; // creation of octree for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ vt[nt_t].x = vi.x; vt[nt_t].y = vi.y; vt[nt_t].z = vi.z; vt[nt_t].lab = K.lab ; // lab mis a zero par default gtree_t->Add( vt[nt_t] ); nt_t=nt_t+1; } } delete gtree_t; delete [] vt; } void TestSameTetrahedraMesh3( const Mesh3 & Th3, const double & hseuil, const R3 & Psup, const R3 &Pinf, int *Elem_ok, int & nt_t ){ Vertex3 *vt=new Vertex3[Th3.nt]; EF23::GTree *gtree_t = new EF23::GTree(vt,Pinf,Psup,0); nt_t=0; // creation of octree for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ vt[nt_t].x = vi.x; vt[nt_t].y = vi.y; vt[nt_t].z = vi.z; vt[nt_t].lab = K.lab ; // lab mis a zero par default gtree_t->Add( vt[nt_t] ); nt_t=nt_t+1; } else{ Elem_ok[ii]=0; } } delete gtree_t; delete [] vt; } void TestSameTriangleMesh3( const Mesh3 & Th3, const double & hseuil, const R3 & Psup, const R3 &Pinf, int & nbe_t){ Vertex3 *vbe= new Vertex3[Th3.nbe]; EF23::GTree *gtree_be = new EF23::GTree(vbe,Pinf,Psup,0); nbe_t=0; // creation of octree for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ vbe[nbe_t].x = vi.x; vbe[nbe_t].y = vi.y; vbe[nbe_t].z = vi.z; vbe[nbe_t].lab = K.lab ; // lab mis a zero par default gtree_be->Add( vbe[nbe_t] ); nbe_t=nbe_t+1; } } delete gtree_be; delete [] vbe; } void TestSameTriangleMesh3( const Mesh3 & Th3, const double & hseuil, const R3 & Psup, const R3 &Pinf, int *Border_ok ,int & nbe_t ){ Vertex3 *vbe=new Vertex3 [Th3.nbe]; EF23::GTree *gtree_be = new EF23::GTree(vbe,Pinf,Psup,0); nbe_t=0; // creation of octree for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ vbe[nbe_t].x = vi.x; vbe[nbe_t].y = vi.y; vbe[nbe_t].z = vi.z; vbe[nbe_t].lab = K.lab ; // lab mis a zero par default gtree_be->Add( vbe[nbe_t] ); nbe_t=nbe_t+1; } else{ if(K.lab == vbe[pvi-vbe].lab ) Border_ok[ii] = 0; } } delete gtree_be; delete [] vbe; } int TestElementMesh3( const Mesh3 & Th3 ) // Test si le maillage des lments communs : Sommet, triangle, ... { // FH 31/09/2009: Change int* to KN to remove pb of missing free in some case R3 Pinf(1e100,1e100,1e100),Psup(-1e100,-1e100,-1e100); // Extremit de la bote englobante double hmin=1e10; // longueur minimal des arrtes double hseuil; KN Numero_Som(Th3.nv); int nv_t,nt_t,nbe_t; // calcul de la boite englobante for (int ii=0;ii 1) cout << " - hmin =" << hmin << " , Bounding Box: " << Pinf << " "<< Psup << endl; ffassert(hmin>Norme2(Psup-Pinf)/1e9); // determination du nombre de sommets confondus hseuil = hmin/10.; if(verbosity >1) cout << "TestSameVertexMesh3 " << hseuil << " size" <1) cout << "hseuil=" << hseuil << endl; if(verbosity >1) cout << "NbVertexRecollement " << nv_t << " / " << "NbVertex(anc)" << Th3.nv < Elem_ok(Th3.nt); int i_elem=0; for(int ii=0; ii< Th3.nt; ii++){ const Tet & K(Th3.elements[ii]); int iv[4]; Elem_ok[ii] = 1; for(int jj=0; jj <4; jj++){ iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; } for(int jj=0; jj<4; jj++){ for(int kk=jj+1; kk<4; kk++){ if( iv[jj]==iv[kk] ){ Elem_ok[ii] = 0; } } } i_elem = i_elem + Elem_ok[ii]; } if( i_elem != Th3.nt ){ cout << "There are a false tetrahedra in the mesh" << endl; assert( i_elem == Th3.nt); } KN Border_ok(Th3.nbe); int i_border= 0; for( int ii=0; ii< Th3.nbe; ii++){ Border_ok[ii]=1; const Triangle3 & K(Th3.be(ii)); int iv[3]; for(int jj=0; jj <3; jj++){ iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; assert( iv[jj] >= 0 && iv[jj] < nv_t); } for(int jj=0; jj<3; jj++){ for(int kk=jj+1; kk<3; kk++){ if( iv[jj]==iv[kk] ) Border_ok[ii]=0; } } i_border = i_border + Border_ok[ii]; } if( i_border != Th3.nbe){ cout << "There are a false tetrahedra in the mesh" << endl; assert( i_elem == Th3.nt); } /* determination du nombre de tetrahedre confondus */ hseuil = hmin/10.; hseuil = hseuil/4.; if(verbosity >1) cout << "TestSameTetrahedraMesh3 " << hseuil << " size "<< Th3.nt <1) cout << "hseuil=" << hseuil << endl; if(verbosity >1) cout << "NbTetrahedraRecollement " << nt_t << " / " << "NbVertex(anc)" << Th3.nt <1) cout << "TestSameTriangleMesh3 " << hseuil << endl; TestSameTriangleMesh3( Th3, hseuil, Psup, Pinf, Border_ok, nbe_t ); if(verbosity >1) cout << "hseuil=" << hseuil << endl; if(verbosity >1) cout << "NbVertexRecollement " << nbe_t << " / " << "NbVertex(anc)" << Th3.nbe < 1) cout << " - hmin =" << hmin << " , Bounding Box: " << Pinf << " "<< Psup << endl; ffassert(hmin>Norme2(Psup-Pinf)/1e9); // determination du nombre de sommets confondus hseuil = hmin/10.; if(verbosity >1) cout << "TestSameVertexMesh3" << endl; TestSameVertexMesh3( Th3, hseuil, Psup, Pinf, nv_t, Numero_Som ); if(verbosity >1) cout << "hseuil=" << hseuil << endl; if(verbosity >1) cout << "NbVertexRecollement " << nv_t << " / " << "NbVertex(anc)" << Th3.nv <= 0 && iv[jj] < nv_t); } for(int jj=0; jj<3; jj++){ for(int kk=jj+1; kk<3; kk++){ if( iv[jj]==iv[kk] ) Border_ok[ii]=0; } } i_border = i_border + Border_ok[ii]; } if( i_border != Th3.nbe){ cout << "There are a false tetrahedra in the mesh" << endl; //assert( i_elem == Th3.nt); } /* determination du nombre de tetrahedre confondus */ hseuil = hmin/10.; hseuil = hseuil/4.; nt_t=0; TestSameTetrahedraMesh3( Th3, hseuil, Psup, Pinf, Elem_ok, nt_t ); if(verbosity >1) cout << "hseuil=" << hseuil << endl; if(verbosity >1) cout << "NbVertexRecollement " << nt_t << " / " << "NbVertex(anc)" << Th3.nt <1) cout << "hseuil=" << hseuil << endl; if(verbosity >1) cout << "NbVertexRecollement " << nbe_t << " / " << "NbVertex(anc)" << Th3.nbe < *gtree = new EF23::GTree(v,Pinf,Psup,0); // determination des nouveaux sommets int nbv = 0; hseuil = hmin/10.; for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ v[nbv].x = vi.x; v[nbv].y = vi.y; v[nbv].z = vi.z; v[nbv].lab = vi.lab; gtree->Add( v[nbv++] ); } } delete gtree; assert(nbv == nv_t); // determination des nouveaux tetrahedres int nbt = 0; hseuil = hmin/10.; hseuil = hseuil/4.; for (int ii=0;iiset(v,iv,K.lab); } assert(nbv == nv_t); // determination des nouveaux trianglesxs int nbbe = 0; hseuil = hmin/10.; hseuil = hseuil/4.; for (int ii=0;iiset(v,iv,K.lab); } assert(nbbe == nbe_t); delete [] Numero_Som; delete [] Border_ok; delete [] Elem_ok; Mesh3 *Th3_new = new Mesh3(nv_t,nt_t,nbe_t,v,t,b); return Th3_new; } // TransfoMesh_v2.cpp // LayerMesh.cpp // remarque choix 2 est a encore a determiner double zmin_func_mesh( const int choix, const double x, const double y ) { switch(choix){ case 0: return 0.; break; case 1: return 0.; break; case 2: return sqrt(pow(x,2)+pow(y,2)); break; default : cout << "zmin_func no defined" << endl; return 0.; } } double zmax_func_mesh( const int choix, const double x, const double y ){ switch(choix){ case 0: return 1.; break; case 1: return 1.; break; case 2: return 3.+sqrt(pow(x,2)+pow(y,2)); break; default : cout << "zmaxfunc no defined" << endl; return 0.; } } int Ni_func_mesh( const int choix, const double x, const double y ){ const int multi=1; int res; switch(choix){ case 0: if( x==0. && y==0.){ res = 3; } if( x==1. && y==0.){ res = 5; } if( x==0. && y==1.){ res = 7; } if( x==0.5 && y==0.5){ res = 6; } return res ; //return multi; break; case 1: return 2; break; case 2: return int(multi*(3+sqrt(pow(x,2)+pow(y,2)))); break; default : cout << "Ni_func no defined" << endl; return 0; } } void discretisation_max_mesh(const int choix, const Mesh & Th2, int & Nmax){ int Ni; Nmax = 0; /*for(int ii=0; ii < A2D.NbSommet2D;ii++){ Ni = Ni_func( choix, A2D.CoorSommet2D[ii][0], A2D.CoorSommet2D[ii][1]); Nmax = max(Ni,Nmax); } Nmax=4;*/ for(int ii=0; ii < Th2.nv; ii++){ const Mesh::Vertex & P = Th2.vertices[ii]; Ni = Ni_func_mesh( choix, P.x, P.y); Nmax = max(Ni,Nmax); } } void tab_zmin_zmax_Ni_mesh(const int choix, const Mesh & Th2, int & Nmax,double *tab_zmin, double *tab_zmax,int *tab_Ni){ Nmax = 0; for(int ii=0; ii < Th2.nv; ii++){ const Mesh::Vertex & P = Th2.vertices[ii]; tab_Ni[ii] = Ni_func_mesh( choix, P.x, P.y); tab_zmin[ii] = zmin_func_mesh( choix, P.x, P.y ); tab_zmax[ii] = zmax_func_mesh( choix, P.x, P.y ); Nmax = max(tab_Ni[ii],Nmax); } } /* Fonction permettant de transformer maillage 2D en maillage 3D*/ void Tet_mesh3_mes_neg(Mesh3 & Th3){ int iv[4]; int lab; for(int ii=0; ii< Th3.nt; ii++){ const Tet & K(Th3.t(ii)); lab = K.lab; iv[0] = Th3.operator()(K[0]); iv[2] = Th3.operator()(K[1]); iv[1] = Th3.operator()(K[2]); iv[3] = Th3.operator()(K[3]); R3 A(Th3.vertices[iv[0]]); R3 B(Th3.vertices[iv[1]]); R3 C(Th3.vertices[iv[2]]); R3 D(Th3.vertices[iv[3]]); double mes=det(A,B,C,D)/6.; Th3.t(ii).set(Th3.vertices, iv, lab,mes); } } //=======================================================================// // Rajout pour s'assurer un unique label pour les vertices //=======================================================================// void build_layer_map_tetrahedra(const Mesh &Th2, map &maptet ){ int numero_label=0; //cout << "in: buil_layer_map_tetrahedra" << endl; for(int ii=0; ii< Th2.nt; ii++){ //cout << "ii= " << ii << "Th2.nt=" << Th2.nt <::const_iterator imap=maptet.find(K.lab); //cout << "K.lab= " << K.lab << endl; if(imap == maptet.end()){ maptet[ K.lab ] = K.lab; // modif FH .. numero_label; numero_label = numero_label+1; } } //cout << "number of tetraedra label=" << numero_label << endl; } void build_layer_map_triangle(const Mesh &Th2, map &maptrimil, map &maptrizmax, map &maptrizmin ){ int numero_label=0; //cout << "in: buil_layer_map_triangle" << endl; for(int ii=0; ii< Th2.nt; ii++){ const Mesh::Triangle & K(Th2.t(ii)); map::const_iterator imap=maptrizmax.find(K.lab); if(imap == maptrizmax.end()){ maptrizmax[ K.lab ] = K.lab;// modif FH jan 2010 numero_label; numero_label = numero_label+1; } } for(int ii=0; ii< Th2.nt; ii++){ const Mesh::Triangle & K(Th2.t(ii)); map::const_iterator imap=maptrizmin.find(K.lab); if(imap == maptrizmin.end()){ maptrizmin[ K.lab ] = K.lab;// modif FH jan 2010 numero_label; numero_label = numero_label+1; } } for(int ii=0; ii< Th2.neb; ii++){ const Mesh::BorderElement & K(Th2.be(ii)); map::const_iterator imap=maptrimil.find(K.lab); if(imap == maptrimil.end()){ maptrimil[ K.lab ] = K.lab ;//modif FH jan 2010 numero_label; numero_label = numero_label+1; } } } void build_layer_map_edge(const Mesh &Th2, map &mapemil, map &mapezmax, map &mapezmin ){ int numero_label=0; for(int ii=0; ii< Th2.neb; ii++){ const Mesh::BorderElement & K(Th2.be(ii)); map::const_iterator imap1=mapezmax.find(K.lab); map::const_iterator imap2=mapemil.find(K.lab); map::const_iterator imap3=mapezmin.find(K.lab); if(imap1 == mapezmax.end()){ mapezmax[ K.lab ] = K.lab ;//modif FH jan 2010 numero_label; numero_label = numero_label+1; } if(imap2 == mapemil.end()){ mapemil[ K.lab ] = K.lab ;//modif FH jan 2010 numero_label;numero_label; numero_label = numero_label+1; } if(imap3 == mapezmin.end()){ mapezmin[ K.lab ] = K.lab ;//modif FH jan 2010 numero_label;numero_label; numero_label = numero_label+1; } } } Mesh3 * build_layer (const Mesh & Th2, const int Nmax, const int *tab_Ni, const double *tab_zmin, const double *tab_zmax, const map &maptet, const map &maptrimil, const map &maptrizmax, const map &maptrizmin, const map &mapemil, const map &mapezmax, const map &mapezmin ){ int MajSom, MajElem, MajBord2D; Mesh3 *Th3=new Mesh3; NbSom3D_NbElem3D_NbBord2D_mesh_product_mesh_tab( Nmax, tab_Ni, Th2, MajSom, MajElem, MajBord2D); if(verbosity > 1) cout << "MajSom = " << MajSom << " " << "MajElem = " << MajElem << " " << "MajBord2D =" << MajBord2D << endl; if(verbosity > 1) cout << "debut : Th3.set(MajSom, MajElem, MajBord2D); "<< endl; Th3->set(MajSom,MajElem,MajBord2D); if(verbosity > 1) cout << "debut : Som3D_mesh_product_Version_Sommet_mesh_tab( Nmax, tab_Ni, tab_zmin, tab_zmax, Th2, Th3); "<< endl; Som3D_mesh_product_Version_Sommet_mesh_tab( Nmax, tab_Ni, tab_zmin, tab_zmax, Th2, maptet, maptrimil, maptrizmax, maptrizmin, mapemil, mapezmax, mapezmin, *Th3); // Add FH because remove in call function.. Th3->BuildBound(); Th3->BuildAdj(); Th3->Buildbnormalv(); Th3->BuildjElementConteningVertex(); return Th3; } void NbSom3D_NbElem3D_NbBord2D_mesh_product_mesh_tab(const int Nmax, const int *tab_Ni, const Mesh &Th2, int &MajSom, int &MajElem, int &MajBord2D){ int i; MajSom = 0; for(int ii=0; ii < Th2.nv;ii++){ MajSom = MajSom + (tab_Ni[ii]+1); assert(tab_Ni[ii]<=Nmax); } MajElem = 0; for(int ii=0; ii < Th2.nt; ii++){ const Mesh::Triangle & K(Th2.t(ii)); for(int jj=0; jj < 3; jj++){ //i = A2D.ElemPoint2D[ii][jj]; i = Th2.operator()(K[jj]); MajElem = MajElem + tab_Ni[i]; } } // determination of NbBord2D MajBord2D = 2*Th2.nt; for(int ii=0; ii < Th2.neb;ii++) { const Mesh::BorderElement & K(Th2.be(ii)); for(int jj=0; jj < 2; jj++) { // i = A2D.ElemBord1D[ii][jj]; i=Th2.operator()(K[jj]); MajBord2D = MajBord2D + tab_Ni[i]; assert( tab_Ni[i] <= Nmax); } } //exit(1); } void Som3D_mesh_product_Version_Sommet_mesh_tab(const int Nmax, const int *tab_Ni, const double *tab_zmin, const double *tab_zmax, const Mesh &Th2, const map &maptet, const map &maptrimil, const map &maptrizmax, const map &maptrizmin, const map &mapemil, const map &mapezmax, const map &mapezmin, Mesh3 & Th3){ // intent(in) Nmax,Mesh &A2D // intent(out) Mesh3 &A3D double val_zmin,val_zmax,val_dz; int Ni; int NumSommet; int NumElement; KN tab_NumSommet(Th2.nv+1); // variable tet int SommetPrisme[6]; // variable creer pour le bord int i_ind1,Ni_ind1; int i_ind2,Ni_ind2; int i_recoll_1pp,i_recoll_2pp; int i_recoll_1, i_recoll_2; //int pas_recoll_1, pas_recoll_2; int type_dec_border; // avec data int i_recoll_jMax,i_recoll_jMaxpp; int cas_decoupage; //, cas_data; int int_decoup[3] = {1,2,4}; int Ni_elem[3]; int DiagMax1,DiagMax2; // determination of maximum label for vertices NumSommet = 0; for( int ii=0; ii < Th2.nv; ii++){ const Mesh::Vertex & P = Th2.vertices[ii]; val_zmin = tab_zmin[ii]; val_zmax = tab_zmax[ii]; Ni = tab_Ni[ii]; //val_dz = (val_zmax - val_zmin)/Ni; if( Ni == 0){ val_dz = 0.; } else{ val_dz = (val_zmax - val_zmin)/Ni; //if( abs(val_dz) < 1e-9 ) Ni=0; } tab_NumSommet[ii] = NumSommet; // Numero du premier sommet 3D associ au sommet 2D ii. //cout << "ii, tab_NumSommet[ii]= "<< ii <<" "<< tab_NumSommet[ii] << endl; for(int j=0; j <= Ni; j++){ //changer Th3.vertices[NumSommet].x = P.x; Th3.vertices[NumSommet].y = P.y; Th3.vertices[NumSommet].z = val_zmin + val_dz*j; Th3.vertices[NumSommet].lab = P.lab; // cas maillage du bas et du haut, on un nouveau label if(j==0) Th3.vertices[NumSommet].lab = P.lab ; if(j==Ni) Th3.vertices[NumSommet].lab = P.lab ; NumSommet = NumSommet+1; } } tab_NumSommet[Th2.nv] = NumSommet; assert( NumSommet == Th3.nv ); /*********************************/ /* new label for edges of cube */ /*********************************/ /* cout << " new label for edges of cubes " << endl; for(int ii=0; ii < Th2.neb; ii++){ const Mesh::BorderElement & K(Th2.be(ii)); int ib[2]; ib[0] = Th2.operator()(K[0]); ib[1] = Th2.operator()(K[1]); //map:: const_iterator imap; for(int kk=0; kk<2;kk++){ // label zmin map:: const_iterator imap1; imap1=mapezmin.find( K.lab ); assert( imap1!=mapezmin.end() ); Th3.vertices[ tab_NumSommet[ib[kk]] ].lab = imap1->second; // label zmax map:: const_iterator imap2; imap2=mapezmax.find( K.lab ); assert( imap2!=mapezmax.end() ); Th3.vertices[ tab_NumSommet[ ib[kk] ] + tab_Ni[ib[kk]] ].lab = imap2->second; // label ct map:: const_iterator imap3; imap3=mapemil.find ( K.lab ); assert( imap3!=mapemil.end() ); for(int jj=1; jj < tab_Ni[ib[kk]]; jj++){ Th3.vertices[ tab_NumSommet[ ib[kk] ] + jj ].lab = imap3->second; } } } */ //======================================================================= // creation des bord du maillage 3D a partir du bord 1D et du maillage 2D //======================================================================= if(verbosity > 1) cout << "calcul element du bord " << endl; // A mettre plus haut int ElemBord; ElemBord = 0; // bord dfinies en zmax for(int ii=0; ii < Th2.nt; ii++){ int ijj[3]; const Mesh::Element & K(Th2.t(ii)); int lab; map::const_iterator imap=maptrizmax.find(K.lab); assert( imap!=maptrizmax.end() ); lab=imap->second; for(int kk=0; kk < 3; kk++){ ijj[kk] = Th2.operator()(K[kk]); ijj[kk] = tab_NumSommet[ijj[kk]+1]-1; } Th3.be(ElemBord).set(Th3.vertices,ijj,lab); ElemBord = ElemBord+1; } //cout << "bord en zmin" << endl; for(int ii=0; ii < Th2.nt; ii++){ int ijj[3];//bjj[3]; const Mesh::Element & K(Th2.t(ii)); int lab; map::const_iterator imap=maptrizmin.find(K.lab); assert( imap!=maptrizmin.end() ); lab = imap->second; for(int kk=0; kk < 3; kk++){ ijj[2-kk] = Th2.operator()(K[kk]); //bjj[2-kk] = ijj[2-kk] ; ijj[2-kk] = tab_NumSommet[ijj[2-kk]]; } Th3.be(ElemBord).set(Th3.vertices,ijj,lab); ElemBord = ElemBord+1; } //cout << "bord sur le cote" << endl; for(int ii=0; ii < Th2.neb; ii++){ // Th2.neb ?? int ijj[3]; const Mesh::BorderElement & K(Th2.be(ii)); int lab; map::const_iterator imap=maptrimil.find(K.lab); assert( imap!=maptrimil.end() ); lab=imap->second; int edgebid ; int ffbid = Th2.BoundaryElement( ii, edgebid ); // ii : number of edge => sortie :: ffbid = numero triangles, edgebid = numero edges int j0bid,j1bid; Th2.VerticesNumberOfEdge( Th2.t(ffbid), edgebid, j0bid, j1bid); //bool ffsens = Th2.SensOfEdge( Th2.t(ffbid), edgebid ); // sens du parcours de la edge correcte ou non /* if( ffsens == true){ i_ind1 = Th2.operator()(K[0]); i_ind2 = Th2.operator()(K[1]); } else{ i_ind1 = Th2.operator()(K[1]); i_ind2 = Th2.operator()(K[0]); } printf("value of vertex edge (verticesNumberOfEdge) :: %d--%d \n", j0bid, j1bid ); printf("value of vertex edge ( Th2.operator() ) :: %d--%d \n", Th2.operator()(K[0]), Th2.operator()(K[1]) ); printf("value of vertex edge ( bool sens ) :: %d--%d \n", i_ind1, i_ind2 ); */ i_ind1 = j0bid; i_ind2 = j1bid; Ni_ind1 = tab_Ni[i_ind1]; Ni_ind2 = tab_Ni[i_ind2]; assert( Ni_ind1 <= Nmax); assert( Ni_ind2 <= Nmax); for(int jNmax=Nmax-1; jNmax >=0; jNmax--){ /* i_recoll_1pp = int((jNmax+1)*Ni_ind1/Nmax); i_recoll_2pp = int((jNmax+1)*Ni_ind2/Nmax); i_recoll_1 = int(jNmax*Ni_ind1/Nmax); i_recoll_2 = int(jNmax*Ni_ind2/Nmax); */ i_recoll_1 = int((jNmax+1)*Ni_ind1/Nmax); i_recoll_2 = int((jNmax+1)*Ni_ind2/Nmax); i_recoll_1pp = int(jNmax*Ni_ind1/Nmax); i_recoll_2pp = int(jNmax*Ni_ind2/Nmax); // if( (i_ind1== 11 || i_ind1== 0) && (i_ind2==11 || i_ind2==0) ) { // printf("i_recoll1 %d, i_recoll2 %d\n", i_recoll_1, i_recoll_2); // printf("i_recoll1pp %d, i_recoll2pp %d\n", i_recoll_1pp, i_recoll_2pp); // } /* 1 === 2 | | | | 1pp === 2pp sens 2D : 1pp => 2pp et 1 => 2 type_dec_border = 0 tous les points sont confondus type_dec_border = 1 les points 1pp et 1 sont differents type_dec_border = 2 les points 2pp et 2 sont differents type_dec_border = 3 les points 1pp et 1 et les points 2pp et 2 sont differents rappel : 1pp(0) 2pp(1) 2(2) 1(3) data_dec_border 1 : {3 1 0} data_dec_border 2 : {2 1 0} data_dec_border 3 : type1 : { {2 1 0}{0 3 2} } : type2 : { {3 1 0}{1 3 2} } */ type_dec_border = 0; if( i_recoll_1pp != i_recoll_1){ type_dec_border = type_dec_border + 1; } if( i_recoll_2pp != i_recoll_2){ type_dec_border = type_dec_border + 2; } // if( (i_ind1== 11 || i_ind1== 0) && (i_ind2==11 || i_ind2==0) ) // cout << "type decoupage bord= " << type_dec_border < 0,1,2 ijj[0] = tab_NumSommet[i_ind1]+i_recoll_1pp; ijj[1] = tab_NumSommet[i_ind2]+i_recoll_2pp; ijj[2] = tab_NumSommet[i_ind1]+i_recoll_1; Th3.be(ElemBord).set(Th3.vertices,ijj,lab); ElemBord = ElemBord+1; break; case 2: // 1pp = 1 // avant 2,1,0 --> 0,1,2 ijj[0] = tab_NumSommet[i_ind1]+i_recoll_1pp; ijj[1] = tab_NumSommet[i_ind2]+i_recoll_2pp; ijj[2] = tab_NumSommet[i_ind2]+i_recoll_2; Th3.be(ElemBord).set(Th3.vertices,ijj,lab); ElemBord = ElemBord+1; break; case 3: int idl; // determination de la diagonale Max DiagMax1 = max( tab_NumSommet[i_ind1]+i_recoll_1pp, tab_NumSommet[i_ind2]+i_recoll_2 ); DiagMax2 = max( tab_NumSommet[i_ind2]+i_recoll_2pp, tab_NumSommet[i_ind1]+i_recoll_1 ); if(DiagMax1 > DiagMax2){ idl = 1; ijj[0] = tab_NumSommet[i_ind1]+i_recoll_1pp; ijj[1] = tab_NumSommet[i_ind2]+i_recoll_2pp; ijj[2] = tab_NumSommet[i_ind2]+i_recoll_2; Th3.be(ElemBord).set(Th3.vertices,ijj,lab); ijj[0] = tab_NumSommet[i_ind2]+i_recoll_2; ijj[1] = tab_NumSommet[i_ind1]+i_recoll_1; ijj[2] = tab_NumSommet[i_ind1]+i_recoll_1pp; Th3.be(ElemBord+1).set(Th3.vertices,ijj,lab); } else{ idl = 2; ijj[0] = tab_NumSommet[i_ind1]+i_recoll_1pp; ijj[1] = tab_NumSommet[i_ind2]+i_recoll_2pp; ijj[2] = tab_NumSommet[i_ind1]+i_recoll_1; Th3.be(ElemBord).set(Th3.vertices,ijj,lab); ijj[0] = tab_NumSommet[i_ind2]+i_recoll_2; ijj[1] = tab_NumSommet[i_ind1]+i_recoll_1; ijj[2] = tab_NumSommet[i_ind2]+i_recoll_2pp; Th3.be(ElemBord+1).set(Th3.vertices,ijj,lab); } //cout << "idl=" << idl << endl; ElemBord = ElemBord+2; break; default: break; } } } assert( ElemBord == Th3.nbe ); //========================================= // Creation + determination tetraedre if(verbosity > 1) cout << "calcul element tetraedre " << endl; NumElement = 0; for(int ii=0; ii < Th2.nt; ii++){ /* nouvelle numerotation : ----------------------- Valeur de cas_deoupage ----------------------- 1 : sommet 0 et 3 differents 2 : sommet 1 et 4 differents 4 : sommet 2 et 5 differents ============================ 3 : sommet 0 et 3 differents + sommet 1 et 4 differents 5 : sommet 0 et 3 differents + sommet 2 et 5 differents 6 : sommet 1 et 4 differents + sommet 2 et 5 differents ============================ 7 : aucun sommets confondus data_tetraedre ============== 1: 0++,1++,2++,SomDiff : {0 1 2 3} :: data 1 2: 0++,1++,2++,SomDiff : {0 1 2 4} :: data 2 4: 0++,1++,2++,SomDiff : {0 1 2 5} :: data 3 ============== = deux cas possible depend du sommet le plus grand : Sommet le plus grand est un ++ = 0++,1++,2++,SomDiffMin || SomDiffMax++, j_SomDiff_py[j_SomEgal][0], j_SomDiff_py[j_SomEgal][1], Som_Egal 3:a: SommetMax diag 04 {0,1,2,4} {5,4,3,0} :: data 4 3:b: SommetMax diag 13 {0,1,2,3} {5,4,3,1} :: data 5 ============================================= 5:a: SommetMax diag 05 {0,1,2,5} {5,4,3,0} :: data 6 5:b: SommetMax diag 23 {0,1,2,3} {5,4,3,2} :: data 7 ============================================= 6:a: SommetMax diag 15 {0,1,2,5} {5,4,3,1} :: data 8 6:b: SommetMax diag 24 {0,1,2,4} {5,4,3,2} :: data 9 ============================================= 7: aller chercher dans la fonction :: data 10 a data == voir hecht routine */ const Mesh::Element & K(Th2.t(ii)); int somv[4]; int K_jj[3]; int lab; map::const_iterator imap=maptet.find(K.lab); assert( imap != maptet.end() ); lab=imap->second; // valeur de Nombre de points for(int jj=0; jj <3; jj++){ K_jj[jj] = Th2.operator()(K[jj]); Ni_elem[jj] = tab_Ni[ K_jj[jj] ]; } for(int jNmax=Nmax-1; jNmax >=0; jNmax--){ // determination des sommets + cas decoupage cas_decoupage = 0; for(int jj=0; jj<3; jj++){ i_recoll_jMax = int( (jNmax)*Ni_elem[jj]/Nmax ); i_recoll_jMaxpp = int( (jNmax+1)*Ni_elem[jj]/Nmax ); SommetPrisme[jj+3] = tab_NumSommet[ K_jj[jj] ] + i_recoll_jMaxpp; SommetPrisme[jj] = tab_NumSommet[ K_jj[jj] ] + i_recoll_jMax; assert( SommetPrisme[jj] <= Th3.nv); assert( SommetPrisme[jj+3] <= Th3.nv); if( i_recoll_jMax != i_recoll_jMaxpp) cas_decoupage = cas_decoupage + int_decoup[jj]; } //cout << "cas du decoupage= " << cas_decoupage << endl; switch( cas_decoupage ){ case 0 : // les points sont tous confondus pas d ajout element : rien a faire break; /* CAS CREATION D UN TETRAEDRE : cas decoupage 1 2 4 */ case 1 : // On a un tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[3]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); NumElement = NumElement+1; break; case 2 : // On a un tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[4]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); NumElement = NumElement+1; break; case 4 : // On a un tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[5]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); NumElement = NumElement+1; break; /* On a une pyramide a base rectangle: decoupe deux tetraedres cas decoupage 3 5 6 */ case 3 : // determination de la diagonale dominante DiagMax1 = max( SommetPrisme[0], SommetPrisme[4] ); DiagMax2 = max( SommetPrisme[1], SommetPrisme[3] ); //cout << "DiagMax1=" << DiagMax1 << " "<< SommetPrisme[0]<<" " < DiagMax2){ //------------------ // premier tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[4]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[5]; somv[1] = SommetPrisme[4]; somv[2] = SommetPrisme[3]; somv[3] = SommetPrisme[0]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); } else{ //------------------ // premier tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[3]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[5]; somv[1] = SommetPrisme[4]; somv[2] = SommetPrisme[3]; somv[3] = SommetPrisme[1]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); } NumElement = NumElement+2; break; case 5 : // determination de la diagonale dominante DiagMax1 = max( SommetPrisme[0], SommetPrisme[5] ); DiagMax2 = max( SommetPrisme[2], SommetPrisme[3] ); //cout << "DiagMax1=" << DiagMax1 << " "<< SommetPrisme[0]<<" " < DiagMax2){ //------------------ // premier tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[5]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[5]; somv[1] = SommetPrisme[4]; somv[2] = SommetPrisme[3]; somv[3] = SommetPrisme[0]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); } else{ //------------------ // premier tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[3]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[5]; somv[1] = SommetPrisme[4]; somv[2] = SommetPrisme[3]; somv[3] = SommetPrisme[2]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); } NumElement = NumElement+2; break; case 6 : // determination de la diagonale dominante DiagMax1 = max( SommetPrisme[1], SommetPrisme[5] ); DiagMax2 = max( SommetPrisme[2], SommetPrisme[4] ); //cout << "DiagMax1=" << DiagMax1 << " "<< SommetPrisme[1]<<" " < DiagMax2){ //------------------ // premier tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[5]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[5]; somv[1] = SommetPrisme[4]; somv[2] = SommetPrisme[3]; somv[3] = SommetPrisme[1]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); } else{ //------------------ // premier tetraedre somv[0] = SommetPrisme[0]; somv[1] = SommetPrisme[1]; somv[2] = SommetPrisme[2]; somv[3] = SommetPrisme[4]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[5]; somv[1] = SommetPrisme[4]; somv[2] = SommetPrisme[3]; somv[3] = SommetPrisme[2]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); } NumElement = NumElement+2; break; case 7 : // on a un prisme int nbe; int option=1; int idl[3]; int nu[12]; DiagMax1 = max( SommetPrisme[0], SommetPrisme[5] ); DiagMax2 = max( SommetPrisme[2], SommetPrisme[3] ); // determination de idl // idl[0] : choix sommet 0 ou 2 (dpent1 equivalent 1 ou 3) if(DiagMax1 > DiagMax2){ idl[0]=1; } else{ idl[0]=2; } DiagMax1 = max( SommetPrisme[0], SommetPrisme[4] ); DiagMax2 = max( SommetPrisme[1], SommetPrisme[3] ); // idl[1] : choix sommet 0 ou 1 (dpent1 equivalent 1 ou 2) if(DiagMax1 > DiagMax2){ idl[1]=1; } else{ idl[1]=2; } DiagMax1 = max( SommetPrisme[1], SommetPrisme[5] ); DiagMax2 = max( SommetPrisme[2], SommetPrisme[4] ); // idl[2] : choix sommet 1 ou 2 (dpent1 equivalent 2 ou 3) if(DiagMax1 > DiagMax2){ idl[2]=1; } else{ idl[2]=2; } //cout << "idl[0] << << idl[1] << << idl[2]" << endl; //cout << idl[0] << " " << idl[1] << " "<< idl[2] << endl; nbe = 0; dpent1_mesh( idl, nu, nbe, option); if(nbe!=3){cout << nbe << endl; cerr << "probleme dans dpent1_mesh" << endl; }; //------------------ // premier tetraedre somv[0] = SommetPrisme[nu[0]]; somv[1] = SommetPrisme[nu[1]]; somv[2] = SommetPrisme[nu[2]]; somv[3] = SommetPrisme[nu[3]]; Th3.elements[NumElement].set(Th3.vertices, somv, lab); // deuxieme tetraedre somv[0] = SommetPrisme[nu[4]]; somv[1] = SommetPrisme[nu[5]]; somv[2] = SommetPrisme[nu[6]]; somv[3] = SommetPrisme[nu[7]]; Th3.elements[NumElement+1].set(Th3.vertices, somv, lab); // troisieme tetraedre somv[0] = SommetPrisme[nu[8]]; somv[1] = SommetPrisme[nu[9]]; somv[2] = SommetPrisme[nu[10]]; somv[3] = SommetPrisme[nu[11]]; Th3.elements[NumElement+2].set(Th3.vertices, somv, lab); NumElement = NumElement+3; break; } } // Au final : les sommers des tetraedres et la conectivit des tetraedres finaux assert(NumElement <= Th3.nt); } } void dpent1_mesh(int idl[3],int nu[12],int &nbe,int &option){ // intent(inout) :: idl // intent(out) :: nu,nbe,option // option ne sert rien //* version simplifie pour le mailleur par couche 2D 3D //----------------------------------------------------------------------- // subroutine dpent1 (idl,nu,nbe,option) //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // s.p. dpent1 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // but : decoupe un pentaedre en 3 tetreadres suivant la decoupe des 3 // --- faces frontieres a 4 cotes // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // parametres en entre : // idl : parametre de decoupe de face calculer comme ceci : // si idl(i) = 0 alors la face n'est pas decoupee // idl(1)= 1 si la face 1463 est decoupe par l'arete 16 ,sinon 2 // idl(2)= 1 si la face 1254 est decoupe par l'arete 15 ,sinon 2 // idl(3)= 1 si la face 2365 est decoupe par l'arete 26 ,sinon 2 // id = i1 + i2 * 2 + i3 * 4 // parametres en sortie : // nbe : nbe de tetraedre de la decoupe // nbe = 0 => decoup impossible // nbe = 3 => decoup possible le tableau nu est genere // nu(1:4,1:nbe) : tableau de numero des sommet 3 tetraedres dans le // pentaedre // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // programmation : f77 ->c++ subroutine de f. hecht upmc int idp[8]; int i1,i2,i3,i,nbdp,idf,idecou; const int pdd[8] = {1,0,2,3,4,5,0,6}; int mu[6][12]; const int mu0[12] = {1,6,2,3, 1,5,2,6, 1,6,4,5}; const int mu1[12] = {1,6,2,3, 1,4,2,6, 2,6,4,5}; const int mu2[12] = {1,4,2,3, 2,6,3,4, 2,6,4,5}; const int mu3[12] = {1,5,2,3, 1,5,3,6, 1,6,4,5}; const int mu4[12] = {1,5,2,3, 1,5,3,4, 3,6,4,5}; const int mu5[12] = {1,4,2,3, 2,5,3,4, 3,6,4,5}; for(int jj=0; jj<12; jj++){ mu[0][jj] = mu0[jj]; mu[1][jj] = mu1[jj]; mu[2][jj] = mu2[jj]; mu[3][jj] = mu3[jj]; mu[4][jj] = mu4[jj]; mu[5][jj] = mu5[jj]; } // calcul des descoupes possible du pentaedre idf = -1; nbdp = 0; for(i3=1; i3<=2; i3++){ for(i2=1; i2<=2; i2++){ for(i1=1; i1<=2; i1++){ idf=idf+1; if( (pdd[idf] != 0) && ( idl[0]==0 || idl[0]==i1 ) && ( idl[1]==0 || idl[1]==i2 ) && ( idl[2]==0 || idl[2]==i3 ) ){ //nbdp=nbdp+1; idp[nbdp]=idf; nbdp=nbdp+1; } } } } if(nbdp == 0){ nbe=0; } else{ nbe=3; idf=idp[0]; idecou=pdd[idf]; /* i=idf; j=i/4; i=i-4*j; idl[2]=j+1; j=i/2; idl[1]=j+1; idl[0]=i-2*j+1; //cout << "idecou= " << idecou << endl;*/ for(i=0; i<12;i++){ nu[i]=mu[idecou-1][i]-1; //cout << "i, nu[i] "<< i <<" " << nu[i] << endl; } } } //----------------------------------------------------------------------- // glumesh3D class listMesh3 { public: list *lth; void init() { lth=new list;} void destroy() { delete lth;} listMesh3(Stack s,Mesh3 *th) : lth(Add2StackOfPtr2Free(s,new list)) { lth->push_back(th);} listMesh3(Stack s,Mesh3 *tha,Mesh3 *thb) : lth(Add2StackOfPtr2Free(s,new list)) { lth->push_back(tha);lth->push_back(thb);} listMesh3(Stack s,const listMesh3 &l,Mesh3 *th) : lth(Add2StackOfPtr2Free(s,new list(*l.lth))) { lth->push_back(th);} }; Mesh3 * GluMesh3(listMesh3 const & lst) { int flagsurfaceall = 0; int nbt=0; int nbe=0; int nbex=0; int nbv=0; int nbvx=0; double hmin=1e100; R3 Pn(1e100,1e100,1e100),Px(-1e100,-1e100,-1e100); const list lth(*lst.lth); Mesh3 * th0=0; int kk=0; for(list::const_iterator i=lth.begin();i != lth.end();i++) { if( ! *i) continue ; kk++; Mesh3 &Th3(**i); // definis ??? th0=&Th3; if(verbosity>1) cout << " determination of hmin : GluMesh3D + "<< Th3.nv << " " << Th3.nt << " "<< Th3.nbe << endl; nbt += Th3.nt; nbvx += Th3.nv; nbex += Th3.nbe; for (int k=0;k 1) cout << " - hmin =" << hmin << " , Bounding Box: " << Pn << " "<< Px << endl; // probleme memoire Vertex3 *v= new Vertex3[nbvx]; Tet *t; if(nbt!=0) t= new Tet[nbt]; Tet *tt=t; Triangle3 *b= new Triangle3[nbex]; Triangle3 *bb= b; ffassert(hmin>Norme2(Pn-Px)/1e9); double hseuil =hmin/10.; //int *NumSom= new int[nbvx]; // VERSION morice if(verbosity > 1) cout << " creation of : BuildGTree" << endl; EF23::GTree *gtree = new EF23::GTree(v,Pn,Px,0); nbv=0; //int nbv0=0; for(list::const_iterator i=lth.begin(); i!=lth.end();i++) { if( ! *i) continue ; const Mesh3 &Th3(**i); if(verbosity>1) cout << " loop over mesh for create new mesh "<< endl; if(verbosity>1) cout << " GluMesh3D + "<< Th3.nv << " " << Th3.nt <<" " << Th3.nbe << endl; //nbv0 =+Th3.nv; for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ v[nbv].x = vi.x; v[nbv].y = vi.y; v[nbv].z = vi.z; v[nbv].lab = vi.lab; //NumSom[ii+nbv0] = nbv; gtree->Add( v[nbv] ); nbv++; } /* else{ NumSom[ii+nbv0] = pvi-v; assert(pvi-v ToClose(K[0],hseuil)-v; iv[1]=gtree->ToClose(K[1],hseuil)-v; iv[2]=gtree->ToClose(K[2],hseuil)-v; iv[3]=gtree->ToClose(K[3],hseuil)-v; (tt++)->set(v,iv,K.lab); } //nbv0 =+Th3.nv; } if(verbosity > 1) cout << " creation of : BuildGTree for border elements" << endl; Vertex3 *becog= new Vertex3[nbex]; //Vertex3 becog[nbex]; EF23::GTree *gtree_be = new EF23::GTree(becog,Pn,Px,0); double hseuil_border = hseuil/3.; //nbv0=0; for(list::const_iterator i=lth.begin();i != lth.end();i++) { if( ! *i) continue ; const Mesh3 &Th3(**i); for (int k=0;kToClose(vi,hseuil_border); if(!pvi){ becog[nbe].x = vi.x; becog[nbe].y = vi.y; becog[nbe].z = vi.z; becog[nbe].lab = vi.lab; gtree_be->Add( becog[nbe++]); int igluv[3]; igluv[0]= gtree->ToClose(K[0],hseuil)-v; //NumSom[iv[0]+nbv0]; igluv[1]= gtree->ToClose(K[1],hseuil)-v; //NumSom[iv[1]+nbv0]; igluv[2]= gtree->ToClose(K[2],hseuil)-v; //NumSom[iv[2]+nbv0]; (bb++)->set(v,igluv,K.lab); } } //nbv0 =+Th3.nv; } delete gtree; delete gtree_be; delete [] becog; if(verbosity > 2) cout << " nbv=" << nbv << endl; if(verbosity > 2) cout << " nbvx=" << nbvx << endl; if(verbosity > 2) cout << " nbt=" << nbt << endl; if(verbosity > 2) cout << " nbe=" << nbe << endl; if(verbosity > 2) cout << " nbex=" << nbex << endl; if(verbosity>1) { cout << " Nb of glu3D point " << nbvx-nbv; cout << " Nb of glu3D Boundary faces " << nbex-nbe << endl; } if(nbt==0){ Mesh3 *mpq= new Mesh3(nbv,nbe,v,b); if(flagsurfaceall==1) mpq->BuildBoundaryElementAdj(); return mpq; } else{ Mesh3 *mpq= new Mesh3(nbv,nbt,nbe,v,t,b); /* mpq->BuildBound(); if(verbosity > 1) cout << "fin de BuildBound" << endl; mpq->BuildAdj(); if(verbosity > 1) cout << "fin de BuildAdj" << endl; mpq->Buildbnormalv(); if(verbosity > 1) cout << "fin de Buildnormalv()" << endl; mpq->BuildjElementConteningVertex(); if(verbosity > 1) cout << "fin de ConteningVertex()" << endl; */ mpq->BuildGTree(); if(verbosity > 2) cout << "fin de BuildGTree()" << endl; //Add2StackOfPtr2FreeRC(stack,mpq); return mpq; } } template struct Op3_addmesh: public binary_function { static RR f(Stack s,const AA & a,const BB & b) { return RR(s, a, b );} }; template struct Op3_setmesh: public binary_function { static RR f(Stack stack,const AA & a,const BB & b) { ffassert(a ); pmesh3 p=GluMesh3(b); if(!INIT && *a){ //Add2StackOfPtr2FreeRC(stack,*a); (**a).destroy(); cout << "destruction du pointeur" << endl; } //Add2StackOfPtr2FreeRC(stack,p); // the pointer is use to set variable so no remove. *a=p; return a; } }; // Movemesh3D class Movemesh3D_Op : public E_F0mps { public: Expression eTh; Expression xx,yy,zz; //Expression lab,reg; static const int n_name_param =7+2; // add FH for cleanning name // "+1" add to reorient tetrahedrons static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,int ii,Stack stack,KN_ a ) const { ffassert( ! (nargs[i] && nargs[ii]) ); i= nargs[i] ? i : ii; return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: /* Movemesh3D_Op(const basicAC_F0 & args,Expression tth) : eTh(tth), xx(0) , yy(0) , zz(0) { args.SetNameParam(n_name_param,name_param,nargs); const E_Array * a1=0 ; if(nargs[0]) a1 = dynamic_cast(nargs[0]); int err =0; if( nargs[1] && nargs[7] ) CompileError("uncompatible movemesh3 (Th, region= , reftet= "); if( nargs[2] && nargs[8] ) CompileError("uncompatible movemesh3 (Th, label= , refface= "); if(a1) { if(a1->size() !=3) CompileError("movemesh3 (Th,transfo=[X,Y,Z],) "); xx=to( (*a1)[0]); yy=to( (*a1)[1]); zz=to( (*a1)[2]); } }*/ Movemesh3D_Op(const basicAC_F0 & args,Expression tth,Expression xxx=0,Expression yyy=0,Expression zzz=0 ) : eTh(tth), xx(xxx) , yy(yyy) , zz(zzz) { args.SetNameParam(n_name_param,name_param,nargs); const E_Array * a1=0 ; if(nargs[0]) a1 = dynamic_cast(nargs[0]); int err =0; if( nargs[1] && nargs[7] ) CompileError("uncompatible movemesh3 (Th, region= , reftet= "); if( nargs[2] && nargs[8] ) CompileError("uncompatible movemesh3 (Th, label= , refface= "); if(a1) { if(a1->size() !=3 || xx || yy || zz) CompileError("movemesh3 (Th,transfo=[X,Y,Z],) "); xx=to( (*a1)[0]); yy=to( (*a1)[1]); zz=to( (*a1)[2]); } } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type Movemesh3D_Op::name_param[]= { { "transfo", &typeid(E_Array)}, //0 { "reftet", &typeid(KN_)},// 1 { "refface", &typeid(KN_)}, { "ptmerge", &typeid(double)}, { "facemerge",&typeid(long)}, { "boolsurface",&typeid(long)}, // 5 { "orientation",&typeid(long)}, { "region", &typeid(KN_ )}, //7 { "label", &typeid(KN_ )} // 8 // option a rajouter // facemerge 0,1 + label }; AnyType Movemesh3D_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); ffassert(pTh); Mesh3 &Th=*pTh; Mesh3 *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.nbe; // nombre d'aretes fontiere if(verbosity>5) cout << "before movemesh: Vertex " << nbv<< " Tetrahedra " << nbt << " triangles "<< nbe << endl; // lecture des references KN zzempty; KN nrtet (arg(1,7,stack,zzempty)); KN nrf (arg(2,8,stack,zzempty)); double precis_mesh( arg(3,stack,1e-7)); long mergefacemesh( arg(4,stack,1L) ); long flagsurfaceall( arg(5,stack,0L) ); long orientationelement( arg(6,stack,1L) ); //if( nrtet.N() && nrfmid.N() && nrfup.N() && nrfdown.N() ) return m; ffassert( nrtet.N() %2 ==0); ffassert( nrf.N() %2 ==0); map mapface; for(int i=0;i maptet; for(int i=0;i txx(Th.nv), tyy(Th.nv), tzz(Th.nv); Mesh3 &rTh3 = Th; KN takemesh(Th.nv); MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; // loop over tetrahedral for (int it=0;itsetP(&Th,it,iv); if(xx){ txx[i]=GetAny((*xx)(stack));} else txx[i]=mp3->P.x; if(yy){ tyy[i]=GetAny((*yy)(stack));}else tyy[i]=mp3->P.y; if(zz){ tzz[i]=GetAny((*zz)(stack));}else tzz[i]=mp3->P.z; takemesh[i] = takemesh[i]+1; } } } // loop over border elements // loop over tetrahedral for (int it=0;itset( Th.vertices[i].x, Th.vertices[i].y, Th.vertices[i].z ); if(xx){ txx[i]=GetAny((*xx)(stack));} if(yy){ tyy[i]=GetAny((*yy)(stack));} if(zz){ tzz[i]=GetAny((*zz)(stack));} takemesh[i] = takemesh[i]+1; } } } // option (Transfo_Mesh3) :: // border_only = 0, recollement_border=1, point_confondus_ok=0; == > 1900 triangles // border_only = 0, recollement_border=0, point_confondus_ok=0; == > 1980 triangles // border_only = 0, recollement_border=1, point_confondus_ok=1; == > 1820 triangles // border_only = 1, recollement_border=1, point_confondus_ok=0; == > 1900 triangles // border_only = 1, recollement_border=0, point_confondus_ok=0; == > 1980 triangles // border_only = 1, recollement_border=1, point_confondus_ok=1; == > 1820 triangles int border_only=0; // ne sert a rien !!!!! A enlever int recollement_elem=0; int recollement_border, point_confondus_ok; if(mergefacemesh == 0) { recollement_border=0; point_confondus_ok=0; } if(mergefacemesh == 1) { recollement_border=1; point_confondus_ok=0; } if(mergefacemesh == 2) { recollement_border=1; point_confondus_ok=1; } Mesh3 *T_Th3=Transfo_Mesh3( precis_mesh,rTh3, txx, tyy, tzz, border_only, recollement_elem, recollement_border, point_confondus_ok,orientationelement); if((T_Th3->mes) <= 0 && (T_Th3->nt > 0)) { cerr << " Erreur bad orientation in movemesh add parmetre orientation=,1 mesure="<mes<< endl; ExecError(" movemesh(3d): mesh with neg vol"); } if( nrtet.N() >0) { for (int i=0;ielements[i] ); int lab=K.lab; T_Th3->elements[i].lab = ChangeLab3D(maptet,lab); } } // les arete frontieres qui n'ont pas change if( nrf.N()>0) { for (int i=0;ibe(i) ); int l0,l1=ChangeLab3D(mapface,l0=K.lab) ; T_Th3->be(i).lab = l1; } } if(flagsurfaceall==1) T_Th3->BuildBoundaryElementAdj(); T_Th3->BuildGTree(); Add2StackOfPtr2FreeRC(stack,T_Th3); *mp=mps; return T_Th3; } class Movemesh3D : public OneOperator { public: int cas; Movemesh3D() : OneOperator(atype(),atype()), cas(0) {} Movemesh3D(int ) : OneOperator(atype(),atype(),atype()), cas(1) {} E_F0 * code(const basicAC_F0 & args) const { if(cas==0) return new Movemesh3D_Op(args,t[0]->CastTo(args[0])); else if (cas == 1) { const E_Array * a = dynamic_cast(args[1].LeftValue()); ffassert(a); if (a->size() !=3) CompileError("movemesh(Th,[X,Y,Z],...) need 3 componates in array ",atype()); Expression X=to( (*a)[0]); Expression Y=to( (*a)[1]); Expression Z=to( (*a)[2]); return new Movemesh3D_Op(args,t[0]->CastTo(args[0]),X,Y,Z); } else return 0; } }; //// version 3D de change label class SetMesh3D_Op : public E_F0mps { public: Expression a; static const int n_name_param =2+2+2+2; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { ffassert( !(nargs[i] && nargs[i+2])); i = nargs[i] ? i : i+2; return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack, long a ) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} bool arg(int i,Stack stack, bool a ) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} public: SetMesh3D_Op(const basicAC_F0 & args,Expression aa) : a(aa) { args.SetNameParam(n_name_param,name_param,nargs); if( nargs[0] && nargs[2] ) CompileError("uncompatible change(... region= , reftet= "); if( nargs[1] && nargs[3] ) CompileError("uncompatible change(...label= , refface= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type SetMesh3D_Op::name_param[]= { { "reftet", &typeid(KN_ )}, { "refface", &typeid(KN_ )}, { "region", &typeid(KN_ )}, { "label", &typeid(KN_ )}, { "fregion", &typeid(long)}, { "flabel", &typeid(long )}, { "rmlfaces", &typeid(long)}, { "rmInternalFaces", &typeid(bool)} }; // besoin en cas de fichier 2D / fichier 3D int ChangeLab3D(const map & m,int lab) { map::const_iterator i=m.find(lab); if(i != m.end()) lab=i->second; return lab; } AnyType SetMesh3D_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*a)(stack)); Mesh3 & Th=*pTh; if(!pTh) return pTh; Mesh3 *m= pTh; int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.nbe; // nombre d'aretes fontiere //cout << "Number of Vertex="<< nbv << "Number of BorderElement=" << nbe << endl; KN zz; KN nrtet (arg(0,stack,zz)); KN nrface (arg(1,stack,zz)); Expression freg = nargs[4]; Expression flab = nargs[5]; bool rm_faces = nargs[6]; long rmlabfaces (arg(6,stack,0L)); bool rm_i_faces (arg(7,stack,false)); // cout << " Chnage " << freg << " " << flab << endl; if(nrface.N() <=0 && nrtet.N() <=0 && (!freg) && (!flab) && !rmlabfaces && !rm_i_faces ) return m; // modf J.M. oct 2010 ffassert( nrtet.N() %2 ==0); ffassert( nrface.N() %2 ==0); map maptet,mapface; int z00 = false; for(int i=0;ix=V.x; vv->y=V.y; vv->z=V.z; vv->lab = V.lab; vv++; } // generation des triangles Tet *tt= t; int lmn= 2000000000; int lmx= -2000000000; int nberr=0; R3 PtHat(1./4.,1./4.,1./4.); for (int i=0;iset( v, iv, ChangeLab3D(maptet,lab)); if(freg) {// R3 B(1./4.,1./4.,1./4.); // 27/09/10 : J.Morice error in msh3.cpp mp->set(Th,K(PtHat),PtHat,K,0); tt->lab =GetAny( (* freg)(stack)) ; lmn= min (lmn,tt->lab); lmx= max (lmx,tt->lab); } tt++; } if(freg && verbosity> 1 ) cout << " -- Change : new region number bound : " << lmn << " "<< lmx << endl; // les arete frontieres qui n'ont pas change lmn= 2000000000; lmx= -2000000000; Triangle3 * bb=b; R2 PtHat2(1./3.,1./3.); int nrmf=0; for (int i=0;iset(Th,KE(B),B,KE,K.lab,NN,fk); l1 =GetAny( (* flab)(stack)) ; lmn= min (lmn,bb->lab); lmx= max (lmx,bb->lab); } if( !rmf && rm_faces) rmf = !onborder && ( l1 == rmlabfaces ); if(rmf) nrmf++; else (*bb++).set( v, iv, l1); } if(nrmf && verbosity > 2) cout << " change mesh3 : number of removed internal faces " << nrmf << " == " << nbe - (bb-b) << endl; nben -= nrmf; nbe -= nrmf; assert(nben==bb-b); *mp=mps; if(nbt != 0) { Mesh3 *mpq = new Mesh3(nbv,nbt,nbe,v,t,b); //mpq->BuildBound(); // mpq->BuildAdj(); // mpq->Buildbnormalv(); // mpq->BuildjElementConteningVertex(); mpq->BuildGTree(); //mpq->decrement(); // ?? decrement enlever ??? Add2StackOfPtr2FreeRC(stack,mpq); return mpq; } if(nbt == 0) { Mesh3 *mpq = new Mesh3(nbv,nbe,v,b); // mpq->BuildBound(); Add2StackOfPtr2FreeRC(stack,mpq); return mpq; } Mesh3 *mpq = NULL; return mpq; } class SetMesh3D : public OneOperator { public: typedef Mesh3 *pmesh3; SetMesh3D() : OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new SetMesh3D_Op(args,t[0]->CastTo(args[0])); } }; // --------------------------------- // Movemesh2d_3D_surf class Movemesh2D_3D_surf_Op : public E_F0mps { public: Expression eTh; Expression xx,yy,zz; static const int n_name_param =5+1; static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const{ return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a ) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} public: Movemesh2D_3D_surf_Op(const basicAC_F0 & args,Expression tth) : eTh(tth),xx(0),yy(0),zz(0) { args.SetNameParam(n_name_param,name_param,nargs); const E_Array * a1=0 ; if(nargs[0]) a1 = dynamic_cast(nargs[0]); int err =0; if( nargs[2] && nargs[5] ) CompileError("uncompatible movemesh23 (Th, label= , refface= "); if(a1) { if(a1->size() !=3) CompileError("movemesh23 (Th,transfo=[X,Y,Z],) "); xx=to( (*a1)[0]); yy=to( (*a1)[1]); zz=to( (*a1)[2]); } } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type Movemesh2D_3D_surf_Op::name_param[]= { { "transfo", &typeid(E_Array )}, { "orientation", &typeid(long)}, { "refface", &typeid(KN_)}, { "ptmerge", &typeid(double)}, { "boolsurface",&typeid(long)}, { "label", &typeid(KN_ )} }; AnyType Movemesh2D_3D_surf_Op::operator()(Stack stack) const { Mesh * pTh= GetAny((*eTh)(stack)); Mesh & Th=*pTh; Mesh *m= pTh; int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.neb; // nombre d'aretes fontiere if(verbosity>5) cout << "before movemesh: Vertex Triangle Edge"<< nbv << " " << nbt << " " << nbe << endl; KN zzempty; //int intempty=0; int mesureM (arg(1,stack,0L)); KN nrface (arg(2,stack,arg(5,stack,zzempty))); double precis_mesh(arg(3,stack,-1.)); long flagsurfaceall(arg(4,stack,-1L)); if(nrface.N()<0 ) return m; ffassert( nrface.N() %2 ==0); map mapface; int z00 = false; for(int i=0;i txx(nbv), tyy(nbv), tzz(nbv); MeshPoint *mp3(MeshPointStack(stack)); { KN takemesh(nbv); takemesh=0; Mesh &rTh = Th; for (int it=0; itsetP(&Th,it,iv); if(xx){ txx[i]=GetAny((*xx)(stack)); } if(yy){ tyy[i]=GetAny((*yy)(stack)); } if(zz){ tzz[i]=GetAny((*zz)(stack)); } takemesh[i] = takemesh[i]+1; } } } } //Mesh3 *Th3; //= new Mesh3; int vertex_out=1; if( vertex_out == 1){ /* determinate the same vertex */ int border_only = 0; int recollement_border=1, point_confondus_ok=0; // faire version de Transfo_Mesh2_tetgen pour ce cas prcis. Mesh3 *Th3= MoveMesh2_func( precis_mesh, Th, txx, tyy, tzz, border_only, recollement_border, point_confondus_ok); // Rajouter fonction flip a l interieure int nbflip=0; for(int ii=0; ii < Th3->nbe; ii++){ const Triangle3 & K(Th3->be(ii)); int iv[3]; int lab; double mes_triangle3; iv[0] = Th3->operator()(K[0]); iv[1] = Th3->operator()(K[1]); iv[2] = Th3->operator()(K[2]); map< int, int>:: const_iterator imap; imap = mapface.find(K.lab); if(imap!= mapface.end()){ lab=imap->second; } else{ lab=K.lab; } Th3->be(ii).set( Th3->vertices, iv, lab ) ; mes_triangle3 = Th3->be(ii).mesure(); if( surface_orientation*mes_triangle3 < 0){ int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; Th3->be(ii).set( Th3->vertices, iv, lab ) ; nbflip++; } /* autre methode a tester */ /* Triangle3 Kmes; Kmes.set( Th3->vertices, iv, lab ) ; mes_triangle3 = Kmes.mesure(); if( surface_orientation*mes_triangle3) < 0){ int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; } Th3->be(ii).set( Th3->vertices, iv, lab ) ; */ } assert(nbflip==0 || nbflip== Th3->nbe); if(flagsurfaceall==1) Th3->BuildBoundaryElementAdj(); Add2StackOfPtr2FreeRC(stack,Th3); return Th3; } else if( vertex_out == 0){ //Tet *t = new Tet[1]; Vertex3 *v = new Vertex3[nbv]; Triangle3 *b = new Triangle3[nbe]; // generation des nouveaux sommets Vertex3 *vv=v; // copie des anciens sommets (remarque il n'y a pas operateur de copy des sommets) for (int i=0;ix = txx[i]; vv->y = tyy[i]; vv->z = tzz[i]; vv->lab = V.lab; vv++; } // les arete frontieres qui n'ont pas change Triangle3 * bb=b; for (int i=0;inbe;i++) { double mes_triangle3= Th3->be(i).mesure(); if( surface_orientation*mes_triangle3 < 0){ const Triangle3 &K( Th3->be(i) ); int iv[3]; iv[0] = Th3->operator()(K[0]); iv[1] = Th3->operator()(K[1]); iv[2] = Th3->operator()(K[2]); int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; Th3->be(i).set( Th3->vertices, iv, K.lab ) ; nbflip++; } } assert(nbflip==0 || nbflip== Th3->nbe); if(flagsurfaceall==1) Th3->BuildBoundaryElementAdj(); Add2StackOfPtr2FreeRC(stack,Th3); return Th3; } return (Mesh3*) 0; } class Movemesh2D_3D_surf : public OneOperator { public: typedef Mesh *pmesh; typedef Mesh3 *pmesh3; Movemesh2D_3D_surf() : OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new Movemesh2D_3D_surf_Op(args,t[0]->CastTo(args[0])); // CastTo(args[]); // plus tard } }; /* ancien fichier de TransfoMesh */ Mesh3 * Transfo_Mesh3(const double &precis_mesh,const Mesh3 & Th3, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, int &border_only, int &recollement_element, int &recollement_border, int &point_confondus_ok,int orientation) { // cas besoin memoire important //Mesh3 *T_Th3=new Mesh3; int nv_t,nt_t,nbe_t; int* Numero_Som; int* ind_nv_t; int* ind_nt_t; int* ind_nbe_t; int* label_nt_t; int* label_nbe_t; int i_som, i_elem, i_border; Numero_Som = new int[Th3.nv]; ind_nv_t = new int[Th3.nv]; ind_nt_t = new int[Th3.nt]; ind_nbe_t = new int[Th3.nbe]; label_nt_t = new int[Th3.nt]; label_nbe_t = new int[Th3.nbe]; //cout << "Vertex, Tetrahedra, Border : "< 1) cout <<" debut: SamePointElement " < 1) cout <<" fin: SamePointElement " <set(nv_t,nt_t,nbe_t); Vertex3 *v = new Vertex3[nv_t]; Tet *t = new Tet[nt_t]; Tet *tt=t; Triangle3 *b= new Triangle3[nbe_t]; Triangle3 *bb=b; double mes=0,mesb=0; cout << "Transfo TH3 : Vertex, Tetrahedra, Border : "<< "nv_t="<< nv_t << " nt_t=" << nt_t << " nbe_t=" << nbe_t << endl; // determination of vertex i_som = 0; for(int i=0; i= 0 && iv[jj] < nv_t); } if(orientation<0) swap(iv[1],iv[2]) ; (tt)->set(v, iv, lab); mes += tt++->mesure(); i_elem++; } assert( i_elem == nt_t); //cout << " Transfo border elements " << endl; // determination of border elements i_border= 0; for( int i=0; i< nbe_t; i++){ int & ii=ind_nbe_t[i]; // creation of elements const Triangle3 & K(Th3.be(ii)); int iv[3]; int lab; lab = label_nbe_t[i]; for(int jj=0; jj <3; jj++) { iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; assert( iv[jj] >= 0 && iv[jj] < nv_t); } if(orientation<0) swap(iv[1],iv[2]) ; bb->set(v, iv, lab); mesb += bb++->mesure(); i_border=i_border+1; } assert( i_border == nbe_t); if ( mes < 0 ) { cerr << " E rror of mesh orientation , current orientation = "<< orientation << endl; cerr << " volume mesh = " << mes << endl; cerr << " surface border mesh = " << mesb << endl; ErrorExec(" movemesh 3d ",1); } delete [] Numero_Som; delete [] ind_nv_t; delete [] ind_nt_t; delete [] ind_nbe_t; delete [] label_nt_t; delete [] label_nbe_t; if( nt_t !=0){ Mesh3 *T_Th3 = new Mesh3(nv_t,nt_t,nbe_t,v,t,b); return T_Th3; } else{ Mesh3 *T_Th3 = new Mesh3(nv_t,nbe_t,v,b); delete [] t; return T_Th3; } } void SamePointElement( const double &precis_mesh, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, const Mesh3 & Th3, int &recollement_element, int &recollement_border, int &point_confondus_ok, int *Numero_Som, int *ind_nv_t, int *ind_nt_t, int *ind_nbe_t, int *label_nt_t, int *label_nbe_t, int & nv_t, int & nt_t,int & nbe_t ){ int Elem_ok, Border_ok; double hmin,hmin_elem,hmin_border; R3 bmin,bmax; //int recollement_element=1,recollement_border=1; if(verbosity > 2) cout << " BuilBound " < 2) cout << " =============================== " << endl; double bmin3[3], bmax3[3]; bmin3[0] = bmin.x; bmin3[1] = bmin.y; bmin3[2] = bmin.z; bmax3[0] = bmax.x; bmax3[1] = bmax.y; bmax3[2] = bmax.z; if(verbosity > 2) cout << " OrderVertexTransfo_hcode gtree " << endl; OrderVertexTransfo_hcode_nv_gtree( Th3.nv, bmin, bmax, hmin, tab_XX, tab_YY, tab_ZZ, Numero_Som, ind_nv_t, nv_t ); if(verbosity > 2) cout << " fin order vertex gtree: nv_t=" << nv_t << endl; if(verbosity > 2) cout << " =============================== " << endl; /* determination de nt_t et de nbe_t*/ int i_elem, i_border; i_elem = 0; for(int ii=0; ii< Th3.nt; ii++){ const Tet & K(Th3.elements[ii]); int iv[4]; Elem_ok = 1; for(int jj=0; jj <4; jj++){ iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; } for(int jj=0; jj<4; jj++){ for(int kk=jj+1; kk<4; kk++){ if( iv[jj]==iv[kk] ){ Elem_ok = 0; } } } if(Elem_ok==1){ ind_nt_t[i_elem]= ii; label_nt_t[i_elem] = K.lab; i_elem = i_elem + 1; } } nt_t=i_elem; if(recollement_element ==1){ //int point_confondus_ok_e = 0; if(verbosity > 1) cout << "debut recollement : nt_t= "<< nt_t << endl; int np,dim=3; int *ind_np = new int [nt_t]; int *label_t = new int [nt_t]; double **Cdg_t=new double *[nt_t]; for(int i=0; i=0 && ind_np[i_elem] <= nt_t ); ind_nt_t_tmp[ i_elem ] = ind_nt_t[ ind_np[i_elem] ]; } for( int i_elem=0; i_elem< np; i_elem++){ ind_nt_t[ i_elem ] = ind_nt_t_tmp[ i_elem ]; } delete [] ind_np; delete [] label_t; for(int i=0; i 1) cout << "fin recollement : nt_t= "<< nt_t << endl; } // determination of border elements i_border= 0; for( int ii=0; ii< Th3.nbe; ii++){ Border_ok=1; const Triangle3 & K(Th3.be(ii)); int iv[3]; for(int jj=0; jj <3; jj++){ iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; assert( iv[jj] >= 0 && iv[jj] < nv_t); } for(int jj=0; jj<3; jj++){ for(int kk=jj+1; kk<3; kk++){ if( iv[jj]==iv[kk] ) Border_ok=0; } } if(Border_ok==1){ ind_nbe_t[i_border] = ii; label_nbe_t[i_border] = K.lab; i_border=i_border+1; } } nbe_t = i_border; if( recollement_border == 1){ //int point_confondus_ok = 1; if(verbosity > 1) cout << "debut recollement : nbe_t= "<< nbe_t << endl; int np,dim=3; int *ind_np = new int [nbe_t]; double **Cdg_be=new double *[nbe_t]; int *label_be = new int [nbe_t]; for(int i=0; i 1) cout << "hmin_border=" << hmin_border << endl; if(verbosity > 1) cout << "appele de PointCommun_hcode := " << point_confondus_ok<< endl; //PointCommun_hcode( dim, nbe_t, point_confondus_ok, Cdg_be, bmin3, bmax3, hmin_border, ind_np, np); PointCommun_hcode_gtree( dim, nbe_t, point_confondus_ok, Cdg_be, label_be, bmin, bmax, hmin_border, ind_np, label_nbe_t, np); if(verbosity > 1) cout << "fin appele de PointCommun_hcode" << endl; assert( np <= nbe_t ); int *ind_nbe_t_tmp= new int [np]; for( int i_border=0; i_border 1) cout << "fin recollement : nbe_t= "<< nbe_t << endl; // Affectation de la nouvelle valeur du label } } // 3D surface Mesh3 * Transfo_Mesh3_surf(const double &precis_mesh, const Mesh3 & Th3, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, int &recollement_border, int &point_confondus_ok){ // cas besoin memoire important //Mesh3 *T_Th3=new Mesh3; int nv_t,nbe_t; int nt_t=0; int* Numero_Som; int* ind_nv_t; int* ind_nbe_t; int* label_nbe_t; int i_som, i_elem, i_border; assert( Th3.nt == 0); Numero_Som = new int[Th3.nv]; ind_nv_t = new int[Th3.nv]; ind_nbe_t = new int[Th3.nbe]; label_nbe_t = new int[Th3.nbe]; if(verbosity > 1) cout << "Vertex, Tetrahedra, Border : "< 1) cout <<" debut: SamePointElement " < 1) cout <<" fin: SamePointElement " <set(nv_t,nt_t,nbe_t); Vertex3 *v = new Vertex3[nv_t]; //Tet *t; Triangle3 *b= new Triangle3[nbe_t]; Triangle3 *bb=b; if(verbosity > 1) cout << "Transfo TH3 : Vertex, Tetrahedra, Border : "<< "nv_t="<< nv_t << " nt_t=" << nt_t << " nbe_t=" << nbe_t << endl; // determination of vertex i_som = 0; for(int i=0; ivertices[i_som].x = tab_XX[ii]; T_Th3->vertices[i_som].y = tab_YY[ii]; T_Th3->vertices[i_som].z = tab_ZZ[ii]; T_Th3->vertices[i_som].lab = K.lab; */ v[i_som].x = tab_XX[ii]; v[i_som].y = tab_YY[ii]; v[i_som].z = tab_ZZ[ii]; v[i_som].lab = K.lab; i_som = i_som + 1; } if(verbosity > 1) cout << "i_som, nv_t=" < 1) cout << " Transfo border elements " << endl; // determination of border elements i_border= 0; for( int i=0; i< nbe_t; i++){ int & ii=ind_nbe_t[i]; // creation of elements const Triangle3 & K(Th3.be(ii)); int iv[3]; int lab; //lab = K.lab; lab = label_nbe_t[i]; for(int jj=0; jj <3; jj++){ iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; assert( iv[jj] >= 0 && iv[jj] <= nv_t); } //T_Th3->be(i_border).set(T_Th3->vertices, iv, lab); (bb++)->set(v, iv, lab); i_border=i_border+1; } assert( i_border == nbe_t); delete [] Numero_Som; delete [] ind_nv_t; delete [] ind_nbe_t; delete [] label_nbe_t; //Mesh3* T_Th3 = new Mesh3(nv_t,nt_t,nbe_t,v,t,b); Mesh3* T_Th3 = new Mesh3(nv_t,nbe_t,v,b); return T_Th3; } void SamePointElement_surf( const double &precis_mesh, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, const Mesh3 & Th3, int &recollement_border, int &point_confondus_ok, int *Numero_Som, int *ind_nv_t, int *ind_nbe_t, int *label_nbe_t, int & nv_t,int & nbe_t ){ int Elem_ok, Border_ok; double hmin,hmin_elem,hmin_border; R3 bmin,bmax; //int recollement_element=1,recollement_border=1; if(verbosity > 1) cout << " OrderVertexTransfo_hcode gtree " < 1) cout << " =============================== " << endl; double bmin3[3], bmax3[3]; bmin3[0] = bmin.x; bmin3[1] = bmin.y; bmin3[2] = bmin.z; bmax3[0] = bmax.x; bmax3[1] = bmax.y; bmax3[2] = bmax.z; /* cout << " OrderVertexTransfo_hcode " << endl; OrderVertexTransfo_hcode_nv( Th3.nv, tab_XX, tab_YY, tab_ZZ, bmin3, bmax3, hmin, Numero_Som, ind_nv_t, nv_t ); cout << "fin order vertex: nv_t=" << nv_t << endl; */ if(verbosity > 1) cout << " OrderVertexTransfo_hcode gtree " << endl; OrderVertexTransfo_hcode_nv_gtree( Th3.nv, bmin, bmax, hmin, tab_XX, tab_YY, tab_ZZ, Numero_Som, ind_nv_t, nv_t ); if(verbosity > 1) cout << "fin order vertex gtree: nv_t=" << nv_t << endl; if(verbosity > 1) cout << " =============================== " << endl; /* determination de nt_t et de nbe_t*/ int i_border; // determination of border elements i_border= 0; for( int ii=0; ii< Th3.nbe; ii++){ Border_ok=1; const Triangle3 & K(Th3.be(ii)); int iv[3]; for(int jj=0; jj <3; jj++){ iv[jj] = Numero_Som[ Th3.operator()(K[jj]) ]; } for(int jj=0; jj<3; jj++){ for(int kk=jj+1; kk<3; kk++){ if( iv[jj]==iv[kk] ) Border_ok=0; } } if(Border_ok==1){ ind_nbe_t[i_border] = ii; label_nbe_t[i_border] = K.lab; i_border=i_border+1; } } nbe_t = i_border; if( recollement_border == 1){ //int point_confondus_ok = 1; if(verbosity > 1) cout << "debut recollement : nbe_t= "<< nbe_t << endl; int np,dim=3; int *ind_np = new int [nbe_t]; int *label_be = new int [nbe_t]; double **Cdg_be=new double *[nbe_t]; for(int i=0; i 1) cout << "hmin_border=" << hmin_border << endl; if(verbosity > 1) cout << "appele de PointCommun_hcode := " << point_confondus_ok<< endl; //PointCommun_hcode( dim, nbe_t, point_confondus_ok, Cdg_be, bmin3, bmax3, hmin_border, ind_np, np); PointCommun_hcode_gtree( dim, nbe_t, point_confondus_ok, Cdg_be, label_be, bmin, bmax, hmin_border, ind_np, label_nbe_t, np); if(verbosity > 1) cout << "fin appele de PointCommun_hcode" << endl; assert( np <= nbe_t ); int *ind_nbe_t_tmp= new int [np]; for( int i_border=0; i_border 1) cout << "fin recollement : nbe_t= "<< nbe_t << endl; // Affectation de la nouvelle valeur du label } } void Transfo_Mesh2_map_face(const Mesh &Th2, map &maptri ){ int numero_label=0; for(int ii=0; ii< Th2.nt; ii++){ const Mesh::Triangle & K(Th2.t(ii)); map::const_iterator imap=maptri.find(K.lab); if(imap == maptri.end()){ maptri[ K.lab ] = numero_label; numero_label = numero_label+1; } } } Mesh3 * MoveMesh2_func( const double &precis_mesh, const Mesh & Th2, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, int &border_only, int &recollement_border, int &point_confondus_ok){ //Mesh3 *T_Th3= new Mesh3; int nv_t,nt_t,nbe_t; int* Numero_Som; int* ind_nv_t; int* ind_nt_t=0; int* ind_nbe_t; int* label_nbe_t; //int i_som; Numero_Som = new int[Th2.nv]; ind_nv_t = new int[Th2.nv]; ind_nbe_t = new int[Th2.nt]; label_nbe_t = new int[Th2.nt]; if(verbosity>5) cout << "before movemesh::Vertex triangle2 border " << Th2.nv << " "< 1) cout <<" debut: SamePointElement " < 1) cout <<" fin: SamePointElement " <set(nv_t,0,nbe_t); for(int nnv=0; nnv < nv_t; nnv++) { int ii = ind_nv_t[nnv]; assert( Numero_Som[ii] == nnv ); const Mesh::Vertex & K = Th2.vertices[ii];//const Vertex2 & K(Th2.vertices[ii]); //Version Mesh2 /* T_Th3->vertices[nnv].x = tab_XX[ii]; T_Th3->vertices[nnv].y = tab_YY[ii]; T_Th3->vertices[nnv].z = tab_ZZ[ii]; T_Th3->vertices[nnv].lab = K.lab; */ v[nnv].x = tab_XX[ii]; v[nnv].y = tab_YY[ii]; v[nnv].z = tab_ZZ[ii]; v[nnv].lab = K.lab; } for(int ibe=0; ibe < nbe_t; ibe++){ int lab; int iv[3]; int ii=ind_nbe_t[ibe]; // creation of elements const Mesh::Triangle & K(Th2.t(ii)); // const Triangle2 & K(Th2.elements[ii]); // Version Mesh2 iv[0] = Numero_Som[ Th2.operator()(K[0]) ]; iv[1] = Numero_Som[ Th2.operator()(K[1]) ]; iv[2] = Numero_Som[ Th2.operator()(K[2]) ]; /* map< int, int>:: const_iterator imap; imap = maptri.find(K.lab); // imap= maptri.find( label_nbe_t[ibe] ); assert( imap != maptri.end()); lab = imap->second; // K.lab; // before */ //T_Th3->be(ibe).set(T_Th3->vertices,iv,K.lab); (bb++)->set(v,iv,K.lab); } //Mesh3 *T_Th3 = new Mesh3(nv_t,0,nbe_t,v,t,b); Mesh3 *T_Th3 = new Mesh3(nv_t,nbe_t,v,b); delete [ ] Numero_Som; delete [ ] ind_nv_t; delete [ ] ind_nbe_t; delete [ ] label_nbe_t; return T_Th3; } void SamePointElement_Mesh2( const double &precis_mesh, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, const Mesh & Th2, int &recollement_border, int &point_confondus_ok, int *Numero_Som, int *ind_nv_t, int *ind_nt_t, int *ind_nbe_t, int* label_nbe_t, int & nv_t, int & nt_t,int & nbe_t ){ int Border_ok; //int recollement_border=0; R3 bmin,bmax; double hmin,hmin_border; if(verbosity > 1) cout << "calculus of bound and minimal distance" << endl; BuildBoundMinDist_th2( precis_mesh, tab_XX, tab_YY, tab_ZZ, Th2, bmin, bmax, hmin); // assertion pour la taille de l octree assert(hmin>Norme2(bmin-bmax)/1e9); double bmin3[3], bmax3[3]; bmin3[0] = bmin.x; bmin3[1] = bmin.y; bmin3[2] = bmin.z; bmax3[0] = bmax.x; bmax3[1] = bmax.y; bmax3[2] = bmax.z; /* cout << "debut: OrderVertexTransfo_hcode " < 1) cout << "fin: OrderVertexTransfo_hcode_gtree " < 1) cout << "debut recollement : nbe_t= "<< nbe_t << endl; int np,dim=3; int *ind_np = new int [nbe_t]; int *label_be = new int [nbe_t ]; double **Cdg_be=new double *[nbe_t]; for(int i=0; i 1) cout << "points commun " << endl; //PointCommun_hcode( dim, nbe_t, point_confondus_ok, Cdg_be, bmin3, bmax3, hmin_border, ind_np, np); // ancien PointCommun_hcode_gtree( dim, nbe_t, point_confondus_ok, Cdg_be, label_be, bmin, bmax, hmin_border, ind_np, label_nbe_t,np); // new if(verbosity > 1) cout << "points commun finis " < 1) cout << "fin recollement : nbe_t= "<< nbe_t << endl; } } //====================== // Fin cas 2D //====================== // version Mesh2 void BuildBoundMinDist_th2( const double &precis_mesh, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, const Mesh & Th2, R3 &bmin, R3 &bmax, double &hmin){ //determination de la boite englobante //R3 bmin,bmax; double precispt; bmin.x = tab_XX[0]; bmin.y = tab_YY[0]; bmin.z = tab_ZZ[0]; bmax.x = bmin.x; bmax.y = bmin.y; bmax.z = bmin.z; //R3 bmax = new R3(bmin); if(verbosity >1) cout << " determination of bmin and bmax" << endl; for(int ii=1; ii1) cout << " bmin := " << bmin.x << " " << bmin.y << " " << bmin.z << endl; if(verbosity >1) cout << " bmax := " << bmax.x << " " << bmax.y << " " << bmax.z << endl; if(verbosity >1) cout << " box volume :=" << longmini_box << endl; if(precis_mesh< 0){ precispt=longmini_box*1e-7; } else{ precispt=precis_mesh; } // determination de hmin hmin = 1e10; for( int ii=0; ii< Th3.nt; ii++){ const Tet & K(Th3.elements[ii]); double longedge; int iv[4]; for(int jj=0; jj <4; jj++){ iv[jj] = Th3.operator()(K[jj]) ; } for( int jj=0; jj<4; jj++){ for( int kk=jj+1; kk<4; kk++){ int & i1= iv[jj]; int & i2= iv[kk]; longedge = pow(tab_XX[i1]-tab_XX[i2],2) + pow(tab_YY[i1]-tab_YY[i2],2) + pow(tab_ZZ[i1]-tab_ZZ[i2],2); longedge = sqrt(longedge); if(longedge > precispt ) hmin = min( hmin, longedge); } } } if( Th3.nt == 0){ for( int ii=0; ii< Th3.nbe; ii++){ if(verbosity >10) cout << "border " << ii <<" hmin =" << hmin << endl; const Triangle3 & K(Th3.be(ii)); double longedge; int iv[3]; for(int jj=0; jj <3; jj++){ iv[jj] = Th3.operator()(K[jj]) ; } for( int jj=0; jj<3; jj++){ for( int kk=jj+1; kk<3; kk++){ int & i1= iv[jj]; int & i2= iv[kk]; longedge = pow(tab_XX[i1]-tab_XX[i2],2) + pow(tab_YY[i1]-tab_YY[i2],2) + pow(tab_ZZ[i1]-tab_ZZ[i2],2); longedge = sqrt(longedge); if(longedge > precispt ) hmin = min( hmin, longedge); } } } } if(verbosity >5) cout << " longmini_box" << longmini_box << endl; if(verbosity >5) cout << " hmin =" << hmin << endl; assert( hmin < longmini_box); if(verbosity >5) cout << " Norme2(bmin-bmax)=" << Norme2(bmin-bmax) << endl; // assertion pour la taille de l octree assert(hmin>Norme2(bmin-bmax)/1e9); } //====================== // //====================== void OrderVertexTransfo_hcode_nv( const int &tab_nv, const double *tab_XX, const double *tab_YY, const double *tab_ZZ, const double *bmin, const double *bmax, const double hmin,int *Numero_Som, int * ind_nv_t, int & nv_t){ size_t i; size_t j[3]; size_t k[3]; size_t NbCode = 100000; int *tcode; //= new int[NbCode]; int *posv = new int[tab_nv]; double epsilon= hmin/10.; /* double epsilon=0.001; // determination de boite englobante double bmin[3],bmax[3]; bmin[0] = tab_XX[0]; bmin[1] = tab_YY[0]; bmin[2] = tab_ZZ[0]; bmax[0] = bmin[0]; bmax[1] = bmin[1]; bmax[2] = bmin[2]; cout << " determination bmin et bmax" << endl; for(int ii=1; ii4) cout << " -- numberofpoints " << numberofpoints << endl; if(verbosity >4) cout << " -- taille boite englobante =" << endl; if(verbosity >4) { for(int ii=0; ii<3; ii++){ cout << "ii=" << ii << " " << bmin[ii] << " " << bmax[ii] <=0); assert( j[1] <=k[1] && j[1]>=0); assert( j[2] <=k[2] && j[2]>=0); i = (j[2]*(k[1]+1)+j[1]*(k[0]+1)+j[0]); //cout << i << endl; i = i%NbCode; assert( i < NbCode ); posv[ii] = tcode[i]; tcode[i] = ii; } if(verbosity >1) cout << " boucle numero de Sommet " << endl; for(int ii=0; ii1) cout << " determinations des points confondus et numerotation " << endl; nv_t=0; for(int icode =0; icode < NbCode; icode++){ //int ii,jj; double dist; for(int ii=tcode[icode]; ii!=-1; ii=posv[ii]){ if(Numero_Som[ii] != -1) continue; Numero_Som[ii] = nv_t; for(int jj=posv[ii]; jj!=-1; jj=posv[jj]){ if(Numero_Som[jj] != -1) continue; dist=pow(tab_XX[jj]-tab_XX[ii],2)+pow(tab_YY[jj]-tab_YY[ii],2)+pow(tab_ZZ[jj]-tab_ZZ[ii],2); if( sqrt(dist) < epsilon ){ // point semblable Numero_Som[jj] = Numero_Som[ii]; //cout << "point semblable" << endl; //exit(-1); } } ind_nv_t[nv_t] = ii; // Remarque on donne a nv_t le plus grand nv_t++; //nv_t = nvt+1; } } if(verbosity >1) cout << " nv_t = " << nv_t << " / " << "nv_t(anc)" << tab_nv < 1); for(int jj=0; jj1) cout << "numberofpoints " << numberofpoints << endl; NbCode = min( 4*(k[0]+k[1]+k[2]), NbCode); if(verbosity >1) cout << "NbCode=" << NbCode << endl; tcode = new int[NbCode]; /* initialisation des codes */ for(int ii=0; ii< NbCode; ii++){ tcode[ii] = -1; } for(int ii=0; ii < NbPoints; ii++){ // boucle dans l autre sens pour assurer l'ordre des elements pour la suite for( int jj=0; jj=0); assert( j[1] <=k[1] && j[1]>=0); assert( j[2] <=k[2] && j[2]>=0); i = j[0]; for(int jj=1; jjNorme2(bmin-bmax)/1e9); double hseuil =hmin/10.; //hseuil = hseuil/10.; Vertex3 *v= new Vertex3[tab_nv]; //Vertex3 v[tab_nv]; EF23::GTree *gtree = new EF23::GTree(v,bmin,bmax,0); if(verbosity >2){ cout << " -- taille de la boite " << endl; cout << "\t" << bmin.x << " " << bmin.y << " " << bmin.z << endl; cout << "\t" << bmax.x << " " << bmax.y << " " << bmax.z << endl; } // creation of octree nv_t = 0; for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ v[nv_t].x = vi.x; v[nv_t].y = vi.y; v[nv_t].z = vi.z; v[nv_t].lab = vi.lab; // lab mis a zero par default ind_nv_t[nv_t] = ii; Numero_Som[ii] = nv_t; gtree->Add( v[nv_t] ); nv_t=nv_t+1; } else{ Numero_Som[ii] = pvi-v; } } delete gtree; delete [] v; if(verbosity >3) cout << " hseuil=" << hseuil <3) cout << " nv_t = " << nv_t << " / " << "nv_t(anc)" << tab_nv <2) cout << " -- numberofpoints " << numberofpoints << endl; // if(verbosity >2) cout << " -- taille boite englobante =" << endl; // assert(nv_t==numberofpoints); } } void PointCommun_hcode_gtree( const int &dim, const int &NbPoints, const int &point_confondus_ok, double **Coord_Point, const int * label_point, const R3 & bmin, const R3 & bmax, const double &hmin, int * ind_np, int * ind_label, int & np){ double hseuil =hmin/10.; Vertex3 *v= new Vertex3[NbPoints]; //Vertex3 v[NbPoints]; EF23::GTree *gtree = new EF23::GTree(v,bmin,bmax,0); if(verbosity >1) cout<< "verif hmin vertex3 GTree switch: " << point_confondus_ok << endl; int int_point_confondus_ok = point_confondus_ok; if(int_point_confondus_ok == 0){ // accepte les points double np = 0; for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ v[np].x = vi.x; v[np].y = vi.y; v[np].z = vi.z; v[np].lab = vi.lab; // lab mis a zero par default ind_np[np] = ii; ind_label[np] = label_point[ii]; gtree->Add( v[np++] ); } else{ ind_label[pvi-v] = min( ind_label[pvi-v], label_point[ii] ); } } if(verbosity >1) cout << "np="<< np << endl; } if(int_point_confondus_ok == 1){ // accepte les points double sont enleves np = 0; for (int ii=0;iiToClose(vi,hseuil); if(!pvi){ v[np].x = vi.x; v[np].y = vi.y; v[np].z = vi.z; v[np].lab = vi.lab; // lab mis a zero par default ind_np[np] = ii; ind_label[np] = label_point[ii]; gtree->Add( v[np++] ); } else{ ind_label[pvi-v] = min( ind_label[pvi-v], label_point[ii] ); } } int ind_multiple[np]; for(int ii=0; iiToClose(vi,hseuil); ind_multiple[pvi-v]=ind_multiple[pvi-v]+1; } int jnp; jnp=0; for(int ii=0; ii(nargs[0]); if(nargs[1]) a2 = dynamic_cast(nargs[1]); int err =0; //cout << nargs[0] << " "<< a1 << endl; //cout << nargs[1] << " "<< a2 << endl; if(a1) { if(a1->size() !=2) CompileError("LayerMesh (Th,n, zbound=[zmin,zmax],) "); //cout << "lecture de ezmin , ezmax" << endl; ezmin=to( (*a1)[0]); ezmax=to( (*a1)[1]); } if(a2) { if(a2->size() !=3) CompileError("LayerMesh (Th,n, transfo=[X,Y,Z],) "); xx=to( (*a2)[0]); yy=to( (*a2)[1]); zz=to( (*a2)[2]); } if( nargs[3] && nargs[9] ) CompileError("uncompatible buildlayer (Th, region= , reftet= "); if( nargs[4] && nargs[10] ) CompileError("uncompatible buildlayer (Th, midlabel= , reffacemid= "); if( nargs[5] && nargs[11] ) CompileError("uncompatible buildlayer (Th, toplabel= , reffaceup= "); if( nargs[6] && nargs[12] ) CompileError("uncompatible buildlayer (Th, downlabel= , reffacelow= "); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type BuildLayeMesh_Op::name_param[]= { { "zbound", &typeid(E_Array)}, { "transfo", &typeid(E_Array)}, { "coef", &typeid(double)}, { "reftet", &typeid(KN_)}, // 3 { "reffacemid", &typeid(KN_ )}, { "reffaceup", &typeid(KN_ )}, { "reffacelow", &typeid(KN_ )}, { "facemerge", &typeid(long)}, { "ptmerge",&typeid(double)}, { "region", &typeid(KN_)}, // 9 { "labelmid", &typeid(KN_ )}, { "labelup", &typeid(KN_ )}, { "labeldown", &typeid(KN_ )}, // 12 }; class BuildLayerMesh : public OneOperator { public: BuildLayerMesh() : OneOperator(atype(),atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { if(verbosity >1) cout << " je suis dans code(const basicAC_F0 & args) const" << endl; //cout << "args: " << args << endl; return new BuildLayeMesh_Op(args,t[0]->CastTo(args[0]),t[1]->CastTo(args[1])); } }; AnyType BuildLayeMesh_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh * pTh= GetAny((*eTh)(stack)); int nlayer = (int) GetAny((*enmax)(stack)); ffassert(pTh && nlayer>0); Mesh &Th=*pTh; Mesh *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int neb=Th.neb; // nombre d'aretes fontiere if(verbosity>2) cout << " -- BuildLayeMesh_Op input: nv" << nbv<< " nt: "<< nbt << " nbe "<< neb << endl; KN zmin(nbv),zmax(nbv); KN clayer(nbv); // nombre de layer est nlayer*clayer clayer=-1; zmin=0.; zmax=1.; double maxdz = 0; for (int it=0;itsetP(&Th,it,iv); //cout << "mp: fait " << endl; if(ezmin){ zmin[i]=GetAny((*ezmin)(stack));} if(ezmax){ zmax[i]=GetAny((*ezmax)(stack));} maxdz = max(maxdz, abs(zmin[i]-zmax[i])); clayer[i]=Max( 0. , Min( 1. , arg(2,stack,1.) ) ); } } } ffassert(clayer.min() >=0); if(verbosity >1) cout << "lecture valeur des references " << endl; KN zzempty; KN nrtet (arg(3,stack,arg(3+6,stack,zzempty))); KN nrfmid (arg(4,stack,arg(4+6,stack,zzempty))); KN nrfup (arg(5,stack,arg(5+6,stack,zzempty))); KN nrfdown (arg(6,stack,arg(6+6,stack,zzempty))); int point_confondus_ok (arg(7,stack,0L)); double precis_mesh (arg(8,stack,-1L)); //if( nrtet.N() && nrfmid.N() && nrfup.N() && nrfdown.N() ) return m; ffassert( nrtet.N() %2 ==0); ffassert( nrfmid.N() %2 ==0); ffassert( nrfup.N() %2 ==0); ffassert( nrfdown.N() %2 ==0); // realisation de la map par default map< int, int > maptet; map< int, int > maptrimil, maptrizmax, maptrizmin; map< int, int > mapemil, mapezmax, mapezmin; build_layer_map_tetrahedra( Th, maptet ); build_layer_map_triangle( Th, maptrimil, maptrizmax, maptrizmin ); build_layer_map_edge( Th, mapemil, mapezmax, mapezmin ); // Map utilisateur map< int, int > :: iterator imap; for( int ii=0; ii < nrtet.N(); ii+=2){ imap = maptet.find(nrtet[ii]); if( imap != maptet.end()){ imap -> second = nrtet[ii+1]; } } for( int ii=0; ii < nrfmid.N(); ii+=2){ imap = maptrimil.find(nrfmid[ii]); if( imap != maptrimil.end()){ imap -> second = nrfmid[ii+1]; } } for( int ii=0; ii < nrfup.N(); ii+=2){ imap = maptrizmax.find(nrfup[ii]); if( imap != maptrizmax.end()){ imap -> second = nrfup[ii+1]; } } for( int ii=0; ii < nrfdown.N(); ii+=2){ imap = maptrizmin.find(nrfdown[ii]); if( imap != maptrizmin.end()){ imap -> second = nrfdown[ii+1]; } } int nebn =0; KN ni(nbv); double epsz = maxdz *1e-6; if(verbosity>9999) cout << "BuildLayeMesh_Op:: epsz " << epsz <9999) cout << " BuildLayeMesh_Op: ni = " << ni << endl; // triangle for (int it=0;it maptet; map< int, int > maptrimil, maptrizmax, maptrizmin; map< int, int > mapemil, mapezmax, mapezmin; build_layer_map_tetrahedra( Th, maptet ); build_layer_map_triangle( Th, maptrimil, maptrizmax, maptrizmin ); build_layer_map_edge( Th, mapemil, mapezmax, mapezmin ); Mesh3 *Th3= build_layer(Th, nlayer, ni, zmin, zmax, maptet, maptrimil, maptrizmax, maptrizmin, mapemil, mapezmax, mapezmin); */ // Th3->BuildBound(); // Th3->BuildAdj(); // Th3->Buildbnormalv(); // Th3->BuildjElementConteningVertex(); Th3->BuildGTree(); //A decommenter Add2StackOfPtr2FreeRC(stack,Th3); *mp=mps; return Th3; } else { //Mesh3 *Th3= build_layer(Th, nlayer, ni, zmin, zmax); KN txx(Th3->nv), tyy(Th3->nv), tzz(Th3->nv); KN takemesh(Th3->nv); //MeshPoint *mp3(MeshPointStack(stack)); takemesh=0; Mesh3 &rTh3 = *Th3; for (int it=0;itnt;++it){ for( int iv=0; iv<4; ++iv){ int i=(*Th3)(it,iv); if(takemesh[i]==0){ mp->setP(Th3,it,iv); if(xx){ txx[i]=GetAny((*xx)(stack));} if(yy){ tyy[i]=GetAny((*yy)(stack));} if(zz){ tzz[i]=GetAny((*zz)(stack));} takemesh[i] = takemesh[i]+1; } } } int border_only = 0; int recollement_elem=0, recollement_border=1; if(point_confondus_ok == 2){ recollement_border = 0; point_confondus_ok = 1; } Mesh3 *T_Th3=Transfo_Mesh3( precis_mesh, rTh3, txx, tyy, tzz, border_only, recollement_elem, recollement_border, point_confondus_ok,1); // T_Th3->BuildBound(); // T_Th3->BuildAdj(); // T_Th3->Buildbnormalv(); // T_Th3->BuildjElementConteningVertex(); T_Th3->BuildGTree(); //A decommenter delete Th3; Add2StackOfPtr2FreeRC(stack,T_Th3); *mp=mps; return T_Th3; } } // function nouveau nom de fonction class Movemesh2D_3D_surf_cout_Op : public E_F0mps { public: Movemesh2D_3D_surf_cout_Op(const basicAC_F0 & args,Expression tth) { CompileError("The keyword movemesh2D3Dsurf is remplaced now by the keyword movemesh23 (see Manual) ::: Moreover, the parameter mesuremesh are denoted now orientation "); } AnyType operator()(Stack stack)const { return 0L; } }; class Movemesh2D_3D_surf_cout : public OneOperator { public: typedef Mesh *pmesh; typedef Mesh3 *pmesh3; Movemesh2D_3D_surf_cout() : OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new Movemesh2D_3D_surf_cout_Op(args,t[0]->CastTo(args[0])); // CastTo(args[]); // plus tard } }; /***********************************************/ class Movemesh3D_cout_Op : public E_F0mps { public: Movemesh3D_cout_Op(const basicAC_F0 & args,Expression tth) { CompileError("The keyword movemesh3D is remplaced in this new version of freefem++ by the keyword movemesh3 (see manual)"); } AnyType operator()(Stack stack) const {return 0L;} }; class Movemesh3D_cout : public OneOperator { public: typedef Mesh *pmesh; typedef Mesh3 *pmesh3; Movemesh3D_cout() : OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new Movemesh3D_cout_Op(args,t[0]->CastTo(args[0])); // CastTo(args[]); // plus tard } }; // class DeplacementTab_Op : public E_F0mps { public: Expression eTh; //Expression xx,yy,zz; static const int n_name_param =6; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a ) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a ) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: DeplacementTab_Op(const basicAC_F0 & args,Expression tth) : eTh(tth) //, xx(0) , yy(0) , zz(0) { args.SetNameParam(n_name_param,name_param,nargs); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type DeplacementTab_Op::name_param[]= { { "deltax", &typeid(KN_)}, { "deltay", &typeid(KN_)}, { "deltaz", &typeid(KN_)}, { "ptmerge", &typeid(double)}, { "facemerge", &typeid(long)}, { "boolsurface",&typeid(long)} }; AnyType DeplacementTab_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); ffassert(pTh); Mesh3 &Th=*pTh; Mesh3 *m= pTh; // question a quoi sert *m ?? int nbv=Th.nv; // nombre de sommet int nbt=Th.nt; // nombre de triangles int nbe=Th.nbe; // nombre d'aretes fontiere if(verbosity>5) cout << "before movemesh: Vertex " << nbv<< " Tetrahedra " << nbt << " triangles "<< nbe << endl; // lecture des references KN zzempty; KN dx (arg(0,stack,zzempty)); KN dy (arg(1,stack,zzempty)); KN dz (arg(2,stack,zzempty)); double precis_mesh( arg(3,stack,1e-7)); ffassert( dx.N() == Th.nv); ffassert( dy.N() == Th.nv); ffassert( dz.N() == Th.nv); // realisation de la map par default KN txx(Th.nv), tyy(Th.nv), tzz(Th.nv); // loop over tetrahedral for (int i=0;iBuildBound(); //T_Th3->BuildAdj(); if(flagsurfaceall==1) T_Th3->BuildBoundaryElementAdj(); //T_Th3->Buildbnormalv(); // T_Th3->BuildjElementConteningVertex(); T_Th3->BuildGTree(); // T_Th3->decrement(); } else { if(flagsurfaceall==1) T_Th3->BuildBoundaryElementAdj(); } Add2StackOfPtr2FreeRC(stack,T_Th3); *mp=mps; return T_Th3; } class DeplacementTab : public OneOperator { public: DeplacementTab() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new DeplacementTab_Op(args,t[0]->CastTo(args[0])); } }; // CheckSurfaceMesh ==> int GetBEManifold( Expression bb, Expression &label, Expression &orient); void GetNumberBEManifold( Expression surf, int & mani_nbe); void GetManifolds( Expression mani, int & nbcmanifold, int * &mani_nbe, Expression * &manifold) { if ( mani ) { int i,j; const E_Array * a= dynamic_cast(mani); ffassert(a); int n = a->size(); if( verbosity>1) cout << " the number of manifold " << n << endl; nbcmanifold = n; // nombre de manifold dfinis //manifold = new Expression[n]; mani_nbe = new int[n]; int size = 0; for ( i=0; i1) cout << " -- Manifoldal Condition to do" << endl; const E_Array * a= dynamic_cast(surf); ffassert(a); mani_nbe = a->size(); } } // void GetManifold( Expression surf, int & mani_nbe, Expression * &manifold) // { // if ( surf ) // { // int i,j; // if( verbosity>1) // cout << " -- Manifoldal Condition to do" << endl; // const E_Array * a= dynamic_cast(surf); // ffassert(a); // int n = a->size()/2; // mani_nbe = n; // if( verbosity>1) // cout << " the number of face label in a manifold " << n << endl; // if( n*2 != a->size() ) // CompileError(" a manifold is defined by a pair of [label, orientation ]"); // manifold = new Expression[n*2]; // for ( i=0,j=0;i(bb); if( a && a->size() == 2 ){ label = to((*a)[0]); orient = to((*a)[1]); return 1; } else return 0; } class CheckManifoldMesh_Op : public E_F0mps { public: Expression eTh; static const int n_name_param =1; // static basicAC_F0::name_and_type name_param[] ; Expression nargs[n_name_param]; int nbmanifold; int *mani_nbe; Expression *manifolds; KN_ arg(int i,Stack stack,KN_ a ) const { return nargs[i] ? GetAny >( (*nargs[i])(stack) ): a;} double arg(int i,Stack stack,double a) const{ return nargs[i] ? GetAny< double >( (*nargs[i])(stack) ): a;} long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny< long >( (*nargs[i])(stack) ): a;} public: CheckManifoldMesh_Op(const basicAC_F0 & args,Expression tth) : eTh(tth) { args.SetNameParam(n_name_param,name_param,nargs); if(nargs[0]) GetManifolds(nargs[0],nbmanifold, mani_nbe, manifolds); else CompileError("check ::: no definition of manifold"); } AnyType operator()(Stack stack) const ; }; basicAC_F0::name_and_type CheckManifoldMesh_Op::name_param[]= { { "manifolds", &typeid(E_Array)} // option a rajouter // facemerge 0,1 + label }; AnyType CheckManifoldMesh_Op::operator()(Stack stack) const { MeshPoint *mp(MeshPointStack(stack)) , mps=*mp; Mesh3 * pTh= GetAny((*eTh)(stack)); int size=0; KN BeginManifold(nbmanifold+1); for (int i=0; i< nbmanifold; i++){ BeginManifold[i]=size; size=size+mani_nbe[i]; } BeginManifold[nbmanifold]=size; KN TabLabelManifold(size ), OrientLabelManifold(size ); int count=0; for (int i=0; i< nbmanifold; i++){ for(int j=0; j< mani_nbe[i]; j++){ TabLabelManifold [count] = GetAny< long > ( ( *manifolds[2*count] )(stack) ); OrientLabelManifold [count] = GetAny< long > ( ( *manifolds[2*count+1] )(stack) ); count++; } } assert(count == size); // int count=0; // for(int ii=0; ii ( (*surface[2*ii+1][2*jj])(stack) ); // OrientLabelVariete [count] = GetAny< long > ( (*surface[2*ii+1][2*jj+1])(stack) ); // count++; // } // } // beginvariete[nbvariete]=count; long resultat=1; pTh->BuildBoundaryElementAdj( nbmanifold, BeginManifold,TabLabelManifold,OrientLabelManifold); // nbvariete, beginvariete, TabLabelVariete, OrientLabelVariete); cout << "utilisation V2" << endl; *mp=mps; return resultat; } class CheckManifoldMesh : public OneOperator { public: CheckManifoldMesh() : OneOperator(atype(),atype() ) {} E_F0 * code(const basicAC_F0 & args) const { return new CheckManifoldMesh_Op(args,t[0]->CastTo(args[0])); } }; Mesh3 * truncmesh(const Mesh3 &Th,const long &kksplit,int *split, bool kk, const int newbelabel); struct Op_trunc_mesh3 : public OneOperator { typedef Mesh3 *pmesh3; class Op: public E_F0mps { public: static basicAC_F0::name_and_type name_param[] ; static const int n_name_param =4; Expression nargs[n_name_param]; Expression getmesh,bbb; long arg(int i,Stack stack,long a) const{ return nargs[i] ? GetAny( (*nargs[i])(stack) ): a;} KN * arg(int i,Stack stack) const{ return nargs[i] ? GetAny *>( (*nargs[i])(stack) ): 0;} Op(const basicAC_F0 & args,Expression t,Expression b) : getmesh(t),bbb(b) { args.SetNameParam(n_name_param,name_param,nargs); } AnyType operator()(Stack s) const ; }; E_F0 * code(const basicAC_F0 & args) const { return new Op(args,t[0]->CastTo(args[0]),t[1]->CastTo(args[1])); } Op_trunc_mesh3() : OneOperator(atype(),atype(),atype()) {}; }; basicAC_F0::name_and_type Op_trunc_mesh3::Op::name_param[Op_trunc_mesh3::Op::n_name_param] = { { "split", &typeid(long)}, { "label", &typeid(long)}, { "new2old", &typeid(KN*)}, // ajout FH pour P. Jovilet jan 2014 { "old2new", &typeid(KN*)} // ajout FH pour P. Jovilet jan 2014 }; Mesh3 * truncmesh(const Mesh3 &Th,const long &kksplit,int *split, bool kk, const int newbelabel) { static const int FaceTriangle[4]={3,0,1,2}; //={{3,2,1}, {0,2,3},{ 3,1,0},{ 0,1,2}} // computation of number of border elements and vertex without split int nbe = 0; int nt = 0; int nv = 0; int nvtrunc =0; int nedge=0; int nface=0; double hmin=1e100; R3 bmin,bmax; int nbeee=0,nbfi=0; const int kksplit2 = kksplit*kksplit; const int kksplit3 = kksplit2*kksplit; int ntsplit =0; int tagb[4]={1,2,4,8} ; KN tagTonB(Th.nt); tagTonB=0; for( int ibe=0; ibe < Th.nbe; ibe++) { int iff; int it=Th.BoundaryElement(ibe,iff); tagTonB[it]|= tagb[iff]; int ifff=iff,itt=Th.ElementAdj(it,ifff); if(itt >=0 && itt != it) tagTonB[itt]|= tagb[ifff]; } for (int i=0;i5) cout << " number of not intern boundary faces = " << nbeee << ", all faces = " << nbe << ", hseuil=" << hseuil < takevertex(Th.nv,-1); for(int i=0; i 1 ) { // compute the number of slip edge ... nedge=0; HashTable,int> edges(3*nface,nface); for(int i=0; i key(e1,e2); if(!edges.find(key) ) edges.add(key,nedge++); } } } } if(verbosity>10) cout << " -- nvertex " << nvtrunc << ", nedges = "<< nedge << ", nfaces = " << nface << " ntet =" << ntsplit << endl << " -- Euler/Poincare constante = " << nvtrunc-nedge+nface-ntsplit << endl; /* determination des vertex, triangles et tetrahedre obtenue apres splitting dans le Simplex */ int nfacesub = kksplit2; int ntetsub = kksplit3; int nvsub = (kksplit+1)*(kksplit+2)*(kksplit+3)/6; int ntrisub = 4*kksplit2; R3 *vertexsub; //[nvsub]; int *tetsub; //[4*ntetsub]; int *trisub; //[4*kksplit*kksplit]; SplitSimplex( kksplit, nvsub, vertexsub, ntetsub, tetsub); SplitSurfaceSimplex( kksplit, ntrisub, trisub); if(verbosity>3) cout << " -- trunc (3d) : Th.nv= " << Th.nv << "kksplit="<< kksplit << endl; int ntnosplit = nt/kksplit3; int nbenosplit = nbe/kksplit2; int nfacenosplit = (4*ntnosplit+nbenosplit)/2; nv = ntnosplit*(nvsub - 4*( (kksplit+1)*(kksplit+2)/2 - 3*(kksplit-1) -3 ) - 6*( kksplit-1 ) - 4); if(verbosity>100) cout << " 1) nv= " << nv << endl; nv = nv + nfacenosplit*( (kksplit+1)*(kksplit+2)/2 - 3*(kksplit-1) -3 ); if(verbosity>100) cout << " 2) nv= " << nv << endl; nv = nv + nedge*( kksplit-1 ); if(verbosity>100) cout << " 3) nv= " << nv << endl; nv = nv + nvtrunc; if(verbosity>100) cout << " 4) nv= " << nv << endl; int itt=0; int ie=0; Vertex3 *v=new Vertex3[nv]; Tet *t = new Tet[nt]; Tet *tt = t; Triangle3 *b = new Triangle3[nbe]; Triangle3 *bb = b; R3 hh = (bmax-bmax)/10.; EF23::GTree *gtree = new EF23::GTree(v,bmin-hh,bmax+hh,0); const R3 * pP[4]; int np=0; // nb of new points .. { KN vertextetsub(nvsub); KN newindex (nvsub); for(int i=0; iToClose(vertextetsub[iv],hseuil); if(!pvi) { (R3&) v[np] = vertextetsub[iv]; v[np].lab = K.lab; newindex[iv] = np; gtree->Add( v[np] ); np++; } else newindex[iv] = pvi-v; ffassert( np <= nv ); } for( int ii=0; iiset( v, ivt, K.lab); itt++; assert( itt <= nt ); } for (int j=0;j<4;j++) { int jt=j,it=Th.ElementAdj(i,jt); if ( ( (tagTonB[i]&tagb[j]) ==0 ) && !(it==i || it <0) && !split[it]) { // new border not on boundary int ivb[3]; for( int ii=0; iiset( v, ivb, newbelabel); ie++; } } assert( ie <= nbe); } } } if(verbosity>10) cout << " ++ np=" << np << "== nv=" << nv << endl; ffassert( np == nv); if(verbosity>8) cout << " -- Number of new border face not on Border " << ie << endl; delete [] vertexsub; //[nvsub]; delete [] tetsub; //[4*ntetsub]; delete [] trisub; //[4*kksplit*kksplit]; // split border elements int nv2Dsub = (kksplit+1)*(kksplit+2)/4; int ntri2Dsub = kksplit2; R2 *vertex2Dsub; //[nvsub]; int *tri2Dsub; //[4*kksplit*kksplit]; SplitSimplex( kksplit, nv2Dsub, vertex2Dsub, ntri2Dsub, tri2Dsub); for( int ibe=0; ibe < Th.nbe; ibe++) { int iff; int it=Th.BoundaryElement(ibe,iff); int ifff=iff,itt=Th.ElementAdj(it,ifff); if(itt<0) itt=it; if( split[it] == 0 && split[itt] == 0) continue; // boundary not on one element const Triangle3 &K(Th.be(ibe)); int ivv[3]; ivv[0] = Th.operator()(K[0]); ivv[1] = Th.operator()(K[1]); ivv[2] = Th.operator()(K[2]); R3 *vertextrisub = new R3 [nv2Dsub]; int *newindex = new int[nv2Dsub]; for( int iv=0; ivToClose(vi,hseuil); assert(pvi); newindex[iv] = pvi-v; } for( int ii=0; ii 199 ) cout << " " << ivb[jjj] << " np:" << np<< endl; assert( ivb[jjj] < np ); } (bb++)->set( v, ivb, K.lab); ie++; assert( ie <= nbe); } delete [] vertextrisub; delete [] newindex; } delete [] vertex2Dsub; //[4*ntetsub]; delete [] tri2Dsub; //[4*kksplit*kksplit]; if(verbosity>99) { cout << "nbofv initial" << Th.nv << endl; cout << "nv=" << nv << " np=" << np << endl; cout << "itt=" << itt << " nt=" << nt << endl; cout << "ie=" << ie << " nbe=" << nbe << endl; } ffassert( nv == np ); ffassert( ie ==nbe); ffassert( itt == nt ); //delete gtree; Mesh3 *Tht = new Mesh3( nv, nt, nbe, v, t, b); Tht->BuildGTree(); // Add JM. Oct 2010 delete gtree; return Tht; } AnyType Op_trunc_mesh3::Op::operator()(Stack stack) const { Mesh3 *pTh = GetAny((*getmesh)(stack)); Mesh3 &Th = *pTh; long kkksplit =arg(0,stack,1L); long label =arg(1,stack,2L); KN * pn2o = arg(2,stack); KN * po2n = arg(3,stack); KN split(Th.nt); split=kkksplit; MeshPoint *mp= MeshPointStack(stack),mps=*mp; long kk=0; long ks=kkksplit*kkksplit*kkksplit; for (int k=0;kset(Th,K(B),B,K,0); if ( GetAny( (*bbb)(stack) ) ) kk++; else split[k]=0 ; } //*mp=mps; if (verbosity>1) cout << " -- Trunc mesh: Nb of Tetrahedrons = " << kk << " label=" <